Fork me on GitHub

2010/09/02

はてな
えーっと、IDE使ってません。ごめんなさい。
PerlをIDEで書いてる人、どれくらいいるんだろう。何使ってるんだろ。
私はLinuxでもWindowsでもVimを使ってます。Perlってサーバで使われる事が多いし、サーバだとsshで入る事が多いだろうし、まぁXの転送やVNCやそれっぽいのでグラフィカルに操作しても良いけど、正直PerlのドキュメントもテキストベースだしPerlで入力補完出来るグラフィカルエディタもまず無いと思ってる。

で、私がVim上で使ってるPerlの開発を「200倍便利にするスクリプト」を紹介。

perldoc.vim

perldocはPerlのオンラインマニュアルなんだけど、これを一々ターミナルに戻ったりして引いてると時間のロス。screenで分割して開いてもいいんだけどscreenの画面間移動よりもVim内でのウィンドウ間移動の方が操作感が統一出来てて良い。
そこで使ってるのがid:secondlifeさんが書いたperldoc.vim

hotchpotch's perldoc-vim at master - GitHub

Perldoc plugin for vim

http://github.com/hotchpotch/perldoc-vim
ドキュメントを引くにはPerldocコマンドを使います。関数openのドキュメントを引くには
:Perldoc -f open
とします。またモジュールAcme::Oppaiのドキュメントを引くには
:Perldoc Acme::Oppai
と実行します。 このスクリプトの良いと思う点は、補完が効くことです。「:Perldoc Acm」くらいまでタイプしてtabを押すと、「Acme::Oppai」や「Acme::Hidek」が補完されます。

ref.vim

もう一つ、同じ様にperldocが引けるプラグインとしてthincaさんが書いたrefがあります。
thinca's vim-ref at master - GitHub

Integrated reference viewer.

http://github.com/thinca/vim-ref
こちらはperldocに限らず
  • alc
  • erlang
  • man
  • perldoc
  • phpmanual
  • pydoc
  • refe
といったドキュメントを開く事が出来ます。ドキュメントを引くには
:Ref perldoc -f open
:Ref perldoc Acme::Oppai
等と実行します。
perldoc-vim
こちらも補完が効きますが、refはモジュール検索の際、あり得るモジュール全てが補完されてしまう為、ネームスペースにわんさかモジュールがあると少しモタつきます。なので私はperldoc.vimを使ってます。

追記
thincaさんから某所でコメント貰った。
let g:ref_perldoc_complete_head = 1
でそれっぽい事出来るらしい。

perlcompletion.vim

Perlは結構(かなり?)文法制限の緩い言語だと思ってますが、これが災いしてかIDE等でPerlの入力補完が出来る物は殆どありません。そんな中c9sさんがVimのomni補完でPerlの入力補完をしてくれるスクリプトを書いてくれています。
c9s's perl-completion.vim at master - GitHub

perl omnicompletion for vim (including base class function compleltions .. etc)

http://github.com/c9s/perl-completion.vim
これ、ぜひ実際に試して欲しいのですが
use Acme::O
までタイプして<c-x><c-o>(CTRL-x CTRL-o)をタイプすると
perl-completion-vim1
どどーーーん!
さらに
perl-completion-vim2
Moooooooooooooooooooseな補完や
perl-completion-vim3
変数の補完。そして
perl-completion-vim4
モジュールのメンバまで補完してくれます。キャーすてきー!
すばらし過ぎます。ちなみにこのperl-completion.vimのwin32対応と、上で紹介したperldoc.vimの補完部分を担当させて頂きました。

2010年はPerlが熱い!そう思ってます。ぜひインストールして活用して見てください。200倍とは言い過ぎかもしれませんが、間違いなく2倍にはなりますよ。

初めてのPerl 第5版 初めてのPerl 第5版
Randal L. Schwartz
オライリージャパン / ¥ 3,780 (2009-10-26)
 
発送可能時間:在庫あり。


モダンPerl入門 (CodeZine BOOKS) モダンPerl入門 (CodeZine BOOKS)
牧 大輔
翔泳社 / ¥ 2,940 (2009-02-10)
 
発送可能時間:在庫あり。

Posted at 00:15 in ソフトウェア::lang::perl
Tagged as: perl, vim
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2010/08/14

はてな
ZimbuVimの作者であるBram Moolenaar氏が開発しているプログラミング言語「Zimbu」を触ってみた。
the Zimbu programming language

Suppose you want to write a new program, something like a text editor. What language would you write it in?

  • It has to be as fast as possible, so interpreted languages are out.
  • You don't want to micro manage memory, so C is out.
  • You don't want to require programmers to have a degree, so C++ is out.
  • You want fast startup and not depend on a big runtime, so Java is out.
  • It has to run on most systems, anything with a C compiler, so D is out.
  • You want to have fun making something new.

