OmniAICreator/Qiita-1.07M huggingface dataset:
ActiveAdmin の has_many の Form で NestedAttributes の画像 ( Paperclip ) リソースを更新する

# はじめに
ActiveAdmin で管理画面を作成した際に、NestedAttributes のリソースを更新する方法を調べて実装した時のメモ。

# 実装内容
User が複数の Picture (PaperClip を使用) を持つ際に、それを ActiveAdmin で追加、更新、削除を行えるようにする

# サンプルソース

### 使用するモデル
```rb:app/models/user.rb
class User < ActiveRecord::Base

  has_many :pictures, as: :holder, dependent: :destroy
  accepts_nested_attributes_for :pictures, limit: 3, allow_destroy: true

  validates :email, :name, presence: true
end
```
```rb:app/models/picture.rb
class Picture < ActiveRecord::Base

  WIDTHS = %i{640 200 142 80}
  STYLES = WIDTHS.map {|width| [:"w#{width}", "#{width}x>"]}.to_h

  belongs_to :holder, polymorphic: true

  has_attached_file :image, { styles: STYLES } # 同時に複数のサイズの写真を保存してくれる
  validates_attachment_size :image, less_than: 1.5.megabytes
  validates_attachment_content_type :image, content_type: %w{image/jpeg image/jpg image/png image/gif}

end
```
PaperClip の設定は省略します

### ActiveAdmin のリソースファイル

```rb:app/admin/user.rb
ActiveAdmin.register User do
  # 作成/編集
  form do |f|
    inputs  do
      input :name
      input :email
      has_many :pictures, heading: "プロフィール画像", allow_destroy: true, new_record: true do |u|
        u.input :image, :as => :file, input_html: { accept: 'image/*' },
          :hint => u.object.new_record? ? "プロフィール画像を指定して下さい" : u.template.image_tag(u.object.image.url(:w80))
      end
    end
  end

  permit_params :email, :name, { pictures_attributes: [ :image, :id, :_destroy ] }
end
```

# サンプルの説明
#### has_many
`allow_destroy` は削除可能か否かのフラグで、`true` にすると各 picture 毎に`削除する`というチェックボックスが表示される
`new_record` は、新しいレコード(リソース) の追加を許可するかのフラグで、`true` にすると `新規に "#{モデル名}" を追加する`のボタンが表示され、押下すると同じ input タグが追加される  


