Rust本を読んだので,学んだこと諸々を書いておく

若干理解が足りない部分もあるが,個人的に面白かった項目を書いておく.

参照周り

Rustは値ごとに所有権を有しており,その扱い方がいろいろある.

移動

所有権を移動した値を再度使おうとするとエラーが出る. メモリ上の動きとしては,sのヘッダ情報には {ヒープ領域へのアドレス,capacity, length} が入っており,このヘッダ情報(3ワードのみ)をtに移動する.

下は移動された後の変数を使おうとするとエラーを吐く例.

fn main() {
    let s = vec![1, 2, 3];
    let t = s;
    println!("{:?}", t);
    println!("{:?}", s);
}

// error
3 |     let t = s;
  |         - value moved here
4 |     println!("{:?}", t);
5 |     println!("{:?}", s);
  |                      ^ value used here after move

関数の引数として移動する場合もエラーを吐く.

fn print_vec(v: Vec<i64>) {
    for val in v {
        println!("{}", val);
    }
}

fn main() {
    let v = vec![1, 2, 3];
    print_vec(v);
    println!("{:?}", v);
}

// error
9  |     print_vec(v);
   |               - value moved here
10 |     println!("{:?}", v);
   |                      ^ value used here after move

借用

参照を渡すことで,所有権を借用できる. 所有権は一時的に貸し出され,その後帰ってくる. なので以下のコードはエラーを吐かない.

fn print_vec(v: &Vec<i64>) {
    for val in v {
        println!("{}", val);
    }
}

fn main() {
    let v = vec![1, 2, 3];
    print_vec(&v);
    println!("{:?}", v);
}

// output
1
2
3
[1, 2, 3]

Copy型

Copy型は移動した場合,Stack領域に値のコピーが作成される.

下のコードは,Copy型であるi32を移動させた時の例. 基本的にヒープ領域にある値を参照している型は,Copy型ではないので,移動した時にコピーは作成されない.

fn main() {
    let s: i32 = 1;
    let t: i32 = s;
    println!("t: {}", t);
    println!("s: {}", s);
}

// output
t: 1
s: 1

Box

T型の変数を受け取りそれをヒープ領域に写してその参照を得る. Boxの変数の参照が切れると,内部の参照がもつ領域は解放される.

以下のexampleがわかりやすい.

Box, stack and heap - Rust By Example - Rust Documentation

エラー周り

Result型

Eitherみたいなアレみたいな感じ. 値を取り出すときはパターンマッチで,OkかErrを判定して値を取り出す. ?演算子は,その関数でエラーが起こったらErrを返し,正常に関数が実行できたら次の行へと処理を移せる最高のやつ. 難しいことを考えず,手続き型のように書けるのがいいですね.

use std::io::prelude::*;
use std::fs::File;
use std::io::Result;

fn read_file(filename: String) -> Result<String> {
    let mut file = File::open(filename)?; // => Err?
    let mut contents = String::new();
    file.read_to_string(&mut contents)?; // => Err?
    return Ok(contents);
}

fn main() {
    let contents = read_file("foo.txt".to_string());
    match contents {
        Ok(v) => println!("{}", v),
        Err(e) => panic!(e),
    }
}

// foo.txt
1
2
3

// output
1
2
3

Option

SomeとNoneでパターンマッチして,分岐したりできるいろんな言語でよくあるやつ.

fn div(a: i64, b: i64) -> Option<i64> {
    if b == 0 {
        return None;
    }
    return Some(a / b);
}

fn main() {
    let val = div(10, 5); // => 10 / 5
    match val {
        Some(v) => println!("{}", v),
        None => println!("None value"),
    }
    let none_val = div(10, 0); // => 10 / 0
    match none_val {
        Some(v) => println!("{}", v),
        None => println!("None value"),
    }
}

// output
2
None value

パターンマッチ

Rustには,パターンマッチがあるのでいろいろ分岐が可能. listパターンみたいなものはないっぽい?

