OmniAICreator/Qiita-1.07M huggingface dataset:
iOS 10.2.1で[UIDevice currentDevice].systemVersion.doubleValueすると...

UIDevice#systemVersionから取れるOSバージョンをdouble型に変換して扱う必要があったのですが、この時、10.2.1みたいな少数形式でない文字列を`doubleValue`するとどうなるか。

正解は、

```objc
NSLog(@"[UIDevice currentDevice].systemVersion: %@ / .doubleValue: %f", 
      [UIDevice currentDevice].systemVersion, [UIDevice currentDevice].systemVersion.doubleValue);

// => [UIDevice currentDevice].systemVersion: 10.2.1 / .doubleValue: 10.200000
```

二つ目の`.`以降が無視されて 10.200000 となりました。

もう少し実験してみました。

```objc
NSLog(@"%f", @"123.45.67".doubleValue);  // => 123.450000
NSLog(@"%f", @"123.45.34".doubleValue);  // => 123.450000
NSLog(@"%f", @"12x.34".doubleValue);     // => 12.000000
NSLog(@"%f", @"x12.34".doubleValue);     // => 0.000000
NSLog(@"%f", @"-123.45.67".doubleValue); // => -123.450000
NSLog(@"%f", @"12 3.45".doubleValue);    // => 12.000000
NSLog(@"%f", @"  123.45".doubleValue);   // => 123.450000
```

なるほど、少数形式で表せない文字が出てきた時点でそれ以降を無視するようです。(ただし、文字列先頭が空白の場合は除く)

JavaのNumberFormatExceptionのように例外は発生せず、無視されるという仕様のようです。

---
検証環境: iOS 10.2.1
ODPのヴァージョン違い

## Difference in version of ODP

よくある話だけどODPのヴァージョン違いって新人には気づきにくいと思うんだよね
まずメッセージがイケてない
```
'Oracle.DataAccess.Client.OracleParameter' のタイプ初期化子が例外をスローしました
```
経験のある人だと「あっこれは参照設定の問題だな」ってなんとなく気づくんだけど
新人だと？？？ってなる

環境構築時の問題なので、年に何回も遭遇しないしね
久しぶりに会ったら、忘れていて半日悩みました
OpenCVでお手軽に顔認識してみる

さて、[前回](http://qiita.com/haseshin42/items/55b5c728284da47ef5b1)はWindows上にPythonとOpenCVの環境を作り、カメラを表示するところまでやってみましたが、今回は顔の認識をしてみたいと思います。やってみると分かるのですが、非常に簡単に実現できます。
##顔分類器の用意
OpenCVにはあらかじめトレーニング済みの分類器がサンプルとして付属しますので今回はこれを利用してみたいと思います。WinPythonにライブラリを追加する方法ですとサンプルが付属しませんので[こちら](http://opencv.org/releases.html)から環境にあったものをダウンロードしてください。
##顔分類器の利用
サンプルとしては正面の顔を認識するものや、猫の顔を認識するものなどいくつか含まれますが、今回はこちらを利用することにします。
\data\haarcascades\haarcascade_frontalface_default.xml

使い方は非常に簡単で、以下の2行です。

```python:facedetect.py
 cascade = cv2.CascadeClassifier(cascade_path)
 facerect = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))
```

まず、cv2.CascadeClassifier(分類器のパス)分類器を用意します。
そして、detectMultiScaleを呼び出します。imgは対象のイメージです。それ以外の引数は[こちら](http://docs.opencv.org/3.3.0/d1/de5/classcv_1_1CascadeClassifier.html#aaf8181cb63968136476ec4204ffca498)を参照していろいろ試してみてください。
たったこれだけです。
これだけで、認識した顔の位置を含む配列が返されます。
##動画中の顔の認識
では、カメラからの画像を表示する前回のコードにこの顔認識のコードを埋め込んで見ましょう。

```python:detect.py
# -*- coding: utf-8 -*-

import cv2
import time


cascade_path="C:\Python\opencv-master\opencv-master\data\haarcascades\haarcascade_frontalface_default.xml"
window = "Push ESC key to stop this program"

if(__name__ == '__main__'):
   
    # デフォルトカメラ
    capture = cv2.VideoCapture(0)
    
    # キャプチャ処理
    while(True):
        key = cv2.waitKey(1)
        if(key == 27):
            print("exit.")
            break
        
        # 画像キャプチャ
        ret, img = capture.read()
        
        # 取り込み開始になっていなかったら上の処理に戻る
        if(ret == False):
            print("Capture Failed. ")
            break
        
        #顔検出
        cascade = cv2.CascadeClassifier(cascade_path)
        facerect = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))
        print(facerect)
        
        cv2.imshow(window, img)
        time.sleep(0.050)
        
        # ループ
    
    capture.release()
    cv2.destroyAllWindows()
```

実行して以下のように顔を認識した場合に座標が表示されれば成功です。
[[258 224 217 217]]
[[256 223 219 219]]
[[254 224 217 217]]
[[255 221 221 221]]
##まとめ
今回は、あらかじめ用意された分類器を使用して顔の検出をしてみました。
簡単に顔を認識できることが分かりましたが、やはり、配列を見ているだけでは楽しくなく、認識した顔に四角を表示したくなります。というわけで、次回は、認識した顔を四角で囲んでみたいと思います。
開発環境に入れて捗ったもの

# はじめに

環境はMacとLinux、WindowsでもvagrantでLinux動かして使っています
だいたいはWeb開発で言語はPHPとNode.js



## MailCatcher

https://mailcatcher.me/

メールを送ったりするアプリのデバッグをするときにガチのメールを送るのが憚られるケースもよくあったりするわけですが、そんなときに使えるのがこいつです
Ruby製でgemコマンドでインストールできます

```bash:インストール
gem install mailcatcher
```

```bash:起動する
mailcatcher
```

起動すると、デフォルトでlocalhostにのみバインドした状態で

- 1025番ポートでSMTPを話すモックのサーバ(中身は送信されずにmailcatcherに食べられます)
- 1080番ポートで食べたメールの内容を読めるWebアプリ

が起動します

ポートやバインドするアドレスを変更したい場合は

```bash:起動オプション
mailcatcher \
--ip SMTPとHTTP両方にバインドするIP \
--smtp-ip SMTPのみバインドしたいIP \
--smtp-port モックSMTPのポート \
--http-ip WebアプリのみバインドしたいIP \
--http-port Webアプリのポート
```
で指定できます

テストする場合などPHPのsendmail()やmb_sendmail()でこいつに食べさせたいときはphp.iniに

```ini:php.ini
sendmail_path = "/usr/bin/env catchmail"
```
こんな感じにcatchmailというCLIクライアントを設定しておけばいいです（インストールディレクトリにパスが通ってないと見つからない罠はあります）
もっともphp.iniレベルで指定するのは筋がいいアプローチとは思えないので、メール送信についてはSMTPサーバやポートを指定できるライブラリを使ったほうがいいかもしれないです


## MailHog

↑のMailCatcherにインスパイアされてGoで作ったというやつ

https://github.com/mailhog/MailHog

バイナリ1本で完結してたりMailcatcherのcatchmail同様に似非sendmailみたいなCLIクライアントの mhsendmail もあるので対応プラットフォームならこっちのほうがいいかもしれません



## nvm

https://github.com/creationix/nvm

Node.jsのバージョン管理用のツールです
バージョンアップが頻繁にあるのでこういうツールを使ったほうがやりやすいです
$HOME/.nvm配下に全てのファイルが格納されるので、システム環境も汚さないのもいいところです
一応、yumなどで入れてあるNode.jsも"system"というラベルで見ることができます



## direnv
$HOME/.*rcに細工をしておくとディレクトリの移動を捕捉して、移動した先に.envrcというファイルがあればその内容を実行してくれます

主な使いみちとしてはデータベースなどの接続情報やExpress、先ほどのMailCatcherやMailHogを使う場合はバインドするSMTPのホストやポートを環境変数として設定しておくこと
.envrcだけgitの管理から外しておき、プログラムから環境変数を参照するようにしておけば開発用とデプロイ先でもコードを差し替える必要がなくなりますからね

またnvmとの合わせ技でディレクトリ毎にNode.jsのバージョンを切り替えたりもできます
Node.jsもそれなりに互換性はあるんですがおいそれとアップデートできない大人の事情がある場合もあるので・・・

あるプロジェクトのディレクトリに使用するNode.jsのバージョンを記載した.nvmrcというファイルを置いておき.envrcを

```bash:.envrc
source ~/.nvm/nvm.sh
nvm use
```

と書いておけば、何も考えることなく当該ディレクトリに移動するだけでプロジェクトごとのNode.jsのバージョンの切り替えができます

CentOSでremiから複数バージョンのphp(php-x.y)をyumで入れた場合

/opt/remi/php-xy/enable

の中身を実行させることで切り替えることができます

古めのCentOSで新しめのソフトウェアを入れるときに便利なSoftware Collectionを入れた場合も/opt/配下にあるenableスクリプトがあるので、そちらの中身を実行させればCentOSのバニラな環境とSDL環境をシームレスに切り替えもできるでしょう
Github 管理指南

# 新しいリポジトリを作るところから，アップロードまで

研究で作る解析のためのプログラムが細々と沢山でてくる。

久しぶりにもう一度使ってみようとすると，どれが最新のバージョンだったか分からなくなったりする。
どこかのディレクトリで，プログラムをアップデートして汎用性を高めたのに，どこに置いたのか忘れることがある。
そこで，サーバ（GitHub）に最新版を常に置いておく。

個人的に，いまのところ一番わかりやすい手順をメモ。

# レポジトリの作成

https://github.com/new

にてwebブラウザでレポジトリ作成。
Descriptionとか，Readmeとか，言語に合わせた.gitignoreとか，ここで作成しておけば簡単。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99215/a5e2d2d3-b7e0-32a0-ee8b-214826fcf2e5.png)

赤丸のとこクリックでレポジトリ新規作成。

# ローカルにレポジトリを持ってくる

作成したレポジトリをローカルにクローンするために，コピー。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99215/a2372767-ef10-a50d-5e0e-3c43d83805a1.png)

図の赤丸をクリック。

うちの大学はセキュリティの問題でhttpsでクローンできなかったので（ちゃんと設定すればできるかも），sshを使った。

## sshを使ってクローンする

ローカルマシンのパブリックキーをコピーする。

普通は，~/.ssh/id_rsa.pub
にある。

ない場合は， `ssh-keygen -t rsa`
で作成できる。（色々聞かれるが，セキュリティとか気にしなければ，基本ずっとEnterでok）

ローカルのマシンのパブリックキーをコピーして，ウェブ上でGitHubのSetting -> SSH and GPG keysに入って，ペーストする。
Titleは適当に。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99215/4254b662-0125-498a-6deb-dc10e86d0f9a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99215/0275d128-1e49-2eb2-c741-6fab0b822e53.png)

