OmniAICreator/Qiita-1.07M huggingface dataset:
静的サイトジェネレータ・サーバ Harp

ぱっと静的サイトを作ってGitHub Pagesで公開する時にHarpが便利だった。

- [Harp, the static web server with built-in preprocessing](http://harpjs.com/)

Harpはソース群から静的サイトをまるっと生成して返すサーバだが、コマンドを叩けば生成したファイルを吐いてくれる。

```
$ harp compile [options] [projectPath] [outputPath]
```

使える道具が以下に制限されているものの、該当の拡張子のファイルを置いておけばそれをよしなにコンパイルしてくれる。

- [The Rules – Harp, the static web server with built-in preprocessing](http://harpjs.com/docs/development/rules)

CSSプリプロセッサとして

- LESS
- Sass
- Stylus

テンプレートエンジンとして

- EJS
- Jade
- Markdown

が使える。あと、CoffeeScriptが使える。

デフォルトというかイニシャライズするとLESS、Jadeでのサンプルが出力されるけど、特段何を使います！みたいな設定はなく、それぞれ使いたいものの拡張子のファイルを置けば良いだけ。

```
$ harp init src
$ ls src/
404.jade     _layout.jade index.jade   main.less
```

Herokuが無料で常時稼働とはならない今、ぱっと何かページをおっ立てるのにGitHub Pagesを選び、その時にJekyllやMiddlemanを使うという場面が増えた気がする。

そういう静的サイトをそれらのライブラリのことをよく知らないデザイナーといざ協力して作りますかという時に、それぞれのジェネレータ特有の設定や開発言語由来の謎のファイル、ビルドに関わるおまじない的な存在が割とあって、どこを編集したらいいんでと余計な情報の切り分けをやる量が極めて少ないのが素敵。多分Jadeだけ頑張って貰えば良さそう。

ES6で！とかReactとかEmberを使って！みたいなレベルの静的サイト（静的とは...）になるとHarpの制約からはみ出て、ビルド周りが面倒でどうしようもないことになるので、そういう時は最初からHarpでなく[Brunch](http://brunch.io/)とかを使うのが良さそう？

## ローカル

```
$ harp server [options] [path]
```

で`localhost:9000`にて確認出来るようになる。

## メタデータ

[MiddlemanでいうData Files](https://middlemanapp.com/advanced/data_files/)みたいな機能があって、テンプレートから置いてあるJSONを参照出来る。

- [Metadata – Harp, the static web server with built-in preprocessing](http://harpjs.com/docs/development/metadata)

画像等のファイル群もメタデータみたいに扱える。

- [Contents – Harp, the static web server with built-in preprocessing](http://harpjs.com/docs/development/contents)

## 公開

[GitHub Pages](http://harpjs.com/docs/deployment/github-pages)や[Heroku](http://harpjs.com/docs/deployment/heroku)や[Azure](http://harpjs.com/docs/deployment/azure)にデプロイする方法もドキュメントされている。基本的に

```
$ harp compile [options] [projectPath] [outputPath]
```

で、静的サイトのファイル群を吐いてくれるので、それを好きなところに出すと良いという話。

Dropboxに置いてるHarpのプロジェクトを公開してくれるサービスもある。

- [Harp Platform — Effortless web publishing through Dropbox](https://www.harp.io/)


## GitHub Pages向け便利セット

これから何度か静的サイト生成の場面に出会うこともありそうと思い、GitHub Pagesへの公開を前提にしたソースセットを作った。公式のドキュメント通りにデプロイの度にGitのコマンドをごにょごにょやるのは辛いので[npmのgh-pages](https://www.npmjs.com/package/gh-pages)を使う。

- [hmsk/harp-gh-pages-boilerplate: The boilerplate of harp project publishing GitHub Pages](https://github.com/hmsk/harp-gh-pages-boilerplate)

クローンしたリポジトリから自分のGitHubのプロジェクトに必要なファイルをコピーして`npm install`して、`npm run publish`でGitHub Pagesへすぐに公開できる。

```
$ npm run preview
```

で`localhost:9000`にてHarpのサーバが立ち上がるので、ソースをいじりながらブラウザで確認。

```
$ npm run publish
```

でリポジトリの`gh-pages`にコンパイルされた静的サイトがpushされて、公開される。

### Circle CIでデプロイする

手動でpublishを実行するのも面倒（出すことを忘れがちなのと、どのリビジョンを出したのか確認しやすくしたい）であればCIに頼って、masterの更新都度自動でやれる。

Circle CIの設定のサンプルをリネームして編集、Circle CI側でリポジトリを登録して、GitHubと共にリポジトリへ書き込み可能なSSHキーを設定をする。

```
$ mv circle.yml{.sample,}
$ vim circle.yml # Edit git config variables
$ mv src/circle.yml{.sample,}
```
apktoolでリバースエンジニアリング

apktoolは.apk用のリバースエンジニアリングツール
SECCON 2015のBinaryの問題でapktoolを使う機会があったのでメモ。

実行環境
Windows 8
javaは事前に準備

ここからapktoolをインストール
http://ibotpeaches.github.io/Apktool/install/
apktool.batとapktool.jarがインストールされる。

コマンドラインで以下を実行
apktool d [.apkファイルへのパス]

以下自分が実行した内容、参考までに
`apktool d rps.apk`
パスは.apkファイルの置き場所、apktoolの置き場所を考慮してください。
「apk」というフォルダがapktoolと同じ場所に生成された。フォルダの中はこんな感じ。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/102676/bfdf1977-2d74-8ee4-e9c5-db16cea68ad6.png)

ちなみに、以下の実行でも同様の結果を得られる。
java -jar apktool.jar d [.apkファイルへのパス]
VMWare FCoE環境でのトラブル

世の中に全然情報が無いので書いておく。

EmulexのCNAをVMWare ESXi環境でストレージをFCoE接続で使っている場合、ドライバのバージョンによってパフォーマンスの大幅な劣化が発生する場合がある。
対象バージョンは10.2系。
最新の10.6系に上げると直る。
10.4系のリリースノートに「Enhanced performance of FCoE drivers on OCe14000-series products」なんて書いてあるから10.4系でも直るのかもしれない。

発生した環境はOCe14102-UXとBrocade VDX6740な構成でした。
fioでベンチマークを取るとランダムライトが360iops前後で安定してしまう感じ。
ディスクをSSD RAID0にしようがSATAのHDDのままでも変わらない。
この組み合わせだけで起きるのか、スイッチが違えば変わらないの不明。
MeCabで名詞抽出してカウントするワンライナー

よく忘れるのでメモ。


```input.txt
犬も歩けば棒に当たる
夫婦喧嘩は犬も食わぬ
犬が西向きゃ尾は東
```

```
$ cat input.txt | mecab | grep $"\t名詞" | cut -f1 | sort | uniq -c | sort -nr

   3 犬
   1 夫婦
   1 喧嘩
   1 西
   1 棒
   1 東
   1 尾
```
UIScrollViewの中央にUIImageViewを配置しつつズーム可能にする

# はじめに
iOSアプリで画像Viewerを作るとき、UIScrollView上にUIImageViewを配置するのが一般的かと思います。
しかし単純に乗せただけでは、画像の起点が左上になったり、ズームすると画像外の場所までスクロールしてしまって、しっくりこない場合があります。

そこで、画像をUIScrollViewの中央に表示しつつ、正しくズーム／スクロールできる方法を考えました。

![fox.gif](https://raw.githubusercontent.com/wmoai/wmoai.github.io/master/image/foxee.gif)

# 方針
簡単に方針としては

* UIImageViewの位置は(0,0)
* UIImageViewのサイズは、UIImageのサイズに合わせる（要調整）
* UIScrollView.contentSizeは、UIImageViewのサイズに合わせる
* **UIScrollView.contentInset**を操作して、画像を常に中央に配置

要するにスクロールビューの余白を調整して常に中央に表示する感じです。

# コード

``` ViewController.swift
class ViewController: UIViewController, UIScrollViewDelegate {
    @IBOutlet var scrollView: UIScrollView!
    var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView.delegate = self
        
        imageView = UIImageView(image: UIImage(named: "test.png"))
        scrollView.addSubview(imageView)
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        if let size = imageView.image?.size {
            // imageViewのサイズがscrollView内に収まるように調整
            let wrate = scrollView.frame.width / size.width
            let hrate = scrollView.frame.height / size.height
            let rate = min(wrate, hrate, 1)
            imageView.frame.size = CGSizeMake(size.width * rate, size.height * rate)

            // contentSizeを画像サイズに設定
            scrollView.contentSize = imageView.frame.size
            // 初期表示のためcontentInsetを更新
            updateScrollInset()
        }
    }
    
    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
        // ズームのために要指定
        return imageView
    }
    
    func scrollViewDidZoom(scrollView: UIScrollView) {
        // ズームのタイミングでcontentInsetを更新
        updateScrollInset()
    }
    
    private func updateScrollInset() {
        // imageViewの大きさからcontentInsetを再計算
        // なお、0を下回らないようにする
        scrollView.contentInset = UIEdgeInsetsMake(
            max((scrollView.frame.height - imageView.frame.height)/2, 0),
            max((scrollView.frame.width - imageView.frame.width)/2, 0),
            0,
            0
        );
    }
}
```

なお、UIScrollViewはStoryBoardで設置、UIImageViewはコード内でaddSubview()しています。
これは、UIImageViewの設置をStoryBoard側で行うと、画像のframeとcontentSizeの設定が入り混じり複雑になってしまうことを避けるためです。

StoryBoard側で、UIScrollViewのzoom max/min値を指定することを忘れずに。
これを忘れるとどうあがいてもズームしません。


# 補足
ナビゲーションバーなどを考慮する場合は、contentInsetの再計算に別途調整が必要です。
例えばステータスバー＋ナビゲーションバーであればcontentInset.topの最低値は0→64となるでしょう。
Laravel系 HttpExceptionの取り扱いまとめ


Lumenでの取り扱いを中心に。

## HttpExceptionとは

HttpのException

- Model層とかで使わない方が良いよ
- Exception自体がView(Response)に関する情報持ってる気持ち悪いやつ
- Handlerとかでまとめてキャッチするのには便利な奴

運用方法としては２種類に分かれると思う。

### 継承ツリーの中心としてのみ使うよ派

例外にResponseのプロパティとか持たせるのは気持ち悪いよ派

独自の例外型を色々作って例外->Responseの変換はhandler等で行う。


### render可能な例外として使うよ派

throwするときにReponseに関するデータを色々Exceptionに詰め込む派

## HttpException

定義はこんな感じになっている。

````
namespace Symfony\Component\HttpKernel\Exception;

/**
 * HttpException.
 *
 * @author Kris Wallsmith <kris@symfony.com>
 */
class HttpException extends \RuntimeException implements HttpExceptionInterface
{
    private $statusCode;
    private $headers;

    public function __construct($statusCode, $message = null, \Exception $previous = null, array $headers = array(), $code = 0)
    {
        $this->statusCode = $statusCode;
        $this->headers = $headers;

        parent::__construct($message, $code, $previous);
    }

    public function getStatusCode()
    {
        return $this->statusCode;
    }

    public function getHeaders()
    {
        return $this->headers;
    }
}
````

コンストラクタの順番がアレなのはご愛嬌。

headerに関する情報とmessageを受け付ける事が出来るみたい。

ちなみに後ろ２つのメソドは`HttpExceptionInterface`の実装。

Exceptionの型としては`RuntimeException` (実行時例外)となっている。

## HttpExceptionの運用

laravel/lumen系の例外処理では、`$dontReport`の項目でその存在を確認することが出来る。

````
            protected $dontReport = [
                'Symfony\Component\HttpKernel\Exception\HttpException',
            ];

````

実際に何か処理を入れるならきっとrenderの方になるかと思う。

### クラスの運用

`HttpException`それ自体はコンストラクタに必須パラメータがあったりと使いづらい。

Symfonyの中でも、`HttpException`を直接newるというよりかは拡張型で第一引数を埋める、みたいなやり方が取られてるっぽい。

````
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpKernel\Exception;

/**
 * AccessDeniedHttpException.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 * @author Christophe Coevoet <stof@notk.org>
 */
class AccessDeniedHttpException extends HttpException
{
    /**
     * Constructor.
     *
     * @param string     $message  The internal exception message
     * @param \Exception $previous The previous exception
     * @param int        $code     The internal exception code
     */
    public function __construct($message = null, \Exception $previous = null, $code = 0)
    {
        parent::__construct(403, $message, $previous, array(), $code);
    }
}

````
PhalconとMongoDBの俺メモ(2) Tagヘルパーのselectが残念だった

あ、個人的に残念だったということで。

Phalcon\Tag::select()はPhalcon\Mvc\Model用には作られているんだけども、NoSQL的なPhalcon\Mvc\Collectionではarrayにするしかない。

ちょっと美しく書けなくて、悲しかったので、その時の実装をメモ。

```php:zanen.php
// 取り出す項目（いらないかもｗ）
$query['fields'] = array(
	'id', 'Race'
);
// 昇順にソート
$query['sort'] = array(
	'id' => 1
);
$races = Races::find($query);
// 結果を連想配列に入れる
foreach($races as $race) {
	$select[$race['id']] = $race['Race'];
}
// selectタグを表示
echo $this->tag->selectStatic(
	array(
		"Race",
		$select,
		'useEmpty'   => true,
		'emptyText'  => '種族を1つ選んで下さい...',
		'emptyValue' => '@'
	)
);
```
多分、MySQLとかだと以下の様になるんじゃないかと妄想してみた。

```php:urayama.php
// 取り出す項目（いらないかもｗ）
$query['columns'] = array(
	'id', 'Race'
);
// 昇順にソート
$query['order'] = 'id'
// selectタグを表示
echo $this->tag->selec(
	array(
		"Race",
		Race::find($query),
		'using' => array(
			'id',
			'Race'
		),
		'useEmpty'   => true,
		'emptyText'  => '種族を1つ選んで下さい...',
		'emptyValue' => '@'
	)
);
```
Collectionにも対応して欲しいなぁ。
vertical-alignに対する苦手意識を無くそう

# vertical-alignが苦手です

CSSでの中央揃えですが、横方向中央揃えに比べ、縦方向中央揃えは難しい印象があります。
個人的なアレでマークアップから数ヶ月遠ざかっていて、久々にCSS畑に戻ってきてvertical-align使おうと思ったら...「あれ、table-cellとvertical-alignなハズだけど、どこにつけるんだっけｗ」ってなるわけです。

そろそろ覚えような...何年CSS書いてるんだよ...

# 結論

結論から言うと、**親要素に`table`を指定して、`table-cell`で横に並べて、`vertical-align`で縦方向中央揃えを行う。**

# よくある間違い

自分がよく間違うのは2パターン。

- floatで横に並べようとする
- 親要素に`table-cell`と`vertical-align`をつけてしまう


# 実例

例えば、以下の様なDOM構造があったとしようね。

```
<div class="box">
  <div class="left">ひだり</div>
  <div class="right">み<br>ぎ</div>
</div>
```

これを縦方向中央揃えするためには、以下のように書く。

```
.box {
  display: table;
}

.left {
  display: table-cell;
  vertical-align: middle;
}

.right {
  display: table-cell;
  vertical-align: middle;
}
```

# 実例コード
[Codepen](http://codepen.io/p1ch_jp/full/qbQWvy/)
UUDecode(UUEncodeのデコード)

## はじめに
事前に以下のライブラリを用意します。

- JavaMail API
    - http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.7-oth-JPR
    - ※"javamail1_4_7.zip"のリンクからダウンロード

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:UUDecoder.java
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import javax.mail.MessagingException;
import javax.mail.internet.MimeUtility;

/**
 *
 * @author tool-taro.com
 */
public class UUDecoder {

	public static void main(String[] args) throws MessagingException, IOException {

		//デコードしたい文字列
		String source = "begin 644 encoder.buf\n"
				+ ")XX*_XX.MXX*F\n"
				+ " \n"
				+ "end";
		//デコード後に文字列に置き換える際のCharset
		Charset charset = StandardCharsets.UTF_8;

		//デコード処理
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		InputStream in = null;

		try {
			in = MimeUtility.decode(new ByteArrayInputStream(source.getBytes(charset)), "uuencode");
			byte[] buf = new byte[1024];
			int length;
			while (true) {
				length = in.read(buf);
				if (length == -1) {
					break;
				}
				bout.write(buf, 0, length);
			}
		}
		finally {
			if (in != null) {
				try {
					in.close();
				}
				catch (IOException e) {
				}
			}
		}

		String result = new String(bout.toByteArray(), charset);
		//標準出力
		System.out.format("デコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac UUDecoder.java
$ java UUDecoder
$ デコード結果=タロウ
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[UUDecode｜Web便利ツール@ツールタロウ](http://tool-taro.com/uudecode/)
UUEncode

## はじめに
事前に以下のライブラリを用意します。

- JavaMail API
    - http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html#javamail-1.4.7-oth-JPR
    - ※"javamail1_4_7.zip"のリンクからダウンロード

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。
結果だけを確認したい場合は、この記事の一番下のリンク先で使えるようにしてありますのでご覧ください。

```java:UUEncoder.java
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import javax.mail.MessagingException;
import javax.mail.internet.MimeUtility;

/**
 *
 * @author tool-taro.com
 */
public class UUEncoder {

	public static void main(String[] args) throws MessagingException, IOException {

		//エンコードしたい文字列
		String source = "タロウ";
		//エンコード前にバイト配列に置き換える際のCharset
		Charset charset = StandardCharsets.UTF_8;

		//エンコード処理
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		OutputStream out = null;

		try {
			out = MimeUtility.encode(bout, "uuencode");
			out.write(source.getBytes(charset));
		}
		finally {
			if (out != null) {
				try {
					out.close();
				}
				catch (IOException e) {
				}
			}
		}

		String result = new String(bout.toByteArray(), charset);
		//標準出力
		System.out.format("エンコード結果=%1$s", result);
	}
}
```
## 動作確認

```
$ javac UUEncoder.java
$ java UUEncoder
$ エンコード結果=begin 644 encoder.buf
)XX*_XX.MXX*F
 
end
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

上記の実装をベースにWebツールも公開しています。
[UUEncode｜Web便利ツール@ツールタロウ](http://tool-taro.com/uuencode/)
Ruby | 改行だけを出力する

# 解決

引数を渡さずに puts すればOK。

```rb
puts
```

# 例

```rb
puts
puts 'Gumi'
puts
puts 'Chocolate'
puts
puts 'Pine'
puts
```

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/a92b0ce7-935d-dc21-0549-fd2ad5273de9.png)

# 問題

たとえば、テキストの先頭に改行を付けたいことがある。
だが次のような書き方は野暮ったい。

```rb
puts "\nTEXT"
```

```rb
puts "\n"
puts "TEXT"
```
解は前述のとおり。

# 環境

- Ruby 2.3.0



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
まだ公開していないページのFacebook OGPを表示する方法

## 問題
メディアサイトで、記事公開と同時にFacebookで拡散を促すため、投稿の予約機能を活用することがあると思います。しかし投稿予約時にはまだ記事が公開されていないので、通常であればOGPが表示されません。ここではその解決方法について説明します。

## 解決策
仕組みは単純で、Facebookのクローラーからのみアクセスを許可します。
[Facebookクローラーのドキュメント](https://developers.facebook.com/docs/sharing/webmasters/crawler#access)を見てみると、Facebookのクローラーが使用するIPアドレスの取得方法が記述してあります。合わせてUser Agentも載ってはいるのですが、こちらは偽装出来るため今回は使用しません。

## 実装
```rb:Gemfile
gem 'irrc'
gem 'ipaddr_range_set'
```
```rb:app/controllers/application_controller.rb
  def authenticate_facebook_ogp!
    # Facebbok Crawlerからのアクセスのみを許可
    # ref: https://developers.facebook.com/docs/sharing/webmasters/crawler#access
    client = Irrc::Client.new
    client.query(:jpirr, 'AS32934', source: :radb, protocol: :ipv4)
    result = client.perform
    ip_ranges = result['AS32934'][:ipv4]['AS32934']
    range = IPAddrRangeSet.new *ip_ranges
    raise ActiveRecord::RecordNotFound unless range.include? request.remote_ip
  end
```

## 使い方
```rb:app/controller/articles_controller.rb
def show
  authenticate_facebook_ogp! if @article.released_at > Time.now
end
```

## 注意
今回の方法でFacebookクローラーからのアクセスを許可した場合、他のユーザが同じようにFacebook上でURLを入力した場合にも、OGPが取得されてしまいます。よって絶対に公開したくないページに関しては、今回の方法を用いることは出来ませんのでご注意。
（みなさんどうしてますか… ( _ _) URLを推測不可能なものにするとか、外部サービス使うとか、期間限定でアクセス許可してOGPキャッシュ更新しておくとか…？）
Vim | 存在しないファイルの編集を一発で始める

# 解決

存在しないファイルでも。
「新規ファイル」として、いきなり編集を始めること出来る。

`$ vim example.txt`

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/4b68e8aa-1c6a-5f2d-dd63-5a2328a9fd5f.png)


あとは保存終了すれば良い。 ( `:x` )

ファイルを作りたくない場合は、保存せず抜ければ良い。 ( `:q!` )

# 問題

「あらかじめファイルを作成する」っていう手順が面倒だ。

`$ touch example.txt`

`$ vim example.txt`

# 環境

- vim 7.2.411  



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Route53 の Weighted Routing で少しだけ流してテストする


# Weighted Routingとは

DNSクエリに対して指定した割合で一連のレコードセットの中からどれかを返す。
同名・同タイプのレコードセットを作成することで一連のレコードセットと見なされる。

Simpleなレコードセットとの違いは ```Set ID``` と ```Weight``` を指定するところ。
Set IDは一連のレコードセット内でユニークなら適当でいい。
あるレコードセットのWeightを、一連のレコードセットのWeightの合計で割った割合で応答するようになる。

```
Weight / Weight合計
```

Aliasレコードを使わない場合、LatencyやGeolocationベースのルーティングは割増料金になるが、Weightedベースのルーティングは基本料金で使える。
https://aws.amazon.com/jp/route53/pricing/


# レコードセットの作成
既存のSimpleなAレコードをWeighted Routingにしてみる。
1%だけ新規レコードのほうに流したい。

これが初期状態。SimpleなAレコードが1行あるだけ。

| # | name | type | value | ttl | weight | set id |
|---|---|:-:|---|:-:|:-:|:-:|
| 1 | www.example.com | A | 0.0.0.0 | 300 | - | - |

まず、既存のレコードセットをSimple → Weighted に変更する。
ELBのAliasレコードを追加するつもりなので、それに合わせてTTLは60秒にしておく。理由は後述。
99%は既存レコードを応答したいのでWeightは99に設定。
この時点で99/99の割合で既存レコードが応答される。要するにこれまで通り。

| # | name | type | value | ttl | weight | set id |
|---|---|:-:|---|:-:|:-:|---|
| 1 | www.example.com | A | 0.0.0.0 | **60**:sparkles: | **99**:sparkles: | **idc**:sparkles: |

続けて、ELBのAliasレコードをWeightedで追加する。
Weightは1。これで1/100の割合でこちらが応答される。

| # | name | type | value | ttl | weight | set id |
|---|---|:-:|---|:-:|:-:|---|
| 1 | www.example.com | A | 0.0.0.0 | 60 | 99 | idc |
| **2**:sparkles: | **www.example.com** | **A** | **ALIAS dualstack...amazonaws.com** | - | **1** | **aws** |

問題なければ100%新規レコードを応答する。

| # | name | type | value | ttl | weight | set id |
|---|---|:-:|---|:-:|:-:|---|
| 1 | www.example.com | A | 0.0.0.0 | 60 | **0**:sparkles: | idc |
| 2 | www.example.com | A | ALIAS dualstack...amazonaws.com | - | **100**:sparkles: | aws |

# その他

## 作成できるタイプ

AレコードはもちろんCNAMEレコードも複数作成できる。
Aliasも使える。

## TTLの設定

レコードセットのTTLを変更すると全ての関連するレコードセットのTTLが一括で変更される。
一連のレコードセットにELBのAliasが含まれる場合、Aliasでない他のレコードセットのTTLも60秒に設定することが推奨されている。
ELBのTTL(60秒)に合わせないと指定した割合で応答しないことになるから。

## 負荷が分散できないケース

名前解決を行うクライアント(レゾルバ)数が少ない場合、たまに大量のアクセスが来ることになる。
例えば、クライアントが1人の場合、加重ルーティングで指定した割合で全てのアクセスが来る。
大量のアクセス→アクセスなし→大量のアクセス→・・・を繰り返す状態。
逆にクライアント数が多ければ指定した割合と同じ傾向でアクセスが分散される。
Windowsコマンドプロンプト　文字コード設定

■Windowsコマンドプロンプトの文字コード確認方法
コマンドプロンプトで、
chcp
と入力して[Enter]キーを押す

932と表示されたら、文字コードは、Shift-JISに設定されている


■Windowsコマンドプロンプトの文字コード変更方法
文字コードをUTF8に設定する場合
chcp 65001
と入力して[Enter]キーを押す

コマンドプロンプトを終了して、再度起動すると、文字コードは、Shift-JISに戻る

<a href="https://www.vector.co.jp/soft/screen/win95/game/se394828.html">ふぁんふぁんまっちんぐ<br><img src="https://deliver.vector.co.jp/screenshot/394/394828_01.jpg" width="50%"></a>
JAXBで他のXMLの要素のオブジェクトを参照する

JAXB を使っていて他のXMLで変換されたオブジェクトを参照したい場合がある。外部キーとかそういう奴である。
この場合は `@XmlID` と `@XmlIDREF` を使う。

```java:DomIdRefJaxb.java
package example.xml;

import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.ByteArrayInputStream;
import java.io.IOException;

public class DomIdRefJaxb {
    public static void main(
            final String[] args) throws ParserConfigurationException, IOException, SAXException, JAXBException {
        final String xml = "<info><person><name>hoge</name><age>35</age><addr>12</addr></person><city id='12' name='Nagoya'/></info>";
        final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                .newInstance();
        final DocumentBuilder documentBuilder = documentBuilderFactory
                .newDocumentBuilder();
        final Document document = documentBuilder
                .parse(new ByteArrayInputStream(xml.getBytes()));

        final JAXBContext jc = JAXBContext.newInstance(Info.class);
        final Unmarshaller unmarshaller = jc.createUnmarshaller();
        final JAXBElement<Info> jaxbElement = unmarshaller
                .unmarshal(document, Info.class);
        System.out.println("JAXBElement: " + jaxbElement.getValue());

        final Info info = (Info) unmarshaller.unmarshal(document);
        System.out.println("unmarshal: " + info);
    }

    @XmlRootElement
    public static class Info {
        @XmlElement(name = "person")
        private Person person;
        @XmlElement(name = "city")
        private City city;

        @Override
        public String toString() {
            return String.format("%s", person);
        }

    }

    @XmlRootElement
    public static class City {
        @XmlAttribute(name = "id")
        @XmlID
        private String id;
        @XmlAttribute(name = "name")
        private String name;
    }

    @XmlRootElement
    public static class Person {
        @XmlElement
        private String name;
        @XmlElement
        private int age;

        @XmlElement(name = "addr")
        @XmlIDREF
        private City city;

        @Override
        public String toString() {
            return String.format("%s:%s:%s", name, Integer.toString(age), city.name);
        }

    }
}
```

`Person`クラスの中で `@XmlIDREF` を使って参照するという記述をつけておけば 対象のクラスの `@XmlID` を探してきて結合してくれる。
centos7でメモリ圧縮機能（zram）が使いたい場合


# centos7でzramが使いたい場合

* zswapというのが標準搭載されているのでそちらを使ったほうがいい
* この記事ではzswapの設定方法を記載する
* githubにそれっぽいのがあるが使えるかわからない→[github](https://github.com/mystilleef/FedoraZram)

## カーネル設定

### 1.設定の追加

```:/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="zswap.enabled=1"
```

### 2.設定を反映して再起動

```
# grub2-mkconfig -o /boot/grub2/grub.cfg
# reboot
```

### 確認

起動ログに以下のようにzswapが有効になったというログが出ていればok

```
$ dmesg|grep zswap
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-3.10.0-327.4.5.el7.x86_64 root=UUID=dd8f0afe-5a00-40ff-b538-5fa0a351cdba ro crashkernel=auto console=tty0 console=ttyS0,115200 zswap.enabled=1
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-3.10.0-327.4.5.el7.x86_64 root=UUID=dd8f0afe-5a00-40ff-b538-5fa0a351cdba ro crashkernel=auto console=tty0 console=ttyS0,115200 zswap.enabled=1
[    1.562101] zswap: loading zswap
[    1.571151] zswap: using zbud pool
[    1.573786] zswap: using lzo compressor
```

## チューニング

### 容量

容量は最初からフルで確保されるわけではない。最大の割合を指定する
デフォルトは20

```:/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="zswap.enabled=1 zswap.max_pool_percent=20"
```

### 圧縮方式

以下の方式から選べる
デフォルトはlzo

* lzo
* lz4
* deflate

lz4は別途カーネルモジュールを入れる必要がある
カーネル再コンパイル無しで入ってくれるかどうかまだ調べていない
カーネルモジュールが存在しない場合はlzoにフォールバックされる

```:/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="zswap.enabled=1 zswap.compressor=lzo"
```


# 参考にしたページ

* [Zswap](https://wiki.archlinuxjp.org/index.php/Zswap#zswap_.E3.81.AE.E6.9C.89.E5.8A.B9.E5.8C.96)
* [【Linux】zswap は本当に速いのか](http://gnu.hatenablog.com/entry/2016/01/12/072154)
JavaScript疑似プロトコルでの別窓展開

##やりたいこと
リンクでサイズ指定の別窓展開。ただし技術的制約として下記の条件がある。

 * システムの都合上、弄れるのはa要素のhref属性値のみ。
 * onclick属性も追加出来ないし、外部jsの読み込みも不可。

##成功までの道のり

###<i class="fa fa-pencil" aria-hidden="true"></i> 失敗コード1
```html
<a href="javascript:window.open('hoge.html','new','width=800,height=600'); ">リンク</a>
```
####結果
別窓は開くが、元ページがIE/Fxで [object] という表示に代わる。（Chromeは問題なし）
####原因
[undefined 以外が返るとページが書き換わる](http://www.w3.org/TR/html5/browsers.html#javascript-protocol)というHTMLの仕様。
下記のMS情報サイトにも同様の言及あり。

 * [PRB: HREF で Window.open ファイルは現在のウィンドウで [オブジェクト] を返します](https://support.microsoft.com/ja-jp/kb/257321)

###<i class="fa fa-pencil" aria-hidden="true"></i> 失敗コード2

```html
<a href="javascript:window.open('hoge.html','new','width=800,height=600'); return false;">リンク</a>
```
####結果
動かない
####原因
関数外でreturnしているため `Illegal return statement` エラーが発生。


###<i class="fa fa-pencil" aria-hidden="true"></i> 成功コード
```html
<a href="javascript:window.open('hoge.html','new','width=800,height=600'); void(0);">リンク</a>
```
####結果
別窓が開き、リンク元ページはそのまま（想定通り！）
void 演算子は与えられた式を評価し undefined を返す。

 


##参考サイト
* [javascript:void(0)のまとめ](http://www.koikikukan.com/archives/2015/03/11-002222.php)
* [5 Loading Web pages — HTML5](http://www.w3.org/TR/html5/browsers.html#javascript-protocol)
* [void 演算子 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/void)
使ったワンライナーをメモしていくスタイル - 時間毎のファイルが何件あるか　


```bash
 ls -ltr *.txt | awk '{split($8,a, ":"); print a[1]}'  | sort -n | uniq -c | awk '{print $2"時:"$1"件"}'
```

表題の通り、ls -ltrの形式ってOSに寄って違うんだろうか……
Mac で erlenv を使う際 Erlang/OTP が OpenSSL 付きでビルドできない問題

結論から書くと、Mac OS X が標準で用意している SSL のライブラリを使おうとすると (自分の指定のしかたが悪いのかもしれないが) Erlang/OTP をソースからビルドしてもうまくいかない。事前に brew を使って openssl をインストールしておくと良いようだ。

ここでは otp_src_18.2.1 と Elixir 1.2.2 を前提としている。

症状としては

[Mac OSXにanyenv/exenvでElixirをインストールする](http://qiita.com/nownabe/items/67a27ddd23652676ffee)

の手順に沿って進めていくと、`exenv install ...` のところでエラーが出る。厳密に見比べていないが

https://github.com/taylor/kiex/issues/7

で紹介されているエラーメッセージに近く、実際ここに記載がある通り `erl` を起動して `crypto:start().` してみるとエラーになる。

otp_src_18.2.1 の `./configure` 時に OpenSSL の問題が出ているようだ。

そこでこの `./configure` 時に `--with-ssl=/usr` を追加すると

	*********************************************************************
	**********************  APPLICATIONS DISABLED  **********************
	*********************************************************************
	
	crypto         : OpenSSL is configured for kerberos but no krb5.h found
	odbc           : ODBC library - link check failed
	ssh            : OpenSSL is configured for kerberos but no krb5.h found
	ssl            : OpenSSL is configured for kerberos but no krb5.h found

と表示され Erlang/OTP はビルドは完了するが、同様に `erl` で `crypto:start().` 実行時にエラー (下記の `--enable-dynamic-ssl-lib` をさらに追加しても同様)。

https://github.com/Homebrew/homebrew/blob/master/Library/Formula/erlang.rb

を見ると

	--enable-dynamic-ssl-lib
	--with-ssl=#{Formula["openssl"].opt_prefix}

としているようなので、`brew install openssl` してから

	--enable-dynamic-ssl-lib
	--with-ssl=/usr/local/opt/openssl

を追加したところ、無事 [Mac OSXにanyenv/exenvでElixirをインストールする](http://qiita.com/nownabe/items/67a27ddd23652676ffee) の手順で Elixir までインストール完了。

ある人から「事前に homebrew で openssl をインストールしておけば上記 2 つの configure オプションは不要」とも聞いたが、私の方では確認していない。
コマンド実行したらどうなるか事前に確認する

#概要
コマンド実行によってどうなるか事前に確認できる Python 製のツール [maybe](https://github.com/p-e-w/maybe) を使ってみる

コマンド実行によるファイルの作成、削除、移動、パーミッション変更等ファイル操作に関して事前に確認できるらしい
![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/b1870655-f5b3-305e-f514-1ad8576efd42.png)
※公式サイトより

**使用上の注意**

```
That being said, maybe should :warning: NEVER :warning: be used to run untrusted code on a system you care about!
A process running under maybe can still do serious damage to your system because only a handful of syscalls are blocked.
Currently, maybe is best thought of as an (alpha-quality) "what exactly will this command I typed myself do?" tool.
```
#インストール手順

pip でインストール

```
# pip install maybe
```
※Python 2.7+/3.2+ が必要

#maybe の使い方

コマンド実行前に `maybe` を足すだけ

```
$ maybe COMMAND [ARGUMENT]...
```

#使ってみる

```
$ ls
file1  file2  file3
```

**ファイル削除**

```
$ maybe rm -f ./*
maybe has prevented rm -f ./file1 ./file2 ./file3 from performing 3 file system operations:

  delete /home/*******/test/file1
  delete /home/*******/test/file2
  delete /home/*******/test/file3

Do you want to rerun rm -f ./file1 ./file2 ./file3 and permit these operations? [y/N] y
$
```

本当に実行するかどうか聞いてくる


**ディレクトリ/ファイル追加**

```
$ maybe mkdir test ;maybe touch test/file1
maybe has prevented mkdir test from performing 1 file system operations:

  create directory /home/*******/test/test

Do you want to rerun mkdir test and permit these operations? [y/N] y
maybe has prevented touch test/file1 from performing 1 file system operations:

  create file /home/*******/test/test/file1

Do you want to rerun touch test/file1 and permit these operations? [y/N] y
```

**デーモン起動とか**

```
# maybe /etc/init.d/docker start
Starting docker:
maybe has prevented /etc/init.d/docker start from performing 26 file system operations:

  write 33 bytes to /var/log/docker
  create file /root/nohup.out
  write 7 bytes to /var/log/docker
  write 35 bytes to /var/log/docker
  write 1 bytes to /var/log/docker
  create file /var/run/docker.pid
  write 4 bytes to /var/run/docker.pid
  write 91 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 5 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 7 bytes to /root/nohup.out
  write 6 bytes to /root/nohup.out
  write 7 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out
  write 1 bytes to /root/nohup.out

Do you want to rerun /etc/init.d/docker start and permit these operations? [y/N]
```
JAVA Servlet/JSP P157練習問題

▪️sample02.jsp

```jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>お問い合わせフォーム</title>
</head>
<body>
	<form action="sample02/Ex1" method="post">
		名前:<br> <input type="text" name="name"><br>
		お問い合わせの種類:<br> <select name="qtype">
			<option value="company">会社について</option>
			<option value="product">製品について</option>
			<option value="support">アフターサポートについて</option>>
		</select> <br> お問い合わせ内容:<br>
		<textarea name="body">	
	</textarea>
		<br> <input type="submit" value="登録">
	</form>
</body>
</html>
```


▪️Ex1.java Servlet

```java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Ex1")
public class Ex1 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		String name = request.getParameter("name");
	}

}
```

▪️sample02.jsp 実行結果
![スクリーンショット 2016-02-08 15.30.27.png](https://qiita-image-store.s3.amazonaws.com/0/95187/11638ae0-4a47-086d-5d3f-9e695d116346.png)


▪️JSPファイルを直接リクエストできないようにする方法
JSPファイルを「WEB-INF」ディレクトリ以下に配置する
awkで末尾から数えてn番目のフィールドを取り出す。

インフラエンジニアの方なら、調査の時に下記のような感じでawk のprint文を使ってログファイルから必要なフィールドだけ取り出すことも多いと思う。

```bash
# awk '{print $1,$4,$5}' /var/log/httpd/access_log
46.161.9.4 [07/Feb/2016:03:55:32 +0900]
133.130.88.115 [07/Feb/2016:03:58:13 +0900]
142.54.169.164 [07/Feb/2016:04:06:17 +0900]
133.130.88.115 [07/Feb/2016:04:08:13 +0900]
133.130.88.115 [07/Feb/2016:04:18:14 +0900]
157.7.137.160 [07/Feb/2016:04:28:13 +0900]
133.130.88.115 [07/Feb/2016:04:28:13 +0900]
69.30.198.202 [07/Feb/2016:04:35:01 +0900]
```


たまに「一番後ろから数えてn番目の値を取りたいな」って時があると思うが、そんな時に便利なのがawkの組込変数NF。

- [組み込み変数NF(フィールド数) ](http://www.soum.co.jp/misc/naka/awk/4.html#nf)


# $NFで末尾のフィールドだけ取り出す。
* 凡例

```bash

awk '{print $NF}' <ファイル名>
```

例えばapacheのaccess_logの末尾のフィールドだけ取り出すならこんな感じ。

```bash
# awk '{print $NF}' /var/log/httpd/access_log 
Safari/537.36"
2.0.3)"
6.0)"
2.0.3)"
2.0.3)"
2.0.3)"
+http://www.baidu.com/search/spider.html)"
+http://www.baidu.com/search/spider.html)"
2.0.3)"
# 
```

# 末尾から数えてn番目のフィールドだけ取り出す。
* 凡例

```bash

awk '{print $(NF-n)}' <ファイル名>
```

例えばapacheのaccess_logの末尾から3番目、2番目、末尾のフィールドだけ取り出すならこんな感じ。

```bash

# awk '{print $(NF-3),$(NF-2),$(NF -1)}' /var/log/httpd/access_log
like Gecko) Chrome/27.0.1453.93
"-" "check_http/v2.0.3 (nagios-plugins
Media Center PC
"-" "check_http/v2.0.3 (nagios-plugins
"-" "check_http/v2.0.3 (nagios-plugins
- "-" "WordPress/4.4.2;
"-" "check_http/v2.0.3 (nagios-plugins
"Mozilla/5.0 (compatible; MJ12bot/v1.4.5;
"Mozilla/5.0 (compatible; MJ12bot/v1.4.5;
"Mozilla/5.0 (compatible; MJ12bot/v1.4.5;
#
```

awkって高機能で本当に奥が深い。
他にも便利な機能あると思うので、また知ったら書くようにしよう。
【MT】カスタムフィールド（日付）で並び替えをしたときに、同じ日付が複数ある場合の表示順を確かめる

MT6でカスタムフィールドの値で並び替えができます。
カスタムフィールドのオプションは「日付」で作成します。
「日付と時刻」というオプションもありますが、時刻の箇所が自動入力されず、手動で日付を入力（00:00:00形式）する必要があります。
面倒なので日付のみのオプションにします。
ただ、同一の日付が複数ある場合、何を基準に順番を決めているのかわからないので、確かめてみます。

今回作成したカスタムフィールドのベースネームが`entrytime`のため、下記のように記述します。

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>テスト</title>
</head>
<body>

<mt:entries sort_by="field:entrytime">
<mt:If tag="entrytime">
	<p><$mt:EntryTitle$></p>
</mt:If>
</mt:entries>

</body>
</html>
```

`<mt:entries sort_by="field:entrytime">`でカスタムフィールドの値で並び替えをしています。
`<mt:If tag="entrytime">`で日付の入力がある記事のみ表示しています。

3件登録したが表示結果です。

```
カスタムフィールド値（2016-02-01）公開日（2016-02-08 00:10:00）
カスタムフィールド値（2016-02-01）公開日（2016-02-08 00:05:00）
カスタムフィールド値（2016-02-01）公開日（2016-02-08 00:00:00）
```

カスタムフィールドの値（日付）が同じときは、公開日の日時を基準に順番が決まるみたいです。

ちなみに`<mt:entries sort_by="field:entrytime" sort_order="ascend">`と古い順に指定しても表示結果は変わりませんでした。
カスタムフィールドだから`sort_order="ascend"`が効かないのかな・・・
iTunes Connect で 過去バージョンのリジェクト内容を見る方法

過去バージョンのリジェクト内容を見る方法を紹介します。

## 1. アプリのApple IDを確認

iTunes Connectにログインして、Apple IDを確認します。

![スクリーンショット_2016-02-08_14_18_26.png](https://qiita-image-store.s3.amazonaws.com/0/1901/b29821e1-5ccd-0d59-c7bd-5d896f5431ab.png)

## 2. 下記URLにアクセスしJSONを取得

URLの[Apple ID]の部分を先ほど確認したものに置き換えてください。

```
https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/apps/[Apple ID]/stateHistory?platform=ios
```

すると、今までのバージョン一覧が取得出来ます。
![スクリーンショット_2016-02-08_14_20_24.png](https://qiita-image-store.s3.amazonaws.com/0/1901/9f3ee06f-5a29-69d6-9531-10e5d4cfa59a.png)


## 3. 確認したいversionIdをコピーして、下記URLにアクセス

[Apple ID]と、[Version ID]をURLに当てはめると、リジェクト情報を確認出来ます。

```
https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app/[Apple ID]/platform/ios/versions/[Version ID]/resolutioncenter
```
![スクリーンショット_2016-02-08_14_24_36.png](https://qiita-image-store.s3.amazonaws.com/0/1901/5846fbd6-7bc8-c384-2a70-21f12cb061d3.png)

## 最後に

何度もバージョンアップしてきたアプリは確認が面倒なので、App Storeバージョンページから、リジェクトされたバージョンを確認すると手間が省けますね。
[アクティビティ] > [App Store バージョン]
[https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app/[Apple ID]/activity/ios/versions](https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/ra/ng/app/[Apple ID]/activity/ios/versions)

ではまた！
PHPの Closure で bind 済みかどうか調べる

PHPの [Closure::bind](http://jp2.php.net/manual/ja/closure.bind.php) 機能。
なんらかのクラスをバインドすれば、関数内でそのクラスを `$this` として使える。

けど、「**そのClosureがすでにbind済みかどうか**」を知る方法が標準では無さそう。
でも知りたい。

バインドしたのとしてないのとを比べ、[ReflectionClass](http://php.net/manual/ja/class.reflectionclass.php)とかいろいろ試したけど違いが発見できなかった。
試しに [var_dump](http://php.net/manual/ja/function.var-dump.php) すると、違いが出た。

```php
// バインドしてないクロージャ
object(Closure)#2 (0) {
}

// バインドしたクロージャ
object(Closure)#3 (1) {
  ["this"]=>
  object(className)#1 (1) {
    ["className"]=>
    string(1) "className"
  }
}
```

もうこれを文字列として見るしかない！

```php:バインドされたクラス名を取得する関数
function get_bind(Closure $closure)
{
    ob_start();
    var_dump($closure);
    $dump = ob_get_clean();
    if (preg_match('/\A[^\n]+[\n\s]+\["this"\][^\(]*?\(([^\)]+)\)/s', $dump, $m)) {
        return $m[1];
    }
    return false;
}
```

ということで泥くさい関数のできあがり・・・
AWS SDK for PHP ver1..3の各バージョンが対応しているPHPのバージョン

完全にチラ裏です。

AWSSDKの公式ドキュメントにver1以外、PHPの対応バージョンが明示的に記述している箇所が見当たらなかったので、AWS SDKv2以上はcomposer.jsonから抜粋しました。

## AWS SDK ver1

- 対応PHPバージョン
version 5.2 or newer. PHP 5.2.17 or 5.3.x

- 記載場所
http://docs.aws.amazon.com/AWSSDKforPHP/latest/

## AWS SDK ver2

- 対応PHPバージョン
version 5.3.3 以上

- 記載場所
https://github.com/aws/aws-sdk-php/blob/2.8/composer.json


## AWS SDK ver3

- 対応PHPバージョン
version 5.5 以上

- 記載場所
https://github.com/aws/aws-sdk-php/blob/master/composer.json
CGAffineTransformの適用順に関して

CGAffineTransformは、逆順に適用される。
例えば、アンカーを指定して拡縮する処理をきちんと考えてみた。

アンカーを指定して拡縮するCGAffineTransformは以下で作れる。

```swift:CGAffineTransformMakeWithAnchor
var transform = CGAffineTransformMakeTranslation(anchor.x, anchor.y) //1: anchor分移動
transform = CGAffineTransformScale(transform, scaleWidth, scaleHeight) //2: 拡縮
transform = CGAffineTransformTranslate(transform, -anchor.x, -anchor.y) //3: anchorの逆分移動
```

追っていくと、3→2→1の順で実行しないと正しくアンカーを指定して拡縮にならないことが分かる。
結果を見てみると、行列としても以下の様な3→2→1の順でかけたものができている。

![chart.png](https://qiita-image-store.s3.amazonaws.com/0/44356/136aed76-3d59-65b7-a073-4409eee15b23.png)

何か理由がありそうだけど、分からない。
キャッシュについて整理

# キャッシュとは

> 使用頻度の高いデータを高速な記憶装置に蓄えておくことにより、いちいち低速な装置から読み出す無駄を省いて高速化すること。また、その際に使われる高速な記憶装置や、複製されたデータそのもののこと。
> - [IT用語辞典](http://e-words.jp/w/%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5.html)

Webサイトの表示においては、一度アクセスしたページのデータを特定の場所に保存することで、**次回アクセス時の表示を速く**し、**サーバへの無駄なリクエストを減らせる**というメリットがあります。また一口にキャッシュといっても下記の2種類があるので、どちらを指しているのか（あるいは両方か）意識しておきましょう。

* ブラウザのキャッシュ：そのパソコンのユーザーが見たページのデータがローカルに溜まっていく。
* キャッシュサーバのキャッシュ：不特定多数のユーザーが見たページのデータがネットワーク上に溜まっていく。

# キャッシュの制御方法

## ✏️ HTTPレスポンスヘッダ で制御

#### ➡️ Cache-Control ヘッダ

ブラウザやキャッシュサーバに対して、キャッシュの動作や有効期限を指定するためのものです。

| ディレクティブ（コマンド） | 説明 |
| --- | --- |
| must-revalidate | キャッシュが期限切れだった場合、オリジンサーバでの確認無しにキャッシュを利用してはならない |
| no-cache | オリジンサーバでの確認無しにキャッシュを利用してはならない|
| no-store | リクエスト、レスポンスの一切を保存してはならない|
| no-transform | 中継者は形式変換してはならない（画像の再圧縮等を防ぐ）|
| public | 複数ユーザーで共有できるようにキャッシュしてよい（主にキャッシュサーバ）|
| private | 特定ユーザーだけが使えるようにキャッシュしてよい（主にブラウザ）|
| proxy-revalidate | privateキャッシュには適用されないことを除き、must-revalidateと同じ|
| max-age | キャッシュの有効期限を設定する（秒数）|
| s-maxage | 共有キャッシュにおいて、max-ageディレクティブまたはExpiresヘッダで指定された値を上書きする|


#### ➡️ Expires ヘッダ
```
Expires "Mon, 26 Jul 1997 05:00:00 GMT"
```
キャッシュの有効期限を指定します。Cache-Control: max-age と同じですが、 [Google Developers](https://developers.google.com/speed/docs/insights/LeverageBrowserCaching) によると、

> より広くサポートされているため、Cache-Control: max-age よりも Expires をおすすめします

とのこと。

#### ➡️ ETag ヘッダ
同じファイルかどうか比較するための検証子です。一意に識別する値（バージョンやコンテンツハッシュ）を設定。ブラウザからのIf-None-Match リクエストヘッダと比較判断します。

#### ➡️ Last-Modified ヘッダ
同じファイルかどうか比較するための検証子です。最後に改変された日付時刻を設定。ブラウザからのIf-Modified-Since リクエストヘッダと比較判断します。

ETagとLast-Modifiedは両方指定すると冗長になるので、どちらかだけでOK。

#### ➡️ Vary ヘッダ
指定したヘッダ（言語、ユーザーエージェント等）毎に応答表現が変わることを伝えます。
これにより、例えば同一URLでPC向け・スマホ向けページを出し分けている場合、それぞれでキャッシュを持つことが出来ます。


## ✏️ HTMLの`<meta>`タグで制御
HTML4.xでは`<meta>`タグでブラウザキャッシュの制御が可能です。(ただしキャッシュサーバのキャッシュを使用してしまう可能性は残ります。）

* キャッシュさせない

```html
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
```

* キャッシュの有効期限を設定

```html
<meta http-equiv="Expires" content="Tue, 16 Feb 2016 14:25:27 GMT">
```

HTML5ではhttp-equiv属性に対してキャッシュに関するキーワードを設定することは出来ません。

> Pragma directives corresponding to headers that affect the HTTP processing model (e.g. caching) must not be registered
> - [4.2.5.4 Other pragma directives](https://www.w3.org/TR/html5/document-metadata.html#pragma-directives)


 なおWebアプリをオフラインで使う目的で策定が進められていた[Application cache APIは廃止予定](https://www.fxsitecompat.com/ja/docs/2015/application-cache-api-has-been-deprecated/) とのことです。


## 参考サイト
 * [RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching](https://tools.ietf.org/html/rfc7234#section-5.2.2)
 * [ブラウザのキャッシュを活用する |PageSpeed Insights | Google Developers](https://developers.google.com/speed/docs/insights/LeverageBrowserCaching)
 * [HTTP キャッシュの作成 | Web Fundamentals - Google Developers](https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=ja#cache-control-)
 * [ブラウザのキャッシュコントロールを正しく理解する - Qiita](http://qiita.com/hkusu/items/d40aa8a70bacd2015dfa)
 * [ブラウザキャッシュのまとめ - Please Sleep](http://please-sleep.cou929.nu/browser-caching-tutorial-memo.html)
スマホ全盛期の今、フィーチャーフォンのサイトで広告収益を上げる方法

# 背景
スマホユーザは右肩がり、フィーチャーフォンユーザは右肩下がりだが、
いまだに一定数フィーチャーフォンユーザはいる。
なので、フィーチャーフォンサイトにも広告を掲載して収益をあげようとしてみる。

# まずはフィーチャーフォンの広告を取り扱っている会社を探す
ほとんどない。
見つけられたのは2社だけ。
* Yahoo!
* D2C
となればまずはYahoo!を使うでしょ。

# しかし、Yahoo!にどうやって申し込めばいいかがわからない
とりあえずでてきた電話番号にかけて聞いてみることにする
→ 申し込みページを丁寧に説明してくれて無事解決
ただ、もう一度探せと言われたら激ムズなので、メモがてら残しておく

# Yahoo!に申し込む手順

### Yahoo!トップにアクセス

![スクリーンショット 2016-02-08 14.25.42.png](https://qiita-image-store.s3.amazonaws.com/0/15820/5ab049e6-8a70-9362-87c8-ef7477304283.png)

### スクロールしていくと、左カラムに「ビジネスで活用するなら」と出てくる
### ここの、「ヤフーの広告でサイト集客」をクリック
![スクリーンショット 2016-02-08 14.26.32.png](https://qiita-image-store.s3.amazonaws.com/0/15820/9f181801-7ec4-2209-b520-75199fc31846.png)


### 遷移先はこちら。左上の「YAHOO!プロモーション広告」ロゴをクリック

![スクリーンショット 2016-02-08 14.26.57.png](https://qiita-image-store.s3.amazonaws.com/0/15820/e8e64981-cb13-a7b9-72c9-f167ba8bfce4.png)

### 右上の検索窓で`媒体`と検索
![スクリーンショット 2016-02-08 14.27.07.png](https://qiita-image-store.s3.amazonaws.com/0/15820/20366512-2989-18ea-9751-8335939d6371.png)

### 一番上に出てきた「YDN」リンクをクリック

![スクリーンショット 2016-02-08 14.27.48.png](https://qiita-image-store.s3.amazonaws.com/0/15820/7191fde0-26f7-f453-bb42-5a94fd9f6f7b.png)

### やっと望んでいたページに到着。スクロールしていくと、

![スクリーンショット 2016-02-08 14.28.54.png](https://qiita-image-store.s3.amazonaws.com/0/15820/ac0b7bd8-49df-25f6-8e80-88128a5fa518.png)

### あった！「お申し込み」
http://marketing.yahoo.co.jp/service/promo/partner/
![スクリーンショット 2016-02-08 14.29.18.png](https://qiita-image-store.s3.amazonaws.com/0/15820/30d2c450-55ab-0242-725f-16fdabb5034c.png)

# その後の展開
についてはまた今度。
『java.nio.charset.IllegalCharsetNameException: 'UTF-8'』まさかの原因。

私の場合、EntityUtils.toString(res.getEntity(), "UTF-8")
で何故かとあるサイトだけ『java.nio.charset.IllegalCharsetNameException: 'UTF-8'』という例外を発生させてしまう現象に悩まされていました。
UTF-8が間違っているわけも対応しているわけもなく謎でした。

原因は分かりました。
それはそのサーバーシステムがおそらくhttpの規格を順守していないためです。

なぜ気づくのが遅かったのか、それは
『java.nio.charset.IllegalCharsetNameException: 'UTF-8'』という例外メッセージを見て下さい。
『'UTF-8'』この『』ないすべての文字列が文字コード名として認識されていました。
『'』は例外メッセージを生成する過程で勝手についたかのような感じだったため、解決に時間を要してしまいました。
（ウル覚えですが、『"』なら使えたはずです）

↑↑
※html内ではなくヘッダ上の文字コード指定です。

ちなみにこのサーバーの生成したhtmlはname属性も『"』などで区切ってもいませんでした。↓
```html:武.html
<input name=user_id>
```

サーバー開発者に怒りを感じた事例でしたとさ。
もしかしたら同じことに悩まされている人もいるのではと思い、原因を乗せておきます。
Homebrewでインストールしたあいつらを丁寧にアップデートする

【コメント頂いて書き直しました】

[homebrew](http://brew.sh/index_ja.html) でパッケージの管理をするのはいいんですが、開発の都合上一部のツールのバージョンを上げられない・・・というシーンはままあるかと思います。
かといって`outdated`なパッケージを放置するのも気持ち悪いですよね。

そんな「`brew upgrade`で全てのパッケージをアップデートしたら色々死ぬわ！」という場合によく使うのでメモ書き。

```zsh
$ brew update && brew outdated # 更新が必要なパッケージの一覧を取得、確認。
  ...
  ...
$ brew outdated \
    | awk '{print $1}' \
    | grep -v 'elasticsearch' \
    | grep -v 'mongo'         \
    | xargs -n 1 brew upgrade
```

`brew outdated`で リスト化して、`grep -v` [^1] でそっとしておいて欲しいパッケージ（例では`Elasticsearch`と`Mongo DB`）を除外して、`xargs`で`brew upgrade`。シンプル。
[fzf](https://github.com/junegunn/fzf) とか [peco](https://github.com/peco/peco) とか駆使すれば、もっとホスピタリティの高い感じにできると思うけど、まァ良いかという気持ち。

[^1]: `grep`は[coreutils](http://www.gnu.org/software/coreutils/coreutils.html)入れてる環境とか考えると、BSD/GNUの仕様誤差がめんどくさいので、grep -v 'hoge'を二重にパイプしてます。</small>
Cloudera Managerでホストを追加するときは言語設定に注意

登記の変更が終わったので心置きなくITの活動ができるようになりました。
[Clouera Advent Calendar](http://qiita.com/advent-calendar/2015/cm)に登録できればよかったのですが、まずはこのネタで投稿しようと思います。

Cloudera ManagerでCentOSのホストを追加するときにOSの言語が日本語のままだとインストールに失敗します。
そんな時は下記の設定をしておく必要があります。

* CentOS6系

```bash
sed -i 's/ja_JP/en_US/' /etc/sysconfig/i18n
```

* CentOS7系

```bash
sed -i 's/ja_JP/en_US/' /etc/locale.conf
localectl status
source /etc/locale.conf
```
KKPに接続がうまく出来ない問題を解決する。

##電源をONにする。
![IMG_20160208_135516_jpg.png](https://qiita-image-store.s3.amazonaws.com/0/99731/fe79701e-c214-e784-d4df-77ebabecb394.png)

##ペアリングモード
LEDが点滅して、アプリと接続可能な状態になる。

![IMG_20160208_135523_jpg.png](https://qiita-image-store.s3.amazonaws.com/0/99731/77c19956-6080-422d-5e66-1e0b397f7723.png)

##スリープモード
ペアリングモードになってから30秒間接続がない場合、LEDが消えて、スリープモードに入る。もちろんアプリとの接続は出来ない。KKPのボタンを適当に押せば、スリープが解除され、再びペアリングモードに入る。

![IMG_20160208_135521_jpg.png](https://qiita-image-store.s3.amazonaws.com/0/99731/d574308e-41f7-2d92-14f3-5a4f1db87dac.png)

##接続された時
アプリとKKPが接続されると、KKPのLEDは消える。

##アプリとKKPの接続が切れた時

KKPと接続しているアプリを終了した場合２パターン
LEDの点滅からどっちのパターンなのか判断する。

1,KKPペアリングモード(LED点滅) 90%
2,KKP再接続モード(LED消灯) 10%


ADKの接続の処理を間違えると、安定して接続できないことがあった。
下のコードで安定したかも。

```java

umaApplication.create(this);
UMAHIDManager HIDManager = (UMAHIDManager) umaApplication.getUMAService(UMAApplication.UMA_HID_SERVICE);
if (HIDManager.isBLESupported()) {
    HIDManager.enableAutoConnection(5000, 5000, 5000);
    if (!HIDManager.connectLastConnectedDevice(5000)) {
        HIDManager.startDiscoverDevice();
    }
}

```
CS-Cart: Smartyプラグインを追加する方法

CS-CartのテンプレートエンジンはSmartyですが、Smartyはヘルパー(プラグイン)を追加することができます。ここでは、CS-CartでSmartyプラグインを追加する方法を紹介します。また、Smartyのプラグインの実装方法は割愛します。

## アドオンにSmartyプラグイン置き場を作る

場所は特に決まりはないのですが、`app/addons/$addon_id/functions/smarty_plugins`にします。

```console
$ mkdir -p app/addons/$addon_id/functions/smarty_plugins/
```

## フックを設定する

テンプレート初期化フックにかんで、Smartyプラグインを登録するコードを実装します。

```php:app/addons/$addon_id/init.php
fn_register_hooks(
    'init_templater_post'
);
```

```php:app/addons/$addon_id/func.php
function fn_{addon_id}_init_templater_post(Tygh\SmartyEngine\Core $view)
{
    $view->addPluginsDir(__DIR__ . '/functions/smarty_plugins');
}
```

## Smartyプラグインを実装する

最後にSmartyプラグインを実装したファイルを、プラグイン置き場に置いて完成です。

```php:app/addons/$addon_id/functions/smarty_plugins/function.hello_world.php
<?php

function smarty_function_hello_world($params, &$smarty)
{
    return 'hello world';
}
```
Boot CampでGoogle 日本語入力を使うときに設定すべきことは１つだけある

## Google 日本語入力 Windows 版 build 2410
###### と書いたもののだいぶと前からある話だったはず。~~なのでBoot Campでコーディングは気が引けてました。~~
<br>
#### まず標題に違和感を覚える方がいるかもしれません。以下２つの手法があると思います。
1. eisuu入力するときにサジェストされるのを活用して単語の文字補完　　　　　 //初期設定
2. eisuu入力するときはIMEの機能から抜けだしてキー配列通りの文字を入力する //カスタマイズ

# [1.]が好みの方は話は以上です。 [2.]の各位は以下をどうぞ
[1.]だとコーディングするときいちいちサジェスト表示された挙句入力を確定するのに
わざわざenterキー(returnキー)押す必要があり**無駄**。

以上より[2.]の手法を実践することにしました。

<br>
今回の環境はMacBook Pro (Retina, 13-inch, Early 2015):JIS配列且つWindows 10です。
各位仕様に合わせて読み替えていただければと思います。

・1. capsキーで半角・全角の切り替えをすることになると思いますが[1.]のようになります。
・2. タスクバー上にあるGoogle 日本語入力のアイコン左隣の文字を右クリックすると
　　 機能一覧が表示されプロパティを選ぶ事ができます。
・3. プロパティを選びまして[ 一般タブ ]のキー設定:キー設定の選択から[ 編集 ]をクリックしまして下の方

```
---------------------------------------------------------------
　　　　モード　　　　|　　入力キー　　|　　　　　コマンド　　　　　|
---------------------------------------------------------------
入力文字なし　　　　　|Eisu　　　　　　|英数入力切り替え　　　　　　|
```

これを

```
---------------------------------------------------------------
　　　　モード　　　　|　　入力キー　　|　　　　　コマンド　　　　　|
---------------------------------------------------------------
入力文字なし　　　　　|Eisu　　　　　　|IMEを無効化　　　　　　　　|
```

に変えてください。
・4. 最後に今一度、タスクバー上にあるGoogle 日本語入力のアイコン左隣の文字を左クリックしてください。
・5. お疲れ様です。

Boot Campでも快適にコーディングできます。
phina.jsの個人的TIPS

# 全般
- [phina.js公式サイト](http://phinajs.com/)　公式サイト
- [phina.js 2015 アドベントカレンダー](http://qiita.com/advent-calendar/2015/phinajs)　大体何ができるかわかる
- [動作サンプル](http://phi-jp.github.io/phina.js/test/game/index.html)　実際のできることがわかる

## Shape
- hige

## Scene
- [ManagerSceneでゲームの流れを管理しよう](http://github.dev7.jp/b/2015/12/01/phinaadvcal20151202/)
- moge
# memo

詰まったところとかを書く