下のexampleがわかりやすくて良いです.

All the Pattern Syntax - The Rust Programming Language

トレイト

みんな大好き型クラス的なアレみたいな感じ. impl <trait> for <struct name>とかで実装する.

use std::ops::Add;

struct User {
    name: String,
}

impl Add for User { // impl Add trait
    type Output = Self;
    fn add(self, other: Self) -> Self {
        return User{name: self.name + "_" + &other.name};
    }
}

fn main() {
    let mituba = User{name: "mituba".to_string()};
    let mother = User{name: "mother".to_string()};
    let mituba_mother = mituba.add(mother); // mituba + _ + mother
    println!("{}", mituba_mother.name);

    let mituba = User{name: "mituba".to_string()};
    let father = User{name: "father".to_string()};
    let mituba_father = mituba + father; // こうも書ける
    println!("{}", mituba_father.name);
}

// output
mituba_mother
mituba_father

PartialEqを実装して,assert_eqとかできるようにする.

use std::cmp::PartialEq;

#[derive(Debug)]
struct User {
    name: String,
}

impl PartialEq for User {
    fn eq(&self, other: &User) -> bool {
        self.name == other.name
    }
}

fn main() {
    let mituba = User{name: "mituba".to_string()};
    let mother = User{name: "mother".to_string()};
    assert_ne!(mituba, mother);

    let mituba = User{name: "mituba".to_string()};
    let mituba2 = User{name: "mituba".to_string()};
    assert_eq!(mituba, mituba2);
}

下のドキュメントにポリモーフィズムぽいやつも記載されている.

Advanced Traits - The Rust Programming Language

クロージャ

関数っぽく書けたり,map関数などに渡せる高階関数的なアレな感じ.

fn main() {
    let cl = |x: i64| -> i64 x + 1;
    println!("{}", cl(1));

    let cl2 = |x: i64| -> i64 {
        let x1 = x + 1;
        return x1 + 2;
    };
    println!("{}", cl2(1));
}

// output
2
4

mapにクロージャを食わせる

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    v.iter().map(|x| x + 1).for_each(|x| println!("{}", x));
}

// output
2
3
4
5
6

移動(クロージャ)

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let cl = |vc: &Vec<i64>| vc.iter().for_each(|x| println!("{}", x));
    cl(&v);
    println!("{:?}", v);
}

// output
1
2
3
4
5
[1, 2, 3, 4, 5]

fn main() {
    let v = vec![1, 2, 3, 4, 5];
    let cl = |vc: Vec<i64>| vc.iter().for_each(|x| println!("{}", x));
    cl(v);
    println!("{:?}", v);
}

// output
9  |     cl(v);
   |        - value moved here
10 |     println!("{:?}", v);
   |                      ^ value used here after move

下のドキュメントに他の事柄はいろいろ載ってます.

Closures: Anonymous Functions that Can Capture Their Environment - The Rust Programming Language

まとめ

Rustは,今までのプログラミング言語には若干ない概念があったりして,少しとっかかりづらい面もある感じですが,やってみると意外と面白かったりするので是非. お堅い言語かと思いきや意外と柔軟だったり.

本を読んだ後に参考にしたドキュメントです.ドキュメントが本当にしっかりしているのに感動したりして最高.

Foreword - The Rust Programming Language

arch linuxのwindow managerとしてi3を導入した

arch linuxにwindow managerのi3を導入したので、やったことを書いておきます。 デスクトップ環境はfcitxを使用しています。

i3の導入

sudo pacman -S i3

# 背景画像とかを設定する場合
sudo pacman -S feh compton

.config/i3/configを記述する

設定ファイルは以下に置いています。

github.com

ほぼ下のconfigファイルを参考にしました。 少し加えたところとして、fcitxを用いるのでexec --no-startup-id fcitx を追加しました。 あとは不透明度とかを変更しています。

設定ファイルに書かれている $mod とは、MacだとCmdキーになります。(おそらくPCで変わると思います)

