ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

Momoinololu M3 + Silent Step Stick TMC2100 で静かにプリント

どうも。

Momoinololu M3 / SmoothieBoard

ヤッパチーのときには間に合わなかったMomoinololu M3、つまりSmoothieBoardですが最近本腰入れてガッツリ使っております。

一回挿す電源間違えてふっ飛ばしたかと思ったときには、CPU自体が終わったかなと思いましたが、購入させていただいたショップの方などに問い合わせたところエンドストップのピンの挿し方がそもそも間違っていました。

Arduino MEGA + RAMPS v1.4と違ってSmoothieはmbedベースで演算も高速なのでアームの動きもスムーズになり移動速度も上がるというわけです。 精度は線分の分割数をあげられるのでスムーズになっているとは思いますが、速度面からの向上ほど良くは感じられません。

こんな感じで音は面白い感じです。

Smoothieでいいなと思ったのは公式ドキュメントがやたら充実しているという点です。

全てのコンフィグファイル内の項目: configuration-options [Smoothieware]

全てのサポートしているGコード: supported-g-codes [Smoothieware]

デルタ型の設定方法: delta [Smoothieware]

で、今まで使っていたMarlinと違ってまともにオートレベリングがサポートされているので復活させたわけであります。

https://www.instagram.com/p/BK4lmgdgXOx/ これで良さそう

するとかなりお手軽に刷れるようになりました。今まではオートレベリングでやっていることを手でやっていたのでだいぶ職人芸であったことをお思い出す。

https://www.instagram.com/p/BLA84P0gi_I/ 最後トラブった、おしい

これは途中まで順調だったのが最後らへんで台座から剥がれたというつらみのある一発でしたが。

今後はアレンキー型のオートレベリングプローブから圧力センサによる直接計測に挑みたいと考えております。圧力センサ自体は購入済みなのであとはそれをやる回路などをこの辺を参考に。。。

github.com

Silent Step Stick TMC2100

RepRap系のステッピングモータードライバはよく使われいているのだと以下の2種類があります。

  • A4988

www.pololu.com

よく使われているし僕の買ったキットに一番初めについてきたのもこれでした。多分コピーだけれど。

マイクロステップは1/16まで対応していて、まあ普通です。

  • DRV8825

www.pololu.com

DRV88xxシリーズはそこそこ広く使われているステッピングモータードライバっぽいです。

DRV8825は1/32マイクロステップまで対応していて精度良くなりそうですが実は1/16マイクロステップでも十分みたいな説もあります。

A4988 vs DRV8825 Chinese Stepper Driver Boards - RepRap

で、本家SmoothieBoardにはA4982ってのが直で実装されています。Momoinololu M3は安い分ステッピングモータドライバはついてこないですが、交換が可能です。 なので、今回はTMC2100っていうのに交換してみました。

ステッピングモータドライバって励起音でめっちゃピロピロピロ〜って鳴るんですけれど(鳴ってるのはつながっているステッピングモータの方から)、そんな音をだいたい消し去るSilent Chopなる謎技術がTMC2100には搭載されていて、確かに使ってみるとめっちゃ静かで不安になるレベルです。

www.youtube.com

みなさんは

Motortreiber - Watterott electronic

こちらで買っているようですが、わたくしはebayで買ってみました。そしたらなんか違うメーカーっぽいのが届いて色々ハマりました。

http://www.ebay.com/itm/-/272313645376www.ebay.com

多分同じメーカーのやつが米尼でも売ってました。

https://www.amazon.com/dp/B01I4JCABAwww.amazon.com

届いたので早速付けてみると、G28で原点に戻ったときにビィィィィィ〜〜〜〜って脱調っぽい感じで鳴って固まるという恐怖体験を繰り返しておりました。

で、米尼の説明を見ると、

Recommend highest print speed:40mm/s

とあり、原点に戻るときの速度ってどこだっけなって見てたら、

alpha_fast_homing_rate_mm_s 50 Speed, in millimetres/second, at which to home for the alpha actuator ( X axis or alpha tower )

たぶんこれで、300とか設定されていたのでこれを100まで抑えました(だって、40って2400mm/minってことだから、めっちゃ遅いやん。。。ってなって、ちょっと贅沢してちゃんと動いたのでとりあえずこれで……)

