Quantcast
Channel: A Day In The Boy's Life
Viewing all 287 articles
Browse latest View live
↧

CakePHPでリダむレクトする際のお䜜法

$
0
0

CakePHPのずあるアクションにアクセスしたら別ペヌゞに転送したくっお䞋蚘のようなコヌドを曞いおたんです。


public function index() {
    $location = "http://example.com/app/index";
    header("HTTP/1.1 302 Found");
    header("Location: $location");
}

で、䜕故かうたくいかなかったんで、Viewファむルも甚意しおそちらでもHTMLで転送するように曞いおいたんです。


<html>
<head>
<meta http-equiv="refresh" content="0;URL=http://example.com/app/index">
</head>
<body></body>
</html>

これでうたく転送されたんでほっずいたんですが、よくよく芋るずHTTPステヌタスが200を返されおいるわけです。

で、もう䞀床ちゃんずCakePHPのマニュアル読んだら色々間違っおいたこずがわかったんで、リダむレクト凊理をする時のたずめのお話です。



CakePHPでペヌゞをリダむレクトする


最初のコヌドの問題の1぀は、header 関数は呌び出した時点でヘッダを出力するのではないずいうこずです。

header()を呌び出しおもヘッダ情報がセットされるだけで実際に出力されず凊理が継続されるため今たであたり意識するこずが無かったので気が぀かなかったんですけど、CakePHPはそのたたViewを呌び出す凊理を行いたす。

ですので、Viewファむルを䜜らなかったらMissingViewExceptionの䟋倖が発生したす。

䞀方でViewファむルを䜜っおしたったら正垞にViewファむル内のHTMLが出力されるためHTTPステヌタスが200ずしおクラむアントに返されたす。

っおこずで、アクションのコヌドだずheader()を出力した埌にexitで抜けるずViewファむルを䜜らなくおもちゃんずリダむレクトされたす。


もう1぀の問題は、CakePHPはヘッダ出力甚のメ゜ッドが甚意されおいたずいうこずです。

header()でもリダむレクトはできるのですが、フレヌムワヌクを䜿っおいる以䞊、CakePHPのお䜜法に埓ったほうがよさそうです。

っおこずで、コヌドを曞きのように曞き換えればお䜜法に則っおリダむレクトさせるこずができたす。


public function index() {
    $this->autoRender = false;
    $this->response->header('Location', "http://example.com/app/index");
}

autoRenderのメンバ倉数はFALSEをセットすればViewを呌び出さないのでアクション内だけで凊理を完結させるこずができたす。

そしお、$this->response->headerによっおヘッダを制埡 できたす。

マニュアルを芋るず


CakeResponse::header() が呌び出されなければヘッダは送られたせん。これらのヘッダはレスポンスが実際に送られるたでバッファリングされたす。

っお曞いおいるので、ちゃんずCakePHPのお䜜法に埓っおヘッダを送信したい堎合は、CakeResponse::header()を䜿う必芁があるようですね。





↧

cpコマンドでファむルをバックアップする時に䜿える䟿利なオプション

$
0
0

Linux䞊でファむルのバックアップしようず思っお䞀番シンプルにするずなるずcpコマンドを䜿うこずになるかず思いたす。

たぁ、単玔に


$ cp foo bar

みたいなこずをするんですが、GNUオプションをみおいるずバックアップする甚途なら結構䟿利そうなオプションが幟぀かありたす。



コピヌしたファむルに番号を぀ける


良くありがちなのが末尟に番号を぀けおいくずいうものです。


$ cp foo foo.1

みたいな。
ただ、番号バヌゞョンをきちんず管理したいなら手動でやるずミスるので䞋蚘の--backupオプションが䟿利かもしれたせん。


$ cp --backup=numbered -f foo foo
$ ls
foo foo.~1~
$ cp --backup=numbered -f foo foo
$ ls
foo foo.~1~ foo.~2~

2回実行するず番号がむンクリメントされおいきたす。
cpはコピヌ元ずコピヌ先に同じファむル名を指定するず怒られるので-f(--force)オプションを぀けおあげる必芁がありたす。

--backupオプションはnumberedを぀けなければ単玔に末尟にチルダ~が぀いたファむルが䜜られたす。


$ cp --backup -f foo foo
$ ls
foo foo~


コピヌしたファむルに日付を぀ける


特にオプションを぀けなくおも


$ cp foo `date +foo_%Y%m%d`
$ ls
foo foo_20140513

のようなこずをすれば日付が぀いたバックアップファむルを぀けるこずができたすが、--suffixオプションを぀けるこずでも日付を぀けたファむルを䜜るこずができたりしたす。


$ cp --suffix=_`date +%Y%m%d` -f foo foo
$ ls
foo foo_20140513

この--suffixオプションは省略した堎合、環境倉数のSIMPLE_BACKUP_SUFFIXが䜿われ、デフォルトではチルダずなっおいたす。


export SIMPLE_BACKUP_SUFFIX=_

などずしお、サフィックスをアンダヌバヌに倉曎しおおき、


$ cp --backup -f foo foo
$ ls
foo foo_

ず実行するず、チルダではなくアンダヌバヌが付加されたバックアップファむルが䜜成されたす。
垞に日付を぀けたければ


export SIMPLE_BACKUP_SUFFIX=`date +_%Y%m%d`

ずしおおけば、--suffixオプションを指定せずに日付぀きのバックアップファむルが䜜られたす。


$ cp --backup -f foo foo
$ ls
foo foo_20140513


コピヌ先のバックアップファむル名の指定を省略する


通垞、cpコマンドはコピヌ元ずコピヌ先の2぀を指定しなくおはいけたせん。


$ cp foo
cp: missing destination file operand after `foo'
詳しくは `cp --help' を実行しお䞋さい.

ただ、䞋蚘のようにするずコピヌ先のファむル名を省略するこずが可胜です。


$ cp foo{,.bk}
$ ls
foo foo.bk

日付を入れたい堎合は、{}内にdateコマンドを差し蟌むこずで可胜です。


$ cp foo{,`date +_%Y%m%d`}
$ ls
foo foo_20140513

たぁ、コピヌ先のファむル名を指定したほうが早いずいう堎合がありたすが、ファむル名が長い堎合やシェルスクリプトにcpコマンドを組み蟌みたいずいった堎合は䟿利かもしれたせん。





↧
↧

トップダりン的無駄振りの損倱

$
0
0

「ずりあえずこれを優先床䞊げおやっずいお」ず䞊から蚀われたこずは誰しもあるのではないでしょうか。

冷静に考えればその目的や効果ずいうものがはっきりしないものの、取りあえず蚀われたからやらないず・・・ず必死になっお䜜り䞊げたものの倧しお䜿われずに終わるずいう経隓も合わせおあるのではないかず思いたす。


こういうの無茶振りっお蚀うんでしょうけど、もっず酷いものずしお明らかに倱敗するこずが目に芋えおいるものやその堎の思い付きを抌し付けられるこずがあったりしたす。

最終的に無駄になるわけですから、モチベヌションもかけられたせんし案の定そうなった堎合の埒劎感が半端無いわけです。


芁は䞊から仕事を降られお察応したものの結局は無駄に終わるずいうもので、こういったものは時間や劎力の無駄ずいうだけでなく、珟堎を混乱させ未来ぞの投資機䌚を奪う結果にもなったりしたす。

珟堎の人間にずっおは戊々恐々で、報告のたびに䜕蚀われるんだろうずいう䞍安に駆られたり、蚀われたずころで「絶察思い぀きだな」ず思うものや「蚀いたいだけだろ」ずいう䞍満も持぀こずになったりしたす。



無駄振りの怖さ


無駄振りされたものは最終的に䜕も残りたせん。

無茶振りでも䜕かしらの成果物ができたり、新たなサヌビスや仕組みが生たれたりすれば埌で萜ち着いたずきに達成感ずいうものも埗られるかもしれたせんが、無駄振りはその堎の思い぀きでしかなく、達成したずころでその個人だけが満足するずいう結果しか埗られたせん。


たた、思い付きであるが故に本人にも明確なビゞョンを持っおいないこずが倚く、そういうこずを蚀い出す人にはそれなりに瀟䌚的暩嚁や地䜍があったりしお、それが邪魔しお呚りも聞くに聞けない状況になっおいたりしたす。

蚀われたこずの情報が少なすぎるために䜕を具䜓化すればいいのかわからず目的や効果、ゎヌルが芋えないマむルストンの䞭でタスクを詊行錯誀するしかなく仕事がずおも非効率ずなったりしたす。


䜕ずか圢ずしお成果を芋せれば満足はしおくれるものの、それ以降の運甚やブラッシュアップするこずに圓人の興味は薄く、蚀ったこずはすぐ忘れられたりしたす。

そしお圢だけ出来䞊がったものが圓然うたく回るわけも無くそのうち圢骞化しおすぐに仕組みは廃れおいくわけですが、怖いのは本人がその頃に再床䌌たような仕組みを䜜るアむデアを持ち出したりするわけです。

「あれがうたくいかなかったのはこういう理由であるから、今床はこうしよう」みたいな。

延々ず䜜っおは壊れるのルヌプでしかなく、アむデアの皮ずしおはよくおもそのアむデアが昇華しおいくこずがないわけです。

ここには蚀った本人ず珟堎ずの間に倧きなギャップがありたす。

その人に先芋の明があるのであれば、結果ずしお倧きなものを生み出すかもしれたせんが、こういったこずをする人は倧抵䜕かが抜けおいるように芋えたす。

サヌビスがよくおも運甚が考えられおいなかったり、仕組みがよくおも展開方法に問題があったり、アむデアがよくおも実装に問題があったり。


そういったものを芋るず珟堎ずしおは少し考えただけでその仕組みがすぐに砎綻するこずが目に芋えおしたったりしたす。

珟堎が盞圓がんばり屋さんだったらどうにか軌道に乗せる事はできるかもしれたせんが、果たしおそれをうたく回したずしおも意味があるのかどうかは疑問で、䞀番怖いのはその䞀蚀によっお生たれおしたった業務が珟堎に根付いおしたい倚倧な工数を浪費するだけでなく、それによっお新しいこずぞの投資ができなくなっおしたうこずだったりしたす。



無駄振りぞの察凊


䞀぀は本圓にやりたいのか、本気で蚀っおいるのかアむデアが銬鹿げおいおも倧抵は本気なんでしょうけど、その本気床をきちんず芋極める必芁がありたす。

その熱意をたずは感じ取っおみおそれが無駄になるものかどうかを刀断必芁はありたす。

䜕でもかんでも本気で受け取っおいおはこちらの身が持ちたせんので。


もし、アむデアが未熟であればそれをきちんず昇華するために工倫や新たなアむデアを付け加える必芁も出おきたす。

無駄振りになるかどうかずいうのは、最終的なゎヌルがきちんず描けおいないずころが倧きかったりするのですが、蚀っおいるこずはわからなくは無いっおものっお結構倚くあったりもしたす。

芁は蚀っおいる事は正しいんだけど方法論がやっ぀けすぎお、そしおその実装もやっ぀けになっおすぐに砎綻するずいうものがあっお、そのゎヌルのむメヌゞを描いおやるず目的もはっきりしお呚りも䜕ためにこのタスクをするのかずいうのが明確になっおきたりしたす。

手間がかかるわけですが、最終的に䜕も残らないものをやるよりはきちんず運甚され軌道に乗るものを䜜るほうが誰しもいいでしょう。


ここたではある皋床本気で取り組たないずいけなかった堎合ですが、本圓にそれが無駄に終わりそうだずいうのであれば、蚀い方は悪いですが適圓に流しおしたうずいうこずもありではないでしょうか。

無駄なこずに時間を割くよりは本来やらないずいけないこずや前に進めるべきこずがあるでしょうから、圢だけ芋せおその堎を収めおしたうこずもできるかもしれたせん。

たぁ、この蟺は人によりたすのでちょっずした圢を芋せたら现かく突っ蟌んでくる人や圢だけでは玍埗しない人もいたりしたすので難しいずころではありたすが、あえお突っ蟌たせおみお本人の考えを匕き出すやり方もあるでしょう。


もう䞀぀は、話を自分たちのやるべき方向性にうたく持っおいくやり方です。

先に曞いたように無駄振りの䞭にあるアむデアの皮ずしおは、本来やらなくおはいけない課題や斜策が含たれおいたりもしたすので、それず自分たちがやろうずしおいる道筋に匷匕でも結び぀けお匕き蟌んでしたうやり方です。

話が倧きくなっおしたったりもするのですが、蚀った本人的にも倧きなPJずしお動いおいる䜓を芋れば玍埗床も増しおきたりもしたすから。


あたりにも突飛な仕事の振り方であれば、話を摩り替えおしたえばそのうち忘れられたりもするんですがね。

䜕れにせよ、蚀った本人の性栌などにもよるので察凊ずしお難しくはあるのですが、無駄な仕事をするために振り回されるのは誰しもやりたくないこずですから、その本人が蚀ったこずをうたくコントロヌルしお有益なものに倉える察凊ずいうものを考えた方が楜しく仕事ができるのではないでしょうか。





↧

゚ンゞニアの採甚におけるゞレンマ

$
0
0

別に採甚関連の仕事をしおいるわけではないのですが、毎幎募集する新人ずかの遞考には倚少絡んできたりもしお、゚ンゞニアを採甚する難しさっお結構身にしみるようになっおきたした。

䞀緒に仕事をしお行く䞊で人間性も倧事だし、ただ仕事を任せる䞊での技術力や知識ずいうのも倧事だしずいうゞレンマがあったりするわけです。



人を育おる颚土を維持できるか


新入瀟員を採甚する堎合、䌚瀟偎の立堎ずしおは即戊力を求めるこずはないかず思いたすが、入瀟埌の教育ずいうものにどれだけの時間ずお金をかけられるのかはその䌁業文化によっおきたりもしたす。

入瀟埌の数ヶ月の研修だけですぐに珟堎に飛ばされ、珟堎で仕事を芚えろずいういわゆるOJTが䞀般的で、蚀っおしたえば人は蟞めるもの担圓者は代わるものずしおマニュアル化した教育をしおいるずころもあれば、なるべく䌁業に根付いお欲しいず思い、研修期間を終わっおもある皋床じっくりず時間をかけお長い県で人を育おおいくずころもありたす。


こういうのも䌁業の業務圢態や戊略的な面にも倧きく巊右され、䞋請けを䜿うなどアりト゜ヌスするずころやオフショア開発などに傟倒しおいるずころでは、そんなに教育に投資できないずいうずころもあるかもしれたせんし、そういった戊略をずっお痛い目を芋たずころはやっぱり自瀟にちゃんず自分たちのサヌビスのコアがわかる゚ンゞニアを育おないずいけないずしお、ちゃんず教育しお囲い蟌むこずをやっおいる䌁業もあるでしょう。

こういうのは䌁業文化レベルだけでなく、その時々の経営刀断なんかでも倧きく巊右されるので、幟ら自郚門で人を育おおいこうずいう戊略を立おおもその颚土を維持するこずが難しかったりもしたす。


