Math Skill
None
CS Skill
None
Calculations
None
Code
None
TFLOPS
None
Insights
None
Effort
None
Money
None
Muster 0/4
Insight
main
math
cs
special
bonus
options
Logic
Coloring
Numbers
Reading
Graduate
Grade Up
Start Grad School
Grade Up
Start College
Grade Up
Start High School
Grade Up
Start Middle School
Grade Up
Start School
Vacation
Motivational Book
Representation Theory
Topology
Complex Analysis
Linear Algebra
Number Theory
Advanced Calculus
Calculus
Trigonometry
Algebra 2
Algebra
Geometry
Pre-Algebra
Decimals
Arithmetic
Chalkboard
Notebook
Computer
CAS Calculator
Calculator
Test Answers
Math Super Project
Solve Problem
Math Contest
Start Research Project
Tutoring
Calculate
-
Math Research
Haskell
Assembly
Javascript
Algorithms
c++
c
HTML
Python
Logo
Memory
Developer
Dev Tools
Computer
Start CS Super Project
Make Neural Net
Design Language
Create Website
Make Math Solver
Create Game
Write Code
Enter Dimensional Portal
Construct Dimensional Portal
Mathematical Universe Theorem
Riemann Hypothesis
Counterexample to Riemann Hypothesis
Goldbach Conjecture
Navier-Stokes Equation
Impossibility of Navier-Stokes Equation
P=NP
P!=NP
Unique Games Conjecture
Disprove Unique Games Conjecture
Problem Classification Theorem
Enter Computer Matrix
Super Computer
Bot Net
Server
AI Node
Design AI Node
AI Companion
Design AI Companion
Self Editing Program
Design Self Editing Program
Self Correcting Code
Design Self Correcting Code
Code Analyzer
Design Code Analyzer
AI Calculation Focus
AI Code Focus
Reset
Export
Import
Animations
Save game text goes here.
Help support this game's developer
Bitcoin: 1PHWSZgQpu5Hy3VKvEz2giezWxeaxaP9uf
Dogecoin: DScXNsUrMhLwvoQoDSSfvDBNyu15x6mUg9
Paypal:


