THE STRAIGHT STORY (1999)
4 out of ****
Starring Richard Farnsworth, Sissy Spacek, James Cada, Harry Dean Stanton; Directed by David Lynch; Written by John Roach and Mary Sweeney; Cinematography by Freddie Francis
THE STRAIGHT STORY is a breath of fresh air. It winds its way through the American Midwest, the nation's heartland, wide-eyed and open-hearted, steeped in admiration for both the landscape and its people. The admiration is not rooted in misplaced nostalgia or uncritical patriotism, but in simple affection for the kindness and decency of uncomplicated people who uphold values which seem almost archaic in a world of increasing moral relativism.
The relaxed narrative follows the journey of Alvin Straight, a 73-year-old man who learns that his estranged brother, Lyle, has suffered a stroke and decides to visit him. Lyle lives hundreds of miles away, and neither Alvin nor his daughter can drive a car, so he decides to travel by tractor. He purchases a John Deere and hits the open road ... very slowly. Near the beginning of his journey, he meets a pregnant woman, and toward the end he chats with a priest in a graveyard, and in some sense his trip is a voyage from life to death: it encompasses his existence and all he has learned.
The movie wisely does not force the "journey of life" metaphor, but focuses instead on the particulars of each incident. There are no antagonists; there is little inner conflict. The people Alvin meets are, every last one of them, decent, trusting, and considerate. The quirkiest thing about THE STRAIGHT STORY, indeed, is the niceness of its characters, who are lacking in evil or malice. It is strange to think that this should seem so odd, but it does. The movie does not insist on their goodness. The people come across as eccentrics, not saints; as individuals, not paragons. And their actions are reasonable enough: why on earth would you not want to help an old man on a tractor, on his way to meet his estranged brother?
Alvin meets many people. The pregnant woman and the priest, a middle-aged couple, twin mechanics, and more. To some he imparts wisdom; from others he gains insight. The most affecting scene, perhaps, is a conversation in a bar with another older man, who like Alvin is a veteran of World War II. Their conversation becomes, in effect, a mutual confession, as they unburden memories of the war which perhaps could not be shared with others, because the others were not there, and would not understand. The exchange is intensely moving, and is but one of many moments in THE STRAIGHT STORY which illuminate the essence of the characters' frailties and virtues, depicting them with compassion, and without censure or unearned sentiment.
The camera hovers lovingly over familiar American icons--an Ace Hardware store, Alvin's John Deere tractor, combine harvesters tilling amber waves of grain, wood-panelled saloons with neon beer logos and sports memorabilia on the walls--but it is the people who are the heart of the movie, and none more so than Alvin. He is portrayed with gravitas and dignity by Richard Farnsworth, whose unaffected performance deserves all the praise it has received. Alvin is plainspoken, kindly, and self-effacing, but it is evident that he has experienced much hardship. We learn some of it, including traumatic experiences in the army, difficulties experienced by his daughter, alcohol-fuelled fights with his brother--but he has survived it, and in surviving, found strength.
Drawing on this strength, he undertakes his journey with determination, patience, and gruff good humour. Everyone he meets stops and listens and learns from him. It is easy to see why. He has a quality which commands respect: a look in his eyes, a set to his grizzled chin, which suggests that he has seen much in his time and that he should not be trifled with. He has earned people's attention. If we met him, we would pay attention too.
The movie is by David Lynch, and has been called a radical departure from his earlier work. It does indeed provide a much-needed change of pace after his past few films, which are for the most part inferior reworkings of the obsessions he elaborated with such unsettling genius in BLUE VELVET and "Twin Peaks." Even so, the hushed humanism of THE STRAIGHT STORY is not entirely new. There is a childishness apparent in much of Lynch's work: the perspective is often that of a male adolescent, with a na´ve appreciation of the beauty of the everyday, a muddled and terrified sense of sin and evil, and an irreconcilable confusion about the sexual nature of women. This sense of adolescent simplicity is often interpreted as ironic, but I think it is meant to be taken at face value. The arrival of the robins at the end of BLUE VELVET and Agent Cooper's unwavering devotion to the ideals of law and justice, for example, are not meant to invite our cynicism: rather, we are asked us to set aside our skepticism and embrace their pureness.
If such heartfelt goodness is difficult to accept as unironic, it may be because the nightmare desires which underpin Lynch's vision of reality overwhelm the uncomplicated sense of innocence which his work at times strives to retrieve from a fallen world. THE STRAIGHT STORY, however, bestows upon us that sense of innocence in its fullness. Unlike Lynch's other works, the film does not address sexual desire, which in Lynch's world is the source of all anguish. The perspective is, if anything, that of a child rather than an adolescent--hence the 'G' rating--but an ancient child, both innocent and knowing.
The mature perspective of THE STRAIGHT STORY finally humbles most other movies, including many of Lynch's own, which, for all their brilliance, can be rather juvenile in some respects. The film is long and slow, but never unfocused. It is as efficient as a parable, and as revealing. It tells its lessons in a thoughtful, unhurried manner, and it does not raise its voice. It expects us to pause and reflect. It assumes that insight comes not from needless speech, but from quiet contemplation, from taking the time to look at things without superficial distraction, and the assumption is borne out for the duration of the film. Simple in its telling, complex in its wisdom, it is an American classic, and it reconfirms David Lynch's status as one of the great American directors.
Review by David Dalgleish (subjective.freeservers.com) -- January 8th, 2000
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


'Best performance' - Aston Villa fans loved this man's Liverpool display
Aston Villa 1-2 Liverpool reaction | Dean Smith's side were beaten late on by the European champions but Villa fans loved this man's display despite being on the losing side
by Richard CusackAston Villa fans have been full of praise for Mahmoud Trezeguet for his performance in the 2-1 defeat to Liverpool at Villa Park today.
Jurgen Klopp's European champions inflicted a second defeat in row on Villa after the 3-0 loss at Manchester City last time out.
The Reds went 1-0 down thanks to a strike from Trezeguet, who volleyed in from John McGinn's cross for his first goal since his £9 million move from Turkish side Kasimpasa in July.
Andy Robertson and Sadio Mane turned the game around for Liverpool, netting in the 87th and 94th minutes respectively to secure a big three points for their side that leaves them top of the League and six points clear of City.
Trezeguet drew plenty of praise for his maiden strike on social media but his all-round performance was also commented upon.
Here's the pick of the reaction...
@ slacken9 : Long live the new king of Egypt
@ Wrighti1 : Trezeguet outstanding.Set the bar now. Keep it up & keep the shirt.
@ matty8avfc2 : Trezeguet was superb today but needed to come off with 10mins to go, he was knackered!!
@ antonyruston : I thought trezeguet was awesome today, ran his heart out
@ SioRegan : Marvelous and Trezeguet were outstanding
@ FrailLee : Stand out players for me Marvelous and Trezeguet.
@ farria_c : Trezeguet’s best performance for the club, hope he kicks on now
@ Elmz_27 : Salah who?
@ LilHaydar : Better than Salah
@ Husseeein_H : The Egyptian prince
@ Baileyf98x : Our Egyptian son


New Zealand’s current border policy limits travel to returning New Zealand citizens and residents,
with two weeks’ quarantine for all travellers who enter the country.
We developed a
model to explore the effect of selective border opening to travellers from countries with a low
prevalence of covid-19 on the rate of undetected cases exiting MIQ into the community.
This number could be reduced by introducing RT-PCR testing for covid-19 on either side of the
border, increasing infection control at the border, and by varying times of MIQ on arrival to
New Zealand. The length of MIQ is proposed to be commensurate with the prevalence in the
traveller’s country.


--- layout: default title: Home ---
I'm a software developer in the .NET ecosystem building cloud and mobile solutions since 2002. Increasingly I'm becoming involved with the open source community contributing to a number of projects.
I'm currently based in Auckland, New Zealand.
Regularly I'll post here on some of the interesting things I'm learning during my development and feel could be useful to others.
Right now this work focuses on distributed cloud systems and microservices.


Student Historical data Analysis Platform
- All the students historical data will be shown by charts on the Dashboard
- By viewing the dashboard, you can saw the data by selecting different data source
- We mainly provide Moodle charts and Web-submission charts