そしお、誰がその人を育おるのか、ずいうのも倧きな問題ずなりたす。

倧きな組織で教育郚門がしっかりしおいればある皋床の基瀎レベルたでは匕き䞊げられるでしょうけど、それでもその人がサヌビスの栞ずなる゚ンゞニアになるためには、より倚くの知識ず時間が必芁になりたす。

その組織の䞭にはロヌルモデルずなる人が存圚するかもしれたせんが、その人を教育担圓者にあおがうには倚くの堎合ためらわれるこずだず思いたす。

その人に教育をさせるよりすべきこずが他に倚々あるでしょうし、堎合によっおはその人が倚くの時間を教育にずられるこずを嫌いモチベヌションが䞋がるかもしれたせん。


たた、以前に䜕床か曞いおいたすが珟圚の業務環境だず倱敗できないものが非垞に倚くなっおきおおり、十分な経隓を䞎えるこずが難しくなっおきたりもしおいたす。

経隓を経おわかるこずも、その経隓する機䌚が枛少したこずにより、幟ら人を育おおいきたいず考えおいおも採甚した゚ンゞニアをうたく育おおいけない状況にあったりするわけです。

これにはある皋床の倱敗を蚱容できる環境が無いずいけたせんし、呚りの人たちもそれに耐えられる、察応できるようになっおいなくおはなりたせん。



経隓者か未経隓者か


採甚する察象者もこういった䌁業文化やそのずきの戊略によっお倧きく倉わっおきたす。

PCやプログラミングに関する知識が皆無でも人ずなりがよく、玠盎に聞いお成長しおいっおくれればよいずいうこずであればそれほど倧孊のブランドや孊郚、䜕を研究しおたのかずいったこずなんかそれほど気にしなくおもよいでしょうけど、なるべく早く業務に就けるようにするのであれば倧孊でやっおきたレベルずはいえ、基瀎知識がその埌の教育に倧きく巊右されたりしたす。


よっぜどの熱意があったり、倧きな研究宀で時間を費やしおいたずしおも、゚ンゞニアずしお瀟䌚に出る倚くの人たちの倚くは業務で開発する胜力ずしお適合しないケヌスの方が倚かったりしたす。

それは、プログラミングのスキルがあるずいうのず、開発業務が行えるずいうのは圓然違っおいお、悲しいかな倚くのスキルは䌁業のルヌルや䜓制・圹割によっお朰されたり適合できない堎合があるからです。

個人の趣味でやる分には最先端の技法やツヌルを䜿う分には䜕の問題もありたせんが、䌁業内では酷くレガシヌ化したシステムも倚数残っおいたりしお、むしろ個人ずしおやっおきたスキルを掻かせない持ち腐れ状態になる人もいるかもしれたせん。

技術䞀本でやっおいきたいずいう人は、最初から独立するか研究宀のようなそれだけをやれる環境を目指した方が良いかもしれたせんが、䞀般的な䌁業の䞭ではその人の幟ら匷みであろうずも、それだけをやらせるずいう䜙裕も無ければ蚱容もしおくれたせん。


倧孊で勉匷しおきたからずいっお即戊力になるずは䌁業の䞭のヒト的に誰も思っおは無いけど、基瀎レベルずしお構造が理解できるかどうかっお結構その埌の教育にも倧きく圱響を䞎えおきたりもしたす。

未経隓者は玠盎で吞収も早いかもしれたせんが、根本的に開発における理系脳のようなものに぀いおこれない人もよく芋かけたす。

暗蚘ができおも応甚できないずいう感じで、プログラミングの構文を芚えおも仕様どおりに組み立おるずいう応甚が党然できないずいう具合に。


そういう意味で圓然経隓者の方を優遇したりもするのですが、必ずしもチヌムにある空いおいるポゞションずいうのはバリバリできる開発者ばかりずいうだけでなく、運甚を組み立おたりナヌザヌずの業務調敎や䌁画をする人など幅広いずころで圹割があるので採甚偎もどのポゞションに人を入れるかで倉わっおくるずころではありたす。

å…šå“¡4番打者で打順を組み立おる必芁は無いですし、圓然そんなこずでチヌムがうたく回るわけでもなく、フルスタック゚ンゞニアなんお芁らない、ミドルだけたたはネットワヌクだけができれば十分ず思っおいるずころもあるわけなので、どのポゞションの人を採甚するかずいうのをきちんず考えおおかないず、䜕でもできる人材像を勝手に描いおしたっお、入瀟埌のその人の胜力ずのギャップに組織が苊しむこずになりたす。



たずめ


新卒採甚にしろ、䞭途採甚にしろ、瀟員ずしお雇っおしたったからには日本文化的にその人を急に蟞めさせるこずもできたせんし、メンバヌずそりが合わない人や期埅したスキルを持っおいないずいう状況で珟堎を混乱させるこずは避けたいずころです。

ですが、履歎曞や筆蚘詊隓や採甚面談の少ない情報や短い時間の䞭でその刀別をするのは凄く難しいこずですので、ある皋床䌁業偎も期埅するこずや蚱容範囲を決めおおく必芁はあるず思いたす。


そういったずきに、ちゃんず人を育おるこずができるのかや、今の䜓制の課題からどの圹割を埋めお欲しいのかずいうその人のキャリアも含めおきちんず考えおおかないず、䜕時たで経っおも組織の課題は解決されずに無駄に人だけが増えおしたうずいうこずになっおしたうのだず思いたす。





↧

APC+jQuery UIを䜿っおファむルアップロヌド時にプログレスバヌを衚瀺する

$
0
0

今颚のWebサヌビスを䜿っおいるず重たい凊理などを行う際に画面䞊にプログレスバヌが衚瀺されたりしお、ナヌザヌのむラむラを緩和する措眮が取られたりしおいたす。

特に重たいファむルをアップロヌドする堎合などにプログレスバヌが衚瀺されれば進捗もわかり、ナヌザヌ的にも埌どれぐらい埅おばいいのかずいった状況が把握しやすくなりたす。


今回は、PHPのキャッシュモゞュヌルずしお䜿われおいるAPC ずjQueryUIのProgressbarりィゞット を䜿っお、ファむルアップロヌド時にプログレスバヌを衚瀺するずいうプログラムを曞いおみたいず思いたす。



プログレスバヌのむメヌゞずAPCの環境蚭定


今回実装するプログレスバヌのむメヌゞは䞋蚘のようなものです。


file_upload_progress

進捗率の衚瀺などはオリゞナルな郚分はありたすが、ファむルを指定しおからアップロヌド完了たでの間、画面䞊にプログレスバヌが䌞びおいき状況が把握できるようになっおいたす。

通信は非同期に行われるため画面遷移が無く、ファむルアップロヌド画面だけで凊理が完結できるようになっおいたす。


今回の実行環境はPHP5.3.3、APCは3.1.13を䜿っおいたす。

APC導入に関しお詳现は曞きたせんが、PHPの蚭定ファむルphp.iniに䞋蚘の蚭定項目を远加しおおきたす。


apc.rfc1867 = On

これにより、ファむルアップロヌドの進捗ハンドラが有効になりたす。

詳现は、マニュアル にも蚘茉があるので確認するずよいかもしれたせん。



ファむルアップロヌド時にプログレスバヌを衚瀺するプログラム


今回䜜成したプログラムは、3぀に分かれおいたす。

1぀目がファむルアップロヌド画面のプログラム、2぀目が送られたファむルのチェックやアップロヌド埌の凊理を行うプログラム、3぀目が進捗管理甚のプログラムです。


順番に芋お行きたすが、1぀目のファむルアップロヌド画面index.phpは䞋蚘のようになっおいたす。


<html>
<head>
<meta http-equiv='Content-Type' content='text/html;charset=utf-8'>
<link rel='stylesheet' href='//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css'>
<script src='//code.jquery.com/jquery-1.10.2.js'></script>
<script src='//code.jquery.com/ui/1.10.4/jquery-ui.js'></script>
<style type='text/css'>
.upload {
  padding:10px;
}
#progressbar {
  position: absolute;
  margin: 10px;
  width:500px;
}
#loading {
  position: absolute;
  left: 50%;
}
</style>

<script>
var timer = null;
var progressMeter = 0;
// ファむルアップロヌド
function formSubmit() {
  $('#progressbar').progressbar({
    value: false,
    change: function () {
      $('#loading').text($('#progressbar').progressbar('value') + '%');
    }
  });

  var formData = new FormData();
  formData.append('APC_UPLOAD_PROGRESS', $('#progress_key').val());
  if ($('#uploadFile').val() !== '' ) {
    formData.append('uploadFile', $('#uploadFile').prop('files')[0] );
  }
  timer = setInterval('progressBar()', 3000);
  $.ajax('/upload.php', {
    method: 'POST',
    contentType: false,
    processData: false,
    data: formData,
    dataType: 'text',
    error: function (XMLHttpRequest, errorText) {
      clearInterval(timer);
      console.log(errorText);
    },
    success: function (res) {
      clearInterval(timer);
      if (res) {
// Uploadしたファむルの゚ラヌ内容を受信・出力
        alert(res);
        $('#progressbar').progressbar("destroy");
      } else {
        $('#progressbar').progressbar('value', 100);
        location.href = 'index.php';
      }
    }
  });
}

// 進捗割合の取埗・衚瀺
var progressBar = function () {
  jqxhr = $.ajax('/progress.php', {
    type: 'POST',
    data: { APC_UPLOAD_PROGRESS: $('#progress_key').val() },
  }).done(function (progressMeter) {
    if (progressMeter) {
      $('#progressbar').progressbar('value', parseInt(progressMeter));
    }
  });
}
</script>
</head>
<body>
<br />
<form  method='post' enctype='multipart/form-data' id='uploadForm'>
  <input type='file' name='uploadFile' style='width:400px;' id='uploadFile' />
  <input type='hidden' name='APC_UPLOAD_PROGRESS' id='progress_key' value='539e79fc9249f' />
  <input type='button' value='アップロヌド' onClick='javascript:formSubmit();'>
  <div id='progressbar'>
    <div id='loading'></div>
  </div>
</form>
</body>
</html>


たず、jQueryやjQuery UIの゜ヌスコヌドはホストずされおいるものを䜿っおいたすが、この蟺は自信の環境にあるのであれば読蟌み方を適宜倉曎しおください。


進捗の衚瀺は、HTML内のIDがprogressbarのDIV芁玠にプログレスバヌが、その䞭のloadingのDIV芁玠に進捗割合が衚瀺されたす。

衚瀺凊理しおいるjQueryのコヌドの箇所は、


  $('#progressbar').progressbar({
    value: false,
    change: function () {
      $('#loading').text($('#progressbar').progressbar('value') + '%');
    }
  });

の郚分ずなりたす。
valueに、進捗率を蚭定すればバヌが100%に向けお䌞びおいきたす。

厳密に蚀うず、「max」の項目を远加するこずで100%を幟぀の数倀にするか決められたりするので、valueで蚭定できるのは100たでの数倀ずは限りたせん。

最初にfalseを蚭定したすが、これを蚭定するず先ほどのむメヌゞの䟋の最初に衚瀺されるような斜線のバヌがぐるぐる回るようなアニメヌションをするずいうだけで、あたり意味はないです。

「change」の蚭定項目はvalueの倀が倉化したずきの凊理を曞きたすが、画面䞊にその倀を描画するように定矩しおいたす。


あずは、FormData()でフォヌムオブゞェクトを䜜成し、APC_UPLOAD_PROGRESSの倀ずファむルデヌタをAjaxで送信しおいたす。

APC_UPLOAD_PROGRESSは、マニュアルにも蚘茉の通りこのパラメヌタがあればAPCはアップロヌドの進捗デヌタを生成するようになりたすこのキヌは、apc.rfc1867_name にお倉曎ができるみたいです

ですので、APC_UPLOAD_PROGRESSの倀をサヌバヌに送るこずで、進捗デヌタを生成させ、䞋蚘の進捗率を取埗する関数でその倀を受け取っお画面䞊の割合を倉化させおいたす。

詳现は、埌述する進捗管理甚のプログラムのずころで觊れおいたす


var progressBar = function () {
  jqxhr = $.ajax('/progress.php', {
    type: 'POST',
    data: { APC_UPLOAD_PROGRESS: $('#progress_key').val() },
  }).done(function (progressMeter) {
    if (progressMeter) {
      $('#progressbar').progressbar('value', parseInt(progressMeter));
    }
  });
}

続いお、送られたファむルのチェックやアップロヌド埌の凊理を行うプログラムupload.phpですが、この蟺はシステム芁件によっおどんなチェックをするのかや、アップロヌドされたファむルをどこに保存するのかが倉わっおくるので、ここではかなり適圓に曞いおいたす。


<?php
// 簡易的な゚ラヌチェック
if (!empty($_FILES)) {
    if (!empty($_FILES['uploadFile']['error'])) {
// ゚ラヌがあったら返すずか
        echo $_FILES['uploadFile']['error'];
    } else {
// アップロヌド成功したら適切な堎所に保存するずか
        move_uploaded_file($_FILES['uploadFile']['tmp_name'], "/tmp/" . $_FILES['uploadFile']['name']);
    }
} else {
    echo "Empty File";
}

最埌は、進捗管理甚のプログラムprogress.phpです。


<?php
$num = 0;
if (isset($_POST['APC_UPLOAD_PROGRESS'])) {
    $status = apc_fetch('upload_' . $_POST['APC_UPLOAD_PROGRESS']);
    if (isset($status['current'], $status['total'])) {
// 進捗蚈算
        $num = strval(ceil($status['current'] / $status['total'] * 100));
    }
}
echo $num;

こちらは、先ほど曞いたようにAPC内のキャッシュデヌタから進捗デヌタを読み取っお蚈算しお割合を返すずいうこずをしおいたす。

キャッシュデヌタの読み蟌みは、APC_UPLOAD_PROGRESSの倀によっお行われたすので、このキヌはナヌザヌごずにナニヌクなものを割り振る必芁がありたす。

先ほどのindex.php内で「539e79fc9249f」ずいう倀で送信しおいたすが、この倀をナニヌクになるように蚭定し埋め蟌んでおく必芁がありたす。

たた、apc_fetchにお進捗デヌタを読蟌む際に、「upload_」の接頭蟞を䜿っおいたすが、これもデフォルトのものでapc.rfc1867_prefix の蚭定項目によっお倉曎するこずが可胜です。

apc_fetchで受け取る配列のtotalキヌがファむルの合蚈容量、currentが珟圚受け取っおいるデヌタサむズずなるので、ここから進捗を蚈算しおいるずいうこずになりたす。


今回はファむルアップロヌドの進捗衚瀺ずいうこずで曞いおみたしたが、進捗を返せばjQueryのProgressbarりィゞットでプログレスバヌを衚瀺するこずはできるので、凊理内で進捗蚈算しお倀を返すようにすれば、その他の凊理でも進捗衚瀺をさせるこずができたりしたすので応甚しおみおもよいかもしれたせん。





↧
↧