これで，ローカルマシンのsshパブリックキーが登録されると，

sshによるgit cloneできる。

# クローンする

ローカルで

`git clone git@github.com:hnishi/pmfnishi.git`

する。
REMADME.mdと.gitignoreができているのを確認。

# アップロード

作成したプログラムをこのディレクトリにコピーしてくる

アップロードしたいやつをgit add

git statusでステージングされていることを確認。



```
$ ls
README.md      area_1_10.xvg  helix_count_1_10.dat
area_1_10.dat  do1_pmf2d.py   pmfnishi2d.py
$ git add do1_pmf2d.py pmfnishi2d.py
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   do1_pmf2d.py
#       new file:   pmfnishi2d.py
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       area_1_10.dat
#       area_1_10.xvg
#       helix_count_1_10.dat
```

git commitしてから，git pushでアップロード。
git commitの-mオプションで，何かコメント。

```
$ git commit -m "initial commit"
$ git push
```

webで，アップロードされていることを確認。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99215/bd47c345-bf17-336d-d477-f90e2c3f1893.png)

プログラムをもう一度アップデートした場合は，
またgit commitしてgit push

以上。

# 関連記事
Gitの基本的なコマンド。
http://qiita.com/hnishi/items/8949567d092e15c163bc

プロキシの設定

https://qiita.com/hidetzu/items/c2db95613ba594a2ef25
FuelPHPのORMのObserverを一時的に無効にする方法

FuelPHPのModelはModelの内容が更新されたらupdated_atに自動でシステム日付を入れるという機能があります。
ModelにObserverを設定することでこれを実現しているのですが、一時的にObserverを無効にしてupdated_atの自動更新をやめたい場合があります。

その場合、`unregister_observer` メソッドを使ってObserverを無効にすることができます。

例えばモデルExampleが以下のように定義されていたとします。

```model/example.php
<?php

class Model_Example extends \Orm\Model_Soft
{
	protected static $_properties = array(
		'id',
		'name',
		'count',
		'created_at',
		'updated_at',
		'deleted_at',
	);
	protected static $_observers = array(
		'Orm\Observer_CreatedAt' => array(
			'events' => array('before_insert'),
			'mysql_timestamp' => true,
		),
		'Orm\Observer_UpdatedAt' => array(
			'events' => array('before_update'),
			'mysql_timestamp' => true,
		),
	);
	protected static $_soft_delete = array(
		'deleted_field' => 'deleted_at',
		'mysql_timestamp' => true
	);

	protected static $_table_name = 'examples';
}
```

この場合モデルのsaveメソッドで更新すると、モデルのプロパティが変更されていた場合
Observerが自動でupdated_atに値を設定します。

これを何らかの事情でupdated_atを更新したくない場合、以下のように

```php
	$model = Model_Example::find($id);
	$model->unregister_observer('Orm\Observer_UpdatedAt');`
	$model->count += 1;
	$model->save();
```

`unregister_observer` メソッドの引数に一時的に無効にしたいObserver名を指定して実行すると
Observerが無効になり、この場合`save`メソッドで更新してもupdated_atが更新されなくなります。
Charlesのルート証明書がiOSにインストール(getssl)できない問題


iPhoneなどの通信を見たくて、 [この記事](http://qiita.com/shtnkgm/items/cd32df0c7b4bd424f107) を参考に設定していましたが、どうにも http://www.charlesproxy.com/getssl にアクセスしても端末にルート証明書がインストールが始まらない。
Safariのデバッガで通信状態をみるとページは表示されるが、ダウンロードしようとしてる証明書本体がよめない模様。

原因は、ホストマシンのほうでCharlesに経由で http://www.charlesproxy.com/getssl に接続しないと証明書本体のDNSが解決できないからだった。

### 解決手順

1. ホストマシンと同じWifiに繋いでおく
2. iOS端末のWifi情報にプロキシの設定ローカルIPとCharlesで許可しているポートを設定する。
3. この時点でCharlesに繋がった気配はないが
4. この状態でSafariで http://www.charlesproxy.com/getssl にアクセスすると証明書がインストールできる。
5. あとは [この記事](http://qiita.com/shtnkgm/items/cd32df0c7b4bd424f107) にしたがって設定をする
6. これでCharlesで通信内容が見れるようになる。

ただ、FacebookアプリとTwitterアプリのAPIはうまく見れなかった。

---

### 参考

- http://qiita.com/shtnkgm/items/cd32df0c7b4bd424f107
プログラミングをするための環境構築と簡単なフォームをつくろう！

## 1.XAMPPのインストールと設定をする。
[インストール先（公式サイト）](https://www.apachefriends.org/jp/index.html)

**Windowsユーザー**
Windows 向け XAMPP 7.1.7 (PHP 7.1.7)を押す。
参考:[Windows向けインストール手順](https://techacademy.jp/magazine/1722)

**Macユーザー**
ヘッダーのダウンロードボタンを押し、画面遷移する。
Mac 向け XAMPP 7.1.7 / PHP 7.1.7を押す。
参考:[Mac向けインストール手順](http://www.koreyome.com/web/xampp-mac-setup)

わからないことがありましたらお気軽に、お声かけ下さい。

## 2.「Hello World」を表示する。
* XAMPP/htdocs内にhello.phpを新規作成する。
* hello.phpに下記コードを記述する。

```hello.php
<?php echo '<p>Hello World</p>';?>
```
* localhost/hello.phpをブラウザの検索窓に入力して、表示を確認する。


## 3.「フォーム」をつくろう。
* XAMPP/htdocs内にformフォルダを新規作成する。
* 新規作成したformフォルダ内にindex.phpを新規作成する。
* 新規作成したindex.phpを開き、下記のコードをコピー&ペイストする。

```index.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>Formをつくろう</title>
</head>
<body>
<div id="container">
  <h1>Form</h1>
  <form action="index.php" method="post">
  <!-- ここにフォームに入力されたデータを送るメソッドを記述します。 -->
  </form>
</div><!-- /#container -->
</body>
</html>
```

ここにフォームに入力したデータを送るメソッド送るメソッドを記述しますという箇所に下記コードを追記します。

```index.php
    <p><label for="task_name">Name</label><br><input type="text" name="name"></p>
    <p><label for="task_memo">Memo</label><br><textarea name="memo"></textarea></p>
    <input type="submit" name="submit">
