OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyでバイト数をキロバイト・メガバイト・ギガバイト・テラバイト・ペタバイト・エクサバイト・ゼタバイト・ヨタバイトに変換するサンプルコード

## ソースコード

```ruby
require 'pp' # Ruby 2.5 からは明示的な pp の require が不要

def size_list(byte_size)
  # 小数点以下2桁まで求める
  {
    :B   => byte_size, # バイト (B)
    :KiB => (byte_size / (2 ** 10).to_f).round(2), # キロバイト   (kB) / キビバイト
    :MiB => (byte_size / (2 ** 20).to_f).round(2), # メガバイト   (MB) / メビバイト
    :GiB => (byte_size / (2 ** 30).to_f).round(2), # ギガバイト   (GB) / ギビバイト
    :TiB => (byte_size / (2 ** 40).to_f).round(2), # テラバイト   (TB) / テビバイト
    :PiB => (byte_size / (2 ** 50).to_f).round(2), # ペタバイト   (PB) / ペビバイト
    :EiB => (byte_size / (2 ** 60).to_f).round(2), # エクサバイト (EB) / エクスビバイト
    :ZiB => (byte_size / (2 ** 70).to_f).round(2), # ゼタバイト   (ZB) / ゼビバイト
    :YiB => (byte_size / (2 ** 80).to_f).round(2), # ヨタバイト   (YB) / ヨビバイト
  }
end

list = [
  {:bytesize => 10 **  6, :name => '100万'},
  {:bytesize => 10 **  8, :name => '1億(おく)'},
  {:bytesize => 10 ** 12, :name => '1兆(ちょう)'},
  {:bytesize => 10 ** 16, :name => '1京(けい)'},
  {:bytesize => 10 ** 20, :name => '1垓(がい)'},
  {:bytesize => 10 ** 24, :name => '1𥝱(じょ)'},
  {:bytesize => 10 ** 28, :name => '1穣(じょう)'},
]

list.each do |item|
  puts item[:name]
  pp(size_list(item[:bytesize]))
  puts
end
```

## 実行結果

```
100万
{:B=>1000000,
 :KiB=>976.56,
 :MiB=>0.95,
 :GiB=>0.0,
 :TiB=>0.0,
 :PiB=>0.0,
 :EiB=>0.0,
 :ZiB=>0.0,
 :YiB=>0.0}

1億(おく)
{:B=>100000000,
 :KiB=>97656.25,
 :MiB=>95.37,
 :GiB=>0.09,
 :TiB=>0.0,
 :PiB=>0.0,
 :EiB=>0.0,
 :ZiB=>0.0,
 :YiB=>0.0}

1兆(ちょう)
{:B=>1000000000000,
 :KiB=>976562500.0,
 :MiB=>953674.32,
 :GiB=>931.32,
 :TiB=>0.91,
 :PiB=>0.0,
 :EiB=>0.0,
 :ZiB=>0.0,
 :YiB=>0.0}

1京(けい)
{:B=>10000000000000000,
 :KiB=>9765625000000.0,
 :MiB=>9536743164.06,
 :GiB=>9313225.75,
 :TiB=>9094.95,
 :PiB=>8.88,
 :EiB=>0.01,
 :ZiB=>0.0,
 :YiB=>0.0}

1垓(がい)
{:B=>100000000000000000000,
 :KiB=>9.765625e+16,
 :MiB=>95367431640625.0,
 :GiB=>93132257461.55,
 :TiB=>90949470.18,
 :PiB=>88817.84,
 :EiB=>86.74,
 :ZiB=>0.08,
 :YiB=>0.0}

1𥝱(じょ)
{:B=>1000000000000000000000000,
 :KiB=>9.765625e+20,
 :MiB=>9.5367431640625e+17,
 :GiB=>931322574615478.5,
 :TiB=>909494701772.93,
 :PiB=>888178419.7,
 :EiB=>867361.74,
 :ZiB=>847.03,
 :YiB=>0.83}

1穣(じょう)
{:B=>10000000000000000000000000000,
 :KiB=>9.765625e+24,
 :MiB=>9.5367431640625e+21,
 :GiB=>9.313225746154785e+18,
 :TiB=>9.094947017729282e+15,
 :PiB=>8881784197001.25,
 :EiB=>8673617379.88,
 :ZiB=>8470329.47,
 :YiB=>8271.81}
```

## 参考資料

