月別: 2014年10月 Page 1 of 2

macでウィンドウが画面外に隠れてしまって何もできなくなってしまったときの対処法

MacBook Pro Retina, 13-inch, Late 2012 を使っていますが、
たまに、開いているウィンドウが画面外に出てしまうことがありませんか?
普段デュアルディスプレイで使用していて、
打ち合わせ等でディスプレイ接続を切った際などに良く起こります。

そんなときの対処法。

Spectacleというアプリで解決!

Spectacleは、
ショートカットを使って、ウィンドウのサイズや配置を操作することができるアプリ(無料)です。
http://spectacleapp.com/

例えば画面の左半分と、右半分にウィンドウを分けて使いたい場合に、
ドラッグして、移動して、ウィンドウの端を引っ張って。。。という作業を、
ショートカットでやってくれるというアプリです。

ショートカット例

Left Half:

option + Command + ←

Right Half:

option + Command + →

Upper Left:

control + Command + ←

Upper Right:

control + Command + →

根本的な解決方法ではありませんが。。。

アプリの説明ばかりになってしまいましたが、
ウィンドウが画面外に行ってしまって、どうにもできなくなった場合に、
この機能を使って、強制的に配置させてしまいましょう!

根本的な解決方法ではありませんでしたが、
いざという時の対処法でした。

よくできるIT技術者がもつ3つの特性とは?

最近になって、本格的にこのブログから弊社をアピールしていこうとしているみたいだ。

 

しかし、技術者でありながら、Web上どこにでもあるような記事しか書けない。というのが私の現状。

そして、無限に広がるWebスペースを同じような記事で汚すようなことはしたくないし、

他のメンバーがそれらしい事を書いてくれるだろうから私はもういいだろうと思う。

とはいえど、ノルマ?いや、愛着?がある弊社のため記事を考えてみる。

管理者が激怒しそうな内容。。

 

今回は「仕事ができるIT技術者」についてを考える。

 

冒頭の経緯から「弊社のメンバーは技術力すごいんです」という結論に持って行くんだろ?

など思われた方もいらっしゃると思うが、そのような内容は下記には無い。

10年近く、いろいろな技術者、システム屋と接する機会があり、

私なりに分析したことが書かれている。

 

私の考えるところ「仕事ができるIT技術者」が持っている特性は、

 

1)真摯である

2)向上心がある

3)素直

 

の3点。うーん普通だ、プログラマーとかSEってデータベースが詳しい?とか・・

もっと「技術力」にフォーカスされるのではないのか!?

 

これはなぜかと言うと「技術力」というのは移り変わりが激しい。すぐ陳腐化する。

飛び抜けて技術力が高い方も世の中には存在はするが、感覚的に1000人に1人ぐらいだろう。

この資料では2011年の時点で、日本には102万人技術者が存在するようなので、約1000人。

 

一般的に「個人の技術力」の差は、「どんぐりのせくらべ」と表現すると想像がつくと思う。

 

「技術力」があるというのは、システム屋であれば、普通でありアピールポイントでも何でもない。

結局、上記のような人間のコアな要素が問われるのだと思う。

私のように、技術力も人間性も無いようなのは先も長くないだろうし最悪だ。

 

システムはグループで開発するので、これを組織のレベルに引き上げて考えてみると、

組織だと技術力は補完しあえるので、結局、A社、B社、C社・・・似たり寄ったりの構図になる。

そう考えると「技術力」が仮に同じ前提として・・、いや少し劣っていたとしても、

上記の特性をもつメンバーが多く集まる企業がシステムを開発した方が

失敗も少なく良い結果がでていると思う。

 

システム開発をお考えの際は、そのような基準でご判断されれば良いと思う。

 

弊社がそのような会社なのかは、私の方からアピールする必要はない。

お電話をいただいて担当者とお話をされれば、おそらく直ぐに判定できるだろう。

→でも、もしご興味がございましたら弊社実績もご参照ください・・。

 

参考にならないとは思いますが、書きました。

ORMで最後にINSERTしたデータのIDが知りたい

fuelphpで最後にINSERTしたauto incrementなid(プライマリKey)を取得したい時

