2013年8月30日金曜日

GNU Globalで対応してない言語のコードを解析する.


はじめに




前回の記事 で紹介したGNU Globalを使ってブラウザでコードを読む方法は非常に便利.

しかし,このGNU Global,対応言語はC, C++, Yacc, Java, PHP4しかない

そう言われても,他の言語で書かれたソースコードもブラウザで読みたい時はでてくる.

というわけで,GNU GlobalでGNU Globalで対応していない言語もブラウザで読めるようにする方法をここに書いておく.




概要を一文で書いてしまうと,GNU Globalよりも多くの言語に対応し(そのかわりに機能が少ない)Ctagsを用い,TAGSファイルを生成し,これをhtagsにかける.






注意点




Ctagsを用いるので,Globalを用いて解析したのと同じように,とはいかない.

具体的には,ある関数や変数が参照されている場所の情報(Reference)は表示できない.

なぜなら,CtagsはGlobalと違い,Referenceを探す機能が存在しないからである.

また,htagsの結果表示されるhtmlも,関数や変数の定義にリンクは貼られいない.

結局,htmlで表示しても,Syntax highlightもリンクもないソースコードが表示されるだけである.




しかし,grepやdefinitionの検索には引っかかるようになるため,何も使わないよりは読みやすくなる.

対応言語の解析に比べれば,機能は多少劣るものの,同じ環境でより多くの言語のソースコードを表示できる,という点では便利である.






方法





  1. ctagsをインストール

    Linux MintやUbuntuなら以下のコマンドでインストール.




    sudo apt-get install ctags



  2. gtagsの設定ファイルのテンプレをコピー

    apt-get でGNU Globalをインストールした人は /usr/share/doc/global/examples/gtags.conf を適当なファイルにコピー.

    これを編集して,gtagsコマンドを実行するときにオプションで指定する.


  3. 設定ファイルを編集.

    ここでは,pythonのソースコードをctagsで解析するように編集.




    ctags-exuberant|Exuberant Ctags|ctags by Darren Hiebert:\
    :tc=common:\
    :suffixes=s,a,sa,asm,C,H,cpp,cxx,hxx,hpp,cc,c,h,y:\
    :extractmethod:\
    :GTAGS=/usr/local/bin/ctags-exuberant -xu %s | perl -ne '\
    if (/^operator \\S+\\s+function\\s/) { s/^operator //; }\
    ($name, $type, $no, $path, $line) = split(/[ \\t]+/, $_, 5);\
    printf(STDOUT "%-16s %4d %-16s %s", $name, $no, $path, $line);':


    のように書かれている箇所のうち,2箇所を変更する.


    1. :suffixes の右辺に py を追加.

      ここに,他の拡張子を設定すれば,その拡張子に対応する言語のソースコードも解析してくれる(はず).





    2. :GTAGS の右辺でctagsの実行ファイルのパスを指定する部分を変更.

      apt-get でインストールすると,デフォルトで書かれているパスとは異なるところにインストールされる.

      which ctags コマンドで実行ファイルのパスを確認し,指定する.








  4. gtagsの実行

    以下のようにオプションを指定し,gtagsを実行する.




    $ gtags --gtagsconf=<編集した設定ファイルのパス> --gtagslabel=ctags-exuberant


    --gtagsconf には先程編集した設定ファイルを指定する.







あとは,前回の記事 と同様にhtagsを実行して,htmlファイルを生成すればよい.









おわりに




とりあえず,非対応言語のソースコードもgtags, htagsを用いてhtmlページで表示することが可能になった.

しかし,やはり非対応言語の解析は貧弱であることは否めまい.

非対応言語が主なソースツリーを読む場合は,無理してGNU Global を使うよりも IDEを使ったほうがいいだろう.




この方法が有用なのは,主にCやJavaで書かれたソースツリーの中に少し多言語も混じってる,という場合だと思う.







--
My Emacs Files At GitHub

2013年8月29日木曜日

Gnu Globalを使ってブラウザでソースコードを快適に読む.


はじめに




最近よく使うGnu Globalの導入方法を書いておきます.

ブラウザでコードを読めるのはとても便利です.









動作確認環境





OS
Linux Mint 14


Gnu Global
バージョン5.7.1












導入方法




まず,Gnu Globalをインストール.

Ubuntuなら以下のコマンドでインストールできる.




$ sudo apt-get install global


次に,TAGSファイルというものを作る.

これは,以下のコマンドで作れる.




$ gtags -v


-v オプションは途中経過を表示するオプションなので,なくてもよい.




次は,ブラウザで表示するためのHTMLとCGIを作る.

