僕は木になりたい。。。

子供のとき本気でそう思ってました。 理由は樹齢が長いから

技術系ネタ

誰かのエントリーが本質であるという「妄信」と、それは間違いであるという「妄信」1

中途半端に優秀なプログラマが「正しいプログラミングテクニック」だと妄信しがちな3つポイント - 分裂勘違い君劇場 ちょっと囓っただけの素人が自分を過信して陥る三つの罠? - カレーなる辛口Javaな転職日記

えっと、後者の人はオブジェクト指向な人。というか、いかにもJavaな人って感じで面白い。

例えば、割と大型の受託開発をやるような会社の新人には、 とても良い指導になるでしょう。

一方前者の方の言う事も、十分理解できる。
私の意見も、ここに書いてみます。

「変数のスコープは狭いほど良い」と妄信する

変数のスコープは狭い方が良いです。
ただし、狭ければ狭い方が良い訳ではないです。
狭い事が不適切な場合もあります。 でも、Javaの場合は、狭くできるだけ、狭くすれば、 ほとんどの場合良いでしょう。
名前空間がしっかりしているJavaでは、
スコープをぐっと広くしてしまった方が(場合によってはグローバル変数やグローバル関数にしてしまった方が)、
のような事は、やりにくくなっている。
JavaScriptのグローバル領域に変数を切るような事は、 Javaではやらない。
でもそうではない言語もあるという事も知った方が良いです。
むしろ積極的にクラスをオープンにしているRubyのような言語もあります。(+演算子はすごくグローバルだけど、その意味とかもオーバーロードできる。)

「同じロジックのコードを2度以上書くな」と妄信する

これは、書かないに越した事はないとは思います。
だけど、重要なのは「妄信」しない事です。
なぜ2度書いちゃいけないのか。これが重要です。
コンテキストが重要で、どのコンテキストにおいて冗長が悪なの?
って話になります。
極論ですが、AサービスとBサービスと別のサービスがあって、
同じようなロジックは、別のWEBサービスやRPCて呼び出しますか?
という話です。
じゃあ、サブシステムどうしは? じゃあ名前空間どうしは? という話です。
で、これはその規模やその処理の役割に大きく依存しますよね。
「なぜ2度書いちゃいけないのか?」
常に、それぞれの状況に適切な答えを探しましょう。

「プログラミング言語を極めるのが大切」と妄信する

これは、プログラマーならば、極めましょう。
実際には、サーバ設定、ネットワーク、データベース、パフォーマンス設計、セキュリティ設計に関するスキルは、プログラミング言語の知識に負けず劣らず重要だ。
その通りです。
しかし、プログラミング言語を極めると、
サーバ設定、ネットワーク、データベース、
パフォーマンス設計、セキュリティ設計に関するスキルが
身に付かない訳はありません。 自分が何屋さんなのかを見極めていればOKです。
つまり、サーバ設定、ネットワーク、データベース、
パフォーマンス設計、セキュリティ設計が必要な人は、 当然それらの技術を極めようと努力しますよね。

ここまで書いて、重要な事がわかった!!
いろいろ書いてきたけど、
何を書いたとしても、
「妄信」とつけてしまえば、
「妄信」自体がネガティブな事だから、
書いた内容は正しい事になる。

「自分が正しい」という(妄信)
も「自分が間違っている」という(妄信)
もダメな訳です。

妄信はよくない。 何でもそうだよね。というオチ?

JavaScriptの文字列と数値の比較3

以下のようなjavascriptの結果が、trueになった
ちょっと調べてみた。
alert("" == 0)); // 結果はtrue
最初は、""と0がそれぞれ論理値に変換され、 false == false でtrueになっていると思った。
【2009/10/20 追記】 上記の推測で正しい。 なので以下の記事はウソというか、間違った方向に向かってしまった。。。 数値に変換する関数 parseIntを使った場合
alert(parseInt("", 10) == 0 ); // 結果はfalse
これは、parseInt("", 10 )が NaNになるので、falseになってしまう。
Numberコンストラクタを使用すると、
alert(Number("") == 0 ); // 結果はtrue
確かに、alert(Number("")); は0を返す。
これで、意味が合う。
文字列が、数値との比較で使われる場合は 本当に、Numberが使われるのだろうか。。。
あ、あと開発する人達は、JavaScriptでも型を意識しようね!!。

C言語 fork() 関数

僕がこの業界で仕事をするようになってから、 C言語に触れる機会はすごく少なく、実際に 大学の授業以来、コーディングすらした事がない。

大学でもまともに勉強していないので、C言語は出来ないといっていい。

やっぱりC言語知らないと損をする。
自分の関心が変わってきているせいなのか 世の中の面白そうな事についていけない事が多い。

という事は人生の中での楽しい(楽しいだろう)事を みすみす逃している事になるではないか!!

という事で少しずつですが、C言語も勉強していきます。