いろいろ面倒な事をしてたんですが、save();後にオブジェクトから参照できました。

$new = Model_Hoge::forge();
$new->hoge = 'hogehoge';
$new->save();
$id = $new->id; // idのデータが取得できてる

素晴らしい・・。

LPIC試験受けましょう!

  サーバーインフラエンジニアの葉です。

LPICという資格をご存知ですか?

  「LPIC(エルピック)」とは、NPO法人/Linux技術者認定機関「LPI」が
実施している世界共通・世界最大・最高品質の「Linux技術者認定制度」です。

LPICはどんな資格ですか?

  

1.LPICは世界で通用するIT資格です。

世界共通基準で認定を行っており、150カ国以上の方々に受験されています。
  

2.LPICLinuxの技術力を中立公正に判定するIT資格です。

Linuxの技術力を客観的に評価する資格です。

LPICの試験の種類

LPICには、全部でレベルが3つがあります。
LPICレベル1、LPICレベル2、LPICレベル3です。

今回、私はレベル1を受けることになりました。

LPICレベル1概要

望まれるスキルレベル
LPICレベル1は、下記が問題なく行えるというレベルの試験内容となっております。
Linuxコマンドラインで作業を行うユーザの支援、大規模システムへのユーザの追加。
・バックアップとリストア、停止と再起動といった、簡単な保守作業を実行する(Xを含む)。
ワークステーションのインストールと設定や、そのワークステーションのLANへの接続、
 またはモデム経由でのスタンドアロンPCのインターネットへの接続を行う。
認定要件
「101試験」と「102試験」の2試験に合格するとLPICレベル1に認定されます。
受験する順番は、「101試験」と「102試験」のどちらからでも構いません。
※ ただし、認定されるためには2試験(101試験と102試験)を5年以内に合格する必要があります。
参考資料:www.lpi.or.jp/

まとめ

私の目標は、先ずLPICレベル1資格を合格することです。
そしてその次は、LPICレベル2に合格することを目指して頑張ります!
皆さんも興味が湧きましたら、ぜひ受けてみてください。

平成26年度秋期 情報処理技術者試験(SA) 受験録

試験を受けてきました。今回はシステムアーキテクト(SA)を受験してきました。情報処理技術者なら、ご存知だと思いますが、春期と秋期、年2回実施されています。私は、自己啓発もかねて、数年前から必ず受験するようにしています。(戦績はあまりよろしくありませんが(笑))

今回は、受験の意義と私なりに内容やポイントを整理し、お伝えしたいと思います。

受験の意義

資格をもっていても、実務では役にたたないから意味がない。という意見もよく聞きますが、個人的にはそんなことはないと思います。以下の点において、大きな意義や効果があると考えます。

理想の「答え」を知識としてストックできる

たとえば、PMの試験で、リスクが顕在化しそうなときは、プロジェクトの決済権限をもった部長に相談しろ的な回答があったりします。そうですね。そういうセオリーは実務において、あまり役に立たないというかプロジェクトは生き物でして、一筋縄ではいかない面も多々あります。
しかしながら、理想の「答え」を持たずして「現実」を乗り切るのは困難だと思います。乗り切ったとしても、でも実際はどうすべてきだったのかを考えたり、知識として持っておかなければ成長しません。そういった理想の「答え」が試験の解答の中にはたくさんあります。

対外的には技術のものさし、指標となる

もちろん、資格をもっていなくても、優れたエンジニアはたくさんいます。ただ、転職や企業で人事配置を検討する場合などにおいては、大きな指標になると思います。また、企業にとっては有資格者が多数いることで、技術スキルの指標になると思います。

資格手当をgetできる

企業によっては、さまざまな資格手当がありますし、邪な考えですがgetできたらおこずかいになります(笑)
ベンダー試験もいいですが、情報処理試験は国家資格ですし、なにより安価(5100円)です。

午前1

今回は、前回合格分の免除が効いて未受験。免除制度があるのはいいですね♪

午前2

対策としては、午前1、2ともにひたすら過去問を解くことですね。感覚ですが半分以上は過去問から出題されている気がします。あまりいいやり方ではないですが、理解できなくても「覚えておけばOK」です。(私は極力、理解するように努めていますが)

