Hatena::ブログ(Diary)

計算機と戯れる日々 このページをアンテナに追加 RSSフィード

2011-07-03

rubyの car,cdr もしくは haskellにおける head tail last init

rubycar,cdr もしくは haskellにおける head tail last initについて

haskellにおける head tail lastはそれぞれ

>> [1, 2, 3, 4, 5].first
=> 1
>> [1, 2, 3, 4, 5].drop(1)
=> [2, 3, 4, 5]
>> [1, 2, 3, 4, 5].last
=> 5

だとおもう。でもなんかinit(最後の要素をのぞく)がmodule Enumerableになさそう。

>> module Enumerable ; def init ; self.take(self.size-1) ; end; end
=> nil
>> [1, 2, 3, 4, 5].init
=> [1, 2, 3, 4]

なんでないのかな。せめて drop_from_last(n)みたいなのでもあればいいのに…(last->behindかな?)

2010-10-02

emacs + ghc-modにおいて TABを補完 Shift-TABをindent-cycleにする

GHCiはTabで補完するのにemacsがM-C-iでは耐えられない。

そこで

tab -> 補完

shift+tab -> インデント

とやってみる

haskell-mode は aptitudeで入れる

$ sudo aptitude install haskell-mode

ghc-modインストールしておく

.emacsへ以下を追加する

;;for haskell-mode                                                                                  
(load "haskell-site-file")
(add-hook 'haskell-mode-hook 'turn-on-haskell-doc-mode)
(add-hook 'haskell-mode-hook 'turn-on-haskell-indent)
(add-hook 'haskell-mode-hook 'font-lock-mode)
(add-hook 'haskell-mode-hook 'imenu-add-menubar-index)
(add-hook 'haskell-mode-hook (lambda () (local-set-key [f5] "\C-c\C-l\C-x\omain\C-m\C-xo")))
(autoload 'ghc-init "ghc" nil t)
(add-hook 'haskell-mode-hook (lambda () (ghc-init)))
(add-hook 'haskell-mode-hook (lambda () (local-set-key "\C-i" 'ghc-complete)))
(add-hook 'haskell-mode-hook (lambda () (local-set-key [backtab] 'haskell-indent-cycle)))

2010-08-31

ghc-mod をインストールして夢のemacs上でhaskellプログラムを補完

ghc-modインストールして夢のemacs上でhaskellプログラムを補完

http://www.mew.org/~kazu/proj/ghc-mod/en/インストールしようとおもう。

ubuntuのデフォルトパッケージでやることはあきらめた。

なるべく最新のGHCにして(6.12.2) cabalでいろんなものをインストールした。

プロクシを使う場合には export httpproxy=http://サーバ:ポート/ を設定しておけばOK

$ cabal install ghc-mod

あっさり。なんじゃそりゃ。

$ cd ~/.cabal/share/ghc-mod-0.4.4/
$ make
$ cp ghc* ~/.emacs.d/elsip

あとは.emacsに以下を書き込む

(autoload 'ghc-init "ghc" nil t)
(add-hook 'haskell-mode-hook (lambda () (ghc-init)))

a.hsを読み込んで実験 M-C-tだから ALT-TAB.... あ、ウインドウが切り替わったorz

ESC-Tab おーすげー 補完する!

ghciがtab補完だからキーマップ変えようかな…


追記 2010/09/01 12:49:44:

ubuntu10.04でやるには全パッケージの入った6.12.2をもってきて ~/ghc-6.12 にインストールする。

$ wget http://www.haskell.org/ghc/dist/6.12.2/ghc-6.12.2-i386-unknown-linux-n.tar.bz2
$ tar xvf ghc-6.12.2
$ cd ghc-6.12.2
$ ./configure --prefix=$HOME/ghc-6.12

ここで足りないパッケージがあったら適宜インストールする

$ sudo make install

確認する

$ ~/ghc-6.12/bin/ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.2

パスを~/.bashrcに追加する。

~/.bashrcに以下を追加

if [ -d "$HOME/ghc-6.12/bin" ] ; then PATH="$HOME/ghc-6.12/bin:$PATH" ; fi
$ source ~/.bashrc
$ which ghc
/home/n9d/ghc-6.12/bin/ghc

最新のcabal-installを入れる

$ wget http://hackage.haskell.org/packages/archive/cabal-install/0.8.2/cabal-install-0.8.2.tar.gz
$ tar xf cabal-install-0.8.2.tar.gz
$ sh bootstrap.sh

途中でこけたときには libgmp3-dev zlib1g-devのインストールが必要かも

パスにいれろって言われたので前回と同じく ~/.bashrc に以下を追加

if [ -d "$HOME/.cabal/bin" ] ; then PATH="$HOME/.cabal/bin:$PATH" ; fi

2010-02-07

現在の法律の数を調べる

http://law.e-gov.go.jp/announce.html#shinki

ここを見ると「7,384 法令」とある。

こんなにあるんだよな。

では実際に 法令データ提供システム にて全量を調べてみる。

require 'nkf'
require 'net/http'
require 'uri'
require 'cgi'
awa="あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわ"
url = URI.parse('http://law.e-gov.go.jp')
res = nil
n=awa.split(//).map{|i|
  res=Net::HTTP.start(url.host,url.port){|http|
    http.get("/cgi-bin/idxsearch.cgi?H_NAME_YOMI_SUBMIT=#{CGI.escape(NKF.nkf('-s',i))}&H_YOMI_GUN=1&H_NAME=0&H_NO_GENGO=H&H_NO_YEAR=0&H_NO_TYPE=2&H_NO_NO=0&H_RYAKU=1&H_CTG=1&H_CTG_GUN=1")
  }
  NKF.nkf('-w',res.body)
}.map{|i|
  if /該当件数(.+)件/=~i
    $1.strip.to_i
  else
    0
  end
}.inject(0){|r,i|r+=i}
puts n

実行してみると7539となり若干ちがう。

もしかすると 「2 施行停止法令、整備法令等の法令数については、上表には計上しておりません。 」にはいっているのかな?

2009-01-22

ubuntu8.10上でrubyによってCDのトレイの状態を調べる

以下を実行すると

1
ディスクが入っていないとき
2
トレイが開いているとき
3
ドライブまちのとき
4
ディスクが刺さっているとき

が返ってくる。

ruby

今のところrubyが一番使いやすそうだな。

ioctlの番号は/usr/include/linux/cdrom.hを参照のこと

>> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io| puts io.ioctl(0x5326)}
1
=> nil
>> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io| puts io.ioctl(0x5326)}
2
=> nil

ちなみにejectとcloseは

>> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io|io.ioctl(0x5309)}
=> 0
>> IO.open(IO.sysopen("/dev/cdrom",File::NONBLOCK)){|io|io.ioctl(0x5319)}
=> 0

perl版

うまくできない。sysopenでトレイが閉じてしまう。そうか、perlのsysopenはopenで実装されているので…

$ sysopen(fd,"/dev/cdrom",O_RDONLY|O_NONBLOCK);$buf="";print ioctl(fd,0x5326,$buf)
1

C版

まあ、普通に考えるとこれだよな。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/cdrom.h>
int main()
{
  printf("%d\n",ioctl(open("/dev/cdrom",O_RDONLY|O_NONBLOCK),CDROM_DRIVE_STATUS));
}