2009/10/27

Haskell その2

今度はリストを逆順にする関数を作る。

module Main where
import Text.Printf

main = do print (reverse([1,2,3,4,5]))
print (reverse1([1,2,3,4,5]))
print (reverse2([1,2,3,4,5]))
print (reverse3([1,2,3,4,5]))
print (reverse4([1,2,3,4,5]))

reverse1 x | length x == 1 =x
| length x > 1 =reverse1(tail x) ++ head x:[]
reverse2 (x:xs) | length xs == 1 =xs++x:[]
| length xs > 1 =reverse2(xs)++x:[]
reverse3 x=foldl (flip (:)) [] x
reverse4 =foldl (flip (:)) []
最初のreverseは最初から定義されている関数で、その名の通りリストを逆順にする。
reverse1 x | length x == 1 =x
| length x > 1 =reverse1(tail x) ++ head x:[]
これは引数xの長さが1ならxをそのまま返し、xが1より大きければxの先頭の要素を除いたリストを逆順にしたリストにxの先頭の要素を連結した結果を返す関数である。
++はリストの連結を行う演算子で:はリストの先頭に要素を追加する演算子である。
[]は空リストである。
reverse2 (x:xs) | length xs == 1 =xs++x:[]
| length xs > 1 =reverse2(xs)++x:[]
この関数は、リストを引数に取り、その先頭をxに、それ以外をxsとする。
xsの長さが1のとき、xsとxを連結したリストを返す。xsの長さが1より大きいとき、xsを逆順にしたリストにxを連結したリストを返す。
xsのsは英語の複数形で、こういう命名規則なのだそうだ(がどこで見たのかは忘れた…)。
別に従わないとコンパイルが通らないというわけではない。
reverse3 x=foldl (flip (:)) [] x
この関数も引数にリストを取り、それをxとする関数である。
これもリストxを反転した結果を返す関数であるが、少しややこしい。
foldlは引数を3つ取り、第3引数のリストの左側の要素から順に処理を行う関数である。
その処理をC言語風に書くと、第1引数を+、第2引数をa、第3引数のi番目の要素をx[i]、処理結果をrとして、
r = a
for(i=0; i<length x; ++i)
r = r + x[i]
return r
のようになる。

flipは2引数関数の引数を入れ替える関数である。f(x,y)ならf(y,x)になる。
:は右側(第2引数)にリスト、左側(第1引数)に追加する要素を書くが、そのままではfoldlが演算子:を呼び出すときに左右が逆になってしまう。そこで、flipを使って逆向きにする。

以上より、引数で与えられたリストの先頭の要素から順に新しいリストの左側に追加していくという処理になっており、リストの順序が逆向きになることがわかる。

reverse4 =foldl (flip (:)) []
この関数は、foldlの第3引数が指定されていない関数になっている。つまり、reverse4は引数を1つ取る関数である。
foldlの第1,第2引数が指定されている関数であるともいえる。

ああ、ややこしい。

2009/10/25

Haskell その1

erlangはネイティブのバイナリファイルが生成できなかったので、
今度はそれができるHaskellを試してみた。

C++系統の言語とは異なりすぎているので、
なかなか慣れるまでに時間がかかる。
とりあえず、絶対値を求める関数を作った。

module Main where
import Text.Printf

main = do printf "abs -10 is %d\n" (10::Int)
printf "abs -10 is %d\n" ((abst (-10)) ::Int)
printf "abs -20 is %d\n" (absi (-20))

abst x = if x < 0 then -x else x

absi :: Int -> Int
absi x = if x < 0 then -x else x

順に説明する。調べ始めたばかりなので、
間違いが混じっているかもしれない。

 module Main where
はプログラムのエントリポイントを指定している。
C++で言うところのmain関数の名前を指定している。
 import Text.Printf
printfを使うために必要
 main = do
これ以降にメイン関数の定義を書く。
printfは書式付の関数。10::IntはInt型の数字として10を使用することを明示している。明示しないとコンパイルエラーになる。
先に、abstとabsiについて説明する。
abst x = if x < 0 then -x else x
これは、引数xを取る関数abstの定義であって、もしxが0より小さければ-xを、そうでなければxを返すことを表している。
absi :: Int -> Int
これはabsiの関数の宣言でInt型の引数を取り、戻り値の型もIntであることを宣言している。
absi x = if x < 0 then -x else x
はabsiの定義であり、内容はabstと同じ。
printfの説明に戻る。
printf "abs -10 is %d\n" ((abst (-10)) ::Int)
abstに-10を引数として渡して、得られる値を出力するということである。
-10を()で囲っているが、囲まないと-と10が分かれてしまってエラーとなる。
さらに::Intで戻り値の型を指定している。
abstは関数の定義だけを行って、型がどうなっているかの宣言を記載していないので、ここで明示しないと型が曖昧だと言われ、エラーとなる。
printf "abs -20 is %d\n" (absi (-20))
こちらは::Intが不要である。関数の宣言で戻り値がIntであることを明示しているためである。