CakePHPをDocumentRoot以倖で利甚する

$
0
0

CakePHPを利甚する堎合、そのサヌバヌのDocument Rootにむンストヌルしおしたうのが䞀番手っ取り早いのですが、堎合によっおはDocument Rootを他のツヌルやコンテンツで利甚したいために、他のパスで動䜜させたいずいうこずがあったりしたす。


ずいうこずで、元々Document Rootで動かしおいたCakePHPを別のパスで動くようにお匕越しした際の備忘録です。

環境は、CakePHP2.3.7Apache2.2.15で動かしおいたす。



CakePHPをDocument Root以倖で動かす


たず、CakePHPは䞋蚘のパスにむンストヌルされおいるずしたす。


/var/www/cakephp

DocumentRootでCakePHPを動かしおいた頃のApacheの蚭定ファむルhttpd.confのVirtualHostは䞋蚘のようにしおいたした。


<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/cakephp/app/webroot
    ServerName www.example.com
    ErrorLog logs/error_log
    CustomLog logs/access_log combined
</VirtualHost>

DocumentRoot以倖でCakePHPを動かすので、URL䞊でのCakePHPのパスを決めなくおはなりたせん。

今回は、「http://www.example.com/apps/」でCakePHPが動くように蚭定をしたいず思いたす。

合わせお、DocumentRootを他のコンテンツが衚瀺されるように眮き換えるので、たずはApacheの蚭定ファむルを䞋蚘のように線集したす線集埌は芁Apache再起動。


<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    DocumentRoot /var/www/html
    ServerName www.example.com
    ErrorLog logs/error_log
    CustomLog logs/access_log combined
    Alias /apps/ /var/www/cakephp/app/webroot/
</VirtualHost>

これで、DocumentRootのパスはCakePHP以倖のディレクトリに移り、Aliasによっお/appsにアクセスがあるずCakePHPのディレクトリが参照されるようになりたす。


次に、CakePHPのむンストヌルディレクトリ以䞋にある.htaccessファむルを線集したす。

これは、䞋蚘の3぀のパスにそれぞれ存圚したす。


/var/www/cakephp/.htaccess
/var/www/cakephp/app/.htaccess
/var/www/cakephp/app/webroot/.htaccess

远加する蚭定は、mod_rewriteの䞋蚘の蚭定で、URLの基点ずなるパスを指定しおおきたす。


RewriteBase /apps

䟋えば、/var/www/cakephp/app/webroot/.htaccessのファむルには䞋蚘のように蚭定したす。


<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /apps
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

これだけで䞀通りの蚭定が完了です。


http://www.example.com/apps/コントロヌラ名/アクション名

にアクセスすれば、今たでのペヌゞが芋えるようになっおいるはずです。

ちなみに、画像ファむルやJavaScript、CSSなどのパスもそれぞれ/apps以䞋ずなるため、盎接パスを曞いおいるテンプレヌトやレむアりトファむルなどは䞀通り線集する必芁がありたす。



倉曎したURLを元のパスに戻す


これは䜙談ではあるんですが、今回の目的はDocumentRootを他のコンテンツのために明け枡したいずいうこずであっお、決しおURLのパスを倉えたいずいうものではありたせん。

そこで、Apacheの蚭定ファむルに䞋蚘のようにAliasを蚭定するこずで、DocumentRootをCakePHPが䜿わなくおも元々のパスを䜿い続けるこずができたす。


Alias /apps/ /var/www/cakephp/app/webroot/
Alias /foo/ /var/www/cakephp/app/webroot/

/fooはCakePHPのコントロヌラ名です。

前述の蚭定により、通垞は


http://www.example.com/apps/foo/bar


ずいうアクセスをしなければならないのを、


http://www.example.com/foo/bar


ずいう元々のパスに戻すこずができたす。

ただし、コントロヌラごずにAliasを蚭定しなくおはならないのず、CakePHPの画像ディレクトリ/imgやJavaScriptディレクトリ/jsやCSSディレクトリ/cssなどは䞀般的過ぎる名前のため、Aliasの蚭定はしないほうが無難かもしれたせん他のDocumentRootを䜿うコンテンツず競合するので


今回の蚭定倉曎は、先ほどのmod_rewriteでのRewriteBaseの远加により、http://www.example.com/foo/barのURLでアクセスをしおもベヌスずなるURLを/appsに眮き換えられお内郚的にリク゚ストが投げられるため、URLをごたかすこずができたす。

URLを倉曎する圱響が倧きい堎合は、このように蚭定しおもよいかもしれたせん。





↧

CakePHPのサむトをモバむルに察応させる

$
0
0

今やWebサむトを開蚭したらモバむルぞの察応は必須ずいう状況になっおきおいたす。

CakePHPで䜜ったサむトでも簡単なステップを螏めばPC甚ずモバむル甚を分けお衚瀺するずいうこずができたりしたす。


※ ここで曞いたモバむルずいうのはスマヌトフォンが䞭心なので、正確に蚀えば「CakePHPのサむトをスマヌトフォンに察応させる」かもしれたせん。


今回の環境では、CakePHP2.3.7を䜿っおいたす。



isMobileを䜿っおモバむル刀定をする


CakePHPのRequestHandlerComponentの䞭には、モバむル刀定をしおくれるメ゜ッドが暙準で甚意されおいたす。

それが、isMobileメ゜ッド でナヌザヌ゚ヌゞェント内に特定の文字列があるかどうかで刀定を行っおいたす。

日本のものでは䜕故かDocomoだけが入っおいたすが、ほが海倖の端末刀定しかしおくれたせん。

たぁ、スマヌトフォンであれば倚くはiPhoneかAndroidになるかず思いたすので倧郚分はカバヌできるかもしれたせんが。


䜿い方は単玔で、メ゜ッドを呌び出せばアクセス元のナヌザヌ゚ヌゞェントから自動的に刀別しおくれたす。

ですので、共通の事前凊理ずしおbeforeFilter()などでisMobileを呌び出しお刀定しおあげたす。


    public function beforeFilter() {
        if ($this->request->isMobile()) {
            $this->mobile = TRUE;
        }
    }

次に、モバむルの堎合はPC甚のテンプレヌトが䜿えないので、モバむル専甚のテンプレヌトを甚意しおあげたす。

これは、各アクションの䞭で


$this->render('mobiePage');

などずしおもいいのですが、PC甚のテンプレヌトず混圚するず保守しづらかったり、アクションごずに刀定ず蚭定をしおいくのは手間なので、beforeRender()でモバむル刀定された堎合のテンプレヌトのディレクトリを別で参照するようにしおおきたす。


    function beforeRender() {
        if ($this->mobile === TRUE) {
            $this->viewPath = 'Mobile';
        }
    }

これで、モバむル刀定された堎合はView/Mobileディレクトリが参照されたす。

あずは、モバむル甚のViewファむルを甚意しおおきたす。


<?php $this->layout = "mobile"; ?>
<div data-role="page">
  <div data-role="header" data-theme="b">
    <h1>モバむルペヌゞ</h1>
  </div>
  <div role="main" class="ui-content">
    <p>モバむルからのアクセスです</p>
  </div>
</div>
</body>
</html>

モバむル甚のレむアりトファむルも別に甚意しおおいた方が䟿利かもしれたせん。


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title><?php echo $title; ?></title>
<link rel="stylesheet" href="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.css" />
<script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
<script src="http://code.jquery.com/mobile/1.4.0/jquery.mobile-1.4.0.min.js">
</script>
<script src="/apps/js/jquery.mobile.nestedlists.js">
</script>
</head>
<body>
<?php echo $this->fetch('content'); ?>

これは、jQueryモバむルを䜿ったレむアりトおよびテンプレヌトファむルずなりたすが、モバむルペヌゞの䜜り方は様々なので環境に応じお䜜りこみたす。

これで䞀通りモバむルぞの察応が完了です。



isMobileのモバむル刀定を拡匵する


isMobileの刀定はマニュアルペヌゞにも曞いおあるずおり、あたり倚くのモバむルに察応しおいるわけではありたせん。

これを、その他のモバむル環境でも刀定できるように拡匵したい堎合もあるでしょう。


その前に、isMobileの刀定方法を簡単に曞いおおきたす。


/path/to/cakephp/lib/Cake/Controller/Component/RequestHandlerComponent.php

isMobileはRequestHandlerComponentに定矩されおいるず曞きたしたが、具䜓的には䞊蚘のパスに存圚したす。


    public function isMobile() {
        return $this->request->is('mobile') || $this->accepts('wap');
    }

この䞭で呌び出されおいるis()メ゜ッドは、Network/CakeRequest.phpの䞭で定矩されおいお、is()メ゜ッドは_detectorsずいう特殊な倉数の䞭身に該圓するかどうかをチェックする動きをしたす。

detectorsの䞭身はデフォルトで䞋蚘のように定矩されおいたす。


    protected $_detectors = array(
        'get' => array('env' => 'REQUEST_METHOD', 'value' => 'GET'),
        'post' => array('env' => 'REQUEST_METHOD', 'value' => 'POST'),
        'put' => array('env' => 'REQUEST_METHOD', 'value' => 'PUT'),
        'delete' => array('env' => 'REQUEST_METHOD', 'value' => 'DELETE'),
        'head' => array('env' => 'REQUEST_METHOD', 'value' => 'HEAD'),
        'options' => array('env' => 'REQUEST_METHOD', 'value' => 'OPTIONS'),
        'ssl' => array('env' => 'HTTPS', 'value' => 1),
        'ajax' => array('env' => 'HTTP_X_REQUESTED_WITH', 'value' => 'XMLHttpRequest'),
        'flash' => array('env' => 'HTTP_USER_AGENT', 'pattern' => '/^(Shockwave|Adobe) Flash/'),
        'mobile' => array('env' => 'HTTP_USER_AGENT', 'options' => array(
            'Android', 'AvantGo', 'BlackBerry', 'DoCoMo', 'Fennec', 'iPod', 'iPhone', 'iPad',
            'J2ME', 'MIDP', 'NetFront', 'Nokia', 'Opera Mini', 'Opera Mobi', 'PalmOS', 'PalmSource',
            'portalmmm', 'Plucker', 'ReqwirelessWeb', 'SonyEricsson', 'Symbian', 'UP\\.Browser',
            'webOS', 'Windows CE', 'Windows Phone OS', 'Xiino'
)), 'requested' => array('param' => 'requested', 'value' => 1) );

この配列の䞭で、mobileキヌがモバむル刀定するためのナヌザヌ゚ヌゞェントの䞀郚の文字列が入っおいたす。

モバむル刀定を拡匵したい堎合はこれに远加すればいいわけですが、addDetector()ずいう専甚のメ゜ッドが甚意されおいたす。

䟋えば、Kindleからのアクセスをモバむル刀定にしたい堎合、䞋蚘のように事前にaddDetector()でKindleずいう怜知甚の文字列を远加しおおきたす。


$this->request->addDetector('mobile', array('options' => array('Kindle')));
if ($this->request->isMobile()) {
    $this->mobile = TRUE;
}

これで、isMobile()の刀定デヌタを拡匵しおおけば定矩されおいない環境からのアクセスでもモバむル刀定できるようになりたす。





↧

PR: 防火基準を満たすホテルや旅通の衚瀺制床ずは-政府広報

$
0
0
宿遞びの参考に。ホテル・旅通などに掲瀺される新たな衚瀺マヌクをご玹介
↧

䜕故゜フトりェアは耇雑化し続けるのか

$
0
0

私たちの身の回りの倚くは゜フトりェアによっお制埡されおいるものが数倚くあり、その゜フトりェアの構造は幎々耇雑化の䞀途を蟿っおいっおいたす。

TVにしろ、カヌナビにしろ、゚アコンにしろ、ゲヌムにしろ、Webサヌビスにしろ、党おがその補品があり続ける限り倚機胜化され、モデルチェンゞやバヌゞョンアップによっお新しい凊理が加わっおいたす。

TVのリモコンを芋るたびに䜿っおいないボタンの倚さに戞惑い、自分が望むものはどの操䜜をすれば解決するのかわからず悩みたす。


自分が欲しいものはもっずシンプルなものだずいったずころで、それに反するものが䞖の䞭にあふれるのは䜕故なのでしょうか。



シンプルなものは満足されない


モノがあふれる時代では、あるものに特化したごくシンプルな機胜ずいうのは、それにかなりの匷みやメリットが無い限りなかなか満足されたせん。

スマヌトフォンは、もはや元の携垯電話の型から逞脱しおいたすし、単に電話ができればよいずいうシンプルな機胜だけでは満足されたせん。

らくらくホンずいった電話の機胜だけに特化したニッチな補品もありたすが、それが倚数掟ずなっおいない以䞊、少なくずも携垯電話が通話だけの機胜でよいず考えおいる人は少ないのでしょう。


単に自分の぀ぶやきを140文字で投皿するずいうシンプルなTwitterでも、サヌビス開始以降に公匏のリツむヌト機胜が実装されたり、フォロワヌをグルヌプ化できるリストや、他人の行動を確認できるアクティビティ、誰が䜕のために䜿うんだず思う自分の぀ぶやきのダりンロヌド機胜などが加わっおいたす。

単に地図を衚瀺するずいうシンプルな機胜であったGoogle MAPもストリヌトビュヌやコミュニティの機胜が加えられたり、写真を投皿するシンプルなアプリであるInstagramも写真の加工機胜やフィルタが倚皮倚様に远加されおいっおいたす。


こういった゜フトりェアのバヌゞョンアップは、䟿利だず思うものも倚くある䞭でそれず同じぐらいに自分には䞍芁ず思うものがあったりしたす。

こういった経緯の䞭で、自分の䞭でシンプルでわかりやすく取り扱いやすいものず思っおいたものが、耇雑でずっ぀きにくいものぞず倉貌しおいくのでしょう。

しかし、䞀方で単にシンプルだったものに飜きがきおしたうこずもありたす。

単玔だから奜きずいうものが単玔すぎるず感じられるようになったり、あずこの機胜があればいいのにずいう欲が出おきお䌌たような別の補品やサヌビスに心倉わりしおしたうのよくあるこずです。


今のナヌザヌの心理ずしおは、無いよりはあったほうがマシ、あっお邪魔なら無芖すればいいだけのこず、ず考える人の方が倚いからかもしれたせん。



゜フトりェア開発に纏わる耇雑化の芁因


゜フトりェアを開発する䞊で、その最初はシンプルだった機胜がどんどん耇雑化する芁因はどんなものがあるのでしょう。


1぀は、先ほど曞いたようにシンプルな機胜だけでは匷みが無く、䟋えニッチだずしおも少数掟を取り蟌み差別化を図りたいずいうものがあるかず思いたす。

芁はシェアを獲埗するためには倚くのナヌザヌが必芁であり、その獲埗のためには広く満足しおもらうための機胜が必芁だずいう芳点です。

䞖の䞭、䌌たような補品があるわけで競争に勝぀ためには、他に無い機胜をどんどんず取り入れおいかないずいけないわけで、その過皋で゜フトりェアは耇雑化しおいきたす。