Talk: Python made my dream come true
Sunday 16th June 09:50 @ T3: Cubiculum (L7)
Hie, I'm Akshat, a Govt. of India recognized Silicon Valley fellow and a Harvard University Conference Scholar. Currently, I'm working on the problem of distracted driving and recently built an Android app (visit: inSessionApp.com) to manage my calls and acknowledging callers while I sleep. I've previously worked at a Thailand based and a California based company. This summers, I'm working with an India based startup as a Software Engineer. Above all this, I love to empower people in my connection.
Talk: PyTorch as a modern scientific computing environment?
Saturday 15th June 17:45 @ T1: Auditorium (L6)
Adam Paszke is an author and maintainer of PyTorch Despite being early in his career he already has a few years of experience working with large organizations like Facebook AI Research and NVIDIA. Currently, he pursues two majors — Computer Science and Mathematics — at the University of Warsaw. His general interests include graph theory, programming languages, algorithmics and machine learning.
Talk: Kill the mutants, protect your code!
Saturday 15th June 16:10 @ T2: Forum (L7)
Alex Khaerov is a development lead at Chainstack, with 9+ years in web services development across diverse domains. His main passion is building robust, high-load and distributed service platforms on top of a multi-cloud environment, utilizing all the power of Python and cloud native services. An organizer of Moscow Python Conf and avid activist of Singapore Python User Group, cloud native enthusiast and member of Kubernetes SG community. In his spare time, he speaks publicly at tech conferences and secretly codes in Python. Huge fan of laptop stickers.
Talk: From 0 to Awesome: How we got Python to supercharge our ML stack
Sunday 16th June 14:05 @ T1: Auditorium (L6)
Studied Math, building systems, loves traveling and puns.
Talk: AIoT: Intelligence on Low Power Microcontroller, with MicroPython
Sunday 16th June 09:50 @ T2: Forum (L7)
CEO of DycodeX - the AIoT enabler in Indonesia. Microsoft Most Valuable Professional (MVP) of Microsoft Azure. 15 years as entrepreneur. A developer, hardware maker, and public speaker.
Saturday 15th June 13:40 @ T3: Cubiculum (L7)
Talk: Functional Programming in Python: Lessons from Haskell and Clojure
Sunday 16th June 13:15 @ T3: Cubiculum (L7)
I am always fascinated about programming languages. In particular, I have long advocated for the use of functional programming over object-oriented programming and a declarative style over an imperative one. Despite having used Python heavily since 2013, groking Scala, Haskell and Clojure really changed my style of writing Python code. I would like to share some of my findings and advocate a functional style of programming in Python. My other interests include Bayesian statistics, Monte Carlo methods and high-performance computing.
I am a co-founder and managing director of Arithmox, a startup offering CTO-as-a-service and growth hacking packages to Indonesian companies. My interest lies in the use of technology and data-driven approaches correctly to drive growth. In a business climate where it is easy to get sucked into the AI hype, I advocate a pragmatic and no-nonsense approach to introducing such technologies into already-running businesses.
Talk: Demystifying Conversational AI with Python
Saturday 15th June 11:10 @ T3: Cubiculum (L7)
I am currently researching in the field of NLP and information retrieval as a project assistant at IIT Delhi. I am a recent graduate, and had been conferred with a degree of Bachelors in technology in Computer Science, in August 2018. I got introduced to the wonders of computer science while pursuing my undergraduate degree, and oh, boy! It was diverse. I was amazed with the profusion of avenues that it opened for me. From natural language chatbots, to biometrics recognition systems, path-planning robots, I found it ever-so encouraging just to be in the game, and with a curious eye, was ready to unearth it all. I can program in multiple languages, Python, C/C++, R, Matlab, Chapel, GoLang, Java , Python being my first love since freshman days!. Recently I have started programming in GoLang, and it happens to be new found love. I am interested in the fields of NLP, ML, AI, having studied them during my senior year, and I wish to work on enhancing healthcare with AI. More specifically I want to work towards making technology come to the the aid of unfortunately or differently abled people, so that they can lead healthy lives. I am inspired by the advancing developments in making computers imitate and understand human language, vision and intelligence and so much more, which I feel can be used to solve challenges that the differently abled people face. I am an avid reader, an eloquent writer, and love to share my experiences with others as well as learn from others. I do love to talk a lot too. A cup of hot chocolate, my laptop and a problem to code on, is what my daily routine sounds like.
Talk: How to build an open source catbot with Python, a 3D printer and a microcontroller
Sunday 16th June 15:45 @ T3: Cubiculum (L7)
My real name is Chanapai Chuadchum my nick name is Korn i was started my work on roobtics since i was 10 on the and i got the thrid place on the competition in Solar innovative contest when i was 11 years old since then i'm dedicated to working on robotics to develop the useful and sophisticated robots to make them life like as most as i can currently i'm studying robotics engineer at the pensylavania university online in Robotics Engineer Master degree Currently i'm trying to make my own company in robotics field to serve humanity as much as possible to eleminate the time that we need to spend on unneccessary thing.
Saturday 15th June 13:40 @ T1: Auditorium (L6)
My name is Charin Polpanumas and I am a data scientist with over five years of track records in Southeast Asia, Japan, and China. I have delivered data products that save millions USD annually at the region's largest online retailer, and currently working to transform the healthcare industry in Thailand. I am one of the main contributors to pyThaiNLP, the most starred Thai NLP library, and the author of thai2fit (formerly thai2vec), the first and current state-of-the-art transfer learning text classification model based on ULMFit.
Talk: Understanding of distributed processing in Python
Sunday 16th June 13:15 @ T1: Auditorium (L6)
Chie Hayashida is a Software Engineer from Japan. She is working at Cookpad.Inc which is the worldwide recipe sharing service. She loves programming and computer science. She is highly skilled with DWH architecture and ML pipelines. She is a contributor to Apache Spark, Tensorflow, Apache Airflow and so on.
Talk: How to meaningfully contribute to Python without being very good at programming
Saturday 15th June 09:05 @ T1: Auditorium (L6)
David Cournapeau is a data scientist. He is the original author of the scikit-learn package, an open source machine learning library in the Python programming language. He is a self-described "deployment/packaging geek". David graduated with a MSc in Electrical Engineering from Telecom Paristech, Paris in 2004, and obtained his PhD in Computer Science at Kyoto University, Japan, in the domain of speech recognition. He joined Cogent Labs in August 2017. As head of the Machine Learning Engineering Team, he plays a pivotal role at the interface between cutting-edge research and product development. Beyond his work at Cogent Labs, David is also well known in the open source community as the original author of scikit-learn, and a major contributor to NumPy and SciPy.
Talk: Interactive Python Dashboards with Plotly and Dash
Saturday 15th June 10:20 @ T1: Auditorium (L6)
Hello, I am Doni Rubiagatra. I am Software Engineer at kumparan, co-founder of surabaya.py East Java. I love teaching Python to others and spoke at several PyCon in Asia. I scream for an Ice Cream :D
Talk: When life gives you Orange, make data speak volumes!
Saturday 15th June 16:10 @ T3: Cubiculum (L7)
Drishti is a Computer Engineer at heart and a technology enthusiast. She loves to use technology to help the less fortunate. She believes in democratizing opportunities and brings knowledge of the latest developments in the fast-moving field of technology to deserving students, and keep them up to date and well-equipped for their respective professional careers. She has spoken at 12+ conferences across the globe and is also a social entrepreneur. Her non-profit organisation - Samyak Drishti Foundation works in environment, education and healthcare sectors and operates in 10 cities across India. In her spare time, she likes to paint nature, explore new places and anchor live shows
Talk: Program Thinking - How do you design programs for diversity?
Saturday 15th June 15:20 @ T1: Auditorium (L6)
Elisha is passionate about bringing people together to solve important problems.
She founded TechLadies - a community for women in Asia to learn technical skills to switch careers into the tech industry. TechLadies has over 3000 members across Asia, taught hundreds of ladies in Singapore and Malaysia how to code that saw tens of them (without any prior programming background) got technical internships or hired as junior software engineers.
Elisha enjoys sharing her experiences in tech and the lessons learned. She was featured on various media such as The Straits Times, Her World, e27, and High Net Worth. She has spoken internationally at IWD by Jobs for NSW, Slush Singapore, Google Women Techmakers, MaGIC Academy Symposium, RubyConf Malaysia and Techsauce Summit to name a few, and has mentored at Startup Weekends (San Francisco & Penang) and SPARK Global Acceleration Program.
Elisha is based in sunny Singapore and aspires to be a standup comedian.
Talk: Security Issues on your Python Code
Sunday 16th June 10:40 @ T2: Forum (L7)
Application Security Consultant, Skilled in Security Requirement Engineering, Threat Modeling, Static Application Security Testing, Dynamic Application Security Testing, Secure SDLC, DevSecOps. Hold Certified Ethical Hacker certification, Speaker for several conferences in Jakarta, Kuala Lumpur, Singapore with topic related to application security. Bachelor’s Degree focused in Informatics Engineering from Telkom University.
Talk: Python for Data Science Projects at Coraline
Sunday 16th June 13:15 @ T2: Forum (L7)
My name is Jiranun Jiratrakanvong. You can call me "Jiranun".
I have been fascinated in computer programming since I was a little. As a kid, my goal was just to make a game bot (Ragnarok) because I was too lazy to play it myself. After studying for many years, I become more lazy to do things and tried to solve everything by programming.
Python is my beloved language as it's easy to use, and it's easy to connect to other stuffs
Talk: Marlin: A Smali to Python Transpiler for Android Hacking
Saturday 15th June 14:30 @ T2: Forum (L7)
I am a lead engineer working on Android and iOS instrumentations at HeadSpin Inc., a fast-growing mobile testing startup company based in Palo Alto. I have years of writing programs in many languages like Go, Python, Erlang, JavaScript, Ocaml, Java, Kotlin, and Swift, among others. My experience lies in networking for IoTs and interactive applications, compiler, and mobile frameworks. Outside of professional settings, I'm the author of RxGo, a popular open-source library on Github and I have given talks at MakerFaire NYC and Radical Networks in 2015.
Talk: E-commerce for Django
Saturday 15th June 13:40 @ T2: Forum (L7)
I love to develop software using Python/Django, and manage e-commerce website in Korea.
I lived in Thailand for 4 years, and I taught some CS subjects in Naresuan University for 2 years.
Talk: Designing and Building Serverless Machine Learning-powered Applications with Python
Saturday 15th June 12:00 @ T1: Auditorium (L6)
Joshua Arvin Lat is the Chief Technology Officer (CTO) of Complete Business Online. He previously served as the Director for Software Development and Engineering for multiple startups which allowed him to see the bigger picture and be more effective as a professional and leader. For the past couple of years, he has been sharing his knowledge in several conferences around the country to discuss practical strategies for companies and professionals.
Talk: How We Build a Data-Informed Culture with Apache Airflow (Replacement)
Saturday 15th June 10:20 @ T2: Forum (L7)
Kan is an enthusiastic engineer who not only has a scientific mindset, but also a practical approach to software solutions. He is passionate in software engineering, data engineering, and data science. More importantly, he loves Python and uses it every single day at work. When there's any time left to burn Kan likes to improve his skills by taking some courses or contributing to some open-source projects.
Talk: How Python Can Excel
Sunday 16th June 17:45 @ T1: Auditorium (L6)
Katie has worn many different hats over the years. She has been a software developer for many programming languages, systems administrator for multiple operating systems, and speaker on many different topics. She is currently a Cloud Developer Advocate at Google, a Director of the Python Software Foundation, a Director of the Django Software Foundation, and Conference Director for PyCon AU 2018/2019. She won the O’Reilly Open Source Award in 2017, and was a finalist in the Red Hat Women in Open Source Award in 2018. When she’s not changing the world, she enjoys cooking, making tapestries, and seeing just how well various application stacks handle emoji.
Talk: Advanced Google Colaboratory
Saturday 15th June 15:20 @ T2: Forum (L7)
I started working as a data scientist in July, 2016. Though I have been using regular expressions to clean data for years, since 1999. I finished an M.Phil in Computer Speech and Language Processing from University of Cambridge, UK.
My focus now includes 2 topics: Thai NLP and Google Colaboratory for knowledge sharing. My main contributions are for PyThaiNLP project and Colab notebooks shared on Colab Thailand Facebook Group
Talk: Pyladies and Importance of community participation
Sunday 16th June 14:05 @ T2: Forum (L7)
I established my company called moegi Co., Ltd. to start the drone business. I am an engineer of the front-end system, but recently I have been focued on RaspberryPi and Arduino, and have been actively transmitting mechanisms in which objects move in reality by using Python language. This year, I participated in "PyCon 2018 Cleveland" and I felt the momentum of overseas forces. I exchanged contact information with Pythonista who are active overseas so that I can cooperate with them. Additionary, as a staff member of Pyladies Tokyo, I did a community activity spreading Python, and did Python Boot Camp which helps Python beginners and spreads Python as Saitama and Fukushima local staff. Python Boot Camp in Fukushima, activities such as preparing the venue as well as taking up local newspapers were underway. In addition, I am participating in the Python related community and am doing activities to improve self-study and day-to-day technology.
Talk: Adding a GraphQL API to Django (with Vue.js frontend)
Sunday 16th June 14:55 @ T1: Auditorium (L6)
I'm a serial online entrepreneur who is always looking to add useful products to the world – both open source and paid. My standard toolbox includes Python and Django (and sometimes WordPress) on the backend and Vue.js on the frontend. I also do data wrangling and some machine learning in Jupyter, Pandas and Keras.
My latest startup is a hosted backup service for Borg: https://www.borgbase.com/
In my spare time I'm also a Google Summer of Code mentor and maintain various open source projects and standardization efforts:
Talk: Python in Production Engineering @ Facebook
Saturday 15th June 16:10 @ T1: Auditorium (L6)
Mark has worked in IT for over 20 years in Europe and Southeast Asia. His experience spans IT operations, software engineering, data systems, product management and project management. He has worked in top multinationals, SMEs and start-ups.
Talk: First steps in Deep Learning with TensorFlow 2.0 : CNNs
Sunday 16th June 15:45 @ T1: Auditorium (L6)
Martin is a Google Developer Expert in Machine Learning based in Singapore - and was doing Neural Networks before the last AI winter... He's an active contributor in the Singapore data science community, and is the co-host of the Singapore TensorFlow and Deep Learning MeetUp (with now with 3700+ members in Singapore).
Talk: Securing your Python APIs with Auth0
Sunday 16th June 10:40 @ T3: Cubiculum (L7)
I’m a Full Stack Developer, Developer Evangelist, Auth0 Ambassador, GDG Ranchi Organizer, and Mozilla Representative. I love speaking on Serverless, Authentication & Authorization, Google Technologies, Security, Web Extensions and Virtual Reality at different meet-ups and conferences.
Talk: Teaching Coding To Kids
Sunday 16th June 09:00 @ T4: Aquarium (L7)
CEO of Zymple
Talk: Unlocking the power of natural language by machine translation: how python could serve my purpose?
Sunday 16th June 14:55 @ T2: Forum (L7)
Dali SOLA is a Data science enthusiast with experience in various aspects of NLP and machine translation. Dali had an engineer degree from at TEK-UP University in Tunisia and studied two Master degree in Business Intelligence and Innovation management. His core interest lies in “NLP”, ”Deep learning”, “Machine Learning”, ”Machine Translation” and "IA". In 2017 he get rewarded from ATB BANK for his solution "smart-HR", a human resource solution that deal with talents hiring issue, using NLP and IA .
Talk: Facial Keypoints Detection with PyTorch
Saturday 15th June 15:20 @ T3: Cubiculum (L7)
Nithiroj Tripatarasit
Lifelong learner, tech lover, and deep learning enthusiast.
My works
Experiences:
Talk: Ready to say goodbye to Python 2.7 ! ?
Sunday 16th June 09:00 @ T3: Cubiculum (L7)
Noah, PyCon Nomad Volunteer of FOSSASIA which is a NPO for promoting FOSS and open technologies in Asia, volunteer of PyConTW/JP/KR/ID/MY/TH/HK.....and each PyConAPAC since 2015. volunteer and speaker of EuroPython 2018. Managing member of PSF, my wish is that connect everyone who enjoy Python, and try to promote programming education to young generation or everyone who interested in by teaching basic programming skill using Python and R, like be a mentor of Hour or Code, or Google Summer of Code with FOSSASIA
Talk: Forklifting Django: Migrating A Complex Django App To Kubernetes
Sunday 16th June 10:40 @ T1: Auditorium (L6)
Noah Kantrowitz is a web developer turned infrastructure automation enthusiast, and all around engineering rabble-rouser. By day he runs an infrastructure team at Ridecell and by night he makes candy and stickers. He is an active member of the DevOps community, and enjoys merge commits, cat pictures, and beards.
Talk: Raiden Network for instant crypto payment & lower fees
Saturday 15th June 11:10 @ T2: Forum (L7)
Pisuth turns himself into a blockchain developer with extensive skills on IoT and Chatbot since 2017. Prior that time, he was working in media industry for 8 years in Thailand experienced using Python on system monitoring and systems integration. He also won 7 blockchain competition/hackathon in the past 2 years include ETHSingapore, Binance and NEO and has strong passion on blockchain technology and distributed economy.
Talk: Fuzzy Multi-Criteria Portfolio Optimisation with Python (and maybe a little bit of Mathematica)
Sunday 16th June 09:00 @ T1: Auditorium (L6)
I am a Data Scientist (First Senior Vice President) at Siam Commercial Bank PCL. Beside Python, I'm also into Mathematica, and did my doctorate entirely in C++. Beside Data Science, I'm involved in Quantitative Analytics in general, Financial Engineering and Risk Management in particular (although much less so these days). Beside Machine Learning, my research interest span to Graph-Theoretic/Network Model, Copula Functional, Cybernetics, and (obviously) Fuzzy Multi-Criteria Decision Model.
Talk: Hypothesis: Property-Based Testing for Python
Sunday 16th June 14:05 @ T3: Cubiculum (L7)
Rae Knowler is a web developer at Liip in Zürich, where they develop product data APIs and work on Open Data projects. They are interested in the fascinating, comical and sometimes tragic results of attempting to cram the complexity of life and society into computer systems. In their spare time they read a lot of science fiction and hug cats.
Talk: Visualize the Black Box - An introduction to Interpretable Machine Learning
Sunday 16th June 13:15 @ T4: Aquarium (L7)
Rahul Bhatia is a self-taught Data Scientist and Full-stack Web Developer. I have experience in organizing several talks as a Developer Student Club Lead at our campus, which is an initiative by Google Developers, promoting the developer culture at college campuses throughout several countries through the DSC program. I love sharing knowledge with fellow developers and organizing and delivering technical sessions. I am currently a Data Science Intern at Innovaccer, a healthcare company focused on "Righting the wrongs of healthcare technology"
I don't listen to a lot of pop music but I love rock music. Chester from Linkin Park was my favourite. Apart from that, I am a solo traveller and love wadering at new places.
Talk: The Buzz about Bees
Saturday 15th June 12:00 @ T2: Forum (L7)
Robert Owen worked for Oracle as Program Director for Asia-Pacific. Before that he worked for Ericsson Telecommunications. Robert was a member of the Australian delegation to the International Telecommunications Union, ITU, in Geneva, Switzerland where he worked on global telecommunications policy. A few years ago he spat his dummy at the amount of work Oracle expected him to do, resigned and enrolled for a PhD at the University of Melbourne, Australia. He expects to complete his PhD computer modelling infectious animal diseases later this year.
Talk: Python Everywhere?
Sunday 16th June 11:30 @ T1: Auditorium (L6)
Dr Russell Keith-Magee is the founder of the BeeWare project, developing GUI tools and libraries to support the development of Python software on desktop and mobile platforms. He is also a 13 year veteran of the Django core team, and for 5 years, was President of the Django Software Foundation. In his day job, he wrangles data pipelines for Survata. He is a frequent speaker at Python and Django conferences around the globe, sharing his experiences as a FLOSS developer, community maintainer, and (unsuccessful) startup founder. He lives in Whadjuk Noongar country - otherwise known as Perth, Western Australia.
Talk: The Fastest Path to Deep Learning
Sunday 16th June 09:50 @ T1: Auditorium (L6)
Sam is a Google Developer Expert for Machine Learning and is a co-founder of Red Dragon AI a deep tech company based in Singapore. He has extensive experience in startups and mobile applications and is helping developers and companies create smarter applications with machine learning. Sam is especially passionate about Deep Learning and AI in the fields of Natural Language and Conversational Agents and regularly shares his knowledge at events and trainings across Asia, as well as being the co-organiser of the Singapore TensorFlow and Deep Learning group. แซมพูดและอ่านภาษาไทยได้
Talk: Deep Learning Introductory Workshop with TensorFlow 2.0
Saturday 15th June 13:40 @ T4: Aquarium (L7)
Talk: Addressing class imbalance in Machine Learning
Saturday 15th June 14:30 @ T1: Auditorium (L6)
Sara is a seasoned software engineer and a data science enthusiast. She is currently undergoing a master in data science in the UK, and a research in deep learning for medical imaging. When she is not coding, she spends her free time baking sweet treats and watching Rick and Morty.
Talk: A resilient, scalable tracing and analysis system for micro-services - HayStack
Sunday 16th June 14:55 @ T3: Cubiculum (L7)
A passionate software developer, Sarthak is a core contributor in Expedia's Mobile Team. He weaves the magic in his code with Python, Java, Kotlin, Scala, C and JavaScript. Having mastered these languages all by himself, through self projects and open source contributions, he knows what it takes to not just write code but write code that is readable, efficient and maintainable.
His current adventure involves developing solutions in android ecosystem, internal API(s) and machine learning to help our users have the best experience.
Before joining Expedia, he co-founded one startup in India and did internship at Samsung R&D, Bengaluru. He loves sharing his knowledge and learnings from his adventures in machine learning projects. He has been speaking extensively at internal conferences and now want to spread his knowledge in the open.
Talk: Tech Skills: What's Hot and Whats Not. How does Python stack-up against the rest?
Saturday 15th June 14:30 @ T3: Cubiculum (L7)
Shane is CEO at Gummy Bear Tech Recruitment. He has over 30 years international experience in IT, and has been based in Thailand for the last 17 years where he’s been focusing on technical recruitment. Strong interest in SaaS applications, cloud technologies, and Linux desktops.
Talk: Production-ize deep learning with PyTorch, RedisAI and Hangar
Saturday 15th June 11:10 @ T1: Auditorium (L6)
I am working as a part of the development team of [Tensor]werk, an infrastructure development company focusing on deep learning deployment problems. I and my team focus on building open source tools for setting up a seamless deep learning workflow. I have been programming since 2012 and started using python since 2014 and moved to deep learning in 2015. I am an open source enthusiast and I spend most of my research time on improving interpretability of AI models using TuringNetwork. I have authored a deep learning book (yet to publish). I go by hhsecond on internet
Talk: Lightning Talks
Saturday 15th June 17:00 @ T1: Auditorium (L6)
Anyone can signup at registration
Talk: Lightning Talks
Sunday 16th June 16:35 @ T1: Auditorium (L6)
Anyone can signup at registration
Talk: Python for beginners
Saturday 15th June 10:20 @ T4: Aquarium (L7)
Hi there! I am a software engineer who uses vim at Pronto Tools and also a GirlsWhoDev organizer for around 4 years. I have organized many tech events for girls who want to learn coding even if they are not in the tech industry such as girls learning Python. I am also a co-organiser with Django girls for building a website with Django in Bangkok.  I enjoy singing, dancing and watching a movie and a series.
Talk: Developing Natural Language Processing Applications Using Python
Sunday 16th June 09:00 @ T2: Forum (L7)
I am a pre final student at The LNM Institute of Information Technology pursuing B-Tech in Computer Science Engineering. I have a Deep interest in open source technologies, and was selected as Mozilla Open Leader this year. I like to code in Python and developing Natural Language Processing applications in python. I have studied Information Retrieval as an academic course and my my interest in this field grew from there. In this talk I will elaborate on my project where I used TWEEPY library of python to extract and evaluate tweets. I believe Information Retrieval is a interesting topic and will attract audience from all the field and all experience levels.
Talk: Automate the Boring Stuff with Slackbot
Saturday 15th June 12:00 @ T3: Cubiculum (L7)
Takanori is a Vice Chairperson of PyCon JP Committee(www.pycon.jp). He is also a director of BeProud Inc.(www.beproud.jp), and his title is "Python Climber". Takanori held PyCon JP 2014 to 2016 as the chairperson. Currently he teaches Python to beginners as a lecturer at Python Boot Camp(pycamp.pycon.jp) all over Japan. In addition, he published several Python books. Tananori plays trumpet, climbs boulder, loves Lego, ferrets and beer
Talk: Unique ways to Hack into a Python Web Service
Saturday 15th June 10:20 @ T3: Cubiculum (L7)
I work at an Application Security company (we45) and have a unique perspective of developing secure and deliberately insecure apps in Python and NodeJS. I have contributed to the development of several Web-Applications using Django, Djano-Rest-Framework, NodeJs and more, that have been used for Capture the Flag Contests inside and outside the organization. And also I am contributed multiple OpenSource Projects. In addition, I have extensive experience with integrating scanners, SAST and DAST toolsets into our Application Vulnerability Correlation and Aggregation product. I have over 7 years of development experience and continue to work as a full-stack developer. And also I have presented talk in DjangoCon 2018, ISACA Meetup, also gave a workshop about container orchestration and Serverless in Lascon, Recently gave a talk in DevSecCon Singapore 2019.
Talk: Any Code Formatter You Like - As Long As It's Black
Sunday 16th June 15:45 @ T2: Forum (L7)
I'm a computer scientist with a passion for programming languages, and have been working as a software engineer in the Infrastructure Team at Facebook London since 2016. I've been working with Python on and off for the past 10 years, but recently it has become an area close to my heart.
I'm the father of an awesome little dude, husband to an amazing wife, and when I'm not spending time with my family, work, and open source, I'm a captain of a competitive Overwatch team.
Ask me about the biggest outage I've ever caused ;) See you at the conference!