その他、コードを書くときのルールであるが、インデントによってブロックの範囲が決められる。
タブの使用には注意が必要である。
うっかりスペース4個のタブを使うとコンパイルエラーになる。
スペース8個のタブなら問題ない。

2009/10/18

サイレンサー(ただし戦車砲の)

http://gigazine.net/index.php?/news/comments/20091018_tank_silencer/
(笑)
砲身の先にながーいのがくっつくのかと思いきや、
ぶっとい!
こんなの↓

    ■■■
    ■■■
    ■■■
■■■■■■■  □□□
■■■■■■■――□□□
■■■■■■■  □□□
    ■■■
    ■■■
    ■■■
□:戦車本体
―:砲身
■:サイレンサー

実験用らしい。当然だが。

2009/10/10

世界の大学ランキング

今年の世界の大学ランキングが出ていた。
http://www.topuniversities.com/university-rankings/world-university-rankings/2009/results

上位の大部分はアングロサクソン系。
日本の大学で100位以内を抜き出すと、
=====
東京大学 22位
京都大学 25位
大阪大学 43位
東京工業大学 55位
名古屋大学 92位
東北大学 97位
=====

時系列で、総合ランキングの順位の変化を見てみた。
下位の大学(といっても、世界で見てだが)が徐々に
順位を上げている。

分野別のデータもあったので、それらもグラフにしてみた。
まずは、自然科学。総合順位とあまり大差ない。


次に工学とITのランキング。工業大学というだけあって、
東京工業大学が順位を伸ばしている。

最後に、ライフサイエンス系。
上位3大学とそれ以外の差が大きい。
なぜだろう。資金力の差なのか!?

2009/09/23

温室効果ガス25%削減

日本は温室効果ガスを1990年を基準に25%削減するらしい。
いつも思うのだが、
(1)なぜ1990年を基準とするのか。
(2)25%削減するとどうなるのか。
の2つが報道されない。

(1)は1人あたりの排出量のほうが公平だし、
(2)は達成できても今より温暖化は進む。

もちろん、1人あたりで計算すると先進国が極めて
不利だからだろうし、達成基準なんて「えいやっ」
って決めてるだけだろう。
どうなるかの予測はしてるだろうが。

2009/02/14

テトぐるみ

消波ブロック(「テトラポッド」は商標)のぬいぐるみ。
猫の枕にいいらしい。
数十個あれば、部屋の中が海岸っぽくなるかも!?

テトぐるみの写真
http://blog.livedoor.jp/sohsai/archives/51464356.html

ここで買えるらしい。
http://www.syumatutanken.net/200810/cgi-bin/shop/main.cgi?class=all&word=%83e%83g%82%AE%82%E9%82%DD

2009/02/11

C++0xの右辺値参照

右辺値参照の詳しい説明がここに。
http://blogs.msdn.com/vcblog/archive/2009/02/03/rvalue-references-c-0x-features-in-vc10-part-2.aspx

そしてありがたいことに日本語訳がここに。
http://d.hatena.ne.jp/ntnek/20090210/p1

これでもわからなければ、記事を参照しながら
gccで色々試せばよさそうだ。

2008/12/01

円グラフの見せ方

http://www.voltagecreative.com/blog/2008/11/scary-bailout-money-info-graphic/

め、目立つ。
やってることは簡単。

1位の項目が50%を占めていて、2位以下が残りを分け合っているときには、
円グラフを二つ書いて、片方は全て同じ色に塗りつぶして1位のみに割り当てて、
もう片方は2位以下のものを記入する。
1位の円グラフの色は目立つ色がよさそうだ。

まぁ、1位が50%になるように調整するのが難しいだろうが。

2008/10/23

ARM

ARMプロセッサの概略記事があった。
http://techtarget.itmedia.co.jp/tt/news/0810/23/news03.html

かいつまんでみると、

- 命令セット(アーキテクチャ)の名前の数字とプロセッサの名前の数字が
リンクしていない。
- バージョンが上がるほどパイプラインの段数が増えている。
ARMv3のころは3段、ARMv7では13段。
- パイプラインの段数増加に伴い、分岐予測機能が追加されている。
- ARMv6以降にはSIMD命令がある。
- Javaのバイトコードをネイティブ実行できる。

