だいぶん頭脳が Haskell脳になってきました

最近感じるのですが、これまでの半年間以上に渡る苦闘の末に、いやまだまだ末ではないのですが、自分の思考がなんだか変わりつつあるのを自覚するようになってきました。要するに Haskell脳になってきているのです。もっともその道のプロの方から見れば「赤ちゃん」のように幼稚な脳でしょうが、それでも変わりつつあります。

そのように自覚するのは、別に Haskellの勉強をしたり、プログラムを書いたりしている時ではないのです。日常生活で、フト今までとは違った思考をしているのに気づくのです。ようやくここまで来ました

-- Haskellで書いた
--リストより先頭文字が一致した項目
--を削除するプログラム
-- remove0.hs

remove' hanbetsu [] = []
remove' hanbetsu (x:xs) = if hanbetsu x
                          then remove' hanbetsu xs
                          else x:remove' hanbetsu xs

test_array = ["apple", "banana", "avogado"]

このソースコードは remove0.hsとしてセーブされています。
これでターミナルから以下のように打ち込みます

$stack ghci

これによりHaskell Interpreterが立ち上がりますので以下のようにプログラムのソースコードである remove0.hs

Prelude>:l remove0.hs

とすることによりコンパイルされますそして

Main>remove' (\(x:xs) -> x == 'b') test_array

とすることにより”banana”のみ無くしたリストが得られます。

まだまだ分からないことだらけ

今朝実は北京経由で西安に入ります それで早朝ですが、突然 node.jsをインストールしようと思いました こんなものとうの昔にインストールしてあった筈ですが、さっきひょんなことで homebrewをアンインストーるして、再びインストールしたのです。そんな訳で homebrewでインストールしてあった node.jsも消えてしまったのです。

「うん? どうやれば node.jsインストールできるんだっけ?」

そこで google博士に聞いて見ました ここにヒットし、とても最近の uploadなのでこれが最高!と思いましたね、そして指示に従いインストールしたのです キモは最後の最新の node.jsをインストールするというこのコマンドです

$nodebrew install-binary latest

ところが、これがエラーが出てどうしてもインストールできないのです。sudoにより権限昇格しても駄目なのです!! 結構こんな時の僕の気分は深海の如く deep blueとなりますね。

それでもやはり朝でした 未だ元気な僕でした ふと思ったのです 何でこんなコマンド入れるのかな? もっと素直に

$brew install node

で良いのでは?

そこでやったところ一発で node.jsがインストールされ、今現在僕のターミナルでは

$node -v
v12.0.0

という具合に最新 node.jsが戻ってきます やったね!!!

僕のbashに一体全体何が起こったのか?

昨日TAVI三例とMitraClip一例の合間に突然のごとく気がついたのです また Visual Studio Code (VS Code)上でかんたんなHaskell programをテストがてらに書いていて、それを VS Codeのターミナルで走らせようと思ったところ、なんとなんと VS Codeターミナル画面から command promptが消失しているのです

これって、要するにコマンド打ち込めません $stack ghc ****.hsとして Haskellプログラムをコンパイルしようとても、なにせその $ が無いのです!!!

まさか、と思い Macのターミナルを立ち上げるとここにも $が無いのです これは大変な事態になりました 何も悪いことはしていません それなのに突然そんなことになったのです 前日はそんなことありませんでした

ひょっとして bashでなく zshでは大丈夫では? と zshを $より立ち上げようとするのですが何しろその $が無いっ!!

きっと、~/.bashあるいは ~/.bash_profileという bashの設定ファイルが壊れたためか? と思いそれを何とか VS Codeの「開く」という graphical interfaceで開こうとしても、今度は 隠しファイル(先頭に .がついたファイルで通常の Macからは見ることも存在も知ることができないファイル)を調べようとしても、何しろそれが見れないのです。そこで、今度は「コマンド」+「シフト」+「.」を押したところ、隠しファイルを見ることができましたので、それで両方の設定ファイルを調べても何も変わっていないのです

今度はとりあえず、「ターミナル」の「環境設定」から立ち上がりシェルを zshに変更し、とりあえずターミナルで zshを立ち上げそれにより操作をしました。まずは、この環境設定から、zsh上で $/bin/bash –version により現在のシステムbashの versionを調べると version 3.2.57(1)となっていました

これは MacOS Mojaveをインストールすると立ち上がる bashですが、何しろ現在の bashは version 5.0.11なので相当に古いものです

そこで次にzshより立ち上がるコマンドをbashにしたのです そして、homebrewで最新の bashをインストールしました

これにより $which bashとすると /usr/local/bin/bashとなり、bash –versionも version 5.0.11となりました

今は訳のわからないままこの状態で動かしています 一体全体何が突然起こったのでしょうか? どなたか Unixに詳しい方教えて下さい

MySQLで DateTime fieldにおいて、年と日付のみ変更する方法

さてそろそろ鎌倉ライブの Web Siteを更新せねばなりません 結構なプログラムが仕込んでありますが、鎌倉ライブのプログラム(予定表)そのものが非常に flexibleですので、Web programmingも結構苦労するのです

2018年のデータを活用するつもりなのですが、これは MySQL databaseに取り込まれている2018年のデータをコピーすれば良いのですが、そこで フト悩んだことが

session_tbls2019の中のbeginTimeというDateTime fieldにコピーされた 2018年データ:: つまりは、”2018-12-15 09:30:00″というようなデータをどうやって2019年データ::つまりは、”2019-12-14 09:30:00″という本年の正しいデータに変換すれば良いのか? これってなかなか難しいですね でも調べました、その結果はこうです SQL文で以下のようにするのです

UPDATE `session_tbls2019` SET `beginDate` = (`beginDate` + INTERVAL -1 DAY);
UPDATE `session_tbls2019` SET `beginDate` = (`beginDate` + INTERVAL +1 YEAR);

