Carpをチョット触る

Lisp方言の一つであるCarpをちょっと触ってみた。 github.com

関係ないけど、ClispとかClaspとか最近Cで始まってpで終わる処理系を見ることが多くて、一瞬区別がつかない。

インストール

Ubuntu 18.04にインストールした。

Carpの処理系自体はHaskellで書かれているようなので、stackをインストールする。

apt install haskell-stack
stack upgrade

v0.3.0をローカルにインストールする。

mkdir $HOME/.local/share
cd $HOME/.local/share
git clone https://github.com/carp-lang/Carp
cd Carp
git checkout v0.3.0
stack build
stack install

環境変数を設定する。

export CARP_DIR=$HOME/.local/share/Carp

CARP_DIRが設定されないままcarpを実行するとエラーになる。

carp: EvalException I can't find a file named: './/core/Core.carp'

実行

実行する。

carp
Welcome to Carp 0.3.0
This is free software with ABSOLUTELY NO WARRANTY.
Evaluate (help) for more information.
> 

REPLが起動した。

(quit)

REPLが終了した。

(help)

でヘルプが表示される。

hello world

伝統と格式のhello world

(use IO)

(defn main []
  (println "Hello, World!"))

コマンドライン引数に -x をつけると、main関数が呼ばれる。

carp -x hello-world.carp
Hello, World!

生成されるコード本体を一部抜粋

int main(int argc, char** argv) {
    carp_init_globals(argc, argv);
    static String _4 = "Hello, World!";
    String *_4_ref = &_4;
    IO_println(_4_ref);
}

数値を表示してみる。

(use IO)
(use Int)

(defn main []
  (IO.println &(Int.str 1)))
carp -x print-1.carp
1

(Int.str 1) ではなく &(Int.str 1) なのがポイントで、何故ならprintlnの引数が &String だけどstrの返り値は String だから。 そうなのか。。。

筋肉量増えた時にやってた事

先日筋肉量増やすにはどうするのかとかいう話になった。

自分の場合パワーアップの為に筋トレをやっていたが、現実問題安全確実なパワーアップの為には筋肉量は必要だろうとも思っていた。 で、当初筋トレしても1kgたりとも筋肉らしきものが増えなかったが、何か色々変えているうちにどれが効果あったのかは実験してないけどある程度増えた。 今でも筋トレ自体はやってるものの、最近そういう方向でやってないなくて忘れかけてるのでメモ。

  • マシンのみから、フリーウェイトを入れた。
    • 当初はバーベルでbig3とかその辺から。
    • のちに上半身はダンベル、下半身はバーベルに変更。
  • 3セット10レップを辞めて、メインを2セット5レップとか徐々に高重量側に変えた。
    • 主にフリーウェイトの多関節種目に関して。
  • 食事は、朝は菓子パンと卵2個とりんごジュース、昼は居酒屋のランチセット、夜は牛丼並盛サラダセットとかそんなの。
    • 4食もやってみたけど、筋肉量的なプラスはなかったのでやらなくなった。
    • ささ身しか食べないのって色んな人に聞かれるけど、なんかTVでやってたとかだろうか?
      • それどう考えても減量食で筋肉減るよな。。。
  • 全身メニュー週3回を辞めて、1週間サイクル3分割メニューに変えた。
    • 5分割位まで増えたり3分割に戻したりとか色々変えた。
    • 1週間サイクルは基本変わらず。
  • サプリメントプロテインクレアチンと白砂糖。
    • 面倒なので筋トレ後に、WPC20gクレアチン5g白砂糖40gを混ぜて飲んでた。
      • 入れるにしてもせめて粉飴とかにするべきだとは思うが。。。
    • MRPその他も飲んでたことあるけど、効果が感じられなかったので結局辞めた。

まあこんなところか? 実際何がよかったのかよく分からんし、他人がこれやって効果あるのかもよく分からん。

5分割当時の種目がこんな感じ。

  • 脚後側
    • バーベルデッドリフト
    • マシンスタンディングカーフ
    • マシンライイングレッグカール
    • マシンシーテッドカーフ
    • マシンシーテッドレッグカール
  • 上半身下側
    • 45度オブリーク
    • ハンギングレイズ
    • マシンロータリートルソ
    • フロントネックカール
    • バックネックカール
    • マシンネックサイド
  • 脚前側
    • バーベルフルスクワット
    • マシンインナーサイ
    • マシンアウターサイ
    • マシンレッグエクス
    • ダンベルシュラッグ
    • マシンティビア
  • 上半身上側
    • ワイドプルアップ
    • ダンベルアーノルドプレス
    • ローケーブルロー
    • バーベルベンチプレス
    • マシンミッドロー
    • ケーブルビハインドネックラットプルダウン
    • バーベルアップライトロー
    • ダンベルサイドレイズ

