歩いたら休め

なんでこんな模様をしているのですか?

【Rust】Rustで数値計算プロジェクトを試す その4

昨日の続きで、Rustのcratesを利用してサインカーブをプロットしたいのですが、エラーが出てしまっています。gitconfigは、以前source treeを利用していた際のものが残っていただけだったので、ちゃんと設定し直しました。

エラー箇所を確認するためのシンプルな例をコンパイルしてみました。

extern crate plotlib;
use plotlib::scatter::Scatter;

fn main() {
    // Scatter plots expect a list of pairs
    let data1 = [(-3.0, 2.3), (-1.6, 5.3), (0.3, 0.7), (4.3, -1.4), (6.4, 4.3), (8.5, 3.7)];

    // We create our scatter plot from the data
    let s1 = Scatter::from_slice(&data1);
    println!("{:?}", s1);
}

やはりこういうエラーが出ます。

$ cargo run --verbose
       Fresh svg v0.5.12
       Fresh plotlib v0.3.0
   Compiling duplex-pendulum v0.1.0 (/Users/takeshi/Desktop/projects/duplex-pendulum)
     Running `rustc --edition=2018 --crate-name duplex_pendulum src/main.rs --color always --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=f4638e3323e9a474 -C extra-filename=-f4638e3323e9a474 --out-dir /Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/deps -C incremental=/Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/incremental -L dependency=/Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/deps--extern plotlib=/Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/deps/libplotlib-2ce36c14f3ccea1e.rlib`
error[E0599]: no function or associated item named `from_slice` found for type `plotlib::scatter::Scatter` in the current scope
 --> src/main.rs:9:14
  |