No existing language really meets these demands, so let's create a new one that does!

Zimbu is an experimental programming language. It is a very practical, no-nonsense kind of language. It mixes the good things of many existing languages and avoids their deficiencies. And then throws in a few brand new ideas.

http://www.zimbu.org/
実は、存在は出た当初から知ってはいたんだけど
制御命令が全部大文字とか、流行らないよね
とか
ソースコード中にタブがあるとビルド出来ないとか、どんだけ?
とか
ブロックが「{」無しに始まるのに終わりに「}」が要るの気持ち悪いよね
とか、おもいっきりkazuh●さんあたりにDISられそうだったので、触って無かった。
これではいかんな!と思ってFizzBuzz書いてみた。
FUNC int MAIN()
  FOR i IN 1 TO 100
    IF i % 15 == 0
      IO.write("FizzBuzz\n")
    ELSEIF i % 3 == 0
      IO.write("Fizz\n")
    ELSEIF i % 5 == 0
      IO.write("Buzz\n")
    ELSE
      IO.write(i)
      IO.write("\n")
    }
  }
  RETURN 0
}
「}」だけとか、きもちわる!

zimbuではzuファイルを一度Cのコードに変換し、コンパイラでビルドします。なので実行速度は結構速い(かもしれない)。ちなみにC言語に出力されたコードは、804行もあってブログに載せられないので、Gistに貼り付けておいた。
たかだか15行のソースなのに804行も出力するなんて凄い!

ただ思いとは裏腹に、実は結構色んな事が出来る予定の様で、GUIの設計なんかもやってるみたいです。ちなみにGTK/Qtのバインディングは構想中ですが、ブラウザを使ったGUIコードの生成はある程度動く様です。
zwt-demo1
zwt-demo2
なお、このサンプルで使われている部品の一つとしてGoogle Protocol Bufferを使っており、javaのソースを吐いてエンティティオブジェクトとして扱っている様です。

なんか凄いような、凄くないような...

明日にはきっと言語仕様忘れてると思います。
Posted at 01:35 in ソフトウェア::lang::zimbu
Tagged as: bram, zimbu
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2010/08/13

はてな
MSVCやMinGW32、Cygwin、BorlandC++などWindowsのCコンパイラについて一般的に嗜む程度の知識は持っていて、UNIXもある程度さわれて、Perlも少し触れるかなぁという(我ながら浅はかな)「つもり」でいたので、「CPANモジュールDevel::CheckLibのメンテナンスを誰か引き受けて欲しい」と仰るDavid Cantrellさんの意思を受け、Devel::CheckLibのコメンテナを引き受けました。

至らないかと思いますが、どうぞよろしく。

Posted at 23:32 in ソフトウェア::lang::perl
Tagged as: perl
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip

2010/08/10

はてな
「new 式」 で、変数を 式 として指定することはできますか? | OKWave
via: ときどきの雑記帳
ところでpermalinkがおかしい気がする。あと最近のときどきの雑記帳はときどきどころでない気がするw
「new 式」 で、変数を 式 として指定することはできますか?

例えば次のような感じで、変数clの内容によりclassAあるいはclassBをnew
するようなことがしたいです。
class base [ ... };
class classA : public base { .... };
class classB : public base { .... };
classA* ca;
classB* cb;
base* cl;
cl = classA;
ca = new cl;
cl = classB;
ca = new cl;

これにより、多種のclassをnewする際にいちいち
pa = new classA;
pb = new classB;
pc = new classC;
pd = new classD;
............
としないで、
for (n=0; n<xxx; n++)
p[n] = new cl[n];
…みたいに簡潔に書けないかなと考えてます。
よろしくお願いします。
こんな?
#include <iostream>

using namespace std;

class base {
public:
    virtual void hello() const =0;
};

class classA : public base { void hello() const { cout << "classA\n"; }};
class classB : public base { void hello() const { cout << "classB\n"; }};
class classC : public base { void hello() const { cout << "classC\n"; }};
class classD : public base { void hello() const { cout << "classD\n"; }};

template<typename T> base* create() {
    return new T;
}

int main(){
    typedef base* (*factory)();
    factory p[] = {
        create<classA>,
        create<classB>,
        create<classC>,
        create<classD>
    };
    for (int n = 0; n < 4; n++)
        p[n]()->hello();
}
Posted at 01:04 in ソフトウェア::lang::c
Tagged as: c, c++
Bookmarks: add to hatena add to hatena | add to delicious.com | add to livedoor.clip add to livedoor.clip