The document describes the author's early experiences with web development in the 1990s. It discusses how in 1994-1995, when the author was a student, they created one of the first Perl CGI programs - a Daleks robot puzzle game. They learned HTML, Perl and CGI programming through this project. It also covers how in 1995, as one of their first projects as a webmaster, they developed a website for a Muslim organization that showcased innovative techniques for displaying Arabic text as images due to browser limitations at the time.
A very brief look at where certain aspects of typography on the web are today — specifically, methods for replacing OS defaults with other typefaces.
The slides are guides used for a quick (15-20 minute) talk at Refresh Lauderdale, rather than informational, with the exception of the references section at the end, which includes many great resources for typography in general, as well as for setting type on the web in all forms.
Beautiful (& Responsive) Web Typography: Designing for Readability and Meanin...Future Insights
Jason Pamental's talk from Future Insights Live 2014 in Las Vegas: "Responsive web design is one of the most significant advances in web design. But what about your type? We have to look at screen size, relative proportion, device norms and compatibility in order to best present our design and convey its meaning and intent across devices and screen sizes."
Miss Jason's talk? Join us at a future show: www.futureofwebdesign.com. Sign up for our newsletter at futureinsights.com and get 15% off your next conference.
Check out Jason's book on Responsive Typography here: http://bit.ly/rwtbook
Given at the Western MA WordPress meetups, 5/30/12. A short presentation on webfonts. The talk featured a brief introduction to webfonts, considerations for picking the right webfont, and integrating webfonts into WordPress.
Tales from the devops transformation trenchesHolly Cummins
As the worldwide leader of the development community of practice in the IBM Garage, Holly works with enterprises who are trying to adopt devops and shift their businesses to the cloud. Their dream is more effort higher up the value chain, more innovation, and greater adaptability. What they really want is to beat their competitors to market, with something that's better than their competitors, and then evolve it to beat any new competitors.
Somehow, even after deploying Kubernetes and investing in the latest tools, things aren't better. What's getting in the way isn't the technology - setting up build pipelines and wrapping something in a docker container (usually) isn't that hard. Instead, it's the structures that have been put in place to manage risk and the relationships between teams that trip companies up. In this talk, Holly will share some stories of customers struggling to adopt devops - and the adjustments that helped them succeed. This talk explores what skills a team needs, barriers to devops, and how to know if something is ready to ship.
Introducing NoSQL and MongoDB to complement Relational Databases (AMIS SIG 14...Lucas Jellema
This presentation gives an brief overview of the history of relational databases, ACID and SQL and presents some of the key strentgths and potential weaknesses. It introduces the rise of NoSQL - why it arose, what is entails, when to use it. The presentation focuses on MongoDB as prime example of NoSQL document store and it shows how to interact with MongoDB from JavaScript (NodeJS) and Java.
A very brief look at where certain aspects of typography on the web are today — specifically, methods for replacing OS defaults with other typefaces.
The slides are guides used for a quick (15-20 minute) talk at Refresh Lauderdale, rather than informational, with the exception of the references section at the end, which includes many great resources for typography in general, as well as for setting type on the web in all forms.
Beautiful (& Responsive) Web Typography: Designing for Readability and Meanin...Future Insights
Jason Pamental's talk from Future Insights Live 2014 in Las Vegas: "Responsive web design is one of the most significant advances in web design. But what about your type? We have to look at screen size, relative proportion, device norms and compatibility in order to best present our design and convey its meaning and intent across devices and screen sizes."
Miss Jason's talk? Join us at a future show: www.futureofwebdesign.com. Sign up for our newsletter at futureinsights.com and get 15% off your next conference.
Check out Jason's book on Responsive Typography here: http://bit.ly/rwtbook
Given at the Western MA WordPress meetups, 5/30/12. A short presentation on webfonts. The talk featured a brief introduction to webfonts, considerations for picking the right webfont, and integrating webfonts into WordPress.
Tales from the devops transformation trenchesHolly Cummins
As the worldwide leader of the development community of practice in the IBM Garage, Holly works with enterprises who are trying to adopt devops and shift their businesses to the cloud. Their dream is more effort higher up the value chain, more innovation, and greater adaptability. What they really want is to beat their competitors to market, with something that's better than their competitors, and then evolve it to beat any new competitors.
Somehow, even after deploying Kubernetes and investing in the latest tools, things aren't better. What's getting in the way isn't the technology - setting up build pipelines and wrapping something in a docker container (usually) isn't that hard. Instead, it's the structures that have been put in place to manage risk and the relationships between teams that trip companies up. In this talk, Holly will share some stories of customers struggling to adopt devops - and the adjustments that helped them succeed. This talk explores what skills a team needs, barriers to devops, and how to know if something is ready to ship.
Introducing NoSQL and MongoDB to complement Relational Databases (AMIS SIG 14...Lucas Jellema
This presentation gives an brief overview of the history of relational databases, ACID and SQL and presents some of the key strentgths and potential weaknesses. It introduces the rise of NoSQL - why it arose, what is entails, when to use it. The presentation focuses on MongoDB as prime example of NoSQL document store and it shows how to interact with MongoDB from JavaScript (NodeJS) and Java.
With AWS Lambda, you can easily build scalable microservices for mobile, web, and IoT applications or respond to events from other AWS services without managing infrastructure. In this session, you’ll see demonstrations and hear more about newly launched features. We’ll show you how to use Lambda to build web, mobile, or IoT backends and voice-enabled apps, and we’ll show you how to extend both AWS and third party services by triggering Lambda functions. We’ll also provide productivity and performance tips for getting the most out of your Lambda functions and show how cloud native architectures use Lambda to eliminate “cold servers” and excess capacity without sacrificing scalability or responsiveness.
This session introduces the concepts of AWS Identity and Access Management (IAM) and walks through the tools and strategies you can use to control access to your AWS environment. We describe IAM users, groups, and roles and how to use them. We demonstrate how to create IAM users and roles, and grant them various types of permissions to access AWS APIs and resources.
Big data nowadays is a new challenge to be managed, not as a barrier to grow up business. Data storages costs relatively is inexpensive, with more transactions generated from social media, machine, and sensors, data increased from pieces by pieces into pentabytes.
This slide explained what the challenges of Big Data (Volume, Velocity, and Variety) and give a solution how to managed them.
There are many tools that could help to solve the problems, but the main focus tools in this slide is Apache Hadoop.
The report offers to marketers 25 open, click-through, list churn and mobile metrics to help you see where you rank, delivering more visuals so you can better understand the data, and sharing more observations to help you improve your marketing programs.
The future of insurance distribution: New models for a digital customerAccenture Insurance
This report argues that incumbents need to embrace digital disruption, form partnerships and adopt innovative technologies to improve customer engagement and create new opportunities for growth. It introduces five new distribution models that insurers should consider, as well as six ‘lenses’ through which they can be evaluated.
Your insurance clients know that far-sighted players are already confronting the future of insurance distribution. Use this report to help them assess their options.
Tracxn Research - Chatbots Landscape, February 2017Tracxn
Deal volume and total dollars invested in the chatbots landscape rose by 108% and 129% respectively in 2016, with 192 chatbot startups setting up shop in 2016.
FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...Marco Cedaro
General purpose Javascript frameworks are the ones that made the language popular in the past, but right now it is a risk to think about our application development and architecture just in relation to our favorite framework.
This talk highlights risks and suggest some techniques (from design patterns to snippet of code) to avoid being coupled to a specific framework
With AWS Lambda, you can easily build scalable microservices for mobile, web, and IoT applications or respond to events from other AWS services without managing infrastructure. In this session, you’ll see demonstrations and hear more about newly launched features. We’ll show you how to use Lambda to build web, mobile, or IoT backends and voice-enabled apps, and we’ll show you how to extend both AWS and third party services by triggering Lambda functions. We’ll also provide productivity and performance tips for getting the most out of your Lambda functions and show how cloud native architectures use Lambda to eliminate “cold servers” and excess capacity without sacrificing scalability or responsiveness.
This session introduces the concepts of AWS Identity and Access Management (IAM) and walks through the tools and strategies you can use to control access to your AWS environment. We describe IAM users, groups, and roles and how to use them. We demonstrate how to create IAM users and roles, and grant them various types of permissions to access AWS APIs and resources.
Big data nowadays is a new challenge to be managed, not as a barrier to grow up business. Data storages costs relatively is inexpensive, with more transactions generated from social media, machine, and sensors, data increased from pieces by pieces into pentabytes.
This slide explained what the challenges of Big Data (Volume, Velocity, and Variety) and give a solution how to managed them.
There are many tools that could help to solve the problems, but the main focus tools in this slide is Apache Hadoop.
The report offers to marketers 25 open, click-through, list churn and mobile metrics to help you see where you rank, delivering more visuals so you can better understand the data, and sharing more observations to help you improve your marketing programs.
The future of insurance distribution: New models for a digital customerAccenture Insurance
This report argues that incumbents need to embrace digital disruption, form partnerships and adopt innovative technologies to improve customer engagement and create new opportunities for growth. It introduces five new distribution models that insurers should consider, as well as six ‘lenses’ through which they can be evaluated.
Your insurance clients know that far-sighted players are already confronting the future of insurance distribution. Use this report to help them assess their options.
Tracxn Research - Chatbots Landscape, February 2017Tracxn
Deal volume and total dollars invested in the chatbots landscape rose by 108% and 129% respectively in 2016, with 192 chatbot startups setting up shop in 2016.
FFWD.PRO - It's not you, It's me (or how to avoid being coupled with a Javasc...Marco Cedaro
General purpose Javascript frameworks are the ones that made the language popular in the past, but right now it is a risk to think about our application development and architecture just in relation to our favorite framework.
This talk highlights risks and suggest some techniques (from design patterns to snippet of code) to avoid being coupled to a specific framework
2014 conference keynote addressing the agenda of the conference. Highlighting the changes and improvements in tech, and predictions for the next coming year.
Beyond your daily coding - The Conf Brazil 2017 KeynoteEmerson Macedo
So, you're a programmer, software developer, or something like this. Your main work is to develop software to add value to the company you work for. But for sure, your company expects more from you, and that's always many opportunities to add value that maybe you're not observing carefully.
On this talk, I'll tell you a story about introducing Elixir at Globo.com while doing my daily job. From this story and others from my career, I extracted some patterns to share with you, about how to identify these opportunities, create something valuable and convince the company that this is the right move for them.
Building Stuff for Fun and Profit - confessions from a life in code and cablesHolly Cummins
I love making stuff. I'm so happy that my job allows me to make stuff, and when I'm not at work, I'm making stuff anyway. Some of the stuff I've made has solved real technical and business problems; some of it I've done just to see if I can. In this talk I'll describe some of the valuable things I've built for my employer, IBM, and our clients - I'll also describe some of the ridiculous things I've made for myself.
These are slides for a talk given at BuildStuff Odessa, 2016 (http://www.buildstuff.com.ua/odessa/)
Outrageous ideas for Graph Databases
Almost every graph database vendor raised money in 2021. I am glad they did, because they are going to need the money. Our current Graph Databases are terrible and need a lot of work. There I said it. It's the ugly truth in our little niche industry. That's why despite waiting for over a decade for the "Year of the Graph" to come we still haven't set the world on fire. Graph databases can be painfully slow, they can't handle non-graph workloads, their APIs are clunky, their query languages are either hard to learn or hard to scale. Most graph projects require expert shepherding to succeed. 80% of the work takes 20% of the time, but that last 20% takes forever. The graph database vendors optimize for new users, not grizzly veterans. They optimize for sales not solutions. Come listen to a Rant by an industry OG on where we could go from here if we took the time to listen to the users that haven't given up on us yet.
AMP is a knee jerk reaction to how we’ve ruined the web experience for visitors. Learn how to take back control of your site from Google and make your site fast again!
Professional and Clean PowerPoint slides. Fully editable, perfect to impress your audience on your next presentation.
1. FULL HD Aspect Ratio: 16:9 (1900×1080)
2. Fully animated
3. Quickly, Easy and Fully Editable in PowerPoint (All Graphic Resizable and Editable)
4. Drag and Drop Images
5. Print Version Included (A4 Handouts Ready)
6. Retina Ready
7. Data charts (Editable via Excel)
8. Sync in SharePoint
9. Based on Master Slide
10. Pictures Placeholder Ready
11. PPTX and PPT Files
12. Vector icons as Shape
Note: Not need Photoshop – All Photos not included
Advanced Debugging with Xcode - Extending LLDBAijaz Ansari
If you’ve ever written an app that fetches JSON from a server, you may have wanted to examine it to figure out if your app fails because of a client bug or because the JSON isn’t what you expected. Of course, there are ways to examine strings from within your XCode debugging session, but there are some extremely powerful third-party tools out there that make JSON examination and manipulation very easy. Wouldn’t it be nice if you could use those tools from within your lldb session?
Wonder no more! LLDB has a built-in Python interpreter. With some simple Python scripting you will be able to extend LLDB so that those third-party tools can have access to your NSStrings (or Swift strings, of course). No more switching to Terminal and pasting text and then switching back to XCode. Do everything from within an XCode breakpoint, if you want.
If you don’t know Python, or don’t fetch JSON, don’t fret: By the time we’re done, you will know how to extend LLDB to do things that aren’t on the XCode feature list.
In this talk I show you how to examine JSON data using the jq command-line tool.
Sample files and more discussion can be found on blog at http://aijaz.net/2016/10/25/jq/
Accelerate your Kubernetes clusters with Varnish CachingThijs Feryn
A presentation about the usage and availability of Varnish on Kubernetes. This talk explores the capabilities of Varnish caching and shows how to use the Varnish Helm chart to deploy it to Kubernetes.
This presentation was delivered at K8SUG Singapore. See https://feryn.eu/presentations/accelerate-your-kubernetes-clusters-with-varnish-caching-k8sug-singapore-28-2024 for more details.
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
Keynote at DIGIT West Expo, Glasgow on 29 May 2024.
Cheryl Hung, ochery.com
Sr Director, Infrastructure Ecosystem, Arm.
The key trends across hardware, cloud and open-source; exploring how these areas are likely to mature and develop over the short and long-term, and then considering how organisations can position themselves to adapt and thrive.
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
The publishing industry has been selling digital audiobooks and ebooks for over a decade and has found its groove. What’s changed? What has stayed the same? Where do we go from here? Join a group of leading sales peers from across the industry for a conversation about the lessons learned since the popularization of digital books, best practices, digital book supply chain management, and more.
Link to video recording: https://bnctechforum.ca/sessions/selling-digital-books-in-2024-insights-from-industry-leaders/
Presented by BookNet Canada on May 28, 2024, with support from the Department of Canadian Heritage.
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
JMeter webinar - integration with InfluxDB and GrafanaRTTS
Watch this recorded webinar about real-time monitoring of application performance. See how to integrate Apache JMeter, the open-source leader in performance testing, with InfluxDB, the open-source time-series database, and Grafana, the open-source analytics and visualization application.
In this webinar, we will review the benefits of leveraging InfluxDB and Grafana when executing load tests and demonstrate how these tools are used to visualize performance metrics.
Length: 30 minutes
Session Overview
-------------------------------------------
During this webinar, we will cover the following topics while demonstrating the integrations of JMeter, InfluxDB and Grafana:
- What out-of-the-box solutions are available for real-time monitoring JMeter tests?
- What are the benefits of integrating InfluxDB and Grafana into the load testing stack?
- Which features are provided by Grafana?
- Demonstration of InfluxDB and Grafana using a practice web application
To view the webinar recording, go to:
https://www.rttsweb.com/jmeter-integration-webinar
Generating a custom Ruby SDK for your web service or Rails API using Smithyg2nightmarescribd
Have you ever wanted a Ruby client API to communicate with your web service? Smithy is a protocol-agnostic language for defining services and SDKs. Smithy Ruby is an implementation of Smithy that generates a Ruby SDK using a Smithy model. In this talk, we will explore Smithy and Smithy Ruby to learn how to generate custom feature-rich SDKs that can communicate with any web service, such as a Rails JSON API.
Elevating Tactical DDD Patterns Through Object CalisthenicsDorra BARTAGUIZ
After immersing yourself in the blue book and its red counterpart, attending DDD-focused conferences, and applying tactical patterns, you're left with a crucial question: How do I ensure my design is effective? Tactical patterns within Domain-Driven Design (DDD) serve as guiding principles for creating clear and manageable domain models. However, achieving success with these patterns requires additional guidance. Interestingly, we've observed that a set of constraints initially designed for training purposes remarkably aligns with effective pattern implementation, offering a more ‘mechanical’ approach. Let's explore together how Object Calisthenics can elevate the design of your tactical DDD patterns, offering concrete help for those venturing into DDD for the first time!
UiPath Test Automation using UiPath Test Suite series, part 4DianaGray10
Welcome to UiPath Test Automation using UiPath Test Suite series part 4. In this session, we will cover Test Manager overview along with SAP heatmap.
The UiPath Test Manager overview with SAP heatmap webinar offers a concise yet comprehensive exploration of the role of a Test Manager within SAP environments, coupled with the utilization of heatmaps for effective testing strategies.
Participants will gain insights into the responsibilities, challenges, and best practices associated with test management in SAP projects. Additionally, the webinar delves into the significance of heatmaps as a visual aid for identifying testing priorities, areas of risk, and resource allocation within SAP landscapes. Through this session, attendees can expect to enhance their understanding of test management principles while learning practical approaches to optimize testing processes in SAP environments using heatmap visualization techniques
What will you get from this session?
1. Insights into SAP testing best practices
2. Heatmap utilization for testing
3. Optimization of testing processes
4. Demo
Topics covered:
Execution from the test manager
Orchestrator execution result
Defect reporting
SAP heatmap example with demo
Speaker:
Deepak Rai, Automation Practice Lead, Boundaryless Group and UiPath MVP
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Albert Hoitingh
In this session I delve into the encryption technology used in Microsoft 365 and Microsoft Purview. Including the concepts of Customer Key and Double Key Encryption.
2. The year was 1994. I was a student at UIC. There was a buzz in the lab where I work. Mosaic had been out
for 6 months. Now there was a new version of BBEdit out that had support for HTML. I already wanted to
learn perl so I thought this would be a great opportunity to write a perl CGI program for the Daleks game.
1994
3. The year was 1994. I was a student at UIC. There was a buzz in the lab where I work. Mosaic had been out
for 6 months. Now there was a new version of BBEdit out that had support for HTML. I already wanted to
learn perl so I thought this would be a great opportunity to write a perl CGI program for the Daleks game.
buzz
4. The year was 1994. I was a student at UIC. There was a buzz in the lab where I work. Mosaic had been out
for 6 months. Now there was a new version of BBEdit out that had support for HTML. I already wanted to
learn perl so I thought this would be a great opportunity to write a perl CGI program for the Daleks game.
Mosaic
5. The year was 1994. I was a student at UIC. There was a buzz in the lab where I work. Mosaic had been out
for 6 months. Now there was a new version of BBEdit out that had support for HTML. I already wanted to
learn perl so I thought this would be a great opportunity to write a perl CGI program for the Daleks game.
BBEdit
6. The year was 1994. I was a student at UIC. There was a buzz in the lab where I work. Mosaic had been out
for 6 months. Now there was a new version of BBEdit out that had support for HTML. I already wanted to
learn perl so I thought this would be a great opportunity to write a perl CGI program for the Daleks game.
HTML
7. The year was 1994. I was a student at UIC. There was a buzz in the lab where I work. Mosaic had been out
for 6 months. Now there was a new version of BBEdit out that had support for HTML. I already wanted to
learn perl so I thought this would be a great opportunity to write a perl CGI program for the Daleks game.
perl
8. The year was 1994. I was a student at UIC. There was a buzz in the lab where I work. Mosaic had been out
for 6 months. Now there was a new version of BBEdit out that had support for HTML. I already wanted to
learn perl so I thought this would be a great opportunity to write a perl CGI program for the Daleks game.
daleks
9. If you don't know the Daleks game, it's a simple game where you're on a grid you avoid the killer robots by making them
run into each other. You make a move, and then the computers make a move. It's a great game with which to learn a
new language or new environment. Since I didn't know how to save data on the server I passed the entire board as the
part of the query string.
http://www.isaacsukin.com/news/2012/01/daleks-robot-puzzle-game
10. If you don't know the Daleks game, it's a simple game where you're on a grid you avoid the killer robots by making them
run into each other. You make a move, and then the computers make a move. It's a great game with which to learn a
new language or new environment. Since I didn't know how to save data on the server I passed the entire board as the
part of the query string.
sessions
11. If you don't know the Daleks game, it's a simple game where you're on a grid you avoid the killer robots by making them
run into each other. You make a move, and then the computers make a move. It's a great game with which to learn a
new language or new environment. Since I didn't know how to save data on the server I passed the entire board as the
part of the query string.
http://example.com/cgi-bin/robots.pl?board=..R..X..RR.R
12. Since I didn't understand forms yet, all commands were
simple anchor tags:
<a href="/cgi-bin/robots.pl?board=.R.X..&command=left">Move Left</a>
<a href="/cgi-bin/robots.pl?board=.R.X..&command=right">Move Right</a>
<a href="/cgi-bin/robots.pl?board=.R.X..&command=NewGame">New Game</a>
13. The program worked great, and we enjoyed playing it. I learned perl and HTML and CGI programming at the same time. I also
learned that it caused someone else's server to run out of disk space. Another student decided he wanted to learn how to
write a web crawler. He'd search for links on a page, log each one to a file, and then follow them. His crawler found my robots
program, and got addicted. Happily playing game after game and logging each move until it ran out of disk space. Oops!
14. The program worked great, and we enjoyed playing it. I learned perl and HTML and CGI programming at the same time. I also
learned that it caused someone else's server to run out of disk space. Another student decided he wanted to learn how to
write a web crawler. He'd search for links on a page, log each one to a file, and then follow them. His crawler found my robots
program, and got addicted. Happily playing game after game and logging each move until it ran out of disk space. Oops!
learned
15. The program worked great, and we enjoyed playing it. I learned perl and HTML and CGI programming at the same time. I also
learned that it caused someone else's server to run out of disk space. Another student decided he wanted to learn how to
write a web crawler. He'd search for links on a page, log each one to a file, and then follow them. His crawler found my robots
program, and got addicted. Happily playing game after game and logging each move until it ran out of disk space. Oops!
disk space
16. The program worked great, and we enjoyed playing it. I learned perl and HTML and CGI programming at the same time. I also
learned that it caused someone else's server to run out of disk space. Another student decided he wanted to learn how to
write a web crawler. He'd search for links on a page, log each one to a file, and then follow them. His crawler found my robots
program, and got addicted. Happily playing game after game and logging each move until it ran out of disk space. Oops!
crawler
17. Hello. My name is Aijaz, and I've been breaking things on the web since 1994. This is a
story about how I wound up where I am today, with Flask, and what I learned along the
way.
Oops!
18. Hello. My name is Aijaz, and I've been breaking things on the web since 1994. This is a
story about how I wound up where I am today, with Flask, and what I learned along the
way.
/index.html
Hello
19. Hello. My name is Aijaz, and I've been breaking things on the web since 1994. This is a
story about how I wound up where I am today, with Flask, and what I learned along the
way.
@_aijaz_
20. I started my professional career in 1995 as a call processing developer at Motorola. If you used a cell phone in the late 1990s, chances are you were
running my code. After about 5 years, I quit and started my own Web Hosting and Application Development company. When it became obvious that
that wasn't sustainable, I moved to the financial industry and started working at Citadel, in this very building. 8 years later, I decided to switch careers
and become an iOS developer. I'm currently working for FastModel Sports where I write iOS apps for NBA and NCAA basketball coaches. But today I
want to talk to about the web.
/about/
21. I started my professional career in 1995 as a call processing developer at Motorola. If you used a cell phone in the late 1990s, chances are you were
running my code. After about 5 years, I quit and started my own Web Hosting and Application Development company. When it became obvious
that that wasn't sustainable, I moved to the financial industry and started working at Citadel, in this very building. 8 years later, I decided to switch
careers and become an iOS developer. I'm currently working for FastModel Sports where I write iOS apps for NBA and NCAA basketball coaches. But
today I want to talk to about the web.
22. I started my professional career in 1995 as a call processing developer at Motorola. If you used a cell phone in the late 1990s, chances are you were
running my code. After about 5 years, I quit and started my own Web Hosting and Application Development company. When it became obvious
that that wasn't sustainable, I moved to the financial industry and started working at Citadel, in this very building. 8 years later, I decided to switch
careers and become an iOS developer. I'm currently working for FastModel Sports where I write iOS apps for NBA and NCAA basketball coaches. But
today I want to talk to about the web.
23. I started my professional career in 1995 as a call processing developer at Motorola. If you used a cell phone in the late 1990s, chances are you were
running my code. After about 5 years, I quit and started my own Web Hosting and Application Development company. When it became obvious
that that wasn't sustainable, I moved to the financial industry and started working at Citadel, in this very building. 8 years later, I decided to switch
careers and become an iOS developer. I'm currently working for FastModel Sports where I write iOS apps for NBA and NCAA basketball coaches. But
today I want to talk to about the web.
24. I started my professional career in 1995 as a call processing developer at Motorola. If you used a cell phone in the late 1990s, chances are you were
running my code. After about 5 years, I quit and started my own Web Hosting and Application Development company. When it became obvious
that that wasn't sustainable, I moved to the financial industry and started working at Citadel, in this very building. 8 years later, I decided to switch
careers and become an iOS developer. I'm currently working for FastModel Sports where I write iOS apps for NBA and NCAA basketball coaches. But
today I want to talk to about the web.
25. You already know about robots.pl. Perl, CGI. using cgi-lib.pl
1994
26. I was asked to make a website - we called them homepages back then - for a Muslim
organization. That was the first time I became a webmaster. This was the website in all its
mid 1990s glory.
1995
27. - Gratuitous Landing page CHECK
- Drop shadow? CHECK
- Emboss and beveled text? CHECK
- Arbitrary perspective? CHECK
- HTML image maps? CHECK
- Custom horizontal rules? CHECK
- Text rendered as an image because the
browsers couldn't handle the formatting? CHECK
- The only thing it's missing is a lovingly
28. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
arabic
29. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
arabic
30. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
scan
31. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
disk space
32. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
Boutell.com
33. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
gd
34. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
scanned chars
35. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text from print,
but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified it so it could
convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. Right to left, proportional widths. This way, a large image like
this, instead of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was
new.
scanned chars
36. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text
from print, but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified
it so it could convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. This way, a large image like this, instead
of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was new.
a.out
void main(int argc, char ** argv)
{
gdImagePtr im, im2;
FILE *out;
//...
printf("Content-type: image/gifnn");
/* Allocate the image: with a horiz padding */
im = gdImageCreate(MAXWIDTH + 10, height * 52);
// ...
/* Output the image to stdout. */
gdImageInterlace(im, 1);
gdImageGif(im, stdout);
/* Destroy the image in memory. */
gdImageDestroy(im);
}
37. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text
from print, but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified
it so it could convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. This way, a large image like this, instead of
taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was new.
tiny
38. At that time it was not possible to display Arabic text in the browser, but I had a ton of text that needed to be displayed. I could scan the text
from print, but I didn't have too much disk space on my hosted account. So I went to Boutell.com, downloaded his gd C library. Then I modified
it so it could convert ascii text to scanned bitmaps, and joined those bitmaps to create gifs on the fly. This way, a large image like this, instead
of taking 100K would only be 400 bytes. Of all the things I've ever done on the web, this is the one I'm most proud of. Because it was new.
proud
39. I got a chance to take a "Webmastering" class. Even though the title was cheesy, this was one of the best classes I
ever took. They spent an entire day talking about how Apache Modules worked and how they were written with the
HTTP specification in mind. Even though I really didn't want to write Apache Modules in C, I finally really understood
how the different components worked together.
1998
40. I got a chance to take a "Webmastering" class. Even though the title was cheesy, this was one of the best classes I
ever took. They spent an entire day talking about how Apache Modules worked and how they were written with the
HTTP specification in mind. Even though I really didn't want to write Apache Modules in C, I finally really understood
how the different components worked together.
webmastering
41. I got a chance to take a "Webmastering" class. Even though the title was cheesy, this was one of the best classes I
ever took. They spent an entire day talking about how Apache Modules worked and how they were written with the
HTTP specification in mind. Even though I really didn't want to write Apache Modules in C, I finally really understood
how the different components worked together.
apache modules
42. And when Modperl came along, I was able to create complex websites that were more
than single form-based pages. The first app I created was absolutely horrid. It was an e-
commerce app, and when I look at it now, I can see it was UGLY.
2000
43. And when Modperl came along, I was able to create complex websites that were more
than single form-based pages. The first app I created was absolutely horrid. It was an e-
commerce app, and when I look at it now, I can see it was UGLY.
mod_perl
44. And when Modperl came along, I was able to create complex websites that were more
than single form-based pages. The first app I created was absolutely horrid. It was an e-
commerce app, and when I look at it now, I can see it was UGLY.
e-commerce
45. And when Modperl came along, I was able to create complex websites that were more
than single form-based pages. The first app I created was absolutely horrid. It was an e-
commerce app, and when I look at it now, I can see it was UGLY.
UGLY
46. But, I kept reading and learning and with each eCommerce app or CRM website, I got better. Learned new things.
Became better at SQL. As time passed I started getting a nagging feeling - I was becoming too comfortable with my
stack. I started ignoring new things out there like the popular templating toolkits because I had written my own back in
the 90s. I started to feel that the world was passing me by, but I was too busy to adapt.
reading
47. But, I kept reading and learning and with each eCommerce app or CRM website, I got better. Learned new things.
Became better at SQL. As time passed I started getting a nagging feeling - I was becoming too comfortable with my
stack. I started ignoring new things out there like the popular templating toolkits because I had written my own back in
the 90s. I started to feel that the world was passing me by, but I was too busy to adapt.
comfortable
48. But, I kept reading and learning and with each eCommerce app or CRM website, I got better. Learned new things.
Became better at SQL. As time passed I started getting a nagging feeling - I was becoming too comfortable with my
stack. I started ignoring new things out there like the popular templating toolkits because I had written my own back in
the 90s. I started to feel that the world was passing me by, but I was too busy to adapt.
busy
49. Once I started working at Citadel upstairs my webdev activity came almost to a standstill. I had switched over
to the financial industry. I was mantaining existing apps here and there, but not really doing too much new stuff.
It was only in 2009 when I started doing some internal web apps. Again, using Mod_perl, apache httpd 1.3
2005
50. Once I started working at Citadel upstairs my webdev activity came almost to a standstill. I had switched over
to the financial industry. I was mantaining existing apps here and there, but not really doing too much new stuff.
It was only in 2009 when I started doing some internal web apps. Again, using Mod_perl, apache httpd 1.3
Citadel
51. Once I started working at Citadel upstairs my webdev activity came almost to a standstill. I had switched over
to the financial industry. I was mantaining existing apps here and there, but not really doing too much new stuff.
It was only in 2009 when I started doing some internal web apps. Again, using Mod_perl, apache httpd 1.3
standstill
52. Once I started working at Citadel upstairs my webdev activity came almost to a standstill. I had switched over
to the financial industry. I was mantaining existing apps here and there, but not really doing too much new stuff.
It was only in 2009 when I started doing some internal web apps. Again, using Mod_perl, apache httpd 1.3
internal apps
53. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
turning point
54. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
one page
55. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
failed
56. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
weekend
57. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
no instructions
58. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
stagnating
59. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
greener pastures
60. The turning point was in 2012. My sister-in-law was getting married. She wanted a simple website. A pretty one-page thing that would give guests venue and
accomodation information, and would allow them to RSVP. We've all done this dozens of times, right? I fired up a Linux virtual server, installed Apache httpd 2, perl. And
then everything failed. Modperl didn't install. I don't wanna bore you with the details, but for that one simple website I spent an entire **weekend** setting up the server and
then writing a blog post about it because in 2012 you could not find **instructions** on how to set up modperl using current versions of perl or apache. Perl was stagnating,
and the formerly vibrant community had long ago moved to greener pastures (like python). That's when I knew: my next website would have to be written in python.
(python)
61. I will now take a 15 second break and play a relevant video
clip
INTERMISSION
62.
63. Fast forward to last November. My brother was starting an Indian delivery-only restaurant preparation and delivery
service and he needed a website as well as a back-end service for the inevitable mobile app. This was my chance to
start from scratch, and not be burdened by the 'old way of doing things.' This was my chance to get out of my comfort
zone and use the language that had been tempting me for the last decade: python.
TurboTiffin
64. Fast forward to last November. My brother was starting an Indian food preparation and delivery service and he needed a
website as well as a back-end service for the inevitable mobile app. This was my chance to start from scratch, and not
be burdened by the 'old way of doing things.' This was my chance to get out of my comfort zone and use the language
that had been tempting me for the last decade: python.
restaurant
65. Fast forward to last November. My brother was starting an Indian food preparation and delivery service and he needed a
website as well as a back-end service for the inevitable mobile app. This was my chance to start from scratch, and not
be burdened by the 'old way of doing things.' This was my chance to get out of my comfort zone and use the language
that had been tempting me for the last decade: python.
start from scratch
66. I knew about Django, and had tried to pick it up several times over the years, but there was something about it that I
just didn't like. I still don't know what it is. People say it's monolithic. Maybe. Maybe the problems that the Django
developers were solving didn't seem like the problems I wanted to solve. So the breakthrough came like so many other
breakthroughs in my life. I went to Google and typed in: Django vs...
django
67. I knew about Django, and had tried to pick it up several times over the years, but there was something about it that I
just didn't like. I still don't know what it is. People say it's monolithic. Maybe. Maybe the problems that the Django
developers were solving didn't seem like the problems I wanted to solve. So the breakthrough came like so many other
breakthroughs in my life. I went to Google and typed in: Django vs...
meh
68.
69. Huh! Flask. Wonder what that's all about. I found
Miguel Grinberg's excellent series of posts on
Flask, bought his book, and that's when I realized
that this was the framework for me. I LOVED the fact
that the Flask book was thin. I LOVED the fact that I
was getting excited about the whole rigamarole:
- Create a virtual environment
- pip3 install all the things
- Run it locally easily
- Install just the modules you want.
huh
70. Huh! Flask. Wonder what that's all about. I found
Miguel Grinberg's excellent series of posts on
Flask, bought his book, and that's when I realized
that this was the framework for me. I LOVED the fact
that the Flask book was thin. I LOVED the fact that I
was getting excited about the whole rigamarole:
- Create a virtual environment
- pip3 install all the things
- Run it locally easily
- Install just the modules you want.
Miguel Grinberg
71. Huh! Flask. Wonder what that's all about. I found
Miguel Grinberg's excellent series of posts on
Flask, bought his book, and that's when I realized
that this was the framework for me. I LOVED the
fact that the Flask book was thin. I LOVED the fact
that I was getting excited about the whole
rigamarole:
- Create a virtual environment
- pip3 install all the things
- Run it locally easily
- Install just the modules you want.
!
72. My requirements for the website and app were pretty ordinary. Now I'm gonna talk about 2 of them and my rationale for choosing
the solutions I did. This is the part where I ask you a favor. As I describe my solutions, please put your skeptics' hats on and try
to find flaws in my arguments or assumptions. If you think I've made the wrong decision, please tell me so. Either during the
presentation, or afterwards. Challenge everything I say. You'll be doing me a great service. Alright back to the requirements.
requirements
73. My requirements for the website and app were pretty ordinary. Now I'm gonna talk about 4 of them and my rationale for choosing
the solutions I did. This is the part where I ask you a favor. As I describe my solutions, please put your skeptics' hats on and try
to find flaws in my arguments or assumptions. If you think I've made the wrong decision, please tell me so. Either during the
presentation, or afterwards. Challenge everything I say. You'll be doing me a great service. Alright back to the requirements.
do me a solid
74. My requirements for the website and app were pretty ordinary. Now I'm gonna talk about 4 of them and my rationale for choosing
the solutions I did. This is the part where I ask you a favor. As I describe my solutions, please put your skeptics' hats on and try
to find flaws in my arguments or assumptions. If you think I've made the wrong decision, please tell me so. Either during the
presentation, or afterwards. Challenge everything I say. You'll be doing me a great service. Alright back to the requirements.
challenge!
76. This is the subsystem that I agonized over the most. The fundamental decision is: Should
I use the high-level ORM that is Flask-SQLAlchemy or should I use raw SQL? I tried to
enumerate the pros and cons of using SQLAchemy
database
77. This is the subsystem that I agonized over the most. The fundamental decision is: Should
I use the high-level ORM that is Flask-SQLAlchemy or should I use raw SQL? I tried to
enumerate the pros and cons of using SQLAchemy
SQLAlchemy?
78. - db independence
- easy integration
- focus on models
- connection pooling
pros
» ease of use
82. pros
» ease of use
» db independence
» easy integration
» focus on models
» connection pooling
83. I didn't want to have to master yet another new
thing just to get version 1.0 working well. I
expected to spend a lot of time working with
Flask, and retraining myself to think like a
Python developer.
- comfort w/ SQL
- PostgreSQL 4 evah
- mobilecontext shifts
- multiple clients
cons
» time
84. I am really comfortable with SQL. After
working for 8 years with one of the best DBAs
in the country upstairs, it's easy for me to
think in terms of multi-table joins.
- PostgreSQL 4 evah
- mobilecontext shifts
- multiple clients
- undo
cons
» time
» comfort w/ SQL
85. I liked the fact my code would work just as well
with PostgreSQL, sqlite3 or any other database.
But the truth is that I will always be using
PostgreSQL, even on my local mac.
- mobilecontext shifts
- multiple clients
- undo
cons
» time
» comfort w/ SQL
» PostgreSQL 4 evah
86. The mobile client would have its own sqlite3 relational
database. It would be similar to the one on the server, so
I would have fewer context shifts when moving from
backend development to mobile and back again.
- multiple clients
- undo
cons
» time
» comfort w/ SQL
» PostgreSQL 4 evah
» mobilecontext shifts
87. The Flask website would not be the only client of the database. I would have batch
jobs that run at different times of the day that update menus, charge customers'
cards for orders placed in advance and print deliver manifests and receipts. Of
course, I could use SQLAlchemy for those jobs as well, but then I'm reminded of the
final point?
- undo
cons
» time
» comfort w/ SQL
» PostgreSQL 4 evah
» mobilecontext shifts
» multiple clients
88. What if I'm joining the Flask bandwagon too late? What if Flask is about to begin its
stagnation? Or, what if I realize it really isn't well suited for what I'm trying to do? How
much work will be required to undo this decision to move to Flask?
cons
» time
» comfort w/ SQL
» PostgreSQL 4 evah
» mobilecontext shifts
» multiple clients
» undo
89. When I looked at all these things together I decide to go with the pure SQL route and on
top of that do something I had never done before. I put all the business logic in the
database. Stored procedures. Lots of them.
cons
» time
» comfort w/ SQL
» PostgreSQL 4 evah
» mobilecontext shifts
» multiple clients
» undo
90. When I looked at all these things together I decide to go with the pure SQL route and on
top of that do something I had never done before. I put all the business logic in the
database. Stored procedures. Lots of them.
sql
91. Everything from logging in, to finding the price of a dish, figuring out the tax, placing an order, applying coupon codes,
EVERTHING would be in the database layer, written in PL/PGSQL. The client code, the Flask Python code, would
never perform a join on two tables. It would instead call stored procedures that would do all of the heavy lifting.
stored procedures
92. Everything from logging in, to finding the price of a dish, figuring out the tax, placing an order, applying coupon codes,
EVERTHING would be in the database layer, written in PL/PGSQL. The client code, the Flask Python code, would
never perform a join on two tables. It would instead call stored procedures that would do all of the heavy lifting.
pl/pgsql
93. Everything from logging in, to finding the price of a dish, figuring out the tax, placing an order, applying coupon codes,
EVERTHING would be in the database layer, written in PL/PGSQL. The client code, the Flask Python code, would never
perform a join on two tables. It would instead call stored procedures that would do all of the heavy lifting. So instead of
calling a bunch of code to create an order, I can just do this.
heavy lifting
94. So instead of calling a bunch of code to create an order, I can just do this. What this gives me is all my
business logic in one place. It's easy to write test cases and verify them. The regression tests themselves are
written as sql statement. It's easy to notice when tests fail. It's just another form of dependency injection
cur.execute("SELECT * FROM f_add_order (%s, %s, %s, %s)",
( session['person_id']
, epoch_date
, section
, items_list))
95. It also allows me to use the psql database prompt to run stored procedures that aren't yet
accessible from the admin web site. Every once in a while, for example, someone will
cancel an order. All I have to do is:
dependency injection
96. All the tables stay in a consistent state while the order is cancelled. I was a little afraid of
not getting connection pooling down right, but after some research I realized I could
create the connection pool when I initialize the app:
select f_mark_order_cancelled(3055);
97. def create_app(config_name) :
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
# attach routes and error pages here
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
# ...
app.connection_pool = ThreadedConnectionPool(min_conn, max_conn,
host=db_host, database=db_database_name, user=db_user_name)
return app
99. This is really for the REST services part of the app, as opposed to the website, where I used cookies. I know what I didn't
want: I didn't wanna use OAuth. It seemed icky for a restaurant to ask for your Google or Facebook credentials, for
example. You and I both know that I wouldn't actually get the credentials, but a very common reaction from users is: Oh,
I need to login via facebook to order a chicken tikka masala? Thanks, but no thanks. GrubHub it is.
authentication
100. It seemed icky for a restaurant to ask for your Google or Facebook credentials, for example. You and I both know that I wouldn't actually get the
credentials, but a very common reaction from users is: Oh, I need to login via facebook to order a chicken tikka masala? Thanks, but no thanks.
GrubHub it is. The other reason I decided not to use OAuth is that I really need the users' email addresses. This is how I send them receipts, let them
know when their credit cards have expired and communicate with them in general. I wanted to make sure that the email addresses I have on file are the
same adresses with which the users wish to communicate with TurboTiffin.
no OAuth
101. The other reason I decided not to use OAuth is that I really need the users' email addresses. This is how I send them receipts, let them know when
their credit cards have expired and communicate with them in general. I wanted to make sure that the email addresses I have on file are the same
adresses with which the users wish to communicate with TurboTiffin. Once the user authenticates with their email and password I create an token that
they can use in lieu of sending me their password every time. This token expires after a few minutes, so that the window of opportunity of using a
stolen token is relatively small.
emails
102. Once the user authenticates with their email and password I create an token that they can use in lieu of sending me their password
every time. This token expires after a few minutes, so that the window of opportunity of using a stolen token is relatively small. Now,
what Grinberg suggests is to use the itsdangerous package. Take the user id and expiration date and cryptographically sign these
two and return the result as a token. The beauty of this system is that the web server doesn't need to store the token locally. The token
has all the information the server needs, in a tamper-proof format.
token
103. Now, what Grinberg suggests is to use the itsdangerous package. Take the user id and expiration date and cryptographically sign these two and return the
result as a token. The beauty of this system is that the web server doesn't need to store the token locally. The token has all the information the server needs, in a
tamper-proof format. I decided not to go that route. I generate a random token and store it the database in clear text. I considered the risks of storing the token
in clear text, and for this application, if you had access to the token, you either had access to the mobile client's secure storage, where the user id and password
are also stored, or you have access to the server database. In either case, knowing the token does not increase the severity of the breach, and unlike storing the
password in cleartext, knowing the token doesn't give you access to other accounts owned by the same person.
itsdangerous
104. I decided not to go that route. I generate a random token and store it the database in clear text. I considered the risks of storing the token in clear
text, and for this application, if you had access to the token, you either had access to the mobile client's secure storage, where the user id and
password are also stored, or you have access to the server database. In either case, knowing the token does not increase the severity of the
breach, and unlike storing the password in cleartext, knowing the token doesn't give you access to other accounts owned by the same person.
tamper-proof
105. I generate a random token and store it the database in clear text. I considered the risks of storing the token in clear text, and for this
application, if you had access to the token, you either had access to the mobile client's secure storage, where the user id and password
are also stored, or you have access to the server database. In either case, knowing the token does not increase the severity of the breach,
and unlike storing the password in cleartext, knowing the token doesn't give you access to other accounts owned by the same person.
random
106. I generate a random token and store it the database in clear text. I considered the risks of storing the token in clear text, and for this
application, if you had access to the token, you either had access to the mobile client's secure storage, where the user id and password
are also stored, or you have access to the server database. In either case, knowing the token does not increase the severity of the breach,
and unlike storing the password in cleartext, knowing the token doesn't give you access to other accounts owned by the same person.
cleartext
107. I generate a random token and store it the database in clear text. I considered the risks of storing the token in clear text, and for this
application, if you had access to the token, you either had access to the mobile client's secure storage, where the user id and password
are also stored, or you have access to the server database. In either case, knowing the token does not increase the severity of the breach,
and unlike storing the password in cleartext, knowing the token doesn't give you access to other accounts owned by the same person.
mobile
108. I generate a random token and store it the database in clear text. I considered the risks of storing the token in clear text, and for this
application, if you had access to the token, you either had access to the mobile client's secure storage, where the user id and password
are also stored, or you have access to the server database. In either case, knowing the token does not increase the severity of the breach,
and unlike storing the password in cleartext, knowing the token doesn't give you access to other accounts owned by the same person.
server
109. In either case, knowing the token does not increase the severity of the breach, and unlike storing the password in cleartext, knowing the token doesn't give you access to other
accounts owned by the same person. I was concerned about the impact of adding a database lookup for every page request, but it appears that the speed is still pretty good: I'm
getting around 20ms to serve a page. So that's pretty good, right? The other effect of having the token stored in the database is that you can quickly see how many people have
been active on your website during the amount of time equal to your token lifespan. And, by deleting a token, you can easily block out clients that may be hitting your server too
frequently. Not that I need to worry about this on a small website, but these are the rationalizations that I came up with. I will be very interested to hear your comments on this.
severity
110. I was concerned about the impact of adding a database lookup for every page request, but it appears that the speed is still pretty good: I'm getting
around 20ms to serve a page. So that's pretty good, right? The other effect of having the token stored in the database is that you can quickly see how
many people have been active on your website during the amount of time equal to your token lifespan. And, by deleting a token, you can easily block
out clients that may be hitting your server too frequently. Not that I need to worry about this on a small website, but these are the rationalizations that I
came up with. I will be very interested to hear your comments on this.
impact on speed
111. I was concerned about the impact of adding a database lookup for every page request, but it appears that the speed is still pretty good: I'm getting
around 20ms to serve a page. So that's pretty good, right? The other effect of having the token stored in the database is that you can quickly see how
many people have been active on your website during the amount of time equal to your token lifespan. And, by deleting a token, you can easily block
out clients that may be hitting your server too frequently. Not that I need to worry about this on a small website, but these are the rationalizations that I
came up with. I will be very interested to hear your comments on this.
GET /admin/receipts => generated 1291 bytes in 21 msecs
112. I was concerned about the impact of adding a database lookup for every page request, but it appears that the speed is still pretty good: I'm getting
around 20ms to serve a page. So that's pretty good, right? The other effect of having the token stored in the database is that you can quickly see how
many people have been active on your website during the amount of time equal to your token lifespan. And, by deleting a token, you can easily block
out clients that may be hitting your server too frequently. Not that I need to worry about this on a small website, but these are the rationalizations that I
came up with. I will be very interested to hear your comments on this.
active
113. I was concerned about the impact of adding a database lookup for every page request, but it appears that the speed is still pretty good: I'm getting
around 20ms to serve a page. So that's pretty good, right? The other effect of having the token stored in the database is that you can quickly see how
many people have been active on your website during the amount of time equal to your token lifespan. And, by deleting a token, you can easily block
out clients that may be hitting your server too frequently. Not that I need to worry about this on a small website, but these are the rationalizations that I
came up with. I will be very interested to hear your comments on this.
block out
114. So there we have it. This is the story of how I got from a perl cgi robots game in 1994
to delivering people Indian food using Flask today. What did I learn along the way?
comments
115. Try to understand how things work under
the hood
NEXT: SHARE WHAT YOU LEARN
» deep learning
116. Write blog posts. Even if no one reads them, you'll
organize your thoughts. Or give talks. Like this one
NEXT: KNOW WHEN TO STOP
» deep learning
» share what you learn
117. Don't stick blindly to one technology or
framework. Know when to move on.
NEXT: FAILURE IS CHARACTER BUILDER
» deep learning
» share what you learn
» know when to stop
118. When you go down a certain path and give up because it doesn't suit
your purpose, don't think of them as bad experiences, think of them as
learning experiences and character builders
NEXT: SECOND-MOST IMPORTANT TASK IS TO WRITE BEAUTIFUL
CODE
» deep learning
» share what you learn
» know when to stop
» character builders
119. Your second-most important task is to create beautiful
code. Your most important task is to ship working code.
FINALLY: CHANGE YOUR OPINION
» deep learning
» share what you learn
» know when to stop
» character builders
» ship on time
120. Be ready to change your opinion when faced with new
data. It's called being an adult.
» deep learning
» share what you learn
» know when to stop
» character builders
» ship on time
» change opinion