2013年12月20日金曜日

岡山から離れて9ヶ月 〜岡山を離れて変わったこと,変わらなかったこと,etc〜


はじめに




この記事は大都会岡山 Advent Calendar 2013 - Adventarの20日目の記事となります.

昨日は仁志 能野さんのYOKIZO.com - 「本自炊」はじめました でした.

僕は,「本を自炊すれば部屋の荷物が少なくなっていいだろうなぁ」と思いつつ重い腰が上がらない今日このごろです.







岡山ではなにやってたの?




9ヶ月前までは,大都会岡山の国立大学である岡山大学で残念大学生をやってました.

岡山では勉強会にあちこち顔を出したり,たまに主催したりしてました.

研究室時代にはLinux カーネルの中弄って面白いことする研究をしてました.





今どこでなにやってるの?




現在は,関東の国立大学である某T大学で大学院生をやってます.

(まぁ,T大学って筑波大学なわけですが.)

つくばや東京でも,ときどき勉強会に参加してます.

研究室ではVMMを弄って面白いことをする研究をしてます.







岡山を離れて変わったこと








列車に乗るときにICカードを使うようになった




岡山にいるときはICカードなど持ってもいませんでした.

つくばに引っ越してからも,しばらくはICカードを持たずに生活してました.

ただ,東京近辺の列車は切符を買うのがあまりにも難しい!

えっ,乗り換え後の料金表が切符売り場にないんだが…? 連絡切符って言われても何円の切符買えばいいの??? という事態になります.

そんなわけで,いちいち値段調べて切符買って,なんてことしてられないのでICカードを買いました.



余談ですが,こちらではICカードはPASUMOとSUICAのどちらかが手に入ります.

ただ,どうせICカードを持つのならICOCAが良かったなぁと思います.

あの青いカモノハシのキャラ「イコちゃん」は割と好きなキャラだったので.

イコちゃん - Google Search







あれ?勉強会って懇親会が本番じゃないの?




つくばに来てから,何度か勉強会に参加することがありました.

そこでカルチャーショックだったのが「懇親会が地味」ということです.



岡山の勉強会というと,勉強会後の懇親会は結構盛大にやります.

飲み屋で懇親会して,さらに元気があればボーリングやカラオケへ,というのが割とよくありました,

また,勉強会参加者の半数以上は懇親会に参加してたと思います.

岡山の勉強会文化で育った僕は,「勉強会は懇親会が本番だ」と教わったほどです.

(もちろん,勉強会自体もちゃんとやりますよ)



しかし,関東での勉強会はどうも状況が違います.

懇親会というと飲み屋ではなく,飲食店で夕食会というのが多かったように思います.

また,あったとしても参加者も3割から多くて6割と言ったところだったと思います.

ときには,懇親会があるのかないのかよくわからないときもありました.



この文化が悪いというわけではありません.



東京の勉強会は平日夜におこなうものも少なくありません.

また,勉強会の頻度も多いです.

さらに,参加者が多いということもあります.

人が多く,頻度も多いため,内容も濃いものになっていると思います.

これは関東の勉強会の良い所だと思います.

ただ,このような状況で,毎回盛大な懇親会しようとして,勉強会本体がお座なりになったら本末転倒なわけです.

なので,関東での勉強会の懇親会が盛大でないのも自然といえば自然です.



端的にいえば,関東の勉強会は岡山の勉強会よりも,勉強会自体に注力している印象です.



一方で,岡山の勉強会の懇親会の良さは,楽しく色々は人とコミュニケーションをとることができる点だと思います.

他の技術者と交流を深めるという点で,これは非常よかったと思います.

この点は,関東の勉強会にはあまりない良さなのかなと思います.








岡山を離れても変わらなかったこと




まぁ,なんと言っても

  • 彼女できない









今後やろうと企んでいること




大都会岡山では,Web系やJVM系言語の勉強会は活発なのですが,カーネルのようなシステムソフトウェアの分野はあまり活発でないように思います.



そう思った僕は以前,「岡山でLinuxカーネルと戯れる会」という勉強会を主催しました.

第1回 は僕が主催し,第2回 は僕の後輩が主催してくれました.

ただ,3回目以降が続かず,元気がない状態です.



岡山を離れた僕ですが,やはり岡山でシステムソフトウェア分野を活発にしたいと思うわけです.

ただ,つくばから岡山まで行って勉強会の主催をするのは厳しいわけです…



そこで,Webでカーネルのソースコードリーディングを配信してみたらどうだろうと考えました.

