Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

Rustでdocker build時に依存ライブラリの再ビルドを避ける

Rust で書かれたアプリをビルドするための docker image は以下で公開されている。 hub.docker.com しかし、ここに出ているように COPY . . なんてやっていると、 src/main.rs を触るだけで毎回 cargo install 時に依存するライブラリをすべてダウンロードし…

&Tがそのまま&dyn Traitとして使えるわけではない

トレイトオブジェクトを返す次の関数 f はコンパイルできる。 trait X {} fn f(x: &dyn X) -> &dyn X { x } ところが、次のように書くとコンパイルできない。 fn f<T: X + ?Sized>(x: &T) -> &dyn X { x } Compiling playground v0.0.1 (/playground) error[E0277]: the siz</t:>…

Rustの&mutのmoveとreborrow

&mut は Copy trait を 実装していない 。よって、こちらは実行できない。 fn main() { let x: &mut i32 = &mut 0; { let y = x; println!("y: {}", y); } println!("x: {}", x); } Compiling playground v0.0.1 (/playground) error[E0382]: borrow of move…

Surface Book 3を手にするまでの2ヶ月の苦闘の記録

Surface Book 2 を買ってから 2年半が経過し、今回 Surface Book 3 を購入した。日本でも販売されることを知らずに US のマイクロソフトストアで購入したのだが、今回実機を手にするまでにめちゃめちゃ苦労したので、記録を残しておく。 US キーボードが欲し…

FutureとUnpin

Future で Unpin が必要なときは pin してねって書いてある。 Pinning - Asynchronous Programming in Rust To use a Future or Stream that isn't Unpin with a function that requires Unpin types, you'll first have to pin the value Box も Unpin なの…

AVL木

確か、いい感じに深くなりすぎない木だよね。回転?なにそれ?みたいな状態から実装し始めたら、面倒で死ぬかと思った。 AVL Tree by Java -- これで分かったAVL木 とか AVL木の回転(要素の挿入や削除のしかた) - Qiita とかを参考に実装した。2週間くらい…

rustでdiscordのbotを作ってみたくて下調べ(4)

rustでdiscordのbotを作ってみたくて下調べ(3) - 北海道苫小牧市出身の初老PGが書くブログ で serenity を紹介したが、最近 async版 の開発が進んでいる。試してみたが、まともに動くようだ。ベンチマークなど取っていないので、 async にする価値があるのか…

doesn't have a size known at compile-time

まだ時間がなくて詳しくは調べてないけど、こういう書き方はできない。まあそうかなと思う。 use std::fmt::Display; struct S<T> (T); fn main() { let s: Box<S<dyn Display>> = Box::new(S("")); } Compiling playground v0.0.1 (/playground) error[E0277]: the size for v</s<dyn></t>…

impl Trait 型の値を再代入しようとしてハマった