```

実際にフォームのデータが送られているかどうかを確認します。下記のコードを<!DOCTYPE html>の上に記述いたします。

```index.php
<?php
var_dump($_POST);
?>
```
(Matplotlibに不慣れな人向け) Seabornでグラフを描くときのtips

この記事では、ごくごく細かいtipsを紹介します。といいつつ大半はmatplotlibの使い方になってしまった面もありますが、matplotlibに触ったことがない人がSeabornをいきなり使おうとしたときにつまるポイント（よそではmatplotlibの知識が前提となって解説されているところ）を補足する役割では役立つと思い書いてみます。

## 描画したグラフを表示する
matplotlib側の機能で、描画したあとにplt.show()を呼ぶと表示されます。

```showyourplot.py
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # cf. https://www.reddit.com/r/learnpython/comments/5oscmr/why_is_seaborn_commonly_imported_as_sns/

Z = np.random.random(1000)

sns.distplot(Z, kde=False)  # kdf stands for Kernel Density Estimation, which is disabled here.
plt.show()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160835/aa38add7-7060-2e88-47dd-3b1328a22062.png)
このようにウインドウが出てきてグラフが見えます。ここから手動で保存することもできます。
## 描画したグラフを自動で保存する
こちらもmatplotlibの機能で保存します。上のコードの最後に足してください。