ソフトウェアを勉強する上で,ソースコードを読むことは非常に実り多いことです.

しかし,ソースコード,特にカーネルのソースコードを読むのは結構な労力がかかります.

なので,ソースコードリーディングを配信して,見てる人からの質問に答えたり,アドバイスをもらったりしながら読めればいいなと思ったわけです.



最近研究の都合でNIC周りを勉強しないといけないので,最初はNICドライバのコードを読みたいと考えています.

年内はバタバタしそうなので,年を越して1月中にしたいと思います.







最後に




列車の切符のことや,勉強会の違いなど,思いつくままにいろいろ書いてみました.



明日はpatorashさんの番となります.



--
My Emacs Files At GitHub

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

2013年6月30日日曜日

Linuxのコンソールの文字サイズを調整する方法.


Linuxをテキストモードで起動するときの文字サイズを調整する方法.

文字サイズを調整するために,コンソールの解像度を変更する.

解像度の変更方法は,ブートオプションに




video=800x600


のように,解像度を指定するオプションを追加する.




コンソールの文字を大きくしたい時は解像度を下げればよい.

逆に,コンソールの文字を小さくしたい時は解像度を上げればよい.








--
My Emacs Files At GitHub

2013年6月18日火曜日

make コマンドに常に指定のオプションを付与する設定

コマンドラインで以下を実行.

export MAKEFLAGS='<付与するオプション>'

これを実行すれば,makeを実行するときに常に指定したオプションが付与される.
ログインするたびにこの設定を有効にするには.bashrcなどに書いておけばよい.

-j2などを指定すれば,オプションの指定を忘れて無駄に長い時間かけてビルドする,といったことを防げそうだ.

wgetを並列に走らす


ダウンロード先がバラバラでかつ,それぞれのサーバが遠くのもので,ダウンロード速度が出ないようなときがある.

そんなときに便利な技.




まず,urls.txtに1行ずつダウンロード先のurlを書いておく.

そして,以下のコマンドを実行する.




xargs -P 20 -n 1 wget -nv < urls.txt


このコマンドで最大20個のwgetが並列に走る.

また,それぞれのwgetには引数が1つずつ渡される.







--
My Emacs Files At GitHub

Emacsで複数行に文字列を挿入する方法


Emacsで以下を実行




M-x string-rectangle


もしくは




C-x r t


で可能.

自動インデントが効かないときなどに複数行右にずらす(スペースをいれる)のに便利.

左にずらす(スペースを消す)ときは M-x delete-rectangle もしくは C-x r d でOK.





--
My Emacs Files At GitHub

2013年6月16日日曜日

Haskellのclassとinstance(Javaのイメージで理解)

すぐ忘れそうなので,忘れないうちにメモ.

HaskellのclassはJavaで言うinterface.
実装すべき関数の型を定義している.
classというのは,Haskellでこれを型クラスというから.

一方,HaskellのinstanceはJavaで言うinterfaceを継承したclass.
実際は型コンストラクタができる.

もう少し良い例えがあるかもしれないが,僕はこういうイメージで理解した.

参考URL: http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass

2013年4月28日日曜日

Brasero が起動しない問題への対処


動作環境(ディストリビューション)




Linux Mint 14 Mate(64bit版)






本題




UbuntuやLinux Mint上でisoイメージをCDやDVDに焼くときに,Braseroというアプリケーションを使う時があります.

しかし,これが起動しなくなる時があります.

Terminalから起動しようとすると以下のようにメッセージが出力されます.




$ brasero &
** (brasero:14601): WARNING **: An instance of Brasero is already running, exiting





どうやら,すでにBraseroが裏で動いてるから起動できない,ということらしいです.

なので,システムモニタなどを使って裏で動いてるBraseroのプロセスを終了して,再度,起動を試みると,ちゃんと起動しました.










--
My Emacs Files At GitHub

2013年4月5日金曜日

Emacs上で動作するTwitterクライアント(Twittering-mode)をインストールする


はじめに




この記事では,Emacs上で動作するTwitterクライアントである,Twittering-modeのインストール手順を解説する.

なお,Twittering-modeの使い方に関しては解説しない.

使い方に関しては,EmacsWiki: TwitteringMode-ja を参照するとよい.




インストール環境



今回Twittering-modeをインストールした環境を以下に示す.
OS: Mac OS X 10.7.5
Emacs: GNU Emacs 23.4.1


