2012年1月25日水曜日

>/dev/null 2>&1になんか納得いかないあなたへ

>/dev/null 2>&1とは?
>/dev/null 2>&1は、コマンドの結果を表示させないときに使う定石です。
 軽く解説すると、
コマンドが正常に処理されて、標準出力に結果が表示されるはずのときも、
コマンドが失敗して、標準エラー出力に結果が表示されるはずのときも、
どっちもひっくるめて、/dev/nullにリダイレクトして、
表示させずにおきましょうってことですね。

え?でもこれって、
command 2>&1 >/dev/null
のがしっくりこない( ・`д・´)??

その気持はわかります。
では、正しい場合と間違いやすい間違いの場合を、
細かく見て行きましょう。
初期状態として
最初はこういう状態です。
標準出力をファイルにかえる。
先に標準出力をファイルに変更します。
command 1>/dev/null
ということですね。
標準出力はファイルを指すようになります。
標準出力はファイルを指すようになります。
いつもどおりの結果です。
標準エラー出力を標準出力が指している先にかえる。
つぎに2>&1の部分です。
「標準出力はどこを指してるんだろう?」と、
標準エラー出力は標準出力がさしてる先を見に行きます。
標準出力と標準エラー出力はファイルを指すようになる。
その結果、標準出力と標準エラー出力は、
同じところ(/dev/null)を指すようになります。
command 2>&1 >/dev/nullの場合(間違い)
先に標準エラー出力は、「標準出力がどこをさしてるんだろう?」
と見に行きます。
先に標準エラー出力は画面を指す。
標準エラー出力は、今標準出力が指している画面を指すようになります。
次に標準出力はファイルを見に行く
標準出力はファイル(/dev/null)をみにいきます。
標準出力は/dev/null、標準エラー出力は画面
先に標準エラー出力は画面を指すようになっていたので、
画面を指し、
標準出力はファイルを指すようになります。
この場合は、エラーが出た場合は画面に出力され、
( ̄ー ̄)ちーーーん
となります。

さて、2>&1の&の部分ですが、
これはC言語のポインタを考えると理解しやすいです。
1を変数と見立てると、2という変数に1のポインタの値を代入していますね。

2012年1月17日火曜日

redmineからのー、saltと入れ子集合モデルー♪~(´ε` )

redmineを導入しようとして...
軽く始めたことが、自分の習慣も変えるようになることってありますよねー?
( ・`д・´)<あるあるー

 このまえ職場でプロジェクト管理をちゃんとやろうと思い立って、
redmineをいじりはじめましたヽ(´ー`)ノ

オフィシャルっぽいブログもあって、
導入するのにそんなに苦労はしませんでしたが、
これがちょっとした自分のモットーを変えることになったのです。
ちょっとのぞいてみたテーブル
redmine、職業柄どんな風につくられてんだろうって気になったのですが、
Rubyわかんないので、とりあえずテーブル眺めることに。 

まず見たのが『users』テーブル。
作成日付とかって『created_on』って名付けるんだへー(´・∀・`)
と感心していると最後のカラムに気になる名前が

『salt』

 むむ( ・`д・´)
ユーザのテーブルにあるし、
 やはりパスワードを暗号化するときに付加するアレかと。 

つぎにプロジェクト管理ってこともあって、
『projects』テーブルを。

『is_public』ってカラムがありました。
あー僕なら『public_flg』とかってやっちゃうよなーなんて思ってると、
またまた気になるカラムがっ( ・`ω・´)!!!

『lft』と『fgt』 

さすがにこれだけでは断定できませんが、
型がint(11)だってことと、
プロジェクトが親子関係を持ちうるってことを考えると、
やはり、入れ子集合モデルのヤツだなと。
saltと入れ子集合モデルヽ(´ー`)?
saltとは、パスワードとかを暗号化するとき一緒に暗号化することで、
解読されにくくする方法。

入れ子集合モデルとは、
部材表とかみたく再帰的に自分をみていく構造のテーブルを、
もっと早くアクセスするために考案された方法で、
 lftとrgtの間にlftとrgtが収まっている部品は自分を構成する部品だとするやり方です。
