OmniAICreator/Qiita-1.07M huggingface dataset:
macOSにPostgreSQLをインストール

Homebrewを使用して、macOSにPostgreSQLをインストールしたので、その時の記録として残す。

## 環境
macOS (10.12.1)
PostgreSQL (9.6.1)
Homebrew (1.1.2)

## Homebrewのアップデート
```bash
$ brew update
$ brew doctor
```

## PostgreSQLのインストール
```bash
$ brew install postgresql
```

## 初期化
```bash
$ initdb /usr/local/var/postgres -E utf8
```
実行すると以下のようなメッセージが表示された。
指示に従って `/usr/local/var/postgres` を削除してから再実行。

```bash
initdb: directory "/usr/local/var/postgres" exists but is not empty
If you want to create a new database system, either remove or empty
the directory "/usr/local/var/postgres" or run initdb
with an argument other than "/usr/local/var/postgres".
```

（`/usr/local/var/postgres` でエラーが発生するのは、HomebrewでPostgreSQLをインストールする際に内部でinitdbが実行されるかららしい）

今度は以下のようなワーニングが発生したが、今回はtrust認証で問題ないのでスルー。

```bash
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
```

※ trust認証については公式サイト参照。
[https://www.postgresql.jp/document/9.6/html/auth-methods.html#auth-trust](https://www.postgresql.jp/document/9.6/html/auth-methods.html#auth-trust)

## 起動
```bash
$ pg_ctl -D /usr/local/var/postgres -l logfile start
```
### データベース一覧を取得してみる
```bash
$ psql -l
                              List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges
-----------+-------+----------+-------------+-------------+-------------------
 postgres  | admin | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 template0 | admin | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/admin         +
           |       |          |             |             | admin=CTc/admin
 template1 | admin | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/admin         +
           |       |          |             |             | admin=CTc/admin
(3 rows)
```

## 停止
```bash
$ pg_ctl -D /usr/local/var/postgres stop -s -m fast
```
### 本当に停止したか確認してみる
先ほどのデータベース一覧取得を再度行ってみると停止していることが分かる。

```bash
$ psql -l
psql: could not connect to server: No such file or directory
	Is the server running locally and accepting
	connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
```

## 権限設定
postgresユーザにSuperuser権限を設定する。  


```bash
$ psql -U admin postgres
```

```psql
# ALTER ROLE postgres WITH Superuser;
# \du
                                   List of roles
 Role name |                         Attributes                         | Member of
-----------+------------------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 postgres  | Superuser                                                  | {}
```


## 参考
[http://tstomoki.com/programming/posgre_inst](http://tstomoki.com/programming/posgre_inst)
[http://qiita.com/_daisuke/items/13996621cf51f835494b](http://qiita.com/_daisuke/items/13996621cf51f835494b)
タイマー + スクリプト + mobile backend = プッシュ通知の定期配信

（本当は「[自作ライブラリ](https://github.com/ykokw/niftycloud-auth)の話」というタイトルでしたが、出来が中途半端なので内容を変更しています）

自分は普段、以下プロダクトの開発・運用に携わっています。

- [ニフティクラウド スクリプト](http://cloud.nifty.com/service/script.htm)
- [ニフティクラウド IoTデバイスハブ](http://cloud.nifty.com/service/iot_device_hub.htm)
- [ニフティクラウド mobile backend](http://mb.cloud.nifty.com/)

今回は、そのうちのスクリプトとmobile backendにと、[ニフティクラウド タイマー](http://cloud.nifty.com/service/timer.htm)）を組み合わせて、
mobile backendのプッシュ通知機能を少し補って便利にしてみようと思います。

mobile backendのプッシュ通知機能は、対象端末の絞込配信や配信時刻の予約設定は可能ですが、
毎日x時にプッシュ通知を配信するような定期配信を行うためにはバッチサーバーが必要です。

それをニフティクラウド タイマーで補い、タイマー経由でスクリプトを実行して、
mobile backendのプッシュ通知APIをリクエストしていきます。

## 準備するもの

- ニフティクラウドのアカウント
 - ニフティクラウド スクリプトとタイマーを利用するためには、`@nifty法人ID` が必要です
 - ニフティクラウド mobile backendの利用は、 `@nifty個人ID` でも可能です

## プッシュ通知の準備

ニフティクラウド mobile backendでプッシュ通知を配信するには、
AppleやGoogleから端末固有のデバイストークンを取得し、
それをニフティクラウド mobile backendに登録する必要があります。

以下のドキュメントを参考に、デバイストークンを登録するようなアプリを準備してください。

- [プッシュ通知 \(Android\) : 基本的な使い方 \| ニフティクラウド mobile backend](http://mb.cloud.nifty.com/doc/current/push/basic_usage_android.html)
- [プッシュ通知 \(iOS\) : 基本的な使い方 \| ニフティクラウド mobile backend](http://mb.cloud.nifty.com/doc/current/push/basic_usage_ios.html)

## スクリプトの登録

以下のJavaScriptはニフティクラウド スクリプトから、
ニフティクラウド mobile backendのプッシュ通知登録APIをリクエストするスクリプト例です。
（今回はメッセージ指定と即時配信だけ設定しているものですが、もちろん配信条件など色々変えられます。）

```javascript
module.exports = function(req, res) {
  var NCMB = require("ncmb");
 
  //SDKの設定
  //ニフティクラウド mobile backendのAPIキーに各自書き換えてください 
  var ncmb = new NCMB(
    "YOUR_APPLICATION_KEY",
    "YOUR_SECRET_KEY"
  );

  //ニフティクラウド mobile backendのプッシュ通知登録APIを用意
  var push = new ncmb.Push();
  push.set("immediateDeliveryFlag", true) //即時配信設定
    .set("message", "Hello, World!")      //メッセージ
    .set("target", ["android"]);          //配信対象のOSを選択
 
  //プッシュ通知登録APIをリクエスト
  push.send()
    .then(function(push){
      // 送信後処理
      res.send("push notification is registerd.");
    })
    .catch(function(err){
      // エラー処理
      res.send(err.message);
    });
}
```

[ドキュメント](http://cloud.nifty.com/help/script/new.htm)を参考に、ニフティクラウドのダッシュボードからスクリプトを登録してください。
（このあとニフティクラウド タイマーと連携させるので、ニフティクラウド mobile backendのスクリプト機能を使ってはいけません）


## タイマーの設定

ニフティクラウド タイマーでは、登録されてあるスクリプトからタイマー作成ができます。

[ドキュメント](http://cloud.nifty.com/help/timer/new.htm)を参考にタイマーを作成してください。

## まとめ

ニフティクラウド スクリプトはスクリプトが書ければ（[ライブラリ](http://cloud.nifty.com/spec/script/)が対応していれば）いろんなことに利用できるので、
反対に使い方をイメージしにくい部分があるかもしれません。

今後も色々なところで、ニフティクラウド スクリプトの使用例を紹介していければと思います。
（ニフティクラウド ブログでは @tily さんが [slackと連携した例](http://blog.cloud.nifty.com/automate_the_regular_processing_with_timer_and_script)を紹介しています）

よろしくお願いします。
夫婦の愛を支える技術

## 概要
技術者の親友のために 結婚式の乾杯の発声でLTをさせていただきました。
新郎とは 同じアジャイルチームで育ち、切磋琢磨してきました。
その経験をネタに「夫婦」というプロジェクトにどう立ち向かうべきか？ を独身の私から提案させていただきました。

<a href="//www.slideshare.net/yoshitakahonda/ss-69801308" title="夫婦の愛を支える技術" target="_blank"><img width="500" src="https://qiita-image-store.s3.amazonaws.com/0/93055/8b06725f-ebd7-f719-2b02-9057e3e72abe.png"/>
</a><strong><a href="//www.slideshare.net/yoshitakahonda/ss-69801308" title="夫婦の愛を支える技術" target="_blank">夫婦の愛を支える技術</a></strong>

## LTの背景にあるもの
### プロジェクトの成功とは何か？
プロジェクトの成功とは何でしょうか？ 人それぞれ考えがあると思います。
当然 「完成したモノが顧客の納得の行くものである」 ということは最低条件となるでしょうが、加えて以下の点も重要だと私は考えます。

 - 完成したモノがチームメンバーにとっても納得の行くものである
 - メンバーが次も同じチームで仕事したいと思える
 - 顧客から再度、別の仕事を依頼していただける

プロジェクト終了時によく見かけるのは
完成したモノは問題ないレベルだが、チームメンバーが疲弊しきっている/顧客と不仲になると言った状況です。
終了時の"数字"には見えてこないですが、組織にとって重要な要素だと思うのです。
### 人を第一に考える
では、どのようにプロジェクトを行えば上記のような状況を解消できるでしょうか？
その方法の1つに 「アジャイル開発」 があると私は思います。

アジャイル開発の考えは [アジャイルソフトウェア開発宣言](http://agilemanifesto.org/iso/ja/manifesto.html)や[アジャイル宣言の背後にある原則](http://agilemanifesto.org/iso/ja/principles.html) から来ています。この文書の通りアジャイル開発には、人（顧客/チームメンバー）を第一に想うという側面があります。つまりは、無理な見積もりをせずにできる範囲で実施し、その姿を見て顧客が意見し、全員で話し合う。
誰も妥協せず必要な議論を続けるこの考えがプロダクトやチームに愛を吹き込むと確信しています。
## チーム×アジャイル開発
ここからはLTの内容について触れていきます。
### アジャイル開発 (scrum)
大まかな流れとしては 以下のようになります。

 1. やりたいことを書き出す
 2. できる分だけ選択する
 3. どう実現するかを話し合う
 4. 実際にやってみる
 5. ふりかえる

ただ、やはり進め方に不安があるという場合は [rascal-scheme](https://github.com/kawasima/rascal-scheme/blob/master/README.md) をベースにし、1週間スプリントをこなす上でチームの特色を出していくと良いでしょう。
### やりたいことを書き出す
[スプリント全体計画](https://github.com/kawasima/rascal-scheme/blob/master/sprints_planning.md#スプリント全体計画)。
ここでは顧客からの要望を受け、チームでストーリー単位に分割していきます。
１つのストーリーの内容は多くても１週間でできるくらいの大きさに分けるのが望ましいです。
（スプリントに収まらなくなってしまうため）
### できる分だけ選択する
[スプリント計画ミーティング](https://github.com/kawasima/rascal-scheme/blob/master/rhythm.md#スプリント計画ミーティング)の第１部。
チームで無理なくできる範囲を話し合い、ストーリーを選びましょう。
週を追うごとに、チームが１週間でどれくらいストーリーを消化できるのか?(Velocity)が分かってくるので、最初の内は 少なめに選択するとよいでしょう。
### どう実現するかを話し合う
[スプリント計画ミーティング](https://github.com/kawasima/rascal-scheme/blob/master/rhythm.md#スプリント計画ミーティング)の第２部。
選択したストーリーを、これが全てできたらストーリー達成！といえる細かい単位の作業に分割していきます。
１つの作業は 1~3時間でできるほど細かくすると進めやすいでしょう。
### 実際にやってみる
[日々の作業](https://github.com/kawasima/rascal-scheme/blob/master/rhythm.md#日々の作業)。
LTでは語れませんでしたが、細分化したタスクについていまどれくらい進んでいるか？を見える化することが望ましいです。チームで実施する際には 【Will Do / Doing / Done】 ３種類のグループに分けて管理することで、「進んでいる」感が出てやる気も増してきます。
<img width="550" src="https://qiita-image-store.s3.amazonaws.com/0/93055/fa6330ad-7868-172d-7ffe-55351d4cc0c3.png"/>
### ふりかえる
[スプリントレビュー](https://github.com/kawasima/rascal-scheme/blob/master/rhythm.md#スプリントレビュー)。
ふりかえりは 次の週をさらに良くするための重要な作業です。
短い期間でふりかえることで大きなミスを未然に防ぎ、後の争いや障害を取り除いてくれます。
ふりかえりの方法は[KPT](http://hisa-magazine.net/blog/ref/kpt2/)が良いでしょう。
## 結び
アジャイル開発やそのやり方に関しては、数多ある書物やネット上の記事にあるのでこの記事では大幅に省略しました。エンジニア家庭の皆さま、あなたのチームにもアジャイル開発を取り入れてみませんか？

※ 記事の読み方： 文章に出てくる 「顧客」を妻（あるいは夫）・「チーム」を夫婦 と読み替えてみましょう。
CentOS7で無料SSL証明書 Let's Encrypt

無料のSSL証明書Lets Encryptを入れてみました。

基本的には公式？の
https://letsencrypt.jp/
の説明が良く出来ているのでスムーズに設定することができました。


ただ
https://letsencrypt.jp/usage/install-certbot.html#CentOS7
で出てくる

yum install certbot python-certbot-apache
を実行すると
パッケージ python-pkg-resources-19.6.2-1.el7.noarch.rpm は署名されていません
と出てインストールできなかったので、とりあえず
yum install --nogpgcheck certbot python-certbot-apache
を実行。

インストールが完了したら
certbotコマンドを実行して鍵を取得
/etc/letsencrypt/live/ドメイン名
のディレクトリに鍵ができるので

apacheの設定ファイルに
SSLCertificateFile /etc/letsencrypt/live/www.hoge.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.hoge.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.hoge.com/chain.pem

な感じで追加してやる。

あとは鍵の寿命が90日とやや短いので自動更新用に
/bin/certbot renew --pre-hook "systemctl stop httpd" --post-hook "systemctl start httpd"
をcronに突っ込んでおく


今まではchromeでアクセスすると
![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/151329/4908cb85-e735-9025-dc2b-ac9e0a4c9ede.png)
だったのが
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/151329/a085980d-e710-0ee2-c43a-f996f5cc0add.png)
と安全な感じになりました
テーブルのないモデルを使う

バリデーションだけ使いたい時とか、まあ想定されるのはデータベースに登録がない問い合わせフォームとか、かな


モデル定義

```
class Inquery extends Model
{

    var $useTable = false;

    public $_schema = array(
        'name' => array(
            'type' => 'string',
        ),
        'email' => array(
            'type' => 'string',
        ),
    );

    public $validate = array(


        'name' => array(
            'rule' => 'notBlank',
            'message' => '「名前」を入力してください',
        ),

        'email' => array(
            'notBlank' => array(
                'rule' => array('notBlank'),
                'message' => '※メールアドレスを入力してください。',
                'required' => true,
            ),
            'email' => array(
                'rule' => array('email'),
                'message' => '※メールアドレス以外が入力されています。',
                'required' => true,
            ),
            'maxLength' => array(
                'rule' => array('maxLength', 255),
                'message' => '※メールアドレスは255文字以内で入力してください。',
                'required' => true,
            ),
        ),

    );
}
```

みたいな感じコツは

```
    public $_schema = array(
        'name' => array(
            'type' => 'string',
        ),
        'email' => array(
            'type' => 'string',
        ),
    );
```
って部分。

これでデータベース設定してなくても、コントローラでバリデーションだけ使えま。
string以外だとデータベース接続にいってしまうみたいなので、テーブルなかったらエラーになりますよっと。
How to install Ruby 2.3.3 on Ubuntu Linux 14.04 LTS

Ubuntu に ruby 2.3.3 をインストールしたのでメモ。

＃ ってゆーか Ubuntu で rbenv が動かないんだよちくしょー。なんでやろorz

仮想 PC 上でやってるので、Guest Additions をインストールした段階で gcc とかはインストールされるんで、そういう前提で書いてます。

# SSL ライブラリのインストール
Ubuntu Software Center で `libssl-dev` をインストール

![libssl-dev.jpg](https://qiita-image-store.s3.amazonaws.com/0/28376/8ff1a656-4c04-feb2-c1bb-00eed9ae8ef4.jpeg "libssl-dev.jpg")

# zlib, GNU readline ライブラリのインストール

```bash
% sudo apt-get install zlib1g-dev libreadline-dev
```

# ruby ソースの取得
[Ruby 2.3.3 リリース](https://www.ruby-lang.org/ja/news/2016/11/21/ruby-2-3-3-released/) から適当なミラーを選んでダウンロード

```bash
% wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.3.tar.bz2
```

# コンパイル & インストール

```bash
% tar xf ruby-2.3.3.tar.bz2
% cd ruby-2.3.3
% ./configure
% make
% sudo make install
```

# gem のアップデート

```bash
% gem update --system
% gem update
% gem cleanup
```

# おまけ

```bash
% sudo apt-get install libsqlite3-dev
```

# 他のオススメ記事 (笑
- [How to install ruby without documentations - Qiita](http://qiita.com/maangie/items/532809d78b4fade0d487)
Bitbucketへのssh公開鍵認証を通す

# Bitbucketへのssh公開鍵認証を通す

## はじめに
とりあえずブログを始めようと思い、Wordpressリポジトリ保存のためにBitbucketに登録しました。

個人的な備忘録も含めて、メモメモ。


## ssh公開鍵、秘密鍵

### Bitbucket用の認証鍵作成

他の鍵と区別するためにBitbucket用の認証鍵を作成します。

```bash
$ mkdir ~/.ssh/bitbucket # Bitbucket専用の認証鍵置き場作成
$ ssh-keygen -t rsa -f ~/.ssh/bitbucket/id_rsa # -fオプションで認証鍵置き場を指定
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): # パスフレーズはお好みで
Enter same passphrase again: # パスフレーズはお好みで
```

### .ssh/configの設定
Bitbucket用の認証鍵を作成したので、configに記載してssh接続時にオプションを省略できるようにしておきます。

```
Host bitbucket.org
  HostName bitbucket.org
  IdentityFile ~/.ssh/bitbucket/id_rsa
```

### 認証鍵のセキュリティ強化
```bash
chmod 600 ~/.ssh/bitbucket/id_rsa
```

権限周りを厳密にしておかないと、ssh接続時にエラーになります。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '[your_key]' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
...
```

### 公開鍵をクリップボードにコピー

後ほどBitbucketに公開鍵を登録するため、公開鍵をコピーしておきます。

```
$ cat ~/.ssh/bitbucket/id_rsa.pub | pbcopy
```


## Bitbucket側
1.上ナビ「アカウントの管理」 → 左ナビ「セキュリティ - SSHキー」 → 「鍵の追加」を選択
2.key部分に先程コピーした公開鍵を貼り付けます

## 疎通確認

最後にsshコマンドで疎通確認を行います。
もし、問題があれば-vオプションでデバッグもできます。

### コマンド

- 疎通確認コマンド

```
$ ssh -T git@bitbucket.org
```

- デバッグもできる疎通確認コマンド

```bash
$ ssh -vT git@bitbucket.org
```

以上でBitbucketへのssh公開鍵認証を通すことが出来るかと思います。
VulsのログをCSVにしてExcelで可視化する

この記事は、[Vuls Advent Calendar 2016](http://qiita.com/advent-calendar/2016/vuls)の3日目の記事です。

# はじめに
システムセキュリティ監査や社内CSIRT体制を構築している、またマネージドサービスとして顧客のシステムを預かっている場合、システムに存在する脆弱性のチェック状況について定期的に報告する場合があります。
そのような場合**データの閲覧者は社外もしくは自部門外の組織となる場合があり**、運用しているシステム内に構築したVulsの結果データ閲覧の仕組みへのアクセスが難しいことがあります。

そのため今回はVulsが出力したJSONデータをCSVに変換し、データの受け渡しがしやすく導入が容易なEXCELでレポートを作成してみます。

# Vuls JSON→CSV化

「vuls scan」のあと、「vuls report -format-json」を実行するとjson形式でログを出力します。このデータを元にCSVファイルを作成するツールを作成しました。

GitHub：https://github.com/usiusi360/vuls-log-converter

## インストール

事前にnode.jsとnpmをインストールしておいてください。

```
$ npm i -g vuls-log-converter
```

尚、node.jsはEPELにあるものはバージョンが古いので動きません。公式にあるLTS版を使ってください。

## 変換実行
「-i」でVulsが出力したJSONファイルが入っている**フォルダ**を指定し、「-o」で出力先の**ファイル**を指定します。入力元にフォルダを指定すると中に入っているJSONファイルを全て変換し、一つのCSVファイルに出力します。

```
$ vulslogconv -t csv -i /opt/vuls/results/current/ -o ./output.csv
```

```
$ cat ./output.csv
"ScannedAt","ServerName","Family","Release","Container_Name","Platform_Name","CveID","Packages_Name","NVD_Score","NVD_Severity","NVD_AcessVector","NVD_AccessComplexity","NVD_Authentication","NVD_ConfidentialityImpact","NVD_IntegrityImpact","NVD_AvailabilityImpact","NVD_CweID","JVN_Score","JVN_Severity","JVN_AcessVector","JVN_AccessComplexity","JVN_Authentication","JVN_ConfidentialityImpact","JVN_IntegrityImpact","JVN_AvailabilityImpact","JVN_Title","JVN_ID"
"2016/10/29 15:32:56","localhost","centos","7.0.1406","centos7.0.1406","other","CVE-2014-7169","bash",10,"High",10,"LOW","NONE","COMPLETE","COMPLETE","COMPLETE","CWE-78",10,"High","NETWORK","LOW","NONE","COMPLETE","COMPLETE","COMPLETE","GNU bash におけるファイルに書き込まれる脆弱性","JVNDB-2014-004399"
"2016/10/29 15:32:56","localhost","centos","7.0.1406","centos7.0.1406","other","CVE-2015-0235","glib2",10,"High",10,"LOW","NONE","COMPLETE","COMPLETE","COMPLETE","CWE-119",10,"High","NETWORK","LOW","NONE","COMPLETE","COMPLETE","COMPLETE","glibc ライブラリにバッファオーバーフローの脆弱性","JVNDB-2015-001251"
```

# ExcelでCSV取り込み→レポート作成

変換が完了したCSVファイルをEXCELに取り込んでレポートを作成します。ピボットテーブルやグラフを使って分かりやすいように整形できます。データ取り込み用のシートのデータを入れ替えてピボットテーブルやグラフの更新を行うだけで、毎月作り変えられるようにしておくと良いでしょう。

<img width="100%" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/54952/15536548-3551-0687-c534-44a96e466ad9.png">

# さいごに
今回は比較的システム規模が小さい環境を想定して、EXCELでレポートを作成しました。次回はある程度データの多い環境を想定して、ElasticSearchを使ってダッシュボードを作成してみたいと思います。
Unity5.5でパーティクルのパラメーターをスクリプトから設定する方法

Unity 5.5からパーティクルシステムの設計が大きく変わり、スクリプトから各パラメーターの設定を変更する方法も、以前とは少し変わりました。

```csharp:以前までの方法
// パーティクルの速度を設定する
particleSystem.startSpeed = 1;

```
以前までは↑のような書き方で設定できましたが、これからは↓のように書きます。

```csharp:新しい方法
// メインモジュールへのアクセサを取り出す
var ma = particleSystem.main;
// アクセサに対してパラメーターの設定を行う
ma.startSpeed = 1;
// 範囲ランダムやカーブを設定するにはMinMaxCurveを使う
ma.startSpeed = new ParticleSystem.MinMaxCurve(1, 2);

```
MainModule型はstructで、paritcleSystem.mainは値返し（コピーを返している）なので、これでは値を書き戻していないので一見ダメなように見えますが、これで設定が反映されます。むしろparitcleSystem.mainは読み取り専用プロパティなので、`paritcleSystem.main = ma;`とすることはできません。

また、structの値返しをしているので、`paritcleSystem.main.startSpeed = 1;`のような書き方も当然できません。これは同じくstructを返すtransform.positionなどと同じ制限ですが、transform.positionの場合は値を書き戻さないと反映されないので、そのあたりで混乱しないように気をつけましょう。

参考：
[Unity - Scripting API: ParticleSystem.main](https://docs.unity3d.com/550/Documentation/ScriptReference/ParticleSystem-main.html)
kubernetes入門コンテンツまとめ

kubernetesを勉強することになったものの、良いリソースがまるで見つからなくて辛かったので、見つけた中で良さそうなものをまとめておきます。
かなり難しかったですが、以下に上げたものを使って勉強したらそこそこ使えるようにはなってきました。

英語日本語問わず参考記事が少ないのは、その開発スピード由来かなと。
アップデートが本当に早いので、最終的に信じられるのはdocumentationくらいです。

# 最初の1歩

### kubernetes含むmicroservicesのudacityコース(おすすめ！)

<a href="https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615">udacityのコース</a>

Mr.kubernetesと呼ばれるエバンジェリストの方が説明してくれます。
サンプルコードで一緒に作成しながら作れるのはすごい。
英語字幕もあるので、ちょくちょく止めて読みながら理解すれば概要は把握できます。<strong>ただしGKEで動くkubernetesの話です。kubernetes単体ではないので注意。以下GKEの場合は同様。</strong>

### katakodaのk8sコース(2017/05/22追記)
[kadacoda](https://katacoda.com/courses/kubernetes)
会社の同期が教えてくれたサイトです、インタラクティブにコードを書けるのでk8sの公式サイトみたいな感じで勉強できます。k8sの構成要素などについても詳しく学べるようです（ちょっとしか見てない）。

### 絵本でわかるkubernetes
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/4ht22ReBjno/0.jpg)](https://www.youtube.com/watch?v=4ht22ReBjno)
これは参考にはならない。キリンが「ぼくのクローンが必要なときはどうしたらいいんだい？」とか言い出すのシュールすぎでは。


# 読みつつ手を動かす
読んでるだけだとよくわからないし、手を動かしてるだけでもよくわからないので、行ったり来たりがおすすめです。

### GKEじゃなくてkubernetesやってみた記事

GKEとはkuberenetesをナイスな感じで動かすためのプロダクトなので、裏側の仕組みがわかりにくくなってます。
kubernetes単体で用いるならば、自分でコンピュータのクラスタを作って通信設定して〜ってやることになって
大変面倒なのですが、その方が挙動が分かって良さそう。
http://acro-engineer.hatenablog.com/entry/2016/10/04/120000

さすがに自前でクラスタ組めないので、自分はこちらの本で勉強しました。スッキリ書いてあるので、かなりおすすめです。

<a href="https://www.amazon.co.jp/gp/product/B0191B5FE4/ref=as_li_qf_sp_asin_il?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B0191B5FE4&amp;linkCode=as2&amp;tag=techeten02-22"><img src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=B0191B5FE4&amp;Format=_SL250_&amp;ID=AsinImage&amp;MarketPlace=JP&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=techeten02-22" border="0" /></a><img style="border: none !important; margin: 0px !important;" src="http://ir-jp.amazon-adsystem.com/e/ir?t=techeten02-22&amp;l=as2&amp;o=9&amp;a=B0191B5FE4" alt="" width="1" height="1" border="0" />

### 最新のkubernetesの事例紹介スライド

事例もさることながら、挙動が説明してある図がナイスです。

https://speakerdeck.com/sgeengineer/kubernetesdebian-warukai-fa-sutairu-maikurosabisuziyanakutemoiiziyanai

### GKEで実際にアプリを作ってみるブログ
こちらでは、実際に動作するcontainerを用いて、囲碁ゲームをGKEで動かすところまで手を動かしながらやれます。
http://enakai00.hatenablog.com/entry/2016/08/10/152334
##### 他参考記事
https://www.wantedly.com/companies/wantedly/post_articles/30236#_=_
http://blog.grasys.io/post/dokuma/1st-step-kubernetes/

本記事は[元記事](http://techeten.xyz/936)より転載。
Androidでユニットテストを始めるメモ3

前回の続き
http://qiita.com/kojimamasahiro/items/9a925975b2c5f632ed09

Robolectricしたい。
http://robolectric.org/

公式サンプル
https://github.com/robolectric/robolectric-samples


# インストール

```
depences {
    // robolectric
    testCompile "org.robolectric:robolectric:3.1.4"
}
```
テストファイルはtestディレクトリ以下に置きます。

# 使い方

Activityのテスト

```
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class)
public class MainActivityTest {

    private TextView mText;
    private ImageView mImage;
    private Button mButton;

    @Before
    public void setUp() {
        // viewの取得
        Activity activity = Robolectric.setupActivity(MainActivity.class);
        mText = (TextView) activity.findViewById(R.id.text);
        mButton = (Button) activity.findViewById(R.id.button);
        mImage = (ImageView) activity.findViewById(R.id.image);
    }

    @Test
    public void trueNextActivity() {
        // ボタンのclick(別のアクティビティに遷移させるようにしていた場合）
        mButton.performClick();

        // 遷移先のActivityがあるか
        ShadowApplication application = shadowOf(RuntimeEnvironment.application);
        assertThat("Next activity has started", application.getNextStartedActivity(), is(notNullValue()));
    }

    @Test
    public void falseNextActivity() {
        // ボタンをclickしていないのでなし
        ShadowApplication application = shadowOf(RuntimeEnvironment.application);
        assertThat("Next activity should not started", application.getNextStartedActivity(), is(nullValue()));
    }
}
```

Shadowクラス

```
shadowクラス

// 実オブジェクトを指定
@Implements(MyTextView.class)
public class ShadowMyTextView {

    // メソッドを変更
    @Implementation
    public String myMethod() {
        return "my name is ShadowMyTextView";
    }
}
```

```
実オブジェクト
public class MyTextView {

    public String myMethod() {
        return "my name is MyTextView";
    }
}
```

```
Configのshadowsに指定する

@RunWith(RobolectricTestRunner.class)
@Config(sdk = 21, constants = BuildConfig.class, shadows = {ShadowMyTextView.class})
public class MyTextViewTest {

    
    @Test
    public void shadowMyTextView() {
        // メソッドが書き換えられている
        assertThat(new MyTextView().myMethod(), is("my name is ShadowMyTextView"));
    }
}
```

他、config propertiesやresourcesなどの設定方法もあるけど、割愛


# おわりに
テストに関する投稿はこれでいったんおしまい。
アプリを新規でつくる場合は、積極的に取り入れていきたい。
ただ、既存のアプリに取り入れるのは少しつらい。
もし、いい感じに取り入れる方法があればまた紹介したい。
Docker for WindowsのVMイメージをCドライブ以外に作成

Docker Toolboxのときと同じ要領です。
http://qiita.com/yKanazawa/items/6d8e8e8a33e57f71c4f4

Docker for WindowsのHyper-V仮想マシン(MobyLinuxVM)はデフォルトで

```
C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks
```

に仮想ディスクを作成します。

Cドライブの空き容量が足りない場合、Hyper-Vマネージャでは仮想ディスクの保存先を変更できないので、シンボリックリンクを作成して対応します。（ショートカットでは不可）

手順は以下の通り

+ docker for windowsを終了
+ 仮想ディスクが格納されているVirtual Hard Disksディレクトリを任意のドライブに移動
+ 管理者権限でコマンドプロンプトを起動し、以下のコマンドを実行

```
C:\>mklink /D "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks" "D:\Virtual Hard Disks"
C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks <<===>> D:\Virtual Hard Disks 
のシンボリック リンクが作成されました

C:\>
```
Dplyを使って無料で２時間のMinecraftサーバを構築してみる

# はじめに
サーバというのは基本的にお金を払って使うものというイメージが強いものですが、Dplyというサービスはなんと、無料で２時間VPSを提供してくれるサービスです。

サービスのことについてはここでも少し触れますが、下記の記事が詳しいようです。
[「dply」、最初二時間無料でVPSが使えます的サービス](http://uzulla.hateblo.jp/entry/2016/11/28/181949)

# 登録
<img width="1256" alt="スクリーンショット 2016-12-04 15.01.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/62429/5e4b63b6-e6fa-db56-61c8-f0d693df1d4e.png">

まずは、 [Dplyの公式サイト(https://dply.co/)](https://dply.co/) にアクセスして、 「SIGN IN WITH GITHUB」をクリックしてログインします。

<img width="823" alt="スクリーンショット 2016-12-04 15.03.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/62429/fe675868-12a4-3f83-1d6e-e4772c80cb85.png">

「Authorize application」を押して権限を承認します。

<img width="1027" alt="スクリーンショット 2016-12-04 15.04.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/62429/9dafa70e-35b6-cf75-030a-da7c87f0d66a.png">

ログインに成功すると、ダッシュボードが表示されます。

# サーバのセットアップ
「Create One」をクリックして新規サーバを作成します。

<img width="976" alt="スクリーンショット 2016-12-04 15.40.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/62429/fb3fc055-7d87-e230-5988-46905e7dbaf7.png">


Server Name: 好きなものを半角英数字で
OS: CentOS 7
Location: Singapore
Service Plan: 2 Hours (FREE)
SSH Key: Githubで設定しているものが表示されます

Scriptには、下記のスクリプトを入力します。

```shell-session
#!/bin/sh
yum install java-1.8.0-openjdk -y
sh -c "echo 1 > /proc/sys/vm/drop_caches"
mkdir minecraft-server && cd minecraft-server
wget https://s3.amazonaws.com/Minecraft.Download/versions/1.11/minecraft_server.1.11.jar minecraft_server.jar -O minecraft_server.jar
echo eula=true > eula.txt
java -Xmx256M -Xms256M -jar minecraft_server.jar nogui
```

Create Serverをクリックするとサーバが起動します。

<img width="422" alt="スクリーンショット 2016-12-04 15.45.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/62429/7bcb03ae-ed6e-a6bc-b264-f083c2af8784.png">

起動するとこんな感じの表示になりますが、ここからMinecraftサーバのセットアップが始まるので２,３分かかります。
<img width="344" alt="スクリーンショット 2016-12-04 15.46.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/62429/5f90ce2c-8344-1ad2-a496-7e7a4b66b197.png">

# サーバーのスペック
サーバは１種類しか現時点では存在しないようです。
公式サイトのヘルプを見ると性能には期待できなそうです。

>1 CPU
>512MB RAM
>20GB Disk

https://dply.co/help/faq

# SSH接続をしたい


```
ssh root@サーバのIPアドレス
```

で接続できます。


# 料金体制
> 2 Days: $2
1 Week: $3
1 Month: $10
6 Months: $50

少しだけ使いたいという場合にはいいのかもしれません。
それか、無料で使っていてもう少しだけという時にもいいのかも。

# dplyのAPI
FAQページによると
将来的にはリリースするようですが、無料のサーバにはAPIを提供する予定はないようです。

# Dplyボタン

Dplyボタンというのを作れるみたいです。 Deply to Heroku みたいな。

というわけで、Minecraftの公式サーバを立てられるDeplyボタン作りました。

MinecraftのEULAに同意してから使いましょう。
https://account.mojang.com/documents/minecraft_eula

[![Dply](https://dply.co/b.svg)](https://dply.co/b/J4h8MDVK)
[Unity]簡単!スクリプトでアニメーション1


# 今回習得する事
DOTweenというアセットの使い方を学んで，アニメーションをスクリプト1行で作成する．

# 結果
![ex1.gif](https://qiita-image-store.s3.amazonaws.com/0/113504/b66476bd-57de-8393-2140-0233c6c05a75.gif "ex1.gif")


#1 DOTweenをダウンロード

 AssetStoreでDOTweenと検索してインストール

![スクリーンショット 2016-12-04 16.03.09.png](https://qiita-image-store.s3.amazonaws.com/0/113504/94215a9e-e1d4-6274-0963-d3d1cef81d39.png "スクリーンショット 2016-12-04 16.03.09.png")

![dot.jpg](https://qiita-image-store.s3.amazonaws.com/0/113504/38aca3d8-f5ab-40f3-4ef5-786c0e29eacf.jpeg "dot.jpg")


#2 Cubeを置く
![スクリーンショット 2016-12-04 16.07.13.png](https://qiita-image-store.s3.amazonaws.com/0/113504/0fb79d5e-01f2-9f91-d502-63f3523ba686.png "スクリーンショット 2016-12-04 16.07.13.png")

#3 以下のスクリプトを書いてCubeに貼る
```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening; // 書くところ1

public class CubeAnimation : MonoBehaviour {

	void Start(){
		// 書くところ2
		this.transform.DOScale (new Vector3 (1f, 4f, 1f), 1f);
	}
}

```

#4 再生する
アニメーションするはず！

#5 どうやって使うのか

```
動かす対象のトランスフォーム.DOScale(アニメーション後の大きさ, アニメーション時間(秒) );
this.transform.DOScale (new Vector3 (1f, 4f, 1f), 1f);
```
[Wordpress]固定ページに子ページのカスタムフィールドを一覧表示する

特定の固定ページに、そのページに所属する子ページのカスタムフィールド値を一覧表示するコードになります。

子ページのカスタムフィールド値を一覧表示する親ページ用のテンプレートファイルを用意します。

親ページのスラッグが 'parent' だとしたら、**page-parent.php**というファイルを作成し、以下のコードを記述します。


```php
<?php
	// 子ページ出力のための関数
	$children = get_children(array(
		"post_parent"	=> get_the_id(), // このページを親ページとする
		"post_type"		=> "page",
		"post_status"	=> "publish",
		"order"			=> "ASC"
	));

	// 除外する子ページのスラッグ（配列で複数指定可に）
	$hidden_page_slug = array(
		"hidden1",
		"hidden2"
	);

	foreach($children as $child){

		// 子ページの要素を取得
		$child_title 	= $child->post_title; // タイトル
		$child_id 		= $child->ID; // ID
		$child_post 	= get_page( $child_id );
		$child_slug 	= $child_post -> post_name; // スラッグ

		// 表示したいカスタムフィールドの値を取得
		// 配列である必要はありませんが、表示したいフィールドが複数ある場合は便利かと思います
		$arrCf = array(
			"hoge" => get_post_meta($child->ID, "hoge", true),
			"foo" => get_post_meta($child->ID, "foo", true),
			"bar" => get_post_meta($child->ID, "bar", true)
		);

		// 除外する子ページを対象外にする
		if (!in_array($child_slug, $hidden_page_slug)) {

			// ここから一覧表示のためのソース
			echo "<h1>".$child_title."</h1>\n";
			echo "<dl>\n";

			foreach ($arrCf as $key => $value) {
				if ($value != null) {
					echo "\t<dt>".$key."</dt>\n\t<dd>".$value."</dd>\n\n";
				}
			}
			// $key がカスタムフィールドの名前
			// $value がカスタムフィールドの値

			echo "</dl>\n\n";
			// ここまで

		} // end if
	} // end foreach
?>
```


これで、このような構造の表示になります。
![preview.png](https://qiita-image-store.s3.amazonaws.com/0/62022/07f806d9-9050-49b2-cc44-c648d1d2f287.png "preview.png")


HTMLソースは以下の通り。

```html
<h1>子ページ１</h1>
<dl>
	<dt>hoge</dt>
	<dd>子ページ１のカスタムフィールド'hoge'の値</dd>

	<dt>foo</dt>
	<dd>子ページ１のカスタムフィールド'foo'の値</dd>

	<dt>bar</dt>
	<dd>子ページ１のカスタムフィールド'bar'の値</dd>

</dl>

<h1>子ページ２</h1>
<dl>
	<dt>hoge</dt>
	<dd>子ページ２のカスタムフィールド'hoge'の値</dd>

	<dt>foo</dt>
	<dd>子ページ２のカスタムフィールド'foo'の値</dd>

	<dt>bar</dt>
	<dd>子ページ２のカスタムフィールド'bar'の値</dd>

</dl>
```

以上です。
Photoshopの「最近使用したファイル」を吹っ飛ばす

Photoshop CCの起動時に「最近使用したファイル」が出てきますが、親切にサムネイルまで保存してくれるので、
例えばいかがわしい画像を編集した後なんかに困ってしまいます。
（注：ぼ、僕は編集したことないです）

# 結論から言うと
**設定ファイルごと初期化する必要があります。**

設定ファイルがバイナリになっているので、ちょっといじった程度では残念ながら消えません。
最近使用したファイルの名前が含まれているのは`~/Library/Preferences/Adobe Photoshop CC 2017 Settings`に入っている`MachinePrefs.psp`と`Materials.psp`で、`MachinePrefs.psp`が親玉です。

ファイル名を偽装することなんかはできるかもしれません。

なので完全に吹っ飛ばしたい場合は、これらのファイルを削除した上でPhotoshopを再起動するか、Photoshopの設定から「終了時に環境設定をリセット」を使う必要があります。

# 応急処置
「とりあえず見えなければ良い」場合は、「環境設定→ファイル管理→最近使用したファイルのリスト数」から、数字を変更するという手もあります。

しかしこの方法では履歴が追い出されて削除されるわけではなく、表示する数を変更しているだけなので、数字を元に戻すとまた表示されます。

# さいごに
履歴くらい消させろ。
お問い合わせと目視でバグを潰してた俺がアプリクラッシュ検知ツールを使って効率の良いバグ潰しを始めた話

# プロローグ

[CYBIRDエンジニア Advent Calendar 2016](http://qiita.com/advent-calendar/2016/cybird)の5日目を担当する新卒入社4年目の@sgtです。

4日目は@yusiさんの「現場改善のすすめ」でした。
つい最近まで同じチームで仕事をさせていただき、現場改善のノウハウを色々教えていただきました！
ちなみに記事中にでてくるバリューストリームマップの写真、あれうちのチームのやつですね。
あれを題材に記事を書こうかと思ったら先に書かれちゃいましたwww

ネイティブ/WebViewハイブリッドアプリを作るときの話をしようかなとも思いましたが、6日目の@megadreams14さんが題材にされるということで困ったなと。

ということで今回はアプリクラッシュ検知ツール「Smart Beat」を使って、アプリのバグ潰しを効率的に行った話をしようかなと思います。

# Smart Beatとは？

簡単に言うとアプリのクラッシュ情報や仕様状況などがわかるツールです。
詳しくは下記URLを見ていただければと。
http://smrtbeat.com/

弊社では、SmartBeatを使用して発生件数の多いバグの検知を行い、改修・アップデートをすることによってよりスピーディにより多くのお客様に快適に遊んでいただけるよう日々闘っているのですねー。

広報のような物言いね。

# どこを指標にしているか？

![advent_calendar_1.png](https://qiita-image-store.s3.amazonaws.com/0/101082/3948ffa1-8ce7-9517-2cf0-effb293d0cb4.png)


上記のように左のバーから期間と絞込み基準を選択できます。
私が特に注意深く見ているのが、絞込み基準の**発生回数**と**影響ユーザ数**です。

発生回数やら影響ユーザ数を公表すると偉い人に怒られそうなので伏せますが、どういったOSや端末でどういったクラッシュがどれだけ起きているのかが簡単にわかるのです。

# どうやって潰していくのか？

![advent_calendsr_3.png](https://qiita-image-store.s3.amazonaws.com/0/101082/877cd09e-0c54-12b4-c025-485ac1dbff07.png)

例えば上図の場合、ボイスプレイヤーをリリースするタイミングでクラッシュしているんだなぁというのがスタックトレース内のログで分かります。

また、弊社ではリリース前の開発時でしか使用していませんでしたが、クラッシュ時のスクリーンショットを撮って送ってくれる機能もあり、よりどの箇所でクラッシュしたのかが分かりやすいのです。

加えて私のチームでは、修正を行った際や調査を行った際に、原因となる部分や怪しい部分を左メニューのコメント欄に書き記していっています。
これによって、再びこのバグが発生した際に次の担当者が状況を理解しやすくなるのですね。

端末情報から機種依存の問題とわかった場合は、スケジュールやコストとの相談となりますが、推奨端末から除外するなどの対策をチーム内で話し合います。
推奨端末に加え続けたまま不具合の修正が行われないなどの状況を素早く解消するために一役買ってくれているというわけです。

# エピローグ

簡単にですが、SmartBeatを用いてのアプリのバグ潰し方法をご紹介しました！

とはいえ、私もまだまだこのツールを使い始めたばかりなので、活用できていない部分がまだまだありそうです。
これからも勉強してより効率的にバグの殲滅を遂行していきたいと思います。

明日は@megadreams14さんです。
私の1つ上の先輩で、大きいプロジェクトの開発リーダーをされているスーパーマンです。
カラムに制約をつける　SQlite学習

#unique 重複した値を許さない
フィールドのemailにuniqueを設定します。
![キャプチャ1.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/55111ed2-f5e4-6a66-99e0-cf9a7f3c80b1.jpeg)
実行結果
![キャプチャ2.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/2b4f381f-d4a8-5929-ab3b-2f498a5b9f59.jpeg)
26行目にエラーが出ています。（アドレスが重複しているのでエラー）
レコードは一つ挿入されていますね。<br>

#not null 値無しを許さない
フィールドのnameにnot nullを設定します。
レコード挿入時にemailのみでnameが無いことが分かると思います。
![キャプチャ7.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/0b899435-284a-4e60-09e8-d85e5fae4720.jpeg)
実行結果
![キャプチャ8.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/2c5da153-f8f2-f35b-350e-aeedc1c67519.jpeg)
25行目にエラーが出ています。（nameが無いとエラー）<br>

#default 何も値を設定しなかった場合にデフォルト値を設定してくれる。
フィールドのscoreにdefaultを設定します。
レコード挿入時にnameとemailのみでscoreが無いことが分かると思います。
![キャプチャ11.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/b2c6db63-8a50-b491-ded0-c6701511ed49.jpeg)
実行結果
![キャプチャ12.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/c9d24324-7763-d7a2-4c11-d0a7c0253d2a.jpeg)
nameのあとにデフォルト値として10が設定されたました。<br>


#check 値のチェック
フィールドのscoreにcheckを設定します。
scoreが0以下だとエラーと出ます。
![キャプチャ14.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/a2e15c85-5ccb-e8ec-5e71-9de1bad695cd.jpeg)
実行結果
![キャプチャ15.JPG](https://qiita-image-store.s3.amazonaws.com/0/142313/805812bc-c1bd-ce01-b3b7-ab40e3dfda51.jpeg)
ちゃんとエラーが出ていますね。
愛される👼

この記事は[絵文字 / Emoji Advent Calendar 2016](http://qiita.com/advent-calendar/2016/emoji)4日目の記事です。


最初に謝らなくてはならないのですが、、

カレンダーの主旨を思いっきり間違えました＼(^o^)／わほーい


始まってみりゃそりゃそうだって感じなのですが、私は完全に「自分の好きなemojiについて書く」カレンダーだと思っていたのです・・。

しかし新しくネタをこしらえる時間も技量もなく、穴をあけるのもあれなので自分の好きなemojiの話をします・・・。一応技術的な話なので許してください (´；ω；｀)ﾌﾞﾜｯ


## 初めてのBotと👼
書いてる人はエンジニア暦の浅いペーペーのPHPerなのですが、少し前に初めてHubotでSlackBot作りに取り組みました。

その名もgodくん。
<img width="379" alt="スクリーンショット 2016-12-04 15.39.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/119003/d6fb0591-b714-ef78-9290-9eedcd064311.png">

MTGの書記と進行を神の采配で決めてくれるという意味で ~~適当に~~ 名付けたのですが、練習で色々なクソ機能をつけた＆実装が穴だらけゆえ社内の方にはかわいがってもらえたようです＼(^o^)／

### 機能1.ズンドコする
<img width="453" alt="スクリーンショット 2016-12-04 13.16.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/119003/9d25d98c-2534-26d1-d69f-869fe19e84fc.png">
メイン機能の抽選。
Herokuで動かしていたので、RedisにMTGメンバーのSlackIDと書記・進行回数を保持して数が偏りすぎないよう適当に抽選してくれます。（コンプラがあれなのでテスト画面ですが、実稼働してました）

Botにメンションさせる時、`@名前` と文字列で指定すると `-_.` などが含まれていた時にうまくメンションしてくれない問題があったので、UserIDを取りに行く実装になっています。

```
    // slackのAPIからユーザリストを取得
    url = "https://slack.com/api/users.list?token=#{process.env.SLACK_API_TOKEN}"
    id_list = {}
    request = require("request")
    request url: url, (err, response, body) ->
      data = JSON.parse(body)

      if data["ok"] == true
　　　　　　　　　　　　　
　　　　　　　　　　　　・・・

　　　　　　　　　　　　// msg.send "<@#{取得したuser_id}>さん"という形でメンションできる
```

### 機能2.飲みたい気持ちを盛り上げる
```
module.exports = (robot) ->
  robot.hear /^.*(酒)+.*$/, (msg) ->
    message = [
      "(｀Д((:beer:(◕ω◕｀*)oｵﾗｵﾗ",
      "飲みすぎ注意；´・Д・｀p《 心 配 》q",
      "Ʊ”-ʓ(っ´ω`)っ :beers: ⊂(´ω`⊂ )Ʊ”-ʓ",
    ]
    selected = msg.random(message)
    msg.reply "#{selected}"
```

会話の中に「酒」というワードを発見すると、ランダムで酒を発射してくれます。
さっさと仕事終わらせて飲みに行こうぜ！という雰囲気促進になりますね！（？

### 機能3.ねぎらう
<img width="318" alt="スクリーンショット 2016-12-04 15.53.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/119003/eccd5428-ea08-af15-8639-c1fdb95524bb.png">

疲れてる人を癒してくれます。
こちらもランダムメッセージを誰彼構わず発射するので、社長を積極的に殴りに行く事案などが発生しました。

<img width="279" alt="スクリーンショット 2016-12-04 15.54.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/119003/958561ca-b0c3-05e1-92a2-e16064b738a8.png">

## 適当なセットアップと実装
実行環境はHubot+Heroku+Coffee.Scriptでした。
主旨とは外れるのでザックリですが、とりあえず動かすところまではごくごく簡単なはず！

```
npm install -g yo generator-hubot
npm install -g coffee-script
プロジェクト作成
// hubotを作るディレクトリ以下に移動
yo hubot
```

Procfileの中身を書き換える

```
web: bin/hubot --adapter slack
```

ローカルでは`\bin\hubot`で実行できます。

herokuでは以下の環境変数あたりを設定してあげるとサクッと動かせます。

```
HEROKU_URL
HUBOT_HEROKU_WAKEUP_TIME
HUBOT_HEROKU_SLEEP_TIME
HUBOT_SLACK_TOKEN
SLACK_API_TOKEN
HUBOT_SLACK_TEAM
HUBOT_SLACK_BOTNAME
```

## おまけ
👼のemojiめっちゃ愛らしいと思ってたのですが、OSによっては全然かわいくないことに気がつき愕然としました。
<img width="124" alt="スクリーンショット 2016-12-04 16.02.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/119003/49b75c1f-b900-474a-ab52-4dfb492dbb7a.png">
iOSだと目がマジで怖い。

みなさんも愛される👼をSlackに飼いましょう＼(^o^)／


明日は@nownabeさんの🐟です！
よろしくお願いします！！
フリーランスになって嫌な思い出（続き）

前日の嫌な思い出を思い出してしまい、まだまだ心の傷がふさがっていなかったみたいで、
今日の投稿が遅れてしまいすみません。

まあ、人間を「モノ」扱いして、使い捨てにする企業文化は、外資系（特にアメリカ）なんか
が得意とするわけで、某ドナルドが「アメリカに雇用を取り戻す」といってわめいている姿を見る度に、ドラスティックに雇用を切り捨てる企業文化のアメリカが何を言ってんだコノヤローと、中指でも立てて説教したいくらいなわけで。。。

前日は雇用でしたけど、今日は社内の情報共有で嫌な思い出でも語ります。

# 小学校レベルのイジメにあったこと

この業界、ナレッジツールやメール、チャットツールなどを使って、連絡や情報共有をしていたししますよね。

フリーランスも同じ職場で同じ仕事をしていても、情報共有で仲間はずれにされていたり、メールのメーリングリストから外されたり、Ｓｌａｃｋも別チャネルを立ち上げて区別されていたりする職場も幾つか体験しました。

まあ、いいんですよ、情報の共有レベルの区別って、業務上必要なわけだし、
「区別」してそれらのツールを仕事に使うまではね。

最近、原発から自主避難している子供を教師も一緒になってイジメたりするニュースが話題になっていますが、
自分は、フリーランス虐めってやつも経験しています。

自分が見られないチャットルームで悪口を言われたり、職場の一番上の上司は飲み会に誘っているにも関わらず、その情報共有を自分が見られないメーリングリストで毎回行われて。「なぜ君は飲み会とかに参加しないの？」とその上司から聞かれて、初めて村八分になれていることに気づかされたり。

正直な話、フリーランスで業務委託契約する際に、「機密保持契約」を締結してから業務をさせて貰うので、情報の共有レベルを細かく分ける必要は無いんですよ。

一緒に働くのなら、一緒の仲間として区別や差別なく働きたいものです。

人間って、３人集まれば派閥が出来てしまい、対立する愚かな生き物です。

フリーランスだからって差別や区別を受けるのは、ちょっと辛いですよね。

国や厚生労働省、経済団体がフリーランスを増加させようとしている行動には、断固反対です。日本には日本的な雇用形態があるので、それをうまく発展させればいいじゃないですか？

なんだか、二日とも嫌な話でごめんなさい。
前日書いたことにより、また心の病が悪化してしまったみたいです。

明日からは、前向きに「良かったこと」を書きたいと思います。
githubのprivate repositoryをnpmでインストールする

private repositoryで依存関係がある場合、
`git submodule`等を使う方法もありますが、手間がかかりました。
他のモジュールと同様に扱いたいです。

# やりかた

まず、最終形から紹介。

```json
{
  "dependencies": {
    "<modulename>": "git+https://<token>:x-oauth-basic@github.com/<username>/<reponame>#<tagname>"
  }
}
```

他のモジュールと同じようにかけます。

## 各設定値
| 設定値 | 説明 | 備考 |
|:-:|:-:|:-:|
| modulename  | そのrepositoryの package.jsonのname  |   |
| username  | そのrepositoryのowner名 |   |
| reponame  | そのrepository名  |   |
| tagname  | 利用したいタグ/ブランチ名 | #を含めて省略するとmasterブランチを意味する  |
| token  | githubのpersonal access token  | 後述  |

### personal access token

personal access tokenは、自身の権限で、githubの諸々の操作をするための文字列です。

https://github.com/settings/tokens/

から設定できます。

詳細な設定方法は下記の記事が参考になります。
http://qiita.com/kz800/items/497ec70bff3e555dacd0

このとき、「repo」に権限を与えておけば、充分です。

<img width="638" alt="select scopes" src="https://qiita-image-store.s3.amazonaws.com/0/1371/6405491b-28dc-8dda-f7be-859d5176a552.png">

# しかしmonorepoへ
このようなやり方で、結合を減らすのはとてもよいやり方と思っていました。
しかし、頻繁なバージョン変更が必要になるなど、ときに機動力を遅くします。
内部でしか使わないことが保証されているのであれば、最近では、[lerna](https://github.com/lerna/lerna)などを使った、monorepoというスタイルが受け入れられてきているようです。

# より自然なやり方というメリット
monorepoは便利で魅力的ですが、symbolic linkを張ることに起因した、
特殊な環境であることを考慮する必要があるでしょう。
自然なやり方で、ということでしたら、このやり方もありだと思います。
[めも]HTTP 204

Androidで、Google Play Servicesを触っていた時に、204が返ってきたので、メモ。
例：Got network response. code, size: 204, 0

#HTTPのレスポンスコード204は、"204 No Content"のこと
##Contentが無いのは、ユーザに返すべき処理(ページの表示内容の更新など)が無いから。

ようするに、投げっぱなしでよい処理だから、204。
レスポンスが200なら、ページの表示内容を更新したりしますよね?

ちなみに、サーバ上にリソースを(更新ではなく)作成した場合などで、ページの表示内容の更新などが無い場合は、レスポンス201 Createdを使うそうです。

#参考
MDN：204 No Content
https://developer.mozilla.org/ja/docs/Web/HTTP/Status/204

>The HTTP 204 No Content success status response code indicates that the request has succeed, but that the client doesn't need to go away from its current page.

(訳)
HTTPの応答コード204は、リクエストが成功した事を示しますが、
クライアントは現在のページから遷移する必要はありません。

※どなたか、お願いします！
MDNの、204 No Contentのページの日本語訳を作成しましたが、エラーが発生して、HTTPSidebarを追加できません。可能であれば、追加をお願いします。
IDEを使う。

IDE (Integrated Development Environment) 
統合開発環境

2016年現在、今は色々なエディタが有るんですね。（昔から色々あったかもしれませんが）

僕が若手PHPerだった2006年頃、IDEはeclipseしか知りませんでした。
そして、僕はIDEを使っていませんでした。
愛用は、PHP Editor プロジェクト版でした。

しかし、今仕事でやっているプロジェクトはクラスやメソッドが多く、流石にIDEないと辛いです。
（大きなプロジェクトでもIDEの機能に頼らず開発できる手法を模索中ですが）

で、調べた結果、
今はPhpstormが熱いらしいですが、貧乏な僕はフリーじゃないと死んじゃうので、
おとなしくNetbeansにしました。　Phpstorm欲しい… （よく知らないけど←）

便利な機能ですが、
メソッドの宣言へリダイレクトしたり、すぐ戻ってこれたり。
ソースの比較がグラフィカルに出来るのは良いですね。（過去のソースとかも）
ソースを戻す事も容易ですし。
gitとの連携も素敵です。
行のブックマークなんかもいいですね。作業を中断してしばらく触れない時に、何してたか忘れないようにメモしておける。

まだまだ使いこなせていないですが、だいぶ助かっています。
データサイエンス領域の役立つブログをまとめる（日本のみ）

[データサイエンス領域の役立つブログをまとめる（海外 & 日本）](http://qiita.com/hik0107/items/66da7878fd95acf4f3bd)が日本のブログが少ないので、私が参考にしている日本のブログを。

* [六本木で働くデータサイエンティストのブログ](http://tjo.hatenablog.com/)
    * 流行の技術に対する一歩引いた解説、Rでの実装、推薦の本など、ブログを1つだけ選ぶとしたらこれが一番いい
    * R、相関などの統計の基礎、時系列分析などの統計モデル、機械学習、etc
* [Logics of Blue](http://logics-of-blue.com/)
    * 実装例と理論の解説が分かりやすい
    * R、相関などの統計の基礎、時系列分析などの統計モデル、機械学習、etc
* [iAnalysis ～おとうさんの解析日記～](http://d.hatena.ne.jp/isseing333/)
    * Rの実装例で関数の細かなTipsなど役に立つことが多い
* [盆栽日記](http://d.hatena.ne.jp/dichika/)
    * Rの実装例で関数の細かなTipsなど役に立つことが多い
    * テキスト処理に強い方のようだ
* [StatsFragments](http://sinhrks.hatenablog.com/)
    * PythonとRの実行例
    * Pythonに強い方のようだ
* [My Life as a Mock Quant](http://d.hatena.ne.jp/teramonagi/)
    * 金融に強い方のようだ
    * 金融系の時系列分析の実行例が豊富
* [人工知能に関する断創録](http://aidiary.hatenablog.com/)
    * 機械学習一般に広い分野。JavaとPython。
* [分析技術とビジネスインテリジェンス](http://blog.livedoor.jp/norikazu197768/)
    * Pythonによる時系列分析、機械学習など
* [nakhirotのブログ](http://nakhirot.hatenablog.com/)
    * R, Pythonによる多変量解析、遺伝統計、マーケティング分析
    * 『Rによる時系列分析入門』を参照した時系列分析あり
Arduino IDEでWA-MIKAN(和みかん)のESP8266をプログラミングする　SDカード編

　WA-MIKANにはマイクロSDカードスロットが搭載されています。このSDカードスロットはESP8266からも読み書きできるように設計しています。ArduinoIDEを使ってESP8266からSDカードを使用する方法について説明します。ArduinoIDEの環境設定などは、[Arduino IDEでWA-MIKAN(和みかん)のESP8266をプログラミングする　書き込み編](http://qiita.com/tarosay/items/42d7bcac31d93062ffa6)を参照してください。
## ジャンパのショート
　WA-MIKANのマイクロSDカードは、通常はGR-CITRUSから使えるようになっています。GR-CITRUSを接続しないときには、SDカードはどこにも接続されていませんが、これをESP8266につなぐことができます。これを実現するには、J17, J18, J19, J20の4箇所をショートします。ショート箇所は下写真の赤丸のところです。
　![33.png](https://qiita-image-store.s3.amazonaws.com/0/32065/528789fd-78ab-55ad-7c0d-4d4d0e308e99.png)
## SD書き込みプログラムの作成
　4箇所をショートしたらSDカードスロットにマイクロSDカードを挿します。そして、「Arduino IDEでWA-MIKAN(和みかん)のESP8266をプログラミングする　書き込み編」に説明したように、JP1をループショートしてUSBシリアル変換基板を接続しリセットボタンを押します。
　ArduinoIDEの「スケッチの例」から「SD(esp8266)」の「Files」を選びます。
　![34.png](https://qiita-image-store.s3.amazonaws.com/0/32065/af9f17b8-5e0a-8707-25e2-abeff2d5a30f.png)
　プログラムを少し修正して、SDカードにTXTファイルが残るようにしました。

```C++
/*
  SD card basic file example

 This example shows how to create and destroy an SD card file
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4

 created   Nov 2010
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */
#include <SPI.h>
#include <SD.h>

File myFile;

void setup()
{
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");

  if (SD.exists("example.txt")) {
    Serial.println("example.txt exists.");
  }
  else {
    Serial.println("example.txt doesn't exist.");
  }

  // open a new file and immediately close it:
  Serial.println("Creating example.txt...");
  myFile = SD.open("wa-mikan.txt", FILE_WRITE);
  myFile.close();

  // Check to see if the file exists:
  if (SD.exists("wa-mikan.txt")) {
    Serial.println("wa-mikan.txt exists.");
  }
  else {
    Serial.println("wa-mikan.txt doesn't exist.");
  }

  // delete the file:
//  Serial.println("Removing example.txt...");
//  SD.remove("example.txt");

//  if (SD.exists("example.txt")) {
//    Serial.println("example.txt exists.");
//  }
//  else {
//    Serial.println("example.txt doesn't exist.");
//  }
}

void loop()
{
  // nothing happens after setup finishes.
}
```
　WA-MIKAN.TXTというファイルがSDカードに作成されるはずです。
　マイコン書き込みボタンを押すと、ビルドと書き込みが行われます。
　![35.png](https://qiita-image-store.s3.amazonaws.com/0/32065/9ccf6615-b6ef-572e-db8e-1734aff77c49.png)
　書き込みが終了すると、自動的にプログラムが走ります。
　![36.png](https://qiita-image-store.s3.amazonaws.com/0/32065/7e43c1bf-3f91-2248-abc2-2b264723d724.png)
　wa-mikan.txtファイルができていることがわかります。
　これでWA-MIKANのESP8266からSDカードが使えるようになりました。以上で説明終了です。
Arduino IDEでWA-MIKAN(和みかん)のESP8266をプログラミングする　書き込み編

　ESP8266搭載のWiFi基板WA-MIKANはGR-CITRUS用のWiFi基板として売られていますが、WA-MIKAN単独でもArduino IDEを用いて開発できるように設計されています。そこでWA-MIKANをArduino IDEのESP8266開発環境を用いてプログラミングする方法について説明します。
　ここでは、Arduino IDEでプログラムしたものをWA-MIKANに書き込む方法について説明します。

## 書き込み準備
　WA-MIKANに搭載されているESP8266にプログラムを書き込むには、JP1をショートさせる必要があります。JP1はハーフピッチ(1.27mm)のピンヘッダサイズになっていますが、る写真のようにブレッドボードのジャンパ線をループにして挿しても大丈夫です。
　![28.png](https://qiita-image-store.s3.amazonaws.com/0/32065/3af53363-c79a-63d6-ad8c-b18b6fd83704.png)
　書き込むためにUSBシリアル変換基板が必要です。今回使用しているのは、[SparkFun FTDI Basic Breakout 3.3V](https://www.sparkfun.com/products/9873)です。もし、5V供給のUSBシリアル変換基板を使いたい場合は、[こちらの説明](http://qiita.com/tarosay/items/0744055468cd0248def3)を参考にしてください。
　![29.png](https://qiita-image-store.s3.amazonaws.com/0/32065/909df04d-d809-83f8-c8a8-4c888c44a9a8.png)
　この状態でリセットボタンを押してください。
## Arduino IDEを立ち上げます
　初めてWA-MIKANのESP8266に書き込みを行うときのために、ArduinoIDEの設定を再度書いておきます。環境のインストール方法は[Arduino IDEでWA-MIKAN(和みかん)のESP8266をプログラミングする　環境インストール編](http://qiita.com/tarosay/items/28ba9e0208f41cec492d)を参照してください。
　最初にArduino IDEの環境をESP8266用に設定する必要があります。ツールのボードから「Generic ESP8266 Module」を選びます。
　![22.png](https://qiita-image-store.s3.amazonaws.com/0/32065/9324215c-8a51-5d5a-67f3-c50ec609190d.png)
　ボード以下のパラメータは下図のように設定しました。
　![27.png](https://qiita-image-store.s3.amazonaws.com/0/32065/86fa8ba5-ecdb-97ea-33e8-9dbf90dedae4.png)

* ボード: "Generic ESP8266 Module"
* Flash Mode: "QIO"
* Flash Frequency: "80MHz"
* CPU Frequency: "160MHz"
* Flash Size: "4M (3M SPIFFS)"
* Debug port: Disabled"
* Debug Level: "なし"
* Reset Method: "ck"
* Upload Speed: "256000"
* シリアルポート: "COM15"

　Upload Speedは、921600でも512000でも書きこみ出来ますが、よく失敗するので256000にしています。これでも失敗する場合は115200などに落としてください。また、シリアルポートはお使いのPC環境によって違います。
　ここまで設定できればあとはプログラムを書き込むだけです。試しに、シリアルポートから「Hello WA-MIKAN World.」と出力するプログラムをWA-MIKANに書き込んでみます。
　プログラムです。

```C++
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(10);
 
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello WA-MIKAN World.");
  delay(1000);
}
```
　「マイコンボードに書き込む」ボタンを押します。コンパイル後、WA-MIKANへの書き込みが始まります。右上のシリアルモニタを立ち上げてボーレートを115200bpsにしておくと、Hello WA-MIKAN World.が受信できます。
 ![31.png](https://qiita-image-store.s3.amazonaws.com/0/32065/25c87188-4be1-75ac-1e1d-7a5706b7e804.png)
　Hello WA-MIKAN World.を受信しています。
　![32.png](https://qiita-image-store.s3.amazonaws.com/0/32065/674d4599-9e38-df63-76e4-a0ebabb69f00.png)
　これで、Arduino IDEを使ってWA-MIKAN搭載のESP8266にプログラムを書き込むことができるようになりました。
　[WA-MIKANの回路図など](https://github.com/wakayamarb/wa-mikan)はgithubに置いてあります。WA-MIKANはVer1.8基板となります。
部分文字列を取得する

#始めに
[Haskellで高階関数を組み合わせて部分文字列を作る例が全然わからなかったから考えた](http://qiita.com/ksyundo/items/724b7e9bddac58e78e83)をみて、部分文字列の切り出しを命令型言語で行ったらどうなるのか興味が湧いたので、Javaで実装してみました
#実装したソース
まずは2重ループでべたに実装してみました

```MyFunctionTest2.java
package test;

import java.util.ArrayList;
import java.util.List;

public class MyFuncTest2 {
	public static void main(String args[])throws Exception{
		String sample = "ABCDE";
		System.out.println(execute(sample));
	}
	
	public static List<String> execute(String str)throws Exception{
		List<String>stringList = new ArrayList<String>(); 
		int size = str.length();
		//外側のループは切り出し位置の開始を決定しています
		for(int KIRIDASHI_START =0; KIRIDASHI_START<size;KIRIDASHI_START++){
			//内側のループは切り出し位置の終了を決定しています
			for(int KIRIDASHI_END =1; KIRIDASHI_END < (size -KIRIDASHI_START+1); KIRIDASHI_END++){
				stringList.add(str.substring(KIRIDASHI_START, KIRIDASHI_START + KIRIDASHI_END,str));
			}
		}
		return stringList;
	}
	public static String parseString(int start,int end,String str){
		System.out.println("開始:"+start + "　終了:"+end);
		return str.substring(start,end) + " ";
	}
	
}
```

後で自分の書いたソースを見直すと切り出し位置の取得と文字列の切り出しのロジックは別の関数に定義したほうが、プログラムの抽象度が上がる、と感じたので、ソースを書き直しました

```MyFunctionTest2.java
package test;

import java.util.ArrayList;
import java.util.List;

public class MyFuncTest2 {
	public static void main(String args[])throws Exception{
		String sample = "ABCDE";
		System.out.println(execute(sample));
	}
	
	public static List<List<Integer>> makeList(String str)throws Exception{
		List<List<Integer>> kridashi = new ArrayList<List<Integer>> (); 
		int size = str.length();
		//外側のループは切り出し位置の開始を決定しています
		for(int KIRIDASHI_START =0; KIRIDASHI_START<size;KIRIDASHI_START++){
			//内側のループは切り出し位置の終了を決定しています
			for(int KIRIDASHI_END =1; KIRIDASHI_END < (size -KIRIDASHI_START+1); KIRIDASHI_END++){
				List<Integer>list = new ArrayList<Integer>();
				//切り出し位置の先頭をリストに格納する
				list.add(KIRIDASHI_START);
				//切り出し位置の終端をリストに格納する
				list.add(KIRIDASHI_START + KIRIDASHI_END);
				kridashi.add(list);
			}
		}
		return kridashi;
	}
	
	public static List<String> execute(String str) throws Exception{
		List<String>list = new ArrayList<String>();
		for(List<Integer>ichilist :makeList(str)){
			list.add(str.substring(ichilist.get(0),ichilist.get(1)));
		}
		return list;
	}
}
```
#終わりに
実際に、Javaで実装してみてHaskellの実装と比較してみると言語の思想の違いがわかって面白いです。
命令型言語の場合、データ構造においてデータの位置を意識して実装する場面が多いようです
gitを使う。

2016年現在、今はgitを導入した開発が当たり前のようですね。

僕が若手PHPerだった2006年頃、gitなんて聞いたことも無かったです。たぶん。
（Subversionを導入している企業がチラホラあったくらい）

近年gitを耳にするようはなったものの、開発から離れていた僕は、
「git？　あぁ勝手にバックアップとってくれて、チーム開発でなんか便利らしいね」

くらいの知識しかありませんでした。
そして2016年、再び開発者になり初めて使いました。
感想ですが、
「ちょ、ちょうべんり…(-q-)」

何が驚いたかって、ブランチ切り替えた途端、windows Explorer上のファイルの内容が変わる事に驚きました。
「あるぇ！？どうなってるの、これぇ」
　（ん？つまり、これで見られたくないファイルはブランチ切り替えで隠せるな←）

約10年のブランクがあった為、完全に浦島太郎状態です。
IDEもそうですが、開発手法も日々進化しているんだなぁと関心してしまいました。
（昔からあった技術なのかもしれませんが、普及はしてなかったはず）

はぁ…　今の技術者からしたら、低レベルな話ですね。すみません。