OmniAICreator/Qiita-1.07M huggingface dataset:
oracle tips

#一時領域確認

```sql
SQL# col tablespace_name format a20;
SQL# col file_name format a40;
SQL# select tablespace_name, file_name from dba_temp_files;
TEMP /u01/app/oracle/oradata/orcl/temp01.dbf
SQL# alter database tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' resize 30G; <--拡大
SQL# alter database tempfile '/u01/app/oracle/oradata/orcl/temp01.dbf' autoextend on; <--自動拡張
```

#シェル一気にユーザー(user1)作成

```bash
#!/bin/bash
sqlplus /nolog <<EOS
conn / as sysdba
drop user user1 cascade;
create user user1 identified by user1 default tablespace users temporary tablespace temp;
grant connect to user1;
grant resource to user1;
grant CREATE any VIEW to user1;
grant drop any view to user1;
grant update any table to user1;
grant delete any table to user1;
grant select any table to user1;
grant insert any table to user1;
grant unlimited tablespace to user1;
grant create session to user1;
EOS
exit 0
```

#expdpとimpdp

```bash:ディレクトリ作って
$ mkdir -p /home/oracle/dump_dir;
```

```sql:マッピングして
SQL# drop directory dump_dir;
SQL# create directory dump_dir as '/home/oracle/dump_dir'; 
SQL# grant read, write on directory dump_dir to user1;
```

```bash:実行
$ expdp user1/user1@db01 directory=dump_dir dumpfile=user1.dmp
$ impdp system/system directory=dump_dir dumpfile=user1.dmp remap_schema=user1:user2
```

#sqlplusでprocedure実行

```sql
create or replace procedure select_t_zeimu (bb out number) as
  varID number := 1;
  begin
    select count(*) into bb from t_zeimu;
    dbms_output.put_line('count:' || bb);
  end;
/

set serveroutput on
variable bb number;
execute select_t_zeimu(:bb: );
```
#いろいろ確認

```sql
SQL> select * from user_role_privs;       <--ロール確認
SQL> select * from user_sys_privs;        <--権限確認
SQL> select * from all_users order by created ;  <--ユーザー一覧
```

```bash:sqlplusで日本語が化ける時
export NLS_LANG=Japanese_Japan.AL32UTF8
```
UnityにFabricのクラッシュレポートCrashlyticsを入れる

## 1.公式からFabricのunitypackageをダウンロードする
fabricのunitypackage概要ページ
https://docs.fabric.io/unity/crashlytics/installation.html

fabric.unitypacageDLページ
https://www.fabric.io/downloads/unity

## 2.自分のUnityプロジェクトにfabric.unitypackageをインポート(asset→import package→custom package)する

## 3.上部メニューのfabric→prepare fabricからログインする

## 4.Crashlyticsを選択して、最初のsceneにドラッグする

-----------------------------------------
以下は、ゲームの宣伝ですm(_ _)m

○落ちてくる物すべてタップ
<img src=https://qiita-image-store.s3.amazonaws.com/0/50917/7e445cb0-29fe-eb7d-f35c-c48ffd0bc504.jpeg width=150px align="left">
<a href= https://play.google.com/store/apps/details?id=com.secretcommandlab.taptapdrop><img src=https://qiita-image-store.s3.amazonaws.com/0/50917/e5ad66a0-6cce-c312-9ae5-3f6473de9783.png width=150px align="left">
</a>
<a href="https://itunes.apple.com/us/app/%E8%90%BD%E3%81%A1%E3%81%A6%E3%81%8F%E3%82%8B%E7%89%A9%E3%81%99%E3%81%B9%E3%81%A6%E3%82%BF%E3%83%83%E3%83%97/id1228691845?mt=8"><img src=https://qiita-image-store.s3.amazonaws.com/0/50917/37d2e0ca-bf3d-86f3-6d5b-173029f5ad20.png align="left" width=150px>
</a>
【開発】バグを出さない基本的な思考パターン

開発において、「バグを出さない」というのは開発者なら誰しも考えていることの一つかと思います。そのために軸になる思考パターンみたいなものを持っているタイプの人も多いかと思います。自分もそのタイプなので、メモもかねて残しておきます。

#思考順序（上から下へ）
- 状況把握
- 現状調査
- 必要物列挙
- パターン網羅
- パターン整理
- 必要な機能orデータ列挙
- 検討、確認

みたいな流れで考えていくと、結構バグが少なくなりますね。これをいかに早くできるかを自分では気を付けている感じです。
【WEBアプリ編】セキュリティテスト漏れに気を付けよう

最近、独自パッケージの開発が増え、セキュアな具合がまちまちで困りました。
チェックリストにした方が安心だったのでとりあえず、どのアプリケーションでも共通かなという部分だけ項目にしておきます。

#共通項目
- スクリプト挿入
- XSS
- CSRF
- SQLインジェクション
- 多重ログイン

#その他？
- ブルートフォースアタック（必須な気がするけど）
- 2重登録（セキュリティって言っていいのかなぁ）
- 不正データ型チェック

データ型系は特に、半角全角の、漢字ひらがなカタカナ英字数字数値記号特殊記号クレカ銀行、などの情報が正しく処理されるかアプリケーションごとにまちまちですが、適切なチェックになるといいですよね。
Choregrapheで開発してていろいろ備忘録

こんにちは。きむちゃん。です

最近Pepperくんのアプリ開発をしておりまして、Choregrapheってーって思ったことが溜まってきたので、備忘録的にメモを残しておきます。

