OmniAICreator/Qiita-1.07M huggingface dataset:
Java Web フレームワーク Spark でシンプルなファイルダウンロードサーバーを作ってみる

いわゆるマイクロサービス構成向けの Java Web フレームワーク[Spark](http://sparkjava.com/ "A tiny Java web framework")を試す。Apache Spark ではない。

今回作ったツールは指定したファイルをダウンロードするというだけのもの。
想定している利用状況は、常設のWebサーバーがないとか有っても自由にファイルを置くことができないといった状況で一時的にでもWebサーバー経由でファイルをダウンロードする動きを実現したい場合。
自分の場合は自作の Vagrant box をダウンロードするために使っている。
今回のツールを使うことで必要な間だけ稼働するWebサーバーを用意できることになる。

同じ目的のツールを Dropwizard を使って一度作っているのだけれど Spark Framework で作るとどうなるのだろうということで試してみた。

その結果、コーディング量が破壊的なまでに少ないツールとなった。
利用目的が目的だけにエラーチェックなどは特に入れていないせいでもある。
ファイルの有無くらいはチェックすべきかもしれないが。

コマンドラインまたは設定ファイルを使うことでポートやファイルを読み出すフォルダを変更できるようにすることを考えているが、適切なライブラリを使えばコード量も大して増えないと思う。

##### 2014/02/04 コード変更

ドキュメントはよく読むものだ。
自分がやろうと思っていることをもっと簡単に記述できることがわかったのでコードを修正。
配布ファイルを１ファイルに固めるアプローチのフレームワークだと静的ファイルはクラスパスに含めるものと思い込んでしまっていて、自前でファイルを送り返す処理を書いていた。ところが Spark では外部フォルダからファイルを読み出す手段が標準で用意されていた。
この例だとカレントディレクトリに public/download/ というディレクトリを用意してその中に対象ファイルを置いておけばよい。
get()メソッドが残っているのは少なくとも一つはrouteを設定しないとサーバーが開始しないため。
ちなみにget()メソッドを用意しておかないとプログラムは即時終了する。

##### 2016/11/30
久々に使うことになったことにあわせてフレームワークのバージョンを上げたところ以前と同様には動かない。
調べたところexternal static fileのパス指定ルールが変更になっていたようだ。
コードを修正。

```java
import java.nio.file.Path;
import java.nio.file.Paths;

import static spark.Spark.get;
import static spark.Spark.staticFiles;

public class JunkServer {
    public static void main(String[] args) {
        Path path = Paths.get("public");
        staticFiles.externalLocation(path.toAbsolutePath().toString());
        get("/", (request, response) -> "" );
    }
}
```

アプリケーション起動後に次のようなURLでファイルをダウンロードできる。

```text
http://localhost:4567/download/centos66-x86_64-ja.box
```


Gradleで設定する依存関係は以下の通り。

```groovy
dependencies {
    compile 'com.sparkjava:spark-core:2.5.3'
}
```
fstabによる自動マウントが失敗したときのデバグ方法

/etc/fstab で自動マウントをしたつもりが、サーバ再起動したらマウントできていない場合のデバグ方法を紹介します。

## sudo mount -a で手動マウントを試みる

````
sudo mount -a
````
これを実行すると、`/etc/fstab`に記述されているものを全部マウントしようとします。

fstabの記述ミスなどがある場合は、ここでエラーが出るのでどの行に問題があるかがわかります。

```
"line 9 in /etc/fstab is bad"
```

あとはエラーの出た行をよく見て記述ミスを修正するだけです。
Ubuntu14.04でRuby on Rails事始め

#はじめに
導入後しばらく放置していたUbuntuでRuby on Railsをさわってみようと思い立ちました。
いろいろやってみながら、役に立ちそうなことを記録していきます。とは言っても、基本的には、このサイトに助けられました～っていうもののまとめです。

#Ruby on Railsのインストール
まずはRailsのインストールから。
基本的にはこちらのサイトで何とかなりました。
http://tsuchikazu.net/linux_ruby_on_rails_install/
ありがとうございました。（ここで言う）
こちらも参考にしました。
http://www.oiax.jp/rails/zakkan/rails_3_2_installation_on_ubuntu.html

バージョンは、たくさんあって迷いましたが、今回は最終的に以下のようにしました。
`ruby 2.0.0p598`
`Rails 4.2.0`

#ちょっとしたつまずき
Railsインストールが無事完了し、すっかり満足してしばらく放置・・・後日改めて確認してみると、
`ruby: command not found`
`rails: command not found`
という悲しいメッセージが。
パスが通っていなかったんですね・・・。
というのもおそらく、私がRailsインストール後にシェルをzshに変えた結果、PATHがデフォルト状態になっていたんでしょうね難しいことは分かりませんが。
zshの設定ファイル`.zshrc`やら`.zshenv`やらをさわってPATHを通したら、ちゃんと受け付けてくれるようになりました。

#追記
上記参考記事にもあるsqliteなどのインストールは今はいいや～と思っていたけど、どうせ後々すぐにRailsに「足りないけど？！」って言われたりするので、今やっておけばよい。
phpDocumentor2インストール手順

# 前提
- OS:CentOS release 6.6
- PHP:PHP 5.6.4

# 手順
- [ ] phpDocumentorをインストール

> $ pear update-channels
> $ pear upgrade pear
> $ pear upgrade-all
> $ pear channel-discover pear.phpdoc.org
> $ pear install -a phpdoc/phpDocumentor-alpha
> $ phpdoc --version
> $ phpDocumentor version 2.0.0a11

- [ ] 上記でインストールは完了。下記コマンドでドキュメントを生成してみる

> $ phpdoc -d [入力ディレクトリ] -t [出力ディレクトリ]

　'Unable to find the `dot` command of the GraphViz package. Is GraphViz correctly installed and present in your path?'と出て利用できないはず。
　GraphpVizがないと言われているので、コチラをインストールする。今回はyumで！

- [ ] yumのリポジトリにgraphvizを追加する。(もちろんないことを確認してから実施)

> [root@localhost ~]# cd /etc/yum.repos.d/
> [root@localhost yum.repos.d]# wget http://www.graphviz.org/graphviz-rhel.repo

- [ ] インストールされるものを確認

> [root@localhost yum.repos.d]# yum list available 'graphviz*'
> 読み込んだプラグイン:fastestmirror, security
> Loading mirror speeds from cached hostfile
>  * base: www.ftp.ne.jp
>  * epel: mirror.nus.edu.sg
>  * extras: www.ftp.ne.jp
>  * updates: www.ftp.ne.jp
>  * webtatic: us-east.repo.webtatic.com
> 利用可能なパッケージ
> graphviz.i686                               2.26.0-10.el6                      base
> graphviz-devel.i686                         2.26.0-10.el6                      base
> graphviz-doc.x86_64                         2.34.0-1.el6                       graphviz-stable
> graphviz-gd.i686                            2.26.0-10.el6                      base
> graphviz-graphs.x86_64                      2.34.0-1.el6                       graphviz-stable
> graphviz-guile.x86_64                       2.34.0-1.el6                       graphviz-stable
> graphviz-java.x86_64                        2.34.0-1.el6                       graphviz-stable
> graphviz-lua.x86_64                         2.34.0-1.el6                       graphviz-stable
> graphviz-ocaml.x86_64                       2.34.0-1.el6                       graphviz-stable
> graphviz-perl.x86_64                        2.34.0-1.el6                       graphviz-stable
> graphviz-php.x86_64                         2.34.0-1.el6                       graphviz-stable
> graphviz-python.x86_64                      2.34.0-1.el6                       graphviz-stable
> graphviz-ruby.x86_64                        2.34.0-1.el6                       graphviz-stable
> graphviz-tcl.x86_64                         2.34.0-1.el6                       graphviz-stable

- [ ] graphvizをインストール

> [root@server yum.repos.d]# yum install 'graphviz*'

　今回はこれですんなり終わりました。エラーが出たら上記を個別でインストールしましょう！
　再度下記コマンドを実施！これで、出力ディレクトリに必要ファイルが吐き出されているはずなので、index.htmlにアクセスしてみてください♪

> $ phpdoc -d [入力ディレクトリ] -t [出力ディレクトリ]

# 注意点

今回はすんなり入ってしまったので、特には。今後何かあれば記載します。
AWS SDK for Goを使ってS3にファイルアップロード

https://github.com/awslabs/aws-sdk-go
aws公式のsdkになるaws-sdk。

取り急ぎ、ファイル一覧取得と、ファイルのアップロードの2つだけ確認してみた。

## ファイル一覧取得

```go
package main

import (
  "fmt"

  "github.com/awslabs/aws-sdk-go/aws"
  "github.com/awslabs/aws-sdk-go/gen/s3"
)

func main() {
  accessKey := "<AWS_ACCESS_KEY_ID>"
  secretKey := "<AWS_SECRET_ACCESS_KEY>"
  bucket := "<bucket>"

  creds := aws.Creds(accessKey, secretKey, "")
  cli := s3.New(creds, s3.BucketLocationConstraintApNortheast1, nil)

  resp, err := cli.ListObjects(&s3.ListObjectsRequest{
    Bucket: aws.String(bucket),
  })
  if err != nil {
    panic(err)
  }
  for _, c := range resp.Contents {
    fmt.Println(*c.Key)
  }
}
```

## ファイルのアップロード

```go
package main

import (
  "fmt"

  "github.com/awslabs/aws-sdk-go/aws"
  "github.com/awslabs/aws-sdk-go/gen/s3"
)

func main() {
  accessKey := "<AWS_ACCESS_KEY_ID>"
  secretKey := "<AWS_SECRET_ACCESS_KEY>"
  bucket := "<bucket>"

  creds := aws.Creds(accessKey, secretKey, "")
  cli := s3.New(creds, s3.BucketLocationConstraintApNortheast1, nil)

  f, err := os.Open("./foo.jpg")
  if err != nil {
    panic(f)
  }
  defer f.Close()

  fstat, err := f.Stat()
  if err != nil {
    panic(f)
  }

  _, err = cli.PutObject(&s3.PutObjectRequest{
    Body:          f,
    Bucket:        aws.String(bucket),
    Key:           aws.String("images/foo.jpg"),
    ACL:           aws.String(s3.BucketCannedACLPublicRead),
    ContentType:   aws.String("image/jpeg"),
    ContentLength: aws.Long(fstat.Size()),
  })

  if err != nil {
    panic(err)
  }
}
```

## 所感

ドキュメントがまだ未整備なので
エラーや必須パラメータは[AWSのAPIドキュメント](http://docs.aws.amazon.com/AmazonS3/latest/API/APIRest.html)を見る必要が出てくる。
`A header you provided implies functionality that is not implemented`とか言われたら、
APIドキュメントを見て原因を確認していくことになる。

要はAWS client以上でも以下でもない感じ。
Octopress + Github Pagesで無料ブログ

# はじめに
[GitHub Pages](https://pages.github.com/)は[GitHub](https://github.com/)が提供するサービスの一つで，静的ページを簡単に公開することができます（しかも無料！）．また，[Octopress](http://octopress.org/)は[Jekyll](http://jekyllrb.com/)を使ったブログ構築用フレームワークです．このGitHub PagesとOctopressを使ってブログを公開してみます．

# 導入手順

導入手順を簡単に書いておきます．

## Octopress

[公式Document](http://octopress.org/docs/setup/)を参考に導入してみます．Git，ruby1.9.3以降，Node.jsが必要なようです．gem入れる感じなのかなと思ったらgit repositoryをcloneしてくるんですね．．．実装上の都合なのかな．．．

```
$ git clone git://github.com/imathis/octopress.git octopress
$ cd octopress
$ bundle install --path vendor/bundle
```

## テーマの変更

defaultのテーマでもいいのですが，今回は[whitespace](https://github.com/lucaslew/whitespace)というテーマを入れてみました．

```
$ git clone git://github.com/lucaslew/whitespace.git .themes/whitespace
$ rake install['whitespace'] # for zsh, use: rake install\['whitespace'\]
$ rake generate
```

## 記事の追加
記事の追加は`new_post`コマンドを使います

```
$ rake new_post['test']
```


## Preview

以下のコマンドで，localhost:4000でpreviewできます．

```
$ rake preview
```

![Screen Shot 2015-02-01 at 16.09.12.png](https://qiita-image-store.s3.amazonaws.com/0/46036/e89d84fc-c099-ddd2-89d5-699d61301ef0.png)


## GitHub Pages
Github pageを作るには，GitHub上に`[username].github.io`というrepositoryを作れば良いようです．以下のコマンドを実行するとrepository urlを聞かれるので入力します．

```
$ rake setup_github_pages
```

## Deploy

localで作成した記事などをdeployするにはgenerate, deployコマンドを実行します．

```
$ rake generate
$ rake deploy
```

# 補足
Octopress，hacker向けとか言っときながらsimpleじゃないしクソじゃねみたいな評判（[A tiny rant: Jekyll vs. Octopress](https://lauris.github.io/blogging/2014/08/16/jekyll-vs-octopress/)）も目にしましたが，とりあえず使って見ようかと思います．


# 参考
- [Octopress](http://octopress.org/)
- [Jekyll](http://jekyllrb.com/)
- [GitHub Pages](https://help.github.com/articles/using-jekyll-with-pages/)
- [Using Jekyll with Pages](https://help.github.com/articles/using-jekyll-with-pages/)
- [JekyllをStep by Stepで使って理解する](http://qiita.com/makoto_kw/items/38c0300cbbaf8d2f2370)
DockerでPhabricatorを動かす、ついでにDocker Hub Registryにも登録する


[Phabricator](http://phabricator.org/)を手軽に動かしたくてDockerfile書いた。需要が無さそうなのをすでに感じ始めてる。

# 環境
* OSX 10.10.1
* Boot2Docker-cli version: v1.4.1
* Docker version 1.4.1, build 5bc2ff8

# 使い方

```
$ git clone https://github.com/maosanhioro/docker-phabricator.git
$ cd docker-phabricator
$ ./bin/build.sh
$ ./bin/rund.sh
```

## マウントしたいなら
実行時に`-v`と共にpathを渡すことでマウントされるので、`bin/rund.sh`を書き換えるなりコピペするなりで対応できます。

## ポート（9000）を変えたいなら
DockerfileのEXPOSEと`bin/rund.sh`の`-p`を書き換えるなりコピ（ry

## 動いてるコンテナの中を見たい！触りたい！
ここだけはDokererに需要ありそうと信じてます。

```
$ ./bin/attach.sh
```
これでPhabricatorコンテナに入れます。SSHでも`docker attach`でもなく、`docker exec`です（それっぽい名前が思い浮かばなかったのでイメージ優先でファイル名はattach.shにしました）。

Docker 1.3以降だかで入った新しめの機能で、これないとDockerfileを書く上での試行錯誤が苦行でしかないです。

attach.shの中では擬似端末`-t`と共に`/bin/bash`を渡してますが、ここに生コマンド渡して直接実行も可能です。

# 置いた場所
* Docker Hub Registry: [maosanhioro/docker-phabricator Repository](https://registry.hub.docker.com/u/maosanhioro/docker-phabricator/)
* Github: [maosanhioro/docker-phabricator](https://github.com/maosanhioro/docker-phabricator)

# ついでに
Dockerfileは試行錯誤のも含めて手元にころころ転がってるのだけど、今回はじめてDocker Hub Registryに登録してみた。Githubとの連携前提で。

設定手順は基本的に[User Guide](http://docs.docker.com/userguide/dockerrepos/#automated-builds)にある通り。

手順進めるうえで特に何も困らなかった。すばらしい。

README.mdは存在してるほうを使いますよ？とか親切なダイアログ文面でたくらいにして。

これでDockerfileなど修正をGithubにpushすれば勝手にDocker Hub Registryのほうでビルド検証もしてくれて、修正内容も反映される。

ただREADME.mdを修正＆pushしてもビルド走っちゃうのはなんか申し訳ないです・・・。
td-agent2のfluent-pluginをbundlerで管理

CentOS6、td-agent2.1.3を前提に書きます。

## sysconfigを編集

```/etc/sysconfig/td-agent
TD_AGENT_ARGS="/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --gemfile /etc/td-agent/Gemfile --use-v1-config"
PATH="${PATH}:/opt/td-agent/embedded/bin"
```

* bundlerにpathが通っていないと何も言わずエラーになる。

## Gemfileを配置

現在インストールされているプラグインを移行する。

以下をサーバー上で実行し、

```bash
$ GEM_HOME='/opt/td-agent/embedded/lib/ruby/gems/2.1.0/' gem list --local | grep "fluentd\|fluent-plugin" | ruby -ne 'gem = $_.split(" ");puts %Q{gem "#{gem[0]}", "#{gem[1].gsub("(","").gsub(")","")}"}'
```

上記ワンライナーの結果をGemfileに記述。

```Gemfile:/etc/td-agent/Gemfile
source 'https://rubygems.org'

gem "fluent-plugin-mongo", "0.7.4"
gem "fluent-plugin-rewrite-tag-filter", "1.4.1"
gem "fluent-plugin-s3", "0.5.1"
gem "fluent-plugin-scribe", "0.10.14"
gem "fluent-plugin-td", "0.10.23"
gem "fluent-plugin-td-monitoring", "0.2.0"
gem "fluent-plugin-webhdfs", "0.4.1"
gem "fluentd", "0.10.58"
gem "fluentd-ui", "0.3.11"

gem 'fluent-plugin-http_shadow', github: 'toyama0919/fluent-plugin-http_shadow'

```

それ以外にも依存Gemがあったら自分で追記する。

githubからのインストールも可能。

## 再起動

以下を実行するとbundle installが開始される。


```bash
$ sudo /etc/init.d/td-agent restart
```

bundle installが成功したらshutdownがされる点がgood！

bundle installが失敗すればshutdownされない。

上記の場合は`/etc/td-agent/vendor/bundle/`にpluginやfluentd本体がインストールされる。

* CentOS7の場合は先にshutdownされてしまった。。
  * systemd周りで挙動が違う？


## エラーになったら？

### nokogiriでエラー

aws-sdk(fluent-plugin-s3が依存)でnokogiriが使われているので、お決まりの対応。。

```bash
$ sudo yum install libxml2 libxml2-devel
```

```diff:/etc/td-agent/.bundle/config
+ BUNDLE_BUILD__NOKOGIRI: "--use-system-libraries"
```

### 権限周りのエラー

起動ユーザーをrootにしてみる

```diff:/etc/sysconfig/td-agent
TD_AGENT_ARGS="/usr/sbin/td-agent --group td-agent --log /var/log/td-agent/td-agent.log --gemfile /etc/td-agent/Gemfile --use-v1-config"
PATH="${PATH}:/opt/td-agent/embedded/bin"
+ DAEMON_ARGS="--user root"
```


## 当然デメリットもある

Gemfileでpluginを管理出来るのはメリットではあるが、td-agentはpluginのversionも含めてテストされたものであるため、ある意味fluentdを直接使うのと同じようなことになる。

td-agentをアップデートした後にGemfileも書き換えるみたいなことは出来れば避けたい。

逆に言うとfluentdのバージョンアップ等はGemfileで完結する。(0.12系にするとか)

@sonotsさんの[ブログ](http://blog.livedoor.jp/sonots/archives/42259221.html)を参考に、pluginのversionが書かれたtd-agent公式のGemfileを用意してもらい、Gemfile.pluginみたいな別のGemfileでpluginを管理するのが一番やりやすいかと思う。
(※TDの方、見てたらご検討お願いします。。)
【Unity】iOS/Android用にビルドしたらtextureが表示されない??


# 事象
あるtextureがデバッグ画面ではちゃんと表示されている、PC用にビルドしてもちゃんと表示されている。
けどiOS/Android用にビルドすると表示されずに真っ黒...なぜ??

# 解決方法
よくみたら、こんな表示が...

![スクリーンショット 2015-01-31 18.07.26.png](https://qiita-image-store.s3.amazonaws.com/0/29775/c0893633-436e-b339-3428-87ea779a90d8.png "スクリーンショット 2015-01-31 18.07.26.png")

ちゃんと、なんか書いてありますね...
このシェーダーは重すぎるかもってことらしい。
Diffuseとかのシェーダーに変更したら解決した!
Docker コンテナ内でタスクを cron 起動する

定期的な巡回とか、DBの古いレコードを定期的に削除するとか、決まった作業を cron で実行する場面は多いと思います。

そういった cron で処理したい環境を Docker コンテナとしてパッケージするときのお話。

#Docker コンテナで cron を使う


Docker コンテナ内部は init 等を使っていないので daemon の類は基本動かしません。
コンテナという管理単位を考えると、1コンテナ 1機能で、起動するのも 1つのタスクとするのが標準的な考えです。

普段ホストで定期作業のために使っている cron は daemon として起動しているものですが、daemon が使えないと無理のように見えますがそうではありません。cron というタスク1つだけが起動しているコンテナにすれば良いのです。

具体的にはコンテナの起動コマンドを ```cron -f``` とします。
cron そのものを起動し、なおかつ foreground 実行で daemon 実行させないという形にします。

Dockerfile では

```Dockerfile
RUN apt-get install -y cron
RUN echo '*/5 * * * * root /path/to/your_command' >> /etc/crontab
CMD ["cron", "-f"]
```

と言うような設定となります。

とまあここまでは教科書通りのおさらい。

#cron で起動するタスクに Docker コンテナの環境変数を渡す


ここからが本題。

##なにが問題なのか

cron が起動するタスクは cron のもつ独自の環境変数空間にあり、```cron -f``` で起動したとしても Docker コンテナ起動時の環境変数を引き継ぎません。

ですが、Docker コンテナを操作するために環境変数を介して設定を与えることが多々あります。具体的には ```--link``` オプションで他のコンテナ情報を与えるときなどです。

データベースコンテナのアドレスとポートを link で与えたとしても、cron 起動時にそれを引き継ぎませんので結果 cron で起動されたタスクでデータベース接続先が分からないといった事になります。

これでちょっと悩んだというのが当記事の発端なのでした。

##取りあえず解決してみた

割と悩んで色々試したのですが、うまい解決方法を見つけられず以下の様な対処法を取ってみました。

 1. Docker コンテナ起動時に環境変数をファイルに書き出した後 cron を起動
 2. cron が起動するスクリプトの頭で保存して置いた環境変数列挙のファイルを読み込み
 3. 環境変数ファイルを読み込んだあと、目的である cron タスクを起動

具体的なスクリプトは以下のようになります

```sh:execcron
#!/bin/sh
printenv | awk '{print "export " $1}' > /root/env.sh
/usr/sbin/cron -f
```

環境変数を env.sh に保存してから cron を foreground で起動するスクリプト。
Docker コンテナの CMD ではこのスクリプトを起動します。

```sh
#!/bin/sh
. /root/env.sh
yourwork
```

cron から起動するのはこちらのスクリプト。
env.sh を読み込んでから、目的となるコマンドやスクリプトを実行します。

##取りあえず動いている

なんとなくやっつけ感ただよう対処ですが、動いているのでいまのところコレで良しとしています。
Pepper のカメラ映像をライブ配信する実験 その2


## はじめに

* 「[Pepper のカメラ映像をライブ配信する実験](http://qiita.com/Suna/items/4480492a2fd937aaf1f3)」の続きです。
* 若干ですが前進し、条件付きでは実現できそうな予感がします。ただ、まだまだ理想の形には遠い状態です。

## 案1 HTTP Live Streaming (HLS) を使用

### 案1-1 ~~Pepper 内に FFmpeg がインストールされているならば、それを使用してインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成できるのではないか~~ (続き)

前回の後、「そういえば -f video4linux2 のオプションをつけていたら結果は違っただろうか」と思ったところがあり、今回、オプションをいろいろ試してみました。結論としては概ね以下の通り。

* 以下のコマンドで Pepper 内蔵の ffmpeg を使用して /dev/video0 からの入力を動画ファイル化できる。

```bash
$ ffmpeg -f video4linux2 -s 320x240 -r 10 -i /dev/video0 -pix_fmt yuv420p video.mp4
```

* ただ、残念ながらバージョンが古く、HTTP Live Streaming のためのセグメンタ機能は入っていないよう。

 * -f segment -segment_* 等のオプションをつけて実行すると、コマンドは失敗し、Pepper との接続が切れてしまう。 **さらに Pepper は再起動するしないと、再度接続できなくなる** っぽい。

ということで、Pepper の ffmpeg のみでは HLS での配信は無理そうです。

### 案1-2 Pepper 内蔵の FFmpeg で動画ファイルを生成し、別マシンの新しいバージョンの FFmpeg のセグメンタ機能でインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成する

* 1. 案1-1 のコマンドだと1動画ファイルの容量が増加し続けるので、録画時間のオプション(-t)を追加で指定します。

```bash
$ ffmpeg -f video4linux2 -s 320x240 -r 10 -i /dev/video0 -pix_fmt yuv420p -t 15 video.mp4
```

* 2. 別マシンに生成した動画ファイルをコピーします。
* 3. 別マシンの新しい ffmpeg で HLS のファイルを生成します。

```bash
$ ffmpeg -i video.mp4 -f segment -segment_format mpegts -segment_time 5 segment-list video.m3u8 video%04d.ts

$ ls -la video*
-rw-r--r--  1 suna  staff     201  1 31 18:06 video.m3u8
-rw-r--r--  1 suna  staff  566197  1 31 18:02 video.mp4
-rw-r--r--  1 suna  staff  296100  1 31 18:06 video0000.ts
-rw-r--r--  1 suna  staff  205860  1 31 18:06 video0001.ts
-rw-r--r--  1 suna  staff  116560  1 31 18:06 video0002.ts
```

* 4. 以下のような HTML を作成して、動画を再生します。

```index.html
<html>
  <head>
    <title>HLS test</title>
  </head>
  <body>
    <video src="./video.m3u8" controls>
  </body>
</html>
```

この流れで PC で動画の再生が確認できました。1〜4 を繰り返せばカメラ映像が表示できそうです。

ただ、Pepper と別マシンで 2 回 ffmpeg を通さないといけないのと、中間ファイルを作らないといけないのは、どうにも無駄に感じます。

### 案1-3 (未確認) Pepper 内蔵の FFmpeg で動画データを取得し、パイプを通して、別マシンの新しいバージョンの FFmpeg のセグメンタ機能でインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成する

まずは中間ファイルを作らないようにするため、パイプを通すのはどうでしょう。

別マシン側から以下のようなコマンドを実行します。

```bash
$ ssh nao@IP_Address "ffmpeg -f video4linux2 -s 320x240 -r 10 -i /dev/video0 -pix_fmt yuv420p -f mp4 pipe:1" | ffmpeg -f segment -segment_format mpegts -segment_time 5 segment-list video.m3u8 video%04d.ts
```

このコマンドは未確認なのですが、こちら「[ffmpegを応用する。ファイル転送しながら、エンコード](http://takuya-1st.hatenablog.jp/entry/20120302/1330675856)」の情報によると、mp4 のパイプはダメそうな感じがします。

### 案1-4 (未確認) Pepper 内蔵の FFmpeg で動画データを取得し、生データ・あるいはパイプ可能なデータ形式でパイプを通して、別マシンの新しいバージョンの FFmpeg のセグメンタ機能でインデックスファイル(.m3u8)とセグメントファイル(.ts)を生成する

これも未確認ですが、何となくいけそうな予感がします。
次のアトリエ秋葉原の開発タッチ＆トライに参加したときに試してきます。

次回へ続く。

## 感想

* やはり手元に Pepper 実機がないと、思うように進みませんねぇ。
Androidでtouchmoveが連続的に取得できない問題


スマートフォンのtouchmoveイベント、iPhoneではスワイプ動作をしている間、連続的に発生する仕様になっているが、
どうやらAndroidでは最初の1回(動き始めた時)しか発生しないっぽい。(もしくは一部そういう機種がある)

この問題を解消するには、touchmoveイベントに対してpreventDefaultを行うことで処理できる。
スマホでも通用するGoogle Mapsで中心にCrosshairを配置する方法

Google Mapsで地図の中心にCrosshair（十字）を描こうとすると、ちょっと面倒ですよね。
![crosshair.png](https://qiita-image-store.s3.amazonaws.com/0/62792/80436d7a-924c-5a53-1cf5-c61547a0a1e6.png)

google maps crosshairなどでググると、OverlayViewに配置して、地図の中心が変わるたびに再描画する、という以下のような方法が紹介されています。

```js:PCオンリーな方法
function Crosshair() {
	this.setMap(map);
	this.div_ = document.createElement('div');
	this.div_.innerText = "+";
	this.div_.id = "crosshair";
};
Crosshair.prototype = new google.maps.OverlayView;
Crosshair.prototype.onAdd = function() {
	var pane = this.getPanes().overlayLayer;
	pane.appendChild(this.div_);
	var me = this;
	this.listeners_ = [
		google.maps.event.addListener(this.getMap(), 'center_changed',
			function() { me.draw(); })
	]
}
Crosshair.prototype.draw = function() {
	var projection = this.getProjection();
	var position = projection.fromLatLngToDivPixel(map.getCenter());
	var div = this.div_;
	div.style.left = position.x + 'px';
	div.style.top = position.y + 'px';
}
crosshair = new Crosshair();
```
これをスマホなどの非力な端末でやると、地図の中心を変更するたびに、Crosshairが中心点からずれてしまってみっともないことになります。

この方法よりももっと簡単でスマホにも優しいのは、地図とは別の（Google Maps管轄外の）DOM要素を配置して、それを地図上に重ねる方法です。
具体的には、HTMLタグで地図キャンバスとCrosshairのDIVを以下のように配置し、

```html:HTML
<div id="wrap">
	<div id="map-canvas"></div>
	<div id="cross"></div>
</div>
```
CSSで地図の上にDIVを配置します。

```css:CSS
#wrap{
	width: 300px;
	height: 300px;
	position: relative;
}
#map-canvas{
	width: 100%;
	height: 100%;
}
#cross{
	position: absolute;
	width: 2px;
	height: 20px;
	background: #000;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
	pointer-events: none;
}
#cross::before{
	content: "";
	position: absolute;
	width: 20px;
	height: 2px;
	background: #000;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -50%);
}
```

ポイントは、"pointer-events: none;" で、地図よりも手前（z-indexが上）にあるCrosshairのDIVをマウスやタッチ操作から無効化することです。

これでスマホにも優しいCrosshairの出来上がりです。
[デモ](http://jsfiddle.net/egak/X5r8r/2351/)
BeagleBone Blackのファームウェアを入れ直す - Part3: SDカードのUbuntu14.04.1の無線LAN設定

[Ubuntu 14.04.1をSDカードから起動](http://qiita.com/masato/items/49961968cfed2c9d95aa)して、USB-シリアル接続ができるようになりましたが、[USB Gadget](http://www.linux-usb.org/gadget/)を使ったUSB-Ethernet接続ができません。無線LANの設定をしてインターネットに接続できるようにします。

## 無線LANの設定

PuttyからUSB-シリアル接続をしてコンソールを表示します。BeagleBone Blackは[Anker 40W 5ポート](http://www.amazon.co.jp/dp/B00GTGETFG)などUSB電源アダプタに接続します。この状態だとインターネットに接続できないので、まずは無線LANの設定をします。`/etc/network/interfaces`にSSIDとキーを記述します。

```bash:/etc/network/interfaces
# WiFi Example
auto wlan0
iface wlan0 inet dhcp
    wpa-ssid "xxx"
    wpa-psk  "xxx"
```

無線LANのUSBドングルは余っていた[BUFFALO WLI-UC-GNM2](http://www.amazon.co.jp/dp/B005DU4XSM)を使いました。USBドングルを挿して無線LANの確認をします。

``` bash
$ sudo ifup wlan0
$ ip addr show wlan0
5: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 4c:e6:76:42:4f:a3 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.8/24 brd 192.168.1.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::4ee6:76ff:fe42:4fa3/64 scope link
       valid_lft forever preferred_lft forever
```

名前解決もできています。

``` bash
$ ping -c 1 www.yahoo.co.jp
PING www.g.yahoo.co.jp (183.79.139.228) 56(84) bytes of data.
64 bytes from f2.top.vip.kks.yahoo.co.jp (183.79.139.228): icmp_seq=1 ttl=53 time=24.6 ms
...
```

## PuttyからSSH接続

Puttyから`192.168.1.8`にSSH接続することができました。

``` bash
Using username "ubuntu".
Ubuntu 14.04.1 LTS

rcn-ee.net console Ubuntu Image 2015-01-06

Support/FAQ: http://elinux.org/BeagleBoardUbuntu

default username:password is [ubuntu:temppwd]

ubuntu@192.168.1.8's password:
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.14.26-ti-r43 armv7l)
```
bundleしてるgemにcdする。pecoで絞り込みつつ

`bundle show [GEM名]`でフルパス取得できるので、peco使う場合、こんなのでいいではないか

```zsh
cd $(bundle show | sed -e '1d' | cut -d'*' -f2 | cut -d' ' -f2 | peco | xargs bundle show) 
```

![peco_bundle.gif](https://qiita-image-store.s3.amazonaws.com/0/30715/37b6ed51-fec7-b98e-bc75-780cc5149c3c.gif)

【追記】

以下でも同様のことが実現できるしコードが短い、 @masutaka thx!

```zsh
cd $(bundle show --paths | peco)
```


### .zshrcに書く場合の参考

* http://qiita.com/udzura/items/53d51af129b400fd2b45
* http://hisaichi5518.hatenablog.jp/entry/2014/07/15/220651
* http://qiita.com/yuku_t/items/78107016af9eb78d5804
S3の操作


メモ書き

## 主に扱うオブジェクトは3種類

1. client（AWSとの接続を行う）
2. bucket（親ディレクトリ）
3. object（ファイル）

## 1.client
s3を操作する主体となる

```ruby 
require 'aws-sdk'

AWS.config({
	:access_key_id => as.access,
	:secret_access_key => as.secret,
})

s3 = AWS::S3.new
```

## 2.bucket
### バケットを作成

誰かが既に使っているバケット名は使用できない。

```ruby
s3.buckets.create 'angelbeats'
#=> AWS::S3::Errors::BucketAlreadyExists: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

s3.buckets.create 'angel-beats'
#=> #<AWS::S3::Bucket:angel-beats>
```

### バケットの存在
あるバケットないしオブジェクトが存在するか？は`exists?`
誰かが使っており、権限がないバケットに対しては、当たり前だが弾かれる。

```ruby
s3.buckets['angel-beats'].exists?
#=> true

s3.buckets['angel----beats'].exists?
#=> false

s3.buckets['angelbeats'].exists?
#=> AWS::S3::Errors::AllAccessDisabled: All access to this object has been disabled
```

## 3.object

### オブジェクトの作成
存在しないobjectをwriteすると、S3サーバにファイルが生成される。

```ruby
obj = s3.buckets['angel-beats'].objects['test.txt']
#=> <AWS::S3::S3Object:angel-beats/test.txt>

obj.exists?
#=> false

obj.write("天使ちゃん")
#=> <AWS::S3::S3Object:angel-beats/test.txt>

obj.exists?
#=> true
```

### オブジェクトのURLの確認、アクセス権限の操作
存在するobjectには、一意のURLが与えられている。
とはいえ、デフォルトでは「プライベートリンク」になっている。

```ruby
obj.public_url.to_s
#=> "https://angel-beats.s3.amazonaws.com/test.txt"

# "https://angel-beats.s3.amazonaws.com/test.txt"をブラウザで開くと：
# <Message>Access Denied</Message>
```

パブリック属性を与えれば、URLで観覧できる。

```ruby
# write時
obj.write("天使ちゃん", acl: :public_read)

# 後付け
obj.acl = :public_read

# 戻す
obj.acl = :private
```

### オブジェクトの読み出し
なお、パブリック属性をつけなくても、権限を持つclientなら`read`で読み出せる。

```ruby
obj.read
#=> "\xE5\xA4\xA9\xE4\xBD\xBF\xE3\x81\xA1\xE3\x82\x83\xE3\x82\x93"

obj.read.encoding
#=> #<Encoding:ASCII-8BIT>

obj.read.force_encoding('utf-8')
#=> "天使ちゃん"
```


## その他
### あるバケットの、ファイルやフォルダの一覧を取得

```ruby
# バケット内のファイル＆ディレクトリ一覧
s3.buckets['angel-beats'].objects.map(&:key)
#=> ["test.txt"] 

# ファイル（ツリーの葉っぱ）一覧
s3.buckets['angel-beats'].as_tree.children.select(&:leaf?).map(&:key)
#=> ["test.txt"]

# フォルダ（ツリーの枝）一覧
s3.buckets['angel-beats'].as_tree.children.select(&:branch?).map(&:prefix)
#=> []
```

## 参考
[ローカル環境のRubyとAmazon S3でデータをやり取りする - 未踏作業日誌――余計なもの作るよ！](
http://grgsiberia-mitou.hatenadiary.jp/entry/2014/01/17/000310)
SipHashについてのメモ

# SipHashとは

従来、プログラミング言語の連想配列に用いられるハッシュ関数は十分シンプル（＝高速）かつ通常の利用で衝突しにくい関数が利用されていました。多くのプログラミング言語ではDJBX33AやDJBX33Xが使われていたようです。

しかし、HashDoSという意図的にハッシュの衝突を起こすような攻撃が問題視されて紆余曲折あった後、現在多くの言語の連想配列で利用されているハッシュ関数がSipHashです。

HashDoSを防ぐには暗号論的ハッシュ関数でないといけないようで、かつ連想配列のような用途では速度も重要なのでこのような新たなハッシュ関数が開発されたようですね。詳しくはリンク先を参照のこと。

- [SipHash: a fast short-input PRF](https://131002.net/siphash/)
- [SipHashとAdvanced Hash Flooding - 不意になにかを残すブログ](http://causeless.seesaa.net/article/307716879.html)
- [Hash-flooding DoS と SipHash - あどけない話](http://d.hatena.ne.jp/kazu-yamamoto/20130805/1375692951)

# 各種プログラミング言語・ミドルウェアにおける実装例

- [Python](https://hg.python.org/cpython/rev/adb471b9cba1)
- [Redis](https://github.com/antirez/redis/pull/718/files)
- Perlはリンク先がわからず。hv_func.hに記述があった模様。
- Rubyはリンク先がわからず。ソースコードを落としてきて確認しました。

どの実装も、基本的には/dev/urandomからseedを与える方針ですかね。
UISearchBarのクリアボタン表示を制御する


検索バーのクリアボタン表示制御は通常できません。検索バーにキーワードが入力されていれば、フォーカスが外れていても、クリアボタンが常に表示されている状態になっています。
その動作を変更したい場合、例えば検索バーにフォーカスがあたっている場合のみクリアボタンを表示したい場合、UISearchBarのtextFieldを探してクリアボタンの表示モードを変更する必要があります。

iOS SDKのバージョンによっては、`UISearchBar.subviews`を検索すれば見つかる場合もあるようですが、iOS 7/8では、もう一段下の階層にtextFieldが追加されているため、再帰的に検索すると見つけることができます。

ということで、クリアボタンを制御するには、以下のように`UISearchBar`のカテゴリを作成すれば実現することができます。毎回検索バーのクリアボタンを検索するのは面倒なので、最初にアクセスしたときのみ検索しオブジェクトにキャッシュさせておけばいいでしょう。

```objectivec
// UISearchBar+ConfigHacking.h
#import <UIKit/UIKit.h>

@interface UISearchBar (ConfigHacking)

/*!
    @abstract UISeachBarのsubviewを再帰的に検索して、TextFieldのclearButtonModeを変更/取得する
    @todo UISearchBarの構造が変更された場合、対応する必要がある
 */
@property (nonatomic, readwrite) UITextFieldViewMode textFieldClearButtonMode;

@end

// UISearchBar+ConfigHacking.m
#import "UISearchBar+ConfigHacking.h"

#import <objc/runtime.h>

static const NSUInteger MaxRecursiveDepth = 3;

#pragma mark -

@implementation UISearchBar (ConfigHacking)

- (UITextField *)retrieveTextFieldInView:(UIView *)view depth:(NSUInteger)depth {
    if (depth >= MaxRecursiveDepth) {
        return nil;
    }
    for (UIView *subview in view.subviews) {
        if ([subview isKindOfClass:[UITextField class]]) {
            return (UITextField *)subview;
        }
        UITextField *textField = [self retrieveTextFieldInView:subview depth:depth+1];
        if (textField) {
            return textField;
        }
    }
    return nil;
}

- (UITextField *)ch_searchField {
    UITextField *textField = objc_getAssociatedObject(self, _cmd);
    if (textField) {
        return textField;
    }

    @synchronized(self) {
        textField = [self retrieveTextFieldInView:self depth:1];
        objc_setAssociatedObject(self, _cmd, textField, OBJC_ASSOCIATION_ASSIGN);
    }
    return textField;
}

- (UITextFieldViewMode)textFieldClearButtonMode {
    UITextField *searchField = [self ch_searchField];
    if (searchField) {
        return searchField.clearButtonMode;
    }
    return UITextFieldViewModeAlways;
}

- (void)setTextFieldClearButtonMode:(UITextFieldViewMode)textFieldClearButtonMode {
    UITextField *searchField = [self ch_searchField];
    if (searchField) {
        searchField.clearButtonMode = textFieldClearButtonMode;
    }
}

@end
```

このカテゴリを使えば、検索バーにフォーカスがあたっている時のみクリアボタンを表示したい場合、`textFieldClearButtonMode`に`UITextFieldViewModeWhilteEditing`を設定すれば変更できます。

```objectivec
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 44)];
self.searchBar.textFieldClearButtonMode = UITextFieldViewModeWhileEditing;
```

Storyboardに追加した検索バーのクリアボタン表示モードを変更したい場合は、 _User defined runtime attributes_ を使って変更すればよいでしょう。

* Key Path: `textFieldClearButtonMode`
* Type: `Number`
* Value: 1
git管理下のファイル内の文字列を一括置換するワンライナー


例えばすべての`getById`を`fetchById`に変えたいときに打つ。

```
git grep -l getById | xargs perl -pi -e 's@getById@fetchById@g'
```

## 解説

### `git grep -l`

対象の文字列が現れるファイル名だけ列挙する。

### `perl -pi -e 's/aaa/bbb/g' filename`

perlのドキュメントにも出てくるイディオム的なオプションで、ファイルの中の文字列を置換する。

ファイル名はそのままで内容を置換するのはGNU sedにも `-i / --in-place` オプションがあるが、Macのsedだと使えないのでperlでやると良い。

`/` は `@` でも `%` でも適当な記号で良い。スラッシュはコード内に出てくることが多いので、自分は `@` をよく使う。
jenkinsを立ち上げたときに、nginxでやっておく設定：メモ

```conf:default.conf
server{
  listen 80;
  server_name hogehoge.com;

  return 301 https://$host$request_uri;
}

server {
  listen 443;
  server_name hogehoge.com;

  access_log /var/log/nginx/direct_ssl.log;

  ssl on;
  ssl_certificate /etc/nginx/ssl/server.crt;
  ssl_certificate_key /etc/nginx/ssl/server.key;

  location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    proxy_pass http://localhost:8080;
#    auth_basic "Restricted";
#    auth_basic_user_file /etc/nginx/.htpasswd;
  }

}
```
2月がカレンダーに4行7列ですっぽりハマる年を求めるスクリプト

2月1日が月曜日で かつ 28日までの(うるう年ではない) 年を探す

```php
<?php
$year_list = array();
for ($y = 0; $y < 3000; $y++) {
    // 2月1日の曜日と うるう年かどうかを取得
    list($w, $L) = str_split(date('wL', strtotime("$y-2-1")));
    if (!$L && $w == 0) {
        $year_list[] = $y;
    }
}
echo implode(', ', $year_list);
```
Railsにフォロー機能などを実装してみる

RailsでフォローやブロックといったSNS的な機能を実装すると、関連の定義などでモデルが肥大化したりとやや面倒。
この機能をモジュールとして提供してくれる [acts_in_relation](https://github.com/kami30k/acts_in_relation/) というGemを導入してみたのでメモ。

※ 内容はほぼ README のものです

## 準備

まずサンプルアプリケーションを生成する。

```
$ rails new sample 
```

[acts_in_relation](https://github.com/kami30k/acts_in_relation/) を追加する。

```rb
gem 'acts_in_relation'
```

インストールする。

```
$ bundle
```

## 手順

ここではユーザ同士のフォローについて書く。
（ユーザが記事にいいねをつける、など他モデルとの関連も実装できるが、そちらは [README](https://github.com/kami30k/acts_in_relation/) を参照のこと）

### 1. モデルを生成する

```
$ rails g model User name:string
$ rails g model Follow user_id:integer target_user_id:integer
```

### 2. インデックスを張る

```ruby
class CreateFollows < ActiveRecord::Migration
  def change
    create_table :follows do |t|
      t.integer :user_id
      t.integer :target_user_id
      t.timestamps
    end

    add_index :follows, [:user_id, :target_user_id], unique: true
  end
end
```

### 3. acts_in_relation メソッドを書く

```ruby
class User < ActiveRecord::Base
  acts_in_relation with: :follow
end

class Follow < ActiveRecord::Base
  acts_in_relation :action, source: :user, target: :user
end
```

以上で、以下のインスタンスメソッドが追加される。

- `user.follow(other_user)`
- `user.unfollow(other_user)`
- `user.following?(other_user)`
- `user.following`
- `other_user.followed_by?(user)`
- `other_user.followers`

例えば、以下のような動きになる。

```ruby
user       = User.create(name: 'foo')
other_user = User.create(name: 'bar')

# Follow
user.follow other_user
user.following?(other_user)   #=> true
user.following                #=> <ActiveRecord::Associations::CollectionProxy [#<User id: 2, name: "bar", created_at: "2015-01-10 01:57:52", updated_at: "2015-01-10 01:57:52">]>
other_user.followed_by?(user) #=> true
other_user.followers          #=> <ActiveRecord::Associations::CollectionProxy [#<User id: 1, name: "foo", created_at: "2015-01-10 01:57:42", updated_at: "2015-01-10 01:57:42">]>

# Unfollow
user.unfollow other_user
user.following?(other_user)   #=> false
user.following                #=> <ActiveRecord::Associations::CollectionProxy []>
other_user.followed_by?(user) #=> false
other_user.followers          #=> <ActiveRecord::Associations::CollectionProxy []>
```
これで納得、Apple Developerの証明書の関連図と手順書（超簡易版）

カオスなApple Developerの証明書やAppID、プロビジョニングファイルの関連を図にしてみた。

![Untitled (2).png](https://qiita-image-store.s3.amazonaws.com/0/46529/d1da7b15-883c-55fd-f76d-abc749e321fa.png)


App 簡易手順書

１．キーチェーンアクセスから、CSR（認証局に証明書を要求で作成）を3つ作成する
　・アプリ用
　・Push通知 本番用
　・Push通知 テスト用

２．Appリリース・AdHoc用のCertificatesを適応する。
　・１のアプリ用をアップロード
　
３．AppIDを２作成する
　・本番用
　・テスト用

４．PUSH通知用の証明書を適応する
・Production SSL Certificate ＞ １のPush通知 本番用を利用
・Development SSL Certificate ＞ １のPush通知 テスト用を利用

３．Provisioning Profilesを２つ作成する
　・本番用
　・AdHoc用

４．Xcodeのビルド設定やArchive時に対象のProvisioningとCertificatesを選択する。

少しは、脳内整理できたかも。。。ｗ

でも、カオスｗ
Rakeタスク実行前に別タスクを実行する書き方


案外ググっても出てこなかったので一応

##やり方
事前に実行したいタスクをハッシュの値に設定してあげます

```ruby:hogefuga.rake
# taskの引数をハッシュにする
task hoge: :fuga do
  puts "executed hoge"
end

task :fuga do
  puts "executed fuga"
end
```

実行すると...

```bash
$ rake hoge
executed fuga
executed hoge
```

hogeタスクの前にfugaタスクが実行されました!
【JavaScript】"1" == trueがtrueになる理由

私[JavaScript芸人](http://kenjimorita.jp/category/javascript/)が説明させていただきます。。

"1" == trueがtrueになる理由

型変換の際にどちらかのオペランドがtrueの場合1に変換され(falseの場合は0)こうなる
"1" == 1

さらにどちらか一方の値が数値で、他方が文字列の場合、

文字列が数値に変換される
1 == 1

//true

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/64377/5e71aefc-0f77-b9a7-fff4-06284ac22689.jpeg)
任意の単位での切り捨て、切り上げ、四捨五入

めもめも

```round.clj
(defn half [x] (/ x 2))
(defn floor [value unit]
  {:pre [(pos? unit)]}
  (cond
   (Double/isNaN value) value
   (Double/isInfinite value) value
   :else  (let [q (quot value unit)]
            (* unit (if (neg? (rem value unit))
                      (dec q) q)))))

(defn ceil [value unit]
  (- (floor (- value) unit)))

(defn round [value unit]
  (floor (+ value (half unit)) unit))
```

```:結果
(floor 3.7 2.5)  ;2.5
(ceil 3.7 2.5)   ;5.0
(round 3.7 2.5)  ;2.5
(round 3.8 2.5)  ;5.0
(floor 12.34 0.1);12.3
```
小さなお友だちの為の　MacOsXでBASIC #4 サインカーブ


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#サインカーブ
##03.BAS
今までとは、少し違います。
ｘ，ｙ成分の単位が違います。こんな乱暴なことが出来るのはBASICならでは？

```bas:03.BAS
10 OPTION ANGLE DEGREES
20 DEF f(x)=sin(x)
30 SET WINDOW -360,360,-4,4
40 DRAW GRID(90,1)
50 FOR x=-360 TO 360
60    PLOT LINES: x,f(x);
70 NEXT x
80 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-01 11.51.12.png](https://qiita-image-store.s3.amazonaws.com/0/33317/3a254647-fbc6-42b4-950f-a1dc78396e62.png "スクリーンショット 2015-02-01 11.51.12.png")
latexmkを使う

今更ですが使うようにしてみました。
# .latexmkrcを使う
配置場所はホームディレクトリかコンパイルするファイルがあるディレクトリ。
そのディレクトリにあればそのファイルを、なければホームディレクトリにあるファイルを読むみたい。
.latexmkはperlで書くらしい。

```
#!/usr/bin/perl

$latex = 'platex -synctex=1 %O %S';
$bibtex = 'pbibtex %O %B';
$dvipdf = 'dvipdfmx %O %S';
$pdf_mode = 3;

if ($^O eq 'darwin') {
    $pdf_previewer = 'open -a Preview';
} elsif ($^O eq 'linux') {
    $pdf_previewer = 'evince';
}
```

実は細かいオプションはあんまり確認していません。
それぞれの変数に使用するコマンドを書けばよさそう。
細かい説明は参考資料の方を。

自分の場合はMacとLinuxで使うから$pdf_previewerは環境に合わせて指定してあげる。

# 実行する

```
% latexmk xxx.tex
```

としてあげれば、pdfの生成までをやってくれる。使えるオプションは

* -pv
コンパイルが完了したら```$pdf_previewer```で指定したコマンドを使ってpdfのプレビューを表示してくれる。

* -pvc
-pvオプションと同じ。ただ、ソースファイルが更新されたら自動で再コンパイルをかけてくれる

* -c
変換途中に生成したファイルを削除してくれる。logファイルとか。

* -C
出来たファイル全部消す。dviファイルとかpdfファイルとか。


よく使うオプションとかはaliasで登録しておくのがいいんじゃないかな。

## 追記
perlだと```$^O```でOS名が取れるらしいので、そっちに修正。


# 参考資料
* [latexmkで楽々TeXタイプセットの薦め](http://konn-san.com/prog/why-not-latexmk.html)
* [勉強ノート:latex:latexmk](http://rmn-web.net/docs/doku.php?id=%E5%8B%89%E5%BC%B7%E3%83%8E%E3%83%BC%E3%83%88:latex:latexmk)
* [修論が終わってからlatexmkの存在に気がついた](http://d.hatena.ne.jp/goth_wrist_cut/20120214/1329186414)
CordovaでのGradleによるiOS Xcode buildからの〜testFlight!!! 日本語のプロジェクト名もOK

Cordovaによるプロジェクトを進めているが、一つ困ったことがあった。

## Xcodeのビルドが面倒なのよ。。。（笑

面倒な理由が以下の例

* 日本語でプロジェクト名が作れない。・・・Buildさえ出来ないからね。。。
* なんか、色々とAppleに引きずられて、自動ビルドとかの文化が無いんじゃないの？
* コマンドラインツールもあるのでshellでなんとかなりそうだけど、コマンドもカオスだよね
* AdHocリリースするのは良いんだけど、いちいちプロビジョニングとか、開発者に渡さないとならんし、めんどくせぇ。。。
* まあ、その他諸々。

で、いろいろ調べましたよ。うん、いろいろと。

## Gradleの Xcode Build プラグインを作ってくれてる、神な人が・・・！

http://openbakery.org/gradle.php

素晴らしすぎます！
testFlightや、HockeyAppなどにも対応してるので、
gradleコマンドで、一発でAdHocがリリースできます。
※ 残念ながら、testFlightは2015/2/26で終了・・・現在iTunes Connect版を作成中？みたい

ここに、アプリ名や、BundleIDなどの設定をすれば、自由にコントロールできる。

ミニマムだと、こんな感じですかねー（確認はしてないので、調整して下さい）
これを、Cordovaなら、`/platforms/ios/build.gradle` として保存します。

```
buildscript {
    repositories {
        maven {
            url('http://openbakery.org/repository/')
        }
        mavenCentral()
    }
    dependencies {
        classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.9.+'
    }
}
apply plugin: 'xcode'

xcodebuild {
    sdk = 'iphoneos'
    target = 'target-project'
    scheme = 'target-project'
    configuration = 'Debug'
    sdk = 'iphoneos'
    signing {
        identity = 'jp.hoge.target-project'
        certificateURI = 'file://localhost/target-project/platforms/ios/Development.p12'
        certificatePassword = signingCertificatePassword // e.g. 'secret'
        mobileProvisionURI = 'file://localhost/target-project/platforms/ios/Development.mobileprovision'
    }

    infoplist {
        bundleIdentifier = 'テスト用のBundleID'
        bundleDisplayName = 'テスト用のアプリ名（日本語名でもOK）'
        version = 0.0.1 // 適当に日付とかで組み立てればOK
    }
    
    testflight {
        apiToken = 'testFlight API Token'
        teamToken = 'testFlight team Token'
        notes = 'Release notes for the build'
    }
}
```

## さらに、gulp.jsによるスクリプトと組み合わせるよー
これで、本体ビルドして、gradleを自動実行させることが可能になりました。

まずは準備。次のフォルダを用意します。
`src/platforms/ios`

このフォルダに、次のファイルをコピー

```
Development.p12 // CodeSignの鍵
Development.mobileprovision // CodeSignのプロビジョニングファイル
build.gadle // 上記のxcode buildタスクの入った、gradleファイル
```

このフォルダをリポジトリ管理して、再配布を簡略化してます。
セキュリティ的にどーのこーのとかいうプロジェクトだったら、
どこかセキュリティ的にもーまんたいなサイトに置いておけば良いんじゃ無かろうかと。

そして、Gulpの準備
必要なモジュールをインストールして。。。

```
npm install --save-dev run-sequence
npm install --save-dev gulp-shell
```

こちらが、ミニマムなコード

```
var runSequence = require('run-sequence');
var shell = require("gulp-shell");

////////////////////
// gradle build ios
////////////////////
gulp.task('gradle-ios', function () {
    runSequence('build', 'cordova-build-ios', 'platforms-ios-copy', 'gradle-build-ios');
});
// build ios platform.
gulp.task('cordova-build-ios', shell.task([
    'cordova build ios'
]));

// copy local platform.
gulp.task('platforms-ios-copy', function () {
    return gulp.src(['src/platforms/ios/**/*.*'])
        .pipe(gulp.dest('platforms/ios'));
});

// packaging Android
gulp.task('gradle-build-ios', shell.task([
    'cd ./platforms/ios;gradle --daemon integration' // integrationはGradleタスクなので、プロジェクトに応じて設定してね。 
]));
```

そして、たぶん、みんなが幸せになれるコマンドを叩く。
`gulp gradle-ios`


神プラグインに感謝。
Yosemite(Mac OSX 10.10.1)でbrew installしたphantomJSがcrashしたときの対処法

rspecでcapybara動かすときにphantomjsがcrashしてハマったのでメモ

## サマリ
* Yosemite (Mac OSX 10.10.1) で brew installした phantomJS@1.9.8 は動かない
* phantomjs@1.9.7-15 を入れると動く

## エラーが起きた環境
* Yosemite Mac OS 10.10.1
* phantomJS 1.9.8 (brewでinstallしたもの）

Yosemite(Mac OSX 10.10.1)は相性が悪く、
capybaraなどでphantomjsを使う際、下記のエラーが出る。

    PhantomJS has crashed. Please read the crash reporting guide ・・・

## 対処法
brewでバージョン指定面倒なので、npmでバージョン指定して入れる

    brew uninstall phantomjs
    npm  install   phantomjs@1.9.7-15
Common Lispでiteratorもどき

# 概要
Common Lispでiteratorもどきをつくってみました。ちなみに私はiteratorとは何かをあまりわかってないですが、それにも関わらず書いてます。分かったらそのうち書き直すと思います。
追記 (2015/02/01): LISP界隈(?)ではgeneratorと言うらしいです。

ユースケースは、`mapcar`にすると重く、さらに途中で中断するかもしれないからリスト全体を`mapcar`するのは無駄という割とニッチな場面なんだと思います。

# コード

```cl
;; iteratorはhas-nextとgetを持った構造体
(defstruct iter has-next get)

(defmacro each-iter ((var iter) &body body)
  `(loop while (funcall (iter-has-next ,iter)) do
     (let ((,var (funcall (iter-get ,iter)))) ,@body)))


;; 例
(defun primep (num)
  (loop for i from 2 to (sqrt num)
    when (= (rem num i) 0) do (return-from primep nil))
  t)

(defun get-next-prime (start)
  (loop for i from start
    when (primep i) do (return i)))

(defun make-prime-iter (start end)
  (let ((next-prime (1- start)))
    (make-iter
     :has-next
      (lambda ()
        (setq next-prime (get-next-prime (1+ next-prime)))
        (<= next-prime end))
     :get
      (lambda ()
        next-prime))))

(let ((count 0)
      (iter (make-prime-iter 1000 2000)))
  (each-iter (prime iter)
    (print prime)
    (incf count)
    (when (<= 10 count)
      (return))))
```

1000から2000までの素数を一度に列挙してリスト処理するのはさすがに重いので逐次処理になってます。最初の10個でいいや、みたいな時でもreturnできます。

見ての通りクロージャの威力が発揮されてます。

# 最後に
マクロで包まれているとはいえ、明示的に`funcall`するのはなんとかしたいですね。`defstruct`を工夫すれば大丈夫だと思います。

これってある種の遅延評価なんでしょうかね？
hubot + Twilioで寝ている社長を無理矢理起こす

障害発生の際など、やむをえず自宅で就寝中の社長を起こさないといけないことがある。インターネット時代においても遠隔地にいる人間の意識を強制的に遮る有効な方法は一つである。電話だ。

普通の人間なら順番にただ電話すれば良いのだが、我々は電話恐怖症を患うエンジニアである。過去のトラウマから誰かに電話をかけることが不安で仕方ない。

さらにはリモートワークの環境だと、アメリカ西海岸にいる社員が日本の電話番号に電話するのは色々と敷居の高さがある。素早く簡単に社長に電話し不機嫌にすることなく即座に目覚めさせる方法が必要だ。

このような課題を、我々が対処する方法はただひとつ「自動化」である。機械に電話させればよい。行末スペースをただひとつも許せないほど繊細な心を持つ我々と比べて、機械は感情がないので不機嫌な人間に当たられても何も感じない。

今回は、感情のないロボットに社長に電話させる方法を紹介する。

## Twilio
[Twilio](http://twilio.kddi-web.com/)というAPIから電話をかけられるサービスがある。

電話というとお高いイメージがあるが、案外お手軽な価格で月額108円で電話番号が取得でき通信料も安い。たまにイタズラ電話を発信する程度なら中学生のお小遣いでも大丈夫だ。

今回はこのNode.js SDKを利用して、hubotから呼び出す。これだけで電話がかけられる。

``` coffee
client = require('twilio')(accountSid, authToken)
call = (to, callback) ->
  client.calls.create(
    url: "https://dl.dropboxusercontent.com/u/your/voice.xml"
    to: to
    from: "+8150xxxxxxxx"
    method: "GET"
    fallbackMethod: "GET"
    statusCallbackMethod: "GET"
    record: "false"
  , callback
  )
```

urlにあるのは電話通話時にさせたい操作が書かれたTwiMLという要するにXMLファイルで、「○○と自動音声で発言する」「1キーが押されたら○○する」というような操作が書ける。

``` xml
<Response>
<Say voice="alice" language="ja-JP">おきて！おきて！おきて！</Say>
</Response>
```

こうすると、通話時にaliceちゃんが一方的におきてと言ってくれる。機械的な音声だが、野郎に深夜に電話で起こされることを考えたらはるかにマシだろう。

このXMLファイルは、URLから見える場所ならどこに置いてもいいのでDropboxのPublicフォルダに置いている。

## hubot
あとはさきほどの関数を呼び出すhubotスクリプトを書けばよい。

``` coffee
module.exports = (robot) ->
  robot.respond /call/i, (msg) ->
    call('社長の電話番号', ->
      msg.send 'calling calling'
    )
```

僕のいる会社では名簿から電話番号をとってきて、人を指定して電話をかけて呼び出せるようにしている。

[![Gyazo](http://i.gyazo.com/bca0b15e05d05ff4c3f4c90a5386ed63.png)](http://gyazo.com/bca0b15e05d05ff4c3f4c90a5386ed63)

## 実際
深夜の障害発生時に、躊躇することなく素早く社長やインフラ担当を目覚めさせることができ、見事に障害を乗り切った。いまや起床ですらChatOpsの一部である。
GistでClojureを公開する

　元ネタです。

> [Gist で Gem を公開する - Qiita](http://qiita.com/r7kamura/items/5e7d082d8e0d0471d71d)

> [Gist で Go を公開する - Qiita](http://qiita.com/mattn/items/6cad7b5dd73092b3d354)

　Gist に `project.clj` とコード片を置きます。

```clj
(defproject karen ""
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [org.clojars.pjlegato/clansi "1.3.0"]]
  :source-paths ["./"])
```

```clj
(ns karen
  (:require [clansi.core :as clansi]))
 
(def karen "
    |⌒^´￣￣       ／    ｀ヽ
    |         、   ＼  __ ヽ｜
    ト         ＼    ∨ ⌒ ヽ ∨
    |    ＼      ＼    ﾞ:. /
    |    |l＼      ∨ / |-く
    |    ||／＼     ∨  |ヾ)
    |＼／||＿_／X   |／｜
    |  ￣  _／    ＼|   }
    ﾄ      ィ笊气<个Ⅳ}/ ｲ
    |       r'Jﾊ  》|/ |
    |       V(ソ   ′|  |
    | .      \"\"   / 八 |
    | ,、     u 〃 /   |
    |         イ/ ∧_   |
 r‐Jr-=≦ {r=   / /ﾆﾆ}  ∧
r-=ｭ`ヽr--―┐    ∧ﾆﾆﾆ∧   ∧
 ―rヘ  |::::／／ﾆﾆﾆﾆﾆ∧   |
  (｀ヽﾉ:::/／ﾆﾆ／ﾆﾆﾆハ  |
")
 
(defn desu []
  (clansi/style karen :yellow))
```

プロジェクトから参照します。

```clj
(defproject kin-iro "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]]
  :plugins [[lein-git-deps "0.0.2-SNAPSHOT"]]
  :git-dependencies [["https://gist.github.com/woxtu/478278051482b9e0d34a.git"]]
  :source-paths [".lein-git-deps/478278051482b9e0d34a/"])
```

```sh
$ lein git-deps
```

```clj
(ns kin-iro
  (:require [karen]))

(println (karen/desu))
```

楽しい！₍₍ (ง╹◡╹)ว ⁾⁾

> [tobyhede/lein-git-deps - GitHub](https://github.com/tobyhede/lein-git-deps)

> [woxtu/karen.clj - GitHub Gist](https://gist.github.com/woxtu/478278051482b9e0d34a)
mrubyの古いコードが動かなかった時の対応

# 背景

mrubyを自前のPythonスクリプトに組み込みたい。（Pythonといっても最終的にはBlender）

いきなりはPython初心者には難しそうだから、まずは
Cのコードからlibmruby.aを使うにはどうすればいいのか試していた。

# mrb_str_ptr周りのエラー

```c
struct RString *err_str;

err_str = mrb_str_ptr(mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0));
        printf("mrb_run failed:%s\n", err_str->ptr);
```

[メモリ使用量を削減するための実装がある時から
導入](http://ksss9.hatenablog.com/entry/2014/03/15/134603)され、それ以前のmrubyを扱っているコードだと、
何らかの対応が必要になる。
自分は毎度これに引っかかるｗ。

```c
struct RString *err_str;

// err_str = mrb_str_ptr(mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0));
// printf("mrb_run failed:%s\n", err_str->ptr);
printf("mrb_run failed:%s\n", RSTRING_PTR(mrb_funcall(mrb, mrb_obj_value(mrb->exc), "inspect", 0)));
```

RString構造体のptrメンバーを参照する際は、上記のように
RSTRING_PTRマクロを定義すれば対応可能だった。

# それでもldでエラーが出る場合

前回[webrubyを当時最新のmrubyで動くようにした](http://kjunichi.cocolog-nifty.com/misc/2014/12/webrubyarraysam.html)際には、
不要だったが、今回は

```shell-session
Undefined symbols for architecture x86_64:
  "_RSTRING_PTR", referenced from:
      _main in hoge-639d02.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

なんてエラーが出て、すっかりC言語忘れてて、stringsしてlibmruby.aを
血眼になって探したが、見つからず、まぁ、確かにシンボル解決できないなぁ。仕方ないから割と近いことをやってそうなmirb.cの解析をするかと、思いきや、

マクロ定義なのを一晩寝たら閃いた。

```c
#include <mruby/string.h>
```

これを追加して無事ビルド出来た。
 
# Link

- [mrubyとCの連携 - Qiita](http://qiita.com/cubicdaiya/items/fc0620c7b9629bb85d6f)
小さなお友だちの為の　MacOsXでBASIC #3


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#3次関数描画
##02.BAS
3次関数を定義し、描画します。

```bas:02.BAS
10 DEF f(x)=x^3
20 SET WINDOW -4,4,-4,4
30 DRAW GRID
40 FOR x=-4 TO 4 STEP 0.1
50    PLOT LINES: x,f(x);
60 NEXT x
70 END
```


##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-01 7.05.07.png](https://qiita-image-store.s3.amazonaws.com/0/33317/700a85bf-1c1d-8ba9-591f-8a7f97c21030.png "スクリーンショット 2015-02-01 7.05.07.png")
小さなお友だちの為の　MacOsXでBASIC #2


#記述する動機
私、とある専門学校でPGを教えています。はや８年。いまだにSEもやってます。
学生さんたちに読んでもらうために書いているのですが、悩めるプログラマ、悩めるSE、悩める教育関係者にも何かのヒントにはなると思い、あえて公開していきたいと思います。全て実例です。個人名は秘密！！

#BASIC
名前は「beginner's all-purpose symbolic instruction code」（「初心者向け汎用記号命令コード」を意味する）の頭字語である。

18歳以上はLinux,Macでc,Javaやりましょう。GCCを使えるようになりましょう。
14歳から18歳はOS問わず、IDEを使って、言語は何でもいい。
10歳から14歳は lua or BASIC おまけでscratch
10歳未満はコンピュータなんかやらんで良し。言語能力、身体能力を鍛えましょう。

#前提
http://qiita.com/ggggnonaka/items/8cf3b069594e684f9c0e
を御覧ください。

#２次関数描画
##01.BAS
２次関数を定義し、描画します。
```bas:01.BAS
10 DEF f(x)=x^2
20 SET WINDOW -4,4,-4,4
30 DRAW GRID
40 FOR x=-4 TO 4 STEP 0.1
50    PLOT LINES: x,f(x);
60 NEXT x
70 END
```

##実行結果
おお！きれいに描画できてます。
![スクリーンショット 2015-02-01 6.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/33317/6b868136-456a-6e53-9c64-9ce0e79aa123.png "スクリーンショット 2015-02-01 6.42.07.png")

##画像で保存
実行画面から、画像で保存できてしまう。
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/33317/ee9d411b-0f68-c62d-08b3-9806bea72d42.png "aaa.png")
Railsのrake db:xxxコマンドでtable doesn't existのエラーが出る際の対処


##問題点

```bash
$ bundle exec rake db:migrate
$ bundle exec rake db:schema:load
$ bundle exec rake db:test:prepare
etc...
```

といったDBセットアップ用のrakeタスクを実行した際に

```
rake aborted!
ActiveRecord::StatementInvalid: Mysql2::Error: Table '(テーブル名)' doesn't exist: SELECT `(テーブル名)`.* FROM `(テーブル名)`
...
```

とエラーが出てrakeタスクが中断されてしまいました。


##解決策

詳細は不明ですがfactoryファイルが原因だったみたいです。

`spec/factories/`を一時的にどっかに退避させておいて

```bash
$ bundle exec rake db:schema:load
#他コマンドでもok!
```
とかすると無事テーブルが作成されました


なんか釈然としませんが同じような症状の人の助けになれば(´･_･`)