| DOSE: |
40 mg |
smoked |
DMT |
(freebase) |
I was feeling quite content and relaxed. It was about 1am, and for the first time in the past week and a half I was not feeling the lingering effects of the cold I had just had anymore. I took some advice that a friendly tripper had given me that melatonin that kicks in late at night and that it can be particularly useful for making the trip easier to handle so I got my pipe and vial of DMT out and weighed out what I believe to be approximately 35-45mg using my 0.01g scales which can be a little inaccurate when they only read 0.04g.
So I sat on my bed against the wall trying to calm myself of my now sped up heart rate, practicing some breathing techniques until it felt right back down and the excitation caused by contemplating what I was about to do was the same as preparing to eat a piece of cake, I was excited but no longer anxious. I sat up on my bed as I held the lighter under my pipe and waited for the smoke to form, inhaling slowly like I would through a straw. I got a nice big hit and there was a desire to exhale, but it was quite surprisingly easy to suppress. I eventually exhaled and instantly felt quite lightheaded and was about to lay down when I decided I wanted more and hit it again.
This second hit produced a much higher amount of smoke, perhaps due to the fact the pipe was already heated this time. I inhaled deeply again and it felt increasingly more difficult to hold in this time, but as I sat there trying to hold it in I saw more smoke building inside the chamber, so I exhaled a little from my lungs again after about 10-20 seconds and inhaled as much of the fresh smoke as possible. I quickly put the pipe down and laid down on my pillow and then slowly exhaled.
There was a brief moment where I thought, 'Am I breathing properly?' as I closed my eyes. Then I started to hear this really nice crackling noise, like when you get a synthesizer and take it to its lowest frequency where the wave forms are so far apart that the resonance creates this awesome ascending crackle that rises through a compression of its monotone. HAHA should probably just use the textbook analogy (like crackling cellophaneÖ though I donít like crackling cellophane and this was far more pleasurable so Iíll stick with my first analogy). There were these intense Symmetrical patterns forming in front of me in a very fluid pattern they were flowing up and down and into each other, then I heard a pop and everything turned 3D.
It was as though my hallucination had evolved and I was in this dome like thing with these eyes all around the outside (they didnít look like eyes, but they felt like eyes, I have no idea what they were actually). But there was this little object in the middle that looked like a praying mantis leg I suppose but slightly metallic, and on both ends of these legs were these eyeballs that were looking down on me and sending me a remarkable sensation of complete peace and euphoria. This leg was rotating around in unpredictable and interesting angles, like it was in the middle of this huge dome/ball that I was looking inside and the ball or gyrus of my brain and was rolling all weird and interesting directions. I had this sensation and imagery of something to similar to clockworks or seeing those little cogs turn together inside a giant machine that together make everything work.
It felt like I was behind the scenes of my brain and there were these little stick insects or whatever you want to call it, revolving in geometrical patterns that made everything in my constant state of perception experience flow. It was as though all the aspects that made me human, I was experiencing for their true presence, in this intensely complex geometrical languages that presented the emotions for desires like hunger, sex, emotion, satisfaction and sleep. My slight impulses could be categorized down into infinite little beings of consciousness that inspire all my motivations that they do with the slightest shift of a gear stick, so to speak.
Then after that I started to feel the hallucinations deteriorating a bit as I started to feel that my whole body had been writhing in ecstasy, much like one would kick and flail about during a nightmare, but there was so much intense euphoria that it could not possibly been a result of a nightmare. As I faded back into reality it was as though I realized that it was this rotating stick that was guiding my whole body telling it to move, it was the one controlling my existence the deterministic presence of the moment. I was living as close to the moment as possible I realized. As during this time I had forgotten who I was, I had forgotten I was alive and I had definitely forgotten I had taken a drug.
But it was so peaceful and euphoric, that when I returned and realized what euphoria actually meant I was ecstatic like my body was just exuding this intense colourful euphoria flowing out from every direction. I looked around my room and there were these intense colourful geometric patterns covering my walls, my carpet, everything. Colours were so extremely vibrant and it was as though they were flowing into each other like liquid, while maintaining this crisp colourful clarity at the same time (hard to explain). I guess a colourful watercolour painting does it only a slight bit of justice it deserves in describing the beauty of it all.
After that I quickly tried to scribble down as many notes as possible, which I later compiled into this trip report and was trying to see if anyone was still awake by my phone, so I could relay this profound experience to someone. I donít know if this is what a breakthrough is meant to sound like, or if it even was one, but it was quite intense and there wasnít an element of fear at all in it all, however I will say this. It was like I was a tube of paint and I was squeezed really tightly, and this huge rainbow of intense euphoria flowed out of my soul and into it all at once. Swirls of the rainbow were pushed while simultaneously being sucked in.
 Iíve had previous DMT experiences that have been mixed with pot where I ventured into my brain before and it felt like I was looking at a little puppet master holding these strings to may state of mind like desires as the ones I mentioned above.  It was by fluid control of these strings that made me, me. This puppet master, or the strings or the beings that control these strings were me. Like some metaphorical language, It is the train that travels through my brain.
Now I never saw ďelvesĒ or anything, so maybe I didnít do enough. But what I did experience was very vague in retrospect, was hard to remember vividly. But Iíve been excited about life since, and also have this desire to hit it again, and probe deeper. Is DMT addictive? It feels profound, like a multitude of drugs Iíve tried all crammed into one and compressed into a dense and difficult to integrate 4 minutes. No real profound insights from this trip alone yet however, just a reconfirmation of previous conceptions. Hopefully this spreads light into those curious about DMT, or those who havenít experienced the elves. Perhaps the eyes and stick insects I experienced were the elves. Who knows, I just wonder how much preconceptions can affect a trip that seems so radically beyond our control.
I guess I was expecting something more, something that would make me question my whole existence and my way of life and perhaps freak me out about my current approach or my drug use. But I think I'm pretty together right now anyway, practicing meditation, not using drugs as much, studying well, working a job that gives me great inspiration, indulging in a multitude of different art forms: producing music, writing, dancing and singing, while also experiencing the culture, spirituality and beauty of both society and the environment of this earth. My preconceptions have always believed DMT to be a shock to the system but as was suggested to me by another DMT fan, is that the fear for DMT is often misinterpreted and although it is profound, it feels like pure love instead... and that it doesÖ PURE ECSTASY!
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Mipui Browser Support
Mipui officially supports Google Chrome, Mozilla Firefox and Apple Safari. The author uses Chrome almost exclusively, so it's unfortunately likely bugs specific to other browsers might sneak in... if you spot such a bug, please let the author know about it!
This app relies on modern web technologies that are not supported by Microsoft Internet Explorer and Microsoft Edge, so they are not supported and are unlikely to work.
Known browser-specific issues
Mozilla Firefox
- Very slow, frequent delays (version 59+) - Disabling Firefox's accessibility access seems to go a long way to fixing that. Go to the firefox menu ≡ > Preferences > Privacy & Security, scroll down to the Permissions section, and check "Prevent accessibility services from accessing your browser".


- CELEBRATING - entities.SpectatorState
-
This is the final state.
- cleanString(String) - Method in class hippodrome.GeneralInformationRepository
-
Cleans a colorful ASCII'd String
, in order to print strings without color characters.
- ClientConfigurations - Class in configurations
-
Definition of the configurations for the entities (also known as clients).
- ClientConfigurations() - Constructor for class configurations.ClientConfigurations
-
- ClientLauncher - Class in clients
-
Main function which must be used to run the various entities classified on
entities
.
- ClientLauncher() - Constructor for class clients.ClientLauncher
-
- clients - package clients
-
Provides the classes necessary to represent any hippodrome region on the client side of
the execution.
- COLLECTING_THE_GAINS - entities.SpectatorState
-
This is a blocking state with transition.
- Color - Class in lib.logging
-
This class serves as basis to concatenate colors on java Strings.
- Color() - Constructor for class lib.logging.Color
-
- communications - package communications
-
Provides the classes necessary to represent any messages to be shared between entities and hippodrome regions.
- configurations - package configurations
-
Provides the classes necessary to configure the executions.
- connection - Variable in class server.ServiceProviderAgent
-
The instance of a connection received from the outside
- CONTROL_CENTRE_ENTERTAIN_THE_GUESTS - communications.MessageType
-
- CONTROL_CENTRE_GO_CHECK_HORSES - communications.MessageType
-
- CONTROL_CENTRE_GO_WATCH_THE_RACE - communications.MessageType
-
- CONTROL_CENTRE_HOST - Static variable in class configurations.ServerConfigurations
-
Definition of the Control Centre host for the execution.
- CONTROL_CENTRE_MAKE_A_MOVE - communications.MessageType
-
- CONTROL_CENTRE_PORT - Static variable in class configurations.ServerConfigurations
-
Definition of the Control Centre port for the execution.
- CONTROL_CENTRE_PROCEED_TO_PADDOCK - communications.MessageType
-
- CONTROL_CENTRE_RELAX_A_BIT - communications.MessageType
-
- CONTROL_CENTRE_REPORT_RESULTS - communications.MessageType
-
- CONTROL_CENTRE_SHUTDOWN - communications.MessageType
-
Message representing a shutdown of the Control Centre
- CONTROL_CENTRE_START_THE_RACE - communications.MessageType
-
- CONTROL_CENTRE_SUMMON_HORSES_TO_PADDOCK - communications.MessageType
-
- CONTROL_CENTRE_TIME_TO_SLEEP - Static variable in class configurations.ServerConfigurations
-
Definition of the Control Centre time to sleep for the execution.
- CONTROL_CENTRE_WAIT_FOR_THE_NEXT_RACE - communications.MessageType
-
- controlCentre - Variable in class entities.Broker
-
- controlCentre - Variable in class entities.HorseJockey
-
- controlCentre - Variable in class entities.Spectator
-
- controlCentre - Variable in class server.ControlCentreProxy
-
A Control Centre instance.
- ControlCentre - Class in hippodrome
-
Place where the
Spectator
s go to enjoy the race (at a Watching Stand) and the
Broker
controls the races and publishes its results.
- ControlCentre(int) - Constructor for class hippodrome.ControlCentre
-
Creates a Control Centre.
- ControlCentreInterface - Interface in hippodrome
-
Interface of the place where the
Spectator
s go to enjoy the race (at a Watching Stand) and the
Broker
controls the races and publishes its results.
- ControlCentreProxy - Class in server
-
Control Centre endpoint representation on the server side.
- ControlCentreProxy() - Constructor for class server.ControlCentreProxy
-
Creates a Control Centre Proxy instance.
- ControlCentreStub - Class in clients
-
Representation of a place where the
Broker
coordinates the race and where the
Spectator
s
come to relax and be entertained.
- ControlCentreStub() - Constructor for class clients.ControlCentreStub
-
- createConnectionWithServer() - Method in class clients.BettingCentreStub
-
Creates a connection to the correspondent server (meaning the
BettingCentre
).
- createConnectionWithServer() - Method in class clients.ControlCentreStub
-
Creates a connection to the correspondent server (meaning the
ControlCentre
).
- createConnectionWithServer() - Method in class clients.GeneralInformationRepositoryStub
-
- createConnectionWithServer() - Method in class clients.PaddockStub
-
Creates a connection to the correspondent server (meaning the
Paddock
).
- createConnectionWithServer() - Method in class clients.RacingTrackStub
-
Creates a connection to the correspondent server (meaning the
RacingTrack
).
- createConnectionWithServer() - Method in class clients.StableStub
-
Creates a connection to the correspondent server (meaning the
Stable
).
- currentHorsesPositions - Variable in class hippodrome.RacingTrack
-
An array with all the positions of the pairs Horse/Jockeys currently on action.
- currentNumberOfHorses - Variable in class hippodrome.Paddock
-
- currentNumberOfSpectators - Variable in class hippodrome.Paddock
-
- currentRaceDistance - Variable in class hippodrome.GeneralInformationRepository
-
Last taken snapshot of the current race distance of track.
- currentRaceNumber - Variable in class hippodrome.Stable
-
Current race number identifier, as an integer.