<a id="index"></a>
## <a href="#index">目次</a>
* [Choregrapheとは](#anchor1)
* [良い点](#anchor2)
* [悪い点](#anchor3)
* [まとめ](#anchor4)

<a id="anchor1"></a>
## <a href="#anchor1">Choregrapheとは</a>  
<!--この下に第1章の内容を書きます。-->
Pepperの開発に用いるやつです。↓の感じ
![ff0e057bb551d3a8d462c044760d4b26.png](https://qiita-image-store.s3.amazonaws.com/0/116258/06140f2f-ce8b-5e50-8acd-c57a7910aba0.png)

<!--この上に第1章の内容を書きます。-->



<a id="anchor2"></a>
## <a href="#anchor2">良い点</a>
<!--この下に第2章の内容を書きます。-->
 
 - クラスをボックス分けして、全体の構成と流れが見やすい 
 
 - 出力、入力の形式、型のミスをボックスの接続段階で防いでくれる 
 
<!--この上に第2章の内容を書きます。-->

<a id="anchor3"></a>
## <a href="#anchor3">悪い点</a>
<!--この下に第3章の内容を書きます。-->
##pythonでやってるのにpipなどのpythonの強みが使えない
外部モジュールの導入がとにかくだるい

それで、よくあるのが、外部モジュールをimportしたのにChoregrapheにそのフォルダをぶち込もうとしたら、そのフォルダ見つかんないんだけど！！！ということ。macでよくあることなんですけど、

「Command」キー＋「Shift」キー＋「 . 」（ピリオド）
で、不可視フォルダを表示させたり、

「Command」キー＋「Shift」キー＋「G」
で絶対パスを使ってフォルダの場所を直接指定して飛んでください。

モジュールの場所がわからないってときは、ターミナル上で
```
pip show <package_name>
```
で、各モジュールの詳細を見ることができます。

ちなみに参考、デフォでPepperに入っているpythonライブラリ
[Pepperに最初から入ってるPython追加ライブラリの一覧](http://www.baku-dreameater.net/archives/4891)

##バーチャルロボットでできることが少なすぎる
物理的（手足）な挙動くらいしかバーチャルロボットで試せないため、胸のタブレットを使ったり、Pepper搭載のセンサーを使いたい場合は実機で試すしかありません。

<a id="anchor4"></a>
## <a href="#anchor4">まとめ</a>
<!--この下に第4章の内容を書きます。-->
総括すると、
__pythonで記述してるだけでpythonを使っていない！__
って感じ
~~Android Studio対応版のPepperが出たらしいが使ってないので知りません~~

Pepper自体のメモリも4GBだし、やらせようとすることが増えてくるとなかなか大変になります
Jenkins PipelineでYamlを設定ファイルとして使う方法

Jenkins PipelineのJenkinsfileを作っていて、設定ファイル(Gradleでいう、gradle.propertiesのような感じ)が欲しいと思う時があります。今回はYamlファイルをJnekinsfileから読み込んで設定ファイルとして使う方法をご紹介します。

# 1. [Pipeline Utility Steps Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Utility+Steps+Plugin)をインストール
Jenkinsで様々な形式のファイルが簡単に読み込めるようになるプラグインです。Yamlファイルの読み込みに使います。Jenkins初期設定時のSuggested Pluginには入っていないので、自分でインストールしましょう。

# 2. config.ymlを作成
プロジェクト直下（Jenkinsfileと同じ場所）にconfig.ymlを作ります。 

```yaml:config.yml
someProp: 値１
someCategory:
  prop: 値２
  arrayProp:
    - 配列値０
    - 配列値１
    - 配列値２
```

# 3. Jenkinsfileを作成
Jenkinsfileを下記のようにします。今回はDeclarative Pipelineの書き方ですが、Scripted Pipelinesでもほとんど同じ書き方だと思います。

```groovy:Jenkinsfie
pipeline {
    agent any
    
    environment {
        CONFIG = "" //この時点ではプロジェクトの設定ファイルを読み込めないので仮の値を設定しておく
    }
    
    stages {
        stage('チェックアウトして設定ファイル読み込み') {
            steps {
                // プロジェクトをチェックアウト
                checkout scm
                
                script {
                    // チェックアウト後に設定ファイルを読み込む
                    // Pipeline Utility Steps Pluginの関数を使う
                    CONFIG = readYaml(file: 'config.yml')
                }
            }
        }
        
        stage('設定ファイル参照') {
            steps {
                echo "CONFIG.someProp ＝ ${CONFIG.someProp}"
                echo "CONFIG.someCategory.prop ＝ ${CONFIG.someCategory.prop}"
                echo "CONFIG.someCategory.arrayProp[0] ＝ ${CONFIG.someCategory.arrayProp[0]}"
                echo "CONFIG.someCategory.arrayProp[1] ＝ ${CONFIG.someCategory.arrayProp[1]}"
                echo "CONFIG.someCategory.arrayProp[2] ＝ ${CONFIG.someCategory.arrayProp[2]}"
            }
        }
    }
}
```

これでJobを実行すると下記のようなコンソールログが出力されます。

```:Jenkinsのコンソール出力（一部抜粋）
[Pipeline] { (設定ファイル参照)
[Pipeline] echo
CONFIG.someProp ＝ 値１
[Pipeline] echo
CONFIG.someCategory.prop ＝ 値２
[Pipeline] echo
CONFIG.someCategory.arrayProp[0] ＝ 配列値０
[Pipeline] echo
CONFIG.someCategory.arrayProp[1] ＝ 配列値１
[Pipeline] echo
CONFIG.someCategory.arrayProp[2] ＝ 配列値２
```



## 最後に
今回はYamlファイルをJenkins Pipelineの設定ファイルとして使ってみました。
[Pipeline Utility Steps Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Utility+Steps+Plugin)はpropertiesファイルも読み込めるので、gradle.propertiesを読み込んで、設定ファイルをGradleとJenkins Pipelineで共有することもできそうです。
メモ：ddコマンドで書き込みテスト

ちょっとしたパフォーマンステストで、書き込みを延々とし続けてほしいことがあった。

でも、Diskは溢れさせたくない。そんなときのスクリプト。

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

LOOP_COUNTS=100
OUTPUT_FILE_DIR="/tmp"
OUTPUT_FILE_NAME_PREFIX="dd_test"
BLOCK_SIZE="10M"
BLOCK_COUNT=100

trap "/bin/rm ${OUTPUT_FILE_DIR}/${OUTPUT_FILE_NAME_PREFIX}.*; exit" SIGINT

for ((i=0; i<$LOOP_COUNTS; i++))
do
  output_file="${OUTPUT_FILE_DIR}/${OUTPUT_FILE_NAME_PREFIX}.${i}"

  # 書き込み実行
  # "oflag=direct"はメモリを通さずDiskに直接書き込む(Direct I/O))
  /bin/dd if=/dev/zero of=${output_file} bs=${BLOCK_SIZE} count=${BLOCK_COUNT} oflag=direct
  # 一時ファイル削除
  /bin/rm ${output_file} && echo "ファイル削除完了: ${output_file}"
done
```

とめたくなったら`Ctrl + C`する。SIGINTをtrapしてあるので、ゴミファイルは残らない。

出力がうっとうしければ/dev/nullに捨てる。そして適当にバックグラウンドで動かしたりするとよい。

> ./dd_wirte_loop >/dev/null 2>&1 &

とめたくなったら、`fg`コマンドを実行した上で、`Ctrl + C`をする。

### メモ
ddのオプションは`if`、`of`、`iflag`、`oflag`などクセがあって覚えにくい。と思ったら、INPUT、OUTPUTの頭文字だと気づいた。（今更）

ifはインプットファイル、iflagはインプットフラグ。（たぶん）
Mcrypt PHP extension required. でLaravelが動かなくなった時にやったこと


macOS Sierraにアップデートした影響かわかりませんが、ローカル環境のLaravelが「Mcrypt PHP extension required.」で動かなくなった時にやったことを書きます。

## 環境
OS:macOS Sierra
PHP: 5.6

## 原因
PHPとMcryptのバージョンが合っていないのが原因でした。

## やったこと

### PHPのバージョンの確認
Laravelのpublicディレクトリ内に「phpinfo_test.php」を配置

~~~php:phpinfo_test.php

<?php
phpinfo();
?>

~~~

ブラウザでローカルのphpinfo_test.phpにアクセスしてPHPのバージョンを確認。


![スクリーンショット 2017-06-17 11.32.39.png](https://qiita-image-store.s3.amazonaws.com/0/27793/d3815c9c-f28f-6d6f-080f-da8f9ca1e95e.png "スクリーンショット 2017-06-17 11.32.39.png")

### mcrypt のバージョンを確認
brewでmcryptをインストールしていたのでターミナルで調べました

~~~:ターミナル
brew list

結果
省略 mcrypt php55-mcrypt
~~~

phpとmcryptのバージョンがあっていないことがわかりました。
バージョンが合っていた場合、別の原因が考えられます。

### 現行のmcryptをアンインストール
~~~:ターミナル
brew uninstall php55-mcrypt
brew uninstall mcrypt
~~~

### mcryptをインストール
まずはインストールすべきmcryptを探す

~~~:ターミナル
brew search mcrypt
~~~

mcryptをインストールします。

~~~:ターミナル
brew install homebrew/php/php56-mcrypt
~~~

※brewが別バージョンのPHPをインストールしていてインストールできない場合、別バージョンのPHPをアンロックする必要があります。(ターミナルでbrew unlink php55)

### php.iniを編集

mcrypt.soの場所を探す

~~~:ターミナル
sudo find / -name mcrypt.so

結果
/usr/local/Cellar/php56-mcrypt/5.6.30_4/mcrypt.so
~~~

php.iniを編集。(php.iniの場所は環境によって違う場合があります。phpinfo_test.phpで確認できます。)


~~~:ターミナル
sudo vim /etc/php.ini 

以下を書き込みして保存
extension=/usr/local/Cellar/php56-mcrypt/5.6.30_4/mcrypt.s
~~~

### apacheの再起動

~~~:ターミナル
sudo apachectl restart
~~~

## まとめ
以上の対応で再びLaravelが動作しました！
BULMAでビューを作成する

# はじめに
どうせアプリを作るなら、フロントを楽して良い感じにしたい。。。
なにか良いフレームワークは無いものか、、、
BootstrapはJSも読み込むのがイヤだ、、、
あとあとJSも使うかもしれないけど、必要になるまではCSSだけでやりたい。。。
探したらBULMAなるものが良さそうなので、導入してみることにした。

# 導入
Railsなので、gemを使う。

Gemfileに下記を追記する。

```
gem "bulma-rails", "~> 0.4.2"
```


追記したら、bundle installを実行する。
bundle installはbundleでも実行できる。

```
$ bundle
```

application.scssでimportすればおｋ

```
@import "bulma";
```

bulma-railsはGitHubのREADMEを読めば良さそう。
[bulma-rails](https://github.com/joshuajansen/bulma-rails)

# 使いかた
使い方は丁寧に書こうと思ったけど、ドキュメントが丁寧すぎてあまり書くことなかった、、、
もう少し使い慣れたら色々書きたい。

ドキュメントは実際のソースコードとそのソースコードの動作をセットで載せてくれてるのでそんなに詰まることなくできる。

[BULMAのドキュメント](http://bulma.io/documentation/overview/start/)
[checkio]The most wanted letter

エンジニアを目指すプログラミング初心者が、しこしことcheckioを使って勉強をしていきます。
感銘を受けた他のエンジニア様のコードを分析します。

今回の問題は入力として受け取った文字列の中でもっとも出現頻度の高いcharacterを返すというもの。
複数の文字列がもっとも高い出現頻度を持つ場合はアルファベット順で若い方を返す。
だが空白文字や記号、テメーはだめだという鬼畜仕様。

まず自分のコード

```js
function mostWanted(data) {
    data = data.replace(/\s+|!|\d+|-|,/g, "").toLowerCase();
    var text = [];
    var mostCha = [];
    var mostCount = 1;
    var count = 1;
    for (let i of data) {
        text.push(i);
    };
    text.sort(function(a,b) {
        if (a<b) return -1;
        if (a>b) return 1;
        else return 0;
    });
    for (let i = 0; i < text.length; i++ ) {
        if(text[i] == text[i+1]) {
            count += 1;
            if (count > mostCount) {
                mostCount = count;
            }
        } else {
            count = 1;
        }
    };
    for (let i = 0; i < text.length; i++ ) {
        if(text[i] == text[i+1]) {
            count += 1;
            if (count == mostCount) {
                mostCha.push(text[i]);
            }
        } else {
            count = 1;
        }
    };
    if (mostCount == 1) {
        mostCha.push(text[0]);
    }
    return mostCha[0];
}
```
うむ美しい(錯乱)
すごい無駄しかない気がすることはわかるのだが、どうすることもできなかった。

次に本題のすげーなと思ったコード。

```js
function mostWanted(data) {
    s = data.toLowerCase().split("").sort()
    max = 0
    for(c of "abcdefghijklmnopqrstuvwxyz".split("")){
        n = s.indexOf(c) >= 0 ? s.lastIndexOf(c) - s.indexOf(c) + 1 : 0
        if(n > max){
            max = n
            maxc = c
        }
    }
    return maxc
}
```
なんでこんな短くなるの・・・

### 分析
まず一行目では
・　文字列を小文字に変換し(.toLowerCase)
・　~~空白文字を取り除き~~(テキストを引数で区切った配列を生成)(.split(""))
・　並び替えをしている(.sort())

んーsort()は文字列にも使えるのか・・・？
最初にそれでできるのではないかと思って試して見たら、"--- is not a function"のエラーが出てきて、調べて見たらarray classのmethodらしいことがわかり、自分の解答では配列を使うようにしたんだけど・・・
そのうちわかったら追記しよう。

アッー
split()で配列にしてました。なるほど。

2行目はmaxという変数を定義。

3-7行目のfor文では・・・
3...一つ一つアルファベットを要素として持つ配列を作りつつ、それを一つずつループする動作
4...nという変数の中で
・　cがs配列の中にあるかを確認
・　存在していれば、s配列の最後(lastIndexOf)から最初(indexOf)をindexとして引いて個数を求める。
・存在していなければ0をnに代入
5...今の文字列がmaxより大きければ・・・
6...maxにnを代入
7...maxcにcを代入してこの文字列が一番多いですよ
でmaxcを最後にリターンして完了。美しい(確信)

###反省
まずすでにアルファベット順にしているため、最大数の文字をストックしておく配列は特に必要なかった。
出てくるforループを２つにしたのも、特に必要なかった。
あと、文字列だけを見るために、自分のではわざわざreplaceで取り除いているので、これではいちいちダメなものがでるたびに追加しなきゃいけない。その点後者のコードは必要なものだけを配列として定義して比較しているので、スマート。
もっと簡潔にかけるよう頑張ろう。
Sikuliデモプログラムを作ってみた(キャプチャ編)

Sikuliデモプログラムを作ってみた(準備編)
http://qiita.com/miz21358/items/d301297dcb9d925172f6
Sikuliデモプログラムを作ってみた(設定・起動編)
http://qiita.com/miz21358/items/7462bae80494d49dc392

# 画面キャプチャTips

ソースコードにもコメントですべて記載しています。
GitHubへのリンクは準備編参照。

## アプリケーション限定キャプチャ

ウィンドウ全体のキャプチャ

```
SCREEN.capture()
```

特定のアプリケーション領域のみをキャプチャしたい場合、範囲を指定してキャプチャができます。
アプリケーションの特定保持は、設定・起動編参照。

```capture.py

###-------------
# ブラウザのキャプチャを行う
#
def captureBrowser(params):
    
    #ブラウザだけを範囲選択し、キャプチャを行う
    #この時点ではテンポラリ等、どこに保存されるかは確実ではない
    tmpPath = SCREEN.capture(params.browserReg.getTopLeft().getX(), \
            params.browserReg.getTopLeft().getY(), \
            params.browserReg.getW(), params.browserReg.getH())

    if isinstance(tmpPath, basestring) == False:
        # 文字列が取得できてない場合、
        # ファイルオブジェクトである可能性があるので、ファイルパスを再取得する
        tmpPath = tmpPath.getFile()
    
    logger(u"captureTmpPath={0}".format(tmpPath))

    #キャプチャの保存先を取得する
    captureDirPath = params.tree.findtext(u'.//capture/path', None)    
    #キャプチャファイルの画像名を、日時に合わせて修正する
    capturePath = u"{0}{1}{2:%Y%m%d-%H%M%S}.png".format(captureDirPath, os.sep, datetime.datetime.now())
    logger(u"capturePath={0}".format(capturePath))

    #キャプチャファイルを移動する
    os.rename(tmpPath, capturePath)

    #キャプチャファイルフルパスを返す
    return capturePath
        
```

params.browserReg … ブラウザアプリケーションの領域(Region)

私の環境では、SCREEN.capture() の return が、キャプチャ画像フルパスの場合と、キャプチャ画像オブジェクトの場合の2パターンが発生しました。
Win7はフルパス、Win10はオブジェクト。OSのバージョンによるのかしら…
なので、パス文字列ではなかった場合、ファイルパスを再取得してます。

SCREEN.capture() した際のキャプチャ画像がどこに置かれるかは、環境に依るようです。
なので、使いやすいところに動かしといた方が後々楽かと思います。
AWS API Gateway + Lambda Proxy で苦労した話


# API　GATEWAY　PROXYって？
API　GATEWAYから　Lambdaなどにリンクする場合URIなどを具体的に設定しないといけないのだけど、　PROXYモードでまとめて全部Proxyされているサービスに投げることが可能なのだが。。。

例えば　
``Link : https://<api ID>.execute-api.ap-southeast-2.amazonaws.com/<stage name>/```  

API IDが　abcdef, stage が　development とすると。

```Link : https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/```

で、これに例えば　IDとPhoneを追加したい場合、　普通は　リソースに　IDとPhoneを追加して
``` 
/{id}/{phone}
https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/1234/81-50-1234-1234
```

これを　PROXYサービスに変えると

```
https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/user?id=1234&phone=81-50-1234-1234
```

すげーべんりじゃん？！　ってのは、ふつーにだれでもわかるんだけど・・

## テストでハマった  

最初にCORSが面倒、LAMBDAにPROXYしてるんだけど、LAMBDAでも　CORSの設定が必要とか　
下の例は、headers の　アクセスコントロールとかを追加。

```javascript
const returnvalue = {
                            statusCode: 200, 
                            headers: {
                                'Access-Control-Allow-Origin' : '*',
                                'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
                                'Access-Control-Allow-Credentials' : true,
                                'Content-Type': 'application/json'
                            },
                            body: JSON.stringify(response) 
                    };
callback(null, returnvalue);
```

テストをしてみたけど　えらーばかり　リソースをヒットしていないのがテストが不可能な状態、　JqueryではHTTP　OPTION, CORSではじかれ、CURLでも　４０３でおかしい。

## なんで　４０３エラー？ 
パラメータのパスで問題だったのだが、なにせAWSのガイドを読んでもちんぷんかんぷん。ここでかなり無駄な時間。

jqueryで　テストってことで　<apiURL>?ID=123 　

```javascript
$.ajax({ url: "https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/?id=123",
        type: "GET",
        dataType: 'json',
        crossDomain: true,
        contentType: 'application/json',
        success: function(data){
           console.log(data);
        }});
```


をなげてたのが４０３で弾かれまくり、　CURLでも同じく４０３、いろいろ検索したら　リソースにヒットしてないのでは？ってことで、やっとわかったのが

``` https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/?id=1234 ```

では　だめで

``` https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/user?id=1234 ```

USERってのが必要。。　（なんでやねんってかんじ）

これがちゃんと動くサンプル

```javascript
$.ajax({ url: "https://abcdef.execute-api.ap-southeast-2.amazonaws.com/development/user?id="+id,
        type: "GET",
        dataType: 'json',
        crossDomain: true,
        contentType: 'application/json',
        success: function(data){
           console.log(data);
        }});
```

# さいごに・・・
AWSさん・・　文章をもっとちゃんとしてくれ。　なにもかんでも４０３ってなんだよ。
Sikuliデモプログラムを作ってみた(準備編)

# Sikuli 楽しいよ！
と言うばかりではあれなので、デモプログラムを作ってみました。
HelloWorldよりも、もう少し凝った使い方をしています。色々Tipsが入ってます。

## 0. Sikuliとは

> Sikuli automates anything you see on the screen. It uses image recognition to identify and control GUI components. It is useful when there is no easy access to a GUI's internal or source code.
(公式より)

Sikuliとは画像認識(OpenCV)を用いて、画面上に表示されているアプリケーションを自動的に操作するためのプログラムです。
アプリケーションの内部コードまたはソースコードに簡単にアクセスできない場合に便利です。
Windows/Mac/Linux(GUIのあるディストリビューション)等で動作します。
画面上に表示されているものであれば、大抵の操作はできるようになる…と思います。
＃文字認識はあまり得意ではありません。


## 1. 公式

http://www.sikuli.org/
http://doc.sikuli.org/

コーディングのやり方はこんな感じ。
https://www.youtube.com/watch?v=FxDOlhysFcM (英語)

## 2. デモプログラム

### 2.1. 動画

https://youtu.be/506WM-ADnJs

### 2.2. 処理概要

1. Chrome を開く
2. Excel を開く
3. 設定ファイルで指定されたランドマークごとに以下の処理を実行する
    1. Chrome で GoogleMap を開く
    2. ランドマークを検索する
    3. 検索結果をキャプチャして画像保存する
    4. Excelを開く
    5. シートを追加して、ランドマークをシート名に設定する
    6. ランドマーク名、共有リンク、キャプチャ画像をシートに貼り付ける
4. Excelを保存する

### 2.3. 動作環境

以下の環境で動作する事を想定しています。

- Windows 7 / 10
- Sikuli ver1.1.0 / 1.1.1 (Jython 2.7)
- Google Chrome ver58
- Microsoft Excel 2003 / 2010 / 2013

実際に確認した組合せは以下の通りです。
画像認識を行うため、環境が異なると正しく認識できない場合があります。
（だからあんまりデモとか出回ってないのかも…）

- Windows7 + Sikuli 1.1.0 + Excel2003 + Chrome 58
- Windows7 + Sikuli 1.1.0 + Excel2010 + Chrome 58
- Windows7 + Sikuli 1.1.0 + Excel2013 + Chrome 58
- Windows10 + Sikuli 1.1.1 + Excel2003 + Chrome 58

### 2.4. ソースコード

https://github.com/miz21358/GoogleMapSikuliDemo

## 3. インストール

JavaとSikuliをインストールしてください。
詳細は以下とか参照。

[test][automation] sikuliを使ってGUI操作を自動化する
http://qiita.com/YHayama@github/items/483198cba0e7c4baa78c

## 4. 準備

- 実行バッチファイル(demo.bat)で各種パス等の設定を行ってください。
- 設定ファイル(setting.xml)で各種パス等の設定を行ってください。
- 不確定要素を減らすため、他のプログラム等はすべて閉じてください。
- デモ実行中はマウスカーソル、キーボードが自動で動く為、手入力が入ると予期せぬ動作を起こすことがあります。
- Chromeは全画面表示を解除し、縦サイズを短くしてください（Google Mapのメニューで「地形」以降がスクロールしてないと表示されないくらい）
- デモは Ctrl＋↑ で中断することができます。

すべて完了したら、demo.batを実行してください。

## 5. 解説

Sikuliデモプログラムを作ってみた(設定・起動編)
http://qiita.com/miz21358/items/7462bae80494d49dc392

Sikuliデモプログラムを作ってみた(キャプチャ編)
http://qiita.com/miz21358/items/d2efb093a6f7c1ab9c13
Intellij IdeaでGoogle App Engine/Python のアプリを書く時の設定

自分用の備忘録メモ。

対象のバージョンは以下
<img width="638" alt="Screen_Shot_2017-06-17_at_8_53_53.png" src="https://qiita-image-store.s3.amazonaws.com/0/45686/84a5db64-3850-90dd-fe6a-3f46c961e2b3.png">


# python プラグインをインストール
そもそもPythonのプラグインをインストールしておきます。これである程度のPycharm相当の機能が使えます
<img width="992" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/45686/51efd3f0-bf54-258d-7bd2-14faaa5ef1b4.png">

# ProjectStructureを選択

<img width="1280" alt="Screen_Shot_2017-06-17_at_8_49_27.png" src="https://qiita-image-store.s3.amazonaws.com/0/45686/e67c4f52-2ac8-c371-d4fb-2cd4e00987a3.png">

# Google App EngineのSDKへのパスを指定
LocalのマシンにインストールしているGoogle App EngineのSDKへのパスを指定します。
<img width="872" alt="Project_Structure.png" src="https://qiita-image-store.s3.amazonaws.com/0/45686/a7cf8cab-69c7-7717-e7dd-b171d9afa278.png">

# Libフォルダーを指定
Pipでインストールするライブラリは、プロジェクト直下のLibフォルダーに入れるのが公式サンプルにあるパターンなのでそれが良いかと思います。

Flaskでのサンプル
https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/standard/flask/hello_world

以下のように `-t` でインストールします。

```bash
pip install -t lib -r requirements.txt
```

↓以下のような appengine_config.py ファイルを入れておきます。
https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/appengine/standard/flask/hello_world/appengine_config.py

```py
from google.appengine.ext import vendor

# Add any libraries installed in the "lib" folder.
vendor.add('lib')
```

ちなみにPipでインストールして使えるのは、Pythonのみで構成するものです。それ以外のものは、Googleが用意しているものを app.yamlで宣言すると使えます。

```yaml

libraries:
- name: jinja2
  version: latest
```

以下にリストがあります。
https://cloud.google.com/appengine/docs/standard/python/tools/built-in-libraries-27

ここまでの準備をした上で、Libフォルダーを選択してResourcesに指定するとLibフォルダーにインストールしたものがIntellijでちゃんと参照してくれるようになります。

<img width="922" alt="Screen_Shot_2017-06-17_at_9_05_59.png" src="https://qiita-image-store.s3.amazonaws.com/0/45686/5dc66176-cf96-2495-a854-d6df08d38ef4.png">

これですべての依存ライブラリがIntellijから認識されている状態になりました。
<img width="529" alt="main_py_-_monitoring_-____dev_monitoring_.png" src="https://qiita-image-store.s3.amazonaws.com/0/45686/4e8af636-c6a5-678c-36f0-2011353ff355.png">

# Jinja2テンプレートを認識させる
ほっておくとJinja2テンプレートが認識されません。これは不便なので、PreferencesからPythont Template Languageを開いて設定します。

<img width="736" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/45686/f5fb3785-2fb5-98dc-6ecd-a119db4ebdaf.png">


。。ここまで書いておとなしくPycharm使ったほうがいい気がしてきました。
MPS-SW-MAINにおける衝突処理について

#背景
- 越塚らの公開するMPS-SW-MAINでは衝突処理が導入されている．
- 本項では衝突処理の詳細と必要性を解説する．

#理論
##粒子法MPSにおいて衝突処理が必要な理由
次の図は，平面上に敷き詰められた粒子に対して徐々に測定点を近づけたときの，平面からの距離xに対する密度$\rho$と粒子数密度$n$の変化を表す．規格化するため，それぞれ，均質に充填されているときの密度$\rho_0$及び初期粒子数密度$n_0$で除してある．また距離x[m]も粒子径d[m]で除してある．グラフは横軸が粒子が敷き詰められた平面からの距離を，縦軸が密度比と粒子数密度比を表す．密度比はオレンジで，粒子数密度比は青で示される．グラフでは示されないが密度は$x=-2.1d$で$\rho/\rho_0=1$となる．
グラフからわかる通り，__$x=0.5d$を超えたあたりから密度比と粒子数密度比のかい離が激しいことが分かる．__また，$x=0.3d$あたりの所で$n/n_0 >1$となることが分かる．つまり，密度と粒子数密度の乖離が激しくなるため，__MPSにおいてはある程度の距離(たとえば$x=0.5d$)で粒子の接近を打ち切って衝突処理によって強制的に排除作用が働くよう，衝突処理が組み込まれている．__
![density-KYU.png](https://qiita-image-store.s3.amazonaws.com/0/187379/1ca574b8-2ea5-5db9-f3ad-f845bfb331fa.png)
__図. 密度比と粒子数密度比__
##2個の粒子の衝突力学

質点iとjが弾性衝突し，それぞれ，$\bf v_i,v_j$から$\bf v_i',v_j'$へ速度が変化したとする．
その時の関係式は[換算質量](https://ja.wikipedia.org/wiki/%E6%8F%9B%E7%AE%97%E8%B3%AA%E9%87%8F)より，
$$
\frac{m_i m_j}{m_i +m_j}\frac{1}{m_i}({\bf v_i - v_j})= -{\bf v_i'}
$$
と表される．

##MPS-SW-MAINにおける実装
一方で，MPS-SW-MAINでは衝突処理は，
$$
(1+\alpha)\left(\left(\frac{m_i m_j}{m_i+m_j}\frac{1}{m_i}({\bf v_j - v_i})\right)\cdot\frac{\bf r_j -r_i}{|{\bf r_j -r_i}|}\right)\frac{\bf r_j -r_i}{|{\bf r_j -r_i}|}={\bf v_i'}
$$
と表される．プログラムでは，
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187379/5af4c633-af26-89b5-9a96-da22fd1f83c6.png)
となる．つまり，粒子間距離$r_{ji}$が入力ファイルで設定されるcollisionDitance_squared以下になったとき，衝突処理を行い，座標$\bf r_i,r_j$および速度$\bf v_i,v_j$を更新する．

###MPS-SW-MAINにおける実装の詳細
換算質量による弾性衝突の式，
$$
\frac{m_i m_j}{m_i +m_j}\frac{1}{m_i}({\bf v_i - v_j})= -{\bf v_i'}
$$
に対して，越塚らの実装では
$$
(1+\alpha)\left(\left(\frac{m_i m_j}{m_i+m_j}\frac{1}{m_i}({\bf v_j - v_i})\right)\cdot\frac{\bf r_j -r_i}{|{\bf r_j -r_i}|}\right)\frac{\bf r_j -r_i}{|{\bf r_j -r_i}|}={\bf v_i'}
$$
となっており，粒子i,jの二点間を結ぶ直線上の方向性分だけを持ったベクトルの衝突となっている($\alpha$は係数)．__質量が等しいときの衝突__を図で表すと，次の通りとなり，本来は点線ベクトルと点線ベクトルの合成ベクトルで表されるベクトルで衝突による作用力はあらわされるが，そのベクトルの$\bf r_{ij}$成分だけを衝突の作用力としている．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187379/7ed5d9c3-3014-0f27-23f5-6e592e6318c5.png)
__図. 等質量の粒子同士の衝突__

#結論
- 越塚らのMPS実装では粒子間距離がある一定距離になると強制的に粒子間に斥力が働く弾性衝突モデルが導入されている．
- 弾性衝突の式は質量換算の式から求められる．
- 越塚らの実装では，衝突による作用力は二粒子が結ぶ直線のベクトル成分だけで表される．

#参考
http://mps.q.t.u-tokyo.ac.jp/mpscug/
http://iss.ndl.go.jp/books/R100000002-I000001903649-00 (pp.230-231)
jsdoで、なでしこ

#概要
jsdoで、なでしこ、やってみた。

#写真
![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/0/b/s/0bsh.jpg?t=1497656336)

#サンプルコード
コッホ曲線

```
●koch(nを)
　もし(n <= 0)ならば
　　2だけカメ進む
　　戻る
　ここまで
　n-1をkoch
　60だけカメ左回転
　n-1をkoch
　120だけカメ右回転
　n-1をkoch
　60だけカメ左回転
　n-1をkoch
ここまで

カメ作成。
[0,300]にカメ起点移動。 
90だけカメ右回転    
1にカメペンサイズ設定
青色にカメペン色設定
5をkoch
```

fizzbuzz

```
iを１から20まで繰り返す
　ｆは0
　もし、i％15＝0ならば
　　「fizzbuzz」と表示。
　　ｆは1
　ここまで    
　もし、i％3＝0 && f=0ならば
　　「fizz」と表示。
　　ｆは1 
　ここまで    
　もし、i％5＝0 && f=0ならば
　　「buzz」と表示。
　　ｆは1
　ここまで    
　もし、ｆ＝0ならば
　　iを表示。
　ここまで
ここまで。

```


#成果物
http://jsdo.it/ohisama1/0bsh
http://jsdo.it/ohisama1/oBAL
多相性とジェネリクス

自分の理解のまとめです。ベースは[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%95%E3%82%A3%E3%82%BA%E3%83%A0)です。（Wikipedia日本語ページの記述は2017/3に英語ページの記述をもとに拡充されています。）論文や書籍を参照・引用してるわけではないので、たぶん突っ込みどころがあるのではないかと思います。うのみにしないように。

# 多相性

ざっくり3つに分類されています。

- アドホック多相
- サブタイピング多相
- パラメトリック多相

__アドホック多相__は、型システム上は関連性のない複数の型を引数や戻り値にとることができる関数（メソッドや演算子を含む）の性質です。普通は引数や戻り値の型に応じて異なる実装にディスパッチされます。Javaで言うとオーバーローディングです。Javaのオーバーローディングだと、多相性を保ったまま第一級オブジェクトとして扱うことはできません（オーバーロードされたメソッドの参照を関数インターフェース型の変数に代入しようとすると、その時点でオーバーロードが解決されます）。

__サブタイピング多相__[^1]は、ある型を引数や戻り値にとる関数が、その型の部分型（サブタイプ、派生型とも言う）も引数や戻り値に取ることができる性質です。普通は型に応じて異なる実装にディスパッチされます。Javaというか静的型付けOOP[^2]でポリモーフィズムと言えばこれを指すことが多いです。
Javaでは、スーパータイプ（親クラスまたはインターフェース）に定義されたメソッドをサブタイプ（子クラスまたは実装クラス）でオーバーライドしたり実装したりすることで、インスタンスメソッドを呼び出したときに実行時の`this`の型に応じて実装が選ばれます。インスタンスメソッドを関数としてとらえ、`this`を暗黙の第一引数と考えれば、「ある型を引数や戻り値にとる関数が、その型の部分型を……」に適合していることがわかります。
なお、Javaのように、（クラスの継承やインターフェースの実装など）関係性を明示することでサブタイプが決まる仕組みを、公称的部分型（ノミナルサブタイピング）といいます。一方、OCamlやTypeScriptは、構造的部分型（ストラクチャルサブタイピング）といい、ある型に定義されたメンバーが、別の型に定義されたメンバーと構造的に互換性がある場合、自動的にサブタイプ関係が成立します[^3]。そこに継承はかならずしも必要ありません[^4]。

サブタイピングが出てくると必ず一緒に顔を出す厄介な問題が共変性／反変性です。正確な定義にはいろいろ前提知識がいるので、ここでは適当に端折って書きますが、`T`型の引数を取ったり`T`型の戻り値を返したりする関数があったとき、型`T`に対して互換性がある別の型`U`を持ってきたら、「`T`型の引数を取ったり`T`型の戻り値を返したりする関数」と「`U`型の引数を取ったり`U`型の戻り値を返したりする関数」に互換性があるかどうか、といったことを考える時の話です。
共変性／反変性が問題になるのは、多くの場合、後述するパラメトリック多相とサブタイピングが組み合わさった時です。ですが、サブタイピング多相だけでも共変性／反変性を考えることはあります。一つの例が、Javaにおける「メソッドをオーバーライドしたときの戻り値の型」です。

```java
class AnimalSound {
}
class Animal {
  AnimalSound cry() {
    ...
  }
}
```

みたいなクラスがあったときに、これらを継承して

```java
class DogSound extends AnimalSound {
}
class Dog extends Animal {
  @Override
  DogSound cry() {
    ...
  }
}
```

とすることができます。それは、「`AnimalSound`型と`DogSound`型の互換性」と「`AnimalSound cry()`メソッドと`DogSound cry()`メソッドの互換性（ひいては、それぞれのメソッドを定義している`Animal`型と`Dog`型の互換性）」に共変性があるためです。これをJavaでは「共変戻り値型」と呼びます。

__パラメトリック多相__は、関数の引数や戻り値の型情報の一部をパラメータ化して外部から与えることができる関数、あるいは、合成型の定義に含まれる型情報の一部をパラメータ化して外部から与えることができる型の性質です。パラメータ化された型を型パラメータや型変数と呼ぶこともあります。普通は型に対して抽象化された一つの実装[^5]を持ち、型パラメータとして具体的な型が与えられた時に再利用されます。ジェネリクスと言えば基本的にはこれを指します。

型パラメータは基本的には任意の型をとるのですが、任意の型しかとれないとなると、 "抽象化された一つの実装" の中で、パラメータ化された型の値に対し何か具体性のある処理をしたいときに困ることがあります。なので、型パラメータを限定するために型制約をつけることができる言語もあります。限定といっても一つの型しかとれないようだとパラメトリックな多相性があるとはいえませんから、型制約はほかの多相性（アドホック多相やサブタイプ多相）と関連するのが普通です。たとえばJavaでは`<T extends Xxx>`のようにサブタイプ関係を指定できます。C++のテンプレートではメソッドや演算子の存在がチェックされます（≒構造的部分型）。Haskellでは型クラスを制約とすることができます。

サブタイピング多相のところにも書きましたが、パラメトリック多相とサブタイピングが組み合わさると、共変性／反変性のバリエーションがぐっと増え、とても複雑になりがちです。
Javaの配列は、ジェネリクスの機構が取り入れられる前からあった唯一のパラメトリック多相とみなせます（`Foo`型の配列 `Foo[]` を `Array<Foo>` と読み替えてみましょう）。Javaの配列にはなぜか共変性があり（細かくは省略します）、メリットもなくはないのですが型安全性の観点ではデメリットが多いため、配列の共変性を利用することは避けられるようになりました。

[^1]: 型を集合と考えた時の部分集合と包含関係にちなんで「インクルージョン（包摂）多相」と呼んだりもします。
[^2]: Smalltalkなどの動的型付けOOPにおけるメッセージング機構だとサブタイピングとは言いにくい気がします。
[^3]: OCamlの多相ヴァリアントも構造的部分型に分類されるのかどうか、よくわかりませんでした。
[^4]: OCamlの場合はメソッドの引数や戻り値を「自分と同一の型」とすることができるので、むしろ継承するとサブタイプ関係が崩れることもあります。
[^5]: ソースコード上の話。C++テンプレートの特殊化の話や、具象化（レイフィケーション）と型消去（イレイジャー）の話は、今回は省略しました。
pyplotで2軸のグラフを描画する方法

# スクリプト
- 2つのプロットを比較したい
- y軸のスケールが異なるので片方が潰れてしまって見えない
- そんな時のおまじない

```py:dual_plot.py
import matplotlib.pyplot as plt

fig, ax1 = plt.subplots()
ax1.plot(data1)
ax2 = ax1.twinx()  # 2つのプロットを関連付ける
ax2.plot(data2)
plt.show()
```

# 計算結果の例

- ピークの位置とステップの位置が重なっていて気持ちいい 

![figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/23570/40937ee0-9c0c-dda5-340d-5ef0bf518d6f.png)
Railsのfontをカスタマイズ

RailsでWebサイトとかに落ちているフォントを使いたい時用のメモです。
http://qiita.com/natsu871/items/582320d063796d005fc3　
を参考にしつつもう少し細かく解説してみました。

以下手順

①自分が取り込みたいフォントファイルをダウンロード

②app/assets/fonts 配下にダウンロードしたフォントファイルを置きます。もしfontsフォルダーが存在しなかった場合は作ってしまいましょう。

③cssファイル（又はscssファイル）に以下を追記する

例、font-familyの名前は自由に決められるので今回はBlueskyにするとします。そしてダウンロードしたフォントファイルがcustom-Bluesky-webfont.otfだった場合、、、

```sample.css
@font-face {
  font-family: 'Bluesky';
  src: font-url('custom-Bluesky-webfont.otf') format('truetype');
  font-weight: normal;
  font-style: normal;
}
```

使い方
例、sampleクラスのh2タグに挟まれた文字に'Bluesky'を適用する

```index.erb
<div class="sample">
  <h2>hello world</h2>
</div>
```

```sample.css
.sample h2 {
  font-family: 'Bluesky';
}
```
Node.jsから周辺のBLEデバイスを探すサンプル 


nobleの新しい感じのサンプルがなかったので書いてみる。

https://github.com/sandeepmistry/noble

* macOS Sierra
* Node.js v8.1.2

## 準備

```
$ npm init -y
$ npm i --save noble
```

このバージョンだと`npm install`時に`warning`が出るけど問題なく動作します。

## コード

```app.js
'use strict';
 
const noble = require('noble');
const knownDevices = [];

//discovered BLE device
const discovered = (peripheral) => {
    const device = {
        name: peripheral.advertisement.localName,
        uuid: peripheral.uuid,
        rssi: peripheral.rssi
    };
    knownDevices.push(device);
    console.log(`${knownDevices.length}:${device.name}(${device.uuid}) RSSI${device.rssi}`);
}

//BLE scan start
const scanStart = () => {
    noble.startScanning();
    noble.on('discover', discovered);
}

if(noble.state === 'poweredOn'){
    scanStart();
}else{
    noble.on('stateChange', scanStart);
}
```

## 実行

```
$ node app.js
1:<デバイス名称>(<UUID>) RSSI-75
2:<デバイス名称>(<UUID>) RSSI85
3:<デバイス名称>(<UUID>) RSSI-49
・
・
・
```

デバイスが見つかる度にコンソールに表示されます。

参考: [ノンプログラマでもコピペでOK！JavaScriptを使ってDroneを飛ばそう](https://liginc.co.jp/187633)
Vim初心者なのでカーソル移動まとめてみた


## はじめに
タイトルにも書きましたがVim初心者です。覚え書きです。
サーバ上でファイルを編集するときはVimを使用していたものの、全く使いこなせていませんでした。
ですが、[さくらのVPSでUbuntu16.04を建てた](http://qiita.com/tpywao/items/76899267b9935038d9cd)にて開発をサーバ上で行うようになってから普段使っている[Sublime Text3](https://www.sublimetext.com/3)が使えない...
(もちろん[SFTP](https://wbond.net/sublime_packages/sftp)プラグインはありますが...)
結局自分のPCで開発してるじゃないか...俺が求めていたのはこうじゃない！(たぶん)
というわけで、とりあえずVimでの操作方法を覚える初手として、**個人的に覚えやすいなと感じた** カーソル移動コマンドをまとめてみました。

### 注意
- 基本的にカーソル移動はノーマルモードで行います
- コマンドの回数指定についてはほぼ記述していません
- 各項目名は自分の分かり易い区分けをするために付けたもので、正式にそう呼ばれているかは考慮していません...

### バージョンとか
- Vim - Vi IMproved 7.4
- Huge版 without GUI.
- 適用済みパッチ: 1-1689
- 追加拡張パッチ: 8.0.0056

### 凡例
- `h`: キー一つのみで動作するコマンド
- `c-f`: ctrlキーと同時押しで動作するコマンド
- `{num}G`: 数{num}を入力して動作するコマンド
- `f{char}`: コマンドの後に一文字入力して動作するコマンド
- `/{pattern}`: コマンドの後に{pattern}を入力して動作するコマンド  
    [{pattern}について](http://vim-jp.org/vimdoc-ja/pattern.html#pattern)


## 文字単位移動(通常移動)
おそらくVimを初めて触った際に 
厨二心をくすぐられる
 覚えるコマンドだと思います。
キーが横一列に並んでいるので押しやすく、矢印キーを押すためにホームポジションを崩さなくて済みます。
- `h`: 左に移動
- `j`: 下に移動
- `k`: 上に移動
- `l`: 右に移動

## 単語単位移動
`h, l`よりもよく使う気がする。

### 記号区切り
- `w`: 単語分先へ移動
- `b`: 単語分前へ移動
- `e`: 単語の末尾へ移動

### 空白区切り
- `W`: 空白区切りの単語分先へ移動
- `B`: 空白区切りの単語分前へ移動
- `E`: 空白区切りの単語の末尾へ移動

## 行/文/段落単位移動
- `0`: 行頭へ移動
- `^`: 空白以外の行頭へ移動(インデントとか)
- `$`: 行末へ移動
- `)`: 文分上に移動
- `(`: 文分下に移動
- `}`: 段落分上に移動
- `{`: 段落分下に移動

## 行指定移動
- `{num}G`: {num}行目に移動
- `:{num}`: {num}行目に移動
- `gg`: 1行目に移動
- `G`: 最後の行に移動

## 画面単位移動
- `c-b`: 画面分上に移動
- `c-f`: 画面分下に移動
- `c-u`: 画面の半分上に移動
- `c-d`: 画面の半分下に移動
- `H`: 画面内の最初の行に移動
- `M`: 画面の中央の行に移動
- `L`: 画面内の最後の行に移動

## 検索移動
厳密にはカーソル移動ではない...かも。

### 同一行内
- `f{char}`: 右方向にある{char}に移動
- `F{char}`: 左方向にある{char}に移動
- `;`: 直前の同一行内検索を繰り返す
- `,`: 直前の同一行内検索を逆方向に繰り返す

### ファイル内
- `%`: 対応する括弧類に移動
- `*`: カーソル位置の単語を下方向に検索
- `#`: カーソル位置の単語を上方向に検索
- `g*`: カーソル位置の単語(部分一致)を下方向に検索
- `g#`: カーソル位置の単語(部分一致)を上方向に検索
- `/{pattern}`: {pattern}を含む個所を下方向に検索  
    [{pattern}について](http://vim-jp.org/vimdoc-ja/pattern.html#pattern)
- `?{pattern}`: {pattern}を含む個所を上方向に検索
- `n`: 直前のファイル内検索を繰り返す
- `N`: 直前のファイル内検索を逆方向に繰り返す

## 次回予告
次は編集系をまとめる予定です。
- インサードモードへの入り方
- ビジュアルモード、矩形ビジュアルモード
- デリート、コピー、カット、ペースト

な感じで。

## おわりに
今回はカーソル移動を扱いましたが、便利なコマンドやプラグインも覚えていこうと思っています。
([surround.vim](https://github.com/tpope/vim-surround)とか...)
また、今回の内容についてのアドバイス、ご意見等ありましたらコメント等頂けると嬉しいです。

## 参考
- [quickref - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/quickref.html)
Raspberry PiにSSH接続できなくなったときの最終手段はルーター再起動だった


タイトルが結論です。

ここ最近、Raspberry Pi 3をWi-Fi経由でSSH接続しようとしたときにログイン後に表示が止まってエラーも出ずにタイムアウトするでもない状態になってしまっていました。

```
$ ssh pi@192.168.8.93
pi@192.168.8.93's password:
packet_write_wait: Connection to 192.168.8.93 port 22: Broken pipe
```

だいたいこれか

```
$ ssh pi@192.168.8.93
pi@192.168.8.93's password:
(ここで止まる)
```

* [最近インストールした Raspbian Jessie Lite が SSH 接続できない？](https://azriton.github.io/2017/03/07/%E6%9C%80%E8%BF%91%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9FRaspbian-Jessie-Lite%E3%81%8CSSH%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%EF%BC%9F/)

* [raspberry pi 3でSSH接続できない？](http://qiita.com/torch32171/items/c816acd5afa45fddabfe)

これらをもとに`ssh`ファイルを作成してもとくに変わらず

途方にくれて読んでいたこちらの記事に救われました。

[Raspberry Piにssh接続できなくなった君へ](http://youngforever.hatenablog.com/entry/2014/11/16/123359)

最後の方に書いてある、 **ルーター再起動**をするという最終手段。
これでした。

>明確な理由を見つけるためには、ネットワーク周りの勉強が必要だろう。

ネットワーク知識が欲しいと思った今日この頃です。
Redux で store をどこでも取得する

store のメソッドで state を取得、変更するためのイベントなどを発行していますが、store を取得する方法がいろいろあって基本的なことにやっとたどり着いたのでメモ。

1 store を作成

store.js

```
import { createStore } from 'redux';
import reducers from './reducers';

const store = createStore(reducers);
export default store;
```

2 store を使う （ state の値を変更したり、取得したり）

hoge.js

```
// store.js の store を取得
import store from '../../store';


store.dispatch(loadSearchLayout('users', 'User Results'));

で Action 経由 で state の値を変更とか


store.getState()

で store から state の値を取得とかできます。

```
FuelPHPのPagination(ページネーション)でwhere句とかで絞り込むとき

初カキコ…ども…

FuelPHPのPaginationをwhere句とかで絞り込むとき，こんな感じでやってます．
FuelでORMパッケージ使っている前提で書かせていただきやす…
http://fuelphp.jp/docs/1.9/packages/orm/intro.html
:point_up_tone2: (ORMパッケージは標準で有効にしてもよいのでは…？)

まずFuelPHPのPaginationの基本的な使い方を手順で表すとこんな感じっす…

1. paginationインスタンスを作る
1. paginationインスタンスのtotal_itemsプロパティに全件数を設定
1. per_pageプロパティに1ページあたりに表示する件数を設定
1. ページ番号を設定
1. paginationインスタンスからoffset値を取得
1. クエリビルダー系のメソッドで，取得したoffset値を利用して1ページ分のオブジェクトを取得

という感じです．(わからん)

(公式ドキュメントが一番分かりやすい)
http://fuelphp.jp/docs/1.9/classes/pagination.html

公式ドキュメントのサンプルだと，total_itemsにModel_Post::count()で全件数を設定してますが，これだとwhere句を指定して絞り込みを行ったときなどに，total_itemsに設定した件数と,絞り込んで取得した件数に違いが出てしまいます．total_itemsを元に全体のページ数などが決まるので，絞り込みを行う際は注意が必要っすね

そんなとき，下記のような書き方をするとよさげな感じに動的にtotal_itemsを設定できます．
よーは，先に絞り込み条件を指定したqueryオブジェクトを作成し，それを流用して
countメソッド(total_itemsの設定)とgetメソッド(1ページあたりのオブジェクトの取得)を実行するという感じです

```php
//queryインスタンスの取得
$query = Model_Post::query(); 

//タグでの絞り込み
if(Input::get('tag')){ 
    $query->where('tag', Input::get('tag'));
}
//ワードでの絞り込み
if(Input::get('word')){ 
    $query->where('content', 'LIKE', "%".Input::get('word')."%");
}
//ソート(並び順)が指定された場合
if(Input::get('order_by')){ 
    $query->order_by(Input::get('order_by'), 'DESC');
}

//paginationインスタンスの取得
$pagination = Pagination::forge('mypagination', [
    'pagination_url' => Uri::base(false).'posts',
    'uri_segment'    => 2,
    'per_page'       => 5,
    'total_items'    => $query->count() //ここでcountメソッドを実行する
]);

//countメソッドを実行したqueryオブジェクトを流用
//paginationインスタンスからoffset値を取得しqueryのoffsetに設定
$query->limit($pagination->per_page);
$query->offset($pagination->offset);

//getメソッドを実行して1ページあたりのオブジェクトを取得
$posts = $query->get();

//あとはオブジェクトをviewに渡すなりしちゃって
```

View側でページのボタンをレンダリングするのはこんな感じ…

```php
<?php if(Pagination::instance('mypagination')){ echo Pagination::instance('mypagination')->render(); } ?>
```

使い慣れている方したら，だから何だって感じかも知れませんが…(よりよい書き方があれば教えてもらえたら嬉しい）

ちなみに私はFuelPHPでORM利用する際は,基本的にはqueryメソッドを使うようにしています．findはほとんど使いません．
findメソッドはwhere句などで絞り込む場合，第二引数に配列でひたすらぶち込む必要があるので，複雑なことをすると可読性が下がり気味な印象です．queryメソッドなら，先のpagination処理の例で使ったように,分岐や使いまわしが簡単ですし，ステップ実行でデバッグがしやすいです．メソッドチェーンを使えば可読性のよろしいコードが書くこともできます．:grin:
findで書いてqueryで書き直すケースは何回かあったのですが，その逆はあまり無かった気がします．逆にfindメソッドの便利な活用法などあれば知りたいです．（使ってみた感じ，多分，どっちかで"しか"出来ないことはほとんど無いと思いますが)

IDだけ指定してオブジェクトを取得する場合findのほうが簡潔かな…

```php

Model_Idol::find(765);

Model_Idol::query()->where('id', 765)->get_one();

```


SQL文を直でゴリつかせるのはORMを使うメリットがなくなるのであまり使いません．
as_objectとかいう関数を使うとSQLの文字列からModelオブジェクトを取得する方法があるようですが(使ってないのでどういう仕組みかは謎…)

そんな訳でqueryメソッド限定で書かせていただ感じです…

FuelのORMは割とSQLに近い書き味な印象なのでORM入門にはよいかも知れません．
ORMを使うにしても，内部でどんなSQLが実行されるか想像できたほうが強いですね．:muscle_tone2:

以上レポっす:wave_tone1:
Phan Daemon Modeおためし

先日[0.9.2](https://github.com/etsy/phan/releases/tag/0.9.2)がリリースされた[Phan](https://github.com/etsy/phan)
気になった機能が実装されていたのでさわってみることにしました。

## Phan Daemon Mode

https://github.com/etsy/phan/wiki/Using-Phan-Daemon-Mode

1つのファイルに対してissueを検出するための機能
IDEやエディタ上でPhanを動かしたいときに有用

### Requirements

* Phan 0.9.2+ or 0.8.4+
* Mac or Linux (Windowsは未対応)
* pcntl extension

## 使い方

### デーモンを起動

```sh
$ vendor/bin/phan --daemonize-tcp-port 4846 --quick
Listening for Phan analysis requests at tcp://127.0.0.1:4846
```

### phan_clientを実行

```sh
$ vendor/bin/phan_client -l src/Sample.php
```

phan_clientはデーモンとの間で通信を行い結果を出力します。
IDEやエディタにこの結果を反映させるためには別途プラグインを用いる必要があります。

## phan_clientの出力結果

サンプルコードに対してphan_clientを実行したときの出力がどうなるかためしてみます。

### 正常系

```php:src/Sample.php
<?php

namespace PhanTest;

class Sample
{
    public function foo()
    {
        return 'zzz';
    }
}
```

```sh
$ vendor/bin/phan_client -l src/Sample.php
No syntax errors detected in src/Sample.php
```

`php -l`のメッセージと同じ

### シンタックスエラー

```php:src/Sample.php
<?php

namespace PhanTest;

class Sample
{
    public function foo()
    {
        return 'zzz'
    }
}
```

```sh
$ vendor/bin/phan_client -l src/Sample.php

Parse error: syntax error, unexpected '}', expecting ';' in src/Sample.php on line 10
Errors parsing src/Sample.php
Files were syntactically invalid

```

シンタックスエラーも`php -l`のメッセージとだいたい同じ

### Phanエラー

```php:src/Sample.php
<?php

namespace PhanTest;

class Sample
{
    public function foo()
    {
        // Exceptionクラスがない
        try {
        } catch (Exception $e) {
        }
    }
}
```

```sh
$ vendor/bin/phan_client -l src/Sample.php
No syntax errors detected in src/Sample.php
Phan error: UndefError: PhanUndeclaredClassCatch: Catching undeclared class \PhanTest\Exception in src/Sample.php on line 11
```

シンタックスエラーなしのメッセージとPhanエラーの内容の両方が出力されます。

またこの例ではないですが複数のPhanエラーがあるときは全部出力されます。
シンタックスエラーとPhanエラーが同時にあるときはシンタックスエラーだけが出力されます。

## IDE/エディタとの連携

[ドキュメント](https://github.com/etsy/phan/wiki/Using-Phan-Daemon-Mode#using-phan_client-from-an-editor)にはvimとemacsのプラグインを使った例があります。

vimだけ言及しますとプラグインはこちらで
https://github.com/etsy/phan/blob/master/plugins/vim/phansnippet.vim

確かにこれでも動作はしますが同期的に実行されるので、非同期で実行させたい場合は[vim-watchdogs](https://github.com/osyo-manga/vim-watchdogs)などと組み合わせるのがよさそうです。
すでに`php -l`などを非同期実行させている場合はこれを`vendor/bin/phan_client -l`に置き換えればよいので導入はそれほど難しくなさそうです。

またPhpStormのプラグインはないかと探してみましたが、いまのところはまだないようでした。

## その他

### デーモンを起動するときに解析対象になっていないファイルはPhanエラーのチェックがされない

デーモンを起動したあとに新規ファイルを追加したりリネームした場合はデーモンを再起動する必要があります。
また[ドキュメント](https://github.com/etsy/phan/wiki/Using-Phan-Daemon-Mode#known-bugs-and-limitations)にもあるとおり`git checkout`したときも同様です。

### デーモンの起動時間

解析対象ファイルが約10000で約30秒程度かかりました。
解析対象が少なければもう少し起動も速い。

### デーモンのメモリ使用量

400M程度

### phan_clientの実行時間

サンプルの`src/Sample.php`で1〜2秒程度
シンタックスエラーのときはこれより速い

## まとめ

* Phanをデーモンモードで起動しphan_clientを実行、結果を出力
* phan_clientの結果を使ってIDEやエディタとの連携が可能
* 新規ファイル作成や`git checkout`の際はデーモンの再起動が必要  
ここは若干面倒
* デーモンの起動は解析対象が大きいときはやや時間がかかる
* phan_clientの実行は速い
Go言語でWebサイトを作ってみる （5: ひとまずコード整理）

> すべての記事の一覧はこちら。
**Go言語でWebサイトを作ってみる：目次**
http://qiita.com/y_ussie/items/8fcc3077274449478bc9

「Go言語のWebフレームワーク「Echo」を使ってみる ④（Cookieを使用したセッション管理）」
http://qiita.com/y_ussie/items/00e542cb3531b48fd21a の続きです。

ちょっとEchoに関連する内容ばかりでもなくなってきましたのでタイトルを変えました。。
今回からは、Goを使ってWebサイトのサーバーサイドを一通り作ってみるというのをゴールにして進めてみようかなと思っております。

ということで、一旦ここまでのサンプルのコードを整理してみました。
特にmain部分は色々と記述が増えて大きいソースになってしまってましたので、今後定義が増えていきそうな部分は分割したりしております。

# コード全体構成

```
/
└─webserver
    │  handler.go  リクエストハンドラの定義
    │  server.go   サーバーのメイン処理
    │  static.go   静的ファイルパスの定義
    │  template.go HTMLテンプレートの定義
    ├─public     静的ファイル
    │  ├─css       CSSファイル
    │  ├─img       画像ファイル
    │  └─js        JavaScriptファイル
    ├─session    セッション関連の処理
    │      cookie.go          セッションCookie関連
    │      manager.go         セッションデータ管理（公開関数）
    │      manager_local.go   セッションデータ管理（非公開関数）
    ├─setting    設定関連の処理
    │      setting.go         設定データの定義
    └─templates  HTMLテンプレート
            error.html        エラーメッセージ画面
            index.html        index画面
            layout.html       共通レイアウト
```

上記のコード全体をGitHubに置きましたので、次回からはこちらを更新しながら進めていこうかと思います。
https://github.com/yoshinoyaussie/golang-website-sample


# 次回予定
前回までに作成したセッション管理の仕組みを使用してログイン機能を作ってみたいと思います。
6 VIRTUES AND BENEFITS OF GINGER

What are the main Ginger <a href=http://carob.co/wiki/%D8%A7%D8%B6%D8%B1%D8%A7%D8%B1-%D8%A7%D9%84%D8%B2%D9%86%D8%AC%D8%A8%D9%8A%D9%84/>bad effects</a> and benefits on helth and body.
<b>Good against nausea</b>
Several studies have shown that ginger has an antiemetic effect: it has the ability to prevent or stop nausea and vomiting. It can therefore be effective during pregnancy.

<b>Good for digestion</b>
Ginger stimulates the secretion of bile and thus allows faster digestion of food. So it helps digest the fat and is good for your line!

<b>Against fever, flu and allergy</b>
Ginger contains oleoresin consisting of shoagaol and gingerol which are excellent anti-inflammatories and which prevent and fight against fever, flu-like conditions and allergies.

<b>Relieves symptoms of osteoarthritis</b>
Ginger acts as a natural analgesic: it calms the pain that affects the joints in case of osteoarthritis and treats naturally chronic fatigue.

<b>Against sore throat</b>
Anti-inflammatory, ginger also serves to treat infections and inflammations of the throat.

<b>Good for the heart</b>
It helps to prevent cardiovascular disease and this because it is good for blood circulation. On the other hand, if you take medicines that already fluid your blood, it can be dangerous to drink. You should consult your doctor!
ライフスタイル☓テクノロジーを考える オープンセミナーvol.5


自分用にあとで調べるように気になったキーワードだけを、備忘録代わりで残しています。

### 主催

ウェブサイエンス研究会

### 団体の構造

人工生命学会<ウェブサイエンス<計算社会科学

### 講師陣

Tunnel株式会社 平山
博報堂 篠田
東大院総合文化研究科広域科学選考 池上高志教授

## ソーシャルネットワークにおけるコミュニティ構造の時間的発展

東大総合文化研究科 橋本康弘
	
サービスはどうデザインされ方向付けるのか？

## テクノロジーとは？
	語源 techne(ラテン語アートの語源) -> technique -> technology
	創作は poiesis(ポイエーシス

Martin Heidegger
> 技術への問い
> 用立て


Geoffrey Miller
> 2000年間で最大の発明はなにか？
>	マーケティング

マーケティングとは、人間性の未開の辺境がテクノロジーの腕力に出会う場である
-> 権力の逆転

広告とは多様性を破壊する
フィルターバブル
エコー・チェンバー

Karl Heinrich Marx
> 商品を理解しろ

松岡正剛
> マーケティングという用語がつまらない。早く変えなさい
	

## プロダクト・マーケティングの作用・反作用(相互に変化していく中での最適化)

Tunnel株式会社
	平山知宏
	@tom_piero

### CNN で部屋の分類タグ付け
	一致率 37%

Amazon Recognation Amazon MLを使い、ロジスティクス回帰で、違法アップロードされた画像を学習させてる

RoomClip としてのマーケティング定義
	RoomClip の価値を最適に人々に普及させる

### Facebook 広告最適化

デモグラフィックを元に最初はAIが最適化してくれる
	が、徐々にオプティマイザが劣化していく。
	この現象を焼き畑(ググっても出ない)と呼ぶ
	-> 結局人間が最適化する

### Google 検索最適化

成功例: 「男前インテリア」というワード
RoomClip 内の利用ユーザが、欧米でいう「ジャンクスタイル」を、
国内のユーザが「男前なインテリア」として利用しだして広がった。
google trend より先に発見して、サービスに活かせた。

結論は、プロダクト理解に努めて、プロダクトデリバリーを最適化し続ける

## 広告が一人ひとりに最適化された世界で生活者はどのように行動しているのか

博報堂DYメディアパートナーズ 篠田

DMPを用いて戦略ターゲットの規定から広告出稿までシームレスに。

### 学習モデル

DecisionTree
RandomForest
SVM
xgboost
FastBDT
LightGBM

1つのモデルだけではなく、上記を組み合わせてクラスタリングした結果の平均値などを出している

### 事例:神戸市観光ナビゲーション

最適な観光案内を行うシステム

精度と新規性(セレンディピティ)のトレードオフによって行動させる
	閉ざされた広告(バブルフィルタ)
	開かれた広告(意外性)

どのように可視化すべきか
	静的探索型(BIツール)
	動的探索型(人間が議論する)

未来を考えて、広告に触れなかったまたは触れたけど購買に至らなかったユーザを最適化したい
	AISAS のA(認知),I(興味)の部分は、データがない

神戸の観光者が年々増加している
	神戸観光サイト 117%増
	感想
		投下した広告効果としてはROIが低い？

広告の最適化
	その人に何が必要なのか認知させる

## Shopable stores... unplanned purchases

東大院総合文化研究科広域科学選考 池上高志教授

裏テーマは、AI/AdTec へのアンチテーゼ？

Libet の0.5秒(意識の生まれる時間)
	商品を選択する時には、決定してから動くのではなく、
	考えながら手をのばす。
	実は自由意思とは何かをしなかった時に発生する

ダメット酋長の踊り
	行動との因果関係はないのに、酋長は因果関係があると思い込む
	参考 http://10mtv.jp/pc/content/detail.php?movie_id=1622

spooky link
Bellの不等式の破れ
量子力学の世界
	非局所性という遠隔作用が発生する

Strong Free Will Theorem
	素粒子に自由意志が存在しないのなら、人間にも自由意志は存在しない

Jensen Shannon Divergence
	RoomClipの例: タグの関連性をネットワーク図にした
	タグを大量につけている人の方が新規タグを作りやすい

## 感想&結論

人間が自由意志で選択していると感じても最適化された AI が提供するサービスを無意識に享受する世界になる。
だけど、それが本当に幸福の世界なのか？
 -> 哲学の世界
匿名関数で追加したボタンのイベント通知を削除する

#環境
Unity5.6.1f1

#概要
ボタンのonClickに登録した匿名関数をRemoveAllListeners()で全削除するのではなく、個別に削除します
匿名関数でなくても使えるし、OnClick以外のイベントにも使えます
#プログラム

~~~c#
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;

public class TestUnityEvent : MonoBehaviour
{
	[SerializeField] private Button[] _buttons = null;
	private struct EventParam
	{
		public UnityAction action;
		public UnityEvent unityEvent;
	}
	private List<EventParam> _eventParams = new List<EventParam>();

	private void OnEnable()
	{
		for( int i = 0; i < _buttons.Length; i++ )
		{
			var button = _buttons [ i ];
			var index = i;

			var param = new EventParam()
			{
				unityEvent = button.onClick
			};
			button.onClick.AddListener( param.action = () => OnButtonClick( button, index ) );
			_eventParams.Add( param );
		}
	}

	private void OnDisable()
	{
		for( int i = 0; i < _eventParams.Count; i++ )
		{
			var param = _eventParams[ i ];
			param.unityEvent.RemoveListener( param.action );
		}
		_eventParams.Clear();
	}

	private void OnButtonClick( Button button, int index )
    {
		Debug.Log( button.name + ":" + index );
    }
}
~~~
これさえ知っていれば大丈夫。WordPressで覚えて置くべき条件分岐

# 条件式

``` sample.php
// A and B
&&

// A or B
||

// not
! 
```

# 指定
``` sample.php
// ホームページ
is_home

// フロントページ
is_front_page()

// 投稿ページ
is_single()

// 固定ページ
is_page()

// カテゴリー
in_category()

// スマホのみ表示
wp_is_mobile())
```

# 記事指定
``` sample.php
// 記事単数
if(is_single('1')) 

// 記事複数
if(is_single(array(1, 2, 3, 4)))

// 1でない全ての投稿ページ
if(! is_single('1')) 
```
# 取得
## カテゴリー名

``` sample.php
// リンク付き
<?php the_category(); ?>

// リンクなし
<?php $cat = get_the_category(); $cat = $cat[0]; { echo $cat->cat_name; } ?>
```

# 条件分岐
## すべての投稿ページ、もしくは固定ページA,Bで表示する
``` sample.php
<?php if(is_single() || is_paged(array('A','B')) ): ?>
投稿ページ、もしくは固定ページA,Bで表示する
<?php else: ?>
それ以外で表示する
<?php endif; ?>

```

## スマホでA、PCでBを表示する
``` sample.php
<?php if(wp_is_mobile()): ?>
A
<?php else: ?>
B
<?php endif; ?>
```

# カスタムフィールド
カスタムフィールド（フィールド名：cf-lead）を取得

``` sample.php
<?php $imgid = get_field('cf-lead'); ?>
<?php if (empty($imgid)): ?>
<?php else: ?>
    <div><?php the_field('cf-lead'); ?></div>
<?php endif; ?>
``` 

# 応用

## スラッグで子ページが親ページを判断できるようにする

wordpressにおいて、ページについては一律で子ページ扱いになり、所属している親に対しての条件分岐は標準ではできません。

以下のように記述することで、分岐できるようになります。

``` function.php
function is_parent_slug() {
    global $post;
    if ($post->post_parent) {
        $post_data = get_post($post->post_parent);
        return $post_data->post_name;
    }
}
```

``` sample.php
<?php if (is_page('hoge') || is_parent_slug() === 'hoge') { ?>
    スラッグが hoge ならtrue
<?php } ?>
```
macでphpenvとphp-buildでPHP環境を作るときに入れた依存パッケージ

新しいmacを買ってphpの環境を整えたときに思いのほかphpenvの環境を作るのに苦労したので残しておきます

## phpenvのインストール

```bash
git clone https://github.com/CHH/phpenv.git
cd phpenv/bin
./phpenv-install.sh
```
~/.bashrcに以下記載

```bash
export PATH="/Users/uenoryouichi/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
```

## php-buildのインストール

```bash
git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
```

## 【主題】phpenv install x.x.x で必要になったパッケージ

installのコマンドがコケる

```bash
phpenv install 7.1.6

-----------------
|  BUILD ERROR  |
-----------------

-----------------------------------------
configure: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: ).
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: OpenSSL version 1.0.1 or greater required.
-----------------------------------------
とか
-----------------------------------------
configure: error: jpeglib.h not found.
-----------------------------------------
とか
-----------------------------------------
configure: error: png.h not found.
-----------------------------------------
```

```bash
# ネットからこれ入れておけ的パッケージ群
brew install gcc re2c libmcrypt autoconf automake libiconv

# bison
$ brew install bison
$ brew link --force bison

# openssl （libxmlも入れないといけないのでハマった)
$ brew install openssl
$ brew install libxml2
$ brew link --force openssl
$ brew link --force libxml2

# jpeg
$ brew install jpeg

# png
$ brew install libpng

# icu4c
$ brew instal icu4c
$ brew link --force icu4c
```

晴れてインストール

```bash
$ phpenv install 7.1.6
...
[Success]: Built 7.1.6 successfully.

$ phpenv versions
$ phpenv global 7.1.6
$ php -v
PHP 7.1.6 (cli) (built: Jun 17 2017 00:01:18) ( NTS )
```
Electron環境構築ログ


## node.js更新

`nodebrew install-binary stable`

```sh
$ nodebrew ls
 v5.0.0
 v7.7.4
```

## electronインストール

`npm -g install electron-prebuilt`

## プロジェクト作成
```
$ mkdir electron-example
$ cd electron-example/
$ npm init -y
```