OmniAICreator/Qiita-1.07M huggingface dataset:
パスが通っていない regasm.exe を呼出する

# はじめに

.NET Framwork マネージドコードの COM オブジェクトをシステムに登録するには、regasm.exe を使います。
ところがこれには標準でパスが通っていません。
フルパスで指定するにしても実行する環境によってパスが異なります。
（自分の開発環境では C:\Windows\Microsoft.NET\Framework\v4.0.30319 だが、別の環境ではバージョン番号の箇所が異なる。）
自作の COM オブジェクトを配付してインストーラで自動で登録させるのに、これでは困ります。

regasm.exe は .NET Framework のインストール先です。
.NET のコードで実行時に Framework のインストール先が取得できるので、regasm.exe を呼出するプログラムを作ればいいのでは、と思いました。

# regasm.exe を呼出するプログラム

プロジェクトを新規作成します。「コンソールアプリケーション」を選びます。

```Main``` プロシージャを実装します。

```csharp:Program.cs
using System.Runtime.InteropServices;
using System.Text;

class Program
{
    static void Main(string[] args)
    {
        // RegAsm のパスを取得
        string path = System.IO.Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "RegAsm.exe");
        // パスをコンソールに出力
        Console.WriteLine("[" + path + "]");

        System.Diagnostics.Process p = new System.Diagnostics.Process();
        p.StartInfo.FileName = path;
        // 渡されたコマンドライン引数をそのまま渡す
        StringBuilder buff = new StringBuilder(128);
        foreach(string arg in args)
        {
            buff.Append(arg + " ");
        }
        p.StartInfo.Arguments = buff.ToString();
        // 出力を取得できるようにする
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardInput = false;
        // ウィンドウを表示しない
        p.StartInfo.CreateNoWindow = true;

        // 起動
        p.Start();

        // 出力を取得
        string results = p.StandardOutput.ReadToEnd();
        // プロセス終了まで待機する
        p.WaitForExit();
        p.Close();
        // 出力された結果を表示
        Console.WriteLine(results);
    }
}
```

```vbnet:Program.vb
Imports System.Runtime.InteropServices
Imports System.Text

Module Program

    Sub Main()

        'RegAsm のパスを取得
        Dim path As String = IO.Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "RegAsm.exe")
        'パスをコンソールに出力
        Console.WriteLine("[" & path & "]")

        Dim p As New System.Diagnostics.Process()
        p.StartInfo.FileName = path
        '渡されたコマンドライン引数をそのまま渡す
        Dim args As New StringBuilder(128)
        For Each arg As String In My.Application.CommandLineArgs
            args.Append(arg & Space(1))
        Next
        p.StartInfo.Arguments = args.ToString
        '出力を取得できるようにする
        p.StartInfo.UseShellExecute = False
        p.StartInfo.RedirectStandardOutput = True
        p.StartInfo.RedirectStandardInput = False
        'ウィンドウを表示しない
        p.StartInfo.CreateNoWindow = True

        '起動
        p.Start()

        '出力を取得
        Dim results As String = p.StandardOutput.ReadToEnd()
        'プロセス終了まで待機する
        p.WaitForExit()
        p.Close()
        '出力された結果を表示
        Console.WriteLine(results)
    End Sub

End Module
```
RESAS APIを叩いてみる


RESAS APIとはRegional Economy Society Analyzing Systemの略らしい。

```
地域経済分析システム（以下、RESAS）は、地域に関する官民の様々なデータを搭載し、
誰もが分かりやすいように「見える化」したシステムです。
```

との説明にもあるように、国が取得している地域経済のデータをAPIとして提供してくれてる。
それだけで何がわかるわけでもないけど、ちょっと叩いてみる


## 1. RESAS-API利用登録を行う

以下のurlから利用登録を行い、APIキーを取得する
（APIキーが記載されたurlが送られてくる。メールなどには残らないので、ちゃんと記載しておく）
https://opendata.resas-portal.go.jp/


## 2. API仕様書を読んで、叩きたい項目とパラメータの確認

API仕様書を読む。一次産業と地域ごとの企業情報。国税調査の結果などがちょいちょい載ってるみたい
https://opendata.resas-portal.go.jp/docs/api/v1-rc.1/index.html

## 3. APIを叩いてみる

APIの仕様詳細を見ると、リクエストヘッダーでAPIキーを送れとかいてるので

```
# 出生数・死亡数/転入数・転出数のAPIを叩く
curl -H "X-API-KEY:[APIキー]" "https://opendata.resas-portal.go.jp/api/v1-rc.1/population/sum/estimate?prefCode=11&cityCode=-"

# 結果
{"message":null,"result":{"boundaryYear":2014,"data":[{"label":"総人口","data":[{"year":1960,"value":2430871},{"year":1965,"value":3014983},{"year":1970,"value":3866472},{"year":1975,"value":4821340},{"year":1980,"value":5420480},{"year":1985,"value":5863678},{"year":1990,"value":6405319}...]]}
```
Node.jsでbetter-sqlite3とsqlite3のベンチマーク on AWS Lambda


# はじめに

Node.jsでsqlite3を扱うのにいろいろなライブラリがありますが、
最近better-sqlite3という速度を売りにしたライブラリがあったのでベンチマークしてみました。