といったところだ。

2008/10/19

quilt

パッチ管理用スクリプト quilt というのがある。
https://savannah.nongnu.org/projects/quilt

使い方については、このページのDownloadから一番新しい
バージョンを取得し、それを展開するとドキュメントがdoc/以下に
できるので、それを参照すればよい。


ところで、googleでquiltで調べたのではなかなか
このページには行き着けない。
本当のキルトのページに行き着いてしまう…

2008/09/30

「食指」と「触手」

http://www.asahi.com/international/update/0930/TKY200809290353_01.html
タイトルが「…に仏も触手。」なんだが、
触手?食指?後ろがないといまいち分かりづらい。

gooの辞書によれば、
# 食指が動く:興味・関心をもつ。してみたい気持ちが起こる。
# 触手を伸ばす:自分のものにしようとして近づく。
だそうで、意味が似ているし、どっちでもよさそう。

2008/09/24

ホウレンソウ

そうかぁ、「ホウレンソウ」の意味は
「優柔不断に決断を先伸ばすこと」なのか。
http://www.doblog.com/weblog/myblog/17090/2615719#2615719

笑える。
確かに、報告して、連絡して、相談、するだけだったら、
何も決まらんもんな。

2008/07/20

WinXP SP3

SP3を当ててみた。
関連付けをことごとく壊してくれた。

.aviや.mpegの関連付けmplayer2にしていたのに
Windows Media Player 9 に再度割り当てられた。

そのうえ、Explorerの関連付けの設定からでは
どうやっても変更できず、mplayer2の関連付けの
設定部分でしか関連付けの変更ができない。


いったいどういう神経してんだか…
しょうもないところでいらん変更するなっつーに。

2008/07/19

ナノテクと電波で癌治療

新しい癌の治療方法が研究されているようだ。
http://wiredvision.jp/news/200807/2008071821.html
http://peswiki.com/index.php/Directory:John_Kanzius_Produces_Hydrogen_from_Salt_Water_Using_Radio_Waves

これまでは、放射線治療や化学療法や外科的な
処置が行われていたが、この方法が治療として
認められれば、かなり画期的なのではないだろうか。

その方法とは、ナノ粒子を癌細胞まで血液に乗せて運び、
そこに電波を当てることで、電子レンジのように
癌細胞を加熱して死滅させる方法だ。

ナノ粒子を使わない方法であれば、日本でも研究はされているとのこと。
http://www.okayama-u.ac.jp/user/ra1/forefront_rfa.htm

この方法については既に米CBSテレビで取り上げられている。
http://www.cbsnews.com/sections/i_video/main500251.shtml?id=4011961n?source=mostpop_video

2008/06/15

XAML でのアニメーション

XAMLのアニメーションについて分かったことをまとめる。

(1)
アニメーションには TargetProperty の型ごとに種類がある。
 DoubleAnimation : 型がDouble用
 SingleAnimation : 型がSingle用
 Int32Animation : 型がInt32用
 Int16Animation : 型がInt16用
 ColorAnimation : 型がColor用

基本的な型に対してこれ以外にも同様に存在する。

これらは AnimationTimeline を継承しているので
以下、各型に対するアニメーションの総称として
AnimationTimeline を用いる。

(1)
AnimationTimeline を管理するオブジェクトは<BeginStoryboard>である。
これが DoubleAnimation 等で指定する TargetProperty とリンクする。

リンク前の値を AnimationTimeline は憶えていて、
AnimationTimeline が破棄されると TargetProperty は元の値に戻る。

(2)
AnimationTimeline の FillBehavior に "HoldEnd" が指定されていると、
アニメーションが終わっても TargetProperty の値は最後の値が保持される。

"Stop"が指定されていると、アニメーションが終わると
該当する AnimationTimeline が破棄され TargetProperty は元の値に戻る。

デフォルトは"HoldEnd"

(3)
同じプロパティに対してEventTrigger と DataTrigger の両方を
設定し、さらにどちらにも FillBehavior="HoldEnd" としておくと、
EventTrigger の AnimationTimeline が優先される。

一度 EventTrigger によるアニメーションが発生すると、
そのままでは DataTrigger の AnimationTimeline は実行されない。

EventTrigger同士であれば、AnimationTimeline は
新しいものに書き換えられる。

(4)
EventTrigger によるアニメーション実行後に同じ TargetProperty に対して
DataTrigger によるアニメーションを有効に機能させるには、EventTrigger による
アニメーションを StopStoryboard によって破棄する必要がある。


具体的には次のようにすれば EventTrigger と DataTrigger が共存できる。

