久しぶりのubuntuインストール(なかなか手間取る)

久しぶりのubuntuのインストールに大変手間取った。
試行錯誤を色々したが、結局「インストーラーを安定的に動作させ続けるためには、カーネルから吐かれる『(今の私にとっては無駄な)大量のエラーメッセージ』を抑制するために、起動時のオプション設定が必要」ということだった。
オプション設定情報を記したブログ主様には感謝感謝感謝。
対象はAsusのデスクトップ。でも、中身はノートPC。

●結論

下記ブログにある通り、「PCIe Bus Error: severity=Corrected, type=Physical Layer, id=00ea(Receiver ID) を吐きまくる」は、インストール後のカーネルの動作のようだが、きょうびのインストーラー(広義)はCD/USBからふつうのカーネルを立ち上げているので、インストールディスクから立ち上げたカーネルも同様にエラーメッセージを大量に吐きまくる。そのため、インストーラーが途中で動作しなくなる(できなくなる)というのが原因であったと思われる(推測)。
https://weblog.hirohiro716.com/?p=1497

上記ブログにはgrubに・・・
/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash pci=nomsi"
GRUB_CMDLINE_LINUX="pci=noaer"
と書く、とされている。これを参考に、ブート時のオプション設定に、
quiet splash pci=nomsi pci=noaer fsck.mode=skip
と書いてみた。pci= を二つ書いている意味があるのかどうか分からないが、解釈できないオプションは無視されるだけで悪の副作用はないだろうと言うことで書いてみた。
なお、こうして書くと前だけ解釈して後ろを捨てる可能性などもあるので、前後を入れ替える意味はあるかも知れない。

結果として、これにより、安定してカーネルが立ち上がり、円滑なインストールが実行できた。
なお、インストール後も起動すると大量にこのログを吐くので、grubに同様のオプションを記した。

原因解明までに色々試したが、以下のような手順で解明できた。

  1. 色々と無駄に試した(恨みがましく後述)。
    CDよりUSBから立ち上げた方が若干インストーラーが停止するまでに時間がかかることがわかった。
    だが結局どちらも停止はすることもわかった。
  2. Gnomeログイン後にターミナルを立ち上げ(Ctrl+Alt+T)、ジョブ・ログ監視を実施
    TOP による各種プログラムの動作状況の確認
    tail -f /var/log/installer/debug によるインストーラーのエラーメッセージの確認
    dmesg によるLinuxの起動状態の確認
    これらにより、systemd-journalの負荷率が高くなっており(CPUの100%近くを使用)、「PCIe Bus Error:」メッセージが大量に吐き出されていることがわかった。
  3. ログの内容で検索し、上記ブログを発見!!!

上記起動オプション設定後は、「PCIe Bus Error:」エラーメッセージは抑制され、カーネルおよびインストーラーは安定動作するようになった。

おそらく、仮想的にメモリ上にディスクを作ってそこにエラーを書いているので、そこが一杯になっているのかも知れないし、あるいは大量のメッセージを書きながら、インストール用のイメージを展開するのが追いつかなくなるのかも知れない。

なお、1パスで解明できたわけではなく循環的試行錯誤?をしているのだが、それを書いても仕方がないし記憶もないので、単純化(美化)している。

●試行錯誤の過程(涙)

  • 4バージョンのインストール
  • usbインストールとCDインストール
  • cdドライブの交換
  • usb自体の交換(元からあった2つに加え、1つ買っちまった)
  • usb/CDからの起動時のオプションの試行(Safe モードの選択等)
  • WindowManagerの試行(GnomeとFxce4)

すべて無意味。まあ、USBメモリはたった500円でもあり外でも使うかも知れないのでまあ良いだろう。

●感想

例によって ubuntu/linux/unix は快適。ただし、インストールさえできれば。

  • 設定類はすべてテキストファイルなので、コピペで設定を持ってこられるし、該当部分を検索で見つけるのも、じっくり眺めるのも簡単。 (windowsで設定を探すためにボタンやタブを選び続けるのは苦痛)
  • マシン移行も基本ファイルのコピペ。所有者等の変更も簡単。
  • 多数のソフトウェアを選び放題。aptで瞬時にインストール。
  • ふつうの作業はすべてunix*上で可能。
  • MS-OfficeやVBAが動かないていど。
  • でも、数ページ程度の文書作成ならばLibreOfficeで良いんじゃないかと思っている。

