Wednesday, September 5, 2012

Terminal Style for Calibre

I am no frontend designer, but this works for me. Resembles a terminal, a lot easier on my eyes. :)

I like calibre. Cheers!

body {color:rgb(50,999,50) !important; background-color:rgb(0,0,0) !important; text-align:justify !important; margin-top:0px; margin-bottom:4px; margin-left:50px; margin-right:50px; text-indent:3em !important;} h1, h2, h3, h4, h5, h6 {color: red !important; text-align:center !important; font-style:italic !important; font-weight:bold !important;}

Wednesday, August 22, 2012

Don't Forget, Bugs Can Be Environment-specific Too

Fun With Play Framework

I recently heard a lot of great stuff about the Play Framework so I decided to download it and play with it. The tutorial seemed rather simple, I figured I would just breeze through it. Nope. Not at all.

Running play on its own worked normally as it should; creating a new application via play new worked as it should. Running play in the app directory is where it failed.

error: error while loading , error in opening zip file [error] scala.tools.nsc.MissingRequirementError: object scala not found. [error] Use 'last' for the full log. Project loading failed: (r)etry, (q)uit, (l)ast, or (i)gnore? 

Interesting. I dug deeper and thought it was due to Play's bundled version of sbt. So, I installed a version of sbt. I tried a "hello world" test with it and got the same error. Aha! So it must be a bug with sbt. No, not really. I google'd and stumbled upon Howard Guo's blog and read that he too was running openSUSE. Ah, now that's where it all hit me! I loaded Play on my old Ubuntu box and bingo all is well! Sheesh.

The Bugzilla entry says this bug probably won't be fixed since it's in openjdk 1.6.0, but luckily the fix is easy enough!
That's quite unfortunate - please type
chmod 0644
/usr/lib64/jvm/java-1.6.0-openjdk-1.6.0/jre/lib/ext/gnome-java-bridge.jar
as a root as a workaround. I doubt we will release any new maintenance update
of openjdk6 in the future.

Friday, July 6, 2012

PHP: The Language You Love And Hate

tl;dr

I use PHP and find that it works well for most jobs, but for others, not that great. Use the language that best fits the job!

PHP in the critic spotlight lately

Quite a few "PHP is good" and "PHP is bad" posts lately; even from people who, like me, use PHP, love it, and also hate it, have come out to say a thing or two. 

Well, if you read veekun's post, he's got something going there that I really want to point out, even though it really wasn't meant for the way I'm thinking about it; it's the toolbox. As engineers, it is our responsibility to build things. You can hammer in a nail with a wrench (haven't we all done that once before?), but obviously you should have used a hammer. Heck, you can even use a nail gun if it does the job better.

Languages Are Engineers' Tools In Their Toolbox

No, really. The more you know, the more knowledgeable and versatile you will be. And obviously if you have that knowledge, you'll know what "tool" is the right one. Steve Yegge's post on interview phone screens tells a wonderful tale of this. 
"Many C/C++/Java candidates, even some with 10+ years of experience, would happily spend a week writing a 2,500-line program to do something you could do in 30 seconds with a simple Unix command."
I'll let you read the article for the complete story, but it essentially explains that you can do a search and replace in many ways, but if you don't know how to use grep or python or even php you would be wasting lots of time on a quick job.

Now, I'm not saying to go and learn all the languages out there. I'm just saying that maybe knowing a little bit of a compiled language, scripting language, and a frontend language would help you understand better the full stack of whatever you are working on.

Wednesday, April 18, 2012

FezBook Update: Added a Java Library

FezBook Java Library

I shouldn't need to say anything more than the title right? Well anyhow, my little FezBook Library that I've been using is also now available in java. Exciting! You can check it out on my github FezBook repository.

Why?

Well, why not? Hehe :) Honestly, I've been working on a backend service and java seemed like a nice fit. I haven't had the chance to drop a javadoc anywhere, so be patient. I may just end up adding the phpdocs and javadocs in the repository itself.

ymmv

Well, just try it and see. Same thing with the PHP version, you'll need to do your own OAuth or already have your access token. Enjoy!

Wednesday, February 29, 2012

Grepping for Control Characters

"\t Will Not Work"

Plain and simple, send a ^v before the control character you want. ;)

What happened there?

Say for example you want to grep for lines in a file that have tabs. You've tried grep '\t' yourfile to all avail and it's just not working. Well, you're close, you actually want to send a tab. To do so, use ^v (control + v) and then send an actual tab:
grep '^v[tab button]' yourfile

This seems to be a common question from people and a coworker just dropped in to ask, so here ya go! Cheers!