github.com

i3を用いて起動する

rebootしてログインするところまできたら、右上の電源ボタンなどが並んでいるメニューバーがあります。 そこのおそらく一番左端にあるボタンを押しi3を選択し起動でOKです。

$mod + Returnでターミナルが立ち上がると思います。(僕はalacrittyが起動するようにしています)

スクショ

こんな感じになる

まとめ

window間をゆるく移動できるようになり、移動しているだけで楽しい感じになりました。 みなさんもぜひこの楽しさを味わってください。

Arch LinuxをMac Book Proにインストールした

こんにちは.

やっとの事でArch Linuxのインストールに成功したので,やったことを書いておきます.

Bootable USB

以下のWikiのコマンドでいけます.4GのUSBでも十分でした.

USB インストールメディア - ArchWiki

Install

手順は,下記のブログを参考にしてコマンドを打っていったらできます.ありがとうございます.

Arch LinuxをUEFI + GPT環境にインストールする

ここで最後にarch-chrootから抜けてrebootをするのですが,僕は無線LANでネットに繋いでおりwifi-menuというコマンドを使っていました. このコマンドはインストールメディア内だったら動くのですが,実際にインストールしたディスク上では動きません. その理由として,wifi-menuの起動に必要なwpa_supplicantdialogが存在しないからです.

arch-chrootを抜ける前に,以下のコマンドでInstallすることを忘れないようにしましょう.(wifi-menuを利用する場合)

 pacman -S wpa_supplicant dialog 

ちなみにwifi-menu -oとするとnetctl用の設定を吐いてくれるので,後はnetctl enable <config file>とかで設定してネットワーク設定も可能です.

Configuration

以下の二つの記事を見つつ設定すると,動きました

ここは特に問題なくいけました.

Keyring

gitを使う上で毎回パスワードを求められる現象が起こるので,以下の記事を参考に設定します.

hajime-mat.hateblo.jp

その他

以下の記事も参考にしました.

qiita.com

qiita.com

まとめ

今の所は,起動がすげぇ早かったりMacで動かなかったHaskellのコードが動いたりありがたい感じの毎日を過ごしています.

すぐ消して再度インストールできるようにインストールスクリプトを作成しようと思います.

#builderscon 参加記 3日目

builderscon 三日目

聞いた話のメモと感想を書いていきます.

全てのエンジニアに知ってもらいたいOSの中身について

speakerdeck.com

ariakiさん MEDIA DO

最近のOS事情

  • OSの選択やOSのカスタマイズをする必要があまりなくなって来た
  • Dockerなどが登場して関心ごとがアプリケーション側へ
  • setenforce 0
  • OS認知の低下
  • PaaS, FaaSの流行り
  • Web,機械学習の流行
  • アセンブラC言語の認知度の低下
  • OSの中身を知ると少し幸せになるかも

CPU

  • x86はIntel8086が元,x86,16bit ia32,32bit
  • 40年前のCPUと互換動作する
  • メモリが1MBだったら640KBしかアクセスできず,セグメントで区切られている
  • プロテクトモードにバグがあり,使えないはずの64KBが使えるようになった
  • バグだったがこのバグを閉じず,今も使用できる

レジスタ

  • 変数を記憶できるやつ
  • めちゃくちゃ早い
  • メモリよりレジスタの方がCPUの中にあるので高速
  • 汎用レジスタは4つしかない

モード

  • リアルモード -> プロテクトモード -> ロングモード
  • リアルモード,いろんな場所に書き込み可能,フリーダム
  • プロテクトモードでいろいろと制限されるようになった

プロテクトモード

特権管理

一般保護例外

メモリ管理

  • 一番小さい範囲 -> ページ
  • ページのリストみたいな -> PTE
  • PTEのリストみたいな -> PDE
  • ページング
  • リニアアドレス(上記の領域)をまとめた区間 -> セグメント

タスク管理

