Corne Cherryを作成しました

こんにちは、ミツバです。

この前、Corne Chocolateを作ったのですが、Cherryの方も欲しくなり本日作りました。

つくったもの

買ったキーキャップ

遊舎工房さんで以下のキーキャップを購入しました。 非常にきれいな色合いで文字列キーはいい感じでした。 エンターや記号系はキー数がそもそも少ないので、大分余ってしまいました。 なのでまた別のキーボードを作ったときにでも使いたいと思います。

mechanicalkeyboards.com

キーマップ

キーマップを載せておきます。 ADJUSTは未だに利用方法を開拓できていないので、特に設定はいじっていないです。

  [_QWERTY] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        TAB,     Q,     W,     E,     R,     T,                      Y,     U,     I,     O,     P,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      CTLTB,     A,     S,     D,     F,     G,                      H,     J,     K,     L,  SCLN,  QUOT,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,     Z,     X,     C,     V,     B,                      N,     M,  COMM,   DOT,  SLSH,  RSFT,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  LOWER, GUIEI,   SPC,      ENT,   ESC, RAISE \
                              //`--------------------'  `--------------------'
  ),

  [_LOWER] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
        ESC,    F1,    F2,    F3,    F4,    F5,                     F6,    F7,    F8,    F9,   F10,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
      CTLTB,     1,     2,     3,     4,     5,                   LEFT,  DOWN,    UP, RIGHT, XXXXX, XXXXX,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,     6,     7,     8,     9,     0,                    F16,   F17,   F18,   F19,   F20, XXXXX,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  LOWER, GUIEI,   SPC,      ENT,   ESC, RAISE \
                              //`--------------------'  `--------------------'
  ),

  [_RAISE] = LAYOUT_kc( \
  //,-----------------------------------------.                ,-----------------------------------------.
      XXXXX, XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,                  XXXXX, XXXXX, XXXXX, XXXXX, XXXXX,  BSPC,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       EXLM,    AT,  HASH,   DLR,  PERC,  CIRC,                   AMPR,  ASTR,  LPRN,  RPRN,  MINS,   EQL,\
  //|------+------+------+------+------+------|                |------+------+------+------+------+------|
       LSFT,  BSLS,   GRV,  LBRC,  RBRC, XXXXX,                   BSLS,   GRV,  LBRC,  RBRC, XXXXX, XXXXX,\
  //|------+------+------+------+------+------+------|  |------+------+------+------+------+------+------|
                                  LOWER, GUIEI,   SPC,      ENT,   ESC, RAISE \
                              //`--------------------'  `--------------------'
  ),

ファームウェア書き込みは以前の記事を参照してください。

mitubaex.hatenablog.com

最後に

よい自作キーボードライフを!!!!

Corne Chocolateを遊舎工房さんで作りました

こんにちは、ミツバです。

先日、corne-chocolate遊舎工房 で作りました。

遊舎工房さん

備品がたくさんあり、半田吸い取りなんかもできたりします。 それらの備品が最高でも1000円で使いたい放題なので、遊舎工房さんで作成は価値は十分にあると思います。

作成風景

f:id:MitubaEX:20190416094242j:plain
半田付け風景

f:id:MitubaEX:20190416094334j:plain
キースイッチ取り付け

f:id:MitubaEX:20190416094401j:plain
完成

キーマップ設定

  • qmk/qmk_firmware をforkしてきてcloneする
  • keyboards/crkbd/keymaps/default/keymap.c がキーマップの設定ファイルなので、これを編集します
  • 編集後、make crkbd:default して、 make crkbd:default:avrdude を実行し、リセットボタンを二回押す
  • 左が実行できたら右も実行して終わり

キーコードは こちら を見たら良さそうです

所感

自分で半田付けして、それが動くと感動するしこれが自作キーボードの良さなのかと感じました 自作キーボードだとこの配列にしたいというのが自由自在なので、すごく設定する楽しみがあり良さがすごいのでまた作っていきたいです

YAPC::Tokyo 2019に参加してきました

こんにちは,ミツバです.

YAPC::Tokyoに参加してきたので,その参加レポートを書きます.

参加したきっかけ

普段はPerlを書いたことが全くない僕ですが,シェル芸などのトピックでPerlを利用したワンライナーがあったりして少し興味はあったりしてました. しかし普段はawksedに甘える毎日を送っており,Perlを触る機会を作ってこなかったです. そんなときにYAPC::Tokyoというカンファレンスがあることを知り,ここでPerl入門を決意しました.

前夜祭(カンファレンス前日)

カンファレンス前日には前夜祭があり,なんとか遅刻せず参加してきました. 前夜祭では,テンポよくLTが繰り広げられ楽しい会でした.

発表も面白く,内容としては,

  • PerlLispインタプリタを書いて,その上でPerlを動くようにしたものの発表を聞いたり,
  • 日本の祝日についてのライブラリ更新事情を聞いたり,
  • AWS CDKのお話を聞いたり,