これは,以下のコマンドで作れる.




$ htags -afFnvsx


大量に指定されているオプションの意味は以下のとおり.

-a アルファベット順に並べる

-f 検索フォームを作る

-F フレームを作る

-n 行番号をつける

-s シンボルにもリンクを貼る

-v 途中経過を表示

-x xml形式で出力




ここまでで,必要なファイルの作成は完了した.

最後に,CGIを動かすためにApacheの設定を行う.

今回は,とりあえず手元のマシンで動かすための設定を書く.




解析した結果のファイルは /home/hoge/source/HTML/ にあるものとします.

以下のブログを参考に(というよりそのまま)している.

Androidでソース検索(GNU GLOBAL) 電脳羊(Android Dream)




まずapache2をインストール.




$ sudo apt-get install apache2


次に, /etc/apache2/sites-available/default を変更する.

このファイルの変更は管理者権限が必要なので,ファイルを開くときにsudoを忘れずに.

変更箇所は2箇所.


  1. DocumentRootの変更.

    DocumentRoot /var/www をコメントアウト(行頭に#を追記)し, DocumentRoot /home/hoge/source/HTML を追加.


  2. CGIを有効にする.

    以下をコメントアウト.




    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
    </Directory>


    以下を追記.




    <Directory "/home/hoge/source/HTML/cgi-bin">
    AllowOverride None
    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    Order allow,deny
    Allow from all
    </Directory>








この変更が終わったら,以下のコマンドでapache2を再起動.




$ sudo /etc/init.d/apache2 restart





その後,ブラウザで,http://localhost にアクセスすると,Globalのページが表示される.

また,左上で関数や変数の定義,参照などを検索できる.

この検索機能は,CGIでやっているので,これがうまく行かないときは,apacheの設定がうまくいってない可能性が高い.









おわりに




サーバにおいて,外から見れるようにしたいときなどは,もっとちゃんとapatchの設定をしないといけないと思います.

ですので,apacheの設定方法を調べてください.

僕もよくわからないので,誰か教えてほしい←



















--
My Emacs Files At GitHub

2013年8月21日水曜日

ブログのデザインを変えてみました.

タイトルの通り,そして,見た通り,ブログのデザインを大幅に変えてみました.

以前は黒背景に白文字だったのですが,あれはやはり見にくいな,と思い,白背景に黒文字に変えました.

また,セクション名が大きくして,本文の色と少し変えてみました.

デザインを変えて,見やすくなれば幸いです.

これまでの記事内容などは変更しておりません.
デザインを変えただけですので,驚かないでください.

Linux の コンソール(非GUI) をEmacsのキーバインドにする.




動作確認環境




OS: Fedora 18

キーボード: 英字配列キーボード

この方法では,英字配列で,Emacsバインドになると思われる.

(日本語配列のキーボードでは試してない.)







方法




結論だけ言うと,カーネルのブートオプションに KEYTABLE=emacs を追加するだけでOK.

以下は,その具体的な設定方法を書く.







具体的な設定方法




grub2の場合は, /etc/default/grub



GRUB_CMDLINE_LINUX=""


の行を




GRUB_CMDLINE_LINUX="KEYTABLE=emacs"


に書き換えて,ターミナルから,




$ grub2-mkconfig /boot/grub/grub.cfg 


を実行すればいい.




最終的には,grub.cfgには,以下のようなエントリーが追加されればOK.

カーネルを指定する. linux から始まる行の最後に KEYTABLE=emacs が入っていればよい.



menuentry 'Linux Mint 14 MATE 64-bit, 3.5.0-27-generic (/dev/sda1)' --class linuxmint --class gnu-linux --class gnu --class os {
      recordfail
      gfxmode $linux_gfx_mode
      insmod gzio
      insmod part_msdos
      insmod ext2
      set root='hd0,msdos1'
      if [ x$feature_platform_search_hint = xy ]; then
        search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  <UUID>
      else
        search --no-floppy --fs-uuid --set=root <UUID>
      fi
      linux   /boot/vmlinuz-3.5.0-27-generic root=UUID=<UUID> KEYTABLE=emacs
      initrd  /boot/initrd.img-3.5.0-27-generic
}


これは,Grub(2でないもの)にも同様に使える技である.








おまけ




起動してから,emacsバインドに変えたい時は,



$ loadkeys emacs


で,簡単に変わる.

よく,keymapの圧縮ファイルを展開して,CpasLockの部分を書き換えて… みたいは方法があるが,あれよりずっと簡単.

ただし,日本語配列でEmacsバインドに変えたい場合は,やはり,keymapの圧縮ファイルを展開して…しないといけない.



--
My Emacs Files At GitHub

2013年8月1日木曜日

Xenを動かす


ちょっと,Xenを試したくなったので,家のマシンでXenを動かしてみた.

dom0が起動するところまでやってみた(と思う.自分でもよくわかってない.).

とりあえず,メモ書き.



構成




目指す構成は以下の通り.


  • HDDにLinux Mint(sda Grub2)


  • SSDにCentOS(sdb Grub)


  • sdaのGrub2からsdbのGrubへチェインロード


  • sdbのGrubからXenを起動




HDDに入ってるLinux Mintの環境は壊してたくないのでそっとしておく.

わざわざチェインロードしているのは,Xenの設定の時に,CentOSのカーネルの場所とgrubの設定の場所を同じにした方が面倒にならなさそうだったから.






CentOSをインストール




以下のページを参考にした.

自宅サーバーにCentOS6.3とソフトをインストール | ハーレーと趣味に生きるNEXT





  • 適当なミラーサーバからCentOSのminimalのISOをダウンロード


  • USBからブートしたいので,UnetbootinでUSBにイメージを書き込み.


  • USBに もとのISOもコピーしないといけない


  • インストール時にsdbにGrubをインストールするのを忘れないように

    (デフォだとsdc(USBメモリに書き込むようになってるので変更))









sdaのGrub2の設定




以下のページを参考にした.

linux - Boot GRUB2 to GRUB or GRUB2 on another disk - Super User


  • sdaのLinux Mintの /boot/grub/grub.cfg に追加




    menuentry "Other Disk" {
    insmod part_msdos
    set root='(hd1)'
    drivemap -s hd0 hd1
    chainloader (hd1)+1
    }


    本当は /etc/grub.d/40_custom に書き込んで, update-grub を叩くべき.

    rebootし,追加したエントリーを起動すると,sdbのGrubが起動するはず.












もしsdbのGrubでメニューが表示されなかったら




以下のページを参考にした.

asterisk Fedora - EtCetera/GRUB

もし,Grubは起動するが,プロンプトしか出ないときはとりあえず.以下のコマンドを叩いて,メニューを出す.




> configfile /grub/grub.conf


表示されたメニューから,CentOSが起動したら,一度Grubをsdbにインストールし直すと,ちゃんとメニューがでるようになる.

GrubのインストールはsdbのCentOSから以下のコマンドを叩く.




# grub-install /dev/sdb







CentOSでの設定








ネットワーク設定




/etc/sysconfig/network-script/ifcfg-eth0 を編集




onboot=no


の行を




onboot=yes


と変更.

その後,rebootすればネットワークはつながった.






xenの設定




以下のページを参考にした.

HowTos/Xen/Xen4QuickStart - CentOS Wiki




以下のコマンドでXen用のCentOS(のカーネルかな?)とXenをインストール




# yum install centos-release-xen
# yum install xen



ここまで終わったあとに, /boot/grub/grub.conf を確認.

defaultのカーネルが3.4.xxx になってれば問題ない.

もしdefaultが2.6.xxxならば,3.4.xxxのほうに変える.

その後,




# /usr/bin/grub-bootxen.sh


ちなみに,grub.confのdefaultで設定しているカーネルイメージをロードするエントリーが複数あると,このスクリプトは正常に動作しないので注意.




このスクリプトを実行した後に, /boot/grub/grub.conf を再度確認してみる.

3.4.xxx.のエントリーが以下のように変わってるはず.




title CentOS (3.4.46-8.el6.centos.alt.x86_64)
root (hd0,0)
kernel /xen.gz dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all
module /vmlinuz-3.4.46-8.el6.centos.alt.x86_64 ro root=/dev/mapper/vg_xen01-lv_root rd_LVM_LV=vg_xen01/lv_swap rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=uk rd_NO_MD LANG=en_GB rd_LVM_LV=vg_xen01/lv_root SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM rhgb quiet
module /initramfs-3.4.46-8.el6.centos.alt.x86_64.img


元々kernelコマンドとinitrdコマンドで読み込んでいたものがmoduleコマンドで読み込まれるようになっている.

また,kernelコマンドでは,xenのイメージ?を読み込んでいる.










動作確認




GrubからCentOS (3.4.46-8.el6.centos.alt.x8664)をブートしてみる.

ブート後,以下のコマンドを叩いてみる.




# xm --info


このコマンドを叩くと,Xenに関する情報が大量に出てくる.

もし,Xenが動作してないと,"本当にXen動いてる?"(意訳)的なメッセージが出てくる.










--
My Emacs Files At GitHub