Thursday, December 8, 2011

Python CSV Parsing

If you haven't realized already, I live and breathe in a command-line world. That's not even just talking about my work-related things; even when helping out helping out someone who is running Windows I will do majority of the things I need to do in the cmd prompt. Anyhow, I'm starting to ramble...

I also sporadically get some data sent to me in csv (or I will convert it to csv format). Now, if you have done this enough times, you'll obviously want to have some sort of csv parser. And what do you know, voila! I've got a simple one here for all of my command-line junkies out there!

csvreader.py is short enough to be available as a short gist on github. --My first activity on github by the way!

I'm sure you'll all find a nice way to use that. If you were curious what I ended up doing, well here's a generic code snippet: for f in `python csvreader.py tmp/b.20111208_1042.csv 0`; do echo $f; php postInfo.php /mnt/$f; done;

Cheers!

Sunday, October 2, 2011

Decoding the "Ghost in the Wires": Chapter 01

Quick Intro

I recently just finished Kevin Mitnick's Ghost in the Wires. Excellent read! I highly recommend! The cryptic text got my attention and I decided I wanted to give a crack at them. Let's see how far I can get before I give up.

01 Yjcv ku vjg pcog qh vjg uauvgo wugf da jco qrgtcvqtu vq ocmg htgg rjqpg ecnnu?

I wrote a simple Caesar cipher C program, called rotn that I can pipe in some text.

for n in {1..26}; do cat ~/tmp/ghost01 | rotn $n; done
Zkdw lv wkh qdph ri wkh vbvwhp xvhg eb kdp rshudwruv wr pdnh iuhh skrqh fdoov?
Alex mw xli reqi sj xli wcwxiq ywih fc leq stivexsvw xs qeoi jvii tlsri geppw?
Bmfy nx ymj sfrj tk ymj xdxyjr zxji gd mfr tujwfytwx yt rfpj kwjj umtsj hfqqx?
Cngz oy znk tgsk ul znk yeyzks aykj he ngs uvkxgzuxy zu sgqk lxkk vnutk igrry?
Doha pz aol uhtl vm aol zfzalt bzlk if oht vwlyhavyz av thrl myll wovul jhssz?
Epib qa bpm vium wn bpm agabmu caml jg piu wxmzibwza bw uism nzmm xpwvm kitta?
Fqjc rb cqn wjvn xo cqn bhbcnv dbnm kh qjv xynajcxab cx vjtn oann yqxwn ljuub?
Grkd sc dro xkwo yp dro cicdow econ li rkw yzobkdybc dy wkuo pboo zryxo mkvvc?
Hsle td esp ylxp zq esp djdepx fdpo mj slx zapclezcd ez xlvp qcpp aszyp nlwwd?
Itmf ue ftq zmyq ar ftq ekefqy geqp nk tmy abqdmfade fa ymwq rdqq btazq omxxe?
Jung vf gur anzr bs gur flfgrz hfrq ol unz bcrengbef gb znxr serr cubar pnyyf?
Kvoh wg hvs boas ct hvs gmghsa igsr pm voa cdsfohcfg hc aoys tfss dvcbs qozzg?
Lwpi xh iwt cpbt du iwt hnhitb jhts qn wpb detgpidgh id bpzt ugtt ewdct rpaah?
Mxqj yi jxu dqcu ev jxu ioijuc kiut ro xqc efuhqjehi je cqau vhuu fxedu sqbbi?
Nyrk zj kyv erdv fw kyv jpjkvd ljvu sp yrd fgvirkfij kf drbv wivv gyfev trccj?
Ozsl ak lzw fsew gx lzw kqklwe mkwv tq zse ghwjslgjk lg escw xjww hzgfw usddk?
Patm bl max gtfx hy max lrlmxf nlxw ur atf hixktmhkl mh ftdx ykxx iahgx vteel?
Qbun cm nby hugy iz nby msmnyg omyx vs bug ijylunilm ni guey zlyy jbihy wuffm?
Rcvo dn ocz ivhz ja ocz ntnozh pnzy wt cvh jkzmvojmn oj hvfz amzz kcjiz xvggn?
Sdwp eo pda jwia kb pda ouopai qoaz xu dwi klanwpkno pk iwga bnaa ldkja ywhho?
Texq fp qeb kxjb lc qeb pvpqbj rpba yv exj lmboxqlop ql jxhb cobb melkb zxiip?
Ufyr gq rfc lykc md rfc qwqrck sqcb zw fyk mncpyrmpq rm kyic dpcc nfmlc ayjjq?
Vgzs hr sgd mzld ne sgd rxrsdl trdc ax gzl nodqzsnqr sn lzjd eqdd ognmd bzkkr?
What is the name of the system used by ham operators to make free phone calls?
Xibu jt uif obnf pg uif tztufn vtfe cz ibn pqfsbupst up nblf gsff qipof dbmmt?
Yjcv ku vjg pcog qh vjg uauvgo wugf da jco qrgtcvqtu vq ocmg htgg rjqpg ecnnu?