#### input
最初の引数は、picture の image なので、`:image`とし、画像ファイルのため、 `as` で `file` を指定
`input_html` の説明は[こちら](http://qiita.com/yutackall/items/2b16d1ac2bd64dedd16e#form-%E3%81%AE-input-%E3%81%ABattribute-%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)
`hint` は、ファイル選択ボタンの下部に表示するメッセージで、今回は、ユーザー情報変更画面でユーザーにプロフィール画像が存在する場合に、その画像の image タグを表示し、存在しない場合は、メッセージを表示
knockout.jsのclickバインディングでデフォルトイベントをキャンセルさせない

knockout.jsのclickバインディングは、普通に使うとデフォルトイベントがキャンセルされる。
（内部でpreventDefault()を呼び出しているようだ）

```html:hoge.html
<div data-bind="click: clickEvent">
	<a href="top.html"><!-- リンクに飛ばない・・・-->
</div>
```

これを防ぐには、指定した関数でtrueを返却するようにする。


```js:hoge.js
var clickEvent = function () {
	/*
	なんか処理
	*/
	return true;
}
```


```html:hoge.html
<div data-bind="click: clickEvent">
	<a href="top.html"><!--  リンクが動く！ -->
</div>
```

マニュアルに書いてあることだが、ちょっとハマったのでメモ。
Unityで相手の距離から放物線で命中する実装


# 概要

タイトルのものを作ろうと調べたところ、まとまったサイトが無いので備忘録
AI作るときに普通に使うしね
参考になったものを書いときます

# 今回やりたかったもの

[YouTube](https://www.youtube.com/embed/3B5NV4bAkoE)
<iframe width="560" height="315" src="https://www.youtube.com/embed/3B5NV4bAkoE" frameborder="0" allowfullscreen></iframe>

[Code]
(http://forum.unity3d.com/threads/throw-an-object-along-a-parabola.158855/)が公開されているのでこれを利用した

# 計算式

[高度計算サイト]
(http://keisan.casio.jp/exec/system/1204505832)では下記の式が公開されている

* 空気抵抗有する自由落下（時間から計算）
* 空気抵抗有する自由落下（距離から計算）
* 自由落下（時間から計算）
* 自由落下（距離から計算）
* 自由落下（速度から計算）
* 自由落下のエネルギー計算
* 放物運動（初速と角度から計算）
* 放物運動（高度と距離から計算）
* 放物運動（初速と時間から計算）
* 放物運動（時間と距離から計算）
* 放物運動（角度と距離から計算）
* 放物運動（角度と高度から計算）
* 高低差ある放物運動（初速と角度から計算）
* 高低差ある放物運動（高度と距離から計算）

# おすすめリンク
* [rigidbodyの落下位置を予測するには](http://tsubakit1.hateblo.jp/entry/20140609/1402320689)
* [狙撃の計算方法について](http://hakuhin.jp/as/shot.html)
ActiveRecordのtransactionメソッドはModelのインスタンスメソッドとしても呼び出せる


実は僕も最近知ったんですが、知らない人も多いようなので情報共有します。

ActiveRecordでトランザクションをかける場合のサンプルコードはこういう書き方になっていることが多いです。

```ruby
ActiveRecord::Base.transaction do
  david.withdrawal(100)
  mary.deposit(100)
end

# もしくは

Account.transaction do
  balance.save!
  account.save!
end
```

あたかも`transaction`メソッドはクラスメソッドとして呼び出す方法しかないように見えますが、実はインスタンスメソッドとして呼び出すことも可能です。

```ruby
balance.transaction do
  balance.save!
  account.save!
end
```

みなさんご存知でしたか？
知らなかった人は「ストックする」ボタンをクリック！（怪しい宣伝っぽい）

## 参考情報

上記サンプルコードは公式ドキュメントから拝借したものです。

http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
プロトタイプ制作ツール

# プロトタイプ制作ツール
今後デザイン制作の時に使ってみたいツールをメモ。
今後使用機会があれば、レポートも書きたい。

## inVision
http://www.invisionapp.com/

## Prott
https://prottapp.com/ja/

## POP
https://popapp.in/jp/

## Flinto
https://www.flinto.com/

## Origami
https://facebook.github.io/origami/

## Famer
http://framerjs.com/

## Pixate
http://www.pixate.com/

## Pingendo 
http://pingendo.com/

## Precursor
https://precursorapp.com/
Android開発してて不要なresourceを削除したい


画像素材やら色の定義やら文言やら、リリースのたびに増えたり減ったりするわけですが、使われてないモノを一括で削除したい。

と、いう欲望があるわけです。

lintでunusedなモノをチクチク消すのも良いですが、面倒すぎるし、どうせunusedなんだから消しても良いだろ。と。

何か良い方法ないかな、ググったらありました。
既知だったらアレですね。

# 結論

https://github.com/KeepSafe/android-resource-remover

これを使えば終わり。

# 使う

usageを見たら終わり。

## インストール

`pip install android-resource-remover`

## gradleと一緒に使う

アプリのディレクトリ上で下記のコマンドを実行

```sh:例
./gradlew lint && android-resource-remover --xml app/build/outputs/lint-results.xml(lintした結果がある場所を指定)
```

スッキリ(=^・^=)
Pepperストアのアプリを調べてみた

[ロボットスタート](http://robotstart.co.jp)代表の中橋です。みなさんこんにちは！今回の小ネタはPepperアプリの開発において、どんなアプリを作るべきか、作らないべきかの参考にしていただきたい記事となります。

----

先日テレビでPepperストアの一部の画面が写っていました。そこで公開されたアプリを事前にチェックしておくことで、皆さんのこれからのアプリ開発の内容が極力被らないようにしていきたいものです。

前提として一般販売時には100個程度のアプリが用意されるとアナウンスされています。また現在アプリとして用意されているのは、52個だと思われます。画面1ページに8アプリ、現在7ページあることでそれがわかります。今回はその中でTVで放送された36個のアプリだけの紹介ということになります。

![alt](http://robotstart.co.jp/assets/img/n74-01.jpg)

まず3ページ目。（1〜2ページ目は放映されていなかったので不明）。
・えいごずかん
・はみがきタイム
・花火師
・間違い探し
・叱ってペッパー
・Pepperと九九...
・feeling NIP...
・カウンセリング...

![alt](http://robotstart.co.jp/assets/img/n74-02.jpg)

4ページ目。
・動物なきマネク...
・Pepperと一緒...
・WORLD PROPOSE
・Pepper応援団
・Pepper Clock
・アルファベット...
・四字熟語
・Pepperからの...

![alt](http://robotstart.co.jp/assets/img/n74-03.jpg)

5ページ目。
・Wedding Mes...
・カンパイPepper
・Pepperお疲れ...
・スマイルトレー...
・釣りの夢
・床屋の夢
・スーパーマンの夢
・蕎麦屋の夢

![alt](http://robotstart.co.jp/assets/img/n74-04.jpg)

6ページ目。
・牛丼の夢
・マルマルモリモ...
・Locomotion
・Run the World
・待つわ
・ヘビーローテー...
・オーディション
・早口言葉

![alt](http://robotstart.co.jp/assets/img/n74-05.jpg)

7ページ目。
・ロボどっち
・あたりまえ体操
・主題歌
・ロボモジ

初期100個の中の36個のアプリですが、なんとなく方向性は掴めますね。家庭向き、子供向きのアプリが多くあるように感じました。

また新しい情報が入り次第お伝えしていきます！
sqlite3のDSN(filename)いろいろ

ちょっとした理由でsqliteについて調べていました。そこで、sqliteでデータベースを指定するDSN(ドキュメント上はfilename)はファイル名や":memory:"だけでなくいろんな設定ができるようだったので、メモします。

# sqlite3のDSN(filename)はURIにできる
sqliteの"filename"は、典型的にはファイル名を指定することが多いかと思います。たとえば`hoge.db`にデータベースを保存している場合は、単純にこのファイルへのパスを渡すわけですね。

```c:in_c.c
sqlite3_open("hoge.db", &db);
```

```go:in_golang.go
import _ "github.com/mattn/go-sqlite3"

db, _ := sql.Open("sqlite3", "hoge.db")
```

実は、このsqlite3_open()のfilename引数はパスだけではなく、`file:/path/to/database.db`のようにURI形式で指定することも出来ます。この何が嬉しいかというと、クエリパラメータを指定できることです。sqliteはfilenameのクエリパラメータで、データベースの振る舞いをある程度設定することができます。
＃ ちなみにsqlite3_open_v2()だとconstで指定することもできる

| クエリ | 例 | 意味 |
|:-:|:-:|:-:|
| vfs | データベースファイルで使用するVFSの名前を指定する。<br>[カスタムしたVFSを指定すれば、例えば任意のFS内のDBを使うとかが出来るらしい。](https://www.sqlite.org/vfs.html) |  |
| mode | データベースの読み込みモードを指定する。<br>**ro**:ReadOnly, **rw**:Read-Write **rwc**:Read-Write(無ければCreate) **memory**:In-Memory | `file:test.db?mode=rw` <br> `file:temporary?mode=memory` |
| cache | [Shared-cache mode](https://www.sqlite.org/sharedcache.html)を使用するかを指定する。テーブルロックをコネクション間で共有することが出来るようになるっぽい。<br>**shared**:有効 **private**:無効 | `file:test.db?cache=shared`
| psow | [Powersafe overwrite](https://www.sqlite.org/psow.html)の有効状態を設定する。なんかディスクの消費電力量を下げるらしい。<br>**1**:有効 **0**:無効 ||
| nolock |データベースのファイルをロックするかを指定する。ロックをサポートしないファイルシステムではdisableが便利だとされているが、複数プロセスから書き込んだら壊れるのだろうし、ロックな人生向けっぽい。<br>**1**:有効 **0**:無効 ||
| immutable | 読み込んだデータベースファイルには変更を書き込まないモード。<br>**1**:有効 **0**:無効 | `file:test.db?immutable=1`|

# sqliteでIn-Memory Database
sqliteはファイルベースのDBMSという印象が強いですが、RAMメモリ上にDBを展開する「[In-Memory Database](https://www.sqlite.org/inmemorydb.html)」という機能があります。プロセスを殺すとデータが揮発するので使いドコロは考えものですが動作はピカイチに早く、例えば一時的なデータ保持やモデルのユニットテストなどで便利な機能です。

In-Memory Databaseを使うときはよく`:memory:`というDSNが使われますが、これはコネクションごとに新しいDBを作成するため、コネクションを明示的に扱わない高級レイヤーの上ではなかなかハマります。
＃ 僕はそういうハマり方をキッカケに、sqlite楽しくでドキュメント読み漁ってしまった感じです

たとえばGoだと、

```go
import _ "github.com/mattn/go-sqlite3"

db, _ := sql.Open("sqlite3", ":memory:")
db.Exec(`CREATE TABLE TEST(id integer);`)

rows1, err := db.Query(`SELECT FROM TEST;`)
if err != nil {
    panic(err)
}
rows2, err := db.Query(`SELECT FROM TEST;`)
if err != nil {
    panic(err)
}
```

みたいな感じの呼び方をすると、`rows1`がクローズされていないので`rows2`では新しいコネクションが生成されますが、新規なDBに接続してしまうため`rows2`では意図に反して"No such table"エラーが返されてしまいます。

そこで、In-Memory DatabaseもURIで名前をつけてあげることにします。URIの`mode`パラメータには`memory`という指定ができますが、ここで`file:testdb?mode=memory`のように名前をつけてやることができます。(もちろんファイルには吐かれない)
こうすることでどのデータベースに接続するのかがハッキリしますから、複数コネクションになった時も意図したように動作するようになります。

# 感想
sqlite、シンプルなようで奥が深いのでドキュメント読んでると楽しい。
組み込みっぽい泥臭さもあってマツタケのようなDBだと思った。
RailsのTimezone設定をUTCからJSTに変えたい時

RailsのDefault設定で時間を画面出力するとこうなる。

```text:DefaultTimeZone

2ヶ月前 (2015-01-03 01:48:24 UTC)

```

時間を変更する方法には2種類存在する。
1. DBの保存時間を変更する
2. 表示のみをUST→JSTにする

DB保管は変えずに表示のみを変えた方が良さげに感じるので、僕は2.を利用しました。


#1. DBの保存時間を変更する

```rb:config/application.rb

config.active_record.default_timezone = :local

```

#2. 表示のみをUST→JSTにする

```rb:config/application.rb

config.time_zone = 'Tokyo'

```

↓

```text:JSTTimeZone

2ヶ月前 (2015-01-03 10:48:24 +0900)

```

# 参考
http://d.hatena.ne.jp/iriya_0624/20130429/1367244830


# おまけ

2ヶ月前と記載があるけど、これもrailsの機能で自動的に現在時間から変換をかけてくれる。

```erb:distance_of_time_in_words

<%= distance_of_time_in_words_to_now(tweet.tweeted_at) %>前

```

こんな感じで使いましょう。

http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-distance_of_time_in_words


♡Rails
Python3 + Django で MySQL に接続

# 概要

Python3 で MySQL に接続しようとしたときのメモです。

具体的な環境は次の通りです。

* Python 3.4.2
* MySQL 5.6.22
* Django 1.7.5

## インストールしたもの

Python3 と Django, MySQL は既にインストールされているものとします。

```
$ pip install PyMySQL
```

Python2 で大活躍だった python-mysql は Python3 環境では動かないようなので PyMySQL を代わりにインストールします。

## 設定

`settings.py` の DATABASES 変数を次のようにします。

```
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dbname',  # 適当です
        'USER': 'dbuser',  # 適当です
        'PASSWORD': 'FIXME',  # 適当です
        'HOST': 'FIXME',  # 適当です (ローカルホストなら空でも可)
        'PORT': 'FIXME',  # 適当です (デフォルトポートなら空でも可)
    }
}
```

ここまでした状態で, 次の二行を Django プロジェクトのどこかに追加します。私は `manage.py` の中に追加しました。

```py3
import pymysql
pymysql.install_as_MySQLdb()
```

私の環境ではこれで Python3 + Django から MySQL へ接続できました。
swiftのオプショナル型がちょっと腹に落ちた

# 概要
Optional型がちょっと腹に落ちたので、その辺のまとめあたり

http://qiita.com/cotrpepe/items/e30c7442733b93adf46a
ここによると

Optional型 : nilが入るのを許す
非Optional型 : nilが入るのを許さない

ふむ

## 宣言方法

```
var a: Int? // Optional型
var b: Int  // 非Optional型

var c: String? // Optional型
var d: String  // 非Optional型
```
オプショナル型は、基本Stringの後にびっくりマークがつきます
びっくりを省略すると強制的に非Optional型
では、早速使ってみよう

例えば

```
var d: String

if d != nil {
}
```
上記はif文でエラーです。だって、変数dは非オプショナルなので
nilが入るわけない。

他にもこれってパターンがあるんだろうけど、それは今後追記していく
linuxLibrary > デバッグシンボルを表示する > nm -D /lib/libm.so.6

動作環境

    CentOS 6.5

nmを使うことで共有ライブラリのデバッグシンボルを表示できる。

    $nm -D /lib/libm.so.6
    ...
    00ba3ee0 W floor
    00bab0f0 W floorf
    00bb28d0 W floorl
    00ba7c30 i fma
    ...

Link: [gdb の使い方・デバッグ方法まとめ](http://uguisu.skr.jp/Windows/gdb.html)の「nm コマンドを使う」
linuxLibrary > 実行ファイルが必要とする共有ライブラリを表示する > ldd a.out

動作確認

    CentOS 6.5

lddを用いることで、実行ファイルが必要とする共有ライブラリ(.so)が表示される。

    $ldd a.out
        linux-vdso.so.1 =>  (0x00007fff225ff000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003d2d400000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003d2d000000)

試しにソースに#include<math.h>を追加し、コンパイルで-lmを追加した場合、以下が追加された。

        libm.so.6 => /lib64/libm.so.6 (0x0000003d2e400000)
[Three.js] WebGLRenderTargetを使ってオフスクリーンレンダリング


[Three.js](http://threejs.org/)は色々なものをすぐに利用できるよう設計されています。
オフスクリーンレンダリングも例外ではなく、`THREE.WebGLRenderTareget`クラスを利用することで簡単にオフスクリーンレンダリングを行うことができます。

## コード

具体的には以下のようにセットアップし、それをテクスチャとして指定してやることで簡単にオフスクリーンレンダリングの結果をオンスクリーンで表示することができます。

### Render targetを作る

```js:webgl-render-target
var width = 100, height = 100;
var renderTarget = new THREE.WebGLRenderTarget(width, height, {
	magFilter: THREE.NearestFilter,
	minFilter: THREE.NearestFilter,
	wrapS: THREE.ClampToEdgeWrapping,
	wrapT: THREE.ClampToEdgeWrapping
});
```

render targetの作り方は非常に簡単。


### Render targetをテクスチャにする

通常のテクスチャと同様に、マテリアルの`map`に、生成したrender targetオブジェクトを渡してやるだけで、あとはそれをテクスチャとしてレンダリングしてくれるようになります。

```js:setup-render-target-as-texture
var planeGeo = new THREE.PlaneGeometry(200, 200, 10, 10);
var planeMat = new THREE.MeshLambertMaterial({
	color: 0xffffff,
	map: renderTarget,
	side: THREE.DoubleSide
});
```


## Render targetにレンダリングする

さて、上記まででセットアップが終わりました。
が、これだけではなにも画面には出力されません。
当然ですが、生成したrender targetに対してなにも、レンダリングする命令をしていないからです。

ただ、これも非常に簡単で、単純にレンダラーの`render`メソッドの第三引数に、生成したrender targetを指定してやれば、あとは勝手にオフスクリーンレンダリングを行ってくれます。非常に手軽ですね。
*（自分でこれをやろうとすると、フレームバッファのバインド切り替えやテクスチャのバインド切り替えなど、だいぶ手間がかかります）*

```js:render-in-offscreen
renderer.render(subScene, subCamera, renderTarget);
```

ちなみに、オフスクリーンレンダリングする場合はメインのシーンではないなにかをレンダリングするはずなので、渡される第一、第二引数は、オフスクリーンレンダリングを行いたいシーンとカメラを指定してレンダリングすることがほとんとでしょう。

あとは、これをレンダリングループ内でupdateしてやればオフスクリーンレンダリングされたものをテクスチャとして画面にレンダリングしてくれます。
ShinobiLayer: CDNキャッシュを明示的にPurgeする方法(Customer Portal編）

#はじめに
基本的にSoftLayerのCDN（中身はEdgeCastのCDN）のキャッシュ制御は、Origin Server側で実施する必要があります。

（参考）
What are some example configuration changes for Origin Pull on an Apache Web Server?
http://knowledgelayer.softlayer.com/faq/what-are-some-example-configuration-changes-origin-pull-apache-web-server

とはいっても、Originサーバーでコンテンツを置き換えた時に、即時にキャッシュ内容を反映させたい時などには、やはり明示的に既存のCDNキャッシュをPurgeさせ、新しいコンテンツをキャッシュさせたいものです。この記事では、カスタマーポータルからCDNキャッシュをPurgeさせるための方法を紹介したいと思います。

#Customer PortalでのPurge画面
**Storage -> CDN -> "CDN Account ID"**から**Cache Management**のタブを選択すると、以下のような画面が出てきます。ここに該当のURLを入力して、**Purge**ボタンを押せば完了です。
![CDN_CapturedImage.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/97f74697-637d-330d-9539-b019b99cd6be.jpeg)

#パージのルール
このGUI画面によると、
FTPの場合：　http://xxxxx.http.cdn.softlayer.net/00xxxxx/
HTTPの場合： http://xxxxx.http.cdn.softlayer.net/80xxxxx/
と紹介されているので、このURLをそのまま入力すればいいのね、簡単簡単・・・と思いきや、幾つか罠が潜んでいます。

結論からいうと、以下のルールに従うようです。

* **サブディレクトリまで含めて**全てのキャッシュを削除したい時は、最後に"/*"を付ける。

```
http://xxxxx.http.cdn.softlayer.net/80xxxxx/*
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/*
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/*
```

* **特定のファイルだけ**を削除したい時は、当然直接指定する。

```
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/index.html
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/images/ninja.png
```

* **特定のディレクトリ直下のファイルのみ**削除したい時は、ファイル名にワイルドカードを指定する。

```
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/*.*
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/images/*.jpg
```

以下、NGケース

* いくらワイルドカードが効くからといって、さすがに80xxxxxまでを省略して書くのはNG。 

```
http://xxxxx.http.cdn.softlayer.net/*
```

* ディレクトリ配下の指定になっていないので何も消えない。ディレクトリ配下全てを対象にしたいならば、/*を付けるべき。

```
http://xxxxx.http.cdn.softlayer.net/80xxxxx/
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin.mysl01.com/cdn/
```

* ディレクトリに対してワイルドカードは効かない。

```
http://xxxxx.http.cdn.softlayer.net/80xxxxx/origin*
http://xxxxx.http.cdn.softlayer.net/80xxxxx/*/cdn/*
```

#キャッシュのPurgeにかかる時間について
Customer Portal上での注意書きには、キャッシュパージに要する時間は3-5分程度と書かれてありますが、私が試してみた感じでは、コンテンツが少ないからか、多くのケースで2分程度で済んでいました。

#おわりに
slコマンド編は[こちら](http://qiita.com/testnin2/items/60b7d92103003ad70927)で紹介しています。
Tiny Core 6.1 64bit版のインストールと、dockerを動かそうとしたメモ

## CorePlus-current.iso からboot

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/93140f62-fefa-6165-22e0-8c766764bc07.png)

## tc-install.tcz のロード

```bash:
sudo mount /mnt/sr0
tce-load -i /mnt/sr0/cde/optional/tc-install.tcz
```

## 64bit版isoダウンロード

```bash:
wget http://tinycorelinux.net/6.x/x86_64/release/CorePure64-6.1.iso
```

## インストーラ修正

```bash:
cp `which tc-install.sh` .
```

```bash:
sed -e 's/vmlinuz/vmlinuz64/g' \
    -e 's/core/corepure64/g' \
    tc-install.sh > tc-install64.sh
```

## インストール実行

```bash:
sudo sh ./tc-install64.sh
```

![tc-install1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/cb67745c-c57a-68a8-6af9-fec831c7de61.png)

> i
> CorePure64-6.1.iso

![tc-install2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d688b4ae-6784-1a34-03b8-f89c6161b190.png)

> f




----

![tc-install4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8178295a-5a6e-f84f-6674-7e8347eddeee.png)

> 1

![tc-install5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/d07ffeff-6485-4ef4-c399-9a561686abcb.png)

> y

![tc-install6.png](https://qiita-image-store.s3.amazonaws.com/0/25728/e37ac73f-4c25-737e-5636-e667a16c591f.png)

> 3

![tc-install7.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c3df5207-9069-aacb-a2e8-00ae2ef98afe.png)

> 3
> 
> y

----

![tc-install8.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4fbdd0be-25ac-b65c-2a82-ce567718da2a.png)

インストール完了。
再起動しHDDから起動することを確認。



# 64bit版boot

## sshdの起動の仕方

```bash:
tce-load -wi openssh
cd /usr/local/etc/
sudo sed -i -e "s/sshdd/sshd/g" init.d/openssh
sudo cp ssh/sshd_config_example ssh/sshd_config
sudo init.d/openssh start
```

* /usr/local/etc/init.d/openssh 内でtypoあるので注意。


## docker動かそうとしたメモ

![スクリーンショット 2015-03-09 7.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c458309f-9830-51da-b659-d10d33647e44.png)

* [big my secret.](http://blog.samuelololol.org/)と同じ現象でbridgeをサポートしていない？？

![スクリーンショット 2015-03-09 7.46.15.png](https://qiita-image-store.s3.amazonaws.com/0/25728/4ecc4a81-cc1e-654c-bbf3-76ff6008d99b.png)

```bash:
tce-load -wi git
tce-load -wi xz
tce-load -wi iptables
tce-load -wi net-bridging-3.16.6-tinycore64
```

![スクリーンショット 2015-03-09 7.49.25.png](https://qiita-image-store.s3.amazonaws.com/0/25728/5577bb9c-cbe1-f2e3-afc9-3a2524c88bf9.png)


動いたように思ったが・・・

## docker pullは動く

![ubuntu.png](https://qiita-image-store.s3.amazonaws.com/0/25728/28624a75-fb6c-e2de-a23d-53529bfda306.png)

## docker runがダメだった。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/25728/266c8e05-6327-22dd-5213-a2bc6a7e95eb.png)

* [Binaries - Docker Documentation](https://docs.docker.com/installation/binaries/)

> a properly mounted cgroupfs hierarchy (having a single, all-encompassing "cgroup" mount point is not sufficient)

原因はcgroup対応だろうなぁ
Mac版pgAdmin3でタイトルバーが隠れてウインドウを移動できない場合


## 問題

Mac版pgAdmin3を起動すると画面が最大化された状態で表示される場合がある。
このときタイトルバーが隠れてしまうため、ドラッグアンドドロップでウインドウを好きな場所に移動できない。

![Screen Shot 2015-03-09 at 5.30.08.png](https://qiita-image-store.s3.amazonaws.com/0/7465/0196cb18-cee7-abce-36b7-427b819318e3.png "Screen Shot 2015-03-09 at 5.30.08.png")

## 解決方法

Optionキーを押しながらファイルメニューのWindowをクリックする。
するとArrange in Front (英語表示の場合)が表示される。

![Window_and_Menubar.jpg](https://qiita-image-store.s3.amazonaws.com/0/7465/bd3d7f5b-ac3b-cb29-511f-342d615f6882.jpeg "Window_and_Menubar.jpg")

Arrange in Front を選択すると、ウインドウの大きさが自動調整され、タイトルバーが表れる。

![Screen Shot 2015-03-09 at 5.32.25.png](https://qiita-image-store.s3.amazonaws.com/0/7465/91995f9d-770d-7f93-f7a7-86749e6201d5.png "Screen Shot 2015-03-09 at 5.32.25.png")

あーよかった！

## 参考文献

https://discussions.apple.com/message/7097809
AtomでKeybindがおかしいと感じたらCtrl+.

Atomのキーバインドがうまく動かないとき、重複していると求めているのとは違う挙動をしてしまうことがよくあるらしい。

優先度は個人キーバインドが高っぽいのでそれで解決してる例が大抵だと思うが今回は省略。

**このキーを押すとこんな動作するけどこのキーバインドどうなってるのかな？** ってのを確かめたいとき。

<kbd><kbd>Ctrl</kbd> + <kbd>.</kbd></kbd>で**Key Binding Resolver**を開いてキー入力をすると有効なコマンド、無効なコマンドが表示される。
![](http://puu.sh/grW4h/cd32ae865f.png)

…なんというかつらい。
![](http://puu.sh/grVkY/b52739d3fc.png)

衝突は避けて欲しいところだけどこれだけパッケージがあるとキーがいくらあっても足りない…
browserifyで動的生成するパスのrequireをしたい

browserifyは「事前にモジュールを探して結合する」という仕様上、requireのパスが動的に変わる場合にその解決ができません。

例えば、以下のコードはコンパイルは通りますが、ブラウザ上で実行した際に "Cannot find module './path/to/foo'" というエラーになります。

```
var fooPath = './path/to/foo';
require(fooPath);
```

なんで、これを読み込めるようにしたい場合は、対象のモジュールを

- コマンドラインからコンパイルする場合は [--require](https://github.com/substack/node-browserify#usage) を使うか
- JSからコンパイルする場合は [require](https://github.com/substack/node-browserify#brequirefile-opts) を使うか

またはこうする

```
// 実行する必要はない
if (false) {
  require('./path/to/foo');
}

var fooPath = './path/to/foo';
require(fooPath);
```

参考

- [require() a combined string path will not build the module into output script](https://github.com/substack/node-browserify/issues/883)
Spring Boot で TransactionManager に tx:advice の設定を反映する

Spring Boot で TransactionManager に `<tx:advice>...</tx:advice>` の設定を反映させる方法を調べたので、そのメモ書きです。

実現しようとしたのは、以下の内容です。

1. @Transactional アノテーションをクラスあるいはメソッドに毎回記述するのは面倒なので、webapp.sample.service パッケージの下にあるクラスのメソッドは全て @Transactional アノテーションを付加しなくてもトランザクションの対象になるようにする。
1. チェック例外発生時もロールバックされるようにする。
1. トランザクションのタイムアウトも設定する。

Spring Boot を使用しない Spring Framework の場合であれば WEB-INF 直下に applicationContext.xml を作成して、その中に `<tx:advice>...</tx:advice>` と AOP の設定を記述して、web.xml に /WEB-INF/applicationContext.xml が読み込まれるように設定すればよいようなのですが、Spring Boot には WEB-INF ディレクトリも web.xml もありません。

Bean の設定は Bean定義ファイルではなく Java Configuration のクラス内で @Bean アノテーションを付加して記述するので、同様にプログラムで記述する方法があるのかと思い調べてみましたが、そのような情報も見つかりませんでした。

結局いろいろ調査した結果、以下の方法で実現できました。

まず `<tx:advice>...</tx:advice>` と AOP の設定を記述した Bean定義ファイル ( 今回は applicationContext.xml にしています ) を resources ディレクトリの下に作成します。

```applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">

    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" rollback-for="Exception" timeout="3"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pointcutService" expression="execution(* webapp.sample.service..*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcutService"/>
    </aop:config>

</beans>
```

* Spring Boot では transactionManager という Bean が内部で定義済なので、Java Configuration のクラス内で明示的に定義する必要はありません。
* `webapp.sample.service..*.*` の記述で webapp.sample.service パッケージの下にあるクラス全て ( サブパッケージの下のクラスも ) が対象になります。

次に @SpringBootApplication アノテーションの上に `@ImportResource("classpath:applicationContext.xml")` を追加します。

```Application.java
package ksbysample.webapp.basic;

import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

import java.text.MessageFormat;

@ImportResource("classpath:applicationContext.xml")
@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}
```

これで webapp.sample.service パッケージの下にあるクラスのメソッドは全て @Transactional アノテーションを記述しなくてもトランザクション対象になります。
ADL無効化空間をつくる

ADLを無効化する方法を色々ためしてみて、一番綺麗にまとまったと思えるものができたのでメモしておきます。

```
#define ADL_INVALIDATION_SPACE( IDENTIFIER ) \
namespace IDENTIFIER {} using namespace IDENTIFIER; \
namespace IDENTIFIER

namespace test
{
ADL_INVALIDATION_SPACE( detail )
{
class something { ... };
}
void function( something obj ) { ... }
}

int main() 
{
  function( test::something() ); // oops, function not found
}
```
【Unity3d】Spineの使い方覚え書き

# Spine再生するには？
Spineを使い始めたけど、Unity3Dへの組み込み方が分かりずらかったので覚え書き。

**必要なもの**
- UnityのSpineランタイムスクリプト 

## 要約
- spineのオフィシャルサイトのトップからランタイムを選択、そこからGITHUBページを開く。
- GITHUBからランタイムスクリプトをzipダウンロードする。
（https://github.com/EsotericSoftware/spine-runtimes/tree/master/spine-unity）
- ダウンロードしたzipを解凍し、spine-csharp / spine-unityフォルダをAssetsフォルダにコピーする。
- STEP3のスクリプトをコピーした後、SpineデータをAssetsフォルダの下にエクスポートすると、UnityにSpineデータが読み込めるようになる。


## 詳細
### ランタイムリンクから
![pic1.png](https://qiita-image-store.s3.amazonaws.com/0/29098/b4e0837d-88ca-5b25-d011-c5d3179f23e1.png)

### Unity-C#を選択
![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/29098/7f103a06-28b0-6548-2b4e-46fcecd77ee6.png)

### spine-csharp/spine-unityをUnityのAssetsにコピー
![pic3.png](https://qiita-image-store.s3.amazonaws.com/0/29098/0fa36205-5c4a-7be9-881d-328725b6a5a3.png)
gravizoを使ってMarkdown内でGraphvizのグラフを表示する

[gravizo](http://www.gravizo.com/)というサービスを利用すればMarkdownの中にGraphviz互換のグラフが埋め込める模様。

使用例
------

`![](http://g.gravizo.com/g?${Graphvizのソースコード})`といった形式で表示するグラフを指定する。

以下、公式HPからの抜粋。

ソース:
```
![Alt text](http://g.gravizo.com/g?
  digraph G {
    aize ="4,4";
    main [shape=box];
    main -> parse [weight=8];
    parse -> execute;
    main -> init [style=dotted];
    main -> cleanup;
    execute -> { make_string; printf}
    init -> make_string;
    edge [color=red];
    main -> printf [style=bold,label="100 times"];
    make_string [label="make a string"];
    node [shape=box,style=filled,color=".7 .3 1.0"];
    execute -> compare;
  }
)
```

結果:
![Alt text](http://g.gravizo.com/g?
  digraph G {
    aize ="4,4";
    main [shape=box];
    main -> parse [weight=8];
    parse -> execute;
    main -> init [style=dotted];
    main -> cleanup;
    execute -> { make_string; printf}
    init -> make_string;
    edge [color=red];
    main -> printf [style=bold,label="100 times"];
    make_string [label="make a string"];
    node [shape=box,style=filled,color=".7 .3 1.0"];
    execute -> compare;
  }
)

---

Markdownの中でグラフを使いたくなることはちょくちょくあるので、これは便利そう。
UbuntuでNVIDIAのドライバをインストールする

Ubuntu 14.04 LTSでNVIDIAのグラフィックカードを使ったときの手順です。

NVIDIAのグラフィックカードを使っている場合、普通にUbuntuをインストールするとOSSドライバ（nouveau）が勝手に使われているはずですから、不便がなければそのままでいいと思います。

以下はnouveauと相性が悪いグラフィックカードを使っていたり、何かの気の迷いでプロプライエタリなドライバが使いたいときの手順です。

```
$ sudo add-apt-repository ppa:xorg-edgers/ppa
$ sudo apt-get update
$ apt-cache search 'nvidia-[0-9]+$'
nvidia-173 - NVIDIA legacy binary driver - version 173.14.39
nvidia-310 - Transitional package for nvidia-310
nvidia-319 - Transitional package for nvidia-319
nvidia-304 - NVIDIA legacy binary driver - version 304.125
nvidia-331 - NVIDIA binary driver - version 331.113
nvidia-340 - NVIDIA binary driver - version 340.76
nvidia-346 - NVIDIA binary driver - version 346.47
$
```

候補がたくさん出て来ますので、どのバージョンが自分の使っているグラフィックカードに対応しているかを調べる必要があります。

[NVIDIAドライバダウンロード](http://www.nvidia.co.jp/Download/index.aspx?lang=jp)に自分の使っているグラフィックカードの情報を入れて表示されたバージョンがアタリです。ちなみに私のMacBook Air（Late 2010）はGeForce 320Mなので、340.76が最新でした。

```
$ sudo apt-get install nvdia-340
```

上記のような手順でなくとも、Xからログインして「システム設定」「ソフトウェアとアップデート」「追加のドライバー」でインストールすれば同じことができるはずです。今回私が使ったMacBook Airの場合はnouveauが不安定すぎてGUIを長時間使えないような環境だったのでCUIから作業を行いました。

## 参考URL

- [xorg-edgers fresh X crack : “xorg crack pushers” team](https://launchpad.net/~xorg-edgers/+archive/ubuntu/ppa)
Selenium WebDriver入門

## はじめに
Seleniumの一部の知識まとめから~~jenkinsで~~実行させるところまで記載します。
rubyを使用したいと思います。

## Seleniumとは
Webブラウザを使いWebアプリケーションをテストするツール。
人の手を使ってテストしていた部分をSeleniumがブラウザ操作してくれる。

## Selenium WebDriverとは
Selenium RCとWebDriverを統合したもの。

### Selenium RCとは
HTML形式で記述されていたスクリプト[^1]にJava,Rubyなどプログラミング言語を追加し高度なスクリプト生成を可能にした。
Selenium RCでは、ローカルPC上で中継サーバー(Selenium Server)を起動し、この中継サーバ上でrubyなどのスクリプトが動作しJavaScriptのコードをWebページに埋め込んでいた。
これによりWebサーバー上にスクリプトを置かなくても済むようになった。[^1]
だがJavaScriptで操作する際に、ブラウザのセキュリティ制限によって多くの動作に制約を受けていた。

[^1]: Selenium Coreを調べてください。Seleniumの原型です

### WebDriverとは
WebDriverでは、テスト実行時にブラウザ操作をブラウザ拡張機能や、OSのネイティブ機能を使って行うようにした。そのため中継サーバが不要になりセキュリティの制約を受ける問題も解決した。

この2つを統合したものが、Selenium WebDriverです。
Selenium2とも呼ばれているようです。

### 実践
Selenium WebDriverには、各ブラウザ毎にドライバが用意されているようです。

#### ドライバの準備
今回はChromeを使用します。
Chromeの場合は、Chrome Driverをインストールする必要があるので、[こちら](https://code.google.com/p/selenium/wiki/ChromeDriver)からダウンロードします。

※自分はhomebrewを使っているので```brew install chromedriver```でインストールしました。

これだけだとSeleniumが定義しているRESTful API(JSON Wire Protocol)に従いHTTPリクエストを発行し、返って来たレスポンスを解釈して用途に合わせてまたHTTPリクエストを発行...と結構大変そうです。

公式からクライアントのライブラリ[^2]が出ているらしく、それを使うと良いようです。下記が提供されている言語らしいです。

* Java
* Ruby
* Python
* C#
* JavaScript(Node.js)

[^2]: 各クライアントライブラリは対応していないドライバがある可能性もあり、その場合はSelenium Serverを使うらしいです。これはJavaで書かれているらしい。

#### クライアントライブラリの準備
rubyでやるのでその環境を用意します。(Node.jsにしようかな...
```gem install selenium-webdriver```

#### コードを書いてみる
##### 手順
1. ```vi test.rb``` 打つ
2. 下記を書く

```
require "selenium-webdriver"

# Chrome用のドライバを指定
driver = Selenium::WebDriver.for :chrome

# Googleの画像検索にアクセス
driver.navigate.to "https://www.google.co.jp/imghp"

# name属性にqが設定されている要素を取得
inputElement = driver.find_element(:name, 'q')

# 取得した要素にパンケーキを設定
inputElement.send_keys "パンケーキ"

# name属性にbtnGが設定されている要素を取得
submitElement = driver.find_element(:name, 'btnG')

# 取得した要素をクリック
submitElement.click

# スクリーンショットを撮る
driver.save_screenshot('tabetai.png')

# テストを終了
driver.quit

```
3.```ruby test.rb``` 打つ

と以下画像が実行プログラムのカレントディレクトリに出来ていると思います。
![tabetai.png](https://qiita-image-store.s3.amazonaws.com/0/9551/08353730-c650-f0b5-b494-40932e5ace72.png)

環境の作成、実行が複雑じゃないので良いですね、、

jenkinsで実行させるところまで書きたかったんですが、次の更新で書きますm(_ _)m
SwiftでNSMutableArrayに追加したObjectをNSSortDescriptor使ってソートする

Swift で NSMutableArrayに追加した Object を NSSortDescriptor 使ってソートします。

* 作るオブジェクトは NSObject を継承します
* 今回は、日付（NSDate）でソートします

## Arrayの違い

* NSArray：変更不可
* NSMutableArray：変更可能

# 実際のSwiftのコード（元のNSMutableArrayを書き換え）

## 追記

tomohisaotaさんに指摘されて、もう少し調べてみました

```swift
import UIKit

class Memo:NSObject {
    var title = "無題"
    var created_at = NSDate()
    
    init(title:String) {
        self.title = title
    }
}

var _memos = NSMutableArray()

for key in 1...10 {
    var title = "繰り返し" + String(key)
    var memo  = Memo(title:title)
    _memos.addObject(memo)
}

let sort_descriptor1:NSSortDescriptor = NSSortDescriptor(key:"created_at", ascending:false)

_memos.sortUsingDescriptors([sort_descriptor1])

for key in 0...9 {
    var memo:Memo = _memos.objectAtIndex(key) as Memo
    println(memo.title)
}
```

# 実際のSwiftのコード（戻り値がArray）

```swift
import UIKit

class Memo:NSObject {
    var title = "無題"
    var created_at = NSDate()
    
    init(title:String) {
        self.title = title
    }
}

var _memos = NSMutableArray()

for key in 1...10 {
    var title = "繰り返し" + String(key)
    var memo  = Memo(title:title)
    _memos.addObject(memo)
}

let sort_descriptor:NSSortDescriptor = NSSortDescriptor(key:"created_at", ascending:false)
let sorts = [sort_descriptor]
let memos = _memos.sortedArrayUsingDescriptors(sorts) as NSArray

for key in 0...9 {
    var memo:Memo = memos.objectAtIndex(key) as Memo
    println(memo.title)
}
```
Go by Example: Interfaces



(この記事は [Go by Example: Interfaces](https://gobyexample.com/interfaces) を翻訳したものです。)

インターフェイスはメソッドの名前が付けられた集合体です。

```go
package main

import "fmt"
import "math"

// 幾何学的な形の基本的なインターフェースです。
type geometry interface {
    area() float64
    perim() float64
}

// 私達の例ではsquareとcircleにこのインターフェイスを実装します。
type square struct {
    width, height float64
}
type circle struct {
    radius float64
}

// Goでインターフェイスを実装するためにはインターフェイスの中のすべてのメソッドを実装するだけです。ここではsquareのgeometryを実装します。
func (s square) area() float64 {
    return s.width * s.height
}
func (s square) perim() float64 {
    return 2*s.width + 2*s.height
}
// circleへの実装です。
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}

// もし変数がインターフェイスの型であれば、定義されたインターフェイスの中のメソッドを呼ぶことができます。これは、すべての幾何学で動くようにするため、その特性を活かした幾何学の計測の関数です。
func measure(g geometry) {
    fmt.Println(g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}

func main() {
    s := square{width: 3, height: 4}
    c := circle{radius: 5}
    
    // このcircleとsquareの構造体はgeometryのインターフェイスを実装しています。なのでこれらの構造体のインスタンスを引数として計測するために使うことができます。
    measure(s)
    measure(c)
}
```

```
$ go run interfaces.go
{3 4}
12
14
{5}
78.53981633974483
31.41592653589793

```

Goのインターフェイスについてもっと学びたい場合はこちらの[素晴らしいブログ](http://jordanorelli.com/post/32665860244/how-to-use-interfaces-in-go)をチェックしてみてください。
CanvasのdrawImageメソッドの注意点


drawImageメソッドの引数に与える、width、height (厳密にはsw, sh, dw, dh )に0を指定した場合、
chromeとFirefoxでは問題なく動くものの、SafariとIEではnegativeな値と判別されてエラーとなる。

マスクアニメーションさせる際など、やりがちなので注意。
Androidのプッシュ通知を利用した担当者への障害自動連絡システムを作ってみた

#はじめに
システム障害発生時の連絡方法は、電話、メール、チャット、パトランプなど様々です。
障害発生時に自動で電話のような連絡を安価なシステムでできないか？と考え、試しに作ったのがこの連絡システムです。
個人利用では特に問題も起きていないので紹介することにしました。

#障害連絡の役割とは？
1. 担当者へシステム障害が発生していることを気付かせること
2. 担当者へシステム障害の内容を伝えること

#連絡の自動化の為、通知システムに必要な機能
1. 担当者がアラート通知を受信したことを判定できること
2. 担当者がアラート通知を受諾/拒否したことを判定できること

上記2点が実装できれば、障害連絡を完了すること、別の担当者へエスカレーションすることが可能となる

#作ったもの
1. Push通知を受信してアラーム音の再生、バイブレーション、メッセージを表示するAndroidアプリ
2. 監視システムが実行する連絡をハンドリングするスクリプト
3. Androidアプリからの連絡状況を受信するphpスクリプト

#このシステムできること
1. プッシュ通知をサーバ等から自分のAndroid端末へ自由に送ることができる
2. プッシュ通知をAndroidアプリで受信するとアラーム音の再生、バイブレーション、メッセージの表示、特定URLへの受信応答をさせることができる

#デモシステムの構成
![デモ](https://ma3ki.net/system_structure.png)

#デモ端末とシナリオ
- デモ端末

|端末名|OS|接続環境|連絡順|
|---|---|---|---|
|ASUS K010|4.4.2|Wifi|1|
|Xperia Arc|4.0|3G|2|
|Emulator|2.2|Wifi|3|

#デモ動画(.movファイル)

再生時間は3分です。
音量をあげないと何をしているかわかりません。
[デモ動画](https://memo.ma3ki.net/CloudMessageDemo_upload.mp4)

- デモ動画のシナリオ

1. sendmailプロセス停止により、Zabbixで障害検知
2. ASUSにアラート連絡、他の端末にはメッセージのみ連絡
3. ASUSが連絡に応答しない為、Xperiaにアラート連絡
4. Xperiaが NG ボタンで応答した為、Emulatorにアラート連絡
5. Emulatorも NG ボタンで応答した為、2巡目へ。ASUSにアラート連絡
6. ASUSが OK ボタンで応答した為、ASUS が OK を押したことを全端末へ連絡。連絡完了。
7. sendmailプロセス起動により、Zabbixで復旧検知
8. 全端末へ復旧したことを連絡。


#アプリの使い方
アプリは現在は公開していません。
scrollIntoView :: 任意のElement位置まで画面をスクロールさせるメソッド

こんなのあったの知らなかった・・IE6時代から使用できたんだぁ

```js
Element.prototype.scrollIntoView
```

こう使う

```js
element.scrollIntoView(true);
```

TOC の UI とかでハッシュフラグメント汚したくない時便利そう
SwiftのSpriteKitの中から別のViewControllerに切り替える方法

SpriteKitを使っていて、たとえば設定画面を作る場合通常のUIKitを使うViewControllerに切り替えたい場合があります。
最初に新しいViewControllerを作ります

「New File...」から「source」の「Cocoa Touch Class」を選んでUIViewControllerのサブクラスとなるクラスを作ります。ここでは仮に「SettingsViewController」という名前にします。
SKSeneの中から新しいViewControllerを呼び出します。

たとえばタッチイベントの中で次のようにします。まずViewControllerを作ります。

var mSettings:UIViewController = SettingsViewController()

次にビューコントローラを切り替えます

UIApplication.sharedApplication().keyWindow?.rootViewController = mSettings

これでうまく切り替わると思います。
JavaScript勉強メモ

## JavaScriptとは
* スクリプト言語
* インタプリタ型言語
* **JavaScriptでのオブジェクト=連想配列**

###オブジェクトリテラルの記法
Object.propertyName
Object['propertyName']

##比較演算子
###等価演算子 ==
データ型が違ってもなんとか等しいとみなせないかとがんばってくれる演算子

```js
document.writeln('3.14E2' == 314);  // true
document.writeln('0x10' == 16); // true
document.writeln('1' == 1); // true
```

###同値演算子 ===

等価演算子と違う点は、データ型を変換しないところ

```js
document.writeln('3.14E2' === 314);  // false
document.writeln('0x10' === 16); // false
document.writeln('1' === 1); // false
```

##関数
### 定義方法
* function命令
* 関数リテラル(=匿名関数)表現
* Functionコンストラクタ経由
  * 特徴
      * 引数や関数本体を文字列として定義できる 
      * スコープとしてグローバルオブジェクトからなるスコープチェーンを引き渡す

###関数が評価されるタイミング
関数リテラル・Functionコンストラクタは実行時(代入時)に評価される
→**呼び出し元のコードより先に記述する**

##スコープ
* グローバル：関数外で定義
* ローカル：関数内で定義
    * ローカル変数は関数の先頭で宣言する
* 変数定義にvar命令は必須
* 無名関数にするとスコープに依存しなくなる(どんな関数やメソッド内に記載しても動く)
* 文ブロックレベル({...})のスコープは存在しない。以下のコードが正しく動作する

```js
 if (true) {
   var i = 5;
 }
 document.writeln(i); //5 
```

##クロージャ
**シンプルなオブジェクト**
* 処理をひとつしか持たないオブジェクトのようなもの
* ローカル変数を参照している関数内関数
* 状態を持てる

##他
###JavaScriptではすべての引数は省略可能である
* argumentsオブジェクトの用途…可変長引数関数なので柔軟に処理を記述できる
* 与える引数の数が関数側で要求する数と異なっていてもチェックしない
* 明示的に宣言された引数と可変長引数を混在させることも可
docker compose使ってみた

Docker Composeが正式公開されたということで、早速使ってみました。なと、Dockerはインストール済みってことでだいぶ端折って書いています。

## インストール

私の試した環境はCentOS 6.6でしたが、以下でさくっと完了しました。楽チン

```
curl -L https://github.com/docker/compose/releases/download/1.1.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

## docker-compose.yml

基本的には[公式ドキュメント](https://docs.docker.com/compose/)を読めば、Dockerをそこそこ触ったことがあれば詰まるようなところはないかと。

```
app:
  image: localhost:5000/webapp
  volumes:
    - /path/to/host:/path/to/container
  net: "host"
redis:
  image: redis
  volumes:
    - /path/to/host/data:/data
  net: "host"
```

地味にハマったところがvolumesのところで、Array形式で書かなかったら動かなかったという。。ドキュメントはちゃんと読みましょうorz

appのimageは、[Private Registry](https://github.com/docker/docker-registry)からイメージを取得する感じになっています（Private RegistryもDockerコンテナなのでとっても便利）。

ちなみに、いちいちポート指定するのが面倒になってきたので、--net=hostをよく使っています。

## 起動

docker-compose.ymlのあるディレクトリで以下を実行すればコンテナが起動します。

```
docker-compose up -d
```

蛇足ですがdオプションはデーモン起動させるためです。

起動したかどうか確認するには、普通にdocker psでもいいし、以下でも大丈夫でした。

```
docker-compose ps
```

ymlファイルの記述がミスっていてゴミが残って再起動できないときがあって、その時は以下で解決しますた。

```
docker-compose rm
```

## 感想とか

* とても便利。こういうのを欲していた感。
* オーケストレーションツールは他にも色々出てきていて、お仕事で使うにはどれを選択するか、現状なかなか悩ましい状況ですね。ベータ版のものも多いし。。
* 私の場合は、まずは開発開発用にNginx + webapp + Fluentd + Redis + Mysqlみたいな、必要なもの全部入りのdocker-compose.ymlを作ってみる使い方になりそうです。
 * 今までひとつずつ起動してたのが楽になりそう
* 次はDocker Swarmを使ってみよう
Jupyterで日本語ラベルを使ったグラフを描画する

IPython Notebook、デフォルト状態ではグラフ中の日本語ラベルが豆腐になるので設定ファイルで日本語フォントを指定して使っている人が多いと思う。しかしIPythonを3にアップデートしたらIPython Notebookが[Jupyter](http://jupyter.org/)になり、日本語が再び豆腐になってしまった。

どうやら設定ファイルの構成が変わった様で、既存のProfileをそのまま使えなくなった。`ipython_*_config.py`ファイルは既存と同じ名前の物でもデフォルトの内容が変わっているので、Profileごと作り直した方が良さそう。

## Jupyterの設定ファイル

IPython 3.x系ではIPython 2.x系の `ipython_notebook_config.py`が`ipython_kernel_config.py` と `ipython_notebook_config.py` に分かれた模様。

Matplotlibで日本語ラベルを使いたい場合は `ipython_kernel_config.py` に書く必要がある。

```py:ipython_kernel_config.py
c.InlineBackend.rc = {
    'font.size': 11,
    'font.family': 'Osaka',
    'figure.figsize': (6.0, 4.0),
    'savefig.dpi': 80,
    'axes.titlesize': 12
}

c.InlineBackend.figure_formats = set(['png', 'retina'])
```

これで日本語ラベルが使える。

![スクリーンショット 2015-03-08 23.29.49.png](https://qiita-image-store.s3.amazonaws.com/0/2130/e3c3fa26-df58-a569-720e-b233eccdbd5f.png)


## 設定値の確認

Jupyter上で

```py
import matplotlib
matplotlib.rcParams.get('font.family')
```

利用可能なフォント一覧は

```py
import matplotlib.font_manager as fm
fm.findSystemFonts()
```

で得られる。
Amazon EC2のタイムゾーンを日本時間に変更する方法

Tokyoリージョンでインスタンスを立ち上げたものの、タイムゾーンが初期設定でUTCになっていたので、日本時間に変更する方法。
確認するとこんな感じ。

```vim
$ date
2015年  3月  8日 日曜日 14:19:26 JST
````

# 時間帯の変更

## Step1 インスタンスで使用する時間帯を検索
`/usr/share/zoneinfo`にすべての時間帯があるので、そちらを参照。

```vim
$ ls /usr/share/zoneinfo/
````
ずらっと国名が出てくるので、その中に`Japan`があることを確認。

## Step2 clockファイルの変更

```vim
$ vim /etc/sysconfig/clock
````
こちらでファイルを編集

```vim
# ZONE="UTC"
ZONE="Japan"
UTC=true
````
先ほどのファイル内にあったファイルを記述。
ちなみに、ロサンゼルスだと`ZONE="America/Los_Angeles"`のようになる。

## Step3 時間帯ファイルにシンボリックリンク
インスタンスが現地時間情報を参照する際に、時間帯ファイルを読み込むためシンボリックリンクをはる。

```vim
$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime
````

## Step4 システムの再起動

```vim
$ sudo reboot
````

## Step5 日本時間になってるかを確認

```vim
$ date
2015年  3月  8日 日曜日 23:19:26 JST
````
こんな感じ
Macのログイン時に表示されるアイコンの画像のファイルの場所


参考：http://nuricabe.blogspot.jp/2013/07/mac-os-x-108_10.html

アイコンの元のファイルがどっか行っちゃったけどアイコンだけ欲しいという場合。

``` bash
cd ~/Library/Containers/com.apple.ImageKit.RecentPictureService/Data/Library/Images/Recent\ Pictures
```

ここに画像ファイルがある。
Ansible の shell モジュールでチェックモードも考慮して冪等性を保つ

まずは結論から、例えば以下のようなタスクの場合、

- uname -a コマンドの結果を /tmp/hoge に出力する
- /tmp/hoge が既にあるなら実行しない
    - コメントの通りファイルの存在確認なら stat モジュールで十分なのですが、より多くのケース（なにかしらのコマンドの結果を元に実行の有無を制御）を想定してあえて shell モジュールを使います

次のようにします。

```yaml
- hosts: localhost
  tasks:
    - shell: test -e /tmp/hoge
      register: res
      always_run: yes
      failed_when: no
      changed_when: res.rc != 0

    - shell: uname -a > /tmp/hoge
      when: res|changed
```

これだけなら shell モジュールの creates を使うだけでいいんじゃない？
と思わなくもないですが、良いサンプルが思いつかなかったのでその辺は無視してください。

# その１

単に uname -a の結果を /tmp/hoge に書くだけなら、何回実行しても結果は変わらないので次のようにしても大丈夫です。

```yaml
- hosts: localhost
  tasks:
    - shell: uname -a > /tmp/hoge
```

# その２

がしかし、これだと何回実行しても changed と表示されます。

せっかく Ansible を使うならその辺の表示もそれなりにしたいところです。

そこで、タスクを実行する必要があるかどうかを先行するタスクで確認する方法が考えられます。

```yaml
- hosts: localhost
  tasks:
    - shell: test -e /tmp/hoge
      register: res
      failed_when: no

    - shell: uname -a > /tmp/hoge
      when: res.rc != 0
```

最初の test のタスクで /tmp/hoge が存在するかどうか確認し、その結果から次のタスクを実行するかどうかを when で分岐します。

# その３

がしかし、これだと test の方のタスクが常に changed になってしまいます。

test のタスクはファイルの存在をチェックしているだけで実際にはなにもしないので、次のように `changed_when` を追加して changed にならないようにします。

```yaml
- hosts: localhost
  tasks:
    - shell: test -e /tmp/hoge
      register: res
      failed_when: no
      changed_when: no

    - shell: uname -a > /tmp/hoge
      when: res.rc != 0
```

これで test のタスクは常に ok となります。

# その４

がしかし、このプレイブックをチェックモード (`--check|-C`) で実行すると失敗します。

チェックモードでは shell はスキップされるため、２番目のタスクの when で参照している res 変数が未定義になるためです。

そこで、次のように test のタスクに `always_run` を追加してチェックモードでも実行されるようにします。

```yaml
- hosts: localhost
  tasks:
    - shell: test -e /tmp/hoge
      register: res
      always_run: yes
      failed_when: no
      changed_when: no

    - shell: uname -a > /tmp/hoge
      when: res.rc != 0
```

これで test のタスクはチェックモードでも実行されるので、２番目のタスクで res 変数が未定義になることはありません。

# その５

がしかし、このプレイブックを、/tmp/hoge が存在しない、かつ、チェックモード、で実行すると、changed が 0 件になります。２番目のタスクが when の条件に依らずチェックモードだとスキップされるためです。

プレイブックを実行する前に、なにかしらの変化があるかどうかを予め確認するためにチェックモードで実行することはあると思います。が、これではあたかもプレイブックを実行する必要が無いように感じてしまいます（実際には /tmp/hoge が作成されていないにも関わらず）。

そこで、２番目のタスクを実行する必要があるときには、１番目のタスクが changed になるようにします。

```yaml
- hosts: localhost
  tasks:
    - shell: test -e /tmp/hoge
      register: res
      always_run: yes
      failed_when: no
      changed_when: res.rc != 0

    - shell: uname -a > /tmp/hoge
      when: res|changed
```

というわけで、最初に示した形になりました。

# まとめ

整理すると・・・

- 実行の要否を判断するタスク
    - test コマンドなどの実際にはなにも変化をもたらさないことだけやる
    - チェックモードでも実行されるように `always_run` を指定する
    - 実行結果を `register` で変数に登録する
    - 終了コードが非ゼロでも失敗にならないように `failed_when` を指定する
        - 実行するコマンドによっては必要ない
        - 例えば実行の要否を標準出力で判断する場合など
    - 実行の要否を `changed_when` で指定する
        - 実行が必要な場合に changed にする
- 実際に処理するタスク
    - 先行するタスクが changed のときだけ実行する

となります。
React + Browserify + Gulp

以下のようなことがやりたくて環境を整えてみたのでメモ。

* [React](http://facebook.github.io/react/)つかいたい + JSXで書きたい
* 再利用できそうなComponentを別のjsファイルにしておいて、requireで依存性を解決とかしたい
* トップページ用のjsと、検索ページ用のjsが別々に存在してる、みたいな想定。うまく言えないけどrequireのrootが複数あるような？
* watchしておいて勝手にビルドされるといいな

ということでタイトルのものを組み合わせてみたのだけれど、不勉強だからか意外とハマりました。。

## package.json

色々試行錯誤していって最終的に以下のようなpackage.jsonが出来上がりましたという感じです。

```package.json
{
  "name": "test-proj",
  "description": "test project",
  "main": "gulpfile.js",
  "scripts": {
    "watch": "gulp watch"
  },
  "devDependencies": {
    "browserify": "^9.0.3",
    "gulp": "^3.8.11",
    "gulp-compass": "^2.0.3",
    "gulp-rename": "^1.2.0",
    "gulp-sourcemaps": "^1.5.0",
    "gulp-uglify": "^1.1.0",
    "jquery": "^2.1.3",
    "react": "^0.12.2",
    "reactify": "^1.0.0",
    "through2": "^0.6.3",
    "vinyl-buffer": "^1.0.0"
  }
}
```

## gulpfile.js

そしてgulpfile.jsがこちら。package.jsonもそうだけど、いちど苦労したら後はこのファイルを共有すれば他のメンバーが苦労せずに済むって素晴らしい。

```gulpfile.js
var gulp = require("gulp");
var sourcemaps = require('gulp-sourcemaps');
var buffer = require('vinyl-buffer');
var through  = require('through2');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var compass = require('gulp-compass');
var browserify = require("browserify");
var reactify = require("reactify");

gulp.task("browserify", function() {
    var browserified = through.obj(function(file, enc, next) {
        browserify(file.path)
            .transform(reactify)
            .bundle(function(err, res) {
                file.contents = res;
                next(null, file);
            }
        );
    });

    gulp.src("./js/src/*.jsx")
        .pipe(browserified)
        .pipe(rename({extname: ".min.js"}))
        .pipe(buffer())
        .pipe(uglify())
        .pipe(sourcemaps.init({loadMaps: true}))
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest("./js/dist"));
});

gulp.task("compass", function() {
    gulp.src("./sass/**/*.scss")
        .pipe(compass({
            config_file: "config.rb",
            comments: false,
            css: "css",
            sass: "sass"
        }))
        .pipe(gulp.dest("./css"));
});

gulp.task("watch", function() {
    gulp.watch("./sass/**/*.scss", ["compass"]);
    gulp.watch("./js/**/*", ["browserify"]);
});
```

一番ハマったのが複数のjsファイルをBrowserifyでビルドするところで、ググったらvinyl-source-streamとかvinyl-transformを使っているサンプルが出てきたんだけどうまくいかなくて、結局上のようになりました（どこかのFAQに載ってた）

あと、ついでにSCSS+Compassのビルドも書いてあります。

## 感想とか

* フロントエンド界隈は最近アップデートが追いついてなくて、上で出てきたほとんどのものは初めて触ったのだけど、どれもこれも素敵で好きになれそうｗ
* でも流行り廃りが早くておじさんついていけないよ。でも新しいことを勉強するって楽しい。
TDD（テスト駆動開発）メモ

某所でテストの神様と呼ばれるt-wadaさんの講演を聞く機会があったので、参加してきました。
その際に聞いた話＆学びを残していきます

#TDD（テスト駆動開発）とは
プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き（これをテストファーストと言う）、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる、という短い工程を繰り返すスタイルである。 
(wikipedia参照)

#TDDの進め方
1. テストコードが失敗するコードを書く
2. 最低限動くコードを書く
3. テストを失敗させるテストコードを書く
4. ３で失敗したテストコードが通るようにコードを修正する
5. テストが通った状態でリファクタリングをしていく

#さっそくやってみる
今回はmochaでテストを書いていきます
###1. テストコードが失敗するコードを書く！

```lang:test.js
describe('偶数かどうかチェックする関数', function() {
    it ('２は偶数なのでtrueで返す', function() {
        var result = checkEven(2);
        assert(result === true);
    });
});
```

checkEvenという関数が存在しない＆assertをよんでいないので、失敗します。

###2. 最低限動くコードを書く！

```lang:test.js
var assert = require('assert');

function checkEven() {
    return true;
}

describe('偶数かどうかチェックする関数', function() {
    it ('２は偶数なのでtrueが返ってくる', function() {
        var result = checkEven(2);
        assert(result === true);
    });
});
```

###3. テストを失敗させるコードを書く

```lang:test.js
var assert = require('assert');

function checkEven() {
    return true;
}

describe('偶数かどうかチェックする関数', function() {
    it ('２は偶数なのでtrueが返ってくる', function() {
        var result = checkEven(2);
        assert(result === true);
    });

    it ('3は奇数なのでfalseが返ってくる', function() {
      var result = checkEven(3);
      assert(result === false);
    });
});
```

evenCheck関数が必ずtrueを返すので２つ目のテストは失敗する

###4. 3で失敗したテストが通るようにコードを直す
```lang:test.js
var assert = require('assert');

function checkEven(num) {
    if (num % 2 === 0) {
      return true;
    } else {
      return false;
    }
}

describe('偶数かどうかチェックする関数', function() {
    it ('２は偶数なのでtrueが返ってくる', function() {
        var result = checkEven(2);
        assert(result === true);
    });

    it ('3は奇数なのでfalseが返ってくる', function() {
      var result = checkEven(3);
      assert(result === false);
    });
});
```

これで全部のテストが通ります！
次にこの状態を保持してリファクタリングをします。

###5.テストが通った状態でリファクタリングをしていく
```lang:test.js
var assert = require('assert');

function checkEven(num) {
    return num % 2 === 0;
}

describe('偶数かどうかチェックする関数', function() {
    it ('２は偶数なのでtrueが返ってくる', function() {
        var result = checkEven(2);
        assert(result === true);
    });

    it ('3は奇数なのでfalseが返ってくる', function() {
      var result = checkEven(3);
      assert(result === false);
    });
});
```

これがTDDのひと通りの流れです。

#感想
テストコードを書きながら開発が進められたら一番いいけど
納期とか色々あってうまくいかないこともあるかもしれません。
その時はそっちを優先するとしてもきちんとテストコードを書く癖をつけます。
結構テストを書いている時に思うのが、どこまで書けばいいのか、これで足りるのかを悩んでしまいます。
今後はそのへんも考えてテストしていきたいです。
Ubuntu14.04にOracle JAVA （JDK8）を入れる。

##元ネタ
http://askubuntu.com/questions/56104/how-can-i-install-sun-oracles-proprietary-java-jdk-6-7-8-or-jre
日本語の記事が無いようなのでここに記載しておく。

前提条件としては、すでにOpenJDK6とOpenJDK7あたりを入れていること。

### 入手
最新版はやはり公式からのほうが早いような気がする。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
もし、サーバーとかでwgetで欲しい人は以下を参考
http://qiita.com/hajimeni/items/67d9e9b0d169bf68d1c9

### 解凍と配置
```lang:shell
tar -xvf jdk-8u40-linux-x64.tar.gz
sudo mkdir -p /usr/lib/jvm
sudo mv ./jdk1.8.0_40 /usr/lib/jvm/
```
### alternativesに登録をする。

```lang:shell
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jdk1.8.0_40/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/jdk1.8.0_40/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/lib/jvm/jdk1.8.0_40/bin/javaws" 1
```

### 権限周りを念の為再度設定しておく。
```lang:shell
sudo chmod a+x /usr/bin/java
sudo chmod a+x /usr/bin/javac
sudo chmod a+x /usr/bin/javaws
sudo chown -R root:root /usr/lib/jvm/jdk1.8.0_40
```
### jdkなのでjava,javac,javawsのalternativesを設定する。

```lang:shell
sudo update-alternatives --config java
sudo update-alternatives --config javac
sudo update-alternatives --config javaws
```

### 確認
```lang:shell
java -version
```

まあ後はスクリプトでやるといいような話もあるが今回はここまで。