Haskellに惑わされ – 3

今回サーチして見つけたのがこのサイトでした なかなか簡潔に Haskellのイロハが記載されて助かりました このサイトではまったのが次のプログラム

letTest1 x = let a = 3
                 f v = v + 2
             in do a * f x

これを例えば letTest1.hsとしてファイル・セーブするのです そしてghciを立ち上げて compileすれば、letTest1という関数が認識されるので、ここで例えば

*Main>letTest1 2

と打ち込めば、この場合には 12という計算結果が戻ります しかし最初はこれがどうして 12になるのか全く分かりませんでした そもそも let文の中にある f v = v + 2 という式はどう解釈するのか? という問題です 色々と考えた結果、fは内部関数名、vは内部引数名であることに気づきました

従って、letTest1 2という命令を出せば、その定義で、2という実引数は xという引数に相当するので、最後の文である in do a * f xという文の中の xが 2に置換され、fという内部関数が実行されます その結果、内部的に f  = 2 + 2となりf という関数の戻り値は 4となります そして aは 3なので letTest1の結果は、3 * 4で 12となります

ここまで自分で自分に説明してようやく理解できました

Haskellに惑わされ – 2

最近相当に頭がバカになっている そんな気がするのです タイピング速度も低下し、頭の回転も遅い、そんな自分に嫌になります 何が原因か? うーん 歳かなあ いやいやそんなことではない 自分が怠惰になっているからなのだ そこで、こういう時の一番の気付け薬である Haskell programmingに戻りました うーんずいぶんと遠ざかっていましたね だって難しいんだもの こんな言語ってないよ 本当に 普通のプログラミング言語とは全く違うのです

僕だって色々な言語をこれまでいじってきたのでだいたい少しかじれば少なくとも Hello World!ぐらいは画面に出せるし、あるいは 1から 100までの足し算だってすぐにその言語でプログラム書けるようになりますよっ

でも、Haskellは別 全く分からない どうすればいいのか全く分からない まず最初の関門がその実行環境です

僕が現在「これが一番いい」と思っている環境は VisualStudio Codeをインストールして、その中で terminal (Bashなど)を立ち上げることです そうすると Haskell programを VS codeの中で書いて、そこで VS code内の terminalより実行できます

まず今回はまったのは 本に書いてあったサンプル・プログラムである 1から nまでの合計を求める関数です(再帰版)

$ghci

これによりHaskell正当のコンパイラ/インタプリタである Glasgow Haskell Compiler/Interpreterが立ち上がります そうすると僕の場合以下のようなプロンプトが terminalに出力され、Haskellのコマンド待ち、となります

GHCi, version 8.6.3: http://www.haskell.org/ghc/  :? for help
Prelude>

この環境はいわゆるREPL ( Read-Eval-Print Loop)というものなので、この Prelude>のコマンド待ち部分に入力することにより Haskellを実行できます ここでまずこの REPL ( Read-Eval-Print Loop)を用いて 本にあるようにプログラムを打ち込みます そうすると驚愕の結果となり、瞬時に勉強心を打ち砕かれます それは

Prelude> mysum 0 = 0
Prelude> mysum n = n + mysum (n - 1)
Prelude> 
Prelude> mysum 0
*** Exception: stack overflow
Prelude>

というような結果です 要するに本の通り打ち込んでも stack overflowという無限ループに陥りクラッシュするのです とんでもない とんでもない

僕は真剣に本に対してクレームをしようかと思いましたよっ しかししかし これをファイルとしてセーブするのです 試みにこのファイルを mysum.hs というものにしますね はい$lsすればセーブされたことがわかりますね

$ls -l
-rw-r--r--   1 transradial  staff       64  7 17 09:51 mysum.hs

そして再び Haskell を立ち上げます

$ghci

そうするとHaskellの REPLに入り

Prelude>

という待受になります ここで 次の GHCIコマンドによりさっきセーブしたファイルを読み込みます