ここでは、過去問になかった(と思われる)新しい設問を1つ紹介します。

問25
脆弱性検査手法の一つであるファジングはどれか。
ア 既知の脆弱性に対するシステムの対応状況に注目し、システムに導入されているソフトウェアのバージョン及びパッチの適用状況の検査を行う。
イ ソフトウェアのデータの入出力に着目し、問題を引き起こしそうなデータを大量に多様なパターンで入力して挙動を観察し、脆弱性を見つける。
ウ ソフトウェアの内部構造に注目し、ソースコードの構文を機械的にチェックするホワイトボックス検査を行うことによって脆弱性を見つける。
エ ベンダや情報セキュリティ関連機関が提供するセキュリティアドバイザリなどの最新のセキュリティ情報に着目し、ソフトウェアの脆弱性の検査を行う。
【出典:平成26年度 秋期 システムアーキテクト 午前2 問25】

わかりますか?(笑)恥ずかしながら私は間違えました><
どちらかというと情報セキュリティスペシャリストの範疇のような気がしますが、昨今のシステム脆弱性を鑑みた設問ということでしょう。このように、午前の設問は広く知識が要求されます。答えは、後半のどこかで書きます。(笑)

午後1

午後1は記述式になります。4問中、2問回答する必要があります。基本的には、午前1と同じく過去問を繰り返し解くことで対応できます。但し、実務で経験していなければ、難しいところはあるかもしれません。何故なら午前とは異なり、過去問そのままでは出題されず、かつ時間も限られているので、そういった場合、実務上の経験がものをいうときがあるからです。

今回は、問1、問3を選択しました。
設問内容は、IPAのサイトからダウンロードできるのでそちらを参照してください。あと、回答まで書いている時間もあまりとれないので、今回はパスで。

問1は、社内システムの強化・改善に関する設問でした。
前半に業務プロセスについての記載があり、後半はそれをシステムに落とし込んだ時の詳細な記載があります。これらをもとに、設問を解いていきます。特に難しいと感じるところはなく、素直な問題だったと思います。
設問者ではないので、おそらくですが、

「業務プロセスはブレークダウンしたときに複数の業務プロセスに分割でき、それぞれにシステムの機能がリンク付けられる。業務プロセスごとの開始・終了判定について、適切にシステムに反映するためのスキル」

について問われているのではないかと思いました。

問3は、勤怠管理システムの導入に関する設問でした。
こちらは、他の設問よりも解答欄が多かったです。たくさん回答しなければいけないですがその分、部分点が狙えるかなと思ったので、選択しました。そういった戦略も試験には必要ですね。1問だけ、ひっかかったというか回答がわからなかったところがありました。設問2のd,e,fへの入力語句がちょっとわかりませんでした><
それ以外は、特にひっかかるところはなかったかな。。。
こちらは、

「システム導入に伴いパッケージを導入することで大部分の業務をシステム化できる。但し、企業によっては追加開発を伴うことがある。この場合、パッケージの機能やI/Fを考慮した上で追加開発を実行できるスキル」

について問われているのではないでしょうか。

午後2

午後2は、論文です。A,B,C,D判定でAが合格となります。
やはり個人的にはここが最大の難関ですね。10中8,9ここでB判定になってしまいます。参考書には簡単だみたいなことが書いてありますし、個人的には「できた!」って思ってもA判定をGETできませんね(汗)
苦手なのであまり参考になることは言えませんが、

(1)事象に対してモジュール化しておき、それをいくつもストックしておく
先にも例示しましたが、リスクが顕在化したときは部長に相談するなどのセンテンスをモジュール化し、事前にいくつも用意しておく。

(2)経験論ではなく一般論を書く
採点者は、回答者の体験したプロジェクトについての経験論ではなく、一般論を語ってほしいと思っています。そこは意識する必要あると思いますね。私も時間に追われると、プロジェクトの武勇伝を書いてしましますがそこは抑えて、、、

(3)日頃からPDCAの特に、C(heck)について意識しておく
常に結果を評価する癖をつけておくと、回答に困ったときにひらめくことがある。

