モウリーニョの情熱。勝利への姿勢と人生の哲学

私の人生哲学はサッカー哲学に似ている。それは正直、率直、明確、そして野心的であるべきということ。私はこれらの特徴を絶対に失いたくない

ジョゼ・モウリーニョ

最初に断っておくと、僕はサッカーをヘビーに見る人間ではなく、翻訳記事を元にモウリーニョのストーリーを想像で楽しんでいるに過ぎません。

モウリーニョは賭けに勝とうとしている

モウリーニョはこれまでの実績や名声を不意にしかねないギャンブルに挑戦し、勝とうとしている。
彼は明確な優先順位をつけそのギャンブルに挑んだ。
タイトル > その他
その他とは、サッカーのスタイルであり、クリーンさであり、つまるところ大部分は、「レアルマドリードの品格」である。しかもライバルは、「哲学」を貫き、美しいサッカーで全盛を迎えたバルセロナである。その対比からは、「正義のバルサ」VS「悪のマドリー」という構図すら透けて見える。リーガを独走しても、サポーターから批判があった。
しかし、モウリーニョにすれば、優先順位は明確だったと思う。スタイルや、品格にこだわっても、結果が出なければ解任される。それはモウリーニョの側近だったAVBをあげるまでもなく明らかだ。そして、結果を出しさえすれば、仮に別の理由で解任されても、監督としての権威、名声に大きなダメージがないことも経験から良く知っていたはずだ。記憶は薄れるが、記録は残る。記録とつながった記憶ほど、残りやすい。
そうやって、全てを「勝つこと」に集中しても、史上最強と称されるバルサに勝てるかは、わからなかったはずだ。
しかし、モウリーニョは野心を持ってそれに挑み、今成功を手中に収めようとしている。「最も重要」であるリーガを直接対決での勝利と共に制そうとしているのだ。直接対決の結果や内容を見るに、マドリーはバルサより強いと思う人は少数はかもしれない。だが、バルサも共にCLで敗退したこともあり、リーガさえとれば、今シーズン「勝利」したのはマドリーといえるだろう。
「一番大事なもの」のために、「重要なもの」を捨て去る。優先順位を明確にして、確率を最大に高めた上で、不可能と思われることにチャレンジし、成し遂げる。レアルマドリードでのモウリーニョはクレバーでかっこいい。おそらく、彼以外にこの早さでの打倒バルサはなし得なかっただろう。

モウリーニョに見えた焦りと人生哲学

今シーズンと昨シーズン、レアルマドリードの選手は、多くのラフプレーと審判批判を見せた。モウリーニョ自身も、昨CLでの執拗な審判批判、ビラノバへの目つぶしなど、多くの醜態をさらした。
これらの行為は許されざるものである。だが、ここでは一旦その評価を脇に置き、その動機に注目したい。
結果はどうあれ、ある意味では戦略的なものと解釈できるのかもしれない。つまり、闘争心と敵意を煽り、チームのモチベーションを最大に引き出すことを狙ったものであり、際どいプレーにおける審判へのプレッシャーを狙ったものであると。
しかし、これはモウリーニョの人生哲学の現れなんじゃないかと僕は思う。つまり、彼は常に正直、率直、明確だったのだ。
主観も客観もごちゃ混ぜににして、率直にチームの健闘を讃えもすれば、審判の判定に対する違和感も口にする。自らの野心が、圧倒的なバルセロナに阻止されそうになれば、敵意を、そして隠しきれない焦りをむき出しにして表現する。
冒頭の不等式にあえて加えるなら、
人生哲学 > タイトル > その他
をぶれることなく貫いていたのかなと。
彼を見ていて「海外サッカー選手のコメント」群を初めて見たときに感じた強烈な違和感を思い出した。翻訳の口調もあれど、模範的、優等生的なそれは、荒々しいサッカー選手のものとは思えなかった。いつしかそれをスポーツマンシップの現れとして当然のものとして見ていたけど。

CakePHPerのRuby学習計画+Macで開発環境を整える

プログラミング経験はCakePHPのみからのRuby学習です。
1ヶ月後にRailsを使ったWebサイトが完成したらいいなと思っています。デザインの時間や、別サービスのリリース&チューニングを考慮しつつ目標設定。

コンテンツ
  • ・学習ソースと組み立て
  • ・導入前の準備
  • ・いざ導入

学習ソースと組み立て

学習計画

一番最初。実際に動かしながらさらりと読み切る。

作業モチベーションが低い時に気になる項目orがっつりつまづいた時にその項目を一章読む。

たのしいRubyチュートリアルを終え、この情報をベースに一気に作り上げる。

Ruby+Rails導入前の準備

さきほどあげた記事の中で、MacRuby開発環境をまとめて構築するスクリプトが紹介されていたので利用します。
https://github.com/thoughtbot/laptop

スクリプトを実行すると、
SSH接続用の公開鍵の作成(未作成の場合)
・Homebrew-MacPortsに代わり人気上昇中のパッケージ管理システム
・Qt-統合テストのデファクトCapibaraで使うらしい
・Ack-grepに変わるソースコード検索
・Tmux-screenに変わる仮想クライアント
・Postgres-RDBMS
・Redis-key/valueタイプの高速なデータストア
ImageMagick-画像変換のためのソフト
・RVM-Rubyのバージョン切り替えシステム
Ruby-Macデフォルトは1.8なので1.9を
Rails、Heroku、Bundlerなどgemとplugin
がまとめて導入されます。
正直直近必要性を感じないもの、理解できないものもあるのですが、入れちゃいます。せっかくなので試してみようかと。
ただ僕の場合焦って導入しエラーが出たので以下の2点は確認しましょう。

導入前の準備
  • ・新しいXcodeを入れる

これはMacOS X 10.6.8 SnowLeopardのお話です。
僕の場合、入ってるXcodeのVer.が3.2.4だったためWarningが出ました。
3.2.6にupdateしたのですが、これがちょいちょい分かりづらかったので記事にしました。
Xcodeを3.2.6にupdate

  • ・他のパッケージ管理システムを削除

うっかりMacPortsそのままでやってしまいました。
MacPortsは以下のコマンドで削除できます。

//macportsで導入したパッケージを全て削除

$ sudo port -f uninstall installed



//macportsを削除

$ sudo rm -rf /opt/local \

/Applications/MacPorts \

/Applications/DarwinPorts \

/Library/Tcl/macports1.0 \

/Library/Tcl/darwinports1.0 \

/Library/LaunchDaemons/org.macports.* \

/Library/StartupItems/DarwinPortsStartup \

/Library/Receipts/MacPorts*.pkg \

/Library/Receipts/DarwinPorts*.pkg \

~/.macports

Ruby1.9.2、Railsその他の導入

以下のコマンド一発で実行できます。

と思ったらgemのインストールに失敗。

WARNING:  Installing to ~/.gem since /Library/Ruby/Gems/1.8 and /usr/bin aren't both writable.

1.8?ということでRubyのバージョンを確認

$ ruby -v

ruby 1.8.7 (2010-01-10 patchlevel 249) [universal-darwin10.0]

RVMのデフォルトのRubyを1.9.2に設定。

$ rvm --default use 1.9.2

$ ruby -v

ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin10.8.0]

これでRails含め全てのgemのインストールに成功しました。

...

Successfully installed railties-3.2.3

Successfully installed rails-3.2.3

29 gems installed

Xcodeを3.2.6にupdate

今更ですがHomebrewを導入時にWarningが出たので入れました。
OSは10.6.8のSnowLeopard。元は3.2.4が入っていました。

Xcode3.2.6のdmgを手に入れる

AppleIDが必要です。旧バージョンは若干場所がわかりにくかったですが、ここの4ページ目にありました。
Downloads

インストール

特に難しいことはありません。が、ここでInstallation Alertが立ち上がり、iTunesを閉じろと表示され進みません。
実際にはiTunesは開いていませんし、開いて閉じるとやっても効果なしです。結局ターミナルよりプロセスをkillして解決。

$ ps ax | grep AlertAll

71369   ??  S      0:03.92 ./Tools/AlertAll.app/Contents/MacOS/AlertAll /Volumes/Xcode and iOS SDK/Packages/MobileDevice.pkg

$ kill 71369

古い方のXcodeを削除

しようと思ったら見当たりません。3.2.4に上書きされたみたいです。

僕がCakePHPを選んだ理由。次の一歩はRailsかjQueryか

2月後半からプログラミングに集中できるようになり、2ヶ月がたちました。
CakePHPで2つ目のWebアプリがほぼ完成し、データ待ちになった今、学習初期の思考と次の一歩の意思決定を振り返るためのメモ。

CakePHPを使った理由

プログラム設計の素養を身につけたいという思いと、最速でサービスを完成させたいという思いのバランスをとった選択でした。

良いコードを書く素養

僕は、「良いプログラマ」になりたいです。プログラマは、人により生産性が大きく異なること。特にチームで開発する際に大きな差が生まれることを、多くの人から聞いて心に留めていたのです。その要素がどんなものかは知らずとも。
それを学ぶため、達人プログラマなどを読みました。その中で、「良いプログラマ」の素養の一つが「良いコード」を書けることで*1、良いコードの要素は。「保守性」「堅牢性」「パフォーマンス」に集約できそうだと結論づけました。
保守性=チームで効率よく開発、保守できること。可読性や再利用性を高めることはその手段で、OOPMVCの分離、変数の命名、インデントなどを含む。
堅牢性=想定外の動作を引き起こさないこと。サニタイズなどのセキュリティ対策や、バリデーションや例外処理といった、想定外の状況への対策を含む。
パフォーマンス=一定の環境下で、実行時間や使用リソースが小さいこと。アルゴリズムとデータ構造の知識や経験、ボトルネックを見抜く能力が必要。

フレームワークでショートカット

良いコードを書くには、良いコードを読むことだといいます。僕が初めて読んだオープンソースのコードはWordPressだったのですが、その善し悪し以前に、全く意味が理解できませんでした。
その直前に、平PHPで2ちゃん風スレッドフロート式掲示板をさくっと作り、プログラミング楽しい!オレできるかも!を実感した直後のことでした。同じ動くプログラムでも、そのコードは月とスッポンほどに違っていました。
そのコードを「良いコード」へリファクタリングするのは諦め、新しいサービスをフレームワークで作ることにしました。フレームワークを使い、その規約に従うことで、「保守性」「堅牢性」の多くの部分がカバーされると考えたのです。

どのフレームワーク

残る問題は、どのフレームワークを使うかです。最速でサービスを完成させるため、PHPを使うことは既定路線でした。前職サービスでの使用言語がPHPで、最悪その時の先輩に質問可能でしたし、XAMPPにより「コードを書けば実行できる」環境が整っていました。
残る考慮要素は、学習の容易さ、ライブラリの充実度合い、フレームワークの適正開発規模、将来的な有用性でした。
僕の場合は、「フレームワークが人気であるか」が前者2点に大きく関わるという判断、とりあえずは小規模開発である、また将来のRailsへの移行を意識し、CakePHPにしました。*2

次の技術的な一歩は?

今こそ新しい一歩を踏み出すとき

今、新しい技術に手をつけたいと思っています。一方で、やっとCakePHPをスラスラと扱えるようになったところ、また生産性が下がるのは辛いです。しかし技術的にもサービス的にも適切なタイミングだと思っています。
サービス面→マネタイズ、生産性向上のコアとなる2サービスが完成し、自分の中で重要度の高いサービスの新規作成が一旦完了した。また、これらのメンテナンスと改良でどちらにしろCakePHPは使い続ける。
技術面→PHPCakePHPというワンライン状態から脱することで、言語、FWを相対的に見ることができるようになる。それが、今後の技術選択の意思決定の質を大幅に上げると予想される。

RailsjQuery

次の一歩として考えているのは、Ruby+RailsJavaScript+jQueryです。
Rubyは、今後のメイン言語候補、プログラマとしての「良い習慣」の実践という意味で良い選択肢かなと。Ruby(Rails)は生産性が高く、変化への適応性に富んだ言語のようです。また、Rails使用者の多くには、新しいものへの貪欲さと、それをアウトプットする積極性があると感じています。これはサービス完成最優先で、BDDやCIなんかを無視してきた僕には、ツール、情報量の面でありがたいものです。
一方JavaScriptは、「できることを広げる」という観点で非常に有望そうです。アニメーションやajaxは、ハイレベルなUXを実現してくれるはずです。また、Titaniumを使ったネイティブアプリも手を出してみたい分野です。
PythonRubyに近いところでかなり悩んで検討しましたが、一旦Rubyで。世界的なトレンドはあれど、欧米の開発者とコラボする予定もないですし。

技術戦略、資金戦略、人生戦略

どう生きるか、の意思決定

RailsjQueryかってのは、どう見ても技術的な優位や将来性の話ではなく、僕が今後何をしたいかによって決まることです。
現状の僕は、あまりに多くのことをやりすぎているようです。この2ヶ月の間、プログラミングに加え、HTMLとCSSgimpの使い方も学習し、企画デザイン含め全て一人でやりきりました。
これは「学習能力」という僕の最大の強みの発揮であり、「パートナー探し」という重要事項の回避でもあります。
下手に学習能力が高いために、パートナーを探す努力をしていない面は否めず、これはネガティブな結果を招くかもしれません。今はクラウドワークスなんてサービスもありますし、デザインなんかは人にお願いし、そのご縁を大事にしつつパートナーを見つけたいと思う次第です。

戦略的に生きる

僕が常に心がけているのは、戦略的に生きることです。戦略的に生きるには、ゴールが明確でなくてはいけません。自分が幸福になるために実現したいことを明確にし、その実現に必要な「スキル」「リソース」を考え、最も効率的に獲得する道筋を描く必要があるのです。そのゴールが具体的であればあるほど、道筋を、筋のいい仮説として描きやすくなります。
このエントリは、現状を言語化することで、経験を元にその仮説の修正を行う試みです。月中の定例にしてもいいかもしれません。

*1:この過程で良いプログラマ≠良いコードを書くプログラマでないことも学びました。多くの習慣、知識や人に対するスタンスの総体として良いプログラマは存在するのだなと

*2:実はこの時勉強不足でCodeigniterを知りませんでした。知ってたらCodeigniterにしたかも

愛用のMacBookAirインナーケースが優秀。一年半毎日のように持ち歩いても傷一つない

2010年10月にMacBookAirを使い始め、もうすぐ1年半が経ちます。
僕は常にMacBookAirを持って外出しているのですが、幸いにもハード面で一切のトラブルに見舞われていません。外観もこの通り。

画質の関係で伝わるかはわかりませんが、今も購入当初の輝きを保ち、傷一つない状態です。MacBookAirのボディ剛性も素晴らしいですが、インナーケースも幾分か貢献してくれたでしょう。購入当初から使っているケースはこれです。
be.ez LArobe MacBook Air Allure Black
be.ez LArobe MacBook Air 13 Allure Black
LArobe MacBook Air 11 Allure Color
be.ez LArobe MacBook Air 11 Allure Color

軽く紹介

11,13インチ用があり、カラーは上の2種に加え、ラベンダーとモカもあります。また、横向きでダブルジップのタイプもあります。デザインは、シンプルですが野暮ったさはなく使いやすいです。
素材は低反発というのか、へこませるとゆっくり戻るタイプのやつです。ジッパー部分は、中身と干渉しにくいように工夫がしてあり、こすって傷をつけたことはありません。せっかくの外観をキレイに保つためにも、故障リスクを避けるためにもキーボードカバーと合わせ、いいインナーケースを使いたいですね。
moshi clearguard (JIS)
moshi clearguard (JIS)

僕はこれに入れたうえで、普通のクッションのないビジネスバッグで携帯しています。バッグに本や筆箱をつめこんで、それなりの圧力がかかっても全く問題ありません。MacBookAirを長くキレイに使いたいかた、断然オススメです。

MySQLでDATETIME型の時刻差を計算

MySQL上で、DATETIME型の時間差を出す方法です。
僕の場合、出した値を合計して、その後PHPで扱う流れでしたので、UNIX_TIMESTAMPで変換してから差を出す方法を採用しました。

複数の方法で結果を出してみる

左2つのデータの差分を、カラム名の方法で出しています。

そのまま減算

数字列の差分になります。

SELECT datetime1 - datetime2

FROM table_name

UNIXTIMESTAMP化してから計算

秒数で取得できます。

SELECT UNIX_TIMESTAMP( datetime1 ) - UNIX_TIMESTAMP( datetime2 )

FROM table_name

SUBTIME()で計算

後ろの引数は時刻ではなく時間を表す値でなければならないようです。

SELECT SUBTIME(datetime1,datetime2)

FROM table_name

TIMEDIFF()で計算

ちゃんとフォーマットされた時刻差が出るのですが…

SELECT TIMEDIFF(datetime1,datetime2)

FROM table_name


UNIXTIMESTAMPで取得すれば、その後gmdate()でそのまま時間っぽく表示できるので扱いやすいです。

$time = gmdate( 'H:i' , $Mysqlから取得した値);

//$timeの中身は"00:30"

TIMEDIFFの値は、PHPで取得する場合、単純な減算の値と同様の数字列(00:30:00は3000)としての取得になります。これらもPHP上で整形すれば時間データ化できますが、ひと手間増えることになります。
日付の差であればDATEDIFFやDATE()してからの減算であっさり解決できるんですけどね。

「Notice: Undefined index」「Notice: Undefined variable」の解決と解説

僕が最初にPHPを使いだして、初めてぶつかったエラーでした。
文字通りなのですが、「Notice: Undefined index」は定義されていない配列の要素、「Notice: Undefined variable」は定義されていない変数を使用した場合に発生します。echoしたり関数の引数として使った場合ですね。
なお、単純に変数名やindex名を誤って記述した時にも出ます。

対処法

Noticeエラーは、「望ましくない」コードに対してでるものなので、プログラムは動作します。そのため、エラーを表示しないという対応も可能ですが、本来はエラーの発生しないコードを書くことが望ましいです。

「Notice: Undefined variable」は変数を最初に初期化して解決

$var1 = $var2; //var1var2も初出。Undefined variableが出る

$var2 = NULL;
$var1 = $var2; //Undefined variableは出ない

初出の変数はNULLを代入*1し、初期化してから使用するようにします。未定義の変数"に"代入する(未定義の変数が左側)ことは可能ですが、未定義の変数"を"代入する(未定義の変数が右側)とエラーが出るわけです。

「Notice: Undefined index」はindexの有無を確認する処理を入れて解決

最初に該当のindexが存在するかを確認し、存在しない場合の処理を記述します。

if ( $_POST['name'] == "" ){

  echo '名前を入力してください';

} //リクエストにnameフィールドが含まれていないとNotice undefined indexが出る



if(isset($_POST['name'])) {

  if ( $_POST['name'] == "" ){

  echo '名前を入力してください';

  }

} //Notice undefined indexは出ない


又は

if ( !isset($_POST['name']) || $_POST['name'] == "" ){

  echo '名前を入力してください';

} //Notice undefined indexは出ない


issetは該当の変数に値がセットされていればtrue、いなければfalseを返します。上の例では$_POST['name']がセットされている場合のみ規定の処理を行い、そうでなければ何もしません。
下の例では、$_POST['name']がセットされていないか空の文字列の時に「名前を入力してください」と出力します。!はNOTの意味です。||はorの意味で、片方がtrueだった時点で処理が実行されます。例文では!isset($_POST['name'])を前に置くことで、エラーが出なくなっています。

もちろん、こんなシンプルな例なら

$words = array('a' => 'apple', 'b' => 'book');

echo $words['c']; //Notice undefined indexが出る

変数を初期化したように、該当のindexを追加するだけで簡単に解決します。
$words['c'] = "";

@をつけてNoticeエラーを非表示にする

処理や変数の前に@を付けることでNotice、Warningを該当部分のみ非表示にできます。

  echo @$undefined;

スクリプト内でNoticeエラーを非表示にする

そのスクリプト内でのエラー表示をerror_reporting関数で制御できます。

error_reporting(E_ALL ^ E_NOTICE);

php.iniの設定でNoticeエラーを非表示にする

php.ini内のerror_reportingを変更することで、まとめて制御できます。僕の手元では270行目あたり。

error_reporting = E_ALL & ~E_NOTICE

E_ALLは全てのエラー、~は除くE_NOTICEはNoticeエラーで、Noticeエラーを除く全てのエラーを表示という意味になります。php.iniを書き換えたらwebサーバーを再起動して設定を反映するのを忘れないようにします。

GETやPOSTで発生する大量の「Notice: Undefined index」

GETやPOSTをした時にこのエラーに出会うというケースは多いのではないでしょうか。
外部からの変数:$_GETと$_POST

//submit.php

<form action="confirm.php" method="POST">

   <label for="name">名前</label><input type="text" name="name">

   <input type="submit" value="確認">

</form>



//confirm.php

<?php

echo '名前:'.$_POST['name'];

?>

上記の例では、submit.phpのフォームに名前を入力して確認ボタンを押すと、POSTメソッドで入力データが送られ、それをconfirm.phpで取得後、出力して確認しています。
ここで仮にsubmit.phpの確認ボタンを経由せず、URL直打ちでconfirm.phpを見るとUndefined indexが出ます。
POSTメソッドを実行した時には、$_POST['formのname属性']という連想配列を定義しているようなものなので、そのPOSTメソッドが実行されなければ、定義していないindexを出力しようとしている状態になるわけです。

*1:初期化時に何を代入するかという議論もあるようですがここでは触れません