インストール手順





  1. twittering-modeのリポジトリをクローン

    Git を用いてtwittering-modeのリポジトリをクローンする.




    git clone git://github.com/hayamiz/twittering-mode.git


    Githubページ: https://github.com/hayamiz/twittering-mode

    リポジトリを丸ごと取ってくるのが嫌な人や,Gitを使いたくない人は,sourceforgeからダウンロードできる.









  1. Emacsの設定ファイルを編集

    Emacsの設定ファイルに以下の設定を追加する.




    (add-to-list 'load-path "展開したtwittering-modeディレクトリのパス")
    (require 'twittering-mode)
    (setq twittering-use-master-password t)


    3行目の twittering-use-master-password はtwittering-modeを起動する度にアプリの認証を行わないで済むようにするためのものである.

    twittering-use-master-password の機能を用いるためには GnuPG というものが必要である.

  2. GnuPGをインストール.

    GnuPGとは,公開鍵や秘密鍵なんかをいい感じに扱ってくれるものらしい(適当ですみません).

    ともかく, twittering-use-master-password の機能を用いるために必要なのでインストールする.

    GnuPGはMacPortsを使ってインストールできる.

    ターミナルで以下を実行する.




    sudo port install gnupg


  3. Twittering-modeを起動する.

    以上の手順を終えた後に,Emacsを再起動し, M-x twit と押下.

    すると,Twittering-modeが起動される.

  4. Twittering-modeを認証する.

    Twittering-modeを初めて起動するとき,Emacsのミニバッファに以下のメッセージが表示される.




    Open authorization URL with browser? (using `browse-url')(y or n) 


    このメッセージが表示されたら, y を押下する.

    すると,ブラウザでTwitterのページが開き,Twittering-modeを認証するか否か問われる.

    ここで,認証すると,PINコードが表示される.

    このPINコードをEmacsのミニバッファに入力する(コピペでOK).

    最後に,次回起動時から入力するパスワードを設定する.

    設定するパスワードを2回入力すると,Twittering-modeが起動し,Emacsにタイムラインが表示される.




    次回の起動からは,設定したパスワードを入力するだけで起動することができる.










おわりに




Twittering-modeのインストールの手順を解説した.







--
My Emacs Files At GitHub

2013年3月23日土曜日

Scalaのお勉強 第2回:「Scalaプログラミングの次の一歩」(前編)


はじめに




前回のScalaの記事から,1ヶ月半ほど経ってしまいました.

今回はコップ本の第3章「Scalaプログラミングの次の一歩」を読んだので,記事を書きます.

この第3章,内容をブログにまとめようとすると,結構な量になってきたので,記事を2つに分けようと思います.









パラメータ化




パラメータ化 = "生成するインスタンスの「構成を設定する」こと"

Javaで言えば,オブジェクトを作る時に,コンストラクタへ引数を渡すのと同じ(?)




val greetStrings = new Array[String](4)


上の例では, Array[String] 型のオブジェクトに (4) とすることで,長さ4の配列であると構成を設定している.

greetStrings の型が Array[String] であるのもポイント.









型コンストラクタ




Array は型コンストラクタと呼ばれるもの.

型コンストラクタに型変数を与えることによって,初めて型として成り立つ.

関数にいくつかの引数を与えて,値になるようなイメージで型を作る仕組み.

Haskellにもあった概念だと思う.









valで宣言した配列の書き換え







val greetStrings = new Array[String](4)    

greetStrings(0) = "Hello"
greetStrings(1) = ", "
greetStrings(2) = "world"
greetStrings(3) = "!\n"

for(i <- 0 to 2)
print(greetStrings(i))



greetStringsval で宣言している.

val で宣言したものは,再代入できない.

ところが,上記のコード例のように, greetStrings の要素には代入できる.

なぜなら, greetStrings の要素への代入しても, greetStrings には再代入していないためである.

もちろん, greetStrings = greetStirngs2 のような,再代入はできない.

これをCのポインタでいうと,ポインタ変数に格納しているアドレスは書き換えられないけど,ポインタが指す先にあるデータ領域は書き換えられる,ということである.

Cのコードで書くとこうなる.







char *const str1 = (char*)malloc(sizeof(char)*4);
char *str2 = (char*)malloc(sizeof(char)*4);

strcpy(str1, "ABC");
strcpy(str2, "DEF");

str1[1] = 'G'; //OK
str1 = str2; //Error








さまざまな糖衣構文




先ほど示したScalaのコード例の中には,様々な糖衣構文が存在する.


  • 0 to 2(0).to(2) の糖衣構文.


  • greetStrings(i)greetString.apply(i) の糖衣構文.


  • greetStrings(1) = "Hello" greetStrings.update(1, "Hello") の糖衣構文.


  • 1 + 2(1).+(2) の糖衣構文.




このように,さまざまなものが,メソッド呼び出しに変換される糖衣構文(syntax suger)である.






おわりに




今回はコップ本の第3章「Scalaプログラミングの次の一歩」を読んだまとめ(前編)を書きました.

後編はいつになることか…

あんまりがっつり書くと時間がかかるので,次回からもう少しはしょりながら書こうかと思ってます.




--
My Emacs Files At GitHub

Gitでコミット時にdiffが出るようにする


はじめに




Gitでコミットするとき,コミットメッセージを書きますね.

そのときに,実際の差分を見たいと思うわけです.

コミット時に差分を表示する方法は簡単ですが,すぐ忘れそうなので書いておきます.






方法




コミットするときに, -v をつけるだけです.

つまり




$ git commit -v


とするだけです.






おわりに




上記の方法で,めでたく差分を見ながらコミットメッセージを書けます.




--
My Emacs Files At GitHub

2013年2月24日日曜日

Edit with Emacsを試す


Edit with Emacsとは




Edit with EmacsというGoogle Extentionがある.

これは,Google chromeで開いたページ内のテキストエリアで編集するとき,Emacsを用いて編集することができる,というものである.

割と簡単に使える.






導入手順





  1. Edit with Emacs からEdit with EmacsをChromeにインストールする.


  2. Edit with EmacsのオプションのInformationにedit-server.elへのリンクがあるので,このリンクから,edit-server.elを入手.

    もしくは,githubの https://github.com/stsquad/emacs_chrome.git からリポジトリとともにedit-server.elを入手.

    githubから入手した場合,edit-server.elは emacs_chrome/servers/ 内にある.


  3. edit-server.elを置いたディレクトリをload-pathに追加し,edit-server.elをロードするようにする.


  4. 設定ファイルに以下を追加




    (require 'edit-server)
    (edit-server-start)



  5. Emacsを再起動.












使い方







Chrome側で,テキストエリアを編集する時にテキストエリアの下に小さく表示されるeditボタンを押下するか,chromeの右上にあるEmacsのアイコンを押下することにより,テキストエリアを編集するためのフレームが起動し,編集できる.

C-x C-sでテキストエリアに反映,C-x C-cで編集キャンセルである.






感想




テキストエリアで長文を編集するときは便利そう.

自分の場合はFC2ブログで記事を書くときなど.

Emacs側のモードをOrg-modeに変えれば,表や箇条書きも楽に書ける.




個人的には,C-x C-sでテキストエリアに反映する時に,フレームを閉じて欲しい.

しっかり使うなら,コードを弄って対策してみたい.













--
My Emacs Files At GitHub

2013年2月10日日曜日

Org-mode内に書いたソースコードを実行する


はじめに




Org-modeでは,プログラムを記述して,その場で実行するOrg-babelという機能がある.

今回は,この使い方が判明したので,書いておく(忘れないために).









使い方




まず,Org-modeで以下のように書く.




#+BEGIN_SRC emacs-lisp
(+ 1 2)
#+END_SRC



そして,SRCブロック内で \C-c \C-c と打つと,以下のように出力される.




#+RESULTS:
: 3









困ったことが…




使い方は単純であるが,何も設定しないとEmacs-lisp以外のソースコードは実行できない.

この設定が今まで面倒で使っていなかった.




今回は,この使い方が判明したので,書いておく.









Emacs-lisp以外でOrg-babelを使うには




Emacsの設定ファイル( ~/.emacs.d/init.el ) などに以下の設定を書く.




(org-babel-do-load-languages
'org-babel-load-languages
'((emacs-lisp . t)
(C . t)))





この例では,C言語を追加している.












結果




結果は以下の通り.







#+BEGIN_SRC C
int main(){
printf("Hello Org-babel!\n");
return 0;
}
#+END_SRC

#+RESULTS:
: Hello Org-babel!









おわりに




Org-babelの使い方を書いた.

慣れてないせいか,言語によって実行するまでにどの程度書かないといけないのかがよくわからない.

javaとScalaはどうも実行できない…













--
My Emacs Files At GitHub

2013年2月9日土曜日

Scalaのお勉強


はじめに




来年度から,Scalaを使うことになるそうなので,Scalaをちまちま勉強しています.

教材はこれ(通称コップ本).


この本の一つの章が終わるたびに記事を書こうと思います.

ちなみにこの本の章構成はこんな感じです.

コップ本の目次


基本的に,自分が気になったところだけ抜粋して書くつもりです.

僕は,C,Javaあたりの言語に親しみがある人間です.

あと,Haskellを勉強する機会もありました(あんまりわかってない疑惑あり).

ですので,これらの言語との違いや似ている部分を主に書くと思います.

あと,箇条書きが多いです.

今回は2章「Scalaプログラミングの第一歩」を勉強したまとめです.


saclaインタプリタの使い方

$ scala
     Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_07).
Type in expressions to have them evaluated.
Type :help for more information.
scala> 1 + 2
res0: Int = 3

scala> res0 * 3
res1: Int = 9

scala> :q

  • 先に計算した結果は自動で res0 などに格納される
  • 計算結果の Int などは結果のデータ型
    これは,Scalaインタプリタが型推論し導いている

変数,定数の使い方

scala> val hoge = 0
hoge: Int = 0

scala> var piyo = "piyo"
piyo: java.lang.String = piyo

scala> piyo = "piyopiyo"
piyo: java.lang.String = piyopiyo

scala> hoge = 1
<console>:8: error: reassignment to val
    hoge = 1
         ^

  • val <定数名> = <値>定数 を定義する.

    (val はvalueの意)
  • var <変数名> = <値>変数 を定義する.

    (var はvariableの意)

  • 定数と変数はともに,初期値なしで宣言できない.
  • 定数には再代入できない.
  • 宣言時にデータの型を明示する場合は
    val <定数名>: <データ型名> = <値>
    と定義する.
  • データ型名を変数の後ろに書くのは,型推論によってデータ型名を省略できるようにするため.
    (データ型名を前に置く文法にすると,省略したときに,宣言か否かの判別ができない.)

関数の使い方

scala> def add(x: Int, y: Int): Int = {
  |   x + y
  | }
add: (x: Int, y: Int)Int

scala> add(1, 2)
res0: Int = 3

scala> def hello() = {
  |   println("hello")
  | }
hello: ()Unit

scala> hello()
hello

scala>
  • 関数の宣言は以下のフォーマットである.

    def <関数名>(<仮引数名1>: <仮引数1のデータ型名>, ...): <関数の戻り値のデータ型名> = {関数本体}
  • '{'の前の'='の書き忘れに注意が必要.
  • 戻り値は関数本体の最後の式が返す値となる.
  • 関数の戻り値は型推論される.
  • 仮引数は 型推論されない.
  • Cなどの void 型に相当するものはが Unit である.

配列の参照

  • 配列へのアクセスは

    array(0)

    のように書く.

    array[0]

    のようには書かない.

コマンドライン引数

  • コマンドライン引数を格納するのは args という名の文字列の配列である.
  • args(0) はプログラム名ではない.

    cf. C言語の argv の最初の要素はプログラム名である.

foreach


args.foreach(arg=> println(arg))
args.foreach((arg: String) => println(arg)) //上と同じ処理を行う
args.foreach(println) //部分適用
  • (arg: String) => println(arg) の部分を関数リテラルという
  • 引数の型(上の例では arg の型)は省略できる
  • 引数の型を明示する場合は,引数を示す部分を括弧で括る.
  • foreach は引数に関数を取る,ということだと思う.
    関数型言語では,関数も値と同じように扱う.

for式

for(arg <- args){/*argを用いた処理*/}
  • for(<定数名> <- <配列名>){処理} でループが回るたびに配列の中身を定数に一つずつ入れ,処理する.

その他

  • scalaの推奨インデントはスペース2つである.
  • scalaでは ++ii++ は使えない

おわりに

というわけで,Scalaの最初の一歩を踏み出した感じです.

さて,いつまで続くでしょうか…



--
My Emacs Files At GitHub

2013年1月27日日曜日

Org-modeでタスク管理する時に使いそうなキーバインド(主に計時関連)


タスクを管理するとき,タスクの処理に掛かる時間を管理することも重要である.

Org-modeでは,タスクにかかる時間をはかり,記録するための機能がある.

この機能を用いるためのキーバインドを表にしておく.

ただそれだけの記事.


キー内容
C-c C-x C-i計時開始
C-c C-x C-o計時終了
C-c C-x C-j計時中のツリーに移動
C-c C-x C-d各ツリーの合計所用時間を計算 (C-c C-c で表示を戻す)
C-c C-s作業予定日を設定
C-c C-x C-e努力目標時間を設定









--
My Emacs Files At GitHub