OmniAICreator/Qiita-1.07M huggingface dataset:
クリップボードに文字列を設定する

Facebookアプリをインストールしてると**setInitialText**メソッドが利用できない。
エラーにはならないけど、テキストが設定されない。

```lang:swift
let composeView = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
// 投稿するテキストを指定
composeView.setInitialText("デフォルトで表示したい文字")
// 投稿画面表示
// ***投稿画面に"デフォルトで表示したい文字"が表示されない***
self.presentViewController(composeView, animated: true, completion:
{
    self.finishFacebook(false)
})
```

どうもFacebookのポリシーだからダメなんだとか。
仕方ないからせめてクリップボードにコピーして再入力の手間を省く。
1.テキストに文字を入力する
2.「送信」ボタンを押す
3.投稿画面を開く前にテキストの内容をクリップボードに設定する
4.手動でペーストする

```lang:swift
let generalPasteboard: UIPasteboard = UIPasteboard.generalPasteboard()
generalPasteboard.string = self.myInputText.text

let composeView = SLComposeViewController(forServiceType: SLServiceTypeFacebook)
// 投稿画面表示
self.presentViewController(composeView, animated: true, completion:
{
    self.finishFacebook(false)
})
```

クリップボードの設定もアプリ内だけで利用できるものがあったんだけど
それだと期待通りの結果にならなかった。

```lang:swift
let pasteboard: UIPasteboard = UIPasteboard(name: "HogePiyo", create: true)
pasteboard.string = self.myInputText.text
```
Movable Typeクラウド版のPHPの制限

Movable Typeクラウド版ではダイナミックパブリッシング用にPHPが実行できるようになっています。独自のPHPファイルを置いて実行することも可能ですが、以下のように「一部可」という不明瞭な制限があります。

http://www.sixapart.jp/movabletype/cloud/specification.html
>PHP スクリプトの実行
>一部可
>※MySQL の操作は不可
>※独自スクリプトの動作を保証するものではありません。また、技術サポート対象外となります

ということで、実際に遭遇した制限をまとめてみました。

## 出力が1時間キャッシュされる

PHPの出力が1時間キャッシュされます。このキャッシュは再構築時に破棄される為、通常のダイナミックパブリッシングでは問題になりませんが、PHPで動的に表示の変更などを行おうとすると罠にはまります。

このキャッシュはHTTPのCache-Controlヘッダフィールドで制御可能なので、以下の記述をPHPファイルの先頭に入れておくことでキャッシュされないようにすることができます。

```php
header('Cache-Control: private');
```

## PATH_INFOなURLは認識されない

PATH_INFOなURLは認識されず404になります。
これはおそらくnginxの設定で末尾が.phpであるURLをPHP-FPMに渡す設定になっているからだと思われます。

## セッションが使えない

セッションが使えません。$_SESSIONに値を設定しても保存されず、次のリクエストの時には空になっています。ダイナミックパブリッシングにはセッションは不要だからでしょうが、なかなか予想外の制限です。

## curlがインストールされていない

curlモジュールはインストールされていないので使えません。
file_get_contents()にURLを渡すことでHTTP通信自体はできます。

## file_get_contentsでhttps通信ができない

file_get_contents()でHTTP通信はできますが、HTTPSはできません。おそらくopensslモジュールがインストールされていない為だと思われます。

# まとめ

Movable Typeクラウド版のPHPは思った以上にダイナミックパブリッシングに特化したセッティングになっているようで、ダイナミックパブリッシングに不要な機能は使えないと思ったほうが無難なようです。

セッションとHTTP/HTTPS通信ができれば、CMS付きのFacebook/Twiteerアプリプラットホームとして使えるので非常に便利なのですが……

# ※2017年8月追記

Nginx版の他にApache版が増え、Nginx版では以下の様に「不可」になっていました。

> 不可
> ※ プラグインにおけるPHPの動作については、開発元サポートでの対応となります

Nginx版でもダイナミックパブリッシングは使用できるのでPHPも動作するはずですが、やはりセッションやPATH_INFOが使えないという制限は大きすぎたということなのでしょうか。
Git clone したリポジトリをsourcetreeに追加する