{% extends "v2/modules/gsoc/base.html" %} {% comment %} Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. {% endcomment %} {% block stylesheets %} {{ block.super }} {% endblock stylesheets %} {% block usermenu %} {% if manage_actions %} {{ manage_actions.render }} {% endif %} {% endblock usermenu %} {% block page_content %}


Parliament.uk uses cookies to make the site simpler. Find out more about cookies.
This is a test website, so may be inaccurate. Give feedback to help improve it.
Maybe you tried to change something you didn"t have access to.


Look in the description of the
video you want to watch for a link
to a captions file. Follow the link.
Copy the text of the captions file
Start playing the video. Notice a
textbox appears under the description.
Paste the caption file text.
Press 'Apply Captions'.


--- layout: default title: Todd DeLuca ---
Todd DeLuca married Haidee Heyward in 2007. They are avid long-distance hikers and thru-hiked the Appalachian Trail in 2003, the Pacific Crest Trail in 2008, and half of the Continental Divide Trail in 2009. More about that at Team Creason. They are the proud parents of John Joseph and Heyward.
Todd grew up in Weston, Connecticut, got his B.A. in Computer Science from Brown University in Providence, Rhode Island, and has lived in both Boston and New York City. He has worked as a scientist at BBN, a software engineer at NewView.com, a scientific programmer in the Wall Laboratory at Harvard Medical School, and an analytics engineer at Cox Automotive in Burlington, Vermont. His professional experience and interests include machine learning, biomedical informatics, data science and software engineering.
Todd currently resides in Burlington, Vermont, works as a data scientist at MassMutual, and is pursuing a PhD in Data Science and Complex Systems at UVM.


Hi! My name is Alisa Thomas and I am a Graduate Electrical Engineering student at The University of Texas at Dallas (UTD). I have industry experience working in the field of Wi-Fi/cellular networking for companies like Boeing, AT&T, and Toyota. My commitment to continue bridging the gender gap of women leaders in the engineering profession is also a subject very close to my heart.


This is ngx-gauge's playground. Here you get the options to fiddle with various properties of gauge
widget directive. Play around and see it working on the right side.
Gauge TypeFullSemiArchCap StyleRoundButt
Size
Thick
MinMax
ValueLabel
PrependAppend
Foreground ColorBackground Color
Thresholds
Toggle the threshold switch to apply a threshold based color range configuration. And change the gauge's
value to see different colors in action. Also if you specify a bgOpacity, this color will be applied the opacity value and shown as the background for that range, otherwise the backgroundColor property value is used.
{{thresholdConfig | json}}
Markers
Toggle the Markers switch to apply a markers configuration and change the value of the gauge to see it in action.


--- layout: page title: About header-img: "img/about-bg.png" ---
Terren Culberson. I'm 45 years old, a husband and a father. I've been in my current career for 21 years and I've decide it was time for a change. I live in the great state of Texas. I'm a life long Dallas Cowboys fan and I'm a devoted Christian.


Spectral Mafia Jam was the randomly selected theme for our team that we spent 2.5 days working on in Unity.
Player controls and movement.
Game juice (e.g. playing particles, player aim line.)
Bullets and jars.
Enemy Spawning.
I created a distributable GOAP system in C++
Templated world values.
Cyclic graph in planning stage.
Dijkstra's to find the best plan.
I am creating a OpenGL game engine in C++
OBJ file loading and serialization for faster loading.
Rendering models with diffuse, normal, and specular textures.
Lighting using a phong shader model.
Post-Processing and Render Targets with HDR.


[% PROCESS "inc/header.inc" %]
[% $page := "stats" %]
[% PROCESS "inc/list-nav.inc" %]
{{site statistics}}
{{ Graphs are updated daily. }}
{{ Quick notes: }}
- {{ Brokeness goes down, when volume goes up. This is due to having a
wider sample of average people (versus people explicitly testing a new IPv6
setup). }}
Loading /site/graphdata.csv...
[% PROCESS "inc/footer.inc" %]


PRICING TABLE
Perfect and easy pricing tables for your business
BASIC
Month for free
$26
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
BUSINESS
For Starter Business
$45
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
EXTENDED
For a Big Project
$80
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
BASIC
Month for free
$26
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
BUSINESS
For Starter Business
$45
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
EXTENDED
For a Big Project
$80
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
BASIC
Month for free
$26
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
BUSINESS
For Starter Business
$45
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings
EXTENDED
For a Big Project
$80
/ mo125 GB space
5 websites
3 email address
SSH access
Unlimited Users
24/7 Support
Advanced settings


Well of course, to read this Ebook, your'e supposed to be comfortable.


Greenhouse Environment Controller
Cooler
Humidifier
Cooler is
Humidifier is
Check temperature and humidity


Take the mystery out of gymnastics scoring with Flyp10, the only gymnastics scoring app that lets you upload gymnastic routines straight from your device or computer, submit the routines to be judged by USAG Certified Judges, and receive a score along with the judges notes so you can see exactly where the deductions and bonuses are coming from.
How Does It Work:
But that’s not all. Have your friends sign up as well and you can share and comment on routines or sign up for Premium to enter the daily meet, get valuable analytics to track your scoring trends and get your routine scores faster.
What does it cost:
IMPORTANT NOTE:
All routines will be evaluated by current USAG Certified Judges. Please note gymnastics judging is subjective and each competition is different. The purpose of this app is to help gymnasts see where their deductions may be coming from NOT to determine whether a score a gymnast received at a particular meet was scored correctly. A score is a judge’s opinion of a particular routine. You will be given a score and list of deductions and bonuses the judge could mark if they were judging your routine at that particular time. Optional routines will also be evaluated for start value.


Titanium Command Line Interface
The titanium script in the Mobile SDK provides a command line interface to various common tasks such as creating, building, and running Titanium Mobile projects and modules.
Environment Setup
It's recommended that you setup an alias or add it to your PATH so you can call it directly, for example:
Windows
Open your environment variable settings by going to:
-
Start Menu > Right click on "Computer" > Properties > Advanced System Settings
-
Click on the "Advanced" tab, and the "Environment Variables" button near the bottom
-
Double click or create a new entry for PATH under User Variables
-
in Window Vista or Windows 7:
-
Add C:\ProgramData\Titanium\mobilesdk\win32\1.7.0
-
-
In Windows XP:
-
Add C:\Documents and Settings\All Users\Application Data\Titanium\mobilesdk\win32\1.7.0
-
OSX
Add this to your ~/.bash_profile, or create a ~/.bash_profile file if you don't already have one.
alias titanium="/Library/Application\ Support/Titanium/mobilesdk/osx/1.7.0/titanium.py"
or
alias titanium="$HOME/Library/Application\ Support/Titanium/mobilesdk/osx/1.7.0/titanium.py"
depending on where your mobile SDKs are installed. To add the alias to your environment, run the following command:
source ~/.bash_profile
Linux
Add this to your ~/.bash_profile
alias titanium=$HOME/.titanium/mobilesdk/linux/1.7.0/titanium.py
Testing
Once you have the environment setup, you should be able to run titanium in a console window, and see the following output:
$ titanium
Appcelerator Titanium
Copyright (c) 2010-2011 by Appcelerator, Inc.
commands:
create - create a project
run - run an existing project
emulator - start the emulator (android)
docgen - generate html docs for a module (android)
fastdev - management for the Android fastdev server
help - get help
Commands
|
Command |
Description |
|
create |
Creates a Titanium Mobile project (use --type=module for module projects) |
|
run |
Runs a Titanium Mobile project or module "example" project |
|
emulator |
Starts the Android emulator |
|
docgen |
Generates HTML documentation from Markdown in an Android module |
|
fastdev |
Management interface for the Android Fastdev server |
|
help |
Shows help command |
Examples
$ titanium create --platform=android --android=/path/to/android-sdk --id=com.mycompany.myApp --name=myApp
$ titanium run --platform=android


Order
New
Processing
Cancelled
Shipped
Aquarium Supplies
Pending
Weather Delayed
Reef Rewards
Gift Certificates
Order Status
Export
Customers
View/Edit
Add Customer
Import/Export
Products
View/Edit
Add Product
Bundles
Categories
Inventory
Wish List
Reviews
Import/Export
RMA
Residency Program
Continuing Education
Courses & Pricing
CMS
Pages
Add Pages
View Banners
Titles & Content
Support
In Process
On Hold
Completed
Interested in joining our staff?
Interested in joining our faculty?
Reports
Settings
Shipping Manager
Shipping Calendar
Coupon Manager
Tax Manager
Users
View/Edit
Add User
Logout