Team Makeup
Code inspector teams consist of 2-5 individuals. The author of the code to be inspected is not part of the initial inspection team! A code inspection is not a witch hunt -- so no witch-hunting! Our purpose here is to improve the code, not to evaluate developers.
Preparing for Inspection
To get ready for the inspection, print separate hardcopies of the source code for each inspector. A single code inspector should cover no more than 250 source code lines, including comments, but not including whitespace. Surprisingly enough, this is a "carved in stone" limit! The hardcopy should contain a count of the source code lines shown.
Inspection overview.
The code author spends 20 - 40 minutes explaining the general layout of the code to the inspectors. The inspectors are not allowed to ask questions -- the code is supposed to answer them, but this overview is designed to speed up the process. The author's goal is to stick to the major, important points, and keep it as close to 20 minutes as possible without undercutting the explanation.
Individual inspections.
Each inspector uses the attached checklist to try to put forward a maximum number of discovered possible defects. This should be done in a single, uninterrupted sitting. The inspector should have a goal of covering 70-120 source lines of code per hour. Use the source line counts on the hardcopy, and strive not to inspect too quickly, nor too slowly! [This has been shown in several studies to be the next major factor after programming experience which affects the number of errors found. There is a sharp drop-off beyond 122 sloc/hr, so don't rush!]
To do the inspection, go through the code line by line, attempting to fully understand what you are reading. At each line or block of code, skim through the inspection checklist, looking for questions which apply. For each applicable question, find whether the answer is "yes." A yes answer means a probable defect. Write it down. You will notice that some of the questions are very low-level and concern themselves with syntactical details, while others are high-level and require an understanding of what a block of code does.
Meeting.
The meeting is attended by all the code inspectors for that chunk of code. If you want this to be more like a formal inspection, the meeting should have a moderator who is well experienced in C or C++, and in conducting code inspections, and the author of the code should not be present. To be more like a walkthrough, the moderator may be omitted, or the author may be present, or both. If the author is present, it is for the purpose of collecting feedback, not for defending or explaining the code. Remember, one of the major purposes of the inspection is to ensure that the code is sufficiently self-explanatory.
Each meeting is strictly limited to two hours duration, including interruptions. This is because inspection ability generally drops off after this amount of time. Strive to stay on task, and to not allow interruptions. Different inspectors may cover different groups of code for a single meeting. Thus, a single meeting could theoretically cover a maximum of (5 inspectors) * (120 sloc/hr) * (2 hrs) = 1200 lines of source code. In actuality, there should be some overlap between inspectors, up to the case of everyone having inspected the same code.
If the group is not finished at the end of two hours, quit. Do not attempt to push ahead. The moderator or note taker should submit the existing notes to the author or maintainer, and the remaining material should be covered in a subsequent meeting.
Rework
The defects list is submitted to the author, or to another asasigned individual for "rework." This can consist of changing code, adding or deleting comments, restructuring or relocating things, etc. Note that solutions are not discussed at the inspection meeting! They are neither productive nor necessary in that setting. If the author/maintainer desires feedback on solutions or improvements, he or she may hold a short meeting with any or all of the inspectors, following the code inspection meeting. The "improvements" meeting is led by the author/maintainer, who is free to accept or reject any suggestions from the attenders.
Follow up.
It is the moderator's personal responsibility to ensure all defects have been satisfactorily reworked. If there is no formal moderator, then an individual is selected for this role at the inspection meeting. The correctness of the rework will be verified either at a short review meeting, or during later inspection stages during the project.
Record keeping.
In order to objectively track success in detecting and correcting defects, one of the by-products of the meeting will be a count of the total number of different types of potential defects noted. In order to eliminate both the perception and the possibility that the records will be used to evaluate developers (remember, the goal is to improve the software), then neither the name of the author nor the source module will be noted in the defect counts. If absolutely necessary to keep the counts straight, a "code module number" may be assigned and used. The document containing the pairing of code modules with their numbers will be maintained by a single individual who has no management responsibilities on the project, and this document will be destroyed upon completion of the code development phase of the project.
int intarray[13];
should be
int intarray[TOT_MONTHS+1];
char entry[TOTAL_ENTRIES];
should be
char entry[LAST_ENTRY+1];
The first example is extremely error-prone and often gives rise to off-by-one errors in the code. The preferred (second) method permits the writer to use the LAST_ENTRY identi fier to refer to the last item in the array. Instances which require a buffer of a certain size are rarely rendered invalid by this practice, which results in the buffer being one element bigger than absolutely necessary.
int months_in_year = 12;
should be
const unsigned months_in_year = 12;
#define MAX_FILES 20
should be
const unsigned MAX_FILES = 20;
const unsigned MAX_FOOS = 1000;
const unsigned MAX_FOO_BUFFERS = 40;
should be
class foo { public: enum { MAX_INSTANCES = 1000; } ... private: enum { MAX_FOO_BUFFERS = 40; } ... };
If the size of the constant exceeds int, another mechanism is available:
class bar { public: static const long MAX_INSTS; ... }; const long bar::MAX_INSTS = 70000L;
The keyword static ensures there is only one instance of the variable for the entire class. Static data items are not permitted to be initialized within the class declaration, so the initialization line must be included in the implementation file for class bar.
Static constant members have one drawback: you cannot use them to declare member data arrays of a certain size. This is because the value is not available to the compiler at the point which the array is declared in the class.
int age;
should be
unsigned int age;
This is an easy error to make, since the default types are usually signed.
typedef char SmallInt; SmallInt mumble = 280; // WRONG on Borland C++ 3.1 // or MSC/C++ 7.0!
The typedefs should be
typedef unsigned char SmallUInt; typedef signed char SmallInt;
double acct_balance;
should be
unsigned long acct_balance;
In general, the only time floating point arithmetic is necessary is in scientific or navigational calculations. It is slow, and subject to more complex overflow and underflow behavior than integer math is. Monetary calculations, as above, can often be handled in counts of cents, and formatted properly on output. Thus, acct_balance might equal 103446, and print out as $1,034.46.
Classes having virtual functions should always have a virtual destructor. This is necessary since it is likely that you will hold an object of a class with a pointer of a less derived type. Making the destructor virtual ensures that the right code will be run if you delete the object via the pointer.
If so, it generally will need all three. (Exceptions may occasionally be found for some classes having a destructor with neither of the other two.
For example, one program had no size checks when reading data into a buffer because the correct data would always fit. But when the file it read was accidentally overwritten with incorrect data, the program crashed mysteriously.
This practice has been shown to incur up to 350% overhead, compared to the practice of declaring the variable later in the code, when an initialization variable is known. It is the simple matter of putting a value in once, instead of assigning some default value, then later throwing it away and assigning the real value.
Suppose the processing of a data element in a sequence causes a variable to be set. For example, a file might be read, and some globals initialized for that file. Can those globals be used for the next file in the sequence without being re-initialized?
For example, what happens in this code:
#define max(a,b) ( (a) > (b) ? (a) : (b) ) max(i++, j);
#define max(a, b) (a) > (b) ? (a) : (b) result = max(i, j) + 3;
This expands into:
result = (i) > (j) ? (i) : (j)+3;
See the example in 4.1 for the correct parenthesization.
#define IsXBitSet(var) (var && bitmask) result = IsXBitSet( i || j );
This expands into:
result = (i || j && bitmask); // not what expected!
The correct form is:
#define IsXBitSet(var) ((var) && (bitmask))
For example:
memset(buffer1, 0, sizeof(buffer2)); // danger!
This is not always an error, but it is a dangerous practice. Each instance should be verified as (a) necessary, and (b) correct, and then commented as such.
Common errors:
This is not always an error, but should always be prominently documented, along with the reason for implementing in this manner. Constructors which allocate, paired with destructors which deallocate, are an obvious exception, since a single object has control of its class data.
C standaard library allocation functions should never be used in C++ programs, since C++ provides an allocation operator.
If you find you must mix C allocation with C++ allocation:
Program behavior is undefined if this is done.
delete myCharArray;
should be
delete [] myCharArray;
It is recommended that pointers are set to NULL following deletion, or to another safe value meaning "uninitialized." This is neither necessary nor recommended within destructors, since the pointer variable itself will cease to exist upon exiting.
This is not possible if the code conforms to 6.2.2. The draft C++ standard specifies that it is always safe to delete a NULL pointer, so it is not necessary to check for that value.
If C standard library allocators are used in a C++ program (not recommended):Both of these practices are dangerous. Program behavior is undefined if you do them, and such usage is specifically deprecated by the ANSI draft C++ standard.
C++ is somewhat charitable when arguments are passed to functions: if no function is found which exactly matches the types of the arguments supplied, it attempts to apply certain type conversion rules to find a match. While this saves unnecessary casting, if more than one function fits the conversion rules, it will result in a compilation error. Worse, it can cause additions to the type system (either from adding a related class, or from adding an overloaded function) to cause previously working code to break!
See the Appendix (A) for an example.
Sometimes, a group of variables must be modified as a group to complete a single conceptual "transaction." If this does not occur all in one place, is it guaranteed that all variables get updated if a single value changes? Do all updates occur before any of the values are tested or used?
if ( someVar == 0.1 )
might never be evaluated as true. The constant 0.1 is not exactly representable by any finite binary mantissa and exponent, thus the compiler must round it to some other number. Calculations involving someVar may never result in it taking on that value.
Solution: use >, >=, <, or <=, depending on which direction you wish the variable bound.
if ( myUnsignedVar >= 0 )
will always evaluate true.
if ( mySignedVar ) // not always good if ( mySignedVar >= 0 ) // better! if ( mySignedVar <= 0 ) // opposite case
If the variable is updated by any means other than ++ or --, it may miss the value of the test constant entirely. This can cause subtle and frightening bugs when code executes under conditions that weren't planned for.
By always using inclusive lower limits and exclusive upper limits, a whole class of off by-one errors is eliminated. Furthermore, the following assumptions always apply:
Examples: instead of saying x>=23 and x<=42 , use x>=23 and x<43.
When several cases are followed by the same block of code, they may be "stacked" together and the code terminated with a single break.
Cases may also be exited via return.
All other circumstances requiring "drop through" cases should be clearly documented in a strategic comment before the switch . This should only be used when it makes the code simpler and clearer.
There should always be a default branch to handle unexpected cases, even when it appears that the code can never get there.
Consider using break instead. It is likely to simplify the code.
If the continue occurs in the body of an if conditional, consider replacing it with an else clause if it will simplify the code.
The programmer should never change the semantics of relationships between operators. For the example here, the two statements above are semantically identical for intrinsic types (even though the code generated might be different), so for a user defined class, they should be semantically identical, too. They may, in fact, be implemented differently (+= should be more efficient).
The code for operator=() should always start out with:
if (this == &right_hand_arg ) return *this;
Failure to return a reference to this prevents the user from writing (legal C++):
a = b = c;
Failure to make the return reference const allows the user to write (illegal C++):
(a = b) = c;
(See question 3.1.2 and commentary.)
For example, you might be calculating the number of bytes for an array when the number of elements was requested. If the elements are big (say, a long, or a struct!), you'd be using way too much memory.
Foo& do_something( Foo anotherFoo, Bar someThing );
should be
Foo& do_something( const Foo& anotherFoo, const Bar& someThing );
While it is cheaper to pass ints, longs, and such by value, passing objects this way incurs significant expense due to the construction of temporary objects. The problem becomes more severe when inheritance is involved. Simulate pass-by-value by passing const references.
This is permissible provided the data was intended to be shared, and this fact is documented in the source code.
Type checking cannot occur for functions with variable length argument lists.
For example, a user was surprised to see nonsensical values when the following code was executed:
printf(" %d %ld \n", a_long_int, another_long_int);
On that particular system, int s and long s were different sizes (2 and 4 bytes, respectively). printf() is responsible for manually accessing the stack; thus, it saw "%d" and grabbed 2 bytes (an int). It then saw "%ld" and grabbed 4 bytes (a long). The two values printed were the MSW of a_long_int , and the combination of a_long_int 's LSW and another_long_int 's MSW.
Solution: ensure types explicitly match. If necessary, arguments may be cast to smaller sizes ( long to int ) if the author knows for certain that the smaller type can hold all possible values of the variable.
(This is, surprisingly enough, a common design bug.)
fp = fopen(...); fp = fopen(...);
Code which relies upon implicit type conversions may become broken when new classes or functions are added. For example:
class String { public: String( char *arg ); // copy constructor operator const char* () const; // ... }; void foo( const String& aString ); void bar( const char *anArray ); // Now, we added the following class class Word { public: Word( char *arg ); // copy constructor // ... }; // need another foo that works with "Words" void foo( const Word& aWord ); int gorp() { foo("hello"); // This used to work! // Now it breaks! What gives? String baz = "quux"; bar(baz); // but this still works. }
The code worked before class Word and the second foo() were added. Even though there was no foo() accepting an argument of type const char * (i.e. a constant string like "hello"), there is a foo() which takes a constant String argument by reference. And (un)fortunately, there is also a way to convert Strings to char * 's and vice-versa. So the compiler performed the implicit conversion.
Now, with the addition of class Word , and another foo() which works with it, there is a problem. The line which calls foo("hello") matches both:
void foo( const String& ); void foo( const Word& );
Since the mechanisms of the failure may be distributed among two or more header files in addition to the implementation file, along with a lot of other code, it may be difficult to find the real problem. The easiest solution is to recognize while coding or inspecting that a function call results in implicit type conversion, and either (a) overload the function to provide an explicitly typed variant, or (b) explicitly cast the argument.
Option (a) is preferred over (b), since (b) defeats automatic type checking. Option (a) can still be implemented very efficiently, simply by writing the new function as a forwarding function and making it inline.
Functions which can return EOF should not have their return values stored in a char variable. For example:
int getchar(void); char chr; while ( (chr = getchar()) != EOF ) { ... };
should be:
int tmpchar; while ( (tmpchar = getchar()) != EOF ) { chr = (char) tmpchar; // or use casted tmpchar ... // throughout... };
The practice in the top example is unsafe because functions like getchar() may return 257 different values: valid characters with indexes 0 -255, plus EOF (-1). If sizeof(int) > sizeof(char) , then information will be lost when the high-order byte(s) are scraped off prior to the test for EOF. This can cause the test to fail. Worse yet, depending on whether char is signed or unsigned by default on the particular compiler and machine being used, sign extension can wreak havoc and cause some of these loops never to terminate.
The following loops are indexed correctly, and are handy for comparisons when doing inspections. If the actual code doesn't look like one of these, chances are that something is wrong -- or at least that something could be clearer.
Acceptable forms of for loops which avoid off-by-one errors.
for ( i = 0; i <= max_index; ++i ) for ( i = 0; i < sizeof(array); ++i ) for ( i = max_index; i >= 0; --i ) for ( i = max_index; i ; --i )
Some of the questions applicable to conventional C contained herein were modified or taken from A Question Catalog for Code Inspections, Copyright (C) 1992 by Brian Marick. Portions of his document were Copyright (C) 1991 by Motorola, Inc., which graciously granted him rights to those portions.
In conformance with his copyright notice, the following contact information is provided below:
Brian Marick Testing Foundations 809 Balboa, Champaign, IL 61820<PHONE_NUMBER><EMAIL_ADDRESS><EMAIL_ADDRESS>"You may copy or modify this document for personal use, provided you retain the original copyright notice and contact information."
Some questions and comment material were modified from Programming in C++, Rules and Recommendations, Copyright (C) 1990-1992 by Ellemtel Telecommunication Systems Laboratories.
In conformance with their copyright notice:
"Permission is granted to any individual or institution to use, copy, modify, and distribute this document, provided that this complete copyright and permission notice is maintained intact in all copies."
Finally, all modifications and remaining original material are:
Copyright (C) 1992 by John T. Baldwin. All Rights Reserved.
John T. Baldwin 1511 Omie Way Lawrenceville, GA 30243 1-404-339-9621<EMAIL_ADDRESS>Permission is granted to any institution or individual to copy, modify, distribute, and use this document, provided that the complete copyright, permission, and contact information applicable to all copyright holders specified herein remains intact in all copies of this document.
Archived by Chris Lott.


Test each username as password
When you are authenticated, this module takes all Oracle users and tries to connect to the database using the username as password (lowercase & uppercase value).
For example, if the database has 2 Oracle users (SYS, SYSTEM), this module will try to connect to the database with these credentials: SYS/SYS, SYS/sys, SYSTEM/SYSTEM and SYSTEM/system.
This module is started automatically when the all module is launched with a valid Oracle account (-U and -P options).
Here is an example:
./odat.py userlikepwd -s $HOST -d $SID -U $LOGIN -P $PASSWORD --run


| DOSE: |
7.0 mg |
insufflated |
5-MeO-DiPT |
(powder / crystals) |
Roughly 6-8mg, insufflated
3 PM: start
A lazy Saturday afternoon after a lovely evening out; what to do?
Oh yeah! There's a capsule of chemical in the freezer! I hadn't
eaten all day, which I figured was just as well.
I decided on insufflation for the shortened onset/duration and the promise
of decreased body load. I knew I had 50mg of 5MEO-DIPT; I chopped it into
two piles, then one of those into two, and then one of those two in half
again. I really should buy a milligram scale.
At 3 PM I insufflated one of the smallest piles. The immediate sensation wasn't too bad, and the odor was acceptable (is that what they call an indole smell?). The burn developed over the course of a few minutes into an annoying
distraction, and the drip was yucky indeed.
In the interest of monitoring the auditory effects, I put on a very familiar album and let myself forget I was watching for shifts from baseline.
3:15 the drip taste and burn are distracting enough to make insufflation
an unattractive route for my future experimentation.
3:25 Off baseline to a slightly warm sweaty +1.
3:30 Music is enhanced; component instruments and voices are becoming
more individually distinct, as with psilocybin.
3:35 dizzy, nauseous edge, shaky.
7:44 lots of sitting around in a blurry, slightly dizzy +1 to +2.
Not much fun. Musical notes definitely sound bent in pitch.
Aftermath: went to a party. Was back to near-baseline by around 10 or
11. Noticed some visual flashes while looking at the night sky.
Overall, I think my dizziness outweighed the fun/trippiness. I wonder what
a larger dose might be like, but don't know if I'll do it.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


NAT
- Every IP-capable device needs an IP address.
- A small office, home office(SOHO) may need to connect to multiple devices. A simple approach to allocation of addresses is network address translation (NAT)
- Realm/realm with private addresses: the address spaces reserved for private addresses.
- Many devices may be using the same private address space, and those devices may communicate to each other within the home network, but the packets cannot be forwarded beyond the home network into the global Internet while still using these addresses.
- A NAT-enabled router acts as a single device with a single IP address to the outside world, which means it hides the details of the home network from the outside world. The router gets its address from the ISP’s DHCP server. The router then runs its own DHCP server for the computers connected to the router. To do this, the router uses a NAT translation table.
- This is what happens when someone requests a web page.
- Host machine starts with a private address, which requests to a web page with a web server port.
- The host assigns a source port number arbitrarily then sends the datagram into the LAN
- The NAT router receives the datagram and generates a new source port number, and replaces the source IP address with the WAN-side IP address (IP address of the router).
- When creating a source port number, it can assign to any value that’s not in the NAT translation table. Then that port is put in the table
- The port number is 16 bits, so it can support over 60,000 ports.
- When the information is sent back from the website, the router must look up which computer or machine used what port number, rewrites the datagram’s destination port and address and send it to the correct device.
- Some people from the IETF are against NAT for these reasons
- port numbers were meant for addressing processes and not for addressing hosts (servers processes wait for incoming requests at well-known port numbers)
- NAT protocol violates the end-to-end argument (hosts should talk to each other.)
- Routers are supposed to process packets only up to layer 3.
- We should use IPv6 to fix the shortage of IP addresses. They think using NAT to fix it is a wreckless patch.
- NAT interferes with P2P applications
- Connection reversal
- NAT traversal


In this project, you'll use generative adversarial networks to generate new images of faces.
You'll be using two datasets in this project:
Since the celebA dataset is complex and you're doing GANs in a project for the first time, we want you to test your neural network on MNIST before CelebA. Running the GANs on MNIST will allow you to see how well your model trains sooner.
If you're using FloydHub, set data_dir
to "/input" and use the FloydHub data ID "R5KrjnANiKVhLWAkpXhNBe".
#data_dir = './data'
#data_dir = '/tmp/data'
# FloydHub - Use with data ID "R5KrjnANiKVhLWAkpXhNBe"
data_dir = '/input'
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import helper
helper.download_extract('mnist', data_dir)
helper.download_extract('celeba', data_dir)
show_n_images = 25
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
%matplotlib inline
import os
from glob import glob
from matplotlib import pyplot
mnist_images = helper.get_batch(glob(os.path.join(data_dir, 'mnist/*.jpg'))[:show_n_images], 28, 28, 'L')
pyplot.imshow(helper.images_square_grid(mnist_images, 'L'), cmap='gray')
The CelebFaces Attributes Dataset (CelebA) dataset contains over 200,000 celebrity images with annotations. Since you're going to be generating faces, you won't need the annotations. You can view the first number of examples by changing show_n_images
.
show_n_images = 25
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
mnist_images = helper.get_batch(glob(os.path.join(data_dir, 'img_align_celeba/*.jpg'))[:show_n_images], 28, 28, 'RGB')
pyplot.imshow(helper.images_square_grid(mnist_images, 'RGB'))
Since the project's main focus is on building the GANs, we'll preprocess the data for you. The values of the MNIST and CelebA dataset will be in the range of -0.5 to 0.5 of 28x28 dimensional images. The CelebA images will be cropped to remove parts of the image that don't include a face, then resized down to 28x28.

You'll build the components necessary to build a GANs by implementing the following functions below:
model_inputs
discriminator
generator
model_loss
model_opt
train
This will check to make sure you have the correct version of TensorFlow and access to a GPU
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
from distutils.version import LooseVersion
import warnings
import tensorflow as tf
# Check TensorFlow Version
assert LooseVersion(tf.__version__) >= LooseVersion('1.0'), 'Please use TensorFlow version 1.0 or newer. You are using {}'.format(tf.__version__)
print('TensorFlow Version: {}'.format(tf.__version__))
# Check for a GPU
if not tf.test.gpu_device_name():
warnings.warn('No GPU found. Please use a GPU to train your neural network.')
else:
print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))
Implement the model_inputs
function to create TF Placeholders for the Neural Network. It should create the following placeholders:
image_width
, image_height
, and image_channels
.z_dim
.Return the placeholders in the following the tuple (tensor of real input images, tensor of z data)
import problem_unittests as tests
def model_inputs(image_width, image_height, image_channels, z_dim):
"""
Create the model inputs
:param image_width: The input image width
:param image_height: The input image height
:param image_channels: The number of image channels
:param z_dim: The dimension of Z
:return: Tuple of (tensor of real input images, tensor of z data, learning rate)
"""
# TODO: Implement Function
inputs_real = tf.placeholder(tf.float32, (None, image_width, image_height, image_channels), name='inputs_real')
inputs_z = tf.placeholder(tf.float32, (None, z_dim), name='inputs_z')
learning_rate = tf.placeholder(tf.float32, name='learning_rate')
return inputs_real, inputs_z, learning_rate
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_inputs(model_inputs)
Implement discriminator
to create a discriminator neural network that discriminates on images
. This function should be able to reuse the variabes in the neural network. Use tf.variable_scope
with a scope name of "discriminator" to allow the variables to be reused. The function should return a tuple of (tensor output of the generator, tensor logits of the generator).
def discriminator(images, reuse=False):
"""
Create the discriminator network
:param image: Tensor of input image(s)
:param reuse: Boolean if the weights should be reused
:return: Tuple of (tensor output of the discriminator, tensor logits of the discriminator)
"""
# TODO: Implement Function
alpha = 0.2
with tf.variable_scope('discriminator', reuse=reuse):
# Input layer is image_width*image_height*image_channels (in this particular case 28*28*(1 or 3))
x1 = tf.layers.conv2d(images, 64, 5, strides=2, padding='same', use_bias=False,
kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))
relu1 = tf.maximum(alpha * x1, x1)
# 14x14x64
x2 = tf.layers.conv2d(relu1, 128, 5, strides=2, padding='same', use_bias=False,
kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))
bn2 = tf.layers.batch_normalization(x2, training=True)
relu2 = tf.maximum(alpha * bn2, bn2)
# 7x7x128
x3 = tf.layers.conv2d(relu2, 256, 5, strides=1, padding='same', use_bias=False,
kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))
bn3 = tf.layers.batch_normalization(x3, training=True)
relu3 = tf.maximum(alpha * bn3, bn3)
# 7x7x256
dims = relu3.get_shape()
n_elems = dims[1]*dims[2]*dims[3]
# Flatten it
flat = tf.reshape(relu2, (-1, int(n_elems)))
logits = tf.layers.dense(flat, 1)
out = tf.sigmoid(logits)
return out, logits
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_discriminator(discriminator, tf)
Implement generator
to generate an image using z
. This function should be able to reuse the variabes in the neural network. Use tf.variable_scope
with a scope name of "generator" to allow the variables to be reused. The function should return the generated 28 x 28 x out_channel_dim
images.
def generator(z, out_channel_dim, is_train=True):
"""
Create the generator network
:param z: Input z
:param out_channel_dim: The number of channels in the output image
:param is_train: Boolean if generator is being used for training
:return: The tensor output of the generator
"""
# TODO: Implement Function
alpha = 0.2
reuse = not is_train
with tf.variable_scope('generator', reuse=reuse):
# First fully connected layer
x1 = tf.layers.dense(z, 7*7*512, use_bias=False)
# Reshape it to start the convolutional stack
x1 = tf.reshape(x1, (-1, 7, 7, 512))
x1 = tf.layers.batch_normalization(x1, training=is_train)
x1 = tf.maximum(alpha * x1, x1)
# 7x7x512 now
x2 = tf.layers.conv2d_transpose(x1, 256, 5, strides=2, padding='same', use_bias=False,
kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))
x2 = tf.layers.batch_normalization(x2, training=is_train)
x2 = tf.maximum(alpha * x2, x2)
# 14x14x256 now
x3 = tf.layers.conv2d_transpose(x2, 256, 5, strides=1, padding='same', use_bias=False,
kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))
x3 = tf.layers.batch_normalization(x3, training=is_train)
x3 = tf.maximum(alpha * x3, x3)
# 14x14x256 now
x4 = tf.layers.conv2d_transpose(x3, 128, 5, strides=2, padding='same', use_bias=False,
kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))
x4 = tf.layers.batch_normalization(x4, training=is_train)
x4 = tf.maximum(alpha * x4, x4)
# 28x28x128 now
# Output layer
logits = tf.layers.conv2d_transpose(x4, out_channel_dim, 5, strides=1, padding='same', use_bias=False,
kernel_initializer=tf.random_normal_initializer(mean=0.0, stddev=0.02))
# 28x28x3 now
out = tf.tanh(logits)
return out
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_generator(generator, tf)
Implement model_loss
to build the GANs for training and calculate the loss. The function should return a tuple of (discriminator loss, generator loss). Use the following functions you implemented:
discriminator(images, reuse=False)
generator(z, out_channel_dim, is_train=True)
def model_loss(input_real, input_z, out_channel_dim):
"""
Get the loss for the discriminator and generator
:param input_real: Images from the real dataset
:param input_z: Z input
:param out_channel_dim: The number of channels in the output image
:return: A tuple of (discriminator loss, generator loss)
"""
# TODO: Implement Function
g_model = generator(input_z, out_channel_dim, is_train=True)
d_model_real, d_logits_real = discriminator(input_real)
d_model_fake, d_logits_fake = discriminator(g_model, reuse=True)
d_loss_real = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_real, labels=tf.ones_like(d_model_real)))
d_loss_fake = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.zeros_like(d_model_fake)))
g_loss = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.ones_like(d_model_fake)))
d_loss = d_loss_real + d_loss_fake
return d_loss, g_loss
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_loss(model_loss)
Implement model_opt
to create the optimization operations for the GANs. Use tf.trainable_variables
to get all the trainable variables. Filter the variables with names that are in the discriminator and generator scope names. The function should return a tuple of (discriminator training operation, generator training operation).
def model_opt(d_loss, g_loss, learning_rate, beta1):
"""
Get optimization operations
:param d_loss: Discriminator loss Tensor
:param g_loss: Generator loss Tensor
:param learning_rate: Learning Rate Placeholder
:param beta1: The exponential decay rate for the 1st moment in the optimizer
:return: A tuple of (discriminator training operation, generator training operation)
"""
# TODO: Implement Function
t_vars = tf.trainable_variables()
d_vars = [var for var in t_vars if var.name.startswith('discriminator')]
g_vars = [var for var in t_vars if var.name.startswith('generator')]
# The following code comes from the forum https://discussions.udacity.com/t/project-5-net-not-training/246936/9
# it is used to separate the update for discriminator and generator
all_update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
g_update_ops = [var for var in all_update_ops if var.name.startswith('generator')]
d_update_ops = [var for var in all_update_ops if var.name.startswith('discriminator')]
with tf.control_dependencies(d_update_ops):
d_train_opt = tf.train.AdamOptimizer(learning_rate, beta1 = beta1).minimize(d_loss, var_list = d_vars)
with tf.control_dependencies(g_update_ops):
g_train_opt = tf.train.AdamOptimizer(learning_rate, beta1 = beta1).minimize(g_loss, var_list = g_vars)
# Optimize
#with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
# d_train_opt = tf.train.AdamOptimizer(learning_rate, beta1=beta1).minimize(d_loss, var_list=d_vars)
# g_train_opt = tf.train.AdamOptimizer(learning_rate, beta1=beta1).minimize(g_loss, var_list=g_vars)
return d_train_opt, g_train_opt
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_opt(model_opt, tf)
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import numpy as np
def show_generator_output(sess, n_images, input_z, out_channel_dim, image_mode):
"""
Show example output for the generator
:param sess: TensorFlow session
:param n_images: Number of Images to display
:param input_z: Input Z Tensor
:param out_channel_dim: The number of channels in the output image
:param image_mode: The mode to use for images ("RGB" or "L")
"""
cmap = None if image_mode == 'RGB' else 'gray'
z_dim = input_z.get_shape().as_list()[-1]
example_z = np.random.uniform(-1, 1, size=[n_images, z_dim])
samples = sess.run(
generator(input_z, out_channel_dim, False),
feed_dict={input_z: example_z})
images_grid = helper.images_square_grid(samples, image_mode)
pyplot.imshow(images_grid, cmap=cmap)
pyplot.show()
Implement train
to build and train the GANs. Use the following functions you implemented:
model_inputs(image_width, image_height, image_channels, z_dim)
model_loss(input_real, input_z, out_channel_dim)
model_opt(d_loss, g_loss, learning_rate, beta1)
Use the show_generator_output
to show generator
output while you train. Running show_generator_output
for every batch will drastically increase training time and increase the size of the notebook. It's recommended to print the generator
output every 100 batches.
def train(epoch_count, batch_size, z_dim, learning_rate, beta1, get_batches, data_shape, data_image_mode):
"""
Train the GAN
:param epoch_count: Number of epochs
:param batch_size: Batch Size
:param z_dim: Z dimension
:param learning_rate: Learning Rate
:param beta1: The exponential decay rate for the 1st moment in the optimizer
:param get_batches: Function to get batches
:param data_shape: Shape of the data
:param data_image_mode: The image mode to use for images ("RGB" or "L")
"""
# TODO: Build Model
#print(data_shape)
_, image_width, image_height, image_channels = data_shape
inputs_real, inputs_z, lr = model_inputs(image_width, image_height, image_channels, z_dim)
d_loss, g_loss = model_loss(inputs_real, inputs_z, image_channels)
d_opt, g_opt = model_opt(d_loss, g_loss, lr, beta1)
steps = 0
print_every = 10
show_every = 100
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch_i in range(epoch_count):
for batch_images_h in get_batches(batch_size):
# TODO: Train Model
steps += 1
batch_images = batch_images_h*2
# Sample random noise for G
batch_z = np.random.uniform(-1, 1, size=(batch_size, z_dim))
# Run optimizers
_ = sess.run(d_opt, feed_dict={inputs_real: batch_images, inputs_z: batch_z, lr:learning_rate})
_ = sess.run(g_opt, feed_dict={inputs_real: batch_images, inputs_z: batch_z, lr:learning_rate})
_ = sess.run(g_opt, feed_dict={inputs_real: batch_images, inputs_z: batch_z, lr:learning_rate})
if steps % print_every == 0:
# At the end of each epoch, get the losses and print them out
train_loss_d = d_loss.eval({inputs_z: batch_z, inputs_real: batch_images, lr: learning_rate})
train_loss_g = g_loss.eval({inputs_z: batch_z, inputs_real: batch_images, lr: learning_rate})
print("Epoch {}/{}...".format(epoch_i+1, epochs),
"Discriminator Loss: {:.4f}...".format(train_loss_d),
"Generator Loss: {:.4f}".format(train_loss_g))
# Save losses to view after training
# losses.append((train_loss_d, train_loss_g))
if steps % show_every == 0:
show_generator_output(sess, 25, inputs_z, image_channels, data_image_mode)
Test your GANs architecture on MNIST. After 2 epochs, the GANs should be able to generate images that look like handwritten digits. Make sure the loss of the generator is lower than the loss of the discriminator or close to 0.
batch_size = 64
z_dim = 100
learning_rate = 0.0002
beta1 = 0.5
tf.reset_default_graph()
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
epochs = 2
mnist_dataset = helper.Dataset('mnist', glob(os.path.join(data_dir, 'mnist/*.jpg')))
with tf.Graph().as_default():
train(epochs, batch_size, z_dim, learning_rate, beta1, mnist_dataset.get_batches,
mnist_dataset.shape, mnist_dataset.image_mode)
Run your GANs on CelebA. It will take around 20 minutes on the average GPU to run one epoch. You can run the whole epoch or stop when it starts to generate realistic faces.
batch_size = 64
z_dim = 100
learning_rate = 0.0002
beta1 = 0.5
tf.reset_default_graph()
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
epochs = 1
celeba_dataset = helper.Dataset('celeba', glob(os.path.join(data_dir, 'img_align_celeba/*.jpg')))
with tf.Graph().as_default():
train(epochs, batch_size, z_dim, learning_rate, beta1, celeba_dataset.get_batches,
celeba_dataset.shape, celeba_dataset.image_mode)
When submitting this project, make sure to run all the cells before saving the notebook. Save the notebook file as "dlnd_face_generation.ipynb" and save it as a HTML file under "File" -> "Download as". Include the "helper.py" and "problem_unittests.py" files in your submission.