ブートシーケンス

  • BIOS -> Bootstrap Loader -> Kernel Loader -> Kernel
  • 0x7c00に書き込む -> 先頭は予約されており末尾から読み込むことを考えた

システムコール

  • Application -> User Land -> System call -> Kernel
  • User Landにはシェルなどが入っている
  • straceでシステムコールを確認
  • puts -> writeが呼ばれる

system call table

感想

結構知らなかった知識がふんだんに盛り込まれていたので,楽しく聴くことができました. やっぱり昔を振り返ることも重要なんだなと思いました.

高集積コンテナホスティングにおけるボトルネックとその解法

speakerdeck.com

pyama86さん ボトルネックの探し方

sntsを作成

HACONIWA -> mruby製コンテナエンジン

コンテナの話

  • コンテナ=プロセス

namespace

  • ip a -> bash -> unshare --net -> ip a
  • unshareでホストとゲスト間の分離を行える

chroot

cgroup

  • リソース割り当て

capability

  • プロセスが持つ特権を調べる
  • LXCで学ぶコンテナ入門が参考になるらしい

FastContainerアーキテクチャ

  • FastCGIから
  • プロセスをフォークし一定時間動いたら止める
  • コンテナを起動して,一定時間動いたら止める
  • データはストレージに置く

コンテナの起動をいかに早くするか

  • 監視コンテナが落ちる
  • ネットワークネームスペースの追加に一分ぐらいかかってる
  • ipコマンドでネットワークネームスペースを区切る
  • 名前が被ってるかも? -> そんなことはなかったらしい
  • straceコマンドでしらべる
  • unshareコマンドが遅いらしい
  • perf recode call graph -> 重くなっている処理を確認できる
  • slab -> deactivate_slabが重いらしい
  • dentryキャッシュ(ファイルのパスのキャッシュ)が多かった
  • キャッシュをクリアするようにして解決

  • Linuxブリッジの上限がある

  • ブリッジを分散して解決

  • cadvisor -> コンテナの情報を取れる

  • gdb -> コマンドの履歴を取得できる

  • ボトルネックが遷移した

  • 2500コンテナにするとまた遅くなる
  • ipコマンドにいらない処理があったので削除して高速化
  • valgrind -> HEAPのサマリーをとる
  • 4000コンテナ弱の起動ができた

感想

流れるようなプレゼンでそれでも多くの知識を漏らさず丁寧に発表されており,すげぇといった感じでした. 知らない便利コマンドがいろいろ知れてよかったです.

遠いようで身近なサウンドエンジニアリング

speakerdeck.com

@karupaneruraさん DeNA

趣味:サウンドエンジニア

レコーディング

一発どり

  • ノリでいけるが編集しづらい

バラどり

  • 楽器が多くなると編集が大変になってしまう
  • 市販のイヤホンで聞いて,聞きやすい音質に調整する
  • リマスター版とかは,音質をより良いものに調整して再配布する感じ
  • マイクは音の振動を電圧の変化に変換する
  • コンピュータの限界の音量を越えると音割れする

実際のギターによる実演

  • ギターの録音する位置によって音が違う (すごい)

感想

いきなりギターが出てきたときは,すげぇってなりました. でもサウンドにもいろいろ気を配ったりする箇所があるのだと知れて,とても嬉しかったです.

業務時間で書いたパッチは誰のもの? OSS 活動にまつわる罠

uchan_nosさん サイボウズ SRE

OSSに問題があったら自分で直す

OSSに不具合があったら,パッチを書く.そして貢献する.

もともと趣味で作っていたものが業務で使われている

業務時間を趣味のプロダクトに使っているのはいいのか?

ポリシー

Read the Docsで公開

policy

感想

まだ学生なので仕事上でのOSSの貢献の大変さについて知れてよかったです.

Building Self-Hosted Kubernetes

nasa9084さん

自動化された自律システム

いい感じにしてくれる

システムが落ちた時に自動で直してくれる