(1)(2)は参考書にも載ってますね。
(3)は、個人的に思うところなので、書いてみました。

ちょっと冗長な文章になってしまいまいたが、以上、受験録でした。今回?、、、あまり自信ないですね(汗)

あ、問25の回答は、(イ)でした!

".on()"での"hover"の記述でつまずいたので

初秋の候、皆様お変わりなくお過ごしでしょうか。
私は年齢のためか、右足太ももに激痛を感じている今日この頃です…

さて、話は変わりまして、業務でjavascriptでプログラムを作成していた時のことなのですが、動的に生成される要素に”hover”で動作を設定したかったので、単純に”.on()”で処理をしようと考えたのです。

“.on()”で”hover”を機能させるには

“.on()”に”hover”を引数として書いても機能しない

$(".hoge").on("hover", function(){...});

まず単純に考えて上記の様に記述したのですが、見事に動作しませんでした…
動作すると思い込んでいたため、見当違いな部分を修正したりして、つまずき時間を費やしてしまいました。

“.hover()”は”.mouseenter()”と”.mouseleave()”

とりあえず、私のちっぽけな頭脳では全く解答が導き出せなかったので、Google先生に相談しました。
すると、「”.hover()”は”.mouseenter()”と”.mouseleave()”をまとめたものである」とのことでした。
なるほど、つまりそもそも引数に”hover”を渡すということが間違いだったようです。

“.mouseenter().mouseleave()”を”.on()”で記述

ということで、Google先生の相談の結果、書き直すと

$(".hoge").on({
"mouseenter": function(){...},
"mouseleave": function(){...}
});

上記コードになります。
これで”.on()”での”hover”の記述するということはできました。

しかし、もう一声

先ほどのコードでは、動的に生成される要素には適用されません。
ですので、動的生成要素に対応する場合はコチラ

$(document).on({
"mouseenter": function(){...},
"mouseleave": function(){...}
}, ".hoge");

“document”の部分は親要素が決まっていれば、その親要素の指定で大丈夫なようです。
上記コードで私の思っていた動作が無事実現できました。

後述

私がまだまだ未熟というか圧倒的に知識、技術が乏しいので、ごく当然なことだったのかもしれませんが、記事にしました。
調べたことは(なるべく)忘れないよう身に付けて、成長していこうと思います。

全く話は変わるのですが、”つまずく”って「爪(つま)突(づ)く」の意のようですが、”つまづく”ではなく”つまずく”と書くのがどうも一般的なようですね…知らなかった…

参考サイト

tacamy.hatenablog

PDO(fetch,fetchAll)について

模倣は上達への近道とはよくいったもので、保守フェーズで既存モジュールを模倣してロジックを書いてました。

そのときにはまってしまった問題についての備忘録です。

 

【やりたかったこと】

PDOを利用して、大量データを処理したい。

 

【発生した問題】

なぜかPHPのプロセスが途中で死んでしまう。
(例外すらスローされない)

 

【OKロジック】

$sql "select * from tbl_hoge where hoge = ?";
$params = array('hoge'=>1);
$stmt = $pod->prepare($sql);
$rs = $stmt->execute($params);
while ($row = <span style="color: #ff0000"><span style="text-decoration: underline">$rs-&gt;fetch(PDO::FETCH_ASSOC)</span>) {</span>
print_r($row);
}

 

【NGロジック】

$sql "select * from tbl_hoge where hoge = ?";
$params = array('hoge'=&gt;1);
$stmt = $pod-&gt;prepare($sql);
$rs = $stmt-&gt;execute($params);
$result_array = <span style="text-decoration: underline;color: #ff0000">$rs-&gt;fetchAll(PDO::FETCH_ASSOC)</span>;
foreach ($result_array as $row) {
print_r($row);
}

 

【原因と反省】

もうおわかりですね。はい。SQLで大量データを取得して

fetchAll(全データを配列に変換)を利用したのがまずかったようです。

fetch(1行ずつ取得)を利用すれば解決しました。

ちなみに、SQLの結果セットをlimit句で相当数絞ってからfetchAllを利用してもNGでした。