あとオートレベリングにやたら失敗しているので値を見ていたらYタワーがめっちゃずれるのでなんでかなって思って観察してたら下のステッピングモータ直結のピニオンギアが空転しているのを見つけてウウッとなりました。こういうのはメンテナンスと観察が大事ですなあ。。。

その後、やっと安定したと思って刷り始めたら何回かホットエンドが往復するとステージに衝突するのでなんでやと思って、色々推測を繰り返してステッピングモータのVrefを0.7Vまで喝入れしたら安定。アツアツになるけれど、

The calculation method of driver current:i=Vref*1.9/2.5

とのことなので、0.537Aですね。ちなみに前まで使っていたA4988はVrefを0.4Vに設定していて、こちらの式は

I_TripMax= Vref/(8*Rs)

で、Rsは確かモーター側の巻線抵抗なんですけれど、仮に0.05Ωだとしたら1Aになってだいぶかけ離れている感じになっていますが、まあそういう感じですかね(?)。うまくごいているからいいかなとは思っていますが。。。アツアツだけど。

次はCNCなどもやっているので、そっちをうまくやっていこうと思っています。 あとFSRレベリング。

こういう危うい感じでやってます

「お前ら!!!!画面の中から出てこーーいい!!!!世の中は3次元だぞ!!!!!!!!!!!!!」というタイトルで #yapc8oji 1日目で話します

みなさまどうお過ごしでしょうか。ワタクシは身体がバキバキですので良いマッサージ屋を探しております。どうもマコピーです。

さて、来る7/2(土曜日) YAP(achimon)C::Asia Hachioji 2016 mid で「お前ら!!!!画面の中から出てこーーいい!!!!世の中は3次元だぞ!!!!!!!!!!!!!というタイトルでトークをします。

Bの部屋で13:00から50分です。裏は@だったりして、僕はMySQLに関しては一家言ある人間ですので大変興味のある発表なのですが、裏なので見に行くことができません。 あとARスポーツの発表をおこなうテクノスポーツHADOというのも気になりますが裏なので見に行くことができません。

ですのでその時間帯はどれかに行ってもらって僕に後で聞かせてもらうか、もしくは僕の発表を聞いていただいて、その後に感想を言っていただけるなどして何がどうなっても100%、僕が幸せになりますので、そのような感じでよろしくお願いします。

さて内容ですが3Dプリンタをやる話で、3Dプリンタを使う話ではありません。そもそも3Dプリンタなど世の中に溢れすぎてもはやあたりに前になってきたのではないのでしょうか? むしろ僕はレーザーカッターを使いたい!

しかし、3Dプリンタを作る話はそんなに転がっていません(僕の観測範囲内では)。むしろ僕が聞きたいので3Dプリンタ改造について一家言ある方は僕に教えてください。 そうでない方に向けては、最もオープンハードウェアが成功したプロジェクトというものを紹介するトークとして聞いていただければな、と思います。

レッツ沼!

f:id:mackee_w:20160701232313p:plain

neovim導入したりvimrcを作った

どうも、春ですね、vimの時期です。 vimmerじゃない方はもちろんvimmerの方のみなさまも年に一度のvimrc作り直しの時期が来ているかと思われます。

わたくしも近年はSublime Text3やAtomなどを自宅環境に入れていましたが、今一番多く触っている仕事のPCではvimで作業しているため、コンテキストスイッチが多く発生しているのに困っていましたので、このさいなので自宅環境もvimに戻そうと考えました。

で、社会人になってから直していないvimrcをイチから書き直すついでにneovim環境にしてみたいと思います。

環境

インストール

  • neovimのインストール

github.com

$ brew tap neovim/neovim
$ brew install --HEAD neovim

--HEADをつけないとビルドに失敗した。上記ドキュメントにもついている

  • neovim-dot-appのインストール

MacVimを使っているので同じ感じになるかな?となり入れる

GitHub - rogual/neovim-dot-app: Mac OS X GUI for Neovim

$ brew tap rogual/neovim-dot-app
$ brew install --HEAD neovim-dot-app
$ brew linkapps neovim-dot-app

こちらも--HEADをつけないとビルドに失敗した

f:id:mackee_w:20160402215302p:plain

  • dein.vimのインストール

github.com