*** AUTHORIZED USE ONLY ***
The information on this server and network is the property of this organization and is protected by intellectual property rights. You must be assigned an account on this computer to access information and are only allowed to access information defined by the system administrators. Your activities will be monitored!
×


Are there people playing now?
Posted: Wed Oct 08, 2008 1:43 pm
Are there people playing now or is the game server closed at the moment?
Thanks, Enchantress
Edit: Ugh, every post I read makes me want to play now! Lemme play!
Thanks, Enchantress
Edit: Ugh, every post I read makes me want to play now! Lemme play!


Arup Sydney Offices / HASSELL
- Curated by Paula Pintos
- about 1 hour
Offices Interiors · Sydney, Australia
- version="1.0" encoding="UTF-8"? Interiors designers: HASSELL
- AreaArea of this architecture projectArea: 7500.0 m2
- version="1.0" encoding="UTF-8"?YearCompletion year of this architecture project Year: 2018
- version="1.0" encoding="UTF-8"?PhotographsPhotographs: Earl Carter
- Lead Architects David Whittaker, Emily Moss, Sarah Knapman, Jessica Cowie, Cat Devitt, Nick Hussey, Karen-Lize Pike, Yvonne Pinniger, Evodia Alaterou, Robert Backhouse, Steve Coster
- Other Participants Arup
More Specs Less Specs
Text description provided by the architects. A relentless pursuit of technical excellence, a commitment to pushing boundaries and consistently challenging norms have been the driving forces in engineering firm Arup’s new Sydney Australia, office. In a long-standing collaboration between design and engineering, HASSELL partnered with Arup to create a workplace where the exchange of knowledge and skills through learning and experimentation – central tenets of Arup’s work culture – are not only facilitated but lived by all.
HASSELL was engaged early in the construction planning of Barrack Place in which Arup was both building engineer and future tenant. This presented Arup and HASSELL with the opportunity to influence the building’s architecture and engineering to align with their vision of the workplace interior. The heart of the new workplace is a four-story void connecting all five floors of the tenancy. With striking horizontal and vertical views across and between floors, this centerpiece presents a clear view of Arup’s everyday operations and sense of connection.
Arup’s desire to be open and authentic led to a planning model where exchange spaces are dispersed throughout the tenancy. These spaces sit adjacent to the void on all floors, each with a different focus, where lab spaces, workshops, meeting, and collaboration zones become destinations driving connection and collaboration between Arup’s people, clients and partners. The staircase, connecting exchange areas vertically, is a design and engineering feat – a cast concrete structure floating between floors.
This visual manifestation of Arup’s heritage in ingenuity and honesty in design provides a fast connection between floors and teams, enhancing the activation and energy of the workplace. Spanning the voids on two levels are bridges linking work zones via intermediary collaboration spaces. The bridges not only connect but also reflect on the engineering origins of Arup and demonstrate its expertise in a range of disciplines.