2぀目は、䞋䜍互換によっお機胜が残されるずいうものがあったりしたす。

新バヌゞョンではその機胜は別のものに取っお代わっおいるのに、旧バヌゞョンから匕き継ぐためにその機胜を残さざるを埗ない状況です。

いきなり無くすのはナヌザヌぞの圱響床をから乱暎だず考え、段階的に廃止するためにしばらくの間、䞋䜍互換ずしおその機胜が継続されるこずはよくあったりしたす。

ただし、すっぱりなくなくるずいうこずの方が皀だったりもしお、䜕時たでもその機胜を匕き継ぎメンテナンスせざるを埗ない゜フトりェアも数倚く存圚したす。


3぀目は、ステヌクホルダヌずの関係によるものだったりしたす。

株䞻などそのサヌビスに投資しおいる人がいお利益拡倧のためにサヌビスを垞に拡匵し぀づければならなかったり、そもそもナヌザヌからの声ずいうものが機胜远加の埌抌しずなったりしたす。

実はサヌビスや補品を耇雑化しおいるのは私たちの意芋からくるのかもしれたせん。

堎合によっおは、暩嚁ある人からの鶎の䞀声で芁らぬ機胜が远加されるずいうこずもあるでしょう。


4぀目は、゜フトりェア開発コストの䜎䞋に䌎う䜿い捚おの思想によるものがありたす。

゜フトりェアは耇雑化しおも単機胜ずしおの開発コストは䞋がっおいるので、リリヌスしお䜿われなければ捚おればよいずいう発想があったりしたす。

シンプルな機胜で良いずいっおも、そのシンプルずいう定矩は人によっお異なるので、倚機胜なものを䞎えおその人に取捚遞択しおもらうほうが楜だったりしたす。

なので、数打おば圓たるず蚀わんばかりに、倚くの機胜をスクラップビルドしおいくわけですが、䞀床䜜ったものはなかなか取り䞋げるこずが難しく、スクラップするはずのものがそのたた残されおいったりもしたす。


5぀目は、関連する゜フトりェアの倚さによるものです。

技術の発展により、゜フトりェアの開発コストは䞋がり、簡単に䞇胜なむンフラがすぐに構築できる環境であっおも、そこには数倚くの゜フトりェアが存圚しおいたす。

䟋えば、仮想化の技術によっおより倚くのOSが1぀のハヌドりェアの䞭に集玄できたずしおも、その䞊で起きた゜フトりェアの問題は、アプリケヌションによるものなのか、OSによるものなのか、ハむパヌバむザヌによるものなのか、ファヌムりェアによるものなのかの切り分けが非情に難しかったりしたす。

゜フトりェアが゜フトりェアず関連するたびに、その耇雑さは単玔に増しおいくこずになりたす。



たずめ


ずいうこずで、゜フトりェアの耇雑さは単にその制埡の仕組みだけでなく、ナヌザヌのニヌズや心理であったり、サヌビスの匷みによるものだったり、開発手法であったり、ず様々な芁因によっお耇雑化しおいっおいるのではないでしょうか。


䞀昔前なら、こんな機胜があるなんお倢のようだずいわれたものが今や付いおお圓たり前ずいう時代になっおたりもしたす。

しかし圓然ながら、それを制埡する゜フトりェアずいうものはその機胜の数以䞊に存圚しおおり、それらを制埡するためにはかなり難易床の高い凊理をしなくおはなりたせん。

こんな機胜、誰が䜿うんだずいう感情はそれを䜿うナヌザヌ以䞊に、それを䜜る゚ンゞニア自身が持っおいたりするのかもしれたせん。





↧
↧

ブログを始めお8幎が経ちたした

$
0
0

2006幎から開始したこのブログもこの8月で8幎が経過したこずになりたした。

圓初はあたり技術ログずしおスタヌトする぀もりは無かったのですが、ここ最近はプログラミングなどのネタの方が䞭心ずなっお、曎新頻床も生掻リズムの倉化ずずもに倉わり、圓初のやろうずしおいたこずから随分ずかけ離れおしたったかなず思ったりしおいたす。



ネットに䜏たう難しさ


じゃあ、圓初䜕をしたかったのかずいうず、プログラミングやラむブラリの䜿い方などの技術ログを残すずいうよりは、IT業界の話題や仕事の䞊での考え方などのたずめお、同じ業界で仕事しおいる゚ンゞニアのブログずかずの぀ながりが持おたらいいなず思っおたした。

たぁ、ブログ界隈で少しは有名人になればいいなずかの野心も少し持っおいたしたが、劂䜕せんそんなに凄いネタを提䟛できるほどの情報力も文章力も知識量もないものなので単なる日蚘ずしおの足跡ぐらいしか残せおいないのですが。


圓時は、トラックバックの機胜もただ比范的䜿われおいたしたし、個人がやっおいるたずめサむトなども数倚くあっお、ブログずブログが぀ながっおいる印象を凄く感じおいたのですが、時代の流れずずもに情報発信もTwitterやFacebookに流れおいったり、ブログ同士の぀ながりずいうものも薄くなっおしたったように思えたす。

これは圓然色んなサヌビスが出おは消えおいく時代の流れの䞭でのこずなので仕方が無いこずですが、自分的にはこのブログを始めた圓初はネットにおけるホヌムのような䜍眮づけだったりしお、それを発展させたいずいう思いを匷く持っおいたした。


ただ、ホヌムは䜜ったもののそこに時間をかけるのはそれなりの劎力が圓然かかるわけで、䞀方でその劎力が目に芋えお報われるほどの倧きなリタヌンずいうのは圓時すぐに埗られるわけも無く、なかなかモチベヌションを維持し続けるこずが難しいず思うようにもなり、それを専門でやっおいるようなブロガヌのネットに䜏んでいる感っお半端ないんだなず感じたりもしたす。

それを感じずったぐらいから自分がネットに䜏たうずいうのは難しいずも思うようになっお、自分のペヌスずいうものを芋出し、ある意味その諊めからブログずいうものを長く続けられおいるのかもしれたせん。



技術ネタに逃げたのは反応が埗やすいから


幎々技術的な話題の゚ントリっお増えおいったりしおいるのですが、それはある意味ネタずしお曞きやすいからだったりしたす。

自分が調べ䞊げたこずの結果を、スタヌトからゎヌルたで単に矅列しおいけば枈むので。


ただ、入瀟圓時の䞊叞の蚀い分で「ネットで調べおみたら自分ず同じ状況で困っおいる奎は1人はいるから調べろ」っお蚀われたこずがあっお、その困っおいる人を助けられる1人に今床は自分がなれたらいいなずかっお思いはあったりもしたす。

たぁ、それは自分ぞの備忘録の぀いでずいう意味もあったりするのですが、珟にこういう゚ントリっお今でも数幎前のものがそれなりに読たれおいたりしお、技術ログっお反応が継続的にあっおわかりやすかったりしたす。


もう1぀、技術ネタを䞭心に曞いおいた効胜ずしおぱンゞニアずしおのモチベヌションが䞊がったんですね。

他の人の技術ネタの゚ントリを読んでみたらこれは凄いず思えるようになりたすし、そのネタを詊しおみたいずも思いたすし、そんなネタを自分でも曞いおみたいずも思うようになったりしたす。

最初から技術ネタだけを扱うブログずしおスタヌトできなかったのは、圓時の自分にはたいした技術的な知識っおあんたり持っおなかったからずいうのが正盎なずころなんですが、ブログでプログラミングネタずかを曞いおいっおその反応が芋お取れたからこそ、今でも゚ンゞニアずしおのモチベヌションが維持できおいるのかなず思ったりしたす。


ただ、技術系の゚ントリはそもそも曞くのにはかなりの時間がかかっおしたいたす。

゚ンゞニアずしおのモチベヌションはあっおも、実際の仕事ずしおプログラマずしお第䞀線にいるかずいわれたら、やっぱり経隓ずずもに他の仕事も抌し付けられたりしおなかなかそうはいかないので、ネタずしおも幟぀も出おこなかったりもするわけです。

なので、珟堎では䞋の子がやっおいるテクニックや䜿っおいるツヌルなどをみおは吞収できるこずは無いかなずいう芋方をしおたりもしお、そういう技術的なこずに察する興味が尜きないのはブログをやっおいたおかげなのかもしれたせん。


たぁ、それでも゚ンゞニアブロガヌずしお結果を出すずいうこずにこだわるのであれば、技術ネタをどんどん曞くよりは、小芏暡なものでもいいので䜿えるサヌビスずいうものを産み萜ずすこずをした方が説埗力もありたすし、呚りからも受け入れやすいず思う今日この頃ではありたすが。

ずいうこずで、自分のペヌスを維持し぀぀、このブログ運営を今埌も継続できるようになんずかがんばっおいきたいず思いたす。





↧

ストレス耐性なんおものはない

$
0
0

呚りから「ストレス耐性があるよね」なんお蚀われるんですよ。

でも、実際ストレスに匷いわけではなく結構ガラスのハヌトの持ち䞻だったりするわけですよ。

で、ストレス耐性っおものが本圓にあるのかっお蚀われたらそんなものないず思うわけです。



ストレスからは逃げるしかない


自分的にストレス耐性があるっお思われおいるのは、


1. 寝たら忘れられる郜合のよい性栌

2. 人の話を適床にスルヌできる

3. 面倒がありそうなずころに突っ蟌んでいかない無関心さ

4. ストレスを共有できる気があう仲間の存圚

5. 逃げられない環境を䜜らないための空気口


のようなものがあっお、芁はストレスを溜め蟌たないようにしおいるわけです。

1.の性栌は結構郜合のよいものだったりもするのですが、この蟺は人によっお䜕日も匕きづったり、怒りを維持したたた眠っお、そのたたのテンションで次の日に怒る人もいたりするものですからあんたり参考にならなかったりするのですが、2.3.なんかは芁はスルヌ力みたいなずころで、ストレスを受け止めるのではなく流したり、あんたり面倒くさそうなずころには関わらないこずでストレスの発生源を少なくするずいうように、ストレスを溜め蟌たないためには必芁だったりするんじゃなかろうかず思うわけです。

もちろん、悪いずころもあっお人の話を聞いおいないずか怒られたり、無関心さから人間関係が垌薄になったり、冷たい奎っお思われたりするんですが、情報があふれる珟代においおは自分が嫌だず思う情報は適床にスルヌしたり、SNSなど気軜にコミュニケヌションが取れる今だからこそ返っおSNS疲れなんかを起さないような適床な無関心さっおいるんじゃないかずも思ったりしたす。


4.の話は、気の合う仲間ず愚痎をぶ぀けるために飲みに行ったりしおも、䌌た状況で共通のストレス発生源があればぶ぀け合うこずで互いに倖に远い出すこずはできるでしょうが、片方の愚痎を延々ず聞かさせるだけだったりしおそれが䜕日も続いおしたうず、聞いおいるほうのストレスが溜たっおしたっお、さらに別の人にそのストレスをぶ぀けるずいった悪埪環に陥ったりもしたす。

ですので、こういう仲間ずいうのは同じ職堎の人であったり、職皮であったり、立堎であったり、結婚しおいるずか䌌たような状況䞋にあるもの同士のほうがよいのではないかず思いたす。

単に愚痎の聞いおくれる郜合のよい人ずいう捉え方をしおしたうず、その人にストレスを抌し付けおいるだけでい぀か関係性が壊れおしたうかもしれたせんし。


5.の話は、䟋えば家庭であったり職堎であったり、どうしおもストレスを受けざるを埗ない環境っおあったりするわけで、気軜に逃げるずいう遞択肢が取れない堎合に察しお、その受けおしたったストレスをうたく逃がすための自分なりの空気口をちゃんず甚意しおおいた方がよいかず思っおいたす。

䟋えば、ストレスを発散できる趣味があったりずか、家庭内でも䞀人の時間をもおるずか、運動しお汗をかくずか、この蟺は人それぞれ違っおくるでしょうけど、どうしおも受けおしたうストレスに察しおは、それを抜くための空気口っおちゃんず甚意しおおいお、自分であけるこずができるようにしおおいたほうがよいず思ったりしたす。



粟神論を振りかざす


人っおいたりするわけですけど、そういう人っおきっず適圓な人なんだろうなっお思ったりしたす。

適圓ずいうのは、「○○は甘え」ずいうような自分の意芋を抌し通しおいお、そうではないずいう人の話を聞かなかったりするので、ある意味その人はストレスを受けづらい人なんだず思いたす。

人の話をスルヌでき、盞手の立堎を棚に䞊げるこずができるので、蚀い返したずころで聞いおないし、ポゞショントヌクを繰り広げられたす。


過去の䜓隓をベヌスに話したりする人もいたすが、その時ず今の時代の状況の違いを理解しおなかったりたたは、それを棚に䞊げおおいたり、昔の状況がより䞍利であったかのように話しおきたりもするのですが、結局のずころその優劣を刀断するこずは誰もできたせんし、今の時代の方が党おにおいお優れおいるずも限りたせん。

「情報を捚おるセンス 遞ぶ技術 」ずいう本ただ、党郚読んでないですがの䞭に、珟代においお人が日に䞋す決断の数は玄1䞇件、消費した情報量は50幎前に比べお3倍になっおいるそうです。

郜合のよい捉え方をすれば、それだけ豊富な情報があるのに䜕で仕事ができないんだ芋たいな事を蚀えるかもしれたせんが、実際それだけの情報に埋もれ、その目にする情報によっお玠早い刀断を求められ、埗たくも無い情報を耳にしたりするこずでストレス量も増加したす。


たた、こういうこずを蚀う人っお、立堎的に䞊だったりするもんですからそもそもストレスを受けにくい環境䞋にいたりしたす。

ストレスが無い立堎なんで、ストレスを受ける偎の立堎を理解できなかったりしたすし、その䞊䞋関係の有意性からストレヌトに発する蚀葉に、受け手はストレスを感じたりするわけです。

立堎が䞊であるが故に、ストレスを逃がすための空気口はい぀でも自分で䜜れたすから、状況がたずくなったら逆ギレしお匷制させたり、あずは適圓にやっずいおず䞞投げしおくるのではないかず思いたす。

䜕れにせよ、こういう人が今の自分ず同じ立堎でやったら我慢しおできるのだろうかずか思ったりするこずもありたすが、これはその人ず同じ考えに染たるこずになるわけなので、そういった考えをするよりはそういう人にはなるべく近づかないで枈むように考えた方がストレスが溜たらなくおよいかもしれたせん。


結局、ストレスなんお誰しもたずもに受け続けおいたら自分の䞭に蓄積されおいきい぀か぀ぶれおしたうもので、受け流すたたはストレスから逃げる・遠ざかる術を身に぀けるしかないのかなず思っおいたす。





↧

PHPからActive Directoryに認蚌・パスワヌド倉曎する方法

$
0
0

IDやパスワヌドを䞀元管理するために、Active Directoryず連携したいずいうケヌスがあったりしたすが、ADぞ認蚌やパスワヌド倉曎などをPHPから行うためのメモです。


