OmniAICreator/Qiita-1.07M huggingface dataset:
過去のリビジョンのNDKを入手する方法

##事情は変わりました
2016年現在では、公式ページに[Revision History](https://developer.android.com/ndk/downloads/revision_history.html)が追加されており、過去のリビジョンのNDKを普通に入手できます。

----

##文脈
cocos2d-x にて Androidで動作を確認するため、 NDK を入手する必要があるのだが、最新のバージョンの NDK（記述している時点で、r10c）だと具合が悪いので、過去のリビジョンの NDK が欲しい（記述しいてる時点で、r9d）。

##問題
[公式ページ](https://developer.android.com/tools/sdk/ndk/index.html)から入手しようとしても *Downloads* に掲載されているテーブルのリンクが最新のもの（記述している時点で、android-ndk-r10c-darwin-x86_64.bin）しか存在せず、所望の NDK が手に入らない。涙目。

##解決方法
ダウンロードリンクの URI を直接所望のリビジョンで書き換えることで、 dl.google.com からダウンドロードできる。例えば下記のようにすれば、r9d の NDK を入手することができる。

> 変更前
http://dl.google.com/android/ndk/android-ndk-r10c-darwin-x86_64.bin

---

> 変更後
http://dl.google.com/android/ndk/android-ndk-r9d-darwin-x86.tar.bz2

(※ bin 形式では落とせないので、リビジョンだけでなく tar.bz2 に変えています。)


##参考
http://stackoverflow.com/questions/6849981/where-do-i-find-old-versions-of-android-ndk
Unity 4.6リリース

いままで2DのUIを作るにはNGUIなどを購入して作ったほうが効率的でしたが、Unity製の新しいUIシステムが搭載されたUnity4.6が2014年11月26日にリリースされました。

[Unity4.6 release notes](http://unity3d.com/unity/whats-new/unity-4.6)にあるリストを見ながら気になるところをリストアップしたいと思います。

**新しいUIシステム**
* アンカーを使用してオブジェクトを配置
* Built-inで、ボタン、スライダー、スクロールビュー、入力フィールド、その他のコントロールをクロスプラットフォームで使える
* UIとUnityのアニメーションの統合。ステートマシンやその他のアニメーションの機能が使える
* 新しいpersisitent delegate systemとともにコールバックが使用可能。多くの機能がプログラミング無しで使用可能

**新しいAndroidのビルドターゲット**
* x86のサポート

**改善**
* StopCoroutine関数の追加
* OnTransformParentChanged関数の追加
* Transform.SetParent関数の追加

なお、Unityの新しいUIはソースコードが公開されておりカスタマイズ出来るようです。
https://bitbucket.org/Unity-Technologies/ui

ひとまず4.6に慣れたいと思います。
[Objective-C] メッセージの転送


Objective-Cは非常に動的な言語です。
ランタイムを使って動的にメソッドを追加したり、といったこともできます。
そのために、コンパイル時に存在しないメソッドに対してもメッセージを送る方法が存在します。
（ただし、しっかり対処しないとエラーで落ちます）

これらの機能を実現しているのが転送のメカニズムです。
どういう手順で行われるか、後々役に立ちそうなのでメモとして残しておきます。

まず、大雑把に書くと以下の順にメソッドが呼び出されます。

1. `+ (BOOL)resolveInstanceMethod:(SEL)sel`
2. `- (id)forwardingTargetForSelector:(SEL)aSelector`
3. `- (void)forwardInvocation:(NSInvocation *)invocation`

上から順に書いていきます。

##resolveInstanceMethod: (resolveClassMethod:)

これはクラスメソッドになっていて、オブジェクトが理解できないメッセージがオブジェクトに対して渡されたときに呼び出されます。
（これはインスタンスメソッドの場合。名前から自明ですね。クラスメソッドの場合は類似の`resolveClassMethod:`が呼ばれます）

返り値の型を見ると分かる通り、これは対応可能かどうかを`BOOL`で返します。
そのため、このメソッド内で動的にメソッドを実装するなどする場合に使います。
（動的に追加したあとに、応答可能なことを示すために`YES`を返す、というわけです）

###実際の例

```objc
// setter
void setter(id self, SEL _cmd, id value) {
	//
}
```

```objc
// getter
NSString * getter(id self, SEL _cmd) {
	return @"hoge";
}
```

```objc
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
	NSString *selectorString = NSStringFromSelector(sel);

	if ([selectorString hasPrefix:@"set"]) {
		class_addMethod(self, sel, (IMP)setter, "v@:@");
	}
	else {
		class_addMethod(self, sel, (IMP)getter, "@@:");
	}
}
```

ちなみに`class_addMethod`の最後の引数に変な文字列が渡されていますが、これは返り値と引数の状態を表した文字列です。意味は以下の通りです。


| Type | 意味 |
|------|-----|
| c | char |
| i | int |
| s | short |
| l | long |
| q | long long |
| C | unsigned char |
| I | unsinged int |
| S | unsigned short |
| L | unsigned lpng |
| Q | unsigned long long |
| f | float |
| d | double |
| B | C++のbool、またはC99の_Bool |
| v | void |
| * | 文字列 (char *) |
| @ | オブジェクト（idとして定義されているもの） |
| # | クラスオブジェクト（Class） |
| : | メソッドセレクタ（SEL） |
| [配列型] | 配列 |
| {名前=型} | 構造体 |
| (型...) | 共用体 |
| bnum | numビットのフィールド |
| ^型 | 型へのポインタ |
| ? | 不明な型 |
| r | const |
| n | in |
| N | inout |
| o | out |
| O | bycopy |
| R | byref |
| V | oneway |
Sailsでページ毎にJSやCSSを読み込む

詰まったのでメモ

## 結論

sailsは`ejs-locals`を使用しているので、これに沿って書けばOK

[ejs-locals](https://github.com/RandomEtc/ejs-locals)


layout.ejs

```erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <!--STYLES-->
    <!--STYLES END-->
    <!--SCRIPTS-->
    <!--SCRIPTS END-->
    <%-scripts%>
    <%-stylesheets%>
  </head>
  <body>
    <%-body -%>
  </body>
</html>
```
index.ejs

```erb
<% script('foo.js') -%>
<% stylesheet('foo.css') -%>

<div class="wraper">
  ほげほげ
</div>
```


## 注意点
```
<!--STYLES-->
<!--STYLES END-->
```

や

```
<!--SCRIPTS-->
<!--SCRIPTS END-->
```

の間に

```
<%-scripts%>
<%-stylesheets%>
```

などを書くと、実行時に書き消されてしまうため注意です。
LambdaからChatworkにメッセージを投稿


SNS経由でChatworkにメッセージ投げれないかと考えてましたが、これLambdaでいいんじゃないの？と思ってやってみました。せっかくPreviewも通ったし。

Lambda functionは以下のような感じです。

```javascript:lambda-chatwork.js
var request = require('request');

exports.handler = function(event, context) {
  var msg = event.msg;

  var room_id = 'ルームID';
  var options = {
    url: 'https://api.chatwork.com/v2/rooms/' + room_id +'/messages',
    headers: {
      'X-ChatWorkToken': '自身のAPIトークン'
    },
    form : {body : msg},
    useQuerystring: true
  };

  request.post(options, function (err, res, body) {
    if (!err && res.statusCode == 200) {
      context.done(null, body);
    }else{
      context.done('error', err);
    }
  });
};

```

httpsモジュールではうまくいかなかったので、request使ってます。requestのモジュールも含めてzipで上げる必要があります。

invoke-asyncコマンドで呼び出します。

```
aws lambda  invoke-async \
--function-name lambda-chatwork \
--region us-east-1 \
--invoke-args input.txt
```

```input.txt
{
  "msg": "Hello Chatwork API & Lambda!!!"
}
```


で、いけました。（諸事情により名前部分消してます。。。）

![chatwork.png](https://qiita-image-store.s3.amazonaws.com/0/21064/def383c9-884d-49dd-653e-83f5cf2f2b3a.png "chatwork.png")


使う場面としては、サーバでエラー検知したときに、エラーログをChatworkに投げようと思ってます。とりあえず、出来ただけで正しい？使い方なのかはよくわかりませんｗ
ただ、SNSのHTTP通知はリクエストヘッダを変更できないので、Chatwork APIのようにリクエストヘッダにトークンを含める必要がある場合に使うのは厳しいです。
なので、そういった場合に通知部分をLambdaに外出しして実行するのは有りかなと思いました。
iOS OpenCV.frameworkは64bitビルドに対応していました

どうも。マキシの人です。

タイトルのそのまんまで本当に備忘録で申し訳ないです。

OpenCV 2.4.9 のiOS用frameworkを使って、
armv7, armv7s arm64, i386, x86_64
Xcode6.1にて各アーキテクチャでのビルド、
imgproc,highguiあたりシミュレータおよび64bit実機iOS8で軽く動作確認しています。


OpenCVライブラリを含めたアプリに関して、
2015年2月以降の、新規アプリ申請に64bit対応必須の件は、
最新版で既に対処できていそうです。

ではでは。
Xcode5で実機ビルドがリンクエラー ld: framework not found Metal 出た時

こんにちは。マキシの人です。Qiitaデビューしました。

取り急ぎ、Webに情報がほとんど転がってなかったのと、
自分がちょっと勘違いしてたので情報共有をば。。。
2014年秋にこんな事あったという備忘録も兼ねまして。

**とあるiOS用広告SDKをアプリに組み込んでXcode5で実機ビルド**した時に発生した現象がどうしても解消せず。
ほとんどの方がXcode6に移行していたのですが、
個人的にiOS6までサポートを検討しており、Xcode5でビルドしていました。

リンクエラー内容
*ld: framework not found Metal for architecture armv7*
iOS8から含まれるはずのMetal周りがなぜエラーを吐くかはごめんなさい、わかりません。

が、**Xcode6でもiOS6以前のシミュレータが無いだけで、
iOS6実機のビルド/デバッグは普通にできるんですね。**
完全に勘違いしていました。

元々の根本原因を直すなら、
以下の記事を参考に対応すれば大丈夫だそうです。
[「ld: framework not found Metal for architecture」 の対処方法 - Pebble Coding](http://pebble8888.hatenablog.com/entry/2014/09/22/113518)

しかし、今回のように、広告SDKとして提供されたライブラリをリンクする場合は、
担当の方にかけあって、再ビルド、再リリースしてもらうしかないわけで、
対応してもらえる保証も無くリリースまで時間かかったりとか。

今回は、
・iOS6シミュレータはXcode5で確認
・iOS6実機はXcode6で確認
という方法で対処できました。

参考になれば幸いです。
ではでは。
Githubでプライバシーエラーが起きたときの対処

#Githubでこんな画面が出たときの対処法メモ

![GithubError](http://cl.ly/image/0U0J34312w2r/Image%202014-11-27%20at%2012.56.39%20%E5%8D%88%E5%89%8D.png)
何番煎じかわからないけど、微妙にエラーメッセージと対処法が違った

キーチェーンアクセスを見ても期限切れの証明書は無かった。
証明書そのものが無いという事だった。

証明書はここからダウンロード
http://www.digicert.ne.jp/howto/basis/digicert-root-certificates.html

私の場合は
　DigiCert Federated ID Root CA
をダウンロードすると入れるように。
ログイン関係の証明書っぽい。

Macの場合ダウンロードしてダブルクリックするとキーチェーンアクセスに追加されるが、信頼されていないと出る.
DigiCertの証明書なので信頼に値すると判断。

なのでそのまま信頼する。

するとGithubにアクセスできるようになった。
[翻訳] Spring Boot 1.2における"Bootiful" なJava EEサポート

[http://blog.ik.am/#/entries/296](http://blog.ik.am/#/entries/296)から転記

PivotalのDeveloper AdvocateのJosh Long([@starbuxman](https://twitter.com/starbuxman))がSpring Boot 1.2とJava EEに関する面白い記事を書いていたので、[本人の許可をとって](https://twitter.com/starbuxman/status/537461010609606656)翻訳してみました。わりとナチュラルに訳したつもりです。

元記事: ["Bootiful" Java EE Support in Spring Boot 1.2](http://spring.io/blog/2014/11/23/bootiful-java-ee-support-in-spring-boot-1-2)

---

Qiitaに書くのやめました
Atomで選択したファイルをすべて開くプラグインを作った

今更ですが[Atom](https://atom.io)が便利です。

ただ、ちょこちょこ気になる部分があります。
例えば複数のファイルを一括で開こうと思うと思ったりした場合に簡単に開けません。

*(少なくとも私はその方法を知らない)*

今後も快適にAtomを使っていくために、
TreeView上で選択したファイルを一括で開くプラグインを練習がてら作ってみました。

こんな感じで動きます。
![Example](https://raw.githubusercontent.com/hikaruworld/atom-multi-file-open/master/readme.gif)

右クリック以外にも`Ctrl+Enter`で選択したファイル一式を開く事が可能です。

これでちょっと幸せになれそうです。
Ubuntuで固定IPに設定したのにIPアドレスが変わる

表題の事象が起こることがあった。固定IPに設定して数十分すると、IPアドレスが変わってしまう。

DHCPを有効でOSをインストールした場合、後から固定IPに設定してもDHCP-Clientが残ったままになることがあるらしい。下記の通り、確認して、プロセスを殺せばよろしいはず。

```
@ubuntu:~$ ps aux | grep dhcp
root       938  0.0  0.0  10232  2964 ?        Ss   13:53   0:00 dhclient -1 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0　★DHCP-Cientが残っている★
@ubuntu:~$ sudo kill 938
[sudo] password for :
@ubuntu:~$ ps aux | grep dhcp
```
slack経由でhubotからAWS SQSにキューを入れる

例えばカスタマーサポートからメール配信停止を依頼されたとき、WEB UIとして準備してないと手作業でフラグを立てたりと何かと日々の運用で面倒なことがある。
slackに「このアドレスですがメール配信停止処理お願いしますー」なんて言う言葉を拾ってメール配信停止できたら素敵かもと思いhubotに頑張ってもらうことにした。
AWSのSQSにキューをぶち込んで後はバッチスクリプトがフラグを立ててくれるようにした。

### 先ずはaws-sdkをインストールしてから

```bash
npm install aws-sdk --save
```

### scripts/unsubscriber.coffee
* coffeescriptは素人なので汚いです
* AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY は環境変数で設定する
* slack上でメールアドレスを打つと「mailto:xxx@xxx.jp|xxx@xxx.jp」という形式で渡ってくるのでそこはよしなにする

```js
AWS = require('aws-sdk');
AWS.config.region = 'ap-northeast-1'
sqs = new AWS.SQS();
queue_name = 'queue-xxx'

module.exports = (robot) ->
  enqueue = (queue_url, email, code, room) ->
    params = {MessageBody: "{\"email\":\"#{email}\",\"code\":\"#{code}\"}", QueueUrl: queue_url, DelaySeconds: 30}
    sqs.sendMessage(params, (err, data) ->
      if err
        robot.send {room: room}, "error!"
      else
        robot.send {room: room}, "#{email} のメール配信停止します"
    )

  robot.respond /停止よろしく (.+)/i, (msg) ->
    email = msg.match[1]
    if not /([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+/.test(email)
      msg.send("[syntax error] #{msg.message}")
      return
    sqs.listQueues({QueueNamePrefix: queue_name}, (err, data) ->
      if err
        msg.send("error!")
        return
      if data.QueueUrls
        enqueue(data.QueueUrls[0], email, 9, msg.message.user.room)
      else
        sqs.createQueue({QueueName: queue_name}, (err, data) ->
          if err or not data.QueueUrl
            msg.send("error!")
            return
          else
            enqueue(data.QueueUrl, email, 9, msg.message.user.room)
        )
    )
```

### slack
以下を打てばSQSにメールアドレスが溜まる

```
ボット名 停止よろしく xxx@xxx.jp
```
OpenStackCinderのボリューム作成時にエラー

### 前提条件
・Ubuntu14.04、OpenStackJuno
・cinder-apiとcinder-volumeを別ノードで構築
　→コントローラノード、ストレージノード

### 事象

コントローラーノードから`cinder create`を実行すると、statusが`creating`のまま、ボリュームの作成が完了しない。ストレージノード側でログを確認すると、以下のようなエラー出力になっている。

```
root@block1:/var/log/cinder# tail cinder-volume.log
ERROR oslo.messaging.rpc.dispatcher [req-94e30a0b-9339-4b48-b666-f5b423050ab7 532afede07ae47a5a7355185b7d24e36 28e17084ec69419ba5e3f80b8fb38a26 - - -] Exception during message handling: create_volume() got an unexpected keyword argument 'source_replicaid'
```

### 原因

↓のサイトのコメントの通り、コントローラー側とストレージ側でCinderのバージョンが異なっていたのが原因

>this is because of a version difference between what's on the controller and what's on the storage nodes.
Bug #1389687 “unable to create volume in cinder” : Bugs : Cinder https://bugs.launchpad.net/cinder/+bug/1389687

### 対処

ストレージ側のバージョンが古かったので、upgradeしたら正常に動作した。

```
root@block1:~# add-apt-repository cloud-archive:juno
root@block1:~# apt-cache policy cinder-volume
cinder-volume:
  Installed: 1:2014.1.3-0ubuntu1.1
  Candidate: 1:2014.2-0ubuntu1~cloud0
  Version table:
     1:2014.2-0ubuntu1~cloud0 0
        500 http://ubuntu-cloud.archive.canonical.com/ubuntu/ trusty-updates/juno/main amd64 Packages
 *** 1:2014.1.3-0ubuntu1.1 0　★古い★
        500 http://archive.ubuntu.com/ubuntu/ trusty-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu/ trusty-security/main amd64 Packages
        100 /var/lib/dpkg/status
     1:2014.1-0ubuntu1 0
        500 http://archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
root@block1:~# apt-get upgrade
```

### 参考
TypeError: create_volume() got an unexpected keyword argument 'source_replicaid' - Ask OpenStack: Q&A Site for OpenStack Users and Developers https://ask.openstack.org/en/question/52753/typeerror-create_volume-got-an-unexpected-keyword-argument-source_replicaid/

Bug #1389687 “unable to create volume in cinder” : Bugs : Cinder https://bugs.launchpad.net/cinder/+bug/1389687
スクロールについてくる、フローティングメニューの作り方

長文注意。

【レスポンシブ対応の要望】
最近のWebサイトは、PC、スマホなどの異なる環境に対応するために
レスポンシブ対応をしているケースが多いですね。

現在作成中のサイトも、画面をスクロールしても、
メニュー部分がスクロールするようにフローティングメニューを実装したいという
要望がありました。

この記事では、
常に画面の最上部に、各種メニューを表示し、かつ
下記の条件を満たす場合どうすれば良いかを考えます。

条件１：スクロールしてもついてきて、いつも画面最上部に表示される。
条件２：他の表示パーツ（本文やフッター、ウィジェットなど）の閲覧に
　　　　支障をきたさない。（重ならない）
条件３：レスポンシブ対応のため、ブラウザのサイズに応じて
　　　　メニューも含めた表示パーツの幅、高さが変化する。



【トップに配置するパーツを固定すると考える】
・今回の場合、「常にブラウザ上の表示領域のトップに、メニューバーが表示される」
　状態を再現したい。この場合、メニューとして表示したいモノを
　画面のトップ位置に固定する。といった所に落ち着きます。

　つまり、CSSで幅や高さなどを指定しているところに

  position : fixed;
　などと記述し、絶対的な位置を場所に指定します。
　加えて、他のパーツと重なった時に上側に表示されるように

　メニュー　z-index : 100;　
　本文 z-index : 1;
　などのように、指定します。

　<h1>これだけならば単純なのですが・・・</h1>
  
　<h1>珍事発生</h1>
【メニューだけ固定したら本文が上のめりになった？！】
　これでいつでも表示領域のトップ部分にメニューが表示される…のですが、
　メニューの下の位置に表示していた、本文の部分がメニュー領域に食い込んで
　しまいました（汗
　
　これでは、どんなにがんばっても本文の上のほうが、
　メニューに隠れてしまい表示されません。
　
　これでもよいケースもあるかもしれませんが、本文に相当する箇所に
　入力フォームなどの、隠れたら困るものがあると大問題です。

　ならば…
　
【メニューの高さだけ、本文の表示位置を下にずらせばよい】
　こういう考えに至りました。
　仮に、メニュー部分の高さをX（px）とした場合本文部分のCSSを

　margin-top : Xpx;

 などと書いてあげれば、うまくいくはず。
　ここでまた問題が。

<h3>メニューのサイズは可変です。高さ変わります</h3>

　ドラえもーん　どうしよう！！！

　はい jQuery !
　メニュー部分のサイズが変わる可能性があるアクション
　（読み込み時、ブラウザ操作時など）発生時に、
　高さを変える処理を行えばよいわけです。
 

ブラッシュアップ予定。
インターンの心得

# メモを取りまくること
メモをたくさんとればとるだけ成長します。
人間、一度、見たり聞いたりして記憶に残り続けるのは稀です。
アウトプットと復習が重要です。
特に新人の頃は分からないだらけですし、ITの世界は環境変化が激しいです。
分からない語句、Tips、ちょっとした知識、作業の仕方などがあれば、全て書き出しておきましょう。
メモの量がその人の成長率、能力の多寡を左右します。

# 真似ること
効率さ、正確さでいうと限りなく先人の方が長けています。
先人は既に同じような経験を踏んでおり良い方法論を身に付けています。
なので真似ることは非常に重要です。
「愚人は経験に学び、賢者は歴史に学ぶ」
とにかく真似てください。
※できない人間を真似ないほうがよいのは歴史的なことです。

# 論理構造を意識すること
基本的に下記の論理構造で物事を捉えるとうまくいきます。
【結論】→【根拠】→【文脈（補足説明など）】

例えば、質問されたときは、
【相手が聞きたがっていること】→【相手が何故それを聞きたがっているのか】→【相手がそれを聞くに至った背景など】

例えば、タスクが与えられた時は、
【やらないといけないこと】→【なぜ、それをやらないといけないのか】→【それを実現するにはどうすればよいのか】

こうすることで、相手の求めていることへの的確な対応や自分の行うことへの妥当性をもつことが出来ます。
そして、それらは仕事やコミュニケーションの効率性や正確性をアップさせることに繋がります。

# 5分考えて分からなければ周りに聞くこと
分からないことがあれば積極的に聞くようにすること。
最後まで自分で考え抜くことも大切ですが、5分考えてアイディアが浮かばなければ、その後の時間を失うコストの方が高いと考えます。
特にインターン中は、考えることより、それを行うにあたって必要な知識や経験が不足しています。
積極的に聞くようにしてください。

# ドッグワードに気を付けること
「あ～」や「う～」などのワードを会話中に挟むことを排すように意識すること。
そういった言葉は、相手に不信感を与えたり話のテンポが悪くさせたりして好印象のコミュニケーションを阻害します。
単純に話すスピードを下げて話すようにしたり、少し話をまとめてから話すようにするとだいぶ改善します。
緊急にlogrotateしたい

何か緊急に logrotate をしたくなることがあります．ないかもしれませんがあります．

logrotate したい設定ファイル名を以下のように指定します．

    sudo logrotate -f /etc/logrotate.d/ファイル名

そうすると指定したものだけ logrotate が走るので容量が大きかったりすると圧縮されます．
ちょっとプログラム載せてみる。

とりあえずJavaでいいかな。

この前、JDK8から導入されたラムダ式の勉強するのに書いたプログラム載っけます。

```java
import java.util.List;
import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        final List<PriceListElement> priceList = new ArrayList<PriceListElement>();
        priceList.add(new PriceListElement(1, "apple", 120));
        priceList.add(new PriceListElement(2, "orage", 88));
        priceList.add(new PriceListElement(3, "water melon", 250));
        priceList.add(new PriceListElement(4, "melon", 500));

        Stream<PriceListElement> result = priceList.stream().filter(e -> e.getPrice() >= 100);
        print(result);
        result = priceList.stream().filter(e -> e.getName().contains("melon"));
        print(result);
    }

    public static void print(Stream<PriceListElement> list) {
        System.out.println("-----");

        for(Object e : list.toArray()) {
            System.out.println(e);
        }
    }
}

/*
参考
■Java 8はラムダ式でここまで変わる（1）：初心者のためのJavaラムダ式入門とJDKのインストール、IDEの環境構築 (1/4) - ＠IT
<http://www.atmarkit.co.jp/ait/articles/1402/18/news010.html>
*/
```

```java
public class PriceListElement {
    private int id;
    private String name;
    private int price;

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setPrice() {
        this.price = price;
    }

    public int getPrice() {
        return this.price;
    }

    public PriceListElement(int id, String name, int price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public String toString() {
        return id + ", " + name + ", " + price;
    }
}
```

もうちょっとEclipseっぽい色合いになってくれるとすごくうれしいんだけど、まあ、これで十分かな。
Jenkinsの自動アップデートができないなら、書き込み権限を見なおそう

Jenkinsには自動アップデート機能があります。
Jenkinsの管理画面から機能をONにできますが、
以下の様な自動更新ボタンが表示されず諦めた人もいるかもしれません。

![ボタンが表示された画面](https://qiita-image-store.s3.amazonaws.com/0/37384/9145c472-9731-0349-7cb0-18e9201e3abc.png)

これはJenkinsを自動更新するための権限が不足しているだけです。
`jenkins.war`がJenkinsの本体なので、
Jenkinsを実行するユーザーが`jenkins.war`を更新できるように設定しましょう。
特にパッケージ管理システム経由だと大抵`root`でファイルを作成するため、
Jenkinsが自分自身のwarを書き込めないことが原因です。

例えばyumでインストールしたJenkinsなら以下のコマンドが使えます。

```bash
chown -R jenkins:jenkins /usr/lib/jenkins

```
`yum`経由でデフォルトのままならユーザーは`jenkins`で, 
`jenkins.war`の場所が`/usr/lib/jenkins.war`です。
`apt-get`なら`/usr/share/jenkins`のようです。

書き込めるようになると管理画面に自動更新ボタンが表示されます。

なお自動アップデートだと1世代まで戻す機能があります。
更新頻度は高いので、1世代では不安な場合は自動アップデートを使わなくても良いと思います。
FlaskがCurlからPOSTされたJSONデータを読んでくれない時

ダメな例

```
$ curl -X POST -d '{"name": "fuga"}' localhost:8080/v1/target
```

これだと

```py

@app.route('/v1/target', methods=['POST'])
def new_machine():
    print(request.data)  # => ''
```

何も出力してくれなくて延々と頭を悩ますことになります。（なりました

正しくはこう

```
$ curl -H "Content-type: application/json" -X POST -d '{"name": "fuga"}' localhost:8080/v1/target
```

これが付いてないと文字列としてすらデータを受け取らないようです。

あとあんまり居ないと思うけどWindowsから使ってる人は{}をちゃんとエスケープしないと辛いらしいですよ。


```
$ curl -H "Content-type: application/json" -X POST -d '\{"name": "fuga"\}' localhost:8080/v1/target
```
[typescript] convert string to enum


anyにキャストしてから[]でキー指定すればよい。

```ts
enum EnumType{
 ONE
}
var one: EnumType = (<any>EnumType)['ONE'];
```

### おまけ

汎用的に使えるヘルパーっぽいの作ったけど記述量は減ってないのでいまいちかも。

[playground](http://www.typescriptlang.org/Playground#src=enum%20Beatles%7B%0D%0A%09JOHN%2C%0D%0A%09PAUL%2C%0D%0A%09GEORGE%2C%0D%0A%09RINGO%0D%0A%7D%0D%0A%0D%0Aclass%20Enum%7B%0D%0A%09static%20valueOf%3CE%3E(value%3A%20string%2C%20klass%3A%20any)%3A%20E%20%7B%0D%0A%09%09return%20(%3Cany%3Eklass)%5Bvalue%5D%3B%0D%0A%09%7D%0D%0A%7D%0D%0A%0D%0A%0D%0Avar%20john%3A%20Beatles%20%3D%20Enum.valueOf%3CBeatles%3E(%22JOHN%22%2C%20Beatles)%3B%0D%0A%0D%0Aconsole.log(john%20%3D%3D%20Beatles.JOHN)%3B%20%2F%2F%20true)



```ts
enum Beatles{
	JOHN,
	PAUL,
	GEORGE,
	RINGO
}

class Enum{
	static valueOf<E>(value: string, klass: any): E {
		return (<any>klass)[value];
	}
}


var john: Beatles = Enum.valueOf<Beatles>("JOHN", Beatles);

console.log(john == Beatles.JOHN); // true
```
[Unity] 複数の端末の解像度に対応させる1 - Sceneに表示される解像度を固定化する

Unityの「Scene」（実際のゲーム画面が表示される部分）には、画面いっぱいに表示されてしまうので、デバイスごとに正確な解像度の確認ができません。
できることなら「Scene」の解像度を開発ターゲットのデバイスに合わせることで、Unity内で解像度の問題は完結させたいですね。
そこで、指定された解像度に対して「Scene」に表示されるアスペクト比を固定化する方法を紹介します。
（ 元記事：http://d.hatena.ne.jp/nuttinutti/20141126 ）

# サンプルスクリプト

指定された解像度をもとに、「Scene」に表示するアスペクト比を固定化させるためのスクリプトを示します。

```js:Fixed_Aspect_Ratio.js
#pragma strict

var cam : Camera = null;       // アスペクト比を固定化するカメラ
var width : float = 640.0f;    // 横幅 (目標解像度)
var height : float = 960.0f;   // 高さ (目標解像度)
var camRect : Rect;

function Update()
{
    var targetAspect : float;  // 目標のアスペクト比
    var curAspect : float;     // 補正前の「Scene」のアスペクト比
    var ratio : float;         // 補正前の「Scene」のアスペクト比 ÷ 目標のアスペクト比

    targetAspect = width / height;
    // 補正前の「Scene」の横幅・縦幅はSceneのメンバ変数から取得可能
    curAspect = Screen.width * 1.0f / Screen.height;  
    ratio = curAspect / targetAspect;

    // 表示領域の横幅・高さ・左上のXY座標をセット
    // 横長の場合
    if (1.0f > ratio) {
        cam.rect.x = 0.0f;
        cam.rect.width = 1.0f;
        cam.rect.y = (1.0f - ratio) / 2.0f;
        cam.rect.height = ratio;
        cam.orthographicSize = Screen.width / 2.0f;
    }
    // 縦長の場合
    else {
        ratio = 1.0f / ratio;
        cam.rect.x = (1.0f - ratio) / 2.0f;
        cam.rect.width = ratio;
        cam.rect.y = 0.0f;
        cam.rect.height = 1.0f;
        cam.orthographicSize = Screen.height / 2.0f;
    }
    camRect = cam.rect;
}
```

# パラメータ

サンプルスクリプトでは、以下のパラメータを指定することが出来ます。


|項目名|説明|
|---------------|-----------------------------------------------------------------------------|
|Cam| アスペクト比を固定化させるカメラを指定|
|Width| 目標解像度（横幅）|
|Height| 目標解像度（縦幅幅）|

# 使用例

上記のサンプルスクリプトを実際にUnityに導入してみます。
ここではiPhone5Sを想定し、iPhone5Sの解像度であるwidth=640.0f,height=1136.0fを指定しています。
![20141127.jpg](https://qiita-image-store.s3.amazonaws.com/0/38888/ff90cc67-6d44-90f4-84ac-5f97b8c7bfaf.jpeg)

# 機能を追加したスクリプトの紹介

サンプルスクリプトをもとに端末に応じて「Scene」に表示される解像度（アスペクト比）を合わせるスクリプトを作成してみました。
最新版は[ここ](https://github.com/nutti/Unity-Utility-Library/blob/master/Cross%20Platform/Aspect_Ratio_Controller.js)からダウンロードすることが出来ます。
まだ改良の余地はありますが、良かったら使ってみてください。

なお、このスクリプトは以下のようなパラメータを持ちます。
Target Deviceにて対応していないデバイスのアスペクト比を扱いたい場合のために、Resolutionを用意しています。
Offsetは画面を揺らすエフェクトのために用意しました。
今後必要に応じてパラメータを追加していきたいと考えています。

|項目名|説明|
|---------------|-----------------------------------------------------------------------------|
| Resolution| アスペクト比に利用する解像度を指定（※Target DeviceがUnknownの場合のみ有効）|
|Target Device| 指定されたデバイスのアスペクト比に固定化される（※iPhoneとiPadのみ対応）|
|Enable|有効/無効を選択|
|Offset|中心座標からのずれを指定|
|Scale| カメラの拡大率（ズーム）を指定|
|Cam| アスペクト比を固定化させるカメラを指定|

# 関連記事

* [\[Unity\] 複数の端末の解像度に対応させる2 - GUITexutreの表示を解像度と非依存にする](http://qiita.com/nutti/items/f4e0d4241480345a2b10)

# 参考情報

* http://pukapuka-ahirusan.blogspot.jp/2012/09/unity_25.html
* http://icoc-dev.hatenablog.com/entry/2013/11/19/205108
* http://hideapp.cocolog-nifty.com/blog/2012/06/unity-1a83.html
permutation 

n の置換で n! 個の並べ替えを出力します。再帰を用いて実現します。

Fortran2003 の機能をいくつか使っています。
[integer::] は integer 型の０サイズ割り付けの配列を意味します。サイズがゼロの配列は [] でよい気がしますが、型を指定しないといけないので型を記述します。

[1:4] は、非標準の記法で１～４までの要素の配列を生成します。Intel Fortran, DEC Fortran 等で使える記法です。

Pack は filter 関数で、第二引数で .true. になっている位置の第一引数の要素が抽出されます。

```fortran
    program permutation
      implicit none
      call perm([1:4], [integer::])
      stop      
    contains  
      recursive subroutine perm(lin, lout)
        integer, intent(in) :: lin(:), lout(:)
        integer :: i
        if (size(lin) == 0) then 
          print *, lout  
        else
          do i = 1, size(lin)
            call perm(pack(lin, lin /= lin(i)), [lout, lin(i)])   
          end do
        end if  
      end subroutine perm
    end program permutation
```


出力結果
```
 1 2 3 4
 1 2 4 3
 1 3 2 4
 1 3 4 2
 1 4 2 3
 1 4 3 2
 2 1 3 4
 2 1 4 3
 2 3 1 4
 2 3 4 1
 2 4 1 3
 2 4 3 1
 3 1 2 4
 3 1 4 2
 3 2 1 4
 3 2 4 1
 3 4 1 2
 3 4 2 1
 4 1 2 3
 4 1 3 2
 4 2 1 3
 4 2 3 1
 4 3 1 2
 4 3 2 1
続行するには何かキーを押してください . . .
```
Dropbox CLIでLAN syncをするポート


DropboxのCLI版を使っていてufwによりポートが塞がっていてLAN syncができなかったのでできるようにしたメモ

[LAN 同期について - Dropbox](https://www.dropbox.com/help/137)

> LAN 同期には TCP ポート 17500 へのアクセスが必要です。

と書いてあったのでとりあえずTCPだけ有効にしてしばらく待ってから ``dropbox.py status`` を叩いてもLAN syncされません…

```shell-session
% sudo ufw allow 17500/tcp
Rule added
Rule added (v6)

% dropbox.py status
Syncing (15,012 files remaining, 6 mins left)
Downloading 15,012 files (1,590 KB/sec, 6 mins left)
```

ちなみに上記の ``ufw`` コマンドは ``sudo ufw allow db-lsp`` でもできます（Ubuntu 14.04 LTSのufwで確認）。TCP17500番ポートはDB-LSPと呼ばれているようです。

[What Port Is 17500 Dropbox LanSync Protocol (db-lsp); used to synchronize file catalogs between Dropbox clients on your local network. Dropbox LanSync Discovery (db-lsp-disc); used to synchronize file catalogs between Dropbox clients on your local network; is transmitted to broadcast addresses.](http://whatportis.com/17500)

このDB-LSPのみではノードを見つけられないためDB-LSP-DISCも通す必要があります。
DB-LSP-DISCはUDP17500番のため、17500/udp を通すとLAN syncしていることが確認できました。ufw には db-lsp プロファイルは用意されているのに db-lsp-disc はありません。社会は厳しい。

```shell-session
% sudo ufw allow 17500/udp
Rule added
Rule added (v6)

% dropbox.py status
Syncing (15,193 files remaining, 5 mins left)
Downloading 15,193 files (LAN) (28,017 KB/sec, 5 mins left)
```
Internet Exploreにコンテキストメニューに独自機能を追加する

# 1. Internet Exploreのコンテキストメニューにメニューを追加する
Internet Exploreのコンテキストメニューにメニューを追加するには、レジストリを編集し、「HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt」以下にコンテキストメニューとして追加したいものを登録する。

例えば、「sample menu」をコンテキストメニューに追加するには「HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt」にキー「sample menu」を追加する。

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\sample menu」には、下記表の値を設定する。

| 名前       | 種類        | データ        |
|:-----------|:------------|:------------|
| (既定)     | REG_SZ      | <<コンテキストメニューが選択された時に実行したいファイルのパス>> 
| Contexts   | REG_DWORD  | <<コンテキストメニュー表示の設定>> | 

<dl>
  <dt>コンテキストメニューが選択された時に実行したいファイルのパス</dt>
  <dd>例えは、「C:\temp\sample.html」を実行したい場合には、「file://C:\temp\sample.html」のように指定します。</dd>
  <dt>コンテキストメニュー表示の設定</dt>
  <dd>
    画像を右クリックした時にコンテキストメニューに表示させるなどの設定がここでできます。<br>
    詳しくは参考URLを参照して下さい。
  </dd>
</dl>

# 2. メニュー選択時に実行するファイルを用意する
1.で指定した呼び出されるファイルに、処理を記述します。
処理の記述に使用できる言語は、JavaScriptやVisual Basicなどです。

下記の処理を呼び出されるようにしておくと、JavaScriptのアラートで「Hello world」の文字列が画面に表示されます。

```sample.html
<script LANGUAGE="JavaScript" defer>
  alert("Hello world");
</script>
```

[この辺り](http://msdn.microsoft.com/en-us/library/ie/hh801964(v=vs.85).aspx)の情報を見ると、ページ内の情報を解析して処理を行ったりなども出来そう。

JScriptを使用するとクリップボードの操作も出来ます。
表示中のページのURLをクリップボードにセットする例です。

```sample.html
<script LANGUAGE="JScript" defer>
  clipboardData.setData("Text", external.menuArguments.top.document.URL);
</script>
```

# 参考URL
http://msdn.microsoft.com/ja-jp/library/aa753589(v=vs.85).aspx
http://support.microsoft.com/kb/177241/ja
http://garafu.blogspot.jp/2013/05/ie_11.html
Android Studio のインストール後、起動でクラッシュする！（mac）


2014/11 環境は　OS X Yosemite 10.10.1
Android Studioをmacにインストールして起動したところ以下のエラーになり、クラッシュする。


```
Symbol not found: _CGContextSetAllowsAcceleration
```

調べたところappleのサイトに行きついた。
http://support.apple.com/kb/DL1572?viewlocale=ja_JP&locale=en_US

ここからJava for OS X 2014-001 をダウンロードしてインストールすると無事にAndroid Studioを起動することが出来た。
[Emacs] インフラエンジニアへオススメするinit.el(その2) [elisp]

前回「その1」を記述してから半年以上が経過している気がします。

気にしない。

と言うことで、今回は、見た目を気にするインフラエンジニアたちに、都合の良い小手先技をいくつかご紹介します。

# 1. Emacs を起動時に最大化

インフラエンジニアには、黒バックのコンソールだけがあれば良い、それで十分です。
従って、Cocoa Emacs (GUI) を起動するとしても、27" の iMacであろうと、Emacsは Emacsだけで使います。従って、最大化すれば良いのです。
むしろ、最大化しない意味が分かりません。

それは、こう。

```elisp:~/.emacs.d/init.el
;; スクリーンの最大化
(set-frame-parameter nil 'fullscreen 'maximized)
```

なお、ウィンドウサイズを最大化するではなく、そもそもフルスクリーンモードにするには

```elisp:~/.emacs.d/init.el
;; フルスクリーン
(set-frame-parameter nil 'fullscreen 'fullboth)
```

パクリ元
<a href="http://micchan.com/editor/2013/01/20/maximized-at-startup-emacs/" target="_blank">Emacsを起動時に最大化する - みっちゃんラボ</a>

# 2. Emacsを半透明化する

見た目が大事です。
インフラエンジニアは見栄えを気にします。大好きなあの人を壁紙にしている人が、ほとんど全てだと思います。なお、私はご期待通り Perfumeを壁紙にしていますが、Emacsを最大化したからといって彼女たちが見えなくなっては、人生を捨ててしまったようなモノです。

そこで、Emacs自体を半透明化します。さすが。
気分は、PC-98x1や X68kで、ファイラーを使っていた頃に逆戻りです、とても気分が良い。

さて、半透明化するには、こう。

```elisp:~/.emacs.d/init.el
;; for window system
(if window-system 
    (progn
      (set-frame-parameter nil 'alpha 95)))
```

最後の `'alpha` 後の数値が透過度です。100で透けない、0でスケスケです。

パクリ元
<a href="http://blog.sanojimaru.com/post/20144144501/cocoa-emacs" target="_blank">cocoa emacsを半透明にする</a>

# 3. フォントを設定する

見た目と言えばフォントです。萌フォントとか使う愚弄者は素人です。
強者は、安定化したものを選択します。男黙って `Ricty` です。

我が家での Ricty指定は次のようにしています。

```elisp:~/.emacs.d/init.el
;; Ricty フォントの利用
(create-fontset-from-ascii-font "Ricty-14:weight=normal:slant=normal" nil "ricty")
(set-fontset-font "fontset-ricty"
                  'unicode
                  (font-spec :family "Ricty" :size 14)
                  nil
                  'append)
(add-to-list 'default-frame-alist '(font . "fontset-ricty"))
```

# 4. 自動保存する

今日の終わりはオートメーションです。なぜか見栄えとはちがうところを攻めます。
人がセーブしようとしたときにハングアップして、これまで書き上げたドキュメント 2時間分を失うのは世の常です。
Undo がやたらめったら戻れることを考えると、ファイルは自動的に保存されてしまったところでなんの問題もないはずです。むしろ、`^x-s` とかしている時間も勿体ないくらいのエンジニア諸氏には、この設定が不可欠です、今すぐ設定しろ。半年も待たせてゴメンね。

```elisp:~/.emacs.d/init.el
;; バッファの内容を自動保管 (秒)
(require 'auto-save-buffers-enhanced)
(setq auto-save-buffers-enhanced-interval 1) ; 指定のアイドル秒で保存
(auto-save-buffers-enhanced t)
```

ちゃんとご丁寧に注釈がはいっているので、そのとおりにするがいいと思います。
最初は 5秒とかにしてたんだけれども、追い詰められてる感じが全く感じられなかったので 1秒にしました。これだと、打ち出したら、止まるに止まれなくてなんか気持ちいいです。

SSDなのに!! 書き換え回数が決まってるのに!! ここは書けない、書かせてはいけない、保存させてはいけない!! という勢いでコーディングが進みます。

無駄なスペースとBS するの禁止。

お粗末様でした。また次回。そろそろ、機能を追加してみようと思います。magit 必須。
イメージベースの動画認識とエラー（誤認識）のはなしとスパイ映画 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

みなさん、おはこんばんにちはでス。2014年になってから少しずつディープラーニングが盛り上がって :clap: 素敵な日々、ご機嫌いかが？

さてさて、今回のはなしはスパイ :sunglasses: スパイと言えば、秘密のアジトに潜入して秘密 :secret: の情報を盗んだり、何かを仕掛けたり、あるいは暗殺したりとドキドキの緊張感。で、必ず鍵 :lock: があって、目 :eyes: で認証したり指紋 :hand: で認証（古いか）とか。その鍵を破るために、きみたちのようなテックな人たちがハックするのは痛快。

そんな未来な鍵でも、『実はかなりふざけたパターンで突破できちゃう可能性もあるよね』というのが今回のはなし。

> 色白細メガネ :eyeglasses: ：「あのセンサーには実はバグがあって、これで突破できちゃうんだ」（すごい平凡な何かを出す）
>
> マッチョ主人公：「・・・・」（顔がポカーン）

的なシーン。

# モンストガチャと画像認識

えっと、先日こんな動画をつくりました。qiitaにも何回か違うテーマで書いてる、これ。モンストガチャのシンクロ動画。10x10の100個でつくったので、まずはみてみて。変なの混じってます。間違い探し。

https://www.youtube.com/watch?v=NSc7AYfv-g0

わかった？下の方に変なのあったでしょ？

↓こういうのがガチャ動画

https://www.youtube.com/watch?v=bbnObOUGWiM

なんだけど、↓これが出てる

https://www.youtube.com/watch?v=BQAaPUEFsQc

つまり、ffmpeg とか OpenCV とか使って↓この画像

![gacha_100.png](https://qiita-image-store.s3.amazonaws.com/0/56465/a6050337-7603-4f47-b698-221f13bb9916.png)

を認識させて、↓こういうシーンを

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/56465/08536238-574b-194c-1fc7-782c25aad942.png)

を抜き出すはずが、↓こういうのが釣れた

![error.png](https://qiita-image-store.s3.amazonaws.com/0/56465/43c8db60-5505-976f-3107-f3fa9251936c.png)

という話。いやー、実に見事 :+1: コンピュータをバカにするのに最適なパターン :scream: CAPCHAのロボットをはじく仕組はまさにこの仕組を使っているのだけど、モンストガチャで引っかかるとは思って無かった。

 - 黄色背景
 - ランダムな線

これだけで騙されました。

今回実装が単純なテンプレートマッチングなので、こういうのが見事にマッチ！『実は○○で認証突破できちゃうんだよ』的なものも世に出ている製品にも存在するかもしれない。そういう、面白ネタ無いかなぁ。

ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい
Docker setup memo


## Prepara

### 1. Git install

### 2. VirtualBox install

* https://www.virtualbox.org/wiki/Downloads

### 3. Vagrant install

* http://www.vagrantup.com/downloads.html

### 4. ssh client install (Windows only)

* Gitbash or Cmder or or Putty or TeraTerm  ...

## Docker setup

### 1. CoreOS setup (Docker Host)

```
$ git clone https://github.com/coreos/coreos-vagrant/ coreos-vagrant

$ cd coreos-vagrant

$ vagrant up
```

### 2. CoreOS connect

#### Mac

```
$ ssh -i ~/.vagrant.d/insecure_private_key core@127.0.0.1 -p 2222
```

#### Windows

```
$ ssh -i %HOMEPATH%\.vagrant.d\insecure_private_key core@127.0.0.1 -p 2222
```

* [Casy by putty](http://qiita.com/tenten0213/items/52f2706d63defd7b4854)

```
# CoreOSには最初からDockerがインストールされている。
$ docker -v
Docker version 1.3.2, build 50b8feb
```

### 3. Get dockerfile

* [docker hub](https://registry.hub.docker.com/)

```
# centos
$ docker pull centos
# ubuntu
$ docker pull ubuntu

# dockerfileの確認
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              86ce37374f40        10 hours ago        192.7 MB
centos              latest              ae0c2d0bdc10        3 weeks ago         224 MB
```

### 4. Hello world

```
$ docker run centos /bin/echo hello world1
hello world1

$ docker run centos /bin/echo hello world2
hello world2

$ docker run centos /bin/echo hello world3
hello world3
```

### 5. Check container

```
$ docker ps -a

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS
          PORTS               NAMES
7586fb682239        centos:latest       "/bin/echo hello wor   24 seconds ago      Exited (0) 24 seconds ago                       high_mcclintock
f242a610ae65        centos:latest       "/bin/echo hello wor   28 seconds ago      Exited (0) 27 seconds ago                       mad_thompson
7775535004ae        centos:latest       "/bin/echo hello wor   41 seconds ago      Exited (0) 40 seconds ago                       compassionate_turing
```

### 6. Remove container

```
$ docker rm `docker ps -a -q`
```

### 7. Login container

```
$ docker run -i -t centos /bin/bash
```

### 8. Commit container

```
$ docker commit <id>
```
Rspecによるテストの実施


##手順
+ 何はともあれインストール

```
$ gem install rspec
```

+ 何はともあれ初期化する


```
$ rspec --init
```

+ ↓みたいなディレクトリ構成になる。

```
root+テストしたい.rb	
    +.rspec(隠しファイル)
    +spec+spec_helper
```

+ テストのファイルを作る

```
root+テストしたい.rb	
    +.rspec(隠しファイル)
    +spec+spec_helper
         +テストソース_spec.rb	 (<= create)
```

+ テストのファイルを作る

```
# =>　テストしたいファイルの読み込み
require_relative '../テストしたい'

# => 本テストのグループ名称の定義
describe "HateNumber Test" do

  # => テスト名称とそのブロック
  it "initial" do
    # => 初期設定とか
    @obj = HateNumver.new("5")
    result = @obj.getResult

    # => 値のチェック
    expect(result).to eq("none")
  end
end
```

##注意点
+ require_relativeの相対参照でテストしたいファイルを指定する。（インクルードのパスを解析すればもう少しなんかできる。）
+ ネットの情報よりgithubのreadmeを読む
VMwareでの接続方式(NAT/ブリッジ/ホストオンリー)の違い

VMware Player等の仮想化サーバを利用する際、ゲストマシンのネットワーク接続方式の設定で違いの分からない選択肢（NAT、ブリッジ、ホストオンリー）がありました。これらの違いについて調べてみました。

# ネットワーク接続設定の種類と特徴

<dl>
<dt>NAT接続</dt>
<dd>
<ul>
<li>ゲストOSが、ホストOSをNATとしてネットワークにつなぐ接続方式
<li>ゲストOSとホストOS間は繋がらない。
<li>ゲストのIPアドレスは、DHCPによって付与されるためリブートの度に変更される。
<li>そもそもNATとは…Network Address Translation（ネットワークアドレス変換）。例えば、ローカルネットワーク／インターネット間でプライベートIPとグローバルIPを入れ替える働きをするもの。
</ul>
</dd>
<dt>ブリッジネットワーク</dt>
<dd>
<ul>
<li>ゲストOSがホストOSと同じネットワーク上に並列のように繋がる（親となるブリッジが一緒というイメージ？）
<li>ゲストOSとホストOSの間は繋がる。同じネットワーク上の他のPCからも見える。
</ul>
</dd>
<dt>ホストオンリーネットワーク</dt>
<dd>
<ul>
<li>ホスト OS と ゲスト OS 間のネットワーク。
</ul>
</dd>
</dl>

## 参考

* http://d.hatena.ne.jp/replication/20110419/1303222195
* それぞれの設定の場合のサーバ構成図（わかりやすい）
http://kjirou.sakura.ne.jp/wiki_mirror/index.php?a%2FVMWare%A4%C8NAT%C0%DC%C2%B3%A4%C8%A5%D6%A5%EA%A5%C3%A5%B8%C0%DC%C2%B3
* http://blog.kondoyoshiyuki.com/2012/08/18/fix-ip-address-on-vmware-player/
【SNS】対応する IE のバージョンについて

改めて調べたのでまとめ。
 
 
**●Twitter**
IE9 以降対応。
（IE6、IE7 はスマホサイトへ飛ばされます。）
・Twitterヘルプセンター | IE6/IE7をご利用のユーザーには
twitter.comではなく、mobile.twitter.comが表示されます。
https://support.twitter.com/groups/55-troubleshooting/topics/234-mobile-apps/articles/20169383-ie6-ie7twitter-commobile-twitter-com

（IE8 も、2015年1月中（？）に非対応になるようです。）（2015.01.27.追記）
・Update on Twitter for Websites IE7 and IE8 browser support - Announcements - Twitter Developers （Nov 26, '14）
https://twittercommunity.com/t/update-on-twitter-for-websites-ie7-and-ie8-browser-support/28234
 
　
**●Google+**
IE10、11 対応。
 
・Google+ 向けのブラウザと端末 - Google+ ヘルプ
https://support.google.com/plus/answer/1347815?hl=ja
 
 
**●Facebook**
IE11 のみ対応。
（非公式に IE9 も対応）
 
・どのブラウザがFacebookに最も適していますか。 | Facebookヘルプセンター
https://www.facebook.com/help/210310575676558
 
※10月頃からIEで繋がらなくなった件＝「SSL 3.0の脆弱性問題」
・FacebookやTwitterがIE経由で繋がらない原因と対処法 - 道すがら講堂
http://michisugara.jp/archives/2014/hb_tw_noaccess.html
IE11 はデフォルトで対応している。
CakePHPでグローバルIPを取得する


つい最近、CakePHPを使用して、グローバルIPを取得する処理を組みましたが、
ちょっとはまってしまったので書いていきます

##・普通に取得する場合
```php
public function get_global_ip(){
	return $this->request->clientIP();
}
```
普通にCakePHPでIPアドレスを取得する場合はこれで大丈夫です
ただ、LoadBarancerやリバースプロキシを使用している場合はこれでは、
内部での通信に利用されているプライベートIPが取得され、
グローバルIPが取得できませんでした

##・ではどのように？
方法としては、

```php
public function get_global_ip(){
	return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
```
でアクセス元のグローバルIPを取得することが出来ます
※参考はこちら：http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#x-headers

CakePHPでは、上記の```$_SERVER```変数を使用しなくても下記のように取得することが出来ます

```php
public function get_global_ip(){
	return $this->request->clientIp(false);
}
```

そう、falseを引数に渡してあげるだけなんです！！
~~なぜそれをデフォルトでしてくれないのか。。。(´・ω・｀)~~

※追記
ご指摘をいただいたのですが、今回はIPアドレスから地域情報を取得する機能を実装していたため、
IPアドレスの偽装は考慮しておりません。
Org Beamer で Solarized なカラーテーマを使う

1. [beamercolortheme.sty](https://github.com/jrnold/beamercolorthemesolarized/blob/master/beamercolorthemesolarized.sty) をダウンロードして Org ファイルと同じディレクトリに保存
2. Org ファイルに `BEAMER_COLOR_THEME` を追加:

手順はこれだけです．手順 2. は次のような行になります．

    #+BEAMER_COLOR_THEME: solarized

カラーテーマのオプションを設定したいときには，行末に `[...]` で追加します．

    #+BEAMER_COLOR_THEME: solarized [accent=cyan]

以上．
AWS LambdaのfunctionをPythonで書く

AWS LambdaではLambda functionとして使える言語は現時点ではJavaScript/Node.jsしかありません。
でもPythonで書きたい人もいるよねってことでPythonで書いたスクリプトを実行してみました。

といっても難しいことはしていません。
Lambda functionとして実行するスクリプトでは外部コマンドが実行可能なことがわかっています。また、環境内にはpythonのruntimeがあることも前回の調査でわかりました（[AWS Lambdaをいろいろ暴く](http://qiita.com/Keisuke69/items/9951a93fd711360a61c5)のls結果参照）。

というわけでPythonで書いたスクリプトをLambda function内でJavaScriptを使って生成し、child_process()を使って外部コマンドとして呼び出す、というだけです。

では早速やってみましょう。

今回はLambda function内でスクリプト生成するのではなく、事前に用意したスクリプトをS3に保存しそれをLambda functionの環境内でHTTPアクセスして取得し、実行するという方法を取っています。
なお、ファイルをHTTPで取得する際なぜかLambda functionの環境にはwgetがないのでcurlを使っています。

まず、実行したいPythonのスクリプトを適当に用意します。今回はお試しってことでこんな感じにしました。

```py:test.py
#! /usr/bin/python
print "Hello, Wordl!"
```

これをS3にあげてmake publicしてHTTPアクセスできるようにしておきます。

続いて実際に登録するLambda functionのコードです。

```js:index.js
exports.handler = function(event, context) {
    var exec = require('child_process').exec;
    
    var cmd = "curl -s https://s3-ap-northeast-1.amazonaws.com/<bucket名>/test.py > /tmp/test.py;chmod 755 /tmp/test.py;/tmp/test.py"
    var child = exec(cmd, function(error, stdout, stderr) {
        if (!error) {
            console.log('standard out: ' + stdout);
            console.log('standard error: ' + stderr);
            context.done();
        } else {
            console.log("error code: " + error.code + ", err: " + error);
            context.done(error,'lambda');
        }
    });
};
```

はい、勘の良い方は気づいたと思いますが、前回のスクリプトそのままです。
単に実行する外部コマンドを変更しているだけです。
実際に実行しているコマンドは以下を順番に実行しているだけです。

1. curlを使って実行するPythonスクリプトを取得し、/tmpに保存
1. 実行権限を付与
1. 実行

では早速Lambda functionをInvokeしてみます。

```bash
2014-11-26T11:51:47.683Z	a0862c9f-7562-11e4-8f05-ebd8b45899f3	standard out: Hello, Wordl!
```

おお、ちゃんと実行されて「Hello, World!」と出力されました！

というわけで実際に有用かどうかはともかくPythonで書いたスクリプトをLambda functionで実行してみました。

**免責
こちらは個人の意見で、所属する企業や団体は関係ありません。**
【PS】新規ドキュメントの作成と保存


#新規ドキュメントの作成と保存をする

Photoshopで新規のドキュメントを作成します。

##新規ドキュメント作成
###1.メニューバーから新規を選択
メニューバーのファイル => "新規..."を選択から新規ドキュメント設定画面を開きます。
または、⌘ + N（ショートカット）で、新規ドキュメント作成画面を開きます。 
※ショートカットキーを覚えると、作業効率がグンッと上がるので、一緒に覚えるといいですね。

![スクリーンショット 2014-11-26 18.19.29.png](https://qiita-image-store.s3.amazonaws.com/0/37178/4ad046bd-0ee6-0656-2f88-4fd97f81ccbb.png "スクリーンショット 2014-11-26 18.19.29.png")

###2.次に各設定をしていきます。
1.ファイル名：任意のファイル名
2.幅／高さ：作成するデザインによって数値を指定。単位は"pixel"
3.解像度："72pixel/inch"
4.カラーモード："RGBカラー／8bit"
以下は特に触らなくて大丈夫でしょう。
最後に"OK"を押します。

![スクリーンショット 2014-11-26 19.16.26.png](https://qiita-image-store.s3.amazonaws.com/0/37178/375b880a-ad6b-d7df-2377-8c39ac204f27.png "スクリーンショット 2014-11-26 19.16.26.png")



###新規ドキュメント作成完了
![スクリーンショット 2014-11-26 19.24.15.png](https://qiita-image-store.s3.amazonaws.com/0/37178/abc3efce-374f-fc01-4e71-f61370273dcd.png "スクリーンショット 2014-11-26 19.24.15.png")

こんな感じにできたかと思います。
簡単です。
中央にドンとある白い四角いやつがカンバスと呼ばれる部分です。ここにデザインをしていきます。

その他のUIの説明は以下を参考にしてください。
[Phopshop基本編（1章）](http://qiita.com/aalnocomb/items/38a1a0d6165d98dfc6ea)


##ドキュメントを保存
次にドキュメントを保存してみよう。

###1.メニューバーから保存を選択
メニューバーのファイル => "別名で保存..."を選択。
または、"⌘ + shift + S"で、保存します。
※文字やレイヤーを追加している場合は"⌘ + S"で保存できます。

![スクリーンショット 2014-11-26 19.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/37178/b1455031-fe02-d2ef-f0b1-935ef9437600.png "スクリーンショット 2014-11-26 19.39.25.png")

###2.保存先を選択
どこのディレクトリに保存するか選択して、ファーマットが"Photoshop"になっているのを確認したら、"保存"を押して完了です。

![スクリーンショット 2014-11-26 19.44.51.png](https://qiita-image-store.s3.amazonaws.com/0/37178/597aff97-9d95-d3ac-19e5-e6b06dfe1715.png "スクリーンショット 2014-11-26 19.44.51.png")

###3.Finderを確認
ちゃんと保存できました。

![スクリーンショット 2014-11-26 19.49.00.png](https://qiita-image-store.s3.amazonaws.com/0/37178/00c49cc4-741c-5037-06d8-30c276acb076.png "スクリーンショット 2014-11-26 19.49.00.png")

楽勝でしたね。
Scala で Stream を使った日付シーケンスの取得【nscala-time編】



```scala:Scala
import com.github.nscala_time.time.Imports._

def main(args: Array[String]) {
  val yesterday = DateTime.yesterday.toLocalDate
  val aWeekAgo = DateTime.yesterday.minusDays(7).toLocalDate

  def days(begin: LocalDate): Stream[LocalDate] = {
    begin #:: days(begin.plusDays(1))
  }

  val dayList = days(aWeekAgo).takeWhile(_ <= yesterday).toList
  println(dayList)
}
```

```scala:結果
List(2014-11-18, 2014-11-19, 2014-11-20, 2014-11-21, 2014-11-22, 2014-11-23, 2014-11-24, 2014-11-25)
```

### 参考

- [Scala で Stream を使った日付シーケンスの取得](http://qiita.com/torao@github/items/c27e22b425d1a001e85a)
rvest すげえ。#rstatsj

Hadley 神の造りし rvest、ちょっとしたスクレイピングコードが一瞬で書けたので凄いなと思いました。

```r:R
library(rvest)

html <- html("http://tabelog.com/tokyo/A1307/A130701/13094275/")

access <- html %>%
  html_nodes(xpath = '//*[@id="accesslog"]/div/ul/li/em') %>%
  html_text()

print(access)
```

```:結果
[1] "2,326" "2,148"
```

### 参考

- [rvest - github](https://github.com/hadley/rvest)
- [声優のTwitterアカウントをrvestで収集](http://d.hatena.ne.jp/dichika/20141018/p1)
- [緑色の毛玉のサイトをrvestでスクレイピング](http://d.hatena.ne.jp/dichika/20141023/p1)
- [rvestでリアルタイムな為替レートを取得したい](http://d.hatena.ne.jp/teramonagi/20141127/1417082673)

### 関連

- [ggplot2 に依存しているパッケージ一覧を rvest で取得する](http://qiita.com/hoxo_m/items/c53b6cfbd5ada5fe1642)
- [rvest で声優の男女データをスクレイピング](http://qiita.com/hoxo_m/items/b9002b7b05954e882148)
- [rvest でログインしてスクレイピング](http://qiita.com/hoxo_m/items/59bedbf7e4c7c99cbf5a)
- [rvest で OAuth 認証してスクレイピング](http://qiita.com/hoxo_m/items/ea2db3b32621a6260926)
gitBREAK でバージョン管理をしよう

GitHubでプライベートなリポジトリを作成すると、お金がかかってしまう。

無料でプライベートリポジトリを作成できないか探したところ、codebreak;のサービスにgitBREAKというものを見つけた。
（参照：http://www.publickey1.jp/blog/13/gitgitbreak.html）

デフォルトでは英語になっていますが、設定で日本語にできるので変えたい人は日本語設定にしましょう。

今回はEclipseとgitBREAKでバージョン管理する方法をメモしていきます。

##■ gitBREAKにリポジトリを作る
codebreak;にログインすると以下のような画面になります。

![スクリーンショット 2014-11-26 12.35.24.png](https://qiita-image-store.s3.amazonaws.com/0/43666/73b40f6f-3776-b6a8-7535-edbcbf09d1a4.png)

左側にCreate Repository(新規リポジトリの作成)があるので、クリック。
クリックすると以下の様な登録画面に遷移します。

![スクリーンショット 2014-11-26 11.45.47.png](https://qiita-image-store.s3.amazonaws.com/0/43666/cacaf11a-db3a-cb7c-d8de-99b9489bbad2.png)

こんな画面が出るので、Repository Nameを入力してください。
その他はお好きな様に変更してください。

以上でgitBREAKにリポジトリが作成されました。簡単！


##■ ローカルにGitリポジトリを作る

プロジェクトを右クリック -> Team -> Share Project... を選択。

![スクリーンショット 2014-11-26 11.57.51.png](https://qiita-image-store.s3.amazonaws.com/0/43666/671675af-8a13-3cc3-fb79-15fa9839134e.png)

Gitを選択してNextボタンを押します。

![スクリーンショット 2014-11-26 12.43.34.png](https://qiita-image-store.s3.amazonaws.com/0/43666/17f5a049-ca79-5784-5fd5-2a744c7cafd1.png)

Createボタンを押して、Gitリポジトリを作成します。
作成したらFinishボタンを押すと完了です。


##■ ローカルリポジトリにコミット
リポジトリを作成したらまずコミットしましょう。
プロジェクトを右クリック -> Team -> Commit

コメントを入れ、コミットします。
これでローカルリポジトリにコミットできます。


##■ gitBREAKリポジトリにプッシュ

プロジェクトを右クリック -> Team -> Remote -> Push...
以下の画面が表示されます。

![スクリーンショット 2014-11-26 12.49.03.png](https://qiita-image-store.s3.amazonaws.com/0/43666/a4818166-b87f-e1b3-aba9-e79297543c85.png)

URIはgitBREAKで作成したリポジトリのURLを入力します。
gitBREAKで作成したリポジトリを表示すると、右上の方に「HTTP clone URL」と表示されているのでそのままコピペすればOKです。

後はUserとPasswordを入力してNextボタンを押します。（codebreak;のユーザー名とパスワードです）


次の画面が出てきます。

![スクリーンショット 2014-11-26 13.12.48.png](https://qiita-image-store.s3.amazonaws.com/0/43666/516c0af6-a504-7715-29dc-e8e8ab6a4070.png)

Source ref と Destination ref を入力し、右側のAdd Specボタンを押します。

すると、Specifications for pushに追加されるので、Force Updateにチェックを入れてFinishします。

以上でgitBREAKに反映されます。


指摘や質問等あれば、どんどんお願いします！
RubyスクリプトとAWSのSNSで複数デバイスへのpush通知

## これが出来ると何が嬉しいの？
一括メッセージ設定、一括送信の自動化が出来ます！

##前提条件

### Ruby環境
gem install aws-sdk-coreを実施済みであること

### iOS環境
AWS SNSでアプリを作成済みであること
AWS SNSへエンドポイントを自動登録出来る実装が完了していること
AWS SDKを導入済みであること

### 上記の内容は以下のサイトが参考になります！
http://www.aguuu.com/archives/2013/09/amazon-sns-mobile-push-ios-push-notification/

http://www.lancork.net/2013/08/how-to-ios-push-first/

http://www.lancork.net/2013/08/how-to-ios-push-second/

http://www.slideshare.net/shimy_net/amazon-sns-mobile-push

http://www.slideshare.net/AmazonWebServicesJapan/aws-31275003

https://github.com/awslabs/aws-sdk-ios-samples/tree/master/SNS-MobileAnalytics-Sample/Swift/




##概要図
![スクリーンショット 2014-11-28 19.01.58.png](https://qiita-image-store.s3.amazonaws.com/0/15812/d23d8d0b-682c-d5b4-b95b-6825bb47021e.png "スクリーンショット 2014-11-28 19.01.58.png")

・流れ1:アプリ起動時にAWS SNSのアプリ側にデバイストークンを登録
・流れ2:対象のSNSからエンドポイントを取得
・流れ3:作成済みのTopicに取得したエンドポイントをSubscribeする
・流れ4:アプリに対してメッセージをpushし、即時に通知


### Rubyスクリプト

<b>sample.rb</b>

```ruby
require 'aws-sdk'

sns = AWS::SNS.new(
  :access_key_id => 'YOUR_ACCESS_KEY',
  :secret_access_key => 'YOUR_SECRET_ACCESS_KEY',
  :region => 'us-east-1')
client = sns.client

# 対象のSNSからエンドポイントを取得
num = client.list_endpoints_by_platform_application(platform_application_arn: 'arn:aws:sns:us-east-1:************:app/APNS_SANDBOX/DevelopAppPush')

# 作成済みのTopicに取得したエンドポイントをSubscribeする
num.endpoints.each{|value|
  client.subscribe(
    topic_arn: 'arn:aws:sns:us-east-1:************:test_topic',
    protocol: 'application',
    endpoint: value.endpoint_arn)
}

# 起動していないアプリに対してメッセージをpush通知
response = client.publish(
  target_arn: 'arn:aws:sns:us-east-1:************:test_topic',
  message: 'push通知のテスト成功'
  )



```


### 備考
<b>AWSドキュメント</b>
http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/SNS/Client.html#create_platform_endpoint-instance_method
テーブル名変更マイグレーション実行時に必要な処置


個人的備忘録、おおよそ下記の手順で行った。

1.マイグレーションファイルを用意
2.マイグレション実行
3.関係各所を修正

* ルーティング、モデル、コントローラ
* ディレクトリのリネーム
* スクリプトなども必要に応じて修正

オワリ


参考
[How do you write a migration to rename an ActiveRecord model and its table in Rails?](http://stackoverflow.com/questions/471416/how-do-you-write-a-migration-to-rename-an-activerecord-model-and-its-table-in-ra)
RubyMineでもMultiple Selection出来るのにさっき気づいた


```Alt``` + ```Shift``` しながらマウス選択すると出来ます。

![ms.gif](https://qiita-image-store.s3.amazonaws.com/0/7410/05d6f66e-3bb9-3a0f-fef1-fd724ed3ea53.gif "ms.gif")
UIWebViewで、ローカルのHTMLからBootstrapを利用するときの注意点


小ネタです。

iOSアプリ内でBootstrapを利用する場合、XcodeプロジェクトにBootstrapを含めるときに"Create references folder"を選択すること。

# 類似パターン

[cocos2d-xにて、画像をマルチ解像度対応した際に、画像サイズがランダムに表示されてしまう場合の対応方法](http://qiita.com/hmu29/items/2234b7484238a719e795)
CentOS 6.6 で Laravel4 を使う準備

# php5.4の用意
 1. epelレポジトリの追加
 2. iusレポジトリの追加
 3. php5.3の削除
 4. php5.4のインストール

```
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/ius-release-1.0-11.ius.el6.noarch.rpm
$ yum repolist ius  # iusがレポジトリに登録されているかどうかの確認
$ sudo rpm -e php php-common php-cli php-devel php-pear
$ sudo yum install php54 php54-common php54-cli
```


# その他追加パッケージのインストール
 - mycrpt
 - pdo

```
$ sudo yum install mycrypt
$ sudo yum install php54-mycrypt
$ sudo yum install php54-pdo
``` 

# composerのインストール

```
# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer
```


# Laravelプロジェクトの作成 

```
$ composer create-project laravel/laravel hogehoge --prefer-dist
```


[参考サイト]
http://www.monster-dive.com/blog/web_system/20140328_001128.php
一時オブジェクトの生成コスト回避による高速化

正格評価のオブジェクト指向言語で、たとえば大きなベクトルの演算を行う場合に、一時オブジェクトの生成コストがボトルネックになることがある。可読性を保ったまま、そのようなコストを回避して高速化したい。

# [C++] Expression Template

[Expression Template - Faith and Brave - C++で遊ぼう](http://faithandbrave.hateblo.jp/entry/20081003/1223026720)

型に演算情報を保持しておくことで、要素ごとの遅延評価を実現する。

# [Scala] View

[Collections - ビュー - Scala Documentation](http://docs.scala-lang.org/ja/overviews/collections/views.html)

```scala
scala> Seq(1, 2, 3).view.map(_ + 1).map(_ * 2)
res0: scala.collection.SeqView[Int,Seq[_]] = SeqViewMM(...)

scala> res0.force
res1: Seq[Int] = List(4, 6, 8)
```

toString()の返り値であるSeqViewMM(...)は、mapを二回行うSeqViewという意味。演算そのものを関数として保持しているのがExpression Templateとの違い。この実装の大本は[TraversableViewLike](https://github.com/scala/scala/blob/v2.11.4/src/library/scala/collection/TraversableViewLike.scala)にあって、下記のようになっている。

```scala
  override def map[B, That](f: A => B)(implicit bf: CanBuildFrom[This, B, That]): That = {
    newMapped(f).asInstanceOf[That]
  }
```
```scala
  protected def newMapped[B](f: A => B): Transformed[B] = new { val mapping = f } with AbstractTransformed[B] with Mapped[B]
```
```scala
  trait Mapped[B] extends Transformed[B] {
    protected[this] val mapping: A => B
    def foreach[U](f: B => U) {
      for (x <- self)
        f(mapping(x))
    }
    final override protected[this] def viewIdentifier = "M"
  }
```