k8s

  • マイクロサービスと相性がいい
  • k8sもマイクロサービスである
  • k8sk8sで管理したい
  • k8s on k8s,上の層はk8sで管理されているが,下の層は人間が管理しないといけない

self hostedでのk8s

  • k8sを自分で自動で管理
  • k8s自体のログ:kubectl logs
  • k8s自体のstatus:kubectl describe

感想

k8sという言葉を無限に聴くことができて幸せでした. k8s on k8s は夢が広がります.

自作キーボード

speakerdeck.com

残念ながら立ち見でTwitterしかしていなかったのですが,自作キーボードあるあるが非常に詰め込まれてて共感できました. 私もつい先日自作キーボードのために半田付けやらをやっていて,今もまだ少し動いていない状態で放置しています. なので帰ったらまた再チャレンジしたいと思います.

LT

クッソ面白かった

まとめ

学生でぺーぺーの自分が初めてカンファレンスに参加して,それでも大いに楽しめたのでbuildersconに感謝してもしきれません. また来年も機会があれば行きたみが深いです.

#builderscon 参加記 2日目

builderscon 二日目

二日目から本格的にカンファレンスがスタートし,いろんなトラックで発表者がたくさんの面白いことを発表していきます. とりあえず僕が聞いた話の書いたメモと感想を少しずつ載せていきます.

Electronによるアプリケーション開発事情2018

speakerdeck.com

h3potetoさん

普段はTeraformをいじっている

Mastodonクライアントを作っている

Electron

  • Chromium + Node.js
  • Webフロントの技術が利用できる
  • vue-cliにelectronのテンプレートがあるらしい
  • main, rendererプロセスが存在していて,mainがバックグラウンドでごにょごにょ値が変更されたらviewに反映
  • React, Vueの差分レンダリングはよさみが深く,開発者はデータをどう反映させるかだけを重視すればよい
  • Chromiumは更新されており,それに伴ってElectronもアップデートされて行くよさがある.

リリースの話

electron-builder

  • アプリケーションのパッケージングを行うやつ
  • electron-packagerより機能が増えている

アイコン

  • linuxだけmain.js内に書かないといけない
  • それ以外はpackage.jsonに書いたら動いてくれる

効果音

  • 圧縮されてしまうと読み込めないので,圧縮せずにpackageに含めるように設定する

証明書

  • electron-packagerだと勝手にやってくれる
  • MAS(Mac App Store)だけcodesignコマンドなどを利用する必要がある

Mastodonクライアントの話

  • Slackっぽいクライアント
  • 海外の反応「良い!だけどElectronか」
  • Electronは,メモリをたくさん食ってしまう

メモリと戦う

  • Streamingを切るとメモリが増えない
  • Streamingを増やしてもあまり変わらない
  • 流速が早いと結構変わる
  • 取得したトゥートを片っ端からレンダリングしていた
  • iOSだと画面に表示されている部分のみをレンダリングされている(UITableViewController)
  • 表示部分を含めたセルの高さを算出するやつがいて,そいつが良い感じにレンダリングを調整するらしい

  • 解決策:最新40件のみを保持していて,そしてそれ以降のトゥートを読み込まれた時にレンダリングする

vue.js

api周り

  • mastodon-api,POSTパラメータをbodyではなくurlパラメータに埋めて送信するらしい
  • Bodyに埋め込みたいので,ないので作った

障害周り

  • インスタンスを立てないとわからない問題もある
  • Gemによる障害を解決するために,revertしたプルリクを送ったらしい
  • 今は最新のGemが入っているらしい

感想

リリースなどしたことがなく,そこからのパフォーマンス面の改善の話などそこまで話題に上がらないが重要なトピックが聞けて非常に満足です. vue.js + Electron,良さそうだなと思いました.

Algorithms in React

speakerdeck.com

koba04さん サイボウズ

仮装DOMの話より内部の話