何事であれ障害対応に状態監視は重要。インストール時は特に。インストーラーが隠蔽体質なので、ちょっと困った。まあ、妙なメッセージを垂れ流しにしてもふつう困るではあろうが。

Continue reading "久しぶりのubuntuインストール(なかなか手間取る)"

| | Comments (0)

伝説のバグ

昔の職場であったバグの話。

その職場ではC言語が使われていた。若手が「C言語の標準ライブラリ(たしか stdio.h)内でエラーが出る」と言い出した。

で、職場で大騒ぎになって、手が空いているものは、全員でバグの究明に当たることになった。若干野次馬根性の気味無きにしもあらず。

その疑似コードは以下の如し:
include MyInclude.h
include stdio.h
main(){
何らかの処理
}

で、確かにコンパイルすると症状が再現される。間違いなく「C言語の標準ライブラリ(たしか stdio.h)内でエラーが出る」と言って良い。

しかし、世界中で使われている標準ライブラリでこんなにも簡単にエラーが出るということは非常に考えにくい。

ということで、答えは、以下のようにMyInclude.hの中で「コメントを開始したが終了していなかった」のが原因であった。その結果、「stdio.hの本当はコメントではない部分が、コンパイラ(正確にはプリプロセッサ)によってコメントとして解釈されてしまった」ということであり、そのためにマクロ呼び出しで「エラー:このマクロ未定義じゃん」ということになった(と記憶している)。

MyInclude.hの中身
プログラムとしての何らかの記述・・・
/* --- コメント開始
   コメントを閉じないままに、このファイル終了

stdio.hの中身
本当はコメントでないマクロ定義等プログラムとしての記述

/* --- 真のコメント開始
    コメント終了 --- */
「本当はコメントでない云々」で定義されたコードを呼び出し。

ということで、職場内を大騒ぎにした「標準ライブラリ内のエラー」は終息した。
その職場には「バグ取り名人」がいて、「取れないバグがあったら持ってきて欲しい。バグ取りはパズルのようで面白い」というものすごい御仁であったが、このバグだけは私が先に見つけたのであった。私にとってたった一度の勝利なので、あれから十年以上経ったのに、よく覚えている。

教訓としては、「標準ライブラリの前に自分のライブラリを読み込むな」とするのが良いと思う。もちろん、種々の事情を勘案する必要はあろうと思うが、ふつうの状況であれば、これによりデバグが楽になると予想する。

もうC言語を使わなくなって久しい。私の考えるC言語は、もはや「古典」の類であろう。私が良いと思った書を挙げておくが、これらすでに古典的良書に類するのであろう。

Cプログラミング専門課程 藤原博文
 ポインタ(その技術的中身とC言語としての表記方法)に特化して書かれた書
 特にポインタに関する「実験」についての記載が良い。
 こうした「実験」はどんな言語でも使えるし、使うべきであるが、なかなかこれについて書かれたものを見ない。
 その点でも良書と思う。

デーモン君のソース探検―BSDのソースコードを探る冒険者たちのための手引き書 氷山素子
 C言語一般ではなく、Unixの一種であるOSのソースコードに関する手引きである。
 どうするとソースコードを見ることができるか、ソースコードの読み方・考え方。また、ソースコードを見る価値についてもよく書かれており、非常な良書と思う。これまた、どのようなプログラム言語でも通じる技術について書かれた本である。
 これを絶版にしてどうする、と言いたいほどのもの。
 デーモン君が泣き虫、ママのツッコミが厳しすぎる、パパが理想化され過ぎ、等の感想がなくはないが、それは本質とは関係ないのである。

C言語プログラミングレッスン 結城浩
 結城浩氏の書物はいずれも正確さ・わかりやすさの双方の意を払ってあり良書と思う。C言語について結城本をきちんと読んだことがないものの、新人教育用にざっと見た限り非常な良書と感じた。

