OmniAICreator/Qiita-1.07M huggingface dataset:
Twitterに手軽にキャプチャ画像を投稿するためのツール調査


# 動機
何も考えずにGyazo使っていたけどTwitterに画像が反映されなくてつらいと思ったのでその手のソフトを探した．

# 結論
WindowsでTwitterに直アップするならShareX．Gif動画も取れる．
個人的にYabumiに期待．

# 適当な比較表
**注意**：機能がいろいろあるため一概に比較できないので（例えばYabumiにはウェブページ全体をキャプチャできる便利なChrome extensionがあるが，他にはない），主要機能しか表にしません．

| |ShareX|Gyazo|Yabumi|
|:-- |:--:|:--:|:--:|
|**キャプチャ 範囲選択，フルスクリーン**|○|○|○ |
|**キャプチャ Gif動画**|○|○1|×|
|**画像の差し替え**|×|×|○|
|**画像の加工**|△2|○（有償）|×|
|**スマホ版の有無**|×|○|×|
|**Win版の有無**|○|○|○|
|**Mac版の有無**|×|○|○|
1: [長い動画は取れない](#gyazo)
2: アップロード時に画像エディタを起動することが可能

包括的な比較はこちらのブログが参考になります：[オレオレGyazoはもう古い メチャ便利Lightscreenを使おう - 酢飯をおかずにご飯を食べる。](http://eai.hateblo.jp/entry/2015/02/18/061707)

## 主観的レビュー
### [ShareX](https://getsharex.com/)
ファイルの形式ごとに指定したサービスにアップロードしてくれる便利ソフト．
例えばテキストをドロップしたらSecret gist，動画ファイルをドロップしたらGoogle Driveに保存...なんてことができる．もちろんクリップボードにURLをコピーしてくれる．
メジャーなストレージサービスに対応しているので，自分が使ってるサービスは大抵あるはず．

#### pros
- Twitterに直アップできる
- Open source
  - リポジトリ：[ShareX/ShareX](https://github.com/ShareX/ShareX)

#### cons
- なれるまでUIが複雑
  - 注意深く試さないと，アップロードした画像の消し方がわからないということになる（なった）．どうでもいい画像で練習しよう．
- Macで使えない


### [Gyazo](https://gyazo.com/ja)
#### pros
- UIがシンプルで取っ付き易い（これに特化してる）
- ブログに埋め込むことができる（有償）

#### cons
- 直近5枚までしか管理画面しかアクセスできない（６枚目からは管理画面からURLが取得できず，URL捜索タイムがはじまる）．削除はできる．
  - 月額320円でこの縛りは開放できる．
  - 簡単なプログラムでこの不便さは解消できそうだけど...
- Gifの時間設定がシビア（7－8秒）．長い動画は見たくないのでいい縛りかもしれないけど．
- [Twitterカード](https://dev.twitter.com/ja/cards/overview)に対応していない（サムネイルが表示されない）
  - Twitterで不特定多数に見せることが想定されていないのかも．Twitterで公開するのが前提ならハッシュ化したURLなんていらないし．
  - ...と思ったら，トップページの売り文句に「チャットやFacebook、Twitter、Tumblrなどにリンクを貼り付けて画像を一瞬で共有できます」

Web版で，過去画像を削除してもリロードするまでサムネが消えないバグを見つけました．
https://gyazo.com/434013b50294c080ea6bb41f76b783de

### [Yabumi](https://yabumi.cc/)
#### pros
- [Twitterカード](https://dev.twitter.com/ja/cards/overview)に対応している
- あとから画像を差し替えることができる
  -  修正はあるあるなので地味に便利
- 削除時間を指定可能
- 無駄にpsdのレイヤーに対応している
  - [遊んでみた](https://yabumi.cc/14f7ec19de56f2ba6ff69907.psd)
  - ハートマークのあるレイヤーを消すとやや不機嫌に見える
      - 漫符すごい
- Open source
  - リポジトリ：[Webnium](https://github.com/webnium)
- 複数ブラウザ間での履歴共有が可能．（Thanks [@MugeSo](http://qiita.com/motoso/items/e8558d363a9bad43a5f4#comment-b48534acb98cfbefa732)）

開発用APIが公開されていて使ってみたい．
デザインがかっこいいし，機能の見せ方にセンスがある（個人の印象です）．

#### cons
- Gif動画がアップロード出来ない
- 
Winのデスクトップ用アプリを使うと範囲選択でアップロードできるが，個人の履歴に残らないので削除不能．

  - Windows ～8.1かつ常用のブラウザがWeb Storageに対応していればWeb版から表示可能．（Thanks [@MugeSo](http://qiita.com/motoso/items/e8558d363a9bad43a5f4#comment-b48534acb98cfbefa732)）
- Windows store版のキャプチャの範囲選択が難しい！
    - 選択しづらさがわかる画面：https://gyazo.com/542462a51729f952f6a91a7dfb5bddea
      - 余談：Gyazoの最長動画秒数がこれです

一長一短で発展途上感ある．

「最終アクセスから1年で消える」という特性は， この手のキャプチャソフト（一時的に公開するのが目的に使うことが多そう）としては良い仕様に思えるが，全てを保存しておきたい人には向かない．
個人的にはアーカイブは別ですべきと思っているので好印象．これからに期待のソフトっぽい！
knife soloで「FATAL: Cannot find sub command for: ‘solo'がでたので調べた

# Vagrant+chef環境を構築中にはまってしまったので調べた。
### 現象
基本はこちらを参考に構築していった
http://www.webcyou.com/?p=4776

ここで、エラーとなった
```$knife solo init hogehoge
FATAL: Cannot find sub command for: ‘solo'
```
### 調べた
まさにこれだった
http://qiita.com/kami30k/items/7e4eac152df6945ffa48
> ひとことでいうと、2つのknifeコマンドが共存している状態になる。

### 対処
どちらか一つにする
gemで入れたのとcurlで入れたものをどっちか消す
今回はgemの方を消して、上記記事のコメントにある通り、/opt/chefの方でknife-soloをいれてみた。

```sudo /opt/chef/embedded/bin/gem i knife-solo
```
とりあえずこれで解決できました

### 分かっていないこと
* どの経路でchefをインストールするのが正しいのか？
* ChefDKで導入すれば楽らしいこと > 
 http://dqn.sakusakutto.jp/2014/05/mac_osx_linux_chef_knife_berkshelf.html

断片的な情報でインストール作業進めると、こういうハメに合うといういい教訓でした。
Redmine で *.api.rsb を render_to_string する

例えば `controller_issues_edit_after_save` の中で `render_to_string` したい。

下記を参考に `:formats` 引数を試してみました。

"Specifying format: "xml" ignored with render_to_string - Stack Overflow"
http://stackoverflow.com/questions/8719375/specifying-format-xml-ignored-with-render-to-string

そうしたら下記でエラーが出ました。`format` が無いとか。

http://www.redmine.org/projects/redmine/repository/entry/tags/3.0.3/lib/redmine/views/builders.rb#L28

上記は下記で呼び出されて `params[:format]` が渡されているようです。

http://www.redmine.org/projects/redmine/repository/entry/tags/3.0.3/lib/redmine/views/api_template_handler.rb#L22

いろいろ悩んで、とりあえず下記のようにしたら動きました。

```rb
def controller_issues_edit_after_save(context={ })
  controller = context[:hook_caller]

  has_format = controller.params.has_key?(:format)
  if has_format
    original_format = controller.params[:format]
  end

  controller.params[:format] = :json
  json = controller.render_to_string(
    :template => 'issues/show',
    :layout => false,
    :formats => [:json]
  )
  # json を何かする。

  if has_format
    controller.params[:format] = original_format
  else
    controller.params.delete(:format)
  end
end
```
electron で webpack とか使ってアプリ作った

electron の clipboard API 使ってクリップボードを監視するアプリ作りました
[クリップボード監視先輩 zaftzaft/cbsnpi](https://github.com/zaftzaft/cbsnpi)

## 使ったもの
ビルドツールには webpack
タスクランナーは gulp
プリプロセッサ類は CoffeeScript, Jade, Stylus
それらに Vue.js を加えてモダンな感じにしました。


## ディレクトリ構成
```
src/            プリプロセッサ系
  coffee/
  jade/
  stylus/
dist/           ファイルの出力先

build/          中間ファイル置き場
  dist/
release/        最終的な生成物
  v0.0.1/
```
release ディレクトリは、win32-x64.zip など配布物の出力先に使用します
一応バージョンごとに切っておきます


## 全体の流れ
### インストール
electron の動作環境を作る
http://electron.atom.io/docs/v0.31.0/tutorial/quick-start/ の main.js を丸コピペで保存
gulp, webpack, etc を入れる
### 開発
gulp で watch & build しながらコード書いて `electron .` で動作確認
### 配布
配布したい段階になったら main.js, package.json を build/ へコピー
webpack で本番ビルドして build/dist へ保存、Jade, Stylus も圧縮ビルドして build/dist へ
electron-packager で build をパッケージ化
`$ electron-packager ./build appName --platform=win32,linux --arch=x64 --version=0.31.1 --asar`
build/appName-linux-x64, build/appName-win32-x64 とか生成されるので、それらを zip とか bz2 で圧縮して release へぶち込む


## electron と webpack を使う上での注意
webpack.config に target: "atom" を書く必要があります
そうすることで、fs とかの node.js ビルトインモジュールを electron 側で require できます

```coffee:webpack.config.coffee
module.exports =
  entry:
    app: ["./src/coffee/app.coffee"]
  output:
    filename: "bundle.js"
  target: "atom"
```

## webpack の本番ビルド
webpack を uglify で圧縮するとめちゃくちゃ時間がかかるので、開発時は無圧縮、配布時に圧縮といった感じにします

webpack.config 内で `__product` プロパティ以下に本番用の追加設定を書きました

```coffee:webpack.config.coffee
webpack = require "webpack"

module.exports =
  # 中略
  __product:
    plugins: [
      new webpack.optimize.UglifyJsPlugin
        compress:
          warnings: false
        sourceMap: false
        mangle: true
    ]

```

gulp 側では webpack, build-webpack とタスクを分けました

```coffee:gulpfile.coffee
webpackConfig = require "./webpack.config.coffee"
webpackProductConfig = _.extend {}, webpackConfig, webpackConfig.__product

gulp.task "webpack", ->
  gulp
    .src "./src"
    .pipe $.webpack webpackConfig
    .pipe gulp.dest "./dist"

gulp.task "build-webpack", ->
  gulp
    .src "./src"
    .pipe $.webpack webpackProductConfig
    .pipe gulp.dest "./build/dist"
```


## その他
- 画面が一つだったので、 vue でちゃちゃっとやるだけでデスクトップアップリケーションが出来てよかった
- アプリはレポートの参考文献を楽に書きたかったから作った
- 配布物のサイズがデカイのでキツイ
- 配布物生成を sh で書いたけど、なんか良くないのでいい感じにしたい。
- windows と linux でしか動作確認してないので Mac だと動かないかもしれないです。
Method to build Python environment in Xcode 6

### Python 2

***
***
1. Open your Xcode, Choose 'Create a new Xcode project'.
2. Choose 'Other'option under OS X, then choose 'External Build System'. click Next.
3. Enter your product name. eg. MyPython. 
4. important!! Be careful to fill the blank named 'Build Tool'. We should to fill our Python tool directory. Python2 is '/usr/bin/python'.then, click Next.
5. Choose the directory to save your project.Click Create.
6. Choose 'Product' -> 'Scheme' -> 'Edit Scheme' on Xcode Tool Bar.
7. In the Edit view, choose 'Run' on the left option list.choose 'Info' option on the right,then, Choose 'Executable' -> 'other'.then press key 'command + shift + G', input '/usr/bin/python', click 'Go'.finally choose 'python', click 'Choose'.
8. The same in 'Info', unselect the 'Debug executable' option.
9. Next, choose the 'Arguments' option, under 'Arguments Passed On Launch', click '+', input your python file name. eg "kqx.py".
10. Next, choose the 'Options', select 'Working Directory', choose your Xcode project dirctory.
11. OK, it is all. Then close the 'Edit Scheme' View.
12. Then, we can create a python project.'Command + N' to choose 'OS X'->'Empty'->Next.Input your python file name. eg "kqx.py". click 'Create'.
13. Your can code your python code.~\(≧▽≦)/~
14. ![Uploading 5B1D0E02-B228-4F6F-89F4-DE8C0AEA2095.png]()
UIAlertViewはもう使わないほうが良いかも


## iOS8からdeprecatedになった
1年前のiOS8から`UIAlertView`がdeprecatedになりました。
そんなことiOS開発者はとっくにご存知ですよね。
ただ、iOS8でも既存通り大体動いていましたよね。

だから僕は`UIAlertController`に置き換えることなくとりあえず使い続けていたのです。
僕と同じようにそのまま使い続けているアプリは多いんじゃないでしょうか。

そしたらなんと、ついに置き換えなきゃいけないかなっていう現象に陥りました。

## キーボードとUIAlertViewが出た状態でpushするとキーボードが再表示する
### こんな場面ないですか？
1. ユーザーに`UITextField`かなんかで文字入力してもらって、次の画面に遷移しようとする。
2. その時にアラートで「この内容で送信しますか？」と、OK/Cancelボタンを出します。
3. OKを押したら、pushした画面で「送信が完了しました」と出す。

このアラートを`UIAlertView`で実装していると、画面の遷移中はキーボードが閉じるのですが、次の画面で一瞬キーボードが再表示して、また閉じるのです。

### 原因を探る
いろいろな原因が考えられたので、いろいろと探りました。
`UIResponder#resignFirstResponder`とか色々。。。
ただし解消されず。

そういえば`UIAlertView`がdeprecatedになったっけな。
って思い出したのは、疲れ果ててベッドで寝ようとした時のことです。

### 試しにUIAlertControllerで実装
ここまでの流れでとっくにわかっているかと思いますが、
`UIAlertController`で実装をしたら上記の問題は全く起きなくなりました。
そもそもiOS7では正しく動いていたので早く気付けよって話です。
（※iOS7では使えないので、切り分けをしないといけないです。）

## いよいよUIAlertControllerに置き換える時が来た
もう1年も経つんですね。
Appleさんがdeprecatedだよって言うやつは、素直に新しいコードにするのが良いです。
時間はかかりますが、原因を探るのにも時間がかかるので。

iOS9の対応をするとさらにUI系で問題が起きそうです。
早いうちにやっておくのが吉。

## おわり
指摘や質問があれば、どしどし送ってくださいね〜。
mobile backend JSSDK 2.0-pre でクイックスタート（ブラウザ編）


8/17にニフティクラウド mobile backend のJavaScript SDK v2 のプレ版がGitHubで公開されました。
ニフティクラウド mobile backend : http://mb.cloud.nifty.com/
JavaScript SDK v2.0-pre : https://github.com/NIFTYCloud-mbaas/ncmb_js

正式な告知・リリースはまだですが、今回はこれを触ってクイックスタートをやってみたいと思います。

# 手順

1. ニフティクラウド mobile backend への登録
2. SDKのダウンロード
3. コード作成
4. mobile backendとの連携
5. 動作確認

## 1. ニフティクラウド mobile backend への登録

下記サイト右上の「無料登録」から登録します。
http://mb.cloud.nifty.com/

## 2. SDKのダウンロード

フロントエンド用のjsファイル生成に npm コマンドが必須になるので、nodeが入っていない場合は事前にインストールしておいてください。→ https://nodejs.org/

#### 方法１. npmからインストール
下記のコマンドを実行すると、モジュールのインストール及びフロント用のjsファイル(ncmb.min.js)の自動生成が完了します。

```
$npm install ncmb -S
```
#### 方法２. GitHubからCloneする
GitHubのリポジトリからCloneしてきます。
https://github.com/NIFTYCloud-mbaas/ncmb_js

こちらの方法の場合、フロント用のファイルは自動生成されないので、以下のコマンドを実行する必要があります。

```
$npm install
```

方法１はコマンド一つで実行できる反面、バージョン単位での更新になるので最新のバグフィックスなどが反映されていない場合があります。
方法２は一手間増えますが、常に最新のmergeが適用された状態で使えます。

## 3. コード作成

htmlファイルを作成し、以下のコードを貼り付けます。
また、htmlファイルと同じディレクトリにjsフォルダを作成し、その中にncmb.min.jsを入れます。

```html
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>JavaScript SDK クイックスタート（ブラウザ版）</title>
</head>
<!-- 1.SDKの読み込み -->
<script type="text/javascript" src="js/ncmb.min.js" charset="utf-8"></script>
<body>
<script>
  // 2. mobile backendアプリとの連携
  var ncmb = new NCMB("YOUR_APPLICATIONKEY","YOUR_CLIENTKEY");

  // TestClassの作成
  var TestClass = ncmb.DataStore("TestClass");
  // 3.TestClassへの入出力
  TestClass.equalTo("message", "Hello, NCMB!")
           .fetchAll()
           .then(function(results){
             if(results[0] != null){
               alert(results[0].get("message"));
             }else{
               var testClass = new TestClass();
               testClass.set("message", "Hello, NCMB!");
               testClass.save()
                        .then(function(){
                          alert("message is saved.");
                        })
                        .catch(function(err){
                          alert(err.text);
                        });
             }
           })
           .catch(function(err){
           	alert(err.text);
           });
</script>
</body>
</html>
```

## 4. mobile backendとの連携

mobile backendにログインし、アプリの新規作成を行います。
アプリ名はなんでも構いません。
アプリの作成が完了するとアプリケーションキーとクライアントキーが表示されるので、それぞれをコピーして、先ほどのコードのYOUR_APPLICATIONKEYとYOUR_CLIENTKEYに貼り付けます。

## 5. 動作確認

htmlファイルを実行します。
データが何も保存されていなければ"message is saved."のアラートが表示されます。そしてmobile backendのダッシュボードを開くと、データストアにTestClassが生成され、messageに"Hello, NCMB!"が入ったレコードが保存されていることが確認できます。
その状態で再度HTMLファイルを実行すると、今度は"Hello, NCMB!"のアラートが表示されます。

今回は以上です。
Docker pullでハマったこと

## はじめに

OSX 10.10.5でDockerを試してみました。この記事では、そのときにハマったことを紹介します。

## インストール

[Installation on Mac OS X](https://docs.docker.com/installation/mac/)を参考にしました。Docker Toolboxをダウンロードして、実行します。

インストールをカスタムすることができるので、Kitematicのチェックボックスのチェックを外しました。

![スクリーンショット 2015-08-30 18.05.44.png](https://docs.docker.com/installation/images/mac-page-two.png)

## 発生した問題

次のコマンドラインでnginxのリポジトリをpullしたときに、問題が発生しました。(xxxxxxxxxxxxのところは加工しました。)

```
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
xxxxxxxxxxxx: Pull complete 
xxxxxxxxxxxx: Pull complete 
xxxxxxxxxxxx: Pull complete 
xxxxxxxxxxxx: Verifying Checksum 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Download complete 
xxxxxxxxxxxx: Layer already being pulled by another client. Waiting. 
```

ダウンロード中に`Layer already being pulled by another client. Waiting.`というメッセージが現れました。Ctrl+Cでプロセスを終了させ、imagesを確認します。

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
<none>              <none>              zzzzzzzzzzzz        5 days ago          125.2 MB
ubuntu              latest              xxxxxxxxxxxx        9 days ago          188.4 MB
hello-world         latest              xxxxxxxxxxxx        3 weeks ago         960 B
```

この\<none\>というリポジトリは`docker rmi zzzzzzzzzzzz`で削除できませんでした。

## 解決方法

[docker pull: always show me "Layer already being pulled by another client. Waiting." · Issue #15603 · docker/docker · GitHub](https://github.com/docker/docker/issues/15603)を参考にしました。

こちらはredisですが、同じような現象です。

一旦docker-machineを止めて、もう一度スタートしたら上手くpullできるようです。試してみたところ上手くpullできました。

```
$ docker-machine stop default
$ docker-machine ls
$ docker-machine start default
$ docker pull nginx
```

## まとめ

Dockerでハマったことを紹介しました。issueを確認することで問題が解決することもあるので、英語を勉強したほうが良さそうですね。
[iOS] Setup Build Number

* Select the target you want to setup.
* Go to Build Phase, click `+` mark -> New Run Script Phase or from the menu Editor -> Add Build Phase -> Add New Script Build Phase.
* Copy this to the run script content.

```sh
if [ "Release" = "${CONFIGURATION}" ]; then
  printf -v buildNumber "%X" `date +%s`
  /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
fi
```

*This will setup up the build number with current time hex string. You also can change this way with commit count or any other way.*

* Move the run script order before **Copy Bundle Resources**.
PhoenixでPostリクエストを処理するところまで試した

- [phoenix](http://www.phoenixframework.org/)とは、[elixir](http://elixir-lang.org/)で実装されたWeb framework
- Getting Startedを進めていくと、いろいろと学べるはず

[Adding pages](http://www.phoenixframework.org/docs/adding-pages)で新しくページを追加するところまでを学んでいるうちに、Postリクエストを処理する内容に寄り道したのでメモを残しておく

## ルーティング

- 基本は`method "path", Controller, :action_name`をweb/router.exに設定していく
- resourcesを使うと、GET / POST / PUT / DELETEをまとめてルーティングしてくれたりする

```
defmodule HelloPhoenix.Router do
  use HelloPhoenix.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug :put_secure_browser_headers
  end

  pipeline :api do
    plug :accepts, ["json"]
  end

  scope "/", HelloPhoenix do
    pipe_through :browser # Use the default browser stack

    get "/", PageController, :input
    post "/hello", PageController, :hello
  end

  # Other scopes may use custom stacks.
  # scope "/api", HelloPhoenix do
  #   pipe_through :api
  # end
end
```

## Controller編集

helloアクションを追加

```
defmodule HelloPhoenix.PageController do
  use HelloPhoenix.Web, :controller

  def index(conn, _params) do
    render conn, "index.html"
  end

  def input(conn, _params) do
    render conn, "input.html"
  end

  def hello(conn, %{"messenger" => messenger}) do
    render conn, "hello.html", messenger: messenger
  end

end
```

## テンプレート編集

```
<div class="jumbotron">
  <h2>Welcome to Phoenix! Hi, <%= @messenger %></h2>
  <p class="lead">A productive web framework that<br />does not compromise speed and maintainability.</p>
</div>
```

## はまったこと

CSRFのエラー

```
invalid CSRF (Cross Site Forgery Protection) token, make sure all requests include a '_csrf_token' param or an 'x-csrf-token' header
```

解決方法がいくつかあったのですが、自分がうまくいった方法をかいておきます

phoenixのv1.0.0

- Viewでcsrf_tokenを取得するメソッドをインポート

```
defmodule HelloPhoenix.PageView do
  use HelloPhoenix.Web, :view

  import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]

end

```

- データをPOSTするフォームを用意
 - formタグの宣言にPhoenixのテンプレート機能を使っている

```
<%= form_tag("/hello", method: :post) %>
<input type="text" name="messenger">
<input type="submit" value="enter">
</form>
```

トップページでPOSTした名前が/helloページで表示されるようになります
2D Ragdoll Creatorで2Dのラグドールを簡単に作る 

<a href="https://www.assetstore.unity3d.com/jp/#!/content/16105" target="_blank"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/7c24c173-c196-0370-400c-8c86da209124.png"></a>

2Dのラグドールが作りたかったのですが、一つずつHingeJoint2Dをつけていくのがめんどくさくなったので
Assetの力をかりることにしました。

##インポートしたところ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/eb2dded7-2fa0-06c2-0915-0a321f77d810.png" width="200px">

###Scriptの種類
BreakJoint.cs ぶつかったらジョイントが壊れて連結がはがれるScript
HurtSound.cs 激しくぶつかったときに音をならすScript
Drag.cs  オブジェクトをドラッグするScript
Restart.cs シーンを再読み込みするScript

##試しに作成してみる
今回はこのスケルトンさんにばらばらになってもらいましょう
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/1eefadf2-ba32-eb57-df1d-c2f2f5af8c6b.png" width="200px"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/ffcbf8f3-80b4-be5a-ffc7-1da6a47f964e.png" width="200px">


Window->2D Ragdoll Creatorでウィンドウを出し、各パーツをセットしていきます
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/e40d6827-134b-8c96-4e0b-e5efde2312c1.png" width="250px">

必要なものだけセットすればOK
パーツ名が左の名前と合っていればAuto Assignで自動でセットされるのでたくさんやる場合は名前を合わせると楽です
ジョイントを作成し、ジョイントの位置を回転する場所に合わせて
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/48f975e1-a560-7cf9-cd94-e93d77335ece.png" width="250px">

Create Ragdoll
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/737ea6e6-e42e-61b6-1a3e-935046fa7570.png" width="400px">

左が作成したところ。右がちょっと頂点を減らしたところ。
Polygon Collider 2D、Hinge Joint2D、Rigidbody2Dが設定したパーツにアタッチされます

<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/03285b7d-4fbc-1f0f-e375-cc65172c5e1f.png" width="200px"><img src="https://qiita-image-store.s3.amazonaws.com/0/46444/6fad2b86-1833-9cd2-78ce-f07fdf72e0a7.png" width="200px">

現在の状態を再生したところ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/486aac95-0ed1-dccc-1a42-7e515ba194ff.gif" width="200px">

##次にジョイントの破壊とぶつかったときの音を。
ジョイントの部分にBreakJoint.csとHurtSound.csをアタッチし、
Bloodに血などのパーティクルのprefab、Hurt Soundsにうめき声などの音をセットします。
これでVelocity For Brakeなどのパラメータ以上の衝撃がくわわればとれます
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/20395a01-774e-007b-0cb3-1f39690b0987.png" width="350px">

##デモのようにドラッグしてつかめるようにする
Drag.csをカメラにアタッチ。空のGameObjectを作成しそこにRigidBody2Dと Spring Joint2Dをセットします。
デモシーンからヒエラルキーにあるdraggerというオブジェクトを持ってくると手っ取り早いです。
これをDrag.csにアタッチすればつかんだりドラッグができます

<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/9eab5b22-0760-cbf5-a1d8-a735d849b1e6.gif" width="350px">


とりあえずデモのキャラクターを<a href="http://qiita.com/ayumegu/items/2508396301dfa2b8ae9c">前に作成</a>したロープのに追加し手のところにHinge Joint2Dを追加してロープをつかませてみたところ
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/ddef480a-a663-ca51-3c0c-7310494710ab.gif" width="300px">
Intel Edisonのファームウェアアップデートが出来ないときの対策

reboot ota　コマンドは、Edisonが正常に立ち上がってないと正しくファームウェアがアップデートされないらしい。
Edison立ち上げのとき、ステータスメッセージに１つでもFailが出ていると、reboot ota は大抵失敗するようだ。

こんなときはPhone Flash Tool Liteを使おう。

【参考】
Phone Flash Tool Lite　によるファームウェアアップデート手順（手順の中にダウンロードリンクあり）
https://software.intel.com/en-us/articles/flash-tool-lite-user-manual
##Phone Flash Tool Liteによるファームアップデート手順
Phone Flash Tool Liteを起動したところ
![Edison_20150820_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/8d7dc183-eec8-9394-c556-3d427af6c75a.jpeg)
Browseボタンを押し、ダウンロードしたファームウェアのZIPを指定する（ZIPを展開する必要はない）
![Edison_20150820_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/3c8cd702-9df5-c577-2b52-7d9f8fc90eb9.jpeg)
ZIPを展開して、自動でインストール情報の入ったjsonファイルを見つけ出してくれる。左下の「Start to flash」ボタンを押す。
![Edison_20150820_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/eb35a853-20b6-2772-22b4-fa0e3956a9e2.jpeg)
ツールの右下に以下のような画面が出たら、ここで初めて、J16にUSBケーブルを接続する。（J16のみ接続。J3にもケーブルを接続するとファームのアップデートは失敗するらしい。）
![Edison_20150820_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/e4bad3ae-61ea-8c00-aa49-84c1008ac2cd.jpeg)
【USBケーブルを接続したところ】
![DSC_0098.JPG](https://qiita-image-store.s3.amazonaws.com/0/89689/34d76d55-ef1e-3143-e831-cf8cf03cd26a.jpeg)

書き込みが開始される。
![Edison_20150820_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/ca4c70fa-0c91-a204-a1b3-09f1f53d4377.jpeg)
こんな風にバーが赤くなり失敗しても、J16のUSBケーブルを抜いて再度接続すると大抵うまく行く。
![Edison_20150820_6.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/fb6feb80-cc94-1b5c-75cd-ec7a467cb8f4.jpeg)
バーが緑になったら書き込み成功。しかしすぐにはケーブルを抜いてはならない。2分以上接続し続けること。
![Edison_20150820_7.jpg](https://qiita-image-store.s3.amazonaws.com/0/89689/5c66d244-1dde-44f4-b1fc-25edc454139f.jpeg)
Swiftを書く人が学ぶ関数型プログラミング

「Swiftはせっかくマルチパラダイムなのに、この関数型ちっくなところはどこから学んで活用していけばいいのだろう?Haskellとかやったことないんだけど?」
という数ヶ月来の疑問があったので、ここまで学習したことをまとめるついでにとっかかりどころを書いてみようと思います。

なお、「この順番で学ぶとよさそう」というだけの話で、具体的な話は定義含め一切ありません

結論としては

1. Optionalの処理を理解する
1. 高階関数が何たるかを理解する
1. 副作用が何たるかを学ぶ 
1. Optionalにmapを使う
1. ファンクターを理解する
1. カリー化して部分適用する
1. アプリカティブを理解する

かなというところです。この流れなら無理せず入れるんではないかと…

---

# Optionalの処理について

いわゆる

* Forced Unwrapping
* Optional Chaining
* Optional Binding
* Implicitly Unwrapped Optional

の話。xcodeで試しにSwiftを書いていると、変数やメソッドの後ろに勝手に ```!``` とか ```?``` とかついて「なんで勝手につくの?」「どんなとき ```!``` で ```?``` なの?」となったのが懐かしい。いまやぐぐると上記4種の記事はいくらでも出てくるのでそれで学ぶ。
とりあえずSwiftにはnilというのがあって4種の中から正しい方法を選んで処理しなくちゃいけないんだということを学んで次に行く

# 高階関数について

Swift初学者の人が勉強しているとそのうち変数引数に関数を入れたり、クロージャを使ったりする章に出くわすことになる、[The Swift Programming Language](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/)でいうところの

* [Functions and Closures](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID463)(A Swift Tour)
* [Functions](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html)(Language Guide)
* [Closures](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html)(Language Guide)

のこと。特に、この中で出てくるmap関数はSwiftを勉強している人にとってのとっかかりになるのでよく練習する。Swiftは関数自体をやったりとったりできるんだなあふむふむと思いながら次に行く

# 副作用が何たるかを学んで正しくコードを書く

以上まではSwiftを書くにあたって必修だが、ここで「せっかくだから」と関数型プログラミングを始めるとなると心得を学ばないといけなくなってくる、これ以降中途半端にやるとまさかりが痛いので夜道に気をつける

というわけで、ぐぐると副作用がなんたるかとか参照透過性がなんたるかとかあれこれしてはいけないとかというのがでてくるので、それを読む。そうしたら、

* ```var``` を使わず ```let``` を使って書く

から始めてみる。そして、Optionalは「中身がnil(空)かもしれない箱」だということをつかんだら次に行く。Optionalは副作用ダメルールに則っているので重要だし、今後出てくる抽象的な概念を理解するときの身近な具体例となる

# Optionalにmapを使う

箱だということがわかっても箱からの出し入れの操作がわからないといけないので、定番の ```map``` と ```flatmap``` を使ってあそぶ。まずは ```map``` 、慣れたら ```flatmap```。

参考になりそうな記事：
http://qiita.com/koher/items/68585cff691d87124077
http://qiita.com/koher/items/c6f446bad54442a28bf4

どうも世の中には ```flatten``` 関数があってflatmapはmapとflattenを合体させたものという話らしいので、map→flatten→flatmapと辿るといいのではと思うのだが、今の所Swiftにはflattenなるものがあったという話は聞かないしflatmap自体標準装備はSwift2からというオチ

# ファンクターを理解する

ひたすら箱と戯れたあとはファンクターに進むことができるのではないかと思う。Optional以外にも"箱"はあるので、あらゆる"箱"に対して通じる話をしていかなくてはいけない。例えばEitherとか。
(自分で実装しないといけない関数や演算子があるとはいえ)この辺りを理解すればdo-try-catchもできてOptionalも使えてEitherも使えるのでエラー処理法の選択肢がぐんと広がる。

# カリー化して部分適用する

思う存分"箱"を扱うにはカリー化を学ぶとやれることが増えるので、やっておくといい。
ただし、中途半端な学習をするとカリー化と部分適用の区別がつかなくなって関数型警察に捕まってしまうので、せっかくなら「カリー化を理解する」をゴールにするより「カリー化と部分適用について、両者の違いを明確にした説明ができる」をゴールにしたほうがいい気もする。

# アプリカティブファンクターでたくさん箱を扱う

現実には箱を2つも3つも抱えて、それを関数の引数に入れるという事態が起きる。1つならともかく、nil判定を2回も3回もこなしてようやく目的の関数を実行するのはしんどい。そこで、手際よく箱の中身を出して関数に適用して結果を箱に詰めて……という作業をこなすことを可能にする手法を学ぶと役に立つ。

----

ここまでくれば次の目標はモナドだ!とっても楽しみ!

と言いたいところなのですが、Swift語で書かれた関数型プログラミングの資料は少ない、あってもすでにHaskell語が話せる人向けだったりするので、「やる前に別の言語に手を出さなくちゃいけないのか」となってしんどいです。
NSTimer周りの話で、メソッドが呼ばれない現象が起きてハマった


## こんな問題
今までこんなメソッドを使ってTimeInterval秒ごとにメソッドを呼ぶ処理を書いていました。
`NSTimer#scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:`

しかし開発が進む中で実装を変える必要が出てきたので、メソッドが呼ばれる契機を変えたのです。
そしたら、selectorに指定していたメソッドが呼ばれなくなるという問題が発生しました。

頭の中は「？？？」。悪いことはなんにもしてないのに。。。

というわけで調べてみました！

## 原因
### scheduledTimerWithTimeInterval〜メソッド
```objectivec
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(hoge:) userInfo:nil repeats:YES];
```

```swift
NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "hoge:", userInfo: nil, repeats: true);
```

このメソッドは呼ぶだけでTimerを発火してくれるメソッドです。
ただし、現在のスレッドでTimerを発火するようです。
つまり契機がメインスレッドではないスレッドの時は、そのスレッド上でTimerが回ります。

これが原因でした。。。
呼ぶ契機を変えた時に別スレッドから呼ばれる時があったのです。

しかもメインスレッド上でないとselectorに指定したメソッドを呼んでくれないのですね。
というわけで解決方法。

## 解決方法
### timerWithTimeInterval〜メソッド

```objectivec
NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(hoge:) userInfo:nil repeats:YES];
```

```swift
let timer = NSTimer(timeInterval: 0.1, target: self, selector: "hoge:", userInfo: nil, repeats: true);
```

このメソッドはTimerの発火までは行いません。
要は発火するスレッドを指定することができます。

```objectivec
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
```

```swift
NSRunLoop.mainRunLoop().addTimer(timer, forMode:NSRunLoopCommonModes);
```

こんな感じでどのメソッドから来てもメインスレッドで動かすようにします。
これで直せました。

## おわり
指摘や質問があれば、どしどし送ってくださいね〜。
匿しておけない、匿名クラスの能力

[昨日知ったばかり](http://qiita.com/jkr_2255/items/d9a3059625a4647b36ce)ではあるのですが、引き続き今日もJavaの匿名クラスと戯れてみようかと思います。

# 要求されるインターフェース
Androidのプログラムを書いていると、イベントコールバックなどで必ず要求されるのが「インターフェース」です。そして、インターフェースそのものを直接インスタンス化することはできませんから、何かしらのクラスに実装した上でインスタンス化して渡す必要があります。

一口にインターフェースと言っても、メソッド1つだけを持つ[Runnable](https://docs.oracle.com/javase/jp/6/api/java/lang/Runnable.html)から、10個以上のメソッドを実装する必要のある[MediaPlayerControl](http://developer.android.com/reference/android/widget/MediaController.MediaPlayerControl.html)と、スケールもまちまちです。

# 匿名クラス以外で実装してみると
匿名クラスなど、クラスのネストを使わずに実装しようとすれば、大きく分けて2通りが考えられます。
## 別にクラスを立てる
いちばんの正攻法で、普通にクラスを立ててしまうという方法があります。単にコールバックを並べるだけでなく状態を持って引き回したいというのであればもちろん選択肢としてありです。ただ、Runnableのようなたった1つの関数を使うためだけにクラスを立てるのも大げさだ、という面があります。

## 呼ぶクラスに同居させる
インターフェースさえあればどんなクラスでも構わないので、メソッドのあるクラスにインターフェースを実装してしまって`this`を渡す、という選択肢もありです。この場合、実装したメソッド内からプライベートなメンバも使えて便利ではあるのですが、当然ながら同じインターフェースを複数実装するわけには行きませんし、すでにあるメソッドと返り値だけが違うメソッドのオーバーロードは不可能なので、実装不能な場合も出てきます。

# 匿名クラスにできること
匿名クラスの宣言は、その場でインターフェースもしくは基底クラスを`new`して、さらに中括弧で実装を続けることで行います。この中では、ふつうに同じクラスのメンバにアクセスできるだけでなく、外側のクラスのメンバにもシームレスにアクセスできてしまいます。さらには、メソッドのローカル変数や引数にも、その変数が`final`であればアクセス可能です。そういうわけで、匿名クラスを使うことで、最初からクラスを立てる手間も省けて、そしてかなりの度合いでメソッドの一部であるかのように扱えるという、きわめて便利な性質のものとなっています。

# 匿名クラスにできないこと
「匿名」クラスという名前のとおり、このインスタンスのもととなったクラスに、表立っての名前は存在しません[^1]。そういうわけで、

* 変数で受ける場合、基底クラス・インターフェースとして受けるしかないので、オーバーライドでなく独自に実装したメソッドが仮にあったとしても、外部からは呼び出せません。
* 同じ型のインスタンスを別途生成することはできません。

また、構文の都合上、1つの基底クラスかインターフェースかしか指定できません。

# 匿名クラスの中身
生成したクラスファイルを見れば一目瞭然ですが、「外側のクラス名$番号.class」というように、きちんとクラスが生成しています。そして、匿名クラス特有の機能についても、

* 外側のクラスへのアクセス→コンストラクタで渡していて、内部に隠しメンバ（`this$0`）として持っている
* 外側のクラスのプライベートメンバへのアクセス→外側のクラスに「`access$番号`」というような隠しメソッドが用意してあって、それを経由してアクセスしている
* メソッドの`final`ローカル変数へのアクセス→これまたコンストラクタでコピー

というような仕掛けで実現しています（逆アセンブル・逆コンパイルなどで状況は見えてきます）。

# 参考リンク
* [Java のインナークラスにおける裏舞台の全貌](http://d.hatena.ne.jp/satosystems/20120127/1327673103)
* [内部クラスからアクセス可能なローカル変数が final でなければならない理由](http://d.hatena.ne.jp/happynow/20120512/1336826316)



[^1]: もちろん、後述のように内部的な名前は存在するので、リフレクションなどを駆使すればできなくはないかもしれませんが、そういう話はおいておきます。
ハッカソンとか勉強会とかしてわーっと打ち上げ/懇親会を安く済ませられるお店

[JANOG LT night　#1](http://www.janog.gr.jp/meeting/lt-night-1/application/files/4514/4065/7040/janoglt-taji-20150820.pdf)に触発されて書いてみた。
二次会、打ち上げとかで安く済ませたいときにおすすめな店をそろえてみました。
ログは　[CONBUの道具箱] (http://togetter.com/li/866385?page=6)　参照

# CONBU Teamのおすすめ
##サイゼリヤ、王将、天一　
### [サイゼリヤ](http://www.saizeriya.co.jp/)
 - イタリア料理屋さんです。わかりにくい場所にあるので調べていくのおすすめ。別に[高級ワインリスト](http://r.gnavi.co.jp/g-interview/entry/2069)がある。でも安い
 - サイゼリヤ活用術　[前編](http://inadashunsuke.blog.fc2.com/blog-entry-38.html) [後編](http://inadashunsuke.blog.fc2.com/blog-entry-39.html)

### [王将](http://www.ohsho.co.jp/)
 - いっぱいある　http://www.ohsho.co.jp/shop/index.php 中華料理屋さんです。
 - 店ごとにオリジナルメニューがあるので頼んでみるのもいいかも
 - [大阪王将](http://www.osaka-ohsho.com/)もあります。

### [天一(天下一品)](http://www.tenkaippin.co.jp/)
 - ラーメン屋さんです。
 - 独特の味がリピーターを呼ぶお店
 - [こっさり](http://www.tenkaippin.co.jp/)がいつの間にかレギュラーに
 
#筆者(yukihirokikuchi)のおすすめ
## さくら水産、魚や一丁、世界の山ちゃん、海峡、天狗、ジョイフル
### [さくら水産](http://www.teraken.co.jp/)
 - 魚系居酒屋さん。けっこう広いので人数多くてもとれます。
 - 店舗案内はこちら　http://www.teraken.co.jp/shop/
 - ランチも安くていいです　５００円　http://matome.naver.jp/odai/2139648539906865101

### [魚や一丁](http://matome.naver.jp/odai/2139648539906865101)
 - 北海道系魚居酒屋さん
 - 量が多くて、人数も多く入ります。店舗は[こちら](http://movia.jpn.com/shops/index?b=0090)　ほぼ山手線周辺
 - わらじコロッケでかくていいです。
 - 学生時代お世話になりましたｗ

### [世界の山ちゃん](http://www.yamachan.co.jp/)
 - 手羽先のお店
 - 意外とコストパフォーマンス高し
 - 手羽先以外にもけっこうメニューあります　http://www.yamachan.co.jp/

### [海峡/腹八分目](http://www.kaikyo.co.jp/)
 - 唐揚げが名物、すげー量
 - 朝まで(4時とか5時)まであいているので３次会とかに
 - おなじくメニューいっぱいあるので困りません。

### [天狗](http://www.teng.co.jp/)
 - 総合居酒屋さん
 - ２３時ぐらいに閉まりますが、人数が入るので一次会に
 - おなじくメニューいっぱい

### [ジョイフル](https://www.joyfull.co.jp/)
 - 九州が本店のファミリーレストラン
 - とにかく安くておいしい
 - 実質使えるのは赤坂店のみかな？（東京）https://www.joyfull.co.jp/shop/kanto.html#tokyo
 - メニューはこちらー　http://matome.naver.jp/odai/2142563592727821601
 -
macにdocker-machineをインストール


## インストール
インストールはhomebrewを利用しました。

```
brew install docker-machine
```

## 実行

```
docker-machine create --driver virtualbox dev
```

しかし、エラーが発生して起動できず。
これは、docker-machineの問題ではなくvirtualboxの問題でした。

```
VirtualBox Error NS_ERROR_FACTORY_NOT_REGISTERED 
```

これは`/tmp/.vbox`にファイルを作成しようとして権限がなくて発生するエラーらしいので、安直だが権限を付与してみます。

```
sudo chmod 777 /tmp
```

これでもう一度実行。

```
docker-machine create --driver virtualbox dev
```

完了。

ssh接続をしてみます。

```
docker-machine ssh dev
```

```
                        ##         .
                  ## ## ##        ==
               ## ## ## ## ##    ===
           /"""""""""""""""""\___/ ===
      ~~~ {~~ ~~~~ ~~~ ~~~~ ~~~ ~ /  ===- ~~~
           \______ o           __/
             \    \         __/
              \____\_______/
 _                 _   ____     _            _
| |__   ___   ___ | |_|___ \ __| | ___   ___| | _____ _ __
| '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__|
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__|   <  __/ |
|_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_|
Boot2Docker version 1.8.1, build master : 7f12e95 - Thu Aug 13 03:24:56 UTC 2015
Docker version 1.8.1, build d12ea79
docker@dev:~$
```

無事docker-machineがインストールできました。
amber Smalltalk で sevenSeg.js を使ってみた

例によって自分用忘備録です。
走り書き乱文すみません。

# はじめに
sevenSeg.js とはセグメントLED風の表示をするSVG使ったjQueryのプラグインであります。
(http://brandonlwhite.github.io/sevenSeg.js/)

これをamber Smalltalkで knockout.js と組み合わせて使ってみます。
サンプルは以下のもの。
(https://github.com/tty-hayashi/KohakuTimer)

*  sevenSeg.js ロード設定手順の概略

* 使ってみる

# sevenSeg.js ロード設定手順の概略
1. sevenSeg.js を stプロジェクトのsubmoduleで追加
2. {ライブラリ名}.amd.json ファイルの作成
3. grunt devel で config.js と the.js の更新
4. Packege の impoorts 指定

## 1. sevenSeg.js を stプロジェクトに submodule で追加
git で submodule で sevenSeg.js のプロジェクトを追加しました。

``` bash:
$ git submodule add https://github.com/BrandonLWhite/sevenSeg.js.git
```

## 2. {ライブラリ名}.amd.json ファイルの作成
jsライブラリの場所を指定するファイルを作成する。

ファイル名: sevenSeg.js.amd.json

``` json: 
{
   "paths": {
          "sevenSeg": "sevenSeg"
    },
    "shim": {
          "sevenSeg": {
              "deps": ["jquery", "jquery-ui", "knockout"]
          }
    }
}
```

## 3. grunt devel で config.js と the.js の更新
grunt を実行して config.js と the.js を更新する。

``` bash:
$ grunt devel
```

ここまではターミナルでの作業。

## 4. Packege の impoorts 指定
ここからは amber Smalltalk での作業。
Helios を使ってるならばパッケージの定義で、’sevenSeg’ を追加する。

``` smalltalk:
Package
    named: 'Timer'
    imports: {'ko' -> 'knockout'. 'amber/jquery/Wrappers-JQuery'. 'amber/web/Web'. 'sevenSeg'. 'silk/Silk'}
    transport: (AmdPackageTransport namespace: 'amber-timer')
```

***

# 使ってみる
1. DOM要素の動的編集
2. ハンドラの登録

## 1. DOM要素の動的編集

Safari と FireFox で挙動が異なるようなので、DOM要素を amber Smalltalkから動的に編集します。抜本的対策は別途必要ですね。
DOM要素は data-bind 属性を指定したものを追加することで表示ができるはずです。以下の ‘body’ asJQuery append: しているところ。
KohakuTimer >> augmentPage

``` smalltalk: 
augmentPage

    '#start' asJQuery click: [self doAction].
    'body' asJQuery append: 
        '<div class="exampleContainer">
            <div data-bind="sevenSeg: { digits: 5, value: counter }" class="big-sevenSeg" style="width: 420px;"></div>
        </div>'.

    ko bindingHandlers at: #sevenSeg put: self sevenSegHandler.

    self setupModel
```

## 2. ハンドラの登録
本来、sevenSeg.js のパッケージの中に knockout.js 用のハンドラがあるのですが、今回は、それをロードできなかったので、amber Smalltalk の方で登録してやります。登録は、上記のコードの ko bindingHandlers at: #sevenSeg put: self sevenSegHandler. でやってるのですが、この sevenSegHandler の実体は以下の通りです。
KohakuTimer >> sevenSegHandler

``` smalltalk: 
sevenSegHandler

    ^#{
        #init -> [:element :valueAccessor :allBindingAccesso :model :bindingContex |
                    | bindingValue |
                    bindingValue := valueAccessor value.
                    element asJQuery sevenSeg: (ko toJS: bindingValue)] .
        #update -> [:element :valueAccessor :allBindingAccesso :model :bindingContex |
            element asJQuery sevenSeg: (ko toJS: valueAccessor value)]
    }

```

## こんな感じになります

![timer.png](https://qiita-image-store.s3.amazonaws.com/0/13174/f9f2019b-d8c8-81a6-9bdc-5d802b5b5484.png)


## 参考URL
* (http://brandonlwhite.github.io/sevenSeg.js/)
* (https://github.com/BrandonLWhite/sevenSeg.js)
IE8/9でもplaceholder実装するjQueryプラグイン

ついでにplaceholderが実装されてるブラウザでは元の挙動を活かすオプション付き。
（IEとChromeとFirefoxで挙動が違うのが嫌な場合も使えます）

簡単に解説すると、トリガーをつけた input 要素に placeholder 属性をつっこめば、title属性で代替して表示してくれるっていうやつです。
なにげにtitle属性でいけちゃうんですよ。でも色はデフォルトのinputの色で出ちゃうのでclassだけつけかえるのです。

##サンプル
http://codepen.io/blurblue/pen/QjNKyp

##オプション
###cover
IE9以下以外のブラウザでも有効にします。
true で有効。
false か未設定で無効。

###submitDisable:
空かplaceholder文言と同じだった場合に先祖のform要素のsubmitをキャンセルします。
true でキャンセル有効。
false か未設定でキャンセル無効。


##プラグイン
```js
// placeholder
$.fn.jqPlaceholder = function(options){
  // property
  var defaults = {
        cover: false,
        submitDisable: false
      },
      settings = $.extend({}, defaults, options);

  var init = function(){
    var input = $(this),
        label = input.attr('placeholder'),
        onFocus = function(){
          if(input.val() == label) input.removeClass('blur').val('');
        },
        onBlur = function(){
          if(input.val() == '') input.addClass('blur').val(label);
        },
        onSubmit = function(){
          return false;
        };
    if(isltIE8 || isIE9 || settings.cover){
      input.removeAttr('placeholder');
      input.addClass('blur').val(label).attr('title', '');
      input.on('focus', onFocus);
      input.on('blur', onBlur);
    } else {
      input.attr({'placeholder': label, 'title': ''});
    }
    if(settings.submitDisable){
      if(label == input.val() || label == ''){
        input.closest('form').on('submit', onSubmit);
      }
    }
  };
  this.each(function(){
    init.apply(this);
  });
};
```
※"isltIE8" は IE8以前、"isIE9" は IE9 のUA判定です（中身はtrue or false）。適当に実装してください。

##実装コード
今回は "js-placeholder" をトリガー用classとしました。
***HTML
```html
<p><input type="text" placeholder="placeholder用文言" class="js-placeholder"> オプションなし</p>
```

***CSS
非フォーカス時にグレーにするだけなので色は適宜。
```css
input.blur {
  color: #999;
}
```

***JS
```js
$('.js-placeholder').jqPlaceholder({
  cover: true,
  submitDisable: true
});
```

プラグインにした意味はあまりないので、メインの必要な部分だけ実装すればいいとおもう。
Slickで素のSQLを使うときにマクロでちょっと楽をする

Slickには素のSQLを文字列で書く方法もあります。
<http://slick.typesafe.com/doc/3.0.2/sql.html>

これを使ってusersテーブルからデータを取得する処理を書いてみます。

試したのは、Scala2.11.6, Slick3.0.0です。

```scala
case class User(id: Int, email: String, name: String, age: Option[Int], address: Option[String])

def selectUsers: DBIO[Seq[User]] = sql"""
  SELECT
    id,
    email,
    name,
    age,
    address
  FROM
    users
  """.as[User]

implicit def getUserResult = GetResult { r=> User(r.nextInt, r.nextString, r.nextString, r.nextInt, r.nextString) }
```

SQLの結果からオブジェクトをつくるのが `getUserResult` メソッドなわけですが、`r.nextInt` とかはJDBCのResultSetを彷彿とさせますね。

`r`は`PositionedResult`型のオブジェクトです。

`r.nextInt`とかは、`r.<<`と書くとちょっと楽になるようです。

```scala
implicit def getUserResult = GetResult { r => User(r.<<, r.<<, r.<<, r.<<, r.<<) }
```

ちょっと楽になったけど、`r.<<`の数を気にするのが面倒です。他のSQLも書いてるとボイラープレート化しますし、どうにかならないかなぁと思ってマクロを作ってやってみました。

作ったマクロを使うと下のように、`createObj`メソッドに生成したいケースクラスの型を型パラメータに、`GetResult`内の関数で受け取る`r`をパラメータに渡すだけでよくなります。`r.<<`を何回も書かなくてよくなりました！

```scala
implicit def getUserResult = GetResult { r => createObj[User](r) }
```

`r`を1回しか使ってないから`_`を使えますね。

```scala
implicit def getUserResult = GetResult { createObj[User](_) }
```

マクロの実装はこんな感じです。

```scala
package mymacros

import scala.language.experimental.macros
import scala.reflect.macros.blackbox

import slick.jdbc.PositionedResult

object MyMacro {
  // マクロを利用する側から呼び出すメソッド
  def createObj[A](r: PositionedResult): A = macro createObjImpl[A]

  // マクロの実装
  def createObjImpl[A: c.WeakTypeTag](c: blackbox.Context)(r: c.Expr[PositionedResult]) = {
    import c.universe._

    // ケースクラス名のシンボルを取得
    val caseClassSym: c.universe.Symbol = c.weakTypeOf[A].typeSymbol
    if (!caseClassSym.isClass || !caseClassSym.asClass.isCaseClass) c.abort(c.enclosingPosition, s"$caseClassSym is not a case class")

    // ケースクラスのフィールドを取得
    val fields = caseClassSym.typeSignature.decls.filter {
      case x: TermSymbol => x.isVal && x.isCaseAccessor
      case _ => false
    }

    // rr.<<, rr.<<・・・
    val params = fields.map(_ => q"rr.<<")

    // User(r.<<, r.<< ・・・) っていうコード
    val code = q"""
    val rr = $r
    ${caseClassSym.name.toTermName}(..$params)
    """

    code
  }
}
```

参考にさせていただきました。

- http://matsu-chara.hatenablog.com/entry/2015/06/21/110000
- http://docs.scala-lang.org/ja/overviews/macros/overview.html
- http://docs.scala-lang.org/ja/overviews/reflection/overview.html
- http://d.hatena.ne.jp/xuwei/20140831/1409462088

初めてマクロ作ってみたんですが、コンパイル時に動作するものだから事前にコンパイルしておく必要があるんですねー。sbtで自作マクロを使うのに参考にさせていただきました。

- http://waman.hatenablog.com/entry/2014/11/03/023618
Page.***AppBarのDataContextのおかしな挙動と対応策

## 問題
Page.TopAppBarに設定したCommandBarでDataContextを使用する際、CommandBarのDataContextが意図しないDataContextに書き換わる問題に遭遇。


## 状況
１．MyCommandBar.xaml.csのコンストラクタ内でViewModelLocator.SetAutoWireViewModel(this, true)を呼び出していた（＝DataContextに自動でViewModelを読み込む）
２．CommandBarのDataContextが親Pageに設定されたDataContextで上書きされていた

→ CommandBar側のDataContextが意図したViewModelにならない状況。



## 対策
DataContextが常に意図したViewModelになるよう、CommandBar用のビヘイビアを作成してDataContextのモニタリング、強制再設定する。



```csharp:ForcedDataContextCommandbarBehavior.cs

public class ForcedDataContextCommandbarBehavior : Behavior<CommandBar>
{
	object PreservedDataContext;

	protected override void OnAttached()
	{
		base.OnAttached();

		PreservedDataContext = this.AssociatedObject.DataContext;

		this.AssociatedObject.DataContextChanged += OnDataContextChanged;
	}

	protected override void OnDetaching()
	{
		base.OnDetaching();

		this.AssociatedObject.DataContextChanged -= OnDataContextChanged;
	}


	private void OnDataContextChanged(Windows.UI.Xaml.FrameworkElement sender, Windows.UI.Xaml.DataContextChangedEventArgs args)
	{
		if(args.NewValue != null)
		{
			if(PreservedDataContext != this.AssociatedObject.DataContext)
			{
				this.AssociatedObject.DataContext = PreservedDataContext;
				args.Handled = true;
            }
		}
	}
}

```

```xml:MyPage.xaml
<Page.TopAppBar>
    <v:MyCommandBar>
        <Interactivity:Interaction.Behaviors>
            <behavior:ForcedDataContextCommandbarBehavior />
        </Interactivity:Interaction.Behaviors>
    </v:MyCommandBar>
</Page.TopAppBar>
```

補足：MyCommandBar側はコンストラクタ内のInitializeComponentの後に、DataContextの設定していることを前提にしています。


## 原因
元々、Page.~AppBar以下の要素のDataContextにPageのDataContextが伝播しない不具合？ があったようで、その対策としてPage.~AppBar以下の要素のDataContextをPage.Datacontextで上書きを行っていた模様。

PageとCommandBarは地続きの関係なので、他と同様に"行儀よく"DataContext伝播が行われる実装が望ましいと思います。



#### 参考
[How to set AppBar DataContext - stackoverflow.com](http://stackoverflow.com/questions/25753649/how-to-set-appbar-datacontext)
CentOS+Boost+Asio

#ひとまず必要なSWをインストール
sudo yum groupinstall "Base" [^1]
sudo yum groupinstall "Development Tools" [^1]
sudo yum groupinstall "Japanese Support" [^1]

#Boostのインストール
sudo yum install boost*

#インストールパスを確認
find / -name boost
以下にインストールされます。
ライブラリ：/usr/lib64/boost
インクルード：/usr/include/boost

# コーディング
[まずはサンプルをビルドしてみましょう](http://www.boost.org/doc/libs/1_58_0/doc/html/boost_asio/tutorial/tuttimer1.html)

# ビルド
ビルド時のコマンド。(**太字個所**は要注意)
> g++ -g -MMD -MP -Wall -Wextra -Winit-self -Wno-unused-parameter -Wfloat-equal -I../inc **-I/usr/include/boost** -o obj/main.o -c main.cpp
g++ -o ../bin/TimerSync obj/main.o **-L/usr/lib64/boost** **-lboost_system** **-lpthread**

# 実行
./TimerSync

[^1]: [yum groupinstall](http://isseium.hateblo.jp/entry/20101031/1288510938)
WebView内のリンク先に遷移しない


`UIDelegate`を設定して`createWebViewWithRequest`を実装しないとリンク先に遷移しなかった。

```swift
class ViewController: NSViewController {
  @IBOutlet private weak var webView: WebView!

  override func viewDidLoad() {
    super.viewDidLoad()
    
    webView.UIDelegate = self
        
    webView.mainFrame.loadRequest(...)
  }
  
  override func webView(sender: WebView!, createWebViewWithRequest request: NSURLRequest!) -> WebView! {
    sender.mainFrame.loadRequest(request)
    return sender
  }
}
```
WebView内でCommand+aなどが効かない


素のWebViewを使うと、テキストフィールド内でのCommand+aなどが効かないらしい。

なので、WebViewを継承して、Command+aなどをハンドリングできるようにしたクラスを利用する。

```swift
import Cocoa
import WebKit

class MyWebView: WebView {
  override func performKeyEquivalent(theEvent: NSEvent) -> Bool {
    if let string = theEvent.characters {
      switch string {
      case "a":
        selectAll(self)
      case "c":
        copy(self)
      case "v":
        paste(self)
      case "x":
        cut(self)
      default:
        return super.performKeyEquivalent(theEvent)
      }
      
      return true
    }
    return super.performKeyEquivalent(theEvent)
  }
}
```
SwiftでのTableView　データ表示編

# Swiftでの簡単なテーブルビュー

## やること
1. StoryBoardのViewControllerにTableViewを追加
2. StoryBoardのTableViewをViewControllerにIBOutlet接続（名前をtableViewと設定）
3. UITableViewDataSourceとUITableViewDelegateを追加
4. delegateとdataSourceをselfに設定
5. セルに表示するテキストを追加
6. 必要なtableViewメソッドを2つ追加
7. セルタップ次の動作を追加

```swift:ViewController
import UIKit

// 3. UITableViewDataSourceとUITableViewDelegateを追加する
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    // 2. StoryBoardとつなぐ
    @IBOutlet weak var tableView: UITableView!
    
    // 5. テーブルに表示するテキスト
    let texts = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 4. delegateとdataSourceを設定
        tableView.delegate = self
        tableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // 6. 必要なtableViewメソッド
    // セルの行数
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return texts.count
    }

    // 6. 必要なtableViewメソッド
    // セルのテキストを追加
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell")
        
        cell.textLabel?.text = texts[indexPath.row]
        return cell
    }
    
    // 7. セルがタップされた時
    func tableView(table: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
        println(texts[indexPath.row])
    }
    
}
```

参考ソース
https://github.com/senseiswift/tableviewtest/blob/master/tableviewtest/ViewController.swift

続きはこちら　SwiftでのTableView　データ表示編
http://qiita.com/senseiswift/items/20d09c523772caaf8005
Bluetoothテザリング接続状況を確認し、On/OffするAppleScript


## 概要
* シェルスクリプトとして利用
	* 引数として`off`が与えられた場合のみ接続解除
* [blueutil](https://github.com/toy/blueutil)でBluetoothを有効化
* `networksetup -getinfo`で接続状況を確認
	* 既に接続しているのに接続しようとする、または未接続なのに解除しようとする場合、処理を実行しない
* GUIスクリプティングでMenuExtraをクリックし、接続をOn/Off

## 利用方法

```sh
$ osascript ~/bin/osascript/btconnect.scpt
$ osascript ~/bin/osascript/btconnect.scpt off
```

## コード

```btconnect.scpt
------------------------------------------
-- [Description]
-- Activate bluetooth with 'blueutil'.
-- Connect or disconnect bluetooth tethering of iPhone.
-- Reffer : http://d.hatena.ne.jp/zariganitosh/20100119/1263886959
------------------------------------------

property DeviceName : "MyiPhone" -- 親機で設定したデバイス名を指定

-- Process
on run argv
	set MenuOpt to "ネットワークへ接続"
	try
		if (first item of argv) is "off" then set MenuOpt to "ネットワークから接続解除"
	end try
	-- return result
	do shell script "/usr/local/bin/blueutil on"
	repeat
		if (do shell script "/usr/local/bin/blueutil status | cut -d' ' -f2") is "on" then exit 
		delay 0.2
	end repeat
	if (do shell script "networksetup -getinfo 'Bluetooth PAN' | grep -q 'Ethernet Address: (null)'; echo $?") is "0" then
		set Porpose to "ネットワークへ接続"
	else
		set Porpose to "ネットワークから接続解除"
	end if
	if MenuOpt = Porpose then click_menu_extra("bluetooth/" & DeviceName & "/" & MenuOpt)
end run

-- Hundler
on split(sourceText, separator)
	if sourceText = "" then return {}
	set oldDelimiters to AppleScript's text item delimiters
	set AppleScript's text item delimiters to {separator}
	set theList to text items of sourceText
	set AppleScript's text item delimiters to oldDelimiters
	return theList
end split
on number_from(str)
	try
		str as number
		on error
		str
	end try
end number_from
on click_menu_extra(menu_path)
	if menu_path is "" then
		error "menu_path が入力されていません。"
	end if
	set mp to split(menu_path, "/")
	tell application "System Events"
		tell process "SystemUIServer"
			set frontmost to true
			click (menu bar 1's first menu bar item whose attribute "AXDescription"'s value is (mp's item 1))
			repeat with i from 2 to mp's length
				click (result's menu 1's menu item (my number_from(mp's item i)))
			end repeat
			delay 0.1 --連続してメニューを操作する時、ひと呼吸必要
		end tell
	end tell
end click_menu_extra
```
herokuで運用していたBOTを24時間対応する

ついにherokuからFreeプランに変更するか18時間運用にするか、＄７払うかというメールが来ました。
お遊びで使っているBOTなこともあり、`Process Scheduler`を使うことで簡単に2つのBOTを切り替えられそうだったので、２つのアプリで１つのBOTを運用することにしました。

## githubのレポジトリ作成
github connectを使って自動デプロイをするので、まずBOT用のgithubレポジトリを作成し、git pushしておいてください。

## herokuに2つのアプリを作成
次にheroku上に新しく２つのBOTを作成します。
なおbot1やbot2の場所はアプリ名です。
ここでは、説明のためbo1、bot2と表記します。

```
$ heroku create bot1
$ heroku create bot2
```

herokuのフリープランではwebとworkerの2つのdynoが使えます。
どちらでもかまわないと思いますが、今回はworkerを使うので、自分の環境に合わせてProcfileを変更してください。

```Procfile
worker: npm start
```

その後herokuのページを開き、環境変数の設定を行います。

## github connectを使って自動デプロイ

変更するごとに、herokuに2回pushするのは面倒だったので`git push herooku master`によるデプロイはせずにgithubからの自動デプロイで対処することにします。
herokuのDeployタブを開き`App connected to GitHub`から先ほど作成したレポジトリを指定しましょう。これで、githubにpushするごとにherokuに自動にデプロイされます。簡単ですね。
さて、すでにgithubの方にはpushしてしまったので、画面の一番下に`Manual deploy`の項目があるので、はじめはここからデプロイしてみます。
`Deploy Branch`をクリックしてデプロイを実行します。
この作業をもう一つのアプリでも同様に行います。

## Process Schedulerを使って指定の時間眠らせる
このままだと同じBOTが並行して動いているだけなので、`Process Scheduler`を利用して指定の時間眠らせます。
`Resources`タブのAdd-onsフォームからProcess Schedulerを探して、process Schedulerを設定します。

今回はworkerで動かしているのでwebの方は全て`0`のままで、workerタブの方を設定してみます。
process Schedulerの設定は、２つのアプリの時間が被らないように注意しましょう。 

![スクリーンショット 2015-08-30 20.21.34.png](https://qiita-image-store.s3.amazonaws.com/0/15319/f249c016-3e83-25d9-b734-9bae6db03178.png "スクリーンショット 2015-08-30 20.21.34.png")

この作業ももう一つのアプリでも同様に行います。

### 注意
混乱するので、タイムゾーンの設定をアプリとProcess Schedulerで合わせた方がいいでしょう。

## 完成
以上で２つのアプリが交代で１つのbotとして稼働するようになったと思います。
お疲れ様でした。

## 参考にした記事

- [HerokuでHubotを指定の時間に寝かせる - はらへり日記](http://sota1235.hatenablog.com/entry/2015/06/10/130000)
PlantUML を vim から使う@Windows


[PlantUML を vim から使う - Qiita](http://qiita.com/taketin/items/5cc7ff13b32492d9e2ad) を読んで使ってみて、Windows で少し躓いたところの話。

環境変数 GRAPHVIZ_DOT を OS に設定しなくてもいいようにバッチファイルへ追加。

```bat:plantuml.bat
set GRAPHVIZ_DOT=C:\path\to\dot.exe
java -jar $HOME/lib/java/plantuml.jar -tpng %1
```