パッケージマネージャであるdein.vimのインストール。 ドキュメントだとinstaller.shを落としてきてスクリプトを貼り付けろという感じであったが、スクリプトを読んだらcloneしてきているだけだったので、ghqでcloneしてそちらを参照するようにする。

$ ghq get Shougo/dein.vim

installer.shを実行するメッセージに下記のような奴があるんだけれど、実行していないので、インストールしたパス用に書き換えて設定ファイルに入れる。

我が家環境ではghqを実行して入るのは~/src/github.com/Shougo/dein.vimなのでそのようにする。

あとデフォルトでShougo-wareが書いてあるが、後で整理しながら入れるので削除。

Please add the following settings for dein to the top of your vimrc (Vim) or init.vim (NeoVim) file:


"dein Scripts-----------------------------
if &compatible
  set nocompatible               " Be iMproved
endif

" Required:
set runtimepath^=$HOME/src/github.com/Shougo/dein.vim

" Required:
call dein#begin(expand('.'))

" Let dein manage dein
" Required:
call dein#add('Shougo/dein.vim')

" Add or remove your plugins here:

" Required:
call dein#end()

" Required:
filetype plugin indent on

" If you want to install not installed plugins on startup.
if dein#check_install()
  call dein#install()
endif

"End dein Scripts-------------------------

場所は~/.config/nvim/init.vim

テーマはとりあえずSolarized

会社MacVimでもAtomでもSolarizedを使っているので入れる。

" Add or remove your plugins here:
call dein#add('altercation/vim-colors-solarized')

起動時から使うように設定

let g:solarized_termcolors=256
syntax enable
set background=dark
colorscheme solarized

ただ、neovim-dot-app上でbackground変更が効かず……。捨てるしか無いか?

以下はTerminal.appでnvim起動して撮った。

f:id:mackee_w:20160402223500p:plain

クリップボード共有

Macのclipboardとvimでのyankを共有するために以下の設定を追加

set clipboard+=unnamedplus

補完

補完はShougo-wareであるdeoplete.nvimを使う。

github.com

インストールしようとしたらドキュメントに以下の記述を発見。

deoplete requires Neovim with if_python3. If :echo has("python3") returns 1, then you're done; otherwise, see below.

:echo has("python3")
0

がっくし来たので https://neovim.io/doc/user/nvim_python.html を見ながら環境を整える。

$ brew install python3
$ which python3
/usr/local/bin/python3
$ pip3 install neovim
let g:python3_host_prog = '/usr/local/bin/python3'

これでneovimを再起動すると

:echo has("python3")
1

となる。 これでやっと以下の記述を加えて:UpdateRemotePluginsを実行することで、deoplete.nvimが使えるようになる。

call dein#add('Shougo/deoplete.nvim')
"~~~~
let g:deoplete#enable_at_startup = 1

とりあえず基礎はこのぐらいですかね? あとは言語周り(GoとかPerlとか)を入れていきます・・・

机の上に柱と壁を作っていた週末

たまには、というか技術系の記事はQiitaに書いてこっちは日々を晒そうかなとか突然思って書き始めてみる。

んで、最近は家の中に柱と壁作ってました。

柱とは一体

賃貸とは窮屈なもので壁に穴を開けようものなら退去時に多大な支払いを行わなければならないというのは皆さんご存知だとは思いますが、かといって壁に穴を開けたいという衝動に駆られることもしばしば。 ですがそこは、社会的な動物である人間、己の拳ではなくスマートに行こうということでいろいろ調べてみました。

動機といえば机が狭いことに尽きます。我が家は公称8帖であるものの、寝相の悪い自分をフォローしようとセミダブルのベッドを置いている関係上、寝る以外のスペースが狭いです。また自作PCエオルゼアを楽しむエリアなんてのも設置しており、机を置こうとなったときに使えるスペースはわずかしかありません。

で、これを置いています。

マイデスク ワイド80cmタイプ ナチュラル木目 HDA-8045NM

マイデスク ワイド80cmタイプ ナチュラル木目 HDA-8045NM

椅子は背もたれがあると邪魔なのでこれ。

サンワダイレクト バランスチェア ガス圧昇降タイプ 100-SNC038

サンワダイレクト バランスチェア ガス圧昇降タイプ 100-SNC038

長時間座るとヒザかケツが痛くなりますがそういうものなので慣れなんだろうなと思いました。

