OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerfileでchef-soloコマンドを叩いてコンテナにchefを流す

今までのサーバ構成をchefで管理していて、それをコンテナ化して運用したいというニッチな人のための記事
一応それを実現させるツールとして[packer](http://www.packer.io/)がある

Docker, VirtualBoxをbuildして、その中身をchef, puppet, ansibleとかでprovisioningできる素敵っぽいツール
これでbuilderをDockerに、Provisonerをchefにして、流したいrun_listを記述すれば、動くかもしれない

とはいえ、まだ出たばかりで辛いところもあると聞いたので、chefを流し込みたいだけなら、Dockerfile中でchef-soloコマンドを叩かせるようにすればいいのではないだろうかと思ったので、やってみることにした

Dockerfileに直接書いて動かすメリットとしては、Dockerfile中の書く場所にさえ気をつければ、cacheが使われるので必ずchefが流れるわけじゃないという点がある

環境はcore osでDockerコンテナ内はscientific linuxになっている 

#### 参考にさせていただいた
[Dockerfile + chef-solo - boku no blog](http://buta9999.hatenablog.jp/entry/2014/03/12/031659)

# 準備
chefリポジトリは既に用意してある。ただ、knife-soloで流す事が前提だったので、chef-soloコマンドで流せるようにしないといけない
solo.rbを、knife.rbをベースにして作る

knife soloコマンドで流していた設定

```rb:.chef/knife.rb
cookbook_path             ["cookbooks", "site-cookbooks"]
node_path                 "nodes/local"
role_path                 "roles"
data_bag_path             "data_bags/local"

knife[:berkshelf_path] =  "cookbooks"
```
```json:nodes/local/application.json
{
    "environment": "local",
    "run_list": [
        "recipe[usercreate::admin]",
        "role[application]"
    ]
}
```
```bash
knife solo cook root@hoge.example.co.jp nodes/local/application.json
```

大体こんな風に叩く。これにあわせてsolo.rbを作る

```rb:solo.rb
base = File.expand_path('..', __FILE__)
cookbook_path             [base << "/cookbooks", base << "/site-cookbooks"]
node_path                 base << "/nodes/local"
role_path                 base << "/roles"
data_bag_path             base << "/data_bags/local"
environment               "local"
environment_path          base << "/environments"
```

~~solo-rbでレシピを流すとき、どうやらフルパスじゃないと動かないようだ。~~
~~また、指定したjsonにあるenvironmentを読まないので、ここで指定した。~~
~~ここはいい方法を知っている方にご教授頂きたいところ……~~
__追記__
@DQNEO さんから解法を教えていただきました。ありがとうございます！

# Dockerfileを作成しbuild

Dockerfileにchefリポジトリの内容をADDして叩く設定を書く
Dockerfileがおいてある階層にchefというディレクトリを掘って、そこにchefリポジトリを入れた

```bash
RUN yum install -y openssl-devel wget gcc gcc-c++

### CHEF

# install
RUN curl -L http://www.opscode.com/chef/install.sh | bash

# ready
ENV CHEF_REPO /root/chef-repo
WORKDIR /root/dockerbuild
ENV ENV local
ADD chef/cookbooks/ ${CHEF_REPO}/cookbooks
ADD chef/site-cookbooks/ ${CHEF_REPO}/site-cookbooks
ADD chef/nodes/ ${CHEF_REPO}/nodes
ADD chef/environments/ ${CHEF_REPO}/environments
ADD chef/keys/ ${CHEF_REPO}/keys
ADD chef/solo.rb ${CHEF_REPO}/solo.rb
ADD chef/data_bags/ ${CHEF_REPO}/data_bags
ADD chef/roles/ ${CHEF_REPO}/roles
ADD chef/Gemfile ${CHEF_REPO}/Gemfile

#run
RUN export PATH=/opt/chef/embadded/bin:$PATH && cd ${CHEF_REPO} && bundle exec chef-solo -c ${CHEF_REPO}/solo.rb -j ${CHEF_REPO}/nodes/local/application.json
```
これで叩けるはず

# 苦労したこと
network周りは基本的にdocker側に抑えられている。僕があたったのは[/etc/hostsの問題](http://qiita.com/JAGAxIMO/items/6b71a03518bbd53d4de6)など
また、chefのレシピに ~~rubyのインストールも入っていたのだが、chef-soloを実行するために前もってrubyのインストールが必要だった。chefがインストールするところにrubyもインストールするというやり方で影響が出ないように無理やり通している。完全にバッドノウハウなのでアドバイス欲しいです~~
__2014/05/16 追記__
chefを先にインストールして、中のrubyを使うという解決方法が提示されましたので、記事の内容を編集しました
WordPress 文字数が多い場合に省略する

長いタイトル、本文を一定文字数で省略、最後に「...」をつける。

function.php に関数を作る

```php:function.php
/**
 * @param string $str 入力文字
 * @param int $length 最大文字数
 * @param string $append 省略時に追加する文字列
 */
function mytrimwidth($str, $length=20, $append="...") {
    if (mb_strlen($str) > $length) {
        $str = mb_substr($str, 0, $length, 'UTF-8');

        return $str .  $append;
    }

    return $str;
}
```

必要なテンプレートで呼び出す

```php:index.php
<a href="<?php the_permalink(); ?>" class="title">
    <?php echo mytrimwidth($post->post_title); ?>
</a>
```

---

若干挙動は違うが、デフォルトで似たような関数はあるのでそちらでも良い

http://www.php.net/manual/ja/function.mb-strimwidth.php

```php:index.php
<a href="<?php the_permalink(); ?>" class="title">
    <?php echo mb_strimwidth("Hello World", 0, 40, "..."); ?>
</a>
```


---

Google の検索結果上位に出てくるコードをそのままテーマ中にコピペしているケースが多くて、ついカッとなって書いた。
対応していないコマンドをSocks5経由で使う

PorxyChains
http://proxychains.sourceforge.net/

/etc/proxychains.conf に「socks5 127.0.0.1 1080」を追加。

> ssh -D 1080 -N proxy_host
> proxychains target_command

みたいに使う。

tsocksより安定してるのがよい。
Emacs23でcaskを試す

追記: 最初に言っておきますがemacsあまり詳しくありません。

```
$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 7.5 (wheezy)
Release:	7.5
Codename:	wheezy

$ emacs --version
GNU Emacs 23.4.1
Copyright (C) 2012 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

$ curl -fsSkL https://raw.github.com/cask/cask/master/go | python
...
Successfully installed Cask!  Now, add the cask binary to your $PATH:
  export PATH="/home/dmiyakawa/.cask/bin:$PATH"

$ .cask/bin/cask --version
0.7.0

$ ls .cask
COPYING  Makefile   bin                cask-cli.el  cask.png  features  go                 templates
Cask     README.md  cask-bootstrap.el  cask.el      etc       fixtures  package-legacy.el  test
```

さてここで .cask/Cask を使おうとしてもうまくいきませんで。```.emacs.d/Cask```を作らせ、そこで依存関係定義し、```.emacs.d/.cask``` 配下に依存パッケージを入れさせます

```
$ cd .emacs.d
$ cask init
..
```

Cask 0.7.0で入るCaskファイルにはemacs24へ依存しているパッケージが複数あるのでコメントアウトして

```
$ cask
```

最後に .emacs.d/init.el へ

```el
(require 'cask "~/.cask/cask.el")
(cask-initialize)
```

一応使えますが、全体的にemacs24前提の作りのようですので不具合あったら悲しむことにします。
MapKitWrapperのCoordinateRegionでエラーが起きると思ったら

以下の条件でプロトタイプを作っていて発生した問題。
解決策を先に書くと「 **StoryboardからMapViewをセットしない** 」ということに。

問題が発生したのは以下のような状況から。

- 簡単な地図アプリ
- StoryBoard利用
- MapViewはStoryBoard上で設置して、ibで接続

```rb:map_view_controller.rb
class MapViewController < UIViewController
  extend IB
  include MapKit
  
  outlet :map, MKMapView

  def viewDidLoad
    super

    # 初期の場所をここで指定するとすると・・・
    @map.region = CoordinateRegion.new([35.681382, 139.766084], [3.1, 3.1]) # -> 落ちる！
  end
end
```

それでStoryboardとの接続を切って、すべてコード内で地図を初期化してみたらうまく動きました。

```rb:map_view_controller.rb
class MapViewController < UIViewController
  include MapKit

  def viewDidLoad
    @map = MapView.new.tap do |m|
      m.frame = view.frame
      m.region = CoordinateRegion.new([35.681382, 139.766084], [3.1, 3.1]) # -> うまく動きます
    end
    view.addSubView @map
  end
end
```

取り敢えずStoryboardでMapViewを定義しないことにします。ふぅ。。。


## 追記

1. StoryboardではUIViewを定義
2. そのUIViewのsubViewとしてMapViewをコード上で初期化する

とやれば簡単に解決することに気付きました・・・。
やれやれだぜ。
grunt+bowerで指定ディレクトリ(public/{css,js,img})に、ライブラリをばらまく


laravel用にライブラリ置くために調べたけど、cakephpでもrailsでも手順は大体一緒
やってることとしては、「./public/lib」にgumbyとjquery, underscore.jsを配置している


手順としては、フレームワークおいてるルートディレクトリに、
以下に貼り付けた「Gruntfile.js」と「bower.js」おいて、gruntコマンド叩くだけ


　　　　　　　　　　　　 ／）
　　　　　　　　　　　／／／）
　　　　　　　　　 ／,.=ﾞ''"／
　　　／　　　　 i f　,.r='"-‐'つ＿＿＿_　　　gruntのインスコ方法？ こまけぇこたぁいいんだよ！！
　　/　　　　　 /　　　_,.-‐'~／⌒　　⌒＼
　　　　／　 　,i　　　,二ﾆ⊃（ ●）.　（●）＼
　　　/　 　　ﾉ　　　 ilﾞフ::::::⌒（__人__）⌒::::: ＼
　　　　　　,ｲ｢ﾄ､　　,!,!|　　　　　|r┬-|　　　　　|
　　　　　/　iﾄヾヽ_/ｨ"＼ 　　 　 `ー'´ 　 　 ／ 



まー、いちおnodeとgruntのインスコ方法書いとく。ハマったら適宜ググるかんじで

``` bash
brew install nvm
source ~/nvm/nvm.sh
nvm install v0.10.28
nvm alias default v0.10.28
nvm use v0.10.28
npm install -g grunt-cli
npm install grunt --save-dev
npm install grunt-bower-task --save-dev
```

下に貼り付けた「Gruntfile.js」と「bower.js」をルートに置いて、gruntコマンドを実行。事故ったら怖いから、
./public/lib/{name}/{js,css,img}で展開されるようにしといた。

``` bash
% npm init [Enter連打]
% grunt
Running "bower:install" (bower) task
>> Cleaned target dir /usr/local/Cellar/httpd/2.2.27/share/apache2/htdocs/annotator/public/lib
>> Installed bower packages
>> Copied packages to /usr/local/Cellar/httpd/2.2.27/share/apache2/htdocs/annotator/public/lib

Done, without errors.
```


``` Gruntfile.js
module.exports = function (grunt) {
  'use strict';
  pkg: grunt.file.readJSON("package.json"),
  grunt.initConfig({
    bower: {
      install: {
        options: {
          targetDir: './public/lib/',
          layout: 'byComponent',
          install: true,
          verbose: false,
          cleanTargetDir: true,
          cleanBowerDir: false
        }
      }
    },
  });
  grunt.loadNpmTasks('grunt-bower-task');
  grunt.registerTask('default', ['bower:install']);
};

```


```bower.json
{
  "name": "AppName",
  "version": "0.0.1",
  "main": "index.js",
  "keywords": [
    "bower",
    "jquery",
    "underscore",
    "gumby"
  ],
  "ignore": [
    "**/.*",
    "node_modules",
    "components",
    "bower_components",
    "test",
    "tests"
  ],
  "devDependencies": {},
  "exportsOverride": {
    "jquery": {
      "js": "**/*.js",
      "css": "**/*.css"
    },
    "underscore": {
      "js": "**/*.js"
    },
    "gumby": {
      "css": "**/*.css",
      "js": "**/*.js",
      "img": [
        "**/*.jpg",
        "**/*.png",
        "**/*.gif"
      ],
      "fonts/icons": [
        "**/*.eot",
        "**/*.ttf",
        "**/*.woff"
      ]
    }
  },
  "dependencies": {
    "jquery": "1.11.1",
    "underscore": "~1.6.0",
    "gumby": "~2.6.3"
  }
}
```
FacebookAPIの仕様変更(Ver 2.0)


最近参加したハッカソンでFacebookのGraphAPIを使うWebアプリケーションを開発しました．
その中で大変苦しめられ，地獄のどん底まで突き落とされたのでまとめたいと思います．

## GraphAPIで本来したかった事
企画段階でGraphAPIでしたかった事は，
1. AさんがこのWebアプリケーションにログインするとき，Facebookアカウントで認証をする．
2. AさんのFacebookアカウントに登録されている友達の一覧を取ってくる．
3. Aさんの友達であるBさんはこのアプリケーションを一度も使っていない人である．

つまり， __自分の友だちの全員のUIDや名前，Email等の個人情報を取得したかったのです!__

## じゃあ実際はどういう動きを...??

GraphAPIの公式ドキュメントを読んでみると，userの友達一覧(friends)を取得するときのpermissionの項目に次の１文がありました．
``
This will only return any friends who have used (via Facebook login) the app making the request.
``
んー...どういう事なんでしょ...
調べた結果Ver2.0になってからの仕様変更後の動きをまとめると...

1. 認証を行ったアカウントに登録されている全友達の一覧を取ってくる事は **不可能!!**
2. ただし，同じWebアプリケーションにログインしている友達の一覧だけは取得する事が出来る．

だから，友達全員が同じアプリケーションに一度でもアクセスしていないと友達全員の一覧を取得する事は出来ないんですね...!

## 考察

1. 公式Docはちゃんと隅々まで読みましょう．(英語でも)
2. FacebookAPIの仕様変更は頻繁にある．
3. APIに頼るとよろしくない．

これに辿り着くまでに約9時間を要しました．
サポートしてくださった各企業様のエンジニアの方々には感謝します...!!
各種言語・ライブラリの日付フォーマット


## 年月日時分秒をゼロパディング (例:2014-05-16 11:48:12)


ruby [Time#strftime()](http://docs.ruby-lang.org/ja/1.9.3/class/Time.html#I_STRFTIME)

```ruby:
Time.now.strftime("%Y-%m-%d %H:%M:%S")
```

moment.js [format()](http://momentjs.com/docs/#/parsing/string-format/)

```javascript:
moment().format('YYYY-MM-DD HH:mm:ss')
```

php [date()](http://jp1.php.net/manual/ja/function.date.php)

```php:
date("Y-m-d H:i:s")
```

angular.js [filter:date](https://docs.angularjs.org/api/ng/filter/date)

```html:
{{new Date() | date:'yyyy-MM-dd HH:mm:ss'}}
```

perl [POSIX::strftime](http://perldoc.perl.org/POSIX.html)

```perl:
POSIX::strftime "%Y-%m-%d %H:%M:%S", localtime(time);
```

python [datetime#strftime](datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

```python:
datetime.now().strftime("%Y-%m-%d %H:%M:%S")
```

ruby, python, perlは同じC標準。
【Rails】initializersディレクトリに書いたコードが、開発環境でリセットされるときの解決法


```ruby:initializers/something.rb
Rails.application.config.to_prepare do
  #この中で、処理を書く
end
```

###解説
`to_prepare`以下でコードを渡すと、 __開発環境では__リクエストの度に実行され、 __プロダクションでは__最初のリクエスト時に実行されるそうです。

##そもそも、なんで開発環境ではコードの変更が即反映されるの？
development.rbのcache_classesがfalseになっているから。
すると、 __appディレクトリ以下のコードに関しては、__リクエストの度にコードがloadされるそうです。

参考：http://humanwebdevelopment.com/rails-3-application-config-to_prepare-and-initializers/

##背景
* gemとして読まれているRails engineのモデルを、特定のアプリケーション内でのみ拡張したかった。
* ロジックはmoduleに書いたが、どこでそれをモデルにincludeすれば良いのか 最初分からなかった。
* initializers以下に `ModelName.send(:include, ModuleName)`で良いらしいが、それだと本記事のタイトルの現象になってしまった。
linux ライクなコンソールでの便利なキーバインド

さらば、矢印キー

| binding | detail |
|:--------|:-------|
|```Ctrl + A```|move cursor to left end|
|```Ctrl + E```|move cursor to right end|
|```Alt + F```|move cursor forward(1 word each)|
|```Alt + B```|move cursor backward(1 word each)|
|```Alt + D```|delete a word|
|```Ctrl + W```|delete a word backward|
|```Ctrl + F```|move cursor forward(1 character each)|
|```Ctrl + B```|move cursor backward(1 character each)|
|```Ctrl + D```|delete a character|
|```Ctrl + P```|previous history|
|```Ctrl + N```|next history|
[Git] リポジトリを GitHub(Public) から Bitbucket(private) に移行する方法、 remote を増やしたり減らしたりして管理を柔軟にする方法

# 状況

細々とプロジェクトをすすめていて、そろそろコードを非公開にしなくちゃいけないところに来たけれど、お金がないって状況になり、無料でプライベートリポジトリを使える Bitbucket を利用することにしました。

# やること

```pl
$ git remote set-url origin git@bitbucket.org/watashi/project.git
$ git push origin master --force
```

origin の上書きということですかね。
一応 config をチェックしました。

```pl
$ vim {PROJECT_ROOT}/.git/config
---
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@bitbucket.org/watashi/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

```

確かに remote の origin の url が bitbucketのものになっています。

# remote の追加

今後、githubに戻すかもしれないので、一応 github も残しておきたい。

```pl
$ git remote add github git@github.com:watashi/project.git
```

一応 config を見てみる

```pl
$ vim {PROJECT_ROOT}/.git/config
---
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "github"]
    url = git@github.com:su3/letterpress_dev.git
    fetch = +refs/heads/*:refs/remotes/github/*
[remote "origin"]
    url = git@bitbucket.org/watashi/project.git
    fetch = +refs/heads/*:refs/remotes/origin/*
```

# remote の確認

登録された remote は以下のコマンドで確認できます。

```pl
$ git remote -v
---
github	git@github.com:watashi/project.git (fetch)
github	git@github.com:watashi/project.git (push)
origin	git@bitbucket.org/watashi/project.git (fetch)
origin	git@bitbucket.org/watashi/project.git (push)
```

# remote の削除

やっぱいいや、いらないかな...って時は。

```pl
$ git remote rm github
```

ref) http://bayashi.net/diary/2012/0714
paper_trail + paranoia + active_scaffold で rails_admin もどき

# Rails の管理画面と言えば rails_admin

[rails_admin](https://github.com/sferik/rails_admin) を使うと、Rails で動く Web アプリケーションに、データ管理画面を簡単に作成できます。

# データの更新履歴を残したい paper_trail + paranoia

一方で、

* [paper_trail](https://github.com/airblade/paper_trail): データの更新履歴を取る
* [paranoia](https://github.com/radar/paranoia): 削除済みデータを閲覧・復帰可能にする

を用いると、レコードの各カラムの変更履歴を残し、さらに削除済みのデータを閲覧可能になります。

# データ更新履歴を見られる rails_admin ってないの？

paper_trail + paranoia に対応した rails_admin （みたいなもの）って無いんでしょうか？

見つけられなかったため、そういう管理画面を active_scaffold で作ろうともがいているのがこの記事です。

# active_scaffold

[active_scaffold](https://github.com/activescaffold/active_scaffold) を使うことで、レコードに対する更新履歴のような
has_many 子要素まで対応可能な閲覧・編集画面を簡単に作成できます。

# ということで

paper_trail + paranoia でデータの更新履歴を残しつつ、
そのデータを active_scaffold で閲覧・編集できるようにしようとリンク先でもがいています。
（そこそこ動くようになりました）

環境：

* rails (= 4.0.4)
* active_scaffold (3.4.0.rc)
* paranoia (2.0.2)
* paper_trail (3.0.1)

http://dora.bk.tsukuba.ac.jp/~takeuchi/index.php?%A5%BD%A5%D5%A5%C8%A5%A6%A5%A7%A5%A2%2Frails%2FPaperTrail%2BActiveScaffold

なんかいろいろ車輪の再発明をしている気がするのですが、
こういう機能を簡単に持たせることって、もっと簡単にできたりしないんでしょうか？？？
Arrayを使ったnilガード

例えば、`params[:items]`に配列が入っていた時にnilだとエラーになる。

```
params[:items].each do |item_id|
  #処理
end
```

この時エラーになってしまうので

```
Array(params[:items]).each do |item_id|
  #処理
end
```

とすると、いい感じ。

```
Array([1,2,3])
# => [1,2,3]

Array(nil)
# => []
```
[SyncStitch]part of the models of Cruise Control System.

Here is the part of models I made for the ESEC seminar.
[CCS-2.ss](https://gist.github.com/kencoba/f688a10f4769251dcacc)

ってことで、晒しときます。

このモデル、enableControlのあとにoff,brake,acceleratorイベントが発生したときには、
必ずdisableControlしてほしい(でないと、人間が急停止やってるのにCCSが速度調整してしまう)。
が、抜け道があるのでfailure解析にて失敗します。
munin を使って tomcat の状態を監視する

munin-java-plugins を使って tomcat の監視をした際のメモ。簡単と思いきや、意外とハマった。

# インストール

EPEL が有効になっている前提で、次のようにする:

```zsh
$ sudo yum install munin-java-plugins
$ rpm -q munin-java-plugins
munin-java-plugins-2.0.19-1.el6.noarch
```

java, tomcat のバージョン:

```zsh
jdk-1.7.0_45-fcs.x86_64
apache-tomcat-7.0.47
```

# tomcat の設定

jmx 経由で値をとるので tomcat の起動時に以下の CATALINA_OPTS を渡す

```
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=5600 \
               -Dcom.sun.management.jmxremote.authenticate=false \
               -Dcom.sun.management.jmxremote.ssl=false"
```

# munin plugin の設定

```zsh
$ cat /etc/munin/plugin-conf.d/jmx
[jmx_*]
env.ip 127.0.0.1
env.port 1616
env.JRE_HOME /usr/java/jdk1.7.0_45/jre
env.JAVA_OPTS -Xmx128m

$ sudo /sbin/service munin-node restart
```

# plugin の指定

ググると jmx_MultigraphAll を指定すればいいような記述があって、最初はそれで運用していたけど、エラーになっていくつかのグラフしか描画されなかった。

```zsh
$ sudo ln -s /usr/share/munin/plugins/jmx_ /etc/munin/plugins/jmx_MultigraphAll
```

でも `munin-run jmx_MultigraphAll` で見るとちゃんと値が取れているように見える。
小一時間、出力とログをにらめっこして間違い探しをしたけど、何が悪いのか分からない。


結局、multigraph ではなく、一つ一つグラフを指定すればちゃんとグラフが出来るので、手でリンクをはることにした。最初からこうすればよかった。

```zsh
$ munin-run jmx_MultigraphAll | grep multigraph | cut -d' ' -f 2
jmx_memory
jmx_MemoryAllocatedHeap
jmx_MemoryAllocatedNonHeap
jmx_GCTime
jmx_GCCount
jmx_MemoryCode_CacheUsage
jmx_MemoryCode_CachePeak
jmx_MemoryCode_CacheUsagePostGC
jmx_MemoryEdenUsage
jmx_MemoryEdenPeak
jmx_MemoryEdenUsagePostGC
jmx_MemoryPermGenUsage
jmx_MemoryPermGenPeak
jmx_MemoryPermGenUsagePostGC
jmx_MemorySurvivorUsage
jmx_MemorySurvivorPeak
jmx_MemorySurvivorUsagePostGC
jmx_MemoryTenuredGenUsage
jmx_MemoryTenuredGenPeak
jmx_MemoryTenuredGenUsagePostGC
jmx_Threads
jmx_threads.historical
jmx_ThreadsDeadlocked
jmx_Uptime
jmx_ClassesLoaded
jmx_ClassesUnloaded
jmx_ClassesLoadedTotal
jmx_CompilationTimeTotal
jmx_ProcessorsAvailable
```

```zsh
for g in `munin-run jmx_MultigraphAll | grep multigraph | cut -d' ' -f 2`; do
    sudo ln -s /usr/share/munin/plugins/jmx_ /etc/munin/plugins/$g
done
```

この後、jmx_Uptime とかあきらかに不要なプラグインを削除した。

# 各グラフの意味

名前からある程度推測はできるけど、実際それぞれのプラグインで何を取っているのかは、ソースコードから確認できる

http://munin-monitoring.org/browser/munin-dev/plugins/javalib/org/munin/plugin/jmx
リアル女子大生とペアプロできないのはどう考えても俺が悪い 第二話

この画面に対して

1000
1101
1001
1111
1111
1111
1111

下記のように変換することで比較回数は（理論上）√(H * W)になるなーというやつでテスト4は通ったけどあとは全然ダメだった。

0321
0010
0210
0000
0000
0000
0000

あと動的計画法でどうにかなるらしいと聞いたけどやる時間がなかった。

テストパターンを思いついてテストファイルを作れるかどうかがとりあえず問題だなーという感想。

とりあえず最後のコードはこれ。メモ化しようとしてた途中なので、答えが合うかどうか怪しい。

```rb
require 'pp'
FIELD="0"
BLOCK="1"


module Kernel
  extend self
  def scani(re)
    gets.scan(re).map(&:to_i)
  end
end

class Cell
  attr_accessor :width, :height
  def initialize(width,height)
    @width = width
    @height = height
  end
end

def walk_width(s)
  i = 0
  a = s.inject([]) do |r,x|
    case x
    when FIELD
      r.unshift Cell.new(i += 1,1)
    when BLOCK
      r.unshift Cell.new(i = 0,0)
    end
  end
  a
end

def walk_vert(cur,pre)
  pre.each_with_index do |x,i|
    if cur[i].width > 0
      cur[i].height = x.height + 1
    end
  end
end

($mx,$my) = scani(/\d+/)

$memoize = []
$mem = []
pre = nil
$mx.times do
  line = walk_width(gets.scan(/./))
  $mem.unshift line
  if pre
    walk_vert(line, pre)
  end
  pre = line
end

#pp $mem

def find_memoize(v,h) 
  pat = 4 
  $memoize[v] ||= []
  pat.times do |i|
    i=(i+1)*v
    if $memoize[i]
      pat.times do |j|
        j=(j+1)*v
        if $memoize[i][j]
          return $memoize[i][j]
        end
      end
    end
  end
  nil
end

def count(vert,horz)
  count = 0
  $mx.times do |x|
    $my.times do |y|

      m = find_memoize(vert, horz)
      return m if m

      if vert > horz
        next unless $mem[x][y].width >= horz
        cells = $mem[x][y,horz]
        allowed = cells.all?{|c| c.height >= vert}
      else
        next unless $mem[x][y].height >= vert
        cells = $mem[x,vert].map{|z|z[y]}
        allowed = cells.all?{|c| c.width >= horz}
      end 
      if allowed
        count += 1
      end
    end
  end
  $memoize[vert][horz] = count
  p count
end

widgets = gets.to_i

widgets.times do
  count(*(scani(/\d+/)))
end

```
【Unity2D】Multiple Spriteを動的に変更する方法

![Main_unity_-_stg001_-_Web_Player.png](https://qiita-image-store.s3.amazonaws.com/0/43772/cc7333b2-d98b-47c5-0bf6-0cc7bdcf41a9.png)
こんな風にスライスされたスプライト(enemy_0〜enemy_8)を動的に変更する方法を紹介します。

##■まずはSpriteの取得
Spriteを名前指定で取得するには以下のように記述します。

```csharp
  // スプライトの取得
  // @param fileName ファイル名
  // @param spriteName スプライト名
  public Sprite GetSprite(string fileName, string spriteName) {
    Sprite[] sprites = Resources.LoadAll<Sprite>(fileName);
    return System.Array.Find<Sprite>(sprites, (sprite) => sprite.name.Equals(spriteName));
  }
```

この関数には第1引数にファイル名を指定し、第2引数にスプライト名を指定します。今回のプロジェクトであれば、
* ファイル名(fileName)："Sprites/all"
* スプライト名(spriteName)："enemy_0" 〜 "enemy_8"
となります。

なお、 __スプライトは「Resources」フォルダの下に配置__ する必要があります。そうしないとResources.LoadAll()で参照することができません。

##■Spriteの変更
Spriteの変更は以下のように記述します。

```csharp
  // "enemy_0" 〜 "enemy_8" の文字列をランダムで生成
  string name = "enemy_" + Random.Range(0, 8);
  // Spriteを取得
  Sprite sp = GetSprite("Sprites/all", name);
  // SpriteRendererを取得する
  SpriteRenderer sr = GetComponent<SpriteRenderer>();
  // Spriteを変更する
  sr.sprite = sp;
```

先ほどの関数でSpriteを取得し、GetComponent()で取得したSpriteRendererのプロパティの"sprite"にSpriteを代入することでスプライトを差し替えることができます。

## ■Single Spriteの場合
Single Spriteの場合は、Resources.Load() でそのままスプライトを取得できます。

```csharp
Sprite sp = Resources.Load<Sprite>(fileName);
```

## ■参考

* [Unity]ResourcesからスライスしたSpriteを取得する3つの方法
 * http://tsubakit1.hateblo.jp/entry/20131222/1387654182
メモ: C言語

C言語初心者です。

## メモ

* [ゴミのようなコードを見たときに利用するべき astyle のススメ - おともだちティータイム](https://shunirr.hatenablog.jp/entry/20120628/1340884145)

```sh:ソース整形
clang-format -style webkit a.c
```

* 「'」で囲まれた文字は文字リテラル。１文字を表すためだけに利用できる。
* 「"」で囲まれた文字はアドレスを表す。文字列の後には「NULL」が付け加えられる。

```c:文字列
#include <stdio.h>

int main() {
        char *p = "にほんご";
        printf("%s", p);

        char q[] = "にほんご";
        printf("%s", q); // 表示されない
}
```

* string.h は strcmp に必要

```c:文字列
#include <stdio.h>
#include <string.h>

int main()
{
    char* p = "にほんご1";
    if (p == "にほんご1") {
        printf("%s", p);
    }

    char q[] = "にほんご2";
    if (strcmp(q, "にほんご2") == 0) {
        printf("%s", q);
    }
}
```



# ハマったところ

* `文字列の直接比較ができない`
* 文字列比較するためには`string.h`の`strcmp()`を使う必要がある。
* strcmpは`一致する場合0を返す`ので、if文で`strcmp(env,"x86")==0`とする必要があった。
* 自作関数`detect_arch`から戻すときに`char`ではなく`char*`で戻す必要がある(?)
* `switch(文字列)`と書くことができない。

# Wow64を考慮していないコード

* `getenv("PROCESSOR_ARCHITECTURE")`がAMD64でも`x86`を返す。
  * (`cmd /k "echo % PROCESSOR_ARCHITECTURE%"`ではAMD64を返す。)
  * 恐らく64bit OSでも32bit OSとしてexeを実行するため(?)
  * 解答見つけました。[WOW64 実装の詳細 (Windows)](http://msdn.microsoft.com/ja-jp/library/aa384274.aspx)

```c:detect_arch_then_exec_uac.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *detect_arch(void);

int main(void) {
    printf("%s", detect_arch());
    system("UserAccountControlSettings.exe");
    return 0;
}

char *detect_arch(void) {
    char *env;
    char *arch;
    env = getenv("PROCESSOR_ARCHITECTURE");

    if (strcmp(env,"x86")==0) {
        arch = "32 bit";
    } else if (strcmp(env,"AMD64")==0) {
        arch = "64 bit";
    } else {
        arch = "unknown arch.";
    }
    return arch;
}
```


# 動くコード

* `ProgramW6432`が存在するかで判断してます。

```c:
#include <stdio.h>
#include <stdlib.h>

const char *detect_arch(void);

int main(void) {
    printf("%s", detect_arch());
    system("UserAccountControlSettings.exe");
    return 0;
}

const char *detect_arch(void) {
    const char *arch;

    if (getenv("ProgramW6432")) {
        arch = "64 bit";
    } else {
        arch = "32 bit";
    }
    return arch;
}
```
iPhoneのテキストフィールド外をタップしてキーボードを閉じる方法（Titanium Mobile）


カジュアルにキーボード隠したいー！
http://qiita.com/yuch_i/items/65baa9586afdfc6aeb34
これをTitanium Mobileでやりたいよー！！

やった。

###方針
+ キーボードを閉じるのは、テキストフィールドオブジェクトの```blur()```を呼ぶといいみたい。なので、今どのテキストフィールドのキーボードが出てるのかを保存する。

+ Windowにクリックイベントを仕込んで、キーボードを閉じる。

+ テキストフィールドをクリックしたときにWindowのクリックイベントへ伝播しないように、```e.cancelBubble=true;```で伝播を止める。xmlのほうに```bubbleParent=false``` と書いてもいいけど、これだとどんなイベントもとめちゃうのであまりおすすめしない。

### できたやつ


```test.js
var args = arguments[0] || {};
var currentKeyboardOwner = undefined;

function SetKeyboardOwner(e) {
    currentKeyboardOwner = e.source;
    e.cancelBubble=true;
}

function HideKeyboard(e) {
    if(typeof(currentKeyboardOwner) !== 'undefined') {
        currentKeyboardOwner.blur();
    }
}
```

```test.xml
<Alloy>
    <NavigationWindow id="navigationWindow" platform="ios">
        <Window class="container" title="First Win" onClick="HideKeyboard">
            <TextField id="textField1" borderStyle="Ti.UI.INPUT_BORDERSTYLE_ROUNDED" color="#336699" top="10" left="10" width="250" height="60"  onClick="SetKeyboardOwner" />
            <TextField id="textField2" borderStyle="Ti.UI.INPUT_BORDERSTYLE_ROUNDED" color="#336699" top="100" left="10" width="250" height="60" onClick="SetKeyboardOwner" />
        </Window>
    </NavigationWindow>
</Alloy>
```

いまのところ良い感じに動いている。

###ださいところ
+ 全部のテキストフィールドに```onClick="SetKeyboardOwner"```って書いてるとこ。これなんかフォーカス中のオブジェクトがグローバルパラメタに入ってたりしないのかな。ちょっと調べたけど分からず。教えてください！！

おしまい
jQueryのコールバック関数内の、thisコンテクストを指定する

ちょっとしたWebアプリをjQueryを使って書こうとすると、ときどきコールバック内でのthisの参照に悩まされることがあります。そんなときはfunction.bindや$.proxyが便利です。

こいつらを使えば、コールバック内で何をthisとして使うのかを指定することが出来ます。

```js:person
var person = {
    name:"taro",
    getName:function(){
        console.log(this.name);
    }
}
```

```js:bind
$("#el").on("click",person.getName.bind(person)); // >> "taro"
```
```js:proxy
$("#el").on("click",$.proxy(person,"getName")); // >> "taro"
```

たとえばこの場合、person.getNameをclickイベントのコールバック関数として渡し、その中でのthisコンテクストをpersonに指定しています。どっちもやっていることは同じですが、proxyの方は「どんなオブジェクトが何をするか」みたいな雰囲気の書き方ができます。proxyは他にも書き方ありますので、それについては [jQueryの公式doc](http://api.jquery.com/jquery.proxy/)をご参照ください。

通常、thisの参照はクリックされたDOM要素を指します。

```js:usual

$("#el").on("click",person.getName); // >> undefined

```
そのため、this.nameは見つからず、undefinedが返されてしまいます。


こんな例を出しといてアレですが、僕の場合はいつもBackbone.js使ってしまうので、正直DOM回りではあまり使う機会はありません。でも$.ajax()のときなんかは使えると思います。``` var that = this;```って書き方は、なるべくしたくないのです。
「一反田えー(1反田A)」から「千反田える」までを生成する

「一反田えー」、つまり「1反田A」から始めて、「二反田びー(2反田B)」、「三反田しー(3反田C)」と続けていく(Zまで来たらAに戻って循環)と、1000では米澤穂信の推理小説である「〈古典部〉シリーズ」のメインヒロイン、「[千反田える](https://www.google.co.jp/search?q=%E5%8D%83%E5%8F%8D%E7%94%B0%E3%81%88%E3%82%8B)」になるそうです。

> 「一反田えー、二反田びー、……二十六反田ぜっと、二十七反田えー、……」と定義したとき、「千反田」は「える」になる。　というツイートが朝から回ってくるので本当にそうなるかプログラムを走らせた結果 http://twitpic.com/b8q90b
> ![http://twitpic.com/b8q90b](https://d3j5vwomefv46c.cloudfront.net/photos/large/679789595.png)
> https://twitter.com/_Kabix/status/263229881435971584

「私、気になります！」という事で、Groovyで書いてみました。方針は以下のようにしました。

- 漢数字のスタートは1、平仮名表記のアルファベットのスタートは0のため、```eachWithIndex```を用いてそれぞれの配列のインデックスにしました
- より汎用的に、千以上の数字にも対応しました
- 位の表現変換は、「一十百千」までと、「万億兆…」の2段階に分けて変換しました
- 変換する値の桁数の検出は、値を文字列に変換してから文字数を得る事で行いました。

```groovy
def alphabetList = ["えー", "びー", "しー", "でぃー", "いー", "えふ", "じー", "えいち", "あい", "じぇい", "けー", "える", "えむ", "えぬ", "おー", "ぴー", "きゅー", "あーる", "えす", "てぃー", "ゆー", "ぶい", "だぶりゅー", "えっくす", "わい", "ぜっと"]

def range = 1..1000
range.eachWithIndex {num, i->
    println "${arabicNumToKanjiNum(num)}反田${alphabetList[i%alphabetList.size()]}"
}

// アラビア数字を漢数字に変換します
def arabicNumToKanjiNum(long num){
    def kanjiNumUnit = ["", "万", "億", "兆", "京"]
    // 4桁ごとのブロックの数
    int blockIndex = num.toString().size() / 4
    def kanji = ""
    while (blockIndex >= 0) {
        // ブロックの値のみを残す
        int value = num / (10000 ** blockIndex)
        int blockNum = value % 10000
        // ブロックの値が1以上のとき
        if (blockNum >= 1) {
            kanji = "${kanji}${arabicNumToKanjiNumSub(blockNum)}${kanjiNumUnit[blockIndex]}"
        }
        blockIndex--
    }
    kanji
}

// 一万未満のアラビア数字を漢数字に変換します
def arabicNumToKanjiNumSub(int num){
    def kanjiNum = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九" ]
    def kanjiNumSubUnit = ["", "十", "百", "千"]
    // 数字の桁数
    int digitIndex = num.toString().size() - 1
    def kanji = ""
    while (digitIndex >= 0) {
        // 指定した桁の値のみを残す
        int value = num / (10 ** digitIndex)
        int numIndex = value % 10
        // 桁の数字が2以上(「一百」などを避ける)
        // または1桁目の数字（1桁目は「一」を表示）の場合
        if (numIndex >= 2 || digitIndex == 0) { // 
            // 漢数字を追加
            kanji = "${kanji}${kanjiNum[numIndex]}"
        }
        // 桁の数字が1以上のとき
        if(numIndex >= 1) {
            // 百などを表示
            kanji = "${kanji}${kanjiNumSubUnit[digitIndex]}"
        }
        digitIndex--
    }
    kanji
}
```

Groovyコードはファイルに保存してから```groovy```コマンドで実行しても良いですが、GroovyConsoleに貼りつける事で簡単に実行できます。実行結果は「千反田える」になりました！

![erutaso.png](https://qiita-image-store.s3.amazonaws.com/0/30582/ad3adfc6-e961-772b-addf-70d52fb35590.png)
「要素数 4 の配列を渡してください」ではなく「要素数 4 の配列を渡さなければならない」にする

例えば、何も考えずに配列を引数で受け取る関数を考えるとします。
すると、以下のようになるかと思います。

```cpp:test.cpp
#include <iostream>

void Func(const short array[4])
{
	using namespace std;
	
	for (int i = 0; i < 4; ++i) {
		cout << array[i] << endl;
	}
}

int main()
{
	short array[4] = {
		0, 1, 2, 3,
	};
	
	Func(array);
	return 0;
}
```

ぱっと見、なんの問題もないように見えますが、実はこれ、 **配列ではなく単なるポインタ扱い** になっています。

どういうこっちゃ？どう見ても配列でしょ？と思うかもしれませんが、
以下のコードと実行結果を見れば一目瞭然です。

```cpp:test2.cpp
#include <iostream>

void Func(const short array[4])
{
	using namespace std;
	cout << sizeof(array) << endl;
}

int main()
{
	using namespace std;
	
	short array[4] = {};
	cout << sizeof(array) << endl;
	
	Func(array);
	return 0;
}
```

```:output
8
4
```

関数外で sizeof すると、配列のサイズである **8** が出力されています。
が、関数内で sizeof するとあら不思議。出力されているのは **4** です。

**この 4 はなんの 4 なのか？と言うと、これこそが short * のサイズである 4 となるわけです。**

よって

```
void Func(const short array[4])
```

は

```
void Func(const short * array)
```

と同義というわけです。

まぁ、これでも **「short 型の要素数 4 の配列を渡してください」** という意図を伝えることはできますが、
残念ながら **「short 型の要素数 4 の配列を渡さなければならない」** ことにはできません。

あくまで short * なので、short * であれば、要素数が **10** でも **100** でも、
更には **new したポインタ** でさえ渡すことができちゃうわけです。
<br>
**これをなんとか「short 型の要素数 4 の配列を渡さなければならない」ことにできないか？**
<br>
これを実現できるのが **「配列の参照」** です。
百聞は一見にしかず。というわけで、コードと実行結果です。
 
```cpp:test3.cpp
#include <iostream>

void Func(short (&array)[4])
{
	using namespace std;
	cout << sizeof(array) << endl;
}
int main()
{
	using namespace std;
	
	short array[4] = {};
	cout << sizeof(array) << endl;

	Func(array);
	return 0;
}
```

```:output
8
8
```

(&array)[4] が「配列の参照」となります。
**() 重要です。ないとコンパイルエラーで怒られます。**

実行結果を見ると、関数内、関数外の両方で 8 が出力されてますね。
8 が出力されているということは、「short 型の要素数 4 の配列」として認識されているということです。

という訳で、これで無事に「short 型の要素数 4 の配列を渡さなければならない」を実現することが出来ました。

ちなみに、きちんと配列として認識されていますので、

```
for (int i = 0; i < SIZEOF_ARRAY(array); ++i) {
	cout << array[i] << endl;
}
```

こんなこともできます。
メモ：GitHub や Qiita で diff の highlighting 出来るの知らなかった

    ```diff
    diff --git a/Vagrantfile b/Vagrantfile
    index 2bf1f76..8b52ef9 100644
    --- a/Vagrantfile
    +++ b/Vagrantfile
    @@ -65,6 +65,10 @@ Vagrant.configure("2") do |config|
             config.vm.network "forwarded_port", guest: 4243, host: $expose_docker_t
           end
    
    +      if $expose_etcd_tcp
    +        config.vm.network "forwarded_port", guest: 4001, host: $expose_etcd_tcp
    +      end
    +
           config.vm.provider :virtualbox do |vb|
             vb.gui = $vb_gui
             vb.memory = $vb_memory
    ```

```diff
diff --git a/Vagrantfile b/Vagrantfile
index 2bf1f76..8b52ef9 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -65,6 +65,10 @@ Vagrant.configure("2") do |config|
         config.vm.network "forwarded_port", guest: 4243, host: $expose_docker_t
       end

+      if $expose_etcd_tcp
+        config.vm.network "forwarded_port", guest: 4001, host: $expose_etcd_tcp
+      end
+
       config.vm.provider :virtualbox do |vb|
         vb.gui = $vb_gui
         vb.memory = $vb_memory
```
Go言語でOS種類を判定する


`runtime.GOOS` で `"darwin"`, `"windows"`, `"linux"`, `"freebsd"` などが取得出来ます。

[runtime - The Go Programming Language](http://golang.org/pkg/runtime/#pkg-constants)

```go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	command := "milk"

	if runtime.GOOS == "windows" {
		command = "milk.bat"
	}
```
git logにブランチ名を表示する git log --oneline --graph --decorate=fullのススメ

## コミットログの表示
git log 

ローカルのコミットログ(ハッシュ値、編集者、編集日時、メッセージ)を表示

```
* commit 1235f58b72bd3323375debbc783a508d8328277cce5
| Author: Masaru Furuya
| Date:   Fri May 16 00:54:09 2014 +0900
| 
|     git test
```

## コミットログをグラフ表示にする

git log --graph

```
* commit 2rr29dd167c5d38fec823f2c90fb4896536a6214
| Author: Masaru Furuya
| Date:   Thu May 15 19:22:14 2014 +0900
| 
|     
|    
*   commit 9003273439ba845614650688d7bb752614ec6231
|\  Merge: 90b2dd4 4034903
| | Author: Masaru Furuya
| | Date:   Thu May 15 18:32:17 2014 +0900
| | 
| |     Merge branch 'git_test2' into git_test
| |   
| * commit 1334fa8d01d0a17e679eb3b94a3db5479a144223
```

コミットの推移をグラフ表示にしてくれる

## コミットログを1行で表示する 

git log --oneline

```
10029dd git test3
3453273 git test2
134bfa8 git test1
```

余計な情報は全て省略され、ハッシュ値とコミットメッセージのみの表示となる

## コミットログにブランチ名を表示する

git log --graph --oneline --decorate=full

```
* 1ee29dd (HEAD, origin/git_test, origin/HEAD, git_test2, git_test) 
* *   1233273 Merge branch 'git_test2' into git_test
|\  
| * 135bfa8 git_test2
| *   111b0f1 git_test4 Merge branch 'git_test3'
| |\  
| |/  
|/|   
* | 01b2dd4 git_test
```

--decorate=full

をオプションとしてつけるとカラフルになるだけでなく、
ローカルとリモートのブランチ名を表示してくれるようになる

いちいち、このコマンドをうつのもめんどくさいので、
自分はgitcofigにエイリアスとして登録している

```
[alias]
graph=log --graph --oneline --decorate=full
```

git logはHEADの変化のログであるgit reflogと合わせて使えば、
何かあった時に復旧するのにとても便利なコマンドです。

ぜひ自分にあったオプションを見つけて見て下さい。
OSX MavericksへのTitaniumのインストール時にエラー


Mavericksをクリーンインストールして、Java SDK1.8とTitaniumStudioをインストールした。


いざTitaniumを起動してみるとこんなエラーが。

![TitaniumStudio_と_App_Store.png](https://qiita-image-store.s3.amazonaws.com/0/8607/92b8f3d5-4d8d-d51e-dabd-88716a61bf94.png "TitaniumStudio_と_App_Store.png")




Appceleratorのフォーラムでは解決済みの問題になってました。

[Cannot load Titanium Studio](http://developer.appcelerator.com/question/145000/cannot-load-titanium-studio)


これに従って、


[Java for OS X 2013-005](http://support.apple.com/kb/DL1572?viewlocale=en_US)

これをインストールして無事解決。


![Java_for_OS_X_2013-005_のインストール.png](https://qiita-image-store.s3.amazonaws.com/0/8607/ef001deb-9b22-eb28-db75-4d6f1274bd86.png "Java_for_OS_X_2013-005_のインストール.png")
Qiitaに貼った画像がなんかデカいなあ〜と思ったら


imgタグにして、`width` を調整しましょう。

もともとこういうMarkdown記述だったとすると、

- 記述

	```
	![代替テキスト](https://qiita-image-store.s3.amazonaws.com/0/35733/05809c48-9f64-9bb1-705d-55645d04eb49.jpeg "ALTテキスト")
	```

- 結果

	![代替テキスト](https://qiita-image-store.s3.amazonaws.com/0/35733/05809c48-9f64-9bb1-705d-55645d04eb49.jpeg "ALTテキスト")

imgタグに変えれば、幅が調整できます。

- 記述

	```
	<img src="https://qiita-image-store.s3.amazonaws.com/0/35733/05809c48-9f64-9bb1-705d-55645d04eb49.jpeg" width=50%>
	```

- 結果

	<img src="https://qiita-image-store.s3.amazonaws.com/0/35733/05809c48-9f64-9bb1-705d-55645d04eb49.jpeg" width=50%>
開発用にplackupで自己認証サーバを立ち上げる


## OpenSSLで鍵ペアと証明書を作成

パスフレーズなしの秘密鍵(server.key)を作成する。

```shell
$ openssl genrsa 2048 > server.key
```

公開鍵(server.csr)を作成する。
-subjの部分は必要に応じて編集する。

```shell
$ openssl req -new -key server.key -out server.csr -subj '/C=JP/ST=Tokyo/L=Tokyo/O=Example Ltd./OU=Web/CN=example.com'
```

証明書(server.crt)を作成する。

```shell
$ openssl x509 -in server.csr -days 365 -req -signkey server.key > server.crt
```

## plackupコマンド

Plackに同封のHTTP::Server::PSGIでサーバを立ち上げる。
その際に、「ssl」「ssl-key-file」「ssl-cert-file」オプションで、
先ほど作成したファイルを指定してSSLを有効にする。

```shell
$ plackup -s HTTP::Server::PSGI --ssl-key-file server.key --ssl-cert-file server.crt --ssl 1 app.psgi
HTTP::Server::PSGI: Accepting connections at https://0:5000/
```

これで、httpsでListenするサーバが立ち上がる。

## ヘッダの追加

ばあいによっては、
アプリに渡すヘッダにX-Forwarded-HTTPSのような情報を渡す必要が出てくる。
Mojoliciousでは、X-Forwarded-HTTPSを渡さないと、
リダイレクト処理が正常に動作しなくなる。

コマンドから追加する方法が見つからなかったので、
Plack::Builder内で以下のような感じで追加するようにした。

```perl:app.psgi
use Plack::Builder;
builder {
    enable sub {
        my $app = shift;
        sub {
            my $env = shift;
            $env->{"HTTP_X_Forwarded_HTTPS"} = 1;
            my $res = $app->($env);
            return $res;
        };
    };
    $app;
};
```

追記)
コマンドから追加する方法を見つけた。

以下のようなファイルを用意する。

```httpxforwardedhttps.pl
enable sub {
    my $app = shift;
    sub {
        my $env = shift;
        $env->{"HTTP_X_Forwarded_HTTPS"} = 1;
        my $res = $app->($env);
        return $res;
    };
};
```

plackupの-eオプションで、このファイルの内容を渡すようにする。

```shell
$ plackup -e "`cat httpxforwardedhttps.pl`" -s HTTP::Server::PSGI --ssl-key-file server.key --ssl-cert-file server.crt --ssl 1 app.psgi
HTTP::Server::PSGI: Accepting connections at https://0:5000/
```

これで、アプリに手を入れずに、ヘッダを追加することができた。


## 参考

Apache+OpenSSLで簡単に自己認証したい
http://qiita.com/cs_sonar/items/81b30c7a1d86d729c7fc
USBRH を openSUSE で使う場合の udev rules設定

ストロベリーリナックスのUSB温度計USBRH を openSUSE13.1で試してみたら、なぜか動かなかった。

いろいろ調べてみたら、
udev/rule.d/rules の書式がLinux各ディストリビューションによって微妙に違うらしいことがわかった。
参考にしたのはブラザーさんのLinux各ディストリビューションごとの設定方法を記載したページ。
(よく調べたなぁ、ご苦労さまです)

日本ブラザー 一般ユーザでスキャナーを使用する場合の設定(USB接続)
http://support.brother.co.jp/j/s/support/os/linux/scanner/scan_info2.html

で、上述のページを参考にして、openSUSE13.1用に変更したのがこちら

ファイル名: /etc/udev/rules.d/99-local-after.rules
ATTR{idVendor}=="1774", ATTR{idProduct}=="1001", MODE="0666"

USBRHの情報をネットで検索して見つけた元の設定はこちら
http://d.hatena.ne.jp/dayflower/20090721/1248159253より

BUS=="usb", SYSFS{idVendor}=="1774", SYSFS{idProduct}=="1001", MODE="0666"

なお、rules ファイルを修正後、システム再起動が必要。

これで、USBRHと(一般ユーザでも)通信できるようになった。
Groongaドキュメント読書会1で学んだ事のメモ

# はじめに
この文章は、[Groongaドキュメント読書会1](http://groonga.doorkeeper.jp/events/11169)で学んだ事のメモです。
元のテキストで分からなかった事を中心に書きました。

# 1. Groongaの特徴
テキスト: http://groonga.org/ja/docs/characteristic.html

## 1.1. Groongaの概要

### 転置索引とは
~~通常の索引(index)とは「転置」(逆になっている)。~~
~~全文検索エンジンの世界においては、文章からキーワードを抽出して、マッピングを保存しておくもの。~~
~~通常は「文章⇒キーワード」な所を、「キーワード⇒文章」という流れで検索するので「転置(逆)」という。~~
※この理解は誤っていました。コメントで@ktouさんが詳しく解説してくださっています。

### カラムストアと列指向データベース
一般的に、カラムストアと列指向データベースは同義のような形で使われる。
厳密にいうと、列指向データベースは設計思想でカラムストアはデータアクセスの実装方法との事。

## 1.2. 全文検索と即時更新

### 更新しながらでも検索できるという優れた特徴を持っている

通常は書き換えるために一時的にデータをロックするが、Groongaは書き換えるのではなく、別の場所にデータを書き込んだ後にそちらを参照するようにリンクを変える形で更新するため、書き換え中に壊れたデータを取得してしまうことがない(ATOMICに更新可能)。

### 複数の転置索引を統合するような重い処理を必要としない
通常、転置索引は作成コストが大きいので、一度作ると後からは変更できない。
そのような時は新しい索引を作成して検索するため、複数の索引を併用して検索している。
それがあまりに増えるとオーバーヘッドが多いため、そのような時に統合という処理を行っている。
これが非常に高コストであるため、実行中は全体の性能が劣化する。
Solrなど、通常の全文検索エンジンはこれを行っているが、Groongaは転置索引の変更が可能であるため不要。

### なぜGroongaは転置索引の変更が可能なのか
Groongaはインデックスの各データの間に隙間があるため、データを間に差し込める。
通常は詰めて作った方が性能が高いため、他のエンジンはこのような仕組みになっていない。
なお、隙間を食いつぶした場合はインデックスの最後に追記する形となる？

## 1.4. 転置索引とトークナイザ

### 形態素方式とN-gram方式のどちらを採用すべきか
形態素解析は辞書ベースなので新語に弱い。そういう単語が多いときはN-gramが有利。
字面を重視したい時はN-gram、意味を重視したい時は形態素解析。という使い分け方もある。
(Ngram方式だと、「京大」を検索した時に、東京大空襲がヒットしうる)

## 1.6. 位置情報（緯度・経度）検索

### 転置索引を応用して高速な位置情報検索を実現
レストランのたとえ。A,B,Cなどの位置情報を転置索引として保存。
検索する範囲の中に、転置索引のどのキーワードが引っかかるかについては別の仕組みを用いて、転置検索の範囲検索のような事をしているわけではない。

## 1.8. Groonga サーバ

### Groonga の独自プロトコルである GQTP（Groonga Query Transfer Protocol）
ステートレスであるHTTPと異なり、GQTPはステートフルなプロトコル。
そのため、連続して検索を行う場合オーバーヘッドが少ない。また、1回の転送量が少なくてすむ。
HTTPについては、Basic認証などの認証が出来る上、クライアントライブラリが豊富。
そのため、通信速度がボトルネックになるならGQTPを検討する価値があるが、通常はHTTPの方が扱いやすい。

なお、rubyのライブラリはどちらのプロトコルでも使える。

## 1.9. Groonga ストレージエンジン

### Groonga 単体での利用、およびに MyISAM, InnoDB との連携
ここでいう単体とはMroongaのストレージモード。連携とはラッパーモードの意。

### Mroongaを使うメリットデメリット
メリットとしてはMySQLの資産が使える事(レプリケーション等。そもそもSQLでアクセスできる)
ただし、groongaの機能のdrilldownを使えないため、`GROUP BY`句で表現する必要がある。

- 実際には、mroonga_commandというユーザー定義関数を使えば可能だが、応答がJSONとなるため、普通のSQL的に使うのは難しい。

Mroongaストレージエンジンで作られたDBに、別に立てたGroongaからアクセスする事も可能。
ただ、Groongaから更新すると、その変更をMroongaが検知できずデータの不整合が起きるので参照専用とすべき。

# 後で試す/確認するリスト
- ~~カラムストアと列指向DBの本当の違いを確認する。~~
- 列指向DBは、カラム追加のコストが行指向よりも小さいとの事だが、逆に通常のINSERTのような操作はコストが高い？
- 転置索引の変更が可能だとの事だが、インデックスのデータ間の隙間を使いつぶした場合でも、低コストに変更できるのか？
Github Flowを使い始めるときのまとめ

## Github Flow とは

複数人で開発するときに、github上のリポジトリをどう運用するかをまとめたもの

## Github Flow 運用ルール

### masterブランチのものはデプロイ可能である

 - 全ての作業はmasterブランチにマージする
 - (git-flowではdevelopブランチを利用するが、Github Flowではより簡単にしている)
 - マージするブランチはテスト、レビューされ、masterブランチは常に安定して動作するように保つ

### masterブランチから各種作業を行うブランチを作成する

 - 全てのブランチはmasterブランチから作成する
 - (git-flowではfeatureブランチとreleaseブランチはdevelopブランチから、hotfixブランチはmasterブランチから作成する)
 - ブランチの名前は、一目見てその作業が分かるような名前を付ける

### ブランチを定期的にプッシュする

 - 作業用のブランチは定期的にプッシュして、他の担当者に作業状況を共有する
 - 不意の端末の故障からソースコードを守る
 - (git-flowでは、ブランチでの作業をローカルで行いdevelopブランチやmasterブランチへマージした後、共有リポジトリへプッシュする)

### プルリクエストを利用してレビューを行う

 - Githubのプルリクエストの機能を利用してレビューを行なってから、masterブランチにマージする

### マージされたプルリクエストを直ちにデプロイする

 - マージされたmasterブランチのコードはすぐにデプロイする
 - 早期にデプロイし動作確認を行うことで、バグを早期に発見、修正する
 - 本番環境にいきなりデプロイするのがためらわれる場合、ステージング環境にデプロイして動作確認を行う

## Git Flowの流れ

### 作業用のブランチ作成

 - masterブランチから作業用のブランチを作成
 - git checkout -b new-festで作成と切り替えを同時に行う

```
$ git checkout -b new-feat
$ git branch
```

### ブランチのプッシュ

 - ブランチをリモートリポジトリへプッシュ
 - 他の開発者と作業内容を共有

```
$ git push origin new-feat
```

### プルリクエスト

 - ブランチでの作業が完了したら、プルリクエストを作成
 - 作業ブランチを元のブランチへマージする依頼を送信

 - GithubのWebサイト
 - Pull Requests -> New pull request -> Create Pull Request

### レビュー

 - レビュアーはプルリクエストをレビュー
 - レビューコメントを追加

### 修正

 - レビュアーのコメントを受けて、修正した変更をプッシュ
 - プルリクエストに反映

### masterブランチにマージ

 - レビュアーから承認を受けたら、作業ブランチをmasterブランチにマージ

```
$ git checkout master
$ git merge --no-ff new-feat
```

### 作業ブランチの確認

```
$ git branch -r
```

### 作業ブランチの作成

```
$ git branch new-feat
```

### 作業ブランチの切り替え

```
$ git checkout new-feat
```

### 作業ブランチの削除

```
$ git branch -d new-feat
```

## 参考

[Gitチュートリアル | Atlassian](https://www.atlassian.com/ja/git/workflows#!workflow-overview)
[プルリクエスト／レビューを取り込んだ、よりシンプルなGitHub Flowの運用を図解する (1/2) | @IT](http://www.atmarkit.co.jp/ait/articles/1401/21/news042.html)
[Github-flowを分かりやすく図解してみた | pyar.bz](http://b.pyar.bz/blog/2014/01/22/github-flow/)
[Github Flow (Japanese translation) | GithubGist](https://gist.github.com/Gab-km/3705015)
codeigniter で、URLの.html 有りでも無しでもアクセスできるようにしてみた


# やりたかったこと

codeigniter では、config でurl の末尾を自由に設定できるようになっていますよね。

この箇所です。

```config.php

	$config['url_suffix'] = '.html';
	
```

デフォルトだと空欄になっていますが、
上のようにすることで、自動で末尾に.html が入り、

http://URL/test.html 

こういうURLでページを表示することができます。

問題はこの先。
**サイト内に.html を付けるページと付けないページのどちらも存在させたいとき。**

そんな場合あるのか、て感じですが、あったんですよ。
事情は省略。

# コード

こんなコードにしました。

```config.php
if(strpos($_SERVER["REQUEST_URI"],'.html')){
	$config['url_suffix'] = '.html';
} else {
	$config['url_suffix'] = '/';
	
}

```

正規表現で、.htmlが付いている場合と付いていない場合で分岐を書きました。ちなみに $config['url_suffix'] = '/';  となっているのは、末尾に必ず　/ を付けたかったからです。

また、正規表現を

^.*\.html.*

としたのは、.html?id=1234&user=test みたいなURLがあったからです。


# まとめ

無理矢理な感じですが、できるんですね。

ところでqiita 始めて4日目ですが、qiita で技術メモ以外（日記、書評、愚痴など）書いたら、どうなるんでしょう？

非掲載にされたりするのでしょうか。
分かる方、ぜひ教えてください。
スケジューラアクティベーション


スケジューラアクティベーションはマルチスレッドの実装方式の1つ。
カーネルスレッドの機能性とユーザスレッドの高性能さ・柔軟性を統合するために考案された。
過去に NetBSD のカーネルで実装されていた。

ユーザスレッド用に特別なノンブロッキングコールをつくるべきではないし、`select` で安全性を調べなくてもいいようにしたい。
ページフォルトでブロックしても同一プロセス内の他のスレッドを実行したい。
スケジューラアクティベーションでは、カーネルはプロセスごとに仮想 CPU を割り当てる。
1つのプロセスには最初は1つだけだが、そこからより多く要求したり開放することができる。
これを実現させるためのアイデアとして、カーネルはブロックを検知したらその情報をスタックにつんでから実行時システムにそれを通知（コール）するようにする。
実行時システムはプロセスごとに決められたアドレスにある。
おおまかにいえば UNIX のシグナルと似ている。
このようなコールを「アップコール」と呼ぶ。

いったんここから起動したら、通常通りレジスタなどを復元して再開する。
デバイスからの割り込みがきたら同様にアップコールで実行時システムに通知され、実行時システムは適切な処理をすすめる。
他のプロセスの入出力完了などで関係のない場合は、ハンドラの終了時に割り込まれたスレッドの状態を割り込まれる前に戻す。

スケジューラアクティベーションの欠点は、アップコールに頼っていることで階層構造に習わない実装になってしまうこと。
通常階層 n の提供するサービスは n+1 で用いられ、逆に n+1 が提供するサービスを n は利用しない。
アップコールでは n+1 で提供される実行時システムを n の階層であるカーネルが叩いてしまっている。
JAXBを使ってみました

JAXBを使ってみたのでメモしておきます。

# はじめに
JAXB（Java Architecture for XML Binding）とは、Java SE 1.6 以降に含まれるライブラリで、Javaのオブジェクトと、XMLを、相互に変換することができます。

似たようなライブラリには、ApacheのXMLBeansがあるようですね。

# オブジェクト→XML変換
こんな感じで、さくっとできちゃいました。

```java:変換元データを保持するクラス
public class PersonBean {

    // Getter/Setterを省略して、publicにしてあります。

    public String name;
    public int age;

}
```

```java:変換処理
    @Test
    public void testMarshal() {
        // 準備

        // 入力オブジェクト
        PersonBean personBean = new PersonBean();
        personBean.name = "山田 太郎";
        personBean.age = 20;

        // 期待値
        String expected = "" //
                + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" //
                + "<personBean>\n" //
                + "    <name>山田 太郎</name>\n" //
                + "    <age>20</age>\n" //
                + "</personBean>\n" //
        ;

        // 出力先
        StringWriter sw = new StringWriter();

        // 実行
        JAXB.marshal(personBean, sw);

        // 検証
        assertThat(sw.toString(), is(expected));
    }
```

# XML→オブジェクト変換
```java:変換処理
    @Test
    public void testUnmarshal() {
        // 準備

        // 入力XML
        String input = "" //
                + "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n" //
                + "<personBean>\n" //
                + "    <name>山田 太郎</name>\n" //
                + "    <age>20</age>\n" //
                + "</personBean>\n" //
        ;
        StringReader sr = new StringReader(input);

        // 実行
        PersonBean actual = JAXB.unmarshal(sr, PersonBean.class);

        // 検証
        assertThat(actual.name, is("山田 太郎"));
        assertThat(actual.age, is(20));
    }
```


# 参考ページ
・[Java - JAXB使い方メモ - Qiita](http://qiita.com/opengl-8080/items/f7112240c72d61d4cdf4)
　※非常に分かりやすくまとまっていました！
Unity2Dメモ２ スクリプトからSpriteの透明度を変える

# スクリプトからSpriteの透明度を変える

```csharp:TransparencyTest.cs
public class TransparencyTest: MonoBehaviour {
    SpriteRenderer spriteRenderer;

	void Start () 
    {
        this.spriteRenderer = GetComponent<SpriteRenderer>();
        ChangeTransparency(0); // 完全に透明にする
    }

    void ChangeTransparency (float alpha) 
    {
        this.hukidashiRenderer.color = new Color(1, 1, 1, alpha);
    }
```
Unity改行コードでハマったのでメモ

明らかに定義している変数が宣言されてませんと表示され、
今まで通ってたコンパイルが突然エラーになった。
４５分近くハマってできるエンジニアさんに聞いたところ
以下の答えを得た。

●Unity上からC#スクリプトを作成する場合、BOM付きでLFの改行コードになるみたい

●MonoDevelop上からC#ファイルを作成するとBOM無しLFになり、
　BOM無しが原因やと思うけど日本語が正しく認識されていないっぽい


てっとり早く改行コードが何になっているか確認する方法はMonoDevelopを開き、
Tools→options→Text Editor→Makers and Rulers→Show invisible characters を
Alwaysにする。

こうすると各行の改行コードが一目瞭然！！

後、コメントの末尾には必ず．を付けた方がいいらしい
が、なんでかは不明
ransackのsort_linkをajaxで使う（サンプルアプリ付き）


## ransackのsort_link

ransackという検索機能を実現するgemがありますが、このgemは`sort_link`というソート用のhelperも用意しています。
これがとても簡単で便利で、kaminariと合わせたりしてあっという間にかっこいい一覧の出来上がりです。
でも、僕の探し方が悪いのか、sort_linkドキュメントが全然みあたらなかったのです。特にajaxで使おうとすると、全然情報がなくて困ってしまいました。

仕方ないのでソースを確認しました。

https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/helpers/form_helper.rb#L38

まず、ransackの`sort_link`は以下のように使います。
表示名以降は省略可能です。

```
sort_link(@search, :カラム名, 表示名, urlオプション, htmlオプション)
```

これを踏まえて、ajaxでソートしてみましょう。

## ajaxでソートする

必要最小限で抜き出すと、以下のようになります。

``` haml:index.html.haml
#users_index
  = render partial: 'users_table', locals: { users: @users }
```

``` haml:_users_table.html.haml
- url_options = { action: :index }
- html_options = { remote: true, method: :get }

%table
  %thead
    %tr
      %th= sort_link(@search, :name, url_options, html_options)
```

``` coffee:index.js.haml
:plain
  $('#users_index').html("#{escape_javascript(render partial: 'users_table', locals: { users: @users })}")
```

``` ruby:users_controller.rb
def index
  @search = User.search(params[:q])
  @users = @search.result
end
```

## サンプルアプリ

というわけで、サンプルアプリを作ってみました。kaminariと合わせてページネーション＋ソートのできる一覧画面です。

https://github.com/upinetree/ransack_sorts_sample
Soft Layer


Soft Layerは、IBMさんが提供するクラウドの一つの形式で、Amazon Web Service（AWS）と並ぶ内容です。Oracleのクラウドを見た時にそう思ったんですが、AWSから抜け切れないw　私としてはセカンドソリューションとしてどうだろうと思い、調べてみました。新卒同期がIBMにいて、よくわからんと言っていたので、それに対応しようかとｗ
まぁ、APIですら動かしていないので嘘付いているかもです。ご指摘いただいたら、修正します。

## 一言でいうと
AWSが軽量化を目指したクラウドだとすると、データセンターベンダーが構築するクラウドをイメージすると差がはっきりする。

## 何に使うのがいいのか？
プライベートクラウド及びハイブリッドクラウド
(ベアメタルでVMware使える)
ハイブリッドの時にプライベートクラウドとのネットワークが高速かつセキュアに構成できるなら、より可ですね。このあたり、内部の人に聞きたい。

##細かい特徴
ざっとみた感じでは、

* Virtual Serverのスペックは構成要素単位（CPU・メモリ・OS、ルートディスクなど）を指定できる
* ベアメタル（月額）でのホスティングサービスがある
* 仮想マシンを用途別にサービス名をつけているAWSとは異なり、仮想マシンにソフトウェアをアドオンする形でプロビジョニングしている
* NASが利用できる
* Storageがいい感じ。大きなストレージの価格感はリーズナブル
* しっかりしている分高いｗ、逆にエンタープライズを狙っているのかと

と思われます。

##サービスの比較表
サービス内容の網羅性はAWSの勝ちでしょうが、少し比較してみます。

| AWS | Software Layer |備考
|:----|----------------|---|
|EC2|Virtual Server|利用できるOSに差はなさそう。準備の無いOSにもImporterがある|
|EBS|Network Storage(SAN)| |
|AutoScaling|無し| |
|Elastic Load Balancer|Load Balancer| |
|VPC|無し| |
|Route53|Domain Service| |
|Direct Access|Firewall Gateway Appliances| |
|AWS Market Place|Network Appliance|ネットワークアプライアンスのみ|
|S3| Object Storage| |
|Glacier|Mass Storage Servers||
|Storage Gateway|無し||
|Import/Export|不明||
|RDS|Software MySQL/MS SQL|PostgreSQLはサポートしていない|
|DynamoDB|Software MongoDB/Riak|NoSQLとして比較|
|RedShift|無し||
|ElastiCache|無し||
|CloudFront|CDN||
|EMR|Software Cloudera Hadoop||
|Kinesis|無し||
|Data Pipeline|無し||
|AppStream|無し||
|CloudSearch|無し||
|SWF|無し||
|SES|Email Delivery||
|SNS|無し||
|SQS|無し||
|Elastic Transcoder|無し||
このへんで力つきましたｗ