という事で、まずはfork()関数

なぜfork()かというと、Rubyのserver.rbを見たら fork という関数があり、
それはどうやら forkというシステムコールを使っているらしい。
プロセスを作るんだよねぇ。という事はなんとなく分かってたんだけど、
もっと詳しく調べてみる。
続きを読む

USBメモリによる情報窃取を防止されてた

USBが使えないんだけど。。
と相談されました。
@IT:Windows TIPS -- Tips:USBメモリによる情報窃取を防止する(USBメモリを読み出し専用にする)
このUSBメモリ、簡単で便利なのだが、機密情報を扱っている企業などでは、情報窃取の道具として悪用される心配もある。このような場合には、レジストリの設定を変更することで、USBメモリを読み出し専用デバイスに制限することができる。
これを知らなかったので、苦労しました。
意図せず書き込み不可になってしまうような
ソフトがあるんでしょうか?

RubyGemsのディレクトリ

備忘録です。
RubyGemsのディレクトリを知るには、
gem environment gemdir

MySQLで知っておくと良いかもしれない事5

初めてのRuby
この本を買いました。
どうも評判が良いようで、おもわず買ってしまいました。
まだ、読んでないのですが。。。

著者のYuguiさんのブログを読んでいたら、以下のようなエントリーがあり、結構びっくりして、調べた結果をエントリーします。
知っている人にとっては当たり前なのかもしれませんが。。

Active Recordが不適当なキャッシュを返す(?)問題 @ 2006年05月 @ ratio - rational - irrational @ IDM
ActiveRecordが誤ってキャッシュか何かを返している感じ。これで数時間嵌まった。
新規レコードをsave後、find_by_id(nil)すると、初回の呼び出しに限りsaveしたオブジェクトがマッチする。
MySQLが不適当なレコードを返す問題。 @ 2006年06月 @ ratio - rational - irrational @ IDM
Active Recordから変なレコードが返ってくるのは、Active Recordの問題かと思ったらMySQLの問題だった。Active Recordよ、疑って済まなかった。
とういう事で、自分でもmysqlで上記のようなSQLを実行してみた。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 878 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
+----+------+------------+------------+------------+
| id | name | tagkind_id | created_at | updated_at |
+----+------+------------+------------+------------+
| 21 | test |       NULL | NULL       | NULL       |
+----+------+------------+------------+------------+
1 row in set (0.00 sec)

やはり、同じ結果になります。
で、MySQLのマニュアルを調べてみると、 この動作は仕様みたい。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.1.3 比較関数と演算子
ODBC プログラムとうまく適合させるため、IS NULL を使用する場合、MySQL は次の追加機能をサポートします :
  • 一番最近の AUTO_INCREMENT 値を含む行を、その値を生成した直後に、次のフォームのステートメントを発行することによって検索することができます :
          SELECT * FROM tbl_name WHERE auto_col IS NULL
    
  • この動作は、SQL_AUTO_IS_NULL=0 を設定すると無効になります。項12.5.3. 「SET 構文」 を参照してください。
なるほどね。
set SQT_ATUO_IS_NULL=0 を発行すれば、OKなようなので、もう一度試してみました。
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 879 to server version: 5.0.27

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> set SQL_AUTO_IS_NULL=0;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO tags( name ) VALUES( 'test' );
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE id IS NULL LIMIT 1;
Empty set (0.00 sec)

おお。
でもこれって、デフォルトで0で良いんじゃないか??
と思いつつ、じゃあ、ActiveRecordはって事で調べてみると、
File: CHANGELOG
# MySQL: SET SQL_AUTO_IS_NULL=0 so ‘where id is null’ doesn‘t select the last inserted id. 6778 [Jonathan Viney, timc]
って事で、とっくに対応されてるって事ですね。
安心安心。

Wordを徹底理解したい

MS Word むずい - odz buffer
なんというか根本から設計というか思想というかそういうのを理解できてない気がする。
これは凄く同意!!!
昔読んだ本でまぁまぁ良かったのが、以下。

稼げるSEになるための 仕様書 ・提案書作成入門[Word活用編]

実践的な内容ではあるけど、 根本的な理解に繋がるかといえば、まだまだ不満。

id:odzさんと同じ言葉で締めたいと思います。
なんか良い本ないかなぁ。

C#3.0のLINQ 言語に組み入れるあたりは流石4

Visual Studio 2008 C#で開発効率アップ!:第1回 コード比較で理解するC#3.0の新機能(1)|gihyo.jp … 技術評論社
クエリー式の正体

クエリー式の正体は,シンタックスシュガーです。従って,クエリー式を使わずに記述することもできます。

以下の2つのコードを見比べてみてください。

var q = 
    from x in this.Collection
    where x.Age < 20
    orderby x.Name
    select new { Code = x.Code, Name = x.Name };