9 |     let s1 = Scatter::from_slice(&data1);
  |              ^^^^^^^^^^^^^^^^^^^ function or associated item not found in `plotlib::scatter::Scatter`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0599`.
error: Could not compile `duplex-pendulum`.

Caused by:
  process didn't exit successfully: `rustc --edition=2018 --crate-name duplex_pendulum src/main.rs --color always --crate-type bin --emit=dep-info,link -C debuginfo=2 -C metadata=f4638e3323e9a474 -C extra-filename=-f4638e3323e9a474 --out-dir /Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/deps -C incremental=/Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/incremental -L dependency=/Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/deps --extern plotlib=/Users/takeshi/Desktop/projects/duplex-pendulum/target/debug/deps/libplotlib-2ce36c14f3ccea1e.rlib` (exit code: 1)

ただ、他の関数(style)を無理やり呼び出すコードに変更すると「function or associated item not found in〜」のエラーは起きないし(引数の型の問題でエラー起きる)、名前空間関連の問題であるように思います。

github.com

なんだか消化不良ですが今日はこれくらいで。Rustの最近のコンパイラのバージョンで名前空間の仕様が変わったとかかな…。

【Rust】Rustで数値計算プロジェクトを試す その3

数値計算のプロジェクトでは、結局グラフの形式で出力することも多いと思います。csvで出力して古き良きgnuplotでもいいんですが、Pythonのmatplotlibみたいなのが無いか調べます。

pure Rustのこちらのライブラリを試してみます。

github.com

しかし、こちらのサンプルコードをコンパイルしようとするとエラーが出てしまいます。

extern crate plotlib;
use plotlib::scatter::Scatter;
use plotlib::scatter;
use plotlib::style::{Marker, Point};
use plotlib::view::View;
use plotlib::page::Page;

fn main() {
    // Scatter plots expect a list of pairs
    let data1 = [(-3.0, 2.3), (-1.6, 5.3), (0.3, 0.7), (4.3, -1.4), (6.4, 4.3), (8.5, 3.7)];

    // We create our scatter plot from the data
    let s1 = Scatter::from_slice(&data1)
        .style(scatter::Style::new()
            .marker(Marker::Square) // setting the marker to be a square
            .colour("#DD3355")); // and a custom colour

    // We can plot multiple data sets in the same view
    let data2 = [(-1.4, 2.5), (7.2, -0.3)];
    let s2 = Scatter::from_slice(&data2)
        .style(scatter::Style::new() // uses the default marker
            .colour("#35C788")); // and a different colour

    // The 'view' describes what set of data is drawn
    let v = View::new()
        .add(&s1)
        .add(&s2)
        .x_range(-5., 10.)
        .y_range(-2., 6.)
        .x_label("Some varying variable")
        .y_label("The response of something");

    // A page with a single view is then saved to an SVG file
    Page::single(&v).save("scatter.svg");
}

いくつかエラー出てますが、「どうやら関数が名前空間に存在しない」ような感じのエラーのようです。ただ、実際のコード見てもあるんだよなあ…。

> cargo run
   Compiling duplex-pendulum v0.1.0 (/Users/takeshi/Desktop/projects/duplex-pendulum)
error[E0599]: no function or associated item named `from_slice` found for type `plotlib::scatter::Scatter` in the current scope
  --> src/main.rs:13:14
   |
13 |     let s1 = Scatter::from_slice(&data1)
   |              ^^^^^^^^^^^^^^^^^^^ function or associated item not found in `plotlib::scatter::Scatter`

また、私も ~/.gitconfig の設定の問題で、↓の問題が起こってcratesを追加できなくなってしまっていました。これは解決したのですが、いろいろ設定いじってたらgithubの認証が利用できなくなる問題が…。後でなんとかしよう。

github.com

【Rust】Rustで数値計算プロジェクトを試す その2

前回のあらすじ: 「Rustで数値計算(二重振り子)して結果をアニメーションで表示したい!」と思っています。クソ記事量産してる感もあるんですが、以前チュートリアルをしていて「どこまで自分が分かっていて、どこから先分かってないのか分からない」みたいな状況になってしまったので振り返りのために書いてます。

簡単なトイケースとして「サインカーブをプロットする」のを目標にコードを書いています。ひとまずこんなの書けました。

fn main() {
    let mut curve = vec![];

    for i in 0..100 {
        curve.push((i as f64).sin());
    }

    println!("{:?}", curve);
}

ちょっと詰まったのが、 int のままでは sin() が呼び出せず、 float 型にキャストする必要があってその方法くらいですね。このあたりはC++の反省を活かして、型変換を明示する仕様に作り上げてるんだと勝手に思ってます。

あと、不要なライブラリをインポートしないイメージがあるんですが、 #include <math.h> みたいなこと書かなくてもいいってことは、余計なものをロードしない仕組みもありそうな雰囲気してます(雰囲気で話してます)。

「Rustにmatplotlibのようなライブラリが無いか」も探しています。

github.com

ただ、内部でPythonを呼び出してるライブラリが多く、「普段pipenv(pyenv + venv)の仮想環境使ってるけど、その呼び出しするときにけっこう詰まりそうだな」って思ってしまっています。

【Rust】Rustで数値計算プロジェクトを試す その1

これから伸びていって「今はPython(numpy)でやっているような数値計算もRustで、高速に抽象的に書けるようになるんじゃないかな」と思っています。

github.com

今まで何度かトライしたものの、「お前まだチュートリアルやってるのかよ」ってプログラミング友達に馬鹿にされる毎日でした。ひとまず使い方として想定する「数値計算プログラム」をRustで書いてみて、モチベーション保ちつつ実装していく作戦です。

Haskellと同様にtraitで数学の抽象的な概念を扱えるらしいし、C++の代替言語を目指しているだけあってGC等のプログラマーがコントロールできない遅い処理が排除されています(その分lifetimeの管理が難しいのですが…)。

今日はひとまず、「配列を破壊的変更してprintする」ことをしました。初歩的ですが、ひとまず第一歩です。

$ rustup --version
rustup 1.16.0 (beab5ac2b 2018-12-06)

コードはこんな感じ。

fn main() {
    let mut v: Vec<i32> = vec![1, 2, 3];

    println!("v = {:?}", v);

    update_vector(&mut v);
    // debug print
    println!("v = {:?}", v);
}

fn update_vector(v: &mut Vec<i32>) {
    v.push(1);
    v[0] = 4;
    println!("v = {:?}", v);
}

【メモ】「書かれていないこと」に注目する

私には英語圏出身の友達が何人かいるんですが、何を言ってるのか分からないときがあります。大抵プログラマーかアニメ・オタクなのですが、できるだけ自分の意見をしっかり(そしてなるべく建設的に)表明する能力や、時折日本人の私から見ると言動にカウンターカルチャーっぽさを感じることがあります。

人によっては日本語と英語をしゃべってるときに、それぞれの文化っぽく立ち振舞いの変わる人もいて面白いです。ある人は「私」を表すのに、日本人モードのときは顔を指差し、アメリカ人モードのときは心臓を指さします。

私も「(異なる文脈の相手に対して)建設的に意見を表明する」みたいなところは参考にしようと思っていて、それに影響した文化や歴史にそこそこ興味あったのですが、ちょうどいい本を見かけたので読んでいます。

授業力アップのための英語圏文化・文学の基礎知識 (英語教師アップシリーズ1)

授業力アップのための英語圏文化・文学の基礎知識 (英語教師アップシリーズ1)

ただ、その意図とはあまり関係ない箇所が気になったのでメモします。

P69~、「マルクス主義批評」の紹介で「『ダロウェイ夫人』という上流階級の小説の中で、労働者が暗黙の前提として描かれていない」ことを指摘する批評が紹介されています。

上流中産階級の彼女が徒歩で大きな荷物を抱え,帰宅することなど不可能で,タクシーを利用していることは間違いないのだが,ウルフはその「目に見えないタクシー」を暗黙の前提として,描いていない.「目に見えないタクシー」から下部構造が,書くにも値しないと無意識のうちに思われ削除される/搾取される人々の存在が現れる.タクシーだけでなく夫人の衣食住が彼女の労働によって得られたものではなく,多くの労働者の労働によって得られていることが見えるようになる.

こちらの本の『不可視の階級闘争をあぶり出せ』で紹介されている「Can Jane Eyre Be Happy?」という論文だそうです。今の日本なら「コンビニ外国人」なども似たような立場かもしれません。

知の教科書 批評理論 (講談社選書メチエ)

知の教科書 批評理論 (講談社選書メチエ)

www.msz.co.jp

同じように、ソフトウェアエンジニアの仕事でも「暗黙の前提として描かれていないもの」に悩まされることが多いように思います。例えば「企画があるもののどう実装するのか具体的でない」「良いものを作れば広まると信じ切って、営業活動が考慮されていない」「データを組み合わせることが前提だけど、必要なデータが揃っていない」など、考え始めるといくらでもあります。今まで「なんかこのプロジェクト、現実味無い気がするんだよなあ」って違和感もちながら進んでしまっていたものが、一部は説明(〇〇が前提だけど考慮されてないじゃないか)できるように思います。

そうすると次は「どうすれば不可視の前提として省略されてしまっているものに気づけるか」という問題が出てくる気がするんですが、今のところは「実際モノ作って動かしてみる」「ラフを描いて経験豊富な、そしていろいろな先輩に見せる」くらい無いと思っています。

【本】イケてないソフトウェアエンジニアのための『リサーチの技法』

我々ソフトウェアエンジニアは、日々自分なりに新しい技術動向を調べて、それをまとめて適切な分野に投資していく必要があります。

それでなくても、あの新しいライブラリやプログラミング言語が良いとかいう話から、日々の業務で同僚はなんだかよくわからない機械学習の手法の話もしてるし、はてはなかなか問題の尽きないコミュニケーションのスキルまで身につけながら対処していかなきゃいけません。

「自分の興味だけで調査すべき分野は見つからないし、どうすればいいんだ」「でもなぜか適切に学習できてる奴もいるから何かしら方法はあるはずだ」って悩んでる人も多いと思います。それでいろいろ調べていく中でこの本も読みました。

リサーチの技法

リサーチの技法

本書が提供する価値:「ぼんやりとした「興味」を、解決の意味ありと読者が判断する「課題」に持っていく方法」「読者が主張を真剣に受けとめてくれる「議論」を構築する方法」「見識はあるが批判的な読者の懸念事項を予測し、それに対して適切に答える方法」「「それがどうした?」という、読者による最も厳しい問いに答える序論と結論を書く方法」「自分が執筆した文書を読者の目線で読み、そして、いつ、どのようにしてそれを修正すべきかを判断する方法」全米70万部超の古典的名著。大学、企業、研究機関などでリサーチする人、必読。

この内容、ソフトウェアエンジニアでも使えそうじゃありません?この本の『PART II 問いを設定し、答えを見つける』をベースにメモをまとめてみます。

リサーチを計画する - 概観

「リサーチクエスチョン(課題に対する問い)」の決定の4つのステップはこんな感じ。

  1. トピックを見つける
  2. そのトピックに問いかけをしてみる
  3. エビデンスを決める
  4. エビデンスを見つけられるかを決める

エビデンスの調査」はエンジニアリングや企業の人間は「実際にテストして試してみる」ような方法もあるかもしれません。

3章 トピックから問いへ

「トピックに対する問いに対する答えが課題を解決する必要がある」ということを主張しています。これは「〇〇って言語は動作が早いから素晴らしい」って主張している人がいて、「じゃあ早いと何の課題が解決できるの?」ってことがセットじゃないといけないので同感ですね。

初心者は「このトピックでレポートを書くとき、十分な情報が集められるか」を心配しがちだ。また、必要以上に情報を集めたがる。しかし、そこに役立つものは少ない。選んだトピックが的を絞り切れていないからだ。的が絞りきれていないと、集めたエビデンスが、読者にはランダムな情報の山にしか見えない。

この章の要約です。

  • 興味からトピックへ: 自分の興味の惹く分野を選ぶと、「やり遂げる意志」が持てて良い
  • 漠然としたトピックから的を絞ったトピックへ: 文に置き換えると読者が興味を持てそうな主張になる動的なトピックを選ぼう
    • いい例) 商業飛行の初期の頃におけるDC-3開発への軍部の貢献[トピック]→商業飛行の初期の頃に、軍部がDC-3の開発に貢献した[主張]
    • 悪い例) 商業飛行の歴史[トピック]→商業飛行には歴史がある[主張]
  • 絞り込んだトピックから問いへ: 「できるだけ多く情報を集める」戦略を取りがちだが、問題を問いかけて調べることが重要
  • 最も重要な問い「それがどうした?」: 「私は〇〇について調べている。なぜならば、〜を知りたいからだ」というフォーマットを考え、更に想定読者の「それがどうした?」と質問に答える。
    • 例) 私は「北米の大きな哺乳動物が消滅した原因」についてリサーチしている。なぜならば、「最古の民族の狩猟によってその哺乳動物が絶滅したか」を知りたいからだ。それは、「原住民が自然と調和して生きていたか、それとも自然破壊を助長しながら生きていたか」についての読者の理解を助けるためだ。
    • ただ、始める段階ではこれに答えられずに進めてしまっても間違いではない

「できるだけ多く情報を集める」戦略がダメになりがちなのはそのとおりだと思います。「それがどうした?」に対しては、エンジニアなら「〇〇が実装できる」ってフォーマットになりそうな気がします。

また、最初に「興味」から始まっているのも面白いですね。最初は膨大な選択肢があるので、自分の趣味で選んでしまうのが効率いいのかもしれません。

4章 問いから課題へ

要約するとこんな感じです。ソフトウェアエンジニアは実用的課題の割合が大きそうですが。

  • 自分だけじゃなくて読者が興味を持つ課題を提起しなければいけない。
  • 課題は「実用的課題(何をすべきか?)」と「概念的課題(何を考えるべきか?)」の2種類がある。
  • 実用的課題は「オゾン層が薄くなっている」「それがどうした?」「薄くなると私達がより多くの紫外線にさらされて不健康になる」と答えられるもの。応用研究に対応。
  • 概念的課題(「Q1: 過去50年間でロマンチックな映画がどう変わったか?」)は更に重要な問題(「Q2: 私たちの文化のなかでロマンチックな恋愛の表現方法はどのように変わったか?」「Q3: 結婚と家族に対する男女の期待がどのように形成されてきたか?」)に答えるための助けになるもの。基礎研究に対応。

これ以降の章

  • できるだけ1次ソースを当たれ
  • 2次3次ソースは一般向けに書かれているので情報が足りていないことが多い。ただ、情報収集の観点では有用なこともある。
  • 図書館等で偶然有益な本が見つかる可能性もある

みたいな、情報収集方法やソースの信頼性の確かめ方が書かれています。

最後に

『リサーチの技法』は、こちらのツイートで知りました。自分自身個人でのリサーチの方法以外にも、その後の議論の方法についても書かれています。私もそこは途中です。

【本】 『組織化の社会心理学』を読みました

『コミュニケーション学がわかるブックガイド』で気になった本で読んだものです。他にも『誰のためのデザイン?』とかも読みました。こちらはプログラマー関連でも有名ですね。

気になったアイデアとしてはこれくらい。ちゃんと読めばいろいろな示唆が得られそうな本ですが、今の自分が面白く感じたのはこれくらいかな…。

  • 攻撃的/協力的な戦略の人がいるが、攻撃的な人は周囲も攻撃的にしてしまう(自己成就性)のに対して、協力的な人は「周囲の人には攻撃的/協力的な人が混ざっている」と考えている
  • 進化論の喩えで「淘汰」にも多くのページが割かれている。組織の習慣を「捨てる」ほうにも注目したほうがいいのかもしれない
  • フィードバックが複雑(非線形)な世界では行動してフィードバックを得るのが良さそう

組織化の社会心理学

組織化の社会心理学