Adolphus Busch left Germany for the United States in 1857. He settled in St. Louis, Missouri, where he eventually established his own brewing supply house. In St. Louis, Busch also met and married a woman named Lilly Anheuser. Lilly’s father, Eberhard Anheuser, owned a small brewery that had been yielding lager beer for some time. In 1864, Busch partnered with his father in-law to form what would eventually become the Anheuser-Busch Company.
Back


@* * Copyright 2023 HM Revenue & Customs * * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *@ @(params: Map[String, Any]) @uk.gov.hmrc.hmrcemailrenderer.templates.helpers.html.template_main(params, "You have told HMRC your business will no longer operate under the terms of the Northern Ireland Protocol for VAT"){
Dear Customer
This email confirms that you have told HMRC your business will no longer be operating under the terms of the Northern Ireland Protocol for VAT.
This is because it will no longer:
Your submission reference is: @params("submissionReference")
From HMRC
}


Schedule post and publish to multiple networks at once easily. Our all in one social media management helps marketers and entrepreneurs to transform social profiles, groups and pages into powerful marketing tools.
We offer you the best user-friendly social media management platform ever at the best price. You can collaborate, publish, measure. All in one place.
Blue bottle crucifix vinyl post-ironic four dollar toast vegan taxidermy. Gastropub indxgo juice poutine.
Learn MoreIt´s going to be amazing! Suscribe to find out when it´s ready!


<EMAIL_ADDRESS>Technical Skills
- JavaScript (vanilla, jQuery, AngularJS, CasperJS, Karma, Protractor)
- HTML5/CSS3 (LESS)
- Academic experience with Java, C++
- Experience with Perforce, Git
- Familiarity with Node.js (Express and Sails), Backbone.js, PHP, Python, MySQL and PostgreSQL
- Excitement and willingness to learn new languages and frameworks
Employment
- Software Engineer II, Front-End – F5 Networks, Seattle, WA (October 2014 – Present)
- Software Engineer I, Front-End – F5 Networks, Seattle, WA (Sept 2013 – Sept 2014)
- Front-end web development for device and network management software
- Backbone.js to AngularJS migration, contributions to custom framework extensions, bug fixes and feature development
- Own the UI for a module of the product, including coordinating with other teams, implementing UX mockups, and testing using Casper/Phantom.js, Protractor.js, and Karma
- Data visualization with amCharts
- Work locally and remotely with teams in several states, help onboard new hires
- Software Development Intern – Porch, Seattle, WA (June 2013 – August 2013)
- Various development tasks for an early stage startup (Java, Python)
- Examination of business requirements and constraints for a large-scale CMS platform
- Software Development Intern – Connect XYZ, Woodinville, WA (June 2012 – Nov 2012)
- JavaScript, PHP, HTML/CSS development and testing for an ecommerce logistics single-page app
- Debugging of existing code, addition of features, and extension of custom libraries
- Participation in project planning and design, database management
- Part-time Intern – Seniorhomes.com, Seattle, WA (2011 – 2012)
- PHP and JavaScript development
- Assistant Designer – LOTUS Composites, LLC, Seattle, WA (2011)
- Participant in two UW business plan competitions
- Construction and CAD design of carbon fiber winding machines
Education
-
University of Washington Bothell (2012 – 2013)
- BS in Computer Science and Software Engineering, August 2013
- In major GPA of 3.79
- Traditional computer science coursework coupled with courses on engineering principles and software development practices
-
University of Washington (2007 – 2008 and 2011 – 2012)
Additional Projects and Experience
- Exploring new languages, personal projects with Node.js, raspberry pi (2013 – 2015)
- Co-founder of high school FIRST Robotics team (2005 – 2007)
- Regularly gigging musician, produced and engineered one home studio album (2005 – 2015)


| Entry Header 1 | Entry Header 2 | Entry Header 3 | Entry Header 4 |
|---|---|---|---|
| Entry line 1 | Entry line 1 | Entry line 2 | Entry line 3 |
| Entry line 1 | Entry line 1 | Entry line 2 | |
| Entry line 1 | Entry line 1 | Entry line 2 | Entry line 3 |
| Entry line 1 | Entry line 2 | Entry line 3 | Entry line 4 |
|---|---|---|---|
| Entry line 1 | Entry line 2 | ||
| Entry line 2 | Entry line 3 | Entry line 4 | |
| Entry line 2 | Entry line 2 | Entry line 3 | Entry line 4 |
| Entry line 1 | Entry line 2 | ||
| Entry line 2 | Entry line 3 | Entry line 4 |


{% extends "layout.html" %} {% block page_title %} Example - Radio buttons and checkboxes {% endblock %} {% block content %} Lost or stolen passport As your passport is lost or stolen it will be cancelled when you click on Submit at the end of this application. This is irreversible if you later find your passport. Warning It is a criminal offence to cancel someone else's passport without their knowledge or consent. What is your nationality? Tick to confirm that you have read and understood that your passport will be cancelled when you submit at the end of the application next {% endblock %}
As your passport is lost or stolen it will be cancelled when you click on Submit at the end of this application. This is irreversible if you later find your passport.
next


Welcome to Rosie's Movie Awards! You can search for movies with the help of the OMDB API.
Find your 5 favorite movies and nominate them for the Rosie's.


- Reverse
- proxy
- with
- lightweight
- api
- management
Otoroshi is a modern http reverse proxy with a thin layer of api management written in Scala and developped by the MAIF OSS team. Otoroshi is designed to can handle all the calls to and between your microservices without service locator and let you change configuration dynamicaly at runtime.
Features
- Gorgeous React admin UI
- Rest admin API
- Event-Driven
- Live reconfiguration at runtime
- Circuit breakers, retry, canary mode
- Round Robin loadbalancing, heatlhcheck
- Throttling and quotas per ApiKey
- Metrics (Rest, Datadog, Statd)
- Advanced Clever-Cloud integration
- Multi-datastores support
- Official docker image
- Available as single jar file
easy to configure
No config files, gorgeous admin UI, slick admin API. Live reconfiguration at runtime
high productivity
Freedom to chose your own stack, no library needed. Route and secure microservices in matter of seconds and accelerate your time to market


Build Early Ed respects the data privacy and protection of children, families, and all community members. We minimize our data collection by disabling the use of cookies on our application. We only ask Builders for the necessary information to create an account. Build Early Ed protects the data we collect through encryption. Learn more about recommended data privacy practices for children and families.
Connect with a coalition of parents and teachers committed to advocating for child data privacy and protection.
Get connectedLearn from resources for parents and caregivers to protect children's privacy online.
Learn more


This demo shows how each of the compositing methods affects how drawing operations are made to the canvas.