C言語の書物はたくさん出版されているが、「たくさん出版されている」場合、「どれもこれも一長一短・玉石混交」ということがよくあるので、その点は注意が必要であろう。もちろん、読者と書物のレベルが会わないと良書でも無用の長物になるので、その点も注意が必要である。
いずれにせよ、Cの規格はどんどん新しくなっており、これら古典的C言語の古典的良書がどれだけ有効であるか、現役でC言語を使っていない私には判断できない。

今さらこんな事をネット上に書いても新味も何もないけれど、暇つぶしの徒然に昔の思い出を書いてみたものである。

Continue reading "伝説のバグ"

| | Comments (0)

ubuntu LTS を 16.04 に上げる。

常用PCはWindows7とUbuntuの選択ブートとしている。

Ubuntu 14.04 LTSで長く使ってきたが、16.04にアップグレードしないかと言われたので、素直に「はい」としたところ、少々面倒があったので、記録しておく。

通常のアップグレードが進んで行く途中、「データが無くなるかも知れないから、アプリを立ち上げるな」と言われているのを無視して、FireFoxを立ち上げて、ウェブを見て遊んでいた。「なくなって困るデータがローカルにあるわけではないから」ということで。

ところが、途中、Firefoxの再起動アラートに対し「はい」を選択したところ、FireFoxとともに、Xwindowシステムが落ちてしまった。

コマンドライン(Alt+F1 と Alt+F2 )でのログオンができたので、それらしいプロセスが動いているか確かめたところ、アップデート関係のプロセスはいないようだったので、リブートしてみる(このあたり判断を誤っていると思う)。

リブート後、X windowは立ち上がらず、やはりCUIログイン。aptitudeが使えないので、apt-get install aptitudeを試すと、文句を言われる。apt-get -f install (何もなし)をせよということで、これを実施すると、多数のプログラムがインストールされる。

aptitudeも入ったようなので、確認のつもりでaptitude updateとaptitude upgradeを試すと、先ほどと同じプログラムらしきものが、再度大量にインストールされる。その際、いくつか質問されるので、適当に答えておく。

そうしてきれいにインストールが終わって再起動をかけたところ、通常のXログイン画面が出てきて、普通にログインできた。個人設定も概ね保存されているようだ。(Xfceのデスクトップ画面が変わっていたけれど。)

ということで、万一、Ubuntuのアップグレード中にXごと落ちてしまった場合、コマンドラインから、apt系コマンドを再度実行すればきっと大丈夫であろうと思う。

アップグレード作業を中断・再開できるということで、Ubuntuの堅牢さを思い知ったのであった。
(必ずうまく行くわけではないと思いますがね)。

おまけ:
先月、家を空けることが多かったので、防犯カメラを設置したいと思った。
motionなるプログラムをインストールすれば、「何かあった時の画像」が記録されるということで、家にあった、ウェブカメラをubuntuPCに接続し、motionプログラムをインストール。画面サイズや保存ディレクトリを適当に設定すれば、画像が保存される。Dropbox管理下のディレクトリを保存ディレクトリとすれば、他のマシンからでも普通にウェブブラウザを通して画像をみることができる。
簡単に防犯カメラを作ることができ、フリーソフトウェアの凄さを思い知ったのであった。
結局のところ、記録されたのは、己のだらしない姿だけであった(よかったよかった)。

| | Comments (0) | TrackBack (0)

Prime numbers in Haskell

駄目なHaskellプログラムシリーズ。

プログラム言語 haskell で素数を計算する方法を考えた。手続き的にではなく、集合論的に考えるべき、と念じつつ、電車の中で考える。
それらしいものを思いつき、処理系を前に数度の試行で出来あがる。最初の百個を合計するという遊びも出来たので、ここに晒す。さすが haskell ワンライナー。でも、可読性は低いような気がする。

まずは自然数の集合を考える。無限を扱うのは怖いので、まずは100までとしておこう。
let n = [x | x<-[1..100] ]

