OmniAICreator/Qiita-1.07M huggingface dataset:
nginx - PHP-FPM 間の通信を UNIX ドメインソケットに変更する


## PHP-FPM の設定変更
```console:
# sed -i -e 's/listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm\/php-fpm.sock/' /etc/php-fpm.d/www.conf
# sed -i -e 's/;listen.owner = nobody/listen.owner = nginx/' /etc/php-fpm.d/www.conf
# sed -i -e 's/;listen.group = nobody/listen.group = nginx/' /etc/php-fpm.d/www.conf
```

## nginx の設定変更
[PHP-FPM + nginx インストール(CentOS 6)](http://qiita.com/TatsuNet/items/4dd7d7715bb092ae80e7)で作成したバーチャルホストに対して設定する。

```console:
# sed -i -e 's/fastcgi_pass   127.0.0.1:9000;/fastcgi_pass   unix:\/var\/run\/php-fpm\/php-fpm.sock;/' /etc/nginx/sites-available/virtualhost.conf
```

## PHP-FPM と nginx の再起動

```console:
# /etc/rc.d/init.d/php-fpm restart
# /etc/rc.d/init.d/nginx configtest
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
# /etc/rc.d/init.d/nginx restart
# ls -l /var/run/php-fpm/php-fpm.sock 
srw-rw----. 1 nginx nginx 0  3月 16 08:15 2015 /var/run/php-fpm/php-fpm.sock
```

## 動作確認

```console:
# echo '<?php phpinfo();' > /usr/share/nginx/virtualhost/index.php
```

ブラウザで以下のURLにアクセスして、PHP情報が表示されることを確認する。
[http://virtualhost.tatsunet.net/](http://virtualhost.tatsunet.net/)
Laravel3 バリデーションメッセージの上書き

*Laravel3 の情報です*

# 現時点での妥協策

```php:カスタマイズバンドルのvalidation.php
<?php

return array_replace_recursive(Lang::file(DEFAULT_BUNDLE,'ja','validation'), array(
    'attributes' => array(
        '属性名'        => 'カスタマイズエラーメッセージ',
    ),
));
```

カスタマイズ部分を全てバンドルに放り込んで作っていた。
バリデーター、モデル、ビューは全て継承とIoCの書き換えで対応できた。
最後に行うことはバリデーションエラー時のメッセージの変更。
ここで躓く。

変更対象はひとつの属性。なので、
バリデーターのバンドルを`$Validator->bundle('カスタマイズバンドル')`し、エラーメッセージをカスタマイズバンドルから読み込むように変更。
`バンドル/language/ja/validation.php`のメッセージを設定。
これで他の部分は`DEFAULT_BUNDLE`(標準app)のメッセージを出力し、カスタマイズ部はカスタマイズメッセージを出力することを期待する。

```php:カスタマイズバンドルのvalidation.php
<?php

 return   array(
	'attributes' => array(
        '属性名'        => 'カスタマイズエラーメッセージ',
    ),
);
```

結果は失敗。

```lang:出力されたエラーメッセージ
バンドル::validation.match
```

書き換われないどころかルール部分のメッセージや他の属性まで未設定っぽくなってしまう。
恐らく`DEFAULT_BUNDLE+バリデーションに設定したバンドル`ではなく`バリデーションに設定したバンドルのみ`でエラーメッセージを作成している。
よって最低限、バンドルを変更したバリデーターが扱うメッセージ類は、重複していてもカスタマイズバンドルの`validation.php`に記述しなければならない。

しかし重複コードを書くことは嫌だし、標準のエラーメッセージが変更されたら(そうそうないが)カスタマイズ部のこっちのバンドルまで修正しなければならい。カスタマイズと関係ないのに。
それにカスタマイズしたメッセージがわかりにくくなってしまう。
よって、*カスタマイズバンドルにコピペ以外で`DEFAULT_BUNDLE`のエラーメッセージを取得し、かつカスタマイズエラーメッセージで該当箇所を上書きする*ことを目指した。結果が最初のヤツ。
すごい不本意だけど、良い案が見つかるまではこれで。

## その他

`Lang`クラスに`'laravel.language.loader'`イベントがあるので、これでロード直前に中身を書き換えるイベントを作れるかもしれない。
しかし肝心のメッセージ群にアクセスできない…
`Lang::$lines`に全て格納されているようだが、`protected `だしアクセサー無いし。
今は`DEFAULT_BUNDLE`に全部メッセージを記述しているから無駄なものまでロードしてるし、細分化したらしたで、ルール部のメッセージなんてほぼ共通だからまた重複の問題が発生しそう。ルール部は`Config`行きとかがいいのかな？

`Validator::make()`の第3引数にもメッセージを入れれるのでそこでも行けそうだが、ラップしているベースのバリデーターから第3引数に値を入れる方法が無い…

そもそも運用方法からして間違っているのか…
SSLを加速する方法

オリジナルは[5 easy tips to accelerate SSL](http://unhandledexpression.com/2013/01/25/5-easy-tips-to-accelerate-ssl/)。
主な主張は遅いアルゴリズムをやめよう、というあたり。

Apache+mod_sslならSSLCipherSuite、nginxならssl_ciphersに記述することでアルゴリズムを限定できるので、そこにサーバでの処理が早いものだけを記述することで速度がアップするとのこと。

なんと[Mac Proで暖を取る方法](http://d.hatena.ne.jp/tmatsuu/20140101/1388586426)でアルゴリズム毎の速度が測れる。

CPUによっては[暗号用の命令を使うこと](http://tech.geniee.co.jp/entry/2014/10/03/190000)で加速するらしいので、自分のサーバで測って速い順に使うようにするとよい。
（※RC4は脆弱性があるんで外しとくこと。）

[ネット企業のSSL使用状況を調べている人](http://qiita.com/kuni-nakaji/items/5118b23bf2ea44fed96e)がいた。ありがたや。

尚、AES-NIによるアクセラレートは[OpenSSL 1.0.1以降ならデフォルトでオン](http://openssl.6102.n7.nabble.com/How-can-I-enable-aes-ni-in-openssl-on-Linux-td47582.html)になるそうな。


余談

そもそもopensshでrsa鍵使ってるけどなんでだっけーと思って調べてたらアルゴリズムでSSLの速さ変わんじゃねっていう気がしてきたためググったら出てきた。

尚OpenSSH的には[今現在ED25519が最強](http://jnst.hateblo.jp/entry/2014/12/15/200542)のようです。
jira > コメント欄 > メンション機能

コメント欄に

    @Yamada
のように記載すると、登録済の人のリストが出てくる。選択して決定すると、"山田さん"あてのコメントになるようだ。
メンション機能というものらしい ([Link](https://confluence.atlassian.co.jp/pages/viewpage.action?pageId=30048900))

メンションされた人宛てにメールが届くようだ。
魔鏡歌詞網で歌詞をコピーするためのブックマークレット

##ブックマークレット
```
javascript:(function(d){d.body.oncopy=null;d.getElementById('fsZ').setAttribute('style','');})(document);
```

##魔鏡歌詞網って何？
http://mojim.com/
いわゆる中華歌詞サイトです。

※歌詞の転載は様々な法律に抵触する可能性がありますのでご注意下さい。
rails/info/propertiesに項目を追加する

Rails4ではdevelopment環境のサーバーにlocalhostから /rails/info/properties にアクセスすると以下のように Rails のバージョン等が表示できる。

![Properties.png](https://qiita-image-store.s3.amazonaws.com/0/10618/0a28db77-e703-e521-9b69-4fdc8e879a67.png)

Rails::Info.property を使ってこの項目を追加することができる: 例 config/initializers/expand_rails_info.rb をこの内容で書くと

```rb
Rails.application.config.after_initialize do
  Rails::Info.property "Database Version" do
    ActiveRecord::Base.connection.select_one("SELECT SQLITE_VERSION();").values.first
  end                                                                                                                                                                             
end
```

最後の部分が↓のようになる。

![Properties 2.png](https://qiita-image-store.s3.amazonaws.com/0/10618/cd045e20-67fd-172f-6b43-43473702fb1e.png)

その他まつわる小ネタ

- development 以外でも使いたいよ:  `get 'foo' => 'rails/info#properties'` みたいに自分で routes に追加すれば使えるよ
- localhost 以外でも使いたいよ: `config.consider_all_requests_local` を適切に運用
- 他のControllerやViewの一部に使いたいよ: Rails::Info.to_html とか Rails::Info.to_s とかが使えるかも
Hexoのブログデザインテーマ調べたものまとめ

# **概要**

Hexoのデザインテーマで調べたものメモ。テーマは以下リンクから入手することができます。

* <a href="https://github.com/hexojs/hexo/wiki/Themes" target="_blank">Themes · hexojs/hexo Wiki</a>

# **公式テーマ**

Hexoが公式のテーマとして公開しているものです。

* <a href="http://hexo.io/hexo-theme-landscape/" target="_blank">Landscape</a>
* <a href="http://hexo.io/hexo-theme-phase/" target="_blank">Phase</a>
* <a href="http://hexo.io/hexo-theme-light/" target="_blank">Light</a>


# **シンプルなタイプ**

* <a href="https://github.com/widatama/hexo-jade-barebone" target="_blank">Barebone</a> - <a href="http://widatama.github.io/hexo-jade-barebone/" target="_blank">Demo</a>
* <a href="https://github.com/shulhi/hexo-theme-damnclean" target="_blank">DamnClean</a> - <a href="http://shulhi.github.io/" target="_blank">Demo</a>
* <a href="https://github.com/joyceim/hexo-theme-mnmlpress" target="_blank">mnmlpress</a> - <a href="http://xxxxxly.in/hexo-theme-mnmlpress/" target="_blank">Demo</a> - これのを整えたものを使用しました。

# **1カラム、タンブラーのようなデザイン**

* <a href="https://github.com/moretwo/hexo-theme" target="_blank">Moretwo</a> - <a href="http://moretwo.github.io/" target="_blank">Demo</a>
* <a href="https://github.com/kywk/hexo-theme-casper" target="_blank">Casper</a> - <a href="http://kywk.github.io/hexo-theme-casper/" target="_blank">Demo</a>

# **2カラム、ワードプレスのようなデザイン**

* <a href="https://github.com/xiangming/landscape-plus" target="_blank">Hexo-theme-landscape-plus</a> - <a href="http://jasonxiang.com/landscape-plus/" target="_blank">Demo</a>
* <a href="https://github.com/wuchong/jacman" target="_blank">Jacman</a> - <a href="http://wuchong.me/jacman/" target="_blank">Demo</a>
* <a href="https://github.com/ken8203/hexo-theme-alberta" target="_blank">Alberta</a> - <a href="http://jaychung.tw/" target="_blank">Demo</a>
css脱初心者？ :before :after擬似要素の使い方とか基本的なこと

#:before :after 擬似要素とは


```html:使う前.html
 <ul>
   <li>リストです</li>
 </ul>
```

`:before`や`:after`を使うと

```html:使ったら.html
<!-- イメージです -->
 <ul>
   <li>
     <span>(:before)</span>
     リストです
     <span>(:after)</span>
   </li>
 </ul>
```


このようなhtmlがあるというイメージでcssを書くことが出来るため、デザインの幅がとても広がります。
あくまで**「擬似要素」**であるため、実際に上記のようなhtmlが出力されるわけではありません。

無駄なhtmlが出力されないので、htmlを汚さずにセマンティック？な感じでいけるのもメリットですね。ちなみに:before,:after要素はインライン要素です。


#使い方
(サンプルは:beforeですが、:afterも同様です)

cssで指定することにより使うことが出来ます。

```css:style.css

li:before {
  content: "";
}
```

基本的にはこれだけで使うことが出来ます。

下のは`content:""`を指定したリストの画像です。

![スクリーンショット 2015-03-16 15.48.10.png](https://qiita-image-store.s3.amazonaws.com/0/39292/983c0251-717e-4923-7480-6ba984187c32.png)
(liの中に:beforeという要素があります。ですが、何も表示されていません)

`content` は `使ったら.html`で言えば`<span>(:before)</span>`の中身を指定します。
`content:""`と書いているので中身はなし、つまり`<span> </span>`。中身がない空のインライン要素があるイメージです。なので何も表示されないのが当然ですね。


そのため`content:""`だけで使うことはなく、色々組み合わせて使うことになります。



例えばこんなの(「く」の逆のがbefore要素です)
![スクリーンショット 2015-03-16 15.34.29.png](https://qiita-image-store.s3.amazonaws.com/0/39292/02aa094b-fcb4-124a-9f80-69782ee5a25a.png)

```css:style.css
    li { position:relative; }

    li:before {
      content: "";
      display: block;
      position: absolute;
      top: 8px;
      left: -16px;
      width: 6px;
      height: 6px;
      border-right: 1px solid #555;
      border-bottom: 1px solid #555;
      -webkit-transform: rotate(-45deg);
      transform: rotate(-45deg);
    }
```

これだけ並んでいると、「`content:""`なくてもいけるんじゃね？」と思ってしまいそうですが、`content`は必須です。忘れないで記述しましょう。

逆に言えば、

```css:style.css

li:before {
  content: "";

  /* その他の装飾........   */
}
```

という構造ですので、ふつうのcssが書ければ、簡単に使うことができますね。

擬似要素はインラインなので高さや横幅を指定したいときは`display:"block"`が必要になるところにご注意ください。

意図したものがうまく表示されない時は、`content`を指定していない、`display`を指定していないなどを疑ってみるといいかもしれません。

##一例

contentは擬似要素の中身を指定します。
そのため文字列をいれれば、その文字列が表示されます。便利。

```css:style.css
    li { position: relative; }

    li:before{
      content: '☓☓☓'; /* 自由！ */
      display: block;
      position: absolute;
      top:0;
      left: -40px;
    }
```
![スクリーンショット 2015-03-16 16.01.53.png](https://qiita-image-store.s3.amazonaws.com/0/39292/27af0555-7b96-69ba-99a4-7f8396f3d9fb.png)

あとは色々なサンプルを見たり遊んだりで、引き出しを増やしていきましょう。


##サンプル
[画像を使わずに、CSSのみでリストアイコンを表現したサンプル 10](http://www.nxworld.net/tips/no-image-css-list-icon.html)
[まだまだある！疑似要素と疑似クラスでできること](http://liginc.co.jp/web/html-css/css/23099)


#余談

擬似要素の他に擬似クラスというものがあります。
:beforeや:afterは擬似要素。
aタグなどでよくつかうa:hoverやinput:focusなどが擬似クラスになります。
混同しがちですが、ちゃんと区別して使用したいものです。

css3では、擬似要素と擬似クラスをはっきり区別するために、記述方法が少し変わりました。

```css:style.css

    /* 擬似要素はコロンが2つ！(::before) */
    li::before{
      content: '';
      /* いろいろ */
    }
    
   /* 擬似クラスはコロンが1つ(:hover) */
    a:hover {
      /* いろいろ */
    }
```

css3ということで対応ブラウザの問題もあるようで、コロン2つを使用するかどうかというのは考える必要がありそうですが、覚えておきたいところです。
OctpressからHexoへのブログ移行手順

# **概要**

OctpressからHexoへブログシステムを移行した手順をまとめます。

# **1.Hexoの環境をつくる**

以下の記事を参考にHexoの環境をつくる。

* <a href="http://liginc.co.jp/web/programming/server/104594" target="_blank">所要時間3分!? Github PagesとHEXOで爆速ブログ構築してみよう！ | 株式会社LIG</a>

`hexo deploy -g`をするときにエラーが出てしまったのですが、以下のように設定し直すと解決しました。

* <a href="http://hexo.io/docs/deployment.html" target="_blank">Deployment | Hexo</a>

```bash:_config.yml
# Deployment
## Docs: http://hexo.io/docs/deployment.html
deploy:
  type: git
  repo: github.ioのリポジトリ
  branch: hexo_posts
```

以下を実行。

```bash
# deployerがinstallされていなかった模様
$ npm install hexo-deployer-git --save
```

# **2.記事を移行する**

markdown記事を移行します。

Octpressでのファイル名が、「2014-4-1-title.markdown」のようになっていたので、記事生成のフォーマットを以下のように変更しました。

```bash:_config.yml
# Writing
new_post_name: :year-:month-:day-:title.markdown # File name of new posts
```

また、既存記事のアクセスURLは変えないようにしたかったので、パーマリンクを以下のように変更しました。`:id`は、記事の中で指定します。

```bash:_config.yml
# URL
## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/'
url: http://example.com
root: /
permalink: blog/:year/:month/:day/:id/
permalink_defaults:
```

記事内の変数は以下のように変更されました。増えたものは、id、categoryがtagsに、減ったものは、layoutとcommentsです。

```bash:2015-3-11-ここにタイトルを書く.markdown
title: "ここにタイトルを書く"
date: 2014-03-29 15:04:04 +0900
tags:
- "ブログに紐付けるタグ。"
- "複数指定する場合は"
- "このように書く。"
author: "自分の名前"
id: "URLの末尾となるので英語が好ましい"
---
以下にMarkdown形式でブログ内容を書いていく。
```


# **3.その他**

## a.Sitemap

<a href="https://github.com/hexojs/hexo-generator-sitemap" target="_blank">こちら</a>のプラグインで生成。

## b.シェアボタン

<a href="http://hexo.io/docs/variables.html" target="_blank">こちら</a>の変数を見ながらパーシャルを作成。

## c.デザイン

デザインテーマを決める。

* <a href="http://qiita.com/okmttdhr/items/9f087e0dc88e4d3724fb" target="_blank">Hexoのブログデザインテーマ調べたものまとめ - Qiita</a>
MySQL 5.6(Oracle版)にアップデートしたら、datetimeのInsertで怒られた

![]http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150121/20150121182146.jpg)

Ubuntu 14.04LTSを、MySQL 5.6(Oracle版)にアップデートしたら、datetimeのInsertで怒られた! その対処法。

なんか、「ALLOW_INVALID_DATES」って、いうのがキーワードらしいんですが、PHPソースを直すことにより対応。

```php
// $date = "Tue, 20 Jan 2015 12:20:53 +0900"
// $sdate = "2013-08-25T17:00:00+00:00"
$tpdate = new DateTime($date);
$sdate = $tpdate->format('Y-m-d\TH:i:s');
```

こんな感じらしい。じゃ!
パスワードとパスワード確認をValidationでやる方法

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20141226/20141226092442.jpg)

はじめまして、[FuelPHP](http://fuelphp.com/) 初心者のMakotoです。以前、[CodeIgniter](http://codeigniter.jp/) を利用していましたが、会社の方針で FuelPHP を使うことになりました。

MVCの構造等は、ある程度理解しているので苦労はなかったのですが、Validation部分ではまったので、そのメモを書いておきます。

### FuelPHPでパスワードとパスワード確認をValidationでやる方法

[FuelPHPのValidationにクロージャを使う - Qiita](http://qiita.com/ya-sasaki/items/ae7a1e6814e53da6df3f) を参考に、組みました。たぶん、こんな形で良いんだよね!?

```php

$val = Validation::forge();

$password = Input::post('password');
$confirm_password = Input::post('confirm_password');

$val->add('password', 'パスワード')
	->add_rule('trim')
	->add_rule('required')
	->add_rule('min_length', 8)
	->add_rule('max_length', 16)
	->add_rule(
		function($password) use ($confirm_password) {
			if ($password === $confirm_password) {
				return true;
			} else {
				Validation::active()->set_message('closure', 'パスワードと確認の値が異なりました。');
				return false;
			}
		});
```

検索したけど、結構出てこない感じだったので貼っておきます。

参考になればー!
メモ：ActionbarActivityでmenuItemsを追加

自分用のメモです。多分参考にならないです。以前Fragmentで書きましたが、ActionBarActivityで探している方が入れば

xmlはこれ

```
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">


    <item
        android:id="@+id/menu_share"
        android:icon="@drawable/ic_share"
        android:title="Share"
        app:showAsAction="always"/>

    <item
        android:id="@+id/menu_add"
        android:icon="@drawable/ic_add_white_24dp"
        app:showAsAction="ifRoom"
        android:title="@string/add"/>
</menu>
```


java

```
public class YOUR_CLASS extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.YOUR_main);
        getSupportActionBar().setHomeButtonEnabled(true);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        finish();
        return super.onOptionsItemSelected(item);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }
```


onCreateOptionsMenuで追加する。とりあえずこれで表示はできる。
libcloudを使用しないでGoogleComputeEngineのDynamicInventoryScriptを使ってみる

# 環境
- OSX 10.10.2 (Yosemite)
- Python 2.7.9 (OSXにデフォルトインストールされてるPython)

# 必要なライブラリのインストール

※ 自分の環境ではこれを入れないと動かなかった

```console
$ brew install gmp
$ sudo pip install pycrypto
```

# インベントリスクリプトとiniを取得

```console
$ wget https://github.com/ansible/ansible/blob/devel/plugins/inventory/gce.ini -P ~/.ansible
$ wget https://raw.githubusercontent.com/ansible/ansible/devel/plugins/inventory/gce.py -P ~/.ansible
$ chmod 755 ~/.ansible/gce.py
```

# `gce.ini`に設定を記述(`libcloud`を使わない)

```ini
#!/usr/bin/python
# Copyright 2013 Google Inc.
#
# This file is part of Ansible
#

...

[gce]
# GCE Service Account configuration information can be stored in the
# libcloud 'secrets.py' file.  Ideally, the 'secrets.py' file will already
# exist in your PYTHONPATH and be picked up automatically with an import
# statement in the inventory script.  However, you can specify an absolute
# path to the secrets.py file with 'libcloud_secrets' parameter.
libcloud_secrets = 

# If you are not going to use a 'secrets.py' file, you can set the necessary
# authorization parameters here.
gce_service_account_email_address = example@developer.gserviceaccount.com
gce_service_account_pem_file_path = ~/.ansible/example.pem
gce_project_id = example-test-12345
```

# 動作確認

```console
$ ~/.ansible/gce.py | jq .

{
  "tag_http-server": [
    "example"
  ],
  "asia-east1-a": [
    "example"
  ],
  "f1-micro": [
    "example"
  ],
  "status_running": [
    "example"
  ],
  "persistent_disk": [
    "example"
  ],
  "network_default": [
    "example"
  ],
  "_meta": {
    "hostvars": {
      "example": {
        "gce_uuid": "aaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "gce_public_ip": "000.000.000.000",
        "ansible_ssh_host": "000.000.000.000",
        "gce_private_ip": "00.000.00.0",
        "gce_id": "aaaaaaaaaaaaaaaaaaaa",
        "gce_image": null,
        "gce_description": null,
        "gce_machine_type": "f1-micro",
        "gce_tags": [
          "http-server"
        ],
        "gce_name": "example",
        "gce_zone": "asia-east1-a",
        "gce_status": "RUNNING",
        "gce_network": "default",
        "gce_metadata": {
          "os": "example"
        }
      }
    }
  }
}
```
ネットワークインターフェイスを追加しても!?

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150127/20150127172341.png)

[UbuntuServer - Ubuntuでネットワーク設定の変更をする - Qiita](http://qiita.com/norami_dream/items/e238562a9560b9e2bab2)

ほぼ、ここに書かれているんだけど、設定してもエラーが。

> RTNETLINK answers: File exists<br />Failed to bring up eth1.

こうなったら、

> ip addr flush dev eth1

って、やれば解決する!
ネットワークの蹴り出し?が遅い場合

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150128/20150128105439.jpg)

いま、Ubuntu 14.04TLSで、サーバを構築しています。いままで、WebProxy として、squid3 を利用していたのですが、StartSSLの証明書+nginxで、正しく接続できないため、polipo に乗り換えました。ただ、なんかネットワーク接続時の蹴り出し?が遅い...(蹴り出しって言わないかな?初速?接続時?バッファリング時?)

## こうすると、良いらしい!

/etc/hosts のip6が入っている行をすべてコメントアウトする。(後ろ向きー:-P)

```bash

127.0.0.1 localhost
***.***.***.*** hoge
# The following lines are desirable for IPv6 capable hosts
#::1 localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
```

次に、/etc/sysctl.conf に以下の行を追加する。

```bash

net.core.rmem_default = 524288
net.core.rmem_max = 524288
net.core.wmem_default = 524288
net.core.wmem_max = 524288
net.ipv4.tcp_wmem = 4096 87380 524288
net.ipv4.tcp_rmem = 4096 87380 524288
net.ipv4.tcp_mem = 524288 524288 524288
net.ipv4.tcp_rfc1337 = 1
net.ipv4.ip_no_pmtu_disc = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_ecn = 0
net.ipv4.route.flush = 1
```

最後に、sudo sysctl -p する。以上!

実際に設定してみると、かなり接続は速くなった感じ。気のせいかも知れませんがw
squid3(caching proxy)で、送信される情報を出来るだけ隠蔽する方法

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150212/20150212093716.png)

### はじめに

プロキシサーバーの設定次第で、相手のページにアクセスすると、以下の様な情報が送信されます。

* X-FORWARDED-FOR：大元のIPアドレスが入ったりする
* Via：中継したソフトやプロトコルが記録される
* Cache-Control：キャッシュに関する内容が記述される

サイトによっては、これらの情報から制限を加えたりする事もあるので、隠蔽しましょう。

#### 準備

* squid3 が対象です。

#### 設定

Ubuntu 14.04TLSの場合、設定ファイルは以下の場所にあります。

```bash
/etc/squid3/squid3.conf
```

何かで開いて、適当な場所に書き込みます。

```bash
visible_hostname unkown
forwarded_for off
request_header_access X-FORWARDED-FOR deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
```

保存して、デーモンを再起動させる。

```bash
service squid3 restart
```

#### 確認

[診断くん Ver 0.90 beta3](http://taruo.net/e/) で、

> 総合評価:?(A 以上 or 生 IP。下記参照)

と出れば、大丈夫です。
おっちょこちょいだから、"さくらのVPS"の各種バリエーションを借りたので、UNIX BENCHしてみる

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150224/20150224141229.jpg)

個人運用なのに、最終的に6台借りました～(^^)/ さくらインターネットの良いお客さん >俺。まあ、さくらインターネット好きだから、良いんだけどさ～

で、サーバの統廃合をしたので、4月からは1台(さくらのVPS SSD 4G/東京第2リージョン)のみになります。

#### ベンチ条件

全てのサーバは、Ubuntu 14.04LTS がインストールされています。Apache/MySQL等も動いていますが、サービスがヘボイので誤差の範囲です。

#### エントリー確認

* 初号機: さくらのVPS 2G 3core HDD v3(第三世代) 大阪リージョン
* でべ鯖: さくらのVPS 2G 3core HDD v4(第四世代) 東京第2リージョン
* ふろと: さくらのVPS 1G 2core SSD v4(第四世代) 東京第2リージョン
* マスタ: さくらのVPS 4G 4core SSD v4(第四世代) 東京第2リージョン

以上です。

#### インストール

```bash
$ wget https://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
$ tar xvfz UnixBench5.1.3.tgz
$ cd UnixBench/
$ make
$ ./Run
```

起動するとドーンと出ます!笑

        #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
        #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
        #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
        #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
        #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
         ####   #    #  #  #    #          #####   ######  #    #   ####   #    #
     
        Version 5.1.3                      Based on the Byte Magazine Unix Benchmark
     
        Multi-CPU version                  Version 5 revisions by Ian Smith,
                                           Sunnyvale, CA, USA
        January 13, 2011                   johantheghost at yahoo period com

#### ベンチが終わらないから、だらだら書いてみる

既に、v3/v4のベンチは済んでいるようですが、基本的に金額が同じな v3 と v4 でどこまでパフォーマンスが違うのか？積極的に乗り換えるべきなのか！や、v4 と言っているが、東京第2リージョンのHDD機と、SSD機では違いがあるのでは!?等の検証が出来れば良いと思います。

#### 結果発表

* 初号機: 806.4(1core)  / 2122.3(3core)
* でべ鯖: 1151.8(1core) / 2457.7(3core)
* ふろと: 1304.1(1core) / 2077.1(2core)
* マスタ: 1610.7(1core) / 3176.0(4core)

マスタは、4コア+SSDなのでかなり高速です。高いだけのことはある!笑。初号機(v3)とでべ鯖(v4)対決ですが、少し差が出ました。同居VPSの使用率の差があるのか、足回り鯖のスペックの違いか。そういう意味で、ふろと(1G)SSDは、保存容量が30GBと少ない点を考慮して、俺が目指したようなフロント周りとして、使うのであればありかもね。約1000円/月だし。

バカみたいな負荷が掛かるブログなどを構築しないのであれば、さくらのVPS 2G 3core v4(第四世代) 東京第2リージョンのSSD機がベストバイっぽい。画像40GB以上載せるなら、画像は他のサービスと連携する事をお勧めするよ。

#### ベンチ生データ

* [sakura_vps_unixbench.tar.gz](https://drive.google.com/a/dive-in.to/file/d/0B5mIHINV9TixTThYSm84Q0NRUlE/view?usp=sharing)
* [sakura_vps_unixbench.zip](https://drive.google.com/a/dive-in.to/file/d/0B5mIHINV9TixTUVyRW54THBsN3c/view?usp=sharing)

UTF-8形式のテキストファイルだけど、ファイル名も日本語なので、環境によっては化けるかも! ご利用は計画的に!笑

#### ちなみに...(全然関係ないネタ)

Markdownの場合、ソース等は先頭から4文字の半角スペースをいれると良いらしい!じゃ!
《iOS》AdMobSDKでメディエーションが上手く行かなかった話【バナー】



iOSでAdmobSDKを実装したものの国内の特定のアドネットワークだけ上手く表示されなかったりして困っていました。
それでいろいろテストしてみたらAdmobの特徴がすこしわかった話。

当初の実装(AdmobのSDKは6.12.2とすこし古めです)

```ObjectiveC:RootViewController
GADBannerView* banner = [[GADBannerView alloc] initWithAdSize: GADAdSizeFullWidthPortraitWithHeight(GAD_SIZE_320x50.height)];
```

これだと一部のアドネットワークの広告が表示されないようで困っていたのでとりあえず

```ObjectiveC:RootViewController:RootViewController.mm
GADBannerView* banner = [[GADBannerView alloc]init];
```

とサイズを指定せずに実装。しかしこれだと次のようなエラーが発生します。

```terminal:
 "Request Error: No ads to show"
```
Admobは<font color="red">サイズを適切に設定してやらないと表示されない</font>という特徴がありました。

iOS SDK7.0.0(2015年3月時点で最新版)では先ほどの

```ObjectiveC:
GADAdSizeFullWidthPortraitWithHeight(GAD_SIZE_320x50.height)
```

のメソッドは消されていてDeprecatedなメソッドだったぽいので次のように書き換えたら上手くいきました。

```ObjectiveC:RootViewController
GADBannerView* banner = [[GADBannerView alloc] initWithAdSize:kGADSizeBanner];

// iPadならkGADSizeFullBannerになります。
```

アドネットワーク各社さんにご迷惑をおかけしてしまいましたが、AdmobのSDKにはこのような特徴があるため
適切なサイズの設定をしてあげなければなりません。

次のパターンにはまったらこの解決法で上手くいくかもしれません
・AdUnitID設定したのに表示されない
・アドネットワークの設定が適切なのに表示されない
・ちゃんとViewControllerにaddSubViewしてRequest出してるのに表示されない



 [追記 2015/03/24]
<font color="red">iAdについて</font>
iAdはデフォルトでスマートバナーといって

```ObjectiveC:
GADAdSizeFullWidthPortraitWithHeight(GAD_SIZE_320x50.height)
```
のサイズでバナーを表示しようとするためサイズが見切れてしまうという現象が起こってしまいます。
通常のkGADAdSizeBannerだと(320 x 50)のサイズになってしまうためです。
したがってメディエーションについてはiAdはお勧めしません。onDidReceivedAd(delegateイベント)で
iAdの場合だけハンドリングしてうまくやれる方法があればいいのですが.....
"Zabbixでの障害通知マクロのまとめ"をDashドキュメント化しました


昨年投稿した[Zabbixでの障害通知マクロのまとめ](http://qiita.com/AH_korikori/items/9350f94676cfcb7e734a)ですが、
現在でもストックして頂けており、作った甲斐があったかな？と思うところです。

今回、MacOSXで無料利用できる[Dash](http://kapeli.com/dash)というアプリで、
マクロを確認できるようDash版を作成しました。

一々、Qiitaにアクセスして記事を確認したりと面倒だなと思っていたのがきっかけです。

よろしければご活用いただけましたら幸いです。

## どこにあるの？

Github レポジトリにあります。
[zbx-macrodoc-ja-docset](https://github.com/koricori/zbx-macrodoc-ja-docset)

※ Dash > Preferences > Docsets から zbx-macrodoc-ja.docset を追加して下さい。

## 謝辞

* [Generating Dash Docsets](http://kapeli.com/docsets)
* [Dashに自作Docsetを用意する](http://ameblo.jp/toki917/entry-11847834153.html)

上記サイトを参考にさせて頂きました！
メモリをリフレッシュさせたい! 

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150306/20150306143023.jpg)

topで、CPU/メモリの推移を見ていたら、なんかusedが多い!? なら、リフレッシュしてみよう!

rootで、コマンド一発!

```bash
sync ; echo 3 > /proc/sys/vm/drop_caches
```

スッキリスッキリ!
[f14s.pw/連動企画] いま一番ツイートされているアプリは何だ!ベスト25[検証]

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150303/20150303162957.png)

と言うわけで、

[FavoritesFollows(f14s.pw)](http://f14s.pw) の連動企画として、素朴な疑問だった

#### Twitterクライアントって、何が使われているんだろ～

を計測してみました。全ツイートから判断すると、いまいち焦点がぶれるので、「ミラン」「ユベントス」など[FavoritesFollows(f14s.pw)](http://f14s.pw) でフォローしている13チーム(13ワード)を対象に、30分間隔で検索をおこない、Twitterの制限である25件のつぶやきから、データを引き抜きました。FuelPHPで実装。cron回し。集計期間は約1日(2015/03/02-03)です。

##### 結果は!

* [Twitter for iPhone](http://twitter.com/download/iphone)の圧勝。標準クライアント強し!しかし、この標準クライアント...使いやすい!?
* 2位に人気ボッド [twittbot.net](http://twittbot.net/)が入りました。
* 3/4位が、標準クライアントのAndroid版
* 5位に、[Twitter Web Client](http://twitter.com) Web版ですねー
* 6位に、いま話題の[IFTTT](http://ifttt.com)!IFTTTは少し使ったけど設定も簡単。UNIX(Linux)のパイプ機能をWebサービスで再現したようなサービスで、ますます人気になりそう。

って感じでしょうか。12位に我が[FavoritesFollows](http://f14s.pw)もランクイン。欧州サッカーボットとしては、網羅性では最大級なのかな!?

##### 詳細データ

1. 4279 : [Twitter for iPhone](http://twitter.com/download/iphone)
2. 2029 : [twittbot.net](http://twittbot.net/)
3. 1706 : [Twitter for Android Tablets](https://twitter.com/download/android)
4. 1660 : [Twitter for Android](http://twitter.com/download/android)
5. 1324 : [Twitter Web Client](http://twitter.com)
6. 778 : [IFTTT](http://ifttt.com)
7. 509 : [dlvr.it](http://dlvr.it)
8. 421 : [twitterfeed](http://twitterfeed.com)
9. 220 : [ちゅうアンテナ](http://chuantena.com)
10. 210 : [twicca](http://twicca.r246.jp)
11. 171 : [dj7 設定6  試し](https://twitter.com)
12. 168 : [FavoritesFollows](http://f14s.pw)
13. 167 : [TheWorld for iOS　](http://theworld09.com)
14. 152 : [niconico iOSアプリ](http://www.nicovideo.jp)
15. 147 : [iOS](http://www.apple.com)
16. 146 : [Tweetbot for iΟS](http://tapbots.com/tweetbot)
17. 137 : [Twitter for iPad](http://twitter.com/#!/download/ipad)
18. 121 : [Yabee](http://yabee.in)
19. 116 : [feather for iOS](http://covelline.com/feather/)
20. 115 : [twiroboJP](http://twirobo.com/)
21. 113 : [idolhotnewsv2](http://idolhotnews.com)
22. 112 : [TheWorld iOS](http://theworld09.com)
23. 104 : [おコメモbot](http://makebot.sh)
24. 103 : [kensan555](http://goal555.info/)
25. 103 : [TheWorld for iOS](https://twitter.com/TheWorld_JP)

なかなか、興味深いデータだな。じゃ!
simplexml_load_string のエラーハンドリングを一生懸命やる! [try{}cacheで取れないなんて、反則だ!]

<img class="hatena-fotolife" title="f:id:makoto1899:20150206143758j:plain" src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150206/20150206143758.jpg" alt="f:id:makoto1899:20150206143758j:plain" />

[FavoritesFollows(f14s.pw)](http://f14s.pw/) で、ハマっていた simplexml_load_string のエラーハンドリング。最終的に、取得使用としていたRSSが、UTF-16 だったりと散々な結果に。一応、はてな なので相談をして、とりあえず動くものが出来たので、ソースを晒しておきます。

```php
function getXmlData($rss_url = NULL) {
    set_error_handler(function($errno, $errstr, $errfile, $errline) {  
        throw new Exception($errstr, $errno);  
    });  

    try {
        $search = array("\0", "\x01", "\x02", "\x03", "\x04", "\x05","\x06", "\x07", "\x08", "\x0b", "\x0c", "\x0e", "\x0f");

        $options = array(
            'http' => array(
            'method' => 'GET',
            'header' => 'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.94 Safari/537.36',
            ),
        );
        $context = stream_context_create($options);
        $xml_context = file_get_contents($rss_url, false, $context);
        $xml_context = str_replace($search, '', $xml_context);  

        if (mb_detect_encoding($xml_context, 'UTF-8', true) === false) { 
            $xml_context = utf8_encode($xml_context); 
        }

        if (strpos($xml_context, '<?xml', 0) === false){
            echo "×:Error:". $rss_url . "\n";
            return false;
        }

        $xml = simplexml_load_string($xml_context);

        if ($xml === false) {
            echo "Failed loading XML\n";
            foreach(libxml_get_errors() as $error) {
                echo "\t", $error->message;
            }
            return false;
        }
        restore_error_handler();
    } catch (Exception $ex) {
        restore_error_handler();  
        echo "×:Exception". $ex . "\n";  
        echo "×:Error:". $rss_url . "\n";
        return false;
    }

    return $xml;
}
```

ネットぐるぐるしまくって、いろいろな対策を施したソースなので、大抵のXMLはエラーにならないと思います。自己責任でどうぞ。
Cocoapodsと__has_includeのマクロが相性よくなさそう

AppDelegateなどで、
__has_includeを使ったマクロを書いていたとします。
MyFacebookToolsは、FacebookSDKを使って色々やっているクラスだと思ってください。

```
#if __has_include(<FacebookSDK/FacebookSDK.h>)
#import "MyFacebookTools.h"
#endif
```

システムテストの時だけFaecebookSDKが必要になる予定だったので、
Podfileを以下のようにします。

```
platform :ios, '6.0'

target :MyUnitTest do
    pod 'GHUnit', '~> 0.5.9'
    pod 'MyCustomFramework', :path => '../MyCustomFramework'
end

target :MySystemTest do
    pod 'GHUnit', '~> 0.5.9'
    pod 'Facebook-iOS-SDK', '~> 3.23'
    pod 'MyCustomFramework', :path => '../MyCustomFramework'
end

```

これでpod installをしてMyUnitTestのターゲットをビルドすると、
MyFacebookToolsクラスがFacebookSDKのクラスを参照しているけど
Facebook SDKがないよ的なLinker errorが出てきます。。。

そこでPodfileを編集してシステムテストのターゲットをコメントアウトします。

```
platform :ios, '6.0'

target :MyUnitTest do
    pod 'GHUnit', '~> 0.5.9'
    pod 'MyCustomFramework', :path => '../MyCustomFramework'
end

#target :MySystemTest do
#    pod 'GHUnit', '~> 0.5.9'
#    pod 'Facebook-iOS-SDK', '~> 3.23'
#    pod 'MyCustomFramework', :path => '../MyCustomFramework'
#end

```

するとエラーが消えました！
他のターゲットで読み込んだpodも影響してしまうようです。。。

同じような症状のissueがOpenのままだったので、対応中なのかもしれません。

[Per-configuration pods don't work with __has_include()](https://github.com/CocoaPods/CocoaPods/issues/2774)
Ubuntu14.04TLSで、MySQL 5.5から5.6(Oracle版)にアップデートしたら、FuelPHPでエラーが出た時の対処法

![](http://cdn-ak.f.st-hatena.com/images/fotolife/m/makoto1899/20150120/20150120133909.jpg)

```bash
Fuel\Core\Database_Exception [ Warning ]:
mysqli::mysqli(): Headers and client library minor version mismatch. Headers:50540 Library:50622
```

がーん。Ubuntu 14.04TLSで、MySQL 5.5から5.6(Oracle版)にアップデートしたら、FuelPHP1.7.xでエラーが出た。とりあえず、PHP(コマンドライン)や、phpmyadmin は動くようだ。
[f14s.pw](http://favoritesfollows.h7i.jp/) はバリバリFuelPHPで書かれているサイトなので、動かないのは困る。調べてみた。</p>

[mysql_connect can not work in remote server in stead of local server](http://stackoverflow.com/questions/24709172/mysql-connect-can-not-work-in-remote-server-in-stead-of-local-server)

ここによると、php5-mysqlnd を入れろ!と。入れてあるんだけどな～。

```bash
/etc/php5/apache2/conf.d
```

を眺める。ほほー mysql.ini と mysqli.ini と mysqlnd.ini を読み込んでいる様だ。シンボリックリンクなので、サクッと削除しても良いけど、なにか起こると怖いので、元ディレクトリに移動

```bash
/etc/php5/mods-available
```
mysqlnd.ini を読み込ませるなら、mysql.ini も mysqli.ini も要らないのかな!? と、2つのファイルで、こんな感じで書かれている部分をコメントアウトする。

```bash
#extension=mysql.so
```

Apache2再起動

```bash
service apache2 restart
```

[f14s.pw](http://favoritesfollows.h7i.jp/) にブラウザでアクセス。「mysqli がねーよ！」っていうエラーが。mysqli は必要らしい。extension=mysqli.so のコメントアウトを消す。Apache2再起動。

**動いたー!!**

なんか、mysql.so と mysqlnd.so がバッティングするらしい!? だから、mysql.so をコメントアウトするっと。とりあえず、動いて良かったわ。またねー
ShinobiLayer: SoftLayer Object Storageの制約

# はじめに
SoftLayer object storageはOpenStack Swiftベースで構成されているのですが、現在色々な制約があります。簡単にまとめてみましょう、というのがこの記事の目的です。

# 20MB問題(SoftLayerのCustomer Portalの制約)
SoftLayerのCustomer Portal経由では、実は20MB以上のファイルをupload/downloadできません。この制約はKnowledgeLayerにも記載があります。
http://knowledgelayer.softlayer.com/procedure/add-object-file
http://knowledgelayer.softlayer.com/procedure/add-file-folder-or-container
![objectstorage03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c9c2f741-1158-7e52-2b9e-78a86dff8f1b.jpeg)

# 5GB問題(OpenStack Swiftの制約)
REST APIを使えば20MB以上のファイルを送ることはできるのですが、OpenStack Swiftは5GB以上のファイルを扱えないため、5GB以下に分割して送付するなどの仕組みが別途必要になります。一番簡単なのは、python-swiftやCyberduckのような専用ツールを使用することです。

# その他の制約
以下は、[python-swift](https://github.com/openstack/python-swiftclient)を使って取得した東京DCのSoftLayer OpenStack swiftの設定情報になります。
例えば、

* OpenStack swiftのバージョンが2.7.0.post10. https://github.com/openstack/swift/blob/master/CHANGELOG によると、Mitakaのようです。
* max_file_sizeで上記の1ファイルサイズあたり5GBの制約が設定されている。
* SLO(Static Large Object)使用時に、max_manifest_segmentsで1000分割までに制限されている。

などを確認することができます。

```text:2016/07/12更新
# swift capabilities
Core: swift
 Options:
  account_autocreate: True
  account_listing_limit: 10000
  allow_account_management: True
  container_listing_limit: 10000
  extra_header_count: 0
  max_account_name_length: 256
  max_container_name_length: 256
  max_file_size: 5368709122
  max_header_size: 8192
  max_meta_count: 90
  max_meta_name_length: 128
  max_meta_overall_size: 4096
  max_meta_value_length: 256
  max_object_name_length: 1024
  policies: [{'default': True, 'name': 'standard', 'aliases': 'standard'}]
  strict_cors_mode: True
  valid_api_versions: ['v1', 'v1.0']
  version: 2.7.0.post10
Additional middleware: account_quotas
Additional middleware: bulk_delete
 Options:
  max_deletes_per_request: 10000
  max_failed_deletes: 1000
Additional middleware: bulk_upload
 Options:
  max_containers_per_extraction: 10000
  max_failed_extractions: 1000
Additional middleware: container_quotas
Additional middleware: formpost
Additional middleware: slo
 Options:
  max_manifest_segments: 1000
  max_manifest_size: 2097152
  min_segment_size: 1
Additional middleware: staticweb
Additional middleware: tempurl
 Options:
  incoming_allow_headers: []
  incoming_remove_headers: ['x-timestamp']
  methods: ['GET', 'HEAD', 'PUT', 'POST', 'DELETE']
  outgoing_allow_headers: ['x-object-meta-public-*']
  outgoing_remove_headers: ['x-object-meta-*']
Additional middleware: versioned_writes
```
文字を書くアニメーション

![ss.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/3063/45731de6-e359-d863-615f-6ad5ecdff263.gif)


こういうの。
HTMLページ上で実現しようとした時に、フォントとか筆順とかあってプログラムに落とすのが難しかった。すぐに思いつくのだと、

* GIFアニメーション
* 動画

だが、ファイルサイズが大きくなったり、モバイルで自動再生できなかったりする。
パラパラ漫画方式が落とし所な気がするので手順をメモしておく。

# 文字を書く

Photoshopをおもむろに開いて、適当なサイズの画像を作成して、好きなフォントで文字を書く。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/3063/95761685-e03b-7265-8958-b834287e0d9b.png)

# ラスタライズする

レイヤーを右クリックしてラスタライズ。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/3063/4be36079-6e80-13b5-fc7e-706a8542cb7c.png)


# 消しゴムツールでちょっとずつ消しては保存していく

![3.png](https://qiita-image-store.s3.amazonaws.com/0/3063/ee1e3e94-db69-4a36-af7c-571b9e9e5c2e.png)

こんな感じにする。

![20150316130556.png](https://qiita-image-store.s3.amazonaws.com/0/3063/eba311ab-ae4e-acc4-67d2-d39b75c6d5e6.png)

# 画像をくっつける

ImageMagickでも使ってくっつける。
画像を保存したディレクトリで以下を実行。

```
ruby -e 'command="convert +append"; Dir.glob("*.png").reverse.each do |f| command<<" #{f}" end; system "#{command} out.png"'
```

out.pngという画像ができる。

![20150316131045.png](https://qiita-image-store.s3.amazonaws.com/0/3063/dde3b217-42a2-56e1-94d2-50c325d12675.png)


# HTMLに組み込む。

あとは、これを背景画像にして、```backgroud-position```を変えていくだけ。

https://jsfiddle.net/6xkdor8n/4/embedded/result/


※ブラウザが読み込める画像サイズの上限に注意
https://developer.apple.com/library/safari/documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html#//apple_ref/doc/uid/TP40006482-SW15
AOSPの一部をAndroid NDKだけでビルドする

ノートマシンなどではAOSPを全部持ってくるとディスク容量が厳しいので、一部のツールやライブラリをAndroid NDKだけでビルドしたいなーと思っていました。今回少しだけ試行錯誤してみたので、その結果を記録しておきます。

## external/netcat

```
$ git clone https://android.googlesource.com/platform/external/netcat
$ cd netcat
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi TARGET_PLATFORM=android-18
```

運が良ければ上のようにmake変数を指定すればビルドできるでしょう。

ビルドが成功すると、`obj/local/armeabi/`以下にバイナリとオブジェクトファイルができます。他のアーキテクチャ用のバイナリも同様に作成できます。

## external/bzip2

少しの修正でビルドできるパターン。

```
$ git clone https://android.googlesource.com/platform/external/bzip2
$ cd bzip2
$ ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk APP_ABI=armeabi TARGET_PLATFORM=android-18
Android.mk:46: /Users/hnw/Development/android-ndk-r9/build/core/build-host-static-library.mk: No such file or directory
make: *** No rule to make target `/Users/hnw/Development/android-ndk-r9/build/core/build-host-static-library.mk'.  Stop.
$
```

AOSPではホスト用のバイナリも生成できますが、Android NDKではホスト環境むけのビルドはサポートしていないためにエラーが出ています（参照：[cannot find 'build-host-static-library.mk' - Google グループ](https://groups.google.com/forum/#!topic/android-ndk/uA0AH3jE8u8)）。Android.mkを下記のようにコメントアウトすればターゲット用のライブラリだけをビルドできます。

```
# include $(BUILD_HOST_STATIC_LIBRARY)
```

## external/strace

厄介なパターンもあります。straceを同様にビルドしようとすると失敗します。

```
Compile thumb  : strace <= access.c
Compile thumb  : strace <= affinity.c
Compile thumb  : strace <= aio.c
./aio.c: In function 'sys_io_submit':
./aio.c:193:3: warning: #warning "libaio.h is not available => no io_submit decoding" [-Wcpp]
Compile thumb  : strace <= bjm.c
./bjm.c:37:22: fatal error: sys/user.h: No such file or directory
compilation terminated.
make: *** [obj/local/armeabi/objs/strace/bjm.o] Error 1
```

sys/user.hはAndroid NDKには含まれていないためビルドを継続できません。一方でAOSPではbionic/libc/include/sys/user.hが存在するため、正しくビルドできます。


Android NDKを真面目に更新して欲しいと思うのは僕だけなんですかね…。
SSL証明書 秘密鍵(private-key)と証明書(certificate)がペアとなっている確認

SSL証明書のprivate-key(rsa)とcertificateのペアが正しいことを検証する。
証明書を購入した後、チェックする用。

```bash
diff \
  <(openssl rsa  -noout -modulus -in server.key) \
  <(openssl x509 -noout -modulus -in server.crt) 
```

差異が無ければ一致している。
SwiftのテスティングフレームワークQuickを使ってみる


## インストール
cocoapods 0.36からSwiftをサポートしたので、Quickをcocoapodsでインストールできる。

NimbleはQuickで使うマッチャ。最新は0.4だったけど、Swift 1.2じゃないと、使えないようなので、今回は0.3を選択。

```Podfile
platform :ios, '8.1'
use_frameworks!

target 'Sample' do

end

target 'SampleTests' do
  pod 'Quick'
  pod 'Nimble', '0.3.0'
end
```

インストール。

```
pod install
```

## テストを書いてみる

__テストされる方__

```Giocatore.swift
public class Giocatore {
    let name: String!
    
    public init(name: String) {
        self.name     = name
    }
    
    public func showName() -> String {
        return "My name is \(self.name)"
    }
}
```

__テストする方__
ディレクトリSampleTests以下に適当に`GiocatoreSpec.swift`を作成する。

```GiocatoreSpec.swift
import Foundation
import Quick
import Nimble
import Sample

class GiocatoreSpec: QuickSpec {
    override func spec() {
        describe("サッカー選手") {
            it("名前") {
                let name = "Inzaghi"
                let pippo = Giocatore(name: name)
                
                expect(pippo.showName()).to(equal("My name is \(name)"))
            }
        }
    }
}
```

テスト実行は`Command` + `U`

## 参照
* [SwiftのテストフレームワークQuickをインストール](http://starzero.hatenablog.com/entry/2015/01/24/131406 'SwiftのテストフレームワークQuickをインストール')
Macアプリ

---

## Mac app

- alfred 2
- wunderlist
- coda
- atom
- echo
- karabinder
- kobito
- evernote
- iTerm
- TitaniumStudio
- xcode
- AppCleaner
- Sequel Pro
- keynote
- chrome
- dash
- android studio
- slack
- pushbullet
- 1password
- Phpstome
- SwordSoft Layout
- Pocket
- CopyClip
- Scapple
- Site sucker
- Dropbox
- Thunderbird
- VirtialVox
- Popclip
- Yoink
- tree
- find My mouse

## cli app

- nvm
- git
- homebrew
- homebrew-cask
- tree
- ionic
- gulp
- aws-cli
- ansible
- vagrant
略語 > emacs > EOB > End of Buffer?


[こちら](https://github.com/emacs-mirror/emacs/commit/4e5eb85425214d62cd3962914565b281b74504ce)のgithubのコミットメッセージにEOBというのが書かれているが、EOBの意味がよくわからなかった。


[こちら](http://www.emacswiki.org/emacs/HighlightEndOfBuffer)をみると、どうもEnd Of Bufferの意味のようだ。
Androidでアプリがバックグラウンドに回った時とフォアグラウンドに戻った時のイベント取得方法


AndroidはiOSのようにホームボタンなどでアプリがバックグラウンドに行った時のイベントが取れません。

### iOSでバックグラウンドとフォアグラウンドのイベント取得の仕方

**アプリが非アクティブになりバックグランド実行になった際に呼び出される**

```objectivec:
- (void)applicationDidEnterBackground:(UIApplication *)application
```

**バックグラウンドから起動された場合**

```objectivec:
- (void)applicationWillEnterForeground:(UIApplication *)application
```

### Androidの場合
以下のメソッドをActivityでオーバーライドすれば、ホームボタンを押した時のイベントを検知できますが、
電話が来た時とかなどはここに入ってこないようです。
Activityの遷移時などでも呼ばれてしまうようなので、工夫すればなんとかなりそうです。
あと、バックボタンでは検知されないようです。

```android:
	@Override
	public void onUserLeaveHint(){}
	
```

[参照]
* [Android開発 ホームボタン押下やアプリ切り替わりを検知する](http://blog.livedoor.jp/tattyamm/archives/3640900.html)
* [Y.A.M の 雑記帳: Android　Home キーが押されたことを検知する。] (http://y-anz-m.blogspot.jp/2010/10/androidhome.html)


### 電話が来た時でもバックグラウンドとみなす方法としてこんなやり方がありました。

[How to detect when an Android app goes to the background and come back to the foreground](http://stackoverflow.com/questions/4414171/how-to-detect-when-an-android-app-goes-to-the-background-and-come-back-to-the-fo)

まずアプリケーションクラスを継承し、TimerとTimerTaskのメンバ変数を定義します。
Activity遷移の時間（MAX_ACTIVITY_TRANSITION_TIME_MS）も定義します。※後々説明します。

```android:MyApplication
public class MyApplication extends Application {

    private Timer mActivityTransitionTimer;
    private TimerTask mActivityTransitionTimerTask;
    public boolean wasInBackground;
    private final long MAX_ACTIVITY_TRANSITION_TIME_MS = 2000;
    ...
```
タイマーを動かす為のメソッドを二つ用意しています。

```android:MyApplication
public void startActivityTransitionTimer() {
    this.mActivityTransitionTimer = new Timer();
    this.mActivityTransitionTimerTask = new TimerTask() {
        public void run() {
            MyApplication.this.wasInBackground = true;
        }
    };

    this.mActivityTransitionTimer.schedule(mActivityTransitionTimerTask,
                                           MAX_ACTIVITY_TRANSITION_TIME_MS);
}

public void stopActivityTransitionTimer() {
    if (this.mActivityTransitionTimerTask != null) {
        this.mActivityTransitionTimerTask.cancel();
    }

    if (this.mActivityTransitionTimer != null) {
        this.mActivityTransitionTimer.cancel();
    }

    this.wasInBackground = false;
}
```

各ActivityのonResumeとonPauseで先ほど用意したメソッドをコールします。
ベースActivityに定義すると良いと思います。

```android:Activity
@Override
public void onResume()
{
    super.onResume();

    MyApplication myApp = (MyApplication)this.getApplication();
    if (myApp.wasInBackground)
    {
        //Do specific came-here-from-background code
    }

    myApp.stopActivityTransitionTimer();
}

@Override
public void onPause()
{
    super.onPause();
    ((MyApplication)this.getApplication()).startActivityTransitionTimer();
}
```

**大体の流れ**

1. ホームボタンなどでバックグラウンドに遷移(onPause)
1. タイマーを動かす(MyApplication.startActivityTransitionTimer)
1. ２秒以上経過（MAX_ACTIVITY_TRANSITION_TIME_MS）
1. wasInBackgroundのフラグをtrueにする（バックグラウンドに行ったとみなす）
1. アプリを復帰させる(onResume)。ここでフラグを確認してバックグラウンドに行ったかどうかを確認する
1. タイマーを停止させる(MyApplication.stopActivityTransitionTimer)


こんな感じみたいです。

上記のアラームで検出するパターンのプロジェクトも置いてくのでよかったら参照してみてください。
https://github.com/datsnet/AppBackgroundStatus
MustとかWantとかの意味

アジャイル開発しているiOSの派生開発チームという点も考慮に入れたし。
ネイティブに聞いた話

Must:
これがなければリリース延期
納期までに完成させろという意味ではない。
これが完成しなければ納期をずらす
Feature > Delivery
という力関係に基づいたもの

Want:
これが次のリリースに入ればいいよね
だめならその次のリリースに入れたい、というもの

納期は決まっている、とにかく完成させろ、的なものはまちがっている、らしい
というか現実より計画重視なので、その発言が出た段階でアジャイルではない。
プロセス終了時のファイル出力

プロセス終了結果を待って，
ファイル出力をしてようとチャレンジした．

イレギュラーかもしれないので，参考にならないかも．

結果は`ファイルは生成されるが，ファイルに書き込みはできない`でした．

# 環境
- Node.js v0.10.36

```javascript:exitProcessFileWrite.js
var fs = require('fs');
console.log('Write file test');

function write(filename, s) {
  fs.writeFile('test.txt', s, function(error) {
  if(error) {
    console.log('ERROR', error);
  }
 console.log('DONE');
 });
}

// ファイル生成できるし，書き込みもできる．
write('OnProcessing.txt', 'On processing can write file');

process.on('exit', function(code) {
  // ファイルは生成するが，書き込みができない
  write('OnProcessExit.txt''On process exit cannot write file');
}); 
```

# ドキュメントの記述

困ったときは公式doc．
[Event: 'exit'](http://nodejs.jp/nodejs.org_ja/docs/v0.10/api/process.html)

イベントループを抜ける直前はファイル出力は受け付けないのだろうか？
`process.on('exit'...)`の中で`fs`モジュールは生存してたみたいですが．

>Event: 'exit'#
プロセスが終了しようとしている時に生成されます。 この位置からイベントループを抜けることを防ぐ方法はなく、全ての 'exit' リスナーの実行が完了すると、プロセスは終了します。 従って、このハンドラでできることは 同期 操作 だけ です。 これは (ユニットテストのように) モジュールの状態をチェックするのに適した フックとなります。 コールバックはプロセスの終了コードを唯一の引数として呼び出されます。

>exit を監視する例:

>process.on('exit', function(code) {
  // do *NOT* do this
  setTimeout(function() {
    console.log('This will not run');
  }, 0);
  console.log('About to exit with code:', code);
});
バグ発生から対処までのフロー

# ステップごとにまとめてみた
0. なんかバグが起きるっぽい
1. 手元端末でバグが起きることを確認
2. どういうときにこのバグが発生するのかわかる(再現条件が分かる)
3. どこでこのバグが発生するのかわかる(原因部分がざっくり判明)
4. どうしてこのバグが発生するのかわかる(原因の判明)
5. 対応アプローチの策定
6. デバッグ実装の設計、実装
7. レビュー
8. リリース

# 何が言いたい？
## readyという観点で
再現条件がわかるまではバグ調査着手にはreadyではない。
タスクサイズが見積不能な検証タスクを起票すべき
原因が判明するまではデバッグ対応のreadyではない。原因究明タスクを起票すべき
アプローチが策定されるまではデバッグ実装タスクはreadyではない。
短期でできるdirtyハックを求めるか、長期でできる根治策を求めるか、あるいはほかの手を求めるか、アプローチはチームの意思に基づいて定められるべきである。

## 振る舞い的に
最後のリリースまでは、ユーザーからは「バグが存在し、対応されていない」状態である。
また、開発チーム外からもそう見える。しかし現実にはWIPである。
開発チーム外からはどのメッシュで知りたい？
バグ管理シート的な運用をするなら、それは管理されるべきだが、開発チームの内外でプロトコルが異なるので、共通のAPI的なものを定めるべきである
いつでもどこからでもキーボード表示状態を知るには

# はじめに
現在画面にキーボードが表示されているかを知る方法を調べました。

結論として、キーボードが出すNotificationをアプリ起動時から
監視し続けることで表示状態を知ることができそうです。

表示状態を取得するクラスを作成してみました。

参考になりましたら幸いです。

![スクリーンショット 2015-03-16 12.18.01.png](https://qiita-image-store.s3.amazonaws.com/0/63205/d5a7fa7e-411b-d5a7-bc42-ed4199d5b3cd.png)

# キーボード状態リスナクラス

```objc:ヘッダ
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface XXXKeyboardStateListener : NSObject

+ (XXXKeyboardStateListener *)sharedInstance;

- (id)init __attribute__((unavailable("init is not available")));

- (BOOL)isHidden;

@end
```

```objc:実装
#import "XXXKeyboardStateListener.h"

@interface XXXKeyboardStateListener ()
{
    BOOL _hidden;
}

@end

@implementation XXXKeyboardStateListener

+ (XXXKeyboardStateListener *)sharedInstance
{
    static XXXKeyboardStateListener *sharedInstance;
    
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        sharedInstance = [[self alloc] init];
    });
    
    return sharedInstance;
}

- (id)init
{
    self = [super init];
    if (self) {
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        [center addObserver:self selector:@selector(didShow) name:UIKeyboardDidShowNotification object:nil];
        [center addObserver:self selector:@selector(didHide) name:UIKeyboardDidHideNotification object:nil];

        _hidden = YES;
    }
    return self;
}

- (void)dealloc
{
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center removeObserver:self];
}

- (BOOL)isHidden
{
    return _hidden;
}

- (void)didShow
{
    _hidden = NO;
}

- (void)didHide
{
    _hidden = YES;
}

@end
```

緩めのSingleton実装。
Prefixは適当に置換してください。

# AppDelegateにてリスナクラスを初期生成

```objc
#import "XXXKeyboardStateListener.h"

@implementation XXXAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // キーボードリスナ生成(起動時から状態を監視するためここで生成)
    [XXXKeyboardStateListener sharedInstance];

    ...
}
```

# 使用時

```objc
    if ([[XXXKeyboardStateListener sharedInstance] isHidden]) {
        ...
    }
```

# おわりに
ついでにSharedInstanceの扱いも調べ直しました。
実装こうした方が良いよという部分あったらコメント等で補完して頂けると嬉しいです！


# 参考

[Managing the Keyboard](https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html)

[How to programatically check whether a keyboard is present in iphone app?](http://stackoverflow.com/questions/1490573/how-to-programatically-check-whether-a-keyboard-is-present-in-iphone-app)

[Objective-CのSingleton、その歴史的経緯など](http://www.toyship.org/archives/1770)

[Objective-C で継承可能な Singleton Class を作る](http://qiita.com/hal_sk/items/b4e51c33e7c9d29964ab)
[Swift]Optional型同士がイコールかどうかの判定をカスタムクラスで


...やろうとしたら、コンパイルが通らなくて一瞬ん？っとなったので雑なメモを残しておきます。

結論から言えば`Equatable`プロトコルを実装すれば良いようです。

## 経緯

普段何気なく`Optional<Bool>`型などで==演算子などを使っているのですが、nilとnilはイコール、nilとnil以外はイコールではない、nil以外とnil以外はアンラップして中身で判定してくれて便利です。

```swift:
var a: Bool?
var b: Bool?
var c: Bool? = true
var d: Bool? = false
var e: Bool? = true

println(a == b) // "true"
println(b == c) // "false"
println(c == d) // "false"
println(c == e) // "true"
```

で、カスタムクラスでも同じことできるよね？と思い、==演算子を実装してこれでいけるっしょ！と思ったらエラーが出てしまい...

```swift:
class Test {
    var value: Int = 0
}

func ==(a: Test, b: Test) -> Bool {
    return a.value == b.value
}

var a: Test?
var b: Test?

println(a == b)
```

```text:
error: value of optional type 'Test?' not unwrapped; did you mean to use '!' or '?'?
println(a == b)
        ^
```

アレ？と思ったのですが、どうやら`Optional`型同士の`==`演算子と`!=`演算子辺りは標準関数が間に入ってくれていたようで、`Equatable`プロトコルに準拠してないとダメのようです。

```swift:
func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
```

判ってしまえばなんてことはないのですが、`Equatable`プロトコルに準拠してなくてもカスタムクラスの`==`演算子自体は動作するので気がつくのが遅れました...


```swift:Equatableに準拠させれば動く
class Test: Equatable {
    var value: Int = 0
}

func ==(a: Test, b: Test) -> Bool {
    return a.value == b.value
}

var a: Test? // nil
var b: Test? // nil

println(a == b) // "true"
```