Macのローカル環境でHello Worldをbakeしてみる

お久しサマンサです。
会社から念願のMac Book Airを頂きまして、ウハウハしてる人です。
これがまた、軽いのなんのって!
毎日持ち運んでも、全然苦になりません。(むしろ入ってるっけ?って確認するぐらい。
とりあえずの感想は重量だけなんですが、今後Airすげー!ってのを言えていけばいいなぁと。

動かしてみたいじゃん?

やっぱりね、自分のローカル環境(ノートPC)で開発するってのが、全プログラマーのドリーム!的なとこあるじゃないですか。
そんなドリームを追いかけながら早2年、いよいよその瞬間がやってくるわけですね。

sudo vi /etc/apache2/other/example.com.conf

仕事柄、色んなOSでapacheの設定とかした(VM imageを貰ったが正解だけど)わけですが、
ディレクトリパスの統一性のなさはなんなの!!!
こういう統一性のなさがね、初心者が苦手意識を持つ代表例だと思うんです。


DocumentRoot "/Library/WebServer/Documents/example.com"
ServerName example.com


order deny,allow
allow from All

MacのデフォルトのDocumentRootは、/Library/WebServer/Documents らしいです。
ただ、自分のホームディレクトリ /Users/***** の下にも、全然違う Library フォルダがあるでしょ?
こういうのもね、どっちがどっちだっけ?的なことになるよね。(ここ試験に出ます。

cd /Library/WebServer/Documents/
sudo mkdir example.com
sudo chown -R ******:****** example.com/
cd example.com
vi index.php ← なんか適当に書いてみる。ほげとか。

ここで素朴な疑問ね。
なんでデフォルトのドキュメントルートが、root権限なの?

sudo vi /etc/hosts
127.0.0.1 example.com ← 追加

これから色んなhostが増えていくんだろうなぁ、ワクワク。

sudo /usr/sbin/apachectl restart

apache再起動して、http://example.com に Let's Access!!!

格言的な

規則を重んじるべし

twitterの自分のTL表示をbakeしてみる 〜Titanium編〜

「そろそろスマートフォン向けのアプリとか作りたいよねー。」ってのが、
最近の"彼女と私の事情"だったりするわけですね。
というわけで、最近何かと話題のTitaniumを使って、iPhoneアプリでも作っちゃう?というお話。

Titaniumって何ぞや?

Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)

Titanium Mobileで開発するiPhone/Androidアプリ (Smart Mobile Developer)

絶賛写経中です。
詳しいことは上の本を購入していただければ、無知な私でも割といい線まで設定できてます。
環境設定が色々面倒で、今使っているMacBookLeopardからSnow Leopardにして、
新しめのXcodeをインストールすることからこの戦いは始まるわけですね。

  • Snow Leopardのインストールパッケージを買う(¥3000)
  • インストールするときに、HDDの残容量が全然足りないので、外付けHDDを買う(¥15000)
  • データ移行とかに色々時間がかかる(1日くらい?)
  • Androidでのシミュレータテストのために、シミュレータパッケージのインストール(3hくらい)

これらのハードワークをこなしつつ、
ヨドバシカメラのイケメン店員さんにボロクソに貶される話はまたいつか紹介しますね。(本当むかつくんです。

twitterのTLを出してみる


// this sets the background color of the master UIView (when there are no windows/tab groups on it)
Titanium.UI.setBackgroundColor('#000');

// create tab group
var tabGroup = Titanium.UI.createTabGroup();

//
// create base UI tab and root window
//
var win1 = Titanium.UI.createWindow({
title:'@The_SunnySideup',
backgroundColor:'#fff'
});

var tableView = Titanium.UI.createTableView();
win1.add(tableView);

if(Titanium.Network.online == false){
alert('offline.can't connect');
}else{
var xhr = Titanium.Network.createHTTPClient();
var url = 'http://api.twitter.com/1/statuses/user_timeline.json?screen_name=The_SunnySideup';
xhr.open('GET',url,false);

xhr.onload = function(){
var json = JSON.parse(this.responseText);
for(var i=0; i<json.length; i++){
var row = Titanium.UI.createTableViewRow();
row.className = 'tweet';
row.height = 'auto';
row.add(Titanium.UI.createLabel({
text: json[i].user.screen_name,
top: 8,
left: 64,
height: 16
}));
row.add(Titanium.UI.createLabel({
text: json[i].text,
top: 32,
left: 64,
width: 256,
height: 'auto'
}));
row.add(Titanium.UI.createImageView({
image: json[i].user.profile_image_url,
top: 8,
left: 8,
width: 48,
height: 48
}));
tableView.appendRow(row);
}
};

xhr.onerror = function(error){
alert(error);
}
xhr.send();

xhr.onload = null;
xhr.onreadystatechange = null;
xhr.ondatastream = null;
xhr.onerror = null;
xhr = null;
}

var tab1 = Titanium.UI.createTab({
title:'Mine',
icon: 'dark_pegman.png',
window:win1
});

var win2 = Titanium.UI.createWindow({
title:'#TitaniumJP',
backgroundColor:'#fff'
});
var tab2 = Titanium.UI.createTab({
title:'#tag',
window:win2
});


var win3 = Titanium.UI.createWindow({
title:'Search',
backgroundColor:'#fff'
});
var tab3 = Titanium.UI.createTab({
title:'Search',
window:win3
});

//
// add tabs
//
tabGroup.addTab(tab1);
tabGroup.addTab(tab2);
tabGroup.addTab(tab3);

// open tab group
tabGroup.open();

まぁ大したことはしてないです。
全部あの本に書いてある内容なので、特別面白みはないですね。
変更点とすれば、

  • 取得するTLを自分のtwitterIDにした
  • 表示する内容を、「自分のTL」「任意のハッシュタグのTL」「検索」の3つに減らした
  • HTTPRequest後のメモリリーク回避処理を入れた

くらいなもんです。
で、実行結果がこれ。

おぉ、できとるできとる。

はまりどことか。

基本的にtypoが多かったので、ミスを見つけるのに苦労しましたけど、一言一句正確に写経すれば問題ないです。
挙げるとすれば、

  • debugの仕方がよく分からん。
  • iPhoneの実機テストをするには、年間$99の有償アカウント申請が必要らしい。

何気なく、「お金かかるのかー。嫌だなぁ」なんて思ってたら、
上で紹介した本の著者@donayamaさんからreplyが!
「ビビビ婚ってこんな感じかぁ」ということがよく分かりました。

  • Titanium.API.infoがiOS4.3を用いたシミュレータに対応していない?

ググってみると、Titaniumのバグ?で、Titanium Stadioのバージョンアップ対応って書かれたものは見ましたが、
現状はどうなんだろうか。
僕の環境(2011/10に設定したのでその辺のバージョン)では出ませんでした。
というか、どこにデバッグログが出るのかが分からない。っていう本質もあったりなかったり。

とこんな所ですかね。
まだまだ本の1/3しか行ってないので、もう少し進化は続くと思われます。
頭の中にある企画が実装される日は、いつになることやら。

格言的な

やってみたら案外できる。

twitterの自分のTL表示をbakeしてみる

本当、今更だよねw
結構簡単にできる(何せAPIがある)から、やってみるお。

とりあえず人がやってるのを試してみる

PHPとTwitterAPIを利用して、自分のタイムラインを表示してみる@デザイナー
http://blog.caraldo.net/2010/02/phptwitterapi.php

ふむふむ。twitterAPIからxmlを取得して、それをパースして流すだけっと。
いけそう♪いけそう♪そーれ、ぽちっとな。

Warning: simplexml_load_file() [function.simplexml-load-file]: http:// wrapper is disabled in the server configuration

エラーでますけども?
なに?サーバーの設定で、wrapperが無効になってる? wrapper=ラッパ??

simplexml_load_file()のallow_url_fopen設定を考える

ぐぐってみると、php.iniのallow_url_fopenの設定がoffになってるからとのこと。
php.iniの設定のallow_url_fopenをonにすることで解決するっぽいけど、
onにすることはかなり危険(非推奨)ってことで、別の方法を考えないと行けないのね。

「allow_url_fopen=Off」の環境にて
http://apisample.com/news/allowurlfopen.html

ふむふむ。それは危険だね。
ということで、simplexml_load_file()を使わない方法をっと。

PHPRSSを読み込む方法
http://hiroyukiterada.com/php/362/

みんなハマる場所は一緒だよね。(わかるわかる。
さーて、こんどこそ。ぽちっとな。

Warning: strtotime() [function.strtotime]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Tokyo' for 'JST/9.0/no DST' instead in...

・・・おーい。(泣
なんか時間の取得の設定がうまくいってないっぽい内容。

日時系関数(strtotimeとか)使用時のwarning

date関数で”Asia/Tokyo・・”なんかのエラーが出る件:PHP5.1.0以降
http://www.res-system.com/weblog/item/563

ふーむ。
php.iniの設定でデフォルトで結構動くと思ってたけど、色々変更しないとなのね。

★注意★
php.iniにdate.timezone = 'Asia/Tokyo' って設定して、apache再起動しても動かないよ〜。
「Asia/Tokyo」のところをダブルクォートで囲まないと、設定が反映されないことがあるそうです!
1時間くらいハマったのは内緒です

そろそろ焼けたんじゃね?


<?php
function curl_get_contents( $url, $timeout = 60 ){
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_HEADER, false );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
$result = curl_exec( $ch );
curl_close( $ch );
return $result;
}

$username = 'The_SunnySideup';
$url = "http://twitter.com/statuses/user_timeline.xml?id=" . $username . "&count=10";

$result = curl_get_contents( $url, 120 );
$rss = simplexml_load_string($result);

echo "<img src=\"" . $rss->status->user->profile_image_url . "\">";
echo $rss->status->user->description." by ".$rss->status->user->screen_name;

foreach ($rss->status as $i) {
$val = $i->text;
$val = ereg_replace("(http)(://[[:alnum:]\S\$\+\?\.-=_%,:@!#~*/&]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$val);
$val = ereg_replace("(@)([[:alnum:]\S\$\+\?\.-=_%,:@!#~*/&]+)","<a href=\"http://twitter.com/\\2\" target=\"_blank\">\\1\\2</a>",$val);
$val = ereg_replace("(>)(http://twitpic.com/)([[:alnum:]\S\$\+\?\.-=_%,:@!#~*/&]+)(</a>)","><img src=\"http://twitpic.com/show/mini/\\3\" /></a>",$val);
echo "<p>★" . $val . "<br />";
echo date( "Y/m/d H:i", strtotime( $i->created_at ) );
echo "</p>";
}