素数は自然数の自然集合だから、以下のようにすれば良い。
let p = [x | x<-n,  x == 素数の条件]

素数の条件は、己と1以外の素数(自然数)では割り切れないということである。

割り切れるかどうかはmod関数を使う。x 割るyの余りを求めるのは「mod x y」
10が素数であるかどうかを見るには、2,3,5,7で割る必要があるが、ここでは
簡単に、2,3,4,5,6,7,8,9で割るかどうかを見る。
mod 10 2
mod 10 3
...
mod 10 9

もちろん、多くの自然数に対して、このように数式を列挙することは不可能だから、yを複数適用する方法を考えると以下のようになる。
map ( mod 10 ) [2..9]

この計算を行うと 10 を2から9までの自然数で割った余り(剰余)の数列が得られる。

10が素数であれば、map ( mod 10 ) [2..9]で得られる数列は全て0ではない。
逆に、10が素数でない場合、得られる数列には0が含まれる。

10をxに置き換えると、map ( mod x ) [2..(x-1)] となろうか。

さて、こうした判定列をどう考えるか、実はよくわかっていないので、素直に(?)計算する方法を考えてみた。きっと論理演算の積や和をとる演算子がありそうだから、本当はそれらを使うべきであろう。

割り切れるパターンが一つでもある場合(非素数)の抽出
let notp = [x | x<-n, ( product $ map ( mod x ) [2..(x-1)] ) == 0 ]

割り切れるパターンが一つもない場合(素数)の抽出
let p = [x | x<-n, ( product $ map ( mod x ) [2..(x-1)] ) /= 0 ]

not equalが /= というのをつい忘れがち。!= として怒られる。

自然数は、もちろん百個に限定されるべきものではないから、無限に存在することを明記する。
[x | x<-[1.. ], ( product $ map ( mod x ) [2..(x-1)] ) /= 0 ]

これは無限の数列になるので、代入なんかしている場合ではない。

最初百個を取り出すと以下のとおり。

take 100 [x | x<-[1..], ( product $ map ( mod x ) [2..(x-1)] ) /= 0 ]
[1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523]

どうやら「素数列らしきもの」が出力されており、大変喜ばしい。合っているような気はするが、本当に合っているかの確信はない。

ついでに合計をしてみることもできる。

sum ( take 100 [x | x<-[1..], ( product $ map ( mod x ) [2..(x-1)] ) /=0 ] )

さて、[2..(x-1)]としている点が実は悲しい。定義通り、素数で割りたいし、そのために再帰的に定義したいが、リスト内包表記では再帰は使えないのかどうか、そこからすでにわからない私である。こういう駄目なhaskellプログラムなので、宿題用に写すと酷い目に遭いますぜ。

同じことを2年前にしていたことを発見した。きれいさっぱり忘れていた。がつかりである。
http://folia.txt-nifty.com/musik/2012/06/project-euler-1.html

追記:
せめて、[2..(x-1)] ではなく、[2..(x/2)]にするのはどうか?また、[2, 1 + [1..(x/4)]*2]みたいにするか?
(何も試さず、ただ思いつきを記す)。

| | Comments (0) | TrackBack (0)

Thinkpad R500へのUbuntu13.10インストール

身内の使っているマシンを更新した。

Lenovo Thinkpad R500。

今時、OSなしマシンを入手するのは難しい。秋葉原まで買いに行った。
OSなしだと、中古であっても使い物にならないようなXp時代のマシンが多く、なかなかそれなりのマシンがないが、今回は、企業がHDDを外して売ったと思われる同型機多数がある。

HDDは消耗品であり、新品を購入したかったので、丁度良い。

我が家では、専らIBMのThinkpadを使い続けている。丈夫で壊れない。飽きないデザインである。キーボードが打ちやすい。ハードディスクの取り出しが簡単。というのが、私にとっての長所である。

Lenovo製になって、材質が変わったせいか、わづかに軟弱に見えるが、大体においてIBM製と変わらないないように見受けられる。

