OmniAICreator/Qiita-1.07M huggingface dataset:
Perl のデータ構造を検索するためのモジュール Data::Search

# Data::Dumper とは
[Data::Dumper](http://search.cpan.org/~smueller/Data-Dumper-2.154/Dumper.pm) はある変数のデータ構造を perl のシンタックスで出力してくれるモジュールです．

Data::Dumper を使うことでハッシュ，配列などが入った複雑な構造の変数を下記のように簡易に出力することができます．

```perl:sample01.pl
#!/usr/bin/env perl
# sample01.pl
use strict;
use Data::Dumper;
sub main {
  my $h = {
           'items' => [
                       {
                        'body' => "happiness is take a money",
                        'no' => 1,
                        'date' => '2014/11/09 14:15:03',
                        'stat' => 1,
                        'title' => "white-base thinking"
                       },
                       {
                        'body' => "happiness is playing beethoven",
                        'no' => 2,
                        'date' => '2014/11/19 12:35:23',
                        'stat' => 2,
                        'title' => "Hello World"
                       },
                      ]
          };

  print Dumper $h;
}
main;
```

    % perl sample01.pl
    $VAR1 = {
      'items' => [
       {
         'body' => 'happiness is take a money',
         'date' => '2014/11/09 14:15:03',
         'no' => 1,
         'stat' => 1,
         'title' => 'white-base thinking'
       },
       {
         'body' => 'happiness is playing beethoven',
         'date' => '2014/11/19 12:35:23',
         'no' => 2,
         'stat' => 2,
         'title' => 'Hello World'
       }
    ]
    };

# Data::Search モジュール
このようなハッシュ，配列からなる変数から「あるキーの値が○○なものを調べたい」，「この変数の値が××な部分はどうなっているのか調べたい」というときに下記の [Data::Search](http://search.cpan.org/~alx/Data-Search-0.03/Search.pm) モジュールが便利です．

```perl:sample02.pl
 #!/usr/bin/env perl
 # sample02.pl
 use strict;
 use Data::Dumper;
 use Data::Search;

sub main {
  my $h = {
           'items' => [
                       {
                        'body' => "happiness is take a money",
                        'no' => 1,
                        'date' => '2014/11/09 14:15:03',
                        'stat' => 1,
                        'title' => "white-base thinking"
                       },
                       {
                        'body' => "happiness is playing beethoven",
                        'no' => 2,
                        'date' => '2014/11/19 12:35:23',
                        'stat' => 2,
                        'title' => "Hello World"
                       },
                      ]
          };


  # body の値に money という文字列が入っているものを調べる
  my @out = datasearch( data => $h, 
                        search => "keys",
                        find => [ 'body' => qr/money/] ,
                        return => 'hashcontainer' );
  print Dumper \@out;
}

main;
```
上記のコードを実行すると，body に money という文字列を
含むハッシュが出力されます．

    % perl sample02.pl
    $VAR1 = [
      {
       'body' => 'happiness is take a money',
       'date' => '2014/11/09 14:15:03',
       'no' => 1,
       'stat' => 1,
       'title' => 'white-base thinking'
      }
    ]; 

ref

- http://search.cpan.org/~alx/Data-Search-0.03/Search.pm
- Perlのデータ構造をダンプするためのモジュール群 http://hirobanex.net/article/2013/09/1380449012
Setup windows 10

Windows で web 開発ってほんとにやりづらい。どんな構成がベストなのか試行錯誤しながらいろんなアプリを試してみる。

# fenrir
http://www.chin3.net/tool/1729/

# xkeymacs
以下を無効にする
ctrl+w
ctrl+t
ctrl+space
ctrl+v
ctrl+z
ctrl+l
ctrl+r

# CmdSpace
alt+spaceで日本語切り替え
http://www.tanaka.tc/archives/000014.html

# Cygwin or MinGW

http://rcmdnk.github.io/blog/2015/01/24/computer-windows-remote/
MobaXterm も良さそう

# Git for windows
デフォルト

# ConEmu
最高、ウィンドウズなのを忘れられる。
http://tech.nitoyon.com/ja/blog/2014/03/07/fancy-git-bash/
※ はじめ Cmder 使おうとしたけど vim で日本語が文字化けするので利用は断念

# NTEmacs
32bit版は以下からダウンロード
http://cha.la.coocan.jp/doc/NTEmacs.html

64bit版は以下からダウンロード
https://github.com/chuntaro/NTEmacs64/blob/master/emacs-24.5-IME-patched.zip

ユーザー環境変数 HOME を設定する
HOME=c:\Users\ユーザー名

emacs.d ディレクトリを git から取得する

```
$ cd ~/
$ git clone https://github.com/shinichi62/.emacs.d.git
```

Cask をインストールする

```
cd ~/
git clone https://github.com/cask/cask.git .cask
ln -s .cask/cask.el .emacs.d/cask.el
```
この後 NTEmacs を立ち上げると自動で Cask からパッケージをダウンロードして良い感じに NTEmacs が立ち上がる


# Rapid Environment Editor
環境変数の設定に

# vimで文字化け
どうにも直らないみたい
http://nyaos.org/d/index.cgi?p=(2013.03.25)+1823

```
Windows 8 になってから、vim , NYAOS といった多くのコンソールアプリケーションで、 日本語が入力できなくなったようです。
```

# 外部エディタの設定
http://qiita.com/kumazo@github/items/2169e1ee7be278f82b94#1-6

# 以下は適宜

* WinSCP
* putty
* HeidiSQL
* Sakura
* Hipchat
* WinMerge
* IntelliJ IDEA
* Python（2.4 2.7）
* Firefox

---

* SourceTree
* Vagrant
* Virtualbox
* Packer
* Chef
* Freemind
* Eclipse
* MySQL Controll Center
google chrome extention 実装メモ (Browser Actionだけ)

# 機能説明

## 機能一覧

|機能|説明|
|:--|:--|
|Browser Action|ツールバーに常駐|
|Page Action|特定のページで起動|
|Content Scripts|特定のページで自動実行|
|Context Menu|右クリックメニュー|

## Browser Action

### 必要最低限のファイル

* iconファイル 19×19 (px)
* manifest.json
* popup.html

#### manifest.json
自分が作成するgoogle Extentionを定義する

~~~json
{
  "name": "Extentionのタイトル",
  "version": "Extentionのバージョン（自分で決める）",
  "manifest_version": googleが定めたバージョン（どこかに書いてある）,
  "description": "Extentionの説明",
  "browser_action": {
    "default_icon": "ツールバーに常駐しているアイコンのファイル",
    "default_title": "ツールバーに常駐しているアイコンをマウスオーバーしたときに表示される文字",
    "default_popup": "Browser Actionを作成するhtmlファイル"
  }
}
~~~
例：

~~~json
{
  "name": "いつ出る？",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "ワンアクションで、何時に会社を出ればスムーズに電車移動できるのかわかるアプリ。",
  "browser_action": {
    "default_icon": "icon.png",
    "default_title": "いつ出る？",
    "default_popup": "popup.html"
  }
}
~~~

#### popup.html
ツールバーに常駐しているアイコンをクリックしたときに表示される画面を作成する
普通にhtmlファイルを作成すればok

例：

~~~html
<!DOCTYPE>
<html lang="ja">
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <ul>
      <li>リスト１</li>
      <li>リスト２</li>
      <li>リスト３</li>
    </ul>
  </body>
</html>
~~~

### もっとリッチに作れる

* バッジ機能(アイコンに数字が表示)が作れたり
* オプション機能(アイコン右クリックで設定項目画面を選択)が作れたり
* いろいろ出来る
AWSソリューションアーキテクトプロフェッショナルに合格したので勉強法メモ、結構嬉しい、いやかなり嬉しい、超絶嬉しい、嬉しすぎて鼻歌を歌いながら飛び跳ねちゃうね！



どうも、iron千葉です。
AWSソリューションアーキテクトプロフェッショナル、かなり難しかったですが無事合格しました。
アソシエイトに関する記事はよくあるのですが、プロフェッショナルに関する記事はあまりないので、勉強した内容をメモしておきます。
Amazonがインターネットで公開している範囲での記載となります。

因みに77%で合格です。

# 勉強内容
* [サンプル問題](http://media.amazonwebservices.com/jp/certification/AWS_certified_solutions_architect_professional_examsample0701_08_final.pdf)を解く（うわ、めっちゃムズイ、初めは全然解けませんでした）
* [模擬試験](https://www.webassessor.com/wa.do?page=publicHome&branding=AWS_JP)の受験（このとき33%だった。。。）※模擬試験は家から受験できますが有料です
* 模擬試験の内容をひたすら理解できるまで調べまくって、自分なりの回答を出せるようにする
* [AWS クラウドサービス活用資料集](http://aws.amazon.com/jp/aws-jp-introduction/)を読んでひたすら理解する（私の場合は、ブログにアウトプットすることで理解を深めてました）
* [AWSドキュメント](http://aws.amazon.com/jp/documentation/)を読んでひたすら理解する（私の場合は、ブログにアウトプットすることで理解を深めてました）
* 実機を触る
* ホワイトペーパーを流し読み（試験ガイドに記載されているやつ）
* 息抜きに、去年の[AWSサミットの動画](http://aws.amazon.com/jp/summit2014-report/details/)を見る
* [試験ガイド](http://media.amazonwebservices.com/jp/certification/AWS_certified_solutions_architect_professional_blueprint_final.pdf)を読んで出題範囲を見る（私の場合勉強しまくった結果、出題範囲からどんな問題が出そうか分かるようになってました） 
* 勉強期間は合計３ヶ月くらい（勉強時間は100時間いかないくらい？）
* たまに現実逃避でFF Xをやる

# 試験前日
* サンプル問題をもう一回やった（もう、理解できている状態ということを確認して安心）
* 模擬試験の問題内容の復習（もう一回やった、もう理解できている状態ということを確認して安心）
* 模擬試験をカテゴリ（試験ガイドに記載のカテゴリ）を意識して読む（何について聞かれているのかを意識する、コスト効率？最適なアーキテクチャ？）時間を意識して高速に解くことを意識

# 試験当日
試験時間が170分で、文章問題を80問クリアしないといけないので相当な集中力が必要となります。
なので以下をやりました。

* 試験開始が10:30。早めの7時に起きて、頭を活性化しておく
* 栄養分を取るために、おにぎり１個、レッドブルボトル、チョコを食す。そして、カフェラテを飲んだ。

集中力は向上しました。
がしかし、カフェインを注入しすぎて試験中に尿意をもよおしgo to the　トイレ。
時間が超勿体無いので、手を洗わずに席に戻りました、ごめんなさい。（そういえばまだ洗ってない…）
カフェインとりすぎにはご注意ください。。。

試験は170分を利用して、丁度80問解き終わりました。見直しする時間はなかったです。
170分で80問なので、１問２分程度で解く必要あります。

時間配分は事前考えておいたほうが良いです。あと、時間を意識して問題を解く練習。
だいたいの目安

* 残り２時間で、25問解いている状態
* 残り１時間半で、40問解いている状態
* 残り１時間で、55問解いている状態
* 残り30分で、70問解いている状態

悪魔で目安です。時間を気にしすぎて、焦って間違ったのでは意味がないです。
あとは、勇気を持って提出ボタンを押す（いつもですが、かなりドキドキですね、金額も金額ですし）

# まとめ
* AWSというか、アーキテクチャ全般の知識がめっちゃ問われるのでかなりエンジニアとしてスキルが上がった気がします
* 初めは、全く解けなかった問題が、勉強しまくると解けるようになることがわかった（自分には。。。とあきらめてはいけない）※因みにアソシエイトは２回めで合格したそんな自分です
* アーキテクチャ全般の知識が問われ難しいです。でも、だからこそ価値ある試験だと思います
* 色々と、かなり勉強になった(知識ではなく、活用できるレベル？ソリューションできるレベル？まで理解している必要がある)
* 今年の目標１つクリア
* 次は応用情報でも取るかな
Rubyのmechanizeで見出し文にあたる最初のpタグだけを取得する方法

# 疑問

スクレイピング用のGem「mechanize」を使うときに、searchメソッドを使って取得したHTMLの中から要素を指定すると思うのですが、HTMLの構造が単純ならそりゃいいですよ。

```
オブジェクト.search('セレクタ')
```
にすればいいですから。

例えば、H1タグってだいたい1ページに1つしかないから、

```
オブジェクト.search('h1')
```

で取得できる。

でも、見出し文だけ取りたい時ってあるとおもうんですよ。

そのときに、HTMLが

```
<div class="contents">
<p>見出し文</p>
<p>その他の文</p>
<p>その他の文</p>
・・・
</div>
```
みたいになってることがある。

これで、

```
オブジェクト.search('.contents p')
```
みたいにすると、div class="contents"内のすべてのpタグを取得してしまう。。

# 解決

そんなときに、最初のpタグだけを取得する方法を学びましたわ。

```
オブジェクト.search('.contents p')[0]
```

これで最初のpタグ＝見出し文だけを取得できました。
イメージキャッシュライブラリのHanekeを使ってみた

# swiftでHanekeを使ってみた
iOSのimageキャッシュライブラリといえばSDWebImageが有名ですが、
その他にも以下のように色々あります。

- Haneke
- HanekeSwift
- Kingfisher

今回はHanekeをちょこっと使ってみたいと思います。
https://github.com/Haneke/Haneke

## UIKitのオブジェクトにimageをセットする
HanekeにもSDWebImageと同じようにUIKit系のカテゴリが定義されていて、
イメージのセットはインスタンスメソッドから直感的に実行できます。
例えばUIButtonの場合はこんな感じ・・

```
let url = NSURL(string: "イメージのURL")
button.hnk_setImageFromURL(url, forState: .Normal, placeholder: nil) 
```

SDWebImageを使った事がある人であれば、同じようなインターフェースなので迷うことはないと思います。

Hanekeではフォーマットを指定することにより、リサイズなど色々設定してキャッシュすることが出来ます。

```
var format = HNKCache.sharedCache().formats["thumbnail"] as? HNKCacheFormat
if format == nil
  {
    format = HNKCacheFormat(name: "thumbnail")
    format!.size = CGSizeMake(320, 240)
    format!.scaleMode = .AspectFill
    format!.compressionQuality = 0.5
    format!.diskCapacity = 1 * 1024 * 1024; // 1MB
    format!.preloadPolicy = .None
  }
  imageView.hnk_cacheFormat = format
  let url = NSURL(string: "イメージのURL")
  imageView.hnk_setImageFromURL(url, placeholder: nil)
```

注意すべきなのは、オブジェクトが持つプロパティをHaneke側でcacheFormatに沿って上書きするところです。

例えば、imageViewのcontentModeにScaleAspectFitを設定していても、chacheFormatのscaleModeに設定されているHNKScaleModeAspectFillで表示されます。

## imageをダウンロード
単純に画像をUIImageとしてダウンロードしたい場合は下のようになります。

```
    let url = NSURL(string: "イメージのURL")
    let cache  = HNKCache.sharedCache()
    var format = cache.formats["thumbnail"] as? HNKCacheFormat
    if format == nil {
      format = HNKCacheFormat(name: "thumbnail")
      format!.scaleMode = .None
    }
    cache.registerFormat(format)
    cache.fetchImageForFetcher(HNKNetworkFetcher(URL: url), formatName: "thumbnail", success: {
      (image: UIImage!) in
      // ダウンロード後の処理
    }, failure: nil)
```

こちらはSDWebImageに比べて直感的ではないですね・・
もっといい方法があれば教えて下さい。

ポイントはfetchImageForFetcherに渡すクラスです。
HNKFetcherプロトコルを実装したクラスがいくつかあり、取得先によって使いわけるようです。
今回はHNKNetworkFetcherのインスタンスを渡していますが、ディスクから取得したい場合はHNKDiskFetcherを渡します。

注意点は、registerFormatによってformatを登録しておかないと実行時にクラッシュしてしまう事です。

# 感想
- キャッシュ時の設定を色々出来るのは凄いと思った
- SDWebImageに比べて簡単に使える印象はなかった
- hnk_setImageFromURLする時にオブジェクトのサイズが0だとクラッシュしたり、色々と疑問に思う点があった
- ダウンロード処理が面倒だった

こうして書くと文句ばっかりに見えますね。
しかし、キャッシュ時にリサイズ出来る点やディスクキャッシュの上限を細かく決められる点などを考えると、細かいことを色々とやりたい場合は選択肢としてありだと感じました。
まだ理解していない点が一杯あるので継続して学習したいと思います！
ActiveRecordでテーブルステータスを取得する

Railsアプリケーションの開発中にテーブルの作成日時が欲しくなったので、やり方を調べたりしたので共有です。参考にしたのは、[rails/abstract_mysql_adapter.rb#L135](https://github.com/rails/rails/blob/2164646eb4abac76712520f3a0afb9a4438727c2/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb#L135) あたりのコードです。

```rb
# HACK: クラスを再オープンしてクラスメソッドを定義する
class ActiveRecord::Base
  def self.table_status
    query = "SHOW TABLE STATUS LIKE '#{self.table_name}'"
    connection.select_one(query)
  end
end
```

```irb
irb(main):001:0> User.table_status
   (1.7ms)  SHOW TABLE STATUS LIKE 'users'
=> {"Name"=>"users",
 "Engine"=>"InnoDB",
 "Version"=>10,
 "Row_format"=>"Compact",
 "Rows"=>10,
 "Avg_row_length"=>1638,
 "Data_length"=>16384,
 "Max_data_length"=>0,
 "Index_length"=>180224,
 "Data_free"=>0,
 "Auto_increment"=>11,
 "Create_time"=>2015-02-28 07:48:06 +0900,
 "Update_time"=>nil,
 "Check_time"=>nil,
 "Collation"=>"utf8_unicode_ci",
 "Checksum"=>nil,
 "Create_options"=>"",
 "Comment"=>""}
```
MacからwindowsにRemote Desktop接続したときにIME on/offを英数/かなキーで行う

BootcmapのwindowsからRDP接続したとき困ったので調査。
RDP接続先のwindowsにて設定

## Microsoft Office IME 2007

![ime.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/bb342a42-aecb-bada-d329-fedb64c9bc89.png)

* ひらがな -> IME-オン
* 無変換 -> IME-オフ

## Google IME

![google1.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/20b0b5b9-d3a8-683e-7398-5af93e811759.png)
![google2.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/33665e3e-2089-b017-4bc1-9dcb790fd6f8.png)

* 変換前入力中 -> Hiragana -> IME-オン
* 入力文字なし -> Muhenkan -> IME-オフ
PrimeFacesのテーマのデモページ

PrimeFacesでは無料のテーマがいくつか公開されているけれども、[テーマのページ](http://primefaces.org/themes)に行ってみても無料のテーマのところはカレンダー部品の部分しかなくてどんなテーマなのかイマイチ掴みづらい。
テーマを選ぶためにわざわざ実装しないといけないのーと思っていたらそんなことはなくて、showcaseのThemeSwitcherというところで無料のテーマを見ることができたのでメモしておく。

http://www.primefaces.org/showcase/ui/misc/themeSwitcher.xhtml

ここに行けば各テーマのすべての部品を見れるわけじゃないけど、大体の感じはつかめると思う
Faster and Reproducible Ruby Development Workflows

Originally posted in http://aespinosa.github.io/blog/2015-05-16-fast-and-reproducible-ruby-workflows.html

If you're doing development and cloning ruby based repositories, sometimes you
want to cleanup your ruby gems spec or vendor/bundle directory.  It is important
to do a clean 'bundle install' so you won't experience "it works on my machine"
syndrome.

However, downloading gems from rubygems.org all the time is not the best
experience in the world if you have a large Gemfile or rubygems.org is down
itself.

Java developers have had this feature in maven with 'proxy repositories'.
Fortunately, you can do this same thing with [Sonatype
Nexus](https://sonatype.org/nexus).  Following the described documentation on
proxy gem repositories[^1], Have something like this configured for
rubygems.org:


```
Repository ID: rubygems
Repository Name: rubygems.org
Repository Type: proxy
Repository Policy: undefined
Repository Format: rubygems
Contained in groups: 

Remote URL: https://rubygems.org
```

Likewise, you can have this in your ~/.gemrc

```
---
:sources:
- http://127.0.0.1:8081/nexus/content/repositories/rubygems/
```

And ~/.bundle/config

```
---
BUNDLE_MIRROR__HTTPS://RUBYGEMS__ORG/: http://nexus.dev:8081/nexus/content/repositories/rubygems/
```

Now, all gem downloads will be cached in nexus. The next time you do a 'git
clean -fdx && bundle install', you don't have to wait to download the Internet
to get your Ruby builds working.  This setup is useful especially for CI servers
like Jenkins so that the next subsequent build times will be siginificantly
less.

[^1]: <http://books.sonatype.com/nexus-book/reference/ruby-proxying-registries.html>
【Swift】セッター(Setter)、ゲッター(Getter)の処理を書く



# コンピューテッド・プロパティ（Computed Property）を使う。
コンピューテッド・プロパティ（Computed Property）は
ゲッターメソッドとセッターメソッドと呼ばれる２つのメソッドを提供するプロパティのこと。

# 使い方の例

Itemクラスにprice（税抜き価格）とintaxPrice(税込み価格)があります。

`intaxPrice`がComputedプロパティとなっており、
`intaxPrice`を取得する際に`get`メソッドが呼ばれ、
値をセットする際に、`set`メソッドが呼ばれます。

```swift
class Item {
    
    // 税抜き価格
    var price:Double = 0
    
    // 税込み価格
    var intaxPrice:Double {
        
        // 値を取得するときに呼ばれる。
        get{
            return self.price*1.08
        }
        
        // 値がセットされるときに呼ばれる。
        set(p){
            price = p/1.08
        }
    }
    
}
```

下記がアクセスした際の具体的な例です。

`item.intaxPrice = 108`でintaxPriceのsetメソッドが呼ばれ、
itemに `108/1.08 (100)`の値がセットされる。

`item.intaxPrice`でintaxPriceのgetメソッドが呼ばれ、
`itemの値(150)*1.08`の162が返ってくる。

```swift
// Itemクラスのインスタンスを作成
var item = Item()

// intaxPrice.setが呼ばれる
item.intaxPrice = 108
// itemに税抜き価格100がセットされている。
println(item.price)

item.price = 150
// intaxPrice.getが呼ばれる。(150*1.08の値=162が返ってくる。)
println(item.intaxPrice)

```

```
100
162
```
Ansibleでユーザ追加してからsshログイン

simple-playbook.ymlは下のような書き方で wangというユーザを追加したあとにそのユーザに対して、sshのパブリック鍵でログインできるようにする

```
---
- hosts: all
  sudo: true
  vars:
    # パスワードをハッシュ化
    # $ openssl passwd -salt 123 -1 p@ssW0rd
    password : ((23$Ms8m3027INiL/x4hBcH3c1))
    user : wang

  tasks:
    - name: create a normal user
      user:
        name={{user}}
        password={{password}}
        state=present
        group="root"
        shell=/usr/bin/bash
    - name: Set up authorized_keys for the normal user
      authorized_key:
        user={{user}}
        # ローカルのパブリック鍵を指定する
        key="{{ lookup('file', '/Users/wang/.ssh/id_rsa.pub') }}"
```

参照リンク：
http://docs.ansible.com/authorized_key_module.html
Swift init()から別のinit()を呼び出す方法


# `convenience init()`を使う。

```swift
	init(){
		// 初期化処理
	}
	
    convenience init(){        
		self.init() // init()を呼び出す。
    }
}
```

# 利用例

下記のコードの例を使って説明します。

Messageクラスを初期化する際に、
bodyとtoの両方を初期値で設定したい場合と、
bodyだけ設定してtoはデフォルトの値にしたい場合があるときに使う。

```swift

class Message {

    var body:String
    var to:String

    init(body:String, to:String){
        self.body = body
        self.to = to
    }
    
    convenience init(body:String = "Hello"){
        self.init(body: body,to: "Foo")
    }
    
    func send(){
        println("\(to)さん、\(body)")
    }
}

var m1 = Message(body: "おはよう")
m1.send()

var m2 = Message(body: "おはよう", to: "Hoge")
m2.send()
```

```swift:出力
Fooさん、おはよう
Hogeさん、おはよう
```
1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題５

「[1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に](http://www.softantenna.com/wp/software/5-programming-problems/)」の問題5をJava8で解いてみました。
Streamとforループの組み合わせが気持ち悪いですが、とりあえず動きます。

```java
static <T> List<T> cons(T head, List<T> tail) {
    List<T> list = new ArrayList<>();
    list.add(head);
    list.addAll(tail);
    return list;
}
static Stream<List<String>> split(String s) {
    if (s.length() <= 0) return Stream.of(Arrays.asList());
    Stream<List<String>> b = Stream.empty();
    for (int i = 1, size = s.length(); i <= size; ++i) {
        String head = s.substring(0, i);
        b = Stream.concat(b,
            split(s.substring(i))
                .flatMap(l -> Stream.of(cons(head, l), cons("-" + head, l))));
    }
    return b;
}

@Test
public void q5() {
    split("123456789")
        .filter(l -> l.stream()
            .map(s -> Integer.parseInt(s))
            .reduce(0, (a, b) -> a + b) == 100)
        .forEach(l -> System.out.println(l));
}
```

ストリームではなくリストのリストを返す場合は以下のようになります。

```java
static List<List<String>> splitList(String s) {
    if (s.length() <= 0) return Arrays.asList(Arrays.asList());
    List<List<String>> b = new ArrayList<>();
    for (int i = 1, size = s.length(); i <= size; ++i) {
        String head = s.substring(0, i);
        for (List<String> l : splitList(s.substring(i))) {
            b.add(cons(head, l));
            b.add(cons("-" + head, l));
        }
    }
    return b;
}
```
FileMakerでポップオーバーをボタンクリック時のみクローズする方法

FileMakerの新バージョン14が発売となりました。
スクリプトの編集画面が刷新されて、デフォルトでコードのカラーリングがされるようになったり、インラインで条件などの編集ができるようになり開発効率がだいぶ良くなった印象です。
機会があれば評価版もあるので使ってみて下さい。

スクリプト編集画面はこんな感じです。
![FileMaker14 スクリプト編集画面.png](https://qiita-image-store.s3.amazonaws.com/0/68589/fe2f8ff5-a470-8df0-e70f-05315b04d5ea.png "FileMaker14 スクリプト編集画面.png")


ステマっぽいことはこのくらいにして本題に入ります。
今回はポップオーバーの制御についてです。

デフォルトの動作だとポップオーバーウィンドウの外側の領域をクリックしただけで閉じてしまいます。
この動作の方が都合が良い場合もありますが、編集時などに閉じるタイミングを制御したい場合もあるので、その時にポップオーバー内のボタンを押さないと閉じないようにする方法です。

おまけとして、ポップオーバーボタン以外から開く方法も最後に書いておきます。

#ポップオーバーを閉じる動作の制御方法
## 処理概要
クローズ制御の方法はシンプルで、以前に紹介したトランザクション制御とほぼ同じくフラグで閉じるタイミングを制御します。
ポップオーバーのトリガーでフラグが立っている時だけ閉じるようにしておき、ボタンを押した時にフラグを立てるようにすれば出来上がりです。
![サンプルの動作イメージ](https://qiita-image-store.s3.amazonaws.com/0/68589/23ca1967-97b9-446b-444b-65b651c1e645.png "スクリーンショット 2015-05-16 10.49.51.png")

##オブジェクトの配置
レイアウトに配置したオブジェクトはポップオーバーボタンのみです。
ポップオーバー内に説明用のテキストと閉じる用のボタンを配置しました。

##スクリプトの設定
### ポップオーバーのトリガー用スクリプト定義
グローバル変数のフラグ値を確認し、フラグが立っている場合はTrue。それ以外はFalseを返してポップオーバーを閉じないようにします。
フラグが立ていた時に、クリアするのを忘れると2回目以降制御が効かなくなるので注意してください。

```FMScript:popover.Trg_OnObjectExit
1 #フラグが1に設定されていない場合はFalseを返す
2 If [$$flag = 1]
3 	変数を設定 [$$flag; 値:""]
4 	現在のスクリプト終了 [結果: True]
5 Else
6 	現在のスクリプト終了 [結果: False]
7 End If
```

### OKボタンクリック時のスクリプト定義
ボタンが押された時に、フラグを立ててポップオーバーを閉じるスクリプトステップを呼び出します。

```FMScript:OKボタンクリック用
1 #OKボタンがクリックされた時にフラグ変数を1に設定する
2 変数を設定 [$$flag; 値:1]
3 ポップオーバーを閉じる 
```

##オブジェクトへのスクリプト設定
###ポップオーバーウィンドウへの設定
ポップオーバーウィンドウのOnObjectExitトリガにスクリプトを割り当てます。
![ポップオーバーのトリガ設定.png](https://qiita-image-store.s3.amazonaws.com/0/68589/3e25ec4a-deb9-40bc-7785-ff9d1ecb8dc6.png "ポップオーバーのトリガ設定.png")

###OKボタンへの設定
OKボタンクリック時の設定として、スクリプトを割り当てます。
![OKボタンの設定.png](https://qiita-image-store.s3.amazonaws.com/0/68589/2ff2aa24-f1f2-ee27-5383-c76b2493cc3e.png "OKボタンの設定.png")


以上で、閉じる動作の制御方法は完成です。

#通常ボタンからポップオーバーを開く
続けて、通常ボタンからポップオーバーを開く方法です。
方法としては2通りあります。
１.ポップオーバー内のフィールドに移動する
２.ポップオーバーウィンドウに名前を付けておき、オブジェクトに移動する

ここではサンプルとして、オブジェクトに移動する方法を説明します。
## ポップオーバーウィンドウに名前を付ける
オブジェクト名はレイアウト内で一意であれば、どんな名称でもかまいません。今回は、"popover.テスト用"としました。
![ポップオーバー名称.png](https://qiita-image-store.s3.amazonaws.com/0/68589/44b7a641-8618-9d98-e616-06760e447350.png "ポップオーバー名称.png")

## 通常ボタンを用意する
通常のボタンを配置して、クリック時にスクリプトステップ「オブジェクトに移動」で先ほどポップオーバーウィンドウに付けた名前を指定します。
![通常ボタンの設定.png](https://qiita-image-store.s3.amazonaws.com/0/68589/7e03e9e4-4321-b172-d64e-9b7f169a8da3.png "通常ボタンの設定.png")

以上の設定でボタンを押すと、指定した名称のポップオーバーを開く事が可能になります。

今回は以上です。
少しでも参考になれば幸いです。


今回のサンプルは以下の場所に置きましたので、詳しくはファイルを参照して下さい。
[サンプルファイル](http://it-komons.jp/filemaker/samples/popover_ctrl.zip)
SpriteKitを試してみる10 パラパラアニメ


![iphonePlay_20150516.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/00211852-c715-61b2-f599-8e2d7296538e.gif "iphonePlay_20150516.gif")


プレイヤーキャラクターを竜からコウモリへと大きく変換し、更に火ではなく音波的な何かに変更するという我ながら大胆な方針変換。
パラパラアニメを実行するのに参考したのは以下のページ

[[iOS 7] Sprite Kit の Texture Atlas を使ってみた](http://dev.classmethod.jp/references/ios7-spritekit-texture-atlas/)




1.パラパラアニメ用の画像を用意する（これが一番面倒だ）
![bat1.png](https://qiita-image-store.s3.amazonaws.com/0/40693/f8da8361-d1e8-4548-b489-fd85ebb208de.png "bat1.png")
bat1.png
![bat2.png](https://qiita-image-store.s3.amazonaws.com/0/40693/5bbecbb7-3979-687c-a110-13eeab295d53.png "bat2.png")
bat2.png

2.用意した複数の画像をXXX.atlasフォルダにまとめてプロジェクトにコピーする
bat.atlas
 |
 |- bat1.png
 |- bat2.png


3.パラパラアニメを実行する

```

let atlas = SKTextureAtlas(named: "bat")
let b1 = atlas.textureNamed("bat1")
let b2 = atlas.textureNamed("bat2")
        
let action = SKAction.animateWithTextures([b1, b2], timePerFrame: 0.25)
dragon.runAction(SKAction.repeatActionForever(action))
        
```

playerユニットの名前がdragonのままですな。やはりこういったものに特定される変数名を使うと後で困りますね。今更な間違いだ・・・

音波も同じ調子で作ればＯＫ。

動き的にはもう完成に近い。
Linuxのフォントを読みやすくする

# TrueTypeフォントを綺麗にする

```bash:
sudo ln -s /etc/fonts/conf.avail/10-sub-pixel-rgb.conf /etc/fonts/conf.d/
```

もしくは

```bash:
sudo ln -s /usr/share/fontconfig/conf.avail/10-sub-pixel-rgb.conf /etc/fonts/conf.d/
```


## 設定前

takao
![ttf-takao.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/d76a758a-2b35-2a37-2d47-8ced5cc2d9d6.png)

## 設定後

takao
![ttf-takao-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/1dda6ff7-1fd6-9143-a575-2c3ec607f04e.png)


# bitmapフォントを使ってみる

* 参考　
  * [[SOLVED] Bitmap fonts (e.g. Fixed 6x13) in gnome terminal](http://ubuntuforums.org/showthread.php?t=1270870)

```bash:
sudo apt-get install -y fonts-mplus
```

```bash:70-yes-bitmaps.confを有効にする
rm /etc/fonts/conf.d/70-no-bitmaps.conf
ln -s /etc/fonts/conf.avail/70-yes-bitmaps.conf /etc/fonts/conf.d/
もしくは
ln -s /usr/share/fontconfig/conf.avail/70-yes-bitmaps.conf /etc/fonts/conf.d/
```

```bash:
dpkg-reconfigure fontconfig
```

Xの再起動を行うとフォント一覧にbitmap fontが追加されている。

![mplus.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/c4c0641c-edf2-84f2-0fb2-3e2e3e50356a.png)
gitWatch > commit message > 引数を追加した/削除した > xxx takes bg, fg args, remove flip arg.

https://github.com/emacs-mirror/emacs/commit/67a878f78f879ce534232408c34dd11f42dd802b

> * nsterm.m (ns_draw_fringe_bitmap): initFromXBM takes fg, bg args, remove flip arg.

引数を追加したというコミットメッセージはこれまで
add parameters fg, bg to initFromXBM()
のように書いていたが、上記のようにinitFromXBMを主語にすればより簡潔に書けそうだ。

removeの部分は命令形(. Remove)でなくinitFromXBMが主語とするならremovesが正しいのだろう。

また、リンク先では各ファイルの変更についてきちんとコミットメッセージを書いている。後から見る時に便利なのかもしれない。
Windows 8.1 に Visual Studio 2013 community を入れる

Visual Studio 2013 community を Windows 8.1 に入れる方法を示す（ちょっとだけ躓いたので

## Micorosoft の アカウントを作成しておく
　
Visual Studio 2013 community のりようには Microsoft のアカウントが必要なので事前に登録しておく。

[Micfosoft サインイン](https://login.live.com/login.srf)
　
このページ下部に「Microsoft アカウントをお持ちでない場合 新規登録」というリンクがあるので、アカウントがない場合はこちらから登録を済ます。

注：これからもろもろのインストールを進めていくけど、途中途中で再起動を促されたら素直に再起動をしていってください。


## Visual Studio 2013 community のダウンロード

[Visual Studio のダウンロード](https://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs#d-community-expando)

![スクリーンショット 2015-05-15 11.31.28.png](https://qiita-image-store.s3.amazonaws.com/0/9988/6165b1f4-99ea-2021-d6ed-6e863b282ac9.png)

Community 2013 Update 4 を展開して、今すぐインストールをクリック

![スクリーンショット 2015-05-16 10.01.53.png](https://qiita-image-store.s3.amazonaws.com/0/9988/e668ffc8-c8db-1a11-8042-6c3a7171991e.png)

 「I agree to the Licence Terms and Privacy Policy.」にチェックをいれインストールを進める。

![スクリーンショット 2015-05-15 14.36.19.png](https://qiita-image-store.s3.amazonaws.com/0/9988/92afddfa-2d92-6cb4-ee7b-60ea599f3485.png)

たぶん、インストールは滞り無く終わると思う。


## Windows Update を済ませておく
　
Visual Studio に関係ありそうな「.NET」や「言語周り」のアップデートを済ませておく。



## 日本語の言語パック入れる

先ほど本体をダウンロードした場所の右側に言語パックがあるよ

![スクリーンショット 2015-05-16 10.11.45.png](https://qiita-image-store.s3.amazonaws.com/0/9988/2efb6d94-59d3-de74-249f-7337ce876946.png)

「ダウンロード言語」で言語を選択するドロップダウンがあるのだが、選択している言語と、下部「Microsoft Visual Studio 2013 言語パック - XXX」の XXX がちゃんと「日本語」になっているのを確認してダウンロード

＊（この UI うまく動いてないw もしドロップダウンで 日本語を選択しても English になってたりするようだったら選択しなおしてね）


ダウンロードした vs_lanacgpack.exe を実行すると、インストール後半でこんなエラーが出る可能性がある（Windows 8 pro、Windows 8.1 pro で確認しています）

![err.png](https://qiita-image-store.s3.amazonaws.com/0/9988/6be41666-2821-b8fc-41e2-b381581fd49e.png)

「Microsoft Visual Studio で、インストールされている言語リソースのバージョンの不一致が検出されました。このような状況は、異なるバージョンの製品（Beta、RC、RTM）が異なる言語に対してインストールされているインスタンスで発生する可能性があります。

全ての古いバージョンと言語パックをアンインストールするか、これらを全て最新バージョンにアップグレードしてください。問題が解決されるまで、Microsoft Visual Studio は開始されないか、正しく機能しない可能性があります。」

とまあ若干面倒くさ目のこと言われるけど、「OK」を押して（中断などをせずに）インストールを終わらせてください。この OK ボタンを押してからは若干待たされる可能性があるかもです。
　

## 修復する

コマンドプロンプトで vs_lanacgpack.exe のある場所に移動し、/repair を実行

![スクリーンショット 2015-05-16 9.50.47.png](https://qiita-image-store.s3.amazonaws.com/0/9988/7b611c29-553f-7c00-d784-6f14ada0bcc9.png)

これで、もう一度言語パックの入れなおし的なのが走るのかな？僕の環境ではこの工程を踏むことで問題なく動くようになりました。また、先ほどの「バージョンの不一致がなんちゃら」っていうエラーも起きませんでした。すごく時間がかかるかもだけど、この修復工程も耐えてね
　
## 日本語設定をする

TOOLS -> Opsions... を選択

![スクリーンショット 2015-05-16 10.27.28.png](https://qiita-image-store.s3.amazonaws.com/0/9988/f66fa13d-e274-5004-9e07-27bfebc44853.png)

International Settings を選び、Language から「日本語」を選択

![スクリーンショット 2015-05-16 10.27.56.png](https://qiita-image-store.s3.amazonaws.com/0/9988/5191d533-b854-d425-772c-ef430bffe18b.png)

Visual Studio を再起動して完了です。これで C# やら TypeScript の鉄板開発環境が手に入れられました
Rubyのクラス変数に外部からアクセスしようとしてハマった

# TL;DR
クラスに対して、`class_eval`を**文字列で**呼び出す。
# 横紙破りも時には必要
オブジェクト指向の言語ではカプセル化された内部状態には外からアクセスできない、純粋関数型言語では変数は状態を持たないなど、言語ごとに書く上での「ルール」がありますが、時にはそのルールを越えた形で書かないといけない場面もあります。C++であれば`friend`宣言、Objective-Cでのオブジェクトシステムへのアクセスのように、そういう「横紙破り」を行うシステムを言語内部に持っている場合もあります。
# Rubyでのeval系メソッド
他のスクリプト言語と同様、Rubyにも`eval`がありますが、それだけではなくて、評価コンテキストを変えた上で指定されたものを実行するevalもあります。

* `instance_eval`…レシーバのインスタンスに評価コンテキストを変えてevalする
* `class_eval`、`module_eval`…クラスやモジュールの定義部に評価コンテキストを変えてevalする

そして、これらのメソッドは、普通のevalでのような文字列だけでなく、ブロックを引数とすることもできます。
## クラス変数にアクセスしてみる
今回、外部からクラス変数にアクセスするという用事が発生したので、いろいろと試行錯誤したのですが、なかなかうまく行きません。いろいろ試してようやく結論にたどり着きました。

* `instance_eval`では、クラス変数は呼び出した環境と紐付いたままになっている
* `class_eval`を使った場合も、クラス変数を当該クラスと紐付けるには、引数を文字列にする必要がある（[るりま](http://docs.ruby-lang.org/ja/2.0.0/method/Module/i/class_eval.html)）。

そういうことで、`SomeClass.class_eval '@@some_class_variable'`のように書くことで、アクセスすることができました。

# 余談
試行錯誤中に気づいたのですが、Rubyでのトップレベルコンテキストはすなわち、`Object`のコンテキストになっています。つまり、（警告はされますが）トップレベルで`@@foo=3`のような代入を実行すると、それはObjectのクラス変数、さらにはそれを継承する**ほぼすべてのクラスで共通する**クラス変数になってしまいます。まずやらないことだとは思いますが、気をつけましょう。
Androidでhostsファイルを変更するときの注意点

環境のアップデートによって今まで使えてたhostsファイルが読み込まれていなくてなんでだろうと小1時間ほど悩んだのでそのメモです。  
動作環境はエミュレーターなのですが実機でも同じだと思います。
どうもlolipopから仕様が変わったようですね。

結局必要だったのは以下の2点でした。

* hostsの先頭行は`127.0.0.1 localhost`にする
* 改行コードはLFを使う

アドレスとホスト名の区切りはtabを使ってます。

頼りになるのは[我らがstackoverflow](http://stackoverflow.com/questions/28009391/hosts-file-in-android-lollipop-not-being-used)です( ´∀｀)bｸﾞｯ!
WordPressで抜粋を使う時のフィルターフック


## 抜き出す文字数を変える

```php:functions.php
function excerpt_mblength_func($length) {
	return 38;
}
add_filter('excerpt_mblength', 'excerpt_mblength_func');
```

## 省略記号を変更する

```php:functions.php
function excerpt_more_func($more) {
    return '...';
}
add_filter('excerpt_more', 'excerpt_more_func');
```
mrubyでmrbgemのテストで外部コマンドを使うには

# 2016/7/23 追記

```
spec.add_test_dependency 'mruby-io'
```

というように記述することで、可能になってます。

# 背景

mrubyで画像処理を行う[mruby-mrmagick](https://github.com/kjunichi/mruby-mrmagick)を作っていて、
画像処理結果のテストをそろそろせねばという事になり、
手っ取り早いのはImageMagickのconvertコマンドなどを動かして
出来た画像と比較すればいいのでは、と考えた。


# 困ったこと

mrubyは必要なmrbgemsをコンパイルしてmrubyにまとめて、これを使うことにより、
様々な拡張機能を利用できた。

当然、テストの際もこれらの拡張機能が利用できるものと考えていたが、
テストの際はmrubyコマンドが使われることは無いようで、テスト用にはそれぞれのmrbgemsの内部？の機能のみが使用出来る状態のmrubyが動くような感じだった。

# 解決方法

mrbgemsの依存関係の指定がmrbgem.rakeファイルにて記述出来るので、こちらに

```
spec.add_dependency 'mruby-io'
```

を追加した。ビルドの依存関係としては、依存しないのが気になるところであるが、

ありがたいことに
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">mrbtestって、テスト対象のmrbgemsしかうごかせ無いのかなぁ、バッククォート、使ってimagemagick動かせず、mruby-ioでIO#popenに変えても、IOなんて定数知らないと怒られてる</p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/599088545924403201">2015, 5月 15</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
と、呟いたところ、早速
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/kjunichi">@kjunichi</a> test_dependenciesを上書きしたら、なんとかなるかもしれません</p>&mdash; take-cheeze (@take_cheeze) <a href="https://twitter.com/take_cheeze/status/599089415319752704">2015, 5月 15</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
というヒントを頂いたものの、現状の自分のruby力(rakeコマンドはCRubyで動いている理解)では、ハードルが高かったので、
当面このやり方でテストを進めようと思う。

もっと良いやり方あったら是非教えてください。

# 外部コマンドを使ってテストコード

```
assert("Mrmagick::Image#scale") do
  `convert -size 640x480 -background "#C0C0C0" -fill "#FFFF00" caption:"ABC" output.png`
  Mrmagick::ImageList.new("output.png").scale(0.5).write("t.png")
  `convert -scale 50% output.png dest.png`
  `composite -compose difference dest.png t.png diff.png`
  t= `identify -format "%[mean]" diff.png`
  assert_equal("0",t)
end
```

# 関連投稿

- [mruby - mrbgemsでC++のAPIを呼ぶgemを作るには - Qiita](http://qiita.com/kjunichi/items/c9c9b15d5c3f9d89bb05)
- [mrbgemsの雛形を作る超便利ツールmruby-mrbgem-templateを使う - Qiita](http://qiita.com/kjunichi/items/128427532a29e231072f)

# 関連記事

- [WindowsでmrubyからGoで作ったライブラリを呼び出して、Webカメラの画像をコマンドプロンプトに表示した](https://abrakatabura.hatenablog.com/entry/2017/09/01/072123)
- [mrubyでWebカメラを黒い画面にそのまま表示できるようにした](https://abrakatabura.hatenablog.com/entry/2017/02/25/080830)
- [mruby-juliaでPythonもmrubyから呼び出せるようになった](https://abrakatabura.hatenablog.com/entry/2016/07/02/183532)
- [iOSでもCordovaプラグインを作ってmrubyを動かした](https://abrakatabura.hatenablog.com/entry/2016/10/08/072147)
c++ > C++のためのAPIデザイン > pimplの利点と欠点

引用: C++のためのAPIデザイン by マーティン・レディ (p82からp89あたり)

pimpl(Pointer to Implementation)の利点と欠点

#利点
>- 結合度の削減 > 依存性を.cppに移動し、結合要素をすべて除去できる
- コンパイル時間の高速化 > APIのインクルード階層が削減できる
- バイナリ互換性の向上 > pimplオブジェクトはシングルポインタ１つのみ > オブジェクトのバイナリ表現を変更せずに、実装に大きな変更を加えることができる
- レイジー割当て > mimplクラスは必要に応じて作成できる > ネットワーク接続などの制限のあるリソースやコストの高いリソースをクラスが割当てる場合に役立つ

#欠点
>- 作成したオブジェクトごとに追加の実装オブジェクトを割当て > 割当て解除しなくてはいけない
- コンパイラがconstメソッド内のメンバ変数の変更をキャッチしなくなる (メンバ変数がもはや別のオブジェクトに存在するから)
Effective C++ (3rd) > 31項 > オブジェクトの実装をポインタの後ろに隠す > クラスをインタフェース用のものと実装用のものに分ける

引用: Effective C++ 第3版

> 31項 ファイル間のコンパイル依存性をなるべき小さくしよう
>...

> 「オブジェクトの実装をポインタの後ろに隠す」ということを自分ですることができます。そのための一つの方法は、クラスをインタフェース用のものと実装用のものに分けるというものです。
> たとえば、...実装用のクラスPersonImplとインタフェース用のクラスPerson...

```cpp
#include <string>
#include <memory>
class PersonImpl; // Personを実装するクラスの前方宣言
class Date;       // Personで使うクラスの前方宣言
class Address;    // Personで使うクラスの前方宣言

class Person {
public:
  Person(const std::string& name, const Date& birthday,
     const Address& addr);
  std::string name() const;
  std::string birthDate() const;
  std::string address() const;
  ...
private:
  std::tr1::shared_ptr<PersonImpl> pImpl; // 実装へのポインタ
};
```

> ...
> このようにデザインすると、Personを利用するコードは、DateやAddress、Personの実装の詳細から切り離されることになります。そのため、これらのクラスの実装は自由に変えることができるのです。それらの実装を変更しても、Personを利用するコードを再コンパイルする必要はありません。
Effective C++ (3rd) > 31項 > string > クラスでなくbasic_string<char>をtypedefしたもの

引用: Effective C++ 第3版
> stringはクラスではなく、basic_string<char>をtypedefしたものです。そのため、stringの前方宣言は誤りということになります。正しい前方宣言は、他のテンプレートも含めなくてはならないので、もっとずっと複雑になります。しかし、それは大きな問題ではありません。そもそも標準ライブラリの一部を取り出して前方宣言するべきではないのです。標準ライブラリについては、単純に#includeを使えばよいのです。

http://ja.cppreference.com/w/cpp/string/basic_string
>- std::wstring
- std::u16string
- std::u32string

[SO](http://stackoverflow.com/questions/12434201/why-is-my-stdstring-getting-converted-to-stdbasic-stringchar)
> See §21.4 Class template basic_string [basic.string] of the C++11 specification.
noVNCをDockerで動かす際に注意すること

# noVNCとは

- https://github.com/novnc/noVNC

HTML5で実現されたVNCクライアント。アプリのVNCクライアントの代わりに
ブラウザでVNCサーバーへアクセス出来る。

とはいっても、noVNCサーバー的なものを動かすため、残念ながらフロントエンドだけで
閉じているわけではない。

# noVNCをDockerで動かす際の注意

別にDockerで動かす場合に限ったことではないが、
以前はパスワードが1234など数字のみでOKだったが、
最近は数字とアルファベットの組み合わせにしないと認証エラーで
弾かれる模様。github上のnoVNCをつかったDockerファイル

っとここまで書いてどっかに書いた気がするんだが。。

- [ターミナルで動くansi-vncをDockerで試した - Qiita](http://qiita.com/kjunichi/items/cb2d97730d812fb39357)

これでした。でも、これはnoVNCではなく、同様のVNCクライアントの
話で、noVNCは最近これに追随したのだろうか。

# まとめ

noVNCを使えば、HerokuでXアプリが動かせそうですね！

# 関連記事

- [Dockerの画面をiPhoneに表示する](https://abrakatabura.hatenablog.com/entry/2014/09/10/205608)
- [俺がdockerでX11なアプリの表示確認をするやり方](https://abrakatabura.hatenablog.com/entry/2014/12/05/062932)
- [Xサーバーを入れずに、WSLでXクライアントを動かす](https://abrakatabura.hatenablog.com/entry/2017/12/26/214414)
技術英語 > 誤って...する > The administrator can [accidentally] make changes which conflict with each other.

http://en.wikipedia.org/wiki/Software_rot

> The administrator can accidentally make changes which conflict with each other.

http://www.handyrecovery.com/
> files accidentally deleted from hard disks 

オックスフォード現代英英辞典
> accidental
> happening by chance; not planned

[by chanceとby coincidenceとby accident](http://soudan1.biglobe.ne.jp/qa2377273.html)にそれぞれのニュアンスが紹介されている。
VBAHaskellの紹介 その13 （プレースホルダの追加： _1 と _2 ）


VBAHaskellで2変数関数を合成するときの自由度を高めるために新しいプレースホルダ ph_1 と ph_2 を導入した。これの直接のきっかけは以下の問題 [^1] を解くことだった。

```
問題4
正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述せよ。例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる。
```
これには下のような比較関数を使ってソートする必要がある。[^2]

```vbnet
'比較関数（aとbは数字だけからなる文字列とする）
Function Question4Comp(ByRef a As Variant, ByRef b As Variant) As Variant
    'a,bの順に結合した文字列を数値化  <  b,aの順に結合した文字列を数値化
    Question4Comp = IIf(Val(a & b) < Val(b & a), 1, 0)
End Function
```
もちろんこれでいいのだが、こういう単純な比較関数はいちいちモジュールに書くのではなく、関数合成で作り出したい。しかし今までの実装では難しかったので、C++側を改造しVBA側で新しく2種類のプレースホルダを追加した。
これまでの実装では比較関数 f(x, y) の中で何か計算をしようとして関数を合成しても、f(g(x), h(y)) という形にしかならなかった [^3]。 f(x, y) の x には第1引数のみ、y には第2引数のみを渡していたのである。実引数(a, b)を代入すると f(g(a), h(b)) となるので、a と b は分離され結合文字列を作ることができない。ab を逆順の ba にすることも難しい。
単純に f(g(a, b), h(a, b)) を評価するように変えればいいが、合成されていないただの f(x, y) に適用したときには f(a, b) となるべきで、 f(a, a) とか f(b, b) になってはいけない。もちろんVBAのユーザーコードは修正不要にしたい。
そこで、C++標準ライブラリのstd::placeholdersにある \_1 や \_2 のような明示的なプレースホルダを導入することにした。これまでプレースホルダは関数の中で置かれている位置によって第1引数を受け取るか第2引数を受け取るかが決まっていたが、これらは場所に依存せずに受け取る引数を決め打ちできる。もちろん \_1 は第1引数を受け取り、\_2 は第2引数を受け取るプレースホルダだ。
VBAではアンダースコア '\_' で始まる変数や関数がエラーになってしまうので、\_1、\_2 ではなく ph_1 と ph_2 と名付けている [^4]。

具体的にはこうなる。

```vbnet
' f(x, y) = CLng(x & y) < CLng(y & x)    と同じ
comp4 = p_less(p_getCLng(p_plus(ph_1, ph_2)), p_getCLng(p_plus(ph_2, ph_1)))

' dumpFunで中身を見てみる
?dumpFun(comp4)
F8652(F1868(F6828(_1, _2), _), F1868(F6828(_2, _1), _))
```
これを使って対象の配列に対するソートインデックスを作ればいい。ただし問題が「最大数」を求めるものなので逆順にしてから適用する。

```vbnet
' 上の方のcomp4を使う
s = sortIndex_pred(arr, comp4)     ' ソートインデックスを出力
result = subM(arr, reverse(s))     ' 逆順に並べ替える
```

このサンプルを[テストモジュール](https://github.com/mYmd/VBA/blob/master/test_module.bas)に追加した。(Sub sortTest2)

[VBAHaskellの紹介 その12（1時間以内に解けなければプログラマ失格がなんたら）](http://qiita.com/mmYYmmdd/items/ebc526a81157f060cc61)
[VBAHaskellの紹介 その1（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)

[^1]: [1時間以内に解けなければプログラマ失格となってしまう5つの問題が話題に](http://www.softantenna.com/wp/software/5-programming-problems/) の問題4
[^2]: これの説明は、ブログ [比較関数の自然な例(2)](http://mmyymmdd.hatenablog.com/entry/2015/05/13/230338) の方に書いた。
[^3]: 正確には g と h は2変数関数のうち1変数を束縛したものなので、f(g(x, x), h(y, y)) が正しい。
[^4]: [Haskell_1_Core.basモジュール](https://github.com/mYmd/VBA/blob/master/Haskell_1_Core.bas) に追加。
経緯度点列データを与えOpenStreetMapデータから道路を特定してみる

こんにちは。
[mongodb に OpenStreetMap データを取り込んだ](http://qiita.com/kkdd/items/92a95caf54e6792bcbd6)ので（[goosm](https://github.com/bocajim/goosm)利用）、応用として、道路に沿って移動した「経緯度点列データ」（下記で青色）を与えた時、その道路（緑色）を特定する問題を考えてみました。geojson形式で書き出しています。

ただし、OpenStreetMap の way データ (highway) は、両端に vertex を持つ単純な edge （線分）である必要があります。

<img width="400" alt="printgeojson.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/54617/44f9bb36-bb19-17e3-9c28-60e35f72d2e3.jpeg">

```python
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
import simplejson
import textwrap
from pymongo import MongoClient

client = MongoClient('localhost')

def queryNear(coord, radius):
    return ({"geometry": {"$near": {"$maxDistance": radius, "$geometry": {"type": "Point", "coordinates": coord}}}}, {"_id": 1, "geometry.coordinates": 1, "nodes": 1})

def printgeojson(type, coordinates):
    fmtstr = """\
    {
    "type": "Feature",
    "geometry": {"type": %s, "coordinates": %s},
    "properties": {}
    }"""
    fmtstr = textwrap.dedent(fmtstr)
    print(fmtstr % (type, coordinates), end='')
    return 0

def printNodes(tracks):
    nodes = []
    colnodes = client['osm_nodes']['data']
    prepend = ''
    for coord in tracks:
        results = colnodes.find(*queryNear(coord, radius))
        for r in results:
            if r['_id'] not in nodes:
                nodes.append(r['_id'])
                print(prepend, end='')
                printgeojson("Point", r['geometry']['coordinates'])
                prepend = ',\n'
    return nodes

def printEdges(tracks, nodes):
    edges = []
    coledges = client['osm_edges']['data']
    prepend = ''
    for coord in tracks:
        results = coledges.find(*queryNear(coord, radius))
        for r in results:
            if r['_id'] not in edges and set(r['nodes']).issubset(nodes):
                edges.append(r['_id'])
                print(prepend, end='')
                printgeojson("LineString", r['geometry']['coordinates'])
                prepend = ',\n'
    return edges

def main():
    radius = 30.0
    tracks = [[lon0, lat0], [lon1, lat1], ...] # <== 経緯度点列データを与える
    nodes = printNodes(tracks, radius)
    edges = printEdges(tracks, radius, nodes)
    exit(0)

if __name__ == '__main__':
    main()
```
関数が実行された後に別の関数を実行したい時の関数


こういう関数を定義する。

```js
function callAfter(func, done) {
  return function () {
    var returnValue = func.apply(func, [].slice.call(arguments));
    done();
    return returnValue;
  };
}
```

こういう風に使う。

```js
function hoge (a, b) {
  console.log('hoge!');
  return [a, b];
}

function afterHoge () {
  console.log('after hoge!');
}

// hogeが実行された後にafterHogeを実行する関数を生成
var newHoge = callAfter(hoge, afterHoge);

console.log(newHoge('1', '2'));
// 出力
// > hoge!
// > after hoge!
// > [ '1', '2' ]
```
Laravel5に思うところ

## 概論
Laravel5は開発環境を整えるのがすごく楽だし、開発もすごく楽にしてくれるのですごくよい。
しかし不満もあって、将来のLaravelの姿に懸念を抱くものがある。
このメモによってLaravelの見据えている将来かコミュニティの意思を知ることができればよいなと思うので、意見やアドバイスが欲しい。

## きっかけ
Laravel5になって変わったところはいくつもあるが、一番論争が起きているのはModelディレクトリの削除である。
自分はこのModelディレクトリの削除に懸念を抱き、調べてみても納得できる情報はなかった。
なので、自分の考えを正すべきなのかどうかが気になった。

## 前提
懸念点を挙げる前に、軸となる自分のフレームワークに対する考えを整理しておきたい。
そもそもそこが間違いだというのならご指摘いただきたい。
### フレームワークとは
* アプリケーションの雛型

### フレームワークの利点
* 開発速度をあげる
* セキュリティの担保
* 品質の担保

上記の利点を担保するものは、それぞれのフレームワークの工夫によると思うが、下記が主流だと考える

* **CoC** （設定より規約） 
    * こういう枠組みで組むと良いという思想やレールに沿って開発することで余計なことを考えずに済む
* **自動化を意識した構造の提供**
    * テスティングのしやすさ
    * デプロイのしやすさ（dotEnvファイルなど）
* **各種汎用ユーティリティの提供**
    * バリデーション
    * コマンド
    * ORM
    * など

## Laravelの懸念点
ここから本題に入る。
私が懸念に思っているのはModelフォルダの削除の件だ。その修正自体よりも、背景にある思想が未来を危ういモノにしているのではないかと感じる。技術的な面と思想的な面から、私の考えを挙げる。

### 技術的な面
* MVCのMへの誤解を解くためとのことだが、フォルダの削除ではそれを解決していない
    * ~~そもそもモデルフォルダが悪いのではなく、誤った開発者が悪いのでは？~~
* デフォルトがapp直下にモデルを作成していくスタイルは煩雑な構造を生み、デフォルトは非推奨に等しい
* CoCに従えないためメンテナンス性が犠牲になる

### 思想的な面
* フレームワークとしての責務を放棄している
    * CoCの観点では余計なことを考えずに済むことがフレームワークのメリットであるが、自由に構造を構築することを推奨しており、設計を開発者にまかせている
    * 実装方法を限定し、誤解されたまま広まってしまうことが怖いと Dayle Rees は言及しているが、実装を限定しないことによって誤った実装方法を選択するリスクも存在する

### その他
自分が考える懸念点は以上だが、上記によるデメリットをもう少し深く補足しておく。
フレームワークとしての責務（CoCに則らず、開発者に実装を任せる）の放棄がそんなにまずいか？
フレームワークとしてのメリットが享受できないだけでなく、本フレームワークの将来が不安である。
想定される懸念としては以下。

* 独創的な実装方法により、バージョンアップができない（コストがかかる）可能性がある
* 同じくフレームワーク側のマイルストーンの策定が難しくなる可能性がある。
* 共通の仕組みを利用しないことになり、コミュニティでも問題解決がしづらくなる可能性がある
* 実装方法を限定しない、ということは実装方法を改善すべきかどうかの議論もできない
    * つまり、開発的な理由ではなく政治的な理由で改善がなされないことも予想される（日本的な考えかもしれないが）

この考えはただの杞憂かもしれない。本当に職人だけが愛して利用するフレームワークなら誤った選択はしないだろう。しかし、多くの人に利用してもらうということを掲げている以上、そうはならないはずだ。むしろ初心者にはLaravel wayを示してあげる必要がある。


## まとめ
モデルフォルダの削除自体が問題ではなく、フレームワーク開発者（コミュニティ？）の姿勢に不安を感じる。
フレームワークがフレームワークの責務を放棄しているため、ゆるやかに腐っていくことを懸念している。
フレームワーク側としては、実装方法を提示して誤解や誤った方法での実装をさせたくないという考えだが、実際のモデルフォルダの削除自体はなんら解決していないし、自分でフォルダを作るという方法を提示したことでさらなる誤った実装が広がる可能性がある。さらにそれは今後のフレームワークのバージョンアップの足かせになるであろうと予想される。
おおまかな枠組みを考えて提供するのはフレームワーク側であり、利用者もそのメリットを享受するために選択する。フレームワークに存在しない機構は利用者が考えるべきだが、MVCの枠内ならデフォルトはフレームワークが用意してあげるべきでは？


以上
AWSのApache2.4の初期設定とセキュリティ設定

#　最初にする設定 httpd.conf, welcome.conf

設定が無い物は追記して、既存にあるものは変更する。又はコメントアウトして無効化する。

* ServerAdminにemailを設定する。
* ServerNameを設定する。
* クロスサイトトレーシング対策（Basic認証のパスが漏れないようにする。）
* トップページにディレクトリ一覧が表示する事を防ぐ
* CGI を使ってない場合は、/cgi-bin/のエイリアス設定を無効にする。設定をコメントアウトする
* SSI（サーバサイドインクルード）の使用を無効にする（デフォルトで無効なので特に記述追加は無し）

```file:httpd.conf

# 変更 サーバー管理者への問い合わせ先メールアドレスに変更する
ServerAdmin webmaster@example.jp

# 変更 ドメインと合わせる。
ServerName hogehoge@example.com:80

# 追加 クロスサイトトレーシング対策 TRACE無効化
TraceEnable Off 

<Directory "/var/www/html">

    # 変更 -Indexesとしてトップページにディレクトリ一覧が表示する事を防ぐ
    Options -Indexes FollowSymLinks

・・・省略・・・

# コメントアウト cgi-binを使用しない
#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 

#<Directory "/var/www/cgi-bin">
#    AllowOverride None
#    Options None
#    Order allow,deny
#    Allow from all
#</Directory>
```
* アパッチのトップページ（テストページ）を非表示にする。welcome.confの中身をコメントアウト

```file:conf.d/welcome.conf

# コメントアウト テストページを非表示にする
#<LocationMatch "^/+$">
#    Options -Indexes
#    ErrorDocument 403 /error/noindex.html
#</LocationMatch>
```

# 共通セキュリティ security.conf

* レスポンスヘッダ Server Apache/2.4.12 (Amazon)とかfullで出さない。
* レスポンスヘッダ X-Powered-By PHP/5.3.29とか出さない。
* 脆弱性のあるsslプロトコルのsslv3を無効にする。
* .htaccessを許可したいディレクトリは個別に設定する。
* v2.4はデフォルトでServerSignature Off

```file:conf.d/security.conf

# Hide Apache Version
ServerTokens Prod

# Hide Header X-Powered-By
Header always unset X-Powered-By

# Anti POODLE
SSLProtocol All -SSLv3

# .htaccessファイルを許可するディレクトリを個別に指定します。
<Directory /var/www/html/hogehoge>

AllowOverride All
</Directory>
```

# AWS ロードバランサーにぶら下がっている場合 aws_elb.conf

* 408ログがELBから多発する時の設定を入れる。
  コネクションタイムアウトデフォルト60秒なので、RequestReadTimeout headerをそれより大きく設定する
* アクセスログにELBのIPが出てしまうのでアクセス元のIPが表示されるログフォーマットを作成


```file:conf.d/aws_elb.conf

# Set over AWS ELB connection time out default 60s
RequestReadTimeout header=70

# ELB access_log format
LogFormat "%h %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" elbcombined
```

## 最後に

自分の[技術ブログ](https://blog-c.cloudlance-motio.work/)ではフリーランス界隈の情報や最新のIT情報の発信していますので、よろしくお願いします。
Haskellでマージソー・・・トじゃない、なんだこれ！？


謎ソート。

```.hs
merge :: Ord a => [a] -> [a]
merge xs  = f [] $ map (:[]) xs
  where
    f rs (xs:ys:xss) = f (merge' xs ys : rs) xss
    f [] xss = concat xss
    f rs xss = f [] $ xss ++ rs

merge' :: Ord a => [a] -> [a] -> [a]
merge' xs  [ ] = xs
merge' [ ] ys  = ys
merge' (x:xs) (y:ys)
  | x > y     = y : merge' (x:xs) ys
  | otherwise = x : merge' xs (y:ys)
```

6要素のリストを与えた時のマージの偏りが酷かったりする。

```
5  4  3  1  2  6
 \/    \/    \/
 45    13    26
   \    \    /
    45   1236
     \    /
     123456
```

正しくは次のようにマージされるはず。

```
5  4  3  1  2  6
 \/  /    \/  /
 45 3     12 6 
  \/       \/
  345     126
     \    /
     123456
```

ググった結果、ボトムアップマージソートの仲間っぽい。
トップダウンとかボトムアップとかあるのかー（←違いは理解していない）。

---

参考

* [手続き脳によるHaskell -- ボトムアップ マージソート(bottom-up merge sort)](http://www.moon.sannet.ne.jp/okahisa/haskell-sort/bmergesort.html)
* [Merge sort#Bottom-up_implementation](http://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation)
chromiumで動画(flash)を見れるようにする(Lubuntu15.04)

##ピンチ
ニコ動が見れないんです。chromium-browserにはAdobeFlashPlayerがはいってない！
[ペリカン、猫を食べそこねる。 (1:27) ](http://nico.ms/sm7224146 #sm7224146)

![2015-05-15-234442_1280x798_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/79062/875b359c-cafe-ab23-2092-f63ef90ced5b.png)


##AdobeFlashPlayerが使えないワケ
Qiitaには以前にこの問題について調べた方がいらっしゃいました。
[Chromium で Flash Player が使えなくなる件の対処法](http://qiita.com/cm3/items/ec4b6b8dce63bc107510)
> これは Chrome/ium が Adobe Flash の使っている Netscape Plugin API の提供を打ち切るためです。

英語の情報元はこっち。こんな背景があるそうで。
[Use Chromium on Linux? Adobe Flash Will Stop Working From April](http://www.omgubuntu.co.uk/2014/01/chromium-npapi-flash-dropped-april-2014)
>Google are to drop support for the ‘Netscape Plugin API’ (NPAPI) – used by Adobe Flash – on Linux builds of Chrome/ium far sooner than was originally planned.


また、今回はこちらの記事を参考にさせて頂いて、最新のバージョンでの解決方法を紹介いたします。Pepper Flash Player Plugin というものをインストールします。

##バージョン情報

```lang:Ubuntuのバージョンを確認する
cat /etc/lsb-release 
```
>DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=15.04
DISTRIB_CODENAME=vivid
DISTRIB_DESCRIPTION="Ubuntu 15.04"

```lang:Chromiumのバージョンを確認する
chromium-browser --version
```
>Chromium 41.0.2272.76 Ubuntu 15.04

##PepperFlashPlayerPluginをインストール

```lang:パッケージを検索する
aptitude search pepperflashplugin-nonfree
```
>p   pepperflashplugin-nonfree                                               - Pepper Flash Player - browser plugin  

```lang:パッケージをインストールする
sudo aptitude install pepperflashplugin-nonfree
```

（こういう画面ながめるのいいですよね。。。だいすきです。なぜかはプロフィールみてください）
![2015-05-16-000502_1280x777_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/79062/af50c7d2-6a0d-378d-b402-59cd2f665e2e.png)

```lang:Chromiumにプラグインを追加する
sudo update-pepperflashplugin-nonfree --install
```

```lang:Chromiumで下記アドレスを開いてpluginがインストールされたか確認する
chrome://plugins/
```

ブラウザ上で確認できました。
![2015-05-16-010624_1280x798_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/79062/0b2905c9-64f5-4e35-1d60-db8b957b1a5a.png)


##Chromiumを起動してみる

見れた！やったね！！
[ペリカン、猫を食べそこねる。 (1:27) ](http://nico.ms/sm7224146 #sm7224146)

![2015-05-16-001136_1280x798_scrot.png](https://qiita-image-store.s3.amazonaws.com/0/79062/79008bfe-2464-b8b6-d254-f338559278c2.png)


##参考
1. [Chromium で Flash Player が使えなくなる件の対処法](http://qiita.com/cm3/items/ec4b6b8dce63bc107510)
1. [PEPPER FLASH PLAYER INSTALLER FOR CHROMIUM AVAILABLE IN THE UBUNTU 14.04 REPOSITORIES](http://www.webupd8.org/2014/01/pepper-flash-player-installer-for.html)
1. [Use Chromium on Linux? Adobe Flash Will Stop Working From April](http://www.omgubuntu.co.uk/2014/01/chromium-npapi-flash-dropped-april-2014)
GPUImageVideoCameraがleakしてハマった件

色々調べた結果、GPUImageVideoCameraではなく、GPUImageFilterを解放し忘れたのが原因でした。。。
GPUImageVideoCamera自体は-(void)viewWillDisappearとかのタイミングでstopCameraCaptureしてnilでも突っ込んであげれば解放されます。
以上、深夜の覚書でした。
P.S.GPUImageFilterはLUT画像読めるのでAfeterEffectとかからフィルター書き出せて面白いですね。
さくらVPSにCentOS7をカスタムインストールする

# 目的

さくらVPSにCentOS7をカスタムインストールし、ログインする。

# 参考資料

さくらVPSで提供しているインストールガイドを参考にする。

[カスタムOSインストールガイド - CentsOS 7 ](https://help.sakura.ad.jp/app/answers/detail/a_id/2397/related/1)

# インストールする

インストールガイドに従い、CentOS 7 x86_64をインストールする。

# ログインする

カスタムOSインストール内で設定したユーザーとパスワードにてログインする。ログインはさくらVPSのWebサイトからVNCコンソール経由で行う。

[VNCコンソールを利用する@さくらVPS](https://help.sakura.ad.jp/app/answers/detail/a_id/2410)

```bash
login as: root
root@XXX.XXX.XXX.XXX's password:
Last login: Sun Apr  5 20:07:32 2015 from xxxxx.net

SAKURA Internet [Virtual Private Server SERVICE]

[root@ringo0321 ~]#
```