OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7調査(27)foreachでの内部ポインタの使い方を変更・整理

PHP5までの`foreach`では、配列の内部ポインタに関連して説明しづらい未定義の挙動がありました。これがPHP7で整理されました。

# 値渡しの`foreach`ループで配列の内部ポインタを使わなくなった

PHPの配列は、「内部ポインタ」を持った構造になっています。これは「この配列をどこまで読んだか」を管理するもので、`current()`, `next()`, `reset()`といった滅多に使わない関数を実現するのに使われています。


ところで、PHP5までは`foreach`でも内部ポインタが利用されていました。

```
<?php
$a = [1,2,3];
foreach　($a as $v) {
    echo $v . " - " . current($a) . "\n";
}
/*
PHP5での出力
1 - 2
2 - 2
3 - 2
PHP7での出力
1 - 1
2 - 1
3 - 1
*/
```

この例では`foreach`が配列の内部ポインタを使っているため、初回の`current()`のタイミングで配列のコピーオンライトが起こり、上のような出力になります。


PHP7では同じ状況で配列の内部ポインタとは別のポインタが使われるようになりました。そのため、`foreach`ループの内側で`current()`関数などを使った場合の挙動がPHP5までとは変わっています。


また、この変更により配列のコピーオンライトが減り、性能面でもプラスに働くようです。


# 参照渡しの`foreach`ループでは配列の内部ポインタを使う（PHP5と同じ）

`foreach`ループで配列を参照渡しした場合は基本的にPHP5と同じで、内部ポインタが使われます。大半の挙動はPHP5と変わっていませんが、一部のエッジケースでは挙動が変わることもあるようです。個人的に`foreach`の参照渡しは怖くて使わない派なので詳細は追いかけていませんが、興味がある方はRFCを確認してみてください。

また、`Traversable`なオブジェクトについてはPHP5までと何も変わっていません。`Traversable`以外のオブジェクトの`foreach`は配列の参照渡しと同様の挙動です。


# foreach関連opcodeの新設

PHP5では`foreach`に対応するopcodeは`FE_RESET` `FE_FETCH`でした。これが、PHP7では値渡しの`foreach`用の`FE_RESET_R` `FE_FETCH_R`および参照渡しの`foreach`用の`FE_RESET_RW` `FE_FETCH_RW`に分かれました。

また、PHP5では配列に対応するテンポラリ変数の解放に`FREE` opcodeが使われていましたが、PHP7では新設された`FE_FREE` opcodeを使うようになりました。

# 参照