担当したPJのモジュールは、fetch,fetchAllもラッピングされており理解せずに関数を利用(模倣)してました。

関数利用の際は、きちんとマニュアルを確認して理解したうえで、利用しないといけないですね。

Macの外付けキーボード設定まとめ

概要

uchiyama です。

先日、新しいMacBookProが支給されました。

普段は、長時間キーボードを叩くため、MacのキーボードではなくRealforceを使うようにしています。

Macに外付けキーボードを付けた時に、

デフォルトの状態だと色々とおかしなキー配置になります。

色々と設定しなければならなかったので、備忘録としてやったことを記載しておきます。

キーボードの種類を変更

なぜかUSキーボードとして認識される場合があるので、

JISに認識されるようにします。

環境設定 > キーボード > キーボードの種類を変更

のボタンを押下します。

 

あとは指示に従ってキーを押していけば、

種類を選択する画面が現れるのでJISを選択します。

 

修飾キーの設定

システム環境設定 > キーボード > 修飾キー

と進む。

「キーボード選択」で、外部キーボードを選択し、以下のように設定しました。
Caps Lock と Option は使わないので、完全にオフです。

Karabiner のインストール

いろいろキー設定を行うために、Karabiner をインストールします。

https://pqrs.org/osx/karabiner/index.html.ja

リピート速度を変える

カーソル移動を調整するためにリピート速度を変えます。

Karabinerを立ち上げ、「Key Repeat」の数値を変えます。

早くする場合は数値を小さくしていきます。

Vim でノーマルモードに戻った時の挙動設定

Vimでノーマルモードに戻った時に、半角英数に切り替わるように設定します。

Karabinerを立ち上げ、

Misc & Uninstall > Open private.xml

のボタンを押下します。

private.xml に以下の内容を記載して保存します。

<?xml version="1.0"?>
<root>
<appdef>
<appname>iTERM2</appname>
<equal>com.googlecode.iterm2</equal>
</appdef>
<appdef>
<appname>MACVIM</appname>
<equal>org.vim.MacVim</equal>
</appdef>
<list>
<item>
<name>Leave Insert Mode with EISUU (vim keybind apps)</name>
<identifier>private.vim_keybind_apps_esc_with_eisuu</identifier>
<only>iTERM2,TERMINAL,MACVIM</only>
<autogen>--KeyToKey-- KeyCode::ESCAPE, KeyCode::ESCAPE, eyCode::JIS_EISUU</autogen>
<autogen>--KeyToKey-- KeyCode::JIS_BRACKET_LEFT, VK_CONTROL, KeyCode::JIS_BRACKET_LEFT, VK_CONTROL, KeyCode::JIS_EISUU</autogen>
</item>
</list>
</root>

「Change Key」に移動して、「ReloadXML」を押すと、

「Leave Insert Mode with EISUU (vim keybind apps)」という項目が表示されるので、

チェックを入れます。

これで完了。

Seil で、英数/かな を設定

Seilをインストールします。

https://pqrs.org/osx/karabiner/seil.html.ja

Seilを立ち上げて、以下の項目をオンにします。

  • For Japanese > Enable NFER on PC keyboard
  • For Japanese > Enable XFER on PC keyboard

これで、普通のMacのように 英数/かな を切り替えることができます。

参考

MacBook セットアップ備忘録 外付けキーボード(REAL FORCE) 編

http://d.hatena.ne.jp/ginbear/20090505/1241505354

Vimのインサートモードを抜けるときにIMEをオフにするKeyRemap4MacBookのprivate.xml設定

http://m.designbits.jp/13091710/

Advanced Custom Fieldsを使ってカテゴリーやカスタムタクソノミーに画像を登録する方法

Advanced Custom Fieldsを使ってカテゴリーやカスタムタクソノミーに画像を登録する方法

ニュースなどの記事のタイトル前にアイコンが挿入されているケース。
今後カテゴリを追加していく際CSS等を触ることなく
アイコンをWPから投稿できるようにしました。

【使用するプラグイン
「Advance Custom Fields」

Word Pressのカスタムフィールドプラグインは沢山ありますが、
「Advanced Custom Fields」はカテゴリにも画像を追加するカスタムフィールドを追加できます。