It is almost impossible to read a memoir or biography of a Victorian writer without coming upon the inevitable walking statistics. Even [John Stuart] Mill, that effeminate “logic-chopping machine”… walked fifteen miles three days before his death at the age of sixty-seven, a modest record compared with [Leslie] Stephen's grandfather, who celebrated his seventieth birthday by walking twenty-five miles to breakfast, then to his office, and home again the same day. Fifty miles a day was about the average for the “Sunday Tramps” organised by Stephen.
Gertrude Himmelfarb, Victorian Minds (Weidenfeld & Nicolson 1968)


bezier-spline
Creates splines from cubic bezier curves.
This module fits a spline to a set of knots. The curves used are cubic Bezier curves, and the spline is G2 continuous. It is possible to specify C2 continuity as well if desired.
The theory behind the spline is not documented in the code, as it is too lengthy. Instead, the source code repository contains a PDF as well as a README in the theory/
directory that will give a better understanding of exactly what all that minified-looking source code is doing.
Install
$ npm install bezier-spline
Usage
To create a spline, pass in knots. For n
knots, n-1
curves will be produced.
const BezierSpline = require('bezier-spline')
let spline = new BezierSpline([
[1, 3],
[0, 4],
[5, 5]
])
You can access the control points of each curve with the curves
property. Curves are array-like with 4 elements, which are control points.
let bezier0 = spline.curves[0]
bezier0[0] // The first knot
bezier0[1] // The first generated control point
bezier0[2] // The second generated control point
bezier0[3] // The second knot
console.log(bezier0[0]) // [ 1, 3 ]
These points can then be fed to an api that understands cubic Bezier curves.
A large part of the point of this module is to be able to locate points on the spline by coordinate. For example, if we want to find where the spline above passes through y = 3.14
:
spline.getPoints(1, 3.14)
[ [ 0.8369150530498445, 3.1399999999999997 ] ]
Or where x = 0.5
:
spline.getPoints(0, 0.5)
[ [ 0.4999999999999999, 3.438251607472109 ],
[ 0.5000000000000002, 4.73728665361036 ] ]
Notably, the results are not exact. We're dealing with lots of floating point addition and inverting functions twice, so this is expected. These splines are not designed for precise mathematics.
Weights
IMPORTANT: You may want to read what's in the theory/
directory in the source code repository to get a better sense of exactly what the effect of these changes will be.
You can provide an optional second argument to the BezierSpline
constructor to set the scalar of the "initial speed" coming out of a knot. This argument may either be a function of the form
(i: number, knots: Array) => number
or an array of numbers that are precalculated weights. i
will be the index of the segment you are about to enter, and will start at 1
. The first segment is constrained by other restrictions and its weight cannot be set. The first element of the array, if that is what is provided instead, will be ignored. Here are some examples:
// Smooth transitions regardless of knot distances.
// Good for shapes. Bad for pathing/animation
new BezierSpline([[1, 1], [3, 4], [-1, 2]])
// C2 continuous spline. Ideal for pathing or animation
// but shape may not be ideal.
new BezierSpline([[1, 1], [3, 4], [-1, 2]], () => 1)
// Kinda nonsensical, but segments may get wilder
// or more curved for knots lower in the list.
new BezierSpline([[1, 1], [3, 4], [-1, 2]], (i) => i)
// Precalculated weights if you want very direct control
// over tweaking how fast a segment is.
new BezierSpline([[1, 1], [3, 4], [-1, 2]], [null, 1, 4])
If you're not fully sure what's happening here, please read theory/README.md
. As a general rule, the lower a weight is, the straighter the segment will be.
Bezier Curves
Individual curves can be solved similarly if necessary. at
plugs in a clamped t
value to the cubic Bezier equation.
// Yeah, it's not a very curvy curve, but it makes the math easy
let curve = new BezierSpline.BezierCurve([
[0, 0],
[1, 1],
[2, 2],
[3, 3]
])
curve.at(0.5)
[ 1.5, 1.5 ]
And inversely, you can solve for the t
values that correspond to particular values along an axis:
curve.solve(0, 1.5)
[ 0.5 ]