| About Dailyrotten |
|
Feedback
If you like this page, hate it, or would like to suggest changes,
<EMAIL_ADDRESS>is listening. This page
is experimental and somewhat different from what we usually offer, so please
do send your feedback.
Adding Stories
If you are a rotten newshound and you would like to suggest a story,
visit our submit page to
send us the URL. Stories that are accepted will have your name credited.
Posting Comments
In order to post comments to stories, you will have to
create an account.
Accounts will generally be validated within 24 hours, and of
course will be disabled if there is abuse.
Viewership
On the first full day this page went live, 100,000 people visited this Rotten
News page. Of course that was the day after the WTC attacks, so that number is
somewhat distorted. Right now this page gets between 50,000 and 75,000 people
every day.
Linking
We encourage everyone to link to this page; if you like it, others probably
will as well.
Other Rotten
Rotten
Gaping Maw
Celebrity Morgue
Mugshots
Rotten Store
Rate My Poo
Rate My Kitten
Rate My Finger
Penny Postcards
Phallic
Boners
Home
Make Dailyrotten your start page
|
|
|
April 04, 2002
Mah daddy shot Martin Luther King
Gainesville Sun | Submitted by: f00f
"My dad and (a co-conspirator) believed Dr. King was a communist and was
trying to cause an uprising and would damage the country, and that's why
they wanted King (dead)," said Wilson, pastor of a non-denominational church
near Brooker. "It wasn't a racist thing at all. My dad said even if King was
white, they would have done it because of the communist affiliation."
|
|
Read article...
|
|
Sheriff, sued over records, gets bigger shredder
Cleveland Plain Dealer | Submitted by: Jesus H. Christ
"The Portage County sheriff, who is facing a lawsuit for allegedly
destroying public records, wants to purchase a high-volume, heavy-duty
shredder. Carolyn Ciganik, an employee of the Sheriff's Department,
recently won a $125,000 settlement of a federal sex discrimination
suit for being denied a promotion to sergeant."
|
|
Read article...
|
|
Flasher caught in own zipper
Virginian-Pilot | Submitted by: Klaw
"A 12-year-old girl confronted by a flasher in an elevator Monday night
reacted quickly: She grabbed his zipper and yanked it up... Because he
suffered blood loss, the man probably suffered injuries significant enough
for him to seek medical treatment, Carey said. Investigators have been
checking for him at area hospitals."
|
|
Read article...
|
|
Top DUI issuer traded sex for ticket
Washington Post | Submitted by: Soylent
"Because she is [drinking] underage, there still would have been a
drinking and driving violation. Officials said the woman sought a way
out of the ticket, and Carter took her to his realty offices in Manassas
while still on duty. [THEN HE FUCKED HER.] Carter later took the woman
home, and the next day, took her to a local towing lot to get her car
back, giving her more than $100 in cash for the tow, authorities said."
So very romantic.
|
|
Read article...
|
|
Fetus in office wastebasket
San Francisco Chronicle | Submitted by: anonymous
"The fetus was found by a janitor around 8:30 p.m. Monday in a women's
rest room on the 16th floor of 1 Maritime Plaza, a 25-story building near
the corner of Clay and Front streets across from the Embarcadero Center
complex [San Franscisco]. It was wrapped in a plastic bag and found in a
trash can used for hand towels, police said."
|
|
Read article...
|
|
Early puberty linked to shampoo
New Scientist | Submitted by: Reid Fleming
Half of America's black girls reach puberty at age eight. (That's second
grade.) At that age, only 15% of white girls begin developing. Why the
difference? It might be the result of haircare products containing estrogen
and marketed primarily to the African-American community. Even a toddler
aged 14 months -- MONTHS -- went into puberty shortly after using one of
these products. (The incipient breasts and pubic hair disappeared after
discontinued use of the shampoo.)
|
|
Read article...
|
|
Fear and Loathing in Harris County
Texas Observer | Submitted by: Squid
The best thing about this article is the quote, "In my first viewing
of the video, I didn’t see outstanding examples of excessive use of force
on the tape–and I still feel that way" shown right next to the autopsy
pictures of someone who's obviously been beaten to quite the pulp. The
second best thing is the quote from the Mexican Consulate press attache,
"He wasn’t even an illegal."
|
|
Read article...
|
|
Study finds marrying kin OK
New York Times | Submitted by: PS
A study has found that marrying even your first cousin carries an
acceptable level of genetic risk, in fact much less risk than many other
groups who are permitted to marry. The study also surveyed those most
tempted to marry their kin, namely Kentucky. "Estimates of marriages
between related people, which include first cousins and more distant ones,
range from less than 0.1 percent of the general population to 1.5 percent.
In the past, small studies have found much higher rates in some areas:
a survey in 1942 found 18.7 percent in a small town in Kentucky, and
a 1980 study found 33 percent in a Mennonite community in Kansas."
[New York Times article, free subscription required.]
|
|
Read article...
|
|
|
|
|