Advanced Custom Fieldsでカテゴリにカスタムフィールドを追加

Advanced Custom Fieldsでカテゴリにカスタムフィールドを追加

タクソノミーに画像のカスタムフィールドを追加する時に
返り値を「画像URL」に設定しておく

登録した画像を取得

こちら(カテゴリに画像のカスタムフィールドを追加する方法[WordPress])に丁寧に書かれているので参考にしながら、get_postsでループさせます。

<dl>
<?php

$posts = get_posts(
array(
'post_type' => 'post'
)
);


foreach($posts as $p){ ?>

<dt>
<?php
echo get_the_date('Y.m.d',$p->ID);
$cat = get_the_category($p->ID);
$cat_id = $cat[0]->cat_ID;
$cat_name = $cat[0]->cat_name;
?>
<img src="<?php the_field('フィールド名','category_'.$cat_id); ?>" alt="<?php echo $cat_name; ?>">
</dt>

<dd>
<a href="<?php echo get_the_permalink($p->ID); ?>">

<?php echo get_the_title($p->ID); ?>
</a>
</dd>

<?php } ?>

</dl>

カスタムタクソノミーの場合

ポストタイプ名:news
タクソノミー名:news_cat
フィールド名:cat_img

カスタムタクソノミーを追加してそのまま使っても上手く挙動するわけもなく、
調べると、
Advanced Custom Fields でカテゴリーのアイコンや背景色を設定
にかかれていました。

「category」と設定していた所を「news_cat」みたいな形にしないといけないとのこと。
先ほどのページを参考にしながら、下記に変更。

<dl>
<?php

$posts = get_posts(
array(
'post_type' => 'news'
)
);


foreach($posts as $p){ ?>

<dt>
<?php
echo get_the_date('Y.m.d',$p->ID);
$terms = wp_get_object_terms( $p->ID, 'news_cat' );
$term_id = $terms[0]->term_id;
$term_name = $terms[0]->name;
?>
<img src="<?php the_field('cat_img','news_cat_'.$term_id); ?>" alt="<?php echo $term_name; ?>">
</dt>

<dd>
<a href="<?php echo get_the_permalink($p->ID); ?>">

<?php echo get_the_title($p->ID); ?>
</a>
</dd>

<?php } ?>

</dl>

マルチサイトを利用し、別ブログで呼び出したい場合

マルチサイトで別ブログからタクソノミーを呼び出したい場合につまずいたのでメモ。
いくらswitch to blogをして別ブログから呼びだそうとしてもタイトルと日付は取れるのに、
どうもうまく、タクソノミーが取れずに彷徨っていると。
switch to blogしてもタクソノミーの情報は取ってこれないことが判明。

以下を参考にfunctionにありがたくコピペ
参考:[WordPress]マルチサイトで別ブログの記事が属するカスタムタクソノミーを取得

function.php

function get_taxonomies_by_blog_post($taxonomy, $blog_id, $post_id) {
// ブログを切り替える
switch_to_blog($blog_id);
global $wpdb;
// クエリ作成
$query = ”
SELECT *
FROM $wpdb->term_relationships
LEFT JOIN $wpdb->term_taxonomy
ON $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
LEFT JOIN $wpdb->terms
ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
WHERE $wpdb->term_relationships.object_id = %d
AND $wpdb->term_taxonomy.taxonomy = %s
“;
// プレースホルダ
$args = array($post_id, $taxonomy);
// データを取得
$taxonomies = $wpdb->get_results( $wpdb->prepare( $query, $args ) );
// ブログを戻す
restore_current_blog();
return $taxonomies;
}

これで別ブログのタクソノミーも取得できるようになったので
呼び出したい場所に下記の修正したコードを書く

ポストタイプ名:news
タクソノミー名:news_cat
ブログID:2
フィールド名:cat_img

上記の場合

取得したい場所に(例:home.php)

<dl>
<?php

switch_to_blog(2);
$posts = get_posts(
array(
'post_type' => 'news'
)
);