Prelude>:l mysum.hs

このようにするとファイルが読み込まれ、コンパイルされて以下のように応答してきます

[1 of 1] Compiling Main             ( mysum.hs, interpreted )
Ok, one module loaded.
*Main>

今度は *Main> という待受になり、自分の書いたプログラムが正常に作動する状態になっているのです ここで

*Main>mysum 0
0

となりますね、つまり 0 (Zero)を引数として mysum関数を呼び出したところ、結果が 0である、と出力されたのですね では同様にして 100を引数として呼び出せばどうなるでしょうか?

*Main> mysum 100
5050

はいきちんと 1から100までの合計値 5050が出力されました

要するに、REPL環境で打ち込んでもダメなのです これが分かるのに相当に時間を浪費しました しかしその副作用で頭脳回転が早くなりましたね

またまた Haskellに迷わされ

さて本日は順調にTAVIが進んでいます 僕自身も 1st operatorとして EvolutProを用いて一例あっという間に治療終了しました 完璧なできでした

さて、その間に頭脳の一部、というか手技の合間に Haskell programmingを考えています 相変わらずとても難しい あの例の、「すごいHaskellたのしく学ぼう!」という有名な書籍で始めた勉強も途中 20%程度進んだところで暗礁に乗り上げてしまいました 何が何だかさっぱり理解できない

そこで今度はこの有名な入門書から、日本人が書いた本「Haskell入門 – 関数型プログラミング言語の基礎と実践」に切り替えたのです

もちろん最初から読み始めたのですが、そうすると前の本で勉強した部分も再び読むので何となく理解が進みます でもやはり暗礁に乗り上げたのです 現在、

$ghci

あるいは

$stack ghci

というコマンドで GHC interpreterを走らせてテストしているのです どうしてもうまく行かない!!

Prelude>:{
Prelude>|f x = case x of n | n `mod` 2 == 0 -> putStrLn "even"
Prelude>|                 | otherwise -> putStlLn "odd"
Prelude>|:}

これで compile errorが出るのです!! ちなみにそのエラー内容は

:40:3: error: parse error on input ‘|’

というものです まさかまさかと思ってやってみました 今度はこのように入力したのです

Prelude> :{
Prelude| f x = case x of n | n `mod` 2 == 0 -> putStrLn "even"
Prelude|                   | otherwise -> putStrLn "odd"
Prelude| :}

そうすると何とエラーが出ずに

Prelude>f 10
even
Prelude>f 9
odd

となり作動しました 要するに”|”という縦棒までの文字数が上下で同じでないとエラーになるのでした 何でもこの縦棒のことを”ガード”と呼ぶらしいです これで論理構造を表すのですね 何だか Pythonのインデントのようです でもここに辿り着くのに30分かかりました 何しろ Kindle本ではこの部分縦棒が揃っていないのですから・・・

久しぶりに brew update/upgradeしてみたら・・・

Haskell systemを upgradeしようとしてまずは Homebrewで

$brew update
$brew upgrade

してみたのです そうしたらば、gccの upgradeで異様に時間がかかり、一見すると停止したように見えたのです しかしながら terminalの表示では compilerが作動しているように見えます。20分ぐらい待ったのですが埒あかないので検索したところ同じような経験された方のページがありましたので、それを参考に今しばらく待っていたところようやく先に進み終了しました。良かった

PowerPointで複数の動画を同時再生するには? その(3)

さて複数動画再生手順の最終段階です 02と01とかややこしいので 新たに動画ファイルを4つ配置しましょう こんなふうになります

動画ファイルを4つ配置

ここで「再生メニュー」を見るとこのようになっていますね

初期状態

さてここで「自動」と「停止するまで繰り返す」を選択します このようになります

「自動」などの選択

これを今の場合四つの動画ファイル全てに適用します そうするとこんなふうに四つの動画ファイルの左上隅に「0」が出てきましたね

わーあぃっ Zeroが並んだ

