You can use this project as a scaffold for your own Go/HTML/CSS/JavaScript driven apps.

The .app
file is the only thing you need to distribute.
It is ...
—which was set by JavaScript by accessing the /time
endpoint serving
a Go-side handler.


Hi! I'm a front-end developer, graphic designer and UI/UX enthusiast from Oakland, CA. Currently, training to become a full-stack software enginner at Techtonica. I love tea, crystals and playing with WebVR, Three.js and GSLS.


Apple ID:
Password:
Sign in

Forgot Apple Id or Password

Setup Instructions
×
Your Session Expired you have been automatically signed out to protect your privacy!
Welcome For more information visit us
Apple Find My Phone


HOME
|
SIGNUP
|
LOGIN
|
REGISTRATION FORM
Username:
First Name:
Last Name:
Email:
Password:
Confirm Password:


TODO anlegen
zurück zum TODO Tracker
Was zu tun ist:
Deadline:
Fortschritt:
0%
0%
5%
10%
15%
20%
25%
30%
35%
40%
45%
50%
55%
60%
65%
70%
75%
80%
85%
90%
95%
100%
TODO anlegen
Impressum


Fishtail Hyperbike Is All About One-Rider Thrills
by Daniel PatrascuFor the better part of the past century, bike design has become set in its ways, and it is very rarely that we get to see new lines, curves and styles get onto the production line. Modern day motorcycles are split into classes and uses, and nobody seems interested in taking a step pack and envision something else.
Yet for every dull bike that rolls off production lines there are countless unsung projects, ideas of how these machines should look like and behave in the future. The Carota Design K4-07 is just such an idea.
The group of people behind Carota is responsible for ideas that range from spaceships to shoes, but they do seem to take particular interest in motorcycles, or anything with two wheels in general. We’ve already seen their chopper-like e-Scooter a while back.
As far as the K4-07 goes, the bike has no immediate application, as it is just a design study. One for a time when hyperbikes will be a dime a dozen, and seeing an elongated, sleek green bullet whoosh by won’t be so out of the ordinary.
The K4-07 blends the inverted symmetry of the real-wheel assembly, which looks like a fishtail with the penetrating look of the front end. It has no windscreen, hinting to the fact its riders would sit very low, with their cheeks touching metal as they chase the ultimate aerodynamic effect.
The K4-07 has been designed just for the rider, and there is no room for another passenger to enjoy the thrills. The sleek shape of the bike is accompanied by an equally slim display sitting on what other bikes use for a fuel tank
We have no idea what the designers envisioned for a powertrain, but we see the hyperbike as nothing but an electric monster, packing motors and batteries in the blueish-green hull. 🏁


UX Designer and Front End Developer
Colorado Springs, CO
520-981-5605
Skills
User Centered Design
Web Design
Wireframing
Prototyping
User Research
Web Development
Programming Languages
HTML
CSS
JavaScript
Work with retirement plan clients to complete various transactional tasks. Currently handling a book of business of over 20 clients.
Worked with multiple resources to create different projects and designs. Constantly looking for new opportunities to learn more about these fields and apply new knowledge to my work.
Responsible for all aspects of store. Managed over 20 employees. Responsible for increasing store metrics on a daily, weekly, monthly, and annual basis. Strong visual focus as well as associate development.
Responsible for all aspects of store including associate development, visual merchandising, operational duties, and more.
B.A in Business Administration
Frontend Developer Certification
User Experience Professional Certification


If you have symptoms of sepsis, your doctor will order tests to make a diagnosis and determine the severity of your infection.
One of the first tests is a blood test. Your blood is checked for complications like:
1. Infection
2. Clotting problems
3. Abnormal liver or kidney function
4. Decreased amount of oxygen
5. An imbalance in minerals called electrolytes that affect the amount of water in your body as well as the acidity of your blood
Depending on your symptoms and the results of your blood test, your doctor may order other tests, including:
1. A urine test (to check for bacteria in your urine)
2. A wound secretion test (to check an open wound for an infection)
3. A mucus secretion test (to identify germs responsible for an infection)
If your doctor can’t determine the source of an infection using the above tests, they may order an internal view of your body using one of the following:
1. X-rays to view the lungs
2. CT scans to view possible infections in the appendix, pancreas, or bowel area
3. Ultrasounds to view infections in the gallbladder or ovaries
4. MRI scans, which can identify soft tissue infections
Sepsis can quickly progress to septic shock and death if it’s left untreated. Doctors use a number of medications to treat sepsis, including:
1. Antibiotics via IV to fight infection
2. Vasoactive medications to increase blood pressure
3. Insulin to stabilize blood sugar
4. Corticosteroids to reduce inflammation
5. Painkillers
Severe sepsis may also require large amounts of IV fluids and a respirator for breathing. Dialysis might be necessary if the kidneys are affected. Kidneys help filter harmful wastes, salt, and excess water from the blood. In dialysis, a machine performs these functions.
In some cases, surgery may be needed to remove the source of an infection. This includes draining a pus-filled abscess or removing infected tissue.
Your recovery from sepsis depends on the severity of your condition and any preexisting conditions you might have. Many people who survive will recover completely. However, others will report lasting effects.
The UK Sepsis Trust says it can take up to 18 months before survivors start to feel like their normal self. The Sepsis Alliance says that around 50 percent of sepsis survivors deal with post-sepsis syndrome (PSS). The alliance says this condition includes long-term effects such as:
1. Damaged organs
2. Insomnia
3. Nightmares
4. Disabling muscle and joint pains
5. Fatigue
6. Poor concentration
7. Lowered cognitive functioning
8. Lowered self-esteem
9. Severe cases of sepsis can lead to death.


