OmniAICreator/Qiita-1.07M huggingface dataset:
c++ builder > Datasnap.Win.SConnect.pas > WaitForSingleObject(FTransport.Handle, 180000);

```txt:動作確認
C++ Builder XE4
```

[Delphi Advent Calender](http://qiita.com/advent-calendar/2015/delphi) 24日目のyajuさんの記事 
http://blogs.wankuma.com/yaju/archive/2015/12/24/524977.aspx


Delphi5の話と思っていたら、XE4でも関連のコードが見つかった。

Program FilesのRadStudioのフォルダにおいて「SConnect.pas」で検索。
Datasnap.Win.SConnect.pasが見つかった。

そのコードに `WaitForSingleObject(FTransport.Handle, 180000);`がある。

```Datasnap.Win.SConnect.pas
...
procedure TStreamedConnection.InternalClose;
begin
  if Assigned(FTransport) then
  begin
    FTransport.OnTerminate := nil;
    FTransport.Terminate;
    PostThreadMessage(FTransport.ThreadID, WM_USER, 0, 0);
    if Assigned(FTransport.FTransport) then
      WaitForSingleObject(FTransport.Handle, 180000);
    FTransport := nil;
  end else
  if Assigned(FTransIntf) then
  begin
    FTransIntf.Connected := False;
    FTransIntf := nil;
  end;
end;
...
```

しかし、Datasnap.Win.SConnect.pasがどういう時に使われるのか未学習。
sinatraでhamlが生成するコードをダブルクォーテーションで出力する

## 概要

sinatra + haml のデフォルトの出力は、

```
<meta charset='utf-8' content='text/html' http-equiv='Content-Type'>
```

と、シングルクォーテーションとなっている。
これを、

```
<meta charset="utf-8" content="text/html" http-equiv="Content-Type">
```

と、ダブルクォーテーションにしたい。

## 解決策

コントローラ(my_app.rb)に、
以下を追加する。

```
class MyApp < Sinatra::Base
  set :haml, :attr_wrapper => '"'    # これを追加
  ...
end
```
CodeIQ「『ルート・パワー』問題」に参加しました。

# 「『ルート・パワー』問題」とは

[CodeIQ「『ルート・パワー』問題」](https://codeiq.jp/q/1563)の掲載期間が終わり、提出コードを公開してよいとのことなので、その流れに乗りたいと思います。問題の内容や出題者の[@riverplus](https://twitter.com/riverplus)さんによる解説が後日CodeIQMagazineあたりに公開される――はず(前例にならえば)なので、そのときに覚えていればここにリンクを張り付ける予定です。

***
__2015/12/25追記:__
公開されたコードを[出題者の@riverplusさんみずからTogetterにまとめて下さっております](http://togetter.com/li/911507)。この記事よりよっぽどいいコードが集まっているので、ご参考のほどを。わたしもまだまだですね(´・ω・`)
***

***
__2015/12/25追記:__
今日二度目の追記。[予想通り(?)出題者による解説記事が公開されておりました。](https://codeiq.jp/magazine/2015/12/34893/)わたしは今から精読します(´・ω・`)
***

# 提出コード
使用した言語はRuby。おそらく4-5回目ぐらいで全問通った記憶があります。

```rb
# a + b * s(2) + c * s(3) + d * s(5) + e * s(6) + f * s(10) + g * s(15) + h * s(30)
# ただしa,b,c,d,e,f,g,hはすべて0以上の整数。
class H

	@@BIG = 10 ** 7

	def initialize(a, b, c, d, e, f, g, h)
		@a, @b, @c, @d, @e, @f, @g, @h = a, b, c, d, e, f, g, h
	end

	attr_accessor :a, :b, :c, :d, :e, :f, :g, :h

	def *(other)
		H.new(
			(@a * other.a + 2 * @b * other.b + 3 * @c * other.c + 5 * @d * other.d + 6 * @e * other.e + 10 * @f * other.f + 15 * @g * other.g + 30 * @h * other.h) % @@BIG,
			(@a * other.b + @b * other.a + 3 * @e * other.c + 5 * @f * other.d + 3 * @c * other.e + 5 * @d * other.f + 15 * @h * other.g + 15 * @g * other.h) % @@BIG,
			(@c * other.a + 2 * @e * other.b + @a * other.c + 5 * @g * other.d + 2 * @b * other.e + 10 * @h * other.f + 5 * @d * other.g + 10 * @f * other.h) % @@BIG,
			(@d * other.a + 2 * @f * other.b + 3 * @g * other.c + @a * other.d + 6 * @h * other.e + 2 * @b * other.f + 3 * @c * other.g + 6 * @e * other.h) % @@BIG,
			(@e * other.a + @c * other.b + @b * other.c + 5 * @h * other.d + @a * other.e + 5 * @g * other.f + 5 * @f * other.g + 5 * @d * other.h) % @@BIG,
			(@f * other.a + @d * other.b + 3 * @h * other.c + @b * other.d + 3 * @g * other.e + @a * other.f + 3 * @e * other.g + 3 * @c * other.h) % @@BIG,
			(@g * other.a + 2 * @h * other.b + @d * other.c + @c * other.d + 2 * @f * other.e + 2 * @e * other.f + @a * other.g + 2 * @b * other.h) % @@BIG,
			(@h * other.a + @g * other.b + @f * other.c + @e * other.d + @d * other.e + @c * other.f + @b * other.g + @a * other.h) % @@BIG,
		)
	end

	def **(n)
		return H.new(1, 0, 0, 0, 0, 0, 0, 0) if n == 0
		n.odd? ? self ** (n - 1) * self : (self * self) ** (n / 2)
	end
end

# == main ==
h = H.new(1, 1, 1, 1, 0, 0, 0, 0)
n = gets.to_i
p (h ** n).a
```

# 反省会

問題の内容はおおざっぱに言うと「$1 + \sqrt{2} + \sqrt{3} + \sqrt{5}$のべき乗を求めよ」というもので、これはかならず次のようになるはずです(ただしa, b, c, d, e, f, g, hはすべて0以上の整数)。

```math
H=a+b\sqrt{2}+c\sqrt{3}+d\sqrt{5}+e\sqrt{6}+f\sqrt{10}+g\sqrt{15}+h\sqrt{30}
```

あとはもう明らかですよね。「Hのようなもの」どうしの掛け算がどのように展開されるかが分かれば当然掛け算が定義でき、掛け算が定義できればいうまでもなくべき乗は定義できるということになります。

――が、こういう解法は非推奨というか、はっきりいえば「だめ」でしょう。まずもってスマートではない。おそらく行列計算とか多項定理とかあるいは規則性とかを利用するのでしょうが、筆者はさっぱり思い浮かばず、強引な手法で解いてしまいました。まあ一応こういう解き方もできるよというサンプル程度に。

(ちなみに展開は紙に書いて行ったのですが、すごい時間がかかりました。しかもそれを間違いなくソースコードに写し取るのにも時間がとられ、結局1時間以上かかった記憶があります……)

注意としては「オーバーフローに気を付けろ」。最初はC言語で実装していたのですが――まず`int`でだめ、次に`long`でもだめで、思考停止の`unsigned long long int`でもオーバーフローを起こし、心が折れてしまいました(´・ω・`)。そしてRubyで実装提出し、無事合格になったのでした。動的言語万歳! ただし7桁の整数を掛け合わせて、それを最大8つも足し合わせるような計算をするので、オーバーフローするのは当たり前といえば当たり前ですが……。
phpのisset_or()というユーティリティ関数が地味便利。

phpのisset()関数のドキュメントにあったisset_or()というユーティリティが地味便利なので紹介します。

#なんとかしたいやつ
phpではよく isset() と三項演算子の組み合わせよく使いますよね。

こういうのです。

```php
$result = (isset($a['super_long_assoc_array_key'])) ? $a['super_long_assoc_array_key'] : null;
```

これの気持ち悪いところは2回同じことを書かなければならないところ。

#なんとかしてくれるやつ
これがドキュメントのノートに投稿されていたisset_or()です。上記のなんとかしたいやつをなんとかしてくれます。

```php
function isset_or(&$check, $alternate = NULL) 
{ 
    return (isset($check)) ? $check : $alternate; 
} 

// Example usage: 
$first_name = isset_or($_POST['first_name'], "Empty"); 
$total        = isset_or($row['total'], 0); 
```

さきほどの例をこれで直すと

```php
$result = isset_or($a['super_long_assoc_array_key']);
```

うん。すっきり。

#php7
なおphp7からは??演算子を使えば良いそうで。

[PHP7調査(11)??演算子の新設](http://qiita.com/hnw/items/dff62cd02c780b613d03)

#余談
~~関数のパラメータをリファレンスで渡した場合、連想配列の評価を後回しにできるんですね。(isset_orの第一引数)
これ知らなかったので、自分でこのユーティリティを思いつくことがなかった。しっかり言語仕様を理解することの大事さを教えてくれますね。~~
コメントで教えてもらいましたが、リファレンスを使うとその時点で変数が存在しない(Undefined)場合には中身がnullの変数が作成されるそうです。
つまり、isset_or($a['key'])をすると、もしキーがなくてもその瞬間に['key' => null]が追加されます。
後続の処理でarray_key_exists()などによる判定がある場合は注意が必要です。

#参考
http://php.net/manual/en/function.isset.php#95557
[Git] 鍵などの秘匿情報をgitに上げない為のスクリプトを全プロジェクトに適用させる

[初心者がAWSに手を出して$6,000請求されて、泣きそうになったお話。](http://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694)を読んで、わたしもきっとやるだろうなぁと思い、とりあえず自動でチェックしてもらうスクリプトだけでも入れておこうと思いました。

# 1. Git Templates

```zsh
$ git config --global init.templatedir '~/.git-templates'
```

これによって各プロジェクトの.git/以下に~/.git-templates以下のファイルがコピられます。git initしたときに。

# 2. Global Hooksの為のディレクトリ作成

```zsh
$ mkdir -p ~/.git-templates/hooks
```

# 3. ~/.git-templates/hooks/以下にコードを書きます。

```rb:pre-commit
#!/bin/sh

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    EMPTY_TREE=$(git hash-object -t tree /dev/null)
    against=$EMPTY_TREE
fi

# Redirect output to stderr.
exec 1>&2
 
# Check changed files for an AWS keys
FILES=$(git diff --cached --name-only $against)

if [ -n "$FILES" ]; then
    KEY_ID=$(grep -E --line-number '[^A-Z0-9][A-Z0-9]{20}[^A-Z0-9]' $FILES)
    KEY=$(grep -E --line-number '[^A-Za-z0-9/+=][A-Za-z0-9/+=]{40}[^A-Za-z0-9/+=]' $FILES)

    if [ -n "$KEY_ID" ] || [ -n "$KEY" ]; then
        exec < /dev/tty # Capture input
        echo "=========== Possible AWS Access Key IDs ==========="
        echo "${KEY_ID}"
        echo ""

        echo "=========== Possible AWS Secret Access Keys ==========="
        echo "${KEY}"
        echo ""

        while true; do
            read -p "[AWS Key Check] Possible AWS keys found. Commit files anyway? (y/N) " yn
            if [ "$yn" = "" ]; then
                yn='N'
            fi
            case $yn in
                [Yy] ) exit 0;;
                [Nn] ) exit 1;;
                * ) echo "Please answer y or n for yes or no.";;
            esac
        done
        exec <&- # Release input
    fi
fi

# Normal exit
exit 0
```

# 4. 実行可能にする

```zsh
$ chmod a+x ~/.git-templates/hooks/pre-commit
```

# 5. 上記を対応させたいプロジェクトでgit initします。

```zsh:{project_root}
$ git init
```


https://coderwall.com/p/jp7d5q/create-a-global-git-commit-hook
https://gist.github.com/DmZ/3a99d829f17af383712b
perl での改行削除

perl でファイルを処理するとき、改行を削除することがあります。
ファイルを作成した環境が UNIX 限定であれば、
```
chomp();
```
でいいのですが、Windows だった場合は CR だけ残ったりします。

面倒なので、

```pl:test.pl
while(<FILE>) {
    s/(\r\n|\r|\n)$//g;
    処理
}
```

と、書いてしまえば楽ちんです。
TensorFlowチュートリアル - MNISTデータ・ダウンロード（翻訳）

TensorFlowのチュートリアル（MNIST Data Download）
https://www.tensorflow.org/versions/master/tutorials/mnist/download/index.html#mnist-data-download
の翻訳です。
翻訳の誤りなどあればご指摘お待ちしております。

---

コード： [tensorflow/examples/tutorials/mnist/](https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/examples/tutorials/mnist/)

このチュートリアルの目的は、（古典的）MNISTデータセットを使用した手書き数字の分類に必要なデータセット・ファイルをダウンロードする方法を示すことです。

##チュートリアル・ファイル

このチュートリアルでは、以下のファイルを参照します：

|ファイル 	|目的|
|:--|:--|
|[input_data.py](https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/examples/tutorials/mnist/input_data.py) 	|訓練と評価のためにMNISTデータセットをダウンロードするコード。|

##データの準備

MNISTは、機械学習における古典的な問題です。この問題は、手書き数字のグレースケールの28x28ピクセルの画像を見て、画像が表す数字が０から９までのうちどの数字かを決定する、というものです。

![MNIST Digits](https://www.tensorflow.org/versions/master/images/mnist_digits.png)

詳細については、 [Yann LeCun のMNISTページ](http://yann.lecun.com/exdb/mnist/) または [Chris Olah のMNISTの視覚化](http://colah.github.io/posts/2014-10-Visualizing-MNIST/) を参照してください。

###ダウンロード

[Yann LeCun のMNISTのページ](http://yann.lecun.com/exdb/mnist/) は、訓練データとテスト・データをダウンロードのためにホストしています。

|ファイル 	|目的|
|:--|:--|
|[train-images-idx3-ubyte.gz](http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz) 	|訓練セット画像 - 55000訓練画像、5000検証画像|
|[train-labels-idx1-ubyte.gz](http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz) 	|画像に対応する訓練セット・ラベル|
|[t10k-images-idx3-ubyte.gz](http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz) 	|テスト・セット画像 - 10000画像|
|[t10k-labels-idx1-ubyte.gz](http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz) 	|画像に対応するテスト・セット・ラベル|

input_data.py ファイルの、 maybe_download() 関数は、これらのファイルが訓練のためのローカル・データ・フォルダにダウンロードされていることを保証します。

フォルダ名は fully_connected_feed.py ファイルの先頭にフラグ変数で指定されており、必要に応じて変更することができます。

###解凍とリシェイプ

ファイル自体は、標準的な画像形式ではなく、 input_data.py で extract_images() と extract_labels() 関数により手動で（ウェブサイトの指示に従い）解凍されます。

画像データは、 [画像インデックス, ピクセル・インデックス] の2Dテンソルに抽出されます。ここで、各要素はインデックスが示す画像内のピクセルの輝度の値であり、 [0, 255] から [-0.5, 0.5] に再スケールされています。「画像インデックス」は、データセット内の画像に対応し、0からデータセットのサイズまでカウントアップされます。そして「ピクセル・インデックス」は、画像内の特定のピクセルに対応し、0から画像のピクセル数までの範囲を取ります。

train-* ファイル内の 60000 サンプルは、その後、訓練のための 55000 サンプルと検証のための 5000 サンプルに分割されます。データセット内の全ての 28x28 ピクセルのグレースケール画像の画像サイズは 784 ですので、訓練セット画像の出力テンソルの形状は [55000, 784] です。

ラベル・データは、各サンプルのクラス識別子を値とする、 [画像インデックス] の1Dテンソルに抽出されます。従って、訓練セット・ラベルの場合、テンソルの形状は [55000] です。

###データセット・オブジェクト

基礎をなすコードは、以下のデータセットについて、画像とラベルをダウンロードし、解凍し、形状を変更します：

|データセット 	|目的|
|:--|:--|
|data_sets.train 	|主な訓練のための 55000 画像とラベル。|
|data_sets.validation 	|訓練精度の反復的検証のための 5000 画像とラベル。|
|data_sets.test 	|訓練済み精度の最終テストのための 10000 画像とラベル。|

read_data_sets() 関数は、これら３つのデータ集合それぞれの DataSet インスタンスを保持する辞書を返します。 DataSet.next_batch() メソッドは、 batch_size サイズの画像およびラベルのリストからなるタプルをフェッチするために使用します。これらのリストは実行中のTensorFlowセッションにフィードされます。

```py
images_feed, labels_feed = data_set.next_batch(FLAGS.batch_size)
```
【企画者向け】これだけ知っとけばすんなりとWebサービス・アプリの企画できるという知識リスト

Speeeで新規事業開発をやっているtakakazu_matsuyamaです。

本日はクリスマスイブですね。
クリスマスイブって暇ですよね。テレビ見たくないですよね。
そんなときはWebサービスの企画でもしませんか。うん、いいですね。

ところで、企画するときに「こんなんあったらいいなあ」でババっと企画書を出して、
「根拠が全然わからない」と一蹴されたことはありませんか？

趣味で作るだけならいいですが、ビジネスにするのであればやはりある程度マーケティングして、
アウトプットしたいものです。

でもいざやってみると非常に苦労します。
「なんで流行るの？」「それいくら儲かるの？」と言われても、調べ方も推測の仕方もさっぱりわからなかったりします。

そこで、初めて企画する人のために、どういう調査・分析をし、
アウトプットしていけばいいか簡単に書いてみたいと思います。

#基本の"き"
##市場の潮流理解
###新サービスが出てくるときは必ず何らかの変化がある
- 技術革新（インフラ、デバイス、アプリケーション）
- 革新的なプレイヤーの登場
- 生活環境の変化
- 労働環境の変化
- 国際的な動き・メカニズム
- 法改正
- これまでの非常識とこれからの常識
- 何かのリプレイス

　等々

###逆に消費者が満たしたいもの（ニーズ）は普遍的である
- もっと楽に・便利に
- もっと安心・安全に
- もっとリッチに
- 原始的な欲求
- 社会的意義

　等々

##競合サービス分析
###事業戦略分析
- IR
- プレスリリース
- ネット記事
- キーマンのインタビュー
- ヒアリング
- プロダクトからの逆算で想像

###数値分析
- IR
- ネット記事
- ヒアリング
- SimilarWeb(PV推定できる）
- AppStore,GooglePlay（DL数、売上が推定できる）：[AppAnnie](https://www.appannie.com/)で見よ
- アプリのDAU、MAU：[AppApeAnalytics](https://appa.pe/)

###ユーザ体験分析
- サービス使いまくる（※これ大事）
- 考察する：「なんで流行ってるのか」「なんで流行ってないのか」を人に説明できるレベルで
- ひたすら抽象化して、流行ってるものの共通点を見つける

##仮説立案
- 妄想：「こんなんあったらいいなあ」
- 構想：「こうすれば拡大・展開しそうだなあ」
- 事業企画：「こうすれば儲かりそうだな」（※これ大事）

##検証
- 事業企画書、PLにアウトプットする
- 戦略・ビジネスモデルの確からしさを確認する（※これ大事）

#応用
##マーケティング
###市場があるのかないのか
1. ニーズ：欠乏を感じている状態
2. 欲求　：ニーズが具現化された状態
3. 需要　：欲求に購買力/購買行動が伴う状態

###既存のスキームを使うのか、新しく作るのか
1. 「旧市場」×「旧スキーム」
2. 「旧市場」×「新スキーム」
3. 「新市場」×「旧スキーム」
4. 「新市場」×「新スキーム」

###市場規模
- 産業全体の市場規模ではなくて、さらにそのアイデアが対象とする市場規模を出す（そうすると大概すごく小さくなる）
- フェルミ推定する
- さらにボトムアップで算出してみて、妥当値を探る（既存のどのサービスがいくら儲かってるか、とかで足し算）

##実行計画、PLの作り方
###アプローチ
- 全職種・役割について、リソースが必要な可能性を検討する
- プロデューサー、ディレクター、エンジニア、デザイナ、営業、オペレーター、経理・総務・人事
- 新しいことをやる場合、類似サービスの開発期間を調べ、開発費を見積もる
- リクープラインを見極める（これが早いか遅いかで投資判断のしやすさが大幅に変わる）

###粗々で必要なコスト
- 人件費
- 外注費
- 広告費
- サーバ費
- 決済手数料

##収益化のパターン
###広告
- 自分たちで広告商品開発して枠売る（純広告、記事広告、等）
- 外部から広告もらう（ネットワーク系広告）

###有料会員（定額・サブスクリプション）
- クックパッド
- 食べログ
- NAVITIME
- ニコニコ動画
- Evernote
- Newspicks

###従量課金（都度課金）
- ソーシャルゲーム

###有料会員と従量課金のハイブリッド
- pairs
- オンラインゲーム

###仲介
- 何かと何かをマッチングして、仲介料・手数料で儲ける
- 不動産、人材、結婚、仕事、オークション・フリマ・・・

###EC
- 商品を販売して販売代金で儲ける
- 要はECサイトのこと

##その他泥臭い系アプローチ
###自力で調べてもわからないことは大人のやり方で調べる
- コンサル受ける
- 調査会社からデータ買う
- 人紹介してもらって徹底的にヒアリングする

###仮説をターゲットユーザにぶつける
- 5人ぐらいにアイデアぶつける
- 満遍なく70点ぐらいの反応のものより、1人に100点のアイデアを深掘る

以上です。

#おわりに
ひとまず基本的な観点を書いてみましたが、次に機会があれば、
具体的な例を出しながら、より高度なマーケティングの方法を解説したいと思います。
メリークリスマス！もっとアトラシアンのTシャツを手に入れるには？？

いよいよクリスマスイブがやってきました！

クリスマスといえば、プレゼントですよね♫ 
そして、アトラシアンのいえば Tシャツ！この壁に飾ってあるのは、すべてアトラシアンが作ってきた Tシャツの数々です。実際はもしかしたら、もっとあるかもしれないです。

![alt](http://philsimondev.wpengine.netdna-cdn.com/wp-content/uploads/2015/02/atlassian1.jpg)

今日は、アトラシアンの Tシャツが（プレゼントとして）貰える方法をいくつか紹介したいと思います。

<h1>スピーカープログラムに参加する</h1>
社内の勉強会やコミュニティで、アトラシアンの情報発信をすると、スピーカーTシャツがもらえます。特に、アトラシアンからプレゼンの内容やイベントの規模・種類について制約することもないので、気軽に申し込むことができます。

![alt](http://japan.blogs.atlassian.com/files/AUG4_3-300x176.jpg)

事前登録が必要になりますが、スピーカーをする予定のイベントまでにTシャツが届くように手配しているので、イベントで「I am a speaker.」のシャツで、アトラシアン社社長ハリントン氏の様にカッコよくプレゼンを決めることができます！

このプログラムの詳細は、[こちら](http://japan.blogs.atlassian.com/2015/09/i-am-a-speaker-t-shirt/) に記載されています。

<h1>Dragon Slayers に挑戦する </h1> 
まだ英語での記載になっているのですが、[Here Be Dragon](https://ja.confluence.atlassian.com/display/ATLAS/Here+Be+Dragons)をプログラムを制覇して、下記のような限定シャツをゲットすることができます。来年初頭に翻訳予定ですので、日本語につきましては、もう暫くお待ち下さい。m(__)m

![alt](https://pbs.twimg.com/media/AxssIMsCIAE9eQP.jpg)

実際には何をするかというと、アトラシアンの一連の製品を手順に沿ってインストールしてスクリーンショットや Twitter でつぶやくとシャツを貰うことができます。また購入しなくても、トライアルで行うことができます。ちょっとめんどくさいと思われがちですが、どうやら４時間半ほどで制覇できるようです。

シャツが届くまでに少し時間がかかるようなのですが（国際便でシドニーから送られるみたいです）素敵な緑色のシャツなので是非チャレンジしてみてください！


<h1>最後に</h1>
上記だけでなく、アトラシアンのイベントに参加するとTシャツがもらえることもあります。イベントに参加するだけで貰えるので、これが一番簡単な方法かもしれません。

アトラシアンではびっくりするくらいのTシャツを毎年作っているのですが（笑）、昨日２３日に家の大掃除をしていたら、アトラシアンのTシャツだけで１箱埋まってしまうくらい、入社以来沢山のTシャツをいただきました、、、。冬にTシャツを着るのは寒いと思ったあなた、しっかりオリジナルパーカーや父の日用の靴下なんかもあるようです。

![alt](https://pbs.twimg.com/media/COB8AnjUEAIf7ia.jpg)

皆さんも是非いろんなTシャツをゲットして、アトラシアンなファッションを楽しんでくださいね♫
では、よいクリスマスをお過ごしくださいませ！

明日は、いよいよアドベントカレンダー最終日！
@tashinmu さんがまとめてくれます。乞うご期待♫
RailsでHamlを使ってテキストエリアの確認画面を出す時の注意点

## Hamlではまったので、メモ

テキストエリアを使った入力画面の後に確認画面を出す時に以下のように記述すると

```haml
= f.hidden_field :memo
```

このように出力されてしまいます。

```html
          <input type="hidden" value="abc
          dhij
        
          xxxx" name="user[memo]" id="user_memo" />
```

このままの状態で入力画面に戻ったり、次の画面に遷移すると無用なスペースが入ってしまい入力した内容と違う状態でデータが保存されてしまいます。

上記の例で言うと

```
abc
dhij

xxxx
```

と入力したのに確認画面では以下のようにデータが書き換えられてしまいます。

```
abc
          dhij
        
          xxxx
```

入力画面⇔確認画面を繰り返すとどんどんスペースが増えてしまいます。

Hamlで書く場合は以下のように書きます。

```haml
= preserve f.hidden_field :overview
```

これで正しく出力されます。

```html
<input type="hidden" value="#abc&#x000A;dhij&#x000A;&#x000A;xxx" name="user[memo]" id="user_memo" />
```

なお`find_and_preserve`はタグの中身だけが対象となるので、`hidden`などに対しては使えません。
半日くらいはまったので、メモしておきます。

## 最後に
RailsでHamlを使うケースはそれなりにあると思ったのですが、このような基本的な文献が見つからずコードを追って解決しました。
以外とみんなHamlは使って無いのかな・・・？

デザイナーの事を考えると使わ無いほうがいいのかな・・・と悩みどころです。
Ubuntu 15.10 にプログラミング用フォント Ricty Diminished をインストール

# はじめに

Linux は、いろいろな部分でフォントがキレイではなく、視認性が悪いと生産性低下になってしまうため、見やすいフォントを導入するとよいのですが、そのための苦労がそれなりに必要でした。フォントの合成とか。
そこで、とても手軽に導入できる Ricty Diminished をインストールします。

- Ubuntu Mate 15.10 x86_64 (Desktop, 64-bit)

# 手順

## 1. Ricty Diminished をダウンロード

[yascentur/RictyDiminished · GitHub](https://github.com/yascentur/RictyDiminished) から【Download ZIP】ボタンを押下してダウンロードします。 git で clone 等お好きな方法でも問題ないです。

## 2. ZIP を展開

ZIP でダウンロードした場合は、展開します。
`$ unzip RictyDiminished-master.zip`

## 3. Ricty Diminished をインストール

ファイラーで RictyDiminished-master/ を開き、フォントファイル (.ttf) で右クリックし、フォント・ビューアで開き、右下の【フォントのインストール】を押下してインストールします。

※ Ubuntu Mate のファイラーは、Caja ですので、次のコマンドで開くこともできます。
　`$ caja RictyDiminished-mater/`

## 4. テキストエディタ pluma のフォントに指定

例として、pluma で使用するフォントとして Ricty Diminished を指定します。

- 「編集」ー「設定」ー「フォントと色」
    - 「システムの固定幅フォントを使う」のチェックを外し、「エディタのフォント」に好みの Ricty Diminished を指定します


# おわりに

これで、いろいな箇所で Ricty Diminished を指定すれば、快適に過ごせます。
[Rails][RMagick] Macでbrew updateしたら、rails s すると以下のエラーが出るようになった時、 brew info と brew switchで乗り切る

この間 brew update したら ImageMagickのバージョンがあがってしまい、RMagickが動かなくなりました。

```rb
$ rails s
=> Booting Puma
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
Exiting
/Users/hoge/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.0/lib/active_support/dependencies.rb:274:in `require': This installation of RMagick was configured with ImageMagick 6.9.0 but ImageMagick 6.9.2-10 is in use. (RuntimeError)
```

ほんとなんてこったいですな。

ちょっと前ならhomebrew-boneyard入れてbrew versions imagemagickと叩いて色々してくと、サササっと解決できたのですが、今はこれも過去のツール。動きません。

いまだと[homebrew-versions](https://github.com/Homebrew/homebrew-versions)を使うとそれっぽい解決が出来ますが、今回はもっと単純に済みました。

```rb
$ brew info imagemagick

$ brew info imagemagick
imagemagick: stable 6.9.2-10 (bottled), HEAD
Tools and libraries to manipulate images in many formats
http://www.imagemagick.org
/usr/local/Cellar/imagemagick/6.9.0-9 (1442 files, 22M)
  Poured from bottle
/usr/local/Cellar/imagemagick/6.9.2-10 (1453 files, 22M) *
  Poured from bottle
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/imagemagick.rb
==> Dependencies
Build: xz ✔, pkg-config ✔
Required: xz ✔, libtool ✔
Recommended: jpeg ✔, libpng ✔, libtiff ✔, freetype ✔
Optional: fontconfig ✘, little-cms ✘, little-cms2 ✘, libwmf ✘, librsvg ✘, liblqr ✘, openexr ✘, ghostscript ✘, webp ✘, fftw ✘, pango ✘
==> Options
--with-fftw
.
.
.
```

6.9.0-9と6.9.2-10がインストールされているのがわかります。
現在は後者が使用されているので、これを切り替えます。

```rb
$ brew switch imagemagick 6.9.0-9

Cleaning /usr/local/Cellar/imagemagick/6.9.0-9
Cleaning /usr/local/Cellar/imagemagick/6.9.2-10
71 links created for /usr/local/Cellar/imagemagick/6.9.0-9
```

```rb
$ brew info

.
.
/usr/local/Cellar/imagemagick/6.9.0-9 (1442 files, 22M) *
  Poured from bottle
/usr/local/Cellar/imagemagick/6.9.2-10 (1453 files, 22M)
  Poured from bottle
```

切り替わってるのがわかるかと思います。

これで乗り切れました。
Node.jsのexportsとmodule.exportsの違いについてのメモ

既にいくつか記事がありましたが、自分の中で整理するためにメモ

# 参考

+ [Node.js : exports と module.exports の違い（解説編）](http://d.hatena.ne.jp/jovi0608/20111226/1324879536)
+ [実践Node.js プログラミング (Programmer's SELECTION)](http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Node-js-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Programmers-SELECTION-Cantelon/dp/479812947X/ref=sr_1_3?ie=UTF8&qid=1450871929&sr=8-3&keywords=node)
+ [Node.jsのexportsとmodule.exportsについて](http://koexuka.blogspot.jp/2013/04/nodejsexportsmoduleexports.html)

# 結論

+ [公式ドキュメント](http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/modules.html#modules_exports_alias)に「もし exports と module.exports の間の関係が魔法のように 見えるなら、exports を無視して module.exports だけを使うようにしてください」とあるので今いち違いが分からない場合、module.exportsをとりあえず使うということで良さそう
+ クラスのようなものを作成するような場合にはmodule.exportsを使えば良い(例えばコンストラクタを使うなども）
+ 関数だけモジュール化したい場合にはexportsを使う事で実現できる
+ exportsが指定されていない関数についてはrequireしても利用できない


# exportsを試す

以下のような3つの関数を定義する

```lang:util.js
exports.sayAdd = function(a, b) {
  say(a + b);
}

exports.saySubtract = function(a, b) {
  say(a - b);
}

say = function(word) {
  console.log(word);
}
```

say関数については`exports`を付与していない

上記utilを使うファイルを作成して実行してみる

```lang:main.js
var util = require('./util');

util.sayAdd(1, 2); // 3
util.saySubtract(2, 1); //1
util.say // error. util.say is not a function
```

exportsした関数については利用可能だが、exportsしていない関数については利用できない。ただし、同じファイル(util.js)の関数からはexportsしていない関数へのアクセスも可能となっている

# module.exportsを試す

映画のクラス?を作ってみる

```lang:movie.js
// コンストラクタ
var Movie = function(title) {
  this.title = title;
}

Movie.prototype.sayTitle = function() {
  say(this.title);
}

say = function(word) {
  console.log(word);
}

module.exports = Movie;
```

これを使ってみる。

```lang:main2.js
var Movie = require('./movie');

var movieA = new Movie('Star Wars');
movieA.sayTitle(); //Star Wars

var movieB = new Movie('Mad Max');
movieB.sayTitle(); // Mad Max
movieB.say(); // error. movieB.say is not a function
```

こんな感じでコンストラクタで映画のタイトルを指定するようなクラスのようなものを作成する事ができた。

以下のように書く事もできる。


```lang:movie.js
module.exports = function(title) {
  this.title = title;

  this.sayTitle = function() {
    say(this.title);
  }
}

function say(word) {
  console.log(word);
}
```
git rebaseでハマったときにやること

## はじめに
自分が何をやっているのかわかれば`git rebase`も怖くない。
何をやっているのかはわからないがただgitのコマンドを打ったり、なんとなくSourceTreeが使えるという状態では`git rebase`は控えたほうがよいだろう。

## --abort
`rebase`で大抵の問題（コンフリクトしたりしたときとか何か問題が起こった場合）は、焦らず、ターミナルにこういうときはこういうコマンド打ったほうがよいよと英語でメッセージでてるので、そのとおりするとうまくいくが、コンフリクト解消中とかになんかよくわけわかんなくなって、もう`rebase`いいや、強引に`git reset --hard`とかで戻ろうみたいなことやっても、gitが`rebase`中なのを覚えてしまってにっちもさっちもいかなくなって、Source Treeも

![rebase.png](https://qiita-image-store.s3.amazonaws.com/0/27895/5a517256-949d-8638-a9a8-6f59d7ecdb2d.png)

こんな感じになったときは、

```
$ git rebase --abort
```
で解決するときがある。

なんか状況によっては、`rebase`途中なの示す`lockファイル`的なやつをremoveしてね的なメッセージが出るときはそのファイルを削除すればよかったので、場合によって解決方法が変わるように思う。

参考: [git rebaseって超便利じゃね？ - Seasons.NET](http://blog.seasons.cc/entry/20090329/1238351273)
ド・モルガンでコードのリファクタ

# はじめに
[Hamee Advent Calendar](http://qiita.com/advent-calendar/2015/hamee) 23日目の記事です
人間が得意な事とコンピュータが得意な事を今更ですが実感しました

# 道具
`ド・モルガンの定理`

```math
\neg(P \vee Q) = \neg P \wedge \neg Q \\
\neg(P \wedge Q) = \neg P \vee \neg Q
```

恐らく数学Aで習うド・モルガンの定理
プログラム的に書くとこうなります

    !(P || Q) === !P && !Q
    !(P && Q) === !P || !Q
証明はやりませんが、集合論っぽくやるなら左辺の任意の元が右辺に含まれる事
また、右辺の任意の元が左辺に含まれる事を示してあげるといいです
今回はド・モルガンの定理を用いて既存コードのリファクタをしてみます

# 問題①
下記をド・モルガンを使いリファクタせよ

    if ($a === '' || $a === 0) {
        // 処理A
    } else {
        // 処理A
        // 処理B
    }


回答例
①処理Aを外に出す

    if ($a === '' || $a === 0) {
    } else {
        // 処理B
    }
    // 処理A

②if文がtrueの際に実行することが無いのでelseを削除


    if (!($a === '' || $a === 0)) {
        // 処理B
    }
    // 処理A

③ド・モルガンの定理を利用

    if ($a !== '' && $a !== 0) {
        // 処理B
    }
    // 処理A

これくらいならド・モルガンとか使わなくても一発で書けそうですが、
なんとなく書いているとミスが起こりやすいので、使える定理は使った方がバグ撲滅になるかと思います。

# 問題②
下記をド・モルガンを使いリファクタせよ

    if ($a === '' || ($a !== 0 && $a !== 'a')) {
        // 処理A
    } else {
        // 処理A
        // 処理B
    }

回答例
①処理Aを外に出す

    if ($a === '' || ($a !== 0 && $a !== 'a')) {
    } else {
        // 処理B
    }
    // 処理A

②if文がtrueの際に実行することが無いのでelseを削除

    if (!($a === '' || ($a !== 0 && $a !== 'a'))) {
        // 処理B
    }
    // 処理A

③ド・モルガンの定理をif文全体に利用

    if ($a !== '' && !($a !== 0 && $a !== 'a')) {
        // 処理B
    }
    // 処理A

④ド・モルガンの定理をif文の内部で利用

    if ($a !== '' && ($a === 0 || $a === 'a')) {
        // 処理B
    }
    // 処理A

１から書く時はこんな冗長な書き方はしないと思いますが、保守とかやっていると変なコードを見かけることもあります
たかだか数行の世界ではなく何万行の世界でやっているとそんな時もありますよね

# おわり
群とか環とか体とか集合を扱う研究をしていたので、数学とプログラムを結びつけれたらなと思うのですが、
この程度なら正直数学の「す」の字も必要ないですorz
ただ、なんとなく書くのではなく1行1行の処理でバグを生まないか、数学の証明を書く気持ちでコードを書くとバグは減るかなって思います
rails s がうまく動かないときにやったこと

Ruby on Rails を使って開発していて、ある日突然 `rails s` しても立ち上がらなくなるときがあります。
実体験に基づいています。つらい。

# rails server が立ち上がるけど何も反応しない
このケースは、

```
$ rails s
```

をしてもちゃんとサーバが立ち上がります。しかし、 localhost:3000 とかでアクセスしてみてもログが流れません。
当然、ブラウザには何も表示されない事態が起こります。

このときは

```
$ ps ax | grep httpd
```

とかしても apache が動いていることが確認できて、わりとはまりました。
このときは、`/etc/hosts` に

```
127.0.0.1 localhost # IPv4
```

がなく、

```
::1 localhost # IPv6
```

はだけある状態だったので、 IPv4 の記述をしたところ動くようになりました。

# すでに3000番ポートが使われてると怒られる場合。

このときは

```
$ rails s
```

とかすると、

```
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (4 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (3 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (2 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (1 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
retrying in 0.5 seconds (0 tries left)
adding listener failed addr=0.0.0.0:3000 (in use)
Exiting
/Users/user_name/git/project/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.2/lib/unicorn/socket_helper.rb:185:in `bind': Address already in use - bind(2) for 0.0.0.0:3000 (Errno::EADDRINUSE)
```

こんな感じに怒られます。
この場合はたいてい他に rails server が立ち上がってたりするケースが多いので、もう一方の rails server を落とせばいいです。

しかし自分の場合は

```
$ ps ax | grep ruby
$ ps ax | grep rails
```

とかやっても実行中のプロセスが見つかりませんでした。
なので、`lsof` してオープンしてるプロセスをみてみると

```
$ lsof -i:3000
COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
VBoxHeadl 91045 user_name   19u  IPv4 0xda7db325f97a1df3      0t0  TCP *:hbci (LISTEN)
```

VirtualBox が生き残ってたようです。 ~~`vagrant halt`したのに~~
そんなわけで動いていた VM を終了させて無事 `localhost:3000` でアクセスできるようになりました。
UNIXコマンド知らなさすぎてかなり遠回りしてしまった感があります。。

またいろいろと rails server 周りで嵌まるたびに追加していこうと思います。
Excelを使って、シンプルだけど強力な家計簿を作ってみよう


f-murakamiです


今日はクリスマスイブですね。
この特別な日に記事を書くのは、ハードルが高かった？のですが、他の日は埋まってましたので思い切ってエントリーしてみました。


で、何を書くのかというと「Excel」についてです。

「クリスマスイブにExcelかよ！」
っていう残念な声が聞こえてきそうですが、ご容赦ください。

それに、ExcelってQiitaの思想であるプログラミングとは違うかもしれないですが、IT技術としては共通していると思うので大丈夫でしょう。

ただ、単に数式がどうだという記事だったら、一般的に「そんなん知ってるよー」っていう人がほとんどで、面白い記事にならないと思うので、実用的に使える例を取り上げて、記事を書こうと思います。

それは、タイトルでも書いてますが、「Excelで家計簿を作ってみよう」です。

# Excelで家計簿を作るとなると

Excelを使った家計簿なんて、めずらしくもなんともないのですが、世にある数多の家計簿アプリを使ってみたけど、いまいちしっくりこない、という方もおられると思います。
そういう場合は、やはり原点のExcelに帰ってみましょう。

Excelで家計簿を作るなら、

「入力しやすい。一括入力とか簡単そう」
「いろいろ集計できたり、グラフ化が簡単にできそう」

っていう面もあれば、

「一から入力しないといけないので、なんだかんだ、めんどうなんだよね」
「集計が簡単っていても、数式の埋め込みとかややこしそう」

ってところもあるでしょう。

# シンプルで強力な家計簿を目指す

というわけで、Excelで作るなら、なるべくシンプルで手間がかからないのがいいですよね。
それでいて、効果抜群の強力なモノ。

そこで、シンプルだけど強力な家計簿の作り方をご紹介します。
私も実際使っているもの（実際はもう少し複雑なのですが）で、数年間続いています。

（注意）
　一つ前提として、Excel2007以上が必須となります。
　MacならLibreOfficeでOKです。（もちろんWindowsでも）


# 家計簿の作り方

シートを２つ作ります。

* 1シート目は「サマリー」
* 2シート目は「明細」

## 明細シート

明細シートでは以下の列を用意します。

* 月
* 日
* 内容
* 金額
* 費目

![明細.jpg](https://qiita-image-store.s3.amazonaws.com/0/100539/8d99fc97-8cf6-dd75-0e01-d48220398d22.jpeg)

費目は好きなように分けてください。
例）食費、日用品、子供用品、外食、衣服、家財、・・・

明細シートでは、ひたすら支出内容
を書いていきます。

## サマリーシート

明細シートで入力された金額を月毎・費目毎に集計するのが、サマリーシートになります。

このシートでは、年月ごとに、費目行を設定します。

![サマリー.jpg](https://qiita-image-store.s3.amazonaws.com/0/100539/b8543d14-6e76-92c2-8175-78445412ad69.jpeg)


集計を自動で行うため、各セルに数式を入れていきます。

ここでやりたいことは、月が一致、かつ、費目が一致する金額を合計することです。
しかし、条件が２つあるので、従来の「SUMIF」では対応できません。

複数の条件の下で合計を計算するには、「**SUMIFS**」という関数を使います。
（Excel2007で新設された関数です）

```
=SUMIFS(合計したい列の範囲, 条件を判定する列の範囲１, 条件１, 条件を判定する列の範囲２, 条件２)
```

つまり、

```
=SUMIFS(明細.金額列[D], 明細.月列[A], サマリー.年月行の月[x3], 明細.費目列[E], サマリー.費目[Bx] )
```
となり、

セルC4の数式は

```
=SUMIFS($明細.$D$3:$D$38,$明細.$A$3:$A$38,MONTH(C$3),$明細.$E$3:$E$38,$B4)
```

となります。

この数式をすべてのセルにセットします。
あとは合計欄をいれましょう。

これだけで１年間の家計簿ができあがります。
明細をひたすら入力するだけで、自動的に集計してくれます。
月毎・費目毎のリストになってますので、ここからグラフ化するのは簡単ですよね。

また、今回はシンプルな形ですが、月々の固定費まで含めることもできますし、さらに資産の管理（B/S）まですることもできますよ（そこまでする人は稀だと思いますが・・・）


# おわりに

プログラミング技術とは違うのですが、実用的な内容を記事にしてみました。

ちょうど2016年に変わりますし、来年こそはお金をしっかり管理して、有効にお金を使いたい方は
ぜひこの記事でご紹介した家計簿を作ってみて、充実した生活を送ってみませんか。

それでは。
[AWS]フォーム付き静的コンテンツを独自SSL/独自ドメインで公開するまで③-CloudFront編

お問い合わせフォーム付きWeサイトを

- S3で
- Slack通知ありで
- 独自ドメインで(お名前.comよりCNAMEを利用)
- 独自SSLで（https/SNIベース）

公開するまでの備忘録
どこにでもやり方やリンクは転がってますが個人的にまとめます。

前回まででサイトは出来上がったので、
今回は独自ドメインからアクセスできるように
CloudFrontを使って通信をHTTPSにしましょう。

ちなみに前提として
すでにお名前.comでドメインを持っているとして
そのサブドメインを扱うとします（ニッチ）

流れは、
SSLをアップロードしたIAMを作成
CloudFrontに配信を行うS3のエンドポイントとSSLを持ったIAMを設定
お名前.comよりCNAMEで設定するドメインからCloudFrontにリダイレクトするようにCNAMEを設定

各リンクは以下

* [[AWS]フォーム付き静的コンテンツを独自SSL/独自ドメインで公開するまで①-S3編](http://qiita.com/tutida/items/bfc3865f2035483d2c43)
* [[AWS]フォーム付き静的コンテンツを独自SSL/独自ドメインで公開するまで②-lambda/Cognito編](http://qiita.com/tutida/items/9194292e09e894b36888)

## 技術要件

- AWS
 - S3
 - aws-cli
 - Cognito
 - Lambda
 - aws-sdk
 - **CloudFront**<-今回はここ
- **dnsまわり**<-今回はここ

## SSLのアップロード

aws-cliを使います。  
[AWS CLI を使えるようにしてみよう](http://qiita.com/fantasista_21jp/items/7640ad50fafae1ee5ac3)

### aws-cliでアップロード
なぜかcliでしかSSLをIAMにアップロードできないので、CLIで行います。

作業をする環境に以下のような各ファイルがあるとします。

- SSL 秘密鍵…server.key
- SSL 証明書…server.crt
- SSL 中間証明書…chain.crt

以下のコマンドを実行でIAMにアップされます。

```
aws iam upload-server-certificate
    --server-certificate-name example.ssl
    --path /cloudfront/
    --private-key file://server.key
    --certificate-body file://server.crt
    --certificate-chain file://chain.crt
```

- --server-certificate-name ：IAMの名前、分かりやす物で
- --path /cloudfront/：ここはcloudfrontで
- --private-key file://server.key：各ファイルを指定
- --certificate-body file://server.crt
- --certificate-chain file://chain.crt

## CloudFront
### Distributionの作成
Amazon Management Consoleより「CloudFront」を選択
「Create Distribution」でDistributionを作成します。

Webを選択

![2015-12-23_00h42_14.png](https://qiita-image-store.s3.amazonaws.com/0/74129/62a74f97-e425-538a-723f-6fefe62dcfc9.png)

ここの「Origin Dmain Name」に静的コンテンツを置いている
`S3のエンドポイントURL`を入力します。
例：http://example.co.jp.new.s3-website-ap-northeast-1.amazonaws.com/service.html
![2015-12-23_00h42_42.png](https://qiita-image-store.s3.amazonaws.com/0/74129/dc70e550-152d-c2e4-8aa9-ffbadc9d634d.png)
このあたりはお好みで。
![2015-12-23_00h43_45.png](https://qiita-image-store.s3.amazonaws.com/0/74129/314e1d63-b7aa-1a78-5fa4-25a85d4c108f.png)

- Alternate Domain Names ：ここにお名前.comで取得したドメインを記入
- SSL Certificate ：Custom SSL Certificateを選択。先ほどアップロードしたSSLのIAMを選択
- Custom SSL Client Supprt ：「Only Clients that Support Server Name Indication(SNI)」を選択

SNIベースの方が安い+申請に時間がかかりません
![2015-12-23_00h43_53.png](https://qiita-image-store.s3.amazonaws.com/0/74129/bec752a5-6e06-7421-008c-bcf5584f8f5d.png)

これで「Create Distribution」を押せばCloudFrontの設定は終了。
しばらく「in progress」で機能しませんが20分ほど待てば「Deployed」になります。

この「Domain Name」をお名前.comのCNAMEに使います。
![2015-12-23_00h58_10.png](https://qiita-image-store.s3.amazonaws.com/0/74129/4091c984-3a5b-23a4-595b-2aa1f3f6a690.png)

## お名前.com
### CNAMEの設定
http://coderdojo-nishinomiya.info/aws-s3-cname/
上記サイトを参考に、S3のエンドポイントURLになっている箇所を
先ほど作成したDistributionのURLにするだけで終わりです。

## 終了
DNSの更新が終了すればS3の内容がCloudFront越しにHTTPSで配信されています（ﾊｽﾞ

お疲れまでした。
[AWS]フォーム付き静的コンテンツを独自SSL/独自ドメインで公開するまで①-S3編

深遠なる理由によりPHPで動いているフォーム付きWebサイトをS3により静的コンテンツ配信に切り替えることになりました。
お問い合わせフォーム付きWeサイトを  

* S3で
* Slack通知ありで
* 独自ドメインで(お名前.comよりCNAMEを利用)
* 独自SSLで（https/SNIベース）

公開するまでの備忘録
どこにでもやり方やリンクは転がってますが個人的にまとめます。

今回は**S3で静的コンテンツ配信**まで。

各リンクは以下  

- [[AWS]フォーム付き静的コンテンツを独自SSL/独自ドメインで公開するまで②-lamda/Cognito編](http://qiita.com/tutida/items/9194292e09e894b36888)
- [[AWS]フォーム付き静的コンテンツを独自SSL/独自ドメインで公開するまで③-CloudFront編](http://qiita.com/tutida/items/7a0396008d19d9051511)

## 技術要件
- AWS
 - **S3** <-今回
 - **aws-cli** <-今回
 - Cognito
 - Lambda
 - aws-sdk
 - CloudFront
- dnsまわり

## S3で静的コンテンツ設置
### 1.Amazon Management ConsoleからS3を選択
![2015-12-22_11h00_35.png](https://qiita-image-store.s3.amazonaws.com/0/74129/41dc2bd5-e681-04b6-85ca-524bbb9459b1.png)

### 2.Bucketを作成
Bucket名は公開するときにあてたいドメインと一緒にする（今回は関係ないけど）
![2015-12-22_11h22_31.png](https://qiita-image-store.s3.amazonaws.com/0/74129/73249ae5-94c2-42d1-1c04-65dde23d9dd1.png)

### 3.静的ウェブサイトホスティング
Bucket作成後、[プロパティ]->[静的ウェブサイトホスティング]静的ウェブホスティングを有効にする
![2015-12-22_11h34_18.png](https://qiita-image-store.s3.amazonaws.com/0/74129/4e7fb64f-1e40-a8d7-688f-893d3785091a.png)

### 4.バケットポリシーの編集
このままではBucket内のコンテンツへのアクセス権が外部のユーザにはないで
[プロパティ]->[アクセス許可] バケットポリシーの編集
![2015-12-22_11h37_38.png](https://qiita-image-store.s3.amazonaws.com/0/74129/f4af92fb-9104-fe7c-bd08-c211da47428e.png)
例：すべての外部ユーザがバケット内を見ることが出来るポリシー

```
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AddPerm",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::example.co.jp/*"
		}
	]
}
```

これで、項目3に記載されているエンドポイントから各コンテンツにアクセスが出来るようになります。

## とりあえず、ここまで
あとは、フォームの内容をアップロードするだけです。

開発環境からのアップロードは以下を参考に

- aws-cli [AWS CLI を使えるようにしてみよう](http://qiita.com/fantasista_21jp/items/7640ad50fafae1ee5ac3)
- sync [aws s3 sync でAmazon S3のバケット内のデータをローカルに同期する](http://qiita.com/niusounds/items/bb8b8bd065d2589b9669)
    
次はフォームを作っていきます。  

* [[AWS]フォーム付き静的コンテンツを独自SSL/独自ドメインで公開するまで②-lamda/Cognito編](http://qiita.com/tutida/items/9194292e09e894b36888)
document.cookieをlocalStorageにする

document.cookieは便利なのですが、たまにどうしようもなく不便に感じるときがあります。localStorageに全部置き換えられるなら、そうしてしまいたい時も年に一度ぐらいは。

js側からcookieを操作するときに大体の場合は`$.cookie`かまたはその類似のものを使っているので、そちらを操作してもなんとかなるとは思いますが、せっかくなのでES5で入った機能を使います。

### Object.defineProperty

[Object.defineProperty - MDN](
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)

Object.definePropertyを使うと既存のオブジェクトに対して、getterとsetterを追加できます。現在の主要なブラウザでは[ほとんどサポートされているようです](http://caniuse.com/#search=defineProperty)

しかし、document.cookieは特別なObjectの一つです。definePropertyが使えるのかと思って調べてみたのですが、やってみると案外と出来ました。以下のコードをデベロッパーツールで実行してみてください。

```js
Object.defineProperty(document, "cookie", {
    get: function () {
        console.log("getter");
    },
    set: function (cookie) {
        console.log("setter");
    }
});

```
```js
> document.cookie
getter

> document.cookie="test=1"
setter
```

Mac上のChrome 47, Firefox 43では動作することは確認できましたが、他のブラウザでは動かない可能性があります。

事前準備ができたのでlocalStorageと組み合わせて`document.cookie`の操作をハックします。

### コード

```js
Object.defineProperty(document, "cookie", {
    get: function () {        
        var cookies = JSON.parse(localStorage.getItem('cookies'));
        if (!cookies) {return "";}

        var strs = [];
        for(var key in cookies){
            strs.push(cookies[key]);
        }
        return strs.join(";"); 
    },
    set: function (cookie) {
        // console.log(cookie);
        var cookies = JSON.parse(localStorage.getItem('cookies')) || {};        
        var key = cookie.match(/^[^=]+/);
        cookies[key] = cookie; 
        localStorage.setItem('cookies', JSON.stringify(cookies));
    }
});
```

### 結果

```js
> document.cookie
""

> document.cookie="test1=1"
"test1=1"

> document.cookie="test2=2"
"test2=2"

> document.cookie
"test1=1;test2=2"

> localStorage["cookies"]
"{"test1":"test1=1","test2":"test2=2"}"
```


### 対応できていないこと

上記の例では以下のものに対応していません。対応が難しそうなものほど下になっています。

* ２つ以上の値を同時に設定すること
* path
* expire, max-age
* サーバとの送受信
* secure
* domain
* httpOnly

domainやhttpOnlyの挙動をjsで対応するのは難しいですね。httpOnlyは振る舞いだけなら実装できますが、値をjsから取得できないという部分を満たせません。js部分の実装時にその２つを明示的に設定しているケースは、あまりないとは思いますが。

サーバとの送受信時の処理は、Service Workerでプロキシすることで出来るのではないかとは考えていますが未検証です。

またSafariのprivate modeではlocalStorageが動作しない問題がまだ残っているようなので、cookieの情報がないと動かないといった場合には向いていません。
UICollectionView に位置固定のヘッダーを表示する

``UICollectionViewFlowLayout`` の ``sectionHeadersPinToVisibleBounds`` を ``true`` にする。
同じく FlowLayout の ``headerReferenceSize`` のサイズを設定する。
ストーリーボードを使わない場合、デフォルトは (0,0) なので必ず設定する。

下記はストーリーボードを使用した場合の処理

```swift
override func viewDidLoad() {
    super.viewDidLoad()
    
    // あらかじめストーリーボードで CollectionView の View セクションの Tag に 1 を設定しておく
    let cv = self.view.viewWithTag(1) as! UICollectionView
    // FlowLayout を取得して　sectionHeadersPinToVisibleBounds を true にする
    let fl = cv.collectionViewLayout as! UICollectionViewFlowLayout  
    fl.sectionHeadersPinToVisibleBounds = true // sectionHeadersPinToVisibleBounds は flowlayout にしかない
}

// ヘッダーのセルを生成する ヘッダーもフッターも SupplementaryElement という扱いらしい
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {

    var reusableview: UICollectionReusableView? = nil
    // ヘッダーの時のみ処理する
    if kind == UICollectionElementKindSectionHeader {
        let headerView = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: "header", forIndexPath: indexPath)

        let lbl = UILabel(frame: CGRectMake(5,5,100,50))
        lbl.text = "HEADER!"
        headerView.addSubview(lbl)
        reusableview = headerView
    }
    return reusableview!
}
```
Xcode のパッケージマネージャー Alcatraz

こりゃ便利。

http://alcatraz.io

インストール

```bash
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
```

インストール後、メニューの Window から Package Manager でパッケージが表示される。
コード保管を部分一致で絞り込める ``FuzzyAutocomplete`` と、 OpenQuickly の候補を ``Ctrl-N`` ``Ctrl-P`` で選択できる ``OpenQuicklyCtrlNP`` をインストールした。
技術英語 > It should be noted, Sir that ... / May I have your attention please.

@ Star Trek movie > Generations

ある発見をしたデータ少佐がピカード艦長に

> It should be noted, Sir that ...

何かを強調したい時に使うのだろう。

<hr>
関連して思い出したのは

> May I have your attention please.

会議などの集まりで休憩終わり時に周りが話し込んでいる中、話を切り出す時に使ったりした。

http://ejje.weblio.jp/sentence/content/Attention+Please
tseによるワンライナーWebスクレイピング


## はじめに

[クローラー／Webスクレイピング Advent Calendar 2015](http://qiita.com/advent-calendar/2015/crawler)の23日目です。
またAdventerの[Perfume Advent Calendar 2015](http://www.adventar.org/calendars/887)も兼ねてますm(_ _)m

Pythonによるテキスト整形ツール「[tse](https://pypi.python.org/pypi/tse)」を用いて、ワンライナーWebスクレイピングを紹介しようと思います。

## tseとは？

詳しくは今年のPyCon JP 2015で石本さんが発表されたスライドを見れば、理解できるかと思います。
[tse - Pythonによるテキスト整形ユーティリティ](http://www.slideshare.net/atsuoishimoto/tse-python)

先日tseの紹介記事を書いたので、そちらも参考にどうぞ。
[tse - Text Stream Editor in Python の紹介](http://qiita.com/massa142/items/44cac3f5d0b2f4d62c7d)

## Perfumeの最新ニュースを取得

それでは来週に控えた紅白歌合戦でのPerfumeのパフォーマンスをより一層楽しむために、頭の整理として直近のニュースを音楽ナタリーからざっと拾ってきましょう。

## 実際にやってみる

```
curl http://natalie.mu/music/news/list/artist_id/217 | tse -ms 'bs4' -b 'for dt in BeautifulSoup(sys.stdin.read(), "lxml").find_all("dt", class_="NA_title", limit=30):{{print(dt.string)}}'
```
```lang:出力
紅白でV6 & Perfumeがミッキーたちと共演、嵐は「スター・ウォーズ」とタッグ
嵐、AKB、ベビメタ、X JAPANほか「Mステスーパーライブ」曲目発表
「紅白歌合戦」出場歌手曲目発表、小林幸子は「千本桜」披露
CDTV年越し特番にaiko、アレキ、KANA-BOON、T.M.R.、Perfume、星野源ら
Perfume、アニバーサリー武道館ライブ映像集のティザー解禁
音楽＆サブカル系映画イベントでPerfumeドキュメンタリー、BiSキャノほか上映
48＆46、スタダ、ハロプロ混成メドレーも！ライブ特化型「FNS歌謡祭」16日OA
川谷絵音の誕生日を豪華面々が祝福、indigo la End史上最大ワンマン大盛況
「Mステ」年末SPにミスチル、ラルク、YUKI、ベビメタ、嵐、X JAPANら豪華42組
Perfume×競技かるた、映画「ちはやふる」予告編で新曲解禁
“ニセ3人娘”も来た！23年目の「AAA」でPerfume、ポルノ、神木隆之介ら豪華共演
原作者＆広瀬すず感激、Perfumeが映画「ちはやふる」書き下ろし主題歌
涙あり笑いありモノマネあり！歓喜の第66回紅白出場者会見
紅白にBUMP、乃木坂、星野源、ゲス、μ'sら10組初出場！X JAPANは18年ぶり
Perfumeがメルセデス・ベンツのキャラクターに、デザインは貞本義行
Perfume武道館ライブが映像化、初回盤に10DAYSダイジェスト＆すごろく全公演
チャット企画「こなそんフェス」にPerfume、KANA-BOON、シアターブルック
日テレ4時間音楽特番にaiko、いきもの、きゃりー、セカオワら29組
「FNS歌謡祭」に嵐、Perfume、三代目、ももクロ、星野源ら
「MTV VMAJ」受賞者に星野源、三代目JSB、安室ら
来週「Mステ」にいきもの、NMB、大原櫻子、関ジャニ、bknb、Perfume
「Perfumeスゴイぞ芸人」再び！掟ポルシェ、阿佐ヶ谷姉妹渡辺が登壇
Perfume、徳間時代のアルバム5作品がアナログ化
次回「魁」にエビ中、TOKIO、Perfume、KANA-BOON、グドモ登場
Perfume、総務大臣賞/ACCグランプリ受賞し「チームを評価してもらえてうれしい」
PerfumeのYahoo!検索きせかえに「STAR TRAIN」Ver.登場
次回「CDTV」にPerfume、いきものがかり、TOKIO登場
「数年来の大ファン」志村けんがPerfumeを対談相手に指名、Eテレでオンエア
「ずっと3人で一緒に」Perfume、映画祭でこれからの夢を明かす
東京国際映画祭レッドカーペットにPerfume、ぱるる、ELT、宮野真守、GACKTら登場
```

### 注目記事
『紅白でV6 & Perfumeがミッキーたちと共演、嵐は「スター・ウォーズ」とタッグ』

このニュースはやばいですね！Perfumeとディズニーのコラボ！！
2013/08/14 NHK総合テレビ『みんなをつなぐ魔法のメロディー“ディズニー＆ジブリの名曲”』での感動が再び！！！
https://www.youtube.com/watch?v=qdPDeG_XxaU


## 解説
### tse
	-ms  -- <モジュール名 import * 形式>でインポートする
	-b   -- 起動直後に実行するアクション
	{{}} -- インデントするブロックを指定

tseの`-ms`オプションのおかげで、BeautifulSoupをワンライナーで実行できることができました！

## おわりに

以上、tseを用いたワンライナーWebスクレイピングの技を紹介しました。

tseは普段慣れているPythonでの記述をワンライナーに応用できてめっちゃ便利です！
ぜひPerfume以外のシーンでも使ってみてください。

さて、[クローラー／Webスクレイピング Advent Calendar 2015](http://qiita.com/advent-calendar/2015/crawler)も残すところわずかです！
最終日の[@jz5](http://qiita.com/jz5)さんによって、Advent Calendar未投稿者として晒しあげられないように皆さん気を付けていきましょう。
さっき気づいたこと

OpenGLとDirect3Dじゃ透視変換行列の表現、若干違うのな.

変数の説明とか省くけど, 
 
・OpenGL
　　　　　　m11 :=  2*N /(R-L);  m12 :=      0     ;  m13 :=     0     ;  m14 :=     0     ;
　　　　　　m21 :=      0     ;  m22 :=  2*N /(T-B);  m23 :=     0     ;  m24 :=     0     ;
　　　　　　m31 := (R+L)/(R-L);  m32 := (T+B)/(T-B);  m33 :=   (N+F)/(N-F);  m34 :=    -1     ;
　　　　　　m41 :=      0     ;  m42 :=      0     ;  m43 := 2*N*F /(N-F);  m44 :=     0     ;

・Direct3D
　　　　　　m11 :=  2*N /(R-L);  m12 :=      0     ;  m13 :=     0     ;  m14 :=     0     ;
　　　　　　m21 :=      0     ;  m22 :=  2*N /(T-B);  m23 :=     0     ;  m24 :=     0     ;
　　　　　　m31 := (R+L)/(R-L);  m32 := (T+B)/(T-B);  m33 :=   F/(N-F);  m34 :=    -1     ;
　　　　　　m41 :=      0     ;  m42 :=      0     ;  m43 := N*F /(N-F);  m44 :=     0     ;
Swift の pragma mark の書き方

こうするとメソッドのドロップダウンリストに強調されて表示される。

```swift
// MARK: hogehoge
// TODO: todo hoge
// FIXME: fix fuga
```

``-`` を挿入するとメソッドのドロップダウンリストに水平線が入る

```swift
// MARK: - こうすると pragma の上に水平線が入る
// TODO: こうすると下に水平線が入る(-の後ろに空白を入れないこと） -
// FIXME: - 前後に入る -

```


他の pragma は今のところないらしい
【FileMaker】最初に開く画面を指定する

FileMaker Advent Calendar 2015 24日目、イブですね。
今頃はサンタさんが超ピッチでプレゼントを配っていることでしょう。

サンタさんにはプレゼントをお任せし、こちらでは最初に開く画面を指定するというお題でみなさまにプレゼントを書いていきます。

２つの方法があります。

# 固定のレイアウトを指定する
使うみんなが同じレイアウトで使うとか使うデバイスが決まっている場合は、「ファイル＞ファイルオプション」で指定します。
![スクリーンショット 2015-12-22 9.19.34.png](https://qiita-image-store.s3.amazonaws.com/0/60538/1cf14e98-7e96-2742-fdfd-5d0339823490.png)

# 条件でレイアウトを指定する
デバイスごとにレイアウトを指定したい、使う人によって最初に表示するレイアウトやスクリプトを動かしてメニュー画面をコントロールしたいなどのときは、スクリプトトリガをしかけます。
同じく、「ファイル＞ファイルオプション」で指定できます。
![スクリーンショット 2015-12-22 9.20.22.png](https://qiita-image-store.s3.amazonaws.com/0/60538/328a707c-c709-c78e-aad4-16da96ed64e8.png)

業務ではよく使う機能だと思いますが、業務のレベルによって使い分けてみてくださいね〜。
メリークリスマス！
いまからでは間に合わない！エンジニアがXmasまでに恋人をゲットする方法

毎日qnoteスタッフみんなで繋いできたAdvent Calendarも残り2回となりました。ラス前の今回は、代表の私鶴田がみなさんのクリスマス気分を台無しにしたいと思います。

さて、本日世の中は「クリスマス・イブ」です。今年もクリスマス中止のお知らせは届かず、イブの狂騒もきっちりと実施されるわけですが、エンジニアのみなさんはハッピーに過ごせてますでしょうか？私のように押しも押されもせぬ中年妻子持ちともなれば、可愛い子供たちに丸いケーキ、猫たちにはチキンの缶詰でも買って帰ろう、ぐらいのことしか考えずに済むので、ああ歳をとってよかったなあ、ってなもんですが。

しかし、TwitterのTLなんかで若者なみなさんが無実のサンタクロースに対する恨みつらみを吐き出してたりするのを見かけると、毎年のことながら、ああ、若いって大変だけどいいなあ、なんて思ったりもします。恋人がいないクリスマス、それはそれでハッピーに過ごす手段なんかいくらでもありますし、決まった相手がいないってのは、これから素敵な出会いが待ってるかもしれないってことでもありますから。ただ、それでも「やっぱり恋人がいたほうがいいなあ」なんて思ってる人がいるなら、この記事は少しだけ役に立つかもしれません。もう今年のクリスマスには間に合いませんが、来年目指してなにかの参考になれば、ということでオジサンがちょっとだけ簡単なライフハックを伝授しますね。


# (1) 一日ひとつ、回文をつくろう

回文。知ってますよね？
「わたしまけましたわ」とか「たけやぶやけた」みたいに、前から読んでも後ろから読んでも同じ音になって、かつなんらかの意味をもつっていう「言葉遊び」です。朝起きてニュースを見た時とか、駅の電光掲示板や電車の車内吊り広告をボーっと眺めている時に、目に入った「ことば」を題材にして、1日にひとつ、回文をひねくりだしてみましょう。

回文はオッサン臭くていやだということでしたら、アナグラムでもいいです。あることばの文字を並べ替えて、別の意味を表すことばに置き換える遊びですね。たとえば「阿藤快」と「加藤あい」はとても秀逸なアナグラムのひとつです。

これを半年も続ければ、夏ぐらいにはなんらかの効果が実感できるハズです。なぜなら、このての遊びは「脳」の「シナプス」をガンガンにつなげてくれるエクササイズとして最適だからです。（ちなみに筆者は脳科学者でもなんでもないので、あくまでも「そんなかんじがする」レベルで理解してくださいね。）

「頭の回転」ってのは、恋愛も含む「コミュニケーション」において、最も大切なスキルです。会話のキャッチボールの中で、いかに相手が期待する「ことば」をタイミングよく叩きこむか。いかに相手の意表をついて意外な「ことば」で切り返すか。その能力が高ければ高いほど、異性は関心をもって接してくれるはずです。「会話が面白い人」は、「寡黙なイケメン」より確実にモテますよね。

ところで、ことばあそびがエクササイズなら「ダジャレ」はダメなの？っていう疑問もあるかと思いますが、これは「ダメ」と言っておきます。センスのいいダジャレは「スベリ芸」として裏技的に使えることもありますが、だいたい単なる「オヤジギャグ」として認識されてしまうのでリスクが高すぎます。密かに考える分には問題ないですが、人前で発表するのは実年齢が相応になってからにすることをお勧めします。ちなみに、私はリアルにオジサンなのでアリです。


# (2) 例外処理を忘れるな

半年ぐらい回文なりアナグラムなりで脳を鍛えていくと、だんだん会話の中で相手の言葉尻を捉えて面白い返しをしたくなってくると思います。でも、そこはちょっと踏みとどまって下さい。我々はエンジニアであって芸人ではありませんので、自分が面白いと思ってもそれが普遍的に面白い返しであるとは限りません。まず、頭のなかでフローチャートを書いてみましょう。相手が「◯◯」と言った。それに対して自分が「△△」と返す。その後、相手はどういう反応をするだろうか、という流れをシミュレートするのです。

実は、これはだいたい皆さん無意識にやってることです。しかし、エンジニアのうちのかなり多くの人が、仕事で慣れているはずの「例外処理」を書くのを忘れるんです。会話の相手の反応について、いくつかの分岐は想定しているのですが、「自分が想定していなかった反応」をされた時に、例外処理を考えていないからとっさに対処できずに異常終了する。これが、一般的に「コミュ障」と受け取られてしまう以下の様な反応として表れてしまうのです。

- 凍りつく
- 愛想笑いでごまかそうとする、がバレる
- 「まじか」「それな」など年代的に不自然な単語を吐く
- 素っ頓狂なハイトーンボイスを発する
- 突然変顔する

いついかなるときも、我々はエンジニアです。例外処理を忘れないようにしましょう。

例外処理と言っても、具体的に何をしたらいいかわからないですか？そこはホラ、TryしてCatchするのですよ。「自分がよかれと思う」ことばを投げかけるのは「Try」です。相手の反応が例外として返されたら、きちんと「Catch」してログを残すんです。ログには会話の相手を特定するID値、会話の舞台となった時と場所、投げかけたことばを含めます。そして、返された例外にはエラーコードを付与して頭の中のログファイルに記録しておきましょう。その上で、好ましい反応を得られなかったTryに対する回避行動をとってください。「いやあ冗談冗談」「なーんちゃって（古）」など、悪意のなさを演出しながら速やかに話題を転換しましょう。

例外処理をきちんと行うことは、いくつか大きなメリットに繋がります。

ひとつは、ログが溜まることです。他人とのコミュニケーションの中で蓄積されていくログは、いずれ膨大なデータベースとして機能するようになります。同じ相手、同じ場所じゃなくても、「こういう性格傾向の人にはこの手のシャレは通じない」「この時と場所ではこのネタは不適切だ」といったパターンとして使えるようになるのです。そうやってTPOをわきまえた大人になれば、誤って地雷を踏み抜くリスクを減らすことができます。

そしてもうひとつは、「Try」ができるようになることです。あらかじめ例外を想定してリスクヘッジしていれば、ギリギリセーフ、ギリギリアウトの隙間を縫うような、一歩踏み込んだコミュニケーションにトライ（挑戦）できるようになります。ギリギリのラインを狙えるのは、お互いの性格や趣味嗜好を理解しあっていればこそ＝より深い間柄になれる、というわけです。



以上、騙されたと思って是非実践してみてくださいね。来年の今頃は、きっと素敵な恋人とイルミネーションなんか眺めてるはずですから。まあ、もしダメだったらqnoteに来て猫たちと遊ぶっていうのも、なかなか楽しいクリスマスになると思いますよ！
【ZendFramework1.x】 1. 開発環境の準備

---
[目次]() ※準備中
≫次の記事 2.[プロジェクトの作成]() ※執筆中

---

#MVCモデルとは？
システムを構成するプログラムを、どのように **部品化** すると効率よく開発ができるか、という開発モデルの1つです。

- M … Model
	- [ビジネスロジック](http://e-words.jp/w/ビジネスロジック.html)を担当する部品。
- V … View
	- インターフェースを担当する部品。主に出力（画面の表示）が中心。
- C … Controller
	- ユーザーのアクションに応じて、Modelの処理、Viewの処理を制御する部品。

このモデルを用いて、どんなシステムにも共通する処理をまとめて、スピーディーにシステムを開発できるようにするのが **MVCフレームワーク** です。

ZendFrameworkは、PHPの開発元である Zend Technology社が開発・リリースしているMVCフレームワークで、数あるPHP MVCフレームワークでは最も自由度が高く、汎用性に優れているといわれています。

バージョン1系と2系がリリースされていますが、2系はZendFrameworkの持ち味であった高速性や自由度が大幅に失われており、1系を好む開発者が多いようです。

#開発環境の準備

まず、開発作業環境の準備をしましょう。

##XAMPP

手元のPC内に、Webサーバー、PHP、MySQLデータベースが動作する環境が必要です。[XAMPP](https://www.apachefriends.org/jp/)はこれらを一括でインストール、管理できる便利なツールです。

※XAMPPのインストール、使い方は割愛します。

##NetBeans

この記事ではフリーの統合開発環境（IDE） [NetBeans](https://ja.netbeans.org) を使用する前提で書き進めます。

※NetBeansのインストール、使い方は割愛します。

##Composer
**Composer** は各種のPHPライブラリのパッケージ管理を行うツールです。NetBeansも Composer に対応しており、プロジェクトで使用するPHPライブラリのインストールや管理が簡単にできます。

###Composerのインストール

Composer のインストールはコマンドラインで行います。

####Mac

アプリケーション → ユーティリティ →「ターミナル」 で作業します

※XAMPPをインストール済みで、PHPコマンドへのパスが通っている（環境変数PATHにPHPコマンドのパスが設定されている）ことが前提です。

```bash:Composerのインストール(Mac)
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
パスワード入力
```

####Windows

[インストーラー](https://getcomposer.org/Composer-Setup.exe)をダウンロード、実行してください。

##ZendFramework

ZendFramworkに含まれている **zf** というコマンドラインツールを使用するため、ZendFramework一式をインストールします。
今後もPHPライブラリをインストールすることがあるかもしれませんので、PHPライブラリ用のディレクトリを1つ用意して、そこにインストールすると良いでしょう。

###ZendFrameworkのインストール
```bash:ZendFrameworkのインストール
mkdir <PHPライブラリ用ディレクトリパス>
cd <PHPライブラリ用ディレクトリパス>
composer require zendframework/zendframework1
```

##NetBeansの設定

ZendFrameworkのインストールができたら、 NetBeansに *Composer* と *zfコマンド* の設定を行います。以下の設定画面を開いてください。

1. (Mac)NetBeansメニュー → Preferences... / (Windows)ツールメニュー → オプション
2. PHP → フレームワークおよびツール

###Composerの設定
![スクリーンショット 2016-01-27 0.00.36.png](https://qiita-image-store.s3.amazonaws.com/0/102430/889115e2-ae8a-b14f-5894-cdeb7024eb41.png "スクリーンショット 2016-01-27 0.00.36.png")


1. 左の一覧から「Composer」を選択
2. Composerコマンドのパスを入力（または検索）
	- Mac ... `/usr/local/bin/composer`
	- Windows ... `C:\ProgramData\ComposerSetup\bin\composer.bat`

###zfコマンドの設定
![スクリーンショット 2016-01-27 0.00.55.png](https://qiita-image-store.s3.amazonaws.com/0/102430/bea13bd4-e552-d8b0-d21d-d921a2fa7330.png "スクリーンショット 2016-01-27 0.00.55.png")

1. 左の一覧から「Zend」を選択
2. Zendスクリプト → zf.sh または zf.bat のパスを入力
	- Mac ...`<PHPライブラリ用ディレクトリ>/vendor/zendframework/zendframework1/bin/zf.sh`
	- Windows ... `<PHPライブラリ用ディレクトリ>\vendor\zendframework\zendframework1\bin\zf.bat`
3. 「プロバイダの登録」 をクリック



以上で開発環境の準備は完了です。
ローマ字入力で `トゥームレイダー` とか `ブルートゥース`をスマートに入力する、たったひとつの冴えたやりかた


# `トゥ` を入力する
`thu` はテュ `tyu` はチュ　では `トゥ` は？ `tuxu` とか `tulu`とか？

# 答えは `twu`
素晴らしい！
複数の写真をうまいことつなぎ合わせたい時に役立つかもしれないサービス 1選

ちょっと調べた程度の試用範囲に限定された非厳選ツールの紹介です。御了承下さい。

使ってみてこれは使えると思った順に列挙します。


# Fotor

[Free Online Photo Editor | Fotor - Photo Editing & Collage Maker & Graphic Design](http://www.fotor.com/)

圧倒的に使いやすいオンラインツールでした。

しかもサイト自体は日本語化もされていました、日本語版のトップページは以下です。

[画像加工・編集 | Fotor - 無料写真加工サイト・フリーソフト](http://www.fotor.com/jp/)

## 画像を繋ぐ


![2015-12-24_052622.png](https://qiita-image-store.s3.amazonaws.com/0/74939/232bd2b5-90f6-d4dd-2e47-987a38bcf3da.png)

オンラインエディタを起動した後上部メニューの **COLLAGE(コラージュ)** を選択します

あとはエディタ上で好きなエディタを選択して使うだけです。

![FotorCreated.png](https://qiita-image-store.s3.amazonaws.com/0/74939/05548d9f-b8ad-c0f5-faad-d8194667aabb.png)

この手軽さイイですね :smile_cat: 

## とはいえ

複雑度が高い機能を利用しようとするとウォーターマークが入るなど、全ての機能を利用するためには有償プランを選択する必要があるようです。

それでも覚えておいて損は無い完成度ですね、素敵です。

[アップグレードプラン](http://www.fotor.com/user/upgrade.html "Free Online Photo Editor | Fotor - Photo Editing & Collage Maker & Graphic Design")


![2015-12-24_054122.png](https://qiita-image-store.s3.amazonaws.com/0/74939/31a69689-23f6-0f41-6389-26842f6924ed.png)



# その他

二昔ほど前感が否めませんが一通り使ってみたので掲載しておきます。

- [Combine Images - Free Online Tool](http://www.quickpicturetools.com/en/combine_images/)
- [PhotoJoiner.net - Join multiple photos together.](http://www.photojoiner.net/)
- [Zippy Photo Stitcher](http://zippyhelp.com/imagetools/stitch/photostitch.htm)

お好みでどうぞ :sweat_smile: