モウリーニョの情熱。勝利への姿勢と人生の哲学
私の人生哲学はサッカー哲学に似ている。それは正直、率直、明確、そして野心的であるべきということ。私はこれらの特徴を絶対に失いたくない
最初に断っておくと、僕はサッカーをヘビーに見る人間ではなく、翻訳記事を元にモウリーニョのストーリーを想像で楽しんでいるに過ぎません。
モウリーニョは賭けに勝とうとしている
モウリーニョはこれまでの実績や名声を不意にしかねないギャンブルに挑戦し、勝とうとしている。
彼は明確な優先順位をつけそのギャンブルに挑んだ。
タイトル > その他
その他とは、サッカーのスタイルであり、クリーンさであり、つまるところ大部分は、「レアルマドリードの品格」である。しかもライバルは、「哲学」を貫き、美しいサッカーで全盛を迎えたバルセロナである。その対比からは、「正義のバルサ」VS「悪のマドリー」という構図すら透けて見える。リーガを独走しても、サポーターから批判があった。
しかし、モウリーニョにすれば、優先順位は明確だったと思う。スタイルや、品格にこだわっても、結果が出なければ解任される。それはモウリーニョの側近だったAVBをあげるまでもなく明らかだ。そして、結果を出しさえすれば、仮に別の理由で解任されても、監督としての権威、名声に大きなダメージがないことも経験から良く知っていたはずだ。記憶は薄れるが、記録は残る。記録とつながった記憶ほど、残りやすい。
そうやって、全てを「勝つこと」に集中しても、史上最強と称されるバルサに勝てるかは、わからなかったはずだ。
しかし、モウリーニョは野心を持ってそれに挑み、今成功を手中に収めようとしている。「最も重要」であるリーガを直接対決での勝利と共に制そうとしているのだ。直接対決の結果や内容を見るに、マドリーはバルサより強いと思う人は少数はかもしれない。だが、バルサも共にCLで敗退したこともあり、リーガさえとれば、今シーズン「勝利」したのはマドリーといえるだろう。
「一番大事なもの」のために、「重要なもの」を捨て去る。優先順位を明確にして、確率を最大に高めた上で、不可能と思われることにチャレンジし、成し遂げる。レアルマドリードでのモウリーニョはクレバーでかっこいい。おそらく、彼以外にこの早さでの打倒バルサはなし得なかっただろう。
モウリーニョに見えた焦りと人生哲学
今シーズンと昨シーズン、レアルマドリードの選手は、多くのラフプレーと審判批判を見せた。モウリーニョ自身も、昨CLでの執拗な審判批判、ビラノバへの目つぶしなど、多くの醜態をさらした。
これらの行為は許されざるものである。だが、ここでは一旦その評価を脇に置き、その動機に注目したい。
結果はどうあれ、ある意味では戦略的なものと解釈できるのかもしれない。つまり、闘争心と敵意を煽り、チームのモチベーションを最大に引き出すことを狙ったものであり、際どいプレーにおける審判へのプレッシャーを狙ったものであると。
しかし、これはモウリーニョの人生哲学の現れなんじゃないかと僕は思う。つまり、彼は常に正直、率直、明確だったのだ。
主観も客観もごちゃ混ぜににして、率直にチームの健闘を讃えもすれば、審判の判定に対する違和感も口にする。自らの野心が、圧倒的なバルセロナに阻止されそうになれば、敵意を、そして隠しきれない焦りをむき出しにして表現する。
冒頭の不等式にあえて加えるなら、
人生哲学 > タイトル > その他
をぶれることなく貫いていたのかなと。
彼を見ていて「海外サッカー選手のコメント」群を初めて見たときに感じた強烈な違和感を思い出した。翻訳の口調もあれど、模範的、優等生的なそれは、荒々しいサッカー選手のものとは思えなかった。いつしかそれをスポーツマンシップの現れとして当然のものとして見ていたけど。
CakePHPerのRuby学習計画+Macで開発環境を整える
プログラミング経験はCakePHPのみからのRuby学習です。
1ヶ月後にRailsを使ったWebサイトが完成したらいいなと思っています。デザインの時間や、別サービスのリリース&チューニングを考慮しつつ目標設定。
コンテンツ
- ・学習ソースと組み立て
- ・導入前の準備
- ・いざ導入
学習ソースと組み立て
- プログラミングの学習方法一般として応用できるなと思った記事
- ボストンでのRuby on Railsの学び方
- 書籍も効率の良い学習には必須。この記事とAmazonレビューを見ながら
- 新社会人Webプログラマ向け、絶対に失敗しない参考書・推薦書
学習計画
- 入門書-たのしいRuby 第3版
一番最初。実際に動かしながらさらりと読み切る。
- チュートリアル-Ruby on Rails Guides
- 一週間程度で終えたいけど可能なんだろうか。英語が辛くなって放棄するかも。
- 基本書-プログラミング言語 Ruby
作業モチベーションが低い時に気になる項目orがっつりつまづいた時にその項目を一章読む。
Ruby+Rails導入前の準備
さきほどあげた記事の中で、MacにRuby開発環境をまとめて構築するスクリプトが紹介されていたので利用します。
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は以下のコマンドで削除できます。
$ 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
Xcodeを3.2.6にupdate
僕がCakePHPを選んだ理由。次の一歩はRailsかjQueryか
2月後半からプログラミングに集中できるようになり、2ヶ月がたちました。
CakePHPで2つ目のWebアプリがほぼ完成し、データ待ちになった今、学習初期の思考と次の一歩の意思決定を振り返るためのメモ。
CakePHPを使った理由
プログラム設計の素養を身につけたいという思いと、最速でサービスを完成させたいという思いのバランスをとった選択でした。
良いコードを書く素養
僕は、「良いプログラマ」になりたいです。プログラマは、人により生産性が大きく異なること。特にチームで開発する際に大きな差が生まれることを、多くの人から聞いて心に留めていたのです。その要素がどんなものかは知らずとも。
それを学ぶため、達人プログラマなどを読みました。その中で、「良いプログラマ」の素養の一つが「良いコード」を書けることで*1、良いコードの要素は。「保守性」「堅牢性」「パフォーマンス」に集約できそうだと結論づけました。
保守性=チームで効率よく開発、保守できること。可読性や再利用性を高めることはその手段で、OOPやMVCの分離、変数の命名、インデントなどを含む。
堅牢性=想定外の動作を引き起こさないこと。サニタイズなどのセキュリティ対策や、バリデーションや例外処理といった、想定外の状況への対策を含む。
パフォーマンス=一定の環境下で、実行時間や使用リソースが小さいこと。アルゴリズムとデータ構造の知識や経験、ボトルネックを見抜く能力が必要。
フレームワークでショートカット
良いコードを書くには、良いコードを読むことだといいます。僕が初めて読んだオープンソースのコードはWordPressだったのですが、その善し悪し以前に、全く意味が理解できませんでした。
その直前に、平PHPで2ちゃん風スレッドフロート式掲示板をさくっと作り、プログラミング楽しい!オレできるかも!を実感した直後のことでした。同じ動くプログラムでも、そのコードは月とスッポンほどに違っていました。
そのコードを「良いコード」へリファクタリングするのは諦め、新しいサービスをフレームワークで作ることにしました。フレームワークを使い、その規約に従うことで、「保守性」「堅牢性」の多くの部分がカバーされると考えたのです。
次の技術的な一歩は?
今こそ新しい一歩を踏み出すとき
今、新しい技術に手をつけたいと思っています。一方で、やっとCakePHPをスラスラと扱えるようになったところ、また生産性が下がるのは辛いです。しかし技術的にもサービス的にも適切なタイミングだと思っています。
サービス面→マネタイズ、生産性向上のコアとなる2サービスが完成し、自分の中で重要度の高いサービスの新規作成が一旦完了した。また、これらのメンテナンスと改良でどちらにしろCakePHPは使い続ける。
技術面→PHP、CakePHPというワンライン状態から脱することで、言語、FWを相対的に見ることができるようになる。それが、今後の技術選択の意思決定の質を大幅に上げると予想される。
RailsかjQueryか
次の一歩として考えているのは、Ruby+RailsかJavaScript+jQueryです。
Rubyは、今後のメイン言語候補、プログラマとしての「良い習慣」の実践という意味で良い選択肢かなと。Ruby(Rails)は生産性が高く、変化への適応性に富んだ言語のようです。また、Rails使用者の多くには、新しいものへの貪欲さと、それをアウトプットする積極性があると感じています。これはサービス完成最優先で、BDDやCIなんかを無視してきた僕には、ツール、情報量の面でありがたいものです。
一方JavaScriptは、「できることを広げる」という観点で非常に有望そうです。アニメーションやajaxは、ハイレベルなUXを実現してくれるはずです。また、Titaniumを使ったネイティブアプリも手を出してみたい分野です。
PythonはRubyに近いところでかなり悩んで検討しましたが、一旦Rubyで。世界的なトレンドはあれど、欧米の開発者とコラボする予定もないですし。
技術戦略、資金戦略、人生戦略
どう生きるか、の意思決定
RailsかjQueryかってのは、どう見ても技術的な優位や将来性の話ではなく、僕が今後何をしたいかによって決まることです。
現状の僕は、あまりに多くのことをやりすぎているようです。この2ヶ月の間、プログラミングに加え、HTMLとCSS、gimpの使い方も学習し、企画デザイン含め全て一人でやりきりました。
これは「学習能力」という僕の最大の強みの発揮であり、「パートナー探し」という重要事項の回避でもあります。
下手に学習能力が高いために、パートナーを探す努力をしていない面は否めず、これはネガティブな結果を招くかもしれません。今はクラウドワークスなんてサービスもありますし、デザインなんかは人にお願いし、そのご縁を大事にしつつパートナーを見つけたいと思う次第です。
戦略的に生きる
僕が常に心がけているのは、戦略的に生きることです。戦略的に生きるには、ゴールが明確でなくてはいけません。自分が幸福になるために実現したいことを明確にし、その実現に必要な「スキル」「リソース」を考え、最も効率的に獲得する道筋を描く必要があるのです。そのゴールが具体的であればあるほど、道筋を、筋のいい仮説として描きやすくなります。
このエントリは、現状を言語化することで、経験を元にその仮説の修正を行う試みです。月中の定例にしてもいいかもしれません。
愛用のMacBookAirインナーケースが優秀。一年半毎日のように持ち歩いても傷一つない
2010年10月にMacBookAirを使い始め、もうすぐ1年半が経ちます。
僕は常にMacBookAirを持って外出しているのですが、幸いにもハード面で一切のトラブルに見舞われていません。外観もこの通り。
画質の関係で伝わるかはわかりませんが、今も購入当初の輝きを保ち、傷一つない状態です。MacBookAirのボディ剛性も素晴らしいですが、インナーケースも幾分か貢献してくれたでしょう。購入当初から使っているケースはこれです。
be.ez LArobe MacBook Air 13 Allure Black
be.ez LArobe MacBook Air 11 Allure Color
軽く紹介
11,13インチ用があり、カラーは上の2種に加え、ラベンダーとモカもあります。また、横向きでダブルジップのタイプもあります。デザインは、シンプルですが野暮ったさはなく使いやすいです。
素材は低反発というのか、へこませるとゆっくり戻るタイプのやつです。ジッパー部分は、中身と干渉しにくいように工夫がしてあり、こすって傷をつけたことはありません。せっかくの外観をキレイに保つためにも、故障リスクを避けるためにもキーボードカバーと合わせ、いいインナーケースを使いたいですね。
moshi clearguard (JIS)
僕はこれに入れたうえで、普通のクッションのないビジネスバッグで携帯しています。バッグに本や筆箱をつめこんで、それなりの圧力がかかっても全く問題ありません。MacBookAirを長くキレイに使いたいかた、断然オススメです。
MySQLでDATETIME型の時刻差を計算
MySQL上で、DATETIME型の時間差を出す方法です。
僕の場合、出した値を合計して、その後PHPで扱う流れでしたので、UNIX_TIMESTAMPで変換してから差を出す方法を採用しました。
複数の方法で結果を出してみる
左2つのデータの差分を、カラム名の方法で出しています。
そのまま減算
数字列の差分になります。
FROM table_name
UNIXTIMESTAMP化してから計算
秒数で取得できます。
SUBTIME()で計算
後ろの引数は時刻ではなく時間を表す値でなければならないようです。
FROM table_name
TIMEDIFF()で計算
ちゃんとフォーマットされた時刻差が出るのですが…
FROM table_name
UNIXTIMESTAMPで取得すれば、その後gmdate()でそのまま時間っぽく表示できるので扱いやすいです。
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」は変数を最初に初期化して解決
↓
$var2 = NULL;
$var1 = $var2; //Undefined variableは出ない
「Notice: Undefined index」はindexの有無を確認する処理を入れて解決
最初に該当のindexが存在するかを確認し、存在しない場合の処理を記述します。
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は出ない
下の例では、$_POST['name']がセットされていないか空の文字列の時に「名前を入力してください」と出力します。!はNOTの意味です。||はorの意味で、片方がtrueだった時点で処理が実行されます。例文では!isset($_POST['name'])を前に置くことで、エラーが出なくなっています。
もちろん、こんなシンプルな例なら
変数を初期化したように、該当のindexを追加するだけで簡単に解決します。@をつけてNoticeエラーを非表示にする
処理や変数の前に@を付けることでNotice、Warningを該当部分のみ非表示にできます。
GETやPOSTで発生する大量の「Notice: Undefined index」
GETやPOSTをした時にこのエラーに出会うというケースは多いのではないでしょうか。
外部からの変数:$_GETと$_POST
<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の確認ボタンを経由せず、URL直打ちでconfirm.phpを見るとUndefined indexが出ます。
POSTメソッドを実行した時には、$_POST['formのname属性']という連想配列を定義しているようなものなので、そのPOSTメソッドが実行されなければ、定義していないindexを出力しようとしている状態になるわけです。
*1:初期化時に何を代入するかという議論もあるようですがここでは触れません