Run CIMAGE to analyze data
1. make a folder such as "my_experiment"
2. make a folder "dta" in the "my_experiment" folder
3. copy the converted "TAG_0?.mzXML" files to the "my_experiment" folder
4. copy the searched DTASelect-filter.txt files into the "dta" folder
and make sure that they have names like "DTASelect-filter_TAG_light/.txt" or "DTASelect-filter_TAG_heavy.txt",
in which "TAG" is the one you use to name those mzXML files.
5. go into the "dta" folder and run the "cimage" program by typing:
cimage     your-cimage-params-file    TAG.
Template cimage.params file and silac light/heavy chemical composition files can be downloaded here:
cimage.params light.table heavy.table
Light/heavy tables are strictly tab-delimited text files, so it is better to use EXCEL to import, edit and
then export it. Again, substitute TAG with your chosen name.
6. If it runs fine, it will generate a "output" folder in which there
will be a pdf file of chromatograph, a "to_excel" text file for your
editing in execel and a folder of "PNG" containing all individual
graphic files.
7. move to "my_experiment" folder and generate a html version of the
result by typing:
cimage_combine     [by_protein]     output_rt_10_sn_2.5.to_excel.txt
    dta
and this will generate a combine_dta.html and a raw text file combine_dta.txt. Skip the
by_protein option if you would like to by default group identified
peptides by their sequence instead of their parent proteins. There are
more flexible ways to combine multiple results folders into one master
list, and discuss with me if you would like to try additional options.
8. To compare ratios obtained by multiple different cimage runs, you can run cimage_compare program by typing:
cimage_compare     [by_protein]     file1     column1
    outname1     file2     column2     outname2
...
in which "file1" and "file2" are full names (with paths) of the two combined_dta.txt files to be compared,
"column1" and "column2" are names of ratio columns in each combined_dta.txt file, and "outname1" and
"outname2" are names of ratios columns when they are output into a tab-delimited text file side by side that
you can import to EXCEL for further analysis.
for example, if you like to compare protein silac ratios (column "mr.set_1" in combined_dta.txt files)
obtained from two experiments "exp1" and "exp2", the command to run would be:
cimage_compare     by_protein
/your-folder/exp1/combined_dta.txt     set_1     my_exp1
    /your-folder/exp2/combined_dta.txt     set_1     my_exp2
Upload CIMAGE data to Lab Database
1. Transfer your cimage data to the database server. On avatar type:
cimage_zip     /your-folder
"your-folder" is where the combined_dta.html file is generate and when prompted, type in the password to
complete the transfer
2. Add your transfered data permanently into lab database.