Reactの内部

  • いろいろパッケージに別れている
  • Component -> Reconciler -> Renderer -> Hostという流れ
  • ReconcilerはCとかでも実装するつもりなので基本的に依存が少ない

Stack Reconciler

  • traverseして差分があれば,即反映
  • 同期的に更新するように実装されている

ReactElement

  • DOMと対応している
  • 毎回生成し直して描画

二つのInstance

  • Public Instance
    • 状態を持つ
  • Internal Instance
    • ReactのAPIをいろいろつかうやつ
    • Public Instanceに触らせたくないやつを持っている

ReactInstanceMap

  • Public InstanceとInternal Instanceを紐付け

Stackの実装の問題点

  • 同期的に処理をしないといけない
  • traverseするのに時間がかかってしまったりする

Fiber Reconciler

  • render, commitフェーズの二つのフェーズ
  • renderは途中で止めれたりできる

Fiber

  • ReactElementと1:1で作られる
  • ReactElementをLinkedListで持つ
  • ダブルフバッファリングのような構造を持っている
  • 軽量のスレッド

Linked List

  • InsertとDeleteが早いので利用,要素は順にトラバースしていくので特に問題はない
  • parent, childの関係があり,二つ目からのchildは一つ目のchildからsiblingという関係を持ちparentに関係を持つ.
  • parent -> child -> sibling -> parentという流れで探索

Double Buffer

  • CurrentとWork in progressの二つを持っており,commitするとバッファを切り替える

render, commitフェーズ

  • renderはasyncで動いて,全ての処理が終わったらcommitしてcurrentに反映
  • ComponentWillMountは非推奨らしい

複数のアップデート

  • update queue
  • こうより:this.setState({count: this.state.count+1})
  • こう書いた方がいい:this.setState({state => ({count: state.count + 1})})

expiration time

  • いつ更新されるかを定める,優先度のようなもの
  • Eventごとに優先度が異なっている.
  • ユーザの入力を受け取るものは優先度が高い

Demo

  • 入力した文字をカウントの数だけ文字をレンダリングする
  • 何もいじってないとテキストの入力時に,レンダリングの負荷がかかりブラウザが入力を受け付けなくなる
  • テキストフォームの優先度をあげることにより,入力を先に行い遅れて文字が表示されるようにできる

bit演算

  • reactはbit演算が多用されている
  • bit演算により,状態を抽出する
  • 今がどのモードかどうかをbit演算で判定
  • Context APIでもbit演算で分岐が可能

suspence

  • Demoがあり,lodingという文字を何秒後とかに出したりできる

感想

普段Reactを触ってますが,裏ではそう動いているのかと知らない世界が見れて嬉しかったです. これからのReactを頑張って追っかけていこうと思います.

事前知識なしで理解する、静的検査のいろは

speakerdeck.com

DeNA Kuniwakさん

CSの知識なしでの静的解析

静的検査

  • 実行しないまま検査をする
  • なぜ静的に検査したいのか
  • 動的検査だと実行時に通ってないコードを検査できない
  • 静的検査だと網羅的に検査できるが,正確さは低い(実行していないから)

抽象構文木

  • コードを木構造で表している
  • メジャーな言語の抽象構文木は気軽に見れる

構文解析

  • 再起下降法の単純な実装を紹介
  • 文法規則をいろいろ掘って行き,構文規則に当てはまる文字列を探す

解析プログラム

  • 引数は文と始める位置
  • 戻り値は,Nodeと終わりのインデックス

感想

静的解析を行う方法をすごく手軽に説明しており,非常にわかりやすかったです. Go言語でつくるインタプリタでも少し出てた内容だったりもでていて,再確認にもなりました.

ボクが考える i18n の未来

speakerdeck.com

kazuponさん Vue.js core team

Abount i18n

  • i18n -> 国の文化に依存しない
  • l10n -> 国の文化に適応させる
  • Numeronym 単語の文字数を名称にする -> i18nなどはそういう書き方
  • i18nしていないと色々いちいち変更しないといけない
  • デフォルトでi18nが入っているものも多い