[sqlite3](https://www.npmjs.com/package/sqlite3)
[better-sqlite3](https://www.npmjs.com/package/better-sqlite3)

AWS Lambda上で実行したのでコンテナ起動の時間などももしかしたらかかっているかもしれません。
デプロイ後、AWSのウェブのコンソール上で実行し、出力されたDurationで計測しています。

# 検証環境

AWS Lambda メモリ128MB

* Node.js 4.3.2
* npm
	* aws-sdk 2.6.3
	* sqlite3 3.1.8
	* better-sqlite3 1.3.9

# ベンチマーク結果

簡単なselect文でレコード数が16件だったためかほとんど差がありませんでした。
メモリの使用量はsqlite3が21MB、better-sqlite3が17MBでした。

| 回数           | sqlite3(ms)  | better-sqlite3(ms) |
| :------------ | -----------: | -----------------: |
| 1             | 16.88        | 1.60               |
| 2             | 1.36         | 23.09              |
| 3             | 38.54        | 4.72               |
| 4             | 21.39        | 26.52              |
| 5             | 9.88         | 2.29               |
| 6             | 13.80        | 1.15               |
| 7             | 1.33         | 21.16              |
| 8             | 21.48        | 17.20              |
| 9             | 12.05        | 5.98               |
| 10            | 7.17         | 1.16               |
| 平均           | 14.388       | 10.487             |
| 80パーセンタイル | 21.408       | 21.546             |
| 90パーセンタイル | 23.186       | 23.433             |



# sqlite3

```javascript
'use strict';

var sqlite3 = require('sqlite3')
  ;

exports.exec = function (callback) {
  var db = new sqlite3.Database('data/test.db', sqlite3.OPEN_READONLY)
    ;
  db.each('select id, name from master', function (error, row) {
    console.log(row.id);
    console.log(row.name);
  });
  db.close(callback);
}
```

# better-sqlite3

```javascript
'use strict';

var Database = require('better-sqlite3')
  ;

exports.exec = function (callback) {
  var db = new Database('data/test.db')
    ;
  db.on('open', function () {
    var statement = db.prepare('select id, name from master');
    statement.each(function (row) {
      console.log(row.id);
      console.log(row.name);
    });
    db.close();
  });
  db.on('close', function () {
    callback();
  });
}
```
【まとめ】チーム内のコミュニケーションがいかに重要であるか（Googleの5つの鍵）

少し前の記事なのですが、大事なことなので自分で理解するためにもまとめたいと思います。



# チーム内のコミュニケーションこそ重要である
成功するかどうかを決定する要因はチームの誰がいるかではなく、チーム内でどのようにやりとりをしているかであるため、チームの構成はチーム内のコミュニケーションより重要ではない、というのがGoogleの結論だ。
Googleは同社のチームがより効果的に働くための5つの要素を特定した。
**心理的安全性**、**信頼性**、**構造**、**意味**、**インパクト**が在職期間、スキルレベル、場所などの性質よりも大きな影響を持っている。

## 1.心理的安全性
心理的安全性は5つの中で**最も基礎にあり最も重要な**要因だ、としている。
どんな組織でも「他人から浮いていないか」「理解していないことを悟られないように黙っていよう」という空気になって自己保身に走ることがあるものですが、効率的で良いチームにとっては害以外の何ものでもありません。安心して仕事に専念するためには、チームの一員として安心できる空気づくりが肝心だということです。

## 2.信頼性
仕事の効率性を高めるためには、メンバー全員が歩調を合わせて進むことが重要。任せておいても着実にプロセスを進めてくれるメンバーがいることが重要です。
チームが一緒になって役割や責任を確認し、完了した仕事を完全に透明にしておくことで信頼性は促進されます。

## 3.組織構造と透明性
チームはゴールを頻繁に共有し、ゴールを達成するための計画を頻繁にレビューすることで改善する。チームのメンバーは全員が明確な自分の役目、仕事の予定、そして最終目標を共有しておく必要があります。

## 4.仕事の意味
仕事のゴールは利益を上げることではありますが、それだけでは続かないものです。チームメンバーのお互いにとって、今の仕事がどのような個人的な意味を持つのかを知っておくことも大切。
仕事が完了したことに対する評価を表現したり、サポートを表明したり、フィードバックをしたりすることで、個人的な意味の感覚は改善されます。

## 5.仕事のインパクト
仕事を進めるためには、モチベーションになるものが必要です。
個々人の働きがどのように他人に影響を与えているか(ポジティブにもネガディブにも)について頻繁に会話することでこの要因のチーム内での存在を高めることができます。





# 参考にさせていただいた記事
* [Googleと完璧なチーム-InfoQ-](https://www.infoq.com/jp/news/2016/10/google-perfect-team?utm_source=infoq&utm_medium=popular_widget&utm_campaign=popular_content_list&utm_content=homepage)
* [成功したGoogleのチームに備わっている5つのカギとは？-Gigazine-](http://gigazine.net/news/20151126-five-keys-to-successful-team/)
SlackでHubotへの問いかけを特定のprivate channelに限定させる方法

# 概要
全社でslackの1Team利用をすることになったりして、誰でも自由に問いかけたらまずいコマンドがhubotにある場合、自チームのメンバーが入っているprivate channelに当該hubotのコマンド受け付けを限定させる方法の簡易版です。

## この記事でできること
- public/privateを問わずにチャンネルに対してhubotの問いかけ許可を与えられる
- hubotに対して特定ユーザがダイレクトメッセージで問いかけができる（その他のユーザはできない）
- 問いかけを全チャンネル許可へ切り替えられる

## この記事でできないこと
- チャンネル内で特定のユーザだけがhubotへ問いかけれる
- 限定させるチャンネルをチャンネル名で指定すること
- hubotのデフォルトコマンドへの問いかけ制限


# 手順
以下の修正をhubotに対して行います。

## チャンネルのroom値を取得

プライベートチャンネルは普通にやるとチャンネル名が取得できない(undefinded)ので、
まずはチャンネルのroom値（おそらく9桁大文字英数字）を取得する以下のようなコマンドを、hubotに追加します。

```coffee:room.coffee
# Description:
#   チャンネルのroomの値を取得する。取得した値はアクセス制御に利用する。
#
# Commands:
#   hubot room - チャンネルのroomの値を取得

module.exports = (robot) ->
  robot.respond /room/, (msg) ->
      msg.send "#{msg.envelope.room}"
```

このコマンドをhubotを利用したいチャンネルで実行すると、そのチャンネルのroom値が取得できます。
ダイレクトメッセージでhubotに対してこのコマンドを実行した場合もroom値が取得できるため、
この値を使って開発ユーザのダイレクトメッセージは許可させることもできます。

## コマンドの実行制限処理
次に実行に対して制限をかけたいhubotコマンドに対して、以下の記述を追加します。

```coffee:コマンド名.coffee
permitted_rooms = process.env.HUBOT_PERMITTED?.split(',') || []

permitted = (room) ->
  room in permitted_rooms || 'ALL' in permitted_rooms

module.exports = (robot) ->
  robot.respond /コマンド名 (.*)/, (msg) ->
    # 許可しないチャンネルでは実行禁止
    unless permitted msg.envelope.room
      return

    # ここからこのコマンドでやりたい処理を書く
    # ...
```


## Hubotの起動コマンド
HUBOT_PERMITTEDの変数に許可するチャンネルのroom値をカンマ連結で設定します。
制限をかけなくても良くなった場合は`ALL`を指定して起動してください。

```sh:起動コマンド
# 問いかけ可能なチャンネル（ユーザ）を限定させる場合
HUBOT_PERMITTED=ルームID1,ルームID2,Hubotに直接DMしたときの値 HUBOT_SLACK_TOKEN=Slackのトークン ./bin/hubot --adapter slack

# 全てのチャンネルで問いかけを許可する場合
HUBOT_PERMITTED=ALL HUBOT_SLACK_TOKEN=Slackのトークン ./bin/hubot --adapter slack
```

**※注意：HUBOT_PERMITTEDを指定してhubotを起動する前に、一度roomコマンドが有効な状態でhubotを起動させ、room値を取得する必要があります。**



# 簡易版を脱するには？
[groups.list](https://api.slack.com/methods/groups.list)の中にはプライベートチャンネルのチャンネル名も全て入っているので、この情報を使ってチャンネル名とIDの一覧を作れば、チャンネル名指定からIDを逆引きして、制御することが可能だと思います。
頑張りたい人は是非こちらで頑張ってみてください！（私はいいです）


# 参考

- [Hubotでbotの反応する部屋やユーザーに制限を設ける](http://blog.manaten.net/entry/hubot-limit)
- [Hubot で特定の channel(group) とか user しか相手にしないようにする](http://beco.hatenablog.com/entry/2014/12/25/234026)
【Swift 3】UIStatusBarStyle の変更

#iOS 10 以前（Swift 2.3以前）

UIStatusBarStyle を変えるには今までこのように記述していました。

```Swift
override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return .LightContent
}
```

#iOS 10.0 以降（Swift 3.0以降）
しかし、iOS 10.0 からはこのように記述します。

```Swift
override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}
```

今だとググっても以前の書き方しかヒットしないので、取り急ぎ。

#参考
- [iOS 10.0 API Diffs](https://developer.apple.com/library/content/releasenotes/General/iOS10APIDiffs/Swift/UIKit.html)
Laravel 5.3でQueryBuilderが生成しているSQLを出力する

## 概要
Query Builderが内部で生成しているSQLをログに出力する方法。

## 方法
Query Builderを呼び出している箇所で以下のコードを追加する。


```php
    public function findAccountEntityByEmail(EmailValue $emailValue): AccountEntity
    {
        $selectColumns = [
            'a.id',
            'a.status',
            'a.lock_version AS accounts_lock_version',
            'ae.id AS email_id',
            'ae.email',
            'ae.email_verified',
            'ae.lock_version AS accounts_emails_lock_version',
            'ap.id AS password_id',
            'ap.password_hash',
            'ap.lock_version AS accounts_passwords_lock_version',
        ];

        // SQLを実行する前にこれを追加する
        \DB::enableQueryLog();

        $account = \DB::table('accounts_emails AS ae')
            ->select($selectColumns)
            ->join('accounts AS a', 'a.id', '=', 'ae.account_id')
            ->join('accounts_passwords AS ap', 'a.id', '=', 'ap.account_id')
            ->where('ae.email', '=', $emailValue->getEmail())
            ->first();

        // ロギングクラスを使ってログに出力する
        // "sql_debug_log", "findAccountEntityByEmail"の部分には任意の名前を入れられる
        \Log::debug(
            'sql_debug_log',
            [
                'findAccountEntityByEmail' => \DB::getQueryLog()
            ]
        );

```

デフォルトだと、storage/logs/laravel.log に出力されているハズなので確認します。
↓1行で出力しているので少し見にくいですが以下のように出力されます。

```:laravel.log
[2016-11-27 08:11:57] testing.DEBUG: sql_debug_log {"findAccountEntityByEmail":[{"query":"select `a`.`id`, `a`.`status`, `a`.`lock_version` as `accounts_lock_version`, `ae`.`id` as `email_id`, `ae`.`email`, `ae`.`email_verified`, `ae`.`lock_version` as `accounts_emails_lock_version`, `ap`.`id` as `password_id`, `ap`.`password_hash`, `ap`.`lock_version` as `accounts_passwords_lock_version` from `accounts_emails` as `ae` inner join `accounts` as `a` on `a`.`id` = `ae`.`account_id` inner join `accounts_passwords` as `ap` on `a`.`id` = `ap`.`account_id` where `ae`.`email` = ? limit 1","bindings":["account-create-test-success-required-params@gmail.com"],"time":1.1}]}
```
ブルートフォース攻撃対策 Fail2ban

## Fail2ban
他に DenyHosts や Sshguard がある。詳しくは「[DoS攻撃/ブルートフォース攻撃対策アプリの近況](http://qiita.com/bezeklik/items/6d86a162e278f576e4ca)」を参照。

## パッケージ群
EPEL リポジトリからインストールできるパッケージ群は以下の通り。

```
fail2ban-all.noarch : Install all Fail2Ban packages and dependencies
fail2ban-firewalld.noarch : Firewalld support for Fail2Ban
fail2ban-hostsdeny.noarch : Hostsdeny (tcp_wrappers) support for Fail2Ban
fail2ban-mail.noarch : Mail actions for Fail2Ban
fail2ban-sendmail.noarch : Sendmail actions for Fail2Ban
fail2ban-server.noarch : Core server component for Fail2Ban
fail2ban-shorewall.noarch : Shorewall support for Fail2Ban
fail2ban-systemd.noarch : Systemd journal configuration for Fail2Ban
fail2ban-tests.noarch : Fail2Ban testcases
fail2ban.noarch : Daemon to ban hosts that cause multiple authentication errors
```

`fail2ban-all` パッケージを指定すると、`fail2ban` パッケージと比べて `fail2ban-hostsdeny`, `fail2ban-mail`, `fail2ban-shorewall` が余計にインストールされる模様。

```
インストール中:
 fail2ban
依存性関連でのインストールをします:
 fail2ban-firewalld
 fail2ban-sendmail
 fail2ban-server
```
```
インストール中:
 fail2ban-all
依存性関連でのインストールをします:
 fail2ban-firewalld
 fail2ban-hostsdeny
 fail2ban-mail
 fail2ban-sendmail
 fail2ban-server
 fail2ban-shorewall
```

## インストール
```
yum install epel-release && yum update
yum install fail2ban fail2ban-systemd
systemctl start fail2ban && systemctl enable fail2ban
```
`fail2ban-systemd` パッケージは `[DEFAULT]` に `backend=systemd` を明記するだけの `jail.d/00-systemd.conf` ファイルが追加される。 

## 設定
### 設定ファイルの適用順序
1. `/etc/fail2ban/jail.conf`
2. `/etc/fail2ban/jail.d/*.conf` (アルファベット順)
3. `/etc/fail2ban/jail.local`
4. `/etc/fail2ban/jail.d/*.local` (アルファベット順)

### ローカル設定ファイルの作成
```ini
cat << "_EOF_" > /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 192.168.0.0/24
# 1時間
bantime  = 3600 
# 10分
findtime = 600
maxretry = 3

[sshd]
enabled  = true

[postfix-sasl]
enabled  = true
# 1週間
bantime  = 604800
# 1日
findtime = 86400
_EOF_
```

### 再起動
```
systemctl restart fail2ban
```

### ステータスの確認
```bash
fail2ban-client status
```
```text:出力例
Status
|- Number of jail:	2
`- Jail list:	postfix-sasl, sshd
```
```bash
fail2ban-client status sshd
```
```text:出力例
Status for the jail: sshd
|- Filter
|  |- Currently failed:	0
|  |- Total failed:	0
|  `- Journal matches:	_SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:
```
### 禁止解除
```bash
fail2ban-client set sshd unbanip 192.0.2.1
```

### ipset の確認
```bash
ipset --list
```
```text:出力例
Name: fail2ban-sshd
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536 timeout 3600
Size in memory: 16528
References: 1
Members:

Name: fail2ban-postfix-sasl
Type: hash:ip
Revision: 1
Header: family inet hashsize 1024 maxelem 65536 timeout 604800
Size in memory: 16528
References: 1
Members:
```
[mac]特定のアプリにショートカットを割り当てる方法

# 環境
os: Sierra 10.12.1
MacBook Pro (Retina, 13-inch, Early 2013)

# 特定のアプリにショートカットを割り当てる
macのデフォルトの機能であるAutomaterを使って， Chromeにショートカットキーを割り当てる．

1.Automatorを起動する
2.Automatorで新規ファイルを作成する
<img width="348" alt="Screen Shot 2016-11-27 at 16.29.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/121224/d5352882-200b-a902-b6d5-3878086adec4.png">
3.document type はserviceを選択する
![Screen Shot 2016-11-27 at 16.31.08.png](https://qiita-image-store.s3.amazonaws.com/0/121224/5a87ba9b-cd68-ca15-02dc-d18602b7fcac.png)
4.検索窓で "Launch Application" と検索する
![Screen Shot 2016-11-27 at 16.34.09.png](https://qiita-image-store.s3.amazonaws.com/0/121224/920b636a-9fb9-9767-3382-086847e4bb8b.png)
5."Launch Application" をダブルクリックでファイル作成・編集
下記の画像の赤枠で囲まれている部分を入力
![Screen Shot 2016-11-27 at 16.36.53.png](https://qiita-image-store.s3.amazonaws.com/0/121224/68c7fea8-197b-d706-145d-ad9a2b9d2cb1.png)
6."Launch APP_NAME" で保存
![Screen Shot 2016-11-27 at 16.40.29.png](https://qiita-image-store.s3.amazonaws.com/0/121224/aca17421-2d78-139d-4a69-4156e128455b.png)
7.システム環境設定 > キーボード でショートカットキーを設定
今回は `Shift + Command + c` で設定しています．
<img width="780" alt="Screen Shot 2016-11-27 at 16.42.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/121224/56bf28a2-895b-42b9-8648-9ed5ff6160e8.png">


以上で特定のアプリにショートカットを割り当てることができます．

# ショートカットキーの挙動
アプリが起動されていない場合は， アプリが起動されます．
アプリが起動されている場合は， 最前面でアプリが表示されます．

# 最後に
以前までは， アプリの切り替えに `Command + Tab` をつかっていましたが， 同時に開くアプリが多くなるにつれ， タスクの切り替えが面倒になり困っていました．
よく使うアプリにショートカットを割り当てることで， 以前より効率的にアプリを切り替えることができる様になりました．
ImageMagickでPDFを変換できるようにする。


CarrierWaveとMinimagickを利用して、アップロードしたPDFファイルを画像変換させようとしたところ、次のようなエラーが出る。

```
Failed to manipulate with MiniMagick, maybe it is not an image? Original Error: `identify /var/folders/_l/9yzlbg193032kq9tqz206j4j_d7vyd/T/mini_magick20161127-92446-1sstieq.pdf
` failed with error:
```

調べてみるとminimagickではなく、ImageMagickがPDFに対応できていないことが問題だった。
ここでは、Mac上でPDFをImageMagickが扱えるようにする手順を紹介する。

# 事前確認

インストールしているImageMagickがPDFを扱えないことを確認する。

```
$ idnetify /path/to/sample.pdf
$ echo $?
1  # <= Failed
```

# 手順

## 今のImageMagickをアンインストール

`brew uninstall`でアンインストールします。

```
$ brew uninstall imagemagick
```

これまでインストールしてきた過去のバージョン全てをここでアンインストールする必要はありませんが、きれいにするなら今でしょう。

## GhostScriptをインストール

PDFを扱えるようにするために、ghostscriptをインストールします。

```
$ brew install ghostscript
```

## ImageMagickをソースから再インストール

再インストールしたら完了。

```
$ brew install imagemagick --build-from-source
```

# 確認

`identify`コマンドを使って、PDFファイルの情報が取得できればOK。

```
$ idnetify /path/to/sample.pdf
/path/to/sample.pdf PDF 595x842 595x842+0+0 16-bit sRGB 3.85KB 0.000u 0:00.000
```
Go言語でJSONの生成を構造体無しでJavaScript並に簡単に生成できる方法

こんにちはnasustです。

Go言語 / golangのJSONの生成はJavaScript並に簡単にできます。
JSONの生成の紹介が構造体しか無かったので、mapで簡単に出来ることを解説します。

json.Marshalで与えられる型でmap[string]interface{}を標準でサポートしています。ですので下記のコードのようにJavaScript並に簡単にJSONを生成できます。


```go
package main

import (
	"encoding/json"
	"fmt"
)

type M map[string]interface{}
type A []interface{}

func main() {
	values := M{
		"a": "a",
		"b": func() A {
			return A{1, 2, 3}
		}(),
		"c": A{"va", "vb", "vc"},
		"d": M{
			"dd": 1.1,
			"cc": 2.2,
			"ee": nil,
			"qq": true}}

	bytes, err := json.MarshalIndent(values, "", "    ")
	if err == nil {
		jsonstring := string(bytes)
		fmt.Println(jsonstring)
	} else {
		fmt.Println("Err: ", err)
	}

}
```

結果

```json
{
    "a": "a",
    "b": [
        1,
        2,
        3
    ],
    "c": [
        "va",
        "vb",
        "vc"
    ],
    "d": {
        "cc": 2.2,
        "dd": 1.1,
        "ee": null,
        "qq": true
    }
}
```
SDKMANを使って5分でできるSpringBootのHello World!


## JDKをインストール

```bash
$ brew cask install java
```

## SDKMANをインストール

```bash
$ curl -s "https://get.sdkman.io" | bash
```

http://sdkman.io/index.html

## Spring Bootをインストール

```bash
$ sdk install springboot 1.4.2.RELEASE
$ spring version
Spring CLI v1.4.2.RELEASE
```

## Hello World!
以下のようなコードを書きます。

```hello.groovy
@RestController
class WebApplication {

    @RequestMapping("/")
    String home() {
        "Hello World!"
    }

}
```

早速実行してみます！

```bash
$ spring run hello.groovy
```

```
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.3.0.RELEASE)
```

起動できましたね！
http://localhost:8080
を開いてみましょう。５分でできましたか？（笑)

~~http://docs.spring.io/spring-boot/docs/current/reference/html/cli-using-the-cli.html~~
https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-cli.html#cli-run
PHP7でSplFixedArrayの存在価値はどうなったか

PHP7から、キーが0から始まる連番のarrayについて、内部的には連続したメモリ領域を使う純粋配列となり、パフォーマンスが大幅に向上しました。

[PHP7で変わること ——言語仕様とエンジンの改善ポイント](http://www.slideshare.net/hnw/phpcon-kansai20150530)

一方、SplFixedArrayという、高速・省メモリが売りの固定長の純粋配列クラスがPHP5.3の頃からあります。

[PHP: SplFixedArray - Manual](http://php.net/manual/ja/class.splfixedarray.php)

PHP7になって、SplFixedArrayのarrayに対する強みがどうなったのか、検証してみました。

#検証内容
arrayとSplFixedArrayそれぞれで、100万件のintをセット、ゲット、foreachで回し、速度とメモリ使用量を確かめました。

#前提条件
- 仮想マシン（VMware Player）
- CPU 1コア
- メモリ 1GB
- OS CentOS 7.1
- PHP v7.0.10
- CLIで実行

#検証コード
##array
```php:array.php
$num = 1000000;
$array = [];

$start = microtime(true);
for($i = 0; $i < $num; ++$i) {
    $array[$i] = $i;
}
$addTime = microtime(true) - $start;

$memoryPeakUsage = memory_get_peak_usage(false);
$memoryPeakUsageReal = memory_get_peak_usage(true);

$start = microtime(true);
for($i = 0; $i < $num; ++$i) {
    $array[$i];
}
$getTime = microtime(true) - $start;

$start = microtime(true);
foreach($array as $i) {
    
}
$foreachTime = microtime(true) - $start;
```

##SplFixedArray
```php:SplFixedArray.php
$num = 1000000;
$array = new SplFixedArray($num);

$start = microtime(true);
for($i = 0; $i < $num; ++$i) {
    $array[$i] = $i;
}
$addTime = microtime(true) - $start;

$memoryPeakUsage = memory_get_peak_usage(false);
$memoryPeakUsageReal = memory_get_peak_usage(true);

$start = microtime(true);
for($i = 0; $i < $num; ++$i) {
    $array[$i];
}
$getTime = microtime(true) - $start;

$start = microtime(true);
foreach($array as $i) {
    
}
$foreachTime = microtime(true) - $start;
```

#結果
10回試行し、最大値と最小値を除く8つのデータの平均値で算出。

||array|SplFixedArray|
|:-:|:-:|:-:|
|**データのセット（秒）**|0.043141692876816|0.034425288438797|
|**データのゲット（秒）**|0.02352038025856|0.030383437871933|
|**foreach（秒）**|0.011791378259659|0.029610127210617|
|**メモリ（Byte）**|33912008|16356568|
|**リアルメモリ（Byte）**|35655680|18100224|

#考察
データのセットはSplFixedArrayに、データのゲットはarrayに軍配があがりました。

興味深いのはforeachで、3倍弱ほどarrayが速くなっています。
メモリ上の連続領域に格納されているデータに、シーケンシャルにアクセスするのが速いのはわかりますが、SplFixedArrayはどんなデータ構造なのか。おそらくCで書かれていると思うので、ソースコードを見れば何かわかりそう。

メモリは2倍ほどSplFixedArrayがコストが安いです。これはさすがといったところ。

Readが多いデータはarrayで、Writeも入るデータやメモリに関して制約が厳しい場合はSplFixedArrayで、といったところでしょうか。

ただし、SplFixedArrayはオブジェクト生成のコストも考慮する必要があります。
monitコマンドのチートシート

## [概要]
Monitコマンドの使用方法をまとめます。

## コマンド構文
|記号   |意味                                          |
|------|----------------------------------------------|
|{hoge}|必須パラメーターを囲みます                          |
|[fuga]|オプション・パラメーターを囲みます                     |
|&#124;|2 つ以上の項目を区切り、その内1つだけを選択できることを示す|

ヘルプの確認方法

```bash
$ monit --help
```

## [事前準備]
* CentOS7環境に構築した、Monitを使用
 - [CentOS7にmonitを導入してみる](http://qiita.com/ghfdjk/items/365beaea0cca1bdba580)

## [作業内容]
### バージョン確認方法
```bash
### 大文字のVで確認
$ sudo monit -V
This is Monit version 5.14
Copyright (C) 2001-2015 Tildeslash Ltd. All Rights Reserved.

### または、--version でも可能
$ sudo monit --version
This is Monit version 5.14
Copyright (C) 2001-2015 Tildeslash Ltd. All Rights Reserved.
```


### ステータスの確認
```bash
$ monit status
The Monit daemon 5.14 uptime: 21m

System 'server1'
  status                            Running
  monitoring status                 Monitored
  load average                      [0.00] [0.01] [0.05]
  cpu                               0.0%us 0.0%sy 0.0%wa
  memory usage                      80.7 MB [16.5%]
  swap usage                        1.3 MB [0.1%]
  data collected                    Sun, 27 Nov 2016 07:20:16
```

## [事後確認・作業]
Lazurite Pi Gateway のセットアップ

#はじめに
Raspberry　piで920MHz帯の通信を可能にする「Lazurite Pi Gateway」拡張セットがある。

それのセットアップ方法について
![raspberry.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/ff228a6b-48f9-c708-9a04-207e9d3c4396.jpeg)


#OSのインストール
ドライバーの関係からLazurite専用にセットアップされているOS(Raspbian)をインストールする
使用中のRaspberry Piで使用するには　
[使用中のRaspberry PiでLazurite Pi Gatewayを使えるようにする方法](http://www.lapis-semi.com/lazurite-jp/raspberry-pi%E9%96%A2%E9%80%A3/10083.html)
を参照する

##1.　img(イメージファイル)をダウンロード
　　[Lazurite 関連ファイルダウンロード](http://www.lapis-semi.com/lazurite-jp/download) のページからRaspberry-piのバージョンを確認してダウンロードする。　ZIPファイルが落ちてくるのでそれを展開すると.imgファイルがある。
![ダウンロードページ.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/443f6308-e487-891b-4e1c-52807f4dccb5.jpeg)

##2.SDカードのフォーマット
　　[SDFomatter](https://www.sdcard.org/jp/downloads/formatter_4/) をインストールする。
 パソコンに接続したsdのドライブ名を指定して「オプション設定」より「イレースフォーマット」を選択して「フォーマット」を開始します。
　　![SDFormatter1.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/b7f04c93-797b-9a2b-7d51-e20626629954.jpeg)

##3. imgファイルのインストール
[Win32 Disk Imager](https://ja.osdn.net/projects/sfnet_win32diskimager/) ってソフトが便利なのでこれを使うのがお勧め。


ダウンロードした「160405_rpi2.img」を指定し、sdのドライブ名を指定する。「Write」を選択する。
![win32 disk imager.jpg](https://qiita-image-store.s3.amazonaws.com/0/140159/b890175e-7072-2974-412d-2e9d4b9f3caa.jpeg)

#ラズベリーパイの起動 and 設定
##　ログイン
デフォルトでは
user: pi
pass: raspberry
#設定
以下を実行一番上の「1. Expend Filesystem」を選択する。
```
$ sudo respi-config
```
一番上の「1. Expend Filesystem」を選択する。
その後、以下コマンドで再起動する
```
sudo reboot
```

```
$startx
```
とかでGUIとかに接続できれば設定は終わり

#参考URL
[Lazurite Pi Gateway](http://www.lapis-semi.com/lazurite-jp/products/lazurite-pi-gateway)
Hammerspoon Ctrl-kでkill-line

Karabiner 使えない対策: Hammerspoon で macOS の修飾キーつきホットキーのキーリマップを実現する
http://qiita.com/naoya@github/items/81027083aeb70b309c14#_reference-c4a7d44a9eb135042577

↑の記事を参考にHammerspoonを設定したら、かなり快適になったんだけれど、よく使うCtrl-Kがたりなかったので、なんとかしてみた。
kill-lineするには2つ押す必要がありそうだったので、関数をつくって割り当て。keyCode関数は元記事のまま。

```
local function keyCtrlK()
  keyCode('e', {'shift', 'ctrl'})()
  keyCode('x', {'cmd'})()
end
hs.hotkey.bind({'ctrl'}, 'k', keyCtrlK, nil, keyCtrlK)
```


----

あと記事タイトルと関係ないけどCtrl-m足したり

```
remapKey({'ctrl'}, 'm', keyCode('return'))
```

iTerm2以外にターミナルとEmacsも除外した。

```
if name ~= "iTerm2" and name ~= "ターミナル" and name ~= "Emacs" then
```
MacでC#のHello, World!を出力するまで

# Step

1. Install [.Net Core](https://www.microsoft.com/net/core#macos)
2. Install [VSCode](https://code.visualstudio.com/Download)
3. Install [mono](http://www.mono-project.com/)
4. Create new project
5. Restore project
6. Create C# script
6. Compile C# script
7. Run binary

## Step 1: Install .Net Core

* 公式の通りにやるだけ
* shellを開いていたら再起動する方がいいかもしれない

## Step 2: Install VSCode

* ダウンロードするだけ
* [Microsoft製のC# Extension](https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp)を入れる

## Step 3: Install mono

brew update && brew install mono

## Step 4: Create new project

cd ProjectDirctory && dotnet new

## Step 5: Restore project

dotnet restore

## Step 6: Create C# script

```csharp:cmd.cs
using System;

namespace Example
{
  class Cmd
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Hello, World!");
    }
  }
}
```

## Step 7: Compile C# script

mcs cmd.cs

## Step 8: Run binary

mono cmd.exe

## Complete!

# Appendix

## 複数のファイルをCompileする

```csharp:hello.cs
namespace Example
{
    internal class Hello
    {
        internal string say()
        {
            return "Hello";
        }
    }
}
```

```csharp:world.cs
namespace Example
{
    internal class World
    {
        internal string say()
        {
            return "World";
        }
    }
}
```

```csharp:cmd.cs
using System;

namespace Example
{
  class Cmd
  {
    static void Main(string[] args)
    {
      Hello hello = new Hello();
      World world = new World();

      string h = hello.say();
      string w = world.say();
      var helloWorld = new []{ h, w };
      var msg = string.Join(", ", helloWorld);
      Console.WriteLine(msg);
    }
  }
}
```

mcs -out:cmd.exe -t:exe hello.cs world.cs cmd.cs
mono cmd.exe

Complete!
SymfonyデモアプリをMySqlを使って動かす

本記事は[「CentOS7+nginx+PHP-FPM+PHP7でSymfony3の実行環境構築」](http://qiita.com/hanahiro_aze/items/9bc8e81c0dde9dd677a2)の記事の続きです。

## 本記事の目標
前回作った環境で、MySqlをつかってデモアプリを動かせるようにします。

## Mysql インストール
[こちら](http://yuki10.hatenablog.com/entry/2015/07/10/170948)を参考にさせていただきました。

- 読み替えたところ
 - パスワードは変更。後ほど`app/config/parameters.yml`の`database_password`項目に設定します。

## データベースの準備
`php bin/console doctrine:database:create`すると`symfony`というデータベースが作成されます。

---
###### 以下詳細は[ブログ](http://hanahirodev.hatenablog.com/entry/20161112/1478921042)にも書いてあります。 
---

## Symfonyのデモアプリのデータベース
デモアプリではSQLiteがデフォルトとして使われているので、MySqlを使うように設定を変更します。

まずは`app/config/parameters.yml`。ユーザー名とパスワードは読み替えてください。

```
# 削除
# database_url: 'sqlite:///%kernel.root_dir%/data/blog.sqlite'
# 追加
database_host:     127.0.0.1
database_port:     null
database_name:     symfony
database_user:     your_user_name
database_password: youre_password
```

次に`app/config/config.yml`

```
# Doctrine Configuration (used to access databases and manipulate their information)
doctrine:
    dbal:
        # if you don't want to use SQLite, comment the two following lines
        # ここをコメントアウト
        # driver: "pdo_sqlite"
        # path: "%kernel.root_dir%/data/blog.sqlite"
        # uncomment the following lines to use a database different than SQLite
        # ここから下をコメントイン
         driver:   pdo_mysql
         host:     "%database_host%"
         port:     "%database_port%"
         dbname:   "%database_name%"
         user:     "%database_user%"
         password: "%database_password%"
         charset:  UTF8 
```

ここまで設定したところで、MySqlを使う設定ができました。
自前でデータを用意してるよっていう方は、ブログのページが表示されるはずです。
そうでない人は以下を参考にデータをインポートします。

## SQLiteのダンプからMySqlにデータを移植

[こちら](https://blog.gufii.net/weblog/archives/39)を参考にさせていただきました。
時間がない人は[最終的な形](https://github.com/hanahiroAze/symfony3_demo/blob/master/app/data/target.sql)をそのままMySqlで流してください。

まずはSQLiteに登録されているデータを抜いてきます。

```
$ sqlite3 ./app/data/blog.sqlite 
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .tables
symfony_demo_comment  symfony_demo_post     symfony_demo_user   
sqlite> .output ./dump.txt
sqlite> .dump
sqlite> .output stdout
sqlite>.exit
```

MySqlでそのまま使えない箇所を直します。

- MySqlにCLOB型がないみたいなので、target.sqlのCLOBをTEXTに変更
- NOT DEFERRABLE INITIALLY IMMEDIATEの指定がMySQLだと効かないみたいなので、この部分を削除して、SET FOREIGN_KEY_CHECKS=0;を追加。

修正したデータを流し込み。
 `mysql -uroot symfony < target.sql`

これで無事動きました。
spark-assembly-*.jarがspark 2.0で廃止されたが、spark 2.0でも以前と同様にspark自身の配信をyarnを通して行う方法

http://stackoverflow.com/questions/39932677/apache-spark-2-0-1-and-spring-integration/39936379#39936379

1.6の時に存在した spark-assembly-1.6.2-hadoop2.6.0.jar のような事前に準備されたuber jarは廃止された模様。
また、spark.yarn.jar パラメータも廃止された模様

その代わり、以下の設定を行う

- ```spark.yarn.archive``` に jarが含まれているhdfsのパスを記述する
- または、```spark.yarn.jars``` に jar ファイルのリストを記述する
 
優先順位としては 
1. ```spark.yarn.archive``` 
2. ```spark.yarn.jars```
の順序であり
上記のいずれも設定されていない場合は $SPARK_HOME/jars 内のファイルをzip化して勝手にhdfs上にアップロードして配信してくれる。
但し、毎回アップロードが走るため少し無駄が多い。
あらかじめ、事前にhdfs上にアップロードしておくことができればこの無駄な時間を削減できるが、それを行うのが ```spark.yarn.archive``` や ```spark.yarn.jars``` であると言える。

例えば ```hdfs:///spark``` にsparkのjarをアップロードする場合。

##### 事前準備
``` 
# spark jarのアップロード
$hdfs dfs -put $SPARK_HOME/jars /spark

# アップロードされていることの確認
$hdfs dfs -ls /spark
```

##### 方法１ ```spark.yarn.archive``` に jarのパスを書く

``` $SPARK_HOME/conf/spark-defaults.conf
spark.yarn.archive hdfs:///spark 
```

##### 方法２ ```spark.yarn.jars``` に jarファイルのリストを記述する
```$SPARK_HOME/conf/spark-defaults.conf
spark.yarn.jars hdfs:///spark/*
```

動作確認（SparkPi）
```
$SPARK_HOME/bin/spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master yarn \
    --deploy-mode cluster \
    $SPARK_HOME/examples/jars/spark-examples*.jar \
    10
```
import pathから物理的なfile pathを調べる方法のメモ

## はじめに

ASTをparseしている最中にimport pathから物理的なfile pathを調べたくなることがあった。
結構簡単に調べられるのでメモ

## GOROOTとGOPATHが分かれば良い

GOROOTとGOPATHが分かれば良さそう。基本的には`(GOPATH|GOROOT)/src/<import path>`が物理的なfile path。

### GOROOT

GOROOTはruntimeにある。

```
$ gore
gore version 0.2.6  :help for help
gore> :import runtime
gore> runtime.GOROOT()
"/opt/local/lib/go"
```
### GOPATH

GOPATHは環境変数を見れば良い。

```
$ gore
gore version 0.2.6  :help for help
gore> :import os
gore> os.Getenv("GOPATH")
"/Users/podhmo/sandbox/go"
```

## 合っているか確認

```
$ go env | grep -P "GOPATH|GOROOT"
GOPATH="/Users/podhmo/sandbox/go"
GOROOT="/opt/local/lib/go"
```
運用でよく使うperlテクニック

# はじめに

運用でログを調査したりデータを整形したりするときに使うperlのtipsです。

# ワンライナーTSVを扱う

```
perl -F'\t' -nale 'print "$F[0]\t$F[1]"' input.tsv
```

# tsvからsqlファイルを生成する

```pl:create_sql.pl
#!/usr/bin/perl

while(<>) {
    chomp;
    @c=split /\t/;
    print <<"EOS"
select val_1
||chr(9)||val_2
from table_a
where col_a=$c[1]
and col_b=$c[2]
/
EOS
}
```

コマンド実行例

```shell-session
# ./create_sql.pl input.tsv > output.sql
```

# ２つのファイルを結合する

```pl:merge.pl
#!/usr/bin/perl

# 第２引数のファイルをハッシュに詰める
%hash;
open(IN,"$ARGV[1]"); 
while(<IN>) {
    chomp;
    @c=split /\t/;
    $key=$c[0]."_".$c[1]; # キーとなる列をアンスコでつなげてハッシュに入れる
    $hash{$key}=$_;
}
close(IN);

# 第１引数のファイルを第2引数のファイル内容を詰めたハッシュと突合して出力
open(IN2,"$ARGV[0]");
while(<IN2>) {
    chomp;
    @c=split /\t/;
    $key=$c[3]."_".$c[5]; # キーとなる列をアンスコでつなげてハッシュに入れる
    print $_;
    if (exists($hash{$key})){
        print "\t";
        print $hash{$key};
    }
    print "\n";
}
close(IN2);
```
SQL*Plusでログイン時に自動的に環境を設定する

# login.sql
sqlplus実行ディレクトリにlogin.sqlがあると、sqlplusのログイン時に設定したSQLを自動的に実行してくれる。
以下のようにデフォルトで設定して欲しい内容を書いておくと便利。

```
SET LINE 150 
SET PAGES 1000
SET TIME ON
SET TIMING ON
SET SQLPROMPT "&_USER.@&_CONNECT_IDENTIFIER> "
DEFINE_EDITOR=vi
ALTER SESSION SET NLS_DATE_FORMAT='YYYYMMDD HH24:MI:SS';
```

# その他

.bashrcなどに`SQL_PATH`を設定しておくと、その場所のlogin.sqlが利用されるので便利

```
SQL_PATH=~/sql
```

# 参考

[NLS_LANG、ORACLE_HOME、ORACLE_SID などの設定](http://www.shift-the-oracle.com/config/oracle-environment-variable.html#SQL_PATH)
Chromium をビルドしてみた。

#### 概要
* ブラウザというアプリがどんな作りになっているのか勉強したかったのでビルドしてみました。
* 公式にビルドドキュメントがありますが、ハマりどころが多かったのでこれから挑戦してみたい人の助けになれば幸いです。
* 全ての手順を書いてはいません、公式ドキュメントの補足的扱いとなります。

#### 環境
* ホストOS：Windows10
* ゲストOS：Ubuntu
* 仮装アプリ：VirtualBox

##### VirtualBoxの設定
* とにかくソースコードがデカイのとビルド中にメモリを大量消費するので、  
ストレージ64G/メモリ4G 位は割り振っておくと良いでしょう。
* ビルド後のディスク使用量が31Gにもなっていました。

##### Ubuntu
* ビルドするOSの選定ですが、install-build-deps.sh の中にあるように Ubuntu しかダメそうです。。。
* Ubuntu でも縛りがありますが、最新を使っていれば大丈夫でしょう。

```bash:install-build-deps.sh
  if [[ ! $lsb_release =~ $ubuntu_codenames ]]; then
    echo "ERROR: Only Ubuntu 12.04 (precise), 14.04 (trusty), " \
      "14.10 (utopic), 15.04 (vivid), 15.10 (wily) and 16.04 (xenial) " \
      "are currently supported" >&2
    exit 1
  fi
```

#### ソースコードの入手
* ソースコードの入手には公式ツールの depot_tools を利用します。
 * [depot_tools(公式Tutorial)](https://commondatastorage.googleapis.com/chrome-infra-docs/flat/depot_tools/docs/html/depot_tools_tutorial.html)
* ここはチュートリアル通りに、git clone してきてパスを通して fetch android するだけです。
* ダウンロード時間は環境によってまちまちで30分で終わるって書いている人もいましたが、  
私は2～3時間かかりました… (；´Д｀)
* 出かける前や、寝る前に走らせるといいでしょう、ただ、コンソールに何も出ないのでリトライ処理が動いているとも知らず  
ずっと待ってしまうこともあるので注意。

#### ビルド
* [Build Instructions(Android)](https://www.chromium.org/developers/how-tos/android-build-instructions)
* 上の章で Get the code までは終わっているので、設定ファイルの作成についてです。
* ```gn args out/Default``` で以下のように記述しました。

```text
target_os = "android"
target_cpu = "x86"

# Build arguments go here. Examples:
is_component_build = true
is_debug = true
is_clang = true
# See "gn args <out_dir> --list" for available build arguments.
symbol_level = 1
enable_incremental_javac = true
```

* target_cup の設定を間違えると、せっかくビルドしたのに、アプリがクラッシュします。
* ninja というコマンドを利用してビルドするのですが、フルブラウザの場合は chrome_public_apk オプションを利用します。

```bash
$ ninja -C out/Default chrome_public_apk
// １時間以上待つ
$ ls out/Default/apks/
ChromePublic.apk
// できあがり！
```

#### 最後に
* ダウンロードやビルドなどかなり時間を使うのに、  
OSが異なったり設定を間違えてまたやり直しなどを何度も繰り返しました…　(´・ω・｀)  
この資料でそのような被害が少しでも減るとうれしいです。
* 次はレイアウトをいじるのに Android Studio 対応したいなーなんて思ってます。


それでは　ノシ
運用者が困る例外処理の書き方

#はじめに
　運用者はシステムでエラーが発生した際に、プログラムから出力されたログを見て原因の特定作業を行います。このとき重要となるのが例外処理です。適切な例外処理が行われていれば、原因の特定が容易になります。
　ここでは、こんなことをされたら運用者が困るという例を見ていきます。使用している言語はC#です。

#1. 例外のメッセージを見ても何もわからない

```csharp:悪い例
if(name == null)
{
    throw new Exception("例外が発生しました。");
}
```
```csharp:良い例
if(name == null)
{
    throw new Exception("パラメータ:nameがnullです。");
}
```
　例外メッセージはエラーの内容を表す重要な情報です。どのような問題が発生したかがひと目で分かるような情報を記述しましょう。「例外が発生しました。」「処理エラー」「Fatal」といったメッセージではどのような例外が発生したを知ることはできません。
　「良い例」では手書きでメッセージを記述していますが、```throw new ArgumentNullException("name");```と書いても同じようなメッセージが出力されます。出力されるメッセージのフォーマットが整っていると、ログが把握しやすくなる場合があります。

#2. 例外が握りつぶされている

```csharp:悪い例
try
{
    // 何らかの処理
}
catch (Exception ex)
{
}
```
```csharp:良い例
try
{
    // 何らかの処理
}
catch (Exception ex)
{
    logger.Error(ex.Message);
    logger.Error(ex.StackTrace);
}
```

　「悪い例」では発生した例外に対して処理を何も行っていません。本来は例外内容のログを残すか、上位層に例外を再スローしログ処理を任せるかの、どちらかの処理を行わなければいけません。ログがなければどのようなエラーが起きたのか分かりません、ログは必ず残してください。


```csharp:悪い例
try
{
    // 何らかの処理
}
catch (Exception ex)
{
    throw ex;
}
```
```csharp:良い例
try
{
    // 何らかの処理
}
catch (Exception ex)
{
    throw;
}
```
　「悪い例」は一見問題なさそうに見えますが、この処理ではキャッチした例外のStackTraceが消えてしまうという問題点があります（C#の仕様です）。StackTraceが消えてしまうと例外がどこで発生したのかが分かりません。「良い例」のようにthrow;と書くとStackTraceを消さずに再スローすることができます。


##Catch句の外で再スローする場合 2017.1.14追記
```csharp:悪い例
Exception exStack == null;
try
{
    // 何らかの処理
}
catch (Exception ex)
{
  exStack = ex;
}

throw exStack;
```

```csharp:良い例
Exception exStack = new Exception();
try
{
    // 何らかの処理
}
catch (Exception ex)
{
    exStack = ex;
}

ExceptionDispatchInfo.Capture(exStack).Throw();
```
　"throw;"の記述はCatch句でしか行なえません。Catch句外で例外を再スローするとスタックトレースが消えます。.NetFrameWork4.5以降ではExceptionDispatchInfoクラスを上記のように利用することでスタックトレースを保持したまま例外の再スローが行えます。

#3. キャッチする必要のない例外もキャッチしている
```csharp:悪い例
public void CopyFile()
{
    try
    {
        File.Copy(".\a.txt", ".\b.txt");
    }
    catch (Exception ex)
    {
        // 例外時の処理
    }
}
```
　catch (Exception ex)はすべての例外をキャッチします。そのため本来はシステムを止めなければいけない例外が発生した場合でも、処理が続行されることとなり、リカバリが難しい状況におちいることがあります。

```csharp:良い例1
public void CopyFile()
{
    try
    {
        File.Copy(".\a.txt", ".\b.txt");
    }
    catch (Exception ex)
    {
        // 例外時の処理
        thorw;
    }
}
```

　改善方法の一つとして、例外を再スローする方法があります。より上位のCatch句に例外処理をゆだねることで、エラーが出たまま処理が続行されることを防ぎます。

```csharp:良い例2
public void CopyFile()
{
    try
    {
        File.Copy(".\a.txt", ".\b.txt");
    }
    catch (NotSupportedException ex)
    {
        // 例外時の処理
    }
}
```

　他の方法として、特定の例外しかキャッチしないという手があります。こうすることで、続行不能な例外は上位のCatch句で処理されます。

#4. catch句およびfinally句で例外を上書きしている

```csharp:悪い例
public void OpenNotepad()
{
    Process process;

    try
    {
        process = Process.Start("notepad.exe");
    }
    catch (Exception ex)
    {
        process.Kill(); // 例外が発生する可能性のあるメソッド
        throw;
    }
}
```

　例では例外が発生するメソッドがcatch句に書かれています。ここでprocess.Kill()において例外が発生した場合、try句で発生した例外が上書きされ、本来の例外発生原因が上位の例外処理部分にうまく伝わりません。
　基本的に例外が発生する可能性のあるメソッドはcatch句、finally句に記述してはいけません。



#おわりに
　catch句は本当に必要な箇所以外には書かないようにしましょう。
　運用時に負担にならないよう気をつけましょう。
初老丸のきゃぴきゃぴ Capistrano3 メモ（EC2 Name タグで操作対象を絞り込んでコマンド操作してみる）

[こちら](http://inokara.hateblo.jp/entry/2016/11/27/150817)より転載。

## きゃぴきゃぴ

してますか。

Capistrano はバージョン 2 の時代に少し触ったことがあったんですが、改めて Capistrano 3 を用いて EC2 Name タグで操作対象を絞り込んでコマンド操作してみたいと思います。

## 参考

- http://capistranorb.com/documentation/getting-started/configuration/#
- https://labs.gree.jp/blog/2013/12/10084/

## メモ

### やりたいこと

- EC2 タグ名から IP アドレスを取得してきて、何らかのコマンドを流し込む

### 準備

```sh
bash-3.2$ cat Gemfile
# A sample Gemfile
source "https://rubygems.org"

# gem "rails"

gem 'capistrano'
gem 'aws-sdk'
```

`bundle install` しましょう。

```sh
bundle install --path vendor/bundle
```

### ファイル達

```sh
bash-3.2$ tree -L 3
.
├── Capfile
├── Gemfile
├── Gemfile.lock
├── config
│   ├── deploy
│   │   ├── dev.rb
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
├── lib
│   └── capistrano
│       └── tasks
├── log
│   └── capistrano.log
└── vendor
    └── bundle
        └── ruby
```

### config/deploy.rb

グローバルな設定は config/deploy.rb に書きましょう。

```ruby
require 'aws-sdk'

set :aws_region, 'ap-northeast-1'
set :aws_profile, 'your_profile'

def ec2
  Aws::EC2::Client.new(
    region: fetch(:aws_region),
    profile: fetch(:aws_profile)
  )
end

def get_ec2_instances(name)
  hosts = []
  ec2.describe_instances(
    filters:[
      { name: "tag:Name", values: [name]},
      { name: "instance-state-name", values: ["running"]}
    ]).reservations.each do |reservation|
    reservation.instances.each do |instance|
      hosts << instance.public_ip_address
    end
  end
  return hosts
end

# run_locally で echo "demo" を実行する
# :app Role を対象として pwd と uptime を実行する
namespace :demo do
  desc 'uptime を実行'
  task :uptime do
    run_locally do
      execute 'echo "demo"'
    end
    on roles(:app) do
      execute 'pwd'
      execute 'uptime'
    end
  end
end
```

`set :foo` で定義した値は `fetch :foo` で取得出来る。

### config/deploy/dev.rb

環境毎の設定は config/deploy/*.rb に記載しましょう。

```ruby
# インスタンス Name タグに dev- が含まれているインスタンスの Public IP を取得する
hosts = get_ec2_instances('dev-*')
role :app, hosts

set :ssh_options, {
  user: %w(user),
  keys: %w(/Path/to/key.pem)
}
```

### 実行

- タスクを確認

```sh
bash-3.2$ bundle exec cap dev -T | grep demo
cap demo:uptime                    # uptime を実行
```

- タスクを実行

```sh
bash-3.2$ bundle exec cap dev demo:uptime
00:00 demo:uptime
      01 echo "demo"
      01 demo
    ✔ 01 kawahara@localhost 0.013s
      02 pwd
      02 /home/ssh_user
    ✔ 02 ssh_user@xx.xxx.xx.xx1 0.736s
      03 uptime
      02 /home/ssh_user
    ✔ 02 ssh_user@xx.xxx.xx.xx2 0.775s
      03  14:54:24 up 27 min,  0 users,  load average: 0.00, 0.00, 0.00
    ✔ 03 ssh_user@xx.xxx.xx.xx1 0.612s
      03  14:54:24 up 27 min,  0 users,  load average: 0.00, 0.01, 0.04
    ✔ 03 ssh_user@xx.xxx.xx.xx2 0.688s
```

## 以上

メモでした。
macOSのSierraではDocker Toolboxのインストールが出来ない

[これ](https://off.tokyo/blog/docker-toolbox%e3%81%ae%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%8c%e5%87%ba%e6%9d%a5%e3%81%aa%e3%81%84%e3%82%93%e3%81%a7%e3%81%99%e3%81%8c-macos%e3%81%aesierra/)でいけた
ローカルのdubプロジェクトに依存するdubプロジェクト

自作のライブラリを別のdubプロジェクトにしたかったので調べたけどすぐには見つからなかったので書く。わかれば簡単なことだった。タイトルはこれで適切なんだろうか?

```console
$ tree
.
├── app
│   ├── dub.json
│   └── source
│       └── app.d
└── lib
    ├── dub.json
    └── source
        └── lib.d
```

```d:lib/source/lib.d
module lib;

import std.stdio;

void func()
{
    writeln("hello!");
}
```

```d:app/source/app.d
import lib;

void main()
{
    func();//モジュールlibの関数
}
```

```json:lib/dub.json
{
    "name": "lib",
    "targetType":"library"
}
```

```json:app/dub.json
{
    "name": "app",
    "dependencies":{
        "lib": "*"
    }
}
```

このままではlibが見つからないので実行できない。

```console
$ dub run
Selected package lib ~master doesn't exist. Using latest matching version instead.
Root package app references unknown package lib
```

`dub add-local <プロジェクトのディレクトリのパス>` してやるとパッケージのリストに追加される。このプロジェクトにだけ……みたいなことは~~できないのかな?~~できる。下に追記

```console
$ dub add-local lib
Registered package: lib (version: ~master)
$ cd app && dub run
Performing "debug" build using dmd for x86_64.
lib ~master: building configuration "library"...
app ~master: building configuration "application"...
Linking...
Running ./app 
hello!
```

---

[コメントをもらった](http://qiita.com/kotet/items/4ef5039d17c521ec5dc7#comment-0ee42a51bbeae9ecc2aa)ので追記。dependenciesで指定してやる方法もある。

```json:app/dub.json
{
    "name": "app",
    "dependencies": {
        "lib": {
            "path": "../lib/"
        }
    }
}
````
最小限の設定でJupyterとSparkをMacで動かす方法

SparkをiPython Notebook(Jupyter)で動作させます。過去にいくつも同じテーマで投稿がありましたが、この方法が一番簡単だと思っています。

#環境
* macOS Sierra
* Apache-Spark 2.0.1 (homebrewでインストールしたもの)
* Python 2.7.10 (virtualenv)



# Sparkのインストール
Homebrewのapache-sparkをインストールするのが簡単。Homebrewのインストールは略

```bash
brew install apache-spark
```

# Pythonのインストール
Pythonはvirtualenvで専用の環境を作ります。名前はsparkにしました。

```bash
mkvirtualenv spark
```

必要なモジュールをインストール。numpyはpandasインストール時に同時に入ります。scipyは必要に応じて追加しましょう。

```bash
pip install jupyter pandas matplotlib
```

# 実行
`PYSPARK_DRIVER_PYTHON`と`PYSPARK_DRIVER_PYTHON_OPTS`を指定してpysparkを実行します。

```bash
PYSPARK_DRIVER_PYTHON=ipython PYSPARK_DRIVER_PYTHON_OPTS=notebook pyspark  --master local[*]
```

実行例

<img width="753" alt="Screen Shot 2016-11-26 at 10.30.34 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/13775/967be9b0-010a-cf42-8baf-58eed8271173.png">
c++ builder > TDateTime > SecondsBetween() > 秒未満の切捨てに注意をする

```txt:動作環境
C++ Builder XE4
```

SecondsBetween()を使うインターバル動作を実装中に、本来意図しない時間にもインターバルタイミングとして識別されてしまっていた。

http://docwiki.embarcadero.com/Libraries/Seattle/ja/System.DateUtils.SecondsBetween
> SecondsBetween を呼び出すと、2 つの TDateTime 値の差分を秒数で取得できます。SecondsBetween は、完全な秒だけをカウントします。このため、SecondsBetween は、9:00:00 A.M. と 9:00:00:999 A.M. の間の差を 0 としてレポートします。

9.9秒経過した時点でもSecondsBetween()では「9秒経過」したことになる。

秒未満の切捨てを考慮した実装でないと失敗する。
OpenShift Origin を Proxy 配下で使うときのハマりポイント

OpenShift Origin を Proxy 配下に構築したときにドハマリしたので、ハマりポイントをメモ。

## 前提条件

oc version 1.3.1 を使用し、oc cluster up で起動させる想定です。
Vagrant を使う場合とかは知らない。
ホスト OS は CentOS 7 です。

## Docker の proxy 設定

/etc/systemd/system/docker.service.d/http-proxy.conf ファイルを作ります。

```
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:3128" "HTTPS_PROXY=http://proxy.example.com:3128" "NO_PROXY=localhost,127.0.0.1,xip.io"
```
記述方法は Docker のドキュメントを見ればいいのですが、一点注意。
**NO_PROXY には CIDR 形式でアドレスを記述できません**。例えば 10.0.0.0/8 はダメです。
個別に IP アドレスがドメイン名/ホスト名を列挙しなければなりません。

## oc cluster up 

oc cluster up を実行する際に、-e オプションを使って環境変数を指定する必要があります。

```bash
oc cluster up \
  -e HTTP_PROXY=http://proxy.example.com:3128 \
  -e HTTPS_PROXY=http://proxy.example.com:3128 \
  -e '"NO_PROXY=localhost,xip.io,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"'
```

NO_PROXY を設定しないと OpenShift ノード間の REST API 呼び出しが全部 Proxy に行ってしまうので、ちゃんと設定してあげる必要があります。

ここで注意しないといけないのは、**-e オプションにカンマ込の文字列を渡してしまうとそこから後が切られてしまう(捨てられてしまう)**ということです。このため、NO_PROXY を指定する場合は '""' で引数全体を囲んでやらなければなりません。
これは [Issue 9565](https://github.com/openshift/origin/issues/9565) あたりを参照。
【Tips】MovableTypeでブログのカテゴリページに他ブログの記事Tag名に条件が一致した記事を出力する方法


Qiita50投稿目になります。

前回、投稿した[【Tips】MovableTypeでブログ記事のmt:EntryTagsが他のブログのカテゴリと紐付ける方法](http://qiita.com/redamoon/items/8b8ede0492f6efdaf79d)の逆バージョンという形になります。

* ブログのカテゴリページで出力
* 他ブログで設置したTag名を取得しカテゴリ名と一致した記事を出力させる
* 処理が重たいのmt:loopで展開させる

``` html
// カテゴリテンプレート
<mt:CategoryLabel setvar="this_category" />  // カテゴリを取得する
<mt:Blogs blog_ids="対象となるブログIDを入力" ignore_archive_context="1">
<mt:Tags>
<mt:TagName setvar="tag_name" />  // 対象ブログのタグを変数に格納
<mt:If name="this_category" eq="$tag_name">
<mt:Entries lastn="0">  // 対象の記事情報をmt:EntriesでSetHashVarへ格納
  <mt:SetHashVar name="entry">
    <mt:EntryTitle setvar="title" />
    <mt:EntryPermalink regex_replace='$regex_replace',"/" setvar="entry_link" />
    <mt:EntryDate format="$dateformat" setvar="entry_date" />
    <mt:CategoryLabel setvar="category_label" />
    <mt:CategoryArchiveLink regex_replace='$regex_replace',"/" setvar="category_link" />
  </mt:SetHashVar>
  <mt:Var name="push(entries)" value="$entry" />
</mt:Entries>
</mt:If>
</mt:Tags>
</mt:Blogs>
<mt:loop var="entries">  // SetHashVarをloopでHTMLへ展開する
  <mt:If name="__first__">  // ループの最初の処理
  <div class="entries-wrap">
  <h1>このカテゴリに関連する記事はこちら</h1>
  </mt:If>
  <div class="entries-box">
    <a href="<mt:Var name="entry_link" />">
      <h2 class="entries-box__title"><mt:Var name="title" /></h2>
    </a>
    <div class="entries-box__list">
      <p class="entries-box__date"><mt:Var name="entry_date" /></p>
      <p class="entries-box__category">
        <a class="entries-box__category_link" href="<mt:Var name="category_link" />">
          <mt:Var name="category_label" />
        </a>
      </p>
    </div>
  </div>
  <mt:If name="__last__">  // ループの最後の処理
  </div>
  </mt:If>
</mt:loop>
```

この方法は他のブログの情報を引っ張るためカテゴリアーカイブの再構築が重たくなりますが、このような方法でカテゴリ名に関する他ブログの記事Tagと一致させて一覧を取得するができます。
div内をtextareaやinputみたいに編集可能エリアにする

Mediumみたいな直感的なブログエディターを作りたいなーと思って、できればtextareaやinputを使いたくないなと思っていたら、HTMLで<code>contenteditable</code>という属性があることがわかった。

こんな感じで使用する。

```html
<div contenteditable="true">
<p>ここのテキストが編集・削除できるようになります</p>
</div>
```

おー、これちょっと感動。

あとはフォーカスなどCSSで消したり付け加えたりすればいい感じになりますね。
inputとかtextareaっていかにも編集できますよ！って感じがなんかスマートじゃないなーなんて思って、
もっと紙に字を書くみたいにサラサラって書けないのかなって模索していました。

お問合わせフォームとかはUI的にフォーカスされて、いかにも入力できますのほうが、
ベストなのはわかりますが、ブログとか毎日使うようなものはサラッといきたいですね。
ダウンロードするEclipseを間違えた？

解説サイトの通りにC言語書いたらなんか雲行きがあやしい　http://qiita.com/sibou/items/4b7c8a5480d07720a5a2
を書いた者です。

解説サイト　http://c-lang.sevendays-study.com/development2.html
に「Eclipse 3.7 Indigo Pleiades All in One」をダウンロードするとです、と
書いてあったのでそのままダウソロードしたんですが、

あくまでも仮説ですけど、Eclipse 3.7 Indigoじゃダメだったのではないでしょうか？
WinGW、XAMPPのバージョンが古すぎ・・・？な感じがしたのです。
![Pleiades.JPG](https://qiita-image-store.s3.amazonaws.com/0/151325/b729f38e-e67c-a851-25fd-bafca2131052.jpeg)
（↑　2016/11/27　14:03　現在のEclipse）　http://mergedoc.osdn.jp/

私のPCのスペックは　

OS：Microsoft Windows 7 Professional　(32びっと）
CPU：Intel(R) Core(TM)  2.70GHz
物理メモリ          4096MB RAM
ハードディスク全容量      284 [GB]で、空き容量は半分くらい

そんなPCにUltimateのEclipse入れんなよ、と突っ込み来そうですが問題なく動いてました
C言語だけでなくPHPとMySQLもやる気あるのでUltimateのほうが良さげな感じです
（C言語の学習は結構急ぎでやらないといけませんが）
IndigoなEclipseを入れた私は正しかったのでしょうか？

ちなみに将来的にはLinuxに手を出すつもりなのでvisual studioに走るのは気が進みません