今度はこの Zeroのどれでもいいから double clickして下さい そうすると突然こんなふうに右のパネルが出現し、時計アイコンが縦に並んでいますね

新たな時計パネルの出現

今度はこの中のどれでも良いので 3時時計アイコンをクリックして下さい そうするとこんなふうにサブメニューが出てきました

サブメニューの出現

このサブメニューの「タイミング」を選択すると・・・・

タイミングを選択すると・・・

はい出てきました これが動画再生タイミング選択Dialogなのです ずいぶんと深い階層にあるのでなかなか到達できないのですねっ ここで今「直前の動作の後」になっていますが、これを「直前の動作と同時」にします

直前の動作と同時 を選択

そうするとあらあら不思議、3時時計アイコンが消えました

3時時計アイコン消滅

この操作をそれぞれの動画ファイルをクリックして行います 今三番目の動画ファイルをクリックし、03の左側にある 3時時計アイコンをクリックしたのですが、そうするとまた「タイミング」メニューが出てきましたね このメニューで「直前の動作と同時」を選択します

直前の動作と同時 選択

これを四つの動画ファイルそれぞれに対して行います 行う毎に 3時時計アイコン子が消えていきます 結果こんなふうになりましたね

最終形態

はい奇麗に 3時時計アイコンが消えました ここで Slide Showして下さい はいっ 見事に四つの動画ファイルが自動で同時再生していますね これ良いのです

ただ、このメニューの下にずらずら「開始のタイミング」というのが縦に並んでいますよね これは何なのでしょうか? プログラミングを趣味としている人間としては、このような疑問を大切にします 試しに01のところの矢印をクリックすると あれあれ「タイミング」サブメニューが出てきました

タイミング・サブメニュー

ここは defaultで「クリック時」になっていますので、このサブメニューが有効であれば、動画ファイルをクリックせねば再生しないことになります しかしながら、それよりも 「3時時計アイコンの消失」という事象の方が作用として強いので、結果的にこの「タイミング」サブメニューは無意味なのです ですから、これを選択して、右上の赤いペケアイコン つまり✕ をクリックして消してしまいましょう こんなふうになります

動画ファイル再生タイミング2つ分を消したところ

全部消すとこんなふうにタイミングも「直前の動作と同時」となり見かけも奇麗ですね ここは美学の問題ですよっ

お~っ 美しい

この状態で Slide Showして下さい はいっ 見事に四つの動画ファイル自動同時再生の出来上がりです

ちなみに、このブログに Upするためにデモを実際に Powerpointで行ったのですが、 MacOS Mojave 10.14.3 で Powerpointは Microsof® PowerPoint for Mac/Version 16.23/Office 365サブスクリプション です しかしながら基本的にほぼ全ての PowerPointで動作すると思いますよっ ちなみに、こうして作成した PowerPointですが、 .pptxで Saveしたファイルは動画ファイルを内部に包括しているので、たとえば Windows 10マシンでも動画自動同時再生できます この時に注意するのは、動画の Formatであり、先に upしたように適宜 Format Factoryなどで動画Formatを変換して下さい ちなみに僕のオススメは、.mp4、.mpgあるいは .movです 最悪は .aviです またこの先人生 Windows 10で過ごすつもりならば、.wmvも圧縮率高く良いですが、Macでは動画再生できない可能性があります

はいここまでお疲れ様でした 皆様方の華麗なるプレゼンのお役に立てれば幸いです

PowerPointで複数の動画を同時再生するには? その(2)

さてここまできちんとやられれば、2つの動画ファイルが左右に並んだ状態で「再生」をクリックしてから、左右のファイルをクリックすれば、どちらのファイルに対しても以下のようになっていますね

2つのファイルでも「再生」クリックすれば

さて、これだけでは Slide Showにしても2つの動画自動再生とはなりません ここからが重要です

今この状態で動画ファイルを見ればこんなふうになっています

現在の状況動画ファイルは普通です

