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)
- 作者: 北尾雅人,増井雄一郎
- 出版社/メーカー: 翔泳社
- 発売日: 2011/06/10
- メディア: 大型本
- 購入: 5人 クリック: 370回
- この商品を含むブログ (48件) を見る
絶賛写経中です。
詳しいことは上の本を購入していただければ、無知な私でも割といい線まで設定できてます。
環境設定が色々面倒で、今使っているMacBookをLeopardから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();
まぁ大したことはしてないです。
全部あの本に書いてある内容なので、特別面白みはないですね。
変更点とすれば、
くらいなもんです。
で、実行結果がこれ。
おぉ、できとるできとる。
はまりどことか。
基本的にtypoが多かったので、ミスを見つけるのに苦労しましたけど、一言一句正確に写経すれば問題ないです。
挙げるとすれば、
- debugの仕方がよく分からん。
- iPhoneの実機テストをするには、年間$99の有償アカウント申請が必要らしい。
何気なく、「お金かかるのかー。嫌だなぁ」なんて思ってたら、
上で紹介した本の著者@donayamaさんからreplyが!
「ビビビ婚ってこんな感じかぁ」ということがよく分かりました。
ググってみると、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()を使わない方法をっと。
PHPでRSSを読み込む方法
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してみる
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さんが笑顔で何か言ってくれましたが、緊張して何も覚えていません。
ちょっとまじめなはなし
こんなことを思ったことありませんか?
「今の知識や体力のまま、小学生の頃に戻れたら、自分は日本を代表する人間になるんじゃないだろうか?」って。
今回のイベントに参加して、意外だなーと思ったのは、皆さんの開発歴が思ってたより随分短いこと。
自分がみなさんと同じくらいの開発歴になったときに、あのとき感じた「すげ〜。」という感心の気持ちを、
今の自分と同じくらいの開発歴の人に与えることができるだろうかと。
いや、やればあそこまで行けるんだと。
・・・いや、行こうと。