本体が1.1万円、HDDが0.5万円。メモリ(2GB)0.1万円で、合計1.7万円というのは素晴らしい。
本当のことを言えば、SSDを使ってみたかったが、本体価格を上回りそうだったので、止めた。吝嗇根性である。

このところ愛用しているUbuntuをインストールする。

家で作ってあったCDが10だったので、インストール&アップデートを試みたが、アップデートの方法がよくわからなかったので、10をインストールした状態から、13.10のCDイメージを落としてみた。ところが、CDの書き込みが出来ない事が分かり、他のマシンで作業するのも面倒だったので、USBメモリからのインストールを試みることにした。

「インストール用USBメモリの作成」を行って、リブート。普通にインストールできた。ただし、USBメモリが(非常に)遅いので、入力項目に入力できるようになるまで、気長に待つということが必要であった。
また、理由不明だが、本体キーボードが見えていない瞬間があったので、一時的に外付けのUSBキーボードを接続して作業した。

元々のメモリ1GBでは常にスワップが発生する。Ubuntu デフォルトのデスクトップから、XFce4に切り替えてみても、最低2GBはあった方が良さそうだ。3GBあれば、非常に滑らかで、スワップも発生していない。

MS-Officeを使わず、ネット閲覧、メール読み書き、写真管理程度であれば、Ubuntuで充分である。

PTAの一枚もののプリントなどは、MS-Officeであろうが、Libre-Officeであろうが、その他何で作っても作業性や出来上がりに大きく違いがあるようには思われない。家庭用にはUbuntuくらいで良いのではないだろうか。OSのインストールも簡単である上、様々なソフトウェアを気軽に試すことができ、わけても多様な開発環境が容易に得られ、プログラミングの学習が可能ということも含めて、非常にお勧めである。

安直な性能比較を書いておく。

Lenovo Thinkpad R500
model name : Intel(R) Celeron(R) CPU 900 @ 2.20GHz
bogomips : 4388.68

我が家で動かしているNECマシンに劣るはずだが、あまりそうは感じない。NECはノートPCながらモニタが映らなくなったので、外部モニタを繋いでいる。そのために、もっさりして感じるのかも知れない。

NEC Lavie LL750
model name : Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz
bogomips : 4799.42

| | Comments (0) | TrackBack (0)

Project Euler (Problem 10)

今回はプログラム風に(by Haskell)。

しかし、一応動くようになるまで作っているけれど、得られるエラーの意味がよく分からないことがしばしばある。

Haskellが柔軟な記述力を持っているのは事実であろうが、関数型としての、またhaskellとしての「クセ」があり、それにとまどうこと暫し。だから、「偶々動く」という形であって、「正しい」でもないし、「最適」からは程遠い。

main = do print $ sum [p | p<-[1..2000000], (product $ map(mod p ) [2..(p-1)])>0]

相変わらず、複数の判定を束ねるのを「積」なんぞにしている。

前回のProblem5については、非常にエレガントな解をネット上で見かけた。私のものにも「素直な実装」という取り柄は認めて頂きたいが、その実、「おバカな実装」であることは、本人もよく分かっております(反省)。

実際、非常なる低速で、半日計算しても終わりません。sumより右側の素数を吐かせても、実に時間がかかります(最初の方は調子が良いのですが)。

プログラム作成途中で得られた素数なる数列の一部を記念に。
64007,64013,64019,64033,64037,64063,64067,64081,64091,64109,
64123,64151,64153,64157,64171,64187,64189,64217,64223,64231,
64237,64271,64279,64283,64301,64303,64319,64327,64333,64373,
64381,64399,64403,64433,64439,64451,64453,64483,64489,64499,
64513,64553,64567,64577,64579,64591,64601,64609,64613,64621,
64627,64633,64661,64663,64667,64679,64693,64709,64717,64747,
64763,64781,64783,64793,64811,64817,64849,64853,64871,64877,
64879,64891,64901,64919,64921,64927,64937,64951,64969,64997,
65003,65011,65027,65029,65033,65053,65063,65071,65089,65099,
65101,65111,65119,65123,65129,65141,65147,65167,65171,65173,
65179,65183,65203,65213,65239,65257,65267,65269,65287,65293,
65309,65323,65327,65353,65357,65371,65381,65393,65407,65413,
65419,65423,65437,65447,65449,65479,65497,65519,65521,65537,
65539,65543,65551,65557,65563,65579,65581,65587,65599,65609,
65617,65629,65633,65647,65651,65657,65677,65687,65699,65701,
65707,65713,65717,65719,65729,65731,65761,65777,65789,65809