Did you see the decrypted text? These should be fun. Let's see how long it will take for me to crack the next chapter. 8)

Oh, and yes I will publish the code for my Caesar cipher program for those curious. Just give me some time, I've been fighting to not open a github account, but I think that's a decent option as of now.

Sunday, September 18, 2011

Pyweek Post Mortem

Pyweek Was Brutal

Pyweek: a week long contest to develop a game in python. Sounds fun right? I thought it did. I'll tell you right now, that it was brutal; but ultimately, even though I didn't even submit my code for review, I think I accomplished a lot.

Pyweek Objectives

You have one week to develop a game in python. The contest's theme is voted on one week before the contest starts. This keeps things fair so there is nobody working on their projects before the contest starts. You are allowed to use any libraries specified on pyweek's rules page. All graphics and music must be created by you for the contest. That's about it in a nutshell, there's a lot more detail on the pyweek site.

My Objectives

  • Learn a python game library.
    Yes, that's right, I entered a contest to learn. I like challenges and feel like I needed something like this to push me to learn.
  • Survive.

You really need to use the entire week

One week. That's all you get. From 00:00 UTC September 11 until 23:59 UTC September 17 is all the time you will get. Now, to paint a picture of my week, here was what my schedule looked like:
Sunday: housework all day, ~10pm EST start some pyweek work write up some game ideas
Monday: work -- start getting sick, though a little bit of pygame learning
Tuesday: work -- still sick
Wednesday: work --still sick
Thursday: work --still sick, but able to do a little bit of pygame tutorials to keep learning
Friday: work - pyweek work
Saturday: pyweek work
Fighting a cold for time is seriously an uphill struggle. If you're sick, stay in bed to rest up.

A Failure at Pyweek, A Success At Learning

So as I stated earlier, I never even submitted my code for review. I was not able to get as far as I would have liked to, though for my objectives, I think I did well. The theme for Pyweek was "mutate"; I had a basic idea and I tried to keep things simple, but apparently not simple enough. Well, not simple for someone who is just learning the pygame library.
I learned a lot in this short time and I am ultimately happy that I at least have something a little bit playable. Crappy, yes. But hey, I made it and I made every piece of it; from code to background music, to little character gifs, I made them all. And for that reason, if someone ever asks me if I've ever created a game, "why yes! yes, I did!" You can checkout my Pyweek diaries here and check out all of the entries here. There are some really awesome games out there, go check them out! Congrats to all Pyweek contestants!

Wednesday, August 3, 2011

Python: Reading and Running Commands From A File

So I recently came across a broken process that needed some manual re-running. I was able to search through the log files and then see what part needed to be re-run. I ended up with a new data file (that I modified) to be a list of each command that failed for each iteration. So, the file looked something like this:
/path/to/program -option x -site a
/path/to/program -option x -site b
...
/path/to/program -option x -site z



Using a bash for line in `cat command.file`; do $line; done would not work since I would end up with a
-bash: -option: command not found
-bash: x: command not found
-bash: -site: command not found
error. So, here's some quick Python that can get the job done:

import os

f = open('/tmp/tmp-fix.commands')
for line in f:
    print line.rstrip()
    os.system(line.rstrip())


Yay for saving me some time! Cheers!

Tuesday, August 2, 2011

ffmpeg: Creating A Single Image Video With Audio via CLI

Here's a nice quickie for you command line junkies. So say you wanted to share an audio file, but for sites like Facebook or Google+ you only have an option to upload a video. Okay sure, just create a video with the audio embedded.

My friend left me a hilarious voicemail a while back that I wanted to share with friends. I also wanted to set an image to constantly display just for viewing pleasure. So, bake the image to loop add in the mp3 voicemail and voila!


ffmpeg -loop_input -i Downloads/P1010155.png -i Downloads/30ad00fa24c1dcdf7479271f290c82252216718a.mp3 -shortest tmp/output.mp4

Friday, July 29, 2011

Google Music vs. Amazon MP3 (so far at least)

So Google Music finally built a linux-compatible music manager, so I finally got started playing with Google Music. Amazon MP3 has a similar gripe with linux, but they at least allow uploads via the Amazon Cloud Drive.


Side By Side