?>

usernameに自分のtwitterIDと差し替えれば見れますね。
じゃーん!

美味しくいただきました。
デザイン全く入ってないので、とてもcheapですが。

格言的な

勉強するから、何をしたいか分かる。勉強しないから、何をしたいか分からない。

githubのマスコットをbakeしてみる

ふと思った。

なぜgithubのキャラクターは、ネコとタコが合体しているのか?

一見すると、ネコっぽいのだが、よくよくみると、足がたくさんあるのだ。
・・・これタコじゃね?
ということで調べてみた。

githubのマスコットの由来

http://radiumsoftware.tumblr.com/post/4831535180

キャラクターとは、得てしてそういうことらしい。

格言的な

あまりにもあっけないバックグラウンド・ストーリーだ。デザインとは時にそういうものなのだ。

FizzBuzz問題をbakeしてみる

TDD(Test Driven Development)をFizzBuzz問題で実践しよう!@phpmatsuri2011TDDワークショップの話。

TDD

TDDってなんじゃらほい。って方は ↓ TDD@wiki

テスト駆動開発 (てすとくどうかいはつ、test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。

TDDという考え方を知ってからは、270°くらいプログラムの仕方が変わりまして。
180°超えとるがなって言うのはなしです。こういうの気持ちじゃん、気持ち。

ただ、テストを書こう!っていうことじゃなくて、@kunitさんの言葉を借りれば
テストを先に書くのではない、どういう風に動いてほしいかをあらかじめ決めるだけ
ということなのだが。

これ嫁!的なオススメ本ありましたら是非。

FizzBuzz問題

FizzBuzz問題知ってる人ー?」・・・私「・・・(しーん。虫の生体に関するものか何か?」

ということで、これです。

1から100までの数を出力するプログラムを書く。
それぞれの値は改行して出力する。
ただし、
3の倍数のときは数の代わりに「Fizz」、
5の倍数のときは「Buzz」、
3と5両方の倍数の場合には「FizzBuzz」と出力する。

採用試験で簡単な技術レベルを知るためによく使われる問題のようです。
問題自体の難易度は低い(5分もかからない)ですが、これをTDDで実装しようというのが焦点ですね。

bakeしてみる

TDDにはPHPUnitを採用しております。(ワークショップがそういう前提だったので。
詳しくは@shin1x1さんのこちらをご覧頂くのがよいかと(勝手に張っていいのかな?

TDDの進め方は、上のリンクをみれば、「なるほど〜ほげ〜。」っとなるのですが、気になる点がひとつ。

$ phpunit FizzBuzzTest.php
PHPUnit 3.5.14 by Sebastian Bergmann.

ん???

by Sebastian Bergmann.

・・・phpunitを動かしてるのは、「by The_SunnySideup 」ですよ。の突っ込みはおいといて、
記憶が確かならば、PHPUnitの作成者の方のようです。
phpunitを実行するたびに、「オレが作ったんだよ、PHPUnit.」と主張してきます。
@せばすちゃんべるぐまんさんですね、覚えました。(もはや洗脳ですね。

ってことで、


<?php
require_once '../src/FizzBuzz.php';

/**
* FizzBuzzTest
*/
class FizzBuzzTest extends PHPUnit_Framework_TestCase {
/**
* setup
*/
public function setUp(){
$this->object = new FizzBuzz();
}

/**
* makeFizzBuzz
* @dataProvider provideMakeFizzBuzz
*/
public function test_MakeFizzBuzz($expected,$no){
$this->assertEquals($expected, $this->object->makeFizzBuzz($no));
}

public function provideMakeFizzBuzz(){
return array(
array('1',1),
array('Fizz',3),
array('Buzz',5),
array('FizzBuzz',15),
);
}
}

こうなって・・・

$phpunit FizzBuzzTest.php 
PHPUnit 3.5.15 by Sebastian Bergmann.

....

Time: 0 seconds, Memory: 3.25Mb

OK (4 tests, 4 assertions)

こうなりましたよ。ということが伝えたかった訳ですね。(@shin1x1さんの内容と同じですが。
ということで、おいしくめだまやきのできあがり。

格言的な

「よいプログラマとそうでないプログラマの違いは、 よいプログラマはテストを行って間違いをできるだけ早く発見してしまうことです。」

githubをbakeしてみる

github ぎっとはぶ。(きっとくる〜♪的な音色で)
去年の春から名前は聞いてた。
社内案件はgitでバージョン管理していたので、それ関連なんやろなぁくらいなもんで。

githubとは?
http://d.hatena.ne.jp/keyword/GitHub

github のアカウント登録してみる

  • https://github.com/ にLet's access!!
  • 画面中央ぐらいにある「Plans,Pricing and Signup」というボタンをCLICK!!!
  • メインカラムの一番右上「Create a free account」というボタンをCLICK!!!
  • ユーザー情報を入力して登録する。

「Username may only contain alphanumeric characters or dashes and cannot begin with a dash.」
(ユーザ名は、英数字またはハイフンのみを含めることができ、ダッシュで始めることはできません。)
「The_SunnySideup」を入れたら、怒られました。(アンスコ禁止らしい。ブヒー。


https://github.com/TheSunnySideup

できたらしい。

followしてみる

検索窓で会社の皆さんのアカウントをfollowしてみた。

  • ユーザーを検索して、「follow」ボタンをCLICK!!!

師匠がたくさんいるのは有り難い。O(-人-)O アリガタヤ・・。
followした人の公開しているソースが見れるっちゃ。

アイコン作ってみる

アイコンがないのは寂しい。
自分のユーザー名横のgithubキャラクター?(猫のやーつ)をクリックすると・・・

ここに飛ばされた。
ユーザー登録して、アイコンが変わらない・・・けど、そのうち変わるでしょう。
とりあえず、アカウントを作ったので終了〜。

格言的な

「人に見てもらう前提でコードを書く」

#phpmatsuri 2011@osaka をbakeしてみた

「家に帰って感想ブログを書くまでがお祭りです。」

良い機会なので開発ブログ開始です。(以後お見知りおきを

2011年10月15日・16日開催のPHP開発合宿イベントに参加しました。
社内勉強会とか社内開催勉強会とか他社開催勉強会とか、指で折れる程の回数しか参加してませんでしたが、
社内的な裏事情も活用させてもらって行ってきました。

最近読んだ@taguchiさんのこの記事に刺激を受けたんですが、

人生の見方が変わるかもしれない、たった2つの質問…
http://www.ideaxidea.com/archives/2010/05/two_questions.html

合宿だけでもチャレンジなのに、大阪開催のイベントだなんて、人間変わろうと思えば変われるものですね。(良いこと良いこと
以後お見知りおきを。(2回目

さてさて。

大事なことは最初にいいましょう〜ってことなので言いますが、

来年も行きたいので、そろそろ福岡行きのチケット予約していいですか?

髪の長いRock'n Rollerの人

まつり前日に、東京から大阪に移動して、会場と同じホテルに泊まったんです。
ホテルに着いて、ぼーっとして、明日に向けてBDD(beer driven development)だなと思ったので、
近くのコンビニにビールの調達に行ったのですが、
エレベーターが途中の階で止まって、「髪の長いRock'n Roller」っぽい人が乗ってきたわけです。

どこかで見たことあるような?
最近買ったCDのメンバーだったっけ?
明日土日だしでフェスでもあるのかな?



・・・grahamさんでした。

あれだけphpmatsuri2010の特設サイトとか、当時の様子とかを見て、
「初参加だけど、絶対に他の人に遅れをとらないぞー!環境設定もばっちりだぞー!Cake2.0の話聞くぞー!」
と意気込んでいたわりには、肝心の、しかも一番聞きたいCakePHPのcore developerのgrahamさんの顔をうる覚えとは。。。

grahamさん大変失礼しました。以後お見知りおきを(3回目

まつりがはじまる

その一件以降、「何かをハックする」という漠然とした目標から「grahamさんにお見知りおきしてもらう」に軌道修正。

  • 「CakeFest wrap-up, and CakePHP 2.0 performance」を最前列で聞き
  • CakePHPワークショップ」はgrahamさんの隣を陣取り
  • CakePHP歴は何年ですか?」の英語での質問に思いっきり「1年です!(本当は1年半でした)」と日本語で回答し
  • ワークショップ中は、隙あらば「昨日エレベーターでお会いしたものです。覚えてますか?」をgoogle翻訳にかけて暗記し
  • プログラマーならコードで語れとばかりに、翻訳した内容をechoし

そんなことをしていると(ちゃんとワークショップには取り組んでましたよ)、あっという間のワークショップも終わりを迎え、
この思いを伝えるタイミングはここしかない!とばかりに、grahamさんを凝視。

「...th...th...th...thank you....」

と謎のため口で終了。
せっかく翻訳して、echoまでした言葉は遠く彼方。
その後、grahamさんが笑顔で何か言ってくれましたが、緊張して何も覚えていません。

ちょっとまじめなはなし

こんなことを思ったことありませんか?
「今の知識や体力のまま、小学生の頃に戻れたら、自分は日本を代表する人間になるんじゃないだろうか?」って。

今回のイベントに参加して、意外だなーと思ったのは、皆さんの開発歴が思ってたより随分短いこと。
自分がみなさんと同じくらいの開発歴になったときに、あのとき感じた「すげ〜。」という感心の気持ちを、
今の自分と同じくらいの開発歴の人に与えることができるだろうかと。
いや、やればあそこまで行けるんだと。
・・・いや、行こうと。

まつりのおわりは、あとのまつり?

まつりでたくさんの方とお話できたし、たくさんfollowさせてもらいました。
おかげでTLが充実してます。
・・・が?


<?php
function testEpicSaxGuyを誤爆(){
$this->assertEquals('冷たい視線を感じない„',$this->Company->playMusic('EpicSaxGuy'));
}
?>

@shin1x1さん、せっかく教えてもらったのに、テストが通らないんです。
もっと勉強しますね。

格言的な

なせばなる、なさねばならぬ、なにごとも。


読者の方に伝わっているか分かりませんが、フランス革命以上の革命が、自分の意識の中で起こってます。
来年のphpmatsuriの感想ブログを書く日まで、自分がどれだけ成長できるか。
安直だけど、この目標を持てたことが、この勉強会に参加した最大の収穫でした。
そんなきっかけを与えてくれた@kaz_29さんや@kunitさん、phpmatsuriのスタッフの皆さん、参加者の皆さんに感謝します。
また来年、福岡でお会いしましょう。

おわりー。