|
INTRODUCTION The value of the Color Computer Speech/Sound.Cartridge (S/SC) speaks for itself. This versatile Color Computer peripheral lets you use your computer to speak words and sentences, generate complex sound effects, and play music in a 9-octave range on 3 independent channels. It also opens new dimensions for integrating speech and sound effects into all types of applications--from games to educational programs. This manual contains a great deal of technical information intended primarily for advanced programmers. However, anyone who owns a Color Computer, including the novice and the machine-language programmer, can use the S/SC. Getting your Color Computer to speak is simple. * Plug the S/SC into the Program Pak slot on the right side of your Color Computer. * Type in the program on Page 11 of this manual. * Run the program and then type in anything you want the computer to say. That's it. (Save this program on cassette so you can use it again without retyping it. If you have a Multi-Pak Interface, you can save the program on disk.) Many applications programs will use the S/SC automatically. If these programs are cassette-based, all you have to do is plug the S/SC into the Program Pak slot and then load the cassette program. If a Program Pak applications program uses the S/SC, you need a Multi-Pak Interface. You may use the Speech/Sound Cartridge and Program Pak in any 2 Interface slots. Some Color Computer software and the 0s-9 Operating System expect a Disk Drive Controller in Slot 4 or a Communications package in Slot 1, and these may not function properly with the S/SC in those slots. Slots 2 and 3 of the Interface, however, are always available for the S/SC and Program Paks. If a disk-based applications program uses the S/SC, you need a Multi-Pak Interface. You may use the S/SC and Disk Drive Contoller in any two Interface slots. However, some Color Computer software and the OS-9 Operating System expect the Disk Drive Controller in Slot 4 or a Communications package in Slot 1 and may not function properly with the S/SC in those slots. Slots 2 and 3 are always available for the S/SC. When you run the disk-based program, it automatically uses the S/SC. Although this manual contains much technical information, it also contains many tutorial and demonstration programs. The first 3 programs in the following list are limited in scope and demonstrate basic principles for programming the S/SC. The last 4 programs are more sophisticated, and we include them so that nonprogrammers can explore many of the capabilities of the S/SC. TEXT TO SPEECH PROGRAM PAGE 11 ALLOPHONE TO SPEECH PROGRAM PAGE 15 DIRECT ACCESS (REGISTER) PROGRAM PAGE 27 CARTRIDGE DEMONSTRATION PROGRAM PAGE 43 ORGAN PROGRAM PAGE 51 SOUND EFFECTS PROGRAM PAGE 53 TEXT TO SPEECH PROGRAM (with editor) PAGE 55 To use these programs, just type them in, save them on cassette or disk, and run them whenever you want. They demonstrate many of the various capabilities of the S/SC. If you know how to program in BASIC or in machine language, you can use these programs to gain information quickly about the capabilities of the S/SC. Then you can modify and improve on them to use the S/SC to its greatest advantage. Note: The programs in this manual are written for a Color Computer with Extended Color BASIC, but they may be modified for computers with Non-Extended Color BASIC by deleting the PEEK commands and converting hexidecimal numbers (&Hxxxx) to their decimal equivalents. BACKGROUND INFORMATION An "intelligent" peripheral, the Speech/Sound Cartridge (S/SC) contains an on-board microprocessor that controls both the speech generator and the sound generator and routes an RF signal through the Color Computer and into the television speaker. This processor has 4K ROM and 2K RAM. In addition to providing you with an easier means of programming the cartridge, the S/SC RAM also lets you store as many as eight 64-character sentences or eight 64-byte sound effects for later execution. You can activate the sentences or sounds you store in the buffers at any time during program execution by using simple single-byte commands. The S/SC generates speech and sound with separate processors. You may produce speech by two different methods and sound or music by another two methods. Note: The pitch and duration of the sounds listed in this manual are produced by an S/SC used with a Color Computer running at a clock speed of .89 MHz. Since the S/SC internally multiplies the Color Computer clock by a factor of 2, the S/SC operates at a clock frequency of 1.78977 MHz. This is the clock referred to in Appendix D. SPEAKING OF THE S/SC You can use the S/SC to produce speech by running a short program to transfer text from the Color Computer keyboard to the cartridge, where English words are directly translated into speech. You can also program the S/SC to create words (English or foreign) by combining small units of speech sounds. Spoken language is the combination of a certain set of small sounds and syllables, called allophones, into recognizable words. The S/SC1s General Instruments SP0256 speech processor generates allophones. The on-board microprocessor uses a set of ROM-based phonetic rules to combine allophones so that the English text you enter at the keyboard is converted into speech. When you use this text-to-speech mode, the S/SC'S large set of phonetic rules in ROM lets you produce intelligible speech without special phonetic spellings. However, some English words are pronounced contrary to the usual phonetic rules. In these cases, you may have to "misspell" a word to force correct pronunciation. For example, the S/SC pronounces BOW as BO. That's fine. To say BOW as in "bow to the king," however, you have to spell BOW as BOU. Before you can translate text to speech, however, you must use a short BASIC or machine code program to transfer text data between the microprocessor in the Color Computer and the microprocessor in the s/SC. The following BASIC driver routine illustrates the text-to-speech capabilities of the S/SC: 10 REM INITIALIZE VARIABLES 20 X=&HFF00; Y=&HFF7E 30 REM SET COCO SOUND MULTIPLEXER TO CARTRIDGE INPUT 40 POKE X+1,52;POKE X+3,63 50 REM ENABLE SOUND MULTIPLEXER 60 POKE X+35,60 70 REM INPUT STRING TO BE SPOKEN 80 INPUT A$ 90 GOSUB 120 100 GOTO 80 110 REM SUBROUTINE TO OUTPUT STRING 120 FOR 1=1 TO LEN(A$) 130 REM CHECK FOR BUSY* 140 IF (PEEK(Y) AND 128)=0 THEN 140 150 REM OUTPUT EACH CHARACTER 160 POKE Y, ASC(MID$(A$,I,~)) 170 NEXT I 180 IF (PEEK(Y) AND 128)=0 THEN 180 190 REM POKE A CARRIAGE RETURN 200 POKE Y,13 210 RETURN Run the program. At ? prompt, type: I CAN TALK <SPACE BAR> <ENTER> It really can. Note: Be sure to end each string of text to be spoken with a space or any punctuation mark except a comma. The S/SC interpets spaces and punctuation marks as pauses, and these "silences" ensure that the speech processor is actually turned off after speaking each typed phrase or sentence. The above program demonstates the straight text-to-speech capabilities of the S/SC. It sends a stream of data bytes, each an ASCII character, to the S/SC for conversion into speech. Speech does not begin, however, until you send a carriage return (hex 0D; decimal 13) to the S/SC. You need only use 2 addresses to transfer data between the Color Computer and the S/SC: hex FF7D (decimal 65405) and hex FF7E (decimal 65406). The lower address is a software reset for the S/SC, which you may use to reinitialize the entire cartridge if necessary by POKEing a 1 and then a 0 at that address. The upper address is the address you use to transfer data to the S/SC. Hex FF7E also contains the status of the S/SC. Whenever you read (PEEK) this address, the S/SC returns a status byte to the Color Computer's 6809 processor. All status bits are active low. The most significant bit (bit 7) is called BUSY*, and whenever it returns a 0, the S/SC's microprocessor hasn't yet processed the last byte received from the Color Computer's microprocessor. If you try to transfer data to the S/SC while bit 7 is low, you lose all the data you send until the bit resets. For this reason, you should monitor bit 7 every time you send data to the S/SC. When low, bit 6 of the status byte indicates that the S/SC is currently speaking. The bit returns to a high state when the current phrase is finished. When low, bit 5 of the status byte indicates that a sound effect is in progress. None of the other bits in the status register are used, and they should be ignored. Note: Whenever you write a program to transfer data to the S/SC, you should first monitor the status byte to determine whether or not the S/SC is ready to accept another character. Depending on the intent of your program, you may or may not be required to monitor the other status bits. If the S/SC is not busy (that is, if BUSY* is high), then you may simply write or POKE your data into hex FF7E. Note: Due to the time required for the S/SC's microprocessor to execute a command, the speech and sound status bits are not valid immediately following a speech or sound execution command. The S/SC microprocessor requires different lengths of time to execute a command, depending on the complexity of the command. Speech commands take longer than sound commands. For this reason, you should have, as part of your test routine, a "wait" loop that executes prior to testing status. The duration of the "wait" loop may vary, depending on the time required to execute the previous command. STRAIGHT TALK The most significant bit of each character sent to the S/SC must be cleared, otherwise it initiates a command sequence. Command sequences begin with a character in which the most significant bit is set; therefore, the initial character in a command sequence will be 80 hex (128 decimal) or greater. S/SC commands let you store speech strings and allophone address streams in 1-8 buffers and store sound commands and register strings in another 1-8 buffers. Additional commands let you later execute the contents of those buffers singly or in combination. A complete list of individual commands appears in Appendix A. Thefollowing table briefly outlines the command groupings:
With the above commands you can load or execute strings from the buffers in RAM. Each buffer stores amaximum of 64 characters. You may, however, store strings longer than 64 characters by loading consecutive buffers. Command 80, for example, lets you store a speech string of a maximum of 512 characters by loading the string into Buffers 0 through 7. Command 8E lets you store a maximum of 128 characters in Buffers 6 and 7. In "Speaking of the S/SC" you produced speech by using the speech-to-text buffer that automatically links allophones and pronounces them according to a series of phonetic rules. The above commands let you generate speech by linking allophones in any manner you choose. You use this method to generate speech when programming in foreign languages that do not follow English phonetic rules. You might also use this method to create more precise (or regionally accented) pronunciations of English words. The following program shows, step-by-step, how to produce speech by poking individual allophones into Buffer 0 and then later executing them.  " The allophones in the data line are: KK3 AX LL ER1 = COLOR PA5 PAS PA5 = 600 MILLISECOND PAUSE KK3 AX MM PP YY1 UW2 TT2 ER1 = COMPUTER PA5 = PAUSE SILENCES SPEECH PROCESSOR Appendix C contains a complete list of addresses for the 64 allophones that the speech processor produces. SOUND ADVICE You may program the Speech/Sound Cartridge to generate sound by 2 different methods. You may use the S/SC commands followed by a series of postbytes specifying the channel, amplitude, pitch, and duration of a tone or noise, or you may directly manipulate the sound processor's registers to produce the appropriate sound. Using the S/SC commands to produce sound effects or music is a simple process in which you give a command and follow it with data groups of 3 or 4 postbytes~each group defining either a tone, a noise, or an envelope. Poking hex 98 at &HFF7E, for example, lets you load a maximum of 64 bytes of sound data into Buffer 0. Below is a bit-by-bit description of the types of postbyte data that follow sound commands. The first postbyte after a sound command determines the type of operation to be carried out (tone and channel; noise and channel; or envelope) and the amplitude of the tone or noise. The first 3 most significant bits of this postbyte contain the following operation code:
You must terminate all command sequences with an FF hex (255, and you must send the terminator when the S/SC is expecting a new "first byte." For example, if you send the first byte of a tone event, the s/SC interprets the next 3 bytes as data for the tone. An FF (255) in one of these 3 positions is read as data--not as a terminator. Send the terminator when the S/SC is expecting you to define a specific sound event in the first postbyte. Note: Each measured buffer accommodates 64 bytes of information. Always allow room in the last buffer of a command sequence for a terminator. If the last byte in a buffer is not a terminator, the S/SC processor automatically inserts a terminator in the first byte of the last sound event of the buffer. That last sound event, therefore, is never executed. After the processor inserts the terminator, it automatically reverts to the normal input mode. DIAL TONE If Postbyte 1 specifies a tone (the amplitude of which is either fixed or controlled by an envelope), 3 additional postbytes are needed to complete the description. Postbyte 2 specifies the Coarse Tone Period; Postbyte 3 specifies the Fine Tone Period; and Postbyte 4 determines the duration of the tone. The TONE data group breaks down into the following 4 bytes:
Note #1: The listing in Appendix D shows the specific combinations of coarse and fine period values that produce precise notes within the S/SC's 9-octave range. Note #2: A duration in a buffer's sound sequence is the length of time between "events"--both sounds and silences. Therefore, if the final event in a buffer is not a silence, the previous sound event continues until another command cancels it. Unless you want a sound to continue past the end of the buffer sound sequence, always place a silence (a command with an amplitude of 0) at the end of a buffer.
AS PLAIN AS THE NOISE If the first postbyte following a command specifies a noise (and its amplitude), only 2 additional bytes are needed to describe it fully. Postbyte 2 sets the coarse period value, and Postbyte 3 determines the duration. The NOISE data group breaks down into the following three bytes:
THE ENVELOPE, PLEASE The final type of command is the envelope command. This command lets you wrap previously generated tones and noises in an envelope of sound. Only one envelope shape is available to all 3 channels. Each channel may use the envelope independently of the others, or all may share the single shape at one time. If the first postbyte following a command specifies an envelope (and its 4 shape characteristics), 3 additional bytes are required to describe the envelope. Postbyte 2 sets the coarse period value; Postbyte 3 sets the fine period value; and Postbyte 4 sets the duration of the envelope. Envelopes control the amplitude of previously issued tones or noises. For example, you can use an envelope to create a vibrato effect. First, store a tone with the envelope bit set (Bit 4 of Byte 11, and then immediately create a slowly repeating envelope. The 4-byte envelope data group controls the tone or noise of the preceding byte. The ENVELOPE data group breaks down into the following 4 bytes: Byte 1 Bit 7 Unused Bits 6-5 When both are set, an envelope is established Bit 4 Unused Bits 3-0 These bits control the shape of the envelope: Bit 3 = the CONTINUE bit. CONTINUE tells the processor whether to play the envelope's sound just once or repeat it. When the bit is set, the tone repeats; when the bit is cleared, the sound occurs once and then quits. Bit 2 = the ATTACK bit. ATTACK determines whether a noise or tone builds from minimum amplitude to maximum or subsides from maximum to minimum. When the bit is set, the sound builds; when the bit is cleared, the sound subsides. Bit 1 = the ALTERNATE bit. ALTERNATE changes the attack with each cycle. When the bit is set, the noise or tone builds, then fades, then builds, and so on. When the bit is cleared, the attack is the same as specified in Bit 2. Bit 0 = the HOLD bit. HOLD maintains the amplitude of a tone or noise at the level reached by the attack~rnaximum or silence. The following chart shows how the various envelope shape parameters modulate the amplitude of sounds: <chart> Byte 2 Bits 7-0 Set the Coarse Tone Period value of the envelope. The envelope period uses a base frequency of 6991 Hz divided by a 16-bit value contained in this and the following byte. The highest envelope frequency, therefore, is 6991 Hz, and the lowest is approximately .1 Hz (6991 divided by 65536). This slowest frequency provides an attack time of almost 10 seconds. Byte 3 Bits 7-0 Set the Fine Tone Period value of the envelope. It is used with Byte 2 to produce a 16-bit value. Byte 4 Bits 7-0 Set the duration of the envelope. Duration is relative, the shortest being 0 and the longest being 255. Duration is also relative depending on the value in the base time register (accessible by command hex 8F) .  In other words, you can transfer pairs of bytes directly to the S/SC. The first byte you poke in at hex FF7E is the register number (1-13). The next number you poke in at hex FF7E is a value within the register's parameters. Note: Different registers have different ranges of valid input. Register 0 (Channel A tone--Fine Period value), for example, uses data from 0-255; Register 1 (Channel A tone--Coarse Period value), however, uses only data from 0-15. The byte pairs you poke in (register # followed by data) are transferred "on the fly" into the sound generator until you send a terminator (FF hex). The following table outlines the S/SC registers, functions, and data ranges. (For a complete discussion of the S/SC, see Appendix B) . # FUNCTION DATA RANGE 0 Tone generator--Channel A--Fine Period 0-255 1 Tone generator--Channel A--Coarse Period 0-15 2 Tone generator--Channel B--Fine Period 0-255 3 Tone generator--Channel B--Coarse Period 0-15 4 Tone generator--Channel C--Fine Period 0-255 5 Tone generator--Channel C--Coarse Period 0-15 6 Noise generator 0-31 7 Mixer Control 0-63 8 Amplitude control--Channel A 0-15 9 Amplitude control--Channel B 0-15 10 Amplitude control--Channel C 0-15 11 Envelope Fine Period Control 0-255 12 Envelope Coarse Period Control 0-255 13 Envelope shape control 0-15 The following short program lets you manipulate a tone on Channel A by directly controlling the S/SC1s registers: 10 REM RESET S/SC 20 POKE &HFF7D,1:POKE &HFF7D,0 30 REM INITIAL12 E VARIABLES 40 X=&HFF00: Y=&HFF7E 50 REM TURN ON S/SC SOUND 60 POKE X+1,52: POKE X+3,63: POKE X+35,60 70 REM PUT S/SC INTO DIRECT ACCESS MODE 80 GOSUB 300 90 POKE Y,&HAF 100 REM POKE A FINE TONE ON CHANNEL A 110 GOSUB 300 120 POKE Y,0 130 INPUT "ENTER A VALUE FOR A TONE ON CHANNEL A" ;T 140 GOSUB 300 150 POKE Y,T 160 REM CALL MIXER REGISTER 170 GOSUB 300 180 POKE Y,7 190 REM SET MIXER TO CHANNEL A TONES ONLY 200 GOSUB 300 210 POKE Y,62 220 REM CALL AMPLITUDE REGISTER FOR CHANNEL A 230 GOSUB 300 240 POKE Y,8 250 REM SET AMPLITUDE AT MAXIMUM--15 260 GOSUB 300 270 POKE Y,15 280 REM GO BACK TO CHANGE TONE ON CHANNEL A 290 GOT0 120 300REM CHECK FOR BUSY* 310 IF (PEEK(Y) AND 128) = 0 THEN 3010 320 RETURN To stop the program, press <BREAK> and then type RUN. Line 20 resets the S/SC to silence. The above program demonstrates how easy it is to directly manipulate the S/SC. It shows only how to manipulate one tone on one channel, but much more is possible. The "S/SC Organ" program in Appendix F, for example, turns the bottom two rows of your Color Computer keyboard into an organ keyboard. The "Sound Effects" program in Appendix G shows how to use the S/SC to create advanced sound effects by directly manipulating the S/SC registers through data statements. With a little practice and a Color Computer Speech/Sound Cartridge, every program you run on the computer can sound like a winner. |


Class: SolidusSubscriptions::Installment
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- SolidusSubscriptions::Installment
- Defined in:
- app/models/solidus_subscriptions/installment.rb
Instance Method Summary collapse
-
#failed!(order) ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as a failure.
-
#fulfilled? ⇒ Boolean
Had this installment been fulfilled by a completed order.
-
#line_item_builder ⇒ SolidusSubscriptions::LineItemBuilder
Get the builder for the subscription_line_item.
-
#out_of_stock ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as out of stock.
-
#payment_failed!(order) ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as having a failed payment.
-
#success!(order) ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as a success.
-
#unfulfilled? ⇒ Boolean
Does this installment still need to be fulfilled by a completed order.
Instance Method Details
#failed!(order) ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as a failure
74 75 76 77 78 79 80 81 82 |
# File 'app/models/solidus_subscriptions/installment.rb', line 74 def failed!(order) advance_actionable_date! details.create!( success: false, order: order, message: I18n.t('solidus_subscriptions.installment_details.failed') ) end |
#fulfilled? ⇒ Boolean
Had this installment been fulfilled by a completed order
94 95 96 |
# File 'app/models/solidus_subscriptions/installment.rb', line 94 def fulfilled? details.where(success: true).exists? end |
#line_item_builder ⇒ SolidusSubscriptions::LineItemBuilder
Get the builder for the subscription_line_item. This will be an object that can generate the appropriate line item for the subscribable object
33 34 35 |
# File 'app/models/solidus_subscriptions/installment.rb', line 33 def line_item_builder subscription.line_item_builder end |
#out_of_stock ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as out of stock.
41 42 43 44 45 46 47 48 |
# File 'app/models/solidus_subscriptions/installment.rb', line 41 def out_of_stock advance_actionable_date! details.create!( success: false, message: I18n.t('solidus_subscriptions.installment_details.out_of_stock') ) end |
#payment_failed!(order) ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as having a failed payment
105 106 107 108 109 110 111 112 113 |
# File 'app/models/solidus_subscriptions/installment.rb', line 105 def payment_failed!(order) advance_actionable_date! details.create!( success: false, order: order, message: I18n.t('solidus_subscriptions.installment_details.payment_failed') ) end |
#success!(order) ⇒ SolidusSubscriptions::InstallmentDetail
Mark this installment as a success
57 58 59 60 61 62 63 64 65 |
# File 'app/models/solidus_subscriptions/installment.rb', line 57 def success!(order) update!(actionable_date: nil) details.create!( success: true, order: order, message: I18n.t('solidus_subscriptions.installment_details.success') ) end |
#unfulfilled? ⇒ Boolean
Does this installment still need to be fulfilled by a completed order
87 88 89 |
# File 'app/models/solidus_subscriptions/installment.rb', line 87 def unfulfilled? !fulfilled? end |


18
1 One who isolates himself seeks his own desire,
and he quarrels with all sound judgment.
2 A fool finds no pleasure in understanding,
but only in revealing what is in his own heart.
3 When a wicked person comes, contempt comes with him—
along with shame and reproach.
4 The words of a man's mouth are deep waters;
the fountain of wisdom is a flowing stream.
5 It is not good to be partial to the wicked,
nor to deny justice to those who do right.
6 A fool's lips bring him conflict,
and his mouth invites a beating.
7 A fool's mouth is his ruin,
and he ensnares himself with his lips.
8 The words of a gossip are like delicious morsels,
and they go down into the inner parts of the body.
9 Also, one who is slack in his work
is a brother to the one who destroys the most.
10 The name of Yahweh is a strong tower;
the one who does right runs into it and is safe.
11 The wealth of the rich is his fortified city,
and in his imagination it is like a high wall.
12 Before his downfall a person's heart is proud,
but humility comes before honor.
13 One who answers before listening—
it is his folly and shame.
14 A person's spirit will survive sickness,
but a broken spirit who can bear it?
15 The heart of the intelligent acquires knowledge,
and the hearing of the wise seeks it out.
16 A man's gift may open the way
and bring him before an important person.
17 The first to plead his case seems right
until his opponent comes and questions him.
18 Casting the lot settles disputes
and separates strong opponents.
19 An offended brother is harder to be won than a strong city,
and quarreling is like the bars of a castle.
20 From the fruit of his mouth one's stomach is filled;
with the harvest of his lips he is satisfied.
21 Death and life are in the power of the tongue,
and those who love it will eat its fruit.
22 He who finds a wife finds a good thing
and receives favor from Yahweh.
23 A poor person pleads for mercy,
but a rich person answers harshly.
24 The one who claims many friends is brought to ruin by them,
but there is a friend who comes closer than a brother.


The current digital presence of ODS:
“[W]eb standards and style guidelines for web user interfaces will help development teams provide a consistent look & feel, common navigation, and ultimately customer experience…”
Serves as
One site/application serves all devices
Design in proportions, not pixels
Elements continuously resize/reflow as viewport size changes
Page elements and layout can fundamentally change at specific viewport sizes, when device orientation changes, etc
Elements may reorder themselves, vertically and/or horizontally
Page elements like images may also be delivered in multiple sizes or versions for different breakpoint ranges
Defines columns, gutters, and rows, for clean and consistent layout
With a fluid, responsive grid, layout elements stretch/shrink horizontally and layout can also fundamentally change at specified breakpoints, determined by media queries.
Beyond media queries and breakpoints, other techniques are used to deliver unique content or UX tailored to specific devices or device capabilities
Make design, UX, content , and development choices optimal for
Mobile-first is an extension of "progressive enhancement" philosophy
Allow mobile UX priority to guide design decisions, promoting leaner, cleaner sites for all users
Similar to a layout grid, but specifically for creating consistent and visually pleasing typographic rhythm and flow.
All websites and applications should have predictable, meaningful, and unobtrusive form validation and client-side feedback
Currently, validation schemes are inconsistent, even within a single app, and have changed from project-to-project
Goal: Have a global approach, with documented standards, for simplicity and appropriateness of feedback
The what and the why.
Strong points:
Issues:
We have also used and may continue to use many single-purpose tools, to deliver features such as
Advantages:
Disadvantages:
We are evaluating the use of newer, all-in-one frameworks that can provide, among other things:
With some elements, particularly form inputs, we might debate the pros and cons of custom theming (i.e., branding) vs leaving styling to browsers (chrome)
Some form elements (e.g., selects/drop-downs), must be fundamentally reconstructed by a library in order to be themed
Can add complexity for development and appropriate validation feedback
These are two completely different tools that do the same thing
Not maintainable, or inherently in line with responsive design
If our goal is to develop responsive sites and applications, we propose that:
Establish and maintain a matrix of browser and device support, with categories such as (summarized from Yahoo's YUI library standards):
(Waiting for things to die)
Marketing and FED need to work together to develop standards and implement a living style guide
Both teams should be involved early in project planning, to evaluate the technical needs of design and the design requirements of development
Need to promote open and direct communication between Development and Marketing, while also acknowledging the need for BSAs to collaborate and remain informed


The 4130 chronograph calibre movement was conceived and assembled exclusively by Rolex in 2000 for the Cosmograph Daytona and incorporates just 290 components – far fewer than a standard chronograph – making it a much admired symphony of simplicity.
The Rolex Mentor and Protégé Arts Initiative was founded in 2002 to encourage talented individuals through a unique programme of one‑to‑one mentoring with a major figure in their artistic discipline. Over more than a decade, the Rolex Mentor and Protégé Arts Initiative creative community has expanded across continents and cultures, and now includes more than 80 major creative artists of different generations and backgrounds.
Rolex developed and patented the Cerachrom bezel for specific Professional models to ensure lasting beauty and functionality even after exposure to the most extreme conditions. Fashioned from extremely hard ceramic material, it is virtually impervious to scratches, and its colour is unaffected by ultraviolet rays. Its diamond‑polished surface presents an exceptional lustre. The engraved 24-hour graduations are coated with a thin layer of platinum..
After five years of research, Rolex created the blue Parachrom hairspring. Crafted from a paramagnetic alloy, it is unaffected by magnetic fields and up to 10 times more resistant to shocks. Historically, the unique blue colour of the hairspring has been a sign of prestige reserved for only the most accurate timepieces.
The Oyster Perpetual Yacht-Master II regatta chronograph is the first watch in the world equipped with a programmable countdown with a mechanical memory. This unique watchmaking complication consists of an innovative system of interaction between the movement and the case thanks to a rotatable ring command bezel designed and developed by Rolex. This regatta chronograph allows yachtsmen to cross the line as soon as possible after the starting gun.
The Rolex Deepsea was designed for extreme underwater exploration. An exclusive technical innovation, the Ringlock System, allows the case to withstand water pressure equivalent to a weight of some three tonnes on the crystal. The Rolex Deepsea can go deeper than all but a few purpose-built research submersibles, and more than 100 times beyond the depth that any human could physically survive.
Rolex presented a brand new innovative model, the Oyster Perpetual Sky-Dweller, a technological masterpiece intended for world travellers. In an impressive 42 mm case, it offers a dual time zone as intuitive to read as it is easy to use, as well as a particularly innovative annual calendar named Saros – in tribute to the astronomical phenomenon which inspired it – that requires only one date adjustment a year. To set its functions quickly and easily, it is also equipped with a new interface: the rotatable Ring Command bezel..
On March 26th, 2012, filmmaker and National Geographic Explorer in Residence James Cameron descended into the Mariana Trench, making the first solo dive into the deepest point on earth, and the only dive into the trench since the two-man Trieste expedition of 1960. Only one passenger was on both voyages: a Rolex watch.
The Oyster Perpetual Rolex Deepsea Challenge is an experimental diving watch certified waterproof up to 12,000 metres (39,370 feet), entirely designed and built by Rolex to resist the extreme pressure in the deepest reaches of the oceans. Setting the record for the deepest diving watch in the world.
The Oyster Perpetual Rolex Deepsea Challenge is an experimental diving watch certified waterproof up to 12,000 metres (39,370 feet), entirely designed and built by Rolex to resist the extreme pressure in the deepest reaches of the oceans. Setting the record for the deepest diving watch in the world.
In keeping with its history of close ties to motorsports, in 2013 Rolex entered into a long-term partnership with Formula 1® Racing as Official Timekeeper and Official Timepiece.


What Why and How?
The primary purpose of this website is to coordinate the 56 activites of IITG. Pretty much everything here is self explanatory. The main purpose is to maintain scores of online games played at LivePlayOK. The game log at the site is used to generate various game related statistics.LivePlayOK has detailed articles about how the game is played.
We play a sligthly different sytle and convention from the standard International Convention.
As the stats are auto generated, please do inform if you find any inconsistencies.
The algorithms for generating the statistics will be available on request.
Can I really forget about keeping scores?
Absolutely.
You should keep doing what you do best. Play 56. LivePlayOK generates the complete log for each game. It is as if the each game is video recorded. Any statistics from the game can be generated from the game logs.
Currently two scoring schemes have be implemented. One is the IAK method wherein each person's individial scored is tallied. The other is the fixed team scores when
the assumption is that the game has been played between two fixed pre defined teams. The details are provided in the scores


I am an applied scientist at Amazon Web Services in Berlin, Germany. I hold a PhD degree from Paderborn University under the supervision of Prof. Dr. Eric Bodden. My research is in the area of program analysis and its practical applications in the domains of security and privacy. In my PhD thesis, I developed techniques that bring the application of taint analysis for detecting security vulnerabilities closer to software developers.


{% extends "base.html" %} {% block title %}{% trans "Account not activated" %} - {{ block.super }}{% endblock %} {% block content %}
{% blocktrans %}It seems your {{ SITE_NAME }} website account has not been activated. You have to click on the link provided in the activation email which we have sent you.{% endblocktrans %}
{% trans "Feel free to contact us if you think something went wrong." %}
{% endblock %}


Categories: > {{b.category_name.en}}
Categories: > {{b.category_name.en}}
Categories: > {{b.category_name.en}}
Categories: > {{b.category_name.en}}
Categories: > {{b.category_name.en}}
Categories: > {{b.category_name.en}}
|
|
Listings that are missing a main image will not appear in search or browse until you fix the listing. Choose images that are clear, information-rich, and attractive.
Images must meet the following requirements:
- Products must fill at least 85% of the image. Images must show only the product that is for sale, with few or no props and with no logos, watermarks, or inset images. Images may only contain text that is a part of the product.
- Main images must have a pure white background, must be a photo (not a drawing), and must not contain excluded accessories.
- Images must be at least 1000 pixels on the longest side and at least 500 pixels on the shortest side to be zoom-able.
- Images must not exceed 10000 pixels on the longest side.
- JPEG is the preferred image format, but you also may use TIFF and GIF files.


ofPixels
ofPixels is an object for working with blocks of pixels, those pixels can be copied from an image that you've loaded, something that you've drawn using ofGraphics, or a ofVideoGrabber instance. You can create an image from pixels, using on ofPixels object like so:
ofPixels p;
ofLoadImage(p, "pathToImage.jpg");
ofPixels represents pixels data on the CPU as opposed to an ofTexture which represents pixel data on the GPU. They can easily be made inter-operational though:
ofTexture tex;
// do some stuff with t
ofPixels pix;
tex.readToPixels(pix); // now all the pixels from tex are in pix
You can access the pixels in an ofPixels object with the [] operator.
ofPixels pix;
// put some stuff in the pixels
int i = 0;
while( i < pix.size()) {
char c = pix[i];
i++;
}
- allocate(...)
- clear()
- crop(...)
- cropTo(...)
- getBitsPerChannel()
- getBitsPerPixel()
- getBytesPerChannel()
- getBytesPerPixel()
- getChannel(...)
- getColor(...)
- getHeight()
- getImageType()
- getNumChannels()
- getPixelIndex(...)
- getPixels()
- getWidth()
- isAllocated()
- mirror(...)
- mirrorTo(...)
- operator=(...)
- operator[](...)
- pasteInto(...)
- resize(...)
- resizeTo(...)
- rotate90(...)
- rotate90To(...)
- set(...)
- setChannel(...)
- setColor(...)
- setFromAlignedPixels(...)
- setFromExternalPixels(...)
- setFromPixels(...)
- setImageType(...)
- setNumChannels(...)
- size()
- swap(...)
- swapRgb()
ofPixels methods
clear()
void ofPixels_::clear()
This clears all the data from the ofPixels objects. After calling this you'll need to allocate the ofPixels object again to use it.
crop(...)
void ofPixels_::crop(int x, int y, int width, int height)
This crops the pixels to a new width and height. As a word of caution this reallocates memory and can be a bit expensive if done a lot.
cropTo(...)
void ofPixels_::cropTo(ofPixels_< PixelType > &toPix, int x, int y, int _width, int _height)
This crops the pixels into the ofPixels reference passed in by toPix. at the x and y and with the new width and height. As a word of caution this reallocates memory and can be a bit expensive if done a lot.
getBitsPerChannel()
int ofPixels_::getBitsPerChannel()
This is how large each channel of a pixels is, ofPixels objects that store pixel data as unsigned char are smaller than ofPixels objects that store pixel data as floats.
This returns bit, not bytes, so you'll probably see ofPixels
getBitsPerPixel()
int ofPixels_::getBitsPerPixel()
If you have RGB pixel data, this will return 3, if you have RGBA, you'll have 4, if you have grayscale, this will return 1.
getBytesPerChannel()
int ofPixels_::getBytesPerChannel()
This is how large each channel of a pixels is, ofPixels objects that store pixel data as unsigned char are smaller than ofPixels objects that store pixel data as floats.
This returns bytes, not bits, so you'll probably see ofPixels
getChannel(...)
ofPixels_ ofPixels_::getChannel(int channel)
This returns a single channel, for instance, the Red pixel values, from the ofPixels object, this gives you a grayscale representation of that one channel.
ofPixels rpix = pix.getChannel(0);
ofPixels gpix = pix.getChannel(1);
ofPixels bpix = pix.getChannel(2);
getColor(...)
ofColor_ ofPixels_::getColor(int x, int y)
This method returns the ofColor that the pixels contains at an x, y pair:
ofColor c = pix.getColor(mouseX, mouseY);
getImageType()
ofImageType ofPixels_::getImageType()
Returns what image type the ofPixels object is.
getNumChannels()
int ofPixels_::getNumChannels()
This returns the number of channels that the ofPixels object contains. RGB is 3 channels, RGBA is 4, and grayscale is 1.
getPixelIndex(...)
int ofPixels_::getPixelIndex(int x, int y)
This method tells you want pixel index an x, y pair would be at in the index, for instance:
ofColor yellow = ofColor::yellow;
int ind = pix.getPixelIndex(mouseX, mouseY);
pix.setPixel(ind, yellow);
getPixels()
const PixelType * ofPixels_::getPixels()
This returns a raw pointer to the pixel data. Changing this will change the value of the pixels in the ofPixels object. One way to inspect the values returns in this pointer would be:
unsigned char* pixPtr = pix.getPixels();
while(pixPtr) {
// for RGB pixels there will be 3 values for each pixel
// for RGBA pixels there will be 4
++pixPtr;
}
isAllocated()
bool ofPixels_::isAllocated()
Returns whether memory has been allocated for an ofPixels object or not. Many operations like copying pixels, etc, automatically allocate the memory needed, but it's sometimes good to check.
mirror(...)
void ofPixels_::mirror(bool vertically, bool horizontal)
This reflects the pixels across the vertical and/or horizontal axis.
mirrorTo(...)
void ofPixels_::mirrorTo(ofPixels_< PixelType > &dst, bool vertically, bool horizontal)
operator[](...)
PixelType & ofPixels_::operator
Provides access to each channel of each pixel. If you have RGB pixel data, then you'll have 3 values for each pixel, if you have RGBA, you'll have 4.
pasteInto(...)
bool ofPixels_::pasteInto(ofPixels_< PixelType > &dst, int x, int y)
This pastes the ofPixels object into another ofPixels object at the specified index, copying data from the ofPixels that the method is being called on to the ofPixels object at &dst. If the data being copied doesn't fit into the dst then the image is cropped.
ofLoadImage(footballPixels, "two.jpg");
ofLoadImage(fujiPixels, "one.jpg");
fujiTex.loadData(footballPixels);
footballTex.loadData(fujiPixels);
footballPixels.pasteInto(fujiPixels, 150, 100); // now fujiPixels is altered
mixtureTex.loadData(fujiPixels);
Drawing the three textures here you can see the ball cropped into the mountain:
resize(...)
bool ofPixels_::resize(int dstWidth, int dstHeight, ofInterpolationMethod interpMethod=OF_INTERPOLATE_NEAREST_NEIGHBOR)
This resizes the ofPixels instance to the dstHeight and dstWidth. The options for the interpolation methods are as follows: OF_INTERPOLATE_NEAREST_NEIGHBOR =1 OF_INTERPOLATE_BILINEAR =2 OF_INTERPOLATE_BICUBIC =3
resizeTo(...)
bool ofPixels_::resizeTo(ofPixels_< PixelType > &dst, ofInterpolationMethod interpMethod=OF_INTERPOLATE_NEAREST_NEIGHBOR)
This resizes the ofPixels instance to the size of the ofPixels object passed in dst. The options for the interpolation methods are as follows: OF_INTERPOLATE_NEAREST_NEIGHBOR =1 OF_INTERPOLATE_BILINEAR =2 OF_INTERPOLATE_BICUBIC =3
rotate90(...)
void ofPixels_::rotate90(int nClockwiseRotations)
crop to a new width and height, this reallocates memory.
setChannel(...)
void ofPixels_::setChannel(int channel, const ofPixels_< PixelType > channelPixels)
This sets all the pixel data for a single channel, for instance, the Red pixel values, from an ofPixels object assumed to be a grayscale representation of the data that should go into that one channel.
setColor(...)
void ofPixels_::setColor(int x, int y, ofColor_< PixelType > color)
Sets the color of the pixel at the x,y location.
setFromAlignedPixels(...)
void ofPixels_::setFromAlignedPixels(const PixelType *newPixels, int width, int height, int channels, int stride)
setFromExternalPixels(...)
void ofPixels_::setFromExternalPixels(PixelType *newPixels, int w, int h, int channels)
setFromPixels(...)
void ofPixels_::setFromPixels(const PixelType *newPixels, int w, int h, int channels)
setFromPixels(...)
void ofPixels_::setFromPixels(const PixelType *newPixels, int w, int h, ofImageType type)
size()
int ofPixels_::size()
This gives you the number of values that the ofPixels object contains, so an RGB data 400x400 would be 480,000, whereas RGBA data of the same dimensions would be 640,000.


Our goal is to deliver a lean, lightweight set of Angular-based UI elements that implement the material design
specification for use in Angular single-page applications (SPAs).
Learn how to contribute to Angular Material
AngularFire
AngularFire is the officially supported Angular binding for Firebase.
Firebase is a full backend so you don't need servers to build your Angular app.
Learn how to contribute to AngularFire


W. Brandon Martin developed NameTaggle to help organizations connect and engage their members. He is a freelance developer and information security craftsman.


FACILITY dESIGN: TINTE CLOCK
Background Research
“If parents can help train their children to sleep at certain times, they're usually more successful at making sure kids are getting enough sleep every night. When this happens, kids usually have a much easier time getting up in the morning,”says Dr. Afzal.
Give your child a regular schedule for the afternoon and evening. Try to set times for certain tasks like finishing homework, eating dinner, and free time before bed.
- Limit your child's electronic device use before bed.
- Set a firm bedtime. Being in bed with lights out at the same time each evening is key to developing a healthy sleep routine.
- If your child is having trouble sleeping or getting up, don't panic! With the right routine, you can have them up and ready to meet the day head-on in no time.
problem statement
HMW design a bedtime rituals that support better sleep for kids so it can be easier for them to get up the next day?
How to use
DESIGN ANALYSIS
3 modes on the clock
Kids can set the clock by themselves, there are 3 modes: What's the time mode/ Art time mode/ Set my clock mode, which can be switched by rolling the arrow on the top.
1. What's the time mode would light up the key points and the strings in the background.
2. Art time mode provides 3 levels of lighting on each circle pixel for kids to create their own art work! Press the circle pixel for the first time, it would be low light, press the second time would make it become high light!
3. Kids can be motivated to get to bed in the night and get up in the morning by setting their own clock. There would be dark light in the background and successful setting sound to guide kids how to set the clock correctly.
FEEDBACK
- Show the physical interaction in a digital way
- How to get users prepared to use
- Design details: the color choices, styles…
- There could be an interactive action taken place in the mode 1 (what’s the time) and it would smoothly change to the Art mode.
- Templates could be useful in the Art mode, start with some circles or simple graphics may be better than a blank canvas
next step
• Do user research with the target users
• Rethink about the size of this clock


Dig through our cat library to found out amazing things you can do with your kitty.
Get feedback on your cat from a community of loving pet owners on our online bulletin board system.
 Although I have a lot of patience for writing things about cats, perhaps this might be enough body copy to make this section of text look filled out.
This and other tips can be found in our newsletter, amazing right?
Sign up and get spammed with cats every day. We have no unsubscribe button!


---
layout: archive
---
{% include card.html title="Objective" decal-img="objective.svg" content="objective.md" %}
{% include card.html title="Experience" markdown-content="experience.md" %}
{% include card.html title="Education" markdown-content="education.md" %}
{% include card.html title="Projects" markdown-content="projects.md" %}
{% include card.html title="Skills" markdown-content="skills.md"%}


X
Director: Fred Wolf / Producer: Amy Kim / Commercial
Innovative Artists
1505 10th St, Santa Monica, CA 90401
310-656-5153
Jason Garber - Film & Television
<EMAIL_ADDRESS><EMAIL_ADDRESS>X
Quantum Break
Director: Ben Ketai / Producers: Amy Kim and Jaime Burke / Series / Shot on Alexa and Panavision Primo’s
Drunk Parents
Comedy Staring Alec Baldwin and Salma Hayek / Director: Fred Wolf / Producers: Robert Ogden Barnum and Aaron Gilbert / Feature Film / Trailer Coming Soon
Beneath
Director: Ben Ketai / Producers: Nick Phillips and Kelly Wagner / Shot on Alexa and Panavision Primo’s
Feature / Winner Best Cinematography at Screamfest
Joe Dirt 2
Director: Fred Wolf / Producers: Amy Kim and Jaime Burke / Shot on Red Epic and Panavision Ultra Speed’s / Feature
Chosen
Director: Ben Ketai / Producers: Amy Kim and Jaime Burke / Shot on Alexa and Panavision Primo’s / Series
Sequestered
Directors: Kevin Tancheron and Shawn Ku / Producers: Amy Kim and Jaime Burke / Shot on Red Dragon and Super Speeds / Series
Half Life
Director: Dagen Merrill / Producer: Jaime Burke / Shot on Red Epic and Master Primes / Feature
Finding Harmony
Director: Dagen Merrill / Producers: Jason Vu, Jeffery Patterson and Barry Walker / Shot on Red Epic and Cooke S4’s / Feature
PetSmart
Director: Dagen Merrill / Producer: Cameron Trejo / Shot on Alexa and Zeiss Master Primes / Commercial
PetSmart
Director: Dagen Merrill / Producer: Cameron Trejo / Shot on Alexa and Zeiss Master Primes / Commercial
eHarmony
Director: Bruce Del Castillo / Producer: Chris Jaros / Commercial
Quiznos
Directors: Adam Forstadt and Paul Hogan / Commercial
After starting in Commercials and Music Videos Timothy A. Burton made an explosive transition into narrative projects including television shows Chosen and Sequestered for Sony, and Quantum Break for Microsoft. His feature film resume includes Beneath, for which he won Best Cinematography at Screamfest, and Joe Dirt 2: Beautiful Loser a Sony film. These, including the upcoming thriller Pet, garnered him the attention of Variety Magazines 2015 “Up Next” Cinematographers to watch. Tim rounded out 2015 with the independent film Big Bear starring Pablo Schreiber and Adam Brody and has just returned from New York where he completed principal photography for Drunk Parents starring Alec Baldwin, Salma Hayek and Will Ferrell and was directed by Fred Wolf.


To Do List
This application tracks a simple list of work items and whether they are completed or not. It is being written as part of an interview for Democracy Works by Chris Roeder in April 2016.


I can remember the first time I realized I was fascinated with technology, when my father and I built my first computer together. We had spent weeks researching, planning and a few hours assembling to see my rag-tag collection of components come together to make a machine that in my mind, could do anything. Ever since then, I've immersed myself in the world of technology by taking roles as an IT intern in stunningly large companies to developing a simple phone app in my bedroom. As somebody who has yet to graduate, I hope to continue my exploration of that world and to become a better consumer and developer to prepare myself for the fast-paced, ever-changing world I will soon be working in.


I'm a Web Developer who loves using clean and efficient code to create an amazing product.
Father of 3 who is a recent graduate with a BS in Information Technology. Everyday I seek to learn new things that I can apply not only in my work but also at home with my kids. I love crafting unique solutions to challenging problems.
My wife and I are essential oil freaks with the mindset to be healthy while sharing it with those around us.
View ResumeA website created with React making API calls to the Nasa APOD API to retrieve the picture of the day for any day that has passed.


jacobsHack! 2019 Schedule
| Saturday | ||||
|---|---|---|---|---|
| Start | End | Event & Description | ||
| 08:30 | 09:30 | Arrival/Registration | Register to the hackathon and get your swag! Make sure to have your ID and Ticket ready. | |
| 10:00 | 10:30 | Welcome Address/Opening Ceremony | Introductory talk. Meet our sponsors, the team and discover the prizes. | |
| 10:40 | 11:00 | Activity: Team Building | Looking for a team or new teammates? | |
| 11:00 | 11:45 | Tech Talks | Looking for some inspiration? | |
| 12:00 | Hacking Starts | Ready. Set. GO! | ||
| 12:30 | 13:30 | Lunch | Enjoy our first meal! | |
| 18:30 | 19:30 | Dinner |
| Sunday | ||||
|---|---|---|---|---|
| Start | End | Event & Description | ||
| 00:00 | 01:00 | Midnight Snack | Feeling hungry yet? | |
| 08:00 | 10:00 | Breakfast | Come get some energizing breakfast | |
| 11:00 | Hacking Ends | SUBMIT YOUR PROJECT TO DEVPOST BEFORE IT'S TOO LATE!! | ||
| 12:30 | 13:30 | Lunch | Enjoy the last meal | |
| 13:30 | 15:00 | Hack Demos/Judging | It's demo time :) | |
| 15:00 | 17:00 | Closing Ceremony | And the winners are... Come watch the finalists and winners! |


--- title: External data keywords: fastai sidebar: home_sidebar summary: "Helper functions to download the fastai datasets" description: "Helper functions to download the fastai datasets" nb_path: "nbs/04_data.external.ipynb" ---
A complete list of datasets that are available by default isnide the library are:
Main datasets:
IMDB: The full IMDB sentiment analysis dataset.
IMDB_SAMPLE: A sample of the full IMDB sentiment analysis dataset.
Kaggle competition datasets:
Image Classification datasets:
NLP datasets:
Image localization datasets:
Audio classification:
Medical Imaging datasets:
Pretrained models:
To download any of the datasets or pretrained weights, simply run untar_data
by passing any dataset name mentioned above like so:
path = untar_data(URLs.PETS)
path.ls()
> > (#7393) [Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/keeshond_34.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/Siamese_178.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/german_shorthaired_94.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/Abyssinian_92.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/basset_hound_111.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/Russian_Blue_194.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/staffordshire_bull_terrier_91.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/Persian_69.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/english_setter_33.jpg'),Path('/home/ubuntu/.fastai/data/oxford-iiit-pet/images/Russian_Blue_155.jpg')...]
To download model pretrained weights:```python path = untar_data(URLs.PETS) path.ls()
(#2) [Path('/home/ubuntu/.fastai/data/wt103-bwd/itos_wt103.pkl'),Path('/home/ubuntu/.fastai/data/wt103-bwd/lstm_bwd.pth')] ```
If a config file doesn't exist already, it is always created at ~/.fastai/config.yml
location by default whenever an instance of the Config
class is created. Here is a quick example to explain:
config_file = Path("~/.fastai/config.yml").expanduser()
if config_file.exists(): os.remove(config_file)
assert not config_file.exists()
config = Config()
assert config_file.exists()
The config is now available as config.d
:
config.d
As can be seen, this is a basic config file that consists of data_path
, model_path
, storage_path
and archive_path
.
All future downloads occur at the paths defined in the config file based on the type of download. For example, all future fastai datasets are downloaded to the data_path
while all pretrained model weights are download to model_path
unless the default download location is updated.
Please note that it is possible to update the default path locations in the config file. Let's first create a backup of the config file, then update the config to show the changes and re update the new config with the backup file.
if config_file.exists(): shutil.move(config_file, config_bak)
config['archive_path'] = Path(".")
config.save()
config = Config()
config.d
The archive_path
has been updated to "."
. Now let's remove any updates we made to Config file that we made for the purpose of this example.
if config_bak.exists(): shutil.move(config_bak, config_file)
config = Config()
config.d
The default local path is at ~/.fastai/archive/
but this can be updated by passing a different c_key
. Note: c_key
should be one of 'archive_path', 'data_archive_path', 'data_path', 'model_path', 'storage_path'
.
url = URLs.PETS
local_path = URLs.path(url)
test_eq(local_path.parent, Config()['archive']);
local_path
local_path = URLs.path(url, c_key='model')
test_eq(local_path.parent, Config()['model'])
local_path
The download_url
is a very handy function inside fastai! This function can be used to download any file from the internet to a location passed by dest
argument of the function. It should not be confused, that this function can only be used to download fastai-files. That couldn't be further away from the truth. As an example, let's download the pets dataset from the actual source file:
fname = Path("./dog.jpg")
if fname.exists(): os.remove(fname)
url = "https://i.insider.com/569fdd9ac08a80bd448b7138?width=1100&format=jpeg&auto=webp"
download_url(url, fname)
assert fname.exists()
Let's confirm that the file was indeed downloaded correctly.
from PIL import Image
im = Image.open(fname)
plt.imshow(im);
As can be seen, the file has been downloaded to the local path provided in dest
argument. Calling the function again doesn't trigger a download since the file is already there. This can be confirmed by checking that the last modified time of the file that is downloaded doesn't get updated.
if fname.exists(): last_modified_time = os.path.getmtime(fname)
download_url(url, fname)
test_eq(os.path.getmtime(fname), last_modified_time)
if fname.exists(): os.remove(fname)
We can also use the download_url
function to download the pet's dataset straight from the source by simply passing https://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz
in url
.
The download_data
is a convenience function and a wrapper outside download_url
to download fastai files to the appropriate local path based on the c_key
.
If fname
is None, it will default to the archive folder you have in your config file (or data, model if you specify a different c_key
) followed by the last part of the url: for instance URLs.MNIST_SAMPLE
is http://files.fast.ai/data/examples/mnist_sample.tgz
and the default value for fname
will be ~/.fastai/archive/mnist_sample.tgz
.
If force_download=True
, the file is alwayd downloaded. Otherwise, it's only when the file doesn't exists that the download is triggered.
_get_check(URLs.PASCAL_2007),_get_check(URLs.PASCAL_2012)
file_extract
is used by default in untar_data
to decompress the downloaded file.
let's rename the untar/unzip data if dest name is different from fname
untar_data
is a very powerful convenience function to download files from url
to dest
. The url
can be a default url
from the URLs
class or a custom url. If dest
is not passed, files are downloaded at the default_dest
which defaults to ~/.fastai/data/
.
This convenience function extracts the downloaded files to dest
by default. In order, to simply download the files without extracting, pass the noop
function as extract_func
.
Note, it is also possible to pass a custom extract_func
to untar_data
if the filetype doesn't end with .tgz
or .zip
. The gzip
and zip
files are supported by default and there is no need to pass custom extract_func
for these type of files.
Internally, if files are not available at fname
location already which defaults to ~/.fastai/archive/
, the files get downloaded at ~/.fastai/archive
and are then extracted at dest
location. If no dest
is passed the default_dest
to download the files is ~/.fastai/data
. If files are already available at the fname
location but not available then a symbolic link is created for each file from fname
location to dest
.
Also, if force_download
is set to True
, files are re downloaded even if they exist.
from tempfile import TemporaryDirectory
test_eq(untar_data(URLs.MNIST_SAMPLE), config.data/'mnist_sample')
with TemporaryDirectory() as d:
d = Path(d)
dest = untar_data(URLs.MNIST_TINY, fname='mnist_tiny.tgz', dest=d, force_download=True)
assert Path('mnist_tiny.tgz').exists()
assert (d/'mnist_tiny').exists()
os.unlink('mnist_tiny.tgz')
#Test c_key
tst_model = config.model/'mnist_sample'
test_eq(untar_data(URLs.MNIST_SAMPLE, c_key='model'), tst_model)
assert not tst_model.with_suffix('.tgz').exists() #Archive wasn't downloaded in the models path
assert (config.archive/'mnist_sample.tgz').exists() #Archive was downloaded there
shutil.rmtree(tst_model)
Sometimes the extracted folder does not have the same name as the downloaded file.
with TemporaryDirectory() as d:
d = Path(d)
untar_data(URLs.MNIST_TINY, fname='mnist_tiny.tgz', dest=d, force_download=True)
Path('mnist_tiny.tgz').rename('nims_tini.tgz')
p = Path('nims_tini.tgz')
dest = Path('nims_tini')
assert p.exists()
file_extract(p, dest.parent)
rename_extracted(dest)
p.unlink()
shutil.rmtree(dest)


Porting to the new SoupSessionPorting to the new SoupSession — Notes on porting from SoupSessionAsync and SoupSessionSync to SoupSession |
As of libsoup 2.42, SoupSession is no longer an abstract class, and the base SoupSession class is now preferred over its traditional subclasses, SoupSessionAsync and SoupSessionSync.
There are several changes in behavior between the old and new sessions to be aware of.
The new SoupSession has different (and hopefully better) defaults than SoupSessionAsync and SoupSessionSync:
The system TLS/SSL certificate database is used by default to
validate https certificates, and sites with invalid certificates
will refuse to load with a
SOUP_STATUS_SSL_FAILED
error.
You can still override the CA database as before, by setting the "ssl-ca-file" property, although the "tls-database" property is preferred, since it allows you to do proper error handling.
If you want to accept all certificates, set
"ssl-strict" to
FALSE
. Note that libsoup will still check
certificates, it will just continue with the HTTP request even
if the certificate fails to validate. You can use
soup_message_get_https_status()
to look at the certificate after the fact.
The "timeout" and "idle-timeout" properties both default to 60 seconds.
The
"http-aliases"
property defaults to NULL
, meaning that URI
schemes like "webcal
" and
"dav
" (and "ftp
") are not
considered to be aliases for "http
", and so
libsoup will not accept requests for such URIs, and will not
follow redirects to such URIs.
The new
"proxy-resolver"
property is now initialized to the default
GProxyResolver,
meaning that it will automatically use the user's system proxy
configuration. This replaces the use of the
SoupProxyResolverDefault,
session feature in earlier releases. You can set this property to
NULL
if you don't want to use proxies, and the
"proxy-uri"
property still works if you want to use a single proxy for all requests.
Every session gets a SoupContentDecoder attached to it by default, meaning that it will automatically handle (and request) "gzip"- and "deflate"-encoded response bodies.
If you are using NTLM authentication, the new SoupSession behaves slightly differently from the old session types.
First, the deprecated SOUP_SESSION_USE_NTLM
property is no longer supported. If you want to add support for NTLM
to a session, call soup_session_add_feature_by_type()
,
passing SOUP_TYPE_AUTH_NTLM
.
Second, with the old session types, enabling NTLM would cause all
(otherwise-unauthenticated) requests to be sent with an NTLM request
in the Authorization
header. That is, libsoup would
assume that all servers supported NTLM, and would attempt to begin
negotiating NTLM authentication before the server ever returned a 401
response. With the plain SoupSession, this no longer
happens. If you want the old behavior, you need to call soup_auth_manager_use_auth()
for each host to "preload" the NTLM authentication:
1 2 3 4 5 6 7 8 9 10 |
SoupAuthManager *auth_manager; SoupAuth *auth; SoupURI *uri; auth_manager = SOUP_AUTH_MANAGER (soup_session_get_feature (session, SOUP_TYPE_AUTH_MANAGER)); auth = g_object_new (SOUP_TYPE_AUTH_NTLM, NULL); uri = soup_uri_new ("http://ntlm-using-host.example.com/"); soup_auth_manager_use_auth (auth_manager, uri, auth); g_object_unref (auth); soup_uri_free (auth); |
SoupSessionAsync always uses asynchronous I/O, and
SoupSessionSync always uses blocking I/O, regardless of
the operation. In the new SoupSession, soup_session_queue_message()
uses asynchronous I/O (like SoupSessionAsync), and soup_session_send_message()
uses blocking I/O (like SoupSessionSync). There is no API
on the plain SoupSession that simulates the effect of
calling soup_session_send_message()
on a
SoupSessionAsync (ie, running the main loop internally),
or of calling soup_session_queue_message()
on a
SoupSessionSync (ie, automatically sending the request in
another thread).
As compared to SoupSessionAsync, SoupSession behaves more like gio with respect to asynchronous I/O.
In particular, the "async-context" and "use-thread-context" properties are now effectively unused, and the session always queues asynchronous requests in the GMainContext that was is the thread default when the asynchronous operation is started. Session bookkeeping tasks (like closing idle connections) happen in the context that was thread default when the session was created.
Additionally, soup_session_cancel_message()
now acts asynchronously when you cancel an asynchronous request;
rather than having the request's callback be called from inside
soup_session_cancel_message()
, it just gets called
when you need return to the main loop.


I mean that in the best way possible; and it's part of a definite upward trend
for the industry. I think it's fairly uncontroversial to say that we were all generally
pretty high on the industry's output in 2015. However, 2015 was dominated by handful of
great AAA products. Every year end list looked exactly alike, and it left a good year
feeling fairly stagnant.
This year is undeniably different. While the AAA output this year was well-received,
it was the outstanding quality and abundance of games produced by talented independent
development studios that made 2016 shine. There were so many great independent games in 2016
that I'd be legitimately surprised to see any two top ten lists that were exactly the same.
In that vein, I wanted to share my ten favorite games of last year with our dedicated
Pizza for Breakfast listeners, a grand total of
two of which were produced by AAA development studios.
Anyone who has ever worked in food service of any stripe knows the harrowing nature of the dinner rush. In
Ghost Town Games' Overcooked you and up to three of your friends can get a condensed taste of that
unique fear as you dash around a too-cramped kitchen, often filled with environmental obstacles, and yell at
each other because there is just too much to do and not enough manpower to handle it.  It's fun, I promise. The last few years have either enjoyed or suffered a deluge of local
competetive and local cooperative multiplayer games, depending on who you ask. While I've personally enjoyed most of
the offerings that allowed my friends and I to get together and yell at each other, few really stuck around as mainstays.
I can't say that Overcooked will be included on that small list in the long run, but it's style, focused gameplay,
and dedication to making the game fun and playable at any player number made me care about a local co-op game
in the year 2016, which I honestly would have thought impossible.
INSIDE is Danish independent studio Playdead's follow-up to their 2010 debut, Limbo.
it is important to note this up front, as anyone who has played Playdead's previous offering will notice
many similarities between the beautifully silhouetted world of Limbo and the starkly but stunningly
constructed world of INSIDE.  The game's "story", as it
exists, is portrayed only through environmental storytelling that occurs inbetween and during the platforming
puzzles that make up the majority of the game. Yet, even though there are few explicitly expository moments
in the game, it still portrays a narrative that in turns thrilled and shocked me, culminating in what might
be the most powerful scene in any game I played this year. At only three to five hours long, I'm not sure
you can afford to not have played INSIDE.
As a long time fan of the Idle Thumbs podcast, hosted by two of the co-founders of Campo Santo, I
had been anticipating Campo Santo's first project since they announced their founding back in 2013. With the
pedigree that they brought with them from working on Telltale Games' most successful products, it should come
as no surprise that Firewatch is a thrilling narrative of a type that we rarely see in video games.
Playing as Henry, a newly employed fire lookout in a national park, you have to explore the wilderness surrounding
your tower in order to uncover the answers to a mystery that starts with the ransacking of your new watchtower home.
Your only other human interaction comes from the radio conversations you have with fellow lookout, Delilah. That and
the occasional shadowy figure you see in the distance. Although you are never at any real danger in Firewatch,
the game ratchets up the tension to a point that it can be physically uncomfortable to play. Although the story
falters in a final act twist that feels unearned, Firewatch is still an aesthetic masterpiece with dialogue
that is unmatched in the medium.
It's not entirely uncommon, even in this modern age of generally great voice acting, that game developers choose to have
their games be unvoiced. It's not even extremely rare that a game go without dialogue, written or voiced, entirely. It is,
however, remarkable when a game chooses to do both of these things while also purporting itself to be a narrative adventure
game. That is where we find ourselves with Virginia. The game plays like, and shares many similarities with, 90s
supernatural investigation shows like The X-Files or Twin Peaks -- where something feels wrong, just below
the surface, but the protagonists can never quite reach that which was never meant to be understood. With a visual style so
sharp it could kill, Virginia is nothing if not confident in what it is attempting to do. You walk down a hallway,
away from a crime scene, as music swells behind you. The game doesn't wait for you to hit the exit door, but instead, as the music
swells to a crescendo, smash cut to you and your partner in a car, driving down a dark road.
That being said, Virginia is a game that has slipped on and off of this list multiple times since I played it.
It is, ultimately, a narrative game with a narrative that, like Firewatch, fails in the last act. And it is perhaps
even less interactive than Firewatch or other narrative games of its ilk. Still, in the slow moments of the year, I still
find myself thinking of Virginia, and that has to mean something.
Stardew Valley is a game that I think will top a lot of Game of the Year lists around the internet, and it absolutely
deserves it. If you have ever in your life played a Harvest Moon or Rune Factory game, you know exactly what you're
getting with Stardew Valley. The game itself does little new to expand on many of the concepts found in those older farming
lifestyle sims, but instead takes all the best parts from all of them, throws in a dash of Animal Crossing, and polishes every
aspect to a mirror sheen. In Stardew Valley, you leave your city life behind to take on the tasks of planting crops, raising
animals, prospecting mines, making friends, and finding love in a tiny rural village. You'll harvest, fish, dig, build, and woo your way
to whatever goal you choose to set for yourself; waking up every new morning intending to just do your daily chores, but instead finding
something new and exciting to pursue in addition. In 2016, I needed something unrelentingly positive to pour my time into, and Stardew
Valley was there for me each and every time. Made largely by one man, Stardew Valley will go down as one of the best independent
games in the history of the medium.
The first of two AAA, big studio games that made it onto my final list this year is Overwatch, which might be most
easily described as Blizzard's perfection of the class-based FPS genre. Not that Overwatch needs any introduction;
if you play video games or even just exist in certain corners of the internet, the game has been impossible to avoid this year.
However, not content to let the game just ride on being "the best this genre has ever seen", let me attempt to specify a few easily
missed aspects that make the game as great as it is. First, Blizzard have created characters with such huge personalities that the
fact that the game lacks any sort of explicit story beats is almost entirely forgettable. The heroes (and villains) of Overwatch
are each wonderful in their own little ways, showing Blizzard's generally good character design skills at the peak of their prowess;
and they've taken the internet by storm. But it's not just the characterization that sells the game. The gameplay is best-in-class,
and has dozens of little tweaks to the traditional class-based FPS design that alleviate many of the genre's past failings -- not least
of which is the fact that Blizzard doesn't focus on the traditional "kill-death ratio" that many FPS games do, but instead highlight
all the good things you did over the course of a match. It's the perfect amount of end-of-game positivity needed to make you want to
queue for "just one more round".
SUPERHOT is a first-person shooter, although you might instead call it a first-person puzzle game, where the puzzle is men
with guns, and you solve it by shooting them and not getting shot. The kicker is, though, that in SUPERHOT time only moves
when you move. That means that you will see every single bullet flying in towards you, as a man with a katana approaches from your right,
and all you have within reach is an empty beer bottle. What do you do? The answer, of course, is grab the bottle, spin to the left to avoid
the first bullet, toss the bottle at the man with the katana to stagger him, dash back to the right to avoid the second bullet, knock out the man
with the katana, grab it from his hands, fling it at one of the shooters, run down the hallway while dodging the remaining shooter's bullets,
punch him in the face, take his gun, shoot him in the head, and then toss the empty gun at the wall. All of that took 5 minutes and 10 tries
of painstaking slow-motion planning to get right, but now you get to watch it in full speed, while the game screams at you: "SUPER, HOT, SUPER,
HOT." If you have to know one thing about SUPERHOT, know that it has changed the way developers are going to have to think about
first-person shooters from now on. That sounds hyperbolic, but in five years every big AAA shooter is going to have some trace of the
SUPERHOT DNA.
In many ways, there is no possible universe in which Final Fantasy XV should have been a good game. Announced ten years ago,
under a different title and for a different platform, the game had seemingly no chance of saving this franchise that has been slowly dying
for 10 to 20 years, depending on who you ask. And yet as it came back into the limelight over the last couple of years, I allowed myself to
have my hopes raised. As they announced that Florence and the Machine would be doing the theme song for the game, and there would be a
full-length CGI movie tie-in, and that they were releasing a six-episode anime miniseries leading up to the game's release, I couldn't tell
how to feel. And then November came, and we all sat down to play Final Fantasy XV, and not only was it better than I expected, but
it is in some ways better than I could have hoped. (I defended the much-maligned Final Fantasy XIII series, and adored the hell out
of Final Fantasy XIV at a time in which I didn't think I could care about MMORPGs anymore, so maybe I'm a poor litmus test for this
particular instance.) Sure, it's not a perfect game. There are loads of well-known issues, particularly with the sparsity of exposition for
much of the game's plot. Yet it still feels good, and is fun to play, and I love the cast of boys, just going on a road trip to try to get
married and maybe save the world. With more patches, it's only getting better, and may be a big 2017 hit for people who pick it up cheaply
in the upcoming year. I sure hope so. I'd like to live in a world where Final Fantasy games are good again.
It has been a rough couple of years for rhythm games. Once upon a time the Guitar Heroes and Rock Bands of the world
seemed like they had no way of slowing down. They had reinvigorated rhythm games and turned into household names for games that your parents
have heard of, right next to Mario and Wii Sports. And then they died. The market was saturated and semi-annual releases
became too much and we got tired of owning dozens of plastic instruments. When they tried to make a return last year, they landed like a wet fart.
All of this is to say that Thumper could probably not have landed in an environment that was more hostile to rhythm games. In some ways,
then, it makes sense that Thumper responds to the player by being as hostile and opressive as possible. In Thumper you play a
shiny, fragile robotic bug, flying down a track towards an abstract, monstrous entity, slamming into walls and crashing through obstacles in time
to a bass-heavy industrial background song. It looks and feels like you're inside the cover-art of some new wave (or perhaps nu-metal) cover art.
It is mentally tasking, physically demanding, and opressively harmful, and I love each and every minute that I spend smashing myself against it.
Drool is a studio comprised of two ex-Harmonix developers, and their sense of love for rhythm games shines through in Thumper in a way
that makes me want to love the genre all over again.
Nothing, at all, consumed my time and my thoughts in 2016 like The Witness did. The game came out right at the beginning of the year
and has commanded my attention, in some form, ever since. The Witness is a puzzle game, and may be the greatest puzzle game that I have
ever played -- and I really like puzzle games. The game has only one mechanic through which to interact with its puzzles and its world,
and that is through tracing lines on mazes. That's it. You start your cursor at a round starting point and end at a straight ending point. That is
all the interaction you can have with the world. It should speak volumes, then, when I tell you that Jonathan Blow and Thekla Inc. have found a way
to create hundreds of puzzles (both obvious and secret) that utilize that mechanic over the course of dozens of hours that made me keep learning
new and exciting ways. As the game goes on, more and more rules are piled onto the simple maze puzzles, often in ways that directly contradict each
other, all culminating in what is probably one of the most exciting "boss battles" in the history of video games. The game lacks an explicit narrative
(and some might say it lacks even an implicit narrative), which definitely detracts from what could have been my favorite game of all time.
Instead, the game expresses itself through intro-level philosophy, ultimately conveying a theme and a thesis that I don't think I can even begin to
agree with -- but I appreciate that it attempted to say something at all.


Constructor
Board
Code
new CanvasBoard({
canvasId: "ex1",
canvasWidth: 510,
canvasHeight: 350,
blocksInARow: 10,
blocksInAColumn: 6
});
Description
General 10x6 board with border, labels and default colors.
Board
Code
new CanvasBoard({
canvasId: "ex2",
canvasSize: 510,
goGame: true,
blocksInARow: 19,
lightSquaresColor: "#f2b06d",
borderSize: 0
});
Description
19x19 board for Go game with custom background color and no border.
Board
Code
new CanvasBoard({
canvasId: "ex3",
canvasSize: 510,
blocksInARow: 91,
blocksMargin: 1,
marginColor: "#666",
lightSquaresColor: "#EFEFEF",
darkSquaresColor: "#EFEFEF",
borderSize: 0
});
Description
91x91 grid with margin between blocks of 1 pixel dimension and "#666" as margin color.
Board
Code
new CanvasBoard({
canvasId: "ex4",
canvasSize: 510,
goGame: true,
blocksInARow: 13,
animationOfPieces: false,
actionsOnPieces: false,
lightSquaresColor: "#f2b06d",
position: "www10/bbwww1w6/b1bwbwwb5/1bbbbbww5/4bwbb5/4bwwbw4/2b2bww5/5bw6/5bbw5/4bwbb5/4bwwbw4/1bbbbbww5/bbwww1w6",
borderColor: "#f2b06d",
coords: false
});
Description
13x13 Go board with starting position and border, without animation nor pieces interaction.
Board
Code
new CanvasBoard({
canvasId: "ex5",
canvasSize: 510,
borderColor: "#EFEFEF",
labelsColor: "#000",
highlighterColor: "#000",
position: "1w1w1w1w/w1w1w1w1/1w1w1w1w/8/8/b1b1b1b1/1b1b1b1b/b1b1b1b1",
piecesFiles: {
b: "checkers_black",
w: "checkers_white"
}
});
Description
12x12 checkers board with pieces interaction (no game logic) and animations.
Empty string to clear the board:
.getPosition()
Board
Code
var board10 = new CanvasBoard({
canvasId: "ex10",
canvasSize: 510,
highlighterColor: "#000",
piecesFiles: {
p: "pb", r: "rb", n: "nb", b: "bb", q: "qb", k: "kb", P: "pw", R: "rw", N: "nw", B: "bw", Q: "qw", K: "kw"
},
position: "2rq2k1/5pp1/4b1rp/1pBpP3/2pP1R2/P3QR1P/6PK/8"
});
board10.getPosition()
Try it
Move pieces on board to change position:
.move
Board
Code
var board11 = new CanvasBoard({
canvasId: "ex11",
canvasSize: 510,
goGame: true,
blocksInARow: 13,
lightSquaresColor: "#f2b06d",
position: "www10/bbwww1w6/b1bwbwwb5/1bbbbbww5/4bwbb5/4bwwbw4/2b2bww5/5bw6/5bbw5/4bwbb5/4bwwbw4/1bbbbbww5/bbwww1w6",
borderColor: "#f2b06d",
labelsColor: "333",
borderSize: 27
});
board11.move(from, to)
Try it
From: To:
.removePieceFromPosition
Board
Code
var board12 = new CanvasBoard({
canvasId: "ex10",
canvasSize: 510,
highlighterColor: "#000",
piecesFiles: {
p: "pb", r: "rb", n: "nb", b: "bb", q: "qb", k: "kb", P: "pw", R: "rw", N: "nw", B: "bw", Q: "qw", K: "kw"
},
position: "2rq2k1/5pp1/4b1rp/1pBpP3/2pP1R2/P3QR1P/6PK/8"
});
board12.removePieceFromPosition(position)
Try it
Position:
hooks
Board
Code
new CanvasBoard({
canvasId: "ex13",
canvasSize: 510,
highlighterColor: "#000",
animationOfPieces: false,
piecesFiles: {
p: "pb", r: "rb", n: "nb", b: "bb", q: "qb", k: "kb", P: "pw", R: "rw", N: "nw", B: "bw", Q: "qw", K: "kw"
},
position: "2rq2k1/5pp1/4b1rp/1pBpP3/2pP1R2/P3QR1P/6PK/8",
hooks: {
isValidMove: isValidMoveCallback,
preMove: preMoveCallback,
postMove: postMoveCallback
}
});
function isValidMoveCallback(positionFrom, positionTo, pieceFrom, piecesTo) {
if (pieceFrom !== undefined && piecesTo.length > 0)
return true;
}
function preMoveCallback(positionFrom, positionTo, pieceFrom, piecesTo) {
alert("The piece "+ pieceFrom.label +" is going to be moved from "+ positionFrom +" to "+ positionTo +" Piece "+ piecesTo[0].label +" will be removed.");
return "Hi from preMove function!"
}
function postMoveCallback(positionFrom, positionTo, pieceFrom, piecesTo, returnedFromPreMove, returnedFromMove) {
this.removePiece(piecesTo[0]);
console.log("The piece "+ pieceFrom.label +" moved from "+ positionFrom +" to "+ positionTo
+"\nPiece "+ piecesTo[0].label +" removed."
+"\nPre-move function returned:\n"+ returnedFromPreMove);
}
Try it
Only moves on non-empty squares are allowed. An alert will appear right before a move, a message will appear on console right after a move. Piece on destination will be removed.


Owner fullname is required.
Owner fullname must be at least 5 characters long.
Owner image is required.
Owner email is required.


Texture Class
A texture stores the information that represents an image or part of an image. It cannot be added to the display list directly. Instead use it as the texture for a PIXI.Sprite. If no frame is provided then the whole image is used.
Constructor
Texture
-
baseTexture
-
frame
-
[crop]
-
[trim]
Parameters:
-
baseTexture
BaseTextureThe base texture source to create the texture from
-
frame
RectangleThe rectangle frame of the texture to show
-
[crop]
Rectangle optionalThe area of original texture
-
[trim]
Rectangle optionalTrimmed texture rectangle
Item Index
Methods
- _updateUvs
- addTextureToCache static
- destroy
- emit
- fromCanvas static
- fromFrame static
- fromImage static
- listeners
- mixin
- off
- on
- onBaseTextureLoaded
- once
- removeAllListeners
- removeTextureFromCache static
- setFrame
Properties
Methods
_updateUvs
()
private
Updates the internal WebGL UV cache.
addTextureToCache
-
texture
-
id
Adds a texture to the global PIXI.TextureCache. This cache is shared across the whole PIXI object.
Parameters:
-
texture
TextureThe Texture to add to the cache.
-
id
StringThe id that the texture will be stored against.
destroy
-
destroyBase
Destroys this texture
Parameters:
-
destroyBase
BooleanWhether to destroy the base texture as well
emit
-
eventName
Emit an event to all registered event listeners.
Parameters:
-
eventName
StringThe name of the event.
Returns:
Indication if we've emitted an event.
fromCanvas
-
canvas
-
scaleMode
Helper function that creates a new a Texture based on the given canvas element.
Parameters:
-
canvas
CanvasThe canvas element source of the texture
-
scaleMode
NumberShould be one of the PIXI.scaleMode consts
Returns:
Texture
fromFrame
-
frameId
Helper function that returns a Texture objected based on the given frame id. If the frame id is not in the texture cache an error will be thrown.
Parameters:
-
frameId
StringThe frame id of the texture
Returns:
Texture
fromImage
-
imageUrl
-
crossorigin
-
scaleMode
Helper function that creates a Texture object from the given image url. If the image is not in the texture cache it will be created and loaded.
Parameters:
-
imageUrl
StringThe image url of the texture
-
crossorigin
BooleanWhether requests should be treated as crossorigin
-
scaleMode
NumberShould be one of the PIXI.scaleMode consts
Returns:
Texture
listeners
-
eventName
Return a list of assigned event listeners.
Parameters:
-
eventName
StringThe events that should be listed.
Returns:
An array of listener functions
mixin
-
object
Mixes in the properties of the EventTarget prototype onto another object
Parameters:
-
object
ObjectThe obj to mix into
off
-
eventName
-
callback
Remove event listeners.
Parameters:
-
eventName
StringThe event we want to remove.
-
callback
FunctionThe listener that we need to find.
on
-
eventName
-
callback
Register a new EventListener for the given event.
Parameters:
-
eventName
StringName of the event.
-
callback
Functonfn Callback function.
onBaseTextureLoaded
()
private
Called when the base texture is loaded
once
-
eventName
-
callback
Add an EventListener that's only called once.
Parameters:
-
eventName
StringName of the event.
-
callback
FunctionCallback function.
removeAllListeners
-
eventName
Remove all listeners or only the listeners for the specified event.
Parameters:
-
eventName
StringThe event you want to remove all listeners for.
removeTextureFromCache
-
id
Remove a texture from the global PIXI.TextureCache.
Parameters:
-
id
StringThe id of the texture to be removed
Returns:
The texture that was removed
setFrame
-
frame
Specifies the region of the baseTexture that this texture will use.
Parameters:
-
frame
RectangleThe frame of the texture to set it to
Properties
_uvs
Object
private
The WebGL UV data cache.
crop
Rectangle
This is the area of the BaseTexture image to actually copy to the Canvas / WebGL when rendering, irrespective of the actual frame size or placement (which can be influenced by trimmed texture atlases)
height
Number
The height of the Texture in pixels.
noFrame
Boolean
Does this Texture have any frame data assigned to it?
requiresUpdate
Boolean
This will let a renderer know that a texture has been updated (used mainly for webGL uv updates)
valid
Boolean
This will let the renderer know if the texture is valid. If it's not then it cannot be rendered.
width
Number
The width of the Texture in pixels.


Upload documents via Base64 encoded JSON
DISCLAIMER The CM endpoints on SIM give 404 errors. The endpoints only work on Live, and only when you have the rights.
To test on production: add '?env=live' to the URL of this page. Or better, a token from your own live app.
Select one document:
Select one or more documents:
Response:
Click button to launch function.
JS code:
Click button to show code.


Master of Science, Computational Analysis and Public Policy
The University of Chicago Harris SchoolCoursework in computer science, statistical machine learning, econometrics, policy analysis, databases, and spatial data analysis
Coursework in computer science, statistical machine learning, econometrics, policy analysis, databases, and spatial data analysis