In 1995, the National Centre of Supercomputing Applications (NCSA) released a browser called NCSA Mosaic. This was a very popular browser at the time. To challenge the NCSA Mosaic, Marcreessen brought in a majority of the developers who built NCSA Mosaic to a company called Netscape. They built a competing browser called Netscape communicator.
However both browsers lacked a primary programming language. Marcressen believed the web needed a dynamic object model and needed much more automation as to allow interaction. To develop a scripting language, Netscape entered into a partnership with Sun’s Microsystems who were the owners of Java. Java was starting to gain fame for its features. So the Netscape/Sun partnership meant Sun acquired the use of a competitive browser and a delivery system for their strategic technology.
Breindan Eich who was on the team at Netscape decided to build a working prototype of Javascript. This was called Netscape’s Mocha at first and later changed to javascript. JavaScript was later integrated in their web-browser. JavaScript was born to be a small client side scripting language. It was different to java in that Java was too big and targeted at large corporations. Javascript was for dynamic web with interactions. Furthermore javacsript scripting was small and easy to use by beginners. It was designed to turn the web into a full-blown application platform. Furthermore it was designed to work in companion with Java. Hence this is why Netscape needed the partnership with Java. Many people believe because the 2 names sound similiar ,they are very same but its quite the opposite.
JavaScript is most commonly used as a client side scripting language. A client-side script is a programming language that executes its functions exclusively on the computer of the client, and does not have to communicate with the server to operate. For example, if a web page is loaded on your computer and your Internet drops, you can still communicate with the already loaded web pages on your browser.
JavaScript needs to be written into the HTML page because the HTML,CSS and JavaScript all get executed together . Javascript techniques allow for highly responsive interfaces to be created. It also allows for dynamic functionality. This meaning the user doesn’t have to wait for the server to react to show another page. JavaScript can load content into the document if and when the user needs it, without reloading the entire page — this is commonly referred to as Ajax. Javascript is mainly used for front end to “spice up” the website. Angular JS, React.js and jQuery are mainly front end frameworks and libraries. However Node.js is backend is used to add functionality.
Ajax allows us to make requests asynchronously in the background without having to reload and refresh whole page. If we want to update a small section of page we can utilize ajax without having to reload page. We first make a JavaScript call to an ajax engine. From the AJAX engine it sends a XMLHttpRequest to server. Then we receive data in JSON/XML and we do whatever we want.
If you would like to know more about the history of Javascript and its capabilites, please Subscribe down below to our newsletter.
To see how javascript can be utlised please visit the Carona Virus page.