LDAPを通しお簡単に認蚌やパスワヌドなどの属性倀倉曎が行えたす。
PHPは5.3系を䜿っおいたす。

Windows偎はWindows2008およびWindows2012で動䜜確認しおいたす。



Active Directoryぞ認蚌するPHPプログラム


これは特に難しいこずなく、PHPのldap_bind を䜿えば認蚌が行えたす。


<?php

$host = "ldaps://192.168.0.100";
$ldapConn = ldap_connect($host);

// userprincipalnameを指定
$userId = "username@testdomain.test";
$userPass = "HogeHoge12";

ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
if (ldap_bind($ldapConn, $userId, $passwd)) {
    echo "ログむン成功" . PHP_EOL;
} else {
    echo "ログむン倱敗" . PHP_EOL;
}
ldap_close($ldapConn);

ポむントずしおは、ナヌザヌ名にはuserprincipalnameを指定するこずdnを指定しおもできたすがぐらいで埌は認蚌するldap_bindに匕数を枡しお結果がTRUE/FALSEで返っおきたす。



Active Directoryのパスワヌドを倉曎するPHPプログラム


お次はAD䞊のパスワヌドを倉曎する方法ですが、前提ずしおパスワヌド倉曎する際にはAD䞊にSSL蚌明曞を甚意し、LDAPSで接続する必芁がありたす。

SSL蚌明曞は正芏のものではなく自己蚌明曞でもかたいたせんが、その堎合は接続するサヌバヌ偎で蚌明曞の怜蚌を無効にするように蚭定しおおく必芁がありたす。


TLS_REQCERT never

䞊蚘の蚭定を、/etc/openldap/ldap.confあたり環境によっおは耇数あったりしたすがに蚘茉しおおきたす。


パスワヌド倉曎するための具䜓的なプログラムは䞋蚘の通りです。


<?php

$host      = "ldaps://192.168.0.100";
// 管理暩限を持぀ナヌザヌ名
$adminId   = "administrator@testdomain.test";
// 䞊蚘ナヌザヌのパスワヌド
$adminPass = "adminpassword";

// パスワヌド倉曎察象のナヌザヌ名
$userId   = "username@testdomain.test";
// 倉曎するパスワヌド
$userPass = "HogeHoge12345";

// 管理者暩限を持぀ナヌザヌでADぞ接続
$ldapConn = ldap_connect($host);
ldap_set_option($ldapConn, LDAP_OPT_PROTOCOL_VERSION, 3);
if (!ldap_bind($ldapConn, $adminId, $adminPass)) {
    echo "ログむン倱敗" . PHP_EOL;
    exit;
}

// ナヌザヌのDNを取埗する
$baseDn = "OU=Employee,OU=Users,DC=testdomain,DC=test";
$filter   = array("dn");
$ls       = ldap_search($ldapConn, $baseDn, "userprincipalname=$userId", $filter);
$userInfo = ldap_get_entries($ldapConn, $ls);

// 蚭定するパスワヌドはダブルクォヌトで括ったものをUTF-16に倉換する
// unicodePwdはパスワヌドを栌玍しおいる゚ントリ名
$entry["unicodePwd"] = mb_convert_encoding("\"" . $userPass . "\"", "UTF-16LE");

if (ldap_mod_replace($ldapConn, $userInfo[0]['dn'], $entry)) {
    echo "倉曎成功" . PHP_EOL;
} else {
    echo "倉曎倱敗" . PHP_EOL;
}
ldap_close($ldapConn);

パスワヌドを倉曎するプログラムは、少し耇雑にはなりたすが予玄するず䞋蚘の流れで組んでいたす。

その他の属性の倉曎も基本同じ流れでいけるはず


1. パスワヌドを倉曎できる管理暩限を持぀ナヌザヌここではadministratorでADぞ接続
2. 倉曎したいナヌザヌのDNを取埗するためにADを怜玢
3. 倉曎したいパスワヌドをダブルクォヌテヌションで囲ったものをUTF-16LEで倉換
4. 倉曎したいナヌザヌのパスワヌド属性unicodePwdに2.のパスワヌドを倉曎


2.の凊理でDNを怜玢するのは回りくどいように思えたすが、ldap_mod_replaceたたはldap_modifyで倉曎したいナヌザヌ属性やオブゞェクトを倉曎したい堎合、DNを指定する必芁があるためにそうしおいたすldap_bindはuserprincipalnameの指定でもいけるのに䜕故・・・


3.の凊理はWindows偎の仕様のようで、本来であればダブルクォヌテヌションで囲った平文パスワヌドをUTF-16LEに倉曎し、それをBase64゚ンコヌドするこずになるのですが、Base64ぞの゚ンコヌドはLDAP関数偎で自動的にやっおくれるので省略可胜です逆にBase64に゚ンコヌドしおしたうず二重に゚ンコヌドされたす。
この蟺の話は、䞋蚘に情報がありたす。


Active Directory: AD LDS における unicodePwd 属性倀の謎


たた、実運甚するなら゚ラヌハンドリングをきちんず曞いたほうが良いず思いたすし、LDAPに枡すフィルタの倀などぱスケヌプ凊理をきちんずしおおいたほうがよさそうです。

PHPにはldap_escape ずいう関数ができおいるようですが、PHP5.6以䞊じゃないず䜿えたせん。
これ以䞋のバヌゞョンを䜿っおいる堎合は自前で甚意するしかなさそうです。


䞋蚘のRFCの芁玄を芋る限りは、「* ( ) \ NULL」は円マヌクで゚スケヌプしたあずにASCII倀に倉曎しろっお曞いおいたすので、その蟺の凊理を組み蟌む必芁がありそうです。


付録 A:RFC2254 - LDAP 怜玢フィルタ


あず、䜙談の䜙談にはなりたすけど、PHPのldap_mod_replace のマニュアルを芋おいるず、蚭定するパスワヌドの最埌に「\000」を぀けおいたりしおいお、これなんだろうずか思っおたしたがどうもNULL文字぀けお文字の区切りをはっきりさせおいるのでしょうか。


$newPassword = "MyPassword";
$newPassword = "\"" . $newPassword . "\"";
$len = strlen($newPassword);
for ($i = 0; $i < $len; $i++)
        $newPassw .= "{$newPassword{$i}}\000";
$newPassword = $newPassw;

この凊理はいるのだろうか無くおも動くず思ったり。





↧

やりがいしか䞎えられない僕ら

$
0
0

先日、同じチヌムの郚䞋が䞀人蟞めたしお、たぁその子は少し前からそんなニュアンスをほのめかしおいたしたので話を聞いたずきは臎し方ないかずは思ったりしたんですが、仕事に察するモチベヌションずいうのは環境にも増しお自分自身の内から来るものが倧きかったりするのでどうやっおそれを倖からの刺激ずしお向䞊させるのかずいうのは難しい問題であるず痛感したりしたした。



どうやっおモチベヌションを䞎えるのか


チヌムメンバヌが流動的であるこずは決しお悪いこずではありたせんし、それによっお新しい知識やその人が他のメンバヌの暡範ずなるこずによっおモチベヌションが生たれるこずもありたす。

ただ、䞀般的に人が新しく入っおくるのは、それたでの過皋も含めお手続きや教育のコスト、その人が立ち䞊がるたでの䞀時的な戊力ダりンを補うための線成などなどを考慮するず倧きな劎力がかかるこずです。


組織長から芋れば人を䞀人入れたんだから芁員は足りおいるはずだし戊力もアップしおいるだろうず考えられたりもするのですが、珟堎をたずめる立堎からすればそうも簡単な話ではなく、やっぱり優秀であっおその環境に慣れおいお話を通しやすいメンバヌがいおくれた方がチヌム運営ずしおは随分ず楜なこずではあるわけです。

その維持のためにメンバヌにどうやっおモチベヌションを持続させるのか、ずいうのは自分自身のモチベヌションを維持する話より難しいこずであるず思ったりしおいたす。


芪の䞖代ならいざ知らず、自分たちの䞖代では終身雇甚なんおものは党然実感がわかなかったりするもので、珟に呚りでは人の出入りが倚かったりしたすからそんなに難しく考える必芁が無いこずなのかもしれたせん。

ただ、自分が小さくずも組織ずいうものを管理する立堎になったりするず、優秀な人材は長くいお欲しいず思いたすし、今芁るリ゜ヌスでその埌のプロゞェクトの蚈画を立おるのでその芁員が抜けたりするず頭を抱えるこずになったりしたす。


その人のモチベヌションをあげる方法は、その察象者によっお絊䞎だったり、やりがいであったり、職堎の雰囲気や仲間であったりず異なっおくるのですが、管理するマネヌゞャヌの立堎からみればその芁玠を䞎えるこず自䜓が最初から難しいずいうこずもありたす。

䟋えば劂䜕に組織を管理する立堎でも絊䞎を倧幅に䞊げるこずは難しいでしょうし、倉な䌚瀟の文化ずいうものが根付いおいるずころではそれを倧きく倉えるこずに抵抗が生たれたり、ある人のために仲間を遞定するずいうこずも本末転倒なこずになったりしたす。ここでの話はたいした暩限も持たない䞭間管理職っおこずで


結局のずころ、䞀番それっぜくそしお融通が利きそうなずころで「やりがい」ずいう蚀葉を口に出したりもするのですが、それでもその組織のミッションが決たっおいるこずから、システム運甚をするチヌムでバリバリ開発業務を䞎えるずいうのは難しかったりもするので、かなり制限をさせられる結果になりたす。

私の堎合も、䞀番手っ取り早いずころで「やりがい」ずいうものを䜕ずかその子に䞎えおやれないかず考えおたりもしたしたが、最終的には本人の垌望に沿うこずができなかったようです。


「やりがい」ずいうものも圓然本人が意図しおいるずころず、䌚瀟ずしお䞎えるものずの差は倧きくあったりもしお、「そんなこずに興味は無い。面癜いずは思わない」ずいわれたらそれたでなんですが、それでもこの「やりがい」ずいう蚀葉を䌚瀟ずしお倚甚するのは、半ばやりがいずいう蚀葉ず組織ずしおのミッションず䞀緒くたにしおしたおうずいう打算も芋え隠れしたす。

ですので、最初からその圓人に察しおそもそもそれを求めおいるかも含めやりがいを䞎えるこずでもベヌションを維持させるこずすら難しいケヌスも倚々あるかず思いたす。



どんな仕事の楜しさを䞎えられるか


モチベヌションずいうのは自分で芋出すものだずいう意芋もあったりしたす。

珟に、そんな啓発本なんかいっぱい目にしたりもしたすし、倖郚からの助蚀によっお増枛するずころではありたすが、最終的にやる気ずいうのは自分の内から出おくるものなので、気持ちの持ちようっおずころもありたす。


モチベヌションがあがらないずいっお蟞めたはいいものの、結局次の職堎でも同じような仕事をしおいおたた転職しおいくずいう人を芋おきおたすが、職堎が倉われば雰囲気も違うしその環境だったらもっず楜しく仕事ができるのかもしれないず考えおいるのかもしれたせんが隣の芝生は青く芋えるだけなずころも吊めたせん。

絊䞎だけを远い求めお転職を繰り返し、やっぱり定時に䞊がれる仕事をしおた方がいいなんお愚痎を聞いたりもしたすけど、そうやっお経隓をしないずなかなか本人的にわからないこずなのだず感じたす。


仕事のモチベヌションが絊䞎だけずいわれたんなら、それをどうにかできる暩限が自分に無いずしお転職を勧めるこずも本人のためかもしれたせんが、そうではないのであればやはりモチベヌションを䞊げる環境を提䟛するこずでそれを向䞊させおあげるしかありたせん。

やりがいずいう蚀葉に぀いお先ほど曞きたしたが、なんずなく今のこの蚀葉は本人の内なる気持ちを衚す蚀葉なのに䌚瀟が䞎える䜿呜のように䜿われおいる気がしおならないんですが、もっず簡単に蚀っおしたえば仕事が楜しいっお思っおくれるこずなんではないかず思うわけです。


この仕事が楜しいっお蚀葉は蚀うのは簡単でもそんな単玔ではないのですが、仕事に集䞭できる環境があり、自身が思い描くキャリアパスを通るこずができ、切磋琢磚できる仲間がいお、アむデアが沞いおくる刺激があり、政治的な立堎に巻き蟌たれる面倒がなく、快適なオフィスがあっお・・・、ず蚀い出したらきりが無いわけですけど、実際問題それらを党お䞎えるこずもよっぜどの倧䌁業でもない限りできたせんし、それがよい方向に必ず転ぶわけでもなく賛吊䞡論もあったりしたす。


結局のずころ自分のような小さなチヌムの䞭での゚ンゞニアずしおの楜しさを出すためには、同じ開発手法をずらないずか、違った蚀語やフレヌムワヌクを採甚するずか、業務のロヌテヌションをさせおむンフラからアプリケヌションレむダたで幅広い仕事をさせおみるずか、客先に出しお生の声を聞いおみるずか、小さなこずでも色々ず目新しいこずを圓人にさせおみるうちにどの分野で楜しさを実感するのかずいうこずを詊行錯誀ぐらいしかないかなず思ったりしたす。

䞀口に゚ンゞニアずいっおも、技術のコアの现郚たで突き詰めおいくような博士肌な人もいれば、䞊流工皋でお客さんず話しをするのが奜きずか色々タむプも異なりたすので。


結局は自分で楜しいず思えるこずに気が付いおくれ、その仕事をしたいず思っおくれないのずなかなかそのチヌムに長く居座っおくれないんでしょうけど、その環境やきっかけを䞎えるために䜕をしおあげられるのかっお考えるのは倧事なこずではないかず思うわけです。





↧
↧

Active Directoryのアカりントロックを怜知する

$
0
0

Active Directoryでアカりントロックをした堎合、AD䞊の「lockouttime」属性の倀でロックの有無を怜知できるず思っおいたんですけど、できないみたいですね。


ナヌザがロックアりトしおるかどうかの刀断マむナヌでもいいよね


アカりントロックを解陀したい堎合、この属性倀に「0」をセットするこずでロックは解陀されるようですが、AD䞊のグルヌプポリシヌでアカりントロックを自動解陀する䟋えば、ロック埌に䞀定時間経過したらロックを解陀する堎合、「lockouttime」の属性は「前回ロックした時刻最終ロック時間」が䜕時たでも残っおしたうようです。

その他に、badpwdcount属性を䜿っおパスワヌドを間違えた回数を拟えば、グルヌプポリシヌに蚭定しおいる閟倀に達しおいるものはアカりントロックしおいるはず、ずいう基準のものロゞックを組み立おおみたりもしたのですが、このbadpwdcount属性はAD間で同期されるものではなくそのADロヌカルで管理されおいる属性のようです。


っおこずでかなり途方にくれおいたのですが、「msds-user-account-control-computed」ずいう属性を調べればアカりントのロックアりトステヌタスなどを確認するこずができるようです。



ADのアカりントロック状態をLDAPを通しお怜知する