* [PHP RFC: Fix "foreach" behavior](https://wiki.php.net/rfc/php7_foreach)
Laravel 4.2のPDFファイル作成

Laravel 4.2にPDFファイルを自動生成する機能を追加したのでレポートします。

tcpdfとdompdfを試しましたが、今回はtcpdfの手順のみとレポートさせていただきます。https://github.com/tecnickcom/TCPDF

まず、インストールです。composer.jsonに次のコードを追加して、`composer update`を実行します。

```json
"tecnick.com/tcpdf": "6.*",
```

インストールが完了したら、早速次のテストコードを試しましょう。

```php
Route::get('/test_pdf', function() {
    $html = View::make("mypdf");
    $filename = "mypdf";

    $pdf = new TCPDF();
    $pdf->addPage();
    $pdf->writeHTML($html, true, false, true, false, '');
    $pdf->output($filename);
    exit;
});
```

うお！pdfが生成されました。しかし、日本語文字が表示されません！それは困ります。

デフォルトで使われているフォントはascii以外の文字が対応しないので、手動で日本語のフォントをインポートしないと、日本語が出ません。

日本語をインポートする関数はtcpdfのライブラリーの中に用意されています。<project root>/vendor/tecnick.com/tcpdf/toolsの中にtcpdf_addfont.phpがあります。それを実行すればフォントがインポートされます。

今回はipaxegというオープンフォントを利用します。そのサイトからipaexg.ttfをダウンロードします。
http://ipafont.ipa.go.jp/

そして、ダウンロードしたipaexg.ttfを先ほど話したtcpdf_addfont.phpを利用してフォントをインポートします。(tcpdf_addfont.phpに関する詳細は同じフォルダのconvert_fonts_examples.txtを参照してください。)

```bash
php ./tcpdf_addfont.php -b -t TrueTypeUnicode -f 32 -i ./ipaexg.ttf
```

最後に、先ほどを動かしたテストコードにsetFontを足してipaexg日本語フォントをインポートします。

```
Route::get('/test_pdf', function() {
    $html = View::make("mypdf");
    $filename = "mypdf";

    $pdf = new TCPDF();
    $pdf->setFont('ipaexg','',15);  // ipaexg日本語フォントをインポート
    $pdf->addPage();
    $pdf->writeHTML($html, true, false, true, false, '');
    $pdf->output($filename);
    exit;
});
```

これで、日本語も表示されてpdfが自動生成されました。

## 補足

以前dompdfを試しましたが、tcpdfと同じで日本語が表示されませんでした。対策として、このコマンド、`php vendor/dompdf/dompdf/load_font.php ipaexg ipaexg.ttf`を実行しましたが、load_font.phpにエラーが発生しました。どうやらフォントのインポートがうまく処理されていないことが原因のようです。

もし、dompdfで日本語問題を解決した方がいればぜひ手順を教えていただきたいです。
Excel > 印刷時に図の位置がずれる

```txt:動作環境
Windows 8.1 pro
Excel 2013
```

[こちら](http://faqdb.geo.jp/faq/microsoft-excel-%E3%81%A7%E3%80%81%E5%8D%B0%E5%88%B7%E6%99%82%E3%81%AB%E5%9B%B3%E5%BD%A2%E3%81%8C%E3%81%9A%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95-18)の方法2でずれるのを回避できた。

書式タブ > サイズ > プロパティ > セルに合わせて移動やサイズ変更をする、にチェックする
様々なメーカーのterminal length 0的なやつ

```lang:Cisco_IOS
#terminal length 0
```
```lang:Cisco_WLC
config paging disable
```
```lang:DELL_powerconnect
#terminal length 0
```
```lang:Cisco_ASA
#terminal pager 0
```

```lang:Juniper_Junos
#set cli screen-length 0
#set cli screen-length 24
```

```lang:Juniper_SSG
#set console page 0
#unset console page
```

```lang:Juniper_SRX
#show configuration | no-more
```

```lang:Brocade
#skip-page-display
#page-display
```

```lang:paloalto
#set cli pager off
#set cli pager on
```

>https://blog.daichang.me/?p=153
Gitの内部構造を利用して、特定のディレクトリだけcloneする方法

ディレクトリ単位でgit clone/fetchする方法を探していました。sparsecheckoutを利用するという方法も紹介されいましたが、その方法の場合、「最初に普通にcloneする必要がある」というところが、いま探している用途には向いていなかったので別の方法を探してみました。

## Gitの内側 

まずは、Gitの仕組みを調べるところから始めました。[Gitの内側](http://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4)を読むと、Gitの中でどのように変更履歴やディレクトリ構造が保存されているのかがよくわかりました。

+ 変更履歴・ディレクトリ構造を、commit object, tree object, blob objectのグラフで表現している。
+ tree objectには、ディレクトリ中にある、ディレクトリ名やファイル名が保存される。
+ blob objectには、ファイルのコンテンツが保存される。

git構造
![git構造](https://qiita-image-store.s3.amazonaws.com/0/12268/66400db2-392c-19fe-c825-ab57953b100c.png)

+ cloneするときは、指定したbranchやclone元レポジトリのHEADに紐づく、objectを取得することになる。
+ shallow cloneするときは、branch名等で指定されたcommitの親は辿らずに、参照できるコミットを取得するのだろう。

shallow cloneしたとき図（赤黄緑だけcloneする）
![shallow cloneしたとき図](https://qiita-image-store.s3.amazonaws.com/0/12268/c52076cf-7304-92bf-933f-24172ca8f5fe.png)

## ディレクトリ単位でcloneする方法

Gitの内側を調べてみると、cloneする対象は、指定されたcommit objectとから辿ることが出来る範囲にしぼられることが分かります。ということは、cloneしたいディレクトリ以下のみを辿るcommit objectを作っちゃえば、ディレクトリ単位でgit cloneできるんじゃないかと考えました。

ディレクトリ単位でgit cloneする時の図
![ディレクトリ単位でgit cloneする時の図](https://qiita-image-store.s3.amazonaws.com/0/12268/5223d780-f60c-716d-6287-52eb5b159d2e.png)

具体的には、clone元のレポジトリで、cloneしたいディレクトリのtree objectのsha1を調べて、そのobjectを指すcommit objectを作り、さらに、そのcommitを指すブランチやタグを作ります。そしてcloneする際は、作成したブランチを指定してcloneしてやります。

以下、bashでこの操作をやったときの例。

```
# clone元レポジトリで事前にやっておくこと。
declare BASE_HASH="692c6c9"
declare TARGET_DIR="directory_name"

TREE_HASH=$(git rev-parse $BASE_HASH:$TARGET_DIR)
COMMIT_HASH=$(git commit-tree $TREE_HASH -m 'clone')
git tag -a clone_tag -m 'clone_tag' $COMMIT_HASH

# cloneするときの操作
git clone -b clone_tag (clone元レポジトリのurl)
```
ここでは、cloneで書きましたが、作成したtagやブランチを指定して、fetch/checkoutすることも出来ます。ただ、任意のディレクトリをclone出来るというやり方ではないので、チーム内で運用ルールを決めるなり、何かのツールの形にまとめるなりといった工夫は必要になりそうです。例えば。

+ コミットする際、上記の操作を自動で行い、pushするときclone_tagも一緒にpushするスクリプトを準備するとか.
+ clone元レポジトリにhookを仕込んで、pushされたら、上記操作を行うとか。

最後に、その他の懸念点を。

+ 親が居ないcommitだと、90日後にgit gcの対象になって消されてしまうかもしれない。確認してないです。
+ 自分の場合、データを取得することのみが必要だったのでこの方法で大丈夫でしたが、 「ディレクトリ単位で取得し、変更コミット、元のブランチにマージ」と言った用途の場合、もうひと工夫必要になりそう。
URLをリンクにする（但しすでにリンクになっていたら無視）

- [preg_replace_callback](http://php.net/manual/ja/function.preg-replace-callback.php) でゴリ押しする方法
- 否定戻り読みを使う方法

いまさら感の拭えないタイトルではありますが、意外と「すでにリンクになっている場合もある」想定のノウハウが見つかりませんでした。

# preg_replace_callback でゴリ押しする方法

```php
/**
 * @param string $body 処理対象のテキスト
 * @param string|null $link_title リンクテキスト
 * @return string
 */
function url2link($body, $link_title = null)
{
    $pattern = '/(href=")?https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+/';
    $body = preg_replace_callback($pattern, function($matches) use ($link_title) {
        // 既にリンクの場合や Markdown style link の場合はそのまま
        if (isset($matches[1])) return $matches[0];
        $link_title = $link_title ?: $matches[0];
        return "<a href=\"{$matches[0]}\">$link_title</a>";
    }, $body);
    return $body;
}
```

## 使い方

```php
// リンクタイトルなし
echo url2link($body);
// リンクタイトルあり
echo url2link($body, "詳細はこちら");
```

[デモ](https://wandbox.fetus.jp/permlink/dMsAkR6MjLpEetpI)

## 解説

preg_replace_callback はその名の通り、正規表現にマッチした対象をコールバックで逐次処理する関数です。
コールバックで処理するため、よりきめ細やかな置換処理ができるのはもちろんのこと、コールバックの中でさらに置換するかしないかの判断ができるというメリットがあります。

つまり上記コードで、正規表現状は `(href=")?` とあるように、href 属性の形になっていてもなっていなくてもマッチするように書いていますが、コールバックの中で `href="` にマッチしている場合は対象を置換せずにそのまま返却することで、置換をキャンセルしています。

たとえばさらに Markdown スタイルのリンクもキャンセルしたいならば、先頭のマッチグループを `(href="|]\()?` とすればOKです。

`/(href="|]\()?https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+/`

# 否定戻り読みを使う方法

正規表現の高等テクニックとして

- 肯定先読み `(?=regex)`
- 否定先読み `(?!regex)`
- 肯定戻り読み `(?<=regex)`
- 否定戻り読み `(?<!regex)`

> 参考: [正規表現（肯定先読み、否定先読み、肯定戻り読み、否定戻り読み）](http://d.hatena.ne.jp/satosystems/20100519/1274237784)

というものがあります。このうち**否定戻り読み**を使って `href="` が前方にくっついている場合は**そもそもマッチしない**正規表現をつくることができます。
キャンセル処理が不要なのでこちらのほうがスッキリします。

```php
/**
 * @param string $body 処理対象のテキスト
 * @param string|null $link_title リンクテキスト
 * @return string
 */
function url2link($body, $link_title = null)
{
    $pattern = '/(?<!href=")https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+/';
    $body = preg_replace_callback($pattern, function($matches) use ($link_title) {
        $link_title = $link_title ?: $matches[0];
        return "<a href=\"{$matches[0]}\">$link_title</a>";
    }, $body);
    return $body;
}
```

[デモ](https://wandbox.fetus.jp/permlink/COlUdPoGHzkPqtMT)

こちらもさらに Markdown スタイルのリンクを除外する場合は `(?<!href="|]\()` とすればOKです。

`/(?<!href="|]\()https?:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:@&=+$,%#]+/`



---

否定戻り読みを使う方法のほうが正攻法だとは思いますが、あまり知られていなかったり覚えていないこともあるかと思います。preg_replace_callback を使えば、平易な表現でも高度な処理に手が届くなと思い、２つの方法を紹介しました。
Goutteでリダイレクトされたとき

[Goutte](https://github.com/FriendsOfPHP/Goutte)使ってスクレイピングをするとき、例えば格闘技のサイトで、選手の名前を取得したいとき、こんなコードかくと思います。

```php
$client = new Client();
$crawler = $client->request('GET', 'http://hogehoge.com/fighter/100');
$name = $crawler->filter('#fighter_name')->first()->text();
```

ただ、URLが存在しない場合、上記だと100番目の選手が存在しない場合、トップページとかに飛ばされると思います。
このとき、#fighter_nameな要素が存在しないと、データが取得できなくて例外が投げられてしまいます。
うーん、例外をキャッチしてもいいんですけど・・・。

# どうしたか

色々調べたら、ClientがURLの履歴を管理していることが分かりました。
リダイレクトした場合、最新にrequest時のURLではなく、リダイレクト後のURLが挿入されます。
なので、こんな風にするとリダイレクトしたかどうかがわかると思います。

```php
$targetUrl = 'http://hogehoge.com/fighter/100';
$client = new Client();
$crawler = $client->request('GET', $targetUrl);
$currentUrl = $client->getHistory()->current()->getUri();
if ($targetUrl !== $currentUrl) {
    // リダイレクト
}
```

私の場合、色んなリダイレクトが発生するようなサイトのスクレイピングに挑戦したので、リダイレクト先を判断するために、最初はリダイレクト後に固有で存在する要素をチェックしてました。
が、面倒だったため、crawlerで要素を取得する前にリダイレクトしてないか、した場合はリダイレクト先はどこなのかを、必ずURLで確認するようにしました。
クライアントPC追跡

#192.168.x.xのmacアドレスを調べる

```
catalyst#show ip arp 192.168.x.x
Protocol  Address          Age (min)  Hardware Addr   Type   Interface
Internet  192.168.x.x         0   1234.5678.abcd  ARPA   Vlan100
```
```
SSG140-> get arp all
-----------------------------------------------------------------------------------------
             IP           Mac          VR/Interface  State   Age  Retry  PakQue  Sess_cnt
-----------------------------------------------------------------------------------------
192.168.168.xxx  12345678abcd     trust-vr/eth0/9.5    VLD  1192      0       0     7
```

#アップリンク先を調べる
```lang:cisco
catalyst#show mac address-table address 1234.5678.abcd
Unicast Entries
 vlan     mac address     type        protocols               port
---------+---------------+--------+---------------------+-------------------------
 100      1234.5678.abcd   dynamic ip,ipx,assigned,other GigabitEthernet2/30
```

```land:dell
pc# show bridge address-table
  Vlan        Mac Address       Port     Type
-------- --------------------- ------ ----------
  111      12:34:56:78:ab:cd    e10    dynamic
```

参考URL:http://www.infraexpert.com/study/tea1.htm
unwindSegueで元の画面へ戻る時のメソッド実行順

すごいハマって時間を浪費したのでメモ。

【現象】
unwindSegueでTableViewControllerから元の画面へ戻って値を渡そうとした際に、tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)で共通変数に値を入れて値渡しをしようとしても、あれ？値が渡せない。。って状態になった。

【原因】
メソッドの実行順として、didSelectRowAtIndexPathはprepareForSegueやunwindSegueで呼び出される処理よりも後に実行されるため

【検証】
以下のように画面Aから画面Bへ戻る場合を想定。

![blogimage1.png](https://qiita-image-store.s3.amazonaws.com/0/23504/b6a68d43-3a57-fde1-911e-73155147bc22.png)


準備したメソッドは以下のとおり。

```swift:(A)ViewController.swift
@IBAction func exitFromTableView(segue: UIStoryboardSegue){
        println("exitFromTableView (unwindSegue)")
    }
    
```
*戻ってくる際のunwindSegue用のメソッド


```swift:(B)TableViewController.swift
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
        println("prepareForSegue")
    }

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("didSelectRowAtIndexPath")
    }

```


これでTableViewCellをクリックするとログはこのように出力される。

![スクリーンショット 2015-05-02 14.06.04.png](https://qiita-image-store.s3.amazonaws.com/0/23504/1ebae621-fe71-b8b0-0e3a-594ac71aba8a.png)

まとめると、以下の順番でメソッドは実行されるので
実装する際は注意しよう。

1. prepareForSegue
2. unwindSegueで呼ばれるメソッド
3. Cellがクリックされた時のdidSelectRowAtIndexPathのメソッド


おわり。
名前付の参考記事


## 前置き
名前付けは重要なんですが、わかっちゃいるけど上手い事付けれない。自分自身への苛立ちが収まりません。
世間はGWだっていうのに仕事しているのは、この苛立ちには関係ないはずさと言い聞かせながら書いてます。

さて、言葉のセンスは学べるようで一生身につかない人もいます。私のように。その上残念な感じの英語力が名前付けをさらに難しくしているというジレンマ。
自分で出来ないなら他の方の知恵を参考にするのは当たり前の事でして、いつも名前付で参考にしているの記事等があるのですが、最近増えすぎたのでまとめて公開してみようと思うけですよ。ハイ。
## 名前の重要性
* [[ソフト開発]きれいなソースコードを書くために必要な、たったひとつの単純な事](http://d.hatena.ne.jp/r-west/20090510/1241962864)

## 名前の付け方参考記事
* [Qiitaのnamingタグ](http://qiita.com/tags/naming/items)
* [QiitaのEnglishタグ](http://qiita.com/tags/English/items)
* [Naming -名前付け-](http://qiita.com/Koki-Shimizu/items/f3d3e824f98d182d4100)
* [モデルやメソッドに名前を付けるときは英語の品詞に気をつけよう](http://qiita.com/jnchito/items/459d58ba652bf4763820)
* [ネイティブと働いて分かった英語コミットメッセージの頻出動詞10つ](http://qiita.com/gogotanaka/items/b65e1b081fa976e5d754)
* [英語のコメントや issue で頻出する略語の意味 (FYI, AFAIK, ...)](http://qiita.com/uasi/items/86c3a09d17792ab62dfe)
* [メソッド名をシンプルにするために、知っておくと便利な英語のprefixとsuffix](http://blog.codic.jp/2014/12/22/shoud-know-prefix-suffix-for-naming/)

* [クラスの命名のアンチパターン](http://qiita.com/magicant/items/8134edf969f9629fa66e)
* [Javaのメソッド名によく使われる単語・接頭辞](http://d.hatena.ne.jp/chiheisen/20101010/1286697081)
* [関数名によく使われる英単語（動詞）の意味とニュアンス](http://php-archive.net/php/words-in-function-names/)
* [Okapi 命名規約](http://www.okapiproject.com/java/java_codeconventions/jcc_naming.htm)
* [プログラミング言語の命名規則まとめ](http://blog.nabe-ch.net/?p=1300)
* [私の命名法](http://www.curiocube.com/mikata/progtips/ch04_name.php)
* [JavaScriptネーミングベストプラクティス](http://axross.me/javascript-naming-best-practice/)
* [いまさら聞けない「コードの英語」超入門](http://techlife.cookpad.com/entry/2015/08/31/140749)
* [うまくメソッド名を付けるための参考情報](http://qiita.com/KeithYokoma/items/2193cf79ba76563e3db6)
* [今さら聞けない、変数や関数の命名規則と、まず覚えるべき英単語200 | OXY NOTES](http://oxynotes.com/?p=8679)

## Web辞書
* [codic.jp](codic.jp)
* [alc 英辞郎 Proお試し版](http://eowf.alc.co.jp/)

## あとがき
上記の記事を書いた方々にはホント頭が上がりません。マジ感謝。
他に何かいい記事あれば、随時追加していきます。
また、他にもいい記事等あればコメントか編集リクエスト下さい。
Python の MeCab バインディング natto-py を使う

# natto-py とは？

natto-py は Python - MeCab の [Foreign Function Interface](http://ja.wikipedia.org/wiki/Foreign_function_interface) (FFI) によるバインディングを提供する Python パッケージです。 Python 2 および 3 に対応し、コンパイラーが必要としない利点があります。*nix、OS X および Windows 上で利用可能です。 

# 対応する Python バージョン

natto-py は下記の Python 2 および 3 を利用できます。下記のバージョンは実証済みです。

- [Python 2.7](https://docs.python.org/dev/whatsnew/2.7.html)
- [Python 3.2](https://docs.python.org/dev/whatsnew/3.2.html)
- [Python 3.3](https://docs.python.org/dev/whatsnew/3.3.html)
- [Python 3.4](https://docs.python.org/dev/whatsnew/3.4.html)


# MeCab をインストール

まずは [MeCab 0.996](http://taku910.github.io/mecab/#download) をインストールします。

* mecab-ipadic または mecab-jumandic のMeCab 用辞書も忘れずにインストールしましょう。
* Windows なら、コンパイル済みの IPADIC 辞書が含まれています。
* natto-py は mecab-config を通して libmecab.so (OS X の場合は libmecab.dylib)のインストール先を取得するので、必要に応じて mecab-config もインストールしておいてください。

# natto-py をインストール

通常の Python パッケージと同様に pip 経由で natto-py インストールします。

```
$ pip install natto-py
```

[cffi](https://bitbucket.org/cffi/cffi) パッケージも必要ですが、上記のコマンドで cffi は必要に応じて自動的にインストールされます。




# とりあえず使ってみよう

#### import 文

natto から MeCab クラスをインポートしてインスタンスを取得します。

```
from natto import MeCab

nm = MeCab()

print(nm)

<natto.mecab.MeCab model=<cdata 'mecab_model_t *' 0x802016640>,
    tagger=<cdata 'mecab_t *' 0x8020a44c0>, 
    lattice=<cdata 'mecab_lattice_t *' 0x802079600>, 
    libpath="/opt/mecab/lib/libmecab.so", 
    options={}, 
    dicts=[<natto.dictionary.DictionaryInfo 
        dictionary=<cdata 'mecab_dictionary_info_t *' 0x802079480>,
        filepath="/opt/mecab/lib/mecab/dic/ipadic/sys.dic", 
        charset=utf-8, 
        type=0>], 
 version=0.996>
```

#### 解析を標準出力に

文をとりあえず解析して結果を文字列として標準出力に送ります。

```
text = "ピンチの時には必ずヒーローが現れる。"

print(nm.parse(text))

ピンチ	名詞,一般,*,*,*,*,ピンチ,ピンチ,ピンチ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
時	名詞,非自立,副詞可能,*,*,*,時,トキ,トキ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
必ず	副詞,助詞類接続,*,*,*,*,必ず,カナラズ,カナラズ
ヒーロー	名詞,一般,*,*,*,*,ヒーロー,ヒーロー,ヒーロー
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
現れる	動詞,自立,*,*,一段,基本形,現れる,アラワレル,アラワレル
。	記号,句点,*,*,*,*,。,。,。
EOS
```

#### MeCabNode 出力

解析結果を `MeCabNode` で取得して各形態素に関するより詳しい情報を出力します。

```
# -F / --node-format オプションでノードの出力フォーマットを指定する
#
# %m    ... 形態素の表層文
# %f[0] ... 品詞
# %h    ... 品詞 ID (IPADIC)
# %f[8] ... 発音
#  
with MeCab('-F%m,%f[0],%h,%f[8]') as nm:
    for n in nm.parse(text, as_nodes=True):
        print(n.feature)

ピンチ,名詞,38,ピンチ
の,助詞,24,ノ
時,名詞,66,トキ
に,助詞,13,ニ
は,助詞,16,ワ
必ず,副詞,35,カナラズ
ヒーロー,名詞,38,ヒーロー
が,助詞,13,ガ
現れる,動詞,31,アラワレル
。,記号,7,。
EOS
``` 

[Python with 文](http://docs.python.jp/3/reference/compound_stmts.html#the-with-statement)を使用すれば、コンテキストが正常に終了しても例外が起きてもMeCab ライブラリーの参照が自動的に破棄されるので、勧めます。

以上

# 参考

* [natto-py ＠ PyPI](https://pypi.python.org/pypi/natto-py/)
* [natto-py ＠ github](https://github.com/buruzaemon/natto-py)
* [API ドキュメント](http://natto-py.readthedocs.org/en/master/)
* [MeCab 出力フォーマットについて](http://taku910.github.io/mecab/format.html)
vmware > Capslockがおかしくなる

```txt:動作環境
Macbook Air 
vmware Fusion 6.0.4 + Win8.1 pro
```

仮想環境のWin8.1を使っている時、何かのひょうしにCapslockになる時がある。
ただし、CapslockのLEDは点灯していない。
英字入力すると大文字になっている。

Shift+CapslockにてCapslockを解除してwin8.1上では解除されるのだが、この時Capslock LEDが点灯状態になる。仮想上でCapslockが解除され、ベースのMacbook上ではCapslockがついた状態となり、よくわからない。
Atomで.gitignoreに含まれるファイルも検索対象にする



`Settings`の`Exclude VCS ignored Paths` のチェックを外す。

![kobito.1430539513.895878.png](https://qiita-image-store.s3.amazonaws.com/0/1691/cc76dd38-a201-545b-a4a3-713b97164486.png "kobito.1430539513.895878.png")
Eclipse/Gradle Java Projectで、後からGroovyもCompileできるようにする

## 環境

OS X Yosemite 10.10.3
jdk1.8.0_25.jdk

### Spring Tool Suite 

Version: 3.6.4.RELEASE
Build Id: 201503100337
Platform: Eclipse Kepler SR2 (4.3.2)

Groovy-Eclipse plugin Version: 2.9.2.xx-201502282108-e43j8

## 手順

### build.gradleに次を加える

```groovy:build.gradle
apply plugin: 'groovy'
sourceSets {
    main {
        java {
            // Groovyのソースを混在や参照したときに、compileJavaでBUILD FAILEDにならないように、製品のJavaソース指定を空で上書きする。
            srcDirs = []
        }
        groovy {
            // compileGroovyで既存のJavaソースが対象になるように、既存のJavaソースディレクトリを指定する。
            srcDirs = ['src/main/java']
        }
    }
    test {
        java {
            // Groovyのソースを混在や参照したときに、compileTestJavaでBUILD FAILEDにならないように、製品のJavaソース指定を空で上書きする。
            srcDirs = []
        }
        groovy {
            // compileTestGroovyで既存のJavaTestソースが対象になるように、既存のJavaTestソースディレクトリを指定する。
            srcDirs = ['src/test/java']
        }
    }
}

dependencies {
    // ...既にある指定
    compile 'org.codehaus.groovy:groovy-all:2.4.3'
    // ...既にある指定
}
```

参考 [24.3. プロジェクトレイアウト
 http://gradle.monochromeroad.com/docs/userguide/groovy_plugin.html#N14188](http://gradle.monochromeroad.com/docs/userguide/groovy_plugin.html#N14188)

### Projectを右クリック、Gradle→Refresh All
さんじゃらっと ruby + OpenCV で顔認識してトリミングするお

こんにちは

前回の[さんじゃらっと OSX + ruby でOpenCV](http://qiita.com/araya/items/e7ffbd7e757b3c0de056)の続きです。

[ruby-opencv](https://github.com/ruby-opencv/ruby-opencv)を使って画像から顔を認識して顔の部分だけを切り取ります。

スクリプトはこちらです。



```face_detection.rb
require 'opencv'
include OpenCV

if ARGV.length < 1
  puts "Usage: ruby #{__FILE__} source dest"
  exit
end

data = './haarcascade_frontalface_alt.xml'
detector = CvHaarClassifierCascade::load(data)
image = IplImage.load(ARGV[0])

detector.detect_objects(image).each do |region|
  color = CvColor::Blue
  image.rectangle! region.top_left, region.bottom_right, :color => color #ここで顔に枠をつけるよ
  image.set_roi(region) #ここでさらに顔の部分だけを切り取り
end

#image.save_image(ARGV[1])
window = GUI::Window.new('Face detection')
window.show(image)
GUI::wait_key
```

ただ、これを実行すると現時点では
`error: (-2) The node does not represent a user object (unknown type?) in function cvRead (OpenCV::CvStsError)`
こんなエラーが出ました。

cascade用のhaar-like-fatureのxmlの型が古いようです。
そこで最新のxmlをどこかからwgetとかしてきて使いました

例えばこんなん
`wget https://raw.githubusercontent.com/bwkeller/warai/master/haarcascade_frontalface_alt.xml`



ほんで、
`ruby face_detection face.jpg`
とかやると

![lena.jpg](https://qiita-image-store.s3.amazonaws.com/0/74622/f5882588-824c-058f-58af-8bce7263c1b0.jpeg)

が

![out.jpg](https://qiita-image-store.s3.amazonaws.com/0/74622/0c1b10dc-16b1-bfb0-83c0-01f536e900b3.jpeg)

こうなりました！

Stay Gold!
言語比較 > 10のべき数を表す記号 > D / E / *10^

```txt:動作環境
CentOS 6.5
```

10のべき数を表す記号が異なるため、使う言語/環境によっては意図しない数値となってしまう。
異種環境間を行き来する時は適宜変換が必要になる。

|言語/環境 | 記号 | 例 | 動作 |
|:---|:---:|:---:|:---:|
| awk(代入時) | E | `1.e-5` |  |
| awk(printf "%e"出力) | E | `1.e-5` | 
| awk(代入時) | D | `1.d-5` | NG (d-5以降無視される) |
| Fortran(real*8: 代入時) | E | `1.e-5` | NG (単精度に精度が落ちる) |
| Fortran(real*8: 代入時) | D | `1.d-5` |  |
| Fortran(real*8: print出力) | E | `1.E-05` |  |
| C (代入時、%e出力時) | E | `1.e-5` |  |
| C (代入時) | D | `1.d-5` | NG (invalid suffix) |
| bc -l(代入時) | E | `1.e-5` | NG (syntax error) |
| bc -l(代入時) | D | `1.d-5` | NG (syntax error) | 
| bc -l(代入時) | *10^ | `1.0*10^-5` | |
| EXCEL(入力時) | E | `1.e-5` | |
| EXCEL(入力時) | D | `1.d-5` | NG (入力が無効になるようだ) |
| grace | E | `1.e-5` | |
| grace | D | `1.d-5` | | 

Fortran以外ではEに変換するのが無難かもしれない。

bcの場合は"10のべき数"でなく"べき乗"でしか扱えなさそう。
font-familyでMacからWindowsまで明朝体指定


2015 ver.

Macで游明朝を使うかヒラギノ明朝を使うかは好みによるところでしょう。

WindowsだとHG明朝というのを指定することで、アンチエイリアスのかかった明朝体を表示することができます。

```
font-family: "游明朝", YuMincho, "ヒラギノ明朝 ProN W3", "Hiragino Mincho ProN", "HG明朝E", "ＭＳ Ｐ明朝", "ＭＳ 明朝", serif;


```
Theme (テーマ) を気楽に変更する。

結局練習も兼ねて Package にしてみた。

# [theme-switch](https://atom.io/packages/theme-switch)

最初、名前は theme-switcher にしてたんだが、この名前のパッケージ( [theme-switcher](https://atom.io/packages/theme-switcher) ) が既に存在して、publish の最後で弾かれたので、theme-switch に名前を変えた。

theme-switcher より better な点は

* prev, next で theme を進んだり、戻ったり出来る
* uiとsyntaxペアの設定がしやすい
* Theme set(ui syntax のペア) は何個でも登録可
* 現在のtheme設定を尊重する(現在の theme set を prev,next の始点にする)
 
といったところ。
Coffeescript や、Web 技術(Js,HTML, CSS) のお勉強も兼ねて、しばらくは Atom Hack してみよう。

↓元の投稿
----- 
昼間カフェで作業する場合は、外が明るいので light な syntax で、
夜暗い時は、目が痛いので、dark な syntax で作業したい、とか良くある。
これを気楽に行えるようにしたい。

カラーテーマとシンタックスの組は配列として、`core.themes` Config に保存されているので、
これを set すれば気楽に変えられる。

```coffeescript:init.coffee
class ThemeProfile
  constructor: (@profiles) ->
    @index = 0
  next: ->
    @index = (@index + 1) % @profiles.length
    @profiles[@index]

# ThemeProfile の constructor に好きなだけ ui-theme と syntax ペアを登録する。
themeProfile = new ThemeProfile [
  ["atom-dark-ui", "atom-dark-syntax"]
  ["atom-dark-ui", "atom-light-syntax"]
]

atom.commands.add 'atom-text-editor',
  'user:theme-next': (event) ->
    atom.config.set("core.themes", themeProfile.next())
```

# 使い方
command palette から `user:theme-next` を実行(`tn<enter>`とかで)。
頻繁に変更するなら keymap 設定してね♥
CakePHP、MySQLのビューテーブルでbakeしてみる

SNSみたいので発言があってそのコメントがある。
で、画面には発言の一覧があって、その発言についたコメントの数があって、このコメント数で並び替えたい！
とかいう場合にどうするか、って話なんだけどさ。
昨日そういう話になって、おれは発言テーブルにカウント数のフィールドを作っておいてそれをコメントがつく度にプラスする、と言ったらそりゃ最低だ、せめてビューテーブル使ってくれ、と言われたので、ちょっと実験してみた。

発言テーブルは以下のようなもの。parent_id=0の時は親発言。コメントは常に親発言に対してのみ。ツリー状にならない。


```bash
mysql> desc posts;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| subject    | text         | YES  |     | NULL    |                |
| comment    | text         | YES  |     | NULL    |                |
| post_date  | datetime     | YES  |     | NULL    |                |
| parent_id  | int(11)      | YES  |     | NULL    |                |
| created    | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
```

ビューテーブルを作ってみる。

```sql
CREATE VIEW counted_posts AS
	SELECT p.id, p.parent_id,
	(SELECT COUNT(c.id) FROM posts AS c WHERE c.parent_id=p.id) AS rc
FROM posts AS p 
WHERE p.parent_id=0
```

CakePHPをインストール。なんかもうデフォルトが３になっちゃったみたい。

```bash
sudo php composer.phar create-project --prefer-dist cakephp/app myapp
sudo chown -R mymac:staff myapp/
cd myapp/
```

サーバー起動して動作確認。

```bash
bin/cake server
```

OKだったらモデルとコントローラを自動生成。

```bash
bin/cake bake model CountedPosts

bin/cake bake controller CountedPosts
```

テンプレートも。。。と行きたかったが、

```bash
bin/cake bake template CountedPosts
```

以下のように主キーがないってエラーになる。

```bash
Welcome to CakePHP v3.0.2 Console
---------------------------------------------------------------
App : src
Path: /Users/mymac/Sites/myapp/src/
---------------------------------------------------------------
Error: Cannot generate views for models with no primary key
```
  
モデルのテーブルのイニシャライズのところに、

```php
$this->primaryKey('id');
```

を追記。


```php
class CountedPostsTable extends Table
{

    /**
     * Initialize method
     *
     * @param array $config The configuration for the Table.
     * @return void
     */
    public function initialize(array $config)
    {
        $this->table('counted_posts');
		$this->primaryKey('id');
        $this->('ParentCountedPosts', [
            'className' => 'CountedPosts',
            'foreignKey' => 'parent_id'
        ]);
        $this->hasMany('ChildCountedPosts', [
            'className' => 'CountedPosts',
            'foreignKey' => 'parent_id'
        ]);
    }
```

勝手に作られてるbelongsToのparentとかchildとかが不気味だが、
再びテンプレートをbakeして終了。もちろん、paginateもオッケー。
rsyncの重要コマンド

# 結論
```rsync -avz コピー元　コピー先```


# 重要なオプション
## -z
圧縮してrsyncしてくれるので帯域負荷を考えるときはこちら利用

## -a
-rlptgoDとイコール

* r: ディレクトリ内まで再帰的にコピー
* l: symlinkをコピー
* p: permissionをコピー
* t: 下記
* g: groupをコピー
* o: ownerをコピー
* D: デバイスを維持

## -t
rsyncはファイルのupdateされた日がコピー先のものよりもコピー元の方が先の場合のみコピー
それゆえコピー元と先のタイムスタンプが違った時に、コピー漏れが生じる恐れがある。
-tでコピー先のタイムスタンプをコピー元に合わせてくれるので必須（-aにあるので問題ないが）

## -n
* rsyncをしたテスト結果を出してくれる（実際にはしない）

## -v
コピーファイル一覧を出力してくれる。コピー結果をメールで転送するときは必須

# その他
## /
rsync directory1/directory2 -> directoryがある階層すべてrsync
rsync directory1/directory2/ -> directory以下のもののみrsync

※ man rsyncより
※ [ヒント程度に](https://www.infoscience.co.jp/technical/rsync/README.html)
iTunes ConnectのApp Analyticsを使ってみた

ようやく [App Analytics](https://analytics.itunes.apple.com/) が使えるようになったので、早速試してみました。

![スクリーンショット 2015-05-02 9.08.09.png](https://qiita-image-store.s3.amazonaws.com/0/8292/54292a5a-df7a-e0bf-a7bb-dae58ddccef6.png)


# そもそもApp Analyticsとは？

自分が管理するアプリのApp Storeページが

* どのくらい見られているか？（PV）
* どのサイトから遷移してきたか？（リファラー）
* そのうちどれくらいダウンロードされたか？（ダウンロード率）
* ダウンロードした翌日以降も使ってくれている人の割合（使用率）

などが見れる解析サービスです。Apple純正なので、特別なSDKを導入する必要がないのが魅力ですね。

[FAQ](https://itunesconnect.apple.com/WebObjects/iTunesConnect.woa/wa/jumpTo?page=faqIndex&group=appanalytics)によると、計測データに含まれるのは **iOS 8以上のデバイスのみ**、とのことです。

閲覧にはAdmin, Finance, もしくは Sales権限が必要になります。

# どんなデータが見られるのか

App Analyticsは、「概要」「メトリックス」「ソース」「使用率」の4つの画面から構成されています。

## 1. 概要

この画面では、全期間および過去30日間の各データを閲覧できます。それぞれの項目を解説していきます。

### App Store閲覧数

アプリのApp Storeページが閲覧された回数。ただし、カウントされるのはiOS 8以上のデバイスからのアクセスのみ。

### Appユニット数

アプリがApp Storeページからダウンロードされた回数。アップデートや、同じApple IDからの再ダウンロード数はカウントされない。こちらもカウントされるのはiOS 8以上のデバイスのみ。

### 売上

アプリの売上。有料アプリ, app bundles（複数のアプリをまとめて売れるアレ）, In- App Purchasesを合わせた金額。 

### セッション数（オプトインのみ）

セッション数とは、アプリが少なくとも2秒間フォアグラウンドにされた回数のこと。その後、アプリがバックグラウンドになって、再び使用されると別のセッションとしてカウントされる。診断データおよび利用情報を App 開発者と共有することに同意したユーザのデータのみ。

### アクティブなデバイス数（オプトインのみ）

指定した期間内に少なくとも1セッションとしてカウントされたデバイスの数。診断データおよび利用情報を App 開発者と共有することに同意したユーザのデータのみ。

### テリトリー別の集計

各国ごとの閲覧数、ユニット数、売上、インストール数、アクティブなデバイス数が見れる。（地図付き！）

![スクリーンショット 2015-05-05 13.22.10.png](https://qiita-image-store.s3.amazonaws.com/0/8292/66ec7f35-ac4a-0c31-c1ca-d7acf8ce70e9.png)


### 使用率（オプトインのみ）

アプリを初期インストールし、その後 App を使用したユーザの割合。1日目 7日目 14日目 21日目 28日目の使用率が見られる。

![スクリーンショット 2015-05-05 13.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/8292/eb9e1e21-7f44-c88d-cfd1-107f78a5e05e.png)


### プラットフォーム別の集計

プラットフォームごと（iPhone/iPad/iPod）の閲覧数、ユニット数、売上、インストール数、アクティブなデバイス数の割合が見られる。

## 2. メトリックス

1日ごとの各データをグラフにして表示してくれます。

* App Store 閲覧数
* App ユニット数
* App 内課金数
* 売上
* 有料ユーザ
* インストール数（オプトインのみ）
* セッション数（オプトインのみ）
* アクティブなデバイス数（オプトインのみ）
* 過去30日のアクティブなデバイス（オプトインのみ）
* クラッシュ数（オプトインのみ）

それぞれのデータを同時に表示して、比較することもできます。

## 3. ソース

「トップWebサイト」「トップキャンペーン」の2つから構成されます。

### トップWebサイト

どのサイトから自分のアプリのApp Storeページヘ流入しているか？がわかります。

* 流入元ドメイン
* 閲覧数
* ユニット数
* 売上
* セッション数

ユニット数（ダウンロード数）/ 閲覧数でダウンロード率も計算できますね。

### トップキャンペーン

キャンペーンリンクを作成することで、どのキャンペーンからの流入が多いかを計測することができます。

キャンペーンリンクは

```
https://itunes.apple.com/us/app/apple-store/id439104108?pt=8668&ct=test123&mt8
```

のようなURLで、`ct=xxx` の部分をカスタマイズできます。（半角40字まで）
`pt=xxx` の部分は開発社毎に割り当てられるプロバイダIDがセットされます。

## 4. 使用率

指定した日にアプリをインストールして、翌日以降にアプリを使用したユーザの割合をかなり詳しく見ることができます。

例）4月4日 にアプリをインストールしたユーザの 32% が 28 日 後にもアプリを使用している、等

# 疑問

## ユニット数（ダウンロード数）とインストール数は何が違うの？

同じユーザからの再ダウンロードをカウントするかどうかの違いです。ユニット数は再ダウンロード数をカウントしないのに対し、インストール数は同じユーザからが再ダウンロードした場合、また複数のデバイスから同じApple IDでダウンロードした場合も1ダウンロードとしてカウントします。

## 他の解析ツールより数値が低く出るのはどうして？

App Analyticsは、**診断データおよび利用情報をアプリ開発者と共有することに同意したユーザ** のみを解析対象としています。そのため、他の解析ツールよりも数字が少なくなります。

# リンク

* [App Analytics](https://analytics.itunes.apple.com/)
* [FAQ](https://itunespartner.apple.com/en/apps/faq/App%20Analytics_Overview)
* [App Analytics アップデートでインプレッション数の閲覧が可能に \- Qiita](http://qiita.com/tanabee/items/9f25b952773483fce350)
Windowsインストール時に Cholateyで一括インストールする便利ソフト

Windowsを新規セットアップしたとき、真っ先にやるのが [Chocolatey](https://chocolatey.org/)のインストール。

そしておもむろに、次のコマンドを打ち込めば一気によく使うソフトが入っていきます。便利。

    cinst googlechrome git notepadplusplus firefox 7zip atom vlc putty dropbox libreoffice winscp sourcetree opera steam 1password techsmith_snagit mysql.workbench -y

インストールされるソフトは、次の通り。適当にアレンジしてご利用くださいませ。

- Google Chrome
- Git
- Notepad++
- Firefox
- 7zip
- Atom
- VLC Player
- Putty
- Dropbox
- Libre Office
- WinSCP
- SourceTree
- Opera
- Steam
- 1Password
- MySQL Workbench
homebrewでpostgresをinstallしてpasswordを設定する。

まずは素直にインストール。

```bash
brew search postgres
brew install postgresql
```

終わったら画面の指示通りに。

```
ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

ここでパスワードを設定。


```bash
psql postgres
```

```sql
postgres=# \password
postgres=# \q
```

次にエディターで以下のファイルを編集する。

```bash
sudo vim /usr/local/var/postgres/pg_hba.conf
```

`trust` になっているところを全部 `md5` に書き換え。
保存したら、postgresを一旦停止して、

```bash
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```

また起動。

```bash
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```
【tFPDF】FPDFで日本語（UTF-8）を使う

#FPDFで日本語（UTF-8）を使う方法
##tFPDFとは
前回、[FPDF 1.7 リファレンスマニュアル（非公式）](http://qiita.com/y_irabu/items/2e382e0013d78e9351e9 "FPDF 1.7 リファレンスマニュアル（非公式）")を投稿しました。
しかし、FPDFは本来マルチバイト文字に対応していません。
**FPDF**で日本語を使うには古くからの方法だと「japanese.php」を使う方法が知られていますが、文字コードがSJISらしく私は使ったことがありません。
というか実は本来のFPDFも使ったことがなく、もっぱら今回ご紹介する「**tFPDF**」を使っています。
「**tFDPF**」は[www.fpdf.org](http://www.fpdf.org "www.fpdf.org")本家で開発されているFDPFのUTF-8対応版で、Unicodeフォントが使うことができます。
これらの技術は「mPDF」の開発からバックポートされたものです。

##tFPDFのダウンロード
そもそも、「FPDF」は必要ありません。
かわりに「**tFPDF**」があるので、[www.fpdf.orgのtFPDFのページ](http://www.fpdf.org/en/script/script92.php "tFPDF")の下の方にダウンロードのリンクがあるのでそこからダウンロードして展開して配置するだけです。

##tFPDFの使い方
Unicodeフォントを使うためには、**AddFont()** メソッドの第4引数に「true」を設定します。
そしてフォントファイルの位置はtfpdf.phpと同じ階層下の/font/unifont かシステムで指定されたフォルダ（例えば_SYSTEM_TTFONTS 定数で定義された場所）に配置します。
パッケージには DejaVu フォントが同梱されています。

また、PHPではmbstring拡張が有効になっている必要があります。

##サンプル
```php
<?php

// オプションでシステムフォントのパスを定義することが出来ます。
// 他の方法として tFPDF は [path to tFPDF]/font/unifont/ ディレクトリを使用します。
// define("_SYSTEM_TTFONTS", "C:/Windows/Fonts/");

require('tfpdf.php');

$pdf = new tFPDF();
$pdf->AddPage();

// フォントの追加（第4引数をtrueにしてUTF-8を有効にする）
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->SetFont('DejaVu','',14);

// 例としてUTF-8で作成されたファイルをロードして表示
$txt = file_get_contents('HelloWorld.txt'); /** UTF-8で作成されたファイル
$pdf->Write(8,$txt);

// Select a standard font (uses windows-1252)
$pdf->SetFont('Arial','',14);
$pdf->Ln(10);
$pdf->Write(5,'The file size of this PDF is only 12 KB.');

$pdf->Output();
?>
```

##tFPDFをもっと有効に使う
**tFPDF** を使用するだけならば**FPDF**の置き換えだけで簡単に出来ます。
ところが**FPDI**を併用してPDFのテンプレート取り込めるようにしようなどとすると、
FPDIがFPDFクラスを継承していたりで、ちと面倒です。
FDPI のクラス定義でtPDFを継承するように書き換えても良いのですが、FPDIをバージョンアップしたりするとかなりの確率で修正を忘れると思います。
そこでプログラム側でしれっとFPDFクラスを作っちゃいます。

```php:fpdf.php
<?php
include_once("tfpdf.php");
class FPDF extends tDPDF
{
    public function __construct()
    {
        parent::__construct();
    }
}
?>
```
こんな感じでFPDFクラスを作っておけばFPDFの拡張をあとで付け足す時も悩まなくて幸せなんじゃないかと思います。

FPDIに関してはまたの機会に。
SwiftのOptinal型の意味

#Swiftのオプショナル型の基本的な意味    

オプションは書いても書かなくてもいい項目

もしユーザの登録画面で書いても書かなくてもいい項目がある場合
「何もない意味する値」=nilが用意されている

エラー例

```
var age:Int? = 26
print(age + 1)
```
!マークを付けることでこの中身はnilでないことを保証するのでエラーを出すなと宣言できる

```
var age:Int? = 26
print(age! + 1)
```

#オプショナル型のメリット

##ダメな例
```
var age:Int = nil
```
変数の型が整数型であるためSwiftは正常だとおもってしまう
しかし実行時にはnilと整数値を計算したらクラッシュする

```
var age:Int = nil
print(age + 1)
```

エラーにならずクラッシュする
システムが大規模になるほどageにnilを代入したかどうかが分かりづらくなる
そのためオプショナル型という別の型を用意し、他の人にも自分にもわかりやすく明示する。

##正しい例
```
var age:Int? = nil
print(age + 1)
```
ちゃんとしたエラーが出る

#変数buttonがオプショナル型である理由
```
@IBOutlet weak var button:UIButton
```
これだとエラーが起きる
なぜか？
安全に書くためにクラスにはすべてのプロパティに値が設定されている状態になってはじめてインスタンスが作成できる。
変数の初期値が未設定のままでは不具合を起こしやすいから。

先に中身の具材を入れるのと一緒で
先にプロパティに値を入れないと、インスタンスは作れない






#Optional Chainingとは
```
 //Bird構造体
        struct Bird{
            var a:Int
        
            init(n:Int){
                a=n
            }
            
            func toString()->String{
                return "\(a)"
            }
        }
    
        //Birdをwrapする
        var bird1:Bird? = Bird(n:100)

        //もしoptinal型で返さずそのまま代入したら
        var bird2:Bird = Bird(n:111)
        
        
        //?を使うとnilになる可能性のあるオブジェクトのプロパティに安全にアクセスできる。
        //これがOptional Chainingという由縁でa?,b?,c?とoptional型に返せるため
        1番
        print(bird1?.toString())
        
        //bird1はまだoptinal型で返ってきただけなのでアンラップする
        2番
        var kazu:String
        kazu = (bird1?.toString())!
        println(kazu)
        
        //そのまま表示
        3番
        println(bird2.toString())
        
        
        
       1番 Optional("100")
		2番　100	
		3番　111
```        
        
""つまりOptional型はnilのチェック忘れを防ぐ、それをコンパイラで検出できるようにするためのもの""
もしbird2に数字が入っていなかったら原因不明errorだが、bird1に数字が入っていなかったらnilになるだけであり、後々わかりやすいという事である。






例　通常


var a:Int
print(a)


値を代入しないと、コンパイルエラーになる↓

<stdin>:4:9: error: variable 'a' used before being 	initialized
print(a)^<stdin>:2:5: note: variable defined here　var a:Int




例　Optinal型
var a:Int?
print(a)

結果：
nil
JRubyFXのfxml_rootをjarパッケージング時にも適切に動作する形で設定する

JRubyFXでは、コントローラーにてビュー(fxmlファイル)を読み込む際、`fxml`メソッドを用いfxmlファイルの名前を指定しますが、ここで指定したファイル名はあらかじめ`fxml_root`メソッドで設定してあるディレクトリからの相対パスとして探索されます。

例えば、実行されるrubyファイルと同じディレクトリに`輿水幸子.fxml`ファイルが存在する場合は、以下の様なコードとなります。

```rb
fxml_root File.dirname(__FILE__)
class KawaiiController
  include JRubyFX::Controller
  fxml "輿水幸子.fxml"
end
```

更に、このJRubyアプリケーションをjarファイルとしてパッケージングした際にも正常に動作させるためには、`fxml_root`の第二引数に、**実行されるjarファイルそのもののファイル名**を指定する必要があります。

第二引数に`nil`以外の値を指定した場合、第一引数として渡した値は使われません。ですので、jarファイルとして実行されている場合は自分自身のファイル名、そうでない場合は`nil`を返すメソッドを定義し、そのメソッドを呼び出した返り値を第二引数として渡す形にしておけば、現在実行されている環境がjarファイル内なのかどうかを意識せず、動的に`fxml_root`へ適切な値を設定できるようになります。

そこで、**jarファイルとしてパッケージングしたJRubyアプリケーションを実行した際、`$LOAD_PATH`にjarファイル自身が含まれるようになる**という仕様を利用し、以下のような`jar_filename`メソッドを追加しましょう。

```rb
def jar_filename
  $LOAD_PATH.map{|it|
    it.split('/')
  }.flatten.uniq.select{|it|
    it.match /^(?!jruby-complete\.jar!)(?!jruby-stdlib-[0-9\.]+\.jar!).+\.jar!$/
  }.first.tap{|it| break it.tr('!','') unless it.nil?}
end
fxml_root File.dirname(__FILE__), jar_filename
```

いいですね。JRubyFXには`JRubyFX::Application.in_jar?`という便利メソッドもあるので、jarファイルの名前が予めわかっている場合には、単に条件分岐で`fxml_root`を呼んでしまえば良いでしょう。例えばjarファイルの名前が`乙倉悠貴.jar`だとわかっている場合は以下の様なコードになります。

```rb
if JRubyFX::Application.in_jar?
  fxml_root nil, '乙倉悠貴.jar'
else
  fxml_root File.dirname(__FILE__)
end
```

ただし、jarファイルの名前はユーザーが変更してしまう事も有り得ますので、`$LOAD_PATH`から動的に取得する方法の方がより安心かもしれません。

`fxml_root`の仕様はドキュメント化されていませんので、より詳しく知りたい方は[この辺りのコード](https://github.com/jruby/jrubyfx/blob/c6327641a8d3f68b3f6c7b65d35cce13fa9d103e/lib/jrubyfx/controller.rb#L33)を読むと良いと思います。
技術英語 > Could you spell it? > つづりを教えていただけますか? / Could you write it down?

よくわからない言葉を口頭で言われた時に使える。

A「x3$F#!5」
B「What did you say? Could you spell it?」

ただし、こういうと口頭で「C(シー) A(エー) N... A R Y」など言われるかもしれない。
5文字程度までならこれでもいいが、紙に書いて欲しい場合は

Could you write it down?
や
Could you write down the spell?
でもいいと思う。
secureCoding > VC++ 2005以降 > スタック上のデータの再配置もおこなわれ、特定データの破壊を予想した通りに行うことが困難になっている

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> Visual C++ 2005 (およびそれ以降)では、スタック上のデータの再配置も行われ、特定データの破壊を予想した通りに行うことが困難になっている。

意図的なスタック破壊攻撃に対してはこういう対策も有効なのかもしれない。僕自身は意図的なスタック破壊よりもコーディングミスによるスタック破壊に対応したいと考えているので、こういう機能が反対にデバッグしにくさを生じさせるのであれば困る。

おそらく、機能をOFFにする方法はあるだろう。
secureCoding > stack canary > StackGuard | Stack-Smashing Protector (ProPolice)

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> カナリーは、StackGuardやGCCのStack-Smashing Protector (ProPoliceという名前でも知られる)として実装されている。またMicrosoft Visual C++ .NETの実装では、スタックバッファオーバーラン検知の一部として実装されている。

それぞれのコンパイラやIDEで別の名前としてstack canaryに相当するものが用意されているのだろう。
secureCoding > stack canary > 連続的なメモリへの書込みから(例: strcpy())スタック上の戻りアドレスを保護するために使用される

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> スタックカナリー (stack canary)はスタック破壊攻撃を検出し、防止するためのまた別の仕組みである。カナリーは、一般化された境界検査を行うのではなく、連続的なメモリへの書込みから（たとえばstrcpy()の呼び出しによる)スタック上の戻りアドレスを保護するために使用される。

炭鉱にカナリヤを入れて毒ガスがあればカナリヤが騒ぐという関連性からcanaryという言葉を使っているようだ。

<hr>

[Wikipedia](http://en.wikipedia.org/wiki/Stack_buffer_overflow#Stack_canaries)
TypeScript HelloWorld

## 環境
* OS X Yosemite 10.10.3
* Vim version 7.4.488 ( iTerm 2  )


## 前提
* brew をインストールしている
* Node をインストールしている
* npm をインストールしている


## TypeScript のインストール

```
$ npm install -g typescript
```

## 確認

```
$ tcs -v

message TS6029: Version 1.5.0-beta
```

## Hello World

テスト用のディレクトリをつくっておく(必須ではないよ。好きにして！)

```
$ cd Desktop
$ makedir HelloTSC
$ cd HelloTSC
```

TypeScript ファイルを作成

```
$ vim HelloWorld.ts
```

HelloWorld、HelloWorld うるせぇコードになったけどそこは気にしない。

```
class HelloWorld
{
	constructor(public displayText : string) {}

	greet()
	{
		return this.displayText;	
	}
}

var helloWorld = new HelloWorld("HelloWorld");
document.body.innerHTML = helloWorld.greet();
```

このコをコンパイルするには

```
$ tsc HelloWorld.ts
```

でイケる。実行すると HelloWorld.js が生成されていた。中身はこんなかんじに。

```
var HelloWorld = (function () {
    function HelloWorld(displayText) {
        this.displayText = displayText;
    }
    HelloWorld.prototype.greet = function () {
        return this.displayText;
    };
    return HelloWorld;
})();
var helloWorld = new HelloWorld("HelloWorld");
document.body.innerHTML = helloWorld.greet();
```

constructor でインスタンス変数を設定できるようです。ふむふむ。

これをこんな感じの恥ずかしめな HTML で実行してみましょう。

```
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title></title>

</head>
<body>
<script src="HelloWorld.js"></script>
</body>
</html>
```

innerHTML を使っているので、scriptタグはbody内に突っ込んどいたよ。結果的に "HelloWorld" と表示されるよ。

## まとめ

実際に書いてみると、クラスベースで開発してきた方には受け入れやすいシンタックスになっていると思いました。

また、今回はざっくりと触ってみたかったので Mac + Terminal + Vim で作業を行っていました。ですので、実際には Vim のセッティングの方がコーディングよりも時間がかかっていますw
 
個人的には VisualStudio + VsVim で開発できたほうが効率が良さそうな気がしていますがみなさんはどんな環境で TypeScript を書いているのか気になります。そのうち環境構築方面も調査してポストします。
　
でわでわ
JRubyFXでコンストラクタに引数を渡しつつControllerを切り替える

JRubyFXでコンストラクタに引数を渡しつつControllerを切り替えるには、`javafx.stage.Stage#fxml`メソッドを使います。

[UI via FXML](https://github.com/jruby/jrubyfx/wiki/Extensions#ui-via-fxml)

以下のような`move`メソッドを定義した`ApplicationController`を作成し、各コントローラはそれを継承する様にすれば便利でしょう。

```application_controller.rb
class ApplicationController
  include JRubyFX::Controller

  def move klass, *args
    @stage.fxml klass, initialize: args
    @stage.show
  end

end
```

```foo_controller.rb
class FooController < ApplicationController

  def initialize arg
    puts "I got `#{arg}` as a constructor argument!"
  end

  def click_button
    move BarController, "Hello, Bar!"
  end

end
```

```bar_controller.rb
class BarController < ApplicationController

  def initialize arg
    puts "I got `#{arg}` as a constructor argument!"
  end

  def click_button
    move FooController, "Hello, Foo!"
  end

end
```
mrb_value型の変数を簡単に表示する方法

なるべくmrubyに処理をお願いしたいケースでは、mrb_value型で
保持している方が何かと便利だが、printfで気軽に表示できないなぁ
と思っていたが、mrb_funcallで「p」を実行すれば、

rubyだと

```rb
p obj
```

を実行したことになり、自分の目的はこれで果たせた。


```c
mrb_value obj

// ‥ なんらかの処理でobjに値が入る

mrb_funcall(mrb,mrb_top_self(mrb), "p", 1, obj);
```
JavaのSingletonデザインパターン

Oracle Certified Java Programmer, Gold SE 7 の資格試験学習メモ

#Singletonデザインパターンとは
「そのクラスのインスタンスは常に1つしか存在しない」状態を作り出すパターン。
システム内で1つ作るだけで済むインスタンスや、1つだけしか作りたくないインスタンスがある場合に使用する。

#サンプル
```java:SingletonSample.java
public class SingletonSample {
    private static SingletonSample singleton = new SingletonSample();

    private SingletonSample(){
        System.out.println("インスタンスを作成しました。");
    }

    public static SingletonSample getInstance(){
        return singleton;
    }
}
```

インスタンス用の変数はprivateでフィールドとして用意しておく。
privateコンストラクタを記述する。
インスタンス取得用のgetterメソッドを用意しておく。


シングルトンのデザインパターンはGang of Fourがまとめたものとのことで、もともとは下のような実装だったそう

```java:OldSingletonSample.java
public class OldSingletonSample {
    private static OldSingletonSample singleton;

    private OldSingletonSample(){
        singleton = null;
    }

    public static OldSingletonSample getInstance(){
        if(singleton == null){
            singleton = new OldSingletonSample();
        }
        return singleton;
    }
}
```
ただ、上の実装だと複数のスレッドが動いている場合に1つのスレッドがif文内を入っている時に別のスレッドが入れるようになってしまっている。
それを避けるために一番上のサンプルコードの実装になった模様。

#Singletonデザインパターンのポイント
* 「たった1つだけのインスタンスを作成する」というより、「そのインスタンスが1つしか存在しないことを保証する」ためにSingletonデザインパターンを使用する。
* インスタンスが1つしかなければ、他に影響するインスタンスがないため、「インスタンスは1つ」の条件下でプログラムが書ける。制御しやすい。
* 1つだけインスタンスを作成するだけといっても、クラスメソッドを使用しているので、多用は避けた方がいいらしい

#使いどころ
シングルトンの使いどころは、フラグ管理とかになるかも。ちょっと事例を調べてみよう。

#実装時に気をつけるポイント
* 必ずプライベートコンストラクタを記述しておく。これを書いておかないと、デフォルトコンストラクタが呼ばれるため、インスタンスが複数作成可能となってしまう。
* インスタンスを取得するgetterメソッドを必ず用意する。インスタンスの作成はそのシングルトンのクラス内でしか行わないため、メソッドを用意しないと使用できない。


#参考資料
学習に当たり以下の資料を参考としています。
・[増補改訂版 Java言語で学ぶデザインパターン入門](http://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=pd_cp_b_0)
・[クラスのインスタンスを1つに保つ（Singletonパターン）](http://www.atmarkit.co.jp/fjava/javatips/075java007.html)
GROUP_CONCATでグルーピングした値をCONCAT

`GROUP_CONCAT`という便利な集約関数がMySQLにあって色々使えそうなので共有します。

例えばこんな感じテーブル`shop_area`テーブルがあったとします。

| shop_id | area_id        |
|---------|----------------|
|       1 |             21 |
|       1 |              3 |
|       2 |             14 |
|       2 |             15 |
|       3 |             33 |


で、これをshop_idで`GROUP BY`して下記のようなデータをSQL一発で取得可能です。

| shop_id | area_list      |
|---------|----------------|
|       1 |           21/3 |
|       2 |          14/15 |
|       3 |             33 |

SQLはこんな感じ

```sql
SELECT shop_id, GROUP_CONCAT(area_id separator '/') as area_list 
  FROM shop_area 
  GROUP BY shop_id;
```

`area_id`が重複するような場合は`GROUP_CONCAT(DISTINCT area_id separator '/')`のように、DISTINCTキーワードも使えます。
PHPで視認性の良いコードを書く

絵文字を活用することで、とても視認性の良いコードとなります。
Java など、内部コードが Unicode な他の言語でも使用できると思います。
以下のコードは正常に動作しますが、乱用は禁物です。
プロジェクトのコーディング規約は必ず遵守し、使用は自己責任でお願いします。

```php
<?php
function 🙆🙆やったぜ() {
    return '合格';
}

var_dump(🙆🙆やったぜ());
=> string(6) "合格"
```

絵文字を返すこともできます

```php

/**
 * 犬が鳩を返します.
 *
 * @return string 🐦
 */
function 🐶() {
    return '🐦';
}

var_dump(🐶());
=> string(4) "🐦"
```

UTF-8 以外の文字エンコーディングを使用した場合は正常に動作しないと思われますのでご注意ください。
[Blender] Blenderに標準で備わっているPython Consoleのショートカットキー一覧

Blenderに標準で備わっているPython Consoleのショートカットをまとめてみました。
私が今のところ確認している範囲で書いています。
OSで標準に利用できるものも含まれているかもしれませんが、確認できていないためPython Consoleで便利そうなショートカットキーということでご勘弁ください。

|Windows|Mac|Linux|動作|
|----|----|----|----|
|Shift + F4|shift + fn + F4|Shift + F4|Python Consoleを開く|
|↑|↑|↑|過去に入力した履歴を戻る|
|↓|↓|↓|過去に入力した履歴を進める|
|Tab|tab|Tab|インデント|
|Shift + tab|shift + tab|shift + tab|アンインデント|
|Home|⌘ + ←|Home|行頭にカーソルを移動|
|End|⌘ + →|End|行末にカーソルを移動|
|Ctrl + ←|control + ←<br>fn + ←|Ctrl + ←|単語単位で左にカーソルを移動|
|Ctrl + →|control + →<br>fn + →|Ctrl + →|単語単位で右にカーソルを移動|
|Ctrl + Backspace|control + delete|Ctrl + Backspace|カーソルの位置から行頭に向かって単語単位で削除|
|Ctrl + Delete|control + fn + delete|Ctrl + Delete|カーソルの位置から行末に向かって単語単位で削除|
|Shift + Enter|shift + return|Shift + Enter|行を削除|
|Ctrl + Space|control + space|Ctrl + Space|ソースコード補完|
|Ctrl + ↑<br>Ctrl + ↓|control + ↑<br>control + ↓|Ctrl + ↑<br>Ctrl + ↓|コンソールのフルスクリーン化/解除|
|Ctrl + C|control + C|Ctrl + C|選択部分をクリップボードへコピー|
|Ctrl + V|control + V|Ctrl + V|クリップボードからの貼り付け|
|Shift + Ctrl + C|shift + control + C|Shift + Ctrl + C|Python Consoleを開いてから実行されたスクリプトを全てコピー<br>実行結果についてもコピーされるが、行頭に「#~ 」が自動的についてコメント化される|
※ ⌘はMacのcommandと同じ

Macでショートカットを利用するためには、Mission Controlなどに標準で割り当たっているcontrolと⌘について以下の手順に沿い、割り当てを解除する必要があります。

1. 「システム環境設定...」 - をクリック
2. 「キーボード」をクリック
3. 「ショートカット」タブをクリック
4. Blender Python Consoleで使いたいショートカットの割り当てを解除
デザイナーが学ぶSSHでGitホストに接続

せっかく[コマンドライン環境を構築した](http://qiita.com/imatomi/items/ef363355c0659f0bacb9)ので、Gitもコマンドラインから操作する。
HTTPSで接続すると毎回パスワードを入力しないといけないので、SSHでGitホストに接続する方法を調べた。ほぼメモ。

# SSH認証の仕組み
ただしく扱えるように仕組みを理解しておく

- 事前に
    - 自分が秘密鍵と公開鍵を作成する
        - 秘密鍵はパスフレーズで暗号化も可能 
    - 公開鍵を相手に登録する
- アクセス時（以下が自動で行われる）
    - 相手が適当なデータ（乱数とか）を公開鍵で暗号化（秘密鍵でしか解けない）
    - 暗号化されたデータを受け取る
    - 秘密鍵で暗号化されたデータを解読(復号化)
    - 復号したデータを相手に渡す
    - 相手が復号化されたデータと元データを比較
    - 一致すれば認証

つまり、「自分にしか解けない暗号データをちゃんと解ければ認証」ということらしい。

# やってみる
今回は [bitbucket](https://bitbucket.org/) のリモートリポジトリにSSH接続してみる

## 秘密鍵と公開鍵を作成する
- ssh-keygenコマンドを実行（鍵のタイプはRSA）
    - 場所は~/.ssh/、ファイル名は任意

```:ターミナル
$ ssh-keygen -t rsa -f ~/.ssh/imatomix_bitbucket_rsa
```

- ~/.ssh/ に、以下のファイルが作成される

    `imatomix_bitbucket_rsa ` : 秘密鍵
    `imatomix_bitbucket_rsa.pub` : 公開鍵

## 鍵の管理設定を行う

- ~./ssh/config ファイルを開く

```:ターミナル
$ vi ~/.ssh/config
```

- 鍵の情報を追記する
    - Host: 管理設定名
    - User: ユーザー名
    - HostName: ホスト名（bitbucket.org）
    - IdentityFile: 鍵の場所

```vi:config
Host imatomix.bitbucket.org
User imatomix
HostName bitbucket.org
IdentityFile ~/.ssh/imatomix_bitbucket_rsa
```

## ホストに公開鍵を登録する

- [Bitbucket](https://bitbacket.org)にログインして、「アカウントの管理」へ

![image](https://qiita-image-store.s3.amazonaws.com/0/47457/2d976a54-2581-db54-41c0-7fe93c52b341.png)

 
- 左メニューから「SSHキー」にアクセス

![image](https://qiita-image-store.s3.amazonaws.com/0/47457/2548f92d-1449-299b-9b31-3d0dd3689a4f.png)
 
- 鍵を追加をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/47457/aeee72b3-6d12-a169-2e3c-442105447d5c.png)

- 「Label」には適当な名前を入力。「Key」に公開鍵の内容をペーストして「鍵を追加」をクリック
    - 公開鍵の内容は、以下コマンドでコピーできる

    ```:ターミナル
$ cat ~/.ssh/bitbucket_rsa.pub | pbcopy
    ``` 

![image](https://qiita-image-store.s3.amazonaws.com/0/47457/34864b2a-1a7c-5df5-0879-7a00210ebbfb.png)


## HTTPSアクセスのリポジトリをSSHアクセスに変更する
- ローカルリポジトリのconfigファイルを開く

```:ターミナル
$ cd ローカルリポジトリパス
$ vi .git/config
```

- こういう記述がある

```vim:
[remote "origin"]
        url = https://imatomix@bitbucket.org/imatomix/repository.git 
        fetch = +refs/heads/*:refs/remotes/origin/*
```

- こう書き換える
    - url = git@設定名:ユーザー名/リポジトリ名.git 

```vim:
[remote "origin"]
        url = git@imatomix.bitbucket.org:imatomix/repository.git 
        fetch = +refs/heads/*:refs/remotes/origin/*
```


これでパスワード入力なしにコマンドラインからgitが使用できるようになった