[{"title":"About","url":"about.html","body":"site mixture notes, portfolio record hobbies interests. might morphing Zettelkast personal project somewhere experiment freelance web developmen blockchain questions, comments mistake, twitter email. Thanks for\u00a0readin \"0\"});"},{"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 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 Tune Method dataset. taken too long own labelled dataset needed 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. 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 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. 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":"books","url":"book-notes.html","body":"list articles notes on\u00a0books."},{"title":"","url":"experience.html","body":"2021: Freelance Senior Scientist - Wayfair 2021: Freelance Blockchain Developer - Bitladon Blockchain integratio cryptocurr broker. Deploying managing nodes networks including Ethereum, Binance Smart Chain, Polkadot, Cardano, Tron, others. Ansible Docker configurat Rosetta API workflows including generating batches addresses, notifying services deposits, 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 - \u201cJohn creative conscienti software engineer, 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 - Uber \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 - Blockport 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 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 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-search-snippets","url":"fuse-search-snippets.html","body":""},{"title":"fuse","url":"fuse.html","body":""},{"title":"landing-images","url":"landing-images.html","body":""},{"title":"title","url":"index.html","body":"page\u00a0conte Content page isn\u2019t seen Images landing page 1. landing.ht"},{"title":"Oura API","url":"oura.html","body":""},{"title":"Portfolio","url":"portfolio.html","body":"Content template. list links other\u00a0page"},{"title":"Snippets","url":"snippets.html","body":""},{"title":"Analytics","url":"analytics.html","body":""},{"title":"Move a file between git\u00a0branches","category":"snippet","url":"move-a-file-between-git-branches.html","date":"14 July 2021","tags":"git ","body":"Checkout branch where copied to,\u00a0then: git checkout commit hash pull files any\u00a0commit Multiple files directorie be\u00a0specifi Overwrites the\u00a0file"},{"title":"Start with Finance to transform IT","category":"snippet","url":"start-with-finance-to-transform-it.html","date":"14 July 2021","tags":"engineering, organisations, business, corporations ","body":"Zwischenzu blog post arguing achieve significan change organisati need\u00a0to: Get\u00a0fundin Persuade finance department give you\u00a0money. Understand they\u00a0value Understand cash\u00a0flows Understand why customers clients part their\u00a0mone Understand business constraint (legal, five whys approach \u201cConsider deeper structural cause cultural problems change management money flows through \u201cIf transform enterprise start finance. crack that, you\u2019ve chance succeed sec controls functions. why important start finance, you\u2019ll definitely fail\u00a0\u201c"},{"title":"The Worst Volume Control UI","category":"snippet","url":"the-worst-volume-control-ui.html","date":"14 July 2021","tags":"ui ","body":"Hilarious article UI Collecitve showing results competitio design worst possible volume control interface. \ud83d\ude02 \ud83d\ude02\u00a0\ud83d\ude02"},{"title":"Daughter","category":"snippet","url":"daughter.html","date":"12 July 2021","tags":"family ","body":"Yesterday daughter asked write page"},{"title":"Moral\u00a0tyranny","category":"snippet","url":"moral-tyranny.html","date":"12 July 2021","tags":"oppression, consent ","body":"tyrannies, tyranny sincerely exercised victims may oppressive better live under robber barons under omnipotent robber baron\u2019s cruelty may sometimes sleep, his cupidity may point satiated; those torment us our own torment us without end approval own conscience may likely go Heaven yet likelier Hell of\u00a0earth. very kindness stings intolerabl insult. \u201ccured\u201d against one\u2019s cured states may regard disease put level those yet reached age reason those never will; classed infants, imbeciles, - C. S.\u00a0Lewis"},{"title":"Upgrading Cryptographic\u00a0Libraries","category":"snippet","url":"upgrading-cryptographic-libraries.html","date":"10 July 2021","tags":"hashing, versioning ","body":"Blog post easier upgrade cryptograp Django encodes passwords database storage like\u00a0this: Interestin Giovanni Collazo emphasises design systems change, initially seems pretty close contradict YAGNI, answer lies the\u00a0contex"},{"title":"Startup Engineering\u00a0Lessons","category":"snippet","url":"startup-engineering-lessons.html","date":"10 July 2021","tags":"startup, engineering ","body":"Lessons startup engineer great blog post Todd Wolfson. great might write notes a\u00a0book. archive"},{"title":"Poisson\u2019s\u00a0Equation","category":"snippet","url":"poissons-equation.html","date":"6 July 2021","tags":"math ","body":"great article introducin showing relevance"},{"title":"Thomas\u00a0Aquinas","category":"snippet","url":"thomas-aquinas.html","date":"6 July 2021","tags":"theology, history ","body":"His works English and\u00a0Latin."},{"title":"Can an explanation of an historical event ever be completely\u00a0true?","category":"Non-technical/Journal","url":"historical-truths.html","date":"6 July 2021","tags":"history ","body":"historical events examples learn from, possible acquire true understand answer important understand learn example, identify patterns cause effect. possible person this, does require training, lots time, special skills? impossible for\u00a0everyo started thinking had understand why something historical happened, we\u2019ve probably done accept story Limitation account event necessaril simplifica - details recorded learned. ok details pertinent no choose details included, verify details sure lesson conclusion based historical events is\u00a0reliabl truthfulne historical story thought scale ranging completely false perfectly true. mechanisms push popular resilient narratives towards middle scale away version story approaches dishonest end contain increasing errors omit increasing pertinent facts. effect\u00a0of: Increasing likelihood frequency someone hearing story rebutting Making harder align assertions implicatio existing understand of\u00a0reality opposite end scale, story unlikely Adding truth requires adding complexity easier capture simple story story\u2019s detail depth increases resources required communicat it. narrative competing attention complex story requires resources broadcast listen simple story. Those resources story benefit some\u00a0way. creates incentives omit inconvenie truths Implicatio unfortunat no substitute hard coordinati disparate informatio truthiness conclusion generally proportion inconvenie effort spent forming\u00a0it predispose choose convenienc over inconvenie this\u00a0enabl History written \u201cwinning side\u201d, resources \u201closing\u00a0si Complex events simplified expedient passes, practical benefit holding view differs popular narrative decreases. reduces any incentive challenge popular\u00a0vi creates feedback loop makes increasing difficult younger generation discover informatio historical events challenge An\u00a0heurist evidence did collect myself, wasn\u2019t brought attention algorithm someone\u00a0el WW2 battle against bad, bad against bad, Why did Allies win WW2? influence government social freedoms America 100 years ago dissimilar China\u00a0toda Racial ethnic discrimina 100 years ago - appears universall accepted led question modern attitudes human nature and\u00a0morali"},{"title":"Load-testing my Web Analytics\u00a0Tool","category":"Technical/Web","url":"load-testing-web-analytics-tool.html","date":"2 July 2021","tags":"google-cloud-platform, cloud-functions, api ","body":"Table Contents Background Hacker News affect Bad\u00a0news Good\u00a0news API traffic the\u00a0tool Dashboard get-analyt cloud\u00a0func Dashboard Solution Idea 1: global\u00a0obj Idea 2: Store results themselves the\u00a0databa Idea 3: Forget DataStore, use\u00a0bucket Background posted previous article (about building analytics tool) onto Hacker News forum. quickly buried didn\u2019t any\u00a0attent surprise, received email Hacker News administra (Daniel) explaining quality post boosted front page random within next couple of\u00a0days. Sure enough, early hours next morning, post boosted. woke various notificati had started following twitter, never happens. After delegating kid\u2019s breakfast duties, logged GCP affect extra traffic had Hacker News\u00a0affec Traffic had increased 30x hastily built tool looking very sub-optima Two problems stood - aggregated analytics taking anywhere 20 - 30 seconds load (up around passable-i 5 under conditions running bill Bad\u00a0news reason both these problems shockingly inefficien lazy approach serving the\u00a0analyt analytics page loaded, cloud function fetch DataStore database, munch freshly derived blob JSON. Never mind almost exact computatio had occurred hundreds times\u00a0alre amount DataStore increases, does required serve analytics page. second chart below (dashboard get-analyt cloud function), looks execution increases rate O(log\u00a0n). Good\u00a0news news though function handling extra traffic smoothly. dashboard image below (click it) almost every request completed less 200ms, fine background process. active instances scaling down well within preset limits, as\u00a0expecte API traffic the\u00a0tool Dashboard get-analyt cloud\u00a0func Dashboard function The\u00a0Soluti began ponder importance didn\u2019t databases, DataStore might bad doing. Scrolling through documentat google boasting super quick writes, super quick reads. I\u2019d already seen API calls made Cloud DataStore API knew I\u2019d probably redesign part the\u00a0tool. Idea 1: global\u00a0obj attempted few easy wins, mostly idea instance function invoked multiple times powered-do global objects still available in\u00a0memory. put collected DataStore global object check existence subsequent function calls. save lot API calls likely remove largest bottleneck saving readers 10+ seconds watching whatever reason, didn\u2019t work. Even had, tool still vastly improved taking approach even faster reduce costs. I\u2019d tool running indefinite reducing daily costs absolute minimum is\u00a0importa Idea 2: Store results themselves the\u00a0databa obviously inefficien repeat calculatio multiple times. long-term solution require aggregatin periodical fetching serving these aggregated the\u00a0client tried putting JSON DataStore key, ran errors entity too large. Even split aggregated multiple component parts still too large, grow over time. guess DataStore isn\u2019t meant like\u00a0this. probably pursued idea bit further, didn\u2019t change structure JSON blob served client. did change I\u2019d rewrite client side JavaScript as\u00a0well. Client side faster back-end, writing JavaScript fiddly compared Python opinion. There\u2019s always multiple ways doing thing, several versions API, googling solution isn\u2019t simple for\u00a0Python Idea 3: Forget DataStore, use\u00a0bucket Final idea - store results JSON blob Storage bucket point client bucket instead Turns super fast efficient solution. now loads less half second, variable costs egress bucket, smaller comparable costs running computatio expense calculatin analytical results fixed decoupled page views Every few minutes Cloud Scheduler targets Pub/Sub\u00a0to topic triggers Cloud Function then: Queries DataStore collects the\u00a0data. Calculates Generates JSON blob containing the\u00a0result Pushes JSON storage bucket available a\u00a0client. aggregated results days current still needlessly recalculat - once midnight rolls around results clearly going keep on\u00a0changin Instead having JSON blob containing last 30 days, blob (or perhaps week). reduce amount extracted DataStore. reduce costs"},{"title":"Edward Hopper\u2019s\u00a0Paintings","category":"snippet","url":"edward-hopper-s-paintings.html","date":"30 June 2021","tags":"art, painting, photography ","body":"archive"},{"title":"Some experiences can be taught, but some must be\u00a0lived","category":"snippet","url":"some-experience-can-be-taught-some-needs-to-be-lived.html","date":"29 June 2021","tags":"meta, advice ","body":"\u201cI learnt failure -"},{"title":"Georges St-Pierre Training\u00a0Meta","category":"snippet","url":"georges-st-pierre-training-meta.html","date":"29 June 2021","tags":"sport, meta, training ","body":"Contains too conjecture start, becomes high levels competitio difference \u201cgood\u201d \u201cgreat\u201d partly determined pain willing to\u00a0experie great benefits training Anderson Silva ballet\u00a0dan Conor McGregor does Israel Adesanya Georges St-Pierre archive"},{"title":"Validating CloudFlare\u00a0analytics","category":"Technical/Web","url":"validating-cloudflare-analytics.html","date":"29 June 2021","body":"Table Contents mystery Possible Reasons Comparison CloudFlare Analytics CloudFlare Web Analytics own analytics tool mystery CloudFlare give two measures visited website, Analytics product Web Analytics product. very results page views visitors. third distinct results own analytics tool. Possible Reasons reasons seem explained anywhere obvious, caused ad blockers preventing JavaScript Web Analytics product. normal, (not Web) Analytics product might derive results server side events, catch everything including bots RSS clients, unaffected ad blockers. visitors read technical articles therefore audience probably very technical likely ad blocker. case test hypothesis write articles appeal non-techni audience less likely ad blocker. case expect two analytics methods agree closely. Comparison made screen shots 11pm June 29\\(^{th}\\ compared results CloudFlare Analytics, CloudFlare Web Analytics, own analytics tool. CloudFlare (normal) analytics say had 234 unique visitors. Web Analytics tool says had 11 visitors. own tool reports 12 unique visitors. Why these results different? Maybe measure might including bots another might trying report real browsers, difference seems too high that.1 I\u2019d expect real usage fall night countries traffic from, see. Perhaps difference caused 95% readers ad blocker. own analytics tool can\u2019t give results rolling 24 hour window, groups day. Therefore recorded values 11pm, close enough. simple method logging IP addresses page loaded counting unique IP addresses says had 12 unique users. closer CloudFlare analytics beta result, wouldn\u2019t expect bespoke tool blocked Ad Blocker. simple concluding own results agree CloudFlare analytics beta might enough. agree particular metric. logged 47 page views today own tool CloudFlare Analytics beta reports 11 page views2. Please twitter any ideas! CloudFlare Analytics CloudFlare Web Analytics own analytics tool { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi CloudFlare tell they\u2019ve blocked 199 attacks last month, explains difference \u21a9With average load 90ms - pretty snappy believed. \u21a9"},{"title":"Proverbs\u00a016","category":"Non-technical/Journal","url":"proverbs-16.html","date":"25 June 2021","tags":"books, bible, wisdom ","body":"9 verses seem loosely plans motivation various actions. wisdom purpose God\u2019s actions contrasted motivation human plans. proverb bit riddle. \\(^{1}\\)Th plans heart belong man, answer tongue Lord. part, why spoken answer generally God? even wise, fear God, plans still own speak fear God? \\(^{2}\\)Al ways man pure his own eyes, Lord weighs spirit. surprised foolish, stupid evil actions decisions upstanding good. Understand God says spirit (motivatio attitude) produced plan actions judged. God agree \u201cthe ends justifies means\u201d. \\(^{3}\\)Co Lord plans establishe proverb fridge magnets. \\(^{4}\\)Th Lord made everything purpose, even wicked trouble. mysteries around moral responsibi free predestina unique Testament. can\u2019t anything useful say order expand this. believe true, differentl now read proverb. trust God he knows he\u2019s doing he good. I\u2019ll add list God without taking anything else off list. arrogant1 heart abominatio Lord, assured he go unpunished God doesn\u2019t arrogance, seems very similar pride. troubling society seems lost any appreciati humility point where no longer talk virtues vices humility pride. Pride considered virtue conflated self-worth lack nuance required reliably discern wisdom folly. \\(^{6}\\)By steadfast love faithfulne iniquity atoned for, fear Lord turns away evil. refreshing pleasant read Steadfast love faithfulne hear talking these virtues - love reduced redefined something found changed quickly. Faithfulne isn\u2019t celebrated spoken very much. Maybe isn\u2019t dramatic betrayal. Faithfulne steadfast love predicated humility, another concept society seems silent about. second half proverb profound. tells turn away evil. easier say change ways actually change, consistent \u201cBeing good\u201d \u201cturning away evil\u201d nearly easy simple child thinks is, proverb tells it. last proverb previous chapter said fear lord instructio wisdom, humility comes honor. \\(^{8}\\)Be little righteousn great revenues injustice. case any doubt, here is. compromise yourself order money. \\(^{9}\\)Th heart man plans his way, Lord establishe his steps. own plans, plans successful substantia Lord plans \u201cfirm\u201d \u201cpermanent \\(^{10}\\)A oracle lips king, his mouth does sin judgement. means. oracle \u201ca priest acting medium through whom advice prophecy sought gods.\u201d Kings certainly sinned making judgements \\(^{11}\\)A just balance scales Lords, weights bag his work. God loves justice, instrument justice ultimately his, him. \\(^{12}\\)I abominatio kings evil, throne establishe righteousn kings verses 12 kings heard about. 12 true perhaps true. minimum, 12 13 provides standard judge kings. \\(^{16}\\)H better wisdom gold! understand chosen rather silver. bits advice come prioritise jobs training experience over jobs higher salaries immediatel Especially twenties starting career. lots disposable income, wisdom, training, experience perspectiv wise experience people. \\(^{17}\\)T highway upright turns aside evil, whoever guards his preserves his life. Guarding - concept expression heard before. guess mean \u201cdefend path life take\u201d, \u201cthink consequenc (second order \\(^{18}\\)P goes destructio haughty spirit fall. God doesn\u2019t pride, leads destructio coincidenc Haughty means \u201carrogantl superior disdainful mostly synonym prideful. \\(^{19}\\)I better lowly spirit poor divide spoil proud. Avoid prideful people, avoid evil people. Proverbs seems clear supposed socialise spend like. lowly spirit \u201clow status, humble\u201d. Better hang poor humble rich associate prideful people. gives thought matter discover good, blessed he trusts Lord. encouragem trust God, considerat 21 23 both say wise speak persuasive encouragin words well intended, effective persuasive \\(^{21}\\)T wise heart called discerning sweetness speech increases \\(^{23}\\)T heart wise makes his speech judicious3 adds persuasive his lips. words honeycomb, sweetness soul health body.Our words affect our bodies, our souls. Gracious words valuable. Gracious means kind, courteous, patient. go, gentle. \\(^{25}\\)T seems right man, end death. confident own wisdom judgement. just judgement bit less God\u2019s, proverb says totally opposite. Expect doing look opposite someone might expect. Expect unintuitiv things. \\(^{26}\\)A workers appetite works him, his mouth urges him on. True that. slow anger better mighty, he rules his spirit he takes city. Wow. high praise self control. { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi Arrogant: Having revealing exaggerate sense ones own importance abilities. \u21a9Establish firm permanent basis. \u21a9Judicious Having, showing done judgement sense. \u21a9"},{"title":"I would like to take some time to explore what it means to be\u00a0alive","category":"snippet","url":"i-would-like-to-take-some-time-to-explore-what-it-means-to-be-alive.html","date":"24 June 2021","tags":"life ","body":"."},{"title":"Proverbs\u00a015","category":"Non-technical/Journal","url":"proverbs-15.html","date":"24 June 2021","tags":"books, bible, wisdom ","body":"\\(^{1}\\)A soft answer turns away wrath, harsh word stirs anger. soft answer diffuse volatile situation, speaking harshly leads anger. \\(^{2}\\)Th tongue wise commends knowledge, mouths fools poor folly. Knowledge commended. someone speaks lot folly, fool. Folly \u201cfoolishne lack sense\u201d - it\u2019ll take discernmen judge lack sense. someone commends acquiring knowledge, learning. \\(^{3}\\)Th eyes Lord every place, keeping watch evil good. mistake God\u2019s patience indifferen works faithfulne seen. \\(^{4}\\)A gentle tongue tree life, perversene breaks spirit. Yet again, book teaches our words powerful great consequenc gentle tongue, soft answer, guarded words preserver life, fruit, fountain life, now tree life. unequivoca inverse. \\(^{5}\\)A fool despises his father\u2019s instructio whoever heeds reproof prudent. just had thought younger difficult heeding despising, too young considered wise foolish. children. proverbs refers parents children, reckon probably referring either adult children maybe teenagers. young kids predispose parenting advice context. \\(^{7}\\)Th lips wise spread knowledge, hearts fools. say important. \\(^{8}\\)Th sacrifice wicked abominatio Lord, prayers upright acceptable him. Integrity matters, seems God concerned motivation impact. Better pray quietly honestly hypocritic works public. \\(^{11}\\)S Abaddon lie open Lord, hearts children man! am guessing Sheol Abaddon reference hellish place - God perceive happens completely godless place far him, going trivial perceive thoughts motivation heart. He read us open book. \\(^{12}\\)A scoffer does reproved, he go wise. Reproof almost strong theme words. Reproof part growing becoming wise. reproved learn become wise. reprove children am negligent. avoid reproof accept fool. remember, these proverbs - generally true, time. situations where parent gives bad advice you\u2019d wise ignore it. exception, rule. everyone else problem, problem certainly you. \\(^{13}\\)A glad heart makes cheerful face, sorrow spirit crushed. proverb connection emotions, spirit physical body. says linked. happy look happy, vice versa. carry around stress tension going change look. sad indefinite crush you. Grieve, grow, move on. \\(^{14}\\)T heart him understand seeks knowledge, mouths fools feed folly. isn\u2019t talking consequenc words, says understand heart desire knowledge. feed folly, consuming foolish, fool. \\(^{15}\\)A days afflicted evil, cheerful heart continual feast. pessimist optimist experience event become respective pessimisti optimistic able, choose cheerful heart. afflicted, give hope. Affliction doesn\u2019t mean did something wrong lack wisdom. little fear Lord, great treasure trouble it. fear Lord leads avoidance trouble.. better live peaceably deal trouble. dinner herbs where love fattened ox hatred it. Better eat garnishes, bait, love fine dining not. \\(^{18}\\)A hot-temper man stirs strife he slow anger quiets contention lose temper. Blessed peace-make counsel plans fail, advisers succeed. You\u2019re supposed everything completely independen supposed ask help, weigh advice, deliberate look wise friends with. \\(^{23}\\)T apt1 answer joy man, word season, is! fun say something apt? blessing receive bit well-timed advice. Proverbs talks lot words mouths. history, books rare literacy widespread Therefore knowledge transfer occur speaking. Maybe still does today feels requires less effort reading. principles applied reading writing hearing speaking. \\(^{25}\\)T Lord tears down house proud maintains widow\u2019s boundaries boundaries edges land owned widow. God doesn\u2019t proud people, soft-heart towards vulnerable \\(^{27}\\)H greedy unjust gain troubles his own household, he hates bribes live. fool, bribed - directly indirectly Love life, look after family, hate bribes. Loving thing means hate things. you\u2019re building business, design Segregatio Duties. \\(^{28}\\)T heart righteous ponders answer mouth wicked pours evil things. good, Godly, answer say it. \\(^{33}\\)T fear Lord instructio wisdom, humility comes honor. Ok great - definition \u201cfear Lord\u201d means. (And reliable definition too.) still understand why means, least means. why question less foundation what. Learn humility, despise pride. Seek wisdom. { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi Apt: Appropriat suitable circumstan \u21a9"},{"title":"\u201cBelieve half of what you see and now\u2019t of what you\u00a0hear.\u201d","category":"snippet","url":"believe-half-.html","date":"24 June 2021","tags":"quote ","body":"source"},{"title":"Django for Startup\u00a0Founders","category":"snippet","url":"django-for-startup-founders.html","date":"23 June 2021","tags":"django, saas, startups, python ","body":"Better read article archive"},{"title":"Building my own web\u00a0analytics","category":"Technical/Web","url":"building-my-own-site-analytics.html","date":"22 June 2021","tags":"cloud-functions, data ","body":"built simple client-sid website analytics tool site, /analytics following metrics: Page views per day, Unique IP addresses per Views per page per day. article eventually made front page Hacker News, resulted lot extra traffic opportunit tool performed under heavier load. wrote affects subsequent design changes here. compare results CloudFlare Analytics, CloudFlare Web Analytics own tool follow-up article. Motivation Google Analytics Google Analytics felt overkill. data-point useful metrics obscured. site load quickly GA makes slower. CloudFlare Analytics tried CloudFlare Analytics. lot simpler GA better suits case, accurate. Design Considerat analytics easy access easy understand visualizin building dashboards metrics presented alter users perception underlying reality. someone thinks impact business, they\u2019ve produced, dynamics underlying system (a product\u2019s quality, site performanc growth, etc) influenced design decisions make, such metrics available, easy access, metrics above fold. present particular metric important, difficult someone uses dashboard resist implied message. They\u2019ll eventually consider metric Indicator kind. these reasons wanted important metrics website, wanted simple without distractio metrics interested are: reading site reading reading. I\u2019d able infer whether few read lot, lot read little. (Or, case, few read little.) Method Motivation reason making own analytics tool fun challenge obvious useful result. Building required connecting few technologi - Serverless Computing (Cloud Functions GCP), NoSQL databases (DataStore JavaScript HTTP headers. Assumption assuming unique IP addresses enough proxy unique readers, even though considerin crawlers, bots, RSS subscriber . Technique analytics \u201cengine\u201d works consuming request sent client page loaded. request parsed Cloud Function GCP extracts page URL IP address. recorded DataStore database along current date time. Viewing analytics simple (and complicate making request database, parsing visualizin convenient example, group days count distinct IP Addresses figure visiting day. achieved making request another Cloud Function returns response JSON payload. perfect solution, edge cases considerin expect mostly right enough purposes. didn\u2019t take effort fun mini project. hardest part figuring chart.js, slowest part iterating Cloud Functions. Mocking Cloud Functions haven\u2019t figured easily test cloud functions locally - require setting NoSQL database mocking Flask requests responses. Instead doing that, watched Peaky Blinders couple minutes whilst version Cloud Function deploying. Improvemen Eventually I\u2019ll group metrics week month expect. It\u2019ll learning playing cloud technologi JavaScript Unless someone decides spam site, expect costs less \u20ac1/month. site hosted CloudFlare suppose setup page rules prevent malicious traffic3 . Tasks later load faster - latency caused Cloud Function initialisi Short paying actual money always-on resources can\u2019t reduce this. However issue person view page last ~10 minutes - blog post explains whj. Add loading spinners - snippets Machine Vision demo. Group weeks months well day. Identify bots search engines - analytics requires JavaScript running types non-human activity already filtered. this? Aggregate (once per day) Cloud Function instead repeatedly browser. Understand why DataStore API called multiple times single fetch. Questions I\u2019d interested track RSS subscriber usual method inspect server logs, site hosted GitHub pages possible. extent does requiring JavaScript order log page view filter bots crawlers? chart.js library reasonably fast lightweigh preferred library Plotly responsive fast even >10 charts render. plotly.js improved recently point where wouldn\u2019t cause browser lag multiple plots rendered? Finally, occurs analytics widget desktop \u00dcbersicht. show page views current perhaps. made couple widgets [1, 2] written CoffeeScri newer widgets written React, guess opportunit learn4 . Writing \u201cTime Since\u201d (my daughters birth) \u201cTime Until\u201d (my next accounting exam5 ) widgets ever taste CSS, HTML JavaScript ever article blog \u201cTime Since\u201d widget. CoffeeScri Ubersicht just simple enough learn trial error, copying someone else\u2019s code changing bit bit until had want. Site AnalyticsI Google Analytics fun clicking around seeing lots options, useful once novelty worn off. \u21a9I might quite wrong, why. \u21a9The page now rate limited 5 requests per minute per IP address. \u21a9Done! desktop now looks this: \u21a9I failed exam I\u2019d working Ry\u2019s Git Tutorial instead. \u21a9"},{"title":"Alfie\u00a0Solomons","category":"snippet","url":"alfie-solomons.html","date":"22 June 2021","tags":"movie, youtube, peaky-blinders, humanity ","body":"series scenes showing character Alfie Solomons movie"},{"title":"Bifurcation\u00a0Theory","category":"snippet","url":"bifurcation-theory.html","date":"17 June 2021","tags":"math, chaos ","body":"Rabbits, fluid convection Mandelbrot lots others too. known video shows Feigenbaum Constant defined. fundamenta constant hadn\u2019t come across -\u00a04.6692.."},{"title":"Apple\u2019s iCloud+ \u201cVPN\u201d","category":"snippet","url":"apple-s-icloud-vpn-.html","date":"16 June 2021","tags":"apple, onion, vpn, icloud ","body":"article \u201cAn Apple onion router. routing uses two hops; Apple provides first, independen third parties (not yet specified) provide the\u00a0second \u201cIn move, Apple taken onion routing specialize tool hackers something daily\u00a0use."},{"title":"Rich","category":"snippet","url":"rich.html","date":"16 June 2021","tags":"python, console, shell ","body":"python -m rich a\u00a0demo Cool Python module handle terminal output debugging logging features. even record stack trace errors to\u00a0html. repo demo\u00a0video"},{"title":"Practice","category":"snippet","url":"practice.html","date":"16 June 2021","tags":"proverb ","body":"amateur practices until play correctly, profession practices until can\u2019t play"},{"title":"Vim\u00a0Sneak","category":"snippet","url":"vim-sneak.html","date":"15 June 2021","tags":"vim, plugin ","body":"Invoked s followed 2\u00a0chars. S F, f, T, enabled across\u00a0lin Jump back ; , go next/previ 5sxy searches next instance xy within 5\u00a0lines. 3dzqt delete third instance qt. repo"},{"title":"Design\u00a0Patterns","category":"Technical/Engineering","url":"design-patterns.html","date":"15 June 2021","tags":"abstractions, meta, software-engineering ","body":"Design patterns generalize abstractio solve common problems help engineers complex code reliably quickly. heard design patterns Aaron Maxwell his Powerful Python newsletter made notes YouTube algorithm put following video front page, down rabbit hole I\u00a0went. Take look Borg These Java SourceMaki fair repo (and fork) pdf resources, including GoF\u00a0book: GoF\u00a0patter c logica GoF\u00a0catalo securing GoF Wikipedia page GoF\u00a0book."},{"title":"Proverbs\u00a014","category":"Non-technical/Journal","url":"proverbs-14.html","date":"14 June 2021","tags":"books, bible, wisdom ","body":"\\(^{1}\\)Th wisest women builds her house, folly her own hands tears down. chapter begins proverb women! juxtaposin men either. important remember wisdom - desirable quality proverbs - personifie woman, chapter 9:1, Wisdom built her house, she hewn1 her seven pillars. walks uprightnes fears Lord, he devious his ways despises him. Fear contrasted despising, supposed fear violence victimisat feeling reverence profound respect. Lord loves me, previous chapter says parents discipline children. \\(^{4}\\)Wh no oxen, manger clean, abundant crops come strength ox. interestin point feels modern. rural imagery unusual (to me) otherwise feels something might Instagram. What\u2019s lesson? Progress messy, doing creates waste, fret cleanlines manger productive farm.. \\(^{5}\\)A faithful witness does lie, false witness breathes lies. important - lie. strong recurring message. \\(^{6}\\)A scoffer seeks wisdom vain, knowledge easy man understand does he understand scoffing harmful scoffer, else? \\(^{7}\\)Le presence fool, meet words knowledge. clearer understand difference understand knowledge. proverb very similar modern sayings \u201cYou become 5 spend with\u201d. marks fool? you\u2019re hanging foolish person? talk lot, without thinking words. quick become angry emotional. diligent, consistent hard working. plan ahead (filling barns summer). \\(^{8}\\)Th wisdom prudent discern his way, folly fools deceiving. wise, prudent, discern course action, series events decisions. Discern means \u201crecognise out\u201d, tend \u201clook closely additional clues might happen\u201d. \u201cPrudent\u201d means \u201cact demonstrat care thought future\u201d. \\(^{10}\\)T heart knows own bitterness no stranger shares joy. This, think, makes total sense old person seems mysterious young people. read thought said something \u201cno-one shares joy\u201d, doesn\u2019t. \u201cstranger\u201d Family close friends share joy, still won\u2019t able bitterness I\u2019d recommend holding onto bitterness finding possible forgive Jesus completed. \\(^{11}\\)T house wicked destroyed, tent upright flourish. Again, wicked, go badly you. upright living humble, fragile, vulnerable tent still flourish. \\(^{12}\\)T seems right man, end death.This book doesn\u2019t pull any punches. alarming assertion someone doing \u201cright\u201d fact heading towards death. rely own understand figure God thinks thing. \\(^{13}\\)E laughter heart may ache, end joy may grief.At moment experience grief, inevitably will. sorrow profound becomes physical well emotional, regret changes means alive. guess proverb reveals ok laugh whilst experienci heart ache, natural feel happy sad (laughing heart-achi time. part alive emotionall shouldn\u2019t considered weird broken. 14 15 reiterate themes noted previously \\(^{16}\\)O wise cautious turns away evil, fool reckless careless. wise something, even could. do/see/vis things, even could. ok risk erring side cautious, cautious, foolish. guess discerning perceive clearly originally partially known therefore risky becomes less risky fewer unknowns. Instead \u201cmaybe wrong\u201d become \u201cits almost definitely wrong, right\u201d \\(^{17}\\)A man quick temper acts foolishly, man evil devices hated. lose temper quickly. Losing slowly often difficult. \\(^{18}\\)T simple inherit folly, prudent crowned knowledge. You\u2019re supposed aspire prudence (and generally, wisdom). can\u2019t opt this, you\u2019re wise you\u2019re fool. you\u2019re prudent, (too) simple. bad happen fools. \\(^{19}\\)T evil bow down good, wicked gates righteous. surprising read such bold simple confidence justice prevail. No ifs maybes conditions just simple resolution end. \\(^{20}\\)T poor disliked even his neighbour, rich friends. Timeless pragmatism proverb observatio commendati look next proverb. despises his neighbour sinner, blessed he generous poor.. generous, just theoretica thoughts, actions money (see 23). despise people. neighbour? devise meet steadfast love faithfulne Steadfast love faithfulne \\(^{23}\\)I toil profit, mere talk leads poverty. enough talk loving neighbour. convinced any hard totally wasted, apparently not. \\(^{24}\\)T crown wise wealth, folly fools brings folly. Really? Does wealth here mean something financial wealth? (I asked previous proverb.) wise rich, certain. biblical heroes financiall impoverish just wide \\(^{25}\\)A truthful witness saves lives.. Literally. Though probably without knowing exactly lives, moment. Investors refer second order consequenc \\(^{26}\\)I fear Lord strong confidence his children refuge. best understand read said \u201cIn Lord strong confidence does proverb mean shortened simplified version doesn\u2019t? \\(^{27}\\)T fear Lord fountain life, may turn away snares death. Turning away physically repenting. fountain life source life, probably health healing. contrasted death traps. interestin consider relative importance feelings actions book. feelings lead actions, actions makes difference - judgement wisdom foolishnes love hatred, depends (only) actions? \\(^{28}\\)I multitude glory king, without prince ruined.If king doesn\u2019t any subjects, he king of? leaders followed any people, cannot claim leaders. slow anger great understand he hasty temper exalts folly.If quick temper responsibl it, endorsing foolishnes slow anger sign wisdom. \\(^{30}\\)A tranquil heart gives life flesh, envy makes bones rot. Envy apparently bad. Tranquilit freedom disturbanc calm. health. oppresses poor man insults his maker, he generous needy honors him. poor mater, dignity, worthy respect, made. { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi Hewn: chop cut const \u21a9"},{"title":"Coding exercise for a technical\u00a0interview","category":"Technical/Data","url":"coding-exercise.html","date":"14 June 2021","tags":"trading, finance ","body":"notebook technical exercise worked part interview crypto trading firm. exercises involve building simplified interfaces parse order book calculate various quantities technical interviews involve live coding exercises useful stressful. Live coding definitely triggers \u201cperforman anxiety\u201d (when kid hated presenting playing instrument front anyone, even teachers) - felt self-counc case needed VSCode instead familiar Vim+Tmux setup. Consequent progress slow bumpy. Tragically got muddled trying parse json after initial API\u00a0reques Whilst thinking problem code write, needed the\u00a0follow communicat my\u00a0thought optimize output interview context (it\u2019s real problem involving tests, edge cases, scalabilit VSCode (and mouse or\u00a0trackpa These additional considerat resulted writing code got job done.. slowly. code wasn\u2019t\u00a0gre curious faster I\u2019d (and easier exercise seem) treated exercise \u201ctake home\u201d exercise instead \u201clive coding\u201d. Here results - took couple hours, ideas flowed easily, remember methods accurately wish didn\u2019t (still) Despite this, live coding interviews great assessing - under skin show worst sides well best. going high paced demanding role interview Part Interface\u00b6 Build abstractio that, given pair argument (ethusd our case) fetches latest orderbook prints it.\u00b6 In\u00a0[1]: requests operator pprint pandas pd pp = In\u00a0[2]: def get_data(u r = = r.json() In\u00a0[3]: 2. Add functional takes side (bid ask) p arguments, returns total volume available order book p.\u00b6 In\u00a0[4]: def price): = # side either \"asks\" \"bids\" side = clean_data = [] i, j price_data = volume = volume)) # items where item less equal index = volume = operate = { 'bids': operator.g 'asks': operator.l } op = i, j price): index += volume += else: break volume In\u00a0[5]: 2470) Out[5]: In\u00a0[6]: 2480) Out[6]: 3. Now add (or modifies existing) functional takes percentage side arguments, returns volume available best side, +/- percentage In\u00a0[7]: def percent): = # side either \"asks\" \"bids\" side = clean_data = [] i, j price_data = volume = volume)) # items where item less equal index = volume = starting_p = # side == 'asks': percent *= -1 op = operator.a side == \"ask\" else operator.s limit_pric = * percent)) # operate = { 'bids': operator.g 'asks': operator.l } op = i, j limit_pric index += volume += else: break # volume In\u00a0[8]: 0.01) Out[8]: 4. visualize order book?\u00b6 In\u00a0[9]: asks = bids = In\u00a0[10]: asks = asks.colum = ['price', 'volume', 'timestamp asks['volu = = asks.head( Out[10]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } volume timestamp cumulative 2480.36000 0.591 1623670712 0.591 2480.48000 0.006 1623670590 0.597 2480.93000 0.007 1623670457 0.604 2480.96000 0.005 1623670684 0.609 4 2480.99000 0.172 1623670589 0.781 In\u00a0[11]: bids = bids.colum = ['price', 'volume', 'timestamp bids['volu = = bids.head( Out[11]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } volume timestamp cumulative 2480.35000 21.903 1623670721 21.903 2480.34000 7.930 1623670720 29.833 2480.25000 0.250 1623670709 30.083 2480.22000 8.061 1623670715 38.144 4 2480.21000 16.113 1623670720 54.257 In\u00a0[12]: ob = In\u00a0[13]: inplace=Tr inplace=Tr In\u00a0[14]: ax = xticks = xticklabel = [l.get_tex l Part 2: Time-serie Build abstractio takes A\u00a0pair unit (t) either \u201cseconds\u201d, \u201cminutes\u201d or\u00a0\u201chours\u201d units\u00a0(n) Given these arguments, fetch store order book pair every t. example: = \u201csecond\u201d = 3, fetch order book every second total 3\u00a0times. In\u00a0[15]: def tunit, n): base_url = pair_mod = results = {} timeunits = { \"s\": 1, \"m\": 60*1, \"ms\": 0.001, } realtime = range(n): snapshot {i+1} {n}\") r = = r.json() results[i] = # had modify multiplyin api likely set. print(\"don results In\u00a0[16]: results = \"s\", 3) getting snapshot getting snapshot getting snapshot done! hash api response sometimes same, expect no volume change these In\u00a0[17]: #results Now extend code compare order books you\u2019ve fetched other. Given name pair, n, p, determine total volume available p changed \u201cframe\u201d, last \u201cframe\u201d.\u00b6 In\u00a0[18]: # redefine \"calc_volu function above input param def ob_side, price): # side either \"asks\" \"bids\" side = data[ob_si clean_data = [] i, j price_data = volume = volume)) # items where item less equal index = volume = operate = { 'bids': operator.g 'asks': operator.l } op = i, j price): index += volume += else: break volume In\u00a0[19]: def ob_side, price): snap_vol = [] results: result = ob_side, price) total_chan = - snap_vol[0 = - snap_vol[i i, j < print(f\"vo snapshot: {snap_vol} print(f\"to (diff last first): In\u00a0[20]: results = \"s\", 3) getting snapshot getting snapshot getting snapshot done! In\u00a0[21]: #results In\u00a0[23]: \"bids\", 2470) vol snapshot: incrementa [-6, 0] total (diff last first): -6 Finally, efficient \u201cdiff\u201d two frames? example, determine volume changed most?\u00b6 Quick\u00a0idea side order book, group orders buckets certain width, e.g. lowest ask 2450, group asks 2450 2451, 2451 2452, etc. both sides order book you\u00a0collec multiple aggregated order books same\u00a0index compare volumes index across each\u00a0order force lowest ask max bid order book\u00a0snaps deal large\u00a0spre comparison where side volume marked suspicious investigat further iterate present negative volumes { 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":"Axiom","category":"snippet","url":"axiom.html","date":"12 June 2021","tags":"math ","body":"basic statement assumed true. E.g: \u201cA straight drawn any two\u00a0points"},{"title":"Foxes and\u00a0Hedgehogs","category":"snippet","url":"foxes-and-hedgehogs.html","date":"12 June 2021","tags":"meta, classification, thinking ","body":"wikipedia Hedgehogs big thing, Foxes many\u00a0thing classifica system mental writers and\u00a0thinke"},{"title":"Pair programming using\u00a0Vim","category":"snippet","url":"pair-programming-using-vim-tmux-ssh.html","date":"12 June 2021","tags":"pair-programming, vim, tmux, ssh ","body":"blog\u00a0post"},{"title":"Man swallowed by\u00a0whale","category":"snippet","url":"man-swallowed-by-whale.html","date":"12 June 2021","tags":"whale ","body":"lobster diver swallowed humpback whale. spit him out. Humpback whales teeth, reduced forward vision open mouths to\u00a0feed. article archive"},{"title":"Git LFS","category":"snippet","url":"git-lfs-2.html","date":"11 June 2021","tags":"git, lfs, github-pages ","body":"Key\u00a0comman git lfs install git lfs track \"**/*.mp4\" git lfs ls-files git lfs status track just updates .gitattrib file. Commit .gitattrib tracking configurat committing large\u00a0file status ls-files show large files question push commit starts tracking large\u00a0file"},{"title":"Your .bashrc doesn\u2019t have to be a\u00a0mess","category":"snippet","url":"your-bashrc-doesn-t-have-to-be-a-mess.html","date":"11 June 2021","tags":"bash, shell, zsh ","body":"Blog post demonstrat split .bashrc \u201csubmodule keep [[ -r ]] && . [[ -r $file ]] && . $file done unset"},{"title":"John Kelly finishing the 2017 Barkley\u00a0Marathons.","category":"snippet","url":"barkley-finisher-15-john-kelly.html","date":"10 June 2021","tags":"movie, running, barkley, youtube ","body":"exhausted moments after running almost 60 hours through movie"},{"title":"A Project of One\u2019s\u00a0Own","category":"snippet","url":"paul-graham-a-project-of-ones-own.html","date":"8 June 2021","tags":"paul-graham, meta, learning, school ","body":"essay called project ones own Paul\u00a0Graha pushed task vs being\u00a0pull skating vs\u00a0walking"},{"title":"Proverbs\u00a013","category":"Non-technical/Journal","url":"proverbs-13.html","date":"8 June 2021","tags":"books, bible, proverbs, wisdom ","body":"\\(^{1}\\)A wise son hears his father\u2019s instructio scoffer does listen rebuke. chapter opens previous chapter - proverb importance wisdom, knowledge instructio always, proverb starts example contrasts against it. \\(^{2}\\)Fr fruit his mouth man eats good, desire treacherou violence. Slightly weird imagery think, mouth produces fruit eat.. Weird. principle - fruit mouth words speak, words powerful either evil. Speaking well lead food does - nourish, strengthen sustain. Treacherou desire violence. violent likely betray? Maybe. \\(^{3}\\)He guards his mouth preserves his life, he opens wide his lips comes ruin. Choose words carefully. \\(^{5}\\)Th righteous hates falsehood, wicked brings shame disgrace. OK strongly opposed falsehoods - lies, manipulati duplicity. guards him whose blameless, sin overthrows wicked. guess (at least) ways looking - blameless Jesus\u2019 imputed righteousn saves literally death. alternativ am righteous am overcome sin. Alternativ prosaicall try blameless instead wicked, instead creating trouble yourself you\u2019ll bear longer nicer you. \\(^{7}\\) pretends rich, yet nothing. Another pretends poor, yet great wealth. (I prefer semicolons proverb! last 20 years seen several degrees financial wealth lack, reality often very I\u2019d expected. often intuit easier, nicer, fulfilling certain problem removed, certain something bought, recognised achieved. reality lot complicate that. Wealth isn\u2019t thought was, thought mostly financial. Now, freedom. Freedom peace, unburdened past present, freedom still hope future, freedom spare time, freedom crushed life dad husband friend. \\(^{8}\\)Th ransom man\u2019s life his wealth, poor man hears no threat. oh! Incisive! reminds \u201cno ever owns fortune, always seems own them\u201d. various troubles burdens avoid poor, choosing life instead material excess. Lose wealth choose rich life. \\(^{10}\\)B insolence1 comes nothing strife, those take advice wisdom. Disrespect rudeness never works, wisdom acquired habit asking advice. gained hastily dwindle, whoever gathers little little increase it. surprised read - didn\u2019t realise rate change ones wealth likely effect sustained, wouldn\u2019t guessed general principle exists across millennia, cultures geographie \\(^{12}\\)H deferred makes heart sick, desire fulfilled tree life. heard before. understand it, though. sure sick heart definitely is. seems told keep looking forward hoping Jesus complete his saving us bringing history completion lot \u201cnow yet\u201d tensions Jesus\u2019 resurrecti second coming (I little particular mention it). maybe Christian\u2019 heart expected little sick? Also, desire fulfilled tree life guess desiring wrong kind - desires chasing after wind. desire eat hungry again, desire graduate realise hasn\u2019t even begun, etc. image Tree life hasn\u2019t think, maybe means something specific unaware of. tree life garden Eden\u2026 13 - 16: ignore wisdom, idiot, prudent, sense. Strong recurring themes. \\(^{16}\\)E prudent man acts knowledge, fool flaunts his folly interestin though - prudence slightly sense to. proverb saying informed acting. fool rushes action, clear doing talking about. \\(^{22}\\) man lays inheritanc his children\u2019s children, sinner\u2019s wealth laid righteous. remember reading 18 thinking quite burden - leave inheritanc grandchild well children. Seventeen years later makes lot sense - inheritanc isn\u2019t primarily money, wisdom, peace, security. parent children directly effect parent own children, either bless curse grandchild damage children, suffer less able provide own children (emotional physically spirituall Our own childhoods large influence our adulthoods our ability parent, sure children childhoods trivial endeavour. 23 24 break pattern \u201cgood example, bad example.\u201d \\(^{23}\\) fallow2 ground poor yield food, swept away through injustice. missed opportunit real. Poor incapable productive fruitful work. injustice prevents fruitfulne proverb subtly provocativ insightful \\(^{24}\\) Whoever spares rod hates his son, he loves him diligent discipline him. Parents love children enjoy causing stress discomfort love wise discipline diligently consistent Apparently physical punishment timeless? \\(^{25}\\) righteous enough satisfy his appetite, belly wicked suffers want. last proverb chapter finishes encouragem better righteous wicked, leads satisfacti rather want. previous chapter finished encouragem specifical righteousn Even though book doesn\u2019t headings seems does structure, author requires actually read text closely order pull meaning. Shocking. Clearly optimised engagement SEO social media. { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi Insolence: rude disrespect behaviour\u201d \u21a9Fallow: ploughed harrowed left period without sown order restore fertility avoid surplus production \u21a9"},{"title":"Choose Boring\u00a0Technology","category":"Technical/Other","url":"choose-boring-technology.html","date":"7 June 2021","tags":"advice, management ","body":"surprised haven\u2019t posted \u201cchoose boring tech\u201d article Dan McKinley made big impression read it, years\u00a0ago. humorous slide show\u00a0versi takeaways, based memory reading couple years\u00a0ago: Boring tech mature enough well enough familiar shortcomin build innovation tokens project stack. Choosing exciting bit tech requires spending those\u00a0toke nice alternativ title \u201cHow old, young people\u201d, addition advice article, read somewhere else probabilit something continuing exist future, actively maintained supported, approximat amount already existed, supported maintained even sure makes sense, bears imaginary list \u201cthings read every couple years\u201d. Actually, few lists might useful. list python articles, list advice articles, etc. similar books page, just list book\u00a0artic"},{"title":"An incomplete list of skills senior engineers\u00a0need","category":"Technical/Other","url":"an-incomplete-list-of-skills-senior-engineers-need.html","date":"7 June 2021","tags":"advice, management ","body":"copied Camille Fournier\u2018s article medium. copied rather linked knows Medium change URL put content behind a\u00a0paywall. Highlights simply impulsive \u201cI next few months.\u201d After might change\u00a0the incomplete list skills senior engineers need, beyond\u00a0cod varying levels seniority, senior, staff, and\u00a0beyond run meeting, no, person talks meeting thing running\u00a0it write design doc, take feedback, drive resolution reasonable period of\u00a0time mentor early-care teammate, mid-career engineer, manager needs indulge senior manager wants talk technical stuff understand without rolling eyes making feel\u00a0stupi explain technical concept behind closed doors senior person too embarrasse openly admit understand influence another team solution instead writing their\u00a0own another engineer something asking help makes feel appreciate lead project even though manage any working project engineers listen ideas without making listen engineers\u2019 ideas without give baby, project built something great, something\u00a0 teach another engineer care thing care (operation correctnes testing, code quality, performanc communicat project status convince management invest non-trivia build software while delivering incrementa the\u00a0proces craft project proposal, socialize it, buy-in execute\u00a0it repeat yourself enough start listen pick your\u00a0battl help someone get\u00a0promot informatio what\u2019s happening (how gossip, to\u00a0network interestin own, instead waiting someone bring to\u00a0you tell someone they\u2019re wrong without making feel\u00a0asham take negative"},{"title":"Proverbs\u00a012","category":"Non-technical/Journal","url":"proverbs-12.html","date":"2 June 2021","tags":"bible, proverbs, wisdom ","body":"chapter starts \u201cWhoever loves discipline loves knowledge, he hates reproof stupid.\u201d ends \u201cIn path righteousn life, pathway no death.\u201d opening proverb jarring read, maybe unlike \u201cwickednes concepts hear day-to-day \u201cdisciplin \u201cknowledge very familiar part contempora conversati stupidity. proverb does mean? love discipline am loving knowledge, case confident opposite true - avoid dislike discipline avoid dislike knowledge. Discipline hard, guess lean discipline remember\u00a0w Encouragin proverb immediatel followed reminder \u201cA man obtains favour Lord, man evil devices he condemns\u201d, effort, things, obtain favour. That\u2019s big reason persevere \\(^4\\)\u201cAn excellent wife crown her husband, she brings shame rottenness his bones.\u201d I\u2019d leave off negative second parts these proverbs, abrasive. doubt they\u2019d Why pattern these proverbs \u201cgood thing, bad thing\u201d - contrast stronger? why thing why opposite? punchy? guess abrasive likely remember it, you\u2019re confident saying true be\u00a0remembe Back proverb, great proverb - it. honors wives, though does put context husbands, speaks valuable precious wife - crowns precious and\u00a0rare. Empiricall feels thruthy - marriages difficult either spouse considered \u201cexcellent unusual valuable. Relationsh give lot life health happiness, require lot effort work. excellent spouse certainly worth desiring celebratin next few verses contrast wickedness righteousn - wicked, be\u00a0upright \\(^9\\) \u201cBetter lowly servant play great man lack bread\u201d. put appearance substance? spend money fancy cars clothes wont enough decent food? Prioritize substance (truth?) over appearance social pressures? Having servant (or domestic helper) certainly helpful, tangible benefit receiving shout-outs \\(^{10}\\) \u201cWhoever righteous regard life his beast, mercy wicked cruel.\u201d - animal welfare is\u00a0importa \\(^{11}\\) Whoever works his land plenty bread, he follows worthless pursuits lacks sense. 11 12 both enjoying consequenc honest work, 11 advises against worthless pursuits, 12 says wicked covet profits of\u00a0evildoe Verses 13 - 19 speaking listening. proverb contrasts evil wisdom 13 - own dishonest words become trap for\u00a0you. 14 - words works come back - invest dividends be\u00a0returne 17, 18 - these contrast other. words powerful, speaking truth honest (even isn\u2019t simple, makes situation complicate rash (acting without careful considerat consequenc violent wielding sword. Wise words bring \\(^{15}\\) Fools right, contrastin pattern presumably listen (or ask for) advice. seems similar Dunning-Kr Effect Wise everything to, ask advice, listen to\u00a0it. \\(^{16}\\) had look Vexation - means \u201cthe state annoyed, frustrated worried\u201d. Wise stay calm ignore insults. fired someone insults you\u2019re probably (generally speaking) being\u00a0fool \\(^{19}\\) Truthful lips endure forever, lying tongue moment. Truth endures, lies do\u00a0not. Verses 20 - 29 two themes - benefits consistent hard work, benefits truthful. usual, proverb comparison right wrong wisdom \\(^{21}\\) No ill befalls righteous, wicked filled trouble. encouragin read, highlights proverbs highlight truthful patterns, specific guarantees - Obviously righteous trouble, proverb isn\u2019t saying life perfectly pleasant. usual, push towards doing benefits, pull away doing wrong the\u00a0damage \\(^{22}\\) .. those act faithfully his delight. wonderful read (a good) God delight in\u00a0people. \\(^{23}\\) prudent man conceals knowledge, heart fool proclaims knowledge. surprising read concealing knowledge desirable trait. guess certain questions answered answers questions understood young children wouldn\u2019t answer particular questions were\u00a0adult \\(^{24}\\) hand diligent rule, while slothful put forced labor. ironic, those diligent able willing labor end management leadership positions, those avoid laborious end doing\u00a0it. \\(^{25}\\) Anxiety man\u2019s heart weighs him down, word makes him glad. encouragin (again) read weighed down anxiety normal, anxiety isn\u2019t described weakness foolishnes (I conjecture too isn\u2019t written, there\u2019s long list fools consequenc foolishnes anxiety isn\u2019t list.) proverb emphasises encourages impact good\u00a0words \\(^{28}\\) path righteousn life, pathway no death. wonderful life avoid death. such pleasing end a\u00a0chapter. { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi"},{"title":"Proverbs\u00a011","category":"Non-technical/Journal","url":"proverbs-chapter-11.html","date":"1 June 2021","tags":"books, bible, proverbs, wisdom ","body":"Table Contents Context Notes Examples Conclusion Context These notes reading Proverbs, books bible. Almost entire book collection proverbs - short sayings generally true. presume structure themes arrangemen taking notes help these become clearer hopefully help remember apply them\u00a0bette book split chapters, quite short sections book. probably take minute two read one. chapters further split verses. Proverbs verse seems one\u00a0senten Numbering text useful lets refer precisely part book. Proverbs does few headings, too far apart provide enough structure own, I\u00a0think. read book couple times before, appreciate even feel missing wisdom it. book quite easy read - sentences short analogies seem simple\u00a0eno refreshing read something existed thousands year, withstood criticisms feels approachab practical, despite old written completely cultural context. Notes proverb contrasts justice injustice variety phrases images. Pride humility, integrity crookednes righteousn context these qualities, various situations described: false balance, disgrace, proverbs somewhat exaggerate seems reasonable given self contained single sentences tasked defining resolving problem. imagery clear, does rely on\u00a0subtlet biggest themes honesty, integrity, righteousn valued, opposites avoided costs. these qualities fact actions, sentiments consequenc these actions reliable consistent inevitable advice \u201clove neighbor yourself\u201d summary the\u00a0prover clarity confidence encouragin happen, evil consequenc inevitably bad for\u00a0you. Examples fruit righteous tree life, whoever captures souls wise - part sounds wonderful. wouldn\u2019t produce life? second part surprising desire righteous ends good, expectatio wicked wrath. - is\u00a0encoura gives freely, yet grows richer; another withholds he give, suffers want. - gold ring pig\u2019s snout beautiful woman without discretion - doesn\u2019t seem fit any proverbs around it. mention woman section? Why important enough included? Does imply beauty discreet? surely big cultural gap Amsterdam 2021 where ever first\u00a0writ man kind benefits himself, cruel man hurts himself. - to\u00a0know Conclusion lie, cheat, steal plot. Treat yourself be\u00a0treated effort increase justice, go well for\u00a0you. God delights blameless people, he abhors Beauty without discretion"},{"title":"Performance Optimizations for the shell\u00a0prompt","category":"snippet","url":"performance-targets.html","date":"28 May 2021","tags":"shell ","body":"Something happen within 100ms users input order maintain feeling something happens within 50ms trigger event, feel Also, checkout hyperfine Lots useful tips original blog post."},{"title":"Vim spellcheck\u00a0commands","category":"snippet","url":"vim-spell.html","date":"27 May 2021","tags":"vim ","body":"[s ]s \u2192 go next/previ bad\u00a0word z= \u2192 list of\u00a0suggest zg \u2192 add word word\u00a0list zug \u2192 remove word word\u00a0list zw \u2192 add word bad word\u00a0list zuw \u2192 remove word bad word\u00a0list"},{"title":"Questions for good\u00a0references","category":"Non-technical/Entrepreneurship","url":"questions-for-good-references.html","date":"27 May 2021","tags":"marketing ","body":"following questions problem had solution did frustratio feel tried solve the\u00a0proble solution worked compared Take us moment realized our solution actually working solve the\u00a0proble does life look now problem being\u00a0solv Customize text necessary, products services, complete solutions component made template. Source: Building story\u00a0bran"},{"title":"Lessons from 45 years in the software\u00a0industry","category":"Technical/Other","url":"45-years-in-software.html","date":"27 May 2021","tags":"advice ","body":"article recently retired software engineer lessons learned over 4\u00a0decades. Beware curse of\u00a0knowled Focus fundamenta Teamwork, Trust, Testing, Communicat Code\u00a0Desig Simplicity Seek to\u00a0underst Beware lock-in - cost change, honest acknowledg fit the\u00a0role"},{"title":"Modeling Credit\u00a0Risk","category":"Technical/Data","url":"credit-data.html","date":"25 May 2021","tags":"finance ","body":"Exploratio Exercise\u00b6 whichever methods libraries prefer, notebook the\u00a0follow preparatio Identify three significan features drive credit\u00a0ris Modeling credit\u00a0ris validation evaluation methods correct the\u00a0proble solution instructio instance, choice python notebook, notebook install required dependenci run\u00a0it. preparatio \u00b6 In\u00a0[1]: # display output per cell = \"all\" In\u00a0[2]: %%capture sys -m pip install --upgrade pip -m pip install pandas numpy sklearn matplotlib seaborn statsmodel In\u00a0[3]: pandas pd = None # show columns pandas dataframe In\u00a0[4]: = data.head( Out[4]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } duration credit_his purpose credit_amo savings_st employment other_part age housing job num_depend own_teleph foreign_wo class <0 6 critical/o existing credit radio/tv 1169 no known savings >=7 4 male single none 4 real estate 67 none own skilled yes yes 0<=X<200 48 existing paid radio/tv 5951 <100 1<=X<4 female div/dep/ma none real estate 22 none own skilled none yes bad no checking 12 critical/o existing credit education 2096 <100 4<=X<7 male single none real estate 49 none own unskilled resident none yes <0 42 existing paid 7882 <100 4<=X<7 male single guarantor 4 life insurance 45 none free skilled none yes 4 <0 24 delayed previously car 4870 <100 1<=X<4 male single none 4 no known property 53 none free skilled none yes bad Exploratio In\u00a0[5]: ### overview dataset data.shape data.colum data.nuniq # unique values per column print(f'cl \"good\" rows') print(f'cl \"bad\" rows') Out[5]: (1000, 21) Out[5]: 'duration' 'purpose', 'employmen 'age', 'housing', 'job', 'class'], Out[5]: 4 duration 33 credit_his 5 purpose credit_amo 921 savings_st 5 employment 5 4 4 other_part 4 4 age 53 housing 4 job 4 num_depend own_teleph foreign_wo class dtype: int64 class: 700 \"good\" rows class: 300 \"bad\" rows order visually inspect necessary convert datatype categorica features string category. necessary train model. Therefore formatted Outcome approximat equal outcome classes. dataset split 30% \u201cbad\u201d 70% \u201cgood\u201d. low bad credit risk assessment may limit models ability accurately predict bad credit assessment relative assessment limited training examples. result False Positives typically be\u00a0expecte formating\u00b6 In\u00a0[6]: # remove whitespace around column names data.colum = [col.strip col data.colum In\u00a0[7]: # Categorica variables limited usually fixed possible values. # Categorica might order (e.g. \u2018strongly agree', \u2018agree\u2019, 'disagree' 'strongly disagree') = [ 'purpose', 'housing', 'job', 'class' ] col data[col] = = [ [\"no checking\", \"<0\", \"0<=X<200\" \">=200\"], True), known savings', '<100', '100<=X<50 '500<=X<10 '>=1000'], True ), ('employme ['unemploy '<1', '1<=X<4', '4<=X<7', '>=7'], True), ] col In\u00a0[8]: # convert categories numnerical values, SelectKBes cat_column = = x: x.cat.code In\u00a0[9]: # columns now either categorica encoded int (ordered unordered) numerical. data.dtype Out[9]: int8 duration int64 credit_his int8 purpose int8 credit_amo int64 savings_st int8 employment int8 int64 int8 other_part int8 int64 int8 age int64 int8 housing int8 int64 job int8 num_depend int64 own_teleph int8 foreign_wo int8 class int8 dtype: object In\u00a0[10]: # take while.. seaborn sns # default pairplot pairplot = sns.pairpl data, hue=\"class diag_kind = 'kde', plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor 'k'}, height = ) fig = pairplot.f dpi=200) # default dpi 100 Visual inspection plot above compares feature features. plots along diagonal show density plot feature, grouped \u201cclass\u201d feature will\u00a0predi Inspecting pairplot shows features approximat distributi class\u00a0valu continuous features, Credit Amount heavily left skewed. Age left\u00a0skewe may improve log transform credit_amo age, particular predicting credit class credit_amo age values middle done as\u00a0follows = In\u00a0[11]: # Split features outcome. X = # columns except \"class\" column y = # \"class\" columns Check emerges three variables highly correlated emerge even isolated pairs variables not\u00a0coline Variance Inflation Factor (VIF) measure colinearit among predictor variables. calculated dividing variance betas variane single\u00a0bet In\u00a0[12]: In\u00a0[13]: vif = pd.DataFra vif[\"VIF Factor\"] = i) = X.columns vif = Factor'], vif.round( Out[13]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } VIF Factor features 18 2.11 own_teleph 2.12 11 2.50 5 2.53 savings_st 16 3.56 job 8 3.59 4.41 purpose 4 5.09 credit_amo 14 5.29 housing 13 5.59 5.85 credit_his 6 5.85 employment 7.70 duration 15 7.89 8.71 7 9.77 17 11.59 num_depend 12 13.19 age 9 17.03 other_part 19 23.45 foreign_wo results show significan amount the\u00a0datase identify features drive credit risk decision most, reduce colinearit random noise Once subset features contribute predictive check colinearit within that\u00a0subse Identify three significan features drive credit risk\u00b6Featu selection important removes redundant predictors model. improves performanc reduces computatio resource requiremen Various statistica tests significan features, placed two braod categories - supervised (using domain knowledge considerin relationsh feature target variable) unsupervis (which ignores feature\u2019s relevance ANOVA F-value method appropriat numerical inputs categorica outputs. Chi^2 test appropriat categorica inputs Feature significan evaluated both\u00a0metho In\u00a0[14]: X = # columns except \"class\" column y = # \"class\" columns In\u00a0[15]: SelectKBes chi2, f_classif In\u00a0[16]: %%capture = y) cols = new_data = In\u00a0[17]: Out[17]: ('duration ('purpose' ('employme ('age', ('housing' ('job', In\u00a0[18]: %%capture = y) cols = new_data = In\u00a0[19]: Out[19]: ('duration ('purpose' ('employme ('age', ('housing' ('job', three significan features\u00a0a Duration (ANOVA: 48, Chi2:\u00a0321) Checking Status (ANOVA: 40, Chi2:\u00a036) Credit Amount (ANOVA: 24, Chi2:\u00a05826 significan feature Duration, followed Checking Status Credit Amount. makes sense intuitivel Duration Credit Amount proportion risk. Checking Status unfamiliar means, real scenario speak stakeholde team members learn this\u00a0featu In\u00a0[20]: = 'duration' X = In\u00a0[21]: vif = pd.DataFra vif[\"VIF Factor\"] = i) = X.columns vif = Factor'], vif.round( Out[21]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } VIF Factor features 1.69 3.84 credit_amo 4.46 duration arbitrary common VIF threshold 5, none significan features colinear. Hoever duration close score 4.46 credit_amo second 3.84. Intuitivel seems reasonable credit_amo duration might colinearit generally expected inversely correlated other. - borrow short period Optimize features use\u00b6After initial demonstrat metrics assess performanc optimal features In\u00a0[22]: # later = x:x[1], reverse=Tr Modeling Credit Risk\u00b6We logistic regression binary classifica problem multiple predictor variables Logistic Regression reasonable choice use, longer project multiple types compare performanc against another, select classifier performs best. types include k-nearest neighbors, decision trees, Support Vector Logistic regression makes No among independen variables. tested Variance Inflation Factor (VIF). No Independen errors (residuals no significan residuals correlated other. tested Durbin-Wat test, scope this\u00a0exerc sample size large (at least 50 observatio per independen variables recommende -> 20 $\\times$ 50 =\u00a01000 Splitting training, validation testing sets\u00b6A validation addition training testing. expect optimize parameters comparing performanc models dataset weren\u2019t trained on. dataset final performanc metric based Instead, performanc optimizati quantified validation set, optimal models performanc quantified testing\u00a0se gives better prediction actual performanc against production (outside available dataset) training testing data\u00a0sets. In\u00a0[23]: In\u00a0[24]: # 70% training, 15% validation 15% testing reasonable # twice, split testing set, split remainder validation training X_train, X_test, y_train, y_test = y, X_train, X_validati y_train, y_validati = y_train, assert len(X_trai == len(y_trai == len(X_test == len(y_test examples: examples: examples: Training examples: 700 Validation examples: 150 Testing examples: 150 In\u00a0[25]: collection Counter y_train_st = ratio = negative values positive values \") print(f\"re ratio approximat training 222 negative values 478 positive values result ratio approximat 32:68 training over twice positive values negative values. similar complete 700 \u201cgood\u201d credit class examples 300 \u201cbad\u201d credit Training logistic regression model\u00b6The trained simple case, evaluate performanc (discussed below) test set. After initial discussion results, performanc models evaluated validation data\u00a0set. In\u00a0[26]: logreg = y_pred = evaluation evaluated ways, strengths weaknesses depending Where possible, preferable single metric quantify compare performanc simpler (and less error prone) multiple metrics to\u00a0conside 4 basic categories results could\u00a0prod True Positives (TP) False Positives (FP) True Negatives (TN) False Negatives (FN) These combined calculate model\u2019s Precision and\u00a0Recall Optimizing Precision minimizes false positives ignores Optimizing Recall minimizes false negatives ignores P = True Positives / (True Positives + False Positives) -> False Positives 0, P=1 R = True Positives / (True Positives + False Negatives) -> False Negatives 0, R=1 Precision ratio true positives divided sum true positives false positives. describes predicting positive class. ability classifier label positive sample is\u00a0negativ High precision implies fewer Precision = True Positives / (True Positives + False Positives) Recall calculated ratio true positives divided sum true positives false negatives. quanitifie ability High recall implies fewer Recall = True Positives / (True Positives + False Negatives) ideal precision recall. F-Score provides combine precision recall single measure captures F-Measure = (2 * Precision * Recall) / (Precision + Recall) influence precision recall relative changed adding coefficien F-measure. Further discussion outside scope brief exercise except say F1 (above) beta=1 places equal weight precision recall. F2 (beta=2) places less weight precision recall, F0.5 emphasizes precision over\u00a0recal metrics consider include Precision Recall curves Receiver Operating Characteri curve (ROC). ROC curves informativ evaluating datasets equal proportion positive negative results. skewed dataset such this, ROC overly optimistic curves more\u00a0relia Therefore after briefly demonstrat confusion matrix consider average precision recall instead comparing area under ROC curve Summary results significan features\u00b6 In\u00a0[27]: sklearn metrics y_pred),3) y_pred),3) print(f\"F1 y_pred),3) Precision: 0.789 Recall: 0.91 F1: 0.845 Confusion Matrix\u00b6The confusion matrix simply shows True Positives, True Negatives, False Positives False Negatives These results based testing set. trained In\u00a0[28]: numpy np plt seaborn sns %matplotli inline In\u00a0[29]: # name classes fig, ax = plt.subplo tick_marks = class_name class_name cnf_matrix = y_pred) annot=True cmap=\"YlGn ,fmt='g') matrix', y=1.1); label'); label'); both precision recall useful cases where imbalance observatio two classes. large class (\u201cgood\u201d) examples means less interested skill predicting correctly, e.g. high true positives, instead concerned predict true negatives (where credit class \u201cbad\u201d). confusion matrix above shows largest error group False Positives, expected relatively few examples negative examples compared positive. why precision lower the\u00a0recall no-skill classifier cannot discrimina classes predict random constant class cases. creates minimum precision called \u201cno-skill\u201d line. ratio positive cases dataset. our training 0.687. (Note 0.7, due random selection training\u00a0s Precision Recall metric useful measure success prediction classes very imbalanced case. curve focuses performanc classifier curve shows tradeoff precision recall probabilit thresholds refer investigat detail threshold probabilit \u201cgood\u201d \u201cbad\u201d label applied. default threshold 0.5, means calculates probabilit observatio \u201cgood\u201d 0.5 applies label \u201cgood\u201d, otherwise applies label \u201cbad\u201d. threshold probabilit varied impact high area under curve represents both high recall high precision. High scores both show classifier returning accurate results (high precision) well returning majority positive results (high\u00a0reca system high recall low precision returns positive results, predicted labels incorrect compared system high precision low recall opposite, returning very few positive results correct. ideal system high precision high recall identify almost positive cases, results AP summarizes curve weighted mean precisions achieved threshold, increase recall previous threshold the\u00a0weight In\u00a0[30]: disp = X_test, y_test) no_skill = / len(y_test # proportion results \"good\" 1], [no_skill, no_skill], label='No Skill'); Summary\u00b6Us signficant features F1: 0.845 AUC:\u00a00.87 improved finding optimal features to\u00a0conside Improving optimizing features\u00b6T code below iterates through available features significan least, adding additional factor each\u00a0loop. loop generates logistic regression trains training set. performanc evalulated validation set. results summarized \u201cresults\u201d dataframe Due very small amount data, changing random_sta produce results trends. Therefore recommenda improve data. In\u00a0[31]: %%capture X = # start features max_featur = = results = [] while <= max_featur print(i) X = # columns except \"class\" column # select features cols = [j[0] j # sorted descending # remake training sets correct features X_train, X_test, y_train, y_test = y, # random state specified, ensuring groups test X_train, X_validati y_train, y_validati = y_train, logreg = y_train); y_pred = # validation (not test) compare models disp = X_validati y_validati fscore = (2 * disp.preci * disp.recal / + disp.recal lr_f1 = y_pred) i, 'f1': lr_f1, 'AUC': += results = inplace=Tr In\u00a0[32]: results Out[32]: .dataframe tbody tr { middle; } .dataframe tbody tr th { top; } .dataframe thead th { text-align right; } f1 AUC 0.852590 0.740326 0.850202 0.810601 0.859438 0.855195 4 0.832653 0.826140 5 0.825911 0.873120 6 0.825911 0.874651 7 0.811475 0.876348 8 0.832653 0.878845 9 0.826446 0.889659 0.825000 0.881342 Optimizati Results\u00b6Th results show highest F1 score (which places equal emphasis Precision Recall) 0.859 obtained logistic regression uses three significan features (Credit Amount, Checking Status and\u00a0Durati Due small sets (700 examples training set, 150 validation testing sets) results vary significan random seed generate 3\u00a0datasets Whilst table above shows AUC increases features, increase small (0.9% 5 features) sensitive random seeds - seed used, trend observed. Therefore, whilst curves useful tool imbalanced datasets, small size dataset analysis creates variation wouldnt observed performanc Test Set\u00b6We test performanc chosen optimizati stage. stage testing dataset, provides reliable indication might perform (new) production compared results In\u00a0[33]: cols = ['duration X_train, X_test, y_train, y_test = y, # random state specified, ensuring groups test X_train, X_validati y_train, y_validati = y_train, logreg = y_train) y_pred = # validation (not test) compare models disp = X_test, y_test) #fscore = (2 * disp.preci * disp.recal / + disp.recal #fscore y_pred) Out[33]: Out[33]: Obtain training\u00a0d reduce influence randomness model\u00a0scor credit score instead just \u201cgood\u201d \u201cgood\u201d \u201cbad\u201d status probably result threshold applied metric. Accessing underlying metric provide detail help train Consider require domain expertise { 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":"Grep only inside particular\u00a0files","category":"snippet","url":"grep-particular-files-only.html","date":"18 May 2021","tags":"grep, linux ","body":"grep -inr --include package.js \\ 'shortcut\" {' . -A --include flag does -i \u2192 -n \u2192 print line\u00a0numbe -r \u2192 recursive starting\u00a0p . \u2192 start -A \u2192 print lines below found\u00a0line"},{"title":"View a List of Keyboard Mappings in\u00a0Vim","category":"snippet","url":"vim-debug-mapping.html","date":"18 May 2021","tags":"vim ","body":":map \u2192 show list current keyboard mappings normal, visual, select operator pending\u00a0mo :map! \u2192 show list current keyboard mappings insert Top put mappings convenient text\u00a0file: :redir! > vim_maps.t :map :map! :redir END source another\u00a0so"},{"title":"Note Taking and Knowledge\u00a0Systems","category":"snippet","url":"note-taking-and-knowledge-systems.html","date":"18 May 2021","tags":"zettelkasten, notes, knowledge-system ","body":"blog post arrives conclusion take paper notes organise summarise content once notebook is\u00a0full. Keep simple, trust simple \u2192 robust \u2192 reliable Also, links"},{"title":"Building A Story\u00a0Brand","category":"Non-technical/Learning","url":"building-a-story-brand.html","date":"17 May 2021","tags":"reading, marketing, communication, book ","body":"Table Contents Premise Stories Hero Problem Guide Recap Plan Call To\u00a0Action at\u00a0stake? Avoid\u00a0Fail End with\u00a0Succe brand participat Implementa Websites Corporatio Premise survive thrive. character movie own life problems. Life busy hard complicate waste energy figuring help\u00a0them. marketing shows product obvious benefit customer. does product improve someones ability \u201csurvive and\u00a0thrive Cut through noisy challengin world having super quick easy understand message. clever, clear. customer spend calories trying figure benefit your\u00a0produ Stories intuitive leverage psychologi features. organise informatio intuitive great combat noise gain attention. compelled pay attention until \u201cstory gaps\u201d closed. caveman look website answer offer? improve my\u00a0life? next steps? Story\u00a0Gaps gap character want. success, overcome Cadence momentum defined creation fulfillmen story\u00a0gaps fail define something customer wants, fail open story\u00a0gap. makes story uninterest isn\u2019t question requires an\u00a0answer. Story gaps resolve. singing Twinkle Twinkle Little Star stopping \u201care\u201d last line. hear last note melody tune feel\u00a0compl Pare down customers desire single focus. brand known single specific desire helping get\u00a0it. clutter story diluting hero\u2019s desire desires. eventually Apple Apple released Lisa computer 1983, Jobs bought 9 page ad York times listing computers features. Jobs returned Apple after fired, (and after partly founding Pixar, tells stories) Apple became customer centric company, marketing customers. 9 pages became words - \u201cThink Different\u201d message customers, customers survive and\u00a0thrive Apple isn\u2019t hero \u201cThink Different\u201d brand, customer is. Nike - athletes heros, become (hero) athlete Nike\u2019s help. Apple plays role Q James Bond, giving hero to\u00a0win. Stories Hero \u2192 Problem \u2192 meets Guide \u2192 gives Plan \u2192 calls Action \u2192 ends Success \u2192 helps avoid Failure. Hero customer, you. guide. customer character life battling internal external adversity order survive thrive. Heroes weaknesses guide usually story starts character wants overcome external challenges pose internal task story gap implicitly asks \u201cWill hero they\u00a0need? define character\u2019 ambition beginning, audience knows what\u2019s stake kind story is. messaging implicitly tells benefit why Problem Customers motivated solve internal problems than\u00a0exter identify customer\u2019s problem show understand them. great hook relate talk problems our customers experienci interest our brand. Every story needs villain, personifie problem. germs personifie envy personifie etc. diminished social status personifie someone status villain relatable - readers recognize villain be\u00a0disdain root source - frustratio villain makes us feel. High taxes cause, therefore the\u00a0villai singular - just villain, keep simple cut through the\u00a0noise. real - fear monger. Fight real problem behalf three types problem External - barrier stability removed - business isn\u2019t growing fast enough, profits too\u00a0small. Internal - self-doubt takes to\u00a0succeed Philosophi - deserve successful hard rewarded. Failure be\u00a0unjust. villain initiates external problem causes hero encounter internal problem wrong unjust. purpose external problem manifest internal problem. Customers recognise relate both types of\u00a0problem Put product context survival want. Otherwise isn\u2019t story gap. Translate external problem several Resources - Conserving accumulati money or\u00a0time Social - Gaining status social\u00a0net Generosity - Darwinian we\u2019ve led believe, empathetic and\u00a0caring Purpose - Give customers opportunit generous participat something greater themselves - \u201cthe chief desire man pleasure, but\u00a0meanin reason customers buy external problem product solve causing internal frustratio identify articulate frustratio clearly, confidentl repeatedly offer solve along original external problem bond customer. You\u2019ll positioned yourself deeply internal narrative substantia differenti your\u00a0brand Philosophi problems important involved something larger themselves adds depth meaning. Representi (and solving) philosophi problem gives customers expressing themselves wouldn\u2019t resolve three problems transactio customers experience wave relief pleasure, love your\u00a0brand Anakin Skywalker blows Deathstar aiming perfect shot, he defeats external problem (the enemy army), his internal problem (self doubt) philosophi CTA action taken close final story gap Checklist: single villain brand external problem internal problem probably found considerin external problem makes customer\u00a0f unjust wrong suffering caused that\u00a0villa Our hero challenged - able solve problem? engage brand. Guide Customers aren\u2019t looking another hero, hero life. character movie life revolves around. They\u2019re looking guide need\u00a0help. persons life made acts - \u201cdoorways no return\u201d. life unique commonalit journeys Story chapters book-ended events. These events always instigated external actors events beyond their\u00a0cont Heroes guide trustworth earns respect. didn\u2019t guide wouldn\u2019t narrative, problem. Everyone looking guide help solve wake morning hero. troubled internal, external philosophi issues. can\u2019t solve our issues our own. insight consequenc raises questions, means our story isn\u2019t us others. aspire someone else\u2019s guide, hero. shows why search meaning innate, resolved becoming servant or\u00a0guide. Stop losing sleep over success company start losing sleep over success stories, heroes strongest characters self-doubt often ill-equipp often reluctant, thrown story external events. \u201cchosen by\u00a0destiny contrast, guide already \u201cbeen done that.\u201d already conquered hero\u2019s internal philosophi challenges own\u00a0backst guide authority authority instinctiv recognises accepts. guide authority hero character still the\u00a0hero. Those realize epic story life end winning end. paradoxica Those hero win usually end remembered a\u00a0villain. a\u00a0guide Empathy Authority precise one-two\u00a0pu 1. Empathy \u2192 Understand \u2192\u00a0Trust empathise customers show understand them, understand seen, heard understood essence of\u00a0empathy phrases marketing copy could\u00a0be: understand feels \u2026 no-one experience \u2026 you, frustrated by\u00a0\u2026 Expressing empathy isn\u2019t difficult. Once you\u2019ve identified customers internal problem, understand help a\u00a0resoluti Brains conserve calories, energy, effort, time, customer realises lot common brand, fill any gaps trust. customer \u201cbatch\u201d thoughts, means thinking chunks rather details. Commonalit whether music taste values, powerful 2.\u00a0Authori No likes know-it-al no wants preached at\u2026 establish competence looking guide, hero trusts someone demonstrab competence guide serious experience helping heroes win day, doesn\u2019t be\u00a0perfect four ways add authority (competenc marketing without Testimonia Logos Statistics Awards Meeting brand meeting a\u00a0person, help live better life? associate identity your\u00a0brand respect this\u00a0brand trust this\u00a0brand Recap started narrative identifyin something hero\u00a0wants created intrigue tension defining hero\u2019s problem. audience wants help overcome the\u00a0proble introduced ourselves guide establishe authority, empathy and\u00a0trust. next? Making purchase always involves small risk wasting money. risky element makes purchase somewhat similar starting relationsh potential downside, customer might end feeling foolish regret Imagine customer trying cross river purchase. hear sound waterfall downstream try cross making purchase chance something bad happen. Put stones river safely walk across, step by\u00a0step. stones the\u00a0plan. Plan movie, guide gives hero plan. plan tightens focus movie creates \u201cpath hope\u201d hero might, possibly, lead resolution hero\u2019s problems. creates story gap implicitly creates questions audience be\u00a0answere plan removes risk explains do. guide customers, experience little bit confusion confusion excuse not\u00a0purcha Even though setup purchase after-purc steps obvious us, obvious customers. Give plan feel confident Heroes trust guide plan. looking philosophy embody, series steps take solve Customers where take them. Unless take somewhere go, why listen? marketing goal every potential customer knows where take them. Define desire customer, marketing story powerful\u00a0h two kinds plan. Both earning trust offering customer clear path to\u00a0stabili Agreement\u00a0 Process\u00a0Pl Process\u00a0Pl minimal (3 - 6) steps required buy benefit product after purchase, mixture both.\u00a0E.g. Allow us Let\u2019s execute plan\u00a0toget process plan removes confusion customers journey. plan \u201coh that\u2019s difficult, that\u201d they\u00a0purch post-purch process plan alleviate confusion customer the\u00a0produc Agreement\u00a0 Agreement plans alleviatin fears. list agreements customer designed alleviate fears doing business with\u00a0you. agreement plan highlight shared values. Give agreement plan name increase perceived product. \u201cthe plan\u201d, \u201cyour best nights sleep ever\u201d,\u00a0etc Agreement plans background landing page, though could\u00a0be. agreement plan creating list customer fearful doing business (haggling price, interactin pushy salesman, buying defective product) promise nullify that\u00a0fear. Call To\u00a0Action far, we\u2019ve defined desire, identified challenges empathized them, establishe our competency given plan. Heroes take action challenged external force. take action themselves challenged just humans\u00a0are external force guides our customers to\u00a0success Heroes challenged external forces. Calls action clear, repeated over over. Above fold, center page. navbar. repeatedly scroll down the\u00a0page. Customers bombarded adverts every day. ignoring filtering noise time. shy subtle. very clear. very simple. confidence product, confident calls to\u00a0action. Direct\u00a0Cal Buy\u00a0Now Schedule an\u00a0Appoint Order\u00a0Now Call\u00a0Today Register\u00a0T Repeat (singular, simple) call action again again down the\u00a0page. Download our free PDF guide growing your\u00a0busin Free informatio - advice, guides, Giving something away for\u00a0free Testimonia Samples Free-trial transition CTA does three things: Changes customers perception - establishe expertise and\u00a0author Creates reciprocit offer something ask their\u00a0mone Positions guide next\u00a0steps both types CTA (direct transition messaging. customers understand (simply without burning calories) order solve at\u00a0stake? Stories live die single question; \u201cWhat stake?\u201d nothing gained lost nobody cares. nothing stake story no story, just no benefit buying product, why buy\u00a0it? show customer cost buying product. Avoid\u00a0Fail story remains interestin long hero teetering edge success failure. hero story ever motivation - escape pain experience something good. Life too, our desire avoid pain motivates us a\u00a0change. needs meaningful consequent stakes story, otherwise isn\u2019t interestin scene needs move hero either closer further tragic brand needs answer \u201cwhat buy\u201d question otherwise customer can\u2019t answer \u201cso what?\u201d question - stakes clearly, simply, concisely communicat Probably stake, not\u00a0stakes humorously lightly. big negative scary thing - failure salt add flavor, marketing ingredient Compare fear peace stability achieved. show pain \u201cbefore\u201d contrast peace stability \u201cafter\u201d you\u2019ve opened closed story\u00a0loop Blog titles, email subjects, headlines, contain elements potential failure convey sense urgency. Bring negative stakes a\u00a0bit. fear losing $100 desire gaining $100 - loss pain motivating reward and\u00a0peace. Recipe reader vulnerable threat. \u201cX% Y get\u00a0W\u201d reader since vulnerable take action reduce vulnerabil \u201cMake sure doesnt happen Give customer clear, concise simple plan reduce vulnerabil \u201cWe offer thing you\u00a0need\u201d Challenge take next step right now. CTA. \u201cCall us today arrange Agitate bit fear, reader peace prosperity within 2\u00a0paragrap helping customers avoid? little salt add flavor. too little, customers won\u2019t why product important. too strong it\u2019ll End with\u00a0Succe Humans looking resolution external, internal philosophi problems. achieve though status, transcende (among things). product service help achieve central part brand\u00a0prom change lives taken reality. Tell lives going improve - peace, status, confidence vision happy ending. Compare these two statements \u201cWe\u2019re going put man moon\u201d \u201cWe highly competitiv successful space\u00a0prog table show customer\u2019s lives change. give lots copy brand After brand have? feeling? What\u2019s average status? Talk end vision clearly. images happy, successful powerful enjoying benefits product. Say benefits loudly, confidentl clearly, Talk end-vision lives once they\u2019ve benefited your\u00a0servi Show customer vision great life business with\u00a0you. Ultimately end story list resolution customers problems. feel questions resolved? Stories usually end three\u00a0ways hero gains status power Offer access - free\u00a0coffe Offer premium - skip the\u00a0line. scarcity - write \u201climited\u201d on\u00a0it. Identity associatio - wear Rolex associated Rolex stands\u00a0for hero becomes whole unified someone hero needed something couldn\u2019t themselves external provision saved\u00a0them Reduced anxiety, more\u00a0secur Reduces effort, time, reaches hero internal realisatio (coming age) gives confidence overcome circumstan internal shortcomin become \u201cwhole\u201d wise. achieve inner peace reached potential. Inspiratio - chariots fire - run really\u00a0fas Acceptance - fashion brands doing positive body\u00a0image Transcende - greater purpose meaning - brand participat hero needs someone else step life, tell special better. someone guide, that\u2019s\u00a0you Offering aspiration identity our customers adds lot our products services. Realise customers transform looking guide. Everybody wants change either someone better someone helping become wiser, fitter, equipped, accepted or\u00a0peacefu does customer to\u00a0become? kind person to\u00a0be? friends talk about\u00a0them guide position heart, just marketing tactic. Lose sleep over customers problems instead business. Commit solving internal, external philosophi problems, give vision aspire\u00a0to. Customers needs told very clearly customers changed far journey taken them. Usually, hero deeply flawed right until final elements story used\u00a0evenl Implementa Websites Above fold, one-liner. sentence saying what\u2019s customer. problem solve, aspiration identity offer. give customers words tell others your\u00a0busin Big obvious calls action, multiple places. be\u00a0timid. Customers read Z\u00a0shape. read websites, scan them. Repeat important understood quick readers. very few words. fewer words use, likely be\u00a0read. Perhaps sentences entire landing\u00a0pa Increase amount text towards bottom. top needs short, fast, positive and\u00a0obviou \u201cread more\u201d button expand longer text, customers option they\u00a0want. Place transition call action next call action. \u201cDownload guide\u201d next \u201cbuy now\u201d. Put transition CTA less bright\u00a0col Repeatedly ask buy, twice above fold subsequent sections. tell won\u2019t do\u00a0it. Include images success - enjoying benefits - resolved problems, aspiration achieved, closed story loops. sense health, well-being flow landing page follow StoryBrand framework, albeit not\u00a0exactl Corporatio applicable you\u2019re manager give team narrative fit themselves guess they\u2019re going purpose, confidence and\u00a0meanin one-liner. Say lives better engaging\u00a0w lead generator qualified email addresses. guide, free 30 minute consultati voucher,\u00a0e automated email campaign - weekly email, nurturing advice CTA. All\u00a0automa Collect tell stories Almost stories transforma hero. Tell story understand are\u00a0offeri system generates referrals. word mouth powerful, One-liner one-liner statement. sentence, supposed super short. equivalent logline movie. Keep editing until version that\u00a0works Memorizie it, put website, include every piece marketing collateral you\u00a0create tell anybody understand you\u00a0do. Helps realize your\u00a0servi Provoke imaginatio and\u00a0intrig include: character (\u201cA busy mom\u201d, \u201cA\u00a0retiree problem - miss opportunit talk customers challenges Define problem vitally important, opens story gap customers close\u00a0it. plan - hint it. can\u2019t explain a\u00a0one-line Success - paint image life after custom bought your\u00a0servi Example answers question \u201cWhat you\u00a0do?\u201d: \u201cWe provide busy moms short, meaningful workout stay healthy renewed energy\u201d vs \u201cI run a\u00a0gym\u201d. \u201cWe help retired couples escape cold avoid hassle second mortgage while still enjoying warm beautiful weather Florida during winter\u201d vs \u201cI got involved real estate few years ago had second kid moved Florida and\u00a0then\u2026. lead\u00a0gener guide to\u00a0downloa free webinar online\u00a0cou Software demo free\u00a0trial Free\u00a0sampl Live\u00a0event No reinvent wheel, others\u00a0doi give away quite lot easy consume email PDF - consume quickly probably happy pay chance learn thorough Downloadab guides etc pages in\u00a0length. generous, explain \u201cwhy\u201d give away \u201chow\u201d as\u00a0possibl automated email\u00a0camp Even customers click links email, keep seeing brand become familiar it. services go-to brand mind. relationsh associatio already\u00a0bu Nurturing emails Call-To-Ac emails - 3:1 - put real passive CTA emails - buy, tell them, repeatedly it\u00a0easy. Talk a\u00a0problem Describe product offer solves the\u00a0proble Describe life look once customer bought product solved their\u00a0prob Call customer action leads directly a\u00a0sale. Similar nurturing email, direct action email describes problem solution, direct email solution product sell strong call action. lot content taken Collect tell stories great testimonia gives customers gift going second, lowering riskiness of\u00a0purchas showcase you\u00a0create the\u00a0result the\u00a0experi transforma has\u00a0occurr Few important story hero experience external internal philosophi everyone desires transforme in\u00a0someway love businesses help transform some\u00a0way. Questions testimonia 1. problem having discovered our product? 2. did frustratio feel experience problem? 3. product? 4. Take us moment realized our product actually working solve problem? 5. Tell us life looks now problem solved being\u00a0solv system Identify existing Give reason talk - video PDF customer send friends help introduce brand explain you\u00a0delive Offer reward - discount, access, extra samples,\u00a0e"},{"title":"Training \u2192 Knowledge \u2192 Confidence \u2192\u00a0Victory","category":"snippet","url":"trainging-knowledge-confidence-victory.html","date":"14 May 2021","tags":"quote, caesar, wisdom ","body":"\u201cWithout training, lacked knowledge. Without knowledge, lacked confidence Without confidence - Julius\u00a0Cae"},{"title":"Forward\u00a0Email","category":"snippet","url":"email-forwarding.html","date":"14 May 2021","tags":"email ","body":"ImprovMX, great lot free, now domain for\u00a0free. ForwardEma times cheaper ImprovMX, domains forwarding email. particular private, send recieve domain, for\u00a0free."},{"title":"Nested Auto Commands for Overriding\u00a0Colorschemes","category":"snippet","url":"modifying-vim-colorschemes-correctly.html","date":"13 May 2021","tags":"vim ","body":"snippet detailing nested auto commands apply custom modificati colorschem loaded. Perhaps stop :e-ing so\u00a0frequen"},{"title":"Vim\u00a0Snippets","category":"snippet","url":"vim-snippets.html","date":"13 May 2021","tags":"vim, netrw ","body":"useful collection gists gist netrw."},{"title":"See where Vim is setting an\u00a0option","category":"snippet","url":"where-was-a-setting-set-.html","date":"12 May 2021","tags":"vim ","body":"where option vim :verbose textwidth?"},{"title":"My Life\u00a0Expectancy","category":"Non-technical/Journal","url":"my-life-expectancy.html","date":"12 May 2021","tags":"regression, statistics, life-expectancy, death ","body":"points: Weight doesn\u2019t matter. \u201cexcellent health. Workout 4 times week. Drink liquor (or red wine) 4 times week (after workout). Try happy, optimistic relaxed. working hard anyway? something do, someone love, something hope for. Longevity Calculatio playing life expectancy calculator surprised regression technique gives 50% chance living 95! I\u2019d expected result closer 80. After printing 90 year calendar, next thought play calculator maximum age 50% chance reaching. Doing factors below apparently give me: 75% chance living 92 50% change living 101 25% chance living 107 workout every no additional benefit working 4 times week. Once you\u2019re fit working 4 times week doesn\u2019t matter exercise. \u201cexcellent health better \u201cvery good\u201d health though, workouts count. guess didn\u2019t difference wouldn\u2019t excellent place. Drink alcohol surprised having 3-4 drinks week increases life expectancy thought best drink any alcohol all. drinking red wine liquor 4 times week. Liquor increases longevity men, reduces longevity women. Red wine increases longevity women, no effect men2. guess drink rum after workout. Weight doesn\u2019t According regression expected longevity unchanged within weight range 78kg - 90kg. guess important \u201cexcellent health, working 4 times week having wine, rum, whiskey after workout. just statistics calculator asks quantifiab physical attributes doesn\u2019t consider emotional, relational spiritual factors.Th detailed calculator calibrated Canadian citizens. \u21a9Alcohol consumptio later life reaching longevity: Netherland Cohort Study \u21a9"},{"title":"Globbing","category":"snippet","url":"globbing.html","date":"10 May 2021","tags":"linux ","body":"???? \u2192 4\u00a0chars * \u2192 any of\u00a0chars [:upper:] \u21d4 [A-Z] [:lower:] [:digit:] [:alpha:] \u21d4 [a-zA-Z] [:alnum:] \u21d4 [a-zA-Z0-9 ls -l [a-d] \u2192 part a\u00a0range ^ $ works in\u00a0regex la a*.{doc,do \u2192 ls a*.(doc|do \u2192"},{"title":"More VIM\u00a0Notes","category":"Technical/Developer Tools","url":"more-vim-notes.html","date":"10 May 2021","tags":"tips, vim ","body":"Table Contents Quickfix\u00a0l quickfix list positions more\u00a0files quckfix list global. local quickfix list quickfix window. window show list. list changelist local its\u00a0buffer Registers contains content last\u00a0yank 1-9 contains content you\u2019ve deleted or\u00a0changed _ blackhole register - send something here wont change any - contains any deleted changed content smaller 1\u00a0row. % contains name current\u00a0fi insert mode, =. any output inserted the\u00a0buffer Substituti :&& \u2192 repeat last substituti command its\u00a0flags :~ \u2192 repeat lat substituti replacemen last search\u00a0pat Command\u00a0li q: - opens command window. yanking viewing : - open command history\u00a0li :UltiSnips - opens ultiSnips current buffers filetype. snippets are\u00a0define Delete stuff without leaving insert\u00a0mod - as\u00a0backspa - delete previous\u00a0w - delete everything cursor (on same\u00a0row) - (un)indent a\u00a0row - delete next\u00a0word Text\u00a0objec gf - edit path under cursor (useful for\u00a0netrw? gx - open path under cursor (useful for\u00a0netrw? [m, ]m - move start end a\u00a0method @: - repeat last\u00a0comma >> indent line. . repeat operation, >>.. indent 3\u00a0times. along count, indention lines (with current top line). 3>>.. indent lines blocks the\u00a0right. - line, moves cursor go off the\u00a0screen - down line, moves cursor go off\u00a0screen - down page, cursor top of\u00a0screen - page, cursor bottom of\u00a0screen Sources Valuable Dev lot great\u00a0tips Vim Python great notes linting code completion plugins either copied less doing\u00a0alre"},{"title":"Vimscript\u00a0functions","category":"snippet","url":"create-custom-functions-in-vim.html","date":"5 May 2021","tags":"vim ","body":"custom command function in\u00a0vim. command! -nargs=1 Ms call function! s:NewFile( echom a:fp execute \"e \" . \"~/foo/bar . a:fp . \".ext\" endfunctio Useful\u00a0hel :h %:h \u2192 :h expand() \u2192 expand wildcards, including question"},{"title":"Better Text\u00a0Objects","category":"snippet","url":"vim-text-objects.html","date":"5 May 2021","tags":"vim ","body":"target types of\u00a0object consistent you\u2019re inside thing jump forward or\u00a0backwar look nth\u00a0occurr select white space Github Article a\u00a0plugin"},{"title":"Delete stuff in Vim without leaving insert\u00a0mode:","category":"snippet","url":"delete-from-vim-insert-mode.html","date":"5 May 2021","tags":"vim ","body":" - as\u00a0backspa - delete previous\u00a0w - delete everything cursor (on same\u00a0row) - (un)indent a\u00a0row - delete next word (create mapping in\u00a0vimrc)"},{"title":"Global\u00a0Aliases","category":"snippet","url":"global-aliases.html","date":"5 May 2021","tags":"alias, linux ","body":"alias bunch arguments command, alias -g foo=\"some complicate options\" grep complicate options becomes: grep foo"},{"title":"Vim register for yanked\u00a0text","category":"snippet","url":"vim-yanked-text-buffer.html","date":"5 May 2021","tags":"vim, linux, text ","body":"annoying delete something overwrite yanked\u00a0tex numbered registers! \"0 \"9 \"0 contains recent yank. \"1 contains recent deleted\u00a0te \"0p - paste recent yank, even deleted something after yanking\u00a0it"},{"title":"ChezMoi\u00a0shortcuts","category":"snippet","url":"chezmoi-shortcuts.html","date":"5 May 2021","tags":"dotfiles, alias ","body":"Chezmoi great tool managing dotfiles. shortcut update source state based local\u00a0chan chezmoi status | cut -c 4- | xargs -I % -p sh -c 'chezmoi add ~/%' Github"},{"title":"Sleep","category":"snippet","url":"sleep-is-good.html","date":"4 May 2021","tags":"sleep, lifestyle ","body":"\u201cIt enhances memory makes creative. makes look attractive keeps slim lowers food cravings. protects cancer dementia. wards off colds flu. lowers risk heart attacks stroke, mention diabetes. You\u2019ll even feel happier, less depressed, less\u00a0anxio Why Sleep Dr. Matt\u00a0Walke"},{"title":"Bash Strict\u00a0Mode","category":"snippet","url":"bash-strict-mode.html","date":"4 May 2021","tags":"bash, linux ","body":"write robust bash\u00a0scrip Bash Strict\u00a0Mod"},{"title":"How to write an About\u00a0Page","category":"snippet","url":"how-to-write-an-about-page.html","date":"4 May 2021","tags":"writing ","body":"often recommende blog post Kaleigh Moore writing about\u00a0page"},{"title":"Domain Name\u00a0Registrars","category":"snippet","url":"domain-name-registrars.html","date":"3 May 2021","tags":"web ","body":""},{"title":"The Honest Troubleshooting Code of\u00a0Conduct","category":"snippet","url":"honest-troubleshooting-code-of-conduct.html","date":"3 May 2021","body":"blog\u00a0post"},{"title":"Linux Filesystem Hierarchy\u00a0Standard","category":"snippet","url":"linux-etsy-dir.html","date":"2 May 2021","tags":"linux, filesystem ","body":"/etc (etsy) \u2192 \u201cetcetera\u201d \u201ceditable text config\u201d \u2192 place put config\u00a0fil Originally root directory had /boot booting, /dev devices\u2026 dir thing. put config places. etc/ Filesystem fhs-2.3"},{"title":"Browser\u00a0Security","category":"snippet","url":"browser-security.html","date":"30 April 2021","tags":"xss, cors, http ","body":"Blog post CSRF CORS HTTP"},{"title":"HTML\u00a0Templates","category":"snippet","url":"html-templates.html","date":"30 April 2021","tags":"html, jam ","body":"cruip.com"},{"title":"Linus\u00a0Torvalds","category":"snippet","url":"interview-with-linus-torvalds.html","date":"29 April 2021","tags":"linux, interview, linus ","body":"Interview: claim programmin art, mostly just \u2018good engineerin big believer Thomas Edison\u2019s \u2018one percent inspiratio ninety-nin percent perspirati mantra. almost little details occasional \u2018inspirati part, \u2018good taste\u2019 thing just solving problem - solving cleanly nicely yes,"},{"title":"Remote Procedure\u00a0Calls","category":"snippet","url":"rpc.html","date":"29 April 2021","tags":"rpc, linux ","body":"RPC executable causes procedure (subroutin execute another computer, coded (local) subroutine explicitly code details remote interactio write code whether subroutine local or\u00a0remote."},{"title":"","category":"snippet","url":"useful-blog.html","date":"29 April 2021","tags":"linux, shell, fzf, workflow, zsh, bash, builtin ","body":"Just found useful blog Interestin discussion difference builtins Nice examples fzf improve workflows."},{"title":"lsblk","category":"snippet","url":"lsblk-command.html","date":"28 April 2021","tags":"unix, cli ","body":"lsblk command info"},{"title":"Ranger File\u00a0Manager","category":"snippet","url":"ranger-file-manager.html","date":"28 April 2021","tags":"ranger, unix, vim, tools ","body":"console based manager vi key\u00a0bindin Install brew install ranger Launch ranger"},{"title":"Vim\u00a0Regex","category":"snippet","url":"vim-regex.html","date":"28 April 2021","tags":"vim, regex ","body":"great article regular expression in\u00a0Vim:"},{"title":"Where and when will the current Bitcoin market\u00a0peak?","category":"Technical/Cryptocurrencies","url":"when-bitcoin-top.html","date":"27 April 2021","tags":"bitcoin, finance, markets ","body":"TLDR: mid-Septem $300,000 Checklist Top Cap \u2248 Market Cap chart MVRV > 4 chart S2F deflection > 3, noisy chart 0.875 \u00d7 Delta Cap \u2248 Realised Cap chart. HODL waves - 45% moved last 6 months chart 12 Month RSI > 90 chart 3-month coin days destroyed - check glassnodes recent email STH LTH chart Summary S2F suggests peak around beginning 2021Q4, region $300,000. rainbow chart seems broadly agree S2F. age-adjust 3-month coin days destroyed goes above 550,000 ready sell. Willy Woos \u201cdouble top\u201d chart suggests peak around $400,000. RationalRo comparison bull runs suggests market top around 14 September maximum around $2,000,000 [sic]. RationalRo comparison 12 months RSI suggests market top reached shortly after 12 month RSI exceeds 90. seems less reliable above points Jurrien Timmer suggests peak around $100,000 shoots unexpected quickly. expect market top significan higher. $100k massive psychologi level. does increase level approximat July optimal sell therefore exactly $100,000. Market top expected around September 2021 earliest. behaviour market change participan change. hasn\u2019t bull run significan institutio investors before. Sell cost averaging strategy. Awareness Buy everyone selling, sell everyone buying. brave fear, no fear very messy. everyone super confident prices definitely going go up, something bad happen. lack uncertaint big warning bell. 14 September, $300,000. Threshold Values MVRV MVRV > \u2192 Local top MVRV > 4 \u2192 Macro top MVRV historical best on-chain predictors market tops bottoms. ratio Market Realised calculated dividing Bitcoin\u2019s market cap realised cap. chart Top Cap Top Cap 35 x Average Cap Market top Top Cap equal Market Cap. Delta Cap Delta cap Average Cap subtracted Realised Cap. Delta Cap almost Realised Cap, market top. Delta cap touches Average Cap, market bottom. Market Top Delta cap within 20%\u00ad15% Realised Cap S2F Deflection ratio values s2F deflection > 3, noisy HODL Waves >45% supply moved last 180 days (6 months) \u2192 Sell >70% supply held over 180 days \u2192 Buy chart - hover cursor over todays date add age brackets 24hr 3-6 months 12 month RSI > 90 14 month RSI > 95 \u2192 Sell 12 month RSI > 90 \u2192 Sell Noisy - defer metrics. SOPR 7 average. 1.04 \u2192 Sell 0.97 \u2192 Buy Noisy - defer metrics. Realised Cap > NVT Cap Realised Cap lower NVT Cap. Sell Realised Cap almost exceeds NVT cap chart below, false positives. Realised Cap lower NVT cap during bull market only. Noisy, miss. Charts Stock Flow Rainbow Top Cap Realised Cap, NVT Delta Cap month coin days destroyed Double top Similariti previous bull runs Version 1: Version 2: Halving model: 12 Month RSI comparison Bitcoin history Lowest forward metrics terms Average Cap \u201cforever\u201d moving average market cap. cumulative sum total daily market cap values divided age market days. Top Cap Average Cap multipled 35. NVT Cap valuation monetray velocity. Checkout CoinMetric info. MVRV ratio Market Realised calculated dividing Bitcoin\u2019s market cap realised cap. Realised Cap sum products UTXO market Bitcoin UTXO generated. Market Cap recent Bitcoin transactio multipled Bitcoin UTXO Unspent Transactio Outputs. These kind unspent coins. 1.5 BTC might bought sold 0.5. total UTXOs wallet 1.5. SOPR Spent Output Profit Ratio measure average profit loss coin. coin moved higher received SOPR increases, coin moved lower coin received SOPR decreases. won\u2019t accurate individual coins aggregate gives idea whether coins sold loss profit. Market participan owned BTC months behave differentl those held BTC years. experience investor likely measured less rash decisions. segregatin UTXOs according age compare old coins coins, experience inexperien investors (in aggregate) Weak hands sell stronger hands, market decrease useful aggregate age coins sold. coins moving young wallets selling likely less significan coins moved onto exchanges old wallets. aSOPR Adjusted Spent Output Profit Ratio SOPR ignores coins less hour old. profits taken old coins, aSOPR trends higher. trend lower older (and therefore profitable coins remain dormant. higher aSOPR is, profit taken off table. aSOPR less 1, spent coints moved aggregate loss. URPD UTXO Realised Distributi - lot coins moved within particular band, likely strong support resistance price. truer reliable mature market. market Bitcoin expanding rapidly volatile, attitudes expectatio market participan malleable traditiona finance. example, considered very high 12 months ago considered disaster today. RSI Relative Strength Index borrowed directly traditiona finance. calculate over periods. Miner Net Position Miner Net Position shows degree which, aggregate, Bitcoin miners profiting coins they\u2019ve generated mining. Miners expected among bullish market participan therefore notable start moving coins mining wallets exchange wallets. Stock-to-F stock flow measure scarcity commodity. calculatio based ratio existing supply produced. higher ratio, longer take supply meet existing demand. Gold stock flow ratio 66, means take 66 years current rate production produce amount gold currently circulatio Silver S2F ratio 74. BTC S2F 50. Background Over past 8 years, Bitcoin gone through phases rapid increase followed periods rapid decrease. driven increasing market size decreasing rate issuance, volatile (compared traditiona finance) \u201c1 month cryptocurr markets year traditiona markets\u201d. However volatility decreasing seeing lower highs higher lows during subsequent market cycle. single biggest factor driving multi-year market cycles appears decreasing rate supply increase (the issuance rate). last halvings1 seem provoked last bull cycles. third bull cycle now (April 2021) fully expect followed bear cycle. amateur investor, buy low sell high. I\u2019d top bottom market reasonable accuracy, just everyone else. aware methods less nuanced profession traders analysts - access less willing put effort are. happy Pareto style - I\u2019ll give 20% maximum effort I\u2019ll happy 80% ideal result2. review consider best sources metrics analysis come across. resources article attributed original author made freely available Twitter. hope OK repost here, I\u2019ll edit post. Hopefully helpful links article assumes familiarit blockchain financial markets. general articles site are: Bitcoin compared Gold buy bitcoin Analysts These insights, metrics charts following organisati Willy Woo Timothy Peterson PlanB Glass Node CoinMetric Jurrien Timmer Every 210,000 blocks, bitcoin awarded miner successful adding block halved. last halving occurred May 2020 rate issuance halved 12.5 BTC/block 6.25 BTC/block \u21a9I realise probably isn\u2019t, strictly, Mr. Pareto thinking he published his research. hope intention. \u21a9"},{"title":"All Known Locations of an\u00a0Executable","category":"snippet","url":"where-command.html","date":"25 April 2021","tags":"unix, macos, cli, bash ","body":"where \u00a0the Expanding phrases: kr -> kind\u00a0regar Multi-line seems similar 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 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 won\u2019t say bad things\u00a0abo Also, read quote somewhere saying mark great program having 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 - processes running sleeping. WCHAN tells kernel event waiting processing is\u00a0awaitin"},{"title":"Learning - April\u00a02021","category":"Technical/Developer Tools","url":"learning-april-2021.html","date":"21 April 2021","tags":"learning, youtube, ansible, ssh, vagrant, gcp, service-accounts, iam ","body":"Table Contents Google Cloud Platform Ansible SSH Vagrant Google Cloud Platform seems looking general overview roles managed, viewed, compared, and\u00a0inheri tell users (or service accounts) roles adequate, too too little particular task? what\u2019s difference user having roles, user service account those\u00a0role nice kind adversaria test, identify how/if users service accounts identities flexible permission their\u00a0own. These short videos good, they\u2019re complete solution. sure where look\u00a0next. Ansible Based Jeff Geerlings book. 15 episodes. Jeff seems great guy. going try listen these each\u00a0day. SSH very useful article. made notes another post. Vagrant local developmen (Especiall cloud providers as\u00a0Terrafo No"},{"title":"Tweets - April\u00a02021","category":"Non-technical/Journal","url":"tweets-april-2021.html","date":"21 April 2021","tags":"twitter ","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 great M&A practice Jim Bisenius April 14, 2021 Mental\u00a0Mod Tobi's favorite example 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 - 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 needed RSI 95 April close: $92K. Let's Coinbase IPO today\ud83d\ude80 PlanB April 14, 2021"},{"title":"SSH-Notes","category":"Technical/Developer Tools","url":"ssh-notes.html","date":"21 April 2021","tags":"ssh, linux, security ","body":"Table Contents TLDR Setup SSH-Agent prevent Authentica Passwords and\u00a0Keys Handshake Background Source TLDR Public remote\u00a0ser ssh-keygen -t rsa Generate pair keep private privately local keys added ~/.ssh/id_ reuse existing pair gets compromise you\u2019ll reset cat upload copy public\u00a0key Copy output relevant line: ssh-rsa /dev/null"},{"title":"The trouble with climbing higher is that eventually you lose sight of the\u00a0ground.","category":"snippet","url":"climbing-higher.html","date":"16 April 2021","tags":"advice, thoughts, meta ","body":"."},{"title":"I Leaked Credentials Onto A Public GitHub\u00a0Repo","category":"Technical/Developer Tools","url":"i-leaked-credentials-onto-a-public-github-repo.html","date":"15 April 2021","tags":"hack, github, service-account, keys, security ","body":"Table Contents post secrets public Background The\u00a0hack Remediatio Questions Study Comments post secrets public made mistake while ago, interests openness learning others, I\u2019d describe happened. Maybe it\u2019ll help others avoid mistake, maybe I\u2019ll learn something any conversati Background Google Cloud Platform (GCP), doing across multiple compute instances. Thankfully wasn\u2019t business critical production systems. account isolated away rest the\u00a0busine servers working increased, realised needed begin tools automate server setup. lead begin Ansible, once I\u2019d cobbled together working playbook pushed Ansible project GitHub account\u2026 accidental leaked account I\u2019d been\u00a0using The\u00a0hack Within couple minutes pushing repository GitHub\u00a0I: Made Stopped tracking keys git removed cache git rm -r --cached . Received email Google saying they\u2019d found OK, close call. secret leaked less 5 minutes. obscure thought nothing worry about.. noticed activity the\u00a0consol Compute instances created, list growing rapidly. Over next few minutes 195 compute instances disks created, unique name zones across world. format name Where either applicatio backup, jenkins, gke, prod, staging, worker, www, build, redis, runner. Maybe others too. seemed 5 random\u00a0dig instances ephemeral. had delete protection enabled. checked details few noticed scripts included references to\u00a0Monero. guess Monero mining bot set\u00a0up. logs showed GKE networking resources had requested, account stolen credential belonged didn\u2019t necessary permission Our project maxed quota compute instances multiple regions and\u00a0zones. Remediatio deleted account had leaked, began quantifyin damage. wanted exactly permission had, resources created, leaked account accounts? No, it\u00a0can\u2019t. After looking around becoming confident 195 compute instances disks delete protection had created, regions zones across globe, began remove them. No resources had took minutes googling compute instances dump file. expected run script iterated through line, setting variables based content current line: gcloud compute instances list --format zone)' > names.txt Vim, rows contain instances delete, remove these file. handful compute instances keep, 195 remove. :v/node- shows any rows Loop through row, contains instance name its\u00a0zone, Remove Delete the\u00a0instan while IFS=, read -r name zone gcloud compute instances update $name --zone $zone \\ && gcloud compute instances delete $name --zone $zone --quiet done < names.txt --quiet flag necessary otherwise gcloud ask confirm delete Questions surprised speed attacker found leaked credential repo did belong clients account own, assume account obscure enough any interestin lists. account scanned every few minutes, presumably accounts resources required that? guess these attacks works stolen compute scan repositori leaked credential easy imagine scenarios where large corporatio already running complicate cloud infrastruc deployment wouldn\u2019t notice few (200?) unauthoriz compute Study Service accounts Google SSH crash\u00a0cour Vagrant crash\u00a0cour IFS= Comments useful discussion article on\u00a0Lobste."},{"title":"Broot","category":"snippet","url":"broot.html","date":"13 April 2021","tags":"broot, macos, cli ","body":"Broot tool shows contents directory screen, even got lots files"},{"title":"Adding Keyboard\u00a0Navigation","category":"snippet","url":"adding-keyboard-navigation.html","date":"12 April 2021","tags":"blog, jam, jquery ","body":"added keyboard navigation blog works well. Now myself trying shortcuts other\u00a0site"},{"title":"Ansible","category":"Technical/Developer Tools","url":"ansible.html","date":"12 April 2021","tags":"ansible, servers, ssh, automation ","body":"Background spending lot lately working nodes various blockchain projects (Polkadot, Cardano, Tron, Binance Chain, Ethereum, \u2026). rosetta api spec super interestin crypto documentat sometimes wrong incomplete bugs nodes runs separate server, typically node mainnet another testnet. working across mutiple servers, doing difficult stuff, easy as\u00a0possibl reduce friction Accessing servers easy - Tmux continuum resurrect plugins maintain sessions server. makes accessing multiple servers during 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, configure server 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. watching it, didn\u2019t \u201cwhich was\u00a0up\u201d. blog post showed inventory gcp_comput plugin. spent lot unnecessar confused service accounts. guess until success understand something 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 help ssh instance. No matter\u00a0tho blog post turned just needed. found beginning search trying inventory, discarded almost useful. Turns OS Login best 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 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":"Github\u00a0Actions","category":"snippet","url":"github-actions-blog.html","date":"10 April 2021","tags":"github, blog ","body":"GitHub actions generate html markdown run shell"},{"title":"","category":"snippet","url":"socially-acceptable-mistakes.html","date":"10 April 2021","tags":"meta, thinking, advice ","body":"socially acceptable mistakes errors omission"},{"title":"`du` is a tool for showing disk\u00a0usage.","category":"snippet","url":"du-command.html","date":"7 April 2021","tags":"cli, unix, macos ","body":"similar tool, list similar tools here"},{"title":"Safe Bash\u00a0Scripting","category":"snippet","url":"safe-bash-scripting.html","date":"6 April 2021","tags":"bash ","body":"example safe, good, robust bash file\u00a0skele"},{"title":"Running a Binary in\u00a0Debian","category":"snippet","url":"running-a-binary-in-debian.html","date":"5 April 2021","tags":"debian, binary, path ","body":"running binary Debian complainin environmen variable existing. moved binary $PATH directory logged sudo user. Why did solve the\u00a0proble"},{"title":"Over-Engineering this\u00a0blog","category":"Technical/Web","url":"over-engineering-this-blog.html","date":"5 April 2021","tags":"blog, javascript, self-reflection ","body":"Over last few weeks spent unreasonab amount energy making unnecessar improvemen this\u00a0blog. these Adding keyboard shortcuts (type ? 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 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 sure enough reason - built solve present problem, what-ifs maybes. YAGNI. wouldn\u2019t myself profession capacity. tension curious sure justify myself. hobby, wanted it, enjoy tinkering web technologi learning new\u00a0things also, lost sleep over - stayed too late, put pressure other\u00a0thin curious, making room play interestin things, useful approaches personal developmen up-skillin myself. a\u00a0limit.. tension wasting taking risk, take few years sure these efforts worthwhile or\u00a0not. fun, do\u00a0it. Successful business owners seem very leaving alone once they\u2019re \u201cgood enough\u201d, fact, perfection antithetic entreprene am perfection just curious big appetite for\u00a0learni \u201cappetite learning\u201d stops focussing. myself become distracted adding features blog, instead zoom bit working towards substantia meaningful goal, exclusion minor\u00a0goal entreprene very focussed, fault. am focussed. am too distracted by\u00a0life. balancing act, tension emotionall physically present family friends, ignoring possible focus doing something meaningful"},{"title":"Fuse\u00a0Search","category":"Technical/Web","url":"fuse-search.html","date":"5 April 2021","tags":"fuse, search, web ","body":"Adding search made site feel faster accessible reimplemen search site fuse.js instead tinySearch read implemente tinysearch here. implemente search surprised faster accessible site began feel. quickly access any content typing few words, didn\u2019t scroll follow link.1 means content without having - 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. content, 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 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 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 quite simple once you\u2019re familiar JavaScript flexible tinySearch choose search weights 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 want. (There simply needs JSON array browser downloads does fuzzy search on). gave 4MB. Once asked Fuse search complete text article (not just default 600 chars, iirc) speed suffered. optimized index following three ways: Removed any non-words. articles jupyter notebooks converted articles (the plugin reasons why began Pelican). index built, lots code html gets included, isn\u2019t helpful. Any \u201cwords\u201d 20 chars just delete. Removed 150 common words. Any word articles useful distinguis 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 12 characters word 15 characters long, simply removed last chars. figured fine matching 12 characters already quite unique give result. Doing these optimizati reduced size 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 function 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 function run presses surprising complex. taught lot JavaScript though, satisfying made useful user interface. immediatel gave idea add keyboard shortcuts. ? happened \u21a9"},{"title":"Creating\u00a0Slowly","category":"snippet","url":"creating-slowly.html","date":"1 April 2021","tags":"meta, thinking, advice ","body":"hacker, creator, whatever best label is, always something (usually code) it\u00a0finishe strange creativity productivi boost comes dabbling, dipping and\u00a0out. technical challenges aren\u2019t too hard, criteria success is\u00a0creativ Creativity needs away project, sleep, bubble ideas\u00a0grow Ultimately successful path usually interestin success consequenc failure. \u201cInteresti requires elements novelty surprise, without creativity these elements can\u2019t flourish.\u00a0 Dabbling results creativity 6+ hours strenuous work, likely give"},{"title":"Arrow syntax in\u00a0bash","category":"snippet","url":"arrow-syntax-in-bash.html","date":"1 April 2021","tags":"bash, syntax ","body":"bar << foo bar stop reading input reached\u00a0\u201cf bar <<< \"foo\" foo input. bar wont bar < <(foo:list process subscripti Kind piping output Stack\u00a0Over"},{"title":"Pretty print JSON","category":"snippet","url":"pretty-print-json-in-typescript.html","date":"31 March 2021","tags":"typescript, json, syntax ","body":"null, 2)}`);"},{"title":"Vim: GoTo Tag\u00a0Definition","category":"Technical/Developer Tools","url":"vim-notes-goto-tag-definition.html","date":"31 March 2021","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 defined, jump back again. seems two lists aware of, jump list1 change list2. Jump List list locations cursor jumped to. move jump list mode down jump list Jumping definition search result Change List g; g, \u2192 move down change list list locations where change made. '. \u2192 go location last edit (. mark). \u2192 go back where last jump Original Post: multiple ways doing anything vim, including going where function object defined, usually something least times 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 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":"Useful\u00a0Business","category":"snippet","url":"useful-business.html","date":"30 March 2021","tags":"entrepreneur, saas ","body":"looks"},{"title":"Frantic\u00a0Distraction","category":"Snippet","url":"frantic-distraction.html","date":"30 March 2021","tags":"meta, thinking ","body":"Frantic distractio via productive exhausting and\u00a0useful"},{"title":"Rearrange splits in\u00a0Vim","category":"snippet","url":"vim-split-rearranging.html","date":"29 March 2021","tags":"vim ","body":"x - swap buffers, keep arrangemen the\u00a0same H - current split cover left the\u00a0screen J, K, L covers bottom, top, right the\u00a0screen blog\u00a0post stack\u00a0over"},{"title":"Pelican Plugin\u00a0Guide","category":"snippet","url":"pelican-plugin-guide.html","date":"29 March 2021","tags":"pelican, plugin, guide ","body":"guide writing plugins for\u00a0Pelica"},{"title":"Read and Write the Same File in\u00a0Bash","category":"snippet","url":"read-and-write-same-file.html","date":"24 March 2021","tags":"shell, pipe, syntax, bash ","body":"tried read write pipeline, got caught race condition (why empty?!). this\u00a0inste some_scrip < > smscrpt.$$ \\ && mv smscrpt.$$ || rm smscrpt.$$ || removes temporary it\u00a0errors. $$ process ID ensures always unique temporary file\u00a0name."},{"title":"JSON\u00a0tools","category":"snippet","url":"json-tools.html","date":"24 March 2021","tags":"json ","body":"jj - stream editor jq - json processor python -m json.tool jq pretty printing JSON output, jj making JSON pretty or\u00a0condens useful optimizing search index this\u00a0blog."},{"title":"Docker\u00a0Commands","category":"snippet","url":"docker-commands.html","date":"17 March 2021","tags":"docker ","body":"docker run -d ... docker logs -f docker run -it ... docker run -itd docker container attach -> detach container interactiv stack\u00a0over"},{"title":"Python\u00a0Notes","category":"Technical/Developer Tools","url":"python-notes-2.html","date":"17 March 2021","tags":"python, learning notes ","body":"__call__() Python, every call function 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 function method, you\u2019re just calling built __call__ method. one, preferably one, obvious do\u00a0somethi \u2018zen Python\u2019, guidelines help design decisions. choice Python made, languages 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 It\u201d. Perl\u2019s philosophy give users do\u00a0somethi"},{"title":"Adding\u00a0Search","category":"Technical/Web","url":"adding-search.html","date":"12 March 2021","tags":"blog, search, tinysearch, web ","body":"added search blog. Results generated type. Try typing / cmd-k. look Pelican plugins index you\u2019ll 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 size 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 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 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 open\u00a0files still (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 fast and\u00a0precis Googling jquery packages, vanilla javaScript showed enough 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":"Pipe a Script File into\u00a0Bash","category":"snippet","url":"pipe-a-script-files-into-bash.html","date":"11 March 2021","tags":"bash, syntax, shell ","body":"Probably just curl-ed curl -sSfL | sh -s"},{"title":"Split Long\u00a0Strings","category":"snippet","url":"split-long-output-onto-multiple-lines.html","date":"10 March 2021","tags":"bash, linux ","body":"Split long strings (or command outputs) onto multiple lines replace particular char (maybe :) \\n. ... | tr ':' '\\n' ... | sed 's/:/\\n/g'"},{"title":"ripgrep\u00a0Regret","category":"snippet","url":"ripgrep-regret.html","date":"10 March 2021","tags":"ripgrep, fail ","body":"Without noticing, .gitignore single * in\u00a0it. Spend trying understand why ripgrep stopped working 1\u00a0project. \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d"},{"title":"Teaching Kids About\u00a0Money","category":"snippet","url":"teaching-kids-about-money.html","date":"5 March 2021","tags":"parenting, kids, money, teaching ","body":"Teaching kids money having an\u00a0effect. Yesterday, daughter made painting asked buy pretend\u00a0mo"},{"title":"Stop Prepending sudo to Docker\u00a0Commands","category":"snippet","url":"stop-prepending-sudo-to-docker-commands.html","date":"5 March 2021","tags":"sudo, docker, linux ","body":"sudo groupadd docker -> group sudo gpasswd -a $USER docker -> add $USER docker group newgrp docker -> activate changes"},{"title":"`cat` and a new\u00a0line","category":"snippet","url":"cat-and-a-new-line.html","date":"5 March 2021","tags":"cat, linux, bash, shell ","body":"you\u2019re cat-ing bash prompt doesn\u2019t start (cos displayed cat doesn\u2019t end char) following fix\u00a0it: cat ; echo"},{"title":"Cardano: Generating\u00a0Addresses","category":"Technical/Cryptocurrencies","url":"cardano-generating-addresses.html","date":"5 March 2021","body":"customers deposit send ADA (The unit currency Cardano blockchain Cardano node, necessary determine customer responsibl transactio correct customer account be\u00a0updated 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, 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 have. any funds arrive address particular customer. However 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":"creating users with sudo\u00a0permissions","category":"snippet","url":"creating-users-with-sudo-permissions.html","date":"4 March 2021","tags":"sudo, linux, user, admin ","body":"adduser -m usermod -aG sudo CentOS: adduser -m passwd usermod -aG wheel (wheel usergroup"},{"title":"Two Years Of\u00a0Vim","category":"Technical/Developer Tools","url":"two-years-of-vim.html","date":"4 March 2021","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 actually doing it. action, muscle memory pay attention underlying press something goes\u00a0wrong noticeable trying 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 in\u00a0Vim. even vision blurry (and speech slurred head heavy) text objects navigation commands where text is. saying tired, can, already familiar"},{"title":"Disk Full and Disk Usage\u00a0Commands","category":"snippet","url":"disk-full-and-usage-commands.html","date":"3 March 2021","tags":"linux, du, df, shell, cli ","body":"df -h Show disk\u00a0space du -hs . big current dir\u00a0is"},{"title":"Git LFS","category":"snippet","url":"cloning-git-repos-using-lfs.html","date":"3 March 2021","tags":"git, git-lfs ","body":"Cloning large repos, repos large files them, doesn\u2019t git clone ... git lfs clone ... why git lfs clone deprecated What\u2019s"},{"title":"Binance-Chain: Running a\u00a0node","category":"Technical/Cryptocurrencies","url":"binance-node-api.html","date":"3 March 2021","body":"setting binance-ch node. Unlike Polkadot Cardano, going run container until working reliably. Binance docs show couple ways install node. install.sh script went default values possible. Installati 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 while 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: 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 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 list running jobs jobs. move running job background (like vim session) ctrl-z \u21a9"},{"title":"nohup","category":"snippet","url":"nohup.html","date":"2 March 2021","tags":"linux, cli ","body":"nohup keep curl process running even terminal (tty?) session autocloses at\u00a03am."},{"title":"Shell\u00a0Comparisons","category":"snippet","url":"shell-comparisons.html","date":"2 March 2021","tags":"zsh, bash, bsh, linux, cli ","body":"group shells into\u00a0group ksh - korn shell and\u00a0zshell sh - bourne shell bash (the bourne again\u00a0shel zsh isn\u2019t superset of\u00a0bash. bash superset bourne\u00a0she"},{"title":"nohup and Background\u00a0Processes","category":"Technical/Developer Tools","url":"nohup-and-background-processes.html","date":"2 March 2021","body":"Stop stuff\u00a0stop run command terminal session terminal session disconnect processes running be\u00a0termina discovered trying download ~500GB database overnight. logged next morning expecting 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, 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 useful stdout $ grep -r hello /sys/ 2> /dev/null run command 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 stdout. Input redirect stdin similarly. run Ranges Searching Undo Splits Macros Verbs s - delete char under cursor enter Insert\u00a0Mod r - 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 replace whole words only: 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 buffer containing - every containing \u201cgood\u201d substitute \u201cbad\u201d with\u00a0\u201cugly Splits r - rotate splits left right split vertically R - 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 buffer O lines match Insert Mode jump Command Mode command put back Insert .dot command repeats commands changes buffer content. wont repeat"},{"title":"Notes From \u201cPowerful\u00a0Python\u201d","category":"Technical/Developer Tools","url":"python-notes.html","date":"21 January 2021","body":"parts Aaron Maxwell\u2019s Powerful Python newsletter forget: Table Contents Emergent Abstractio Practioner Engineer, Scientist Sentinel Values Levels Python Code Read PEPs Emergent Abstractio expecting letting abstractio emerge projects. yourself repeatedly solving similar problems similar ways, simplify code couple convenienc methods helper class? code below gives three ways instantiat twitter API client within class: generic \u201cnormal\u201d specialize looks certain environmen variables specialize looks configurat os 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 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 (bad unexpected happened. Levels Python Code Syntax - understand indentatio important, parenthesi colons, etc Idioms - building blocks program. \u201cParagraph code follow common patterns, loops, __init__() methods (boilerpla context managers. Design Patterns - Less well defined Idioms, useful. info. Creational Patterns, Factories Structural Patterns, Adapters Proxies Behavioura Patterns, Visitor Strategy These tend across languages. Architectu - largest structures software system. language itself doesn\u2019t lot difference applicatio architectu whether written Python Java. interface 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","category":"Non-technical/Learning","url":"mental-models-i-used-to-use.html","date":"20 January 2021","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 harder while easier. You\u2019ll 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 through gaps. Look edges gaps, parts aren\u2019t well known. 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 something, feel didn\u2019t it, didn\u2019t happen? Regrets inevitable everyone them. making mistakes. regrets 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 out. become black white, instead shades gray, priorities options clearer. likely very efficientl effectivel scenario, learn important yourself. Now older can\u2019t ever become bad situation becomes black white. navigate world grays. become black white, I\u2019ll already long list failings. younger, fragile. resources smaller quickly flip bad. Enjoy few benefits situation gives, (hopefully once gone gone good. best solve problem prevent occurring place. Succeeding bring own challenges Take responsibi 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. 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":"What\u2019s So Different About\u00a0Now","category":"Non-technical/Social","url":"whats-so-different-about-now.html","date":"20 January 2021","body":"less aware our ignorance previous generation easy implicitly assume useful informatio available us, therefore informed really\u00a0are internet made informatio accessible global air travel made world feel\u00a0small Whilst individual hopefully never pretend everything easy assume right informatio exists whom is\u00a0relevan accessibil informatio put us situation similar informatio scarcity. still actively search informatio want, informatio comes us easily free equal 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 answer questions, last checked whoever gave wasn\u2019t going profit from\u00a0it?"},{"title":"Predicting the Future using Human Nature and\u00a0Technology","category":"Non-technical/Social","url":"what-happens-next.html","date":"20 January 2021","body":"Predicting future sounds tough problem, try without realising\u00a0 predict future risky scary something is, what\u2019s 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 probably works getting through"},{"title":"Financial Doom And\u00a0Gloom","category":"Non-technical/Social","url":"financial-doom-and-gloom.html","date":"19 January 2021","body":"Financial crises seem happen fairly regularly shouldn\u2019t unexpected no-one seems particular concerned our current financial system, moment our attention controlled threats. concerned lot money injected money supply haven\u2019t seen any inflation. am concerned stocks no longer related created company instead macro economics. terrible investor. alarming statement. investing always decent money unless markets broken. something doesn\u2019t represent correction inevitable Interest rates low moment spare money where put it? bank account, interest rates low1, government debt, yield low. stocks investment increase meaningful everyone doing drives up, increasing increase even further. 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 stock. amount euros existence 2019 90% 2010.3 inflation 2010 2020 13%.4 Why that? 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 deploy capital). Interest rates affect relative risk-rewar ratios investment strategies \u21a9Index Funds Kings Wall Street \u21a9statista \u21a9"},{"title":"Debugging the more_categories plugin for\u00a0Pelican","category":"Technical/Developer Tools","url":"debugging-more-categories-pelican-plugin.html","date":"19 January 2021","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 code popular python libraries Python written, talented developers write code solve problems. opportunit look code powers plugin can: Understand source code Locate source problem Fix problem Pelican amazingly quality not, feeling developer resources, got real reason motivation look underlying code 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, aware understand definitely incomplete probably wrong. hope progress mistakes already written. called first, takes two arguments, generator metadata. entire function lines here is: def metadata): categories = = name categories = looks gets category metadata article. Presumably function called articles already parsed metadata object already created populated metadata articles, including categories row splits categories multiple categories listed. metadata dictionary metadata dict article, otherwise couldn\u2019t just assoiciate dictionary split string commas. means function called once article. 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 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, lets quickly cover last row function. category attribute articles metadata simply updated 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 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 function called after get_catego function 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","category":"Technical/Web","url":"different-views-for-different-users.html","date":"19 January 2021","body":"blog serves variety purposes. partly journal teaching myself developer scientist, personal blog, articles interests experience unlikely anyone interested every article, I\u2019d easy read content they\u2019re interested in. Therefore thought separate articles two broad groups, technical non-techni visit blog clicking link technical article, site show technical articles blog. 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. playing (being curious, lightheart unhurried concerned failure) important. Especially adults 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","category":"Technical/Web","url":"different-types-of-problem.html","date":"18 January 2021","body":"Three categories problem Last year creating moneybar pippip few problems took effort solve others. 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 enough break big general problem smaller problems (you developing domain expertise) intuitions solve problem becoming better second attempts likely correct, rather fifth sixth. Knowing google problem answer important skill, requires intuiting English speaking expert ask question. isn\u2019t trivial hear discussing often. coding problems 2, feels learning efficientl 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 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 several factors why so, I\u2019ll describe specifics generalisi web app runs production stored web server web-server cheap efficient 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 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 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 going hidden below layers abstractio remote machine limited access via web browser. able dig investigat quickly easily tools writing testing code locally. taken great efforts local developmen environmen this, stressful switch limited tools. problem result several interactin once, can\u2019t just test time. These 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 isolating exploring particular components Having said that, best solve problem prevent occurring place, enough figure that, yet.on timescale? Life long, does matter takes week month learn something meaningful Momentum, having fun, important though. \u21a9from personal growth point view. suppose employers point view 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","category":"Non-technical/Learning","url":"why-i-want-to-write-regularly.html","date":"18 January 2021","body":"started writing frequently often thoughts I\u2019d explore develop further rarely do. Writing forces organise thoughts look substantia are, aren\u2019t. truth saying \u201cto thing able teach it\u201d , writing well several similariti teaching. copy collection thoughts head yours? Powerful ideas resilient consequenc older believe ideas matter2. subtle consequenc 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. 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","category":"Technical/Developer Tools","url":"becoming-a-better-python-developer.html","date":"18 January 2021","body":"subscribed Aaron Maxwell\u2019s \u201cPowerful Python\u201d newsletter over year 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 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 supermarke making dinner kids, try read After subscribed several months, unsubscrib resubscrib Now reliable high quality advice going prioritise working through examples doing missed time. gone back beginning reinforce parts try again eluded first\u00a0time Three kinds practice projects become web app - Django framework user. Done\u00a0this. command tool - argparse module, standard library. Haven\u2019t done yet, guess now start. seems simplest quickest three kinds project, useful - lets app contexts, outside python eco-system anywhere command tools machine learning - already studied this, theory (numpy) frameworks (tensorflo happy it\u2019s\u00a0inclu"},{"title":"Using Vim with large\u00a0codebases","category":"Technical/Developer Tools","url":"vim-for-large-projects.html","date":"15 January 2021","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. happy invest effort learning Vim plugins. confident I\u2019ll still twenty years from\u00a0now. Filetype plugins - settings active particular filetypes, .py (python) .txt (text) Vim look opens buffer 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 code catching mistakes code 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). methods class contains, jump part buffer 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. current status, type: :filetype syntax \" syntax highlighti - try 'syntax on/enable' noesckeys \" might break stuff, delay smaller timeoutlen \" timeoutlen mapping delays ttimeoutle \" ttimeoutle code 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 buffer 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 \" view 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 buffer changed nnoremap ww :update \" save changes nnoremap wa :wa \" close buffer 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] list multiple matches \" Plug \" (re)genera tags bg Plug = ['.json', \" sidebar displays tags current file, ordered scope Plug nnoremap nnoremap \" add python library code 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 invoking command (and \" 'CTRL-I' jump forward; ':h jumplist' details) = = = = = = = \" autoclose parens, brackets etc \" Plug \" vim-tmux focus events Plug \" Code 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 buffer 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 buffer 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","category":"Non-technical/Learning","url":"using-rss.html","date":"14 January 2021","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 mechanics incentives RSS quality content come me, own schedule. remember look it, authors remind exist. Google Reader RSS very effective 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 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","category":"Technical/Web","url":"learning-to-django.html","date":"14 January 2021","body":"Table Contents the\u00a0beginn personal best\u00a0momen the\u00a0beginn came web developmen via business analytics. working accountant Excel wasn\u2019t enough anymore, looked around started came across Jupyter Notebooks. Notebooks said kind \u201cgateway drug\u201d programmin that\u2019s true. They\u2019re easiest fastest start programmin come\u00a0acros you\u2019re working notebook, easy data, wrangle it, show results. soon chart summary table inevitably wonder show 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 files trying visualise part model, cycle currently working\u00a0on came realise mental load seems large beginning whole stack technologi abstractio combined (or stacked) together. these together any evidence success all. hardest Django actually Django. You\u2019ll comfortabl classes inheritanc You\u2019ll comfortabl working across multiple files, tools searching across open buffers, files project, 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 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 it. happens completely record \u2018ahah!\u2019 moments context, stopped working freelance scientist April after few weeks wondering django PostgreSQL python go (yes is. boring technology began working full-time become MoneyBar.n called \u2018myeuros\u2019 the\u00a0beginn learning curve felt steep. wanted \u201cright\u201d 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 code understand youre an\u00a0expert. wanted give user unique ID - UUID signed up. query strings instead usernames incrementa keys. hard 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 long, testing part app hand added changed feature no longer trivial. needed automatica creating users checking log access\u00a0vie began working pytest, found hard wrap head around idea accessing parts app requests responses accessing class code limit knowledge, where just enough thing \u201cwork\u201d. approach falters test wrote. least, measure \u201cjust enough\u201d changes require tests written. just work, understand why works, write tests assert certain conditions pass others\u00a0fai feels satisfying works, proof 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","category":"Technical/Developer Tools","url":"larger-code-bases.html","date":"14 January 2021","body":"Code\u00a0Struc immediate basic difference working scientist web developer files codebase spread across amount code within each\u00a0file. Web applicatio tend very modular - lot going modern web app generally able modified updated independen other. requiremen encourages modular code base architectu code 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 code per IDE\u00a0featur These difference mean code organizati tools IDE features play very roles within industry. web developmen able jump files (or buffers) quickly, search text across multiple files. Writing idiomatica becomes important, writing code within discreet testable units becomes essential 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":"Test Driven\u00a0Development","category":"Technical/Developer Tools","url":"test-driven-development.html","date":"6 January 2021","tags":"python, django, testing, web-app ","body":"Test Driven Developmen mind-bendi grappled it: \u201cWrite test code write code\u201d \u201cAssert code matches expectatio understand inputs outputs every function method write\u201d. Last summer building web app began break adding features. soon led lots clicking around pages test stuff still working made update. led thinking better way, eventually 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 code 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. 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 write code tested, though why sometimes useful. writing tests sooner rather later best though, ideally soon you\u2019ve got basic version feature working. Coverage show code 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 happening. very possible write test covers code you\u2019ve just written without ensuring intended behaviours happen. \u21a9"},{"title":"Why Talk About\u00a0Jesus?","category":"Non-technical/Other","url":"faith-in-jesus.html","date":"5 January 2021","body":"Start happiness seems am happier Christian weren\u2019t. \u201cbeing Christian\u201d mean following Jesus - trying best act, speak he want\u2019s 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 significan complicate thought he dead. Nonetheles seems true. 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 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 confident come back me, seemed super unlikely. few days later received call office worker Gherkin building - bag under his desk he wanted I\u2019d collect it. guess I\u2019ll try mistake twice. example tend remember happened long after I\u2019d moved Vienna. feeling lonely isolated wondering earth going sort healthy sustainabl Try might, wasn\u2019t enjoying feeling stressed overwhelme remember walking steep hill 18th district towards office, repeatedly praying simple prayer \u2018God, please help, please help, please help..\u2019. simple couldn\u2019t anything useful say. Nothing dramatic happened day, even week far remember. look back, turning point started getting better instead worse. suppose call last example intangible answer prayer. Maybe is, anyone whose grappled overwhelmi loneliness panic say emotions become too tangible times. emotional state seemed tangible difference just every area life. Eating, productivi work, relationsh friends colleagues etc. beginning why Jesus alive why Christiani real living faith. primarily tradition, worldview rules ideals. Christiani relationsh Jesus. He did lots amazing 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 confused ineffectiv state. Ideas thoughts become mixed cultural christiani christian politics traditions These things, unless distinguis words use, going hard communicat clearly. suspect negative cycle imprecise thinking leading imprecise articulati leads further imprecise thinking. Unless talk thing time, atomically necessary, take additional risks reaching wrong conclusion personally arguing others due rather actual disagreeme try precise vocabulary navigate our Christian lives, 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 also. \u21a9from principals \u21a9"},{"title":"API Design\u00a0Principles","category":"Technical/Developer Tools","url":"api-design.html","date":"4 January 2021","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. 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 hard, bit 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 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 repeated requests result server side. I.e. making repeated requests result making similar request, server side. client side, response code may change, of\u00a0course."},{"title":"Principles Of Object Orientated\u00a0Programming","category":"Technical/Developer Tools","url":"principles-of-oop.html","date":"4 January 2021","body":"recently interviewe lead developer role Lab Digital1 thought sensible review fundamenta aspects Object Orientated Programmin (OOP). might that\u2019s unusual prepare interview, you\u2019d right. Nothing close these notes arose during interview, stuff interestin motivated enough study it, 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. define 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 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 code 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","category":"Technical/Web","url":"site-performance.html","date":"4 January 2021","body":"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 Github Pages Cloudflare free 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","category":"Technical/Developer Tools","url":"using-unix-utilities-to-analyse-and-update-multiple-files.html","date":"4 January 2021","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 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 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' list files containing Category: General: grep -H 'Category: General' *.md 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 single quotes. access variables commands inside a\u00a0string. .* wildcard operator allowing any characters required article belongs"},{"title":"A New Blog\u00a0Design","category":"Technical/Web","url":"a-new-blog-design.html","date":"18 December 2020","body":"blog design! old, well-writt HTML, improved CSS framework, maintainab code, dark mode, articles website ever project HTML CSS, codebase original blog terrible. poorly written hard maintain. remember 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 code base became increasing uncomforta wanted update blog easy fun again. able play quickly wasn\u2019t aiming radical re-design, focus text exploring any on-trend design choices. original design choices held well. design years, templates code 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","category":"Non-technical/Entrepreneurship","url":"product-led-growth.html","date":"8 December 2020","tags":"marketing, startups ","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, 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 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 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 isn\u2019t product amazing, valuable customer, customer acquisitio Sales-Led GTM, watch competitor sell efficientl efficient Customer Acquisitio Model. steal market share offering 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 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 selling live-chat software, selling better selling outcome, result, the\u00a0why. Pain makes us change avoid prevent Pain three reasons why 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 users accomplish meaningful outcomes. These outcomes referred value-metr value-metr measure exchange product. linchpin successful execution product-le GTM strategy aligning revenue directly customer acquisitio model. metrics play vital role 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 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 pricing strategies iterate to\u00a0success Ask\u00a0yourse best customers\u00a0 best customers not\u00a0do? features did best customers try similariti along best customers led to\u00a0success churned customers, difference best customers? ideal audience? Why did church? did"},{"title":"The Mom\u00a0Test","category":"Non-technical/Entrepreneurship","url":"mom-test.html","date":"4 December 2020","tags":"book ","body":"Summary Ask Avoid bad\u00a0data. Keep it\u00a0casual. Push commitment Frame meeting\u00a0we Focus right, tight, Prep well, take notes, review your\u00a0notes Table Contents Summary Chapter - Opinions are\u00a0worthl Chapter - Avoid bad\u00a0data Chapter - Ask Chapter 4 - Keep it\u00a0casual Chapter 5 - currencies Chapter 6 - Finding Chapter 7 - Choosing you\u00a0custom Chapter 8 - Getting conversati prepping and\u00a0review Chapter - Opinions are\u00a0worthl Anything involving future overly optimistic lie. objective facts happened the\u00a0past. care idea never mentioning Forcing yourself mention idea force ask sure questions pass mom test: Talk lives, your\u00a0idea. Ask specific objective events past, Spend listening, not\u00a0talkin Chapter - Avoid bad\u00a0data aren\u2019t allowed tell problem\u00a0is aren\u2019t allowed tell to\u00a0build. Bad data\u00a0inclu Compliment Fluff Hypothetic Ideas Chapter - Ask terrified least questions ask Search scary questions you\u2019ve avoiding. What\u2019s worst thing prospect say? What\u2019s scariest question could\u00a0ask? scary questions imagine company failed ask\u00a0why. unexpected answer questions doesn\u2019t any effect you\u2019re going do, worth asking\u00a0it? General advice hard includes asking hard questions. Imagine delegating task, tell person do? That\u2019s\u00a0you ask about\u00a0mone Love bad news - 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\u00a0kno Opinions don\u2019t\u00a0coun lukewarm response idea great conversati realise idea isn\u2019t great idea. Lukewarm means care enough buy (worst) version it\u2019s\u00a0ready Look zoom. focus details too soon, understand big picture\u00a0fi product risk customer risk: Product risk - build grow\u00a0it? Customer risk - big enough group going buy\u00a0it? Pre-plan list important questions (including scary one) every meeting conversati ready these. change week week. quality answers existing questions bring new\u00a0questi Chapter 4 - Keep it\u00a0casual Problem -> Solution ->\u00a0Sales Normally meetings client big sale. lets stage well without blurring data: Identify Explain your\u00a0solut Sell the\u00a0soluti Identifyin problem doesn\u2019t meeting, keep casual honest feedback faster. works better chat relaxed saying really\u00a0thi take 5 minutes (max) identify problem exists is\u00a0importa Give little info possible idea whilst still nudging Chapter 5 - currencies early stage sales, goal learning. Money a\u00a0side-eff spend money, time, reputation your\u00a0solut someone willing risk reputation spend money idea, believe Hearing compliment means they\u2019re trying rid of\u00a0you. bad meeting you\u2019re sure think, push commitment kind. Ask spend time, reputation money you\u2019ll really\u00a0thi aren\u2019t excited (not just interested pain excited solution) ASAP. still meeting discover\u00a0t offering pain lead isn\u2019t real lead until you\u2019ve given concrete chance reject\u00a0you Ask learning questions Mom Test, confirm selling\u00a0it crazy customers: painful painful money pay solve\u00a0it already own bad solution terrible problem, yours clearly\u00a0be crazy customer doesn\u2019t say \u201cyeah that\u2019s great, interested ready\u201d. say \u201cAHHH WORST PART LIFE PAY RIGHT NOW FIX IT!\u201d crazy customer front money barely functional 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 Vision -> Framing -> Weakness -> Pedestal ->\u00a0Ask Keep having conversati until stop hearing new\u00a0stuff. topic both care about, excuse. You\u2019ll both enjoy chat. mention idea breaks the\u00a0premis Warm introducti ideal start conversati 6 degrees freedom world, someone knows someone knows\u00a0them 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 you\u2019re Become subject matter\u00a0exp Speaking teaching engagement - strong opinions, you\u2019ll be\u00a0respect Chapter 7 - Choosing you\u00a0custom Startups starve, drown. options, choices, ideas. Choose customer segment, focus it, beginning: Google - PhD\u00a0studen PayPal -\u00a0eBay. Evernote - Moms with\u00a0recip look obvious hindsight, probably obvious you\u2019ve figured it\u00a0out. 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? else (outside group) Go Who-Where pairs segments. \u201cFinance profession customers reachable, profitable segments usually \u201cwho-where pairs. where customers, keep slicing until do. sure segment reachable, profitable Chapter 8 - Getting conversati prepping and\u00a0review Prepare\u00a0we three big questions ready, including scary\u00a0ones speaking\u00a0t commitment next-steps push\u00a0for. Spend hour writing\u00a0do best guesses they\u2019ll\u00a0sa care\u00a0about they\u00a0want. focussed segment, you\u2019ll come across question answered internet, the\u00a0intern Take good\u00a0notes Ask record the\u00a0audio. Record emotions well words. Verbatim alone isn\u2019t always accurate 6 months\u00a0lat shorthand follow\u00a0up. Observe record emotions - happy, angry, meh,\u00a0etc. Pains obstacles lot important someone embarrasse angry they\u2019re talking about\u00a0them Dig big emotions, 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","category":"Non-technical/Entrepreneurship","url":"obviously-awesome.html","date":"3 December 2020","tags":"marketing, positioning, startups, book ","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 demo product to, ask describe back you. existing customers. they\u2019re saying thing Products strong positionin best kind of\u00a0custome value\u00a0obvi Sell\u00a0quick Part\u00a01 Positionin as\u00a0context Without positionin guide us, understnad a\u00a0product Positionin lets us assumption product is\u00a0for features\u00a0a it\u00a0costs Without paralyzed choice, wouldnt able sense products around\u00a0us. context purpose product perspectiv often those the\u00a0prospe Products positioned multiple ways, often best positionin Bad positionin makes harder prospects figure product worth Positionin requires considerin Customers point view - 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 lot market, problem, alternativ solutions, prospects do. (\u201cDoing nothing\u201d opportunit red\u00a0flag.) important understand customers compare product with, define \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 - cares lot value? Focus customers likely purchase quickly, wont ask discounts, tell friends about\u00a0you. clearly identify 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 figure product why special. able 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","category":"Non-technical/Learning","url":"How-I-learnt-to-code.html","date":"1 December 2020","tags":"learning, code ","body":"4 years ago started learning code, difficult! still difficult, now collection tools perspectiv less daunting. Leveling requires abstractio wrap head around, API understand do\u00a0it. needed difficult, now building Code School Meta easier learn to\u00a0code. Learning code fun, ultimately successful life changing (hello job security!) beginning sooo slow, super\u00a0tric Imposter syndrome real, definitely felt it. 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. Unusally, Git next. Mainly 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 now working Code School: Meta. online community easier teach yourself code - less confusion started learn next, encouragem lots high you\u2019d more, please check sign for\u00a0update"},{"title":"","category":"snippet","url":"emacs-dreaming.html","date":"27 November 2020","tags":"emacs, dream ","body":"Two nights ago, dreamt experiment with\u00a0Emacs"},{"title":"The 1-Page Marketing\u00a0Plan","category":"Non-technical/Entrepreneurship","url":"1-page-marketing-plan.html","date":"19 November 2020","tags":"marketing, book ","body":"Introducti Marketing three\u00a0phas (prospect) - During (lead) - buy first\u00a0time After (customer) - trust you, buy regularly, and\u00a0refer new\u00a0custom Marketing strategy, 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 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","category":"Non-technical/Entrepreneurship","url":"marketing-101.html","date":"19 November 2020","tags":"marketing, growth ","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. realising though, still learn spheres. great developer deeply meaningful me. literally bucket list item intend writing code long live. no point creating products no knows they\u00a0exist where marketing positionin comes in. Right now feels nothing users, validate idea, position product. These super necessary super\u00a0unkn meta level, confronted lost benefits working co-founder having friends doing similar things. faster progress efficientl part a\u00a0communit Working isolation does advantages though. 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 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, 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 covered 90% distance required 50%. exhausting here journey"},{"title":"Pippip.Email","category":"Non-technical/Entrepreneurship","url":"pippip.email.html","date":"28 October 2020","tags":"pippip ","body":"PipPip 6 weeks ago had idea product whilst reading news\u00a0artic great writing sending important messages separated, write something long needed send it, sending happen right without having 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","category":"Non-technical/Social","url":"between-clients.html","date":"8 October 2019","tags":"freelance ","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 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","category":"Technical/Data","url":"btc-fork-analysis.html","date":"2 September 2019","tags":"bitcoin, blockchain, litecoin, dogecoin, bitcoin cash, bitcoin sv, finance ","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 rough ideas\u00a0were Compare 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. his research outstandin particular 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 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 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 size 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 function code_toggl { (code_show } else { } code_show =! code_show } $( document analysis made Python. toggle code 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( argument string, Buffer, ArrayBuffe Array, Array-like Object. Received \"+typeof allocate Buffer 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 Buffer Uint8Array Received '+typeof t);if(void range 0;for(var 0)}var write outside buffer encoding: M(t,e,r){v access beyond buffer argument Buffer 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 size 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'\",\" function (!(\"+l.joi && \")+\")) throw Error('cwi Arrays {\"),e.push (!(\"+c.joi && \")+\")) throw Error('cwi Arrays 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 r e=[];for(v r e=[];for(v r 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 r 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 function n}function $i(t,e){va 1;var n(t,n){var function 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 function 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 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 function t(e,r){var 2:return function function 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 = scale * 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 * view * * 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 * view * 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 buffer 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 * view * * 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 function 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 // Scale vector magnitude stay constant with\\n // & view changes.\\n normal;\\n XYZ = * (tubeScale * vector.w * position.w normal);\\n tubePositi = * 1.0) + vec4(XYZ, 0.0);\\n\\n //Lighting geometry parameters = view * /= = lightPosit - f_eyeDirec = eyePositio - f_normal = * // m_position = * 1.0);\\n t_position = view * 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 * view * 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 * view * 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 function 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 buffer 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. 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 r 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 r 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 r 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 alpha = 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: define color\\n#pr mapbox: define main() {\\n #pragma mapbox: initialize color\\n #pragma mapbox: initialize opacity\\n\\ gl_FragCol = * gl_FragCol = mapbox: define color\\n#pr mapbox: define main() {\\n #pragma mapbox: initialize color\\n #pragma mapbox: initialize opacity\\n\\ gl_Positio = u_matrix * vec4(a_pos 0, mapbox: define mapbox: define v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - alpha = 1.0 - 1.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = mapbox: define mapbox: define 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: define 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 // distance outline alpha dist = length(v_p - alpha = 1.0 - 1.0, dist);\\n\\n gl_FragCol = mix(color1 color2, u_mix) * alpha * gl_FragCol = mapbox: define 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: define 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: define 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: define base\\n#pra mapbox: define mapbox: define 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: define base\\n#pra mapbox: define mapbox: define 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: define base\\n#pra mapbox: define 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: define base\\n#pra mapbox: define 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 size (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 // scale factor pow(2, (u_zoom - u_maxzoom) * a) where arbitrary value\\n // Here a=0.3 works expression below. \\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 // scale slope exponentia based intensity, calculatio similar to\\n // exponentia interpolat function 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * scale * 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 view squishes stretches extrude\\n = = / gl_Positio * v_gamma_sc = / v_width2 = vec2(outse mapbox: define blur\\n#pra mapbox: define 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 / * alpha = 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale mapbox: define blur\\n#pra mapbox: define mapbox: define mapbox: define mapbox: define 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 points up, -1 points down\\n = v_normal = normal;\\n\\ // these applied JS native code 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * scale * 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 view squishes stretches extrude\\n = = / gl_Positio * v_gamma_sc = / v_width2 = vec2(outse sampler2D mapbox: define blur\\n#pra mapbox: define 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 / * alpha = 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 = * alpha * gl_FragCol = floor(127 / 2) == 63.0\\n// maximum allowed miter limit 2.0 moment. extrude is\\n// stored byte (-128..127 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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: define blur\\n#pra mapbox: define mapbox: define mapbox: define mapbox: define 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 points up, -1 points down\\n = v_normal = normal;\\n\\ // these applied JS native code 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * scale * 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 view squishes stretches extrude\\n = = / gl_Positio * v_gamma_sc = / v_linesofa = a_linesofa v_width2 = vec2(outse sampler2D mapbox: define color\\n#pr mapbox: define blur\\n#pra mapbox: define mapbox: define width\\n#pr mapbox: define 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 / * alpha = 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 alpha *= 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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: define color\\n#pr mapbox: define blur\\n#pra mapbox: define mapbox: define mapbox: define mapbox: define width\\n#pr mapbox: define 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 points up, -1 points down\\n = v_normal = normal;\\n\\ // these applied JS native code 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) + // Scale extrusion vector down width\\n // vertex.\\n dist =outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n offset2 = * a_extrude * scale * 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 view 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 scale texture coordinate buffer\\n // arbitraril high preserve adequate precision rendering. // EXTENT our tile buffer pos coordinate // math modifying either consistent v_pos0 = / 8192.0) - 0.5) / u_buffer_s ) + 0.5;\\n v_pos1 = (v_pos0 * + sampler2D mapbox: define main() {\\n #pragma mapbox: initialize opacity\\n\\ alpha = opacity * gl_FragCol = v_tex) * gl_FragCol = PI = bool bool u_size_t; // interpolat zoom stops size composite u_size; // size both zoom feature bool mapbox: define 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 size = mix(a_size a_size[1], u_size_t) / 10.0;\\n } else && {\\n size = a_size[0] / 10.0;\\n } else && {\\n size = u_size;\\n } else {\\n size = u_size;\\n }\\n\\n projectedP = u_matrix * vec4(a_pos 0, 1);\\n = // comments distance_r = ?\\n / :\\n / = clamp(\\n 0.5 + 0.5 * 0.0, // Prevents oversized near-field symbols tiles\\n 4.0);\\n\\n size *= fontScale = u_is_text ? size / 24.0 : size;\\n\\n = 0.0;\\n {\\n // 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: define mapbox: define mapbox: define mapbox: define mapbox: define 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; size = v_data1.y; fade_opaci = fontScale = u_is_text ? size / 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 alpha = - 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 size composite u_size; // size both zoom feature mapbox: define mapbox: define mapbox: define mapbox: define mapbox: define 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 size = mix(a_size a_size[1], u_size_t) / 10.0;\\n } else && {\\n size = a_size[0] / 10.0;\\n } else && {\\n size = u_size;\\n } else {\\n size = 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 size *= fontScale = u_is_text ? size / 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 function 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, = *= alpha * 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 * scale + translate\\ + positionFr * scale + + position * scaleFract + positionFr * = vec4(posit * 2.0 - 1.0, depth, = / *= 1\\n\\nvaryi main() = points 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 *= alpha * = 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 alpha 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 r 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 r 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 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 r 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 r t)r 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 scale scale 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 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 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 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","category":"Technical/Developer Tools","url":"shell.html","date":"14 February 2019","tags":"shell, unix, zsh, bash, profiling ","body":"Opening shell annoyingly slow. terrible, enough notice. a\u00a0niggle. wanted 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 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 proccesses causing greatest delays. done something zsh -xv enables verbose output xtrace. creates tonne output, doesnt inlcude timestamps summary subprocces required run, i.e. order Add zmodload zsh/zprof start .zshrc zprof very end. Now start zsh 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","category":"Technical/Cryptocurrencies","url":"bitcoin-lightning.html","date":"24 January 2019","tags":"bitcoin, lightning, crypto ","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 working unix operating system tried move swap disk wasnt formmated as\u00a0ext4\u2026 Anyway, opened closed channels, connected peers, made transactio even bought stickers node these\u00a0deta Alias: Public Key: IP address: 85.145.183 Port: 9735 Lightning Lightning Interestin to\u00a0do"},{"title":"Sync a BTC node,\u00a0quickly","category":"Technical/Cryptocurrencies","url":"sync-bitcoin-core-node.html","date":"13 October 2018","tags":"bitcoin, btc-core, blockchain ","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","category":"Non-technical/Entrepreneurship","url":"bakkerij.html","date":"11 June 2018","tags":"coworking, netherlands, haarlem ","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","category":"Technical/Cryptocurrencies","url":"prediction.html","date":"7 June 2018","tags":"gnosis, prediction, markets, brexit, betting ","body":"Predicting port traffic Background prediction market allows 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 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 reflect perceived probabilit outcomes. Helpfully, token correspond relative probabilit outcome occurring allows simple interpreta results. reward holding share correspond correct outcome $1, present share 50 cents, market\u2019s estimate likelihood outcome occurring is\u00a050%. Shares traded continuous trading occurs over probabilit outcomes change informatio becomes known, changing 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 quantities vehicles entering port3 - example four (or more) categories Less 8000, 8000 11000, 11000 14000, 14000. relative 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 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, 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 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","category":"Non-technical/Learning","url":"reading-april-2018.html","date":"4 June 2018","tags":"reading, learning ","body":"Articles Mental models comprehens list organised around 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 highlights potential disconnect mental health & business, publicity & success, success & happiness. internet seem intimate ultimately thin view 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 no longer monopoly creation monetary systems, 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","category":"Technical/Developer Tools","url":"rys-git-tutorial.html","date":"1 June 2018","tags":"git, rys, tutorial, ryan hodson ","body":"tracking changes collection files, Git ubiquitous solution. free, robust, comprehens plethora resources easy to\u00a0find. usually 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 learn Git come across. simple, practical, clear. reader learns Git creating maintainin simple website. gives Git commands meaningful context, makes lot easier remember the\u00a0future tutorial 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 the\u00a0guide. Unfortunat these links no longer work. Therefore going materials available here continue useful. author touch, please do. I\u2019d keep great resource available others benefit from\u00a0it. .epub .pdf versions available to\u00a0downloa 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","category":"Technical/Cryptocurrencies","url":"buying-btc.html","date":"7 December 2017","tags":"bitcoin ","body":"Recently few friends asked buy Bitcoin. financial advisor, here few come to\u00a0mind: invest can\u2019t afford to\u00a0lose. 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 important, putting something care risky situation (it risky) experience anxiety excitement control psychology identity 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. why 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 correct. Prices fall. chart top page shows 20 55 moving average compared daily price. opinion early January returned 20 55 average 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. means, google (Point\u00a08)."},{"title":"Live near the\u00a0ocean","category":"Non-technical/Journal","url":"ocean.html","date":"23 November 2017","tags":"water ","body":"California Dorset Acapulco Dublin"},{"title":"Pangea","category":"Technical/Cryptocurrencies","url":"pangea.html","date":"22 November 2017","tags":"bitnation, pangea ","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 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, incentivis citizens receiving rewards doing good, rather coerced threat punishment bad\u00a0behavi platform fulfil vast unmet need, particular countries whose legal systems function 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. more, visit website."},{"title":"Bitcoin compared to\u00a0gold","category":"Technical/Cryptocurrencies","url":"bitcoin-vs-gold.html","date":"21 November 2017","tags":"bitcoin, gold, safe haven ","body":"safe haven asset something buy during economic uncertaint Historical safest asset buy gold. anything inherently special gold, believe best long term method storing\u00a0va believe gold special assume future believe it\u2019s\u00a0speci Criteria safe haven\u00a0asse safe-haven asset fulfil 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, 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, consider precious valuable, market small. change confidence awareness increases, eco-system services fundamenta decentrali network ensures Bitcoin can\u2019t regulated manipulate any single government organisati Bitcoin network can\u2019t turned\u00a0off present future rate supply publicly available unchangeab 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 access bitcoin free any Read\u00a0more article, published week after wrote post, looks factors consider evaluating Bitcoin\u2019s value. goes lot detail, relative seen"},{"title":"Hardware\u00a0Wallets","category":"Technical/Cryptocurrencies","url":"wallet.html","date":"8 November 2017","tags":"wallet, crypto, blockchain, bitcoin ","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 code 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, size shape creates bad user experience hardware wallet convenient multiple times day, credit card\u00a0is. Current hardware wallets fit (money) wallet carry any objects pockets. too big bad\u00a0shape. HW wallets look might belong keyring, inconvenie insecure attach credit card keyring true HW wallet. might store keys hook door, never leave wallet overnight. often keep keys money separate keys near house, where buy stuff, money 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 size 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","category":"Technical/Data","url":"algo-trading.html","date":"28 October 2017","tags":"bitcoin, litecoin, ethereum, finance ","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/ SMA through combinatio sma1 sma26\u00a0\u00a0Nex steps: In\u00a0[1]: HTML function code_toggl { (code_show } else { } code_show =! code_show } $( document analysis made Python. you'd code 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 argument l(t)}retur t)throw argument instanceof t)throw argument allocate Buffer 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 buffer argument Buffer 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 buffer 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 size 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'\",\" function (!(\"+l.joi && \")+\")) throw Error('cwi Arrays {\"),e.push (!(\"+u.joi && \")+\")) throw Error('cwi Arrays i(t,e,r){v m,v=new t;var e=[];for(v r e=[];for(v r e=[];for(v r 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 r 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 * view * * 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 buffer 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 = view * 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 * view * * 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 * view * * 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 * view * * 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 * view * * 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 * view * * 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 function 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 scale scaleHi, scaleLo, translateH sampler2D charColor, main() {\\n charColor = vec2(color / 255., 0));\\n borderColo = vec2(color / 255., 0));\\n\\n gl_PointSi = size * pixelRatio pointSize = size * 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, alpha = 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 * view * 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 function -1 => 1\\n // texture normal, x points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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 * alpha = 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 alpha *= 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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 points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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 * alpha = 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 alpha *= 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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 points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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: define mapbox: define v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - alpha = 0.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = lowp\\n#def mapbox: define mapbox: define 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 // distance outline alpha dist = length(v_p - alpha = 0.0, dist);\\n \\n\\n gl_FragCol = mix(color1 color2, u_mix) * alpha * 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 alpha = 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 * alpha = - 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 points a,b along line\\n // project points 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 alpha = 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) * alpha * 0.25;\\n }\\n\\n >= u_maxzoom) {\\n gl_FragCol = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 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. glyphs rendered tile. exceeds allowed extent, reduce vector tile buffer 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 r 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 r 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. Error(\"Use public access token (pk.*) GL JS, secret access token (sk.*). 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 function 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 code 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 buffer data\")}els shape\");va buffer 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 buffer 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 buffer 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 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 buffer 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 buffer 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 buffer 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 buffer 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 r 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 r 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 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 animating it. details, 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 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 r t)r 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 r 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 scale scale 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 scale scale 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 function a(o,!0);va u=new Error(\"Can 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 function y(t){var e}function b(t,e,r,n) e)throw argument expected unwanted i}var r=new t};var e=[];for(v r 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 argument l(t)}retur t)throw argument instanceof t)throw argument allocate Buffer 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 buffer argument Buffer 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 buffer 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 size 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'\",\" function (!(\"+l.joi && \")+\")) throw Error('cwi Arrays {\"),e.push (!(\"+u.joi && \")+\")) throw Error('cwi Arrays i(t,e,r){v m,v=new t;var e=[];for(v r e=[];for(v r e=[];for(v r 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 r 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 * view * * 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 buffer 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 = view * 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 * view * * 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 * view * * 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 * view * * 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 * view * * 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 * view * * 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 function 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 scale scaleHi, scaleLo, translateH sampler2D charColor, main() {\\n charColor = vec2(color / 255., 0));\\n borderColo = vec2(color / 255., 0));\\n\\n gl_PointSi = size * pixelRatio pointSize = size * 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, alpha = 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 * view * 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 function -1 => 1\\n // texture normal, x points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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 * alpha = 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 alpha *= 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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 points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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 * alpha = 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 alpha *= 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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 points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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: define mapbox: define v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - alpha = 0.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = lowp\\n#def mapbox: define mapbox: define 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 // distance outline alpha dist = length(v_p - alpha = 0.0, dist);\\n \\n\\n gl_FragCol = mix(color1 color2, u_mix) * alpha * 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 alpha = 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 * alpha = - 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 points a,b along line\\n // project points 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 alpha = 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) * alpha * 0.25;\\n }\\n\\n >= u_maxzoom) {\\n gl_FragCol = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 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. glyphs rendered tile. exceeds allowed extent, reduce vector tile buffer 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 r 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 r 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. Error(\"Use public access token (pk.*) GL JS, secret access token (sk.*). 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 function 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 code 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 buffer data\")}els shape\");va buffer 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 buffer 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 buffer 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 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 buffer 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 buffer 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 buffer 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 buffer 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 r 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 r 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 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 animating it. details, 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 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 r t)r 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 r 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 scale scale 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 scale scale 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 function 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 define 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 Bitcoin GBP, Ethereum Litecoin Bitcoin. these dataset Quandl, copied relevant frame contained everything interested Ethereum Litecoin GBP product respective prices Bitcoin Bitcoin\u2019s 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 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 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 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 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 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 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 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 digital assets above shows high degree variance, visualized history wanted smooth somehow. plotted simple moving average became curious types average look like. noticed longer shorter SMAs (Simply Moving Averages) cross occasional wondered useful code 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 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. algorithms performanc consistent large losses occur. show upfront cost needed realise the\u00a0return Net gains w/ 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 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]: # function 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]: # function 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 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","category":"Non-technical/Learning","url":"chartered.html","date":"19 October 2017","tags":"icaew, aca, accounting ","body":"Earlier year qualified chartered accountant Qualificat requires passing 15 exams gaining 3150 hours celebrate passing exams verify success, ICAEW print names everyone passed advert Financial Times. happened 26\u00a0January"},{"title":"Coworking in\u00a0Dublin","category":"Non-technical/Social","url":"coworking.html","date":"15 September 2017","tags":"freelance, coworking, dublin, element78, regus, officesuites, cocreate, studio9, glandore, tcube ","body":"Last week arrived Dublin had two days coworking space. ran around Dublin visiting as\u00a0possibl 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. 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 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 hoping somewhere community, inspiring architectu character. offered free a\u00a0trial. \u20ac200 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 better"},{"title":"Bitnation","category":"Technical/Cryptocurrencies","url":"bitnation.html","date":"14 September 2017","tags":"bitnation, blockchain, disintermediation, identity, consulting, finance ","body":"I\u2019m\u00a0Consul Next week begin working Bitnation finance officer. excited ambitious project technology something innovative and\u00a0valuab Bitnation Bitnation\u2019 purpose offer services government do, 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 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 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 significan improvemen Bitnation wants platform where voluntary nations created administer where 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","category":"Technical/Cryptocurrencies","url":"ethereum-parity-multisig-wallet.html","date":"12 August 2017","tags":"ethereum, parity, blockchains, fintech, multi-sig, wallet ","body":"recently multi-sig Ethereum wallet couldn\u2019t clear instructio Here are, hope these instructio useful someone looking get\u00a0starte You\u2019ll 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 creating the\u00a0wallet Parity their\u00a0webs Integrated directly Web browser, Parity fastest secure interactin bunch stuff Parity including mining Ether, manage accounts, interact dapps, send/recei 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 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 view wallets balance. done adding watch\u00a0wall Process: Accounts tab > + Wallet > Watch wallet > enter address signatorie now able view 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 \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, 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","category":"Technical/Data","url":"macro-btc.html","date":"3 August 2017","tags":"bitcoin, blockchain, distributed applications, finance ","body":"Table transactio confirmati block size (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 function code_toggl { (code_show } else { } code_show =! code_show } $( document analysis made Python. you'd code 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 argument l(t)}retur t)throw argument instanceof t)throw argument allocate Buffer 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 buffer argument Buffer 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 buffer 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 size 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'\",\" function (!(\"+l.joi && \")+\")) throw Error('cwi Arrays {\"),e.push (!(\"+u.joi && \")+\")) throw Error('cwi Arrays i(t,e,r){v m,v=new t;var e=[];for(v r e=[];for(v r e=[];for(v r 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 r 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 * view * * 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 buffer 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 = view * 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 * view * * 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 * view * * 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 * view * * 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 * view * * 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 * view * * 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 function 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 scale scaleHi, scaleLo, translateH sampler2D charColor, main() {\\n charColor = vec2(color / 255., 0));\\n borderColo = vec2(color / 255., 0));\\n\\n gl_PointSi = size * pixelRatio pointSize = size * 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, alpha = 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 * view * 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 function -1 => 1\\n // texture normal, x points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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 * alpha = 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 alpha *= 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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 points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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 * alpha = 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 alpha *= 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 scale regular normals length 63, but\\n// \\\"special\\ normals bigger length (of 126 in\\n// case).\\n// #define scale 63.0\\n#def scale scale distance 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 points straight up/down round cap\\n // y points up, -1 points 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) + // Scale extrusion vector down width\\n // vertex.\\n dist = outset * a_extrude * scale;\\n\\n // Calculate drawing side actual line.\\n // creating vector points towards extrude, rotate\\n // drawing round end points (a_directi = -1 1) since their\\n // extrude vector points another direction. u = 0.5 * a_directio = 1.0 - abs(u);\\n = u_offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\\n\\n // Remove texture bit position 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: define mapbox: define v_pos;\\n\\n main() {\\n #pragma mapbox: initialize #pragma mapbox: initialize opacity\\n\\ dist = length(v_p - alpha = 0.0, dist);\\n gl_FragCol = outline_co * (alpha * gl_FragCol = lowp\\n#def mapbox: define mapbox: define 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 // distance outline alpha dist = length(v_p - alpha = 0.0, dist);\\n \\n\\n gl_FragCol = mix(color1 color2, u_mix) * alpha * 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 alpha = 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 * alpha = - 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 points a,b along line\\n // project points 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 alpha = 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) * alpha * 0.25;\\n }\\n\\n >= u_maxzoom) {\\n gl_FragCol = vec4(0.0, 0.0, 1.0, 1.0) * alpha * 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. glyphs rendered tile. exceeds allowed extent, reduce vector tile buffer 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 r 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 r 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. Error(\"Use public access token (pk.*) GL JS, secret access token (sk.*). 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 function 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 code 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 buffer data\")}els shape\");va buffer 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 buffer 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 buffer 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 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 buffer 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 buffer 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 buffer 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 buffer 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 r 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 r 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 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 animating it. details, 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 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 r t)r 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 r 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 scale scale 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 scale scale 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 size 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 size 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 test query transactio awaiting confirmati quantify valid fee rate are\u00a0offeri Average block size (daily, MB)\u00b6Each block Bitcoin network had maximum size 1MB 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 size 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', 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 size began sharp decrease July 2nd, median transactio confirmati began quick reduction. July 2nd unconfirme transactio had already fallen back (Not transactio 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 size 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 size 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 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 size fee proportion size (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 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 size 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 size unconfirme transactio pool weeks. variation transactio fee lot smaller variation size 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 Bitcoin increases. Bitcoin increases, resources allocated mining increasing profitable Also, decide buy Bitcoin becoming valuable. leads transactio even miners competing confirm transactio claim rewards. increase supply drives down transactio confirmati fee\u00a0rate. Lets 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 size unconfirme transactio pool. Interestin stronger correlatio transactio created 100 popular addresses (0.54) unpopular addresses (0.46). Possible reasons Finally, lets consider influence Bitcoin size 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, correlatio just 0.42 size unconfirme transactio coming popular addresses positively correlated (0.41) Bitcoin price, suggesting Bitcoin increases trading activity exchanges increases. Transactio less popular addresses inversely correlated Bitcoin (-0.31) Bitcoin 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 size 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 size 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","category":"Non-technical/Journal","url":"corporate.html","date":"10 July 2017","tags":"career, corporate, london ","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 arrived had no idea London working corporate like. coming academia, motivation moving finance summed two\u00a0points Understand 2008 paid mostly skills (math) in\u00a0enginee 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 own knowledge network 2014, arrived high opinion employer view 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 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 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 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, 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 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. glad finally 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 long term plans (or financial ability) stay city. We\u2019re looking move move fast possible. leave London partly attitudes priorities my\u00a0own\u2026 Back office spent few months figuring organised, teams operated decisions made. took year feel understood worked, 1.5 years feel aspects job certainty. difference spoken about, experience performanc matters behaviour defined self-inter previous environmen worked \u2014 academia isn\u2019t any different1 constructi industry certainly isn\u2019t. wonder endure they\u2019ve experience anything else, normal, necessary. myself wishing kinder other, structures incentivis Corporate finance usually appears clean well presented. appear dependable capable. culture sanitised there\u2019s lot pressure conform - clothes accessorie wear jokes tell the\u00a0cantee came 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 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","category":"Technical/Cryptocurrencies","url":"blockchain-networks.html","date":"8 July 2017","tags":"blockchains, digital currencies, distributed ledger technology, distributed consensus, sybil ","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 (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 network grows, transfer coins user another becomes harder track. every users ledger identical opportunit arises coins already spent pay someone doesn\u2019t 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 accepted ledger (Unanimous consensus) save reduce requiremen 50% users validate transactio 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 locations or\u00a0timezon possible members therefore proportion users real identity user is\u00a0unknown these cases peer-to-pe network required where transactio users require approval users 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 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 verificati message acceptable hash try slightly messages. example, nonce may zeros. arbitrary, longer nonce difficult becomes hash fits hash random list characters altering even single part hashed result completely hash value. Therefore no predict hash value. generate hash required none repeatedly alter hashed (even just character) until hash required features randomly achieved. expensive achieve, simple to\u00a0verify. method, user seeks verify transactio broadcast result (once they\u2019ve verified transactio repeatedly try messages until randomly 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 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 verified transactio verify payment received valid. Furthermor high proportion original transactio spent transactio fee (for verificati not\u00a0effici These problems avoided combining multiple transactio verifying 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 pending transactio been\u00a0accep Competing validate blocks user choose transactio verify, verify beginning proof-of-w requiremen hopefully collecting transactio fees. lack order around transactio verificati fine increase probabilit claim transactio fees associated collection transactio (a block) spend CPU power searching required partial two users complete block approximat blockchain look 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 time, takes subsequent blocks vary due random behaviour proof-of-w algorithm. Therefore chains 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 accepting transactio increase required verify transactio reduce probabilit longer chain undo block containing transactio in\u00a0questio"},{"title":"Move","category":"Non-technical/Journal","url":"move.html","date":"8 July 2017","tags":"lifestyle ","body":"Ambition Since 15, ambitions entreprene joke dad buying him nice boat one\u00a0day. Life far predominan education, stage over now. walking away come 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 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 better decisions produce best under pressure, thrive perceived underdog. accept without reason foolish. Whilst clear plan, direction, goal, (I them) got skills make. I\u2019ll never best work, productive combinatio skills experience cog someone safer employee self-emplo guess removing risks difference generate employer you\u2019re paid. those risks overpriced capable realise. Sometimes walk situation 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","category":"Non-technical/Journal","url":"flee.html","date":"4 July 2017","tags":"poetry ","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","category":"Non-technical/Entrepreneurship","url":"investment.html","date":"9 June 2017","tags":"lis, fintech, startup, founder ","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 to\u00a0grow. Startups money ambitious credible growth\u00a0pla typical stake VC roughly\u00a020 VC\u2019s exit least 100m, otherwise business models work\u00a0out. $10m seem lot founder 30% stake, enough attract VCs, aim\u00a0higher to\u00a0pitch Identify specific real\u00a0needs Size of\u00a0market Why\u00a0now? clear competitiv advantage - why no-one else do\u00a0this? Market 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 scale and\u00a0win"},{"title":"How to be an ambitious founder in\u00a0Europe","category":"Non-technical/Entrepreneurship","url":"ambitious.html","date":"9 June 2017","tags":"lis, startup, fintech, europe ","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 successful fail. lot dumb successful clever founders can\u00a0fail. important learn leverage effectivel lose anything else back never recover you\u2019ve already\u00a0sp 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 failure rate companies raised $1m - $10m, rate those raised\u00a0$10 lose money project learn experience leverage that\u00a0learn \u2026 never back you\u00a0spent. Zombies companies enough money survive enough provide joy company - aim high\u00a0and\u2026 Starting company big deal, starting marriage. hard doing, problem trying solve, 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) start complainin deciding can\u2019t be\u00a0bothere"},{"title":"The Lisbon Investment\u00a0Summit","category":"Non-technical/Entrepreneurship","url":"lis17.html","date":"9 June 2017","tags":"fintech, startup, europe, lis ","body":"attended Lisbon Investment Summit June 6 7 part Oula.la InsurTech startup team John Sullivan. startup conference I\u2019d arrived hoping useful conversati understand Fintech startup spaces Europe. usual wanted focus tech, finance was\u00a0there well outstandin sessions high ratio investors startups. made talking VCs, bankers M&A lawyers 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 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 working blockchain space several years. 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. refreshing hear politician extol virtues multinatio cooperatio bringing 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","category":"Technical/Web","url":"pelican2.html","date":"1 June 2017","tags":"pelican, jinja, python, twitter, facebook, blog, static site ","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 size small possible download quickly. site uses CloudFlare free CDN features hopefully no matter view 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 share article they\u2019re hurry might hard right words, why provide ready-made tweet. text editable a\u00a0suggesti text post makes sense specify writing article. article \u2018summary\u2019 too long, Pelican supports arbitrary meta-data tags. assumed Jinja pick picks \u2018standard\u2019 meta-data added function def tweet = 'tweet'): tweet = quote(('%s % else: Once function working simply case calling function 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 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 `` `` `` `` `` ` 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 %'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 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 correct text image picked initially frustrated tags having any effect. Facebook crawls site saves finds. take fresh look page meta tags, tell Facebook crawl page again, Facebook sharing buttons below, please click what\u00a0happe Note: article describing began Pelican here"},{"title":"Blockchains from the ground up: Part\u00a01","category":"Technical/Cryptocurrencies","url":"blockchain-introduction.html","date":"25 May 2017","tags":"blockchains, digital currencies, distributed ledger technology, public key cryptography ","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 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). 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 telling truth. person\u2019s word against the\u00a0other. Lizzie realises suggests improvemen - 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 encrypt decrypt message. private encrypt anybody decrypt (because public publicly available) whilst clearly terrible keep secret great verify 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 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 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 debt wealthy. Lizzie owes apples, owed bananas apple. Does mean her fruit business losing money making money? cannot say. able 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 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 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 customer 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, freely \u201ccoins\u201d carry negative amounts \u201ccoins\u201d. result \u201ccoin\u201d plummeting Therefore creation (and conversion fruit) controlled Our examples far include people. lot network wouldn\u2019t feasible insist everyone present online transactio added list (the chain) transactio However allow transactio added whilst offline opportunit fraud. reasons why, solution problems described part 2."},{"title":"London Rent vs. London\u00a0Salaries","category":"Non-technical/Journal","url":"london.html","date":"12 May 2017","tags":"london, rent ","body":"Living London expensive, everyone UK knows this. Everyone knows mostly due 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 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. 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 obvious increase wealth buy property. Mortgage repayments cheaper rent, property increases over time. Double win. big hurdle overcome 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 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 bedroom flat less \u00a31000/mont According Rightmove, estate agent useful statistics"},{"title":"Introduction to the \u00c6ternity blockchain\u00a0project","category":"Technical/Cryptocurrencies","url":"aeternity.html","date":"5 May 2017","tags":"\u00e6ternity, dlt, digital currencies, finance, blockchains ","body":"These notes \u00e6ternity blockchain project, 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 types of\u00a0node Sharding Smart Contracts smart contract 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 code 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 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 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 blockchain project written in\u00a0Erlang types of\u00a0node \u00e6ternity network contain nodes 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 digit shard gets validators validator validates shard\u00a0only Contracts transactio within shard as\u00a0normal Contracts transactio across shards require alternativ techniques based"},{"title":"The \u00c6ternity ICO: My\u00a0experience","category":"Technical/Cryptocurrencies","url":"aeternity-ico.html","date":"30 April 2017","tags":"fintech, finance, digital currencies, blockchains, dlt, \u00e6ternity, ico ","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 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. 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 close purchasing either Bitcoin Ether immediatel 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 48 hours (IIRC) after registerin reasonable enough unless you\u2019re a\u00a0hurry. Conclusion Once had few Ether name, rest process simple. delighted visit Etherscan. view 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","category":"Technical/Web","url":"pelican.html","date":"28 April 2017","tags":"pelican, blog, python, static site ","body":"began blogging 2016, became aware blogs designed. favorting blogs had simple designs made easier focus content, loaded fast. (E.g. CuriousGnu wanted blog, too. I\u2019d Wordpress build publish blog great 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. happy these tools future projects\u00a0t HTML HTML quirky intuitive. Tags sense, comments laborious learning google relatively quick. Whatever 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 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 view changes locally 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 working Git challenged me, still feel 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. got there. created afternoon blur frustrated google queries 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 started working Pelican, minifying css JavaScript too advanced. once Pingdom Google Pagespeed started criticisin multiple .css files, accepted the\u00a0challe Conclusion super happy wth websites design speed. designed it, learnt ton useful stuff along the\u00a0way. Update: second post blogging Pelican here."},{"title":"Analysing a personal\u00a0library","category":"Technical/Data","url":"books.html","date":"1 February 2017","tags":"data analysis, python, isbn ","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 function code_toggl { (code_show } else { } code_show = !code_show } $( document window.onl = function() //time millisecon 10000) }; ''') Out[1]: function code_toggl { (code_show } else { } code_show = !code_show } $( document toggle visibility code blocks, click here. Set-up settings some\u00a0packa In\u00a0[2]: # Display plot results inline, separate window %matplotli inline %pylab inline # size 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 arranged cells are\u00a0comple In\u00a0[4]: df.head() Out[4]: Location Subject Title Author Publisher ISBN? Shelf Pages Date HR Islam Islamic Invasion R 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( 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 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 Date PubYear HR Islam Islamic Invasion R 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 View 5 oldest\u00a0tit In\u00a0[12]: df['PubYea = df2 = != 0.0] Out[12]: Location Subject Title Author Publisher ISBN? Shelf Pages Date PubYear 4753 Lib Christ\u2019s own country Dom Ernest Graf Burns Oates Sh.4.5 302 Gift 1999-07-30 1037 3043 StM 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 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 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 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","category":"Technical/Data","url":"fakegl.html","date":"6 January 2017","tags":"data analysis, finance, journals, reconciliation, accounting, trial balance, general ledger, python ","body":"involves processing lot General Ledgers wanted build test various automation analytical techniques workflow improved. order free fun way, fake data, build process generate fake General Ledger (GL) correspond Trial Balance (TB). Motivation didn\u2019t 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 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 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 code 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 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]: # ****** accounts GL ********* x = 111 # ****** journals GL j = 15713 # Setup posting date d0 = '20160101' # day, generated over year. d1 = \"%Y%m%d\") # ****** Distributi lines per journals ********** jl_1 = 21 # mean jl_2 = # variance j_l = lambda x, y: # ****** 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' # 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","category":"Technical/Data","url":"reconciliation.html","date":"3 January 2017","tags":"finance, accounting, journals, general ledger, trial balance, python ","body":"working financial ledgers lot recently. python code below shows automated workflow import, process report reconcilia Trial Balance (TB) General Ledger (GL). fake data, script fine real fields renamed appropriat real additional fields needed considered these vary depending size 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 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 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","category":"Technical/Data","url":"spotify.html","date":"22 December 2016","tags":"music, spotify ","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, discover any 1. Notebook set-up\u00b6 In\u00a0[1]: # Display plot results inline, separate window %matplotli inline %pylab inline # size 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]: # View 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 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, songs listen longer than\u00a0that. Spotify\u2019s UI understand light details, initially wondered calculate average song length. just eyeballed (\u2018scanning analytics. realised sort playlist song length pick median, although I\u2019d 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 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 11 Koop Island Blues Sailor's Bonnet Name: Name, dtype: int64 shows whilst \u2018top tracks\u2019 listened tracks, Spotify either uses 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 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 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. 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 music listen times. expect listening habits 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, 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!","category":"Technical/Developer Tools","url":"vim.html","date":"1 December 2016","tags":"vim ","body":"Vim text editor renowned efficiency keyboard shortcuts. based Vi text editor 1970\u2019s. released 1991 still developed today. comes pre-instal Unix systems (including MacOS) run the\u00a0termin Vim famous another 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 approach text editing 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","category":"Technical/Developer Tools","url":"autumn-bin-and-path.html","date":"1 December 2016","tags":"unix ","body":"Two small 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 programme there, executes\u00a0i BIN Bin Binary, Bin in\u00a0Trash. bin folders contain binary files, programmes ready be\u00a0run. run \u201cecho $PATH\u201d Terminal, 9 folders called bin, convention contain binaries. just folders, OS look asked run"},{"title":"Introduction to my doctorate research -\u00a0Silos","category":"Technical/Other","url":"silos.html","date":"2 October 2016","tags":"doctorate, granular flow, granular materials, phd, research, engineering, silo, thesis, vienna ","body":"Background Spring 2010 until Autumn 2013, PhD candidate living Vienna, Austria working University Natural Resources Life Sciences. 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 broad class materials encountere everyday - salt, pills, breakfast cereal, sand, rice, soil, landslides salt granular materials. ubiquitous occur 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 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 size 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 you\u2019re planning storing stuff moon, useful step towards explaining exactly why bulk granular materials behave 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","category":"Technical/Cryptocurrencies","url":"encryption.html","date":"30 August 2016","tags":"encryption, rsa, dlt, blockchains, bitcoin, digital currencies, public key cryptography ","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 code 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 function product two prime numbers. two random prime numbers chosen, trivial product. However product two numbers known, relatively difficult either factors (this noticed 1874, \u201cCan reader say two numbers multiplied together produce 8,616,460, 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 function reversing it, better RSA algorithm below uses factorisat foundation security, factorisat hardest problem solve relative size keys required. Algorithms developed factor products large prime numbers, efficient randomly guessing possible factors. greater size primes factored, efficient these algorithms become, therefore difference difficulty executing function (multiplyi two large primes) reversing becomes smaller size 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 function is\u00a0require Overview RSA\u00a0algori Named after founders (Ron Rivest, Adi Shamir, Leonard Adleman), RSA 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 knows guesses able decrypt Calculate \\(n =\u00a0pq\\) 2. 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 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 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 define 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 numbers following example tutorials here here.\u00a0\u21a9 { var align = \"center\", indent = \"0em\", linebreak = \"false\"; (false) { align = (screen.wi"},{"title":"Digital currencies: the\u00a0basics","category":"Technical/Cryptocurrencies","url":"digital-currencies-the-basics.html","date":"19 August 2016","tags":"bitcoin, cryptocurrencies, cryptography, digital currencies, finance, fintech ","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 believe future, believe does, willing trade real goods services exchange for\u00a0it. 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 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 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 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, order occurred?1 blockchain remarkable technology solve these problems. Future posts consider these problems are\u00a0overco Byzantine Generals problem, nicely described introducti paper\u00a0\u21a9"},{"title":"Spare\u00a0time","category":"Non-technical/Learning","url":"spare-time.html","date":"13 August 2016","tags":"habits, advice, reflection ","body":"list interests consider pursuing. wrote began study last exams mind filled 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 can\u2019t spare time. running 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 thought otherwise. perspectiv long-term less focused. thought reading instead days\u2019 headlines social chatter. remember enjoying benefits thinking keep habit. reasons why Christiani wonderful well summarised sermon. now years later, whilst conviction strong, knowledge bible sadly pretty fuzzy. thinking clouded perspectiv contained media consume conversati part of. strongly suspect acting thinking differentl read bible more, 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 - why, creator universe wants talk share life him. He cares me. makes no sense me, all. God, go 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 through Savage Continent, eye-openin eye-wateri history Europe years after World War 2. Europe through eyes it. However got half though, since April \u201814 never felt had free energy pick back up. change. researcher student, had opportunit develop own pursuits. Since entering corporate world, myself fighting war attrition exert personalit onto my\u00a0lifesty Read fiction\u2026 unconvince end it? it? Maybe just reading wrong authors, going leave now. Sure, gain appreciati place, appreciati comes via fictional characters events, secondary. abstract constructs perspectiv morals\u2026 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. 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 useful. (Same tax system - another surprise). had brief introducti though, 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","category":"Technical/Web","url":"time-until.html","date":"7 August 2016","tags":"applescript, coffeescript, javascript, time until, \u00fcbersicht, widgets ","body":"previous post described introduced CoffeeScri via \u00dcbersicht, desktop widget app OS X, eventually published \u201cTime Since\u201d\u00a0wid Seeing few download widget satisfying soon wondering else publish. pragmatic engineer, seemed clear next widget do: widget calculated since event, next calculate until event. companion \u201cTime Since\u201d improve upon code 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 code 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 function 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 code 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. another useful feature option specify output terms chosen amount, such weeks days. Maybe I\u2019ll the\u00a0future"},{"title":"How to wake up\u00a0early","category":"Non-technical/Journal","url":"how-to-wake-up-early.html","date":"6 August 2016","tags":"productivity, sleep ","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 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","category":"Technical/Developer Tools","url":"Jupyter-ipython-notebooks-pandas.html","date":"3 August 2016","tags":"data, jupyter notebook, pandas, python ","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 myself rerunning entire script multiple times commenting uncommenti multiple lines order understand what\u2019s 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 continuing re-run previous chunk without returning beginning, change code 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","category":"Technical/Data","url":"courseras-data-science-specialisation.html","date":"1 August 2016","tags":"coursera, data science, r ","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, courses strike balance brevity and\u00a0depth. downside courses exclusivel R (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, looking forward setting aside time, working through assignment acquiring useful\u00a0ski"},{"title":"\u00dcbersicht widget: Time\u00a0Since","category":"Technical/Web","url":"ubersicht-widget-time-since.html","date":"30 July 2016","tags":"coffeescript, javascript, time since, \u00fcbersicht, widgets, applescript, time until ","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 after elapsed\u00a0ti Choice expanded abbreviate display\u00a0st Flexible formatting remove zero\u00a0amoun widget called \u201cTime Since\u201d \u00dcbersicht widgets gallery."}]