でもこの机はせまくて、奥行き45cmしかないので、Macbook Air 13inchを置くとだいたい終わりです。で、さらにそこから電子工作のためのスペースや飯くったりすると狭くて狭くてどうにかならんもんかと思っていました。 そこで気づいたんですけれど、机の上にものが多すぎるな、と。ドライバーしかりTimeMachine用のHDDだったりUSB充電器だったり。そういうのどっかにやれないかなと思って調べてたらこういうのがあって、

chamapoco.com

ディアウォールで賃貸の部屋に柱を立てて壁一面のテレビ台&棚を設置。

なるほどなーっと。 まあブコメとかで地震とかには弱そうだなと思ったけれどそうなったときに命ぐらいは助かって上に乗っている奴とかはまあ諦めるかとなって、ベッドまでの距離だと外れても飛んでこないかなという位置に置こうかなと思いました。

実践

とりあえずAmazonでディアウォール頼みました。

そんでもって柱はどうしようかなと思って、最近興味のあったカーシェアを契約してスイフトでシュッと近くのホームセンターへ。

いわゆる買ったのはツーバイフォー材というやつで、建築材料コーナーに有りました。ホームセンターはたいてい何センチで切ってくださいと言うとシュッと切ってくれるので、便利です。なんか空気圧でキュイーンって切る機械でした。

そんでもって我が家の天井が何センチでーってのはメジャーで測っていたのでそれでスパっと切ってもらい、端材も机の横幅プラスアルファぐらいだったので、一緒に持って帰りました。

ただ、

という感じで、視界も不良ですので、ホームセンターでは軽トラ借りて持って帰ったほうが良さそうです。往復めんどくさいから借りなかったんですけれど、ちょっと次から軽トラ借りようってなりました。

で、家に持って帰ったあとに電動ドライバーをAmazon Prime Nowで購入しまして(ホームセンターのは割高だったので)、2時間後に届くわけですが。

買った電動ドライバーが缶に入っていて戸惑いを感じる

ブラックアンドデッカー(BLACK+DECKER) コンパクトパワーアシスト 3.6V AS36LN

ブラックアンドデッカー(BLACK+DECKER) コンパクトパワーアシスト 3.6V AS36LN

まあこれで下穴を空けつつ粛々とやりまして、

部屋に柱を二本立てました

机の上に棚ができて便利

そんな感じで一旦便利になりました。

壁とは一体

しかし柱が出来ると人間は欲が出来て壁が欲しくなるものです。まあオッサーレな感じでドライバーを吊るしたいなと思ったんですけれど、調べてたらこんなの見つけまして、

matome.naver.jp

あ、エエなあと思って、またホームセンターに行ったのでした。

前行ったのは島忠ホームズなんですが、次行ったのは木材がいっぱい揃ってるコーナンPROに行きまして、そこでまたカットしてもらいつつ買いました。 端材は使いみちなさそうなので処分してもらいました。

で、こうなりました。

壁を壁につけてこうなりました

ケーブルが雑なのでまとめたいという感想はありますが、夢が広がる感じはして便利ですね。

まあそんな感じでした。今度近くにホームセンター出来るっぽいので楽しみです。また木材を切りたい。

sqllaというSQLビルダーを書きました。

github.com

sqllaというSQLビルダーを書きました。特徴はある程度型安全であること、リフレクションを使用していないこと、既存のクエリビルダよりある程度高速であることです。

使い方

インストールはごく簡単で、goが入っている環境で以下のコマンドを打ちます。

$ go get github.com/mackee/go-sqlla/cmd/sqlla

まず以下の様なテーブル構造を表したstructを用意します。 そして、sqllaに必要なタグを付加していきます。 また後述のgo generateで必要なコメントも足しましょう。

user.go

//go:generate sqlla

//+table: user
type User struct {
    ID uint64 `db:"user"`
    Name string `db:"name"`
}

そしてこのファイルが置かれているディレクトリ内で以下のコマンドを実行します。

$ go generate

すると、user_auto.goというファイルが生成されます。

このファイルにSQLを組み立てるメソッドが生えています。以下のように使います。

q := NewUserSQL().Select().ID(uint64(1)) // SELECT id, name FROM user WHERE id = 1
query, args, err := q.ToSql()
row := db.QueryRow(query, args...)
var id uint64
var name string
err := row.Scan(&id, &name)

