OmniAICreator/Qiita-1.07M huggingface dataset:
Modulemap  経由で C のライブラリを利用する

# はじめに

dynamic framework で C のライブラリを利用したい場合、 Bridging Header 経由では import できないため modulemap を利用します

今回は `libevent` を Swift から扱ってみたかったので、それをベースに説明します

modulemap 自体に関する解説はこちらが詳しいです
http://qiita.com/ysn551/items/6f783af2b65c2c4d4631


# サンプル

https://github.com/sora0077/libevent


# 導入

## modulemap の定義

```
module libevent [system] {
    link "event"
    umbrella header "libevent-umbrella.h"
    export *
    module * { export * }
}
```

```c:libevent-umbrella.h
#import <evhttp.h>
#import <event2/event.h>
#import <event2/http.h>
#import <event2/bufferevent.h>
#import <event2/dns.h>
```

大雑把に説明すると以下になります

+ `module <#モジュール名>` の部分が import する際の名前になる
    + e.g. `import libevent`

+ `umbrella header <#ヘッダー名>` の部分で `import` されている宣言が Swift から見えるようになる
    + Bridging Header と似たようなもの

+ `link <#ライブラリ名>` の部分がリンカ処理の際に追加される
    + ビルドログなどで目にする `-levent` になる部分
    + 場合によってはビルド設定でライブラリの場所を示す `LIBRARY_SEARCH_PATHS` を指示することも必要
    + `link` はオプションなので、省略した際は自分でライブラリをリンクする必要がある
  
          <img src="https://qiita-image-store.s3.amazonaws.com/0/8508/8525c9c3-4672-d700-bb08-03a1a545e18d.png" width="240px"/>



modulemap を Xcode で利用する際はビルド設定の `SWIFT_INCLUDE_PATHS` に modulemap が置かれたディレクトリを追加します

![xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/8508/28cdfab7-d08d-de2f-f314-c91d7afa5a20.png)


ここまで行うと Swift のソースコードで import したライブラリの関数などの補完が働き、実際に実行することができます


# 利用シーン

```swift
import libevent

func http_request_done(req: UnsafeMutablePointer<evhttp_request>, arg: UnsafeMutablePointer<Void>) {
    
    var buf = Array<CChar>(count: 256, repeatedValue: 0)
    var nread: Int32 = 0
    repeat {
        let input = evhttp_request_get_input_buffer(req)
        nread = evbuffer_remove(input, &buf, 255)
        if nread == 0 { break }
        print(String.fromCString(buf))
    } while(nread > 0)
    
    event_base_loopbreak(COpaquePointer(arg))
}

var uri_path: String = ""

let uri = evhttp_uri_parse("http://qiita.com/tattsun58/items/50e606696f1daa607a5f")
let host = evhttp_uri_get_host(uri)
let port = evhttp_uri_get_port(uri) == -1 ? 80 : evhttp_uri_get_port(uri)
let path = evhttp_uri_get_path(uri)
if let path = String.fromCString(path) where path.characters.count != 0 {
    uri_path = path
} else {
    uri_path = "/"
}

let base = event_base_new()
let dns_base = evdns_base_new(base, 1)

let conn = evhttp_connection_base_new(base, dns_base, host, UInt16(port))
let req = evhttp_request_new(http_request_done, UnsafeMutablePointer(base))

evhttp_add_header(req.memory.output_headers, "Host", host)
evhttp_add_header(req.memory.output_headers, "Connection", "close")

evhttp_make_request(conn, req, EVHTTP_REQ_GET, uri_path)
evhttp_connection_set_timeout(req.memory.evcon, 600)
event_base_dispatch(base)

evhttp_connection_free(conn)
event_base_free(base)
```


# おわりに

C ではたくさん出てくる `char *` を扱う部分（Swift 上では `UnsafePointer<Int8>`）は `Swift.String` をそのまま与えることができるので思ったより書きやすかったです

また、今回のサンプルは `podspec` を同梱しているので `pod install` すれば `import libevent` がすぐに利用できるようになっています
※ 事前に `brew install libevent` が必要です
Onsen UI でOnsen UIフレームワーク内の要素にjQueryでアクセスできない

#問題
タイトルそのままなんだけどこちらの投稿と同じ現象：
http://stackoverflow.com/questions/26407071/dom-elements-not-accessible-after-onsen-pageinit-in-ons-ready
onsen内のDOMにjQueryでアクセスできないのです。
onsen内のDOMにclickイベントを設定したいんだけど....


##手元にあるhtml
```html
<div id="onsen-element">
  <ons-navigator var="globalNavi">
    <ons-navigator var="navi" page="main.html">
    </ons-navigator>
  </ons-navigator>

  <ons-template id="main.html">
    <ons-page>
      <ons-toolbar>
        <div class="center">Navigator</div>
      </ons-toolbar>
    
      <div id="target"></div>
    </ons-page>
  </ons-template>
</div>
```

この`div#target`をクリックしたときに発火するイベントを設定します。
#ons.ready内に書いてみる
```js

ons.ready(function(){
  $("#onsen-element #target").on('click', function() {
    console.log("hoge");
  });
});
```
ダメでした

#setTimeout
```js

setTimeout(function() {
  $("#onsen-element #target").on('click', function() {
    console.log("hoge");
  });
}, 300);
```
こちら
http://stackoverflow.com/questions/26407071/dom-elements-not-accessible-after-onsen-pageinit-in-ons-ready
にあった解決策。一応うまくいったけど避けたい書き方。。。

#結論
`ons-navigator`に`postpush`イベントと`postpop`イベントを設定したら動いた。
##htmlを修正
```html
<div id="onsen-element">
  <ons-navigator var="globalNavi">
    <ons-navigator var="navi" page="main.html">
    </ons-navigator>
  </ons-navigator>

  <script type="text/javascript">
    var foo;
    foo = function(){
      console.log("hoge");
    });

    ons.ready(function(){
      navi.on("postpush",function(e){
        foo();  
      });
      navi.on("postpop",function(e){
        foo();
      });
    
    });
  </script>

  <ons-template id="main.html">
    <ons-page>
      <ons-toolbar>
        <div class="center">Navigator</div>
      </ons-toolbar>
    
      <div id="target"></div>
    </ons-page>
  </ons-template>
</div>
```
`<ons-navigator var="navi" ...`みたいに設定した`var`は`ons.ready`内で使うみたい。

##参考
http://ja.onsen.io/reference/ons-navigator.html
Windowsにuruを入れてrubyのバージョン管理をする

最近はuruがいいらしい。

zipをダウンロード

`https://bitbucket.org/jonforums/uru/wiki/Downloads`

コマンドを実行して`uru.ps1`を作る

```
uru_rt admin install
```

ダウンロードした場所をPATHに追加

```
$Env:Path += ";W:\OneDrive\Applications\uru"
```

使ってみる

まずrubyをインストール

```
choco install ruby
choco install ruby2.devkit 
```

uruで追加する

```
PS > uru admin add C:\tools\ruby21\bin
---> Registered ruby at `C:\tools\ruby21\bin` as `216p336`
PS >
PS> uru ls
    216p336     : ruby 2.1.6p336 (2015-04-13 revision 50298) [i386-mingw32]
```

バージョンをセットする

```
PS > uru 216p336
---> Now using ruby 2.1.6-p336 tagged as `216p336`
```
MySQL5.7インストール後にrootでログインする方法

CentOS7にMySQL5.7インストール後にrootでログインする際、
`mysql -u root -p`
で、パスワードをノーパスで怒られ、`root`や`admin`でも怒られる。
はて、どうなってんだろうと思ったら、
MySQLの初回起動時にrootユーザーのランダムパスワードが自動生成されているそうです。
で、そのパスワードを確認するには、`/var/log/mysqld.log`に記載があるようで、
`grep -e 'A temporary password is generated for root@localhost' /var/log/mysqld.log`
とgrepコマンド打つと
`2016-01-05T06:49:36.988332Z 1 [Note] A temporary password is generated for root@localhost: hogehoge`
のように初期パスワードが記載された行が表示されます。
`hogehoge`部分がパスワードになります。

これでrootでログインできるようになるのですが、
`mysql_secure_installation`コマンドで初期パスワードの変更やセキュリティ設定するのが良いようです。
細かいことはググってください。

#### まとめ
1. MySQL起動  
`systemctl start mysqld.service`  
1. 初期rootユーザーパスワード確認  
`grep -e 'A temporary password is generated for root@localhost'`
1. rootユーザーパスワード変更など  
`mysql_secure_installation`

mysqld.logに初期パスワードが記載されているなんて気づくか！
と思い記録しておきます。