foreach($posts as $p){ ?>

<dt>
<?php
echo get_the_date('Y.m.d',$p->ID);
$terms = get_taxonomies_by_blog_post('news_cat', '2', $p->ID);
$term_id = $terms[0]->term_id;
$term_name = $terms[0]->name;
?>
<img src="<?php the_field('cat_img','news_cat_'.$term_id); ?>" alt="<?php echo $term_name; ?>">
</dt>

<dd>
<a href="<?php echo get_the_permalink($p->ID); ?>">

<?php echo get_the_title($p->ID); ?>
</a>
</dd>

<?php } ?>

</dl>
<?php restore_current_blog(); ?>

これでなんとかカテゴリに画像を追加して運用できるかなと。
別ブログでタクソノミー取得できないのは以外とハマってしまって大変でした。

分岐処理をオブジェクトで表現してみる

みなさんどうも、WEBエンジニアの kinu です。
好奇心で Smalltalk を参考に普段使っている PHP で分岐処理を if 文を使わずにオブジェクト指向で実装してみました。

目標

下にあげたような単純な分岐を処理できるようにする。
[code]
$value = 1;
if ($value == 1) {
echo ‘True’;
} else {
echo ‘False’;
}
[/code]

実装内容

処理の内容はシンプルで Logical にセットした値によって Bool の具象クラスが生成され、それがifTrue と ifFalse に渡されたクロージャを実行するかを決定するようになってます。

logical class figure

以下ソースコードです。

Bool.php

[code]
interface Bool
{
public function ifTrue($closure);

    public function ifFalse($closure);

}
[/code]

True.php

[code]
namespace Bool;

class True
{
public function ifTrue($closure)
{
$closure();
}

    public function ifFalse($closure){}

}
[/code]

False.php

[code]
namespace Bool;

class False
{
public function ifTrue($closure){}

    public function ifFalse($closure)
{
return $closure();
}

}
[/code]

Logical.php

[code]
class Logical
{
private $value;

    public function __construct($logic)
{
$this-&gt;value (bool)$logic;
}
public static function set($logic)
{
return new self($logic);
}
public function asBoolean()
{
return $this-&gt;value ? new \Bool\True : new \Bool\False;
}
public function ifTrue($closure)
{
$this-&gt;asBoolean()-&gt;ifTrue($closure);
return $this;
}
public function ifFalse($closure)
{
$this-&gt;asBoolean()-&gt;ifFalse($closure);
return $this;
}

}
[/code]

使用例

[code]
$value = 1;
Logical::set($value == 1)
->ifTrue(function () {
echo ‘True’;
})
->ifFalse(function () {
echo ‘False’;
});
[/code]

ちなみに Smalltalk だと

[code]
| aValue |
aValue := 1.
aValue = 1
ifTrue: [Transcript show: ‘True’]
ifFalse: [Transcript show: ‘False’]
[/code]

やっぱり比較するとクロージャfunction ()...のくだりが長い…。
しかも、外のスコープの変数を使おうとすると、

[code]
$value = 1;
Logical::set($value == 1)
->ifTrue(function () use ($value) {
echo $value.’ は 1 だよ。’;
})
->ifFalse(function () use ($value) {
echo $value.’ は 1 じゃないよ。’;
});
[/code]

さらにネストでもしようものなら、

[code]
$value = 1;
Logical::set(isset($value))
->ifTrue(function () use ($value) {
Logical::set($value == 1)
->ifTrue(function () use ($value) {
echo $value.’ は 1 だよ。’;
})
->ifFalse(function () use ($value) {
echo $value.’ は 1 じゃないよ。’;
});
});
[/code]

…実用的ではないですね。

まとめ

参考に Smalltalk の実装を見ていたときにポリモーフィズムなんかのオブジェクト指向の基礎を学べました。なにより Smalltalk 環境の使い方も少しだけ理解できたのでよかったです。まあ、もともとそのつもりでやってみたというのもありますが。

出来上がったものに関しては… PHP は if文がありますしね…。
でもクロージャの use がいらなくなったりしたら使ってみてもいいかな。あとはPHPで論理値がオブジェクトになっていることによるメリットなんか見つけていきたいです。

Page 1 of 2

© SEEDS Co.,Ltd.