OmniAICreator/Qiita-1.07M huggingface dataset:
[小ネタ]Spineでの１回転アニメーション設定の仕方

# はじめに
小ネタです。ボーンを１回転させる際の正しいキーフレームの打ち方についてです。
なお、記事を書いて時点で使用しているSpineのバージョンはSpine2.1.27 Essentialです。

# 時計回り？反時計回り？
(例によって)Flashであれば右回転するのか、左回転するのか、回転は何回するのか、というのをプロパティパネルで設定するのですが、Spineでそのような入力欄がみあたりません。Spineではキーフレーム間の移動距離が少ない方向に回転する、という仕様のみ存在するようです。それではという事で、0度と180度と0度でキーフレームを打つ(=合間のキーフレームが１つ)と、左に半回転した後に右に半回転してアニメーションになってしまいます。

![スクリーンショット 2015-10-17 16.21.04.png](https://qiita-image-store.s3.amazonaws.com/0/8302/b6cbca45-90fe-eda1-7a43-8d59a23430e5.png)
_合間のキーフレームが1つの場合、意図した１回転をせず、左右に半回転ずつ動く_

# 正解は合間のキーフレームを２つ打つ

正しいキーフレームの打ち方は0度→120度→240度→0度と、120度刻みにキーフレームを打つ感じになります。どうも面倒なのですが、公式のチュートリアルビデオでもこのようにするように指示されていますので、これで正解です。

![スクリーンショット 2015-10-17 16.45.25.png](https://qiita-image-store.s3.amazonaws.com/0/8302/c3619a4a-ee6e-80b9-af70-433dbbe4be2d.png)
_この例では、face部のrotationが90度→210度→330度→90度と設定されている_

# 終わりに

ちょっと面倒くさいですね。トゥイーンにカスタムで重みをつける場合など、余計なキーフレームがあるとやりずらいので、直して欲しいところではあります。

今回の動画 https://twitter.com/harayoki/status/655419018598158337
![manmaru-animation_5.png](https://qiita-image-store.s3.amazonaws.com/0/8302/c7068a64-cda7-1543-b365-1eef03a012c4.png)![manmaru-animation_15.png](https://qiita-image-store.s3.amazonaws.com/0/8302/c8412bd2-65e7-b228-eaf3-744057f08684.png)![manmaru-animation_34.png](https://qiita-image-store.s3.amazonaws.com/0/8302/c8a9b6c0-4820-465f-2177-fd2a4214c27f.png)
Pure JavascriptでWebカメラの画像からGifアニメーションを作成してみる

Pure javascriptでやる必要ないかもしれませんが、やってみました。

このライブラリを使ってみました。
https://github.com/antimatter15/jsgif

完成系はこちらをご参照ください。Webカメラ必須です。
http://jsfiddle.net/eb4kzjgg/

動作仕様としては、「Start to record」をクリックして「End recording」クリックするまでの間を
一定インターバルでWebカメラの画像を取得して、Gifアニメーションとして吐き出します。

ポイントだけ書いておきます。
##必要なライブラリ
この4つが必要なので、インポートしておきます。（jsfiddleではコピペっちゃいました）
https://github.com/antimatter15/jsgif/blob/master/b64.js
https://github.com/antimatter15/jsgif/blob/master/NeuQuant.js
https://github.com/antimatter15/jsgif/blob/master/LZWEncoder.js
https://github.com/antimatter15/jsgif/blob/master/GIFEncoder.js

##必要なHtml
######videoでWebカメラの内容を表示します。
######canvasはエンコーダに突っ込むために一時的に変換するためなので非表示にします。
```html
<video id="video" style="display:none;" autoplay></video>
<button id="button">Start to record</button>
<img id="image" src="">
<canvas id="canvas" style="display:none;"></canvas>
```

##Webカメラの初期化
######Webカメラのstreamをvideo要素に突っ込んで表示させます。
```js
// ブラウザ差分吸収
navigator.getUserMedia = ( navigator.getUserMedia ||
                       navigator.webkitGetUserMedia ||
                       navigator.mozGetUserMedia ||
                       navigator.msGetUserMedia);
navigator.getUserMedia({video: true}, function(stream) {
  $video.src = window.URL.createObjectURL(stream);
  localMediaStream = stream;
}, function() {
    console.error('error');
});
```

###録画開始
######エンコーダを初期化して、Webカメラのstreamを一定間隔でエンコーダにcanvasを介して渡します
```js
function start() {
    $button.text("End recording");
    recording = true;
    $('#dl_container').empty();
    // encoderの初期化
    encoder = new GIFEncoder();
    encoder.setRepeat(0);
	encoder.setDelay(100);
	encoder.setSize(WIDTH,HEIGHT);
	encoder.start();
    // 一定間隔でvideo->canvas->encoder
    timer = setInterval(function() {
        ctx.drawImage($video, 0, 0, WIDTH, HEIGHT);
        encoder.addFrame(ctx);
    }, 100);
};
```

###録画終了
######例外処理が雑すぎますが、エンコーダからbinaryデータを受け取って、base64形式に変換して表示させています。
```js
function end() {
    $button.text("Start to record");
    recording = false;
    clearInterval(timer);
    if (localMediaStream) {
        encoder.finish();
        var binary_gif = encoder.stream().getData();
        var data_url = 'data:image/gif;base64,'+encode64(binary_gif);
        $image.src = data_url;
        
        // make link
        var a = document.createElement("a");
        a.download = 'webCamRecord.gif';
        a.title = "download recorded gif";
        a.text = "download recorded gif";
        a.href = data_url;
        $('#dl_container').append(a);
    }
};
```
Xcode7.0にしたらYou must rebuild it with bitcode enabledで怒られた

Xcode7.0にてアプリを実機でビルドしようとしたところ以下のエラーが出てビルドに失敗した。

```
ld: '/Users/kazuhiro/Library/Developer/Xcode/DerivedData/HelloWorld-dwlrfcbnvejmrzelysrjowhnukpx/Build/Products/Debug-iphoneos/libcocos2d iOS.a(ftbase.ios8_arm64.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

#解決方法
iOS9から追加されておりデフォルト有効なのでBuld settingのEnable bitcodeを無効にしたことで問題なく起動できました。

![スクリーンショット 2015-10-18 0.38.44.png](https://qiita-image-store.s3.amazonaws.com/0/96091/2abf3bc3-0ae2-9fd5-9d81-999c7c4fb5f3.png)

#LLVMビットコードとは
LLVMビットコードはJavaでいう中間コードに相当するものであり、それぞれのプラットフォームに依存しない言語で書かれているもの

今後AppleWatchなどのウェアラブル端末などアーキテクチャが変わっても提供元がデベロッパーによるバイナリの再提出しなくてもよい仕組みのようですね。

https://developer.apple.com/library/watchos/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html

そういえばこないだ行った勉強会でwatch0S向けの話でbitcodeの話出てきたけど、Xcode6.4を使い続けてたので特に気にしてなかった

http://eventdots.jp/event/571250
renameコマンドなんて今まで使ったことないけど、使えるのか？



## jpegをjpgに一括変更（rename jpeg jpg *）
```sh
$ ls -1
01.jpeg
02.jpeg
03.jpeg
04.jpeg
05.jpeg

$ rename jpeg jpg *
$ ls -1
01.jpg
02.jpg
03.jpg
04.jpg
05.jpg
```

##先頭に文字列'photo'をつけてみる（rename '' photo *）
```sh
$ ls -1
01.jpeg
02.jpeg
03.jpeg
04.jpeg
05.jpeg
$ rename '' photo *
$ ls -1
photo01.jpg
photo02.jpg
photo03.jpg
photo04.jpg
photo05.jpg
```

##やっぱ'photo'を取ってみる（rename photo '' *）
```sh
$ ls -1
photo01.jpeg
photo02.jpeg
photo03.jpeg
photo04.jpeg
photo05.jpeg
$ rename photo '' *
$ ls -1
01.jpg
02.jpg
03.jpg
04.jpg
05.jpg
```

---

<実行環境>
CentOS release 6.3 (Final)

<バージョン>

```sh
$ rename --version
rename (util-linux-ng 2.17.2)
$ rename --help
call: rename from to files...
```
<コメント>
- renameコマンドには2種類あって正規表現の使えるものがあるらしいが標準で入っているものはおそらくこちら
- 末尾に文字列を足したりは試した限りできなかった
- バックアップを取ってから実施したほうが吉
Code For Kobe #9


内容は [Code for Kobe github wiki](https://github.com/codeforkobe/codeforkobe.github.io/wiki) に集約しました。こちらにあるのはコピーです。
------
2015-10-15
第9回Code for Kobe定例ミーティング
https://www.facebook.com/events/918344001579869/

agenda

1. 枚方Call9紹介（板谷さん）
2. ｸﾙﾏ情報とオープンデータ（トヨタIT開発藤井さん）
3. CodeforKobeのWEBについて（川井さん）
4. Markdown＆Githubハンズオン（大山さん）
5. ITフェスからのご連絡
6. 調整中
7. その他
8. 連絡事項等


枚方call9の開発について
-----------------------
http://call9.net/ 板谷さん

opendata の利活用
開発のきっかけ：枚方公済病院の薮技師のかたがAED SOSを取り上げていた。
現場的に「ちょっと違う感」があったらしい。これを解消してみた。
アプリ単体でどうこうというより、救命講習会などを通じて普及を広めたい。
http://yaplog.jp/hirakatakousai/archive/1179

非起動状態でも周囲からの通知を受け取れる仕組み。
iBeacon を使って、通知できるように。
hop by hop で信号を伝搬させるようにした。

「AEDを運ぶ」より「人を集める」ことに注力する。
AED を持ってくること以外にもやることがたくさんある。

「eメール119番」での通報の構想はあったけれども実装されず。

枚方市行政方面への営業活動もした。

課題
- iOSのみ対応
- 普及

勘違いされやすいけれど、枚方市以外でも使えます。


データ駆動イノベーションを推進していくための勉強会
--------------------------------------------------
トヨタ IT 開発センター 藤井さん

車両からのデータをクラウドに保存して API 提供する。
ハッカソン用試作Web API
"Toyota hackcars days 2015" というイベント

静岡の事例
「しずみちinfo」というものを作っているけれど、アクセスが来ない。
API 化してもらった

しずみちinfoとトヨタのAPIをmash upしてアプリ（ナビ）で使うことを考えている。

mash up する上で API の語彙の標準化をしていきたい。


Code for Kobe web pages
-----------------------
私（議事録係・川井）が話していたので、議事録的なものはありませんが、
内容はスライドに沿ったものなので、こちらを参照していただければ：
https://speakerdeck.com/kwi/code-for-kobe-github-web-pages

[「第９回Code for Kobe定例ミーティング」に参加したよ！登録](https://www.codeforamerica.org/brigade/Code-for-Kobe/checkin?event=第９回Code for Kobe定例ミーティング) 使ってみましょう！

その他
------
兵庫県『ＩＣＴ戦略の県民意識調査アンケート』回答お願いします！！
http://web.pref.hyogo.lg.jp/kk26/johoseisaku/hyogo_ict/index.html
jqueryイベント付与の順番

<h1>DOMの読み込みとイベント付与の順番について</h1>


以前、とあるテキストボックスにblurイベントを付与しようとした際、動かなくて
ハマったので。

```
$(function(){
    $('#hogehoge').blur(function(){
        if($('#txthoge').val() == ''){
            alert('空欄です');
            return;
        };
    });
});
```

みたいな物を入れていたのですが
肝心なtxthogeのフォーカスアウトで動かないと…

実はこのtxthogeというテキストボックスは
とある処理の後に作成したものなんですね。

```
function CreatHoge(){
    var Html = '';
    Html = '< input type = "text" id = "txthoge" >'
    $('#btnhoge').append(Html)
};
```

っで肝心のblurの処理自体はload時に読み込んでいるのですが
この段階でtxthogeが存在してないのでイベント付与出来なかったんですよね。


この場合、txthogeを入れた後にblur処理を入れると解決します。

```
function CreatHoge(){
//txthoge追加
    var Html = '';
    Html = '< input type = "text" id = "txthoge" >'
    $('#btnhoge').append(Html)

\\blur処理
    $('#hogehoge').blur(function(){
        if($('#txthoge').val() == ''){
            alert('空欄です');
            return;
        };
    });
};
```

こうしてやるとtxthogeのDOMが生成された後に
イベント付与という流れなので動きます。



新人プログラマーからでした。
Grailsのspring-security-coreプラグインがデフォルトでパスワードにBCryptハッシュを使うようになって気をつけないとハマるところ

# spring-security-core 3.0.0.M1 https://bintray.com/grails/plugins/org.grails.plugins%3Aspring-security-core/view

```groovy
compile ":spring-security-core:3.0.0.M1"
```

Grails 3.0.8 + spring-security-core 3.0.0.M1 でプロダクトコード作ってて、spring-security-coreのデフォルトハッシュアルゴリズムがSHA256からBCrypt(Blowfishとも)に変わったことで気をつけないとハマりそうなのでここに残します。

みなさんもう既にご存知かとは思いますが、spring-security-coreプラグインはGrailsで作ったアプリに入れるだけでログイン画面やユーザ/ロール管理やアクセス制御が簡単にできちゃう超イケてるプラグインです。Grailsは3.0からSpringBootベースになったので、それに対応してspring-security-coreプラグインも3.0化されてます。今日はそれの話。

SHAファミリでは[ソルトとストレッチングを](http://yamkazu.hatenablog.com/entry/2013/06/02/180611)[自力で面倒見る必要がありました](https://github.com/yamkazu/grails-samples/blob/master/spring-security-salt-stretching/README.md)が、BCryptは[それ自体がソルトとストレッチングの仕組みを持っている](http://tech-blog.tsukaby.com/archives/704)ので、デフォルトでBCryptを使うこと自体は大変喜ばしいことです。

が、

```groovy
grails.plugin.springsecurity.password.algorithm = 'bcrypt'
```

のときにSHAファミリと同じ気分で

```groovy
springSecurityService.encodePassword("mypassword") == springSecurityService.encodePassword("mypassword")
```

を試しても成り立たない。ｳｪｯ!?ってなる人いそうですが、アルゴリズム自体が[パスワードエンコードの際に乱数でソルトを生成して毎回異なるハッシュを生成する](http://www.kamiya54.info/post/100503173956/bcryptblowfish%E6%9A%97%E5%8F%B7%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%AA%BF%E3%81%B9%E3%81%9F%E3%81%AE%E3%81%A7%E6%96%87%E6%9B%B8%E5%8C%96%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F)ものですので、当たり前っちゃ当たり前ですね。

で、[SpringSecurityの org.springframework.security.crypto.password.PasswordEncoder インタフェース](http://docs.spring.io/autorepo/docs/spring-security/3.2.8.RELEASE/apidocs/org/springframework/security/crypto/password/PasswordEncoder.html)に `matches()` メソッドがある！これ使えばいいやん！と思うと…

```groovy
springSecurityService.passwordEncoder.matches("mypassword",userDomain.password)
```

そんな **メソッドはねえ！** って怒られますね。マジか。どうしたら。

**A. `isPasswordValid()` メソッドを使います。**

```groovy
springSecurityService.passwordEncoder.isPasswordValid(userDomain.password,"mypassword",null)
```

第三引数はソルトを指定するものですが、BCryptではソルトがハッシュに埋め込まれているので、常時nullでOKです。

[spring-security-coreプラグインのドキュメント](https://grails-plugins.github.io/grails-spring-security-core/guide/single.html)を見ても、 `isPasswordValid()` を使ってくれ的な解説は無いんですが、 `passwordEncoder` の実体が[ `CryptoEncoderWrapper` ](https://github.com/grails-plugins/grails-spring-security-core/blob/master/src/main/groovy/grails/plugin/springsecurity/CryptoEncoderWrapper.groovy
)なので、 `isPasswordValid()` メソッドを使う形になってるんですよね。そしてSpringSecurityにも [org.springframework.security.authentication.encoding.PasswordEncoder インタフェース](http://docs.spring.io/autorepo/docs/spring-security/3.2.8.RELEASE/apidocs/org/springframework/security/authentication/encoding/PasswordEncoder.html)の方は `isPasswordValid()` メソッドで実装されてた。

SpringSecurityのつくりそのまま、だからプラグインの方にはドキュメントに書かれてないんでしょうね。
fleetctl 使用時の注意点

# fleetctl を使用する際の注意点


**fleetサービスはetcd(ver1/2)において稼働する、cluster / proxyに対して、systemdの操作を簡易的に行える大変素晴らしいサービスです！**

ただある設定が抜けていたり、etcd（クラスタ）が不調な場合、fleetctlからsystemdの登録ができないなどの事象が発生します。

では早速、自分のPC中で行っている設定を公開いたします。

## fleetctl 基本登録について

通常は以下のようなコマンドを叩いて、Unitサービスを登録していきます。

```shell-session:fleet
fleetctl --tunnel 192.168.0.10 submit nginx-web@1 # systemdファイルを配置しますよ！
fleetctl --tunnel 192.168.0.10 load nginx-web@1 # chkconfigでいう 起動時onの設定にしますよ！
fleetctl --tunnel 192.168.0.10 start nginx-web@1 # systemdを起動しますよ！

```

ここで出てくるのがtunnelのclusterのIP指定。これが煩わしく、私の.bash_profileには以下の設定を埋め込んでいます。

```shell-session:.bash_profile
eval "$(rbenv init -)" #ssh-addコマンド失敗をさけるため、evalチェックします。
ssh-add ~/.ssh/id_rsa #鍵情報を先に読み込みます
export FLEETCTL_SSH_USERNAME=core #fleetctlを動作させる時のuser名を指定します。
export FLEETCTL_TUNNEL=192.168.0.10 #--tunnelのIPを指定します。
```

上記のように設定し、下記のように読み込めば、煩わしい設定が不要になります。

` $ source ~/.bash_profile `

```shell-session:fleet
fleetctl submit nginx-web@1
fleetctl load nginx-web@1
fleetctl start nginx-web@1
```
あら、タイピング量が減って楽ですね。

**但し！気をつけないといけないのが、「export FLEETCTL_TUNNEL=192.168.0.10」として固定していること**

万一、192.168.0.10のサービスが完全ダウンしてしまうと、fleetctlコマンドが効かなくなってしまいます。

その場合は改めて、clusterのほかIPアドレスをFLEETCTL_TUNNELの環境変数に登録してください。

### 前回記事ご紹介：

[【CoreOS】冗長化構成　Keepalived+NginxLB+NginxWEB(完)](http://qiita.com/xshsaku/items/94c914df2df87e8c6965)
[【CoreOS】冗長化構成　Keepalived+NginxLB+NginxWEB(1)](http://qiita.com/xshsaku/items/c3e2fe12d60fc9535b8b)
[【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB](http://qiita.com/xshsaku/items/e9d13563e0e523def2db)
[【CoreOS】cloud-config解説〜インストール](http://qiita.com/xshsaku/items/1ba3f930ff80bef685a6)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)](http://qiita.com/xshsaku/items/5be3837c39bb8c9bd4e7)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)](http://qiita.com/xshsaku/items/a5b57fafa0b41740bd7f)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)](http://qiita.com/xshsaku/items/3b1c92a60f3d7e401061)
$(function(){　〜　}でスクリプトを囲む意味



以下のようなソースコードがある。

```
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Setup Example</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-3.3.0.js"></script>


  <script>
  $(function(){
    var myViewModel = {
      course:'Knockout',
      author:'Ayad'
    };
    ko.applyBindings(myViewModel);
  });
  </script>
</head>
<body>
  <div>
    The course <u><span data-bind="text: course"></span></u> will be taught <body>
      <b><span data-bind="text: author"></span></b>
    </div>
    </body>
</body>
```

knockout jsのコードであるが、なぜ、knockout jsのコードを

```
$(function(){

}
```

で囲むのだろうか。
それは、エラーを検出しやすくするためである。例えば

```
ko.applyBindings(myViewModel);
```

のコードを以下のようにしてみよう

```
koo.applyBindings(myViewModel);
```

そうなると、Chromeの「表示」→「開発/管理」→「JavaScriptコンソール」で調べてみると、以下のようなエラーが出てくる

```
Uncaught ReferenceError: koo is not defined
```

では

```
$(function(){

}
```

この囲みをコメントアウトしてみると、このエラーが出たり、出なくてリロードができなかったりする。

http://webkaru.net/jquery/ready-function/

このサイトによれば、

```
$(function(){

}
```

は、ドキュメントが読み終わった後に実行されるらしい。つまるところ、knockout jsのスクリプトはHTMLが読み終わった後に実行しなければならないことになる。
【Ruby】理論的には無限桁の乗算が可能な計算機

学生プログラマのdrumathです。
拙いコードなのでぜひ、改善策をご教授ください。

# 打倒、オーバーフロー
私はCでアルゴリズムを書くのが趣味なのですが、ある中学2年生のころ、フィボナッチ数列のアルゴリズムを完成させ、いざ、無限ループでどこまでいけるかチャレンジ！となったとき、そのプログラムはほんの数秒でオーバーフロー。あの時の思いは忘れません。もっと数字が流れるような様を見たかった･･･｡あれから2年が経ち、Rubyに出会ってから配列操作の簡単さにまざまざと感じていました。
こんなに便利な配列です。これを使って計算機を作ってみたい！

# なぜ。。。
Rubyの計算能力は破壊的で、99の10000乗とかフツーにこなせます。だから今回のような計算機はほとんど出る幕なんてありません。しかしRubyにも限界がありますのでもしそんなことはないとしても、なんとなく作りたくなってしまったというのが今の気持ちです。（実際作ってるときにインタラクティブRubyで2の1000乗を計算できたのにすごく驚きました。）

# プログラム
さて問題のコードを下に示します。

```rb:kakezan.rb
class Kake
  # Multiplication program
  def multi(num1,num2)
    num1=num1.split("")
    num2=num2.split("")
    num1=trance(num1)
    num2=trance(num2)
    result=Array.new
    result=[]

    num1.each_index { |i|
      num2.each_index { |j|
        if result[i+j]==nil then
          result<<num1[i]*num2[j]
        else
          result[i+j]=result[i+j]+num1[i]*num2[j]

        end
      }
    }
    result=analysis(result)

    return result
  end
  def trance(str_list)
    str_list.each_index { |i|
      str_list[i]=str_list[i].ord-48
    }
    return str_list
  end
  def analysis(result_list)
    result_list.each_index { |i|
      a=-(i+1)
      if result_list[a]>9
        if i+1==result_list.length then
          tmp=result_list[a]/10
          result_list[a]=result_list[a]%10
          result_list.unshift(tmp)
        else
          tmp=result_list[a]/10
          result_list[a]=result_list[a]%10
          result_list[a-1]+=tmp
        end
      end
    }
    return result_list
  end
end

tra=Kake.new
print "result>>",(tra.multi(ARGV[0],ARGV[1])).join

```
実行例

```
ruby  kakezan.rb 13516851651351651516516581651651658165165165865165 651685468165165165869846151
result>>8808735796530186896147617621731013277207962534877197442328986784315360229915
```

# 今後の展望
今後、累乗についてのメソッドもまとめ、割り算のクラスも作ってπの計算とかに役立てたいなと思います。
最後まで読んでいただいた方、ありがとうございました。
よろしければコメントも残していただけると嬉しいです。
iOS 9 の“通知画面からその場で返信”機能について

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/96984/488658d7-8778-6f05-3016-e0c81fcc2f0c.png)


もともとは、iOS 標準の“メッセージ”アプリのみ利用可能だった**通知からその場で返信**機能。iOS 9 では、サードパーティのアプリでもAPIが開放され、上のスクリーンショットのように通知センターの通知からすぐ返信画面を表示することができるようになっています。

キーワードはこれ。**```UIUserNotificationActionBehaviorTextInput```**。

```objc
UIMutableUserNotificationAction *replyAction = [[UIMutableUserNotificationAction alloc] init];
replyAction.title = @"返信";
replyAction.activationMode = UIUserNotificationActivationModeBackground;
replyAction.authenticationRequired = YES;
replyAction.identifier = @"replyAction";
replyAction.behavior = UIUserNotificationActionBehaviorTextInput; // これです

UIMutableUserNotificationCategory *category = [[UIMutableUserNotificationCategory alloc] init];
category.identifier = @"category_reply";
[category setActions:@[replyAction] forContext:UIUserNotificationActionContextDefault];
.
.
.
```

```UIMutableUserNotificationAction``` に新しいプロパティ **```behavior```** が新たに追加されたんですね。

また、テキストを入力した後、“送信”ボタンが押された時の処理についてですが、例えばローカル通知の場合、（選択肢のタップなど）通知から何かアクションがあると以下の様なメソッドが実行されます。

```objc:AppDelegate.m
- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
      forLocalNotification:(UILocalNotification *)notification 
          withResponseInfo:(NSDictionary *)responseInfo // 新たに追加
         completionHandler:(void (^)())completionHandler {

    // 処理
    // ちなみに Remote Notification でも同様に withResponseInfo という引数が使える

}
```

この**```responseInfo```**にテキストが格納されています。テキストを取り出すには、

```objc
[responseInfo objectForKey:UIUserNotificationActionResponseTypedTextKey]
```

でテキストを取り出せます。

**ちなみに：**返信画面で、画面がロックされるまで放置すると、返信画面がまるまる消えてしまい、それまで入力した文章が全部失われるようです。文章構成をゆっくり考えていて、気づくと全部消えてしまったなんて悲劇（※実話）が……。

とはいえ、使う側にとっては楽な機能なのでメッセージ系のアプリはいち早く対応して欲しいですね。
nw.js vs atom shell


标签（空格分隔）： nodejs

---

发现很久之前就已经开始用这些工具: 如` Cmd markdown`, `Kobito` 等在各个平台上都支持markdown 写作的客户端, 而刚开始在惊讶于他们的易用性的同时,却极少的关注他们到底是怎么实现的, 而最近突然有意的注意到了在刚启动这些客户端的时候,会在各自 UI 的左上角显示如` node webkit` 或者` atom shell` 的东西. 而在稍微玩一下他们的来历,是啥么圣器的时候, 就发现原来他们已经出现很久了, 而且他们的作者也是很早之前就在网上有见到,而且还是经常回去读他们的博客啊什么的. 特别是后来的` atom shell` 的[主力开发者 ](http://cheng.guru/about ) 很久就读到了他的博文, 挺牛逼的年轻人.

而这些在2011年底就已经发生了, `node-webkit` 作为鼻祖它由一个国内 intel 哪里 的牛人的 side project 到后来可以全身心来写这个, 之后又出现了后者` atom shell` 他作为实习生可以和鼻祖作者一起贡献发展 nodewebkit, 再后来 github 要做 atom, 实习生就变成了 github 哪里的第一个中国人员工,然后开始了新的 atom shell 的开发, 这样就在这个技术领域里出了类似2个这样的很棒的库和框架. 而且他们都是国内 it 圈子里兴起的, 有点意思.

而在不到三年的时间里, 各路也是有很大的发展, 他们各自都已经改了名字. 也是逐渐明确了方向, 都是很不错的开源项目.

参考:
1. http://nwjs.io/
2. http://electron.atom.io/
2. http://cheng.guru/about/
3. http://segmentfault.com/a/1190000000498344
4. https://speakerdeck.com/zcbenz/practice-on-embedding-node-dot-js-into-atom-editor
5. https://xitu.io/622
6. http://blog.iwege.com/posts/atom-shell-vs-node-webkit.html
技術学習の分類とそれについての雑感


雑記です。
自分の経験から、技術の学習は次の3つに分類できると考えた。

1. ハウツー系学習
2. 基礎知識・仕組みの学習
3. アウトプット系学習

それぞれにメリット・デメリットがあって、バランス良くやっていけるのが一番良いと思ったので、そのあたりについて整理してみた（すでに言い尽くされている感もあるが..）。

## それぞれの学習の特徴・性質について
### 1. ハウツー系学習
- とは
  - 主に「◯◯の使い方」系の学習
- 例
  - Ruby On Railsの使い方
  - RSpecの書き方
  - 綺麗なコードの書き方
- 特徴・性質
  - 実践・業務ですぐに活かせる
  - 短期的なコスパが高い

### 2. 基礎知識・仕組みの学習
- とは
  - ある技術の基礎知識、あるいはその仕組みについての学習
- 例
  - アルゴリズムとデータ構造
  - コンピュータシステムの仕組み
  - Ruby On Railsの動く仕組み（コードリーディング）
  - TCP/IP
- 特徴・性質
  - すぐに何かに活きるということは少ない
  - 往々にして低レイヤの領域になる気がする
  - 長期的なコスパが大きい

### 3. アウトプット系学習
- とは
  - ハウツーや持っている知識を何らかのカタチにする
  - 「学習」という感じではないかも
- 例
  - コードを書く
  - RubyGems（ライブラリ）を作る
  - Webアプリを開発する
  - iPhoneアプリを開発する
- 特徴・性質
  - ハウツー系学習と基礎知識学習を経た上で行うと効果が高い気がする
  - むしろ、ハウツーまたは基礎知識が無いと厳しく、Google検索をしてコピペ、みたいなただの作業になる
  - これをやることで知識やノウハウが身につく

## バランスが必要？
- どのカテゴリの学習もバランスよくやるのが良いのだと思う
  - ハウツーが無いと業務をこなせない
  - ハウツーがあるだけで、目の前の仕事は片付く（かもしれない）
  - 基礎・仕組みを知らないと詰まったときに途方に暮れる
  - 基礎・仕組みを知っていると応用がきく
  - アウトプットがないと、ハウツーや基礎知識が身にならない
- が、バランスをとるのってなかなか難しい
- ITエンジニアとして成長するために、あえて優先度をつけるのであれば3 >= 2 > 1の優先度で学習するのが良いのではないか
  - 理由：アウトプットをしていると疑問に思うことやその内部を知りたくなってくる。そういう内発的な動機があれば、続く2や1の学習効率が向上するため。
  - 理由2：目に見えるアウトプットはその人の市場価値を高める。
  - ただしアウトプットをするために、ある程度のハウツー・基礎知識は必要

## ハウツー系だけやっているのはリスクが高い
- ハウツーは、対象のツール、ライブラリ、手法の流行り廃りに影響を受けてしまう
- 「（コード読んでないので仕組みは全然知らないけど）Ruby On Rails使えます。」では、Ruby On Railsがもし衰退したら一気にその人の価値が下がってしまうかも..
- （半分イメージだけど）ITベンチャーのようなあまり時間的な余裕が無く、常に明確な成果を求められる環境では、ハウツー系の学習に終始してしまいなかなか基礎知識や仕組みの学習をする時間をとれない気がする
- ハウツーしかないと、延々とググる作業にハマることが多い。つらい。

## その他雑感
- 基礎知識・仕組みの学習は、内容的に難しいことも多い上、学んだことがすぐに活かせないのでおろそかになりがち。だけれども、ここの学習は長い目で絶対活きてくると思う。
- 定期的に、基礎・仕組みの学習を大切にしろ、という記事がバズっている気がする。そういうことを気にしている人はきっと多いんだろう・・（自分も大抵見る）
- **こんなこと考えている暇があるならなんかやれ**

## 参考リンク
- [今すぐ辞めて欲しい、「Ruby on Rails勉強してます」「CakePHP勉強してます」 | sumyapp](http://blog.sumyapp.com/2013/07/no-recommend-rails/)
- [新井俊一のソフトウェアビジネスブログ: 流行のIT技術を追うのをやめたらプログラマとして成長した話](http://shunichi-arai.blogspot.jp/2015/07/it.html)
- [エンジニアにとっての地方と東京 ─ あるいはエンジニアのキャリア形成に環境が与える影響について // Speaker Deck](https://speakerdeck.com/naoya/enzinianitotutefalsedi-fang-todong-jing-nil-aruihaenziniafalsekiyariaxing-cheng-nihuan-jing-gayu-eruying-xiang-nituite)
- [Software Design 2015年7月号 > スペシャリストになる方法（奥野さんの記事）｜技術評論社](http://gihyo.jp/magazine/SD/archive/2015/201507)
[wordpress] ローカルに開発環境構築したら管理画面にログインできないんだけどどうすればいいの

何回「ｋｓｇ」という言葉を叫んだことでしょう。。。

# 結論

```php:wp-config.php
define('COOKIE_DOMAIN', '');
```

# 詳細
## ログインできない！！

既に本番環境はあったのですが、mac に WordPress(v3.9) の開発環境を構築しようとした時の事です。
ええ・・・管理画面にログインできないのです。

![ログインできない.png](https://qiita-image-store.s3.amazonaws.com/0/8963/e01421fd-b44e-0f53-903f-7f0d52e2aa89.png)

もうね、「お使いのブラウザは Cookie をブロックしているか、Cookie に対応していません。WordPress を使うには Cookie を有効にする必要があります。」の一点張りですよ。

エラーメッセージで探しても、
・ブラウザのコンテンツとキャッシュを削除しろ
・ブラウザの Cookie を有効にして
・ブラウザ変えてやってみて
・plugin を無効化しろ（`$ mv wp-content/plugins wp-content/_plugins` )
・`functions.php` を無効化しろ （`$ mv wp-content/theme/xxx/functions.php wp-content/theme/xxx_functions.php` )
・`functions.php` 内の空白を削除しろ
・`DOMAIN_CURRENT_SITE` が昔のドメインだった
・ DBユーザのドメインが違う
・ `RELOCATE` を設定しろ
・ ログイン画面を再作成しろ(?)
・ IEクソ

などなど・・・試してみるけど、何やってもダメ！全然だめ！！直らない。。。

そこで仕方なくソースから紐解いてみることに。

## ソースを読み解く

```php:wp-login.php
 if ( empty( $_COOKIE[ LOGGED_IN_COOKIE ] ) ) {
   if ( headers_sent() ) {
     $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked due to unexpected output. For help, please see <a href="%1$s">this documentation</a> or try     the <a href="%2$s">support forums</a>.' ),
       __( 'http://codex.wordpress.org/Cookies' ), __( 'https://wordpress.org/support/' ) ) );
   } elseif ( isset( $_POST['testcookie'] ) && empty( $_COOKIE[ TEST_COOKIE ] ) ) {
     // If cookies are disabled we can't log in even with a valid user+pass
     $user = new WP_Error( 'test_cookie', sprintf( __( '<strong>ERROR</strong>: Cookies are blocked or not supported by your browser. You must <a href="%s">enable cookies</a> to use WordPress.    ' ),
       __( 'http://codex.wordpress.org/Cookies' ) ) );
   }
 }
```

エラーから探してみると、どうやらこの `wp-login.php` の `$_COOKIE[LOGGED_IN_COOKIE]` が空の模様。なるほど。
じゃあこれは何処でセットしてるかというと、`wp-includes/pluggable.php` の中。

```php:wp-includes/pluggable.php
 setcookie($auth_cookie_name, $auth_cookie, $expire, PLUGINS_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);
 setcookie($auth_cookie_name, $auth_cookie, $expire, ADMIN_COOKIE_PATH, COOKIE_DOMAIN, $secure, true);
 setcookie(LOGGED_IN_COOKIE, $logged_in_cookie, $expire, COOKIEPATH, COOKIE_DOMAIN, $secure_logged_in_cookie, true);
```

ですが、、デバッグしてみた所、どうやら COOKIE はセットできている（サーバ側は成功したと言っている）模様。
※ `setcookie` は COOKIE がセットできたら `true` を返してくれる

実際、response-header を見るとちゃんと `Set-Cookie` は返ってきている。
なのに、chrome のデベロッパーツール上に COOKIE は作成されていない？？これはいかに？


## 解決


http://stackoverflow.com/questions/1134290/cookies-on-localhost-with-explicit-domain
> when working on localhost (!) the cookie-domain must be set to "" or NULL or FALSE instead of "localhost"

`localhost` の COOKIE を設定する時は、`COOKIE_DOMAIN` を `""` か `NULL` にすればいいらしい。。知らなかった。。情弱ですいませんでした(´・ω・`)

ということで、`COOKIE_DOMAIN` を `localhost` から `''` にしたら解決。

```php:wp-config.php
define('COOKIE_DOMAIN', '');
```

これで私の他の WordPress に迷える子羊が何名か救われればいいのですが・・・。


## 参考（というか試したけど失敗したFAQシリーズ）
https://wpdocs.osdn.jp/%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88
http://nymemo.com/wordpress/664/
http://viral-community.com/wordpress/wordpress-login-5280/
http://sho-tem.com/archives/1398
emacs+editorconfigでマルチバイト文字のエンコードエラーを解決する

emacs 24.5.1
editorconfig.el 20150831.1054 (melpa)

# 状況
editorconfigを入れてから、バッファにマルチバイト文字が含まれる際、
保存時にエンコードエラーが出るようになった。

```title:sample
These default coding systems were tried to encode text
in the buffer `xxxxx.txt':
  (undecided (123 . 45678))
```

ちなみに文字コードの設定はこうなっている。

```lisp
(prefer-coding-system 'utf-8-unix)
```

# 追ってみる
https://melpa.org/packages/editorconfig-20150831.1054.el

`*-coding-system`を触っているのはこの辺り 

```lisp
(defun edconf-set-line-ending (end-of-line)
  "Set line ending style to CR, LF, or CRLF"
  (set-buffer-file-coding-system
   (cond
    ((equal end-of-line "lf") 'undecided-unix)
    ((equal end-of-line "cr") 'undecided-mac)
    ((equal end-of-line "crlf") 'undecided-dos)
    (t 'undecided))
   nil t))
```

`edconfig-set-line-ending`はfind-fileされる度に呼ばれる。

```lisp
;;;###autoload
(defun edconf-find-file-hook ()
  (when (executable-find edconf-exec-path)
    (let ((props (edconf-parse-properties (edconf-get-properties))))
      (edconf-set-indentation (gethash 'indent_style props)
                              (gethash 'indent_size props)
                              (gethash 'tab_width props))
      (edconf-set-line-ending (gethash 'end_of_line props))
      (edconf-set-trailing-nl (gethash 'insert_final_newline props))
      (edconf-set-trailing-ws (gethash 'trim_trailing_whitespace props))
      (edconf-set-line-length (gethash 'max_line_length props)))))
```

つまり

1. `end_of_line`が設定されていないと`undecided`
1. 設定されていると対応するOSに合わせて`undecided-xxx`

がemacs側で設定される。

# 解決方法

1. .editorconfigに`end_of_line`をちゃんと設定する
1. editorconfig.elの該当する行を書き換える

（色々試してみたが上手くいかなかったので最終的に力技で解決。。）

```apache:.editorconfig
# 略
end_of_line = lf
# 略
```

```diff
--- editorconfig-20150831.1054.el	2015-10-17 17:26:06.000000000 +0900
+++ modified.el	2015-10-17 20:22:17.000000000 +0900
@@ -213,9 +213,9 @@
   "Set line ending style to CR, LF, or CRLF"
   (set-buffer-file-coding-system
    (cond
-    ((equal end-of-line "lf") 'undecided-unix)
-    ((equal end-of-line "cr") 'undecided-mac)
-    ((equal end-of-line "crlf") 'undecided-dos)
+    ((equal end-of-line "lf") 'utf-8-unix)
+    ((equal end-of-line "cr") 'utf-8-mac)
+    ((equal end-of-line "crlf") 'utf-8-dos)
     (t 'undecided))
    nil t))
```


デフォルトの値が`undecided`になっているのは、
どんな環境でも動くようになのかな。
Swift2 で音声(mp3)を再生する

今回はSwift2 で音声(mp3)を再生する方法を記事を書いていきたいと思います。



プログラムを簡単に日本語にすると
(1)AudioToolboxをインポートする
(2)ボタンを押された時のメソッドを作成する
(3)プロジェクトフォルダから音声ファイル(SE1.mp3)を参照する
(4)参照した音声ファイルからIDを作成
(5)作成されたIDから音声を再生する



```ViewController.swift
import UIKit
import AudioToolbox  //(1)AudioToolboxをインポートする

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func pressButton(sender: AnyObject) {//(2)ボタンを押された時のメソッドを作成する
        var soundIdRing:SystemSoundID = 0       //SoundIDを格納する変数を作成
        let soundUrl = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("SE1", ofType: "mp3")!)   
//(3)プロジェクトフォルダから音声ファイル(.mp3)を参照する
        AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing)    //(4)参照した音声ファイルからIDを作成
        AudioServicesPlaySystemSound(soundIdRing)   //(5)作成さいたIDから音声を再生する
    }
}

```

[まとめ]
簡単に再生できますね
Meteor で Document のカスタムメソッドを定義する方法


Meteor で Mongo.Collection のインスタンスメソッド(※)の定義の仕方です。

※注: JavaScript はプロトタイプベースの言語なので、本来はインスタンスメソッドとは呼びませんが、個人的なわかりやすさ重視でこう表現しています。

```js:animals.js
Animal = function (doc) {
  _.extend(this, doc);
};

_.extend(Animal.prototype,  {
  // ここに追加したいメソッドを追加していく
  makeNoise: function () {
    // this がドキュメント自身を指すので、this 経由で各プロパティやメソッドにアクセスできる
    return this.sound + "!!!!!";
  }
});

Animals = new Mongo.Collection("Animals", {
  transform: function (doc) { return new Animal(doc); }
});
```

このように定義します。データを用意して、

```js
Animals.insert({name: "dog", sound: "bowwow"});
```

以下のようにすると、先ほど定義したカスタムメソッドが実行されます。

```js
var animal = Animals.findOne({name: "dog"});
animal.makeNoise(); // => "bowwow!!!!!"
```

簡単ですね :-)

# 参考

- http://docs.meteor.com/#/full/collections
【Swift】Swift のチュートリアルでエラー （Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeInt64ForKey:]: value for key (rating) is not an integer number'）


Swiftをはじめようと[Appleのチュートリアル](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson2.html#//apple_ref/doc/uid/TP40015214-CH5-SW1)に沿ってサンプルアプリを作っていた時に生じたエラーです。

## チュートリアル

https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson2.html#//apple_ref/doc/uid/TP40015214-CH5-SW1

「FoodTracker」というサンプルアプリを作りながら、SwiftとXcodeについて学んでいくことができます。


## エラー

上記チュートリアルを順調に進めていき、最後の最後、「[Persist Data](https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson10.html#//apple_ref/doc/uid/TP40015214-CH14-SW1)」のレッスンで以下のエラーに遭遇しました。

```
Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: '*** -[NSKeyedUnarchiver decodeInt64ForKey:]: value for key (rating) is not an integer number'
```

このレッスンでは、アプリ内で追加・編集・削除した料理のデータ（料理名・画像・料理の評点）をファイルに保存できるようにするレッスンです。

問題の箇所は、Meal.swiftの以下の箇所です。

```swift:Meal.swift

let rating = aDecoder.decodeIntegerForKey(PropertyKey.ratingKey)

```

上記コードでも問題なくコンパイルされ、アプリも動作していました。
しかし、データ保存が可能になるということで、一度アプリを落として再度立ち上げた時にエラーが生じました。
保存したデータの読み込み時になにやら起こったようです。


## 解決方法

以下URLの通りです :grinning: 

http://stackoverflow.com/questions/31086593/xcode-nsinvalidunarchiveoperationexception-when-try-unarchive-file

```swift:Meal.swift

// let rating = aDecoder.decodeIntegerForKey(PropertyKey.ratingKey)

let rating = aDecoder.decodeObjectForKey(PropertyKey.ratingKey) as! Int

```

`decodeIntegerForKey`ではなく、`decodeObjectForKey`を使用して、`Int`にダウンキャストします。


## 参考

- https://developer.apple.com/library/prerelease/ios/referencelibrary/GettingStarted/DevelopiOSAppsSwift/Lesson10.html#//apple_ref/doc/uid/TP40015214-CH14-SW1
- http://stackoverflow.com/questions/31086593/xcode-nsinvalidunarchiveoperationexception-when-try-unarchive-file


iOSもはじめたばかりですが、頑張っていきます :fist:
homebrewでおかしくなったzshを戻す

ある日ターミナルにログインした際

```
Last login: Sat Oct 17 18:09:57 on console
/Users/username/.zshrc:25: parse error near `}'
mypc%
```

な事をいわれた。
そういえば homebrew から 5.1.1あたりにzshを昨日アップデートしたんだが、地雷ふんだんだろうか。

```
brew uninstall zsh
```
として、最新の5.1.1はアンインストールして、旧バージョンのzshは

```
% brew info zsh
zsh: stable 5.1.1
UNIX shell (command interpreter)
http://www.zsh.org/
/Users/username/brew/Cellar/zsh/5.0.0 (957 files, 9.1M)
/Users/username/brew/Cellar/zsh/5.0.2 (1052 files, 9.3M)
  Built from source
/Users/username/brew/Cellar/zsh/5.0.6 (1084 files, 11M)
  Built from source
/Users/username/brew/Cellar/zsh/5.0.7 (1084 files, 11M) *
  Built from source
From: https://github.com/Homebrew/homebrew/blob/master/Library/Formula/zsh.rb
==> Dependencies
Required: gdbm ✔, pcre ✔
==> Options
--without-etcdir
	Disable the reading of Zsh rc files in /etc
==> Caveats
Add the following to your zshrc to access the online help:
  unalias run-help
  autoload run-help
  HELPDIR=/Users/username/brew/share/zsh/help
```

ひとまず5.0.7として残っていそうなので、

```
brew switch zsh 5.0.7
```

として戻したところ冒頭のメッセージは消えた。
なんだったんでしょね
時間をずらしてcronを実行する

# 時間をずらしてcronを実行する

5分間隔で実行するときは `*/5 * * * * command` こんな感じで `*/5` と指定しますよね。
この場合だと0分、5分、10分、……、55分に実行されます。
0分開始は嫌だったのでずらすことにしました。

```bash
# 0分、5分、10分、……、55分
*/5 * * * * command

# 1分、6分、11分、……、56分
1-56/5 * * * * command

# 2分、7分、12分、……、57分
2-57/5 * * * * command

# 3分、8分、13分、……、58分
3-58/5 * * * * command

# 4分、9分、14分、……、59分
4-59/5 * * * * command
```
範囲を指定することで間隔をずらすことが出来ました。


## x. 参考

- [linux - How do I make cron run something every "N"th minute, where n % 5 == 1? - Stack Overflow](http://stackoverflow.com/questions/471026/how-do-i-make-cron-run-something-every-nth-minute-where-n-5-1)
WordPress Importerを使おうとしたら真っ白になった [WordPress]

#WordPress Importerとは
* 投稿記事や,設定などの情報をxmlにしてエクスポートしたり、エクスポートしたxmlをインポートして同じ環境を作ったりすることができるWordPressのプラグイんである.

#今回起こった問題
* 学習用に用意されていたxmlのデータをWordPress Importerを使ってインポートしようとして、WordPressのツール>インポート>WordPressを選択して,ファイルを選択する画面までは行ったが,submitを押して次に表示される画面が真っ白だった(図1).

![スクリーンショット 2015-10-17 18.13.00.png](https://qiita-image-store.s3.amazonaws.com/0/96373/2fd3eb24-af7a-f556-9e33-4d713c3ba8ca.png)
図1 真っ白になったWordPress Importerの画面

そこで、調べてみると、WordPressImporterのpersers.phpファイルを修正することで解決できるとのことであった.

修正箇所は
persers.phpの

      if ( extension_loaded( 'simplexml' ) ) {
を

      if( false && extension_loaded( 'simplexml' ) ){
に修正することだった.      

以上で,図2のような画面が実際に表示されるようになった.

![スクリーンショット 2015-10-17 18.20.54.png](https://qiita-image-store.s3.amazonaws.com/0/96373/ec78123a-fd23-8339-3a00-85c3f42fd720.png)
図2 実際に表示されたWordPress Importerの画面

以上の操作で真っ白になったWordPress Importerを修正することができた.
しかし,元のファイルを直接修正する手法なので,バックアップを取るなどの対処をしておいたほうがいいだろう.

参考にしたサイトのURL
http://blog.nakatsuma.jp/?p=695
GoでNUL文字を出力

Go言語では`"\0"`とやってもNUL文字が出力されないようです。
文字列の途中や最後にNUL文字を入れるには、

```go
nulChar := string([]byte{0})
includeNul := strings.Join("hoge", nulChar, "huga")
//=> "hoge\0huga"
```

とするしか無い？
もっといい方法がないのだろうか…
Python３環境でQiita API v2のPythonラッパーを動かす(Mac OS X 10.11(El Capitan))

OS X 10.11 界隈では[不穏な噂のあるHomebrew](http://qiita.com/riocampos/items/525ec4b35744ad586c5a?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=95dd39bd56-Qiita_newsletter_177_10_14_2015&utm_medium=email&utm_term=0_e44feaa081-95dd39bd56-32764925)ですが、じぶんもしっかり引っかかる。エラーメッセージにみちびかれるまま、

```
 sudo chown -R $(whoami):admin /usr/local
```
後に ,```brew update```、```brew upgrade```で無事復帰、さて、Python3.xをインストールする。
```
genki@iwaboos-MBA:~$ brew install python3
==> Installing dependencies for python3: pkg-config, sqlite, gdbm
==> Installing python3 dependency: pkg-config
:
:
genki@iwaboos-MBA:~$ python3  --version
Python 3.5.0
```
どうやら、インストール出来たらしい。さて、pipコマンドでラッパーをインストール[公式ページ](http://qiita.com/petitviolet/items/deda7b66852635264508)では```pip install qiita_v2```となっているが、Python3.xで使うので、```pip3 install qiita_v2```でインストール。
```
genki@iwaboos-MBA:~$ pip3 install qiita_v2
Collecting qiita-v2
  Downloading qiita_v2-0.1.0.tar.gz
Collecting pyyaml (from qiita-v2)
  Downloading PyYAML-3.11.tar.gz (248kB)
    100% |████████████████████████████████| 249kB 1.1MB/s
Collecting requests (from qiita-v2)
  Downloading requests-2.8.1-py2.py3-none-any.whl (497kB)
    100% |████████████████████████████████| 499kB 1.0MB/s
Building wheels for collected packages: qiita-v2, pyyaml
  Running setup.py bdist_wheel for qiita-v2
  Stored in directory: /Users/genki/Library/Caches/pip/wheels/3c/86/92/b7f144db7d5fa54acff97a656bcedaa61cba5ad69b8f809df1
  Running setup.py bdist_wheel for pyyaml
  Stored in directory: /Users/genki/Library/Caches/pip/wheels/fa/db/f6/dee55793d344f1706dc4a5a693298f0115241d1085cc212364
Successfully built qiita-v2 pyyaml
Installing collected packages: pyyaml, requests, qiita-v2
Successfully installed pyyaml-3.11 qiita-v2-0.1.0 requests-2.8.1
```

これで環境構築は完了。サンプルコードetcで動作確認ができればOK。
最新のpipをvirtualenv環境で使う


[PyConJP 2015の発表](http://togetter.com/li/885012)で知ったのだが、7.0以降のpipはライブラリのインストール時にsdistよりwheelを優先するようになった模様。
(参考:pipのリリースノート) http://pip.readthedocs.org/en/stable/news/

試したところ、今までだとsdistでインストールしていたパッケージの幾つか(ex. IPython)をwheelでインストールするようになっていた。これにより、virtualenv環境の作成時間が非常に短くなるのが嬉しい。

## 最新のpipをどうやってインストールするか

[ここ](http://qiita.com/FGtatsuro/items/1c490abee7061a6ec79e)で示した自身の環境では、「Homebrew経由でインストールされたpip(Python)」によりVirtualenvをインストールしている。
このVirtualenvで作成した環境には「Homebrew経由でインストールされたpip」が使用されているようなので、Pythonごとpipのバージョンを上げた。

```bash:pip(Homebrew)のアップグレード
$ brew upgrade python python3
```

確かにこれでpipのバージョンは上がったものの、同時にPythonのマイナーバージョンを上げてしまい(3.4->3.5)、3.4のダイナミックライブラリを参照しているvimが動かない、というトラブルに見舞われた。

安全にいくならば、Virtualenvのフック機能を利用して、作成したVirtualenv環境内のpipのみアップグレードする方が良いかと思う。

```bash:~/.virtualenvs/postmkvirtualenv
...
# ついでにsetuptoolsも最新を使うようにする
pip install --upgrade setuptools
pip install --upgrade pip
...
```
play2.4.3 + slick 3.0備忘録


- dao packageを使う
- diを使う
- dbはmysql

の場合、設定備忘録

```lang:build.scala
name := "activator-play-slick"

version := "1.0-SNAPSHOT"

scalaVersion := "2.11.7" // or "2.10.4"

libraryDependencies ++= Seq(
  "org.webjars" %% "webjars-play" % "2.3.0-2",
  "com.typesafe.play" %% "play-slick" % "1.1.0",
  "com.typesafe.play" %% "play-slick-evolutions" % "1.1.0",
  "mysql" % "mysql-connector-java" % "5.1.36"
)

fork in Test := false

lazy val root = (project in file(".")).enablePlugins(PlayScala)

routesGenerator := InjectedRoutesGenerator
```


```lang:plugin.sbt
// The Typesafe repository
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.3")

addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
```



```lang:CatDao
package dao

import models.Models.Cat

import scala.concurrent.Future

import javax.inject.Inject

import play.api.db.slick.DatabaseConfigProvider
import play.api.db.slick.HasDatabaseConfigProvider

import slick.driver.JdbcProfile

import scala.concurrent.ExecutionContext.Implicits.global

class CatDao @Inject()(protected val dbConfigProvider: DatabaseConfigProvider)
  extends HasDatabaseConfigProvider[JdbcProfile] {

  import driver.api._

  private val cats = TableQuery[CatsTable]

  // ddl
  {
    val schema = cats.schema
    db.run(schema.create)
  }

  def all(): Future[Seq[Cat]] = db.run(cats.result)

  def insert(cat: Cat): Future[Unit] = db.run(cats += cat).map { _ => () }

  private class CatsTable(tag: Tag) extends Table[Cat](tag, "CAT") {
    def name  = column[String]("name", O.PrimaryKey)
    def color = column[String]("color")

    def * = (name, color) <> (Cat.tupled, Cat.unapply _)
  }
}
```

```lang:Application.scala
package controllers

import javax.inject.Inject

import play.api.libs.concurrent.Execution.Implicits.defaultContext

import dao.CatDao
import models.Models.Cat

import play.api.data._
import play.api.data.Forms._
import play.api.mvc._

class Application @Inject() (cats: CatDao) extends Controller {
  val catForm = Form(
    mapping(

  "name" -> text(),
      "color" -> text()
    )(Cat.apply)(Cat.unapply)
  )
  def index = Action.async {
    cats.all.map { case cs => Ok(views.html.index(cs)) }
  }

  def insert = Action.async { implicit rs =>
    val cat: Cat = catForm.bindFromRequest.get
    cats.insert(cat).map(_ => Redirect(routes.Application.index))
  }
}
```
Hackintosh(El Capitan)の夢を見た(良い夢)

前に使ったpcの構成をほんの少し変更して、OSX最新版のEl Capitanを動かしてしまう夢を見た。
bootLoaderは前回とは違って、流行ってるらしいcloverを使いました。

DL先URLなど
tonymacx86.com　(会員登録必須　無料)
http://www.tonymacx86.com/downloads.php?do=cat&id=3

El Capitan Post-Install Tools
http://www.tonymacx86.com/downloads.php?do=file&id=279

kextファイル
http://ux.getuploader.com/Hackintosh/download/6/ALC662+El+Capitan.zip

Kext Wizard
http://ux.getuploader.com/Hackintosh/download/3/Kext+Wizard.zip

pc構成
マザーボード ASRock B75M R2.0
CPU core i5 2500k (うろ覚え)
メモリは 4G*2 (片方は片面実装のタイプ)
SSD crucial ct256mx100ssd1(起動ディスク)
HDD Samsungっぽい。320GB (バックアップ用)
GTX660 (どこ製だか忘れた)

必要なもの
app Storeに繋げられるMac
usbメモリ 16GBがおすすめ
(8GBだと動かないやつがあった)
気合と根性と時間

簡単にやり方を書く。
App StoreからEl Capitanをダウンロード。
UniBeastをダウンロード。
私が使った時は6.0でしたが、なんかバグあった気がする。
うまく起動しない時はディスクの作成に失敗してることを疑うといい。

macの設定を英語に変えないと起動しません。

てきとーにクリックしていく。
bootの設定をUEFIにすると私の環境では失敗したので、legacyかEFIを選択する。

USBに作成できたら、インストールしたいPCに接続。

このときGTX660を外さないと、インストールに成功しても、次に起動するときにカーネルパニックして動きませんでした。

USBからブートできるようにBIOSで設定をし、起動。
ここで私はインストールする前に、自分でインストール先をディスクユーティリティを使ってフォーマットしました。

あとは画面にしたがってインストール。
（全部英語です）

インストールが終わったらUSBを抜かずに再起動。
今度はHDDを選択して起動します。

起動することを確認し、電源を落とし、GTX660を接続。

起動するとGTX660を認識したまま起動します。

あとはEl Capitan Post-Install Toolsをダウンロードして、解凍。
legacyの方をインストール。

USBを抜いて再起動すると、usbの時と同じbootLoaderが起動します。

ここまでくればあとは、オーディオのkextをインストールして終わり。

Kext Wizardとkextファイルをダウンロードし、解凍。
実行して、installationタブの真ん中に、kextファイルの中身をドラッグ＆ドロップ。

インストールを押して完了。pcを再起動すると出力先と、入力先に項目が追加されてます。



pcを起動したあと、キーボードに触らずにmacを起動させる方法がわからないので誰かおしえてください。
CSSを駆使してDIV要素１つでデジタル数字を作る

##概要

![digits.png](https://qiita-image-store.s3.amazonaws.com/0/62215/08ffb46d-5b67-cffb-2612-00dcd9365b00.png)

こんな感じのデジタル数字（７セグメント）を、

```html:
<!DOCTYPE html>
<style>
  /* CSS */
</style>
<div class="display d4"></div>
```

こんな感じでひとつの要素だけで作ってみようと思います。

##方針

![digit-explanation.png](https://qiita-image-store.s3.amazonaws.com/0/62215/c30d4fda-6da8-66bc-e616-38d99a1f3e5d.png)

こんな感じで分割してみようと思います。
どのセグメントを光らせるかはクラスで指定します。

##作成

とりあえず上記の方針に従い`4`を作ってみます。

```css:
.display {
  display: inline-block;
  box-sizing: border-box;
  position: relative;
  width: 60px;
  height: 100px;
  border: solid 4px #111;
  background-color: #111;
  overflow: hidden;
}

.display::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 28px;
  height: 28px;
  transform: translate(-50%, -50%) rotate(45deg);
}

.display::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 30px;
  height: 12px;
  border-top: solid 30px #111;
  border-bottom: solid 30px #111;
  transform: translate(-50%, -50%);
}

.d4::before {
  background-color: #ff0;
  box-shadow: -30px -30px #333,
                0px -30px #ff0,
              -30px   0px #ff0,
                0px  30px #333,
               30px   0px #ff0,
               30px  30px #333;
}
```

![digit-4.png](https://qiita-image-store.s3.amazonaws.com/0/62215/f07701c5-87ca-1de8-2e4a-a3fd3221d745.png)

はいできました！

##デモ

http://codepen.io/anon/pen/rOYWZB

##所感

数値の調整に関してはまだ改善する余地があると思います。
とはいえなんとなく作れてしまったので、CSS恐ろしいです。
Javaのシステム・プロパティでロケールとタイムゾーンを設定する

備忘メモです。

-Duser.language=ja
-Duser.country=JP
-Duser.timezone=Asia/Tokyo

こんな感じ。

<2018/7/25追記>
例えば、AWS Elastic Beanstalkで
Tomcatプラットフォームならシステムプロパティに以下を設定
user.language=ja
user.country=JP
user.timezone=Asia/Tokyo
Javaプラットフォームなら環境変数に以下を設定
_JAVA_OPTIONS=-Duser.language=ja -Duser.country=JP -Duser.timezone=Asia/Tokyo

こんな感じで。
github pagesをスタードメイン利用で作る。

# github pagesとは何か
- 簡単に静的ページをhostingできるgithubの一機能です。
 - [official](https://pages.github.com/)
 - cgi,phpなどは利用できません。
 - jekyllなどでローカル作成cmsなど利用し、githubにアップロードすることで可能。
 - 無料で利用できます。 
 - 独自ドメインの設定も可能です。
 - SourceTree, Github for (Mac|Windows)など使えばGUIで簡単にpushできます。

# 注意
ドメイン取得時はDNS設定できる事業会社にしましょう。お名前.com ,Value Domain, スタードメインなど。今回は自分が利用しているスタードメインで説明します。

# 作ったもの

ソースコード
 https://github.com/okachan/okachan.github.io
 ↑を真似れば大体できます。
URL
http://ilikepurin.com/

# やりかた

1. hogehoge.github.ioという名前でgithubにレポジトリ作成。

例. https://github.com/okachan/okachan.github.io
URL. https://github.com/new
ログイン後、レポジトリ名をつけて作成.descriptionはなんでもok.

2. CNAMEファイルを置く
例. https://github.com/okachan/okachan.github.io/blob/master/CNAME
利用予定のドメイン名を書いたファイルを置く。
今回の場合はhttp://ilikepurin.com/
なのでilikepurin.comと書いたCNAMEファイルを置いています。
この時点で http://レポジトリ名.github.io/にアクセスできるか確認。

3. スタードメインの設定
例.
![スタードメイン.png](https://qiita-image-store.s3.amazonaws.com/0/41199/9607580b-8a37-6de1-d273-64c2be4c8169.png)
(スタードメインのドメイン編集画面)
**タイプはA 192.30.252.153**
**タイプはA 192.30.252.154**
は必須です。
自分はこれを入れずにハマりました・・・。他の情報だと書いてあったりなかったりでちぐはぐだったので。

4. アクセスする。
http://www.ilikepurin.com/
にアクセスでいけます。
gitbucket-commitgraphs-plugin導入

# gitbucket-commitgraphs-plugin
> This plugin enhances takezoe/gitbucket by providing an viewing commit graphs.

[yoshiyoshifujii/gitbucket-commitgraphs-plugin](https://github.com/yoshiyoshifujii/gitbucket-commitgraphs-plugin)
[GitBucket Pluginでコミット件数をグラフ表示してくれるやつを作りました - Qiita](http://qiita.com/yoshiyoshifujii/items/5ed2919e22c850726cca)

# インストール
## 環境
* OS : Windows7
* GitBucket : 3.7
* AppServer : Tomcat7.0
* JVM : 1.8.0_51-b16

## ビルド
0. GitHubからgitbucket-commitgraphs-pluginをクローン
1. Proxy環境のため`sbt.bat`を編集
2. コマンドプロンプトで`sbt package`を実行し、しばらく待つ
3. `gitbucket-commitgraphs-plugin\target\scala-2.11`に`gitbucket-commitgraphs-plugin_2.11-1.0.jar`ができているはず

### プロキシ用オプション
```diff:sbt.bat
set SCRIPT_DIR=%~dp0
- java -Dsbt.log.noformat=true -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -jar "%SCRIPT_DIR%\sbt-launch-0.13.5.jar" %*
+ java -Dhttp.proxyHost=<HostName> -Dhttp.proxyPort=<PortNumber> -Dsbt.log.noformat=true -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx512M -Xss2M -jar "%SCRIPT_DIR%\sbt-launch-0.13.5.jar" %*
```

## インストール
4. `gitbucket-commitgraphs-plugin_2.11-1.0.jar`を`GITBUCKET_HOME\plugins`に移す
5. GitBucketを再起動

## Cannot run program "git" の対処
gitbucket-commitgraphs-pluginではjGitを使っている部分とgitコマンドを使っている部分がある。
gitにパスを通していないと以下のエラーが発生する。

```
java.io.IOException: Cannot run program "git" (in directory "<リポジトリのパス>"): CreateProcess error=2, 指定されたファイルが見つかりません。
	at java.lang.ProcessBuilder.start(Unknown Source)
	at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:69)
	at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.lineStream(ProcessBuilderImpl.scala:141)
	at scala.sys.process.ProcessBuilderImpl$AbstractBuilder.lineStream_$bang(ProcessBuilderImpl.scala:109)
	at me.huzi.gitbucket.commitgraphs.controller.CommitGraphsControllerBase$$anonfun$1$$anonfun$apply$1$$anonfun$apply$2$$anonfun$2.apply(CommitGraphsController.scala:30)
	at me.huzi.gitbucket.commitgraphs.controller.CommitGraphsControllerBase$$anonfun$1$$anonfun$apply$1$$anonfun$apply$2$$anonfun$2.apply(CommitGraphsController.scala:28)
...
```

該当箇所

```scala
val p = Process.apply(Seq("git", "log", "-n", "1", "--numstat", """--pretty="%H"""", "--source", rev.getId.name), git.getRepository.getDirectory)
```
SpineにIllustrator上のデザインを取り込む(応用編)


前回の続きです。

# それでもIllustratorを使いたい
前回はIllustratorでデザインを完成させた場合でもPhotoshopに一旦データを変換してSpine書き出しするのが良い、という内容の投稿をしました。まあ、Spine上で手動でパーツを配置するならPhotoshopは使わず、Illustrator+プラグインだけで良いわけですが、配置はPhotoshopを利用したとしても、画像の更新はIllustratorだけで行いたいので、その方法を模索してみます。

# 画像フォルダパスをIllustrator出力画像側に向ける

まず、単純にSpineのimagesフォルダの参照をIllustratorが書き出したpngのある場所に向けてみましょう。

![スクリーンショット 2015-10-17 14.31.44.png](https://qiita-image-store.s3.amazonaws.com/0/8302/9da521cd-6187-e98a-f965-377850311d80.png "スクリーンショット 2015-10-17 14.31.44.png")
画像が更新されました。が、パーツがずれちゃいましたね。IllustratorとPhotoshopの書き出すpngファイル名は同じなので、大きささえそれえてやれば、パーツデザインの微調整はIllustratorだけで済みそうです。

# Photoshopで書き出し設定を調整

aiからpsdの変換時に72dpiを指定するか、(デフォルトの)144dpiでpsd変換した場合はSpineへExport時に50%書き出ししてやればおおよその大きさが合います。

おおよそ、というのはIllustrator側の書き出しは余白パディングが無く、Photoshop側では1pxの余白をつけて書き出しているので、縦横で2pxの差が出ているようです。Spineに取り込んで気にならないならそれでも良いですが、ここもぴったりあわせて作業をしてみます。Illustratorでボーダーの設定は現状できませんので、Photoshop側でパディング設定を0にして書き出します。これで両者のサイズがぴったりあいます。

![スクリーンショット 2015-10-17 15.17.14.png](https://qiita-image-store.s3.amazonaws.com/0/8302/6e64b737-a1c6-80c6-e7e0-f91bb8d17801.png "スクリーンショット 2015-10-17 15.17.14.png")

念のため両者の書き出したパーツの差分を確かめるために、２枚の画像をPhotoshop"上で差の絶対値"で重ねてみます。目の周りなど、うっすらと何か見えているので(アンチエイリアスの設定の差かも？)全く同じ画像というわけではなさそうですが、大きさはぴったり合っていますし、特に問題はなさそうです。

![スクリーンショット 2015-10-17 15.27.15.png](https://qiita-image-store.s3.amazonaws.com/0/8302/499bc549-c7d9-8429-dcb3-18305f1708a2.png "スクリーンショット 2015-10-17 15.27.15.png")
Photoshopで書き出し直したデータをSpineで読み込み直しました。

# Illustratorでデータを更新する

![スクリーンショット 2015-10-17 15.39.50.png](https://qiita-image-store.s3.amazonaws.com/0/8302/9a629893-68d1-a267-d5c2-bf9023a133bb.png "スクリーンショット 2015-10-17 15.39.50.png")
Illustrator側でイラストを更新し、プラグインでpng書き出しします。

![スクリーンショット 2015-10-17 15.40.35.png](https://qiita-image-store.s3.amazonaws.com/0/8302/293bed72-5c72-b25c-1e08-6ae411fe8a4c.png "スクリーンショット 2015-10-17 15.40.35.png")
SpineのImagesフォルダをIllustratorで書き出した画像のあるフォルダに向け直します。
問題無いですね！

Illustrator上でパーツの大きさが結構変わってしまった場合は、Spine上で調整するか、再度Photoshopでの書き出しを経由して、位置を正しくしてやりましょう。。


# 終わりに
フィルタをつけるなりマスクをつかうなり、なにか特殊な事をしなければ"余白なし"設定で問題は出ないと思っているのですが、余白が必要になった場合は別途対応が必要ですね。

結局画像の大きさとファイル名さえ同じであれば、何の画像ツールを使っても良いわけなので、別のソフトでもこのようなテクニックを使う事はできそうです。前の投稿で書いた通り Photoshop以外のエクスポーターがましになればいいだけなのですけど。