（´-`）.｡oO（MySQL5.6の時は、どうだったかなと思ったらノーパスでした）
meta-tagsを使ってSEO周りの設定をすっきり書く！

RailsでSEOの設定を行うGemでmeta-tagsというGemがあります。今回はこのGemを使って全ページ共通のSEOの設定や個別ページでの設定をしていきたいと思います。

https://github.com/kpumuk/meta-tags

# インストール
Gemfileに以下を追記

```
gem 'meta-tags'
```

`bundle install`でgemを入れる。

# 設定
まずSEOまわりの設定としてtitleやkeywordなどページごとに異なる設定と
全ページで共通の設定の２つがあるかと思います。

まず全ページで共通の設定をしていきます。
helperに以下を追記

```lang:application_helper.rb
def default_meta_tags
  {
    title:       "Title",
    description: "description",
    keywords:    "Ruby,Meta,Tags",
    icon: image_url("favicon.ico"), # favicon
    noindex: ! Rails.env.production?, # production環境以外はnoindex  
    charset: "UTF-8",
    # OGPの設定
    og: {
      title: "title",
      type: "website",
      url: request.original_url,
      image: image_url("OGPで設定する画像"),
      site_name: "site name",
      description: "description",
      locale: "ja_JP"
    } 
  }
end
```
※ 設定は自身の環境にあわせて変えてください

layoutに以下を追記

```lang:application.html.erb
<head>
  <%= display_meta_tags(default_meta_tags) %>
</head>
```

これでlayoutが適用されている全ページにデフォルトの設定が適用されます。

次にページ毎の設定をviewに追加していきます。

```lang:login.html.erb
<%= set_meta_tags title: 'ログインページ' %>
```

この２つの設定で全体の設定、個別ページの設定ができます。

間違っている点や、上手くいかない点などあればご指摘ください。
About vm.overcommit_memory


# 参照
http://d.hatena.ne.jp/yupo5656/20040624/p1

# 要約
overcommit_memory 値の意味
## 0 (kernel > 2.4) default
最近のLinuxのデフォルト。きっちり裏取りはしないが、今までの経験から、メモリが確保出来そうか否かを判断する。つまり、そこそこ賢く、そこそこ早い、OOM Killerは出る

パフォーマンス: 中
堅牢性: 中

## 1 (kernel < 2.0 default)
何にもovercommitを制御しない、最もアホなモード。`アホ故に早い`
OOM Killerは一番でる。

パフォーマンス: 高
堅牢性: 低

redis専用サーバとかなら、最善。redisもサーバ兼用とかだと、0 の方がいい

## 2 (kernel > 2.6)
overcommitをシビアに管理する。`overcommit_ratio`で制御する。
~~swap = 0 なら ratio=100にしとけ。~~
Linuxのメモリ管理の性質上、 **SWAPを大量に積んでおく必要がある**
一番賢いが、一番遅い、OOM Killerは ~~出ない~~ 理論上は一応出る(稀ではあるが)。

パフォーマンス: 低
堅牢性: 高

1サーバに相乗りなどは、バックエンドが殺されないように 2にするのがいいと思う。

# overcommit_memory = 2 の運用
とりあえず /proc/meminfo の下記を見る

```
CommitLimit:    1839215 kB
Committed_AS:   1089466 kB
```

`CommitLimit` の値は、 SWAP + RAM * overcommit_ratio の値となる。
各プロセスは実際に利用するよりも遥かに大きいメモリ容量をOSに要求する、それを許さないのが overcommit=2
よって Commited_AS != 実メモリ利用量なので、 ratio=100にしても 実メモリの 150%ぐらいのSWAPを積んだ方がいい。
SWAPの容量は、実メモリの利用比率とCommitの利用比率が近い値にするのがいいと思う。

CommitLinit の空きは監視したほうがいい。
Unityでdllのtimestampが変だよ的なことを言われたのでメモ((φ(･д･｡)

アホみたいなタイトルですいません。

Unityを起動したらこんなエラーがめちゃくちゃ出てしまった。

```txt:log
Asset '/Applications/Unity_5_2_2f1/Unity.app/Contents/UnityExtensions/Unity/GUI System/Editor/Unity Editor.UI.dll' is in timestamps but is not known in guidmapper...
```

いろんなdllに異常が出てしまっているみたいです。
UnityEngine.UI 関連のクラスを参照しているオブジェクトがこぞって死んでいるので、絶望。


考えられる原因は、

- Unity5.3と5.2を二つ起動していた
- SVNでマージした
- revertしたりしていた
- 実行中にスクリプトの調整をしていた
と、このくらい（結構やらかしてる・・・）


調べたらUnityのフォーラムに行き着きました。
[UnityEngine.UI.dll is in timestamps but is not known in assetdatabase | Page 2 | Unity Community](http://forum.unity3d.com/threads/unityengine-ui-dll-is-in-timestamps-but-is-not-known-in-assetdatabase.274492/page-2)

とりあえずReimportAllしてみたら治りましたとさ(インポート待ち1時間半。。。)

今回はこれくらい。
【知らなかった】Chrome 余計なフォーム履歴や、アドレスバーの検索履歴を削除する方法

Chromeのフォーム履歴に、パスワードなど余計なものが残っちゃった時の対処方法を、備忘録。
同じ方法で、アドレスバーの検索履歴、URL履歴を削除できたので、備忘録。

# Case 1: 間違ってメール欄でパスワードを入力して、更にEnter押しちゃった。

**メールアドレス入力**　→　**TAB**（押した……はずが、**押せていない**）　→　**パスワード入力**　→　***Enter***。

パスワードが履歴にバッチリ残っちゃって、これは、まずい。

<img width="443" alt="フォームの履歴に余計なものが残っている例" src="https://qiita-image-store.s3.amazonaws.com/0/75329/072150da-ee7c-dc61-e2a0-91902ed7bd13.png">

上の例では、なぜか「システム部忘年会2015」という余計なものが残っちゃっている例。
メールアドレスのフォームなのに。

# Case 2: セキュリティやプライバシー的にまずいサイトを、誤って検索・アクセスした

<img width="349" alt="検索しちゃった例" src="https://qiita-image-store.s3.amazonaws.com/0/75329/5826c102-5a3f-2037-23e4-5a8090e015c2.png">
あくまで例。
間違って検索しちゃった。シークレットモードにしてなかった汗　の場合。
何とは言わないけど、消したい、速攻で消したい。
あとからほかの人に貸した時に、偶然表示されちゃうケースがあるから、とにかく今すぐ消したい。
（閲覧履歴を表示して個別に消す方法もあるが、ここでは緊急処置。）

# 削除方法
**削除する項目をハイライトした状態で**

**Windows**
Shift + Delete

**Mac**
***fn*** + Shift + Delete

参照元：
http://www.kotalog.net/archives/5728

非常に助かりました。
Akkaでround robinのremote routing


cluster構成で、remoteのround robin routerを使う場合の
設定、実装


round robinを使う場合のconf

```application.conf
akka {
  actor {
    provider = "akka.cluster.ClusterActorRefProvider"

    deployment {
      /clusterrouter {
        router = round-robin-pool
        nr-of-instances = 10
        target.nodes = [
          "akka.tcp://MetaInfoScraperCluster@なんか:2550",
          "akka.tcp://MetaInfoScraperCluster@あれか:2550"
        ]
      }
    }
  }

  remote {
    log-remote-lifecycle-events = on
    netty.tcp {
      hostname = "127.0.0.1"
      port = 0
    }
  }

  cluster {
    seed-nodes = [
      "akka.tcp://MetaInfoScraperCluster@なんか:2550",
      "akka.tcp://MetaInfoScraperCluster@あれか:2550"
    ]
    auto-down-unreachable-after = 10s
    //auto-down = on
  }
}
```


clusterの生成

```
val system = ActorSystem("MetaInfoScraperCluster")
val clusterListener = system.actorOf(Props[ClusterListener],
      name = "clusterListener")
Cluster(system).subscribe(clusterListener, classOf[ClusterDomainEvent])
```

routerの生成

```
    val router = system.actorOf(FromConfig.props(Props[MetaInfoScraper]),    "clusterrouter")

      val urls = Source.fromFile(input).getLines()
      urls.filter(!_.startsWith("#")).zipWithIndex.foreach {
        case (url, i) => {
          println(s"!! url: $url")
          // HashingRouter
          //router.tell(ConsistentHashableEnvelope(Request(url),i), clusterListener)
          router.tell(Request(url), clusterListener)
        }
      }
```
Rubyの文法で引っかかった話(あるいは+の位置で人生が変わる話)

「お前こんなことも知らずにRuby使ってたのｗｗｗ」と多数の人に牧草ロールをプレゼントされてしまいそうな話ですが。

# お題
ちょいとこんなコードをご覧ください。

```rb:
dat = {
  :va => 0.3,
  :vb => 0.5,
  :v1 => 1.0,
  :v2 => 2.0,
  :v3 => 3.0,
  :v4 => 4.0,
  :v5 => 5.0,
  :total => 100.0
}