-
Fitness App Patches Privacy Vulnerability
threatpost.com
Details of a patched privacy vulnerability in MyFitnessPal, a popular fitness and nutrition mobile application, were disclosed this week, three ...
-
JQuery Website Redirecting to RIG Exploit Kit
threatpost.com
jQuery.com, website for the popular jQuery JavaScript library, is redirecting visitors to a site hosting the RIG exploit kit, security company RiskIQ ...
-
CVE Identifiers Make Room For a Few More Digits
threatpost.com
The deadline for a syntax change for CVE identifiers is coming on Jan. 13 when the four-digit format will support five or more. Vendors must update ...
-
Mozilla Patches RSA Signature Forgery in Firefox, Thunderbird, NSS
threatpost.com
Users of Mozilla products should update Firefox, NSS, SeaMonkey and Thunderbird in order to obtain fixes for a bug that could let an attacker forge ...
-
Bash Exploit Reported, First Round of Patches Incomplete
threatpost.com
Reports of the first in-the-wild exploits targeting the Bash vulnerability have surfaced, as have complaints the first patches for the bug are ...
-
Home Hacking Made Simple
threatpost.com
David Jacoby looked at all of the Web-enabled devices in his house--TV, game console, network storage device--and found a handful of exploitable bugs ...
-
Small Signs of Progress on DNSSEC
threatpost.com
The Internet hasn't been quick to adopt DNSSEC, for a variety of reasons, but experts say that there are some reasons to be optimistic about the ...
-
David Jacoby on Hacking His Home
threatpost.com
Dennis Fisher talks with David Jacoby of Kaspersky Lab about the research he did on the security of electronics gear in his home, including his smart ...
-
Travel Site Viator Announces 1.4 M Implicated in Breach
threatpost.com
Travel website Viator.com is in the middle of notifying approximately 1.4 million of its customers that their personal information – payment card ...
-
Health Insurance Marketplaces Could Improve Information Security
threatpost.com
The marketplaces set up to provide health insurance to Americans under Obamacare are generally doing a good job of protecting personally identifiable ...
-
Mozilla Latest to Part Ways With SHA-1
threatpost.com
Mozilla announced that it will begin phasing out support for SHA-1 certificates, and will no longer trust them after Jan. 1, 2017.
-
Blackphone Gets Bug Bounty Program Off Ground
threatpost.com
Secure smartphone manufacturer Blackphone announced today that it has launched a bug bounty program hosted on the Bugcrowd platform.
-
Malware-Laced Emails Appear to Come From LogMeIn
threatpost.com
Spam emails pretending to be a security update for LogMeIn users, including a new security certificate countering Heartbleed attacks, are making the ...
-
Productivity Gains Trumping Security as BYOD Grows
threatpost.com
A new study from Raytheon and the Ponemon Institute paints a grim picture for BYOD security, but one expert sees some straightforward solutions to ...
-
New Research Refines Security Vulnerability Metrics
threatpost.com
Research from the University of Maryland proposes new security metrics that can help enterprises understand risks to their products and prioritize ...
-
Threatpost News Wrap, September 19, 2014
threatpost.com
Dennis Fisher and Mike Mimoso talk abut the crazy news of the last couple of weeks, the Apple privacy and Apple Pay announcements, the details of the ...
-
Chinese Penetrate TRANSCOM Amid Lack of Data Sharing
threatpost.com
TRANSCOM, the Defense Department command that handles wartime military logistics was compromised repeatedly over a one-year span by a handful of ...
-
New Initiative Simply Secure Aims to Make Security Tools Easier to Use
threatpost.com
The dramatic revelations of large-scale government surveillance and deep penetration of the Internet by intelligence services and other adversaries ...
-
Dyre Trojan Caught In The Cookie Jar
threatpost.com
Researchers at Adallom analyzed a sample of the Dyre banking Trojan that was found to be targeting Salesforce.com credentials.
-
Apple CEO Tim Cook Says Company Dedicated to Protecting Users' Privacy
threatpost.com
While much of the tech community is still swooning over the iPhone 6, Apple Pay and Apple Watch, the company's top executive is spending a lot of ...
-
Rich Mogull on Apple Pay
threatpost.com
Dennis Fisher talks with Rich Mogull about the new iPhone 6, the security and privacy of Apple Pay and whether there's another company that could put ...
-
Drupal Patches XSS Vulnerability in Spam Module
threatpost.com
Drupal released an update that patches a moderately critical cross-site scripting vulnerability in its Mollom content and spam moderation module.
-
FreeBSD Patches DoS Vulnerability
threatpost.com
FreeBSD patched a vulnerability in the way the OS handles TCP packet processing that could lead to a denial-of-service attack on a server.
-
Government Requests for Google Data Up Again
threatpost.com
Google's latest Transparency Report reveals government requests for data jumped 15 percent from the end of 2013, and that nine countries requested ...
-
Adobe Gets Delayed Reader Update Out The Door
threatpost.com
Adobe released a new version of Reader and Acrobat, patching eight security vulnerabilities in the PDF reader. The patches were delayed a weeks ...
-
Back-and-Forth With Google Led to Disclosure of Android Browser Flaw
threatpost.com
The researcher who originally discovered the same-origin policy bypass in the Android browser said he reported the vulnerability to Google some time ...
-
NSA Director Rogers Urges Cyber-Resiliency
threatpost.com
NSA Director and Commander of U.S. Cyber Command, Admiral Mike Rogers, urged listeners at the Billington Cybersecurity Summit that cyber-resilience ...
-
Comcast Pushes Back Against Allegations it Will Cut Off Tor Users
threatpost.com
Comcast refutes reports that it is telling customers who use Tor that their service will be suspended or terminated.
-
Big Batch of Bugs Fixed in Various Versions of IDA
threatpost.com
The makers of the popular IDA disassembly and debugging tool have fixed more than a dozen security vulnerabilities in a variety of versions. Some of ...
-
Four Vulnerabilities Patched in IntegraXor SCADA Server
threatpost.com
Four different remotely exploitable vulnerabilities were recently discovered and patched in a popular SCADA server.


[1]
Easy mobile web navigation.; Horrible voice quality, Keyboard misaligned, Poor battery life.
[2]
Touchscreen,MobiTV,Touch response, Display quality,Slim Design,; No speed dial, Limited ringtones, message alerts,


Lei + Jing
Home
Love Story
When & Where
RSVP
Gallery
Blog
Modal title
Danger!
Please Enter meal plan for at least one person.
Modal title
Are you sure you want to submit the meal plans?
You Are Invited
Please RSVP and reserve your meal by December 2018.
Name
Email
Yes I'm attending
Family Group
name
Age Group
Main Course
Please tell us who are coming
Name
Choose Age
Adult
Toddler
Infant
Main Course
Choose Meal
Chicken
Salmon
add
Complete


--- layout: page title: "Projects" description: "My projects" ---
Posted by {% if post.author %}{{ post.author }}{% else %}{{ site.title }}{% endif %} on {{ post.date | date: "%B %-d, %Y" }}


