Environment Variable for my salary

キャリアなんておれが一番迷走してるわ。

前提として経営者経験なし、マネージャー経験も今のポジションまでなし、フリーランス経験なし、なので、あんまり参考にならない。

仕事ができるかは仕事をしてみないとわからないので、業務委託なりで仕事をしてみるしかないんじゃない。雇用しちゃうと解雇大変です。

給料って、相場と市場価値と需要と供給と交渉力とタイミングで決まるとおもっています。

「能力に対する適価」なんてものはない。

I’m getting lost smoothly

順調に迷走中。もうちょっと続く。

一番の憧れはまだサンフランシスコ。まあそれもいいけど現実的には、中国や東南アジアで高い経済成長している空気を吸うのもいいじゃん、ってことで香港シンガポールで就職活動をしていたMarch-April 2018。感じたのはビジネスサイドの人と英語でコミュニケーション取れないな、ということ。エンジニアともコード越し以外はコミュニケーションとれない。あと、香港やシンガポールではシニアになると、割合は差があるけど、マネジメント経験が求められてしまう。あとはNode & Golangにキャリアチェンジしようとしたけど、日本とRailsに逃げ帰る、ってかんじ。

英語でマネジメントする経験を積む、英語でエンジニアリングの議論をする、これを求めて今の仕事をしている。なんでこれを求めているかというと、おもしろいやつ強いやつとはたらきたいから。自分の知的好奇心を満たし、他人の知的好奇心も満たせて、切磋琢磨していたい。現状これに向かっているかと、はてな。

今は英語でエンジニアリング議論できてるかというとしていない、英語でマネジメントするかというとそれもしていない、日本向いて日本語で仕事している状態。会社を拡大して行きたくて、それに出てくる問題をどんどん潰している。最近時間は社内インフラとかインフォメーションセキュリティに使っている。仕事でコードを書いていないことに焦りがないわけじゃないけど優先度考えるとコードを書いている場合じゃない。早く自分がいなくて回るようにしてコード書くのに戻りたい。モチベーションが燃え尽きてみたり、焦って空回りしてみたりしている。

昼の仕事でコード書かないので、身を削る。htmlとcssをparseして画像を出力する、ブラウザエンジンを作るのはなかなかおもしろかった。 https://github.com/sanemat/ts-toy-engine ただ社内的にも社外的にも誰も面白がってはくれなかった…

今は世界平和に興味があるので、2年後にはブラウザを作っている or CDNを作っている、そういう仕事をしていたい。

Computer Science やらなきゃ、とCoursera やろうとして1週目で挫折するとは。

テンセントやGrabに移れるようにしようと思ってたのに、遠ざかっているぞ。どうしてこうなった。

“Debugging Teams”

Debugging Teams – O’Reilly Media is the 2nd version of “Team Geek.” They said “HRT” Humility, Respect, and Trust are the essential things to the team again and again.

Sometimes I think I’m superior to other members. This behavior is the lack of humility. Our teammates don’t have the experience, so sometimes they misunderstand the result. Of course, this is not why they are stupid. They don’t have enough information in most cases. I usually got frustrated, but this is my failure.

I need to share the information more to team members. I need to create a system that improves sharing information. I usually do this, but I have to do more.

I read this from Aug 1 to Sep 30 :sweat: about 2 months. I may read this in 2-3 hours in Japanese :sweat:

時刻の扱い

考えてたけど、UTCでの絶対時刻と、その出来事のタイムゾーンと、その出来事が属して欲しい日にち、これが保存できていれば、大体大丈夫では。

2019-04-30T22:47:00-0700 は、Apr 30であって、JSTだと2019-05-01T14:47:00+0900だけど、JSTで集計しても、 Apr 30に含まれて欲しい。

I’m confused with pattern matching in typescript

pattern matching in typescript をぐぐっているがなんかまだよくわからない。

Functional design: Algebraic Data Types – DEV Community 👩‍💻👨‍💻
Pattern matching and type safety in TypeScript – LogRocket
Pattern Matching Custom Data Types in Typescript · Parametric Studios
Pattern Matching with TypeScript by Manuel Alabor
Implementing a Maybe Pattern using a TypeScript Type Guard

Launched “Open for Hatena Bookmark” android app

urlのはてなブックマークのページを開くandroid appをreleaseした。

Open for Hatena Bookmark – Apps on Google Play https://play.google.com/store/apps/details?id=jp.sane.openforhatenabookmark

体験

web browseや、twitter appのcustom tab、facebook appのcustom tabでページを開いていて、そのページのはてなブックマークコメントが見たい。

Open withで、Open for Hatena Bookmarkに渡す。