#手順
sourcetreeの「新規リポジトリ」＞「既存のローカルリポジトリを追加」
![sourcetree.jpg](https://qiita-image-store.s3.amazonaws.com/0/30301/ed8a3dd9-5f8a-c66c-7f02-9567f8e1d967.jpeg "sourcetree.jpg")

あとはcloneしたディレクトリを選択

[origin set-url を変更](http://qiita.com/GotoKazu/items/059cc98ff598bbd27bd9)

```
git remote set-url origin https://example.com/git/username/project_name.git
```

```
git push -u origin master
```


> Gitbucketへ登録する際にこの手順だとsourcetreeからのプッシュ時にエラーとなってしまった。なんでだろ・・・

###### とりあえずの対策
ディレクトリをからにしないとですが・・・
sourcetreeの「新規リポジトリ」＞「URLからクローン」を選択しclone URLを指定したらできた。
iPhone 6 PlusのUITableViewのseparatorInsetの値が違うことが原因で、カスタムセルのラベルがズレる問題を解決

【追記】
http://qiita.com/yuya_presto/items/08b0656f67a59c8c2d03#標準スタイルのセルと左右の余白を揃えたい場合 のやり方の方が良さそうです。

---


`UITableView`の`separatorInset`は、テーブルビューの罫線のポジション指定用のプロパティです。
iOS 8の多くの端末の場合、デフォルトで`left: 15`が指定されています。
`UIEdgeInsetsZero`を指定して、`iOS 6`までのように罫線を左端まで延ばすTipsをよく見かけますが、それは本質では無く、iOSの設定画面のようにラベルの左端から始めるなど、 **適切な値に設定する** のが望ましいです。


iPhoneの設定画面:
![Screen Shot 2015-07-07 at 10.34.57.png](https://qiita-image-store.s3.amazonaws.com/0/19398/35b864e6-e749-d9ed-2e62-32a8477eba11.png "Screen Shot 2015-07-07 at 10.34.57.png")

「iOS 8の多くの端末の場合、デフォルトで`left: 15`が指定されています」と書きましたが、iPhone 6 Plusの場合は`left: 20`となっていました。
未検証ですが、iPadの場合も違うのではと思います。

CellのStyleがBasicなど、非Customの時は、ラベルの左マージンも合わせて自動調整してくれます。

一方、Customセルの場合、ラベルの左マージンは自分で設定する必要がありますが、iPhone 5やiPhone 6などの実測値である`left: 15`を指定すると、iPhone 6 Plusで5 pointのズレが発生してしまいます。

下の図の赤くハイライトされた部分は、UISwitch配置のためにCustomセルになっていますが、このように端末間でズレが発生してしまいます。

![Artboard 1.png](https://qiita-image-store.s3.amazonaws.com/0/19398/35d58235-47ed-524e-986b-f8af6ca26afb.png "Artboard 1.png")
([今開発中のPlayer!](https://itunes.apple.com/jp/app/id897872395)の実際の設定画面です)

また、仮にこの問題が無いとしても、単なる実測値である数値を指定すると、iOSのバージョン違いなどでズレが発生してしまいそうで、良くないと感じています。

# 解決策

## `separatorInset.left`の値をラベルの左マージンに指定

言葉にすると簡単ですが、ちょっとだけ苦労しました。

iPhone 6 Plusで検証したところ、以下の挙動でした。

- `viewDidLoad`のタイミング: 15
- `viewWillAppear`のタイミング: 15
- `viewDidAppear`のタイミング: 20

`viewDidAppear`のタイミングで`separatorInset.left`の値をラベルの左マージンに指定すると、15から20に変化してカクッとするのが見えてしまいます。

色々試した結果、 **viewDidLayoutSubviewsのタイミング** では20の値かつ画面表示前に設定することが出来ました。

```swift
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    notificationLabelLeft.constant = tableView.separatorInset.left
}
```

こうすることで、iPhone 6 Plusのズレが解消されるとともに、他の端末でも`15`という数値よりも確実な指定方法となりました。

もし、他に良い方法あれば教えてください。

## 他の解決策

ググっても[ios - Something is wrong with the iPhone 6 Plus tableView.separatorInset - Stack Overflow](http://stackoverflow.com/questions/26019339/something-is-wrong-with-the-iphone-6-plus-tableview-separatorinset)程度しか情報が無かったです。

そこの回答は以下のような解決策で、あまり良くないと思ったので、自力で何とかしました(　´･‿･｀)

- 端末によって設定値を変える(15 or 20)
	- 変化に弱い
- `layoutMargins`をオーバーライド
	- iPhone 6 Plusの場合も15になってしまい、標準の見た目と食い違ってしまう


```objc
- (UIEdgeInsets)layoutMargins
{
    return UIEdgeInsetsMake(0, 15, 0, 0);
}
```
「プログラムと機能」の一覧を取得する

プログラムから「プログラムと機能」の一覧を取得する方法。
コマンドラインの「reg query」を使用する。

```lang:C#
var p = new System.Diagnostics.Process();
p.StartInfo.FileName = string.Format("{0}\\cmd.exe", Environment.GetFolderPath(Environment.SpecialFolder.System));
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.Arguments = " /c reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\" /s | findstr \"\\<DisplayName\"";
p.Start();

// コマンドの結果を受け取る
string programListInfo = p.StandardOutput.ReadToEnd();


```
terraform をバージョンアップする

手元の mac に brew でインストールした terraform ですが、  
`brew upgrade` でなかなか降ってこないので手動でバージョンアップしてみます。
手動バージョンアップと言ってもシンボリックリンクの書き換えしただけなので、メモとして残します。  

私の環境では terraform は以下の様にインストールされています。

```
$ ls -l /usr/local/bin/terraform*
lrwxr-xr-x  1 hoge  hage  39 Apr 27 14:21 /usr/local/bin/terraform -> ../Cellar/terraform/0.4.2/bin/terraform
lrwxr-xr-x  1 hoge  hage  54 Apr 27 14:21 /usr/local/bin/terraform-provider-atlas -> ../Cellar/terraform/0.4.2/bin/terraform-provider-atlas
lrwxr-xr-x  1 hoge  hage  52 Apr 27 14:21 /usr/local/bin/terraform-provider-aws -> ../Cellar/terraform/0.4.2/bin/terraform-provider-aws
lrwxr-xr-x  1 hoge  hage  59 Apr 27 14:21 /usr/local/bin/terraform-provider-cloudflare -> ../Cellar/terraform/0.4.2/bin/terraform-provider-cloudflare
以下略
```

あまり詳しくないのですが、`/usr/local/bin` 配下はシンボリックリンクが多いのですね。  

最新版の terraform を公式からダウンロードします。今回は 0.5.3 です。

[https://dl.bintray.com/mitchellh/terraform/terraform_0.5.3_darwin_amd64.zip]

zip を解凍するとバイナリが詰まっています。

```
~/Downloads$  ll terraform*
-rwxr-xr-x@ 1 hoge  hage  15202736 Jun  2 03:36 terraform
-rwxr-xr-x@ 1 hoge  hage  10354576 Jun  2 03:36 terraform-provider-atlas
-rwxr-xr-x@ 1 hoge  hage  19750112 Jun  2 03:36 terraform-provider-aws
-rwxr-xr-x@ 1 hoge  hage  10258784 Jun  2 03:36 terraform-provider-cloudflare
以下略
```

これらを移動します。

```
~/Downloads$ mkdir -p /usr/local/Cellar/terraform/0.5.3/bin
~/Downloads$ cp terraform* /usr/local/Cellar/terraform/0.5.3/bin
```

シンボリックリンクを張り替えます。

``` sh
#!/bin/bash

cd /usr/local/bin
ls -l terraform* | while read i
do
    bin=`echo $i | awk {'print $9'}`
    new_link=`echo $i | awk {'print $11'} | sed 's/0.4.2/0.5.3/'` 
    ln -sf ${new_link} ${bin}
done
```

0.4.2 から 0.5.3 に変わりました。

```
$ ls -l /usr/local/bin/terraform*
lrwxr-xr-x  1 hoge  hage     39 Jun 29 16:45 terraform -> ../Cellar/terraform/0.5.3/bin/terraform
lrwxr-xr-x  1 hoge  hage     54 Jun 29 16:45 terraform-provider-atlas -> ../Cellar/terraform/0.5.3/bin/terraform-provider-atlas
lrwxr-xr-x  1 hoge  hage     52 Jun 29 16:45 terraform-provider-aws -> ../Cellar/terraform/0.5.3/bin/terraform-provider-aws
lrwxr-xr-x  1 hoge  hage     59 Jun 29 16:45 terraform-provider-cloudflare -> ../Cellar/terraform/0.5.3/bin/terraform-provider-cloudflare
以下略
```

以上でバージョンアップ完了です。  
その後  `plan` `apply` `destroy` や、バージョンアップによって新規追加されたリソースも問題なく動作しています。
というか、そもそも実行環境を vagrant とか docker とかを使えばいいのではと思いますが、手が回らず。。

route53 の private hosted zone と、elb の connection draining がサポートされたのがとても嬉しいです。
C++11言語で５の倍数と５のつく数字だけヒロミゴーする。５が３以上出たらさらにゴーゴーゴーする。

# 動機

@kmagai さんの<a href="http://qiita.com/kmagai/items/d6091b6f7bdc721616fc">Go言語で５の倍数と５のつく数字だけヒロミゴーする</a>と、
@Joe-noh さんの<a href="http://qiita.com/Joe-noh/items/17aa395aeb046d8e8f0c">Elixir言語で５の倍数と５のつく数字だけヒロミゴーする</a>が楽しそうだったので。


ルールは5がつく数字でExotic、5の倍数でJapan、両立したらExotic Japan。さらに、5が3回以上出てきたときはGoGoGo!!!。

# コード

```cpp
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

const auto isGoGoGo= [](int i) -> string {
	const string str = to_string(i);
	return count( str.begin(), str.end(), '5' ) >= 3 ?  "GoGoGo!!! ":"";
};


const auto isExotic = [](int i) -> string {
	const string str = to_string(i);
	return find( str.begin(), str.end(), '5' ) != str.end() ?  "Exotic ":"";
};


const auto isJapan = [](int i) -> string {
	return i % 5 == 0 ? "Japan ":"";
};


void hiromi( int eye)
{
	for(int i=0; i<=eye; i++) 
	{
		cout << i << " " << isGoGoGo(i) << isExotic(i) << isJapan(i) << endl;
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	hiromi(240000000);
	return 0;
}

```

# 所感

`STL`便利。`C++11`便利。
フレームレートの最適な選び方

久々の投稿です。
今回はアニメーションを作る際に必ずでてくる**フレームレート**についてです。

#そもそもフレームレートとは?
1秒間に何コマ表示するかというものです。単位はfpsですね。
映画などは1秒間に24コマなので24fpsです。

#どのくらいのfpsが使われているのか？
フレームレートが高いとアニメーションがなめらかに描画できます。ですが、世の中のコンテンツは意外とフレームレートが抑えられていたりします。
映画では24fpsだったり、Flashバナーのレギュレーションは(媒体によってさまざまですが)12fpsや18fps、30fpsとさまざまです。

#Webコンテンツに使われるfpsってどのくらい？
これは僕が関わってきた案件に多かったという少々説得力に欠ける数字かもしれませんが、60fpsで制作することがおおいです。コンテンツの描画方法によっては負荷が上がってしまうので、負荷の高いシーンではfpsを24〜30fpsなどに落としてみたりします。
モーション系のライブラリでは120fpsくらいまで設定できることがあるかと思いますが、30fpsでもコマ落ちせずにアニメーションできます。60fpsまでいくと「あ、滑らかでヌルヌル動いている！」となりますね。120fpsは描画負荷がかかる割にあまり体感できない(僕の目では。。。)のであまりおすすめしません。

2015/7/8 追記
ディスプレイの自体のフレームレートがそもそも120fpsでていないとのことでした。120fpsのディスプレイが普及したときが楽しみですね。

#コンテンツによって選びましょう
アニメーションはよくぱらぱら漫画に例えられます。フレームレートの説明でもよく言われますね。ページを増やすと滑らかだけど、その分絵を描かないといけないので大変。
Webコンテンツではフレームレートを上げすぎて逆にカクカクな残念なアニメーションになりがちなので、負荷が大きくなってしまいそうなときは思い切ってフレームレートを下げてみてはどうでしょうか？

少々主観的な投稿になってしまいましたね。みんなどのくらいで制作しているんだろう？
ポートを使用してるプロセスを調べてkillする覚書き

#ポートを見つけてkillする
![スクリーンショット 2015-07-07 10.10.28.png](https://qiita-image-store.s3.amazonaws.com/0/78136/89b76ccb-99a1-8c7e-4a15-35334d96b127.png)
Tomcatでポートが使われていると言われるたびに、プロセスを調べてkillしているので、手順をメモしておく。

#手順
##ポートのプロセスを調べる
```lsof -i :8080```
ポート番号を指定して実行すると
![スクリーンショット 2015-07-07 10.14.29.png](https://qiita-image-store.s3.amazonaws.com/0/78136/2b6dbfe0-95e4-4f09-7c32-d88ec6e7e8cb.png)
のように出てくる。
このPIDをもとにkillする

##プロセスをkillする
```kill -9 [PIDの数字]```
-9をつけると強制終了できる。

# おまけ
2手順を1コマンドでやれるようにしたのがこちら。

コマンド1発で特定のポートのプロセスをkillする
https://qiita.com/growsic/items/492518f472c29ccde3db
AmazonRDSのテーブルをCSV形式でエキスポートする

# 問題
Amazon RDSは、`SELECT ... INTO OUTFILE`が使えない。

```
The "SELECT ... INTO OUTFILE" command creates a file on the database server.  MySQL does not provide a way to use this command to create a file on the client. 
```
https://forums.aws.amazon.com/thread.jspa?threadID=41443

# 解決
[mysqldump_to_csv.py](https://github.com/jamesmishra/mysqldump-to-csv)を使うことで、CSVで出力ができた。




コマンドのインストール

```
$ wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py
```

CSVの出力

```
$ mysqldump -u username -p --host=rdshostname database table | python mysqldump_to_csv.py > table.csv
```

# 転載元

[Exporting table from Amazon RDS into a csv file](http://stackoverflow.com/questions/9536224/exporting-table-from-amazon-rds-into-a-csv-file)
テーブルのコラムサイズを調べる

````sql:size.sql
select
    sum(pg_column_size(the_text_column)) as total_size,
    avg(pg_column_size(the_text_column)) as average_size,
    sum(pg_column_size(the_text_column)) * 100.0 / pg_relation_size('t') as percentage
from t;
````
last: btmp: File too large

# last: btmp: File too large

`lastb`コマンドを実行したら`last: btmp: File too large`というエラーが返ってきた場合の対処方法。

```bash
$ lastb
last: btmp: File too large
```

## ログファイル
### ログファイルの確認
btmpファイルのサイズを確認すると非常に大きいサイズになっている。

```bash
$ ls -lah /var/log/btmp
-rw------- 1 root utmp 2.8G  1月  1 00:00 /var/log/btmp
```

### splitでファイル分割
`split`コマンドで大きくなりすぎたログファイルを分割 [^4]

```bash
$ cd /var/log
$ split -b 500m btmp btmp_
$ ls -lah /var/log/btmp*
-rw------- 1 root utmp 2.8G  1月  1 00:00 btmp
-rw-r--r-- 1 root root 500M  1月  1 00:05 btmp_aa
-rw-r--r-- 1 root root 500M  1月  1 00:05 btmp_ab
-rw-r--r-- 1 root root 500M  1月  1 00:05 btmp_ac
-rw-r--r-- 1 root root 500M  1月  1 00:05 btmp_ad
-rw-r--r-- 1 root root 500M  1月  1 00:05 btmp_ae
-rw-r--r-- 1 root root 300M  1月  1 00:05 btmp_af
```

[^4]: http://www.experts-exchange.com/OS/Linux/Q_26187433.html

### 分割ファイルの参照確認
`lastb`コマンドでの参照を確認。[^3]

```bash
$ lastb -5 -f /var/log/btmp_af -adx
root     ssh:notty    Tue Jan  1 00:00 - 00:00  (00:00)     107.30.65.218.broad.xy.jx.dynamic.163data.com.cn
root     ssh:notty    Tue Jan  1 00:00 - 00:00  (00:00)     107.30.65.218.broad.xy.jx.dynamic.163data.com.cn
root     ssh:notty    Tue Jan  1 00:00 - 00:00  (00:00)     107.30.65.218.broad.xy.jx.dynamic.163data.com.cn
root     ssh:notty    Tue Jan  1 00:00 - 00:00  (00:00)     107.30.65.218.broad.xy.jx.dynamic.163data.com.cn
root     ssh:notty    Tue Jan  1 00:00 - 00:00  (00:00)     107.30.65.218.broad.xy.jx.dynamic.163data.com.cn
```

[^3]: http://linuxjm.osdn.jp/html/SysVinit/man1/last.1.html

### 肥大化したログのクリア
ファイルを削除、再作成して権限を変更。[^2]

```bash
$ rm /var/log/btmp
$ touch /var/log/btmp
$ chmod 600 /var/log/btmp
$ chown root:utmp /var/log/btmp
$ ls -lah /var/log/btmp
-rw------- 1 root utmp    0  1月  1 00:10 btmp
```

[^2]: http://ex-cloud.jp/support/question/q-643

## 対策

### 公開鍵認証
SSH接続は公開鍵認証にしてパスワード認証を止める。
### ポート番号の変更
22番ポートは狙われやすいので、他のポート番号に変更するだけでかなり変わる。
### ログ監視とIP制限
[Fail2ban](http://www.fail2ban.org/)や[DenyHosts](http://denyhosts.sourceforge.net/)、[Sshguard](http://www.sshguard.net/)などでSSHへのブルートフォースアタックを拒否する。[^6]
Fail2banがデファクトスタンダードの模様。[^1]

![fail2ban.png](https://qiita-image-store.s3.amazonaws.com/0/15175/24a2988b-ad45-95f6-387f-d69d14573158.png)



[^6]: http://serverfault.com/questions/119299/my-var-log-btmp-file-is-huge-what-should-i-do
[^1]: [Popularity Contest Statistics for fail2ban denyhosts -- Debian Quality Assurance](https://qa.debian.org/popcon-graph.php?packages=fail2ban+denyhosts)
AutoHotkeyでWindowsでもらくらくキーマップ


最近、Oculusコンテンツの開発がしたくてWindows PCを買ったので、その環境づくり中。
キーのリマップなどの環境についてメモしていきます。随時更新中。

## 基本情報

装飾キーとして以下のものが記号として準備されています。

| 文字 | Key |
|:-----|:-------|
| # | Windows key |
| ! | Alt key |
| ^ | Ctrl key |
| + | Shift key |
| & | 2つのキーを連結（同時押し） |

### 特殊なキーコード
| Key | code |
|:----|:-----|
| Capslock | sc03A |
| sc07B | 無変換 |
| sc079 | 変換 |

## 色々なRemap

### Capslockを別キーに

ただし、Upが検出されないなど問題があるので使わないほうが無難ぽいです。

```
; Casplockを変更
Capslock::Ctrl
sc03a::Ctrl
```

### 無変換+なにか

無変換、変換キーはいい位置にあるのに使用頻度が少ないキーです。
自分はIMEの設定で無変換キーをIMEオフ、変換キーをIMEオンにして利用しています。

そしてAutoHotkeyでそれをさらに便利にします。

以下のようにすることで、無変換キー＋何かのキーに機能を割り当てることができます。

```ahk
; 無変換キー＋jで矢印キー下を押したことにする
vk1Dsc07B & j:: Send, {Down}
```

これを色々応用することでVimライクなキー操作がどのウィンドウでもできるようになります。

## Altキーの空打ちでIMEを操作

ありがたいことに、こちらの記事でそれを実現するスクリプトを公開してくれているので、こちらを参考に！
[Altの空打ちで日本語入力(IME)を切り替えるツールを作った](http://www.karakaram.com/alt-ime-on-off)
【Monaca】端末にデータを保存する手段に関して【勉強中】

引き続き、Monacaについて勉強中です。
備忘録として。。。
#直面した問題
Monacaのアプリを使っている時に、オフラインだったらどうするか、という問題に直面し、ローカルにデータを置いておこう、となったので、Monacaでローカルにデータを保存する手段について、考察しました。

手段をしては、主に2つが見つかりました。

# Web SQL Database(SQLite)
公式のドキュメント: [データベースの利用方法](http://docs.monaca.mobi/2.9/ja/sampleapp/tips/storage/ "Link")にもありますね。

自分の知識不足で、SQLiteってもの自体も良く分からないのですが、
MySQLだったり、SQL Serverだったりと同じものって印象です。
[参考HP](http://www.dbonline.jp/sqlite/ "Link")

```sql:DB作成
CREATE hogehoge (hoge1, hoge2,...);
```
でDBを作って、

```sql:データ作成
INSERT INTO hogehoge VALUES ('a', 'b',...);
```
でデータを差し込んで、

```sql:データ取得
SELECT hoge1, hoge2,... FROM hogehoge WHERE hoge1 = 'a';
```
でデータを取得するといった流れになるか、と。

使用用途としては、Twitterのタイムラインのように、(投稿者・つぶやき・投稿時間)など、同じ書式のデータを保存しておいて、それをリストとして表示するような時に使えますかね。

沢山のデータを利用するにも、こちらの方が扱いやすいと思います。

# Local Storage
公式のドキュメント: [Local Storage](http://docs.monaca.mobi/2.9/ja/reference/phonegap_29/ja/storage/storage/#localstorage "Link")にありますね。

こちらの方が、より実践的かもしれません。
[アシアルブログ](http://blog.asial.co.jp/939 "Link")

こちらは、文字列(key)と値(item)を一対一で対応させる形式ですね。

使用用途としては、ユーザー登録の時に入力して頂くメールアドレスなどを保存しておくような形ですか。

```js:データ保存
localStorage.setItem('email', 'hogehoge@hogehoge.ne.jp');
```
と保存しておくと、

```js:データ取得
var eMail = localStorage.getItem('email');
```
とする事で、メールアドレスをいつでも引き出す事が出来ます。

単純な文字列だけでなく、オブジェクトや配列等も保存する事が可能なようですね。

# 結局どっちがいいの？
今回、私が業務として使う分には、SQLiteの方が好ましいです。

理由としては、リストで見せる処理を利用するので、SELECT文で一括処理出来た方が嬉しい、という事。

また、SQL構文を新たに覚える必要が無いってのも大きいですね。
Monacaについて、覚える事が他に多すぎるので。
他にも、DBの設計を考えやすいってのも理由の一つです。

ただ、Local Storageで、オブジェクトも保存出来るという事なので、
APIでJsonを引っ張ってきたデータを展開して、そのままLocalStorageに保存すれば、いちいち加工しなくても良いのでは。。。とも思います笑
ブレブレですね、すみません。

でも、SQLの方がこれまで使ってきた安心感があるので、今回は、SQLiteで。

# Monacaの他の投稿
1. [端末IDの取得方法](http://qiita.com/ikkitang/items/96614732e4767b54c5cd "Link")
2. [Jsonを展開する方法](http://qiita.com/ikkitang/items/96614732e4767b54c5cd "Link") (こちら、編集途中です・・・;;)


まだまだ、勉強する事が多いですね。
誰かのお役に立てれば。。
SwiftでGAのSDK利用

自分用メモ　あとで諸々整理
#Podfile
platform :ios, '8.0'
xcodeproj 'StampMaker'
pod 'GoogleAnalytics-iOS-SDK', '3.10'

#ブリッジの設定
ブリッジングのヘッダーファイルを作成。今回はGABridgeHeader

Objective-C Bridging Header にたヘッダーファイルのパスを入力

#ヘッダーファイル
>#ifndef StampMaker_GABridgeHeader
>#define StampMaker_GABridgeHeader
>
>#import \<GoogleAnalytics-iOS-SDK/GAI.h>
>#import \<GoogleAnalytics-iOS-SDK/GAIFields.h>
>#import \<GoogleAnalytics-iOS-SDK/GAILogger.h>
>#import \<GoogleAnalytics-iOS-SDK/GAIDictionaryBuilder.h>
>
>#endif

#実装部分
ブリッジの設定をしたけど、そんなクラスないと怒られる・・・
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var tracker: GAITracker?

    class func setupGoogleAnalytics() {
        GAI.sharedInstance().trackUncaughtExceptions = true;
        GAI.sharedInstance().dispatchInterval = 20
        GAI.sharedInstance().logger.logLevel = .Verbose
        if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
            appDelegate.tracker = GAI.sharedInstance().trackerWithTrackingId("UA-XXXXXXXX-X")
        }
    }

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        AppDelegate.setupGoogleAnalytics()
        return true
    }

}
【Oracle】SQLヒントで実行計画を固定するときのポイント

SQLヒントで実行計画を固定するときに意識するポイントは

1. テーブルの結合順序
1. テーブルの結合方法
1. テーブルへのアクセス方法

の３つです。

#1.テーブルの結合順序
* ORDEREDヒント または LEADINGヒント で結合順序を固定します。
* 駆動表（最初にアクセスされているテーブル）がアクセスするテーブルの中で、
もっとも件数が少なく絞り込めるテーブルとなっているかを見ます。
* WHERE句の結合条件に従って適切な順序となったいるかを見ます。これが適切でないと直積が発生（実行計画では「MERGE JOIN CARTESIAN」が表示）します。

#２．テーブルの結合方法
* USE_NLヒント（NestedLoop結合） または USE_HASHヒント（Hash結合）で結合方法を固定します。
* （例外はありますが）、数百件程度に検索結果が絞り込めるような小規模の問い合わせでは
NestedLoop結合を使用し、それ以上の大規模の問合せの場合にはHash結合を使用します。
* 基本的には、一つの問合せ（SELECLT文）でいずれかの結合方法に統一されているのが望ましいです。

#３．テーブルへの走査方法
* INDEXヒント（INDEX SCAN） または FULLヒント（TABLE FULL SCAN） でアクセス方法を固定します。
* NestedLoop結合の場合にはINDEX SCANしているかどうかを確認します。
このとき、実行計画で「INDEX FULL SCAN」とならずに「INDEX UNIQUE SCAN」「INDEX RANGE SCAN」となっていることを確認します。
* Hash結合の場合にはFULL SCANしているかどうかを確認します。このとき、実行計画で「TABLE FULL SCAN」もしくは「INDEX FAST FULL SCAN」となっていることを確認します。


また、これらの３つのポイントを意識をして実行計画が適切かどうかを判断することも出来ます。
これらのポイントをはずしている実行計画をもつSQLは、統計情報の取得やヒント句の指定による実行計画を修正することによるパフォーマンス改善が必要な可能性が高いSQLといえます。
Rustのマクロとstructを組み合わせて使う


または数値traitみたいな物が欲しい場合について。
[以前structとtraitの基本的な使い方を以下のPointという構造体を作って紹介した](http://qiita.com/yasuyuky/items/8894f731da9a4e8cac4c)
が、その続き。


```
pub struct Point<T> {
    pub x: T,
    pub y: T
}
```


基本的には前回定義したように抽象的なtraitを組み合わせて
汎用的な構造体を構築するのが正道だと思うが、
そうは言っても特定の型へのキャストが必要になるときに困る事がある。

## 現状のtraitを組み合わせた方法の限界

具体的にはユークリッド距離を返すnormメソッドを想定する。
ユークリッド距離に関しては平方根をとる事になるのでので
float系の何かの型へのキャストが必要になる。

```
impl<T> Point<T> where T:Mul+Copy,<T as Mul>::Output:Add {
    pub fn norm(self) -> f64 {
        ((self.x*self.x+self.y*self.y) as f64).sqrt()
    }
}
```
以上のように前回の知識で素朴に実装しようとすると以下のように
`error: non-scalar cast`といって怒られてしまう事になる。

```bash
src/foo.rs:33:10: 33:46 error: non-scalar cast: `<<T as core::ops::Mul>::Output as core::ops::Add>::Output` as `f64`
src/foo.rs:33         ((self.x*self.x+self.y*self.y) as f64).sqrt()
```

これは`<<T as core::ops::Mul>::Output as core::ops::Add>::Output`は
scalarな値だとは限らないので当然といえば当然だが、残念。
scalarなキャストが保証可能を表現する数値traitみたいなものがあればいいような気がするが
そんなものはなかった。

## macro_rules!

そこで`macro_rules!`の出番となる。
要は`f64`にキャストできそうな数値型はマクロをつかって全部定義しちゃおうという発想

```
macro_rules! norm_impl {
    ($($t:ty)*) => ($(
        impl Point<$t>  {
            pub fn norm(self) -> f64 {
                ((self.x*self.x+self.y*self.y) as f64).sqrt()
            }
        }
    )*)
}
norm_impl! { usize u8 u16 u32 u64 isize i8 i16 i32 i64 f32 f64 }
```

`macro_rules!`の詳しい記法については
[公式ドキュメント](https://doc.rust-lang.org/book/macros.html)が一番まとまっているので読んでもらうとして、
簡単に解説すると`=>`の左部分はマクロが受け取る引数の部分で、
`$()*`で囲む部分が引数の繰り返し部分になり、
`=>`の右側で`$()*`で囲った部分がキャプチャした引数分展開され繰り返される。
この場合`impl Point<$t> {`のあたりから5行が展開される。
rustのマクロは展開後の形が想像しやすいし
キャプチャする部分の型も存在するのでかなり人類にも扱いやすいという印象。

もちろん、マクロなので多用すると人智を超えた複雑さを孕んで行く事になるし、
これがいいやり方なのかは議論の余地があると思うが、
数値のプリミティブをマクロで一気に実装しちゃう手法は
stdライブラリの`Add`とか`Mul`とかの実装にも使われている。
https://doc.rust-lang.org/src/core/ops.rs.html

この辺結構プラグマティックな感じ。


## まとめ

rustには数値traitや整数traitや浮動小数traitみたいなのが現状ないので
macro_rules!で解決しましょうという話でした。
curlコマンドでHTTPヘッダを扱うレシピ

## HEAD リクエストする

HTTP ヘッダだけ要求してボディは要求しない HEAD リクエストを送るには、 `-I / --head` を使う。

```bash
$ curl -I http://example.com/
```

## レスポンスヘッダも一緒に見る

`-i / --include` を使う。

```bash
$ curl -i http://example.com/
```

## リクエストヘッダを指定する

`-H / --header` を使う。よく使いそうな `User-Agent (-A / --user-agent)`, `Referer (-e / --referer)`, `Cookie (-b / --cookie)` にはそれぞれ専用のオプションがある。

```bash
$ curl -H 'Host:example.com.' http://93.184.216.34/
```

下記のように複数指定も可能。

```bash
$ curl -H 'Host:example.com.' -H 'Content-Type:text/xml' http://93.184.216.34/
```
電子回路 > カットオフ周波数 > 3dB低下したの根拠 > 電力が1/2となる周波数


カットオフ周波数は3dB低下した周波数のことらしい。

3dB。覚えにくい。


3dBの根拠は、出力電力が1/2となる周波数らしい。
https://ja.wikipedia.org/wiki/%E9%81%AE%E6%96%AD%E5%91%A8%E6%B3%A2%E6%95%B0

1/2からdBへの変換は 10 * log(A/B)を使って以下となる。

10 * log(1/2) = -3.0102


覚えるのは<font color=red>「半分となる周波数」</font>でいい。3という中途半端な値を頑張って覚えても結局忘れる。
FuelPHP拡張モジュール：ACCONのクラス図

## ACCONモジュールのクラス図

![クラス図](https://lh3.googleusercontent.com/o_XW3fwGxMhFZXTtZ-gmcCdfpZRJXz-uhD9QyB5WVg=w2514-h1778-no "クラス図")

[拡大](https://photos.google.com/share/AF1QipMgqrArK-LVCUTvKI3iBqffuIdSTQwDEbDj9kwWWJfHPS4lCXnLz9AD-E7G34qe_Q/photo/AF1QipOl4RH4ueeFFgNYyw1tOzdrOs2Pltqrb3Ej3L9F?key=T01qbzltMm5lbkJWUmhJRzQ5dXlzOHc3MVd0S19n "ACCON Class図")

※コア（FuelPHP）層とアプリケーション層を除く
Rubyのプロジェクト毎のモジュール管理・バージョン管理（rbenv、bundler）まとめ

## はじめに

### 動機

しばらくnpm（Node.jsのパッケージ・マネージャ。プロジェクト毎にモジュールをインストールすることができる）を使っていたので、同じようなことをRubyでやってみました。

### 目標

1. プロジェクト毎にRubyのバージョンを分ける
2. プロジェクト毎にインストールするgemを分ける

## 下準備

### RVMのアンインストール

```
$ rvm seppuku
```

「切腹」って・・・

あと、**.bash_profile** や **.bashrc** にもrvmのパスなどが残っているので、消す。

### グローバルにインストールされたgemのアンインストール

以下の魔法のようなコマンドで、基本的なgem以外のすべてのgemを削除してしまいます：

```shell-session
$ gem uninstall -axI `gem list --no-versions | egrep -v 'test-unit|rdoc|bigdecimal|io-console|json|minitest|psych|rake'`
```

### rbenvのインストール

```shell-session
$ brew install rbenv ruby-build
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

### インストール可能なRubyのバージョンのリストを表示

```shell-session
$ rbenv install -l
Available versions:
  1.8.6-p383
  1.8.6-p420
...
...
```

### rbenv管理下にRubyをインストール

```shell-session
$ rbenv install 2.2.0
```

### インストール済みRuby一覧を表示

```shell-session
$ rbenv versions
  system
* 2.2.0 (set by /Users/USERNAME/.rbenv/version)
  2.1.5
```

### グローバルにbundlerをインストール

bundlerはグローバルにインストールします：

```shell-session
$ gem install bundler
```

## 1. プロジェクトにRubyをインストール

### ローカルのフォルダにRubyをインストール

```shell-session
$ mkdir app
$ cd app/
$ rbenv local 2.2.0
$ rbenv version
2.2.0 (set by PROJECT_FOLDER/.ruby-version)

```

## 2. プロジェクトにgemをインストール

### ローカルにGemをインストール

```shell-session
$ mkdir -p vender/bundle
$ vim Gemfile
$ bundle install --path vender/bundle --binstubs=bundle_bin
```

- `--path vender/bundle`はgemをインストールするフォルダの指定
- `--binstubs=bundle_bin`はあとで`bundle exec`を省略するためのオプション

### ローカルインストール済みの gem のリストを表示

```shell-session
$ bundle list
Gems included by the bundle:
  * rack (1.6.4)
  * rack-protection (1.5.3)
  * shotgun (0.9.1)
  * sinatra (1.4.6)
  * sinatra-cross_origin (0.3.2)
  * tilt (2.0.1)
```

### Gemの実行ファイルの実行

```shell-session
$ rbenv exec shotgun -v
```

**binstubs**を設定しているので以下のようにしなくて良いです：

```shell-session
$ rbenv exec bundle exec shotgun -v
```

### IRBの実行

```shell-session
$ rbenv exec irb
```

## 補足

### rbenv管理下のRubyを削除

```shell-session
$ rbenv uninstall 2.1.5
```

### デフォルトで使うRubyのバージョンを指定

```shell-session
$ rbenv global 2.2.0
$ rbenv version
2.2.0 (set by /Users/USERNAME/.rbenv/version)
```

### ローカルにインストールしたRubyを削除

Rubyのバージョンはデフォルトのものになります。

```shell-session
$ rbenv local --unset
```

### `rbenv exec`を短くする

いちいち入力するのは大変ですよね。

```shell-session
$ alias re='rbenv exec'
```

### 参考文献

[Ruby の gem をプロジェクト毎に Bundler で管理する - fugafuga.write()](http://blog.tokoyax.com/entry/ruby/bundler)
[rbenvのよく使うコマンドまとめ - TASK NOTES](http://www.task-notes.com/entry/20141204/1417662000)

---
ブログやってます：http://weed.nagoya
電子回路 > 絶対最大定格 > V_{XYZ}

引用: ダイオード・トランジスタ回路入門 by 岡山 努さん
4.5 トランジスタの定格

> 電圧の絶対最大定格に対しては、項目に対応して略号がV_{XYZ}のように表現されています。添字X, Yは対象とする端子の名称です。Zは残りの端子の状態を示します。

例として

```math

V_{CBO} : コレクタ・ベース電圧 \\
V_{CEO} : コレクタ・エミッタ電圧
```

> 添字のZの部分にあるOの記号は、３番めの端子をopenにして測定したことを意味します。ZがXの文字になっている場合には、特定の箇所に抵抗を接続するか、電圧を印加して測定していることを意味し、その条件は注記されます。
技術英語 > I would like to [make sure if I understand you correctly].

「自分の理解を確かめたい」と言いたい時に使うフレーズ。

I would like to make sure if I understand you correctly.

上記の出典は忘れたが、以下のyoutubeにて同じフレーズを使用しているのを見つけた。

https://www.youtube.com/watch?v=GTQzusrfCxc
08:13のゼフラム・コクレーンのセリフ
> Let me just make sure if I understand you correctly.
MFCのCMapにてSerialize,Desirialize part.1 


#はじめに
誰も使ってないかも知れませんが、
[MFCのCMap](https://msdn.microsoft.com/ja-jp/library/s897094z.aspx)でのシリアライズ・デシリアライズを試してみました。
まずは単純なintとCStringのMapで、50万の要素で。

#環境
環境は、Visual Studio 2013 Community Edition
MFC アプリ(ダイアログ）です。

#コード
名前付けは適当です（笑

```MapManager.h
#pragma once
#include <afxtempl.h>

class MapManager
{
private :
        CMap <int , int, CString, CString > m_save_Map;
        CMap <int , int, CString, CString > m_load_Map;

public :
       MapManager();
       ~MapManager();

        void Initialize();
        void Serialize();
        void Deserialize();
};

```  

```MapManager.cpp
#include "stdafx.h"
#include "MapManager.h"

MapManager ::MapManager()
{
}


MapManager ::~MapManager()
{
}

void MapManager ::Initialize()
{
      clock_t start, finish;
      double duration;
      start = clock();

      m_save_Map.InitHashTable(500009);// 必要な要素数に一番近い素数がパフォーマンスがいいらしい。
      for (int i = 0; i < 500000; i++)
      {
          CString str;
          str.Format( _T ("item:%d\r\n" ), i);
          m_save_Map[i] = str;
      }
      finish = clock();
      duration = ( double )(finish - start) / CLOCKS_PER_SEC ;
      TRACE (_T ( "map initialized --- %2.3f seconds\n"), duration);
}

void MapManager ::Serialize()
{
      clock_t start, finish;
      double duration;
      start = clock();

      CFile cFileG;
      if (cFileG.Open(_T ( "SampleFile.txt"), CFile ::modeCreate | CFile:: modeWrite ))
      {
          CArchive cArchiveObj(&cFileG, CArchive :: store);
          m_save_Map.Serialize(cArchiveObj);
      }

      finish = clock();
      duration = ( double )(finish - start) / CLOCKS_PER_SEC ;
      TRACE (_T ( "map serialized --- %2.3f seconds\n"), duration);
}

void MapManager ::Deserialize()
{
      clock_t start, finish;
      double duration;
      start = clock();

      CFile cFileG;

      m_load_Map.InitHashTable(500009);
      if (cFileG.Open(_T ( "SampleFile.txt"), CFile ::modeRead ))
      {
          CArchive cArchiveObj(&cFileG, CArchive :: load);
          m_load_Map.Serialize(cArchiveObj);
      }

      finish = clock();
      duration = ( double )(finish - start) / CLOCKS_PER_SEC ;
      TRACE (_T ( "map loaded --- %2.3f seconds\n"), duration);
}
```

呼び出し側のコードはこんな感じ。（MFCのDialogにて呼び出し）

```MapSample.cpp
void CCMapSampleDlg ::OnBnClickedOk()
{
        MapManager * map = new MapManager();
        map->Initialize();
        map->Serialize();
        map->Deserialize();
        delete map;
}
```
  
#実行結果

速度
 - map initialized --- 1.438 seconds
- map serialized --- 0.281 seconds
- map loaded --- 1.122 seconds

SampleFile.txtは、約16MBです。

#所感
スピードは悪くないです。

難点は、出力形式が指定できないことですね。文字コード指定できず・・・CFileだとバイナリなので、意味不明な感じになります。
フォーマットも出来ないので・・・。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/8ae0361c-b954-4cdb-0571-c1df6f659b94.png)

Sakuraで開けば一応改行コード入っているので改行はしてくれますが・・・。

ちなみに、CStdioFileだと、saveは出来ましたが（その際はメモ帳で開いても改行されていました）、loadが出来ませんでした。Debug実行時に以下のエラーが出ました。
![Image.png](https://qiita-image-store.s3.amazonaws.com/0/12790/ae91094c-2b14-41e5-c84c-90b55a8f6878.png)
パラメータの調整が必要なのかも知れません。解析するモチベーションが保てませんでした。

あんまり使えないなぁ。
XML出力という選択肢がある分、Boostのほうがいいと私は思います。
HaxeでElectronアプリを作る (hxElectron)

# 概要

Electronが流行っていますね。Haxeでも扱いたいですね。
というわけでexternを書きました。

**hxElectron** (A Haxe extern for Electron)
https://github.com/seibe/hxElectron

# 使い方

基本的な使い方はこんな感じ。

```hx
package;

import electron.Electron;
import electron.ElectronBrowserWindow;
import js.Node;

class Main 
{
	static function main() 
	{
		new Main();
	}
	
	public function new()
	{
		Electron.app.on(ElectronAppEventType.WINDOW_ALL_CLOSED, function():Void {
			Electron.app.quit();
		});
		
		Electron.app.on(ElectronAppEventType.READY, function():Void {
			var mainWindow = new ElectronBrowserWindow({ width: 800, height: 600 });
			mainWindow.loadUrl('file://' + Node.__dirname + '/index.html');
		});
	}
	
}
```

# 各モジュールの呼び出し方

モジュールによって、呼び出し方が若干違います。
Node.js externの仕様を参考にして作ったらこうなりました。

## 1. Electronクラスの静的メンバから

* Electron.app
* Electron.autoUpdater
* Electron.contentTracing
* Electron.dialog
* Electron.globalShortcut
* Electron.ipc
* Electron.powerMonitor
* Electron.protocol
* Electron.clipboar
* Electron.crashReporter
* Electron.screen
* Electron.shell
* Electron.remote

## 2. それぞれのクラスから

* new ElectronBrowserWindow()
* new ElectronMenu()
* new ElectronMenuItem()
* new ElectronNativeImage()
* new ElectronTray()

## 3. rendererからremoteでの呼び出し方
Electron.remote.appと書ければスマートだったのですが、そうはいかなかったので以下を使ってください。

* Electron.remoteApp
* Electron.remoteAutoUpdater
* Electron.remoteContentTracing
* Electron.remoteDialog
* Electron.remoteGlobalShortcut
* Electron.remoteIpc
* Electron.remotePowerMonitor
* Electron.remoteProtocol
* Electron.remoteClipboard
* Electron.remoteCrashReporter
* Electron.remoteScreen
* Electron.remoteShell
* new ElectronRemoteBrowserWindow()
* new ElectronRemoteMenu()
* new ElectronRemoteMenuItem()
* new ElectronRemoteNativeImage()
* new ElectronRemoteTray()

# 注意点ほか
全てのモジュールを扱えるように作ったつもりですが、動作確認をほとんどしていないので、バグがあればPRください。

# 参考リンク

* [atom/electron API references](https://github.com/atom/electron/tree/master/docs)
* [Electronでアプリケーションを作ってみよう - Qiita](http://qiita.com/Quramy/items/a4be32769366cfe55778)
GoogleAppsScript : Container Bound Script の記述量をできるだけ少なくする試み

#はじめに注意
この記事は、Google Apps Script において、いわゆる "Container Bound Script" の記述量をできるだけ少なくする、オレオレベストプラクティスについて書いたものである。
実践してみた "Container" の種類 (たとえば Googleスプレッドシートや Googleサイト) が増えたりしたら書き加える可能性大。

##"Container Bound Script" の記述量をできるだけ少なくする、目的はなに？
Googleサイトや Googleスプレッドシートなどを拡張するのに Google Apps Script を書くわけだが、その際は、それら拡張対象の "Container" に結びついたスクリプトを書く必要がある。
しかし、それら "Container Bound Script" はスクリプト (この文脈ではほぼプロジェクトに等しい）として単独で存在しえないので、ローカルファイルシステムにダウンロードとか、ローカルからアップロードとかできないのである。私はやりたいの。

新しいプロジェクトを作ったときにも、基本的にはブラウザ上でテキストエリア同士の間でコピペが必要になり、再利用しにくい。スマートじゃない。

ということで、できるだけ "Container Bound Script" の記述量を少なくして、残りは "Standalone Script" で書いたライブラリをリンクするようにする、ということを考えるわけだが、実際どこまで少なくできるのか。

##⇒ `_.$(this);`
結論がこれ。

```js:client/コード.gs
_.$(this);
```

実コードを書いたプロジェクトを liba とすると、そこに `function $()` を定義しておき、その liba を `_` という識別子で "Container Bound Script" からリンクする。
ちなみに、liba はデベロッパーモード On でリンクすると、liba の更新が client 側にも随時反映されるので、サクサク開発時はそうするとよいと思う。

liba の関数 `$()` は例えば次のようになる。

```js:liba/コード.gs
function $(module) {
  var projectKey = ScriptApp.getProjectKey();
  if (projectKey == 'xxxxxxxxxxx') {
    module.fire = function() { Logger.log('fire'); };
  }
}
```

`$()` 関数内で `module` のプロパティとして関数を直接突っ込むと、それは `client` プロジェクトにおいてトップレベルで関数を置いたのと同じ意味になる。つまり、ここでの `fire()` 関数で言えば、

```js:client/コード.gs
function fire() {
  ...
}
```

と書いたのと同じになる。

で、ここちょっと重要だけど、`ScriptApp.getProjectKey()` で取得できるプロジェクトキーは、このコードが `liba` プロジェクトの中に書かれていても、実行時にキックされた `client` プロジェクトのものになる。みたい。
ということは、`$()` 関数の中でプロジェクトキーの値でディスパッチすれば、関連する複数の "Container Bound Script" で同じライブラリを共有できるようになる。

ちなみに、`_.$(this);` の呼び出しにより、`client` プロジェクト側では何らかの関数、ここでは `fire()` がトップレベルに定義されるわけだが、GAS エディタ (ブラウザ上の統合開発環境) にはこの関数は認識さず、「関数を選択」で何も選択肢が現れない。
一応 work around があって、

```js:client/コード.gs
_.$(this);
function fire() {
}
```

と、一旦 `fire()` を書いておいて、すぐに消すと、「関数を選択」に `fire` がリストされて選べるようになる。


##"Container" てか各アプリごとの実例
どの "Container" であっても、そこに Bound な Script については `_.$(this);` で全部対応できるはず。なので、問題は `$()` 関数での処理ですな。

###Googleサイトのガジェット

```js:liba/コード.gs
function $(module) {
  module.doGet = function(e) {
    ...
  };
```

まあこんな感じで書けばいいはず。未確認。

###Googleスプレッドシート

```js:liba/コード.gs
function $(module) {
  module.onOpen = function() {
    SpreadsheetApp.getUi()
    .createMenu('俺的メニュー')
    .addItem('サイドバー表示', 'showSideBar')   // <- (1)
    .addSeparator()
    .addSubMenu(SpreadsheetApp.getUi().createMenu('テスト')
                .addItem('テスト出力', 'outputTest')
               )
    .addToUi();
    showSideBar();
  };

  module.showSideBar = function() {  // <- (2)
    ...
  };
  ...
}
```

でちゃんとスプレッドシートを起動したときにカスタムメニューが表示された。
そして、メニューから「サイドバー表示」を選ぶと、サイドバーが表示された。
ここで確認しておくべきは、メニューから呼び出される関数名はいっさいの修飾なし、すなわち (1) のように書く一方で、その関数は呼び出し側の global 相当の `module` のプロパティとして、すなわち (2) のように定義する必要がある。

一応、また時間が取れたら書くかも知れないけれど、サイドバーの中のクリックイベントでスプレッドシートに値を入れる、という処理もうまく動いた。

####追記 2015-12-13

スプレッドシートを開いたときに起動される関数や、セルを編集したときに起動される関数は、トリガとして登録するが、この方式ではグローバルにある関数が認識されないので、トリガを設定する際のダイアログに、たとえば onOpen がリストアップず、そのせいでトリガの設定ができない。
ここでも「関数を選択」のときに GAS エディタを騙した work around が使える。すなわち、一旦空でいいので onOpen 関数をグローバルに定義しておき、トリガの設定を終えてから消せばよい。
Tessel の Wifi について



TesselのWifiを利用

* 既に node 用の tesselライブラリ？モジュール は導入されている前提です。
* TesselのWifiが最初つながらなかったのでメモしておきます。


## Wifiの設定

うまくいかない場合には

1. 本体の電源を切る
2. tessel wifi -d で過去のWifi情報を削除
3. tessel wifi -n XXX -p XXX で新規に接続

一度設定すると電源を消しても以前のWifi情報が残っていると思います。
したがって環境を変更するときには以下のコマンドを実行します。

```
~$ tessel wifi -d
TESSEL! Connected to TM-00-04-f000da30-00554f4a-68342586.
Erasing saved wifi profiles
Erased wifi profiles
```


ちなみにダメなときには

```
NFO Acquiring IP address.
........
........... timeout.
INFO Retrying...
INFO Acquiring IP address.
........
........... timeout.
INFO Retrying...
^C
```

のようにIPアドレスが取れない状況が続いたりします。


## Wifiのリスト

表示から見ると802.11nには対応していない模様

```
~$ tessel wifi -l
TESSEL! Connected to TM-00-04-f000da30-00554f4a-68342586.
INFO Requesting wifi status...
Currently visible networks (2):
	tdkx1 (83/127)
	aterm-xxxx-gw (83/127)
INFO Connected: 0
```


## Wifiへの接続

* ダメ時にはUSBケーブルの抜き差ししてみる
* `-s`を付けても結局自動でwep/wpa/wpa2が識別されている

```
 tessel wifi -n networkid -p password
TESSEL! Connected to TM-00-04-f000da30-00554f4a-68342586.
INFO Connecting to "networkid" with wpa2 security...
INFO Acquiring IP address.
.
INFO Connected!

IP	 192.168.0.10
DNS	 192.168.0.1
DHCP	 192.168.0.1
Gateway	 192.168.0.1
```
TypeScriptでPhotoshopを操る


Photoshopを始めとしたAdobe製品群はJSX[^1](ExtendScript)というJavaScriptで操作することができる。これをTypeScriptで書いてみる。

## ExtendScriptをTypeScriptで書くメリット

 * 型定義ファイル＋IDEによってゴリゴリ補完が効く
 * PDFのリファレンスを読むより、補完に頼った方がラク
 * TypeScriptの便利な機能が使える

PhotoshopのJavaScript APIはいわゆる普通のJavaScriptとは異なり、情報も少ない。TypeScriptはこういった情報が少なく調べにくいAPIを持つものに対して、型定義ファイルさえあれば無類の力を発揮する。

また、Template Strings や Enum など、便利な機能も使う事ができる。素のJSで書くよりも格段に生産性が上がる。

## 導入方法

### 1. 型定義ファイルから補完が効くエディタを用意する

VisualStudio Code辺りが無難。
Adobe系で揃えるならBrackets/Adobe Edge Codeでも可。

もしTypeScriptのコンパイラをインストールしていないのであれば、一緒にインストールされるのでVSCはおすすめ。

型定義ファイルから補完を効かせられないエディタの場合、意味が無いので乗り換える。

### 2. 型定義ファイル`photoshop.d.ts`を導入する

#### プログラマ向け：npmから

`photoshop.d.ts`は[DifinitelyTypedに無い](https://github.com/borisyankov/DefinitelyTyped/search?utf8=%E2%9C%93&q=photoshop) (2015-07-07現在)。代わりに`npm`でインストールする。

```sh
npm i photoshop.d.ts -D
```
 
#### デザイナー・テクニカルアーティスト向け: DLしてくる

githubというソースコード共有サービスの以下にあるファイルを全部DLする。

https://github.com/felixSchl/photoshop.d.ts/tree/master/dist/cc

`なんとかかんとか.d.ts`というファイルを全部DLし、これから書くスクリプトの近くのフォルダにまとめておくと良い。

### 3. 定義ファイルへのパスを通す

#### ソース中

`dist/cc/` 以下にある `ps.d.ts`にリファレンスパスを通すだけで良い。

```
///<reference path="./node_modules/photoshop.d.ts/dist/cc/ps.d.ts"/>
```
#### tsconfig.json

`"files":`内で`ps.d.ts`を指定しておく。

### 4. tsファイルをコンパイル

```sh
tsc target.ts -t "ES3" -noLib
```
コンパイルオプションとしては`-target "ES3"`,`-noLib`にする必要がある。その他はお好みで。

既存のExtendScriptがある場合、拡張子をとりあえず`.ts`に変更し、リファレンスパスを書いておくだけでも補完が効くようになる。

コンパイル後、tsファイルと同じ名前の.jsファイルができる[^2]。このjsファイルをExtendScript Toolkitで読み込むと実行可能になる。

ExtendScript Toolkitはjsの変更があると自動で再読み込みを行うので、tsファイルの変更を`tsc -w`辺りで監視＆自動コンパイルさせるとラク。

あとは普通にExtendScriptを実行するのと同じである。

## デバッグ

ExtendScript Toolkitのデバッガ機能を使う。

コンソール出力は`console.log()`ではなく、`$.write()`または`$.writeln()`になる。

たまに`photoshop.d.ts`が追いかけきれていないAPIがある[^3]ので、その場合はデバッガでオブジェクトプロパティを追いかけると良い。

## 参考:Photoshop API

`ps.*.d.ts` : Photoshop固有のAPIが定義されている。逆に言えばIllustratorなど他のAdobe製品のExtendScriptを書く場合は、これにかわる定義ファイルを用意すればよい。

`es.*.d.ts` : ExtendScript共通のAPIが定義されている。`$`クラス[^4]や`File`クラスなど他のAdobe製品のExtendScriptを書く際にも利用できる。




[^1]: FacebookのでもDeNAのでもない。[参考:「JSX」って名前のものが色々あって混乱する](http://qiita.com/ConquestArrow/items/29fc478f48862a4d14fb)
[^2]: `-out`オプションで`*.jsx`という拡張子にしてもよい。どちらでもOK。
[^3]: 例えば`UnitValue`インターフェイスは数値(`value`)と単位(`unit`)のプロパティを持つのだが[定義されていない](https://github.com/felixSchl/photoshop.d.ts/blob/master/dist/cc/ps.types.d.ts#L5994)。
[^4]: jQueryではないので注意。`$.write()`の`$`。
rundeckでリバースプロキシ

# rundeckでリバースプロキシ

実際に動かした時のメモ

Centos6.4 rpmでのインストール環境

* nginx.conf

```
http {
.....
    upstream rundeck_cluster {
        server 192.168.20.56:4440;
    }

    server {
        listen       80 default_server;
        server_name  example.com;
        location /rundeck {
            proxy_pass http://rundeck_cluster;

            proxy_redirect http://$host:4440/  /;
            proxy_redirect https://$host:4440/ https://$host/;
        }
    }
}

```

* /etc/rundeck/profile

```
 export RDECK_JVM="-Djava.security.auth.login.config=/etc/rundeck/jaas-loginmodule.conf \
         -Dloginmodule.name=RDpropertyfilelogin \
         -Drdeck.config=/etc/rundeck \
         -Drdeck.base=/var/lib/rundeck \
         -Drundeck.server.configDir=/etc/rundeck \
         -Dserver.datastore.path=/var/lib/rundeck/data \
         -Drundeck.server.serverDir=/var/lib/rundeck \
         -Drdeck.projects=/var/rundeck/projects \
         -Drdeck.runlogs=/var/lib/rundeck/logs \
+        -Dserver.web.context=/rundeck \
         -Drundeck.config.location=/etc/rundeck/rundeck-config.properties \
         -Djava.io.tmpdir=$RUNDECK_TEMPDIR"
```
TableViewCellの右ずれを直す

#右にずれる
なぜかTableViewでリストを作成するとデフォルト右に少しずれている。

![Screen-Shot-2015-07-07-at-02.04.11.png](https://qiita-image-store.s3.amazonaws.com/0/59560/cf975711-3269-845a-fe71-57206920d9ef.png)


#下記を指定するだけ

```swift

self.tableView.separatorInset = UIEdgeInsetsZero
self.tableView.layoutMargins = UIEdgeInsetsZero
```
log4j2 を Webアプリケーションで使う場合の配置と設定


自分用メモ。ログの設定は、一回設定したらその後はあまり触らないので、細かいことを忘れてしまい、何度も同じドキュメントを参照するハメになっているので。

## jar ファイル
最低限、以下のファイルが必要。

log4j-api-2.3.jar
log4j-core-2.3.jar
log4j-web-2.3.jar
(2.3 はこれを書いている時点の最新バージョン)

## log4j2 の設定ファイルの配置
設定ファイルはXML形式のみ記述(json形式とかは公式ドキュメント参照)。log4j 1.x系のproperties形式はなくなった。web.xml に設定ファイルの位置を記述する必要がある。
なお、以下のやり方はServlet API 3.0以上の場合。

### WEB-INF の直下にファイルを配置する場合(これが最も楽)

ファイル名は `log4j2.xml` または `log4j2-[webappname].xml` とすれば、web.xml への設定は不要。
`[webappname]` の部分には、Webアプリ名を入れる。ファイル名は必ず "log4j2" で始める必要がある。

### Webアプリのルート以下のどこかに配置する場合

```web.xml
<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>/config/log-config.xml</param-value>
</context-param>
```

`<param-value>` には、Webアプリのルート以下のパスを書く。ファイル名は適当に。

### ファイルパスを指定する場合

```web.xml
<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>file:///sample/log-config.xml</param-value>
</context-param>
```

`<param-value>` の値を `file:///` で始めて、ファイル名は適当に。

### クラスパスを指定する場合

```web.xml
<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>classpath:/config/log-config.xml</param-value>
</context-param>
```

`<param-value>` の値を `classpath:` で始めて、クラスパス上のパスを記述する。

## ログレベル

- ALL: 全てのレベルを出力
- OFF: ログを出力しない

あとは、ログレベルが高い(と言っていいのか?下に行くほど詳細)順に、

- FATAL
- ERROR
- WARN
- INFO
- DEBUG
- TRACE

ログレベルを指定しない場合は、ERROR がデフォルトとなる。

## 設定ファイルの書き方(XML形式)

こんな感じで(詳細は別でまとめた->[log4j2の設定ファイル(XML)](http://qiita.com/pica/items/f801c74848f748f76b58))。ファイルエンコーディングはUTF-8とする。

```log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="off">

    <!-- AppenterやLoggerで使用するプロパティを定義する -->
    <Properties>
        <Property name="...">hoge</Property>
        <Property name="..." value="..." />
    </Properties>

    <!-- ログの出力先と出力フォーマットを設定する -->
    <Appenders>
    </Appenders>

    <!-- パッケージごとにAppenderとログレベルを組み合わせる -->
    <Loggers>
        <Logger ...>
        <Logger ...>
    </Loggers>
</Configuration>
```


## 参照したURL

- http://logging.apache.org/log4j/2.x/manual/webapp.html
- http://logging.apache.org/log4j/2.x/manual/configuration.html
- http://logging.apache.org/log4j/2.x/manual/appenders.html
- http://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
ReactNative で Runtime is not ready

## 2015-08-04追記

[Devtoolが新しくなった](http://facebook.github.io/react/blog/2015/08/03/new-react-devtools-beta.html)らしいです！これは期待。

## これ

chromeを使ったデバッグしようとすると出るエラー。Chromeの準備ができてないですって言われる。

![image](https://qiita-image-store.s3.amazonaws.com/0/40921/d304cb53-af54-dea8-ce1c-2a02641cccbb.png)

これが結構な頻度で出るので、開発に支障が出る。

キャッシュを無効化(またはクリア)すると上手くいくっぽい？とも思ったけど気のせいだった。解決策ないかなあ。
「リーダブルコード適用 チェックリスト」を作ってみました

#リーダブルコード適用 チェックリスト

## リーダブルコード適用 チェックリスト使い方

- コーディング初心者はコードを書いた後、コードレビューしてもらう前にこのチェックリストでセルフチェックをする
- (コーディング中級者の)レビューワーはこのチェックリストをチェックつけながらコードレビューをする
- コーディング上級者（もしくはリーダブルコードを暗記してる人）はこのチェックリストは必要ないが、プロジェクトのレビュー運営のポリシーによって使うこともある。
- チェックリストの内容がわからなかった場合は[リーダブルコード要約](http://qiita.com/AKB428/items/20e81ccc8d9998b5535d)、もしくは「リーダブルコード」自体を読んで確認する。
- 今すぐ直せないコードもあるため全てにチェックがつかないといけないわけじゃない、チェックできなかった理由をレビュー対象者と共有し議論し、改善できる点は今後に活かそう。
- チェックにひっかかった、悪いコードはアンチパターン集としてプロジェクトの大事な資産としてwikiなどに記録して勉強会などで紹介してみよう。

## リーダブルコードチェックリストの作成方針

- リーダブルコードは全15章あるため多くても1章5個程度のチェックリストに収める（5個でも全部で75個になるため）
- 「コードが〜〜〜〜であること。」などチェック調の文体にする。
- 言語、フレームワークによってはチェックに沿わないこともある、その場合はチェックリストや別紙にイレギュラーケースを蓄積して後のレビューワーが参照できるようにする。



## リーダブルコードチェックリスト

### 1章
- [ ] コードは理解しやすくなければならない。
- [ ] コードは他の人が最短期間で理解できるように書かなければならない。

### 2章
- [ ] tmp,retval,resultなどの汎用的すぎる変数を使っていないか。
- [ ] 変数名の英単語を省略して理解しずらいものになっていないか。
- [ ] 変数名が長くなるのを恐れて短くしすぎて理解しずらいものになっていないか。

### 3章
- [ ] 限界値を示す変数に min_ max_を使っているか。
- [ ] 範囲を示す変数に first_ last_を使っているか。
- [ ] getXXXXメソッドをアクセッサー以外で定義していないか。

### 4章
- [ ] インデントが整っており見やすいコードになっているか。

### 5章
- [ ] 意味のないコメントを書いていないか。
- [ ] コードから読み取れる事をコメントに書いていないか。
- [ ] 定数にはコメントが書かれているか。
- [ ] クラスの使用方法など高レベルのコメントが必要なファイルには、ファイルの先頭にコメントが書かれているか。

### 6章
なし

### 7章
- [ ] ヨーダ記法を使用していないか。
- [ ] 三項演算子を使った結果、コードが理解しずらいものになっていないか。
- [ ] do~whileループを使用していないか。
- [ ] 関数内で早めに処理が抜けられるものはreturnで適切にガード節が作られているか。
- [ ] ifのネストが深くなっていないか。


### 8章
- [ ] 説明変数を使って改良できるコードが残っていないか。
- [ ] 要約変数を使って改良できるコードが残っていないか。
- [ ] 短絡評価を悪用、乱用していないか。

### 9章
- [ ] ループ処理の中で不要な中間結果を保持する変数を使用していないか。
- [ ] ループ処理の中で不要な制御変数を定義して使用していないか。
- [ ] グローバルなスコープが必要ないグローバル変数を定義していないか。
- [ ] クラス変数のスコープが必要ないクラス変数を定義していないか。
- [ ] JavaScriptで変数がグローバル領域にはみ出していないか。
- [ ] 古いC言語のルールに沿って意味もなく変数の定義を全て関数の先頭に書いていないか。
- [ ] 変更の必要ない変数には積極的にfinalがついているか。(C++, java)

### 10章
- [ ] メソッドの抽出が必要なコードは残っていないか。

### 11章
- [ ] ひとつの関数内に複数のタスクが書かれていないか。
- [ ] 関数名を逸脱した複数のタスクがひとつの関数内に書かれていないか。

### 12章
なし

### 13章
- [ ] 標準APIにある機能をオレオレ実装していないか。
- [ ] 広く使われている外部ライブラリ(Apache CommonsやBoost)にあるような機能をオレオレ実装していないか。

### 14章
- [ ] テストコードが理解しづらいものになっていないか。

### 15章
なし

---
 (コピーする場合は[gistのraw参照](https://gist.github.com/AKB428/53f54cac314595d44a9b))

![picture978-4-87311-565-8.gif](https://qiita-image-store.s3.amazonaws.com/0/36931/08bc7e82-c9e3-03f3-275f-674ec7398cd7.gif)
http://www.oreilly.co.jp/books/9784873115658/
Androidのバージョンと、SSL SNI(名前ベース)対応

意外と忘れがちなので。

﻿Security with HTTPS and SSL
https://developer.android.com/training/articles/security-ssl.html
> Common Problems with Hostname Verification
> ...
> Fortunately, HttpsURLConnection supports SNI since Android 2.3. Unfortunately, Apache HTTP Client does not

訳:
HttpsURLConnectionを使っている場合は、Android 2.3以降でSNI(名前ベース)に対応しています。

ただし、アプリ(ブラウザなど)の対応状況や、必要な証明書が入っているかなどにも注意が必要です。
ブラウザはAndroid 3.0以降と書いてある所もあります。
とはいっても、3.x(タブレット用)のADK(開発キット)は配布終了になっているので、2.3(Gingerbread)の次は4.0(ICS)と考えてよいと思いますが・・
(4.0も最初の版は配布終了になっているので、今後は4.1以降・・かなと。)

注意:ADKが配布終了になっているバージョンは、実は、飛び飛びです。
大混乱の19Lはおいておくとして・・
今生き残っているのは、(間違えそうなので、お菓子の名前は省略っ)
Android 2.2 (API 8)、2.3.3 (API 10)、
4.0.3 (API 15)、4.1.2 (API 16)、4.2.2 (API 17)、4.3.1 (API 18)、4.4.2 (API19)、
4.4W.2 (API 20)、5.0.1 (API 21)、5.1.1 (API 22)などです。
※API 19L(後で20になった)以降はウォッチやテレビなどが混ざっています。

2.xは、(少なくともGoogle Playなどが使えるAPI 9、実質的にはAPI 10以降は)もうしばらく残ると思いますので、注意が必要だと思われます。

おっと、忘れてました。
夜中のおかし画像による、腹減り共有をなく・・・ぐぅ
キーボードのタッチに引っ掛かりを感じるようになったら

##分解してシリコンスプレーをかけてやるといい

![09161600_5417e00e31d92.jpg](https://qiita-image-store.s3.amazonaws.com/0/52613/3cb89f43-3965-5d86-e69f-8e3a613ba539.jpeg)

HHK lite2でやったらぬるぬるのタッチになりました｡

##分解
メンブレンタイプでしか出来ないと思います｡
私がHHKで試した時は

1. 分解
2. キー上部を外す(電子部品が入ってる下側と､キーだけの上側にわかれます｡)
3. 洗剤で全部洗う(グリースがついてたらしっかり落としてください)
4. 可動部分に直接スプレー

キー上部は電子部品がないので簡単に洗えるんですよね｡
油を拭き取ったら戻しましょう｡
油のスプレーなので床に油がついてしまうとつるつるになってしまうので注意｡
リダイレクト時に利用すべきHTTPステータスコード

# 前書き

Wikipediaの情報が不完全だったので個人的にまとめておきます。

# 早見表

<table>
<tr>
<th width="75">コード</th><th width="200">フレーズ</th><th width="200">用途</th><th width="150">GETへの変更</th>
</tr>
<tr>
<td>301</td><td>Moved Permanently</td><td>恒久的な移動</td><td>許可</td>
</tr>
<tr>
<td>302</td><td>Found</td><td>一時的な移動</td><td>許可</td>
</tr>
<tr>
<td>303</td><td>See Other</td><td>新規リソースへの移動</td><td>強制</td>
</tr>
<tr>
<td>307</td><td>Temporary Redirect</td><td>一時的な移動</td><td>禁止</td>
</tr>
<tr>
<td>308</td><td>Permanent Redirect</td><td>恒久的な移動</td><td>禁止</td>
</tr>
</table>

※「許可」は実質、ほとんどのブラウザでGETに変更される模様です。

# 具体例

## 掲示板への投稿が終わって遷移させるときは…

`303 See Other` を使いましょう。過去には `302 Moved Temporarily` (`302 Found` の以前の名称) が使われていましたが、現在では迷わずこれ1択です。

## メンテナンス中にお知らせページに飛ばしたいときは…

`302 Found` または `307 Temporary Redirect` を使いましょう。「POSTのままお知らせページに飛ばす」ようにしても特に意味が無さそうなので、`302 Found` のほうがナチュラルと言えるかもしれません。

**【追記】**
**もしURLを変更せずにそのページで即`503 Service Unavailable`で返せるような設計になっていれば、そうしたほうが良いでしょう。**

## サイトを移転したときは…

`301 Moved Permanently` または `308 Permanent Redirect` を使いましょう。「POSTのまま新しいサイトに飛ばす」ようにしても特に意味が無さそうなので、`301 Moved Permanently` のほうがナチュラルと言えるかもしれません。

# 参考文献

- [Wikipedia - HTTPステータスコード](https://ja.wikipedia.org/wiki/HTTP%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89)
- [cyano - HTTPステータスコード – 302 Foundと303 See Otherと307 Temporary Redirectの違いについて](http://www.onflow.jp/cyano/archives/161)
- [Gigazine - 新たなHTTPステータスコード「308」とは？](http://gigazine.net/news/20140220-http-308/)