Helixキーボードのキーマップ変更

HelixキーボードのhexファイルをUbuntuのavrdudeで書き込む - gos-k’s blog から大分時間が経過したが、やっとキーマップ変更に着手した。

以下参考にしたもの

QMKのファームウェアをもらってきて、自分用のキーマップを編集する。

git clone https://github.com/qmk/qmk_firmware
cp -r keyboards/helix/rev2/keymaps/default keyboards/helix/rev2/keymaps/gos-k
lem keyboards/helix/rev2/keymaps/gos-k/keymap.c

ファームウェアを書き込む。

$ make helix:gos-k:avrdude 
QMK Firmware 0.6.361
WARNING:
 Some git sub-modules are out of date or modified, please consider running:
 make git-submodule
 You can ignore this warning if you are not compiling any ChibiOS keyboards,
 or if you have modified the ChibiOS libraries yourself. 

Making helix/rev2 with keymap gos-k and target avrdude

avr-gcc (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Size before:
   text    data     bss     dec     hex filename
      0   16918       0   16918    4216 .build/helix_rev2_gos-k.hex

Copying helix_rev2_gos-k.hex to qmk_firmware folder                                                 [OK]
Checking file size of helix_rev2_gos-k.hex                                                          [OK]
 * The firmware size is fine - 16918/28672 (11754 bytes free)
Detecting USB port, reset your controller now..................
Device /dev/ttyACM0 has appeared; assuming it is the controller.
Waiting for /dev/ttyACM0 to become writable.

Connecting to programmer: .
Found programmer: Id = "CATERIN"; type = S
    Software Version = 1.0; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=128 bytes.

Programmer supports the following devices:
    Device code: 0x44

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9587 (probably m32u4)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file ".build/helix_rev2_gos-k.hex"
avrdude: input file .build/helix_rev2_gos-k.hex auto detected as Intel Hex
avrdude: writing flash (16918 bytes):

Writing | ################################################## | 100% 1.34s

avrdude: 16918 bytes of flash written
avrdude: verifying flash memory against .build/helix_rev2_gos-k.hex:
avrdude: load data flash data from input file .build/helix_rev2_gos-k.hex:
avrdude: input file .build/helix_rev2_gos-k.hex auto detected as Intel Hex
avrdude: input file .build/helix_rev2_gos-k.hex contains 16918 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.16s

avrdude: verifying ...
avrdude: 16918 bytes of flash verified

avrdude: safemode: Fuses OK (E:FB, H:D8, L:FF)

avrdude done.  Thank you.

特に難しい事もなく、さっさとやればよかった。。。

ABCLをちょっと触る

Scalaから何らかのLisp方言に乗り換える場合にはJVMのライブラリ関連があるからClojureを使うのが普通の流れな気がするが、Common LispにもJVMで動くABCLという処理系があるので試してみた。

Armed Bear Common Lisp (ABCL) - Common Lisp on the JVM

Docker使うととりあえず動く。

docker run -it easye/abcl

REPLが立ち上がるのでQuicklispを入れる。

(load "http://beta.quicklisp.org/quicklisp.lisp")
(quicklisp-quickstart:install)

GitHub - fukamachi/clack: Web server abstraction layer for Common Lisp

とりあえずhunchentootとclackを入れて、Usageにあるサンプルを動かしてみる。

(ql:quickload '(:hunchentoot :clack))
(defvar *handler*
    (clack:clackup
      (lambda (env)
        (declare (ignore env))
        '(200 (:content-type "text/plain") ("Hello, ABCL!")))))

UsageにはWebブラウザhttp://localhost:5000/ にアクセスしろ、とあるがdocker内で動作しているからdexadorで試す。

(ql:quickload :dexador)
(dex:get "http://localhost:5000/")

動いた。

"Hello, ABCL!"
200
#<EQUAL HASH-TABLE 4 entries, 11 buckets {33B1D2E7}>
#<QURI.URI.HTTP:URI-HTTP http://localhost:5000/>
#<TWO-WAY-STREAM {1A6F263C}>

HelixキーボードのhexファイルをUbuntuのavrdudeで書き込む

Helix キーボードキット | 遊舎工房 のドキュメントにはLinuxでの書き込み方が書いておらず、Releases · qmk/qmk_toolbox · GitHubLinux版も動かなかったので、コマンドラインから実行したメモ

# USBを接続する
stty -F /dev/ttyACM0 ospeed 1200 ispeed 1200
stty -F /dev/ttyACM0 speed 115200
# Helixのリセットボタンを押す
avrdude -p atmega32u4 -c avr109 -P /dev/ttyACM0 -U flash:w:helix_rev2_default.hex 

Nextremer退職

2018年6月で株式会社Nextremerを退職しました。理由はお察し下さい。

1年半チョットの在籍中、LEGOを動かしたり、ホビーロボを組み合わせて動かしたり ( ディープラーニングで「うまい棒」と「都こんぶ」を仕分けるマシン 20万回の訓練でつかむ位置まで正確に学習 - ねとらぼ)、ロボットシミュレーションの為にxml書いたりしていた。 後、機械学習Pythonも少し書いてた。

結果的に、遥か昔に辞めたはずのロボット開発に戻ってきたのは不思議な感じだった。何でもやっておくと役に立つもんだなあ。 そんなに深くやったわけではないけど、20年位前のロボット開発と比べて思うのは、色々パーツとかキットが抱負になったのと、3Dプリンターが安価になって使われてることか。

次の会社では再び職業Common Lisperになる予定 (2年ぶり2回目)

Graph 500のコードを動かしてみた

Graph 500 | large-scale benchmarks

Graph 500というスパコンベンチがあって、これのコードは公開されているので触ってみた。 スパコン持ってないので、実験機材は普通のノートPCにUbuntu 16.04が入ったもの。

まずはv3.0.0のコードをもらってくる。 https://github.com/graph500/graph500/archive/graph500-3.0.0.tar.gz

mpi関連をインストールする。

apt install mpich

展開する。

tar xzf graph500-3.0.0.tar.gz
cd graph500-graph500-3.0.0/

このままビルドするとリンクでエラーになるので、Makefile内のコンパイル引数に指定されている -lpthread とか -lm を後ろに持っていく。

ビルドする。

make

ビルド結果としては4つの実行ファイルが出来上がるが、名前に reference と付いている方は実行可能で、 custom と付いている方は動かない(本来の目的である、自分の実装をするためのものなので)。

ローカルでmpiの4並列実行してみる。

time mpiexec -n 4 ./graph500_reference_bfs 20

結果は長いので最後だけ抜粋。

SCALE:                          20
edgefactor:                     16
NBFS:                           64
graph_generation:               4.61012
num_mpi_processes:              4
construction_time:              1.36205
bfs  min_time:                  0.277266
bfs  firstquartile_time:        0.283024
bfs  median_time:               0.291698
bfs  thirdquartile_time:        0.302793
bfs  max_time:                  0.349763
bfs  mean_time:                 0.295806
bfs  stddev_time:               0.0167295
min_nedge:                      16775818
firstquartile_nedge:            16775818
median_nedge:                   16775818
thirdquartile_nedge:            16775818
max_nedge:                      16775818
mean_nedge:                     16775818
stddev_nedge:                   0
bfs  min_TEPS:                  4.79634e+07
bfs  firstquartile_TEPS:        5.54037e+07
bfs  median_TEPS:               5.75108e+07
bfs  thirdquartile_TEPS:        5.92735e+07
bfs  max_TEPS:                  6.05044e+07
bfs  harmonic_mean_TEPS:     !  5.67123e+07
bfs  harmonic_stddev_TEPS:      404095
bfs  min_validate:              1.18584
bfs  firstquartile_validate:    1.21473
bfs  median_validate:           1.22582
bfs  thirdquartile_validate:    1.26528
bfs  max_validate:              1.44657
bfs  mean_validate:             1.24752
bfs  stddev_validate:           0.0512569

real    1m50.265s
user    6m41.675s
sys 0m25.753s

なんとなく動いた。

Complete Results | Graph 500 を見るとパソコンレベルの1ノード構成でも1GTEPSくらいは出るみたいなので、max 0.06GTEPSはかなり遅い気がする。 reference だとそんなもんなんだろうか?