もう一度どのブラウザで開くか聞かれる。Open with Firefox -> JUST ONCE を選ぶと、Custom tabs (Firefox android)で、firefox androidのログインセッションを引き継いで、はてなブックマークコメントを読むことができる。便利ー

web viewだとブラウザのログイン引き継げないからね。

open withでJUST ONCE 運用してる時はいいけど、ALWAYSでどうにかしたいけど一度defaultを覚えさせてしまうとつらい。これが今の最大弱点。

あと、挙動を理解していないと、挙動を理解していても、Open with複数パカパカするのは、バグってると勘違いするので、バグらないようにしないといけない。

といってもver1.0.1は打っていいだろ、ということで単機能&バグ入りリリース。はー神アプリじゃ。

このアプリいくつもパターン作っているが、理想形はbookmarkletなんだなあ。custom tabs全盛期だから仕方ないけど。

Oneplus 6 with Ubuntu 16.04

I met this error blow:

$ adb devices
List of devices attached
471bc66c        no permissions (user in plugdev group; are your udev rules wrong?); see 
[http://developer.android.com/tools/device.html]

So I checked lsusb,

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 138a:0090 Validity Sensors, Inc. 
Bus 001 Device 003: ID 04f2:b531 Chicony Electronics Co., Ltd 
Bus 001 Device 007: ID 2a70:4ee7  #=> This is my oneplus 6
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

android – set up device for development (???????????? no permissions) – Stack Overflow

Then I added udev rule.

$ sudo cat /etc/udev/rules.d/51-android.rules
# adb protocol on oneplus 6
SUBSYSTEM=="usb", ATTR{idVendor}=="2a70", ATTR{idProduct}=="4ee7", MODE="0666", GROUP="plugdev"

After that

sudo service udev restart
adb kill-server
adb start-server
$ adb devices                                                                           
List of devices attached
471bc66c        unauthorized

I “authorized this computer” in popup,

$ adb devices
List of devices attached
471bc66c        device

It works!

gemのリポジトリにGemfile.lock をコミットするか、gitignoreするか

TL;DR

2017-07-20 から、bundle gem my-awesome-gem の生成物で、Gemfile.lockをgit ignoreしなくなった。
Stop gitignoring Gemfile.lock in default template #5822

なんでgit ignoreしていたのか、なぜするべきなのか、どうしてしなくなったのか、あたりを整理する。
なおわたしはignoreしているほうがいいとおもってる。

きっかけ

わたしがこう反応したら、

そりゃgemの開発者は無いと困るけどさ 利用者のが圧倒的に多いじゃん
理解できねー

こういう反応を複数もらったので。

あれ、利用者がgemfile.lockあってなんか困ります?

直接それが原因では困らないが、実質困るケースが増えると思う。

環境

$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

$ bundle --version
Bundler version 1.16.2

$ bundle gem test-pack
(snip)

$ cat .gitignore
/.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/

定説的なやつ

たとえばrailsアプリなど、アプリケーションはGemfile.lockをコミットすべき。
gemはGemfile.lockをコミットしないべき。

どっかできいたことあるはず。んで、よく引き合いに出されるのがClarifying the Roles of the .gemspec and Gemfile

日本語訳はgemspecとGemfileの役割をはっきりさせておく
許可取ってるか取ってないかわからない(許可取ってたらごめんね)翻訳ですが、これを勝手に許可無く掘り起こしてる人がいる。

今読み返すと、それコミットしてもいいでしょ、って言えるぐらいだなー。なので掘り下げる。

gem installやbundle installでrubygems.org 及びそのクローンの場合

metadataをみてるはず(要出典)。

metadataってなんだよ

$ bundle exec rake build

test-pack-0.1.0.gemができる
中身は
checksums.yaml.gz
data.tar.gz
metadata.gz

metadataの中身はこう。

--- !ruby/object:Gem::Specification
name: test-pack
version: !ruby/object:Gem::Version
  version: 0.1.0
platform: ruby
authors:
- Sanemat
autorequire:
bindir: exe
cert_chain: []
date: 2018-07-22 00:00:00.000000000 Z
dependencies:
- !ruby/object:Gem::Dependency
  name: bundler
  requirement: !ruby/object:Gem::Requirement
    requirements:
    - - ">="
      - !ruby/object:Gem::Version
        version: '0'
  type: :development
  prerelease: false
  version_requirements: !ruby/object:Gem::Requirement
    requirements:
    - - ">="
      - !ruby/object:Gem::Version
        version: '0'
- !ruby/object:Gem::Dependency
  name: rake
  requirement: !ruby/object:Gem::Requirement
    requirements:
    - - ">="
      - !ruby/object:Gem::Version
        version: '0'
  type: :development
  prerelease: false
  version_requirements: !ruby/object:Gem::Requirement
    requirements:
    - - ">="
      - !ruby/object:Gem::Version
        version: '0'
description: fix me
email:
- o.gata.ken@gmail.com
executables: []
extensions: []
extra_rdoc_files: []
files:
- ".gitignore"
- CODE_OF_CONDUCT.md
- Gemfile
- Gemfile.lock
- LICENSE.txt
- README.md
- Rakefile
- bin/console
- bin/setup
- lib/test/pack.rb
- lib/test/pack/version.rb
- test-pack.gemspec
homepage: http://example.com
licenses:
- MIT
metadata:
  allowed_push_host: 'TODO: Set to ''http://mygemserver.com'''
post_install_message:
rdoc_options: []
require_paths:
- lib
required_ruby_version: !ruby/object:Gem::Requirement
  requirements:
  - - ">="
    - !ruby/object:Gem::Version
      version: '0'
required_rubygems_version: !ruby/object:Gem::Requirement
  requirements:
  - - ">="
    - !ruby/object:Gem::Version
      version: '0'
requirements: []
rubyforge_project:
rubygems_version: 2.7.6
signing_key:
specification_version: 4
summary: fix me
test_files: []

rubyとかgit ls-filesとかもう残ってない。
そして、bundle exec rake buildの場合、my-awsome-gem.gemspecの中身だけ反映されている。
Gemfileにだけ書いたものはmetadataに入ってない。

与太話: Gemfile 消したら bundle exec rake build 動かなかった :thinking:

Gemfile, Gemfile.lock

これがbundlerの独自ファイルなのは、忘れてるけど言われりゃそうだろうなと思う。

my-awsome-gem.gemspec

これはbundlerの独自ファイルだっけ? 実態として作らなきゃいけないかは定かではない。
たとえばいまはseattlerbぐらいでしか使われていないhoeの場合、gemspecファイルがリポジトリにないが、動的に作っているのか、何だったか忘れた(要出典)
使用例: https://github.com/seattlerb/ruby_parser

つまり

metadataに反映されるかされないかだけで、どうでもいい、とも言える

bundle installでgit repositoryをsourceにする場合

リポジトリのGemfileを見に行くんじゃない? (要出典)
このときlockみてるのかなあ 見てないんじゃないの(要出典)

gem install, bundle installのしくみ

このmetadataをかき集めて、それを満たす最大のバージョンをインストールする。(要出典)

前半ここまで。

Gemfile.lock

アプリケーションを作っている時に、Gemfile.lockなかったら、バージョン固定できなくてつらい。
これは説明いいよね。

gemとGemfile.lock

ここは思想の違い。
lockがあれば、CIで固定のバージョンで通ったことを確認できる。
この組み合わせだと動くよ、ってテストの範囲では言うことができる。

ただ、それってなんの意味があるの、利用者の手元でgem install, bundle installするときに、
なんの関係もないじゃん、って思ってしまう。利用者ではmetadata見るだけなので。

lockがない場合、たとえば新しいcontributorがバグフィックスしたり、新しいフィーチャー持ってくるときに、pull requestを送ったら依存でぶっ壊れてテストが真っ赤というのがよくある。

Over time, however, it became clear that this practice forces the pain of broken dependencies onto new contributors, while leaving existing contributors potentially unaware of the problem.
https://github.com/bundler/bundler/issues/5879#issue-244213907

大体の場合、new contributorsは、自分のfixやfeature入れる前に、もうぶっ壊れてることを報告して、何なら自分で直したりして、test greenにしてから、自分の変更を入れる必要がある。
new contributorsはテンション下がるよね。
まあそれはそうなんだけど、それはもうぶっ壊れてるんだよね。

つまりGemfile.lockをコミットすることで、最新バージョンで動かす責任をnew contributorsからほかのcomittersに移したと言える。
新しい人が開発しやすくなってよかったね。gemとしてリリースするものが動くかどうかはcommiterの責任ですよ。
めでたしめでたし。

なわけないじゃん。。利用者がinstallしようとするときの組み合わせではない古いlockの組み合わせで確認オッケーリリースって事故しか見えない。

そんな事故起こりうるの?って疑問には、だってそれがpainだからゆうてるやん、ってことで。

じゃあどうやって保証するのというと、保証なんてできないので、lockをignoreしておいて、定期的にciを動かしてfailしたら直し続けるしかない。
lockありのテストとlock消してbundle/gem install してテスト、の両方やるでもいいよ。

同じ話の言い換えで、ぶっ壊れてることに気づきづらくなるというのもある。Gemfile.lockを消したpull requestを定期的に送るのかな。

利用者が困る

そりゃgemの開発者は無いと困るけどさ 利用者のが圧倒的に多いじゃん
理解できねー

ぶっ壊れgemがよりリリースされやすくなって利用者が困るの説明でした。