Retrieves a list of pages based on the specified criteria
Pages vs. Tabs: For historical reasons, DNN internally refers to pages as "tabs". So, whenever you see a reference to tab or page, remember that they are equivalent. Values returned from Prompt will usually use DNN's internal naming conventions (hence tab), though Prompt's own syntax will usually use the word page instead of tab.
| Flag | Value | Required | Default | Description |
|---|---|---|---|---|
| --deleted | boolean | No | If true, only pages that have been deleted (i.e. in DNN's Recycle Bin) will be returned. If false then only pages that have not been deleted will be returned. If the flag is specified but has no value, then true is assumed. If the flag is not specified, both deleted and non-deleted pages will be returned. | |
| --visible | boolean | No | If true, only pages that are visible in the navigation menu will be returned. If false then only pages that hidden will be returned. If the flag is specified but has no value, then true is assumed. If the flag is not specified, both visible and hidden pages will be returned. | |
| --parentid | integer | No | The Page ID (Tab ID) of the parent page whose child pages you'd like to retrieve. If the first argument is a valid Page ID, you do not need to explicitly use the --parentid flag | |
| --name | string | No | Retrieve only pages whose name matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters. | |
| --title | string | No | Retrieve only pages whose title matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters. | |
| --skin | string | No | Retrieve only pages whose skin matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters. | |
| --path | string | No | Retrieve only pages whose path matches the expression. Can use the asterisk wildcard (*) to match 0 or more characters. |
list-pages
| TabId | Name | Title | ParentId | Theme | Path | IncludeInMenu | IsDeleted |
|---|---|---|---|---|---|---|---|
| 41 | Home | Home 3 | -1 | [G]Skins/Xcillion/Home.ascx | //Home | true | false |
| 71 | Page 1 | -1 | //Page1 | true | true | ||
| 42 | Activity Feed | Activity Feed | -1 | //ActivityFeed | false | false | |
| ... | |||||||
| 33 pages found |
list-pages 43
OR
list-pages --parentid 43
| TabId | Name | Title | ParentId | Theme | Path | IncludeInMenu | IsDeleted |
|---|---|---|---|---|---|---|---|
| 49 | Site Settings | Site Settings | 43 | //Admin//SiteSettings | true | false | |
| 50 | Extensions | Extensions | 43 | //Admin//Extensions | true | false | |
| 51 | Security Roles | Security Roles | 43 | //Admin//SecurityRoles | true | false | |
| ... | |||||||
| 18 pages found |
list-pages --deleted
OR
list-pages --deleted true
| TabId | Name | Title | ParentId | Theme | Path | IncludeInMenu | IsDeleted |
|---|---|---|---|---|---|---|---|
| 71 | Page 1 | -1 | //Page1 | true | true | ||
| 1 page found |
list-pages --path //Admin//*Management*
| TabId | Name | Title | ParentId | Theme | Path | IncludeInMenu | IsDeleted |
|---|---|---|---|---|---|---|---|
| 53 | File Management | File Management | 43 | //Admin//FileManagement | true | false | |
| 55 | Site Redirection Management | 43 | //Admin//SiteRedirectionManagement | true | false | ||
| 56 | Device Preview Management | 43 | //Admin//DevicePreviewManagement | true | false | ||
| 3 pages found |


Class: Truth::Configuration
Instance Attribute Summary (collapse)
-
- (Object) version
readonly
Returns the value of attribute version.
Class Method Summary (collapse)
Instance Method Summary (collapse)
-
- (Object) configuration
end the tree-climbing here.
-
- (Configuration) initialize(version)
constructor
A new instance of Configuration.
Methods inherited from Entity
#[], #[]=, dsl_class, #indices, #inspect, #render_to_file, #to_dsl
Methods included from Entity::Erb::ClassMethods
Methods included from Entity::Associations::ClassMethods
#context, #includes, #index, #key, #type_initializers
Methods included from Hookable
#emit, #get_hooks, #hook, #hook_wrap, #hooks
Methods included from Entity::Erb
Constructor Details
- (Configuration) initialize(version)
A new instance of Configuration
20 21 22 |
# File 'lib/truth/configuration.rb', line 20 def initialize(version) @version = version end |
Instance Attribute Details
- (Object) version (readonly)
Returns the value of attribute version
19 20 21 |
# File 'lib/truth/configuration.rb', line 19 def version @version end |
Class Method Details
+ (Object) clear
8 9 10 |
# File 'lib/truth/configuration.rb', line 8 def clear versions.clear end |
+ (Object) version(ver)
12 13 14 15 16 |
# File 'lib/truth/configuration.rb', line 12 def version(ver) versions.get(ver.to_i) do new(ver.to_i) end end |
Instance Method Details
- (Object) configuration
end the tree-climbing here.
25 26 27 |
# File 'lib/truth/configuration.rb', line 25 def configuration self end |


Chapter 14. Languages: To C or Not To C?
Chapter 15. Tools: The Tactics of Development
Chapter 16. Reuse: On Not Reinventing the Wheel


Instructional Student Assistant
B.S. in Electrical Engineering (Graduating Spring 2019), California State University, Long Beach
<EMAIL_ADDRESS>Bio
I am an Undergraduate Student at CSULB, with a particular interest in embedded systems, digital design and embedded programming. Most of my projects have been IoT projects, some in cooperation with the CSULB IEEE student branch as well as the Engineers for a Sustainable World student branch.
This website is intended to be a place for me to document my projects and share any work I believe may be useful to others.


I woke up before five to make my nine o’clock flight to China before heading to New Zealand. As we fly into Guangzhou, I can’t believe how many apartment buildings and skyscrapers there are pushing right up to farmland. When I arrived I almost go through immigration for locals and then immigration for domestic flights, until someone finally tells me how to apply for a 24 hour visa. After I’m approved, I stood in line behind what appears to be Guangzhou’s soccer team. Airport security walks through the men asking for signatures and taking pictures. When I make it past customs, there’s rows of people in red jerseys waiting for the team to leave the airport.
It turns out Southern China Airlines provides a free hotel room for travellers with long layovers as well as a tour. I forgo the tour thinking I’ll make it to Canton Tower myself. To my horror, I couldn’t find a currency exchange once I past customs, and nobody seems to understand what I’m asking (because I’m asking in English). I was expecting a Motel 6 kind of deal, but the hotel room is extrememly nice with two beds, a good speaker, and a waterfall showerhead. At this point I’m confused, extremely tired, and penniless. I only have 6 hours left before my shuttle back to the airport, so after chatting with another traveller from Los Angeles, I crash.
After my well needed nap I headed out armed with my MasterCard for some exploring and food. Unfortunately nobody accepted MasterCard, and even though I resigned myself to using an ATM, I couldn’t find an ATM that would accept Visa either. Maybe they, but everything is in Chinese and I have no idea what I’m doing. I spent the next hours walking the area around the hotel trying to soak up the little time I had left there. The smog is really bad and when the sun sets, lights from city gets stuck and the man made haze turns a sickening orange. I had heard about smog in China, and suffer from it to a degree in Los Angeles as well, but it’s unreal how thick it is.
I found a beautiful green park to walk through with a small hill and few ponds filled with lillipads and loud frogs. It’s a nice escape from the honking cars and high rise apartments that line the streets. This is my third city in as many days and life is starting to feel a little a surreal. Just a week and a half ago I was at home cuddled up with my cat and boyfriend and now I’m wandering the streets of a city where I can’t buy any food or speak to anyone. I miss my bed and the comfort of my home, but I’m excited for the upcoming weeks in New Zealand. Although I’m a little bummed I missed seeing the Canton Tower, I learned a valuable lesson about planning.
A final note on China: the Internet censorship. I had heard a little about it, like you can’t use Facebook, but it goes way beyond that. There’s no social media at all, google and it’s products like Google Maps are blocked. Accessing websites from outside China was extrememly slow and oftentimes failed. In order to use the free WiFi in the airport I had to scan my passport to get an access account. I found out the government prevents access to some Wikipedia articles and actively takes down content. I did a little research into how Chinese people feel about the censorship and apparently most of them are fine with it and even support it in some cases. My mom points out that the people answering the surveys might be afraid to speak against the government though. If you’re interested in learning more do some googling of your own (if you’re not in China).


AL TECHNOLOGIES gathers freshman and makes them work ready for the commpetetive market. It provides professional solution to the Government in implementing secure network & improving the rural telecommunication.
AL TECHNOLOGIES provides bestt in class telecommunaction solutions. You name it , we got it! After successfully completing many projects , AL TECHNOLOGIES is now aiming to outsource skilled resources to fulfill any needs in the sector of telecommunication.
Since it's inception in 2000 AL TECHNOLOGIES is spreading it's branches day by day, it has now a core competent team of 400+ lead personnel. Over the years we have worked with industries like Oracle, Augmendix , Brac.
There are some job openings currently going on. Join our team. Refer to the job page & then to the apply one for successful application.
Company at a glance


Boston’s Chinatown is rich with history, tradition, excitement, gifts, culture, and great food. Tourists flock from all over the world to see the Chinese culture behind Chinatown’s walls. Boston’s Chinatown is the third largest Chinatown in the United States, coming in behind New York (Manhattan) and San Francisco.
They are located conveniently at the edge of Boston’s downtown shopping and financial districts allowing you to walk right into the town. You will pass through the traditional Boston Chinatown’s opening gate when entering. It was designed to ward off evil using two foo lions on either side of the entrance gate.
You can celebrate many Chinese holidays throughout the year when you visit Boston’s Chinatown such as the New Year and other festivals for their culture. They welcome tourists, and provide the most when it comes to entertainment, food, and good old fashion fun. They have booths set up for games and gifts for the whole family. If you’re a tourist then this is the place to go to get souvenirs for the whole family back home due to the great items that are traditional, handmade, and affordable.
If you get hungry through your stroll on the streets, there are a number of great restaurants you can stop by to get a taste that only Chinatown has to offer. You will find Chinese favorites, exotic mixtures, as well as a few surprises behind each corner. If you would like to sit down, and relax in Chinatown; check out the teahouses that serve a number of different menu items. Boston’s Chinatown is fun for the whole family, or even if you want to walk through Chinatown’s streets alone; this is also possible. There are also no worries when it comes to spending a weekend in Chinatown; there are various lodging accommodations to meet your needs nestled in the heart of Chinatown.
There are so many things for you to do when you come to Boston’s Chinatown. It is packed with entertainment for the whole family. It does not matter where you’re coming from, why you have come, or where you’re going too, be sure to make Boston’s Chinatown one of your stops on the list of places to go while taking a vacation.


--- layout: home background: '/img/home.jpg' ---
The Australia Cuba Friendship Society (ACFS) aims to promote solidarity between Cuba and Australia and to support Cuba in achieving its socialist aims and principles.
Our Sydney branch runs as a result of the work of a core of dedicated people and is also supported by a small but active left media and by various trade unions. We are committed to continuing our work of promoting the Cuban revolution in all its facets and supporting demands for the end to the blockade against Cuba, the return of Guantanamo and the inviolability of Cuban sovereignty!


---
layout: post
title: The Image Dilemma
categories:
- Pharo
- Smalltalk
tags:
- development environments
- enterprise-it
- environment
- Image
- java python
- Living environment
- Pharo
- Smalltalk
- Snapshot
status: publish
type: post
published: true
meta:
_wpas_done_linkedin: '1'
publicize_results: a:1:{s:7:"twitter";a:1:{i:93753233;a:2:{s:7:"user_id";s:12:"GuillePolito";s:7:"post_id";s:18:"208346298900946944";}}}
_wpas_done_twitter: '1'
_wpas_mess: ! 'The Image Dilemma http://wp.me/p2tOYl-r #Smalltalk'
_wpas_skip_fb: '1'
tagazine-media: a:7:{s:7:"primary";s:0:"";s:6:"images";a:0:{}s:6:"videos";a:0:{}s:11:"image_count";s:1:"0";s:6:"author";s:8:"35633512";s:7:"blog_id";s:8:"36660125";s:9:"mod_stamp";s:19:"2012-06-01
00:29:04";}
reddit: a:2:{s:5:"count";i:0;s:4:"time";i:1366016034;}
_wpas_skip_facebook: '1'
_elasticsearch_indexed_on: '2012-05-31 23:56:36'
---
Without self knowledge, without understanding the working and functions of his machine, man cannot be free, he cannot govern himself and he will always remain a slave.
Goerge Gurdjieff
Many people I've talked to think Smalltalk is weirdy because it has an image. Funny thing is most people that thinks that, do it because they feel it's different. Or they do Java. Of course, Java and Smalltalk are different :). Okok, joke, I'm not interested in flamewars. Seriously what puzzles me is that normally people's opinion on technology is based on feelings instead of concrete rational arguments.
So, let's think a bit on the pros and cons of using an image and not using it. Really. Only after understanding a bit you can decide whatever you want to use. That's what the quote at the start is there for :).
Also, this post will be one of the corner stones to explain the bootstrap gsoc project basics later ;).
Non Image Based Development Environments
Ok, we all know these. It's the kind of environment we use when we code in C, Java, Python, Ruby, JavaScript and many other.
We have source files which will be somehow interpreted on runtime or traduced to machine code in an executable file. Naively explained, the interpreted ones normally depend on another program normally called interpreter or VM and the other ones depend only the first time on a compiler. So far, nothing strange.
Image Based Development Environments
Image based environments are the main topic of this post. But before talking about it's pros and cons, we have to define what is an image. And to avoid preconceptions, let's name them snapshots. A snapshot is a photo taken of a system in a moment of time x, from which we can rebuild the whole system again.
 If you save the state of your linux mint with virtual box, the next time you open it, it will wake up in the same state you left it. It will not start everything from scratch unless you tell it explicitly. And if you quit without saving, the next time will open without your changes.
