OmniAICreator/Qiita-1.07M huggingface dataset:
cakePHP3にはfindOrCreateというものがあり

知ってますか？cakePHP3のTableにfindOrCreateというメソッドがあることを！
見つかったらEntityを、見つからなければ作って保存して、でEntityを返してくれるニクいやつです。
なぁ、僕は知らなかったわけで・・。


# ソースコード

こんな感じです。

```php:Table.php
public function findOrCreate($search, callable $callback = null)
    {
        $query = $this->find()->where($search);
        $row = $query->first();
        if ($row) {
            return $row;
        }
        $entity = $this->newEntity();
        $entity->set($search, ['guard' => false]);
        if ($callback) {
            $callback($entity);
        }
        return $this->save($entity) ?: $entity;
    }
```

引数として、where()中身を渡すことができます。
['id' => 10]みたいな配列のことですね。
DBにデータがなければ、それを元にEntityを作ってくれます。
何か足りなければ、callbackで更なる加工をすれば良いと思います。
ただし、entityに再度代入してないので、callbackの引数に'&'をつけてentityを加工する必要があるかと。


# おまけ：saveのreturn

returnで三項演算子が使われてるのですけど、パッと見て、save()に成功したらnullでも返すの？と勘違いしてしまいました。
調べたら、[公式](https://php.net/manual/ja/language.operators.comparison.php)にも書いてありました。

> PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。

つまり、save()の結果がtrueだったら、trueを・・・あれ？Entityがほしいんですけど。
で、更に調べると、どうもsave()は、falseかEntityを返すっぽいです。
ずっと、trueかfalseを返すものだと思ってた・・・。

```php:Table.php
public function save(EntityInterface $entity, $options = [])
    {
        $options = new ArrayObject($options + [
            'atomic' => true,
            'associated' => true,
            'checkRules' => true,
            'checkExisting' => true,
            '_primary' => true
        ]);

        if ($entity->errors()) {
            return false;
        }

        if ($entity->isNew() === false && !$entity->dirty()) {
            return $entity;
        }

        $connection = $this->connection();
        if ($options['atomic']) {
            $success = $connection->transactional(function () use ($entity, $options) {
                return $this->_processSave($entity, $options);
            });
        } else {
            $success = $this->_processSave($entity, $options);
        }

        if ($success) {
            if (!$connection->inTransaction() &&
                ($options['atomic'] || (!$options['atomic'] && $options['_primary']))
            ) {
                $this->dispatchEvent('Model.afterSaveCommit', compact('entity', 'options'));
            }
            if ($options['atomic'] || $options['_primary']) {
                $entity->isNew(false);
                $entity->source($this->registryAlias());
            }
        }

        return $success;
    }
```

思いの外、色々勉強になりました。
Azure Storage に REST API でアップロードする

下記とにらめっこして Azure Storage に PHP の curl で REST API でファイルをアップロードしてみました。

- [Azure ストレージ サービスの認証](https://msdn.microsoft.com/ja-jp/library/azure/dd179428.aspx "Azure ストレージ サービスの認証")
- [Put Blob](https://msdn.microsoft.com/ja-jp/library/azure/dd179451.aspx "Put Blob")

あらかじめ下記の３つは作成しておいてください。

- ストレージアカウント
- ストレージコンテナ
- ストレージのアクセスキー

アクセスキーは管理ポータルでストレージアカウントを選択した後の画面で、下のほうに項目が現れます。

![01-access-key.png][01-access-key.png]

プライマリとセカンダリで２つありますが使うのはどっちでもいいです。恐らくアクセスキーのローテートのために２つ設けられているのでしょう。

![02-access-key.png][02-access-key.png]

以下のようなコードで REST API でアップロードできます。

- Date のタイムゾーンは +0000 だとダメ
    - `\DateTime::RFC2822` とか `"r"` とかだとダメ
- `x-ms-*` のヘッダーはコロンの後にスペースがあるとダメ
- ストレージアクセスキーは Base64 エンコードされている
    - 署名で使うときにはデコードが必要
- HMAC は SHA256 です
- CanonicalizedResource にはストレージアカウント名も含みます
    - URL のパスとは一致しない

```php
<?php
// ストレージアカウント
$account = 'YOUR_STORAGE_ACCOUNT';

// ストレージコンテナ
$container = 'YOUR_STORAGE_CONTAINER';

// ストレージのアクセスキー
$accessKey = 'YOUR_STORAGE_ACCESS_KEY';

$filename = 'sample.txt';
$body = 'php with curl';
$type = 'text/plain';

$headers = [
    'x-ms-blob-type:BlockBlob',
    'x-ms-version:2014-02-14',
];

$date = gmdate('D, d M Y H:i:s T');
$size = strlen($body);

$stringToSign = [
    // VERB
    'PUT',
    // Content-Encoding
    '',
    // Content-Language
    '',
    // Content-Length
    $size,
    // Content-MD5
    '',
    // Content-Type
    $type,
    // Date
    $date,
    // If-Modified-Since
    '',
    // If-Match
    '',
    // If-None-Match
    '',
    // If-Unmodified-Since
    '',
    // Range
    '',
];

$stringToSign = array_merge($stringToSign, $headers, ["/$account/$container/$filename"]);
$stringToSign = implode("\n", $stringToSign);

$signature = base64_encode(hash_hmac('sha256', $stringToSign, base64_decode($accessKey), true));
$authorization = "SharedKey $account:$signature";

$headers = array_merge($headers, [
    "Authorization:$authorization",
    "Date:$date",
    "Content-Type:$type",
    "Content-Length:$size",
]);

$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => "https://$account.blob.core.windows.net/$container/$filename",
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => $body,
]);

curl_exec($ch);
```

[01-access-key.png]: https://qiita-image-store.s3.amazonaws.com/0/8734/e798526e-ec69-6e0e-de7a-e043dfd50d45.png
[02-access-key.png]: https://qiita-image-store.s3.amazonaws.com/0/8734/72d5c3d6-5ee9-c246-e768-bd4917c9a617.png
Ruby の Array#abbrev で略称を生成し、最小の入力で曜日を取得する

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Ruby の Array#abbrev で略称を生成し、最小の入力で曜日を取得します

## <i class="fa fa-cube" style="font-size:1em;"></i> Abbrev modue, Array#abbrev
`Abbrev.abbrev(array)`
もしくは
`Array#abbrev`
で、配列の短縮形を取得します。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-file-text" style="font-size:1em;"></i> 仕様
曜日を最小入力で取得できるようにします。

### <i class="fa fa-code" style="font-size:1em;"></i> コード

~~~ruby
require 'abbrev'
require 'pp'

weeks = %w(Sunday Monday Tuesday Wednesday Thursday Friday Saturday)
abbrev_week = weeks.abbrev
pp abbrev_week, "\n"
print Abbrev.abbrev(weeks) == abbrev_week
puts
%w(S Su Sa T Tu Th F).each do |key|
  week = abbrev_week[key]
  print "input #{key} : key = "
  puts week.nil? ? 'not exist' : week
end
~~~

### <i class="fa fa-check-circle" style="font-size:1em;"></i> 動作確認

~~~bash
{"Sunday"=>"Sunday",
 "Sunda"=>"Sunday",
 "Sund"=>"Sunday",
 "Sun"=>"Sunday",
 "Su"=>"Sunday",
 "Monday"=>"Monday",
 "Monda"=>"Monday",
 "Mond"=>"Monday",
 "Mon"=>"Monday",
 "Mo"=>"Monday",
 "M"=>"Monday",
 "Tuesday"=>"Tuesday",
 "Tuesda"=>"Tuesday",
 "Tuesd"=>"Tuesday",
 "Tues"=>"Tuesday",
 "Tue"=>"Tuesday",
 "Tu"=>"Tuesday",
 "Wednesday"=>"Wednesday",
 "Wednesda"=>"Wednesday",
 "Wednesd"=>"Wednesday",
 "Wednes"=>"Wednesday",
 "Wedne"=>"Wednesday",
 "Wedn"=>"Wednesday",
 "Wed"=>"Wednesday",
 "We"=>"Wednesday",
 "W"=>"Wednesday",
 "Thursday"=>"Thursday",
 "Thursda"=>"Thursday",
 "Thursd"=>"Thursday",
 "Thurs"=>"Thursday",
 "Thur"=>"Thursday",
 "Thu"=>"Thursday",
 "Th"=>"Thursday",
 "Friday"=>"Friday",
 "Frida"=>"Friday",
 "Frid"=>"Friday",
 "Fri"=>"Friday",
 "Fr"=>"Friday",
 "F"=>"Friday",
 "Saturday"=>"Saturday",
 "Saturda"=>"Saturday",
 "Saturd"=>"Saturday",
 "Satur"=>"Saturday",
 "Satu"=>"Saturday",
 "Sat"=>"Saturday",
 "Sa"=>"Saturday"}
"\n"
true
input S : key = not exist
input Su : key = Sunday
input Sa : key = Saturday
input T : key = not exist
input Tu : key = Tuesday
input Th : key = Thursday
input F : key = Friday
~~~
Unity4系、5、5.1について

#はじめに
現在のUnityについて簡単に説明します。

Unity3系〜4系に移行したときはまだ、中の人がワークショップとか開いていましたが、現在は基本的に有料です。
詳しくはWebで。

で多分最新では無い情報になってしまうので私の環境のお話になります。

使用Unity
unity4.6.1f1,unity4.6.5p2,unity5.0.1p4,Unity 5.1.0f2

#Unity4系の役割
あと数日後ですが、iOSが64bitビルド以外のアプリをストアから抹殺します。
unity昔のバージョンに近いもので64bit化できるのがunity４系になります。
アセットなんかも最新版に対応したものばかりでは無いため、安定バージョンと言う形になると思われます。

#Unity5系
つい数月前にリリースされたバージョンでphysics baseの描画機能が主にPCで盛り込まれています。
契約体系やクラウド周りが大幅に変更されています。

#Unity5.1系
Oculus用にカメラとかできるバージョンです。OVRがいらないらしいが...
Ruby on Railsを学ぶときに常に意識しておけばよかった10のこと


プログラミングの土地勘がない状態で、RubyやRailsを勉強しだすとまあ100%挫折しますね。なんでかっていうと、Webやインターネットの知識や、数学やプログラミングの原理など下地になる考え方やお作法があって、それに慣れていないと1つ1つの概念が頭に入ってこないから。

これは会計でも同じで、例えば税効果会計って、費用収益対応の原則や法人税に対する理解がないと1つ1つの処理がなぜそうなっているのか腹落ちしない。

なので、この投稿では、僕が仕事の合間を縫って悶絶しながらRubyを勉強して、あーでもないこーでもないと考えて、現時点でこの考え方を押さえておけばもっと学習時間を短縮できたなーということをまとめようと思う。正直まだ僕は初心者レベルなので、もしかしたら間違っていることもあるかもしれないので、その場合はその都度修正させてください。

# 1. オブジェクトとメソッドと変数の関係を正しく捉える
オブジェクト＝Rubyで扱える全てのデータ
メソッド＝オブジェクトを操作/処理するもの
変数＝オブジェクトを繰り返し呼び出すためにオブジェクトを格納するもの

だと思うのですが、最初はデータ＝変数だと思っていて、どこかでつまずいた記憶がある。オブジェクトをメソッドで操作する、オブジェクトを変数に格納する、という関係が整理できたときになにかしっくりきた。

# 2. ハッシュと配列は変数の進化系（のようなもの）
ハッシュはキーバリューストアの形式で複数のオブジェクトを１つの変数に格納するもの、配列は順番の形式で複数のオブジェクトを１つの変数に格納するものだと思うのですが、ハッシュも配列も1つの変数に格納しているんだ、ということをもっと強く意識していれば混乱しなかった場面があった。

# 3. メソッドと変数の関係（クラス、インスタンスは関係ない世界で）
メソッド外で定義した変数はメソッドの中で使えないので、引数を使ってメソッドの呼び出し側からその変数をメソッド側に渡すと思うのですが、変数を使うときに常に変数のスコープを意識する癖をつければよかった。。　変数を適当に使ってエラーが出ること多数。

# 4. なぜクラスを用いるのか
クラスに限らずですが、1つ1つの仕組みって、これを実現したいということがあるからその仕組みを作ったと思うんですよね。共通のメソッドと、共通の変数を定義しておきたいから、クラスで定義する。なんでそれが必要なの？と深く考えること大事。例えば、HTMLにstyleに関することを直書きせずに、共通するものはCSSにまとめるっていうことは前から知ってたから、その感覚でクラスを定義する意義を捉えられたかもしれない。

# 5. クラスとインスタンスの違い
クラスはあくまで型で、インスタンスはその型をつかって生成されるもの。設計図と車でも、タイ焼きの型とタイ焼きでもいいんだけど、クラスとインスタンスがかなり違うものだと意識しないと、このあとのそれぞれのメソッドと変数のところの学習でつまずいた。

# 6. メソッドと変数の関係ふたたび（インスタンスで定義した場合）
もう一度振り返ると、共通のメソッドと、共通の変数を定義しておきたいから、クラスを定義する。クラスを元に複数のインスタンスを生成する。インスタンスでのみ使える共通のメソッドと共通の変数をクラスで定義できて、それがインスタンスメソッドとインスタンス変数。

ちょっとややこしい話ですが、インスタンス変数がインスタンスでのみ使用できるを裏返せば、あるクラスで定義していないインスタンス変数はそのあるクラスから生成したインスタンスの中では使えないということだと思うのですが、これと上記3.でのメソッドで定義していない変数はメソッドの中で使えない（から引数を使ってね）ということが、クラスが絡んでいるかで別次元の話だと捉えられるようになるのに時間がかかった。

# 7. クラスの継承の意義
複数のクラスに同じメソッド、同じ変数を定義したいときに、楽をしたいからクラスの継承を行うと思うのですが、この意義を明確に理解しておけば、なぜモデルクラスが大体

```
class Modelname < ActiveRecord::Base
end
```
となっているかが一発で理解できたと思う。

# 8. RailsはRubyのGemの1つ
これ僕だけかもしれませんが、最初はソースコードをみて、どこがRubyでどこがRailsか分からないとか発言していました。そうではなく、RailsはRubyのGemの1つという話を聞いて、これがいいか分かりませんが、そんなにRailsがどうだとか意識しなくなりしっくりくるようになりました。

# 9. リクエストからレスポンスまでの処理の流れ
MVCの概念は初見では苦しみますね。これはリクエストからレスポンスまでの一連の流れを教えてもらったときに初めて理解できた気がします。

1.クライアントがどのURLをリクエストしたら、どのコントローラのどのアクション（＝コントローラークラスで定義するインスタンスメソッド）を呼び出すかをルーティングで設定しておく
2.コントローラーのアクションでモデルを利用して、データベースにあるテーブル（テーブルの設計図であるマイグレーションファイルを実行して生成）からデータを引き出し、インスタンス変数でビューに渡す
3.コントローラーのインスタンスメソッド１つにつきビューファイルを基本的に１つ作り、コントローラーがレンダリングしたviewをクライアントにレスポンスとして返す

とくにURLのリクエストがメソッドの呼び出しなんだ、というところが盲点でした。

# 10. MVCモデルでのインスタンス変数のスコープ
上記6.のとおり、インスタンス変数はインスタンスでしか使えないのでした。ただし、上記9.のようにコントローラークラスのアクション（＝コントローラークラスで定義するインスタンスメソッド）にインスタンス変数を定義したら、そのインスタンスメソッドに対応したviewの中でインスタンス変数を呼び出せる。これは2つ違う話として押さえないとこんがらがった。
[Unity] PostProcessでビルド後に処理を差し込む


Unityではゲームを作る以外にも色々なところで自作のスクリプトを差し込むことができます。
今回はPostProcessについて書いておこうと思います。

-------------------------------------------

Post Processは「あと処理」を意味する英単語です。
つまり、Unityでビルドを行ったのち、あと処理を差し込むことができます。
利用例としては自作のプラグインを作っている場合に、その設定ファイルを書き出したり、あるいはUnityが書き出したファイルに置換処理を入れたり、といったことが可能になります。

## ルール

1. **/Assets/Editor**以下に置く。（Editor Scriptとして認識させればOK）
2. `public static`なメソッドに`[PostProcessBuild(N)]`属性を付与。
	3. `(N)`は実行順序

例) [ドキュメント](http://docs.unity3d.com/ScriptReference/Callbacks.PostProcessBuildAttribute.html)には以下のように記載があります。

```cs:post-process
// C# example:
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
	
public class MyBuildPostprocessor {
	[PostProcessBuildAttribute(1)]
	public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) {
		Debug.Log( pathToBuiltProject );
    	}
}
```

*ドキュメントでは`PostProcessBuildAttribute`となっていますが、`PostProcessBuild`でも大丈夫でした。違いはちょっと分かってません；*

## ファイルを書き換えるサンプル

試しに、Unityが書きだした`UnityAppController.mm`を書き換えるサンプルを示します。
`OpenGLES`を`OpenGLESHoge`に置換するものです。
意味がないどころか動かなくなりますが、サンプルということでｗ


```cs:PostProcess-replace-sample
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using System.Collections;
using System.IO;

public class PostProcessTest {

	[PostProcessBuild (100)]
	public static void OnPostProcessBuild(BuildTarget target, string path) {
		#if UNITY_5_0
		if (target == BuildTarget.iOS) {
		#else
		if (target == BuildTarget.iPhone) {
		#endif
			RewriteObjCFiles(path);
		}
	}

	/// <summary>
	/// Rewrites the Objective-C files.
	/// </summary>
	/// <param name="path">File path.</param>
	private static void RewriteObjCFiles(string path) {
		string filePath = System.IO.Path.Combine(path, "Classes/UnityAppController.mm");
		if (File.Exists(filePath)) {
			ReplaceStringInFile(filePath, "OpenGLES", "OpenGLESHoge");
		}
	}

	/// <summary>
	/// Replaces the string in the file.
	/// </summary>
	/// <param name="file">File path</param>
	/// <param name="target">Target string</param>
	/// <param name="replaceText">Replace text</param>
	private static void ReplaceStringInFile(string file, string target, string replaceText) {
		if (!File.Exists(file)) {
			return;
		}

		// 置換後のテキスト
		string processedContents = "";

		using (StreamReader stream = new StreamReader(file)) {
			while (stream.Peek() >= 0) {
				string line = stream.ReadLine();
				processedContents += line.Replace(target, replaceText) + "\n";
			}
		}

		// 既存ファイルを削除し、置換後のテキストで新規作成
		File.Delete(file);

		using (StreamWriter stream = File.CreateText(file)) {
			stream.Write(processedContents);
		}
	}
}
```

こんな感じで簡単に置換を行うことができます。
ちなみに`OnPostProcessBuild`はそれっぽい名前になっていますが、任意のメソッド名で大丈夫です。
（が、分かりやすさのために上記のような名称にしておいたほうがいいでしょう）

あとは普通にビルドするとビルド後に上記のスクリプトが実行され、該当箇所が置換されて書き出されるようになります。
Action Mailer preview_path warningについて、調べてみたこと


## 気になったこと

ActionMailerのpreview_pathをデフォルト値以外の値に設定すると、Action Mailer preview_path is not the RSpec default.'というwarningが出力されます。少し気になって調べてみました。

## 調査

既に[ココ](https://github.com/rspec/rspec-rails/pull/1327)でも議論されていました。
「このwarning,本当に必要?」「削除します」という事で、[pull request](https://github.com/rspec/rspec-rails/pull/1327)も投げられていますね。

![スクリーンショット 2015-05-24 23.11.04.png](https://qiita-image-store.s3.amazonaws.com/1489/34321/48548a0d-bbd9-49cc-678f-1aa81e023005.png "スクリーンショット 2015-05-24 23.11.04.png")


## 結論

>This removes the unnecessary warning about a preview path set to a
location other than /spec/mailers/preview.

[Changelog](https://github.com/rspec/rspec-rails/blob/master/Changelog.md)によれば、このwarningは以降のリリース(rspec-rails 3.2.1以降)で削除されるようです。
Slackで特定のボットやユーザーを無視するgreasemonkeyスクリプト

# 背景

[CSS - slack で join/left のメッセージを消す - Qiita](http://qiita.com/shimacpyon/items/1a4ff31cada3c60f9c59)
とか
[Slack - 人間の会話だけに絞る - Qiita](http://qiita.com/laiso/items/27d2328ddcae442ae9bf)
とか
[Slackで特定の名前を持つボットやユーザーをミュートするブックマークレット - Qiita](http://qiita.com/sifue/items/c53ec647ffe2f17fb149)
とかに触発されてgreasemonkeyスクリプトを書きました。
slackドメインのページを開くと勝手にそれらを実行してくれます。

# コード

[Ignore Slack User - Greasy Fork](https://greasyfork.org/ja/scripts/10042)

```js
// ==UserScript==
// @name         Ignore Slack User
// @namespace    https://greasyfork.org/ja/scripts/10042
// @version      1.0.0
// @description  Ignore a user in Slack
// @author       bigwheel
// @match        https://*.slack.com/*
// @grant        none
// ==/UserScript==

// ここに無視したいユーザー・ボットの名前を並べる
var usersToBeIgnored = new Array("user1", "user2");

if(document.body) {
    $("#msgs_div").on('DOMSubtreeModified propertychange', function() {
        usersToBeIgnored.forEach(function(user) {
            $("div.message > *.message_sender:contains(" + user + ")").parent().hide();
        });

        // ボットメッセージを一括無視したい場合はコメントイン
        // $(".bot_message").hide();
        
        // join/left メッセージを無視
        $(".joined").hide();
        $(".left").hide();
    });
};
```

## 使い方

無視したいボット・ユーザーの名前をusersToBeIgnoredへ書いてください。
またボットのメッセージをすべて非表示にしたい場合は真ん中のコードをコメントインすればOK。
for文内で宣言するクロージャにインクリメントする引数を渡してはいけない


別に言語は関係なさそうだけど、よくわかっていなかったのでメモ。
ページングの実装でリスナーを生成するときにハマった。初心者は気をつけよう。

## Swift

```Swift
func getF(num:Int) -> Void -> Void {
  return {
    println(num)
  }
}

var list1: [(Void -> Void)] = Array()
var list2: [(Void -> Void)] = Array()
var list3: [(Void -> Void)] = Array()
for (var i = 0; i < 3; i++) {
  let n = i
  list1.append({println(n)})
  list2.append({println(i)})
  list3.append(getF(i))
}
for f in list1 { f() } // 0 1 2
for f in list2 { f() } // 3 3 3
for f in list3 { f() } // 0 1 2
```

Javaについてコメントいただいたので、Javascriptも試してみた。

## Javascript

```Javascript
var list1 = []
var list2 = []
var list3 = []
function getF(num) {
  return function() {
    console.log(num)
  }
}
for (var i = 0; i < 3; i++) {
  var n = i
  list1.push(function(){console.log(n)})
  list2.push(function(){console.log(i)})
  list3.push(getF(i))
}
list1.forEach(function(f){f()}) // 2 2 2
list2.forEach(function(f){f()}) // 3 3 3
list3.forEach(function(f){f()}) // 0 1 2
```

こちらは一旦別の変数に入れる対応でもだめみたい。

ES6ならletでイケる！とのコメントをいただいたのでこちらも試してみた。
[こんなサービス](http://www.es6fiddle.net/)があるあたり流石js界隈。

## ES6

```javascript
var list1 = []
var list2 = []
var list3 = []
function getF(num) {
  return function() {
    console.log(num)
  }
}
for (let i = 0; i < 3; i++) {
  let n = i // var だとダメだった( 2 2 2 )
  list1.push(function(){console.log(n)})
  list2.push(function(){console.log(i)})
  list3.push(getF(i))
}
list1.forEach(function(f){f()}) // 0 1 2
list2.forEach(function(f){f()}) // 0 1 2
list3.forEach(function(f){f()}) // 0 1 2
```

```let n = i``` のところを ```var n = i```と書いたらダメだった。
まあletがあるということは、ES6は基本var は使わない方がいいということなのかな。
JavaScript の関数と変数のスコープ

[JavaScript Ninjaの極意](http://www.amazon.co.jp/dp/4798128457) という書籍を読んでいます。
その序盤に JavaScript の関数や変数のスコープについての説明がありました。
そこに掲載されていた図が非常に分かりやすかったので、備忘録がてら共有したいと思います。
基本的な内容ですが、他の言語 (僕にとっては Ruby) と比べて少し特殊で忘れてしまいがちですので。

![JavaScript のスコープ.png](https://qiita-image-store.s3.amazonaws.com/0/6697/b3bfb340-361f-dcda-f91a-fb847afc9f89.png)

以下の 2 点がポイントだと思います。

* 関数のスコープはそれを含む関数の先頭まで巻き上げ (hoisting) られる。
   * 関数 innerBarrier のスコープを参考のこと。
* 変数のスコープはブロックの境界を超える。
   * 変数 mami のスコープを参考のこと。
【swift】 UITableViewで長押ししたセルのindexPath.rowを取得する方法


TableViewのセルをタップした際は、
`func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)`
で問題なく`indexPath`を取得できます。

しかし長押し(UILongPressGestureRecognizer利用)したセルの`indexPath`を取得する方法は簡単には行かなかったので、その方法を共有します。


# まずは、`UILongPressGestureRecognizer`をtableViewに設定。
* 長押しされた際、`cellLongPressed:`メソッドでイベントを受け取ります。
* tableViewにlongPressGestureRecognizerをaddする。

```swift:swift
// UILongPressGestureRecognizer宣言
var longPressRecognizer = UILongPressGestureRecognizer(target: self, action: "cellLongPressed:")

// `UIGestureRecognizerDelegate`を設定するのをお忘れなく
longPressRecognizer.delegate = self

// tableViewにrecognizerを設定
tableView.addGestureRecognizer(longPressRecognizer)
```

# 長押ししたセルのindexPath.rowを取得。
* 長押しした位置からcellのindexPathを取得。

下記の`println("長押しされたcellのindexPath:\(indexPath?.row)")`で
`indexPath?.row`を取得できます。

```swift:swift
/* 長押しした際に呼ばれるメソッド */
func cellLongPressed(recognizer: UILongPressGestureRecognizer) {
		
		// 押された位置でcellのPathを取得
        let point = recognizer.locationInView(tableView)
        let indexPath = tableView.indexPathForRowAtPoint(point)
        
        if indexPath == nil {
        
        } else if recognizer.state == UIGestureRecognizerState.Began  {
            // 長押しされた場合の処理
            println("長押しされたcellのindexPath:\(indexPath?.row)")
         }
    }
```

# 参考
下記の記事を参考に「swift」で書き直しました。
http://iritec.jp/iphone/848/
docker-composeでChatWork用のhubot環境を作る

すごい冗長な気がするけど

- hubot with chatwork adapter
- redis
- redisのData Volume Container

の3つのdockerコンテナをdocker-composeで管理できるようにしてみました。

# 前提

- Mac OS X 10.10.3
- virtualbox 4.3.28
- homebrew
- node.js

# 手順

## dockerインストール

今回はboot2docker上でdockerを動かします。

```sh
brew install boot2docker
```

boot2docker VMを作成して起動します。

```sh
boot2docker init
boot2docker start
```
環境変数をセットします。

```sh
$(boot2docker shellinit)
```

## docker-composeインストール

```sh
brew install docker-compose
```

## hubot環境を作る

ローカルにhubot環境を作ります。
公式に倣ってyeomanでひな形を生成します。

[HUBOT](https://hubot.github.com/docs/)

```sh
npm install -g yo generator-hubot
mkdir myhubot
cd myhubot
yo hubot
```

幾つか質問されます。Bot adapterには`chatwork`と入力します。

ひな形が生成されたらカレントディレクトリにある`external-scripts.json`を開きます。
今回herokuは使わないので`hubot-heroku-keepalive`を消しておきます。

## hubotコンテナのDockerfileを書く

上記でhubotのひな形を作ったプロジェクトのルートディレクトリに`Dockerfile`を置きます。

```
FROM node:latest

ENV BOT_HOME /bot

RUN mkdir $BOT_HOME
WORKDIR $BOT_HOME

ADD ./package.json $BOT_HOME/
RUN npm install

ADD . $BOT_HOME

CMD ["bin/hubot", "--adapter", "chatwork"]
```

先に`package.json`だけを`ADD`して`npm install`することで、`package.json`に変更がなければbuildをスキップさせることができます。RailsのDockerfile内でGemfileに対して使われている手法を真似してみました。

## .dockerignoreファイルを作る

build時に変更があったことを検知してほしくないファイルは無視されるようにしておきます。

```
## node
node_modules

.git

## log
.hubot_history

## OSX
.DS_Store
```

## docker-compose.ymlを書く

hubotはDockerfileからbuild、redisとData Volume Containerはimageから作ります。
この`docker-compose.yml`もプロジェクトのルートに置きます。

```yaml
redis:
  restart: always
  image: redis:latest
  command: redis-server --appendonly yes
  volumes_from:
    - storage

storage:
  restart: always
  image: busybox:latest
  volumes:
    - /var/lib/redis:/data
  
hubot:
  restart: always
  build: .
  ports:
    - '8190:8080'
  environment:
    REDIS_URL: redis://redis:6379
    HUBOT_CHATWORK_TOKEN: 
    HUBOT_CHATWORK_ROOMS: 
    HUBOT_CHATWORK_API_RATE: 420
    TZ: Asia/Tokyo
  links:
    - redis
```

hubotコンテナの環境変数にはredisの接続に必要な`REDIS_URL`と、[chatwork用hubotアダプター](https://github.com/akiomik/hubot-chatwork)の環境変数、あとはタイムゾーン設定をする`TZ`を設定してみました。
環境変数は、値を空にすることで`docker-compose up`時にhostマシンに設定されている同じ名前の環境変数を読み込ませる事ができます。セキュアな情報を書きたくない時に便利ですね。

[Compose yml - Docker Documentation](https://docs.docker.com/compose/yml/#environment)

一応8190ポートでhubotにアクセスできるようにしていますが、chatworkと連携するだけならこれは特に必要ないです。

## 起動

先にhostのMac側でchatworkの環境変数を設定しておきます。

```sh
export HUBOT_CHATWORK_TOKEN=XXXXXXXXXXXXXXXXXX
export HUBOT_CHATWORK_ROOMS=XXXXXX,XXXXXX
```

プロジェクトのルートディレクトリで起動します。

```sh
docker-compose up -d
```

`up`コマンドはbuildから起動まで全部まとめてやってくれます。

[Compose command line - Docker Documentation](https://docs.docker.com/compose/cli/#up)

`-d`オプションを付けることでバックグラウンドで起動しています。

これでhubotが動くようになりました。chatwork上で話しかけたらなんか答えてくれると思う。
ソースはGitHubに置いています。

[distkloc/docker-hubot-chatwork](https://github.com/distkloc/docker-hubot-chatwork)

## 参考

- [複雑な構成のrailsアプリをdockerで動かしたい場合はどうするべきか - Qiita](http://qiita.com/k-shogo/items/3c887cbf86b3cab85b72)
- [Docker + Yeoman + Hubot + Slack で簡単bot作成](http://blog.fenneclab.com/docker-yeoman-hubot-slack/)
【Sass】フィボナッチ数列の第n項を求めるカスタム関数

#<i class="fa fa-book" style="font-size:1em;"></i> はじめに

Sassの関数は、予め用意された関数以外にも、自分で好きな関数を定義することができます。

```

@function 自作関数名($引数){

    @return 戻り値;

}


```

この`@function`で、フィボナッチ数列の第n項を求める関数を定義しました。

#<i class="fa fa-book" style="font-size:1em;"></i> 内容

自作の関数を定義する`@function`ディレクティブ以外にも、Ruby ARIを使った自作関数を定義することができますが、
今回はそんなに複雑では無いので、今回はSassのみで書いた。（そもそもRuby知らないのでいづれは・・・）

Sassでフィボナッチ数列の第n項を求めて、デザインに活用できないかなーと。

以下、そのコードです。

```css

@function fib($value){
	@return f(1, 1, $value);
}

@function f($a, $b, $c){

	@if $c <= 2 {
		@return $a;
	}

	@return f($a + $b, $a, $c - 1);
}

div{
	width: fib(7)px;
}


```

`@function`内に`@function`は無理だった。
2つ目の関数`f()`は、`@return`から`f()`内で再帰呼び出し。

`fib(n)`でnに引数を指定して関数を実行。
nに入るのが数列のn番目に当てはまります。

#<i class="fa fa-book" style="font-size:1em;"></i> コンパイル結果

```css

div { width: 13px; }


```

n番目に当てはまる数列の値が返ってくる。
PowerPoint VBA Shape.Typeプロパティの値一覧

調べるのが面倒だったので覚書

| Shape.Typeプロパティ | 値|
|:---|:---:|
|msoShapeTypeMixed|-2| 
| msoAutoShape | 1 |
| msoCallout | 2 |
| msoChart | 3 |
| msoComment | 4 |
|msoFreeform | 5 | 
|msoGroup | 6 |
|msoEmbeddedOLEObject| 7 |
|msoFormControl | 8 |
|msoLine| 9 |
|msoLinkedOLEObject | 10 |
|msoLinkedPicture | 11 |
|msoOLEControlObject |  12 |
|msoPicture| 13| 
|msoPlaceholder|14| 
|msoTextEffect| 15 |
|msoMedia|  16 | 
|msoTextBox| 17| 
|msoScriptAnchor| 18 |
|msoTable| 19 |
| msoCanvas | 20 | 
|msoDiagram| 21 |
|msoContentApp| 27|

下記のように判定する。
選択したシェイプのShape.TypeプロパティがmsoAutoShapeの場合：

```vbnet:イミディエイトウィンドウ

?ActiveWindow.Selection.ShapeRange.Type
1

```
PowerPoint内のテキストを取得する

## やりたいこと
PowerPointの各スライドのテキストを取得する。

## ソースコード
下記のコードで取得できる。グループ化されたオブジェクトにも対応。
ただし、グラフには未対応。

```vbnet:Module1.bas

Public Sub FindText3()
    Dim sld As Slide
    Dim sh As Shape
    Dim clm As Column
    Dim cl As Cell
    Dim art As SmartArtNode
    Dim grp As GroupShapes
    
    For Each sld In ActivePresentation.Slides
        For Each sh In sld.Shapes
        
            'テキストボックス、プレースホルダ、オートシェイプの場合
            If sh.HasTextFrame Then
                Debug.Print sh.TextFrame.TextRange.text
                
            '表の場合
            ElseIf sh.HasTable Then
                For Each clm In sh.Table.Columns
                    For Each cl In clm.cells
                        Debug.Print cl.Shape.TextFrame.TextRange.text
                    Next
                Next

            'グラフの場合
            ElseIf sh.HasChart Then
                If sh.Chart.HasTitle Then Debug.Print sh.Chart.Title
            
            'スマートアートの場合
            ElseIf sh.HasSmartArt Then
                For Each art In sh.SmartArt.Nodes
                    Debug.Print art.TextFrame2.TextRange.text
                Next

            'グループの場合
            ElseIf sh.Type = msoGroup Then
                For Each gsh In sh.GroupItems
                    If gsh.HasTextFrame Then Debug.Print gsh.TextFrame.TextRange.text
                Next
            
            End If

        Next
    Next
End Sub

```
## 参考
下記のコードを参考にしました。

1. [各スライドに配置されたオートシェイプからテキストを取得するPowerPointマクロ](http://www.ka-net.org/blog/?p=2327)
2. [PPTファイル上の全文字列をExcelに出力するパワポマクロ](http://www.relief.jp/itnote/archives/018395.php)
Apache設定ファイルにおけるSection1と2の違い、あるいはGlobal EnvironmentとMain server configurationの違いについて

Apache設定ファイル (/etc/httpd/conf/httpd.conf) にはSectionという概念があります。
このSection1とSection2の違いについて明確に説明できるでしょうか？


```
### Section 1: Global Environment
#
# The directives in this section affect the overall operation of Apache,
# such as the number of concurrent requests it can handle or where it
# can find its configuration files.
#
```

```
### Section 2: 'Main' server configuration
#
# The directives in this section set up the values used by the 'main'
# server, which responds to any requests that aren't handled by a
# <VirtualHost> definition.  These values also provide defaults for
# any <VirtualHost> containers you may define later in the file.
#
# All of these directives may appear inside <VirtualHost> containers,
# in which case these default settings will be overridden for the
# virtual host being defined.
```

セクション1は「グローバル」、セクション２は「メイン」と書かれているのですが、どっちも言葉の意味が似てるのでわかりにくいですね。

設定ファイル上もセクション１と２の間に明確な文法的仕切りがない（単にコメントで仕切られているだけ）ことが、わかりにくさを後押ししているようです。

# わけて理解する必要あるの？

なぜセクション１と２の違いを理解する必要があるのかというと、「コンテキスト」が関係するからです。

http://httpd.apache.org/docs/2.4/ja/mod/directive-dict.html#Context

|セクション|コンテキスト|
|---|---|
|セクション１|サーバ設定ファイル(server config)|
|セクション２ |バーチャルホスト(virtual host)|

# 違いは`<VirtualHost>`内で設定を上書きできるかどうか

セクション２に書いてる設定は、「バーチャルホストのデフォルト設定」です。
つまり、個別の<VirtualHost> 内で上書きが可能です。

なので、セクション１の範疇である`ServerRoot`,`User`,`PidFile`などは`<VirtualHost>`内で上書きすることはできないのです。

たしかによく考えてみると、`User`や`PidFile`などはリクエスト毎の設定ではなくデーモン単位の設定なので、これはうなづけますね。
サーバー構築・LAMP設定（メモ）

>　サクラVPS CentOS release 6.5 2015/05/21
>　***参考***
>　http://qiita.com/junki0605/items/6ce3df1933ef6d31ddfa

root権限で作業する。
>```
>$ su
>```

#Apache（webサーバー）設定

Apacheをインストールする

```
$　yum -y install httpd
```
Apacheが常に自動で起動するようにする

```
$ chkconfig httpd on
```
設定ファイルをいじってセキュリティを高める

```
$ cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
$ vim /etc/httpd/conf/httpd.conf
```
下記を変更

```
ServerTokens OS
  |
ServerTokens Prod
```

```
ServerSignature On
  |
ServerSignature Off
```

```
Options Indexes FollowSymLinks
  |
Options -Indexes FollowSymLinks
```
保存したら、下記コマンドで構文チェック

```
Service httpd configtest
```
Apacheを起動する

```
$ service httpd start
```
IPアドレスをブラウザからたたいてテストページが表示されれば成功！
OS起動時にApacheも自動で起動されるかチェック

```
$ chkconfig --list httpd
```

```
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
```
の様になればオッケー
#phpの設定
phpのインストール

```
$ yum -y install php php-mbstring php-mysql php-gd
```
設定ファイルをいじる

```
$ cp /etc/php.ini/ /etc/php.ini.org
$ vim /etc/php.ini
```
以下を変更

```
;error_log = php_errors.log
  |
error_logs = /var/log/php_errors.log
```

```
;mbstring.language = japanese
  |
mbstring.language = Japanese
```

```
;mbstring.internal_encoding = EUC-JP
  |
mbstring.internal_encoding = UTF-8
```

```
;mbstring.http_input = auto
  |
mbstring.http_input = auto
```

```
;mbstring.detect_order = auto
  |
mbstring.detect_order = auto
```

```
expose_php = on
  |
expose_php = off
```

```
;date.timezone = 
  |
date.timezone = Asia/Tokyo
```
保存したら、設定を反映

```
$ service httpd restart
```
#Mysqlの設定
mysqlをインストール

```
$ yum -y install mysql-server
$ rpm -qa mysql-server
```
設定ファイルをいじる

```
$ vim /etc/my.cnf
```
以下を記述
```
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8
skip-character-set-client-handshake
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
```
設定を反映

```
$ service mysqld start
```
サーバー構築・初期設定（メモ）

>　サクラVPS CentOS release 6.5 2015/05/21
>　***参考***
>　http://qiita.com/junki0605/items/6ce3df1933ef6d31ddfa


#rootでサーバーに接続

##サーバーに接続

```bash
$ ssh root@***.**.**.***
```

##rootパスワードの変更

```bash
$ passwd
```

##yum updateと日本語化

```bash
$ yum update
```

```bash
$ vim /etc/sysconfig/i18n
```
***変更前***

```bash
LANG="C"
```
***変更後***

```bash
LANG="ja_JP.UTF-8"
```

##作業用ユーザーの作成と設定

```
$ useradd chou
$ passwd  chou
```
新規ユーザ（chou）をルート権限を得られるグループに追加

```bash
$ usermod -G wheel chou
```

```
$ visudo
```
2行目の#を外して保存。これでwheelグループに属するユーザにsudoコマンドの実行を許可する。

```
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
```

#作業ユーザーでサーバーに接続

> ```
>$ ssh chou@xxx.xx.xx.xxx
>```

##鍵認証の設定
公開鍵を入れるディレクトリをサーバーのホームディレクトリに作成しておく。

```
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
```

クライアント側（mac）でssh鍵ペアを作成

```
$ ssh-keygen
```
すると、〜/.ssh　フォルダにid_rsa（秘密鍵）とid_rsa.pub（公開鍵）が作成される。

```
$chmod 600 ~/.ssh/id_rsa.pub
```
次に公開鍵をサーバーに転送

```
$ scp ~/.ssh/id_rsa.pub chou@xxx.xx.xx.xxx:~/.ssh/authorized_keys
```
で公開鍵をサーバーに転送し、authorized_keysという名前で保存する。
これで、鍵認証でssh接続できるようになりました。

#ssh接続のセキュリティ設定
設定ファイルを開き、設定を変更する。

```
$ sudo vim /etc/ssh/sshd_config
```
##ポートの変更
デフォルトの22　を　10022　に変更する（設定可能範囲：1024〜65535）。

***変更前***

```
#Port 22
```
***変更後***

```
Port 10022
```
##rootによるログインの禁止

***変更前***

```
#PermitRootLogin yes
```

***変更後***

```
PermitRootLogin no
```
##passwordでのログイン禁止
***変更前***

```
#PasswordAuthentication yes
```
***変更後***

```
PasswordAuthentication no
```
###sshを再起動

```
$ sudo service sshd restart
```
#FireWallの設定
##iptablesファイルを作成する

```
$ sudo vim /etc/sysconfig/iptables
```
##デフォルトで10022番だけにオープンするように変更する。

```
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH, HTTP, FTP1, FTP2, MySQL
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 61203 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
```
##iptablesを再起動

```
$ sudo /etc/rc.d/init.d/iptables restart
```
##設定の確認

```
$ sudo iptables -L
```
ActiveAdminでメニューの並び順を1箇所で管理する

## 2016/11/22 追記

この記事の内容が（さらに改善されて）gemになりました。
https://github.com/yhirano55/active_admin_menu

## シチュエーション

https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#menu-priority

上記ヘルプに(2015/05/24時点で)あるように、ActiveAdminでページを作ってメニューの設定を行うとき、並び順を決定するための優先度は各ページに書く必要があります。
しかしこれではページが多くなってくると管理が面倒になります。

## 実装

```rb:config/initializers/active_admin_menus.rb
MENU_ITEMS = [
  [:item, 'Dashboard', {label: proc{ I18n.t("active_admin.dashboard") }}],
  [:item, 'Item', {}],
  [:item, 'Skill', {label: '特技検索'}],
  [:item, 'Evolution', {label: '進化検索'}],
  [:category, 'master',
    [
      ['Element', {}],
      ['BoxKind', {}],
    ]
  ],
  [:item, 'Comment', {}],
]

MENU_ITEM_EXCLUDES = %w()

def inverted_menu_items
  MENU_ITEMS.each_with_object([]).with_index do |(source_item, inverted), index|
    case source_item.first
    when :item
      _, page, args = source_item
      inverted << [page, args.merge(priority: index)]
    when :category
      _, category, children = source_item
      inverted << [category, {label: I18n.t("active_admin.menu.#{category}"), priority: index}]
      children.each_with_index do |category_item, index2|
        page, args = category_item
        inverted << [page, args.merge(parent: I18n.t("active_admin.menu.#{category}"), priority: index2)]
      end
    end
  end
end

def check_index_and_add_priority_and(name, &block)
  index = inverted_menu_items.map(&:first).index(name)
  if index
    args = inverted_menu_items[index][1]
    block.call(args)
  elsif !(MENU_ITEM_EXCLUDES.include? name)
    raise "#{name} is NOT placed into the menu"
  end
end

ActiveAdmin.application.namespace(false).build_menu do |menu|
  MENU_ITEMS.select {|i| i.first == :category}.each do |item|
    name = item[1]
    check_index_and_add_priority_and(name) do |args|
      menu.add args
    end
  end
end

class ActiveAdmin::DSL
  def allocate_to_menu
    name = config.resource_name.name
    check_index_and_add_priority_and(name) do |args|
      menu args
    end
  end
end

module MenuAllocator
  def register(*args, &block)
    super *args do
      allocate_to_menu
      self.instance_eval &block
    end
  end

  def register_page(*args, &block)
    super *args do
      allocate_to_menu
      self.instance_eval &block
    end
  end
end

module ActiveAdmin
  class Namespace
    prepend MenuAllocator
  end
end
```

## 解説

### 基本方針

ページの登録時の処理をフックして、各ページのコードから呼び出すmenuコマンドを、設定したメニューの並び順(priority)を含んだ形で呼びだします。

### 例外的な処理

* 親ページに指定するラベルがメニュー上に存在していない場合は、デフォルトの並び順である10で設定されてしまうため、これを避けるためには、 https://github.com/activeadmin/activeadmin/blob/master/docs/2-resource-customization.md#customizing-parent-menu-items に記載の通り、初期化時の設定が必要なので、同等の処理をここで行います。
* ActiveAdminのコメントの画面を使用する場合は、Commentという名前の項目がMENU_ITEMSに入っていれば良いです。

## 注意点

* menuコマンドは1つのページから複数回呼び出せますが、最後に呼び出したものの引数の内容だけが適用されるので、各ページの実装からmenuコマンドを呼び出すとここでの設定が反映されません。
* namespace(false)なのは、 http://qiita.com/skuroki@github/items/fbded7846a78feb8bef1 の例2のやりかたで / 直下にActiveAdminのアプリケーションを配置しているためです。そうでない人は適宜読み替えてください。
Sublime Text 3の導入(Windows)

これまで大したエディターを使っていなかったのですが、SublimeTextの動きに感動したので導入することとしました。環境はWindow7(64bit)とします。

# インストール
[SublimeText](http://www.sublimetext.com/3)のページから自分のOSに合ったファイルをダウンロードします。そして、ダウンロードしたファイルを実行してぽちぽち次へを押していけばインストールは終了します。

# Package Controlのインストール
Sublime Textには様々なパッケージが存在するのですが、それらの導入を簡単にするために[Package Control](https://packagecontrol.io/)というものをインストールします。メニューバーの「表示」→「コンソール」(Ctrl+`)を選択してコンソールを表示させ、そこに以下の内容を入力してEnterキーを押してください。(以下の内容は更新される可能性があるので、Package controlの[ウェブサイト](https://packagecontrol.io/installation)を確認することをお勧めします)

```
import urllib.request,os,hashlib; h = 'eb2297e1a458f27d836c04bb0cbaf282' + 'd0e7a3098092775ccb37ca9d6b2e4b7d'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)
```

これでインストールが完了します。

# Packageのインストール方法
Package Controlを用いてパッケージを導入する方法を説明します。
まずメニューバーから「ツール」→「コマンドパレット」(Ctrl+Shift+P)を選択します。入力窓が表示されるので、「Package Control: Install Package」と入力します。再び入力窓が表示されるのでそこに導入したいパッケージ名を入力してEnterキーを押すとインストールが始まります。

# 導入すべきパッケージ

## Japanize
メニューバーなどの日本語化を行います。出てくる表示通りにファイルをコピーしたり、ファイル名を変更したりしてください。一部分英語が残ってしまうのが多少不満。

## IMESupport
インストール直後の状態で日本語入力を行うと画面脇に入力中の文字が出て見にくいので、インライン化を行います。

## ConvertToUTF8
Sublime Textは基本的にUTF-8でファイルを扱うため、文字化けが発生してしまいます。このパッケージを導入すると編集中はUTF-8で編集しますが、保存の際に元の文字コードに戻して保存してくれるので現在の文字コードを意識しなくてよくなります。


*****

とりあえずのところはこれだけでいいと思います。必要になった際にそれぞれ導入していきましょう。
CentOS 7 にhhvmをインストール＋自動起動を設定してみた

リポジトリ追加したり、yumでインストールしたりは色々サイトもあるので割愛します。

インストールしたままの状態で
`$ systemctl start hhvm` すると一見エラーがないように見えるが起動していない状況。
`$ systemctl status hhvm` をみるとしっかり起動失敗していた。
色々調べてみると起動ファイルがUbuntu用なのが原因のようだけど、詳しくは書かれていない模様。
※海外のフォーラムでユーザー指定の部分が --user ではなく -userだという書き込みを確認したけれど試していません。

手っ取り早く起動してみたかったため、`hhvm.service`を編集してみました。

```bsch:/usr/lib/systemd/system/hhvm.service
[Unit]
Description=HHVM HipHop Virtual Machine (FCGI)

[Service]
ExecStart=/usr/local/bin/hhvm --mode daemon -vServer.Type=fastcgi -vServer.Port=9001

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

要はなくても（とりあえず）起動できる最低限だけ書いてみたつもりです。

※）
systemdの設定部分を直接操作しているので、最悪の場合システムが起動しなくなる恐れもあります。
CentOSのsystemdをしっかり勉強してからバックアップを取ってやることをお勧めします。（自己責任で）
（自分もしっかりとは勉強できていないので、たぶんもっと良い方法があると思います。）

面倒でなければ、`$ hhvm --mode daemon -vServer.Type=fastcgi -vServer.Port=9001`をシステム起動の都度
実行したほうが安全かもしれません。
[Go] IntelliJ IDEAの初期設定


Goの開発環境構築に手間取ったので覚書。

## IntelliJ IDEAのインストール

自分の場合は、MacなのでHome Brew CaskでIntelliJ IDEA CEをインストール。

``` sh
$ brew-cask install intellij-idea-ce
```

## Go Pluginのインストール

- IntelliJ IDEA -> Preferences -> Pluginsに移動
- Browse repositoriesをクリック
- Manage repositoriesをクリック
- '+'ボタンをクリック
- https://plugins.jetbrains.com/plugins/alpha/list を入力し、OKをクリック
- リポジトリが増えているはずなので、Go Plugin をインストール

## その他

### GOROOT、GOPATHの設定

上記までの処理で、プロジェクトを新規作成する際にGoが候補にあがるようになります。

ただ、上記と別に`GOROOT`、`GOPATH`の設定が必要です。

`GOROOT`は、Home Brewを利用して、Goをインストールした場合は特別な手順は不要です。

`GOPATH`については、普通に`export`を利用するかIntelliJ IDEAに指定する必要があります。

IntelliJ IDEAでの`GOPATH`の指定は下記のような手順となります。

#### IntelliJ IDEAでのGOPATH設定

- Intellij IDEA -> Preferences -> Languages & Frameworks -> Go Librariesに移動
- Global Libraries に`GOPATH`に指定したいディレクトリを追加し、OKをクリック

##### 上記の注意点

IntelliJ IDEAを利用して、`GOPATH`を指定した場合、ターミナルなどからGoを実行する場合、`GOPATH`が解決できずに落ちます...

一時的に、ターミナルから利用する必要がある場合は、一時的に`export`などで指定するとよいかもしれません。

``` sh
$ export GOPATH=<任意のディレクトリ>
```

### プロジェクト構成について

Goの開発を行う場合、`GOPATH`の直下に下記ディレクトリを用意する必要があります。

※自分はこのことを全く知らず、思いっきりハマりました...

- bin
- pkg
- src


## 参考にしたサイト

[急いで学ぶGo lang#2 IntelliJ IDEAでGo開発](http://dev.classmethod.jp/server-side/language/golang-2/)

[Go の開発環境は IntelliJ IDEA + golang plugin がマトモだった](http://qiita.com/kaiinui/items/433eb86c022ffcad0bea)
MacのBluetooth接続先に存在しないデバイスが表示される問題

iPhoneを買い替えたのだが、過去に所有していたiPhoneがBluetooth接続デバイスの候補として表示され続けていた。
気持ち悪いのでなんとかしたいと思い、Bluetoothの設定を色々見てみたのだが、どうやら辞書ファイルを削除するしかないらしい。

# 手順
1. 「ライブラリ¥Preferences¥com.apple.Bluetooth.plist」を削除する。
2. 再起動する。

これで存在しないデバイスの表示がなくなる。

# 追記
辞書ファイルを削除せずに対処できる簡単な方法があったようです。
1. メニューバーのBluetoothアイコンをオプションキーを押しながらクリック。
2. 「削除」の選択項目をクリック。
c言語の初めに一番簡単なプログラミングを書きましょう

c言語の初めに一番簡単なプログラミングを書きましょう
<p>Cは一般的に各OSが使用されるプログラミング言語です。<br />
Unixは、すべてのC言語で書かれた、次にMicrosoftのWindows、Mac OS X、およびGNU / LinuxのC言語で書かれた、<br />
実際はOSだけではなくて、C言語はすべて人気の高レベルの言語の根本的な言語です<br />
例えば、 PerlやPHP 、およびPythonのは、すべてのCで書かれています</p>

![alt](http://lecaoquochung.com/uploads/20150524_1936_c.jpg)

<p>C言語の一番簡単的なプログラミングはこちらです</p>

<div style="background:#eee;border:1px solid #ccc;padding:5px 10px;">main ( )<br />
{<br />
}</div>

<p>[main]はC言語のキーワードです.<br />
C言語の一番初めてから読む所です</p>

<p>main（）機能はパラメーターもありますが、今の段階は気にしないでください.<br />
( )と言うのはC言語の機能の中のパラメーターがなしです</p>

<p>C言語はコメントのやり方はどうしますか？<br />
このようにコメントができます /* ....... */<br />
main ( ) /* C言語のスタートです */<br />
{<br />
/* コードブロック開始 */<br />
コードブロック行１<br />
...<br />
コードブロック行n<br />
}<br />
/* コードブロック終了 */<br />
{ はコードブロックの初め<br />
} はコードブロックの最後</p>

<p>世界にこにちはと言うC言語プログラミングを書きましょう &quot;hello world&quot;<br />
hello_world.c</p>

<p>コメントなしで再び書きましょう</p>

<div style="background:#eee;border:1px solid #ccc;padding:5px 10px;">main ()<br />
{<br />
&nbsp;&nbsp; &nbsp;printf(&quot;hello world \n&quot;);<br />
}</div>

<p>すごく簡単ですね、また次回はもう少し複雑なprintf機能を書いてみます&nbsp;</p>
選択範囲内で置換するPowerPointマクロ

## やりたいこと
PowerPointで、全文でなく選択範囲内からテキスト検索し、検索結果を指定のテキストに置換したい。

## マクロの作り方 

まずは下記のようなユーザーフォームを作る。

![myRep.PNG](https://qiita-image-store.s3.amazonaws.com/0/80231/47b7e98d-7f83-a0f0-889b-c6dd1dd6864b.png)


ユーザーフォームに下記のようなコードを埋め込む。

```vbnet:UserForm1.frm
Option Explicit

Private MyRng As TextRange
Private Found As TextRange

'「置換」ボタンを押したとき
Private Sub btnRep_Click()

    On Error GoTo ErrMessage
    
    Set MyRng = ActiveWindow.Selection.TextRange
    Set Found = MyRng.Replace(SearchText.text, RepText.text)
    Found.Select
        
    Exit Sub

ErrMessage:
    MsgBox "検索を行う範囲を選択してください"

End Sub

'「次を置換」ボタンを押したとき
Private Sub btnRepNext_Click()
    
    On Error GoTo ErrMessage

    With Found
        Set Found = MyRng.Replace(SearchText.text, RepText.text, .Start + .length - 1)
        If Not (Found Is Nothing) Then
            Found.Select
        Else
            MsgBox "見つかりません"
        End If
    End With
    
    Exit Sub

ErrMessage:
    MsgBox "検索を行う範囲を選択してください"

End Sub

'「すべて置換」ボタンを押したとき
Private Sub btnRepAll_Click()

    On Error GoTo ErrMessage

    Set MyRng = ActiveWindow.Selection.TextRange
    Set Found = MyRng.Replace(SearchText.text, RepText.text)
    Do While Not (Found Is Nothing)
        With Found
            Set Found = MyRng.Replace(SearchText.text, RepText.text, .Start + .length - 1)
        End With
    Loop

    Set MyRng = Nothing
    Set Found = Nothing

    Exit Sub

ErrMessage:
    MsgBox "検索を行う範囲を選択してください"

End Sub
```

標準モジュールから呼び出せるようにする。

```vbnet:Module1.bas

Option Explicit

Public Sub Sample()

    UserForm1.Show vbModeless

End Sub

```
これで、選択範囲から指定のテキストを置換できるようになる。

## 使い方

1. まずは、置換したい範囲を選択する。

1. ひとつずつ置換するときは、最初に「置換」ボタンで置換し、2回目以降は「次を置換」ボタンを押す。

1. すべてを置換するときは、「すべて置換」ボタンを押す。

## 参考
1. [TextRange.Find メソッド (PowerPoint)] (https://msdn.microsoft.com/ja-jp/library/office/ff744247.aspx)
gulpやgruntでbuildしたファイルをHerokuにどうdeployするか

#gulpやgruntでbuildされたファイルは通常gitignoreしてあるので困った
3通り方法見つけました。
自分は一番目の方法でしばらくやってみることにしました。

##deploy用の一時branchを作る

```
#!/bin/bash
set -e

# Create new deploy branch based on master
git checkout -b deploy
# gulp comands to build our site
gulp build
# the dist/ directory is in my .gitignore, so forcibly add it
git add -f build/
git commit -m "Deploying to Heroku"
# Push it up to heroku, the -f ensures that heroku won't complain
git push heroku -f deploy:master
# Return to the last branch
git checkout -
# Delete current deploy branch
git branch -D deploy
```
一時的にdeployブランチを作成し、そこでbuild後にgitignoreしてあるファイルをforce addしています。
pushし終えたら元のブランチに戻って一時ブランチを削除しています。

この方法でいいなと思ったのは、少しの変更をいちいちcommitしないでもherokuにpush出来てしまうという点です。
開発初期段階ではいちいちcommit&pushするのが嫌だったので。。

参考: http://stackoverflow.com/questions/13784600/how-to-deploy-node-app-that-uses-grunt-to-heroku

##heroku上でbuildを実行(postinstallにgulpコマンドを記述)

```json
  "scripts": {
    "postinstall": "gulp build",
    "start": "node build/server.js",
  }
```

heroku上でpakageのinstallが完了したあとにpostinstallが実行されます。
なのでpostinstallにgulpコマンドを書くという方法もありです。
ただ、コマンド実行に必要なpackageを"devDependencies"ではなくて"Dependencies"に記述しないとダメなようです。

参考: https://medium.com/@adambretz/heroku-gulp-c96dc3a8044d

##ローカルでBuildしたファイルをそのままpushする
ローカルでbuildを実行し、buildされたファイルをgitignoreせずにpushするという方法でもいけると思います。
Windows環境で Visual Studio Code


## インストール
https://code.visualstudio.com/ からインストーラーをダウンロードして実行。

以降、MarkdownPreviewのCSS設定について記述するが、既に中華フォント問題が解決しているのでdefaultのままでも問題ない。

## MarkdownPreviewのCSS設定（新）
1.3.0-insider ぐらいからは、**defaultのCSSに追加で** markdown.styles で設定したCSSが適用されるようだ。

### CSSファイルを用意

今回は、 `C:\Users\<ユーザー名>\Work\_vscode` に user.css を配置した。

見出しの下線をh1でなくh2に付けたかったので、user.css で調整

```css:user.css
h1 {
  border: none;
}

h2 {
  border-bottom: 1px solid #cccccc;
  padding-bottom: 5px;
}
```

### CSS適用
File > Preferences > User Settings を開き、 settings.json へ以下のように記述。

```json:settings.json
// Place your settings in this file to overwrite the default settings
{
	"markdown.styles": [
		"file://C:/Users/<ユーザー名>/Work/_vscode/user.css"]
}
```

## MarkdownPreviewのCSS設定（旧）
version 1.2.1 ぐらいまでは markdown.styles に値を設定すると、**defaultのCSS設定が消えてしまう**ようだ。

### CSSファイルを用意

今回は、 `C:\Users\<ユーザー名>\Work\_vscode` に [github.css](https://gist.github.com/andyferra/2554919) と user.css を配置した。

user.css へは、以下のようにフォント設定を記述。

```css:user.css
* {
  font-family: "Meiryo";
}

code, code span {
  font-family: "MS Gothic";
}
```

### CSS適用
File > Preferences > User Settings を開き、 settings.json へ以下のように記述。

```json:settings.json
// Place your settings in this file to overwrite the default settings
{
	"markdown.styles": [
		"file://C:/Users/<ユーザー名>/Work/_vscode/github.css",
		"file://C:/Users/<ユーザー名>/Work/_vscode/user.css"]
}
```

`与` や `化` 等が日本の字形で表示されれば問題ない。

### github.css を使う場合の微調整
[github.css](https://gist.github.com/andyferra/2554919) を使う場合、余白が多いなど気に入らない点があったので、 user.css で微調整。

```css:user.css
body {
  padding-top: 0px;
}

h1 {
  margin-top: 0px;
}

li, li ul {
  margin-top: 0px;
  margin-bottom: 0px;
}

hr {
  border: 1px solid;
  height: 0;
}
```

## その他の設定
必要に応じて `settings.json` へ追記。

```json:settings.json
{
    // エディタのフォント設定
    "editor.fontFamily": "MS Gothic",
    
    // ウィンドウ幅に合わせて折り返し
    "editor.wrappingColumn": 0,
    
    // 半角スペースやタブの表示
    "editor.renderWhitespace": true,
    
    // タブでスペース挿入
    "editor.insertSpaces": true,

    // プロキシ設定
    "http.proxy":"http://..."
}
```
Git で混ぜこぜでコミットしたファイルを切り出してブランチを作っていく

まぜこぜでコミットした後に、後からやっぱり分割したくなったときにどうするか、色々なやり方があると思う。
ケースによっては git reset したほうが早かったり、 git cherry-pick 使うかもしれない。

他のケースを試してみる前に、まずは自分の知ってる方式ではどうやってるのか、記事にしてみた。

もっと良いやり方があるかもしれない。

# 順番

この記事内では

```
4 つのファイルを 1 つに混ぜこぜでコミット → 4 つの各ブランチに分割 → 新しいブランチにマージ → 古いブランチをリベース
```

の順で行った。

リモートに push したブランチを rebase するのは推奨されていないので、その場合は最後にリベースしてはいけない。
[3.6 Git のブランチ機能 - リベース - ほんとうは怖いリベース - 公開リポジトリにプッシュしたコミットをリベースしてはいけない](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%99%E3%83%BC%E3%82%B9#ほんとうは怖いリベース)

# ブランチの命名について

自分は、普段は Git Flow か GitHub Flow のどちらかを使っている。
説明の主旨とは関係ないので、この記事はどちらのフローでもない。

# 練習のため初期化

```console
$ mkdir testing
$ cd testing
$ git init
$ git commit --allow-empty -am 'Initial'
```

# 前提: ファイル a b c d を 1 度に commit してしまった。

```console
$ git checkout -b base
$ git checkout -b ABCD
$ touch a b c d
$ git add a b c d
$ git commit -m 'ABCD'
```

# 1. a を切り離したブランチ A を作る

```console
$ git checkout -b A base
$ git checkout ABCD a
$ git commit -m 'A'
```

# 2. b を切り離したブランチ B を作る

```console
$ git checkout -b B base
$ git checkout ABCD b
$ git commit -m 'B'
```

# 3. c を切り離したブランチ C を作る

```console
$ git checkout -b C base
$ git checkout ABCD c
$ git commit -m 'C'
```

# 4. d を切り離したブランチ D を作る

```console
$ git checkout -b D base
$ git checkout ABCD d
$ git commit -m 'D'
```

# 5. base から生えてる新しい new-ABCD に A, B, C, D をマージする

```console
$ git checkout -b new-ABCD base
$ git merge A B C D -m 'new ABCD'
```

# 6. ABCD を new-ABCD から生えてるようにリベースする

```
$ git rebase --onto new-ABCD base ABCD
```