impl トレイト名 は Rust で存在型を扱うのに使える 。しかし、以下はコンパイルが通らない。 use std::fmt::Display; fn f<T>(t: T) -> impl Display where T: Display, { t } fn main() { let mut s = f(""); s = f(s); } Compiling playground v0.0.1 (/play</t>…

標準入力の一行の上限は4,096バイト

標準入力の一行に大量の文字を食わせると、4,096バイトしか有効にならない。 $ perl -e 'print "x" x 5000, "\n" for 1 .. 2' | clip.exe $ perl -e 'print length <>, "\n" for 1 .. 3' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx…

rustでdiscordのbotを作ってみたくて下調べ(3)

前回からだいぶ時間が空いたが、下調べの続き。 discord-rs というのを最初に見つけて古いと嘆いていたのだが、現在使われているクレートは serenity の方だったようだ。これを検索で見つけるのは至難の業。 discord で検索すると、他の関係ないクレートがガ…

rustでdiscordのbotを作ってみたくて下調べ(2)

discord の bot を作るのなら websocket が必須なので下調べ。 というか、調べなくても discord-rs が使っていた websocket がそのまま使えるはずと思っていたのだが、開発が sluggish なので tokio-tungstenite を勧めている。良い名前空間を使っているだけ…

rustでdiscordのbotを作ってみたくて下調べ

結論から書くとまだ何もしてない。 discord-rs というのがあるのだけど、だいぶ古い。特に嫌なのが issue にも上がっている通り openssl 1.0 系への依存。 昨年末にEOLを迎えている ので避けておきたい。 という事で手元でバージョンを上げようと試みたのだ…

2019年のまとめ

今年を箇条書きでまとめておく。歳のせいか意識の高い話は何もなく、ああ、良くないなあとは思うのだが、まあそれとは別の話として、将来の自分用にメモを残して置くことはいいことだろう。 高脂血症の薬を飲み始め、肉食を再開する 禁酒、COMPは継続 副業を…

plain-old jarで JUnit5 を試す

https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher に書いてあるんだけど、分かりにく過ぎたので。 $ curl -O https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/1.5.2/junit-platfor…

今日は 吉祥寺.pm20 の日です

弊社での開催でしたので、自分用のメモを残しておきます。 本当は難しいPSL / hiratara 自分のセッションでした。 speakerdeck.com Windowsデスクトップでweb開発 / setoazusaさん Windowsで開発している人は少ない TypeScriptやJavaScriptならなんとかなる…

今日は安全なシステムプログラミング言語Rustへの招待の日です

IIJさんでのセミナー を聴講に来ましたので、自分用のメモを残しておきます。 安全なシステムプログラミング言語Rustへの招待 / keenさん 2015 年に 1.0.0 がリリース ここからは安定している 6週間ごとのリリース Firefox と同じ 言語仕様は2つ Rust2015 と…

今日は Haskell Day 2019 の日です

咳が止まらない状態で非常に厳しいですが、来ていますので、自分用のメモを残しておきます。 関数型(function type)を見つめるプログラミング / 山下さん 関数の型、 Haskell では第一級 リスト型 a が型なら [a] も型 タプル a b が型なら (a, b) も型 タプ…

今日は YAPC::Nagoya::Tiny 2019 の日です

来ましたので、自分用のメモを残しておきます。 開会の挨拶 名古屋から来た人、東海から来た人 ランチはルーセントタワーB1が穴場 Tiny とは? 新たなコミュニティの形成。 小規模で開催しやすい メインはトーク ハッシュタグ: #yapcjapan フロア貸切ではな…

A Regular Expression Matcher in Rust

なんかの本でCで数十行のバックトラックを使った正規表現のマッチャが紹介されてた記憶があるんだけど、ビューティフルコードだったっけ?#regexfesta— hiratara (@hiratara) October 18, 2019 ということで、ソースコードが書かれている記事を見つけた。 ht…

今日は Regex Festa の日です

今日は Regex Festa の日です Regex Festa に来ていますので、自分のためのメモを残しておきます。 挨拶 wi-fiとお手洗い、喫煙所の案内 Opt Technologies さんについて QRコード読むとアンケートあります いろいろな正規表現、いろいろなオートマトン / @si…

結局rustの標準入出力はどう書けばいいの?

現状。 StdoutLock は LineWriter を噛んでるので、 BufWriter の意味があるのか謎。ベンチマーク取らねば。 use std::io::{self, BufRead, BufWriter, Write}; fn main() { let stdio = io::stdin(); let mut input = stdio.lock(); let stdout = io::stdou…

emacsで自動改行して欲しくない

特に端末へコピペとかするときに、本当に迷惑なので。 init.el をイジる。まず、 (setq indent-line-function 'insert-tab) なんて記述があったので削除(誰がなんのために入れたんだ?)。 次に、 (electric-indent-mode 0) を追加。 これでほとんどのモー…

今日はRustのLT会 Shinjuku.rs #6 @FORCIAの日です

ブログ枠で RustのLT会 Shinjuku.rs #6 @FORCIA に来ています。ブログ枠が何をすればいいのかあまりわかってませんが、とりあえずブログにメモを残しておきます。 開会 会場、懇親会はフォルシア株式会社さんが提供(ありがとうございます!) 次回 11/19 で一…

rustのcombineで入力されたトークンによる場合分け

combine を使ったときに、例えば識別子のパース時に予約語を弾く方法。 最初は and_then を使うのかと思ったのだけど、 エラーの型指定がえらく面倒 だったので諦め。というか、なんか絶対違うだろうと思って別の方法を模索。 Parser のドキュメントに以下の…

rust の publicsuffix は遅過ぎる

rust で Public Suffix List を扱うクレートの速度が遅過ぎるので、パッチを書いた。最右部のラベル ( .jp .com など) でルールを区分けして、後は愚直に線形探索という方法だったので、そりゃあ遅すぎるよねって感じ。 github.com 実は Perl の Domain::Pub…

今日は Roppongi.rs #1 の日です

職場から近いので Roppoingi.rs に来ました。自分のためにメモを残しておきます。ハッシュタグは #roppongirs 。 Rustがいかにエンジニアの脳を楽にさせているかをC++初心者が語る〜関数篇〜 / @natsu_no_yuki さん C++歴15年の初心者 rvalue reference, tem…

Strassen の行列積を求めるアルゴリズム

アルゴリズムイントロダクションで、行列積を求める奇妙なアルゴリズムを見つけたので rust で実装した。簡単のため、行列の表現には ndarray を用いている。 #[macro_use] extern crate ndarray; use ndarray::prelude::*; type Matrix = Array2<i32>; type Matr</i32>…

rustのsliceとlen()

こう書くと、 fn main() { let mut a = [1, 2, 3, 4, 5]; let x = &mut a[3..a.len()]; println!("{:?}", x); } こう怒られる。 error[E0502]: cannot borrow `a` as immutable because it is also borrowed as mutable --> src/main.rs:3:23 | 3 | let x = …

rustで「サイコロを転がす」を解く

最近 rust を勉強し始めたので、オフラインリアルタイムどう書くで一番簡単な問題(と思っている) サイコロを転がす を解いた。破壊的更新を戦略的に使えるのは、この程度の難易度のサンプルであれば書いてて大変気持ちがいい。 yhpg-rs/lib.rs at ord12rot…