[{"title":"About","url":"about.html","body":"site mixture notes, portfolio record hobbies learning journey. might morphing Zettelkast mostly freelance data-scien develop web apps setup blockchain services for\u00a0client questions, comments find mistake, find twitter."},{"title":"Recognizing Traffic Lights Using The Azure Custom Vision API","url":"traffic.html","body":"upload any image, suggest googling dashcam traffic lights, images below. Images smaller 4mb .jpeg, .bmp .png. Shortest Route A\u00a0Demo demonstrat inspired job descriptio freelance role recently applied for. project involved recognisin faults traffic lights wanted see quickly develop end-to-end computer vision system recognises labels relatively simple solution prioritize speed, simplicity low costs. free tier Azure Custom Vision service train deploy model. trained recognise label Summary hosted Azure Custom Vision free\u00a0tier trained ~4500\u00a0imag Images part DriveU Traffic Light\u00a0Data improve I\u00a0would: more\u00a0image Experiment different Tune Method Find dataset. taken too long own labelled dataset needed find freely available labelled images. turns several choose from. Waymo huge dataset freely available chose DriveU Traffic Light dataset instead. well documented easily accessible good\u00a0enoug Convert images - DTLD images 16-bit .TIFF images. needed .JPEG .PNG images. first converted 16-bit .TIFF images 8-bit, converted .JPEG. DTLD dataset contains image metadata needed simply ignored stripped didn\u2019t\u00a0nee Parse label extract informatio needed. DTLD dataset contains labels specify location traffic lights images well traffic light phase lights in. interested location lights demo. needed convert coordinate regions absolute to\u00a0relativ Custom Vision project, custom tags, upload pairs images labels required form. documentat enough whilst few steps were\u00a0uncle able quickly figure do, usually clicking around try couple things check results. cloud platform own quirks design concepts, once you\u2019ve understood pattern develop intuition platform (in case Azure) \u201cwants\u201d do\u00a0somethi Train model. aren\u2019t options choose dataset wasn\u2019t very\u00a0big. simple UI static site (this page) JavaScript HTML. JavaScript Fetch API query Custom Vision API. jQuery custom (vanilla) JavaScript parse results interactiv elements the\u00a0page. model\u2019s results shown overlaying HTML canvas element top img element shows image that\u2019s uploaded user. regions probabilit drawn HTML Canvas methods (strokeRec fillText etc). Next\u00a0steps trained images German Cities. order generalise trained images wider distributi could\u00a0incl Rural Views footpaths well as\u00a0roads. Different Different cities and\u00a0countr nice user adjust minimum probabilit threshold. Currently results probabilit above 10% are\u00a0shown. Test\u00a0image these images test model. You\u2019ll store locally Test Image\u00a01 Test Image\u00a02 Test Image\u00a03 Test Image\u00a04"},{"title":"Experience","url":"experience.html","body":"2021: Freelance Deploying integratin blockchain nodes networks including polkadot, cardano, tron, binance-ch rosetta specificat workflows accomplish highlevel tasks such notifying services deposits making 2020: Technical Founder Web\u00a0Develo PipPip.ema Event-driv long-term scheduled email delivery. Focus writing relax knowing scheduled delivery is\u00a0guarant MoneyBar.n Personal financial dashboard 2019: Freelance Scientist -\u00a0Shell \u201cJohn creative conscienti software engineer, who understand business requiremen well translatin those applicatio under tight deadlines. Highly recommende - NLP, driven web-apps, mentoring junior team members. Working internal consultant developed delivered range tools. worked wide variety stakeholde prioritize understand business needs defining scopes, whilst agile developmen practices. advised team software developmen practices tooling decisions, mentored junior members improve coding business skills. Tools included Python, Plot.ly Dash, WSL, Azure 2019: Freelance Analyst -\u00a0Uber \u201cJohn played big role helping team our biggest challengin analytics tool across line. He ramped quickly, communicat well always responsive - Sankari Nair, Lead Developed analytics tool Python Plot.ly Dash. tool broad scope covering multiple regions, scales business lines. re-designe app scalabilit performanc whilst increasing functional provided flexible foundation features developed after left project. Challenges included building custom refactorin legacy code, processing large 2018: Specialist -\u00a0Blockpor Design, maintain internal tools cryptocurr exchange. specialist did whatever needed done. delivered tools provide business insights including management informatio fraud analysis, tax reporting, KPI tracking, regulatory compliance marketing growth. delivered sentiment analysis social worked stakeholde across business including back-end, founders, customer support, finance, DevOps growth\u00a0tea Tools included: Python, Bokeh, Google Cloud Platform (BigQuery, DataStore, Studio), PostgreSQL Blockport bought Bux 2017: Freelance Consultant - Technical design execution novel cryptograp crowd-fund method. Whilst working tech startup financial accountant worked stakeholde external developers design, test execute initial coin offering (ICO). led investor relations throughout funding round provided 2014: PwC Assurance - Banking & engineerin analytics Deliver ETL pipeline, analysis visualizat large financial datasets including financial journals loan books. chartered accountant external financial auditor clients banking capital markets London (HSBC, Barclays, Lloyds, BNP Paribas) facilitate transfer client systems before transformi loading our on-prem SQL environmen recalculat clients\u2019 financial statements mined additional qualified chartered accountant ICAEW. 2010: PhD: Geotechnic 2010 began PhD researchin granular materials University Natural Resources Life Sciences Informatio research silos granular flows found here. 2009: Masters Degree: Civil During final year Edinburgh University Great Recession arrived. After graduated found job Starbucks became curious finance. resolved understand \u201chow banks work\u201d. \u2014 @johnmathe"},{"title":"fuse","url":"fuse.html","body":""},{"title":"landing-images","url":"landing-images.html","body":""},{"title":"title","url":"index.html","body":"page\u00a0conte"},{"title":"Portfolio","url":"portfolio.html","body":"Projects aren\u2019t covered non-disclo agreements require access Data\u00a0Scien View\u00a0Demo Recognisin labelling traffic lights Web\u00a0Apps MoneyBar - personal finances dashboard. Extract transactio PDF bank statements Bunq, ABN AMRO, ING, and\u00a0Raboba Makes transactio searchable and\u00a0querya Aggregate transactio time\u00a0perio Calculates income, expenditur transfers within time\u00a0perio Automatica PipPip - Write email now, send die disappear. Send messages particular event\u00a0occu send message specific date, even years the\u00a0future"},{"title":"Reading - April\u00a02021","url":"reading-april-2021.html","body":"Table Contents Architectu Behind One-Person Tech\u00a0Start Boring tech behind person\u00a0Saa Djangos place web Cache invalidati fix social sciences, look \u201cdark ages\u201d medicine Emotional resilience virtues a\u00a0programm WebAssembl magic performanc pixie\u00a0dust Yamauchi No.10 Family\u00a0Off Improve Extend Text Objects Vim Guide Adept\u00a0User Deep dive CORS Articles blog posts saved read\u00a0later Architectu Behind One-Person Tech\u00a0Start article Anthony Najjar Simon he runs his one-man SaaS using\u00a0Djan Low stress, one-person company, run a\u00a0flat. Self-funde taking things slow - he likes taking things slow. Grateful standing shoulders open source giants who went ahead made OSS stack enjoy benefit\u00a0fr own context matters choosing tech stack. no \u201choly grail\u201d. guess means you\u2019re familiar boring for\u00a0you. Uses K8s AWS. He says \u201cdont fall trap thinking too\u201d - expertise these tools learnt over several years fighting fires day\u00a0job. Productive he tools he familiar he focus on\u00a0shippin Django, Celery, PostgreSQL Python, AWS, Redis. - same MoneyBar and\u00a0PipPip Boring tech behind person\u00a0Saa tech-stack keeps\u00a0evol \u201cBoring\u201d means \u201cwhat I\u2019m familiar focus the\u00a0busine his spent talking people thinking. He spends 15% his engineerin Probably he setting stuff\u00a0up. methods described post definitely best way. just way doing engineerin very specific business. only\u00a0way. Django, Celery, PostgreSQL Python, AWS, Redis. - same MoneyBar and\u00a0PipPip Uses Ansible provisioni machines. - YAML files. look into\u00a0this. \u201cGood enough for\u00a0now\u201d Doesn\u2019t CI tools, he uses Ansible shell script he\u00a0wrote. Uses Datadog monitoring alerting, and\u00a0PagerD Uses Rollbar, seems similar to\u00a0Sentry. Uses Slack, talk humans, integratio Rollbar Datadog, slack incoming webhooks notified someone signs does something interestin deletes a\u00a0thing. \u201cding\u201d sound whenever someone signs\u00a0up. He\u2019s always very careful operationa stuff prevent downtime outages. Servers protect against spikes caused sudden Avoids working home cafe cos productive office. Productivi important - every minute count. He doesn\u2019t often 8\u00a0hours/da He optimizes spending less making money instead saving\u00a0mon Uses Vagrant virtualbox MBP dev same systems prod\u00a0infra Uses monolithic repo. Likes this\u00a0appro He uses contractor Usually, biggest obstacle building shipping things overthinki this, that. important no cares. No sees. Even screw initial product launch, no care they\u2019re looking. you\u2019ve proved deserve attention any attention Think big, start small, act fast. boring technology whatever tech want. Just sure you\u2019re solving Ignore cargo cult people ignore noise. Keep calm carry\u00a0on. Djangos place web everything needs SPA Django back-end framework, it\u2019ll front-end framework, separation of\u00a0concern django SPA, DRF, just views JSON. Reading makes check React see fuss is\u00a0about. Cache invalidati Cool all, powerful snippets I\u00a0think. Auto correcting typos: teh ->\u00a0the Expanding phrases: kr -> kind\u00a0regar Multi-line really seems similar I\u2019m UltiSnips\u00a0 found question comparing abbreviati snippets. TLDR: easier add maintain snippets abbreviati less boilerplat snippets abbreviati especially complex\u00a0ca fix social sciences, look \u201cdark ages\u201d medicine Emotional resilience virtues a\u00a0programm Laziness - quality makes go great effort reduce overall energy expenditur makes write labor-savi programs people find useful document wrote answer questions about\u00a0it. Impatience - anger feel computer lazy. makes write programs just react needs, actually anticipate them. least pretend\u00a0to Hubris - quality makes write (and maintain) programs people won\u2019t say bad things\u00a0abo Also, read quote somewhere saying mark great program having people ways didn\u2019t expect, something like\u00a0that. WebAssembl magic performanc pixie\u00a0dust Yamauchi No.10 Family\u00a0Off beautifull Improve Extend Text Objects Vim Guide Adept\u00a0User manipulate multiple quickfix digraphs use\u00a0them. Useful keystrokes INSERT\u00a0mod Useful keystrokes VISUAL\u00a0mod Vim shell commands in\u00a0Vim. Deep dive CORS ps - see processes running sleeping. WCHAN tells kernel event waiting processing is\u00a0awaitin"},{"title":"Learning - April\u00a02021","url":"learning-april-2021.html","body":"Google Cloud Platform Service Accounts Ansible - based Jeff Geerlings book. 15 episodes. SSH Vagrant"},{"title":"Tweets - April\u00a02021","url":"tweets-april-2021.html","body":"Table Contents Front-End Mental\u00a0Mod Agency Razors Crypto Front-End 6 website top landing page inspiratio onepagelov .com @robhope \u2022 lapa .ninja \u2022 landingfol .com @dannypost saasframe .io .com @Cruip_com \u2022 saaspages .xyz @Versoly\u2014 Jim Raptis (@d__rapti April 14, 2021 anyone interested fun @microacqu 90 180 days start finish build sell tiny company public?wou really great M&A practice Jim Bisenius April 14, 2021 Mental\u00a0Mod Tobi's favorite example FIRST PRINCIPLES Truck driver.His truck sat still 8 HOURS THANKSGIVI waiting his cargo unloaded he realized\u2026\u201c take WHOLE trailer off back ship rather unloading + reloading each\u00a0item? George Mack May 18, 2020 LUTKE LEARNING 6 - TALENT STACK LED CURIOSITY > MBA He didn't MBA. He didn't grind 100-hour workweeks. Instead, he played video games (which led coding) he snowboarde (which led online snowboardi store). 'Talent Stack' led to\u00a0Shopify George Mack May 18, 2020 super long thread, worth reading all: Josh Waitzkin might INTERESTIN person alive.He doesn't Twitter. he barely uses internet.I compiled favorite 5 MENTAL MODELS his below.THRE George Mack August 8, 2020 Agency 1/ HIGH AGENCY Once SEE - never UNSEE it. Arguedbly important personalit trait foster. I've thought concept every week last two years since heard discuss @tferriss' podcast. THREAD\u2026\u2014 George Mack November 29, 2018 Razors THREAD: 15 useful razors rules I've found.Rule thumb George Mack January 16, 2021 Crypto Now let\u2019s compare stock-to-f model. Below added S2F model, aforementi inflation rate regressed against price. /10 Jurrien Timmer April 13, 2021 #Bitcoin looking strong RSI 92. Still above RSI 95 2017, 2013 2011 bull markets. calculated BTC price needed RSI 95 April close: $92K. Let's see Coinbase IPO today\ud83d\ude80 PlanB April 14, 2021"},{"title":"SSH-Notes","url":"ssh-notes.html","body":"Table Contents Background Authentica Passwords and\u00a0Keys Handshake Background Secure Shell lets securely connect remote servers. connect account exists remote server. Once you\u2019ve connected you\u2019ll dropped shell\u00a0sess computer connect \u201clocal\u201d \u201cclient\u201d computer. computer connect \u201chost\u201d the\u00a0\u201cserve you\u2019re connected server SSH, any commands input client sent securely privately (through \u201ctunnel\u201d) remote computer, where commands are\u00a0execut SSH implemente client-ser model. server running small app listen SSH connection kind app called daemon (pronounce day-mon). SSH work, host running SSH daemon. SSH daemon listens connection specific port (22), authentica connection requests, (if connection request approved) spawn correct environmen correct environmen client (the computer connect from) running SSH client, small app communicat SSH protocol. (A protocol rules.) needs able receive informatio host connect to, user connect credential trying to\u00a0connect Authentica Passwords and\u00a0Keys Clients authentica passwords keys. Passwords less secure keys. Keys very secure. connect no authentica specifying particular IP address I\u00a0think. Passwords encrypted, conceptual familiar, (and will) brute forced. tools block repeated attempts block/allo authentica attempts particular IP\u00a0address SSH keys public private (or secret) pairs very secure. Keys generated pairs. public shared freely without concern. secret kept secure secret a\u00a0password authentica pair, client both keys (a pair) computer. server public called server private something gone wrong be\u00a0alarmed server stores public keys users who connect particular user contains list public keys, public each\u00a0row. default location store public remote server users home folder subdirecto called full path Handshake client wants connect server SSH, tells server public use. server checks public\u00a0key unique session ID generated shared client and\u00a0server server same public client sent began connection attempt, server generates random string encrypts public key. random string decrypted private (secret) associated public\u00a0key server sends encrypted string client. client decrypts secret combines original random string session ID. client hashes combined string sends hash back the\u00a0server server already hash string combining original random string session ID. hash client matches hash server, server sure client private\u00a0ke Source"},{"title":"ChezMoi","url":"chezmoi.html","body":"Project Repo Project\u00a0Si Commands cm instead chezmoi: alias cm=\"chezmo Start tracking file: cm add Update cm version, add again: cm add .. Edit tracked version file: cm edit Clobber local version tracked version: cm apply Dry run see diff local version tracked version: cm -nv apply Difference local version tracked versions: cm diff Pull latest changes repo apply them: cm update Remove file: .chezmoire chezmoi apply --remove --dry-run --verbose"},{"title":"Ansible","url":"ansible.html","body":"Background spending lot lately working nodes various blockchain projects (Polkadot, Cardano, Tron, Binance Chain, Ethereum, \u2026). rosetta api spec super interestin things crypto documentat sometimes wrong incomplete bugs nodes runs separate server, typically node mainnet another testnet. I\u2019m working across mutiple servers, doing difficult stuff, easy as\u00a0possibl reduce friction Accessing servers easy - Tmux continuum resurrect plugins maintain different sessions server. makes accessing multiple servers during same really simple effortless working servers still\u00a0awkw dev machine zsh syntax highlighti command completion various tools, z navigation supper easy. lot aliases defined. E.g. .. \u2192 cd ... Working remote server convenient familiar working local machine, find way configure server same way laptop, automatica done times, no Ansible Ansible seems It\u2019s\u00a0free got features capabiliti you\u2019re going to\u00a0need agentless - install anything machine control - Ansible anything ssh\u00a0into. following resources get\u00a0starte useful video gave orientatio helped figure aiming started. Before watching it, didn\u2019t know \u201cwhich way was\u00a0up\u201d. blog post showed inventory gcp_comput plugin. spent lot unnecessar confused service accounts. guess until success understand something know you\u2019ve misunderst little a\u00a0lot. Once inventory servers connect to, still specify (and prepare for) connect them. I\u2019d hoped gcp_comput plugin heavy lifting step, seems not. lots useful stuff creating instances specifying disk space networks, won\u2019t really help ssh instance. No matter\u00a0tho blog post turned just needed. found beginning search trying inventory, discarded almost useful. Turns OS Login best way ssh GCE instance once you\u2019ve got inventory taken care of, blog post really\u00a0hel installing python modules, had errors pyenv shims incorrect. scripts looking versions weren\u2019t present. Running pyenv reshash fixed it. Kind magically, but\u00a0annoyi Setting service account giving correct permission took confusing anything with\u00a0Ansib found blog post setting vim yml files. preferred way install ansible Mac pip. OS Login username ssh compute instance change. question explains\u00a0w Commands gcloud auth list ansible-co view|list| -i --graph ansible -i -m ping"},{"title":"Over-Engineering this\u00a0blog","url":"over-engineering-this-blog.html","body":"Over last few weeks spent unreasonab amount energy making unnecessar improvemen this\u00a0blog. these Adding keyboard shortcuts (type ? find out\u00a0which) Implementi optimizing client side fuzzy\u00a0sear src-set serve responsive images Lazy loading images site load\u00a0faste Compressin page files brotli gzip (Precompre Trying (and ultimately failing) avoid \u201cwhite flash\u201d dark mode chosen page loads (Github discussion I\u2019m really sure why did it. makes almost no difference anyone me. felt tinkering, nice build something continue no maintenanc tell myself over next few years gain benefits these features even forgotten taught lot JavaScript great language familiar - everywhere warmly encourage someone younger myself pursue interests sake curiosity fun. very high chance even no-one uses shortcuts except me, javascript skills come useful even I\u2019m sure enough reason - things built solve present problem, what-ifs maybes. YAGNI. wouldn\u2019t myself profession capacity. tension curious I\u2019m really sure justify myself. hobby, wanted it, enjoy tinkering web technologi learning new\u00a0things also, lost sleep over - stayed too late, put pressure other\u00a0thin know curious, making room play interestin things, useful approaches personal developmen up-skillin myself. a\u00a0limit.. tension wasting taking risk, take few years before know sure these efforts worthwhile or\u00a0not. fun, do\u00a0it. Successful business owners seem very leaving things alone once they\u2019re \u201cgood enough\u201d, fact, think perfection antithetic entreprene am perfection I\u2019m just really curious big appetite for\u00a0learni \u201cappetite learning\u201d stops focussing. myself become distracted adding features blog, instead zoom bit think working towards substantia meaningful goal, exclusion minor\u00a0goal think entreprene very focussed, fault. am focussed. am too distracted by\u00a0life. balancing act, tension emotionall physically present family friends, ignoring things possible focus doing something meaningful"},{"title":"Fuse\u00a0Search","url":"fuse-search.html","body":"Adding search made site feel faster accessible reimplemen search site fuse.js instead tinySearch read implemente tinysearch here. first implemente search surprised faster accessible site began feel. quickly access any content typing few words, didn\u2019t scroll follow link.1 means find content without having think - break flow concentrat might sound trivially small considerat lowering friction cognitive load small ways difference something you\u2019re already working hard concentrat something else. example, look notes nohup command, quickly go site, / (the keyboard shortcut search), \u201cnohup\u201d hit enter. muscle-mem level impulses. think content, think category posted it, scroll down scan list, mouse click intermedia links. Win. Working speed thought rather speed input big deal. Why switched tinySearch Fuse.js Before implementi fuse.js, site had search feature powered TinySearch wouldn\u2019t had enough knowledge implement fuse.js hadn\u2019t already learnt JavaScript whilst setting-up tinySearch TinySearch had example Pelican Blogs, simple clear readme. tinySearch first saw example build JSON array becomes search index, implement javascript that\u2019s required client side search. Also, course developing blog become proficient comfortabl JavaScript (and jQuery) general. Fuse.js really quite simple once you\u2019re familiar JavaScript flexible tinySearch choose search weights different fields, accuracy thresholds parameters fuzzy search algorithm. general approach instantiat instance Fuse calling Fuse JSON array parse, along options. give instance string back array results whatever with. accuracy search results higher fuse.js speed still acceptable did optimizati search index Fuse generates, though. Optimizing search index \u201cnormal\u201d search index Fuse uses results JSON array content articles able search. generate jinja template any way want. (There simply needs JSON array browser downloads does fuzzy search on). gave 4MB. Once asked Fuse search complete text article (not just default first 600 chars, iirc) speed really suffered. optimized index following three ways: Removed any non-words. articles jupyter notebooks converted articles (the plugin reasons why began Pelican). index built, lots html gets included, isn\u2019t helpful. Any \u201cwords\u201d 20 chars just delete. Removed 150 common words. Any word articles useful distinguis different articles, deleted index. add any meaning. wrote short pipeline shell commands tr, sort, uiq generate list common words. wrote python script update original search index removing common words. Shortened any long words keeping first 12 characters word 15 characters long, simply removed last chars. figured fine matching first 12 characters already quite unique give result. Doing these optimizati reduced 90%. Compressin JSON gzip brotli makes files even smaller, now amount transferre client seems reasonably small. (This static site, therefore search happen client side.) browser still begin lag search string length increased. takes search character string 5 character string, initially fuse doing search every character typed. wanted site feel fast possible thought search paused whilst typing occurred short after last pressed improvemen added short delay 200ms call, typing during delay resets time. reduced lag made search tool feel responsive learnt called \u201cdebouncin further complexity wanted debounce characters searching, navigation keyboard shortcuts. Getting debounce run presses surprising complex. taught lot JavaScript though, satisfying made useful user interface. immediatel gave idea add keyboard shortcuts. ? see happened \u21a9"},{"title":"Python\u00a0Notes","url":"python-notes-2.html","body":"__call__() Python, every call method such my_functio interprete replace ( .__call__( >>> def >>> x+1 >>> class Prefixer: def __init__(s prefix): self.prefi = prefix def __call__(s message): self.prefi + message prefixer like\u00a0this: >>> simonsays = says: \") >>> high!\") 'Simon says: jump high!' Every call method, you\u2019re really just calling built __call__ method. one, preferably one, obvious way do\u00a0somethi \u2018zen Python\u2019, guidelines help design decisions. choice Python made, languages different levels languages applies idiom level design pattern level. applies even less architectu level where several equally ways organizing business logic Perl \u201cTMTOWTDI\u201d (tim towtdi) principle - \u201cThere\u2019s Way It\u201d. Perl\u2019s philosophy give users way do\u00a0somethi"},{"title":"Adding\u00a0Search","url":"Adding-search.html","body":"added search blog. Results generated type. Try typing / cmd-k. look Pelican plugins index you\u2019ll see Tipue search search tool ready-made Pelican plugin, unfortunat project seems died projects website now searching static site quite common googling alternativ gave few choices. Lunr.js seems popular, seemed fairly complicate probably needed. went Tiny Search seemed needed easy setup. There\u2019s even example Pelican\u00a0bl hurdle success minimising false positives. default settings seem prioritise keeping index small (tiny) over giving user experience Maybe amount text site significan less, more, typical case. Either way, after checking project\u2019s issues Github found issue matched problem perfectly. solution increase tiny_magic variable build\u00a0time According Readme, requires container building index docker run.... Unfortunat Dockerfile wouldn\u2019t complete without errors. Checking issues again adding discussion resulted alternativ Dockerfile suggested, works. Woohoo! build search index massive tiny_magic value\u00a0(204 something weird happened. write Vim fzf find open files. realised fzf had stopped working. After investigat realised working blog project, fzf.vim calls fzf CLI tool, turn calls ripgrep tool. underlying issue ripgrep wasn\u2019t working, after few hours (sob) debugging, found things makes rg special ignores stuff .gitignore file. Sneakily, without noticing, Docker image constructi tinysearch files had created .gitignore single entry. entry *, selects everything rg ignoring everything giving no results. meant couldn\u2019t find open\u00a0files still know (or part of) Dockerfile does this, created contains correct content, after generate search index replace traitorous .gitignore contents I\u2019ll come back later when/if better understand Dockerfile syntax, or\u00a0Rust. Adding search site made content feel lot closer accessible Once working immediatel wanted keyboard shortcuts open search box select results. Kind does it. feels really fast and\u00a0precis Googling jquery packages, vanilla javaScript showed enough things working. hit / ctrl-k cmd-k bring search box populates results you\u00a0type! whole words matched unfortunat still super useful feature. search index includes article content well article titles categories I\u2019d tweak few keyboard shortcut behaviours add contents various pages (which aren\u2019t articles) search\u00a0ind Update reimplemen search fuse.js. read here"},{"title":"Cardano: Generating\u00a0Addresses","url":"cardano-generating-addresses.html","body":"different customers deposit send ADA (The unit currency Cardano blockchain Cardano node, necessary determine customer responsibl transactio correct customer account be\u00a0updated things involving blockchain initially seemed simple requiremen involved several hours of\u00a0work. Cardano wallets generated parameter called default 20, unused addresses node generate client REST API. addresses used, node automatica generate another always 20 probably very convenient personal use. someone send funds, simple api call cURL fresh address. running service, weather e-commerce financial service, really enough. advice forums says generate wallet very large such 10,000 just generate wallet run fresh addresses, still feels a\u00a0compromi lets explain our situation detail first. customer wants send us ADA, give fresh address that\u2019s never before have. know any funds arrive address particular customer. However know customer actually address transfer any funds. address might remain unused might not. Neverthele address now reserved them, no else use\u00a0it. way, might generate maintain list thousands addresses never used. seems bad\u00a0soluti Fortunatel answer, albeit fairly convoluted obscured form. mnemonic generate wallet originally generate 2^31 unique addresses like\u00a0so: Clone repo build docker\u00a0ima git clone docker build -t . mnemonic generate containing list space separated words one\u00a0row. Run the\u00a0follow export increment= && cat mnumonic.t | docker run --rm -i Shelley | docker run --rm -i child | docker run --rm -i public | docker run --rm -i address payment --network- testnet > payment.ad && cat payment.ad ;echo"},{"title":"More VIM\u00a0Notes","url":"more-vim-notes.html","body":"q: - opens command window. yanking viewing :UltiSnips - opens ultiSnips current buffers filetype. See snippets are\u00a0define Valuable Dev following gems I\u2019d start\u00a0usin gf - edit path under the\u00a0cursor gx - open path under the\u00a0cursor [m, ]m - move start end a\u00a0method @: - repeat last\u00a0comma : - open command history\u00a0li >> indent line. . repeat operation, >>.. indent 3\u00a0times. along count, indention lines (with current top line). 3>>.. indent lines blocks the\u00a0right. - moves screen line, moves cursor go off the\u00a0screen - moves screen down lines, moves cursor go off\u00a0screen - move screen down page, cursor top of\u00a0screen - move screen page, cursor bottom of\u00a0screen Vim Python great notes linting completion plugins either copied less doing\u00a0alre"},{"title":"Two Years Of\u00a0Vim","url":"two-years-of-vim.html","body":"feeling very comfortabl Vim + Tmux setup recently. Navigating around shells files isn\u2019t taking mental effort taken years working full vim stage where commands pepper text files outside vim (email, notes, etc) vim keys accidental - j k x etc can\u2019t remember command something I\u2019m actually doing it. action, muscle memory pay attention underlying press something goes\u00a0wrong noticeable trying find unbound combinatio action, reading article vim thinking \u201cthat\u2019s new\u201d actually doing pleasant surprise doesn\u2019t take effort rebind single command retrain myself it. presumably mental effort commands become negligible early days, retraining combinatio took lot effort already making effort doing things in\u00a0Vim. even vision blurry (and speech slurred head heavy) text objects navigation commands where know text is. I\u2019m saying I\u2019m tired, can, I\u2019m already familiar"},{"title":"Binance-Chain: Running a\u00a0node","url":"binance-node-api.html","body":"week setting binance-ch node. Unlike Polkadot Cardano, I\u2019m going run container until working reliably. Binance docs show couple ways install node. install.sh script went default values possible. Installati first attempts sync full node install.sh script, node wouldn\u2019t sync completely stuck. setup VM did manual install (\u201cOption Two\u201d) far node syncing without any issues. download genesis separately case. Also, sure download node-binar repo git lfs just git. look worked bnbchaind wont completely downloaded unless lfs took awhile realise documentat assumes environmen variable called BNCHOME. either export (like any environmen variable) replace environmen variable start node command path: nohup bnbchaind start --home BNCHOME & Note: I\u2019m sure bnbchaind needs environmen variable not. doesn\u2019t give errors isn\u2019t set, seem having success BNCHOME defined. Syncing node three ways sync node. Fast-sync isn\u2019t fastest way sync node, hot-sync is. install.sh put correct default values file, needed adjust ping_inter pong_timeo recommende values. Surprises documentat assumes familiarit running tasks background terminal session, you\u2019re familiar nohup. wasn\u2019t - I\u2019d even forgotten & symbol does1 did research wrote notesIt starts process background move foreground fg see list running jobs jobs. move running job background (like vim session) ctrl-z \u21a9"},{"title":"nohup and Background\u00a0Processes","url":"nohup-and-background-processes.html","body":"Stop stuff from\u00a0stopp run command terminal session terminal session disconnect processes running be\u00a0termina discovered trying download ~500gb database overnight. logged next morning expecting see completed download, found had half the\u00a0file. nohup ignore HUP signals solution seems nohup, command ignores HUP signal. stops programme stopping terminal session running is\u00a0stopped convention HUP signal method terminal warn dependent processes to\u00a0logout. probably run nohup background might prevent creating nohup.out. Close redirect fd0 -\u00a0fd2 Linux, nohup automatica closes stdin. you\u2019re MacOS BSD doesn\u2019t automatica happen, might redirect yourself. background process tries read anything stdin pause itself whilst waits bring foreground input. probably waste of\u00a0time. nohup detects redirected stdout stderr won\u2019t nohup.out. commands, put & end command, run background bring foreground running fg, see list jobs running jobs. redirect input /dev/null ( log.txt redirect stderr a\u00a0file: $ asdfadsa 2> error.txt run command generates lots error messages along \u201cgood\u201d messages, redirect error messages (stderr) /dev/null see useful stdout $ grep -r hello /sys/ 2> /dev/null run command see errors, (stderr) filter stdout redirectin stdout messages /dev/null: $ ping google.com 1> /dev/null Redirect output /dev/null command run\u00a0quietl Redirect output. command below redirects stdout /dev/null (the default descriptor isn\u2019t specified) redirects descriptor descriptor $ grep -r hello /sys/ > /dev/null 2>&1 Read input instead the\u00a0termin 0>logfile Combining 2>&1 means send stderr wherever stdout going. means you\u2019ve combined stdout stderr stream can\u2019t separate anymore. means pipe stderr same stdout. Input redirect stdin similarly. run Ranges Searching Undo Splits Macros Verbs s - delete char under cursor enter Insert\u00a0Mod - replace char under\u00a0curs c/hello - change until next occurrence of\u00a0\u2018hello\u2019 Registers \"ayy yank entire row register a. \"Ay yank register append text existing contents the\u00a0regist :registers - preview contents Insert\u00a0Mod - delete back one\u00a0word. - delete back start start cgn - searching word (either / * #) change instance search result, gn change delete go next result. .dot operator repeat both steps (moving and\u00a0changi - paste. new-line chars Normal\u00a0Mod Select column numbers increment, g turn Ranges :put =range(1,1 - insert list :for range(1,10 | put | endfor - loop generate long\u00a0list. Searching g# g* partial matches, # * exact\u00a0matc Search word under cursor, similar: Press /. - copy paste word under cursor search box. Edit as\u00a0necessa After you\u2019ve done search, jump back where cursor was\u00a0before Find replace whole words only: Find replace either old-word1 old_word2: g - show stats current bugger - word count, count, char\u00a0count Undo g- g+ - undo\u00a0branc Under changes within period time: :earlier 2d - undo changes last 2\u00a0days :later 5m - redo changes last 5\u00a0minutes :earlier 3f - undo changes last three buffer\u00a0wri s seconds, m minutes, h hours, d days, f saves @a - global command execute macro lines current containing - every containing \u201cgood\u201d substitute \u201cbad\u201d with\u00a0\u201cugly Splits - rotate splits left right split vertically - rotate splits right left. H - move current split far left full height. J - move current split bottom screen full\u00a0width :only - close splits except current\u00a0sp Macros @o - macro stored O lines match Insert Mode jump Command Mode command put back Insert .dot command repeats commands changes content. wont repeat"},{"title":"Notes From \u201cPowerful\u00a0Python\u201d","url":"python-notes.html","body":"parts Aaron Maxwell\u2019s Power Python newsletter forget: Table Contents Emergent Abstractio Practioner Engineer, Scientist Sentinel Values Levels Python Read PEPs Emergent Abstractio expecting letting abstractio emerge projects. find yourself repeatedly solving similar problems similar ways, simplify couple convenienc methods helper class? below snippet gives three ways instantiat twitter API client: generic \u201cnormal\u201d way specialize way looks certain environmen variables specialize way looks configurat os # environmen variables twitter # class ApiClient: def __init__(s consumer_k self.api = twitter.Ap consumer_k @classmeth def cls( @classmeth def path): open(path) config_fil # ... cls(...) # ... Practioner Engineer, Scientist Practioner - thing (a framework, tool) Engineer - thing needed to, recreate Scientist - frameworks paradigms never existed before Aim engineer level. Sentinel Values Instead setting sentinel something quite impossible None \"None\" object() better creates unique instance object class no ambiguity where came from. sentinel variable to. special differs legal possible values variable have. signal canary something happened. Levels Python Syntax - understand indentatio important, sometimes parenthesi etc Idiom - building blocks program. \u201cParagraph follow common patterns, loops, context managers. Design Pattern - Less well defined Idioms, useful. - Creational Patterns, factories - Structural Patterns, Adapters Proxies - Behavioura Patterns, Visitor Strategy These tend same across different languages. Architectu - large-scal structure software system. language itself doesn\u2019t lot difference applicatio same architectu whether written Python Java. interface different components different, \u201corgans\u201d body essentiall same. Read PEPs Python Enhancemen Proposal document that\u2019s written propose feature Python. fully details proposed feature, arguments against it, lots sample code. PEP accepted future version Python, PEP becomes authoritat document feature it. PEPs tend written best programmer world, hang them. Abstractio principal OOP \u21a9"},{"title":"Mental Models I Used To\u00a0Use","url":"mental-models-i-used-to-use.html","body":"rules1 mental models helped succeed season phase life may best next phase. Here list few mental models remember concious previous years. Probably already forgotten some. Always ask \u201cwhy\u2026\u201d. obsessive this. going things harder while before things easier. You\u2019ll find difficult answers otherwise wouldn\u2019t. you\u2019re concerned present true ignorance bliss, otherwise liability. \u201cWhat if\u2026\u201d another question ask lot. Adapt situation, adapt any choice. kind water, going around things through gaps. Look edges gaps, parts aren\u2019t well known. people talk to. Shut listen. mean harm respect it\u2019ll become obvious keep talking. mean well they\u2019re saying something useful, benefit letting talk more. Inversion - hard know something, feel didn\u2019t it, didn\u2019t happen? Regrets inevitable everyone them. Same making mistakes. regrets things did do, didn\u2019t do. willing try something, fail it, still glad tried, almost definitely it. Commit enjoy experience scared, least, scared optimistic happy2. beauty luxury such bad spot backed corner seemingly no way out. Things become black white, instead shades gray, priorities options clearer. likely very efficientl effectivel scenario, learn important things yourself. Now I\u2019m older can\u2019t ever things become bad situation becomes black white. navigate world grays. become black white, I\u2019ll already long list failings. younger, things fragile. resources smaller things quickly flip bad. Enjoy few benefits situation gives, (hopefully once gone gone good. best way solve problem prevent occurring first place. Succeeding bring own challenges Take responsibi things responsibl for, kind of. deliberate own benefit, forget pretending this, force yourself understand situation deeply peoples perspectiv learn faster help future. Keep arms length though - make-belie able switch off. toy play with. seems \u201cextreme is. think important mental models you\u2019re comfortabl with, lets decisions quickly consistent understand map territory, these just tools toolbox.or policies \u21a9Courage isn\u2019t absence fear. scared doing right thing anyway. \u21a9"},{"title":"Vim: GoTo Tag\u00a0Definition","url":"vim-notes-goto-tag-definition.html","body":"Update (2021-03-3 Just neovim.coc instead YouComplet Syntastic. faster, easier setup, works intuitivel ALE still wonderful useful, though there\u2019s lot overlap - coc lint well. Jump Lists Change Lists you\u2019re going jumping around where things defined, know jump back again. seems two lists aware of, jump list1 change list2. Jump List list locations cursor jumped to. Relevant jumping definition move jump list mode down jump list Change List list locations where change made. change something undone u. '. move . mark. . special mark automatica location last edit. bring back where before last jump g; g, move down change list Original Post: multiple ways doing anything vim, including going where object defined, usually something least times before without breaking focus train thought. memory hazy remember spending 1/2 looking considerin solution wanted commit to.3 options seemed YouComplet ALE. [Update!4] can\u2019t remember everything read tried, trust conclusion Looking .vimrc see x mapped :YcmComple GoTo works just fine, even module imported somewhere outside current project. tool working ready use, just hadn\u2019t internaliz yet. Commands remember: x - GoTo definition - YCMs best guess \u2018intellige goto command, whether declaratio definition - Toggle tagbar :help jumplist \u21a9:help changelist \u21a9The powerful tool, worthwhile take closer look can\u2019t do. \u21a9YCM ALE fine goto definition linting, give satisfacto looks might offer improvemen \u21a9"},{"title":"What\u2019s So Different About\u00a0Now","url":"whats-so-different-about-now.html","body":"think less aware our ignorance previous generation easy implicitly assume useful informatio available us, therefore informed really\u00a0are think internet made informatio accessible global air travel made world feel\u00a0small Whilst individual hopefully never pretend know everything think easy assume right informatio exists people whom is\u00a0relevan accessibil informatio put us situation similar informatio scarcity. still actively search informatio want, informatio comes us easily free equal find apply\u00a0effo easily short pieces news informatio am always slightly overwhelme pace modern communicat encourages never slow down enough form own questions frame own arguments. always find answer questions, last checked whoever gave wasn\u2019t going profit from\u00a0it?"},{"title":"Predicting the Future using Human Nature and\u00a0Technology","url":"what-happens-next.html","body":"Predicting future sounds tough problem, try without realising\u00a0 predict future think risky scary something is, think what\u2019s really going change announceme press release. try predict future we\u2019re supermarke checkouts try pick queue move fastest. always seem pick wrong\u00a0one. million ways trying predicting future ones models reduce complexity emphasise comparing influence human nature technology outcome, comparing event what\u2019s Human nature doesn\u2019t change, something driven fear greed probably doesn\u2019t matter century occurs in. Technology change, something enabled prevented due technologi progress date is\u00a0importa driving scenario? human nature technology Supermarke checkouts mostly manual require couple adults together, human nature bigger role efficiency tech. Young men stack pack quickly, old women opposite. types shopping bags have, pay, even items they\u2019re buying, probably going lead same probably works getting through"},{"title":"Financial Doom And\u00a0Gloom","url":"financial-doom-and-gloom.html","body":"Financial crises seem happen fairly regularly shouldn\u2019t unexpected no-one seems particular concerned our current financial system, moment our attention controlled threats. I\u2019m concerned lot money injected money supply haven\u2019t seen any inflation. am concerned price stocks no longer related created company instead macro economics. terrible investor. alarming statement. investing always decent way money unless markets broken. price something doesn\u2019t represent correction inevitable Interest rates really low moment spare money where put it? bank account, interest rates low1, government debt, yield low. stocks investment increase meaningful everyone doing drives price up, price increasing increase even further. think reason concern super low interest rates massive increases money supply, couple factors contributi easier ever retail investors participat stock market, seems idea. However retail investors influence effect prices, themselves manipulate influenced regarding buy sell, likely kind threat financial stability. We\u2019ve never seen social media combined quick, cheap investment services amateurs before. Index funds popular ever2 - efficacy index investing relative traditiona funds stock pickers very high over medium long horizons index funds cheaper. index funds become too large end influencin market predictabl rigid ways. Index funds cannot choose buy buy - just track index. company\u2019s stock crosses certain thresholds stock bought sold. seems possible feedback loops where funds buy rising stock, increases scarcity price, requires index funds purchase same stock. amount euros existence 2019 90% 2010.3 inflation 2010 2020 13%.4 Why that? price something doesn\u2019t represent value, correction inevitable interest rates low? confidence economy low, central bankers lower interest rates 1. Cheaper business borrow money invest business therefore easier business investment profitable 2. attractive investors capital invest business (which grows economy) relative depositing spare cash bank account (which safer less efficient way deploy capital). Interest rates affect relative risk-rewar ratios different investment strategies \u21a9Index Funds Kings Wall Street \u21a9statista \u21a9"},{"title":"Debugging the more_categories plugin for\u00a0Pelican","url":"debugging-more-categories-pelican-plugin.html","body":"realised plugins blog working correctly. plugin to: add subcategor assign multiple categories articles. Subcategor aren\u2019t working Pelican thinks article just categories contain forward slashes. his \u201cPowerful Python\u201d emails, Aaron Maxwell recommends looking source popular python libraries see really Python written, talented developers write solve problems. opportunit look powers plugin see can: Understand source Locate source problem Fix problem know Pelican amazingly quality not, feeling developer resources, got real reason motivation look underlying I\u2019m going give shot. documentat sparse doesn\u2019t help, impression whoever wrote feels Pelican simple obvious what\u2019s going 1. obvious me. Pelican Plugins Every plugin register() function, here plugin: def register() understand idea signals Django, generators discussed bit documentat else happening\u2026 write down understand plugin, I\u2019m aware understand definitely incomplete probably wrong. hope progress see mistakes already written. called first, takes two arguments, generator metadata. entire lines here is: def metadata): categories = = name categories = looks gets category metadata article. Presumably called articles already parsed metadata object already created populated metadata articles, including categories first row splits categories multiple categories listed. metadata dictionary metadata dict article, otherwise couldn\u2019t just assoiciate dictionary split string commas. means called once article. know text_type does yet. Maybe ensures output always string. imported six remember seeing dependecy packages. .. Having checked documentat six looks right - represents unicode textual both python2 python3. Pelican originally written Python2 guess. Next step write key-value pair metadata dictionary article. plugin adds functional python enabling categories just category article. seems clear adding categories metadata dict obvious way this. categories list where item instance Category class. class instantiat two arguments, name string previous row, currently understood .. printing contents shows dictionary settings. Easily assumed confirm. I\u2019ll dig Category class moment, first lets quickly cover last row function. category attribute articles metadata simply updated first item categories list (categorie list indexed.) class Category() class class defined plugin (which 96 lines code). 6 methods, 5 decorated, no constants. decorators property [3], _name.sett [1] [1]. URLWrapper imported know does beyond \u201cwrapping URLs\u201d. @property Decorators functions takes methods functions inputs. property along setter decorators lets class property assigned whilst ensuring arbitrary conditions logic upheld. @property decorator over method called foo, decorator called foo.setter method somewhere class. doesn\u2019t seem entirely right though, our Category class, @property decorator over _name method, @_name.set decorator over another method called _name. methods @property decorators (slug ancestors) any associated setter decorators methods. setter _name seems parent categories string contains slashes: @_name.set def _name(self val): '/' val: parentname val = 1) self.paren = self.setti else: self.paren = None self.short = val.strip( Here, self.paren becomes instance category class, instantiat parentname self.setti recursive however levels subcategor specified. ancestors as_dict methods seem confusing. ancestors isn\u2019t called mentioned within class definition called called after get_catego returns. understand why needs @property decorator though. class inherits URLWrapper probably next best place look\u2026 Indeed, looking definition URLWrapper shows as_dict method overriding definition base class.I guess \u201ccurse knowledge\u201d \u21a9"},{"title":"Different Views For Different\u00a0Users","url":"different-views-for-different-users.html","body":"blog serves variety purposes. partly journal I\u2019m teaching myself developer scientist, personal blog, articles interests experience unlikely anyone interested every article, I\u2019d easy people read content they\u2019re interested in. Therefore thought separate articles two broad groups, technical non-techni visit blog first clicking link technical article, site show technical articles blog. same non-techni articles. want, change these settings clicking paw icon1 navbar blog index page. did mainly could. playing around blog. JAM stack feels accessible fun working tailwind jQuery. think playing (being curious, lightheart unhurried concerned failure) really important. Especially adults who usually much. successes big opportunit result process started playing around. Here list requiremen adding feature: Requiremen user lands page DOESNT local setting - local setting based article read user lands lands page DOES local setting contradict - reset local setting \u201call\u201d user lands index DOES local settings, show articles match setting Steps: Index page: check local storage option exists, print console result Index page: button group Index page: correct button active page load localstora Index page: update active button page click Index page: articles button clicked Index page: local storage does exist, respect Index page: add stage switch hamburger menu Index page: hamburger menu behave intuitivel small screens Index page: local storage does exist, pop modal asking choice Article page: check local storage option exists, print console result Article page: local storage doesn\u2019t exist, according article Article page: local storage does exist contradict update article paw cat\u2019s paws cat category. might change something intuitive future, making icon user seeing non-techni posts, technical, posts. \u21a9"},{"title":"3 Different Types Of Programming\u00a0Problems","url":"different-types-of-problem.html","body":"Three categories problem Last year creating moneybar pippip few problems took effort solve others. think group problems buckets, based take solve. takes less 15 minutes solve, takes 15 45 minutes solve, takes 45 minutes (usualy more). 3: start learning hard thing (like web developmen almost everything third bucket exhausting aside big chunks time, focussed undistract calm wide awake, prepared long arduous journey. Probably criteria success \u201cam dead?\u201d you\u2019re asking question you\u2019re guaranteed successful keeping morale high necessary success. 2: Hopefully progress understand basics internaliz relevant abstractio problems quickly1 become problems. take 15 45 minutes solve. Maybe know enough break big general problem smaller problems (you developing domain expertise) intuitions solve problem becoming better first second attempts likely correct, rather fifth sixth. Knowing google problem answer really important skill, requires intuiting English speaking expert ask question. isn\u2019t trivial hear people discussing often. coding problems 2, feels I\u2019m learning efficientl I\u2019m productive 1: After while, problems solved become problems. take less 15 minutes solve, because: big problems solved now you\u2019ve got smaller problems left, intuitions expertise increased know where look answers.3 Exceptiona problems: seems consistent exception model.4 Let\u2019s silly call W problems. These problems eat far too hours, tiring solve, even (in respects) expert. me, these tend relate blob storage solutions web apps deployed production think several factors why so, I\u2019ll describe specifics before generalisi web app runs production stored web server things web-server cheap efficient things database storage bucket cheap efficient. Therefore stored somewhere else plumbing join everything together. abstractio involved easily securely. However developing locally, doing everything laptop. web-server relational database system same place. big, fundamenta architectu difference developmen environmen production environmen general rule, these supposed similar possible. These difference easier something works locally doesn\u2019t production very hard test thing production without deploying staging environmen likely less familiar local developmen setup. Deploying staging debugging staging slower harder doing same thing locally. Logging (and filtering) likely important. Solving exceptiona problems solve these problems quickly efficientl problem makes hard? Let\u2019s examine makes problem difficult solve: Iteration cycles slow - can\u2019t test locally, deploy staging takes time. problem occurs \u2018high friction\u2019 environmen - difficult dig around figure what\u2019s really going hidden below different layers abstractio remote machine limited access via web browser. able dig investigat quickly easily same tools writing testing locally. taken great efforts local developmen environmen this, stressful switch different limited tools. problem result several things interactin once, can\u2019t just test things time. These things probably very similar abstractio Thinking clearly, learning, buidling, solving problems, rely able separate untangle seemingly complex situation component parts figure causes what. can\u2019t isolate individual concerns components black box keeping ignorant. web developmen customized logging usually way isolating exploring particular components Having said that, think best way solve problem prevent occurring first place, I\u2019m enough figure that, yet.on timescale? Life long, does really matter takes week month learn something meaningful Momentum, having fun, important though. \u21a9from personal growth point view. suppose employers point problems solved fast, problems. \u21a9Open right file, google right query (and follow link stack overflow), changes, run static checker linter, run tests, push. Done next item. \u21a9which totally fine. just mental model, map territory \u21a9"},{"title":"Why I Want To Write\u00a0Regularly","url":"why-i-want-to-write-regularly.html","body":"started writing frequently often thoughts I\u2019d explore develop further rarely do. Writing forces organise thoughts look substantia really are, aren\u2019t. truth saying \u201cto know thing able teach it\u201d , writing well several similariti teaching. really copy collection thoughts head yours? Powerful ideas resilient consequenc older believe ideas matter2. subtle consequenc first dominos. expect writing regularly become permanent habit - doesn\u2019t be. focus awhile become significan better. skill too benefits ignored. blogs remember focussed unapologet priorities lot text focus design. easy read content spend attention header images styling. Before redesigned blog had default settings asked supply image post, summary, suggested tweet. None necessary whilst tried blog better ended making harder write. These peripheral features added complexity distracted thing. They\u2019re still default anymore. They\u2019ve moved background forget exist that\u2019s OK - just shows weren\u2019t important practice thought be. probably just having fun adding features working build them. Ain\u2019t Gonna It, mate.Wikip article, external validation \u21a9A compliment notion asking right question important finding right answer. guess asking right question always necessary, finding right answer sometimes sufficient Sometimes answer bit wrong asked right question, still enough benefits avoid problem. \u21a9"},{"title":"Python: Becoming A Better Python\u00a0Developer","url":"becoming-a-better-python-developer.html","body":"subscribed Aaron Maxwell\u2019s \u201cPowerful Python\u201d newsletter over year really it. His emails opinionate candid, singularly focussed. He seems passionate he does like\u00a0that. Ultimately emails designed drive sign-ups his courses suspect very good, lot free emails. Thanks Aaron. realised emails sequential subscriber gets same sequence messages regardless signed up. \u2018first\u2019 message, \u2018second\u2019, kind progress and\u00a0flow. means benefits paying attention usual email subscripti Even though emails arrive I\u2019m supermarke making dinner kids, try read After subscribed several months, unsubscrib resubscrib Now know reliable high quality advice I\u2019m going prioritise working through examples doing missed first time. gone back beginning reinforce parts know try again eluded first\u00a0time Three kinds practice projects become web app - Django know framework user. Done\u00a0this. command tool - argparse module, standard library. Haven\u2019t done yet, guess now start. seems simplest quickest three kinds project, see useful - lets app different contexts, outside python eco-system anywhere command tools machine learning - already studied this, theory (numpy) frameworks (tensorflo I\u2019m happy see it\u2019s\u00a0inclu"},{"title":"Using Vim with large\u00a0codebases","url":"vim-for-large-projects.html","body":"Vim text editor IDE. free, open source customizab Below useful plugins features started year building Moneybar learning use\u00a0Django There\u2019s copy .vimrc the\u00a0end. I\u2019m happy invest effort learning Vim plugins. I\u2019m confident I\u2019ll still twenty years from\u00a0now. Filetype plugins - settings active particular filetypes, .py (python) .txt (text) Vim look opens correspond type. formatting options length, tab spaces, vim commands can\u2019t activate plugins these files though. plugins activated .vimrc usual\u00a0way. - plugin lets runs tests without leaving vim. run test that\u2019s nearest cursor, tests current buffer. very customizab wish bit faster, probably improve myself changing some\u00a0setti - incredible Asyncronou Linting Engine (A.L.E) applies fixers linters various filetypes, want. Super useful writing tidy catching mistakes before is\u00a0run. junegunn/f - took little getting first, now can\u2019t imagine tool (this said vim-relate things). fzf switch open buffers, open file, search files filename, search within files project specific\u00a0t - plugin opens sidebar contains list functions classes methods (tags). see methods class contains, jump part where tag is\u00a0defined .vimrc during January\u00a020 \" ========== Global ========== nocompatib \" always put top .vimrc. effects mappings, undo, etc. encoding=u \" utf-8 encoding termguicol t_Co=256 \" colors noerrorbel vb t_vb= \" no error bells, yes screnflash linespace= scrolloff= \" minimum screen lines above below cursor shortmess- \" show times search result occurs current buffer, index current match hidden relativenu \" numbers splitbelow splitright \" tabstop=8 softtabsto expandtab shiftwidth smarttab undofile \" Maintain undo history sessions \" put undo files dir filetype \" enables filetype detection filetype plugin indent \" detection on, plugin on, indent on. see current status, type: :filetype syntax \" syntax highlighti - try 'syntax on/enable' noesckeys \" might break stuff, delay smaller timeoutlen \" timeoutlen mapping delays ttimeoutle \" ttimeoutle delays incsearch ignorecase smartcase hlsearch highlight Search guibg=purp guifg='NON highlight Search cterm=none ctermbg=gr ctermfg=bl highlight CursorColu guibg=blue guifg=red highlight CursorColu ctermbg=re ctermfg=bl nnoremap // nnoremap # #`` nnoremap * *`` \" close buffers properly go previous buffer, delete just in. nnoremap bd :bp\\|bd # inoremap bd :bp\\|bd # \" Spell check spelllang= nnoremap ss :setlocal spell! nnoremap sf z=1f :call Flash() ve :e $MYVIMRC vr :so $MYVIMRC \"+y \" copy system clipboard \" X11 support endif endif \" Go mode inoremap jk \" working directory nnoremap pw :cd %:p:h \" toggle wrap nnoremap lw :set nowrap!ln :set \" Insert current datetime nnoremap dt ()hh \" map w ` nnoremap ` w \" Swap : ; nnoremap ; : nnoremap : ; vnoremap ; : vnoremap : ; \" Navigation & movemement \" save changed nnoremap ww :update \" save changes nnoremap wa :wa \" close nnoremap qq :bp\\|bd # nnoremap wq # \" switch buffers nnoremap + :bn nnoremap _ :bp \" Split navigation nmap h nmap j nmap k nmap l nmap ww nmap wq \" split (pane) resize nnoremap :resize +2 nnoremap :resize -2 nnoremap :vertical resize +2 nnoremap :vertical resize -2 \" open help vertical split default cabbrev vhelp vert help \" Natural cursor movement over wrapped lines nnoremap j gj nnoremap k gk \" Insert blank lines mode nnoremap o ok nnoremap O Oj \"========= PLUGINS ========== call \" numbers text objects Plug \"run shell commands async vim8\" Plug = \" :python :!python, access packages venv \" \" Plug \" force quickfix full widtth au FileType qf wincmd J \" testing - languages test runners Plug test#strat = = 'pytest' = '-x' = \"belowrigh nnoremap tn nnoremap tf :TestFile< nnoremap ts :TestSuite nnoremap tl :TestLast< nnoremap tg :TestVisit \" toggle quickfix window function! copen 15 setlocal else cclose endif endfunctio nnoremap cc :call \" generates index (or tag) language objects found source files \" jump definition \" jump back \" g] see list multiple matches \" Plug \" (re)genera tags bg Plug = ['.json', \" sidebar displays tags current file, ordered scope Plug nnoremap nnoremap \" add python library tags file, goto def pyEnvLib = $VIRTUAL_E pyEnvLib .= \" Async linting engine Plug = = \" ALE completion = = nnoremap at :ALEToggle nnoremap af :ALEFix aj :ALENext ak \" iSort Plug \" track snippets engine Plug \" Snippets separated engine. Add them: Plug \" Trigger configurat \" :UltiSnips split window. \" Plug Plug Plug nnoremap x :YcmComple GoTo \" subcommand add entries Vim's 'jumplist' \" 'CTRL-O' jump back where before invoking command (and \" 'CTRL-I' jump forward; see ':h jumplist' details) = = = = = = = \" autoclose parens, brackets etc \" Plug \" vim-tmux focus events Plug \" folding \" Plug \" match m \" Plug \" adds vertical lines easily show indent levels Plug \" Fugitive Plug \" Marks Plug \" Latex Vimtex Plug g:tex_flav = 'latex' autocmd Filetype tex updatetime = 'open -a Preview' = \\'specifie changed to'.\"\\n\". \\'You \\'Missing number, treated zero.'.\"\\n \\'There undefined \\'Citation %.%# \\'Double space found.'.\"\\ = 8 \" Rainbow parenthesi blacklist = ['html', 'md', 'wiki'] autocmd BufWritePr * &ft) < | Plug = g:rainbow_ = { \\'guifgs': ['green', 'magenta1' 'gold', 'red', \\'guis': \\} \" scheme. Plug \" colorschem colorschem badwolf = = = \" colorschem modificati highlight Comment ctermfg=cy guifg=cyan highlight pythonComm ctermfg=cy guifg=cyan highlight LineNr ctermfg=cy guifg=cyan hi nontext term=bold ctermfg=Cy guifg=#80a gui=bold hi vimLineCom term=bold ctermfg=Cy guifg=#80a gui=bold \" SpecialKey - :set list toggle visibility EOL, CR, etc hi specialKey term=bold ctermfg=Cy guifg=#80a gui=bold \" colors flashing cursorline cursorcolu hi CursorLine cterm=NONE ctermbg=gr ctermfg=bl guibg=gree guifg=blac hi CursorColu cterm=NONE ctermbg=gr ctermfg=bl guibg=gree guifg=blac \" query kind syntax color? - wc nnoremap wc :echo \"hi<\" . . '> trans<' . .\"> lo<\" . . \">\" \" fuzzy file, buffer, tag finder \" ensure latest version Plug { 'do': { -> fzf#instal } } Plug nnoremap e :Files nnoremap r :Buffers t :Tags nnoremap ff :Rg \" nnoremap ff :Ag nnoremap la :BLines ll :Lines nnoremap ' :Marks nnoremap fh :Helptags< nnoremap fs :Snippets< nnoremap fc :Commits fb :BCommits< nnoremap hh :History h: :History:< nnoremap h/ :History/< \" = --info=inl \" --files --hidden\" = g:fzf_layo = { 'down': '~50%' } \" = = 'right:0%' function! joined_lin = join(a:lin \"\\n\") len(a:line > joined_lin .= \"\\n\" endif @+ = joined_lin endfunctio g:fzf_acti = { \\ 'ctrl-t': 'tab split', \\ 'ctrl-x': 'split', \\ 'ctrl-v': 'vsplit', \\ 'ctrl-o': \\ } g:fzf_colo = \\ { 'fg': ['fg', 'Normal'], \\ 'bg': ['bg', 'Normal'], \\ 'hl': ['fg', 'Comment'] \\ 'fg+': ['fg', 'CursorLin 'Normal'], \\ 'bg+': ['bg', 'CursorLin \\ 'hl+': ['fg', 'Statement \\ 'info': ['fg', 'PreProc'] \\ 'prompt': ['fg', \\ 'pointer': ['fg', 'Exception \\ 'marker': ['fg', 'Keyword'] \\ 'spinner': ['fg', 'Label'], \\ 'header': ['fg', 'Comment'] } \" grep vim - shows results split window Plug \" session tracking Plug \" pairs handy bracket mapping Plug \" Plug \" repeat commands plugin mappings Plug \" vinegar Plug = \" CSV Plug \" nerdtree Plug nnoremap n = \" Automatica delete just deleted \" - open nerdtree directory given startup argument \" always focus window after startup \" Status bars Plug Plug = = = \" remove encoding status = = = = = = = = = = = \" comments Plug = = = 'left' = = \" markdown. tabular required Plug Plug = ['python=p = = = = g:tex_conc = \"\" = = 4 = \" writing prose Plug Plug augroup pencil autocmd! autocmd FileType wiki,md,tx call pencil#ini autocmd FileType wiki,md,tx :PencilSof augroup END = 'soft' autocmd! User GoyoEnter autocmd! User GoyoLeave \" Ensure :q quit even Goyo active function! s:goyo_ent b:quitting = = autocmd QuitPre b:quitting = cabbrev q! = q! setlocal wrap endfunctio \" Quit Vim remaining function! s:goyo_lea b:quitting && bufnr('$') == qa! else qa endif endif endfunctio autocmd! User GoyoEnter call autocmd! User GoyoLeave call nnoremap g :Goyo \" python linting \" F7 checks flake8 Plug Plug \"Flagging Unnecessar Whitespace highlight BadWhitesp ctermbg=re guibg=dark Plug = ['latex', 'html'] = = [] \" javaScript Plug = = \" format .JSON files jq cli tool com! JQ %!jq \" HTML/JINJA Plug Plug \" Plug = \"*.html, *.xhtml, *.phtml\" call plug#end()"},{"title":"Using RSS","url":"using-rss.html","body":"Updated: Feb 2021 found blog post surprising similar thoughts RSS feeds, better presented thought through. post mentions idea \u201cRSS capturing long tail blogs post frequently 1. idea crystalise why glad I\u2019d started RSS feeds again. readers RSS, authors concern themselves attention. removes pressure author post frequently lets focus quality over quantity. News feeds ad supported platforms fundamenta different mechanics incentives RSS quality content come me, own schedule. remember look it, authors remind exist. Google Reader RSS very effective way having quality informatio come you. Back 2008, Google Reader subscribe RSS feeds. aspiring photograph back remember subscribed around 80 blogs. I\u2019d read articles whoever had posted something new, without needing visit websites remember who I\u2019d subscribed blog. authors didn\u2019t optimize output according opaque changing algorithm either - didn\u2019t optimize article length, tags, post frequency, image inclusion linked content. write wanted to, suspect leads higher quality content. Social Media few years later Google Reader closed down, presumably RSS didn\u2019t fit Googles advertisin model. unaware imagine sent shockwaves through blogging communitie probably upended businesses mostly stopped reading blogs. Facebook growing fast, Instagram felt exciting, content moving onto \u2018platforms walled gardens. kept growing average quality content decreased. Twitter now think. real diamonds found time, there\u2019s lot mud too. Mostly just mud, occasional diamond outsized benefits. RSS isn\u2019t this. choose contents \u2018news feed\u2019, article longer Tweet, caption photo, status update. hard write well interestin useful blog post, makes harder dilute quality entertaini distractio complete control content see, change whenever want. process designed around me. Reeder5 netNewsWir few weeks, couldn\u2019t sync laptop phone, bought Reeder 5. got few unusual design patterns, works well features want. unsubscrib email newsletter subscribin RSS feed instead. keeps inbox quieter, feels \u2018separatio concerns\u2019. makes easier read interestin content without \u21a9"},{"title":"Notes on learning\u00a0Django","url":"learning-to-django.html","body":"Table Contents the\u00a0beginn personal best moments Adding unique identifier existing Testing\u00a0co the\u00a0beginn came web developmen via business analytics. working accountant Excel wasn\u2019t enough anymore, looked around way started came across Jupyter Notebooks. Notebooks said kind \u201cgateway drug\u201d programmin think that\u2019s true. They\u2019re easiest fastest way start programmin come\u00a0acros you\u2019re working notebook, easy data, wrangle it, show results. soon chart summary table inevitably wonder show people easily, publishing results website feels best general Unfortunat hardest, begins long series compromise incrementa progress. Learn dashboardi API, learn static sites. end-goal, ultimate solution, driven web app, saved user preference scalable performanc automatica updated data\u00a0sourc personal moved Netherland wanted personal finances dashboard check weekly expenses. wasn\u2019t web-app (though couple apps trying) built own dashboard. few friends asked too. couldn\u2019t just dashboard web app, thought reason jump bigger task anticipate (And that\u2019s OK.) took several attempts super frustratin dabble few weeks, few tutorials, completely lost tried something myself. I\u2019d disorienta working across different files trying visualise part model, cycle currently working\u00a0on came realisea mental load seems large beginning really whole stack technologi abstractio combined (or stacked) together. these together same before see any evidence success all. think hardest things Django actually Django. You\u2019ll comfortabl classes inheritanc You\u2019ll comfortabl working across multiple files, tools searching across open buffers, files project, same time. You\u2019ll comfortabl version control (Git) command line. familiar stack traces\u00a0too you\u2019re familiar enough these things, doesn\u2019t feel new, ideally feels familiar comfortabl think you\u2019ll quite quick progress with\u00a0Djang Django uses model. Models django maps Python objects items database (oh yeah, familiar SQL too\u2026), Views where requests processed (also Middleware turned Responses, combined templates (unless building API). might notice haven\u2019t mentioned Controller - informatio feeling incomplete whilst you\u2019re learning ropes. It\u2019ll become clear soon\u00a0enoug best\u00a0momen \u2018curse knowledge\u2019 states once you\u2019ve learnt something can\u2019t imagine remember know it. Before happens completely record \u2018ahah!\u2019 moments context, stopped working freelance scientist April after few weeks wondering django PostgreSQL python way go (yes is. boring technology began working full-time become MoneyBar.n called \u2018myeuros\u2019 the\u00a0beginn learning curve felt steep. wanted things \u201cright\u201d first wasn\u2019t building toy, although felt hindsight show mistake terms efficiency did anyway hunch following compulsion sometimes makes life harder short term better long\u00a0term. best moments usually preceded Adding unique identifier existing pydanny\u2019s template. Honestly, I\u2019d gone through quickstart process googled nouns questions (what Sentry, Celery task que, whitenoise etc.) already tired. Play few times come back to\u00a0it. Anyway, wanted start project template part kind rnuning box. uses Django Allauth package, awesome, reliable, fully featured\u2026 extremely abstracted luck looking module understand youre an\u00a0expert. wanted give user unique ID - UUID signed up. query strings instead usernames incrementa keys. hard first time! turns trivial task, already few users (test) database. Sure reset database start again, experiment fairly complex. Understand python classes (the ORM) maps relations PostgreSQL databse complex, got confused, try fix changing python Models, editing migrations working database directly? Getting started After I\u2019d figured started creating models simpler (transacti bank accounts expect). simpler faster. remember driving home evening thinking far success Testing\u00a0co Before long, testing part app hand added changed feature no longer trivial. needed find way automatica creating users checking log access\u00a0vie began working pytest, really found hard wrap head around idea accessing different parts app requests responses accessing class think limit knowledge, where know just enough thing \u201cwork\u201d. approach falters test wrote. least, measure \u201cjust enough\u201d really changes require tests written. just work, understand why works, write tests assert certain conditions pass others\u00a0fai feels really satisfying works, proof really grasped bigger picture. far fewer (relevant) black boxes write tests. makes learning slower, least short term. means might two comfortabl handful abstractio you\u2019ve already solved problem started with. frustratin takes discipline slow down, take deeper look solution, just race next\u00a0featu"},{"title":"Data Science vs Web Development: Larger Code\u00a0Bases","url":"larger-code-bases.html","body":"Code\u00a0Struc immediate basic difference working scientist web developer files codebase spread across amount within each\u00a0file. Web applicatio tend very modular - lot different things going modern web app generally able modified updated independen other. requiremen encourages modular base architectu broken down working science project often well defined quite narrow pipe line. stage pipeline well defined inputs and\u00a0output seems consequenc making science projects tend towards handful files substantia amount unique (not boilerplat code. web developmen seems boilerplat files spread across tree directorie average lines per IDE\u00a0featur These difference mean organizati tools IDE features play very different roles within industry. web developmen really able jump different files (or buffers) quickly, search text across multiple files. Writing idiomatica becomes important, writing within discreet testable units becomes essential things break without being\u00a0noti science, linting feels optional, searching text within methods functions outside current module is\u00a0rarer. didn\u2019t appreciate until paused Scientist began building non-trivia web\u00a0apps."},{"title":"TDD: Test Driven\u00a0Development","url":"test-driven-development.html","body":"Test Driven Developmen mind-bendi first grappled it. Last summer building web app Django began break things adding features. soon led lots clicking around different pages test stuff still working made update. soon led thinking better way. brought Test Driven Developmen (TDD). just led writing tests, did. googling whatever googled got down TDD rabbit hole rather just \u201cwrite tests\u201d rabbit hole. Write tests before write code. Write tests bugs you\u2019ve fixed check stay fixed. Write tests kind documentat show stuff supposed doing. Errr\u2026 Django big enough pile abstractio was. Views, ORMs, mixins, serializer Trying add factories fixtures took getting to. eventually made progress, now quite enjoy running coverage reports keep coverage close 100%1. things learnt writing tests: PyTest possible rather testing libraries - assert statements intuitive Django\u2019s own testing framework, any Python codebase, just Django. lots extensions seems getting job done fairly easily. Write tests go. haven\u2019t (yet) reached elevated level writing tests before write tested, though see why sometimes useful. think writing tests sooner rather later best though, ideally soon you\u2019ve got basic version feature working. Coverage show covered tests, branches edge cases not. warned, doesn\u2019t tell test useful not, passes methods functions uses. Fixtures great keeping tests fairly DRY. Freezegun great testing anything dates times. Static checkers, Mypy, attractive proportion codebase complexity size. fun all, testing sake doesn\u2019t necessaril stop bad things happening. very possible write test covers you\u2019ve just written without ensuring intended behaviours happen. \u21a9"},{"title":"Why Talk About\u00a0Jesus?","url":"faith-in-jesus.html","body":"Start happiness seems am happier Christian weren\u2019t. \u201cbeing Christian\u201d mean following Jesus - trying best act, think speak he want\u2019s I\u2019m grateful he did believe he did. believe he died sins now alive, having miraculous resurrecte his father1 (who now father too). just intellectu exercise. believe Jesus alive seem experience his companions interventi day-to-day life. unusual, mind boggling, makes things significan complicate thought he dead. Nonetheles seems true. see supernatur interventi every anything, various times - too discard - prayers answered practical ways (I\u2019ll leave intangible now) surprised given lot respect risen Jesus doing said he\u2019d bible. Obvious answers Yemen trying back room across town, night during storm. lost couldn\u2019t read Arabic understand bus get. prayed, two buses later got off right stop. Another example, getting haircut Liverpool Street Station London, sitting chair someone took bag. came pay, realised laptop wallet had gone. Trying find stolen bag central London feels ridiculous Even so, spent few hours wondering around alleys parks looking it, resigned myself awkward conversati next salary replace stolen computer. surprise, parents-in prayed really confident come back me, seemed super unlikely. few days later received call office worker Gherkin building - bag under his desk he wanted know I\u2019d collect it. guess I\u2019ll try same mistake twice. example tend remember happened long after I\u2019d first moved Vienna. feeling lonely isolated wondering earth going find sort healthy sustainabl Try might, wasn\u2019t enjoying things feeling stressed overwhelme remember walking steep hill 18th district towards office, repeatedly praying really simple prayer \u2018God, please help, please help, please help..\u2019. simple couldn\u2019t think anything useful say. Nothing dramatic happened day, even week far remember. look back, turning point things started getting better instead worse. suppose call last example intangible answer prayer. Maybe is, think anyone whose grappled overwhelmi loneliness panic say emotions become too tangible times. different emotional state seemed tangible difference just every area life. Eating, productivi work, relationsh friends colleagues etc. beginning why think Jesus alive why think Christiani real living faith. primarily tradition, worldview rules ideals. Christiani relationsh Jesus. He did lots amazing things very practical relationsh him. almost unbelievab premise live life. implicatio holds scrutiny experience bear out. Why write this? Despite Jesus\u2019 incredible works implicatio modern Christiani seems really confused ineffectiv state. Ideas thoughts become mixed cultural christiani christian politics traditions These different things, unless distinguis words use, going find hard think communicat clearly. suspect negative cycle imprecise thinking leading imprecise articulati leads further imprecise thinking. Unless talk think thing time, atomically necessary, take additional risks reaching wrong conclusion personally arguing others due rather actual disagreeme try precise vocabulary navigate our Christian lives, think clearly experience questions have. Imprecise thinking frustratin conversati less effective there\u2019s increased risk disagreeme someone else means. makes harder talk our faith, makes talking less common, creates room apathy, missed opportunit sadness.An things also. \u21a9from first principals \u21a9"},{"title":"API Design\u00a0Principles","url":"api-design.html","body":"super brief notes made API\u00a0design Background art a\u00a0science RESTful State Transfer) API design Alternativ API architectu SOAP (Simple Object Access Protocol) heavier\u00a0st GraphQL - doesnt overfetch. Graph query language made by\u00a0Faceboo APIs everywhere (not just web APIs). They\u2019re abstractio hides Django managers API (and part Django\u2019s ORM), JavaScript API,\u00a0etc. RESTful\u00a0AP Web APIs (all REST APIs?) expose databases to\u00a0clients rest api URL route (endpoint) returns JSON XML. POST, GET, PUT, PATCH, DELETE, correspond Create, Read, Update/Mod Delete (HTTP methods correspond CRUD\u00a0metho HTTP METHODS: PUT (create update) idempotent POST idempotent (keep PATCH - partial\u00a0up GET, HEAD, OPTIONS TRACE methods idempotent cos designed DELETE HEAD - almost identical GET, without any body. checking request return, i.e. Before downloadin large amount of\u00a0data, OPTIONS - returns describing methods operations server supports given URL. loosely defined other\u00a0verb HTTP verbs requests sensible resource names. Naming things hard, think bit before starting. identifier URLs, query string. Good: /users/123 Poor: hierarchic structure URL imply structure API. Design (names structure things) user/clien database. Resource names nouns not\u00a0verbs plurals consistent collection verbiage. Good: customers/ camel case snake Short better long, be\u00a0clear Spend design before writing\u00a0co HTTP response codes Prefer JSON over XML. (Hotline does HTML..) XML requires schemas validation namespaces support complexity beginning (or ever) unless required. required, XML similar JSON as\u00a0possibl Put links HTTP link header, JSON representa of\u00a0this. HTTP location header contain link resource creation, pagination first, last, next,\u00a0prev Connectedn - links response link useful resources. minimum, link show received, or\u00a0posted. Idempotenc - clients making same repeated requests same result server side. I.e. making repeated requests same result making similar request, server side. client side, response may change, of\u00a0course."},{"title":"Principles Of Object Orientated\u00a0Programming","url":"principles-of-oop.html","body":"recently interviewe lead developer role Lab Digital1 thought sensible review fundamenta aspects Object Orientated Programmin (OOP). might think that\u2019s unusual way prepare interview, you\u2019d right. Nothing close these notes arose during interview, find stuff interestin I\u2019m motivated enough study it, think that\u2019s enough reason itself, without specific reason. These brief notes. Object Orientated Programmin four aspects: Encapsulat (Hiding informatio Abstractio (Hiding Inheritanc Polymorphi 1. Encapsulat object keeps state private, inside class. Instance kept private accessor methods made public. objects direct access state. call list public functions (methods). object manages own state via methods, no class touch unless explicitly (not default) allowed. Private variables. Public methods. classes within classes, functions within functions. 2. Abstractio natural extension encapsulat concept idea associated any particular instance. Expresses intent class, rather specific Programs often extremely large separate objects communicat lot. makes maintainin large programs difficult, abstractio tries solve this. Applying abstractio means object expose high-level mechanism it. mechanism hide internal implementa details. reveal operations relevant objects. mechanism easy rarely change over time. Implementa changes \u2014 example, software update \u2014 rarely affect abstractio use. e.g. coffee machine. does lot stuff makes quirky noises under hood. put coffee press button. 3. Inheritanc OOP, objects often similar, sharing similar logic. 100% same. (child) class deriving another (parent) class. way, form hierarchy. child class reuses fields methods parent class (common part) implement own unique part method attribute overloadin 4. Polymorphi Gives way class exactly parent there\u2019s no confusion mixing types. child class keeps own methods are. typically happens defining (parent) interface reused. outlines bunch common methods. Then, child class implements own version these methods. Any collection (such list) method expects instance parent (where common methods outlined), language takes care evaluating right implementa common method \u2014 regardless child passed. I\u2019d familiar following features without referring notes: Getters setters. Instance methods compared class methods. Inheritanc mixins, decorators \u201cmagic\u201d within Django source requires mypy extensions order static checking correctly. Unfortunat didn\u2019t job. wanted senior Python developer experience Infrastruc Code, working agency. Can\u2019t win all. \u21a9"},{"title":"Optimizing The Performance Of This\u00a0Blog","url":"site-performance.html","body":"I\u2019m coming end redesignin site. Now changes made fun (and practice) optimize site loads quickly optimized SEO Lighthouse utility built Chrome runs technical audit webpage assesses wide range features. provides details improve the\u00a0page. site hosted Github Pages accessed via Cloudflare gives lot performanc gains including minified HTML CSS, caching, super fast server I\u2019m Github Pages Cloudflare free think amazing benefits these services without needed pay anything. someone knows where look teach themselves free resources, read anyone anywhere world. It\u2019s\u00a0amazi Below lighthouse results blog\u2019s index page recent\u00a0pos"},{"title":"Unix: Utilities To Analyse And Update Multiple Text\u00a0Files","url":"using-unix-utilities-to-analyse-and-update-multiple-files.html","body":"part redesign blog wanted article\u2019s category meaningful Previously simply picked handful categories assigned single category post. method becomes limiting article relevant Also, nested categories seems way grouping similar content allowing nuanced filtering of\u00a0interes considered update categories existing articles, realised opportunit practice analyzing updating text files Here reviewed updated categories Pelican generate static files site. converts markdown HTML. Metadata article beginning file, title typing Title: ... similarly category typing Category: ... own\u00a0line. locate, analyse update existing categories therefore find markdown files row begins Category: grep -h \u2018Category: **/*.md - prints search\u00a0res grep -h \u2018Category: **/*.md | sort - prints sorts search\u00a0res grep -h \u2018Category: **/*.md | sort | uniq -c prints sorts search result, counts occurrence unique result there\u00a0are. had repeat results though rows had white space end, order these same, needed remove grep -h 'Category: **/*.md | sed | sort | uniq -c gave 6 Category: Category:D 16 15 15 8 Category:T Category repeated isn\u2019t\u00a0need grep -h 'Category: **/*.md | sed | sort | uniq -c | sort | sed gives following output, is\u00a0accepta Engineerin Front-end 6 8 Tools 15 General 15 Startups 16 New\u00a0Catego next stage begin updating these categories new, nested categories decided try splitting categories technical imagine splitting Technical > even future, perhaps having Analytics, Science, Engineerin Technical Web Cryptocurr technical Family Self Career cd directory containing markdown files, change articles Category: Tools Category: Tools I\u00a0did: grep -l 'Category: Tools' *.md | xargs sed -i 's/Categor Tools/g' see list files containing Category: General: grep -H 'Category: General' *.md see just names,\u00a0the grep -l 'Category: General' *.md Update Since writing post modified categories few times. commands run switch categories as\u00a0follows export export newName=Li grep -l \"Category: | xargs sed -i Notes: Double quotes same single quotes. access variables commands inside a\u00a0string. .* wildcard operator allowing any characters required article belongs"},{"title":"A New Blog\u00a0Design","url":"a-new-blog-design.html","body":"blog design! old, well-writt HTML, improved CSS framework, maintainab code, dark mode, articles website first ever project HTML CSS, codebase original blog terrible. poorly written hard maintain. remember first building trying figure
really\u00a0was times felt little monkey randomly bashing keys, hitting save refreshing browser tab. felt guilty spending any non-essent away wife daughter. wondered any benefits actually materializ outweigh costs rushing home take care new-born relieve tired stressed\u00a0m took awhile, eventually blog became effective force multiplier ever\u00a0used. learnt web developmen JAM stack become increasing intuitive familiar. side effect became comfortabl \u201cgood\u201d dev work, working blog\u2019s old base became increasing uncomforta wanted update blog easy fun again. able play quickly wasn\u2019t aiming radical re-design, focus text I\u2019m exploring any on-trend design choices. think original design choices held well. design years, templates easy intuitive read, design elements easier work\u00a0with. hope I\u2019ll writing here regularly over next few months. busy year lots write\u00a0abou"},{"title":"Product-Led\u00a0Growth","url":"product-led-growth.html","body":"Part 1: Design your\u00a0strat Chapter 1: Why product-le growth Product-Le Growth go-to-mark (GTM) strategy relies product vehicle acquire, activate Product-Le Growth (PLG) means every team influences product: Marketing - our products generate Sales - product qualify our prospects for\u00a0us? Customer Success - product helps customers become successful beyond our\u00a0dreams having every team focussed product, culture built around enduring customer\u00a0v leading product throughout org, PL companies shorter sales\u00a0cycl lower Customer Acquisitio Costs\u00a0(CAC higher Revenue Per Employee (RPE) GTM strategy action plan specifies company reach target customers achieve order select GTM, first understand ideal\u00a0cust Knowing these elements help choose correct GTM acquire, retain grow customer base Sales-Led Profit Centers: Sales, Marketing, Cost Centers: Advantages Annual Contract (ACV) very\u00a0high Enterprise first solutions very complex therefore high-touch sales\u00a0mode Total Addressabl Market (TAM) very small, market super niche, quite easily talk almost market participan (PLG built large\u00a0TAMs great categories product where education required, change people approach problem. takes turn requires understand customers pain points, objections core problems. jump quickly PLG GTM strategy risk high church rate haven\u2019t understood educated customers well\u00a0enoug Disadvanta Sales cycles very\u00a0long Life (LTV) high enough recoup investment CAC. often requires charging customer premium. premium price isn\u2019t product amazing, valuable customer, customer acquisitio Sales-Led GTM, watch competitor who sell efficientl efficient Customer Acquisitio Model. steal market share offering same product lower\u00a0pric Customer Acquisitio methods super leaky. leads (MQLs) never result closed deal, partly because: encourages markets gate content order hit MQL\u00a0goals focusses content consumptio leading indicator intent. (but reading white-pape brochure doesn\u2019t mean I\u2019m going buy the\u00a0thing) entire process rewards creating friction buying\u00a0pro Consequent often disconnect marketing and\u00a0sales Product-Le Switching Sales-Led GTM Product-Le GTM creates defensive\u00a0 product led marketing team asks \u201cHow product qualify our prospects for\u00a0us?\u201d product led customer success team asks \u201cHow product helps customers successful without our\u00a0help?\u201d product-le engineerin team asks \u201cHow product Growth faster, because: fewer resources to\u00a0scale, top customer funnel much\u00a0wider CAC much\u00a0lower Higher RPE (revenue per\u00a0employ User experience is\u00a0better Chapter - Free, Freemium or\u00a0Demo MOAT framework pick right GTM\u00a0strate Market Strategy - Dominant? Ocean Conditions - Blue or\u00a0Red? Audience - top-down bottom-up - customer experience the\u00a0value? Dominant - better competitio charge lower\u00a0pric TAM big\u00a0enough Does product solve specific job significan better lower cost anyone else the\u00a0market user realize significan ongoing quickly little no\u00a0help? undisputed market\u00a0lea Differenti - Pick win fight against industry giant defense against giant Focus specific job better competitio charge Free trials demos well\u00a0here. specialize combining freemium quick time-to-va is\u00a0difficu competitiv advantage solve Does market TAM big\u00a0enough ACV high\u00a0enoug prospects experience Magic Moment during free\u00a0trial Disruptive - Charge less inferior product (e.g. Canva, Google docs) Build simpler product solves specific pain point, simpler, faster, charge less, appropriat over-serve Costs be\u00a0low Product easy to\u00a0use TAM large\u00a0enou on-boardin Freemium model\u00a0thri Chapter - Red-Ocean Red-ocean companies try outperform rivals order grab larger share existing market. market gets crowded, opportunit profit growth reduces. Products become commoditie Cut-throat competitio turns waters\u00a0red Blue-ocean companies access untapped market space demand. opportunit highly profitable growth. Competitio irrelevant capture new\u00a0demand markets red-ocean, particular niche within blue\u00a0ocean Blue Oceans require educating customer demand. high-touch often PL GTM strategy isn\u2019t going work. needs sales-led order educate customer enough. Time-To-Va (TTV) short PLG be\u00a0great. Red Oceans big wide funnels order compete, PL GTM strategies great. They\u2019re defensible keep costs low sales cycles\u00a0sho Chapter 4 - Top-Down Bottom-Up PLG works for\u00a0bottom High touch sales-led strategies Top-Down enterprise sales strategies where product super complex sales cyccle very\u00a0long. Top-Down (Sales team High ACV Lower customer\u00a0c Poor High CAC Long sales\u00a0cycl Free Trial Bottom-Up (Product Low CAC Predictabl sales\u00a0figu Scalable\u00a0f Small contracts\u00a0 upfront investment non-paying customers Freemium Free-Trial Chapter 5 until deliver promise to\u00a0prospec until product sells\u00a0itse PL GTM strategies require Rank uses across dimensions group 4 quadrants. dimensions Ability (low - high) Motivation (low - high) Low Motivation - Low Ability = High Motivation - Low Ability =\u00a0Rookie Low Motivation - High Ability =\u00a0Veteran High Motivation - High Ability =\u00a0Spoiled Figure top two quadrants. Unless users Spoiled, Questions: motivated your\u00a0users product easy target audience to\u00a0use? users experience core (magic moment?) Part - Build Chapter 7 - Build positive feedback\u00a0l Understand your\u00a0value Communicat Deliver your\u00a0promi Repeat Chapter 8 - Understand your\u00a0value you\u2019re selling live-chat software, you\u2019re really selling live-chat software, selling better way selling outcome, result, the\u00a0why. Pain makes us change avoid prevent Pain three reasons why people buy a\u00a0product: Functional Outcome - core task needs get\u00a0done. Emotional Outcome - customer wants feel avoid feeling result Social Outcome - customer wants perceived others your\u00a0produ every software, usage patterns point towards core outcomes important to\u00a0custome biggest difference sales-led product-le companies SL companies monitor usage patters see users accomplish meaningful outcomes. These outcomes referred value-metr value-metr way measure exchange product. linchpin successful execution product-le GTM strategy aligning revenue directly customer acquisitio model. metrics play vital role price product, monitoring build your\u00a0team. metrics could\u00a0be: Vimeo, videos uploaded the\u00a0user. Slack, messages sent the\u00a0user PayPal, amount revenue generated functional outcome based metrics. Functional metrics \u201cper user\u201d \u201cper 100 videos\u201d. Pricing scales around functions usage. Outcome based metrics charge based outcome, e.g. views video received, money customer made payment SaaS companies rely feature way justify higher prices, produces higher\u00a0chu metrics outperform feature upto 75% less\u00a0churn Outcome based metrics reduce church additional metric easy customer understand immediatel understand they\u2019re paying where fit structure. you\u2019re establishe market, makes senses look metric aligned customer receives through product. Consider low-level components high-level outcome. E.g. low level actions necessary end result? Sending lots messages? Meeting lots people? Finding lots of\u00a0things? metric grows customers usage valuable outcome. customers incredible product, charge product worth it. Also, aren\u2019t getting product, charge them\u00a0less. user based pricing lots users - conflict of\u00a0interes you\u2019re small, try different pricing strategies iterate to\u00a0success Ask\u00a0yourse best customers\u00a0 best customers not\u00a0do? features did best customers try first similariti along best customers led to\u00a0success churned customers, difference best customers? ideal audience? Why did church? did"},{"title":"The Mom\u00a0Test","url":"mom-test.html","body":"called Mom Test leads questions even mom couldn\u2019t lie you\u00a0about Overview: Ask good\u00a0quest Avoid bad\u00a0data Keep it\u00a0casual Push commitment Frame meeting\u00a0we Focus right, tight, Prep well, take notes, review your\u00a0notes Chapter - Opinions worthless, objective facts happened the\u00a0past Find people care idea never mentioning Forcing yourself mention idea force ask sure questions pass mom test: Talk lives, idea Ask specifics the\u00a0past, hypothetic Spend listening, not\u00a0talkin Rule thumb: Anything involving future overly optimistic Chapter - Avoid bad - Compliment Fluff, aren\u2019t allowed tell problem is, aren\u2019t allowed tell to\u00a0build. Chapter - Ask terrified least questions ask Search scary questions you\u2019ve avoiding. What\u2019s worst thing prospect say? What\u2019s scariest question could\u00a0ask? way find scary questions imagine company failed ask\u00a0why. unexpected answer questions doesn\u2019t any effect you\u2019re going do, really worth asking\u00a0it? General advice hard things including asking hard questions - imagine delegating task, tel person do? That\u2019s\u00a0you ask about\u00a0mone Love bad news - find idea fundamenta flawed you\u2019ve just saved tonne energy money. Move on. getting closer the\u00a0truth. Bad news isn\u2019t result opinion. No knows idea work, market knows. Opinions don\u2019t\u00a0coun lukewarm response idea great conversati realise idea isn\u2019t great idea. Lukewarm means care enough buy first (worst) version before it\u2019s\u00a0ready Look before zoom. focus details too soon, understand big picture\u00a0fi product risk customer risk: Product risk - build grow\u00a0it? Customer risk - big enough group people who going buy\u00a0it? Pre-plan list important questions (including scary one) before every meeting conversati ready these. change week week. quality answers existing questions bring new\u00a0questi Chapter 4 - Keep casual, Structure: Problem -> Solution ->\u00a0Sales Normally meetings client order big sale. lets stage really well without blurring data: Identify Explain your\u00a0solut Sell the\u00a0soluti Identifyin problem doesn\u2019t meeting, keep casual honest feedback faster. works better a\u00a0chat. take 5 minutes (max) identify problem exists is\u00a0importa Give little info possible idea whilst still nudging Chapter 5 - currencies conversati - Time, early stage sales, goal learning. Money a\u00a0side-eff someone willing risk reputation spend money idea, believe Hearing compliment still useful - means they\u2019re trying rid of\u00a0you bad meeting, push commitment kind. Ask spend time, reputation money you\u2019ll see really\u00a0thi aren\u2019t excited (not just interested pain excited solution) find ASAP. still meeting discover\u00a0t lead isn\u2019t real lead until you\u2019ve given concrete chance reject\u00a0you Ask learning questions Mom Test, confirm selling\u00a0it crazy customers: painful know painful money pay solve\u00a0it already own bad solution terrible problem, yours clearly\u00a0be crazy customer doesn\u2019t say \u201cyeah that\u2019s great, I\u2019m really interested know ready\u201d. say \u201cAHHH WORST PART LIFE PAY RIGHT NOW FIX IT!\u201d crazy customer front money prototype made of\u00a0duct-ta crazy customer person reading blog, searching workaround haven\u2019t spent loads marketing Keep crazy customer close - they\u2019ll stick times are\u00a0tough. Chapter 6 - Finding eep having conversati until stop hearing new\u00a0stuff topic both care about, find excuse. You\u2019ll both enjoy chat. mention idea breaks the\u00a0premis Warm introducti ideal way start conversati 6 degrees freedom world, find someone who knows someone who Cold calls - Serendipit - prepared, be\u00a0bold excuse -\u00a0hustle Landing pages googling problems brings to\u00a0you. Organise event - bring businesses together event. You\u2019ll considered expert cos you\u2019re Become subject matter\u00a0exp Speaking teaching engagement - strong opinions, you\u2019ll be\u00a0respect Vision -> Framing -> Weakness -> Pedestal ->\u00a0Ask Chapter 7 - Choosing you\u00a0custom Startups starve, drown. options, choices, ideas. Choose customer segment, focus it, beginning: Google - PhD\u00a0studen PayPal -\u00a0eBay Evernote - Moms recipes,\u00a0e look obvious hindsight, probably obvious before you\u2019ve figured out\u00a0though can\u2019t consistent answer question, maybe you\u2019re speaking aren\u2019t finding consistent problems goals specific enough customer segment Within group, person the\u00a0most? everyone within group buy/use it? only\u00a0some? Why does subset want\u00a0it? Does everyone group motivation are\u00a0there? Who else (outside group) Go Who-Where pairs segments. \u201cFinance profession who customers who reachable, profitable segments usually \u201cwho-where pairs. know where find customers, keep slicing until do. sure segment reachable, profitable Chapter 8 - Getting conversati prepping and\u00a0review Prepare well big questions ready, including scary\u00a0ones Know who speaking\u00a0t Know commitment next-steps push\u00a0for Spend hour writing down best guesses think say, care want. focussed segment, you\u2019ll Whilst prepping, come across question answered internet, the\u00a0intern Take notes Ask record the\u00a0audio Record emotions well words. Verbatim alone isn\u2019t always accurate 6 months\u00a0lat shorthand follow up, happy, angry, meh,\u00a0etc Pains obstacles lot important someone embarrasse angry they\u2019re talking about\u00a0them Dig big emotions, find what\u2019s causing them, why big\u00a0deal Review notes Meta - questions went well or\u00a0not? answers better next\u00a0time? clear signals? signals did you\u00a0miss?"},{"title":"Obviously\u00a0Awesome","url":"obviously-awesome.html","body":"Intro order better marketing, understand Understand makes Positionin fundamenta input every business tactic you\u00a0use fail positionin fail marketing and\u00a0sales Positionin \u201cconext setting\u201d for\u00a0produc Customers able easily understand product\u00a0do Why is\u00a0special Why matters to\u00a0them prospects can\u2019t figure product does quickly, invent position you. might hide strengths misunderst your\u00a0value Find people demo product to, ask describe back you. same existing customers. they\u2019re saying same thing Products strong positionin Find best kind of\u00a0custome value\u00a0obvi Sell\u00a0quick Part\u00a01 Positionin as\u00a0context Without positionin guide us, know understnad a\u00a0product Positionin lets us assumption who product is\u00a0for features\u00a0a it\u00a0costs Without paralyzed choice, wouldnt able sense products around\u00a0us. context purpose product perspectiv often different those the\u00a0prospe Products positioned multiple ways, often best positionin Bad positionin makes harder prospects figure product worth Positionin requires considerin Customers point - problem/pa does it\u00a0solve ways product best market context Five (plus one) components Competitiv Alternativ - didn\u2019t exist, customers instead? prospects task product didn\u2019t exist. excel, pen paper. nothing, (in case maybe product doesn\u2019t solve real pain\u00a0point probably know lot market, problem, alternativ solutions, prospects do. (\u201cDoing nothing\u201d opportunit red\u00a0flag.) important understand customers compare product with, \u201cbetter\u201d. \u201ceasier\u201d pen and\u00a0paper? Customers might never purchased solution yours\u00a0befo Unique Attributes - alternativ not? be: Delivery (online vs offline, installed on-site vs\u00a0not) Business (rental vs\u00a0purchas Specific expertise (data scientist financial back-end web dev\u00a0expert (and quantifiab objective proof) - attributes enable customers? unique attributes secret sauce, why someone might care secret\u00a0sau Fact based, provable, demonstrab quantifiab objective. Third party opinions are\u00a0releva Target market - Who cares lot value? Focus customers who likely purchase quickly, wont ask discounts, tell friends about\u00a0you. clearly identify who these are\u00a0and Identity sets apart groups customers. Why uniquely likely buy others wouldnt take longer consider a\u00a0purchase Market Category - context makes obvious ideal customer? Declaring product exists certain market triggers powerful of\u00a0assumpt these assumption help you, hinder\u00a0you presented product, customers try already know figure product why special. able really quickly and\u00a0easily these assumption you, against you. won\u2019t list every feature, assumed context right, sales efforts (copy) wont wasted battling those assumption instead build off show secret sauce (Bonus) Relevant Trends - trends product relevant right now? carefully, trends show prospoects why pay attention product right now. increase urgency, excitement trend directly relevant, practicall Blockchain AI, ML trends - relevant these components relevant the\u00a0others"},{"title":"How I learnt to\u00a0code","url":"How-I-learnt-to-code.html","body":"4 years ago started learning code, really difficult! still difficult, now collection tools perspectiv less daunting (more below). Leveling requires abstractio wrap head around, API understand do\u00a0it. think needed difficult, now I\u2019m building School Meta easier learn to\u00a0code. Learning fun, ultimately successful life changing (hello job security!) beginning sooo slow, super\u00a0tric remember feeling imposter, thinking definitely real developer - hadn\u2019t taken any classes computer science. felt knew almost nothing process began Pandas, (the) Python analytics library. Spreadshee slowing down work, bored. found great tutorial Brandon Rhodes. found Jupyter Notebooks, found Github pages blog pelican. led HTML CSS (and JavaScript tried very hard avoid long possible). felt monkey bashing keyboard tried HTML elements I\u00a0wanted. Git next, found amazing tutorial help learn. made Git seem OK, helped HTML CSS sense too.\u00a0Bonus suddenly realized great learning materials crucial going keep momentum keep enjoying thrill seeing computer something hadn\u2019t made do\u00a0before. now I\u2019m now working School: Meta. online community easier teach yourself - less confusion started learn next, encouragem lots high you\u2019d know more, please check sign for\u00a0update"},{"title":"The 1-Page Marketing\u00a0Plan","url":"1-page-marketing-plan.html","body":"Introducti Marketing three\u00a0phas Before (prospect) - people know During (lead) - buy first\u00a0time After (customer) - trust you, buy regularly, and\u00a0refer new\u00a0custom Marketing strategy, things tactics Jargon free definition of\u00a0marketi Advertisin - circus coming town, paint sign saying \u201cCircus coming town on\u00a0Saturda Promotion - Put sign back elephant walk into\u00a0town Publicity - Walk elephant through mayors flower beds newspaper write about\u00a0it Public relations - mayor laugh about\u00a0it Sales - town people go circus, explain fun entertainm is, buy tickets, answer questions, spend lots money food, games,\u00a0sho Marketing plan made whole thing\u00a0happ"},{"title":"Learning to\u00a0market","url":"marketing-101.html","body":"Since April able full solo founder. challenged myself build something useful enough customers pay process seeking goal become better working solo 7 months now, begun test driven developmen built non-trivia driven web apps Django, learnt deploy monitor those apps production made two apps; moneybar.n pippip.ema learnt so\u00a0much. I\u2019m realising though, still learn spheres. great developer deeply meaningful me. literally bucket list item intend writing long live. no point creating products no knows they\u00a0exist where marketing positionin comes in. Right now feels know nothing users, validate idea, position product. These super necessary super\u00a0unkn meta level, I\u2019m confronted lost benefits working co-founder having friends doing similar things. faster progress efficientl part a\u00a0communit Working isolation does advantages though. I\u2019m self-taugh self-direc figuring contours uncharted territory creating own personal map. mind, deep almost personal relationsh coding abstractio tools learnt with. Classes functions, strings floats, literally (to me) own textures, colors weights think dream about\u00a0them feels pick these abstractio physical objects turn around examine them. Place next compare difference Run thought experiemen experience kind relationsh affection simply doesn\u2019t happen taking class following someone elses schedule. satisying feel ownership skill this, primary reasons consider coding similar a\u00a0craft. Having said that, now realise validate product, position it, figure marketing, stopped writing code, put down tools, I\u2019m going learn marketing. bought books. Maybe I\u2019ll post reviews here\u00a0later no particular order here plan to\u00a0read: 1-Page marketing plan, Allan Dib Obviously Awesome, April\u00a0Dunf Lean Analytics, Hooked, build habit-form products, Nir Eyal\u00a0The Mom Test, marketing, Seth\u00a0Godin Product-le growth, Wes\u00a0Bush know covered 90% distance required 50%. exhausting I\u2019m here journey"},{"title":"Pippip.Email","url":"pippip.email.html","body":"PipPip 6 weeks ago had idea product whilst reading news\u00a0artic great writing sending important messages separated, write something long before needed send it, know sending happen right without having think it. useful sending daughter message her 15th birthday, wife our 10th anniversar designed check-in mechanism, messages sent disappeare pass\u00a0away. PipPip result - event-driv scheduled email delivery, days to\u00a0decades We\u2019re working validating idea finding right"},{"title":"Between\u00a0Clients","url":"between-clients.html","body":"end summer had engagement side projects grapple (to me) libraries During August September 2019,\u00a0I: Practiced creating websites Investigat demo\u2019ed - library allows exposing Plotly Dash apps Built personal finance dashboard Plotly Dash began turning web app Django Interviewe role CoinMetric created investigat Created company \u201cAtlas Consulting Internaton facilitate life freelance scientist Spent lot working cafe IKEA co-working space wouldn\u2019t stay late Introduced myself coworking space suggested together best tech-focus startup hub coworking space Bought our first car. required lot research I\u00a0expected Created Texni Consultanc Dan Caputo provide strategy Built website Texni django deployed Heroku custom domain\u00a0nam Deployed django app Google Cloud Platform App Engine. Created business website represent freelance scientist made blog subdomain this\u00a0site. Moved blog off github pages onto firebase. Thanks Github several years simple trouble free\u00a0hosti Experiment storage buckets Google Cloud Platform host static sites serve over SSL. conclusion serving static sites storage buckets great - simple, quick cheap (free). adding SSL proved too difficult. spent too hours trying loadbalanc both root domain johnmathew subdomain end found firebase. Firebase quick cheap (free) simple enough Created photo book PhotoBox turned great. covers last 3.5 years mostly full snapshots our kids selfies with\u00a0Ritsy Chose primary school daughter go next\u00a0year."},{"title":"Analysis of the mean and median value of transactions on 5\u00a0Blockchains","url":"btc-fork-analysis.html","body":"analysis prepared Coin Metrics part recruitmen process. short demonstrat thought process. additional steps required develop useful analysis CoinMetric Case - evaluate skills abilities multiple\u00a0w Importing\u00a0 Wrangling\u00a0 Exploring\u00a0 Analysis Modeling Provide: written explanatio approach the\u00a0proble Present beginning phases implementa coin metrics\u00a0da four options made available case study, option was\u00a0chosen Advocating CoinMetric data\u00b6Produ quality research potential clients (doesn\u2019t complete) particular focus network\u00a0da Initial ideas\u00b6My first rough ideas\u00a0were Compare different Bitcoin based chains, (BTC, BCH, LTC, BSV) test influence whales compare respective (evolving) claims store (SoV) and/or alternativ to\u00a0cash. Develop expand research Willy Woo. find his research outstandin particular think following metrics merit days\u00a0destr hodl\u00a0waves thermo\u00a0cap average\u00a0ca Tracking twitter followers various crypto-twi thought leaders celebritie test hypothesis \u201can increase follower numbers shows retail investors entering increase price expected\u00a0s Thought leaders / crypto celebritie further grouped types coins speak - smart contracts, DeFi, privacy coins,\u00a0etc Weibo analysed well Twitter understand Chinese markets, Korean twitter analysed Korean existing side project goal recurrent neural net LSTM architectu predict BTC price movements. app (model, stored data, pipeline, visualizat results) run autonomous Google Cloud Platform. Candle consumed CoinAPI.io stored in\u00a0BigQuer Technical indicators calculated additional factors model. Sentiment analysis news outlets (Bloomberg FT) added\u00a0late written TensorFlow BigQuery tables names BQ\u2019s date format capabilite project faster and\u00a0cheape Idea seemed sensible option. Ideas 4 interestin worth investigat possible within scope this\u00a0exerc Testing influence whales\u00b6and \u201cnormal users\u201d BTC 4 BTC forks, discussing results context chain\u2019s claimed technical advantages cases e.g. store alternativ to\u00a0cash achieved comparing daily mean USD transactio daily median USD transactio value. done calculatin mean-media ratio transactio (MMR). Hypothesis chain smaller median transactio mean transactio size, chain activity dominated regular users making daily transactio whales moving large amounts currency artificial inflate usage\u00a0metr contradict claims blockchain active user base blockchain meeting user needs. assume\u00a0tha blockchain functionin digital cash, transactio small. e.g less 100 USD. noted 100 USD particular small amount even western countries due blockchain borderless nature, even futher above noraml \u2018day-to-da transactio amount large parts the\u00a0world. Conversely blockchain relatively little organic users whales (users large holdings) large proportion on-chain activity average transactio sizes larger day-to-day transactio untested guess \u201cwhale threshold\u201d 100,000USD Where ratio mean median transactio relatively high, environmen where mean higher median value, shows daily total transacted dominated few relatively large transactio rather small transactio imply whales dominate blockchain (and likely market behavior) rather members general public Chains:\u00b6Th chains analysed here forks BTC. They\u00a0are: BTC BCH BSV LTC DOGE Fields\u00b6usi coinmetric api, following metrics be\u00a0used: sum USD native units transferre divided count transfers (i.e., mean \u201csize\u201d USD transfer) that\u00a0inter TxTfrValMe median USD transferre per transfer (i.e., median \u201csize\u201d USD transfer) that\u00a0inter In\u00a0[1]: HTML code_toggl { (code_show } else { } code_show =! code_show } $( document analysis made Python. toggle visibility clicking =0);v t&&t>=0);v e=new e=new a(1);for(v t&&t>=0);v works positive a(0),mod:n i=new a(1),o=new a(0),s=new a(0),l=new i,o=new a(1),s=new v[t];var y;else x;else Error(\"Unk prime \"+t);e=new _}return works works red works works red f}}}functi strict\";va _(t){var w=[\"functi k(e,o){var \"+e);var 0,r)};var n=\"for(var M=f[2*x];v S=f[2*x+1] E=f[2*_];v C=f[2*_+1] L=2*y;var z=2*b;var O=2*w;var I=2*p;var D=2*g;var P=2*d;for( R=0;Rt;){v u(t,e,r,n) l=new EventEmitt memory leak detected. \"+s.length listeners added. increase t}function 0:return 1:return 2:return 3:return t=new instanceof Error)thro e;var l=new \"error\" event. for(var strict\";va \"'+t+'\" invalid option \"size\"');v e=new e)throw TypeError( \"string\" argument string. Received u(t)}retur t)return encoding: \"+e);var TypeError( first argument string, Buffer, ArrayBuffe Array, Array-like Object. Received \"+typeof allocate larger maximum size: bytes\");re 0|t}functi t)throw TypeError( \"string\" argument string, Buffer, ArrayBuffe Received '+typeof t);var 0;for(var d(t,e,r){v encoding: ... TypeError( \"target\" argument Uint8Array Received '+typeof t);if(void range 0;for(var 0)}var write outside encoding: M(t,e,r){v access beyond argument n)throw encoding: a}function B(t){retur i}function j(t,e){ret instanceof V(t){retur strict\";va l(t,e){ret e strict\";va o(t,e){ret c(m,v,s,f) i=new null;var l(t,v)};va u(t,e){ret strict\";va strict\";va instanceof Uint8Array instanceof strict\";va strict\";va strict\";va Error(f+\" map requires nshades least l(t,e,r){v 0:return 0;case 1:return t[0]-e[0]; 2:return 3:var a;var 4:var t}(o,r)}}; strict\";va strict\";va t)throw Error(\"Fon argument Error(\"Can parse empty Error(\"Mis required Error(\"Unk unsupporte font token: Error(\"Mis required p(t){var strict\";va Error(\"Unk keyword t}function g(t){for(v a}return a}return strict\";va e=new a=0;a0)thr Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array args\")}els Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array index\")}el Error(\"cwi Too arguments pre() Error(\"cwi Too arguments body() Error(\"cwi Too arguments post() block\");re strict\";va i(t,e,r){v x=new cwise routine e=new strict\";va e=[\"'use strict'\",\" (!(\"+l.joi && \")+\")) throw Error('cwi Arrays same {\"),e.push (!(\"+c.joi && \")+\")) throw Error('cwi Arrays same r(t){var r;return n}}}var s(t){retur l(t,e){var c(t,e){var u(t,e){var _(t,e,r){v T(t,e){var n}function n(n){var d,g=new r;var e=[];for(v e=[];for(v e=[];for(v r(t,e){var r}function n(){}var v(t){var e;return j(t){retur V(t){retur Error(\"unk type: r,n,i=new h(){if(r){ o(t){for(v a(t,e){var o(t){retur l(t){var t;var t=[];retur t=[];retur f(t){for(v g(t,e){for b(t,e){var _(t){var 0;var w(e),r=new w(r),n=new X=function t(e){funct s(e){var i(i){retur i(i){var a}return i(i){var i}function a(e){var u(t){retur f(e){var u=s[e];ret n(t){var +r+\"v\"+ t;var n(t){retur t[0]}funct i(t){retur t[1]}funct a(t,e,r){v a=new 0}function s(t){for(v e}var t,e,r=new this;var 1:do{(o=ne 2:do{(o=ne 3:do{(o=ne t=[];retur C(t,r,i,a) e}(e);else L(t,e){ret z(t,e){ret O(t,e){ret I(t,e){ret D(t,e){ret P(t){retur R(t){retur F(t,e){var B(t,e){var j(t,e){ret 0});var Y(t,e){ret F(){var v(t,r){var w(t){retur _(t)}funct k(t){retur t[0]}funct T(t){retur t[1]}funct A(){var l(r){var f(){return S(t,e){ret E(t){retur z(t){funct e(e){retur L(t(e))}re O(t){var I(){return D(){var O(r())},de O(n())},de O(i())},de O(a())},de F(t){retur B(t){retur N(t){var l(){var a=1;a0)for kt=functio t(e){funct r(t){retur e?new wt(t,e):ne gt(t,0)}re At=functio t(e){funct r(t){retur e?new Tt(t,e):ne mt(t,0)}re St=functio t(e){funct r(t){retur e?new Mt(t,e):ne xt(t,0)}re Ct(t){retu r}function Vt(t,e){re t[e]}funct Ut(t){var Ht(t){for( n}function qt(t){var Gt(t){for( v}return t=N(U);ret a(){var a(r){var y(){var p(t){retur m(t){retur r};var x(t,e){for e;var e=new L;if(t)for c(){var r,n=new z(){var O(){var d(){var g(){var v(){var re(t){retu ne(t){retu ie(t){retu se(t){retu Vt;functio ce(t){retu fe(t,e,r){ o;if(i)ret i=!1,a;var Me(){for(v t}function Se(){for(v Oe(t){retu t+\"\"}var n(e){var ir(t){var or(t){for( b=u&&h;ret u(t){var r(r){for(v u}(e)}};va %b %e %X this.s}};v cr=new lr;functio ur(t,e,r){ zr(t){var Or(t,e){re Rr(t){var Br(t,e){re d(t,o){var u}}functio Jr(t){retu Kr(){var r=e;return A(t,a){ret o(t,e){ret s(t,e){var an(t){var on(t,e){va o(t,e){var c(t){var vn(){var r}function 1,1 1,1 _n(){var t,e;functi r(r,n){var kn(){var i(t,e){var Tn(t){var r}function An(t){var x(r,i){var En(t){retu t})()}func Cn(e){var A(){return a(t,r,n){v Ln(t){retu i(){var b(){return t,e,r;func n(n,i){var r(e,r){var Wn(t,e){va $n;functio Xn(t,e){va n(t);funct _i(t,e){va n;var s;var wi(t,e){va _i(r,e);va Ti(t,e){re Mi(t){var s,l=1/0;re n}function $i(t,e){va 1;var n(t,n){var t(e,r,n,i) n}function Ha(t){retu qa(t,e){re Ga(t,e){re c}function o(t){var a(a,o){var f=function t(e){var t(e){var u(t,e){for d(t,e,r,i) l(t){retur s(t){retur l(t){retur jo(t){var s(a){var Ho(t){retu qo(t){for( c=2;cAt)+\" \"+e}functi 0,0 \"+n}return n(n,i){var \"+l[2]+\" \"+l[3]}ret function() 0,\"+e+\" \"+e+\",\"+e+ u[n]:delet v(){var if(_){var L(){var e=0;es*l){ a}function o(t){for(v r,n;for(r= t;e||(e=t) e}function s(t){var l(t,e,r,n) c(t,e,r){v n=t;do{var n}function l=t;do{for f(t,e){ret r}(t,e)){v v(t,e){ret b(t,e){ret e){e=0;for strict\";va strict\";va strict\";va strict\";va strict\";va t&&(t instanceof strict\";va strict\";va instanceof n))throw requires strict\";va strict\";va strict\";va instanceof n))throw requires specify first t[0][0]){v Error(\"sou length \"+c+\" does match destinatio length defined\"); \")+\"px o(t){retur s(t,e){ret t=[];retur t=[];retur 1:return t(e,r){var 2:return this.tree; e=new Error(\"Can update empty node!\");va r=new U=v,H=w,A= HALF_PI) && (b 2) ? + delta, option) : // option 3-n: round directions (option == 2) ? + delta, hv_ratio) : // horizontal vertical\\n (option == 1) ? rawAngle + delta : // free angle, flip align direction axis\\n (option == 0) ? : // free angle, stay upwards\\n (option ==-1) ? 0.0 : // useful backward compatibil texts remains horizontal rawAngle; // otherwise back raw input isAxisTitl = (axis.x == 0.0) &&\\n (axis.y == 0.0) &&\\n (axis.z == 0.0);\\n\\nv main() {\\n //Compute world offset\\n axisDistan = position.z dataPositi = axisDistan * axis + offset;\\n\\ beta = angle; // i.e. user defined attributes tick\\n\\n axisAngle; clipAngle; flip;\\n\\n (enableAli {\\n axisAngle = (isAxisTit ? HALF_PI :\\n dataPositi + axis);\\n clipAngle = dataPositi + alignDir); axisAngle += 0.0) ? 1.0 : 0.0;\\n\\n beta += flip * PI);\\n }\\n\\n //Compute plane offset\\n planeCoord = position.x * mat2 planeXform = * mat2(\\n cos(beta), sin(beta), -sin(beta) cos(beta)\\ );\\n\\n viewOffset = 2.0 * planeXform * planeCoord / //Compute clip position\\n clipPositi = //Apply text clip coordinate clipPositi += 0.0);\\n\\n //Done\\n gl_Positio = 1\\n\\nunifo color;\\nvo main() {\\n gl_FragCol = 1\\n\\nattri model, view, main() {\\n\\n signAxis = sign(bound - realNormal = signAxis * normal;\\n\\ enable) > 0.0) {\\n minRange = min(bounds bounds[1]) maxRange = max(bounds bounds[1]) nPosition = mix(minRan maxRange, 0.5 * (position + 1.0));\\n gl_Positio = projection * * * 1.0);\\n } else {\\n gl_Positio = }\\n\\n colorChann = 1\\n\\nunifo main() {\\n gl_FragCol = colorChann * colors[0] +\\n colorChann * colors[1] +\\n colorChann * p=new o=[];funct vectorizin text:\"'+t+ s;var r=0;rr)thr resizing buffer, specify u(t,e){for Cannot specify resizing r-1;return n.create() null;var 1\\n\\nvec3 v) {\\n // up-vector only-z vector.\\n // ax + + cz = 0, point lies plane v isn't (0,0,0).\\n // above if-stateme ||a|| > U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + = 0\\n (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n v.x, 0.0));\\n } else {\\n v.z, -v.y));\\n }\\n}\\n\\n// Calculate cone vertex given index.\\n// returned vertex cone top origin height 1.0,\\n// pointing direction vector cone made top vertex, center base vertex base perimeter vertices.\\ These vertices triangles cone following: segment + top vertex\\n// segment + perimeter vertex a+1\\n// segment + perimeter vertex a\\n// segment + center base vertex\\n// segment + 4 perimeter vertex a\\n// segment + 5 perimeter vertex a+1\\n// Where segment radial segment * 6 angle radial segment.\\n go index segment, floor(inde / 6)\\n// go segment angle, 2*pi * go index segment index, index - d, rawIndex, coneOffset normal) {\\n\\n const segmentCou = 8.0;\\n\\n index = rawIndex - floor(rawI /\\n (segmentCo * 6.0)) *\\n (segmentCo * 6.0);\\n\\n segment = floor(0.00 + index/6.0) segmentInd = index - = (segmentIn > 2.99 && segmentInd 0.99 && segmentInd 4.99 && segmentInd max(a, b)) || \\n (p U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + = 0\\n (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n v.x, 0.0));\\n } else {\\n v.z, -v.y));\\n }\\n}\\n\\n// Calculate cone vertex given index.\\n// returned vertex cone top origin height 1.0,\\n// pointing direction vector cone made top vertex, center base vertex base perimeter vertices.\\ These vertices triangles cone following: segment + top vertex\\n// segment + perimeter vertex a+1\\n// segment + perimeter vertex a\\n// segment + center base vertex\\n// segment + 4 perimeter vertex a\\n// segment + 5 perimeter vertex a+1\\n// Where segment radial segment * 6 angle radial segment.\\n go index segment, floor(inde / 6)\\n// go segment angle, 2*pi * go index segment index, index - d, rawIndex, coneOffset normal) {\\n\\n const segmentCou = 8.0;\\n\\n index = rawIndex - floor(rawI /\\n (segmentCo * 6.0)) *\\n (segmentCo * 6.0);\\n\\n segment = floor(0.00 + index/6.0) segmentInd = index - = (segmentIn > 2.99 && segmentInd 0.99 && segmentInd 4.99 && segmentInd max(a, b)) || \\n (p strict\";va 1\\n\\nattri position, model, view, main() {\\n worldPosit = * vec4(posit 1.0);\\n worldPosit = (worldPosi / + vec4(capSi * offset, 0.0);\\n gl_Positio = projection * * fragColor = color;\\n fragPositi = 1\\n\\nbool a, b, p) {\\n ((p > max(a, b)) || \\n (p u||ru)thro Error(\"gl- Parameters too large FBO\");var Error(\"gl- Multiple draw extension Error(\"gl- Context does support \"+f+\" draw buffers\")} Error(\"gl- Context does support floating point g=!0;\"dept i:throw Error(\"gl- Framebuffe a:throw Error(\"gl- Framebuffe incomplete o:throw Error(\"gl- Framebuffe incomplete s:throw Error(\"gl- Framebuffe incomplete missing Error(\"gl- Framebuffe failed unspecifie null;var Error(\"gl- Can't resize FBO, invalid null;var max(a, b)) || \\n (p FLOAT_MAX) {\\n vec4(127.0 128.0, 0.0, 0.0) / 255.0;\\n } else if(v max(a, b)) || \\n (p 0){for(var max(a, b)) || \\n (p max(a, b)) || \\n (p max(a, b)) || \\n (p 0.25) {\\n discard;\\n }\\n gl_FragCol = f_color * f_uv) * 1\\n\\nattri id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n f_id = id;\\n f_position = 1\\n\\nbool a, b, p) {\\n ((p > max(a, b)) || \\n (p max(a, b)) || \\n (p t&&r>0){va 1}function M(t){var S(t){var E(t){var C(t){var null;for(v function() u=0;u=0){v 1\\nattribu uv;\\nvoid main() {\\n uv = position;\\ gl_Positio = vec4(posit 0, 1\\n\\nunifo sampler2D uv;\\n\\nvoi main() {\\n accum = 0.5 * (uv + 1.0));\\n gl_FragCol = strict\";va m(t){var null}retur Error(\"web q(){for(va c=0;c 1.0) {\\n discard;\\n }\\n baseColor = color, step(radiu gl_FragCol = * baseColor. 1\\n\\nattri mat3 main() {\\n hgPosition = matrix * vec3(posit 1);\\n gl_Positio = 0, gl_PointSi = pointSize; id = pickId + pickOffset id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n fragId = 1\\n\\nvaryi main() {\\n radius = length(2.0 * - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragCol = fragId / strict\";va e;function r(e,r){ret e instanceof instanceof null;var strict\";va a)return a[t];var max(a, b)) || \\n (p max(a, b)) || \\n (p max(a, b)) || \\n (p max(a, b)) || \\n (p max(a, b)) || \\n (p 1?1:t}func O(t,e,r,i) n=0;n0){va c(t,r,a)}; S=new t=0;t=0){v n(\"\",\"Inva attribute \"+f+\": n(\"\",\"Unkn attribute \"+f+\": \"+h);var n(\"\",\"Inva attribute \"+f+\": a};var i(\"\",\"Inva uniform dimension matrix \"+name+\": i(\"\",\"Unkn uniform \"+name+\": \"+r)}var i(\"\",\"Inva vector \"+name+\": c(e){for(v n=[\"return n=[];for(v r){var i(\"\",\"Inva i(\"\",\"Inva uniform dimension matrix \"+name+\": \"+t);retur o(r*r,0)}t i(\"\",\"Unkn uniform \"+name+\": p}function f(t){var r=0;r1){l[ c=1;c1)for l=0;l U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + = 0\\n (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n v.x, 0.0));\\n } else {\\n v.z, -v.y));\\n }\\n}\\n\\n// Calculate tube vertex given index.\\n// returned vertex tube ring center origin, radius length(d), pointing direction d.\\n//\\n// tube segment made ring vertices.\\ These vertices triangles tube connecting together vertex array.\\n// indexes tube segments run 8.\\n//\\nve d, index, normal) {\\n segmentCou = 8.0;\\n\\n angle = 2.0 * 3.14159 * (index / u = v = d));\\n\\n x = u * cos(angle) * length(d); y = v * sin(angle) * length(d); v3 = x + y;\\n\\n = color, uv;\\nunifo model\\n , view\\n , projection , eyePositio , f_normal\\n , , , f_data\\n , f_uv;\\n\\nv main() {\\n // vector magnitude stay constant with\\n // & changes.\\n normal;\\n XYZ = * (tubeScale * vector.w * position.w normal);\\n tubePositi = * 1.0) + vec4(XYZ, 0.0);\\n\\n //Lighting geometry parameters = * /= = lightPosit - f_eyeDirec = eyePositio - f_normal = * // m_position = * 1.0);\\n t_position = * gl_Positio = projection * f_color = color;\\n f_data = f_position = f_uv = : 1\\n\\nfloat x, roughness) {\\n NdotH = max(x, 0.0001);\\n cos2Alpha = NdotH * NdotH;\\n tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha; roughness2 = roughness * roughness; denom = * roughness2 * cos2Alpha * cos2Alpha; exp(tan2Al / roughness2 / roughness, fresnel) {\\n\\n VdotN = 0.0);\\n LdotN = 0.0);\\n\\n //Half angle vector\\n H = + //Geometri term\\n NdotH = H), 0.0);\\n VdotH = H), 0.000001); LdotH = H), 0.000001); G1 = (2.0 * NdotH * VdotN) / VdotH;\\n G2 = (2.0 * NdotH * LdotN) / LdotH;\\n G = min(1.0, min(G1, G2));\\n \\n //Distribu term\\n D = //Fresnel term\\n F = pow(1.0 - VdotN, fresnel);\\ //Multiply terms done\\n G * F * D / max(3.1415 * VdotN, a, b, p) {\\n ((p > max(a, b)) || \\n (p U ||b|| > 0.\\n // Assign z = 0, x = -b, y = a:\\n // a*-b + b*a + c*0 = -ba + ba + = 0\\n (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\\n v.x, 0.0));\\n } else {\\n v.z, -v.y));\\n }\\n}\\n\\n// Calculate tube vertex given index.\\n// returned vertex tube ring center origin, radius length(d), pointing direction d.\\n//\\n// tube segment made ring vertices.\\ These vertices triangles tube connecting together vertex array.\\n// indexes tube segments run 8.\\n//\\nve d, index, normal) {\\n segmentCou = 8.0;\\n\\n angle = 2.0 * 3.14159 * (index / u = v = d));\\n\\n x = u * cos(angle) * length(d); y = v * sin(angle) * length(d); v3 = x + y;\\n\\n = id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n normal;\\n XYZ = * (tubeScale * vector.w * position.w normal);\\n tubePositi = * 1.0) + vec4(XYZ, 0.0);\\n\\n gl_Positio = projection * * f_id = id;\\n f_position = 1\\n\\nbool a, b, p) {\\n ((p > max(a, b)) || \\n (p null;var strict\";va r-1}return n.create() t-e});for( max(a, b)) || \\n (p 0.0) ||\\n clipBounds discard;\\n = V = L = {\\n = -N;\\n }\\n\\n specular = V, N, roughness) 0.);\\n diffuse = min(kambie + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n //decide interpolat \\u2014 vertex fragment\\n surfaceCol =\\n .5) * vec2(value value)) +\\n step(.5, vertexColo * vColor;\\n\\ litColor = surfaceCol * vec4(diffu * + kspecular * vec3(1,1,1 * specular, 1.0);\\n\\n gl_FragCol = mix(litCol contourCol contourTin * 1\\n\\nattri uv;\\nattri f;\\n\\nunif mat3 model, view, height, sampler2D value, kill;\\nvar eyeDirecti main() {\\n dataCoordi = permutatio * vec3(uv.xy height);\\n = objectOffs + worldPosit = * 1.0);\\n\\n clipPositi = projection * * clipPositi += zOffset;\\n gl_Positio = = f + kill = -1.0;\\n = uv.zw;\\n\\n vColor = vec2(value value));\\n //Don't lighting contours\\n surfaceNor = vec3(1,0,0 eyeDirecti = vec3(0,1,0 lightDirec = 1\\n\\nbool a, b, p) {\\n ((p > max(a, b)) || \\n (p 0.0) ||\\n clipBounds discard;\\n ux = / shape.x);\\ uy = / shape.y);\\ gl_FragCol = vec4(pickI ux.x, uy.x, ux.y + v=new k O(t,e){var invalid coordinate kt=0;kt halfCharSt + halfCharWi 2){for(var n)return strict\";va Invalid texture size\");var Invalid shape Invalid shape pixel Invalid arguments texture2d instanceof instanceof instanceof ImageData& instanceof ImageData} f(t,e,r){v Invalid texture size\");ret d(t,e){ret g(t){var Invalid texture Floating point textures supported platform\") o=g(t);ret Invalid ndarray, 2d 3d\");var Invalid shape Invalid shape pixel Incompatib texture format Error(\"gl- Too vertex e=new t=new e=new t=new i=new n=new Error(\"Mus least d+1 points\");v orient\");v i=new strict\";va x(null);re x(y(t))};v c(t,e){var u(t,e){var f(t,e){var i}}functio d(t,e){for r;return n;return strict\";va e,r,n;func a=\"var sharedChun = {}; r=i;else e=i}return n(t){retur i(t,e){ret a=o;functi l=c;functi u(t,e,r,n) i=new instanceof p(t){for(v k(t){for(v 0,o=void original icon Sans Unicode MS t.kind}var i(t){retur null;var 1, 2, arguments, found instead.\") i||!(i ct))return e.error('T item argument \"array\" string, number, rbga expected array containing either three four numeric ot(r||\"Cou parse r=!0;retur expression \"'+r+'\". wanted literal array, [\"literal\" ot(\"Input array least element. wanted literal array, [\"literal\" []].');var r)return name string, found \"+typeof r+' instead. wanted literal array, [\"literal\" ut(a,i));e null}else instanceof at)&&funct t(e){if(e instanceof yt)return instanceof instanceof r=e instanceof ht||e instanceof lt||e instanceof ut,n=!0;re instanceof s=new dt;try{i=n i}return expression \"'+r+'\". wanted literal array, [\"literal\" invalid. null objects invalid. [\"literal\" {...}] array, found \"+typeof t+\" pairs \"step\" expression arranged input values strictly ascending order.',c) t};var e.error(\"C bezier interpolat requires four numeric arguments values pairs \"interpola expression arranged input values strictly ascending order.',h) l.N?new \"+$(l)+\" ot(\"Array index bounds: \"+e+\" > ot(\"Array index integer, found \"+e+\" labels integers no larger branch labels integer null}else labels null;var g?new Ut(t,e){va r=e[0];thr instanceof r=e[0];ret typeof i==typeof typeof n==typeof typeof i==typeof typeof n==typeof e[0].value r=e[0];ret ne(t){retu ie(t){retu me(t,e,r){ n=void 0,t);if(vo 0!==r&&voi 0!==n)retu _e(t){retu t[0]&&t[0] Rt}functio we(t,e){va r=new n?Gt(new ot(\"Expect \")+\", found instanceof t;var Yt([new N(\"\",\"prop expression Yt([new N(\"\",\"zoom expression a=function t(e){var r=null;if( instanceof if(e instanceof Mt)for(var D(e,r,r+\" greater maximum ze(t){var may \"stops\" least required property required property functions functions functions property f(t){var D(s,a,\"arr expected, \"+fe(a)+\" D(s,a,\"arr length expected, length \"+a.length D(s,a,\"obj expected, \"+fe(a[0]) D(s,a,\"obj stop D(s,a,\"obj stop zoom values appear ascending h(t,n){var D(t.key,c, stop domain match previous stop domain \"+e)]}else domain number, string, u=\"number expected, \"+s+\" found\";ret intended categorica function, specify `\"type\": typeof t!=typeof He(t){retu t(e){var D(n,r,\"arr expected, \"+fe(r)+\" found\")];v D(n,r,'\"$t cannot operator D(n,r,'fil array operator \"'+r[0]+'\" expected, \"+i+\" instanceof Error(\"can serialize object \"+typeof t)}functio t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||t instanceof instanceof fr)return t){var Error(\"can deserializ object anonymous class\");va Error(\"can deserializ unregister class a}throw Error(\"can deserializ object \"+typeof t)}var 1;var t};var e zr(r,void e(e,r){for Xr(t,e){vo Zr(t,e){re implemente concrete StructArra layout\")}; n=2*r;retu a=4*i;retu s=6*o;retu c=8*l;retu i=3*n;retu r=1*e;retu s=6*o;retu n=4*r;retu r=1*e;retu i=3*n;retu i=3*n;retu n=2*r;retu n=2*r;retu a=4*i;retu vertices per segment bucket requested exceeds allowed extent, reduce vector tile size\")}ret r}function Qn={paint: t=new t=new t=new t=new e=t;return range source coordinate image range destinatio coordinate image copy\");for t;e||(e=t) e}function ki(t){var Ai(t,e,r){ n=t;do{var n}function o=t;do{for Si(t,e){re r}(t,e)){v Oi(t,e){re Ri(t,e){re Wi(t,e){va na(t){retu Error(\"unk command if(7!==r)t Error(\"unk command u(t){for(v n=new Error(\"fea index Mn};functi c=0;cc){va Ta=new r=new r=[],n=new Da(t,e,r){ Fa(t,e){va null;var e=new t){var oo(t){retu lo(t,e,r){ type: wo=3;funct if(void if(void e(t,e,n){v r(t,e,r){v range source coordinate DEM tiles _('\"'+e+'\" valid encoding type. Valid types include \"mapbox\" a=n||i;ret r=[];for(v t)n f(t,e){ret h(e,r,n){v best %d after %d s=new glyphs rendered tile. See r=new e){var l o){var _(e,r){for n=new t.id})))}} e=new x(c),r=new f){var a=f[n];a instanceof k(e,r){var r(o);var r[n],e()}; e[r]};var S(t){var $(t,e){for lt(t,e){va e,r,n}func ut(t){var ft(t){retu ht(t){var t}function dt(t){retu t.x}functi gt(t){retu t.y}functi Et(t){var e=[];retur o}function Error(\"max 0-24 range\");va %d clusters z%d-%d-%d (features: %d, points: %d, simplified null;var down parent tile i)return e(new Error(\"Inp valid GeoJSON e.data)ret r(new Error(\"Inp valid GeoJSON r(new Error(\"Inp valid GeoJSON Error('Wor source name \"'+t+'\" already Error(\"RTL text plugin already Error(\"RTL Text Plugin failed scripts self&&self instanceof t,e,r=new Error(\"fai canvas 2d null;for(v y(t,e){var Error(\"An API access token required GL. Error(\"Use public access token (pk.*) GL, secret access token (sk.*). \"+m);retur x(t){retur t;var r=A(t);ret i=A(t);ret t;var Error(\"gly > 65535 lat: }, array [, ]\")};var this._ne=t instanceof G?new this._sw=t instanceof G?new instanceof instanceof Y))return this}retur instanceof Y?t:new Y(t)};var r=this;ret r.fire(new r=this,n=v this;var this};var n=!1;for(v e=(t-(void n={};for(v o s n||(r=new r=this;t Xt(e,r){va $t(){retur Qt(e,r){va n={};for(v O}var T=new _e=new l i){var u=new 4294967295 l s){var if(i&&o){v l i){var if(r)for(v \")+\".\");re this.fire( Error(\"An image name already this.fire( Error(\"No image name Error(\"The already source Error(\"The property defined, following properties given: Error(\"The no source ID\");for(v this.fire( Error('Sou \"'+e+'\" cannot removed while layer \"'+r+'\" it.')));va Error('Lay id \"'+i+'\" already exists map')));el Error('Lay id \"'+r+'\" does exist Error('Lay id \"'+r+'\" does exist this.fire( Error(\"The layer '\"+e+\"' does exist map's style cannot this.fire( Error(\"The layer '\"+e+\"' does exist map's style cannot Error(\"The layer '\"+e+\"' does exist map's style cannot zoom 0,void this.fire( Error(\"The layer '\"+e+\"' does exist map's style cannot Error(\"The layer '\"+e+\"' does exist map's style cannot this.fire( Error(\"The layer '\"+e+\"' does exist map's style cannot e=this;ret 0.5) {\\n gl_FragCol = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\\n }\\n\\n (v_notUsed > 0.5) {\\n // box used, fade out\\n gl_FragCol *= .1;\\n main() {\\n projectedP = u_matrix * 0, 1);\\n = = clamp(\\n 0.5 + 0.5 * / 0.0, // Prevents oversized near-field boxes tiles\\n 4.0);\\n\\n gl_Positio = u_matrix * vec4(a_pos 0.0, 1.0);\\n gl_Positio += a_extrude * * gl_Positio * v_placed = a_placed.x v_notUsed = main() {\\n = 0.5;\\n\\n // Red = collision, hide label\\n = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n\\n // Blue = no collision, label showing\\n (v_placed > 0.5) {\\n = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\\n }\\n\\n (v_notUsed > 0.5) {\\n // box used, fade out\\n *= .2;\\n }\\n\\n = extrude_le = * stroke_wid = 15.0 * / radius = v_radius * = - radius);\\n opacity_t = 0.0, gl_FragCol = opacity_t * main() {\\n projectedP = u_matrix * 0, 1);\\n = = clamp(\\n 0.5 + 0.5 * / 0.0, // Prevents oversized near-field circles tiles\\n 4.0);\\n\\n gl_Positio = u_matrix * vec4(a_pos 0.0, 1.0);\\n\\n padding_fa = 1.2; // Pad vertices slightly room anti-alias blur\\n gl_Positio += a_extrude * * padding_fa * gl_Positio * v_placed = a_placed.x v_notUsed = a_placed.y v_radius = // don't pitch circles, both units extrusion vector equal magnitude radius\\n\\n v_extrude = a_extrude * = * * main() {\\n gl_FragCol = main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, mapbox: color\\n#pr mapbox: main() {\\n #pragma mapbox: initialize color\\n #pragma mapbox: initialize opacity\\n\\ gl_FragCol = * gl_FragCol = mapbox: color\\n#pr mapbox: main() {\\n #pragma mapbox: initialize color\\n #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, mapbox: mapbox: v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - = 1.0 - 1.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = mapbox: mapbox: main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n v_pos = / gl_Positio + 1.0) / 2.0 * sampler2D mapbox: main() {\\n #pragma mapbox: initialize opacity\\n\\ imagecoord = mod(v_pos_ 1.0);\\n pos = / u_texsize, u_pattern_ / u_texsize, imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = / u_texsize, u_pattern_ / u_texsize, color2 = pos2);\\n\\n // find distance outline dist = length(v_p - = 1.0 - 1.0, dist);\\n\\n gl_FragCol = mix(color1 color2, u_mix) * * gl_FragCol = mapbox: main() {\\n #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n\\n v_pos_a = u_scale_a * a_pos);\\n v_pos_b = u_scale_b * a_pos);\\n\\ v_pos = / gl_Positio + 1.0) / 2.0 * sampler2D mapbox: main() {\\n #pragma mapbox: initialize opacity\\n\\ imagecoord = mod(v_pos_ 1.0);\\n pos = / u_texsize, u_pattern_ / u_texsize, imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = / u_texsize, u_pattern_ / u_texsize, color2 = pos2);\\n\\n gl_FragCol = mix(color1 color2, u_mix) * gl_FragCol = mapbox: main() {\\n #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n\\n v_pos_a = u_scale_a * a_pos);\\n v_pos_b = u_scale_b * mapbox: base\\n#pra mapbox: mapbox: color\\n\\nv main() {\\n #pragma mapbox: initialize base\\n #pragma mapbox: initialize height\\n #pragma mapbox: initialize color\\n\\n gl_FragCol = gl_FragCol = mapbox: base\\n#pra mapbox: mapbox: color\\n\\nv main() {\\n #pragma mapbox: initialize base\\n #pragma mapbox: initialize height\\n #pragma mapbox: initialize color\\n\\n = base = max(0.0, base);\\n height = max(0.0, height);\\n = mod(normal 2.0);\\n\\n gl_Positio = u_matrix * vec4(a_pos > 0.0 ? height : base, 1);\\n\\n // Relative luminance (how dark/brigh surface color?)\\n colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\\n\\ v_color = vec4(0.0, 0.0, 0.0, 1.0);\\n\\n // Add slight ambient lighting no extrusions totally black\\n ambientlig = vec4(0.03, 0.03, 0.03, 1.0);\\n += // Calculate cos(theta) where theta angle surface diffuse light ray\\n directiona = / 16384.0, u_lightpos 0.0, 1.0);\\n\\n // Adjust directiona that\\n // range values narrower\\n // lower light intensity\\ // surface colors\\n directiona = mix((1.0 - max((1.0 - colorvalue + 1.0), // Add gradient along z axis side surfaces\\n (normal.y != 0.0) {\\n directiona *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - 1.0);\\n }\\n\\n // Assign final based surface + ambient light color, diffuse light directiona light color\\n // lower bounds adjusted hue light\\n // shading tinted complement (opposite) light color\\n v_color.r += clamp(colo * directiona * mix(0.0, 0.3, 1.0 - 1.0);\\n v_color.g += clamp(colo * directiona * mix(0.0, 0.3, 1.0 - 1.0);\\n v_color.b += clamp(colo * directiona * mix(0.0, 0.3, 1.0 - sampler2D mapbox: base\\n#pra mapbox: height\\n\\n main() {\\n #pragma mapbox: initialize base\\n #pragma mapbox: initialize height\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos = / u_texsize, u_pattern_ / u_texsize, imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = / u_texsize, u_pattern_ / u_texsize, color2 = pos2);\\n\\n mixedColor = mix(color1 color2, u_mix);\\n\\ gl_FragCol = mixedColor * gl_FragCol = mapbox: base\\n#pra mapbox: height\\n\\n main() {\\n #pragma mapbox: initialize base\\n #pragma mapbox: initialize height\\n\\n = edgedistan = base = max(0.0, base);\\n height = max(0.0, height);\\n = mod(normal 2.0);\\n z = > 0.0 ? height : base;\\n\\n gl_Positio = u_matrix * vec4(a_pos z, 1);\\n\\n pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0\\n ? a_pos // extrusion top\\n : z * // extrusion side\\n\\n v_pos_a = u_scale_a * pos);\\n v_pos_b = u_scale_b * pos);\\n\\n v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\\n directiona = / 16383.0, u_lightpos 0.0, 1.0);\\n directiona = mix((1.0 - max((0.5 + 1.0), (normal.y != 0.0) {\\n directiona *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - 1.0);\\n }\\n\\n v_lighting += * u_lightcol mix(vec3(0 vec3(0.3), 1.0 - u_lightcol sampler2D v_pos;\\n\\n main() {\\n gl_FragCol = v_pos) * gl_FragCol = v_pos;\\n\\n main() {\\n gl_Positio = u_matrix * vec4(a_pos * u_world, 0, 1);\\n\\n v_pos.x = a_pos.x;\\n v_pos.y = 1.0 - sampler2D coord, bias) {\\n // Convert encoded elevation meters\\n = coord) * 255.0;\\n (data.r + data.g * 256.0 + data.b * 256.0 * 256.0) / main() {\\n epsilon = 1.0 / // queried pixels:\\n // // | | | |\\n // | | b | c |\\n // | | | |\\n // // | | | |\\n // | d | e | f |\\n // | | | |\\n // // | | | |\\n // | g | h | |\\n // | | | |\\n // = + -epsilon.y 0.0);\\n b = + vec2(0, -epsilon.y 0.0);\\n c = + -epsilon.y 0.0);\\n d = + 0), 0.0);\\n e = 0.0);\\n f = + 0), 0.0);\\n g = + epsilon.y) 0.0);\\n h = + vec2(0, epsilon.y) 0.0);\\n = + epsilon.y) 0.0);\\n\\n // here divide x y slopes 8 * pixel size\\n // where pixel (aka meters/pix is:\\n // circumfere world / (pixels per tile * tiles)\\n // equivalent to: 8 * / (512 * pow(2, u_zoom))\\n // reduced to: pow(2, 19.2561997 - u_zoom)\\n // vertically exaggerate hillshadin though, otherwise\\ // barely noticeable low zooms. this, multiply some\\n // factor pow(2, (u_zoom - u_maxzoom) * a) where arbitrary value\\n // Here a=0.3 works expression below. see \\n // nickidluga awesome breakdown info\\n // exaggerati = u_zoom 0.0 ? 1.0 : -1.0);\\n\\n intensity = u_light.x; // add PI property match global light object, adds PI/2 light's azimuthal\\ // position property account 0deg correspond north/the top viewport style spec\\n // original shader written accept - 90) azimuthal. azimuth = u_light.y + PI;\\n\\n // slope exponentia based intensity, calculatio similar to\\n // exponentia interpolat style spec:\\n // // higher intensity values opaque hillshadin base = 1.875 - intensity * 1.75;\\n maxValue = 0.5 * PI;\\n scaledSlop = intensity != 0.5 ? ((pow(base slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope;\\n\\n // accent calculated cosine slope while shade calculated sine\\n // accent color's rate change eases while shade color's eases out.\\n accent = // multiply both accent shade clamped intensity value\\n // intensitie >= 0.5 additional affect values\\n // while intensity values 0.0 ? ANTIALIASI : 0.0);\\n outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\\n gl_Positio = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + // calculate perspectiv squishes stretches extrude\\n = = / gl_Positio * v_gamma_sc = / v_width2 = vec2(outse mapbox: blur\\n#pra mapbox: sampler2D main() {\\n #pragma mapbox: initialize blur\\n #pragma mapbox: initialize opacity\\n\\ // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case (v_width2. fading out\\n // (v_width2. blur2 = (blur + 1.0 / * = clamp(min( - (v_width2. - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\\n\\n // gradient lines, v_lineprog ratio along entire line,\\n // scaled [0, 2^15), gradient ramp stored texture.\\n = 0.5));\\n\\n gl_FragCol = * (alpha * gl_FragCol = attribute conveying progress along scaled [0, 2^15)\\n#de 32767.0\\n\\ distance over edge fades out.\\n// Retina devices smaller distance avoid ANTIALIASI 1.0 / / 2.0\\n\\n// floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def mapbox: blur\\n#pra mapbox: mapbox: mapbox: mapbox: width\\n\\nv main() {\\n #pragma mapbox: initialize blur\\n #pragma mapbox: initialize opacity\\n #pragma mapbox: initialize gapwidth\\n #pragma mapbox: initialize offset\\n #pragma mapbox: initialize width\\n\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n\\n v_lineprog = / 4.0) + a_data.w * 64.0) * 2.0 / pos = // x round cap, otherwise\\ // y up, -1 down\\n = v_normal = normal;\\n\\ // these applied JS native bases.\\n // moved shader clarity simplicity gapwidth = gapwidth / 2.0;\\n halfwidth = width / 2.0;\\n = -1.0 * offset;\\n\\ inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASI : 0.0);\\n outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\\n gl_Positio = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + // calculate perspectiv squishes stretches extrude\\n = = / gl_Positio * v_gamma_sc = / v_width2 = vec2(outse sampler2D mapbox: blur\\n#pra mapbox: main() {\\n #pragma mapbox: initialize blur\\n #pragma mapbox: initialize opacity\\n\\ // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case (v_width2. fading out\\n // (v_width2. blur2 = (blur + 1.0 / * = clamp(min( - (v_width2. - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\\n\\n x_a = / 1.0);\\n x_b = / 1.0);\\n\\n // v_normal.y midpoint line, -1 lower edge, upper edge\\n // clamp width outset half pattern height plus padding (2.0)\\n // ensure don't sample outside designated symbol sprite sheet.\\n // 0.5 added shift component bounded interpolat of\\n // texture coordinate y_a = 0.5 + (v_normal. * 0.0, + 2.0) / 2.0) / y_b = 0.5 + (v_normal. * 0.0, + 2.0) / 2.0) / pos_a = / u_texsize, u_pattern_ / u_texsize, vec2(x_a, y_a));\\n pos_b = / u_texsize, u_pattern_ / u_texsize, vec2(x_b, y_b));\\n\\n = pos_a), pos_b), u_fade);\\n gl_FragCol = * * gl_FragCol = floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale 2.0\\n\\n// distance over edge fades out.\\n// Retina devices smaller distance avoid ANTIALIASI 1.0 / / mapbox: blur\\n#pra mapbox: mapbox: mapbox: mapbox: width\\n\\nv main() {\\n #pragma mapbox: initialize blur\\n #pragma mapbox: initialize opacity\\n #pragma mapbox: initialize offset\\n #pragma mapbox: initialize gapwidth\\n #pragma mapbox: initialize width\\n\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * pos = // x round cap, otherwise\\ // y up, -1 down\\n = v_normal = normal;\\n\\ // these applied JS native bases.\\n // moved shader clarity simplicity gapwidth = gapwidth / 2.0;\\n halfwidth = width / 2.0;\\n = -1.0 * offset;\\n\\ inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASI : 0.0);\\n outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\\n gl_Positio = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + // calculate perspectiv squishes stretches extrude\\n = = / gl_Positio * v_gamma_sc = / v_linesofa = a_linesofa v_width2 = vec2(outse sampler2D mapbox: color\\n#pr mapbox: blur\\n#pra mapbox: mapbox: width\\n#pr mapbox: main() {\\n #pragma mapbox: initialize color\\n #pragma mapbox: initialize blur\\n #pragma mapbox: initialize opacity\\n #pragma mapbox: initialize width\\n #pragma mapbox: initialize floorwidth // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case (v_width2. fading out\\n // (v_width2. blur2 = (blur + 1.0 / * = clamp(min( - (v_width2. - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\\n\\n sdfdist_a = v_tex_a).a sdfdist_b = v_tex_b).a sdfdist = mix(sdfdis sdfdist_b, u_mix);\\n *= smoothstep - u_sdfgamma / floorwidth 0.5 + u_sdfgamma / floorwidth sdfdist);\\ gl_FragCol = * (alpha * gl_FragCol = floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale 2.0\\n\\n// distance over edge fades out.\\n// Retina devices smaller distance avoid ANTIALIASI 1.0 / / mapbox: color\\n#pr mapbox: blur\\n#pra mapbox: mapbox: mapbox: mapbox: width\\n#pr mapbox: main() {\\n #pragma mapbox: initialize color\\n #pragma mapbox: initialize blur\\n #pragma mapbox: initialize opacity\\n #pragma mapbox: initialize gapwidth\\n #pragma mapbox: initialize offset\\n #pragma mapbox: initialize width\\n #pragma mapbox: initialize floorwidth a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * pos = // x round cap, otherwise\\ // y up, -1 down\\n = v_normal = normal;\\n\\ // these applied JS native bases.\\n // moved shader clarity simplicity gapwidth = gapwidth / 2.0;\\n halfwidth = width / 2.0;\\n = -1.0 * offset;\\n\\ inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASI : 0.0);\\n outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist =outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\\n gl_Positio = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + // calculate perspectiv squishes stretches extrude\\n = = / gl_Positio * v_gamma_sc = / v_tex_a = * / floorwidth normal.y * + u_tex_y_a) v_tex_b = * / floorwidth normal.y * + v_width2 = vec2(outse sampler2D sampler2D main() {\\n\\n // read cross-fade colors parent tiles\\n color0 = v_pos0);\\n color1 = v_pos1);\\n (color0.a > 0.0) {\\n color0.rgb = color0.rgb / color0.a;\\ }\\n (color1.a > 0.0) {\\n color1.rgb = color1.rgb / color1.a;\\ }\\n = mix(color0 color1, u_fade_t); color.a *= u_opacity; rgb = color.rgb; // spin\\n rgb = vec3(\\n dot(rgb, dot(rgb, dot(rgb, // saturation average = (color.r + color.g + color.b) / 3.0;\\n rgb += (average - rgb) * // contrast\\n rgb = (rgb - 0.5) * + 0.5;\\n\\n // brightness u_high_vec = u_low_vec = gl_FragCol = u_low_vec, rgb) * color.a, gl_FragCol = main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n // Int16 texture position coordinate give us enough precision for\\n // fractional coordinate 8192 texture coordinate buffer\\n // arbitraril high preserve adequate precision rendering. // same EXTENT our tile pos coordinate // math modifying either consistent v_pos0 = / 8192.0) - 0.5) / u_buffer_s ) + 0.5;\\n v_pos1 = (v_pos0 * + sampler2D mapbox: main() {\\n #pragma mapbox: initialize opacity\\n\\ = opacity * gl_FragCol = v_tex) * gl_FragCol = PI = bool bool u_size_t; // interpolat zoom stops composite u_size; // both zoom feature bool mapbox: bool bool main() {\\n #pragma mapbox: initialize opacity\\n\\ a_pos = a_offset = a_tex = a_data.xy; a_size = a_data.zw; segment_an = size;\\n && {\\n = mix(a_size a_size[1], u_size_t) / 10.0;\\n } else && {\\n = a_size[0] / 10.0;\\n } else && {\\n = u_size;\\n } else {\\n = u_size;\\n }\\n\\n projectedP = u_matrix * vec4(a_pos 0, 1);\\n = // See comments distance_r = ?\\n / :\\n / = clamp(\\n 0.5 + 0.5 * 0.0, // Prevents oversized near-field symbols tiles\\n 4.0);\\n\\n *= fontScale = u_is_text ? / 24.0 : size;\\n\\n = 0.0;\\n {\\n // See comments = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\\n\\n = / b = / = atan((b.y - a.y) / b.x - a.x);\\n }\\n\\n angle_sin = + angle_cos = + mat2 = -1.0 * angle_sin, angle_sin, projected_ = * 0.0, 1.0);\\n gl_Positio = * / + * (a_offset / 32.0 * fontScale) 0.0, 1.0);\\n\\n v_tex = a_tex / u_texsize; fade_opaci = fade_chang = > 0.5 ? u_fade_cha : v_fade_opa = max(0.0, min(1.0, + SDF_PX 8.0\\n#defi EDGE_GAMMA bool mapbox: mapbox: mapbox: mapbox: mapbox: sampler2D bool main() {\\n #pragma mapbox: initialize fill_color #pragma mapbox: initialize halo_color #pragma mapbox: initialize opacity\\n #pragma mapbox: initialize halo_width #pragma mapbox: initialize halo_blur\\ tex = v_data0.xy gamma_scal = v_data1.x; = v_data1.y; fade_opaci = fontScale = u_is_text ? / 24.0 : size;\\n\\n = fill_color gamma = EDGE_GAMMA / (fontScale * buff = (256.0 - 64.0) / 256.0;\\n (u_is_halo {\\n = halo_color gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA / (fontScale * buff = (6.0 - halo_width / fontScale) / SDF_PX;\\n }\\n\\n dist = tex).a;\\n gamma_scal = gamma * gamma_scal = - gamma_scal buff + gamma_scal dist);\\n\\n gl_FragCol = * (alpha * opacity * gl_FragCol = PI = contents a_size vary based property value\\n// constants, a_size disabled.\\ source functions, bind per vertex: evaluated current feature.\\n composite functions: [ feature),\\ feature) ]\\nuniform bool bool u_size_t; // interpolat zoom stops composite u_size; // both zoom feature mapbox: mapbox: mapbox: mapbox: mapbox: bool bool bool main() {\\n #pragma mapbox: initialize fill_color #pragma mapbox: initialize halo_color #pragma mapbox: initialize opacity\\n #pragma mapbox: initialize halo_width #pragma mapbox: initialize halo_blur\\ a_pos = a_offset = a_tex = a_data.xy; a_size = a_data.zw; segment_an = size;\\n\\n && {\\n = mix(a_size a_size[1], u_size_t) / 10.0;\\n } else && {\\n = a_size[0] / 10.0;\\n } else && {\\n = u_size;\\n } else {\\n = u_size;\\n }\\n\\n projectedP = u_matrix * vec4(a_pos 0, 1);\\n = // label pitched map, layout done pitched space,\\n // makes labels distance smaller relative viewport space.\\n // counteract part effect multiplyin perspectiv ratio.\\n // label isn't pitched map, layout viewport space,\\n // makes labels distance larger relative features around\\n // them. counteract part effect dividing perspectiv ratio.\\n distance_r = ?\\n / :\\n / = clamp(\\n 0.5 + 0.5 * 0.0, // Prevents oversized near-field symbols tiles\\n 4.0);\\n\\n *= fontScale = u_is_text ? / 24.0 : size;\\n\\n = 0.0;\\n {\\n // Point labels map' horizontal respect tile units\\n // figure angle projected space, draw short horizontal tile\\n // space, project it, measure angle projected space.\\n = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\\n\\n = / b = / = atan((b.y - a.y) / b.x - a.x);\\n }\\n\\n angle_sin = + angle_cos = + mat2 = -1.0 * angle_sin, angle_sin, projected_ = * 0.0, 1.0);\\n gl_Positio = * / + * (a_offset / 32.0 * fontScale) 0.0, 1.0);\\n gamma_scal = tex = a_tex / u_texsize; fade_opaci = fade_chang = > 0.5 ? u_fade_cha : = max(0.0, min(1.0, + v_data0 = vec2(tex.x tex.y);\\n v_data1 = size, mapbox: ([\\w]+) ([\\w]+) ([\\w]+) \"+n+\" \"+i+\" \"+n+\" \"+i+\" \"+n+\" \"+i+\" \"+a+\" = \"+n+\" \"+o+\" \"+n+\" \"+i+\" \"+n+\" \"+i+\" \"+a+\" = \"+n+\" \"+i+\" \"+a+\" = \"+n+\" \"+o+\" \"+n+\" \"+i+\" \"+n+\" \"+i+\" \"+a+\" = \"+n+\" \"+i+\" \"+a+\" = rr Qe)er(rr); Er(e,r,n){ t=new 0===n&&voi Error(\"fai invert 1;var r(r,n,i){v Jr(t){retu 61:case 107:case 171:case 189:case 109:case positive number, Object keys 'bottom', 'left', 'right', e){var k=m*m;func T(t){var | Error(\"max greater minZoom\"); n=new on;var instanceof ln))throw Error(\"Inv type: 'container String en)t[a]=ne n=new n=new r=new r=new e=new Error(\"max greater current 0===n)retu s 0===n)retu vn(t,e,r){ 27 41\");var device does support fullscreen r){var instanceof e(new r=new r};var l(t){var c(t,s){var s;return n(t){retur t)return 1=0)return specify vertex creation specify cell creation specify phase Invalid boundary s){var l){var c){var \"+n),s?new n=[\"'use b(e,r){var o=\"__l\"+ a=\"__l\"+ n.push(\"va strict\";va strict\";va o(t,e){ret s(){var [2,1,0];}e [1,0,2];}} [2,0,1];}e a.push(\"va 0===r){r=n i=new t||\"up\"in i};var u(t,e){var strict\";va r?r+\"\":\" e=new a(e,a,o){v circular dependency Please, check o=new a?r:functi references a=new references i}return t(e,r){ret \"+r+\"is t[r]}}func a(t,e){ret strict\";va l left Left\",top: top Top\",width width W height W bottom right e=[];retur 0:return r||[];case 1:return 2:return f(t,r){var l};var Array(g),m t-e});var r};var u(t,e){for r=new u=y[a];voi null;retur s=1;a;){va s}};return u(t,n){var n;var v(){if(d){ Zero-lengt segment detected; epsilon probably too small too r=1;r0){va strict\";va extension enabled\"); position, direction, lineOffset lineWidth, scale, scaleFract translate, main() = / pixelOffse = lineWidth * lineOffset + (capSize + lineWidth) * dxy = -step(.5, direction. * error.xz + vec2(-.5)) * position = position + pos = (position + translate) * (positionF + * (position + translate) * (positionF + * += pixelOffse / = vec4(pos * 2. - 1., 0, main() = *= minus src minus dst e)return u=x[c];ret colors cap capsize line-width width position t[0]){var a=0;a 0. && baClipping 0. && abClipping cutoff + .5) -= - .5, cutoff + .5, == 1.) = endCutoff. (distToEnd cutoff + .5) -= - .5, cutoff + .5, = / dashSize) * .5 + .25;\\n\\tfl dash = vec2(t, = *= * opacity * 1\\n\\nattri position, scale, scaleFract translate, pixelRatio id;\\nunifo MAX_LINES = 256.;\\n\\nv main() {\\n\\tfloat depth = (MAX_LINES - 4. - id) / position = position * + translate\\ + positionFr * + + position * scaleFract + positionFr * = vec4(posit * 2.0 - 1.0, depth, = / *= 1\\n\\nvaryi main() = lineWidth lineWidths line-width linewidth width stroke-wid strokewidt linejoin join dashes dasharray dash-array colour stroke colors colours stroke-col fill-color crease overlap close closed-pat hole 1.0 + delta) -= smoothstep - delta, 1.0 + delta, borderRadi = ratio = - delta, borderRadi + delta, = mix(fragCo *= * = 1\\n\\nattri x, y, xFract, size, colorId, scale, scaleFract translate, sampler2D maxSize = fragColor, isDirect = (paletteSi e[0]){for( a;if(t instanceof Uint8Array instanceof s(){functi 5120:n=new 5121:n=new 5122:n=new 5123:n=new 5124:n=new 5125:n=new 5126:n=new null}retur s}var e||(e=new t&&t._elem instanceof g(t){for(v t}function L(t){for(v t=0;return n(t,e){var f}var h=new a=m();retu for(var u(t){var h(t){retur m(e){var a(t,e){for t=0;return a=i[t];ret a||(a=new n(t){if(t i){var a){var c=a[t];ret e?new o=t;t=new e(e,a){if( r){var s})}else if(t n){var n(t,n){ret i(t){retur r.def('\"', o(){functi t=0;return o(e,r){var c=new blend.equa stencil.fu stencil.op viewport scissor.bo minus src minus src minus dst minus dst minus constant minus constant u(){var null;var r(e){var tt(t,l);el t=0;t=r)re n}function u(t){retur e=new \",e);var s=new o;n=-(i+a) i(n(t))};v i}function u(t,e){for r=new r}function x(t){for(v e=m(t);;){ t=T[0];ret w(t,e){var r=T[t];ret T=[],A=new l}else if(c)retur l}else if(c)retur c;return a[0]-s[0]} i(t,e){var t;var r}function i=p.index; strict\";va a(t,e){var o(t,e,r,n) i[e];var unexpected failed parse named argument failed parse named argument mixing positional named placeholde (yet) n(t,r){ret strict\";va Error(\"Fir argument string b=new Array(y),d c)|0 d=new Array(r),g Array(r),v Array(r),m r};var strict\";va valid svg path n;var n=!1;var e=new m=new t(e,r,i){v i=i||{};va \":{data:ne p=new a}function t){var r={};for(v e={};for(v e}(S);func C(t){retur o(t){var e=t1)for(v i})}}var Error(\"n Error(\"alr h(t){retur p(t){retur d(t){retur g(t){retur v(t){retur m(t){retur y(t){retur x(t){retur b(t){retur o?new _(t){retur null}retur t}).join(\" \");var \",\"italic bold \"):\"bold n}function b(t,e){var _(t,e,r,n) n=y(e);ret n?r o?r o&&delete p,d=new al-ahad\",\" {0} {0} {0} {0} mix {0} {1} format date another position name position literal position text found dd M MM d, d M d M d M d M yyyy\",RSS: d M l){y(\"m\"); a=this;ret var _inline_1_ = - var _inline_1_ = - >= 0) !== (_inline_1 >= 0)) {\\n + 0.5 + 0.5 * (_inline_1 + _inline_1_ / (_inline_1 - }\\n r=[];retur 1,1 0,-2A2,2 0,1 strict\";va strict\";va o(t){var s(t,e){var strict\";va o(t,e){var z();var z();var strict\";va t}var a?\"rgba(\"+ i=n(t);ret t){var 0!==i&&voi 0!==a){var strict\";va strict\";va 0;var strict\";va strict\";va r(t,e){var o(t,i){var r}function strict\";va strict\";va f(){var h(t){retur r;try{r=ne strict\";va strict\";va t){var 0!==u,d=vo e=void 0!==x,w=vo 0!==b;retu E=.5;funct C(t,e,r,i) \")}).split \")}).split scale(\"+e+ strict\";va 1,1 0,1 \"+a+\",\"+a+ \"+a+\",\"+a+ \"+r+\",\"+r+ \"+r+\",\"+r+ 1,1 0,1 1,1 0,1 strict\";va l(t,e,r,i) t.id});var o.remove() strict\";va strict\";va strict\";va o(t){retur d(t){var A(t,e,r){v x,b,_=\"top delete T(t,e){ret Array(g);v w(t,e){ret strict\";va T(t,e,r){v t.remove() A(t,e){var t;for(var \";return t}function M(t,e){var S(t,e,r){v if(l){var E(t){var strict\";va y(t,e,r){v x(t,e,r){v i=m(void A=m(void m(t,e,r,n) r[1]}retur o}function y(t){retur strict\";va u(t,e){var v8h2v-8 h8v-2h-8 v-8h-2 if(P){var h2 v-18 v2 h-18 d(t,e,r){v g(t,e){var extra params segment 1,1 0,1 S(t,e){var E(t,e){var C(t,e,r){v L(t,e){var r(r,i){ret strict\";va p(t){retur c(t,e){ret t){var ms \"+t+\" calendar \"+r)}var c=new e=new o*o+s*s}va 0;var n[r];var h(e){var Error(\"No DOM element id '\"+t+\"' exists page.\");re Error(\"DOM element provided null strict\";va f(t,e){var r=t;return c;var e=a(t);ret p(t){retur r=new failed n;function i(){return r={};retur strict\";va property strict\";va instanceof if(!(void c(t,e){ret binary r=e%1;retu strict\";va strict\";va s(t,e){ret error tex O(),void e();var \");var u(){c++;va s=1;s doesnt match end tag . Pretending did unexpected end tag null;var n&&E(n)}va r=void E(t){retur e(t);var C(t,e,r){v i(e,r){ret l(t){var strict\";va n={};funct s e=n[t];ret e&&e.timer n[t];else for(var e strict\";va strict\";va enter Colorscale title\":\"Cl enter Colorscale enter Colorscale title\":\"Cl enter Colourscal %b %e %X %-d, strict\";va previous rejected promises t.scene1); array edits incompatib edits\",f); full array edit if(void & removal incompatib edits same full object edit Error(\"eac index \"+r+\" Error(\"gd. e)throw required Error(\"cur indices equal Error(\"gd. Error(\"upd key:value r)throw Error(\"ind integer array \"+a+\" array length equal indices array Error(\"whe maxPoints key:value object contain 1:1 corrispond keys traces update d t[e]}}func 0);var G(t,e,r){v c Y(t,e){var e){var o $(t,e){var Y r;return l(t){retur c(t,e){var r=0;return t()}}retur m(t){retur addFrames accepts frames numeric names, numbers areimplici cast Error(\"gd. e)throw Error(\"tra t;var t=a[i]}els t=a}}retur t}function k(t){retur T(t){retur t(e){for(v h(){var t=l;return u(),t}retu i=h();for( strict\";va w(t){var x(t,e,r){v t(e,r){for strict\";va d(t){retur Error(\"Hei width pixel Error(\"Ima format jpeg, png, svg webp.\");va g={};funct v(t,r){ret S(){return E(){return strict\";va e}}var strict\";va u=new V(t,e,r){v r;function n(t){retur t.dtick){v error: t+o*e;var dtick dtick Y(t,e){var X(t,e){var 0}function Z(t,e){var zoom back V(t){var strict\";va strict\";va y(t){retur t._id}func S(t){var E(t,e,r){v strict\";va m(t){retur y(t){retur r={},n=0;n g(e,r){var strict\";va o(t,e){var 0===t[r]&& v(t){retur n(t){var i(t){retur strict\";va u(){}var m(t){retur i(t,r){for C(t,e){var z(t,e){var I(t,e){var D(t,e){var strict\";va u(t,e){ret f(t,e,r){v h(t,e){var i(r){var p(t,e){var y(t){retur x(r){var n=e(r);ret d(t,e){var strict\";va strict\";va e=0;e/g,\" l(t){var n=new a(t,e);ret strict\";va Sans Regular, Arial Unicode MS strict\";va r(r,i){ret strict\";va g(t){var v(t){retur p=s.map=ne b(){var - _(t,e){var o(t){for(v i=0;i0){va h l=void delete i[e],delet m d)g[m]||de d[m];for(v y M S(t,e,r){v n=!1;var l(){return t)return e,n,i={};f i}return r=c(t);ret e&&delete I=(new + + + + + + + + + + + + + + + 0px\",\"1px -1px\",\"-1p 1px\",\"1px \"+t+\" W(t,e){ret \"+n+\" \"+n+\" \"+n+\" u=\"t: \"+c.t+\", r: l;var t)r r=e||6;ret t)return null;var r(){var n.mode,del r}};return strict\";va s;function h(r,s){ret i(t,e){ret n=e[r];ret d(t,e,r,n) o(r,n){ret strict\";va D(t){var e={};retur P(t,e){var R(t,e){ret F(t,e){ret N(i,a){var zoom back V(t,e){var \"+d+\" \"+g));var _=(new strict\";va m(t){for(v x(t){retur e}return r;return o;return A(e,r,n){v i}var c(t){var e=o?r:n;re _=0;m(\"per strict\";va strict\";va strict\";va strict\";va 0, 0, strict\";va s(t,e,r){v l(t,e){ret c(t){retur t)return s;s=e+\"0\"i \\xb1 strict\";va s(t,e,r,o) u(t,e,r,a) null;var i=1/0;var a=-1/0;var strict\";va b.tickvals I(n){var D(n){var strict\";va strict\";va strict\";va f(e,r){var e>0&&void converged strict\";va strict\";va strict\";va strict\";va c(t,e){for strict\";va strict\";va invalid specified inequality contours, clipping strict\";va loop contour?\") g(t){retur newendpt vert. perimeter strict\";va if(h){var strict\";va strict\";va strict\";va strict\";va u(r,i){ret strict\";va k(t){retur newendpt vert. perimeter strict\";va a=!1;funct o(r,a){ret s=0;s strict\";va left\",\"top center\",\"t strict\";va strict\";va strict\";va l(r,a){ret strict\";va strict\";va r(r,a){ret strict\";va u(){var strict\";va iterated no strict\";va i.error(\"E hovering heatmap, pointNumbe [row,col], didn't converge strict\";va l=0;la){va d(t,e,r){v P(t,e){ret if(k>0){va F(t,e,r,n) strict\";va strict\";va strict\";va strict\";va p(t){for(v f}function f(t,e,r,i) v(t){retur strict\";va strict\";va h(r,i){ret strict\";va u(t,e,r,i) t.color}); -1px 2px, \"+I+\" 2px, \"+I+\" -1px 2px, \"+I+\" -1px -1px 0, f(t){retur t.key}func h(t){var p(t,e){ret \"Courier New\", \"));var \"Courier New\", \\u2229 \"+p+\"): | color): | \"+p+\"): \"Courier New\", r=[];retur S(t){var z(t){for(v \";return P(t){var u f(t){var h=new y,x=new strict\";va strict\";va strict\";va c(t,e){ret f(t,e){ret w(t,e){ret T(t){for(v strict\";va strict\";va o(t){retur traces support \"+u+\" dimensions strict\";va 1\\n\\nattri p0, p1, p2, p3,\\n p4, p5, p6, p7,\\n p8, p9, pa, pb,\\n pc, pd, pf;\\n\\nuni dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D,\\n loA, hiA, loB, hiB, loC, hiC, loD, resolution sampler2D sampler2D mask;\\nuni unit_1 = vec4(1, 1, 1, 1);\\n\\nflo val(mat4 p, v) {\\n v) * unit_1, axisY(\\n x,\\n d[4],\\n dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D\\n ) {\\n\\n y1 = val(d[0], dim1A) + val(d[1], dim1B) + val(d[2], dim1C) + val(d[3], dim1D);\\n y2 = val(d[0], dim2A) + val(d[1], dim2B) + val(d[2], dim2C) + val(d[3], dim2D);\\n y1 * (1.0 - x) + y2 * x;\\n}\\n\\nc int bitsPerByt = 8;\\n\\nint mod2(int a) {\\n - * (a / 2);\\n}\\n\\n mod8(int a) {\\n - 8 * (a / 8);\\n}\\n\\n zero = vec4(0, 0, 0, 0);\\nvec4 unit_0 = vec4(1, 1, 1, 1);\\nvec2 xyProjecti = vec2(1, 1);\\n\\nmat mclamp(mat m, lo, hi) {\\n lo[0], hi[0]),\\n clamp(m[1] lo[1], hi[1]),\\n clamp(m[2] lo[2], hi[2]),\\n clamp(m[3] lo[3], mshow(mat4 p, lo, hi) {\\n mclamp(p, lo, hi) == p;\\n}\\n\\nb d[4],\\n loA, hiA, loB, hiB, loC, hiC, loD, hiD\\n ) {\\n\\n mshow(d[0] loA, hiA) &&\\n mshow(d[1] loB, hiB) &&\\n mshow(d[2] loC, hiC) &&\\n mshow(d[3] loD, d[4], sampler2D mask, height) {\\n bool result = true;\\n int valY, valueY, scaleX;\\n int hit, bitmask, valX;\\n for(int = 0; T(t,e,r){v E(t,e){ret 255, 255, 0)\");var E(t,e){for #fff, -1px -1px #fff, -1px #fff, -1px strict\";va 0===l[s]){ i(t,e,r){v strict\";va left\",\"top center\",\"t right\",\"mi left\",\"bot left\",\"top center\",\"t right\",\"mi left\",\"bot strict\";va strict\";va u(t){retur f(t,e){var c;var g(t,e){ret v(t,e){var m(t,e){var y(t,e){var x(t){var r}function b(t,e){for strict\";va strict\";va strict\";va strict\";va 0, for(r=new P=!1;retur r=c(e);ret strict\";va r(r,a){ret p(r,a){ret m(t,e){ret _(t,e){ret strict\";va y(){var t=.5;retur \"+i.target \"+i.target \"+c+\",\"+h+ \"+l+\",\"+f+ k(t){retur 0)\":\"matri 0)\")}funct M(t){retur S(t){retur 0)\":\"matri 0)\"}functi E(t){retur 1)\":\"scale 1)\"}functi C(t){retur L(t){retur O(t,e,r,a) o(){var strict\";va v(r,i){ret strict\";va strict\";va strict\";va H(e){var q(t,e,r,n) st(t,e){re 0)}functio s}}functio ct(t){var strict\";va strict\";va strict\";va y(t){retur $(t){retur J(t){retur K(t){retur Q(t){retur t.id}funct Q}function scatter strict\";va y(t){retur x(t,e){ret b(t){retur p[t]}funct o=0;o=0){v o}function k(t,e){var = strict\";va strict\";va f(t,e){var strict\";va d(r,i){ret 1/0;var u(t){retur strict\";va s=a[0];if( a;var strict\";va c=l[0];if( l;var strict\";va strict\";va strict\";va strict\";va strict\";va d(t){var g(t,e){var g(t,e){var h.remove() d}}(t);ret x(t,e){var r;return k(t){retur T(t,e,r){v A(t,e,r){v r;return strict\";va o(t,e,r){v strict\";va strict\";va strict\";va r}function strict\";va t/E*m});va r=A[t];ret strict\";va r&&r.match strict\";va s(r,a){ret m=(\" function() e,r})}func I(t,e){for r}function D(t,e){for g(t){retur strict\";va a=!1;funct o(r,a){ret strict\";va e=h(t);ret e=h(t);ret e=h(t);ret e=h(t);ret = 'local'}; {font: (typeof require !== 'undefined { paths: { 'plotly': } }); { window._Pl = Plotly; }); } In\u00a0[3]: def payload): url = response = requests.g url=url, params=pay ) == 200: # - success!') else: None In\u00a0[4]: payload = { 'metrics': 'PriceUSD, 'TxTfrValU 'start': '2016-01-0 } # PriceUSD TxTfrValUS utilised yet. needs expanded order complete, keep here now. asset_list = ['btc', 'ltc', 'bch', 'bsv', 'doge'] = {} asset asset_list data[asset = payload) In\u00a0[5]: dataframes = {} cols = ['PriceUSD 'TxTfrValU asset data.keys( values = [ each['valu index = [ each['time df = columns = cols) df.index = col df.columns df[col] = # fields df['TxCoun = df.TxTfrVa / = / = df In\u00a0[6]: # take look wrangled data: Out[6]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } PriceUSD TxTfrValMe TxTfrValUS TxCount 2019-07-14 131.077983 1198.88905 0.879414 1.194010e+ 99593.0000 1363.28177 2019-05-29 193.318255 11679.3278 39.889202 5.360111e+ 45894.0000 292.794223 2019-03-28 63.633667 4749.33232 2.107293 6.684210e+ 14074.0000 2253.75966 2018-12-06 104.833018 47784.4041 25.002851 4.480266e+ 9376.00000 1911.15821 2019-08-20 145.397527 403.290224 1.017783 4.721077e+ 117063.999 396.243941 Out[6]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } PriceUSD TxTfrValMe TxTfrValUS TxCount 2018-09-17 6259.37814 6375.29005 63.354108 3.529992e+ 553699.0 100.629466 2018-03-08 9334.33005 13564.9724 115.393462 6.573545e+ 484597.0 117.554082 2018-09-18 6341.49459 6596.25081 65.237872 3.774480e+ 572216.0 101.110760 2017-10-18 5577.94935 12797.5675 68.015674 1.002400e+ 783274.0 188.156154 2018-01-21 11392.3086 13715.3752 161.642277 8.149868e+ 594214.0 84.850173 Out[6]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } PriceUSD TxTfrValMe TxTfrValUS TxCount 2018-02-17 0.007081 2667.70915 1.382312 1.623514e+ 60858.0 1929.88930 2019-02-26 0.001952 353.988959 0.807753 2.240715e+ 63299.0 438.239326 2019-03-22 0.002017 200.227768 0.443784 1.414069e+ 70623.0 451.182435 2018-08-14 0.002247 184.665415 0.516715 1.255374e+ 67981.0 357.383769 2017-04-09 0.000385 235.941139 0.234514 9.458172e+ 40087.0 1006.08471 Compare daily mean median USD transactio BTC since January 2016\u00b6 In\u00a0[7]: btc_mean = go.Scatter name='BTC mean', ) btc_median = go.Scatter name='BTC median' ) = [btc_mean, btc_median layout = go.Layout( title=\"BTC median mean transactio values day\", value'), ) fig = layout=lay py.iplot(f Out[7]: chart above shows\u00a0that daily mean transactio higher daily median two averages are\u00a0correl 2016 present, mean approximat orders magnitude higher median. relationsh appears consistent across previous 4 years. Note: During last 4 years, USD BTC increased ~400USD currently ~10000USD. impact changing USD price coins mean median investigat easily achieved TxTfrValUS PriceUSD metrics. calculate Plot ratio daily mean median USD transactio values asset since January 2016\u00b6 In\u00a0[8]: def name): go.Scatter name=name ) = asset) asset layout = go.Layout( title=\"Rat daily mean median transactio value\", ) fig = layout=lay py.iplot(f Out[8]: Note: Except BTC, series above very \u201cchoppy\u201d. chart shown clients consider smoothing series e.g. 7 moving average. However, might obscure features initial exploratio chart above shows BTC lowest ratio mean median daily transactio value. suggests compared blockchain relatively strong organic\u00a0us less influenced by\u00a0whales. MMR lower Point suggests wide regular user base total daily transactio volumes analysed across 5 chains futher strengthen rebutt ratio proxy measure organic use, chain second organic is\u00a0Litecoi Since start 2019, influence whales Dogecoin network two contentiou hard forks, Bitcoin Cash shows two distinct phases different in\u00a0each: inception August 2017 November 2018, influence whales increased steady rate. coins genesis, appears large organic user base transactin daily, bringing median transactio within 50 - 100x mean daily transactio value. lower Bitcoin\u2019s, had consistent higher MMR 120 -\u00a0200. After November 2018, ratio increases average approximat 500 approximat 10,000. stark abrupt change daily ratio, suggests that\u00a0eithe organic drasticall decreased, BCH very suddenly started facilitate very large transfers relatively few\u00a0users. January 2019, Dogecoin appears widespread organic either BCH BSV, despite status \u201cjoke\u201d blockchain However DOGE had higher MMR BTC LTC in\u00a02019. Next Steps\u00b6This brief investigat developed over course afternoon, project brief recommendi 4 hours work. order applied commercial context, analyis expanded tested least Test central assumption analysis true. Possible approaches could\u00a0incl Removing exchange outflows data. done known exchange addresses (exchanges aggregate organic retail Quantifyin influence \u201cchange\u201d transactio - aggregate nil day-to-day \u201ccash\u201d transactio whales moving entire balance address no \u201cchange\u201d amount. Depending metric calculated may may BTC LTC, lightning networks distorting results hiding organic low BTC, liquid sidechain hiding activity whales extent \u201chealthies 5 infer where whales \u201cnormal\u201d users live, analyzing transactio People likely transactio midday midnight, investigat geographic clustering e.g. BTC \u201cwestern\u201d chain, whilst BCH organic in\u00a0Asia? analysis daily transactio volume (in USD terms) essential analysis. provide context interpret significan difference chain difference bewtween time\u00a0frame Similarly, comparing hash power dedicated mining blocks chain indicate commercial interests, abrupt changes hash power possibly correlated changes mean-media ratio (MMR). { var mathjaxscr = = = = ? \"innerHTML : \"text\")] = + \" config: + \" TeX: { extensions { autoNumber 'AMS' } },\" + \" jax: + \" extensions + \" displayAli 'center',\" + \" displayInd '0em',\" + \" showMathMe true,\" + \" tex2jax: { \" + \" inlineMath [ ['$','$'] ], \" + \" displayMat [ ['$$','$$' ],\" + \" true,\" + \" preview: 'TeX',\" + \" }, \" + \" 'HTML-CSS' { \" + \" linebreaks { automatic: true, width: '95% container' }, \" + \" styles: { .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important' }\" + \" } \" + \"}); \"; (document. || }"},{"title":"A faster\u00a0shell","url":"shell.html","body":"Opening shell annoyingly slow. terrible, enough notice. a\u00a0niggle. wanted find components causing delay, measure long took launch shell. Even though shells might appear part low level \u2018guts\u2019 computer, shell just executable treated as\u00a0such. measure startup speed shell,\u00a0do: $(seq 10); /usr/bin/t $SHELL -i -c exit; done shows takes 0.84 seconds start zsh - terrible, not\u00a0great: compare performanc different shells replacing $SHELL zsh, bash, fish etc. Here results BASH instead zsh - 9.3x faster! (but without useful tools plugins): Now measure long takes start, useful know proccesses causing greatest delays. done something zsh -xv enables verbose output xtrace. creates tonne output, doesnt inlcude timestamps really summary subprocces required run, i.e. order Add zmodload zsh/zprof start .zshrc zprof very end. Now start zsh see the\u00a0follow Next steps - run faster, asyncronou at\u00a0all\u2026 Update: biggest cause slow loading. lazy loading option decreased loading by\u00a00.3s"},{"title":"Bitcoin\u00a0Lightning","url":"bitcoin-lightning.html","body":"largest obstacles (second privacy opinion) widespread adoption Bitcoin limited volume. Bitcoin cannot faciliate payments fast enough such compete Visa or\u00a0Masterc interestin solution problem Lightning protocol - separate protocol sits ontop Bitcoin protocol (a so-called \u2018Layer 2\u2019 solution). Lightning uses hashed locked contracts (HTLCs) trustlessl privately move transactio off-chain. allows payments faster, cheaper frequent. interestin implicatio lot resources Lightning network is, why neccesary works. several guides available maintain node. Raspberry Pi external hdd. took few attempts, mostly first working unix operating system tried move swap disk wasnt formmated as\u00a0ext4\u2026 Anyway, opened closed channels, connected peers, made transactio even bought stickers find node these\u00a0deta Alias: Public Key: IP address: 85.145.183 Port: 9735 Lightning Lightning Interestin things to\u00a0do"},{"title":"Sync a BTC node,\u00a0quickly","url":"sync-bitcoin-core-node.html","body":"order run own bitcoin node, lightning node, you\u2019ll download entire bitcoin blockchain validate it. takes ages magnetic disk due random access speed contents remove bottleneck move chainstate directory SSD (its few GB) symlink bitcoin directory. details Bitcoin wiki. sync complete, replace symlink actual"},{"title":"Bakke-Rij","url":"bakkerij.html","body":"recently began working coworking space, sharing office unit another entreprene makes coworking space unique conversion industrial bakery coworking space. Where machinery once stood, converted shipping containers glass walls become offices startups skylights, glass walls bright colors light airy atmosphere space seems popular designers founders working creative industries energetic space creative feel to\u00a0it."},{"title":"Prediction\u00a0Markets","url":"prediction.html","body":"Predicting port traffic Background prediction market allows people bet unknown future event. example, \u201cWhat Euro-Dolla exchange rate date\u00a0X?\u201d. several common forecastin scenarios, prediction markets accurate polls, expert opinions, statistica methods1 therefore prediction models useful observers (anybody who interested outcome) just market\u2019s participan Prediction markets categorica events (a specific event either does doesn\u2019t happen) scalar events (when outcome range values). predefined source truth outcomes predicted called an\u00a0Oracle. Prediction markets enables participan purchase shares tokens tied outcome specific future event. Once event occurred, holders tokens representi actual outcome receive reward predefined value. creates incentive hold tokens correspond correct outcome, market dynamics supply demand allow price reflect perceived probabilit different outcomes. Helpfully, price token correspond relative probabilit outcome occurring allows simple interpreta results. reward holding share correspond correct outcome $1, present price share 50 cents, market\u2019s estimate likelihood outcome occurring is\u00a050%. Shares traded continuous trading occurs over probabilit different outcomes change informatio becomes known, changing price shares quantify\u00a0t An\u00a0example Let\u2019s describe an\u00a0example large degree uncertaint around Britain continue trade European countries exits EU March 29, 2019. prediction market likely better predictor outcome any other\u00a0meth adequate agreement isn\u2019t achieved, Britain\u2019s port Dover certainly experience long delays large traffic jams. Therefore prediction market asking \u201cHow vehicles admitted Britain port Dover 00:00 23:59 March 29 2019?\u201d give useful prediction outcome Britain\u2019s trade negotiatio - component sticking point token prediction market correspond different quantities vehicles entering port3 - example four (or more) categories Less 8000, 8000 11000, 11000 14000, 14000. relative price share category correspond relative probabilit vehicles lower otherwise expected, (around 12000) likely due impact Brexit thus market serve useful proxy predicting kind Brexit will\u00a0occur Stakeholde incentives are\u00a0aligne reason prediction markets well aggregate informatio disparate sources price shows impartial assessment likely outcome aggregated level confidence participan have. Since no obliged participat those believe valuable informatio gives competitiv advantage. creates mechanism moves quality informatio prediction market, resulting prices reflecting probabilit range of\u00a0outcome our example, people relevant informatio include port employees, business owners UK Europe, politician civil servants, business analysts, bankers, etc. Whilst clear any these roles may useful informatio judgement outcome, clear useful participan role relative others. allowing participan bid shares different categories want, participan confidence informatio be\u00a0quantif way, prediction markets align incentives market participan observers. market large enough becomes prohibitiv expensive distort market promote poor quality informatio including informatio designed FUD (Fear, Uncertaint Doubt), fake news, Prediction markets nothing new, political betting prediction early 1500s. However adoption internet decentrali networks now allow prediction markets widely cheaply ever before. Gnosis building platform Ethereum blockchain others build applicatio harness power lowering cost complexity creating prediction market, observers benefit high quality impartial predictive informatio future events, market participan rewarded accurate assessment likely outcomes. enable better decision making empower observers previously unobtainab insight. our example, market created funded any organisati benefit knowing results prediction market. port Dover itself, news organisati market research firms. Any these businesses benefit K. J. Arrow, R. Forsythe, M. Gorham, R. Hahn, R. Hanson, J. O. Ledyard, S. Levmore, R. Litan, P. Milgrom, F. D. Nelson, G. R. Neumann, M. Ottaviani, T. C. Schelling, R. J. Shiller, V. L. Smith, E. Snowberg, C. R. Sunstein, P. C. Tetlock, P. E. Tetlock, H. R. Varian, J. Wolfers, E. Zitzewitz. promise prediction markets. Science, 320(5878), 2008.\u00a0\u21a9 example"},{"title":"Reading: April\u00a02018","url":"reading-april-2018.html","body":"Articles Mental models comprehens list organised around different discipline long read probably easy apply tangibly useful articles read\u00a0recen Life short - life actually short, always time, no matter could\u00a0have Invisible asymptotes - well written long look various facets Factors scratch - Investing: unified framework explain factors\u00a0wo tragic - \u201c\u2026But think highlights potential disconnect mental health & business, publicity & success, success & happiness. internet seem intimate ultimately thin individual Vim after 15\u00a0years Cryptocurr regulation around the\u00a0world 2008 financial crisis - \u201cI\u2019m sure possible action both necessary disaster, essence Podcasts Jill Carlson \u201cWhat Bitcoin Did\u201d podcast. \u201cFor first no longer monopoly creation monetary systems, really Bitcoin\u00a0Di Georges St-Pierre Joe Rogan podcast. long candid conversati world\u2019s best\u00a0athle Ricardo Spagni a.k.a Fluffypony Monero vs Bitcoin, EOS, current bear market, Tari, and\u00a0ASICs. Resources Lots data\u00a0sets"},{"title":"Ry\u2019s Git\u00a0Tutorial","url":"rys-git-tutorial.html","body":"tracking changes collection files, Git ubiquitous solution. free, robust, comprehens plethora resources easy to\u00a0find. usually find commands difficult remember though, concepts Git built often seem me. means spend lot searching answers trying remember Git experiment project without fear losing any hard won\u00a0progre Ry\u2019s Git Tutorial Ryan Hodson best way learn Git come across. simple, practical, clear. reader learns Git yy creating maintainin simple website. gives Git commands meaningful context, makes lot easier remember the\u00a0future tutorial first published 2012 website originally hosted examples no longer exists. tutorial chapter starts link download project files point, reader doesn\u2019t start beginning jump any part guide. Unfortunat these links dead\u00a0now. Therefore I\u2019m hosting tutorial here continues useful. author touch, please do. I\u2019d keep great resource available others benefit from\u00a0it. Download .epub here Download example files module\u00a0bel Chapter 2: Chapter 3: Branches\u00a0I Chapter 4: Branches II Chapter 5:\u00a0Rebasin Chapter 6: Chapter 7:\u00a0Remotes Chapter 8: Chapter 9: Chapter 10: Chapter 11: Tips &\u00a0Tricks Chapter 12:\u00a0Plumbi end"},{"title":"How to buy\u00a0Bitcoin","url":"buying-btc.html","body":"Recently few friends asked buy Bitcoin. I\u2019m financial advisor, here few things come to\u00a0mind: invest can\u2019t afford to\u00a0lose. price falls 50%, able wait whilst Write down the\u00a0follow afford invest? Consider cash over next year, long take recover any losses,\u00a0et long invest\u00a0for profit make? identifyin ignoring following, even your\u00a0frien Hype Fake\u00a0news Fear, Uncertaint Doubt (FUD) trust previous point really important, putting something care risky situation (it risky) experience anxiety excitement control psychology identity people trying manipulate you. useful areas of\u00a0life. Investing mental exercise money intensely psychologi quality it, crypto currencies intense trading experience right\u00a0now. Almost no clue what\u2019s happening. Convention economists traders certainly don\u2019t. rules haven\u2019t worked yet. We\u2019ve never had tech before, internet made everything - communicat innovation - quicker. powerful combinatio factors haven\u2019t seen play out\u00a0before Take read fundamenta understand tech can. Think why people behave certain ways makes bitcoin useful, not. started today, take some\u00a0time. YouTube tonne videos, these two sites detailed: lopp.net Twitter lot current informatio lot bots scammers spreading hype FUD (see point\u00a04). you\u2019re going lose sleep over investment invest\u00a0les buy high. research, wait price correct. Prices fall. chart top page shows 20 55 moving average compared daily price. opinion early January price returned 20 55 average before beginning rise\u00a0again Coinbase user friendly reputable exchange, exchanges\u00a0 financial decisions you\u2019re feeling rushed. Check you\u2019ve bought Bitcoin store exchange. Transfer wallet control. own private key, own asset. know means, google (Point\u00a08). Leave comment think missed something you\u00a0disagr"},{"title":"Live near the\u00a0ocean","url":"ocean.html","body":"California Dorset Acapulco Dublin"},{"title":"Pangea","url":"pangea.html","body":"The\u00a0proble countries ability legally binding agreements available average citizens. Legal services often unaffordab opaque, service providers corrupt. Legal services of\u00a0disrupt The\u00a0soluti Pangea Bitnation (who consult for) intends address problem empowering people self-organ self-gover building platform called Pangea allows users create, notarise arbitrate contracts according jurisdicti party joins voluntaril irrespecti Pangea smart phone app looks feels chat app, back-end (called Panthalass encrypted mesh network hooked Rewarded doing good, empowered Pangea, people incentivis citizens receiving rewards doing good, rather coerced threat punishment bad\u00a0behavi platform fulfil vast unmet need, particular countries whose legal systems poorly. Pangea, user voluntaril chooses jurisdicti part of. Contracts notarised, executed arbitrated according jurisdicti Users voluntaril join decentrali borderless voluntary nation (DBVN) receive tokens (Pangea Arbitratio Tokens) reward behaviour. tokens tradable payment Pangea notarisati Combining store access legal\u00a0serv Societies cannot escape currency stores value. cannot escape reliable enforceabl agreements (contracts each\u00a0other Generating Bitcoin through proof occurs individual believe Bitcoin continuous \u2014 meet ongoing transact decentrali Generating PAT citizen occur individual believe Pangea continuous \u2014 meet ongoing enforceabl agreements voluntary geographic agnostic (and Comments still say Pangea platform mechanisms function. Please give feedback ask questions comments. find more, visit website."},{"title":"Bitcoin compared to\u00a0gold","url":"bitcoin-vs-gold.html","body":"safe haven asset something buy during economic uncertaint Historical safest asset buy gold. anything inherently special gold, people believe best long term method storing\u00a0va People believe gold special assume future people believe it\u2019s\u00a0speci Criteria safe haven\u00a0asse safe-haven asset fulfil Price isn\u2019t controlled any single party, including state bank. market spread beyond reach any organisati important asset issued, controlled backed organisati tied health Supply isn\u2019t controlled any single party, including state, bank anyone else - exists naturally rate produced traded beyond control any Supply limited. effort required asset naturally limits the\u00a0supply asset doesn\u2019t wear or\u00a0expire. prohibitiv expensive to\u00a0fake. Almost everyone considers precious and\u00a0valuab stored transporte simply. delicate or\u00a0volatil these reasons, historical consensus, people happy gold store times economic uncertaint long durations. assets meets these requiremen Bitcoin compared to\u00a0gold Consider why gold safe haven asset long term store. reasons above, bitcoin better, except one: present, people consider precious valuable, market small. change confidence awareness increases, eco-system services fundamenta decentrali network ensures Bitcoin can\u2019t regulated controlled single government organisati network can\u2019t turned off or\u00a0control present future rate supply publicly available inviolable increases market efficiency creates rational pricing market where rate supply Supply naturally limited proof Bitcoin doesn\u2019t corrode wear\u00a0out. Bitcoin impossible to\u00a0fake. Bitcoin stored transporte easily gold. - remember 24 words transport bitcoin effortless where ever you\u00a0go. Read\u00a0more article, published week after wrote post, looks different factors consider evaluating Bitcoin\u2019s value. goes lot detail, relative seen"},{"title":"Hardware\u00a0Wallets","url":"wallet.html","body":"hardware wallet (HW wallet) physical device stores informatio required access digital currency assets. plugged computer via USB order initiate confirm transactio Bitcoin, Ethereum digital asset secure method storing cryptograp data. secure compromise computer. needed access funds HW wallet (in addition device itself) PIN user chooses. single HW wallet store multiple currencies HW wallets easier solution rememberin password, safer storing computer or\u00a0online. best known hardware wallet brands Ledger Trezor. The\u00a0proble HW wallets technicall great, shape creates bad user experience hardware wallet convenient multiple times day, credit card\u00a0is. Current hardware wallets fit (money) wallet people carry any objects pockets. too big bad\u00a0shape. HW wallets look might belong keyring, inconvenie insecure attach credit card keyring same true HW wallet. might store keys hook door, never leave wallet overnight. often keep keys money separate keys I\u2019m near house, where buy stuff, money I\u2019m away house where keep bank cards cash together safe place, carry around dongle well. easier separate dongle lost stolen something fit next credit card wallet. inconvenie barrier enjoying advantages The\u00a0goal HW wallet shape credit card, times thicker credit card still fit wallet. It\u00a0needs display - low resolution b&w\u00a0displa two more\u00a0butto plug USB\u00a0port securely sign transactio"},{"title":"Trading digital\u00a0assets","url":"algo-trading.html","body":"Table data3\u00a0\u00a0For data4\u00a0\u00a0Ass - \u00a34.2\u00a0\u00a0Ethe - \u00a34.3\u00a0\u00a0Ethe - - \u00a34.5\u00a0\u00a0Lite - BTC5\u00a0\u00a0SMA gains w/ different SMA through combinatio sma1 sma26\u00a0\u00a0Nex steps: In\u00a0[1]: HTML code_toggl { (code_show } else { } code_show =! code_show } $( document analysis made Python. you'd see used, click =0);v t&&t>=0);v a(1);for(v t&&t>=0);v works positive a(0),mod:n a(0)};var i,o,s;retu i=new a(1),o=new a(0),s=new a(0),l=new i=new a(1),o=new f;return A[t];var p;else m;else Error(\"Unk prime \"+t);e=new g}return works works red works works red l}}}functi s(t){retur l(t,e){ret 1:return s(t);case 3:return Invalid n(t,e,r){v \"+r);var n(t,e){var i=\"for(var i=n[t];ret var P=C+1;PZ)t typed array length\");v e=new e)throw Error(\"If encoding specified first argument l(t)}retur t)throw argument instanceof t)throw argument allocate larger maximum size: bytes\");re 0|t}functi instanceof 0;for(var 0:return v(t,e,r){v n=!1;if((v hex E(n)}funct E(t){var access beyond argument a}function U(t){for(v a}function H(t){retur i}function Y(t){retur t!==t}var t=new browser lacks typed array (Uint8Arra support required `buffer` v5.x. `buffer` v4.x require old browser 0;for(var ... range 0;for(var 0)}var write outside encoding: Error(\"Inv string. Length multiple i(t){retur a(t){var o(t){retur i(t,e){ret a(t,e){for i(g,d,v,h) n(t){var i(t,e){for r=new s}function m(t,e,r){v i=new n(t){var strict\";va t;var Error(f+\" map requires nshades least i(t,e,r,i) 0}return n(t,e){ret t-e}functi i(t,e){var 0:return 0;case 1:return t[0]-e[0]; 2:return 3:var i;var 4:var n(t){var t}function i(t){retur a(t){retur o(t){retur null}var null;var a}return a}return i(t){var e=new i=0;i0)thr Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array args\")}els Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array index\")}el Error(\"cwi Too arguments pre() Error(\"cwi Too arguments body() Error(\"cwi Too arguments post() block\");re n(t,e,r){v l(t,e){for w=new cwise routine n(t){var e=[\"'use strict'\",\" (!(\"+l.joi && \")+\")) throw Error('cwi Arrays same {\"),e.push (!(\"+u.joi && \")+\")) throw Error('cwi Arrays same i(t,e,r){v m,v=new t;var e=[];for(v e=[];for(v e=[];for(v n&&void e(t,e){var r}function r(){}funct n(t){var e;return y(t){retur b(t){retur Error(\"unk type: i(t,e){for r,n,i=new i(){if(s){ t(t){var r(t){var Array(o),l this;var 1:do{o=new 2:do{o=new 3:do{o=new t=[];retur s(){var l(){for(va a(t){retur n}}}functi l(t){retur u(t){for(v e}function c(t,e){for p(t){retur f(t)in this._&&de v(){var t=[];for(v e t}function g(){var t=0;for(va e t}function y(){for(va x(t){retur t}function function() w(t,e){if( t)return Z(t,e){ret J(t,e){var K(t){var vt(t){retu gt(t){retu yt(t){retu _t(t){retu wt(t){retu kt(t,e,r){ Ot(){for(v t}function Ft(){for(v Nt(t){var b=u&&h;ret Bt(t){retu t+\"\"}funct n(e){var e}function Gt(t,e,r){ le(t){var ce(t){for( ge(t){var ye(t,e){re we(t){var ke(t,e){re y}}functio Fe(t){retu Re(){var r=e;return r(t){var a(t,e){ret o(t,e){var l(t){for(v c(i,a){ret Je(){funct s}function 1,1 1,1 $e(){funct t(t,n){var er(){funct t(t,e){var rr(t){func s}function nr(t){func r(e){retur n(e){funct a(r,n){var k}function ir(t){var sr(t){retu t})()}func lr(t){func e(t){retur i(){return ur(t){retu r(t,e){var Vr(t,e){va n;var s;var Hr(t,e){va Vr(r,e);va Gr(t){for( r}function wn(t,e){va kn(t){retu An(t){retu 1;var Zn(t,e){va n}function bi(t){retu xi(t,e){re _i(t,e){re Ei(t){func Ni(t){retu t.y})}func Bi(t){retu Ui(t){var Vi(t){var qi(t,e){va a(t){retur o(t)}var o,s;return Qi(t,e){re $i(t,e){re a(t){retur o(e){retur t(i(e))}re _a(t){func e(e){funct Ma(t){retu ka(t){for( Aa(t){for( p[n]:delet t[r],1}var io(t){retu n(e){retur t(e)}funct i(t,r){var r};var t;var e=new b;if(t)for h(){functi f(){functi t(){var r(){var n(){var o;if(i)ret i=!1,a;var e=new ms={\"-\":\"\" %b %e %X this.s}};v bs=new e(e,r){var t(){var e(){return }var t(e,r,n,i) c}function e(t){for(v r}function t(t,a){var t(t,e){for i(t,e,r,n) \"+e}functi 0,0 \"+n}var t(t,i){var \"+l[2]+\" \"+l[3]}var 0,\"+e+\" \"+e+\",\"+e+ a(){functi v(){var l;var t;e||(e=t) e}function s(t){var l(t,e,r,n) u(t,e,r){v n=t;do{var n}function l=t;do{for h(t,e,r,n) r}function m(t,e,r,n) v(t){var t}function x(t,e){ret w(t,e){ret k(t,e){var A(t,e){ret n(t,e){var e){e=0;for warning: possible EventEmitt memory leak detected. %d listeners added. increase function\") n=!1;retur e=typeof o(t,e,r,n) \"+i+\"=== typeof s(t,e){ret e.length> 1; (a[m] === v) true; (a[m] > v) j = m - 1; else = m + 1;}return false; }(\"+n+\", u(t){retur p\"}functio h(t,e){ret c[1]){var s[e][t];va i(t){retur a(t,e){ret r}var 0)}functio d(t){for(v m(t){retur t=[];retur t=[];retur 1:return 2:return this.tree; e=new i=0;i0)ret Error(\"Can update empty node!\");va r=new s(t){for(v z%d-%d-%d (features: %d, points: %d, simplified down parent tile down\");var i(t,e,r){v s}function i(t,e,r,n) s(t,e){var r=new i(t);retur e(e,r,n){i t){var U=g,V=_,k= 0.0) {\\n nPosition = mix(bounds bounds[1], 0.5 * (position + 1.0));\\n gl_Positio = projection * * * 1.0);\\n } else {\\n gl_Positio = }\\n colorChann = 1\\n\\nunifo main() {\\n gl_FragCol = colorChann * colors[0] + \\n colorChann * colors[1] +\\n colorChann * vectorizin d=new o(t,e,r,n) s;var r}function a(t,e){for r=0;rr)thr resizing buffer, specify a(t,e){for Invalid webgl buffer, either Invalid usage buffer, either gl.STATIC_ t&&void Cannot specify resizing Error(\"gl- Can't resize FBO, invalid Error(\"gl- Parameters too large Error(\"gl- Multiple draw extension Error(\"gl- Context does support \"+s+\" draw buffers\")} Error(\"gl- Context does support floating point h=!0;\"dept Error(\"gl- Shape vector length 2\");var null;var 0.25) {\\n discard;\\n }\\n gl_FragCol = 1\\n\\nattri aHi, aLo, pick0, scaleHi, translateH scaleLo, translateL pickA, scHi, trHi, scLo, trLo, posHi, posLo) {\\n (posHi + trHi) * scHi\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * main() {\\n p = translateH scaleLo, translateL aHi, aLo);\\n = width * * vec2(dHi.y -dHi.x)) / gl_Positio = vec4(p + n, 0, 1);\\n pickA = pick0;\\n pickB = 1\\n\\nunifo pickA, pickB;\\n\\n main() {\\n fragId = 0.0);\\n if(pickB.w > pickA.w) {\\n fragId.xyz = pickB.xyz; }\\n\\n fragId += fragId.y += floor(frag / 256.0);\\n fragId.x -= floor(frag / 256.0) * 256.0;\\n\\n fragId.z += floor(frag / 256.0);\\n fragId.y -= floor(frag / 256.0) * 256.0;\\n\\n fragId.w += floor(frag / 256.0);\\n fragId.z -= floor(frag / 256.0) * 256.0;\\n\\n gl_FragCol = fragId / 1\\n\\nattri aHi, aLo, scaleHi, translateH scaleLo, translateL projectVal scHi, trHi, scLo, trLo, posHi, posLo) {\\n (posHi + trHi) * scHi\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * main() {\\n p = translateH scaleLo, translateL aHi, aLo);\\n if(dHi.y e+n;var null;var FLOAT_MAX) {\\n vec4(127.0 128.0, 0.0, 0.0) / 255.0;\\n } else if(v \"+t[1]+\", \"+t[2]+\", t=new e=new r=new \"+t[1]+\", n=\"precisi 1\\n\\nunifo f_id;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n gl_FragCol = vec4(pickI 1\\n\\nattri position, uv;\\n\\nuni model\\n , view\\n , eyePositio , f_normal\\n , , , f_uv;\\n\\nv main() {\\n m_position = * vec4(posit 1.0);\\n t_position = * m_position gl_Positio = projection * t_position f_color = color;\\n f_normal = normal;\\n f_data = position;\\ f_eyeDirec = eyePositio - position;\\ = lightPosit - position;\\ f_uv = 1\\n\\nfloat x, roughness) {\\n NdotH = max(x, 0.0001);\\n cos2Alpha = NdotH * NdotH;\\n tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha; roughness2 = roughness * roughness; denom = * roughness2 * cos2Alpha * cos2Alpha; exp(tan2Al / roughness2 / roughness, fresnel) {\\n\\n VdotN = 0.0);\\n LdotN = 0.0);\\n\\n //Half angle vector\\n H = + //Geometri term\\n NdotH = H), 0.0);\\n VdotH = H), 0.000001); LdotH = H), 0.000001); G1 = (2.0 * NdotH * VdotN) / VdotH;\\n G2 = (2.0 * NdotH * LdotN) / LdotH;\\n G = min(1.0, min(G1, G2));\\n \\n //Distribu term\\n D = //Fresnel term\\n F = pow(1.0 - VdotN, fresnel);\\ //Multiply terms done\\n G * F * D / max(3.1415 * VdotN, roughness\\ , fresnel\\n , kambient\\n , kdiffuse\\n , kspecular\\ , sampler2D f_normal\\n , , , f_uv;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n\\n = L = V = \\n {\\n = -N;\\n }\\n\\n specular = V, N, roughness, fresnel);\\ diffuse = min(kambie + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n surfaceCol = f_color * f_uv);\\n litColor = surfaceCol * vec4(diffu * + kspecular * vec3(1,1,1 * specular, 1.0);\\n\\n gl_FragCol = litColor * 1\\n\\nattri uv;\\n\\nuni model, view, f_uv;\\n\\nv main() {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n f_color = color;\\n f_data = position;\\ f_uv = 1\\n\\nunifo sampler2D f_uv;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n\\n gl_FragCol = f_color * f_uv) * 1\\n\\nattri uv;\\nattri model, view, f_uv;\\n\\nv main() {\\n || \\n {\\n gl_Positio = } else {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n }\\n gl_PointSi = pointSize; f_color = color;\\n f_uv = 1\\n\\nunifo sampler2D f_uv;\\n\\nv main() {\\n pointR = - if(dot(poi pointR) > 0.25) {\\n discard;\\n }\\n gl_FragCol = f_color * f_uv) * 1\\n\\nattri id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n f_id = id;\\n f_position = 1\\n\\nattri id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n || \\n {\\n gl_Positio = } else {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n gl_PointSi = pointSize; }\\n f_id = id;\\n f_position = 1\\n\\nattri model, view, main() {\\n gl_Positio = projection * * * vec4(posit 1\\n\\nunifo main() {\\n gl_FragCol = i(t){for(v null;for(v function() E=new s(\"\",\"Inva attribute \"+h+\": s(\"\",\"Unkn attribute \"+h+\": \"+f);var s(\"\",\"Inva attribute \"+h+\": n(t){retur i(t,e){for r=new s(\"\",\"Inva uniform dimension matrix \"+name+\": s(\"\",\"Unkn uniform \"+name+\": \"+r)}var s(\"\",\"Inva vector \"+name+\": r=[];for(v e){var r}function h(e){for(v n=[\"return s(\"\",\"Inva s(\"\",\"Inva uniform dimension matrix \"+name+\": \"+t);retur i(r*r,0)}t s(\"\",\"Unkn uniform \"+name+\": \"+t)}}func i){var p(t){var r=0;r1){l[ u=1;u1)for l=0;l=0){v t||t}funct s(t){funct r(){for(va u=0;u 1.0) {\\n discard;\\n }\\n baseColor = color, step(radiu gl_FragCol = * baseColor. 1\\n\\nattri mat3 main() {\\n hgPosition = matrix * vec3(posit 1);\\n gl_Positio = 0, gl_PointSi = pointSize; id = pickId + pickOffset id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n fragId = 1\\n\\nvaryi main() {\\n radius = length(2.0 * - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragCol = fragId / i(t,e){var instanceof instanceof null;var n(t,e,r,n) 1\\n\\n\\nvec posHi, posLo, scHi, scLo, trHi, trLo) {\\n vec4((posH + trHi) * scHi\\n \\t\\t\\t//FI thingy does give noticeable precision gain, test\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * scLo\\n , 0, positionHi size, char, 64-bit form scaleHi, scaleLo, translateH sampler2D charColor, main() {\\n charColor = vec2(color / 255., 0));\\n borderColo = vec2(color / 255., 0));\\n\\n gl_PointSi = * pixelRatio pointSize = * charId = char;\\n borderWidt = border;\\n\\ gl_Positio = positionHi positionLo scaleHi, scaleLo,\\n translateH pointCoord = viewBox.xy + (viewBox.z - viewBox.xy * * .5 + 1\\n\\nunifo sampler2D charsStep, pixelRatio main() {\\n\\tvec2 pointUV = (pointCoor - + pointSize * .5) / = 1. - texCoord = ((charId + pointUV) * charsStep) / dist = alpha\\n\\ti (dist t;){var w.push(new i(){var a(t,e){var e=void null;var characters maximum texture size. Try reducing x=0;x 1.0) {\\n discard;\\n }\\n baseColor = color, = 1.0 - pow(1.0 - baseColor. fragWeight gl_FragCol = * alpha, 1\\n\\nvec4 pfx_1_0(ve scaleHi, scaleLo, translateH translateL positionHi positionLo {\\n + translateH * scaleHi\\n + (positionL + translateL * scaleHi\\n + (positionH + translateH * scaleLo\\n + (positionL + translateL * scaleLo, 0.0, positionHi scaleHi, scaleLo, translateH main() {\\n\\n id = pickId + pickOffset id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n gl_Positio = scaleLo, translateH translateL positionHi positionLo gl_PointSi = pointSize; fragId = 1\\n\\nvaryi main() {\\n radius = length(2.0 * - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragCol = fragId / i(t,e){var e(e,r){ret e n(t,e){var r)return r[t];for(v o=r.gl d(t){var null;var a(t,e){ret E=new i(t,e){var r=new n(t);retur 0.0 ||\\n || {\\n discard;\\n }\\n\\n = V = L = {\\n = -N;\\n }\\n\\n specular = V, N, roughness) diffuse = min(kambie + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n //decide interpolat \\u2014 vertex fragment\\n surfaceCol = .5) * vec2(value value)) + step(.5, vertexColo * vColor;\\n\\ litColor = surfaceCol * vec4(diffu * + kspecular * vec3(1,1,1 * specular, 1.0);\\n\\n gl_FragCol = mix(litCol contourCol contourTin * 1\\n\\nattri uv;\\nattri f;\\n\\nunif mat3 model, view, height, sampler2D value, kill;\\nvar eyeDirecti main() {\\n dataCoordi = permutatio * vec3(uv.xy height);\\n worldPosit = * 1.0);\\n\\n clipPositi = projection * * clipPositi = clipPositi + zOffset;\\n gl_Positio = = f;\\n kill = -1.0;\\n = = uv.zw;\\n\\n vColor = vec2(value value));\\n //Don't lighting contours\\n surfaceNor = vec3(1,0,0 eyeDirecti = vec3(0,1,0 lightDirec = 1\\n\\nunifo value, kill;\\nvar v) {\\n vh = 255.0 * v;\\n upper = floor(vh); lower = fract(vh); vec2(upper / 255.0, floor(lowe * 16.0) / main() {\\n if(kill > 0.0 ||\\n || {\\n discard;\\n }\\n ux = / shape.x);\\ uy = / shape.y);\\ gl_FragCol = vec4(pickI ux.x, uy.x, ux.y + i(t){var o(t,e){var invalid coordinate Invalid texture size\");ret s(t,e){ret Invalid ndarray, 2d 3d\");var Invalid shape Invalid shape pixel Incompatib texture format Invalid texture Floating point textures supported platform\") s=u(t);ret s=u(t);ret f(t,e){var Invalid texture size\");var Invalid shape Invalid shape pixel b=u(t);ret Error(\"gl- Too vertex n(t,e,r){v i=new n(t){for(v n(t,e){var n(t,e,r){v instanceof a=new a(t,e){ret o(t){for(v e=[\"functi orient(){v orient\");v n=new a(t,e){var o(t,e){var s(t,e){var i}}functio c(t,e){for s(this,t); s(this,t); b}for(var r}return n}return l}function i(t,e,r,n) n(t,e){var r;if(h(t)) Error('Unk -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def sampler2D main() {\\n // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case fading out\\n // blur = u_blur * = clamp(min( - (v_linewid - blur), v_linewidt - dist) / blur, 0.0, 1.0);\\n\\n x_a = / 1.0);\\n x_b = / 1.0);\\n y_a = 0.5 + (v_normal. * v_linewidt / y_b = 0.5 + (v_normal. * v_linewidt / pos_a = vec2(x_a, y_a));\\n pos_b = vec2(x_b, y_b));\\n\\n = pos_a), pos_b), u_fade);\\n *= u_opacity; gl_FragCol = * gl_FragCol = lowp\\n#def floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale mat2 main() {\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * // store texture normals insignific bit\\n // transform y => -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n v_linesofa = // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def sampler2D main() {\\n // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case fading out\\n // blur = u_blur * = clamp(min( - (v_linewid - blur), v_linewidt - dist) / blur, 0.0, 1.0);\\n\\n sdfdist_a = v_tex_a).a sdfdist_b = v_tex_b).a sdfdist = mix(sdfdis sdfdist_b, u_mix);\\n *= smoothstep - u_sdfgamma 0.5 + u_sdfgamma sdfdist);\\ gl_FragCol = u_color * (alpha * gl_FragCol = lowp\\n#def floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale mat2 main() {\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * // store texture normals insignific bit\\n // transform y => -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n v_tex_a = * normal.y * + u_tex_y_a) v_tex_b = * normal.y * + // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def mapbox: mapbox: v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - = 0.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = lowp\\n#def mapbox: mapbox: main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n v_pos = / gl_Positio + 1.0) / 2.0 * lowp\\n#def sampler2D v_pos;\\n\\n main() {\\n imagecoord = mod(v_pos_ 1.0);\\n pos = imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = color2 = pos2);\\n\\n // find distance outline dist = length(v_p - = 0.0, dist);\\n \\n\\n gl_FragCol = mix(color1 color2, u_mix) * * gl_FragCol = lowp\\n#def v_pos;\\n\\n main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n scaled_siz = u_scale_a * scaled_siz = u_scale_b * // correct needs calculated //\\n // depends pixels world origin and\\n // edge tile:\\n // = size)\\n //\\n // high zoom levels ton pixels world origin\\n // edge tile. glsl spec guarantees 16 bits of\\n // precision floats. that.\\n //\\n // pixel_coor passed two 16 bit values:\\n // = / 2^16)\\n // = 2^16)\\n //\\n // calculated series steps preserve precision: offset_a = scaled_siz * 256.0, scaled_siz * 256.0 + offset_b = scaled_siz * 256.0, scaled_siz * 256.0 + v_pos_a = * a_pos + offset_a) / v_pos_b = * a_pos + offset_b) / v_pos = / gl_Positio + 1.0) / 2.0 * lowp\\n#def sampler2D main() {\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos = imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = color2 = pos2);\\n\\n gl_FragCol = mix(color1 color2, u_mix) * gl_FragCol = lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n scaled_siz = u_scale_a * scaled_siz = u_scale_b * // correct needs calculated //\\n // depends pixels world origin and\\n // edge tile:\\n // = size)\\n //\\n // high zoom levels ton pixels world origin\\n // edge tile. glsl spec guarantees 16 bits of\\n // precision floats. that.\\n //\\n // pixel_coor passed two 16 bit values:\\n // = / 2^16)\\n // = 2^16)\\n //\\n // calculated series steps preserve precision: offset_a = scaled_siz * 256.0, scaled_siz * 256.0 + offset_b = scaled_siz * 256.0, scaled_siz * 256.0 + v_pos_a = * a_pos + offset_a) / v_pos_b = * a_pos + offset_b) / lowp\\n#def sampler2D sampler2D main() {\\n\\n // read cross-fade colors parent tiles\\n color0 = v_pos0);\\n color1 = v_pos1);\\n = color0 * u_opacity0 + color1 * u_opacity1 rgb = color.rgb; // spin\\n rgb = vec3(\\n dot(rgb, dot(rgb, dot(rgb, // saturation average = (color.r + color.g + color.b) / 3.0;\\n rgb += (average - rgb) * // contrast\\n rgb = (rgb - 0.5) * + 0.5;\\n\\n // brightness u_high_vec = u_low_vec = gl_FragCol = u_low_vec, rgb), gl_FragCol = lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n v_pos0 = / 32767.0) - 0.5) / u_buffer_s ) + 0.5;\\n v_pos1 = (v_pos0 * + lowp\\n#def sampler2D sampler2D main() {\\n = v_fade_tex * u_opacity; gl_FragCol = v_tex) * gl_FragCol = lowp\\n#def matrix vertex bool main() {\\n a_tex = a_labelmin = a_data[0]; a_zoom = a_data.pq; a_minzoom = a_zoom[0]; a_maxzoom = a_zoom[1]; // u_zoom current zoom level adjusted change font size\\n z = 2.0 - u_zoom) - (1.0 - u_zoom));\\ extrude = * (a_offset / 64.0);\\n {\\n gl_Positio = u_matrix * vec4(a_pos + extrude, 0, 1);\\n gl_Positio += z * } else {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n }\\n\\n v_tex = a_tex / u_texsize; v_fade_tex = / 255.0, lowp\\n#def sampler2D sampler2D main() {\\n dist = v_tex).a;\\ fade_alpha = gamma = u_gamma * = - gamma, u_buffer + gamma, dist) * gl_FragCol = u_color * (alpha * gl_FragCol = lowp\\n#def PI = matrix vertex bool bool main() {\\n a_tex = a_labelmin = a_data[0]; a_zoom = a_data.pq; a_minzoom = a_zoom[0]; a_maxzoom = a_zoom[1]; // u_zoom current zoom level adjusted change font size\\n z = 2.0 - u_zoom) - (1.0 - u_zoom));\\ // map\\n // map | viewport\\n {\\n angle = ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing; asin = sin(angle) acos = cos(angle) mat2 RotationMa = mat2(acos, asin, -1.0 * asin, acos);\\n = RotationMa * a_offset;\\ extrude = * (offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos + extrude, 0, 1);\\n gl_Positio += z * // viewport\\n // map\\n } else {\\n // foreshorte factor apply pitched maps\\n // label goes horizontal vertical angle\\n // goes 0% foreshorte around 70% pitchfacto = 1.0 - cos(u_pitc * sin(u_pitc * 0.75));\\n\\ lineangle = a_data[1] / 256.0 * 2.0 * PI;\\n\\n // lineangle position a,b along line\\n // project calculate label angle projected space\\n // calculatio allows labels rendered unskewed pitched maps\\n = u_matrix * vec4(a_pos 0, 1);\\n b = u_matrix * vec4(a_pos + 0, 1);\\n angle = - b[0]/b[3] - a[0]/a[3]) asin = sin(angle) acos = cos(angle) mat2 RotationMa = mat2(acos, -1.0 * asin, asin, acos);\\n\\n = RotationMa * 1.0) * a_offset); extrude = * (offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n gl_Positio += z * // viewport\\n // viewport\\n } else {\\n extrude = * (a_offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n }\\n\\n v_gamma_sc = (gl_Positi - 0.5);\\n\\n v_tex = a_tex / u_texsize; v_fade_tex = / 255.0, lowp\\n#def main() {\\n\\n = 0.5;\\n\\n gl_FragCol = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\\n\\n > u_zoom) {\\n gl_FragCol = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n }\\n\\n (u_zoom >= v_max_zoom {\\n gl_FragCol = vec4(0.0, 0.0, 0.0, 1.0) * * 0.25;\\n }\\n\\n >= u_maxzoom) {\\n gl_FragCol = vec4(0.0, 0.0, 1.0, 1.0) * * 0.2;\\n lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\\n\\n v_max_zoom = a_data.x;\\ = values, const t) {\\n (t 7)return[n deprecated v8\")];if(! \"%s\" strict\";va a(l,e,\"arr expected, %s a(l,e,\"arr length %d expected, length %d r?[new deprecated v8\")]:[];v n(e,r,\"obj expected, %s found\",a)] o=[];for(v s start \"@\"'));ret strict\";va [%s], %s strict\";va t(e){var n(l,s,\"arr expected, %s n(l,s,'\"$t cannot operator n(l,s,'fil array operator \"%s\" expected, %s cannot functions functions strict\";va url include \"{fontstac url include \"{range}\" strict\";va n(c,r,'eit \"type\" \"ref\" i(e,r,\"%s greater maximum strict\";va n(e,r,\"obj expected, %s f r){var property n(e,r,'mis required property strict\";va i(e,o,'unk property strict\";va n(r,e,'\"ty e)for(var c a(t){retur Sans Unicode MS M=new n){for(var symbols rendered tile. See glyphs rendered tile. See exceeds allowed extent, reduce vector tile size\")}ret Error(\"Inv LngLat object: (\"+t+\", x(){return y(){return point(){re instanceof 0===s&&voi a(void Error(\"fai invert strict\";va n={\" strict\";va s(t){retur l(t,e,r,n) o=(new n(t,e){ret mapbox: ([\\w]+) ([\\w]+) ([\\w]+) a=new n?e(new Error(\"Inp valid GeoJSON t.data)ret e(new Error(\"Inp valid GeoJSON e(new Error(\"Inp valid GeoJSON e=0;ee)){v y;for(y p)c[y]=!0; i(t,e,i){v r(t,r){ret delete e(t);var n=new o(new e=new tile source layer \"'+M+'\" does vector tile spec v2 therefore may rendering g(t,L);var F B n=new t.time>=(n t=new i;var strict\";va Error(\"Inv o[e]}throw Error(\"Inv Error('Sou layer does exist source \"'+e.id+'\" specified style layer t.id});for Error(\"Sty done Error(\"The no source ID\");var delete instanceof this;var 0===e)thro Error(\"The no layer ID\");for(v this;var 0===i||voi 0===a?void strict\";va i(t){retur t.value}va r,n;for(va t){var for(n 0===e)dele 0===e)dele o}var strict\";va t){var this.grid= a}if(r){va _=u;for(va a}}}return r=new r(\"glyphs > 65535 i=!t&&new l(new c(new g(e,r){var y(e,r){var i(0,0));re M a)t[M]=new strict\";va t){var | n(){}var i(t){retur 61:case 107:case 171:case 189:case 109:case t=0,e=0;re t=new null!==t&& Error(\"max current minZoom 20, t,e={};ret instanceof e;if(t instanceof instanceof c?t:new i(this,e); Error(\"Fai initialize s if(void if(void n(t){var r=new n(t){for(v e=0;e1)for delete error c(t,e,r){v f(t,e){for null;var delete Error(\"An API access token required GL. See Error(\"Use public access token (pk.*) GL JS, secret access token (sk.*). See t}function i(t){retur a(t){retur t;var n(t){funct v[n];void t=0;t=1)re 1;var t={};for(v e =0.22.0 =0.22.0 No README run build-docs # invoked publisher publishing docs mb-pages --debug --standalo mapboxgl > && tap --no-cover build --github --format html -c --theme ./docs/_th --output --debug -t unassertif --plugin [minifyify --map --output --standalo mapboxgl > && tap --no-cover --debug -t envify > --ignore-p .gitignore js test bench diff --name-onl mb-pages HEAD -- | awk '{print | xargs build-toke watch-dev watch-benc build-toke watch-benc build-toke watch-dev run build-min && npm run build-docs && jekyll serve --no-cache --localhos --port 9966 --index index.html .\",test:\"n run lint && tap --reporter dot test/js/*/ && node && watchify bench/inde --plugin [minifyify --no-map] -t [babelify --presets react] -t unassertif -t envify -o bench/benc --debug --standalo mapboxgl -o n=new r=new r(t){var n(t,n){var i(t){retur t)return t){var 1=0)return V=1;V specify vertex creation specify cell creation specify phase strict\";va n(t){if(t l)return l[t];for(v Invalid boundary dst;};retu l){var u){var c){var \"+s),u){va p=new p=new p()}functi for(var o=0;o1)for f(e,r){var s=\"__l\"+ i=\"__l\"+ _=[\"'use L=new L=new L(r)}funct s(t,e){var r=[\"'use [2,1,0];}e [1,0,2];}} [2,0,1];}e o=new 0===t){var 0===r){r=n o(t,e){var s(t,e){ret a(t,e){var i=new t||\"up\"in strict\";va r=void 0!==r?r+\"\" e(t,e){for t}function o)throw path.resol t)throw path.join n(t){for(v Error(\"Giv varint doesn't fit bytes\");va o(t,e,r){v s(t,e){for type: n(t){var 0:return r||[];case 1:return 2:return Array(t);v r}var r(t,e){var Array(a),n n(t,e){for a(t){for(v t-e});var instanceof i(t){retur a(t){for(v a=1;i;){va l(t){for(v c(t){retur d(t){var u(m)}funct p(t){var 0x80 (not basic x});else for(_ n(t,e){ret o;var o};var n(t,e){for n&&void e(t){var e=new Error(\"(re \"+t);throw n(t){retur t?\": i(t,r,i){t r||e(\"unkn parameter possible values: parameter type\"+n(r) typed parameter type\"+n(i) expected \"+r+\", got \"+typeof t)}functio parameter type, nonnegativ shader source string\",a) \"+t+\": r=0;e(c(\"| compiling \"+s+\" shader, linking program vertex shader, fragment shader i(t){retur M(t,r){var n=m();e(t+ command called \"+n))}func A(t,e,r,i) e||M(\"unkn parameter possible values: parameter type\"+n(r) expected \"+e+\", got \"+typeof texture format renderbuff format L(t,e){ret z(t,e,n){v pixel arguments document,\" manually specify webgl context outside DOM supported, try upgrading browser graphics drivers name string\");v $(t){var et(t,e){va _e:r=new we:r=new Me:r=new ke:r=new Ae:r=new Te:r=new Se:r=new null}retur n=0;n0){va t[0]){var data\")}els shape\");va p=new n(a);retur d=[];retur t=0;return t&&t._buff instanceof a(t){var e||(e=new Ge:case Xe:case Ze:case element bit element buffers supported, enable first\");va vertex count a}var t&&t._elem instanceof pt(t){for( At(t){retu Tt(t,e){va Or:case Fr:case Rr:case jr:var texture type, specify typed St(t,e){re for(var s}return o*r*n}func texture texture unpack n){var enable extension order floating point enable extension order 16-bit floating point enable extension order depth/sten texture extension extension d(e,r,i){v m(){return K.pop()||n h}function y(t,e,r){v b(t,e){var e){var e){var e){var e){var e){var i(t,e){var arguments format c=new T(nr);retu format C=new z=new I(){for(va for(var P={\"don't care\":$r,\" mipmap mipmap mipmap mipmap s3tc dxt1\":Mr,\" s3tc dxt1\":kr,\" s3tc dxt3\":Ar,\" s3tc atc\":Sr,\"r atc explicit atc interpolat pvrtc pvrtc pvrtc pvrtc etc1\"]=Pr) r=B[e];ret null});ret texture shape z||\"colors render targets enable order floating point framebuffe enable order 16-bit floating point framebuffe enable 16-bit render enable order 32-bit floating point format format extension u=d=1;var for(D=new attachment \"+a+\" attachment same bits per depth attachment framebuffe stencil attachment framebuffe depth-sten attachment framebuffe resize framebuffe currently use\");var i;for(var shape framebuffe d||\"colors render targets format l=1;var a(t){var t=0;return vertex fragment shader\",n) a=i[t];ret a||(a=new o(o){var webgl context order read pixels drawing cannot read framebuffe allowed types 'uint8' framebuffe allowed 'uint8'\")) arguments regl.read( too s(t){var r;return l(t){retur l}function jt(t){retu Nt(t){retu Bt(){funct t(t){for(v r(){functi n(){var e=a();retu n(){var m(t){retur v(t,e,r){v g(t,e,r){v y(){var ei:var ri:return ni:return ii:return ai:return c={};retur n=e.id(t); c)return c[n];var b(t){var r){var if(Di n){var e}function x(t,e){var r){var i=r[Pi];re framebuffe n){var a=n[Pi];re framebuffe null}funct n(t){if(t i){var a){var \"+t)});var e?new s=o;o=new w(t){funct r(t){if(t i){var r});return n.id=r,n}i a){var o=a[t];ret null}var r(t,r){if( n){var i){var s=i[t];ret n){var i){var o=i[Ri];re n){var t=n[ji];re Be[t]})}if i){var r=i[ji];re \"+n,\"inval primitive, Aa}):new n){var vertex t})}if(Ni i){var r=i[Ni];re vertex s?new vertex offset/ele too l=new k(t,e){var o(e,n){if( r){var o})}else if(t i){var vi:case si:case oi:case Ai:case hi:case Ci:case xi:case wi:case Mi:case pi:return flag fi:return \"+i,\"inval \"+t+\", di:return attachment framebuffe sent uniform uniform a[r],\"inva uniform missing uniform T(t,r){var a&&a,\"inva attribute attribute divisor attribute parameter \"'+r+'\" attribute pointer \"'+t+'\" (valid parameters r)return r[s];var '+a+\"&&(ty dynamic attribute if(\"consta \"+a+'.cons === S(t){var a(t){var parameter L(t,e,r){v C(t,e,r,n) z(t,e,r){v n=m(e);if( r.state)){ c,h;if(n I(t,e,r,n) if(mt(u)){ l(t){var ua:case da:case ga:return 2;case ca:case pa:case ya:return 3;case ha:case ma:case ba:return 1}}functio attribute i(i){var a=c[i];ret a(){functi o(){functi vertex vertex vertex i(t){retur n(e){var n=r.draw[e s(t){funct e(t){var args args e(t){if(t r){var e=r[t];del delete l(t,e){var regl.clear no takes object cancel frame callback h(){var callback function\") event, Kt={\"[obje renderbuff renderbuff arguments renderbuff r(){return i(t){var s(){return p.pop()||n o}function u(t,e,r){v c(){var t(){var requires least argument; got none.\");va e.href;var \",e);var s=new o;n=-(i+a) null;var n(t){retur n(t){for(v R;};return i(t){var e=s[t];ret strict\";\"u n(t){for(v i}function h(t,e){for r=new r}function r=new l(e)}funct u(t){for(v e=s(t);;){ t=k[0];ret f(t,e){var r=k[t];ret n(t,e){var l}else if(u)retur l}else if(u)retur u;return i(t,e){ret t.y-e}func a(t,e){for r=null;t;) t;var r}function l(t){for(v n=d.index; n(t,e){var i(t,e,r,n) o(t,e){for r}function s(t,e){for m}function s[t];for(v unexpected failed parse named argument failed parse named argument mixing positional named placeholde (yet) s[t]=n}var n(t){for(v Array(e),n Array(e),i Array(e),a Array(e),o Array(e),s x=new u(t){retur c(t){var h(t){retur f(t){var d(t,e){for t}function p(t){retur t.x}functi m(t){retur t.y}var time\");var r=\"prepare \"+t.length %d clusters c)|0 p=new Array(r),m Array(r),v Array(r),g p=new o}function s}function T(t){retur n=z(t);ret t){var r={};for(v e={};for(v n(t,e){var i(t,e){var s/6}return 1}var n&&void e(t,e){var for(a=0,n= n})}}var s;var Error(\"n Error(\"alr s(t){retur l(t){retur u(t){retur c(t){retur h(t){retur f(t){retur d(t){retur p(t){retur m(t){retur x?new v(t){retur n(t)}var null}retur t=0;tn)ret instanceof n)return t;var i=new n;return a(t){retur instanceof o(t,e){ret s(t,e){ret 'url' string, \"+typeof t);var i(t,e){var a(t,e){var o(t,e){ret t}function s(t){var e={};retur a;var v=e.name?\" c(e)}var o+\": \"+s}functi d(t,e,r){v n=0;return \")+\" \"+t.join(\" \")+\" \"+t.join(\" \")+\" p(t){retur t}function v(t){retur g(t){retur t}function t}function t}function _(t){retur 0===t}func w(t){retur M(t)&&\"[ob k(t){retur M(t)&&\"[ob A(t){retur instanceof t}function S(t){retur t||void 0===t}func E(t){retur L(t){retur t=a)return Error(\"unk command if(7!==r)t Error(\"unk command i(t){for(v e}var Error(\"fea index String too long (sorry, fixed later)\");v l(t){for(v e(t){var e=n(t);ret e?u r(t,e){var o(t){var i?u i&&delete t){var r?r[0]:\"\"} n?!r&&en)t al-ahad\",\" {0} {0} {0} {0} mix {0} {1} a(t,e){ret ;var format date another position name position literal position text found dd M MM d, d M d M d M d M yyyy\",RSS: d M a=this;ret var _inline_1_ = - var _inline_1_ = - >= 0) !== (_inline_1 >= 0)) {\\n + 0.5 + 0.5 * (_inline_1 + _inline_1_ / (_inline_1 - }\\n n(t,e){var r=[];retur strict\";va u(r,i){ret i(t,e){var E.remove() null;var strict\";va c();var t}function i(t){var e=x[t];ret a(t){retur calendar system `\"+t+\"` date data.\"}var i={};retur t}var i?\"rgba(\"+ n=i(t);ret t){var A(e,r){var T(){var strict\";va strict\";va strict\";va strict\";va strict\";va strict\";va n(){var e(e){retur r;try{r=ne strict\";va i(t,e,r,n) a(t){var n.remove() \")}).split \")}).split scale(\"+e+ n,i,a;retu strict\";va 1,1 0,1 \"+a+\",\"+a+ \"+a+\",\"+a+ \"+r+\",\"+r+ \"+r+\",\"+r+ 1,1 0,1 1,1 0,1 n(t,e,r,n) t.id});var strict\";va strict\";va i(t,e,r){v r(t){var r.remove() r(e,r,o){v if(i[r]){v o;if(void strict\";va n(t){var n(r){retur strict\";va n(t){for(v \");var i(t,e){var click legend isolate individual l(t){var u(t){var strict\";va r[1]}retur i}function i(t){retur t[0]}var h(t){var f(t){var d(t){var n(t,e){var i(t){for(v n(t){for(v 0}}var o(t,e){var 1,1 0,1 extra params segment t(e).repla strict\";va strict\";va u(r,i){ret r(t,e){ret l(t,e,r){v u(t,e,r){v c(t,e){var n(){return p(t,e){var g(t,e){ret y(t,e){ret b(t,e,r){v x(t,e){var _(t){for(v r(t,e){ret strict\";va strict\";va strict\";va t){var t)return n}function l(t){retur u(t){retur c(t){retur d\")}functi h(t){retur d, yyyy\")}var t.getTime} r={};retur n=new a(t){retur o(t){for(v r={};retur n(){return strict\";va for(var c(t){retur property r(t,e){var instanceof RegExp){va o(t,e){ret t>=e}var binary r=e%1;retu n(t){var e=i(t);ret n(t,e){ret i(t){retur \")}functio a(t,e,r){v error tex null;var r=0;r1)for i=1;i doesnt match end tag . Pretending did s}function c(t,e,r){v o(),void e();var 0,\":\"],k=n t(t,e){ret n(t){var i(){var strict\";va strict\";va n(t,e){for r=new Error(\"No DOM element id '\"+t+\"' exists page.\");re 0===t)thro Error(\"DOM element provided null previous rejected promises t.yaxis1); array edits incompatib edits\",h); full array edit if(void & removal incompatib edits same full object edit Error(\"eac index \"+r+\" Error(\"gd. 0===e)thro required Error(\"cur indices equal u(t,e,r){v Error(\"gd. 0===e)thro Error(\"tra i(t){retur a(t,e){var r=0;return Error(\"Thi element Plotly plot: \"+t+\". likely you've failed plot before animating it. details, see c()}functi d(t){retur overwritin frame frame whose name \"number\" equates \"'+f+'\". valid may potentiall lead unexpected behavior since plotly.js frame names stored internally API call yielded too warnings. rest call, further warnings numeric frame names addFrames accepts frames numeric names, numbers areimplici cast n(t){var i}function i(){var t={};retur a(t){var o(){var s(t){retur l(t){funct u(t){funct c(t){retur h(t,e,r){v f(t,e,r){v e={};retur t&&void n(t){retur Error(\"Hei width pixel values.\")) l(t,e,r){v u(t,e,r,n) \"+o:s=o+(s dtick p(t,e){var c=new t.dtick){v error: t+i*e;var dtick a(t){for(v strict\";va v(r,n){ret enter axis\")+\" e;var n(t,r){for n(t,e,r,n) u(t,e){ret y(t){var b(t,e,r){v back X(e,r){var K()}functi W(e){funct n(e){retur k.log(\"Did find wheel motion attributes \",e);var strict\";va n(t){retur t._id}func went wrong axis Error(\"axi o){var t(t){var e(t){retur strict\";va r(r,n){var e/2}}funct v(t,e){var g(t,e){var b(t,e){var x(t,e){var Error(\"not yet r(t,r){for i(){for(va a(t,e){for n(t,e){var n(t){retur i(t,e,r,n) a(t,e){ret i(t,e){var r(t){retur n(t){var l(t,e){var u(t){var c(t,e){var f(t,e,r){v strict\";va i(t){var e=new n;return a(t){var o(t){var i=new n(t,e);ret strict\";va Sans Regular, Arial Unicode MS r(t,e){ret - delete t)return e,n,i={};f i}return r=a(t);ret e&&delete P=(new + + + + + + + + + + + + + + + 0px\",\"1px -1px\",\"-1p 1px\",\"1px \"+t+\" \"+n+\" \"+n+\" \"+n+\" c=\"t: \"+u.t+\", r: l;var t)r r=e||6;ret 0===t)retu null;var t(){var t={};retur n.mode,del strict\";va e(e,i){ret s;return t(t,e){ret i=r[n];ret strict\";va t(t,e,r){v e(t,e){ret r(t,e){ret a(t,i){var tozoom back f(t,e){var i(t){retur y,b;return o,s;return ii))return e}return h(t){retur f(t,e){ret strict\";va strict\";va 0, 0, strict\";va s;return strict\";va null;for(v strict\";va o(e){var s(e){var strict\";va n(t,e,r){v i(t,e,r){v strict\";va converged strict\";va strict\";va strict\";va strict\";va s(r,i){ret n(t,e,r,n) strict\";va n(t,e){for o(t){retur strict\";va strict\";va strict\";va c(r,i){ret loop contour?\") s(t,e,r){v 15===r?0:r contours, clipping i}function a(t,e,r){v o(t,e,r){v s(t,e,r,n) e=l(t,r) r(t){retur newendpt vert. perimeter invalid specified inequality contours, clipping strict\";va strict\";va h(t){retur newendpt vert. perimeter o(t,e,r){v s(t,e,r){v strict\";va iterated no strict\";va g}var didn't converge strict\";va s=0;sa){va strict\";va l(r,n){ret u(t){var e=l(t);ret strict\";va strict\";va e(e){var strict\";va strict\";va r(t,e){ret traces support \"+u+\" dimensions c}var l(r,n){ret strict\";va l(n){var i}function c(t,e,r){v l(t,e,r){v n=o(r);ret u(t,e){ret c(t){retur h(t){var e=o(t);ret f(t){var d(t){retur t[0]}funct p(t,e,r){v m(t){var v(t){retur l(t){var u(t){retur c(t,e){for e.t+\"px \"+e.r+\"px \"+e.b+\"px 255, 255, 0)\");var #fff, -1px -1px #fff, -1px #fff, -1px strict\";va i(t,e,r){v strict\";va n(t,e){for m};var strict\";va o(r,a){ret strict\";va strict\";va strict\";va n(t,e,r){v u;var 1;var a(t,e){var r(t,e){ret n(t,e){ret s(t,e){var 1;var t+\" strict\";va strict\";va strict\";va 0, i(t,e){var r=new for(r=new present Sankey data. Removing nodes strict\";va u(r,a){ret n(t){retur t.key}func a(t){retur t[0]}funct o(t){var 0)\":\"matri 0)\")}funct M(t){retur k(t){retur 0)\":\"matri 0)\"}functi A(t){retur 1)\":\"scale 1)\"}functi T(t){retur S(t){retur L(t,e,r){v var C(t,e,r){v i(){for(va e={};retur #fff, #fff, -1px #fff, -1px -1px strict\";va _=new strict\";va strict\";va strict\";va m(r,a){ret strict\";va strict\";va strict\";va r(e){var i(t){var strict\";va n(t,e){var + m(t){retur v(t){retur g(t){retur t.id}funct g}function x(e){var scatter strict\";va s(t,e){ret l(t){retur M[t]}funct o=0;o=0){v n(t,e,r,n) strict\";va d(r,i){ret s=o[0];if( 0;var v.push(\"y: strict\";va strict\";va e(t){retur r(t){var 1/0;var strict\";va n(t,e){var n}function s(t,e,r,n) n=new s(t){var 1/0;var strict\";va strict\";va strict\";va strict\";va d(r,i){ret strict\";va strict\";va e=f(t);ret e=f(t);ret e=f(t);ret e=f(t);ret In\u00a0[3]: ## Setup - appearance # rid annoying warning = None # default='w # print unassigned variable = \"all\"; # offline plotly color1 = 'red' color2 = '#137a28' # dark green exports, module) {/** * plotly.js v1.28.3 * Copyright 2012-2017, Plotly, Inc. * rights reserved. * Licensed under MIT license */ t;return a(o,!0);va u=new Error(\"Can find module i(t,e){ret t.y-e.y}va r(t){retur r(t){retur u(){functi t(t,e){ret e(t,e){ret c(t){retur h(t){retur t.value}va t(t){var \"+s+\",\"+c+ \"+o+\",\"+u+ e=.5;retur n(t){var n=a(t,new e?e:1,r=r| \";var n(t,e){for r=new instanceof y(t){var e}function b(t,e,r,n) e)throw argument expected unwanted i}var r=new t};var e=[];for(v n(t){for(v n(t){retur n(t){var i=new e=t|t-1;re i}function l(t){for(v e=new e}function ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff ffffffff 00000000 00000000 ffffffff ffffffff fffffffe ffffffff t){var greater instanceof safely store 53 n(void array length 26;var e=t,r=0;re 0;for(var t&&t>=0);v t&&t>=0);v a(1);for(v t&&t>=0);v works positive a(0),mod:n a(0)};var i,o,s;retu i=new a(1),o=new a(0),s=new a(0),l=new i=new a(1),o=new f;return A[t];var p;else m;else Error(\"Unk prime \"+t);e=new g}return works works red works works red l}}}functi s(t){retur l(t,e){ret 1:return s(t);case 3:return Invalid n(t,e,r){v \"+r);var n(t,e){var i=\"for(var i=n[t];ret var P=C+1;PZ)t typed array length\");v e=new e)throw Error(\"If encoding specified first argument l(t)}retur t)throw argument instanceof t)throw argument allocate larger maximum size: bytes\");re 0|t}functi instanceof 0;for(var 0:return v(t,e,r){v n=!1;if((v hex E(n)}funct E(t){var access beyond argument a}function U(t){for(v a}function H(t){retur i}function Y(t){retur t!==t}var t=new browser lacks typed array (Uint8Arra support required `buffer` v5.x. `buffer` v4.x require old browser 0;for(var ... range 0;for(var 0)}var write outside encoding: Error(\"Inv string. Length multiple i(t){retur a(t){var o(t){retur i(t,e){ret a(t,e){for i(g,d,v,h) n(t){var i(t,e){for r=new s}function m(t,e,r){v i=new n(t){var strict\";va t;var Error(f+\" map requires nshades least i(t,e,r,i) 0}return n(t,e){ret t-e}functi i(t,e){var 0:return 0;case 1:return t[0]-e[0]; 2:return 3:var i;var 4:var n(t){var t}function i(t){retur a(t){retur o(t){retur null}var null;var a}return a}return i(t){var e=new i=0;i0)thr Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array args\")}els Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array index\")}el Error(\"cwi Too arguments pre() Error(\"cwi Too arguments body() Error(\"cwi Too arguments post() block\");re n(t,e,r){v l(t,e){for w=new cwise routine n(t){var e=[\"'use strict'\",\" (!(\"+l.joi && \")+\")) throw Error('cwi Arrays same {\"),e.push (!(\"+u.joi && \")+\")) throw Error('cwi Arrays same i(t,e,r){v m,v=new t;var e=[];for(v e=[];for(v e=[];for(v n&&void e(t,e){var r}function r(){}funct n(t){var e;return y(t){retur b(t){retur Error(\"unk type: i(t,e){for r,n,i=new i(){if(s){ t(t){var r(t){var Array(o),l this;var 1:do{o=new 2:do{o=new 3:do{o=new t=[];retur s(){var l(){for(va a(t){retur n}}}functi l(t){retur u(t){for(v e}function c(t,e){for p(t){retur f(t)in this._&&de v(){var t=[];for(v e t}function g(){var t=0;for(va e t}function y(){for(va x(t){retur t}function function() w(t,e){if( t)return Z(t,e){ret J(t,e){var K(t){var vt(t){retu gt(t){retu yt(t){retu _t(t){retu wt(t){retu kt(t,e,r){ Ot(){for(v t}function Ft(){for(v Nt(t){var b=u&&h;ret Bt(t){retu t+\"\"}funct n(e){var e}function Gt(t,e,r){ le(t){var ce(t){for( ge(t){var ye(t,e){re we(t){var ke(t,e){re y}}functio Fe(t){retu Re(){var r=e;return r(t){var a(t,e){ret o(t,e){var l(t){for(v c(i,a){ret Je(){funct s}function 1,1 1,1 $e(){funct t(t,n){var er(){funct t(t,e){var rr(t){func s}function nr(t){func r(e){retur n(e){funct a(r,n){var k}function ir(t){var sr(t){retu t})()}func lr(t){func e(t){retur i(){return ur(t){retu r(t,e){var Vr(t,e){va n;var s;var Hr(t,e){va Vr(r,e);va Gr(t){for( r}function wn(t,e){va kn(t){retu An(t){retu 1;var Zn(t,e){va n}function bi(t){retu xi(t,e){re _i(t,e){re Ei(t){func Ni(t){retu t.y})}func Bi(t){retu Ui(t){var Vi(t){var qi(t,e){va a(t){retur o(t)}var o,s;return Qi(t,e){re $i(t,e){re a(t){retur o(e){retur t(i(e))}re _a(t){func e(e){funct Ma(t){retu ka(t){for( Aa(t){for( p[n]:delet t[r],1}var io(t){retu n(e){retur t(e)}funct i(t,r){var r};var t;var e=new b;if(t)for h(){functi f(){functi t(){var r(){var n(){var o;if(i)ret i=!1,a;var e=new ms={\"-\":\"\" %b %e %X this.s}};v bs=new e(e,r){var t(){var e(){return }var t(e,r,n,i) c}function e(t){for(v r}function t(t,a){var t(t,e){for i(t,e,r,n) \"+e}functi 0,0 \"+n}var t(t,i){var \"+l[2]+\" \"+l[3]}var 0,\"+e+\" \"+e+\",\"+e+ a(){functi v(){var l;var t;e||(e=t) e}function s(t){var l(t,e,r,n) u(t,e,r){v n=t;do{var n}function l=t;do{for h(t,e,r,n) r}function m(t,e,r,n) v(t){var t}function x(t,e){ret w(t,e){ret k(t,e){var A(t,e){ret n(t,e){var e){e=0;for warning: possible EventEmitt memory leak detected. %d listeners added. increase function\") n=!1;retur e=typeof o(t,e,r,n) \"+i+\"=== typeof s(t,e){ret e.length> 1; (a[m] === v) true; (a[m] > v) j = m - 1; else = m + 1;}return false; }(\"+n+\", u(t){retur p\"}functio h(t,e){ret c[1]){var s[e][t];va i(t){retur a(t,e){ret r}var 0)}functio d(t){for(v m(t){retur t=[];retur t=[];retur 1:return 2:return this.tree; e=new i=0;i0)ret Error(\"Can update empty node!\");va r=new s(t){for(v z%d-%d-%d (features: %d, points: %d, simplified down parent tile down\");var i(t,e,r){v s}function i(t,e,r,n) s(t,e){var r=new i(t);retur e(e,r,n){i t){var U=g,V=_,k= 0.0) {\\n nPosition = mix(bounds bounds[1], 0.5 * (position + 1.0));\\n gl_Positio = projection * * * 1.0);\\n } else {\\n gl_Positio = }\\n colorChann = 1\\n\\nunifo main() {\\n gl_FragCol = colorChann * colors[0] + \\n colorChann * colors[1] +\\n colorChann * vectorizin d=new o(t,e,r,n) s;var r}function a(t,e){for r=0;rr)thr resizing buffer, specify a(t,e){for Invalid webgl buffer, either Invalid usage buffer, either gl.STATIC_ t&&void Cannot specify resizing Error(\"gl- Can't resize FBO, invalid Error(\"gl- Parameters too large Error(\"gl- Multiple draw extension Error(\"gl- Context does support \"+s+\" draw buffers\")} Error(\"gl- Context does support floating point h=!0;\"dept Error(\"gl- Shape vector length 2\");var null;var 0.25) {\\n discard;\\n }\\n gl_FragCol = 1\\n\\nattri aHi, aLo, pick0, scaleHi, translateH scaleLo, translateL pickA, scHi, trHi, scLo, trLo, posHi, posLo) {\\n (posHi + trHi) * scHi\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * main() {\\n p = translateH scaleLo, translateL aHi, aLo);\\n = width * * vec2(dHi.y -dHi.x)) / gl_Positio = vec4(p + n, 0, 1);\\n pickA = pick0;\\n pickB = 1\\n\\nunifo pickA, pickB;\\n\\n main() {\\n fragId = 0.0);\\n if(pickB.w > pickA.w) {\\n fragId.xyz = pickB.xyz; }\\n\\n fragId += fragId.y += floor(frag / 256.0);\\n fragId.x -= floor(frag / 256.0) * 256.0;\\n\\n fragId.z += floor(frag / 256.0);\\n fragId.y -= floor(frag / 256.0) * 256.0;\\n\\n fragId.w += floor(frag / 256.0);\\n fragId.z -= floor(frag / 256.0) * 256.0;\\n\\n gl_FragCol = fragId / 1\\n\\nattri aHi, aLo, scaleHi, translateH scaleLo, translateL projectVal scHi, trHi, scLo, trLo, posHi, posLo) {\\n (posHi + trHi) * scHi\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * main() {\\n p = translateH scaleLo, translateL aHi, aLo);\\n if(dHi.y e+n;var null;var FLOAT_MAX) {\\n vec4(127.0 128.0, 0.0, 0.0) / 255.0;\\n } else if(v \"+t[1]+\", \"+t[2]+\", t=new e=new r=new \"+t[1]+\", n=\"precisi 1\\n\\nunifo f_id;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n gl_FragCol = vec4(pickI 1\\n\\nattri position, uv;\\n\\nuni model\\n , view\\n , eyePositio , f_normal\\n , , , f_uv;\\n\\nv main() {\\n m_position = * vec4(posit 1.0);\\n t_position = * m_position gl_Positio = projection * t_position f_color = color;\\n f_normal = normal;\\n f_data = position;\\ f_eyeDirec = eyePositio - position;\\ = lightPosit - position;\\ f_uv = 1\\n\\nfloat x, roughness) {\\n NdotH = max(x, 0.0001);\\n cos2Alpha = NdotH * NdotH;\\n tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha; roughness2 = roughness * roughness; denom = * roughness2 * cos2Alpha * cos2Alpha; exp(tan2Al / roughness2 / roughness, fresnel) {\\n\\n VdotN = 0.0);\\n LdotN = 0.0);\\n\\n //Half angle vector\\n H = + //Geometri term\\n NdotH = H), 0.0);\\n VdotH = H), 0.000001); LdotH = H), 0.000001); G1 = (2.0 * NdotH * VdotN) / VdotH;\\n G2 = (2.0 * NdotH * LdotN) / LdotH;\\n G = min(1.0, min(G1, G2));\\n \\n //Distribu term\\n D = //Fresnel term\\n F = pow(1.0 - VdotN, fresnel);\\ //Multiply terms done\\n G * F * D / max(3.1415 * VdotN, roughness\\ , fresnel\\n , kambient\\n , kdiffuse\\n , kspecular\\ , sampler2D f_normal\\n , , , f_uv;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n\\n = L = V = \\n {\\n = -N;\\n }\\n\\n specular = V, N, roughness, fresnel);\\ diffuse = min(kambie + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n surfaceCol = f_color * f_uv);\\n litColor = surfaceCol * vec4(diffu * + kspecular * vec3(1,1,1 * specular, 1.0);\\n\\n gl_FragCol = litColor * 1\\n\\nattri uv;\\n\\nuni model, view, f_uv;\\n\\nv main() {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n f_color = color;\\n f_data = position;\\ f_uv = 1\\n\\nunifo sampler2D f_uv;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n\\n gl_FragCol = f_color * f_uv) * 1\\n\\nattri uv;\\nattri model, view, f_uv;\\n\\nv main() {\\n || \\n {\\n gl_Positio = } else {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n }\\n gl_PointSi = pointSize; f_color = color;\\n f_uv = 1\\n\\nunifo sampler2D f_uv;\\n\\nv main() {\\n pointR = - if(dot(poi pointR) > 0.25) {\\n discard;\\n }\\n gl_FragCol = f_color * f_uv) * 1\\n\\nattri id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n f_id = id;\\n f_position = 1\\n\\nattri id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n || \\n {\\n gl_Positio = } else {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n gl_PointSi = pointSize; }\\n f_id = id;\\n f_position = 1\\n\\nattri model, view, main() {\\n gl_Positio = projection * * * vec4(posit 1\\n\\nunifo main() {\\n gl_FragCol = i(t){for(v null;for(v function() E=new s(\"\",\"Inva attribute \"+h+\": s(\"\",\"Unkn attribute \"+h+\": \"+f);var s(\"\",\"Inva attribute \"+h+\": n(t){retur i(t,e){for r=new s(\"\",\"Inva uniform dimension matrix \"+name+\": s(\"\",\"Unkn uniform \"+name+\": \"+r)}var s(\"\",\"Inva vector \"+name+\": r=[];for(v e){var r}function h(e){for(v n=[\"return s(\"\",\"Inva s(\"\",\"Inva uniform dimension matrix \"+name+\": \"+t);retur i(r*r,0)}t s(\"\",\"Unkn uniform \"+name+\": \"+t)}}func i){var p(t){var r=0;r1){l[ u=1;u1)for l=0;l=0){v t||t}funct s(t){funct r(){for(va u=0;u 1.0) {\\n discard;\\n }\\n baseColor = color, step(radiu gl_FragCol = * baseColor. 1\\n\\nattri mat3 main() {\\n hgPosition = matrix * vec3(posit 1);\\n gl_Positio = 0, gl_PointSi = pointSize; id = pickId + pickOffset id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n fragId = 1\\n\\nvaryi main() {\\n radius = length(2.0 * - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragCol = fragId / i(t,e){var instanceof instanceof null;var n(t,e,r,n) 1\\n\\n\\nvec posHi, posLo, scHi, scLo, trHi, trLo) {\\n vec4((posH + trHi) * scHi\\n \\t\\t\\t//FI thingy does give noticeable precision gain, test\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * scLo\\n , 0, positionHi size, char, 64-bit form scaleHi, scaleLo, translateH sampler2D charColor, main() {\\n charColor = vec2(color / 255., 0));\\n borderColo = vec2(color / 255., 0));\\n\\n gl_PointSi = * pixelRatio pointSize = * charId = char;\\n borderWidt = border;\\n\\ gl_Positio = positionHi positionLo scaleHi, scaleLo,\\n translateH pointCoord = viewBox.xy + (viewBox.z - viewBox.xy * * .5 + 1\\n\\nunifo sampler2D charsStep, pixelRatio main() {\\n\\tvec2 pointUV = (pointCoor - + pointSize * .5) / = 1. - texCoord = ((charId + pointUV) * charsStep) / dist = alpha\\n\\ti (dist t;){var w.push(new i(){var a(t,e){var e=void null;var characters maximum texture size. Try reducing x=0;x 1.0) {\\n discard;\\n }\\n baseColor = color, = 1.0 - pow(1.0 - baseColor. fragWeight gl_FragCol = * alpha, 1\\n\\nvec4 pfx_1_0(ve scaleHi, scaleLo, translateH translateL positionHi positionLo {\\n + translateH * scaleHi\\n + (positionL + translateL * scaleHi\\n + (positionH + translateH * scaleLo\\n + (positionL + translateL * scaleLo, 0.0, positionHi scaleHi, scaleLo, translateH main() {\\n\\n id = pickId + pickOffset id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n gl_Positio = scaleLo, translateH translateL positionHi positionLo gl_PointSi = pointSize; fragId = 1\\n\\nvaryi main() {\\n radius = length(2.0 * - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragCol = fragId / i(t,e){var e(e,r){ret e n(t,e){var r)return r[t];for(v o=r.gl d(t){var null;var a(t,e){ret E=new i(t,e){var r=new n(t);retur 0.0 ||\\n || {\\n discard;\\n }\\n\\n = V = L = {\\n = -N;\\n }\\n\\n specular = V, N, roughness) diffuse = min(kambie + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n //decide interpolat \\u2014 vertex fragment\\n surfaceCol = .5) * vec2(value value)) + step(.5, vertexColo * vColor;\\n\\ litColor = surfaceCol * vec4(diffu * + kspecular * vec3(1,1,1 * specular, 1.0);\\n\\n gl_FragCol = mix(litCol contourCol contourTin * 1\\n\\nattri uv;\\nattri f;\\n\\nunif mat3 model, view, height, sampler2D value, kill;\\nvar eyeDirecti main() {\\n dataCoordi = permutatio * vec3(uv.xy height);\\n worldPosit = * 1.0);\\n\\n clipPositi = projection * * clipPositi = clipPositi + zOffset;\\n gl_Positio = = f;\\n kill = -1.0;\\n = = uv.zw;\\n\\n vColor = vec2(value value));\\n //Don't lighting contours\\n surfaceNor = vec3(1,0,0 eyeDirecti = vec3(0,1,0 lightDirec = 1\\n\\nunifo value, kill;\\nvar v) {\\n vh = 255.0 * v;\\n upper = floor(vh); lower = fract(vh); vec2(upper / 255.0, floor(lowe * 16.0) / main() {\\n if(kill > 0.0 ||\\n || {\\n discard;\\n }\\n ux = / shape.x);\\ uy = / shape.y);\\ gl_FragCol = vec4(pickI ux.x, uy.x, ux.y + i(t){var o(t,e){var invalid coordinate Invalid texture size\");ret s(t,e){ret Invalid ndarray, 2d 3d\");var Invalid shape Invalid shape pixel Incompatib texture format Invalid texture Floating point textures supported platform\") s=u(t);ret s=u(t);ret f(t,e){var Invalid texture size\");var Invalid shape Invalid shape pixel b=u(t);ret Error(\"gl- Too vertex n(t,e,r){v i=new n(t){for(v n(t,e){var n(t,e,r){v instanceof a=new a(t,e){ret o(t){for(v e=[\"functi orient(){v orient\");v n=new a(t,e){var o(t,e){var s(t,e){var i}}functio c(t,e){for s(this,t); s(this,t); b}for(var r}return n}return l}function i(t,e,r,n) n(t,e){var r;if(h(t)) Error('Unk -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def sampler2D main() {\\n // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case fading out\\n // blur = u_blur * = clamp(min( - (v_linewid - blur), v_linewidt - dist) / blur, 0.0, 1.0);\\n\\n x_a = / 1.0);\\n x_b = / 1.0);\\n y_a = 0.5 + (v_normal. * v_linewidt / y_b = 0.5 + (v_normal. * v_linewidt / pos_a = vec2(x_a, y_a));\\n pos_b = vec2(x_b, y_b));\\n\\n = pos_a), pos_b), u_fade);\\n *= u_opacity; gl_FragCol = * gl_FragCol = lowp\\n#def floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale mat2 main() {\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * // store texture normals insignific bit\\n // transform y => -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n v_linesofa = // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def sampler2D main() {\\n // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case fading out\\n // blur = u_blur * = clamp(min( - (v_linewid - blur), v_linewidt - dist) / blur, 0.0, 1.0);\\n\\n sdfdist_a = v_tex_a).a sdfdist_b = v_tex_b).a sdfdist = mix(sdfdis sdfdist_b, u_mix);\\n *= smoothstep - u_sdfgamma 0.5 + u_sdfgamma sdfdist);\\ gl_FragCol = u_color * (alpha * gl_FragCol = lowp\\n#def floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale mat2 main() {\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * // store texture normals insignific bit\\n // transform y => -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n v_tex_a = * normal.y * + u_tex_y_a) v_tex_b = * normal.y * + // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def mapbox: mapbox: v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - = 0.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = lowp\\n#def mapbox: mapbox: main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n v_pos = / gl_Positio + 1.0) / 2.0 * lowp\\n#def sampler2D v_pos;\\n\\n main() {\\n imagecoord = mod(v_pos_ 1.0);\\n pos = imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = color2 = pos2);\\n\\n // find distance outline dist = length(v_p - = 0.0, dist);\\n \\n\\n gl_FragCol = mix(color1 color2, u_mix) * * gl_FragCol = lowp\\n#def v_pos;\\n\\n main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n scaled_siz = u_scale_a * scaled_siz = u_scale_b * // correct needs calculated //\\n // depends pixels world origin and\\n // edge tile:\\n // = size)\\n //\\n // high zoom levels ton pixels world origin\\n // edge tile. glsl spec guarantees 16 bits of\\n // precision floats. that.\\n //\\n // pixel_coor passed two 16 bit values:\\n // = / 2^16)\\n // = 2^16)\\n //\\n // calculated series steps preserve precision: offset_a = scaled_siz * 256.0, scaled_siz * 256.0 + offset_b = scaled_siz * 256.0, scaled_siz * 256.0 + v_pos_a = * a_pos + offset_a) / v_pos_b = * a_pos + offset_b) / v_pos = / gl_Positio + 1.0) / 2.0 * lowp\\n#def sampler2D main() {\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos = imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = color2 = pos2);\\n\\n gl_FragCol = mix(color1 color2, u_mix) * gl_FragCol = lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n scaled_siz = u_scale_a * scaled_siz = u_scale_b * // correct needs calculated //\\n // depends pixels world origin and\\n // edge tile:\\n // = size)\\n //\\n // high zoom levels ton pixels world origin\\n // edge tile. glsl spec guarantees 16 bits of\\n // precision floats. that.\\n //\\n // pixel_coor passed two 16 bit values:\\n // = / 2^16)\\n // = 2^16)\\n //\\n // calculated series steps preserve precision: offset_a = scaled_siz * 256.0, scaled_siz * 256.0 + offset_b = scaled_siz * 256.0, scaled_siz * 256.0 + v_pos_a = * a_pos + offset_a) / v_pos_b = * a_pos + offset_b) / lowp\\n#def sampler2D sampler2D main() {\\n\\n // read cross-fade colors parent tiles\\n color0 = v_pos0);\\n color1 = v_pos1);\\n = color0 * u_opacity0 + color1 * u_opacity1 rgb = color.rgb; // spin\\n rgb = vec3(\\n dot(rgb, dot(rgb, dot(rgb, // saturation average = (color.r + color.g + color.b) / 3.0;\\n rgb += (average - rgb) * // contrast\\n rgb = (rgb - 0.5) * + 0.5;\\n\\n // brightness u_high_vec = u_low_vec = gl_FragCol = u_low_vec, rgb), gl_FragCol = lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n v_pos0 = / 32767.0) - 0.5) / u_buffer_s ) + 0.5;\\n v_pos1 = (v_pos0 * + lowp\\n#def sampler2D sampler2D main() {\\n = v_fade_tex * u_opacity; gl_FragCol = v_tex) * gl_FragCol = lowp\\n#def matrix vertex bool main() {\\n a_tex = a_labelmin = a_data[0]; a_zoom = a_data.pq; a_minzoom = a_zoom[0]; a_maxzoom = a_zoom[1]; // u_zoom current zoom level adjusted change font size\\n z = 2.0 - u_zoom) - (1.0 - u_zoom));\\ extrude = * (a_offset / 64.0);\\n {\\n gl_Positio = u_matrix * vec4(a_pos + extrude, 0, 1);\\n gl_Positio += z * } else {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n }\\n\\n v_tex = a_tex / u_texsize; v_fade_tex = / 255.0, lowp\\n#def sampler2D sampler2D main() {\\n dist = v_tex).a;\\ fade_alpha = gamma = u_gamma * = - gamma, u_buffer + gamma, dist) * gl_FragCol = u_color * (alpha * gl_FragCol = lowp\\n#def PI = matrix vertex bool bool main() {\\n a_tex = a_labelmin = a_data[0]; a_zoom = a_data.pq; a_minzoom = a_zoom[0]; a_maxzoom = a_zoom[1]; // u_zoom current zoom level adjusted change font size\\n z = 2.0 - u_zoom) - (1.0 - u_zoom));\\ // map\\n // map | viewport\\n {\\n angle = ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing; asin = sin(angle) acos = cos(angle) mat2 RotationMa = mat2(acos, asin, -1.0 * asin, acos);\\n = RotationMa * a_offset;\\ extrude = * (offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos + extrude, 0, 1);\\n gl_Positio += z * // viewport\\n // map\\n } else {\\n // foreshorte factor apply pitched maps\\n // label goes horizontal vertical angle\\n // goes 0% foreshorte around 70% pitchfacto = 1.0 - cos(u_pitc * sin(u_pitc * 0.75));\\n\\ lineangle = a_data[1] / 256.0 * 2.0 * PI;\\n\\n // lineangle position a,b along line\\n // project calculate label angle projected space\\n // calculatio allows labels rendered unskewed pitched maps\\n = u_matrix * vec4(a_pos 0, 1);\\n b = u_matrix * vec4(a_pos + 0, 1);\\n angle = - b[0]/b[3] - a[0]/a[3]) asin = sin(angle) acos = cos(angle) mat2 RotationMa = mat2(acos, -1.0 * asin, asin, acos);\\n\\n = RotationMa * 1.0) * a_offset); extrude = * (offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n gl_Positio += z * // viewport\\n // viewport\\n } else {\\n extrude = * (a_offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n }\\n\\n v_gamma_sc = (gl_Positi - 0.5);\\n\\n v_tex = a_tex / u_texsize; v_fade_tex = / 255.0, lowp\\n#def main() {\\n\\n = 0.5;\\n\\n gl_FragCol = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\\n\\n > u_zoom) {\\n gl_FragCol = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n }\\n\\n (u_zoom >= v_max_zoom {\\n gl_FragCol = vec4(0.0, 0.0, 0.0, 1.0) * * 0.25;\\n }\\n\\n >= u_maxzoom) {\\n gl_FragCol = vec4(0.0, 0.0, 1.0, 1.0) * * 0.2;\\n lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\\n\\n v_max_zoom = a_data.x;\\ = values, const t) {\\n (t 7)return[n deprecated v8\")];if(! \"%s\" strict\";va a(l,e,\"arr expected, %s a(l,e,\"arr length %d expected, length %d r?[new deprecated v8\")]:[];v n(e,r,\"obj expected, %s found\",a)] o=[];for(v s start \"@\"'));ret strict\";va [%s], %s strict\";va t(e){var n(l,s,\"arr expected, %s n(l,s,'\"$t cannot operator n(l,s,'fil array operator \"%s\" expected, %s cannot functions functions strict\";va url include \"{fontstac url include \"{range}\" strict\";va n(c,r,'eit \"type\" \"ref\" i(e,r,\"%s greater maximum strict\";va n(e,r,\"obj expected, %s f r){var property n(e,r,'mis required property strict\";va i(e,o,'unk property strict\";va n(r,e,'\"ty e)for(var c a(t){retur Sans Unicode MS M=new n){for(var symbols rendered tile. See glyphs rendered tile. See exceeds allowed extent, reduce vector tile size\")}ret Error(\"Inv LngLat object: (\"+t+\", x(){return y(){return point(){re instanceof 0===s&&voi a(void Error(\"fai invert strict\";va n={\" strict\";va s(t){retur l(t,e,r,n) o=(new n(t,e){ret mapbox: ([\\w]+) ([\\w]+) ([\\w]+) a=new n?e(new Error(\"Inp valid GeoJSON t.data)ret e(new Error(\"Inp valid GeoJSON e(new Error(\"Inp valid GeoJSON e=0;ee)){v y;for(y p)c[y]=!0; i(t,e,i){v r(t,r){ret delete e(t);var n=new o(new e=new tile source layer \"'+M+'\" does vector tile spec v2 therefore may rendering g(t,L);var F B n=new t.time>=(n t=new i;var strict\";va Error(\"Inv o[e]}throw Error(\"Inv Error('Sou layer does exist source \"'+e.id+'\" specified style layer t.id});for Error(\"Sty done Error(\"The no source ID\");var delete instanceof this;var 0===e)thro Error(\"The no layer ID\");for(v this;var 0===i||voi 0===a?void strict\";va i(t){retur t.value}va r,n;for(va t){var for(n 0===e)dele 0===e)dele o}var strict\";va t){var this.grid= a}if(r){va _=u;for(va a}}}return r=new r(\"glyphs > 65535 i=!t&&new l(new c(new g(e,r){var y(e,r){var i(0,0));re M a)t[M]=new strict\";va t){var | n(){}var i(t){retur 61:case 107:case 171:case 189:case 109:case t=0,e=0;re t=new null!==t&& Error(\"max current minZoom 20, t,e={};ret instanceof e;if(t instanceof instanceof c?t:new i(this,e); Error(\"Fai initialize s if(void if(void n(t){var r=new n(t){for(v e=0;e1)for delete error c(t,e,r){v f(t,e){for null;var delete Error(\"An API access token required GL. See Error(\"Use public access token (pk.*) GL JS, secret access token (sk.*). See t}function i(t){retur a(t){retur t;var n(t){funct v[n];void t=0;t=1)re 1;var t={};for(v e =0.22.0 =0.22.0 No README run build-docs # invoked publisher publishing docs mb-pages --debug --standalo mapboxgl > && tap --no-cover build --github --format html -c --theme ./docs/_th --output --debug -t unassertif --plugin [minifyify --map --output --standalo mapboxgl > && tap --no-cover --debug -t envify > --ignore-p .gitignore js test bench diff --name-onl mb-pages HEAD -- | awk '{print | xargs build-toke watch-dev watch-benc build-toke watch-benc build-toke watch-dev run build-min && npm run build-docs && jekyll serve --no-cache --localhos --port 9966 --index index.html .\",test:\"n run lint && tap --reporter dot test/js/*/ && node && watchify bench/inde --plugin [minifyify --no-map] -t [babelify --presets react] -t unassertif -t envify -o bench/benc --debug --standalo mapboxgl -o n=new r=new r(t){var n(t,n){var i(t){retur t)return t){var 1=0)return V=1;V specify vertex creation specify cell creation specify phase strict\";va n(t){if(t l)return l[t];for(v Invalid boundary dst;};retu l){var u){var c){var \"+s),u){va p=new p=new p()}functi for(var o=0;o1)for f(e,r){var s=\"__l\"+ i=\"__l\"+ _=[\"'use L=new L=new L(r)}funct s(t,e){var r=[\"'use [2,1,0];}e [1,0,2];}} [2,0,1];}e o=new 0===t){var 0===r){r=n o(t,e){var s(t,e){ret a(t,e){var i=new t||\"up\"in strict\";va r=void 0!==r?r+\"\" e(t,e){for t}function o)throw path.resol t)throw path.join n(t){for(v Error(\"Giv varint doesn't fit bytes\");va o(t,e,r){v s(t,e){for type: n(t){var 0:return r||[];case 1:return 2:return Array(t);v r}var r(t,e){var Array(a),n n(t,e){for a(t){for(v t-e});var instanceof i(t){retur a(t){for(v a=1;i;){va l(t){for(v c(t){retur d(t){var u(m)}funct p(t){var 0x80 (not basic x});else for(_ n(t,e){ret o;var o};var n(t,e){for n&&void e(t){var e=new Error(\"(re \"+t);throw n(t){retur t?\": i(t,r,i){t r||e(\"unkn parameter possible values: parameter type\"+n(r) typed parameter type\"+n(i) expected \"+r+\", got \"+typeof t)}functio parameter type, nonnegativ shader source string\",a) \"+t+\": r=0;e(c(\"| compiling \"+s+\" shader, linking program vertex shader, fragment shader i(t){retur M(t,r){var n=m();e(t+ command called \"+n))}func A(t,e,r,i) e||M(\"unkn parameter possible values: parameter type\"+n(r) expected \"+e+\", got \"+typeof texture format renderbuff format L(t,e){ret z(t,e,n){v pixel arguments document,\" manually specify webgl context outside DOM supported, try upgrading browser graphics drivers name string\");v $(t){var et(t,e){va _e:r=new we:r=new Me:r=new ke:r=new Ae:r=new Te:r=new Se:r=new null}retur n=0;n0){va t[0]){var data\")}els shape\");va p=new n(a);retur d=[];retur t=0;return t&&t._buff instanceof a(t){var e||(e=new Ge:case Xe:case Ze:case element bit element buffers supported, enable first\");va vertex count a}var t&&t._elem instanceof pt(t){for( At(t){retu Tt(t,e){va Or:case Fr:case Rr:case jr:var texture type, specify typed St(t,e){re for(var s}return o*r*n}func texture texture unpack n){var enable extension order floating point enable extension order 16-bit floating point enable extension order depth/sten texture extension extension d(e,r,i){v m(){return K.pop()||n h}function y(t,e,r){v b(t,e){var e){var e){var e){var e){var e){var i(t,e){var arguments format c=new T(nr);retu format C=new z=new I(){for(va for(var P={\"don't care\":$r,\" mipmap mipmap mipmap mipmap s3tc dxt1\":Mr,\" s3tc dxt1\":kr,\" s3tc dxt3\":Ar,\" s3tc atc\":Sr,\"r atc explicit atc interpolat pvrtc pvrtc pvrtc pvrtc etc1\"]=Pr) r=B[e];ret null});ret texture shape z||\"colors render targets enable order floating point framebuffe enable order 16-bit floating point framebuffe enable 16-bit render enable order 32-bit floating point format format extension u=d=1;var for(D=new attachment \"+a+\" attachment same bits per depth attachment framebuffe stencil attachment framebuffe depth-sten attachment framebuffe resize framebuffe currently use\");var i;for(var shape framebuffe d||\"colors render targets format l=1;var a(t){var t=0;return vertex fragment shader\",n) a=i[t];ret a||(a=new o(o){var webgl context order read pixels drawing cannot read framebuffe allowed types 'uint8' framebuffe allowed 'uint8'\")) arguments regl.read( too s(t){var r;return l(t){retur l}function jt(t){retu Nt(t){retu Bt(){funct t(t){for(v r(){functi n(){var e=a();retu n(){var m(t){retur v(t,e,r){v g(t,e,r){v y(){var ei:var ri:return ni:return ii:return ai:return c={};retur n=e.id(t); c)return c[n];var b(t){var r){var if(Di n){var e}function x(t,e){var r){var i=r[Pi];re framebuffe n){var a=n[Pi];re framebuffe null}funct n(t){if(t i){var a){var \"+t)});var e?new s=o;o=new w(t){funct r(t){if(t i){var r});return n.id=r,n}i a){var o=a[t];ret null}var r(t,r){if( n){var i){var s=i[t];ret n){var i){var o=i[Ri];re n){var t=n[ji];re Be[t]})}if i){var r=i[ji];re \"+n,\"inval primitive, Aa}):new n){var vertex t})}if(Ni i){var r=i[Ni];re vertex s?new vertex offset/ele too l=new k(t,e){var o(e,n){if( r){var o})}else if(t i){var vi:case si:case oi:case Ai:case hi:case Ci:case xi:case wi:case Mi:case pi:return flag fi:return \"+i,\"inval \"+t+\", di:return attachment framebuffe sent uniform uniform a[r],\"inva uniform missing uniform T(t,r){var a&&a,\"inva attribute attribute divisor attribute parameter \"'+r+'\" attribute pointer \"'+t+'\" (valid parameters r)return r[s];var '+a+\"&&(ty dynamic attribute if(\"consta \"+a+'.cons === S(t){var a(t){var parameter L(t,e,r){v C(t,e,r,n) z(t,e,r){v n=m(e);if( r.state)){ c,h;if(n I(t,e,r,n) if(mt(u)){ l(t){var ua:case da:case ga:return 2;case ca:case pa:case ya:return 3;case ha:case ma:case ba:return 1}}functio attribute i(i){var a=c[i];ret a(){functi o(){functi vertex vertex vertex i(t){retur n(e){var n=r.draw[e s(t){funct e(t){var args args e(t){if(t r){var e=r[t];del delete l(t,e){var regl.clear no takes object cancel frame callback h(){var callback function\") event, Kt={\"[obje renderbuff renderbuff arguments renderbuff r(){return i(t){var s(){return p.pop()||n o}function u(t,e,r){v c(){var t(){var requires least argument; got none.\");va e.href;var \",e);var s=new o;n=-(i+a) null;var n(t){retur n(t){for(v R;};return i(t){var e=s[t];ret strict\";\"u n(t){for(v i}function h(t,e){for r=new r}function r=new l(e)}funct u(t){for(v e=s(t);;){ t=k[0];ret f(t,e){var r=k[t];ret n(t,e){var l}else if(u)retur l}else if(u)retur u;return i(t,e){ret t.y-e}func a(t,e){for r=null;t;) t;var r}function l(t){for(v n=d.index; n(t,e){var i(t,e,r,n) o(t,e){for r}function s(t,e){for m}function s[t];for(v unexpected failed parse named argument failed parse named argument mixing positional named placeholde (yet) s[t]=n}var n(t){for(v Array(e),n Array(e),i Array(e),a Array(e),o Array(e),s x=new u(t){retur c(t){var h(t){retur f(t){var d(t,e){for t}function p(t){retur t.x}functi m(t){retur t.y}var time\");var r=\"prepare \"+t.length %d clusters c)|0 p=new Array(r),m Array(r),v Array(r),g p=new o}function s}function T(t){retur n=z(t);ret t){var r={};for(v e={};for(v n(t,e){var i(t,e){var s/6}return 1}var n&&void e(t,e){var for(a=0,n= n})}}var s;var Error(\"n Error(\"alr s(t){retur l(t){retur u(t){retur c(t){retur h(t){retur f(t){retur d(t){retur p(t){retur m(t){retur x?new v(t){retur n(t)}var null}retur t=0;tn)ret instanceof n)return t;var i=new n;return a(t){retur instanceof o(t,e){ret s(t,e){ret 'url' string, \"+typeof t);var i(t,e){var a(t,e){var o(t,e){ret t}function s(t){var e={};retur a;var v=e.name?\" c(e)}var o+\": \"+s}functi d(t,e,r){v n=0;return \")+\" \"+t.join(\" \")+\" \"+t.join(\" \")+\" p(t){retur t}function v(t){retur g(t){retur t}function t}function t}function _(t){retur 0===t}func w(t){retur M(t)&&\"[ob k(t){retur M(t)&&\"[ob A(t){retur instanceof t}function S(t){retur t||void 0===t}func E(t){retur L(t){retur t=a)return Error(\"unk command if(7!==r)t Error(\"unk command i(t){for(v e}var Error(\"fea index String too long (sorry, fixed later)\");v l(t){for(v e(t){var e=n(t);ret e?u r(t,e){var o(t){var i?u i&&delete t){var r?r[0]:\"\"} n?!r&&en)t al-ahad\",\" {0} {0} {0} {0} mix {0} {1} a(t,e){ret ;var format date another position name position literal position text found dd M MM d, d M d M d M d M yyyy\",RSS: d M a=this;ret var _inline_1_ = - var _inline_1_ = - >= 0) !== (_inline_1 >= 0)) {\\n + 0.5 + 0.5 * (_inline_1 + _inline_1_ / (_inline_1 - }\\n n(t,e){var r=[];retur strict\";va u(r,i){ret i(t,e){var E.remove() null;var strict\";va c();var t}function i(t){var e=x[t];ret a(t){retur calendar system `\"+t+\"` date data.\"}var i={};retur t}var i?\"rgba(\"+ n=i(t);ret t){var A(e,r){var T(){var strict\";va strict\";va strict\";va strict\";va strict\";va strict\";va n(){var e(e){retur r;try{r=ne strict\";va i(t,e,r,n) a(t){var n.remove() \")}).split \")}).split scale(\"+e+ n,i,a;retu strict\";va 1,1 0,1 \"+a+\",\"+a+ \"+a+\",\"+a+ \"+r+\",\"+r+ \"+r+\",\"+r+ 1,1 0,1 1,1 0,1 n(t,e,r,n) t.id});var strict\";va strict\";va i(t,e,r){v r(t){var r.remove() r(e,r,o){v if(i[r]){v o;if(void strict\";va n(t){var n(r){retur strict\";va n(t){for(v \");var i(t,e){var click legend isolate individual l(t){var u(t){var strict\";va r[1]}retur i}function i(t){retur t[0]}var h(t){var f(t){var d(t){var n(t,e){var i(t){for(v n(t){for(v 0}}var o(t,e){var 1,1 0,1 extra params segment t(e).repla strict\";va strict\";va u(r,i){ret r(t,e){ret l(t,e,r){v u(t,e,r){v c(t,e){var n(){return p(t,e){var g(t,e){ret y(t,e){ret b(t,e,r){v x(t,e){var _(t){for(v r(t,e){ret strict\";va strict\";va strict\";va t){var t)return n}function l(t){retur u(t){retur c(t){retur d\")}functi h(t){retur d, yyyy\")}var t.getTime} r={};retur n=new a(t){retur o(t){for(v r={};retur n(){return strict\";va for(var c(t){retur property r(t,e){var instanceof RegExp){va o(t,e){ret t>=e}var binary r=e%1;retu n(t){var e=i(t);ret n(t,e){ret i(t){retur \")}functio a(t,e,r){v error tex null;var r=0;r1)for i=1;i doesnt match end tag . Pretending did s}function c(t,e,r){v o(),void e();var 0,\":\"],k=n t(t,e){ret n(t){var i(){var strict\";va strict\";va n(t,e){for r=new Error(\"No DOM element id '\"+t+\"' exists page.\");re 0===t)thro Error(\"DOM element provided null previous rejected promises t.yaxis1); array edits incompatib edits\",h); full array edit if(void & removal incompatib edits same full object edit Error(\"eac index \"+r+\" Error(\"gd. 0===e)thro required Error(\"cur indices equal u(t,e,r){v Error(\"gd. 0===e)thro Error(\"tra i(t){retur a(t,e){var r=0;return Error(\"Thi element Plotly plot: \"+t+\". likely you've failed plot before animating it. details, see c()}functi d(t){retur overwritin frame frame whose name \"number\" equates \"'+f+'\". valid may potentiall lead unexpected behavior since plotly.js frame names stored internally API call yielded too warnings. rest call, further warnings numeric frame names addFrames accepts frames numeric names, numbers areimplici cast n(t){var i}function i(){var t={};retur a(t){var o(){var s(t){retur l(t){funct u(t){funct c(t){retur h(t,e,r){v f(t,e,r){v e={};retur t&&void n(t){retur Error(\"Hei width pixel values.\")) l(t,e,r){v u(t,e,r,n) \"+o:s=o+(s dtick p(t,e){var c=new t.dtick){v error: t+i*e;var dtick a(t){for(v strict\";va v(r,n){ret enter axis\")+\" e;var n(t,r){for n(t,e,r,n) u(t,e){ret y(t){var b(t,e,r){v back X(e,r){var K()}functi W(e){funct n(e){retur k.log(\"Did find wheel motion attributes \",e);var strict\";va n(t){retur t._id}func went wrong axis Error(\"axi o){var t(t){var e(t){retur strict\";va r(r,n){var e/2}}funct v(t,e){var g(t,e){var b(t,e){var x(t,e){var Error(\"not yet r(t,r){for i(){for(va a(t,e){for n(t,e){var n(t){retur i(t,e,r,n) a(t,e){ret i(t,e){var r(t){retur n(t){var l(t,e){var u(t){var c(t,e){var f(t,e,r){v strict\";va i(t){var e=new n;return a(t){var o(t){var i=new n(t,e);ret strict\";va Sans Regular, Arial Unicode MS r(t,e){ret - delete t)return e,n,i={};f i}return r=a(t);ret e&&delete P=(new + + + + + + + + + + + + + + + 0px\",\"1px -1px\",\"-1p 1px\",\"1px \"+t+\" \"+n+\" \"+n+\" \"+n+\" c=\"t: \"+u.t+\", r: l;var t)r r=e||6;ret 0===t)retu null;var t(){var t={};retur n.mode,del strict\";va e(e,i){ret s;return t(t,e){ret i=r[n];ret strict\";va t(t,e,r){v e(t,e){ret r(t,e){ret a(t,i){var tozoom back f(t,e){var i(t){retur y,b;return o,s;return ii))return e}return h(t){retur f(t,e){ret strict\";va strict\";va 0, 0, strict\";va s;return strict\";va null;for(v strict\";va o(e){var s(e){var strict\";va n(t,e,r){v i(t,e,r){v strict\";va converged strict\";va strict\";va strict\";va strict\";va s(r,i){ret n(t,e,r,n) strict\";va n(t,e){for o(t){retur strict\";va strict\";va strict\";va c(r,i){ret loop contour?\") s(t,e,r){v 15===r?0:r contours, clipping i}function a(t,e,r){v o(t,e,r){v s(t,e,r,n) e=l(t,r) r(t){retur newendpt vert. perimeter invalid specified inequality contours, clipping strict\";va strict\";va h(t){retur newendpt vert. perimeter o(t,e,r){v s(t,e,r){v strict\";va iterated no strict\";va g}var didn't converge strict\";va s=0;sa){va strict\";va l(r,n){ret u(t){var e=l(t);ret strict\";va strict\";va e(e){var strict\";va strict\";va r(t,e){ret traces support \"+u+\" dimensions c}var l(r,n){ret strict\";va l(n){var i}function c(t,e,r){v l(t,e,r){v n=o(r);ret u(t,e){ret c(t){retur h(t){var e=o(t);ret f(t){var d(t){retur t[0]}funct p(t,e,r){v m(t){var v(t){retur l(t){var u(t){retur c(t,e){for e.t+\"px \"+e.r+\"px \"+e.b+\"px 255, 255, 0)\");var #fff, -1px -1px #fff, -1px #fff, -1px strict\";va i(t,e,r){v strict\";va n(t,e){for m};var strict\";va o(r,a){ret strict\";va strict\";va strict\";va n(t,e,r){v u;var 1;var a(t,e){var r(t,e){ret n(t,e){ret s(t,e){var 1;var t+\" strict\";va strict\";va strict\";va 0, i(t,e){var r=new for(r=new present Sankey data. Removing nodes strict\";va u(r,a){ret n(t){retur t.key}func a(t){retur t[0]}funct o(t){var 0)\":\"matri 0)\")}funct M(t){retur k(t){retur 0)\":\"matri 0)\"}functi A(t){retur 1)\":\"scale 1)\"}functi T(t){retur S(t){retur L(t,e,r){v var C(t,e,r){v i(){for(va e={};retur #fff, #fff, -1px #fff, -1px -1px strict\";va _=new strict\";va strict\";va strict\";va m(r,a){ret strict\";va strict\";va strict\";va r(e){var i(t){var strict\";va n(t,e){var + m(t){retur v(t){retur g(t){retur t.id}funct g}function x(e){var scatter strict\";va s(t,e){ret l(t){retur M[t]}funct o=0;o=0){v n(t,e,r,n) strict\";va d(r,i){ret s=o[0];if( 0;var v.push(\"y: strict\";va strict\";va e(t){retur r(t){var 1/0;var strict\";va n(t,e){var n}function s(t,e,r,n) n=new s(t){var 1/0;var strict\";va strict\";va strict\";va strict\";va d(r,i){ret strict\";va strict\";va e=f(t);ret e=f(t);ret e=f(t);ret e=f(t);ret In\u00a0[4]: # Helper pulling quandl def '''Downloa cache Quandl series''' cache_path = try: f = 'rb') df = pickle.loa #print('Lo {} except (OSError, IOError) e: {} df = #print('Ca {} cache_path df In\u00a0[5]: # Quandle codes dataset. data_sets = # Cool loop variables. dict_of_df = {} item data_sets: data_code = item == \"EURGBP\": dataset = get_data( ) else: dataset = get_data( ) = dataset Format data\u00b6After importing needs changed convenient form. notebook download price Bitcoin GBP, price Ethereum Litecoin Bitcoin. these different dataset Quandl, copied relevant frame contained everything interested price Ethereum Litecoin GBP product respective prices Bitcoin Bitcoin\u2019s price GBP. calculated created columns store the\u00a0result In\u00a0[6]: # helper_fun take column dfs merge single df def col): '''Merge single column dataframe combined dataframe' series_dic = {} dict_of_df = In\u00a0[7]: = # Merge opening price currency single dataframe df = 'Open') #df.tail() = np.NaN # convert GBP rename columns df['btc'] = df['gbp'] df['eth'] = df['gbp'] * df['eth_bt df['ltc'] = df['gbp'] * df['ltc_bt df['eur'] = df['EURGBP #df = axis=1) In\u00a0[8]: # put price own df (\"prices\") growth analysis later # keep prices GBP GBP varies less any common measure. prices = 'eth', 'ltc', 'eth_btc', 'ltc_btc'] In\u00a0[9]: prices = Asset charts\u00b6Bit - \u00a3\u00b6 In\u00a0[10]: #end = #df = # Bitcoin price series1 = go.Scatter name='Pric = dict( = ('green'), width = 2)) series2 = go.Scatter name='7 SMA', = dict( = ('blue'), width = 1)) series3 = go.Scatter name='30 SMA', = dict( = ('red'), width = 1)) = [series1, series2, series3] layout = go.Layout( title='Bit price', yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[10]: Ethereum - \u00a3\u00b6 In\u00a0[11]: #end = #df = # Ethereum price series1 = go.Scatter name='ETH' = dict( = ('green'), width = 2)) series2 = go.Scatter name='7 SMA', = dict( = ('blue'), width = 1)) series3 = go.Scatter name='30 SMA', = dict( = ('red'), width = 1)) = [series1, series2, series3] layout = go.Layout( price', yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[11]: Ethereum - BTC\u00b6 In\u00a0[12]: #end = #df = #prices = 'eth', 'ltc', 'eth_btc', 'ltc_btc'] # Ethereum price series1 = go.Scatter = dict( = ('green'), width = 2)) series2 = go.Scatter name='7 SMA', = dict( = ('blue'), width = 1)) series3 = go.Scatter name='30 SMA', = dict( = ('red'), width = 1)) = [series1, series2, series3] layout = go.Layout( / Bitcoin', yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[12]: LiteCoin - \u00a3\u00b6 In\u00a0[13]: #end = #df = # Litecoin price series1 = go.Scatter name='LTC' = dict( = ('green'), width = 2)) series2 = go.Scatter name='7 SMA', = dict( = ('blue'), width = 1)) series3 = go.Scatter name='30 SMA', = dict( = ('red'), width = 2)) = [series1, series2, series3] layout = go.Layout( price', yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[13]: Litecoin - BTC\u00b6 In\u00a0[14]: # end = # df = win1 = 7 win2 = 30 # Litecoin price series1 = go.Scatter = dict( = ('green'), width = 1)) series2 = go.Scatter name='{} = dict( = ('blue'), width = 2)) series3 = go.Scatter name='{} = dict( = ('red'), width = 2)) = [series1, series2, series3] layout = go.Layout( / Bitcoin', yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[14]: SMA Analysis\u00b6T price digital assets above shows high degree variance, first visualized price history wanted smooth somehow. plotted simple moving average became curious different types average look like. noticed longer shorter SMAs (Simply Moving Averages) cross occasional wondered useful below (if hidden, click \u2018show code\u2019 link beginning post) shows calculate SMAs, identify two series cross other, calculate returns buying selling depending long SMA moves above short SMA, short moves above\u00a0long wanted know combinatio SMA periods yield best results, heat maps show\u00a0this. Finally, given date range, asset pair short long SMA combinatio plotted performanc trading strategy those parameters through time. see algorithms performanc consistent large losses occur. show upfront cost needed realise the\u00a0return Net gains w/ different SMA combinatio In\u00a0[15]: # identify where two SMAs cross over # dates where occurs, label buy sell def sma1, sma2): sma2 < sma1: sma1, sma2 = sma2, sma1 df = pd.DataFra df['btcPri = prices['bt df['data'] = prices[pai df['sma1'] = df['sma2'] = df['diff'] = df['sma1'] - df['sma2'] df['inGBP' = df['btcPri * df['data'] # sell ltc btc diff < && cross == True # buy ltc btc diff > && cross == True = df = df.dropna( df['nextDi = df['cross' = (((df['dif >= line) & < line)) | > line) & (df['diff' <= line)) | (df['diff' == line)) rows = == True] rows['trad = '...' rows['trad (rows['cro == True) & (rows['dif > 0) ] = 'sell' rows['trad (rows['cro == True) & (rows['dif < 0) ] = 'buy' # df = # rows = just rows df where SMA1 crosses SMA2 = {'data':df 'xOver':ro In\u00a0[16]: 3, In\u00a0[17]: # take crossOver calculate gain lose # selected dates def returns(pa sma1, sma2, dt1, dt2 = # sure dt1, dt2 correctly formatted! = sma1, sma2) # crossOver returns dictionary items # just rows where SMA1 crosses SMA2 # just rows dates interested trades = # start buy. delete first row sell != 'buy': trades = # calc profit # nice labels dict buys = sells = buysGBP = sellsGBP = p = sells - buys pGBP = sellsGBP - buysGBP results = {'pGBP': pGBP, 'profit': p,'trades' count,'sum buys': buys,'sum sells': sells, 'data':tra 'pair':pai results In\u00a0[18]: # calls two functions (defined above) # Input asset pair, start finish dates, range SMAs calc # Returns ok-ish heatmap def pair, maxDays, dt1, dt2 = tbl = maxDays)) j j<=i: tbl[i,j] = np.NaN else: tbl[i,j] = ['proift'] #tbl trace = ) data=[trac layout = go.Layout( title='{} ) fig = layout=lay #out = = py.iplot(f In\u00a0[19]: maxDays=30 maxDays=30 Out[19]: Out[19]: Returns through combinatio sma1 sma2\u00b6 In\u00a0[20]: # creates plot showing profit through given input def pair, sma1, sma2, dt1, dt2 = = returns(pa sma1, sma2, dt1) ts = out['data' ts['data'] = == 'buy', ts['data'] * -1, ts['data'] ts['dataGB = == 'buy', ts['inGBP' * -1, ts['inGBP' ts['return = = = = #ts series1 = go.Scatter = dict( = ('blue'), width = 1)) series2 = go.Scatter name='av', = dict( = ('#137a28' width = 2)) = [series1, series2] layout = go.Layout( title='{}: sma1 = {}d, sma2 = sma1, sma2 ), yanchor='t y=1.1, x=0.5) ) fig = layout=lay plot = py.iplot(f #plot = results = {'data': ts , 'plot':plo } results In\u00a0[21]: sma1=8, sma2=5, pltly_name = Out[21]: In\u00a0[22]: sma1=10, sma2=6, Out[22]: Next steps:\u00b6 bot monitor real price data, calculate moving averages, place\u00a0trad you\u2019d collaborat this, please contact\u00a0me { var mathjaxscr = = = = ? \"innerHTML : \"text\")] = + \" config: + \" TeX: { extensions { autoNumber 'AMS' } },\" + \" jax: + \" extensions + \" displayAli 'center',\" + \" displayInd '0em',\" + \" showMathMe true,\" + \" tex2jax: { \" + \" inlineMath [ ['$','$'] ], \" + \" displayMat [ ['$$','$$' ],\" + \" true,\" + \" preview: 'TeX',\" + \" }, \" + \" 'HTML-CSS' { \" + \" linebreaks { automatic: true, width: '95% container' }, \" + \" styles: { .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important' }\" + \" } \" + \"}); \"; (document. || }"},{"title":"I\u2019m a chartered\u00a0accountant","url":"chartered.html","body":"Earlier year qualified chartered accountant Qualificat requires passing 15 exams gaining 3150 hours celebrate passing exams verify success, ICAEW print names everyone who passed advert Financial Times. happened 26\u00a0January"},{"title":"Coworking in\u00a0Dublin","url":"coworking.html","body":"Last week arrived Dublin had two days find coworking space. ran around Dublin visiting as\u00a0possibl I\u2019m looking rent hotdesk, means any storage space office Below impression eight businesses offering either hot desks dedicated desks, ranked order preference subjective going rate Dublin seems \u20ac200 \u2014 \u20ac300 per month hot desk. Hours range 9am - 7pm Monday - Friday, to\u00a024/7. First place: Dogpatch\u00a0L Dogpatch offer coworking space access community tech startups. run regular networking mentoring events occupy floors warehouse next old dock. offices range interiors styles. middle level fairly standard pleasant open plan offices, top floor flexible working space event areas. lower level series vaults contain meeting rooms various sizes. There\u2019s lot going there\u2019s buzz the\u00a0air. range interior spaces big plus I\u2019m looking forward able switch working environmen through day. There\u2019s couple kitchen areas, table football table-tenn table top level. Access 6am - midnight, hot desk \u20ac200 per month. dedicated desk is\u00a0\u20ac400. Dogpatch occupy less quarter warehouse building, remainder space shopping mall museum. opinion Dogpatch far best you\u2019re working tech it\u2019ll probably Second place: Studio9 These guys great. space lot smaller Dogpatch, comprising ~12 desks. basement, put off \u2014 open plan large windows either end. space well designed uses lot light colours textures, including wood walls floors. plenty pot plants. These combine give bright airy atmosphere feels very natural and\u00a0bright alcoves down side room serve meeting rooms, garden basic kitchen back. owners space foster community, expect achieved. no dedicated offices no teams multiple desks, everyone desks large, own little wall provide privacy. \u20ac200 per month ongoing, \u20ac250 just month. offer trial for\u00a0free. Third place: OfficeSuit building looks well run appears clean fresh adequate resources. building old Georgian tenement high ceilings, cornicing lots natural light. furnishing decor lean towards corporate rather something interestin works well add profession feel homely architectu Access is\u00a024/7. There\u2019s two rooms hotdesking building given private offices. There\u2019s garden bike storage, meeting rooms quiet room calls. Lockers extra. offer free a\u00a0trial. \u20ac249 p/m desk access 9am-7pm Monday -\u00a0Friday Fourth place: Element78 Friendly well resourced, very corporate. architectu corporate glass steel. They\u2019re situated ground floor posh business district large financials neighbours too corporate me, wanted impressive place meet clients nice address, it. 15 hot-desks rent, plus plenty dedicated desks. Clients seemed include mostly young tech companies I\u2019m hoping find somewhere community, inspiring architectu character. offered free a\u00a0trial. \u20ac200 first month \u20ac350\u00a0p/m Fifth place: Glandore Glandore offer relatively luxurious package corporate feel. few buildings Dublin flagship hotdesking space. There\u2019s super looking restaurant large club room relax in, these features need, rates aren\u2019t competitiv desk somewhere take calls. teams impressing clients, independen tech workers probably better off\u00a0elsewh \u20ac295\u00a0p/m Sixth place: Regus Regus offer polished boarding experience friendly staff quick respond generally helpful, office space bland, grey generic. rooms visited didn\u2019t external windows reminded rooms banks often put auditors in. grey walls tube lights thing you. 24/7 access, meeting rooms equipped with\u00a0A/V. \u20ac299.70\u00a0p/ Seventh place: CoCreate visited southern branch thought building bit shabby needed layer paint. recognised desks cheapest available IKEA. rooms small needed cleaning, weird art the\u00a0wall. thought paying \u20ac200 month sit small wobbly desk put off. place almost deserted. Maybe branch better, for\u00a0me. \u20ac220\u00a0p/m. Last place: tCube Last least, tCube seems putting zero effort. visited saw two rooms needed painting, disorganis furniture abandoned bits computers lying around. kitchen isn\u2019t high spec meeting room isn\u2019t big enough. given speech great wifi - prerequisi taken granted everywhere else. \u20ac300 p/m dedicated desk easy find better"},{"title":"Bitnation","url":"bitnation.html","body":"I\u2019m\u00a0Consul Next week begin working Bitnation finance officer. I\u2019m excited really ambitious project technology something innovative and\u00a0valuab Bitnation Bitnation\u2019 purpose offer same services government do, way delivers benefit to\u00a0users. West may immediatel sound big deal. Our government fairly organised services usually \u201cgood enough\u201d. significan thinking ID services (passports visa, drivers licences) registrati services (land registry, marriage certificat service customers - our internet service provider, our parts world dysfunctio unjust government represent huge obstacle improving everyday life, progress achievemen people hope realise limited of\u00a0this. viable alternativ passport jurisdicti renowned forgery, credit rating acknowledg land holdings despited government inability maintain credible database, begin travel, trade enjoy benefits citizens western states take for\u00a0grante I\u2019m excited skills innovative tech company aiming something Services include secure ID systems, asset registry dispute resolution Identifica (in particular area full problems, blockchain tech offer really significan improvemen Bitnation wants platform where voluntary nations created administer where people choose jurisdicti system part of. widely implemente Jurisdicti offer own services according own principles easy membership voluntaril jurisdicti compete attract citizens. lead improvemen users service, intended provide alternativ slow, expensive opaque processing methods commonly associated services geographic"},{"title":"Create a Multi-Signature Ethereum wallet using\u00a0Parity","url":"ethereum-parity-multisig-wallet.html","body":"recently multi-sig Ethereum wallet couldn\u2019t find clear instructio Here are, hope these instructio useful someone looking get\u00a0starte You\u2019ll way interact Ethereum blockchain order deploy wallet. several apps use. Parity found simple and\u00a0quick. Wallets contract two types wallet, Multi-Sig wallet Watch wallet. Ethereum account required communicat contract multi-sig wallet signatorie (for example) least those Ethereum accounts before creating the\u00a0wallet Parity their\u00a0webs Integrated directly Web browser, Parity fastest secure way interactin bunch stuff Parity including mining Ether, manage accounts, interact different dapps, send/recei different accounts, contracts. accounts tab, quickly wallets. Chrome plugin handy notificati transactio confirmed Download open\u00a0Parit MacOS download install Parity visiting Parity site downloadin installer, terminal curl or\u00a0Homebre Simple\u00a0opt $ bash <(curl -kL) Homebrew Detailed instructio here. brew tap brew install parity --stable installer, open Parity opening app logo the\u00a0menuba Brew, start Parity parity go following address your\u00a0brows now see something similar to\u00a0this: Add Select Accounts tab top page select \u201c+ Account\u201d. Either accounts preferred method. accounts part multi-sig wallet, account own wallet create. account large enough Ether balance pay transactio costs deploy multi-sig wallet onto Blockchain costs tiny, greater than\u00a0zero. Once you\u2019ve either created imported account deploy wallet, select \u201c+ Wallet\u201d accounts tab choose \u201cMulti-Sig wallet\u201d. Click\u00a0next Enter name wallet, add local descriptio \u201cFrom account\u201d contract owner account\u00a0wi enough Ether pay execution contract Click \u201c+\u201d button under \u201cOther wallet owners\u201d add address signatory accounts. You\u2019ll add signatory these accounts own wallet once is\u00a0deploye \u201crequired owners\u201d section, specify accounts approve transactio above daily \u201cwallet limit\u201d Ether spent account per without needing another account approve transactio amount transactio require approval, turn option off slider right (which just specifies huge\u00a0numbe Click \u201cnext\u201d you\u2019ll shown pop-up window approve creation wallet. enter password account creating wallet, once click \u201cConfirm request\u201d funds creators accounts deploy contract chain Adding existing Once wallet created deployed, you\u2019ll add parity clients signatorie confirm transactio wallets balance. done adding watch\u00a0wall Process: Accounts tab > + Wallet > Watch wallet > enter address signatorie now able wallet\u2019s balance, notificati pending confirmati able Managing Anyone put funds wallet, just account. Just send Ether top page click \u201cEdit\u201d change local name descriptio the\u00a0wallet \u201cSettings\u201d allows add remove owners (signatori wallet change required approvals wallet limit. change these settings changes executed blockchain account requesting change therefore pay required funds. Depending settings changed, accounts approve changes before \u201cForget\u201d remove multi-sig wallet accounts\u00a0t Moving funds Click \u201cTransfer\u201d wallet management window (pictured above) begin withdrawin funds the\u00a0wallet Select token transfer - Ethereum \u201cSender address\u201d - specify account wants withdraw funds \u201cRecipient address\u201d - specify account receive the\u00a0funds. \u201cAmount transfer\u201d - specify transfer. amount greater remaining daily limit warning bar telling transactio require confirmati wallet\u00a0own specify maximum transactio fee (a payment lower fee confirmed slowly usual) tick \u201cadvanced sending options\u201d\u00a0b Clicking \u201csend\u201d bring confirmati stage where enter password account requesting the\u00a0transf approval wallet owners required Parity, see approval required two ways: signer tab show pending request. wallet management window (accessed accounts tab) \u201cpending transactio section where any confirmati requests shown."},{"title":"Macro analysis of the Bitcoin\u00a0blockchain","url":"macro-btc.html","body":"Table transactio confirmati block (daily, MB)4\u00a0\u00a0Aver transactio per (1MB) fees earned miners day6\u00a0\u00a0Rati transactio fees transactio transactio per day8\u00a0\u00a0Bitc price9\u00a0\u00a0Ra unique addresses series In\u00a0[1]: HTML code_toggl { (code_show } else { } code_show =! code_show } $( document analysis made Python. you'd see used, click =0);v t&&t>=0);v a(1);for(v t&&t>=0);v works positive a(0),mod:n a(0)};var i,o,s;retu i=new a(1),o=new a(0),s=new a(0),l=new i=new a(1),o=new f;return A[t];var p;else m;else Error(\"Unk prime \"+t);e=new g}return works works red works works red l}}}functi s(t){retur l(t,e){ret 1:return s(t);case 3:return Invalid n(t,e,r){v \"+r);var n(t,e){var i=\"for(var i=n[t];ret var P=C+1;PZ)t typed array length\");v e=new e)throw Error(\"If encoding specified first argument l(t)}retur t)throw argument instanceof t)throw argument allocate larger maximum size: bytes\");re 0|t}functi instanceof 0;for(var 0:return v(t,e,r){v n=!1;if((v hex E(n)}funct E(t){var access beyond argument a}function U(t){for(v a}function H(t){retur i}function Y(t){retur t!==t}var t=new browser lacks typed array (Uint8Arra support required `buffer` v5.x. `buffer` v4.x require old browser 0;for(var ... range 0;for(var 0)}var write outside encoding: Error(\"Inv string. Length multiple i(t){retur a(t){var o(t){retur i(t,e){ret a(t,e){for i(g,d,v,h) n(t){var i(t,e){for r=new s}function m(t,e,r){v i=new n(t){var strict\";va t;var Error(f+\" map requires nshades least i(t,e,r,i) 0}return n(t,e){ret t-e}functi i(t,e){var 0:return 0;case 1:return t[0]-e[0]; 2:return 3:var i;var 4:var n(t){var t}function i(t){retur a(t){retur o(t){retur null}var null;var a}return a}return i(t){var e=new i=0;i0)thr Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array args\")}els Error(\"cwi pre() block may reference array Error(\"cwi post() block may reference array index\")}el Error(\"cwi Too arguments pre() Error(\"cwi Too arguments body() Error(\"cwi Too arguments post() block\");re n(t,e,r){v l(t,e){for w=new cwise routine n(t){var e=[\"'use strict'\",\" (!(\"+l.joi && \")+\")) throw Error('cwi Arrays same {\"),e.push (!(\"+u.joi && \")+\")) throw Error('cwi Arrays same i(t,e,r){v m,v=new t;var e=[];for(v e=[];for(v e=[];for(v n&&void e(t,e){var r}function r(){}funct n(t){var e;return y(t){retur b(t){retur Error(\"unk type: i(t,e){for r,n,i=new i(){if(s){ t(t){var r(t){var Array(o),l this;var 1:do{o=new 2:do{o=new 3:do{o=new t=[];retur s(){var l(){for(va a(t){retur n}}}functi l(t){retur u(t){for(v e}function c(t,e){for p(t){retur f(t)in this._&&de v(){var t=[];for(v e t}function g(){var t=0;for(va e t}function y(){for(va x(t){retur t}function function() w(t,e){if( t)return Z(t,e){ret J(t,e){var K(t){var vt(t){retu gt(t){retu yt(t){retu _t(t){retu wt(t){retu kt(t,e,r){ Ot(){for(v t}function Ft(){for(v Nt(t){var b=u&&h;ret Bt(t){retu t+\"\"}funct n(e){var e}function Gt(t,e,r){ le(t){var ce(t){for( ge(t){var ye(t,e){re we(t){var ke(t,e){re y}}functio Fe(t){retu Re(){var r=e;return r(t){var a(t,e){ret o(t,e){var l(t){for(v c(i,a){ret Je(){funct s}function 1,1 1,1 $e(){funct t(t,n){var er(){funct t(t,e){var rr(t){func s}function nr(t){func r(e){retur n(e){funct a(r,n){var k}function ir(t){var sr(t){retu t})()}func lr(t){func e(t){retur i(){return ur(t){retu r(t,e){var Vr(t,e){va n;var s;var Hr(t,e){va Vr(r,e);va Gr(t){for( r}function wn(t,e){va kn(t){retu An(t){retu 1;var Zn(t,e){va n}function bi(t){retu xi(t,e){re _i(t,e){re Ei(t){func Ni(t){retu t.y})}func Bi(t){retu Ui(t){var Vi(t){var qi(t,e){va a(t){retur o(t)}var o,s;return Qi(t,e){re $i(t,e){re a(t){retur o(e){retur t(i(e))}re _a(t){func e(e){funct Ma(t){retu ka(t){for( Aa(t){for( p[n]:delet t[r],1}var io(t){retu n(e){retur t(e)}funct i(t,r){var r};var t;var e=new b;if(t)for h(){functi f(){functi t(){var r(){var n(){var o;if(i)ret i=!1,a;var e=new ms={\"-\":\"\" %b %e %X this.s}};v bs=new e(e,r){var t(){var e(){return }var t(e,r,n,i) c}function e(t){for(v r}function t(t,a){var t(t,e){for i(t,e,r,n) \"+e}functi 0,0 \"+n}var t(t,i){var \"+l[2]+\" \"+l[3]}var 0,\"+e+\" \"+e+\",\"+e+ a(){functi v(){var l;var t;e||(e=t) e}function s(t){var l(t,e,r,n) u(t,e,r){v n=t;do{var n}function l=t;do{for h(t,e,r,n) r}function m(t,e,r,n) v(t){var t}function x(t,e){ret w(t,e){ret k(t,e){var A(t,e){ret n(t,e){var e){e=0;for warning: possible EventEmitt memory leak detected. %d listeners added. increase function\") n=!1;retur e=typeof o(t,e,r,n) \"+i+\"=== typeof s(t,e){ret e.length> 1; (a[m] === v) true; (a[m] > v) j = m - 1; else = m + 1;}return false; }(\"+n+\", u(t){retur p\"}functio h(t,e){ret c[1]){var s[e][t];va i(t){retur a(t,e){ret r}var 0)}functio d(t){for(v m(t){retur t=[];retur t=[];retur 1:return 2:return this.tree; e=new i=0;i0)ret Error(\"Can update empty node!\");va r=new s(t){for(v z%d-%d-%d (features: %d, points: %d, simplified down parent tile down\");var i(t,e,r){v s}function i(t,e,r,n) s(t,e){var r=new i(t);retur e(e,r,n){i t){var U=g,V=_,k= 0.0) {\\n nPosition = mix(bounds bounds[1], 0.5 * (position + 1.0));\\n gl_Positio = projection * * * 1.0);\\n } else {\\n gl_Positio = }\\n colorChann = 1\\n\\nunifo main() {\\n gl_FragCol = colorChann * colors[0] + \\n colorChann * colors[1] +\\n colorChann * vectorizin d=new o(t,e,r,n) s;var r}function a(t,e){for r=0;rr)thr resizing buffer, specify a(t,e){for Invalid webgl buffer, either Invalid usage buffer, either gl.STATIC_ t&&void Cannot specify resizing Error(\"gl- Can't resize FBO, invalid Error(\"gl- Parameters too large Error(\"gl- Multiple draw extension Error(\"gl- Context does support \"+s+\" draw buffers\")} Error(\"gl- Context does support floating point h=!0;\"dept Error(\"gl- Shape vector length 2\");var null;var 0.25) {\\n discard;\\n }\\n gl_FragCol = 1\\n\\nattri aHi, aLo, pick0, scaleHi, translateH scaleLo, translateL pickA, scHi, trHi, scLo, trLo, posHi, posLo) {\\n (posHi + trHi) * scHi\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * main() {\\n p = translateH scaleLo, translateL aHi, aLo);\\n = width * * vec2(dHi.y -dHi.x)) / gl_Positio = vec4(p + n, 0, 1);\\n pickA = pick0;\\n pickB = 1\\n\\nunifo pickA, pickB;\\n\\n main() {\\n fragId = 0.0);\\n if(pickB.w > pickA.w) {\\n fragId.xyz = pickB.xyz; }\\n\\n fragId += fragId.y += floor(frag / 256.0);\\n fragId.x -= floor(frag / 256.0) * 256.0;\\n\\n fragId.z += floor(frag / 256.0);\\n fragId.y -= floor(frag / 256.0) * 256.0;\\n\\n fragId.w += floor(frag / 256.0);\\n fragId.z -= floor(frag / 256.0) * 256.0;\\n\\n gl_FragCol = fragId / 1\\n\\nattri aHi, aLo, scaleHi, translateH scaleLo, translateL projectVal scHi, trHi, scLo, trLo, posHi, posLo) {\\n (posHi + trHi) * scHi\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * main() {\\n p = translateH scaleLo, translateL aHi, aLo);\\n if(dHi.y e+n;var null;var FLOAT_MAX) {\\n vec4(127.0 128.0, 0.0, 0.0) / 255.0;\\n } else if(v \"+t[1]+\", \"+t[2]+\", t=new e=new r=new \"+t[1]+\", n=\"precisi 1\\n\\nunifo f_id;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n gl_FragCol = vec4(pickI 1\\n\\nattri position, uv;\\n\\nuni model\\n , view\\n , eyePositio , f_normal\\n , , , f_uv;\\n\\nv main() {\\n m_position = * vec4(posit 1.0);\\n t_position = * m_position gl_Positio = projection * t_position f_color = color;\\n f_normal = normal;\\n f_data = position;\\ f_eyeDirec = eyePositio - position;\\ = lightPosit - position;\\ f_uv = 1\\n\\nfloat x, roughness) {\\n NdotH = max(x, 0.0001);\\n cos2Alpha = NdotH * NdotH;\\n tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha; roughness2 = roughness * roughness; denom = * roughness2 * cos2Alpha * cos2Alpha; exp(tan2Al / roughness2 / roughness, fresnel) {\\n\\n VdotN = 0.0);\\n LdotN = 0.0);\\n\\n //Half angle vector\\n H = + //Geometri term\\n NdotH = H), 0.0);\\n VdotH = H), 0.000001); LdotH = H), 0.000001); G1 = (2.0 * NdotH * VdotN) / VdotH;\\n G2 = (2.0 * NdotH * LdotN) / LdotH;\\n G = min(1.0, min(G1, G2));\\n \\n //Distribu term\\n D = //Fresnel term\\n F = pow(1.0 - VdotN, fresnel);\\ //Multiply terms done\\n G * F * D / max(3.1415 * VdotN, roughness\\ , fresnel\\n , kambient\\n , kdiffuse\\n , kspecular\\ , sampler2D f_normal\\n , , , f_uv;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n\\n = L = V = \\n {\\n = -N;\\n }\\n\\n specular = V, N, roughness, fresnel);\\ diffuse = min(kambie + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n surfaceCol = f_color * f_uv);\\n litColor = surfaceCol * vec4(diffu * + kspecular * vec3(1,1,1 * specular, 1.0);\\n\\n gl_FragCol = litColor * 1\\n\\nattri uv;\\n\\nuni model, view, f_uv;\\n\\nv main() {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n f_color = color;\\n f_data = position;\\ f_uv = 1\\n\\nunifo sampler2D f_uv;\\n\\nv main() {\\n || \\n {\\n discard;\\n }\\n\\n gl_FragCol = f_color * f_uv) * 1\\n\\nattri uv;\\nattri model, view, f_uv;\\n\\nv main() {\\n || \\n {\\n gl_Positio = } else {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n }\\n gl_PointSi = pointSize; f_color = color;\\n f_uv = 1\\n\\nunifo sampler2D f_uv;\\n\\nv main() {\\n pointR = - if(dot(poi pointR) > 0.25) {\\n discard;\\n }\\n gl_FragCol = f_color * f_uv) * 1\\n\\nattri id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n f_id = id;\\n f_position = 1\\n\\nattri id;\\n\\nuni model, view, f_id;\\n\\nv main() {\\n || \\n {\\n gl_Positio = } else {\\n gl_Positio = projection * * * vec4(posit 1.0);\\n gl_PointSi = pointSize; }\\n f_id = id;\\n f_position = 1\\n\\nattri model, view, main() {\\n gl_Positio = projection * * * vec4(posit 1\\n\\nunifo main() {\\n gl_FragCol = i(t){for(v null;for(v function() E=new s(\"\",\"Inva attribute \"+h+\": s(\"\",\"Unkn attribute \"+h+\": \"+f);var s(\"\",\"Inva attribute \"+h+\": n(t){retur i(t,e){for r=new s(\"\",\"Inva uniform dimension matrix \"+name+\": s(\"\",\"Unkn uniform \"+name+\": \"+r)}var s(\"\",\"Inva vector \"+name+\": r=[];for(v e){var r}function h(e){for(v n=[\"return s(\"\",\"Inva s(\"\",\"Inva uniform dimension matrix \"+name+\": \"+t);retur i(r*r,0)}t s(\"\",\"Unkn uniform \"+name+\": \"+t)}}func i){var p(t){var r=0;r1){l[ u=1;u1)for l=0;l=0){v t||t}funct s(t){funct r(){for(va u=0;u 1.0) {\\n discard;\\n }\\n baseColor = color, step(radiu gl_FragCol = * baseColor. 1\\n\\nattri mat3 main() {\\n hgPosition = matrix * vec3(posit 1);\\n gl_Positio = 0, gl_PointSi = pointSize; id = pickId + pickOffset id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n fragId = 1\\n\\nvaryi main() {\\n radius = length(2.0 * - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragCol = fragId / i(t,e){var instanceof instanceof null;var n(t,e,r,n) 1\\n\\n\\nvec posHi, posLo, scHi, scLo, trHi, trLo) {\\n vec4((posH + trHi) * scHi\\n \\t\\t\\t//FI thingy does give noticeable precision gain, test\\n + (posLo + trLo) * scHi\\n + (posHi + trHi) * scLo\\n + (posLo + trLo) * scLo\\n , 0, positionHi size, char, 64-bit form scaleHi, scaleLo, translateH sampler2D charColor, main() {\\n charColor = vec2(color / 255., 0));\\n borderColo = vec2(color / 255., 0));\\n\\n gl_PointSi = * pixelRatio pointSize = * charId = char;\\n borderWidt = border;\\n\\ gl_Positio = positionHi positionLo scaleHi, scaleLo,\\n translateH pointCoord = viewBox.xy + (viewBox.z - viewBox.xy * * .5 + 1\\n\\nunifo sampler2D charsStep, pixelRatio main() {\\n\\tvec2 pointUV = (pointCoor - + pointSize * .5) / = 1. - texCoord = ((charId + pointUV) * charsStep) / dist = alpha\\n\\ti (dist t;){var w.push(new i(){var a(t,e){var e=void null;var characters maximum texture size. Try reducing x=0;x 1.0) {\\n discard;\\n }\\n baseColor = color, = 1.0 - pow(1.0 - baseColor. fragWeight gl_FragCol = * alpha, 1\\n\\nvec4 pfx_1_0(ve scaleHi, scaleLo, translateH translateL positionHi positionLo {\\n + translateH * scaleHi\\n + (positionL + translateL * scaleHi\\n + (positionH + translateH * scaleLo\\n + (positionL + translateL * scaleLo, 0.0, positionHi scaleHi, scaleLo, translateH main() {\\n\\n id = pickId + pickOffset id.y += floor(id.x / 256.0);\\n id.x -= floor(id.x / 256.0) * 256.0;\\n\\n id.z += floor(id.y / 256.0);\\n id.y -= floor(id.y / 256.0) * 256.0;\\n\\n id.w += floor(id.z / 256.0);\\n id.z -= floor(id.z / 256.0) * 256.0;\\n\\n gl_Positio = scaleLo, translateH translateL positionHi positionLo gl_PointSi = pointSize; fragId = 1\\n\\nvaryi main() {\\n radius = length(2.0 * - 1.0);\\n if(radius > 1.0) {\\n discard;\\n }\\n gl_FragCol = fragId / i(t,e){var e(e,r){ret e n(t,e){var r)return r[t];for(v o=r.gl d(t){var null;var a(t,e){ret E=new i(t,e){var r=new n(t);retur 0.0 ||\\n || {\\n discard;\\n }\\n\\n = V = L = {\\n = -N;\\n }\\n\\n specular = V, N, roughness) diffuse = min(kambie + kdiffuse * max(dot(N, L), 0.0), 1.0);\\n\\n //decide interpolat \\u2014 vertex fragment\\n surfaceCol = .5) * vec2(value value)) + step(.5, vertexColo * vColor;\\n\\ litColor = surfaceCol * vec4(diffu * + kspecular * vec3(1,1,1 * specular, 1.0);\\n\\n gl_FragCol = mix(litCol contourCol contourTin * 1\\n\\nattri uv;\\nattri f;\\n\\nunif mat3 model, view, height, sampler2D value, kill;\\nvar eyeDirecti main() {\\n dataCoordi = permutatio * vec3(uv.xy height);\\n worldPosit = * 1.0);\\n\\n clipPositi = projection * * clipPositi = clipPositi + zOffset;\\n gl_Positio = = f;\\n kill = -1.0;\\n = = uv.zw;\\n\\n vColor = vec2(value value));\\n //Don't lighting contours\\n surfaceNor = vec3(1,0,0 eyeDirecti = vec3(0,1,0 lightDirec = 1\\n\\nunifo value, kill;\\nvar v) {\\n vh = 255.0 * v;\\n upper = floor(vh); lower = fract(vh); vec2(upper / 255.0, floor(lowe * 16.0) / main() {\\n if(kill > 0.0 ||\\n || {\\n discard;\\n }\\n ux = / shape.x);\\ uy = / shape.y);\\ gl_FragCol = vec4(pickI ux.x, uy.x, ux.y + i(t){var o(t,e){var invalid coordinate Invalid texture size\");ret s(t,e){ret Invalid ndarray, 2d 3d\");var Invalid shape Invalid shape pixel Incompatib texture format Invalid texture Floating point textures supported platform\") s=u(t);ret s=u(t);ret f(t,e){var Invalid texture size\");var Invalid shape Invalid shape pixel b=u(t);ret Error(\"gl- Too vertex n(t,e,r){v i=new n(t){for(v n(t,e){var n(t,e,r){v instanceof a=new a(t,e){ret o(t){for(v e=[\"functi orient(){v orient\");v n=new a(t,e){var o(t,e){var s(t,e){var i}}functio c(t,e){for s(this,t); s(this,t); b}for(var r}return n}return l}function i(t,e,r,n) n(t,e){var r;if(h(t)) Error('Unk -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def sampler2D main() {\\n // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case fading out\\n // blur = u_blur * = clamp(min( - (v_linewid - blur), v_linewidt - dist) / blur, 0.0, 1.0);\\n\\n x_a = / 1.0);\\n x_b = / 1.0);\\n y_a = 0.5 + (v_normal. * v_linewidt / y_b = 0.5 + (v_normal. * v_linewidt / pos_a = vec2(x_a, y_a));\\n pos_b = vec2(x_b, y_b));\\n\\n = pos_a), pos_b), u_fade);\\n *= u_opacity; gl_FragCol = * gl_FragCol = lowp\\n#def floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale mat2 main() {\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * // store texture normals insignific bit\\n // transform y => -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n v_linesofa = // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def sampler2D main() {\\n // Calculate distance pixel pixels.\\n dist = * // Calculate antialiasi fade factor. either fading in\\n // case fading out\\n // blur = u_blur * = clamp(min( - (v_linewid - blur), v_linewidt - dist) / blur, 0.0, 1.0);\\n\\n sdfdist_a = v_tex_a).a sdfdist_b = v_tex_b).a sdfdist = mix(sdfdis sdfdist_b, u_mix);\\n *= smoothstep - u_sdfgamma 0.5 + u_sdfgamma sdfdist);\\ gl_FragCol = u_color * (alpha * gl_FragCol = lowp\\n#def floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define 63.0\\n#def distance before adding buffers store\\n// long distances long segments. unscale mat2 main() {\\n a_extrude = a_data.xy - 128.0;\\n a_directio = mod(a_data 4.0) - 1.0;\\n a_linesofa = / 4.0) + a_data.w * 64.0) * // store texture normals insignific bit\\n // transform y => -1 => 1\\n // texture normal, x straight up/down round cap\\n // y up, -1 down\\n = mod(a_pos, 2.0);\\n normal.y = sign(norma - 0.5);\\n v_normal = normal;\\n\\ inset = u_gapwidth + (u_gapwidt > 0.0 ? u_antialia : 0.0);\\n outset = u_gapwidth + u_linewidt * (u_gapwidt > 0.0 ? 2.0 : 1.0) + // extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector towards extrude, rotate\\n // drawing round end (a_directi = -1 1) since their\\n // extrude vector another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position before scaling the\\n // model/view matrix.\\n gl_Positio = u_matrix * * 0.5) + (offset + dist) / u_ratio, 0.0, 1.0);\\n\\n v_tex_a = * normal.y * + u_tex_y_a) v_tex_b = * normal.y * + // position y screen\\n y = gl_Positio / // features squished y direction tilt\\n squish_sca = / * // features squished directions = 1.0 / (1.0 - min(y * u_extra, 0.9));\\n\\n v_linewidt = vec2(outse inset);\\n v_gamma_sc = * lowp\\n#def mapbox: mapbox: v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - = 0.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = lowp\\n#def mapbox: mapbox: main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n v_pos = / gl_Positio + 1.0) / 2.0 * lowp\\n#def sampler2D v_pos;\\n\\n main() {\\n imagecoord = mod(v_pos_ 1.0);\\n pos = imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = color2 = pos2);\\n\\n // find distance outline dist = length(v_p - = 0.0, dist);\\n \\n\\n gl_FragCol = mix(color1 color2, u_mix) * * gl_FragCol = lowp\\n#def v_pos;\\n\\n main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n scaled_siz = u_scale_a * scaled_siz = u_scale_b * // correct needs calculated //\\n // depends pixels world origin and\\n // edge tile:\\n // = size)\\n //\\n // high zoom levels ton pixels world origin\\n // edge tile. glsl spec guarantees 16 bits of\\n // precision floats. that.\\n //\\n // pixel_coor passed two 16 bit values:\\n // = / 2^16)\\n // = 2^16)\\n //\\n // calculated series steps preserve precision: offset_a = scaled_siz * 256.0, scaled_siz * 256.0 + offset_b = scaled_siz * 256.0, scaled_siz * 256.0 + v_pos_a = * a_pos + offset_a) / v_pos_b = * a_pos + offset_b) / v_pos = / gl_Positio + 1.0) / 2.0 * lowp\\n#def sampler2D main() {\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos = imagecoord color1 = pos);\\n\\n imagecoord = mod(v_pos_ 1.0);\\n pos2 = color2 = pos2);\\n\\n gl_FragCol = mix(color1 color2, u_mix) * gl_FragCol = lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n scaled_siz = u_scale_a * scaled_siz = u_scale_b * // correct needs calculated //\\n // depends pixels world origin and\\n // edge tile:\\n // = size)\\n //\\n // high zoom levels ton pixels world origin\\n // edge tile. glsl spec guarantees 16 bits of\\n // precision floats. that.\\n //\\n // pixel_coor passed two 16 bit values:\\n // = / 2^16)\\n // = 2^16)\\n //\\n // calculated series steps preserve precision: offset_a = scaled_siz * 256.0, scaled_siz * 256.0 + offset_b = scaled_siz * 256.0, scaled_siz * 256.0 + v_pos_a = * a_pos + offset_a) / v_pos_b = * a_pos + offset_b) / lowp\\n#def sampler2D sampler2D main() {\\n\\n // read cross-fade colors parent tiles\\n color0 = v_pos0);\\n color1 = v_pos1);\\n = color0 * u_opacity0 + color1 * u_opacity1 rgb = color.rgb; // spin\\n rgb = vec3(\\n dot(rgb, dot(rgb, dot(rgb, // saturation average = (color.r + color.g + color.b) / 3.0;\\n rgb += (average - rgb) * // contrast\\n rgb = (rgb - 0.5) * + 0.5;\\n\\n // brightness u_high_vec = u_low_vec = gl_FragCol = u_low_vec, rgb), gl_FragCol = lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1);\\n v_pos0 = / 32767.0) - 0.5) / u_buffer_s ) + 0.5;\\n v_pos1 = (v_pos0 * + lowp\\n#def sampler2D sampler2D main() {\\n = v_fade_tex * u_opacity; gl_FragCol = v_tex) * gl_FragCol = lowp\\n#def matrix vertex bool main() {\\n a_tex = a_labelmin = a_data[0]; a_zoom = a_data.pq; a_minzoom = a_zoom[0]; a_maxzoom = a_zoom[1]; // u_zoom current zoom level adjusted change font size\\n z = 2.0 - u_zoom) - (1.0 - u_zoom));\\ extrude = * (a_offset / 64.0);\\n {\\n gl_Positio = u_matrix * vec4(a_pos + extrude, 0, 1);\\n gl_Positio += z * } else {\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n }\\n\\n v_tex = a_tex / u_texsize; v_fade_tex = / 255.0, lowp\\n#def sampler2D sampler2D main() {\\n dist = v_tex).a;\\ fade_alpha = gamma = u_gamma * = - gamma, u_buffer + gamma, dist) * gl_FragCol = u_color * (alpha * gl_FragCol = lowp\\n#def PI = matrix vertex bool bool main() {\\n a_tex = a_labelmin = a_data[0]; a_zoom = a_data.pq; a_minzoom = a_zoom[0]; a_maxzoom = a_zoom[1]; // u_zoom current zoom level adjusted change font size\\n z = 2.0 - u_zoom) - (1.0 - u_zoom));\\ // map\\n // map | viewport\\n {\\n angle = ? (a_data[1] / 256.0 * 2.0 * PI) : u_bearing; asin = sin(angle) acos = cos(angle) mat2 RotationMa = mat2(acos, asin, -1.0 * asin, acos);\\n = RotationMa * a_offset;\\ extrude = * (offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos + extrude, 0, 1);\\n gl_Positio += z * // viewport\\n // map\\n } else {\\n // foreshorte factor apply pitched maps\\n // label goes horizontal vertical angle\\n // goes 0% foreshorte around 70% pitchfacto = 1.0 - cos(u_pitc * sin(u_pitc * 0.75));\\n\\ lineangle = a_data[1] / 256.0 * 2.0 * PI;\\n\\n // lineangle position a,b along line\\n // project calculate label angle projected space\\n // calculatio allows labels rendered unskewed pitched maps\\n = u_matrix * vec4(a_pos 0, 1);\\n b = u_matrix * vec4(a_pos + 0, 1);\\n angle = - b[0]/b[3] - a[0]/a[3]) asin = sin(angle) acos = cos(angle) mat2 RotationMa = mat2(acos, -1.0 * asin, asin, acos);\\n\\n = RotationMa * 1.0) * a_offset); extrude = * (offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n gl_Positio += z * // viewport\\n // viewport\\n } else {\\n extrude = * (a_offset / 64.0);\\n gl_Positio = u_matrix * vec4(a_pos 0, 1) + vec4(extru 0, 0);\\n }\\n\\n v_gamma_sc = (gl_Positi - 0.5);\\n\\n v_tex = a_tex / u_texsize; v_fade_tex = / 255.0, lowp\\n#def main() {\\n\\n = 0.5;\\n\\n gl_FragCol = vec4(0.0, 1.0, 0.0, 1.0) * alpha;\\n\\n > u_zoom) {\\n gl_FragCol = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\\n }\\n\\n (u_zoom >= v_max_zoom {\\n gl_FragCol = vec4(0.0, 0.0, 0.0, 1.0) * * 0.25;\\n }\\n\\n >= u_maxzoom) {\\n gl_FragCol = vec4(0.0, 0.0, 1.0, 1.0) * * 0.2;\\n lowp\\n#def main() {\\n gl_Positio = u_matrix * vec4(a_pos + a_extrude / u_scale, 0.0, 1.0);\\n\\n v_max_zoom = a_data.x;\\ = values, const t) {\\n (t 7)return[n deprecated v8\")];if(! \"%s\" strict\";va a(l,e,\"arr expected, %s a(l,e,\"arr length %d expected, length %d r?[new deprecated v8\")]:[];v n(e,r,\"obj expected, %s found\",a)] o=[];for(v s start \"@\"'));ret strict\";va [%s], %s strict\";va t(e){var n(l,s,\"arr expected, %s n(l,s,'\"$t cannot operator n(l,s,'fil array operator \"%s\" expected, %s cannot functions functions strict\";va url include \"{fontstac url include \"{range}\" strict\";va n(c,r,'eit \"type\" \"ref\" i(e,r,\"%s greater maximum strict\";va n(e,r,\"obj expected, %s f r){var property n(e,r,'mis required property strict\";va i(e,o,'unk property strict\";va n(r,e,'\"ty e)for(var c a(t){retur Sans Unicode MS M=new n){for(var symbols rendered tile. See glyphs rendered tile. See exceeds allowed extent, reduce vector tile size\")}ret Error(\"Inv LngLat object: (\"+t+\", x(){return y(){return point(){re instanceof 0===s&&voi a(void Error(\"fai invert strict\";va n={\" strict\";va s(t){retur l(t,e,r,n) o=(new n(t,e){ret mapbox: ([\\w]+) ([\\w]+) ([\\w]+) a=new n?e(new Error(\"Inp valid GeoJSON t.data)ret e(new Error(\"Inp valid GeoJSON e(new Error(\"Inp valid GeoJSON e=0;ee)){v y;for(y p)c[y]=!0; i(t,e,i){v r(t,r){ret delete e(t);var n=new o(new e=new tile source layer \"'+M+'\" does vector tile spec v2 therefore may rendering g(t,L);var F B n=new t.time>=(n t=new i;var strict\";va Error(\"Inv o[e]}throw Error(\"Inv Error('Sou layer does exist source \"'+e.id+'\" specified style layer t.id});for Error(\"Sty done Error(\"The no source ID\");var delete instanceof this;var 0===e)thro Error(\"The no layer ID\");for(v this;var 0===i||voi 0===a?void strict\";va i(t){retur t.value}va r,n;for(va t){var for(n 0===e)dele 0===e)dele o}var strict\";va t){var this.grid= a}if(r){va _=u;for(va a}}}return r=new r(\"glyphs > 65535 i=!t&&new l(new c(new g(e,r){var y(e,r){var i(0,0));re M a)t[M]=new strict\";va t){var | n(){}var i(t){retur 61:case 107:case 171:case 189:case 109:case t=0,e=0;re t=new null!==t&& Error(\"max current minZoom 20, t,e={};ret instanceof e;if(t instanceof instanceof c?t:new i(this,e); Error(\"Fai initialize s if(void if(void n(t){var r=new n(t){for(v e=0;e1)for delete error c(t,e,r){v f(t,e){for null;var delete Error(\"An API access token required GL. See Error(\"Use public access token (pk.*) GL JS, secret access token (sk.*). See t}function i(t){retur a(t){retur t;var n(t){funct v[n];void t=0;t=1)re 1;var t={};for(v e =0.22.0 =0.22.0 No README run build-docs # invoked publisher publishing docs mb-pages --debug --standalo mapboxgl > && tap --no-cover build --github --format html -c --theme ./docs/_th --output --debug -t unassertif --plugin [minifyify --map --output --standalo mapboxgl > && tap --no-cover --debug -t envify > --ignore-p .gitignore js test bench diff --name-onl mb-pages HEAD -- | awk '{print | xargs build-toke watch-dev watch-benc build-toke watch-benc build-toke watch-dev run build-min && npm run build-docs && jekyll serve --no-cache --localhos --port 9966 --index index.html .\",test:\"n run lint && tap --reporter dot test/js/*/ && node && watchify bench/inde --plugin [minifyify --no-map] -t [babelify --presets react] -t unassertif -t envify -o bench/benc --debug --standalo mapboxgl -o n=new r=new r(t){var n(t,n){var i(t){retur t)return t){var 1=0)return V=1;V specify vertex creation specify cell creation specify phase strict\";va n(t){if(t l)return l[t];for(v Invalid boundary dst;};retu l){var u){var c){var \"+s),u){va p=new p=new p()}functi for(var o=0;o1)for f(e,r){var s=\"__l\"+ i=\"__l\"+ _=[\"'use L=new L=new L(r)}funct s(t,e){var r=[\"'use [2,1,0];}e [1,0,2];}} [2,0,1];}e o=new 0===t){var 0===r){r=n o(t,e){var s(t,e){ret a(t,e){var i=new t||\"up\"in strict\";va r=void 0!==r?r+\"\" e(t,e){for t}function o)throw path.resol t)throw path.join n(t){for(v Error(\"Giv varint doesn't fit bytes\");va o(t,e,r){v s(t,e){for type: n(t){var 0:return r||[];case 1:return 2:return Array(t);v r}var r(t,e){var Array(a),n n(t,e){for a(t){for(v t-e});var instanceof i(t){retur a(t){for(v a=1;i;){va l(t){for(v c(t){retur d(t){var u(m)}funct p(t){var 0x80 (not basic x});else for(_ n(t,e){ret o;var o};var n(t,e){for n&&void e(t){var e=new Error(\"(re \"+t);throw n(t){retur t?\": i(t,r,i){t r||e(\"unkn parameter possible values: parameter type\"+n(r) typed parameter type\"+n(i) expected \"+r+\", got \"+typeof t)}functio parameter type, nonnegativ shader source string\",a) \"+t+\": r=0;e(c(\"| compiling \"+s+\" shader, linking program vertex shader, fragment shader i(t){retur M(t,r){var n=m();e(t+ command called \"+n))}func A(t,e,r,i) e||M(\"unkn parameter possible values: parameter type\"+n(r) expected \"+e+\", got \"+typeof texture format renderbuff format L(t,e){ret z(t,e,n){v pixel arguments document,\" manually specify webgl context outside DOM supported, try upgrading browser graphics drivers name string\");v $(t){var et(t,e){va _e:r=new we:r=new Me:r=new ke:r=new Ae:r=new Te:r=new Se:r=new null}retur n=0;n0){va t[0]){var data\")}els shape\");va p=new n(a);retur d=[];retur t=0;return t&&t._buff instanceof a(t){var e||(e=new Ge:case Xe:case Ze:case element bit element buffers supported, enable first\");va vertex count a}var t&&t._elem instanceof pt(t){for( At(t){retu Tt(t,e){va Or:case Fr:case Rr:case jr:var texture type, specify typed St(t,e){re for(var s}return o*r*n}func texture texture unpack n){var enable extension order floating point enable extension order 16-bit floating point enable extension order depth/sten texture extension extension d(e,r,i){v m(){return K.pop()||n h}function y(t,e,r){v b(t,e){var e){var e){var e){var e){var e){var i(t,e){var arguments format c=new T(nr);retu format C=new z=new I(){for(va for(var P={\"don't care\":$r,\" mipmap mipmap mipmap mipmap s3tc dxt1\":Mr,\" s3tc dxt1\":kr,\" s3tc dxt3\":Ar,\" s3tc atc\":Sr,\"r atc explicit atc interpolat pvrtc pvrtc pvrtc pvrtc etc1\"]=Pr) r=B[e];ret null});ret texture shape z||\"colors render targets enable order floating point framebuffe enable order 16-bit floating point framebuffe enable 16-bit render enable order 32-bit floating point format format extension u=d=1;var for(D=new attachment \"+a+\" attachment same bits per depth attachment framebuffe stencil attachment framebuffe depth-sten attachment framebuffe resize framebuffe currently use\");var i;for(var shape framebuffe d||\"colors render targets format l=1;var a(t){var t=0;return vertex fragment shader\",n) a=i[t];ret a||(a=new o(o){var webgl context order read pixels drawing cannot read framebuffe allowed types 'uint8' framebuffe allowed 'uint8'\")) arguments regl.read( too s(t){var r;return l(t){retur l}function jt(t){retu Nt(t){retu Bt(){funct t(t){for(v r(){functi n(){var e=a();retu n(){var m(t){retur v(t,e,r){v g(t,e,r){v y(){var ei:var ri:return ni:return ii:return ai:return c={};retur n=e.id(t); c)return c[n];var b(t){var r){var if(Di n){var e}function x(t,e){var r){var i=r[Pi];re framebuffe n){var a=n[Pi];re framebuffe null}funct n(t){if(t i){var a){var \"+t)});var e?new s=o;o=new w(t){funct r(t){if(t i){var r});return n.id=r,n}i a){var o=a[t];ret null}var r(t,r){if( n){var i){var s=i[t];ret n){var i){var o=i[Ri];re n){var t=n[ji];re Be[t]})}if i){var r=i[ji];re \"+n,\"inval primitive, Aa}):new n){var vertex t})}if(Ni i){var r=i[Ni];re vertex s?new vertex offset/ele too l=new k(t,e){var o(e,n){if( r){var o})}else if(t i){var vi:case si:case oi:case Ai:case hi:case Ci:case xi:case wi:case Mi:case pi:return flag fi:return \"+i,\"inval \"+t+\", di:return attachment framebuffe sent uniform uniform a[r],\"inva uniform missing uniform T(t,r){var a&&a,\"inva attribute attribute divisor attribute parameter \"'+r+'\" attribute pointer \"'+t+'\" (valid parameters r)return r[s];var '+a+\"&&(ty dynamic attribute if(\"consta \"+a+'.cons === S(t){var a(t){var parameter L(t,e,r){v C(t,e,r,n) z(t,e,r){v n=m(e);if( r.state)){ c,h;if(n I(t,e,r,n) if(mt(u)){ l(t){var ua:case da:case ga:return 2;case ca:case pa:case ya:return 3;case ha:case ma:case ba:return 1}}functio attribute i(i){var a=c[i];ret a(){functi o(){functi vertex vertex vertex i(t){retur n(e){var n=r.draw[e s(t){funct e(t){var args args e(t){if(t r){var e=r[t];del delete l(t,e){var regl.clear no takes object cancel frame callback h(){var callback function\") event, Kt={\"[obje renderbuff renderbuff arguments renderbuff r(){return i(t){var s(){return p.pop()||n o}function u(t,e,r){v c(){var t(){var requires least argument; got none.\");va e.href;var \",e);var s=new o;n=-(i+a) null;var n(t){retur n(t){for(v R;};return i(t){var e=s[t];ret strict\";\"u n(t){for(v i}function h(t,e){for r=new r}function r=new l(e)}funct u(t){for(v e=s(t);;){ t=k[0];ret f(t,e){var r=k[t];ret n(t,e){var l}else if(u)retur l}else if(u)retur u;return i(t,e){ret t.y-e}func a(t,e){for r=null;t;) t;var r}function l(t){for(v n=d.index; n(t,e){var i(t,e,r,n) o(t,e){for r}function s(t,e){for m}function s[t];for(v unexpected failed parse named argument failed parse named argument mixing positional named placeholde (yet) s[t]=n}var n(t){for(v Array(e),n Array(e),i Array(e),a Array(e),o Array(e),s x=new u(t){retur c(t){var h(t){retur f(t){var d(t,e){for t}function p(t){retur t.x}functi m(t){retur t.y}var time\");var r=\"prepare \"+t.length %d clusters c)|0 p=new Array(r),m Array(r),v Array(r),g p=new o}function s}function T(t){retur n=z(t);ret t){var r={};for(v e={};for(v n(t,e){var i(t,e){var s/6}return 1}var n&&void e(t,e){var for(a=0,n= n})}}var s;var Error(\"n Error(\"alr s(t){retur l(t){retur u(t){retur c(t){retur h(t){retur f(t){retur d(t){retur p(t){retur m(t){retur x?new v(t){retur n(t)}var null}retur t=0;tn)ret instanceof n)return t;var i=new n;return a(t){retur instanceof o(t,e){ret s(t,e){ret 'url' string, \"+typeof t);var i(t,e){var a(t,e){var o(t,e){ret t}function s(t){var e={};retur a;var v=e.name?\" c(e)}var o+\": \"+s}functi d(t,e,r){v n=0;return \")+\" \"+t.join(\" \")+\" \"+t.join(\" \")+\" p(t){retur t}function v(t){retur g(t){retur t}function t}function t}function _(t){retur 0===t}func w(t){retur M(t)&&\"[ob k(t){retur M(t)&&\"[ob A(t){retur instanceof t}function S(t){retur t||void 0===t}func E(t){retur L(t){retur t=a)return Error(\"unk command if(7!==r)t Error(\"unk command i(t){for(v e}var Error(\"fea index String too long (sorry, fixed later)\");v l(t){for(v e(t){var e=n(t);ret e?u r(t,e){var o(t){var i?u i&&delete t){var r?r[0]:\"\"} n?!r&&en)t al-ahad\",\" {0} {0} {0} {0} mix {0} {1} a(t,e){ret ;var format date another position name position literal position text found dd M MM d, d M d M d M d M yyyy\",RSS: d M a=this;ret var _inline_1_ = - var _inline_1_ = - >= 0) !== (_inline_1 >= 0)) {\\n + 0.5 + 0.5 * (_inline_1 + _inline_1_ / (_inline_1 - }\\n n(t,e){var r=[];retur strict\";va u(r,i){ret i(t,e){var E.remove() null;var strict\";va c();var t}function i(t){var e=x[t];ret a(t){retur calendar system `\"+t+\"` date data.\"}var i={};retur t}var i?\"rgba(\"+ n=i(t);ret t){var A(e,r){var T(){var strict\";va strict\";va strict\";va strict\";va strict\";va strict\";va n(){var e(e){retur r;try{r=ne strict\";va i(t,e,r,n) a(t){var n.remove() \")}).split \")}).split scale(\"+e+ n,i,a;retu strict\";va 1,1 0,1 \"+a+\",\"+a+ \"+a+\",\"+a+ \"+r+\",\"+r+ \"+r+\",\"+r+ 1,1 0,1 1,1 0,1 n(t,e,r,n) t.id});var strict\";va strict\";va i(t,e,r){v r(t){var r.remove() r(e,r,o){v if(i[r]){v o;if(void strict\";va n(t){var n(r){retur strict\";va n(t){for(v \");var i(t,e){var click legend isolate individual l(t){var u(t){var strict\";va r[1]}retur i}function i(t){retur t[0]}var h(t){var f(t){var d(t){var n(t,e){var i(t){for(v n(t){for(v 0}}var o(t,e){var 1,1 0,1 extra params segment t(e).repla strict\";va strict\";va u(r,i){ret r(t,e){ret l(t,e,r){v u(t,e,r){v c(t,e){var n(){return p(t,e){var g(t,e){ret y(t,e){ret b(t,e,r){v x(t,e){var _(t){for(v r(t,e){ret strict\";va strict\";va strict\";va t){var t)return n}function l(t){retur u(t){retur c(t){retur d\")}functi h(t){retur d, yyyy\")}var t.getTime} r={};retur n=new a(t){retur o(t){for(v r={};retur n(){return strict\";va for(var c(t){retur property r(t,e){var instanceof RegExp){va o(t,e){ret t>=e}var binary r=e%1;retu n(t){var e=i(t);ret n(t,e){ret i(t){retur \")}functio a(t,e,r){v error tex null;var r=0;r1)for i=1;i doesnt match end tag . Pretending did s}function c(t,e,r){v o(),void e();var 0,\":\"],k=n t(t,e){ret n(t){var i(){var strict\";va strict\";va n(t,e){for r=new Error(\"No DOM element id '\"+t+\"' exists page.\");re 0===t)thro Error(\"DOM element provided null previous rejected promises t.yaxis1); array edits incompatib edits\",h); full array edit if(void & removal incompatib edits same full object edit Error(\"eac index \"+r+\" Error(\"gd. 0===e)thro required Error(\"cur indices equal u(t,e,r){v Error(\"gd. 0===e)thro Error(\"tra i(t){retur a(t,e){var r=0;return Error(\"Thi element Plotly plot: \"+t+\". likely you've failed plot before animating it. details, see c()}functi d(t){retur overwritin frame frame whose name \"number\" equates \"'+f+'\". valid may potentiall lead unexpected behavior since plotly.js frame names stored internally API call yielded too warnings. rest call, further warnings numeric frame names addFrames accepts frames numeric names, numbers areimplici cast n(t){var i}function i(){var t={};retur a(t){var o(){var s(t){retur l(t){funct u(t){funct c(t){retur h(t,e,r){v f(t,e,r){v e={};retur t&&void n(t){retur Error(\"Hei width pixel values.\")) l(t,e,r){v u(t,e,r,n) \"+o:s=o+(s dtick p(t,e){var c=new t.dtick){v error: t+i*e;var dtick a(t){for(v strict\";va v(r,n){ret enter axis\")+\" e;var n(t,r){for n(t,e,r,n) u(t,e){ret y(t){var b(t,e,r){v back X(e,r){var K()}functi W(e){funct n(e){retur k.log(\"Did find wheel motion attributes \",e);var strict\";va n(t){retur t._id}func went wrong axis Error(\"axi o){var t(t){var e(t){retur strict\";va r(r,n){var e/2}}funct v(t,e){var g(t,e){var b(t,e){var x(t,e){var Error(\"not yet r(t,r){for i(){for(va a(t,e){for n(t,e){var n(t){retur i(t,e,r,n) a(t,e){ret i(t,e){var r(t){retur n(t){var l(t,e){var u(t){var c(t,e){var f(t,e,r){v strict\";va i(t){var e=new n;return a(t){var o(t){var i=new n(t,e);ret strict\";va Sans Regular, Arial Unicode MS r(t,e){ret - delete t)return e,n,i={};f i}return r=a(t);ret e&&delete P=(new + + + + + + + + + + + + + + + 0px\",\"1px -1px\",\"-1p 1px\",\"1px \"+t+\" \"+n+\" \"+n+\" \"+n+\" c=\"t: \"+u.t+\", r: l;var t)r r=e||6;ret 0===t)retu null;var t(){var t={};retur n.mode,del strict\";va e(e,i){ret s;return t(t,e){ret i=r[n];ret strict\";va t(t,e,r){v e(t,e){ret r(t,e){ret a(t,i){var tozoom back f(t,e){var i(t){retur y,b;return o,s;return ii))return e}return h(t){retur f(t,e){ret strict\";va strict\";va 0, 0, strict\";va s;return strict\";va null;for(v strict\";va o(e){var s(e){var strict\";va n(t,e,r){v i(t,e,r){v strict\";va converged strict\";va strict\";va strict\";va strict\";va s(r,i){ret n(t,e,r,n) strict\";va n(t,e){for o(t){retur strict\";va strict\";va strict\";va c(r,i){ret loop contour?\") s(t,e,r){v 15===r?0:r contours, clipping i}function a(t,e,r){v o(t,e,r){v s(t,e,r,n) e=l(t,r) r(t){retur newendpt vert. perimeter invalid specified inequality contours, clipping strict\";va strict\";va h(t){retur newendpt vert. perimeter o(t,e,r){v s(t,e,r){v strict\";va iterated no strict\";va g}var didn't converge strict\";va s=0;sa){va strict\";va l(r,n){ret u(t){var e=l(t);ret strict\";va strict\";va e(e){var strict\";va strict\";va r(t,e){ret traces support \"+u+\" dimensions c}var l(r,n){ret strict\";va l(n){var i}function c(t,e,r){v l(t,e,r){v n=o(r);ret u(t,e){ret c(t){retur h(t){var e=o(t);ret f(t){var d(t){retur t[0]}funct p(t,e,r){v m(t){var v(t){retur l(t){var u(t){retur c(t,e){for e.t+\"px \"+e.r+\"px \"+e.b+\"px 255, 255, 0)\");var #fff, -1px -1px #fff, -1px #fff, -1px strict\";va i(t,e,r){v strict\";va n(t,e){for m};var strict\";va o(r,a){ret strict\";va strict\";va strict\";va n(t,e,r){v u;var 1;var a(t,e){var r(t,e){ret n(t,e){ret s(t,e){var 1;var t+\" strict\";va strict\";va strict\";va 0, i(t,e){var r=new for(r=new present Sankey data. Removing nodes strict\";va u(r,a){ret n(t){retur t.key}func a(t){retur t[0]}funct o(t){var 0)\":\"matri 0)\")}funct M(t){retur k(t){retur 0)\":\"matri 0)\"}functi A(t){retur 1)\":\"scale 1)\"}functi T(t){retur S(t){retur L(t,e,r){v var C(t,e,r){v i(){for(va e={};retur #fff, #fff, -1px #fff, -1px -1px strict\";va _=new strict\";va strict\";va strict\";va m(r,a){ret strict\";va strict\";va strict\";va r(e){var i(t){var strict\";va n(t,e){var + m(t){retur v(t){retur g(t){retur t.id}funct g}function x(e){var scatter strict\";va s(t,e){ret l(t){retur M[t]}funct o=0;o=0){v n(t,e,r,n) strict\";va d(r,i){ret s=o[0];if( 0;var v.push(\"y: strict\";va strict\";va e(t){retur r(t){var 1/0;var strict\";va n(t,e){var n}function s(t,e,r,n) n=new s(t){var 1/0;var strict\";va strict\";va strict\";va strict\";va d(r,i){ret strict\";va strict\";va e=f(t);ret e=f(t);ret e=f(t);ret e=f(t);ret Unconfirme transactio In\u00a0[4]: # mempool downloaded mempool = pd.read_cs header=Non ) # split datetime date temp = = temp.date = temp.time del # reorder columns cols = mempool = mempool[co inplace=Tr d2 = mempool = In\u00a0[5]: # values per day. average mempool mempool = transactio waiting confirmed Bitcoin blockchain increased maximum May 18th 175,978. comparison average 2016 less than\u00a010,00 Once unconfirme transactio had peaked, fell quickly rose mid July generally below 10,000\u00a0aga current state unconfirme transactio pool along fee rates currently offered seen here. In\u00a0[6]: series1 = go.Scatter name='Dail average', = dict( = (color2), width = 2,)) series2 = go.Scatter name='Week average', = dict( = (color1), width = 3,)) = [series1, series2] layout = go.Layout( transactio yanchor='t y=1, x=0.5) ) fig = layout=lay py.iplot(f Out[6]: Median transactio confirmati (minutes)\u00b6 expect average taken confirm transactio increase unconfirme transactio pool. figure below shows median minutes transactio be\u00a0confirm In\u00a0[7]: # Daily Median taken transactio accepted block, presumably minutes ATRCT = ATRCT = In\u00a0[8]: series1 = go.Scatter name='Dail median', = dict( = (color2), width = 2)) series2 = go.Scatter name='7 average', = dict( = (color1), width = 3)) = [series1, series2] layout = go.Layout( title='Med taken transactio accepted block', (minutes)' yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[8]: median transactio confirmati does increase noticeably pool unconfirme transactio increases, fact two features weak Pearson correlatio 0.37 (details below). surprising expected taken confirm transactio increases pool transactio waiting Perhaps valid transactio confirmed included median average calculatio invalid transactio included pool transactio awaiting confirmati way test query transactio awaiting confirmati quantify valid fee rate are\u00a0offeri Average block (daily, MB)\u00b6Each block Bitcoin network had maximum 1MB before August 2017. Bitcoin network grown transactio volume increased blocksize limit began limit increase unconfirme transactio correlated blocks getting \u201cfilled up\u201d maximum 1MB\u00a0size? In\u00a0[9]: # Average block MB AVBLS = In\u00a0[10]: av_bs = del av_bs['Val In\u00a0[11]: series1 = go.Scatter = dict( = (color2), width = 2)) series2 = go.Scatter name='7 average', = dict( = (color1), width = 3)) = [series1, series2] layout = go.Layout( title='Blo size', (MB)'), yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[11]: March through June blocksizes seem frequently hit maximum possible size, suggesting Bitcoin network processing maximum amount possible. increase unconfirme transactio occurred mid-April end of\u00a0June. average block began sharp decrease July 2nd, same median transactio confirmati began quick reduction. July 2nd unconfirme transactio had already fallen back (Not transactio same size, transactio any outputs inputs, transactio inputs and/or outputs larger amount transactio input 2\u00a0outputs. Lets confirm transactio increased over same\u00a0perio Average transactio per (1MB) block\u00b6 In\u00a0[12]: # average transactio per block. day? NTRBL = NTRBL = In\u00a0[13]: series1 = go.Scatter name='Aver transactio per block', = dict( = (color2), width = 2)) series2 = go.Scatter name='7 average', = dict( = (color1), width = 3)) = [series1, series2] layout = go.Layout( title='Ave transactio per block', yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[13]: average transactio per block hit peak end May 2017 saw two sharp declines. fell quickly beginning June again beginning of\u00a0July. June blocksizes remained less large possible suggests blocks full few large transactio mempool beginning July transactio per block reduced average blocksize rapidly reducing. suggests volume smaller transactio had\u00a0reduce difference average blocksizes early June early July suggests early June transactio reduced average transactio had increased, July transactio per block reduced fewer transactio being\u00a0crea Perhaps Bitcoin exchanges organisati high transactio volumes had changed behaviour begun posting larger transactio inputs and/or outputs, rather posting smaller transactio fewer inputs Bitcoin often held speculator who expect Bitcoin increase. Perhaps increases transactio volume correlated increases Transactio fees earned miners fees charged users sending Bitcoin. Node operators (miners) collect unconfirme transactio confirm validity perform proof-of-w requiremen submit these transactio block order provide incentive node operators process confirm transactio compensate equipment energy costs required so, fee charged confirm transactio fee proportion (in bytes) transactio quantified fee rate otherwise miners prefer smaller sized transactio fit each\u00a0block pool unconfirme transactio automatica sorted transactio fee rate, miners confirm transactio higher fee rate before those lower fee\u00a0rate. this, expected unconfirme transactio increases, fees paid ensure transactio gets processed increase. shown figure\u00a0bel Perhaps reason unconfirme transactio grew fee rate offered these transactio below threshold where wasn\u2019t worth miners efforts confirm\u00a0th total confirmati fees earned per unconfirme transactio pool plotted\u00a0be In\u00a0[14]: # transactio fees - total BTC transactio fees miners earn per day. TRFEE = In\u00a0[15]: tn_fee = del In\u00a0[16]: trace1 = go.Scatter transactio ) # later trace2 = go.Scatter fee', yaxis='y2' ) data2 = [trace1, trace2] layout = go.Layout( title='Tot (BTC) transactio confirmati fees earned day', yanchor='t y=1.1, x=0.5), xaxis=dict ticklen=7, ), yaxis=dict title='Num unconfirme transactio zeroline=T autotick=T ticks='', ), yaxis2=dic title='Dai sum confirmati fees (BTC)', side='righ ) ) fig = layout=lay py.iplot(f Out[16]: looks confirmati fees correlate positively unconfirme transactio expected users pay higher fees lot unconfirme transactio order transactio moved towards front queue processed However looks changes miners fee rate lags behind changes unconfirme transactio pool weeks. variation transactio fee lot smaller variation unconfirme suggests method calculatin transactio fee rate improved fee rate responds faster changes transactio awaiting confirmati mining less profitable competitiv Bitcoin network cheaper for\u00a0users. Lets look expensive Bitcoin network analysing transactio fee rate relative Ratio transactio fees transactio volume\u00b6 In\u00a0[17]: # Average transactio confirmati fee rate (%) CPTRV = CPTRV = In\u00a0[18]: series1 = go.Scatter name='Fee rate', = dict( = (color2), width = 2)) series2 = go.Scatter name='7 average', = dict( = (color1), width = 3)) = [series1, series2] layout = go.Layout( title='Min revenue percentage transactio volume', rate (%)'), yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[18]: results show fee rate (Miners Volume) 0.5-1% typical Bitcoin network. bit cheaper ecommerce payment methods. Surprinsin correlatio -0.25 unconfirme transactio means fee rate decreases unconfirme transactio increases. correlatio weak. possible explanatio may activity network increases price Bitcoin increases. price Bitcoin increases, resources allocated mining increasing profitable Also, people decide buy Bitcoin becoming valuable. leads transactio even miners competing confirm transactio claim rewards. increase supply drives down transactio confirmati fee\u00a0rate. Lets see transactio per changed 2017 so\u00a0far. transactio per day\u00b6 In\u00a0[19]: # Transactio Popular Addresses NTREP = # excluding popular addresses NTRAN = # addresses NTREP = #excl. popular NTRAN = #all addresses NTRFP = NTRAN - NTREP # Popular NTRFP['all = NTRAN['Val NTRFP['unp = NTREP['Val NTRFP['pop = NTRFP['all - NTRFP['unp #NTRFP.hea In\u00a0[20]: series1 = go.Scatter name='From addresses' = dict( = (color2), width = 2)) series2 = go.Scatter name='From addresses - 7 average', = dict( = (color1), width = 3)) series3 = go.Scatter excluding 100 popular addresses' yaxis='y1' = dict( = ('#CEB7DF' width = 2)) series4 = go.Scatter excluding 100 popular addresses - 7 average', yaxis='y1' = dict( = ('#830DD4' width = 3)) series5 = go.Scatter - 7 average', yaxis='y2' = dict( = ('#4FA6D4' width = 3)) = [series1, series2, series3, series4, series5] layout = go.Layout( title='Bit transactio per day', xaxis=dict ticklen=5, ), yaxis=dict per day', zeroline=T autotick=T ticks='', ticklen=7, ), yaxis2=dic side='righ ), legend=dic y=-0.45, x=0, ) ) fig = layout=lay py.iplot(f Out[20]: figure above shows transactio posted addresses, transactio addresses excluding 100 popular addresses. difference two (the transactio 100 popular addresses) shown blue axis the\u00a0right. positive correlatio unconfirme transactio pool. Interestin stronger correlatio transactio created 100 popular addresses (0.54) unpopular addresses (0.46). Possible reasons Finally, lets consider influence price Bitcoin unconfirme Bitcoin price\u00b6 In\u00a0[21]: # USD BTC MKPRU = MKPRU = In\u00a0[22]: series1 = go.Scatter name='Dail = dict( = (color2), width = 2)) series2 = go.Scatter name='7 average', = dict( = (color1), width = 3)) = [series1, series2] layout = go.Layout( title='Bit price', (USD)'), yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[22]: Apart showing notable increase around 500% 13 months, price correlatio just 0.42 unconfirme transactio coming popular addresses positively correlated (0.41) Bitcoin price, suggesting Bitcoin price increases trading activity exchanges increases. Transactio less popular addresses inversely correlated Bitcoin price (-0.31) Bitcoin price surges, individual holding Bitcoin spend Bitcoin purchases, exchange convert fiat currencies into\u00a0Bitco Note ordinarily address Ratio unique addresses compare unique Bitcoin addresses total transactio created. initially expected ratio addresses transactio close 1, realising transactio contain least addresses (1 input output, probably 2nd output address equal input address change). transactio average outputs, idea ratio Bitcoin transactio addresses be\u00a00.5. In\u00a0[23]: # unique addresses NADDU = NADDU = #number transactio NTRAN RATIO = NTRAN / NADDU d1 = d2 = RATIO = In\u00a0[24]: series1 = go.Scatter name='Dail = dict( = (color2), width = 2)) series2 = go.Scatter name='7 average', = dict( = (color1), width = 3)) = [series1, series2] layout = go.Layout( title='Rat transactio unique addresses' yanchor='t y=1.1, x=0.5) ) fig = layout=lay py.iplot(f Out[24]: figure above shows ratio unique Bitcoin transactio unique addresses approaches 0.5. users reuse address multiple transactio (which bad) ratio rise above 0.5, users transactio usual minimum unique addresses ratio dip below\u00a00.5. Correlatio series\u00b6The table below shows Pearson correlatio coefficien In\u00a0[25]: # daily averages tseries = [ av_bs['Siz tn_fee['Fe RATIO['Val ] cols = ['Unconf trnsx', 'Conf time', 'Block size', 'Trnsx/blo 'Conf fees', 'Fee rate', 'USD/BTC', 'Trnsx - pop addrs', 'Trnsx - unpop addrs', 'Tnsx : Addrs ratio'] tbl = len(tserie j tbl[i,j] = # values index=cols # 1st column index columns=co # 1st row column names '''; In\u00a0[26]: # 7 moving average tseries = [ cols = ['Unconf trnsx', 'Conf time', 'Block size', 'Trnsx/blo 'Conf fees', 'Fee rate', 'USD/BTC', 'Trnsx - pop addrs', 'Trnsx - unpop addrs', 'Tnsx : Addrs ratio'] tbl = len(tserie j tbl[i,j] = # values index=cols # 1st column index columns=co # 1st row column names Out[26]: .dataframe thead tr:only-ch th { text-align right; } .dataframe thead th { text-align left; } .dataframe tbody tr th { top; } Unconf trnsx Conf Block Trnsx/bloc Conf fees Fee rate USD/BTC Trnsx - pop addrs Trnsx - unpop addrs Tnsx : Addrs ratio Unconf trnsx 1.000000 0.512825 0.572234 0.662592 0.751183 -0.318481 0.476519 0.684877 0.732961 0.042633 Conf 0.512825 1.000000 0.875708 0.821096 0.652057 -0.347289 0.519717 -0.016592 0.466974 0.234847 Block 0.572234 0.875708 1.000000 0.856833 0.748027 -0.435521 0.624602 0.387743 0.522778 -0.082361 Trnsx/bloc 0.662592 0.821096 0.856833 1.000000 0.619106 -0.513678 0.332789 0.263169 0.915094 0.402304 Conf fees 0.751183 0.652057 0.748027 0.619106 1.000000 -0.326240 0.824995 0.661089 0.378880 -0.363753 Fee rate -0.318481 -0.347289 -0.435521 -0.513678 -0.326240 1.000000 -0.217555 -0.591717 -0.393656 0.126348 USD/BTC 0.476519 0.519717 0.624602 0.332789 0.824995 -0.217555 1.000000 0.523433 -0.354745 -0.716468 Trnsx - pop addrs 0.684877 -0.016592 0.387743 0.263169 0.661089 -0.591717 0.523433 1.000000 0.244647 -0.409759 Trnsx - unpop addrs 0.732961 0.466974 0.522778 0.915094 0.378880 -0.393656 -0.354745 0.244647 1.000000 0.471671 Tnsx : Addrs ratio 0.042633 0.234847 -0.082361 0.402304 -0.363753 0.126348 -0.716468 -0.409759 0.471671 1.000000 { var mathjaxscr = = = = ? \"innerHTML : \"text\")] = + \" config: + \" TeX: { extensions { autoNumber 'AMS' } },\" + \" jax: + \" extensions + \" displayAli 'center',\" + \" displayInd '0em',\" + \" showMathMe true,\" + \" tex2jax: { \" + \" inlineMath [ ['$','$'] ], \" + \" displayMat [ ['$$','$$' ],\" + \" true,\" + \" preview: 'TeX',\" + \" }, \" + \" 'HTML-CSS' { \" + \" linebreaks { automatic: true, width: '95% container' }, \" + \" styles: { .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important' }\" + \" } \" + \"}); \"; (document. || }"},{"title":"Corporate\u00a0London","url":"corporate.html","body":"2014 -\u00a02017 Having made arrangemen leave London, seems reasonable reflect time\u00a0here. London tough city live \u2014 big enough sub 1-hour commute considered good, super expensive. stay London defined quest complete graduate scheme qualify an\u00a0account first arrived had no idea London working corporate like. coming academia, motivation moving finance summed two\u00a0points Understand 2008 paid mostly same skills (math) in\u00a0enginee think there\u2019s anything wrong these motivation making long term career plan\u00a0inste started job surprised 6 weeks induction hot-deskin Life auditor felt nomadic, everyone spend large amounts client\u2019s offices, no-one own desk our office. thing really own knowledge network 2014, arrived high opinion employer staying several years. Having escaped financial insecurity short-term research grants, I\u2019d moved back home country contribute system educated me. happy regular job decent, phrase kept coming mind back \u201caccountan factory\u201d. Our training materials scripted everything standardis process. processed. Graduates in, corporate company huge efficienci barriers competitio come this. arrived impressed free biscuits, felt presumptuo put meeting someones diary. Now ignore any communicat addressed mailing\u00a0li Accountant toughest experience related accountanc qualificat Na\u00efvely had believed qualificat wouldn\u2019t big deal didn\u2019t give any thought applied \u2014 just wanted find banks worked. exams done fine, I\u2019d already achieved PhD handle\u00a0it. turned mistake. huge mistake. alarm bells rung louder realised graduate colleagues had applied qualificat (and already intending leave asap afterwards Doing pre-course before college wasn\u2019t trivial. College - sent classroom again. taken office, away clients, put classroom prepare these\u00a0exam Starting job required becoming chartered accountant without considerin effort involved qualify dumb. oversight find hard to\u00a0believe disappoint sadness having study again profound. teaching assessment style several steps behind I\u2019d become to. Compared depth, autonomy research-f doctorate, writing cookie-cut essays time-press exams felt stupid. exams hard failed several them, probably low morale whilst revising. Retaking required weekends annual leave spent away family, camped-out libraries and\u00a0office required patience generosity Ritsya, who having seen long periods during doctorate expected us lifestyle came London. found miserable pause social life interests whilst studying, try rush back had time, knowing soon I\u2019d pause them\u00a0again hadn\u2019t already studied Vienna, process working studying London exciting felt valuable special. I\u2019d passed enough exams though know they\u2019re never important they\u2019re made be, whatever missing life wasn\u2019t going found upside though, ACA practical qualificat gained taught useful aspects business finance. I\u2019m glad finally see business mysterious system something attainable Neighbourh Living London required lot trains \u2014 door desk commute hour way, never lived somewhere London hasn\u2019t felt transient. We\u2019ve needed live near station didn\u2019t commute hour that\u2019s put us neighbourh young profession who long term plans (or financial ability) stay city. We\u2019re looking move move fast possible. leave London partly people same attitudes priorities my\u00a0own\u2026 Back office spent first few months figuring people organised, teams operated decisions made. think took year feel understood things really worked, 1.5 years feel aspects job certainty. difference things spoken about, things experience performanc matters behaviour defined self-inter think different previous environmen worked \u2014 academia isn\u2019t any different1 constructi industry certainly isn\u2019t. wonder way people endure they\u2019ve experience anything else, think normal, necessary. find myself wishing kinder other, structures incentivis Corporate finance usually appears clean well presented. people appear dependable capable. culture sanitised there\u2019s lot pressure conform - see clothes accessorie wear jokes tell the\u00a0cantee came see office glass steel cathedral. read Middle East, migrants arriving Europe, tower blocks burning, felt Despite high regard hold ourselves, ask help. Maybe too busy, feel powerless help. Apparently know help, despite our wealth, talents, education remember watching man leave office thought he gave his whole career left his firm after decades service, nothing left identify him after few weeks. always done. Market forces dictate business adapts grows. City rolls\u00a0on. Publicatio trump almost metrics, incentives publish quantity over quality such risky slow research inexcusabl metrics standardis success allocate resources subverted just well academia any industry. management measures, team prioritise"},{"title":"Blockchains from the ground up: Part\u00a02","url":"blockchain-networks.html","body":"Maintain accurate list transactio across large group users, without part introducti features generalise blockchain Part introduced features immutable record creation parties public cryptograp Part explores network users maintain same (true) list transactio protect against\u00a0fr Broadcasti transactio the\u00a0networ Part saw Lizzie, John Chris exchanging coins. Lizzie paid John coins owed her Chris. These transactio authentica PKI\u00a0which: Ensured Prevented participan claiming didn\u2019t Prevents anyone creating transactio someone else\u2019s behalf without their\u00a0cons people network grows, transfer coins user another becomes harder track. every users ledger identical opportunit arises coins already spent pay someone who doesn\u2019t know they\u2019ve already been\u00a0used. double spending, possible ledger shared amongst members group weak consistenc - necessaril correct all\u00a0locati Weak consistenc solved requiring everyone votes accept transactio before accepted ledger (Unanimous consensus) save reduce requiremen 50% users validate transactio before accepted ledger (Quorum consensus) Either these solutions possible small local group list all\u00a0users. However Unanimous Quorum Consensus doesn\u2019t solve weak consistenc problem\u00a0if group is\u00a0large group small spread across different locations or\u00a0timezon possible know members therefore proportion users real identity user is\u00a0unknown these cases peer-to-pe network required where transactio users require approval users before confirmed. trivial solve, users incentivis dishonest, may mistakes. distribute consensus problem, wikipedia defined\u00a0as consensus problem requires agreement among agents single value. processes (agents) may fail unreliable ways, consensus protocols fault tolerant resilient. processes somehow put forth candidate values, communicat another, agree single identity participan known, distribute consensus possible. Two types protocol allows users distribute system agree transactio Paxos family protocols Two-phase commit protocol. Both these require least 50% users reach agreement order add However public peer-to-pe network total active users known - fast cheap user profiles, existing user profiles may become dormant. makes impossible know users 50% be. Additional possible cheaply user profiles (just generate public-pri pair), single actor generate control user accounts order votes force incorrect transactio onto ledger. attack where user subverts network creating profiles known Sybil attack. Proof of\u00a0Work solution Sybil attack increase cost verifying transactio such cost exceeds reward. achieved through proof-of-w (PoW) algorithms expensive sender claiming verified transactio simple receiver verify sender validated possible Proof approach require hash verificati message begins certain characters chosen characters called nonce way verificati message acceptable hash try slightly different messages. example, nonce may zeros. arbitrary, longer nonce difficult becomes find hash fits hash random list characters altering even single part hashed result completely different hash value. Therefore no way predict hash value. way generate hash required none repeatedly alter hashed (even just character) until hash required features randomly achieved. expensive achieve, simple to\u00a0verify. method, user who seeks verify transactio broadcast result (once they\u2019ve verified transactio repeatedly try different messages until randomly find message meets nonce requiremen simple user check transactio verificati message meets nonce requiremen simple inspect hash compare the\u00a0nonce. effect requiremen process makes expensive claim transactio verified cheap check verificati claim. removes threat Sybil attack, does remove distribute consensus problems created not\u00a0knowin true identity users the\u00a0networ users\u00a0exis problem cannot completely solved, practical solution relax requiremen such probabilit accepting fraudulent transactio lower user defined threshold. acceptable user require higher degree confirmati high-value transactio low-value transactio therefore willing incur cost verify high transactio reduce probabilit accepting incorrect transactio below a\u00a0threshol user wishes fast low-value transactio trusts party they\u2019re transactin with, may accept transactio without any users network verifying sender required However senders assured, verificati required. risky valuable transactio users receiver funds ask verify sender access required funds. higher users, higher probabilit dishonest transactio identified before appropriat level verificati depend amount transferre well receiver funds knows the\u00a0sender Asking peers network verify transactio introduces problem. Verifying transactio requires effort, incurs cost. cost requires network participan rewarded correctly verifying transactio attacker attack cost less reward. Therefore cost verificati required just enough cost attack introduces problem costs verify transactio transactio itself. recursive problem where users who verified first transactio verify payment received valid. Furthermor high proportion original transactio spent transactio fee (for verificati not\u00a0effici These problems avoided combining multiple transactio verifying same time, broadcasti successful verificati multiple transactio simultaneo grouping transactio together block confirming multiple transactio once (and proving transactio fees aggregated (allowing individual fee lower). block includes list verified transactio reference previous block, block ID. Incentivis transactio verificati process outlined above remarkable creates demand participan network creating financial incentive verify transactio makes network secure increasing participan makes sybil attack Summary Users generate transactio broadcast peer-to-pe network idle user listens transactio collects until sum transactio verificati fees greater cost user incur verify meet idle user adds extra transactio list transactio transfers sum transactio fees own\u00a0addres idle user generates block newly verified transactio referencin previously verified block transactio ordered completing proof-of-w challenge. block broadcast the\u00a0networ users listening block announceme These users verify block valid according proof-of-w requiremen order the\u00a0blocks Users unverified transactio look inside verified block see pending transactio been\u00a0accep Competing validate blocks user choose transactio verify, verify before beginning proof-of-w requiremen hopefully collecting transactio fees. lack order around transactio verificati fine way increase probabilit first claim transactio fees associated collection transactio (a block) spend CPU power searching required partial two users complete block approximat same blockchain look different different parts network, completed block begins propagate users accept block add ledger. ok rule enforced requires user always accept longest chain of\u00a0blocks. works multiple blocks created same time, takes subsequent blocks vary due random behaviour proof-of-w algorithm. Therefore chains different length always exist version block chain longer others, providing clear candidate branch blockchain use. transactio discarded branch present (longest) blockchain added back pool transactio block transactio never above procedure verifying transactio adding blocks onto chain means even user inspects block sees transactio verified, possible future longer chain discovered (which accepted) doesn\u2019t include Therefore any block potentiall removed, means transactio never completely verified. However probabilit block removed decreases blocks after increases. means verificati thought terms blocks added chain after block containing willing accept high level risk, trust party transactin opt small blocks added after block containing transactio benefit increasing speed transactio verificati transactio risky high-value might require larger blocks added chain before accepting transactio increase required verify transactio reduce probabilit longer chain undo block containing transactio in\u00a0questio"},{"title":"Move","url":"move.html","body":"Ambition Since 15, ambitions entreprene joke dad buying him nice boat one\u00a0day. Life far predominan education, stage over now. I\u2019m walking away come see lifestyle career too doesn\u2019t sense live this. Ultimately develop multiple sources passive income. to\u00a0create. Summer\u00a0201 last few months intense, weeks leaving feeling ambitious energetic, others feeling anxious overwhelme better defining goal, taking quickest path there, ignoring Ritsya brave enough imaginativ enough force think big consider live better life. biggest fear screw up, shooting myself foot Ritsya daughter also. headed safely unremarkab existence terrible swap something worse. won\u2019t\u00a0happ know better decisions produce best under pressure, thrive I\u2019m perceived underdog. accept without reason foolish. Whilst clear plan, direction, goal, (I them) got skills see make. I\u2019ll never best work, productive combinatio skills experience I\u2019m cog someone safer employee self-emplo guess price removing risks difference generate employer you\u2019re paid. think those risks overpriced people capable realise. Sometimes walk situation find it. sometimes leave place order Autumn\u00a0201 Last year boss gave advice supposed encouragin I\u2019d requested reduce involvemen stuff unrelated job contribute team still maintain semblance boss pretty clear reducing involvemen extra stuff possible. During our conversati he advised worry contribute team \u201cthe done anyway\u201d. meant encouragin instead removed any conviction did was\u00a0import"},{"title":"Flee","url":"flee.html","body":"Summer children squeal shriek, Watch wars. Excitement mounts. exotic. Unexpected Death arrives. Grow-up Grow old Face death Evade evil. tire. World fragile. Towers burn, Bridges bludgeon, Markets stab. Got get\u00a0out."},{"title":"Understanding VC\u00a0Investment","url":"investment.html","body":"attended Lisbon Investment Summit June wrote experience here. best sessions Boris Golden called \u201cUnderstan Investment These my\u00a0notes: VC\u2019s seeking identify high-poten startups, support fund\u00a0them. looking something innovative and\u00a0unprov startup company organisati searching Whilst executing discoverin scalable way to\u00a0grow. Startups money ambitious credible growth\u00a0pla typical stake VC roughly\u00a020 VC\u2019s exit price least 100m, otherwise business models work\u00a0out. $10m seem lot founder 30% stake, enough attract VCs, aim\u00a0higher to\u00a0pitch Identify specific people real\u00a0needs of\u00a0market Why\u00a0now? clear competitiv advantage - why no-one else do\u00a0this? Market Find large Management Build smart, skilled cohesive\u00a0t strong ability deliver quickly learn\u00a0quic ready go big whatever it\u00a0takes unique vision Valuable Efficient go-to-mark Profitable Scalabilit Momentum Show traction you\u2019ve cracked Show ambitous credible growth\u00a0pla growth\u00a0mod clear strategy and\u00a0win"},{"title":"How to be an ambitious founder in\u00a0Europe","url":"ambitious.html","body":"Whilst Lisbon Investment Summit went session called \u201cWhat means ambitious founders Europe\u201d Oussama Ammar. written generally summit here. Oussama spoke passion humour. clear he cares encouragin would-be founders confrontin cultural hurdles exist Europe. These notes the\u00a0sessio serious building something matters great exciting future\u00a0ahe never predict who successful who fail. lot dumb successful people clever founders can\u00a0fail. really important learn leverage effectivel lose anything else back never recover you\u2019ve already\u00a0sp way succeed try\u00a0hard. hard something that\u00a0matte Europe ambitious average (measured against countries) environmen makes harder entreprene (Attitudes risk, comfort, security, expectatio failure.. unhelpful for\u00a0founde impossible just harder. Everyone replaceabl no-one is\u00a0unique. always lose money replace it. money the\u00a0world. Take look Crunchbase see failure rate companies raised $1m - $10m, same rate those raised\u00a0$10 lose money project learn things experience leverage that\u00a0learn \u2026 never back you\u00a0spent. Zombies companies enough money survive enough provide joy people company - aim high\u00a0and\u2026 Starting company big deal, starting marriage. Think hard doing, problem trying solve, who working\u00a0wi Europe enough money go around makes pitching hard. Silicon Valley doesn\u2019t this\u00a0probl average startup Europe raise less startup USA. Europe irrational concerned risk. USA less concerned risk very\u00a0helpf pragmatic about\u00a0risk Incorporat London where laws good, even operate UK. better designed system corporate law. Estonia also\u00a0good. Best European city for\u00a0founde London, isn\u2019t best city none are\u00a0holist London the\u00a0money Paris engineerin product developmen (and no-one outside Paris knows Berlin automation execution, execution and\u00a0scalin \u2026You draw these cities, taken together surpass Anecdotes founder Slack lives Vancouver his wife kids. He spends week California everyone thinks Slack California due marketing. Forget national pride, pragmatic. Leverage the\u00a0intern founders Airbnb fly York California week. originally California where AirBnB started, decided York AirBnB success, moved York flew back meetings , etc. ask Europeans come meeting London (which far California York) people start complainin deciding can\u2019t be\u00a0bothere"},{"title":"The Lisbon Investment\u00a0Summit","url":"lis17.html","body":"attended Lisbon Investment Summit June 6 7 part Oula.la InsurTech startup team John Sullivan. first startup conference I\u2019d arrived hoping useful conversati understand Fintech startup spaces Europe. usual wanted focus tech, finance Who was\u00a0there well outstandin sessions high ratio investors startups. made talking VCs, bankers M&A lawyers really easy. happy meet London-bas VC sat down lunch, thanks interrupti session ask blockchain related questions 1, banker struck conversati over breakfast next day. met lot people across relevant roles, once worked through notes collection business cards hope great useful sessions me\u00a0were: \u201cWhat means ambitious founders Europe\u201d Oussama Ammar TheFamily \u201cUnderstan Investment Boris Golden \u201cBuilding successful businesses blockchain technologi panel discussion moderated Kevin Loaec, founder Chainsmith blockchain consultanc including Mir Serena Liponi Blockchain blockchain session valuable unusual meet people who working blockchain space several years. I\u2019m always wary distracted hype noise around developmen blockchain space appreciate hearing informed opening session included speech Mayor Lisbon next opened speech Secretary Industry. Both speeches conveyed open progressiv attitude internatio cooperatio aimed promoting supporting founders startups Portugal. warm words supported practical measures including tax incentives state-back scheme match amounts contribute private investors. really refreshing hear politician extol virtues multinatio cooperatio bringing different cultures Portugal. wish Britain this\u00a0too. topic Brexit, inevitably arose due London\u2019s present role centre finance innovation seems Europe still expecting UK come senses, cannot understand why destroying goodwill reputation so\u00a0thoroug Overall two days Lisbon full useful energetic conversati great experience pitching Oula.la multiple times talking we\u2019re trying blockchain part that. opportunit meet founders investors invaluable making informed decisions. Lisbon beautiful city found easy around always felt safe in. refreshing affordable"},{"title":"Blogging with Pelican: Design, Plugins,\u00a0Sharing","url":"pelican2.html","body":"Design approach building blog keep simple possible, adding features significan improvemen content understood used. Therefore done away several features normally come baked WordPress theme. example footer full links never used, sidebar full opted single column design hopefully presents text-heavy articles clearly intuitivel (please leave comment tell you\u00a0think) Plugins plugins extend Pelican\u2019s functional reflects this, Neighbors plugin next previous post accessed bottom post without going back index, Tag Cloud plugin reflect subjects written (and provide link Speed speed site important faster site enjoyable use. Therefore minified CSS JavaScript Assets plugin. CSS JavaScript load Images optimised Optimize Images plugin small possible download quickly. site uses CloudFlare free CDN features hopefully no matter site decent page\u00a0speed arranged homepage posts shown category posting date. may very well larger posts, I\u2019ll consider problem once presents itself. Designing hypothetic conditions yet exist waste of\u00a0time. examples Jinja templates below context sharing articles Twitter and\u00a0Facebo Plugin: Share\u00a0Post noticed posts beginning tweeted about, thought useful sharing buttons bottom post Twitter, Facebook Email. Looking Pelican Plugins repo Github showed (as usual) plugin (called Share Post), though noted hadn\u2019t updated couple of\u00a0years. Installing initial set-up simple thanks readme git repo. copy plugin folder plugins directory, add name plugin list copy paste Jinja/HTML article.ht template. That\u2019s enough it\u00a0work. noted though shared Twitter text tweeted encapsulat quotes \u2018b\u2019 front. realised due Python 3.x plugin (which hadn\u2019t updated years) likely written Python 2.x. quick google obligatory trip showed convert bytes string text\u00a0strin # Python tweet = ('%s%s' % (title, # Python tweet_as_b = ('%s%s' % (title, tweet = found article couldn\u2019t shared twitter mobile device due URL incorrectl formatted. URL format required separate arguments URL, additional text # Incorrect twitter_li = % tweet # Correnct twitter_li = % (url, tweet, t_handle) meta-data specify tweet\u00a0text thought cool add default text tweet, enjoyed feature blogs found post wanted share Twitter. - user may know share article they\u2019re hurry might hard find right words, why provide ready-made tweet. text editable a\u00a0suggesti text different post makes sense specify writing article. article \u2018summary\u2019 too long, know Pelican supports arbitrary meta-data tags. assumed Jinja pick same way picks \u2018standard\u2019 meta-data added def tweet = 'tweet'): tweet = quote(('%s % else: Once working simply case calling assigning output variable called \u201cTweet\u201d, adding \u201cTweet\u201d text string included tweets\u00a0tex tweet = tweet_as_b = ('%s' % tweet = t_handle = bit fiddling around sure spaces part tweet correct, nothing complicate making Until. Specifying text image Facebook\u00a0s Sharing Facebook worked without any formatting problems, bugged opening text article preview shared Facebook had summary already prepared useful potential readers. articles had article image wanted see being\u00a0used Googling revealed needed particular meta tags webpage\u2019s header wanted control Facebook pickup. Facebook uses \u201copen graph\u201d standards headers article pages include the\u00a0follow `` `` `` `` `` ` see already had meta tags generated Jinja templates copy-pasti modifying build tags. had issues trailing white space breaks included within content string. solved like\u00a0so: {# Adding '-' after before %'s strips white space breaks #} {% block descriptio %} {%- -%} {{ }} {%- else -%} {{ }} {%- endif -%} {% endblock descriptio %} needed blocks once, descriptio tag already included Facebook wants Twitter wants too. three these tags include same text (generated Jinja2 snippet above). block needs once generated like\u00a0this; call \u201c{% block descriptio %}{% endblock descriptio %}\u201d again Jinja throw error. documentat (and SO) reveal solution to\u00a0use: allows reuse blocks multiple times keep Finally, testing Facebook see correct text image picked initially frustrated see tags having any effect. Facebook crawls site saves finds. take fresh look page meta tags, tell Facebook crawl page again, Facebook see sharing buttons below, please click see what\u00a0happe Note: first article describing began Pelican here"},{"title":"Blockchains from the ground up: Part\u00a01","url":"blockchain-introduction.html","body":"maintain reliable list across small network without part introducti features generalise blockchain haven\u2019t included references Bitcoin any particular digital currencies blockchain digital currency just applicatio financial document cannot forged or\u00a0dispute Let\u2019s imagine village somewhere where people still trade bartering. John apples whilst Lizzie oranges. John orange, offers Lizzie apple exchange. She accepts, writes John a\u00a0receipt. Date: 1234 From: Lizzie To: John What: Orange Price: Apple far, good. receipt evidence transactio next John wants orange doesn\u2019t anything exchange. He offers write Lizzie note saying he owes Lizzie orange (an IOU). think agree John sign note Lizzie prove John owes her 1\u00a0orange. Date: 1234 From: John To: Lizzie What: Orange Signed: John's signature, Lizzie's signature IOU nice gesture, simple forge. Lizzie copy IOU once Lizzie seen Johns signature, she easily copy IOU\u2019s. She change IOU orange 11 oranges (for example) John couldn\u2019t prove original amount was. Lizzie John disagreed over owed impossible know who telling truth. person\u2019s word against the\u00a0other. Lizzie realises suggests improvemen - find witness copies IOU. copy signed Lizzie, John Witness. Lets call Date: 1234 From: John To: Lizzie What: Orange Witness: Walter Signed: \"John's signature\" \"Lizzie's signature\" \"Walter's signature\" stronger document difficult forge. Lizzie changes \u201cWhat:\u201d \u201c11 Oranges\u201d, both John Walter copies original her signature it. pieces evidence against Lizzie\u2019s 1. Lizzie laughed court.\u00a0Hah Party transactio pretty well, transactio recorded today. weakness: Lizzie bribe Walter transactio falsified! John rely Walter verify his version transactio down Walters lack integrity. Lizzie Walter change orange 11 oranges Lizzie offered Walter extra oranges give both incentive forge documentat Walter liked oranges enough, he might care his career witness be\u00a0ruined. problem modern financial systems great deal time, money regulation devoted trying ensure third parties trustworth E.G. buy car bank cahoots car dealership defrauded. Reducing risk acceptably low level makes financial services slower expensive otherwise to\u00a0be. solution public-key infrastruc (which introduced previous post). system, individual generates own public-pri pair. keep private private public freely available. detailed descriptio public-key cryptograp scope post, but\u00a0briefl public derived private key, pair together unique mathematic properties Either encrypt message decrypt it. cannot same encrypt decrypt message. private encrypt anybody decrypt (because public publicly available) whilst clearly terrible way keep secret great way verify who encrypted message, person private key. this, private encrypt message effectivel creating digital signature cannot forged. (If public encrypt message private decrypt it, approach transfer secret Back fruit. Lizzie wants accept John\u2019s IOU she public-key cryptograp no-one needs worry Walter. steps 1] IOU stating John owes Lizzie 1\u00a0orange. Date: 1234 From: John To: Lizzie What: Orange 2] John creates public private pair encrypts IOU his private key. He adds unencrypte \u201cFrom\u201d\u00a0lin From: John Date: 1234 To: Lizzie, What: Orange <- Signed encrypted John his private 3] John makes his public freely available anyone who wants\u00a0it. anybody (not just Lizzie) check John signed IOU. transactio verified looking \u201cFrom\u201d part transactio noticing transactio supposedly John John\u2019s public decrypt encoded signature decrypted John\u2019s public his private encrypt it. John person his private key, proves transactio valid, Lizzie isn\u2019t dishonestl creating debt John to\u00a0pay. Clearly John discloses his private (or stolen) he system insecure, problem John his security protocols, maintain accurate list far we\u2019ve seen IOU (for orange) securely created, signed verified. process extended people exchange fruit. For\u00a0exampl original\u00a0n From: John Date: 1234, To: Lizzie, What: Orange <- Signed encrypted John his private From: Lizzie // Date: 1235, To: John, What: Apples <- Signed encrypted Lizzie her private From: John // Date: 1236, To: Chris, What: Banana <- Signed encrypted John his private From: Chris // Date: 1237, To: Lizzie, What: Bananas <- Signed encrypted Chris his private After these 4 transactio John, Chris and\u00a0Lizzie John owes orange Lizzie banana to\u00a0Chris Lizzie owes apples to\u00a0John Chris owes bananas to\u00a0Lizzie. confusing, (and ridiculous possible know who debt who wealthy. Lizzie owes apples, owed bananas apple. Does mean her fruit business losing money making money? cannot say. able know same unit fruits. Lets say orange worth apples, banana worth apples (therefore banana = orange.), lets invent currency called \u201ccoins\u201d say apple worth coin. 4 transactio now rewritten\u00a0 From: John // Date: 1234, To: Lizzie, What: coins <- Signed encrypted John his private From: Lizzie // Date: 1235, To: John, What: coins <- Signed encrypted Lizzie her private From: John // Date: 1236, To: Chris, What: coins <- Signed encrypted John his private From: Chris // Date: 1237, To: Lizzie, What: 4 coins <- Signed encrypted Chris his private going through list transactio see\u00a0that: John owes Lizzie Chris coins each, owed coins Lizzie. His net amount is\u00a0-2 Lizzie owes John coins owed 4 coins Chris. Her net amount is\u00a0+2 Chris owes Lizzie 4 coins owed coins John. His net amount is\u00a0-2 far Lizzie person who appears any Lizzie wanted 4 coins she owed Chris buy something John? she system transfer Chris\u2019 promise pay her 4 coins Chris pay John instead? fact everyone sure record transactio accurate authentic allows debt payment. Lizzie\u2019s transactio look like\u00a0this: From: Lizzie // Date: 1235, To: John, What: ba781... <- Signed encrypted Lizzie her private \u201cWhat\u201d section contains hash original transactio (with Chris) she wants transfer John. hash signature text case signature Lizzie\u2019s transactio Chris. signature unique transactio identifies transactio payment. both transactio signed Lizzie\u2019s private key, simple verify Lizzie right previous transactio where she owed (or paid) coins payment shows public-pri infrastruc securely record transactio enable trade group people, - under certain conditions Blockchain transfer units example, just easily put selfies certificat ownership (for houses, financial instrument diamonds, etc) inside \u201cWhat\u201d part transactio two changes - removing \u201cTo\u201d part transactio including hash transactio part text signed private key. this, record would\u00a0be: From: Chris // Date: 2345, What: \"A photo me\" <- Signed encrypted Chris his private reliable record Chris claims he looks like. He confidentl send anyone record his public verify Chris himself who signed asserting photo him. somebody changed photo transactio change transactio hash value. hash match hash contained within signature, text signature cannot changed encrypted Chris\u2019 private key, Chris has. Therefore simple show someone Chris trying change the\u00a0photo. Another public-key cryptograp arises Chris employee bank, \u201cWhat\u201d contained documents customer bank providing financial services for. scenario, Chris (represent bank) effectivel confirming customer\u2019s true identity documentin evidence that\u2019s collected show bank knows who customer really is. transactio included section called \u201cCustomer ID\u201d (for example) database customers whose identity checks successful completed made. shared department (or banks) easily immutably. concept behind KYC a\u00a0blockcha Back our fruit traders: moment participan allowed carry net negative balance. system reality, creation \u201ccoins\u201d controlled order maintain value. example above, people freely \u201ccoins\u201d carry negative amounts \u201ccoins\u201d. result \u201ccoin\u201d plummeting Therefore creation (and conversion fruit) controlled Our examples far include people. lot people network wouldn\u2019t feasible insist everyone present online transactio added list (the chain) transactio However allow transactio added whilst people offline opportunit fraud. reasons why, solution problems described part 2."},{"title":"London Rent vs. London\u00a0Salaries","url":"london.html","body":"Living London expensive, everyone UK knows this. Everyone knows mostly due price property, enjoy talking\u00a0ab lived here years now, wife both working lived comfortabl Two incomes under roof just fine. fine cities, reasonable Just over year ago first child born, now wife\u2019s maternity pay ended single income household. not\u00a0fine. Even though earn almost \u00a350k/year, any salary increase taxed 40%, cannot cover essential day-to-day costs. I\u2019m 40% tax bracket, basic monthly outgoings exceed monthly take home pay \u00a3400. employer wanted pay enough cover essential costs, cost approximat double shortfall due tax. None makes\u00a0sens Salaries living expenses become people obvious way increase wealth buy property. Mortgage repayments cheaper rent, property increases over time. Double win. big hurdle overcome before possible - saving money deposit house often impossible without external help (i.e. \u201cBank Mum Dad\u201d), money earnt spent rent\u00a0first trap. Repayments mortgage cheaper paying rent, cannot save enough salary goes paying rent1,\u00a0and average cost flat London 500k2, means 5% deposit \u00a325k \u2014 higher deposit anywhere else UK, despite place least able accumulate partner went back put our baby childcare? Childcare cheap, working bring cost childcare. requires higher average salary graduate job, (which life stage people might reasonably start having children), unless both parents unusually high earners option isnt viable\u00a0eit Living London financiall possible either single household income You\u2019d lucky find bedroom flat less \u00a31000/mont According Rightmove, estate agent useful price statistics"},{"title":"Introduction to the \u00c6ternity blockchain\u00a0project","url":"aeternity.html","body":"These notes \u00e6ternity blockchain project, I\u2019m affiliated \u00e6ternity\u00a0t \u00c6ternity blockchain project pre-launch headline goal securely facilitate large volumes interface external sources. made possible via decentrali oracle based prediction markets. These terms explained below. \u00e6ternity project proposed several notable Smart Contracts Oracles native Governance Written in\u00a0Erlang Different types of\u00a0node Sharding Smart Contracts smart contract way execute contract without intermedia (middle-ma smart contract protocol stored executed blockchain executing transactio (outputs) based specific inputs programmab logic automatica logic often mirrors contained clauses State channels payment networks exchange funds off-chain periodical settle accounts blockchain (The Bitcoin Lightning Network creating system routing Bitcoin payments through State channels increase scalabilit making groups transactio independen other. allows processed in\u00a0paralle \u00e6ternity proposes executing state channels (Turing complete means, colloquial real-world general purpose), allow greater volumes transactio smart contracts secure easier to\u00a0analyse executing off-chain makes private execute smart contract won\u2019t broadcast primary blockchain increase processing capacity allowing contracts execute in\u00a0paralle Disadvanta state-chan approach include reduced transparen running smart contracts state channels requires trust both contract creator node running\u00a0it Oracles Oracle functional allows interact outside \u00e6ternity blockchain possible checking on-chain prediction market results rewarding users who made correct prediction Users rewarded through automated payments immediate recording transactio blockchain creates incentives participat prediction markets, shown be\u00a0effecti On-chain, rather off-chain allows greater efficiency prediction market expected run native (on-chain) consensus procedure. oracle mechanism designed same Governance Oracle functional compliment prediction Prediction markets proposed implement governance \u00e6ternity blockchain new\u00a0approa \u00e6ternity protocol governed user input. prediction market exist where changes features protocols result higher token\u00a0valu incentive increase token (\u00c6on) allow \u00e6ternity community decide efficientl changes to\u00a0impleme Low level protocol changes variables block times block capacity be\u00a0possibl consensus developed prediction market initially provide input developmen Later, fully autonomous prediction market governance expected (a DAO) Written in\u00a0Erlang Erlang normally large-scal systems manage allocation scarce network resources (telecoms, banking, easier run lightning network process state-chan in\u00a0paralle far know, \u00c6Ternity first blockchain project written in\u00a0Erlang Different types of\u00a0node \u00e6ternity network contain nodes different functions. node contribute towards efficient functionin particular aspects the\u00a0networ Node types will\u00a0inclu Liquidity - Lots channels lots users. Open channel issue contract, a\u00a0fee. Exchanges - Trustless exchanges assets offered market makers. Profitable market makers Presumably features such consensus algorithms prediction markets require own dedicated node types. Users node incur transactio fees participat providing incentive run a\u00a0node. Sharding Allows greater transactio volume, removing scalabilit problems Bitcoin Ethereum Sharding works splitting space possible accounts subspaces (for example based first digit shard gets validators validator validates shard\u00a0only Contracts transactio within same shard as\u00a0normal Contracts transactio across shards require alternativ techniques based"},{"title":"The \u00c6ternity ICO: My\u00a0experience","url":"aeternity-ico.html","body":"April 3rd, happened Googling digital currencies blockchain innovation came across \u00c6ternity website skimmed white paper. project ambitious, crypto projects, seems well organised. team well known space. clear plan develop project blockchain technology that, successful bring. step change digital currencies high volume low transactio viable implementa ICO surprise, realised phase Initial Coin Offering (ICO) begin, wanted acquire rights \u00c6ons (the \u00c6ternity token). During phase 1, ETH purchase 1100 \u00c6ons. early April 2017, ETH worth about\u00a0\u00a338. willing small risky investment order convert convention Sterling Bitcoin Ether, order purchase \u00c6ons. \u00c6ternity website made super easy Etherium wallet, wallet invest \u00c6ternity project, buying Ether immediatel putting wallet proved Helpfully, \u00c6ternity project had partnered Swiss firm \u2018Bitcoin Suisse AG\u2019 who directly convert \u00c6ons fiat currencies cutting purchase intermedia digital currency. However once I\u2019d completed identity checks signed, scanned sent multiple forms, realised I\u2019d pay \u2018signing on\u2019 fee \u00a370. Bitcoin Suisse\u2019 credit though, did manually approve identifica contract within an\u00a0hour. time, thought project still investment even extra cost, determined exhaust possibilit first. I\u2019m familiar cryptocurr wallets public/pri keys due previous research, able immediatel begin trying account an\u00a0exchang Exchanges followed fairly chaotic few hours where sign-up several exchanges see close purchasing either Bitcoin Ether immediatel before realising either had wait 48 hours security clearances provide additional details, wait manual verificati scanned end evening had rough idea usernames, passwords (small) sterling amounts had submitted each\u00a0excha After couple false starts, combinatio Coinbase desktop website iOS app purchase ETH weekly limit, multiple cards increase holding ETH. Coinbase app bug processing debit card payment verifying card details bank. had initially led try exchanges, where hit roadblocks delays. CEX.IO, example, doesn\u2019t allow trades first 48 hours (IIRC) after registerin reasonable enough unless you\u2019re a\u00a0hurry. Conclusion Once had few Ether name, rest process simple. delighted visit Etherscan. details Etherium - \u00c6ternity transactio almost immediatel gave lot confidence hadn\u2019t sent money void, nice contrast (successfu experience buying bitcoin early\u00a02014 Finally, simple tool check \u00c6 balance bottom Eternity\u2019s contributi page assured I\u2019d made investment successful me, \u00c6ternity project stands exciting endeavor seeking solve widespread highly valuable technical challenges hope they\u2019re successful wish them\u00a0well."},{"title":"Blogging with\u00a0Pelican","url":"pelican.html","body":"began blogging 2016, became aware blogs designed. favorting blogs had simple designs made easier focus content, loaded really fast. (E.g. CuriousGnu wanted blog, too. I\u2019d Wordpress build publish blog great way begin, felt compromisi design functional wanted control over led static sites contain fixed content faster load easier design built dynamic blogging platform such Wordpress. already familiar Python chose Pelican rather another static site generator such as\u00a0Jekyll. plenty sites tell start blogging Pelican, here focus experience after initial set-up. learning begin, found Amy Hanlons blog particular useful and\u00a0clear. learning\u00a0c \u2026 longer expected. Since setting switch Wordpress Pelican, taught myself enough following tools hack site together. I\u2019m really happy these tools future projects\u00a0t HTML find HTML quirky intuitive. Tags sense, comments laborious learning google relatively quick. Whatever I\u2019m trying (like add link jump back top page) someone posted CSS Writing CSS feels lot concise HTML felt impossible learn without taking step back reading introducto course. Usually learn hacking phrases together existing examples frustratin go backwards before progressin lightbulb moment realised CSS Selectors thing, realising CSS files called header (usually) HTML\u00a0file\u2026 ended trial subscripti Thinkfuls Front-end developer course, pretty explaining CSS structured arrange content page. still had access, I\u2019d completing second half course\u00a0:) Jinja tool written Python HTML pages. doesn\u2019t look intuitive me, able enough done copy-pasti similar snippets parts theme started (Thanks Molivier!) changes wanted. I\u2019d learn seems Pelican build website Pelican, run commands terminal. various commands found myself few regularly. generate project skeleton started. \u201cmake devserver\u201d initialise local server generate output files changes locally before uploading (its opposite \u201cmake stopserver Finally \u201cpelican content -s generates html css remote hosting. plugins such \u201cAssets\u201d minifies CSS publshconf called, confused initially didn\u2019t think working Git really challenged me, still feel know I\u2019m doing. Git far powerful be, undo erroneous edits upload version site to\u00a0Github. stage commit files, local remote repo\u2019s command line. change remote\u2019s URL, reset repo force push pull. That\u2019s all. haven\u2019t tried merge test branch, part process goes wrong usually takes hours right\u00a0agai tool awesome Google cannot magic exact right answer example, still output folder source repo is\u2026 mysterious me. real output, version frozen few weeks ago, \u201c@\u201d name. know got there. created afternoon blur frustrated google queries find git\u2019s commands least intuitive tools use, preceeding single dashes double dashes, random words thrown middle otherwise Git ubiquitous Github awesome, learn\u00a0it. Github pages external URL You\u2019ll add called CNAME repo containing output. CNAME contain address site You\u2019ll update DNS records domain name point name Github\u2019s servers. Github, two \u201cA Records\u201d host \u201c@\u201d values respective CNAME record host \u201cwww\u201d equal took 12 hours changes propagate, during had variable success loading the\u00a0site. Plugins thing didn\u2019t moving away Wordpress site bloated features didn\u2019t content easier read. However found still needed few plugins optimise site provide basic functional doesn\u2019t come Super useful, publish notebook webpage copy .ipynb context directory add sidecar .ipynb-met standard meta data. functional reasons why Pelican popular bloggers. (Though Nikola Neighbors end post link previous next blog posts - surprised wasn\u2019t included standard. After putting plugin plugins folder updating copy couple jinja snippets template, maybe add css links look\u00a0nice. those images small possible help site fast possible. Add plugin, update thats\u00a0all. Assets Before started working Pelican, minifying css JavaScript too advanced. once Pingdom Google Pagespeed started criticisin multiple .css files, accepted the\u00a0challe Conclusion I\u2019m super happy wth websites design speed. designed way it, learnt ton useful stuff along the\u00a0way. Update: second post blogging Pelican here."},{"title":"Analysing a personal\u00a0library","url":"books.html","body":"friend mine collected books years recently begun catalogue them. post, show simple analysis catalogue query ISBN database fill missing\u00a0da In\u00a0[1]: HTML code_toggl { (code_show } else { } code_show = !code_show } $( document window.onl = function() //time millisecon 10000) }; ''') Out[1]: code_toggl { (code_show } else { } code_show = !code_show } $( document toggle visibility blocks, click here. Set-up settings some\u00a0packa In\u00a0[2]: # Display plot results inline, separate window %matplotli inline %pylab inline # figures = (14, 5) pandas pd re bibtexpars numpy np plt Populating interactiv namespace numpy matplotlib Load In\u00a0[3]: table = table = table[0:91 df = table orig_rows = (df.shape[ print(\"The %d rows catalogue\" % (df.shape[ ) 9187 rows catalogue formatting tidying:\u00b6V top 5 rows see arranged cells are\u00a0comple In\u00a0[4]: df.head() Out[4]: Location Subject Title Author Publisher ISBN? Shelf Pages Price Date HR Islam Islamic Invasion Morey Harvest HP 1960 89081 983 17cm 221 8 2008-04-01 00:00:00 HR Word lists Testament Word Lists Morrison & Barnes Erdmans 1975 8028 1141 8 125 2008-04-01 00:00:00 HR Theology: Salvation Triumph crucified E Sauer Paternoste 1952 207 2008-04-01 00:00:00 HR Early Fathers Ante-Nicen Christian Library Ed Menzies T&T Clark 1897 533 9 2010-03-01 00:00:00 4 HR Apologetic Earth\u2019s earliest ages G.H. Pember H & S 1895 494 2008-04-01 00:00:00 format two decimal places (currency) rows become a\u00a0float: In\u00a0[5]: = def to_number( try: s1 = s1 except ValueError s df.Price = f : to_number( df.Value = f : to_number( Find remove blank\u00a0rows In\u00a0[6]: # rows values df = # drop row columns print('%d row removed % (orig_rows - df.shape[0 ) # row contained removed row removed List rows column are\u00a0empty: In\u00a0[7]: # rows column Out[7]: Location 29 Title 34 Publisher 175 Shelf 336 Pages 540 Author 915 Price 3611 ISBN? 4770 Date 5712 Subject 6208 9179 dtype: int64 Based these results, title publisher Split column containing two types of\u00a0data: \u201cPublisher column contains both publisher year published. split two\u00a0column In\u00a0[8]: = None # default='w df['PubYea = expand=Tru # regex confusing = expand=Tru Improve format \u2018Date\u2019\u00a0col In\u00a0[9]: df['Date'] = frame now columns in, top 5 rows\u00a0are: In\u00a0[10]: df.head() Out[10]: Location Subject Title Author Publisher ISBN? Shelf Pages Price Date PubYear HR Islam Islamic Invasion Morey Harvest HP 89081 983 17cm 221 3.00 8.00 2008-04-01 1960 HR Word lists Testament Word Lists Morrison & Barnes Erdmans 8028 1141 8 125 3.00 2008-04-01 1975 HR Theology: Salvation Triumph crucified E Sauer Paternoste 207 3.00 10.00 2008-04-01 1952 HR Early Fathers Ante-Nicen Christian Library Ed Menzies T&T Clark 533 9.00 2010-03-01 1897 4 HR Apologetic Earth\u2019s earliest ages G.H. Pember H & S 494 3.00 2008-04-01 1895 books bar chart below shows books library published given decade. list below shows 5 oldest\u00a0boo In\u00a0[11]: = '{:,}'.for df.PubYear = fig = // * logy = False) Publicatio Books\") fig Out[11]: 0x10501f2b 5 oldest\u00a0tit In\u00a0[12]: df['PubYea = df2 = != 0.0] Out[12]: Location Subject Title Author Publisher ISBN? Shelf Pages Price Date PubYear 4753 Lib Christ\u2019s own country Dom Ernest Graf Burns Oates Sh.4.5 302 Gift 1999-07-30 1037 3043 StM First Epistle Peter C.E.B. Cranfield SCM Press interestin Sh.5.5 128 NaT 1050 4574 Lib Music Score Easy-Play Speed Music; waltz clas Sight & Sound Sh.4.4 47 99P NaT 1076 7184 25A Noble Qur\u2019an transl Al-Hilali & Khan Madinah Sh.3.6 956 3.0 2010-12-10 1417 3296 Lib Chained Bible Chris Barker Very incomplete Sh.1.1 NaT 1585 List books each\u00a0locat In\u00a0[13]: df3 = df = Out[13]: Location 25A 3411 LIB 2457 CH 1088 ST9 1000 STM 886 HR 305 29 ST.M HR ST M SA LB CH :LIB dtype: int64 list differnet subjects, order list In\u00a0[14]: df4 = df df4[\"Subje = Out[14]: Subject 6208 COMMENTARY 61 LOCAL HISTORY 58 SERMONS 41 CENTURY BIBLE 37 THEOLOGY 36 CHRISTIAN BIOGRAPHY 34 BIOGRAPHY 31 NT COMMENTARY 31 HEBREW GRAMMAR 30 SACRED BOOKS EAST 30 POETRY 29 CLARK'S FOREIGN THEOL LIB 28 GENERAL EDIT ANTONIA FRAZER 25 NOVEL 24 WRITERS 24 CATALOGUE 22 AUTOBIOGRA 20 OT COMMENTARY 19 GREEK 19 EXPOSITOR' BIBLE 18 SRIMAD BHAGAVATAM 18 BABYLONIAN TALMUD 18 PHOTOGRAPH 17 GREAT MUSEUMS WORLD 15 CHURCH HISTORY 14 DAILY READINGS 14 CHRISTIAN LECTURES 14 NOTES CATHEDRALS 14 INTERNATIO CRITICAL COMM 13 ARAMAIC 13 CLARENDON BIBLE 13 FICTION - CADFAEL 13 CLARK'S FOREIGN THEOL LIB. 13 APOLOGETIC 12 PSALMS 12 CAMBRIDGE BIBLE 12 PRAYER 12 LIFE LIBRARY PHOTOGRAPH 11 COMMENTARY HOLY SCRIPT 11 MASTERPIEC LIBRARY 11 COMMENTARY O.T. HYMNS POEMS MYSTICISM DICTIONARY BIBLE EXHIBITION CATALOGUE POETICAL WORKS TENNYSON DICTIONARY HISTORY dtype: int64 list authors library. Order list of\u00a0books: In\u00a0[15]: df5 = df df5[\"Autho = Out[15]: Author 915 VARIOUS 31 BHAKTIVEDA S PRAB 19 C.H. SPURGEON 19 ELLIS PETERS 17 ED. RABBI I. EPSTEIN 17 LESLIE WEATHERHEA 15 ED CARLO RAGGHIANTI 15 ALBERT BARNES 14 JAMES HASTINGS 13 GEORGE ADAM SMITH 13 WILLIAM TEMPLE 12 JAMES MOFFATT 11 ED J HAMMERTON 11 KEIL & DELITZSCH 11 WILLIAM BARCLAY SHAKESPEAR PETER ACKROYD IAN WILSON 9 CHARLES DICKENS 9 BERNHARD WEISS 9 J.B. PHILLIPS 9 ED QUENNELL & HODGE 8 CHARLES GORE 8 H.V. MORTON 8 M.F. SADLER 8 VARIOUS AUTHORS 8 ED ANDREW LANG 8 GEZA VERMES 8 S.R. DRIVER 8 EVELYN UNDERHILL 8 \" 8 HENRY ALFORD 7 ALDOUS HUXLEY 7 ED JAMES HASTINGS 7 ED ARTHUR MEE 7 ROY STRONG 7 ALEXANDER MACLAREN 7 MARCUS DODS 7 JOACHIM JEREMIAS 6 THOMAS WRIGHT 6 ED R. CROMARTY 6 SUSAN GLYN 6 DAVID FOUNTAIN 6 WILLIAM WHISTON 6 C.S. LEWIS 6 BARRIE TRINDER 6 DAVID TRUMPER 6 G. CAMPBELL MORGAN 6 ALISTER MCGRATH 6 dtype: int64 Distributi book length of\u00a0pages: In\u00a0[16]: def try: s1 = s1 except ValueError df.Pages = f : df6 = != ''] 2000, 100.0)) fig = range=[0, 2000]) Pages\") Books\") Out[16]: 0x10585b3c Query ISBN database find missing\u00a0da Lastly, thought fun challenge fill gaps data. table below shows rows ISBN missing either Author, Title or\u00a0Publish turns rows meet criteria, cases publisher is\u00a0missing In\u00a0[17]: df7 = & ((df['Auth == '') | (df['Title == '') | == ''))] df7 Out[17]: Location Subject Title Author Publisher ISBN? Shelf Pages Price Date PubYear 1430 ST9 BIOGRAPHY SCIENTIST Longitude (John Harrison) DAVA SOBEL 85702 571 7 Sh.1.2 184.0 5.99 NaT 1998 2707 STM DEVOTIONAL Romans: Momentous News DAVID COOK 978 906173241 Sh.3.4 55.0 1.0 2011-07-28 2011 3874 LIB Annie\u2019s Box - Darwin\u2019s daughter RANDAL KEYNES 84115 060 6 Sh.2.4 331.0 3.99 2002-07-20 2001 4705 LIB HISTORICAL NOVEL Galileo\u2019s Daughter DAVA SOBEL 85702 861 9 Sh.4.5 429.0 2002-09-27 1999 5949 25A Short Life Long Times Mrs Beeton KATHRYN HUGHES 84115 373 7 Sh.1.4 525.0 \u00a32.50P 2012-02-09 2005 6008 25A Signs Sky (Birth Age ADRIAN GILBERT 609 80793 5 Sh.1.5 329.0 4.0 2012-03-07 2001 6097 25A Isaac Newton, last Sorcerer MICHAEL WHITE 85702 706 X Sh.1.6 403.0 \u00a31.50P 2012-02-09 1997 6663 25A Live Wires - powerful stories cha D. J. CARSWELL 978 906173 13 5 Sh.2.7 124.0 1.0 2011-06-29 2010 8640 25A KING ARTHUR QUINCENTEN Specyal ED SIDNEY HART 948485 Sh.5.9 145.0 \u00a32.49P 2003-06-28 1985 8845 25A Order St John - short history E L EDMONDS 947718 07 9 Sh.5.7b 35.0 \u00a33.75P NaT 1986 In\u00a0[18]: isbnlib * isbnlib.co * * bibtexpars def SERVICE = 'isbndb' APIKEY = 'IZXL3ESD' # APIKEY) # register bibtex = isbn = clean(isbn try: = SERVICE)) except: 'isbn invalid' In\u00a0[19]: def get_pub(is bibtex_str = has_isbn(i try: bib_db = dic = except: In\u00a0[20]: df7['ISBN? = df7.Publis = f : get_pub(f) table below shows results isbnlib query. thought odd \u2018missing\u2019 publishers names began number. turns regex method split publisher name year publicatio separate columns doesnt numbers publishers name. Rather go back correct this, I\u2019ll leave script show In\u00a0[21]: df7 Out[21]: Location Subject Title Author Publisher ISBN? Shelf Pages Price Date PubYear 1430 ST9 BIOGRAPHY SCIENTIST Longitude (John Harrison) DAVA SOBEL Fourth Estate 85702 571 7 Sh.1.2 184.0 5.99 NaT 1998 2707 STM DEVOTIONAL Romans: Momentous News DAVID COOK 10Publishi 978 906173241 Sh.3.4 55.0 1.0 2011-07-28 2011 3874 LIB Annie\u2019s Box - Darwin\u2019s daughter RANDAL KEYNES 4th Estate 84115 060 6 Sh.2.4 331.0 3.99 2002-07-20 2001 4705 LIB HISTORICAL NOVEL Galileo\u2019s Daughter DAVA SOBEL Fourth Estate 85702 861 9 Sh.4.5 429.0 2002-09-27 1999 5949 25A Short Life Long Times Mrs Beeton KATHRYN HUGHES None 84115 373 7 Sh.1.4 525.0 \u00a32.50P 2012-02-09 2005 6008 25A Signs Sky (Birth Age ADRIAN GILBERT Three Rivers Press 609 80793 5 Sh.1.5 329.0 4.0 2012-03-07 2001 6097 25A Isaac Newton, last Sorcerer MICHAEL WHITE Fourth Estate 85702 706 X Sh.1.6 403.0 \u00a31.50P 2012-02-09 1997 6663 25A Live Wires - powerful stories cha D. J. CARSWELL None 978 906173 13 5 Sh.2.7 124.0 1.0 2011-06-29 2010 8640 25A KING ARTHUR QUINCENTEN Specyal ED SIDNEY HART Three Golden Crowns 948485 Sh.5.9 145.0 \u00a32.49P 2003-06-28 1985 8845 25A Order St John - short history E L EDMONDS s.n 947718 07 9 Sh.5.7b 35.0 \u00a33.75P NaT 1986 { var mathjaxscr = = = = ? \"innerHTML : \"text\")] = + \" config: + \" TeX: { extensions { autoNumber 'AMS' } },\" + \" jax: + \" extensions + \" displayAli 'center',\" + \" displayInd '0em',\" + \" showMathMe true,\" + \" tex2jax: { \" + \" inlineMath [ ['$','$'] ], \" + \" displayMat [ ['$$','$$' ],\" + \" true,\" + \" preview: 'TeX',\" + \" }, \" + \" 'HTML-CSS' { \" + \" linebreaks { automatic: true, width: '95% container' }, \" + \" styles: { .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important' }\" + \" } \" + \"}); \"; (document. || }"},{"title":"FakeGL: A Synthetic General Ledger and Trial\u00a0Balance","url":"fakegl.html","body":"involves processing lot General Ledgers wanted build test various automation analytical techniques see workflow improved. order free fun way, fake data, build process generate fake General Ledger (GL) correspond Trial Balance (TB). Motivation didn\u2019t know comprehens needed GL - modern systems complex store wide variety uses. resolved start something simple iterate long I\u00a0wanted. journals produced below satisfy following general journal contains equal debits and\u00a0credit Opening closing Trial Balances net to\u00a00 Profit Loss (P&L) accounts start year balance, Balance Sheet (BS) accounts do\u00a0not. transactio hits both P&L BS (i.e. account P&L credited, side transactio debit BS) Distinguis manual GL: Contains journals posted evenly throughout year (this isnt realistic, simple way generate date\u00a0data) Receives journals Identifies journal manual depending subledger Records user posted journal journal is\u00a0manual script below allows user to\u00a0specify accounts GL/TB journals GL mean variance lines each\u00a0journ mean variance functional amounts posted to\u00a0account different users post beginning financial\u00a0 criteria manual journal, based on\u00a0subledg proportion manuals are\u00a0manual proportion accounts hit P&L BS arbitrary list of\u00a0subledg Jupyter Notebook below shows annotated Python I\u00a0wrote: Notebook set-up\u00b6Loa various libraries easily add required features. Two libraries to\u00a0note: Pandas pythons ubiquitous handling\u00a0t Faker useful tool generate fake data, easy way bootstrap a\u00a0database In\u00a0[1]: random gauss faker Factory random numpy np datetime timedelta datetime natsort natsorted, ns pandas pd Choose parameters values GL TB\u00b6 In\u00a0[2]: # ****** different accounts GL ********* x = 111 # ****** journals GL j = 15713 # Setup posting date d0 = '20160101' # first day, generated over year. d1 = \"%Y%m%d\") # ****** Distributi lines per journals ********** jl_1 = 21 # mean jl_2 = # variance j_l = lambda x, y: # ****** different users posting journals ***** fake = U = ul = [] _ range(0,U) # ****** Functional amount values q1 = 700 # mean q2 = 104 # variance def q(q1,q2): p = < 0.5 # True implies p: = -1 else: = = * # ****** Proportion journals manual ******** Mp = 0.23 # ****** Proportion accounts P&L accounts *** Pp = 0.3 # ****** Subledger names ********* source_fee = account feeds P&L BS: In\u00a0[3]: def len(elemen > 0: element[2] == 'P' False def len(elemen > 0: element[2] == 'B' False Generate account\u00a0co In\u00a0[4]: def b_names = [] p_names = [] a_names = [] p = 'ACP' b = 'ACB' range(x): = < Pp A: y = else: y = len(b_name % != 0: del b_names[-1 len(p_name % != 0: del p_names[-1 a_names = b_names + p_names Generate journal names and\u00a0length In\u00a0[5]: def d0 = '20160101' # first day, generated over year. d1 = \"%Y%m%d\") a_n = [] range(j): = y = 'J_' + + d1 = d1 + a_n.append j_names = dict((el, int( j_l(jl_1,j / )) el a_n) # determine lines journal. j_names list journal names account codes\u00b6 In\u00a0[6]: j_names = a_names = fake General Ledger save text file\u00b6 In\u00a0[7]: # Output format glf = f = open('gl.t 'w') f.write(gl + '\\n') key=lambda y: y.lower()) line_no = -1 = # Assign journal source feed source_id = # Assign journal posting date posting_da = d1 = d1 + # journal either M A, M assign user = < Mp # True implies U, 3*U/4) t: man_ind = 'M' u_name = ul[int(p)] else: man_ind = u_name = # Assign functional amount while < j_names[ke = + line_no = line_no + line_no2 = line_no + dr = q(q1,q2) cr = -1 * dr a_names_p = a_names)) a_names_b = a_names)) an1 = an2 = l_1 = + '|' + str(line_n + '|' + man_ind + '|' + posting_da + '|' + u_name + '|' + an1 + '|' + source_id + '|' + 'GBP' + '|' + str(dr) l_2 = + '|' + str(line_n + '|' +man_ind + '|' + posting_da + '|' + u_name + '|' + an2 + '|' + source_id + '|' + 'GBP' + '|' + str(cr) f.write(l_ + '\\n') f.write(l_ + '\\n') f.close() Trial Balance save text file\u00b6 In\u00a0[8]: # gl calc movement account gl = sep = '|') tb = # Calc net movement account tb = inplace=Tr tb.columns = = 'Account') # Assign account # b/f balances P&L accounts == 'P', 'Balance b/f'] = == 'P', 'Type'] = 'P&L' == 'B', 'Type'] = 'BS' tb['Balanc b/f'] # b/f balance != 0, generate balance account = index, row tb.iterrow row['Balan dummy'] != 0: row['Balan b/f'] = bal = b/f'] = bal b/f'] = -1 * bal += del tb['Balanc dummy'] # c/f field tb['Balanc c/f'] = ( tb['Balanc b/f'] + tb['Moveme ).round(2) # 'date balance' column tb['Balanc date'] = # Arrange columns tb = tb[['Accou 'Type', 'Balance b/f' , 'Balance c/f', 'Balance date']] # print TB sep='|', header=Tru index=Fals Load text files back display top rows\u00b6Verif files produced correctly TB balances as\u00a0expecte In\u00a0[9]: gl = sep = '|') tb = sep = '|') In\u00a0[10]: tb.head(10 Out[10]: Account Balance b/f Balance c/f Balance date ACB00003 BS 673.10 72348.68 20161231 ACB00007 BS -673.10 20045.09 20161231 ACB00010 BS 748.16 -30340.79 20161231 ACB00012 BS -748.16 188.39 20161231 4 ACB00015 BS 814.96 48294.11 20161231 5 ACB00017 BS -814.96 10659.80 20161231 6 ACB00021 BS 835.56 18357.33 20161231 7 ACB00032 BS -835.56 3406.80 20161231 8 ACB00034 BS 759.60 26505.40 20161231 9 ACB00036 BS -759.60 -39128.80 20161231 In\u00a0[11]: gl.head(10 Out[11]: Journal_ID Date User Account Source J_20160101 M 20160101 Iain Gardiner ACP00054 sl2 GBP -587.49 J_20160101 M 20160101 Iain Gardiner ACB00064 sl2 GBP 587.49 J_20160101 M 20160101 Iain Gardiner ACP00022 sl2 GBP 816.17 J_20160101 4 M 20160101 Iain Gardiner ACB00017 sl2 GBP -816.17 4 J_20160101 5 M 20160101 Iain Gardiner ACP00088 sl2 GBP 628.60 5 J_20160101 6 M 20160101 Iain Gardiner ACB00062 sl2 GBP -628.60 6 J_20160101 7 M 20160101 Iain Gardiner ACP00079 sl2 GBP -672.34 7 J_20160101 8 M 20160101 Iain Gardiner ACB00017 sl2 GBP 672.34 8 J_20160101 20160101 ACP00005 sl1 GBP -683.52 9 J_20160101 20160101 ACB00036 sl1 GBP 683.52 In\u00a0[12]: print('Net Opening TB:',\"%.2f % tb['Balanc b/f'].sum( print('Net Closing TB:',\"%.2f % tb['Balanc c/f'].sum( Net Opening TB: 0.00 Net Closing TB: 0.00 { var mathjaxscr = = = = ? \"innerHTML : \"text\")] = + \" config: + \" TeX: { extensions { autoNumber 'AMS' } },\" + \" jax: + \" extensions + \" displayAli 'center',\" + \" displayInd '0em',\" + \" showMathMe true,\" + \" tex2jax: { \" + \" inlineMath [ ['$','$'] ], \" + \" displayMat [ ['$$','$$' ],\" + \" true,\" + \" preview: 'TeX',\" + \" }, \" + \" 'HTML-CSS' { \" + \" linebreaks { automatic: true, width: '95% container' }, \" + \" styles: { .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important' }\" + \" } \" + \"}); \"; (document. || }"},{"title":"Reconciliation of a trial balance to a general\u00a0ledger","url":"reconciliation.html","body":"working financial ledgers lot recently. python below shows automated workflow import, process report reconcilia Trial Balance (TB) General Ledger (GL). I\u2019m fake data, script fine real fields renamed appropriat real additional fields needed considered these vary depending business analysed. Therefore fake GL TB here simple generic. Additional fields, such entity code, transactio status, approver, stamps, etc added quickly and\u00a0simply Set-up notebook import\u00a0dat In\u00a0[1]: # libraries pandas pd random In\u00a0[2]: # (possibly incomplete and/or inaccurate gl = sep = '|') tb = sep = '|') Calculate net movement account ledger\u00a0dat In\u00a0[3]: gl_move = gl_move = inplace=Tr = = 'Account') inplace = True) Calculate movement account trial\u00a0bala In\u00a0[4]: = ( tb['Balanc c/f'] - tb['Balanc b/f'] ).round(2) inplace = True) Compare accounts movement ledger trial balance write result report containing reconcilia results all\u00a0accoun In\u00a0[5]: Rec_report = = 'outer', left_index = True, right_inde = True) = - = date'] = sep='|', header=Tru index=True Put accounts reconcile In\u00a0[6]: Unreconcil = != 0] Unreconcil = = False).ind sep='|', header=Tru index=True Unreconcil Out[6]: Balance b/f Balance c/f Balance date TB_Movemen GL_Movemen difference Account ACP00081 P&L 0.00 -16279.96 20161231 -16279.96 -17017.89 737.93 ACB00082 BS 760.09 -4041.02 20161231 -4801.11 -4063.18 -737.93 ACP00071 P&L 0.00 -28547.84 20161231 -28547.84 -29260.31 712.47 ACB00091 BS 628.24 3054.74 20161231 2426.50 3138.97 -712.47 ACP00017 P&L 654.01 24449.74 20161231 23795.73 23123.06 672.67 ACB00076 BS 768.49 -48456.11 20161231 -49224.60 -48551.93 -672.67 ACB00037 19808.54 ACP00001 -3817.92 ACP00041 -14365.77 ACP00046 1825.79 ACP00086 -7263.37 report containing In\u00a0[7]: # Accounts TB GL = == True] In\u00a0[8]: # Accounts TB where TB_Movemen isn't matched GL = == ==False)] In\u00a0[9]: Total_Acco = = Total_Acco - = Rec_Fracti = / Total_Acco Unrec_Frac = / Total_Acco In\u00a0[10]: \"w\") text_file: print('The 'accounts' 'accounts reconcile (', '%)\\n', 'accounts reconcile (', '%)', In\u00a0[11]: \"a\") text_file: print('The are', 'accounts GL TB. (', '% unreconcil accounts)' print('The are', 'accounts journals missing (', '% unreconcil accounts)' In\u00a0[12]: net_diff = == \"a\") text_file: print('The net difference is', net_diff, In\u00a0[13]: # Does TB balance? \"a\") text_file: print('\\nT opening balance unbalanced by', \"%.2f\" % tb['Balanc b/f'].sum( print('TB closing balance unbalanced by',\"%.2f\" % tb['Balanc c/f'].sum( print('*** these TB certainly wrong receiving \\nbalanced TB first step reconcilin accounts** In\u00a0[14]: diffs = frequency = {} w diffs: frequency[ = 0) + pairs = {x x frequency x > 1} # dict comprehens filter pairs \"a\") text_file: print('\\nT are', len(pairs) 'unreconci accounts equal opposite difference In\u00a0[24]: 'r') fin: contains 110 accounts 99 accounts reconcile ( 90.0 %) 11 accounts reconcile ( 10.0 %) 5 accounts GL TB. ( 45.45 % unreconcil accounts) 6 accounts journals missing ( 54.55 % unreconcil accounts) net difference 0.0 TB opening balance unbalanced -2486.28 TB closing balance unbalanced 1326.45 ***If these TB certainly wrong receiving balanced TB first step reconcilin accounts** unreconcil accounts equal opposite difference { var mathjaxscr = = = = ? \"innerHTML : \"text\")] = + \" config: + \" TeX: { extensions { autoNumber 'AMS' } },\" + \" jax: + \" extensions + \" displayAli 'center',\" + \" displayInd '0em',\" + \" showMathMe true,\" + \" tex2jax: { \" + \" inlineMath [ ['$','$'] ], \" + \" displayMat [ ['$$','$$' ],\" + \" true,\" + \" preview: 'TeX',\" + \" }, \" + \" 'HTML-CSS' { \" + \" linebreaks { automatic: true, width: '95% container' }, \" + \" styles: { .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important' }\" + \" } \" + \"}); \"; (document. || }"},{"title":"Spotify song\u00a0history","url":"spotify.html","body":"Spotify recently sent \u20182016 Wrapped\u2019 email containing few statistics listening habits 2016, playlist 101 played\u00a0son decided compare statistics those I\u2019d gathered myself. option Preference menu log (\u2018scrobble Spotify listening history last.fm. where download data. thought interestin verify Spotify stats, see discover any 1. Notebook set-up\u00b6 In\u00a0[1]: # Display plot results inline, separate window %matplotli inline %pylab inline # figures = (14, 5) # pandas nicer plotting style pandas pd plt plt.style. = 'default' Populating interactiv namespace numpy matplotlib In\u00a0[2]: # dataframes look bit prettier HTML css = + # Print output decimal places = # Just works cell # sets behaviour entire notebook %precision %.2f Out[2]: '%.2f' 2. Load explore data\u00b6 In\u00a0[3]: # Load .csv downloaded column_nam = ['Artist', 'Album', 'Name', 'd_t'] # Choose column names df = names = column_nam header=Non # Convert date column (d_t) string date time, search date df['d_t'] = initial questions answer feel the\u00a0data: is\u00a0there? is\u00a0present maximum \u2026etc. In\u00a0[4]: # top rows df.head(10 Out[4]: Artist Album Name d_t Bonobo Animal Magic Kota NaT Samaris Samaris G\u00f3\u00f0a tungl 2016-12-15 09:44:00 Staves Dead & Born & Grown Mexico 2016-12-15 09:40:00 Bonobo Animal Magic Kota 2016-12-15 09:34:00 4 Gloaming Gloaming Sailor\u2019s Bonnet 2016-12-15 09:30:00 5 St. Germain St Germain Forget 2016-12-15 09:24:00 6 Yosi Horikawa Wandering Bubbles 2016-12-15 09:19:00 7 South Music O.C. Mix Paint Silence 2016-12-15 09:13:00 8 Staves Sleeping Car Sleeping Car 2016-12-15 09:09:00 9 Bonobo Days Come Recurring 2016-12-15 09:04:00 In\u00a0[5]: #How rows there? len(df) Out[5]: 36454 In\u00a0[6]: # 2016 rows == 2016]) Out[6]: 1983 In\u00a0[7]: # any values 2016? Ans = == 2016) & print('The are', Ans, 'rows values 2016') rows values 2016 In\u00a0[8]: # Maximum minimum dates print(\"Old record print(\"Mos recent record Oldest record is: 1970-01-01 00:00:00 recent record is: 2016-12-15 09:44:00 Scrobbling last.fm turned off first half of\u00a02016. In\u00a0[9]: #print(\"Ol record 2016 == 2016 began == Scrobbling 2016 began at: 2016-06-14 20:24:00 Therefore important remember analysed represents half of\u00a02016. 3. Verify Spotify\u2019s statistics Total Minutes\u00b6 According Spotify, listened 2357 unique artists year, 3309 unique tracks. Total streaming 45202 minutes. dont tell non-unique plays I\u00a0accumula Googling \u2018average song length\u2019 reveals pop songs last 3.5 minutes, think songs listen longer than\u00a0that. Spotify\u2019s UI understand light details, initially wondered calculate average song length. First just eyeballed (\u2018scanning analytics. realised sort playlist song length pick median, although I\u2019d know songs the\u00a0playli Whilst searching playlist properties \u2018number songs\u2019 simply spotted needed below descriptio 101 songs, total play 8hrs, 29\u00a0minutes Spotify tell spent 45202 minutes streaming music listened 3309 unique tracks in\u00a02016. Therefore: In\u00a0[10]: # Average length 101 listened songs Average = round((8*6 + 29)*60/101 print(\"Ave song length:\", Average, \"seconds\") print(\"or 5 minutes, seconds \\n\") # spent listening Spotify days print(\"Day listening Spotify 2016:\", whole month?!? \\n\") # spent listening Spotify seconds seconds_us = 45202 * 60 # songs played n_tracks = / Average,2) print(\"Num songs played # Average plays per songs unique_tra = 3309 # summary email average_pl = round(n_tr / print(\"On average, listen track\", average_pl \"times\") Average song length: 302.38 seconds 5 minutes, seconds Days listening Spotify 2016: 31.46 ...Really? whole month?!? songs played 2016: 8969.24 average, listen track 2.71 times surprising large amount spent listening music. cannot believe spent 1/12 2016 streaming music Spotify. thought quite repetitive listener, average 2.7 plays per song surprising low. (For example, short playlist \u2018Recurring Bonobo 5\u00a0times.) 3b. Unique Spotify, listened 2357 unique artists in\u00a02016. In\u00a0[11]: Ans = == print('Num unique artists scrobbled 2016:', Ans) unique artists scrobbled 2016: 510 songs scrobbled last.fm listening behaviour remained same thoughout year, expected result half Spotify\u2019s result (because began scrobbling June). summary email reported 2357 unique artists 2016. 510 clearly less half of\u00a02357. 3c. Unique tracks\u00b6 In\u00a0[12]: Ans = == print('Num unique tracks scrobbled 2016:',Ans unique tracks scrobbled 2016: 1060 Spotify reported 3309 unique tracks played 2016. result 1060 unique tracks second half 2016 less expected, though difference expectatio result great 3d. top Spotify, played tracks 2016\u00a0are: Lights Words\u00a0Gone Shuffle Luna \u2026all Bombay Bicyle\u00a0Clu In\u00a0[13]: # tracks did listen 2016? == Out[13]: Miserere 14 Shuffle 14 Lights Words Gone 12 Pilgrim\u2019s Song 12 Always 12 Luna 11 Hare 11 Already Know 11 Koop Island Blues Sailor's Bonnet Name: Name, dtype: int64 shows whilst \u2018top tracks\u2019 listened tracks, Spotify either uses different method calculate plays, \u2018top\u2019 synonymous June onwards, \u2018top tracks\u2019 joint 1st, 3rd 6th 3e. Top from\u00a0Spoti Bonobo Bombay Bicyle\u00a0Clu The\u00a0Staves Jack\u00a0Johns In\u00a0[14]: == Out[14]: Staves 170 Bonobo 161 Gloaming 132 Koop 107 Bombay Bicycle Club 105 Giovanni Pierluigi da Palestrina 70 Jimi Hendrix 48 Jack Johnson 44 Gregorio Allegri 43 Broken Social Scene 33 Name: Artist, dtype: int64 results different Spotify\u2019s, by\u00a0much. Artist Spotify\u2019s results result Bonobo Bombay Bicycle Club 5 Staves Thievery Corporatio 4 - Jack Johnson 5 8 Apart Thievery Corporatio conspicuou absent own scrobbled data, difference reasonably explained listening trends different Jan - June July -\u00a0Dec. results show prefer listening Bonobo over Bombay Bicycle Club, played songs Bombay Bicyle Club. shows songs Bonobo enjoy listening to, polarised opinions songs Bombay Bicyle\u00a0Clu 3f. Favourite Spotify, stream music Saturday any other\u00a0day. In\u00a0[15]: # Plot songs wer played week second half 2016 == Out[15]: 0x111243c8 Monday=0 and\u00a0Sunday result shows stream music Sunday any day. different result small difference explained (again) relating second half 2016. January June listened music Saturday Sunday - probably playing Starcraft. hobby unfortunat put ice had come second revision exams July and\u00a0Novemb 4. day\u00b6I thought interestin see music listen different times. expect listening habits different during week compared weekends, split summed songs played whilst grouping by\u00a0hour. figures below show unexpected dip around 3pm weekends, consistent streaming through whilst office during week. No matter week, appears always listen music the\u00a0evenin In\u00a0[16]: # Count songs played during hour weekends == 2016) & > Out[16]: 0x110493dd In\u00a0[17]: # Count songs played during hour during week == 2016) & < Out[17]: 0x11048fa5 5. attempts verify Spotfiy\u2019s statistics fall short covers second half 2016. shows requiremen quality inputs order achieve Having said that, clear listen Spotify far thought did. observatio Bonobo\u2019s tracks polarised views Bombay Bicycle Club\u2019s songs novel. all, think I\u2019m getting great\u00a0valu chart below songs played 14 June 2016 15 December\u00a02 top 101 songs 2016 played at: In\u00a0[18]: warnings figure = == foo = = ticks = ticklabels = [l.get_tex l { var mathjaxscr = = = = ? \"innerHTML : \"text\")] = + \" config: + \" TeX: { extensions { autoNumber 'AMS' } },\" + \" jax: + \" extensions + \" displayAli 'center',\" + \" displayInd '0em',\" + \" showMathMe true,\" + \" tex2jax: { \" + \" inlineMath [ ['$','$'] ], \" + \" displayMat [ ['$$','$$' ],\" + \" true,\" + \" preview: 'TeX',\" + \" }, \" + \" 'HTML-CSS' { \" + \" linebreaks { automatic: true, width: '95% container' }, \" + \" styles: { .MathJax .mo, .MathJax .mi, .MathJax .mn': {color: 'black ! important' }\" + \" } \" + \"}); \"; (document. || }"},{"title":"Vim!","url":"vim.html","body":"Vim text editor renowned efficiency keyboard shortcuts. based Vi text editor 1970\u2019s. first released 1991 still developed today. comes pre-instal Unix systems (including MacOS) run the\u00a0termin Vim famous another way too - difficult learn. found remarkably creative tools begin learning concepts controls. necessary no GUI. game here, interactiv tutorial. There\u2019s built-in vim tutorial - just \u2018vimtutor\u2019 into\u00a0Termi Vim designed take hands off keyboard mouse. \u2018insert\u2019 mode where enter text usual, \u2018command\u2019 mode where comprehens flexible shortcut language move around, edit search text. no GUI toolbar, very different approach text editing I\u2019m used\u00a0to. run Vim terminal, versions run apps. MacVim MacOS option show tool bar simple commands program, lets arrow keys move cursor addition VIM\u2019s \u2018hjkl\u2019 functional makes getting started lot plugins extend Vim\u2019s functional turn text editor IDE. post walks through setting Vim Python IDE explains manage recommend Daniel Mieslers blog post quick overview use\u00a0Vim."},{"title":"Autumn, BIN and $PATH","url":"autumn-bin-and-path.html","body":"Two small things learnt recently: importance PATH contents various BIN\u00a0folder Autumn 2016 gone planned. Whilst studying couple exams plans put hold hobbies ceased. Now life returning normal, opportunit post\u00a0again PATH $PATH variable (string) contains series folder locations separated \u201c:\u201d. these folders contains programmes name programme terminal without specifying location, OS looks sequential folder locations listed $PATH see programme there, executes\u00a0i BIN Bin Binary, Bin in\u00a0Trash. bin folders contain binary files, programmes ready be\u00a0run. run \u201cecho $PATH\u201d Terminal, see 9 folders called bin, convention contain binaries. just folders, OS look asked run"},{"title":"Introduction to my doctorate research -\u00a0Silos","url":"silos.html","body":"Background Spring 2010 until Autumn 2013, PhD candidate living Vienna, Austria working University Natural Resources Life Sciences. Before working Vienna, completed Masters degree Civil Environmen Engineerin University of\u00a0Edinbur research quantified effects changing amount gravity acting granular materials poured a\u00a0silo. PhD thesis short presentati defended\u00a0i Granular materials broard class materials encountere everyday - salt, pills, breakfast cereal, sand, rice, soil, landslides salt granular materials. ubiquitous occur different sizes and\u00a0variet Silos common container storing granular materials. pour granular material top, store while, dispense material controlled quantities the\u00a0bottom Research\u00a0f research focussed quantifyin changes gravity affected material contained inside silo, particular whilst silo emptied. pertinent engineers scientists yet scientific understand granular materials behave. Whilst gravity clearly affects granular materials, cannot say exactly\u00a0ho means can\u2019t analytical methods quantify physics occur real system. Instead empirical methods guesses, knowledge worked previous similar situations isn\u2019t necessaril bad, less efficient less reliable built small silo (30cm tall) put quite large centrifuge (3 metre diameter). rotating silo around centre centrifuge constant speed simulate higher gravity. added high-speed cameras, pressure sensors weighing scales measure material moving once opened silo outlet silo began empty. Photos experiment built seen\u00a0below programmed computer (using commercial PFC 3D software working FISH scripting language) simulate investigat same behaviours observed numericall as\u00a0physica class computer known DEM (Discrete Element Modelling) These models considerin every grain material individual usually sphere. sphere overlaps another (i.e. distance two particle centres less sum radiuses) force proportion overlap repels two spheres away other. simple approach repeated over every grain particle model, produces life behaviour situations advantages over \u201ccontinuum based techniques groups grains just big particle unusual properties DEM massive limitation though. requires huge amounts computatio resources - limits industrial scenarios outside. Until computers become much, powerful, DEM theoretica research Results gravity increases factor \\(x\\), both discharge rate local velocities within silo increase \\(\\sqrt(x) That\u2019s know you\u2019re planning storing stuff moon, useful step towards explaining exactly why bulk granular materials behave way they\u00a0do. overview research, doctorate thesis published papers downloaded below. PDFs containing 3D models movies require flash render, Adobe Reader Desktop order view\u00a0them. PhD Thesis\u00a0(20 Modeling silo discharge centrifuge Experiment investigat flow segregatio behaviour bulk solids silos under high gravity conditions (Particles 2013 Centrifuga modelling granular flows (Eurofuge Overview research (PhD defence,\u00a02 { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi"},{"title":"Encryption","url":"encryption.html","body":"Blockchain Elliptical Curve Cryptograp (ECC) authentica users authorise transactio These notes introduce field cryptograp explains modern cryptograp methods work. wrote teach myself encryption begin absolute basics, encryption generally works taking message representi series numbers turned series random looking numbers. Decryption works turning random looking numbers back Background history Cryptograp split classical modern eras. Modern cryptograp began 1977 introducti RSA Diffie-Hel algorithms Until then, Cryptograp required single (the secret code) encrypt decrypt message. transferre sender receiver secretly, classical cryptograp shared\u00a0sec modern era removed requiremen shared secret instead theory basis quantifyin strength encryption method. strength modern cryptograp technique quantifiab provable reference theory, rather users ability transport transfer secret\u00a0cod Modern cryptograp defined Public Cryptograp systems. (code) encryption another decryption encryption made public without any risk message decrypted, therefore known public key. decrypt private key, revealed. message encrypted public decrypted private\u00a0ke Public Cryptograp (PKC) systems algorithms easy process direction difficult reverse, known mathematic trap-door functions. simple example trap-door product two prime numbers. two random prime numbers chosen, trivial find product. However product two numbers known, relatively difficult find either factors (this first noticed 1874, \u201cCan reader say two numbers multiplied together produce 8,616,460, think unlikely anyone myself ever\u00a0know. simple problem shows finding product two (secret) prime numbers simple, factorisin result not. problem feature modern cryptograp Factoring prime numbers super famous mathematic problem, studied Eratosthen 3rd century BC recently RSA Factoring Challenge intended track factorisat techniques issues cash prizes factorisat products large\u00a0prim Generally, bigger difference difficulty executing reversing it, better RSA algorithm below uses factorisat foundation security, factorisat hardest problem solve relative keys required. Algorithms developed factor products large prime numbers, efficient randomly guessing possible factors. greater primes factored, efficient these algorithms become, therefore difference difficulty executing (multiplyi two large primes) reversing becomes smaller cryptograp length increases. problem public cryptograp becomes commonly resources available factor products primes increases, consequent larger keys are\u00a0requir Ultimately encryption techniques based difficulty factorisat become redundant difficulty gap creating solving shrinks. better trap door is\u00a0require Overview RSA\u00a0algori Named after founders (Ron Rivest, Adi Shamir, Leonard Adleman), RSA first public-key encryption algorithms still widely\u00a0use RSA (as well cryptograp techniques makes loops back zero after reaching maximum value, rather increasing indefinite means once maximum \\(n\\) defined, greater \\(n\\) created result simply loops around begins counting again. i.e. \\(n = 10\\), \\(7 + 5 = 12 - = 2\\). result calculatio looping may easily found doing long division remainder final answer, i.e. \\(12 / = 1\\) Generation pair RSA\u00a0keys: 1. Generate RSA\u00a0module Select two large random prime numbers, \\(p\\) \\(q\\). random anyone who knows guesses able decrypt Calculate \\(n =\u00a0pq\\) 2. Find derived number\u00a0(e) e greater less \\(( p - 1)( q - 1)\\). no common factor e \\(( p - 1)( q - 1)\\) except 1. 4 3. Form public\u00a0key pair numbers \\((n, e)\\) form public made\u00a0publi Even though \\(n\\) public, difficult factor product large prime numbers attacker able find component primes available. strength RSA rests entirely difficulty factoring \\(n\\) two component prime\u00a0numb 4. Generate private key\u00a0(d) private generated \\(p\\), \\(q\\) e inputs Extended Euclidean Algorithm. given values, unique answer \\(d\\). \\(d\\) inverse \\(e\\) modulo \\(( p - 1)( q - )\\). means \\(d\\) less \\(( p - ) ( q - )\\) such multiplied e, equal \\(1\\) modulo \\(( p - ) ( q - )\\). RSA\u00a0exampl RSA does directly operate strings bits, operates numbers modulo (less than) \\(n\\). necessary represent plain text series numbers less \\(n\\). dominant encoding internet UTF-8, represents upper case Latin letter 65 90. encoding, message \u201cHELLO\u201d become \u201c\\(72, 69, 76, 76, 79\\)\u201d. maximum \\(n\\) needs product two prime numbers \\(p\\) \\(q\\). example choose \\(p = 7\\) \\(q = 13\\), \\(n = 91\\) 5 public component e any choose, long no common factor e \\(( p - ) ( q - )\\). our example, requires no common factor 72 e 1, e \\(= 5\\). Therefore our public (91, 5). made available anyone without messages decrypted difficulty factoring product (very large) prime\u00a0numb fact know 5 11 prime factors 55 e 5, Extended Euclidean Algorithm compute our private \\(d\\), is\u00a029. Therefore prime factors 7 13 used, public (91, 5) private (91, 29). These parameters fully functional RSA\u00a0system Encoding encode letter H message (\u2018H\u2019 \\(72\\) UTF-8), multiply itself \\(e\\) times (\\(e = 5\\)), rememberin wrap around pass our maximum \\(n = 91\\). \\(72 \\times 72 = 5184, 5184 / 91 = 56\\) \\(88\\) remaining, (i.e. \\(5184 = 91 \\times 56 + 88\\)). Therefore: \\(72 \\times 72 = 5184 = 88\\) \\(88 \\times 72 = 6336 = 57\\) \\(57 \\times 72 = 4104 = 9\\) \\(9 \\times 72 = 648 =\u00a011\\) Therefore encrypted \u201cH\u201d \u201c\\(11\\)\u201c method character message \u201cHELLO\u201d results encoded message decrypt message, take multiply itself \\(d\\) times, (\\(d=29\\)) wrapping around pass \\(91\\). \\(11 \\times 11 = 121 = 30\\) \\(30 \\times 11 = 330 = 57\\) \u2026 \\(57 \\times 11 = 627 = 81\\) \\(81 \\times 11 = 891 =\u00a072\\) we\u2019re back our Files spreadshee calculate encrypted decrypted values downloaded here. simple python script encrypt decrypt message here. uses AES Footnotes explanatio here here lot.\u00a0\u21a9 simple example \\(A=1, B=2\\) etc\u00a0\u21a9 Eratosthen invented his famous sieving algorithm finds primes given limit.\u00a0\u21a9 case e ( p - 1) ( q - ) called \u201ccoprime\u201d\u00a0 Whilst Extended Euclidean Algorithm apparently simple compute, descriptio not. Therefore same numbers following example tutorials here here.\u00a0\u21a9 { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi"},{"title":"Digital currencies: the\u00a0basics","url":"digital-currencies-the-basics.html","body":"Digital currencies often discussed context finance, technology economics. Blockchain - technology applicatio Bitcoin built - significan removes trust intermedia unrelated parties transactin other. far, influentia famous digital currency is\u00a0Bitcoin post intended introduce basic concepts digital currencies problems distribute ledger system needs to\u00a0overcom digital currency internet based medium exchange. Units digital currency printed, physical, represent nothing. unit currency produced running algorithms solve complex mathematic problems. solution found, unit currency (for example, Bitcoin) is\u00a0generat currency represents nothing, why it\u00a0valuabl people believe future, people believe does, people willing trade real goods services exchange for\u00a0it. same dollars, sterling euros (fiat currencies represent anything physical. (Although these examples supported laws past, creating currency without support government hasn\u2019t central bank required control physical creation currency (otherwise people counterfei currency, decreasing scarcity moving towards\u00a0ze intermedia (a bank) required large remote transactio sure amount money party owns correctly recorded updated ledger (preventin double spending of\u00a0funds) technologi breakthrou preventing double spending without requiring intermedia made possible cryptograp techniques developed over last few decades, cheap, powerful computers recently Central convention currencies everyone\u2019s balance transactio recorded central ledger (a list showing money account has) account holder access own balance transactio digital currencies copy entire ledger (every transactio ever made everyone) held computer (or node), anyone see two parties wish remote transactio bank intermedia bank mediates updating central ledger record change parties funds result transactio party knows counter-pa able pay, payment confirmed. copy ledger, maintained bank, bank involved every transactio account holders. intermedia increases complexity cost Sending\u00a0mo send money, message broadcast network amount account decrease amount another account increase. computer network (a node) receives message check authentici changes, pass message along other\u00a0node problems does transactio accepted entered distribute ledger, authentici needs verified. ledger distribute everyone see everyone else\u2019s transactio Therefore user authentica transactio authorisat needs possible without compromisi user\u2019s ability send secure payments in\u00a0future. problem double spending - currency neither physical, printed representa anything, prevent user spending currency once, simply creating currency they\u00a0want? Another problem addition transactio ledger unrelated users. party own copy ledger, updating (or changing) want, ledgers completene accuracy assured? update ledger take account transactio third parties, know order occurred?1 blockchain remarkable first technology solve these problems. Future posts consider these problems are\u00a0overco Byzantine Generals problem, nicely described introducti paper\u00a0\u21a9"},{"title":"Spare\u00a0time","url":"spare-time.html","body":"list interests consider pursuing. wrote began study last exams mind filled things I\u2019d rather doing instead. these interests just reacting having no spare few months, others decent goals projects. Temporaril losing spare made it\u00a0more. wrote post compare thought important busy wasn\u2019t. Writing list allowed move without forgetting Here\u2019s break down each\u00a0item: \u201cRun 10k 50 minutes\u201d - easier imagined. wrote list barely run 2k without stopping, intended go weekly run whilst studying. struggled stay energetic healthy during previous exam phases, now rule mild exercise even think can\u2019t spare time. find running really lowers stress levels, increasing heart rate working sweat lets sleep better concentrat longer. After few weeks minimal running, run 5k easily. kept it, 10k 50 mins easy. point\u00a02\u2026 \u201cBe Insanity strong\u201d - in, Insanity workout programme. Again. thought decided P90x instead. Week going\u00a0grea \u201cRead bible habitually - 17 found Jesus became Christian. months years after I\u2019d regularly read bible almost every pray lot. wanted understand goal 5 chapters each\u00a0day. read through testament repeatedly read old testament during time. knew scriptures well enough lot sermons became boring obvious - I\u2019d already studied bible passage used. During remember aware way thought different otherwise. perspectiv long-term less focused. thought reading instead days\u2019 headlines social chatter. remember enjoying benefits thinking keep habit. reasons why think Christiani wonderful well summarised sermon. now years later, whilst conviction strong, knowledge bible sadly pretty fuzzy. thinking clouded perspectiv contained media consume conversati I\u2019m part of. strongly suspect acting thinking differentl read bible more, know those difference be. Trouble is, often obvious immediate benefits reading bible are, bit. Praying help effective. books bible written last through ages across cultures, surprising they\u2019re easy read something written English speaker hurry. stop hurry, stop prioritisi \u201cThink more\u201d - similar note 3, less supernatur spent less consuming content little looking around walking, reckon I\u2019d self-aware better decisions. probably lead happier, \u201cPray more\u201d - know why, creator universe wants talk share life him. He cares me. makes no sense me, all. God, go way consider views concerns very flawed human. pray, prayers very often answered. ask him about\u00a0this \u201cAmazon seller?\u201d - Amazon \u201cFulfilled Amazon\u201d service, means even hold stock sell. choose right products, cheaply China reselling Amazon profit, end quids minimal effort manageable risk. \u201cBlog interestin data\u201d - Here am, blogging. stick topic technical. inspired blog in\u00a0particu \u201cFinish Coursera\u201d - science specializa great! R, focus Python, I\u2019d still it. consider opportunit cost \u201cRead fun, history, fiction\u201d - started job, April 2014, half way through Savage Continent, eye-openin eye-wateri history Europe years after World War 2. see Europe through different eyes it. However got half way though, since April \u201814 never felt had free energy pick back up. change. researcher student, had opportunit develop own pursuits. Since entering corporate world, find myself fighting war attrition exert personalit onto my\u00a0lifesty Read fiction\u2026 I\u2019m unconvince end it? it? Maybe just reading wrong authors, I\u2019m going leave now. Sure, gain appreciati different place, appreciati comes via fictional characters events, secondary. abstract constructs perspectiv morals\u2026 things history books ill-suited for? Great fiction essential exploring these. now, I\u2019ll prioritise point\u00a03. \u201cDo photograph project\u201d - love do, probably won\u2019t. luxury, opportunit cost too great right now. I\u2019d shoot series black white portraits, turn large prints. think portrait photograph uniquely impactful moving, choosing B&W removes distractio leaves subjects humanity more\u00a0expos \u201cHave list ideas\u201d - There\u2019s no excuse one, anyone several ideas. turning reality takes skill. ideas first,\u00a0tho \u201cDo law MOOC\u201d - i.e Study particular areas law, own own pace. studied tiny bit law during ACA, realised employment law contract law really useful. (Same tax system - another surprise). had brief introducti though, find I\u2019d know\u00a0more. \u201cDo InfoSec Network Security MOOC\u201d - super interestin likely of\u00a0time. \u201cLearn fight - Krav Maga / MMA\u201d - Ever since watching Bourne Identity wanted learn Krav Maga, Georges St-Pierre made train MMA. now though, I\u2019ll P90x. reconsider 90\u00a0days. \u201cGet London\u201d - contract ends April 2017, next summer crossroads hate commute, hate constantly rushed. Living cities lot more\u00a0pleas"},{"title":"\u00dcbersicht widget: Time\u00a0Until","url":"time-until.html","body":"previous post described introduced CoffeeScri via \u00dcbersicht, desktop widget app OS X, eventually published \u201cTime Since\u201d\u00a0wid Seeing few people download widget really satisfying soon wondering else publish. pragmatic engineer, seemed clear next widget do: first widget calculated since event, next calculate until event. companion \u201cTime Since\u201d improve upon first design choice cut Apple Script calculated everything CoffeeScri file. efficient easier to\u00a0read. Unfortunat soon began realise why original widget I\u2019d based \u201cTime Since\u201d had AppleScrip calculate elapsed. Date-Times fiddly languages, true began look increasing spaghetti tried achieve 6 key\u00a0featur Calculate months days two dates (complicat varying days Add option specify level detail output text (to minute, hour, day,\u00a0etc.) Remove any amounts output (\u201c2 Months 5 Hours\u201d \u201c2 Months, Days 5\u00a0Hours\u201d) Add option abbreviate times (\u2018years\u2019 \u2192 \u2018y\u2019, \u2018hours\u2019 \u2192 \u2018h\u2019, \u2018and\u2019 \u2192 \u2018&\u2019,\u00a0etc.) Output grammatica correct sentence (correct pluralisat comma separated terms, \u201cand\u201d last two\u00a0terms) Prepend append users After few frustratin hours, clear lot easier modify existing AppleScrip rather reinvent wheel JavaScript decided instead JavaScript knew AppleScrip correctly consider days months dates (feature 1), contains pluralise correct parts string (feature\u00a05 remaining features added combinatio statements arrays. statements simply ask amount equal zero. not, appended array terms include output. end chunk possible ask non-zero terms include output. array length less output terms created filled commas \u2018and\u2019 two arrays combined correct order looping through index longer array appending term final array. final array the\u00a0output \u2018Time Until\u2018 downloaded \u00dcbersicht widgets gallery. think another useful feature option specify output terms chosen amount, such weeks days. Maybe I\u2019ll the\u00a0future"},{"title":"How to wake up\u00a0early","url":"how-to-wake-up-early.html","body":"years wished wake early quiet pre-breakf hours productivi years spectacula failed this. love quiet, hours end too, well waking slowly.1 famous leaders politician known start days early, able too. After years trying failing, had secret waking early is\u00a0this: Become a\u00a0parent. After first couple months a\u00a0new-born well-pract quickly waking previously operating less sleep ever beautiful child become reliable alarm clock, waking crack dawn cute smiles increasing insistent demands up, play freedom begin sleeping working want, still believe great option. bashed PhD 3.5 years during usually woke late began around lunch time! - Glorious autonomy!\u00a0"},{"title":"Jupyter (iPython) notebooks +\u00a0Pandas","url":"Jupyter-ipython-notebooks-pandas.html","body":"working fit Excel file, sure won\u2019t edited, usually interact biggest sinks (for me) working these tools (ACL, SQL, Python) debugging, working exactly where chain individual commands something unexpected happened. Even modest page code, quickly find myself rerunning entire script multiple times commenting uncommenti multiple lines order understand what\u2019s really going on. consuming task start script, such summarise sort command, extra required even greater. leads interrupte flow Pandas python package manipulate large datasets, Jupyter notebook applicatio allows user run python script chunks, output results chunk before continuing re-run previous chunk without returning beginning, change go along. amazingly flexible and\u00a0intuit recently worked through exceptiona Pandas tutorial recorded PyCon 2015. \u201cPandas ground up\u201d well structured clear, scope resources available download github. Brandon Rhodes gives working foundation Pandas Jupyter notebook manipulate datasets using\u00a0Pyth"},{"title":"Coursera\u2019s \u201cData Science\u00a0Specialisation\u201d","url":"courseras-data-science-specialisation.html","body":"Last year decided learn tools required scientist. confident already had mathematic analysis skills needed, wasn\u2019t familiar tools the\u00a0trade. googling brought Coursera, Science Specialisa run Johns Hopkins University consists 9 courses, far completed five. courses order prior knowledge isn\u2019t required, think courses strike balance brevity and\u00a0depth. downside courses exclusivel (which popular academia) rather Python (which popular in\u00a0Industr course lasts weeks deals specific aspect science, such statistica inference machine learning. concepts tools subject explained developed, whilst thorough longer course be, enough material packed lectures, quizzes, assignment projects apply read second half specialisa lot technical first, I\u2019m looking forward setting aside time, working through assignment acquiring useful\u00a0ski"},{"title":"\u00dcbersicht widget: Time\u00a0Since","url":"ubersicht-widget-time-since.html","body":"\u00dcbersicht desktop widgets app OS X. free, open source, pretty widgets library download play with. widget small app feature embeds desktop displays simple informatio tell song currently playing, weather forecast, disk space remaining, etc. widgets written CoffeeScri variant of\u00a0JavaScr started \u00dcbersicht began playing widgets, changing appearance position screen. widgets too complicate mess without specific programmin knowledge, others surprising simple and\u00a0intuit trial error, began customize widgets preference widget wanted couldn\u2019t simply download timer tell exactly had elapsed since specific past\u00a0event combining display attributes widget calculatio method another, able mash together foundation widget. added extra Optional text before after elapsed\u00a0ti Choice expanded abbreviate display\u00a0st Flexible formatting remove zero\u00a0amoun widget called \u201cTime Since\u201d \u00dcbersicht widgets gallery."}]