<EventTrigger RoutedEvent="Mouse.MouseEnter">
<BeginStoryboard Name="Test1">
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
To="1.0" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
<DataTrigger Binding="{Binding XPath=@AAA}" Value="XXX">
<DataTrigger.EnterActions>
<StopStoryboard BeginStoryboardName="Test1"/>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetProperty="Opacity"
To="0.5" Duration="0:0:1"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>

2008/06/07

ListBoxでのホイールイベント (XAML)

マウスホイールのイベントをListBoxで取得するには、
  MouseWheel
ではなく
  PreviewMouseWheel
を使う。

MouseWheelはボタンなど他のコントロールでは有効だが、
ListBoxに関してはなぜか反応しないためである。


具体的には、
<ListBox Width="100" Height="100"
PreviewMouseWheel="MouseWheelHandler">
<ListBoxItem Content="AAA" />
<ListBoxItem Content="BBB" />
</ListBox>

のようにする。MouseWheelHandlerはC#で次のようなものを書けばよい。
private void MouseWheelHandler(object sender,
MouseWheelEventArgs e)
{
if(e.Delta > 0)
{
//前方に回転
}
if(e.Delta < 0)
{
//後方に回転
}
}

2008/06/03

ガソリン価格

街中のガソリンスタンドの価格を見てると、
ガソリン価格がどんどん上がっている。
店頭で1Lあたり170円くらいかな?
このまま行くと200円を超えそうだ。

でも、もっともっと上がればいい。
そうすればCO2の排出量が減って長期的には環境にはよいだろう。
市場原理で環境負荷が下がるなんて、なんてうまいシステムなんだ。

さらに毎年ガソリン税を上げていったほうがいいのではないだろうか。
加速度的に環境負荷を下げれるかもしれない。

今のシステムorフレームワークで商売をしている人たちには痛い話かもしれんが、
新しく台頭してくる企業もあるだろう。

車の使用コストが上がると、車がないと生活できない田舎が問題になる。
これは解決が難しいかもしれない。

2008/05/25

プラスチック分解バクテリア

http://www.technobahn.com/cgi-bin/news/read2?f=200805242225&page=2

プラスチックを分解するバクテリアの分離ができたらしい。
こんなのが空中浮遊して大量拡散したらまるで、

「終末のプロメテウス」 ISBN-10: 4150112339

のような話になるなぁ。
この小説の内容は確か記憶では、

1. 原油流出事故が発生
2. 原油を分解するためのバクテリアを散布
3. 予想外に拡散して、車がガス欠し始める。
4. ガソリンスタンドなどからもガソリンなどが消える。
5. プラスチック製品が分解され始める。
6. ほとんどの工業製品が動かなくなる。
7. みんな原始的な生活に…

とかいう話だったはず。

2008/05/17

米国税関、PCのデータをまるまるコピー

http://www.technobahn.com/news/2008/200805161507.html
より。

米国入国時にPCを持っていると、HDDの内容を全てコピーされるようになるらしい。
もしHDDの容量が1GBくらいあったら、コピーされるまでずーっと待たされる
ことになるのだろうか。何時間もかかりそうなんだが…


そもそも、この大量のストレージを準備する予算っていくらくらいなんだろう?

というわけで調べてみた。

http://www.dhs.gov/ximgtn/statistics/publications/YrBk06NI.shtm
の"Nonimmigrant Admissions: Fiscal Years 1997 to 2006"によると

Year Total nonimmigrant admissions
1997 2億3590万人
1998 2億3570万人
1999 2億4070万人
2000 2億4750万人
2001 2億3140万人
2002 1億9320万人
2003 1億8050万人
2004 1億8020万人
2005 1億7530万人
2006 1億7510万人

なので、仮にこのうち1%がPCを持ち込むとしても、
2006年なら1,7510,0000×0.01=175,1000台

1台あたり100GB搭載しているとすると、
175,1000台×100GB=1,7510,0000GB=17,5100TB

保存期間を1ヶ月とすると、
17,5100TB/12=1,4592TB

http://gigazine.net/index.php?/news/comments/20080329_1tb_hdd/
によると、1TBのHDDが2万円を切ったとのことなので、
仮に1TBあたり1万円とすると、
1,4592万円=1.5億円。

意外と安い…
多めに考えて10倍くらい必要になっても15億円か。

2008/04/25

ハイスピードカメラ

別に宣伝するつもりはないが、
1200fps, 336×96pixel で動画の撮影ができるデジタルカメラ。
価格は10万円前後。
http://dc.casio.jp/product/exilim/ex_f1/hispeed_mov.html

なかなか面白い映像が撮れそうだ。