It's a very simple concept: you are treating a whole running system (a linux machine in this case) as any of your other data files.
So that's how most of the smalltalk systems work: you have a running smalltalk system, and when you wake it up, it will start from where it was left. Even if you was in the middle of a computation, this computation will continue running.
Comparison
System Configuration
How heavy or reproducible is our system configuration?
non image based
When a program start it normally does some basic initialization, configuration loading, setup stuff... Every time our program does this same basic stuff. It's a repetitive task, but it's done by the machine, so I'm ok with it.
Even more, one of the advantages of loading the application again from scratch is that you are testing your building process. And having a working artifact after ensures that you will be able to rebuild it in the future following the same steps.
But have you ever wondered how much time takes a java class loader to load the classes you will use? And how much time takes Hibernate or Spring or JBoss to read your configuration, and provide an usable environment? And how about to compile a large C/C# application? Ok, those times are machine time. You can go to take a coffee every time you restart your tomcat, or change a source file with many dependencies. That time is not even important in a deployed product, since it is delayed to the user or webserver which may run it once every hours/days. But it is important some times. For example, when you are developing software. Software development is a highly demanding task which requires concentration.  And you can't avoid checking/compiling/testing your code for long periods of times because handling lots of changes only in your head it's a really hard task.
image based
When an snapshot is taken, the whole objects and computations that were occupying some memory in your program will be saved in a file in the state they were. Object references are not broken. Then, when you load your smalltalk snapshot again, the objects take place in memory, and continue working as they were. Normally there is not heavy initialization on image startup other than reallocating resources from outside the environment (files, sockets are OS resources and become invalid for sure when the system is halted). You don't have to configure almost none of your program neither, because it is already configured!
Now, since you don't have to reinitialize your configurations from scratch every time, maybe you initialized it, then accidentally deleted the method that performed the configuration. And then you are screwed, because if you want to start from scratch you will have pieces of your program lost that will make it impossible. This is why we may consider an image based system and evolving environment. Because the system is changed by mutations that may get lost or untracked.
The Development process
How is our development process altered by the environment we use?
non image based
- Write code in a file
- Compile or similar or however you want to call it :).
- Run the whole program from scratch
- Test
- Go to 1
This process is slooow. Specially because of steps 2/3. For every change you do, no matter if it is long of little, you have to rebuild everything and lost time with it, and reinitialize, and reconfigure... Even if you only wanted to replace a 2 by a 3, or fix a typo in a string.
However, there exist currently some tools that implement what they call hot deployment which is nothing else that exploiting some dynamic features that let a program change while it's running. But hey! That's what we do with an image based approach: we change the program while it's running.
Anyway, those extra steps makes you gain reproducibility by making some parts of the process a bit more explicit. At the cost of extra bureaucracy.
image based
- Open your image
- Write code
- Evaluate/Accept
- Test
- Go to 2
Here the main difference is that the modification of our program is made of little deltas during execution. We replace/change/create methods while our whole program is running. We create classes, objects, modify class hierarchies while our whole program is running. We alter our objects state while our whole program is running. This really improves the development process, since the time you have to wait to receive feedback from execution or testing is almost none. And there is less overhead, less context switch in your head.
Now the problem is that to reproduce our program we have to track all the little changes we've done. And understand them, and discard the ones that really overlap o do not make sense. In the Smalltalk System Pharo we have a .changes file that works as a log of the changes done. This changes file aims to reduce the impact of this dynamic feature disadvantages.
IDE's Features
Have you ever used an IDE with refactoring support, syntax highlighting, nice code browsing capabilities? What do our tools need in order to provide us all those gourgeous features?
IDE are meta-programs. They are programs that help us manipulate programs: modify them, understand them, query them. And to do that they can do it by:
- directly modifying source code without a model behind. Painful and Hard. I would never try to do it that way :).
- modeling the concepts of the language they will manipulate to make it easier.
non image based
A program's meta model (a model representing program entities such as classes or variables instead of domain entities like bank accounts and clients) is often generated when the program runs if you have reflective capabilities in the manipulated language. But IDEs should work while the program is not running, or even if it does not provide reflection. So, how does this approach build this kind of tools?
They have an alternative model and an alternative parser/compiler which generates this model from sourcecode. A lot of extra work is needed for information that is already there. The problem is that information is lost in text files with source code instead of being stored in a more malleable format.
image based
Our image based approach can contain all the meta information in the snapshot, alive, as first class objects. This means that we do not have to create a duplicated meta-model, nor an extra parser/compiler. We can use the ones that are alive in the image. We make use of the model created by the language, what we can't do in the non image based approach.
Files or no files
Some times you feel comfortable modifying files, some times not.
non image based
You have files with your source code. You can use them to execute/compile your program, you can store them in svn/git/bazar repositories, you can diff/grep/more/less/find over them just using a terminal.
I think this is the main pro over the image based approach. There are plenty of tools working on plain text files you can use if your source code lives in this kind of storage.
But try to write a program implementing an extract method refactoring over a piece of text. You have to write a very complex and large program analyzing classes, methods, scopes...
In two words: It's really cool to use existing tools. But it is not that nice to write your own.
image based
As the opposite of the not having an image, we can't just use our nice text manipulation tools on our image file. We have to rebuild them on our system, or externalize the source code in files to use them. And then re-insert the feedback in the system.
But there are other tasks-like refactorings and meta programming in general- that become very simple just by the fact of manipulating objects instead of text.
In the Pharo project there are plenty of existing and arising tools aiming us to interact with the outer world, just like:
Conclusion
As I've shown you, these two approaches have their good and bad stuff. None of them is the silver bullet, and we should be aware of that to be better developers.
I hope you are a little more free now ;).
さようなら!


Watch: Brits burn John Bercow in effigy at Bonfire Night bash
by EuronewsA giant effigy of the departing Speaker of the House John Bercow was burned at a Guys Fawkes night in Kent.
Edenbridge's Bonfire Society, which has a long history of burning effigies of celebrities and politicians, had prepared a 36ft-high replica of the Commons Speaker to burn on Saturday.
But organisers had to apologise after Bercow's head blew off in strong winds and they had to make do with burning that.
Guy Fawkes night is officially marked on 5 November and marks the night that Guy Fawkes, who was part of a plot to kill King James I of England, was arrested beneath the British Houses of Parliament in 1605 while guarding the explosives.
Bercow stood down after a decade as speaker of the House of Commons on October 31. He was a divisive figure in parliament particularly amongst Brexiteers on the right of the Conservative Party.


From the Death Certificate for Edward LeRoy Newhart
place of death: 306
N. Cory, Findlay, Hancock Co.,
residence:
PERSONAL AND STATISTICAL PARTICULARS
male, white, married to Mary E. Newhart
birth: July 4,
1876;*
age at death: 62
years 2 months 27 days
trade: ground man
for electric co.
father: George
Newhart, born
mother: Mary Jane Forsher, born
informant: Mrs. D. Abell;
burial:
funeral firm: W. G. Coldren Funeral Home
MEDICAL CERTIFICATE OF DEATH
date of death: Oct.
1, 1938
physician's statement: I
hereby certify, that I attended deceased from June 23, 1937, to Oct. 1, 1938, I last saw him
alive on Sept. 30, 1938, death is said to have occurred on the date stated above
at 3. a.m.
cause of death:
carcinoma of colon; date onset:
June, 1937
contributory cause: bowel
obstruction with toxaemia; date onset: July 1937
operation: colostomy,
July, 1937
test confirming diagnosis:
section
autopsy: no
disease or injury related to occupation: no
signature: T A. Spitler,** M.D.,
10/3/1938;
submitter's notes:
* The
July 4, 1876 appears to be an error based on all other known records.
**
Physician's signature was difficult to read and may be in error.
Provided by Betty Latta Kitchen
Click here for the Short-Cut Table of Contents


Are you sure you want to delete the application group {{applicationGroup.groupName}}?
{{applicationGroup.groupName}}


Week #4: Technical
The Map Method
Here's what ruby-doc.org has to say about the map method: Returns a new array with the result of running block once for every element in enum.
In other words, map allows you to create a new array from an old one.
Here's how the syntax would look:
Here are a few examples of how you might use it:
The first time I used the map method I was trying to sort an array of elements. The problem was that the array included both strings and integers so I couldn’t just slap a .sort on there and call it a day. I needed to go through all of the elements in the array and convert each of them to a string before I could .sort the array. My code ended up looking like this:
NOTE: this example worked fine for the array that I needed to sort but remember that once an integer has been converted to a string, it doesn’t sort the same way. For example, the string 10 is going to come before the string 2.


Simple State Capital Quiz
Test your knowledge in
State Capital
1. What is the capital of State of Texas?
a. Dallas
b. Austin
c. Huston
d. El Paso
2. What is the capital of State of Alaska?
a. Juneau
b. Anchorage
c. Kodiak
d. Fairbanks
3. What is the capital of State of Washington?
a. Bellevue
b. Sammamish
c. Seattle
d. Olympia
4. What is the capital of State of Kansas?
a. Kansas City
b. Topeka
5. What is the capital of State of South Dakota?
a. Rapid City
b. Spearfish
c. Harrisburg
d. Pierre


It's unlikely old age will be kind to Kalani David. The 14-year-old Costa-Rica-born- Hawaiian-pro-skater-slash-pro-surfer is looking very uncomfortable seated across from me at a roadside eatery in Bali. The World Junior Championships are on and as of yesterday, he is now the highest ranked surfer in the world for his age (having lost out in Round 4 to one of the event favorite's, Conner Coffin). His biggest battle at the moment, however, is trying to reach the fried chicken on his plate.
You're supposed to sit with your legs crossed in this restaurant, but due to the amount of scar tissue beneath his -knees legacy of the countless slams he's taken in the bowl- hat's an impossibility for David. "We're always wrapping him in ice," his father tells me later. "And I'm constantly watching his body and making sure he's got muscle on his bones for the slams. It's pretty nerve-racking, actually."
As David confronts the painstaking decision of whether to pursue a career in skating or surfing, you might think the injury toll alone would be enough to make up his mind. But you'd be wrong. "If it was life or death, and I had to choose skating or surfing, I 'd choose death," he says. So how exactly is he going to get out of this pickle?


General elements
A subtitle can go here
-
Orders 847
-
Reviews 223
-
New visits 7930
Sliders
Simple Slider
Ranged Slider (only min)
Ranged Slider (only max)
Ranged Slider
Vertical sliders
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon tempor, sunt aliqua put a bird on it squid single-origin coffee nulla assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic synth nesciunt you probably haven't heard of them accusamus labore sustainable VHS.
10
15
20
25
30
35
10
15
20
25
30
35
Warning!
Best check yo self, you're not...
Oh snap! Change a few things up and try submitting again.
Heads up! This alert needs your attention, but it's not super important.
Well done! You successfully read this important alert message.
Modals with custom content
Left tabs
Going home
And now to the profile
No new messages
Changing the settings
Right tabs
Going home
And now to the profile
No new messages
Changing the settings