OmniAICreator/Qiita-1.07M huggingface dataset:
Slim(PHP Framework)事始め

# あらまし
ここ最近、配属先で[Slim](http://www.slimframework.com)を使っているけど、かなり特殊で複雑な使い方をしているので、slimな使い方を調べてみました。

ちなみに、slimという名前は一般的な名前な為か、GAE用のフレームワークだとかテンプレートエンジンにも同じ名前のものがあるようです。

## 導入
[Slim](http://www.slimframework.com)を見ると

```php
<?php
use \Psr\Http\Message\ServerRequestInterface as Request;
use \Psr\Http\Message\ResponseInterface as Response;

require 'vendor/autoload.php';

$app = new \Slim\App;
$app->get('/hello/{name}', function (Request $request, Response $response) {
    $name = $request->getAttribute('name');
    $response->getBody()->write("Hello, $name");

    return $response;
});
$app->run();
```

というように書いてありますが、もう少し下の

```shell-session
$ php composer.phar create-project slim/slim-skeleton [my-app-name]
```

から始めるとよさそうです。
ちなみに、これで始めた場合のディレクトリ構成は

```shell-session
$ tree -L 2
.
├── CONTRIBUTING.md
├── README.md
├── composer.json
├── composer.lock
├── logs
├── phpunit.xml
├── public
│   └── index.php
├── src
│   ├── dependencies.php
│   ├── middleware.php
│   ├── routes.php
│   └── settings.php
├── templates
│   └── index.phtml
├── tests
│   └── Functional
└── vendor
    ├── autoload.php
    ├── bin
〜以下、ライブラリ
```
というような感じになります。

後は、以下書いてあるとおり、

```shell-session
$ php -S 0.0.0.0:8080 -t public public/index.php
```
で、webサーバが立ち上がるので、このまま開発も出来ます。

### ディレクトリ構成
composer.jsonの内容はこんな感じ

```json:composer.json
{
    "name": "slim/slim-skeleton",
    "description": "A Slim Framework skeleton application for rapid development",
    "keywords": ["microframework", "rest", "router", "psr7"],
    "homepage": "http://github.com/slimphp/Slim-Skeleton",
    "license": "MIT",
    "authors": [
        {
            "name": "Josh Lockhart",
            "email": "info@joshlockhart.com",
            "homepage": "http://www.joshlockhart.com/"
        }
    ],
    "require": {
        "php": ">=5.5.0",
        "slim/slim": "^3.1",
        "slim/php-view": "^2.0",
        "monolog/monolog": "^1.17"
    },
    "require-dev": {
        "phpunit/phpunit": ">=4.8 < 6.0"
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
	"scripts": {
        "start": "php -S 0.0.0.0:8080 -t public public/index.php",
        "test": "phpunit"
	}
}
```
見ての通りphpunitが導入してあるので、

```shell-session
$ php composer.phar test
```
で、初期のルーティングのテストも出来ます。
もっとも、このままだと自前のクラスなどが使えないので、こんな感じに付け加えておくといいのではないでしょうか？

```json:composer.json
    "autoload": {
        "psr-4": {
            "Achme\\": "src/achme/classes"
        }
    },
```
ちなみに、Achmeというのは、（諸説あるらしいですが）ある映画に出てくる会社の名前のようです。
恐らく、ドメイン名のexample.comと同じ意味合いで使用されているのではないでしょうか？
もっとも、FuelPHPなど他のフレームワークなどではAppを使用しているので、Appとするのが一般的かもしれません。

### PHPMDの導入

```shell-session
$ php composer.phar require --dev phpmd/phpmd
```
こうしておくと、[PHPMD](http://qiita.com/yuji0602/items/28b0c2363bae8fce055a)の導入が出来ます。

```json:composer.json
	"scripts": {
        "start": "php -S 0.0.0.0:8080 -t public public/index.php",
        "test": "phpunit",
        "phpmd": "phpmd src/ text cleancode,codesize,controversial,design,naming,unusedcode"
	}
```
まだ自分でルールセットを作るような事は出来ていませんが、プロジェクトでルールセットを導入しておくと開発がスムーズに進めそうです。
Skype for BusinessのSIPアドレス追加方法と、ユーザの追加方法

仕事で必要になったので、自宅PCを鞭打って検証してみた。

# 検証の目的とゴール
- Skype for Businessにサインインするにあたり、標準のドメインを使ったFQDNでログインするのではなく、任意のドメインを使ったSIP FQDNでSkype for Businessにサインイン出来るかを確認する。

# 検証環境構成
## 物理環境
- Macbook Pro 13" 2012mid w/ Memory 16GB
- macOS Sierra
- Virtual Box 5.1.6 r110634 (Qt5.5.1)

## 仮想環境
### Active Directory Domain Service

- 2 Cores, 2GB Memory, 20GB Storage
- Windows Server 2016 Technical Preview Trial Ed.
- ドメイン名：kensho.local
- FQDN: ad.kensho.local
- 10.0.2.15

### Skype for Business Server

- 2 Cores, 4GB Memory, 200GB Storage
- Windows Server 2016 Technical Preview Trial Ed.
- Skype for Business 2015 Trial Ed.
- FQDN: sfb.kensho.local
- Pool FQDN: kensho.local
- 10.0.2.16

# 前提条件

- Active Directory Domein Service(ドメイン名はKENSHOなど)が構成されており、Users配下に"Hoshi Shin'ichi"というユーザが存在していること
- Skype for Businessの各サービスが起動していること

# やること

- 新規SIPドメインの追加
- ユーザの有効化。この時にSIPアドレスを指定する

``` Powershell
# 新規SIPドメイン追加(ここでは例としてtestmail.local)
New-CsSipDomain -Identity testmail.local

Identity       Name           IsDefault
--------       ----           ---------
testmail.local testmail.local     False

# Active Directoryからユーザ情報を転送
Enable-CsUser -Identity "Hoshi Shin'ichi" -RegistrarPool "sfb.kensho.local" -SipAddress "sip:shin.hoshi@testmail.local"
```

# 接続方法

- サインインアドレス: SIPアドレス(shin.hoshi@testmail.local)
- 接続先: 手動構成(sfb.kensho.local)

入力できたらサインインボタンを押す。

![VirtualBox_ad_16_10_2016_11_22_21.png](https://qiita-image-store.s3.amazonaws.com/0/30707/de6d5886-ff59-462d-f8c2-1f498ddb3fde.png "VirtualBox_ad_16_10_2016_11_22_21.png")

すると、さらに認証情報を聞いてくるので入力する。

- ユーザ名: ADのユーザ名 (KENSHO¥shin.hoshi)
- パスワード: ADのパスワード

![VirtualBox_ad_16_10_2016_11_47_07.png](https://qiita-image-store.s3.amazonaws.com/0/30707/827a68de-7e18-de8d-676c-b137f03ba352.png "VirtualBox_ad_16_10_2016_11_47_07.png")


SIPアドレスとADの情報は別なので、初回サインインの時だけは3つも情報を入れなければならないが、サインイン後はSIPアドレスベースでのやりとりができるようになる(ユーザ検索等)。
【今更】アイテムの正規表現とかトリガーのstrやregexpについて

■Zabbixの文字列解析について

Zabbixのアイテムのキーの文字列解析やstrやregexpの引数の文字列解析ですが、Zabbix独自の文字列解析が行われています。

文字列解析はマニュアルの「1 アイテムキー」の「キーのパラメータ」で書いてある通り、下記の3つがあります。
+ 引用符付き文字列
+ 引用符なし文字列
+ 配列

下記はZabbix2.2マニュアルのリンク
[1 アイテムキー](https://www.zabbix.com/documentation/2.2/jp/manual/config/items/item/key)

配列時はカンマ(,)が区切り文字として使用されるので、下記のキーの場合、file～<output>がパラメータ配列と解析されます。

```
log[file,<regexp>,<encoding>,<maxlines>,<mode>,<output>]
```

個々のパラメータはダブルクォーテーション(")で括られている時は「引用符付き文字列」、それ以外は「引用符なし文字列」として解析されます。

注意が必要なのはシングルクォーテーション(')は引用符として解析されないという点です。

また、「引用符なし文字列」文字列ではカンマ(,)と右角括弧（]）が使用できないと書かれています。

これは、カンマ(,)は区切り文字、右角括弧(])は配列の終わりと判断される為です。
その為、パラメータ内でカンマ(,)や右角括弧(])を使用する場合はダブルクォーテーション(")で括る必要があります。

どんな時にカンマ(,)や右角括弧(])を使うかと言えば<regexp>に正規表現を指定する時が多いのではないでしょうか？

正規表現でもカンマ(,)や右角括弧(])を使わない時はダブルクォーテーション(")で括る必要はないのですが、例外で覚えるのが面倒なので「正規表現はダブルクォーテーション(")で括る」と覚えていた方が楽だと思います。

尚、パラメータで「引用符付き文字列」を使う場合、ダブルクォーテーション(")はバックスラッシュでエスケープする必要があります。


で、この文字列解析ですが、実はトリガーでも使われてます。A(^_^;

その為、トリガーをhoge.str([ERROR])と書くと[ERROR]は配列パラメータと認識され、「ERROR」と言うキーワードが出力されればヒットしてしまいます。

この動作を避けるためにはhoge.str("[ERROR]")の様に「引用符付き文字列」で指定する必要があります。
※：regexp、iregexpも同様です。

***
■Zabbixの正規表現について 【Zabbix3.4未満】

Zabbixが使える正規表現はマニュアルにも書かれていますがPOSIX拡張形式になります。
下記リンクに分かりやすい表があるのですが、「角かっこ[]の中」で使えないものが沢山あるのが分かります。
[正規表現・ワイルドカード](http://www.cudo29.org/regexp.html)

ここで注意が必要なのですが、ZabbixのWebインタフェースの正規表現チェックですが、PHPのPOSIX 正規表現関数がPCRE対応なのでPOSIX拡張形式じゃなくても通ります。A(^_^;

[POSIX 正規表現関数](http://php.net/manual/ja/ref.regex.php)

どうすればPOSIX拡張形式でチェックできるかと言うと…
下記リンクの「拡張正規表現モードの正規表現」に書いてある通り、grepコマンドに-Eオプションを指定するとPOSIX拡張でチェックができます。
[grepによる正規表現と’-E’をつけた拡張正規表現の違い(and sed)](http://lab.unicast.ne.jp/2011/06/02/grep%E3%81%AB%E3%82%88%E3%82%8B%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%A8-e%E3%82%92%E3%81%A4%E3%81%91%E3%81%9F%E6%8B%A1%E5%BC%B5%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%AE%E9%81%95%E3%81%84/)

下記はgrepコマンドのhelp抜粋。

```
]# grep --help
Usage: grep [OPTION]... PATTERN [FILE]...
Search for PATTERN in each FILE or standard input.
PATTERN is, by default, a basic regular expression (BRE).
Example: grep -i 'hello world' menu.h main.c

Regexp selection and interpretation:
  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)
  -F, --fixed-strings       PATTERN is a set of newline-separated fixed strings
```
Zabbix3.4からはPCRE拡張正規表現のライブラリを使用する変更が入っております。
electronでメールクライアントソフトを作ってみる(環境構築編)

# 他の人から見たら割とどうでもいいモチベーション

* PC整理しているとelectronのデモが入っていてそういえば自分でelectronアプリ作ったことないなと思った

 ↓

* Thunderbirdからスパムメール受信のお知らせ

 ↓

* よし、electronでメールクライアントアプリをつくろう


# どんなものを作りたいのか


どうせ作るなら開発者の人たちに「いいね！」と言ってもらえるようなものを作りたい。(ため息つかれるのは会社の中だけでじゅうぶ(ry))
具体的なことはともかくとして適当に以下の目標を持って作ってみることにする。

* 機能拡張しやすい
  

* 起動にイライラしない


* デザインを簡単にかえられるようにしたい


# 環境づくり

環境構築はLinux Mint 17.3 Rosaで作った。


## Node.jsをいれる。

electronアプリを作るためにはNode.js環境をつくる必要がある。
Node.jsのバージョンも管理したいためnvmから導入する。
以下リンクを参考に構築してみる。

* [Node.jsとnvmを初めてインストールするときのハマりポイントと対策](http://mollifier.hatenablog.com/entry/20110221/p1)

* [node.jsの環境構築（NVMを入れよう）](http://qiita.com/nyago/items/05814787b351fc57dc22)

git環境はすでに導入済みだったのでビルドに必要なものをapt-getで調達する。
上のリンクだとcurlもいれんとダメだ！と書いてあったがMintには入っていた。もしかしたら、構築した時に入れたかもしれないが
なければapt-getにcurlも入れれば良い話なのでそこはスルー。

とりあえずnvmをクローンして、2016年10月でLTS
としておすすめされているv4.6.0を導入。
gitがない場合でもgithubにzipがおいてあるのでそれを持ってくればよいかと。

```bash: 
$ sudo apt-get install build-essential libssl-dev
$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ source ~/.nvm/nvm.sh
$ nvm install v4.6.0
```

## electron環境を入れていく

プロジェクトフォルダを作ったあとに
npm initでプロジェクトのファイルをざっくり作ってelectron環境は以下のコマンドで入れる。
「npm install electron-prebuild」と書いてあるサイトもあるが、
今は「electron」だよとnpmが言ってよしなにしてくれる。

```bash:
$ sudo npm install electron
```

# 最初の一歩

最初の一歩としてウィンドウを出すところまでやってみる。
参考等言う以下リンクのコードをもろにパクった。

(Electronでアプリケーションを作ってみよう)[http://qiita.com/Quramy/items/a4be32769366cfe55778]

```bash:
$ electorn main.js
```

無事最初のHello, Electronが表示された。

# 今後の予定
次はIMAPでのメール読み出しを実装する予定。
WinSCPの転送設定で.git を除外する方法

主題の手順覚書

# 前提
- `Keep remote directory up to date`/`ミラーリング アップロード` を使う
- WinSCPバージョン: `5.9.3`


# 手順
1. `Keep remote directory up to date`/`ミラーリング アップロード` ダイアログの `Transfer settings`/`転送設定` ボタンを押す
    - `Transfer settings`/`転送設定` ダイアログが開く
1. ダイアログ: `Other`/`その他` -> `File mask`/`ファイルマスク` の `Edit`/`編集` ボタン
    - `Edit file mask`/`マスクの編集画面` ダイアログが開く
1. `Exclude directories`/`含めないディレクトリ` に `.git` を追加する
1. `OK`
Linuxで最近更新したファイルを見つける

Linuxで最近更新したファイルを見つける方法です。
どのファイルを更新したのか分からなくなってしまったときや、ファイルの改竄検出などに使います。
以下の例では、過去10日間に更新したファイルが表示されます。

    find . -mtime -10 -ls

詳しく知りたい方は以下の記事がオススメです。
http://qiita.com/narumi_/items/9ea27362a1eb502e2dbc
Laravelを使い始めてみた


新しい案件でLaravelを使い始めてみたので色々感想をまとめてみた。

## PHP利用歴

* オレオレフレームワーク
* CakePHP 1.x/2.x
* Laravel 5.2 ← 今ココ(5.3への移行も検討中..)

## 最近のPHPで嬉しい点

Laravel 5.3は5.6.4以降のPHPで動くのであんまり使ってこなかった新機能をバリバリ使うようになりました。

* Closure
* Generator
* arrayの短縮形(`[1, 2, 3]`)
* trait

＼(^o^)／

今更感ありますがひと昔前のPHP文法を使ってたので便利さに感動した

## Laravelの嬉しい点

* ルーティング設定が柔軟に出来る. 簡単なページではClosureも使えるし、ドメイン毎に設定するのも可能
* DB Migrationが便利. fluentな文法でスキーマ定義ができる. 様々な型(enum, json, jsonb等)のカラムが定義できる → [参考](https://laravel.com/docs/5.3/migrations)
* Query Builderが便利。fluentな文法で生SQLじゃなくても複雑なクエリーが記述できる → [参考](https://laravel.com/docs/5.3/queries)
* Validationが使いやすい(CakePHP2ではValidationとModelがくっついていた) → [参考](https://laravel.com/docs/5.3/validation)
* Cache::remember()が便利 → [参考](https://laravel.com/docs/5.3/cache)
* Collectionが便利. `array_*`関数さようならw → [参考](https://laravel.com/docs/5.3/collections)
* artisan serve (簡易Webサーバー機能)が便利
* artisan tinker(REPL機能)が便利. これでドキュメントを探さなくても実際の挙動等を確認できる.
* Task Schedulerでcrontab触らなくて良くなった → [参考](https://laravel.com/docs/5.3/scheduling)
* SocialiteでOAuth認証も楽勝!

## Laravelの困った点

* EloquentとQuery Builderの違いに戸惑った
* Relationを返すメソッドとプロパティの違い → [参考](https://laravel.com/docs/5.3/eloquent-relationships#relationship-methods-vs-dynamic-properties)
* Form Helperが無い. 手で書く必要がある
* dotenvファイルの管理方法に悩む
* Query Builderで取得できる結果がStdClassなので振る舞いを持たせられない. [後に解決](http://qiita.com/tsuyosh/items/4834265afb8a9ee13cfe)
* 巨大なテーブルをcursorで1行ずつ処理しようとしたらメモリー不足でコケる件
* なんでQueue Driverのデフォルト値(.env.sample)がsyncなのか...
* MySQLのcollationの設定が`utf8_unicode_ci`になっている. config/database.phpを編集すればOK

# これから調べる

* Task Schedulerのプロセス監視
* Queueの監視
* Test関連
* ACL
* Elixir
* Supervisor上で動いているQueue Workerを安全に止める方法
* ログローテート
* チューニング
午前3時過ぎにサーバが障害を起こしたのでCentOS7でcron.dailyが走る時間を変更する

# はじめに
`cron.daily`が走ってそうな時間帯にサーバの障害報告が上がってきました。
モニタリングの各種値と照らし合わせて、HDDアクセスが過負荷状態になっているようで、ログローテートの処理を疑いました。

今回のサーバはウェブサーバだったのですが、その特性上、午前３時がアクセスの谷間というわけではありませんでした。
アクセスの最も少ない午前6時ごろに移動させてみます。

# 7からは変更された様子

CentOS 5のころはcron.dailyが`/etc/crontab`から呼ばれていたので、この時間を変更すれば良かったのですが、現在は違うようです。
調べてみたところ`anacron`という仕組みが使われているようでしたので、こちらの設定されている時間を変更してみます。

```conf:/etc/anacrontab
中略
START_HOURS_RANGE=3-22
中略
```
START_HOURS_RANGEはcronを走らせて良い時間らしくて、ここを`START_HOURS_RANGE=6-10`に変更します。

これで運用してみます。

> https://linux.die.net/man/5/anacrontab
> http://www.server-memo.net/tips/crontabfile.html
Unityのシーン上でアクティブな3Dモデルの頂点とポリゴンを数えてみる

# 概要
ゲームを快適にプレイするためにはFPSを保つ必要があります。（特に、VR系コンテンツは最低でも60fpsは出したいところ）
FPSが落ちる要因は様々あって一概にこれ！ということは難しいですが、可能性の一つとして3Dモデルの出しすぎや1つのモデルのポリゴン数が多すぎ等が挙げられます。
ということで、シーン上でActiveになっている3Dモデルの頂点とポリゴンを数えてみる方法になります。

# Unityのバージョン
5.4.2f1

# アクティブな3Dモデルの頂点とポリゴンを数える

## サンプルコード

```csharp:PolygonCounter.cs
using UnityEngine;
using System.Collections;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class PolygonCounter : MonoBehaviour {

	int vertices;
	int polygons;

	[SerializeField]
	int minFps = 60;

	int frameCount = 0;
	float nextTime = 0.0f;

	void Start () {
		nextTime = Time.time + 1;
	}
	
	void Update () {

		frameCount++;

		// 1秒ごとにFPS検証
		if (Time.time >= nextTime) {
			// Debug.LogFormat ("{0}fps", frameCount);
			if (frameCount < minFps) PolygonCount (frameCount);

			frameCount = 0;
			nextTime += 1f;
		}

	}

	[ContextMenu("CountStart")]
	void PolygonCount(int fps = -1){

		vertices = 0;
		polygons = 0;
		foreach (GameObject obj in UnityEngine.Object.FindObjectsOfType(typeof(GameObject))) {

			if (obj.activeInHierarchy) {

				SkinnedMeshRenderer skin = obj.GetComponent<SkinnedMeshRenderer> ();

				if (skin != null) {
					int vert = skin.sharedMesh.vertices.Length;
					vertices += vert;

					int polygon = skin.sharedMesh.triangles.Length / 3;
					polygons += polygon;
				}

				MeshFilter mesh = obj.GetComponent<MeshFilter> ();

				if (mesh != null) {
					int vert = mesh.sharedMesh.vertices.Length;
					vertices += vert;

					int polygon = mesh.sharedMesh.triangles.Length / 3;
					polygons += polygon;
				}
					
			}
		}
		Debug.LogFormat ("Vertices(verts) : {0} , Polygons(Tris) : {1} , FPS : {2} " ,
			vertices , polygons, fps);	

	}

#if UNITY_EDITOR

	[CustomEditor(typeof(PolygonCounter))]
	public class CountStartEditor : Editor {

		PolygonCounter polygonCounter;

		void OnEnable(){
			polygonCounter = target as PolygonCounter;
		}

		public override void OnInspectorGUI ()
		{
			base.OnInspectorGUI ();

			if (GUILayout.Button("カウント開始")){
				polygonCounter.PolygonCount ();
			}
		}

	}

#endif

}

```

### 使い方
- 適当なGameObjectにアタッチしてください。
- インスペクター上で確認したい場合は、「カウント開始」を押してください（何かの不具合でボタンが表示されない場合は、歯車アイコンから「CountStart」を押してください）
- ゲームプレイ中に確認したい場合は、minFpsの値を設定してください。FPSがminFpsを下回るとカウントを開始します。
- コンソールログに、シーン上でアクティブな3Dモデルの頂点とポリゴン数が表示されます。

### 基礎クラス（PolygonCounter）
- FPSは1秒間に実行したフレームをカウントしています。
- 設定したFPSを下回るときに、今回のカウンター処理を呼び出しています。
- シーン上でアクティブなゲームオブジェクトを全検索します。
- その中でSkinnedMeshRendererか、MeshFilterをコンポーネントとして持っている場合は頂点数とポリゴン数を加算してます。（頂点数とポリゴン数はメッシュのインスペクターに表示される内容です（下記画像を参照））
- 最終的にデバッグログとして出力します。

![mesh_inspector.png](https://qiita-image-store.s3.amazonaws.com/0/119425/84a1e87e-469b-ee73-0d9c-c8772704e818.png)


### 拡張クラス（CountStartEditor）
- 基礎クラスのメソッドを呼ぶために、有効時に基礎クラスを設定
- インスペクターを拡張して、ボタンを配置（押されたらメソッド呼ぶ）

## 補足
- あくまでデバッグを目的にしているので、デバッグ時以外は外しておいた方が良いです。（そもそも、シーン上の3Dモデルを全検索する負荷が高そうですし）
- この記事のサンプルコードについては、[「【Unity】3Dオブジェクトのポリゴン数を表示させる」](http://megumisoft.hatenablog.com/entry/2015/09/04/103559)を参考にさせてもらいました。
- バグだったり、こうした方がスマートなどありましたら、ご指摘ください。
golangで、S3のBucket以下のObjectを全て操作する

いくつかのサイトで、S3のObjectの操作を調べたのですが、有名なサイトでも、私が望んていた処理が一部満たされていない（1,000件以上のObjectの操作が出来ないなど)かったので、今回 go-lang で実装してみました。

## 注意点

- AWS の API の仕様で、一度に１，０００件までの Object しか取得できない
- ec2 上で実行した方が、料金を抑えることができるはず

## 前提条件

- [AWS CLI](https://aws.amazon.com/jp/cli/) の設定が終わっていること。

## 実装

```go

package main

import (
	"flag"
	"fmt"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/service/s3"
)

var bucket string

// Regsion
const Region = "us-west-1"

func main() {
	flag.Parse()
	fmt.Println("flag.Args: ", flag.Args())
	fmt.Println(flag.Args()[0])

	bucket = flag.Args()[0]

	getS3Objects("prefix/")

}

func getS3Objects(prefix string) bool {

	var re = Region
	cli := s3.New(&aws.Config{Region: &re})

	params := &s3.ListObjectsInput{
		Bucket: aws.String(bucket),
		Prefix: aws.String(prefix),
	}

	cli.ListObjectsPages(params, addAclPublicRead)

	return true
}

func addAclPublicRead(resps *s3.ListObjectsOutput, more bool) bool {

	var re = Region
	cli := s3.New(&aws.Config{Region: &re})

	for n := 0; n < len(resps.Contents); n++ {
		params := &s3.PutObjectAclInput{
			Bucket: aws.String(bucket),
			Key:    aws.String(*resps.Contents[n].Key),
			ACL:    aws.String(s3.ObjectCannedACLPublicRead),
		}
		resp, err := cli.PutObjectAcl(params)

		if err != nil {
			fmt.Println(err.Error())
			return false
		}

		// Pretty-print the response data.
		fmt.Println(resp)
	}
	return true
}
```
Webサービス上にMarkdownエディタを作れる便利なライブラリ

■Webサービス上にMarkdownエディタを作る
https://github.com/NextStepWebs/simplemde-markdown-editor
http://unitopi.com/markdown-editor/

■Markdownで入力した値を表示する
http://sd-blog.lionheart.co.jp/entry/2015/09/07/185627
centos7.2でpython + mecabの環境構築方法

# インストール手順
以下の手順で各ソフトウェアをインストールする．
（基本的な手順は参考に示す記事の通りだが，当環境ではpip，python-develのインストールが必要だった）

EPELリポジトリを追加する（python-pipのインストールに必要）．
` sudo yum install epel-release `

Pythonをインストールする（Pythonは2.7）．
` sudo yum install python python-devel python-pip `

yumからMeCabをインストールできるようにするため，Groonga リポジトリを追加する．
` sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm `

MeCabをインストールする．
` sudo yum install mecab mecab-devel mecab-ipadic `

PythonからMeCabを使うためのバインディングをインストールする．
` sudo pip install mecab-python `

# 参考
[yumでMeCabをインストール](http://qiita.com/ikenyal/items/275ca3096002822e8cd6)
[Python + mecab をyum のみで入れる、3つのステップ](http://qiita.com/wan-liner/items/53250505efb908625b6b)
redisレプリケーション周りの設定手順まとめ

redisのインストールについては、master/slaveともに、既に完了している前提で進めます。
インストールについては、[こちら](http://qiita.com/tachitechi/items/225bf5dbadf19d47c27d "こちら")を参照

レプリケーションの設定は、簡単にできましたので手順を記載します。


# やりたいこと

* サーバ間のレプリケーション設定（master/slave）

# redisのバージョン（master/slave）

```
redis-server --version
Redis server v=3.2.4 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=e24ba9f950034b39
```

今回検証したのは、master, slaveともに上記バージョンをインストールしました。
インストール手順については、[こちら](http://qiita.com/tachitechi/items/225bf5dbadf19d47c27d "こちら")

# 疎通確認

初期設定のままだと、接続設定がlocalhostしか許可されていないので、アクセスができない

```
redis-cli -h <接続先のホスト>

Could not connect to Redis at <接続先のホスト>:6379: Connection refused
not connected>
```

恐らく、上記のようなErrorメッセージが出力される

# slaveからmasterへの接続設定

### ・ conf修正

```
vim /etc/redis/redis.conf 

bind 127.0.0.1 → bind 0.0.0.0
```

master/slaveともに、上記設定を反映


### ・ redisの再起動

```
systemctl restart redis.service
```

### ・ 疎通確認

```
redis-cli -h <接続先のホスト>
<接続先のホスト>:6379> 
```

# レプリケーション設定

### ・ slaveサーバのconf修正

ここまでで、master, slave間の疎通は取れているかと思いますので、slaveの設定を行います。

```
vim /etc/redis/redis.conf 

slaveof <masterのIP> <masterのredisのport番号>
```

portは、特に設定を変えてなければ、デフォルトの6379を記載します。

### ・ 再起動

```
systemctl restart redis.service
```

# レプリケーションの確認

ここまでくれば、レプリケーション設定が全て完了しています！
思ったより、簡単！
最後に、設定されているかどうかを確認していきます。

### ・ slaveサーバの設定確認

```
redis-cli

127.0.0.1:6379> INFO

# Replication
role:slave
```

Replication欄に、設定したサーバが記載されていれば、オッケーです。

### ・ slaveサーバの同期確認

```
keys *
```

masterでsetしているデータが、slaveにも反映されている
無事、同期されていることを確認

### ・ masterサーバの設定確認

```
redis-cli
127.0.0.1:6379> INFO

# Replication
role:master
```

masterサーバ側でも、役割がmasterに割り当てられていることを確認。
slave側のIPも記載されている。
bashでユーザのキーボード入力を対話的に受け取るbashスクリプト

はじめに
===

bashでユーザのキーボード入力を対話的に受け取って、yesと入力されたら後続の処理を実行する、noと入力されたら処理をキャンセルするbashスクリプトです。

yesと入力された場合、hello worldと表示します。

環境
===

実行環境はbash 2.3.1 + Amazon EC2(Amazon Linux)になります。

```
[ec2-user@example-ruby-sinatra-server ~]$ bash --version
GNU bash, バージョン 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[ec2-user@example-ruby-sinatra-server ~]$ 
```

ユーザのキーボード入力を対話的に受け取るbashスクリプト
===

ユーザからのキーボード入力を対話的に受け取るbashスクリプトを作成します。

```
[ec2-user@example-ruby-sinatra-server ~]$ vi example.sh
```

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

## ----------------------------
# ユーザからのキーボードの入力を受け取り、
# yes と入力されたらスクリプトを実行する、no と入力されたらスクリプトを終了します.
## ----------------------------

function ConfirmExecution() {

  echo "----------------------------"
  echo "スクリプトを実行しますか?"
  echo "  実行する場合は yes、実行をキャンセルする場合は no と入力して下さい."
  read input

  if [ -z $input ] ; then

    echo "  yes または no を入力して下さい."
    ConfirmExecution

  elif [ $input = 'yes' ] || [ $input = 'YES' ] || [ $input = 'y' ] ; then

    echo "  スクリプトを実行します."

  elif [ $input = 'no' ] || [ $input = 'NO' ] || [ $input = 'n' ] ; then

    echo "  スクリプトを終了します."
    exit 1

  else

    echo "  yes または no を入力して下さい."
    ConfirmExecution

  fi

}

# シェルスクリプトの実行を継続するか確認します。
ConfirmExecution

echo "----------------------------"
echo "hello world!"
```

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

```
[ec2-user@example-ruby-sinatra-server ~]$ chmod 755 example.sh 
[ec2-user@example-ruby-sinatra-server ~]$ 
```

bashスクリプト実行例
===

作成したbashスクリプトを実行してみます。
bashスクリプトを実行したユーザがキーボードからyesと入力した場合、hello worldと表示します。

```
[ec2-user@example-ruby-sinatra-server ~]$ ./example.sh 
----------------------------
スクリプトを実行しますか?
  実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
yes
  スクリプトを実行します.
----------------------------
hello world!
[ec2-user@example-ruby-sinatra-server ~]$ 
```


キーボードからnoと入力した場合、hello worldと表示せずに処理を終了します。

```
[ec2-user@example-ruby-sinatra-server ~]$ ./example.sh 
----------------------------
スクリプトを実行しますか?
  実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
no
  スクリプトを終了します.
[ec2-user@example-ruby-sinatra-server ~]$ 
```

キーボードからyesまたはno以外が入力した場合、または何も入力しなかった場合、再度ユーザにyes or noの入力を要求します。

```
[ec2-user@example-ruby-sinatra-server ~]$ ./example.sh 
----------------------------
スクリプトを実行しますか?
  実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
test
  yes または no を入力して下さい.
----------------------------
スクリプトを実行しますか?
  実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.

  yes または no を入力して下さい.
----------------------------
スクリプトを実行しますか?
  実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
no
  スクリプトを終了します.
[ec2-user@example-ruby-sinatra-server ~]$ 
```

ちなみに、Rubyで同様の事を行うRubyスクリプトについても、以下にまとめてみました。

http://qiita.com/na0AaooQ/items/65005f51c2430f74d2f0

***

以上になります。
簡単！redis(3.2.4)のインストール方法

最新版のredis(3.2.4)をインストールする手順を記載します。

# やりたいこと

* redisのインストール（ver 3.2.4）

# インストール先環境

```
cat /etc/centos-release

CentOS Linux release 7.2.1511 (Core) 
```

# redis-3.2.4のインストール

```
yum install gcc tcl readline-devel
cd /usr/local/src
curl -O http://download.redis.io/releases/redis-3.2.4.tar.gz
tar xvzf redis-3.2.4.tar.gz
cd redis-3.2.4
make
make test
make install
```

インストールが無事完了しました。

# redisの起動設定

* confファイルの設定

tarでインストールさせると、redis.confが指定場所にいないので、手動でファイルを設定

```
mkdir /etc/redis/
cp redis.conf /etc/redis/
```


* confに最低限の設定だけ反映

```
vim /etc/redis/redis.conf
```

```
> デーモンモードの変更
daemonize no → daemonize yes

> ログ出力先の変更
logfile "" → logfile "/var/log/redis.log" 
```

# redis起動

```
/usr/local/bin/redis-server /etc/redis/redis.conf
```

# 疎通確認

起動していることを確認

```
redis-cli ping
PONG
```

# .serviceファイルを作成

起動するときに、上記コマンドを打つのは面倒なので、.serviceファイルを作成する

```
vim /etc/systemd/system/redis.service
```

```
[Service]
ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
```

# 起動チェック

```
systemctl start redis.service
```

# まとめ

最新版のredis(3.2.4)のインストールに成功
mysqlのuserログイン時に`ERROR 1524 (HY000): Plugin  is not loaded`が出たときの対応法

開発時にMacにMySQLを入れて使用していたのですが、作成したUserでログインを試みた所、
`ERROR 1524 (HY000): Plugin 'xxxx' is not loaded`
とエラーが出てしまい、ログインが出来なくなってしまいました。。。

あまりまとめられている記事がすぐに出てこなかったので、こちらにまとめます。

## 1. rootユーザでログイン

```console
$ mysql -u root -p
```

## 2. ユーザ情報の確認

```sql
SELECT host, user, plugin FROM mysql.user
```

ここで確認した所、初期設定で作成されるroot等のユーザの`plugin`項目に対しては`mysql_native_password`が設定されており、新規で追加したユーザの方にはこの値が入っていませんでした。

[ネイティブ認証プラグイン](https://dev.mysql.com/doc/refman/5.6/ja/native-authentication-plugin.html)

## 3. mysql_native_passwordをpluginに設定

```sql
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'user';
FLUSH PRIVILEGES;
```

ここまでの時点でユーザでログインを試みた所、`Access denied`が出てしまう場合には、`mysql_upgrade`を実行します

```console
$ mysql_upgrade -u root
```

これでユーザログインが可能になりました。

```console
$ mysql -u user -p
```
bundle install にて「Could not locate Gemfile or .bundle/ directory」とエラー表示される

Redmine 2.5をCentOS 6.5にインストールする際に下記のサイトを参考にしたが、Gemパッケージのインストールで、下記のエラーを表示した。

参考にしたサイト
http://blog.redmine.jp/articles/2_5/installation_centos/

#Gemパッケージのインストール
```
# bundle install --without development test
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will
break this application for all non-root users on this machine.
Could not locate Gemfile or .bundle/ directory
```

Gemfileが見つからないとの事なので、findでGemfileを探す

```
# find / -name Gemfile
/usr/local/lib/ruby/gems/2.0.0/gems/bundler-1.13.5/lib/bundler/templates/Gemfile
/var/lib/redmine/Gemfile
```

/var/lib/redmine/Gemfileにあるとの事

cd でvar/lib/redmine/ 配下に移動しbundle installを再実施

```
# cd /var/lib/redmine/
# bundle install --without development test
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will
break this application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/..............
Fetching version metadata from https://rubygems.org/...
Fetching dependency metadata from https://rubygems.org/..
Resolving dependencies....
Rubygems 2.0.14 is not threadsafe, so your gems will be installed one at a time. Upgrade to Rubygems 2.1.0 or higher to enable parallel gem installation.
Installing rake 11.3.0
Installing i18n 0.7.0
Installing multi_json 1.12.1
Installing builder 3.0.0
Installing erubis 2.7.0
Installing journey 1.0.4
Installing rack 1.4.7
Installing hike 1.2.3
Installing tilt 1.4.1
Installing mime-types 1.25.1
Installing polyglot 0.3.5
Installing arel 3.0.3
Installing tzinfo 0.3.51
Using bundler 1.13.5
Installing coderay 1.1.1
Installing json 1.8.3 with native extensions
Installing thor 0.19.1
Installing mysql2 0.3.21 with native extensions
Installing net-ldap 0.3.1
Installing ruby-openid 2.3.0
Installing redcarpet 2.3.0 with native extensions
Installing rmagick 2.16.0 with native extensions
Installing activesupport 3.2.17
Installing rack-cache 1.6.1
Installing rack-test 0.6.3
Installing rack-ssl 1.3.4
Installing sprockets 2.2.3
Installing treetop 1.4.15
Installing rdoc 3.12.2
Installing rack-openid 1.4.2
Installing activemodel 3.2.17
Installing mail 2.5.4
Installing actionpack 3.2.17
Installing activerecord 3.2.17
Installing activeresource 3.2.17
Installing actionmailer 3.2.17
Installing railties 3.2.17
Installing awesome_nested_set 2.1.6
Installing jquery-rails 2.0.3
Installing rails 3.2.17
Bundle complete! 21 Gemfile dependencies, 40 gems now installed.
Gems in the groups development and test were not installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from rdoc:
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
#
```
最後に何かメッセージがあるが
1.9.2以上なら関係ないよとの事　
うまくいった模様
素人の言語処理100本ノック:23


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第3章: 正規表現
>Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある．
>・1行に1記事の情報がJSON形式で格納される
>・各行には記事名が"title"キーに，記事本文が"text"キーの辞書オブジェクトに格納され，そのオブジェクトがJSON形式で書き出される
>・ファイル全体はgzipで圧縮される
>以下の処理を行うプログラムを作成せよ．

###23. セクション構造
>記事中に含まれるセクション名とそのレベル（例えば"== セクション名 =="なら1）を表示せよ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import gzip
import json
import re
fname = 'jawiki-country.json.gz'


def extract_UK():
	'''イギリスに関する記事本文を取得

	戻り値：
	イギリスの記事本文
	'''

	with gzip.open(fname, 'rt') as data_file:
		for line in data_file:
			data_json = json.loads(line)
			if data_json['title'] == 'イギリス':
				return data_json['text']

	raise ValueError('イギリスの記事が見つからない')


# 正規表現のコンパイル
pattern = re.compile(r'''
	^		# 行頭
	(={2,})	# キャプチャ対象、2個以上の'='
	\s*		# 余分な0個以上の空白（'哲学'や'婚姻'の前後に余分な空白があるので除去）
	(.+?)	# キャプチャ対象、任意の文字が1文字以上、非貪欲（以降の条件の巻き込み防止）
	\s*		# 余分な0個以上の空白
	\1		# 後方参照、1番目のキャプチャ対象と同じ内容
	.*		# 任意の文字が0文字以上
	$		# 行末
	''', re.MULTILINE + re.VERBOSE)

# 抽出
result = pattern.findall(extract_UK())

# 結果表示
for line in result:
	level = len(line[0]) - 1    # '='の数-1
	print('{indent}{sect}({level})'.format(
		indent='\t' * (level - 1), sect=line[1], level=level))
```

####実行結果：

```console:端末
国名(1)
歴史(1)
地理(1)
	気候(2)
政治(1)
外交と軍事(1)
地方行政区分(1)
	主要都市(2)
科学技術(1)
経済(1)
	鉱業(2)
	農業(2)
	貿易(2)
	通貨(2)
	企業(2)
交通(1)
	道路(2)
	鉄道(2)
	海運(2)
	航空(2)
通信(1)
国民(1)
	言語(2)
	宗教(2)
	婚姻(2)
	教育(2)
文化(1)
	食文化(2)
	文学(2)
	哲学(2)
	音楽(2)
		イギリスのポピュラー音楽(3)
	映画(2)
	コメディ(2)
	国花(2)
	世界遺産(2)
	祝祭日(2)
スポーツ(1)
	サッカー(2)
	競馬(2)
	モータースポーツ(2)
脚注(1)
関連項目(1)
外部リンク(1)
```

###セクションとは？
問題26で参考情報として紹介されている[マークアップ早見表](https://ja.wikipedia.org/wiki/Help:早見表)の「見出し」を指しているようなので、これに従いコーディングしました。

###複数のキャプチャ
今回の条件ではキャプチャ対象が2つあるので、`result`の各要素は2要素のタプルが返ります。例えば最初のセクションは`('==', '国名')`が返ります。

###後方参照
セクションは同じ数の`=`で括られる必要があるので、終わりの部分は始めの部分と同じものをマッチさせる必要があります。`\number`で前出のグループを指定できるのでそれを使いました。後方参照という仕組みです。なお、前出のグループを指定するための番号は0ベースではなく1ベースなので注意してください。1が最初のグループを指します。

###余計な空白の除去
対象データは`=== 哲学 ===`という風にセクションの前後に空白の入っているものが混ざっていました。そのため、`\s*`で空白を除去する条件にしています。

　
24本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第3章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
xpath1.0で ends-with function を使いたい時

`xpath1.0`では`starts-with`関数は用意されてるんですが、`ends-with`は `xpath2.0`からの実装になっています。

残念ながらNokogiriは xpath 1.0 しかサポートしてないので `ends-with` が使えません。

### 代わりのやり方

例えば`id`が`register`で終わる要素を取得するには

```.rb
doc.xpath("//*[substring(@id, string-length(@id) - string-length('register') +1) = 'register']")
```

としましょう。

### ダメな例

「特定の文字列の後が空白なら末尾の文字列」と確定できるかと思ったんですが、文字列にマッチしないとすべて返ってきてしまいます。

```.rb
doc.xpath("//*[substring-after(@id, 'register`) = '']")
```

### 参考

http://stackoverflow.com/questions/22436789/xpath-ends-with-does-not-work
[Swift][速度向上] コードの書き方による、コンパイルにかかる時間を計測

同じ処理結果を求めるだけでも、コードの書き方によって処理速度が変わるのは皆さんもご存知の通りだと思います。
今回、処理速度を求めることは目的としていません。
コンパイル時間が遅くて大変な思いをすることの多いSwiftについて、コードの書き方によってどの様にコンパイル時間が変わるかやってみました。

環境は
MacBook Pro Retina 15-inch late 2013 Corei7 memory 16GB
MacOS Sierra
Xcode 7.3
です。

Swiftのコンパイル時間については、よくDictionary型の宣言方法などが挙げられています。
また、データ型のキャストもコンパイル時間に影響を与えているようです。
今回それらとは別に、主に配列のデータ取り出しに注目してやってみました。

ものによっては、こんなの当たり前だよ！というケースもあるかもしれませんが...その点はご容赦ください。

今回は、ある配列の特定の範囲の総和を求める計算を行いたいと思います。（特に理由はありません）

#Flag の追加
まず、コンパイルにかかる時間の計測方法です。
Build Setting -> Swift Compiler -> Custom Flags -> Other Swift Flagsに以下を追加してください。

-Xfrontend -debug-time-function-bodies

<img width="883" alt="Screen Shot 2016-10-15 at 18.12.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/46509/f20e4d0f-b154-96fb-3bf3-cc9dac08e712.png">

こうすることで、Xcodeが関数ごとのコンパイル時間をログに残してくれる様になります。

#コード
以下、多少強引ですが、色々なケースで書きうるコードをいくつか作って試してみました。
引数の配列の、0th indexから3rd indexまでの値の総和を求める関数です。

```Swift.swift

//index番号が自明な場合で、連続した4つの値を計算する場合
func accumulation(array:[Float])->Float
{
    if(array.count > 4){
        return array[0] + array[1] + array[2] + array[3]
    }else{
        return 0
    }
}

//index番号が自明ではなく、あるindexから連続した4つの値を計算する場合
func accumulation2(array:[Float])->Float
{
    if(array.count > 4){
        let i:Int = 0
        return array[i] + array[i+1] + array[i+2] + array[i+3]
    }else{
        return 0
    }
}

//indexが自明な場合で、for loopを使用して計算する場合
func accumulation3(array:[Float])->Float
{
    if(array.count > 4){
        var a:Float = 0
        for i in 0..<4{
            a += array[i]
        }
        return a
    }else{
        return 0
    }
}

//indexが自明で、クロージャを使用する場合
func accumulation4(array:[Float])->Float
{
    if(array.count > 4){
        return array[0...3].reduce(0){$0+$1}
    }else{
        return 0
    }
}
```

これでCompileします。

#計測結果

計測結果はReport Navigator の Build欄から確認できます。

![Screen Shot 2016-10-15 at 18.31.24.png](https://qiita-image-store.s3.amazonaws.com/0/46509/dceeabc8-0920-2bbe-faeb-ab5484c3f9f5.png)

そsいて、 Compile Swift source filesの、Compile main.swiftの行、左にあるアイコンをクリックして、コンパイルの詳細を表示させます。

![Screen Shot 2016-10-15 at 18.31.34.png](https://qiita-image-store.s3.amazonaws.com/0/46509/6af707c9-8d2b-92b6-f809-9e01d459eb7b.png)


![Screen Shot 2016-10-15 at 18.34.35.png](https://qiita-image-store.s3.amazonaws.com/0/46509/ff8b2a1e-c3d0-cc16-81f8-f41a50e1ceae.png)

右端にミリ秒単位で、関数ごとのコンパイル時間が表示されているのがわかります。

画像では、上から
accumulation()
accumulation2()
accumulation3()
accumulation4()

と表示されています。
コンパイル時間は、for loopを使用したケースが最も短いことがわかりました。
Swift では i++　などという記述はもうできませんが、C言語などでは配列のindexに　i++や++iを書くことはよくありますよね。こういう手法はSwiftのコンパイルをとても遅くしている可能性があります。
皆さんの環境ではいかがでしょうか。
indexを足し算する方法では、なんと2秒以上もコンパイル時間がかかっていました...

#効率的な計測結果閲覧方法
上記の計測結果の欄を command + a　で全て選択し、command + cでクリップボードにコピー。
そのままの状態でTerminal上で
pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -10
のコマンドを実行すれば、計測時間の大きい関数順にsortされます。
上のコマンドでは、表示件数は10件です。

参考 : https://twitter.com/erikaderstedt/status/725217977314992128?ref_src=twsrc%5Etfw



他にも、様々なコードで書き方一つでコンパイル時間が大きく異なることがあるかもしれません。
puttygen で秘密鍵からOpenSSHの公開鍵作成

puttygen で秘密鍵からOpenSSHの公開鍵作成する時にいーーっつもハマるので、自分用まとめ

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">puttyで公開鍵暗号方式で認証させようとしてハマってる。authorized_keysのパーミッション見直して、.sshのパーミッション見直して、それでもダメだったから、サーバー側で鍵作り直して公開鍵だけ差し替えたんだけど、それでもダメだった。他に何があるかなぁ</p>&mdash; ミスター bamchoh (@bamchoh) <a href="https://twitter.com/bamchoh/status/786238782299213825">12 October 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

上記の原因は結局、authorized_keysの中に記述していた公開鍵に誤りがあっただけの話でした。puttygenで秘密鍵から公開鍵を作成するときに、File > Save Public Key で作成してから、その内容をauthorized_keysに記述してしまっていて、それが原因でOpenSSHが鍵を認識できなかったということでした。

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">昨日の公開鍵認証できなかった件、puttygenで秘密鍵から公開鍵生成したときの文字列の取得方法に問題があっただけだった。ここ（<a href="https://t.co/MsIpzXYBJa">https://t.co/MsIpzXYBJa</a>）参考にしたらいけた。あと、ここ（<a href="https://t.co/PNGIWyS3sK">https://t.co/PNGIWyS3sK</a>）も参考にした</p>&mdash; ミスター bamchoh (@bamchoh) <a href="https://twitter.com/bamchoh/status/786592485816410114">13 October 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

上記の通り、公開鍵を作成するときは、UI上に表示されている公開鍵をコピペしてauthorized_keysに記述することで認識してくれるようになりました。(もちろんパーミッションの設定もしています)
raspberrypi3でFeliCaのIDmを読み取る（pasori RC-S380版）

pasori RC-S320でのFeliCa IDmを読み込む場合は[こちら](http://qiita.com/t114/items/819a9cdfe90ea98dd4d3)

基本的に[nfcpyの公式](http://nfcpy.readthedocs.io/en/latest/topics/get-started.html)に書かれている内容通りですが、色々躓いたところもあったのでまとめました。

# 環境
ハード：raspberrypi3
OS：raspbian
リーダ：pasori RC-S380

#nfcpyのインストール
nfcpyはバージョン0.10の場合、おサイフケータイや免許証のFeliCa読込時にIDmがうまく読み込めなかったため、以下では0.9をインストールしています。

```
$ sudo apt-get install python-usb
$ sudo apt-get install bzr
$ mkdir nfcpy
$ cd nfcpy
$ bzr branch lp:nfcpy/0.9
```

#nfcにパスを通す
どこでも"import nfc"を使えるようにする。

```
sudo ln -s /home/pi/nfcpy/0.9/nfc /usr/local/lib/python2.7/dist-packages/
```

#sudoなしでnfcを使えるようにする

lsusbでIDを確認する。

```
$ lsusb
Bus 001 Device 004: ID 054c:06c3 Sony Corp.
...
```

確認したIDが054c:06c3と異なる場合、下記コマンドのidVendorとidProductの指定を変更して実行する。

```
$ sudo sh -c 'echo SUBSYSTEM==\"usb\", ACTION==\"add\", ATTRS{idVendor}==\"054c\", ATTRS{idProduct}==\"06c3\", GROUP=\"plugdev\" >> /etc/udev/rules.d/nfcdev.rules'
```

設定を反映させるため再起動させる。

```
sudo reboot -h now
```


#IDmを読み込むsampleコード
```py:idm_reader.py
import nfc
import binascii

def connected(tag):
    idm = binascii.hexlify(tag.idm)
    print(idm)
    return idm

clf = nfc.ContactlessFrontend('usb')
clf.connect(rdwr={'on-connect': connected}) # now touch a tag
clf.close()
```


#参考
[Raspberry Pi 2 に Pasori RC-S380 を繋げて ID を読み出す](http://tfukui2012.blog.fc2.com/blog-entry-21.html)
[nfcpy](http://nfcpy.readthedocs.io/en/latest/topics/get-started.html)
Vimで全角空白以外のユニコードの空白文字もハイライト&取り除く

全角空白を可視化する設定はよく見るけど、webからコードをコピペしたら、EN SPACE（Nと同じ幅のスペース）でSPACEと見分けがつかなかったので、それも可視化し、取り除くこともできるようにした。

# set list

まず、基本として、以下の設定をしておく。

```vim
" 不可視文字の表示
set list
" tab: »-
" 行末の空白: ･
" ノーブレークスペース: ⍽
" 画面の右側に文字があるとき: »
" 画面の左側に文字があるとき: «
set listchars=tab:»-,trail:･,nbsp:⍽,extends:»,precedes:«
```

`⍽`は[SHOULDERED OPEN BOX (U+237D)](http://www.fileformat.info/info/unicode/char/237d/index.htm)と呼ばれるもので「Graphics for keyboard symbol for no break space」と書いてあるので、これをノーブレークスペースに使った。
あとlistcharsでよくある設定として`eol:↵`があるけど、すべての文末に表示されるとうるさいのでやってない。

# スペース以外の空白文字をハイライト

[全角スペースを許すプログラミング言語まとめ | プログラミング生放送](http://pronama.azurewebsites.net/2015/09/06/allows-ideographic-space-programming-languages/)を見ると、PowerShellが一番ゆるそうで、「Any character with Unicode class Zs, Zl, or Zp」がwhitespaceとしてみなされるらしい。
これらの空白文字に対してハイライトすることにする。

それらのユニコード一覧は[Unicode Character Categories](http://www.fileformat.info/info/unicode/category/index.htm)に載っている。
また、空白文字の説明は[Unicode spaces](https://www.cs.tut.fi/%7Ejkorpela/chars/spaces.html)が詳しい。
Zs(Separator, Space), Zl(Separator, Line), Zp(Separator, Paagraph)のカテゴリに含まれる文字の中で、SPACEと、NO-BREAK SPACE（listで可視化出来ている）、OGHAM SPACE MARK（` `で空白ではない）以外の文字をハイライトする。

```vim
augroup MyVimrc
    autocmd!
augroup END

augroup MyVimrc
    autocmd ColorScheme * highlight UnicodeSpaces cterm=underline ctermfg=59 ctermbg=16 gui=underline guifg=#465457 guibg=#000000
    autocmd VimEnter,WinEnter * match UnicodeSpaces /\%u180E\|\%u2000\|\%u2001\|\%u2002\|\%u2003\|\%u2004\|\%u2005\|\%u2006\|\%u2007\|\%u2008\|\%u2009\|\%u200A\|\%u2028\|\%u2029\|\%u202F\|\%u205F\|\%u3000/
augroup END

" 上の設定より下で
colorscheme <your colorscheme>
```

ハイライトはSpecialKeyと同じハイライトに下線を入れる設定にした。自分の使っているcolorschemeのSpecialKeyの設定は`:highlight SpecialKey`で確認できる。
match部分でハイライトしたい文字の正規表現を設定している。例えば`\%u3000`はU+3000(IDEOGRAPHIC SPACE、全角空白)を表す正規表現。

# 行末の空白を削除&スペース以外の空白文字をスペースに変換

行末のSPACE, TABを削除し、ユニコードのカテゴリZs, Zl, Zpの中で、SPACEとOGHAM SPACE MARK以外の空白をSPACEに変換するコマンド。

```vim
command! -range=% FixSpaces call <SID>fix_spaces(<line1>, <line2>)

function! s:fix_spaces(line1, line2)
    " Save the current search and cursor position
    let _s=@/
    let l = line('.')
    let c = col('.')

    " Trim trailing spaces
    silent! execute ':' . a:line1 . ',' . a:line2 . 's/\s\+$//e'

    " Replace unicode spaces to normal space
    silent! execute ':' . a:line1 . ',' . a:line2 . 's/\%u00A0\|\%u180E\|\%u2000\|\%u2001\|\%u2002\|\%u2003\|\%u2004\|\%u2005\|\%u2006\|\%u2007\|\%u2008\|\%u2009\|\%u200A\|\%u2028\|\%u2029\|\%u202F\|\%u205F\|\%u3000/ /ge'

    " Restore the saved search and cursor position
    let @/=_s
    call cursor(l, c)
endfunction
```

`:FixSpaces`でバッファ全体、範囲指定するとその範囲だけ変換する。

[ntpeters/vim-better-whitespace: Better whitespace highlighting for Vim](https://github.com/ntpeters/vim-better-whitespace)のコードを一部参考にした。

# ユニコードの文字コードで文字入力

Google日本語入力だとU+3000などと打つと候補にそれを表す文字が表示される。
Vimだと挿入モードで`<C-v>u3000`で入力できる。

また、ノーブレークスペースはダイグラフの入力ができて、挿入モードで`<C-k><Space><Space>`や`<C-k>NS`で入力できる。
Rubyでユーザのキーボード入力を対話的に受け取るRubyスクリプト

はじめに
===

Rubyでユーザのキーボード入力を対話的に受け取って、yesと入力されたら後続の処理を実行する、noと入力されたら処理をキャンセルするRubyスクリプトです。

yesと入力された場合、hello worldと表示します。

環境
===

実行環境はRuby 2.3.1 + Amazon EC2(Amazon Linux)になります。

```
[ec2-user@example-ruby-sinatra-server ~]$ which ruby
/usr/local/rbenv/shims/ruby
[ec2-user@example-ruby-sinatra-server ~]$ 

[ec2-user@example-ruby-sinatra-server ~]$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
[ec2-user@example-ruby-sinatra-server ~]$ 
```

ユーザのキーボード入力を対話的に受け取るRubyスクリプト
===

ユーザからのキーボード入力を対話的に受け取るRubyスクリプトを作成します。

```
[ec2-user@example-ruby-sinatra-server ~]$ vi example.rb
```

```ruby:example.rb
#!/bin/env ruby

## ----------------------------
# ユーザからのキーボードの入力を受け取り、
# yes と入力されたらスクリプトを実行する、no と入力されたらスクリプトを終了します.
## ----------------------------

class ConfirmExecutionClass

  def initialize

    puts <<-EOT
----------------------------
スクリプトを実行しますか?
スクリプトを実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
    EOT

  end

  def get_keyboard_input_yes_no

    case gets.chomp
      when "yes", "YES", "y"
        puts "  スクリプトを実行します."
      when "no", "NO", "n"
        puts "  スクリプトを終了します."
        exit 1
      else
        puts "  yes または no を入力して下さい."
        confirm = ConfirmExecutionClass.new
        confirm.get_keyboard_input_yes_no
    end
  end

end

confirm = ConfirmExecutionClass.new()
confirm.get_keyboard_input_yes_no

puts "----------------------------"
puts "hello world!"
```

Rubyスクリプト実行例
===

作成したRubyスクリプトを実行してみます。

Rubyスクリプトを実行したユーザがキーボードからyesと入力した場合、hello worldと表示します。

```
[ec2-user@example-ruby-sinatra-server ~]$ ll example.rb
-rw-r--r-- 1 ec2-user ec2-user 1059 10月 16 12:23 example.rb
[ec2-user@example-ruby-sinatra-server ~]$ 
```

```
[ec2-user@example-ruby-sinatra-server ~]$ ruby example.rb 
----------------------------
スクリプトを実行しますか?
  スクリプトを実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
yes
  スクリプトを実行します.
----------------------------
hello world!
[ec2-user@example-ruby-sinatra-server ~]$ 
```

キーボードからnoと入力した場合、hello worldと表示せずに処理を終了します。

```
[ec2-user@example-ruby-sinatra-server ~]$ ruby example.rb 
----------------------------
スクリプトを実行しますか?
  スクリプトを実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
no
  スクリプトを終了します.
[ec2-user@example-ruby-sinatra-server ~]$ 
```

キーボードからyesまたはno以外が入力した場合、または何も入力しなかった場合、再度ユーザにyes or noの入力を要求します。

```
[ec2-user@example-ruby-sinatra-server ~]$ ruby example.rb 
----------------------------
スクリプトを実行しますか?
  スクリプトを実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
test
  yes または no を入力して下さい.
----------------------------
スクリプトを実行しますか?
  スクリプトを実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.

  yes または no を入力して下さい.
----------------------------
スクリプトを実行しますか?
  スクリプトを実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.

  yes または no を入力して下さい.
----------------------------
スクリプトを実行しますか?
  スクリプトを実行する場合は yes、実行をキャンセルする場合は no と入力して下さい.
no
  スクリプトを終了します.
[ec2-user@example-ruby-sinatra-server ~]$ 
```

備考
===

ちなみに、bashで同様の事を行うbashシェルスクリプトについても、以下にまとめてみました。

http://qiita.com/na0AaooQ/items/f2759c9b2c49d2210265

***

以上になります。
yumのすべてのコマンドにおいてエラーが出る

・サーバの情報
CentOS release 6.8 (Final)
Python 2.7.2


サーバ上でSSLの環境を整えた時点からyumでのすべてのコマンドにおいて下記のエラーが出ます。

ネット上にも同様のエラーの解決方法が多数ありましたが、どれを試してみても解決せず困っています。

-------

There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:

   /usr/lib64/python2.6/site-packages/pycurl.so: undefined symbol: CRYPTO_set_locking_callback

Please install a package which provides this module, or
verify that the module is installed correctly.

It's possible that the above module doesn't match the
current version of Python, which is:
2.6.6 (r266:84292, Jul 23 2015, 15:22:56) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]

If you cannot solve this problem yourself, please go to 
the yum faq at:
  http://yum.baseurl.org/wiki/Faq
  
------

現在のPythonのバージョンとエラーで書かれているPythonのバージョンが違いますがPython2.6.6が入っている状態でも同じエラーが出ていました。
何一つ改善しないのでPythonのバージョンを「試しにあげてみた」状態です。

当方Linux系のOSに関わることが初めてで完全なる初心者です。どうかお助けください。
【Android】TextViewのフォントを変更する

#【Android】TextViewのフォントを変更する

##環境
 - AndroidStudio 2.1.2
 - Java 1.8.0
 - Android 2.3.3

任意のフォントファイルをAssetsフォルダ内にコピーする。
※Assetsフォルダが存在しない場合は、
app/src/main を右クリック -> new -> Folder -> Assets Folder



```java:code.java
TextView textView = new TextView(this);
textView.setText("text");

Typeface typeface = Typeface.createFromAsset(getAssets(), "font_file_name");
textView.setTypeface(typeface);
nvmで現在アクティブになっているnode（のディレクトリ）へのシンボリックリンクを有効化するオプションNVM_SYMLINK_CURRENT


## はじめに

NVM_SYMLINK_CURRENTというnvmの便利なオプションの存在を知ったので簡単にまとめました。

## NVM_SYMLINK_CURRENTの概要

環境変数NVM_SYMLINK_CURRENTをtrueに設定すると、`nvm use`コマンドでnodeバージョンを切り替えたときにシンボリックリンク`$NVM_DIR/current`を生成し現在アクティブになっているnodeのディレクトリへリンクを貼ってくれます。


#### 公式からの引用
https://github.com/creationix/nvm#listing-versions

> nvm use will not, by default, create a "current" symlink. Set $NVM_SYMLINK_CURRENT to "true" to enable this behavior, which is sometimes useful for IDEs. Note that using nvm in multiple shell tabs with this environment variable enabled can cause race conditions.


## terminal上で動作確認

実際にNVM_SYMLINK_CURRENTを有効にするとどのように変化するかterminalで確認します。

```bash:terminal
$ nvm current
v6.2.2

# まだシンボリックリンクは存在しない
$ ls -l $NVM_DIR/current
ls: /Users/nooby/.nvm/current: No such file or directory

# オプションを有効にする
$ export NVM_SYMLINK_CURRENT=true

$ nvm use v5
Now using node v5.12.0 (npm v3.8.6)

$ which node
/Users/nooby/.nvm/versions/node/v5.12.0/bin/node

# node/v5.12.0ディレクトリへのリンクが生成される
$ ls -l $NVM_DIR/current
lrwxr-xr-x  1 nooby  staff  40 10 15 23:31 /Users/nooby/.nvm/current -> /Users/nooby/.nvm/versions/node/v5.12.0

$ nvm use v6
Now using node v6.2.2 (npm v3.9.5)

# node/v6.2.2のリンクへ切り替わる
$ ls -l $NVM_DIR/current
lrwxr-xr-x  1 nooby  staff  39 10 15 23:32 /Users/nooby/.nvm/current -> /Users/nooby/.nvm/versions/node/v6.2.2
```

このオプションを有効にすることでnvmで現在アクティブになっているnodeを`$NVM_DIR/current/bin/node`でも呼び出せるようになります。公式にも書かれていますがIDE等でnodeのpathを指定する際に便利そうな感じです。

## NVM_SYMLINK_CURRENTの常時有効化

このオプションを常に有効にするために.bashrcなどでnvmの初期化前に`export NVM_SYMLINK_CURRENT=true`を追加しておくといいですね。

```bash:.bashrc
# init nvm
export NVM_DIR="${HOME}/.nvm"
export NVM_SYMLINK_CURRENT=true # <= 追加
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm
```

## 所感

Sublime等の追加パッケージでnode_pathを指定しなければいけないことがあり、今まで`which node`の結果を直接指定していて気持ち悪いなと思っていましたが、NVM_SYMLINK_CURRENT を有効にすることで`/Users/nooby/.nvm/current/bin/node`を指定できるようになり、すっきりしました。


<span class="small">
今日始めてNVM_SYMLINK_CURRENTの存在を知ったのですがいつから存在していたのだろう。　知らなかっただけで最初からあったのかな。 googleでの検索結果が1000件程度しかなくあまり知られていなさそうな感じ。
</span>
Pythonの変数とオブジェクトについて

# ■ 変数について
プログラム言語では、変数とは、なんらかの値を格納する領域です。Pythonの場合、使用する前に変数を宣言する必要はありません。変数に値を代入した時点で、領域が用意されます。
Pythonのようなオブジェクト指向言語では、変数に値そのものが格納されるのではなく、変数の値を指し示す「リファレンス」が格納されると考えるとよいでしょう。

```
>>> name1 = "山田一郎"
```
◎図 n1
![n1.png](https://qiita-image-store.s3.amazonaws.com/0/47630/2b1407b1-b004-7f3f-1cf9-34116c38786d.png)


あるいは、「変数名」は値に設定されたタグのようなイメージでとらえてもかまいません。

◎図 n2
![n2.png](https://qiita-image-store.s3.amazonaws.com/0/47630/d915d623-0929-68db-d9ab-d73742321a97.png)

次のように、変数を別の変数に代入した場合には、同じ値を指し示すようになります。

```
>>> name1 = "山田一郎"
>>> name2 = name1
```
◎図 n3
![n3.png](https://qiita-image-store.s3.amazonaws.com/0/47630/2ea97fe6-5859-ffdf-b863-1f7ad81a4659.png)


# ■ id()関数でオブジェクトのIDを調べる
Pythonでは数値や文字列を含め、すべての値はオブジェクトです。オブジェクトのID（識別値）を調べるにはid()関数を使用します。変数名を引数にid()関数を実行すると参照しているオブジェクトのIDを表示します。前述の例で変数name1とname2のIDをid()関数で調べると、同じIDのオブジェクトを参照していることがわかります。

```
>>> name1 = "山田一郎"
>>> name2 = name1
>>> id(name1)
4339005200	←IDが同じ
>>> id(name2)
4339005200	←IDが同じ
```
# ■ 変数に値を再代入した場合
変数に別の値を再代入した場合にはどうでしょう？次の例では、まず、①で変数numに10を代入し、②で変数numの値に「1」を加えて、変数numに代入しています。

```
>>> num = 10	←①
>>> num = num + 1	←②
```
この場合、②で値が「11」の新たなオブジェクトが生成され、そのリファレンスが変数numに格納されます。つまり①と②では変数numは異なるオブジェクトを指し示しています。
このことはid()関数を使用して確かめられます。

```
>>> num = 10
>>> id(num)
4297538176
>>> num = num + 1
>>> id(num)
4297538208	←IDが変化した（参照先が変更された）
```
# ■ ミュータブルな値とイミュータブルな値
Pythonのデータ型は、後から値を変更可能な「ミュータブル」な型と、変更出来ない「イミュータブル」に大別されます。

ミュータブル	リスト、ディクショナリ、セット,....
イミュータブル	文字列、数値、タプル, ...

Pythonでは文字列や数値といった基本的なデータ型もイミュータブル、つまり後から変更出来ない型です。
さて、前述の例では変数numの値に1を足して、変数numに再代入していました。

```
>>> num = 10		←①
>>> num = num + 1	←②
```
これは一見、変数numの値を変更しているように見えるので、数値型はミュータブルな型なのでは？と思うかもしれませんが、実はそうではありません。id()関数の実行結果を見るとわかるように、①と②では、変数numは異なる値を指し示しているのです。

## ■ リストはミュータブル、タプルはイミュータブル
さて、Pythonでは「リスト」はミュータブル、つまり後から値を変更可能な型です。次の例では、3つの整数を要素とするリスト「ages」を生成し、3番目の要素を変更しています。

```
>>> ages = [1, 2, 3]
>>> ages[2] = 4
>>> ages
[1, 2, 4]
```
id()関数で調べると、当然のことながら要素の値を変更後もIDは変化していません。

```
>>> ages = [1, 2, 3]
>>> id(ages)
4338960072
>>> ages[2] = 4
>>> id(ages)
4338960072	←IDは同じ
```
それに対してタプルはイミュータブルな型です。要素の値を変更しようとするとエラーになります。

```
>>> nums = (1, 2, 3)
>>> nums[0] = 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```
## ■ 文字列もイミュータブル
文字列もイミュータブルな型です。したがって、次のように内部の文字を変更しようとするとエラーになります。

```
>>> str = "abc"
>>> str[1] = "d" # 2文字めに「"d"」を代入
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
```

誤解しやすい例として、次の例を見てみましょう。

```
>>> str = "abc"
>>> str = str + "bcd" # strと"bcd"を連結してstrに再代入 ←①
>>> str
'abcbcd'
```
この例では、①で変数strと文字列「"bcd"」を連結しているため、文字列が変更されたように見えますが、そうではありません。①で新たな文字列「"abcbcd"」が生成され、そのリファレンスが変数strに格納されるのです。
id()関数で調べると①の後でIDが変更されていることが確認できます。

```
>>> str = "abc"
>>> id(str)
4301952704
>>> str = str + "bcd"
>>> id(str)
4339056968	←IDが変化した
>>> str
'abcbcd'
```