- [バイト \(情報\) \- Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88_(%E6%83%85%E5%A0%B1))
- [命数法 \- Wikipedia](https://ja.wikipedia.org/wiki/%E5%91%BD%E6%95%B0%E6%B3%95)
Bashであけましておめでとうございます！

あけましておめでとうございます。
毎年、適当な言語を選んで、あけましておめでとうメールを送っています。
今年は、bashにしてみました。

# Environment
* CentOS release 6.8 (Final)
* GNU bash, version 4.1.2

# Code

昔xenserverのhotbackupで使ってたやつをsmtp認証にしただけ...
https://github.com/dharry/xenserver-hotbackup

```bash
#!/bin/bash

export LANG=C
export LC_ALL=C

check_commands()
{
  for _cmd in $@
  do
    which $_cmd > /dev/null 2>&1
    if [ $? != 0 ]; then
       echo "$_cmd command not found."; exit 1
    fi
  done
}

make_maildata()
{
  _host=$1
  _user=$2
  _pass=$3
  _from=$4
  _to=$5
  _subject=$6
  _body=$7

  _xmailer="Bash+NetCat Mailer"
  _user=$(echo $_user | base64)
  _pass=$(echo $_pass | base64)

  echo "HELO ${_host}"
  echo "AUTH LOGIN"
  echo "${_user}"
  echo "${_pass}"
  echo "MAIL FROM: <${_from}>"
  echo "RCPT TO: <${_to}>"
  echo "DATA"
  echo "From: ${_from}"
  echo "To: ${_to}"
  echo "Subject: ${_subject}"
  echo "Date: $(date)"
  echo "X-Mailer: ${_xmailer}"
  echo ""
  echo "${_body}"
  echo "."
  echo "quit"
}

send_mail()
{
  _host=$1
  _port=$2
  _data=$3
  _interval=0.2

  #nc -i ${_interval} ${_host} ${_port} < ${_data} > /dev/null 2>&1
  nc ${_host} ${_port} < ${_data} > /dev/null 2>&1
  _status=$?
  sleep $_interval
  return $_status
}

make_body()
{
  _name=$1
cat << EOD
${_name}さん
2018年01月01日になりました。
あけましておめでとうございます。
今年もよろしくお願いします。
EOD
}

##
## main
##

# require commands
check_commands nc base64 nkf

host=example.co.jp
port=587
user=dharry
pass=userpassword
from=dharry@example.com
subject="I wish you a Happy new year 2018"

tolist[0]=aaa@gmail.com
tolist[1]=bbb@gmail.com
tolist[2]=ccc@gmail.com

for to in ${tolist[*]}
do
  name=$(echo $to | awk -F"@" '{ print $1 }')
  body=$(make_body $name | nkf -s)
  data=$(mktemp -p /dev/shm/)
  make_maildata "$host" "$user" "$pass" "$from" "$to" "$subject" "$body" > "${data}"
  send_mail $host $port ${data}
  [ -f "${data}" ] && rm -f "${data}"
done
```
iOSで動画の回転方向を調べる

# 動画の回転方向の調べ方
[動画編集について記事](https://qiita.com/drafts/225eb3c6aa864d950f65/edit)を記載しましたが、動画の回転方向を調べて適切に処理する必要があったので、そのやり方を紹介しておきます。

```swift
// 動画の回転方向を調べるメソッド
func getPreferredOrientation(_ videoTrack: AVAssetTrack) -> CGFloat {
    var ori:CGFloat    // 返り値 角度を格納する
    let transform = videoTrack.preferredTransform    // videoの回転情報

    // 180度
    if transform.a == -1.0 && transform.b == 0.0 && transform.c == 0.0 && transform.d == -1.0 {
        ori = CGFloat(Double.pi/180*(180))
    }
    // 90度
    else if transform.a == 0.0 && transform.b == -1.0 && transform.c == 1.0 && transform.d == 0.0 {
        ori = CGFloat(Double.pi/180*(90))
    }
    // -90度 (270度)
    else if transform.a == 0.0 && transform.b == 1.0 && transform.c == -1.0 && transform.d == 0.0 {
        ori = CGFloat(Double.pi/180*(-90))
    }
    // 0度
    else { // transform.a == 1.0 && transform.b == 0.0 && transform.c == 0.0 && transform.d == 1.0
        ori = CGFloat(0.0)
    }
    return ori
}
```
##解説
AVAssetTrack.transformにはアフィン変換の行列が入っているので、それを調べることで回転方向が分かります。
アフィン変換ってなんですか、という人は「[アフィン変換/平行移動だって変換行列で](https://qiita.com/yuba/items/7fb6a49adfda8fa466d8)」などを参考に。

後の処理で正しい方向で再生するために、角度が取得できるようにしています。取得した角度分だけ動画を回転して表示することになります。

##注意点
他の記事などで、tx, tyのプロパティを見て回転を調べているものがあったのですが、こちらのプロパティは平行移動に使うもので回転とは関係ないので要注意。iPhoneで撮影した動画だとtx, tyと動画の幅高さを比較して上手く行く時があるのですが、androidで撮影した動画などでは上手く行かない時があります。

#回転の仕方
```swift
var videoTrack: AVAssetTrack
// videoTrackの取得処理は省略

let videoLayer: CALayer = CALayer()  // videoレイヤを作成
ori = getPreferredOrientation(videoTrack)  // 動画の角度を確認
videoLayer.transform = CATransform3DMakeRotation(ori, 0.0 ,0.0, 1.0)  // 動画を回転
```
CATransform3DMakeRotationを使って回転ができます。3次元のアフィン変換ですが、2次元で回転するにはこのように1つめの引数に回転角度を入れればOKです。
これをやらないと、再生するときに動画の向きがおかしなことになってしまいます。
timeコマンドは、何をどのようにして計測しているのか？

## はじめに

timeコマンドを使用して”プロセスの処理時間”を知ることができ、以下のような出力を得る事が出来ます。


```
real	0m0.000s
user	0m0.000s
sys	0m0.000s
```

(上は一例で、表示され方が異なる場合があります。シェルによってはbult-inコマンドで用意されていたりする。)
realは実際の時間で、userがユーザー空間での処理時間、sysがカーネル内部での処理時間となります。


普段何気なく使うtimeコマンドでは、これらの時間はどのように計測されるのかを追っていき、時間計測の理解を深めていきたい。
おそらく、知っている人はそんなこといまさら…って内容かとは思います。

** (  ただし、間違っている可能性も大いにあるので、間違いがある場合はご指摘よろしくお願いします…  ) **

## さっそく、結論…
(GNU timeは検索してソースコードが読むとわかるが、結論を言ってしまうと）プロセスの処理時間はカーネルの機能として計測されており、timeコマンドは、sys/timesを使用してプロセスの処理時間(tick単位)を取得し、時間換算した結果を表示しているだけです。
つまり、timeコマンドが取得している値の本質を探るにはTickを理解するのが手っ取り早いと思います。

## Tickとは？
linuxでは、一定間隔毎に割り込みが行われ、この定期的な割り込みをTickと呼びます。(まさしく、時計のチックタック的なイメージ。)。tickの発生する間隔は(基本的に)カーネルをコンパイルする時の定数(HZ)の値によって決定され、1ms,5ms,10msが一般的です。

Tickの大きな役割の一つに、実行しているプロセスから別のプロセスへの切り替えがあります。このため、有限個のCPUで大量のプロセスを(一見すると同時に)処理することが出来ています。

また、Tickの処理内にて、カーネルは幾つかのデータを周期的に収集します。

- 実行プロセスのCPU資源制限の確認
- ローカルCPUの作業負荷の更新
- システムの平均付加の算出
- カーネルコードのプロファイルリング



## Tickによるプロセス時間の計測
実際に、単純化したモデルを例としてTickによるプロセス時間の計測について説明をしたいと思います。

![temp.png](https://qiita-image-store.s3.amazonaws.com/0/227699/a6f2eda4-dddd-4add-fa92-b7422eb07007.png)



図はCPUで実行されているプロセスを時系列的に図示したもので、プロセスA(緑色の矢印)とプロセスB(青色の矢印)が動作していることを示しています。図の最初ではプロセスAがCPUの実行権を得ることができ、CPUを使用しています。
プロセスAが実行されている途中でも、一定間隔で割り込みされ、Tickの処理が行われています。
Tick終了後は、通常は直前に実行していたプロセス(ここではプロセスA）が、あらかじめ許可された実行時間(クォンタム)を使い切るまで、そのプロセスにCPUが戻され、続きが実行されます。クォンタムを使い切ったり、その他の条件により再度のスケジューリングが必要であれば）Tick終了する際に、次に実行するプロセスを選定を行い、選定されたプロセスにCPUが渡されます。(この選定に関する詳細は、別の記事が大量にあると思うのでそちらを参考に… ) 


図では、４回目のTickの後でプロセスAからプロセスBにCPUが渡されています。その後、プロセスBは終了し、プロセスAにCPUが渡されています。さらに、その後、プロセスAも終了して実行待ちのプロセスが存在しなくなった例を示してします。


カーネルは、各プロセスの状態をテーブルとして管理しており、この中にstime,utimeと呼ばれる変数があります。
Tickが呼ばれるたびに、直前にCPUを使用していたプロセスがユーザー空間にいたときは、そのプロセスのutimeを、カーネル空間にいたときはそのプロセスのstimeをインクリメントします。
これにより、それぞれのプロセスが実行しているときに何回のtickがカーネル空間またはユーザー空間で発生したかがカウントされていきます。

この例では、最終的に、8回のTickが発生しており、その内訳は以下のようになります。

- プロセスA
  - ユーザーモード：4回
  - カーネルモード：1回
- プロセスB
  - ユーザーモード：1回
- アイドル状態：2回

これらの蓄積された情報からCPUの使用率やtimeコマンドで表示される結果を導出します。プロセスAは、ユーザー空間で4回、カーネル空間では1回のtickが呼ばれたため、tickが10msのときはユーザー空間で40ms、カーネル空間で10msの処理時間を使用したことになります。このようにして、”プロセスの処理時間”を計測しています。

( このため、考え方によっては、カーネルが計測しているプロセス時間(特に、カーネル時間とユーザ時間)は、ある意味、統計的な意味を含んだ数値であると言えると思います。例えば、(運が悪くor運がよく？)Tickの割り込みが入るタイミング直前にシステムコールを発行して、Tick終了してプロセスに処理が戻ったときにカーネルを抜けることが重なれば、実際にカーネル内部にいる時間よりもカーネルでの実行時間が大きくなる結果となると思います。もちろん、その逆がユーザーモードでの時間計測においても言えると思います(※1) )

なお、この図の説明では、プロセス実行時間の割合に比べてTickの処理時間が長く見えるが実際はTickの処理時間はもっと短いです。

ちなみに、これまでの説明では、コアの１個の環境での動作となる。コアが複数ある場合は、各コアが各々の実行プロセスのキューを持っており、コア毎にTickの割り込みが実行され、これらの処理が行われます。
また、他のコアのプロセスキューを確認し、コア間でプロセスを移動させて負荷のバランシングなどの調整もtickにて行われます。(詳細は別の機会に書きたい)


(※1)　自信がないので、今後の検証してみたい。本当に厳密な計測が行えた場合と、tickカウントによる時間との差分どの程度になるのか気になる…
あけましてElmでドラムマシンを作りました。ｽﾞﾝﾄﾞｺﾄﾞｺﾄﾞｺｽﾞﾝﾄﾞｺﾄﾞｺﾄﾞｺ

![screen.png](https://qiita-image-store.s3.amazonaws.com/0/64695/03849408-9ce7-7a8f-e25a-06c97d598bb3.png)


あけましておめでとうございます。昨年末のアドベントカレンダーでは、[Elmがずいぶん健闘を見せました](https://qiita.com/advent-calendar/2017/ranking/feedbacks/categories/programming_languages)よね。私も[さくらちゃんもぐもぐ会](https://connpass.com/event/74279/)にちょっと顔を出したりして、Elmの盛り上がりを少しづつ感じてきました。冬休みの課題としてElmで何か小さな練習作を作ろうと思い、お題をいろいろ考えたんですが、今回はシンプルな**ドラムマシン**にしました。楽譜のようなものを入力するとｽﾝﾄﾞｺﾄﾞｺﾄﾞｺって音が鳴るやつです。デモとリポジトリはこちらです。

* **デモ http://aratama.github.io/capriccio/**
* リポジトリ https://github.com/aratama/capriccio

アプリケーションの名前は音楽用語から持ってきて、**Capriccio**とつけました。使い方としては、楽器ごとにトラックが用意されているので、音を鳴らしたいところをテキトーにクリックするだけです。あとは`Play`を押せば`ｽﾞﾝﾄﾞｺｽﾞﾝﾄﾞｺ`音が鳴り始めます。動作はWindows版のChrome、Firefox、Edgeだけで確認しましたが、動かなかったらごめんなさい。




# Elmを使ってみた感想など

### わりと簡単でした

それで、今回Elmを使ってみた感想なんですが、思った以上にさくさくと使えたという印象です。もちろん言語が違えば構文もAPIも違うので、それゆえ戸惑う部分はありましたが、言語自体はとてもシンプルなので、大きく迷うところは少なかったです。どちらかというと、Web Audioの扱いのほうでバグが取れなくて苦労しました。Web Audioで正確にリズムを刻むには、[ちょっと面倒くさいコーディングが必要になる](https://www.html5rocks.com/ja/tutorials/audio/scheduling/)のです。オーディオ系のプログラミングはリアルタイムな要素も多いので、デバッグも結構つらかったです。

また、port/sbscriptionとか`Cmd`/`Sub`とか`Task`とかElm独特の概念はいろいろ出てはきますが、ろくにドキュメントも読まずにサンプルを見ながらの「たぶんこう使うんだろうなー」的なテキトーなコーディングをしただけで普通に動きました。これもElmが純粋で厳格な静的型付けの言語であるお陰ですね。このアプリケーションでは数十ミリ秒ごとに画面全体をごりごり書き換えてアニメーションを行ってますが、パフォーマンス面でも特に問題はなかったです。

`elm-package`や`elm-format`とか、`create-elm-app`とかの周辺ツールも充実しているのが嬉しいですね。[カンマを行頭に持ってくるあの変なスタイル](http://elm-lang.org/docs/style-guide)は、最初は違和感が強いですが、慣れれば慣れます。



### 初心者にはお勧め、経験者にはちょっと物足りないかも

ツイッターで私もよく言っているんですが、Elmはとても入門しやすい言語だと思います。純粋関数型言語の一族にまだ触っていない人には、Elmは最初の関数型言語として特にお勧めです。私としてはどうしてもPureScriptと比べちゃうところがあって、Elmでは型クラスがないので物足りなさはつきまといますし、portやsubscriptionの扱いが面倒くさい感じはあります。モナドに慣れちゃうと、portよりモナドで作用を扱ったほうがずっと楽だったりします。でもPureScriptのあのエグいAPIを純粋関数型の初心者にお勧めできるかというと、ちょっと厳しいと思うので、Elmはそのあたりの落とし所として妥当なポジションにあるのかなーと思いました。

また、`elm-package`や`elm-format`のような周辺のツールが成熟している点においては、PureScriptよりも優れているでしょう。コミュニティもずっと大きくて安定しています。個人的な好みではPureScriptの未来に期待したいんですが、全体のバランスを考えれば、現時点ではElmのほうが堅実な選択だと思います。

### 次に作りたいもの

次はElmでゲームか何かでも作ってみたいとは思いますが、気になるのはElmで**Canvas API**や**WebGL**がどこまでまともに使えるかですね。[elm-graphics](https://github.com/evancz/elm-graphics)や[elm-canvas](https://github.com/Elm-Canvas/elm-canvas)も調べていますが、experimentalだよーとかSVGを使ったほうがいいよとか書いてあって、どれを使うのがベストなのかまだちょっとわかりません。
pandasのDataFrameのデータ操作をよくわすれるので、よく使用する操作を自分のためにまとめた

pandasのDataFrameのデータ操作のかんたん早見表を作成したので、データ操作に役立ててください。また最後に、データ分析の流れを経験できるオススメ学習コンテンツを紹介したので、ご参考ください。

## 事前にimport

```py
import pandas as pd
import numpy as np
```

## データ読み取り編

### CSVの読み取り

```py
df = pd.read_csv("ファイル名", header=None)
# `header=None`を指定せず`pd.read_csv("ファイル名")`とした場合は1行目が自動的にカラム名として挿入される
```

### コピーの読み取り

```py
df = pd.read_clipboard(header=None)
# `header=None`を指定せず`pd.read_clipboard()`とした場合は1行目が自動的にカラム名として挿入される
```





### DataFrameの自作

```py
df = pd.DataFrame(np.arange(12).reshape(4,3),index=['行名1','行名2', '行名3', '行名4'], columns=['カラム名1','カラム名2', 'カラム名3'])
# `index=[]`や`column=[]`を指定しない場合は、順に1,2,3・・・となる
# データは`np.arange(12).reshape(4,3)`といった`array`であること
```


## データ抽出編

### 全カラム名の取得

```py
df.columns
```

### 最初の数データ取得

```py
df.head(行数)
```

### 各種情報取得

```py
df.describe()
```

### 1行の取得

```py
df.loc['行名']
# 出力はSeries型
```



```py
df.loc[['行名']]
```

```py
df.iloc[2]
# 出力はSeries型
# カッコ内の数値は先頭を0とする行番号
```



```py
df.iloc[[2]]
# カッコ内の数値は先頭を0とする行番号
```



### 複数行の取得

```py
df.loc[['行名','行名']]
```

```py
df.iloc[[2,3]]
# カッコ内の数値は先頭を0とする行番号
```



```py
df.iloc[2:4, :]
# カッコ内の数値はスライス形式で[行の開始位置:行の終了位置-1]
```


### 1カラムの取得

```py
df['カラム名']
# 出力はSeries型
```



```py
df[['カラム名']]
```

```py
df.loc[:, ['カラム名']]
```

```py
df.iloc[:, [1]]
# カッコ内の数値は先頭を0とするカラム番号
```



### 複数カラムの取得

```py
df[['カラム名','カラム名']]
```

```py
df.loc[:, ['カラム名','カラム名']]
```

```py
df.iloc[:, [1,2]]
# カッコ内の数値は先頭を0とするカラム番号
```



### 1行1列ピンポイントで取得

```py
df.loc['行名', 'カラム名']
# 出力は値のみ
```



```py
df.loc['行名']['カラム名']
# 出力は値のみ
```



```py
df.loc[['行名'], ['カラム名']]
```

```py
df.iloc[2,1]
# 出力は値のみ
# カッコ内の数値は先頭を0とする[行番号,カラム番号]
```

```py
df.iloc[[2], [1]]
# カッコ内の数値は先頭を0とする[[行番号],[カラム番号]]
```

```py
df.at['行名', 'カラム名']
# 出力は値のみ
```



```py
df.iat[2,1]
# 出力は値のみ
# カッコ内の数値は先頭を0とする[行番号,カラム番号]
```

###  複数行複数列を指定して取得

```py
df.loc[['行名','行名'], ['カラム名','カラム名']]
```



```py
df.iloc[[2,3], [1,2]]
# カッコ内の数値は先頭を0とする[[行番号,行番号], [カラム番号, カラム番号]]
```



```py
df.iloc[2:4,1:3]
# カッコ内の数値はスライス形式で[行の開始位置:行の終了位置-1, カラムの開始位置:カラムの終了位置-1]
```







## データ削除編

### 1行の削除

```py
df.drop('行名')
```

### 複数行の削除

```py
df.drop(['行名','行名'])
```

### 1カラムの削除

```py
df.drop('カラム名', axis =1)
```

### 複数カラムの削除

```py
df.drop(['カラム名','カラム名'], axis =1)
```

## データ結合編

### 横方向に結合

```py
pd.concat([df1, df2], axis =1)
```

## データ変換編

### arrayに変換

```py
df.values
```

### dframeに再変換

```py
pd.DataFrame(df.values, index=['行名1','行名2', '行名3', '行名4'], columns=['カラム名1','カラム名2', 'カラム名3'])
```

### csvに出力

```py
df.to_csv("ファイル名.csv")
```

## データ更新編

### 単一データの更新
データ取得して代入するのみ

### 複数データの一括更新
ただし代入される側とする側の行数、列数を合わせることは必須。
型もそろえた方が無難（型の違いによる意図しない行列入れ違いが発生するため）。

## 【最後に】データ分析手法のコンテンツ（私が制作したもの）

私が制作したものですが、初心者向けのPythonデータ分析学習コンテンツです。データの取り込み、前処理から可視化の流れを学習できる教材です。考察イメージまで記載されているのでオススメです。一部無料公開されているので、ご興味あればお試しください。

https://www.techpit.jp/courses/30/curriculums/31/sections/264/parts/906
whichprを速くした


whichprという便利なソフトウェアが存在している。これはGitのコミットハッシュからGitHub上のPull-Request番号を引くツールである。

https://github.com/pocke/whichpr

```bash
$ whichpr show dc7eaf64ecb48e17524747ba78097bcb031ddc26 # => 7
$ whichpr open dc7eaf64ecb48e17524747ba78097bcb031ddc26 # Pull-Requestがブラウザで開かれる
```

詳しくは https://qiita.com/pocke/items/281e9157a530a6142178 を参照してほしい。


今回は、このwhichprを速くした。


whichpr以前の世界
=====

人類はwhichprが誕生する前はコミットメッセージからヒューリスティックにPull-Requestの番号を推察していた。
See https://qiita.com/awakia/items/f14dc6310e469964a8f7

この手法には、Pull-Requestがrebase mergeされた場合や、コミットメッセージが複数行に渡るコミットがsquash mergeされた場合などに対応できないという問題がある。
何故ならば、これらの方法によってマージされたPull-Requestのコミットには、Pull-Request番号が含まれていないためである。
そのためそのようなケースでは、コミットメッセージからはPull-Requestの番号を取得することはできない。



今までのwhichpr
======

この問題を解決するためにwhichprは生まれた。
whichprはPull-Requestの番号を得るためにコミットメッセージを使用せず、GitHub APIを使用する。
これによりコミットメッセージにPull-Requestの番号が含まれていなくとも、Pull-Requestの番号を得ることができるようになった。


ところがAPIを使用するようにしたことによって、いくつかの問題点が発生した。

- APIリクエストが発生するために、従来のヒューリスティックな手法に比べて遅い
- APIリクエストを行うためにGitHubの認証情報が必要である
  - 認証を行うアプリケーションを増やしたくない人にとっては、あまりうれしくないでろう。


これからのwhichpr
====

https://github.com/pocke/whichpr/pull/6
https://github.com/pocke/whichpr/pull/7

上記の2つのPull-Requestによって、先に挙げた問題は解消された。

今までのwhichprは常にAPIリクエストを発行していた。
しかし、上記のPRによって「コミットメッセージからPull-Requestの番号が推察できる場合」にはその推察した番号を使用するようになった。

これにより、APIリクエストを発行するのはコミットメッセージにPull-Requestの番号が含まれていない場合のみとなった。
多くのケースではコミットメッセージにPull-Requestの番号が含まれていると考えられるため、多くのケースでAPIリクエストの省略が期待できる。
またコミットメッセージにPull-Requestの番号が含まれていないケースを諦めれば、認証なしでwhichprを使用することも可能となった。



問題点
-----

ただしこの新しいwhichprの手法にも若干の問題点がある。
Pull-Requestの番号の推測をヒューリスティックに行うため、コミットメッセージによっては間違ったPull-Requestの番号を提示してしまう可能性がある。
もっともそのようなコミットメッセージを使用することはほとんどないと考えられるため、ほとんどの場合は問題にはならないであろう。

この問題を解決するために`--no-heuristic`のようなオプションを追加することも検討しているが、まだ実装はされていない。



まとめ
=====

whichprは今までの問題点が解消され、より使いやすくなった。
いままで使用していなかった方はぜひインストールを、すでに使用していた方はぜひアップデートをしてほしい。
Unity2017.2のVuforiaでUIを現実の画像の上に浮かせる

#はじめに
2017年はAugmented Reality(AR)関連でAppleのARKitが話題になった．ところでUnityにもARを公式にサポートするため，**Vuforia**というARライブラリが備え付けられたことは知っているだろうか．Unityのバージョン2017.2以降，Unityのインストール時に**Vuforia Augmented Reality Support**という欄にチェックを入れることで，Vuforiaというライブラリを使える．これを用いて，今回は次のような動画を作ってみた．

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">あけましておめでとうございます　本当は創英角ポップ体で作りたかった <a href="https://t.co/JvGaQeSVUZ">pic.twitter.com/JvGaQeSVUZ</a></p>&mdash; らでぃっしゅ@そつろん (@radi_bow) <a href="https://twitter.com/radi_bow/status/947484702822109187?ref_src=twsrc%5Etfw">2017年12月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ポイントは，UnityのGameObjectではなくテキストや画像といったUI要素が宙に浮いている点である．

#Vuforiaの導入
VuforiaをUnityで使う方法は様々なサイトに記載されているため，そちらを参照してほしい．

* [公式サイトのチュートリアル](https://library.vuforia.com/articles/Training/getting-started-with-vuforia-in-unity-2017-2-beta.html "公式サイトのチュートリアル")（英語）
* [UnityとVuforiaでARアプリの作成](https://qiita.com/murasan/items/b31d9deb6d8b24bd9134 "UnityとVuforiaでARアプリの作成")

注意すべきこととして，古いサイトを見るとUnity5にVuforiaを導入する方法が書かれている場合がある．しかしUnity2017.2以降にはVuforiaはプリインストールされているので，そのような記事にある面倒な導入はいらない．

#実装
以下ではUnity2017.2.1f1を用いて実装する．基本的にサンプルシーンや前述の参考記事のように，`ImageTarget`の子オブジェクトとしてUI要素を設定すればよい．
ただ，何も考えずに，GameObjectと同じようにUIを配置してもうまくいかない．そこで`Canvas`の設定を変える必要がある．具体的には，`Canvas`の`Canvas`コンポーネントの`Render Mode`を，`World Space`に変更する．

![Canvas](https://qiita-image-store.s3.amazonaws.com/0/212951/44ed753f-f08b-5828-f636-383bcee2c234.png "Canvas")

これによりUnityのワールド空間上にGameObjectと同じ感覚で`Canvas`が配置できるようになるので，後は`Canvas`の子オブジェクトとしてSprite画像などのUI要素を設定し，`Canvas`を`ImageTarget`の子オブジェクトにするだけである[^1].
念のためHierarchyとSceneの画像を載せておく．

![screenShot](https://qiita-image-store.s3.amazonaws.com/0/212951/2712e7f5-bd7b-b9c5-a970-4d7ba87bdcd7.png "screenShot")


#まとめ
一旦慣れると15分くらいで現実に様々な物体を浮かせられるので面白い．UIを浮かせるという点で言えば，別のトラッキングされた物体からレイキャストすることで押せるボタン等を作れたら体験の幅が広がりそうである．

[^1]: この`Canvas`をワールド空間に置く発想は，VR開発においては頻出である．
jsonの記法

# jsonについて


# 値

jsonでは下記の型で値をもてる。

* 文字列値(string)："abc"や"def"等、任意の情報をダブルクオートで囲んだ記述。
* 数値(number)：1や23.45等、数値をそのまま書いた記述。
* 真偽値(boolean)：true及びfalseという「yes/no的な意味合い」を表現する特別な記述。
* ヌル値(null)：nullという「値がカラッポであること」を表現する特別な記述。
* 配列値(array)：[]や[1]や[1,true]等、0〜複数個の値の並びを表現する記述。
* オブジェクト値(object)：{}や{"foo":"bar"}や{"foo":"bar", "baz":null}。これは説明が複雑なので後回し。

引用：https://dev.classmethod.jp/etc/concrete-example-of-json/

# メンバー（member）

メンバーはスキーマで型を指定するようなものでコロンで文字列値と値を挟んでその値の意味を表したモノ。

```
文字列値:値
name:値
```
# 配列

[]で囲って配列を表記します。複数の場合,で区切ります。

```
["foo", 23, null]
```

# オブジェクト

```
オブジェクト名:{}
```

でメンバーを記載することでオブジェクトとそのプロパティのようなものを設定する事ができます。

```javascript:json
{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      "contacts": { "ghopper": true },
    },
    "ghopper": { ... },
    "eclarke": { ... }
  }
}
```

上記はfirebaseのドキュメントにあるものでusersというオブジェクトにそれぞれのユーザー名が入り、そのユーザーの情報をそれぞれ入れている。
Vagrant box のダウンロードが遅い時の雑な解決策

## 背景

Vagrant box のダウンロードが異様に遅い時がある。

![スクリーンショット 2018-01-01 9.51.19.png](https://qiita-image-store.s3.amazonaws.com/0/42655/4e82c5a9-53fe-4aca-85b0-0e6be5380c1b.png)

3 年前くらいに issue が報告され (https://github.com/hashicorp/vagrant/issues/5319 )、vagrant は悪くねーよということでクローズされたが、根本原因は不明のままで未だに同様の問題で困っている人たちがそこそこいるようだ (自分も含め)。

雑に解決したので、メモとして残しておく。

## 雑な解決策

### 1. 対象の Box の URL を雑に取得する

例えば、`centos/7` が欲しい時、`% vagrant box add centos/7` というコマンドをシェルで叩くと、コンソールに `Downloading: {Box の URL}` のような行が表示されるので、その URL をコピペして Ctrl-C。

### 2. wget

1 で手に入れた URL から Box を wget などでダウンロードする。

```sh
wget ${Box の URL}
```

なんか速い。

### 3. vagrant に Box を追加

```sh
vagrant box add centos/7 ${ダウンロードした Box のパス}
```
腰痛を改善する方法

正しいベッド，床からの起き方が，仲野広倫『[究極の疲れないカラダ](http://amzn.to/2lxyBq9)』[^1]で図解されていた．こんなことで改善するのか?と半信半疑ながら写真を真似てみたところ，普段よりも少し楽だった．約1週間程，意識してみたところ，効果があった気がするのでQiitaで共有することにした．
# 正しいベッドからの起き方
1. 足をベッドから降ろす．
1. 手を使って，腰をできるだけねじらないようにまっすぐカラダを起こす．
1. 腰を曲げずに立つ． 

# 正しい床からの起き方
1. 起きるときに横向きになって片ひざで立てる．つかまれるものがあれば使用する．
1. 腰をねじらずに四つん這いの姿勢になる．
1. 腰の角度を変えずに立つ．

***
**腰はねじらないことが大事**らしい．

誰かのお役に立てたら嬉しいです．

[^1]: 本としてはとても冗長だった．全276頁のうち約1/3(pp.74-160)だけが知りたい情報で，時間を無駄にしたと思っていた．しかし，一週間実践してみると上記の「起き方」(pp.146-147)を学べるだけでも十分に価値はあった気がしてきた．
Mac+DockerでWordPressのテーマ開発環境を構築

# 概要
Dockerを使うとWordPress環境を簡単に構築できますが、Docker上でテーマの開発などをしようとすると結構面倒です。
WordPressコンテナ内でエディタなどの環境を整えるか、Mac上で開発したものをUPLOADするか、しないといけないはずです。

そこで、この手順では、開発自体はMac上でして、WordPressコンテナ内にその内容を自動で反映するように設定する方法をまとめました。

# MacにDockerをインストール
* [Install Docker for Mac](https://docs.docker.com/docker-for-mac/install/)

# DockerにWordPressを構築
Terminalで実行します。

## 1. コンテナ名を変数にセットする
MySQLのコンテナとWordPressのコンテナを作るので、その2つのコンテナ名をセットしておきます。

```
$ MYSQL_CONTAINER='test-mysql'
$ WORDPRESS_CONTAINER='test-wordpress'
```

## 2. マウントするディレクトリパスを変数にセット
* Mac側のテーマディレクトリの親ディレクトリのパスを変数にセット
 * 例えばテーマディレクトリが`/tmp/wp-themes/my-theme`にあるとすると、以下のとおり

```
$ PATH_OF_LOCALHOST="/tmp/wp-themes"
```

## 3. MySQL環境作成
```
$ docker run --name ${MYSQL_CONTAINER} \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=password \
-e MYSQL_DATABASE=wordpressdb \
-d mysql
```

## 4. WordPress環境作成
```
$ docker run --name ${WORDPRESS_CONTAINER} \
--link ${MYSQL_CONTAINER}:mysql \
-v ${PATH_OF_LOCALHOST}:/tmp/wp-themes \
-p 8080:80 -d wordpress
```

## 5. 確認
```
$ docker ps
（mysqlとwordpressができていればOK）
```

## 6. ブラウザから初期セットアップをする
http://localhost:8080/wp-admin/install.php

# WordPressコンテナ内で設定
## 起動したWordPressコンテナにシェルで入る
```
$ docker exec -i -t ${WORDPRESS_CONTAINER} /bin/bash
```

## マウントしたディレクトリをテーマディレクトリにシンボリックリンク
```
##(WordPressコンテナ内)##
# ln -s /tmp/wp-themes/* /var/www/html/wp-content/themes/
```

## WordPressコンテナから出る
```
# exit
```

# 完成
これでMac（ホスト側）で開発したテーマが、WordPressコンテナに反映されるようになりました！
Spring for Android 2.0.0環境を構築

#Spring for Android 2.0.0を利用する方法

自分用メモ的要素が強いです。
まだまだお勉強中なので間違ってる場合にはご指摘いただけると嬉しいです。

Android Studioで新しいProjectを作成する
app側のbuild.gradleファイルに以下の記述を追記し、sync now

```java
dependencies {
    snip
    compile 'org.springframework.android:spring-android-rest-template:2.0.0.M3'
}
```

メインスレッドで、restTemplate.getForObject等を実行しようとするとエラーになるため
AsyncTaskを利用して非同期処理を利用して実行させる必要があるようです。

サンプルコード
[郵便番号検索API](http://zipcloud.ibsnet.co.jp/doc/api)を実行し、textViewTestに表示するというコードです。

ボタンが押された側の処理↓　findViewById等の紐付け部分は割愛しています。

```java
@Override
    public void onClick(View view) {

        int intId;
        intId = view.getId();

        switch (intId){
            case R.id.buttonTest:

                String zipString;
                zipString = editTextZipCode.getText().toString();
                Object[] getParams = new Object[1];
                getParams[0] = zipString;

                apiTask = new ApiTask();
                apiTask.execute(getParams);
                break;
        }
    }
```



```java
class ApiTask extends AsyncTask<Object, String, String> {

        @Override
        protected String doInBackground(Object[] data) {

            String zipCode = (String) data[0];

            //Springを利用してAPIを実行する

            // The connection URL
            String url = "http://zipcloud.ibsnet.co.jp/api/search?zipcode={zipcode}";
            // Create a new RestTemplate instance
            RestTemplate restTemplate = new RestTemplate();

            // Add the String message converter
            restTemplate.getMessageConverters().add(new StringHttpMessageConverter());

            // Make the HTTP GET request, marshaling the response to a String
            String result = restTemplate.getForObject(url,String.class,zipCode);
           
            return result;
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressBar.setVisibility(View.VISIBLE);
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
        }

        //非同期処理完了後処理
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute((String) result);
            progressBar.setVisibility(View.INVISIBLE);
            textViewTest.setText(result);

        }
    }
```
Dynamic Programming (DP for short) という概念について（WIP）


Computer Scienceの世界ではお馴染みの<a href="https://projecteuler.net/problem=18" target="_blank">Maximum Path Sum系の問題</a>なんかでよく使われたりする概念。あとは<a href="http://www.eecs70.org/" target="_blank">CSのための数学みたいな授業</a>を取ったことある人も触れたことあるかもしれない。今日はざっくりと簡単に説明。

#Dynamic Programmingとは

結論から言うとRecursion + memorization + guess (as in trying all possibilities) 

    1. 問題を小問題に分ける
2. その小問題って見たことある？yes -> 3 No -> 4
3. 見たことあるのでノートを参照して答えをだす
4. 見たことないので計算処理をして答えを出す。その答えをノートに書き写す。
5. 1-4の繰り返し。

処理に必要な時間は`小問題の数（=n）*時間/小問題（=O(1)）`。recursionは計算に入れる必要はない。

shortest pathとかに最適なアルゴリズム。検索系にも。

##Fibonacci

```fib.py
def fib(n):
    if n <= 2: f = 1
    else: f = fib(n-2) + fib(n-1)
    return f
```

フィボナッチ数列として有名な関数であるがこの書き方は効率が悪い。処理中に同じ計算が何度も行われているからだ。`F(2)`なんて3回も行われている。関数の中に保存されているデータは（引数として入れていない限りは）一時的なものである。言い換えれば関数はその役割を果たしてしまうとその処理に関するデータをすっかり忘れてしまうイメージ。こうした点においてrecursive algorithmはあまり効率的ではないと言える。(->`T(n) = T(n-1) + T(n-2) + O(1) = O(2**n/2`)

```
F(5)  
                    /      \                  
                   /        \
                  /          \
               F(4)          F(3)
            /       \        /   \
          F(3)     F(2)     F(2)  F(1)
         /   \     /  \     /   \
       F(2) F(1) F(1) F(0) F(1) F(0)
       /  \
     F(1) F(0)
```

そこで一度処理したデータ（例えば`F(2)`）を保存して必要な時にアクセスできるようにしたらどうか。ここで出てくるのがDynamic Programmingである。

```dp_fib.py
storage = {}
def fib(n):
    if n in storage: return storage[n]
    if n <= 2: f = 1
    else: f = fib(n-1) + fib(n-2)
    storage[n] = f
    return f
```

簡略的ではあるがイメージとしてはこんな感じだろうか。

```
F(5)  
                    /      \                  
                   /        \
                  /          \
               F(4)          F(3)
            /       \        /   \
          F(3)     F(2)     F(2)  F(1)
                           /   \
                          F(1) F(0)
   
```

もっと効率的な方法を探しているのであれば

```fib.py
n = input("some number: ")
fib = {}
for k in range(1, n+1):
    if k <= 2: f = 1
    else: f = fib[k-1] + fib[k-2]
    fib[k] = f
print(fib[n])
```

#参考

- [Demystifying Dynamic Programming](https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296)
NDKのC++関数を呼ぶにはextern "C"

やはり長期休みに入らないと業務と関係ないジャンルのプログラムをやろうということにはなりません。やっとAndroidStudio開き始めてます。今参考にしているNDKのサンプルはCのコードでしたが、自分で拡張したC++関数をcから呼ぶようにcppに記述してもコンパイルが通りません。

エラー:(661) undefined reference to 'test_cplusplus_function'

エラーメッセージは「関数が未定義」だという直観的でないものでしたが、まあ普通に extern "C"を足して解決。

extern "C"
void test_cplusplus_function()
{
    ...


今度はjavaのコードからC++の関数を呼ぼうと書いたところビルドは通りますが、実行時に例外を吐くという。しょうがないのでextern "C"を記述すると無事動作。

extern "C"
void Java_com_test_ooo_JAVAFILE_TestFunc(JNIEnv* env, jclass clazz)
{
    ....
}

Windowsアプリでdll exportする際にextern "C"をつけるのはC++のままだとオーバーロードの仕組みによりインポートライブラリ内で関数名が変更されてしまうことを避けるためだったような話を思い出しました。
PHPのfloor()という罠

[AGC019のA](https://beta.atcoder.jp/contests/agc019/tasks/agc019_a)でコケました。

問題としては、

```
0.25リットルのジュースはQ円、
0.5リットルのジュースはH円、
1リットルのジュースはS円、
2リットルのジュースはD円。

ぴったりNリットルのジュースが欲しい場合、
一番安い組み合わせで買ったらいくらになりますか？（意訳）
ただし、Q、H、S、D、Nはすべて整数とする。
```

というもの。

解法としては、Nは整数なので、1リットルで一番安いものを計算します。具体的には

```
LITTER_1 = min(Q * 4, H * 2, S)
```

こんな感じ。
で、後は、2リットルと1リットルの単価を比較して計算する、という流れなんですけれども。

その中で、なぜか通らないコードの一部を抜粋したのが、以下です。

```php5
<?php

$litter1 = 99999995;
$litter2 = 99999997;
$question = 999999999;

// 1リッターが2つの方が高くつく場合
if ($litter1 * 2 > $litter2) {
    // 問題が偶数の場合
    if ($question % 2 == 0) {
        printf("%d\n", $question / 2 * $litter2);
    } else {
        printf("%d\n", floor($question / 2) * $litter2 + $litter1);
    }
} else {
    printf("%d\n", $question * $litter1);
}
```

正解は 49999998499999998 なんですが……

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/7a6addf2-1284-b03b-d75c-5257e8e4bd50.png)

実行してみると、なんか 6 ずれてるんです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/91981600-d251-7e8c-68de-f965bbb51644.png)

なんでだろう、と思って、細かく見てみて、唖然。

```php
$step1 = floor($question / 2);
printf("[1]%d\n", $step1);
printf("[2]%s\n", gettype($step1));
$step2 = $step1 * $litter2;
printf("[3]%d\n", $step2);
printf("%d\n", floor($question / 2) * $litter2 + $litter1);
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/4a4321f3-c48b-f1f8-0ba4-f28b0c1ef3cc.png)

999999999 を 2 で割って、床関数で切り捨てて、 499999999 を得ています。**[1]**
これはOK。
そこに 99999997 を掛けて…… **[3]**を見ると、明らかにおかしい。499999999 × 99999997 で最後にこんなに 0 が並ぶことは、ありえない。

**[1]**の時点での変数の型を調べてみると、doubleになってます。**[2]**

この時点で、何かちょっとおかしい。床関数を使って切り捨てている。整数を得ているはずなのに、なぜ double なのか。
[マニュアル](http://jp2.php.net/manual/ja/function.floor.php)を見ると、
` value をこえない最大の整数の値を (float 型で) 返します。`
と書いてあります。
なぜfloat型なのか。
`これは、 float の範囲が int よりも広いためです。`
……？？？
ちょっと何を言ってるのか分かりませんが、浮動小数点の形で返されているせいで、正しい数を得ることができていません。

`(int)`でキャストしても良いですが、とりあえず整数型で返す関数を定義します。

```php
function ifloor($value) {
    return intval($value);
}
```

こうすることによって、正しい値を得ることができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90217/d04844af-0598-99c6-ea19-cb9ec782392f.png)

# 結論

`floor`や`ceil`を使うときは、いちいちintにキャストした方が良いよ。

いやぁ、こんな罠が潜んでいるとは……
２０１８年、作る・遊ぶ・学ぶ・覚えるチェックリスト(随時更新)

**多すぎぐらいがちょうどいいよね。。？**

# CSSフレームワーク
## Bootstrap
https://getbootstrap.com/  
ちょこちょこ触ってはいるけどまとまった時間でページ１枚は作りたい。
## Semantic UI
https://semantic-ui.com/
## Pure
https://purecss.io/
## Foundation
https://foundation.zurb.com/
## UIkit
https://getuikit.com/

# CSSメタ言語
## LESS

## SASS
[これからはcssはSassで書こう。](https://qiita.com/m0nch1/items/b01c966dd2273e3f6abe)

## Stylus
[Stylus入門](https://qiita.com/kubotak/items/18abd6eba7e3daaba054)

# サーバーサイド
## Node.js
https://nodejs.org/ja/
Beanstalkでgoofysを用いてs3をマウントする

#Beanstalkでgoofysを使ってs3をマウントする


- Beanstalkの環境に指定しているロールにS3へのアクセス権をつける

- .ebextentions 配下に 01.goofys.config のような名前で以下の内容のファイルを作る

[mout-point]はファイルシステム上でマウントする場所
[bucket-name]はファイルシステム上でマウントする場所
[user-name]はマウントしたディレクトリの所有者にしたいユーザ名


``` yaml:.ebextentions/01.goofys.config
packages:
  yum:
    golang: []
    fuse: []

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/90_unmount.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      if mountpoint -q [mount-point] ; then
         umount [mount-point]
      fi
    
  "/opt/elasticbeanstalk/hooks/appdeploy/post/90_goofys.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      export GOPATH=/go
      go get github.com/kahing/goofys
      go install github.com/kahing/goofys
      mkdir -p [mount-point]
      /go/bin/goofys --uid `id -u [user-name]` -o allow_other [bucket-name] [mount-point]
```

## ハマったところ

次のようなエラーメッセージが出る場合は、おそらくBeanstalkの環境に指定しているロールがS3へのアクセス権がない

```
main.FATAL Mounting file system: Mount: initialization failed (Executor::NonZeroExitStatus)
```

- 当初、 `aws configure set` でアクセスキーを設定しようとしていたが、hook時には設定を見ずにロールからアクセス情報を取得するらしい
- sshでログインして goofys を同じコマンドでマウントすると .aws 内の設定値を使うので気が付きにくい

.aws フォルダを消してからデバッグオプションをつけて実行するとロールから取得するのをログで確認できる

```:デバッグオプション実行
/go/bin/goofys -f --debug_fuse --debug_s3 --uid `id -u [user-name]` -o allow_other [bucket-name] [mount-point]
```

```
  ---[ REQUEST POST-SIGN ]-----------------------------
  GET /latest/meta-data/iam/security-credentials HTTP/1.1
  Host: 169.254.169.254
  User-Agent: aws-sdk-go/1.8.25 (go1.8.4; linux; amd64)
  Accept-Encoding: gzip
```
Hey Siriで、忘れないうちに今みた夢を記録

[スマートスピーカーIFTTT 大喜利 アドベントカレンダー](https://qiita.com/advent-calendar/2017/ssifttt)19日目です。

本当は12/19に書いてないといけないんですが、色々あって12日ほど遅刻してしまいました。すみません！
これ書いている今は、12/31の深夜〜1/1の早朝です。あけましておめでとうございます。


# Hey Siri

先日近所の美容院で髪を切ったら、IT好きの美容師さんが、Siriが旦那さんの声には反応するけど自分の声には反応しなくて小憎らしい、という話をしていました。

自分はこれまでAlexa Skillsを書き散らしたり、IFTTTxスマスピで色々やってましたが、そういえば「元祖」音声アシスタントのSiriを1回もまともに使ったことがなかったので、家に帰ってから調べました。


 Siriは、

- 2011年10月 iOS5に搭載されてリリース
- 2012年3月 日本語に対応
- 2015年9月　iOS9にて話者認識機能が追加
- 2016年9月 iOS10にてHey Siri機能が追加

Hey Siriは、

- 「Hey Siri」と呼びかけるとホームボタンを長押ししなくても呼び出せる
- iPhone 6以前の機種では、iPhoneの充電中のみ、Hey Siriが有効

そして今まで、押し間違って邪魔だな〜と思っていた、iPhoneのキーボードの音声入力についても初めて使ってみたのですが、試してみたら非常に高い精度で聞き取り&テキスト化してくれることがわかりました。




あの野口悠紀雄氏も音声入力で原稿を書いてるそうで、、
http://japanese.engadget.com/2016/07/06/iphone/


# Home podが音声入力で議事録取れたらいいな

野口先生のやり方を真似して、iPhoneのメモで「音声入力」を試してみたら、ちょっとぐらい間が空いても終了せずに、続きを待っててくれました。

これは、もしかしたらかつてスマスピに対して期待して諦めていた「会議の議事録」が取れるんでは。。？
以前Alexaで口述筆記のスキルを作ろうとしたのですが、会話が数秒間途切れると、そこで聞き取りを終了してしまうという壁にぶつかってしまってました。

Home podが発売されたら、音声入力がどのように生かされるか試してみたいところです。iPhoneより強力なマイクで、ある程度離れた所の人の音声も拾えるでしょうし。その上で、メモ系のソフトへの「音声入力」に対応していれば、強力なオフィス用機器になる可能性があるかと思います。
それがなかったら、音楽流すだけなら今更いらんわ、という所です。349ドルもして、超高いし（笑）

# Hey Siriでなんかレシピ作る

今回のネタは、元同僚で今は喫茶店を経営しているレッドストーンさんから、井の頭線に乗ってる時に案だししていただきました。ありがとうございます。


## やりたい事

夢の内容を記録して、診断する。


- 「夢判断」は調べたりデータ集めが簡単にできないので、代替案として「性格診断」にしました。



## 構成

（１）
iPhone -> "Hey Siri" -> iOSの「メモ」アプリに音声入力
（２）
「メモ」アプリ -> IBM Watson

## 詳細手順

**（１）寝起きにHey Siriを使って、今みた夢の内容を記録**



1. 布団の中からiPhoneに声をかける。「Hey Siri、今日の夢をメモして」

2. Siriが「はい、"今日の夢"というメモを"Notes"フォルダに追加しました。」と言う。
3. iPhoneがスリープするまでの間に、1分以内にiPhoneを手に取る。
3. スリープ画面の「今日の夢」をタップして、認証を解除して、メモアプリを起動する。
4. 音声入力機能を使い、夢の内容を話して、保存する。
5. キーボード入力機能を使い、改行入れたり誤字を直す。
5. いい感じに目が覚めてるので、二度寝せずにオフトゥンから出る。


**（２）夢の内容から性格診断する**

何日か記録して、テキストが3000文字以上集まったら、性格診断をしてみる。

1. これまでのメモの本文からコピペで1ページにまとめる。
2. IBM Watson Developer Cloudの「[Personality Insights](https://personality-insights-demo.ng.bluemix.net/)」を開き、テキスト入力→任意のテキストを選び、入力欄に文章を投入。
3. ビッグファイブ(感情起伏、誠実性、知的好奇心、外向性、協調性）や、欲求、価値をどこに求めるか、などが事細かに診断される。

![スクリーンショット 2018-01-01 1.17.25.png](https://qiita-image-store.s3.amazonaws.com/0/173392/384bba19-2091-9895-24cb-763bff876d6b.png)



あれっ、この内容だとIFTTT要らなかった.. 



## まとめ



###いずれチャレンジしてみようと思うもの

- IBM WatsonのPersonality InsightsのAPI起動。これがうまくいけば、IFTTTからWebhooksで呼び出せて色々できるかも！
- IFTTTで[mateverseという、機械学習サービス](https://ifttt.com/mateverse)が使える。画像とテキストが指定できる。画像の場合、今日とった写真をフェイスブックから食わせて、これは黒猫か、ぼた餅か？をrecognizeすることができるはずである。これをテキストの判別で、さらに日本語で使えるか試してみる。
- 最近朝が寒いので、オフトゥンの中からHey Siriで、IFTTT->webhooks->ngrok->RM mini3で居間の暖房を起動する（わざわざここまで複雑にしなくともスマホからアプリで制御できる or タイマーセットすればできてしまうので優先順位低）

以上です！
【書評】リーダブルコード


## 概要と構成

### 概要
基本的な文法は一通り分かっているプログラマー向けに、「読みやすい」コードを書く手法を紹介している本です

本書は一貫して一つのことを主張しています

> **コードは他の人が最短時間で理解できるように書かないといけない**

※ちなみにここで言う「理解」とは変更を加えたりバグを見つけたり出来るということです

なぜでしょう？

* 優れたプログラマと信頼されるための重要な要素であるから
* 他の人は半年後の自分かもしれないから
* コードを読むのが楽しくなるから

...と効能は数えきれませんが、この本を読む人は必要性を感じていると思います


本書の構成は以下の4つです

### 第一部：表面上の改善

「変数名・関数名の命名」「コードの整形」「コメントの付け方」の3つのサブテーマに分けて、ロジックには関係ないが読みやすさに寄与するテクニックについて説明

### 第二部：ループとロジックの単純化

「制御フローを読みやすくする」「巨大な式を変数や関数に分割する」「変数の削減やスコープ範囲の縮小」といったサブテーマに分けて、ifやforなどのロジック部分をどう単純化するかというテクニックについて説明

### 第三部：コードの再編成

「無関係の下位問題の抽出」「一度にひとつのことをする」「ロジックを明確化する」「やらなくてもいいことを見極める」といったサブテーマに分けて、関数化や機能が必要かどうか判断して削減するといった高レベルの問題への対処を扱います

### 第四部：選抜テーマ

「テストコードを読みやすくする」「実際の具体例」といった実践的なテーマについて本書の原則を適用しています


## 特に心に残った箇所

上級者が無意識のうちにやっていることを言語化し、豊富な例で説明している点が秀逸です

読みやすいコードを書く利点として、「半年後の自分自身も含めた他の人が積極的に機能を追加しバグを発見するようになる」という行動面のメリットを挙げている点が個人的には興味深いです。

確かに読みにくくゴチャゴチャしたコードは触りたくないですよね笑

さらに、読みやすさの重要性はプログラミングだけでなく他の分野であっても同じだと感じます。
最近少しデザイン勉強してるんですが、ある種通じる部分もあり、デザインのコーディングへの応用として読むと更に面白く読めますよ！

## 行動・変化
本書のあとがきでも指摘されているように、まずは過去は忘れて「これから書く」コードを読みやすくすることに取り組みたい！！とウズウズしてきました笑

手始めに第一部と第二部のような比較的導入しやすいものから取り入れていきたいですね。

最近はオンラインプログラミング問題を解いているので、そこから適用していこうと思います

あとは研究で使っているコードもかなりゴチャゴチャしているので、読みやすいコードを自然に書けるようになってきた段階で、本書を手元に置きながら改善していこうと思います

----
[note](https://note.mu/m_k9071/n/nb9e09c742b2b)にも書いているので是非読んでみてください
ReactNativeでreact-native run-iosが効かなくなる


ReactNativeを改めて始めていた中で、
react-native init SampleReactNativeで作成したプロジェクト内で、
何個かnpmモジュールをインストールしていたところ、
いざ試そうとreact-native run-iosを実行したら以下のエラーが、

![error](https://i.gyazo.com/522e4177510524dab532e09ea5332590.png)

```
 Command 'run-ios' unrecognized. Make sure that you have run 'npm install' and that you are inside a react-native project.
```

react-native init して作成したプロジェクトなのに、
なぜ実行できなくなるんだと、
色々調べていたところ、以下のコマンドで対応できました。

```
 npm i
```

素直にnpmのインストールし直したってことでしょうか。
以下の類似のissueが参考になりました。

[When Running react-native run-android inside example folder, throwing error in console](https://github.com/react-community/react-native-maps/issues/1435)
Nil is not compatible with expected argument type '[Any]'

Nil is not compatible with expected argument type '[Any]'

エラーは、バージョンが異なり、構文が変更され、nilが[]に変更されたためです。
古いバージョンの言葉遣い：![Snip20180101_4.png](https://qiita-image-store.s3.amazonaws.com/0/227685/3c297058-d32f-be08-7378-1eaeb554bf6a.png)

正しい言葉遣い：![Snip20180101_5.png](https://qiita-image-store.s3.amazonaws.com/0/227685/5da7b8be-241e-99ef-b5eb-54ab81d871f2.png)
Raspberry piとsshとRasPi CheckでWake on Lanしてみる

#目的
- 自分のPCをLANの外から起動したい

##前提条件
- 自分のPCが有線LANで接続されている
- ルーターのWoL機能が使用できない、もしくは使いづらい
 - WoL機能がネットワーク管理者専用だけど、ルーターの管理者アカウントは教えてもらえない
 - そもそもルーターにWoL機能が無い
- ただし、管理者に申請すれば以下の事をしてもらえる/許可を取れる
 - ポート開放、もしくはLANへのVPN接続が出来る。
 - 自分のPCにターミナルアプリをインストールする
 - 自前のRaspberry piとAndroid端末をネットワークに接続出来る

##作業
- Raspberry piにraspbianをインストールして、sshを設定する。諸先輩方が色々な情報やノウハウを書いているので詳細は省略。途中からターミナルアプリを使って遠隔操作に切り替える人が多いと思う。
- それから、Raspberry piにwakeonlanをインストール
`＄sudo apt-get install wakeonlan`

- ポート開放の設定方法については使用しているルーターによって大幅に手順が違うので割愛。
　- 筆者環境だとVPN接続でLANにアクセスできるので、Raspi上のsshサーバにアクセスするためのポート開放をしていない。
- DHCP環境だと「DHCPリース範囲外のipアドレスを手動で割り当てる」もしくは「ネットワーク管理者に依頼して固定リース」の方法がある。筆者は後者を採用。
- 自分のPCのMACアドレスを調べる。Windows環境なら、コマンドプロンプトを開いて
`C:\>ipconfig /all`と入力すれば調べられる。

- Android端末にRaspi Checkアプリを入れる。
 - [Raspi Checkアプリ](https://play.google.com/store/apps/details?id=de.eidottermihi.raspicheck&hl=ja)
 - [GitHubページ](https://github.com/eidottermihi/rpicheck)
 
- Raspi Checkアプリを設定する
 - 右上のメニューから「New Pi」を開いて、1ページ目に以下の事を入力する。

 1. Raspberry piのホスト名 or IP アドレス
 1. sshでのユーザー名
 1. 必要なら追加の情報

 - 2ページ目では、以下の事を入力する

 1. 認証方法(パスワード、秘密鍵方式、パスフレーズ併用の秘密鍵方式)を選択する
 1. 秘密鍵を使用する場合、「CHOOSE KEYFILE」で秘密鍵ファイルを選択する
 1. 更にパスフレーズを併用する場合、「Always ask for passphrase」のチェックを外すとパスフレーズの入力欄が現れ、Raspi Ckeckアプリに記憶させる事も出来る。
 1. 後はsshのポートと、sshのアカウントのパスワード(パスワードログイン及びRaspiの稼働状況取得にsudoが必要)を入力する。

 - 正常に接続出来る事を確認したら、最初の画面の「COMMANDS」ボタンを押し、右上の「+」ポタンで、以下の事を入力する

 1. 名前 (ここでは「Wol *ラズパイのhostname*」とかが分かりやすい)
 2. コマンド (「wakeonlan *自分のPCのMACアドレス* 」 といった感じになる)
Railsで位置情報を取得したい時にやったことのメモ

elasticsearhで位置情報検索をさせようと思い、緯度経度の情報をどうやって取得しようかと考えていたのだが、結局[geocoder](https://github.com/alexreisner/geocoder)を使うことにした。

これだとaddressってattributeがあると自動でlatitudeとlongitudeってカラムに緯度経度が入る。

# 設定
例えばテーブルの定義をこんな感じにしていく

```
 create_table "Places", force: true, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin ROW_FORMAT=DYNAMIC" do |t|
   t.string   "address",     limit: 80, null: false
   t.float    "latitude",               null: false
   t.float    "longitude",              null: false
   t.datetime "created_at"
   t.datetime "updated_at"
 end
```
そしてmodelに以下のコードを追加

```app/modles/place.rb
class Place < ApplicationRecord
  geocoded_by :address
  after_validation :geocode, if: ->(obj) { obj.address.present? and obj.address_changed? }
end
```

これで以下のようにaddressをセットすると緯度経度が自動でセットされる。

# 実験

```
place = Place.create('横浜市青葉区')

> place
#<Place:0x007f85d74a5588
 id: 1,
 address: "横浜市青葉区",
 latitude: 35.55282400000001,
 longitude: 139.5370189,
 created_at: Mon, 01 Jan 2018 00:30:34 JST +09:00,
 updated_at: Mon, 01 Jan 2018 00:30:34 JST +09:00>

```

便利だ。これをElasticsearchに突っ込めば、これを使って位置情報の検索できる！！
[kensington]プレビュー.appのページめくりを楽にする


# 経緯
Macのプレビュー.appがちょっとだけ嫌い。
ページめくりを `Space` or `Shift+Space` でやっているので、読み飛ばしたときに戻ろうとして `Shift` を押しそこねるといつまでたっても目的のページに戻れない。HHKBなのでダイヤモンドキーでのページ送りはちょっとつらい(右手の小指は一本しかなく代替が効かない)。

1. 片手でつかえる
2. 順送り、逆上りがそれぞれ独立している
3. ページめくってる感があって安心して連打できる

そんなページ送りがほしいので、トラックボールとの連携でやればいいのかもと考えた。

# 諸注意
ここでは Kensingtonの **TrackballWorks :tm:  Version 1.3.0** を利用しているため、当該ソフトに少なからず依存する点ご了承願いたい。
ただ他のマウスでも、たとえば[BetterTouchTool](https://www.boastr.net/)などを組み合わせることで実現可能なのかもしれない。便利かもと思われた御仁はぜひ試してみていただきたい。

# 設定1 TrackballWorks

![スクリーンショット 2017-12-31 23.50.03.png](https://qiita-image-store.s3.amazonaws.com/0/1556/1ff51ba4-49c2-e5cf-76fb-994ee3f33ab6.png "スクリーンショット 2017-12-31 23.50.03.png")

これは既存の設定をそのまま使った。
記憶が定かではないが、Chromeがキーボードの `Backspace` からページバック機能を取り除いた当時に、
`cmd+←` `cmd+→` を明示的にトラックボールの第三、第四ボタンに割り当てた気がする。

# 設定2 [キーボード]→[ショートカット][アプリケーション]でプレビュー.appにショートカット追加

![shortcut.png](https://qiita-image-store.s3.amazonaws.com/0/1556/8a47a7b2-8e8f-b01b-d48f-dadc26e76d0e.png "shortcut.png")

|名称|キーコンビネーション|
|:--|:--|
|上|⌘+←|
|下|⌘+→|

この `名称` はプレビュー.appのツールバー[移動]配下にある一覧から取得したもの

![スクリーンショット 2018-01-01 00.18.37.png](https://qiita-image-store.s3.amazonaws.com/0/1556/15ca0d0c-6d72-bfc7-df85-6c2aa03045f5.png "スクリーンショット 2018-01-01 00.18.37.png")

これだけでトラックボールのボタンにページめくり、戻りの文脈が紐付いた。嬉しいことこの上ない。

# あわせて読みたい

* [MacのPreview.appでvimキーバインドを使って移動 - Qiita](https://qiita.com/yohm/items/90005c4fe8d13b82922e)

銀の弾丸だ!![^1]

[^1]: と思ったが現在の Karabiner-Elements ではできない???
知っておきたいLinuxファイルシステムの概念

## ファイルシステムとは

ファイルシステムとは、データとメタデータをある構造に従ってストレージデバイス上に格納したものを指す。
ファイルシステムの作成には ```mkfs(8)``` コマンドを使用する。

## 全体アーキテクチャ

以下の図の通りである。詳細は以下で説明する。

![ext2-vfs.gif](https://qiita-image-store.s3.amazonaws.com/0/89391/b4973f98-def0-9903-dfd9-075b017ae705.gif)


## ファイルシステムの構造

ここでは、古典的ファイルシステムであるext2をベースに説明する。
ファイルシステム内で領域を割り当てる基本単位を論理ブロックという。ディスクデバイスの連続する物理ブロックから構成される。論理ブロックサイズ1024,2048,4096バイトのいずれかを選択できるが、これは ```mkfs(8)``` のパラメータとして与える。

ディスク上では、以下のように格納される。※ext2の構造はブロックグループごとに分かれており、もう少し複雑になっている。
![diskpartition-filesystem.PNG](https://qiita-image-store.s3.amazonaws.com/0/89391/27f9cd3c-f7e3-978e-1b8e-c7625fcda022.png)

* ブートブロック・・・OSを起動する情報を保存する。すべてのファイルシステムでブートブロック用に空きスペースとなっている。常に先頭に位置する。
* スーパブロック・・・ブートブロックの直後に位置する1ブロックの領域である。「i-nodeテーブルサイズ」「論理ブロックサイズ」「論理ブロック数」を保存する。
* i-nodeテーブル・・・ファイルシステム内のすべてのディレクトリ、ファイルはi-nodeテーブル内で1エントリを占めている。
* データブロック・・・ファイルシステムの大半を占めるブロックで、ファイル、ディレクトリを構成する情報を保存する。

## i-nodeとは

i-nodeはファイルシステムにおけるデータ構造である。1ファイル、ディレクトリごとにi-node tableの1エントリが使用される。i-node内には以下の情報が保存される。

* ファイルの種類
* オーナ(UID)
* グループ(GID)
* パーミッション
* タイムスタンプ(ファイルに最後にアクセスした時刻/ファイルを最後に変更した時刻/ファイルの属性を最後に変更したした時刻)
* ハードリンクカウント
* バイト単位のファイルサイズ
* ファイルに割り当てたブロック数
* ファイルデータを保存したデータブロックへのポインタ

i-nodeは以下の図のような構造になっている。

![ext2-inode.gif](https://qiita-image-store.s3.amazonaws.com/0/89391/ec42d3c4-e517-d7fc-6a7c-e1ac1dc7df6e.gif)

![ext2-dir.gif](https://qiita-image-store.s3.amazonaws.com/0/89391/94b90320-6915-3f24-6bdd-64cdbb652310.gif)

i-nodeでは、i-node内に保持しているデータブロックへのポインタによって、ファイルデータを持つデータブロックを特定する。この構造によってファイルは連続したブロックを保持する必要がなく、ディスクを効率良く使用することができる。同時にi-nodeサイズの固定化、複数のデータブロックにまたがる巨大ファイルサイズのファイルの格納が可能、小さなサイズファイルのファイルに対して低レイテンシでアクセス可能になった。

## VFS

Linuxで使用できるファイルシステムの実装はそれぞれファイルシステムごとに異なる。ユーザランドから統一的にファイルシステムを操作できるためのインターフェイスがVFSである。VFSによって、プログラムは個々のファイルシステムの実装の詳細を気にすることなく、VFSが持つインターフェイスのみを使用すればよい。
VFSが定義する汎用インターフェイスは、ファイルやディレクトリを処理する通常のシステムコール( ```open()```、```read()```、```write()```、```stat()```等)に対応するものである。
プログラムからの書き込み要求に関しては、バッファキャッシュを使用した遅延書き込みが可能である。

## ジャーナリングファイルシステム/非ジャーナリングファイルシステム

ext2といった非ジャーナリングファイルシステムは、ファイルの整合性/維持に ```fsck``` を実行する必要がある。整合性確認とシステムクラッシュ時の修復にはファイルシステム全体を調べないといけない。ファイルシステムが大規模になると時間がかかるという欠点がある。
非ジャーナリングファイルシステムの欠点を補う形で、ジャーナリングファイルシステムでは、メタデータのすべての変更を、実際に変更する前にディスク上に変更内容をログ(ジャーナル)として記録する。メタデータの更新時にシステムクラッシュによって変更できなかった場合には、ディスク上に記録したログを使用して、未完の更新をredoすることでファイルシステムの整合性を保つことができる。ただし、ファイルの更新時にログへの書き込みのオーバヘッドが伴う。

## 参考

 - [1]MICHAEL KERRISK著 千住 治郎訳,「LINUXプログラミングインタフェーズ」,O'REILLY,2012
 - [2]Design and Implementation of the Second Extended Filesystem:[http://e2fsprogs.sourceforge.net/ext2intro.html](http://e2fsprogs.sourceforge.net/ext2intro.html)
6歳にプログラミングを教えて失敗した話

microbitをなんとか有効的に使いたい ＆ 前からプログラミング教育に興味があったので、隣家の家族に協力してもらい、男の子(6歳)にプログラミングをマンツーマンで教えてみた。

## 使ったもの
* Mac Book Air
* USBマウス
* microbit
* USBケーブル(タイプB)

## 生徒（1人）
* 隣人の6歳男子
* ゲーム大好き
* プログラミングに興味があるかは不明（多分ない）
* 母親はプログラミング教育にかなり興味あり

## 授業について
* 授業会場は筆者の家のリビング
* 授業時間は30分
* [microbitサイト](https://makecode.microbit.org/#)のビジュアルプログラミングで動作を組み立てるやり方
* 筆者の家なので妻と娘(1歳)がリビングで自由にしてる
* 生徒の親は不参加

## やったこと
* プログラムとはなにか？を軽く説明
* Microbitで起動時にLEDで好きなマークを表示
* microbitのAボタン押下でLEDにお化けを表示（if的な処理）
* microbitのBボタン押下でLEDにウンチを表示（if的な処理）

## 結果
* 「ゲームはプログラムで作られている」と説明すると「え？ほんと？」と興味を示す
* 最初にmicrobitでLEDを表示させた後、飽きたのか席から逃亡して娘のオモチャで遊び始める
* なんとか席に戻してもすぐ、逃亡して授業がなかなか進まなかった
* なんとか授業は完遂したが<b>プログラミングとは何か的なことは10％も伝わってない</b>
* 俺「なんとか終わったね、お疲れ様！」 男の子「そんな事より外で遊ぼうよー」

## 反省点

### マウスが操作できる前提だった
* まずこれが間違い
* マウスに慣れてない子だった
* クリックが狙ったところにできず苦労していた
* 今時の若い子はPCを使えると思ったが、時代はスマフォが主流らしい

### microbitに興味を示さなかった
* 6歳の男の子なら光る機械に興味を持つだろうと思ったが、これが間違い
* LEDを1回表示させたら飽きた
* Scratchのようにキャラクターを動かすやり方の方がいい
* microbitを使うならもう少し年齢が上じゃないとダメ

### 授業机にコタツはNG
* コタツだと簡単に立ち上がって席から離脱できてしまう
* 机＋椅子で多少逃げにくくすべき

### 授業部屋はテレビがON & オモチャがあってはならない
* 娘がテレビを見ていたので男の子もついつい見てしまう
* 娘のオモチャが気になってPC画面を見てくれない
* むしろ授業PCよりもテレビとオモチャを多く見ていた
* 授業するなら誘惑するモノを同じ部屋に置いてはならない（当たり前）

男の子の母には成果物としてmicrobitの完成物を見せ、「え？これを作ったんですか？」的な驚きコメントを頂いた。  
が、結果としてプログラミング学習できたかは怪しく、「子供にモノを教えて静かに聞いてもらえるって難しいですね」と伝えると笑ってくれた。

# 今回の失敗で得たもの
### **環境作りは超大事！**
  * 家でやるならPC以外に何もない部屋を用意しなければならない

### **絵で説明すること**
  * 口だけで説明しても男の子は全くイメージできてなかった
  * 下手な絵でもいいから紙にでも書いて説明するべき

### **年齢に合わせた学習方法を選ぶこと**
  * 光るデバイスに飛びつくのは少数派らしい
  * 子供が興味をもつキャラクターものにするべき

## 次回に盛り込みたいこと
* 生徒数を複数にしたい（競争させて集中させよう作戦）
* ラズパイ3でScratchでの授業を試したい
* microbitを使うなら音を出す授業にしたい（音が出せるの？と興味を持っていた）
* デバイスを使わずCode Monkeyのようなサイトでの授業もやってみたい
iOS Simulatorでシミュレータのsqlite dbを参照する方法

お初になります。新人えんじにゃーの@marloweです。

タイトル通り、iOSアプリの開発をしていて、ローカルDBの中身を確認したくなった時に使ってます。

方法は２つあります。

１つ目は、@t_punch さんの書かれた記事([xcode：iOS シミュレーターのフォルダの場所](https://qiita.com/t_punch/items/edab6f323e823be4f527))に記載されている通り、スクリプト作って毎回開く方法。

２つ目は、xcode pluginのSQLPluginを使って見る方法。

package managerのAlcatrazをinstallして、installできたらxcodeメニューバーの[Window]->[Package Manager]のメニューが追加されているので、そこからSQLPluginを追加する。

そうすると、メニューバーに[SQL]が追加されているので[SQL]->[SQL Viewer]で見れる。
ゲストのCentOS7からインターネット接続する方法(NAT)


- Windows 10
- VMware Workstation 14 Player
- CentOS Linux release 7.4.1708 (Core) 

という環境のもと、ゲストのCentOSからインターネットに接続するための方法(設定はNAT)をまとめた――というより自分の作業記録ができたので、共有したいと思います。超絶超絶超絶苦労したぜ(´・ω・｀) 

__お断り: ちなみに「ゲストOSから外部ネットワークに接続する方法」については、インターネット上ではさまざまな手法が紹介されています。これは「ゲストOSからインターネットに接続できない」原因が多種多様だからであり、わたしがこれから紹介する方法もそのひとつの対策法に過ぎず、少なくとも唯一絶対の解決策ではありません。要するに以下の方法で問題が解消しなくても、怒らないでほしいということと、あきらめずに別の手法を試してほしいということです(´・ω・｀)__

➀「スタートメニュー > 設定 > Windowsの設定 > ネットワークとインターネット > 状態 > アダプターのオプションを変更する」の順番に押下します。なお「設定」は下図赤枠の歯車アイコンになります。またスタートメニューは、通常画面下にあるWindowsアイコンを押下する、もしくはキーボードのWindowsキーを押下することで表示されます。

![widowsの設定2.png](https://qiita-image-store.s3.amazonaws.com/0/105859/d87eb3fa-1ce0-9822-e6a0-70e788392816.png)

![状態_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/58d4ec04-5222-d4c1-ff39-8a33e3ba1496.png)

➁「アダプターのオプションを変更する」押下時に表示される「ネットワーク接続」のウィンドウにおいて、実際にインターネット接続に利用しているアダプターを特定し、そのアイコンの上部で右クリックし「プロパティ」を押下します。その後表示される「xxxのプロパティ」ウィンドウでは、まず「共有」タブに移動し「ネットワークのほかのユーザに、このコンピュータのインターネット接続をとおしての接続を許可する(N)」にチェックを付けます。すると「ホームネットワーク接続(H):」のプルダウンメニューが活性化されるので「VMWare Network Adapter VMnet8」を選択し「OK」を押下します。

![ネットワーク接続2_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/94e4d724-974f-f8cd-0c22-3ae3048e525e.png)

![Wi-Fiのプロパティ_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/d342a07b-7d9b-f545-9fc3-8736b7cc4722.png)

➂➁で表示した「ネットワーク接続」のウィンドウに戻った後、「VMWare Network Adapter VMnet8 > VMWare Network Adapter VMnet8の状態 > 詳細」の順番に押下すると「ネットワーク接続の詳細」ウィンドウが表示されるので「IPv4 アドレス」の値を記録しておきます。

![ネットワーク接続の詳細_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/f7e537a3-9cf8-a399-1477-c8387c8f9cc0.png)

➃VMware Workstation Playerで、インターネット接続をしたい仮想マシンの「仮想マシン設定の編集(D)」を押下します。その後表示される「仮想マシン設定」で「ネットワークアダプタ」を押下、右ペインの「ネットワーク接続」で「NAT」のラジオボタンがチェックされていることを確認します(別の設定になっている場合は「NAT」にチェックをつけて「OK」を押下します)。

![VMWare Workstation 14 Player_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/b458fa60-e841-4250-deb8-e34ab98513b7.png)

![仮想マシン設定.png](https://qiita-image-store.s3.amazonaws.com/0/105859/0cff8b1a-b603-5598-cf92-a57da9bafc48.png)



➄ここでCentOSを起動。「アプリケーション > システムツール > 設定 > すべての設定 > ネットワーク > 有線 > 歯車アイコン」の順番に押下します。

![アプリケーション_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/3ec21ba9-f7d8-1777-cadb-08ad66160fbc.png)

![すべての設定_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/eeca9b65-0d1e-5012-c3b1-18f5b4f339e0.png)

![Network_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/c39bc697-4204-09fc-1d74-5d2c5c3feda8.png)

➅「有線」ウィンドウでは「IPv4」タブへ移動。以下の通りに設定を行います。

1. IPv4(4) オン
2. アドレス(A) 自動(DHCP)
3. DNS 自動オフ
4. サーバー ➂で記録したIPアドレス
5. ルート 自動オフ

![有線_edit.png](https://qiita-image-store.s3.amazonaws.com/0/105859/7fef9d7a-4bf4-69a0-d1f6-b6a6f88d93a0.png)

➆あとは任意の方法でネットワーク環境を再起動すると、ゲストOSからインターネットへ接続できるようになっている――はず(´・ω・｀)

 ![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/105859/710de428-9b18-9fdd-ff79-6595587c7e71.png)