様々な方面で楽しい会でした.

以下に会場の様子の写真を貼っておきます.

f:id:MitubaEX:20190127173214j:plain
ご飯の様子です

カンファレンス当日

カンファレンス当日は11時からオープニングトークが開始されました. 今年のテーマは報恩謝徳,「恩に感謝し報いること」という意味があるそうです. 深い.

僕が聞いたトークを並べるとこんな感じです.

  • チームが前に進み続けるために僕たちが考えたこと
    • papixさん
  • 私とOSS活動とPerl
    • duck8823さん
  • メッセージングのプロトコル
    • 加藤亮さん
  • ゲストスピーカー: 大仲さん
  • ゲストスピーカー: 広木さん
  • ログにやさしいDB設計
    • fist0さん
  • CPAN Module Hacks
    • akiymさん
  • ISUCON8予選問題作成の裏側
    • karupaneruraさん
  • 多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと
    • songmuさん
  • キーノート: tokuhiromさん

どの発表もためになるものばかりで聞いていて気持ちよかったです.

特にゲストスピーカーのお三方の話は,どれも興味をそそられ釘付けになって聞いていました.

大仲さんは,Perl on RailsというテーマでRailsの力を用いて,Perlのプロダクト開発の効率を高めることを目指したお話をされていました. 名前からすごく面白いテーマですが,中身はすごくしっかり考えられていてAPI REPLなども作成し,より効率化を図っていました. APIのテスト用のREPLという発想は僕には全然なかったので,すごく知見をえれました. そしてActiveRecodeを入れてER図を自動で生成できるようにしたりと,Rubyを長年やってきた大仲さんだからできる応用力なんだなと思いました.

次に広木さんのお話では,「エンジニアリング組織論への招待」に関連したお話を聞きました. ここで印象的だった言葉が,「エンジニアと非エンジニアの非対称性を埋める」という言葉です. ここでの「非対称性を埋める」という言葉は,他者との知識の共有度合いを均等にすることだと,私は捉えました. そしてこれによって,ソフトウェア開発の様々な不確実性を減らしていこうというテーマのお話でした.

speakerdeck.com

最後にキーノートのtokuhiromさんのお話では,tokuhiromさんのPerlに触れてきた人生のお話を聞きました. そしてコミュニティへの貢献方法のお話も聞きました. 僕はsongmuさんのトークも聞いており,それと合わせてもっとアウトプットしていかないとと思いました. 最後のスライドには「Future Perl Community is You!」という言葉がありすごくエモかったです.

以下に会場の写真を載せておきます.

懇親会

Acmeという言葉がよくわかっていなかったのですが,丁寧に教えていただき興味を持ちました. あとは内定先のメンターと話したり,楽しく過ごしていました.

感想

Perl全然わからんという状態で参加したものの,すごく初心者にも親しみやすい発表が多くて勉強になりました. 今年が初参加だったのですが,来年も参加してLTとかしてみたいなと思いました.

最後にPerlに入門できたのか?という話なのですが,モジュール周りのお話は入門できたかなと思いました.これから他もやっていきたいと思います.

freeeに内定をもらうまでの人生

こんにちは,freeeに19卒で入社するミツバ(中村潤)です. これはfreee 19新卒Advent Calendar 2018の14日目の記事です

adventar.org

内定式では特にニックネームについて言ってなかったのですが,ミツバが僕の本名みたいなものなので気軽にミツバと呼んでください.😎

最近の関心ごとは,Haskell圏論です.趣味は,アニメ鑑賞(GRIDMAN)とVTuber鑑賞(ハニスト)です.

何書こうかなぁとか考えましたが,みんな内定をもらうまでのいろいろを書いているので,僕も便乗することにします. ちなみに僕が過去に書いたそれっぽい人生の記事はこちらです.

note.mu

インターンまで

freee社のことは逆求人で知って,去年先輩がインターンに行ったとのことだったので少し興味が湧いてエントリーしました. 面接を何回行ったとかはあまり覚えていませんが,GO言語がよさみに溢れてそう!みたいなことを喋ったら通った記憶があります.

インターン

僕が参加したインターンは,2017/8/21(月)~ 2017/8/25(金)の一週間のものです.

あと,当時の僕のツイートも合わせて載せておきますね.(なんで?)

インターン初日

この日は,会社に初出社し挨拶なりなんなりをしてメンターと挨拶をした後,即昼飯って感じでした. ここでAdvent Calendar1日目のスポーンくんと奇跡の邂逅を果たします.

そのあとは,PCのセットアップ周りをずっとして1日がすぎました. 特にリポジトリをcloneするのにすごい時間がかかり,僕はその間にコーラを3杯は飲んだと思います. そしてこのインターンのおかげでコーラが飲み放題の会社,神では!?と思ってしまい,この後の就職活動で出会った会社にはコーラが無料か?と質問しまくる人間になってしまった・・・😫


