OmniAICreator/Qiita-1.07M huggingface dataset:
API(for Beginners)のまとめ

# 概要

先日「[API for Beginners - Workshop](https://www.facebook.com/events/377592836018059/)」という勉強会に参加してきました。内容を勝手にまとめます。

# 内容

* APIとは何か？（ここでは割愛）
* どこで使われているか？(ほとんど割愛)
* ワークショップ（ここがメイン）

## どこで使われているか？

参考サイト
https://www.programmableweb.com/

Google Mapsはいい例だよね〜〜って話だった。

例えば下記のURL
`http://maps.googleapis.com/maps/api/geocode/json?address=tokyo`
最後の`tokyo`部分をそれらしく変えて、ブラウザでアクセスしてみてほしい。

こんなのが返ってきます。

```json
{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "Tokyo",
               "short_name" : "Tokyo",
               "types" : [ "administrative_area_level_1", "locality", "political" ]
            },
            {
               "long_name" : "Japan",
               "short_name" : "JP",
               "types" : [ "country", "political" ]
            }
         ],
         "formatted_address" : "Tokyo, Japan",
         "geometry" : {
            "bounds" : {
               "northeast" : {
                  "lat" : 35.8986468,
                  "lng" : 153.9876115
               },
               "southwest" : {
                  "lat" : 24.2242626,
                  "lng" : 138.942758
               }
            },
            "location" : {
               "lat" : 35.6894875,
               "lng" : 139.6917064
            },
            "location_type" : "APPROXIMATE",
            "viewport" : {
               "northeast" : {
                  "lat" : 35.817813,
                  "lng" : 139.910202
               },
               "southwest" : {
                  "lat" : 35.528873,
                  "lng" : 139.510574
               }
            }
         },
         "place_id" : "ChIJ51cu8IcbXWARiRtXIothAS4",
         "types" : [ "administrative_area_level_1", "locality", "political" ]
      }
   ],
   "status" : "OK"
}
```

こんな便利な情報を吐き出してくれるのが*Google MapsのAPIさま*

これは例えばAirbnbの地図検索とかで使われてるよ〜って話してた。

## ワークショップ

[webhook](https://qiita.com/soarflat/items/ed970f6dc59b2ab76169)利用して、何か作ろう！
今回は、「フォームから入力を受け付けて、タスクボードにタスクを追加する機能」を作るよ！

*利用シーン*
Aさんにタスクを割り当てたいな〜〜。そうだ、「フォームから入力を受け付けて、タスクボードにタスクを追加する機能」を利用しよう！
→Aさんのタスクボードにタスクが追加される

### 利用するもの

* [wufoo](https://www.wufoo.com/)(入力フォーム作成)
* [zapier](https://zapier.com/)(Webhook)
* [trello](https://trello.com)(タスクボード)

![zu.png](https://qiita-image-store.s3.amazonaws.com/0/117615/6edb4cec-c5a2-1bb8-0334-b20442d849b7.png)


１）Wufooで無料アカウント作ってフォーム作ってください

https://www.wufoo.com/

2)zapierでトリガーとアクションを設定してください

https://zapier.com/

![zap.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/117615/e86a0607-1631-3541-82bb-45eadac125cd.gif)

３）ここまでだった

実はまだ試していない、かつワークショップではここまでで終わちゃった


## 話に出てたやつ

https://snazzymaps.com/
【連載】ピッコロボの「ピッコ」

#【連載】ピッコロボの「ピッコ」

# 始めに
Vstoneのピッコロボがかわいすぎるので、この子を少し改造させていただいて、他の市販のロボットに負けないロボットにしたいということで初めて行きたいと思います。

# ピッコロボとは
ピッコロボ（piccorobo）は、Arduino UNO互換機であるFreaduino UNOを搭載した入門用二足歩行ロボットです。 サーボモータ４つのシンプルな構成になっており、歩行や首ふり等の動作が可能です。二足歩行ロボットと言うわかりやすいデバイスを通じてプログラミングすることで、楽しみながらArduinoの扱い方やロボット制御を学習することができます。
（[Vstone株式会社様ホームページ参照](https://www.vstone.co.jp/products/piccorobo/)）


下記が私の持っているピッコです。
現在は、上目使いができるようになってます！
![snap_arduinofun_mm10_05.jpg](https://qiita-image-store.s3.amazonaws.com/0/192308/6f326387-bf05-d8e2-a451-49dc41556e51.jpeg)


# 構想
具体的にピッコをどのように成長させていくのか（ピッコロボは商品名なので、愛着がわくように私の持っているピッコロボの名前を「ピッコ」とします。）
1. ピッコの脳内をraspberryPIに入れ替える
2. ピッコとお話！
3. おいでッ！ピッコ！
4. ピッコが私の顔を覚えた！
5. ピッコが練り歩く
といった感じに次第に成長させていきたいですね！

#終わりに
ロボットに興味のある人はごく少数だと思いますし、ロボットに愛着をもてないという方がたくさんいるのは知っています。現に私の周りにも結構いますしね。(泣)
それでも、ロボット少しは興味ある！！という方も多く知っているので、この記事がロボットに触ってみよう！というきっかけの一つになってくれたらうれしいですね。
Azure のデータセンター。東日本から近いのは、東アジア？韓国南部？

#はじめに
Traffic Manager でアプリケーションを分散させる際、日本のデータセンターが両方NGになった場合を想定して、海外に1つ予備を建てる際、候補になりうるのは、東アジアと韓国南部。レイテンシー的に近い方を調べてみる。
#方法
Azure の場合(に限られるのかわからないが)、ping は利用できないので、pspingを使って調査。
#結果
| 場所            | 韓国南部  |    東アジア    |
|:-----------------|:----------------|:------------------|
| 東日本             | Minimum = 41.05ms, Maximum = 43.28ms, Average = 42.04ms|Minimum = 51.51ms, Maximum = 53.65ms, Average = 52.21ms|
| 西日本           |Minimum = 48.19ms, Maximum = 50.06ms, Average = 48.80ms| Minimum = 58.39ms, Maximum = 59.24ms, Average = 58.82ms |
| 川崎市内 (参考)             |Minimum = 44.21ms, Maximum = 45.46ms, Average = 44.68ms| Minimum = 55.26ms, Maximum = 59.04ms, Average = 56.86ms|
東アジアよりも韓国南部を使った方がよさそうという結果に。仮想マシンの価格も韓国南部の方が安価だし。App Service は微妙に、東アジアの方が安価だが、ほぼ変わらない。
more, less コマンド

この記事は [Linux コマンド 全部オレ Advent Calendar 2017](https://adventar.org/calendars/2630) の13日目の記事です。

# more

```
NAME
       more - file perusal filter for crt viewing

SYNOPSIS
       more [options] file [...]

DESCRIPTION
       more  is  a filter for paging through text one screenful at a time.  This version is especially primitive.  Users should realize
       that less(1) provides more(1) emulation plus extensive enhancements.
```
昔の less。今は使わなくてもよい


# less

```
NAME
       less - opposite of more

SYNOPSIS
       less -?
       less --help
       less -V
       less --version
       less [-[+]aABcCdeEfFgGiIJKLmMnNqQrRsSuUVwWX~]
            [-b space] [-h lines] [-j line] [-k keyfile]
            [-{oO} logfile] [-p pattern] [-P prompt] [-t tag]
            [-T tagsfile] [-x tab,...] [-y lines] [-[z] lines]
            [-# shift] [+[+]cmd] [--] [filename]...
       (See the OPTIONS section for alternate option syntax with long option names.)

DESCRIPTION
       Less  is  a program similar to more (1), but which allows backward movement in the file as well as forward movement.  Also, less
       does not have to read the entire input file before starting, so with large input files it starts up  faster  than  text  editors
       like  vi  (1).  Less uses termcap (or terminfo on some systems), so it can run on a variety of terminals.  There is even limited
       support for hardcopy terminals.  (On a hardcopy terminal, lines which should be printed at the top of the  screen  are  prefixed
       with a caret.)

       Commands  are based on both more and vi.  Commands may be preceded by a decimal number, called N in the descriptions below.  The
       number is used by some commands, as indicated.
```
ディスク容量を確認するコマンド。

## よく使いそうな使い方

```
[sinsengumi ~]# less file.txt
[sinsengumi ~]# ls -l /bin/ | less -N
```
`-N` で行番号を表示する。
has_many through の新規レコードを保存する時に気をつけること

Rails というか ActiveRecord で `has_many through` なモデルをさわっていてハマった事象があったので書きます。ただ、ハマりを回避する方法は分かっても、なぜそのような挙動になるかはまだ分かっていません。誰か教えてもらえると助かります。

## 前提

- Rails 5.x
- ActiveRecord

## モデル

```ruby
class User < ApplicationRecord
  has_many :articles
  has_many :game_users
  has_many :games, through: :game_users
  belongs_to :pinned_article, class_name: 'Article'
end

class Article < ApplicationRecord
  belongs_to :user
end

class Game < ApplicationRecord
  has_many :game_users
  has_many :users, through: :game_users
end

class GameUser < ApplicationRecord
  belongs_to :game
  belongs_to :user
end
```

<img width="687" alt="ER.png" src="https://qiita-image-store.s3.amazonaws.com/0/2152/41b00357-231d-6e10-2018-43d4f1a6315c.png">


User と Game が `has_many through` の関係になっています。そして、 User と Article が `has_many` になっています。また、 `User.pinned_article` で Article を `belongs_to` で参照しています。

## 親子関係をまとめて save

User を基点として親子関係をまとめて save しようと思い、以下のようなコードを書きました。

```ruby
# Game は予め作っておく
Game.create

u = User.new
a = u.articles.build
u.pinned_article = a
u.games << Game.last
u.save!
```

これを実行すると以下のような SQL が発行されます。

```sql
BEGIN

INSERT INTO `users` (`created_at`, `updated_at`) VALUES ('2017-12-15 02:24:44', '2017-12-15 02:24:44')
INSERT INTO `articles` (`user_id`, `created_at`, `updated_at`) VALUES (35, '2017-12-15 02:24:44', '2017-12-15 02:24:44')
INSERT INTO `game_users` (`game_id`, `user_id`, `created_at`, `updated_at`) VALUES (9, 35, '2017-12-15 02:24:44', '2017-12-15 02:24:44')
UPDATE `users` SET `pinned_article_id` = 32 WHERE `users`.`id` = 35
INSERT INTO `game_users` (`game_id`, `user_id`, `created_at`, `updated_at`) VALUES (9, 35, '2017-12-15 02:24:44', '2017-12-15 02:24:44')

COMMIT
```

一見上手く行っているように見えますが、最後の SQL でなぜか `game_users` に同じレコードが重複して INSERT されています。`User.pinned_article` の ID を反映するために、 INSERT 後に改めて UPDATE が走るのですが、なぜか関係のない GameUser の中間テーブルデータが改めて INSERT されています。

実際には、中間テーブルを作った場合重複データを防ぐために DB や Rails でユニーク制約を付けると思うので、SQL が失敗して ROLLBACK してしまいます。

```ruby
class GameUser < ApplicationRecord
  belongs_to :game
  belongs_to :user

  validates :user, uniqueness: { scope: [:game_id] }
end
```

### 期待した動きをするコード

以下のコードにすると期待したとおりの動きをします。違いは `User.games` に直接 append するのではなく、中間テーブルの GameUser を `build` して作成する所です。

```ruby
u = User.new
a = u.articles.build
u.pinned_article = a

# build をして作る
gu = u.game_users.build
gu.game = Game.last

u.save!
```

これで無事できました。基本は `build` 系を使っていくのが良いんですかね。

### `<<`

ちなみに ActiveRecord の `<<` は collection_proxy で定義されています。

```ruby
def <<(*records)
  proxy_association.concat(records) && self
end
alias_method :push, :<<
alias_method :append, :<<
```

- https://github.com/rails/rails/blob/a33e934697370892bfb0989cd9363465e9d3d783/activerecord/lib/active_record/associations/collection_proxy.rb#L1054-L1058

この `append` を実行すると、親の ID が確定していたら即時 INSERT が実行されます。 `save` とか必要ありません。


## なぜこうなるのか

ActiveRecord の動きを step 実行しながら追っていきました。が、結論、なぜそうなるのかは時間切れで解明できず…。無念。また時間を作って調査をしたいと思います。

`save!` で保存をする時に [save_collection_association](https://github.com/rails/rails/blob/a33e934697370892bfb0989cd9363465e9d3d783/activerecord/lib/active_record/autosave_association.rb#L387) が呼ばれるのですが、ここでなぜか最後に重複データが渡ってきてしまうという…。
電車が遅れたらGoogleHomeが教えてくれる

会社が電車の遅延情報を教えてくれる[アプリ](https://sites.google.com/view/tetsudo-ugoiteru/%E3%83%9B%E3%83%BC%E3%83%A0)をリリースしてるんですが、社内で電車(最寄り路線である京浜東北線)が遅れたら自発的に教えて欲しいという需要があったので簡単にではあるのですが対応してみました。

#概要
- Macで定期的に遅延情報を監視
- 遅延していたらBluetoothでGoogleHomeに接続
- SayコマンドでGoogleHomeを喋らせる
- Bluetoothを切る

正直GoogleHomeである必要も無いんですけどね…。
MacとGoogleHomeが別のネットワークにつながってる関係かつgoogle-home-notifierを使うよりも簡単だったからこれにしてみました。
ただメリットもあってBluetoothに接続した時にGoogleHomeから効果音が流れるので、いきなり喋られるよりは心臓に優しいです。そして意外とGoogleHomeを普段使ってない人からするとまったく別のソリューションであるのが分からないようです(声とか違うんですけどね)。

#MacとGoogleHomeをペアリングする
やり方は割愛するとしてMacとGoogleHomeをBluetoothでペアリングしておきます。
これによってMac側のBluetoothがONになると勝手にGoogleHomeにつながります。

#Macにm-cliをインストール
m-cliを入れることでコマンドからMacのBluetoothをOn/Off出来るようになります。

##構築方法等

```bash.sh
# インストール
$ brew install m-cli

# Bluetooth ON
$ m bluetooth enable

# Bluetooth OFF
$ m bluetooth disable
```

#コーディング
Mac上で遅延情報を監視し、変化に応じてsayコマンドでGoogleHomeを喋らせるサンプル。
Pushとか使うべきですねぇ‥。

```notify.rb
# sudo ruby notify.rb
require "open3"
require 'net/http'

def bluetooth_on()
  puts "Turn bluetooth on"
  o, e, s = Open3.capture3("m bluetooth enable")
  puts o
  puts e
  puts s
  sleep(15) # つながるまで待つ
end

def bluetooth_off()
  puts "Turn bluetooth off"
  o, e, s = Open3.capture3("m bluetooth disable")
  puts o
  puts e
  puts s
end

# 京浜東北線の遅延情報を返してくれるAPIを叩く。
# すいません、外部には公開してません…。
def keihin_touhoku_info()
  ret = Net::HTTP.get(URI.parse('https://XXXXXX'))
  puts ret
  ret
end

def main_loop()
  puts "Main loop in"
  old_delay_info = keihin_touhoku_info()

  loop do
    sleep(60 * 15)
    # sleep(10)
    new_delay_info = keihin_touhoku_info()
    puts "Check train old_delay_info: " + old_delay_info
    puts "Check train new_delay_info: " + new_delay_info

    if old_delay_info != new_delay_info
      bluetooth_on()
      Open3.capture3("say " + new_delay_info)
      bluetooth_off()
    end
    old_delay_info = new_delay_info
  end
  puts "Main loop out"
end

main_loop()
```

電車の遅延情報を返却するAPIは外部に公開できなかったので、もし個人で実装する場合には、[rti技研様のAPI](https://rti-giken.jp/fhc/api/train_tetsudo/)を使用するのが一番簡単ではないかと思います。
ちなみにサンプルコードで使用しているAPIは正常時には「京浜東北線の運行情報をお知らせします。京浜東北線は現在正常運行に戻りました。」異常時には「京浜東北線の運行情報をお知らせします。京浜東北線は人身事故の影響で上限線ともに運転を見合わせています。」のような文字列を返却してくれるAPIとなっています。

##まとめ
いかがでしたでしょうか？AppleとGoogleの夢のコラボ(？)は。
公式に自発的に喋れるような仕組みがあると色々便利だとは思うんですけどね！
それまでの一つの手段として如何でしょう？

#参考
https://rcmdnk.com/blog/2016/08/15/computer-mac/
今までにお世話になったGitの記事まとめ


#きっかけ
よくあるんですよねー、いい記事なのに忘れたりするパターン...
あくまで自分のメモがわりに載せるので気になったものはチェックしてみてください。

# 背景
チーム開発でのGitの使い方をまとめる機会があったので。。。


##全体
GitHubの開発フロー
https://qiita.com/KokiEnomoto/items/cc155ef12227a6bf3376


##ブランチ
作成するブランチの種類は以下の4つです。

- master
- develop
- feature
- fix

### master
このブランチはリポジトリが作成された時に自動で作成されるブランチ。
開発が終わったプログラムを乗せるために利用する。
バグがあってはならない。

### develop
このブランチは開発時に利用される。機能の追加をする時にはこのブランチからfeatureブランチを切る。
featureブランチで機能実装が終われば、そのブランチをdevelopブランチにマージする。

### fix
developブランチにマージされたコードにバグがあッた場合、developブランチからこの種類のブランチを切る。

##開発の流れ
ここではGithubでの開発の流れを説明する。

1. リポジトリを作成する。この時にmasterブランチが同時に作成される。
2. developブランチを作成する。
3. featureブランチを作成して機能実装を行う。
4. 機能実装が終わり次第、featureブランチからdevelopブランチへのプルリクエストを作成する。


## 機能追加

1. developブランチからfeatureブランチを切る
2. featureブランチで機能開発
3. 機能が完成したらdevelopへのプルリクエストを作成
4. プルリクエストが承認されたらfeatureブランチの削除

## バグ修正

1. developブランチからfixブランチを切る(e.x fix/header)
2. バグ修正
3. 修正が終わったらdevelopへのプルリクエストを作成
4. プルリクエストが承認されたらfixブランチを修正

##コミットメッセージ

gitのコミットメッセージの書き方
https://qiita.com/itosho/items/9565c6ad2ffc24c09364

gitのコミットメッセージの変更
https://qiita.com/piruty/items/2fbfd26fd8dcbfed592a

gitのコミットメッセージの変更(過去のものも)
https://www.backlog.jp/git-guide/reference/log.html

#参考文献
https://qiita.com/KokiEnomoto/items/cc155ef12227a6bf3376
https://havelog.ayumusato.com/develop/git/e513-git_branch_model.html
redmine と github 連携について

# redmine と github の連携について
業務上、redmine で github のコミットとチケットを関連付ける必要が出てきたため、その設定方法の備忘録を記載する
## redmine の構築
docker で構築する。公式で docker のイメージと構築方法が記載されている。私は docker-compose を用いて構築。
[docker/redmine](https://hub.docker.com/_/redmine/)

## github のプラグインインストール起動
プラグインのインストールは (https://qiita.com/n_slender/items/54cd282c140fadbbb322) を参考

1 redmine のコンテナに入る。

```
$ docker exec -it <name> /bin/bash
$ cd plugins 
```

2 必要なパッケージをインストール
gcc とか入っていないので apt-get install で入れる
* デフォルトだと apt-get ができないので何か update する必要があった気がする...

```
# apt-get install gcc ruby-dev sudo
```

3 github プラグインのインストール

```
# cd plugins
# git clone https://github.com/koppen/redmine_github_hook
```

4 ホストから redmine のコンテナを再起動

```
# docker restart redmine_redmine_1
```

管理 -> プラグインに Redmine Github Hook plugin があれば OK

## 管理対象のリポジトリを登録
ほぼ  (https://qiita.com/n_slender/items/54cd282c140fadbbb322) を参考いただければ良い。ただし、 git clone する際はリポジトリの所有者を redmine( redmine を実際に動かすユーザー) にする必要があるため下記のようにすること。
あと、Webhook は使わず ローカルから定期的に fetch を実行して更新したいため、 --bare ではなく --mirror を用いる。

```
# cd <repos_directory>
# sudo -u redmine git clone --mirror https://github.com/<your_repository>.git
```

これで redmine のリポジトリから正しくパスを指定することで見れるようになるはず。

リポジトリを更新したい場合は

```
# git fetch --all
```

とすること。
ブランチがリモートと同期せず、ローカルに残り続けるので -p オプションを推奨

```
# git fetch -p
```

cron に記述すれば好きな頻度で更新できる。
Visual Studio for Mac にPrism Template Packを導入する。


## 手順

基本的には、[https://github.com/PrismLibrary/Prism-Extensibility/issues/1](https://github.com/PrismLibrary/Prism-Extensibility/issues/1)に書かれているとおりでよい。


1. "Visual Studio Community"メニューから「拡張機能...」を選択。

![スクリーンショット 2017-12-15 15.04.54.png](https://qiita-image-store.s3.amazonaws.com/0/20722/941993d4-6a24-ae46-8384-936d01896e81.png "スクリーンショット 2017-12-15 15.04.54.png")



2.「ギャラリー」タブを選択し、「リポジトリ」ドロップダウンリストから「リポジトリの管理」を選択。


![スクリーンショット 2017-12-15 15.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/20722/bce16099-9b1c-9221-492e-86c175e1b77e.png "スクリーンショット 2017-12-15 15.05.38.png")




3.「追加」ボタンを押すと、ダイアログが表示されるので、「URL」欄に```https://prism.azureedge.net/main.mrep```を入力して「OK」。


![スクリーンショット 2017-12-15 15.05.51.png](https://qiita-image-store.s3.amazonaws.com/0/20722/55f42c93-d743-02e5-ef94-071a65cca9b4.png "スクリーンショット 2017-12-15 15.05.51.png")



4."prism.azureedge.net"にチェックが入っているのを確認したら「閉じる」。


![スクリーンショット 2017-12-15 15.06.04.png](https://qiita-image-store.s3.amazonaws.com/0/20722/5e71a389-e6fe-9590-d827-81a324a46f99.png "スクリーンショット 2017-12-15 15.06.04.png")



5.「拡張機能マネージャー」ダイアログの右上にある検索ボックスに"Prism"と入力すると"Prism Template Pack"が見つかるので、選択して「インストール」する。


![スクリーンショット 2017-12-15 15.06.32.png](https://qiita-image-store.s3.amazonaws.com/0/20722/a6060a6c-eb37-c69e-5328-07c40ef7a943.png "スクリーンショット 2017-12-15 15.06.32.png")

6.「ファイル」メニューから「新しいソリューション(S)...」を選択して、マルチプラットフォーム：アプリのところに"Prism Unity Pack"が表示されればOK。


![スクリーンショット 2017-12-15 15.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/20722/aea4a945-9729-8d99-c7f1-33d0cfcc6dea.png "スクリーンショット 2017-12-15 15.28.54.png")



![スクリーンショット 2017-12-15 15.15.07.png](https://qiita-image-store.s3.amazonaws.com/0/20722/df9ce10f-b31f-a412-e2cf-64640ed10a85.png "スクリーンショット 2017-12-15 15.15.07.png")
はじめての Pull Request

# はじめに
- GitHub 上には、たくさんの素晴らしい Open Source Product があります
- それらの document には、結構な頻度で typo やコピペミスなどを見かけます
- 些細なことだし、なんて言わずに貢献してみましょう
- Pull Request の方法については他の方々のわかりやすい記事がたくさんあります
    - でも、実際の Open Source Product に対して出してみたので、あえて書いてみました
    - 対象は [Asciidoctor](https://github.com/asciidoctor/asciidoctor) という、文書作成 tool の README 部分です

# 手順
## 対象の repository を Fork する

<img width="433" alt="fork.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/b616522c-974d-af06-65c8-2f7fa1d1f96b.png">

## Fork した repository 上で編集
### clone
```bash
$ git clone "Fork した repository"
```

### branch 作成と checkout
- この例では "modifytypo" という名前にした

```bash
$ git checkout -b modifytypo
```

### 編集して、該当の branch を commit, push
```bash
$ git add .
```

```bash
$ git commit
```

```bash
$ git push origin modifytypo
```

## Pull Request の作成開始
### 自分の repository 上で、 "Compare & pull request" を押す

<img width="1009" alt="create_pull_request.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/4988488e-4781-ff22-a30f-d65dac47d960.png">

### Comment を記入して、 Pull Request を作成
- 画面の下のほうで、修正点を確認する

<img width="1030" alt="check_diff.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/603458ea-2a56-4d3f-fab9-6e4185001651.png">

- Comment 入力後、 "Create pull request" を押して Pull Request を作成

<img width="1012" alt="open.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/bd3c199b-5fb1-b108-d251-81638b8cef98.png">

## 作成された Pull Request
- こんな感じで、 committer の check 待ちになります

<img width="1000" alt="created.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/427e6c6a-a6cd-f530-5b54-95f938c65887.png">

## Merge された Pull Request
- この記事を書いてる間に、 Pull Request が採用されてました。早い！

<img width="1023" alt="merged.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/cc4e94bc-ee26-ded9-b1e8-afe1254b4015.png">

# まとめ
- Pull Request を作成するのは、思った以上に簡単です
- Code への貢献は敷居が高いかもしれませんが、 typo の修正などは誰でもできます
- 自分のできる範囲で、多くの人が使う Open Source Product に貢献できたら素敵ですね
- あと、自分が Contributors として表示されると、何となくうれしいですよね

<img width="1001" alt="contributors.png" src="https://qiita-image-store.s3.amazonaws.com/0/100115/cb236dcf-56d2-2a87-6a90-cd936e85aca5.png">

# 参考
- [【GitHub】Pull Requestの手順 - Qiita](https://qiita.com/Commander-Aipa/items/d61d21988a36a4d0e58b)
仮想仔猫ゲーム CryptoKitties のコントラクト解読その２

仮想仔猫ゲーム CryptoKitties のコントラクトを読んで気になった箇所を共有したい

## Solidity でのインタフェース定義方法
- Solidity の言語仕様の一部ではありますが、ドキュメントを全部モラできてないので気づかなかった
- 仕様としては簡単で、関数のパラメータと戻り値などのメタ情報だけ定義して、実行する本体を入れてなければ、それがインタフェースになる
- たとえ下記の単にインタフェースがあるコントラクトの場合、browser-solidity　でデプロイしようとしたら、できませんでした。

```javascript

pragma solidity ^0.4.0;

contract Cat {
    function color() public constant returns (string);
}

// エラー内容
This contract does not implement all functions and thus cannot be created.
```

- インタフェース定義しているクラスを継承し、実際の関数本体を定義しておけば、正常にデプロイできる

```javascript
pragma solidity ^0.4.0;

contract Cat {
    function color() public constant returns (string);
}

contract BlackCat is Cat {
    function color() public constant returns (string) {
        return "Black";
    }
}
```

## 実装を隠す方法
- ブロックチエーンなので、全てのデータが全世界に公開される。その場合、仮想仔猫ゲームで言うと、仔猫の遺伝子を生成するロジック、要するに、どのような外観の親がどのような外観の仔猫を生まれられるかの部分公開したくないので、それの実現方法です。

1. 仔猫を生成するロジックは、`geneScience`という外部コントラクトに任せる
2. 権限を持っている人だけ、`geneScience`に外部コントラクトのアドレスを設定できる

- こうして仔猫の生成ロジックを隠しています。賢い！
- 厳密に言いますと、完全に隠しているわけではなく、その設定されている値を見えれば、遡って指しているコントラクトを見つけるのは、できるじゃないかと思います。

```javascript

...
GeneScienceInterface public geneScience;
function setGeneScienceAddress(address _address) external onlyCEO {
    GeneScienceInterface candidateContract = GeneScienceInterface(_address);

    require(candidateContract.isGeneScience());

    // Set the new contract address
    geneScience = candidateContract;
}

// 仔猫の生成処理の中で、`geneScience.mixGenes(...)`を呼び出している
...
```
3年前、はじめて開発したサービスアプリに今からCleanArchitectureを導入してみたい話。

こちらはDMM.com #1 Advent Calendar 2017 17日目の記事です。
前日の記事は@mt0mさんの [E2Eテストの導入から学んだこと](https://qiita.com/mt0m/items/7e18d8802843d9f60d28) でした。

カレンダーのURLはコチラ
[DMM.com #1 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm)
[DMM.com #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/dmm2)

# はじめに

CleanArchitecture と題していますが、感想メインであり、CleanArchitecture のノウハウは学べません。
導入してみたいなと思ってつまずいた点などをいくつか上げてみようと思います。
ただ書き殴っているだけです！

## なんとなく雰囲気だけ使ってみる

3年ほど前、初めて任されたサービスのiOSアプリがあったのですが、私は神ViewControllerは悪だと聞いていたので、
別の神クラスを作っていました。当時はコードレビューとかも特になく、受け入れテストが通ればOK!と言った雰囲気だったので誰にも指摘されることなく・・・。

保守の担当は社内を転々としていたのですが、WebAPIのリプレイスに伴うアプリ改修の話が私の所属するチームに話が回ってきたので、
じゃあちょっと練習がてら、CleanArchitectureを参考にして書き換えられる部分を書き換えてみましょうという話になりました。

## サンプルアプリのシンプルさに騙される

CleanArchitectureだけに言えることではないのですが、View、ロジック、データ などのレイヤーに明確に分けることによって
保守性を高めていると思うのですが、このまず、レイヤーに分けるというのがなかなかうまく行きませんでした。

QiitaやGithubなどでいろいろ参考にさせていただきましたが、
サンプルなので、そもそものアプリの使用が単純で、以下の点に躓きました。

- サンプルはAPIから取得するデータと、ローカルに保存するDataの構造がほぼ同じ。
  - 実際のプロダクトはそうとも限らない。
- 構造が違うデータの吸収をどのクラスで行うかがわからない。
  - 構造が違うデータのエンティティは別に扱うべきなのか迷った。（あげく、混在した。）
- UseCaseの使い方がわからなくて、既存の処理をそのまま書き写すだけになった。
  - とはいえクラスが増えた分ファイルごとの行数は減ったので見通しは良くなった。


やはり自分たちのプロダクトに落としたときどうすべきかというのは、一朝一夕でわかるものではなく、
ビジネスの分析の段階からの着手と、試行錯誤が必要なんですね。

## 結局、この処理どこに書くの？になる

Push通知の制御など、OSの機能や、他のライブラリに依存した機能を書くとき、
どこに書けば良いのかわからなくなってしまいました。

今回は、 `HogeHogeService` というようなクラスを作り、機能毎にまとめてみましたが、
もしかしたらこれも、UseCaseとかで良かったのかもしれません。

## Androidの処理内容との比較はしやすかった

仕様が少し変わったときや、要望が増えたときなどに、
AndroidとiOSの細かい実装をすりあわせるのに、設計アーキティクチャが統一されているというのはやりやすかったです。
私はAndroidの開発はあまりやらないのですが、Androidの実装を確認したいとき、
自分の追いたい処理がどのファイルを見ればいいかを把握するのにかかる時間は体感的に少なかったと思います。

## Rxはできればあった方がやりやすそう

iOSを担当するメンバーの1人が、まだ開発に慣れておらず、またRx経験も無かったため、
足並みが揃わない方がリスクになると考え、iOSに関してはRxの導入はしないことになりました。

ただ、Rxが無いと、Delegate地獄や、Blocks地獄になってしまいうので、
ただでさえコード量が増えるのに、さらにコードを書く量が増えます。

## Swiftの方が書きやすい

これも、Rxの件と似たような理由になりますが、
クラスが増えて、ヘッダも増えるので、書くコード量だけで言えば、Swiftに移行できるところをしながらやっていった方が
やりやすかったかもしれません。（そうした部分も多々ありました。）
おそらくモダンな書き方ができる言語のほうがいろいろと向いています。

Swiftが書きやすいというより、Objective-Cに向いていない設計をしていただけかもしれません。
Objective-C自体はちょっと変態的なところもありますが、素晴らしい言語です。

# 最後に

結果的に見れば、CleanArchitectureを導入できたかというと、おそらくそれはできていません。
しかし、一つのクラスにすべてのロジックが書かれていて、それが複雑に絡み合っている。
というよくありがちな問題自体は解決したように思います。

また、何か新しいやり方やってみよう！ということでメンバーの士気も上がっていたと思うので、
そういった結果を考えれば、やってみたこと自体は悪くなかったと思っています。

次はもっとうまくやれるはず。
エンジニアリングと対話。あるいはふたご座流星群を見上げた夜。

[LIGのアドベントカレンダー](https://qiita.com/advent-calendar/2017/lig)15日目の記事です。
本来予定していた『corebootなマシンでLFSチャレンジ（仮）』ですが、やむを得ない諸事情により記事にする事が出来なくなってしまい代わりに本記事を掲載させて頂く事をご了承ください。

---

## 会話と対話
まずは、この記事における『会話』と『対話』について下記のように定義する。

- 『会話』日常生活における他者とのコミュニケーション手段
- 『対話』他者と思考の疎通を図る行為


## 会話について
私は会話が苦手だ。
気の利いたジョークも言えなければ、惹きつけるようなストーリーを語る事もできない。
二人きりであれば少しは誤魔化す事も出来るが、複数人での会話は本当に難しい。
発言のタイミングを見計らっているうちに次の話題に移ってしまっている。
他者と接触する事は嫌いではないのだけれど、うまく会話をする事ができない事がとても悩ましい。

## 対話について
私は『エンジニアリングは対話である』という思想のもと開発をおこなっている。
ブラウザやサーバと対話を試みる事が私にとってのエンジニアリングの根幹になっている。

私は彼女達（ブラウザやサーバ）を愛している。
だからこそ彼女達を理解したいと考えているし、彼女達に「どうしたいのか・どうして欲しいのか」という想いを伝えたいと考えている。
プログラミング言語を介して想いを伝える行為は、まさに対話ではないだろうか。


## 愛をもって接すること
コードを書く時は、愛する人へのラブレターを綴るような気持ちで丁寧に書くようにしている。

それは彼女達（ブラウザやサーバ）への愛はもちろんのこと、プロジェクトメンバーへの愛も大切にしたいと思っている。
だから、気をつけなければならないのはポエミーになりすぎない事。
私はロマンティストなのでどうしてもポエミーなコードを綴りそうになってしまうのだけれど、ポエミーな文章は多くの対話において理解の妨げになってしまう事が殆どなのだ。

プロジェクトメンバーに伝わりやすいメッセージとなるように、いつも心がけるようにしたい。


## おわりに
エンジニアリングにおける対話の重要さを共感できる誰かがいる事を、私は願っている。
Visual Studio Codeに.RmdファイルをMarkdownと認識させる

たぶん[R support for Visual Studio Code](https://github.com/Ikuyadeu/vscode-R)を使った方が便利なんだろうなあと思いつつ、やり方を調べてみたのでメモ。

参考：https://code.visualstudio.com/docs/languages/overview#_adding-a-file-extension-to-a-language

`files.associations`という項目を設定すればいいらしいです。Ctrl+,でユーザ設定を開いて、以下を追加すれば.Rmdという拡張子はMarkdownだと認識してくれるようになります。`Markdown`じゃなくて`markdown`な点に注意。

```json
{
    ...
    "files.associations": {
        "*.Rmd": "markdown"
    }
}
```
Maya | モデリングツールキットの移動・回転・スケール設定を取得する

# 移動設定
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/52118/633689f7-8409-c82f-9ef3-83a5d18970bb.png)

```py
import maya.cmds as cmds

cmds.manipMoveContext('Move', query=True, mode=True)
```
オブジェクトは0、ワールドは2になる。

# 回転設定
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/52118/ffe840f1-ba2d-a067-b3e8-ee3f64f11f31.png)

```py
import maya.cmds as cmds

cmds.manipRotateContext('Rotate', query=True, mode=True)
```
オブジェクトは0、ワールドは1になる。

# スケール設定
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/52118/545f9929-e972-e716-49c8-fb9983f7e818.png)

```py
import maya.cmds as cmds

cmds.manipScaleContext('Scale', query=True, mode=True)
```
オブジェクトは0、ワールドは2になる。
UnityでAndroidをビルドしたときに勝手にREAD_PHONE_STATEが付与される

# 背景

某SDKを導入したり、自分で書いたnative pluginを導入した際に、なぜかREAD_PHONE_STATE権限が付与されてしまってハマった。

# 要因

AndroidのBuildToolsが26.0.2以上でビルドした際に発生

# 原因

新しいBuildToolsでは、AndroidManifest.xmlが複数あったときにmergeする時の挙動が変わった.

- https://issuetracker.unity3d.com/issues/android-read-phone-state-permission-is-added-in-the-androidmanifest-dot-xml-file-using-latest-26-dot-0-2-sdk


minSdkVersionとtargetSdkVersionの両方の指定がないと勝手にREAD_PHONE_STATEなどの下位互換性を保つための権限が付与される。

- https://developer.android.com/reference/android/Manifest.permission.html#READ_PHONE_STATE

この挙動自体は正しく、いままでよりAndroidManifestの指定が厳格になった感じらしい。

## 対処

```diff
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+  <uses-sdk android:targetSdkVersion="26" android:minSdkVersion="19" />
  <application>
  </application>
</manifest>
```
uses-sdkで各AndroidManifestにtargetSdkVersionとminSdkVersionを指定してあげることで回避した。
dust と dustless send

# Bitcoin ブロックチェーンにおける dust とは

Bitcoin は言うまでもなく BTC (satoshi) という数量をやり取りするための存在です。
Counterparty は Bitcoin ブロックチェーンが当初想定しなかった応用なので、Bitcoin による制約をいくつか受けます。

dust は代表的な制約でした。(過去形にした理由は後述します)

Bitcoin ネットワークへの攻撃を行う最も簡単な方法は、トランザクションを mempool に大量に放り込むことです。
(昨今の送金手数料高騰の原因となっているトランザクション混雑を見れば明らかですね)

送金手数料 0 でかつ 0 BTC の送金トランザクションを大量に投げ込むと、容易に Bitcoin ネットワークを崩壊させられます。
その事態を防ぐため、2つの対策が取られています。一つは送金手数量の下限設定、もう一つは最低送金量の設定です。
この最低送金量を Bitcoin 用語で dust (塵)と呼びます。

# Counterparty と dust

価値交換システムである Bitcoin で 0 BTC を送るはずがないので、Bitcoin としては正しい判断なのですが、Counterparty とっては少し困った事になります。
トークンを送信する場合、トランザクションにトークンの情報だけでなく dust も含めなければいけません。
つまり、送信先に、トークンだけでなく極微量の BTC が渡されます。

dust の量は一定なので、長い時間軸で見れば損得無いようにも思えます。
しかし、オフチェーンの取引所/販売所で他の仮想通貨やfiatから購入した場合には微妙です。
顧客がトークンを買ってウォレット移したら微量とはいえビットコインがおまけでついてくるわけですから。
ビットコインも高値になってきて、微量とは言えそれなりの金額(数十円)にもなります。

# dustless send

そこで、2017 年 10 月の Counterparty アップデートで、dustless send という仕組みが追加されました。
[CIP-9](https://github.com/CounterpartyXCP/cips/blob/master/cip-0009.md) に含まれており全体では Enhanced Send [^future]という名前がついています。

[^future]: 将来再拡張が必要になったときにどう命名するのか考えていないっぽい…

その実現方法は、要約すると下記のようなものです。

* Counterparty の send メッセージに、トークンの送り先を含める
* トランザクションには自分から自分への送金を行う (送金手数料の分だけ減らす)
* Counterparty server は Bitcoin トランザクションの送金先ではなく、メッセージ中にある送り先に送ったと解釈する

力技感が溢れる感じですが、確かに dust はトークン送付先に漏れずに済んでいます。

勘の良いかたは気づいたと思いますが、Enhanced Send のトランザクションは、Counterparty 非対応のエクスプローラで見ると、
誰に送金したのか判別つきません。

# 送金手数料は相変わらず

残念ながら Enhanced Send は Bitcoin の最大の課題である送金手数料の高騰を抑えられません。
CIP よると SegWit の利用なども計画にあるのですが、道程は長そうです…
ASRock Z370 Pro4 に CentOS-7 をインストール

新しいデスクトップPCを購入しました。

マザーボード: ASRock Z370 Pro4 
CPU: Intel Core i7-8700k
メモリ: 32GB

さっそく CentOS-7 をインストールしましたが、ネットワークカードを認識しませんでした。
結論としては、ドライバ e1000e の新しいバージョンを組み込む必要がありました。

カーネルに最初から組み込まれているモジュール

```
$ sudo lsinitrd /boot/initramfs-3.10.0-693.11.1.el7.x86_64.img | grep e1000e
-rw-r--r--   1 root     root            7 Nov 17 17:17 etc/modules-load.d/e1000e.conf
drwxr-xr-x   2 root     root            0 Dec 15 10:36 usr/lib/modules/3.10.0-693.11.1.el7.x86_64/kernel/drivers/net/ethernet/intel/e1000e
-rw-r--r--   1 root     root        92972 Dec  5 09:43 usr/lib/modules/3.10.0-693.11.1.el7.x86_64/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko.xz
```

新しくモジュールをコンパイルしてインストールした後

```
$ sudo lsinitrd /boot/initramfs-3.10.0-693.11.1.el7.x86_64.img | grep e1000e
-rw-r--r--   1 root     root            7 Nov 17 17:17 etc/modules-load.d/e1000e.conf
drwxr-xr-x   2 root     root            0 Dec 15 14:44 usr/lib/modules/3.10.0-693.11.1.el7.x86_64/updates/drivers/net/ethernet/intel/e1000e
-rw-r--r--   1 root     root       404584 Dec 15 14:44 usr/lib/modules/3.10.0-693.11.1.el7.x86_64/updates/drivers/net/ethernet/intel/e1000e/e1000e.ko
```

インストール手順

```
$ tar zxf e1000e-3.3.6.tar.gz
$ cd e1000e-3.3.6/
$ cd src/
$ vi nvm.c
```
```c:nvm.c
/**
 *  e1000e_validate_nvm_checksum_generic - Validate EEPROM checksum
 *  @hw: pointer to the HW structure
 *
 *  Calculates the EEPROM checksum by reading/adding each word of the EEPROM
 *  and then verifies that the sum of the EEPROM is equal to 0xBABA.
 **/
s32 e1000e_validate_nvm_checksum_generic(struct e1000_hw *hw)
{
        return 0;
}
```

```
$ make
$ sudo make install
$ sudo rmmod e1000e
$ sudo modprobe e1000e
$ sudo depmod -a
$ sudo dracut -f -v
```

最後、dracut でイメージも更新しておくことで、次回マシン起動時にも新しいほうのドライバが読み込まれます。
Swapを使ってるプロセスを探す


Swapを使っているプロセスと使用量を使ってる順に表示

```shell
$ grep VmSwap /proc/*/status | sort -k 2 -nr
```

Swapを使っているプロセスをpsで調べるワンライナー

```shell
$ grep VmSwap /proc/*/status | sort -k 2 -nr | cut -d"/" -f3 | grep -e '^[0-9]*$' | xargs -I{} ps u -p{} --no-headers
```

現実的には上の幾つかのプロセスを再起動なりしてあげるとSwapが開放されるでしょう。
Amazon Echoから送金指示する→Ethereum上で寄付できる！


未完です。すみません。すみません。

# やりたいこと

- スマートコントラクトを実行したい
	- 実行者(機械、プログラム)自身がウォレットを持たずに。
- 選んだユースケース
	- amazon echo から音声指示
	- コントラクトアドレスで寄付を受け付けるALICEに寄付する
		- http://donationsapp.alice.si/geek-mode/

## 実装方針
- 基本機能は、lambdaで
- OAuthのAPIと送金指示のAPIを持つウォレットを外部に用意
	- bitgoを利用
- アレクサスキルを触ってみる
	- アカウントリンク機能
	- lambdaとの連携

## 他案
- lambda上にウォレット(鍵)を持つ必要があるかもしれない
- ウォレットやライブラリの選定
	- MyEthWallet
		- APIが貧相
	- blockoneID
		- OAuthない

このくらいを想定して手をつけ始めました。

## alexaの情報収集
- https://developer.amazon.com/ja/alexa-skills-kit/training/building-a-skill
	- だいたいこれで用が足りる
- 必要なこと
	- amazon 開発者コンソールで、アレクサスキルの開発
	- AWS console でlambda の開発
	- s3との連携
		- lanbda の関数コードは、bitgo, alexa-sdkでだいぶん大きくなるので、zipにしてs3からlambdaへ
- 注意
	- 第5回のアカウントリンク機能のテストにおいて、説明が飛んでいるが、iphoneなどのalexaアプリに、アレクサスキルの開発を行っているアカウントでログインすると
	- 有効なスキルにDEVスキルというタブがあるので、そこで公開していないスキルもアクセスできる
	- ここでアカウントリンク(OAuth)の動作及びテストを行える
	- サービスシミュレータはアカウントリンク機能には未対応

## bitgoの情報収集
- https://www.bitgo.com/api/v2/
	- API v2
	- eth扱える
	- 日本語訳コミットしたい
- https://bitgo.github.io/bitgo-docs/
	- API v1
	- OAuthはv1を踏襲している
	- 日本語もある
		- https://bitgo.github.io/bitgo-docs/ja/index.html
- テスト環境
	- https://test.bitgo.com/login
	- テスト環境では、webインターフェースでethが扱える(TETH表記)
	- ethereumのネットワークは、kovan-testnet
- Ethの扱い
	- ethereumはウォレット作成からfeeが必要なので、アカウントにダイレクトにひもづくEnterprise(組織、くらいの意味)の設定をし、残高を持つ必要がある
- 注意
	- kovan-testnetでのethの取得
		- https://github.com/kovan-testnet/faucet
		- Icarus Faucet
			- parityをインストールし、productionでアカウント認証をすると、testnetのethをもらえる
			- が、ここが大変
                            - parityのインストールからproduction　との同期→半日以上かかる
                            - productionでのアカウント認証に、リアルなEthが必要
                            - ハマるので避けるが吉
		- Gitter Channel
			- こちらにbotがいるので、アドレスを発言するとethをくれる。
	- OAuthのclient_idの取得
		- ここで止まっている。webインターフェースにOAuth設定の項目がありそうなものだが、見当たらない。
		- __問い合わせ回答待ち__
Qiitadonに自動ログインするどん

# Qiitadonに自動ログインできない
ブラウザを閉じるたびにログイン画面が出る。
Qiitaアカウントでログインしないと入れない。

といった具合で少々不便に感じていましたが
APIを使う際にパスワードが必要になり
結果的に解決したと言うわけです。

# 問題
おそらくQiitadonログイン時にセッションCookieが焼けているのだと思います。

自動ログインするためのCookieを焼く記事です。

スマホWebにも有効で
PWAによる毎度ログイン画面が表示される問題にも対応します。

# 設定

[設定画面](https://qiitadon.com/settings/profile)から
ユーザー設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150940/5190bda9-1313-13e7-b701-5ac35b5aae89.png)

セキュリティ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150940/faed4db8-01d5-9bb4-963e-d88fd7baeb36.png)

新しいパスワードを設定
現在のパスワードは空
変更を保存
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150940/793caf8d-6d9f-25fc-d250-0b7d710d06e5.png)

その後ログアウトを行い
設定したメール/パスワードでログインすれば自動ログインすることができます。

Have a nice Qiitadon.
＼ﾁﾝｯ／
　🍪
　🔥
Nexusに最新のOSのシステムイメージを入れる

## はじめに
2017/12/5に[Android  Developer Blog](https://android-developers.googleblog.com/2017/12/welcoming-android-81-oreo-and-android.html)にて、Android 8.1がリリースされたので、Nexus 5XをOSアップデートしました。

## 環境
* macOS
* Nexus 5X

## 注意
この方法を行うとシステムイメージをインストールした際に、<font color="Red">端末内のデータがすべて消えてしまう</font>。
なので、アップデートを行う前に必ずバックアップを取ること。

## 準備
* 最新のAndroid SDK Platform-Toolsをインストール済み
* Android SDK Platform-Toolsへのパスを通す
* 端末の開発者オプションからUSBデバックを有効

## 手順

### 1. システムイメージをダウンロード
以下のサイトから任意のシステムイメージをダウンロードし、zipファイルを解凍する
https://developers.google.com/android/images?hl=ja

今回は、Nexus 5Xの8.1.0を選択

### 2. 端末をfastbootモードにする
端末とPCをUSB接続して、以下のadbコマンドを実行

```bash
adb reboot bootloader
```
もしくは、電源OFFの状態で、音量ボタン（小）を押しながら電源をONにすることでも可能

### 3. 端末のbootloaderのロック解除
以下のfastbootコマンドを実行

```bash
fastboot flashing unlock
```

### 4. OSのインストール
1で解凍したディレクトリ内にある、```flash-all```スクリプトを実行

```bash
./flash-all.sh
```

### 5. 端末のbootloaderをロック
fastbootモードの状態で、以下のfastbootコマンドを実行

```bash
fastboot flashing lock
```


## 参考
* [Factory Images for Nexus and Pixel Devices](https://developers.google.com/android/images?hl=ja)
Debian Sourcesというサイトができました

# TL;DR

[Debian Sources](https://sources.debian.org/) [https://sources.debian.org/](https://sources.debian.org/)というサイトができました。ローカルにダウンロードすることなく、Debianパッケージのソースコード検索、閲覧ができます(ソース検索部分は[Debian Code Search](https://codesearch.debian.net/)を利用)。
debianがアーカイブとして記録しているバージョンが対象なので古いものも閲覧できます。

## インターフェース

通常のWeb操作以外に、[API](https://sources.debian.org/doc/api/)が使えるようになっています。

パッケージ名検索と、パッケージ名prefixからの一覧選択ができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/31714/3570b5aa-7a2b-f9ed-f90c-57b090ce9cf7.png)

### copyrightファイルの閲覧

[https://sources.debian.org/copyright/](https://sources.debian.org/copyright/)にアクセスすれば、copyrightに限った閲覧ができます。パッケージ名がわかっていてcopyrightだけ見たいという時に、いちいちdget等でソース取得・展開をしなくてすむようになりました。

### パッチの閲覧

[https://sources.debian.org/patches/](https://sources.debian.org/patches/)にアクセスすれば、Debian固有のパッチ(debian/patchesにまとめられているもの)を閲覧できます。

## おまけ: debian.orgとdebian.netの違い

debian.orgドメインのサービスはDebian公式のものです。debian.netはDebian keyringに登録されている利用者(Debian開発者、メンテナー)が利用できるドメインです。
どんなサービスが動いているかは[Debian WikiのDebianNetDomains](https://wiki.debian.org/DebianNetDomains)に記されています。
sshfsがmacOS High Sierraにしたら動かなくなった件の対応


普段Raspberry Piのリモート作業にsshfsを利用しています。個人的にはオススメです。

MacをHight Sierraにアップデートしたら動かなくなったのでメモです。

```
Installed version of macOS unsupported

The installed version of FUSE is too old for the operating system. Please upgrade your FUSE installation to one that is compatible with the currently running version of macOS.
```

![](https://i.gyazo.com/556790712c77cc7b3c79cbb43568cfd2.png)


* https://github.com/osxfuse/osxfuse/issues/422
* https://github.com/osxfuse/osxfuse/issues/421
* https://github.com/osxfuse/osxfuse/wiki/FAQ#23-how-can-i-uninstall-fuse-for-os-x

~~システム環境設定から一度アンインストール~~ `Update Fuse`からアップデートするだけで動きました。

![](https://i.gyazo.com/550e829a9e4d7a74da77d9a25a65c932.png)

3.5.5 -> 3.7.1になりました。


順調順調

![](https://i.gyazo.com/2c1f4ea9013cc511aa2c5aeddef3b379.png)
Assets.xcassetsの画像サイズ一覧

#Xcode 9.xのAssets.xcassetsで必要とされる画像サイズ一覧
最近、Xcode 9.xを使い始めたけど、相変わらずXcodeのAssets.xcassetsで必要とされる画像サイズ一覧で見易いものが見当たらなかったので自分で作ってみた。
一覧表の表記順と現状のXcode(9.2 9C40b)のAssets.xcassets編集画面の並び順が同一になるようにしてあるので判りやすいのではないかと…

##AppIcon
![スクリーンショット 2017-12-15 14.00.17.png](https://qiita-image-store.s3.amazonaws.com/0/148717/993ac4ce-4df4-e706-b971-adc3e8794828.png)

###iPhone アイコン
|Xcodeでの表記| 対象OS|表示サイズ|@(倍率)|画像サイズ|
|:------------------|:-------|:--------|:--|:--------|
|iPhone Notification|iOS 7-11|20pt|2x|40 x 40|
||||3x|60 x 60|
|iPhone Spotlight|||||
|Settings|iOS 5,6|29pt|2x|58 x 58|
|iPhone Spotlight|||||
|Settings|iOS 5,6|29pt|3x|87 x 87|
|iPhone Spotlight|iOS 7-11|40pt|2x|80 x 80|
||||3x|120 x 120|
|iPhone App|iOS 7-11|60pt|2x|120 x 120|
||||3x|180 x 180|

###iPadアイコン
|Xcodeでの表記| 対象OS|表示サイズ|@(倍率)|画像サイズ|
|:------------------|:-------|:--------|:--|:--------|
|iPad Notification|iOS 7-11|20pt|1x|20 x 20|
||||2x|40 x 40|
|iPad Settings|iOS 5-11|29pt|1x|29 x 29|
||||2x|58 x 58|
|iPod Spotlight|iOS 7-11|40pt|1x|40 x 40|
||||2x|80 x 80|
|iPhone App|iOS 7-11|76pt|1x|76 x 76|
||||2x|152 x 152|
|iPad Pro App|iOS 9-11|83.5pt|2x|167 x 167|

###App Storeアイコン
|Xcodeでの表記| 対象OS|表示サイズ|@(倍率)|画像サイズ|
|:------------------|:-------|:--------|:--|:--------|
|App Store|iOS|1024pt|1x|1024 x 1024|

##LaunchImage (SDK12以降で追加)

iPhone XS MaxとiPhone XRがラインナップに加わったことにより、LaunchImageにもこれに対応したサイズの画像を追加する必要があります。
(スクリーンショットの赤枠で囲った画像が新しく追加されたサイズです)
※そして[を見ると判る通り、AppleもXcode 11で改心したのか？Assetsにセットすべき画像のピクセルサイズが表示されるようになっています！

![スクリーンショット 2019-08-16 17.59.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148717/998b7c32-f694-171f-234e-8827a3bc9ab2.png)


##LaunchImage
![スクリーンショット 2017-12-15 14.00.35.png](https://qiita-image-store.s3.amazonaws.com/0/148717/d70ef95a-728f-2578-b0d9-f8eb22441d97.png)

###iPhone起動画面
|画面サイズ|Xcodeでの表記| 対象OS|画像サイズ|
|:----|:----------------|:------|:----------|
|iPhone XS Max|iPhone XS Max Portrait|iOS 12+|1242 x 2688|
|iPhone XR|iPhone XR Portrait|iOS 12+|828 x 1792|
|iPhone XS Max|iPhone XS Max Landscape |iOS 12+|2688 x 1242|
|iPhone XR|iPhone XR Landscape |iOS 12+|1792 x 828|
|iPhone X|iPhone X Portrait|iOS 11+|1125 x 2436|
||iPhone X Landscape||2436 x 1125|
|Retina HD 5.5"|iPhone Portrait|iOS 8+|1242 x 2208|
|Retina HD 4.7"|||750 × 1334|
|Retina HD 5.5"|iPhone Landscape|iOS 8+|2208 x 1242|
|2x|iPhone Portrait|iOS 7+|640 x 960|
|Retina 4|iPhone Portrait|iOS 7+|640 x 1136|

###iPad起動画面
|画面サイズ|Xcodeでの表記| 対象OS|画像サイズ|
|:----|:----------------|:------|:----------|
|1x|iPad Portrait|iOS 7+|768 x 1024|
|2x|||1536 x 2048|
|1x|iPad Landscape||1024 x 768|
|2x|||2048 x 1536|

###iPhone起動画面
|画面サイズ|Xcodeでの表記| 対象OS|画像サイズ|
|:----|:----------------|:------|:----------|
|1x|iPhone Portrait|iOS 5,6|320 x 480|
|2x|||640 x 960|
|Retina 4|||640 x 1136|

###iPod起動画面
|画面サイズ|Xcodeでの表記| 対象OS|画像サイズ|
|:----|:----------------|:------|:----------|
|1x|iPod Portrait Without Status Bar|iOS 5,6|768 x 1004|
|2x|||1536 x 2008|
|1x|iPod Portrait With Status Bar|iOS 5,6|768 x 1024|
|2x|||1536 2048|
|1x|iPod Landscape Without Status Bar|iOS 5,6|1204 x 748|
|2x|||2408 x 1496|
|1x|iPod Landscape With Status Bar|iOS 5,6|1024 x 768|
|2x|||2048 x 1536|
ルート権限がないサーバーでpipを使う方法

Pythonは3.6
pyenv, virtualenvでの仮想環境です。

OSはCentOS7。レンタルサーバーです。

レンタルサーバーはルート権限くれないと思うので、その時の対処法。

レンサバで任意のPythonが使えるようになってる前提です。

# pipコマンドを実行するとエラーがでる

```python3
File "/home/usename/.pyenv/versions/miniconda3-3.19.0/envs/miniconda36-venv/lib/python3.6/site-packages/pip/_vendor/distro.py", line 984, in _get_distro_release_info
    basenames = os.listdir(_UNIXCONFDIR)
PermissionError: [Errno 13] 許可がありません: '/etc'

```
上記の通り、HOMEディレクトリ以下のpyenv, pyenv-virtualenvで仮想環境を構築しています。
`easy_install`は通るけど`pip`は`pip freeze`でもエラー吐きます。

# 対応策

`/python3.6/site-packages/pip/_vendor/distro.py`の`basenames = os.listdir(_UNIXCONFDIR)`でエラーが出ているので、
`distro.py`を書き換えます。
`distro.py`の場所は各自の環境で変わるので探してください。

```python3
basenames = os.listdir("/home/username/local/etc") # ←os.listdir()に渡すデータを_UNIXCONFDIRから適当なディレクトリに変更
```

`/home/username/local/etc`は事前に作っておきました。中身は空です。

これでpipが使えます。

この変更による悪影響はわかりませんので、自己責任でおねがいします。
Etcherが「Starting...」で止まる

Raspberry PiでRaspbianを使うため、SDカードにOSイメージを書き込もうとした。
まずは[公式サイト](https://www.raspberrypi.org/documentation/installation/installing-images/)に従い「[Etcher](https://etcher.io/)」を使う。OSイメージをダウンロードし、「Flash!」ボタンを押すと「Starting...」の表示に切り替わるが、3時間待ってもそのまま。

代わりに「[Win32 Disk Imager](https://sourceforge.net/projects/win32diskimager/)」を試したところ、5分ほどで問題なく書き込みが完了。起動も問題なし。

公式サイトの[Raspbianのイメージはダウンロード始まらない](https://qiita.com/tukiyo3/items/c8555eacb67466b81bc8)し、Etcherも使えないし、まったく時間の無駄である。
reactの動的レンダリング

# 前提
サーバーから受け取ったデータでループを回して、renderするコンポーネントを分けたかった。

```javascript
const itemNode = this.state.items.map(item => {
      return(
        <"item.typeに応じたコンポーネント"/>
      )
    })
```
item.typeに格納された文字列に対応する、コンポーネントをrenderしたい。
例えば、`item.type = 'TextItem' → <TextItem />`


# 試したこと
[eval](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval)と[createElement](https://reactjs.org/docs/react-api.html#createelement)を使ってみる。

```javascript

return(
      React.createElement(eval(item.type), props)
    )
```
`eval(item.type)`がundefineになりうまくコンポーネントを呼び出せない。

```js
import ◯◯ from ..
...
console.log(eval(item.type)) // undefineのエラー
console.log(◯◯) // 関数が返ってくる
```
## わかったこと
コンポーネントは変数ではなく関数？でもクラス？とにかく、`import ◯◯ from ..`でインポートしたら、evalとかを使わず◯◯を直接呼ばないとエラーが出る。

# 解決策
hashにimportしたコンポーネントを格納しておけば動的に呼び出せる！！

```js
const Components = {
  ButtonItem  : LpButtonItem,
  TextItem    : TextItem,
  ListItem    : ListItem,
  TableItem   : TableItem,
  PictureItem : PictureItem,
}
...

const itemNode = this.state.items.map(item => {
  const Component = Components[item.type]
      return(
        <Component {...this.props}/>
      )
    })

// <Components[item.type] {...this.props}/> はコンパイルしてくれない
```

# 最後に
まだ理解しきれてないところがあるので、間違っているところやこうしたらもっと簡単！、などあればコメントお願いします！
かっこいいJupyter Notebook

# かっこいいJupyter Notebookの使い方

こちらは[Jupyter Advent Calendar 2017](https://qiita.com/advent-calendar/2017/jupyter)の14日目となる記事です。  
かっこよくJupyter Notebookを使う方法をいくつか紹介します。
半分、自分のための備忘録となっています。

# フォントを変える
JupyterNotebookではデフォルトで等幅フォントが選択されません。
なのでCSSを編集してフォントを変えてやりましょう。
`~/.jupyter/custom/custom.css` がなければ作成してください。

```css
.CodeMirror pre, .output pre {
  font-family: Fira Code, 源真ゴシック等幅 monospace;
}
```

僕はこんな感じに書いてます。
ついでに

```css
#ipython_notebook img{
  display:block;
  background: url(logo.png) no-repeat;
  background-size: contain;
  width: 60px;
  height: 33px;
  padding-left: 60px;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}
```
こんな感じで書くと,左上のロゴ部分を変えることができて、

こうなります  
<img width="925" alt="Screen Shot 2017-12-15 at 11.08.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/36954/7eb29f6b-508c-3698-fb3a-6153225e3ecd.png">


# Facetsでデータを見る
ここからは少し実用的な話になっていきます。  
[Facets](https://pair-code.github.io/facets/)とは、Googleの開発したオープンソースのデータ可視化ツールです。  
githubは[こちら](https://github.com/PAIR-code/facets)

[プロジェクトページ](https://pair-code.github.io/facets/)でデモを触ることができるのですが、
インタラクティブに触れる以下のようなもの一瞬で作成できます。


|![overview-census.png](https://qiita-image-store.s3.amazonaws.com/0/36954/f25f507c-0bce-e8ea-5291-e51839a4a3f5.png)|![dive-census.png](https://qiita-image-store.s3.amazonaws.com/0/36954/ae2a8924-920b-044f-8b84-0e7d6c3214b4.png)|
|:-:|:-:|

導入方法は、githubのページに書いてあるので英語が読める方はそちらが最新で正確なのですが、  

2017-12-15時点では、  
- extentionを入れる。`jupyter nbextension install facets-dist/` を実行  
- [protobuf](https://github.com/google/protobuf/tree/master/python)がなければ入れる(condaでjupyterを入れた人は入っているので大丈夫なはず)
- 念のためにどデカイデータも扱えるようにしておく`jupyter notebook --NotebookApp.iopub_data_rate_limit=10000000`

で使えます。

# tqdmでプログレスバーを表示する
tqdmは、jupyterでなくてもお勧めしたいライブラリです。
これを使うと、めちゃくちゃ簡単に進捗バーを表示することができます。

`pip install tqdm`でインストール。
`from tqdm import tqdm`で読み込んで、
`for n in tqdm(hoge)`のようにイテラブルオブジェクトを囲むだけ。

こんな感じになります。
![tqdm.gif](https://qiita-image-store.s3.amazonaws.com/0/36954/1a2ba0bf-b48e-7c0c-2210-4658f81e70af.gif)

パラメーターでいろいろカスタマイズもできるので、詳しくは[こちら](https://pypi.python.org/pypi/tqdm)をご覧ください。

また、notebook用の関数も用意されていて、それを使うと
こんな感じになります。

![tqdm_notebook.gif](https://thumbs.gfycat.com/SameHarmoniousCaracal-size_restricted.gif)

また、notebook用の関数を用いると、並列実行の場合にも対応してくれるので、

![tqdm_notebook_parallel](https://thumbs.gfycat.com/CautiousCrazyChanticleer-size_restricted.gif)

こんな感じに並べて表示してくれます。
# RISEでスライドを作る
最後は、[RISE](https://github.com/damianavila/RISE)です。
[reveal.js](https://revealjs.com/#/)を用いた、シャレオツでインタラクティブなプレゼンテーション資料を作成することができます。

anacondaを使用している場合、導入は簡単で、
`conda install -c damianavila82 rise`
のみで利用できます。
pipを利用する場合は、以下のコマンドになります。
```pip install RISE
jupyter-nbextension install rise --py --sys-prefix
jupyter-nbextension enable rise --py --sys-prefix
```
RISEを用いると、以下のように、縦横にスライドが遷移して、
またプレゼン中にセルを実行、結果を展開できるプレゼンテーションが作成できます。

![RISE_demo](https://camo.githubusercontent.com/0752ef9e293123a9eb986b696030954dcf74e3ef/68747470733a2f2f6d656469612e67697068792e636f6d2f6d656469612f336f78485174547841615a774d4f487239752f67697068792e676966)


# まとめ
イケてるデータサイエンティストの8割はjupyterを使ってると言われています。
上に紹介したライブラリを用いて皆さんもカッコよくjupyerを使いこなしましょう。
DNS変更したのにブラウザの表示が変わらない！そんな時の対処法


# はじめに

開発サーバから本番サーバへのDNS切り替えした際に、ブラウザの表示が変わらないんですけど！！！！！と言われることが良くあります。
小心者なので言われる度に焦ります。。(胸がドキドキ)
これ以上、寿命を縮めたくないのでまとめておこうと思います。


# PC内のキャッシュを削除する

* ブラウザで確認


## Mac版
OS X (v10.10) で作業した場合

* ターミナルを起動
* 下記コマンド実行

```
$ sudo dscacheutil -flushcache 
```

* ブラウザで確認


## Windows版

windows10で作業した場合

* コマンドプロンプトを起動
* 下記コマンド実行

```
> ipconfig /flushdns
```


![01.png](https://qiita-image-store.s3.amazonaws.com/0/55848/a3490d0a-4351-3428-5b4e-68d4a54e8da4.png "01.png")



# hostsファイルの設定

hostsファイルはDNSよりも優先度が高いので、指定のサーバを見てくれます。(強制的に？)


* 表示したいipアドレスを入力
* 【表示させたいipアドレスを入力】(半角スペース)【ホスト or ドメイン名】


## Mac版

* ターミナルを起動
* 下記コマンド実行

```
$ sudo vi /private/etc/hosts


# 表示させたいipアドレスを入力
000.111.222 gehogeho.net
```

* `i` でINSERTモード
*  `esc` で抜ける
* `:wq` で保存

## Windows版

* 下記へ移動しhostsファイルをテキストエディタで開き、記載

`C:\Windows\System32\drivers\etc\hosts`


```
# 表示させたいipアドレスを入力
000.111.222 gehogeho.net
```

# まとめ

ブラウザのキャッシュクリアをしても表示が変わらない際は、まずPC自体のキャッシュも消すということも念頭に入れておいたほうが良いかと思います。


# 参考サイト

* [OS X Yosemite (v10.10 ) で DNS キャッシュを削除するコマンド](https://qiita.com/dounokouno/items/04ff6158bf32d1183713)
* [WindowsのDNSキャッシュをクリアする方法](https://freesoft.tvbok.com/tips/net_tips/flushdns.html)
* [IPアドレスとDNS](http://www.geocities.jp/ff11warning/hosts.html)
macOS で bundle install 時に libv8, therubyracer インストールに失敗するときの解決法

### 条件

macOS High Sierra
vendor/bundle 内にgemをインストールする設定

### 症状

v8が見つからずインストール出来ない

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/misogi/.rbenv/versions/2.2.8/bin/ruby -r ./siteconf20171215-25681-1he2s37.rb extconf.rb --with-system-v8
checking for main() in -lpthread... yes
checking for main() in -lobjc... yes
checking for v8.h... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

### 解決

以下を実行し、bundle config を変更する

```
$ bundle config --local build.therubyracer --with-v8-include=/Users/misogi/vagrant/linus-vagrant/linus/vendor/bundle/ruby/2.2.0/gems/libv8-3.16.14.7/vendor/v8/include
```

```
$ bundle config --local build.libv8 --with-system-v8
```

```bash:.bundle/config
BUNDLE_BUILD__LIBV8: "--with-system-v8"
BUNDLE_BUILD__THERUBYRACER: "--with-v8-include=/Users/misogi/vagrant/linus-vagrant/linus/vendor/bundle/ruby/2.2.0/gems/libv8-3.16.14.7/vendor/v8/include"
```

### 参考

http://wknar.hatenablog.com/entry/update-gcc-and-v8
https://qiita.com/wapa5pow/items/1b7447df6a6ee75f8899
https://qiita.com/ganta/items/53f616b48e94d989952f
簡単！npmで管理してないプロジェクトもGitHub Pagesに上げる

# 経緯

[npm run deploy で GitHub Pages にお手軽デプロイ](https://qiita.com/star__hoshi/items/490959aee12dbf528f7c)でnpmに`gh-pages`というパッケージがあることを知りました。

# やりたいこと

`package.json`がないような、例えばJavaScript以外の言語のプロジェクトでも対応できます。

これの方法で、各種ドキュメント生成ツール、例えばC/C++のDoxygenとかHaskellのHaddockで自動生成されたhtmlファイルとかをGitHub Pagesで簡単に公開できます。

(`git submodule ...`とか面倒なことは一切不要です！)

# やりかた


## 1. `npm`をインストール

各自で自分のOSにあった方法で`npm`コマンドが使えるようにインストールしてください。

## 2. `gh-pages`をインストール

`gh-pages`をコマンドとして使うのでグローバルにインストールしてしまいます

```bash
npm install -g gh-pages
```

## 3. 好きなディレクトリをGitHub Pagesに上げる

以下のコマンド好きなディレクトリをルートとしたGitHub Pagesとなります

```bash
gh-pages -d <GitHub Pagesにしたいディレクトリのパス>
```

これで完了です。「Published」と出力されたら無事にpushできている思います。

# その他

## コミットメッセージを変える

デフォルトのコミットメッセージが「Updates」なので、それを変えるには`-m`オプションでできます

```bash
# 例：
gh-pages -m "[AUTO] Update document" -d <GitHub Pagesにしたいディレクトリのパス>
```

## CIを回らないようにする

Travis CIなどのCIを回しているときに、Pushをトリガーに自動的にテストが始まるのを止めたいときがあります。
そんなときは、以下のようにコミットメッセージに`"[ci skip]"`を含めるといいです。

```bash
# Travisのときの例：
gh-pages -m "[AUTO] [ci skip]　Update document" -d <GitHub Pagesにしたいディレクトリのパス>
```
# 参考
* [CIサービスの自動ビルドをスキップする方法まとめ](https://qiita.com/vmmhypervisor/items/f10c77a375c2a663b300)
* [gh-pages](https://www.npmjs.com/package/gh-pages)