ID(uint64(1))のところはuint64の型以外のものを入れるとコンパイル時にコケるようになっているので安全ですし、補完も効くため大量のテーブルや複雑なカラムがあるアプリケーションを書くときに便利です。

またLIMIT句やOrderBy句も使うことが出来ます。

基本的なCRUDについてはサポートしています。

今後やりたいこと

READMEにTHIS IS A ALPHA QUALITY RELEASE. API MAY CHANGE WITHOUT NOTICE.と書かれているようにまだexperimentalな感じでちょっと常用には耐えない感じですが、いろいろ悩んでいるのでブログを書いてみました。

今後やりたいこととしては、

  • 文字列連結に+を使っているのをやめる。コレがかなり速度的に足を引っ張っていると思われる。
  • IN演算子のサポート。以下の様なものを考えている
NewUserSQL().Select().IDIn(1,2,3,4)

ちなみに演算子周りはちょっとまだ不格好

NewUserSQL().Select().ID(uint64(100), sqlla.OpGreater)

=のときは省略できるように可変長引数でやっているので、演算子が後置になっている。sqllaの演算子を覚えなくてはならないのでどうしようかなとなっている。

  • これ書いてて思ったけれどまだint系とstringしかサポートしていなかったのでfloat系とtime.Timeとかをサポートする。あと[]byteでblobぐらいかなあ。

  • JOIN句のサポート

NewUserSQL().Select().Name("hogehoge").Join(func (r *UserJoiner) {
    rj := NewUserItemJoiner()
    r.RelationId(rj.UserId)
    r.AddColumn(rj.ItemId, rj.Amount)
})
// SELECT user.id, user.name, user_item.item_id, user_item.amount FROM user JOIN user_item ON user.id = user_item.id WHERE user.name = "hogehoge";

出来るかどうかはやってみないとわからない。

とまあそんな感じでオレオレDSL的なものを覚えないといけないので、シンプルなやつでええわ〜ってのは、id:motemenさんのsqlfが良いと思います。

motemen.hatenablog.com

また、仕事ではsquirrelを使っており、sqllaのメソッドチェインとかもsquirrelを参考にしています。

github.com

そもそもの動機はsquirrelがリフレクションを使っており、goの型がキャンセルされるので型を使うようにしたかったというのがあります。

その他

go-genddlなるものも書いておりました。仕事でこれの改造版を使っております。 上で書いたようなタグ付きstructをCREATE TABLE ~といったDDLに変換してくれる君です。最近sqlite3もサポートしており、sqllaのテストでも使っております。 github.com

改造点は複合インデックスや複合ユニークキー、複合PKが貼れたり出来るところですが、ちょっと大雑把すぎるのでもっとちゃんとしたいのにしたいところ。

と思っていたらdrone.ioで似たようなのが出たっぽいです。

github.com

みんな似たようなこと考えているんですね、、、

また、仕事ではmigrationにGitDDLを使っております。ちなPerl metacpan.org

migrationスクリプト的なものを書かずに済むので非常に便利なのですが、いかんせん起動が遅いのでGoで書けないかなと思っていたけれど、SQLパーサーだったりDiffを出すところが非常に複雑というか僕の腕ではとても書けなかったのですが、最近id:soh335さんがschemalexというのを書いていた。

github.com

まだ試してはいない。

sqllaにある程度機能が入ったら次はORM(structでは?)だと思いますのでご期待ください。

YAPC::Asia Tokyo 2015に参加&トークしてきました #yapcasia

どうもマコピーです。 昨年に引き続きトークしてきました。

yapcasia.org

togetter.com

しゃべったこととしては、以下の2つ。

  • 過去に行ったプロポと呼ばれるラジコンのコントローラの信号を模倣することで自動制御を行う
  • MultiWiiというオープンソースのフライトコントローラが喋るプロトコルPerlで実装して通信して自動制御を行う

またデモできなかったし、ソースコードは毎度のごとく整理してからアップしますが、去年は12月に公開という遅いスピードでしたので、欲しい方は催促をお願い致します。

聞いたトーク

メリークリスマス!

