OmniAICreator/Qiita-1.07M huggingface dataset:
nsenter・docker-enterでコンテナに入る方法

# 概要
`nsenter`か`docker-enter`コマンドを使う事で、コンテナ(namespace)にSSHを使わず入ることができまる。ここでは、セットアップの仕方と使い方を紹介。
# 課題
Dockerfile 等でENTRYPOINTをデーモンに指定すると、サーバの操作ができず、SSHログインすることが出来ない。CentOS6 の Docker コンテナであれば sshd を起動させておけるが、CentOS7 では環境によって systemd で sshd を起動させることが出来ないだけでなく、本来のコンテナの使い方としては[推奨されていない](http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/)。
また、`docker attach` を使う場合は `Ctrl+P`キーが無効のため、emacs等のキーバインドに支障がでる。

# nsenter

## nsenterとは？
Dockerで作った名前空間（ネームペース;namespace）に入るためのコマンドライン・ツール。nsenter の由来は「`enter` into `n`ame`s`paces」＝「ネームスペースに入る」。

## セットアップするには？

パッケージ `util-linux` のバージョン 2.23 以降に同梱（RHEL7等）。

パッケージが提供されない場合、docker を使ってセットアップする方法が簡単。

```
docker run --rm -v /usr/local/bin:/target jpetazzo/nsenter
```

`/usr/local/bin/` 以下にファイルが置かれる。

## コンテナに入るには？

`docker ps`等でコンテナIDを確認するか、あるいはコンテナ名を引数にする。

> 書式：docker-enter <コンテナIDかコンテナ名>

例：daemon モードで実行する

```
# docker ps -l
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS               NAMES
88b0b089b522        zembutsu/centos6:httpd   /usr/sbin/httpd -D F   3 minutes ago       Up 3 minutes        80/tcp              focused_nobel

# docker-enter 88b0b089b522
bash-4.1# pwd ←ここからコンテナ操作
/
bash-4.1# exit ←終了
exit
```

なお、`docker-enter`は`nsenter`のラッパーであり、次の内容と同じ処理。

```
$ PID=$(docker inspect --format {{.State.Pid}} <コンテナ名かID>)
$ nsenter --target $PID --mount --uts --ipc --net --pid
```


# 参考