```.py
plt.savefig("seaborntest.png")  # save as png file
```
![seaborntest.png](https://qiita-image-store.s3.amazonaws.com/0/160835/e0c786cc-79de-0b04-5b64-94d0f6da547e.png)
このようなファイルがseaborntest.pngというファイル名で保存されました。

```.py
plt.savefig("seaborntest.pdf")  # output format detected automatically
```
と拡張子を変えてやるだけでpdfで保存できます。ベクトルデータが残っているので、あとから必要に応じてAdobe Illustratorなどで修正することもできます。
## グラフがいくつも重なって描画されてしまうことを防ぐ
上の例でも二つ重なってしまっていますが、特にたくさんのグラフを描いて保存するときにはそのつど前に描画した内容を消してやる必要があります。そのためには`plt.clf()`を呼びます。

```savemanyplots.py
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

for i in range(10):
    plt.clf()  # flush previous drawings
    sns.set_context('poster')  # use large fonts
    Z = np.random.random(1000)
    sns.distplot(Z, kde=False)
    plt.savefig("seaborntest{0}.png".format(i),dpi=300)  # output high-resolution png
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/160835/05466aeb-241e-e1d2-7951-a24c9bef9bc8.png)
それぞれ内容の違う出力が10件生成できました。また、ここでは`set_context('poster')`で文字サイズを大きくし、savefigのオプションで'dpi=300'として高精細なグラフを生成しています。
## フォントをいじる
用途にもよりますが、斜体や上付き文字、下付き文字を使いたい場面もあることでしょう。以下にirisのデータをいじったサンプルを示します。このようにTeX記法で書けばそのとおりに反映されます。ついでにx軸ラベルを消し、y軸ラベルは変更しています。また、カラーパレットも変更しています。

```tweakfonts.py
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns

iris = sns.load_dataset('iris')
iris = iris.replace('setosa', '$sp. \mathrm{str.}$')  # italic and roman
iris = iris.replace('versicolor', '$\mathbf{amp^R}$')  # bold with superstring
iris = iris.replace('virginica', '$mutant_1$')  # italic with substring

sns.set_context('poster')
fig = sns.barplot(x='species',y='sepal_length',data=iris,palette='gray')
fig.set_xlabel('')  # no label on the categorical axis
fig.set_ylabel("Survival Rate")  # refine the y-axis label
plt.savefig('survival.png')
```
![survival.png](https://qiita-image-store.s3.amazonaws.com/0/160835/536d504c-be84-04e0-c06c-a58f8e8eae6e.png)
## リンク
一般的なSeabornの使い方についてはすでに解説されている方がいるのでこれらを参照してください。
http://qiita.com/hik0107/items/3dc541158fceb3156ee0
http://qiita.com/koji_france/items/47fbb89b0922251a20bb
http://qiita.com/koji_france/items/87c5d4d08fdc3ad0e9b4
https://nkmk.github.io/blog/python-seaborn-matplotlib/
Google Domains + HerokuでSSL通信を使ったオリジナルドメインサイトのための設定

# 前提
- SSL使用
- http://yourdomain.com/ は https://www.yourdomain.com/ にリダイレクト
- https://yourdomain.com/ はアクセスできない。基本的に誰も来ないと思われるので。

間違っている、この方がいいのではなどありましたらコメントいただけますと嬉しいです。
# Google Domains の設定
DNS の設定 (Configure DNS)に行き、以下のように設定

- 合成レコード (Synthetic records)を下記画像のように設定。黒塗りのところは使うドメインです（例：yourdomain.com）。
<img width="804" alt="スクリーンショット 2017-08-22 14.35.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/fc775cd6-a1ce-b694-6aad-ac36de4ed737.png">
- カスタム リソース レコード (Custom resource records)を下記画像のように設定
<img width="790" alt="スクリーンショット 2017-08-22 14.48.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/68213/de93c21b-b8d0-a598-ff7a-955a499c7bf8.png">


# Heroku　の設定
- ターミナルから `heroku domains:add www.yourdomain.com` を実行
- heroku.comに行き、Appを開いて、Resourcesに行き、ChangeをクリックしてHobby（月７ドル）を選択
- Settingsに行き、Domains and certificatesで、Configure SSLをクリック、Automaticallyを選択しContinueをクリック

# 今後調査メモ
## Google Domains + Heroku + Let's Encryptで　Heroku　の無料プランでSSL通信出来ないか
[Let's Encrypt 総合ポータル](https://letsencrypt.jp/)

# 参考
[Herokuで独自ドメインを割り当てる(お名前.com)](http://qiita.com/icb54615/items/76acf2a1ea151535c5dc)
Linux のコマンドラインで Bluetooth 接続

用語
---

* コントローラ (ctrl) とは: ローカルに接続されている BT の MAC アドレスの事
* デバイス (dev) とは: リモート BT デバイスの MAC アドレスの事

操作手順
-------

典型的な操作手順は以下のとおりです。BT コントローラは自動起動になっていて、使いたいデバイスの MAC アドレスを D4:0B:1A:F2:FE:DC とします。MAC アドレスは scan on で表示されるのでメモっておいた方が良いです。

    bluetoothctl
    scan on
    pair D4:0B:1A:F2:FE:DC
    trust D4:0B:1A:F2:FE:DC
    connect D4:0B:1A:F2:FE:DC

bluetoothctl
------------

これが標準の方法らしい。bluetoothctl とは、 [bluz ソースコード](https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/Makefile.tools#n3) に含まれるツールで、コマンドラインで Linux の Bluetooth の制御を行う事が出来る。

対話的に設定を行う bluetoothctl セッションの開始。

    bluetoothctl

コントローラの電源起動と停止

    list # ローカルコントローラのリスト表示
    show # コントローラの状態表示
    power on # コントローラ起動
    power off # コントローラ停止

ペアリングと接続

    scan on # デバイス検索モード
    devices # デバイス表示
    pair (dev) # ペアリング
    trust (dev) # デバイスを信用する。(必要かどうか分からない)
    paired-devices # ペアリング済デバイス表示
    connect (dev) # 接続
    info (dev) # デバイスの状態

その他のコントローラのコマンド

* select (ctrl) : コントローラ (ローカルの BT) 選択
* discoverable (on/off) : on で発見可能にする
* agent (on/off/capability) : リモートデバイスからペアリングを行う時使う。
* default-agent : リモートデバイスからペアリングを行う時使う。
* pairable (on/off) : ペア機能の ON/OFF

その他のデバイスのコマンド

* remove (dev) : ペアリングの削除
* disconnect (dev) : デバイス切断
Bootstrapsでボーダーレステーブルにする


Railsでテンプレートをhaml形式で書いている場合の例ですが、Bootstrapsを使用してボーダーレステーブルにする場合まず```table```クラスを追加してました。

```
%table.table
```

とかいて、ボーダレスなので

```
%table.table.table-no-border
```

と```table-no-border```クラスを追加してしまいます。


<img src="https://qiita-image-store.s3.amazonaws.com/0/8941/00bddaab-4dd0-ece3-ff11-99d995611be9.png" width="320" />




ところが、ここで線が消えないとなって慌ててググってcss追加してというのがいろいろ出てくるので、cssを書いてということを繰り返してきました。


が、なんと```table```クラスを外すだけでいいというのを知りました。

```
%table.table-no-border
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/8941/6490f605-0ba6-80a9-db27-49b164c25d10.png" width="320" />


ただ、グリットのサイズに合わせてくれないので合わせたい場合は結局cssでということになっちゃうのでしょうか？

<hr />

参照先
[Bootstrap table without stripe / borders](https://stackoverflow.com/questions/18075794/bootstrap-table-without-stripe-borders)
Python3_PyGame で2Dゲーム制作 (キー操作)

#Python3とPyGameでゲーム制作メモ ( part3, キー操作 )
前回 ([Python3とPyGameでゲーム制作メモ ( part2, 画像の表示 )](http://qiita.com/ken_3982/items/ad385329ee28535e84ce)) の続き．表示させた画像を矢印キーで操作する．

####開発環境
・macOS Sierra(10.12.5)
・Python(3.6.2)
・PyGame(1.9.3)

####参考URL
・Python公式：https://www.python.org/
・PyGame公式：https://www.pygame.org/news
・PyGameドキュメント：https://www.pygame.org/docs/
・PyGame Wikipedia：https://ja.wikipedia.org/wiki/Pygame

##表示した画像を操作する
前回の画像表示のコードに少し手を加えるだけ．


```key.py
#_*_coding:utf-8_*_
#キー操作する
import sys
import pygame
from pygame.locals import *

pygame.init() #pygameの初期化
screen = pygame.display.set_mode((400, 300))  #ウィンドウの大きさ
pygame.display.set_caption("PyGame")  #タイトルバー
image = pygame.image.load("./img/maru.png")  #画像を読み込む

pygame.key.set_repeat(5,5)  #キーの押下と押しっぱなしの取得(追加したとこ)
position = [200, 150] #座標を配列に[x座標, y座標](追加したとこ)

#mainループ
def main():
    while True:
        screen.fill((0,0,0))  #ウィンドウの背景色

        #イベントの取得
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()  #閉じるボタンが押されたらプログラムを終了
                sys.exit

            #キー操作(追加したとこ)
            elif event.type == KEYDOWN:
                if event.key == K_LEFT:
                    position[0] -= 5
                elif event.key == K_RIGHT:
                    position[0] += 5
                elif event.key == K_UP:
                    position[1] -= 5
                elif event.key == K_DOWN:
                    position[1] += 5

        #画面の端に行ったら反対から出るようにする(追加したとこ)
        position[0] = position[0] % 400
        position[1] = position[1] % 300

        #画像の描画位置(追加したとこ)
        rect = image.get_rect()
        rect.center = position

        #画像の描画
        screen.blit(image, rect)
        pygame.display.update()

if __name__ == '__main__':
    main()
```
これだけ追加すれば画像が動くようになる！
ちなみに動かすために画像は前回より小さくしてあります．

![スクリーンショット 2017-08-22 15.08.28.png](https://qiita-image-store.s3.amazonaws.com/0/76122/dcdc7b58-5343-5ae4-88f9-db94799b4c9d.png)


画像なので動いている感じが全くわからなくてすみません，でも矢印キーで動いている．かわいい．
あとは画面の端に行くと反対から出るようになっているので，

![スクリーンショット 2017-08-22 15.09.56.png](https://qiita-image-store.s3.amazonaws.com/0/76122/31b2dd5e-f791-9dfd-f65f-f03685e4891b.png)

左端に行くと・・・

![スクリーンショット 2017-08-22 15.10.08.png](https://qiita-image-store.s3.amazonaws.com/0/76122/568df858-fb1c-29cc-6621-5dad302f7f29.png)

右端から出てくる！
　
　
　



####参考文献
1. 田中賢一郎 (2017) 「ゲームを作りながら楽しく学べるPythonプログラミング」 インプレスR&D
2. [Python3とPyGameでゲーム制作メモ (part1,準備編)](http://qiita.com/ken_3982/items/f06a71636ad888af699d)
3. [Python3とPyGameでゲーム制作メモ ( part2, 画像の表示 )](http://qiita.com/ken_3982/items/ad385329ee28535e84ce)
YUNCHのYC-110ARという安物IPカメラとそのファイル保存アプローチ

AliexpressでYUNCHのYC-110ARという安物IPカメラを購入したのですが、これのMicroSDカードの管理が面白かったのでメモしておきます。
MicroSDカードを内蔵できて、H264の画像とJPEG画像を保存できるのですが、フォーマットするといきなり128MBのH264ファイルとJPEGSという拡張子で256MBのファイルが規定の個数、作成されます。
初期状態ではどちらも空のファイルなのですが、上書きで内容が書き込まれるようです。
動画はH264なのですが、コンテナフォーマットがない形式なので、FFMPEGなどで適切なコンテナを適用した形式に変更すれば、Windowsの一般的なメディアプレイヤーで見ることができるようになります。VLCで見る場合には設定の詳細でファイル形式をAUTOではなく、H264を指定すれば見ることができます。
JPEGSとなっているファイルはJPEGファイルを結合した形式になっているのでJpegAnalyzerというソフトを使って簡単に分割できます。
JpegAnalyzer使用時の注意点ですが、デフォルトでは256MBの大きさのファイルは読み込めませんので、JpegAnalyzer.iniのimitSizeOfAnalyzeFile項目の値を適切な大きさにしてから実行します。
これでJPEGSファイルから保存されているJPEGファイルがすべて取り出せます。
こういうアプローチもあるのかと感心しました。しかしながらこのアプローチが有効かどうかは不明です。
Python 「if __name__ == ‘__main__’:」の意味


## モジュール
Pythonのコードはスクリプトファイルとして保存し、他のプログラムから再利用することができます。そのファイルのことをモジュールという。
「import」を使用することで自作したモジュールもimportを使って読み込むことで、そのモジュールで定義した関数やクラスを他のプログラムでも使うことができる。

## `if __name__ == ‘__main__’:`の意味
とりあえず以下のプログラムを作成

```python:test.py
def test():
    print('Hello World!')
    
if __name__ == '__main__':
    test()
    
print('モジュール名：{}'.format(__name__))  #実行したモジュール名を表示する
```

```python:出力
Hello World!
```

#### なぜ実行されるのか
「`__name__`」という変数は宣言してないのになぜ実行される?

`__name__`はPythonプリンタでPythonスクリプトを読み込むと自動的に作成される。

<font color="red">Pythonスクリプトを直接実行した時には、そのスクリプトファイルは「\_\_main\_\_」という名前のモジュールとして認識される</font>
そのため、スクリプトファイルを直接実行すると`__name__`変数の中に自動で`'__main__'`という値が代入される

#### 要するに
<font color="red">「if \_\_name\_\_ == '\_\_main\_\_':」の意味は、「直接実行された場合のみ実行し、それ以外の場合は実行しない」</font>


インタプリタで実行してみる
`if name == '__main__':`はFalseとなって実行されない

```pycon
>>> import test.py
モジュール名：test
```


## 参照サイト
http://programming-study.com/technology/python-if-main/
HomebrewのOpenCV3でcv2.imshowが正常に動作するようになった

# はじめに

- Python3とOpenCV3環境化で画像処理を行いたかったのですが、cv2.imshowを実行すると以下のようなエラーとなり悩まされていました。

```text
The function is not implemented. Rebuild the library with Windows,
GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian,
install libgtk2.0-dev and pkg-config,
then re-run cmake or configure script in function cvShowImage
```

- しかしながら最近HomebrewのOpenCVのアップデートにより解消されたみたいです。
- どうやらOpenCVの２系と3系でそれぞれリポジトリがあったのですが、パッケージ名はOpenCVですが、中身としてはOpenCV3のみになったみたいです。それに伴い、Pythonも3系のみになっているみたいです。

# PythonとOpenCVを入れ直す

- 特別に行うことはないのですが、一応メモとして残します。

## Homebrewのアップデート

```text
brew update && upgrade
```

## OpenCVおよびOpenCV3のアンインストール

```text
brew uninstall --force opencv
```

```text
brew uninstall --force opencv3
```

## PythonおよびPython3のアンインストール

```text
brew uninstall --ignore-dependencies python
brew uninstall --force python
```

```text
brew uninstall --ignore-dependencies python3
brew uninstall --force python3
```

## Python3およびOpenCV3のインストール

```text
brew install opencv
```

## pip3の更新

```text
pip3 install --upgrade pip setuptools wheel 
```

# インストール後確認

```text
Python 3.6.2 (default, Jul 17 2017, 16:44:47) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2
>>> cv2.__version__
'3.3.0'
```

# 最後に

- この更新によりまたモチベーションが戻ってきたので、色々遊んでみたいとおもいます。
Wannacry対策できたことを確認する方法

# 概要

最近流行りのWannacryへの対策として、
ActiveDirectoryが存在しない状況下で、
LAN内のPC全てのセキュリティパッチ適用状況を調べるには、
PowerShellでNASのテキストファイルにリストを吐き出すのが最良だった。

# MS17-010とは

マイクロソフト セキュリティ情報
[MS17-010 - 緊急](https://technet.microsoft.com/ja-jp/library/security/ms17-010.aspx)
SMBv1の脆弱性を修正するものとされる。

# シェルスクリプト作成

Microsoftサポート
[MS17-010 がインストールされたことを確認する方法](https://support.microsoft.com/ja-jp/help/4023262/how-to-verify-that-ms17-010-is-installed)
確認方法に関して様々な情報が出回っており、バッチにてqfeでKB番号を確認する方法を最もよく目にする。
上記サポートサイトのPowershellスクリプトを参考に作業したところ、
（PowerShell2.0以降が前提だが）powershellの方が確実で速いことが分かった。

**Excelsior!**
MacとWinそれぞれでgit関連の編集をvim→sublimeに変更する




自分はsublimeが好きなので（というか他の用途と合わせて1つのエディタに集約したい&sublime内のタブでターミナルを起動させられるようにしてるので）,コミットメッセージ修正（git commit --amend）などでもvimではなくsublimeに出来るように以下のように設定しました。

■Macのやり方

※ターミナルから「subl」でsublime text3を起動させられるようになっている前提
（そのやり方は[ここ](http://no-title.com/mac/sublime-text-3)とか見るとできます）

下記を実行

```bash
git config --global core.editor "subl -n -w"
```

■Winのやり方

※sublimeのPathはそれぞれどこにインストールしているか確認して修正してください。
自分の場合は下記にインストールされていました。

下記を実行

※「subl」でsublime text3を起動させられるようになっていないはこっち

```bash
git config --global core.editor "'C:\Program Files\Sublime Text 3/sublime_text.exe' -w"
```

※「subl」でsublime text3を起動させられるようになっている人はこっち
やり方は[ここ](http://qiita.com/hiro-abe/items/7c2140bfca57cddbb859)とか見るとできます）

```bash
git config --global core.editor "'subl' -w"
```

試しにgit logが存在する状態で「git commit --amend」と実行したときにvimではなくsublimeが起動されればOK。ふつーに編集&保存で適用される。
FPGA覚書

# 概要

* FPGAとは
    * 回路をプログラムできるチップ
    * ブレッドボードで物理的に手で配線切り替えてあれこれやってる作業をプログラムで論理的にできるイメージ
    * 勉強を進めていくと「CPUでやらない方がよい」という選択肢が見えるようになるらしい

# 参考

* [FPGAとArduinoとRasberryPIの違いと、FPGAを勉強する理由](http://d.hatena.ne.jp/nowokay/20130218)
* [NES on FPGA](http://pgate1.at-ninja.jp/NES_on_FPGA/)
    * FPGAでファミコンの互換機を作成する
RequestsモジュールでWebDAVのファイル一覧を見たい

[Requests](http://requests-docs-ja.readthedocs.io/en/latest/)、便利ですよね。pythonのモジュールの中で一番良く使うと思います。urllib2の代わりに標準搭載してくれたらいいのに。

さて、WebDAVのファイル一覧を取得するためには、`PROPFIND`というメソッドを投げないといけないのですが、残念ながら`requests`ではこれに対応していません。

```
requests.propfind('https://example.com')
```
などとやろうものなら、華麗に`AttributeError: module 'requests' has no attribute 'propfind'`と返してくれます。

代わりに、Requestsの低レベルAPIである`Request`と`Session`を用いて、`PROPFIND`メソッドを投げてみましょう。

```
import requests

def propfind(url):
    
    req = requests.Request('PROPFIND', url, headers={'Depth': '1'})
    prepped = req.prepare()
    
    s = requests.Session()
    resp = s.send(prepped)
    return resp.text
```

`headers={'Depth': '1'}`としているのは、WebDAV内の全リストを取得するとサーバ側に負荷が掛かる為、指定したURL直下のリストのみを取得するようにしています。
レスポンスはXMLですので、`ElementTree`でたどっていきましょう。`{DAV:}href`属性を取得するだけです。
先ほど作った`propfind(url)`で取得したXMLを、次に作る`xml_to_list(xml)`に渡してみましょう。

```
import xml.etree.ElementTree as ET

def xml_to_list(xml):
    root = ET.fromstring(xml)
    
    files = [ f.text for f in root.findall('.//{DAV:}href') ]
    
    if (files):
        return files
    else:
        None

```

`root.findall()`の中の記法は[XPath](https://ja.wikipedia.org/wiki/XML_Path_Language)です。
これで、WebDAVのファイルリストがリストで戻ってきます。

## 参考
[Advanced Usage(Requests公式)](http://requests-docs-ja.readthedocs.io/en/latest/user/advanced/)
GitLab を導入してみるの巻




バージョン管理をローカルで実施するため、GitLab を導入する。

導入先の条件は以下の通り。

■端末情報

・Windows 10 pro

・Oracle VM VirtualBox 上で動作

■Git 実行環境情報

・VM OS は、Ubuntu 16

 

以下のサイトを参照して、実施。

http://qiita.com/masakura/items/0a0f00dfdddc8ce27f29

 

#Virtual Box にUbuntu を構築

最初に、検証端末に仮想化ソフトを導入して、Ubuntu OS を動かす。

下のサイトを参照

https://theolizer.com/cpp-school1/cpp-school1-3/

 

#Ubuntu の準備

以下のサイトから、日本語Ubuntu iso をダウンロードする

1.3GB あるので、ダウンロード待ち有り

https://www.ubuntulinux.jp/download/ja-remix

 

今回は下のver を選択。

ubuntu-ja-16.04-desktop-amd64.iso（ISOイメージ）

 

VirtualBox の新規VM として、上のISO ファイルを読み込み。

アップデート含めて、2時間程度かかるので、お昼休みと併せて実施。

 

VM の再起動を促されるので、再起動を実施する。

下のメッセージで、VM がハングアップした。

intel_rapl: no valid rapl domains found in pcackege 0
その場合、

Virtual Box のウィンドウから、

仮想マシン > リセット > はい　を実施すると解決。

 

ユーザ認証で、ログイン出来れば完了。

※余裕がある際は、下のサイトにある”2-3-1.ホストOSとの連携を良くするGuest Additionsをインストールします。” を実施して下さい

https://theolizer.com/cpp-school1/cpp-school1-3/

 

#GitLab の導入

本題のGitLab を導入する。

本稿の上で構築したVirtual Box のUbuntuへGit Lab をインストールする。

下の操作は、記載がない限り、Ubuntu 上のターミナルのコマンドを示す。

ターミナル起動は、Ubuntu のデスクトップ画面で、”Ctl + Alt + Tキー” で起動できる。

 

必要なソフトを導入する

sudo apt-get install curl openssh-server ca-certificates postfix -y
途中、postfix 等の設定が出てくるので、指示に従い設定する。

操作は、マウスではなく、テンキーで行う。

 

apt line に GitLab CE を登録するためにスクリプトを実行する

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt-get install gitlab-ce
上のコードを実行して、ターミナルへ下のメッセージが出ればＯＫ

The repository is setup! You can now install packages.

 

その後、パッケージをインストールする。

sudo apt-get install gitlab-ce
パッケージは、1.5GB 程度あるのでダウンロード時間が30分程度かかる

 

コンフィグを再設定する。

sudo gitlab-ctl reconfigure
 

 

ログインに向けて、設定を確認する。

sudo vi /etc/gitlab/gitlab.rb
ファイル内の”external_url” の情報をメモする。

※私の環境では、http://test-VirtualBox

 

ブラウザ”FireFox” のアドレス欄へexternal_url 情報を入力する

GitLab のページが開き、パスワードの設定を促されるので、設定する。

設定完了後、ログイン画面になるので、以下の情報を入力してログイン。

ID:root

PW:上で設定した情報
 

下のプロジェクトページが表示されたら完了。

![ws000032.jpg](https://qiita-image-store.s3.amazonaws.com/0/184724/cd28be28-7dfb-22c9-87f7-85efcdf639ec.jpeg)


 

お疲れ様でした。

以下のサイトをQiita 向けに引用
https://goo.gl/aKYYKP
ユーザを作成するテストコードではUserNameに注意

# 概要
- `test@example.com` ユーザを作成するテストコードがありました
- SandboxでのテストはPassしていました
- 本番リリース時にテストコードがエラーになってしまい、リリースできませんでした（泣

# 再現用テストコード

```java
@isTest
private class UserAddTest {
    @isTest static void useradd() {
        // get profile
        List<Profile> profiles = [SELECT Id FROM Profile WHERE Name IN ('Standard User', '標準ユーザ')];
        System.assert(profiles.size() > 0);

        // insert test user
        insert new User(
            UserName = 'test@exapmle.com',
            Email = 'test@example.com',
            LastName = 'test',
            Alias = 'test',
            TimeZoneSidKey = 'Asia/Tokyo',
            LocaleSidKey = 'ja_JP',
            EmailEncodingKey = 'ISO-2022-JP',
            LanguageLocaleKey = 'ja',
            ProfileId = profiles.get(0).Id
       );
    }
}
```

# 事象
- Sandboxでテスト実行した場合はPass
- 本番リリース時のテストで下記エラー（適当に改行しています）

```
System.DmlException: Insert failed. First exception on row 0;
first error: DUPLICATE_USERNAME, ユーザ名がすでに登録されています。<br>
この Salesforce 組織または別の Salesforce 組織に、ユーザ名がすでに存在します。
ユーザ名は、すべての Salesforce 組織で一意である必要があります。
解決するには、異なるユーザ名を使用します (ユーザのメールアドレスと一致する必要はありません)。 : [Username] 
```

# 解決方法
- UserNameは、（他の企業が利用している組織も含めて）Salesforce組織全体で一意である必要がある、と理解しました
- Sandboxでエラーにならないのは、インスタンスごとに一意ということなのでしょうか。
- とにかく、テストコードであっても、UserNameは重複しないようにする必要があるようなので、自組織のドメイン等を指定するのが良さそうです。
テストサーバーに反映する前にローカル環境で確認する方法

# 背景
社内でディレクター陣がWinからMacに切替つつあるので、Macに切り替えた第1号としてできることが増えた喜びを備忘録としてメモ。

### 今までの社内開発フロー
エンジニアがローカルで作業→**テスト環境にアップ**→ディレクターが確認。
修正が必要だった場合、これを繰り返すことになる...

### これからの社内開発フロー
エンジニアがローカルで作業→ディレクターがローカル環境で確認。
修正が必要だった場合、無駄なテストアップの工数が省ける！（円滑や）

そう、ディレクターがローカル環境で確認さえできればエンジニアにいちいちテスト環境にあげてもらわなくても済むんです！！（円満。すごく。）

さらに3つの手間も省ける！

- 「お願いします（依頼）」
- 「まだかな...（待ち）」
- 「あざます！確認します！（お礼）」

さてさて本題に入ります。

# 準備
- MAMPをインストール（※設定方法は略）
- Terminal
- 環境構築（※自分でやっていないので略）

# 手順（Terminal）
①対象のディレクトリへ移動（MAMPは接続している前提）
```cd ~/_work/hogehoge/front_dev_react
```
②リポジトリ内容を確認する　※pullするとマージしてしまう
```git fetch
```
③リモートブランチも含めたブランチの一覧を表示する
```git branch -a
```
④切り替えたいブランチを選ぶ
```git checkout -b fix/master-create origin/fix/master-create
```
※補足
リモートブランチ（確認したいブランチ）
```origin/fix/master-create```
ローカルブランチ（置き換えるブランチ）
```fix/master-create```

ローカルブランチ名は任意のもので良いらしいが、originをとったものにしておいた方がpushの際に便利とのこと。（慣習）

⑤実行
```yarn dev```

⑥ブラウザの検索バーに入力
```http://localhost:8800/```

これで確認できるはず！

社内ではgithubとslackを連携しているため、このローカル環境での確認がOKならばslackのプロジェクトチャンネルでdeployコマンド打てばテストや本番にディレクターが反映できちゃいます。

以上です。
※誤り等ございましたらご指摘いただければ修正します。
Railsで他のテーブルのカラムをソートする方法

## はじめに
Railsで取得した値を並び替えする際には、`order`メソッドを使うのが一般的だと思います。
ただ、他のテーブルから取得した値をソートする際にちょっとハマったのでメモを残しました。

## 1つのテーブルでソートする場合
[リファレンス](http://railsdoc.com/references/order)にもありますがこちらは非常にわかりやすいです。

```
モデル.order("カラム名 DESC")
```

## 別のテーブルのカラムをソートする場合
例えば、`project`モデルの`date`カラムをソートする場合
結論からいうと下記のように書けばうまく行きました。

```
モデル.includes(:project).order("projects.date DESC")
```

ポイントはorderの中では複数形で書くといいそうです。

## 参考
[Belongs toしているテーブルのカラムでソートする](http://yuuxxxx.hatenablog.com/entry/2013/05/15/193729)
IPアドレスが指定したIPアドレス範囲の中にあるかチェック

#IPアドレスが指定したIPアドレス範囲の中にあるかチェック
##はじめに
いろんなサイトをみるとIPv4とIPv6で書き方が違う。
IPv4は主にip2longでキャストしてチェックしている。
IPv6はintにキャストするとサイズオーバーするのでバイナリに直してチェックしている。

###IPv4もバイナリチェックしよう。
IPv4もIPv6も別にバイナリチェックすれば同じロジックでできるよね？

##実際のコード

```php:ip.php
<?php
function conevrt_addr_mask(string $ip, int $subnet)
{
    $addr = inet_pton($ip);
	$len = 8 * strlen($addr);
	$mask = str_repeat('f', $subnet >> 2);
	switch ($subnet & 3) {
		case 1:
			$mask .= '8';
			break;
		case 2:
			$mask .= 'c';
			break;
		case 3:
			$mask .= 'e';
			break;
		default:
			break;
	}
	$mask = pack('H*', str_pad($mask, $len >> 2, '0'));
	$filt = $addr & $mask;
	return $filt;
}

function checkip(string $ip, string $addr_range)
{
	$ret_addr = explode("/", $addr_range);
	$chk_mask = conevrt_addr_mask($ret_addr[0], (int)$ret_addr[1]);
	$ip_mask  = conevrt_addr_mask($ip, (int)$ret_addr[1]);
	if ($chk_mask === $ip_mask) {
		return true;
	}
	return false;
}

var_dump(checkip("127.0.0.1", "127.0.0.1/32")); // true
var_dump(checkip("127.0.0.1", "127.0.0.2/32")); // false

var_dump(checkip("1023:4567:89ab:cdef:1023:4567:89ab:cdef", "1023:4567:89ab:cdef:1023:4567:89ab:cdef/128")); // true
var_dump(checkip("1023:4567:89ab:cdef:1023:4567:89ab:cdef", "1023:4567:89ab:cdef:1023:4567:89ab:cde0/128")); // false
?>
```
やっていることは単純。IPとIPレンジを受け取ったら、バイナリにしてからレンジ分だけ一致するか調べるだけ。


##注意点
###入力値検証
`$ip`および`$addr_range`は入力検証は行っていないので、この関数を掛ける前にかならず入力検証をしないといけない。
標準のfilter_var関数を利用しましょう。
`mixed filter_var ( mixed $variable [, int $filter = FILTER_DEFAULT [, mixed $options ]] )` 
http://php.net/manual/ja/function.filter-var.php

###IPv4とIPv6の互換性
[IPv6 - Wikipedia #IPv4との相互運用](https://ja.wikipedia.org/wiki/IPv6#IPv4.E3.81.A8.E3.81.AE.E7.9B.B8.E4.BA.92.E9.81.8B.E7.94.A8)
> 実際のパケットフォーマットは完全に異なる上、IPアドレス空間の大きさも違うため、一対一対応はできない。

IPv4でIPv6レンジでチェックしたりIPv6をIPv4レンジでチェックしたりすると、誤検知の可能性は低い(ほとんどfalse)にしても
バグが生まれる原因になるのできちんとどちらのパターンで変数が入ってくるか制御はしたほうがいいと思います。

IPv4とIPv6どちらが入ってくるかわかないという場合はビジネスロジック自体は見直したほうがいいとは思いますが、
必要であれば前述しているfilter_var関数で用意してくれている`FILTER_FLAG_IPV4`もしくは`FILTER_FLAG_IPV6`でどちらのプロトコルを利用しているのか調べてからチェック掛けましょう。
http://php.net/manual/ja/filter.filters.validate.php

##あとがき
速度はよくわからない。実質サブネットマスクの計算の部分が大きいからこっちのほうが遅いかな。
そういえば枯渇問題はどこいったんだろう。
Windows10でAnacondaによりTensorFlowとKerasを動かす

#Windows10でAnacondaによりTensorFlowとKerasの環境を構築する
巣籠悠輔著「詳解 ディープラーニング ~TensorFlow・Kerasによる時系列データ処理~」のサンプルプログラムを以下の環境で実行しようとした所，Numpy+MKLパッケージとSciPyパッケージとMatplotlibパッケージがうまく共存せず，非常に戸惑ったので成功例を示します。

+ Windows 10 64bit
+ Anaconda 4.4.0 Python 3.6 version

サンプルプログラム : https://github.com/yusugomori/deeplearning-tensorflow-keras 
Windows用バイナリーのダウンロード : http://www.lfd.uci.edu/~gohlke/pythonlibs

##TensorFlowのインストール
TensorFlowのインストールは，公式ページ通りに行った。
Installing with Anaconda : https://www.tensorflow.org/install/install_windows

```
conda create -n py35 python=3.5 
activate tensorflow
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.3.0-cp35-cp35m-win_amd64.whl
```

##NumPy+MKL, SciPy, Matplotlibのインストール
SciPyとMatplotlibはNumPy+MKLに依存している。
"numpy-1.13.1+mkl-cp35-cp35m-win_amd64.whl"をダウンロードして，インストールした。

```
pip install numpy-1.13.1+mkl-cp35-cp35m-win_amd64.whl
```



Kerasをインストールする時にSciPyパッケージのインストールでエラーが出たので，Kerasをインストールする前に"scipy‑0.19.1‑cp35‑cp35m‑win_amd64.whl"をダウンロードして，インストールした。

```
pip install scipy-0.19.1-cp35-cp35m-win_amd64.whl
```

"matplotlib-2.0.2-cp35-cp35m-win_amd64.whl"をダウンロードして，インストールした。

```
pip install matplotlib-2.0.2-cp35-cp35m-win_amd64.whl
```

これでSciPyとMatplotlibをimport出来るようになったが，後にscikit-learnをインストールすると，

```
"C:\Users\User\AppData\Local\conda\conda\envs\py35\Lib\site-packages\numpy\_distributor_init.py"
```

が原因でscipyをimportが出来なくなるので，このファイルをコピーしておく。



##scikit-learnのインストール
```
pip install scikit-learn
```

scikit-learnをインストールしたら，
scipyをimportしようとすると，再びエラーが出るようになった。"from numpy.\_distributor\_init import NUMPY_MKL  # requires numpy+mkl"とエラーが出ていたので。

```
"C:\Users\User\AppData\Local\conda\conda\envs\py35\Lib\site-packages\numpy\_distributor_init.py"

```

をSciPyをimport出来ていた時にコピーした同名ファイルに置き換えた。これで，TensorFlowによるサンプルプログラムを実行することが出来た。

※ここで，ファイルを置換するのではなく，"numpy-1.13.1+mkl-cp35-cp35m-win_amd64.whl"により，NumPy+MKLを再インストールしてしまうと，次はMatplotlibをimportしようとすると，Windowsで"プロシージャ エントリ ポイント mkl_aa_fw_init_workdivision がダイナミック リンク ライブラリC:\Users\User\AppData\Local\conda\conda\envs\py35\Library\bin\mkl_intel_thread.dllから見つかりませんでした。"と警告が出て，Pythonで"Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll."とエラーが出た。

##Kerasのインストール

```
pip install keras
```

これでKerasによるサンプルプログラムも実行出来たので，おそらく正常に環境構築が出来た。

#エラーの原因は何だったのか？
Matplotlibと一緒にインストールされるNumPyでは、NumPy+MKLをうまく初期化出来ないようだった。パッケージをインストールする順番を変えると，また色々変わってくるかもしれない。

Anacondaにはpip installとconda installがあり，どちらを使えば上手くいくのか分からない時があった。
pip installを使うときは，--ignore-installed(-I)オプションを付けると，うまくいくことが多かった。
条件付き書式で変わったセルの背景色をマクロで取得する

Excelの条件付き書式で変わったセルの背景色を取得したかったので調べたメモ。
以下の方法でできました。
※動作環境：Win8.1, Excel2016 (Office365)

```vbnet
Range("A1").DisplayFormat.Interior.Color
```

未確認ですけど文字色とかも取得できると思います。
Laravel validation + Json

csrf_tokenを閉じる

外部からPOSTされる時、
csrf_tokenのチェックを無効にする必要がある。

```app/Http/Middleware/VerifyCsrfToken.php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
    /**
     * CSRFバリデーションから除外するURI
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
         //URI追加
    ];
}
```


## テストコードの時

```app/Http/Kernel.php 
//コメントする
'App\Http\Middleware\VerifyCsrfToken',
```
Csrfを使うコントローラでのみONにする、
コントローラのコンストラクタに入れたら、コントローラのCSRFがONになる。

```app/Http/Controller/xxxxController.php 
$this->middleware('App\Http\Middleware\VerifyCsrfToken'); 
```



###  そしてValdationを書く、返す値を\Response::json()で処理

```php

public function create(Request $request)
{
    //全てのrequestデータを取る

    $rules = [
        'e-maill'=>'required',
        ...
    ];

    $messages = [
        'email.required'=>'email is must.',
        ...
    ];
 

    $validation = Validator::make($request,$rules,$messages);

    $response = array();

    if($validation->fails()){

        $response['status'] = "NG";
        $response['message'] = "validation error.";

        return \Response::json($response);


    }else{

        //
        //DB書き込みなどの処理

        $response['status'] = "OK";
        $response['message'] = "no problem.";

        return \Response::json($response);
    }
}
```
iPad(iOS10.3)のsafariで音声ありで動画を自動再生させる(Webアプリとして起動した場合)

通常は音声をmuteにした場合はinline再生が可能になりましたが
apple-mobile-web-app-capableを有効にしwebアプリとして起動した際は
muteにしなくても自動再生が可能でした。

以下のコードにて確認
```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
</head>
<body>
<video id="vid" autoplay="" autobuffer="" preload="auto" onclick="this.play()" webkit-playsinline="webkit-playsinline">
    <source src='main.mp4' type='video/mp4;'>
</video>
</body>
</html>
```
zshでmkdirしたディレクトリにそのままcdする

#設定
~/.zshrcの中に追記していきました

# zshでmkdirしたディレクトリにそのままcdする
今までは

```shell-session
mkdir hoge
cd hoge
```

としていたのですが，zsh触っているうちに

```shell-session
mkdir hoge
```
だけでhogeディレクトリに移ってくれないかなと思い始めたため　そして少し詰まったため

# うまく行った設定

```shell-session
alias mkdir='(){mkdir $1;cd $1}'
```
aliasとして設定したくて自分的にはこれが完璧だった
aliasには無名関数も使える

#うまく行かなかった設定

```shell-session
alias mkdir="mcd"
function mcd(){
  builtin mkdir $1
  cd $1
}
```
builtinを入れないとaliasのmkdirが呼び出され再帰でエンドレスになってしまうっぽい
しかしいれたところでうまく行かなかった
0からのAngular ①


開発でAngularを触ることがあったので、まずは環境構築とチュートリアルを進めてみるかというくらいにはAngular初心者。ちなみに「Angular」のスペルミスもひどかった、、、
まずは、環境構築を兼ねた[GETTING STARTED](https://angular.io/guide/quickstart)をやってみる。

## 環境構築
何をするにも環境構築ということで、必要なツールをインストールしていく。
インストールするのはAngular CLIというコマンドでプロジェクトを作成したりファイルを作成できるようにする。
yarnでグローバルにインストールした。

```bash
yarn global add @angular/cli
```

yarnを使用するのでパッケージマネージャをyarnに変更しておく。

```bash
ng set --global packageManager=yarn
```

## プロジェクトの作成
Angular CLIでプロジェクトを作成する。

```bash
ng new my-app
```

## アプリケーションを立ち上げる
プロジェクトのディレクトリに移動し、サーバを起動する。

```bash
cd my-app
ng serve --open
```

`ng serve`とするとサーバが起動し、今後の変更も監視し、リロードしてくれるみたい。
サーバが起動すると、ブラウザが開かれる。（ブラウザが自動で開かれるのは--openをつけたおかげ）
これだけでもちょっと嬉しい(*´ω｀*)

![MyApp.png](https://qiita-image-store.s3.amazonaws.com/0/45577/dba2f294-c997-2e5a-41f0-167512aee80e.png "MyApp.png")

## コンポーネントを編集する
Angular CLIが作成したファイル郡の中の`プロジェクトのルート/src/app/app.component.ts`がルートコンポーネントになっている。
8行目のtitleプロパティをappからMy first Angular Appに変更する。

```js
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'My first Angular App';
}
```

こうなる。
エディタで保存するとブラウザが自動でリロードされるのが何気にうれしい(*´ω｀*)

![MyApp.png](https://qiita-image-store.s3.amazonaws.com/0/45577/6f1c6edd-6ab9-d429-88d9-77925582619f.png "MyApp.png")


続いて、`プロジェクトのルート/src/app/app.component.css`を以下のように編集する。

```css
h1 {
  color: #369;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 250%;
}
```

![MyApp.png](https://qiita-image-store.s3.amazonaws.com/0/45577/ab399112-1500-d61c-df38-9dbdc8011b78.png "MyApp.png")



## 終わりに
軽く触るだけだったが、1時間くらいでできたのが良かった。
全く関係ないが、英語が少しスムーズに読めて嬉しくなった(*´ω｀*)
次はチュートリアルをやろうと思う。

続きは[こちら](http://qiita.com/hiyoko/items/6bf42578dd6d990ff79c)
Fishermanでperlのwarningがでてしまうのを対処


Fishermanを試してみようとしたらperlのロケールガセットされてないエラーがでた。

```
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LC_ALL = (unset),
        LANG = "ja.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
```

設定ファイルに以下を追加した。

```.config/fish/config.fish
set -x PERL_BADLANG 0
```

参考文献

https://www.hbirds.net/linux/ubuntuserver/ubuntu-server-ppc-9-10/perllocale-warning/6172
DockerでRailsのプロジェクトを立ち上げるまで


##モチベーション
前回触った時（[Dockerを使ってrailsアプリケーションを開発する1](http://qiita.com/usatie/items/8596f4b6d13cdba6f8b7)）は、あんまりうまく動いてる感なかったのでもうちょっとベストプラクティスを探していた。

・docker-composeをうまいこと使ってコンテナ管理したい
・volumesを使ってビルドのたびにgem installに長時間かかってしまうのどうにかしたい
・最小限の構成でやりたい（これはまだ出来てない感）

##ポイント
昔と比べて
・volumesをうまく使う
・nginxは必要ない（puma）
・unicornは必要ない（puma）
・--path vendor/bundleは必要ない（Dockerを使うので）
・app_nameは適当にしてください〜



##初期構成
###ファイル構成の概要
```ファイル構成の概要
.
├── Dockerfile
├── docker-compose.yml
└── src
    ├── Gemfile
    └── Gemfile.lock
```

###Dockerfile

```Dockerfile
FROM ruby:2.4.1
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
ENV BUNDLE_JOBS=4 \
    BUNDLE_PATH=/bundle \
    APP_DIR=/src/app_name/
RUN mkdir -p $APP_DIR
WORKDIR $APP_DIR
COPY src/Gemfile $APP_DIR
COPY src/Gemfile.lock $APP_DIR
RUN gem install bundler & bundle install
COPY src $APP_DIR
```

###docker-compose.yml
```docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
      - "80:3000"
    command: bundle exec puma
    volumes:
      - ./src:/src/app_name
      - bundle-data:/bundle
    depends_on:
      - db
  db:
    image: postgres
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  bundle-data:
  db-data:
```

###src/Gemfile
```src/Gemfile
source 'https://rubygems.org'

gem 'rails', '~> 5.1.3'
```

###src/Gemfile.lock
```src/Gemfile.lock

```

以上の４ファイルを準備。そして以下を実行

##Rails Appの作成
```Terminal
$ docker-compose build
$ docker-compose run web rails new . --force --database=postgresql --skip-bundle
```

rails newするとプロジェクトが生成されるので、ここでdatabase.ymlを編集

```config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: postgres
  host: db

development:
  <<: *default
  database: app_name_development

test:
  <<: *default
  database: app_name_test

production:
  <<: *default
  database: <%= ENV['DATABASE_NAME'] %>
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWORD'] %>
  host: <%= ENV['DATABASE_HOST'] %>```
```

ここまで出来たらbundle install

```Terminal
$ docker-compose run web bundle install

```

最後にdbを作成

```Terminal
$ docker-compose run web rails db:create
```

以上で、起動出来るようになる。

```Terminal
$ docker-compose up
```

Gemを更新した時とかは

```Terminal
$ docker-compose run web bundle install
```
新はてなブックマークで本文をトップに表示する&お気に入りユーザーのコメントをポップアップさせるユーザースクリプト

新はてブつらい！
のでひとまず作りやすいところをいじって居心地なおす！

# <i class="fa fa-camera"></i> スクリーンショット
![2017-08-22_11h09_47.png](https://qiita-image-store.s3.amazonaws.com/0/62354/ef795771-0b75-53ba-699c-26abf3d477d0.png)


# 本文とタグをメインブロックに移動

本来のものは一応消していない。

[move_entory-about_to_top.user.js]

```js:move_entory-about_to_top.user.js
// ==UserScript==
// @name        move entory-about to top
// @namespace   khsk
// @description 本文とタグをトップに移動
// @include     http://b.hatena.ne.jp/entry/*
// @include     https://b.hatena.ne.jp/entry/*
// @version     1
// @grant       none
// ==/UserScript==

const ea = document.querySelector('section.entry-about');
const emb = document.querySelector('div.entry-myBookmark');
emb.parentNode.insertBefore(ea.cloneNode(true), emb);

```

# お気に入りユーザーアイコンホバー時の表示にコメントとタグを追加

[popup_favorite_users_comment.user.js]

```js:popup_favorite_users_comment.user.js
// ==UserScript==
// @name        popup favorite users comment
// @namespace   khsk
// @include     http://b.hatena.ne.jp/entry/*
// @include     https://b.hatena.ne.jp/entry/*
// @version     1
// @grant       none
// ==/UserScript==

const target = document.querySelector('ul.entry-info-favorite');
if (!target){
  return;
}

const observer = new MutationObserver((mutations) => {
  mutations[0].target.querySelectorAll('li').forEach((li) => {
    const popup = li.querySelector('span')
    popup.innerText += ' \n ' + li.dataset.bookmarkComment + '\n\n' + li.dataset.bookmarkTags;
// 後から追記すると最初の\nによる<br>が削除される謎現象が起きているので空タグでも改行をつけることにする↑
//     if (li.dataset.bookmarkTags) {
//       popup.innerText += '\n\n' + li.dataset.bookmarkTags;
//     }
    
    // ここきれいにアイコンの上付きできないからなんとかして 適当に大きくしとくね
    popup.style.top = '-135px';
    popup.style.width = '165px';
    // 個人的 横幅が狭いと最初のポップアップが見切れるから右にプラス移動 上下合わせて微調整は個人で
    popup.style.right = 0
    popup.style.left = 0
  });
  observer.disconnect();
});

const config = { attributes: true, /*attributeFilter: ['children'],*/childList: true, };
observer.observe(target, config);
```


# <i class="fa fa-cogs"></i> 検証環境

* Firefox 54
* Greasemonkey 3.11

# 注意

ワイルドカードのせいでブコメページ内で数回動いているので、分かる人はexcludeなどをしてみてください。

ポップアップのCSSがひどい出来栄えなので見れれば十分な人向け…


# 次

履歴は無理としても記事タグを選択して入力かなあ。




[move_entory-about_to_top.user.js]:https://gist.github.com/khsk/1e7dd3d6beb21da52e4e18b310202392/raw/8211b1a8ade3f45a720b7c1d4cd2e16f32e2f4c1/move_entory-about_to_top.user.js

[popup_favorite_users_comment.user.js]:https://gist.github.com/khsk/1e7dd3d6beb21da52e4e18b310202392/raw/8211b1a8ade3f45a720b7c1d4cd2e16f32e2f4c1/popup_favorite_users_comment.user.js
ES6 for in for ofにハマる

es6からbabel-loaderでコンパイルしたらハマったので、そんな方の助けになれば。

```js:es5
for (key in this.scores) {
    console.log(key);
}
```

```js:es6
for (let key in this.scores) {
    console.log(key);
}
```

```js:es6
for (let value of this.scores) {
    console.log(value);
}
```
Seleniumで画像などのバイナリデータを保存する

JavaScriptでテキスト形式のバイナリデータ(?)を取得して、Python側で変換して保存しています。

Seleniumの画像保存で情報を探すと、URLを取得してPython側からリクエスト投げたり、スクリーンショット機能を使ったりするものが多かった。
その場合、テスト中の端末からしか取得できないバイナリデータの保存に使えなかったので、別の方法を模索して行き着いた。

### 修正

* レスポンスのテキストデータをそのまま返却していたが、 `0x00` のデータが消えてしまったのでjs側で配列にして返すように変更

## ソース

```python
import time
from selenium import webdriver

def save_binary(url, filepath):
	js = """
	var getBinaryResourceText = function(url) {
		var req = new XMLHttpRequest();
		req.open('GET', url, false);
		req.overrideMimeType('text/plain; charset=x-user-defined');
		req.send(null);
		if (req.status != 200) return '';

		var filestream = req.responseText;
		var bytes = [];
		for (var i = 0; i < filestream.length; i++){
			bytes[i] = filestream.charCodeAt(i) & 0xff;
		}

		return bytes;
	}
	"""
	js += "return getBinaryResourceText(\"{url}\");".format(url=url)

	data_bytes = driver.execute_script(js)
	with open(filepath, 'wb') as bin_out:
		bin_out.write(bytes(data_bytes))


capabilities = {
	'chromeOptions': {
		# 'androidPackage': 'com.android.chrome',
	}
}


# WebDriverを取得
driver = webdriver.Remote('http://localhost:9515', capabilities)

# Googleのページを表示
driver.get('https://www.google.co.jp/')

# Googleのロゴ画像を取得
image_url = "https://www.google.co.jp/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png"

# 画像を保存
save_binary(image_url, 'googlelogo.png')

driver.quit()
```


## 参考

* http://hi0a.com/demo/img-base64-datauri/