In Chapter 3 we built up a real-world example of a functioning C++ addon - however there is something a bit unsatisfying about it. If you've programmed with Node.js (or even client-side JavaScript), you know that often functions don't return results - they call a callback when they have completed, passing the results in as parameters.
Instead of using Chapter 3's rainfall addon like this:
var results = rainfall.calculate_results(locations);
results.forEach(function(result){
// .. print the result
});
... the experienced JavaScript developer might instead expect to use it like this:
rainfall.calculate_results(locations, function(results){
results.forEach(function(result){
// .. print the result
});
});
Why muddy things up with callbacks? The answer is both simple and complicated. The simple answer is that they allow us to implement a function asynchronously. Behind the scenes, what this really means is that functions that accept callbacks often create worker threads to do their computation. Once the worker threads are started, the function returns and allows the calling code to go about it's business (executing the next line of code). When the worker threads complete, the callback is invoked. It's a complex work flow that often confuses new developers and has given rise to all sorts of alternative ways of working with callbacks - such as promises.
Why are these functions asynchronous? Client side, within the web browser, there is clear need to avoid having JavaScript tying up a lot of time (either waiting for I/O or using the CPU), since while JavaScript is executing the browser cannot render or react to user input. In Node.js, the same philosophy holds - the event loop (implemented by a library called libuv
) should never stall on I/O or heavy CPU because, in theory, there is likely other work to be done instead. For example, if using Node.js to implement a web server, tying up the event loop would preclude the web server from serving additional incoming web requests.
Addons are no different in this regard - and in fact they are almost always strong candidates for being implemented asynchronously. Remember, one of the reasons you typically use a C++ addon is to perform a long running CPU task - where C++ will outperform JavaScript. By definition, these long CPU tasks are exactly the sort of thing that should be executed in a background thread!
We are going to "creep up" on the asynchronous model by first learning about the V8 Function API and seeing how we can modify our rainfall addon to use callback functions (synchronously) first. We'll then move to the asynchronous model, while investigating how V8 deals with worker threads and memory management in more detail.
All of the code for this chapter is available in full in the nodecpp-demo
repository at https://github.com/freezer333/nodecpp-demo, under the "Rainfall" section.
Chapter 2 described how to use the most common JavaScript data types through the V8 API. We covered primitives and objects in detail - but we didn't go much beyond standard objects and arrays. In JavaScript, functions are objects too - and V8 has a specific Function
type that let's us access (and call) JavaScript functions from C++.
The API for calling JavaScript functions from addons was outlined in Chapter 1, and in fact there really isn't much too it! Lets review it quickly, starting with a simple addon function that accepts two arguments - a function from JS and an argument to invoke that function (callback) with:
void CallThisWithThis(
const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Function> cb = Local<Function>::Cast(args[0]);
// Create an array with only the message passed in
Local<Value> argv[1] = {args[1]};
cb->Call(Null(isolate), 1, argv);
}
void Init(Local<Object> exports, Local<Object> module) {
NODE_SET_METHOD(exports,
"callthis_withthis", CallThisWithThis);
}
As you can see, a Local<Function>
object can be cast from arguments just like any of the other data types we've seen. To execute a function we can utilize the Call
method. It requires three arguments - the first is the "this" object that the JavaScript function will be called with. Specifying null tells V8 to use the default value (depends on invocation context). The second and third parameters are for arguments the function will be called with - in this case just one argument, which is what was passed into the addon itself.
The JavaScript to use the addon is pretty straightforward:
const callback = require('./build/Release/callback');
var callme = function(message) {
console.log(message);
}
back.callthis_withthis(callme, "This is an important message");
Now let's adopt this style in our rainfall addon. We'll call this function CalculateResultsSync
because while it uses callbacks, it is very much synchronous.
// in node_rainfall.cc
void CalculateResultsSync(
const v8::FunctionCallbackInfo<v8::Value>&args) {
Isolate* isolate = args.GetIsolate();
std::vector<location> locations;
std::vector<rain_result> results;
// extract each location (its a list)
Local<Array> input = Local<Array>::Cast(args[0]);
unsigned int num_locations = input->Length();
for (unsigned int i = 0; i < num_locations; i++) {
locations.push_back(unpack_location(isolate,
Local<Object>::Cast(input->Get(i))));
}
// Build vector of rain_results
results.resize(locations.size());
std::transform(locations.begin(),
locations.end(),
results.begin(),
calc_rain_stats);
// Convert the rain_results into Objects for return
Local<Array> result_list = Array::New(isolate);
for (unsigned int i = 0; i < results.size(); i++ ) {
Local<Object> result = Object::New(isolate);
pack_rain_result(isolate, result, results[i]);
result_list->Set(i, result);
}
Local<Function> callback = Local<Function>::Cast(args[1]);
Handle<Value> argv[] = { result_list };
callback->Call(
isolate->GetCurrentContext()->Global(), 1, argv);
std::cerr << "Returning from C++ now" << std::endl;
args.GetReturnValue().Set(Undefined(isolate));
}
...
void init(Handle <Object> exports, Handle<Object> module) {
...
NODE_SET_METHOD(exports,
"calculate_results_async", CalculateResultsAsync);
}
What do we mean by "synchronous"? On line 31 we invoke the callback sent in from JavaScript.
var print_rain_results = function(results) {
results.forEach(function(result, i){
console.log("Result for Location " + i);
console.log("--------------------------");
console.log("\tLatitude: "
+ locations[i].latitude.toFixed(2));
console.log("\tLongitude: "
+ locations[i].longitude.toFixed(2));
console.log("\tMean Rainfall: "
+ result.mean.toFixed(2) + "cm");
console.log("\tMedian Rainfall: "
+ result.median.toFixed(2) + "cm");
console.log("\tStandard Dev.: "
+ result.standard_deviation.toFixed(2) + "cm");
console.log("\tNumber Samples: "
+ result.n + "\n");
});
}
// Execute the synchronous callback.
rainfall.calculate_results_sync(locations, print_rain_results);
console.log("JavaScript program has completed.")
Notice the cerr
output afterwards - when will it execute? It executes AFTER the JavaScript function we are calling completes. The steps are like so:
calculate_results_sync
)print_rain_results
Everything is happening in lock step - while the C++ is executing nothing is happening in JavaScript unless explicitly called from C++. We'd prefer to see something like this:
calculate_results_sync
)... after some time..
print_rain_results
Lets do a quick overview of how worker threads work in V8. In our model, there are two threads. The first thread is the event loop thread - its the thread that our JavaScript code is executing in, and its the thread we are still in when we cross over into the C++ addon. This is the thread that we don't want to stall by doing heavy calculations! The second thread (to be created) will be a worker thread managed by libuv, the library that supports asynchronous I/O in Node.
Hopefully you're pretty familiar with threads - the key point here is that each thread has it's own stack - you can't share stack variables between the event loop thread and the worker thread! Threads do share the same heap though - so that's where we are going to put our input and output data, along with state information.
Worker threads are a extremely useful concept, but it comes at a price. JavaScript is implicitly single threaded, and V8 is built around the notion that data within JavaScript is strictly accessible by one thread at a time (even though technically, they are on the heap!). There is sort of a "golden rule" in asynchronous addon development:
you can't access V8 memory outside the event-loop's thread.
This essentially means if you want the asynchronous part of your addon to be able to (1) access input data sent from JavaScript and/or (2) return data to JavaScript then you need to create copies of the input/output data. You might notice however that this is exactly what we are already doing with our unpacking/packing strategy. At the end of this chapter, we'll dive a bit deeper into why copying data is nearly unavoidable when dealing with asynchronous execution.
Our first step is to create yet another C++ function, and register it with our module.
// in node_rainfall.cc
void CalculateResultsAsync(const v8::FunctionCallbackInfo<v8::Value>&args) {
Isolate* isolate = args.GetIsolate();
// we'll start a worker thread to do the job
// and call the callback here...
args.GetReturnValue().Set(Undefined(isolate));
}
...
void init(Handle <Object> exports, Handle<Object> module) {
...
NODE_SET_METHOD(exports, "calculate_results_async", CalculateResultsAsync);
}
The CalculateResultsAsync
function is where we'll end up kicking off a worker thread using libuv - but notice what it does right away: it returns! Nothing we fill into this function will be long running, all the real work will be done in the worker thread.
On the C++ side of things, we're going to utilize three functions and a struct to coordinate everything:
Worker Data
(struct) - will store plain old C++ input (locations) and output (rain_results) and the callback function that can be invoked when work is completeCalculateResultsAsync
- executes in event-loop thread, extracts input and stores it on the heap in worker data.WorkAsync
- the function that the worker thread will execute. We'll launch this thread from CalculateResultsAsync
using the libuv APIWorkAsyncComplete
- the function that libuv will invoke when the worker thread is finished. This function is executed on the event loop thread, not the worker thread. Figure 5 outlines the workflow we'll use.Lets look at the C++ code, starting with our Work data structure:
struct Work {
uv_work_t request;
Persistent<Function> callback;
std::vector<location> locations;
std::vector<rain_result> results;
};
The vector will store our input and output. The request object is a handle that will actually loop back to the work object - the libuv API accepts pointers of type uv_work_t
when starting worker threads. The callback
variable is going to store the JavaScript callback. Importantly, its Persistent<>
, meaning it will be kept in scope by V8 and not garbage collected. This seems confusing, since the callback will be executed in the event-loop thread, but we need to make it Persistent
because when we initially return to JavaScript, all V8 locals are destroyed. A new Local context is created when we are about to call the JavaScript callback after the worker thread completes.
Now lets look at the CalculateResultsAsync
function
void CalculateResultsAsync(
const v8::FunctionCallbackInfo<v8::Value>&args) {
Isolate* isolate = args.GetIsolate();
Work * work = new Work();
work->request.data = work;
Notice that the Work struct is created on the heap. Remember, local variables (and V8 Local objects) will be destroyed when this function returns - even though our worker thread will still be active. Here we also set the uv_work_t
data pointer to point right back to the work
struct so libuv will pass it back to us on the other side.
...
// extract each location (its a list) and
// store it in the work package
// work (and thus, locations) is on the heap,
// accessible in the libuv threads
Local<Array> input = Local<Array>::Cast(args[0]);
unsigned int num_locations = input->Length();
for (unsigned int i = 0; i < num_locations; i++) {
work->locations.push_back(
unpack_location(isolate,
Local<Object>::Cast(input->Get(i)))
);
}
Where earlier we now just went ahead and processed the rainfall data, now we'll kick off a worker thread using libuv. First we store the callback sent to use from JavaScript, and then we're off. Notice as soon as we call uv_queue_work
, we return - the worker is executing in its own thread (uv_queue_work
returns immediately).
// store the callback from JS in the work
// package so we can invoke it later
Local<Function> callback =
Local<Function>::Cast(args[1]);
work->callback.Reset(isolate, callback);
// kick of the worker thread
uv_queue_work(uv_default_loop(),&work->request,
WorkAsync,WorkAsyncComplete);
args.GetReturnValue().Set(Undefined(isolate));
}
Notice the arguments to uv_queue_work
- its the work->request we setup at the top of the function, and two functions we haven't seen yet - the function to start the thread in (WorkAsync
) and the function to call when it's complete (WorkAsyncComplete
).
At this point, control is passed back to Node (JavaScript). If we had further JavaScript to execute, it would execute now. Basically, from the JavaScript side, our addon is acting the same as any other asynchronous call we typically make (like reading from files).
The worker thread code is actually really simple. We just need to process the data - and since its already extracted out of the V8 objects, its pretty vanilla C++ code. Notice our function has been called with the libuv work request parameter. We set this up above to point to our actual work data.
static void WorkAsync(uv_work_t *req)
{
Work *work = static_cast<Work *>(req->data);
// this is the worker thread, lets build up the results
// allocated results from the heap because we'll need
// to access in the event loop later to send back
work->results.resize(work->locations.size());
std::transform(work->locations.begin(),
work->locations.end(),
work->results.begin(),
calc_rain_stats);
// that wasn't really that long of an operation,
// so lets pretend it took longer...
std::this_thread::sleep_for(chrono::seconds(3));
}
Note - the code above also sleeps for extra effect, since the rainfall data isn't really that large.
Once the worker thread completes, libuv handles calling our WorkAsyncComplete
function - passing in the work request object again - so we can use it!
// called by libuv in event loop when async function completes
static void WorkAsyncComplete(uv_work_t *req,int status)
{
Isolate * isolate = Isolate::GetCurrent();
v8::HandleScope handleScope(isolate);
Work *work = static_cast<Work *>(req->data);
// the work has been done, and now we pack the results
// vector into a Local array on the event-thread's stack.
Local<Array> result_list = Array::New(isolate);
for (unsigned int i = 0; i < work->results.size(); i++ ) {
Local<Object> result = Object::New(isolate);
pack_rain_result(isolate, result, work->results[i]);
result_list->Set(i, result);
}
...
The first part of the function above is pretty standard - we get the work data, and we package up the results into V8 objects rather than C++ vectors. Next, we need to invoke the JavaScript callback that was originally passed to the addon. Note, this part is a lot different in Node 0.11 than it was in previous versions of Node because of recent V8 API changes. If you are looking for ways to be a little less dependent on V8, take a look at Chapter 6 covering Nan
- which abstracts away a lot of these issues.
// set up return arguments
Handle<Value> argv[] = { Null(isolate), result_list };
// execute the callback
Local<Function>::New(isolate, work->callback)->
Call(isolate->GetCurrentContext()->Global(), 2, argv);
// Free up the persistent function callback
work->callback.Reset();
delete work;
}
Once you call the callback, you're back in JavaScript! The print_rain_results
function will be called...
rainfall.calculate_results_async(locations,
function(err, result) {
if (err ) {
console.log(err);
}
else {
print_rain_results(result);
}
});
Note that since we've used the standard call signature for the callback (err, data), you could use a standard promise library like bluebird to promisify your addon call.
As discussed earlier in the chapter, the worker thread API and programming model largely driven by the need to avoid accessing V8 data from our worker threads. In the event loop thread we've constructed C++ objects containing copies of the V8 data sent as input. We've performed calculations in the worker thread using only these C++ objects, and then repackaged them into V8 when we get back to the event loop thread.
For situations where input data and output data is relatively small, this poses absolutely no issue - and these are probably the most common cases. However - what if your async addon is going to do a lot of computation over a large input? What if it generates a huge amount of data? Note that this copying input and output data is being done in the event loop - meaning if it takes a long time, we're blocking the event loop (which we hate doing!).
So we have two problems:
Ideally, we'd prefer a way to directly access V8 data from our worker threads. This is something that the official Node.js and V8 documentation both specifically say we can't do... however I think it's instructive to see why (and documentation covering the "why" is hard to come by!). The remainder of this chapter is about proving it won't work, and the ways we can mitigating the problem of copying within the event loop.
Warning: most of the following contains anti-patterns for asynchronous addons with Node.js.
How does C++ access JavaScript data in the first place? A lot of this is actually covered in Chapter 1 and 2 - but let's briefly review it here. When your Node.js JavaScript code is executing and allocating variables, it's doing so within the V8 JavaScript engine. V8 allocates JavaScript variables within it's own address space inside what we'll call "storage cells". When JavaScript calls into a C++ addon, the C++ code may obtain references to these storage cells by creating handles using the V8 API.
The most common handle type is Local
- meaning it's scope is tied specifically to the current handle scope. The scope of a handle is critical, as V8 is charged with implementing garbage collection - and to do this it must keep track of how many references point to given storage cells. These references are normally within JavaScript, but the handles in our C++ addons must be kept track of too.
The most basic form of accessing pre-existing JavaScript variables occurs when we access arguments that have been passed into our C++ addon's when a method is invoked from JavaScript:
As you can see in Figure 6, the Local<Object>
handle we create (target
) will allow us to access V8 storage cells. Local
handles only remain valid while the HandleScope
object active when they are created is in scope. The V8 Embedder's Guide is once again the primary place to learn about HandleScope
objects - however put simply, they are containers for handles. At a given time, only one HandleScope
is active within V8 (or more specifically, a V8 Isolate
). Where's the HandleScope
in the above example? Good question!
It turns out that Node.js creates a HandleScope
right before it calls our addon on the JavaScript code's behalf. This HandleScope
is destroyed when the C++ addon function returns. Thus, any Local
handle created inside our addon's function only survives until that function returns - meaning Local
handles can never be accessed in worker threads when dealing with async addons - the worker threads clearly outlive the initial addon function call!
Persistent
handles the answer?Maybe! As the name implies, Persistent
handles are not automatically destroyed using HandleScope
s - they can hang around indefinitely. Once you've created a persistent handle in your C++ code, V8 will honor that reference (and make sure you can still access the storage cells it points to) until you explicitly release it (you do this by calling the handle's Reset
method). At first glance, this appears to be precisely the tool that would allow a long-lived C++ worker thread to access V8 data.
As a first experiment, lets maintain a reference to a JavaScript variable across C++ function calls by setting up a simple (non-threaded) example. Let's build a quick addon that allows JavaScript to pass in an object that the C++ hangs on to. Subsequent calls to the addon will mutate the JavaScript object originally passed into it - and we'll see these changes in JavaScript after the C++ returns.
#include <node.h>
using namespace v8;
// Stays in scope the entire time the addon is loaded.
Persistent<Object> persist;
void Mutate(const FunctionCallbackInfo<Value>& args) {
Isolate * isolate = args.GetIsolate();
Local<Object> target = Local<Object>::New(isolate, persist);
Local<String> key = String::NewFromUtf8(isolate, "x");
// pull the current value of prop x out of the object
double current = target->ToObject()->Get(key)->NumberValue();
// increment prop x by 42
target->Set(key, Number::New(isolate, current + 42));
}
void Setup(const FunctionCallbackInfo<Value>& args) {
Isolate * isolate = args.GetIsolate();
// Save a persistent handle for later use in Mutate
persist.Reset(isolate, args[0]->ToObject());
}
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "setup", Setup);
NODE_SET_METHOD(exports, "mutate", Mutate);
}
NODE_MODULE(mutate, init)
Notice the two functions exposed by the addon. The first, Setup
, creates a (global) Persistent
handle to the object passed in from JavaScript. This is a pretty dubious use of global variables within an addon - it's probably a bad idea for non-trivial stuff - but this is just for demonstration. The point is that Persistent<Object> target
's scope is not tied to Setup
.
The second function exposed by the addon is Mutate
, and it simply adds 42 to target
's only property - x
. Now let's look at the calling Node.js program.
const addon = require('./build/Release/mutate');
var obj = { x: 0 };
// save the target JS object in the addon
addon.setup(obj);
console.log(obj); // should print 0
addon.mutate(obj);
console.log(obj); // should print 42
addon.mutate(obj);
console.log(obj); // should print 84
When we run this program we'll see obj.x
is initially 0, then 42, and then 84 when printed out. Living proof we can hang on to V8 within our addon across invocations... we're on to something!
> node mutate.js
{ x: 0 }
{ x: 42 }
{ x: 84 }
Let's simulate a use case where a worker thread spends a long time modifying data iteratively. We'll modify the addon from above such that instead of needing JavaScript to call Mutate
, it repeatedly changes target
's x value every 500ms in a worker thread.
#include <node.h>
#include <chrono>
#include <thread>
using namespace v8;
// Stays in scope the entire time the addon is loaded.
Persistent<Object> persist;
void mutate(Isolate * isolate) {
while (true) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
// we need this to create a handle scope, since this
// function is NOT called by Node.js
v8::HandleScope handleScope(isolate);
Local<String> key = String::NewFromUtf8(isolate, "x");
Local<Object> target = Local<Object>::New(isolate, persist);
double current = target->ToObject()->Get(key)->NumberValue();
target->Set(key, Number::New(isolate, current + 42));
}
}
void Start(const FunctionCallbackInfo<Value>& args) {
Isolate * isolate = args.GetIsolate();
persist.Reset(isolate, args[0]->ToObject());
// spawn a new worker thread to modify the target object
std::thread t(mutate, isolate);
t.detach();
}
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "start", Start);
}
NODE_MODULE(mutate, init)
Note - we're not using libuv or any of the (best) common practice you'd normally see in an async addon; just ordinary C++ threads. Let's update the JavaScript to print out obj
each second so we can see the fabulous work our C++ thread is doing.
const addon = require('./build/Release/mutate');
var obj = { x: 0 };
addon.start(obj);
setInterval( () => {
console.log(obj)
}, 1000);
If you've tried this before, you know what's coming next!
> node mutate.js
Segmentation fault: 11
Lovely. It turns out V8 doesn't allow what we're trying to do. Specifically, a single V8 instance (represented by an Isolate
) can never be accessed by two threads. That is unless, of course, we use the built in V8 synchronization facilities in the form of v8::Locker
. By using v8::Locker
, we can prove to the V8 isolate
that we are switching between threads - but that we never allow simultaneous access from multiple threads.
Viewing V8 isolate
as a shared resource, anyone familiar with thread synchronization can easily understand v8::Locker
through the lens of a typical synchronization primitive in C++ - such as a mutex. The v8::Locker
object is a lock, and we use RAII to use it. Specifically, the creation of a v8::Locker
object (constructor) automatically blocks and waits until no other thread is within the isolate
. Destruction of the v8::Locker
(when it goes out of scope) automatically releases the lock - allowing other threads to enter.
We have two threads: (1) the Node.js (libuv) event loop and (2) the worker thread. Let's first look at adding locking to the worker:
void mutate(Isolate * isolate) {
while (true) {
std::this_thread::sleep_for(std::chrono::milliseconds(500));
std::cerr << "Worker thread trying to enter isolate" << std::endl;
v8::Locker locker(isolate);
isolate->Enter();
std::cerr << "Worker thread has entered isolate" << std::endl;
// we need this to create local handles, since this
// function is NOT called by Node.js
v8::HandleScope handleScope(isolate);
Local<String> key = String::NewFromUtf8(isolate, "x");
Local<Object> target = Local<Object>::New(isolate, persist);
double current = target->ToObject()->Get(key)->NumberValue();
target->Set(key, Number::New(isolate, current + 42));
// Note, the locker will go out of scope here, so the thread
// will leave the isolate (release the lock)
}
}
At this point, since we haven't added locking anywhere else, you might think this would have very little effect if we run our program now. After all, there is seemingly no contention on the V8 lock, since the the worker is the only thread trying to lock it.
> node mutate.js
Worker thread trying to enter isolate
{ x: 0 }
{ x: 0 }
{ x: 0 }
{ x: 0 }
{ x: 0 }
{ x: 0 }
{ x: 0 }
^C
This is not what we see though... instead, we see that our worker thread never acquires the lock!. This implies our event loop thread owns the isolate
. Diving into the Node.js source code, we can see this is correct!. Inside the StartNodeInstance
method in src/node.cc
(at time of this writing, around line 4096), a Locker object is created about 20 lines or so before beginning to process the main message pumping loop that drives every Node.js program.
// Excerpt from
// https://github.com/nodejs/node/blob/master/src/node.cc#L4096
static void StartNodeInstance(void* arg) {
...
{
Locker locker(isolate);
Isolate::Scope isolate_scope(isolate);
HandleScope handle_scope(isolate);
//... (lines removed for brevity...)
{
SealHandleScope seal(isolate);
bool more;
do {
v8::platform::PumpMessageLoop(default_platform, isolate);
more = uv_run(env->event_loop(), UV_RUN_ONCE);
if (more == false) {
v8::platform::PumpMessageLoop(default_platform, isolate);
EmitBeforeExit(env);
more = uv_loop_alive(env->event_loop());
if (uv_run(env->event_loop(), UV_RUN_NOWAIT) != 0)
more = true;
}
} while (more == true);
}
....
Node.js acquires the isolate
lock before beginning the main event loop - and it never relinquishes it. This is where we might begin to realize our goal of accessing V8 data from a worker thread is impractical with Node.js. In other V8 programs, you might very well allow workflows like this, however Node.js specifically disallows multi-threaded access by holding the isolate
's lock throughout the entire lifetime of your program.
Unlocker
?If you look at the V8 documentation, you will find a counterpart to Locker
though - Unlocker
. Similar to Locker
, it uses an RAII pattern - whenever it is in scope you've effectively unlocked the isolate. Perhaps we could use this in the event loop thread to unlock the isolate...
// Remember - this is called in the event loop thread
void Start(const FunctionCallbackInfo<Value>& args) {
Isolate * isolate = args.GetIsolate();
persist.Reset(isolate, args[0]->ToObject());
// spawn a new worker thread to modify the target object
std::thread t(mutate, isolate);
t.detach();
// This will allow the worker to enter...
isolate->Exit();
v8::Unlocker unlocker(isolate);
}
Running this ends in disaster though - segmentation fault as soon as Start
returns - the worker thread never even gets a chance. This really should not have been a surprise. When Start
returns, it's relinquished the lock it had on V8 and actually exited the isolate - but this is the thread that actually runs our JavaScript - a clear conflict in logic! The seg fault
is a result of Node.js calling into V8 (to return control back to JavaScript) after it's exited the isolate. If we delay the return of Start
, we can see that the worker thread is able to access V8 data.
void Start(const FunctionCallbackInfo<Value>& args) {
...
isolate->Exit();
v8::Unlocker unlocker(isolate);
// as soon as we return, Node's going to access V8 which
// will crash the program. So we can stall...
while (1);
}
```
```
> node mutate.js
Worker thread trying to enter isolate
Worker thread has entered isolate
Worker thread trying to enter isolate
Worker thread has entered isolate
...
In theory, we could force JavaScript to call into the addon to periodically release the isolate to allow the worker thread to access it for a while.
void Start(const FunctionCallbackInfo<Value>& args) {
Isolate * isolate = args.GetIsolate();
persist.Reset(isolate, args[0]->ToObject());
// spawn a new worker thread to modify the target object
std::thread t(mutate, isolate);
t.detach();
}
void LetWorkerWork(
const FunctionCallbackInfo<Value> &args) {
Isolate * isolate = args.GetIsolate();
{
isolate->Exit();
v8::Unlocker unlocker(isolate);
// let worker execute for 200 seconds
std::this_thread::sleep_for(std::chrono::seconds(2));
}
//v8::Locker locker(isolate);
isolate->Enter();
}
And here's the JavaScript, graciously calling LetWorkerWork
.
const addon = require('./build/Release/mutate');
var obj = { x: 0 };
addon.start(obj);
setInterval( () => {
addon.let_worker_work();
console.log(obj)
}, 1000);
As you can see - this does work - we an access V8 data from a worker thread while the event loop is asleep, with an Unlocker
in scope.
> node mutate.js
Worker thread trying to enter isolate
Worker thread has entered isolate
Worker thread trying to enter isolate
Worker thread has entered isolate
Worker thread trying to enter isolate
{ x: 84 }
Worker thread has entered isolate
Worker thread trying to enter isolate
Worker thread has entered isolate
{ x: 168 }
Worker thread trying to enter isolate
Worker thread has entered isolate
Worker thread trying to enter isolate
Worker thread has entered isolate
{ x: 252 }
...
While this makes for a nice thought experiment - it's not practical. The purpose of this entire exercise is to allow a worker thread to asynchronously work with JavaScript data. Further, we wanted to do this without copying lots of data which would slow down (block) the event loop thread. Keeping those goals in mind, the unlocker approach fails miserably - the worker thread can only access V8 data when the event loop is sleeping!
If you've written async addons in C++ already, you surely have used Persistent
handles to callbacks. You've gone through the trouble of copying input data into plain old C++ variables, used libuv
or Nan
's wrappers to queue up a work object to be processed in a worker thread, and then copied the data back to V8 handles and invoked a callback.
It's a complicated workflow - but hopefully the above discussion highlights why its so important. Callback functions (passed in as arguments to our addon when it's invoked) must be held in Persistent
handles, since we must access them when our work thread is completed (and well after the initial C++ function returns to JavaScript). Note however that we never invoke that callback from the worker thread. We invoke the callback (accessing the Persistent
handle) when our C++ "completion" function is called by libuv
- in the event loop thread.
Once you understand the threading rules, I think the elegance of the typical async solution pattern becomes a lot more clear.
Our premise was that we could have a C++ addon that used data from JavaScript as input. Since we now know making a copy is necessary - we come back to the issue of copying a lot of data. If you find yourself in this situation, there may be some very simple ways to mitigate the problem.
First - does your input data really need to originate from JavaScript? If your addon is using a lot of data as input, where is that data actually coming from?
Is it coming from a database? If so, then retrieve it in C++ - not JavaScript!
Is it coming from a file (or an upload)? If so, can you avoid reading it into JavaScript variables and just pass the filename/location into C++?
If your data doesn't sit somewhere already, and JavaScript code is actually building it up incrementally over time (before asking a C++ addon to use it), then another option would be to store the data in the C++ addon directly (as plain old C++ variables). As you build data, instead of creating JavaScript arrays/objects - make calls into the C++ addon to copy data (incrementally) into a C++ data structure that will remain in scope.
There are few really good ways to do this. One is through the ObjectWrap API, which allows you to utilize C++ object directly from JavaScript - which is covered in the next chapter. JavaScript can work with a C++ addon's result data like this too - the worker thread can build up a C++ data structure wrapped in V8 accessors and your JavaScript can pull (copy) data from the structure when ever it needs to. While this approach does not avoid copying data, when used correctly it can avoid holding two copies of large input/output data - it only requires JavaScript to have copies of the parts of the shared data structure it needs "at the moment".
Another method involves building up Node.js Buffer objects and using those structures in your C++ addons. This technique works because Buffer objects allocate data outside of V8 implicitly - so they are indeed accessible from work threads.


Java Remote Method Invocation over Internet Inter-ORB Protocol technology (RMI-IIOP) is part of the Java Platform, Standard Edition (Java SE). The RMI Programming Model enables the programming of CORBA servers and applications via the rmi API. You can choose to work completely within the Java programming language using the Java Remote Method Protocol (JRMP) as the transport, or work with other CORBA-compliant programming languages using the Internet InterORB Protocol (IIOP).
RMI-IIOP utilizes the Java CORBA Object Request Broker (ORB) and IIOP, so you can write all of your code in the Java programming language, and use the rmic compiler to generate the code necessary for connecting your applications via the Internet InterORB Protocol (IIOP) to others written in any CORBA-compliant language. To work with CORBA applications in other languages, IDL can be generated from Java programming language interfaces using the rmic compiler with the -idl option. To generate IIOP stubs and tie classes, use the rmic compiler with the -iiop option.
See the Java RMI over IIOP Technology Home Page.
The Java IDL technology pages include a lot of information that is useful to developers using Java RMI-IIOP technology.
The Object Management Group is the official source of information for all CORBA and IIOP related information. The CORBA 2.3.1 Specification is available electronically from formal/99-10-07. The URLs for the CORBA specifications may change. If the link does not work, visit http://www.omg.org and search for the specification.
For more information on which specifications are implemented in this release of the Java platform, see the compliance document.


A handle, describing the secret-key element that "matches" a part, of the form s^r(X^t).
More...
#include <Ctxt.h>
A handle, describing the secret-key element that "matches" a part, of the form s^r(X^t).
◆ SKHandle()
| helib::SKHandle::SKHandle |
( |
long |
newPowerOfS = 0 , |
|
|
long |
newPowerOfX = 1 , |
|
|
long |
newSecretKeyID = 0 |
|
) |
| |
|
inline |
◆ getPowerOfS()
| long helib::SKHandle::getPowerOfS |
( |
| ) |
const |
|
inline |
◆ getPowerOfX()
| long helib::SKHandle::getPowerOfX |
( |
| ) |
const |
|
inline |
◆ getSecretKeyID()
| long helib::SKHandle::getSecretKeyID |
( |
| ) |
const |
|
inline |
◆ isBase()
| bool helib::SKHandle::isBase |
( |
long |
ofKeyID = 0 | ) |
const |
|
inline |
Is powerOfS==powerOfX==1?
◆ isOne()
| bool helib::SKHandle::isOne |
( |
| ) |
const |
|
inline |
◆ mul()
Computes the "product" of two handles.
The key-ID's and powers of X must match, else an error state arises, which is represented using a key-ID of -1 and returning false. Also, note that inputs may alias outputs.
To determine if the resulting handle can be re-linearized using some key-switching matrices from the public key, use the method pubKey.haveKeySWmatrix(handle,handle.secretKeyID), from the class PubKey in keys.h
◆ operator!=()
| bool helib::SKHandle::operator!= |
( |
const SKHandle & |
other | ) |
const |
|
inline |
◆ operator==()
| bool helib::SKHandle::operator== |
( |
const SKHandle & |
other | ) |
const |
|
inline |
◆ read()
| void helib::SKHandle::read |
( |
std::istream & |
str | ) |
|
◆ setBase()
| void helib::SKHandle::setBase |
( |
long |
newSecretKeyID = -1 | ) |
|
|
inline |
◆ setOne()
| void helib::SKHandle::setOne |
( |
long |
newSecretKeyID = -1 | ) |
|
|
inline |
Set powerOfS=0, powerOfX=1.
◆ write()
| void helib::SKHandle::write |
( |
std::ostream & |
str | ) |
const |
◆ Ctxt
◆ operator>>
| std::istream& operator>> |
( |
std::istream & |
s, |
|
|
SKHandle & |
handle |
|
) |
| |
|
friend |
The documentation for this class was generated from the following files:


Get how-to help and instructions or specific features in
Sign in to continue to IO Technologies.
Forgot your password?


Welcome to the Mizzou Item Management System
Items
Edit Items
Check In/Check Out
Locations
Edit Locations


FreeStick
0.3
Cross Platform Open Sorce Joystick Lib
src
USB
platform
Windows
FSXInputJoystick.cpp File Reference
#include "
USB/platform/Windows/FSXInputJoystick.h
"
#include <sstream>
Include dependency graph for FSXInputJoystick.cpp:
Generated on Mon Mar 16 2020 19:52:26 for FreeStick by
1.8.15


We are going to redirect you to the OICD Authorization Endpoint
Redirect URL:
Those are the parameters:
client_id:
login_hint:
lti_message_hint:
nonce:
prompt:
redirect_uri:
response_mode:
response_type:
scope:
state:
Send it as a url, not as form


Show All
Info-Soldier Here!
Info-Farm Here!
Info-Nuclear-Power Here!
Crises
All Crises
1
2
3
Transportation
All Transportation
Soldier
Aircraft
Stealth Bomber
Helicopter
Ship
Transport Ship
Oil Tanker
Submarine
Truck
Tank
Power and Energy
All Power and Energy
Hydroelectric Plant
Solar Power Plant
Oil Rig
Oil Production Facility
Nuclear Power Plant
Wind Generator
Plants and Manufacturing
All Plants and Manufacturing
Chemical Plant
Silicon Plant
Nuclear Processing Plant
Medical Research Facility
Oil Refinery
Food Processing Plant
Software / Hardware Manufacturing
Entertainment Complex
Metro/City University Area
Farm
This text is displayed if your browser does not support HTML5 Canvas.


Scientific Thinking
Measurement
Numbers and Format
Why it "Matters"?
Physical vs. Chemical
Periodic Table
Valence Electrons
Atoms
Molecules
Nomenclature
Moles, Mass, and Yield
Formulas
Chemical Equations
Stoichiometry
Types of Bonds
Modeling the Bonds
VSEPR
Radioactivity
Scientific Theory
Scientific Thinking
Measurement
Measurement
SI System
The Metric System
Numbers and Format
Precise vs Accurate
Significant Figures
Percent Error
Scientific Notation
Why it "Matters"?
Elements and Compounds
Classification of Matter
Physical and Chemical
Periodic Table
Periodic Table
Groups
Trends
Valence Electrons
Valence Electrons - Main Groups
Valence Electrons - Transition Metals
Electron Configuration
Bonding
Atoms
Introduction to Atoms
Atomic Structure
Atomic Weight and Mass
Isotopes
Atoms - Practice Problems
Molecules
Nuclide Symbols
Molecules
Ions
Making Distinctions
Nomenclature
Naming Ions
Naming Ionic Compounds
Naming Type I compounds
Naming Covalent Molecular Compounds
Naming Ionic Compounds with Transition Metals
Naming Type II compounds
Naming Type III compounds
Naming Binary Ionic Compounds w/Transition Metals and Polyatomic Ions
Naming Type IV compounds
Naming Acids
Moles, Mass, and Yield
Moles and Avogadro's Number
% Composition by Mass
Molar Mass and Conversions
Reacting Mass
Percent Yield and Theoretical Yield
Formulas
Molecular Formuals
Molecular Formulas - Practice Problems
Chemical Equations
Balancing Equations
Balancing Equations Continued
Mole Ratios
Classifying Reaction Types
Predicting the Product
Net Ionic Equation
Equilibrium Constant
Predicting Miscibility
Predicting Solubility
Limiting Reactant
Redox Reactions
Acids and Bases - Calculating pH and pOH
Acids and Bases - Titration Calculations
Stoichiometry
Stoichiometry
Types of Bonds
Types of Bonds
Types of Bonds Continued
Modeling the Bonds
Lewis Dot Structures
Lewis Dot Structures - Practice Problems
Electron Dot Diagrams
Resonance
VSEPR
Introduction to VSEPR
2 Electron Cloud
3 Electron Cloud
4 Electron Cloud
5 Electron Cloud
6 Electron Cloud
Radioactivity
Introduction to Radioactivity
Fission and Fusion
Alpha, Beta, and Gamma Decay


The page you're looking for could not be found! We looked everywhere, even on the Moon, but we couldn't find the thing! :(


It just happened again: I was looking at someone else’s jQuery and I came across something like this:
1
|
|
This is a classic case of “just because you can, doesn’t mean you should.” This little bit of jQuery will, indeed, find every element on a page with a class of “button”, but that’s exactly the problem: it has to look at every element on the page to figure out which ones match the selector. It seems short and sweet, like so much of jQuery is, but on a page with a lot of elements, this selector can actually take a non-trivial amount of time to run.
There are a few ways to avoid this:
- If the element you’re after has an ID attribute, use it. That’s the single-fastest way to find an element. However, don’t gratuitously add ID attributes to elements; the other methods below are perfectly good.
- Specify the type of element you’re after. For example,
$('input.button')
. This will tell jQuery that it’s only looking for inputs, so it can disregard anything on the page that isn’t an input. If you’re looking for multiple element types, tell jQuery that:$('input.button, a.button')
- Give jQuery some information about where to look for the element. For example:
$('#myForm .button')
- Use an element you’ve already found to tell jQuery where to find the element:
1 2
var $ul = $('#myUnorderedList') var $li = $ul.find('.selected');


Vocabulary¶
Some words are important in BlueBanquise.
Ansible vocabulary¶
Host¶
An Ansible host is a remote host managed by Ansible. An host can be a physical server, but also a VM or something else.
Host are defined in /etc/ansible/inventory/cluster/nodes.
Group¶
An Ansible group is a logical aggregation of hosts. For example, system administrator can define a group “data_base_servers” that would contains hosts “database1” and “database2”.
Groups allow Ansible to provide dedicated variables to related hosts or execute tasks on a set of hosts.
Note: an host can be part of multiple groups.
Variables¶
Variables in Ansible follow the YAML structure.
A variable is like in any programming language: an variable name, and a data related.
Multiple kind of variables exist in YAML:
Simple¶
A simple variable is defined this way:
my_variable_1: hello!
my_variable_2: 7777
In Jinja2, variable will be accessible directly this way:
{{my_variable_1}}
Output will be:
hello!
List¶
A list is like an array, and can be iterated over:
my_names_list:
- bob
- alice
- henry
In Jinja2, variable can be iterated over, or a specific value can be used:
{% for i in my_names_list %}
{{i}}
{% endfor %}
{{my_names_list[0]}}
Note that index start at 0.
Output will be:
bob
alice
henry
bob
Note also that to check if a list is empty, it is possible to check the list itself:
{% if my_names_list %}
the list is not empty
{% else %}
the list is empty %}
{% endif %}
Dictionary¶
A dictionary is simply a pack of other variables, defined under it (some kind of variables tree):
my_dictionarry_1:
my_variable_1: hello!
my_variable_2: 7777
my_names_list:
- bob
- alice
- henry
In Jinja2, dictionary can be access two ways:
{% for i in my_dictionarry_1.my_names_list %}
{{i}}
{% endfor %}
{% for i in my_dictionarry_1['my_names_list'] %}
{{i}}
{% endfor %}
{{my_dictionarry_1.my_names_list[0]}}
Output will be:
bob
alice
henry
bob
alice
henry
bob
Jinja2 will be discussed later, do not worry about this point for now.
j2 Variables¶
These are BlueBanquise specific variables. All variables with name starting by j2_ are j2 variables.
These variables are all stored in group_vars/all/engine directory, and are used for the internal purpose of the stack.
You can consider these variables as “functions” that takes as argument the current running host (or the host provided in hostvars if loaded using hostvars call).
These variables are here to simplify templates writing, by removing ugly and redundant things from them, and providing a direct access to values.
To clarify your mind, you can consider that these variables contains a simple value. In reality, they contain Jinja2 code as a string, that will be interpreted by Ansible, which is why these are more functions/API than pure variables.
Inventory, roles, and playbooks¶
Inventory¶
The Ansible inventory is the directory that contains Ansible variables and hosts definitions. In BlueBanquise, default path is /etc/ansible/inventory.
Inventory is the data.
Roles¶
An Ansible role is a list of task to do to achieve a purpose. For example, there will be a role called dhcp_server, that contains task to install, configure and start the dhcp server.
In BlueBanquise, default path is /etc/ansible/roles.
Roles are the automation logic.
Playbooks¶
An Ansible playbook is simply a list of roles to apply, on a specific host or group of hosts. It is a yml file.
In BlueBanquise, default path is /etc/ansible/playbooks.
Playbooks are simply your list of roles to apply on your hosts.
Variables precedence¶
We are reaching the very important part of the stack.
Ansible has an internal mechanism called Variables precedence.
When a variable is defined in a yml file, the position of the file in the ansible inventory is critical and very important.
For example, a variable defined in /etc/ansible/inventory/group_vars/all/ will have the less precedence, and a variable defined in /etc/ansible/inventory/cluster will have an higher precedence, and so win if loaded.
The full list of available variables precedence is provided in Ansible documentation: https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable
This feature is key to the stack and key for system administrator to manipulate the BlueBanquise stack they way he/she wants.
For example, values can be set by default, and then redefined for some groups of hosts without changing the default for all others. Or it is simply possible to fix a dynamic variable to the desired value in hosts definitions if dynamic value is not the one expected. Etc.
Inventory can be seen as a giant pizza, in 3D then flatten.
Paste is the variable in /etc/ansible/inventory/group_vars/all
Then large ingredients comes from /etc/ansible/inventory/group_vars/equipment_myequipment
Then small ingredients above are the /etc/ansible/inventory/cluster/nodes/
And pepper and tomatoes (last layer) is the extra-vars at call.
Merge¶
Ansible default hash_behaviour is replace. BlueBanquise is using merge.
When using replace, when a dictionarry is impacted by the variables precedence mechanism, Ansible overwrite the full dictionarry if a variable has an higher precedence somewhere.
When using replace, Ansible will only update the related variable, and keep the original dictionarry and values for all other variables in this doctionarry.
Jinja2¶
Jinja2 is the templating language used by Ansible to render templates in roles. It is heavily used in the stack, and learing Jinja2 will often be needed to create custom roles. (But Jinja2 is very simple).
Full documentation is available in a single page: https://jinja.palletsprojects.com/en/2.10.x/templates/
Stack vocabulary¶
Icebergs¶
Icebergs are logical (and often physical) isolation of ethernet management networks. Most of the time, icebergs are use to:
Spread load over multiple managements servers (for very large clusters). Icebergs are also often called “islands” in these cases.
Secure cluster by dividing specific usages, to prevent compromised system to access all the network.
One Iceberg is composed of one or multiple managements servers, in charge of the same pool of nodes.
BlueBanquise support many kind of configurations, but most common are:
One iceberg¶
For simple systems (small/medium HPC cluster, small enterprise network, university IT practical session room, etc), one iceberg scenario is the standard. One or multiple management will reach the sames ethernet administration networks, and federate the same pool of nodes.
Multiple icebergs¶
For advanced systems, (large HPC clusters needing load spreading with unified network, entreprise network, etc), multiple incebergs can be required. BlueBanquise allows multiple levels of icebergs, for complex needs. Also, a global_network can be defined so all nodes from all icebergs can communicate through this unified network (most of the time an Interconnect network).
Equipment profiles¶
In BlueBanquise, nodes are nearly always part of a group starting with prefix equipment_. These groups are called equipment profiles.
They are used to provide hosts of this group the equipment_profile dictionarry, and other variables if nedeed. This doctionarry defines hosts operating system parameters, kernel parameters, partitionning, etc.
These are key groups of the stack.
It is important to note that equipment_profiles dictionarry cannot be used at an upper level than group_vars. It can, but you must NOT.


{% extends 'layout-v2.html' %} {% block pageTitle %} NHS.UK prototype kit {% endblock %} {% block content %}
To access the Cervical screening management system you will need an NHS Identity Smartcard and an associated role which is assigned by Registration authorities. Login with NHS Identity
Information to add
Help pages " }) }} {{ details({ "text": "I don't have access to the Cervical screening management system", "HTML": "Information to add
Help pages " }) }} {{ details({ "text": "I have an NHS Identity Smartcard but I have forgotten my 6 digit passcode", "HTML": "Information to add
Help pages " }) }}


This is but a Tribute
To the gang that solved a million crimes...
Here's a partial history of the gang's crime solving exploits
1969 - What a Night for a Knight
1969 - Foul Play in Funland
1969 - A Gaggle of Galloping Ghosts
1970 - A Night of Fright is No Delight
1970 - That's Snow Ghost
1970 - Haunted House Hang-up
1978 - A Highland Fling with a Monstrous Thing
1978 - A Menace in Venice
1985 - Ship of Ghouls
1988 - The Sludge Monster from the Earth's Core
To learn more about their fascinating adventures, please click below
Click


Working on "Front-End" vs. Working on "Back-End"
- Models and database schema are Back-End
- HTML, CSS, and JavaScript are Front-End
- Controllers and Routers are ehhhhhh...
By: Terian Koscik
@spine_cone
www.pineconedoesthings.com/surreal
While working on your project, don’t forget to push it to GitHub or save it to a USB drive.
Visit en.wikipedia.org/wiki/special:random
to get your new app’s name
Push it to GitHub or save it to a USB drive and pass it along to the next group/pair
Try not to obscure the author's intent too much, but something
looks clearly broken or unfinished
go ahead and fix it.
Push it to GitHub or save it to a USB drive and pass it along to the next group/pair
Take about 5 minutes to come up with a 90 second people should pitch for someone in your group/pair to give on why invest in your awesome app


Congressman @RepLouieGohmert (R-TX) made headlines recently by filing a lawsuit against Vice President #MikePence, seeking to declare the Electoral Count Act of 1887 unconstitutional, which would expand the authority of Pence when #ElectoralVotes are counted on Jan. 6. To learn more about this, and about what will happen when votes on counted, we've invited Rep. Gohmert to speak with us.
@Transparency2020 #Transparency2020
Watch the full episode 👇
1/5/21 We need to contact/email etc. Pence but also helpful Senators & civilly demand that he sends back the dual competing slates back to the state local legislators. THAT IS HUGE! Can be done & even Lincoln POSTPONED the constitutional Jan 20 swearing in date! Also, DEMAND SPECIAL SESSION! If Gov’s lets local LEGISLATORS see ALL they WILL decertify electoral votes for the state! Send clean to DC! Go WWW STOPTHESTEAL. US #STOPTHESTEAL or TXT 88022 type DEMAND site has ALL the politicians that SHOWN INTEREST & CAN OBJECT & a script! DT wants PROTEST in DC Jan 6. Need hotel? In website. Need ride? Look up (Patriot Caravans for 45) Cant go? Sponsor someone. Cant donate? NP! Help us w/ calls, emails and sharing info! Praying a must BUT act! Visit my profile to share posts (or follow?) if you agree w/ & importantly let our patriots get the info!
TEXAS HAS BALLS!
That’s done and failed. Why are we still talking about it.
The Executive Order should be used in Georgia today to seize voting machines and ballots to restore integrity in this election. Use the National Guard to secure and monitor the process, use video to keep process transparent, and have forensic monitors audit the machines and ballots.
Pence is a man of faith who lives this country. He no dummy. He knows the eyes of history are on him and he will not back down and this country over to the anti-American globalists. All this political drama means nothing.
#RiseUp
#fightback
#stopthesteal
#Jan6th
#civilwar2
BECAUSE OF THE ABUNDANCE of "bad news" we are constantly exposed to, I try to make a daily GOOD NEWS Encouragement post from God's Word; and the posts can be found on my profile page.
I invite you to "Follow", go to my page to read, and then "Echo" the posts so as to encourage others.
Blessings.
We got’em 😎 election hacking evidence incoming
Listen 👇🏽👇🏽👇🏽
He we go again , the Fraudulent election keeps giving at about the 37% mark of the Georgia runoff’s. Democrats get 200000 votes each all of a sudden !
God bless you Louie! True TEXAN who will FIGHT! Keep going!
I don't understand?
Take action: Call Congress at<PHONE_NUMBER>. They are open 24/7. Leave message! Demand an audit! Do it! Patriots step up!
If Pence were allowed to overturn the vote, how long before every Vice President does this from now on?
Don’t matter the judges already denied the case
SOS
Demented Biden did not get 80 million votes!!! Do not let them steal this election!!!  Patriots rise up kick these democrats to the curb!!!!
Why, I wonder? $$$$$$?
All I have to say is “someone better do something, if not, we’re going to be the socialism of the United States.
We all know there is only one solution to drain the swamp! Sadly The system is dead as we have seen.
#operationlaundromat


/**
*
*
* Handles area checks for player location based code not involving CPs.
*
* 0.3
*
*
* Public
*
* Main loop for checking who's where.
* Does minor functions remotely.
* Adds areas remotely.
* Master system interface.
* Recieves transmitted areas.
* Resets the empty array after master change.
*
* Core
*
* Constructor.
* Gets an area's type anx calls the relevant function.
* Called when a player connects.
*
* Stock
*
* Deletes an area.
* Adds a cube.
* Adds a box.
* Adds a circle.
* Adds a sphere.
* Adds a polygon.
* Gets the area a player is in.
* Sets wether a player can use this area.
* Sets wether all players can use this area.
* Sets wether all worlds have this are.
* Sets wether this world has this area.
* Checks if an area is valid.
*
* Static
*
* Checks if a player is in this circular area.
* Checks if a player is in this spherical area.
* Checks if a player is in this polygonal area.
* Checks if a player is in this cubic area.
* Checks if a player is in this rectangular area.
* Adds a area pointer to the unused list.
* Gets the next free area slot.
*
* Inline
*
* Checks if an area is active.
* Gets the number of empty slots.
* Removes slots from the unused count.
*
* Called when a player enters an area.
* Called when a player leaves an area.
*
* Max number of areas.
* Fail return.
* Marker for end of a list.
* Number of worlds an area can be in.
* Number of cells required for a bit array of AREA_WORLDS.
*
* Flags for each area.
* Structure for part of an areas data.
*
*
* Static
*
* Pointer to the first unused area.
* Pointer to the last unused area.
* Number of unused slots.
* Array of area data.
* Array of players' current areas.
*
*
*//** *//*
Legal:
Version: MPL 1.1
The contents of this file are subject to the Mozilla Public License Version
1.1 the "License"; you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the
License.
The Original Code is the YSI framework.
The Initial Developer of the Original Code is Alex "Y_Less" Cole.
Portions created by the Initial Developer are Copyright C 2011
the Initial Developer. All Rights Reserved.
Contributors:
Y_Less
koolk
JoeBullet/Google63
g_aSlice/Slice
Misiur
samphunter
tianmeta
maddinat0r
spacemud
Crayder
Dayvison
Ahmad45123
Zeex
irinel1996
Yiin-
Chaprnks
Konstantinos
Masterchen09
Southclaws
PatchwerkQWER
m0k1
paulommu
udan111
Cheaterman
Thanks:
JoeBullet/Google63 - Handy arbitrary ASM jump code using SCTRL.
ZeeX - Very productive conversations.
koolk - IsPlayerinAreaEx code.
TheAlpha - Danish translation.
breadfish - German translation.
Fireburn - Dutch translation.
yom - French translation.
50p - Polish translation.
Zamaroht - Spanish translation.
Los - Portuguese translation.
Dracoblue, sintax, mabako, Xtreme, other coders - Producing other modes for
me to strive to better.
Pixels^ - Running XScripters where the idea was born.
Matite - Pestering me to release it and using it.
Very special thanks to:
Thiadmer - PAWN, whose limits continue to amaze me!
Kye/Kalcor - SA:MP.
SA:MP Team past, present and future - SA:MP.
Optional plugins:
Gamer_Z - GPS.
Incognito - Streamer.
Me - sscanf2, fixes2, Whirlpool.
*/
#if !defined _INC_y_areas
#tryinclude "y_areas\y_areas_entry"
#endif
#if !defined _INC_y_areas
#tryinclude "YSI_Visual\y_areas\y_areas_entry"
#endif
#if !defined _INC_y_areas
#tryinclude "YSI\YSI_Visual\y_areas\y_areas_entry"
#endif
#if !defined _INC_y_areas
#tryinclude
#endif
#if !defined _INC_y_areas
#tryinclude
#endif
#if !defined _INC_y_areas
#error Could not find y_areas
#endif