OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのフレームワーク　Slim入門

#[Slim](https://www.slimframework.com/)とは
PHPのマイクロフレームワークの一種であり、
HTTPリクエストを受け取って、適切なコールバックを呼び出し、HTTPレスポンスを返す。

#マイクロフレームワークとは
機能は最低限しかないが、インストールや使用するコストの低いフレームワークのこと。
Slimの他にはSilexやLimonadeなどが存在する。

マイクロフレームワークの逆はフルスタックと呼ばれる。
フルスタックは学習コストが高いが、それ一つで必要な機能がすべて揃っているフレームワークのこと。
LaravelやCakePHPなどが存在する。

#どうやって使うか？
##まずは一つ具体例
###get()メソッド
```php
$app = new \Slim\Slim();
$app->get('/hoge',function($request, $response, $args){
  echo "hogehoge";
});

$app->run();
```
すごく簡単に書くとこんな感じ。
get()メソッドの引数は2つ。
第一引数:ルートパターン　'/hoge'
第二引数:ルートコールバック　　function(){ echo "hogehoge"}

この場合、/hogeにgetでリクエストがあった場合に echo "hogehoge"となる。

###get以外のリクエストの場合にはどうするか
$app->get()をpostの場合はpost,deleteの場合はdeleteに変更すればOK
すべてのHTTPリクエストメソッドに処理ルートを追加するにはany()を使用する。

```php
$app->any('/hoge', function($request, $response, $args){
　 echo "hogehoge"
});
```
これで/hogeにgetやpostなどのHTTPリクエストがあった場合にecho "hogehoge"となる。


##ルートパターンについて詳しく
ここで説明する部分は$app->get('/hoge',function(){});の'/hoge'の部分
###プレースホルダ

```php
$app->any('/search/{id}', function($request, $response, $args){
```

例えば検索結果の表示をする際、/searchの後に検索対象のidがつく場合などに使用できる。
{id}の値は第三引数の$argsに値が含まれている。


###オプション
オプションは、あってもなくても同じ挙動にしたい時に使用するもの。
例えば'/hoge'と'/hoge/'のように末に/があってもなくても同じにするには[]でくくる。

```php
$app->any('/hoge[/]', function($request, $response, $args){
$app->any('/hoge[/{id}]', function($request, $response, $args){
```

###グループでくくる

```php
$app = new \Slim\App();
$app->group('/users', function () {
    $this->any('/hoge', function ($request, $response, $args) {
        echo 'hogehoge';
    });
    $this->any('/fuga', function ($request, $response, $args) {
        echo 'fugafuga';
    });
});
```
/hogeも/fugaも/users配下にある場合
「/users/hoge」「/users/fuga」と書かずに
```$app->group('/users', function () {```
を使用してグループでまとめることができる。



###

##ルートコールバックについて簡単に
ここで説明する部分は$app->get('/hoge',function(){});のfunction(){}の部分
###コールバックの引数は3つ

```php
function($request, $response, $args){}
```
第一引数:Psr\Http\Message\ServerRequestInterface現在のHTTPリクエストを表すオブジェクト
第ニ引数:Psr\Http\Message\ResponseInterface現在のHTTPレスポンスを表すオブジェクト
第三引数:現在のルートの名前のプレースホルダの値が含まれている連想配列

```php
$app->any('/search/{id}', function($request, $response, $args){ // {id}の値が10だとしたら
    echo $args['id']; // 10
});
```
brew editしたファイルをロールバックする

## 課題：Formulaのファイルの位置がわからない

homebrewでインストールするpostgisの依存関係を変更しようとして、`brew edit postgis`を行ったのですが、結局うまくいかなかったので戻そうとしたのですが、`git reset --hard HEAD`したいのに、どこにファイルがあるかわかりませんでした。

## 解決：viでファイルパスを表示する

この方法はhomebrewのエディタがviの場合の話なので、その点はご容赦ください。

まずはviでpostgisのFormulaのファイルを開きます。

```bash
brew edit postgis
```

その後、viのコマンドラインモードで以下を入力します。

```vim
:echo expand("%:p")
```

これは、現在のファイルのフルパスを出力する命令です。
すると、以下のように表示されました。

```
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/postgis.rb
```

あとは、`:q`でviを終了し、

```bash
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
git reset --hard HEAD
```

を実行して元に戻して終わりです。
Slackで未読messageの一覧（ALL UNREADS）

多分、既出だと思いますが...メモ程度に...

Slackでチャンネルが多くなってくると、未読メッセージを読むのに各チャンネルを開いて...
めんどくさい...

そこで、`ALL UNREADS機能`

## ALL UNREADSの表示

`Slack -> Preferences... -> Advanced -> Channel List -> Turn on All Unreads`にチェックするだけです

![スクリーンショット 2016-11-25 14.33.52.png](https://qiita-image-store.s3.amazonaws.com/0/150615/cc0fe4a1-80c4-d3f8-3888-d6cdf4b811d3.png)

チェックすると左上の`channel`の上に`ALL UNREADS`が作られます

![スクリーンショット 2016-11-25 14.27.24のコピー.png](https://qiita-image-store.s3.amazonaws.com/0/150615/b1e1ee43-d542-c157-6862-26b40c9b6cd9.png)

そこから開くと

![スクリーンショット 2016-11-25 14.27.24.png](https://qiita-image-store.s3.amazonaws.com/0/150615/e0ce4d67-cacb-432d-aaa8-b32df9f64410.png)

こんな画面が出ます
`New Message`をクリックすると見れます！

## 既読にする
`Mark As Read`をクリックでできます！
![スクリーンショット 2016-11-25 14.37.18.png](https://qiita-image-store.s3.amazonaws.com/0/150615/75a50616-6f08-4cf6-57e8-6a300b84ee4b.png)


## 参考
http://tsumuchan.hatenablog.com/entry/2016/09/16/094244
Google Play services out of date

アプリを走らせるとこんな感じのログ（エラーではない）が出る。

```
Google Play services out of date.  Requires 9080000 but found 8489470
Failed to connect to remote ad request service.
```

同時に「google play 開発者サービスの更新が必要です」というダイアログも表示される。自分の場合はGoogleMapAPIを使っていたのだけど、そこの処理がうまくいっていなかった。

### 環境
- AndroidStudio 2.2.2
- AVDManagerから立ち上げたエミュレータ

### 解決法
更新したいけどエミュレータなのでPlayStoreからの更新はできない。なので、AndroidStudioのSDKManagerからGoogleAPIｓとGoogleAPIsSystemImageを入れる。

SDKManagerを開いて、
Appearance & Behavior > System Settings > Android SDK
を開く。
SDKPlatformsタブでから「Show Package Details」をクリックする

<img width="986" alt="スクリーンショット 2016-11-25 14.27.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/2164/ea10248f-2684-b29d-8fed-2a76d7b21423.png">

画像の赤枠内のGoogleAPIｓとGoogleAPIsSystemImageをチェックしてインストール（インストール後に撮ったので、画像内ではインストール済みになっている）。SystemImageはAVDのImageと同じものを指定すればいい。

これでインストール後にエミュレータを再起動すればログが消えているはず。

### 何故出たのか
AVDManagerからあたらしいVirtualDeviceを作成した時、それまでx86のSystemImageを使っていたけど、x86_64のものをダウンロードして使ったからじゃないかと推測。
docker service updateでlog-optを更新する

`docker service update`で`--log-opt`を更新したい場合、`--log-driver`オプションも同時に指定しないと反映されないようだ。

例）

```
docker service update --log-driver=json-file --log-opt max-file=3 --log-opt max-size=10M
```

docker-1.12.2
Vagrantで仮想開発環境を作る(CentOS/LAMP)

# 前提
* Vagrantの使い方は知ってる
* LAMP知ってる
* CentOS

# VagrantでVMの起動と接続

## 1.`Vagrant up`

```rb:Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.2"
  config.vm.network "forwarded_port", guest: 80, host: 8080
end
```

## 2.`vagrant ssh`と`su -`

初期パスは`vagrant`

# Apacheインストールとアクセス確認
## 1.`yum -y install httpd` そして `httpd start`

これで`http://www.example.com`にアクセスすればつながるんじゃないの :clap:

:skull_crossbones: 「つながんない」

## 2.`vi /etc/httpd/conf/httpd.conf`

```:httpd.conf
#ServerName www.example.com:80
```

↓

```:httpd.conf
ServerName localhost:8080
```

## 3. `httpd restart`

`http://localhost:8080/`でつながった :tada: 

## 補足: `chkconfig httpd on`
これで、VM起動時にサーバーも立ち上がってくれるので便利そう

# MySqlのインストールと動作確認
## 1. `rpm -ivh htt～～`
```
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
```
これいまいちわかってない。先にやっとかないといけないらしい。
## 2. `yum install -y mysql-community-server`
インストール
## 3.`mysql --version`
確認

## 補足：セットアップ
多分この後接続のためのセットアップしなきゃならんと思う
http://qiita.com/ksugawara61/items/336ffab798e05cae4afc


# PHPのインストールと動作確認
## 1. `yum -y install php`

## 2. `php -v`
これが出て終わり
```
PHP 5.4.16 (cli) (built: Aug 11 2016 21:24:59)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```

# 引き続く？
バッチ（*.bat）からC#のコンソールアプリケーションを実行する。

# 概要
バッチ（*.bat）からC#で書いたソースコードを実行したい場合の手順を記す。

## 要件
- バッチファイルからC#に引数を渡せること
- ログファイルが出力できること
- C#からバッチファイルにリターンコードを返却できること

# 手順
## 1.Visual Studioでコンソールアプリケーションを新規作成する。

Visual Studioの基本的な操作なので、ここの説明は省きます。

## 2.コンソールアプリケーションに以下の様なソースを書く。

```csharp:Program.cs
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            var returnCd = 0; // リターンコード

            // ログファイル
            using (StreamWriter log = CreateLog())
            {
                // 引数が無い場合はエラーとする
                if (args.Length == 0)
                {
                    log.WriteLine("args is null.");
                    returnCd = 1; // リターンコードに1をセットする。
                }
                // 引数が有る場合は引数をログに出力し、処理を終了する
                else
                {
                    // 引数で渡された値をひとつずつログに出力する。
                    for (int i = 0; i < args.Length; i++)
                    {
                        log.WriteLine(args[i]);
                    }
                }
            }
            System.Environment.Exit(returnCd); // リターンコードを返却しながら終了する。
        }

        /// <summary>
        /// ログファイルを生成して返却します
        /// </summary>
        /// <returns>ログファイル</returns>
        private static StreamWriter CreateLog()
        {
            // Create a writer and open the file:
            StreamWriter log;

            if (!File.Exists("C:\\logfile.txt"))
            {
                log = new StreamWriter("C:\\logfile.txt");
            }
            else
            {
                log = File.AppendText("C:\\logfile.txt");
            }
            return log;
        }
    }
}

```

### 処理内容のざっくり説明
1. ログファイルを生成する。
2. 引数が無い場合は"args is null.とログに出力し、"リターンコード1で終了する。
3. 引数が有る場合は引数で渡された値をひとつずつログに出力し、リターンコード0で終了する。

## コンソールアプリケーションをビルドする。

ビルドした結果に生成されたexeファイルは設定の応じて以下のどちらかのフォルダにあります。

>%userprofile%\Documents\Visual Studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\bin\Release

>%userprofile%\Documents\Visual Studio 2015\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug


## バッチファイルにて以下のコマンドでコンソールアプリケーションを実行する。

```bat
start /wait ConsoleApplication1.exe "パラメータ1" "パラメータ2" "パラメータ3"
echo %ERRORLEVEL% -> 0
```

今回のケースでは引数を渡さなかった場合、%ERRORLEVEL%は1が返却されます。

ちなみに、startコマンドのwaitオプションはアプリケーションの起動後に終了するまで待機するとのことです。

以上です。

ログファイルを見てみると、以下の様にログがちゃんと出力されていました。

```text:logfile.txt
パラメータ1
パラメータ2
パラメータ3
```

***

C#バッチでDB参照やDB更新をする場合は、このコンソールアプリケーションが便利だと思うのですが、日本語の情報があまりなかったのでまとめておきました。

なお、実際の業務で使う場合は、ログ周りをもう少し検討する必要があると思います。
Rubyでランダムドットステレオグラム(RDS)を作成するライブラリ

#Rubyでランダムドットステレオグラムを作るよ！

##何が出来るか
Rubyでランダムドットステレオグラム(RDS)を作成することが出来ます。
グレースケールの深度マップ(デプスマップ)と出力サイズを指定するだけで、簡単にRDSを作成することが出来ます。

※RDSとは、一見ノイズのようにしか見えないが、裸眼立体視可能な画像のこと。
参考:[ランダム・ドット・ステレオグラム(Wikipedia)](https://ja.m.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%83%AC%E3%82%AA%E3%82%B0%E3%83%A9%E3%83%A0#.E3.83.A9.E3.83.B3.E3.83.80.E3.83.A0.E3.83.BB.E3.83.89.E3.83.83.E3.83.88.E3.83.BB.E3.82.B9.E3.83.86.E3.83.AC.E3.82.AA.E3.82.B0.E3.83.A9.E3.83.A0)

##使い方
ライブラリ`RDSImageCreator.rb`を読み込み、出力幅(必須)、出力高さ(必須)、パターン長、深度階調を指定してインスタンスを作成してください。
`createメソッド`に深度マップをパスで指定すると、RDS画像が得られます。
RMagickライブラリのMagick::Image型でRDS画像が出力されますので、`writeメソッド`に出力パスを指定すると、RDS画像を書き出すことが出来ます。

```ruby:createRDS.rb
require "./RDSImageCreator.rb"

rdsCre = RDSImageCreator.new(700, 500, 100, 20)
rdsImg = rdsCre.create("./depthMap.png")
rdsImg.write("./rds.png")
```

※`createRDS.rb`と同じディレクトリに`RDSImageCreator.rb`と`depthMap.png`が配置されている前提のコードです

##前提条件
開発環境にRMagickがインストール済みであることが必要です。

##ライブラリソースコード
https://github.com/dslerx/dev/blob/master/RDSImageCreator.rb
※MITライセンスで公開

##サンプル
↓これをインプットに処理すると・・・
![spark.png](https://qiita-image-store.s3.amazonaws.com/0/150996/1d8dea1f-9fcc-333c-503e-7a47f673f74b.png)

↓これが作成できます！
![rds_sample.png](https://qiita-image-store.s3.amazonaws.com/0/150996/27b8c1d1-afed-77d6-aee2-034d99131407.png)

##備考
過去にSparkプロジェクトで公開した「SirdsAS3」のRuby版になります。
[SirdsAS3ライブラリ - Sparkプロジェクト](http://www.libspark.org/wiki/SirdsAS3)
PHP のバージョンを気にする

投稿日：2016-11-25

# PHPのバージョンを気にしてみる
そろそろ7.1が出るらしいので
そもそも今のバージョンの状況とか気にしてみる

# いまPHPで環境構築するなら何がいい？
PHP 5.5 以前の公式サポートはセキュリティサポートも含め既に終了
5.6 か 7.0 もうすぐ7.1がリリース予定
サポート期間は5.6の方が少し長い（2018/12/31まで）けれど
新規なら今後を考えて7.0で行きたいところ

# 7.1 のリリースはいつ？
2016/12/1 にGA（General availability）予定

# 参考リンク
[Supported Versions](http://php.net/supported-versions.php)

[PHP 5.5.x から PHP 5.6.x への移行](http://php.net/manual/ja/migration56.php)

[PHP: todo:php71](https://wiki.php.net/todo/php71)

[PHPのリリース日とサポート期限](http://qiita.com/bezeklik/items/72d1ff8393f66673e2bc)
jq コマンドの出力結果を色つきで less に表示するrubyスクリプト

### 発端
小ネタ。
jq の結果を色つきlessで表示したいなーと思って検索したら
http://qiita.com/hawaku/items/973eaf4261199c2dcc89
にあったので、使ってみた。

```zsh
cat hoge.json | jq '.' -C | less -R
```

こりゃいいや、と思ったんだけど、ふと以下のように感じた

- いちいち書くと長いから簡略化したい
- ファイル名やフィルターの文字列は、コマンドの引数としたい

### 改善：コマンドっぽく使えるようにしてみたい

ということで

```ruby:colored_jq_less.rb
file   = ARGV[0]
filter = ARGV[1] || "."
system("cat " + file + "|jq " + filter + " -C|less")
```

これを `~/.script/`というフォルダを作って、そこに置いた。
また、自分は `~/.zsh_aliases` というファイルにエイリアスを書いているので、そこに下記のように記述。

```zsh
alias jqless='ruby ~/.script/colored_jq_less.rb'
```
### 結果

```zsh
$jqless sample.json .filter.chain
```
とかで使えるようになった。満足。
ffmpegで複数動画ファイルを一括変換するShellscriptを書いたのでメモ

#要約
* Ubuntuにffmpegをインストールして動画のHz変換をした. 
* たくさんあるファイルをコマンド一発で変換したかったので, そのためのShellScriptを書いた.
* [Gist](https://gist.github.com/shunchan0677/5cd8d3fc3f930c47151041f6bbc0649d)にあげた

#やったこと
動画をCNNで機械学習させるため, 30Hzの動画を10Hzに加工して, 画像として切り出したかった. そのためにまず動画のダウンサンプリングをした.   

動画を扱うUbuntuのソフトとしてffmpegが有名なようなので, それをダウンロードして使った. 
　　
動画のファイルがたくさんあっていちいちコマンドを打つのが大変めんどくさいのでShellSprictを書いてコマンド一発で動くようにした. 

#ffmpegのインストール
Qiitaを参考にコマンド3つで簡単インストール.
コマンドは以下.

`$ wget http://johnvansickle.com/ffmpeg/releases/ffmpeg-release-64bit-static.tar.xz` 
`$ tar xvf ffmpeg-release-64bit-static.tar.xz`
`$ sudo cp ./ffmpeg-release-64bit-static/ffmpeg /usr/local/bin`


参考：[Ubuntu 14.04 で最新の ffmpeg を簡単かつクリーンにインストールする方法](http://qiita.com/yayugu/items/d7f6a15a6f988064f51c)

#Shellscriptのコード
今回は「そもそもShellScriptって何だよ」というところから始めたのでちょっと大変だった. でもこれを学んでおいて本当に良かったと思う. Script書いて放置でいいので, 作業の捗り度が本当に段違い. もっと早く, できればUbuntuインストールと同時くらいで学びたかった.
  
書いたScriptはこちら.

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

for FILE in */*.avi
do
    FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`
    ffmpeg -i ${FILENAME}.avi -r 10 -qscale 0 ${FILENAME}_10Hz.avi
done
```

参考
* [ファイルサーバーだけど、色々させていきたい。（ffmpeg編）](http://qiita.com/ftakebayashi/items/ea3ad7021d777e9db9b3)
* [初心者向けシェルスクリプトの基本コマンドの紹介](http://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337)

#コード解説
**#!/bin/sh**

```bash:Hz_changer.sh
#!/bin/sh
```
このファイルがShellsprictファイル(.sh)であることを示す.

**ファイル参照とループ処理**

```bash:Hz_changer.sh
for FILE in */*.avi
do
#何らかの処理
done
```
○○という名前の1階層下のディレクトリにある○○.aviというファイルを探してきて, そのファイルすべてに何らかの処理を実行.
見つけたファイル名は順番にFILEに書き込まれ, ループ処理をする.

**取得したファイル名から拡張子を削除**

```bash:Hz_changer.sh
FILENAME=`echo ${FILE} | sed 's/\.[^\.]*$//'`
```

.aviファイルを見つけてきたはいいものの, 変換後のファイルを違う名前で保存したいので拡張子部分.aviを取り除く.
また.shファイルのルールとして以下がある.

* 変数を呼び出す時は${}で囲う. 
* echoなどコマンドラインに結果を出力するようなコマンドの結果を代入するときは``で囲う.  

**ffmpegで動画変換**

```bash:Hz_changer.sh
ffmpeg -i ${FILENAME}.avi -r 10 -qscale 0 ${FILENAME}_10Hz.avi
```

動画変換部分. -iの後が読み込みたいファイル名 -r がHz指定である.
今回は読み出したファイル名+_10Hz.aviを書き出すという使い方になっている.
ちなみにここを変更するだけで動画から画像の切り出し等, 様々な動画加工を行える. 

参考:[ffmpegの使い方](http://tech.ckme.co.jp/ffmpeg.shtml)

#実行方法
このスクリプトがあるフォルダに移動して
`bash Hz_changer.sh`

またこのファイルはディレクトリの構成として

* Hz_changer.sh  
* dir1
    * video1.avi
    * video2.avi
* dir2
    * video1.avi
    * video2.avi
    * video3.avi　　

のような感じを考えて作られている. ディレクトリ構成によってFILE読み出し部分は適宜修正が必要.

#実行結果
上のような構成に対して実行すると

* Hz_changer.sh  
* dir1
    * video1.avi
    * video1_10Hz.avi
    * video2.avi
    * video2_10Hz.avi
* dir2
    * video1.avi
    * video1_10Hz.avi
    * video2.avi
    * video2_10Hz.avi
    * video3.avi
    * video3_10Hz.avi

こんな感じになると思う.
自分はさらにこのあとほぼ同じような処理で画像に切り出すのでこれでよかったが,別ファイルに保存したい場合はmkdirコマンドで新しくディレクトリを作って, mvコマンドなどで移動させると良いと思う.

#終わりに
ShellScript有能すぎるのでこれからもどんどん使っていきたい.
C++ Builder XE4, 10.2 Tokyo > 他ソフトのボタンをクリックする (座標固定版)

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)
```

他のソフトのボタンをクリックしたい。
座標に基づく方法を実装してみた。


参考 http://delphi.xcjc.net/viewthread.php?tid=48990

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::App_clickButton(String fullCaption)
{
	HWND appHwnd;

	appHwnd = FindWindowEx(NULL, NULL, NULL, fullCaption.c_str());
	if (appHwnd == NULL) {
		return;
	}

	SetForegroundWindow(appHwnd);

        // ソフトのウィンドウを最大化することで、ボタン位置を同じ場所に来るようにする
	keybd_event(VK_LWIN, 0, 0, 0);
	keybd_event(VK_UP, 0,0,0);
	keybd_event(VK_LWIN, 0, KEYEVENTF_KEYUP, 0); // これがないと押したままになる

        // 左クリック
	SetCursorPos(200, 100);
	mouse_event(MOUSEEVENTF_LEFTDOWN, 0,0,0,0);
	mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); // これがないと押したままになる
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	App_clickButton(L"TargetSoft");
}
```

"TargetSoft"というキャプションのソフトに対して、座標(200,100)にあるボタンをクリックできた。

TargetSoftにおいては、最大化をした時のボタンの位置が常に(200,100)に来るような実装になっているという前提がある。

TargetSoftのボタン配置が変わったり、OSの変更でメニューバーの表示状況が変わったりした場合にボタンの位置がずれると、動作しなくなる可能性がある。

ショートカットキーが用意されているソフトの場合はショートカットキーを使う方が良いだろう。

### 関連

- [c++ builder XE4, 10.2 Tokyo > マウス座標を取得する](https://qiita.com/7of9/items/1e8449df7a6a7314ab30)
【PHP】PHP と Zend Engine のバージョン

今まで PHP のバージョンと Zend Engine のバージョンの関連性についてよく理解していませんでした。
[Zend Engine - Wikipedia（日本語）](https://ja.wikipedia.org/wiki/Zend_Engine) を確認しましたが、詳細がなかったので少し調べてみました。

Zend Engine のバージョンは大別すると Zend Engine 1 と Zend Engine 2 と Zend Engine 3 があります。
自分の環境の Zend Engine のバージョンを調べるには [phpinfo](http://php.net/manual/ja/function.phpinfo.php) または [zend_version](http://php.net/manual/ja/function.zend-version.php) で確認できます。

```php:PHP：phpinfo
<?php
phpinfo();
```

```php:PHP：zend_version
<?php
echo zend_version();
```

Zend Engine のバージョンは、PHP自体のソースコードに記述されています。
PHP自体のソースコードは [GitHub（php/php-src）](https://github.com/php/php-src) から確認できます。
`php-src/Zend/zend.h` の `ZEND_VERSION` に Zend Engine のバージョンが記述されています。
[GitHub画面](https://github.com/php/php-src)の左上にある 「Branch:master」 からPHPのバージョンを選択できるので、バージョン別のソースコードを閲覧することも可能です。
Zend Engine のバージョンとPHPのバージョンはリンクしています。
Zend Engine の歴史についての詳細は [ここ](https://thinkit.co.jp/free/article/0705/7/1/) に書かれていますが、一部引用します。

> Zend Engineは、1999年に発表され、他の新機能と共にPHP 4.0として2000年5月にリリースされました。新機能には、2バイトコードの対応も含まれており、正式に日本語対応が行われました。
>
> ちなみに1999年にAndi GutmansとZeev Suraskiは、Zend Technologies Ltdを設立し、Zend Engineをコミュニティに無償で提供しています。ここでは、Zend Engineと連係してPHPを拡張する様々な製品の提供を行っています。
> 
> そして、オブジェクト指向の実装強化をはじめとした新機能を搭載したPHP 5.0が2004年7月に公開されました。PHP 5.0には、「Zend Engine Ⅱ」が搭載され、高速性をはじめとした根幹を支えています。
> 
> 引用：[第１回：意外と知らないZend Engine](https://thinkit.co.jp/free/article/0705/7/1/)

Zend Engine 1 と Zend Engine 2 に関しては引用の通りです。
PHP7 から Zend Engine 3 になっております。
PHP と Zend Engine のバージョンは下記の通りです。

|リリース|PHPのバージョン|Zend Engineのバージョン|
|:--|:--|:--|
|2000年05月|PHP 4|[Zend Engine 1](http://php.net/manual/ja/internals2.ze1.php)|
|2004年04月|PHP 5|Zend Engine 2|
|2015年12月|PHP 7|Zend Engine 3|

ご覧の通り、PHPのメジャーアップデートに伴い、Zend Engine もバージョンアップしているのがわかります。
PHP と Zend Engine はメジャーバージョンがリンクしているということがわかりましたが、 [GitHub（php/php-src）](https://github.com/php/php-src) でPHPのソースコードを確認してみると、どうやらマイナーバージョンもリンクしているみたいです。
PHP と Zend Engine のバージョン一覧を ッターン! と取得できる方法があるのかもしれませんが、わからないのでGitHubにあるソースコードを一つ一つ確認しました。
ちなみに、PHP4のソースコードはGitHubにないので調べてません。

|PHPのバージョン|Zend Engineのバージョン|
|:--|:--|
|PHP 5.0|Zend Engine 2.0.5|
|PHP 5.1|Zend Engine 2.1.0|
|PHP 5.2|Zend Engine 2.2.0|
|PHP 5.3|Zend Engine 2.3.0|
|PHP 5.4|Zend Engine 2.4.0|
|PHP 5.5|Zend Engine 2.5.0|
|PHP 5.6|Zend Engine 2.6.0|
|PHP 7.0|Zend Engine 3.0.0|
|PHP 7.1|Zend Engine 3.1.0-dev|

ご覧の通り、PHP と Zend Engine のマイナーバージョン（2桁目）もリンクしているようです。

余談ですが、2016年11月25日現在 [Zend Engine - Wikipedia（日本語）](https://ja.wikipedia.org/wiki/Zend_Engine) に記載されている Zend Engine の最新バージョンは `2.4.0` となっております。
PHP と Zend Engine のマイナーバージョンはリンクしているので、Wikipediaの記事は PHP5.4 のときに更新されたのではないかと推測することができます。

# note

note でも記事を公開してるので、興味がある方はご覧ください。

・[【初学者向けコードリーディング】 PHP の TODO アプリのコードを一緒に読み解こう](https://note.mu/7968/n/n46a8beb87c93)
初心者用：GitHubにファイルをアップロードする方法（超基本）

■やりたいこと
　・自分のパソコンで、製作したものを、githubにアップロードする。


■使うもの
 mac os
 terminal
 アップロードしたいもの
 Github←アカウントは作成しておいてください
 

■そもそもGitHubとは

自分が作った物のバージョン管理をしたり、他人と共有して、共同開発するために使われる

詳しくはwikipediaさんに聞きました。

> GitHub（ギットハブ）はソフトウェア開発プロジェクトのための共有ウェブサービスであり、Gitバージョン管理システムを使用する。 Ruby on RailsおよびErlangで記述されており、GitHub社によって保守されている。 主な開発者はChris Wanstrath、PJ Hyett、Tom Preston-Wernerである。 GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供している。 2009年のユーザー調査によると、GitHubは最もポピュラーなGitホスティングサイトとなった。

>　参照 https://ja.wikipedia.org/wiki/GitHub　


■アップロードするものを用意
 *GithubTest*というファイルを作成しました。
![スクリーンショット 2016-11-25 12.17.11.png](https://qiita-image-store.s3.amazonaws.com/0/150745/2d0b5f4d-2f10-d830-270a-4cc97d967ab7.png)

■Githubにて、アップロード先をつくる。（アカウントは作っておいてください）

↓下記の「New repository」ボタンをクリック

![スクリーンショット 2016-11-25 12.22.45.png](https://qiita-image-store.s3.amazonaws.com/0/150745/2d08a53c-3226-2d19-f356-0e628e3d0e9a.png)

任意のレポジトリ名を記入。ここでは、[githubTest]と、しました。

![スクリーンショット 2016-11-25 12.23.02.png](https://qiita-image-store.s3.amazonaws.com/0/150745/bdd0a698-646c-b40d-faf5-0b5b9a67d7f2.png)

「Description」では、アップロードするファイルの簡単な説明を加えたらいいと思います。
ここでは、「ファイルをアップロードするテキスト」としました。

publicか、privateですが、これは文字通り、公開するか否かの設定です。
※privateだと、有料会員になる必要があります。

![スクリーンショット 2016-11-25 12.23.52.png](https://qiita-image-store.s3.amazonaws.com/0/150745/53cb982b-9d95-7257-e667-11acb34f6017.png)

すると、下記のようなページが出てくると思います。

![スクリーンショット 2016-11-25 12.33.46.png](https://qiita-image-store.s3.amazonaws.com/0/150745/e3cf68c5-4672-ec15-e269-0465d1101aa0.png)


これにて、アップロード先の準備は完了です。

■いよいよ自分の作ったものを、先ほどのページへアップロードする

 ・「ターミナル」を起動する


 ・ターミナル上で、アップロードしたいファイルの場所へ、移動する。ファイルをドラッグすれば比較的簡単です。

 `＄ cd [アップロードしたいファイルをドラッグします]`

![スクリーンショット 2016-11-25 12.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/150745/900e103b-2d8e-5694-d8cc-d9f8a5373de0.png)

立て続けに以下のコマンドを叩いていきます。

`$ git init`
*ファイル内をgitで管理可能にする*

`$ git add 「アップロードしたいファイル」`
*先ほどと同じように、ドラッグしましょう*

`$ git commit -m [変更点などを記述]`
*任意でメッセージを記入可能*


`$ git remote add origin [アップロード先を指定]`
*先ほど、Githubで作成したアップロード先情報をコピペしましょう*![スクリーンショット 2016-11-25 13.12.29.png](https://qiita-image-store.s3.amazonaws.com/0/150745/405e5b7b-3587-7dbd-0dd8-a5b2b316c98a.png)


`$ git push -u origin master`
*上記のコマンドでアップロード完了です*








***
基礎中の基礎のみを説明しました。
今後は、バージョン管理や、ブランチの切り方などもご紹介していく予定です。

又、間違った説明をしている箇所がございましたら、ご指摘いただけると幸いでございます。
Gitのコミット前にESLintする

## 2019-03-04 追記

この記事は古いため、非推奨です。現代ではhuskyやlint-stagedを使うことをおすすめします。

## はじめに

remoteにpush後、CIから通知が来てLintに引っかかっていることに気づくことってありますよね？:scream:
一応push前には実行するように気をつけてはいますが、忘れちゃうことも多々・・・:innocent:
CIで通知くるから問題なしって思うかもですが、「あいつ、またこんなコード書いてるぜｗ(プークスクス)」みたいになりたくないので
git hooksを利用して、git commit時にESLintが動くように設定しようと思います:smile:

## Git Hooksとは

[Git フック](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF, 'Git フック')

Gitの操作時にスクリプトが動かせるやつです。
`git init`後、`.git/hooks`の下を確認すると、サンプルのスクリプトがあることが確認できます。

```
$ tree ./.git/hooks/
./.git/hooks/
|-- applypatch-msg.sample
|-- commit-msg.sample
|-- post-update.sample
|-- pre-applypatch.sample
|-- pre-commit.sample
|-- pre-push.sample
|-- pre-rebase.sample
|-- prepare-commit-msg.sample
`-- update.sample
```

今回はcommit時に動かしたいので、`pre-commit`を作成します。

```
vi .git/hooks/pre-commit
```

```shell-session:pre-commit
#!/bin/sh

cd $GIT_DIR/../ && gulp lint # プロジェクトルートに移動してlint実行
```

スクリプトに実行権限をつけます。

```
$ chmod a+x ./.git/hooks/pre-commit
```

## 動かす

実際に動作させてみます。
例えば、下記のようなプログラムを作成します。

```app.js
console.log('Hello')
```

で、commitしてみると・・・

```
$ git commit -m 'check'
[16:51:25] Using gulpfile ~/tmp/eslint/gulpfile.js
[16:51:25] Starting 'lint'...
[16:51:26] 
/Users/kohatan/tmp/eslint/app.js
  1:13  error  Strings must use doublequote  quotes
  1:21  error  Missing semicolon             semi

✖ 2 problems (2 errors, 0 warnings)

[16:51:26] 'lint' errored after 599 ms
[16:51:26] ESLintError in plugin 'gulp-eslint'
Message:
    Failed with 2 errors
```

怒られました:imp:
該当部分を修正した後、再度commitしてみます。

```
$ git commit -m 'check'
[16:55:09] Using gulpfile ~/tmp/eslint/gulpfile.js
[16:55:09] Starting 'lint'...
[16:55:10] Finished 'lint' after 720 ms
[master 6992a22] check
 1 file changed, 1 insertion(+), 1 deletion(-)
```

無事、commitできました:rocket:

## さいごに

とりあえず後でrebaseするからcommitだけさせてよーってときは、`git commit --no-verify`のオプションで回避できます:sushi:
Gradleカスタムタスクで複数先にファイルコピーするならProject.copy()が便利

GradleScriptでファイルコピーしようとしてCopyTask使ったら、コピー先が複数指定できなくて困ったときに発見したやつ

CopyTask
========
* from:into=N:1 でしか書けない

``` groovy:build.gradle
// src/main/resources/*.properties --> $buildDir
task mycopy(type: Copy) {
    from 'src/main/resources'
    into '$buildDir/resources'
    include '*.properties'
}
```

Project.copy()
========
* from:into=N:M も1つのタスクで実行できる

``` groovy:build.gradle
task mycopy {
  // src/main/resources/*.properties --> $buildDir/prop/
  copy {
    from 'src/main/resources'
    into '$buildDir/prop'
    include '*.properties'
  }
  // src/main/resources/*.xml        --> $buildDir/xml/
  copy {
    from 'src/main/resources'
    into '$buildDir/xml'
    include '*.xml'
  }
}
```

注意
========
* [Copyタスクの場合と大体同じように動作しますが、いくつかの大きな制限もあります。](http://gradle.monochromeroad.com/docs/userguide/working_with_files.html#sec:copying_files)
電子工作 > 掃引式スペアナ / リアルタイム・スペアナ

@ トランジスタ技術 2016年12月号の広告内
Tektronix 
USBリアルタイム・スペクトラム・アナライザ

散発的信号に対するキャプチャで有効だとのこと。

「周波数ホッピング」というものが関係している。周波数ホッピングがあると、特定の周波数でのみキャプチャできない。それを可能とする方法として「リアルタイム」という用語がついていて、多くの周波数帯のキャプチャをしているようだ。

USB信号をキャプチャする予定はまったくないが、同じ仕組みを別のソフト作成時に使えるかとメモに残す。

以下の雑誌に特集しているとのこと。
http://www.rf-world.jp/bn/RFW36/RFW36A.shtml
Googleマップのスクロール時のイライラを解消するってヤツを最小コードの CSS でやれるだけやってみた

[『あのイライラが解消、「Googleマップ」で嬉しい仕様変更』](http://appllio.com/google-maps-embedded-two-fingers-touch-scroll)の記事を読んで、確かに自分も自分で配置した地図にスクロールでイライラすることあるなあ。。

と思って、Googleマップはすでに実装されてるし、オープンソースの [**Leaflet.js**](http://leafletjs.com/index.html) でやってみた！

と言っても、そのまま JavaScript でタッチイベント制御をガシガシ実装していくのも疲れそうだし、あまり面白くないので、**CSS でできる限界**を目指してみる。

![scrolled-map.gif](https://qiita-image-store.s3.amazonaws.com/0/81547/de8dfd57-93d5-68f5-4766-0be5d012f917.gif)

ソースは Gist に置きました。
デモはモバイルのことしか考えていないので、**モバイルで見てください**。
ちなみに動作テストは iOS のみしかやってません。

- コード
    - https://bl.ocks.org/ynunokawa/bab7546fee0ff8725144b604ebf1414b
- デモ
    - https://bl.ocks.org/ynunokawa/raw/bab7546fee0ff8725144b604ebf1414b/

## 仕様

- Googleマップみたいな二本指のときだけ地図操作は実装してない
- 地図上をスクロールするとオーバーレイが消える (地図操作はできない)
- 地図上のボタンをタップすると地図が操作できるようになる
- 地図以外の場所をタップするとオーバーレイが復帰

## CSS だけでやりました

**JavaScript には指一本たりとも触れていません。**

`:hover` 疑似クラスを駆使してるんで、Android でも同じように動くかわかりません。
iPhone でしかテストしてません。

### 地図部分

DOM の構造としては、地図ビューとオーバーレイとボタンの 3 つの `<div>` をひとまとめにしています。

![scroll-map.png](https://qiita-image-store.s3.amazonaws.com/0/81547/067ca551-a909-0ac2-992f-5174fdf5040f.png)

```html
<div id="map">
  <div id="mapView"></div>
  <div class="cover"></div>
  <div class="cover-text"><p>地図を操作する</p></div>
</div>
```

### タッチ制御 (CSS)

`:hover` の iOS Safari での挙動を利用しました。
実際にタッチ制御をしている CSS はこれだけです。
限界目指すとか言っておいて ~~3 行~~ 2 行で済んだ！

```css
#map:hover > .cover-text:hover, .cover:hover, .cover:hover + .cover-text {
  display: none;
}
#map:active > .cover, #map:active > .cover-text {
  opacity: 0;
}
```

`.cover` の要素 (=オーバーレイ) を触ると、`opacity` が `0` になるだけなので、地図操作はできないけど、オーバーレイは消えて地図が見える状態になります。離すと復帰するので縦長の地図でもオーバレイを消すボタンに触れます。
`.cover-text` の要素 (=ボタン) を触ると、`display` が `none` になり、その裏にある `.cover` の要素も触れて、これも `display` が `none` になることで、地図を覆う要素が消えて、操作可能な状態になります。

## ご利用は計画的に

あくまで CSS だけでやれることをやってみたという内容です！
疑似クラス (`:hover`) のモバイルでの挙動を理解してやらないとヤケドします。
参考にする際は計画的によろしくです。
codevsのjava実行のやり方

#codevs for studentに参加しました。
友達から誘いがあり、コードvsに参加しました。
codevs https://student.codevs.jp/

今回からHardとNormal部門に分かれたらしく、初めてなのでNormal部門に参加。



javaでプログラムを書きました。
その際、結構はまったので今後のため、まとめときます。

http://charlie1012.hatenablog.jp/entry/2014/12/27/222419
http://blog.goo.ne.jp/field_light/e/d860f661e765928cb0fca532c02a64d1
を参考にさせてもらい、jarファイルで実行していたのですが、

決勝進出が決まり、決勝用の検証用サーバーで環境構築する際に初めて気がついたのですが、
jarにしなくてもできて　えっ！できるじゃん！ってなりましたｗ

以下Main.javaファイルについて書きます

##Javaで実行

codevsのjnlpを開いてみます。
![image](https://qiita-image-store.s3.amazonaws.com/0/144904/66ecc31e-1c0f-3532-4b66-ed775e17dfca.png)
ウィンドウの一番下に
`directory: C:\Users\takumi\Desktop\codevs\codevsforstudent`
と書いてあります。
このパスの直下にファイルをいれてあげれば実行できます。
この場合、`Desktop`にある`codevsforstudent`フォルダに、`Main.java`とそのクラスたちを入れます。

javaをコンパイルし実行
`javac Main.java`
`java Main`
するとカレントフォルダにclassが作られます。
![image](https://qiita-image-store.s3.amazonaws.com/0/144904/062a70bc-f7d3-8f46-3c39-6ee51fa1e232.png)
写真では`codevsforstudent`フォルダ内で作業しています。
最初にAI名の`bebe.java`が表示されたので実行確認できました。

![image](https://qiita-image-store.s3.amazonaws.com/0/144904/df349fa7-c9ba-a36a-fb93-7ecc72ee375a.png)
ちゃんとクラスがあるのを確認

![image](https://qiita-image-store.s3.amazonaws.com/0/144904/902acd3f-4d3e-c440-6b41-8937c895bfbd.png)
cmdで実行したときのと同じコマンドの`java Main`と入力し実行を押せば実行できます。

また`java -cp パス　Main`のように、パス(フルパス)を指定して実行してもできます。

`javac Main.java & java Main`と書くことでコンパイルと実行を１回でできるのですが、
これはできないみたいなのでおとなしく `java Main`　と書いたほうがよさそうです。



コンパイル後実行できないのはjavaのクラスパスが間違っているので、
`set CLASSPATH=.;`などでカレントフォルダをみるようにしたり、クラスパスの設定を変えれば実行できるようになります。

 
##Jarで実行
上記のURLでまとめられていますが、一応書いときます。

jar化にする際にメインクラスを指定してあげるとできるみたいです。

テキストエディタで `codevs.mani`　を
`Main-Class: Main`と**改行**をして作成

`javac Main.java`でコンパイルしファイルがあるフォルダで
`jar cvfm codevs.jar codevs.mani *.class`
でcodevs.jarができます。

実行は`java -jar codevs.jar`


また eclipseなどの統合開発環境で出力することで、パッケージやメインクラスの指定を気にすることなく実行できます。
[C++] Function Pointer Cast

## Example Code:

Here is a example code of function pointer cast.

```cpp
void MyFunc() {
    cout << "hello" << endl;
}

typedef void (*func) ();

int main() {
    func a = static_cast<func>(&MyFunc);
    a();
    return 0;
}
```
 
The instance of `func` we declared as `a` is a function pointer that points to the function MyFunc.

We call `a();` as the same as we call the function `MyFunc();`.

As the draft of C99 standard described:
>The behavior is undefined in the following circumstances:

> * A pointer is used to call a function whose type is not compatible with the pointed-to type (6.3.2.3). 

The function pointer that we declared must be compatible with the function type we will point to. Otherwise it will be undefined behavior.

## Other

More detail about the function pointer cast.
http://stackoverflow.com/a/559671
CSSのプロパティ

{ font-size :  px; }・・・文字サイズを変える

{ color: # ; }・・・色を指定する

{ background-color: # ; }・・・背景色を指定する

{ border-botom:  px; }・・・下罫線を入れる

{ padding:  px; }・・・内側に余白を作る

{ margin:  px; }・・・外側に余白を作る
AWSでWEBサーバ立ち上げ

最近またAWSを契約してサーバ立ち上げる仕事が増えたので、備忘録的なかんじで。

# まずはAWSのEC2からインスタンスの作成

- Amazon マシンイメージ（AMI）
    - Amazon Linux
- インスタンスタイプ
    - t2.micro

で、インスタンス作成の確認して、とりあえず作成！
あとは、キーペア（認証鍵:pemファイル）のダウンロードをやります。


EC2コンソールでインスタンスが無事立ち上がったかチェック。
https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home
左メニューの「インスタンス」を選びます。

で、作成したインスタンスがあって、「running」となってたら問題なしです。

ここで、もしインスタンス名がない場合は作成します。
サーバの名前ですね。


# セキュリティグループの編集

コンソールで、先ほど作成したインスタンスを選択すると右下に「セキュリティグループ
」という項目があるので、リンクをクリック。
そこで、選択されているセキュリティグループを編集します。

右下の多分「インバウンド」を選んで、「編集」ボタンを押す。

とりあえず、サーバに入れるようにと、WEBページが見られるようになればいいので。

| タイプ | 送信元 |
|:-:|:-:|
| ssh  | マイIP（接続元のIPアドレスを設定）  |
| http  | 任意の場所  |

といったかんじで設定します。


# サーバにログイン

ここからは CLIでの作業です。

先ほどインスタンスを作った時に使用したキーペアを使います。

まずは、キーペアのパーミッションを修正


```bash
$ chmod 600 test.pem
```

そして、sshで接続。
あと接続サーバ先は、インスタンスのところにある「パブリックDNS」がサーバ接続先になります。

```bash
$ ssh -i test.pem ec2-user@ec2-12-345-678-901.ap-northeast-1.compute.amazonaws.com
```

# サーバ初期設定

いろいろ設定しないといけないですが、ひとまずいつも最初にやっていること

### タイムゾーン変更

```bash
$ sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
```
date で現在の設定を確認

```bash
$ date
2016年 11月 22日 火曜日 09:40:28 UTC
```

### yum update

```bash
$ yum update -y
```

# Apache設定

**インストール**

```bash
$ sudo yum -y install httpd
```

**Apache自動起動設定**

```bash
$ sudo chkconfig httpd on

確認
$ sudo chkconfig --list httpd
```

**Apache再起動**

```bash
$ service httpd start
```

これで、「パブリックDNS」でブラウザからアクセスするとページが表示される。

例）http://ec2-12-345-678-901.ap-northeast-1.compute.amazonaws.com/


## 他にもいろいろ。。。

バーチャルホストを設定したり。。。
ユーザ追加したり。。。
PHPインストールしたり、MySQLインストールしたり。。。まだまだやることはあるけれどとりあえずここまで。
CentOSにmecabをインストールしました。

CentOS7でmecabコマンドを使えるようにしました。

# 環境
CentOS７にmecabコマンドを入れました。

```bash:
cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
```
インストール方法はUnixへのインストール方法を参考にしています。

# mecabをインストール

## ソースを取得
まずはソースを取得します。

```
wget https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE

--2016-11-20 11:09:22--  https://drive.google.com/uc?export=download
drive.google.com (drive.google.com) をDNSに問いあわせています... 172.217.25.78, 2404:6800:4004:818::200e
drive.google.com (drive.google.com)|172.217.25.78|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 400 Bad Request
2016-11-20 11:09:22 エラー 400: Bad Request。
```
あれ？wgetできません。400: Bad Requestと言われました。

```
wget -O mecab-0.996.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE'
```
`'`で囲うと今度はうまくいきました。`-O`を付けないとファイル名がおかしくなったのでファイル名を指定しました。
mecab-0.996.tar.gzというファイルが存在しています。

## 解凍とmake
ダウンロードしたmecab-0.996.tar.gzを解凍しています。

```bash:解凍
tar zxfv mecab-0.996.tar.gz
```
`mecab-0.996`というディレクトリに移動して、makeします。

```bash:make
cd mecab-0.996
./configure
make
make check
sudo make install
```

# mecabの辞書がないと言われる
mecabコマンドを実行します。

```bash:mecabコマンドのテスト
mecab
param.cpp(69) [ifs] no such file or directory: /usr/local/lib/mecab/dic/ipadic/dicrc
```
`no such file or directory`と言われます。これはmecabの辞書が無いためのエラーらしいです。

# mecabの辞書を取得
mecabの辞書を取得します。

```
wget -O mecab-ipadic-2.7.0-20070801.tar.gz 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM'
```

## 解凍とmake

```bash:解凍
tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz

cd mecab-ipadic-2.7.0-20070801
./configure --with-charset=utf8
sudo make install
```
ここで`./configure`をするときにutf8をつけるのがポイントぽいです。おそらくutf8をつけないと以下のように文字化けしました。

```bash:文字化けするmecab
mecab
すもももももももものうち
すもももももももものうち	????,????,*,*,*,*,*
EOS
```
文字化けしています。ハマりぽいんとですね。
これでmecabコマンドが使えるようになります。

# mecabを試す
mecabを使ったことないのでいくつか試してみました。

```bash:mecabを試す1
mecab
水瀬伊織、１５歳で～っす♪伊織、頑張っちゃいますね♪
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
瀬	名詞,固有名詞,人名,姓,*,*,瀬,セラ,セラ
伊織	名詞,固有名詞,人名,名,*,*,伊織,イオリ,イオリ
、	記号,読点,*,*,*,*,、,、,、
１	名詞,数,*,*,*,*,１,イチ,イチ
５	名詞,数,*,*,*,*,５,ゴ,ゴ
歳	名詞,接尾,助数詞,*,*,*,歳,サイ,サイ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
～	名詞,サ変接続,*,*,*,*,*
っす	助動詞,*,*,*,特殊・デス,基本形,っす,ッス,ッス
♪	名詞,サ変接続,*,*,*,*,*
伊織	名詞,固有名詞,人名,姓,*,*,伊織,イオリ,イオリ
、	記号,読点,*,*,*,*,、,、,、
頑張っ	動詞,自立,*,*,五段・ラ行,連用タ接続,頑張る,ガンバッ,ガンバッ
ちゃ	助詞,接続助詞,*,*,*,*,ちゃ,チャ,チャ
い	動詞,非自立,*,*,一段,連用形,いる,イ,イ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
ね	助詞,終助詞,*,*,*,*,ね,ネ,ネ
♪	名詞,サ変接続,*,*,*,*,*
EOS
```

```bash:mecabを試す2
mecab
みなみ、決めますっ!
みなみ	名詞,一般,*,*,*,*,みなみ,ミナミ,ミナミ
、	記号,読点,*,*,*,*,、,、,、
決め	動詞,自立,*,*,一段,連用形,決める,キメ,キメ
ます	助動詞,*,*,*,特殊・マス,基本形,ます,マス,マス
っ	動詞,非自立,*,*,五段・カ行促音便,連用タ接続,く,ッ,ッ
!	名詞,サ変接続,*,*,*,*,*
EOS
```

```bash:mecabを試す3
mecab
お兄ちゃんおしっこ
お	接頭詞,名詞接続,*,*,*,*,お,オ,オ
兄ちゃん	名詞,一般,*,*,*,*,兄ちゃん,ニイチャン,ニーチャン
おしっこ	名詞,サ変接続,*,*,*,*,おしっこ,オシッコ,オシッコ
EOS
```
こいつはすげーぜ(☝ ՞ਊ ՞)

# 参考
http://taku910.github.io/mecab/#install-unix
https://blog.apar.jp/php/2642/
OSでTASさんみたいなことをしたら面白いのではないか？

掲題の通りなのですが、目的は、「ある一定の作業を完了するまでの時間をいかに短くするか？」です。そういう大会を開いて知見を共有したら、すごく面白いんじゃないか？とジャストアイデアしました。

※「TAS」とは、tool-assisted speedrunの頭文字を取ったものです。TAS動画も流行っていて、特定の人物ではないのですが、toolを使ったプレイをしている人を、TASさんと呼んでいます。知らない方は見たほうが速いと思うので、下記を見てみてください。

[TASさんが人力クリア不可能ステージを暇つぶしにプレイされたようです。【ニコ動コメ付き】](https://www.youtube.com/watch?v=Z1LW087VoZw)

- OSデフォルトの機能を使ってやる部門（これだと、OS-assisted speedrunになりそうですが。）
- ツールを使ってやる部門（ツールに何を使ったか書いてほしいですよね。）

の2種類くらいあったら楽しそう。

あとは、「ある一定の作業」をどんなものにするか？のルール決めですね。isuconみたいに大会になったら面白そうですね。普段の作業効率も上がりそうです。

とりあえず、大会の会場に行くとかになると、大会開催場所から遠い人が参加できないので、youtubeに動画をアップしてもらって、採点が良さそうですね。（上位者を集めて開いても良いですが。。。）

この記事を見た皆様。どうでしょうか？アイデアありましたら、コメントくださいm(_ _)m
(Mac)Slackが特定のwifiで接続できなくなる

Mac(OSX10.11.5)のSlackアプリが、特定のWifiに接続したときだけデータ同期できなくなる事象が発生。

結局は、対象のWifiに接続したときの設定が原因だったため以下の手順で解決できた。

- ネットワーク"環境設定"を開く
- Wifiが選択されていることを確認
- 右下の詳細ボタンを押下
- プロキシのタブに移動して、「自動プロキシ構成」にチェックが入っていたら外す
- OKボタンを押下して、詳細設定を終了
- 適用ボタンを押下して、ネットワーク設定の変更を適用

無事にデータ同期が可能になった。
Clear CocoaPods cache, re-download and re-install all pods

時々、CocoaPodsのやり直しが必要なので、メモしておく。

rm -rf ~/Library/Caches/CocoaPods; rm -rf Pods; rm -rf ~/Library/Developer/Xcode/DerivedData/*; pod deintegrate; pod setup; pod install;

参照元：
https://gist.github.com/mbinna/4202236
eb createオプションでALB + Multi-Container環境を構築した時の話


# 概要
[それではElastic Beanstalkの本気をお見せしよう](http://qiita.com/Mic-U/items/f7981cf82b4649247d55)を参考にしてApplication Load Balancer環境を作ろうとした時のメモです。
# 環境
- OS X Yosemite バージョン10.10.5
- EB CLI 3.8.4 (Python 2.7.1)

# 問題
記事を参考にec2.configを作成して`eb create`しても、なぜか`Subnets`や`ELBSubnets`の値が`null`判定されてしまって環境が作れませんでした。(ファイルの読み込みに失敗している？)

```
eb : Configuration validation exception: Invalid option value: 'null' (Namespace: 'aws:ec2:vpc', OptionName: 'Subnets'): Specify the subnets for the VPC for load balancer type application.
```

```yaml:.elasticbeanstalk/config.yml
...

global:
  application_name: sample_app
  default_ec2_keyname: dummy_key
  default_platform: Multi-container Docker 1.11.2 (Generic)
  default_region: ap-northeast-1
  
...
```

# 対応方法
色々試しましたが、設定ファイルでの構築を一部諦めて以下のように直接cliの`--vpc`オプションを使うことで環境を作れました。

```bash
$ eb create test-env --elb-type application --vpc.id vpc-aaaaaaaa --vpc.ec2subnets subnet-bbbbbbbb --vpc.elbsubnets subnet-cccccccc,subnet-dddddddd --vpc.elbpublic --vpc.publicip
```



# 参考
- http://qiita.com/Mic-U/items/f7981cf82b4649247d55
- http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb3-create.html
Laravelにおける小技メモ

# storage/log/laravel.logに出力

```php
$test = ["val", "2"];
\Log::debug('log test', ['key1' => 'val1', 'key2' => $test]);
```

# 言語ファイルの値を取得


以下のような言語ファイルがあるとする。
resources/lang/ja/validation.php

```php
<?php
    return [
        'attributes' => [
            'book_name' => 'laravelの本',
        ],
        'answer' => 'この本の名前は, :book_name',
    ];
```

例)コントローラからattributesの値を取得する場合。(config/app.phpのlocaleをjaに設定）
testController.php

```php
echo trans('validation.attributes.book_name');
```

Bladeから取得方法

test.blade.php

```php
{{ trans('validation.attributes.book_name') }}
```

プレースフォルダーを利用してanswerメッセージを表示。

```php
echo trans('validation.answer', ['book_name' => 'phpの本']);
```

# テーブルに存在しないカラムをプロパティとしてシリアライズ時に追加する　(Eloquent)

$appendsプロパティとアクアセサ機能を組み合わせる。

例）published_date(data型)の月の値をもつ、published_monthを追加する。

```php
class book extends Model
{
    protected $appends = ['published_month'];

    public function getPublishedMonthAttribute()
    {
        return Carbon::parse($this->attributes['published_date'])->month;
    }
}
```
Laravelでルーティングネームを取得する

インクルードファイルを作ってる時とか、トップページにだけ●●を表示みたいなことをすると思います。

そういう時、こう書いたらいいのですが

```php
@if(\Request::is('/'))
<p>index</p>
@endif
```

編集ページや詳細ページのみに●●を表示、みたいなことをするとき、上の書き方だと苦労することになりますよね？
そこで、きっと設定しているであろうnamespaceの値を取得して、それを用いて条件分岐させます。

```php:routes/web.php
Route::get('/', 'ItemsController@index')->name('index');
Route::pattern('items', '\d+');
Route::get('/{items}', 'ItemsController@detail')->name('detail');
```

```php:resources/views/layouts/app.blade.php
@if(\Route::current() -> getName() == 'index')
<p>index</p>
@endif

@if(\Route::current() -> getName() == 'detail')
<p>detail</p>
@endif
```
SQLServer: 指定したテーブルのインデックス使用状況を取得する

インデックスを張ったのは良いけど、本当にちゃんと意図した使われ方をしているのか知りたいときありますよね。

下記のSQLで、特定のテーブルのインデックス利用状況を取得することができます。
・seekで使われるつもりで作ったインデックスでscanが多用されていないか？
・scanで使われるつもりで作ったインデックスでseekが多用されていないか？（こっちは稀ですね）
など確認できます。

※実行にはVIEW SERVER STATE 権限が必要です。

```
SELECT
    o.name AS table_name
  , i.name AS index_name
  , s.user_seeks    -- Index Seek 数
  , s.user_scans    -- Index Scan 数
  , s.user_updates  -- UPDATE 数
  , s.user_lookups  -- lookup 数
  , last_user_seek
  , last_user_scan
  , last_user_lookup
  , last_user_update
FROM
sys.objects o
 INNER JOIN sys.indexes i
   ON o.object_id = i.object_id
 INNER JOIN sys.dm_db_index_usage_stats s 
   ON i.index_id = s.index_id
WHERE o.type = 'U'
 AND database_id = DB_ID()
 AND s.object_id = OBJECT_ID('テーブル名')
 AND o.name = 'テーブル名'
ORDER BY
 s.user_seeks+s.user_scans desc --seek+scan回数降順
--s.user_seeks desc -- seek回数降順
--s.user_scans desc -- scan回数降順
```
Broadcastのセキュリティについて

JSSECが公開している『Androidアプリのセキュア設計・セキュアコーディングガイド』の2016-09-01版を共有用にまとめているもののうち、「4.2.Broadcast を受信する・送信する」のものとなります
詳細やサンプルコードについては原著の方を参考ください

## チェックポイント
- [ ] 適切な公開範囲になっている 
- [ ] 受信側は受信Intentの安全性の確認をしている
- [ ] 送信側は結果データの安全性の確認をしている

### 非公開Broadcast
* 受信側
- [ ] 静的Broadcast Receiverで構成されている
- [ ] 原則、Intent Filterを設置していない(例外については後述)
- [ ] exported="false"により、明示的に非公開にしている
* 送信側
- [ ] Stickyを使用していない(使用できない)
- [ ] 明示的IntentでBroadcastを送信する

### 公開Broadcast
* 受信側
- [ ] exported="true"を明示的に指定している
- [ ] センシティブな情報を返送していない
* 送信側
- [ ] センシティブな情報を送信していない

### 自社限定Broadcast
* 受信側
- [ ] Broadcast 受信用の独自定義Signature Permissionを定義している
- [ ] 結果受信用の独自定義Signature Permissionを利用宣言している
- [ ] exported="true"により、明示的に公開設定している
- [ ] 静的Broadcast Receiverを利用する場合、定義にて、独自定義Signature Permissionを要求宣言している
- [ ] 動的Broadcast Receiverを利用する場合、登録するとき、独自定義Signature Permissionを要求宣言している
- [ ] 独自定義Signature Permissionが自社アプリにより定義されていることを確認している
- [ ] Broadcast 送信元アプリと同じ開発者鍵でAPK を署名している
* 送信側
- [ ] 結果受信用の独自定義Signature Permissionを定義している
- [ ] Broadcast受信用の独自定義Signature Permissionを利用宣言している
- [ ] 独自定義Signature Permission が自社アプリにより定義されていることを確認している
- [ ] Receiver に独自定義Signature Permissionを要求している
- [ ] Receiver側アプリと同じ開発者鍵でAPKを署名している

## Tips
#### Broadcast Receiverの定義方法
 Broadcast Receiverには、2種類存在します

 * 静的Broadcast Receiverはxml上に記述して定義します。ただし、システムから送信される一部のBroadcastを受信出きません。受信期間としては、アプリ初回起動から、アンインストールまでの間になります。(Android3.1以降。また、送信側がIntent.FLAG_INCLUDE_STOPPED_PACKAGESを設定した場合は1度も起動していなくても受信可能です)
 * 動的Broadcast Receiverはプログラム中に記述して登録します。静的Broadcast Receiverでは受信できないものも受信でき、また、受信期間を制御できます。ただし、非公開にはできません

#### センシティブな情報の送信
センシティブな情報の送信をする場合、適切な送信方法を取らないと、不特定多数に一斉送信されるため、注意が必要です

* 明示的Intentで送信することで宛先を固定する方法
* 独自定義Signature Permissionを指定してBroadcast送信し、受信側Broadcast Receiverに利用宣言してもらう方法

#### Sticky Broadcast、Sticky Ordered Broadcastに関して
Android5.0から非推奨、また、悪名高い(らしい)ので、使用をしないのが良いです。もし、使用する場合はセンシティブな情報を含めてはいけません。明示的Intentを使用する、receiverPermissionパラメータを指定することが出来ないため、不特定多数から読み取れてしまいます

#### Ordered Broaccastに関して
Ordered Broadcastを使用する場合、receiverPermissionパラメータを指定せずにセンシティブな情報を送信してはいけません。また、パラメータを指定していない場合、届かないことがある事に注意する必要があります。これは、優先度の高いReceiverから順次配送されるため、優先度の高いマルウェアが後続のReceiverに配信しないことができるからです

#### Intent-filter定義がある非公開Broadcast Receiverについて
アプリAが暗黙的IntentをBroadcastした場合、同一アプリ内の非公開のReceiverと同じIntent-filterを定義した、別アプリのReceiverも受信できてしまうため、禁止である。また、BroadcastがOrderedの場合、意図しない結果を受け取ります
ただし、システムの送信するBroadcast Intentのみを受信する場合はexported="false"かつ、Intent-filter定義あり、以外を使用してはいけません。
これは、システムの送信するBroadcast Intentのみexported="false"でも受信可能であり、システムの送信するもの以外を防ぐためです

#### Broadcast送信した情報がLogCatに出力される場合がある
Broadcastの送受信は基本的にはLogCatに出力されませんが、受信側か送信側のPermission不足によるエラーの際には、送信するIntent情報もエラーログに吐かれてしまうため、注意が必要です

####  その他
* 非公開Broadcast Receiverでも、同一UIDを持つアプリから、送信されたBroadcastを受信してしまいます。ただし、同一UIDになる場合は、APKを署名する開発者鍵が一致することが保障されているので、セキュリティ上問題ありません
* ホーム画面にショートカットを作る場合、受け手のパッケージ名がわからない場合、暗黙的Intent による公開Receiver への送信となるため、注意が必要です。また、URL を基にしたショートカットを作成する場合、URL に秘密の情報が含まれていることもあるため、注意が必要です


## 参考

『Android アプリのセキュア設計・セキュアコーディングガイド』【2016年9月1日版】
https://www.jssec.org/dl/android_securecoding.pdf

Android 5.0 Lolipopでレガシー化するもの
http://qiita.com/glayash/items/95174c0fff95cb14c97d
積もり積もったgitのブランチの掃除

今更感がありますが自分の中での再認識用メモです。
※ もし間違っていることがあればコメントください！

リモートブランチ(github上に存在するもの)とローカルブランチ(git pull してきた remotes/[repository]/[branch])、作業用ブランチ(git branch -b 作業ブランチ origin/[branch])がありますが、

作業ブランチを削除する際は

```bash
(master)$ git branch -d 作業ブランチ
```
これだとローカルブランチは残った状態。。

### ローカルブランチとリモートブランチを削除するとき
```bash
(master)$ git push origin :消したいリモートブランチ
```
けど、今までgit pullしてきた余分なローカルブランチの消し方or消して良いのかどうか分からない。。
また、よくgithubのPR上でマージ + リモートブランチの削除をすると、
ローカルブランチだけが残るときがあります。
そういう時は、

```bash
(master)$ git fetch --prune
(master)$ git fetch -p #とも省略できる 
```

このコマンドを実行することで、リモートブランチに存在しないローカルブランチを一斉に削除してくれます。

### git pull
```config
pull = fetch + merge
```
なので、勝手にマージされちゃって困るときもあると思います。
#### そんな時はgit fetch
```bash
(master)$ git fetch
```
とやってやると fetch + merge を自動的に行われず
ローカルブランチだけ更新されます
また

```bash
(master)$ git fetch origin
(master)$ git fetch origin 対象リモートブランチ
```
ともできます。
Homebrewでnodeのバージョンを上げました

nodeのバージョンを上げたかったのですがやり方がわかりませんでした。環境はMacです。

# nodeのバージョンが古いと言われる
コマンドを実行したら、実行できませんでした。

```bash:とあるコマンドを実行
You are currently running Node v0.12.7 but create-react-app requires >=4. Please use a supported version of Node.
```
nodeが4以上じゃないとだめとあります。

# nodeのバージョンを確認
nodeのバージョンを見てみます。

```bash:nodeのバージョン
node -v

v0.12.7
```
先程の通り、ver0.12.7でした。

# nodeをインストールしようとすると失敗
nodeをインストールしてみました。

```
brew install node
Updating Homebrew...
Error: node-0.12.7 already installed
To install this version, first `brew unlink node`
```
`unlink node`しろと書いてあります。


# unlink node
`unlink node`を実行してみます。

```bash:nodeをunlink
brew unlink node
Unlinking /usr/local/Cellar/node/0.12.7... 6 symlinks removed
```

# nodeをインストール
再度nodeのインストールを試します。

```bash:nodeをインストール
brew install node

略
==> Summary
🍺  /usr/local/Cellar/node/7.1.0: 3,884 files, 45.4M
```
今度はインストールが成功しました。

# nodeのバージョンを確認
再度nodeのバージョンを確認します。

```bash:nodeのバージョン
node -v
v7.1.0
```
バージョンがあがりましたやったね(☝ ՞ਊ ՞)


## nodeが入ったというディレクトリを見てみる
nodeがインストールされたディレクトリを見てみます。

```bash:nodeのディレクトリを確認
ll /usr/local/Cellar/node/

0.10.22/ 0.12.7/  7.1.0/
```
以前のバージョンのディレクトリが残っています。`unlink`というのはこの参照を消すみたいな感じなのかもですね。
templateタグを使う


MDNを参考に、[template](https://developer.mozilla.org/ja/docs/Web/HTML/Element/template)タグをつかって簡単なTODOリストをつくってみる。

## htmlファイルを用意する

最低限必要なのは入力フォームとTODOが追加されていくリスト、そして今回の肝であるtemplate。
とりあえず↓のようにした。

```html:index.html
<!DOCTYPE html>
<html>
<head>
	<title>template</title>
</head>
<body>

<div>
	<input type="text" id="title" />
	<button id="add">Add</button>
</div>

<ul id="todo">
	<template id="template">
		<li>
			<span>titleが入る</span>
			<button>Delete</button>
		</li>
	</template>
</ul>

</body>
</html>
```

## jsでtemplateを扱う
ここでやることは大きく次の4つ。
1. template要素を取得し
2. 複製し
3. なにかして
4. DOMに追加する

```javascript:script.js
// template要素を取得し
var template = document.getElementById('template');
// 複製し
var clone = document.importNode(template.content, true);
// なにかして
clone.firstElementChild.style.background = '#'+Math.floor(Math.random()*16777215).toString(16);
// DOMに追加する
document.getElementById('todo').appendChild(clone);
```

templateの扱い方はこれだけ。あとはこれを使ってTODOリストっぽく肉付けしていく。

## 肉付け

した。

```javascript:script.js
(function () {

	// template
	var template = document.getElementById('template');

	// titleを入力するinput要素
	var title = document.getElementById('title');

	// todoリスト
	var todo = document.getElementById('todo');

	// Addボタン
	document.getElementById('add').addEventListener('click', function () {
		// 入力されていなければ何もしない
		if (!title.value) return;

		// templateから要素を複製する
		var clone = document.importNode(template.content, true);

		/* 複製した要素になにかする */
		// 背景色を変更
		clone.firstElementChild.style.background = '#'+Math.floor(Math.random()*16777215).toString(16);
		// 入力されたtitleをいれる
		clone.querySelector('span').textContent = title.value;
		// ボタンが押されたらリストから削除する
		clone.querySelector('button').addEventListener('click', function () {
			var parent = this.parentNode;
			parent.parentNode.removeChild(parent);
		});

		// 複製した要素をリストに追加する
		todo.insertBefore(clone, todo.firstChild);

		// titleの値を空にしておく
		title.value = '';
	});

})();
```

まぁ動きわかればおｋだべ。

## demo
http://keiskimu.com/Qiita/template/


## Tips
templateタグが対応していないゴミのようなブラウザでは、templateタグで囲っている部分がふつうに表示されてしまう。
なのでcssでtemplate振ったidなどに対して`display: none`とか当てておくと安心。


というね。
メモとToDoとタスクの違い～設計方針

####メモ
メモは長期的なToDoのようなものであるが、件数が多く、明確な締め切り日がなく、重要なものに関しては再利用性が高い。したがってソート順はファイルへの最終アクセスを用いるのが望ましい。メモの例は、住所、健康保険証番号など。実ファイルあるいは画像ファイルへのリンクを扱えると望ましい。
####ToDo
ToDoは、すべきことを書いたリストで、比較的短期間に小さな内容を記述するもの。優先度と締め切り日の概念をもつ。締め切り日をもたない場合のToDoをどのように表示するか、締め切り日を繰り延べするインターフェースをどうするか、などを検討する必要がある。締め切り日をもたないToDoが多数ある場合、それが手前に来ると、今日すべきことを見失いがちである。一般的にいって、締め切り日よりも優先順位の高いものを実現するほうが、人生の幸福度/達成感は増すと考えられる。優先度の高いものをすこしずつでも実現できるようにするには、スケジュールとの連携、提案(サジェスチョン)、分割などの機能があるとよい。
####タスク
タスクは、ToDoよりも明解にすべきことを記述したものである。ToDo同様に締め切り日や優先度などをもつ。タスクは大項目-中項目-小項目などのように分割することが多く、分割した場合にそれぞれが連動しやすくなっているとよい。たとえばチャットワークやtracの場合、タスクを分割する機能はなく、手動で分割するとそれぞれは別タスクになり、連動しにくい。分割したタスクをABCとした場合、[AB]はセットであるとすると、かならずA-Bの順番に実行しなければならないことがある。コーヒーを淹れる、というタスクを分割したときの、お湯を沸かしてからコーヒーにそそぐ、みたいに。水を注いでからお湯を沸かすのではなくて。そういうときに、締め切り日の変更などで[AB]をセットに扱えると楽できる。特に分割した小さいタスクが10項目にもなるような場合には特に。分割した小さいタスクごとにチェックできるとよいのかもしれない。つまりタスクを、統合されたToDoであるといいかえてもよいかもしれない。

####ガントチャート
ガントチャートを信頼していないのは、ガントチャートへの入力は机上の空論となりがちで、現実にそぐわないことが多いと考えているためである。どうしようもなく緊急の課題がある場合、たとえばトイレの水が漏れているとか、そういうときにはガントチャートに入力なんかしている場合ではない。もっとも、緊急事態はひんぱんにはないわけであって、そうでないと日常生活を送れなくなるので困る。そういう場合、たとえば消防署員とかにとっての緊急の課題とは違うのである。基本的には理論と設計に現実をしたがわせるべきであって、そうであればこそ複雑すぎる現実をうまく切り分けられるのだ、ということもできるか。
####Backend
ファイルベース(これがいちばん柔軟だが、どこと連携するか?)、ChatWork(APIがあるので、タスクと連携して本来のタスクに必要な機能を実現してしまえばよい、つまり組として扱う機能)、ほかにはOneDrive, Evernote, GoogleDriveなどが考えられる。GoogleKeepは悪くないと思ったが、APIがないのでダメ。trac、Slack、LINEなどを使う場合、APIを検討する必要がある。Skypeの場合は、ローカルにsqlファイルとして保存し、やや保存までにタイムラグがあるのでまあない。
技術英語 > [Hurrying to solve a problem] is one of the most time-ineffective things you can do. / cost effective

@ Code Complete (No. 17762 / 36077)

> **<font color=red>Hurrying to solve a problem</font>** is one of the most time-ineffective things you can do.

意訳「急いで問題を解決しようとするのは、最も効率の悪いやり方の１つだ。」

結局急いでいるようでいて失敗をしてしまうと時間がかかる。

いかに冷静に判断できるか。

急ぎの時に必要な情報が短時間で引き出せる仕組みは大切だと思う。

<hr>
関連して思い出したのは

> cost effective

http://eow.alc.co.jp/search?q=cost%20effective

> 費用［コスト］効率［効果］が高い［良い］◆【同】cost-efficient

検索してみて、以下を見つけた。

[ホームオフィスでの会話, ブログ『費用対効果』って英語でなんていうの？](http://eigo.tra-ct.com/%E3%80%8E%E8%B2%BB%E7%94%A8%E5%AF%BE%E5%8A%B9%E6%9E%9C%E3%80%8F%E3%81%A3%E3%81%A6%E8%8B%B1%E8%AA%9E%E3%81%A7%E3%81%AA%E3%82%93%E3%81%A6%E3%81%84%E3%81%86%E3%81%AE%EF%BC%9F/)

> cost-benefit performance

さらに

https://www.ctg.albany.edu/publications/guides/smartit2?chapter=13&section=4

調べだしたらはまる方向にいくので、ここまで。