content of i18n

i18nの問題

  • 一つの国に複数の言語
  • 税金だったりGDPR
  • 文章の対応
    • LTR -> 左から右の文字列
    • RTL -> 右から左への文字列

未来のi18n

  • Saas
  • i18n framework
    • Progressive Frameworkという考えの導入
    • 複数のレイヤーに道具を分け,組み合わせて利用する

感想

i18n考えることがすごく多そうで,その大変さを知れたのがすごく大きかったと思います. 勉強します.

Javacardの世界

speakerdeck.com

moznionさん java card applet

java card

smart card

  • intelligent smart card
  • memory card

APDU

UICC

  • カードの方

JCRE

  • Java Card上で動くランタイム
  • GCがあるかどうかはカードによって変わる

Java card memory

  • インスタンス変数はメモリに未来永劫残り続ける
  • インスタンス変数にデータを書き込みまくるとカードが壊れる
  • RAMは非常に小さいので,狭いスコープの一時的な変数のみを格納する

Java Cardの開発

書き込みのお話

  • 認証機関から出ている鍵がないと書き込むことができない
  • つまり個人では書き込みは不可能

感想

発表がすごくJava Cardの話で爆笑していました. でも本当に知らない世界を知れてよかったなと思ってます.

lld − 開発ツールの主要コンポーネントの1つをスクラッチから作成した話

Rui Ueyamaさん lldリンカ

lld

  • LLVMのサブプロジェクト
  • FreeBSDは時期バージョンではlldを利用していたり
  • 現在chrome, firefoxで使われてたり
  • コンパイラが中間ファイルのリロケーションを使ってリンクするのがリンカの仕事

開発のきっかけ

  • webフロントを触って来たけど飽きて来てしまった
  • 趣味でコンパイラを作成していた
  • 仕事でコンパイラとリンカ,どっちが作りたい?と聞かれてリンカを作成したらしい

  • アセンブラ書いてバイナリ吐いて,それを読んでそのバイナリを吐けるプログラムを作成して行く

  • Hello world作成まで数ヶ月

作成したリンカ

  • 遅い
  • 作り直したら,10倍くらい早くなった
  • 自然と早くなるものを書くことが大事
  • データ構造を工夫して一回のアクセスでたどり着けるようにする
  • 異なるOSでのリンクのためにしたことは,別々のファイルとして書き特に抽象化なども行わないようにした

感想

自分が良いと思ったパターンによる実装を行うというすごいことを学びました. 普段はすごく抽象化してコードの少しの差異を埋めようとするのですが,最初からそれらを別のコードに落とし込むことを聞いて非常に目から鱗でした.

懇親会

クッキーが割られていたり,飯がうまかったりで最高でした. ある程度いろんな人と話せた感覚があるので,良い懇親会だったと思います.

builderscon参加記 1日目

builderscon1日目は前夜祭ということで,みんなで酒を飲みながらトークを聞こうという流れでした. 残念ながら僕は,自分に甘えまくってしまい30分ほど遅刻しました. なので二つ目のセッションの途中から参戦しました.

タイムテーブル

タイムテーブルは以下にあります.

タイムテーブル

ウェアラブル謎ガジェット

遅刻したので見れてないのですが,何やら電子名刺なるものがあるらしい.(すごい) 文字もちゃんと読める形で表示してくれており,すげぇって感じでした.

自作BLEキーボードのその後

途中から聞きました. mbed vs arduinoの話だったり,市販のガジェットだと少し応用力にかけると思ったらmbedで作ったらいいみたいなお話が興味深かったです. mbedは高いけど,32bitでオンラインにIDEがあり環境構築がほぼしなくてよいのが,良さそうだと感じました. 自作キーボードのためにmbed始めても良さそう.

www.mbed.com

闇の話

やばかった😱

人類バーチャル化のすすめ

