スイーツ(笑)と呼ばないで!!
| |||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||
11/24/16:50 [PR] |
08/07/13:30 linuxでルータを作る?今や一家に1台ルータがあるのが当たり前の時代になってきましたね。
光回線なんか契約すれば普通にセットでレンタルできたり。 でも・・世の中にはそんなルータを買うお金がなく、 とてもとても苦労した経験のある人もいるんです・・・・・ はい、若かりし頃の私です^^ 当時私の家には、オンボロのパソコンがたくさんあふれていました。 ただ、ルーターは高い・・・あんなちっぽけな筐体で、 そんなにすごい機能を持っているわけでもないのに、 どーしてあんなに高いの? そう思ってました。 ただ、当時、ネットワークについても知識を広げたいなと考えていた私は、どうしてもルーターが欲しかったんです。 そこで私は考えました。 中古のPCたち、 中古のハブ、 中古のLANケーブル これらを使って、なんとかならないか、と。 まず、秋葉原の裏道にいって、200円くらいの中古のLANボード(NIC)を買ってきました。 さすがに、2つLANボードがついているようなPCはなかったので。 PCの筐体を開け、買ってきたLANボードを取り付けました。 片方をルータのWANポート、もう片方をルータのLANポートに見立てました。 うん、それっぽい。 (今でこそ、一つのNICに複数のIPを割り振る仮想IPについての知識がありますが、当時はその前段階でした) そしてそのPCにLinuxをインストールしました。 買ってきたNICが認識しない、なんてトラブルに遭遇しつつも、なんとか解決していきました。 認識したらこちらのものです。 昔からソフトウェア、すなわち、キーボード叩いてなんとかなる世界は得意でした。 Linuxでルータを構築するには、FWとしてお馴染みのiptablesを使って簡単にできます。 192.168.11.0のネットワークと192.168.21.0ネットワークを作って間にこのマシンを入れて NATの仕組みを作ってみたりり、さらにルーターマシンを構築してDMZつくてみたり。 ポートフォワードして内部に特殊なポートでListenするWebサーバー立てたり。 毎日いろんな組み合わせを作っては遊んでいました。 また、ルータとしてではなく、普通のクライアントとしてもNIC二枚刺しのマシンを構築し、 yahooへのアクセスは、こちらのルータとネットワークを通って、 msnのアクセスは、別のルータとネットワークを通って、 とか割り振ってみたりしました。 当然、このプロトコルは通すとか、はじくとか、変換するとか、そういったフィルタリングの知識もついてきました。 楽しかったですね^^ そんな感じで自宅の至る所にボロマシンがあふれていた・・・ そんな時代がありました。 最近、仮想環境がすごく進歩したりマシンのスペックも向上して、ほとんどのことが1台のマシンで済むことが多くなりました。 今はほとんど愛用のmacしか使いません。(仮想でwindowsやlinuxは入っているけど) 時代の流れに流され、使われなくなったそのボロマシンたちは今や実家の倉庫で眠っております。 一時期置き場が足らなくて、トイレにlinuxサーバーの1つを置いて稼働させていたこともありました。 皆懐かしい、古き良き時代ですね。 さて、そんなこんなで身につけた知識は、今では時々部下からの質問に回答するときに役立ったりします。 VPNの話やVirtualBoxなどの仮想環境での話、などいろんなところで応用がききます。 今は、物理的にPCやLANボードを用意しないでも、VirtualBoxなどの仮想環境で、 何台でも作れますし、NICもどんどん増やせますね。 お金持ちじゃないと高度な技術に触れられない時代は終わりつつあります。 (もちろん、ソフトバンクのPepper君とかIBMのWatsonとか、興味があってもやっぱり触れられないものもあるけど) ということで、 ネットワークの知識を深めたいなら、Linuxでルータ作って遊んでみてはいかが? という昔流行っていた(?)楽しい遊びのご紹介でしたー ではでは。 PR
|
07/30/02:06 何故この業界に身をおいているか・・最近、技術的な話題ばかりだが、
今日は、少し毛色の違う話題を書いてみようと思う。 皆さん、 「なぜ、その仕事を選んだのですか?」 と聞かれたら、いろんな答えが返ってくると思う。 私の場合は、正直なところ、すごく自己中な理由だったりする。 私は、学生時代、人工知能に興味をもっていた。 人工知能なんて、真面目に言っていたら、 少しイタイ人に見られた、そんな時代だ。 人工知能のブームというのは過去何回も到来していて、 その度に、当時の技術から考えうる限界を人は想像し、 とても叶わぬ夢であると結論づけ、諦められてきたものである。 最近、チューリングの話が映画化されたので、 もしかすると、その映画を見て、チューリングのことを知った人もいるかもしれない。 チューリングを「人工知能の父」なんて呼ぶ人もいる。 とにもかくにも、人工知能などという途方も無い人類の夢は、 出てきては消え、そして、また、出てきては消え、というのを繰り返していた。 私がその中でも興味をもったのは「エキスパートシステム」というものである。 こちらも世の中一般的には既に頓挫した夢だったりする。 簡単にいうと、世の中で専門家と言われる人の知能をコンピュータで代替しようという試みである。 それは、法律の専門家であったり、機械の設計の専門家であったりする。 人は必ずしも、言葉や法則で説明できるルールに従い判断を下すわけでもなく、 多少の曖昧さをもつファジーな数学の理論を用いて頑張ってロジックを組みてても、 なかなかうまくいくものでもなかった。 そして、当時から知識をデータベースに蓄積することに対する限界も語られていた。 そんな中インターネットに期待を寄せるもの人間たちもいた。 そんな人の口から時々発せられる単語に「 セマンティックWeb」というものがあった。 誤解を恐れずに言えば、「意味付けされたWeb」である。 Webに載せられたデータを、単に構造化されたものとしてではなく、意味のあるものとして捉える試みだ。 それにより、データベースを構築することの限界を超えられるかもしれないと、我々は期待した。 インターネット上に増え続ける情報を、知識ベースとして利用することにより、 データのインプットの限界というものを超えられるのではないかと期待したのである。 MicrodataやRDFaなど少しずつだが、HTMLにメタデータを埋め込む手法も知られるようになってきた。 しかし、このWebの世界が我々人間だけでなく、コンピュータにとっても理解しやすい世界になるのには、 まだまだ時間がかかりそうなのが現状である。 インターネットの進歩はとても速いという研究者もいるけど、 個人的には、もっともっと加速してほしいと願っている。 最近、ターミネーターの最新作を見た。 相変わらず、ロボットあるいは人工知能と人間が戦いを繰り広げている。 おそらく、残念なことに、そのような未来はまだすぐには来ない。 そして、だいぶ昔から、「コンピュータが人間の仕事を奪うのではないか」という議論もかなり行われてきた。 現実に、コンピュータの登場により、不要になった仕事もたくさんある。 しかしながら、どうしても、人間でなくてはならない仕事や、 あるいは、人間であることに価値がある仕事もたくさん再認識されるようになってきた。 確かに、機械によって、一時的に簡単な仕事が奪われることもあるかもしれない。 でも、何もおそれることはない。 人間の知能や感情はもっと複雑で、簡単に真似できないものである。 機械にできることなんて、とっとと機械にやってもらえば良い。 我々は、人間にしかできない「考える事」に集中すれば良い。 考えること、と、計算して答えを導きだすことは、大きくことなる。 エンジニアは、とかく「どう実現するか」という手法や技術に注目しがちである。 ただ、時には、そこから離れて、「何をしたいか」「なぜそれをしたいのか」に思いをはせる時間があっても悪くないと思う。 今日は、特に、何の意味もない、なぜ私がこの世界に身をおいているのか、というお話でした。 お付き合いありがとうございました。 |
07/27/14:16 コマンドラインからSSLの証明書を確認するには?WebサーバーにSSL証明書を設置する、なんてタスクがたまに湧いて出ることがありますよね。 自分でCSRの作成とかしていれば、詳細を把握していますが、 手元にあるのはなんと証明書のファイル一つ。 ちゃんと証明書を設置すれば、 当然ブラウザから内容が確認できるわけですが、 まずは証明書の中身が気になる。 そんな時は、 #less 証明書のファイルのパス とかやれば、中身は見れますが、見事にエンコードされていて、これを読み解くのはできませんね。 さぁ、こんなときはどうしましょうか。 実は、CSR作るときとかに使ったopensslコマンドがここでも役に立ちます。 #openssl x509 -text -noout -in 証明書のファイルのパス とかやれば、証明書のファイルの中身がわかりますね。 Common Nameがなんであるとか、 Signature Algorithmがなんであるとか いろんな情報が記載されています。 ちなみに、x509のところをreqにかえればCSRの中身も確認できたりします。 また、今度は設置後の話ですが、SSL証明書設置後のWebサーバーに対してコマンドラインから確認する方法もあります。 この場合、ブラウザベースで確認するよりもより詳細なデータを得ることができますね。 #openssl s_client -connect ホスト名:ポート -showcerts とやると結果が返ってきます。 例えば、証明書の期限が切れていれば certificate has expired なんてメッセージがverify errorとして表示されますね。 まずは、ブラウザで確認し、その後こういったコマンドを使ってよりきちんと確認していくのが良いでしょう。 errorが表示されたらきちんと解決してくださいねー たまに、インフラまわりの話も良いなと思う今日この頃。 ではでは、皆さん、またお会いしましょう^^ |
07/26/00:15 プログラム言語の異文化交流・・先日、ちょっと頼まれて、html5のvideoタグを使って、mp4を再生しているソースを見ました。
html5を使うとAPIを使ってJavaScriptでいろいろと操作する機会も増えますよねー 今日はそんなJavaScriptについてのお話です。 テーマは「プログラム言語の異文化交流・・」と題して、 PHPバリバリ書いてるPGがJavaScriptを書くとうっかりやってしまうこと、 について書きたいと思います。 この世の中にはたくさんのプログラミング言語があり、 細かい違いはもちろんありますが、 条件分岐があったりループ処理があったりと、 すごーーーくざっくり言うと、似たようなもの、だったりしますね。 なので、PHPで一人前にプログラムを書けたりすると、 「ああ、JavaScriptではこう書くのね、了解ー」 という軽い感じでガリガリ書いてしまうというのもよく聞く話です。 でも、やっぱり言語にはそれぞれ固有の独自の仕様があったりするわけで、 そこを知らないと、それが理由でバグの温床になったりすることがあります。 JavaScriptの仕様で、意外と知られていないのがhoistingというやつです。 日本語だと「変数の巻き上げ」とか言ったりしますね。 以下、シンプルな例を用いて説明してみます。 var name=“yamada"; //グローバル変数nameを宣言し代入。 function printName(){ console.log(name); //変数nameの中身をコンソールに出力。 } printName(); //上で定義した関数printNameを実行。 このソースの実行結果は、yamadaと出力されます。 これはたぶんPHPプログラマの人もとても直感的に理解できると思います。 では、console.log(name);の下に1行だけ追加した以下のソースはどうなるでしょうか。 var name=“yamada"; //グローバル変数nameを宣言し代入。 function printName(){ console.log(name); //変数nameの中身をコンソールに出力。 var name=“tanaka”; //ローカル変数nameを宣言し代入。 } printName(); //上で定義した関数printNameを実行。 普段PHP書いていて、JavaScriptも同じような感覚で書いているPGの方だと、もしかすると 「え? そのままグローバル変数のname読むから、結果はyamadaで変わらないでしょ?そもそも1行追加したの出力の下の行だし・・」 という回答をするかもしれません。 でも、JavaScriptでは、その期待は裏切られることになります。 実は、上記のJavaScriptは内部的にはhoisting(=変数の巻き上げ)により、 var name=“yamada"; //グローバル変数nameを宣言し代入。 function printName(){ var name; console.log(name); //変数nameの中身をコンソールに出力。 name=“tanaka”; //ローカル変数nameを宣言し代入。 } printName(); //上で定義した関数printNameを実行。 と同じように解釈されます。 つまり、初期値の代入部分はそのままで、変数の宣言だけそのスコープ(この場合function)の先頭に巻き上がるんですねー 結果、上記ソースの出力は、初期化されていない変数の出力ということで「undefined」となります。 さて、JavaScriptにはこのようなhoisting(変数の巻き上げ)という仕様があるため、 そのスコープの途中で変数を宣言するのはバッド・プラクティスで、 そのスコープの最初でまとめて宣言するのがベスト・プラクティスと言われます。 つまり、functionの中であれば、functionの中のスコープで用いる変数はすべてそのスコープの頭で宣言すべきということですね。 言語によっては、変数の宣言はなるべく使うところの近くで行いましょう、という文化があるものもあります。 ただ、JavaScriptの場合は、そうではない、ということですね。 たまたま見たソースがスコープの途中で変数がたくさん宣言されていて、 「ああ、わかるわかる・・多くの人が通る道だな」 と思い、記事にしてみることにしました。 たくさんの言語があって、たくさんの文化があって、 なかなか深いところまで理解するのは大変です。 私も頑張らないとなーと思う今日このごろです^^;;;; |
07/24/13:00 MySQLのStrict Modeについていろんな事情があって、CentOS7以降だと、 MySQLではなくMariaDBがデファクト・スタンダートになったわけですが、 未だCentOS6系のサーバーでMySQLを動かしている人も多いでしょう。 今日はそんなMySQLのお話。 私は一時期DB系の研究を業務にしていた時期なんかもあったんですが、 そんな私から見るとMySQLは超怖いDBでした。 何が怖いって、varchar(50)とか定義したところに、60文字をPHPで投げつけても、 エラーも出さず知らん顔で50文字だけ格納して成功ステータス返す、そんな奴だったんです。 ちゃんと格納されたと思ったら、数日後に・・「あれ?文字が途中で切れてるぞ?」とかなるわけです。 もちろん、MySQLに渡す前にPHPでvalidationをきちんと書いてあれば、ちゃんとエラー制御できるんですけどね。 ただ、コンバートとかで直操作する必要があったり、validationの実装ミスに気づけなかったり、というのはかなり怖いですね。 まるで、コンパイル言語がコンパイル時にバグに気づけるのに、 非コンパイル言語では実行時エラーしかとれない、とかそんなのに近いです。 皆さん、仮に次のような二人の部下を持った自分を想像してください。 問題が発生した時に、 部下A:「うぉぉぉぉぉぉ!!!!!!・・・・・やっちまったぜ・・orz」と大騒ぎする部下 と 部下B: 「できました^^」と笑顔で報告して問題については何も言わずそのまま放置する部下 どっちが良いですか? 私は間違いなく前者の大騒ぎする部下ですね^^ で、そんなMySQLなんですが、実はちょっと前からsql_modeというのがあって、 そこでStrict Mode(正確にはSTRICT_TRANS_TABLES)を選択すれば、 ちゃんと「普通に」仕事してくれるようになります。 ただ、今までint型に空文字を投げていたプログラムなんかは、エラーになります。 まぁ、intに空文字投げちゃそもそもダメでしょ、と思うわけですが、 人によっては「君、わかってるねー、気が利くねー」と思ってたようで、 そんな人には不評なようです。 そんな中、時代は流れまして、MySQL5.6では、このStrict Modeがデフォルトになりました。 さぁ、大変です。 今まで、intに空文字なげていたようなプログラムは全部エラーで落ちまくることになりました。 焦って騒いだ世の中の人たちが取った行動は・・・ 「Strict Mode・・・オフればいいんじゃね? そうすれば、また、世界は平和に・・」 です。 皆・・・目に見えない問題は「=存在しない」と思うんですね。 そうして Strict Mode・・・オフ (←いまここ) というプロジェクトが世の中にたくさん出来上がったんです。 いや、intに空文字投げちゃうPGの発想、理解できないわけじゃないですよ。 テキストボックスで金額入れてもらうところとか、 普通にpostされたデータ見ると、nullじゃなくて、空文字ですもんね。 HTTPのプロトコルは、 最終的に文字列型で格納されるのか数値型なのかなんてpostする時点では知る手段はないので、 PHP側で適切に判断してあげるしかないですね。 HTML5が普及して、input type=“date”とか新しいtype属性が増えて、 今まで、selectボックスで年月日を指定させていたところ(必ず数値で受け取ってた)が、 見かけ上はテキストボックスみたいなUIになるので、 結果的に空文字が投げられることも発生するようになった、 なんて変化もあります。 date型に空文字、なんて事故も起こるようになりますね。 MySQLがシャキッとしてやっと普通のDBになってきたんです。 我々もちゃんと使ってあげましょうー ちなみに、余談ですが・・・ LinuxのセキュリティでSELinuxというのがあります。 より強固なセキュリティになる機能で、もう何年も前にデフォルトでオンになりました。 これ、結構安心できる機能なんです。 でも、ちょっとだけ設定や理解が複雑。 で、世の中の多くの人は 「えっとー、linuxセットアップするなら、最初にー、selinuxはオフにするのー」 と覚えて実行しています^^ SELinuxの話はまたどこかで記事にするかもしれません。 とりあえず、できるところから地道に取り組んでいくしかないですねー ローマは一日にしてならず!! ここ数日、毎日ブログ書いていて暇人だと思われている気がするので、今日はこんなところで^^ |