ところがここで「アニメーション」メニューをクリックすると あれあれ不思議 動画ファイルの左上隅に何やら出てきましたね

「アニメーション」クリック前

これが「アニメーション」クリックすると

「0」と「雷マーク」が出てきた

なんだか「0」と「雷」マークが出てきましたね こうなればしめたものです ここでこの「0」と「雷」マークをクリックして下さい そうすると 今度は右のパネルが出現し、このようになっていますね

あれあれ不思議

こうなればしめたものですよっ 重要なのはこの部分です

この部分が重要です

このパネルの「01」とか「02」は今無視して下さい 僕が動画ファイルを並べた順が右側からにしてしまいましたので、この順番になっていますがどうせ「同時再生」するので関係ありません

PowerPointで複数の動画を同時再生するには? その(1)

Powerpointを用いてシネ画像などを2つ並べて再生する場合がよくありますよね この時なかなか簡単には複数の動画を同時に再生することができなく、しばしば画面上でクリックして次の動画を再生することになります

さてこれをどう解決すれば良いでしょうか? ようやく見つけたのです 公開しましょう

試しに 2つのシネ動画像を並べます まずその前に動画には色々な形式があります そしてややこしいのは Windows10とか MacOSあるいは iOSなどの OS毎に受け入れる動画の種類が異なるのです もちろんこの差異は有償の plug-in softwareを購入することで補間されどの OSでも作動するようになるのですが、現段階で .wmv (Windows Media Video)形式は、Windows10に対して最適化されていますが、MacOSでは作動しませんし、.mov形式は MacOSに最適化していますが、Windows10では動作しません 安全なのば .mp4形式か .mpg形式だと思います 間違っていればごめんなさい .mpgというのは MPEGという標準化団体が定めたものであり、多分どの OSでも大丈夫です

あとよくあるのが .avi形式ですが、これは圧縮率が良くないのでなるべく他の形式に変換しましょう

さて変換するにはどうするか? ですが、Windows10であれば、フリーソフトでとても優れたものとして FormatFactoryというのがあります ググればすぐにヒットします とても良く、使いやすいソフトなので僕はもっぱらこれを使用しています ほとんどあらゆる形式の動画に相互変換可能です 素晴らしい

さて Macではどうするか? ですが、多分 QuickTimeで変換可能だと思います やったこと無いので知りません あしからず

まずは Powerpointの画面に、フォルダより目指す動画ファイルを一個でも二個でも drag and dropします そうして奇麗に並べればこのようになります

Dran and Dropした動画二枚

次にそれぞれの動画をクリックするとメニューに出てくる「再生」をクリックします

「再生」が出てきたよ

この「再生」をクリックすると下に次のような選択項目が出現します

ビデオの開始や終了の指示

ここで「自動」と「停止するまで繰り返す」をクリックします

自動と停止するまで繰り返す

ここまでの操作を右に並べた動画でも繰り返します 行ったならば一旦ファイルを Saveして下さい

焦ったあ – MacBook Proのカーソルコントロールが効かなくなった!!

日立から深夜というか早朝鎌倉に戻った後も JICA報告会、部下の結婚式、治験相談などに明け暮れあっという間に時間が流れ、昨日は神奈川PTCA研究会101回目の記念講演がありました その前に聖マリアンナ医科大学で院内ライブを行う機会がありましたが、もう10年ぶりのことでした とても優秀なスタッフだと感じました 皆さん方に感謝です この写真は良い思い出です

聖マリアンナ医科大学の皆様方と

そして本日はこれから神戸に講演に向かっています

さて、昨日聖マリアンナ医科大学から一旦講演前に鎌倉に戻るタクシーの中でファイルを操作していたのですが、MacBook Proの動作が急におかしくなったのです 突然カーソルコントロールができなくなり、止む無く再起動するにも Cmd+Tabによりアプリを切り替え、既に立ち上がっていた Terminalに移動してそこで

$sudo shutdown -r now

