寮外の人でも楽しめる熊野寮祭の企画

熊野寮祭において、寮生でなくても楽しめる企画を列挙し、概要を説明します。

熊野寮祭とは

熊野寮祭とは、京都大学の学生自治寮である熊野寮が毎年開催している祭りです。例年11月末〜12月初頭まで開催されます。今年はちょっと長いですが、11月29日〜12月10日の間開催されます。

問題意識

熊野寮祭は、基本的には寮生内輪で楽しむお祭りです。というか、寮生でないと楽しめない企画や、寮外の方が参加することを想定していない企画が混ざっています。 そのため、寮外の方は企画に参加してよいのか悪いのかわからず、結局参加しないという状態になっている気がします。

この記事では、合計100を超える企画の中から「寮外の方も楽しめる企画」「寮外の方が参加することを想定している企画」を主観によりチョイスし、軽く解説します。

続きを読む

PNGを端末に表示するプログラムをRustで書いた

PNGを端末に表示するプログラムを作りました。

github.com

使い方

cargo run /Path/to/Windows_logo.png

とすると、👇のように端末に画像が表示されます。透過画像も表示できます。

ちなみに、PNGの画像形式は何パターンかあるのですが、そのすべてに対応してるわけではないので、表示できない画像もあります。あしからず。

続きを読む

PNGの規格を簡単に説明する

PNGの規格を勉強する機会があったので、その内容を簡単に説明します*1

PNGはいくつかの"チャンク"が集まって構成されています。例えば、IHDRチャンクやIDATチャンク、PLTEチャンクなどがあります。では、PNGファイルという単なるバイト列から、どのようにチャンクを抽出すれば良いのでしょうか?

これは、PNGファイルの構造を知ることでわかります。

*1:PNGの規格自体はRFC公開されている

続きを読む

機能追加と同時にリファクタリングをしてもいいか

「機能追加と同時にリファクタリングをしてもいい」という記事がはてブに上がっていたので、思うところを述べる。

scrapbox.io

結論

続きを読む

iter()とinto_iter()の違いを整理した

VectorIteratorに変換する時にいつも混乱していたので整理した。

混乱

あるVectorの要素すべてを3倍するコードを考える。

fn main() {
    let vec1 = vec![1,2,3,4,5];
    let vec2 = vec1.iter()
                   .map(|i| i * 3)
                   .collect::<Vec<i32>>();

    println!("{:?}", vec1);
    println!("{:?}", vec2);
}

このコードはコンパイルできるが、以下のような疑問がある。

  1. 5行目で vec1はなぜ使えるのか? 3行目の vec1.iter()で使われているじゃないか!
  2. map(|i| i * 3)iは参照なのか値なのか?

これらの疑問に関する答えは、

  1. iter()Vectorをmoveしない。into_iter()Vectorをmoveする。
  2. iter()Vectorから「参照のコレクションであるIterator」を作成し、into_iter()Vectorから「値のコレクションであるIterator」を作成する。

ということになる。

続きを読む