Friday, August 12, 2016

Books I've Read in 2016

2016 Books

  1. A City of Broken Glass (Hannah Vogel Book 4)
  2. Mr. Penumbra's 24-Hour Bookstore: A Novel
  3. Shakespeare Saved My Life: Ten Years in Solitary with the Bard by Bates, Laura (April 2, 2013) Paperback
  4. The 13th Juror
  5. The Girl With All the Gifts
  6. Me Before You (2/14/2016)
  7. Poor Man’s Feast (2/20/2016)
  8. The Plain Choice: A True Story of Choosing to Live an Amish Life(2/21/2016)
  9. Mr. Mercedes (2/22/2016)
  10. Wild: From Lost to Found on the Pacific Coast Trail (2/24/2016)
  11. The Magicians (3/6/2016)
  12. Emergence: Labeled Autistic (3/26/2016)
  13. Through a Glass Darkly (4/14/2016)
  14. The Apprentice - Jacques Pepin (4/17/2016)
  15. Station 11 - April 30, 2016
  16. Where Memories Lie - 5/22/2016
  17. Boys in the Boat 6/21/2016
  18. The Night Circus 6/26/2016
  19. Trigger Warning 7/3/2016
  20. Bazaar of Bad Dreams 7/6/2016
  21. As She Left It 7/7/2016
  22. The Devil in the White City 7/23/2016
  23. Code Name Verity 7/24/2016
  24. When Breath Becomes Air 8/4/2016
  25. The Girls 8/5/2016
  26. Ready Player One 8/6/2016
  27. The Man in the High Castle 8/9/2016
  28. Siddhartha 8/10/2016
  29. Without Fail 8/11/2016
  30. Squirrel Seeks Chipmunk 8/12/2016
  31. The Martian 8/13/2016
  32. The Bell 8/14/2016
  33. Finders Keepers: A Novel (The Bill Hodges Trilogy) 8/18/2016
  34. Snow Crash 8/21/2016
  35. This Road I Ride: Sometimes It Takes Losing Everything to Find Yourself 8/21/2016
  36. Knitting Rules 1/26/2016
  37. Lessons from Madame Chic 1/25/2016
  38. No Time for Goodbye 8/22/2016
  39. The Road (Vintage International) 8/24/2016








Monday, July 7, 2014

Technologically Speaking in German

Recently, I have been working on resurrecting my German skills using a variety of online and audio tools based on the advice of language educators as well as drawing on my own prior experiences with language learning.  German was my first second language.  When I was seven years old, my father was stationed at an Air Force base in Germany.  We did not live on base, but instead lived in a neighboring German village.  So, I learned German both through immersion in the local culture, and through formal lessons in Elementary school.  Later, when we returned to America, I took a year of high school German, and worked with a native German speaker who had taken an interest in my education.  In between, I took a bit of Junior High Spanish too.  When I was 18, I married an Egyptian army officer and moved to Egypt, where I lived for three years.  So, Egyptian Arabic was my fourth language.  However, I am no longer fluent in any of my languages.  It seems, I can only maintain English and one other language at a time, and, if I stop practicing a language, I lose the ability to speak it.

An opportunity has arisen for me to potentially travel to Germany for work.  So, I have begun a concentrated effort to re-learn German. To help me, I am using Rosetta Stone, the Pimsleur Approach, Duolingo, iTalki, Anki, and a German language podcast.  I’m spending an hour or more every day on my German, with my study broken up amongst my various tools.  Each tool has its own benefits and drawbacks thus far.  To be honest, I’m not sure which I would advise you to choose if you had to limit your selection to just one.

This is one expensive tool.  I splurged and bought it when it was on sale.  It seems to do so frequently; so I would advise never paying the full $499 for it.  I love that it is simultaneously teaching me speaking, reading, and writing.  When I learned Arabic, I never became literate in the language.  So, I do appreciate that I’m learning to spell and read from the very start.  I also like how it has me use pictures and my intuition to figure out new words and phrases.  Essentially, the program teaches a few words, and then has you gradually figure out more based on elimination and logic.  The one thing that I’m finding difficult is that it does not formally teach grammar rules; so, at times things can get a bit confusing.  Because German nouns have different genders, and because German has both formal and casual forms of address, things can get a bit confusing at times.  Because I come to the course with a bit of a German background, I know why the articles and pronouns are changing, but if I were learning the language for the first time, I wonder if I wouldn’t be totally lost.  I hope to someday try to learn an entirely new language with Rosetta Stone and see how it goes.