インターン2日目

業務のissueを一つもらってそれをやる流れでした.

某社員の人にVim (Editorです)はやべぇみたいなことを言われた気がします.でも当時の僕はそれほど強くなかったので,お恥ずかしい限りです.😱

  • これが当時の僕のvimrcです.

  • これが今の僕のdotfilesです.

◯◯が入ってないやん!って思った方は,優しく裏で教えてください!


そしてissueでは,フロントの改修を任されていたのでReactを学びつつコードを読んでいました.

Reactをインターンで初めて触って二日目で概念を理解するところまでいけました.最高にqiitaを漁った記憶があります.同じインターン生でインターン中にTour of Goをやって即実践している人もいて,みんな早えぇなって感じでした.


インターン3, 4日目

こっからはずっとコード読んでた気がします.

3日目には退勤後,串カツ田中で社員の方達と飲みを行いました. ちなみに串カツ田中は,関東圏に大量にあるのですが関西には全然ないので存在を知ったのはこの時でした.

👇は串カツ田中のスタンプで,社内slackでなかなかの頻度で使われていました.

f:id:MitubaEX:20181214135102g:plain
串カツ田中スタンプ


インターン最終日

最終日は,自分の一週間でやったことを紹介する感じでした. 僕の発表は,ぼちぼちウケていたのでウケる.😼

その後

インターン後,面接がぽつぽつあり気づいたら内定をもらっていて,内心は!?!?って感じでした. そこからは12月まで就職活動を続けて,freeeの内定を承諾した流れです.

言いたいこと

インターンに行ったことで物事の考え方が変わったし,本当に行って良かったなと思ってます. 僕は個人的にいろんなものを雑に触るのが好きで,そこまでスペシャリストになるわけではないという人間です. なので,初めて触る技術の取っ掛かりも雑に理解しようとしました. それが逆に良かったのかなぁと思ったりしています. もしすごく奥の奥まで調べ上げるような人間だったら,多分インターン中に一つもissueをこなせなかった説が濃厚です.(そもそも実力があまりない)

何が言いたいかというと,別に未経験とか経験が豊富とかはあんまり関係がなくてどう物事を自分の考えに落とし込むかがこの先たくさん必要になってくるだろうから,頑張っていこうぜ!ということです. なので,みんな爆速で「完全に理解した!」と言うべきだと思っています.はい.🙋‍♂️

偉そうなことを言いましたが,こういうポエムが好きなので仕方ない.

ちなみに同じ19卒内定者のnakochiさんの記事が最高に心に響く内容だったので,ぜひ読んでください.😆

note.mu

最後に

長くなりましたが,こういう記事を書ける機会を作ってくれたfreee19卒内定者のみんなに感謝.

明日の記事は中川くんです.お楽しみに!

Macの日本語入力のためにSKKを導入した

SKKとは

Emacsのために開発された日本語入力システムだそうです。(僕はVim使い)

SKK - Wikipedia

Install

今回はMacを利用するので、codefirst/aquaskkを利用しました。

↓のReleaseページにpkgファイルが置いてありました。

releases

Usage

まずインストールが完了したら、キーボードの環境設定から入力ソースの中にAquaSKK 統合を選択してください。 すると利用できると思います。

SKKにはいくつかモードがあるらしく、それを紹介しておきます。

  • 日本語入力モード
  • カナモード
  • 英字モード

日本語入力モード (Ctrl + j で 切り替え)

日本語入力モードは、なにも押さない状態で日本語を打つとそのままひらがなが入力されます。 そして漢字変換をおこない場合は、Shift + 何か入力したい文字 を入力してください。 すると▽が出てくると思います。 そこで変換したい文字列を打ち、Spaceを入力するとその漢字の候補があれば変換してくれます。

そして、SKKは辞書に登録されていない変換をしようとすると、候補がないことを伝えてきます。 この時、ユーザはSKKに自分の変換したい文字列を伝えることで、SKKは次からその単語を候補として出してくれます。

つまり、自分で育てる日本語入力システムという感じですね。

辞書への登録を行なう時は、そのまま [登録:へんかんしたい]変換したい のように入力すると登録してくれます。

カナモード (q で 切り替え)

ただカタカナが無限に打てるモードです。

英字モード (l で 切り替え)

ただ英字が無限に打てるモードです。

↓のマニュアルに書いてあることが大体いけます。

SKK Manual

感想

SKKの個人的に気にいっている所は、エンターを入力する頻度が少なくなったことです。 普通の日本語入力だとひらがなでも、エンターを入力しないといけませんもんね。 しかし、Shiftを入力する頻度がすごく多くなっている感じで、どっちがいいのかはわかりません。 でもこれで少し日本語入力が楽しくなった気がします。(モードという概念)

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