OmniAICreator/Qiita-1.07M huggingface dataset:
(M+とか)ブラウザ, VSCodeで表示が汚くなるフォントを救え！【シェルスクで自動化編】

オープンソースの日本語ゴシック体フォント [__M+ OUTLINE FONTS__](https://mplus-fonts.osdn.jp)[^1] をWindows上のブラウザ(Firefox, Chromium)のフォントに設定すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/925dbeae-b069-69dd-f942-41634f7dd062.png)
__ガビガビになっている。__一部のフォントで発生するこのクソの原因は__フォントヒンティング__[^2]で、__ヒンティング情報をフォントファイルから消せばガビガビは消える__。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/7b2b37c5-c8de-0da0-40cb-19309fc8fcab.png)

---

これをFontforgeを使って手作業でやったのが前回。(必要なことは今話したので、読まなくてもいい)
[【Fontforge】ブラウザやElectron系ソフトで表示される文字がガビガビになってる時の解決法と、ヒンティングについて感じたこと]
(https://qiita.com/mmns/items/7d268134f5915f222599)

今回はこれを自動化する。


# 使うもの

- __bashかなんか__
    - 自分はWSLのUbuntu 18.04でやっているが、シェルスクリプトが動けば仮想マシンでもMacbookでもUserLAndでもいいと思う。たぶん
- __[ttfautohint](https://www.freetype.org/ttfautohint/)__([GitHub](https://github.com/source-foundry/ttfautohint-build))
    - ヒンティングを自動化するソフト。日本語フォントへの対応はしてなさそうだが、そんなことよりCLIからヒンティング情報の削除(dehint)ができることがディ・モールト(非常に)良い。
    - Windowsとか向けにGUIバージョンもある。
- __WOFF2__([GitHub](https://github.com/google/woff2))
    - WOFF2というのはもちろんウェブフォント向けフォーマットのことだが、Googleが同じ名前でWOFF2への変換ツールをGitHubに公開している。紛らわしい。


# シェルスクリプト

## woff2 と ttfautohint を入れる
Debian/Ubuntu, Fedora/CentOS, FreeBSD(たぶん), Homebrew にはパッケージの形でおいてあるので、おのおのパッケージマネージャーから入れるとよい。Archはttfautohintが、その他ディストロには両方ないので自力でビルドが必要。

<details>
<summary>GitHubから引いてビルドする場合の手順。</summary>
<div>




ttfautohintとwoff2を引っ張ってきて適当な場所(ここでは`$HOME`)でビルドするだけ。


```shell:install.sh
#! /bin/bash

cd ~/
git clone https://github.com/source-foundry/ttfautohint-build.git ttfautohint-b
cd ttfautohint-b
make

cd ~/
git clone --recursive https://github.com/google/woff2.git
cd woff2
make clean all
```

</div>
</details>



```
sudo apt install ttfautohint woff2
```

## dehint してみる

インストールされたら、TTFファイルのあるディレクトリでこいつを実行する。
`./unhint.sh`で実行すると、`*.ttf`に合致するファイルを全部処理する。
`./unhint.sh mplus`で実行すると、`mplus*.ttf`に合致するファイルを全部処理する。

ビルドしてる場合は`ttfautohint`, `woff2`を適切なパスに(`"$HOME/ttfautohint-build/local/bin/ttfautohint"`, `"$HOME/woff2/woff2_compress" "unhinted-${file}"`とか)置き換える。

```shell:unhint.sh
#! /bin/bash
for file in $1*.ttf
do
    ttfautohint -dF " Unhinted" "$file" "unhinted-${file}"
    woff2_compress "unhinted-${file}"
done
```


冥土の土産として解説すると、`ttfautohint`の`-d`(`--dehint`)がヒンティング削除で, `-F`(`-family-suffix`)でフォント名に` Unhinted`を追加する、という感じ。woff2は`woff2_compress`, `woff2_decompress`, `woff2_info`とコマンドが3つに別れているが、今回は圧縮なので`woff2_compress`。



# 結の果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411269/8892b803-b9bf-5515-ee5f-cbef8a23f9b7.png)
「シェルスクリプト書いてたんだから`ls`で表示しろよ」という意見は置いといて、ttfとwoffが無事出力されました。めでたしめでたし。しっかし、WOFFにしても結構デカいな…

[^1]: M+には1c, 1p, 2c, 2p(各7ウェイト)と、1m, 1mn, 2m(各5ウェイト)、合わせて43のフォントファイルが存在するが、今はそんなことはどうでもいい。
[^2]: 小さいサイズでも字形が崩れたりしないようにする技術。
ubuntu18.04にCUDA9.0をインストールする

# このドキュメントの内容

* Ubuntu 18.04にCUDA9.0をインストールする手順のメモ.

# 前提

* OS: Ubuntu 18.04
* GPU: GeForce GTX 1080 

# 手順

## nvidia-driverのインストール

```bash
$sudo apt install nvidia-driver-390
```

## CUDA9.0のインストール

* nvidiaの公式サイトからdebファイルをダウンロードします。
* 以下のurlにアクセスして環境を選んでいくとdebファイルのダウンロードリンクが表示されます。
* `https://developer.nvidia.com/cuda-90-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1604&target_type=debnetwork`
* ubuntu 18.04 向けのリンクしかないですが、代わりに ubuntu 16.04向けを選んでおけば大丈夫な模様。
* 以下のように、表示されたurlからwgetしても動作します。

```bash
$wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
```

先程のURLにインストールコマンドが書いてあるので実行する。
ただし、`sudo apt-get install cuda`するとCUDA10.1がインストールされるので、cuda-9-0を指定してインストールする。

```bash
$sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$sudo apt-get update
$sudo apt-get install cuda-toolkit-9-0
```

## 再起動して動作確認

```bash
$sudo reboot
$nvidia-smi
```

# PATHの設定

bashrcに以下を追記し, `source ~/.bashrc`.

```
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
```

# 動作確認

```
$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
```

以上.
オラクル代替引用符について

# 代替引用符（ｑ）演算子について
オラクル12cSQLでの代替引用符について書きます。

オラクルでシングルクォーテーションを文字列として扱いたい場合に代替引用符を使用するという規則があります。

```ruby:12cSQL
'I'm superboy'
```

ではエラーになります。

代替引用符を使いq[],q{},q(),q<>とした場合にqの後ろのカッコの中の文字がリテラルとして扱われます。

ここでリテラルとは、コードの中にべた書きした文字や数字をいいます。

つまり、I'm superboyを表示させたい場合には

```ruby:12cSQL
q'{I'm superboy}'
q'[I'm superboy]'
q'(I'm superboy)'
```

などの書き方ができます。
AWS、GCPアソシエイトからみたGCP 3つの利点

AWSのIaaS（EC2、RDS）を使ったWEBサイト構築案件が多い中、最近、業務都合で、AWSのソリューションアーキテクトアソシエイトと、GCPのASSOCIATE CLOUD ENGINEERを取得しました（させられた？）。

正直、社内案件では、メンバのスキルセット、AWSのエンタープライズ性などを考慮すると、まだまだAWSの利用を優先せざるをえないのですが、そんな中でも、GCPのここが凄い！というところが、試験勉強中に両サービスを比較して見えてきたので、3点ピックアップしてご紹介します。

※個人的見解である点は、ご容赦ください。

ちなみに、今回はWEBサイトをIaaSで作るエンジニアの視点に、視野を絞ってます。
BigQuery、AI周辺などは対象外にしたのであしからず。

# プライベートIPで別リージョンとつながる
例えば、東京リージョンにある仮想サーバAのプライベートIPが10.123.0.5 で、ヨーロッパにある仮想サーバBのプライベートIPが10.124.0.5 だとします。

このとき、仮想サーバAから仮想サーバBに、ping をしても届きます。低レイテンシーで。

オンプレミスのラックでネットワークを構築したことがある方は、この凄さに共感してくれるとおもいます。自分で設定したサブネットの先は、同一ラック内ではなく、遥か遠い国のどこかのマシン（仮想サーバ）っておもうとロマンがあります。

そんな昔の話は知らんねんという若い方や、ロマンチストでない方にも、
・CMSでアップされたファイルの同期を低レイテンシーで実現
・1つのロードバランサの設定で、東京とヨーロッパのインスタンスにアクセスを振り分ける
などのメリットはイメージできるかとおもいます。

※オブジェクトストレージやCDNなどが使えない場合

# ロードバランサ
WEBサイトのシステム保守を運営していると、「〇〇日にテレビ放送でピックアップされるから」「△△日から割引きセールします」といった通知をお客様から受けることがあります。
このような場合、AWSでは暖機申請を行って、ELBに準備運動をしてもらっておきます。

ただ、いきなりYahoo!ニュースに取り上げられたり、SNSでバズったりした場合は、どうでしょう？
残念ながらELBの暖気申請は間に合いません。

※ ELB自体はトラフィック量に応じて、自動でスケールしてくれます。自動スケールする時間も許されないケース（WEBサイト）の話です

一方、GCPのロードバランサは、秒間200万リクエストを準備運動なしで、捌くそうです（いつか検証してみたい）。
GmailなどGoogleが提供するサービスでも、GCPで利用するロードバランサを利用しているからとのこと。Googleさん太っ腹です。

秒間200万リクエストであれば、CDNなし（画像やCSSなどのオブジェクトリクエストがある）場合でも、私の抱えている案件では、超えることはまぁないです。

# ライブマイグレーション
IaaSで動く仮想サーバも、所詮は、物理サーバ、OS、仮想サーバを起動する仮想サーバ管理ソフトなどの上で動作しているので、それらで再起動を伴うような、フォームウェアなりの更新が発生すると影響を受けてしまいます。

ただ、GCPのライブマイグレーションという機能はえぐいです。ちょっと引きます。
GCPの仮想サーバは、ライブでマイグレートできてしまいます。

ざっくり言うと、物理サーバAの仮想サーバ管理ソフトで動いていた仮想サーバは、物理サーバBの仮想サーバ管理ソフトにあっという間に移動できるそうです。
仮想サーバの大きさなどにもよるとおもいますが、マイグレート中の停止時間は 0.1－2秒 だったと実測された方がいます。

これは驚異的なことで、2018年の「Spectre（スペクター）」と「Meltdown（メルトダウン）」といったレベルの脆弱性が、今後見つかった場合でも、Googleさんに任せておけば、無停止でパッチ適用された先の環境に移動できることになります。

# 最後に
冒頭でも書きましたが、正直、エンタープライズ向けにプラットフォーム事業を長く展開しているAWSの方が、現時点では、一日の長があるとおもいます。

ただ、お客様の要件によっては、GCPのプラットフォームが合うケースもあるかとおもい、参考までに、私が凄いとおもったGCPの特徴を紹介させていただきました。
marginとpaddingの違いについて説明します！

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしています。
現在、CSSを少し勉強し始めてつまずいたところがあったので、備忘録として書きます。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください！

#padding/marginについて
paddingとmarginの書き方について説明します。
一例を下記に示します。

```console
padding: 10px 20px;
margin: 10px 20px;
```
padding/marginともに余白の範囲を指定する必要があります。
一例の書き方は上下に10px分の余白を空け、左右に20px分の余白を空ける設定となっています。
CSSでは要素の境界線のことをborderと呼びます。
そして、borderの内側の余白をpaddingで調整し、外側の余白をmarginで設定します。
余白の値の設定方法はたくさんあるので、自分が使いやすい方法を選ぶようにしましょう。

#まとめ
今回はpaddingとmarginの違いについてご紹介しました。
これからもフロントエンドを勉強していきます！
Railsでカラムの値によって動的にmixinする

- Userモデル
    - job_id: references
- Jobモデル
    - klass: string

を考える

```ruby
class User < ApplicationRecord
  belongs_to :job
end

class Job < ApplicationRecord
  has_many :users

  def method_missing(name, *args)
    fail if klass.blank? || self.class.included_modules.include?("Modules::#{self.klass.camelize}".constantize)
    extend("Modules::#{self.klass.camelize}".constantize)
    send(name, *args) and return if respond_to?(name)
    fail
  end
end

module Modules
  module Engineer
    def bark
      p 'hoge'
    end
  end
end

engineer = Job.create(klass: 'engineer')
user = User.create(job: engineer)
user.job.bark # => hoge
```

やや冗長だけどやや安全版↓
（decoratorパターンになってしまった）

```ruby
class User < ApplicationRecord
  belongs_to :job
end

class Job < ApplicationRecord
  has_many :users

  def bark
    fail
  end

  def mixined
    klass.present? ? extend("Modules::#{self.klass.camelize}".constantize) : self
  end
end

module Modules
  module Engineer
    def bark
      p 'hoge'
    end
  end
end

engineer = Job.create(klass: 'engineer')
user = User.create(job: engineer)
user.job.mixined.bark # => hoge
```

完

というのは嘘で素直にSTIしたほうが良いのではないでしょうか。
オラクル12cSQLでのエスケープシーケンスについて

# エスケープシーケンスについて

今回オラクル12cの資格取得に向けて理解しにくいエスケープシーケンスについて記事を書きます。

例えばリテラルに**I'm strong**という記述をしようとします。

オラクルでは文字列はシングルクォーテーションで囲むという制約があるために、**'I'm stromg'**
と書くことでエラーになります。

このような場合にはシングルクォーテーションを2つ続けて書くことで**I'm strong**と表示されます。

```12c:sql
'I''m strong'
```
Power AutomateでOutlook タスク（Microsoft ToDo）を利用する際の制限事項：2019/7/14時点

# 前置き

Power Automate（旧Microsoft Flow）でOutlook タスク（Microsoft ToDo）を利用する際に、「フォルダー内のすべてのタスクの一覧表示」を使う際に特に制限になりそうな項目についてまとめました。

ただし、本内容は2019/7/14時点の内容です。今後、コネクタのアップデートなどで改善される可能性があります。

改善を確認出来たら本記事も編集予定です。

# 制限事項

Power AutomateのOutlook Taskアクション「フォルダー内のすべてのタスクの一覧表示」を使うと、タスクフォルダ内のすべてのアイテムを取得してくれます。

ただし、最大でも100件までとなります。

2019/7/14時点では、以下の条件が重なり、作成したタスクの数が完了済みを含めて100件超えた際の、スマートな解決方法がありません。

* Outlook Taskでは、完了したタスクをアイテムとして保持し続ける
* Power AutomateのOutlook Taskアクション「フォルダー内のすべてのタスクの一覧表示」では、読み込むアイテムのフィルタや並び替えが出来ない
* Power AutomateのOutlook Taskアクションには削除や移動を行えるものが無い

このため、毎日の繰り返しタスクなどがあると、あっという間に100件超えてしまい、必要なデータを読み取れなくなります。

読み込む際のフィルタが出来ず、完了済みタスクの削除や移動をPower Automateで行うことも出来ないので、現時点で唯一出来るのは、「完了タスクを手動で削除または移動する」という運用になります。

# UserVoice

Flow Ideasに、タスクの移動および削除についてはアイデアとして挙がっていました。

* [Action: Delete and Move an Outlook Task](https://powerusers.microsoft.com/t5/Flow-Ideas/Action-Delete-and-Move-an-Outlook-Task/idi-p/186531)
CentOS7+VirtualBoxでyumできない問題

# 問題
前の記事 [VirtualBoxでCentOSの環境構築メモ](https://qiita.com/salmonosushi/items/8cfc695fd26d4593bcd1)を使ってたら、yumできなくて困った


# 解決法

以下のコマンドを実行

```
nmcli connection modify enp0s3 connection.autoconnect yes
```

OSの起動時にネットワークの接続が自動で行われるようにしたらしい。
NAT + ホストオンリーアダプターの場合は要注意

参考： [CentOS7.2 64bit インストール時にVirtualBoxでNAT、ホストオンリーアダプターを使用する場合のネットワークの設定](https://www.kakiro-web.com/memo/centos-network-setting-nat-hostonly.html)
SSH先に設定を持っていく sshrc コマンド

こんにちは。ドミノ（@dr3mms）です。
SSH 先の設定をサーバごとに変えたいなーと思ったら `sshrc` コマンドが使えそうだったので、
さわりだけですがまとめました。
細かい設定ができたら追記していきます。

# ダウンロード
以下のファイルをダウンロード して PATH の通ったディレクトリに配置する
https://raw.githubusercontent.com/Russell91/sshrc/master/sshrc

権限を変更する

```bash
chmod +x sshrc
```

`C:\Windows\System32` に配置した場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/5c95f364-dc06-72d8-0f18-7173efc0daa7.png)

---

# 設定ファイルを作成する
```bash
echo "echo 'test'" >~/.sshrc
```
ログイン後に `test` を表示するだけです

# 接続する
`ssh` コマンドのかわりに `sshrc` コマンドで接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/7d0cde6d-c350-047b-a3a6-382358bfeb20.png)

`~/.ssh/config` ファイルの host 名でも接続可能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/4c7649c7-a0e2-e9b1-38d2-ff8bb08d686f.png)

---

# 参考
[sshrc: ssh時に.bashrc設定等をssh先に持っていけるコマンド](https://rcmdnk.com/blog/2018/01/31/computer-bash-zsh-network/)
[sshした先に.bashrcや.vimrcを持って行きたい人のためのsshrc - Qiita](https://qiita.com/ikuwow/items/ba4ca57fd67c06fd1b19)
7/14 今日学んだ事(登録機能)

#会員登録機能の実装
###作業内容
1.usersテーブルにnicknameカラムを追加
2.ビューを追加
3.ストロングパラメータを追加
4.バリテーションの追加


###1.usersテーブルにnicknameカラムを追加する

usersテーブルにnicknameカラムをstring型で追加する


```ターミナル.
$ rails g migration Addカラム名Toテーブル名 カラム名:データ型

となるので

$ rails g migration AddNicknameToUseres nickname:string

とターミナルで実行
```

マイグレーションの実行

```ターミナル.
$ rake db:migrate
```

・RailsはAdd ~~ ToUsersのように最後に記述するテーブル名でカラムを追加するテーブルを判断しているので、ファイル名は正しく打ち込む

###2.ビューの追加
サインアップ画面にnicknameを入力するフォームと、アイコン画像をアップロードできるフォームを作成。

・サインアップ画面はRailsのform_forメソッドを使って記述する。
・ニックネームは『テキストフィールド』のフィールドを生成する
・アイコン画像は『ファイルフィールド』のフィールドを生成する

####生成方法
テキストフィールド

```new.html.erb
<%= f.text_field :カラム名 %>
```
ファイルフィールド

```new.html.erb
<%= f.file_field :カラム名 %>
```

のフォームタグを利用すると生成される。
※new.html.erbは新規作成するテキスト

###3.ストロングパラメータを追加
まずnicknameとimageが設定されていないため、deviseのstrong_parametersに新しく許可するパラメーターを追加する必要がある。
そこで、deviseの**devise_parameter_sanitizer**メソッドを使用する。

###●devise_parameter_sanitizer
・strong_parametersに対してパラメータをー追加できる。
・before_actionに設定する※
・記述するのはDeviseのコントローラを継承したコントローラかもしくはApplicationController

コード

```
devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])
```
***引数の値(処理)***
1. :sign_up(新規登録時)
2. :sign_in(ログイン時)
3. :account_update(レコードの更新時)

***複数パラメータを追加する場合***

```
devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [:パラメーター1, :パラメーター2,..])
```
『,』カンマで区切る。

***注意***
※直接before_actionに設定してはいけない
devise_parameter_sanitizerを呼び出すためのメソッドを作成してそのメソッドを呼び出すようにする。

例

```application_controller.rb
before_action :configure_permitted_parameters

  def configure_permitted_parameters
    # devise_parameter_sanitizerメソッドを呼び出す
  end
```
すべてのコントローラがApplicationControllerを継承しているため、この記述ではすべてのコントローラのアクションの前でdevise_parameter_sanitizerメソッドが呼び出される。
devise_parameter_sanitizerメソッドはdeviseで追加されたメソッドなので、Deviseのコントローラ以外で呼び出すことができない。よって、before_actionを適応するコントローラを指定する。

before_actionではifというオプションを指定することができる。これはbefore_actionを呼び出す条件を指定するもの。今回はコントローラの種類を指定するので以下のように記述する。

例

```application_controller.rb
before_action :メソッド名, if: :コントローラ名?
```
例

```application_controller.rb
before_action :configure_permitted_parameters, if: :devise_controller?
```
devise_controllerが動いた時のみこのアクションを事前に動かしたいので、ifオプションを利用してそのように設定する。
※configure_permitted_parametersはdeviseで利用出来るパラメーターを設定でるdevise関連のストロングパラメーターの管理メソッド。

###4.バリテーションの追加
***バリテーションとは***
オブジェクトがDBに保存される前に、そのデータが正しいかどうかを検証する仕組み

###今回やりたい事
・nicknameが入力されていないとエラーがでるようにバリテーションを設定する。
・nicknameの入力が必須と分かるようテキストフィールドにプレイスホルダーを設定する

###●validation(検証)
入力フォームを通じてビューからサーバーへ側へパラメーターが送られてきた際、正常な値か検証できる機能。

###●validates :カラム名, presence: true
フォームの中身があるか検出し、無い場合は保存しない。
例
userのnicknameの入力を必須にする場合

```user.rb
class User < ApplicationRecord
    validates :nickname, presence: true
```
と記述する。

###● placeholder: ''
読み:(プレイスホルダー)

・フォームの値が空の時に、''で囲んだ文字を薄く表示しておくことができる。
・入力する人が、何を入力するか分かりやすくなる
今回はnicknameの入力欄に反映させたいので、text_fieldメソッドのオプションとして、以下のように利用する。

```new.html.erb
<%= f.text field :nickname, placeholder:'ニックネームを入力(必須)' %>
```

・ニックネームを設定していないとエラーがでるようにした
・ニックネームの入力欄にプレイスホルダーを設定できた

以上
リモートマシンのエミュレータとadbで接続して開発する

# はじめに

リモートの仮想マシンにRDPでつないでAndroid開発を試みた際、`HAXM`が動作しない問題[^1]に直面しました。
さすがにリモートの仮想マシンというただでさえ枷の多い環境で、更にエミュレータまで動作に問題があるとなると、開発時のストレスが大変なことになりそうだったので、エミュレータだけローカルで動作させる方法を探してみました。


# 調査結果

以下のように開発を行うローカルマシンから、エミュレータを動作させるリモートマシンに対して`ssh`でポートフォワーディングを行います。
こうすることで、ローカルの`adb`などなど、各種ツールがリモートのエミュレータと接続することができるようになります。

```
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 <ユーザー名>@<リモートマシンのアドレス> -p <ポート番号>
```
接続後、ローカルの`adb`を再起動することで認識されるようになります。
AndroidStudioからきちんとビルドした`apk`をインストールさせて動かすことが出来ますし、`Logcat`にもきちんとログが出力されますし、ブレークポイントで処理を止めることも出来ます。
軽く触ってみた感じ、ローカルで通常の方法で動作させているエミュレータと遜色ない動作をします。

![Peek 2019-07-14 22-58.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105287/9e7e954a-6e30-981f-7172-35ab3470a60a.gif)
<div style="text-align: center;">リモートのWindowsマシンからローカルのUbuntuマシン上のエミュレータを使う</div>

## 解説

5554はtelnet用、5555はDDMSなどのツール用にオープンされているポートです。これらの通信をリモートに飛ばすことでリモートマシンに存在しているエミュレータを制御することが可能になります。

# 参考

https://stackoverflow.com/questions/1754162/remote-debugging-with-android-emulator

[^1]: HAXMは仮想マシン上で仮想化を行うことは出来ません
enum は MECE である

![MECE_enum.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193431/852499c9-16c2-b276-4e27-12ab88ae0acb.gif)
先日
[enum はなぜ便利なのか](https://qiita.com/BMJr/items/5ec834e6513fe5f0ad87)
というタイトルで投稿しました。
今回は MECE な性質がある enum について書きます。

##MECE とは？
Mutually Exclusive and Collectively Exhaustive の頭字語でミーシーと読みます。
「重複がなく漏れもない」ことを表します。5択のマークシート試験の答案みたいなもので、5つの選択肢の中に必ず1つだけ正解があるようなものです。
日・月・火・水・木・金・土 などの曜日も MECE な性質があり、どの日も必ずどれか1つの曜日に当てはまります。

Xcode のパーツでは UISegmentedControl も必ずどれか1つの項目が選択されているので MECE な性質であると言えます。

##enum で MECE なものの項目を表現する
MECE の「複数の選択肢の中から必ずどれか1つが選択される」という性質を表すのにもってこいなのが enum です。
##補足： デフォルトの rawValue
swift では rawValue の記載を省略した場合、以下のようになります。

```swift
enum Signal: Int {
        case blue
        case red
        case yellow
    }
```
とすると、それぞれの rawValue は 0, 1, 2 となります。

```swift
enum Signal: String {
        case blue
        case red
        case yellow
    }
```
とすると、それぞれの rawValue は "blue", "red", "yellow" となります。
php-master-changes 2019-07-13

今日は <?php に続いて空白文字が来なかった場合に T_INLINE_HTML を分割しないようにする修正、不要コードの削除、php_error_docref0() の php_error_docref() への置き換え、テストこけの修正、ドキュメントの更新があった！

# 2019-07-13
## nikic: Don't split T_INLINE_HTML at partial PHP tag
- https://github.com/php/php-src/commit/0d568b9fd5bab4471219ed249c6c1c378bb46216
- [7.4~]
- 字句解析器で `<?php` に続いて空白文字が来なかった場合に T_INLINE_HTML を分割しないよう修正

## cmb69: No more need to cater to pre-PHP-5.3 or PHP-6 versions
- https://github.com/php/php-src/commit/a6fa097cebcd13baf6e152afcdbc0d1d5ae98d51
- [7.4~]
- ext/mysqli で、PHP 5.3 以前や PHP 6 でのバージョン表現を考慮した処理を削除

## petk: Remove tsrm_config_common.h
- https://github.com/php/php-src/commit/33994ebd95c3c42b0dca4e0f161692ecee7d741b
- [7.4~]
- 不要ファイル tsrm_config_common.h の削除

## Girgias: Convert all php_error_docref0 to php_error_docref
- https://github.com/php/php-src/commit/1c1de0c41a74b4deadd11cb18f00f115db0568ec
- [7.4~]
- php_error_docref0() を全て php_error_docref() に置き換え
- 経緯は [PR:4254](https://github.com/php/php-src/pull/4254) あたりから

## cmb69: Fix [#78282](https://bugs.php.net/bug.php?id=78282): atime and mtime mismatch
- https://github.com/php/php-src/commit/bf242d58e77d50d4d8fdaaaca7ede686ec4467c0
- [7.4~]
- atime / mtime 関連のテストこけの修正
- [先日の別の修正](https://qiita.com/sj-i/items/aa9898930fba4a7a7aaf#cmb69-fix-78241-touch-does-not-handle-dates-after-2038-in-php-64-bit)で time_t が 64 ビットであることを仮定した内容になっていたため

## cmb69: Fix [#78283](https://bugs.php.net/bug.php?id=78283): no output for explicit environment
- https://github.com/php/php-src/commit/8c76d898a95cc91ef987c5efb77c1b43fd64a32c
- [7.4~]
- Windows での [proc_open()](https://www.php.net/manual/ja/function.proc-open.php) のテストこけを修正
- php.ini で opcache 有効だけど環境変数 TEMP がセットされていない、となると子プロセスが起動できなくて死ぬので、子プロセス起動時に php.ini を読まないように、という修正

## petk: Remove WARNING_LEVEL fix for QNX
- https://github.com/php/php-src/commit/499f2ac1328c6021b2557026b76f5154e24608d8
- [7.4~]
- ビルドシステムで、QNX 用のハックで WARNING_LEVEL を使っていたが不要になっていたので削除

## petk: Remove checks for always enabled spl and pcre
- https://github.com/php/php-src/commit/f5e47718249a292c358cb1a3b4a333106540b6e1
- [7.4~]
- テストと run-tests.php で、常時有効な拡張 spl と pcre のチェックコードがあったのを削除

## petk: Remove unused recode extension artefacts
- https://github.com/php/php-src/commit/f3cf8966be9fcbf25f5efe49640d4af409eb9864
- [7.4~]
- [バンドルから外した recode](https://qiita.com/sj-i/items/1d6aa6443bb496a9bc95#cmb69-removed-extrecode) の残骸を削除

## petk: Remove php_multiple_shlib_versions_ok
- https://github.com/php/php-src/commit/4e0af6d8625e278956791237f874499afd26d34b
- [7.4~]
- ビルドシステムで、不要変数 php_multiple_shlib_versions_ok の削除

## petk: Update changelogs
- https://github.com/php/php-src/commit/f573ba1948a8d5b1356d7741d03f1a18f4921d5d
- [7.4~]
- NEWS、UPGRADING、UPGRADING.INTERNALS の更新
digisparkでPWMの周波数を高くする

https://digistump.com/wiki/digispark/tricks
こちらに記載がありますが、OSごとに場所が違ってよくわからなかったのでまとめておきます。

----

デフォルトでは 1007Hz となっているため、ブラシモータなどを接続すると音がなってしまいます。そのため、周波数を高くします。

Pin1,Pin4共に周波数を高くするには、 `core_build_options.h` と`wring.c` をそれぞれ編集します。

core_build_options.h:

- FAVOR_PHASE_CORRECT_PWM 1 → 0


```diff
--- core_build_options.h.bk
+++ core_build_options.h
@@ -116,7 +116,7 @@
   pins and one fast PWM pin.  If false there will be one phase-correct PWM 
   pin and two fast PWM pins.
 */
-#define FAVOR_PHASE_CORRECT_PWM                   1
+#define FAVOR_PHASE_CORRECT_PWM                   0
 
 /*
   Tone goes on whichever timer was not used for millis.
```

wring.c:

- MS_TIMER_TICK_EVERY_X_CYCLES 64 → 1

```diff
--- wiring.c.bk
+++ wiring.c
@@ -48,7 +48,7 @@
 #define MILLISTIMER_OVF_vect                      MILLISTIMER_(OVF_vect)
 
 
-#define MS_TIMER_TICK_EVERY_X_CYCLES  64 /* Shall be a within 1, 8, 64, 256 or 1024. (default = 64) If set to 1, HW PWM is around 64.5KHz@16.5MHz with Digispark */
+#define MS_TIMER_TICK_EVERY_X_CYCLES  1 /* Shall be a within 1, 8, 64, 256 or 1024. (default = 64) If set to 1, HW PWM is around 64.5KHz@16.5MHz with Digispark */
 
 #if F_CPU >= 3000000L
 #if !defined(MS_TIMER_TICK_EVERY_X_CYCLES)
```

これで、64453Hzになるはずです。簡易オシロで確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30362/90964c8e-cf81-4c16-027c-23a29d28503d.png)


良さそうです。

## サンプルコード

```.c
#define PWM_OUT 1

void setup()
{
  pinMode(PWM_OUT, OUTPUT);
  analogWrite(PWM_OUT, 50);
}

void loop()
{
}
```

## 各OSでのファイルの在処

Linux:

- `$HOME/.arduino15/packages/digistump/hardware/avr/1.6.7/cores/tiny/core_build_options.h`
- `$HOME/.arduino15/packages/digistump/hardware/avr/1.6.7/cores/tiny/wiring.c`

Windows 10:

- `%LOCALAPPDATA%\Arduino15\packages\digistump\hardware\avr\1.6.7\cores\tiny\core_build_options.h`
- `%LOCALAPPDATA%\Arduino15\packages\digistump\hardware\avr\1.6.7\cores\tiny\wiring.c`

OSX:

- `$HOME/Library/Arduino15/packages/digistump/hardware/avr/1.6.7/cores/tiny/core_build_options.h`
- `$HOME/Library/Arduino15/packages/digistump/hardware/avr/1.6.7/cores/tiny/wring.c`
RxJSのmergeMap便利ですね

### subscribeのネスト嫌だ

Angularで待ち合わせ処理を実装しないといけなくて`subscribe`ネストさせるの嫌だなーと思って、RxJSいろいろ調べていたら`mergeMap`っていう便利なオペレータ見つけました。

```TypeScript
this.appService.get1().subscribe(v1 => {
  // get1の購読が終わってからgetを購読させたい
  this.appService.get2().subscribe(v2 => {
    // 処理
  });
});
```

`subscribe`がネストしていてとても嫌ですね。

```TypeScript
this.appService.get1().pipe(
  mergeMap(() => this.appService.get2()),
).subscribe(v2 => {
  // 処理
});
```

`mergeMap`使うとネストバイバイできます。
ただ注意しないといけないことがあって、`subscribe`して流れてくるのは`this.appService.get2()`の`Observable`だけです。

具体的にどういう時に`mergeMap`使えるかですけど、例えば https://apis.google.com/js/api.js の読み込みが終わってから `gapi.auth2` の処理したい時とかに使えますね。

サンプルコード（ng-gapi）

https://github.com/rubenCodeforges/ng-gapi/blob/688ad55c6b983e749e8d88e24d5cd92a9eabf20c/src/GoogleAuthService.ts#L22
1つずつ数字が確定するアニメーションの実装

# 始めに
カウントアップのアニメーションは調べたらいくつかありましたが、最初はシャッフルされていて、1つずつ数字が確定するようなアニメーションは見つからなかったので記事にしました。（調べ方が悪いだけの可能性もありますが（汗））
以下にサンプルを載せます。データ周りが結構ややこしくなるかと思ったのですが、別に桁ごとにデータを持たなくても実装できたのでそこまで複雑ではありませんでした。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="wintyo" data-slug-hash="bPyYLW" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="1つずつ数字が確定するサンプル">
  <span>See the Pen <a href="https://codepen.io/wintyo/pen/bPyYLW/">
  1つずつ数字が確定するサンプル</a> by wintyo (<a href="https://codepen.io/wintyo">@wintyo</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 実装方法
## 桁数を取得する
最初にランダムに表示する桁数を目標の値から取得する必要があります。ネイティブで実装されていたら楽でしたが、なかったのでメソッド化します。

```js:桁数の取得
/**
 * 桁数を取得する
 * @param {number} number - 数値
 * @returns {number} - 桁数
 */
function getDigits(number) {
  // 0の場合は1桁を返す
  if (number === 0) {
    return 1;
  }

  let digits = 0;
  while (number >= 1) {
    number /= 10;
    digits += 1;
  }
  return digits;
}
```

## ランダムに数字を表示する
まずはシャッフル状態のアニメーションを作ります。アニメーションと言っても、ただintervalを使って表示する数字を差し替えているだけです。単純にランダムにするなら1回の乱数でいいですが、一桁ずつ確定していくことを踏まえて0～9の乱数を各桁ごと行います。各桁を算出できたら後は足し合わせます。各桁を上手く足せるようにべき乗を使用しています。
まとめると以下のようになります。今回は実装を楽するためにlodashのtimesとpadStartを使用しています。

```js:ランダムに数字を表示する
const value = 2048;
const digits = getDigits(value);

window.setInterval(() => {
  // 各桁の数値を算出する
  const numbers = _.times(digits).map(() => {
    return Math.floor(10 * Math.random());
  });
  // 足し合わせる
  const displayValue = numbers.reduce((accumulator, number, index) => accumulator + (10 ** index) * number);
  
  // 0詰めで表示させる
  countElement.innerHTML = _.padStart(String(displayValue), digits, '0');
});
```

## 下の桁から確定していく
後は各桁の数値を算出する場所で表示したい値を出すか乱数を出すか場合分けをしたらいいです。

```js:一部の桁だけ数字を固定する
const value = 2048;
const digits = getDigits(value);

let fixDigits = 1;  // 1桁目だけ数字を出す
window.setInterval(() => {
  // 各桁の数値を算出する
  const numbers = _.times(digits).map((index) => {
    // 固定したい桁の場合は最終値を返す
    if (index < fixDigits) {
      return Math.floor(value / (10 ** index)) % 10;
    }
    return Math.floor(10 * Math.random());
  });
  // 省略
});
```

## イベントをつなぎあわせる
最後にsetTimeoutを使ってfixDigitsのところをカウントアップしていき、最後の桁までたどり着いたらintervalを止めて完成です。

# 終わりに
そもそも言葉がわからないというのもありますが、今回のようなアニメーションは探しても見つからなかったので記事にしました。数字の表示は他にもいろいろあるようで、リンクを貼っておくので興味があればそちらも参考にしてみるといいかもしれません。

# それ以外の数字のアニメーション
+ [数字のカウントアップを良い感じのアニメーションで実装したい](https://qiita.com/nishinoshake/items/b91236c77b1987036656)
+ [数字や文字をクルマの走行距離計のようにぐるぐる回転させて表示するスクリプト -Odometer](https://coliss.com/articles/build-websites/operation/javascript/js-odometer.html)
+ [パラパラめくれるフリップ式時計](https://www.moongift.jp/2015/11/flipclock-js-%E3%83%91%E3%83%A9%E3%83%91%E3%83%A9%E3%82%81%E3%81%8F%E3%82%8C%E3%82%8B%E3%83%95%E3%83%AA%E3%83%83%E3%83%97%E5%BC%8F%E6%99%82%E8%A8%88/)
Windows10 で Atom をセットアップ

こんにちは。ドミノ（@dr3mms）です。
Windowsのエディタでオススメの Atom についてまとめました。

# ダウンロード（zip版）
[Atom公式サイト](https://atom.io) で `Release notes` をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/4255512f-d4b4-0619-d5a7-4b6e92bf1b9a.png)

`beta` が付いていない v1.38.2 をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/2ef62b26-6c24-8247-20e3-c36ceed7fbf2.png)

`atom-x64-windows.zip` をクリックしてダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/9ec5aecb-6ddc-f920-5644-8d2b28ca2715.png)

解凍する
ディレクトリ名を `Atom` にリネームして、任意のパスに配置する
`atom.exe` を実行する

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/9785aaa8-08a1-420b-79c2-950d43612fa0.png)

`Welcome Guide` を次回以降表示したくない場合、左下の `Show Welcome Guide when openingAtom` のチェックをはずす
`

`Register as default atom://URI handler?` は `No, Never` をクリックする

`Telemetry Consent` は今後の開発のために Atom に匿名でデータを送るかどうか。どちらかをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/54400c73-13ee-3938-b1e0-0ee4437c563f.png)

---

# 設定
`Ctrl + ,` （または `File` ⇒ `Settings`）で設定画面が開く

## コア設定
### プロジェクトホーム
`C:\Users\{ユーザ名}\Documents\workspace`

## エディタ設定
### インデントガイドを表示
チェックをONに

### 不可視文字を表示
チェックをONに

---

# ショートカット
## Ctrl + Shift + M
Markdown や HTML をプレビュー表示する

## Ctrl + Shift + p
コマンドパレットを表示する

---

# パッケージ
## file-icons
ファイルの先頭に拡張子から判断したアイコンを表示してくれる

## highlight-line
現在選択している行をハイライトしてくれる

## highlight-selected
選択した文字と同じ文字をハイライトしてくれる

## show-ideographic-space
全角スペースを編集記号で表示してくれる

## atom-html-preview
`Ctrl + Shift + H` で HTML がプレビュー表示される

## atom-beautify
HTMLなどを整形する

## color-picker
色をその場で確認できる

## atom-runner
`Alt + R` でカーソルのあるファイルを実行してくれる

## linter
## linter-ui-default
## linter-flake8
`pip install flake8` でインストール
`where flake8` でインストールパスを取得
`Ctrl + ,` で Settings ⇒ Packages ⇒ linter-flake8 ⇒ Settings の `Executable Path` に先ほどのインストールパスをセット

## project-manager
プロジェクトを管理する
`Alt + Shift + P` でプロジェクト一覧を開いて遷移する

## remote-FTP
リモートサーバのファイルを編集する

---

# 参考
[Atomインストール後のおすすめ設定-Welcome GuideとTelemetry Consentを消す – ゼロイチ](http://0-1.life/196)
[AtomでPythonの開発環境を作る方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/21809)
Windows10 で Cmder を使ってターミナル環境構築

こんにちは。ドミノ（@dr3mms）です。
Windowsのターミナルでオススメの Cmder についてまとめました。

# ダウンロード
[公式サイト](https://cmder.net)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/43e0678a-398d-029d-2d24-1310e5bdfc34.png)
`Download Full` をクリックしてダウンロード

---

# インストール
ダウンロードした `cmder.zip` を解凍して任意のパスに配置

---

# 起動
`cmder\Cmder.exe` を管理者として実行する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/c0d2d702-3275-2e9a-9747-99f7c92e18cf.png)

---

# 設定
右下の設定ボタンをクリック

## General
#### Choose your startup task or een a shell with arguments:
`{bash::bash as Admin}`

## Startup
### Tasks
`{bash::bash as Admin}` を選択し、 `Default task for new console` をチェック

`Startup dir...` をクリックし、コンソールを開いたときに表示したいパスを指定する

`Save settings` で保存
jQuery で外部 HTML ファイルが表示されないときの原因と対処法

# 外部ファイルが表示されない

jQueryを使用してヘッダーのHTMLを読み込もうとしたのに、うまく読み込まれませんでした。原因と対処法を説明していきます。

# 状況

問題のコードは、大体以下のような感じでした。

読み込む側

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        <!--サイトのアイコンの設定など-->
    </head>
    <body>
        <header>
        </header>
        <main>
            <!--サイトの内容-->
        </main>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <script>
            jQuery(function() {
                jQuery('header').load('/header.html');
            });
        </script>
    </body>
</html>
```

読み込まれる側

```html:header.html
<!DOCTYPE html>
<html>
    <head>
        <!--サイトのアイコンの設定など-->
    </head>
    <body>
        <main>
            <!--サイトの内容-->
        </main>
    </body>
</html>
```

index.htmlを開くと、header要素の中にheader.htmlの内容が表示されるはずですが、表示されません。

# 原因

index.htmlのheader要素にheader.htmlが入るとどうなるかを考えると、原因が分かります。

index.htmlのheader要素にheader.htmlが入ると...

```html:index.html
<!DOCTYPE html>
<html>
    <head>
        <!--サイトのアイコンやスタイルシートの設定など-->
    </head>
    <body>
        <header>
            <!--ここから header.html-->
            <!DOCTYPE html>
            <html>
                <head>
                    <!--サイトのアイコンやスタイルシートの設定など-->
                </head>
                <body>
                    <main>
                        <!--サイトの内容-->
                    </main>
                </body>
            </html>
            <!--header.html ここまで-->
        </header>
        <main>
            <!--サイトの内容-->
        </main>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <script>
            jQuery(function() {
                jQuery('header').load('/header.html');
            });
        </script>
    </body>
</html>
```

何がおかしいか分かりますね？

header要素の中に本来入らないはずのhead要素やbody要素などが入り、ぐちゃぐちゃになっています。

つまり、header.htmlは、こうすれば良かったわけです。

```html:header.html
<!--サイトの内容-->

```

もはや例を示す必要があるのかというレベルです。

ちなみに、CSSは何も指定しなければindex.htmlで使用しているものが使用されます。
Windows10 で Python をインストール

こんにちは。ドミノ（@dr3mms）です。
Windowsで環境を作るのに毎回検索するのでまとめました。

# ダウンロード
[公式サイト - Downloads](https://www.python.org/downloads/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/a9ddf2d6-6acc-ae66-6771-ea632255d4a9.png)
下の `Python 3.7.4` の `Download` をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/1cfc8289-43ee-d489-2aff-4ca801cc1523.png)
`Windows x86-64 executable installer` をクリックしてダウンロード

---

# インストール
`python-3.7.4-amd64.exe` を管理者として実行する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/d31c874a-6094-19e4-647c-a8c550af6765.png)
`Add Python 3.7 to PATH` にチェックを入れる（環境変数に設定する）
`Customize installation` をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/4ff68950-e2a9-75bb-725c-eb2606a22454.png)
デフォルトで `Next`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199232/63c9f65d-5eb8-f07e-e522-f4086f3cb1b5.png)
`Customize intall location` は `任意のパス\Python37` にする
`Install` をクリックしてインストール

---

## pyenv インストール
[pyenv-win](https://pypi.org/project/pyenv-win/)

```bash
pip install pyenv-win --target ~/.pyenv
```

環境変数 `PATH` に以下を設定する
`{ホームディレクトリ}\.pyenv\pyenv-win\bin`
`{ホームディレクトリ}\.pyenv\pyenv-win\shims`


## pipenv インストール

```bash
pip install pipenv
```

## AWS CLI インストール
```bash
pip install awscli
```
妄想プロダクト室「ギュtto」のプロトタイプ

![main_vidual.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/2a9c1acc-7632-54de-1ede-a9251cfcfe4b.jpeg)

# つくったモチベーション
こんな経験ありませんか？
チャットでwを生やすも、顔は真顔、、、🌝
それが普通だと思いますが、テキストだけのやりとりに私は寂しさを感じることがあります😢
（ もっと**温度感のあるコミュニケーションがしたい、人を感じたい**、、、 ）
そこで、私はProtoOut LINE Things ハッカソンを機会に、新しい**体感型通信デバイス**をプロトタイピングしてみることにしてみました！
![0b12f4281a6860052b6c9991e892e955.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/c3634dbf-a57f-df58-7718-08b1cc0c8201.png)
https://protoout.connpass.com/event/135942/

# 「ギュtto」概要
”もふもふハートフルデバイス”「ギュtto」をプロトタイピング。
ぎゅっと抱きしめると、抱きしめてる間だけ、ハートをスマホに送ってくれて、
スマホからもボタンをクリックすることで、ぬいぐるみをバイブレーションさせることができます。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://t.co/ziTVe4sSRB">https://t.co/ziTVe4sSRB</a><a href="https://twitter.com/hashtag/prototyping?src=hash&amp;ref_src=twsrc%5Etfw">#prototyping</a><a href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0?src=hash&amp;ref_src=twsrc%5Etfw">#プロトタイピング</a></p>&mdash; taichi (@MakingEmo) <a href="https://twitter.com/MakingEmo/status/1150393952123490304?ref_src=twsrc%5Etfw">2019年7月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 技術・素材
- LINE Things LIFF
- obnize
- サーボモータ
- 圧力センサー
- ぬいぐるみ

## 構成図
![image.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/84c9b3ab-2a1c-098d-d364-9da2490e592d.jpeg)

# 今後
###取得した圧力センサーの値によって、LIFF上の表現を変えたい。
processingやcanvasで動的に表現したい
（現状はGIF画像を表示しているだけ）

###ハード側のバイブレーション部分を機能させたい。
現状、サーボモータをバイブレーション機能として代用しているが、
もっとわかりやすくぬいぐるみがバイブするような実装がしたい

# 参考
https://qiita.com/n0bisuke/items/1f552f3508fe8cf22759
html canvas resize

# canvasのリサイズの方法
300×227ピクセルの画像を28×28にピクセルにリサイズしました。

```html:imageData_resize.html
<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <canvas id="canvas"></canvas>
        <canvas id="zoom"></canvas>
    </body>

    <script>
        var img = new Image();
        img.src = 'https://mdn.mozillademos.org/files/5397/rhino.jpg';
        img.onload = function() {
            draw(this);
        };

        function draw(img) {
            var canvas = document.getElementById('canvas');
            canvas.width = img.width; //300を代入
            canvas.height = img.height; //227を代入
            var ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0, img.width, img.height);
            img.style.display = 'none';
            var zoomctx = document.getElementById('zoom').getContext('2d');
            
            zoomctx.drawImage(canvas,//リサイズしたいcanvas
                                //リサイズしたいcanvasの範囲の指定
                                0,0,
                                canvas.width,
                                canvas.height,
                                //canvasを28×28ピクセルにリサイズしている
                                0, 0,
                                28, 28);
            
        }
    </script>
</html>
```
GatsbyでNetlifyのFormを使う(react-bootstrap使用)

Gatsbyで作ったサイト(react-bootstrap使用)でNetlifyのFormを使おうとして微妙にハマったのでメモしておく。
react-bootstrapを使わない場合も参考になると思う。

# 環境
- React 16.8.6
- Gatsby 2.1
- react-bootstrap 1.0.0-beta.9

# コード
以下のコードで動作

```jsx
class ContactForm extends Component {
  constructor() {
    this.state = { validated: false }
  }
  
  // react-bootstrap用のPOSTイベントハンドラ
  // https://react-bootstrap.github.io/components/forms/#forms-validation
  handleSubmit(event) {
    if (!event.currentTarget.checkValidity()) {
      event.preventDefault()
      event.stopPropagation()
    }
    this.setState({ validated: true })
  }

  render (){
    return (
      <Form validated={this.state.validated} onSubmit={this.handleSubmit} name="contact" method="POST" data-netlify="true">
        <input type="hidden" name="form-name" value="contact" />
        <Form.Group>
          <Form.Label>name</Form.Label>
          <Form.Control name="name" type="text" />
        </Form.Group>
        <Button type="submit" >送信</Button>
      </Form>
    )
  }
}
```

# ポイント
まずは、[netlifyの公式](https://www.netlify.com/docs/form-handling/)通りにFormタグに`name="contact"`及び`data-netlify="true"`プロパティを追加する。ちゃんとreact-bootstrapでも動作した。

次に、Gatsbyの場合、Netlify側が挿入する以下のタグがGatsbyによって消去されるため、予め入力しておく必要がある。ちなみに、この設定方法は[公式ブログ](https://www.netlify.com/blog/2017/07/20/how-to-integrate-netlifys-form-handling-in-a-react-app/)に書いてある。

```jsx
<input type="hidden" name="form-name" value="contact" />
```

また、`<Form.Control />`(普通のhtmlの場合は`<input />`)には`name`プロパティが必要。`name`と`value`プロパティの値が、ユーザーへ通知される仕組み。
Goでクロスコンパイル

# 放置していたGolangに再度着手
Javaが不安な状態なこと、Pythonは実行環境を整えてもらわないと動かしてもらえないという二点からGolangが再浮上してきました。

## 環境
go version go1.12.5 linux/arm

# クロスコンパイル
あちこちで触れられていることなので簡単にスクリプトだけ。

```sh:build.sh
#!/bin/sh

if [ $# != 1 ]; then
	echo "usage: $0 [binary name]"
	exit 0
fi

rm -rf ./bin

mkdir ./bin
mkdir ./bin/linux-arm
mkdir ./bin/linux64
mkdir ./bin/linux386
mkdir ./bin/windows386
mkdir ./bin/windows64
mkdir ./bin/darwin386
mkdir ./bin/darwin64



echo linux-arm
GOOS=linux GOARCH=arm go build -o ./bin/linux-arm/$1

echo linux64
GOOS=linux GOARCH=amd64 go build -o ./bin/linux64/$1

echo linux386
GOOS=linux GOARCH=386 go build -o ./bin/linux386/$1

echo windows386
GOOS=windows GOARCH=386 go build -o ./bin/windows386/$1

echo windows64
GOOS=windows GOARCH=amd64 go build -o ./bin/windows64/$1

echo darwin386
GOOS=darwin GOARCH=386 go build -o ./bin/darwin386/$1

echo darwin64
GOOS=darwin GOARCH=amd64 go build -o ./bin/darwin64/$1
```

# 疑問点
外部モジュールを利用する場合。とくにネイティブバイナリを含むようなものをクロスコンパイルする場合のドキュメントがあまり存在していない気がする。
当然各環境のネイティブバイナリは存在するものとして、どうやって指定すればいいのだろう？　それともあまり考えずに出来るんだろうか。

# 〆
ということであまり内容はありませんがのんびりいじってゆくつもり。
Sigfox First Step Guide

IoT Sigfoxネットワークは、低消費電力、長距離通信といったLPWA技術の特長の他にも、グローバル・ワン・ネットワークかつシンプルなサービスであり、

- 国内で契約した回線を世界中でローミングを意識する必要なく利用可能
- 簡単に登録でき、回線もデバイスからメッセージが送信されたタイミング（回線開通手続き不要）

といった利点があります。

>ここでは、はじめてSigfoxサービスを利用される方を対象にしています。Sigfoxを自社サービスとして展開する場合は、[KCCSパートナー登録](https://www.kccs-iot.jp/partner/)をお願いします。

#Sigfoxをはじめる

ご利用にあたっては、Sigfoxデバイスと回線購入、そしてデバイスと回線を紐づけるだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/6d914905-0020-bac6-437e-bded24b414b6.png)


##Sigfoxデバイスを入手する
Sigfoxデバイスは国内外で数百のSigfoxパートナーから提供されています。
[Sigfox Partner Network](https://partners.sigfox.com/)や[KCCSパートナー製品](https://www.kccs-iot.jp/solution/product/)、[Sens'it](https://www.kccs-iot.jp/solution/product/device1/)など入手するか、ディベロッパー向けの各種通信モジュールや[Sigfox Shield for Arduino(UnaShield)](https://www.kccs-iot.jp/solution/product/device10/)、[Breakout Board](https://www.kccs-iot.jp/solution/product/device32/)などDevKitを入手してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/f497ea92-1270-7d6f-30f0-93a78a73fae5.png)

##Sigfox回線を購入する
Sigfox回線は、KCCSパートナーから購入いただくか、**[Sigfox Buy サイト](https://buy.sigfox.com/)の[Buy Connectivity]からご購入下さい**。
>Devkitとして登録されているデバイスは、1年間の無償利用も可能です。（Devkitは、Sigfox Shield for Arduino、Breakout Board以外にも[こちら](https://partners.sigfox.com/products/kit?or[categories][0]=kit&or[deviceZones][0]=zone3&q=&limit=12&page=0)でも確認いただけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172313/b7d5dfcc-46e5-aae3-e319-6b6d407e0af1.png)
Sigfoxアカウントをお持ちの方は、画面下のLogin hereからログイン後、回線購入いただければ、ご自身のアカウント内に回線が追加されます。
初めての方は、回線購入時の情報に基づき、Sigfoxアカウントが作成されます。

##Sigfoxサービスを開始
[Sigfox Backendクラウド](https://backend.sigfox.com/)にログインし、ご自身の設定を確認してください。
>デバイスが登録されていない場合は、[こちら(Sigfoxデバイス管理)](https://www.kccs-iot.jp/20180626-03-technical/)を参考に、ご自身のデバイスを登録してください。

ここまでの設定におり、Sigfoxサービスを利用開始することができます。

#ディベロッパー向けサイト"Sigfox Build"
更に開発者向けのサイトとして[Sigox Build (英語)](https://build.sigfox.com/)が用意されています。是非、こちらもご参照ください。

####*Bienvenue! Sigfox 0G World!*

よくある質問は、[FAQ](https://www.kccs-iot.jp/faq/)をご確認ください。
ReactアプリをFirebaseにのっける最も簡単な方法

ReactとFirebaseの組み合わせで使用できる、ちょっとしたマイナーツールを紹介。

[generator-react-firebase - npm](https://github.com/prescottprue/generator-react-firebase)

> Yeoman generator for starting projects using React and Firebase (Redux optional)


## `Yeoman`とは
聞きなれない単語がありますが、ただの形容詞ではなく、[yeoman.io](https://yeoman.io/)のことです。
辞書で引いてみると、

```
1《主に英国で用いられる》
    a《あまり用いられない語》 自作農，小地主.
    b(昔の)自由民，ヨーマン 《独立自営農民; gentleman より低い地位の自由所有権保有者 (freeholder)》.
    c(昔，王家・貴族に仕えた高位の)従者.
2【米海軍】 事務係下士官.
```

よしなにいい感じに気を利かして作業をやってくれますよ、といったところでしょうか。
本家サイトによれば、`scaffolding tool`, `build tool`, `package manager`を含むエコシステムをいい感じに提供してくれるらしいです。イケてそうですね。

この中で、`scaffolding tool`とかいうのが気になるやつです。
これはgeneratorを作るgeneratorであり、`generator-react-firebase`は`yeoman`でscaffoldされています。

`yeoman`を使って作られたgeneratorは、他にもたくさんあります。

[vscode-generator](https://github.com/microsoft/vscode-generator-code)
[hyperledger-composer](https://www.npmjs.com/package/generator-hyperledger-composer)
などなど。

それ以外のgenerator: https://yeoman.io/generators/


## `generator-react-firebase`とは
web-app-generatorの一つであり、[react-redux-firebase](https://github.com/prescottprue/react-redux-firebase)を使用してアプリをscaffoldします。

本来であれば、フロントエンドのイケイケ開発を始めるには、深く広い（webpackやgulp他様々の）知識が必要になります。
generatorを使えばそこをさっと飛び越えてしまえるのが、イケイケポイントですね。

## `generator-react-firebase`の使い方
Readmeに書かれている通り、`yo`を実行して、あとは質問に答えていくだけです。

```sh
npm install -g yo generator-react-firebase

yo react-firebase
```
<img width="452" alt="Screen Shot 2019-07-14 at 21.20.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119807/383bf4d3-c952-1e62-2b75-b3da1e85cd18.png">

予め`firebase login`とかしておけば、イイカンジにレコメンドしてくれるので、とても簡単にreactアプリをscaffoldできます。


## 注意点
コンソールで打ち込む情報の中に、FirebaseプロジェクトのApiKeyが含まれます。
これはシークレットなので隠すべき（公開レポジトリにpushしてはいけない）ですが、`.gitignore`に登録されていないファイル`.yo-rc.json`に紛れ込みます。お気をつけて。

ちなみに僕はpushしてしまって、GG君に怒られました。
GG!!
<img width="564" alt="Screen Shot 2019-07-14 at 20.50.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119807/06cbf7a3-ec2a-51c2-6bb0-7451b536cf33.png">
SMARTでSSDのチェック

# 準備
apt install smartmontools

# チェック実行
```sh:check.sh

# information
smartctl -i /dev/sda

# short test
smartctl -t short /dev/sda
sleep 60

# long test
#smartctl -t long /dev/sda
#sleep 300

# log view
smartctl -l selftest /dev/sda

# all view
#smartctl -a /dev/sda
```
CircleCIの公式ドキュメントでHelloWorld

#はじめに
CircleCIの公式ドキュメントが日本語化されたので、ハンズオンがてら公式HelloWorldやってみました。
Qiitaでやってみた系の記事はもう書かんでいいやと思いましたが優れたUIの前に屈服！

#作業環境
mac

#事前調査
##ググる
良い機会でしたのでCI/CDについての記事を適当に一読。
金さん(CCI2 Japan)が書かれたCodeZineの記事がわかりやすかったですが登録が必要とのことで1ページしか読めん！
ただ1枚目の末尾に書かれてる図が重要ですので、ぜひ読んでみてください。

https://codezine.jp/article/detail/11083

##ユーザー登録＆連携
CCI2とgithubの連携は事前に済ませておきましたのでスキップ。
手順は公式に記載されています。めっちゃ簡単です。

https://circleci.com/docs/ja/2.0/first-steps/

##ハンズオン開始

```
1. GitHub または Bitbucket のローカルリポジトリのルートディレクトリに .circleci ディレクトリを作成します。
```

この日本語を理解するのに一瞬？となりましたが、Organization/.circleciディレクトリを作成すればおkです。

```
2. .circleci ディレクトリに以下の内容を含む config.yml ファイルを追加し、hello-build orb をインポートします。
```

viやtouchでファイルを作ってコードはコピペ。

```
変更のコミットやプッシュは、ビルド実行のトリガーになります。 CircleCI で初めてプロジェクトを作成する場合は、プロジェクトページにアクセスし、[Add Project] ボタンをクリックします。その後プロジェクト名の横にある [Bulid Project] ボタンをクリックしてください。
```

ここちょっとハマりました、作業端末のローカルリポジトリでconfig.ymlを作成したのでpushすればもう勝手に動く(ちなみに現時点でCCI2が何をどうhelloworldしてくれるのか全く不明瞭レベル)だろうと思ったのですが、JOBメニューに何も表示されない。なぜだ。
ここで手順をしっかり間違えて、次の「Echo Hello World を実行する build ジョブ」のコードをconfig.ymlに追記(書き換えじゃないですよ。ブロックを追記)してpushしましたがしーん。

結局、

```
ADD PROJECTSからSet up Project→Start building
```

で起動しました。よかったw
ドキュメントとUIで表示が違うので(もちろんUIが正ですが)迷う時間が生まれましたが完了。
Hello unameもテストで実行されてました。これが自動テストってやつか！

#おわりに
ハンズオンにまだ続きが続きがありますのでそれはおいおい。
料金体系のとこのLinuxとMacOSの差がよくわからんので次はその辺りの知識が補充できれば。

総じて満足のいくドキュメントでした！CicleCIちょっとできるを目指して！

#追記
気になってたとこを調べました。

###Spin up Environment
.circleci/.configに書かれてるコードから一時的な環境を作成する。
料金体系のとこに書かれてる１コンテナってのはこれを指しているのかも。
この環境はCCI2側のクラウドとかオンプレ環境で我々からは見えないんでしょうね、たぶん。

例えばTerraformのテストしたいならここで指定してあげれば一時的なTerraform環境が構築されてテストが走ります。

###Checkout code
HelloWorldのサンプルコードにはこのブロックは書かれていませんが、同じく.configに書かれているcheckoutが実行されます。おれ絶対わかってない。
stepsのcheckout以下に処理ブロック（このことばが合ってる自信なし）を記載すると降順で処理されていくようです。
Terraformのinitとかplanしたいならその処理を変数に入れて、変数をcheckout以下に書いてあげる。サンプルコードがないと何言ってるかわかりませんね。。

#現状の疑問
JOBSとWORKFLOWSの違いがわからん。一緒に見える

#めっちゃわかりやすかった参考記事
https://qiita.com/sawadashota/items/09b37b303e63f3b897a9
[小ネタ] TypeScriptは列挙型をトランスパイルするときに何をしているか?

TypeScriptの基本を[Playground](http://www.typescriptlang.org/play/)で勉強していて以下のような列挙型のコードを実行すると

```ts
enum SEX {
    MALE,
    FEMALE,
    UNKNOWN
}
let m: SEX = SEX.MALE;

console.log(m) //=> 1
console.log(SEX[m]) //=>  "MALE"
```

以下のようなコードがトランスパイルされます。

```js
"use strict";
var SEX;
(function (SEX) {
    SEX[SEX["MALE"] = 0] = "MALE";
    SEX[SEX["FEMALE"] = 1] = "FEMALE";
    SEX[SEX["UNKNOWN"] = 2] = "UNKNOWN";
})(SEX || (SEX = {}));
let m = SEX.MALE;
console.log(m); //=> 1
console.log(SEX[m]); //=>  "MALE"
```

パット見？？？となってしまったので少し詳しく見てみます。

この部分で即時関数を実行してSEXを定義しているのですが、

```js
(function (SEX) {
    SEX[SEX["MALE"] = 0] = "MALE";
    SEX[SEX["FEMALE"] = 1] = "FEMALE";
    SEX[SEX["UNKNOWN"] = 2] = "UNKNOWN";
})(SEX || (SEX = {}));
```

紛らわしいのがこの部分で

```js
SEX[SEX["MALE"] = 0] = "MALE"
```

これは省略せずに書くと以下のように列挙型のキーバリューを相互に入れ替えたものをそれぞれオブジェクトのアトリビュートとして定義しています。

```js
SEX["MALE"] = 0 // の実行結果は代入した値で0
SEX[0] = "MALE"
```

つまり以下のようなオブジェクトが定義されます。

```js
{
	0: "MALE",
	1: "FEMALE",
	2: "UNKNOWN",
	MALE: 0,
	FEMALE: 1,
	UNKNOWN: 2,
}
```

なので以下のように列挙型のキーとキーから値に両方アクセスできるのですねー :hamburger: 

```js
let m = SEX.MALE
console.log(m) // => 1
console.log(SEX[m]) // => "MALE"
```

playground上でやるとトランスパイルされたjs横に出てきて、すぐ見れるので初学者には良さそうです！
Leetcode #773: Sliding Puzzle

```swift
func slidingPuzzle(_ board: [[Int]]) -> Int {
    var visited = Set<[[Int]]>()
    var moves = 0
    var queue = [[[Int]]]()
    queue.append(board)
    while !queue.isEmpty {
        for _ in 0..<queue.count {
            var current = queue.removeFirst()
            if current == [[1,2,3],[4,5,0]] {
                return moves
            }
            visited.insert(current)
            var indexX = 0, indexY = 0
            for i in 0..<2 {
                for j in 0..<3 {
                    if current[i][j] == 0 {
                        indexX = i
                        indexY = j
                        break
                    }
                }
            }
            if indexX == 0 {
                current[indexX][indexY] = current[indexX+1][indexY]
                current[indexX+1][indexY] = 0
                if !visited.contains(current) {
                    queue.append(current)
                }
                current[indexX+1][indexY] = current[indexX][indexY]
            } else {
                current[indexX][indexY] = current[indexX-1][indexY]
                current[indexX-1][indexY] = 0
                if !visited.contains(current) {
                    queue.append(current)
                }
                current[indexX-1][indexY] = current[indexX][indexY]
            }
            current[indexX][indexY] = 0
            if indexY != 0 {
                current[indexX][indexY] = current[indexX][indexY-1]
                current[indexX][indexY-1] = 0
                if !visited.contains(current) {
                    queue.append(current)
                }
                current[indexX][indexY-1] = current[indexX][indexY]
                current[indexX][indexY] = 0
            }
            if indexY != 2 {
                current[indexX][indexY] = current[indexX][indexY+1]
                current[indexX][indexY+1] = 0
                if !visited.contains(current) {
                    queue.append(current)
                }
                current[indexX][indexY+1] = current[indexX][indexY]
                current[indexX][indexY] = 0
            }
        }
        moves += 1
    }
    return -1
}
```