The things I like about Duolingo are that 1) It’s free.  2) It explains the grammar rules. 3) It motivates me through points and levels.  I am finding that it seems to move a bit more quickly than Rosetta Stone in some areas, and I’m not sure that it is as good as Rosetta Stone in reviewing past skills so that they don’t get forgotten.  On any given day, I spend about 10-15 minutes with this tool.  

This is another free tool.  And, it’s not exactly a language course.  Anki is a flash-card tool that uses spaced repetition to help you memorize and retain new information.  In the past, I have used it to study the US presidents, state capitals, Oscar-winning movies, etc.  For my German practice, I have downloaded a flash-card set of the 1000 most commonly used German words and phrases.  I have learned from my research in foreign language acquisition that mastering a small subset of the language can be enough to achieve fluency and comprehension.  With Anki, I am learning random words rather than working on my conversational German.  But, I have found spaced repetition works very well for me, and I consider this to be a good supplement.

This is another expensive tool.  And,I find the official website to be a bit spammy in their sales approach.  They offer the intro materials for $10, but want you to sign up for automated shipments with a payment plan.  However, Pimsleur CDs can be found used or in some libraries.  The Pimsleur approach seems a bit more old-fashioned.  It is an audio-only method that strives to teach basic conversational phrases.  I tend to prefer Rosetta Stone’s approach which allows me to read and write at the same time.  BUT, I am finding that the Pimsleur CDs are helping my pronunciation a great deal.  The course deconstructs the words, which seems to help me to hear the sounds more clearly.  I don’t think I would recommend buying this program, but, if you can borrow it from somebody, it can be helpful.

This is a site that could  be brilliant, but thus far, I have found it to be the least helpful.  I am not willing to pay for a private tutor or conversational partner just yet, and I have been unable to find a free conversation partner for German.  For some reason, I have been approached by several Arabic men who were seeking language partners.  I’m not sure if it’s because iTalki integrates with Facebook, or if Arabic men just end to pounce on English speaking women.  I’m going to reserve my judgement on this tool until I have had some more time with it, because I have heard it can be quite helpful.


On My Own
In Germany, I learned my German by playing with German children.  In Egypt, my neighbor had twin toddler boys.  As they learned to speak, I learned along with them.  (They quickly surpassed me.)  Spanish is the one language that I learned only in a formal classroom setting, and it was always my weakest language.  So, on my own, I have been seeking out German videos for children.  Sesame Street has a German website, and there are many YouTube videos available.  I have also found some free children’s books for my Kindle.  I don’t think these tools will help me build up a professional vocabulary for work, but they the more I listen to them, the more I understand.  Once I become more fluent, I will move to more adult themes, such as German news broadcasts and topical podcasts.



I love that there are so many free ways to study a foreign language online now.  Because I know I have a tendency to forget my old languages as I learn new ones, I hope to add in some DuoLingo work on Arabic and Spanish in the near future.  I am interested in seeing if it is possible for me to successfully shift between multiple languages at the appropriate times.  Finally, I think I would like to try to pick up a totally new language next year, and see how well the tools fair with that.  

Thursday, February 13, 2014

Integrating TeamSupport Issue Tracker With PHPStorm

While working at WizeHive, I loved how FogBugz integrated so very nicely with PhpStorm.  By creating 'tasks' in PhpStorm, I was able to rapidly switch git branches and open files simply by selecting the desired task.  This enabled me to quickly jump to a specific issue if it moved up in priority (Usually because somebody was standing at my desk asking about it.)

Back at SleepEx, I'm using TeamSupport.  Nobody seems to use it, and it has no integrations with any tools, but it's what I'm stuck with.  So.  Here's how to get tasks working with TeamSupport.

1.  You will need your TeamSupport OrgId and API Token.  If you've used the Team Support API at all, you will already have this.  Otherwise, you will need to get it from whomever manages Team Support at your company.

2.  Next, you need to set the Task preferences in PHP Storm to extend the timeout.  The Team Support API is quite slow.  Without the change, you won't be able to get things working.  To do this, Open preferences in PHP Storm, and go to the tasks section.  Make sure you are using the cache, and set your timeout value quite high.