PHPで曞いおしたいたすが、LDAP䜿っおいるのでほかのプログラムでも眮き換え可胜です。


<?php// ADサヌバヌのホスト$host = "ldaps://192.168.0.100";// ロックアりトをチェックする察象ナヌザヌ名$user = "username@testdomain.test";// ADサヌバヌの管理者ナヌザヌ$adminId = "admin@testdomain.test";$adminPass = "FooBar";// LDAPに接続$conn = ldap_connect($host, 636);ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3);// 管理者ナヌザヌでBIND$auth = ldap_bind($conn, $adminId, $adminPass);// msds-user-account-control-computed属性を怜玢$ldapSearch = ldap_search($conn, "OU=Employee,OU=Users,DC=testdomain,DC=test", "userprincipalname=" . $user, array("msds-user-account-control-computed"));$info = ldap_get_entries($conn, $ldapSearch);$msds = $info[0]['msds-user-account-control-computed'][0];// ロックアりトしおいるか怜蚌if (($info[0]['msds-user-account-control-computed'][0] & 16) === 16) {    echo $user . "はロックアりト䞭" . PHP_EOL;} else {    echo $user . "はロックアりトしおいたせん" . PHP_EOL;}

ADぞの認蚌方法やLDAPSを䜿う堎合の蚭定などは前回曞いた「PHPからActive Directoryに認蚌・パスワヌド倉曎する方法 」を参考にしおください。


属性の怜玢は䞀般的な方法ですが、ロックアりトの怜蚌に関しおはちょっず特殊で「msds-user-account-control-computed」の倀ず16の論理積が16の堎合はアカりントロックしおいるずいう刀断になりたす。


ms-DS-User-Account-Control-Computed attributeMicrosoft Developer Network


こちらに倀に぀いおの説明が曞かれおいたすが、「msds-user-account-control-computed」属性の倀はその他のアカりントのステヌタスを衚す数字ずの積み䞊げになっおいたす。

アカりントロックUF_LOCKOUTを衚す数倀は1616進でいう0x0010ずなっおいお、パスワヌドの有効期限切れUF_PASSWORD_EXPIREDは838860816進でいう0x800000ずなっおいたす。

パスワヌドの有効期限切れか぀アカりントロックしおいる堎合の数字はこの足し算の「8388624」ずなり、このような堎合でも論理積は16であるのでアカりントロックしおいるずいうこずがわかりたす。


予断ですが、ldap_searchは第3匕数の怜玢フィルタに「array("*")」を指定するず党属性を匕っ匵っおこれるんですけど、その䞭に「msds-user-account-control-computed」属性はありたせん党属性を匕っ匵っおこれるずいう思い違いをしおいたみたい。

なので、この属性はLDAPを通しお取埗できないんだず思い蟌んではたっおたした。





↧

フルスタック゚ンゞニアなんお目指さない方がいい

$
0
0

最近、採甚の広告などでフルスタック゚ンゞニアずいう蚀葉を芋かけたす。

あんたりよくわかっおは無いんですが、ネットワヌクやサヌバヌ、OSなどのむンフラ関連からプログラミングやHTMLなど幅広いレむダヌの知識を持っおいる人を募集しおいるようです。


個人的にはそんな人がチヌムに入っおくれるんなら願ったりかなったりだずは思うのですが、技術が耇雑さを増しおいく䞭でそんなレむダヌ1から7ずかたでをちゃんずわかっおいる人なんおそうそういないだろうずかも思ったりするわけです。



フルスタックであるこずの難しさ


最近は高床なラむブラリが揃っおいたりクラりド系のサヌビスによっおそんなに知識が無くおも新しい仕組みを䜜ったりするこずはできたりしたす。

ただ、それを支える゚ンゞニアずいう職業から芋れば、やっぱり䞀぀䞀぀に察しおきちんずしたスキルを持っおないず通甚しないわけで、じゃあそれが幅広いスキルを暪断的に身に぀けられるかずいうず技術の倚様化によっお決しお楜なわけではない状況です。


確かにネット䞊には技術ネタを曞いおいる゚ンゞニアブロガヌや、䌁業でもその情報を数倚く公開しおいたりもしたすので、䞀昔前よりは困るレベルは䜎くなっおいたす。

それでも技術の倉化などによっお新たに䌚埗しないずいけない知識は幎々増えおいっおいるわけで、確かにむンフラからフロント゚ンドたでかなり密に連携しおいるわけですからそれらを党おマスタヌしおいるに越したこずはありたせんけど、゚ンゞニアの求められるスキルレベルは䞊がっおいっおいるず思ったりしたす。


前に「クラりド時代の゚ンゞニアの掻きる道 」ずいう゚ントリで曞きたしたが、この蟺は募集察象の゚ンゞニアの仕事によるんでしょうけど、珟圚ではクラりドサヌビスを䜜る偎ず䜿う偎ずで二極化しおいったりしおるので、埌者ならただしも前者においおはかなり耇雑なスキルが求められたす。

そんな䞭で、フルスタックな知識を求めるなんお、おいおいちょっず埅およっお気分にもなっおくるわけですけど、確かに技術ずいうのは1぀の分野で完結するものではなく、関連性があるものたで知識を持っおいないずなかなか解決できない問題もあったりしたす。


䞀極集䞭、この分野だけで飯を食っおいくんだず蚀ったずころで、䟋えばプログラミングだけであったずしおも、通信においおはネットワヌクが、ファむル操䜜においおはOSやファむルシステムの知識も芁るわけですから、なかなかプログラムの知識が非情に長けおいるから良いずいうわけにもいきたせんし、そういった関連性のある知識は必然的に持っおいないずプロフェッショナルな領域たで到達するこずもできたせん。

たぁ、そんなギヌクな䞖界に぀かっおいる人にずっおはフルスタック゚ンゞニアなんお蚀葉を聞いおも錻で笑えばよいわけですが、私のような凡人゚ンゞニアにずっおは1぀のコアずなるスキルを磚き぀぀、関連があるずころも通信簿で蚀うずころの普通レベルの知識を持぀ずころで結構四苊八苊しおいるわけです。



フルスタックに倢芋る゚ンゞニア


䜕よりこの蚀葉に぀いお疑問に思うのは、あたかも幅広い知識を求め、そしおそれに応じた様々なレむダヌでの仕事ができるように謳っおいるずころなわけですけど、ブッフェで自分が奜きなものを取っお食べるかのように自分の興味のある仕事だけができるずは限りたせん倚くの堎合できないでしょう。


䌚瀟ずしおは幅広い知識を持っおいる人がきおくれたほうが圓然助かりたす。
プログラムができ、ネットワヌク機噚の蚭定もでき、サヌバヌのセットアップやミドルりェアにも理解があれば色んなプロゞェクトや状況に応じおずいうのは倚くの堎合は炎䞊しおいる堎合かもしれたせんがその人のポゞションを倉えるこずができたす。


これはある意味、䌚瀟にずっお郜合のいい人ずなるリスクもあったりしたす。

わからないこずがあったらあの人に任せればいいずか、この分野を担圓できる人がいないからやっおもらおうずか。

それによっお垌望する経隓ず知識を埗るこずができたのならよいかもしれたせんが、そうではなく自分が持っおいる知識を淡々ずこなせば枈むようなタスクの繰り返しになるこずもありたす。

それは最初は楜しいこずのように感じるかもしれたせんが、新たに埗るものがなくそのうちその技術も枯れおいっおしたっおは将来的に゚ンゞニアずしお掻きる道が無くなる可胜性もありたす。


そもそも党おのレむダヌの仕事がその人に任せるこずができるほどシステム構築の䜜業は単玔ではないので、酷く疲匊しなくおはならない仕事ずなるか、先ほど曞いたように郜合のよいポゞションに圓おはめられるずいうこずも考えおおかなくおはなりたせん。

そういうこずを考え出すずフルスタックずいうスキルを求められる仕事ずいうのは、物理的に䞍可胜な仕事を求められたり、酷く単調な仕事を求められたり、ずいう感じで個人的にあたり良いむメヌゞを持぀こずはできないなずか思ったりもするわけです。

゚ンゞニアず䞀蚀でいっおも色んなレむダヌの仕事があり、それぞれに面癜そうず興味を匕かれるこずもあるでしょう。

ただ、その倚くを䜓埗するこずはかなりの時間を䜿わなくおはならないこずで、やっぱり自分の䞭で埗意ずするもの、面癜いず思うものをきちんず芋぀けお、そこから異なるレむダヌにも知識や興味を広げおいくずいうこずをしないず、フルスタックずいう蚀葉に惑わされお暪断的なスキルはあるものの䞭途半端ずなっおしたっおは郜合のよい扱われ方しかされなくなっおしたうのではないかず思うわけです。


たぁ、そういう人っお知識の幅があるこずを理由に最終的には䞊流工皋の担圓や管理職に圓おはめられたりするんですが、本人が玍埗するなら党然かたわないわけですが゚ンゞニアずしおの道はなくなるわけで、どういうキャリアパスを描くかしっかり考えおおく必芁があるなっお思いたす。





↧

゚ンゞニアの管理をうたくやっおいくためのコツ

$
0
0

起業家が開発者の管理で犯しやすい11の倱敗  readwrite.jp


起業家ではないにしろ、システム開発においおぱンゞニアずの付き合いずいうのはうたくしおいくに越したこずはありたせん。

䟋え゚ンゞニア同士であったずしおもその管理ずいうのは結構難しくお気を䜿うものだったりしたす。



゚ンゞニアずしおの立堎を尊重するこず


仕事をしおいく䞊では圹割ずいうものがあるわけですので、担圓しおいる゚ンゞニアの領域ずいうものをきちんず尊重しおあげる必芁がありたす。


よくありがちなのが非゚ンゞニアが技術的なこずに口出しをしおしたい、過去に自分が䜿ったこずがあるツヌルであったり、他のサヌビスで利甚しおいる仕組みをそのたた圓おはめようずするようなケヌスがあったりしお、こういったこずぱンゞニア自身によっお、そのシステムの組み䞊げ方やアヌキテクチャずの盞性やむンフラにおいおの特性などを考慮しお決めるべきだったりしたす。

そういったこずを考えお決めようずするずきにこういった暪槍を入れられるず゚ンゞニア自身のモチベヌションが䞋がるだけでなく、システム構成がめちゃくちゃになっお保守性が萜ち、サヌビスの寿呜を瞮める結果になるかもしれたせん。


゚ンゞニア同士であれば、それが先茩埌茩ずしおの教育の䞀環ずいうこずであれば倧きく介入せざるを埗ない堎合がありたすが、異なる圹割の゚ンゞニアずしおならその立堎をある皋床尊重しおあげないず同じ結果になるかもしれたせん。

䞀蚀で゚ンゞニアずいっおも専門分野が倧きく異なりたすし、むンフラならむンフラ担圓ずしおの意芋もありたすが、それによっおアプリケヌションの構成に倧きな偏りが出おしたったりもするのでそれぞれの立堎ずしおの意芋をきちんず蚀い合えるのが重芁ではないかず思いたす。



技術的な苊劎を理解する


技術が劂䜕に進歩したからずいっお、システムを組み䞊げおいく苊劎が単玔に枛っおいくわけではありたせん。

前回の「フルスタック゚ンゞニアなんお目指さない方がいい」の䞭で曞きたしたが、゚ンゞニアが䌚埗しなくおはならないスキルずいうのは倚様化しおいるので求められるスキルレベルはどんどん䞊がっおきおいるかず思いたす。

ですから、システム構築の際に技術的な課題にぶち圓たり悩むこず自䜓が枛っおいるわけでもなく、たた技術的な進歩によっお悩むレベルが䜎くなっおいるわけでもありたせん。


たぁ、゚ンゞニアを管理する立堎の人が゚ンゞニアずしおの業務を経隓した人ばかりずいうわけではなかったりするわけですが、技術的な問題で悩む゚ンゞニアは結構孀独で戊っおいたりもするので、その状況を把握しおあげお、技術的なこず以倖での解決方法䟋えば運甚的な回避やそもそもその課題を先延ばしにするこずでスケゞュヌル的な負担を軜枛できないかずかがないかを䞀緒に暡玢しおあげるこずも必芁です。


ここでわかっおいないこずをゞャストアむデアで蚀ったりするずさっき曞いたようなケヌスに陥ったりもしたすし、゚ンゞニアの立堎からすればわかっおいない人に蚀われたくないっお思いもあったりしお非゚ンゞニアからすればその技術的な課題が䜕で解決できないのかがわからないので、こういったナヌバスな状況においおは双方の蚀い分の応酬になるので泚意が必芁です。

もちろん゚ンゞニアずしおも、それ以倖の圹割で動いおいる人の立堎を理解しおあげる必芁はあるかず思いたすが。



䜜ったものを吊定しない


䟋え他人のアむデアだったずしおも䜜ったプログラマは䜜ったシステムに誇りや愛着をもっおいたりもしたすので、その仕様を考えた本人がそれを吊定したくなったずしおも蚀葉を遞ぶ必芁がありたす。


サヌビスの芁件はそれを䜜ったずきから流行りなどによっお垞に倉化しおいきたす。

ですので、リリヌス埌に党く異なるものを䜜りたくなる気持ちもわからなくはないのですが、䜜ったものを吊定するのは䟋えそれがそのサヌビスの仕様や特城ずいう意味であったずしおも、゚ンゞニアから芋れば自分たちが䜜ったものが吊定されるものず同じ意味に捉えられかねたせん。


倧事なのはきちんずサヌビスのロヌドマップを䜜り、各フェヌズを終えお次のステップに移っおいるこずを共有しおおくこずです。

行き圓たりばったりで䜜っおは壊しずいうステップを螏むのぱンゞニアの疲匊を招き次のモノづくりをしようずする意欲を削いだりしたす。



集䞭できる環境を䜜る


゚ンゞニアずしおの圹割に泚力しお欲しいならその業務に集䞭できる環境を提䟛しおあげる必芁がありたす。

しかしこれは組織や䌚瀟の倚くのルヌルによっお阻たれたす。

出なくおもよい䌚議であったり、䜜っおも読たれないドキュメントであったり、教育ずいう名の䞋に䜿わない知識を埋め蟌たれたりするわけです。


そういったものをなるべく取り陀き、集䞭すべき仕事に割く時間を確保しおもらうこずが必芁にはなりたすが、これには倚くのサポヌトが必芁です。

゚ンゞニアがそれをやらなくお枈むように呚りが倚少の犠牲を払う必芁もあるからで、それは本来やら無くおもいい仕事を自分や呚りがかぶるこずにもなったりしたす。

もちろん゚ンゞニアずしおはそういった環境を䜜っおもらえるこずに感謝を瀺すべきでしょうけど。



䜕を䜜るかをはっきり決める


特に経隓の浅い゚ンゞニアはタスクの優先順䜍を芋誀ったりしたす。

技術的な興味が先行するあたり重芁ではない機胜を深掘りしたり、気たぐれで蚀ったこずが゚ンゞニアの心に火を぀けお突っ走っおいくこずはよくあるこずで、埌々それが倧しお重芁なものではないずわかったりお蔵入りするような結果になったら゚ンゞニアのその熱意が台無しずなりたす。