Password management is something that should generally not be reinvented unnecessarily, and Django endeavors to provide a secure and flexible set of tools for managing user passwords. This document describes how Django stores passwords, how the storage hashing can be configured, and some utilities to work with hashed passwords.
See also
Even though users may use strong passwords, attackers might be able to eavesdrop on their connections. Use HTTPS to avoid sending passwords (or any other sensitive data) over plain HTTP connections because they will be vulnerable to password sniffing.
Django provides a flexible password storage system and uses PBKDF2 by default.
The password
attribute of a
User
object is a string in this format:
<algorithm>$<iterations>$<salt>$<hash>
Those are the components used for storing a User’s password, separated by the dollar-sign character and consist of: the hashing algorithm, the number of algorithm iterations (work factor), the random salt, and the resulting password hash. The algorithm is one of a number of one-way hashing or password storage algorithms Django can use; see below. Iterations describe the number of times the algorithm is run over the hash. Salt is the random seed used and the hash is the result of the one-way function.
By default, Django uses the PBKDF2 algorithm with a SHA256 hash, a password stretching mechanism recommended by NIST. This should be sufficient for most users: it’s quite secure, requiring massive amounts of computing time to break.
However, depending on your requirements, you may choose a different algorithm, or even use a custom algorithm to match your specific security situation. Again, most users shouldn’t need to do this – if you’re not sure, you probably don’t. If you do, please read on:
Django chooses the algorithm to use by consulting the
PASSWORD_HASHERS
setting. This is a list of hashing algorithm
classes that this Django installation supports. The first entry in this list
(that is, settings.PASSWORD_HASHERS[0]
) will be used to store passwords,
and all the other entries are valid hashers that can be used to check existing
passwords. This means that if you want to use a different algorithm, you’ll
need to modify PASSWORD_HASHERS
to list your preferred algorithm
first in the list.
The default for PASSWORD_HASHERS
is:
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]
This means that Django will use PBKDF2 to store all passwords but will support checking passwords stored with PBKDF2SHA1, argon2, and bcrypt.
The next few sections describe a couple of common ways advanced users may want to modify this setting.
Argon2 is the winner of the 2015 Password Hashing Competition, a community organized open competition to select a next generation hashing algorithm. It’s designed not to be easier to compute on custom hardware than it is to compute on an ordinary CPU.
Argon2 is not the default for Django because it requires a third-party library. The Password Hashing Competition panel, however, recommends immediate use of Argon2 rather than the other algorithms supported by Django.
To use Argon2 as your default storage algorithm, do the following:
Install the argon2-cffi library. This can be done by running pip
install django[argon2]
, which is equivalent to pip install argon2-cffi
(along with any version requirement from Django’s setup.py
).
Modify PASSWORD_HASHERS
to list Argon2PasswordHasher
first.
That is, in your settings file, you’d put:
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]
Keep and/or add any entries in this list if you need Django to upgrade passwords.
bcrypt
with Django¶Bcrypt is a popular password storage algorithm that’s specifically designed for long-term password storage. It’s not the default used by Django since it requires the use of third-party libraries, but since many people may want to use it Django supports bcrypt with minimal effort.
To use Bcrypt as your default storage algorithm, do the following:
Install the bcrypt library. This can be done by running pip install
django[bcrypt]
, which is equivalent to pip install bcrypt
(along with
any version requirement from Django’s setup.py
).
Modify PASSWORD_HASHERS
to list BCryptSHA256PasswordHasher
first. That is, in your settings file, you’d put:
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
]
Keep and/or add any entries in this list if you need Django to upgrade passwords.
That’s it – now your Django install will use Bcrypt as the default storage algorithm.
The PBKDF2 and bcrypt algorithms use a number of iterations or rounds of
hashing. This deliberately slows down attackers, making attacks against hashed
passwords harder. However, as computing power increases, the number of
iterations needs to be increased. We’ve chosen a reasonable default (and will
increase it with each release of Django), but you may wish to tune it up or
down, depending on your security needs and available processing power. To do so,
you’ll subclass the appropriate algorithm and override the iterations
parameters. For example, to increase the number of iterations used by the
default PBKDF2 algorithm:
Create a subclass of django.contrib.auth.hashers.PBKDF2PasswordHasher
:
from django.contrib.auth.hashers import PBKDF2PasswordHasher
class MyPBKDF2PasswordHasher(PBKDF2PasswordHasher):
"""
A subclass of PBKDF2PasswordHasher that uses 100 times more iterations.
"""
iterations = PBKDF2PasswordHasher.iterations * 100
Save this somewhere in your project. For example, you might put this in
a file like myproject/hashers.py
.
Add your new hasher as the first entry in PASSWORD_HASHERS
:
PASSWORD_HASHERS = [
'myproject.hashers.MyPBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
]
That’s it – now your Django install will use more iterations when it stores passwords using PBKDF2.
Argon2 has three attributes that can be customized:
time_cost
controls the number of iterations within the hash.memory_cost
controls the size of memory that must be used during the
computation of the hash.parallelism
controls how many CPUs the computation of the hash can be
parallelized on.The default values of these attributes are probably fine for you. If you determine that the password hash is too fast or too slow, you can tweak it as follows:
parallelism
to be the number of threads you can
spare computing the hash.memory_cost
to be the KiB of memory you can spare.time_cost
and measure the time hashing a password takes.
Pick a time_cost
that takes an acceptable time for you.
If time_cost
set to 1 is unacceptably slow, lower memory_cost
.memory_cost
interpretation
The argon2 command-line utility and some other libraries interpret the
memory_cost
parameter differently from the value that Django uses. The
conversion is given by memory_cost == 2 ** memory_cost_commandline
.
When users log in, if their passwords are stored with anything other than the preferred algorithm, Django will automatically upgrade the algorithm to the preferred one. This means that old installs of Django will get automatically more secure as users log in, and it also means that you can switch to new (and better) storage algorithms as they get invented.
However, Django can only upgrade passwords that use algorithms mentioned in
PASSWORD_HASHERS
, so as you upgrade to new systems you should make
sure never to remove entries from this list. If you do, users using
unmentioned algorithms won’t be able to upgrade. Hashed passwords will be
updated when increasing (or decreasing) the number of PBKDF2 iterations or
bcrypt rounds.
Be aware that if all the passwords in your database aren’t encoded in the default hasher’s algorithm, you may be vulnerable to a user enumeration timing attack due to a difference between the duration of a login request for a user with a password encoded in a non-default algorithm and the duration of a login request for a nonexistent user (which runs the default hasher). You may be able to mitigate this by upgrading older password hashes.
If you have an existing database with an older, weak hash such as MD5 or SHA1, you might want to upgrade those hashes yourself instead of waiting for the upgrade to happen when a user logs in (which may never happen if a user doesn’t return to your site). In this case, you can use a “wrapped” password hasher.
For this example, we’ll migrate a collection of SHA1 hashes to use
PBKDF2(SHA1(password)) and add the corresponding password hasher for checking
if a user entered the correct password on login. We assume we’re using the
built-in User
model and that our project has an accounts
app. You can
modify the pattern to work with any algorithm or with a custom user model.
First, we’ll add the custom hasher:
from django.contrib.auth.hashers import (
PBKDF2PasswordHasher, SHA1PasswordHasher,
)
class PBKDF2WrappedSHA1PasswordHasher(PBKDF2PasswordHasher):
algorithm = 'pbkdf2_wrapped_sha1'
def encode_sha1_hash(self, sha1_hash, salt, iterations=None):
return super().encode(sha1_hash, salt, iterations)
def encode(self, password, salt, iterations=None):
_, _, sha1_hash = SHA1PasswordHasher().encode(password, salt).split('$', 2)
return self.encode_sha1_hash(sha1_hash, salt, iterations)
The data migration might look something like:
from django.db import migrations
from ..hashers import PBKDF2WrappedSHA1PasswordHasher
def forwards_func(apps, schema_editor):
User = apps.get_model('auth', 'User')
users = User.objects.filter(password__startswith='sha1$')
hasher = PBKDF2WrappedSHA1PasswordHasher()
for user in users:
algorithm, salt, sha1_hash = user.password.split('$', 2)
user.password = hasher.encode_sha1_hash(sha1_hash, salt)
user.save(update_fields=['password'])
class Migration(migrations.Migration):
dependencies = [
('accounts', '0001_initial'),
# replace this with the latest migration in contrib.auth
('auth', '####_migration_name'),
]
operations = [
migrations.RunPython(forwards_func),
]
Be aware that this migration will take on the order of several minutes for several thousand users, depending on the speed of your hardware.
Finally, we’ll add a PASSWORD_HASHERS
setting:
PASSWORD_HASHERS = [
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'accounts.hashers.PBKDF2WrappedSHA1PasswordHasher',
]
Include any other hashers that your site uses in this list.
The full list of hashers included in Django is:
[
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
'django.contrib.auth.hashers.Argon2PasswordHasher',
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
'django.contrib.auth.hashers.BCryptPasswordHasher',
'django.contrib.auth.hashers.SHA1PasswordHasher',
'django.contrib.auth.hashers.MD5PasswordHasher',
'django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher',
'django.contrib.auth.hashers.UnsaltedMD5PasswordHasher',
'django.contrib.auth.hashers.CryptPasswordHasher',
]
The corresponding algorithm names are:
pbkdf2_sha256
pbkdf2_sha1
argon2
bcrypt_sha256
bcrypt
sha1
md5
unsalted_sha1
unsalted_md5
crypt
If you write your own password hasher that contains a work factor such as a
number of iterations, you should implement a
harden_runtime(self, password, encoded)
method to bridge the runtime gap
between the work factor supplied in the encoded
password and the default
work factor of the hasher. This prevents a user enumeration timing attack due
to difference between a login request for a user with a password encoded in an
older number of iterations and a nonexistent user (which runs the default
hasher’s default number of iterations).
Taking PBKDF2 as example, if encoded
contains 20,000 iterations and the
hasher’s default iterations
is 30,000, the method should run password
through another 10,000 iterations of PBKDF2.
If your hasher doesn’t have a work factor, implement the method as a no-op
(pass
).
The django.contrib.auth.hashers
module provides a set of functions
to create and validate hashed passwords. You can use them independently
from the User
model.
check_password
(password, encoded)[source]¶If you’d like to manually authenticate a user by comparing a plain-text
password to the hashed password in the database, use the convenience
function check_password()
. It takes two arguments: the plain-text
password to check, and the full value of a user’s password
field in the
database to check against, and returns True
if they match, False
otherwise.
make_password
(password, salt=None, hasher='default')[source]¶Creates a hashed password in the format used by this application. It takes
one mandatory argument: the password in plain-text. Optionally, you can
provide a salt and a hashing algorithm to use, if you don’t want to use the
defaults (first entry of PASSWORD_HASHERS
setting). See
Included hashers for the algorithm name of each hasher. If the
password argument is None
, an unusable password is returned (one that
will never be accepted by check_password()
).
is_password_usable
(encoded_password)[source]¶Returns False
if the password is a result of
User.set_unusable_password()
.
In older versions, this also returns False
if the password is
None
or an empty string, or if the password uses a hasher that’s
not in the PASSWORD_HASHERS
setting. That behavior is
considered a bug as it prevents users with such passwords from
requesting a password reset.
Users often choose poor passwords. To help mitigate this problem, Django offers pluggable password validation. You can configure multiple password validators at the same time. A few validators are included in Django, but it’s simple to write your own as well.
Each password validator must provide a help text to explain the requirements to the user, validate a given password and return an error message if it does not meet the requirements, and optionally receive passwords that have been set. Validators can also have optional settings to fine tune their behavior.
Validation is controlled by the AUTH_PASSWORD_VALIDATORS
setting.
The default for the setting is an empty list, which means no validators are
applied. In new projects created with the default startproject
template, a simple set of validators is enabled.
By default, validators are used in the forms to reset or change passwords and
in the createsuperuser
and changepassword
management
commands. Validators aren’t applied at the model level, for example in
User.objects.create_user()
and create_superuser()
, because we assume
that developers, not users, interact with Django at that level and also because
model validation doesn’t automatically run as part of creating models.
Note
Password validation can prevent the use of many types of weak passwords. However, the fact that a password passes all the validators doesn’t guarantee that it is a strong password. There are many factors that can weaken a password that are not detectable by even the most advanced password validators.
Password validation is configured in the
AUTH_PASSWORD_VALIDATORS
setting:
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
'OPTIONS': {
'min_length': 9,
}
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
This example enables all four included validators:
UserAttributeSimilarityValidator
, which checks the similarity between
the password and a set of attributes of the user.MinimumLengthValidator
, which simply checks whether the password meets a
minimum length. This validator is configured with a custom option: it now
requires the minimum length to be nine characters, instead of the default
eight.CommonPasswordValidator
, which checks whether the password occurs in a
list of common passwords. By default, it compares to an included list of
20,000 common passwords.NumericPasswordValidator
, which checks whether the password isn’t
entirely numeric.For UserAttributeSimilarityValidator
and CommonPasswordValidator
,
we’re simply using the default settings in this example.
NumericPasswordValidator
has no settings.
The help texts and any errors from password validators are always returned in
the order they are listed in AUTH_PASSWORD_VALIDATORS
.
Django includes four validators:
MinimumLengthValidator
(min_length=8)[source]¶Validates whether the password meets a minimum length.
The minimum length can be customized with the min_length
parameter.
UserAttributeSimilarityValidator
(user_attributes=DEFAULT_USER_ATTRIBUTES, max_similarity=0.7)[source]¶Validates whether the password is sufficiently different from certain attributes of the user.
The user_attributes
parameter should be an iterable of names of user
attributes to compare to. If this argument is not provided, the default
is used: 'username', 'first_name', 'last_name', 'email'
.
Attributes that don’t exist are ignored.
The minimum similarity of a rejected password can be set on a scale of 0 to
1 with the max_similarity
parameter. A setting of 0 rejects all
passwords, whereas a setting of 1 rejects only passwords that are identical
to an attribute’s value.
CommonPasswordValidator
(password_list_path=DEFAULT_PASSWORD_LIST_PATH)[source]¶Validates whether the password is not a common password. This converts the password to lowercase (to do a case-insensitive comparison) and checks it against a list of 20,000 common password created by Royce Williams.
The password_list_path
can be set to the path of a custom file of
common passwords. This file should contain one lowercase password per line
and may be plain text or gzipped.
In older versions, a list of 1,000 common passwords is used.
There are a few functions in django.contrib.auth.password_validation
that
you can call from your own forms or other code to integrate password
validation. This can be useful if you use custom forms for password setting,
or if you have API calls that allow passwords to be set, for example.
validate_password
(password, user=None, password_validators=None)[source]¶Validates a password. If all validators find the password valid, returns
None
. If one or more validators reject the password, raises a
ValidationError
with all the error messages
from the validators.
The user
object is optional: if it’s not provided, some validators may
not be able to perform any validation and will accept any password.
password_changed
(password, user=None, password_validators=None)[source]¶Informs all validators that the password has been changed. This can be used by validators such as one that prevents password reuse. This should be called once the password has been successfully changed.
For subclasses of AbstractBaseUser
,
the password field will be marked as “dirty” when calling
set_password()
which
triggers a call to password_changed()
after the user is saved.
password_validators_help_texts
(password_validators=None)[source]¶Returns a list of the help texts of all validators. These explain the password requirements to the user.
password_validators_help_text_html
(password_validators=None)¶Returns an HTML string with all help texts in an <ul>
. This is
helpful when adding password validation to forms, as you can pass the
output directly to the help_text
parameter of a form field.
get_password_validators
(validator_config)[source]¶Returns a set of validator objects based on the validator_config
parameter. By default, all functions use the validators defined in
AUTH_PASSWORD_VALIDATORS
, but by calling this function with an
alternate set of validators and then passing the result into the
password_validators
parameter of the other functions, your custom set
of validators will be used instead. This is useful when you have a typical
set of validators to use for most scenarios, but also have a special
situation that requires a custom set. If you always use the same set
of validators, there is no need to use this function, as the configuration
from AUTH_PASSWORD_VALIDATORS
is used by default.
The structure of validator_config
is identical to the
structure of AUTH_PASSWORD_VALIDATORS
. The return value of
this function can be passed into the password_validators
parameter
of the functions listed above.
Note that where the password is passed to one of these functions, this should always be the clear text password - not a hashed password.
If Django’s built-in validators are not sufficient, you can write your own password validators. Validators are fairly simple classes. They must implement two methods:
validate(self, password, user=None)
: validate a password. Return
None
if the password is valid, or raise a
ValidationError
with an error message if the
password is not valid. You must be able to deal with user
being
None
- if that means your validator can’t run, simply return None
for no error.get_help_text()
: provide a help text to explain the requirements to
the user.Any items in the OPTIONS
in AUTH_PASSWORD_VALIDATORS
for your
validator will be passed to the constructor. All constructor arguments should
have a default value.
Here’s a basic example of a validator, with one optional setting:
from django.core.exceptions import ValidationError
from django.utils.translation import gettext as _
class MinimumLengthValidator:
def __init__(self, min_length=8):
self.min_length = min_length
def validate(self, password, user=None):
if len(password) < self.min_length:
raise ValidationError(
_("This password must contain at least %(min_length)d characters."),
code='password_too_short',
params={'min_length': self.min_length},
)
def get_help_text(self):
return _(
"Your password must contain at least %(min_length)d characters."
% {'min_length': self.min_length}
)
You can also implement password_changed(password, user=None
), which will
be called after a successful password change. That can be used to prevent
password reuse, for example. However, if you decide to store a user’s previous
passwords, you should never do so in clear text.
Oct 01, 2019