So far the breakdown goes as follows:
- Google Music does not have a web-based way to upload my music
+ Amazon MP3 (though through Amazon Cloud Drive) can do web-based uploads
- Google Music does not have a way for me to download my music (really?! but, they're my files!)
+ Amazon MP3 has a download ability (a little buggy for linux users it seems, but it's there)
- Google Music capped my music library (is this just for beta?)
+ Amazon MP3 [so far] has given me unlimited storage for music. (this is basically paid for though, since I have purchased Amazon MP3 music)


I still can't eliminate carrying around local mp3 files on my phone since NYC subways don't have internet access [yet]. But, having the ability to stream through my albums is super helpful whether at work, home, at a friend's house, etc.


Cheers!

Tuesday, July 26, 2011

Python: Getting Line Counts of Files and Reading Directories

I have a bunch of little scripts to help out with day-to-day tasks (don't we all?). For some reason, (probably because I've been busy) I never posted anything tagged with "python". Whoa! Sharing is caring, so here it is.


import sys
import os

def lines_in_file(f):
    return len(open(f).readlines())

files = os.listdir(sys.argv[1])
totalcount = 0
for f in files:
    totalcount += lines_in_file(sys.argv[1] + f)

print totalcount

Why would this be helpful?

Well, it may or may not to you, but maybe you're just looking for a python example on how to get a line count of a file:
def lines_in_file(f):
    return len(open(f).readlines())

Or maybe, you're just looking for a python example to list files in a directory:
files = os.listdir(sys.argv[1])
for f in files:
    print f ## modified from the original script, to show you an example

How I Use It In Case You Were Curious...

So, we have this one cron job that parses through a directory that contains CSV files. So essentially, each line is a python run. Or I can also think of it as, X number of accounts are participating in Job Y.

That's it! Cheers!

Wednesday, July 20, 2011

Google+ Blurb: After I Logged Into Facebook

So I had to log in to facebook for some fun app debugging today (code rolled out today btw, yay!) and decided to poke around and see what's going on there and...not missing much at all! I've heard some chatter about Google+ being too noisy, but I seriously think facebook is noisier. Yes, the "main" stream on Google+ is definitely noisy, but you gotta remember that's all of your circles! To be honest, I pretty much only check my circle streams to filter out cruft. "What are my friends up to?": friends circle; simple. Doing the equivalent in facebook... I technically can do that, but that's only in those fb groups; otherwise, I need to go to each of my friends' pages and stalk see their recent activity, etc. but even in doing that, I'm already seeing too much. I could really care less if my friend likes "Nose-picking" or "I leveled up in Farmville". I can probably go on, but i won't. Just my $0.02. 8-)


P.S. I do, however, miss one thing: band/musician updates. I started following bands on facebook to get updates on new shows, albums, etc. here, it's all technology (for now).

Tuesday, July 5, 2011

There's a Bikeshed In The Forest

Into The Forest We Go

So lately I've been inundated with a (IMHO) very aggressive project schedule; and when I say "project", I mean projects plural since the ending of the first one overlapped with some of the discovery & design portion of the second one. Which is fine, since I've done that many of times. Though, somewhere along the schedule of the second project I started having more and more bikeshed'ing talks. Be it that I was busy or if I wasn't completely focused due to personal reasons, I fed into these bikeshed'ing talks and they kept coming and I sunk like quicksand.


Painting the Bikeshed

For those of you who come from a BSD background, you all have probably heard the "painting the bikeshed" phrase. If not, go and give it a read; even if you aren't part of the *nix scene or even if you're not an engineer; the thread will shed some light on managing projects whether personal or work-related.

Anyhow, in a brief summation: somewhere, somehow, I got sidetracked with tasks of changing certain language of front-end and etc. design-related issues as opposed to working on core-code functionality. In turn, the project needed to delay a bit.

Lesson learned: Be more vocal. Yes, let the PM know that there are bigger issues at hand and you'll get back to the miniscule issues at a later time.


Forest? Huh?

So what's the bikeshed have to do with the forest? Well, another phrase has been echoing in my brain a lot lately, and that's "can't see the forrest for the trees". It has a similar premise behind it and I thought it was very fitting, being that I've caught myself (twice now), wasting time debugging code to only later see that there was a simple error that was causing issues; the more recent issue was actually a human error and not code-related at all.

Lesson learned here: it's okay to step away for a bit to rest your brain (and your eyes!) from code.


Cheers! Code. Debug. Repeat.


Post Script

* My one delayed project was only delayed three days. We are now just maintaining code and debugging small bugs.

Monday, May 2, 2011

Nginx's Rewrite Rules for WordPress MS In a Subdirectory

Nginx's rewrite rules have been giving me a headache lately. Okay, cool so it doesn't support .htaccess files; that's fine. WordPress' Codex Nginx Page gives me some great information on how to do the rewrites.


Ah but I'm running WordPress in a subdirectory! My site URI for WordPress is something like, http://mydomain.com/subdir/. Okay? Yea should be fine as long as you rewrite the rewrite rules a little bit like so:

if (!-e $request_filename) {
rewrite ^/subdir/[_0-9a-zA-Z-]+(/wp-.*) /subdir$1 last;
rewrite ^/subdir/[_0-9a-zA-Z-]+.*(/wp-admin/.*\.php)$ /subdir$1 last;
rewrite ^/subdir/[_0-9a-zA-Z-]+(/.*\.php)$ /subdir$1 last;
}


That wasn't so bad right? Yea, it confused the heck out of me though at first! So hopefully the next person won't have the same headaches! Cheers!

Thursday, April 28, 2011

Nginx: Running FastCGI Under an Alias

So yay, Nginx has been a new playground for me here. It's awesome thus far and I love the process management! I've still got a bunch of exploring to do and I'm super busy, so excuse the brevity!


FastCGI Issues With Aliases

I've scoured the web for help on this one and it seems like a common issue that people have had. Check out the comment section on this post for a good starting point on this issue. But the usual trial and error was what ultimately got everything working for me.


Here's what I got working for me below:

location /dir/ {
alias /usr/local/www/foo/;
index index.php;
}

location ~ /dir/.*\.php$ {
if ($fastcgi_script_name ~ /dir(/.*\.php)$) {
set $valid_fastcgi_script_name $1;
}
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/www/foo$valid_fastcgi_script_name;
include fastcgi_params;
}


The problem I was running into was here:
location ~ /dir/.*\.php$ {
if ($fastcgi_script_name ~ /dir(/.*\.php)$) {
set $valid_fastcgi_script_name $1;
}

I assumed $fastcgi_script_name was going to be from /foo but it was already being passed the alias (/dir).


I suppose I'm just writing this to remind me in the future, but in case this helps anyone else, hope it makes sense!


Cheers!

Tuesday, April 12, 2011

PHP: Encode Text Into Numeric HTML Entities While Keeping HTML

If for whatever reason you need to have some text with special characters encoded into numeric HTML entities, but you also have HTML that you do not want to encode, well here you have it!


Why Numeric HTML Entities?

If you've worked with RSS before I'm sure you understand the dilemma. For those of you that don't know, RSS has a problem with validating if there are non-numeric HTML entities (the normal output you get from htmlentities()). More headaches, more XML fun!


Why Keep HTML?

Well, to be honest, it's just because we have a special scenario right now. But, I'm sure some people may find this helpful.



*Note* The numeric HTML entities foreach loop is based off of Michael Krenz's xml_character_encode function. Thank you sir!


function htmlentities_keephtml($text) {
$entities = get_html_translation_table(HTML_ENTITIES);
unset($entities['"']);
unset($entities['<']); unset($entities['>']);
unset($entities['&']);
foreach ($entities as $k=>$v)
$entities[$k] = "&#" . ord($k) . ";";
$s = array_keys($entities);
$r = array_values($entities);

$text = html_entity_decode($text, ENT_NOQUOTES); // decode the named entities
$text = str_replace($s, $r, $text); // now encode to numeric entities

return $text;
}

Saturday, April 9, 2011

Amazon Cloud Drive Now Doesn't Support Multiple Downloads?!


Wait, what?!

This change must be recent because I downloaded the only two albums I purchased from Amazon already and I definitely did NOT download them one at a time. I just so happen to have downloaded those files on my laptop and now I'm on my desktop. Yes, I can simply power on my laptop, but what's the point of having my files in the Amazon Cloud Drive anyway then?!


So now, 99 files for me to download one at a time?! (Yes, that's right classical music!) Not cool Amazon. Fail on you...


Update: Okay, between sometime after this post and now (April 19, 2011), Amazon has made multiple downloads possible again. Thank you Amazon!

Thursday, April 7, 2011

Google Chrome Update and Now No Status Panel Icon?

No more Google Chrome in my status panel?

So, I guess this was only a month test. Okay, so what's the statistics on this test guys? ;)

Thursday, March 31, 2011

New Blogger Views

Five New Blogger Views

Google introduced five new blogger designs this morning. If you are browsing a blogger site, simply append "/view" to see the available ones.

I personally think I like the "slider" view. The other views probably won't work as well for news-like sites that user experience is based off of chronological posts.

Still very cool!

Cheers!