3.  Now, you are ready to add the Task Server.  In the PHPStorm Tasks preferences, go to the servers section. Add a Generic Task Server. The URL is https://app.teamsupport.com.  Make sure you turn on HTTP Authentication.  The username is your Team Support OrgID and the Password is the API Token.

4.  Now, go to the Server Configuration tab.  Here, I was trying to limit the number of tickets queried as much as possible to try to improve the speed.  You may want to use the API reference to modify your queries.  The bracketed options in the API [gt], [not], etc. did not seem to work for me here.

Task List URL: https://app.teamsupport.com/api/json/Tickets?IsClosed=False&TicketTypeName=Bugs&TicketTypeName=Features&GroupName=Development

Single Ticket URL: https://app.teamsupport.com/api/json/Tickets?TicketNumber={id}  (I used the TaskNumber rather than the ID because the Task Number is clearly visible on the Ticket screen and is the one that most people use when discussing an issue.)

Response Type: Json

tasks: Tickets
id: TicketNumber
summary: Name


5. Now, you are ready to use the Tasks.  You can easily associate a task with a Git commit message, and have your Team Support TicketNumber embedded into your commit messages.  By using a context for each task, the editor will remember which files to have open along with the appropriate Git branch for any given task.  






Friday, October 25, 2013

Sorry, Apple. It's Too Little Too Late

When iBooks first came out, I had an iPad and an iPhone.  But, I didn't buy an iBooks because I couldn't access them on my computer like I could my Kindle books.  At some point, my husband took over my iPad, and I got an Android phone.  Now, with Mavericks, Apple allows us to read iBooks on our computers.

But, I'm still not buying any.  Amazon lets me view my books just about anywhere and always has.  Android phone?  Check.  Apple iOS device?  Check.  Computer?  Check.  Web browser?  Check.  And, most importantly, on my beloved Kindle 2.

Maybe if Apple had allowed me to view my books on the computer when they first came out, I would have been tempted.  But now?  Nope.  Sorry, Apple.  I'm sticking with Amazon.

Monday, July 29, 2013

Framework Free

I've come to the conclusion that frameworks are making me lazy - and worse yet, stupid. Because I use abstractions all the time, I am completely unfamiliar with some very basic things. So, I'm working to fix this.

A friend asked me to write a little app that allows her to create questions about her life and track the responses. I could probably hack this thing out with CakePHP in a very short time, but I'm forgoing a framework. I'm doing this completely from scratch and using BDD to guide the development and refactoring.

In order to get more bang for my buck, I'm using this little app as my final project for Coursera's Startup Engineering class. This means, the race is on to get this thing finished and deployed so that I can compete for glory.

This little project is all about doing things I've never done before.  I'm using CodeceptionComposer, and the Facebook PHP SDK.  I'm throwing in some AngularJS, and working on securing a REST API.  And, to keep myself honest, I'll be sharing the little project on Github.

Thursday, May 31, 2012

In Defense of Programming Puzzles

A few days ago, I read an article on Hacker News, Spare me your puny little coding contest, earthling! that panned programming puzzles as being a waste of time. The author, Adrian Scott, said he would rather be working on real-world projects that people will use. While I'm a huge fan of creating software with a purpose and an audience, I do think programming puzzles have their place. And, I recently used a programming puzzle with great success while recruiting a new junior programmer for LabRetriever.

Hiring junior developers can be tricky. You don't generally need a lot of prior experience for junior developers. And, you may not necessarily care if they have a degree. But, you do want people who have an aptitude for programming and problem-solving. In cases like this, a programming puzzle is a good gate-keeper to help find people who can think logically and use the basics of your language of interest. Once they get past the puzzle, you can bring them in for a personality and technical interview and see how things go from there.

In our small company, HR doesn't screen resumes from applicants. So, every email I receive from a recruiting company, an unqualified person, or somebody who is filling out applications to meet an unemployment quota is a waste of my time. Recently, I posted an ad on Craigslist seeking a junior programmer. Initially, I tried a standard ad. I listed our benefits, the job requirements, etc.. I didn't get many quality responses, but quite a bit of spam from freelancers and recruiters. So, I pulled that ad and replaced it with the following puzzle:



/****************************************************************************/
/* I need a full-time junior web application developer who can work on-site */
/* in the Philadelphia subburbs. Recruiters have been driving me batty by */
/* responding to previous ads even though I politely ask them not to. So, */
/* in an effort to speak directly to my people - I am posing this ad as a */
/* programming problem. I would very much like to hear from entry-level */
/* applicants who are looking for a job where your brains and creative */
/* problem solving skills are admired and respected. */
/****************************************************************************/

function who_are_you(){

// We are a small company that provides specialized, web-based medical software
// to our growing list of clients. We offer flex-time, health insurance, 
// and a casual work environment. You can contact us at:

$cache = array();
$web_site = how_do_i_apply($cache);
$pay_rate = what_are_you_willing_to_pay($cache);


}

function what_are_you_willing_to_pay($cache){
// We are willing to pay up to :
return (typical_college_recursive_function(10,$cache) + 15) * 1000;
// for the right person

}


function what_are_the_job_requirements(){

//1. You should be able to write a basic web application in either php, python, ruby or node js.
//2. We use php and MySQL, but are willing to train the right person.
//3. You need to be a competent writer. We will expect you to document your work clearly.
//4. You need to be authorized to work in the United States. We do not offer any Visa sponsorship
//5. Until you are fully trained, you'll need to work in the office every day. After that, we are open to telecommuting once a week.
//6. To show give us a hint of your skills, we are going to ask you to post the answer to this problem
//7. Along with your resume, at the specified location



}


function how_do_i_apply($cache){

// Calculate the email address that you need to mail your resume and the source code for your solution to.

$key = typical_college_recursive_function(6,$cache);
$key += 25 + (5%6) + 3 - 28;
$code = "ue@fyrrcrk.pbz";
return(give_me_the_email_address($key, $code));



}

function typical_college_recursive_function($n,$cache){

if($n <=2){
return 1;
}else{
if(isset($cache[$n])){
return $cache[$n];
}else{
$cache[$n] = typical_college_recursive_function($n-1,$cache) + typical_college_recursive_function($n-2,$cache);
return($cache[$n]);
}
}



}

function give_me_the_email_address($key, $code){

// Ok. Here is where you come in. This function should decipher the code using the key we provide.
// It's a basic Caesar cipher that shifts the letters of the alphabet based on the value of the key.
// Example: For a key 3 , A = D, C = F, R = U. The decrypted cipher will be the email address that you need.





}


who_are_you();







I didn't include an email address for a response. Within a day or two, the applications started coming in. Every resume was from a viable applicant who could do enough basic PHP to reason out the email address. I received no spam at all. I did receive a few submissions from people who didn't want the job, but thought the puzzle was fun. We got quite a kick out of those around the office. So, programming puzzles may not be for everybody. But, I loved how well one worked for us.

Sunday, January 29, 2012

The Case of the Missing "Close" Button on a JQuery Tools Overlay

I have a button on a page that may or may not be there. When I clicked the button, I wanted a JQuery Tools Overlay to pop up with some information and links. Because the button may or may not be there, I had to create the overlay programatically. I found information on doing so here: http://flowplayer.org/tools/demos/overlay/trigger.html So, on my page, I created a div for the overlay as such:
And, in the function called by the button's on click event, I added this:
 $('#interp_pool_div').html(doctor_selection);
 $('#interp_pool_div').overlay({
            oneInstance: false,
            mask: '#dcdcdc',
            effect: 'apple',
           });
               
         $("#interp_pool_div").overlay().load();
This worked well, except for one thing - the close button didn't appear the second time that I opened the overlay. Also, I was a but worried about memory leaks caused by repeatedly creating the overlay. It turns out that because I was putting the data directly in the overlay div, the second time it ran, it was overwriting the html for the close button. So, the answer was to put a second div inside the overlay div and then load the content into that one. I also but a simple check around the code that creates the overlay to avoid creating it a second time. So, the final working code appears as such: In the HTML:
In the JavaScript, outside the onclick function:
 var overlay_exists = false;
In the function called by the button click:

$('#interp_data').html(doctor_selection);
                              
if(overlay_exists === false){
     $('#interp_pool_div').overlay({
          oneInstance: false,
          mask: '#dcdcdc',
           effect: 'apple',
           
         });
         overlay_exists = true;
}
$("#interp_pool_div").overlay().load();