OmniAICreator/Qiita-1.07M huggingface dataset:
snort インストール手順


snortの簡単なインストール手順メモ
※ インストールだけのメモ，snort起動にはルールファイル設置が必要


### 環境
- CentOS (2.6.32-696.6.3.el6.x86_64)
- CPU:2core,MEM:2048MB,HDD:50GB onVMwarevSphere6
- epelリポジトリを追加してある


### 前提
- 作業はrootアカウント
- ライブラリのパス等のパラメータはカスタマイズしない(RPMに任せる)


### 事前作業	
本インストール手順で要求されるパッケージを予めインストールしておく
  
    yum install autoconf automake bison flex gcc libpcap-devel pcre-devel rpm-rebuild zlib-devel


NFQを有効にする(DAQインストール時)ために必要なパッケージを予めインストールしておく

    yum install libnetfilter_queue libnetfilter_queue-devel


snortインストールで要求されるパッケージを予めインストールしておく
   
    yum install libdnet linbdnet-devel


### インストール手順
DAQ(Data Acquisition Liblary)のインストール

    cd /root
    wget https://www.snort.org/downloads/snort/daq-2.0.6-1.src.rpm
    rpmbuild --rebuild daq-2.0.6-1.src.rpm
    cd /root/rpmbuild/RPMS/x86_64/
    rpm -Uvh daq-2.0.6-1.x86_64.rpm

snortのインストール

    cd /root
    wget https://www.snort.org/downloads/snort/snort-2.9.9.0.tar.gz
    rpmbuild -tb --clean snort-2.9.9.0.tar.gz
    cd /root/rpmbuild/RPMS/x86_64/
    rpm -Uvh snort-2.9.9.0-1.x86_64.rpm
macOS SierraでKerasやTensorFlowがGPUで動かない人へ

# はじめに

解決策ではありません、この問題もあり得ますよのお話

# 起きた問題

- CUDAもCuDNNも正しく入っているのに以下のようなエラーが出る
  - Library not loaded: @rpath/libcudnn.5.dylib
- 正しく入っているのにGPUを使ってくれない(下のやつが表示されない)
  - I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.8.0.dylib locally
  - I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.5.dylib locally
  - I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.8.0.dylib locally
  - I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.1.dylib locally
  - I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.8.0.dylib locally

# その原因

### GPUを確認してみましょう、もしやNVIDIA製ではなくInterl製ではないですか？

前のマシンでGPUモードが使えていたので気づくのに時間がかかったのですが、どうやら2015年モデルくらいからGPUがNVIDIA製ではなくなり、GPUモードが使えなくなっているようです。仕方がないのでCPUモードで実行しましょう。。。

もし何か良い方法を知っている人がいましたら、コメントくださいませ。m(_ _)m
macのターミナルでなるべくラクチンにsshログインする下ごしらえ

# configを使って簡単にログインする
.ssh/configにsshコマンドの引数を設定しておくと良い

```:config
Host hoge
HostName xx.xxx.xxx.xxx
User ubuntu
IdentityFile ~/.ssh/xxx.pem
```

```
ssh hoge // これでconfigの値を使ってログインできる
```

#### 動的IPアドレスに対応したい
EIPを使っていないEC2インスタンスは毎回PublicIPが変わってしまうので、configを書き換えてsshするシェルを用意してみた

```:myssh
sed -e "s/HostName.*/HostName $1/" config
ssh hoge
```

```
./myssh zz.zzz.zzz.zzz

```
これで、IPアドレスの入力はインスタンス立ち上げ直した後だけになった

# ssh-agentを使って秘密鍵を登録する
秘密鍵を登録しておくだけでも楽になりますね

```
# 秘密鍵の登録
ssh-add 秘密鍵
# 秘密鍵の登録状況の確認
ssh-add -l
# 登録した秘密鍵を使うには-Aオプションをつける
ssh -A ubuntu@xxx.xxx.xxx.xxx
```

