OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubの草の色に合わせて、Twitterのアカウント名をPythonとRaspberryPiを使って定期的に変更する

#はじめに
GitHubの草を生やすためにコードを書くようにする「GitHub駆動学習」を最近行なっています。そこで、その日のGitHubの草の色に応じて、リアルタイムでTwitterのアカウント名が変わるようにすれば[^1]、モチベーションが上がるのではないかと思ったので、別用途で常時可動しているRaspberryPiでcronを使ってやってみました（もちろん定期実行が出来れば、RaspberryPi以外でも可能です）。

[^1]: ちなみに、Twitterのアカウント名を定期的に変化させるというアイデアは、 [Twitterの名前を5分毎に東京の天気⛅☂☃と連動させるサーバレスプログラムを書いたら色々知らないことが出てきた話](https://qiita.com/issei_y/items/ab641746be2704db98be) という記事を参考にさせていただきました

#ソースコード
```Python:bot.py
import requests, json, pytz, os
from bs4 import BeautifulSoup
from datetime import datetime
from dotenv import load_dotenv
from requests_oauthlib import OAuth1Session


# .envファイルから各種変数を取得
dotenv_path = os.path.join(os.path.dirname(__file__), ".env")
load_dotenv(dotenv_path)

CONSUMER_KEY = os.environ["CONSUMER_KEY"]
CONSUMER_SECRET = os.environ["CONSUMER_SECRET"]
ACCESS_KEY = os.environ["TOKEN"]
ACCESS_SECRET = os.environ["TOKEN_SECRET"]
GitHub_ACCOUNT = os.environ["GitHub_ACCOUNT"]
Twitter_ACCOUNT = os.environ["Twitter_ACCOUNT"]


# GitHubおよびtwiterのURL
url_userpage = "https://github.com/" + GitHub_ACCOUNT
url_get_name = "https://api.twitter.com/1.1/users/show.json?screen_name=" + Twitter_ACCOUNT
url_post_name = "https://api.twitter.com/1.1/account/update_profile.json"


# タイムゾーンを設定
TIMEZONE = "Asia/Tokyo"
jst = pytz.timezone(TIMEZONE)
today_date = datetime.now(jst).strftime("%Y-%m-%d")


# 進捗状況一覧
words_dict = {
    "#ebedf0": "進捗ない", 
    "#c6e48b": "ちょっと頑張っている", 
    "#7bc96f": "まあまあ頑張っている", 
    "#239a3b": "結構頑張っている", 
    "#196127": "かなり頑張っている"
    }


# 今日のcontributionを取得し、カラーコードから進捗状況を作成
cookie = {"tz": TIMEZONE}
res_g = requests.get(url_userpage, cookies=cookie)
soup = BeautifulSoup(res_g.text)
today_contribution = soup.find("rect", {"data-date": today_date}) 
statement = "@今日は" + words_dict[today_contribution['fill']] + "みたい"


# twitterの名前の@以下を書き換える
twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_KEY, ACCESS_SECRET)
res_t = twitter.get(url_get_name)
new_name = res_t.json()["name"].split("@")[0] + statement
param = {"name": new_name}
r = twitter.post(url_post_name, param)
```

#ソースコード解説
GitHubのアカウントページを取得 → 今日の日付に対応する草のカラーコードを取得 → 草の色に対応する文字列でTwitterのアカウント名の@以下の文字列を変更 という流れになっています。

複雑なことは特にしていないのですが、GitHubのアカウントページにGetリクエストをする際に、タイムゾーン "tz" をCookieとして渡している点に気をつけました（この方法が正しいのかどうかはわかりませんが…）。GitHubのcontributionの日付はこのCookieに合わせて変わるようになっているようです。こうすることで、リアルタイムで草の色を正確に知ることが出来ます。

#cronの設定
このソースコード (bot.py) と各種パラメータを記述した.envファイルをscpコマンド等でRaspberryPiへ送り、その後、RaspberryPiでcronの設定を行ないます（他記事等参照）。現在は5分おきに実行されるように設定しています。

#終わりに
以前よりモチベーションが上がるといったようなことは特にありませんでしたが、RaspberryPiを活用できたのでよかったです。
画像のURLから画像ファイルを取得してFirebase Storageに保存する例

# 画像のURLから画像ファイルを取得してFirebase Storageに保存する例

Node.js, How to store Image from URL to Firebase Storage?
https://stackoverflow.com/questions/52661914/node-js-how-to-store-image-from-url-to-firebase-storage
への回答の例

```javascript

const functions = require('firebase-functions');
const admin     = require('firebase-admin');
const request   = require('request')

admin.initializeApp();

# 略

const getImageFromUrl = async (imgURL) => {
    const imgURL = "https://2017.brucon.org/images/b/bc/Twitter_logo.jpg";
    const ary = imgURL.split('?')[0].split('/');
    const imageName = ary.slice(-1)[0]

    try {
        const newFile    = storage.bucket().file(imageName);
        const blobStream = newFile.createWriteStream({ metadata: "image/jpg" });
        await request(imgURL).pipe(blobStream);
    } catch (error) {
        console.log(error);
    }
};
```
macOSX（Mojave）にhomebrewを使ってNode.jsを入れ用としたらPathが通らなかった

Macにnode.js入れようとしたらなかなかPathが通らなくて詰まった。 
node.js自体はhomebrewからnodebrewを使ってイントールした。

nodebrewのインストール

```
$ brew install nodebrew
```
nodebrewのが入っていることをヴァージョンで確認

```
 $nodebrew -v
```

その後、nodebrewのsetup

```

$ nodebrew setup
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```
ここで、PATHを通せを言われているのでnodebrewのPathを通す。

```
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

ここまでいったら次にお目当のnodeをインストール

```
$ nodebrew install-binary stable
```
- stable 安定板
- latest 最新

```
$ nodebrew ls
```
でインストールされているnodeのバージョンが表示される

```
v8.7.0
v10.13.0
v11.2.0

current: v10.13.0
```
current は今アクティブになっているnode のバージョンになる。
ここでバージョンを変えたい場合は

```
nodebrew use 8.7.0
```
みたいにすることができる。
```node -v```や``npm -v``でnodeとnpmが入っていることを確認する。

次に、このnodeやnpmのPathを通す必要がある（ここで詰まった）
私が最終的にうまく行った方法だけ。

```
$echo 'export PATH=$PATH:/Users/username/.nodebrew/current/bin' >> ~/.bashr
```
で``~/.bashrc``に環境変数を書き込み

``~/.bash_profile``に（なかったら作る）
下記を記入して

```
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```
shellが起動するごとに``~/.bashrc``を読み込むようにした。
こうすることで無事nodeとnpmが使えるようになった。

もっとうまくやる方法あるかもしれないけど。
M5Cameraからの画像をRasberryPIで受信する

###目的
M5CameraからRasberryPIでカメラ画像を受信する。

###準備
RasberryPIとM5Cameraとを、Wifiで接続する。
M5CameraのIPアドレス直下のjpgに、カメラの画像ファイルが生成されている。
今回は、pythonでM5Cameraの画像を取得して保存する。

###実装例

```
import io
import numpy as np
import requests
import cv2
import time

from matplotlib import pyplot as plt
time.sleep(2)
res = requests.get('http://192.168.4.1/jpg')//M5Camera IP Adress
bin_data = io.BytesIO(res.content)
file_bytes = np.asarray(bytearray(bin_data.read()), dtype=np.uint8)
img = cv2.imdecode(file_bytes, cv2.IMREAD_COLOR)
cv2.imwrite("m5camera.jpg",img)
 ```
jbuilder


```javascript

json.items Item.all do |item|
  json.id item.id
  json.created_at item.created_at
end

# {"items":[{"id":1,"created_at":"2015-03-05T22:57:40.558Z"}]}


```


```javascript


json.content format_content(@message.content)
json.(@message, :created_at, :updated_at)


  "content": "<p>This is <i>serious</i> monkey business</p>",
  "created_at": "2011-10-29T20:45:28-05:00",
  "updated_at": "2011-10-29T20:45:28-05:00",



json.author do
  json.name @message.creator.name.familiar
  json.email_address @message.creator.email_address_with_name
  json.url url_for(@message.creator, format: :json)
end


  "author": {
    "name": "David H.",
    "email_address": "'David Heinemeier Hansson' <david@heinemeierhansson.com>",
    "url": "http://example.com/users/1-david.json"



if current_user.admin?
  json.visitors calculate_visitors(@message)
end

  "visitors": 15,

  "comments": [
    { "content": "Hello everyone!", "created_at": "2011-10-29T20:45:28-05:00" },
    { "content": "To you my good sir!", "created_at": "2011-10-29T20:47:28-05:00" }




json.comments @message.comments, :content, :created_at

json.attachments @message.attachments do |attachment|
  json.filename attachment.filename
  json.url url_for(attachment)
end


 "attachments": [
    { "filename": "forecast.xls", "url": "http://example.com/downloads/forecast.xls" },
    { "filename": "presentation.pdf", "url": "http://example.com/downloads/presentation.pdf" }
  ]
}


```


## github

https://github.com/rails/jbuilder
node.js で sleep

なんか Node でコマンドラインツールを書いていて sleep したい用事があったので作ってみたらこうなった。

```js
async function sleep(t) {
  return await new Promise(r => {
    setTimeout(() => {
      r();
    }, t);
  });
}
async function main() {
  while (true) {
    console.log("sleep...");
    await sleep(1000);
  }
}
main();
```

https://github.com/tc39/proposal-top-level-await これが取り込まれると `main` がいらなくなってハッピー。

※　書いたあとで気がついたけど

https://qiita.com/albno273/items/c2d48fdcbf3a9a3434db で同じ方式が説明されていた。
初めてGoogle Colaboratoryを使ってみた感想

###初めまして、がっさんです。
初めてキータで記事を書きます。
偉い人がアウトプットが大事って言ってたので授業で学んだことを簡単に書いていきたいと思います。
こんな感じで少しずつ授業で習ったことを適当にアウトプットしていこうと思います。✊

#Google Colaboratoryを使ってコードを視覚化できるようにグラフで表示した。
##でもGoogle Colaboratoryを使ってみたといっても教授からもらったコードとデータを学科のサーバーからファイルをもらって実行しただけなので特に大したことはしてないです！！OH　YEAH✌

まずはWindowsのコマンドで学科のサーバーにログイン…。
学科サーバーのファイルに入ってるデータを取得…。
自分のデスクトップにファイルを保存…。
スラックでもらったコードをGoogle Colaboratoryに入力してデスクトップに保存したデータファイルを挿入…。

確かこんな手順でした。
手順を忘れないように一手一手キャプチャしながら進んでいったのですが時々キャプチャし忘れた。

実行した画面↓
![4process.PNG](https://qiita-image-store.s3.amazonaws.com/0/176074/a6fcaa4a-29db-eefb-acea-45033a3746b4.png)


これをみてわかった人は同じ学科の可能性が高いです。
####私とわかっても知らない人のふりをしててください。

ここまで読んでいただきありがとうございました！
それではまた。
iOS 写真アップロード ( input type=file ) の画像は JFIF と Exif の2種類ある

`<input type="file">` で iOS から写真をアップロードする際に気をつけること、それは写真の選択によってアップロードされる画像の中身が微妙に変わることです。

<img width="320" alt="IMG_8503256310BA-1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/2152/490dcf05-471c-0272-7371-c71c740c8062.jpeg">

上にある「写真を撮る」と「フォトライブラリ」で異なります。

## 何が違うのか？

写真のメタ情報フォーマットが異なります。

- 写真を撮る: JFIF
- フォトライブラリ: Exif

### JFIF とは

写真を撮るからアップロードされるファイルは JFIF フォーマットになっています。JFIF というのは米C-Cube Microsystems社によって提唱された画像メタ情報を埋め込むためのフォーマット仕様です。具体的には SOI (0xFF D8 ) の直後に APP0 Marker ( 0xFF E0 ) がきます。解像度やサムネイルの情報が格納されています。

![JFIF](https://qiita-image-store.s3.amazonaws.com/0/2152/0c1ff663-dd85-b222-a877-498604d05850.png)

もしサムネイルがある場合は、この後にサムネイル情報が来ますが iOS で作成されるデータにはサムネイルは含まれていません。**そして、APP0 の次に APP1 Marker つまり Exif の情報が来ます。**

つまり、「写真を撮る」でアップロードした画像の回転情報を取得したい場合は、APP0 を飛ばして APP1 を探す必要があります。Exif の仕様としては SOI の直後に APP1 Marker が来るはずなので、それを信じて 3byte 目を直接読むと JFIF だったという罠に陥るので注意です。僕はそれにはまりました…。

(* なお位置情報は含まれていません )

### Exif とは

フォトライブラリから選択してアップロードされるファイルは Exif フォーマットになっています。 (* アプリなどで Exif 情報を削除してたりすると当然存在しません ) 画像の回転情報や位置情報は Exif に含まれているので、利用したい場合は Exif の APP1 Marker の場所を探すのが良いでしょう。

![Exif](https://qiita-image-store.s3.amazonaws.com/0/2152/e773ca62-2b1f-bcbc-7a9f-37224d4ca085.png)

Exif を JavaScript でパースする方法は他の記事で紹介しているので参考にしてみてください。

- [JavaScript で Exif の Orientation をパースして画像を正しく表示する方法](https://qiita.com/zaru/items/0ce7757c721ebd170683)

## 参考

- [JFIF version 1.02](https://www.w3.org/Graphics/JPEG/jfif3.pdf)
Charthageのあの辺をこういう風に


Carthage を使う時にRunScriptに設定するアレ。

```sh

carthage copy-frameworks
```

コレ。

これはいいんだけど、inputfileとoutputfile設定するの面倒くさい。

なのでこれ。

```sh

INPUT_FILE_NAME=carthageCopyInputFiles
OUTPUT_FILE_NAME=carthageCopyOutputFiles

find Carthage/Build -name "*.framework" > $INPUT_FILE_NAME

/usr/bin/ruby -e "
File
    .foreach('$INPUT_FILE_NAME')
    .map { |line|
    	File.basename(line.chomp)
    }
    .map { |line|
        '\$(BUILT_PRODUCTS_DIR)/\$(FRAMEWORKS_FOLDER_PATH)/' + line
    }
    .each { |line|
        puts(line)
    }

" > $OUTPUT_FILE_NAME

```

これをRunScriptに設定します。

で、copy-frameworksの方にはこう！

<img width="774" alt="スクリーンショット 2018-11-25 20.15.31.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/2117/fbf8e87e-12b0-42d7-befe-467f1eda69c9.jpeg">


#### 注意

Xcodeさんが馬鹿なので最初にビルドしようとすると
`error: Unable to load contents of file list: '/Users/masaki/Project/CocoaBindingsChecker/carthageCopyInputFiles'`
とかいいますので、

```sh
$ touch carthageCopyInputFiles
$ touch carthageCopyOutputFiles
```
とかしておきましょう。
2度目以降は大丈夫です。
Firebase CLI の複数アカウント運用を楽にする設定

[複数アカウントでFirebaseCLIを使う](http://developabout0309.blogspot.com/2017/09/firebasecli.html)

こちらで紹介されていた方法ですが、端末買い替え等の際の備忘録として実際に行った手順を記載しておきます。

環境: macOS Mojave 10.14.1

## direnv のインストール

公式サイトの手順に従って、direnv をインストールします。

[direnv -- Unclutter your .profile](https://direnv.net/)

今回は [MacPorts](https://www.macports.org/) でインストールしました。

```bash:bash
sudo port install direnv
```

## direnv の設定

こちらも direnv の公式サイトに各種シェル毎に手順が記載されています。
bash を利用している場合は下記の通り。

```bash:bash
echo -n "eval \"\$(direnv hook bash)\"" >> ~/.bashrc
source ~/.bashrc
```

## firebase-tools のインストール

既にインストール済でしたが、一応記載。

```bash:bash
sudo port install nodejs11
npm install -g firebase-tools
```

## Firebase のプロジェクトディレクトリ作成

各アカウント用のディレクトリを作成します。
example.local と example.private それぞれを別アカウントで利用する場合。
※ アカウント毎のディレクトリ(account.A, account.B)は分かりやすさのためで、特に必要というわけではありません。

```bash:bash
mkdir -p ~/firebase/account.A/example.local/
mkdir -p ~/firebase/account.B/example.private/
```

各プロジェクト配下にログイン情報等が配置されるディレクトリを作成。
（説明用に２回に分けていますが、下記のみで十分です）

```bash:bash
mkdir -p ~/firebase/account.A/example.local/.config
mkdir -p ~/firebase/account.B/example.private/.config
```

## direnv 設定ファイル作成

通常は `~/.config` 配下にログイン情報のファイルが作成されるようですが、これを環境変数 `XDG_CONFIG_HOME` で上書きできるそうなので、各プロジェクトディレクトリ配下の `.config` ディレクトリを参照するように設定します。

```bash:bash
# account.A 用
cd ~/firebase/account.A/example.local
echo "export XDG_CONFIG_HOME=\$(pwd)/.config" > .envrc
direnv allow .

# account.B 用
cd ~/firebase/account.B/example.private
echo "export XDG_CONFIG_HOME=\$(pwd)/.config" > .envrc
direnv allow .
```

これで、各プロジェクトディレクトリに移動すると `XDG_CONFIG_HOME` が書き換わり、他のディレクトリに移動すると元に戻ります。

```bash:bash
$ cd ~/firebase/account.A/example.local
direnv: loading .envrc
direnv: export +XDG_CONFIG_HOME

$ cd ..
direnv: unloading
```


## Firebase プロジェクトの初期化

あとは各ディレクトリで login / init　するだけです。

```bash:bash
cd ~/firebase/account.A/example.local
firebase login
firebase init

cd ~/firebase/account.B/example.private
firebase login
firebase init
```

これで、終わりです。


個人用と会社用が同じマシンにあるのはあまりよろしくないですし、そういうケースは少ないと思いますが、静的サイト用とアプリ用のような分け方は結構あると思うので、これは非常に便利です。

## 参考

[複数アカウントでFirebaseCLIを使う](http://developabout0309.blogspot.com/2017/09/firebasecli.html)
【GCP】courseraでGCPの学習をはじめました

##courseraでGCPの学習を始めてみた
courseraには7日間の無料学習期間があり、コースを受講することが出来る。
今回受講した講座は「[Google Cloud Platform Fundamentals: Core Infrastructure 日本語版](https://www.coursera.org/learn/gcp-fundamentals-jp)」
この講座は、音声は英語だが日本語字幕は表示されるのでとりあえず受講するには問題はない。
（若干わかりにくい日本語があるけども）

##少し受けてみての感想
まだ序盤の２つの講座しか受けていないけど、GCPを理解するにはかなり効率的な講座だと思った。
これまでは公式ドキュメントで、文章と簡単な図解から理解しようとしていたけれど、
音声（英語だけど）と絵で説明されるので、多少複雑な例を説明されてもちゃんと頭に入ってくる。

あと、１セクションごとに確認テストがあるのもとてもいい。
ちゃんと動画で説明された内容を理解していないと正解できないレベルの問題で、
３回トライして合格出来なかった場合、８時間経過しないと再リトライできない仕様になっているので
数撃ちゃ当たる作戦も出来ないようになっている。

Qwiklabsと連携して制限時間がある中で、実際に手を動かしながら学んだ手順を再実施できるのも
ちゃんと覚えられる仕組みになっていていいサービスだと思った。



みっちり７日間使い倒そう。
haulを使ったReact Native Appのビルド方法

# haul is 何

haulはwebpackを利用したreact native用のモジュールバンドラとデバッグ環境を拡張したツールです。

# Metro Bundlerと何が違うの？

Metro Bundlerは、babelのみでモジュールバンドルを行なっているために色々な制限がつきます（だいたいbabelプラグインでできる範囲と同じ制約になります）。haulは　webpackを利用しているので、typescriptの全制限を解除して使用することができる他、様々なassetsもjsの中に織り込むことができたりします。他にはtreeshakingによるbundleサイズを削減するなどのwebpackの特徴をほぼそのまま使用できます。特にresolveオプションなどは便利なので、アセットを再利用したい時に有用です。

# 使うために

haul.config.jsという設定ファイルを使います。設定ファイルはほぼwebpack 全ての設定が有効です。

設定は[こちら](https://github.com/callstack/haul/blob/next/docs/HMR_Setup.md)を参考にします。
仕組みは簡単で、androidの場合は、bundle先のファイルパスの指定をhaul用に、Xcodeでは、build Phaseを見ればわかる通りjsのバンドルをhaul-cliでバンドル処理を施した後、その後のipaのビルド処理をreact-native-cliのビルドコマンドに投げているだけです。（react-native-xcode.shのビルドコマンドも実際はxcodebuildコマンドを実行するためのラッパーになっているだけです。）

<img width="701" alt="スクリーンショット 2018-11-25 19.38.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/99145/2cfb9f23-7fa2-0d53-c76a-241b2e7baea7.png">

なので、実質haulが担保している役割はmetroで行われているdebug用サーバをwebpack-devserverに向けていることと、buildの処理を　metroからhaulに委譲しているだけで、nativeビルドに関与している処理は部分的であるため、シームレスにメトロとの交換が可能です。

# buildについて

設定は以上です。次にデバッグ中のreact-nativeの起動はreact-nativeコマンドではなくhaulコマンドになります。

```shell
haul --platform ios or android
```

でmetroではなくhaulサーバが起動するので、この状態でreact-native startを実行します。

リリースビルドは普通のreact-native-cliと同様にreact-native run-ios --configuration Releaseなどのコマンドでおこないます。このコマンドによってipaまたはapkにbundleされたjsが組み込まれるようになります。(これらのコマンドはビルドスキーマを参照してビルド設定に合わせてビルドしているだけなので、実際はおのおのフェーズでbundleしたjsを組み込むフェーズが定義されているからです)

# React Nativeでhaulを使う利点

基本的にTypescriptの恩恵をフルに受けるためとwebpackの設定に慣れている人が拡張性を高く利用するために導入するのでが良いでしょう。Expoなどで完結できるアプリやjs onlyアプリで開発する場合、あまりメリットはありません。ただ、Typescriptを利用する場合は、非常に便利であるため、ぜひ、導入してみてください。
AWSの新しいサービスを利用するときはRegion Tableで使えるリージョンを確認しよう

最近減ってきたけど、AWSのサービスは大々的に広告しているサービスでも日本のリージョンでは実はまだ利用できない、、、ということが時々ある。(例えばcloud9)

また、これまで使えなかったサービスも知らない間に使えるようになっているということもよく起こる。
今どんなサービスがどのリージョンで利用できるかを知りたいときは、Region Tableを参照すると良い。

ここには最新のサービス公開状況がそれぞれのリージョンごとにまとめられている。
以下は画面サンプル。Tokyoのチェックが入っていれば、そのサービスがTokyoリージョンで利用できるということ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77722/ba44ba51-f618-90a3-f668-e245d79e4d47.png)

これまでこのページをしらなくて、使いたいサービスにアクセスしてリージョンを切り替えてみて、、、なんてことをやってたけど、ここを見ればそんなことをしなくても良さそうだ。

AWS Region table
https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/
非同期　メッセージ送信

スタート

```javascript

1. ajaxでデータを飛ばす

  $("#new_message").on("submit", function(e) {
        e.preventDefault();
        var formData = new FormData(this);
        var url = $(this).attr('action')
        $.ajax({
                url: url,
                type: 'POST',
                data: formData,
                dataType: 'json',
                processData: false,
                contentType: false
            })

```

```slim

1. コントローラー起動
2. format.jsonで返す


  def create
    @message = @group.messages.new(message_params)
      if @message.save

        respond_to do |format|
           format.html {redirect_to group_messages_path(@group)}
           format.json
        end

      else
        @messages = @group.messages.includes(:user)
          flash.now[:alert] = 'メッセージを入力してください。'
          render :index
      end

  end
 

```

```slim

変換

コントローラーのアクション名と連動　（create）

json.id @message.id
json.name @message.user.name
json.created_at @message.created_at.strftime('%Y/%m/%d %H:%M:%S')
json.content @message.content
json.image @message.image.url

```

```javascript

1. doneで受ける
2. appendする

   .done(function(data) {
                var html = buildHTML(data);
                $(".main-message-container").append(html);
                $(".footer-box__text-field").val('')
                $(".upload-icon").val('');
                $(".footer-btn__send").prop("disabled", false);
                $('.main-message').animate({ scrollTop: $('.main-message')[0].scrollHeight }, 'fast');
            })

```
AWS Lambda(Python)の環境変数で改行を入れる

AWS Lambda(Python)の環境変数の値に改行を入れたい場合、
環境変数を取り出したあとに改行の文字を改行コードに変換すれば上手くいきます。

サンプル
-
clickType_doubleという環境変数の値に\nという文字を入れます。
<img width="594" alt="スクリーンショット 2018-11-25 19.08.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/23208/e699dbe5-2b1b-e28d-e4aa-f68f673eb95d.png">
pythonのコード
\\\\nを\nに変換するようにします。
<img width="770" alt="スクリーンショット 2018-11-25 19.15.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/23208/4ee236c1-29dc-af01-7ba3-cd77eca4b087.png">
結果
（Twitterにつぶやくというサンプルですが・・・）
<img width="296" alt="スクリーンショット 2018-11-25 19.09.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/23208/9069ef5f-b888-4fcc-732e-33b5eebf43b6.png">
意外とハマったので備忘録として残しておきます。
React NativeでGoogle Pay

React NativeでGoogle Payのサンプルアプリを作り、[GitHubに公開](https://github.com/nichiyoshi/react-native-googlepay-demo)しました。
Google Payをネイティブコード書いて自力で実装する方のご参考になればと思います。

※ テスト環境ではトークン取得まで動くことを確認しましたが、 **本番環境での実際の支払いは未確認です**。
` Requesting production access ` の過程が面倒だったので。。(今後検証したら更新します。)

## 背景
ReactNative(Android側)でGoogle Payを実装したかったが、 [react-native-payments](https://github.com/naoufal/react-native-payments)はAndroid Payにしか対応していないようですし、今後もしばらく対応はなさそうなので、ライブラリは使わず自分で実装してみました。
(他に良いライブラリあったのかも知れませんが、見つけられませんでした。。)

ソースは[GitHubでご確認](https://github.com/nichiyoshi/react-native-googlepay-demo)いただけます。

![demo_.gif](https://qiita-image-store.s3.amazonaws.com/0/214755/d783936b-527f-bf38-4b71-764a5f7b8e34.gif)

## 前提

支払いはゲートウェイを使って行い、Google Payからは**トークンだけ取得**することが前提です。

## 機能
ライブラリとして公開する予定はないので、機能は以下の２つだけです。
### 1. Google Payが使えるか確認する
画面内にある2つのボタンのうち、上側の青いボタンをタップすると、Google Payが使えるかどうかを判定できます。使える場合は、下のGoogle Payボタンが活性化されます。
### 2. GooglePayのペイメントシートを出してトークンを受け取る
実際の支払いはゲートウェイを使う想定なので、トークンを受け取るところまで実装しました。
無事にトークンを受け取れれば、Google Payボタンの下にトークンがTextで表示されるはずです。

##設定可能なプロパティ

Google Payの[ガイダンス](https://developers.google.com/pay/api/android/guides/tutorial)をみると自分で設定する項目が結構ありますが、`App.js` で設定できるのは以下のみです。それ以外はネイティブコードにベタ書きしています。

Google Payのボタンは、黒と白、さらに枠線有る無しがありますが、今回は`白で枠あり`を使っています。(xml自体は全パターンプロジェクトに含まれています)

なお、テスト環境であれば、各プロパティは現状ママで検証できるはずです。

- cardPaymentMethodMap.gateway.name: ゲートウェイの名前 (GMOなら`gmopg`など)
- cardPaymentMethodMap.gateway.merchantId: ゲートウェイのショップIDなど
- cardPaymentMethodMap.cardNetworks: 使うカード (例：['AMEX', 'JCB', 'MASTERCARD', 'VISA'])
- transaction.totalPrice: 合計金額
- transaction.totalPriceStatus: 合計金額のステータス
- transaction.currencyCode: 通貨
- merchantName: ゲートウェイ業者の名前(ペイメントシートに表記されることがあるらしい)
- テスト環境か本番環境か：(ENVIRONMENT_TEST か ENVIRONMENT_PRODUCTION)

```javascript
const request = {
  cardPaymentMethodMap: {
    gateway: {
      name: 'example',
      merchantId: 'exampleMerchantId'
    },
    cardNetworks
  },
  transaction: {
    // this is just sample so price is fixed.
    totalPrice: '200',
    totalPriceStatus: 'FINAL',
    currencyCode: 'JPY'
  },
  merchantName: 'Example Merchant'
}

・・・

    const token = await GooglePayModule.requestPayment(
      // You can change environment here
      // GooglePayModule.ENVIRONMENT_TEST is for testing
      // GooglePayModule.ENVIRONMENT_PRODUCTION is for product
      GooglePayModule.ENVIRONMENT_TEST,
      request
    ).catch(error => this.setState({ text: `error: ${error}` }))
```

### 参考サイト
- [Google Pay APIの公式ガイダンス](https://developers.google.com/pay/api/android/guides/setup)
- [react-native-payments](https://github.com/naoufal/react-native-payments)
- [React Nativeの公式ガイダンス(Native UI Components)](Native UI Components)
- [React Nativeの公式ガイダンス(Native Modules)](https://facebook.github.io/react-native/docs/native-modules-android)
非同期の流れ　自動更新

# 自動更新


スタート

```javascript

setInterval(update, 2000) 

ここでリクエストを流す！！
controller の指定！！

 $.ajax({
      url: location.href,
      dataType: 'json',
　     type: 'GET',
     data: { message_id: message_id },
 })

```

```slim

1. コントローラー起動
2. format.jsonで返す

 def index
    @message = Message.new
    
    @messages = @group.messages.includes(:user)
    respond_to do |format|
      format.html
      format.json { @new_messages = @messages.where('id > ?', params[:message_id]) }

    end

  end
```

```slim

変換

if @new_messages.present?
  json.messages @new_messages.each do |message|
  json.content       message.content
  json.image         message.image.url
  json.id            message.id
  json.name          message.user.name
  json.created_at  message.created_at
  end
end

```

```javascript

1. doneで受ける
2. appendする

  .done(function(data) {
                data.forEach(function(message) {
                    $('.main-message-container').append(buildHTML(message));
                });
            })


data.forEach(function(message) {
                    $('.main-message-container').append(buildHTML(message));
                });

```
CODE THANKS FESTIVAL 2018

- [CODE THANKS FESTIVAL 2018](https://beta.atcoder.jp/contests/code-thanks-festival-2018-open)
- ADの2完。僕が弱いんじゃ無くてみんなが強い



### Q. 「-1回」という回数は存在するでしょうか？

### A. 存在しません

- 非負判定は正しく行いましょう



# B問題「[Colored Balls](https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/tasks/code_thanks_festival_2018_b)」

## 考察

### コンテスト中の考察

- ループでは解けなさそう。
- 「解がどんな式で表されるかを意識する」と解けそうだと思った。
- なので式を2つ立てて連立方程式を解いた。
- それを元にコードを書いたけどWA（原因は非負判定をしなかったから）



### 理想の考察

- **非負判定を忘れない**

![c.jpg](https://qiita-image-store.s3.amazonaws.com/0/218584/8e884ebf-55d3-c58b-aec1-1fa4aa688ea7.jpeg)



## 要点

### 解が条件を満たすか判定する

- 式変形で解を求めるやつは、解が条件を満たすかを判定する必要がある
- 判定項目はだいたい以下のような感じだと思う（他にもあるかも）

#### 判定項目

- 値の範囲
- 割り切れるか



## [コード](https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/submissions/3667396)

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

int X, Y;

signed main() {
   cin >> X >> Y;

   if (((3*X - Y) % 8 == 0) && (3*Y - X) % 8 == 0) {
      int a = (3*X - Y) / 8;
      int b = (3*Y - X) / 8;
      if (a >= 0 && b >= 0) { // 非負判定
         puts("Yes");
      } else{
         puts("No");
      }
   } else {
      puts("No");
   }

   return 0;
}
```



## 感想

- 書いたコードに非負判定加えたら解けた。すげー悔しい。
- 誓います。値の範囲の条件は絶対に忘れません



# C問題「[Pair Distance](https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/tasks/code_thanks_festival_2018_c)」

## 考察

### コンテスト中の考察

- 図を書きまくります
- なにもわかりません
- おわり



### 理想の考察

- 愚直に計算すると$O(N^2)$になって間に合わない。
- 直感的には、重なってる部分を無駄に計算してるからそれを省く感じなんだろうなーと思う。
- どういう部分が無駄に計算してるかとかよくわかんない。可視化すると良いことがある場合が多いので、図を描いてみる。
- 図を描いてみて、値が連続していた方が法則性を活用できそうだからソートして描いてみる。
- 図を描くと、「前の部分+$i\times|x[i-1] - x[i]|$」である区間までの組み合わせの総和が求まることがわかる。あとは実装するだけ。

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/218584/d5c6d223-fba1-f91c-5f44-8bd5b6d2ffa5.jpeg)




## 解法

1. 入力された配列をソーとする
2. 「前の範囲＋今の範囲」をする（$1 \leq i < N$）。前の範囲は毎回更新していく



## [コード](https://beta.atcoder.jp/contests/code-thanks-festival-2018-open/submissions/3667258)

```cpp
#include <bits/stdc++.h>
using namespace std;

#define int long long

int N;
int x[111111];

signed main() {
   // 入力
   cin >> N;
   for (int i = 0; i < N; i++) {
      cin >> x[i];
   }
   sort(x, x+N);

   int ans = 0;
   int pre = 0; // 前の部分
   for (int i = 1; i < N; i++) {
      int current = (x[i] - x[i-1]) * i;
      ans += pre + current;
      pre += current;
   }

   cout << ans << endl;

   return 0;
}
```





## 要点

### 区間に関する問題は、右端で固定して考える

- 僕は本番中、ずっと1のグラフを描いてた。これを描いても何も思いつかなかった
- でも、右端で固定した図を描くと法則性が分かる。

![b.jpg](https://qiita-image-store.s3.amazonaws.com/0/218584/39dbf7fe-caa4-775b-f3b8-279808b7eed1.jpeg)




## 参照

- 神による神解説。ありがたや～

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">気持ちを図にしました(n回目)<br>x[i]が右端となるような区間を考えると，前の答え(pre)と(x[i]-x[i-1])*iを足したものになるのでそうしました <a href="https://t.co/CpCUJLGqRF">pic.twitter.com/CpCUJLGqRF</a></p>&mdash; satanic@学会🎓 (@satanic0258) <a href="https://twitter.com/satanic0258/status/1066609866628784128?ref_src=twsrc%5Etfw">2018年11月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



## 感想

- 普通に解けなかった。
- 区間問題結構苦手だなーと思った
sklearnにおけるSVMのpredict_probaとdecision_functionについて

# この記事はどんな記事？
2値分類を解くための学習器としてSVMを使う方法が一般に考えられます．
このときに（一般的な）SVMは基本的には **分類のみ** を行います．しかし，たとえばモデルの精度をROC-AUCなどで評価したいときはなんらかの形でスコアを計算しなければなりません．
sklearnではSVMを用いてスコアを計算する方法を以下の2種類提供しています．

* decision_function
* predict_proba(predict_log_proba)

この記事ではこの２つの方法の違いを説明します．
結論だけいえば基本的に `decision_function` を使用して，0~1にスケールされたスコアが欲しい場合のみ `predict_proba` を使用するのがいいかと思われます．

# decision_function
はじめに `decision_function` について説明します．
これは特にオプションを指定することなく使用可能なメソッドで，引数で与えられたベクトル `X` の分離超平面からの符号付き距離を返します．
しかしSVMではヒンジ損失を用いて学習しているため，超平面から遠ければ遠いほど確信度があがるというのは個人的にすこし疑問に思うところもあります．

# predict_proba
つぎに `predict_proba` （ `predict_log_proba` ）についてです． 
そもそも `predict_proba` メソッドを用いるときには，コンストラクタの指定で `probability=True` を指定する必要があることに注意してください．
これはPlatt Scalingと呼ばれる手法で `decision_function` で得られる符号付き距離 $f_x$ に対して，

```math
Pr(y=1|x) \sim \frac{1}{1+exp(Af_x + B)}
```

といったように確率のようなスコアに落とし込みます．
定数の $A,B$ の決定は $y_+, y_-$ という変数変換をした上で $F$ を最大化します．

```math
y_+ = \frac{N_+ + 1}{N_+ + 2} \\
y_- = \frac{1}{N_-+2} \\
F = \sum y_ilogp_i + (1-y_i) log (1 - p_i)
```

sklearnのデフォルトでは5fold cross-validationで $A,B$ を決定するようです．当然これはコストのかかる計算で計算時間を要します．極端に小さいデータに対してはあまり意味がないとも書かれています．
さらにこのPlatt Scalingには理論的な欠点があるらしく，あまり推奨されていないようです（公式ドキュメントより）．

# 参考文献
* https://scikit-learn.org/0.18/modules/svm.html#scores-and-probabilities （公式ドキュメント）
* https://tjo.hatenablog.com/entry/2016/12/12/190000 (Platt Scalingについて)
* https://www.csie.ntu.edu.tw/~cjlin/papers/plattprob.pdf （元論文）
新しく勉強を始める際に必要な仮想環境の設定

# 1.新しく学習を始める言語やセクションについてのディレクトリを作成する
```
$ 2.mkdir ディレクトリ名
```

# 3.Railsのインストールが必要
Railsがインストールされていないと、consoleが使えないので。

```
$ gem install rails --no-document
```

# 4.Railsを用いた新しいappを作成する
```
$ rails new アプリ名
```

# 5.アプリのディレクトリに移動する
```
$ cd アプリ名
```

# 6.consoleを起動する
```
$ rails console
```
Ubuntu18.04に IntelliJ IDEA を入れてみた

#はじめに
今回、Ubuntuで開発をすることになったので
Ubuntuの方にも IntelliJ IDEA を。
先週くらいにバージョンアップされたVersion2018.3を入れました。

余談)なんとテーマが一つ増えていました！
個人的にやる気超絶アップなテーマ、かな。

IntelliJ IDEA 導入
---

https://www.jetbrains.com/idea/
ここでダウンロード。
そして展開。

```shell
$ cd 展開したディレクトリ #(idea-IU-.....)
$ ls  #展開したディレクトリの中にbinディレクトリがありますね？
$ cd bin
$ ./idea.sh
```
![Screenshot from 2018-11-23 10-56-21.png](https://qiita-image-store.s3.amazonaws.com/0/315344/2e3562e6-a6a9-660c-853b-d1c46fac293d.png)
あああ、かっこよし〜〜〜ッ！

![Screenshot from 2018-11-23 10-53-48.png](https://qiita-image-store.s3.amazonaws.com/0/315344/a250065f-9eba-85da-1fca-7db8e517c35f.png)

![Screenshot from 2018-11-23 11-07-10.png](https://qiita-image-store.s3.amazonaws.com/0/315344/2c08e33f-0694-226d-807e-2aadc3b3c770.png)![Screenshot from 2018-11-23 11-07-24.png](https://qiita-image-store.s3.amazonaws.com/0/315344/b263a623-75dd-4a13-7bbb-d451b6e1594b.png)

フォントサイズを変えようと思ってSettingsへ。。。
![Screenshot from 2018-11-23 11-15-52.png](https://qiita-image-store.s3.amazonaws.com/0/315344/70aa6931-3c3b-815c-974e-b2ac68bb16b3.png)
気分的に白だったのでテーマをIntelliJにしようと思ってポチッ！

！？！？
High contrast　だと？？？
Visual Studio Codeで愛していた、あのテーマが
IntelliJ IDEA で愛せるのか！

誠にありがとうございます。
![Screenshot from 2018-11-23 11-07-46.png](https://qiita-image-store.s3.amazonaws.com/0/315344/5dce5550-b84d-b59f-1297-7983524e6423.png)
![Screenshot from 2018-11-23 11-07-54.png](https://qiita-image-store.s3.amazonaws.com/0/315344/39bbb544-f520-de74-d7a6-e63331859971.png)
![Screenshot from 2018-11-23 11-08-08.png](https://qiita-image-store.s3.amazonaws.com/0/315344/e82f4edf-6e10-0ea3-d939-24cc746c27dd.png)

かっこよくないですか！？近未来感あって好きです。
Ubuntuにも導入したから気がつけました、ありがとう。
以上。
爆速フレームワークlight-4jをDocker for Macで検証：応答速度

# 目的

下記の結果を見て、制限されたCPU,Memoryの環境下において、本当にこんなスループットが出るか？
と思い、Docker for Macを利用し、Kubernetes環境下でどのような結果が出るかを検証してみました。
https://github.com/networknt/microservices-framework-benchmark/blob/master/README.md

今回は、同一のリソース制限を加えた状態での応答速度、スループットの相違を確認する事を目的としています。
各フレームワークにおけるCPU,Memoryのフットプリントの最適化は別途行う予定ですので今回の検証結果では考慮していません。
また、時間があれば、GKE環境でも調べてみようかと考えています。

今回この検証が再現が用意に行えるようにするため、コンテナ化した際のDockerfile、及びKubernetesのマニフェストファイルは全てGitHubリポジトリに格納しています。

# 事前条件

## 環境
- Mac Book Pro (OS: High Sierra 10.13.6)
- CPU:Intel Core i7 2.5GHz
- Memory:16GB
- Docker for Mac 18.06.1-ce
  - Kubernetes v1.10.3
  - CPU:3 core
  - Memory: 6GiB
  - Swap: 512MiB ※無効化したかったけど、できなかった。

## 検証方法

負荷を与えるコンテナ `wrk` から対象となるサービスに対して負荷を与えます。
負荷は全て service経由で与える。serviceにて実際に負荷を与えるpodを切り替えます。
負荷を与えるツールは、`wrk`を利用し、下記のように実施します

```console:wrk
$ wrk -t4 -c64 -d60s http://microservice.default.svc.cluster.local:30000/　 --latency
```

ウォームアップ部分のオーバーヘッドは無視するため、上記のコマンドを2回実行し、2回目の測定結果を有効な結果として扱っています。

また、測定対象のコンテナは、下記のresourceを与えた状態で、podを1つ起動した状態で測定します。

```yaml:resource
        resources:
          requests:
            cpu: 200m
            memory: 400Mi
          limits:
            cpu: 200m
            memory: 400Mi
```

また、コンテナ化した際のDockerfile、及びKubernetesのマニフェストファイルは、全て
https://github.com/h-r-k-matsumoto/microservices-framework-benchmark
のリポジトリに保管しています。
Javaアプリケーションに関しては、 [jib](https://github.com/GoogleContainerTools/jib)を利用し、コンテナ化しています。
そして、jdk10をベースにしています。これは下記のようにスレッド数などの最適化がjdk8では行われないためです。
https://qiita.com/h-r-k-matsumoto/items/17349e1154afd610c2e5

## 検証対象

個人的に気になった下記の6つを対象としています。

- go-Http
- iris
- spring-boot2-tomcat
- spring-boot2-undertow
- light4j
- helidon-se

# 検証結果

|フレームワーク|スループット(req/min)|平均(ms)|90%LINE（ms） |99%LINE（ms） |
|:---------|--------:|-------:|---------:|---------:|
|light-4j  |295,125|29.35ms|72.17ms|99.01ms|
|go-http   |163,557|48.11ms|119.78ms|304.28ms|
|iris      |143,173|66.62ms|174.93ms|571.83ms|
|spring-boot2-undertow|107,540|46.04ms|94.61ms|196.11ms|
|spring-boot2-tomcat  |38,068|117.01ms|290.70ms|492.55ms|
|helidon-se           |30,742|160.51ms|299.11ms|969.99ms|

※平均、90%LINE,99%LINEは応答速度です。

# 考察

**light-4jは確かに爆速だった。**
ただ、本家のサイトほどの速度差は出ませんでした。

実運用を考えると、JSONやgRPCでのAPIを考慮する必要があります。
この部分の検証も考慮しておく必要があります。

swap系も無効にするなどがDocker for Macで行えなかった事から、GKE環境でも検証を進めて見たいと思います。

light-4jにフレームワーク変更するのは色々難しいけど、せめて spring-boot2-undertowに変更したい・・・。

# 補足
実行方法は、
https://github.com/h-r-k-matsumoto/microservices-framework-benchmark/blob/fix/master/k8s_reproduce_benchmark/DockerForMac.md
を確認してください。


後、light-4j的にはkubernetesはパフォーマンス落ちるからやめろ的な感じなのかな。
https://gitter.im/networknt/light-4j?at=5bf5948a958fc53895c9dbe5

# 参考

- https://github.com/h-r-k-matsumoto/microservices-framework-benchmark
- https://github.com/wg/wrk
Creative Commons を活用しよう

機械学習の分野で、学習や評価用の画像を集めようとすると気苦労がある。
データの利用上の懸念事項を減らすためには、
自由に利用して良いことが明示的に示されているデータ・セットを使うことがのぞましくなってきている。


- [クリエイティブ・コモンズが画像検索サービスを公開 ―― 930万枚以上、商用可・改変可など検索オプションも](https://www.danshihack.com/2017/02/12/junp/cc-search.html)

- [素材探しに便利！ クリエイティブコモンズ画像を入手できる5つのサイト](https://www.lifehacker.jp/2013/08/130809creative_commons.html)


- https://ccphotosearch.com/
- [クリエイティブ・コモンズが公式画像検索サービス「CC Search」のベータ版をリリース](https://techable.jp/archives/53366)


- [CCライセンスが付いた作品が探せるサイト](https://junichi-manga.com/creative-commons/)
- [Pixabayは著作権のない画像や動画を共有する、活気のあるクリエイティブコミュニティです。](https://pixabay.com/ja/service/faq/)

ただ、データベースの構築にこれだけ努力がされていることを自覚しよう。
[VGGFace2](http://www.robots.ox.ac.uk/~vgg/data/vgg_face2/)

画像認識の分野では、どれだけ有効なデータセットが構築されているかが
勝負のひとつであることを忘れないで欲しい。
駆け出しエンジニアリングマネージャーの苦しみ

# 駆け出しエンジニアリングマネージャーの苦しみ

はじめましてkaibaと申します。
小さめのスタートアップで働いてみたくなり、2018/4に小さな不動産ベンチャーに転職しました。
**「おいどんに管理職は無理でごわす！　技術で食っていくぞ！」** と長らく思っていたのですが、
気づいたらエンジニアリングマネージャーをやるようになりました。

新米エンジニアリングマネージャーが、当然一筋縄では行かずもがき苦しみながら進んでいる、という話をします。
(なので、あまり学びはないかもしれません…)

## 自己紹介

- 技術も好きだけど、ものづくりのほうが好き！　土日もプログラムを書きます！
- プログラムだけじゃなく電子工作や3DCGや絵画や料理にも興味がある
- それ故、できれば全部自分でやりたく、カバー範囲が広いが深い知識はない
- 言語や手段にはあまりこだわりはなく、最良の手段を選びたい
- より多くの人に喜んでもらいたい。無駄なものは作りたくないし、仕様の段階から一緒に最良を追い求めたい。
- 犬派で本人も犬のようなやつで、素直で愚直で裏がない。嘘をついたり、裏をかいたりするのは苦手。内緒話も陰口も苦手。
- 愚直で空気が読めず人に嫌われることはぼちぼちあるけど、人を嫌うのは稀。
- 真面目で社畜体質。
- 人が怒ったり言い争ったりすることにトラウマがあり、その場面では異常な緊張感を感じてしまう。
- 教育や勉強会も好き。

だいぶ犬っぽい感じ。
どうりで犬と相性がいいわけだ…。

## どんな仕事？　どんな人がエンジニアリングマネージャに向いてる？

僕が所属するのはまだまだ小さなスタートアップですので、手を動かしたりもしていて、正直どんな仕事なのかよくわかっていません。
超ざっくり言うと「エンジニアの組織づくり」が仕事でしょうか。

良い組織やマネージャのことを考えると、社会人1年目の時にお世話になったマネージャを思い出します。

- 温和でなんでも相談にのってくれて受け止めてくれた
- 自分が一番つらいのに客先からメンバを守ってくれた
- 新人の僕に仕事を任せてくれた
- そして生まれた糞コードをきれいに作り直して見せてくれた
- 未経験の技術でも挑戦させてくれた
- 技術好きで最新技術にも詳しい
- 時には論理的に叱る。いきなり責めない。
- メンバからの信頼を得ている

本当に感謝しかありません。きっとこんな人がマネージャに向いているのでしょう。
僕は犬のようなやつなので、機微に対する心遣いが苦手で、こうはなれそうにありません。
僕はマネジメントを早々に諦め、技術だけで食っていくつもりでいました。

## マネジメントはスキルである

受託ではなく、自社のサービスをやってみたくなり、上記の会社を離れ、上場間近のスタートアップにジョインしました。
スタートアップは僕にはすごくマッチしました。
エンジニアも仕様検討に混ざることができ、最善を選択するのに尽力できるのが最高に楽しい！
技術的にも強いメンバーが多くて、僕は生き生きと仕事を楽しみました。

仕事が手に馴染んで来たあと、子会社に出向し開発リーダー職を勧められました。
性格的に向いていないと思っていたので、乗り気ではなかったのですが、
「マネジメントはスキルであり、性格的なものが全てではないからやってみては？」と。
「スキル」と言われると技術屋には滾るものがあります。
10冊もの本を渡されつつ、挑戦することにしました。

全部は読めなかったのですが、一番強く記憶に残った本は[「人を動かす」](https://www.amazon.co.jp/%E4%BA%BA%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99-%E6%96%B0%E8%A3%85%E7%89%88-%E3%83%87%E3%83%BC%E3%83%AB-%E3%82%AB%E3%83%BC%E3%83%8D%E3%82%AE%E3%83%BC/dp/4422100513)です。
この本は仰々しいタイトルですがわかりやすいタイトルにすると「人に興味を持って、人と仲良くして、仕事を円滑に進めよう」です。
言い争いが嫌いな僕にはすごくフィットし、星さんからこのまま定価で買い取らせてくれ！と言ったら、文庫版があるからあげるよ、とそのままいただきました。
今後も僕のバイブルになるでしょう。
最良には程遠い結果となりましたが、まずまずの手応えが得られました。

## どんな苦しみがあり、どうしているか

今はより小さなスタートアップでエンジニアリングマネージャをしております。

### 人と自分は違う

当たり前ですが、人と自分は違うものです。
特にエンジニアは特徴的な方も多いです。
時にはイラついてしまうこともありましたが、人を動かすにあるとおり、
人に興味を持ち、何を大切に考えており、何がしたいのかを理解しようと努めています。

### プログラムかけない & 全部自分でやりたがる

これはマネージャ職の問題というよりは個人的な問題かもしれません。
小さなスタートアップですから、手も動かします。
しかし、思ったより進まず、成果を出していない気持ちが生まれ、罪悪感が生まれてしまいました。
自分の全部自分でやりたがる性格もあいまって、ついつい仕事を抱えてしまい、単一障害点になってしまいました。
今は以下を心がけています。

- トラブル対応時は協力を仰ぐ
- 興味を持ってやってくれそうな人に振る
- エンジニアリングに集中できるようにするための作業をやらせてもらう
- 予め手を動かす系の仕事を抱えすぎない

### 会社やプロダクトと喧嘩しない

だいたいどこに行っても悪寒のするようなクソ設計、クソコードに出会うものです。
罵詈雑言をぶちまけたくなりますが、モチベーションが下がるだけで何も生みません。
**「限られたリソースで当時できることをやったのだ。僕たちが少しづつ良くしていくしかない」**
ということを共有するのを心がけています。

### 会社に合う人を採用する

採用もエンジニアリングマネージャの重要な仕事です。
有名な企業であればさておき、無名のスタートアップでは人事にまさせっきりではエンジニアの採用は難しくなってきました。
スーパーハッカーが雇えたとしても、会社に合う人を採用できないとお互い不幸になります。
技術力も重要ですが、会社に合う人を採用しています。

## 終わりに

この役職が向いているのかどうなのか、まだ手探りな状態でして、
適任者が来たら席を譲る心構えもありますが、
俺たちの戦いはまだ始まったばかりだ！
kaiba先生の次回作にご期待下さい！
アセンブリ言語でのゲームボーイ開発(背景表示)

前回は、画面を使用しなかったのですが、これでは全く面白くないので、絵を出してみました。GBは背景画面の上にスプライトと呼ばれる動く画像を重ねて表示する(多分。まだちゃんと調べてない)。今回は、背景画面の方を試してみました。

ソースコードは[こちら](https://github.com/toh4649/gb-asm/tree/master/bg)。

#GBの画面表示の仕組み
##タイル
* ゲームボーイの背景画像は、タイルと呼ばれる8X8ピクセルの画像を並べることで構成されている。
* タイルの画像は、VRAMに書き込む。(ROMから必要に応じてコピーする)

##背景画面の構成
* サイズは、32タイル×32タイルである。VRAM上では、タイルの番号が1バイトごとに書き込まれている。
* 背景画面は、実際の画面より大きい。SCRXレジスタとSCRYレジスタに、「背景画面のどこを、画面表示の起点(左上)にするか」を指定する。なお、このレジスタを変化させることで、スクロールが実現できる。

#初期化の流れ

パレットとスクロールレジスタを設定する。

```ini:bg.asm
    ld  a, %11100100    ; パレット(パレットごとに2bitで白さを指定。MSBがパット番号0番)
    ld  [rBGP], a       ; BGPレジスタにパレットを設定

    ld  a,0             ; スクロールレジスタを設定し、画面を左上に固定
    ld  [rSCX], a       ; SCXレジスタ
    ld  [rSCY], a       ; SCYレジスタ
```

画面の描画中はVRAMへの書き込みが行えないので、一旦画面の表示をオフにする。

```ini:bg.asm
.waitVBlank:                ; 画面描画を止めるため、まず現在の描画が終るのを待つ
    ld  a, [rLY]
    cp  145                 ; 画面描画が終った=描画位置がY=145であるか?
    jr  nz, .waitVBlank     ; 違ったらまだ待つ(jrは相対ジャンプで、命令長が短くなる)

    ld  a, [rLCDC]
    res 7, a             
    ld  [rLCDC], a          ; VRAMに書き込むため、画面描画を止める
```


タイルをVRAMにロードする。

```ini:bg.asm
    ld  hl, Tile            ; vramcpy コピー元 (ハードコードしたタイルの画像のアドレス)
    ld  bc, _VRAM           ; vramcpy コピー先 ($8000)
    ld  de, TileEnd-Tile    ; vramcpy コピー長さ
    call  vramcpy           ; VRAMに値をコピーするするサブルーチン
```

VRAMにタイル番号を設定する。

```ini:bg.asm
    ld  b, $0               ; vramset 設定値
    ld  hl, _SCRN0          ; vramset コピー先
    ld  de, 32*32           ; vramset コピー長さ
    call  vramset           ; サブルーチン。画面全域にタイル番号0番を設定
```

画面の描画を再開する。GBには背景画面が2つあり、今回は「BG8000」を使用しているため、LCDCレジスタに「LCDCF_BG8000」をセットしている。また、タイルも2セットVRAMに持つことができ、今回は「BG9800」を使用している。スプライトを使用しないため、「LCDCF_OBJOFF」で表示をオフにしている。

```ini:bg.asm
    ld  a, LCDCF_ON|LCDCF_BG8000|LCDCF_BG9800|LCDCF_BGON|LCDCF_OBJ16|LCDCF_OBJOFF
    ld  [rLCDC], a          ; 画面ON
```

メインループ開始

```ini:bg.asm
mainloop:
    halt
    nop
    jr mainloop
```

#スクリーンショット
![bg_test.png](https://qiita-image-store.s3.amazonaws.com/0/57535/8b5465d5-b9b7-fa5c-d91a-36e7c6674309.png)


#タイルのフォーマット

タイルのデータフォーマットは、なかなかにトリッキーである。今回使ったこのタイル（パレット番号0が白、1が明るい灰、2が暗い灰、3が黒）の場合、
![tile.png](https://qiita-image-store.s3.amazonaws.com/0/57535/d0941475-d5c0-784e-95a2-c2d3f9140833.png)

下のような形でピクセルごとにパレットの番号を指定する。

```ini:bg.asm
;タイル用画像
;2バイトで1ラインを表し、各バイトの各ビットが1ピクセルに対応する。
;偶数バイトが、パレット番号の下位ビットを表し、奇数バイトが上位ビットを表す
Tile:  
    ;1行目8ピクセルのパレット番号は, 0,3,3,3, 3,3,3,3
    db  %01111111   ;1行目, パレット番号下位ビット 
    db  %01111111   ;1行目, パレット番号上位ビット

    ;2行目8ピクセルのパレット番号は, 2,2,2,2, 2,2,2,2
    db  %00000000   ;2行目, パレット番号下位ビット
    db  %11111111   ;2行目, パレット番号上位ビット

    db  %11111111   ;3行目
    db  %00000000
    db  %00000000   ;4
    db  %00000000
    db  %11111111   ;5
    db  %00000000
    db  %00000000   ;6
    db  %11111111   
    db  %11111111   ;7
    db  %11111111   
    db  %00000000   ;8
    db  %00000000
TileEnd:
```

手で書くのはとても辛いので、下のようなツールがある。アセンブラのソースにそのままインクルードできるコードを出力してくれる優れものだ。
http://www.devrs.com/gb/hmgd/gbtd.html
アセンブリ言語でのゲームボーイ開発(開発環境)

日本語ではC言語による開発の記事が多く、アセンブラによるものはあまりないので、まとめました。なお、私はアセンブリ言語の超初心者であり、記事中のコードは全然上手ではないと思われる。

#開発環境

##ビルド環境
rgbdsが主流っぽい？
https://github.com/rednex/rgbds/releases

* rgbasmがアセンブラ
* rgblinkがリンカ
* rgbfixは、チェックサムの計算などをしてくれるツール

##実行環境
###エミュレータ
エミュレータは、[bgb](http://bgb.bircd.org/)が、再現性が高く良いらしい。また、デバッグ用の機能も充実している。

###実機
実機を持っていないから試していないが、GB USB SMART CARDというのがある模様。チップチューン界隈の人たちが結構つかっている関係か、手に入りやすそうな感じである。

#コード
RAM上の値を1づつ加算する無限ループ。
https://github.com/toh4649/gb-asm/blob/master/helloworld/blank.z80

#ビルド
```sh
rgbasm -oblank.obj blank.z80
rgblink -oblank.gb blank.obj
rgbfix -p0 -v blank.gb
```
.gbファイルが、実行ファイル。

#実行
bgbで, blank.gbファイルを開き、右クリック→other→debuggerでデバッガを開くと、RAMの0xC000番地が激しく変化していることがわかる。
※デバッガがフォーカスされていると実行が止まるので、ゲーム画面にフォーカスをあてる。

![dbg.png](https://qiita-image-store.s3.amazonaws.com/0/57535/3cc0e8e5-00dd-befb-d84b-e11e0027c60d.png)

#参考資料
[gbspec.txt](http://www.devrs.com/gb/files/gbspec.txt)
RubyMine(IntelliJ IDEA)の設定を端末間で共有する方法

自分はRubyのエディタにはRubyMineを利用しています。

RubyMine(IntelliJ IDEA)では[Settings Repository](https://github.com/JetBrains/intellij-community/tree/master/plugins/settings-repository)というプラグインを利用することで端末間でエディタの設定を共有することができます。

Settings Repositoryを利用することで、**パソコンを買い換えた時などにエディタの設定を一瞬でインポートできる**ので非常に便利です。

なお、今回の記事で使用するRubyMineのVersionは2018.3となっております。

## Settings Repositoryの設定画面へのアクセス
RubyMineを開き、『Configure → Settings Repository』とクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/3d65a82c-6307-5015-ba5a-a83e4daf14df.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/fcc6088b-9cdd-c293-4042-c448f4e6bc61.png)

## 設定をエクスポートする方法
Settings Repositoryでは設定ファイルが保存されているパスを共有することで端末間で同じ環境を利用することができます。
パスにはローカルのパスだけでなく、GitHubのリポジトリも共有可能です。
GitHubのほうが管理が楽なのでおすすめです。

ここでは、GitHubのリポジトリに設定をエクスポートする方法の説明をします。

まずは、Settings Repository用のリポジトリを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/a776934f-e568-4bed-4420-0472adeeb26b.png)

次に先ほど作成したリポジトリのURLを貼り付け、『Overwrite Remote』を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/17afdb0c-6167-c740-9f54-4fe46c573b97.png)

すると、アクセストークンが求められます。GitHubのアクセストークの作成方法は[こちら](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/)に書いてあります。
手順が完了すればアクセストークンが発行されるので、それを貼り付けすればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/6740532e-b6dd-540a-42b7-46c4c35267aa.png)



## 設定をインポートする方法
設定をインポートする場合はSettings Repository用のリポジトリを貼り付け、『Overwite Local』を選択すればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/6a663521-f4b0-fef8-6874-5fe98eb3412e.png)
非同期処理を挟んで CPU 使用率を抑える JS ライブラリを作った

## tl;dr

- [coolit.js][GitHub] を作った
- 非同期を挟んで CPU 使用率を抑える npm パッケージ
- 元ネタは [chillout.js][]
- 戦略を選んで Iterator を AsyncIterator に変換する
- 小さなライブラリ (非圧縮状態で 3.3 KB の 1 ファイルのみ)

## coolit.js の紹介

重たい処理を JavaScript で書くときに同期的にメインスレッドで動かすと UI が固まってしまうため、適宜 *休憩* をはさみつつ実行させることで UI が固まってしまうことを防ぐのをサポートする。

```js
(async () => {
  let sum = 0;
  for await (const i of coolit([1, 2, 3, 4, 5])) {
    // heavy task
    sum += i;
  }
  console.assert(sum === 15);
})();
```

```js
(async () => {
  let sum = 0;
  function* heavyTask() {
    for (const i of [1, 2, 3, 4, 5]) {
      yield;
      // heavy task
      sum += i;
    }
  }
  for await (const _ of coolit(heavyTask())) {
  }
  console.assert(sum === 15);
})();
```

coolit.js を使うとこんな感じのコードになる。
自分で試してみたい方は以下で。

<p data-height="265" data-theme-id="0" data-slug-hash="rQvEvd" data-default-tab="js,result" data-user="koharakazuya" data-pen-title="coolit.js demo" class="codepen">See the Pen <a href="https://codepen.io/koharakazuya/pen/rQvEvd/">coolit.js demo</a> by KoharaKazuya (<a href="https://codepen.io/koharakazuya">@koharakazuya</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

詳細は [GitHub][] を参照。

ただ、重い処理の対策は素直に Worker (別スレッド) に逃がすことを始めに検討するのが良い。

## 作った動機と工夫点

[chillout.js][] を GitHub で見かけて、そういえば `requestAnimationFrame` だったり `setImmediate` を使ってループを書くことはたまにあるけどライブラリ使ったことないな、と気付いた。
chillout の API を眺めてると自分なら Async Iterators 使うなーと思ったので作った。

ES2018 の `for-await-of` 構文で扱えるようにした後に、Edge などまだ動かない環境もあるのでそれを必須にするには時期尚早だろうと思い直して無くても動くように修正した。もちろん `for-await-of` が使える環境なら使って書ける。
`Symbol.asyncIterator` が無い環境では `AsyncIterableIterator` ではなく単に `Iterator` となるようにした。

ES2017 Async Functions の環境を前提としているが、これは 2018/11 現在のモダンブラウザなら使える。
IE 11 などは……トランスパイルとポリフィルがあれば多分動く。試してないけど。

また、処理進行の戦略は選べたほうがいいだろうと思い、オプションで選べるようにしている。
`requestAnimationFrame` や時間指定などを選べるようにした。デフォルトは `requestIdleCallback`。

今回初めて `rollup` を使った。
これにより npm 配布を UMD 形式と ESM (mjs) 形式を両立させた。今まであまり理解していなかったが、ようやく学べた。

---

こんな小さな量でも TypeScript で書くとサポートを受けられるし、実際助かったシーンがあったんだけど、TypeScript 使うだけでもすぐにビルドやテストなどのツールチェーン周りが複雑になっていくからしんどい。EcmaScript だけだったらすごく簡単に終わるので。

[GitHub]: https://github.com/KoharaKazuya/coolit
[npm]: https://www.npmjs.com/package/coolit
[chillout.js]: https://github.com/polygonplanet/chillout
wabカメラからフレームを取得して表示するプログラム（python）

#概要
PCに接続したwebカメラからフレームを抜いて表示するコードのメモ。余分なものは落として一番シンプルにしたつもり。

#実装
とりあえず記述するために適当な名前のファイルを作る。vimは好きではないので、openコマンドで開いて記述していく。

```
$touch web_camera_code.py
$open web_camera_code.py
```
中身は以下のように記述

```
import cv2

cap=cv2.VideoCapture(0)#１台しか接続されていない時は引数0

while(True):
    ret,frame=cap.read()#1フレーム取得

    cv2.imshow('Raw Frame',frame)#画像の表示

    k=cv2.waitKey(1)#キー入力を1秒待つ

    if k==27:#escを押すと閉じる
        break

cap.release()
cv2.destroyAllWindows()
```

もしimport cv2がないと言われたら

```
sudo pip3 install opencv-python
```

とかでインストール。
pushgatewayのgrouping keyとlabelは別物

2回ハマったのでメモる

https://github.com/prometheus/pushgateway

pushgatewayにメトリクスを作る時

```
$ echo 'testmetric 1' | curl --data-binary @- localhost:9091/metrics/job/testjob
```

とすると

```
testmetric{instance="",job="testjob"} 1
```

このようなメトリクスが得られ、
`labelkey="labelvalue"`のlabelを付けたい時は

```
$ echo 'testmetric 1' | curl --data-binary @- localhost:9091/metrics/job/testjob/labelkey/labelvalue
```

とするか、

```
$ echo 'testmetric{labelkey="labelvalue"} 1' | curl --data-binary @- localhost:9091/metrics/job/testjob
```

とすれば

```
testmetric{instance="",job="testjob",labelkey="labelvalue"} 1
```

この形のメトリクスが得られます
そしてこの両者の違いは

前者は`job=testjob,labelkey=labelvalue`でメトリクスがグルーピングされており、
後者は`job=testjob`でグルーピングされている状態になります

この違いはどういう違いかというと、

```
$ echo 'testmetric 1' | curl --data-binary @- localhost:9091/metrics/job/testjob/labelkey/labelvalue1
$ echo 'testmetric 1' | curl --data-binary @- localhost:9091/metrics/job/testjob/labelkey/labelvalue2
```

とした時に、`labelkey=labelvalue1`と`labelkey=labelvalue2`は別のグループなので両方残ります

```
$ echo 'testmetric{labelkey="labelvalue1"} 1' | curl --data-binary @- localhost:9091/metrics/job/testjob
$ echo 'testmetric{labelkey="labelvalue2"} 1' | curl --data-binary @- localhost:9091/metrics/job/testjob
```

とすると、グループは両方とも`job=testjob`なので、labelvalue1が上書きされてlabelvalue2のメトリクスだけが残ります

また、メトリクスを削除する場合、

```
$ curl -XDELETE localhost:9091/metrics/job/testjob
```

このコマンドで削除されるのは`job=testjob`のグループのメトリクスだけで、`job=testjob,labelkey=labelvalue`のメトリクスは削除されません。
`job=testjob,labelkey=labelvalue`のメトリクスを削除したいなら

```
$ curl -XDELETE localhost:9091/metrics/job/testjob/labelkey/labelvalue
```

とする必要があります。
値が変わる時に上書きしたいか別のメトリクスにしたいかで使い分けることができるんですね。

3度目はないぞ
momentでtimezoneを指定するときはmoment-timezoneを使う

# moment.jsでtimezoneを指定する方法
moment.jsでtimezoneを指定する場合は`moment.tz.setDefault`を使うのですが、momentモジュールを使うとtzがundefinedになっています。

```js
const moment = require('moment');

console.log(moment.tz);
//-> undefined
```

tzを読み込めるように、moment-timezoneも読み込む必要があります。

```js
const moment = require('moment');
require('moment-timezone');

console.log(moment.tz);
//-> objectがズラズラと表示される

// これでタイムゾーンを設定できる
moment.tz.setDefault('Asia/Tokyo');
```

これでもいいのですが、実はいきなりmoment-timezoneを読んでも使うことができます。

```js
// momentではなくmoment-timezoneを読む
const moment = require('moment-timezone');

console.log(moment.tz);
//-> objectがズラズラと表示される

// これでタイムゾーンを設定できる
moment.tz.setDefault('Asia/Tokyo');
```

# まとめ

以下の記事にちゃんとやり方は載っていたのですが変数名がmomentだったのでなかなか気づけませんでした・・・。

[moment.jsのtimezoneを１行で日本に設定](https://qiita.com/akifo/items/af5203510c33247028a8)

意外とこの辺の記事が少なかったので誰かのお役に立てれば幸いです。
Ubuntu18.04のHHKB(US)設定

お手柔らかにお願いします。

#経緯
今回、学内でグループ開発を行うのですが
やはりLinuxでの開発がしやすくWindowsで
開発しなければならないという制約もないため
Ubuntuを利用することにしました。

デスクトップにUbuntuを導入し、ネットサーフィンしよう！と思ったのですが
日本語切り替えができない。。。

恥ずかしながらUbuntu18.04のキーボード入力関連の設定で
ハマったので、記録しておこうと思います。

---
いつもの

```shell
$ sudo apt update && sudo apt upgrade -y
```

Ubuntu18.04をインストールしたときに設定した
キーボード設定の確認

```shell
$ cat /etc/default/keyboard

# KEYBOARD CONFIGURATION FILE

# Console the keyboard(5) manual page.

XKBMODEL="hhk"
XKBLAYOUT="us"
XKBVARIANT=""
XKBOPTIONS=""

BACKSPACE="guess"
```

mozc確認

```shell
$ cat /usr/share/ibus/component/mozc.xml

<component>
  <version>2.20.2673.102+dfsg-2</version>
  <name>com.google.IBus.Mozc</name>
  <license>New BSD</license>
  <exec>/usr/lib/ibus-mozc/ibus-engine-mozc --ibus</exec>
  <textdomain>ibus-mozc</textdomain>
  <author>Google Inc.</author>
  <homepage>https://github.com/google/mozc</homepage>
  <description>Mozc Component</description>
<engines>
<engine>
  <description>Mozc (Japanese Input Method)</description>
  <language>ja</language>
  <symbol>&#x3042;</symbol>
  <rank>80</rank>
  <icon_prop_key>InputMode</icon_prop_key>
  <icon>/usr/share/ibus-mozc/product_icon.png</icon>
  <setup>/usr/lib/mozc/mozc_tool --mode=config_dialog</setup>
  <layout>default</layout>
  <name>mozc-jp</name>
  <longname>Mozc</longname>
</engine>
</engines>
</component>

```

そして、英語か日本語に切り替えるスイッチを設定
![Screenshot from 2018-11-23 10-41-50.png](https://qiita-image-store.s3.amazonaws.com/0/315344/1e6f56ed-ec78-2c2f-cba0-cf114d47a1c4.png)

[設定>デバイス>タイピング]の次の入力ソースへ切り替えるにて、
自分が使っているUS配列のWindowsデバイスと同じように片手で切り替えたいので 「 (右)Alt + ` 」にしました。

![Screenshot from 2018-11-23 10-43-56.png](https://qiita-image-store.s3.amazonaws.com/0/315344/67ba91cf-4873-f552-8f87-7b493eaeaefc.png)
![Screenshot from 2018-11-23 10-44-38.png](https://qiita-image-store.s3.amazonaws.com/0/315344/770e334e-b535-b530-8cef-33afb74c9517.png)

しかし、これでは上手くいきませんでした。現在のウィンドウを切り替える操作となってしまいます。
どうしようか悩んでいました（白目）
##ショートカットキーを変える
「 (右)Alt + \ 」
![Screenshot from 2018-11-25 10-06-03.png](https://qiita-image-store.s3.amazonaws.com/0/315344/ff3e7371-5b65-c829-a1c2-db42ba7bdc61.png)

これで上手くいきました。

何も新しくインストールしたり、設定を変更しなくてよかったです。。。
ただ、キーの割当が不適切だったというお話でした。
たーくさん時間を費やしてしまい恥ずかしい。

今回の件から得るべき教訓は、悩まず試せ(ローカル環境前提)。


余談
---
いろいろ触っていると結果的に
![Screenshot from 2018-11-25 09-37-51.png](https://qiita-image-store.s3.amazonaws.com/0/315344/dbab760c-f8c2-84be-1559-790a86232281.png)
だったものが
![Screenshot from 2018-11-25 12-36-29.png](https://qiita-image-store.s3.amazonaws.com/0/315344/cef6fe35-f46b-be3b-aa54-687394480861.png)
こうなりました。
そこでもう一度、最初に行ったキーボード設定を確認。。。

```shell
$ cat /etc/default/keyboard

XKBLAYOUT=us
BACKSPACE=guess
```
こうなってました。でも普通にHHKB使えるので問題はないのかな？