If I were to hire a strong female lead, I would hire someone who is strong and hard working. She might even do her own stunts. As a professional actor, she is experienced. She knows how to put her own spin on the character she is portraying, but also open to criticism and able to take direction. She is human and therefore makes mistakes, but always puts her best foot forward as a professional.
Her motto: “Have an opinion, make work that matters, and care about something other than yourself.”
In terms of the character she will portray, she fights for what is right, especially if it means putting herself at risk or going against the status quo. Rebelliousness is a key character trait. She isn’t meek or understated, rather opinionated. She gets messy. Dirt and grime and blood don’t scare her. She doesn’t try to look cool or sexy while she is in battle and makes really ugly, scary faces to intimidate the bad guys. She might have tattoos or scars, perhaps even missing an eye.
Basically, I would want to hire Charlize Theron since I thought she did an amazing job playing Furiosa in Mad Max: Fury Road.


This course will walk you through the basic concepts of Programming using the Python programming language.
Great online course/book for practical use of Python: automate the boring stuff
A more academic deep dive course in programming with Python: Edx PS: There is an option to pay to get a certificate for completing the course. This is optional! Completing the course without a certificate is free.
Programming is simply the act of entering instructions for the computer to perform. These instructions might crunch some numbers, modify text, look up information in files, or communicate with other computers over the Internet.
A program is like a:
But for the computer!
For most people, their computer is just an appliance instead of a tool. But by learning how to program, you'll gain access to one of the most powerful tools of the modern world, and you'll have fun along the way. Programming isn't brain surgery—it's fine for amateurs to experiment and make mistakes.
All programs, written in any language uses the same basic building blocks
Her are a few of the most common:
All programming no matter the language follows three simple steps.
Different programming language package these steps differently. But the steps remain the same.
Python is a clear and powerful object-oriented programming language, comparable to Perl, Ruby, Scheme, or Java.
Developed by Guido van Rossum
Test that Python is properly installed by running
python --version
in a CMD/Powershell shell.
In case of errors reference the - Using Python on Windows page: link
Ubuntu
sudo apt-get update
sudo apt-get install python3.7
python3 --version
On macOS, the best way to install Python 3 is to use Homebrew. Not familiar with homebrew? link
tutorial to install homebrew and python
brew install python3
Verify installation
python3 --version
There are several tools installed with the Python interpreter. Here are some of them:
python interpreter | The python interpreter. The executable that can be called directly from the command line prompt/terminal to start a new interactive python session (REPL) or to run python modules/files/packages |
pip | The Python package manager. The official Python package manager. Lets the user download and manage third-party packages hosted on the Python package index (PyPI) |
IDLE | IDLE is Python's Integrated Development and Learning Environment. Its a Python IDE for and by Python |
pydoc | The pydoc module automatically generates documentation from Python modules. |
Python can be used and developed with using only a basic text editor and the python interpreter. But for larger and more complex projects there is a benefit to use purpose built tools for Python development.
VSCODE is a good and free text editor: link
Objects are Python's abstraction for data. All data in a Python program is represented by objects or by relations between objects.
Python has two main versions. Python 2 and Python 3. Python 3 is the newest, but it has struggled with adoption for some time. Python 3 has as of 2018 taken the mantle as the main version from Python 2.
Practically this means that new Python packages and application will in most cases be written in Python 3.
Arithmetic
adding
2 + 2
subtracting
3 - 2
multiplying
4 * 2
dividing
4 / 2
exponent
4 ** 3
modulus
4 % 2
integer division
3 // 2
Programs will crash if they contain code the computer can't understand, which will cause Python to show an error message. An error message won't break your computer, though, so don't be afraid to make mistakes. A crash just means the program stopped running unexpectedly.
In a typical Python program there is a lot less dumb grunt work than in program implemented in other languages. Python provides powerful object types built into the language. There is less of a need to code up several functions and classes to get only the basic functionality.
Numbers | 12 , 343.34 , Decimal() |
Strings | "sauna", ‘python' |
Lists | [1, "two, [ 4, 5] ] |
Dictionaries | {"breakfast": "eggs", "number": 1, "nested": {1: "element"}} |
Tuples | (1, "bacon", 13.2, ["data", 1]) |
Sets | set("aaaa") -> {"a"} |
Booleans | True, False |
NoneType | None |
When programming you will need to store values for later use. The way we do this in Python is to give our values names we can later call to get back the value we stored in them.
Creating a variable containing the integer 5
my_int = 5
We can then later use our variable to do some work. Note that in this case we store the result in a new variable.
result = my_int * 10
Strings represent characters in Python and is created like this:
"A string"
'Also a string'
You can use both " and ‘, to create a String.
my_string = "My super string!"
The meaning of an operator may change based on the data types of the values next to it. With Integers the + operator adds the two numbers. But when used with Strings it joins the two Strings into a new String.
my_joined_string = "Hello " + "World!"
But you cannot do this
my_joined_string = "Hello " + 50
Because the two values on either side of the + operator are of different types.
Multiplying Strings and numbers on does work
my_joined_string = "Hello," * 2 # 'Hello,Hello,'
The Python interpreter has a number of functions and types built into it that are always available.
The full list of Python built-in functions can be found here: link
len() # Return the length (the number of items) of an object.
input() # The function then reads a line from input, converts it to a string
print() # Prints to stdout
bool() # returns the True or False
help() # Invoke the built-in help system. (This function is intended for interactive use(REPL).)
 To create our own program we need to do nothing more than write Python code in a text file and run the file with the Python interpreter.
This will run the code written in the file "my_program.py"
python my_program.py
It is time to write your first Python program!
print("Welcome to my program!")
user_age = input("Please enter your age")
user_name = input("Please enter your name")
print("Thank you!")
print("Your name is: " + user_name + " and your age is: " + str(user_age))
my_first_program.py
python my_first_program.py
Every variable in your Python program has a type. Python is dynamically typed so the type and value of the thing a variable points to can change, but the value it points to will always have a type.
str()
int()
float()
Create a program that asks a user for two numbers.
Print the numbers back to the user on a single line.
Hint: str() will come in handy here!
Control flow is the mechanisms a programmer uses to change what the program should do based on the state of the program.
But before you learn about flow control statements, you first need to learn how to represent those yes and no options, and you need to understand how to write those branching points as Python code.
Integers and Float represent numbers. String represent characters and text. Boolean represent true and false. Those two only!
Example
is_true = True
is_false = False
== | Equal to |
!= | Not equal to |
< | Less than |
> | Greater than |
<= | Less than or equal to |
>= | Greater than or equal to |
These operators evaluate to True or False depending on what is on either side of the operator.
Example
10 == 10 # True
10 == 11 # False
10 != 10 # False
10 != 11 # True
The three Boolean operators (and, or, and not) are used to compare Boolean values.
and
True and False # False
True and True # True
or
True or False # True
True or True # True
False or False # False
Unlike and and or, the not operator operates on only one Boolean value (or expression). The not operator simply evaluates to the opposite Boolean value.
not
not False # True
not True # False
We can combine these operators to evaluate more complex expressions.
2 > 1 or 10 < 1 # True
Flow control statements often start with a part called the condition, and all are followed by a block of code called the clause. Before you learn about Python's specific flow control statements, I'll cover what a condition and a block are.
Something that evaluates to True or False.
Lines of Python code can be grouped together in blocks. You can tell when a block begins and ends from the indentation of the lines of code. There are three rules for blocks.
fish = "salmon"
if fish == "salmon":
print("Lets make sushi!")
The most common type of flow control statement is the if statement. An if statement's clause (that is, the block following the if statement) will execute if the statement's condition is True. The clause is skipped if the condition is False.
In plain English, an if statement could be read as, "If this condition is true, execute the code in the clause." In Python, an if statement consists of the following:
The if keyword
fish = "salmon"
if fish == "salmon":
print("Lets make sushi!")
An if clause can optionally be followed by an else statement. The else clause is executed only when the if statement's condition is False. In plain English, an else statement could be read as, "If this condition is true, execute this code. Or else, execute that code." An else statement doesn't have a condition, and in code, an else statement always consists of the following:
fish = "trout"
if fish == "salmon":
print("Lets make sushi!")
else:
print("Mhhh, maybe we will make sushi")
While only one of the if or else clauses will execute, you may have a case where you want one of many possible clauses to execute. The elif statement is an "else if" statement that always follows an if or another elif statement. It provides another condition that is checked only if all of the previous conditions were False. In code, an elif statement always consists of the following:
fish = "trout"
if fish == "salmon":
print("Lets make sushi!")
elif fish = "trout":
print("Lets make fish stew!")
else:
print("I dont know what we can make!")
Write a program where the user is prompted to choose between three food options and print back to the user what the main ingredient is.
Example food options:
Meatballs -> beef
Sushi -> salmon
Caesar salad -> Chicken
You can make a block of code execute over and over again with a while statement. The code in a while clause will be executed as long as the while statement's condition is True. In code, a while statement always consists of the following:
Example
while(True):
print("Whoopsi!")
Repeater
while(True):
name = input("Please write your name: ")
print("Hello " + name + "!")
Break statements are shortcuts out of a loop.
while(True):
name = input("Please write your name: ")
print("Hello " + name + "!")
if name == "Martin":
print("Oh, Martin!")
break
Like break statements, continue statements are used inside loops. When the program execution reaches a continue statement, the program execution immediately jumps back to the start of the loop and reevaluates the loop's condition. (This is also what happens when the execution reaches the end of the loop.)
while(True):
name = input("Please write your name: ")
if name == "Martin":
continue
print("Hello " + name + "!")
Write a program that continuously loops and asks the user if they want to continue. Every time the user answers yes, the program will print how many times the user has answered yes and ask the user again.
Example use:
Do you want to continue? yes
1
Do you want to continue? yes
2
Do you want to continue? yes
3
Do you want to continue? no
The while loop keeps looping while its condition is True (which is the reason for its name), but what if you want to execute a block of code only a certain number of times? You can do this with a for loop statement and the range() function.
In code, a for statement looks something like for i in range(5): and always includes the following:
for i in range(10):
print(i)
Create a program that prompts the user for a number "n" and multiply it with itself "n" times.
The program will print the sum for each step in the multiplication.
Example
python my_multi.py
give me a number: 5
5
25
125
625
3125
All Python programs can call a basic set of functions called built-in functions, including the print(), input(), and len() functions you've seen before. Python also comes with a set of modules called the standard library. Each module is a Python program that contains a related group of functions that can be embedded in your programs. For example, the math module has mathematics-related functions, the random module has random number–related functions, and so on.
Before you can use the functions in a module, you must import the module with an import statement. In code, an import statement consists of the following:
import math
math.pow(2,2) # 4.0
You're already familiar with the print(), input(), and len() functions from the previous chapters. Python provides several builtin functions like these, but you can also write your own functions. A function is like a mini-program within a program.
def greeter(name):
print("Hello " + str(name) + "!")
When creating a function using the def statement, you can specify what the return value should be with a return statement. A return statement consists of the following:
def booer(name):
return "Booo " + str(name) + "!")
result = booer("Sondre")
Create a function that takes a string and returns the number of A's in the string.
In Python there is a value called None, which represents the absence of a value. None is the only value of the NoneType data type. (Other programming languages might call this value null, nil, or undefined.) Just like the Boolean True and False values, None must be typed with a capital N.
is_none = None
keyword arguments are identified by the keyword put before them in the function call. Keyword arguments are often used for optional parameters.
def booer(name):
return "Booo " + str(name) + "!")
result = booer(name="Sondre")
The print() function has the optional parameters end and sep to specify what should be printed at the end of its arguments and between its arguments (separating them), respectively.
print('Hello', end='')
print('World')
Parameters and variables that are assigned in a called function are said to exist in that function's local scope. Variables that are assigned outside all functions are said to exist in the global scope. A variable that exists in a local scope is called a local variable, while a variable that exists in the global scope is called a global variable. A variable must be one or the other; it cannot be both local and global.
def my_function():
cooking_pans = 10
print(cooking_pans) # Will throw exception!
Right now, getting an error, or exception, in your Python program means the entire program will crash. You don't want this to happen in real-world programs. Instead, you want the program to detect errors, handle them, and then continue to run.
def zero_div():
return 10 / 0
Errors can be handled with try and except statements. The code that could potentially have an error is put in a try clause. The program execution moves to the start of a following except clause if an error happens.
def divide_by(number):
try:
return 100 / number
except ZeroDivisionError:
print("Error: Zero division attempted!")
Create a program that prompts the user for a number and a word. The the program should then print the word given by the user as many times as the number.
Additionally, make sure the program does not crash if the user inputs something else then a number. (use try/catch)
A list is a value that contains multiple values in an ordered sequence. The term list value refers to the list itself (which is a value that can be stored in a variable or passed to a function like any other value), not the values inside the list value.
my_list = [] # create a empty list
also_my_list = list() # create a empty list with the list function
cool_list = ["Some", "Data", "Items"]
Say you have the list [‘cat', ‘bat', ‘rat', ‘elephant'] stored in a variable named spam. The Python code spam[0] would evaluate to ‘cat', and spam[1] would evaluate to ‘bat', and so on. The integer inside the square brackets that follows the list is called an index.
my_list = ["I", "am", "having", "fun"]
element = my_list[0]
print(element) # I
While indexes start at 0 and go up, you can also use negative integers for the index. The integer value -1 refers to the last index in a list, the value -2 refers to the second-to-last index in a list.
my_list = ["I", "am", "having", "fun"]
element = my_list[-1]
print(element) # fun
Create a function that takes a list and prints the first and last item in the list.
Like a list, a dictionary is a collection of many values. But unlike indexes for lists, indexes for dictionaries can use many different data types, not just integers. Indexes for dictionaries are called keys, and a key with its associated value is called a key-value pair.
my_dict = {"car": "volvo", "ship": "titanic"}


