にっき

技術的な話題はないです

最近作った・メンテしたRustプロダクト

供養および近況報告

rustplotlib

github.com

Matplotlib の Rust バインディングが欲しいなぁと思っていたので勢いで作ったもの. Rust という言語の特徴を考えると必要となるケースはあまりない気がするが,作ってしまった以上便利なものであるとだけ言っておく.

使い方は,まず下のように Builder でグラフを構築した後,

extern crate rustplotlib;
use rustplotlib::{Figure, Axes2D, Scatter, Line2D, FillBetween};

let x: Vec<f64> = (0..40).into_iter().map(|i| (i as f64) * 0.08 * PI).collect();
let y1: Vec<f64> = x.iter().map(|x| x.sin()).collect();
let y2: Vec<f64> = x.iter().map(|x| x.cos()).collect();

let ax1 = Axes2D::new()
  .add(Scatter::new(r"$y_1 = \sin(x)$")
    .data(&x, &y1)
    .marker("o"))
  .add(Line2D::new(r"$y_2 = \cos(x)$")
    .data(&x, &y2)
    .color("red")
    .marker("x")
    .linestyle("--")
    .linewidth(1.0))
  .xlabel("Time [sec]")
  .ylabel("Distance [mm]")
  .legend("lower right")
  .xlim(0.0, 8.0)
  .ylim(-2.0, 2.0);

let ax2 = Axes2D::new()
  .add(FillBetween::new()
    .data(&x, &y1, &y2)
    .interpolate(true))
  .xlim(0.0, 8.0)
  .ylim(-1.5, 1.5);

let fig = Figure::new()
  .subplots(2, 1, vec![Some(ax1), Some(ax2)])

Figure::apply(&mut backend) を呼び出すことで実際の描画に反映させる.

use rustplotlib::Backend;
use rustplotlib::backend::Matplotlib;

let mut mpl = Matplotlib::new().unwrap();
mpl.set_style("ggplot").unwrap();

fig.apply(&mut mpl).unwrap();

mpl.savefig("simple.png").unwrap();
mpl.dump_pickle("simple.fig.pickle").unwrap();
mpl.wait().unwrap();

調子乗った名前をしている割には大した機能を実装できていないので,余裕が出来たら適宜機能を拡張していく予定…

rwm

github.com

なんかウィンドウマネージャ作ってみたくなったので作ったもの. といってもウィンドウマネージャを実装するための知識が皆無だったので,以下のサイトで紹介されている Standard ML の実装をベースに Rust に移植した.

MLでウィンドウマネージャ作成

現状はリサイズ時の処理に不具合があり,クリック場所が悪いと panic してウィンドウマネージャが終了する.

rhq

github.com

以前作成した ghqrs という ghq クローンを再度書き直したもの. ghqrs は元々 Bash on Windowsgo build が動かなくてムキーッとなって作ったという経緯があり, メンテナンスするのが面倒になった 実装の所々に気に入らない箇所が目立ったので作り直した.

おわりに

  • 生きるの辛い
  • Windows10 Creators Update で Rust が BashOnWindows でも動くようになるらしいですね(今も動いてない…?)
  • ご意見,プルリクエストなどお待ちしています