型システムの分類

プログラミング言語の型システムの分類としては、下記の3つの軸があるようです。

  • 静的な型付け or 動的な型付け
  • 弱い型付け or 強い型付け
  • 型安全かそうでないか


簡単に調べてみたので、メモしておきます。

静的な型付け or 動的な型付け


静的型付けな言語は、型検査が実行時の式に関する同値性の検査なしに行われます。
プログラムを実行する前に全ての式・変数の型が決まっていて、事前に型検査を行うことができます。
C/C++, Java, Haskellが静的型付けの言語です。
まあ、C/C++Javaはキャストが出来てしまいますし、ポリモーフィズムなど処理によっては動的な型情報の取得を必要とするものがあるので微妙ですね。


次に、動的型付けな言語ですが、プログラムを実行してからでないと決まらない式がある言語のことです。
変数でなんでも指せるイメージですね。
Lisp, Ruby, Python, JavaScriptなどが動的型付けな言語です。

SmalltalkRubyなどの動的型付け + オブジェクト指向言語だと、ダック・タイピングなどをよくやりますが、メソッドの引数として入ってくる変数の型が分からないので、ソースが追いづらいと思うのですがどうなんですかね。
まあ、C++Javaでも、ポリモーフィズムをしている場合はどのインスタンスか分かりづらいこともありますが、少なくともあるクラスを継承してるとか、あるインターフェースを実装してるってところまではわかるので、だいぶ絞られると思います。


弱い型付け or 強い型付け


この分類に関しては、色々な意見がありそうです。


ひとつが、型の暗黙的な変換をする言語は弱く型付けされた言語で、それをしない言語は強く型付けされた言語だというものです。
この分類では、JavaScriptなどは弱く型付けされた言語で、Java, Ruby, Haskellなどは強く型付けされた言語となります。


もうひとつは、型エラーがおこる可能性をすべて検出できる言語が強く型付けされた言語でそうでない言語が弱く型付けされた言語というものです。
この分類では、Javaもキャストの失敗は実行時にしか検出できない場合があるので、弱く型付けされた言語となります。
強く型付けされた言語に当たるのは、HaskellやMLになります。

型安全かそうでないか


型の食い違いによる「意味のない」「正しくない」操作によって誤った状態を引き起こす処理や変換を許さない言語が型安全な言語で、そうでない言語が型安全でない言語と言われています。


この分類も色々意見があるようですね。


LispRubyPythonといった言語は、実行時にエラーを発生させ、実行を止めるので型安全です。
C言語は、不正なキャストができてしまうので型安全ではありません。


Javaだと実行時にキャストエラーがでるので型安全と言えそうですが、ジェネリクスの目的は、「型安全にコレクションを使えるようにする」つまり、「キャストエラーがでなくなるので型安全だ」というようなことも言われているのでよくわからないですね。


あとは、例えば、SQLなどを文字列で表現するとそこにミスがあっても、コンパイル時にエラーを検出できないから、工夫してどうにかソースコードで表現して、おかしかったらコンパイルエラーにするっていうアプローチがあって、それを「型安全にする」と呼んでいるのも聞いたことがあります。


WEB+DB PRESSの取材受けました


WEB+DB PRESS Vol.67に載ってます。

WEB+DB PRESS Vol.67

WEB+DB PRESS Vol.67


Web版は下記です。

http://gihyo.jp/dev/serial/01/cyberagent/0028


結構前ですが、下記の取材も受けましたね。
これは、Software Designの取材でした。

http://gihyo.jp/dev/serial/01/cyberagent/0003


やっぱり、ライターさんは凄いですね。
いい感じに書いてくれます。

Hadoop Conference Japan 2011 FallでLT発表してきました


発表資料は、以下です。



内容は、うちの会社でHBaseでグラフ構造を持って、
オンラインで使おうとしているのでその紹介です。


もっと完成度が上がってきたら、別の機会にまた発表したいですね。

JRubyでJobTrackerにアクセスする方法

JRubyからJobTrackerにアクセスする方法を紹介します。


JRubyなので、JavaクラスのJobClinet経由でJobTrakcerにアクセスして、
情報を取得することが出来ます。


今回の例はCDH3u0の環境で動かしています。
また、実行時にHadoopの設定ファイルにクラスパスを通す必要があります。


以下は、動いているジョブのJobIDを出力する例です。

include Java

..必要なjarをrequire(省略)

client = org.apache.hadoop.mapred.JobClient.new(org.apache.hadoop.mapred.JobConf.new)

job_statuses = client.all_jobs

job_statuses.each do |job_status|
  puts job_status.job_id if not job_status.job_complete?
end


次は、動いているジョブの各タスクの進捗を表示する例です。

include Java

..必要なjarをrequire(省略)

client = org.apache.hadoop.mapred.JobClient.new(org.apache.hadoop.mapred.JobConf.new)

job_statuses = client.all_jobs

job_statuses.each do |job_status|
  if not job_status.job_complete?
    puts job_status.job_id

    # map task
    task_reports = client.get_map_task_reports(job_status.job_id)
    task_reports.each do |task_report|
      puts "\t#{task_report.task_id} : #{task_report.progress}"
    end

    # reduce task
    task_reports = client.get_reduce_task_reports(job_status.job_id)
    task_reports.each do |task_report|
      puts "\t#{task_report.task_id} : #{task_report.progress}"
    end
  end
end


最後に動いてるジョブのカウンター情報を表示する例。

include Java

..必要なjarをrequire(省略)

client = org.apache.hadoop.mapred.JobClient.new(org.apache.hadoop.mapred.JobConf.new)

job_statuses = client.all_jobs
job_statuses.each do |job_status|
  if not job_status.job_complete?
    puts job_status.job_id
    job = client.get_job(job_status.job_id)
    puts job.counters
  end
end

単に、JRubyでJobClinetクラスにアクセスしてるだけの話ですが、
jirbを使って対話的に情報を取得したり、
手軽にスクリプトを組んで監視スクリプトなど
色々書けるので便利だと思いました。

ミクシィ × サイバーエージェント合同勉強会

結構たってしまいましたが、
ミクシィ × サイバーエージェント合同勉強会で発表しました。


以下、サイバーエージェントのエンジニアブログの記事です。

株式会社ミクシィ様と合同勉強会を開催しました。
http://ameblo.jp/principia-ca/entry-10895267680.html


エンジニアブログにもありますが、以下資料です。


Amebaでやってるログ解析基盤の説明と、
HBase + Flumeによるリアルタイム解析について話しました。


リアルタイム解析の方はまだプロトタイプレベルですが、
今後も実用化に向けて検証を続けていきたいと思います。

MySQLのレプリケーションを完全にやめる方法

スレーブ側で以下を実行。

STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='';


もしくは、

STOP SLAVE;
RESET SLAVE;

して、mysqlを再起動。


マスタ側で、レプリケーション権限のユーザを削除。