yapcasia.org

  • Larry WallによるPerl6の機能紹介かなと思いきや、概念トークの香りがしつつ、概念が実体化されてPerl6へと消化されていく過程の話
  • 時折ジョークがだいぶ混入してきて同時通訳の人も戸惑っていた気がするw
  • 主軸はトールキンホビット物語をPerl5、指輪物語をPerl6に関連付けてSecond System Syndoromeの話や、Perl5の資産がありながらも夢の様な言語、Perl6を作るのに何を捨てて何を受け継ぐか、という概念的な話でした。すごく物語チック。
    • 夢の様な言語、というのは僕は強力なGrammerやマルチスレッドなどを見てLL大統一言語(物理学の大統一理論になぞらえて)という言葉を発想してそれからなのだけれど
  • 「成功した言語を作れるのは世界を作れる人」という趣旨の発言があったが、言語というのは世界であり、世界もまた言葉で表現されるんだなと、同人小説を書いている身としては感慨深い感じでした。特にLarryは言語学者であり、トールキンもまた言語学者なわけで、言語を作るのに必要な能力が言語を知り尽くす事であるならば、世界を作るのに必要な能力もまた言語を知り尽くすことであるわけで、それぞれプログラミング言語、ハイファンタジー小説と分野は違えど共通する点がいっぱいあるなってなってます。ちょっとグッときてて言葉が散らかっています。
  • というわけで、Larryは予防線を張りまくっていたけれど、クリスマスにはベータ版が出るとのこと! それまでにはデカい3つの仕事があるけれどやってくぜ!っていう宣言で締めくくりました

Web由来の組み込みエンジニアの半年間のすべて 〜WebとiOSとBLEとハードウェアデバイスのこと〜

yapcasia.org

  • 仕事でデバイス作るのって想像に容易くないぐらい大変だと思うんですが、聞いていると想像以上に大変だなあと
  • 何が大変かというと、これは僕が普段サーバサイドでクライアントアプリを書いている人やデザイナー、ディレクターなど多くの職種がかかわる環境で働いている経験から、分業しつつ1個のものを作るっていうのはめちゃくちゃ大変で、特にまたがる領域なんかはお見合い落球とか押し付け合いとか意識が薄れるゾーンでもあって、でもそこが重要なんだけれど……みたいな感じです
  • ハードウェアの場合、分業の領域は kazuphさんの場合だとメカ(機械機構や構造)、エレキ(電子回路)、ファームウェア(マイコンのソフトウェア)、APIサーバと分かれているようですが、漏らしていたのが「エレキの人がもう少しファームを書いてくれれば」というところ。僕は前仕事でやった時は回路引いてファーム書いてファームと通信するライブラリまで書いて、その上を他の方にお任せしたんですが、これはうまくいった。しかしこれはあくまで一般に出回る製品にする仕事ではなかったのでよかったのですが、この話だとAkerunは一般に出回る製品なわけです。相応のクオリティが要求されるし、求められるレベルも高い。のでそれぞれのプロがそれぞれの領域にすごく意識を集中している。そこでまたがる領域、この場合だとおそらく電気回路からの入力をマイコンで受けてそれを上位のレイヤーに引き渡すみたいなところだと思うんですけれど、そこはそれぞれが分からないと書けないので、両方出来る人が1人でやらない限りは、お互い歩み寄って意図を伝えて議論をして仕事しないといけないんですけれど、これがめちゃくちゃ難しい!!!!!!!
  • ハード一人でやって来たけれど複数人でやるとこういうのも起こるんだなあという感想をいだきました

Perlで学ぼう!文系プログラマのための、知識ゼロからのデータ構造と計算量

yapcasia.org

  • 僕は高校、大学とガチ理系なはずなんですが、コンピュータサイエンス出身ではなくずっと電気学科で回路図を見て計算をしていた人間なので、このあたりの計算量の話とかデータ構造の話とかはなあなあにしてきた部分ではありました。なあなあだけれどぼんやりでもWebエンジニアは出来るんだなと今思ったけれど、同僚に突っ込まれることはある……
  • ほいでこのトークを聞いて連結リストとかB木の計算量がO(n)だったりO(log n)だったりするのは知識では知っていたのだけれどあらためて説明されて納得という形まで落とし込めたのはすごいよい体験だなと思った。
  • あとデータ構造はどうすれば理解が深まるかという質問があって、僕の体験を話すと、去年pagerdっていうページャー専用DBなるネタ兵器を作ろうとしてそのときに手でDBを作るようなことをしたのだけれど、DBをイチから作るというのは結構よくて、目的にあった効率的なデータの持ち方というのを調べまくって考えるのでだいぶ良いです。マッチョですがおすすめいたします