翌日追記:
素数計算は、一晩回してやっと9万まで。問題の200万までは遠い。
以下のように変更すれば、少しは良いか、考えているところ。正確には、素数以外で割りきれるかどうかの判定は意味がないので、そこまで煮詰めるべきか・・・。

main = do print $ sum [p | p<-[1..2000000], (product $ map(mod p ) [2..(p/2-1)])>0]

90901,90907,90911,90917,90931,90947,90971,90977,90989,90997,
91009,91019,91033,91079,91081,91097,91099,91121,91127,91129,
91139,91141,91151,91153,91159,91163,91183,91193,91199,91229,
91237,91243,91249,91253,91283,91291,91297,91303,91309,91331,
91367,91369,91373,91381,91387,91393,91397,91411,91423,91433,
91453,91457,91459,91463,91493,91499,91513,91529,91541,91571,
91573,91577,91583,91591,91621,91631,91639,91673,91691,91703,
91711,91733,91753,91757,91771,91781,91801,91807,91811,91813

| | Comments (0) | TrackBack (0)

Project Euler (Problem 5)

Haskellの勉強。プロジェクトオイラーの問題が、丁度良い。

三日程度考えつつ作りつつで進む。考えつつは通勤途上が主であるが、問題の全てを頭に入れることができるので、恰好の暇つぶしである。

さて、好みのリスト内包表記であるが、「複数の条件文」の表し方がよく分からなかったので、「1から・・・までの数値で割りきれる」というのを、「剰余の和が0」と読み替えた。例によってインチキな気もするが、気分的には解けたということで、よしとしよう。

お試し)
[p | p<-[1..10000], ( sum $ map (mod p) [1..10] ) == 0]
例題の正しい解が得られることを確認。

一応本番)
take 1 [p | p<-[1..], ( sum $ map (mod p) [1..20] ) == 0]

topコマンドで見ると、CPUを100%使い切って嬉しい。私にとって、コンピューターはすなわち「計算機」なのであって、計算しないと勿体ない気分が、今でも少しあるのである。(でもって、複数コアなので、実際には200%とか行くのですがね)。

ただし、[1..20]では、今日び珍しくなかなかの計算時間がかかる。私によくある「ロジックとしては間違っていないが、現実の計算機では、ほぼ計算不可能」なプログラムなのだろうか。その辺を面倒見てくれるのが、「関数プログラミング」でないのかい?と思っている私。もちろん、プログラムは書かれた通りに動くに決まっているのである。そして、こうして書いているうちにも、若干の効率化を思いついた(1で割る必要はない、20以下の数値はありえない、最小公倍数で割っておけば、素因数どもで割る必要はない、といった程度の当たり前の事)。

ちなみに、答えは9桁の整数でした。答えを書いては面白くないので、省略。

| | Comments (0) | TrackBack (0)

回文数

Project Euler を見つつ、Haskellのお勉強。

やはり「問い」がないと、プログラムなど書く気にならない。より正確に言えば、「面倒な問い」があって、「プログラムを書くと楽に答えに辿り着ける予想」があるからこそ、プログラムを書く気になる。蓋し、無精怠惰傲慢はプログラマの三大美徳。

さて、例によって動いているような気がすれば良いのインチキコード。

「やること」を書くのではなく、「どういうこと」かを書け、というのが少し分かってきた気がする。特にリスト内包表記は素晴らしい。ともあれ、少しずつプログラムを成長させて行ったこともあり、変数が、p、pp、pppと、まるで古のベーシックみたいだ。