The 166 Inter is considered to be Ferrari's first grand touring car. The concept of grand touring is synonomous with freedom. The open road, the indefinite journey and endless ground to discover are ideas that underly both this car and my philosophy. On this page, I will post -- from the viewpoint of a beginner -- about some current open source technology and some of the exciting ground there is to discover. I will also share parts of my journey. Have fun!
image source: auto.ferrari.com
July 22 2017: Re-training Tensorflow's Inception to classify car origin
I was walking home the other day this week, looking at the various cars on the street German, Japanese, American and so on and it got me thinking. What is it that I find more visually appealing about German and Japanese cars? Why do I react differently to cars from certain countries? Is there something fundamental about British styling, Italian styling, and so on? Google not too long ago open-sourced a pre-trained, 40+ layer deep neural network called Inception. Alongside, there is a tutorial, Tensorflow for Poets , which shows how to use this network and train the last layer so you can have it classify between your very own image datasets!
I followed the tutorial and then tried it again with a data set of about 500 images, about a fifth from each of five car origins: Germany, Japan, United States, Italy and Great Britain. There are some Google Chrome extensions you can use to bulk download Google Images results. I had to clean up what I downloaded and delete some photos that were out of place. The photos are about 10-20 kb in size, which makes them faster to train with.
While training with flower data set given in the tutorial yieled around 90% test accuracy, the network achieved just 73.1% on my much smaller dataset of car photos. Keep in mind, if one were to make random guesses, they would most likely average 20% accuracy. Below are some additional test results for some novel downloaded images, 2 from each car origin. The network does make some funny predictions, but other predictions are very good:
2017-07-22 04:57:55.607929: Step 490: Train accuracy = 76.0%
2017-07-22 04:57:55.608473: Step 490: Cross entropy = 0.764508
2017-07-22 04:57:55.916217: Step 490: Validation accuracy = 58.0% (N=100)
2017-07-22 04:57:58.682838: Step 499: Train accuracy = 74.0%
2017-07-22 04:57:58.683158: Step 499: Cross entropy = 0.778337
2017-07-22 04:57:58.989198: Step 499: Validation accuracy = 60.0% (N=100)
Final test accuracy = 73.1% (N=52)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This neural network is not going to outsmart a car fanatic quite yet. However, for a network trained on around 500 images, and all hyperparameters left untouched, it is quite impressive that it can guess better than 3x what random guessing would result in. Having cars from a very large time span added to the network's difficulty in making predictions. Design languages are not mutually exclusive from origin to origin so it can be difficult even for a car fanatic to make some distinctions. For example, the Kia Motors aquired a German designer to design the Kia Optima a few years back and it naturally had some German design cues.
There is certainly a correlation between the country of origin of various car and their respective design cues. The network could not simply read the badges for the various cars, so it had to recognize actual design features. The network did not do a very good job, but there is plenty of room for improvement.
Since neural networks always work better with more data, adding more training examples would certainly yield better results. The hyperparameters could be tweaked. We could see how a simpler convolutional neural network with fewer layers would fare (this would require going beyond simply retraining Inception and creating our own network). The dataset could also be refined and cleaned to include only cars from a specified era to see if this would give better results.
Some useful tools and learning resources:


Documentation To Be Added
Documentation has not yet been completed for this activity or feature. Please feel free to contribute and help fill in the gaps in the MDW dev docs library.


My favorite football team won today!
Bring on the division finals!
Try to determine the sentiment the author
of the tweet is trying to express.
If none seem to match, choose "cannot determine."
Pick the term best describing the sentiment
of the tweet.
VIEWING THIS ON CODEPEN? click "Change View" to open the editor to view and/or change the code.


module Newton
newton.rb
Solves the nonlinear algebraic equation system f = 0 by Newton's method. This program is not dependent on BigDecimal
.
To call:
n = nlsolve(f,x) where n is the number of iterations required, x is the initial value vector f is an Object which is used to compute the values of the equations to be solved.
It must provide the following methods:
- f.values(x)
-
returns the values of all functions at x
- f.zero
-
returns 0.0
- f.one
-
returns 1.0
- f.two
-
returns 2.0
- f.ten
-
returns 10.0
- f.eps
-
returns the convergence criterion (epsilon value) used to determine whether two values are considered equal. If |a-b| < epsilon, the two values are considered equal.
On exit, x is the solution vector.
Public Instance Methods
nlsolve(f,x)
click to toggle source
See also Newton
# File lib/bigdecimal/newton.rb, line 44 def nlsolve(f,x) nRetry = 0 n = x.size f0 = f.values(x) zero = f.zero one = f.one two = f.two p5 = one/two d = norm(f0,zero) minfact = f.ten*f.ten*f.ten minfact = one/minfact e = f.eps while d >= e do nRetry += 1 # Not yet converged. => Compute Jacobian matrix dfdx = jacobian(f,f0,x) # Solve dfdx*dx = -f0 to estimate dx dx = lusolve(dfdx,f0,ludecomp(dfdx,n,zero,one),zero) fact = two xs = x.dup begin fact *= p5 if fact < minfact then raise "Failed to reduce function values." end for i in 0...n do x[i] = xs[i] - dx[i]*fact end f0 = f.values(x) dn = norm(f0,zero) end while(dn>=d) d = dn end nRetry end


Ensure that if an attribute value contains a double quote, it is surrounded with single quotes, otherwise with double quotes.
Span content
Span content
Span content


This document is aimed to merge ASP.NET Zero Angular 2.x Client solution to Server solution. It's assumed that you already have a project created by following ASP.NET Core & Angular 2+ Getting Started document.
Copy files in below screenshot from your client solution to root folder of *Web.Host project in server solution.
Since we copied .gitignore file from another project, we need to remove lines under "# VS files" which contains "PhoneBook.AngularUI" keyword.
We need to exclude "node_modules" and "external_libs" folders from compiled folders. In order to do that, change your buildOptions in project.json like this:
"buildOptions": {
"emitEntryPoint": true,
"preserveCompilationContext": true,
"copyToOutput": "log4net.config",
"compile": {
"exclude": [
"node_modules",
"external_libs"
]
}
}
After doing this, your project must be build successfully.
Now, we can run our host project by pressing the F5 button. We assume that, you have already applied migrations to your database and runned host project before starting this document according to ASP.NET Core & Angular 2+ document.
We need to open a command prompt and navigate to "..\src\Acme.PhoneBook.Web.Host" folder. Then we need to run "npm install" command in order to install our project's dependencies. Then we can run "npm start" command to start our project.
After this point, we can work on a single Visual Studio 2017+ solution with our client and server projects. Since we use angular-cli for serving our client application, we cannot use same port both for our client and server apps during development.
But, we can do it when publishing our application. Let's see how.
Our client project is published by angular-cli. In order to publish a single website using Visual Studio, first we need to modify publish directory for angular-cli. In order to do that, open angular-cli.json in your project and change value of "outDir" to "wwwroot/dist". We could use "wwwroot" as outDir but, angular-cli deletes entire folder before it builds the application. So, In order not to loose other files under wwwroot folder, we ued wwwroot/dist.
Before publishing our application using Visual Studio's publish, we need to build our angular application using angular-cli. We can do it using prepublish scripts. Add "ng build --prod" to your prepublish script in project.json. Your scripts in project.json will be like this:
"scripts": {
"prepublish": [
"ng build --prod"
],
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
In this way, angular-cli is going to build your client application before every publish you make.
We need to move files and folders under "wwwroot/dist" to "wwwroot". In order to do that, change your prepublish scripts like this:
"scripts": {
"prepublish": [
"ng build --prod",
"robocopy %publish:ProjectPath%\\wwwroot\\dist\\ %publish:ProjectPath%\\wwwroot\\ /S /E /MOVE"
],
"postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
This command copies entire content of wwwroot\dist folder to wwwroot and deletes dist folder before publish. In this way, will have a clean wwwroot folder.
We need to do one more thing before publising our application. Since we host our Angular 2.x application in a ASP.NET Core website, we will have a routing problem. After publishing our application, if we refresh page when we navigate to a page in our application (for example: /admin/users), we will have a empty page. Because when we request an url like http://yourwebsite.com/admin/users, ASP.NET Core will not be able to find a matching Controller. In order to overcome this problem, add below code to Startup.cs file just before "app.UseStaticFiles();" line.
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 404
&& !Path.HasExtension(context.Request.Path.Value))
{
context.Request.Path = "/index.html";
await next();
}
});
Now, we can publish our website using Visaul Studio's publish at once.
Our client and server applications are designed to work separately. Because of that, they have different configurations. In order to make them work together, we need to make some configurations after publish as well. We need to use same address configured for our host application in appsettings.json for our angular2 application. Copy the value of "WebSiteRootAddress" in appsettings.json and use this value for "remoteServiceBaseUrl" and "appBaseUrl" in "appconfig.json" under "wwwroot\assets\" folder.
Now you can view your website under "http://yourwebsite.com/index.html". If you enter only http://yourwebsite.com/, it will redirect you to swagger ui (to swagger/ui/index.html), so you need to add index.html after your website name.


Next SpaceX Launch:
In
On
local time
UTC:
launches planned for the next 4 weeks
List of Future launches on Wikipedia
r/SpaceX <3
Thank you for visiting me here on the internet. It is lonely without visitors. I live on
GitHub
- PRs and issues welcome 😊
Made by
Max Kaye


Interfaces defining the Document Object Model for an ActionScript 3 source code file.
To get instances of any of the interfaces defined by this package, use a {@link uk.co.badgersinfoil.metaas.ActionScriptFactory}.
The top-level type is {@link uk.co.badgersinfoil.metaas.dom.ASCompilationUnit}, which represents an entire file (a 'unit of compilation'). Though a compilation unit, you may access an {@link uk.co.badgersinfoil.metaas.dom.ASPackage} definition, and thereby get to a specific {@link uk.co.badgersinfoil.metaas.dom.ASClassType} or {@link uk.co.badgersinfoil.metaas.dom.ASInterfaceType}, which is probably the thing of most interest.