PietでLISP処理系を書くのは難しい

yapcasia.org

  • 若干僕はプログラミング言語愛好家的な面もあると思っているんですが、もっぱら実用的なやつを調べるばっかで、難解プログラミング言語に関してはノーマークだったわけですが、Pietはヤバイ。
  • Pietって画像がソースコードで1ドット1ドットが命令になってドットの上をプログラムカウンター的な奴が走っていくっぽいんですが、今でも自分が何を言っているのかわからない程度の難解さかつ面白いトークでした
  • これがソースコードですと言って、よくわからないドット絵(人間には何が描かれているのか理解できない)を毎回見せられるのがやばい
  • さらにその上に独自にLisp処理系を実装しようとしている時点で、かなり先端を突っ走っているホビーと言える。とにかくやばい
  • KMCという団体がなかなか謎で京大マイコンクラブと銘打っているのに会場にいる人間に入会を迫ってくるし、トークしている方がもっともおすすめできるPietのエディタがKMCに入らないと入手不可能という権威を誇っている。なおこのあと公開されたようです。
  • Pietはやはり人間に難しいので、ニーモニック的なAltPietとも言うべき言語があるらしく、さらにそれを拡張したAltAltPietがあるらしく、ここが地獄の一丁目かと思えるが、ホビーなのでそんな状況でも楽しめる人間は大した種族だなあという発見をした

Perl6 on JVM: It works??

yapcasia.org

  • Perl6は使えるのかどうか?という話
  • Perl6の処理系の一つであるRakudo StarはJVM実装とMoarVMと呼ばれる独自のVM実装があり、これらが平行して開発が進められている、というのは冒頭のLarryの話でもありましたが、そのうちJVM実装は現時点で使い物になるのか?という検証
  • 結果的に言えばWebアプリケーションでよく使われるであろうパーツ、例えばHTTPクライアントであったりDBであったり、そういったものは(一部難はあるが)ひと通り揃っている
  • 一つどうしてもきになるのはやはり起動速度で、perl6-j -e 'say "Hello"とやるだけでも16秒ぐらいかかる。ちなみに僕の環境だと最新のRakudo Starでperl6-j --versionとやったら5秒かかる。
  • Webサーバは起動しっぱなしなので起動時間がそこまで重要な要素になってくるかと思われるともしかしたら気にならないかもしれないし、多くの人が触っているJVMJITが効くので起動しっぱなしアプリはもしかしたら速いかも。これは要検証ですね

Parallelism, Concurrency, and Asynchrony in Perl 6

yapcasia.org

  • タイトルの通り並列、非同期、平行を軸にPerl6の機能を見ていくというもの
  • Perl6はマルチスレッド言語です!!!! これは驚きとともに歓喜
    • Perl5はスレッドを(まともには)扱えない。我々Perl5でアプリケーションを書いている人間でマルチコアを使いたい場合はforkを使っていた。コレはいろいろな面で良くていろいろな面で不利を抱えているのだけれど、そんな理由もあって僕はマルチスレッドを理解しやすく扱えるGolangを最近書いているというのもある。
  • 宣言的に処理を書いたら勝手にパイプが組まれてストリーミングプロセッシング的なことが出来るという話があって「!?!?」となった。Perl6のスケジューラ氏が気になる。実用的かさておき夢っぽい。
  • C#のasync/await的な機能があるが、もっと抽象化されているsupplyとかreact、wheneverというのがあり、これらは同期的な処理を非同期的な処理に変換しただろうかという発想で出てきたものらしい。wheneverはforループにあたる。PromisesとかChannel的な挙動も出来るのだけれど、わかりやすい、ここは桃源郷か? なおこのあたりがRakudo Starにマージされたのが5日前らしく、今のリリースパッケージには入っていないっぽい。
  • このあとPerl6のOO的なコードが出てきてPerl5脳が機能停止したので、だいぶ読めない。class methodあたりはM族ライブラリ(Moose/Mouse/Mooなど)で使えるのでまあわかるが、%!hashってなんだ!?
    • 調べたところ!がつくとprivate accessorになるっぽい
  • 飛行機の席を取るときにマルチスレッドで並行で走ると同時に同じ席をとったりしてやばいよねーという話題で、そのときにメソッドをアトミックに実行する(おそらくarroundして入り口でロックを取り出口で外す)ようなふうにmixinしてくれる(mixinなのかはコードが読めないので憶測)やーつで、いかがそのソースコード質疑応答で複雑ではないか?というのに対しすごく薄いと言う答えであったが、コード量はそうでもないがPerl6力が足りなくて読めない
  • というわけでPerl6にすごく期待が持てるトークでした。たぶんリリースまでにいくつかのシンタックスの最適化とか機能の実装が入ると思いますが、そのあとに皆さん気になっているパフォーマンス改善の話がやってくると思うので、僕は座して待つ。