result = (
      dat[:va] * 0.2
    + dat[:vb]
    + dat[:v1]
    + dat[:v2] * 2
    + dat[:v3] * 3
    + dat[:v4] * 4
    + dat[:v5] * 5
) / dat[:total]
```

さて、resultはいくつになるでしょう？
私は0.572あたりを期待していたのですが、Rubyインタプリタは0.25だとおっしゃいました。

**なんでやー！**

# どうやら

```rb:
    + dat[:vb]
    + dat[:v1]
    + dat[:v2] * 2
    + dat[:v3] * 3
    + dat[:v4] * 4
    + dat[:v5] * 5
```

これらは全部「単項+がついただけの値が順に並んでるだけ」と解釈されるのですね。
()の中身は最後に評価された + dat[:v5] * 5 となり、結果(+5.0 * 5) / 100.0ということになると。

```rb:
result = (
      dat[:v1] * 0.2  +
      dat[:v2]        +
      dat[:v1]        +
      dat[:v2] * 2    +
      dat[:v3] * 3    +
      dat[:v4] * 4    +
      dat[:v5] * 5
) / dat[:total]
```

これならちゃんと()内を足しこんでくれます。

……どうにも計算の結果がおかしいのでirbにコード流してみたら一行ずつ評価されて初めて気が付きましたとさorz
多分文法仕様とか見たら根拠が書いてあるんでしょうけど今は読む気力ないですすみません。
ESP8266 > SDK versionを表示 > user_interface.h > Serial.println( system_get_sdk_version() );  

```txt:動作確認
ESP-WROOM-02
```

user_interaface.hにはSDKのバージョンを取得する関数があるようだ。

```.c
extern "C" {
#include "user_interface.h"  
}

void setup() {
  char *chptr;
  Serial.begin(115200);
  Serial.println();

  Serial.print("SDK version:");
  Serial.println(system_get_sdk_version());  
}

void loop() {
  // put your main code here, to run repeatedly:
}
```

上記を実行すると以下のようになった。

```
SDK version:1.3.0
```

http://qiita.com/7of9/items/a24430f4a43390ae8b9f
にてAT+GMRで確認した時は以下の通りだった。　

>AT+GMR
AT version:0.25.0.0(Jun 24 2015 18:02:27)
SDK version:1.1.2
compile time:Jun 24 2015 18:15:29
OK

SDKのバージョンがどこで1.1.2から1.3.0に上がったのかは理解していない。
the zen of Python

> Beautiful is better than ugly.
    Explicit is better than implicit.
    Simple is better than complex.
    Complex is better than complicated.
    Flat is better than nested.
    Sparse is better than dense.
    Readability counts.
    Special cases aren't special enough to break the rules.
    Although practicality beats purity.
    Errors should never pass silently.
    Unless explicitly silenced.
    In the face of ambiguity, refuse the temptation to guess.
    There should be one-- and preferably only one --obvious way to do it.
    Although that way may not be obvious at first unless you're Dutch.
    Now is better than never.
    Although never is often better than *right* now.
    If the implementation is hard to explain, it's a bad idea.
    If the implementation is easy to explain, it may be a good idea.
    Namespaces are one honking great idea -- let's do more of those!

source: https://hg.python.org/peps/file/tip/pep-0020.txt
Selenium+PhantomJSで意識の低い自動化を改善したお話し


# 背景

* [意識の低い自動化をしたお話](http://qiita.com/ex_SOUL/items/dc33159db8edc52439ce)にて、PhantomJSを使えばブラウザ起動なしで実行できるよ、とのコメントをもらった


---
# やってみた
---

# 結果

PhantomJSを使用して、ブラウザ起動なしの自動化に改善することができた。(若干の高速化も)

---

# やったこと

---

## PhantomJSのダウンロード

1. [ここ](http://phantomjs.org/)からPhantomJSのWindows用のzipをダウンロード
1. 適当な場所に展開

---

## 既存のソースを編集

```ishiki_hikuikei_source.rb
# coding: utf-8
require "selenium-webdriver"

# PhantomJSのパスを環境変数に追加すれば以下は不要らしいけど、
# うまくいかなかったのでここで指定
Selenium::WebDriver::PhantomJS.path = 'C:\phantomjs_path\bin\phantomjs.exe'

    # selenium-webdriver にphantomjs用のmoduleが同梱されているのでこの書き方でOK
    @driver = Selenium::WebDriver.for :phantomjs

    # 上記のmoduleを使用しない場合は、あらかじめphantomjsを起動したうえで
    # 以下の様に記載すればOK。上記のmoduleを使用した方が圧倒的に便利だと思う
    # @driver = Selenium::WebDriver.for(:remote, url: "http://localhost:8080")

#以下略
```

---

# 雑感

---

## PhantomJS便利

GUIブラウザの起動が必要なくなったのは大きい。
中身でどんなことをしているのか、どれほどの自由度があるのかは分かっていないけれど、Selenium応用の幅は広がると思う。

---

## 要件を満たす実装の推敲

今回の件は元々個人の自己満足のためのものだったのでそれほど重要では無いけど、
要件を満たす実装を見つけても、(時間が許せば)より良い方法を探すのも大事だなと感じた。

---

# おまけ

---

## 最近のニュース

**[マイクロソフトのパスワードに関するガイダンス](https://blogs.technet.microsoft.com/jpntsblog/2016/05/27/%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%82%AC%E3%82%A4%E3%83%80%E3%83%B3%E3%82%B9/)**

パスワードの定期変更をユーザに強制すべきではないと明言している

**[NISTのDRAFT](https://pages.nist.gov/800-63-3/sp800-63b.html)**
**[↑についての日本語記事](http://www.zaikei.co.jp/article/20160629/314346.html)**

パスワードの定期変更を明確に否定している

---

# おしまい
Task Spoolerを使ってみた

## 参考

* [Task Spooler - batch is back!](http://vicerveza.homeunix.net/~viric/soft/ts/)

## インストール

* ubuntu14.04,16.04,debian9にて確認

```bash:
apt-get install -y task-spooler
```

## 使い方

* 並列実行数を設定

```bash:同時実行数を1にする
tsp -S 1
```

```bash:queue表示
tsp
```

```bash:追加
tsp vmstat 1
```

```bash:削除
tsp -r キューID
```

```bash:tail表示
tsp -t キューID
```

```bash:queueの順番入れ替え
tsp -U 2-3
```

```bash:終了したjobの削除
tsp -C
```

```bash:task-spoolerサーバをKILL
tsp -K
```
ピクセル倍角なウインドウでcocos2dゲームを作る


cocos2dで遊ぶにあたって、320px * 240px ぐらいの絵でゲームを作りたいけど、PCモニターではあまりにも小さいので、拡大して 640px * 480px のウィンドウに表示したい。

```
SCALE = 2
director.init(width=320, height=240, autoscale=True)
director.window.width = 320 * SCALE
director.window.height = 240 * SCALE
```

おてがる。
Redis 最短入門(4)だけじゃない、Redis

## それらしいRedisの使い方 - Zセット

- あと2，3あるので最短入門のわりに回を重ねそうです

最低、出し入れができればあとはなんとかなる。
初めての人は Redis 最短入門(1)2行でインストール&起動 を参照。

Redis が比類ないところにすこしだけ踏み入ってみませんか。

##  Zシリーズ

Sorted Set というのを扱えるZで始まるメソッドがある。
　　　　(´・ω・｀)。。。(zがsに似ているからだろうか)

> KVSでNOSQLだから、ランキングってAPIで取得してから自分で整列させるの?

"NO!" そんなプログラマみたいなこと誰がいうんだい?

キーでサッと出す!リアルタイムの味方、それがredis

スコアでソート、それだけは集計作業をしてくれるようだ。



## まず、追加


`ZADD` key score value

- キーに対して、スコアつきで値を保存
- ハッシュ型　+　ソートのためのヒントにスコアをつけてる　といった感じ

## 範囲指定ください
`ZREVRANGE` key start end [WITHSCORES]

- スコアでソートした順で、start end の区間指定をして部分的に取得
- 20-30位、とか次のページにいくのに便利だ


ランキングには凝っているようで、まぜちゃってのソートをやってくれるところGJ!

それぞれに重みが渡せるらしいので、リコメンドや機械学習的に神。

## 総合ランキングにしてください
`ZUNIONSTORE` newkey N key1 key2 ... (WEIGHTS w1 w2 .... ) (AGGREGATE (SUM|MIN|MAX))     

- N個のキーのなかから新たにランキングを作成して　newkey に格納する いくつ続くかのヒントにN個を指定するらしい。キーの個数。

- 結果は　newkey を指定してとってくる ここが若干KVSらしさ。返却はして来ない。

- ジャンル別のランキングと総合ランキングとかにつかえるミソ

- SUM,MINとMAXは同じ値のときのスコアの評価式　スコアが多い順にでてくる。


`ZINTERSTORE`　は共通項、ということみたいなのであまり使わない。。


次は、PUBLISHとSUBSCRIBEの予定
Route53 に Internet facing ELB の ALIAS レコードを一発で登録する

例えば、ELB を作成した後に Route53 に ALIAS レコードを自動的に登録したりするのに使えます。

下記では Internet facing ELB だけ登録していますが、`aws elb describe-load-balancers` の `--query` をちょいちょいいじれば別の条件でもできます。

```sh
# 登録先の Route53 の DNS 名
dns_name="aws.example.com"