これで年と日付が更新されました 便利ですねえっ

WordPressで隠し文章を記録

WordPressでの文章で、ちょっとした trickを思いつきました もう少し暇があれば、Javascriptを用いて動的に画面を作成できるのですが、色々なことを勉強せねばなりません

ここで記載する trickといのは WordPressの文章で cssを用いてあるブロックの文章を表示しなくするのです これと jQueryを組み合わせればボタンをつけてそのボタンにより表示・非表示を切り替えることもできますね

cssはかんたんで style=”visibility: hidden; height:0px;” とするだけなのです でもこれって隠し文章を記録するのに便利ですよっ

Haskellに惑わされ – 13

ライブデモンストレーション開始の直前に理解を深めるために ghciで REPLにより実行しました

Prelude> :{
Prelude| myDiv x = case x of (0, 0) -> 1 :: Int
Prelude|                     (_, 0) -> maxBound
Prelude|                     (n, m) -> n `div` m
Prelude| :}
Prelude> myDiv (0, 0)
1
Prelude> myDiv (100, 0)
9223372036854775807
Prelude> myDiv (3, 5)
0
Prelude> myDiv (100, 2)
50

思いどおりの実行ができましたね もっとも本からの抜粋ですが・・・・ しかし、本に書いているからと言っても簡単に実行できないのが Haskellです 要するにとても「厳しい」言語仕様なのです

Haskellに惑わされ – 12

この本「ふつうのHaskellプログラミング」といのはとても良い本のような気がしてきました。というのも僕のHaskell programmingに対する理解が前に進んでいるからです。「前に」という修飾語に注目して下さい。決して「理解が進んでいる」とは言っていません。しかし、着実に前に進んでいます。

本日確実にゲットした理解は、

$stack runghc

というコマンドです。これを行うことにより、実行ファイルが作成されます。それは、Macだろうが Windows10だろうが、Linuxだろうが同じです。そしてできるファイルは、拡張子無しの実行ファイルなのです。

例えば expand.hsというソースコードファイルがあれば、それをこのコマンドでコンパイルすれば、expandという名前の実行ファイルができあがります。ですから、実行するには

$./expand

とすれば良いのです。これだけ理解するにも時間が必要であり、着実な前に向かった進歩です。大分Haskellの世界観に馴染んできました。僕という人格、いや人格でなく能力が拡大しているのです。

Haskellに惑わされ – 11: 鎌倉ライブデモンストレーションHome Page改修作業に着手

何時の間にか 8月も真ん中になってしまいました これまでのんびりと構えていたのですが、そろそろ鎌倉ライブデモンストレーションHome Page (https://www.kamakuralive.net/)の改修作業に着手せねばなりません。

ただ改修するのも進歩が無く面白くありませんので、今年は Bootstrap > 4.0で組み直すつもりです。もちろん jQueryも version upですね。本日ようやく着手しましたが、web programmingは久しぶりなので色々なことを忘れてしまい出発点まで自分を戻すのが大変です。

では何をこれまでその代わりにしていたかって? 例によって Haskellです こんな良い本を見つけたのですが、読んで行くにつれ難解になります。どうしてこの computer languageはこんなにも難しいのでしょうか?

この本は10年以上前に出版され、現在は入手できませんので、中古品を購入するしかありません。幸い、とても安価でしたので助かります。内容は不親切ながらも良く書けていると思います。しかし難しい

ふつうのHaskellブログラミング
ふつうのHaskellブログラミング

Haskellに惑わされ – 10

この3日間 Haskellに格闘です 格闘といっても、巨大な怪獣に武器も無く立ち向かうが如くであり、もともと勝つことは不可能な戦いです

こんな時にはどうするか? 問題を切り分けるしかありません そもそも \関数 (ラムダ関数)をおまえさんは使えるようになったのですか?

うーん 自信無いなあ

それでは

たとえば 100::Intから 120::Intまでの整数リストがあった時、これを全て 3倍にするには どうするか? うーんこの前学んだ map関数を使用すれば簡単!

Prelude>map (*) 3 [100 .. 120]

ああ ダメダメこれでは動作しません Haskellより怒られます 何故かと言えば mapは

Prelude> :t map
map :: (a -> b) -> [a] -> [b]

で分かるように、 2引数関数なのですよね ところが、Prelude>map (*) 3 [100 .. 120]などとすれば 3引数となってしまいますよね

ではどうするか? もちろん mapが適用するのは、関数なのであり、(*) 3 などというのは関数ではありません 関数にするには (3 *)とすれば良いはずです そうすると きたきたーっ

Prelude> map (3 * ) [100 .. 120]
[300,303,306,309,312,315,318,321,324,327,330,333,336,339,342,345,348,351,354,357,360]

はいできましたねっ ばっちりです

Haskellに惑わされ – 9

もうむちゃくちゃ Haskellの難しい世界に完全にやられています 何が何だかさっぱり分からない それでも頑張って前に進むのだ きっとこの森を超えればこれまで見たことも無い世界が広がっているのだ それを信じて進むしかない

ところで、例の’\’というのは要するにギリシャ語の ‘λ’という文字に似ていますね、それでこの記法を「ラムダ式」と呼ぶのです 正確には「ラムダ関数」でしょうか 関数というのはある入力 aが入れば、何らかの操作をその aに対して行い、結果 bを返すものですね この時重要な概念としては、この関数 (ここでは便宜上 f と呼びます) f に aという入力をすれば、必ず bというものが返る、という点です

ただ、名前 f というのは本質的で無いので、ここは何でも良い、そんな意味で \ というものを使用するのです つまりこの関数が行う操作そのものが重要で名前はどうでも良いのです これを ラムダ関数と呼びます