Profiling & Optimizing in Go

yapcasia.org

  • bradfitz氏のGoプログラムのチューニングのライブコーディング
  • 普段仕事でGoを書いているのですがよく「メモリアロケーションがー」とか「文字列連結がー」とか言われて、ふむふむなるほどと思いつつもぼんやりしていた理解なのですが、軽快なライブコーディングでちょっとだけ理解が進んだ気がする。
  • 例えば[]byteをstringを受ける関数に投げるとき、しかもそれが複数の文字列を連結した渡したい場合ってよくあるんですけれど、お手軽にやるなら[]byte("hoge" + "fuga" + "bar")みたいな感じにするんだけれどこれだと何回かメモリアロケーションが走ってメモリ確保にCPUがぶんどられてしまうので、それならfmt.Fprintfio.Writer実装しているやつに一気に流し込もうや、って話とか、fmt.Fprintfinterface{}で受けるのでそれだとreflectが使われて遅いので裏技的にsync.Pool使ってreflectを回避するとか(この方法はネタなので実際にはやらないでねとのこと)、そういう話でした。
  • 便利ツールとしてpprofでcpuを使っているステートメントを見たり、同じくメモリも解析したり、さらに複数ベンチマーク結果を後から比較していい感じに出してくれるツールなどピリッと辛いツールが出てきてGo way〜って感じでした

その他

  • YAPC終わりとみんな勘違いしているけれど、あくまで今の体制でのYAPCが終了なわけで誰かが挙手すれば続けられるという状況は実は2013年が終わった時とあんまり変わらないんじゃないかなあと思う。外から見れば
  • で、今回の2000人規模がデカすぎて、準備の負荷が高いからもっと小さい規模でやるというのは結構な人から言われている意見で、それをポツポツやるのもいいと思う!!!
  • ア、Yokohama.pmやらないと
  • Beaconというのもやるらしく期待。僕はWebの人でもありMakerの人でもあると(自分で勝手に)思っているのだけれど、本来これら2つは別に明確に分ける必要はなくて双方が双方で歩み寄って干渉しあう事できないかなーと思っていたので、(もしかしたらそういうことじゃないかもしれないけれど)すごく期待。

以下は闇

今回の目標は「今喋りたいことを今喋る!」ということなんですけれど、それはお概ね達成出来ました。特にアナログスイッチを使った切替回路とかフェイルセーフの仕組みなどは実装した当時からコレをいつかどこかで話したいなーと思っていて、記憶からなくなる前に喋れたので良かったです。

でもちょっと喋りながら反応を見ていて思ったのが、聴衆が期待していたトークともしかしてだいぶ違っていたのでは?という点についてです。 民生のクアッドコプターのうち、やはりParrot社のものがソフトウェアからのハックがしやすく、そもそもLinuxを積んでWiFiが喋られる、さらにSDKまで公開されているものは他にありませんし、今回のトークには持ってこいかと思われます。 そうなんですが、僕はやるとなれば持てる技術を投入して自分が面白いと思える方向に突き進む人間でして、特に趣味となれば合理性をガン無視して面白軸で行くのですが、さてそれがあのタイトルで見に来た方の期待に沿ったトークであったかと言われると、ちょっと自己満足すぎたのではないかなあと思いました。

と長々と反省しておりますが、多くの人がよく分からないが面白く話す人もいるのでそっち方向に鍛えるか、それともこういう尖ったテーマを大勢の前で話すのは控えるか、という話になるなあと思いました。 そんなわけで、今は皆様の感想がなくて僕が卑屈になっていっている一方なので、感想をください。よくわからんかったとかでもいいので・・・

そういうわけで画面汚し失礼しました。