OmniAICreator/Qiita-1.07M huggingface dataset:
Mac Book をスリープさせる方法 3種類 ( 蓋を閉じる /  電源ボタンを軽く長押し  / ショートカット )

MacBook歴2年なのに、あまりよく分かっていなかった。

## 1. 蓋を閉じる

おなじみ。

## 2. 電源ボタンを軽く長押し

1秒ほど押す。

それより長く押すと別の動作になってしまう。

## 3. ショートカット

`Control + Shift + 電源ボタン` 

( EJECT KEY と書いてあるページが多いが、電源キーでもOK)

# スリープ解除時にパスワード入力させる

- スリープしている
- スリープしているように見せかけてスタンバイしている

の二つの状態があると思っていたが、違うらしい。

スリープしてからパスワード入力が必要になるまでの秒数を、設定で変えられるようだ。

参考: [Mac - スリープ/スクリーンセーバー解除にパスワードを要求する/しない - PC設定のカルマ](https://pc-karuma.net/mac-require-password-after-sleep-screensaver/)

ちなみにこの設定をしても、蓋を閉じて1秒ぐらいで開いたら、パスワード入力は要求されなかった。

# 感想

- 本体操作はいちど意識して覚えないと、なんとなく、ぼやっとしたままの理解が続く場合がある。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ReduxのReducerでネストしたstateのマージを行う

たとえば，複数のユーザのフレンド・フォロワーを，stateとして以下のような構造で保持するストアを考えます。

```json
{
  "@user_xxx": {
    "friends": [
      "@user_yyy",
      "@user_zzz"
    ],
    "followers": [
      "@user_yyy"
    ]
  },
  "@user_yyy": {
    "friends": [],
    "followers": [
      "@user_xxx"
    ]
  }
}
```

フレンド・フォロワーだけを個別にページネートして取得するAPIが存在する場合，既に取得している他の情報を消してしまわないように，ネストしたstateのマージを行う必要があります。最初書いたコードは以下のようになりました。

```js:actions.js
export const FETCH_FOLLOWERS_SUCCESS = 'FETCH_FOLLOWERS_SUCCESS'
```

```js:reducer.js
import { FETCH_FOLLOWERS_SUCCESS } from './actions'

export default (state = {}, action) => {
  switch (action.type) {

    case FETCH_FOLLOWERS_SUCCESS:
      return {
        ...state,
        [action.params.screenName]: {
          ...(state[action.params.screenName] || {}),
          followers: [
            ...((state[action.params.screenName] || {}).followers || []),
            ...action.payload 
          ]
        }
      }

    default:
      return state

  }
}
```

うわあ，とてつもなく読みにくい…しかし

- **`...`演算子はオブジェクトではないものに使ってもエラーを吐かず，空オブジェクトと同じように扱われる**

という特性を知ったので，以下のように書けることが判明しました。

```js:reducer.js
import { FETCH_FOLLOWERS_SUCCESS } from './actions'

export default (state = {}, action) => {
  switch (action.type) {

    case FETCH_FOLLOWERS_SUCCESS:
      return {
        ...state,
        [action.params.screenName]: {
          ...state[action.params.screenName],
          followers: [
            ...(state[action.params.screenName] || {}).followers,
            ...action.payload 
          ]
        }
      }

    default:
      return state

  }
}
```

ただ，`...`自体は安全でも`null`や`undefined`からメソッドチェインすると例外飛ぶのつらい…実際

- `(((a || {}).b || {}).c || {}).d`
- `a && a.b && a.b.c && a.b.c.d`

で何とかなるけど増えてくるとつらい…というときには，このような関数を作っておくと幸せになれそうです。

```utils.js
export const safe = (lambda, ...args) => {
  try {
    return lambda(...args)
  } catch (e) {}
}
```

```js:reducer.js
import { safe } from './utils'
import { FETCH_FOLLOWERS_SUCCESS } from './actions'

export default (state = {}, action) => {
  switch (action.type) {

    case FETCH_FOLLOWERS_SUCCESS:
      return {
        ...state,
        [action.params.screenName]: {
          ...state[action.params.screenName],
          followers: [
            ...safe(() => state[action.params.screenName].followers),
            ...action.payload 
          ]
        }
      }

    default:
      return state

  }
}
```

だいぶ見やすくなったね！
ショートカットを作成するバッチファイル(ファイル単体, JScript混在)

# 背景
　現場でバッチからショートカットが作れなくて困っていた。
　家に帰ってから作ってみたけど家では使い道がない…。でもせっかく作ったので記録しておく。

# 仕様概要:
　使おうとしていた環境はWindows7端末。
　バッチへPathが通っていることが前提条件。

## 使い方①：1行でデスクトップにショートカットを作成する
　ショートカットの動作：ダブルクリックするとただメモ帳が起動する

```bat:cmd
shortcut "%USERPROFILE%\Desktop\hogehoge.lnk" "C:Windows\notepad.exe"
```

## 使い方②：1行で「送る」にショートカットを作成する
　ショートカットの動作：右クリック->「送る」するとメモ帳で開く

```bat:cmd
shortcut "%USERPROFILE%\AppData\Roaming\Microsoft\Windows\SendTo\hogehoge.lnk" "C:Windows\notepad.exe"
```


# とりあえずソース
　丸コピして保存すればすぐ使えるはず。

```js:shortcut.bat
@if(0)==(0) echo off
cscript.exe //nologo //E:JScript "%~f0" %*
goto :EOF
@end

// メイン処理
function main() {
	var shortcut = null;
	try {
		// ショートカットを作成する
		shortcut = new ShortcutCreater();
		shortcut.create();

		// 作成したショートカットをコンソールに出力する
		Console.println("ショートカットを作成しました");
		Console.println(shortcut);

	} catch (e) {

		// 例外原因をコンソールに出力する
		Console.println("[error occured]: " + e.description);
		Console.println("usage: shortcut.bat [filepath] [linkpath]");

		// 異常終了でコマンドを返す
		Console.back(e.number);

	} finally {
		
		// WSHオブジェクトを片付ける
		if (shortcut !== null)
			shortcut.cleanup();
	}

	// 正常終了でコマンドを返す
	Console.back(0);
}

// コンソール汎用クラス
var Console = ((function() {
	var constructor = function() {}
	constructor.println = echoConsole;
	constructor.back = exitScript;
	return constructor;
})())

// ショートカットを作るクラス
var ShortcutCreater = function() {
	var args = WScript.Arguments;
	validate(args);
	this.wshObj = openWsh();
	this.file = args(0);
	this.link = args(1);
	this.create = createShortcut;
	this.cleanup = closeWsh;
	this.toString = createrToString;
}

// ----- 以降関数群 -------

function validate(args) {
	if (args == null) {
		throw new Error(1, "args=null or undefined");
	}
	if (args.length !== 2) {
		var str = "args = ";
		for (i=0; i < args.length; i++)
			str += "[" + i + "]:" + args(i) + " ";
		throw new Error(2, str);
	}
}

function createShortcut() {
	var lnkFile = this.wshObj.CreateShortcut(this.file);
	lnkFile.TargetPath = this.link;
	lnkFile.Save();
}

function createrToString() {
	return "file=\"" + this.file + "\", linkTo=\"" + this.link + "\"";
}

function openWsh() {
	return WScript.CreateObject("WScript.Shell");
}

function closeWsh() {
	this.wshObj = null;
}

function echoConsole(msg) {
	WScript.echo(msg);
}

function exitScript(errNum) {
	WScript.Quit(errNum);
}

// メイン処理呼び出し
main();
```

JScript部分については説明を割愛する。

# おまじない

　この先頭4行がミソで、これ以降のソースはWSHのJScriptで書ける。

> @if(0)==(0) echo off
> cscript.exe //nologo //E:JScript "%~f0" %*
> goto :EOF
> @end

　正式な文法ではなく裏ワザ的なものみたいで、動作保証についてちょっと心配ですが、
　かなり昔から動いてるだろうし大丈夫かな、と個人的には思いました。
　いやあ、それにしても考えた人はすごいですね。


# 参考文献

　大変助かりました。ありがとうございました。

　[BATとWSHのコードを1ファイルに混在させるためのshebang記法（複雑なバッチを１ファイルで実現）](http://computer-technology.hateblo.jp/entry/20131025/p1)

　[JScript でハマる日々](http://d.hatena.ne.jp/miya2000/20090823/p0)
[macOS Sierra] nokogiri インストール中のエラー "Permission denied @ dir_s_mkdir" の 1解決手法 


## はじめに
rubyでスクレイピングを行えるnokogiriのインストールでよくハマることが多い。
解決方法の記事が山ほどあるけど、その中の1つとしてあげる。

## 環境
macOS + rbenvの環境。

OS: macOS 10.12.4 (Sierra)
Ruby: ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
nokogiri: nokogiri 1.7.2 with native extensions

## エラー内容

```
$ gem install nokogiri -v '1.7.2'

Building native extensions.  This could take a while...
ERROR:  While executing gem ... (Errno::EACCES)
    Permission denied @ dir_s_mkdir - /Users/username/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions/x86_64-darwin-16/2.4.0-static/nokogiri-1.7.2
```
EACESSはアクセス権限系のエラー。
パーミッションか所有者？

## 原因
所有者がrootになっていた。

```
$ ls -al
total 0
drwxr-xr-x  12 root  staff  408  4 29 17:44 .
drwxr-xr-x   3 root  staff  102  4 29 16:52 ..
drwxr-xr-x   5 root  staff  170  4 29 16:55 bindex-0.5.0
drwxr-xr-x   5 root  staff  170  4 29 16:55 byebug-9.0.6
drwxr-xr-x   6 root  staff  204  4 29 16:55 ffi-1.9.18
drwxr-xr-x   6 root  staff  204  4 29 16:54 nio4r-2.0.0
drwxr-xr-x   6 root  staff  204  4 29 16:53 nokogiri-1.7.1
drwxr-xr-x   6 root  staff  204  4 29 16:55 puma-3.8.2
drwxr-xr-x   4 root  staff  136  4 29 17:44 rmagick-2.16.0
drwxr-xr-x   6 root  staff  204  4 29 16:55 sqlite3-1.3.13
drwxr-xr-x   6 root  staff  204  4 29 16:56 therubyracer-0.12.3
drwxr-xr-x   5 root  staff  170  4 29 16:54 websocket-driver-0.6.5
```

## 解決
chrootで所有者をユーザに戻した。

```
$ chown -R username /Users/username/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/extensions/
```

## その他
.rbenvごと所有者を変えてもいいかもしれない。
chemical spill containment

Among our collection of spill containment products are UltraTech Spill Berms, an ideal spill response product with various applications. When it comes to toxic chemical spills, you can never be too safe. Spills spread fast, and require not only lots of your time and money to clean, but also present a threat to the health and safety of you, those around you, including the environment. Finding the right, low-cost solution can seem daunting, but UltraTech has made it easy, with hundreds of advanced spill products.
Spill Containment Product Features
Thor Spill and Containment offers UltraTech Spill Berms at the lowest market price. The containment solution works by protecting nearby drains, doorways, and the environment from spills by sealing them off. Composed of urethane material, the unit “weeps” into even the smallest of cracks to help seal off any toxic liquids and stopping them in their tracks. This material also allows you to bend the berms to follow any angle you need. Shape them to fit any containment area you want protected. Polymer coated sidewalls provide added support and structure. The non-absorbing UltraTech Spill Berms are simply to use, and to clean, allowing for repeated use. The product allows for various features including spill response, temporary secondary containment, and the sealing off of doorways during washdown operations. The spill containment product also allows for not only containing large spills, but also diverting them. When you purchase the UltraTech Spill Berms through Thor Spill and Containment, you can also have sections cut to different lengths, customizing them to suit your needs. The UltraTech Spill Berms are also environmentally friendly, complying with various environmental regulations including NPDES and SPCC rules.
Contact Thor Spill and Containment Today
Contact Thor Spill and Containment today to purchase UltraTech Spill Berms or explore our website at http://thorspillproducts.com/ to view images and videos on the product. There, you can also find customer testimonials and other specifications that can help you make the important decision of which spill containment solution is right for you. We look forward to hearing from you!
Minecraft データを C++ レイトレーシングする

優秀な小中学生さまなら Minecraft データを C++ レイトレーシングしたいですね!

やりましょう!

できました.

https://github.com/lighttransport/nanort/tree/master/examples/minecraft

<img width="765" alt="Screen Shot 2017-05-19 at 2.16.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/7cfb11fb-8980-89cb-49ef-0a4359833985.png">


Data from http://www.westeroscraft.com/guide

The WesterosCraft Resource Pack is a remix of Dokucraft, Doku TSC, FyreUK, John Smith, Misa's Texture Pack, and other custom textures. The sound effects are from Soundjay.com and Pond5.com, either paid for under an Attribution 3.0 license or considered in the public domain.

## ことの由来

enkiMI という Micraft データのローダーを書いている Doug さんが, NanoRT http://qiita.com/syoyo/items/1aae159f9b262fbd4aa3 で Box primitive は扱えないの? と問い合わせがありました.

https://twitter.com/dougbinks/status/855349752535416832

NanoRT ではカスタムシェイプの交差判定をすることができますが, Box はまだでした. そこで Ray-AABB 交差判定のコードをベースに Box を扱えるようにしました.

https://github.com/lighttransport/nanort/blob/master/examples/minecraft/render.cc#L159

詳細は `CubeIntersector` クラスを見てね.


## TODO

法線の計算時に再度 Ray-AABB 交差判定しているのでちょっと無駄なので効率よくする.

パストレーシングとか追加する. 頑張ればこんな綺麗な絵がだせるようになるよ!

http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-tools/1265904-real-time-gpu-raytraced-minecraft

日々精進あるのみですね. 詳しくは Minecraft Raytracing でググってね.

## まとめ

* Minecraft + レイトレーシングで世界のみんなと仲良くなろう!
* 優秀な小中学生さまが, Minecraft + レイトレーシングを極めることで, 一億総 Minecraft レイトレーシング若人活躍社会を確立するスキームを極める旅に出たい
Raspberry Pi zero WからAgriBus NAVIにNMEAを流す

#概要
[GooglePlay AgribusNAVI](https://play.google.com/store/apps/details?id=com.agri_info_design.AgriBusNavi&hl=ja)に、Raspberry PiのBluetoothからNMEAを流せたら（諸所もろもろの事情で）便利だなと思い立ち、とりあえず目標達成はできたのでメモがわりに公開します。

#参考文献
・[RaspberryPi (jessie)とMac間のBluetooth通信[16/10/12時点 最新版]](http://qiita.com/endy/items/8089737b8fa51bdafdd1)

#bluetoothの設定
参考文献のほうが詳しく書いてあるので、そちらも参照してください。

```file:/etc/systemd/system/dbus-org.bluez.service
#ExecStart=/usr/lib/bluetooth/bluetoothd
ExecStart=/usr/lib/bluetooth/bluetoothd --compat
```

##ペアリング

```bash
$ sudo bluetoothctl

trust XX:XX:(AndroidのBluetoothアドレス)
quit
```
##Androidの操作
「設定」にある「Bluetooth」からRaspberry Piを見つけてペアリングする。

「AgriBusNAVI」の設定にあるGPSの設定をBluetoothに設定。接続するBluetoothをRaspberry Piに設定する。

#Bluetooth SPPを自動起動
末尾にあるexit 0の前に追加。

```file:/etc/rc.local
sdptool add --channel=22 SP &
sudo rfcomm listen /dev/rfcomm0 22 &
```
#rtklibのソースをgitで拾ってきてコンパイル

```bash
$ sudo apt-get install git
$ mkdir RTKLIB
$ cd RTKLIB
$ git clone https://github.com/tomojitakasu/RTKLIB.git
$ sh makeall.sh
$ cd ~/
```

##実行権限を付与。ついでにconfファイルをコピー。

```bash
$ cd RTKLIB/RTKLIB/app/rtkrcv/gcc/
$ chmod 755 rtkstart.sh
$ chmod 755 rtkshut.sh
$ cp ../rtk.conf ./
```

##rtk.confを編集する
熟知してるレベルからは遥かに遠いレベルなので、とりあえずRTKLIBの説明書とトラ技jrのアドレス貼っておきます。

http://toragi.cqpub.co.jp/Portals/0/support/junior/index.html
http://www.rtklib.com/prog/manual_2.2.0.pdf

#rtklibの起動スクリプトを用意

```/home/pi/rtkstart.sh
#/bin/sh
cd /home/pi/RTKLIB/app/rtkrcv/gcc/
screen -dm -S rtkrcv ./rtkrcv -s -o ./rtk.conf
```
screenで起動しているので、起動後にrootからはアタッチできます。

#自動起動するように設定
末尾にあるexit 0の前に追加。

```/etc/rc.local
sh /home/pi/rtkstart.sh &
```

#おまけ(シャットダウンスイッチを付ける)
http://denshikousaku.net/put-shutdown-and-reboot-button-on-raspberry-pi

#あとがき
とりあえず接続はできたものの、自分の環境ではbluetoothが数分-１０分程度で切断されてしまって、不安定すぎて使い物にならないレベル。
bluetoothに流れてるnmeaデータが文字化けして落ちてるような気がするけれども、今日のところはここまで。
快適なC++生活のためにスクリプト言語を使おう  - OpenCV C++でプロトタイピングしない理由 -

OpenCV C++でプロトタイピングしない理由

以下の記述の中では
import matplotlib.pyplot as plt
として[matplotlib](https://matplotlib.org/index.html)を利用していることを想定する記述となっています。


人の視覚特性では、グレースケール画像で細かい値の変化を読むことができません。
人の視覚特性では、グレースケール画像から数値を読み取ることができません。

- C++ cv::imshow(); : grayscale画像を表示すると、グレーの濃淡で表示する[1]。
- plt.imshow(): 様々なカラーマッピングで表示できる。
   

- C++ cv::imshow(); : 0-255のそれぞれに対して予め決められた濃淡で表示される。
- plt.imshow(gray, vmin=0, vmax=128)などと表示の範囲を指定できる。


C++ cv::imshow(); では、マルチプロットをすることができません。
アルゴリズムを構築する時点では、A4程度の出力に多数の画像を表示したくなります。
そのとき、１つの画像しか表示できないのは、不便です。

C++ cv::imshow(); では、画像の表示に対して、タイトルや、ラベルを付けたりすることができません。
アルゴリズムを構築する時点では、それぞれの画像、グラフが何を示しているのか、ファイル名や、縦軸や横軸の説明を書かないと、アルゴリズムの開発者自身にとっても理解できないものとなってしまいます。

OpenCV はグラフを書くライブラリを持っていません。

以下のようなプロットのグラフをOpenCVで書こうとしてはいけません。

```.py:
plt.plot(X, Y, 'ro')
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
```

-------

[1] 最近のOpenCVには[applyColorMap](http://docs.opencv.org/2.4/modules/contrib/doc/facerec/colormaps.html)
がある。Pythonのバインディングもあり、次のコードが動作した。
```>>> cv2.__version__
'2.4.11'
```

```ex_applyColorMap.py:
import cv2
import numpy as np
img = cv2.imread("lena.png", 0)
b = np.zeros(img.shape[:2], dtype=np.uint8)
jet = cv2.applyColorMap(img, cv2.COLORMAP_JET)
cv2.imwrite("jet.png", jet)
```


生成した画像

![jet.png](https://qiita-image-store.s3.amazonaws.com/0/83761/58b73f16-da1c-bad6-ee9e-f15b8c2b5caa.png)

しかしながら、cv2.imshow()とplt.imshow()には、次のように圧倒的な違いがあり、その違いを埋めることできません。

例：plt.colorbar(jet)のときに、欠損値をNaNで扱って表示する(欠損部分は白で表示)ことができますが、
cv2.imshow()はNaNを代入しても、欠損値を黒で表示するので、欠損値とゼロとの区別をすることができません。
![plt_imshow_NaN.png](https://qiita-image-store.s3.amazonaws.com/0/83761/abcac28d-7595-ce88-33f0-f1355d3e67f2.png)

![cv2_imshow_NaN.png](https://qiita-image-store.s3.amazonaws.com/0/83761/a8c06cd2-bb6b-d9be-679f-e60d33e80d2b.png)



```
imshow(...)
    imshow(winname, mat) -> None
```

```
imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, **kwargs)
    Display an image on the axes.
```
OpenPose de ROS

ROS Japan UG #10 勉強会(2017/5/20)
https://rosjp.connpass.com/event/55125/

LT発表 資料

-------------------------

![ROS_vol10_openpose_nnn112358_1.png](https://qiita-image-store.s3.amazonaws.com/0/73020/f8fbafa3-bb7f-6160-d5d9-e82c723cbbb6.png)

-------------------------

![ROS_vol10_openpose_nnn112358_200.png](https://qiita-image-store.s3.amazonaws.com/0/73020/26d58ae7-ffac-7026-8e7e-eb653056ff72.png)

-------------------------

![ROS_vol10_openpose_nnn112358_100.png](https://qiita-image-store.s3.amazonaws.com/0/73020/630d627c-09c7-aed9-920e-6c78e0b7b222.png)

------------------------------


![ROS_vol10_openpose_nnn112358_2.png](https://qiita-image-store.s3.amazonaws.com/0/73020/392ba5f8-f018-d887-2d6e-c3ec7f5bcfbf.png)

-------------------------

![ROS_vol10_openpose_nnn112358_07.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/b68c44e6-cd87-d0a5-2726-c1b7ec905a1b.jpeg)

-------------------------

![ROS_vol10_openpose_nnn112358_08.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/ef022a89-a0b2-1ca0-990a-d8520b2a1333.jpeg)

-------------------------
##ROSでcatkin使わず、makeする方法

https://github.com/gerkey/ros1_external_use

>ROS packages also provide pkg-config files,
>which opens the door to doing everything directly with make, not CMake.

-------------------------

![ROS_vol10_openpose_nnn112358_10.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/5c477697-b7b8-f3b8-607b-656582f65718.jpeg)

-------------------------

![ROS_vol10_openpose_nnn112358_3.png](https://qiita-image-store.s3.amazonaws.com/0/73020/62441cf0-fb25-2c1a-bec7-c79a294cb478.png)

https://github.com/nnn112358/openpose/blob/master/examples/user_code/openpose_ros_1.cpp

-------------------------
まとめ
・OpenPose凄い　→インタラクティブな何かできそう?
・ROS de 分散処理　→ROS_MASTER_URI
・ROS de make　→ROSにpkg-config がある

ちゃんとcatkin対応したopenpose_rosノードが出ていた。→こっちがオススメかも？
https://github.com/tue-robotics/openpose_ros

------------------------

参考
[・OpenPoseを動かしてみた。](http://qiita.com/nnn112358/items/a4490d85dac5827db53b)
[・OpenPoseチュートリアルのソースコードを読む。](http://qiita.com/nnn112358/items/ccd6330bed1e253d5ef9)

[・PCL_ROSをMakeFileでコンパイルする。](http://qiita.com/nnn112358/items/cdb899d21655b8b6c21b
)

------------------------
[Ruby] gets や ARGV、ARGF、STDIN、$stdin について

## Ruby の Kernel#gets や ARGV、ARGF、STDIN、$stdin について

- ARGV
  - 引数の配列。`--` で区切って記述しないと、スクリプトの引数ではなく Ruby の引数と判断される場合がある
- ARGF
  - ARGV の各引数をファイルパスとみなし、それらのファイルを連結した 1つの仮想ファイルを表すオブジェクト。ARGV が空なら `$stdin.gets` する。非IO
- Kernel#gets、Kernel#readline、Kernel#readlines
  - それぞれ `ARGF.gets`、`ARGF.readline`、`ARGF.readlines` と同じ。モジュール関数
- STDIN
  - 標準入力。読み込みするとユーザー入力を待つ IO オブジェクト。<kbd>Ctrl</kbd>-<kbd>D</kbd> (EOF シグナル) で打ち切ることができる。
- $stdin
  - 初期値が `STDIN`

### 注意1

- `IO#gets(nil)`
  - 行区切りなしですべて読み込む
- `IO#read`
  - 同じくすべて読み込む
- `ARGF.gets(nil)`
  - 行区切りなしで《1つのファイル》をすべて読み込む
- `ARGF.read`
  - 《すべてのファイル》を読み込む

### ためす

⚠ `[Enter]` は <kbd>Enter</kbd> 押下の意味で、実際には表示されない
⚠ `^D` は <kbd>Ctrl</kbd>-<kbd>D</kbd> 押下の意味で、実際には表示されない

#### $stdin のパターン (`$stdin != STDIN` の場合)

```sh
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.gets; p $stdin.gets '
"foo\n"
"bar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.gets(nil) '
"foo\nbar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.read '
"foo\nbar\n"
$ ruby -e ' $stdin = StringIO.new("foo\nbar\n"); p $stdin.readlines '
["foo\n", "bar\n"]
```

#### STDIN のパターン

- `$stdin == STDIN` の場合は `$stdin` を使っても同じ
  - さらに、`ARGF.filename == "-"` の場合は ARGF を使っても同じ
  - その場合は Kernel を使っても同じ

```sh
$ ruby -e ' p STDIN.gets; p STDIN.gets '
foo[Enter]
"foo\n"
bar[Enter]
"bar\n"
$ ruby -e ' p STDIN.gets(nil) '
foo[Enter]
bar[Enter]
^D"foo\nbar\n"
$ ruby -e ' p STDIN.read '
foo[Enter]
bar[Enter]
^D"foo\nbar\n"
$ ruby -e ' p STDIN.readlines '
foo[Enter]
bar[Enter]
^D["foo\n", "bar\n"]
```

#### ARGF のパターン (`ARGF.filename != "-"` の場合)

- Kernel を使っても同じ

```sh
$ echo foo > foobar.txt
$ echo bar >> foobar.txt
$ echo baz > baz.txt
$ ruby -e ' p ARGF.gets; p ARGF.gets ' -- foobar.txt baz.txt
"foo\n"
"bar\n"
$ ruby -e ' p ARGF.gets(nil) ' -- foobar.txt baz.txt
"foo\nbar\n"
$ ruby -e ' p ARGF.read ' -- foobar.txt baz.txt
"foo\nbar\nbaz\n"
$ ruby -e ' p ARGF.readlines ' -- foobar.txt baz.txt
["foo\n", "bar\n", "baz\n"]
```

#### ARGV のパターン

```sh
$ ruby -e ' p ARGV.shift; p ARGV.shift ' -- foo bar
"foo"
"bar"
$ ruby -e ' p ARGV ' -- foo bar
["foo", "bar"]
```

### 注意2

- Kernel#gets、Kernel#readline、Kernel#readlines はあるが、Kernel#read は存在しない
- 引数がない場合、`ARGF.filename == "-"` になるというだけなので、`-` を引数に渡しても STDIN から読み込む (`ruby -e ' p ARGF.read ' -- -`)
- ARGF はすべてのファイルを読み終わっても、勝手に `ARGF.filename == "-"` になるわけではない

----

おわり
Gitの拡張スクリプトをロードする機能をPythonで書いてみた

# Gitの特殊な機能

Gitでは、  `git-xxx` というスクリプト（**実行権限付でPATH下にあるもの**）があれば、**git xxx** という形で実行できるという特殊な機能があります。（有名な `git-flow` もこの機能を使って `git flow` と呼び出しています）

この機能をPythonで車輪の再発明をしてみる。

# 書いてみた

```python:mygit.py
# coding: utf-8

import os
import sys

from subprocess import call


class ExtensionLoader:

    def __init__(self):

        # 環境変数PATHはコロンでつながれた文字列なので、
        # コロンでsplitすることで配列に変換する
        self.PATH = os.environ["PATH"].split(":")

    def load(self, ext, args):

        # ext: 'mygit init' -> 'init'
        ext_absname = "mygit-{}".format(ext)
        found_flag = None
        extension = None

        for directory in self.PATH:
            # 'mygit-init'がdirectoryの中にあるかどうか
            if ext_absname in os.listdir(directory):
                found_flag = True
                extension = os.path.join(directory, ext_absname)

        if found_flag:
            # 'mygit-init'を見つけたら実行
            cmd = [extension]
            cmd += args # ここで実行する拡張スクリプトに引数を渡している
            return call(cmd)

        else:
            raise IOError("Extension does not found: {}".format(ext))

if __name__ == "__main__":

    if len(sys.argv) == 1:
        print "usage: mygit {command}"
        sys.exit(1)

    extloader = ExtensionLoader()

    # argv: ["mygit" "command", "arg1", "arg2", "arg3"]
    command = sys.argv[1]
    arguments = sys.argv[2:]
    exit_status = extloader.load(command, arguments)

    sys.exit(exit_status)
```

意外と簡単でした。

問題は **argparse** と併用できないことですね。
argparseは一応サブコマンドをパースできますが、登録されていないコマンドが入力されるとエラーを吐くし、あらかじめ拡張スクリプトのコマンドを登録するなんてことはできませんからね…
バイナリーファイルをJSONで送信する

#はじめに
バイナリーファイルをJSONで送信するには、
base64形式にエンコードして送信する必要があります。

#ﾌｧｲﾙをbase64形式で読み込み、postする
```node.js
var request = require('request');
var fs = require('fs');

fs.readFile('ﾌｧｲﾙﾊﾟｽ','base64',function(err,data){
    var jpara = {"text",data};
    
    request.post({
       url:'url',
       headers:{'accept':'application/json'},
       json:jpara});
}
```

#ﾌｧｲﾙをbase64形式で受け取り、保存する
またbase64形式で受け取った場合は、
デコードして、保存します。

```node.js
var request = require('request');
var fs = require('fs');

request.post({
    url:'',
    headers:{'accept':'application/json'},
}, function(err, res, body){
    // ﾃﾞｺｰﾄﾞ処理
    var text = new Buffer(body.text,'base64');
    // ﾌｧｲﾙの保存
    fs.writeFIle('ﾌｧｲﾙﾊﾟｽ',text);
});
```
Go言語の便利なfmt.Sprintf ~任意の型と文字列をまとめて文字列(string型に)~

# Go言語の便利な`fmt.Sprintf` ~任意の型と文字列をまとめて文字列(string型に)~
Goの静的型付けにおいて、`string`と他の型を`string`型として一緒に扱うことができるようにする`fmt.Sprintf`という便利な関数が存在する。

## Goの書式指定子

Go言語は、静的型付けの言語あり、`string`と他の型は一緒には扱えない。
そのため、[書式指定子](http://qiita.com/Sekky0905/items/c9cbda2498a685517ad0 "go 書式指定子") が存在する。

例えば以下のようにできる。

``` go
package main

import (
	"fmt"
)

func main() {
	type Person struct {
		Age    int
		Height int
	}

	p := new(Person)
	p.Age = 26
	p.Height = 170

	fmt.Printf("年齢%d\n身長%d", p.Age, p.Height)
}

```

結果

```
年齢26
身長170
```
## `fmt.Sprintf` を使う

上記のコードは、`string`と構造体`Person`のフィールドを一緒に扱っていた。

書式指定子で、任意の型と`string`を一緒に扱えるようになったはいいが、それ自体を文字列(`string`)として表すことはできないだろうか。
そんな時に活躍するのが、 [`fmt.Sprintf`](https://golang.org/pkg/fmt/#Sprintf "`fmt.Sprintf`")である。

`fmt.Sprintf` は、書式指定子に沿ってフォーマットした文字列を返してくれる。


``` go
package main

import (
	"fmt"
)

func main() {
	type Person struct {
		Age    int
		Height int
	}

	p := new(Person)
	p.Age = 26
	p.Height = 170

	str := fmt.Sprintf("年齢:%d\n身長:%d", p.Age, p.Height)
	fmt.Println(str)

}

```

結果

```
年齢:26
身長:170
```

上記のコードでは、 `"年齢%d\n身長%d"` という文字列(string)と `p.Age`, `p.Height` という`int`型が書式指定子によってフォーマットされ、それらが結合された文字列が`string`型として、戻り値で`str`に格納されている。

## もう少し応用してみる

以下のようなことも可能だ。

``` go
package main

import (
	"fmt"
)

func main() {
	type Person struct {
		Age    int
		Height int
	}

	p := new(Person)
	p.Age = 26
	p.Height = 170

	str := fmt.Sprintf("年齢:%d\n身長:%d", p.Age, p.Height)
	fmt.Println(str + "\n" + "ハンドルネーム:Sekky0905")

}

```

上記のコードは、一旦`fmt.Sprintf`で`string`　と`int`をフォーマットし、`string`にまとめてstrに格納している。

`str`は`string`型なので、`fmt.Println(str + "\n" + "ハンドルネーム:Sekky0905")`というのが可能になっている。

## 参考にさせていただいたサイト
[`fmt.Sprintf`](https://golang.org/pkg/fmt/#Sprintf "`fmt.Sprintf`")

## 関連記事
[忘れがちなGo言語の書式指定子を例付きでまとめた](http://qiita.com/Sekky0905/items/c9cbda2498a685517ad0 "忘れがちなGo言語の書式指定子を例付きでまとめた")



※ ブログでも同一記事を投稿している
[Go言語の便利なfmt.Sprintf ~任意の型と文字列をまとめて文字列(string型に)~](http://www.sekky0905.com/entry/2017/05/19/ "Go言語の便利なfmt.Sprintf ~任意の型と文字列をまとめて文字列(string型に)~")
ライブコーディングでお絵かきアプリつくった

# 概要
ライブコーディングすることになったので、お絵かきアプリをつくった。
かなり用意していったので「ライブ」かどうかは怪しいが、5分ほどで動くものができるので余興とかで使えるかも。

# 仕様
- canvasでお絵かきができる
- 使用できるのは(ペイントで言う)ペンのみ
- ペンの色が変えられる(赤、青、緑、黄、黒)
- 保存は出来ない
- クライアントサイドで完結

# コード
```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <title>お絵かきアプリ</title>
    <style>
      body {
        background: #666;
      }
      canvas {
        background: #fff;
      }
      button {
          width: 50px;
      }
    </style>
  </head>
  <body>
    <div>
      <canvas id="canvas" width="640" height="480"></canvas>
    </div>
    <div>
      <button onclick="changeColor('red')">red</button>
      <button onclick="changeColor('blue')">blue</button>
      <button onclick="changeColor('green')">green</button>
      <button onclick="changeColor('yellow')">yellow</button>
      <button onclick="changeColor('black')">black</button>
    </div>
    <script src="app.js"></script>
  </body>
</html>
```

```Javascript:app.js
const canvas = document.querySelector('canvas');
const context = canvas.getContext('2d');

document.addEventListener('mousedown', (event) => {
    context.beginPath();
    context.moveTo(event.clientX, event.clientY);
    document.addEventListener('mousemove', stroke);
});

function stroke(event) {
    context.lineTo(event.clientX, event.clientY);
    context.stroke();
}

document.addEventListener('mouseup', (event) => {
    document.removeEventListener('mousemove', stroke);
});

function changeColor(color) {
    context.strokeStyle = color;
}
```

# 所感など
JavaScriptが慣れてないこともあり、最初は練習が結構必要だった。
結構面白かったので定期的にアウトプットをするという目的でやってみると良いかも。

# その他
canvasのwidthとheightをstyleタグの中で指定したらうまくいかなかった。(原因は特に調べてない)
※ canvas自信ニキいたら教えてください
jQueryメモ(ドットインストール編)(編集中)

#　jQueryとは
Javascriptを便利に扱うためのライブラリ

[公式サイト](https://jquery.com/)

##書き方
###初級

お堅い書き方

```
$(document).ready(function() {
//ここに記載
});
```

一般的には上記のdocument...を省略して書く

```
$(function() {
//ここに記載
});
```

例えば pタグ の色の変更する場合は以下のように記載する

```
$(function () {
   $('p').css('background', 'red');
});
```

要は

```
$(function () {
   $('A').B();
});
```

「AをBする」という記載方法でこれだけ覚えておけば十分
Aにはタグ名だったり、id/classを指定する。
Bには処理を書く（click,css等)

###フィルタの使用

フィルタを使えばリストの特定のタグのみに効果を適用できる。


| 効果 |書き方  |
|---|---|
|イコール  |:eq()  |
|大なり＞  |:gt()  |
|小なり＜  |:lt()  |
|奇数|:even|
|偶数|:odd|
|含む|:contains()|
|最初、最後|:first,:last|
※カッコ内は数値


```example.html
<ul>
 <li>0</li>
 <li>1</li>
 <li>2</li>
 <li>3</li>
</ul>
```

```example.js
$(function () {
  $(ul > li:eq(1)).css('color', 'red');
})
```

実際の表示

-------------
0
<font color="red">1</font>
2
3

-------------

20170803追記
多分これでもかける

```example.js
$(function () {
  $('ul li:eq(1)').css('color', 'red');
})
```
20170803追記
###DOM要素の指定

| 効果 |書き方  |
|---|---|
|親要素  |parent()|
|子要素  |child() |
|次の要素|next()  |
|前の要素|prev()|
|兄弟要素|siblings()|

```example.html

```


```example.js

```

こちらの[サイト](http://ozpa-h4.com/2012/11/07/jquery-lecture/)も非常にわかりやすいので参考にさせていただきました。
セキュリティ | UK政府機関推奨 パスワードのペーストを許可しよう



- [Let them paste passwords - NCSC Site](https://www.ncsc.gov.uk/blog-post/let-them-paste-passwords) より

# パスワードのペースト禁止って何が発祥？

それは誰も知らない。

# なぜペーストを許可すべきなのか？

パスワードマネージャーがとても優れているから。

- ウェブサイト毎に異なるパスワードの管理を簡単出来る。
- ログインのたびのキーボードタイプの手間を減らし生産性を上げる。
- 長くて複雑なパスワードをシンプルに扱える。

# ペースト禁止の迷信

## 迷信1. ペーストを許可するとブルートフォースアタックの危険がある

たとえペーストを禁止しても、アタッカーがブルートフォースアタックを仕掛けるのなんて朝飯前だ。
なのでセキュリティにはほとんど関係ない。

## 迷信2. パスワードをペーストさせると、ユーザーがパスワードを忘れやすくなる

現実には、ユーザーがパスワードを思い出して使うケースなんて滅多にない。

毎日毎日パスワードを入力するのにうんざりしたユーザーにはパスワードマネージャーが魔法の杖になる。

だが「ペースト禁止」はそれすら封じてしまう。

## 迷信3. クリップボードにパスワードを入れるのは危険だ

- パスワードマネージャーはだいたいクリップボードからパスワードを消去してくれるから大丈夫。
- もしコンピューターがハックされた場合は全部の情報が掴まれてしまうんだから、サイト側でペースト禁止しても意味がない。
- IE6にはこれを突いた脆弱性があったけど、いまIE6を使ってるユーザーなんてどれぐらいいるの。 
  - ( `password paste security` でググると、IE6の脆弱性について書かれた記事が上位表示されるが、これは2010年の記事だ [Why you should never copy paste your passwords?](https://www.hacker9.com/why-you-should-never-copy-paste-your-passwords.html) )









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[CentOS7] ipv6 address の無効化

CentOSでのipv6 addressの無効化の方法を記します。

# ipv6 無効化

###① sysctl.conf に設定を追加

```CentOS
# echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
# echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
```

###② 設定を反映する

```CentOS
# sysctl -p
```

これで ipv6 address が無効になります。
`ip a`をすれば ipv6 address が消えているのが確認できると思います。

##参考

- http://www.unix-power.net/centos7/network_ipv6.html
Qtアプリでステータスバーに長いテキストを設定するとメインウィンドウの幅が広がる問題

# はじまり

あるところに小さなMainWindowがありました。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/61222/7615d901-5a04-08f8-7726-6924ad75ec08.png)

そのウィンドウにはボタンが付いていたそうな。

``` c++
void MainWindow::on_pushButton_clicked()
{
	status_label->setText("The quick brown fox jumps over the lazy dog");
}
```

ボタンを押してみると、なんと、MainWindowが広がってしまったではありませんか。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/61222/848c080a-6973-de31-ecd9-8e4fa01ef1eb.png)

# ふぐあい

MainWindowのコンストラクタで、ステータスバーにテキストを表示させるためのラベルを作っています。

``` c++
	status_label = new QLabel(this);
	ui->statusBar->addWidget(status_label);
```

このQLabelというクラス、表示されるテキストの幅に応じて伸び縮みするように設計されています。テキストが短い分には、MainWindowのサイズは影響を受けません。しかし、MainWindowの幅よりQLabelの方が大きくなったとき、MainWindowが強制的に広げられてしまいます。

MainWindowが狭くてテキストが収まらないのは仕方ありません。そんなときはテキスト全体が表示されなくても良いということにします。でも、MainWindowが強制的にサイズ変更されてしまうのはあまり嬉しくありません。

# たいさく

強制的に広がらないラベルクラスを作りましょう。

**StatusLabel.h**

``` c++
#ifndef STATUSLABEL_H
#define STATUSLABEL_H

#include <QLabel>

class StatusLabel : public QLabel
{
	Q_OBJECT
public:
	explicit StatusLabel(QWidget *parent = 0);
	QSize minimumSizeHint() const;
};

#endif // STATUSLABEL_H
```

minimumSizeHint() というメンバ関数をオーバーライドします。

**StatusLabel.cpp**

``` c++
#include "StatusLabel.h"

StatusLabel::StatusLabel(QWidget *parent)
	: QLabel(parent)
{
}

QSize StatusLabel::minimumSizeHint() const
{
	QSize sz = QLabel::minimumSizeHint();
	sz.rwidth() = 0;
	return sz;
}
```

最小サイズをゼロに書き換えてしまいます。

QLabelの代わりに、新しく作ったStatusLabelを使用します。

**MainWindow.h**

``` c++
private:
	StatusLabel *status_label;
```

**MainWindow.cpp**

``` c++
	status_label = new StatusLabel(this);
	ui->statusBar->addWidget(status_label);
```

# かいけつ

![3.png](https://qiita-image-store.s3.amazonaws.com/0/61222/1fb72b4b-4ad8-2a43-2cce-a81fcaa0a4c7.png)

テキストのはみ出た部分は描画されませんが、MainWindowが強制的に広がらなくなりました。

おしまい。
anytreeを使ってみた

(参考)Any Python Tree Data
http://anytree.readthedocs.io/en/latest/index.html#any-python-tree-data
(参考)Python Tree Data Release 2.1.4 c0fec0de May 12, 2017
https://media.readthedocs.org/pdf/anytree/latest/anytree.pdf#page=18

```py
from anytree import *
udo = Node("Udo")
marc = Node("Marc", parent=udo)
lian = Node("Lian", parent=marc)
dan = Node("Dan", parent=udo)
jet = Node("Jet", parent=dan)
jan = Node("Jan", parent=dan)
joe = Node("Joe", parent=dan)
print(RenderTree(udo, style=AsciiStyle()).by_attr())
print('-------------------------------------------------')
from anytree.dotexport import RenderTreeGraph
RenderTreeGraph(udo).to_dotfile("tree.dot")
from subprocess import check_call
check_call(['dot','-Tpng','tree.dot','-o','OutputFile.png'])
```
macを操作しやすく(Hammerspoonを利用して)

# macを操作制向上


## キーボード操作のみで
- **ウィンドウ**位置を移動 (上下左右)
- **ウィンドウ**位置を移動 (隣の**ディスプレイへ**)
- **ウィンドウ**の**フォーカス**移動 (上下左右)


## アクティブウィンドウをわかりやすく
- **フォーカス**が変わると**ウィンドウ**が振動
- **アクティブウィンドウ**に、**枠線**表示


🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟


[new-filet-o-fish](https://github.com/baronTommy/new-filet-o-fish)🍔 🐟
https://github.com/baronTommy/new-filet-o-fish



🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟 🍔 🐟
共通テ2020(仮称)平成29年5月モデル問題例4をだいたいsympyを使って解く

おすすめタグ:「見込む角」,「ベストスポット」,「広場の大きさどうする？」

(参考1)共通テ2020(仮称)平成29年5月モデル問題例4
http://www.dnc.ac.jp/albums/abm.php?f=abm00009385.pdf&n=%E8%A8%98%E8%BF%B0%E5%BC%8F%E5%95%8F%E9%A1%8C%E3%81%AE%E3%83%A2%E3%83%87%E3%83%AB%E5%95%8F%E9%A1%8C%E4%BE%8B.pdf#page=35
(参考2)受験の月＞2定点を見込む角の最大
http://examist.jp/mathematics/trigonometric/mikomukaku-max/
#まずは、WolframAlphaで実行してみた。
##(1)
<方法1>余弦定理　AP=12,BP=sqrt(4^2+12^2),AB=4
http://www.wolframalpha.com/input/?i=acos((12%5E2%2B4%5E2%2B12%5E2-4%5E2)%2F(2*12*sqrt(4%5E2%2B12%5E2)))*180%2Fpi
18.43494882292201064842780627954670532879578570035477897201...
<方法2>12mの4mのarctan
http://www.wolframalpha.com/input/?i=atan(4%2F12)*180%2Fpi
18.43494882292201064842780627954670532879578570035477897201...
<方法3>ベクトルのなす角。内積を使う。(-12,0),(-12,4)
http://www.wolframalpha.com/input/?i=acos((12%5E2%2B0*4)%2Fsqrt(12%5E2%2B0%5E2)%2Fsqrt(12%5E2%2B4%5E2))*180%2Fpi
18.43494882292201064842780627954670532879578570035477897201...
##(2)
(i)
(ii)
②
<方法3>ベクトルのなす角のcosの微分方程式。(-x,5),(-x,5+4) 
http://www.wolframalpha.com/input/?i=D%5B(x%5E2%2B45)%2Fsqrt(x%5E2%2B5%5E2)%2Fsqrt(x%5E2%2B9%5E2)%5D%3D0
x = 3 sqrt(5) ≒ 6.7
ベクトルのなす角のcos
http://www.wolframalpha.com/input/?i=(x%5E2%2B45)%2Fsqrt(x%5E2%2B5%5E2)%2Fsqrt(x%5E2%2B9%5E2)
#sympyで実行してみたい。
指導内容、太郎さんの考え、正弦定理をよく読んでから。
「サッカーでシュートを打つべき位置」を考え中(参考2より)
(参考)?方べきの定理をだいたいsympyを使って解く
http://qiita.com/mrrclb48z/items/1f84be0b4b52863b63ac
#教えて下さい。
ベストスポットの条件として、台座の高さが、目の高さより高いと思う。
正しいと、sympyで証明可能ですか。よろしくお願いします。
pipで一括アップデート（確認付き）

こんにちは。
pipで一括アップデートを行う確認付きシェルスクリプトを作りました[^1]。

[^1]: 参考：「[pipで一括アップデート](http://qiita.com/manji-0/items/d3d824d77c18c2f28569)」

### 一括アップデート実行
#### 確認無しで実行（基本）
基本となる確認無しの「一括アップデート実行」は、ワンライナーでは、

```console
$ python3 -m pip list --format=columns --outdated | awk 'NR>=3 {print $1}' | xargs python3 -m pip install --upgrade
```

#### 確認付き
一括アップデートの確認（ ```[upgrade all? (y/n)]```）を付け、シェルスクリプトに仕立てました。

```pip_upgrade_all.sh
#!/bin/sh
PIP="python3 -m pip"
OUTDATED=$(${PIP} list --format=columns --outdated | awk 'NR>=3 {print $1}')
[ -z "${OUTDATED}" ] && exit $?
echo "${OUTDATED}"
echo "[upgrade all? (y/n)]"
read -r KEYINPUT
[ "${KEYINPUT}" = "y" ] && echo "${OUTDATED}" | xargs ${PIP} install --upgrade
exit $?
```

### 依存関係確認
最新バージョンへアップデートする前には、依存関係の確認が本当は必要です。

#### pipdeptree コマンド利用で確認
下記例は osmnx 1.2.3 がインストールされている状態ですが、これが必要とする Shapely のバージョンは 2.0 より低いものです。したがってこの場合 Shapely を上記方法で率直に Latest へアップデートすることは良くないです（実行してしまうと警告が出ます）。

```
$ python3 -m pip install pipdeptree
$ pipdeptree -r -p Shapely | grep "<"
  - osmnx==1.2.3 [requires: Shapely>=1.8,<2.0]
$ 
$ python3 -m pip list --format=columns --outdated 
Package            Version     Latest Type
------------------ ----------- ------ -----
Shapely            1.8.5.post1 2.0.0  wheel
```

#### homebrew 由来の Python 環境下
homebrew 由来の Python で、package もインストールされる場合があります（下記例）。この場合も gdal を上記方法で率直に Latest へアップデートしない方が良さそうです（競合のおそれ？）。

```
$ ls -d /usr/local/Cellar/gdal/*
/usr/local/Cellar/gdal/3.6.0
$
$ python3 -m pip list --format=columns --outdated 
Package            Version     Latest Type
------------------ ----------- ------ -----
GDAL               3.6.0       3.6.1  sdist
```
DockerでvolumeのバックエンドにIPFSを使う

# 概要

Dockerの[Volume plugin](https://docs.docker.com/engine/extend/legacy_plugins/)に、IPFSをバックエンドで利用できるものがあったのでセットアップしてみた

※とりあえず起動までをメモ、Volume作成したら追記する

※なお、下記のままセットアップするとグローバルのIPFSクラスタに入るので、Volumeの中身は公開されます。

## 環境

- ubuntu 16.04
- docker 17.03.1-ce
- go 1.6.2

## ipfsのインストール

```bash
wget https://dist.ipfs.io/go-ipfs/v0.4.9-rc2/go-ipfs_v0.4.9-rc2_linux-amd64.tar.gz
sudo mv go-ipfs/ipfs /usr/local/bin/ipfs
```

## ipfs のセットアップ

```bash
sudo su -
ipfs init
mkdir /ipfs /ipns
```

## ipfs docker volume pluginのインストール

```bash
go get github.com/vdemeester/docker-volume-ipfs
cd gopath/src/github.com/vdemeester/docker-volume-ipfs/
sudo -E make install
```

## ipfs volume plugin の起動

```bash
sudo su -
docker-volume-ipfs &
```
【続】AI,機械学習,Deep Learning わかりにくい流行り言葉をまとめる

# はじめに
[前回](http://qiita.com/tomohiku/items/364a1b06b35ea4d514d6)、「AIという言葉」について書いたのですが、
それに関連して2年前くらいから流行り初めて、去年爆発的に流行り
今年になって落ち着いてきている「Watson」についてすこしだけ触れてみます。


ディスりたいわけではないので注意して書こうと思っていますが、
どこの企業に言って聞いても「Watson」に対して大きな誤解をされているように感じます。

「AIっていうのは何か？」というのがエンジニアでさえ理解しにくいほどわかりにくいから、
「AIという言葉を自分の会社の得になる概念として使ってしまおう」的な雰囲気があり、
嘘ではないが、誤ったイメージで利用者側に伝えているような風潮があるように感じてます。
その１つが「Watson」。

いままで行った企業のIT企画部ののほぼすべての方が誤解していたので、
おそらく誤解を促進させている人たちがいるんだろうな、、、と思う。
それによって、IBMが売りやすくなるってのは別にいいけど、
AI系の技術全般のイメージに誤解が生まれることで
テクノロジーの進歩の妨げになったら嫌だなとは思う。

#Watsonという言葉

Chat Botのシステム全体のことを「Watson」と呼んでいる人がすごく多いように感じる。
「Watson」＝ ChatBotシステム全体 ＝ 「AIシステム」というのは誤解で、ChatBotシステム全体の一部の部品としてWatsonを使っており、さらにはそのWatsonの中でAI系技術が一部使われているというのが、正しい認識と私は考えている。
Watsonを使ったChatBotシステムのアーキテクチャには、Watson独自仕様が入っている部分もあるが、Watson以外で実装しても大方のアーキテクチャは変わらない。

**■一般的なChatBotのアーキテクチャ**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74428/734ba25f-bdfc-1ef5-fb89-9675be3490cb.png)

**■誤解されているWatsonの範囲**
多くの方が誤解しているWatsonの範囲
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74428/00304693-4e1c-24b1-bd9e-25faed4023b4.png)

**■正しいWatsonの範囲**
正しいWatsonの範囲
![image.png](https://qiita-image-store.s3.amazonaws.com/0/74428/3c0878e8-cd8b-bb68-7d38-d9180035fec1.png)


#この誤解を正すことで言いたいことは
- Watsonは学習によっては優秀になるかもしれないが、それは一部の部品としてであってChatBotシステム全体の質ではない
- 最も課題になりやすい学習データ①と②の作成作業は、Watsonを使ったシステムに限ったことではなく、他社の製品を使ったとしても原則ほぼ同じである。
- IBMのWatsonチームしかChatBotシステムを作れないということはなく、他社製品で他社メンバでも問題なく作れる
- ChatBotシステムを作るためのWebAppやDB、開発言語などは特定のものに決まっているわけではない。言語はJavaScriptではないとダメなんてこともない。

あとよく誤解されているが、学習データ②の「質問に対する回答文」は、AI部品が勝手に作ってくれるわけではない。
例えば、IT部門への問い合わせFAQのようなBotだとして「PCがネットワーク繋がない」という質問が来た時に、AIが自発的にPCのネットワーク環境を調査して「貴方の在籍しているフロアのWiFiが一時的に障害が起こってます」なんて気をきかせてくれることはなく、その答えの文章を事前に用意しておいてあげないといけない。
よって、回答文章がなければそれを作る作業がChatBotシステム開発の工数の中で最も大きいということがよく有る。回答文を作るためには業務知識が必要なので、ITベンダでは作業できない可能性がある。
実際、学習データを作るのが大変で火を吹いているプロジェクトのはこのパターンで、
AI技術でできる範囲を見誤った要件設定をしている失敗だと思われる。


#おわりに
客のChatBotへの期待としては「超優秀な即戦力になる２４時間戦える社員が入ってきた」という感じが多いようにみえる。
しかし、実際は「赤ちゃんを渡されて、頑張って育ててね」と言われる。
かなりのお金をかけて育ててみたけれどやはり費用対効果に見合わず、
「育児放棄しよう」といいたいが、今まで支払ったコストがもったいなくて放棄できない。
そんな感じが去年だったように思う。

そして今年になって、やっと少し進んで「小学生」くらいのレベルのAIに変わってきたように思う。
Microsoft製品を例に上げると、WatsonのNLCと同じような機能の「LUIS」は、
Bingの蓄積データから一般的な会話をある程度学習済みであり、言葉のゆらぎ・言い回しについては
ある程度カバーしてくれるようになってきた。※日本語はまだまだだけど。

またMicrosoft QnA Makerは、「部品①自然言語解釈」と「部品②適した回答を検索」を一つにまとめてしまい、かつQ&Aに特化した会話のやりとりの学習をある程度済ませてくれている。
まだ「小学生」レベルであっても得意な作業に限定してやれば、かなりのパフォーマンスが出せるようになるだろう。

今後は、こういった基礎知識を事前に学ばせてくれているAI部品が増えてくるだろうと予想される。
この調子なら、あと２年くらいで「新卒学生」くらいまで育ってるAI部品も使えるんじゃないかと期待している。
モバイルサイト全体のスクリーンショットを撮る一番楽な方法（たぶん）

# モバイルサイトの全体のスクショを撮りたい！

業務を行う中でサイト全体のスクショが欲しいという機会がたまにですがあります。
ただ全体的に縦に長いサイトの場合切れてしまい、全体のスクショが取れず、何回もキャプチャしてつなげるといったいやな作業が発生していました。

![news.google.co.jp-(Nexus 6P).png](https://qiita-image-store.s3.amazonaws.com/0/103647/0af84fd7-ada7-b5bc-f83e-cc36fe2b3a02.png)
（↑一部しか取れない）

# 救世主はFirefox Developer Edition

そんな私の前に颯爽と現れたのはドラえもんと似たような色のFirefox Developer Editionです！

![firefox.png](https://qiita-image-store.s3.amazonaws.com/0/103647/90797114-0774-57be-cf7e-3b5510ff2ed5.png)

1.インストールして起動してみましょう。

![firefox1.png](https://qiita-image-store.s3.amazonaws.com/0/103647/1f5cf30f-368d-25da-40ce-59c5ec9b163c.png)

2.「開発ツールを表示」をクリックして開発ツールをクリックします。

![firefox2.jpg](https://qiita-image-store.s3.amazonaws.com/0/103647/92e3c8b1-1498-8a80-0e40-9b75e29b2357.jpeg)

3.適当なサイトを開きます。

![firefox4.png](https://qiita-image-store.s3.amazonaws.com/0/103647/16120b46-9b56-fafd-75d8-35c92e6d7b9b.png)

4.レスポンシブルモードにします。

![firefox5.jpg](https://qiita-image-store.s3.amazonaws.com/0/103647/f711f951-1faa-ae37-d9ff-16b2596c158f.jpeg)

5.リストを編集をクリックします。

![firefox6.jpg](https://qiita-image-store.s3.amazonaws.com/0/103647/592df87c-de4b-01c7-2861-c4f55faa9428.jpeg)

6.縦を9000というような大きい値にしたサイズにし、UAをモバイル用のものにしておきます。

![firefox7.jpg](https://qiita-image-store.s3.amazonaws.com/0/103647/2a85da4e-beed-ede6-b0f6-5b3cf88ced50.jpeg)

例えばiPhoneのUAだと↓になります。

```
Mozilla/5.0 (iPhone; CPU iPhone OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13A344 Safari/601.1
```
7.カスタム端末を選択します。

![firefox8.png](https://qiita-image-store.s3.amazonaws.com/0/103647/9291bf07-2b24-6c46-6d21-0562b218b341.png)

8.カメラアイコンをクリックし、スクショをとります。

![firefox9.jpg](https://qiita-image-store.s3.amazonaws.com/0/103647/2e21bb75-6fe6-2a9a-bb67-735ef7d67ae4.jpeg)

9.こんな感じで撮れます。

下の方は余白ができてしまいますが、もうそこは切り取るしかないかなと思います。

<img width="545" alt="スクリーンショット 2017-05-19 21.44.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/103647/895372a3-949e-f0a5-1db5-170cc1d7e133.png">
Djangoのテストを高速化する

DB create → migrate → drop する回数を減らして高速化しよう！という話。

Djangoでアプリケーションを作っていて、Djangoが複数Appを持っている場合テストを実行するときに

```
$ python manage.py test app1/
$ python manage.py test app2/
$ python manage.py test app3/
$ python manage.py test app4/
```

のように実行することが多い。
これだと4回テスト用DBを作ったり消したりすることになって、migrationファイルが大量にある場合にはこれだけで5分とかかかったりする。

Django 1.8から `test` コマンドのオプションに [--keepdb](https://docs.djangoproject.com/en/1.11/ref/django-admin/#cmdoption-test-keepdb) というものがあって、このオプションを付けるとDBがない場合には新しく作って、既に存在する場合にはそのDBを使用してテストしてくれる。
テスト後にDBを消す必要がある場合には

```
$ python manage.py test --keepdb app1/
$ python manage.py test --keepdb app2/
$ python manage.py test --keepdb app3/
$ python manage.py test --keepdb app4/
```

の後にDBを消す処理を入れる必要がある。
ただ、大抵CI環境など使い捨ての環境でテストを実行することが多いので、そのままDBを放置しておけば良いと思う。
割と簡単に顔画像を集める方法


## 背景

機械学習用の顔画像を集めている時に「このワザだけでも１本の記事として成り立つんじゃね？」と思ったのでご紹介。

## 特定の人の顔画像を集める

機械学習の初歩でやりがちなことのひとつに、特定の人であるかどうかを判定させるみたいなものがあります。
そのためには、教師データとしてその特定の人の画像をたくさん集めたくなります。
検索して出てくるサイトの多くではクローラーでかきあつめたりするものが多いようですが、以下の手順でも顔画像収集は可能です。
例として、秋元真夏さんの画像をたくさん集めたいものと仮定します。

1. Webブラウザを開いて最大化
2. googleの画像検索で「**秋元真夏**」と検索
3. 画面をキャプチャして画像としてとっておく
4. 表示されていなかった画像が表示されるようにスクロール
5. それ以上検索結果が出てこなくなるまで３と４を繰り返す
6. OpenCVを使ってちょちょいと書いたスクリプト(後述)を用いて3でとっておいた画像から顔部分だけ切り出す

## 任意の人の顔画像を集める

機会学習の初歩でやりがちなことのひとつに、特定の人であるかどうかを判定させるみたいなものがあり、
不正解の画像として正解の人以外の顔画像をたくさん集めたくなることがあります。
検索して出てくるサイトの多くではクローラーでかきあつめたりするものが多いようですが、以下の手順でも顔画像収集は可能です。


1. Webブラウザを開いて最大化
2. googleの画像検索で「**集合写真**」と検索
3. たくさん人が写っている画像を気がすむまで適当に手動でダウンロード
4. OpenCVを使ってちょちょいと書いたスクリプト(後述)を用いて3でとっておいた画像から顔部分だけ切り出す

## 画像から顔部分だけを切り出すスクリプト

cascade_path という変数で書いているパスは多分環境によって違うと思いますので、検索して見つけてください。
事前にOpenCVやpythonをインストールしておく必要があります。


```python
import cv2
import glob
import sys
import os
import imghdr
import datetime
import time

def main(srcdir, destdir, cascade_path='/home/pi/opencv-3.1.0/data/haarcascades/haarcascade_frontalface_alt.xml'):

  winname = 'searching..'
  cv2.namedWindow(winname, cv2.WINDOW_AUTOSIZE)

  if not os.path.exists(destdir):
    os.mkdir(destdir)

  lastsaved = datetime.datetime.now()
  prefix = lastsaved.strftime('%Y%m%d-%H%M%S_')
  counter = 0
  cascade = cv2.CascadeClassifier(cascade_path)

  for filename in glob.glob(srcdir + "/*"):

    if os.path.isdir(filename):
      continue
    if imghdr.what(filename) == None:
      continue

    print("load " + filename)
    img = cv2.imread(filename)
    frect = cascade.detectMultiScale(img, minSize=(64, 64))
    pos = []
    if len(frect) > 0:
      for r in frect:
        x, y, w, h = r[0], r[1], r[2], r[3]
        face = img[y:y+h, x:x+w]
        if len(face) != 0:
          if w > 0 and h > 0:
            filename = destdir + "/" + prefix + str(counter) + ".jpg"
            cv2.imwrite(filename, face)
            print("save " + filename)
            counter += 1
            pos.append(r)
    for p in pos:
      cv2.rectangle(img, (p[0],p[1]),(p[0]+p[2],p[1]+p[3]),(0,0,255), 8)
    if len(pos) > 0:
      cv2.imshow(winname, img)
      cv2.waitKey(1)

  cv2.destroyWindow(winname)

if __name__ == '__main__':
  main(sys.argv[1], sys.argv[2])
```

これを例えばimg2face.pyという名前にしたとしたら、

```bash
python ./img2face.py ./imgs ./face
```

みたいにして動かします。./imgs配下に先ほど集めておいた画像ファイルを置いてから実行すれば、顔部分を切り出した画像が./face配下に出力されます。

## おわりに

機械学習は事前準備が面倒ですね。皆様にも楽チンにする手法をどんどん公開していってほしいです。
PepperをHTTP経由で動かす方法

PepperをHTTPで遠隔から動作させる簡単な(簡易な)方法を見つけたので共有しておきます。

# メリット
・わざわざPythonやPythonSDKを用意しなくても良い
・遠隔からコマンド一発で実行かけられるのは色々と便利
・Webアプリ等から簡単に呼び出せるの色々と便利

# 準備
・Pepper(NAOqiバージョン:2.5.5.5)
・sshが使える環境
・サンプルソース

```python:test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from naoqi import ALProxy
IP = "127.0.0.1"
PORT = 9559
tts = ALProxy("ALTextToSpeech", IP, PORT)
tts.setLanguage("Japanese")
tts.say("こんにちは私はPepperです！！")
```

# 実行手順

## (1) Pepperにログインする

```
$ ssh nao@<PEPPER-IP> 
Password: nao
```

## (2) スクリプトを配置

```
$ mkdir cgi-bin; cd cgi-bin
$ vi test.py
---
上記のスクリプトをコピペ
---
$ chmod 755 test.py
# 動作確認
$ ./test.py 
$ cd ..
# 簡易HTTPサーバを起動(そのまま放置)
$ python -m CGIHTTPServer 8000
```

## (3) 遠隔から実行

```
curl "http://<PEPPER-IP>:8000/cgi-bin/test.py"
```

Pepperが喋ってくれれば成功です。(もし、喋らなかったら音量を確認してみよう！)

# 最後に

遠隔実行するだけであれば、SSHでリモート実行すれば良い話なのだけれど、HTTPを使えるのはWeb系の開発者にとっては何かと便利だと思った次第です。
ちょっと面倒だったので今回は試してませんが、Choregrapheのカスタムサービスを使ってPepper起動時に簡易HTTPサーバを上げるようにすれば、もっと便利になると思います。(誰か試して。。。)
windows標準でMD5などのハッシュ値を出力

Windowsの標準コマンドでMD5などのハッシュ値を出力する方法です

```bat
certutil -hashfile ＜ファイルパス＞ [ハッシュアルゴリズム]
```


例）D:\hoge.exeというファイルのMD5ハッシュが欲しいとき

```bat
> certutil -hashfile D:hoge.exe MD5

MD5 ハッシュ (ファイル D:\hoge.exe):
6d 4b 8a 02 89 e5 bf 48 35 96 87 47 0f c8 de 37
CertUtil: -hashfile コマンドは正常に完了しました。
```

ハッシュ アルゴリズムは以下のものが指定可能
デフォルトはSHA1

* MD2
* MD4
* MD5
* SHA1
* SHA256
* SHA384
* SHA512

※windows7だとハッシュアルゴリズムは大文字で書かないとエラーになります。
windows8.1や10は小文字でも大丈夫。

certutilコマンドは証明書関連のコマンドのようで、ハッシュ値出力以外にも機能が凄いたくさんある
RubyでTensorFlowを使う with PyCall

# はじめに

mrknさんが開発されているPyCallが日々更新されているので、TensorFlowがRubyから使えないかと思い試してみたものです。

[mrkn/pycall on GitHub](https://github.com/mrkn/pycall)

# インストール

PythonやTensorFlowのインストール手順はQiitaにあふれているので、ここでは割愛します。

PyCallのインストールは以下のコマンドで

```sh:
$ gem install --pre pycall
```

簡単なサンプルも含めて別の記事にまとめてあるので、それも参照してみて下さい。

[PyCallでRubyからPythonのライブラリを使ってみた](http://qiita.com/mix_dvd/items/2161278cd996a0ed90a3)

ついでに、iRubyでグラフを描画するためのライブラリも入れておくと便利かもしれません。

[mrkn/matplotlib.rb on GitHub](https://github.com/mrkn/matplotlib.rb)

インストールは以下のコマンドで

```sh:
$ gem install --pre matplotlib
```

# TensorFlow

何か簡単で良いテーマがないかと探したところ、以下のURLにて紹介されている最急降下法のサンプルがいいなと思ったので、これをPyCallを使って試してみます。

[TensorFlowで始める深層学習　(２)サンプルコードから読み解くデータフロー・グラフ/Pythonエコシステム](http://developers.gnavi.co.jp/entry/tensorflow-deeplearning-2_1)

内容を簡単に説明すると、

```math
y = w \times x + b
```

という計算式を例に、ランダムに発生させたxの値とそこから計算されたyの値を使って、wとbを発見するというもののようです。

では、ソースコードを書き換えると以下のとおり。

```rb:tf.rb
require 'pycall/import'
include PyCall::Import

pyimport 'numpy', as: 'np'
pyimport 'tensorflow', as: 'tf'

# Create 100 phony x, y data points in NumPy, y = x * 0.1 + 0.3
x_data = np.random.rand.(100).astype.(np.float32)
y_data = x_data * 0.1 + 0.3

# Try to find values for W and b that compute y_data = W * x_data + b
# (We know that W should be 0.1 and b 0.3, but Tensorflow will
# figure that out for us.)
w = tf.Variable.(tf.random_uniform.([1], -1.0, 1.0))
b = tf.Variable.(tf.zeros.([1]))
y = w * x_data + b

# Minimize the mean squared errors.
loss = tf.reduce_mean.(tf.square.(y - y_data))
optimizer = tf.train.GradientDescentOptimizer.(0.5)
train = optimizer.minimize.(loss)

# Before starting, initialize the variables. We will 'run' this first.
init = tf.initialize_all_variables.()

# Launch the graph.
sess = tf.Session.()
sess.run.(init)

# Fit the line.
(0..200).each do |step|
  sess.run.(train)
  if step % 20 == 0 then
    puts "#{step}\t#{sess.run.(w)[0]}\t#{sess.run.(b)[0]}"
  end
end
# Learns best fit is W: [0.1], b: [0.3]
```

実行してみます。

```
$ ruby tf.rb
0	-0.075883001	0.61687899
20	0.031335868	0.34092095
40	0.082482144	0.31043994
60	0.095530763	0.30266351
80	0.098859809	0.30067953
100	0.099709123	0.30017337
120	0.099925794	0.30004424
140	0.099981084	0.30001128
160	0.099995196	0.30000287
180	0.099998787	0.30000073
200	0.099999689	0.30000019
```

できたっぽい！

# iRuby上で実行

上記のソースコードを以下のように修正してiRuby Notebook上で実行。

```rb:
# 略

# Fit the line.
w_log = []
b_log = []

(0..200).each do |step|
  sess.run.(train)
  #if step % 20 == 0 then
  #  puts "#{step}\t#{sess.run.(w)[0]}\t#{sess.run.(b)[0]}"
  #end
  w_log << sess.run.(w)[0]
  b_log << sess.run.(b)[0]
end
# Learns best fit is W: [0.1], b: [0.3]

pyimport 'matplotlib.pyplot', as: 'plt'
require 'matplotlib/iruby'
Matplotlib::IRuby.activate

plt.plot.(w_log)
plt.plot.(b_log)
plt.show.()
```

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/114240/2320d889-e383-faf0-bba2-75f603b35e05.png)

グラフが描画されました(^-^)