ちゃんと説明できてないので、細かいことは次回にゆずるとして...
少人数では、
たしかに職場の環境ではイラネって感じのカラムですが、
大きなプロジェクトで使うとかになると、
セキュリティーやパフォーマンスを確保するために必要になります。
で、それがどうした?
これだけ眺めるのに10分もかかりませんでした。

でも、たとえば自分が学校出たてのエンジニア1年目で、
ふとしたことで、今回と同じようなことをして、
この技術を学んでいたと想定して、 

webサービス作るときに、パスワードにsaltとか付加してセキュリティを高めようとか、
そもそもパスワードの平文保存はダメとか、
部材表作成するときに、検索の時間がかかるようなら入れ子集合モデル使おうとか、 
そのまえに再帰的な部材表の作り方はやっかいだとか、

そういうことが提案できるってことなんですよね。
知っていたから、とかじゃなく
( ̄д ̄)「前もって知ってた技術だから、簡単に名前から辿りつけたのでは??」 

たしかに簡単に辿りつけたのはそうかもしれませんが、
時間かければ、行き着くことは可能だと思うんです。

今回のsaltやlft、rgtにしても、不可解な単語で、
この技術に至らなければ、なんとも納得できない存在なのですから。
やらなくても、出会うことくらいは...
いくつかオープンソースは読んだことありますし、
書籍買ったり、ブログ読んだりもしてますが、
知らない言語だから、使わないOSだからって距離をとらずに、
今回みたいに気になったら、
わかるとこだけでもちょっと出会ってみる、
ってことをすれば、多く学べるんだなと思いました( ー`дー´)キリッ 

ってことで、人生で初めて、Mac Book Pro買いましたっ( ー`дー´)キリッ

2012年1月16日月曜日

JavaScriptの連想配列でlengthを取得っ?!