とせねばならなくなったのです これには焦りました だって講演スライドを最終型に持っていく最中でこんなことが起こったのです 再起動すれば治るかなと思っていたのですが、何回か再起動しても立ち上がるのですが、やはりカーソルコントロールが効かず操作不可能となり駄目です

頭をめぐらし色々と考えました「原因は何か? ソフトかハードか?」「ソフトだとすれば、TimeMachineからリカバリーせねばならないが、それを行っている時間はあるか?」「ハードだとすれば、新たに MacBook Proを購入せねばならないがそれも時間がかかる」「まずは講演のことを考え、なんとか Terminalを用いて出来上がり寸前のファイルを USB Memoryにコピーして、そのファイルを Windows10で立ち上げよう」 そのように結論しました つまり

$cp ~/Documents/[講演ファイルのパス] /Volume/[USB Memoryのパス]/[ファイル名]

とすれば良い筈です

そんなことを頭を巡らし考えている内に病院についたので、また MacBook Proを立ち上げたのですが、今度はなんの問題も無くカーソルも動作するのです 快適です なんだか原因分からないけどうまく今は動いているのでいいやっ と作業を行い 18:00に講演会場に向かいました

ところがその移動一時間の間再び MacBook Proを立ち上げるとまたまたカーソルコントロールが効かなくなったのです 再度立ち上げ直しても同じです さあ困った これでは講演できません

ここであり得る原因を考えました どうもおかしい カーソルの権限がなにかに乗っ取られている これはどういう場合に起こるか? それを考え、一つ思いあたりました 自分のバッグに BlueTooth Mouseがあるのですが、もちろんその電源は普段切っています もしも、このマウスの電源が入ったならば、そして MacBook Proとそのマウスが BlueTooth圏内にあれば、そのマウスがカーソルコントロール権限を取得するのでは? これが仮説でした そして次第にその仮説が正しいだろうと思うようになったのです 何故ならば講演会場に座り、その時は僕のバッグは離れた場所に預かってもらっていたのですが、その時には MacBook Proは正常に作動したからなのです

そしてバッグを取り寄せ、マウスを確認したところ、やはり電源が Onになっていたのです 電源を Offにしたところ、全く問題なく MacBook Proは作動しだしたのです 解決です

思えば最近 MacBook Proを使用していてえらく CPUが作動していたり、カーソル反応動作が遅くなっていたり最近変な現象に遭遇し、そろそろ OS clean installせねばならないかな? などと思っていたのですが、その原因は何と BlueTooth Mouseの電源を無意識に Onにしているためだったのです 今はとても快適に MacBook Proが作動中ですよっ

代数的データ型

何やら訳も分からずに使っていた data という型ですが、これは代数的データ型 という特別な「型」なのだそうです

それを実現しているのは Preludeという Haskellの Interpreter/Compiler system GHCiに付属する標準的なライブラリー (この呼名で正しいのか知りません)のようです 何だかさっぱり分かりません つまり

data Human = Human String derived Show

というのは data型から発生したHumanを定義して、それはString型の変数を持ち、Showという性質を引きずる ということのようです

ものすごく曖昧な理解です とにかく難しい

すぐ忘れるmysqlコマンド

折角ターミナルで $mysqlと打ち込めば mysqlが CLI (command line interface)で立上るようになったにもかかわらず数日使わないとすっかりコマンドを忘れていました そこで自分で良く使うものをここに書いておきます

## mysql を 「ユーザー名」で立ち上げる うまく立ち上がると passwordを要求される
$mysql -p -u ユーザー名

## mysqlに既に登録されているデータベース一覧を表示
mysql> show databases;

## 「そのデータベース」を使用する
mysql> use そのデータベース;

## 「そのデータベース」のtable一覧表示
mysql> show tables;

## 「そのデータベース」の「そのtable」のフィールドを一覧表示
mysql> desc そのtable;

## mysqlを終了する
mysql> quit;