進・日進月歩

IT, Jazz, study, engineering, すべての真実とクリエイティビティのために

Tuesday
Dec 2,2008

まぁなんでプログラミング10何年もやってて知らないんだって話しです。

冷静に考えると特に必要はなかった気もするんですが、実験のデータ加工をするプログラムをC++で書いてみました。
C++あまり使ったことなかったのですが、最近のプログラミング言語に比べて割と挙動が違うのでコツが必要だった。

ようは一番何が違うかというと、オブジェクトとそれを格納する変数の取り扱いが違う。

C++:
  1. MyClass mc;

と書くと、たとえばjavaとかの場合mcにはnullが入っているわけですが、c++の場合暗黙にコンストラクタMyClass()が呼び出されて初期化されます。
どういう差かというとjavaの場合オブジェクト型を入れる変数は全部ポインタなんですね。だから宣言しただけだとnull(pointer)が入ってるわけです。
C++の場合普通に宣言すると、ちょうどCの構造体と同じ扱いになります。つまり基本的には「値」扱いみたいな感じになります。
なのでC++にはガーベッジコレクトがないわけですが、上のように宣言すると(mcの内部の話は別として)mc自体は破棄されます。

これを確認するのに一時間くらいテストコード書いてた・・・・

つまりは、C++で

C++:
  1. MyClass * mc = new MyClass();

と書く場合がjavaのデフォルトで、ただし、ガーベッジコレクトがあるおかげで、なんか適当な感じにできてるわけです。
この辺はrubyとか、たぶんpythonも一緒。

で、問題はガーベッジコレクトがないところで、newなどで動的にメモリ確保をした場合が割りとめんどくさいのです。

たとえばつぎのようなクラスを作ったとします。このクラスはあまり設計的によろしくないような感じがします。

C++:
  1. class MyClass{
  2. public:
  3. Foo* hogefunc();
  4. }
  5.  
  6. Foo* hogefunc()
  7. {
  8. return new Foo();
  9.  
  10. }

こういう風にした場合hogefunc()で作られたFooのメモリが開放されません。どっかでdeleteしないといけないんでしょうが、どこでやったものかという悩みが発生します。
ちなみにjavaとかだとまったく問題ないんだけども。

MyClassのデストラクタでやるとするとMyClassが破棄された時点でFooが消えるので、メモリの変なところへアクセスしたりしそうです。
一方で、(この場合は問題にならないですが)MyClassの外で消すと、MyClass内の処理で引っかかりそうです。

なんか適当に作ってしまったので、いまさら変更するのもなーと思って放置なんですが、どうやるのが美しいのかなぁ。
new使わずにやるのがよさそうかな。