JavaScriptでの連想配列と配列
あるブログに連想配列でlengthとれねーよ( `д´) ケッ!ってありました。
今回はJavaScriptでの連想配列と配列についてちょっと。

JavaScriptで連想配列を作成しようとすると、次のようになります。
var ary1 = {}
ary1['smile'] = ':-)'
一方配列はというと、
var ary2 = [];
ary2[0] = ':-)';
そっくりですねー(°Д°)。
でも上の例は一番混乱しやすい書き方をしています。 

ちょっとだけなのに、大きい違い。
ここの大きな違いって、 最初のカッコっこのところなんですね。
 {}と[] 
じつはこのカッコの違いで、生成してるものが違ってくるんです。

上の例をわかりやすく書きなおすと、 次のようになります。
var ary1 = new Object();
ary1['smile'] = ':-)'


var ary2 = new Array();
ary2[0] = ':-)';
つまり、どちらもオブジェクトを生成していて、
その生成しているオブジェクトが違っていたということなんです。
ArrayとObjectはどう違うか。
Arrayオブジェクトは配列用のオブジェクトで、 配列用のlengthも備えています。
一方、Objectはただ連想配列っぽく使える、
空のオブジェクト(prototypeをのぞいて)です。 もっとわかりやすく書けば、
var ary1 = new Object();
ary1.smile = ':-)'
console.log(ary1['smile']);
という感じになりますね。
連想配列は、オブジェクトを生成して、
そのプロパティに値を設定していただけなんです。
つまり連想配列でlengthがとれないのは...
配列は配列用のオブジェクトとしてつくられているので、
lengthがとれて、 連想配列はそれっぽく使えるオブジェクトを、
 連想配列っぽく使ってるだけなので、lengthはとれないってことがわかると思います。
おまけ。consoleの紹介





こんな風に書いてみて、 Google Chromeで開いて、真っ白な画面上で右クリック、 『要素の検証』を選択するとウィンドウが開きます。 そこの『console』タブを開いてみると、 console.dirに設定したオブジェクトをツリー上に展開してみれますので、試してみて下さい。

2012年1月10日火曜日

IEが嫌いな理由〜DOM level2の独自仕様...orz〜

おぅふ、IEで動かない
そういうことが何度あっただろうか。
そんな経験を積み重ねいつしかIE嫌いになってました。
DOM level2の仕様で
IEがなぜか独自仕様を展開し、
XMLやHTMLを操作するためのAPIのDOMのlevel2で、
他のブラウザと違っていることがそもそもの原因。
たとえば、
addEventListnerではなく、IEではattachEvent
こんなメジャーなとこですら違ってる。
対処方法として
javascriptファイルの先頭に、
↓↓こんな感じのをしこんで、おくっていうのはどうでしょうか。

var setFloat = ( "styleFloat" in document.getElementsByTagName("body")[0].style ?
               function(element, value) {
                   element.style.styleFloat = value;
               } :
               function(element, value) {
                   element.style.cssFloat = value;
               });
var addEvent = (window.addEventListener ?
               function(element, type, func) {
                   element.addEventListener(type, func, false);
               } :
               function(element, type, func) {
                   element.attachEvent('on' + type, func);
               });
addEvent(window, "load",initializeSelect )
イベントの追加と、cssのfloatの設定について。

2012年1月1日日曜日

あけましておめでとう!〜心機一転、fedoraを新しく〜

心機一転、OSを新しく
年も明けたということで、以前からアップグレードを怠けていたfedoraを新しくしました。
ご存知のとおり半年に一回くらいのペースでバージョンが上がっていくLinuxです。

USBからインストール
fedoraは簡単にUSBからインストールできるので、
以前と同様にUSBからインストールしました。
やり方は簡単!
(1)LiveUSB Creatorを使って、USBから起動できるfedoraを作成
(2)USBからfedoraを起動
(3)fedoraをインストールするアイコンがあるので、それを押下
(4)手順に従って、fedoraをインストール。

LiveUSB Creatorを使って、USBから起動できるfedoraを作成
とりあえず、LiveUSB Creatorをどっかのパソにインストールします。

そのあと、fedoraのisoをダウンロードします。
isoは「http://fedoraproject.org/」からダウンロード。

LiveUSB Creatorを起動して、「USE Existing Live CD」にダウンロードしたisoを指定します。
あとは、「CREATE Live USB」ボタンを押せばOK。

※isoをダウンロードしなくても、LiveUSB Creatorで、
作成するOSを指定するだけで作成できる機能があるっぽいので、最初それでやっていたのですが、
やたらと時間がかかった(1時間かかって10%完了)ので、途中でisoをダウンロードする方法に切り替えました。

USBからfedoraを起動
あとは簡単。
USBを差して、パソを起動するだけ。

※注意するのはUSBから起動できるようにBIOSで設定しなければならないこと。
またUSBから起動できないパソもあるので注意です。
そのへんはBIOS画面でちょっといじくって設定しました。

fedoraをインストールするアイコンがあるので、それを押下
USBからfedoraが起動できると、
パソにfedoraをインストールしてない状態でも、ふつうにfedoraがつかえます。

さて、パソにインストールするためには、
fedora16の場合、
まず左上の『Activities』を押下します。

でっかいアイコンが左端にいくつかならんできるので、
その一番下のHDDにチェックが入ったようなアイコンを押下します。

それで、fedora16のインストール画面が開きます。

手順に従って、fedoraをインストール。
あとはふつうに手順にしたがって、fedoraをインストールしていけばいいだけです。

思うこと
お手軽にできるので、USBからfedoraを起動して、
そこからfedoraをインストールしました。

じつはUSBからfedoraを起動した時点で、
パソに入ってるファイルとか見れるんですよね。
やはりちゃんとセキュリティ考えるならHDDにパスワード設定とか必要と実感。

たとえばこのUSBを他人のパソにつないで、電源いれて、
BIOSでUSB起動をできるように設定したら、
USBから起動したOSで、パソの中のファイル見れます。

いくらインストールしてるwindowsとかにパスワード設定してても、
そのwindowsが起動する前なので無効ですしね。