Introduction to GIFLIB
GIFLIB is a package of portable tools and library routines for working
with GIF images. You can find the latest version at the GIFLIB home
page http://www.ccil.org/~esr/giflib.
The Graphics Interchange Format(c) specification is the copyrighted
property of CompuServe Incorporated. GIF(sm) is a service mark
property of CompuServe Incorporated. As this package existed before
UniSys's lawyeritis attack of New Years' Day 1995, it is grandfathered
in under their license terms and you do not have to pay fees
for using it.
This package has been released under an X Consortium-life freeware
license. Use and copy as you see fit. If you make useful changes,
add new tools, or find and fix bugs, please send your mods to the
maintainers for general distribution.
The util directory includes programs to clip, rotate, scale, and
position GIF images. It includes an X11 viewer, code to dump GIFs to
an Epson-compatible printer in graphics mode, and many conversion
utilities. These are no replacement for an interactive graphics
editor, but they can be very useful for scripted image generation or
transformation.
The library includes program-callable entry points for reading and writing
GIF files, an 8x8 utility font for embedding text in GIFs, and an error
handler. GIF manipulation can be done at a relatively low level by
sequential I/O (which automatically does/undoes image compression) or at
a higher level by slurping an entire GIF into allocated core.
This library speaks both GIF87a and GIF89. The differences between
GIF87 and GIF89 are minor: in the latter, the interpretation of some
extension block types is defined. The library never needs to actually
interpret these, but giftext notices them.
Utilities
Here is a summary of the utilities in this package. If you're looking
at this page through a web browser, each utility name should be a
hotlink to HTML documentation.
Conversion Utilities
- gif2bgi
- display GIFs on IBM PC displays using the BGI (Borland) driver
- gif2epsn
- dump images saved as GIF files on Epson type printers
- gif2herc
- display GIFs on IBM PC displays using the Hercules graphic card
- gif2iris
- display GIFs under SGI NeWs window system
- gif2ps
- print GIF file on laser printers supporting PostScript
- gif2rgb
- convert images saved as GIF to 24-bit RGB image(s)
- gif2rle
- convert images saved as GIF to RLE (Utah raster toolkit) format
- gif2x11
- display images saved as GIF files under X window system
- raw2gif
- convert raw 8-bit image data into GIF files
- rgb2gif
- convert 24 bit images to a GIF image using color quantization
- rle2gif
- convert images saved as RLE (Utah raster toolkit) to GIF format
Test Pattern Generators
- gifbg
- generate a single-color test pattern GIF
- gifcolor
- generate color test patterns
- gifwedge
- create a test GIF image resembling a color monitor test pattern
Image Manipulation Components
- gifasm
- assemble multiple GIFs into one, or burst a multiple-mage GIF
- gifclip
- clip or crop a GIF image
- gifclrmp
- modify GIF image colormaps
- gifcomb
- combine 2 GIF images of exactly the same size into one
- giffix
- clumsily attempts to fix truncated GIF images
- gifflip
- flip GIF image along X or Y axis or rotate by 90 degrees
- gifinter
- convert between interlaced and non interlaced images
- gifovly
- generate one composite GIF from a multiple-image GIF
- gifpos
- change a GIF's screen size or recondition it.
- gifrotat
- rotate a GIF through any desired angle
- gifrsize
- resize a GIF by deletion or duplication of bits
- gifburst
- burst a GIF image into subrectangles.
Report Generators
- giftext
- print (text only) general information about a GIF
- gifhisto
- generate color-frequency histogram from a GIF
GIF Composition Tools
- icon2gif
- converter/deconverter to/from an editable text format
- text2gif
- generate GIF images out of regular text in 8x8 font
- gifinto
- end-of-pipe fitting for GIF-processing pipelines
- gifcompose
- use giflib tools to compose images
C Code Templates
- giffiltr
- template code for filtering a GIF sequentially
- gifspnge
- template code for filtering a GIF with in-core operations
Under MS-DOS, most filters will print the current input scan line number
(counting up) whenever they read image input, and will print output image line
number (counting down) when they dump output. Utilities that only read or
write always print in increasing order. Utilities (like GifPos that only
change positions) that copy the image as a block of compressed data will print
nothing --- they cannot identify a scan line number, and are enough faster that
the feedback to the user doesn't seem necessary.
Some of the utilities require memory on the order of the whole screen, while
others read one scan line at a time. Each utility HTML file has entry called
Memory Usage which will be one of:
- Line
- memory required is on the order of one scan line
- Image
- proportional to the size of the biggest image in GIF file
- Screen
- proportional to GIF screen size
In all cases a byte is allocated per pixel, so an image of 320 by 200 pixels
will requires approximately 64k bytes of main memory.
Library Functions
The library contains two groups of C functions. One group does sequential
I/O on the stream-oriented GIF format. The other supports grabbing an
entire GIF into allocated core, operating on it in core, and then writing
the modified in-core GIF out to disk.
Unless you are on a 286 or some other very memory-limited machine
running under DOS, you probably want to use the second group.
Detailed documentation on the library entry points is in gif_lib.html. Library error codes are
described in liberror.html
The GIF Standard
The doc subdurector includes flat-ASCII descriptions of GIF89 format and Lempel-Ziv
Compression.
History
This package was originally written by Gershon Elber
in 1990 on an IBM PC under MS-DOS using Borland Turbo C. He made it portable
to several UNIX environments.
The 2.1 version featured substantial changes and additions by Eric
S. Raymond . These included the
DGifSlurp/EGifSpew function pair for enabling non-sequential
operations on GIF images and the tools icon2gif, gifovly, gifburst, and
gifcompose.
The 2.4 version converted all the docs from an idiosyncratic
plain-text formal to to HTML.
Package Status
GIFLIB's current maintainer is Eric S. Raymond. You can find his home
page at http://www.ccil.org/esr.
GIFLIB is not under active development, but bug fixes are being accepted.
Eric S. Raymond <esr@snark.thyrsus.com>


Google Analytics, Event Tracking and Discovery Tools
Going Beyond Pageviews
Emily Lynema, Associate Head, IT, NCSU Libraries
Adam Constabaris, Singe de Code, NCSU Libraries
Code4Lib, February 2013
Overview
Google Analytics can be used to track not only pageviews, but in-page events, allowing you to understand more
about how your site is being used.
Have real patron data to make data-driven design decisions.
Google Analytics Event Tracking
You decide what to track
Which user actions?
How should they be categorized?
Use simple JavaScript to push events to Google
Enjoy Google Analytics' feature-full reporting interface
Event Tracking Use Cases
Hidden or externally loaded (AJAX) content
Hidden or externally loaded (AJAX) content
Internal links that occur in multiple places
Hidden or externally loaded (AJAX) content
Internal links that occur in multiple places
External links
NCSU Catalog Activity (*)
Tracking LOTS of things
(*) But not all of them for very long
What are we tracking?
Results List clicks
Facet expand / close
Facet checkboxes
Send search out to TRLN / WorldCat / Summon
Full record tools
Full record tabs
Location tab clicks (request, browse, full text)
External URLs on the full record (finding aids, full text)
Browse (shelf browse / subject browse)
Interesting Findings
various dates
Whoa....look at those tabs.
Note: February 5-7, 2013
Wait...do I see MARC??
Note: February 5-7, 2013
A small link can overpower a fancy widget
Note: November - February, 2013
Having a link in more than one place can be helpful
Note: January - February, 2013
Users make some decisions from the results list
Note: February 5-7, 2013
But they still like to look at the full record
Note: February 5-7, 2013
NCSU Summon Activity (*)
Tracking fewer things
* Some things are almost impossible to track (ex: clicks to view full text)
Picked the things that were easiest to track and seemed most durable, rather than most desired
What are we tracking?
Searches
Sorting
Paging
Facet activity
Most difficult to identify: user clicks to view full text. So we didn't go there.
Interesting Findings
November 2012 - February 2013
Paging is more popular than facets
Content Type and Subject are basically the only facets
The Plumbing
Of course it involves jQuery!
It doesn't have to, but that's how we did it.
GA Event Tracking API
// safely initialize _gaq; if GA loads after your code,
// any events already in the queue will be sent to the Goog.
var _gaq = _gaq || [];
...
_gaq.push([
'_trackEvent',
eventCategory,
eventAction,
optional_eventLabel,
optional_eventValue
]);
Event Overview
To track an event of a given type, you need a category and an action. Optionally, you can add a label and, if you add the label, you may also add a value. Picking values for these things (and whether you use 2, 3, or 4 of them for any given event) is up to you.
Implementation Issues
Q1. Where do we get the data for the GA API call?
Q2. How do we send events when "the right things" happen in the UI?
A1. HTML5 Data Attributes
A2. jQuery (or similar)
HTML5 Data Attributes
Actionable metadata!
Huh?
data-* attributes give you a place to put data for use by your scripts. Browsers shouldn't try to do anything with them, and you
probably shouldn't
use them to add visual styles.
jQuery's data API is supported in all browsers jQuery supports.
How to Use 'em
data-* attribute names must be lower case and may contain dashes as separators. The data- prefix is stripped and the rest is converted to camel case when you access them in your scripts.
e.g. a data-foo-bar attribute in HTML is accessed under the name
fooBar in a script.
$("a[data-ga-event]").on("click", function(evt) {
// data-ga-event => "gaEvent"
var data = $(this).data("gaEvent").split(",");
data.unshift("_trackEvent");
// data == ['_trackEvent','Record','Tab','Marc']
_gaq.push(data);
});
Really, That's It?
Yes.
Ok, no. But that is the basic technique.
Later, I'll try to scare you.
When it's Not Your Markup
The declarative technique shown so
far works well if you are generating
the pages. What if you want more info
on how people are using an externally hosted service where you don't control the HTML, such as Summon?
Not Your Markup (cont.)
Find a way to inject your javascript (and, if needed, GA) onto the page.
Add tracking data to elements programmatically.
Inject JavaScript
Matthew Reidsma's Summon Stats (github project) showed us how to load external JavaScript onto our Summon pages.
For other services, if there's no direct support for it, try playing with the site customization features.
Differences
More selectors.
Selectors may need to use specific location in the DOM instead of id and class attributes.
Tracking data now needs to be computed instead of asserted.
Example
// from our custom summon-analytics.js
$("#pageNavigation a[href^='/search']").click(
function(evt) {
var link = $(evt.target);
var lt = $.trim(link.text());
if ( lt == "Next" ) {
lt = "" + (thisPage +1);
} else if ( lt == "Prev" ) {
lt = "" + (thisPage -1);
}
logEvent("Paging", "Page", lt);
}
);
Explorations
Testing and Debugging
AJAX Content
Selector Strategies
Tracking Tweaks
Troublerebuking, Debugging, and Testing
Be proactive! Set up a safety net first
Make friends with your browser's dev tools/debugger.
use ga_debug.js while developing (*)
“Fire it up and see if it works?”
We found that it can take up to a day for an event to show up in the GA dashboard, so this is an
error-prone and time consuming testing strategy.
Test everything you can see and control before you send it to the third party
Working With a Net
Write testable code
Write tests
Run the tests
Why So Much Emphasis on Testing?
Unlike with a lot of other front-end JavaScript development, this is not a visual feature. Automated tests
can keep you from just collecting some really boring anecdotes.
Tracking Events in AJAX Content
We are tracking some events sent when users click on content that is loaded externally.
You may not control the markup
The tracked elements are not in the DOM when the page is loaded, so you have to do a bit more work in your selectors
AJAX Content Tracking (cont.)
jQuery lets you specify handlers for events for elements that don't exist yet, by (essentially) listening on an (existing) element that (will) contain them. This is not the only approach, but is the easiest to work with.
// our catalog loads transformed EAD XML via XHR when users click on the content tab
$("#contents").on("click", ".EAD_daolink", function(evt) {
logGAEvent($(this), ['URL','Digitized Content','CCC']);
});
On Selector Strategy (Your Markup)
*[data-ga-event] matches all elements with tracking data, but is potentially very slow; the data we are collecting can be valuable,
but you don't want to frustrate your users trying to get it.
If you use a CSS class in concert with it (e.g. .tracked[data-ga-event], it's both faster and you can temporarily disable
tracking for some elements should you need to, by simply removing the class.
Tracking Tweaks
In usability studies, I noticed some people cycle through the tabs; so now we track each element once per page view. Whether you want to do this depends on your goals.
What are patrons doing before they click your chat button? You could track different events for those kinds of cases if you maintain state locally.
jQuery's Data API can be used to write data onto elements.


Code List Editor
Search for:
* List Name:
Sender Item:
Receiver Item:
Clear Form and Fields
Submit
Results:
Sender Item
Receiver Item
Description
9001
F0_01
Partnerr 9001
Edit
9002
F0_02
Partnerr 9001
Edit
Code List Editor
×
List Name:
Sender Id:
Receiver Id:
Sender Item:
Receiver Item:
Description:
Text1:
Text2:
Text3:
Submit