* https://github.com/jpetazzo/nsenter
* [Why you don't need to run SSHd in your Docker containers | Docker Blog](http://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/)
【iOS】一目瞭然！ビジュアルでわかるTextFieldのKeyboard Type

#TextFieldなどのKeyboard Type…
とっさに云われても、いざとなると困ってしまった私。

一覧はないものかと探していたら。
英語の記事だけれどとってもわかりやすいモノを見つけた。
JOEY DEVILLAさんのこの記事
<a href="http://www.globalnerdy.com/2013/02/18/the-iphones-virtual-keyboards-a-visual-catalogue/" target="_blank">The iPhone’s Virtual Keyboards: A Visual Catalogue</a>だ！
リンク先の写真をご覧いただければ、「ああこれか！」と思われること必至。
百聞は一見に如かず、是非一度ご確認いただきたい。
JOEY DEVILLAさんに感謝。

#【意訳】
<b>ASCII Capable</b>：<b>一番普通</b>のキーボード
<b>Numbers and Punctuation</b>：一番普通のキーボードが<b>「最初は数字の方」で</b>表示される
<b>URL</b>：<b>".com"キーがある</b>もの
<b>Number Pad</b>：<b>暗証番号</b>を入れるための、<b>数字のみ</b>のキーボード
<b>Phone Pad</b>：電話用。ゆえに<b>"#"や"*"</b>のボタンがある
<b>Name Phone Pad</b>：<b>qwertyキー／数字のみのキーボード</b>が交互に出てくる
<b>E-mail Address</b>：メールアドレスを入れるのに便利な、<b>"@" "," "."</b>を使いやすくしたタイプ
<b>Decimal Pad</b>：<b>小数点アリ</b>のナンバーパッド
<b>Twitter</b>：<b>"@"と"#"</b>を押しやすくしたキーボード

それではみなさま、お互い佳い開発ライフを！！
GCE vs EC2 vs さくらのクラウド vs ConoHa

<!-- title: GCEとAWSとさくらのクラウドとConoHaのコスパ比較 -->
<!-- id: 13 -->
**WordPress**を運用するサーバーとしてもっともコストパフォーマンスが高いものはどれかを調査しました。
<img border="0" width="1" height="1" src="http://www17.a8.net/0.gif?a8mat=2HDL38+3O692Q+50+4ASX02" alt="">

## 結論
[ConoHa](http://px.a8.net/svt/ejp?a8mat=2HDL38+3O692Q+50+4ASX02")のメモリ2GBプランがダントツでコスパ高いです。
[ConoHa](http://px.a8.net/svt/ejp?a8mat=2HDL38+3O692Q+50+4ASX02")の他のプランも他のベンダーのどのプランより高いコスパになってます。
ベンダー間の比較では[サクラのクラウド](http://cloud.sakura.ad.jp/)、[EC2](http://aws.amazon.com/jp/ec2/?nc2=h_l3_c)、[GCE](https://cloud.google.com/compute/)の順にコスパが悪くなります。


## 比較対象
以下の4つのサービスを比較しました。

* GCE (Google Compute Engine)
* AWS EC2
* さくらのクラウド
* ConoHa

**ConoHa**だけクラウドっぽくないので仲間はずれ感がありますが、**1日単位で課金**できたり、ローカルネットワークを作ってサーバー繋げれたりと、**さくらのクラウド**にかなり近い機能を提供しているので比較対象に加えました。

各サービスではさらに細かく以下のプランを比較しています。

### GCE

* f1-micro
* g1-small
* n1-standard-1
* n1-highcpu-2

### EC2

* t2.micro
* t2.small
* t2.medium

### さくらのクラウド
 
* 1Core-1GB
* 2Core-2GB

### ConoHa

* メモリ1GBプラン
* メモリ2GBプラン
* メモリ4GBプラン
* メモリ8GBプラン

## 性能計測方法
CentOS6にNginx + PHP-FPM + MySQL + WordPressの環境を構築し、**ab**コマンドで**動的ページ**と**静的ページ**の**Requests per second**の値を計測しました。
abコマンドに渡す*n*や*c*パラメータは何パターンか試し、それらで最も高い性能を弾き出したものを採用しています。
動的ページはドキュメントルート、静的ページは/readme.htmlとしました。
WordPressは何のプラグインも入れていない素の状態ですので、もちろんキャッシュなどは効いていません。


## 性能計測結果

※ RPS = Requests per second

| サービス | タイプ | 静的RPS | 動的RPS |
| -------- | ------- | --------- | ---------- |
| GCE | f1-micro | 175 | 3.8 |
| GCE | g1-small | 170 | 3.8 |
| GCE | n1-standard-1 | 172 | 7.6 |
| GCE | n1-highcpu-2 | 168 | 9.1 |
| EC2 | t2.micro | 192 | 8.1 |
| EC2 | t2.small | 198 | 8.1 |
| EC2 | t2.medium | 176 | 16.4 |
| さくらのクラウド | 1Core-1GB | 186 | 7.7 |
| さくらのクラウド | 2Core-2GB | 178 | 16.2 |
| ConoHa | メモリ1GB | 203 | 11.6 |
| ConoHa | メモリ2GB | 197 | 23.1 |
| ConoHa | メモリ4GB | 205 | 32.5 |
| ConoHa | メモリ4GB | 202 | 45.2 |

## コストパフォーマンス比較
性能計測の結果、静的RPSには大した差が見られませんでした。
よって、コストパフォーマンスは以下の方法で比較します。

* 1円でさばける月間動的リクエスト数を以下の式で求める
* 動的RPS * 3600 * 24 * 30 / 月額料金
* 1ヶ月を30日とする
* 1ドル=120円で計算する

比較結果の表です。

| サービス | タイプ | 月額料金 | 動的RPS | 動的Req / 月額料金 |
| -------- | ---- | ---- | ---- | ---- |
| GCE | f1-micro | 1123 | 3.8 | 8771 |
| GCE | g1-small | 2998 | 3.8 | 3285 |
| GCE | n1-standard-1 | 5962 | 7.6 | 3304 |
| GCE | n1-highcpu-2 | 7430 | 9.1 | 3175 |
| EC2 | t2.micro | 1728 | 8.1 | 12150 |
| EC2 | t2.small | 3456 | 8.1 | 6075 |
| EC2 | t2.medium | 6912 | 16.4 | 6150 |
| さくらのクラウド | 1Core-1GB | 1954 | 7.7 | 10214 |
| さくらのクラウド | 2Core-2GB | 3672 | 16.2 | 11435 |
| ConoHa | メモリ1GB | 930 | 11.6 | 32330 |
| ConoHa | メモリ2GB | 1400 | 23.1 | 42768 |
| ConoHa | メモリ4GB | 3780 | 32.5 | 22286 |
| ConoHa | メモリ4GB | 7590 | 45.2 | 15436 |

グラフにするとこうなります。
![0013.png](https://qiita-image-store.s3.amazonaws.com/0/66753/22ec4a75-12e8-6f53-c1ff-0e86c4144d3f.png)

## 考察
[ConoHa](http://px.a8.net/svt/ejp?a8mat=2HDL38+3O692Q+50+4ASX02")が圧倒的でした。
ですが、数ヶ月ほどConoHaを使ってみたところ、頻繁にDDoS食らって落ちてる印象が強いです。稼働率がキモになるような仕事をさせるのは怖いなぁと思ってます。
Android端末のhostsを書き換える方法

サーバー載せ替え時の検証などでAndroidのhostsを書き換えたい時のメモです。adbを使える環境になってる前提で書きます。ちなみにiPhoneだと端末からできるんですけどね。。。

と言ってもやることは簡単で、hostsファイルをpullして書き換えて、pushするだけです。

 

#1. hostsファイルを取ってくる
以下のコマンドで、hostsファイルをローカルに取ってきます。

```shell
$ adb pull /system/etc/hosts 任意のディレクトリ
```

何もいじってなければ、localhostだけが記述されているはずです。

```hosts
127.0.0.1 localhost
```
 

#2. hostsファイルに追記する
取ってきたhostsファイルに追記します。

```hosts
127.0.0.1 localhost
0.0.0.0 任意のドメイン
```

#3. hostsファイルを上書きしてpush
以下のコマンドで、書き換えたhostsファイルを上書きします。

```shell
$ adb push pullしたディレクトリ/hosts /system/etc/hosts
```

この時、以下のような書き込み権限のエラーが出るかもしれません。

```shell
failed to copy 'hosts' to '/system/etc/hosts': Read-only file system
```

管理者権限でマウントする必要があるので、以下のコマンドでマウントします。こちらの[StackOverFlow](http://stackoverflow.com/questions/7794659/how-to-change-the-hosts-file-on-android)を参考に。

```shell
$ adb shell
$ su
$ mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
```

マウントしたら、pushできるはずです。
仕事で使える英語表現（電話／会話）


ネイティブと仕事しているなかで使えるなと思った表現をまとめたメモより。

# Asking
## Do you wanna do A or shall I?
Aをやって貰えませんかと婉曲的に頼む方法。自分でもできるけれども、仕事の立場的に相手がやってくれた方がいいと思った場合などに使う。

# Beginning
## Good morning everyone. Thanks for joining today.
決まり文句。

## Hi, this is MY_NAME, sorry I'm late.
電話会議などに遅れてしまった場合。理由は言わないほうが吉。

# Agree
## That sounds good to me.
いいんじゃないの？

# Suggestion
<!-- // Commented out for now based on a feedback
## In terms of putting this forward, ..
先に進めるためには。。。色々分からないことはあるけど。。
-->

## It's good to begin with A.
Aから始めるのがいいんじゃないの？

# Summarizing
## We'll talk about it tomorrow but essentially ..
プレゼンテーションなどでoff-topicな質問を受けたり、後の方で説明する場合。
会議であまりトピックとは関係なかったりする場合とか。

## Let me get back to you.
調べて後で教えます。

```markdown:e.g.
I don't have the number at the moment, let me search and get back to you.
```


# Closing
## That's pretty much all from me. Do you have any?
キャッチアップ（互いのステータスのアップデート）をする時に、自分の言いたいことを言い切ったけど何故かあまり終わる雰囲気でない状況を打破する魔法の言葉。
ただし、ネイティブがこれを使っているのを聞いたことはないので自然かは不明。

## Let's keep in touch a little bit.
例えば連絡を初めて取る人に対して、これからしばらく情報共有したいねっていう時に使う。同じチーム内でずっと一緒に仕事する場合というよりは、別のチームだけど偶然同じ仕事をしなければならない場合など？

## Thank you very much for your time today.
わざわざ時間を取ってくれた時。あまり親しくない人に使う。

## I'll call you back.
「折り返します」

```markdown:e.g.
I'll call you back once this process finishes.
```

```markdown:e.g.
Let me call you back then.
```

## I appreciate all your help.
ありがとうの丁寧表現。

# Others
## Just to / Just so

Let me give you an example *just to* illustrate the point
よりわかりやくするために、一つ例を挙げます

*Just so* I understand correctly, ...
確認のために（もう一度言いなおすと
PHP Markdown Extra の使い方


ネットで探してみても、なぜか、PHP Markdown Extra の使い方らしきものが見つからなかったので、メモ。

##1. ダウンロード
PHP Markdown Extra をダウンロードして、適当な場所に「 **Michelf** 」フォルダー以下を放り込みます。

ちなみに、 **PHP Markdown Extra** は、以下のURLからダウンロードできます。

https://michelf.ca/projects/php-markdown/

##2. require
ダウンロードしてきたファイルを require させます。  

```php:sample.php
require_once 'MarkdownExtra.inc.php';
use \Michelf\MarkdownExtra;
```

##3. Markdown を HTML に変換
`$text`に、Markdown で書かれたテキストが代入されています。  
以下のコードでは、このテキストを HTML に変換して、`$html`に代入します。

```php:sample.php
$html = MarkdownExtra::defaultTransform( $text );
```

##ExtraじゃないMarkdownをHTMLに変換する方法
上のすべてのコードから __Extra__ を取り除けば、Extra じゃない通常の Markdown を HTML に変換できます。

##まとめ
別に難しくないですね。私と同じ状況でしたら、ぜひご活用ください。

##蛇足
あ、Markdown Extraの公式サイトのトップページをスクロールしてたら使い方出てきた。。
ノートンのSONAR(ヒューリスティック検知)の誤検知がヤバい

ノートンが会社のPCにしかないので確認が不足しています。
間違いや勘違いがあるかもしれませんが予めご了承ください。

尚、環境はWindows7 + Symantec Endpoint Protection 12(細かいバージョンは忘れた)です。

始まりはこれ
==========
![snapshot-15-01-21-202115.png](https://qiita-image-store.s3.amazonaws.com/0/52493/acd173a6-29cd-38f4-1562-29ef0ecefbd6.png)
https://twitter.com/nocd5/status/556052119568924672

---
会社でノートンの更新(→ Symantec Endpoint Protection 12)を促され更新したのですが、
bbLeanが**SONAR**で引っかかるようになってしまいました。
メニューからVisual StudioやEXCELを起動した時に検知されてしまいます。

bbLeanだけの問題では無かった
=========================
しかし、これはbbLeanだけの問題では無かったことがサンプルプログラムを作ってみて分かりました。
外部プログラムを起動すると呼び出し元のプログラムがウィルスと誤検知されることがあるようです。

```C:misdetect.cpp
#include <windows.h>

int main() {
    /////////////////////////////////////////////////////////////////////
    // ShellExecute(
    // NULL,
    // NULL,
    // "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE\\WDExpress.exe",
    // NULL,
    // NULL,
    // SW_SHOWNORMAL
    // );
    /////////////////////////////////////////////////////////////////////

    /////////////////////////////////////////////////////////////////////
    // SHELLEXECUTEINFO sei;
    // ZeroMemory(&sei, sizeof(sei));
    // sei.cbSize = sizeof(sei);
    // sei.hwnd = NULL;
    // sei.lpVerb = NULL;
    // sei.lpFile = "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE\\WDExpress.exe";
    // sei.lpParameters = NULL;
    // sei.lpDirectory = NULL;
    // sei.nShow = SW_SHOWNORMAL;
    // sei.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI;
    // ShellExecuteEx(&sei);
    /////////////////////////////////////////////////////////////////////

    /////////////////////////////////////////////////////////////////////
    // STARTUPINFO si;
    // PROCESS_INFORMATION pi;
    // ZeroMemory(&si, sizeof(si));
    // si.cb=sizeof(si);
    // CreateProcess("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE\\WDExpress.exe",
    // NULL,
    // NULL,
    // NULL,
    // FALSE,
    // 0,
    // NULL,
    // NULL,
    // &si,
    // &pi);
    /////////////////////////////////////////////////////////////////////

    /////////////////////////////////////////////////////////////////////
    WinExec(
            "C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE\\WDExpress.exe",
            SW_SHOWNORMAL
           );
    /////////////////////////////////////////////////////////////////////

    return 0;
}
```
上記をVC10で`cl.exe misditect.cpp`でビルドすると
誤検知されるプログラムの出来がありです。
外部プログラムの起動方法は様々ありますが、どの方法でもNGでした。

コンパイラ依存がある？
===================
上記のプログラムをMingw 4.8.1(TDM版)でビルドしたところ検知されませんでした。
(また、MingW 3.4.5でビルドすると検知されるという結果になりました。
しかし、ちょっと間をおいて再度MingW 3.4.5でビルドしたのですが、検知されなくなったので
バージョン依存は要調査)

Go言語でも
=========

```go:misdetect.go
package main
 
import "os/exec"
 
func main() {
    cmd := exec.Command("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\Common7\\IDE\\WDExpress.exe")
    cmd.Start()
} 
```
Go言語でもサンプルプログラムを書いてみたところ、こちらも誤検知されるという結果に。

 また、(予め断っておきますが、nyagosに問題ありません)**nyagos**でもVisual Studioを起動してみると、誤検知されました。

管理者権限で実行すれば大丈夫
========================
サンプルプログラムを管理者権限で実行すれば誤検知されませんでした。

〆
==
まだまだ未確認の部分が多数ありますが、
根本的な原因や、回避方法などが分かったら追記したいと思います。
不要なはずの Sized を要求してくる

分からなくて [Stackoverflow で聞いて](http://stackoverflow.com/questions/28044231)ようやく理解できたのでメモを兼ねて書く。

このエラーと戦う:

```
error: the trait `core::marker::Sized` is not implemented for the type ...
```

下記のようなコードを書いた。`Writer` は trait なので、実行時のサイズがよく分からずコールスタックには載せられないので参照（`&mut`）を使おうと考えた:

```rust
use std::io::{stdio, IoResult, Writer};

#[allow(unstable)]
fn main() {
    let h = |&: w: &mut Writer| -> IoResult<()> {
        writeln!(w, "foo")
    };
    let _ = h.handle(&mut stdio::stdout());
}

trait Handler<W: Writer> {
    fn handle(&self, &mut W) -> IoResult<()>;
}

impl<W: Writer, F: Fn(&mut W) -> IoResult<()>> Handler<W> for F {
    fn handle(&self, w: &mut W) -> IoResult<()> {
        (*self)(w)
    }
}
```

でもコレを `rustc` をすると:

```bash
$ rustc writer_handler.rs
writer_handler.rs:8:15: 8:43 error: the trait `core::marker::Sized` is not implemented for the type `std::io::Writer`
writer_handler.rs:8     let _ = h.handle(&mut stdio::stdout());
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
writer_handler.rs:8:15: 8:43 error: the trait `core::marker::Sized` is not implemented for the type `std::io::Writer`
writer_handler.rs:8     let _ = h.handle(&mut stdio::stdout());
                                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 2 previous errors
```

となる。要らないはずの `Sized` を要求されている。

`Sized` っていうのは「実行時にその型はどれだけメモリの確保が必要かわかっている」ってことを表現した trait で、struct には `Sized` が自動的に実装された状態になるが、trait には `Sized` が実装されない。trait では実行時にどの構造体がくる分からず、サイズが分からないからだ。

確かに `Writer` は trait なので `Sized` が実装されていない。

しかしそんなの分かっていて、そのために `&mut` を付けて参照にしていたのに・・・

原因
------

__型パラメータには暗黙的に Sized が付いてくるため。__

上記の例で言うと `trait Handler<W>` と `impl Handler<W> for ...` は暗黙的に以下のような意味になる:

```rust
trait Handler<W: Writer + Sized> {
```

```rust
impl<W: Writer + Sized, F: Fn(&mut W) -> IoResult<()>> Handler<W> for F {
```

このように、勝手に `Sized` をつけてくるため、`Sized` がない `Writer` を引数にしている `h` を使おうとすると:

```
error: the trait `core::marker::Sized` is not implemented for the type `std::io::Writer`
```

というエラーがでてしまう。


対処方法
---------

暗黙的に付く `Sized` を除くような記述をする。

それが `?Sized` という trait。これは「`Sized` でも `Sized` じゃなくてもいいよ、気にしないよ」という意味の（擬似？） trait らしい。

例として挙げたコードだと下記のように修正する:

```rust
use std::io::{stdio, IoResult, Writer};

#[allow(unstable)]
fn main() {
    let h = |&: w: &mut Writer| -> IoResult<()> {
        writeln!(w, "foo")
    };
    let _ = h.handle(&mut stdio::stdout());
}

//                         ↓これ！！！！
trait Handler<W: Writer + ?Sized> {
    fn handle(&self, &mut W) -> IoResult<()>;
}

//                ↓これ！！！！
impl<W: Writer + ?Sized, F: Fn(&mut W) -> IoResult<()>> Handler<W> for F {
    fn handle(&self, w: &mut W) -> IoResult<()> {
        (*self)(w)
    }
}
```

こうすることで、暗黙的に付く `Sized` を避けられ、サイズの要求をされることなく `rustc` が通るようになる。


参考
--------

* [rfcs/0490-dst-syntax.md at master · rust-lang/rfcs](https://github.com/rust-lang/rfcs/blob/master/text/0490-dst-syntax.md)
    * いくつか議論の余地がまだある様子
* [rust - What does "Sized is not implemented" mean? - Stack Overflow](http://stackoverflow.com/questions/28044231/what-does-sized-is-not-implemented-mean)
    * この件についての私の質問
yonellな個人メモ

完全なる個人メモですm(__)m
色々追記していく予定。

# Linux

## 特定のディレクトリ配下の複数ファイル内の文字列を置換する


```` find . -name "*.php" | xargs sed -i "" "s/Appli/App/g" ````

## PHP(slimフレームワーク)

## ブラウザでhoge.herokuapp.com/detailなどとアクセスすると404 Not foundになってしまう

原因や対応は↓な感じ
* hoge.herokuapp.comにアクセス
    * /index.phpを探しに行く
    * 置いてあるので処理できる
* hoge.herokuapp.com/detailにアクセス
    * /detail/index.phpを探しに行く
    * 置いてないので処理できない
    * 置けば良いというのもあるが、全ディレクトリに置くのはとても面倒なので他に何か方法が無いか探す
* /.htaccessファイルを以下の設定で置けばよい

```` .htaccess
# アクセスしたディレクトリにindex.phpが無いときに、
# /index.phpに内部リダイレクト
FallbackResource /index.php
````

* /index.phpが処理をして、ルーティングもやってくれて幸せになる

## マルチバイト文字が使えずにエラーになる
↓にまとめました
[Herokuで、DBアクセスするPHPのアプリ動かすと、call_user_func関数がうんたらというエラーが出て困った話](http://qiita.com/yonell/items/fbed7f66d804794a42b4)

# Swift
## カスタム文字列を使うときにハマったところ
info.plistのFonts providedy applicationに追加するバリューは、
hoge.ttfなどのファイル名ではなくて、ターミナルでmdls ファイルした時に表示される
com_apple_ats_name_postscriptの項目に書かれている文字列を記入する。

## サーバーサイドフレームワークのPerfcetまわり
### 導入記事
これを参考にすれば、MacでXcode使ってサーバーサイドとクライアントを動かす導入はok
ただし、Ubuntuで動かすにはPerfectのリポジトリのREADME参照
http://qiita.com/nirazo/items/a09b1a4687384d3e1fd0

# フロント
## gulp導入するときに役に立った記事
GulpはGruntを継承しつつ、Gruntの悪いところを改善するために開発された。

え、gulp? なにそれGruntと何が違うの?
http://www.atmarkit.co.jp/ait/articles/1408/19/news035.html

gulpの導入方法
http://liginc.co.jp/web/tutorial/117900

↑の通りにやって、npm install時にnpm WARN unmet dependencyとか出た時の参考
http://qiita.com/M-ISO/items/d693ac892549fc95c14c
JavaScriptでUnityに挑もうと"した"。

#UnityのJavaScriptはJavaScriptに非ず？

年内に個人でゲームを作ってみたいと思った。一番まともに触れるのがJavaScriptなので、そこから色んなプラットフォームに展開できそうなUnityを触ろうかと少し調べた結果、仕様が異なることを知った。

参考サイト：[UnityScript versus JavaScript](http://wiki.unity3d.com/index.php/UnityScript_versus_JavaScript)

##UnityルールのJavaScript≒UnityScript？

ページを読んでみると細かい点も含め違いは多々あるらしい。
とりあえず1.の全体像について勉強。

||UnityScript|JavaScript|
|-----|-----|-----|
|classが|有|無|
|ファイル名が|クラス名※|任意|

※後述

###UnityScript≠JavaScript

JavaScriptはECMAScript標準の言語だけどUnityScriptは準拠してないとのこと。

あくまでUnityScriptは独自の言語だと記述があった。

どうやら別言語として考えた方が良いらしい。

###クラス

JavaScriptはプロトタイプベースの言語だからクラスが無い。
UnityScriptには有る。次項にかかる。

###ファイル名

JavaScriptのファイル名は任意だ、何つけても良い（これは言い過ぎ）。
UnityScriptではファイル名こそがファイル内に記述されたファンクションを持つクラス名となるらしい。

###思ってたのとは違ったが…

拙い英語力で読み解いていった結果、なるほど違うなと。

それでも少しずつUnityを触っていこうと思う。
boto3 (AWS SDK for Python) メモ


新しい `boto3` を使ってみる。参考 → http://boto3.readthedocs.org/en/latest/

### インストール
pipで。Verは0.0.6。

```bash
$ sudo pip install boto3
$ sudo pip list | grep boto3
boto3 (0.0.6)
```

### EC2インスタンス情報取得
`$ aws ec2 describe-instances` 的なのを再現。

```python
>>> import boto3
>>> client = boto3.client('ec2')
>>> response = client.describe_instances()
>>> type(response)
<type 'dict'>
```

dict型で返ってくる。そのままでも良いけど、JSON化してみるとエラーとなる。

```python
>>> import json
>>> res_json = json.dumps(response)

TypeError: datetime.datetime(2014, 4, 4, 11, 34, 13, tzinfo=tzutc()) is not JSON serializable
```

ちょっと調べると、[datetime型に対応してない](http://stackoverflow.com/questions/11875770/how-to-overcome-datetime-datetime-not-json-serializable-in-python)らしく、bson(Binary JSON)とやらを使えばいけるっぽい。


ただ、Macだと[bsonのみ入れるとダメっぽい](http://stackoverflow.com/questions/12983472/flask-importerror-with-bson-on-os-x)ので、pymongoとやらを入れる。



```bash
$ sudo pip install pymongo
```

```python
>>> from bson import json_util
>>> res_json = json.dumps(response, default=json_util.default)
>>> type(res_json)
<type 'str'>
```


そのままだと全インスタンスの情報なので、Filtersで絞る。
InstanceIDで絞った場合。

```python
>>> response = client.describe_instances(Filters=[{'Name':'instance-id','Values':['i-XXXXXXXX']}])
```
Filterを変数化して、Tag名で絞った場合。

```python
>>> f = [{'Name':'tag-value', 'Values':['XXXXXXXX']}]
>>> response = client.describe_instances(Filters=f)
```



### EC2インスタンス操作
instanceオブジェクトに対して起動停止等を実施する。
まずは、instanceオブジェクトをInstanceID指定で取得してみる。

```python
>>> import boto3
>>> ec2 = boto3.resource('ec2')
>>> instance = ec2.Instance('i-XXXXXXXX')
>>> instance.private_ip_address
"10.X.X.X"
```

もう一つはInstancesCollectionから取得してみる。例えばタグ名から。
ただ、全instanceをループするので多いほど時間が掛かる。

```python
>>> import boto3
>>> ec2 = boto3.resource('ec2')
>>> tag_name = "TAG_NAME"
>>> instance = [i for i in ec2.instances.all() for t in i.tags if t["Value"] == tag_name][0]
>>> instance.private_ip_address
"10.X.X.X"
```


いずれかの方法で取得されたinstanceオブジェクトに対して操作する。
インスタンス停止。Waitが可能。自前ループが不要となった。

```python
>>> instance.stop()
{u'StoppingInstances': [{u'InstanceId': 'i-XXXXXXXX', u'CurrentState': {u'Code': 64, u'Name': 'stopping'}, u'PreviousState': {u'Code': 16, u'Name': 'running'}}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RequestId': 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA'}}
>>> instance.wait_until_stopped()
>>> instance.state
{u'Code': 80, u'Name': 'stopped'}
```

インスタンス起動。こちらもWait可能。

```python
>>> instance.start()
{u'StartingInstances': [{u'InstanceId': 'i-XXXXXXXX', u'CurrentState': {u'Code': 0, u'Name': 'pending'}, u'PreviousState': {u'Code': 80, u'Name': 'stopped'}}], 'ResponseMetadata': {'HTTPStatusCode': 200, 'RequestId': 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA'}}
>>> instance.wait_until_running()
>>> instance.state
{u'Code': 16, u'Name': 'running'}
```
ShellScriptでフラグ

Shellでフラグを使いたい！という場合、今まではTest文のANDチェーンで動かしていましたが、`true`コマンドと`false`コマンドを見つけたのでメモります。

```zsh:Terminal
local powerline_enabled
powerline_enabled=true

[ $powerline_enabled = "true" ]&& printf "POWERLINE \ue0b0"  #Before
$powerline_enabled&& printf "POWERLINE \ue0b0" #After

```

スマートだけど危なそう。ちゃんとtrueかfalse代入しとけばいいと思うけど。
webで頑張っている元教え子ちゃんにおくるまとめ＃6　Brackets ✕　PSD

#記述の動機
専門学校でPG、Webを教え始めてもう８年。
マイナススタートの２年はあまりに短い。教えきれなかったことが多い。
頑張ってる元教え子ちゃんにむけてまとめているのですが
ついでに、公開しておきます。
そして、現役の学生諸君へ、「良い道具を使いましょう。使い倒す勢いです。」

#現在、最強のエディタ
クライアントは問わない。
http://www.sublimetext.com/3
![kobito.1421835128.010082.png](https://qiita-image-store.s3.amazonaws.com/0/33317/209ced98-95f1-f28f-f224-fa3e7e87f9de.png "kobito.1421835128.010082.png")

RPM系の人はこちらを参考に。多分出来ると思う。
http://www.simonewebdesign.it/install-sublime-text-3-on-fedora-20/

他のディストリについては、ご指摘頂ければ幸いです。

#現在、最強かつ最速と思われるツール
http://brackets.io/
![スクリーンショット 2015-01-21 19.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/33317/b948cb3a-47a2-7daa-dd62-af0bcfa69a64.png "スクリーンショット 2015-01-21 19.07.17.png")

原文
Why Use Brackets?

Brackets is a lightweight, yet powerful, modern text editor. We blend visual tools into the editor so you get the right amount of help when you want it. With new features and extensions released every 3-4 weeks, it's like getting presents all year long.

Google先生が頑張った翻訳
使用する理由ブラケット？

ブラケットは、軽量でありながら強力な、現代的なテキストエディタです。あなたがそれをするときあなたが助けの適切な量を得るように、我々はエディタにビジュアルツールをブレンド。 3〜4週間毎にリリースの新機能や拡張機能で、それは一年中プレゼントを取得するようなものだ。

特別サービス
何故、ブラケットを使うのか？

ブラケットは、軽量でありながら強力な、現代的なテキストエディタです。あなたの求めることに対して必要なことを得ることが出来るように、我々はエディタにビジュアルツールをブレンドしました。新機能や拡張機能は3〜4週間毎にリリースされます。それは、一年中プレゼントをもらうことと同じことなのです。

#ここが重要！！
山のようにあありますね。
http://photoshopvip.net/archives/50784

じっくり読んで使い倒してみましょう。
http://webcre8.jp/think/editor-brackets-extract.html


#勘違いしてはいけないこと
今やToolは掃いて捨てるほどあります。
便利なToolはどんどん研究、導入すべし。
で、何が大事なんでしょう？「目的の実現」なんです。
高度な道具を数多くしってるだけでは意味がないの。
Jersey Client で POST

# 概要
以前書いたnode.jsでPOSTする記事（[Yahoo の API を node.js から利用する](http://qiita.com/noobar/items/d75525c03edbc9fb65a6)）をJersey Client (Jersey2) で実装しました。

# 実装例
短いコードなので、すべて貼り付けます。
`<appid>`にはアプリケーション登録をして取得したアプリケーションIDが入ります。

```groovy:build.gradle
apply plugin: 'java'

sourceCompatibility = '1.8'
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

if (!hasProperty('mainClass')) {
    ext.mainClass = 'com.example.Main'
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.glassfish.jersey.core:jersey-client:2.15'
}
```


```java:Main.java
package com.example;

import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedHashMap;

public class Main {
    
    public static void main(String[] args) {
        // For HTTPS
//        System.setProperty("jsse.enableSNIExtension", "false");
        
        // POST パラメータ
        MultivaluedHashMap<String, String> formParams = new MultivaluedHashMap<>();
        formParams.putSingle("sentence", "東京ミッドタウンから国立新美術館まで歩いて5分で着きます。");
        formParams.putSingle("output", "xml");
        
        String result = ClientBuilder.newClient()
                .target("http://jlp.yahooapis.jp")
                .path("KeyphraseService/V1/extract")
                .request(MediaType.APPLICATION_XML_TYPE)
                .header("User-Agent", "Yahoo AppID:<appid>")
                .post(Entity.entity(formParams, MediaType.APPLICATION_FORM_URLENCODED_TYPE), String.class);
        
        // 標準出力にレスポンスを表示
        System.out.println(result);
    }
}
```

**備考**

* HTTPSで通信する場合は`System.setProperty("jsse.enableSNIExtension", "false")`が必要でした。これについてはよく知らないので、気になる方は調べてください
* このサンプルではContent-Type以外のヘッダが1つしかありませんでしたが、2つ以上付けたい場合は`headers()`(doc: [Invocation.Builder](http://docs.oracle.com/javaee/7/api/javax/ws/rs/client/Invocation.Builder.html#headers(javax.ws.rs.core.MultivaluedMap)))を使用します

# 実装例 - レスポンスハンドリング -

上の例では、レスポンスボディの文字列をそのまま取り出していましたが、レスポンスのステータスコードやヘッダを取得したい場合もあります。このときは`post(Entity<?> entity)`を使います。

```java

import javax.ws.rs.core.Response; // 追加

...
        Response response = ClientBuilder.newClient()
                /* 略 */
                .post(Entity.entity(formParams, MediaType.APPLICATION_FORM_URLENCODED_TYPE));
        
        // レスポンスコード
        int statusCode = response.getStatus(); // 200とか404とか
        
        // レスポンスボディ
        String body = response.readEntity(String.class);
        
```


**注意**

* `response.readEntity()`は一度呼ぶと再度呼ぶことができません（`java.lang.IllegalStateException: Entity input stream has already been closed.`となります）

# Links

* [Chapter 5. Client API - Jersey User Guide](https://jersey.java.net/documentation/latest/client.html)
* [Jersey Core Client - Maven Repository](http://mvnrepository.com/artifact/org.glassfish.jersey.core/jersey-client)
WindowsのRubyでgemのインストール時にSSLエラーが出る場合の対処法


#環境
- [RubyInstaller版 Ruby](http://rubyinstaller.org)
- Windows7

#症状
`> gem install Foo` で；

>RemoteFetcher::FetchError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

のようなエラーが出る。

#対処法
RubyGemsを修正する。

「[Workaround RubyGems' SSL errors on Ruby for Windows (RubyInstaller)](https://gist.github.com/luislavena/f064211759ee0f806c88)」

上記ページの 2014.12.21にupdateされた「[Installing using update packages (NEW)](https://gist.github.com/luislavena/f064211759ee0f806c88#installing-using-update-packages-new)」の手順で行う。

`> gem --version`
でRubyGemsのバージョンを確認する。

`2.2.x`だとすると、最新の`2.2.3`にする。
RubyGemsの[リリースページ](https://github.com/rubygems/rubygems/releases)より、rubygems-2.2.3.zip と、rubygems-update-2.2.3.gem をダウンロードする。

ダウンロードしたrubygems-2.2.3.zip を右クリックで「すべて展開」する。
できたrubygems-2.2.3 と、rubygems-update-2.2.3.gem をc:¥  にコピーする。

```コマンドプロンプト
> cd c:¥
> gem install --local C:¥rubygems-update-2.2.3.gem
> update_rubygems --no-ri --no-rdoc

> gem --version #2.2.3になっているか確認する

> gem uninstall rubygems-update -x  #rubygems-updateをアンインストールする
```

#参考
・[Windowsでgem installするとSSLエラーが出る場合の解決策 - Qiita](http://qiita.com/shimoju/items/394818b4989b94680aaf)
【教えた人からの「ありがとう！」率100％】Chromeのアプリショートカットの表示をスッキリさせる方法

##前置き
今回は、簡単に出来て評判が良いChromeの設定を一つご紹介してみたいと思います。

注意書き：【教えた人からの「ありがとう！」率100％】と言うのは、あくまで自分の経験を言ったもので、全ての人から言って貰える事を保証するものではありません。何卒ご了承下さい。

何かしらの煽り文句を付けてみたかったんです。
すみません…(´・ω・｀)

##Chromeの純正アプリショートカットって…

早速ですが、デフォルトだとブックマークバーの左端に表示される、純正アプリショートカット…ちょっとウザくないですか？
(´・ω・｀)

かなり前の話ですが、Chromeのバージョンアップで、アプリ一覧の表示のさせ方が変わってしまいましたよね。

前の仕様だと、新しいタブを開いた時にアプリの一覧ページ等が表示されていましたが、バージョンアップでそれが廃止となり、新たなデザインと機能を持った「新しいタブ」が開く様になりました。

その代わりに出来たのがブックマークバー上にある「アプリのショートカット」です。
![image](https://qiita-image-store.s3.amazonaws.com/0/10658/c05a7918-1dfd-2346-333e-1aedf9cc46fd.png)
でもこのショートカットの仕様…かなり残念です…(´；ω；｀)

なんとこのショートカット、他のブックマークと違い、**名前変更が出来ない上に、場所も左端に固定されちゃっています！**

自分でキッチリ管理しているブックマークバーに勝手にコイツが出てきた時、思わず発狂しそうになったのは自分だけでは無い筈ｗ

解決方法には何か拡張機能を入れたり、新しいタブの動作を変える等、幾つか方法があると思うのですが、今回は新しいChromeの機能を残したまま、アプリショートカットの表示をスッキリさせる簡単な方法をご紹介してみたいと思います。

##スッキリさせる方法
先ず初めに純正アプリショートカットをクリックしてアプリ一覧のページへ行きます。
↓
その後そのアプリ一覧ページをブックマークします。すると以下の様になると思います。
![image](https://qiita-image-store.s3.amazonaws.com/0/10658/5ba4aa36-ca1c-86b0-ebc0-48b70899d32f.png)
右側にあるアプリのショートカットが今作ったブックマークです。
このショートカットは通常のブックマークなので、**名前変更も出来るし、場所の移動も自由行う事が出来ます！**
↓
ここまで来たら次に何をするか大体察しがつくと思いますが、純正アプリショートカットを消すためにブックマークバーをクリックし「アプリのショートカットを表示」のチェックを外します。
↓
純正アプリショートカットが消えたら、先程作ったブックマークを編集し、名前を削除します。するとアイコンだけのブックマークになるので、それを左端へ移動させれば完了です。
![image](https://qiita-image-store.s3.amazonaws.com/0/10658/861aaf36-47b8-196e-6cdc-d6a098c2a930.png)

どうでしょうか？

**純正アプリショートカットの機能をそのままに、見た目をスッキリさせる事が出来ました！**
(｀・ω・´)b

これなら発狂せずに済みそうですｗ

Chromeの純正アプリショーットカットって…(´・ω・｀)
っと思ってる方は是非一度お試し下さい！

##あとがき
この設定は自分が教えた人達だと、仕事で使う人達は勿論なのですが、そうじゃ無い人達もとても喜んでくれました。
特にデザイナーさん達は「良いね！ありがとう！」みたいな感じで、めっちゃ喜んでくれましたｗ
もしあなたの周りで、純正のアプリショートカットを使っている方が居たら、**是非教えてあげて下さい！**
きっと喜んで貰えると思います。

それでは、ここまで読んで頂き、ありがとうございました。
次は「Web開発者が選ぶ、Chromeのお勧め拡張機能！」みたいな投稿をする予定なので、そちらも見に来て貰えれば幸いです。
ではではー。(´・ω・｀)ﾉｼ

引用元：
この投稿は自分のはてなブログの記事
http://snowsunny.hatenablog.com/entry/2014/01/12/204455
をちょこっと編集して作った物です。
論理演算の型クラス

全ての論理演算は否定論理和 (NOR) あるいは否定論理積 (NAND) のみで表現することが出来る．そのため，`nor` と `nand` 以外の函数は全てデフォルト実装がつくれる．`nor` から `nand` を作ったりその逆もできるため，`nor` のデフォルト実装を `nand` で，`nand` のデフォルト実装を `nor` で書けばどちらか一方のみの実装でインスタンスになることができるようになる．

```hs
import Prelude hiding (and, or, not)
 
-- Warbler combinator
infixr 0 $$
($$) :: (a -> a -> b) -> a -> b
f $$ x = f x x
 
class Logic a where
  nor   :: a -> a -> a
  nand  :: a -> a -> a
  not   :: a -> a
  or    :: a -> a -> a
  and   :: a -> a -> a
  xor   :: a -> a -> a
  xnor  :: a -> a -> a
  imp   :: a -> a -> a
  nimp  :: a -> a -> a
  cimp  :: a -> a -> a
  cnimp :: a -> a -> a
  nor x y = nand $$ nand (nand $$ x) (nand $$ y)
  nand x y = nor $$ nor (nor $$ x) (nor $$ y)
  not = (nor $$)
  or = (not .) . nor
  and = (not .) . nand
  xor x y = and (or x y) (nand x y)
  xnor = (not .) . xor
  imp = or . not
  nimp = nor . not
  cimp = nand . not
  cnimp = and . not
 
instance Logic Bool where
  nand True True = False
  nand _ _ = True
 
data Bit = Zero | One
  deriving (Eq, Ord, Show, Read, Bounded, Enum)
 
instance Logic Bit where
  nor Zero Zero = One
  nor _ _ = Zero
```

含意を `imp`, 非含意を `nimp`, 逆含意を `cimp`, 逆非含意を `cnimp` とした．

# 参考
[論理演算 - Wikipedia](http://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E6%BC%94%E7%AE%97 "論理演算 - Wikipedia")
sshでMySQLを使ってバッチ処理をしたいとき

sshでサーバーにアクセスしてMySQLを叩き、取れたデータをローカルに落としたいときってありますよね。
いざやってみようと思うとあまり資料が無く、ちょっと時間が取られたのでメモメモ。

## sshでMySQLに接続する

sshで単純にMySQLの処理をするときは以下のようにコマンドを入力します。

```zsh
ssh hoge.com mysql -h <host> -u <user> -p<password> <dbname> -e "select * from hoge;"
# sshの設定はconfigで終了している前提です.
```

しかし、バッチ処理などになると複数のsql文を書かなきゃいけなかったり、今日の日付を利用してsql文を書いたりしたいですよね。
こういうときには.sqlファイルを作ってそこから読み込む方法が良いと思います。
.sqlファイルを読み込むには以下のようにコマンドを入力します。

```zsh
ssh hoge.com mysql -h <host> -u <user> -p<password> <dbname> < fuga.sql
```
【WP】Advanced Custom Fieldsの出力

# Advanced Custom Fields
WPのカスタムフィールドを自在に操れるプラグイン
投稿やページの他に、ユーザプロフィールにもカスタムフィールドを追加できちゃいます

[Advanced Custom Fields](https://wordpress.org/plugins/advanced-custom-fields/)
使い方はググってね♪

# 出力する
## 基本
これ大丈夫

```php
<?php the_field($field_name, $post_id); ?>
```
ちなみに`echo`は要らない

### $field_name
「フィールド名」を入れます
日本語でも大丈夫ですが、できるだけ半角英数で

### $post_id
指定したポストIDをいれます（省略可）

なので、基本的には

```php
<?php the_field($field_name); ?>
```
でOK

## ユーザプロフィールに設定したものを取得する場合
$post_idに該当ユーザのIDをいれてやる

```php
<?php
$aID=get_the_author_meta('ID');
the_field('$field_name', 'user_'.$aID );
?>
```
これで取得できます
Vimの文字コード関連

# Vimの内部文字コードする(encoding)

```vim
set encoding=utf-8
```

とするとVimの内部文字コードがUTF-8に設定される。
バッファの内容はこの文字コードで扱われる。
encodingがutf-8に設定された環境で以下のコマンドを実行すると「3」と表示されるはずである。

```vim
:echo len('あ')
```

これはUTF-8で「あ」が3バイトであることを示している。
encodingは後で設定しても反映されないため、.vimrcに書く必要がある。

# ファイル書き込み時の文字コード(fileencoding)

```vim
set fileencoding=utf-8
```

fileencodingが設定されていると、バッファの内容がファイルに書き込まれるとき、
（すなわち`:w`したとき）にencodingからfileencodingに文字コード変換が行われる。

fileencodingが設定されない場合は、encodingと同じになり、文字コード変換は行わない。

fileencodingの設定は、書き込み時にファイルに書き込まれる文字コードを設定するもので、
バッファに開かれている内容はencodingの設定で扱われることに注意。

# 読み込み時の文字コード(fileencodings)

```vim
set fileencodings=utf-8,cp932
```

読み込み時にどの文字コードとして読み込むかを指定する。
カンマ区切りで設定し、左から順に試して最初に成功した文字コードで読み込み、
encodingに文字コード変換されてバッファが開かれる。

成功した文字コードはそのバッファのfileencodingに設定される。

# 文字コードを指定して再読み込み

```vim
:e ++enc=cp932
```
# 詳細

```vim
:help encoding
:help fileencoding
:help fileencodings
```
作成したipaファイルをインストールして起動すると起動後にアプリがすぐ落ちる(AdHocやEnterprise ProgramのInHouse Distributionなど。)

コードにも特に問題がなさそうだし、証明書やProvisioning Profileがどう考えても間違っていないのに、ipaファイルをインストールした実機で、アプリが起動直後に落ちてしまうとき。

**前提**
・ビルドできる
・実機にもインストールできる
・Build Identifierの指定が間違っていない(App ID含む)
・TargetsとProjectの両方のCode Signingの設定にも間違いがない

そういう時は証明書やProvisioning Profileがおかしいのです。
大丈夫、あなたのミスではありません。以下を確認して下さい。

**確認事項**
①Archiveから、Validateしてみます
②そのときに、以下のエラーが出る
　　Your account already has a valid iOS Distribution certificate

上記を満たす場合は、証明書とProvisioning Profileを再発行しましょう。
証明書も再発行するのがポイントです。
これはXcodeのバグだそうです。
起動時のViewControllerを動的に変更する


## ViewControllerにIDを設定
初回起動時の候補のViewControllerにIDを設定
[スクリーンショット 2015-01-21 18.09.18.png](https://qiita-image-store.s3.amazonaws.com/0/16678/de6ffedb-998d-0758-b033-b42ad8b85429.png "スクリーンショット 2015-01-21 18.09.18.png")


## AppDelegateに分岐処理を記述
処理をappDelegateに記述

```

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        
        var flg = true //分岐条件
        
        var storyboard:UIStoryboard =  UIStoryboard(name: "Main",bundle:nil)
        var viewController:UIViewController
        
        
        //表示するビューコントローラーを指定
        if  flg {
            viewController = storyboard.instantiateViewControllerWithIdentifier("firstViewController") as UIViewController
        } else {
            viewController = storyboard.instantiateViewControllerWithIdentifier("secondViewController") as UIViewController
        }
        
        
        window?.rootViewController = viewController
        
        return true
}
```
    
## 参考
[リンク起動時に表示する ViewController を動的に変更する](http://qiita.com/takecian/items/f7f9017ebc18fa97a061
 "起動時に表示する ViewController を動的に変更する")
Enterprise ProgramでValidateしたときに、No matching provisioning profiles found for “xxxx/xxxx.app”

あまりニーズは多くなさそうですが。

Enterprise Programで配布用にビルドするとき。
ArchiveでValidateすると、以下の様なエラーが出てしまいました。

No matching provisioning profiles found for “xxxx/xxxx.app”
none of the valid provisioning profiles allowed the specified entitlements...

![スクリーンショット 2015-01-21 18.11.47.png](https://qiita-image-store.s3.amazonaws.com/0/6688/347f4a8c-0511-73f8-0ae0-b0080f2ab40f.png)

コレを解消する方法。
というかこれは解消する必要がありません。
Enterprise Programでは、Validateの必要が無いため、この警告は無視してExportして良いです。

以上！


参考ULR
http://stackoverflow.com/questions/26274306/none-of-the-valid-provisionning-profiles-allowed-the-specified-entitlements-bet
migration で polymorphic のカラムを後から追加する

create_table での polymorphic の書き方は、知ってたけど、
後からカラム追加する際は、hoge_id, hoge_type 等を add_column で追加してた。

それが、add_reference というメソッドで対応できるみたい。

```ruby:db/migrate/20150121000000_add_column_entity_on_users.rb
class AddColumnEntityOnUsers < ActiveRecord::Migration
  def change
    add_reference :users, :entity, polymorphic: true, index: true
  end
end
```

念のため、create_table の場合も記載

```ruby:db/migrate/20150121000000_create_users.rb
class CreateUsers < ActiveRecord::Migration
  def change
    add_reference :users, :entity, polymorphic: true, index: true
    create_table :products do |t|
      t.reference :entity, polymorphic: true, index: true
      t.string :name

      t.timestamps
    end
  end
end
```
sakuraVPSを借りてUbuntu初期セットアップ

自分が普段行っている「sakura VPS」の Ubuntu 環境作りです。
<strong>サーバーを借りてセットアップをどうするか</strong>、という疑問に対し大まかな流れを掴めればいいと思います。

## OS インストール
カスタムOSインストールで「ubuntu 14.04」を選択。
インストーラーを起動して以下の[さくらサポート( 公式 )](http://support.sakura.ad.jp/manual/vps/cpanel/custom_ubuntu1204.html) の手順に従う。
途中にでてくる『 Full name for the new user: 』『 Username for your account: 』は任意のサーバー名にした。

## OSインストールが完了したら以下のことを設定する。
* ネットワーク設定
リモートコンソールで行う。
`sudo vim /etc/network/interfaces`
eth0だったりeth1の部分で該当のipアドレスに書き換えます。
設定を行ったらネットワーク再起動。
<pre>
% sudo /etc/init.d/networking stop
% sudo service networking start
</pre>

* ホスト名変更
<pre>
sudo vim /etc/hostname
任意のホスト名へ変更
sudo vim /etc/hosts
127.0.1.1       ubuntu001.localdomain   ubuntu001 # この行を修正
反映にはネットワーク再起動必要
</pre>
http://tatsuyaoiw.hatenablog.com/entry/2012/07/13/003954


* ユーザーの追加
[参考](http://qiita.com/tkwn1/items/88217fb609a176e8fa4c)
ユーザー追加してsshログインできることを確認した後、OSインストール後にある「ubuntu(OSカスタムインストールのときにきまる)」などのユーザーは消す。` userdel -r username  `

* パスワードログイン禁止
`/etc/ssh/sshd_config`
<pre>
PasswordAuthentication no
</pre>
反映にはサーバー再起動が必要。 ※ stop, start としようとすると、リモートサーバーへ接続できなくなり sakura のリモートコンソールを立ち上げないといけなくなる(面倒くさい)ので必ず restart
` /etc/init.d/ssh restart `  
初期の段階ではサーバー自体の再起でも問題ない
http://www.yamamo10.jp/yamamoto/comp/home_server/ubuntu_server/ssh/index.php


* ファイヤーウォールの設定 ( ufw )
<pre>
% sudo apt-get install ufw
% sudo ufw default reject
% sudo ufw allow from 192.168.0.0/24 to any port 22
% sudo ufw allow 22
% sudo ufw enable
</pre>

* shell
 ※ ユーザーの追加をするときにオプションでデフォルトのシェルの設定ができる.
現在使っているシェル
`echo $SHELL`
使用できるシェルの確認
`cat /etc/shells`
シェル変更(例: bash)
`chsh -s /bin/bash username`
`bash`と打つと設定しなくても一時的にbashを扱える

* vim 
<pre>
apt-get install vim
</pre>

* 自動アップデート
`sudo apt-get install unattended-upgrades`
`sudo dpkg-reconfigure -plow unattended-upgrades`
`sudo vim /etc/apt/apt.conf.d/50unattended-upgrades`
<pre>
// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed.
Unattended-Upgrade::Mail "root@localhost";
// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
Unattended-Upgrade::Remove-Unused-Dependencies "true";
</pre>
参考: http://orangain.hatenablog.com/entry/unattended-upgrades  

* DNS設定
さくらで設定を行う。

## 必要ならば
サーバー監視のソフトウェアなのでアプリケーションが動くサーバーとは別のサーバーも用意する。

* munin
サーバーの様子を可視化するソフトウェア。
参考: http://pocketstudio.jp/log3/2012/08/23/munin_setup_howto_for_debian_and_ubuntu/

* monit
サーバーが落ちているときにアラートを出して指定したメールに届けることができる。
参考: http://shanon-tech.blogspot.jp/2011/11/15monit.html

## 最後に
私は上記設定ができた上で Ruby をビルドしたり、Mysql, MongoDB をインストールしたりとやっていました。
ペーパープロトタイピングを使わないチームでペーパープロトタイピングの意義を考えた

# その作業の意義
入力画面や閲覧画面を作成してみることで、どの画面にどの情報が必要か？を検討しようとしていた

# 前提
そのチームではペーパープロトタイピングを使わずに、デザイナーがライブコーディングしていた
また、画面や情報の洗い出しもユーザーストーリーベースではないため、乱立気味で価値が高そうに思える情報がそうでない情報に埋もれ気味だった

# やってみて思った
たたき台の画面を動かせるのがデザイナー1人しかいないので
デザイナーが「これをやってみては」の作業ボトルネックになった
また、大掛かりな変更は行いづらかった(というか不可能)
画面構成の変更は不可能に近かった
また、デザイナーが操作に専従になって、クリエイティビティを発揮できなかった

# ペーパープロトタイピングの長所
参加者全員がプロトタイプを変更できるので、「俺が考えた最強の画面モデル」を気軽に発表できる
また、全員が意見を言いやすい
デザイナーがクリエイティビティと主導権を発揮しやすい

本来の目的だった情報の画面配置と画面がユーザーの利用目的に合致しているか？のチェックもしやすい

# ペーパープロトタイピングの短所
扇風機のある部屋や、空調の風量が異常に強い部屋ではやめたほうがいい
あと一旦中断を挟んだ後の前回の再現作業が難しい
PHPUnitのインストールが簡単になってる！！

一昨年くらいに入れるのに苦労して手順を丁寧にメモっておいたのに、手順通りで入らない！

# 前の手順はこれ
PEARがなければPEARも入れる・・・

```
yum install -y php-xml
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com
pear channel-discover pear.symfony.com
pear install pear.symfony.com/Yaml
pear update-channels
pear upgrade-all
pear clear-cache
pear install -f -a phpunit/PHPUnit
phpunit --version
```

# これだけで終わりだった！
要は公式をちゃんと読めって話で、

```
wget https://phar.phpunit.de/phpunit.phar
chmod +x phpunit.phar
mv phpunit.phar /usr/local/bin/phpunit
phpunit --version
```

これで無事完了

# 追記（2015/12/08）

久しぶりに使ったらエラーでました。

```
This version of PHPUnit requires PHP 5.6; using the latest version of PHP is highly recommended.
```

はいそうです。PHPが古いんです。でも以前苦労して作ったDocker環境なので、PHPだけ変えるわけにもいかないんです！何が起きるか分からないんです！

ということで、PHP5.4環境だとPHPUnitの最新版は入らないらしいので、こちらに変更

```
wget https://phar.phpunit.de/phpunit-old.phar -O phpunit.phar
```
Google Chromeのユーザ切り替えメニューにユーザ一覧を表示する方法

最近のGoogle Chromeの更新でユーザの切り替えをするのにワンアクション増えて地味に煩わしいので、これを戻す方法。

1. `chrome://flags`を開く
2. `Enable fast user switching in the avatar menu`を検索して、これを有効にする
3. Chromeを再起動する

これだと新UI＋一覧表示でちょっと綺麗。

ただ今のところ一覧がスクロールできないのでユーザ数が多いときに不便。そういうときは次の方法で古い表示に戻せる。

1. `chrome://flags`を開く
2. `Enable the new avatar menu`を検索して、これを無効にする
3. Chromeを再起動する
Call to undefined function mb_send_mail() で対処したメモ

## 環境
CentOS6.6(64bit)


## 事象
環境をリプレースしたらWebサイトがうまく動作せず、apacheのエラーログに以下が記録されていた。

```
PHP Fatal error:  Call to undefined function mb_send_mail()
```

っていう感じでメールが送れずに処理が出来ない的なやつ。


## 対処方法

```shell-session
# yum install php-mbstring
```

その後apacheを1回再起動

```shell-session
# apachectl graceful
```

エラー解消。メールも送られてきた。別な理由の場合もあるんだろうけど、とりあえずメモ。
C++ の STL にて printf() の 如く 文字列を 整形す


たとへば

```c++
#include <stdio.h>

::printf("%04X", i);
```

を STL 風に 記すに

```c++
#include <iostream>
#include <iomanip>

std::cout << std::setfill('0') << std::setw(4) << std::hex << i;
```

なんぞ いと 讀み難し w
iOS にて 文字列を URI encode/decode する。


(Objective-C きらひ)

```objectivec:
+ (NSString *) encodeURI: (NSString *) s
{
    return (__bridge_transfer NSString *)
        CFURLCreateStringByAddingPercentEscapes(
            kCFAllocatorDefault,
            (CFStringRef) s,
            NULL,
            (CFStringRef) @"!*'();:@&=+$,/?%#[]",
            kCFStringEncodingUTF8
        );
}
```

```objectivec:
+ (NSString *) decodeURI: (NSString *) s
{
    return (__bridge_transfer NSString *)
        CFURLCreateStringByReplacingPercentEscapes(
            kCFAllocatorDefault,
            (CFStringRef) s,
            CFSTR("")
        );
}
```
ブロックなしRuby 上級編の問題をSmalltalkでどう書く？

- [ブロックなしRubyをやろうとすると関数型プログラ…うーんリストプロセッ、えーと感じ感じ](http://qiita.com/supermomonga/items/f22dbe021a8e79d55322)

><p>ここで問題です。今までのコードを踏まえた上で、次のコードをProcオブジェクトを実行(<code>call</code>メソッド呼び出し)する形に書き換えてください。ただし、ブロックを使ってはいけません。</p>

>```ruby
xs = (1..10)
xs.map{|it|it.to_s(2)}
#=> ["1", "10", "11", "100", "101", "110", "111", "1000", "1001", "1010"]
```

<br/>

とりあえず、同じ処理を Squeak Smalltalk で書くとこうなります。


```smalltalk
| xs |
xs := (1 to: 10).
xs collect: [:it | it radix: 2]
"=> #('1' '10' '11' '100' '101' '110' '111' '1000' '1001' '1010') "
```

<br/>

さて。Smalltalk では何でも（原則として）メッセージングなので、ここはいったん関数型の文脈から外れてメッセージングでの解決を試みてみましょう。

<br/>

ここで問題なのは

```smalltalk
[:it | it radix: 2]
```

というブロック内の

```smalltalk
it radix: 2
```

という式を、ブロックを使わずに表現するにはどうしたらいいか？というところです。

<br/>

ちなみに、Ruby での例と同様に<code>capitalized</code>のような単項メッセージであれば、Squeak Smalltalk でもシンボルで代替することができます。[^1]

[^1]: すべての Smalltalk で、というわけではありません。単項メッセージ式ブロックの代わりにその単項メッセージのセレクタシンボルを用いるというような置き換えが可能な細工がしてあるのは Squeak の他には Pharo のように、Squeak から派生した処理系など一部の処理系に限られます。<br/>


```smalltalk
| xs |
xs := #(akechi kokoro itoh chika ayase ena koshimizu sachiko).
xs collect: [:it | it capitalized]
"=> #(#Akechi #Kokoro #Itoh #Chika #Ayase #Ena #Koshimizu #Sachiko) "
```

```smalltalk
| xs |
xs := #(akechi kokoro itoh chika ayase ena koshimizu sachiko).
xs collect: #capitalized
"=> #(#Akechi #Kokoro #Itoh #Chika #Ayase #Ena #Koshimizu #Sachiko) "
```

<br/>

もちろん、この方法は二項メッセージやキーワードメッセージなど引数をとる場合は使えません。

<br/>

ところで、Smalltalk では<code>it radix: 2</code>という式は「<code>it</code>に<code>radix: 2</code>というメッセージを送る」と解釈されます。

そこで、引数を含む<code>radix: 2</code>というメッセージをファーストクラスオブジェクトとして作ってやって、それを<code>collect:</code> の引数としてブロックやシンボルの代わりに渡してやればよさそうです。（本当か？）

<br/>

```smalltalk
| xs |
xs := (1 to: 10).
xs collect: (Message selector: #radix: argument: 2)
```

![033.png](https://qiita-image-store.s3.amazonaws.com/0/49275/cb7cd5ff-dbcd-2e6b-c175-9285eaa8b41c.png)

<br/>

が、しかし、まあ、これは普通にエラーになります。←ぉぃ！

<br/>

```
MessageNotUnderstood: Message>>value:
```
![blocklessruby01.png](https://qiita-image-store.s3.amazonaws.com/0/49275/2b0d5bcc-f25d-526b-7c09-841c89efdaea.png)

<br/>

どうやら<code>collect:</code>の引数には<code>value: arg</code>というメッセージを送られるようなのですが（通常、<code>collect:</code>は１引数のブロックを引数にとるので当たり前か！）、メッセージオブジェクトにはこのメッセージに対する振る舞い方がわからない、というわけですね。[^2]

[^2]: 本当はわかっていて、MessageNotUnderstood という例外を投げるという振る舞いをしているわけですが、まあそれはまた別の話。<br/>

<br/>

しかたがないので、<code>Message>>#value:</code>を定義してやります。もとい。<code>Message</code>にメッセージを投げてそのように振る舞いを変えてもらいます。

```smalltalk:
Message compile: 'value: arg
   ^self sendTo: arg'
```

<br/>

これでＯＫです。前に出てきたエラーを表示していたウインドウ（ノーティファイア）がまだ閉じられていなければ、それの「Proceed」ボタンを押すか、エラーを出していた元の式を再評価することで期待通りの結果が得られます。

```
=> #('1' '10' '11' '100' '101' '110' '111' '1000' '1001' '1010')
```

<br/>

めでたし、めでたし。（ぉぃぉぃ…）

<br/>

___
ELBでHTTPSを通す


WEBサーバに証明書を入れてHTTPSを使っていたが、WEBサーバの前にELBをたてて、ELBでHTTPSを解除しようとした。
ELBのListenerに、HTTPS(443)を追加、WEBサーバ側のポートを80に設定し、SSL Certificate Changeを押して、証明書のファイル内容をコピペ。

ここでWEBサーバで使っていた証明書をそのままコピペすると以下のようなエラーが表示された。

```
Failed to create SSL Certificate: XXXXXXXX java.lang.ClassCastException: org.bouncycastle.asn1.pkcs.PrivateKeyInfo cannot be cast to org.bouncycastle.openssl.PEMKeyPair
```

ググってみると、PEM形式に変換する必要があるらしい。

参考:
http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/ssl-server-cert.html

以下のように各鍵ファイルを変換して突っ込んだら解決した

1.秘密鍵

```
openssl rsa -in XXX.key -outform PEM > XXX.key.pem
```

2.署名鍵

```
openssl x509 -inform PEM -in XXX.crt > XXX.crt.pem
```

3.チェイン(Optional)

```
openssl x509 -inform PEM -in XXX_im.crt > XXX_im.crt.pem
```
bootstrap3で固定ナビバーを使うとテストでボタンが押せない場合がある件

bootstrap3で作っている画面のテスト(rspec + capybara + poltergeist)で、
ボタンを押そうとしたら固定ナビバーの下にボタンが潜り込んでしまったために押せず、
エラーになってしまいました。
この問題は、一度画面上までスクロールしてやることで回避可能です。

```rb:feature-spec
page.driver.scroll_to(0, 0)
```
Rack 1.6 な Sinatra アプリケーションに Docker コンテナ外からアクセスできなかった

- [2015-01-24 05:00] @5t111111 さんのコメントに基づき、Rack 1.6 のデフォルト挙動について追記
 
Rack 1.6.0 を使用した Sinatra アプリケーションを Docker 上で起動したところ、コンテナ外からの接続ができませんでした。`EXPOSE 9292` して `-p 9292:9292` しているにも関わらず、です。
とりあえずの対処法を書いておきます。

## アプリケーション構成例

最小構成の Sinatra アプリケーションを Docker 上で動かすためのファイル例を Gist に上げました。

https://gist.github.com/dtan4/373907a001f3f3ebbd9c

はじめに言っておくと、Ruby のバージョンを変えること（2.1.5 にするとか）は解決になりませんでした。Ruby 2.2.0 のせいとかではない。

あと Docker のバージョンは （2015-01-21 最新の）1.4.1 です。

## 対処法1: Rack 1.5.2 を使う

一つ前のバージョンである Rack 1.5.2 であればこの問題は発生しません。Gemfile でバージョン指定しましょう。

```rb:Gemfile
gem "rack", "~> 1.5.2" # or "= 1.5.2"
```

## 対処法2: `rackup` に `-o 0.0.0.0` オプションをつける

`rackup --help` より、

`-o` は ListenAddress を設定するためのオプションです。

```
  -o, --host HOST          listen on HOST (default: 0.0.0.0)
```

というように `0.0.0.0` がデフォルトで設定されるよ、と書いてありますが明示的に指定してあげます。Dockerfile だと最後の `CMD` がこういう感じになります。

```docker:Dockerfile
CMD ["bundle", "exec", "rackup", "-p", "9292", "-E", "production", "-o", "0.0.0.0"]
```

__--- 2015-01-24 05:00 追記 ---__

Rack 1.6 からは、明示的に指定しない限り localhost のみを listen するような変更が加わったとのことです。公衆 Wi-Fi につないでるような場合に、他の端末からアクセスされないようにするためです。

プルリクは [rack/rack#514](https://github.com/rack/rack/pull/514)
該当コミットは [28b0144](https://github.com/rack/rack/commit/28b014484a8ac0bbb388e7eaeeef159598ec64fc)

ということで上のヘルプメッセージは変更に追随できてないのですが、これもコミット [076711a](https://github.com/rack/rack/commit/076711a837cda3f07889cab05cb89964ce2314f0) で修正が入りました。
次のリリースでは直っているはず！

教えてくださった @5t111111 さん、ありがとうございました。

__--- 追記ここまで ---__

* * *

ちなみに、localhost からアクセスした時のログですが

`-o 0.0.0.0` なしの場合、以下のようにリクエスト元 IP が IPv6 に、

```
::1 - - [21/Jan/2015:15:35:31 +0900] "GET / HTTP/1.1" 200 8056 2.2458
```

`-o 0.0.0.0` ありの場合、以下のようにリクエスト元 IP が IPv4 になっています。Rack 1.5.2 でも同様のログが得られます。

```
127.0.0.1 - - [21/Jan/2015:15:37:11 +0900] "GET / HTTP/1.1" 200 8056 2.0355
```

詳しくはまだ追えていないのですが、多分 Docker のネットワーク部で IPv6 と IPv4 の対応か何かができてないのが理由かな…と思っています。
デフォルト値をそのまま指定しているのに、挙動が変わる Rack もなんか不自然ですが…

__--- 2015-01-24 05:00 追記 ---__

上に追記しましたが、Rack 1.6 からはデフォルトで localhost のみを listen するようになりました。この状態では、コンテナ外からアクセス出来ないのは当然ですね…。
（ヘルプに書かれた）デフォルト値をそのまま指定して挙動が変わるの、ヘルプが間違っているのですからこれまた当然です…。
Docker の挙動の問題ではありませんでした。

__--- 追記ここまで ---__

## おわりに

Rack 1.6 な Sinatra アプリケーションに Docker コンテナ外からアクセスするための対処法を紹介しました。Sinatra アプリケーションを `bundle update` する際は注意してください。

ここに上げた方法は、その場しのぎの対応である感じが否めません。Docker のネットワーク周り確認したり、Rack のソースコード読まないといけませんね（[1.5.2 -> 1.6.0 の ChangeLog が無い](https://github.com/rack/rack#history)の厳しい…）。
wgetで特定のURL内情報を取得する時に便利なオプション

<big>wgetで特定のURL内情報を取得する時に便利なオプション</big>

こういう条件でファイルを一括ダウンロード出来ないかな？

1. rsyncが使用できない環境でリポジトリからパッケージ一式を拾いたい
2. ダウンロードする際は、特定のURL内だけ取得したい

と思い調べた結果、wgetオプションで何とかなることがわかりました。
たとえば、zabbixのリポジトリからubuntu用パッケージをダウンロードしたい場合

    /usr/bin/wget -r -np -nH --cut-dirs=6 \
    -R "index.html?*" \
    "http://repo.zabbix.com/zabbix/2.4/ubuntu/pool/main/z/zabbix/"  \
    -P ~/wget/

上記で無事に~/wgetディレクトリにzabbixディレクトリが作成され、debパッケージがワラワラ入ってきました。

| オプション | 内容 |
|-----------|------------|
| -r | 再帰的に取得する |
| -np | 親ディレクトリを含めない |
| -nH | ダウンロードの際、ホスト名を除外する |
| --cut-dirs= | 除外する階層を決める |
| -R | ダウンロードしないファイルを決める |
| -P | 保存先を指定 |
JISAによる「プロジェクト健全性評価指標」

http://www.jisa.or.jp/publication/tabid/272/pdid/23-J013/Default.aspx
この手の資料は、IPAが多く公開していますが、こちらの↑資料もよくできています。

特に、p.9-10の評価指標体系表(+体系図)や巻末のチェックリストは、初心者?でも分かりやすいです
IE9でエンターキーを押されたイベントを取りたいとき


keypressイベントを使ってエンターキーが押されたイベントをとりたいとき、
jQueryを使った書き方だと以下のようになる。

```main.coffee
$( ".input" ).on "keypress", ( e )->
	if e.which == 13
		// fire event
```

しかし、この場合だと何故かIE9ではイベントが発火されない。
正しく発火されるようにするためには、keypressイベントではなく、
keydownイベントを使えばいいようだ。