# 参考
[~/.ssh/configについて](http://qiita.com/passol78/items/2ad123e39efeb1a5286b)
[ssh-agentの使い方](http://qiita.com/isaoshimizu/items/84ac5a0b1d42b9d355cf)
ionicでwkwebviewプラグインの移行(apache版→ionic-team版)で詰みそうになった話

結論を先に言うならwkwebviewプラグインはionic-teamが出しているものを使った方が無難そうです。（ただし、ionic-team版wkwebviewプラグインは最終的にはapache版にマージされる予定らしいですが・・・）

・ionic-team版wkwebviewプラグイン
https://github.com/ionic-team/cordova-plugin-wkwebview-engine

あと、ストレージ周りはなるべくSQLite(ionic-storage)を使った方が無難そうです。
ionic-storage
・https://github.com/ionic-team/ionic-storage

## wkwebviewとは？

iOSのアプリ内ブラウザです。ionicアプリならこれを使うだけでパフォーマンスの向上する可能性があります。

## apache版とionic-team版のwkwebviewプラグインの違いは？

一番はXHR周りが動くことだと思います。特にngx-translateモジュールを動かそうとした時に、apache版だと動かず、ionic-team版だと動作するといったことが起こりました。私も、元々apache版を使っていましたが前述のXHR周りのこともあって後からionic-team版に乗り換えました。

## しかし、プラグインの移行で詰みそうになる・・・

本題ですが、プラグインの移行自体は簡単にできたんですが、何故か移行するとアプリ内で保存していたものが全て初期化されてしまう事象が・・・。
どうやら、アプリ内のフラグ保持にwindow.localStorageを使用していたことが良くなかったみたいで、apache版とionic-team版のwkwebviewプラグイン間でlocalStorageが共有されない様子でした。
そのため、このままリリースするとバージョンアップとともにアプリがほぼ初期化されてしまうという問題が・・・。

## 対処

実はアプリの途中のバージョンから将来swiftに置き換えることを考慮しwindow.localStrogeと並行してSQLite(ionic-storage)にも同じフラグ情報を保持するようにしていました。
そのため、バージョンアップ後にlocalStorageになかったらSQLiteの方も確認するようにして対処しました。
とはいえ、たまたまSQLiteに保存してあったらかよかったものの、もしそれをしていなかったらと思うと面倒なことになっていました・・・。

## まとめ
・wkwebviewプラグインはionic-team版を使ったほうが無難
・window.localStorageは使わずなるべくSQLite(ionic-storage)を使った方が無難
　→ionic serve中はlocalStorageを自動的に使ってくれるのでデバッグも用意

あと、Objective-Cに強ければ、直接wkwebviewのプラグインをいじってapache版でXHR周りも動かしたり、両プラグイン間でlocalStorageを共有したりといった他の対処方法ができたかも・・・。
Check! Bluemix PHPランタイムでPHPエクステンションを追加したいときは？

こんばんは、 @dz_ こと大平かづみです。

Prologue - はじめに
====

Bluemix の Cloud Foundry アプリで、[PHPスターター・アプリケーション](https://console.bluemix.net/catalog/starters/php?env_id=ibm:yp:us-south&taxonomyNavigation=apps) を利用して WordPress を立てようとした際、 `mysql_connect()` がないよ！と不意打ちなエラーにつまずきましたので、対処したメモを残しておきます。

Bluemix PHPスターター・アプリケーションについて
====
Bluemix の PaaS は、Cloud Foundry をベースとしており、PHP ランタイムの構築には [php_buildpack](https://github.com/cloudfoundry/php-buildpack) が採用されています。

ビルドパックを利用することで、手間なく環境を構築してくれるメリットとともに、基本の構成からカスタマイズするには、少し工夫が必要です。

- [Bluemix PHPランタイムについて](https://console.bluemix.net/docs/runtimes/php/index.html#starter_application)

PHP拡張について
----
`php_buildback` は、デフォルトの場合、 `bz2`, `zlib`, `curl`, `mcrypt` などの最小限の PHPエクステンションをインストールします。

ここに含まれていないPHPエクステンションを利用したい場合は、明示的に含める必要があります。この記事では、追加の PHP エクステンションを指定する方法をまとめます。

Bluemix PHPスターター・アプリケーションで、 `mysql_connect()` がない場合の対処
====

エラー内容
----
Bluemix PHPスターター・アプリケーションを作成し、 WordPress のソースコードを配置して動かそうした際、下記のエラーが発生しました。

```
Fatal error: Call to undefined function mysql_connect() in /home/vcap/app/htdocs/wordpress/wp-includes/wp-db.php on line 1568
```

原因
----
Bluemix PHPスターター・アプリケーションのビルドパックには、どうやら `mysql_connect()` を含む `mysqli` のPHPエクステンションが含まれていないようです。

対処
----
PHPエクステンションを設定するには、 `options.json` に指定します。

- [PHP Buildpack Configuration | Cloud Foundry Docs](https://docs.cloudfoundry.org/buildpacks/php/gsg-php-config.html)
- [php_buildpack のデフォルトの opitons.json](https://github.com/cloudfoundry/php-buildpack/blob/master/defaults/options.json)

まず、Bluemix が必要とする最小の `options.json` は以下のようです。Bluemix では、少なくとも `WEBDIR` を指定する必要があります。また、上記のデフォルトの `options.json` に指定されているPHPエクステンションもピックアップしておきます。

```json:.bp-config/options.json(デフォルト)
{
    "WEBDIR": "htdocs",
    "PHP_EXTENSIONS": ["bz2", "zlib", "curl", "mcrypt"],
}
```

ここに、必要なPHPエクステンションを追加します。どんな拡張モジュールが利用できるかは、下記の `options.json` を参照してください。

- [指定可能な zend エクステンション、PHPエクステンションoptions.json (PHP5.x)](https://github.com/cloudfoundry/php-buildpack/blob/master/cf_spec/fixtures/php_5_all_modules/.bp-config/options.json)
- [指定可能な zend エクステンション、PHPエクステンションoptions.json (PHP7.x)](https://github.com/cloudfoundry/php-buildpack/blob/master/cf_spec/fixtures/php_7_all_modules/.bp-config/options.json)

たとえば、 `mysqli` を追加する場合はこうなります。

```diff:.bp-config/options.json(mysqliを追加)
{
    "WEBDIR": "htdocs",
-   "PHP_EXTENSIONS": ["bz2", "zlib", "curl", "mcrypt"],
+   "PHP_EXTENSIONS": ["bz2", "zlib", "curl", "mcrypt", "mysqli"]
}
```

そして、これをアプリケーションのディレクトリに `.bp-config/options.json` として配置しデプロイすることで適用されます。

ということで、PHPエクステンションを追加するのは、実はこんなに簡単でしたー！(o'ω')ﾉ

Epilogue - おわりに
====
当初、エラー発生時は諦めそうになりましたが、解決策がわかって、Cloud Foundry の仕組みもわかって一石二鳥でした♪
PHPでプロキシサーバーを作る

PHP書いてたらプロキシ鯖を書きたくなることってありますよね。

要 `composer require guzzlehttp/guzzle`

```index.php
<?php

namespace zonuexe\ZoProxy;

use GuzzleHttp\Client as HttpClient;
use GuzzleHttp\Psr7;

require __DIR__ . '/../vendor/autoload.php';

// ここはいい感じにやってね
$host_table = [
    'hoge.example.com' => [
        'host' => 'localhost',
        'port' => 3939,
        'scheme' => 'http',
    ],
    'foo.example.com' => [
        'host' => 'foo.example.jp',
        'scheme' => 'https',
    ],
];

$request = Psr7\ServerRequest::fromGlobals();
$new_uri = $request->getUri()->withPort(80);

$key = $new_uri->getHost();
$port = $new_uri->getPort();
if ($port !== null && !Psr7\Uri::isDefaultPort($port)) {
    $key .= ":{$port}";
}

if (isset($host_table[$key])) {
    if (isset($host_table[$key]['host'])) {
        $new_uri = $new_uri->withHost($host_table[$key]['host']);
    }
    if (isset($host_table[$key]['port'])) {
        $new_uri = $new_uri->withPort($host_table[$key]['port']);
    }
    if (isset($host_table[$key]['scheme'])) {
        $new_uri = $new_uri->withScheme($host_table[$key]['scheme']);
    }
}

$client = new HttpClient;
$response = $client->send($request->withUri($new_uri), [
    'http_errors' => false,
]);

foreach ($response->getHeaders() as $key => $values) {
    foreach ($values as $value) {
        header("{$key}:{$value}");
    }
}

echo $response->getBody();
```

まあ普通にやったらこれ以上は簡単にならないだろって感じなので、著作権とかは特に気にしないで勝手にコピペして良いです。

# Q. 何の役に立つの…?

A. さあ… 僕はこれを書いてから仕事で活用しまくりですが

例としては `:80` にPHP5系が動いてるApacheが立ってる共用の開発鯖でPHP 7.1のビルトインサーバーを `php -S localhost:3939` で起動して、そこにプロキシするみたいなことができますね。

みそとしては、HTTPのHostを変更してないので私の場合はそれで都合良かったのですが、たぶんそれだとまづいことの方が多いので、そこはよしなにやってください ヾ(〃＞＜)ﾉﾞ
pyenv 環境下で Visual Studio Code に Python プラグインを入れるとエラーが出る

## 事象
mac で pyenv 環境下で Visual Studio Code に Python プラグインを入れると

```
Error Linter pylint is not installed
```

と表示され、Lintingがうまく働かない。また補完候補も表示が期待と異なる。

`setting.json`を見る感じ、VSCodeが読みに行くPythonのPathは`python`コマンドで呼ばれる場所に設定されているはずなのですが、これがなぜか`/usr/bin/python`を読みに行ってしまうからのようです。


## 解決法
Preferences > Setting を開き、USER SETTING タブのJSONに

```
    "python.pythonPath": "pyenvで設定したPath(e.g. /User/user/.pyenv/shims/python)"
```

を追記

差し当たっての解決法ですが、動くようになりました。
（原因ですが未特定、bash_profileにpyenv設定を書いているのが原因？かもです）

## 環境
- mac OS Sierra
- VSCode Version 1.14.2
- Python プラグイン 0.7.0
ROSとV-REPの連携　その１.インストール編

#V-REPとは
Coppelia Robotics製のロボットシミュレータ、Matlab,C++,JAva,Pythonといった様々な言語で操作可能。
ROSのAPIもサポートされている。
研究室の留学生の方からgazeboより簡単だよ！！と勧められ説明聞いてみたところ確かに簡単に使えそうだったので使ってみました。
今回の記事はこれらの情報([V-REPとROSの連携(V-REP Ver3.4.0版)](http://tattatatakemori.hatenablog.com/entry/2017/06/14/225114),[ROS上でV-REP内のモデルを動かす](http://qiita.com/RyuYamamoto/items/8ffc5c4f854b90083590),[ROS tutorial - Indigo](http://www.coppeliarobotics.com/helpFiles/en/rosTutorialIndigo.htm))を参考に書きました。
ありがとうございます。

#とりあえずV-REPだけで起動してみる
まずはここからV-REPをダウンロードしましょう
http://www.coppeliarobotics.com/downloads.html
ダウンロードするファイルを展開するとvrep.shというスクリプトが出てきますので実行しましょう。

```
./vrep.sh
```
![Screenshot from 2017-08-10 14:17:13.png](https://qiita-image-store.s3.amazonaws.com/0/160346/1d0efd1b-9d71-6fb6-3d83-4b358b198bee.png)
立ち上がりました、何もないのも寂しいのでとりあえずbaxterを置きます。
左のメニューから選択してドラッグアンドドロップするだけです。
すごく簡単・・・
上の右向いた三角のようなところをクリックするとシミュレーションが始まってbaxterが踊って？くれます。
かわいい・・・

#V-REPとROSをつなぐ
v-repとROSをつなぐためのブリッジは[ここ](https://github.com/lagadic/vrep_ros_bridge)で公開されています。
README.mdにしたがってビルドしていきましょう。

```bash
cd ~/catkin_ws/src
git clone https://github.com/lagadic/vrep_ros_bridge
echo "export VREP_ROOT_DIR=/path/to/v_rep/floder" >> ~/.bashrc
echo "export VREP_ROOT=/path/to/v_rep/floder" >> ~/.bashrc
catkin_make
cd $VREP_ROOT_DIR
ln -s ~/catkin_ws/devel/lib/libv_repExtRosBridge.so
ln -s compiledRosPlugins/libv_repExtRos.so

cd
mkdir -p vrep_ws/src
cd vrep_ws/src
cp -r $VREP_ROOT/programming/ros_packages/* .
cd ../
catkin build
cp ~/vrep_ws/devel/lib/*.so $VREP_ROOT
```
準備が終わったら次は実際にROSと連携可能な状態で起動してみましょう。
ターミナルを2つ立ち上げて以下のコマンドを入力してください。

```bash:terminal1
roscore
```

```bash:terminal2
cd $VREP_ROOT_DIR
./vrep.sh
```

![Screenshot from 2017-08-10 15:31:24.png](https://qiita-image-store.s3.amazonaws.com/0/160346/bc648c78-b9cd-f3b6-35aa-cc7786d91fa5.png)


立ち上がりました！
お！tf出てるやんと行って確認してみたところ・・・
![Screenshot from 2017-08-10 15:36:27.png](https://qiita-image-store.s3.amazonaws.com/0/160346/5afe5912-80bf-3c28-1226-591b6faccce2.png)

tfがないやん・・・
あとJointStateとかもほしいなあ・・・
そのあたりはまた次回でまとめたいと思います。
CORSを許可したLaravel製APIサーバーでput, patch, deleteが出来なくて泣いてたけど、ようやく解決出来た話

# 経緯

Vue.js×Laravel5.4のSPAを作ろうと思い、APIをサクッとに作って良い気分のままVueの実装に入ったところ、put, patch, deleteでクロスドメイン絡みのエラーが出てしまい詰んでました。。
全部POSTにしようかなと諦めかけた時、同じオフィスにいた神様が答えとなる記事を見つけてくれて解決しました:grinning:

わりとぶつかりそうな問題なのに日本語記事全然なかったので書いてみました:muscle:

# 前提
Laravel5.4

# 解決策

いきなり解決策いきます。

NGパターン

```php:routes/api.php
Route::put('/test', 'TestController@update');
```

OKパターン

```php:routes/api.php
Route::match(['options', 'put'], '/test', 'TestController@update');
```

# 解説

正直CORS周り詳しくないんで、間違っている部分はご指摘頂けるとありがたいです:bow:

## CORSにおけるGET、POSTとそれ以外(PUT, PATCH, DELETE)の違い

[こちら](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control)の `プリフライトリクエスト` を見て頂ければわかる通り、GET、POST以外のリクエストの場合は指定したメソッドの前にOPTIONSメソッドでリクエストが実行されます。

## Laravel側が抱えるOPTIONSメソッドまわりの問題

[こちら](https://developer.mozilla.org/ja/docs/Web/HTTP/HTTP_access_control)に書いてあるんですが、英語得意じゃないんでもし間違っていたらすいません:sweat_drops:
一応私なりの解釈を書いていきます。

まず、Laravel側でCORS対策しようとすると、 [こちら](https://github.com/barryvdh/laravel-cors)のようなミドルウェアを仕込むのが一般的だと思います。
このようなミドルウェアを通るGET, POSTのルーティングは問題なく通信出来るのですが、プリフライトリクエストが必要なPUT、PATCH等の場合、一度 `OPTIONSメソッド` でリクエストが送られます。
この `OPTIONSメソッド` がLaravelの問題で、 `ミドルウェアを通る前にルーティングに入ってしまう為、必要なルーティングに到達出来ない` ということみたいです。

ですので、解決策のOKパターンにある通り、PUTやPATCH等で受けるルーティングはOPTIONSでも受け取れるようにしておくことで正常にアクセス出来るようになります。

これ以上深い部分は全然わかってないのでここまでにしておきます:sweat_smile:

# さいごに

Laraelを1年弱触っていて、触れば触るほど好きになっていた中、はじめてイラッとしました。
が、今回少しだけLaravelのかわいい一面が見れて更に好きになりました笑

今月中に5.5が出るみたいなので、出たらすぐに触りたいし、今後もLaravelと仲良くやっていきたいなと思いました:hugging_face:

# 2017-08-18 追記

これで全てうまく行く！と思っていたんですが甘かったです。。。
↓のようなルーティングをしていまして、

```php:routes/api.php
Route::match(['options', 'patch']'/{test_id}', 'TestController@update');
Route::match(['options', 'delete'], '/{test_id}', 'TestController@destroy');
```

よし、patchで更新しようかなと思って実行したらデータが消えてしまいました。。。

よくよく追ってみたら

1. options, patchメソッドに対して `/{test_id}` のルーティングが有効になる
2. options, deleteメソッドに対して `/{test_id}` のルーティングが有効になる(ここでoptionsのルーティングが上書きされる)
3. patchメソッドを実行すると
    1. `TestController@destroy`　が実行される
    2. `TestController@update` が実行される

となっていました:sweat_drops:
optionsメソッドのルーティングがdeleteのmatchで上書きされるのはわかるんですが、なにもdestory実行しなくても。。。

根本解決してる時間がなかったので、今回は

```php:app/Http/Controllers/Controller.php
<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function options()
    {
        // クロスドメイン環境からOPTIONSメソッドを許可する為の暫定関数
    }
}
```

で親側にOPTIONSメソッド用暫定関数を仕込んで、

```php:routes/api.php
Route::options('/{test_id}', 'TestController@options');
Route::patch('/{test_id}', 'TestController@update');
Route::delete('/{test_id}', 'TestController@destroy');
```

put,patch,deleteを使う時はoptionsメソッド用の暫定関数へのルーティングも追記することで回避しました。。。

optionsメソッドってスリーハンドシェイク的な役割だけだと思ってたのにえらい挙動してくれました。。。

知見お持ちの方いらっしゃいましたら是非コメント頂けますと幸いです:bow:

5.5でここがどうなってるのかすごく気になります。
Qiitaユーザーのための通話表


- [通話表(phonetic code)](https://ja.wikipedia.org/wiki/%E9%80%9A%E8%A9%B1%E8%A1%A8)って知ってますか？A・B・Cをアルファ・ブラボー・チャーリーっていうヤツです。
- …知りません？アルファベットを間違えないように「A」なら「アルファ（のA）」と伝えるんです。

## でもちょっと古い？

- 通話表は時代によって変わります。
- Tは最初はTokioだったのにTokio→Tripoli→Tare→Thomas→Tripoli→Tangoのように変遷してるようです。
- それなら、Qiitaでよく使われてるキーワードで通話表を作ったほうが通りがいいですよね？

## 作り方

- [Qiita タグリスト](http://qiita.com/tags)から上位のものを選びます。人気のタグ・キーワードなので通りがいいはずですよね？
- ※最初に記号が入ってるのは無視してます。
- node.jsとかでスクリプト組むほどでもないのでワンライナーで作りました。

```javascript
var x = document.getElementsByClassName('u-link-unstyled TagList__label');var h = {} ;for (var z = 0; z < x.length; z++) {var v = x[z].innerText;var k = v.substr(0,1).toUpperCase(); if (!h.hasOwnProperty(k)) {h[k]=v}; };console.log(h);
```

## 通話表完成！

- 上記スクリプトで生成したのがこの通話表です、Yのyhpgってなんだろ？ｗ

- 「H・e・l・l・o」なら「HTML - Emacs - Linux - Linux - Objective-C」となります。
- これなら帯域が狭くてもノイズが多くでもバッチリ通じますよね？！

|Letter|Phonetic|
|:----:|:-------|
|A| Android|
|B| Bash|
|C| C#|
|D| docker|
|E| Emacs|
|F| fluentd|
|G| Git|
|H| HTML|
|I| iOS|
|J| JavaScript|
|K| Kotlin|
|L| Linux|
|M| Mac|
|N| Node.js|
|O| Objective-C|
|P| Python|
|Q| Qiita|
|R| Ruby|
|S| Swift|
|T| TensorFlow|
|U| Unity|
|V| vagrant|
|W| Windows|
|X| Xcode|
|Y| yhpg|
|Z| Zsh|
CFアプリ開発と管理


[IBM Cloud ドキュメント](https://console.bluemix.net/docs/)には、PaaSのサービスのドキュメントは、とても充実しているのですが、Cloud Foundry のランタイム環境についての情報が、ほとんどありません。 

このため、本格的な アプリケーションのアーキテクチャを検討して、プログラムを設計したり、運用をデザインするには、[Cloud Foundry マニュアル（英語)](https://docs.cloudfoundry.org/)にアクセスする必要があります。 

そこで、その中でも特に重要となる「アプリケーションの開発と管理」の部分を独自に翻訳して、Bluemixの場合について、コメントを追加しました。


# アプリケーションの開発と管理

1. [クラウドでのアプリの設計と実行に関する考慮事項](http://qiita.com/MahoTakara/items/6196d13df5ef98c0be6f)
2. [アプリのデプロイ](http://qiita.com/MahoTakara/items/8404b9b2ebb423babb4e)
3. [大規模アプリのデプロイ](http://qiita.com/MahoTakara/items/78796887dc9ff5a18c5c)
4. [Dockerでアプリをデプロイする](http://qiita.com/MahoTakara/items/857e8ad96cd96d4053c6)
5. [アプリの起動、再起動、および再ステージ](http://qiita.com/MahoTakara/items/fefde9dc05eb3fe3218d)
6. [アプリ・マニフェストによるデプロイ](http://qiita.com/MahoTakara/items/888ffdadbf34fd2033d6)
7. [アプリ・コンテナのライフサイクル](http://qiita.com/MahoTakara/items/905a61ccc56c8daef2de)
8. [アプリ・ヘルスチェックの使用](http://qiita.com/MahoTakara/items/9be106c960de44861ee8)
9. [cf scale によるアプリのスケール](http://qiita.com/MahoTakara/items/6cdb1d0cad4fe506c7b5)
10. [タスクの実行](http://qiita.com/MahoTakara/items/e749ed9a79c090cd22de)
11. [ルートとドメイン](http://qiita.com/MahoTakara/items/c34b3a1b117683a6e326)
12. [スタックの変更](http://qiita.com/MahoTakara/items/a4333d9ebed6ccd8bd66)
13. [CloudFoundry環境変数](http://qiita.com/MahoTakara/items/10fdd46d38917bfe047b)
14. [Blue-Greenデプロイを使用してダウンタイムとリスクを削減](http://qiita.com/MahoTakara/items/0e4445e04646b6fb5259)
15. [Cloud Foundry のアプリ・ロギング](http://qiita.com/MahoTakara/items/b4114e7111aaa4a5dbc5)
16. [アプリのデプロイとトラブルシューティング](http://qiita.com/MahoTakara/items/407db034e23edae97406)
17. [アプリSSH概要](http://qiita.com/MahoTakara/items/1036405825fb24672730)
18. [アプリへのSSHアクセス](http://qiita.com/MahoTakara/items/6bd8526b1679f503e572)
19. [サービスへのSSHアクセス](http://qiita.com/MahoTakara/items/29750ce3257315bcf174)
20. [Cloud Foundry APIのエンドポイントとバージョンの特定](http://qiita.com/MahoTakara/items/4880612a0c402cbb87f7)

21. アプリとサービスインスタンスの統合
  1. サービス概要
  2. アプリへのサービス資格情報の提供
  3. cf CLIによるサービスインスタンスの管理
  4. サービス鍵の管理
  5. [ユーザー提供サービスインスタンス](http://qiita.com/MahoTakara/items/9d03414689fe1b2b9cd2)
  6. ルートサービスによるアプリ要求の管理
  7. [外部ファイルサービスの利用（ボリューム・サービス）](http://qiita.com/MahoTakara/items/9c737fd7f2c2677f75b6)
  8. Play Framework サービス接続の設定
  9. Cloud Foundry でのデータベース移行
 10. アプリ・ログをログ管理サービスにストリーミングする
 11. アプリ・ログをストリーミングするためのサービス固有の手順
 12. アプリ・ログをSplunkにストリーミングする



# その他リソース
* [Cloud Foundry CLI Reference Guide（日本語）](http://cli.cloudfoundry.org/ja-JP/cf/)
* [CLOUD FOUNDRY ユーザーグループ](http://cloudfoundry.gr.jp/)
* [Pivotal Cloud Foundry マニュアル](https://docs.pivotal.io/pivotalcf/1-11/installing/highlights.html)
Team AI FinTech データハッカソンを開催しました(20170809)

Team AI FinTech データハッカソンを開催しました。

![20708210_10211936773807752_6000671581119160691_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/76304/02eda1d3-654c-43d2-ad4b-315a393128c4.jpeg)


金融、IT、メーカー、学生、トルコ人の方々含め、ユニクロの株価予測モデル構築中心に取り組みました。本日キックオフでしたが、非常に良いアウトプットが出せたと思います。
皆でチャレンジした株価データはこちら；
https://www.kaggle.com/…/uniqlo-fastretailing-stock-price-p…
トピック;
移動平均法
Boosting(XGBoost)
ARIMA model
SARIMA model
ARMA model
ベイジアン回帰
Randam Forest
Support Vector Regression
RNN
LSTM
指数荷重移動平均法
オススメ本；
データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)
Python3ではじめるシステムトレード ──環境構築と売買戦略
日経ソフトウエア 2017年 09 月号
オススメのブログ；
http://logics-of-blue.com/
http://kamonohashiperry.com/
http://qiita.com/m-hayashi/items/ee379c86e3e18f0ddc6d
http://qiita.com/yai/items/c251ed3300209e65c123
これから追加するデータ；
FX USD/JPY
日経平均
INDEX
BitCoin
BitCoinCash
Ethreum
明日は19:00より医療データハッカソンです。
まだ空席あります。お気軽に遊びに来てください。
https://www.meetup.com/Machine-Learning-Meetup-by-team-ai/
#100万人の機械学習コミュニティを東京に創る
#DataHackathonEveryday
#OpenInnovationMovement
#Skillup #Career
Dockerイメージの作り方

Docker（ドッカー）イメージはコンテナの元だ。例えば、MySQLを運用するコンテナはMySQLイメージで起動する。ドッカーイメージは[Dockerfile](https://docs.docker.com/engine/reference/builder/)　（ドッカーファイル）で定義する。単純なネイティブなコードは入っていないプロジェクトを下記のドッカーファイルでイメージに生成できる：

```:Dockerfile
# FROM <イメージ名>:<バージョンタグ>
# このイメージを元に使って
FROM node:8.2.1-alpine

# イメージの中にアプリ用ディレクトリを作成
RUN mkdir -p /opt/myapp

# イメージの中の"cd"
WORKDIR /opt/myapp

# Dockerfileのディレクトリの中身をイメージの中のWORKDIRにコピー
COPY . .

# コンテナのポート8000をホストに開示
EXPOSE 8000

# イメージの起動の時実行されるコマンド
CMD ["npx", "http-server", "-p", "8000"]
```

上記のドッカーファイルは[Alpine](https://alpinelinux.org)と言う軽いLinuxを利用する。

ネイティブなコードをコンテナの中でコンパイルする必要がある場合、Dockerfileにコンパイルステップが必要：

```:Dockerfile
# FROM <イメージ名>:<バージョンタグ>
# このイメージを元に使って
FROM node:8.2.1-alpine

# イメージの中にアプリ用ディレクトリを作成
RUN mkdir -p /opt/myapp

# イメージの中の"cd"
WORKDIR /opt/myapp

# Dockerfileのディレクトリの中身をイメージの中のWORKDIRにコピー
COPY . .

# コンパイルステップは一つのRUNだけで行う
RUN \
	# コンパイルに必要な依存をインストール
	apk add --no-cache --virtual build-deps \
		python=2.7.13-r1 \
		make=4.2.1-r0 \
		g++=6.3.0-r4 && \
	# コンパイル
	npm rebuild && \
	# コンパイル依存はもういらないのでイメージに無駄に入らないように同じRUNの中でアンインストール
	apk del build-deps

# コンテナのポート8000をホストに開示
EXPOSE 8000

# イメージの起動の時実行されるコマンド
CMD ["npx", "http-server", "-p", "8000"]
```

## ドッカーイメージの生成
Dockerfileのディレクトリの中で：
`docker build --tag <organization>/<project>:<tag> .`

organization（任意）：　普通にDocker Hubでのアカウント名
project（必須）：　プロジェクト名
tag（任意）: 設定しないといつもlatestタグがイメージに付けられる。

## コンテナの起動
`docker run --publish 8000:3000 --detach --name mycontainer --env PORT=3000 <organization>/<project>:<tag>`

上記のコマンドでPORT=3000という環境変数がコンテナに渡されて、コンテナのポート3000がホストOSのポート8000でアクセスできるように起動される。

### 最新のMySQLイメージでコンテナを起動：

`docker run --name my-mysql-container --env MYSQL_ROOT_PASSWORD=mypassword --detach mysql:latest`
pixivの技術ブログで紹介されてたHeadless Chromeのコードをchromyで３分の１にしてみた

下記の記事で紹介されていたコードを[chromy](https://github.com/OnetapInc/chromy)で書き直してみた。

[Headless Chromeでデザイン変更履歴を追える魚拓を作ってみた](https://inside.pixiv.blog/abcang/2064)

元コードが空行とコメント抜いて66行くらいで、chromyで書いたコードが21行。

```js
const Chromy = require('chromy')
const util = require('util')
const fs = require('fs')

const writeFile = util.promisify(fs.writeFile)

async function main () {
  const chromy = new Chromy({waitFunctionPollingInterval: 200})
  await chromy.chain()
    .goto('https://www.pixiv.net/')
    .wait(_ => {
      const result = (window.scrollY + window.innerHeight >= window.document.body.scrollHeight)
      window.scrollTo(0, window.scrollY + window.innerHeight)
      return result
    })
    .screenshotDocument()
    .result((image) => {
      return writeFile('capture.png', image)
    })
    .end()
    .then(_ => chromy.close())
}

main()
```
案 > SourceTree | PowerShell > 設定ファイル(.git/config)変更時に{Slackに通知する | 変更をカウントする} > 没

SourceTree(Windows版)に関して。

https://jira.atlassian.com/browse/SRCTREEWIN-7592
を見ているとbranchの削除、生成において設定ファイル(.git/config)に予想以上のCreateFile処理が発生しているとのこと。
> Robert Sirre (CS)
> Wow, I attempted to see what operations are performed on this file when using SourceTree and for instance, deleting and checking out a branch, but this results in an enormous amount of 'CreateFile' operations.

[Powershell / slack / vivado > Generate Block Design終了時slack通知 (v0.3) > 終了時に1回通知されるようになった](http://qiita.com/7of9/items/3d1473925fd94e2ca2db#_reference-989a97c032232d6f7d64)
で用いたようなPowerShellスクリプトを用いると、設定ファイル変更時にSlack通知することはできそう。

Slack通知しなくてもカウントを数えるというだけでもいいかもしれない。

https://technet.microsoft.com/ja-jp/library/ee177002.aspx
> 停止時間は、-m パラメータを使用してミリ秒で指定することもできます。

タイムスタンプの比較だとミリ秒単位はキャプチャできないだろうか。

**疑問点: CreateFile()の回数を知ることで、ソフトの改善にどう結びつけることができるだろうか**。

http://qiita.com/7of9/items/3d1473925fd94e2ca2db#_reference-989a97c032232d6f7d64
> PowerShellはアクティブになっていないと処理がされないのかもしれない。この点はUnityのアプリと一緒で、バックグラウンドで動かす方法を見つけないとチェック処理をしているつもりでも、通知がされなくなる。

ウィンドウがアクティブでないと取りこぼしそう。
SourceTreeを使いながらPowerShellでキャプチャするのは、自分の知識ではすぐに実装できないだろう。
JavaScript で PHP の strtotime() を実装する


```js:strtotime()
/**
 * 日付文字列を時刻値 (ミリ秒)に変換
 * 
 * @param  {string} d
 * @return {number}
 */
function strtotime( d ) {
  return new Date( d ).getTime();
}

```

# 使ってみる
```js

let timeA = strtotime( "Tue Aug 08 2017 00:00:00 GMT+0900 (JST)" );
let timeB = strtotime( "Wed Aug 09 2017 00:00:00 GMT+0900 (JST)" );

console.log( timeA );
console.log( timeB );
console.log( typeof timeA );

if ( timeA > timeB )
  console.log( 'timeA is latest.' );
else
  console.log( 'timeB is latest.' );


/*
1502118000000
1502204400000
number
timeB is latest.
*/

```
名前付き引数的な型パラメータ（遊び）

数あまたの型パラメータが何を指定したいのかさっぱりわからん！

```ts
function foo<A, B, C, D>(saisyo: A, tsugi: B, sonotsugi: C, saigo: D) { ... }

foo<number, boolean, string, object>(1, true, '', {});
```

そんなときはこう！

```ts
function foo<{
  saisyo: number;
  tsugi: boolean;
  sonotsugi: string;
  saigo: object;
}>(0, 1, '', {});

type FooTypeParams = {
  saisyo: any;
  tsugi: any;
  sonotsugi: any;
  saigo: any;
};

type Foo<T extends FooTypeParams> = {
  saisyo: T['saisyo'];
  tsugi: T['tsugi'];
  sonotsugi: T['sonotsugi'];
  saigo: T['saigo'];
};
```

やったぜ。

---

余談：引数自体を名前付き引数にすればいいだけ説もある（有力）
構造体メンバ変数を直接、範囲for文で回してみた


構造体メンバ変数をそのままforで回せたらいいな、と思うことありますよね?
こんな感じで。

```C++:
#include <iostream>

struct A{
  int aa;
  int bb;
  int cc;
};

A a {1,2,3};

int main(void){
  for(const auto& d: a){
    std::cout << d << std::endl;
  }
}
```
でもこれはうまくいかないようです。[paiza.io](https://paiza.io)で試してみました。

```
//コンパイルエラー
Main.cpp:14:20: error: invalid range expression of type 'A'; no viable 'begin' function available
  for(const auto& d: a){
                   ^ ~
1 error generated.
```

怒られちゃいました。

参考にした[範囲for文](https://cpprefjp.github.io/lang/cpp11/range_based_for.html)によると
> 語弊を恐れず言えば、メンバ関数にbegin()およびend()を持つクラスであれば、何でも範囲for文の範囲として指定できる。

そうなので、始まりと終りの場所を返す関数をてきとーに作ってくっつけてみました。
aa,bb,ccの順に並んでるとして、beginは自分自身のaaの場所、endは自分自身のccの後、といった気持です。

```C++:
#include <iostream>

struct A{
  int aa;
  int bb;
  int cc;
  int* begin( )  {return &this->aa     ; };
  int* end( )    {return &this->cc + 1 ; };
};

A a {1,2,3};

int main(void){
  for(const auto& d: a){
    std::cout << d << std::endl;
  }
}

```

```C++:
//出力結果
1
2
3
```

動いた!

Arduinoでもやってみました。
![スクリーンショット 2017-08-10 19.51.11.png](https://qiita-image-store.s3.amazonaws.com/0/61597/a874559a-3a54-8ac1-4be9-6a82a5b712c7.png "スクリーンショット 2017-08-10 19.51.11.png")
動いた!

これで多値をまとめて処理したりするのがちょっと簡単になるかも。

~~動いてるので取り敢えず使いたいと思います~~。やっぱりやめた。こっちにします。詳細はコメント見てください。

```C++:
#include <iostream>

struct A{
  int bb[3];
};

A a { {1,2,3} };

int main(void){
  for(const auto& d: a.bb){
    std::cout << d << std::endl;
  }
}
```
ちょっと表題とは違ってくるけど、同じようなことができる。

ざっくりとした考えでやってるんで、違うよ、もっといい方法があるよ、というのがあればコメントお願いします。
Google Cloud Container Builderでgo-depを使う

# tl;dr

- depはまだ人柱感満載
- GCCBでdep使うなら`-vendor-only`をつけるべし

# Google Cloud Container Builder(GCCB)でdepが転ける

ちょっと大きめの開発ブランチで作業していたんで、2週間ぶりぐらいにGCCBでdeployしたら、[dep](https://github.com/golang/dep)でこける。
エラーメッセージは以下のような感じ。

```
Step #6 - "dep-ensure": Running: dep ensure
Step #6 - "dep-ensure": Found 5 errors:
Step #6 - "dep-ensure": 
Step #6 - "dep-ensure": import path app/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/relimport/dotslash had a local import: "./simple"
Step #6 - "dep-ensure": import path app/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/relimport/dotdotslash had a local import: "../github.com/golang/dep/internal/gps"
Step #6 - "dep-ensure": import path app/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/relimport/dotdot had a local import: ".."
Step #6 - "dep-ensure": /workspace/gopath/src/github.com/golang/dep/cmd/dep/testdata/harness_tests/ensure/pkg-errors/case2/initial/bar/bar.go:3:51: expected 'package', found 'EOF'
Step #6 - "dep-ensure": /workspace/gopath/src/github.com/golang/dep/internal/gps/_testdata/src/bad/bad.go:6:43: expected 'package', found 'EOF'
```

なんかdep内の_testdata内でlocal import使ってるからだめよって。。
ってこれ、depのtest用のソースなんですけど…

ちなみにローカルではもちろんエラーになっていない。

# depのリリースを確認

GCCBでは毎回Docker内でgo-getしてdepをいれるので最新のdepで実行されてしまう。
つまり、dependencyのバージョン固定のためのツールであるdep自体のバージョンを現状では固定できない。
(Docker作っておけばいいんだけど)

それでdepの[リリース](https://github.com/golang/dep/releases)をみてみる。
0.3.0というバージョンで大きめのリファクタがされたらしい。
たしかにこのリリースの後にデプロイしたことない。

# `-vendor-only`オプション

0.3.0からensureにいくつかオプションが追加されたのですが、`-vendor-only`オプションが追加されました。
helpみると

> -vendor-only  populate vendor/ from Gopkg.lock without updating it first (default: false)

とあります。
導入の経緯は[Issue](https://github.com/golang/dep/issues/796)にありますが、`*.go`を解析することなく、Gopkg.lockからvendorにDLしてくれるだけのようです。
前述のエラーは`*.go`の解析時にエラーとなっていたので、このオプションを指定することで無事回避[^1]できました。
[^1]: オプションの本来の目的と違いますが…

# まとめ

- depはまだ人柱感があって地雷を踏みぬく覚悟が必要そうです
 - depがv1.0になって、GCCB Official Repositoryでサポートしてくれないかなー
 - それまではDockerHubあたりにバージョン固定でimageを作っておくのが無難かも
Macのターミナルからjupyter notebookを実行してもブラウザ(Chrome)が開かなくなった



以下のようなメッセージが表示された

```
Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=XXXXXXXXXXXX
0:97: execution error: "http://localhost:8888/tree?token=XXXXXXXXXXXXXXX"は“open location”メッセージを認識できません。 (-1708)
```


[ここ](https://github.com/jupyter/notebook/issues/2438#issuecomment-301736816)に同様の現象に対する対策が書いてあったので、やってみたら動いた

```
c.NotebookApp.browser = u'open -a /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome %s'

```
を書いて以下のパスに「jupyter_notebook_config.py」として保存
（なかったらフォルダごと作ってOK）

```
~/.jupyter/
```

他にもやり方ありそうだけど、たぶんこれが一番シンプル。
（ブラウザに合わせてパスは変更する必要あり）
XCode9 beta5でARKitのサンプルを動かす

とりあえずサンプルを動かすまでの記録。
Xcode9 beta5環境でのエラー対処法です。

# XCode9 beta5でARKitを試す
Xcode9のbetaをインストールして立ち上げると、新規プロジェクトを作る際に
「Augmented Reality App」が選択できるようになっている。
デフォルトのままBuildすると、飛行機が空間上に浮かぶARアプリを見る事ができる。

しかし、実機で動かそうとするとThread 1: signal SIGABRTのエラーと
下記のエラーメッセージが表示される。

```
dyld: Symbol not found: _OBJC_CLASS_$_ARWorldTrackingConfiguration
  Referenced from: /var/containers/Bundle/Application/AE0CBEAE-0D10-4AED-8885-AE0B274749AA/TestAR.app/TestAR
  Expected in: /System/Library/Frameworks/ARKit.framework/ARKit
 in /var/containers/Bundle/Application/AE0CBEAE-0D10-4AED-8885-AE0B274749AA/TestAR.app/TestAR
(lldb) 
```

# フレームワークの追加
「Linked　Frameworks and Libraries」にてARKit.frameworkを追加する。
その際、Requiredのままだと何故かエラーとなるため、Optionalに変更する。
ビルドすると、まだエラーが出る。
```
Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)
```

# 解決策
```swift:ViewController.swift
        // Create a session configuration
        //let configuration = ARWorldTrackingConfiguration()
        let configuration = ARWorldTrackingSessionConfiguration()

```

ViewController.swiftの上記１行を変更してやればOK
ARWorldTrackingSessionConfigurationはiOS11でdeprecated予定との事ですが
ひとまずこの対処で動きます。
CodeStarでAPIを公開する

AWS CodeStarを用いて簡単にAPIを公開する方法を記載します。
CodeStarを利用すると、1から設定するのは結構大変な以下サービスなどをテンプレートより一気に作成できます。

+ AWS CodeCommit(レポジトリ)
+ AWS CodeBuild(自動ビルド)
+ AWS CodePipeline（継続的デリバリ）
+ AWS CodeDeploy(自動デプロイ)
+ AWS CloudFormation(インフラ構成管理)

# 前提

+ CodeCommitの認証セットアップ

http://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-unixes.html

# 手順

### CodeStar選択 
2017/8/10時点では、東京リージョンでは利用できないので、CodeStar選択の後、任意のリージョンへ。

![スクリーンショット 2017-07-27 時刻 19.39.17.png](https://qiita-image-store.s3.amazonaws.com/0/73176/8a354728-9374-52ad-fdcf-f51984cfc3b9.png)

### プロジェクト作成

![スクリーンショット 2017-07-27 時刻 19.50.29.png](https://qiita-image-store.s3.amazonaws.com/0/73176/ffd47dad-1254-de40-5d85-328eb03a9744.png)

### テンプレート選択

AWS Lambdaをチェックして、任意の言語を選択する
※以下はnode+Expressを選択した例

![スクリーンショット 2017-07-27 時刻 19.55.03.png](https://qiita-image-store.s3.amazonaws.com/0/73176/331851fa-73c1-f71a-589c-446f18c44229.png)

### プロジェクト名設定

![スクリーンショット 2017-07-27 時刻 19.55.55.png](https://qiita-image-store.s3.amazonaws.com/0/73176/0ea1433d-23b5-7e69-722c-bf0b66e2b17d.png)

### IDEの設定

必要ないので、Command line tools選択

![スクリーンショット 2017-07-27 時刻 19.58.40.png](https://qiita-image-store.s3.amazonaws.com/0/73176/a48a07f3-4dae-be3b-274f-5e8c8552a92b.png)

レポジトリとの接続方法を教えてくれます。
確認の後、Skipします。

![スクリーンショット 2017-07-27 時刻 19.58.53.png](https://qiita-image-store.s3.amazonaws.com/0/73176/f1b98e50-f7e7-c56d-0c28-df1975076048.png)

### 自動ビルド

以上で設定が完了です。
→テンプレートモジュールの自動ビルドが走ります。

![スクリーンショット 2017-07-27 時刻 20.02.08.png](https://qiita-image-store.s3.amazonaws.com/0/73176/c67a1388-7d1d-05e1-a6bc-3e986035c635.png)

### API更新

自動ビルドが完了すると、管理コンソール右上部の「Application Endpoint」をクリックすると、APIのEndpointへ接続できます。
プログラムを修正後、CodeCommitへpushすると、更新バージョンが自動でデプロイされます。
※CodeCommitへは管理コンソール左上部より遷移できます。

![スクリーンショット 2017-08-10 時刻 17.03.13.png](https://qiita-image-store.s3.amazonaws.com/0/73176/cfb402e4-7dcb-28e6-74e9-aa59ec41c00f.png)


![スクリーンショット 2017-07-27 時刻 20.22.19.png](https://qiita-image-store.s3.amazonaws.com/0/73176/a150193e-31d0-1e4b-2584-0bd4e9a84cb2.png)

# 注意

AWS 無料利用枠を超えると、APIコール回数（Lambda実行時間）で課金されるので、サービス公開前は念のため、使用量プランで呼び出し回数を制限しておきましょう。

https://aws.amazon.com/jp/lambda/pricing/
http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-usage-plans.html
【Node.js】PM2&Keymetrics導入の検討

Nodejsを業務で利用することになったので、その運用、監視ツールとしてPM2導入検討の資料を作成してみました
 
## 概要
**PM2**・・・プロセス管理、デーモン化（オープンソース）
`Advanced, production process manager for Node.js`
http://pm2.keymetrics.io/
 
**keymetrics**・・・PM2のWeb管理、監視ツール
`Monitoring Reliability, Performance and Errors For Node.js Applications`
https://keymetrics.io/
・複数のPM2の統計データをモニタリングすることが可能
・Web上からマニュアルで再起動も可能
・Gitでのデプロイも可能
 
## 導入理由
### (1) Express.jsのページで紹介されていること
```
Express アプリケーションを実動で実行する際、以下のタスクを実行するためにプロセス・マネージャー を使用すると便利です。
 
・アプリケーションが異常終了した場合に自動的に再始動する。
・ランタイム・パフォーマンスとリソース使用量に関するインサイトを得る。
・パフォーマンスを向上させるために設定を動的に変更する。
・クラスタリングを制御する。
 
Express およびその他の Node.js アプリケーション用の最も一般的なプロセス・マネージャーは次のとおりです。
 
・StrongLoop Process Manager
・PM2
・Forever

http://expressjs.com/ja/advanced/pm.html
より引用
```

### (2) 有名企業での採用実績が豊富なので信頼性に期待ができる
http://pm2.keymetrics.io/users/ 

## 機能
 
### PM2
- **プロセスのデーモン化**
    - バックグラウンドで実行
- ログ収集
    - エラーログの収集
- クラスタリングと再起動
    - 2プロセスが起動されて、通常は１プロセスで実行されるが、障害がおきると、もう一つのプロセスに自動で切り替わって、その間に障害のあったプロセスを自動で再起動してくれる
- 動作設定
    - PM2で管理するプロセスについて、細かな設定が可能です。設定は、JavaScript形式、JSON形式、YAML形式をサポートします。
- PaaS 互換
    - PM2のAPIを利用することで、さまざまなPaaS(Heroku/Google App Engine/Azure)上から、PM2との連携が可能です。
- **監視とリロード**
    - アプリケーションのファイルやディレクトリの変更を検知して、自動的にアプリケーションを再起動できます。
- ログ管理	
    - リアルタイムログの確認や、JSON形式での情報取得、ログローテーションなどが利用できます。
- モニタリング
    - プロセスごとのCPU／メモリ使用率、メタデータ、グローバルログの確認ができます。
- 最大メモリ制限	
    - 設定した上限メモリ値を超えたプロセスを自動で再起動させることが可能です。
- クラスタモード	
    - Node.jsアプリケーションプロセスを全CPU、全CPU - 1、特定CPUに割り当てたりすることが可能です。
- ホットリロード	
    - reloadコマンドにより、プロセスのダウンタイム0秒を実現できます。
- 開発者モード	
    - 開発者向けに開発モード(ファイルの変更に応じたリスタートに対応など)でアプリケーションを起動させることが可能です。
- 起動スクリプト	
    - 起動システム(systemd、upstart、launched、rcd、systemv)に応じた起動スクリプトが提供されます。

http://openstandia.jp/oss_info/pm2/
より抜粋

### Keymetrics
- モニタリング	
    - Keymetricsと連携させることにより、複数のPM2の統計データをモニタリングすることが可能になります。
- Git連携	
    - git と連携したデプロイが可能です。


## foreverとの比較
nodejs用だと、foreverとPM2が有名だが、Keymetricsなど本番運用を想定したWebツールを利用することができない。

- http://strong-pm.io/compare/?_ga=2.242139330.1704475101.1499206633-1276112968.1499206633
- http://qiita.com/m1takahashi/items/88e97053aecae8787a82

## コマンド
```:起動コマンド
## 通常 
$ pm2 start app.js

## 開発モード
$ pm2 start app.js --watch
```

```:リアルタイムモニター
 $ pm2 monit
```


## 各種リンク
- [PM2ドキュメント](http://pm2.keymetrics.io/docs/usage/quick-start/)
【UML】UMLツールのPlantUMLのサンプル

UMLツールで良いのがないかと探したところ、PlantUMLがあったのでこれのサンプルを並べてみて、業務の参考にすることにしました。

## メリット
- 完成したものをGitで管理すれば、画像と違って文字なので差分を把握することができます。
- 図が書くのが苦手な人でも自動で描画してくれるので安心です
- Chromeの拡張プラグインもあるので、ポータビリティもあります
    - https://chrome.google.com/webstore/detail/uml-diagram-editor/hoepdgfgogmeofkgkpapbdpdjkplcode?hl=en-GB
    - ローカルPCにファイルを保存できるって感じです。

## シーケンス図

### リファレンス
http://plantuml.com/sequence-diagram

### サンプル

[![alt](http://www.plantuml.com/plantuml/svg/JSuz3e0W30NWlQVe1HpyOt1mz0HUe2A32Q49rC7RQqKCu-DhteEiSCI5kOMDpx1Jl3HrO3b8PA-X1nVaa1S6s4bee-GqZS-PzyxAmI7fWm6jmcP-It32bR7qrjHd-aPg6RBanHh636M-9bFQ_h_S)](http://www.plantuml.com/plantuml/svg/JSuz3e0W30NWlQVe1HpyOt1mz0HUe2A32Q49rC7RQqKCu-DhteEiSCI5kOMDpx1Jl3HrO3b8PA-X1nVaa1S6s4bee-GqZS-PzyxAmI7fWm6jmcP-It32bR7qrjHd-aPg6RBanHh636M-9bFQ_h_S)

```plantuml
@startuml
actor Foo1
boundary Foo2
control Foo3
entity Foo4
database Foo5
collections Foo6
Foo1 -> Foo2 : To boundary
Foo1 -> Foo3 : To control
Foo1 -> Foo4 : To entity
Foo1 -> Foo5 : To database
Foo1 -> Foo6 : To collections
@enduml
```

## ユースケース図

### リファレンス
http://plantuml.com/use-case-diagram

### サンプル

[![alt](http://www.plantuml.com/plantuml/png/TP31ReD034JFyLVus1pw0r64b2OgkQGve1vwTC0gAvOrDQOeglhlPGbDaL2FddcUyMvRkT2GKeqbXQ9NPyO1JJi6QEzUrt9EBUCNh9uehzvLkb3inOlYWRJAc59b3eChMh3E74_6gT8L5flRBPx81KmIV6FlfLz6_8V0QgSg_QtcxDqd3qfkelFwYn_w9lrPWhrGpRYNJXqh_FABauvTJMDXAhw0Ru3NbXLd1cp6amvaT1c-P8FKukcQVVW8xPh6kvpCoOW-P4Pgw-YS0sDMYetoa8bMCj8VleuvqHZfwTLJ-sE2Kz8qHo6Y0BVck_03)](http://www.plantuml.com/plantuml/png/TP31ReD034JFyLVus1pw0r64b2OgkQGve1vwTC0gAvOrDQOeglhlPGbDaL2FddcUyMvRkT2GKeqbXQ9NPyO1JJi6QEzUrt9EBUCNh9uehzvLkb3inOlYWRJAc59b3eChMh3E74_6gT8L5flRBPx81KmIV6FlfLz6_8V0QgSg_QtcxDqd3qfkelFwYn_w9lrPWhrGpRYNJXqh_FABauvTJMDXAhw0Ru3NbXLd1cp6amvaT1c-P8FKukcQVVW8xPh6kvpCoOW-P4Pgw-YS0sDMYetoa8bMCj8VleuvqHZfwTLJ-sE2Kz8qHo6Y0BVck_03)

```plantuml
@startuml
skinparam handwritten true

skinparam usecase {
	BackgroundColor DarkSeaGreen
	BorderColor DarkSlateGray

	BackgroundColor<< Main >> YellowGreen
	BorderColor<< Main >> YellowGreen
	
	ArrowColor Olive
	ActorBorderColor black
	ActorFontName Courier

	ActorBackgroundColor<< Human >> Gold
}

User << Human >>
:Main Database: as MySql << Application >>
(Start) << One Shot >>
(Use the application) as (Use) << Main >>

User -> (Start)
User --> (Use)

MySql --> (Use)

@enduml
```

[![alt](http://www.plantuml.com/plantuml/svg/LOv12eCm44NtESLVseKzW8jUeYSO9bCJ4fEGZ50flNiLKUdoyHwV7-Mbq8pgHwUmlWghpycqu5EXIXCASQ1Hdhf4mQOfZL4CiUOAdflcIUg1KMemPmHsmY7FYe_1sQBlqHtcjeeBS7-WAxHCabOOu1F7sShME8bbzrSzGDugoRR_aNL_F_Bz0G00)]

```plantuml
@startuml
left to right direction
skinparam packageStyle rectangle
actor customer
actor clerk
rectangle checkout {
  customer -- (checkout)
  (checkout) .> (payment) : include
  (help) .> (checkout) : extends
  (checkout) -- clerk
}
@enduml
```

## アクティビティ図
### リファレンス

### サンプル
[![alt](http://www.plantuml.com/plantuml/png/gmakpypDISnBDQpXAYv9B2hXiahBppUqvgfHTimhoImiJGtFo2n9hO4fCwe1Ap2o1bF6G7L81e24J924e8fDhO56vnS00000)]

```plantuml
@startuml
|Swimlane1|
start
:foo1;
|#AntiqueWhite|Swimlane2|
:foo2;
:foo3;
|Swimlane1|
:foo4;
|Swimlane2|
:foo5;
stop
@enduml
```
【Python Kivy】pyinstallerでexeファイルを作成する方法

pyinstallerでpyファイルからSPECファイルを作成します（今回pyファイルをmain.py、kvファイルをtest.kyとします）。

```
pyinstaller main.py
```

実行するとmain.specというファイルが作業ディレクトリに作成されます。
このSPECファイルを今度修正します。

ファイルを開いて、1行目にまず以下の文を挿入します。
```
from kivy.deps import sdl2, glew
```
そして次に、以下のように<font color="Red">Tree('.'),*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]</font>を追記をし、nameをkvファイル名に修正します。

```
coll = COLLECT(exe,Tree('.'),
　　　　　　　　　a.binaries,
　　　　　　　　　a.zipfiles,
　　　　　　　　　a.datas,
　　　　　　　　　*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
　　　　　　　　　strip=False,
　　　　　　　　　upx=True,
　　　　　　　　　name='test')
```

そして、再度pyinstallerで今度はSPECファイルを使ってexeファイルを作成します。
```
pyinstaller main.spec
```
そうするとdistというフォルダのなかにtestというフォルダが作成され、その中にexeファイルがはいっています。
jQueryでフォーム要素を変更できないようにする。


セレクトボックスの無効化は http://vinicius-stutz.github.io/jquery.selection.js/ を使用。

```javaScript

// 閲覧モードにする。
	if($("#viewMode").val() == 'true' ){
		
		console.log("閲覧モード");
		
		const color = 'darkblue';
		const backColor = 'lightgray';
		
		$("input[type='text']").attr('readonly', true);
		$("input[type='text']").css({'color':color, 'background-color':backColor});
		
		$("textarea").attr('disabled', true);
		$("textarea").css({'color':color, 'background-color':backColor});
		 
		$("select").disableSelection();
		$("select").css({'color':color, 'background-color':backColor});
		
		$(":button").attr('disabled', true);
		$(":button").css({'color':color, 'background-color':backColor});

		$(":checkbox").attr('disabled', true);
		$(":checkbox").css({'color':color, 'background-color':backColor});
	}

```
localstack を Docker on Mac 上で動かす

# Docker on Mac のインストール

https://docs.docker.com/docker-for-mac/install/ から入手できます。
このドキュメントにしたがって、インストールします。

# localstack パッケージの更新

pip でインストールしたパッケージは少し前まで、docker イメージが atlassianlabs/localstack になっていましたが、最近になって localstack/localstack に変更されています。

localstack パッケージは 最新版に更新しておいた方がよいでしょう。

```
pip install -U localstack
```

# localstack を Docker on Mac 上で起動

Docker on Mac が動くようになったら、`localstack` を `--docker` オプションをつけて起動します。
このとき、Docker for Mac の設定の Proxies のところで No proxy を選択して、プロキシを使用にないようにしておくことを推奨します。

```
$ localstack start --docker
```

docker イメージを自動的にダウンロードして、コンテナが起動されます。

`Ready.` が表示されれば、ローカル起動と同じように使用できます。

docker run で起動していますので、Ctrl-P Ctrl-Q でデタッチできます。

停止するときは、`docker ps -a` でコンテナIDを確認して、

```
docker stop コンテナID
```

で停止します。

再開するときは、

```
docker restart コンテナID
```

です。

`localstack start --docker` を実行すると、もうひとつ新しいコンテナを作ってしまいます。




# `WARNING:infra.pyc:Service "kinesis" not yet available, retrying...` のあとエラーになる場合

Docker コンテナで起動したとき、次のようなエラーが出ることがあります。

```
WARNING:infra.pyc:Service "kinesis" not yet available, retrying...
ERROR:infra.pyc:Error checking state of local environment (after some retries): Traceback (most recent call last):
File "/opt/code/localstack/localstack/services/infra.py", line 285, in check_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'
Traceback (most recent call last):
File "bin/localstack", line 79, in <module>
infra.start_infra()
File "/opt/code/localstack/localstack/services/infra.py", line 359, in start_infra
raise e
TypeError: 'NoneType' object has no attribute '__getitem__'
```

このようなときは Docker for Mac の設定の Proxies のところで No proxy を選択して、プロキシを使用にないようにしてみてください。

プロキシを使う設定なっていると、Docker 内で起動した localstack がモックサーバの起動チェックをするときに、プロキシ経由でアクセスして、チェックに失敗することがあります。
TypeScriptのリンター（TSLint）の設置

# TSLintとは？
単純に言うと、[TSLint](https://palantir.github.io/tslint)はTypeScriptに向けている[ESLint](http://eslint.org)のようなリントツール（つまり、リンター）だ。

# リンターとルールのインストール
オススメのルールは[AirbnbのJavaScriptに向けているESLintルール](https://www.npmjs.com/package/eslint-config-airbnb)の[TypeScript版](https://www.npmjs.com/package/tslint-config-airbnb)だ。
`npm install tslint@^5.6.0 --save-dev`
`npm install tslint-config-airbnb@^5.2.0 --save-dev`
`npm install tsutils@^2.8.0 --save-dev`

tslint-config-airbnbの依存のpeer dependencyのためにtsutilsのインストールもインストールしたほうがいい（インストールしないと不具合が発生する可能性ある）。

React開発の場合、[tslint-react](https://github.com/palantir/tslint-react)に参考。

# リンターとルールの設定
プロジェクトのルートに下記のtslint.jsonを追加：

```json:tslint.json
{
  "extends": ["tslint-config-airbnb"],
  "rules": {
    "max-line-length": [true, 120],
    "object-shorthand-properties-first": false,
    "radix": false,
    "ter-arrow-parens": false
  }
}
```

下記のようなクラスのdefault importをしたい場合`"import-name": false`が必要。

```ts
import TextareaAutosize from 'react-textarea-autosize';
```
キャメルケースの関数名などは希望なら`"variable-name": false`が必要。例えば、ReactでよくStatelessComponentという関数をクラスのように利用する：

```ts
export const Routes: React.StatelessComponent<{}> = () => (...);
```

## リントスクリプト
package.jsonのscriptsに下記のようなスクリプトを追加：

```
"lint": "tslint 'src/**/*.ts'"
```

Reactなどで使うtsxファイルもlintしたいなら：

```
"lint": "tslint 'src/**/*.ts{,x}'"
```

上記のスクリプトは`npm run lint`及び`yarn lint`で実行できる。

注意：tslintのパラメータの周りに ' ' <=が必要！
 
### "scripts"のサンプル：

```:package.json
"scripts": {
  "build": "npm run clean && npm run lint && tsc",
  "clean": "del-cli lib/* !.gitignore",
  "lint": "tslint --format stylish 'src/**/*.ts{,x}'",
  "start": "cross-env NODE_ENV=production node .",
  "start:dev": "cross-env NODE_ENV=development nodemon -e ts -w src -x ts-node src/app.ts",
  "test": "cross-env NODE_ENV=test mocha --recursive test"
}
```

備考：
- del-cli: rmはWindowsとかのプラットフォームを対応しないからdel-cliでクロスプラットフォーム対応のrmができる
- cross-env：環境編集の渡すことも環境によって異なるのでcross-envでクロスプラットフォーム対応の環境変数の渡すことができる

## ルールについて
tslint-config-airbnbのルールは４つのルールセットに基づく：
- [tslint](https://palantir.github.io/tslint/rules/)
- [tslint-eslint-rules](https://github.com/buzinas/tslint-eslint-rules)
- [tslint-microsoft-contrib](https://github.com/Microsoft/tslint-microsoft-contrib)
- [vrsource-tslint-rules](https://github.com/vrsource/vrsource-tslint-rules)
Fluentd ログ全体を処理しつつ特定のメッセージは別処理したい場合のtips

# はじめに
FluentdでログをCloudWatchへ転送しつつ、特定のメッセージ(緊急対応が必要なもの)が起きた場合に通知する時にどう書けばいいのかなと調べたので書きました。

# 環境
- CentOS Linux release 7.3.1611 (Core)
- td-agent-2.3.5-1.el7.x86_64

# 目的
下記のような目的があり、Fluentdのconf設定をしました。
- /var/log/app.log(WEBアプリケーションから出力したログ)をtailしてCloudWatch Logsへ格納したい。
- ただしメッセージ内にERROR、EMERGENCY、ALERT、CRITICALが含まれていた場合は別で処理したい。
- ログの確認はCloudWatchでおこないたい。

# 設定内容

```ini:td-agent.conf
<source>
    # アプリケーションログをtailしてtagをつける
    @type tail
    pos_file /tmp/app.pos
    path /var/log/app.log
    tag app.log
    format /^(?<message>.*)$/
</source>

<match app.log>
    @type copy
    <store>
        # CloudWatch Logsへの転送
        @type cloudwatch_logs
        log_group_name hogehoge_app_log
        log_stream_name app-log
        auto_create_stream true
        include_time_key true
        localtime true
    </store>
    <store>
      # copyしてラベルの付替え
      @type relabel
      @label @alert
    </store>
</match>

# 特定のラベルの処理
<label @alert>
    # filterで検索する
    <filter **.*>
        @type grep
        regexp1 message (ERROR|EMERGENCY|ALERT|CRITICAL)
    </filter>

    # filterで絞り込まれたログに対して処理を行う
    <match **.*>
        @type exec
        command /app/bin/hogehoge.sh
        format json
        buffer_path /tmp/alert_match.pos
        flush_interval 5s
    </match>
</label>
```

# おわりに
簡単にですがCloudWatchに飛ばしつつERROR等特定のメッセージをどうにかするtipsでした。
メッセージが頻発すると辛いので、プラグインなどで抑制した方が良いかと思います。
laravel5.4用に、以前作ったscaffoldパッケージをバージョンアップした。

laravelで、基本的なCRUDアプリケーションを生成するパッケージをバージョンアップしたので、使い方について、簡単に紹介します。
最新のパッケージは、Laravel5.5以降対応です。

<hr>

**Gitの場所**
https://github.com/dog-ears/crud-d-scaffold

<hr>

**（１）環境の準備**
まずは、laravelをインストールしましょう。
簡単に試してみたいのであれば、Cloud9がオススメ

■Cloud9でPHP7+Laravel5環境構築
http://qiita.com/mike_fx/items/c3da0fcd3050d7ea2f26

**（２）パッケージのインストール**

> composer require dog-ears/crud-d-scaffold
※2017/9/21 パッケージアップデートにより更新しました。

**Step2：サービスプロバイダーの追加**

※2017/9/21 パッケージアップデートによりサービスプロバイダの追加は不要になりました。

**Step3：Artisanコマンドで確認**

> php artisan

を実行すると、以下のコマンドが追加されています。

> 'crud-d-scaffold:setup' : Setup crud-d-scaffold with bootstrap 3



以上で、準備完了。
では、サンプルを登録してみましょう。



**(i) パブリックリソースの公開**
> php artisan vendor:publish --tag=public --force

**(ii) パッケージフォルダ内のcrud-d-scaffold.json.sampleをlaravelプロジェクトルートに名前を変更しつつコピーする**

> cp ./vendor/dog-ears/crud-d-scaffold/crud-d-scaffold.json.sample ./crud-d-scaffold.json

**(iii) crud-d-scaffold:setup の実行**

> crud-d-scaffold:setup -f

-f をつけてるとファイルを上書きします。
初回は、fオプションは不要です。（つけてても問題なし）

**(iv) migration と seeding の実行**

> php artisan migrate

> php artisan db:seed

以上で終了です。
アプリケーションを確認してください。


![cap01.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/154ebf3a-9dba-1bc8-0507-4235e6eb1682.jpeg)
![cap02.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/8dbf1104-d81e-d4a5-d9a6-405c052735be.jpeg)
![cap03.jpg](https://qiita-image-store.s3.amazonaws.com/0/103767/11748e5c-2b35-8c17-8df0-f003f4ee2fef.jpeg)


もっと詳しく知りたい人は、ブログに詳細書いたので、見に来てくださいませ。
バグレポートとかも歓迎です。

■OBOEGAKI
http://dog-ears.net/

ではでは。
非ＩＴ系で２４年働き４０代中盤でＩＴエンジニアになろうとしている男の話

中学生のとき（１９８０年代）、コンピューターに魅了され将来はプログラマーになると宣言するも、結局大手家電メーカーに勤務し２０年ほど非ＩＴ系（事務用機器の商品企画職）で働いた。その後転職したが、結局ＩＴ系ではなく太陽光販売大手で働いた。
業界の将来性に疑問を感じたのでその会社を退職したが、ほかに自分に得意そうなことがなかったのでＩＴエンジニアになろうと思ったのが去年の話。
そして１年、業界経験をつんで私はスーパーＩＴエンジニアに・・・。なっていなかった・・・。
その代わり、この業界での処世術のようなものをわずかずつであるが身に着けつつあったのだ！
# 経験年数
IT業界の経験年数はない。前職でもシステムとかは散々作ってきたが、この業界ではなぜか社内システム開発は経験とみなされない。したがってペーペーと同じような扱いを受ける。給料もペーペーと変わらない（現職では幸い新卒よりはやや多い程度のお給料をいただいている）。
確認とかはされない（というか営業の人とかは本当に技術のことがわかっていない）ので、多少盛らないと損。ただ、盛りすぎには注意（無茶振りが多い業界ゆえ）。無茶振りされない程度に盛るべし。
# 得意な言語
非ＩＴ系なので一番やったのはExcelVBA。業界でいろいろ話を聞いたが、私よりExcelVBAができる人にはひとりもお目にかかったことがない。というか、ExcelVBAでスクレイピングとかDB連携とかできることすら知らない人が多い。一時期はVBAが結構好きだったらしく（他人事？）、ASP.NETで社内向けデータベースシステムまで作ってしまった。
ただ、ASP.NET(多くはVB.NET)の案件はクソみたいな案件が多くかつ単価も安いので、最近ではC#.NETをしていたことにしている。
好きな言語はPython、Pug(Jade)。得意な言語は？と聞かれたら「得意ってわけじゃないんですけど、最近ではPythonが好きですね！」とか返しておいたほうが無難かついい案件にあたれると思われる。
# 開発環境
黙っているとCeleronの2GB Windows7-32bitのノートPCとかの案件にアサインされる。いったんアサインされたら、PC環境が改善されることはほぼ考えられない。こういう案件は「エンジニア」という札のついた人物が座っているだけでいいことが多い。客からは１００万円くらいの単金を抜き、こっちに３０万円しか渡さないのだから何もしなくても７０万儲かる。エンジニアの生産性など上げる必要はない人たちがいるのだ（というかPC環境がクソな案件はだいたいそう)。彼らにとってはエンジニアは人間ではなく商品だ。そんな案件にアサインされないためにも、開発環境にはこだわろう。私は4コア以上、メモリ16GB以上、デュアルディスプレイ以上を要求するようにした。そして、その後アサインされた環境は最初のクソみたいな現場とは段違いに開発環境がよく、かつグループメンバーもいい人である率が高い。
ちなみに最初の案件からはこちらから希望してはずしてもらった。地味にGLをいじめたのも効果があったのかもしれない。契約期間切れ扱いで、クレームにはなっていないようだ。
# ウェブ系
ごくたまにだがウェブ系業界からのオファーがある。が、たいてい断られる。理由は明言されないが、年齢で見ている気もする。年齢差別だといいたくなる気持ちもあるが、確かに平均年齢２７歳とかのところに突っ込まれてもこっちもつらい木もするので、ウィンウィンか・・・？
ウェブ系は単金が安いくせにエンジニアへのスキル要求が極めて過剰だ。日本の雇用安定に貢献しようという気が微塵も感じられず、あくまで自社の利益追求のためにがんばっている印象だ。ま、スタートアップとかベンチャーはそんなもんなんだろう。
SIerは老人でも雇ってくれるし、単金も高い。SIerを盛んにディスっているところもあるようだが、それはもうちょっと日本の雇用に貢献してから言うべきことでは・・・？
でもかわいいギャルエンジニアと一緒に仕事がしたい（SIerにはギャルがいない）。
# IPA系の資格
取れば金をくれるというのでそんじゃちょい小遣い稼ぎすっか？と思って受けたが玉砕。以前別の資格を取ったときは１週間勉強しただけで取れたのだが・・・。頭が固くなっているというより、「キョーミないことの勉強に以前ほどがんばれなくなった」というべきか？最近のIPAの資格の学習範囲も、ぜんぜん時代についていけてない感がひどい。それでいて、IPAの資格なんて持っていても転職時に聞かれもしやしない。前職のときに、初級シスアド落ちてそのままというITエンジニアに会ったことがあるが、これはひどいほうと思っていたが業界的にはこれが平均的のようだ・・・。
# ぼっち派遣
もはやわざとやっているとしか思えないぼっち派遣が常態化している。チームで高く売り込むべきなのに、営業がバラバラで派遣先もバラバラ。当然シナジーなんかまったく期待できない。のに「グループでなんかしろ」とかほざいている会社に最近腹が立って仕方がない。
# まとめ
40代後半でも素質があれば何とか付いていけなくもない。
先に問題になるのは「脳力」よりむしろ「理不尽さへの態勢」を保つ、ないし高めるのが難しい。