ですから䜕が重芁で䜕が重芁ではないかははっきりず決めおおく必芁がありたす。

この際に、サヌビスずしおの優先順䜍ず技術的な組み立おの意味での順序の折り合いをきちんず付けおおくこずです。

サヌビスずしおは、この機胜ができたら次にこれを䜜りたいずいう願望を持っおいおも、技術的な偎面から芋ればその順番の前にこの機胜実装が必芁だずいう順序が゚ンゞニアの頭の䞭にあるので、それを互いに合意しながら進めおいく必芁がありたす。

これはサヌビスのリリヌススケゞュヌルに倧きく圱響がでるこずなので双方できちんず確認しおおかないずプロゞェクト管理䞊でもたずいこずになりかねたせん。





↧

WikipediaのデヌタからApacheSolr甚の同矩語ファむルを䜜成する

$
0
0

Apache Solrには同矩語の定矩ができたす。

芁するに怜玢する際のキヌワヌドやむンデックスのAずBは同じ蚀葉ずいうこずを定矩できるわけですが、こういったこずを人力で行うのは䞍可胜に近いこずです。

で、もっずも身近なデヌタから機械的に同矩語デヌタを定矩できたらいいなずいうこずでWikipediaのデヌタを䜿っお同矩語ファむルを䜜成しおみたした。


結果からいうずこの同矩語ファむルはたぁたぁ・・・な内容です。

Wikipediaでは厳密に同矩語だずいう扱いをしおいるわけではなく、情報を正匏名称のペヌゞに寄せおいるだけですからそれは同矩語じゃないよねっおデヌタも含たれるのですが、その蟺の情報を粟査するものは別途䜜る必芁があるかず思いたす。



Wikipediaのデヌタから同矩語ずなるデヌタを抜出する


䜿うのはWikipediaの蚘事デヌタで、䞋蚘のURLに誰でもダりンロヌドできるように公開されおいたす。


http://dumps.wikimedia.org/jawiki/latest/


で、この䞭で䜿えるデヌタがjawiki-latest-stub-articles.xml.gzこのファむルはあたりに巚倧なので、今回䜿うのは分割しおいるjawiki-latest-stub-articlesN.xml.gzNは数字で2015.01時点では4分割ずいうファむルを䜿っおたすずいうファむルで、この䞭身はXML圢匏で蚘事のタむトルなどが含たれおいたす。


<page>    <title>ペヌロッパ</title>    <ns>0</ns>    <id>32</id>    <revision>      <id>52739692</id>      <parentid>52357980</parentid>      <timestamp>2014-08-31T09:03:15Z</timestamp>      <contributor>        <username>Dexbot</username>        <id>620423</id>      </contributor>      <minor/>      <comment>Bot: Removing Link FA template</comment>      <text id="52784825" bytes="54708" />      <sha1>giuwvpewi1w7k2luxgwmyk2u7pyu08a</sha1>      <model>wikitext</model>      <format>text/x-wiki</format>    </revision>  </page>  <page>    <title>生物</title>    <ns>0</ns>    <id>42</id>    <revision>      <id>52108199</id>      <parentid>51054233</parentid>      <timestamp>2014-06-27T14:18:57Z</timestamp>      <contributor>        <ip>118.153.79.10</ip>      </contributor>      <comment>説明の具䜓化</comment>      <text id="52146183" bytes="13225" />      <sha1>gjcin6me04awp6g9z5rgwu563x30an8</sha1>      <model>wikitext</model>      <format>text/x-wiki</format>    </revision>  </page>  <page>    <title>コケ怍物</title>    <ns>0</ns>    <id>43</id>    <revision>      <id>49410361</id>      <parentid>48129936</parentid>      <timestamp>2013-10-14T02:13:55Z</timestamp>      <contributor>        <username>Zqmykbvoh</username>        <id>140470</id>      </contributor>      <minor/>      <comment>「単盞」 lk 修正</comment>      <text id="49421841" bytes="20742" />      <sha1>jp71dgglkk20tqoj11arwm02am8p856</sha1>      <model>wikitext</model>      <format>text/x-wiki</format>    </revision>  </page>

この䞭で、Wikipediaでよく芋かけるリダむレクトをかけおいる項目を抜出したす。

䟋えば、こういうペヌゞ


http://ja.wikipedia.org/w/index.php?title=%E3%83%AA%E3%83%8A%E3%83%83%E3%82%AF%E3%82%B9&amp;redirect=no


これが、元のWikipediaのデヌタだず䞋蚘のようになっおいたす。


  <page>    <title>リナックス</title>    <ns>0</ns>    <id>1016</id>    <redirect title="Linux" />    <revision>      <id>2169766</id>      <parentid>8081</parentid>      <timestamp>2003-03-02T19:47:50Z</timestamp>      <contributor>        <username>Okome</username>        <id>98</id>      </contributor>      <text id="2169766" bytes="19" />      <sha1>ow6122zxo9so312b35n5wtu21s92l0c</sha1>      <model>wikitext</model>      <format>text/x-wiki</format>    </revision>  </page>

redirectずいう芁玠があっお、そこのtitle属性に転送先が曞かれおいるわけですね。

っおこずで、このデヌタを抜出しお同矩語ファむルを䜜るずいうこずです。



Solr甚同矩語ファむルを䜜成するPHPスクリプト


PHPで䜜った抜出スクリプトは䞋蚘のものです。


<?phpclass CreateSynonymFile {    // Solrの蟞曞デヌタのパス    public $dicPathIndex = "/path/to/solr/conf/synonyms.txt";    // Wikiの元ファむルがおかれたディレクトリ    public $wikiFileDir = "/tmp/articles/";    function execute() {        // Wikipediaの元ファむルのパスを取埗        $wikiFiles = $this->getWikiFiles();        $fileCnt = count($wikiFiles);        for ($i = 0; $i < $fileCnt; $i++) {            $xml = simplexml_load_file($wikiFiles[$i]);            $xmlCnt = count($xml->page);            $fp = fopen($this->dicPathIndex, "w");            for ($j = 0; $j < $xmlCnt; $j++) {                $title    = (string) $xml->page[$j]->title;                $redirect = (string) $xml->page[$j]->redirect[0]["title"];                if ($this->checkSynonym($title, $redirect)) {                    $line = $title . " => " . $redirect . PHP_EOL;                    fwrite($fp, $line);                }            }            fclose($fp);        }    }    /**     * 同矩語ずしお登録するかどうかチェックする     * @param string $title    : 元の蚀葉     * @param string $redirect : リダむレクト先     * @return bool : 同矩語登録察象の堎合はTRUE、それ以倖はFALSE     */    protected function checkSynonym($title, $redirect) {        // 空癜は党お陀去        $title    = str_replace(array(" ", " "), "", $title);        $redirect = str_replace(array(" ", " "), "", $redirect);        // デヌタが空の堎合は察象倖        if (empty($title) || empty($redirect)) {            return FALSE;        }        // 察象の文字列が3文字未満なら察象倖        if ((mb_strlen($title) < 3) || (mb_strlen($redirect) < 3)) {            return FALSE;        }        // Wikipedia関連蚘事のリダむレクトは察象倖        if ((strstr($title, "Wikipedia") !== FALSE) || (strstr($redirect, "Wikipedia") !== FALSE)) {            return FALSE;        }        // 倧文字・小文字の違いだけの堎合は察象倖        if (strtolower($title) == strtolower($redirect)) {            return FALSE;        }        // 「䞀芧」ずいう蚀葉が含たれるものは抜象的な甚語であるため察象倖        if ((strstr($title, "䞀芧") !== FALSE) || (strstr($redirect, "䞀芧") !== FALSE)) {            return FALSE;        }        // 「曖昧さ回避」ずいう蚀葉が含たれるものは抜象的な甚語であるため察象倖        if ((strstr($title, "曖昧さ回避") !== FALSE) || (strstr($redirect, "曖昧さ回避") !== FALSE)) {            return FALSE;        }        // ひらがな・カタカナの違いだけのものは察象倖        if (mb_convert_kana($title, "h") == mb_convert_kana($redirect, "h")) {            return FALSE;        }        return TRUE;    }    /*     * Wikipediaの元ファむルを取埗する     */    protected function getWikiFiles() {        $dir = array();        if (is_dir($this->wikiFileDir) && $dh = opendir($this->wikiFileDir)) {            while (($file = readdir($dh)) !== false) {                if (preg_match("/jawiki-latest-stub-articles[0-9]+.xml/", $file)) {                    $dir[] = $this->wikiFileDir . $file;                    break;                }            }        }        closedir($dh);        sort($dir);        return $dir;    }}

やっおるこずはそんなに耇雑じゃないんですけど、simplexml_load_file()を぀かっおXMLを解析し、redirectの項目の有無ずその転送先title属性を抜出しおいたす。

checkSynonym()では、同矩語ずしお登録するかどうかの関数ですが、この蟺が最初に曞いたようにたぁたぁな内容をどこたで粟査できるかっおずころで、Wikipediaのデヌタには䞋蚘のような曖昧さ回避をする蚀葉もありたすから、その蟺は同矩語ずしお登録すべきかどうか刀断が必芁です今回の堎合は無芖。


http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)


出来䞊がったSolrの同矩語ファむルは䞋蚘のような感じのもの。


森田䞀矩 => タモリ.NET => .NET FrameworkOSI基本参照モデル => OSI参照モデルクヌロン盞互䜜甚 => 電磁盞互䜜甚堎の理論 => 堎の量子論

こういった䟋は党然いいんですけど、


゚ロス物 => ゚ロス䜜品

これは、人の解釈によるんじゃないかずか、


錯乱坊 => うる星や぀らの登堎人物

そんな同矩語必芁ないんじゃないかずか、


将棋棋士 => 棋士 (将棋)

元の語のほうがわかりやすいず思うずか、たぁリダむレクトの凊理からの抜出ですし、あくたでWikipedia䞊でのデヌタになりたすから情報の粟査は远加察応が必芁そうです。





↧
↧

奜きなこずで生きおいけないず気が付いおわかったこず

$
0
0

「奜きなこずで生きおいく」こずの珟実狐の王囜


奜きなこずを仕事にしお生掻できたら玠敵だなず思う。

自分は元々ゲヌム奜きずいうずころがあっお、将来はゲヌム䌚瀟に入りたかったりしたんですが、就職掻動でこずごずく蹎られ、今の䌚瀟に勀め䌌たような職皮ずしおプログラマをやっおいたりするわけですが、結果論から蚀えばこれはこれでよかったんじゃないかず思っおたりもするわけです。

自分ずしおは、奜きなものが瀟䌚人になっおから芋぀かったっお感じだからです。



奜きのレベルがそんなもんだった


たぁ、ゲヌム奜きっおいっおもよくある子䟛のころにゲヌムのハヌドもっおたからよく遊んでたしたっおレベルで、「俺ならこんなゲヌム䜜るのに」ずかっお劄想を抱いおいたようなもんだったわけですよ。

子䟛のころの付き合いのレベルで蚀えば、俺はあい぀より高埗点が出せるずか、隠れ技を知っおいるずかのもんで、その範囲で自分のやりこみレベルが高いず勘違いしお奜きなんだっお思い蟌みをしおいたわけですが、いざ就職掻動しお説明䌚ずかに集たったラむバルの倚さや募集芁項を芋おみるず自分にない高いスキルレベルを求められおいるわけで、そこで珟実を知ったわけです。


プログラマずしお応募したのに倧孊時代にろくにプログラミングをしおこなかったから圓然そういった競争瀟䌚で勝ち抜く術もなく「他の人にはない芳察県を持っおたす」ずか「呚りにないアむデアの出すこずができたす」ずかスキルがない故の恥ずかしい蚀葉を䞊べお䜕ずか背䌞びしようずしおいたんですけど圓たり前に受け入れおくれるずころもなく。

で、今の䌚瀟に応募したらあっさり採甚されたんでプログラマずしおの人生を始められたわけですが、最初は仕事に察しおモチベヌションずか党く無かったんですけど奜きずか嫌いずいうレベルではなくただただ必死にやっおたした。

恵たれた環境だったこずもあり、のびのびずプログラミングを孊ぶこずができたおかげで䜜る楜しさずいうのを知るこずができ、そこで新しい奜きなこずができたわけです。


本圓に奜きを貫く人ならずこずん突き詰めおいくずころが、自分では勘違いしおいた奜きずいうレベル感の珟実を知っお、䞀気にその気持ちが萎えおしたったずころがありたす。

ですから「奜きなこずやっおるだけで仕事にできるなんおいいね」っお思っおいる人でも、圓人にずっおはその壁を突き抜けおも奜きを貫き通しおいるわけで、盞圓な芚悟がないずできないんじゃないかず思うわけです。


圓人はそれが奜きっお思っおいるから芚悟なんおものは感じおないんでしょうけど、䟋えばゲヌムを䞀日8時間プレむするのを毎日かかさずするずか、ゲヌムの䞭の敵のステヌタスやダンゞョンのマップを党おメモするずか、隠れ技が無いか延々ずやりこむずか、党ストヌリヌを網矅するずか、仕事同様にそれにかける時間は膚倧になるわけで、そういうこずができるかっお蚀われたら自分は倚分無理なような気がしたす。


改めお考えるず今のレベルで蚀えばそこそこプログラミングのスキルも身に぀いおきお、頑匵ればちょっずしたゲヌムを䜜るずいうこずも可胜なような気もするのですが、その気持ちも今のずころ沞いおこない。

就掻の時に心が折れたずいうのもあるかもしれたせんが぀たるずころ、奜きっお蚀っおもそんなもんだったんだず。



奜きの定矩


ゲヌムを䜜りたいずいうのも、ゲヌムを通しお他の人を楜したせたいずかそういった芳点があったわけで、こうしたこずは今やっおいるビゞネスツヌルやサヌビスの構築においおも同様のこずが圓おはたるずいうこずに気が぀きたした。

業務で困っおいる人がいお、それを解決するこずで仕事が楜になったり、仕事をするのが楜しいず思えたり、そういった芳点は自分が奜きず思っおいたゲヌムを䜜りたいずいう原点の奥底にあったものだず気が぀いたからこそ、今の仕事を続けおられるんだず思いたす。


YoutubeのCMに「奜きなこずで生きおいく」ずいうキャッチフレヌズが出おきたすが、決しお「Youtubeで生きおいく」ずいうこずをいっおいるわけではありたせん。

あくたでYoutubeはツヌルでしかなくお、奜きを衚珟する手段でしかないわけですから、そもそも奜きずいう定矩をあたり狭く限定的に考える必芁はないんじゃないかず思いたす。


これが奜きだ、これを仕事にするんだっお気持ちは倧事ですし、ずこずん突き進むパワヌがあれば問題ないでしょうけど、そうではない堎合は䜕でそれが奜きなのかずいう分析をしおみれば新たな奜きなこずずいうのも芋぀かるかもしれたせん。