var q = 
    this.Collection
        .Where(x => x.Age < 20)
        .OrderBy(x => x.Name)
        .Select(x => new { Code = x.Code, Name = x.Name });

長いので改行されていますが,単にデリゲートを引数としたメソッドを書き連ねているだけです。各メソッドの引数では,ラムダ式が使われていることがわかります。

これに以前エントリーした以下の記事に関係している。
僕は木になりたい。。。 : 流れるようなインターフェース - livedoor Blog(ブログ)
流れるインタフェーススタイルはその中のメソッドにフューチャーしていて、 「1つの事を上手に行う為に、次の仕事の案内を戻り値のインタフェースによって伝えながら、対話的に行う。」 という事になる。さらに、案内は選択肢が多くても意味がない。
やってみればわかると思うけど、かなり設計が難しい。失敗すると間違いなくカオスになるから、むやみにやらない事も大事だと思った。 仮に、近い将来このスタイルが流行ったとしても、開発プロジェクトとしてはあまり幸せじゃない結果をもたらす気がするなぁ。
上記エントリーを書いた時点で既に、C#3.0はあったわけだけど、 全然知らなかった。
これ、何に驚いているかというと、言語に組み込んでしまうという所。
盲点だった。
開発効率を最優先している.NETらしいし、 実装が複雑になってしまうデメリットを、始めから言語に組み込むことで 一気にメリットにしてしまった。
シンタックスシュガーを作ってDSL風(というか完全なDSLだよね)にしてしまった当たりはもう脱帽。
考えてみれば、getter setterをプロパティという言語仕様に押し込んだのも.NETだったし、この手のやり口には驚くばかり
いつもワクワクさせてくれます。

正規化とか、小クラス主義とか3

ronSpace: データベース正規化・非正規化
データベースの 正規化 vs 非正規化 というのは、オブジェクト指向でいう、小クラス主義 vs 大クラス主義 に通じるものがあるんじゃないですかね。
L'eclat des jours(2008-04-07)
大クラス主義とか、非正規DBでも、そのほうが良いと考えてユースケースや後先まで想定した結果そうしたのと、分割するという発想がないため結果的にそうなるのでは、生成物は同じでもずいぶん異なる。
これ、違うよ。
大クラス主義は、最初から積極的に分割しないんだから。
それ以外の大クラス主義なんて、ないんじゃない?。

だから、データベースの正規化・非正規化と、 プログラミングの小クラス・大クラス主義とを 並べて語るのはどうかと思う。

しかも、

正規化 <=> 小クラス

非正規化 <=> 大クラス

をペアにして語るのはどうかと。

非正規化というのは、正規化というRDBの一応あるべき姿があり、RDB以外の世界の都合により非正規化されるもの。

でしょ。

大クラス主義とか、小クラス主義というのは、 どちらが良いという話は置いておいて、 どちらも、言語設計などの内側だけの議論

だよね。
外の世界は関係ない。

もう少し言うと、非正規化それ自体が正しいと主張する人は殆どいなくて、
ある状況に於いて、非正規化が適切な場合がある。というだけ。

あ、でもこれって元記事の趣旨と違うところに ツッコミ入れてるね。

言いたかったのは、
正規化と非正規化の関係に存在する。

正規化は正し(美し)くて、非正規化は正しくない(美しくない)
でも非正規化も、時にはしょうがないよね。

という関係と、

小クラス主義と大クラス主義の関係

は違うよね。
って事でした。
あいかわらず、文章が下手で、我ながら伝わりにくい。。。

ブログやブックマークの同期3

ブログやブックマークって 一回使い始めると変えにくい。

自分のこのライブドアのブログを使っているけど、 はてなを使ってみたくなったりする。

そこで、こんなの作りました。 まだ拡張しなきゃならんですが、 そのうち公開します。 使い方はこんな感じ
require 'epost'

# ライブドアブログから、
#  ・ライブドアクリップへ
livedoorBlog = EPOST::Livedoor::Blog.new(user_id, password)
livedoorClip = EPOST::Livedoor::Clip.new(user_id, api_key)

livedoorBlog.feed{ | url, title, summary |
 livedoorClip.post( {:url=>url, :description=>title, :tags => "emosei", :rate => "5"} )
}

# ライブドアクリップから、
#  ・はてなブックマークへ

hatenaBookmark = EPOST::Hatena::BookMark.new(user_id, password)
deliciousBookmark = EPOST::Delicious::BookMark.new(user_id, password)
livedoorClip.recent{ | url, description, extended, tags | 
  hatenaBookmark.post( {:url=>url, :summary=>description} )
}

サービス化しようと思ったけど、 パスワードとか管理できないのでやめました。

どっかのサーバーのクーロンとかに設定して、 定期的に実行させておけば、同期されます。

紹介だけですが、以上です。

livedoor プロフィール
記事検索
読書をしよう
楽天市場
こちらもどうぞ
Archives
RSS
  • ライブドアブログ