# 登録先の Route53 のゾーンの ID を取得
zone_id="$(aws route53 list-hosted-zones-by-name --dns-name "$dns_name" \
  --query 'HostedZones[].Id' --output text)"

# ゾーン ID から余計なプレフィックスを除去
zone_id=${zone_id##*/}

# change-resource-record-sets の入力になる JSON を作成
json="$(
  aws elb describe-load-balancers \
    --query 'LoadBalancerDescriptions[?Scheme==`internet-facing`]' |
  jq --arg domain "$dns_name" '{
    Changes: [
      .[] | {
        Action: "UPSERT",
        ResourceRecordSet: {
            Name: (.LoadBalancerName + "." + $domain),
            Type: "A",
            AliasTarget: {
                HostedZoneId: .CanonicalHostedZoneNameID,
                DNSName: .CanonicalHostedZoneName,
                EvaluateTargetHealth: false
            }
        }
      }
    ]
  }'
)"

# Route53 に レコードを登録する
aws route53 change-resource-record-sets --hosted-zone-id "$zone_id" --change-batch "$json"
```

`aws elb describe-load-balancers` の結果を `jq` で整形して `aws route53 change-resource-record-sets` の入力にそのまま使っています。
JAVA 第1級オブジェクト/関数オブジェクトとは

__________________________________________________
<FONT color="#ff0000">■第1級オブジェクトとは</font>
**あるプログラミング言語において、プログラム実行中に生み出したり、
変数に代入できたり出来るもの。
第1級オブジェクトとして扱われる関数のことを、
特に<FONT color="#ff0000">関数オブジェクト</font>と表現することがある**
cocos2d/pyglet でぼやけないスプライトを描画する

cocos2d というか pyglet は、2Dスプライトに使うテクスチャの補完パラメーターがデフォルトでは `GL_LINEAR` になるらしく、タイル状にスプライトを並べた絵から矩形を切り出して使うと、ちょっとだけ隣のピクセルが滲んでくる。

まあ、スプライトを拡大縮小すると境界はボケないのに中だけぼやけて、いかにもOpenGLくさい感じになってしまうのもアレだしなぁ。8bit感のあるジャギジャギな絵で割りきって作りたい。

これ、テクスチャの `GL_TEXTURE_MAG_FILTER` と `GL_TEXTURE_MIN_FILTER`に `GL_NEAREST` を付ければよさそう。ロードした時点でもう付けておく。

```py
image = pyglet.image.load('hoge.png')
glBindTexture(image.texture.target, image.texture.id)
glTexParameteri(image.texture.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glTexParameteri(image.texture.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)

sprite = Sprite(image.texture)
```

これでピクセルがボケない。

```py
sprite1 = Sprite(image.texture.get_region(0, image.height - 32, 32, 32))
sprite2 = Sprite(image.texture.get_region(32, image.height - 32, 32, 32))
actor_layer.add(sprite1)
actor_layer.add(sprite2)
```

タイルの隣のピクセルも滲み出してこない。

TMXのタイルマップを読み込んだ場合、暗黙的に画像がロードされて個別のテクスチャになってしまうようなので、タイルセットの全タイル定義に適用する。

```py
map_resource = cocos.tiles.load('fuga.tmx')
for res in map_resource.contents.values():
    if isinstance(res, cocos.tiles.TileSet):  # タイルセットだけ
        for tile in res.values():
            glBindTexture(tile.image.texture.target, tile.image.texture.id)
            glTexParameteri(tile.image.texture.target, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
            glTexParameteri(tile.image.texture.target, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
```

適用前
![screenshot-1451988721.png](https://qiita-image-store.s3.amazonaws.com/0/11525/7d64c87c-5eb2-90db-5e12-2f7664ac0a0e.png)

適用後
![screenshot-1451988559.png](https://qiita-image-store.s3.amazonaws.com/0/11525/94cea149-3e34-7005-7336-bec7afac439e.png)
レンダーエレメントを操作するMAXScriptメモ

#これはなに？
windows10環境でレンダーエレメントを編集しようとしたら落ちるので、
スクリプト経由で設定を変更したい

#前提

>オートデスク製品の Windows 10 および .NET 4.6 のサポート（2015年11月17日）
>https://knowledge.autodesk.com/ja/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/JPN/Windows-10-support-for-Autodesk-products.html

`Windows 10 は、まだオートデスク製品ライン全体で正式にサポートされているオペレーティング システムではありません。`

#現象
Windows10で3dsMax 2015（17.0 SP3）のRender Elementsタブを開いて
レンダーエレメントを編集しようとすると激落ち君

##（今思ったこと）
（2016だったら起きなかったりして。手元にないけど。）

#書いてみた
##やりたいこと

- レンダーエレメントの一括ON
- レンダーエレメント出力先パスの削除

lookdev済みのシーンを受け取って
アニメーションつけたあと、
レンダリング投げる時に使いたい。

##スクリプト

```py:
import MaxPlus
msEval = MaxPlus.Core.EvalMAXScript

msString ='''
reMgr = maxOps.getCurRenderElementMgr()
reNum = reMgr.numRenderElements()

for i = 0 to (reNum-1) do(
	local re = reMgr.getRenderElement i
	ElementName = re.elementname

	DirfileNameType = getFilenameType (reMgr.GetRenderElementFilename i)
	reMgr.SetRenderElementFilename i ""

	re.enabled = true
	renderSceneDialog.update()
	)
'''

msEval(msString)
```

##やったこと

`local re = reMgr.getRenderElement i`でレンダーエレメント取得
`reMgr.SetRenderElementFilename i ""`で出力先パスを空に
`re.enabled = true`でレンダーエレメントをON

#まとめ

MaxPlusの練習もかねてるけど
ほとんどMAXScriptをevalしてるだけだから意味ないよ！

##参考

Executing MAXScript code from Python 
http://help.autodesk.com/view/3DSMAX/2015/ENU/?guid=__files_GUID_050A2EBF_A176_49B8_8ED4_14FC2301531B_htm
※2016でこのページを探そうとすると、強制的に日本語版に飛ばされる上に、日本語版ドキュメントは無いよみたいなことをしれっと言ってくるので困ります。

Interface: RenderElementMgr
http://help.autodesk.com/view/3DSMAX/2015/ENU/?guid=__files_GUID_E8F75D47_B998_4800_A3A5_610E22913CFC_htm
Atomでrbenvで指定されたrubyを使う

$HOME/.atom/init.coffeeに次の指定を追加する

```coffeescript
process.env.PATH = "#{process.env.HOME}/.rbenv/shims:#{process.env.HOME}/.rbenv/bin:#{process.env.PATH}"
```

#### 参考
https://atom.io/packages/ruby-bundler
【CakePHP】一台で複数のアプリケーションを運用する場合にセッションを使う方法

セッションIDを設定しないとデフォルトのセッションIDが使われるため、複数のアプリケーションを同時に立ち上げた場合セッションIDがかぶってしまう。

異なるセッションIDを設定することでセッションIDのかぶりを防ぐ。
セッションIDの設定はConfig/core.phpで行う。

```php:core.php
Configure::write('Session', array(
  'cookie'=>'foo',//セッションID名
  'defaults' => 'php'
));
```
Xcode7でATSを即座に無効にする方法（これが一番楽だと思います）

Xcode 7でiOSアプリを作る際、http通信をデフォルトでブロックするATS（App Transport Security）という機能があります。詳しくは[iOS9 ATS問題](http://qiita.com/yanayanalte/items/e6d83c12af77fa238a58)にまとまっています。

正しい対応方法やinfo.plistを直接編集する方法はあるのですが、テストをしたい時などに手軽にXcode上からATSを無効にする方法を紹介します。**多分これが一番楽だと思います**。

![キャプチャー1](https://qiita-image-store.s3.amazonaws.com/0/67884/f7158a8f-9811-d71f-5c54-9e92cd43aa61.png)

① ナビゲーターのプロジェクト名部分を選択
② [info]を選択
③ 任意のKeyの、[＋]ボタンをクリックしてKeyを追加する

![キャプチャー2](https://qiita-image-store.s3.amazonaws.com/0/67884/fc2466a4-a910-e5aa-f64e-8853814fc58c.png)

④ 図の④の箇所をクリックする
⑤ 図の⑤の箇所でKeyを選択できるので、[Allow Arbitrary Loads]を選択する
⑥ Valueを[YES]にする

以上です。
やっていることはinfo.plistの編集と同じなのですが、直接ファイルを編集するよりもUI上から行うほうが安全でしょう。

テストするには下記のようなコードを使うとよいです。
上記の[Allow Arbitrary Loads]をYESをした場合のみ、http通信が可能になります。

```swift:Swift-ViewController.swiftのviewDidLoad()内
let myWebView:UIWebView = UIWebView();
myWebView.frame = CGRectMake(0, 0, 320, 480);
self.view.addSubview(myWebView);
// http通信を試みる。ATSが無効の時のみ成功する
myWebView.loadRequest(NSURLRequest(URL: NSURL(string: "http://yokanavi.com/")!));
```
フォームの作り方

#はじめに
何より概要とかフローを伝えたかったのでざっくりしたタイトルにしました。
各データを用意する処理までで、HTMLとか表示方法については書いてません。

#仕様
##入力ページ：ユーザーが回答を入力するページ
- 入力済みの内容は自動で入力
- エラーがあればメッセージを表示

##確認ページ：回答を表示してユーザーが確認するページ
- 回答をバリデーションチェック
- エラーがあれば入力ページに遷移

##完了ページ：回答が確定したことを知らせるページ
- 完了メッセージを表示

##サーバーサイドの動きを図で表してみると…
![フォームキャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/107936/38a4763a-f093-7f90-7cc2-6b4549b722f5.png)

#実装
データの受け渡しはPOSTとセッションを使う。
セッション内に以下のような配列を作れればOK。

```php:エラーなし
array(
    "answers" => array(
        "name" => "suzuki",
        "age"  => 21
    ),
    "token" => "fjid8fj50dkg84zh73jhg834jgfergsq";
);
```

```php:エラーあり
array(
    "answers" => array(
        "name" => "suzukiichiro"
    ),
    "errors" => array(
        "name_error" => "名前は10文字以内で入力してください",
        "age_error"  => "年齢を入力してください"
    )
);
```

##セッションの中身を作る関数
###"answers"配列を作る関数

```php:formMethods.php
function getAnswers( $values ) {
    $answers = array();

    //欲しいカラム名を定義
    $value_names = array("name", "age");

    //欲しいカラムだけ抽出
    foreach($value_names as $value_name) {
        $answers[$value_name] = isset($values[$value_name]) ? $values[$value_name] : null;
    }

    return $answers;
}
```

###"error_messages"配列を作る関数

```php:formMethods.php
function getErrors( $answers ) {
    $errors = array();

    //空チェック
    if(empty($answers["name"])) {
        $errors["name_error"] = "名前を入力してください";
    }
    //文字数チェック
    else if(strlen($answers["name"]) > 10) {
        $errors["name_error"] = "名前は10文字以内で入力してください";
    }

    //空チェック
    if(empty($answers["age"])) {
        $errors["age_error"] = "年齢を入力してください";
    }

    return $errors;
}
```

###トークンを生成する関数

```php:formMethods.php
function generateToken() {
    return md5(openssl_random_pseudo_bytes(32));
}
```

※トークンとは…
確認ページから完了ページに行く際に必要となる鍵のようなもの。
セッションに保存した値と確認ページからPOSTされた値を比較する。

##上記の関数を使った各ページの処理

###入力ページ

```php:input.php
session_start();

//入力済みの内容があれば取得
$answers = isset($_SESSION["answers"]) ? $_SESSION["answers"] : array();

//エラーがあれば取得
$errors = isset($_SESSION["errors"]) ? $_SESSION["errors"] : array();

//セッションを削除
session_destroy();
```

###確認ページ

```php:confirm.php
session_start();

//回答リスト取得
$answers = getAnswers($_POST);

//回答リストをセッションに保存
$_SESSION["answers"] = $answers;

//回答に対してのエラーリストを取得
$errors = getErrors($answers);

//エラーあれば...
if(!empty($errors)) {
    //エラーをセッションに保存
    $_SESSION["errors"] = $errors;

    // 入力ページに遷移
    header("location: input.php");
    exit();
}

//トークンを生成
$token = generateToken();

//トークンをセッションに保存
$_SESSION["token"] = $token;
```

###完了ページ

```php:complete.php
session_start();

//トークンチェック
if(!isset($_POST["token"]) || !isset($_SESSION["token"]) || $_POST["token"] != $_SESSION["token"]) {
    // 入力ページに遷移
    header("location: input.php");
    exit();
}

//回答リストを取得
$answers = $_SESSION["answers"];

//セッションを削除
session_destroy();
```

あとはHTMLのほうで各データを表示していけばよい。
確認ページから完了ページではhiddenでトークンを渡すのも忘れずに。


#まとめ
配列ゲーですね。
関数はクラスにして汎用性の高いものにしましょう。
ActiveRecordで、uniqueかつnilを許可

# 背景
パスワードリセットの為に一意のtokenを生成して、
`http://example.com/password_reset/#{token}`みたいなURLにアクセスしてパスワードをリセットするというのをやりたかった。

```rb:user_info.rb
class UserInfo < ActiveRecord::Base
  belongs_to :user

  # <!--省略 -->
  validates :token, uniqueness: true
end

```

tokenは一意に定まるので、model層でのバリデーションは上記の様にやれば良いと踏んで実装したが、
今まで通っていたはずの別のテストが、通らなくなった。

# 原因

tokenは、ユーザーがパスワードをリセットしたいと望んだ時に初めて生成されるものなので、初期状態は`nil`である。

つまり、`nil`の状態を持ったユーザーがたくさん作成されると、`nil`というtokenの値を持ったデータが複数個作られるため、一意に定まってないじゃん！と`ActiveRecord`が誤作動してしまうというのが原因（だと思う）。

mysqlではデフォルトで`nil`は無視されるので、どんなに`nil`の値を持ったユーザーがいても大丈夫なのだけれど、`ActiveRecord`ではうまくいかなかった。


# 対処法

```rb:user_info.rb
class UserInfo < ActiveRecord::Base
  belongs_to :user

  # <!--省略 -->
  validates :token, uniqueness: true, allow_nil: true
end

```

`allow_nil: true`を付け足して、明示的に教えてあげたらうまくいった。
vim-modeline Packageをリリースした


## vim-modeline

URL: https://atom.io/packages/vim-modeline

以前[AtomでVimのモードラインを限定的に解釈する](http://qiita.com/from_kyushu/items/ef600c2569260ec2591b)という投稿に書いたものをパッケージ化し、リリースした。

## 使用方法

当パッケージをインストールし有効化すると、ファイルを開く際に自動でモードラインを認識するようになる。

## 対応しているオプション

- `expandtab` / `noexpandtab`
- `fileencoding`
- `fileformat`
- `filetype`
- `tabstop`

## モードライン記述例

```ruby
# vim:set expandtab tabstop=2 fenc=utf-8 ff=unix ft=coffee:
```

## TODO

- [ ] `softtabstop` support
- [ ] `shiftwidth` support

`softtabstop`と`shiftwidth`はAtomに対応する機能がないので、それぞれ似たような機能を持たせたパッケージを作り、[Service API](http://blog.atom.io/2015/03/25/new-services-API.html)を用いてvim-modeline側から制御することになると思う。
一応TODOとして挙げてはいるものの、私自身はさほど必要性を感じていないためモチベーションは低めである...。
.htmlと.textと.valで混乱したので整理する

#違い
- .html(): 引数をHTMLとして書き換え。タグが有効になる。
- .text(): 引数を文字列として書き換え。タグはエスケープされて無効になる。
- .val(): 引数をvalueとして書き換え。

#例

```html

<script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>

<dev id='html'></dev>
<dev id='text'></dev>
<input id='val' value='none'>

<script>
  $('#html').html('<b>太字になる</b>');
  $('#text').text('<b>太字にならない</b>');
  $('#val').val('書き換え');
</script>

```
###出力
![スクリーンショット 2016-01-05 6.37.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/96f8459a-a947-10cd-0501-400198c60229.png)


#参考
https://q-az.net/none-jquery-html-text-val/
http://wp-p.info/tpl_rep.php?cat=js-biginner&fl=r13
Turbolinks＋スマホ向け表示でページ遷移後にmetisMenuを閉じさせる

[metisMenu](https://github.com/onokumus/metisMenu)は[SB Admin 2](http://startbootstrap.com/template-overviews/sb-admin-2/)等bootstrapベースのAdmin向けテーマのメニュー表示によく使われています。

RailsでTurbolinksを有効にしている場合、ページ遷移時にmetisMenuが有効になるようにする必要があります。これは参考サイトのやり方でできます。

```
  $(document).on('page:load', function () {
      // ページ遷移したときmetisMenuを有効にする
      $('#side-menu').metisMenu();
  });
```

ただ、画面が狭い時のスマホ向け表示ではページ遷移時にmetisMenuが表示されたままになってしまいます。

metisMenuのDOM要素は

.navbar-collapse.collapse.in が表示状態
.navbar-collapse.collapse が非表示状態

で、Turbolinks環境でのページ遷移後は

.navbar-collapse 

となっているので'collapse'クラスを付与してあげるとメニューが非表示になります。

```
  $(document).on('page:load', function () {
      // ページ遷移したときmetisMenuを有効にする
      $('#side-menu').metisMenu();

      // ページ遷移したときcollapseクラスを付与することでメニューを閉じた状態にする
      $(".sidebar-nav.navbar-collapse").addClass('collapse');
  });
```

## 参考サイト
- [Turbolinks環境でmetisMenuを利用する方法](http://kaorumori.hatenadiary.com/entry/2015/04/23/150236)
後の事を考えて $_POSTなどを生で使わないようにする。

セキュリティ対策で、フレームワーク等を使用していない場合でも後々を考えて、メインフローとなる部分やクラス内でも生の$_POSTを使わないようにする。
考えてみれば簡単な話しだが、今までこれを考え付かなかったのは、自分の頭の固さか・・・

```O_Post.php

<?php


function U_POST($value,$op=0){

	//01- $opで動作切り替えたり、バリデーション入れたりでも。
	if($op==1):
	$val = @$_POST[$value];
	else:
	//
	endif;


	//02- 不要なタグの除去・簡易的なＸＳＳ対策
	$val = htmlspecialchars($val, ENT_QUOTES);

	//03- 値を返す
	return $val;

}



//$_POST['test']を取得する
$test = U_POST('test',0);
//echo $test;



```


もちろんこれだけではダメですが・・・

[参考：　PHP開発エンジニア必読！最低限必要なセキュリティ対策](http://www.hp-stylelink.com/news/2013/09/20130913.php)


--------------
(追記：修正)

>コメ１：mpyw 様の指摘からの修正



``` U_post.php
<?php
// 全ての PHP エラーを表示する
//ini_set('error_reporting', E_ALL);



function U_POST($value,$op1=1,$op2=0){

	//01- $op1で動作切り替えたり、バリデーション入れたりでも。
	if($op1==1):
		$val = isset($_POST[$value]) ? $_POST[$value] : false ;
		$val = is_string($val) ? $val : false ;
		//filter_inputに変更も
		//http://php.net/manual/ja/function.filter-input.php
		//PHP７なら&&でも
	else:
	//
	endif;



	//02- $op2で不要なタグの除去・簡易的なＸＳＳ対策
	//エスケープ漏れ、ダブルエスケープが生じる可能性がある為、非推奨
	if($op2==1):	
	$val = htmlspecialchars($val, ENT_QUOTES);
	else:
	//
	endif;




	//03- 値を返す
	return $val;

}

?>

<?php
// ----------------------------------------------------------
//以下テスト
//04- $_POST['test']を取得する
	//04-1 生POSTの状態
	//htmlとして解釈される為、Bタグが有効に
	echo $_POST["test"] . "<br>";
	echo $test = U_POST("test",1,0) . "<br>";

	//04-2 エスケープ処理、そのままプレーンな<b>futoi</b>が表示される
	echo $test = U_POST("test",1,1) . "<br>";

	//04-2-2 ダブルエスケープした場合・・・　トホホになる
	echo $test = htmlspecialchars(U_POST("test",1,1)) . "<br>";


//05- formから送信
//値を変えてテストも
//case
// "0"の場合
// ""　つまり空の場合
// <b></b>　中身が無いタグの場合
?>
<form method="post" action="">
<input type="text" name="test" value="testdesu<b>futoi</b>">
<input type="submit" name="submit" value="post!">
</form>

```


考え方の整理として

１　どんな返り値を期待してPOSTの値を処理しているか？
特に一度得た値のnull,false,0,空タグをゴッチャにしてないか？


２　セキュリティ対策の肝は「html表示前」、「SQL発行前」がポイント
でないと「html表示前」に行なわない場合、プログラマーの習慣でエスケープ漏れ、ダブルエスケープが生じる。
Javaで、どのO/Rマッパー使おうか迷ったときの適当メモの切れはし。。

全然、O/Rマッパーの比較になっていなくて、ただの適当メモです。
期待しないで下さい m(_ _)m

## S2JDBC

個人的には、とても使い慣れていて、一番好き。
なのですが、今年中に現在の OSS 側のサポート体制が無くなるとのことで、
利用企業側では無くしていく流れが強くなっていますね。。

＃日本のOSSなので海外ではあまり使われていないのかな・・・？

## QueryDsl

海外で作られているもので、流れるように呼び出すメソッドは S2JDBC にそっくり。
これだと、S2JDBC を使えばいいじゃん。ってなりそうな印象。

## Spring Data

SpringFramework を使っている場合には、このO/Rマッパーが利用されることが多いみたいです。
色々なデータストアに対応していて大がかりな印象。
Springは世界的に有名なので、これを選択するのが無難な気もします。

## Spring JDBC Template

Spring Data の後発っぽい。
簡単なSQLを作るなら、こちらの方がシンプルに実装できそうな印象を受けました。
ただ、機能は豊富じゃない印象。

## DBflute

Seasarプロダクト（？）
http://dbflute.seasar.org/ja/manual/

上記 URL のドメインに "seasar.org" って書いてありますが、
DBfluteはSeasarブランドから独立する、と述べています。
http://d.hatena.ne.jp/jflute/20140925/seasar

ドキュメントが豊富です。

## Doma

Seasarのライブラリに依存しないように、疎結合に実装されたSeasarプロダクトのO/Rマッパー。
http://doma.readthedocs.org/ja/stable/

Doma2からは配布サイトがSeasarのサイトではなくなっています。
http://doma.readthedocs.org/

なお、ソースコードを見てみると、パッケージ名は org.seasar.doma.xxxx になっている模様。

## MyBatis

以前はiBatisという名前だった模様。
未調査ですが、どこまで使えるのか気になっています。
AWS CodeCommitで急に403が返ってくるようになった時の対処方法

最近触れる機会があり、ややハマりしたので対処方法のまとめです。

# 現象
OSXで[AWS CodeCommit](https://aws.amazon.com/jp/codecommit/)を使っていると、今までリポジトリへアクセスできていたのに、急に403が返ってきてアクセスできなくなることがあります。

具体的にはこんな感じのエラーです。さっきまでpullできてたのになんで？

```console
$ git pull origin master
fatal: unable to access 'https://git-codecommit.us-east-1.amazonaws.com/v1/repos/awesome-app/': The requested URL returned error: 403
```

# 原因
端的に言うと、キーチェーンアクセスに保存したcredentialがすぐに有効期限切れになってしまうことが原因でした。

OSXにプリインストールされているGitは、credentialを保存するのにKeychain Accessを使います。ですが、セキュリティ上の理由からCodeCommitへアクセスするためのcredentialはテンポラリなものであるため、**リポジトリに初回アクセスした際に保存されたcredentialは約15分後には使えなく**なります。

# ではどうするか？

方法は**３つ**あります。

## 1. keychain をデフォルトで利用しない gitを別途インストールする 
brewなどを使えば簡単ですね。gitが２つになっちゃうことを許容できれば**一番手軽な回避方法**だと思います。


## 2. Keychain Accessの設定を変更して、CodeCommitを利用する際にはcredentialを使わないようにする。 

まず、Keychainを開いてcodecommitなどで検索します。

<img width="789" alt="キーチェーンアクセス.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/99a69792-9d75-bff0-93a5-f68a541d874e.png">

次に、該当項目を右クリックなどで情報を表示しアクセス制御タブを選択します。
で、git-credentila-osxkeychainを`ー`ボタンで削除して変更内容を保存します。（このときユーザのパスワードが必要です）

<img width="733" alt="スクリーンショット 2015-12-17 20.08.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/f3eb302f-0073-b025-38ed-d9e59a8e56f6.png">

そして、リポジトリに戻って、`git pull origin master`などリポジトリへアクセスしてみると以下の様なダイアログがポップアップします。
<img width="429" alt="スクリーンショット 2015-12-17 20.14.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/18114/e38c59d1-0328-f39c-c036-b1207aea6cf8.png">

そこで拒否を押せば、無事アクセスすることが可能です。

**だけど、アクセスするたびに拒否するとかまじめんどくさい。。。**

## 3. sshを使ってアクセスする。

httpsではなくsshを使ってリポジトリにアクセスすることもできます。ただ、IAM Roleや公開鍵などやっぱりそれなりに設定が必要です。

詳しくは以下を参照してください。
http://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-unixes.html


# まとめ

一番手っ取り早いのは、新しくgitを入れることだと思います。

正直な話、AWS CodeCommitはがっつり利用するにはまだまだ機能が足りてい無いと感じています。
ですが、その分今後に期待できると考えることもできます。

GithubやBitbucket等のgitリポジトリのホスティングとしては後発ですが、それらと機能の差がなくなりAWSとの連携に強みをもたせれば利用機会が増える可能性はありそうですね。

[参考]
http://docs.aws.amazon.com/codecommit/latest/userguide/troubleshooting.html#troubleshooting-macoshttps
GitHub 上の Middleman プロジェクトを GitHub Pages に自動デプロイ

# 概要
GitHub 上の Middleman プロジェクトを Wercker で追う．
コミット毎に Wercker 上で自動ビルドし，GitHub Pages に自動デプロイする．

つまり，Middleman プロジェクトにコミットするだけで変更が GitHub Pages に反映されるステキシステムを構築するお話．

# 前提
- Middleman プロジェクトを GitHub で管理している
- CI (継続的インテグレーション) には [Wercker](http://wercker.com/) を使います


# 手順
## GitHub 側の設定
### GitHub Pages のリポジトリを作成

リポジトリ名を _username_.github.io として新たにリポジトリを作成します．


### Middleman プロジェクトに `wercker.yml` を追加

Middleman プロジェクトのリポジトリのルートに `wercker.yml` を追加します．

```yaml:wercker.yml
box: ruby

build:
    steps:
        - script:
            name: fix nokogiri build
            code: bundle config build.nokogiri --use-system-libraries

        - bundle-install

        - script:
            name: install node
            code: |
                curl -sL https://deb.nodesource.com/setup_5.x | bash -
                apt-get install -y nodejs

        - script:
            name: build with middleman
            code: bundle exec middleman build --verbose

deploy:
    steps:
        - lukevivier/gh-pages:
            token: $GITHUB_TOKEN
            basedir: ./build
            repo: username/username.github.io
```

`repo: username/username.github.io` の `username` はプレースホルダです．

他のオプションについては https://github.com/lvivier/step-gh-pages を参照．


### アクセストークンを取得

Wercker から GitHub 上のプロジェクトにアクセスするためのトークンを取得します．
https://github.com/settings/tokens 
の Generate new token から権限を選択して Wercker 用のトークンを生成．


## Wercker の設定
### プロジェクトの登録

![スクリーンショット 2016-01-05 17.38.22.png](https://qiita-image-store.s3.amazonaws.com/0/95900/afbe05fe-a55a-f7bd-ccba-546bd1a25590.png)

Create Application で Wercker に GitHub プロジェクトを登録します．

1. Choose a Git provider
    - GitHub を選択します．
2. Select a repository
    - Middleman プロジェクトのリポジトリを指定します．
3. Configure access
    - リポジトリの内容に応じて推奨のアクセス方法が選ばれます．
4. Setup your wercker.yml
    - さっきリポジトリに追加した `wecker.yml` が妥当であれば特にすることはありません．
5. Awesome! You are all done!
    - おしまい．

### デプロイ先の設定

![スクリーンショット 2016-01-05 17.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/95900/157f2794-d618-5875-4217-98ed992666ac.png)

Application settings の Targets で，

- Deploy target name
    - _username_.github.io
- Auto deploy
    - master

を設定します．

ビルドが成功した場合に自動でデプロイする場合は auto deploy successful builds to branch(es) にチェックを入れてください．
チェックしなければ手動でデプロイすることになります．



### GitHub のアクセストークンを環境変数に追加

![スクリーンショット 2016-01-05 17.57.58.png](https://qiita-image-store.s3.amazonaws.com/0/95900/85ed3610-ebaa-eb65-2ccd-230c9e6a04ce.png)

Application settings の Environment variables で Add new variable．

変数名は `GITHUB_TOKEN`（`wercker.yml` の `token: $GITHUB_TOKEN` を参照のこと），テキストフィールドに GitHub のアクセストークンをペースト．
Protected のチェックボックスは入れた方がいいと思う．


# おしまい

Middleman リポジトリにコミットが送信されれば，自動的にビルドを行い，GitHub Page にデプロイされます．


# 参考
- http://qiita.com/shuhei/items/c295f061cba7b5f0d112
- http://devcenter.wercker.com/docs/steps/script-step.html
- http://stackoverflow.com/questions/9202324/execjs-could-not-find-a-javascript-runtime-but-execjs-and-therubyracer-are-in
- https://github.com/wercker/support/issues/161
CocoaPodsでOpenCV2.4を使う方法

##'list' file not found について
`pod install`して`import <opencv2/opencv.hpp>`してビルドだ！
あれ、何このエラー。

検索すると、
`#ifdef __cplusplus`で回避せよとの回答がたくさん出てくる。
出てきますが、Podの書き換えはダメですよね。どう考えても。

`#import <opencv2/opencv.hpp>`は、必ず`.mm`ファイルに書くようにしましょう。
いずれにせよ`Objective-C++`でないと使えないし…。

`.h`ファイルに書くと、`Bridging-Header.h`に書いた時にCのヘッダとしてコンパイルされるので上のエラーがまた出る。
Swiftで使いたいなら`.h`にはC++のコードはいれない。

勿論`Objective-C++`からしか呼ばないヘッダファイルならそこに書いてもOK。

##バージョンについて
結論から言うと`2.4.12.3`をつかう。
`pod install`するとビルドが走るのでめちゃめちゃ時間がかかるが、気長に待つ。
`pod install --verbose`すると進行していることはわかるので心臓に優しい。
`git clone`の進行状況も見せてほしいよなぁ、正直。

`2.4.10`まではバイナリ配付だが、`2.4.9`は`UIImageToMat`がオーバーリリースしており、何回か呼び出すと以下の様なエラーを吐いて落ちる。
[修正コミット](https://github.com/Itseez/opencv/commit/81c0537b0cb4b9babed80a8109342db7f169c064#diff-16ead42087c56ff45f34c50e33f1f9d4)

```
Assertion failed: (!space->is_singleton), function color_space_dealloc, file ColorSpaces/color-space.c, line 102.
```
修正コミットが`2.4.11`で反映されているっぽいのでそれ未満は論外だが、
`2.4.10`に関してはそもそも以下のエラーが出てビルドが通らない。
いい加減にして欲しい。
stackoverflowで修正コミットを投げてくれたらしい人がいた。多謝。
[そのstackoverlow](http://stackoverflow.com/questions/28331397/cocoapods-opencv-2-4-10-linker-error)

```
Undefined symbols for architecture arm64:
  "_jpeg_free_small", referenced from:
      _free_pool in opencv2(jmemmgr.o)
      _self_destruct in opencv2(jmemmgr.o)
  "_jpeg_mem_available", referenced from:
      _realize_virt_arrays in opencv2(jmemmgr.o)
  "_jpeg_free_large", referenced from:
      _free_pool in opencv2(jmemmgr.o)
  "_jpeg_open_backing_store", referenced from:
      _realize_virt_arrays in opencv2(jmemmgr.o)
  "_jpeg_get_large", referenced from:
      _alloc_large in opencv2(jmemmgr.o)
      _alloc_barray in opencv2(jmemmgr.o)
  "_jpeg_mem_term", referenced from:
      _jinit_memory_mgr in opencv2(jmemmgr.o)
      _self_destruct in opencv2(jmemmgr.o)
  "_jpeg_mem_init", referenced from:
      _jinit_memory_mgr in opencv2(jmemmgr.o)
  "_jpeg_get_small", referenced from:
      _jinit_memory_mgr in opencv2(jmemmgr.o)
      _alloc_small in opencv2(jmemmgr.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

`2.4.11`以降ならどうせビルド走るし、だったら最新で良いよね。という話。
`2.4.12`と`2.4.12.3`では現状問題は発生していない。
ゲーム開発のバランス調整の効率的な設計

ゲーム開発においてゲームのバランス調整は機能開発と同じくらい時間を使わなくていけない。
しかし実際にバランス調整に時間を取れる仕事は少ない・・・。

今回はそんな限られた時間の中で効率的にバランス調整を行うことが出来るようにする設計方法を紹介する。

##開発におけるバランス調整とは
バランス調整とはすなわちデータの数値を変更することである。
つまりデータの値を変更し、素早く反映できることがバランス調整を効率的に行えるということとなる。

##データの外部ファイル化
データはプログラムに直接書くのではなく外部ファイルとして扱い、プログラムでファイルを読み込んで使用するようにする。
外部ファイルにすることによるメリットは以下となる。

- 毎回コンパイルをする必要がない
- 作業を分担できる
- リリース後の更新が容易

###毎回コンパイルをする必要がない
データをプログラム内に直接配列などで記述した場合、データを書き換えるたびにコンパイルをする必要が出てしまう。
規模が大きいプロジェクトのコンパイルは今どきのPC性能であっても数分から数時間かかってしまうため非常に時間を取られてしまう。
ファイルにして読み込むことで不要なコンパイルをなくすことが出来る。

###作業を分担できる
プログラムソースに直接データを書き込んでしまうと複数人数による開発が困難となる。
各データごとに別ファイルにすることで複数の人数が同時に作業することが出来るため作業効率が上がる。

###リリース後の更新が容易
プラットフォームによるが、実行ファイルの更新に申請が必要で時間がかかることが多い。
それに対して、ファイルサーバにデータをアップしてダウンロードする仕組みがある場合
データの更新は即座に行えるため時間がかからない。

##データ管理のツールについて
扱うデータにもよるが、直接数値をいじるデータはExcelを使うのが好ましい。
Excelはソートや重複削除など数値の扱う機能が豊富であり、汎用的なツールであるため
使い方もネットで調べればいくらでも資料があるので、作業する人が入れ替わっても
ツールの扱いを覚えるのに無駄な時間をかけることが少なくなる。

##データの形式について
データファイルはテキストとバイナリの両方を扱えるシステムを構築しておくとよい。
開発時はテキストファイルで管理することでデバッグがしやすくなり
リリース時はバイナリにすることで圧縮や暗号化を掛けることができる。

##私のデータの管理方法について
マクロ組んでおき、保存するとExcel形式とcsv形式の両方が出力されるようにして
ゲームではcsvを読み込むようにする。(昨今ではJson形式で扱うところも多いのでマクロでJsonを吐き出すようにしても良い)
csvをバイナリ変換するツールも別途用意しておき、リリース時はcsvをバイナリ化して
ゲームに読み込ませる。

##プログラム側の処理
更新されたデータは素早く読み込めることが重要であるため、データが更新された場合
ゲームを再起動させるのではなく現在のシーンをリセットさせる機能を作っておくことが好ましい。
以前記述した[ゲーム開発におけるクラスの基礎設計](http://qiita.com/sawasaka/items/742fb262d10b3676b074)のInitializeがここで生きてくる。
シーンのInitializeを呼び出すボタンをゲーム内に作っておき、データを更新した後に
初期化ボタンを押せば更新されたデータをすぐに確認することが出来るため
効率の良いバランス調整が可能となる。
JAVA 関数オブジェクトの代入

__________________________________________________
<FONT color="#ff0000">■変数へのメソッド参照の格納</font>
メソッドがstaticの場合
**変数名 = クラス名 :: そのクラスの静的メソッド名**
メソッドが非staticの場合
**変数名 = インスタンス変数名 :: そのインスタンスのメソッド名**

__________________________________________________
<FONT color="#ff0000">■関数オブジェクトを格納可能な型</font>
**ある特定の引数と戻り値を持つ関数オブジェクトを格納できるのは、
その引数と戻り値を持つメソッド宣言を含んだSAMインタフェースの型**

<FONT color="#ff0000">SAMインタフェース</font>とは、
抽象メソッドを1つしか含まないインタフェースのこと


###IntBinaryOperator

java.util.function.IntBinaryOperatorとは

```java
public interface IntBinaryOperator {
	public abstract int applyAsInt(int left, int right);
}
```

▪️Test76.java メソッドがstaticの場合 例

```java
import java.util.function.IntBinaryOperator;

public class Test76 {
	public static int sub(int a, int b) {
		return a - b;
	}

	public static int cal(int x, int b) {
		x *= 2;// 6
		x += 3;// x=6+3→x=9
		return x;
	}

	public static void main(String[] args) {
		// subメソッドの処理ロジックを、変数funcに代入する
		// 代入されているのはsubメソッドへの参照
		IntBinaryOperator func = Test76::sub;

		// 変数funcに格納されている処理ロジックを引数5と3で実行する
		int a = func.applyAsInt(5, 3);
		System.out.println("5-3は" + a);

		IntBinaryOperator func2 = Test76::cal;
		int b = func2.applyAsInt(1, 0);
		System.out.println(b);
	}

}
```

▪️Test76.java 実行結果
5-3は2
5

▪️Test79.java 例2

```java
import java.util.function.*;

public class Test79 {
	public static int submethod(int a, int b) {
		return a - b;
	}

	public static void main(String[] args) {
		// submethodの処理を変数rrrに代入する
		IntBinaryOperator rrr = Test79::submethod;
		// 変数rrrに格納されている処理ロジックを引数9と2で実行
		System.out.println(rrr.applyAsInt(9, 2));
	}
}
```

▪️Test79.java 実行結果
7

##関数オブジェクトの代入
<FONT color="#ff0000">■変数に格納された関数の呼び出し</font>
**関数を格納した変数の名前 .SAM インタフェースのメソッド名(引数)**


▪️Test78.java

```java

public class Test78 {
	public static int sub(int a, int b) {
		return a - b;
	}

	public static void main(String[] args) {
		MyFunction aaa = Test78::sub;
　　　　//変数に格納された関数の呼び出し
		int num = aaa.call(15, 5);
		System.out.println("15-5は" + num);
	}

}
```

▪️MyFunction.java

```java
public interface MyFunction {
	public abstract int call(int x, int y);

}
```

▪️Test78.java 実行結果
15-5は10
Xamrin.Forms: MessagingCenter


- [Publish and Subscribe with MessagingCenter](https://developer.xamarin.com/guides/xamarin-forms/messaging-center/)
- [MVVM - Messenger and View Services in MVVM](https://msdn.microsoft.com/ja-jp/magazine/jj694937.aspx)
- [MVVM(Model View ViewModel)デザインパターンとData Bindingの参考URLメモ(2015-03時点)](http://hblog.glamenv-septzen.info/entry/2015/03/29/232520)
- [MVVM Light Toolkit](http://www.mvvmlight.net/)
- [MVVM Light Messenger](http://wpfapptutorial.com/mvvm-light-messenger) 

## Forms側にボタンを作ってタップしたらOS情報をラベルに記載

- ボタンがクリックされた時に `button_click` イベントを送信する
- サブスクライバに SetLabel を読んでもらう

~~~csharp
using System;

using Xamarin.Forms;

namespace PushNotification
{
  ///
  /// MainPage = new MainContent();
	public class MainContent : ContentPage
	{
		Label  _label = new Label();
		Button _button = new Button{ Text = "Tap Here"};

		public MainContent ()
		{
			Content = new StackLayout {
				Children = {
					_label, _button
				},        
				VerticalOptions = LayoutOptions.Center,
				HorizontalOptions = LayoutOptions.Center					
			};

			this._button.Clicked +=  (object sender, EventArgs e) =>
			{
				MessagingCenter.Send(this, "button_click");
			};
		}

		public void SetLabel(string msg){
			_label.Text = msg;
		}
	}
}
~~~

## サブスクライバ

- `button_click` をサブスクライブする
- MainContent.SetLabel(msg) でOS情報を渡す

### Android

~~~csharp
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

using Xamarin.Forms;

namespace PushNotification.Droid
{
	[Activity (Label = "PushNotification.Droid",
   Icon = "@drawable/icon", MainLauncher = true,
   ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
	public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
	{
		protected override void OnCreate (Bundle bundle)
		{
			base.OnCreate (bundle);

			global::Xamarin.Forms.Forms.Init (this, bundle);

			LoadApplication (new App ());

			MessagingCenter.Subscribe<MainContent> (this, "button_click", (content) => {
				content.SetLabel(string.Format("{0} {1}",
					Android.OS.Build.VERSION.Release,
					DateTime.Now.ToLongTimeString() ));
			});
		}
	}
}
~~~

### iOS

~~~csharp
using System;
using System.Collections.Generic;
using System.Linq;

using Foundation;
using UIKit;

using Xamarin.Forms;

namespace PushNotification.iOS
{
	[Register ("AppDelegate")]
	public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
	{
		public override bool FinishedLaunching (UIApplication app, NSDictionary options)
		{
			global::Xamarin.Forms.Forms.Init ();

			LoadApplication (new App ());

			MessagingCenter.Subscribe<MainContent> (this, "button_click", (content) => {
				content.SetLabel(string.Format("{0} {1}",
					new NSProcessInfo().OperatingSystemVersionString,
					DateTime.Now.ToLongTimeString() ));
			});

			return base.FinishedLaunching (app, options);
		}
	}
}
~~~
シングルクォートを含むテキストをshellに食わせるには

# やりたいこと

stringは改行やシングルクォート、マルチバイト文字を含むフリーテキスト。

```ruby
`echo #{string} | somecommand`
```

# 結論

```ruby
string.gsub(/'/, "'\\\\''") 
```

# 理屈

## Rubyによるシングルクォートのエスケープの罠

- http://d.hatena.ne.jp/rightgo09_ruby/20130121/p1

## shellでのシングルクォートのエスケープの罠

- http://d.hatena.ne.jp/tanakaBox/20070729/1185709167