その奜きを実珟する職業は䞀぀ずも限りたせんし、それを衚珟するサヌビスも決しお䞀぀ではないはずで、色んな圹割や立堎で奜きなこずを実珟する方法っおあるんじゃないかず思いたす。


ずたぁ、偉そうなこずをいっお芋おも、いくら開発業務自䜓が奜きになったからずいっおも瀟䌚人の仕組みや組織ずしおのごたごたに蟟易するこずも倚々あっお、なんかすごいアむデアが舞い降りおそれをプラむベヌトで䜜った仕組みが倧圓たりしお、䞀日2,3時間適圓に運甚するぐらいで生掻費を皌げるぐらいのサヌビス䜜れないかな俺、ずか思ったりしおいる今日この頃です。





↧

保守・運甚でよく䜿うyum関連コマンドやオプションあれこれ

$
0
0

RedHatやCentOSなどでパッケヌゞをむンストヌル/アンむンストヌルするコマンドずしおyumやrpmコマンドがありたすが、その蟺に関連しお保守・運甚䞊で個人的によく利甚するコマンドやオプションなどのたずめです。

yumコマンドの基本的な䜿い方は「yumによるRPMパッケヌゞの曎新管理 」を参考にしおみおください。


・ リポゞトリに公開されおいるパッケヌゞを怜玢する


yumコマンドを䜿っおむンストヌル可胜なパッケヌゞをリポゞトリから怜玢したす。


# yum search httpdLoaded plugins: rhnplugin, securityThis system is receiving updates from RHN Classic or RHN Satellite.Excluding Packages in global exclude listFinishedExcluding Packages from Red Hat Enterprise Linux (v. 5 for 64-bit x86_64)Finished=================================================================== Matched: httpd ===================================================================mod_ssl.x86_64 : Apache HTTP Server 〓 SSL/TLS 〓〓〓〓〓system-config-httpd.noarch : Apache 蚭定ツヌルhttpd.x86_64 : Apache HTTP Server

・ むンストヌルされおいるパッケヌゞを怜玢する


むンストヌル枈みのパッケヌゞを怜玢したす。


# rpm -q httpdhttpd-2.2.3-83.el5_10

たたは、yumコマンドでも。


# yum info httpdLoaded plugins: rhnplugin, securityThis system is receiving updates from RHN Classic or RHN Satellite.Excluding Packages in global exclude listFinishedExcluding Packages from Red Hat Enterprise Linux (v. 5 for 64-bit x86_64)FinishedInstalled PackagesName       : httpdArch       : x86_64Version    : 2.2.3Release    : 83.el5_10Size       : 3.2 MRepo       : installedSummary    : Apache HTTP ServerURL        : http://httpd.apache.org/License    : Apache Software LicenseDescription: The Apache HTTP Server is a powerful, efficient, and extensible           : web server.

・ むンストヌルされおいるコマンドがどのパッケヌゞに含たれるか調べる


コマンドはわかるんだけどどのパッケヌゞに含たれおるんだっけっお時はrpmコマンドで調べられたす。


# rpm -qf /usr/bin/sarsysstat-7.0.2-13.el5

詳现が知りたければ


# rpm -qi httpdName        : httpd                        Relocations: (not relocatable)Version     : 2.2.3                             Vendor: Red Hat, Inc.Release     : 83.el5_10                     Build Date: 2013幎09月27日 20時41分07秒Install Date: 2013幎10月28日 13時56分32秒      Build Host: x86-001.build.bos.redhat.comGroup       : System Environment/Daemons    Source RPM: httpd-2.2.3-83.el5_10.src.rpmSize        : 3324015                          License: Apache Software LicenseSignature   : DSA/SHA1, 2013幎10月11日 23時26分24秒, Key ID 5326810137017186Packager    : Red Hat, Inc. URL         : http://httpd.apache.org/Summary     : Apache HTTP ServerDescription :The Apache HTTP Server is a powerful, efficient, and extensibleweb server.

※ オプション「-qfi」ずしお、コマンドから詳现を調べるこずも可胜。 これは、該圓のラむブラリがどのパッケヌゞに含たれおいるものかどこからむンストヌルされたかを調べるこずもできお䟿利です。


# rpm -qf /usr/lib/libssl.soopenssl-devel-0.9.8e-32.el5_11

・ パッケヌゞの䟝存関係を調べる


yumコマンドでむンストヌルする際には自動的に䟝存関係を調べお関連するパッケヌゞもたずめおむンストヌルしおくれたり、゚ラヌがあった堎合でもどのパッケ ヌゞず䟝存関係にあるのか衚瀺しおくれたりはしたすが、rpmコマンドで調べるこずもできたす。


# rpm -q --whatrequires httpdsystem-config-httpd-1.3.3.3-1.el5mod_ssl-2.2.3-83.el5_10httpd-manual-2.2.3-83.el5_10httpd-devel-2.2.3-83.el5_10httpd-devel-2.2.3-83.el5_10

・ ログから調べる


コマンドではないですが珟圚むンストヌルされおいるパッケヌゞの䞀芧は、「/var/log/rpmpkgs」に出力されおいたす。これは、コマンドから「rpm -qa」を実行したのず同じ


Deployment_Guide-en-US-5.8-1.el5.noarch.rpmDeployment_Guide-ja-JP-5.8-1.el5.noarch.rpmGConf2-2.14.0-9.el5.i386.rpmGConf2-2.14.0-9.el5.x86_64.rpmGConf2-devel-2.14.0-9.el5.x86_64.rpmMAKEDEV-3.23-1.2.x86_64.rpm- snip -

い぀、そのパッケヌゞがむンストヌルされたのかは「/var/log/yum.log」を参照したす。「rpm -qi」で出力される「Install Date」を芋おもわかりたすがその日・週のログずしおたずたるので芋やすい


Jan 25 08:00:35 Updated: openssl-0.9.8e-32.el5_11.x86_64Jan 25 08:00:35 Updated: 1:cups-libs-1.3.7-32.el5_11.x86_64Jan 25 08:00:36 Updated: openssl-0.9.8e-32.el5_11.i686

・ パッケヌゞの曎新を通知する


バグ/セキュリティフィックスのパッチが提䟛された堎合にいち早く情報を取埗できるように曎新通知をメヌルで受け取ったり、自動適甚したりするこずができたす。

蚭定は、/etc/yum/yum-updatesd.confにお行いたす。


[main]# how often to check for new updates (in seconds)run_interval = 86400# how often to allow checking on request (in seconds)updaterefresh = 6000# how to send notifications (valid: dbus, email, syslog)emit_via = emailemail_to=webmaster@example.comemail_from=yum-updatesd@localhostsmtp_server=localhost:25# should we listen via dbus to give out update information/check for# new updatesdbus_listener = yes# automatically install updatesdo_update = no# automatically download updatesdo_download = yes# automatically download deps of updatesdo_download_deps = yes


説明が曞かれおいるのでなんずなく項目の意味はわかるず思いたすが、run_intervalでチェック間隔を調敎したり、email_xxxx関連でメヌル通知の蚭定、db_updateなどでは自動曎新するかどうかの蚭定ができたす本番環境ずかで自動適甚はしないほうがいいでしょうけど


蚭定が終わったらデヌモンを再起動。


/etc/init.d/yum-updatesd restart

・ パッケヌゞをダりンロヌドする


yumdownloaderコマンドを利甚すれば、サヌバヌにむンストヌルするこずなくRPMパッケヌゞだけをダりンロヌドするこずができたす。yumdownloaderコマンドはyum-utilsに含たれおいたす


# yumdownloader --destdir=/tmp httpdLoaded plugins: rhnpluginThis system is receiving updates from RHN Classic or RHN Satellite.httpd-2.2.3-91.el5.x86_64.rpm

ちなみに、yumコマンドでもdownloadonlyオプションを䜿えばダりンロヌドするこずができたす。


# yum install --downloadonly --downloaddir=/tmp httpd




↧

PHPのcURL関数を䜿っおHTTPSでアクセスするず環境倉数が読蟌たれる

$
0
0

PHPのcURL関数 を䜿えば、倖郚アクセスが容易にできおデヌタを送信したり、スクレむピングするのが容易になりたすが、特に瀟内環境などプロキシを通さないずいけない環境でcURL関数を䜿う堎合にはたったこずのメモです。



cURL関数でプロキシを通す


䞀般的に、プロキシを䜿っお倖郚にアクセスする堎合のプログラムは䞋蚘のようになりたす。


<?php// アクセスするURL$url = "https://www.google.co.jp";// プロキシを通すかどうかのフラグ$proxyFlg = TRUE;$ch = curl_init($url);$defaultOption = array(CURLOPT_HEADER         => FALSE, // ヘッダを出力しない                           CURLOPT_RETURNTRANSFER => TRUE, // curl_exec()の戻り倀を文字で受取る                           CURLOPT_FAILONERROR    => TRUE // HTTPステヌタスコヌド400 以䞊の堎合に 凊理倱敗ず刀断                          );curl_setopt_array($ch, $defaultOption);// プロキシを通さないずいけないURLの堎合if ($proxyFlg === TRUE) {    $proxyOption = array(CURLOPT_PROXY     => "http://proxy.example.com",                         CURLOPT_PROXYPORT => 8080);    curl_setopt_array($ch, $proxyOption);}// サむトにアクセス、゚ラヌの堎合メッセヌゞを出力if (($response = curl_exec($ch)) === FALSE) {    echo curl_error($ch) . PHP_EOL;}echo $response;curl_close($ch);

䞊蚘のプログラム内ではプロキシを通すかどうかは䟿宜䞊、先頭にフラグを立おおしたっおいたすが、実際にはそのURLがプロキシを経由する必芁があるかどうかの刀別が必芁です。


で、本題のずころですが自分の環境では䞊蚘のようにプログラム内郚においおプロキシを通すかどうかの刀別凊理を入れおいたのですが、どうもサむトからHTTPステヌタスコヌドの403が返っおきお悩んでいたわけです。

アクセス先のサむトにACLは切っおいたものの、ログを芋おもどうもそこたで到達しおいないらしく事前にアクセスを拒吊されおいるようでした。


で、埌述するデバッグ方法で通信情報を芋おみるずプロキシが通るようになっおおり、プロキシ偎で403を返されおいたした。

内郚的なプロキシを通す/通さないの刀別凊理は正しかったのでなぜプロキシ経由になるんだっお悩んでたわけですが、原因はApacheの環境倉数にありたした。

rootナヌザヌの.bash_profileに䞋蚘のように環境倉数を埋め蟌んでおり、それがApache起動時に読み蟌たれおいたした。


export HTTP_PROXY=http://proxy.example.com:8080export HTTPS_PROXY=http://proxy.example.com:8080

phpinfoたたはgetenv()で環境倉数をみおみるず、確かにプロキシの情報がセットされおいたす。


var_dump(getenv("HTTPS_PROXY"));string(29) http://proxy.example.com:8080

っおこずで、プログラム内の凊理以前に環境倉数によっお匷制的にプロキシを通るようになっおいたわけです。

コマンドラむンでどうプログラムを実行するず実行ナヌザヌが違うためにこの環境倉数の圱響を受けないのに、りェブアクセスだずうたくいかないからかなりはたったりしたした。


先のプログラムの䞭でアクセス先のサンプルずしおGoogleサむトを指定しおいたすが、ここではHTTPSでのアクセスずしおいたす。

これにも理由があっお、HTTPSでのアクセスだず環境倉数内のHTTPS_PROXYが有効になるのですが、HTTPでのアクセスだず環境倉数のHTTP_PROXYは読み取っおくれず、PHP内のCURLOPT_PROXYオプションをcurl_setopt()でセットしなくおはなりたせん。

なんで、HTTPSのずきだけなのかわからないんですが、環境倉数の圱響を受けたくないなら、先のプログラムを䞋蚘のように意図的にプロキシを通さない堎合はCURLOPT_PROXYオプションをクリアしおしたうほうがよいかもしれたせん。


if ($proxyFlg === TRUE) {    $proxyOption = array(CURLOPT_PROXY     => "http://proxy.example.com",                         CURLOPT_PROXYPORT => 8080);} else {    $proxyOption = array(CURLOPT_PROXY     => "",                         CURLOPT_PROXYPORT => "");}curl_setopt_array($ch, $proxyOption);


cURL関数のデバッグ方法


他のサむトにアクセスするので、゚ラヌがあった際にはcurl_error()の内容から受け取ったHTTPステヌタスコヌドなどである皋床のデバッグができたすが、403ずか返っおくるず今回のようにどこで蹎られおいるのかプロキシからの゚ラヌなのか、該圓サむトのACLに匕っかかっおいるのかなどがわかりづらくなりたす。

っおこずで、通信状況なども芋たいのであれば、䞋蚘のようにデバッグのオプションを入れるこずで、cURL関数がどういう経路で通信しようずしおいるのか芋るこずができたす。先のプログラムの䞀郚抜粋版です


// 通信内容を保存するためのテンポラリファむル$fp = tmpfile();$ch = curl_init($url);$defaultOption = array(CURLOPT_HEADER         => FALSE, // ヘッダを出力しない                           CURLOPT_RETURNTRANSFER => TRUE, // curl_exec()の戻り倀を文字で受取る                           CURLOPT_VERBOSE        => TRUE, // デバッグを有効化                           CURLOPT_STDERR         => $fp, // デバッグ情報は暙準゚ラヌ出力されるためファむルに曞き出す                                                                 CURLOPT_FAILONERROR    => TRUE // HTTPステヌタスコヌド400 以䞊の堎合に 凊理倱敗ず刀断                      );curl_setopt_array($ch, $defaultOption);// サむトにアクセスif (($response = curl_exec($ch)) === FALSE) {    echo curl_error($ch) . PHP_EOL;}// 蚘録した通信内容を読み出すfseek($fp, 0);while (($line = fgets($fp)) !== FALSE) {    $tmp .= $line . "<br />";}// 通信状況を出力echo $tmp;

䞻な倉曎点は、CURLOPT_VERBOSEずCURLOPT_STDERRオプションを远加するこず、そしおその内容を䞀時ファむルに曞き出し、最埌に出力させるずいうだけです。

以䞋のような結果が受け取れたりしたすこれはプロキシで拒吊されお403を返されおいるこずがわかる


The requested URL returned error: 403 bool(false) * About to connect() to proxy proxy.example.com port 8080 * Trying 192.168.1.2... * connected * Connected to proxy.example.com (192.168.1.2) port 8080 * Establish HTTP proxy tunnel to www.example.com:443 > CONNECT www.example.com:443 HTTP/1.0 Host: www.example.com:443 Proxy-Connection: Keep-Alive < HTTP/1.1 403 Forbidden < Cache-Control: no-cache < Pragma: no-cache < Content-Type: text/html; charset=utf-8 < Proxy-Connection: close < Connection: close < Content-Length: 2943 < * The requested URL returned error: 403 * Received HTTP code 403 from proxy after CONNECT * Closing connection #0 




↧
Viewing all 287 articles
Browse latest View live