OmniAICreator/Qiita-1.07M huggingface dataset:
秋月電子 SHARP 6インチ高精細CGシリコン液晶パネルセットをMacで使う

# はじめに

秋月電子 SHARP 6インチ高精細CGシリコン液晶パネルセットをMacでも使用したいと思いHDMIケーブルをつないだところ、紫がかった画面になりました。

![スクリーンショット 2017-07-15 15.20.43.png](https://qiita-image-store.s3.amazonaws.com/0/191337/8bde184f-54ce-b701-97b8-6522ec71b06a.png)

# 使用環境
- macOS Sierra 10.12.5
- MacBook Pro (Retina, 15-inch, Late 2013)
- 2.6 GHz Intel Core i7
- 16 GB 1600 MHz DDR3

# 使用したい機材
- 秋月電子 SHARP 6インチ高精細CGシリコン液晶パネルセット　1440×2560ドット ラズパイ用
http://akizukidenshi.com/catalog/g/gM-11968/


# 原因

MacのHDMI出力の色空間がYCbCrとなっているのが問題。HDMIの出力をRGB（モニターの設定）に切り替えます。

# 処置

- SIPの無効化
- patch-edid.rbの入手と実行
- 設定ファイルをコピー
- 確認


## SIPの無効化

この辺りを参考に（自己責任にて）

https://www.igeeksblog.com/how-to-disable-system-integrity-protection-on-mac/

無効化の確認の方法は以下のとおり。

```
% csrutil status
System Integrity Protection status: disabled.
```

## 必要な設定

patch-edid.rbをダウンロードして実行

![スクリーンショット 2017-07-15 15.27.02.png](https://qiita-image-store.s3.amazonaws.com/0/191337/45e737b7-493d-eba4-658f-c606971cbab5.png)

https://embdev.net/topic/284710#3027030

ここでは、ホームディレクトリに保存

```
% cd ~
% ruby patch-edid.rb
% cd /System/Library/Displays/Contents/Resources/Overrides
% sudo mv ~/DisplayVendorID-3354 ./
```

## 再接続

HDMIケーブルを抜いて挿して問題ないことを確認。

この液晶パネルは、電源を入れてからしばらく待って（８秒くらい）映像を入力する必要があるようです。
（背面の緑色のLEDが点滅していれば大丈夫）

![スクリーンショット-2017-07-15-15.35.00.jpg](https://qiita-image-store.s3.amazonaws.com/0/191337/0fa1fc19-dbf6-4104-d460-3d40ccccc5c7.jpeg)


# おまけ

この液晶パネルのシリーズは、発売されて間もないためケースが用意されていません。

お店の方に確認したところ、7.9インチのケースは試作品を製作中で、6インチのケースは未定（6月中旬くらいに確認）とのことでしたので、アクリルパネルを加工して作成してみました。

illustratorにて図面を起こし、カインズ工房のレーザー加工サービスを利用して加工しました。
45分で作業可能でした。

仕上がりはこのような感じ、改善の余地はあるものの個人で使うには十分です。


レーザー加工機サービス
https://www.cainz.co.jp/diy_style/factory/

図面に興味がある方がおられましたら、その旨をカキコミ下さい。
アップロードを検討します。


![8L9A7521.jpg](https://qiita-image-store.s3.amazonaws.com/0/191337/66c21428-1f05-0c2f-e145-9d65e6529beb.jpeg)
前面の様子

![8L9A7519.jpg](https://qiita-image-store.s3.amazonaws.com/0/191337/b0d7cab9-9100-c1b7-f8a6-69f62b3a6188.jpeg)
背面はコチラ

![8L9A7525.jpg](https://qiita-image-store.s3.amazonaws.com/0/191337/68c66656-e7a7-f9f4-443b-69dd4800b778.jpeg)
ハードコートアクリルパネルを重ねて作製しております。
四隅は、アルバム用の留め金具を使用

6インチ液晶パネル自体に不満はないのですが、Raspberry Pi 3で使用する際にランドスケープが1920×1440となるのがイマイチ
ま、知った上で買ったのですが…
swagger-codegenのスタブ、クロスドメイン制約回避メモ

## はじめに
swagger-codegenでスタブを生成後、
実際に作ったアプリケーションからアクセスをすると、
クロスドメインでエラーになるため、回避した方法をメモとして残します！

## ステップ①
seriverディレクトリ内でcorsをインストールする
$ npm install cors


## ステップ②
seriver配下にあるindex.jsに以下を追加する
＜追加前＞
var app = require('connect')();

＜追加後＞
var app = require('connect')();
var cors = require('cors');
app.use(cors());
dockerを触ってみた

dockerを勉強する機会があったので、dockerを触る上での最低限の知識をまとめておきます。
個人的な解釈もあるので、間違っているとこがありましたらご指摘ください。


## インストール
macの方はこちらから
https://docs.docker.com/docker-for-mac/install/

### 実行環境
```
$ docker --version
Docker version 17.06.0-ce, build 02c1d87
```

## dockerイメージのダウンロード
`$ docker pull centos:7`
centosのバージョン7のイメージをダウンロードできます。
`:` の後ろに来るのはdockerではタグと呼ばれるもので、ここでバージョンを指定します。
省略した場合は最新(latest)が取得できます。

`$ docker images`
イメージの一覧をみることができます。

```
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 36540f359ca3 9 days ago 193MB
```

## イメージからコンテナを生成して起動する
```
$ docker run -it centos:7 /bin/bash
[root@a177acecd962 /]#
```

コンテナが立ち上がり、コンテナ内でシェルを実行することができます。(/bin/bash がコンテナ内で実行されるため)
コンテナを抜けるには、`ctrl + d` です。

## バックグラウンドでコンテナを動かす
`$ docker run -d centos:7 /ibn/ping localhost`

`$ docker ps` でコンテナを確認します。

```
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a37d030ac72 centos:7 "/bin/ping localhost" 3 seconds ago  Up 2 seconds  fervent_austin
```
コンテナがバックグラウンドで起動していることが確認できます。
オプションに`-d`を指定することで、バックグラウンドで実行することができます。

コンテナ内のログを確認するときは、

```
$ docker logs -t 6a37d030ac72
2017-07-15T05:43:50.442249180Z 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.035 ms
2017-07-15T05:43:51.456915700Z 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.046 ms
2017-07-15T05:43:52.492816131Z 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.046 ms
~
```
`docker logs`コマンドで確認できます。

## コンテナを起動したり停止したり

コンテナの起動
`$ docker start オプション コンテナID`

コンテナの停止
`$ docker stop オプション コンテナID`

コンテナの再起動
`$ docker restart オプション コンテナID`

コンテナの削除
`$ docker rm コンテナID`

イメージの削除
`$ docker rmi イメージID`

稼働コンテナへの接続
`$ docker attach コンテナID`

稼働コンテナで別プロセスを実行
`$ docker exec コンテナID 実行コマンド`
例えば、別プロセスでシェルを起動したかった場合は
`$ docker exec -it コンテナID /bin/bash`


## おまけ
コンテナは起動プロセスがなくなると、コンテナ自体が閉じてしまうようなので、
使い終わった後のコンテナは削除したいときは
`$ docker run --rm centos:7 /bin/bash`
のように`--rm`オプションをつけることで、コンテナを自動で削除してくれるようになります。
ssh するときにログイン先環境を区別しやすくする

ログイン先を間違えると大惨事になる。
開発環境にログインしたとつもりで、本番のファイルを消してしまった……なんて目も当てられない。

なので、SSH ログインするときはログイン先に注意して `ssh xxx-stg-hoge` とか `ssh xxx-PRODUCTION-hoge` とか打つんだけど、それでもまだまだ怖い。

よくある対策として /etc/motd に figlet などで生成したテキストを置いておき、ログイン時にターミナルに表示させるやり方がある。
これは誰がログインしても表示されるので、ベストな方法だと思う。
似たようなやり方で .bashrc に表示コマンドを書くやり方もある。

しかし、諸般の事情（ルートになれないとか共通ユーザー使っているとか）でそれらのファイルを触れない場合の対策として何かないかと探していたところ、~/.ssh/config の `LocalCommand` を使えば表示できそうだとわかった。

```
Host xxx-stg-hoge
    HostName           xxx.stage.example.com
    PermitLocalCommand yes
    LocalCommand       printf '\e[1;7;33m         %%s         \e[0m\n' '検証'
Host xxx-PRODUCTION-hoge
    HostName           xxx.example.com
    PermitLocalCommand yes
    LocalCommand       printf '\e[1;7;31m         %%s         \e[0m\n' '本番'
```

これでログイン時に背景色付きラベル表示で警告がされる。
わかりやすくなった。
Access VBA TIPS テーブルの削除 主キー列 チェックボックス ファイルの共有ロック数

#テーブルの削除
既存のテーブルを削除して新たなテーブルをコピーするとき
***Docmd.DeleteObject***を使う。

```vbnet
Db.tabledefs.delete "tablename"
```
で削除して

```vbnet
DoCmd.CopyObject , "tablename", acTable, "copysourcetable": DoEvents
Set tdf = db.tabledefs("tablename")
```
としようとしても、画面上はテーブルができても、テーブルがないことになるためエラーが起きる。
次のVBAを実行すると確認できる。


```vbnet
For each tdf in db.tabledefs
Debug.print tdf
Next

```

としてもテーブル：tablename表示されない。「このコレクションには項目がありません」のエラーが出る　Windows10 Access2013 32Bitで確認 画面上でテーブルができているのに、テーブルの一覧を出力しても表示されない場合はこのエラーが起きている。

##正しいテーブルの削除方法

```vbnet
Const TgTn = "TargetTableName"
Dim db As Database : Set db = CurrentDb
Dim tdfNew As TableDefs
For Each tdfnew In db.TableDefs
If ExistTable(TgTN) Then
DoCmd.DeleteObject acTable, TgTN
Application.RefreshDatabaseWindow: DoEvents
Set tdfnew = Nothing
Exit For
End If
Next
```
これでもエラーになるばあいがある。

#テーブルに主キーの列を追加するVBA
##注意点
 - 他に主キーが存在していないことが前提
 - この記事ではフィールド名をIDとしているが、かつて一度もIDという名前の主キー列を作ったことがないことが前提。
 - テーブルをコピーするなどしない限り、一度作った主キー列の名前は使うことができない。
[ACCESSで1列目にオートナンバー型フィールドを追加する方法]( https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1251808802)
'DoCmd.OpenTable MyTABLE, acDesign
DoCmd.OpenTable MyTABLE, acViewDesign
DoCmd.Save acTable, MyTABLE
DoCmd.Close acTable, MyTABLE


 - 主キーをこのQAの後ろに次を1行が必要（テーブルに主キーがないことが前提）
 - Databaseobject.Execute "Create Index idx_tablename ON tablename (ID) WITH PRIMARY;"
 - QAのDoCmd.OpenTable MyTABLE, acDesign は誤り
 
#Accessのテーブルにチェックボックス列(Yes/No)を追加
Yes/No True Falseのデータタイプならチェックボックスにかえられます。
変数は冒頭で宣言し、セットしておいてよい。
例えば Dim Db As database : Set db=CurrentDbと以下の行は並立する
Dim daoDB As DAO.Database: Set daoDB = CurrentDb 'この行からはCheckbox列を追加するための変数宣言
チェックボックスになるのはDisPlayContorolのプロパティになる
以下、データベースを作ってフィールドを追加し、つぎのようになっていきます。

```vbnet
Dim daoDB As DAO.Database: Set daoDB = CurrentDb 'この行からはCheckbox列を追加するための変数宣言
Set daotdf = daoDB.TableDefs!tablename 'daoでテーブルを指定する。
daofldName = "F18CheckBox"　'フィールド名
Set daoFld = daotdf.CreateField(daofldName, dbBoolean) 'Fldオブジェクトを作成して
daotdf.Fields.Append(daoFld) 'Fテーブルに追加
daoFld.Properties.Append(daoFld.CreateProperty("DisplayControl", dbInteger, acCheckBox, True))
```

[Yes/No型のフィールドの表示コントロール[DisplayControl]の変更について - AccessClub](http://www.accessclub.jp/bbs2/0016/beginter05378.html)

#ファイルの共有ロック数
[ファイルの共有ロック数が制限を超えています (Error 3052)レジストリエントリMaxLockPerFileの値を増やして下さい。(#-2147217887)]( http://access-cloud.hatenablog.com/entry/vba)
Transactionをしていなければ40000くらいは伸ばせるようだ
DAO.DBEngine.SetOption dbmaxlocksperfile,15000
元はDAO3.6を参照設定だがこの書き方は使えない。以下のように書くしかないようだ

```vbnet
Application.DBEngine.SetOption dbMaxLocksPerFile, 40000
```
[アクセス2010　エラー3052]( https://answers.microsoft.com/ja-jp/msoffice/forum/msoffice_access-mso_windows8/%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B92010/8ce35684-5b3e-41ce-bafd-1a3075932370)
>多数のトランザクション処理中にエラー メッセージ "ファイルの共有ロック数が制限を超えています" が表示される
2003が対象ですが、~~2010~~2016でも有効です。
MW WP Formプラグインで管理者宛メールとデータベースにフォーム送信者情報を追加してみる

Wordpressの[MW WP Formプラグイン](https://ja.wordpress.org/plugins/mw-wp-form/)で、管理者宛メールとデータベースにフォーム送信者情報（IPとかユーザーエージェントなど）を追加するフィルターフックのやり方。
#手順

1. テーマ内のfunction.phpにフィルターフックを追加する。mwform_custom_mail_tag_mw-wp-form-xxxにフィルターフックをかける。
2. MW WP Formプラグインの「フォームを編集」から、追加したキーを管理者宛メール設定の「本文」に入れる。
3. 「問い合わせデータをデータベースに保存」にチェックする。

##mwform_custom_mail_tag_mw-wp-form-xxxのフィルターフック
※ 詳しくは公式サイトのドキュメントを参照: 
[mwform_custom_mail_tag_mw-wp-form-xxx | MW WP Form](https://plugins.2inc.org/mw-wp-form/filter-hook/mwform_custom_mail_tag_mw-wp-form-xxx/)

要するに、オリジナルの「メールタグ」として、送信者のユーザーエージェント、IP、ホストなどを定義してしまえば良いということです。

```php:
/**
 * {user_agent} UAに変換
 * {ip} IPに変換
 * {host} HOSTに変換
 * {send_datetime} 送信日時に変換
 * 
 * @param string $value 送信された値
 * @param string $key メールタグ
 * @param int $insert_contact_data_id データベースに保存した場合、そのときの Post ID
 */
function add_sender_info( $value, $key, $insert_contact_data_id ) {

    if ( $key === 'user_agent' ) {
		return $_SERVER["HTTP_USER_AGENT"];
    }
    if ( $key === 'ip' ) {
		$ip = $_SERVER["REMOTE_ADDR"];
		return $ip;
    }
    if ( $key === 'host' ) {
		$host = gethostbyaddr($_SERVER["REMOTE_ADDR"]);
		return $host;
    }
    if ( $key === 'send_datetime' ) {
		$org_timezone = date_default_timezone_get();
		date_default_timezone_set('Asia/Tokyo'); //タイムゾーンを日本に
		$Datetime = date("Y年n月j日 H:i:s");
		date_default_timezone_set($org_timezone); //タイムゾーン戻す
        return $Datetime;
    }

    return $value;
}

add_filter( 'mwform_custom_mail_tag_mw-wp-form-xxx', 'add_sender_info', 10, 3 );

```

「フォームを編集」から、管理者宛メール設定で本文に追加したキーを入力し、「問い合わせデータをデータベースに保存」にチェックする。

![screenshot-stg.utsude.com 2017-07-15 13-59-15.png](https://qiita-image-store.s3.amazonaws.com/0/11198/8ce8abb2-563f-59d9-70d8-7727dc3579fd.png)

これで、管理者宛メールに送信者情報が入り、かつデータベースに保存時にも送信者情報として各項目が追加されるようになります。
cでバイナリ一部書き換え

```c
#include <stdio.h>

typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned long ulong;


ulong readBin(ulong s, char fname[]){
	FILE *fp;
	uchar p_temp_data;
	ushort ret;

	fp=fopen(fname, "rb");

	while(s--){
		p_temp_data=getc(fp);
		printf("0x%x\t", p_temp_data);
	}

	ret=(ushort)0x12345678;

	fclose(fp);

	return ret;
}

void rewriteBin(ushort crc,char fname[]){
	uchar address=0x1c;
	FILE *fp;

	fp=fopen(fname,"rb+");

	fseek(fp,address,SEEK_SET);
	fwrite(&crc, sizeof(crc),1,fp);
	fclose(fp);
}

int main(void){
	ushort crc=0;
	char fname[]="bf_bak.bin";
	char newfname[]="bf.bin";
	crc=readBin(0x1c,fname);
	printf("\n\n");
	rewriteBin(crc,newfname);

	//確認用
	crc=readBin(0x20,newfname);
	printf("\n");
	return 0;
}
```
備忘録_anyenv


##anyenv

###インストール

[GitHubページ](https://github.com/riywo/anyenv)をどうぞ

```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(anyenv init -)"' >> ~/.zshrc
$ exec $SHELL -l
```

※私は、.zshrcに記述したけどご自身の環境に合わせて記述してください

###コマンド系

その他の、env系をインストール
※私が使うものしか入っていない。もっとインストールできるので公式を確認してください

```
$ anyenv install rbenv //=> ruby管理
$ anyenv install ndenv //=> node管理
$ anyenv install pyenv //=> python管理
$ exec $SHELL -l
```

各バージョンインストール

```
$ ndenv install <インストールしたいバージョン>
$ pyenv install <インストールしたいバージョン>
$ rbenv install <インストールしたいバージョン>
```

バージョン確認したい場合

```
$ anyenv versions
```

##~~env

バージョン確認

```
$ <対象のenv> -v 
```

現在使用しているバージョン確認

```
$ <対象のenv> version 
```

インストール済みのバージョンを確認

```
$ <対象のenv> versions
```

グローバルで使用するバージョンを指定

```
$ <対象のenv> global <バージョン>
```

カレントディレクトリのみで使用するバージョンを指定

```
$ <対象のenv> local <バージョン>
```

インストール可能なバージョンを確認

```
$ <対象のenv> install -l
```

指定したバージョンをインストール

```
$ <対象のenv> install <バージョン>
```

##rehashコマンド

バージョンを変えたら最後に下記のコマンドを実行

```
$ <対象のenv> rehash
```
pythonパッケージを一般ユーザーでローカル環境にインストールする方法

管理者権限(root)はないけど、ローカル環境にpythonのパッケージをインストールする。

以下の素環境で確認した。

```bash
$ docker run  --rm -i -t docker.io/centos:7.3.1611 /bin/bash
```

```bash
//pythonは入っているが、pipコマンドはない。
$ python -V
Python 2.7.5
$ pip
-bash: pip: command not found

// まずはpipコマンドを準備する
$ curl -O https://bootstrap.pypa.io/get-pip.py
$ python get-pip.py --user

// 上記コマンドを実行すると、.localにインストール＋パスが追加される
$ ll ~/.local/bin/pip
-rwxrwxr-x 1 ymko ymko 201 Jul 15 03:58 /home/ymko/.local/bin/pip
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ymko/.local/bin:/home/ymko/bin

// ログオフすると消えるので追加しておく
$ echo "export PATH=$HOME/.local/bin:\$PATH" >> ~/.bashrc

// そのままインストールしようとするとシステム領域で書き込めないエラー
$ pip install bottle
IOError: [Errno 13] Permission denied: '/usr/lib/python2.7/site-packages/bottle.pyc'

// --userで自分のローカルにインストールする
$ pip install bottle --user
Collecting bottle
Installing collected packages: bottle
Successfully installed bottle-0.12.13

// モジュール検索パスにも.localのものが含まれている
$ python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(sys.path)
['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload', '/home/ymko/.local/lib/python2.7/site-packages', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages']
```

# 毎回面倒なのでスクリプトにした

```bash:pip_user_install.sh
#!/bin/bash

curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py --user
grep .local/bin ~/.bashrc
if [ $? != 0 ]; then
    echo "export PATH=$HOME/.local/bin:\$PATH" >> ~/.bashrc
fi
```

# こちらも参考に

[オフライン環境にpythonパッケージをインストールする \- Qiita](http://qiita.com/ymko/items/7129c2297e027ae11a24)
WebStorm/PhpStormでCSSを書くのがちょっと楽になるかもしれないTips

## ⌘B(ctrl+B)でCSSの定義箇所にジャンプする

HTMLのクラスにカーソルを当てた状態で`⌘B(ctrl+B)`でクラスに適用されているCSSがどの箇所にあるのか表示することができます。

例えば、`class="header"`にカーソルを当てた状態で実行すると、その定義箇所が`.c .header /path/to/style.scss: 100`のような形式で、ファイル名と行数を表示してくれます。複数候補がある場合は矢印キーで移動してエンターを押すことで該当の箇所が開きます。対象のファイルを開いているかによって挙動が少し変わるので要注意です。

- 対象のファイルがタブ上にある場合 => ファイルを表示して、該当する行まで移動します。
- 対象のファイルがタブ上にない場合　=> ファイルを開いて、該当する行まで移動します。  
- 対象のファイルが複数開かれている場合 => 直近で選択していたファイル側のタブで、ファイルを表示して該当する行まで移動します。

## BEMを&__Element、&--modifierにしない

Sassを使う場合、BEMを以下のように書くことができますが、上記の`⌘B(ctrl+B)`が効かなくなるので、&で連結せずに書く方がコーディングしやすいです。

```scss
.block {
  // block style

  &__element {
    // element style

    &--modifier {
      // modifier style
    }
  }
}
```

## Sassで変数をネストしない
Sassの`map-get`関数を使うと、ネストされた変数を利用できますが、下記のように書くと`$text-color`は補完されますが、`black`は補完されません。`map-get`を使うたびに定義を見に行くのは面倒なので、変数はネストしない方がちょっと楽です。（`map-get`を使っても色はきちんと表示されます。）

```scss
$text-color: (
  black: #333
);
@debug map-get($text-color, black); // #333
```

## package.jsonを右クリックしてタスクリストを表示・実行する

`package.json`, `gulpfile.js`, `Gruntfile.js`は右クリックすると`show npm Scripts（package.jsonの場合）`が表示され、クリックすると、タスク一覧を確認することができます。また、タスクが選択されている状態でエンター、もしくはタスクをダブルクリックするとRunペイン（`⌘4(ctrl+4)）で実行されます。コマンドを打つときにタスク名を確認する必要がなくなるので少し楽になります。

## 参考
[Markup Languages and Style Sheets](https://www.jetbrains.com/help/phpstorm/markup-languages-and-style-sheets.html)
クラシック UI のリボンのグループやボタンを非表示にする

※この記事書いてから気が付きましたが、もっと参考になるご本家の記事がありましたねｗ
https://blogs.technet.microsoft.com/sharepoint_support/2014/08/14/sharepoint-css/


SharePoint の画面についているリボンの任意のグループ、ボタンを非表示にする方法です。
スタイルシートだけで対応できるので手軽です。
なお、この方法は下図のようなクラシック UI のリボンにのみ対応しています。
![ribbon.png](https://qiita-image-store.s3.amazonaws.com/0/76139/c14b50dd-f15b-55d5-f1ec-2714ca5b7fba.png)

# ボタン非表示
例えば、[ライブラリ]>[接続とエクスポート]>[エクスプローラーで開く] を非表示にすると、下図のようになります。
![ribbon3.png](https://qiita-image-store.s3.amazonaws.com/0/76139/481463cd-c329-251d-ca43-390c582bd08e.png)

# グループ非表示
グループそのものを消すこともできます。
[ライブラリ]>[接続とエクスポート] のグループを非表示にしてみました。
分かりづらいので、一番上の画像と比べてください。
![ribbon4.png](https://qiita-image-store.s3.amazonaws.com/0/76139/5b759cf5-5ea2-ebea-bb5c-1e18859c5994.png)

# 対応方法
では、対応方法です。
リボンのグループやボタンは一つずつに HTML の ID 属性が指定されています。
例えば、ドキュメントライブラリのリボンにある、[ライブラリ]>[接続とエクスポート]>[エクスプローラーで開く]を消したい場合、以下のスタイルを定義することで、非表示にできます。

```text:hide.css
#Ribbon\.Library\.Actions\.OpenWithExplorer-Medium {
  display: none;
}
```

上記の CSS ファイルを任意のドキュメントライブラリに保存し、リボンを非表示にしたいページで CSS を読み込みます。
なお、任意の CSS をサイト全体に渡って読み込ませる場合は、代替 CSS を使うのが手軽です。
代替 CSS は、[サイトの設定]>[マスターページ]にて指定可能です。

![ribbon2.png](https://qiita-image-store.s3.amazonaws.com/0/76139/b4eefec7-78df-31c4-776d-4e0742a1f915.png)

# リボンのグループ、ボタンの ID の調べ方
リボンのグループやボタンを非表示にする場合、前述の通り非表示対象の ID を指定する必要があります。
ID は HTML の中に書かれているので、ブラウザの開発者ツール (F12 ツール) を使って確認します。
F12 ツールにて、非表示にしたいリボンのグループ、ボタンをクリックしてソースを表示すると、下図のようなソースが表示されます。
下図は、[接続とエクスポート] をクリックした際のソースです。
黄色のマーカーで線を引いた部分が、リボングループ、ボタンの ID 属性になりますので、これをコピーして、CSS のセレクタとし、「.」の前に「\」を付けて、display:none にするだけです。
ポイントは ID に「.」が含まれているので、これをエスケープするために「.」の前に「\」を付けるところです。

![ribbon5.png](https://qiita-image-store.s3.amazonaws.com/0/76139/a39a5056-0295-04ae-7d6f-40174f99d342.png)
[Facebook Graph API]無期限のアクセストークンの取得方法

フェイスブックのパスワード変更したら、かつて取得したアクセストークンがダメになってしまい、再取得しようとしたら、ハマってしまいました(泣き)。そもそも元のアクセストークンの取得の時も四苦八苦したので、個人的メモとして。

## アプリの認証
```
https://www.facebook.com/dialog/oauth?client_id={アプリID}&redirect_uri={サイトURL}
 ```

* client_idは、ダッシュボードに記載のアプリID
* redirect_uriは、設定>ベーシックのウェブページに記載のサイトURL
    * ただし、Facebookログインの有効なOAuthリダイレクトURIにドメインを登録
上記設定は→[facebook for developers](https://developers.facebook.com/)より

ブラウザで上記URLにアクセスすると、redirect_uriに飛ばされます。上のurlのクエリ部分に**code=XXXXX**との記載があり、それが、認証コードになります。

## （ユーザー）アクセストークンの取得
```
https://graph.facebook.com/oauth/access_token?client_id={アプリID}&redirect_uri={サイトURL} &client_secret={app secret}&code={XXXXX}
```

* client_secretは、ダッシュボード記載のapp secret
* codeは、アプリの認証で取得したXXXXXになります

再びブラウザでアクセスすると、
```
{"access_token":"YYYYYY","token_type":"bearer"}
```
が返ってきます。
** "access_token":"YYYYYY"**が（ユーザー）アクセストークンになります。

## ページのアクセストークンの取得
```
https://graph.facebook.com/me/accounts?access_token={YYYYYY}
```
上記にアクセスすると、下記のような管理するFacebookページの一覧が返されます。

```
{
   "data": [
      {
         "access_token": "ZZZZZ",
         "category": "hogehoge",
         "name": "hogehoge",
         "id": "11111111111111111",
         "perms": [
            "EDIT_PROFILE",
            "CREATE_CONTENT",
            "MODERATE_CONTENT",
            "CREATE_ADS",
            "BASIC_ADMIN"
         ]
      }
   ],
   "paging": {
      "cursors": {
         "before": "munyamunya",
         "after": "suyasuya"
      }
   }
}
```

**"access_token": "ZZZZZ"**が、ページのアクセストークンになります。

## 有効期限を確認
[アクセストークンデバッガー](https://developers.facebook.com/tools/debug/accesstoken/)の、「アクセストークン」というタブを開き、上記取得のアクセストークンを貼り付け→デバッグを押すと、アクセストークン情報が表示されます。**有効期限が「受け取らない」**となっていれば、成功です。

## 参考サイト
* [無期限 Facebookアクセストークンの取得方法](http://qiita.com/dogyear/items/e4de999971fbf7231496)
* [Facebook API: 有効期限の長い Access Token を取得する](https://gist.github.com/xl1/fe779a817a9d4938193d)
* [自動投稿のためのFacebookアクセストークンを取得する](https://kantaro-cgi.com/blog/external-service/get_facebook_token.html)
* [アクセストークン|facebook for developpers](https://developers.facebook.com/docs/facebook-login/access-tokens)
terminalでシンボリックリンクのはりかた(BackUpファイルなどを外付けHDDに指定する方法)

## 概要
Mac Book Airなど容量が少ないノートを利用している人向け
iTunesなどの楽曲データや、iPhoneのバックアップデータなど、容量が多いデータを外付けHDDに保存するようにする方法

## terminal でシンボリックリンクをはる
以下2点はあなたの環境名に置き換えて実行してください。

- {{外付けハードディスク名}}
- {{ユーザー名}}

### e.g. iPhoneのバックアップファイルを外付けHDDに指定する場合
```
ln -s /Volumes/{{外付けハードディスク名}}/MobileSync/Backup /Users/{{ユーザー名}}/Library/Application\ Support/MobileSync/Backup 
```

* 上記コマンドを打つ際一番最後の`Backup`はフォルダとして作成してない状態で実行しましょう
amp

メモ
http://akizukidenshi.com/catalog/g/gK-08161/
http://ecaps.exblog.jp/23269534/
http://ecaps.exblog.jp/23404304/
http://akizukidenshi.com/catalog/g/gP-08148/
http://akizukidenshi.com/catalog/g/gP-03967/
http://akizukidenshi.com/catalog/g/gP-08326/
http://blog.livedoor.jp/ekousaku/archives/4476855.html
http://livedoor.blogimg.jp/ekousaku/imgs/1/e/1ef97c41.png
Lチカ with digispark(arduino互換) on mac osx10.11

HiLetgo Digispark Kickstarter ATTINY85 Digispark 超小型Arduino互換
1コ 220円
http://amzn.asia/eCgtpDH
を購入したのでLチカしました. 

amazonではHiLetgoという中国の会社が取り扱っているみたいですが, 
モノとしてはdigistumpというところのdigisparkというものらしいです. 
ATtiny85
http://www.microchip.com/wwwproducts/en/ATtiny85
というものをつかってるそうで, 回路は公開されているそうなので, 
他の会社が安くコピー品を出しているという状況のようです. 

基本的にはArduino likeに開発ができるようでこの小ささは魅力です. 
(8pino:https://www.switch-science.com/catalog/2108/
の方が小さそうですが, こちらは販売店が見つからなかったので...)

arduino IDEが使えますが, 初めての使用には少し準備が必要だったり, 勝手が違うところがあったので記録として書かせていただきます. 

大まかには

+ arduino IDEにdigispark用のアドオン(?)をインストールする必要がある
+ USB3.0だとダメかも? USB2.0の延長ケーブルを噛ませて使用するとうまく書き込めました
+ compile後, hardに書き込むときは, 「hardwareを抜いた状態で待機」 > 「hardwareに書き込みボタンを押す」 > 「最大60秒のhardware認識待ち状態になる」 > 「hardwareを差す」 > 「書き込みができる」 > 「完了」という流れ. 

です. 

# 参考
こちらを参考にさせていただきました. 
http://digistump.com/wiki/digispark/tutorials/connecting
http://shokai.org/blog/archives/8665
https://github.com/digistump/DigistumpArduino/issues/41

# 環境
- mac osx 10.11.6 elcapitan
- MacBook Pro (Retina 13-inch、Early 2015)
- digispark: http://amzn.asia/eCgtpDH
- aruduino IDE 1.6.5(1.6.5+を推奨しているみたいですが, 他のver.でも大丈夫そうです. addonのインストールは1.6.1でやりました)

# 準備
## addonのインストール
http://digistump.com/wiki/digispark/tutorials/connecting
を参考に
`file` > `preference` > `Additional Boards Manager URLs`に
`http://digistump.com/package_digistump_index.json`を追加して, 
`Digistump AVR Boards`をinstallする

## arduino IDEの設定
- `ツール` > `ボード` を `Digispark (Default - 16.5mhz)` に設定する
- `ポート`は未指定の状態にする
- `書込装置`は`AVRISP mkII`に設定する(aruduino unoのときから変わってない)

# 書き込み
PCによってはUSB3.0だとダメかもしれません. 私(mac)は右側のUSBポートにUSB2.0の延長ケーブルを噛ませて使用するとうまく書き込めました. 

書き込み手順: 
- `検証`でcode自体が通るものであることを確認しておく
- hardwareを抜いた状態で待機
- `マイコンボードに書き込む`ボタンを押す
- 最大60秒のhardware認識待ち状態になる
- hardwareを差す
- 書き込みができる
- 完了!!
です. 

# codes & results 
http://shokai.org/blog/archives/8665
の方のものを参考にしたdigispark自体についているLEDを点灯するcodes 2つと, 
自分よく試す, pinで外のLEDを光らせるcodeです. 

## digispark自体のLEDのLチカ(blink)

```digispark自体のLEDのLチカ(blink).
bool led_stat = false;

void setup(){
  pinMode(0, true);
  pinMode(1, true);
}

void loop(){
  digitalWrite(0, led_stat);
  digitalWrite(1, !led_stat);
  led_stat = !led_stat;
  delay(500);
}
```

https://youtu.be/mt00UEgmMPw

## digispark自体のLEDのLチカ(fade)

```digispark自体のLEDのLチカ(fade).
void setup(){
}

void loop(){
  for(char i = 0; i < 26; i++){
    analogWrite(0, i*10);
    analogWrite(1, i*10);
    delay(20);
  }
  for(char i = 25; i > 0; i--){
    analogWrite(0, i*10);
    analogWrite(1, i*10);
    delay(20);
  }
}
```

https://youtu.be/rUTGhtFgdqQ

## 外部LEDのLチカ

```外部LEDのLチカ.
const int ledPin = 2; 

void setup() {
 pinMode(ledPin, OUTPUT);
}

void loop(){
 digitalWrite(ledPin, HIGH);
 delay(1000);
 digitalWrite(ledPin, LOW);
 delay(1000);
}
```

![IMG_4491.jpg](https://qiita-image-store.s3.amazonaws.com/0/102253/3c35cf06-807d-b674-2636-1cff65afd5a6.jpeg)

https://youtu.be/ZXsrJFSoGlY
if文の誤解

　if 文について勘違いしている人をちらほらと見かけるので。

# if 文とは
　ほとんどのプログラミング言語で同じはずですが、例えば C++ なら、

```cpp
  if( 条件式 ) {}
```
というように考えていませんか？　これは間違いで、実際には

```cpp
  if( 真または偽 ) {}
```
です。
　ですので、if 文には true か false のどちらかを与える、というのが「基本的な」考え方です。(※言語によって if() 内には様々な書き方が許されますが、最終的には真または偽として解釈されます。)
　そして、if 文は引数が「真」の時に、{} 内の処理を実行する、という構文なのです。


# 条件式とは
　if 文の中に条件式を書く場合、「==」や「<=」といった比較演算子で条件を書くことが多いと思います。
　この比較演算子は「演算子」という名前の通り、与えられた条件で演算するもので、結果を true か false で返します。
　ですから、例えば

```cpp
int a = 0;
if( a == 0 ) {}
```
これは次のように書き換えることができます。

```cpp
int a = 0;
bool is_zero = (a == 0);
if( is_zero ) {}
```

<del>　bool 型でないものが渡された場合、自動的に bool 型に変換してしまう言語もあるため、if() に渡される値が bool であるという認識をされていない方もいるのではないかと思います。
　数値型が渡された場合、0 以外なら true、0 なら false に自動的に変換されます。
　ポインタ型なら、NULL 以外なら true、NULL なら false に変換されます。
　C++ で operator bool() 関数をメンバに持つクラスが渡されたなら、この operator bool() 関数が呼ばれます。</del>
※語弊がありそうなので削除しました。(2017/07/16)

# だから何なのか？

自分がよく見かけるのは、以下のようなコード

```cpp
bool is_zero( int a ) { return a == 0; }

void foo()
{
  int a = 0;
  if( is_zero(a) == true ) {}
}
```
is_zero() という関数が if 文にそのまま渡せるように bool 値を返しているにも関わらず、さらに true と比較している、というのが無駄です。これはシンプルに

```cpp
  if( is_zero(a) ) {}
```
と書くべきです。否定なら

```cpp
  if( !is_zero(a) ) {}
```
と書けばいいわけです。
Mapbox iOS SDK プロジェクト初期化メモ


詳しくは下記に書いてある。

> [First steps with the Mapbox iOS SDK | Mapbox](https://www.mapbox.com/help/first-steps-ios-sdk/)

以下、xcodeでSingle View Applicationを作成したとして説明。

# Mapboxの導入

1. [Mapbox iOS SDK oveview](https://www.mapbox.com/ios-sdk/)のページから、SDKをダウンロード。(dynamic framework releaseの部分がzipファイルへのリンクになっている)
2. zipファイルの中のMapbox.frameworkファイルをEmbedded Binariesにドラッグ&ドロップ。

![スクリーンショット 2017-07-15 8.48.38.png](https://qiita-image-store.s3.amazonaws.com/0/34579/90af4afa-5379-4340-80bf-553f74558fbb.png "スクリーンショット 2017-07-15 8.48.38.png")


# info.plistへキー追加

以下４つを追加。

| キー | 型 | 値 |
|-----|----|----|
| MGLMapboxAccessToken | String | MapboxのAccessToken |
| MGLMapboxMetricsEnabledSettingShownInApp | Boolean | YES |
| Privacy - Location Always Usage Description | String | Shows your location on the map and helps improve OpenStreetMap. |
| Privacy - Location When In Use Usage Description | String | Shows your location on the map and helps improve OpenStreetMap. |


# Main.storyboard 編集

1. ViewControllerのViewを選択する。
2. Custom ClasswをMGLMapViewに変更する。
![スクリーンショット 2017-07-15 9.04.46.png](https://qiita-image-store.s3.amazonaws.com/0/34579/ac9c267c-60de-258c-d985-252fbe3ce0e6.png "スクリーンショット 2017-07-15 9.04.46.png")

3. MapViewのプロパティを設定する。
![スクリーンショット_2017-07-15_9_05_57.png](https://qiita-image-store.s3.amazonaws.com/0/34579/95f7b5df-4a0e-da18-73ab-49d5023dc700.png "スクリーンショット_2017-07-15_9_05_57.png")

# コード編集
- import Mapbox追加
- MGLMapViewDelegate追加
- storyboardのviewをViewControllerに接続。
- `mapView.attributionButton.isHidden = true`を追加。
  - こうすると、mapの右下の i アイコンが非表示になる。

```swift
import UIKit
import Mapbox

class ViewController: UIViewController, MGLMapViewDelegate {
    @IBOutlet var mapView: MGLMapView!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        mapView.attributionButton.isHidden = true
    }
    
    :
}
```


以上でビルドすると、現在地とともに地図が表示される。
クラウドサーバでTensorFlow　その9

#概要
クラウドサーバでTensorFlowやってみた。
learning_rateを、global_stepで変化するやつ。

#環境
クラウド idcf
linux debian-8.11
tensorflow 1.2
gpu 無し

#サンプルコード

```
import os
import tensorflow as tf

global_step = tf.Variable(0, trainable = False)
learning_rate = tf.train.exponential_decay(0.1, global_step, 40, 0.01, staircase = True)
saver = tf.train.Saver()
with tf.Session() as sess:
	tf.global_variables_initializer().run()
	ckpt = tf.train.get_checkpoint_state(os.getcwd())
	if ckpt:
		print ("restore")
		saver.restore(sess, ckpt.model_checkpoint_path)
		step = global_step.eval()
	else:
		step = 0
	print (learning_rate.eval())
	for i in range(6):
		print (step + i)
	global_step.assign(step + i).eval()
	saver.save(sess, os.getcwd() + "/global_step3.ckpt")


```
Rails validation errorならぬvalidation warning

# 背景
仕事でvalidation warning的なものがほしいと思った。rails自体に答えを見つからなかったので、stack overflowを中心に少し調べてみた。

railsのvalidationはvalid?/invalid?の実行時あるいはインスタンスがセーブされた時にトリガーされるっぽい[(Rails Guide)](https://railsguides.jp/active_record_validations.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%A6%82%E8%A6%81-errors)。validationが失敗した場合レコードをdbに保存することを止めてくれる。

今回の場合レコードをdbに保存するとともにwarningだけユーザー側へ返してほしいので、Activemodel::Errorsとにたような形でwarningにできないかを考えている。

# 注意
- 調べた結果が全般的に古そうなイメージがあり。何か僕の知らない一般的なやり方がすでにある、あるいは自分の考えがレアケースであり、コンベンションにそぐわないかもしれん。
- 細かく試してないのでとりあえずざっと行けそうなものをまとめてみた感じである

# 具体的にほしいと思う場面
- データ自体は無効ではないが、注意喚起をしたい場合。例：名前は全部大文字でよいのかとか。
- has_many associationの子を複数追加する時に一部だけ無効であり、有効なものを保存し、無効な数や原因を親に保存したいとか。

# 解消案
- そもそもできればクライアントサイドでそういうvalidationを解決する。サーバーサイドは最重要なvalidationのみ入れる。(*1)
    - 問題点としてdb問い合わせが必要なvalidationも存在するので、クライアントサイドで全部解決できるわけではない。例えば：ユーザーが着信拒否をしているかを調べるとか
- use [validation_scopes gem](https://github.com/gtd/validation_scopes)(*2)
    - 問題点としてはwarningに使うvalidationはprivate methodを認識しないってところかな。別のvalidation classを用意すれば行けるのかな？
- WarningクラスをつくてActivemodelに追加する(※3)
    - 問題点としてはActicemodelに追加するのは影響範囲が広すぎる気がするところ。でも多分部分的に追加するなどをやれば行けそうな気もする。

# ちなみに
自分は最初save済みのインスタンスの.errorsに"warning"をaddすることをしていたが、こちらはvalid?に消されることに気づいた。なぜならvalid?が実際にやっているのは↓からだ。

```
errors.clear
run_validations!
```

なるほど、勉強になった。

# 情報ソース
*1 [Soft Validation](https://www.ruby-forum.com/topic/4495656)
*2 [ActiveRecord - replace model validation error with warning](https://stackoverflow.com/questions/3342449/activerecord-replace-model-validation-error-with-warning)
*3 [Efficient way to report record validation warnings as well as errors?](https://stackoverflow.com/questions/24628628/efficient-way-to-report-record-validation-warnings-as-well-as-errors)
Bluemix で PHP のアプリを作成する

IBM Bluemix で　PHP のアプリを作成します。
まず、
CloudFoundry アプリの　PHP で　ひながたを作成します。

![bluemix_hello_jul15.png](https://qiita-image-store.s3.amazonaws.com/0/179446/071dc90b-166d-b2cf-6ab7-5a51c64bad81.png)

それを、次のような表示を出すように改造します。

![bluemix_php_jul15.png](https://qiita-image-store.s3.amazonaws.com/0/179446/86e56fe9-c062-47a3-e752-4270a8468687.png)

改造するのは、
index.php
付け加えるのは、
jquery-3.2.1.min.js
example_php.js
prog/example_php.php
です。

```php:index.php
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="jquery-3.2.1.min.js"></script>
<script src="example_php.js"></script>
<link rel="stylesheet" href="style.css" />
<title>PHP Test (Jul/15/2017)</title>
</head>
<body>
<h1>こんにちは</h1>
<blockquote>
今日は晴れています。<p />
</blockquote>
<hr />
<div class="contents">contents</div>
<hr />
<div id="outarea_aa">outarea_aa</div>
<div id="outarea_bb">outarea_bb</div>
<div id="outarea_cc">outarea_cc</div>
<div id="outarea_dd">outarea_dd</div>
<div id="outarea_ee">outarea_ee</div>
<div id="outarea_ff">outarea_ff</div>
<div id="outarea_gg">outarea_gg</div>
<div id="outarea_hh">outarea_hh</div>
<hr />
Jul/15/2017 AM 08:20<p />
</body>
</html>
```

```js:example_php.js
// -----------------------------------------------------------------------
//	example_php.js
//
//					Jul/15/2017
//
// -----------------------------------------------------------------------
jQuery (function ()
{
	jQuery("#outarea_aa").text ("*** js/example_php.js *** 開始 ***")

	var data_text = ""

	var url_in = "prog/example_php.php"

	jQuery.get (url_in,function (data_rec)
		{
		jQuery(".contents").html (data_rec)
		})

	var ua = window.navigator.userAgent
	var ver = window.navigator.appVersion

	jQuery("#outarea_bb").html ('ua : ' + ua + '<br />')
	jQuery("#outarea_cc").html ('ver : ' + ver + '<br />')

	jQuery("#outarea_hh").text ("*** js/example_php.js *** 終了 ***")

})

// -----------------------------------------------------------------------
```

```php:prog/example_php.php
<?php
echo "*** generated by prog/example_php.php ***<br />";
date_default_timezone_set('Asia/Tokyo');
echo "<blockquote>";
echo "*** PHP runs on the server.***<p />";
echo date("Y/m/d  G:i") . "<br />";
echo $_SERVER['SERVER_SOFTWARE'] . "<br />";
echo $_SERVER['SERVER_NAME'] . "<br />";
echo $_SERVER['HTTP_USER_AGENT'] . "<br />";
echo $_SERVER['REMOTE_ADDR'] . "<br />";
echo gethostbyaddr ($_SERVER['REMOTE_ADDR']) . "<br />";
echo "</blockquote>";
echo "*** prog/example_php.php *** end ***<br />";
?>
```

変更が終わったら、ローカルで確認します。

```bash
php -S localhost:8000
```

うまく動いたら、アップロードします。
login の引数は、環境に合わせて変更して下さい。

```bash
bx api https://api.ng.bluemix.net
bx login -u aaa@bbb.net -p passaaa -o "aaa" -s my_area
bx app push
```
クラウドサーバでTensorFlow　その8

概要
クラウドサーバでTensorFlowやってみた。
MNISTやってみた。

環境
クラウド idcf
linux debian-8.11
tensorflow 1.2
gpu 無し

写真
100バッチを1000エピソード実行
タイトルは、accuracy
##784-10
![mnist6.png](https://qiita-image-store.s3.amazonaws.com/0/18104/ae2a5c2d-9725-526e-bfa0-a57d99698aa1.png)

##784-625-10
![mnist13.png](https://qiita-image-store.s3.amazonaws.com/0/18104/457a9c5a-4f35-bec8-1773-bacf04953a29.png)

##CNN
![mnist14.png](https://qiita-image-store.s3.amazonaws.com/0/18104/8fed6a5c-0188-d30b-0536-d76b71ad4832.png)

##RNN

![mnist17.png](https://qiita-image-store.s3.amazonaws.com/0/18104/7eb59c48-6bc6-22bd-3b6b-810cc00d0f7f.png)
react-native-svgを利用する際の注意点

[react-native-svg](https://github.com/react-native-community/react-native-svg) はReact NativeでSVGを描画するためのライブラリです。利用する際の注意点を軽くまとめています。SVG全般というより主にReactNative固有の問題についてです。

### React Nativeのバージョンによりサポートするバージョンが異なる

React Nativeの各バージョンに対し動作するバージョンが異なります。
https://github.com/react-native-community/react-native-svg#notice

React Nativeをアップグレードする際は、現在のreact-native-svgバージョンが該当のRNバージョンでの動作をサポートしているかを確認し、もしも必要ならアップグレードする必要があります。

### サポートしていないSVG要素がある

現時点の最新(5.4.0)で、Marker要素やPattern要素はサポートされていません。
https://github.com/react-native-community/react-native-svg#todo

たとえば折れ線グラフを描画したい時に、

```
<Marker id="xxxx" ... />
<Path d="M 0,0 10,10 20,15" marker="xxxx" />
```
のようにSVGでは各点をMarker要素を使って描画することができますが、react-native-svgではサポートしていません。その場合、現時点ではMarker要素を使わずに別途、点を描画する必要があります。

### onPress属性

各SVG要素にはonPress属性を付けることができます。
図形が重なっている場合、onPressイベントは基本的に一番上にある図形にしか効きません(当たり前と言えば当たり前かもしれませんが..)。

また、SVGでは以下のように`<Defs>`配下で要素を定義しておき、
```
<Defs>
  <G id="point">
    <Circle r={10} />
  </G>
</Defs>
```

`<Use />`要素でその定義した要素を参照することができます。

```
<Use href="#point" x={x} y={y} />
```

ただ、`<Use />` にonPress属性をつけてもタップしたイベントを拾ってくれません。Defs以下に定義した方にonPress属性をつけても同様に効きません。(5.4.0時点)
タップのイベントを拾いたい場合は、残念ながら`<Use />`を使わずに個別に描画する必要があります。

### AndroidでSvg要素のwidthを0に指定するとエラーになる

Svg要素のwidthまたはheight属性に0が入るとAndroidでの実行時に以下のエラーになります。
※iOSの場合は同様のエラーは特に発生しません

```
SurfaceView should have explicit width and height set.

measure
SvgViewManager.java:39

measure
YogaNode.java:722

jni_YGNodeCalculateLayout
YogaNode.java
```

通常は0を指定することはないかもしれませんが、動的にwidth、heightを指定する場合に一時的に値が入るケースがあるかもしれないので注意です。


### テスト実行時のmocking

SVGを含むViewのテストを実行する時、React Native以外の実行環境だとエラーになってしまうので、その際はmockする必要があります。

react-native-mock風の [react-native-svg-mock](https://github.com/FormidableLabs/react-native-svg-mock) が存在するため、こちらを利用するとよいです。
PHPUnit で __construct を test する(laravel で試しただけ)

__construct の振る舞いを確認したいので、 Mock を使って test してみた。

純粋に PHPUnit だけで試したわけではなく、 Laravel を使った test で試しただけなので、間違いがあるかもしれません。

※タグに laravel 入れてしまってるけど、実際は余り laravel 関係ないはずです。

## 結論

`getMockBuilder()->disableOriginalConstructor()->getMock();` してから、 `ReflectionClass` 使って `getConstructor()` する。

## 前提

なんでも良いのですが、取り敢えずサンプルとして `php artisan make:auth` したら生成される `Auth/LoginController.php` を例に。

```app/Http/Controllers/Auth/LoginController.php
    public function __construct()
    {
        $this->middleware('guest', ['except' => 'logout']);
    }
```

これをテストする。

## テストしたいこと

`__construct` を呼ぶと、 `middleware()` が引数 `('guest', ['except' => 'logout'])` として呼ばれる事を確認したい。

でも、 `Mockery::mock($class);` とかすると、既に __construct 通った状態になる。

## テストする方法

`getMockBuilder()->disableOriginalConstructor()->getMock();` してから、 `ReflectionClass` 使って `getConstructor()` する。

```tests/Unit/app/Http/Controllers/Auth/LoginControllerTest.php
    public function testConstruct()
    {
        $mock = $this->getMockBuilder(LoginController::class)
            ->disableOriginalConstructor()->getMock();

        $mock->expects($this->once())->method('middleware')
            ->with('guest', ['except' => 'logout']);

        $classRef = new ReflectionClass(LoginController::class);
        $constructor = $classRef->getConstructor();
        $constructor->invoke($mock);
    }
```

これで __construct の振る舞いを確認できた。
RedmineをGatlingで負荷テストする

100名超で使うRedmineの負荷テストを実施する必要があって、なんとなくGatlingでやってみたので記録。
Redmineを普通に使う分にはパフォーマンス懸念がないんだけど、メール送信設定周りがボトルネックになることがあった。

## 事前準備
* Gatlingをインストール
* 簡単にテストするため、テスト対象のRedmineで以下を設定
  * Redmineの認証必須をオフにする
  * テストに使うプロジェクトを公開状態にして、ログインしなくてもチケット発行できるようにする

## テストシナリオ作成
以下、GatlingのRecorderで操作を記録したものを少し書き換えたもの。
ポイントは、 **CSRFトークンを保存して、POSTする時にHTTPヘッダーへ付ける** こと。

操作としてやっているのは、以下の通り。

* 新規チケット発行画面を表示
* チケット発行
* 上記を秒間3ユーザーが30秒間アクセスするようにする

なお、POST時に使っている **RecordedSimulation_0001_request.txt** は、Recorderで操作を記録した時にできるものなので、
それをそのまま使う。中身は、Formにどのような項目があって、各項目に何を指定するか。

```scala
import scala.concurrent.duration._

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._

class RecordedSimulation extends Simulation {

  val url = "http://hoge.com/"
  val httpProtocol = http
    .baseURL(url)
    .inferHtmlResources()
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    .acceptEncodingHeader("gzip, deflate")
    .acceptLanguageHeader("ja,en-US;q=0.7,en;q=0.3")
    .doNotTrackHeader("1")
    .userAgentHeader("Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0")

  val headers_0 = Map("Upgrade-Insecure-Requests" -> "1")

  val headers_1 = Map(
    "Content-Type" -> "multipart/form-data; boundary=---------------------------12071732112052",
    "Upgrade-Insecure-Requests" -> "1")

  val scn = scenario("RecordedSimulation")
    .exec(http("request_0")
      .get("/redmine/projects/hoge/issues/new")
      // CSRFトークン保存
      .check(regex("""<meta name="csrf-token" content="(.*?)" />""").saveAs("auth_token"))
      .headers(headers_0))
    .pause(2)
    .exec(http("request_1")
      .post("/redmine/projects/hoge/issues")
      .headers(headers_1)
      // HTTPヘッダーに保存したCSRFトークンを追加
      .header("X-CSRF-Token", "${auth_token}")
      .body(RawFileBody("RecordedSimulation_0001_request.txt")))

  setUp(scn.inject(constantUsersPerSec(3) during(30 seconds))).protocols(httpProtocol)
}
```

## 所感
* 簡単に負荷テストをしたい時、Recorderの存在がありがたい
* POSTをする時は、今回やったCSRFトークン保存のような小細工が必要になるので注意
* Scalaが分からなくても、Javaができれば何となく書けるけど、分かった方ができることが増えそうな気がする
* テスト後のレポートが結構充実していて、見ているとおもしろい
ルービー3分クッキング「今日はオブジェクトを汚染していきます」

「オブジェクトを汚染する」という厨二感あふれるワードに惹かれて、
taintに触れてみました。
畏れ多き、
rubyのセキュリティ機構のご報告になります！:chicken:
タイトルの３分は関係ありません。:clock:

# rubyのセキュリティモデル

Q:「rubyのセキュリティって何？」
A:

```
RubyにはCGI等のプログラミングを安全に行うことを助ける為に、
セキュリティ 機構が備わっています。

Rubyのセキュリティモデルは
「オブジェクトの汚染」と「セーフレベル」という仕組みによってなりたっています。
```

引用：[Ruby2.4.0リファレンスマニュアル>セキュリティモデル](https://docs.ruby-lang.org/ja/latest/doc/spec=2fsafelevel.html)

### セーフレベルと禁止される操作

レベル0とレベル1があります。
2,3,4もあったみたいですが廃止されました。
デフォルトではレベル0にされていて、
レベル0では禁止される操作はないですが、
レベル1で以下の操作が禁止されます。

```
- 汚染された文字列を引数とした以下の操作
  - ファイルテスト演算子の使用、ファイルの更新時刻比較
  - 外部コマンド実行 (Kernel.#system, Kernel.#exec, Kernel.#`, Kernel.#spawn など)
  - Kernel.#eval
  - トップレベルへの Kernel.#load (第二引数を指定してラップすれば実行可能)
  - Kernel.#require
  - Kernel.#trap
```

# taintを使ってみる

セーフレベルを変更（①）し、
オブジェクトを汚染（②）し、
操作が禁止されていることを確認（③）してみましょう。

##①セーフレベルを変更

セーフレベルはスレッドローカル変数`$SAFE`で設定できます。

```rb
p $SAFE #デフォルトは0
# => 0
$SAFE = 1 # これで変更できる！
p $SAFE
# => 1
$SAFE = 0 # 現在のレベル以下には設定できない
# => SecurityError: tried to downgrade safe level from 1 to 0
#    from (irb):29
#    from /usr/bin/irb:12:in `<main>'
```

もし、部分的にセーフレベルをあげたい時はThreadを使いましょう。
各スレッドは作られた時点での親スレッドの$SAFEの値を引き継ぎます。
比較対象としてhogeを定義しました。

```rb
$SAFE = 1
hoge = 1
th = Thread.new{
  p $SAFE #=> 1
  $SAFE = 2
  p hoge #=> 1
  hoge = 2
}
th.join
p $SAFE #=> 1
p hoge #=> 2
```

## ②オブジェクトを汚染

以下のコードでは、
code2は汚染されていますが、
セーフレベルが0なので操作が禁止されていません。

```rb
p $SAFE #=> 0
code1 = "puts 'This is untainted'"
eval(code1) #=>This is untainted
  
code2 = "puts 'This is tainted'"
code2.taint # code2を汚染する
eval(code2) #=> This is tainted

# code2の汚染状態を確認
code2.tainted?　#=> true
```

## ③操作が禁止されていることを確認

②で使ったコードをセーフレベルをあげると`eval(code2)`で、
`SecurityError`が発生し、
禁止されていることが確認できます。

```rb
$SAFE = 1
p $SAFE # => 1
code1 = "puts 'This is untainted'"
eval(code1) #=>This is untainted
  
code2 = "puts 'This is tainted'"
code2.taint # code2を汚染する
eval(code2)
#=> SecurityError: Insecure operation - irb_binding
#	from (irb):33:in `eval'
#	from (irb):33
#	from /usr/bin/irb:12:in `<main>'

# code2の汚染状態を確認
code2.tainted? #=> true
```

ちなみに、`untaint`でオブジェクトの汚染を除くこともできます。

```rb

code2 = "puts 'hogehoge'"
code2.taint # code2を汚染する
eval(code2) #=> SecurityError ...
code2.tainted? #=> true

code2.untaint # code2の汚染を除く
eval(code2) #=> hogehoge
code2.tainted? #=> false
```

#まとめ

**セーフレベルまとめ**

```
- プログラム開始時の$SAFEの値は0
- 各スレッドは作られた時点での親スレッドの$SAFEの値を引き継ぐ
- $SAFE の値を現在の値より小さく変更する事はできない
```

**taintまとめ**

```
taint : オブジェクトを汚染する。
tainted? : 汚染状態を調べる
untaint : オブジェクトの汚染を除く。
```


参考：　https://docs.ruby-lang.org/ja/latest/doc/spec=2fsafelevel.html
Slack APIを使ってチャンネルのメンバー名一覧を取得する

Slackの特定のチャンネルに入っているメンバーの名前をSlack APIを使って取得しました。
チームの人数が多い場合のちょっとした管理表（夏休みの予定表とか）を作る時に使えます。
今回はNode環境で、es2017のasync functionsを使ってみました。

## 環境

Node v7.10+ 

(async functionsがサポートされているのがv7.10以上のため
http://node.green/#ES2017-features-async-functions)

## 事前準備

### Slack API Tokenを取得する

Slack API Tokenを以下にアクセスして取得します。
https://api.slack.com/custom-integrations/legacy-tokens

### チャンネルIDを取得する

ブラウザでSlackを開きURLから取得します。

`https://{team}.slack.com/messages/{channel_id}/`

### packageのインストール

今回は[node-fetch](https://github.com/bitinn/node-fetch)を使用したのでインストールします。

```sh
$ npm install node-fetch --save
```


## コード

Slack API Methodsからchannels.infoとusers.infoを使用します。
(詳細はこちら https://api.slack.com/methods)

```js:main.js
const fetch = require('node-fetch');

const TOKEN = '{Slack_API_token}';
const CHANNEL_ID = '{Channel_ID}';
const SLACK_API_BASE = 'https://slack.com/api';

function fetchChannel() {
  return fetch(`${SLACK_API_BASE}/channels.info?token=${TOKEN}&channel=${CHANNEL_ID}&pretty=1`)
    .then(res => res.json())
    .then((res) => {
      if (!res.ok) throw new Error(res.error);
      return res.channel;
    });
}

function fetchMembers(ids) {
  return Promise.all(ids.map((id) => {
    return fetch(`${SLACK_API_BASE}/users.info?token=${TOKEN}&user=${id}&pretty=1`)
      .then(res => res.json())
      .then((res) => {
        if (!res.ok) throw new Error(res.error);
        return res.user;
      });
  }))
  .then(users => users.filter(x => !x.deleted));
}

(async () => {
  const channel = await fetchChannel();
  const members = await fetchMembers(channel.members);
  const names = members.map(x => x.real_name).sort();
  console.log(names);
})()
  .catch(err => console.error(err));
```

先頭の`{Slack_API_token}`と`{Channel_ID}`を事前に取得しておいた値に変更してください。

実行すると、以下のように配列でメンバーの名前（First name + Last Name）を取得できました。

```sh
$ node .
[ 'James Hetfield',
  'Lars Ulrich',
  'Kirk Hammett',
  'Robert Trujillo'
  ... ]
```
「デフォルト引数は上書きできる」という噂を聞いたので、とりあえずマクロと組み合わせてみた

# 本題
次のコードを見てほしい

```cpp
#include <iostream>

int id(int x){return x;}
int id(int=0);
int main()
{
    {
        std::cout<<id()<<std::endl;  //0
    }
    {
        int id(int=42);
        std::cout<<id()<<std::endl;  //42
    }
    {
        int id(int=13);
        std::cout<<id()<<std::endl;  //13
    }
}

```

デフォルト引数は上書きできる。らしい

この挙動が合法か、違法か、よくわからないがとりあえず動いたので(https://wandbox.org/permlink/3ETuG18YqU6y4adV)
とりあえず何か便利に使ってみようと思う

# 応用
とりあえずマクロと組み合わせて、デフォルトの挙動を更新できる風にしてみた
make のexportでコンフィグを設定する風のイメージである

```bash
export NANKA_CONF=ON
make
```

以下サンプル

```cpp
// メンバsにクラス名を入れるクラス
#define STRUCT(NAME) \
  struct NAME {\
    std::string s = name() ? name() : #NAME;\
  };

char const * name(char const * =0);
char const * name(char const *p){return p;}
```
このマクロは構造体を定義し、デフォルトでメンバに自身の構造体名を入れるマクロである
また,name()は受け取った文字列をそのまま返す関数であり、デフォルト引数として0に指定されている
つまり、name()は0を返す。ふつうは

このマクロは次のように使う

```cpp
{
    STRUCT(Foo);
    std::cout<< Foo{}.s<<std::endl; // Foo
}
{
    STRUCT(Bar);
    std::cout<< Bar{}.s<<std::endl; //Bar
}
```

クラス名がメンバに代入されている

そして、それ以外の値をセットしたい場合は次のようにする

```cpp
{
    char const * name(char const * ="!!!happy!!!"); //happyになりたいときもある
    STRUCT(Piyo);
    std::cout<< Piyo{}.s<<std::endl;  //!!!happy!!!
}
```


このようにすることでデフォルトの挙動を上書く風の挙動ができ、多少便利になった


#サンプルコード

コード： https://wandbox.org/permlink/v3ijtNmlBJvqDKWG
OpenCVとOpenGLによるARひな形コード

# はじめに
Augmented Reality(AR)のように、毎フレーム画像を取得して画像処理を行った上でCGを描画したい時があるとします。画像の取得や出力やCGの描画には、それぞれOpenCVとOpenGLというライブラリが有名です。今回は、OpenCVとOpenGLを用いてARのための簡単なフレームワークを作りました。

# 環境設定
環境は以下の通りです。
Windows10, Visual Studio 2015, C++, x64 Releaseモード
ライブラリはGLFW3.1.2, OpenCV3.0

**インクルードディレクトリ** 
opencv\build\include
glfw-3.1.2.bin.WIN64\include\GLFW

**ライブラリ**
opencv\build\x64\vc14\lib
glfw-3.1.2.bin.WIN64\lib-vc2015

**追加の依存ファイル**
opencv_world310.lib
GLFW3.lib
opengl32.lib

# コード
GLFWの描画関数display()のループ内で画像を一枚ずつ読み込みます。OpenGLとOpenCVでは座標系が異なることに注意してください。また、画像の三次元座標について z = 0 としています。以下にひな形コードを示します。

```c++

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <glfw3.h>
#include <iostream>

VideoCapture cap(InputVideoPath); // 使用する動画
uint numberOfFrame = 0; // フレーム番号
const uint lastFrame = 100; // 終わりのフレーム番号
const uint WIDTH = 540, HEIGHT = 540; // 画像のサイズ

static void init()
{
	glClearColor(0.0, 0.0, 0.0, 1.0);
	tt = 0;
}


static void display()
{
	glClear(GL_COLOR_BUFFER_BIT);

	cv::Mat img; // 画像の宣言
	cap >> img; // 画像の読み込み


//////////////////////////////////////////////
//        画像処理などOpenCVによる操作        //
//////////////////////////////////////////////


	/* OpenCVの座標系をOpenGLの座標系に合わせる */
	cv::flip(img, img, 0); // x軸まわりの反転
	cv::cvtColor(img, img, CV_BGR2RGB); // BGR-->RGB

	glDrawPixels(img.cols, img.rows, GL_RGB,GL_UNSIGNED_BYTE, img.data); // 入力画像の表示

	cv::flip(img, img, 0);
	cv::cvtColor(img, img, CV_BGR2RGB);


//////////////////////////////////////////////
//   テクスチャマッピングなどOpenGLによる操作  //
//////////////////////////////////////////////


	/* 動画作成してプログラム終了 */
	if (tt == LastFrame) {
		exit(0);
	}

	++tt;
	glFlush();
}

int main(int argc, char * argv[])
{
	glfwInit();

	GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "Dynamic Projection Mapping", NULL, NULL);

	glfwMakeContextCurrent(window);

	init();

	// 射影変換 (GLとCVの座標系が異なることに注意)
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-WIDTH / 2, WIDTH / 2, -HEIGHT / 2, HEIGHT / 2, -1, 1);

	while (!glfwWindowShouldClose(window)) {
		display();
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	glfwDestroyWindow(window);
	glfwTerminate();

	return 0;
}
```

# OpenCVとOpenGLの座標系の違い
OpenCVでは画像左上が原点でOpenGLが画像中心が原点です。x軸方向は一致していますが、y軸方向が逆になっています。例えば1つの点を黒色で表示したい場合は以下のように書く必要があります。

```
cv::Point2i point;
// pointsの設定は省略

glPointSize(5.0);
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POINT);

glVertex3i(point.x - (WIDTH / 2), -(point.y - (HEIGHT / 2), 0);

glEnd();
```
keymapを使わずにpecoを使いこなす方法

## 背景

`peco`を愛してやまないペコリアンの皆さん、こんにちは。
`peco`のinitial commitから早くも3年とちょっと経ったようですが、今や人類は`peco`なしでは生きていけなくなってしまいました。

そんな生活必需品、無人島に１つ持っていくなら`peco`なんですが、唯一の問題点が、**処理ごとにaliasやkeymapを設定しないといけない**という点です。もちろん、そんなことしなくても使えますが、生で記述すると記述量が増えるので、どうしてもaliasかkeymapを設定してしまいます。そうすると、aliasがどんどん増えていって覚えきれなくて、結果、よく使うコマンドは２、３個になってしまいます。ペコあるあるです。。

## 解決策

scope, target, actionという３つの項目を`peco`を使って選択するだけで、任意のコマンドを生成できるようにしてみました。
簡単に言うと、`Unite.vim`のsource, kind, actionの概念に似たようなものだと思っていただければと。

## 例1

よくあるやつですが、`ghq`を使ってgitフォルダへの移動するとき。
scopeはgit repository(ghq)、targetは移動先のリポジトリ名、actionはcdを選択すると、適当なコマンドを生成してくれるので、エンターを押すと移動できます。scopeは適当に名前を付けているだけなので、わかりやすくてペコラビリティの高い名前を付けてください。

![git_repository.gif](https://qiita-image-store.s3.amazonaws.com/0/36728/fb48c604-0362-d709-2b11-1311e31e6da9.gif
)

## 例2

これまたよくあるやつ。プロセス一覧からプロセスを検索してkill。
scopeでProcess、targetでプロセス、actionでkillを選択するだけです。

![process.gif](https://qiita-image-store.s3.amazonaws.com/0/36728/5c21ff16-5e86-7885-7b1c-3272a230fcf5.gif)
デモはwindows環境で動かしているので悪しからず。

## 例3

コンテナを選択してdockerコマンドを実行

![docker.gif](https://qiita-image-store.s3.amazonaws.com/0/36728/cd7c59a1-cb61-a4d0-257b-31fc303dd39c.gif)


## 使い方纏め

|Purpose|Scope|Target|Action|Command ex.|
|:--|:--|:--|:--|:--|
|`ghq`を使ってリポジトリにcd|Git repository(ghq)|_repository_|cd|cd _repository_|
|プロセス一覧からプロセスを検索してkill|Process|_PID_|kill|kill _PID_|
|コンテナを選択してtop表示|Docker a container|_container_|top|docker top _ID_|
|docker-composeのログを表示|Docker containers/images|container managed by Compose|logs|docker-compose logs -tf|
|ファイルを選択してvi|Current dir|_file_|vi|vi _file_|

組み合わせはいろいろ考えられるので、ほかにもいろいろできます。

## その他

ついでに、こんな機能もあればいいかなということで追加してみました。

* `zsh`と`bash`に対応：`.zshrc`と`.bashrc`に似ているけれどもちょっと違う設定を書くのが大変なのでまとめました
* マルチプラットフォーム対応：一部のコマンドではプラットフォーム毎の違いを吸収
* とは言いつつもよく使う機能にはkeymap: 履歴検索とディレクトリ移動はよく使うのでCtrl+r, Ctrl+hにkeymap
* コンテキストに合わせてリストの表示内容を変更：例）dockerがインストールされていなければ、dockerに関する項目は非表示

以上、ゆるふわツールの紹介でした。
https://github.com/kenji0x02/pecorian