けどその場合の帰り値はコピーコンストラクタとかが使われることになるのかな。解決できる問題ではあるんだけど、めんどくさいのとC++の流儀がどうなってるのかがひっかかってるはらじゅんでした。

  • Comments Off
  • LYME = Linux + Yaws + Mnesia + Erlang

    • Filed under: 雑記
    Wednesday
    Nov 26,2008

    まだ何もコメントすべきほど調べてはいないのだけど、メモ予定地としてこのエントリを作っておく。

    ベンチマークは結構されていて次のサイトにまとまっているっぽい。

    Lyme vs Lanp 21 Century Code Works

    最近並列分散処理というようなことが流行っているので、この手のものはちょっと気になる。

    Tuesday
    Nov 25,2008

    hamlがあまりにも気持ち悪いので、erbで実装したのですが、そのコードを参考のために載せておきます。

    動作が確認済。

    元記事はmerb wikiのMy First Blog

    index.html.erb

    <table>
    <%- @posts.each do |post| %>
    <tr>
    <td><%= post.title %></td>
    <td><%= link_to "Show", url(:post,post) %></td>
    <td><%= link_to "Edit", url(:edit_post,post) %>/td>
    </tr>
    <%- end %>
    </table>
    <%= link_to "New", url(:new_post) %>

    new.html.erb

    <%= error_messages_for :post %>
    <%= form_for( @post, :action => url(:posts)) do %>
    <%= partial :form %>
    <p><%= submit "Create" %></p>

    <% end =%>

    <%= link_to 'Back', url(:posts) %>

    show.html.erb

    <p><%= @post.title %></p>
    <p><%= @post.body %></p>

    <br />
    <hr />

    <h1>Comments</h1>
    <p>
    <%= partial "comments/show", :with => @post.comments.reverse, :as => :comment %>
    </p>
    <%= partial "comments/comment" %>

    <%= link_to 'Edit', url(:edit_post,  @post) %>

    <%= link_to 'Back', url(:posts) %>

    edit.html.erb

    <%= error_messages_for :post %>

    <%= form_for(@post, :action => url(:post, @post)) do %>
    <%= partial :form %>
    <p><%= submit "Update" %></p>
    <% end =%>
    <%= link_to "Show", url(:post, @post) %>
    <%= link_to "Back", url(:posts) %>

    _form.html.erb

    <p>
    <%= text_field :title %>
    </p>
    hogehoge
    <p>
    <%= text_area :body %>
    </p>

    _show.html.erb

    <p><%= comment.name %></p>
    <p><%= comment.body %></p>

    _comment.html.erb

    <p>
    <%= error_messages_for :comment %>
    </p>

    <p>
    <%= form_for(:comment, :action => "/posts/#{@post.id}/comments") do %>
    <p><%= text_field :name, :name => "comment[name]" %></p>
    <p><%= text_area  :body %></p>
    <p><%= submit "Comment" %></p>
    <% end =%>

    </p>

    Monday
    Nov 24,2008

    あまりにも情報がないのでまとめてみようかと。音声認識以外の用途でつかおうと思うとなかなかとっつきにくい。

    以下は関連ライブラリなど

    • ATK API fot HTK C++ Bindings

    今回データとして音声以外を使うのでSOURCEFORMAT=USERと、HQuantあたりが鍵かなぁ?

  • Comments Off
  • HTKのサンプルが動かないときは

    • Filed under: 雑記
    Monday
    Nov 24,2008

    音声認識などでよく使われるHMM(隠れマルコフモデル)を使うときに便利らしいHTK。
    環境依存みたいですが、サンプルがそのままだと実行できないことがあります。
    そういうときは次のフォルダを作って見てください。

    hmms/
    hmms/hmm.0
    hmms/hmm.1
    hmms/hmm.2
    hmms/tmp
    proto/
    test/

    こうするとなぜかできる。

  • Comments Off
  • merbを軽くする?

    • Filed under: IT
    Monday
    Nov 24,2008

    実際軽くなるかどうかは不明だけど。

    config/dependencies.rbに作ったmerbアプリケーションの依存しているライブラリが乗っています。

    素朴にmerb-gen app hogeでやった場合こんな感じ。

    # dependencies are generated using a strict version, don't forget to edit the dependency versions when upgrading.
    merb_gems_version = "1.0.1"
    dm_gems_version   = "0.9.7"

    # For more information about each component, please read http://wiki.merbivore.com/faqs/merb_components
    dependency "merb-action-args", merb_gems_version
    dependency "merb-assets", merb_gems_version
    dependency "merb-cache", merb_gems_version
    dependency "merb-helpers", merb_gems_version
    dependency "merb-mailer", merb_gems_version
    dependency "merb-slices", merb_gems_version
    dependency "merb-auth-core", merb_gems_version
    dependency "merb-auth-more", merb_gems_version
    dependency "merb-auth-slice-password", merb_gems_version
    dependency "merb-param-protection", merb_gems_version
    dependency "merb-exceptions", merb_gems_version

    dependency "dm-core", dm_gems_version
    dependency "dm-aggregates", dm_gems_version
    dependency "dm-migrations", dm_gems_version
    dependency "dm-timestamps", dm_gems_version
    dependency "dm-types", dm_gems_version
    dependency "dm-validations", dm_gems_version

    非常にたくさんのモジュールが呼ばれています。明らかにcacheとか今使ってないのでそういうのをコメントアウトするとより軽くなるのかなぁと妄想しているところです。

  • Comments Off
  • Thursday
    Nov 20,2008

    前回のエントリー

    centOS5にmerbをインストールする

    最後設定まで終わったところでrubyinlineでエラーが出ていたわけですが、それを解決しました。config.ruを書き換えます。
    私は次のようにしました。

    まずmerbアプリのディレクトリの直下にtmpディレクトリを作ります。
    パーミッションに気をつけておいてください。その上でconfig.ruを次のようにします。

    require 'rubygems'
    require 'merb-core'

    m_root = File.expand_path(File.dirname(__FILE__))
    ENV["INLINEDIR"] = m_root / "tmp"
    Merb::Config.setup(:merb_root   => m_root,
    :environment => ENV['RACK_ENV'])
    Merb.environment = Merb::Config[:environment]
    Merb.root = Merb::Config[:merb_root]
    Merb::BootLoader.run

    # Uncomment if your app is mounted at a suburi
    #if prefix = ::Merb::Config[:path_prefix]
    #  use Merb::Rack::PathPrefix, prefix
    #end

    run Merb::Rack::Application.new

    前回のエラーはruby_inlineというrubyに埋め込んだCのコードを実行するためのライブラリがテンポラリファイルを作ることに失敗していたわけです。
    それをENV["INLINEDIR"]で指定してあげることで解決しました。

    上のconfig.ruはこのままこぴぺしても使えるようにしてあります。tmpディレクトリだけちゃんと作ってください。

    では、楽しいmerb生活を!

    追記:公式wikiにpassenger + merbに関する記述があります。そちらも参考に

    Deploying with Passenger

  • Comments Off
  • CentOS5にmerbをインストールする

    • Filed under: 雑記
    Saturday
    Nov 15,2008

    CentOS5はrubyのバージョンとかgemのバージョンとかの関係でなかなかmerbがインストールできません。

    とりあえずえらく苦労したのでメモ代わりに。自分はもともとmod_railsで動く環境があったので、そこから変更をしました。

    目標はpassengerのmod_rackとmerbの組み合わせで動かすこと。

    まずrubyをアンインストールする

    2008/11/15現在、centos5はruby1.8.5なんですがmerbはruby1.8.6以上でgem1.3以上じゃないと動きません。なのでyumで入れてる人は全部削除しましょう。

    yum remove ruby

    yum remove rubylibs

    ねんのため次のコマンドを実行して残ってないか探してみましょう。

    yum list ruby |grep installed

    なにもでなければ大丈夫です。

    checkinstallをインストール

    なにも気にしないで入れてもいいのですが、ソースからコンパイルしてインストールすると、アンインストールが大変です。それを簡単にするのがcheckinstall。これを使ってruby1.8.7をインストールします。

    rpmがあるのでダウンロード。で、インストール。

    rpm -ivh checkinstall-1.6.1-1.i386.rpm

    yum install rpm-build

    これで完了。/usr/local/sbinにインストールされるのでルート以外だとパスが通ってません。ここ注意。
    またrpmを作る場合はrpm-buildがないと動かないので入れてない人はインストールしましょう。

    ruby1.8.7をインストール

    とりあえずサイトからソースをダウンロード。自分は最近話題のmod_rubyやらmod_rackやらのpassengerで動かす予定なので、共有ライブラリを作るようにconfigureしました。

    ./configure --prefix=/usr --enable-shared

    make

    sudo /usr/local/sbin/checkinstall

    いろいろ聞かれますが、途中でrpmを選択するところ以外は適当でok。

    こうすると、rpmが/usr/src/redhat/RPMS/x86_64/につくられます。ここでインストール。

    sudo rpm -ivh /usr/src/redhat/RPMS/x86_64/ruby-1.8.7-p72.x86_64.rpm

    これで完了。

    rubygems1.3をインストール

    これもソースをrubygemsのサイトから落としてきて展開。で、インストール。

    sudo ruby setup.rb

    これはこれで終了。

    merbのインストール

    gemで一発。

    gem install merb

    passengerのインストール

    gem install passenger

    passenger-install-apache2-module

    ここでもいろいろ聞かれたり表示されたりしますが、出てきたとおりに操作すれば完了。

    これでインストールは終了

    これでインストールは終了です。

    merbをテストで動かす

    自分はちょっとエラーでまだ動かせてないんですが、基本的にこのサイトの「merbでつくる」から後をやればokなはず。

    inlineのpermissionで起こられたら

    このサイトの情報で直ると思ってます(まだ試してない

    とりあえず動かせたら続編まとめます。

    Saturday
    Nov 1,2008

    IPAの未踏プロジェクトに応募してみた。

    内容は先週まで東大のビジコンに出してた内容で、一ヶ月くらいかけてビジネス面については脳内でできてきたんだけど、今度は実装がないのが問題(いつもは逆なんだが)なので、作るのにお金をくださいというのでアイディアを投げてみた。

    たぶん発想としてはずっと前からあったもので、自分が調べた限りでは1980年にはすでに発想があった。まぁあのころのPCスペックでは実現するはずもない。逆に言うとそれくらい今は進歩してるんだなというのを再確認した。

    基本的な内容としては俺デスクという過去の未踏プロジェクトにとてもよく似ている。たぶん違いといえば、向こうがテクノロジーであることに対して、こっちはサービスであるという差くらいなもんだろうか。
    もちろんそのサービスを実現するためにテクノロジーがあることは間違いないが。

    最近思うのはテクノロジーとサービスは分けて考えるべきだということだろうか。例外はあるだろうが、テクノロジーはサービスを提供する人に対してしか売れない。そしてサービスを受けたいと思ってる人はテクノロジーは買わない。この点だけ抑えておくだけでも、ITビジネスでトンチンカンなことを言わずにすむような気がする。そしてほとんどの人はサービスを提供しようとしていて、テクノロジーは提供しようとしていないように最近感じる。

    サービスの根本は、お客様に代理してなにかを行うことであると最近思う。マッサージでもamazonでも基本的には、「肩をもむ」とか「本を手に入れる」という行為を代わりにやっているに過ぎない。mixiだったら「友達の近況を知る」ことを代わりにやっているといえるかもしれない。
    それをすることによってお客様の行為を代替し、手間が減っていることが重要。客の視点から見れば、中身がどうであっても結果が同じなら大して興味はない。
    「フェアトレードだとかチームマイナス6%とかああいうのを進んで選んでいる」という人もいそうだけど、それですら結局は南米のなにかの問題とか地球温暖化に関して自分が何かをする代わりに誰かに何かをしてもらっているということに過ぎない。

    サービスとコンテンツは分けて考えるべきであるように思う。漫画とか映画とかああいうのをコンテンツと呼ぶなら、それはサービスとは違う。
    映画をサービスと呼ぶなら、それは映画館が提供しているサービスであって映画製作会社が提供しているものではない。
    コンテンツをうまく形容する言葉はあまり思いつかないのだけど、誤解を恐れずに言えばなくても困らないものである。コンテンツの本質は0から1を作り出す作業である。テクノロジーが価値を積み上げていくバベルの塔で、サービスが客の手間を減らす引き算だとすれば、本当の意味で価値を作り出しているのはコンテンツだけなんじゃないかと思う。もともと0なんだから、無くたって変わらないのでなくても困らない。
    言ってみれば嗜好品。贅沢。暇つぶし。なんかいろいろ言い方はあるだろうけど、生活に本当にvalue addしてくれるのはおそらくコンテンツなんではないだろうか。

    なんか色々書いたけど、なぜかこの辺の区別がITはなかなかされにくいと感じる。もちろんひとつのプロダクトを見たときにそれがサービス・コンテンツ・テクノロジーの組み合わせでできてるというのは十分有る話ではあるとおもう。が、その価値構造とか、それによって得られる効果とか、扱い方とかぜんぜん違う。なんか自分が知ってる範囲ではこんな混沌としている世界はITしかしらない。

    とかいってみても、別にこういった議論だってあまり意味が無いように感じる。お金大好きな私とすればこんなこと考えなくても売れれば別にいいわけです。単にこういうこと考えるのはブログ書くのと同様趣味でしかない。
    実際的にものを売ろうと思うんだったら、少なくともやらないといけないことは「商品を作る」「売る」の2つである。これをやらずに儲からないだなんだと言ったところで意味は無い。
    今まで書いたような妄想は、それがもう実行されているか、もしくは、実行される予定がすでにある状態で始めて役に立つように思う。
    だからといって、「がんがんつくれ」とか「がんがん売れ」とかいうのもなんかなぁと思うんだけど、要はいつも思うとおり3秒頭を使ってほしいということだろうか。
    頭使ったからといってわからんものはわからんのだけど、3秒思いをめぐらすだけでも無駄が減るんじゃないかなといつも思います。

  • Comments Off
  • macのdnsキャッシュのクリア方法

    • Filed under: IT
    Wednesday
    Oct 29,2008

    以前は次のようにやっていたようですが、いつの間にかかわったようです。

    Mac OS X で DNS のキャッシュをクリアする。

    lookupdはすでに存在しません。そのかわりdscacheutilが使われるようになっています。
    これはmac上の様々なキャッシュを統一的に扱うようにしているようです。

    次のようにするとdnsキャッシュの中身が見れます。

    dscacheutil -cachedump -entries host

    で、クリアするときはこんな感じ

    dscacheutil -flushcache

    なるほどなるほど。

  • Comments Off
  • about me

    原田 惇

    応用数学や統計、ITなどを利用していろんなことをしています。
    自己紹介はこちら

    adsense

    amazonお勧め

    Recent Posts


    Recent Comments


    Twitter



    Archives


    Meta