ともあれ、大きな計算を行う時には、途中経過を出力して、抜き取り検査を行うのが普通だと思う(そのために、中間的な結果を、p、pp、pppとしているのだ)。そして、プログラムが出来上がったとしても、いつでも検査できるようにしておく(冗長メッセージモード等で出力する)のが良いと思っている。しかしながら、Haskellではどうするのだろうか。

---------------------------------------------------------------------------------------------------------------------
multi [] lst = []
multi ( i:is ) lst = map ( \ j -> (i*j, "="++show(i)++"*"++show(j)) ) lst : multi is lst

z = concat $ multi [9999000..9999999] [9990000..9999999]

pp = [p | p <- z, (show $ fst p) == (reverse $ show $ fst p )]

ppp = maximum pp
---------------------------------------------------------------------------------------------------------------------

さて、検査範囲を書き換えつつ、試した結果をいくつか載せておく。「それらしい」結果ではあるが、「正しい」かどうかは知らぬ。

(99000099,"=9999*9901")
(9966006699,"=99979*99681")
(999000000999,"=999999*999001")
(99926644662999,"=9999297*9993367")

上記のように、検査範囲をある程度絞らないと、ghci自体が落ちるのであった。(コンパイルという面倒な操作は、この十何年したことがありません。全てのプログラムはインタープリタ言語でのみ書いている私です)。

計算式を作って、それをevalしたかったが、この程度の式であればということで、本物の計算式と、文字列のメモとしての計算式を二重に生成しているのが阿呆だ。

関数multiの返すデータ構造は、数値(計算結果)と文字列(計算式メモ)のタプルのリストのリストだ。意図せず二重リストになった。

maximumはタプルの最初の項に自動的にかかるらしい。若干気持ち悪いが、それらしい結果が得られたので、広い心を持って(要は怠惰に)、受け入れている。


| | Comments (0) | TrackBack (0)

フライトシミュレータで遊ぶ日

フライトシミュレータFlightGearで遊んだ。操作は難しいが、なかなか楽しい。

農業機というのが気に入って、アントノフ2を飛ばす。他にも、軽飛行機Dragonflyも妙で気になる。

エンジン起動等操作方法は↓
http://wiki.flightgear.org/Antonov_An-2

その際の、機器パネル画像は↓ ただし、現在頒布されているAN2のパネルと異なる・・・。
http://wiki.flightgear.org/File:Antonov_AN-2_reference_left.jpg

当たり前ながら、空気の摩擦の小ささが実感せられる。自動車であればハンドルを切っただけ曲がれるが、操縦桿を曲げて、機体を傾けても、なかなか曲がってゆかない。また、曲がり始めると、戻すのも容易ではない。全ての場面で、慣性が摩擦に大きく卓越している。

というわけで、私は、飛行場の周辺をふらふらしているだけで、着陸もまともに出来ないし、まっすぐ飛ぶこともできない。グライダー乗りに話を聞いたところ、「自転車と同じで、体で傾きを検出して操縦するものだ。だから、画面だけを見て操縦するのはとても難しいだろう」とのこと。

以下の飛行風景↓でなんとか、橋のまわりを飛び回るのが、関の山である。(実際には衝突しているが、仕様上「通り抜ける」ようになっているのが、私のような者には適している)。
Fgfsscreen001

こんなにもよくできたソフトウェアがフリーであるとは、誠にありがたいことである。

| | Comments (0) | TrackBack (0)

IPv6

ココログの管理ページに「IPv6」とのメッセージが出るようになった。

試みにKAMEプロジェクトのページを見にゆくと、亀が動画で(なめらかに動いている)。

知らぬ間にIPv6化されたようだ。といって、ルーターからこちらはIPv4のローカルアドレスと思っていたが、中にはIPv6アドレスを持っているものもいるようだ。・・・って、IPv6のアドレス(機器個体)は、勝手に名乗るんだっけ、それとも、どこかから動的にもらうんだっけ・・・。

wikipediaには 「リンクローカルスコープ」、と「グローバルスコープ」が記されているが、ローカルスコープであるならば、何の心配もないな、と思う私。

| | Comments (0) | TrackBack (0)