まさかの3Dモデルでのプレゼン,かつHMDを顔に装着している!すごい!となかなかに驚かされた発表でした. そしてちゃんと両手に持っているコントローラーを動かすと,キャラの腕が動いたりスライドのポインタを操作したりすごい未来を感じました. 正直,ほぼ画面の3Dモデルに目がいってしまいました. 画面に映っていたのは,ヨハトちゃんです.

twitter.com

そして一番面白いトピックがVR面接です. しかしまだデバイスを持っている同士でしか面接できなかったり,実現するのは少し厳しめらしいです. でも個人的に面接官が可愛い美少女だったら,面接のモチベーションは非常に高いものになると思うので,是非ガンガンやっていってほしいです.

panora.tokyo

ペパボ Make部: デモ2連発

ロボットボールと歯ブラシスタンド,二本立てでのプレゼンでした.

まずロボットボールですが,ちょうど良いサイズのロボットボールがなかったから作ったというすごくかっこいい背景でした. そして完成品のデモでは,すごく機敏に動くしいろんな色で光るしで,かっこよさが際立ってました. 光るとやっぱり動いている感が出るというか,重要なのだなと再認識しました. また今度,キーボードを光らせようと思いました.

medium.com

二つ目は歯ブラシスタンドをハックして,磨き始めと磨き終わりのデータを取れるようにしたものを作成した話でした. 子供に歯ブラシスタンドを使わせた時に,子供は容赦無く歯ブラシをスタンドめがけてぶっ刺してしまい,壊れてしまったみたいな話にすごく物理を感じました.子供怖い. そして歯ブラシスタンドは何も光ることはないので,壊れてもわからないという話が個人的にツボです. ハードは壊れてもわかりづらいのは,本当に大変だなぁと思いました.

また冒頭で紹介されてた光るチャリはめっちゃかっこいいと思いました.

スライドは以下に上がっているようです.

speakerdeck.com

まとめ

1日目からなかなかに濃い内容の話が聞けて個人的に大満足でした. また明日も頑張って参加します.

部活の制作合宿でやったこと

部活の制作合宿が2018/09/01~03にありました.そこでやったことをここに書いておこうと思います.

1日目

戦術的DDD講座をした

speakerdeck.com

個人的に色々なサイトを見たりエリックエヴァンス本を読んでいたので,戦術的なDDDの内容をまとめました. アーキテクチャ周り多めの内容です. 擬似コードJavaっぽいなにかのようなアレですね😇

特に参考にしたのは,「現場で役立つシステム設計の原則」という本です.皆さんも是非読んで見てください.

gihyo.jp

2日目

ここからようやっと重い腰をあげて制作を始めたんですけど,自分で一から制作するの少ししんどいなぁと思い,GitHubOSSのプロダクトをforkして自分の好みのものに仕上げました.

利用したOSSは,codeskyblue/gohttpserverです.すごく良くできたファイルサーバで非常にありがたくコードを読ませてもらいました.

やったこととしては,画像ファイルのサムネイル表示を行なったりおそらく特に必要ないインデックス作成処理を削除しました. Twitterシェアボタンを導入しようとしたのですが,画像をどうやって投稿しようと悩み放置しました. 後日とりあえず画像とテキストを合わせて投稿できるようになりましたが,画像がリンクのみで表示されたりツイートが二回されたり,もう少しなんとかならんかなぁとか思ってます. シェアボタンの処理は,sallar/github-contributions-chartを参考に実装しました.画像シェア系の知見があまりないのが,なかなかつらみ.

3日目

speakerdeck.com

とりあえず発表を行い,他の人の発表を聞いて色々質問して終わりました.スライドの構築方法は古いやつなので,最新の構築方法はmitubaEX/imclを参照してください.

まとめ

DDDについていつかまとめたいと思っていたので,いい機会だったかなと思います. 制作はあまりがっつりできなかったので,今度はもう少しがっつりやろうかなと思います.