OmniAICreator/Qiita-1.07M huggingface dataset:
Redis Cluster 覚え書き

Redis Cluster についてのメモ。

Redis 3.0 で正式に追加された機能。
実験的な実装としては以前からあった。

## 公式情報

* [(release) Redis 3.0.0 is out. - Google グループ](https://groups.google.com/forum/#!msg/redis-db/dO0bFyD_THQ/Uoo2GjIx6qgJ) ... Redis 3.0.0 リリースアナウンス。
* [Redis Cluster Specification](http://redis.io/topics/cluster-spec) ... 仕様詳細
* [Redis cluster tutorial](http://redis.io/topics/cluster-tutorial) ... クラスタ機能を試すことができるチュートリアル

## 概要

Redis Cluster 機能を使うと、Redis インスタンスをクラスタリングすることができる。
通常のレプリケーション構成ではなく、複数の master ノードを束ねて協調動作させ、クラスタ全体で保持するデータ量をスケールアウトさせることができる。

## 特徴

* Redis の単一キーのコマンドはすべてサポート
* Redis の複数キーのコマンドはキーがすべて同じノードにあれば OK
* 全ノードがクライアントからのリクエストを受け付ける
    * 自分がデータを持ってない場合、エラーを返して正しいノードにリダイレクトさせる
        * リクエストを正しいノードにプロキシすることはしない
* 全ノードがお互いに通信する
    * Gossip プロトコル
* master/slave, フェールオーバー
    * 各masterに1つ以上のslaveをレプリケーションさせることができる
    * master ダウン時は slave にフェールオーバーする
    * slave が1台もいなくなった場合、他の master の slave が複数いれば、slave を譲り受けることができる。**Replica Migration**
* リシャーディング機能
    * ノードを追加してデータを再配置し、スケールアウトすることができる
* 設計思想
    * 1000ノードオーダーでスケールアウト可能
    * 書き込み安全性、可用性も担保する

## 他の分散KVSとの違い

以下が特徴的だと思う。

* ノードに master/slave の role があること
* リクエストに対するデータを持っていないノードに問い合わせたとき、正しいノードにリダイレクトされる。

他の分散KVSだと、ノードに role の区別はなく、データの在り処を内部的に解決して返してくれる、というものが多いような気がする。
Cassandra とか、 Riak とか。

## 更に仕様を詳しく知りたい人へ

### ざっと掴みたい人向け

* [Salvatore Sanfilippo – How Redis Cluster works, and why - NoSQL matters Barcelona 2014](http://www.slideshare.net/NoSQLmatters/no-sql-matters-bcn-2014) ... 2014年11月に発表された作者によるクラスタ機能解説のスライド(31P)
* [Redisのクラスタリング — redis 2.0.3 documentation](http://redis.shibu.jp/admin/cluster/) ... もうだいぶ古くなってしまった情報ですが、概念はあまり変わってないと思います。参考程度に。

### 参考記事

* [Redis Cluster の構築と利用（Redis 3.0.0） - ALBERT Engineer Blog](http://tech.albert2005.co.jp/blog/2015/04/28/redis-cluster/)
    * チュートリアルの内容に加えて、基本的な仕様の解説がまとまっていると思います
* [Redis Cluster のリシャーディングとorphaned masterの話 - CyberAgent エンジニア Advent Calendar 2014 2日目](https://gist.github.com/yutori/158e5eeea60ba2914d1a)
    * 昨年12月の記事。Redis のバージョンは 3.0.0 RC1 と 3.0.0 beta-3
    * リシャーディング機能、レプリカ・マイグレーションについて実際に動かしたときの挙動を詳しく解説している
* [\[WIP\] Redis Cluster Specification を翻訳してみる](https://gist.github.com/key-amb/c641947a2139fdd81684)
    * 公式仕様を最初の3割ぐらい日本語化してみたもの

## チュートリアルやってみた記事

* [redis clusterの作り方 - Qiita](http://qiita.com/sawada_masahiko/items/7b7956373b1a159e20c4)
* [RedisClusterをちょっとだけ試してみる。 - peropero](http://osawagiboy.hatenadiary.com/entry/2013/12/24/042909)
    * 2013年12月なので、ちょっと古い。このときは unstable だったことが伺える。

## その他参考記事

* [Redis cluster, no longer vaporware. - Antirez weblog](http://antirez.com/news/79)
  * 2014年10月ごろの作者によるブログ投稿記事
  * 2011年3月から始まった Redis Cluster 開発の歴史について

## 個人的に気になる点

* 仕様について
    * 非クラスタのRedisをクラスタ版に置き換える場合、これまでのRedisクライアントは書き替える必要がある？
        * リダイレクトが発生するので、ありそうな話。
    * ある master の系統が slave 含めて全滅したときは勝手にリシャーディングしてくれる？
        * これまで読んだドキュメントの情報だと、クラスタがダウンしそう。
        * たぶん手動で MIGRATE 操作を行って、クラスタのノード数を減らすことはできる

## 最後に

メモですが、誤りなどありましたらお知らせ下さい。
不定期に更新するかもしれません。
Zip4jでバイト配列を暗号化zip圧縮する

# 目的
Java標準のjava.util.zipは暗号化に対応していません。
なので暗号化zipをしようとすると別途ライブラリが必要になります。
色々試したのですが、結局は一番メジャーらしいzip4jを使うことにしました。
# zip4j
公式サイトは[こちら](http://www.lingala.net/zip4j/)
Maven Repositoryは[こちら](http://mvnrepository.com/artifact/net.lingala.zip4j/zip4j/1.3.2)
最新のバージョンは1.3.2のようです。
# コード
## 依存ライブラリを定義
```xml:pom.xml
    <dependencies>
        <dependency>
            <groupId>net.lingala.zip4j</groupId>
            <artifactId>zip4j</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>
```
## 暗号化zip部分
このライブラリに限らないのですが、zipエントリを作る際、実際に存在するファイルの属性を取得して利用しているため、バイト配列だけでは直接zipエントリを作成できません。
なので、Fileクラスの匿名クラスを使って対処します。
ただ、階層構造をもったzipファイルを作ろうとすると面倒なので、その場合は一時的にローカル出力したファイルを圧縮した方が楽かもしれません。

```java:Zip.java
package com.company;

import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

public class Zip {

    public byte[] encryptZip(final String fileName, final byte[] input, String password) throws IOException, ZipException {
        ZipParameters parameters = new ZipParameters();
        parameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
        parameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
        parameters.setEncryptFiles(true);
        parameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
        parameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
        parameters.setPassword(password);

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        try (net.lingala.zip4j.io.ZipOutputStream zipOutputStream = new net.lingala.zip4j.io.ZipOutputStream(byteArrayOutputStream)) {
            File file = new File(fileName) {
                @Override
                public boolean exists() {return true;}
                @Override
                public boolean isDirectory() {return false;}
                @Override
                public String getAbsolutePath() {return fileName;}
                @Override
                public boolean isHidden() {return false;}
                @Override
                public long lastModified() {return System.currentTimeMillis();}
                @Override
                public long length() {return input.length;}
            };

            zipOutputStream.putNextEntry(file, parameters);
            zipOutputStream.write(input);
            zipOutputStream.closeEntry();
            zipOutputStream.finish();
        }

        return byteArrayOutputStream.toByteArray();

    }
}

```

## 呼び出し
あとはファイル名と暗号化zip圧縮したいバイト配列、パスワードを渡すだけです

```java:Main.java
    public static void main(String[] args) {
        Zip zip = new Zip();
        try {
            byte[] encrypted = zip.encryptZip("hoge.txt", new byte[]{0x30, 0x30}, "testPwd");
            try(FileOutputStream stream = new FileOutputStream(".\test.zip")) {
                stream.write(encrypted);
            }
        } catch (IOException | ZipException e) {
            e.printStackTrace();
        }
    }
```
全部オンメモリで処理したい場合はこうなるかなと。
safariをvimの様に操作できる機能拡張[svim]の使い方


[環境設定]-[機能拡張]-[機能拡張を入手]から"svim"で検索して[Install Now]を押すとインストールできます。

公式のreadmeはこちら  
https://github.com/flipxfx/sVim/blob/master/README.md

## 基本
- escか"ctrl - ["でノーマルモード
- iでインサートモード

ノーマルモードはvim的なキーバインドを受け付けるモード  
インサートモードは普通にブラウジングできるモード

フォームにフォーカスがある状態では使えないので、escか"ctrl - ["でノーマルモードにして使います。


## 移動
h,j,k,l
---
 各方向にスクロール

d,e
---
半画面上下にスクロール

D,E
---
１画面上下にスクロール
gg
---
トップへスクロール

G
---
最下部へスクロール

※ g9のような行番号指定はできません

gi
---
最初のinput boxへ移動

H
---
履歴を戻る

L
---
履歴を進む



## タブ

K
---
次のタブに移動

J
---
前のタブに移動

t
---
新しいタブを開く

x
---
現在のタブを閉じる

gx0
---
左のタブを全て閉じる

gx$
---
右のタブを全て閉じる

X
---
最後に閉じたタブを開く

shift+,
---
現在のタブを左に移動

shift+.
---
現在のタブを右に移動

r
---
ページのリロード


## リンク

f or F
---
リンクヒントを表示

![スクリーンショット40.png](https://qiita-image-store.s3.amazonaws.com/0/4784/9ddf74c1-719c-4866-b725-50f1c9fada55.png)

    f(現在のタブ)もしくはF(新しいタブ)を押すとリンクヒントが表示される。

    ヒントの文字を入力するとその場所にフォーカスが移るので、enterでリンクを開くことができます。
    
※ 初期状態では動きませんでしたが、[環境設定]-[機能拡張]からアップデートすると使えるようになりました。

## sVimrc

gv
---
sVimrcを開く

    sVimrcはsVimの設定ファイルです。
    これを設定することでキーをリマップしたりスクロール幅を変えたりできます。
    
    


詳しくは以下を参照  
https://github.com/flipxfx/sVim

ちなみにgistで公開されているsvimrcをインポートできます。  
例えば私のgistはここです。

https://gist.github.com/mick-whats/49640d71bb6e75875ddb

  
この末尾の[49640d71bb6e75875ddb]がgist idになります。

gvして開いたページの`sVimrc | gist id: `という所にこのidを貼り付けて`Sync`を押すとインポートできます。

## その他

zi
---
ズームイン

zo
---
ズームアウト

z0
---
元のズームに戻す
arduinoが取得するアナログ値を電圧(V)に変換する

2017/8/28にコードを修正しました。

arduinoのアナログ入力は10ビットの分解能です．
0Vから5Vの電圧は，0から1023の値で表現されます．

```c
void setup()
{
  Serial.begin( 9600 );
}
void loop()
{
  int input_value = analogRead(0);
  Serial.println(input_value);
  delay(100);
}
```

A0番ピンにアナログ信号を入力し，シリアルモニタで表示してみます．
この入力値を電圧として使いたい場合があるかと思います．
電圧値を算出するには，取得10ビット値×最大電圧/1023にて計算出来ます．
10ビット値の値が，586である場合

586×5V/1023 = 2.86V

となります．

```java
void setup()
{
  Serial.begin( 9600 );
}
void loop()
{
  float input_value = analogRead(0);
  //電圧に変換
  float convert_v = (input_value*5)/1023;
  //10ビット値を出力
  Serial.println(input_value);
  //電圧値を出力
  Serial.println(convert_v);
  delay(100);
}
```

これで，アナログ信号で取得した値が，何Vなのかがわかります．
Pythonでの開発方法

引き続き参考書を読みながら説明をしていきます。

Pythonには主に対話型プログラミングとモジュール（ファイル）に書き込むコーディング方法があります。使用用途によってどちらを選ぶか自由ですし、両方使いながら開発していってもよいでしょう。対話型プログラミングとはターミナルやコマンドプロンプトを立ち上げ、その中でPythonを立ち上げてからターミナル上でコーディングしていきます。基本的には一行かいてEnterすれば、その一行がPVM上で実行されるという仕組みです。また数行をまとめて書く方法もありますが、それは今度にします。ちなみにprint　statementを使用しなくても対話型では自動的に出力が得られます。ちなみにAnacondaでは変数をインストール時に設定してくれアナコンダ用のコマンドプロンプトも用意していてくれてます。

AnacondaのコマンドプロンプとIDE(統合開発環境)のSpyder：
![Anaconda　IDE.jpg](https://qiita-image-store.s3.amazonaws.com/0/38063/3503d3ec-2f11-00de-48bf-2b6250cab64f.jpeg)

コマンドプロンプトでのPython立ち上げ：
![Python立ち上げ.jpg](https://qiita-image-store.s3.amazonaws.com/0/38063/b78e969a-db16-b346-2c8e-98af0b8258b6.jpeg)

入力値と出力値：
![対話型でのHello　World!と足し算の入力と出力.jpg](https://qiita-image-store.s3.amazonaws.com/0/38063/7da3970a-f805-27ea-da83-b04c809d2d58.jpeg)

ただ対話型では一度コードを実行するとそのコードは保存されません。なので同じコードを書きたければコピペなどをしなければいけず、毎度コンパイルする事になります。ちなみにプロンプト内でPythonを終わらせるのはCTRL+ZがWindows系でCTRL+DがUnix系です。

ただしモジュールに書けば、そのコードは半永久的に残り、一度コンパイルすれば自動的にトコードにしてしまえばバイトコードをPVM上で実行すればいいだけになります。Pythonのファイルの拡張子は.pyでバイトコードは.pycとなります（コンパイル時に自動的に.pycを生成します）。このファイル内のコードをプロンプト内で実行する方法があります。例えばtest.pyというモジュールを作成したとして実行するにはプロンプトで
![Moduleの実行.jpg](https://qiita-image-store.s3.amazonaws.com/0/38063/5121d80e-6de6-24c7-6b4a-c303b2adcf57.jpeg)
とすればモジュール内のコードを実行します。対話型とは違いモジュール内の値を出力する場合はprint statementが必要になります。前の投稿で書いたようにAnacondaのIDEを使うのでこの方法は使う事は少なくなるかもしれませんが、一応見直したときに役に立つかと思い書いておきました。

AnacondaのIDE(Spyder):
![Spyder(IDE of Python).jpg](https://qiita-image-store.s3.amazonaws.com/0/38063/d4a1cc89-a276-5ef1-61bb-23ca2ae04526.jpeg)

ここまではPythonの大まかな開発ツールについての説明をしてきましたが、次回からは実際にコーディングについて書いていこうと思います。

んー、とりあえずPythonでLIFOとFIFOを作っておこうと思ったんですが作業に取り掛かるまで時間がかかりそうですねｗもし今回の投稿に訂正や質問があればコメントもしくはE-mailでお知らせください！

参考資料：初めてのPython　第３版　（発行元：オーライリージャパン）

Anacondaのダウンロードサイト(英語のみだと思います)：
http://continuum.io/downloads
[rails]grapeの簡単な導入（アクセスまで）

railsプロジェクトを作ったらGemfileにgrapeの利用を追記します。

```:Gemfile
gem 'grape'
```

次に以下を記述

```rb:config/routes.rb
mount API => '/'
```

```rb:config/application.rb
config.middleware.use(Rack::Config) do |env|
      env['api.tilt.root'] = Rails.root.join 'app', 'api'
end
```

次のフォルダ及びファイルを作成し記述

```rb:app/api/api.rb
class API < Grape::API
  format :json
  prefix "api"
  version "v1", using: :path

  #http://localhost:3000/api/v1/debug/test
  resource :debug do
    get :test do
     {"debug"=>"hello"}
    end
  end
 end
```

最後に`bundle install`を行、
grapeをインストールしたら`http://localhost:3000/api/v1/debug/test`へgetすることでjsonが取得できる。
新しいWAFを触るときに作るもの


興味があるWebアプリフレームワーク（WAF）の使い心地を試してみたいとき、こんなものを段階的に作っています。とくに意識したことは無かったけど最近いろいろなWAFを触っていて無意識のパターンに気づいたのでメモ。

1. Hello wolrd
	ページに”Hello World”とだけ表示される例のやつ。

1. 1行掲示板
	上部にテキストボックスとボタン一つのフォームがあって、下部に打ち込んだ文字列のリストが並ぶもの（created_atも付ける場合あり）。複数ページに別れてないのでViewを作るのも楽ちん。
	これをやるには何らかのデータストアを使う必要があるので、Modelの保存の仕方、ORMなどの使い方が覚えられる。CRUDのUD以外が出来たことになる。

1. Tropy
	[Tropy](http://www.hyuki.com/tropy/)はざっくり言うと超簡易なWikiっぽいもの（詳しくはリンク先見て）。ReadとUpdate、Createのページがそれぞれ必要なのでURLルーティングの機能を試すことができる。
	アプリの仕様自体はシンプルなのですぐ作れるのがいい。


あとは各WAFドキュメントのチュートリアルなどを一通りやってみるのが良いでしょう。たいていブログなどを作ってユーザ管理を作って、とかやるはず。

ちょっと触ってみたいだけでチュートリアルを全部やるのはダルい、でもそこそこの感触と達成感が欲しいという私みたいなモノグサなひとはこんなやりかたもあるよーという紹介でした。

おわり。
(Psych::SyntaxError)がでました

`rails s` したらエラーがでて起動しなくて困りました。

```bash:
bundle exec rails s -b 0.0.0.0 -p 8888

/home/vagrant/.rbenv/versions/2.2.0/lib/ruby/2.2.0/psych.rb:370:in `parse': (<unknown>): mapping values are not allowed in this context at line 18 column 151 (Psych::SyntaxError)
以下略
```
SynatxErrorと書いてあるもののどこのエラーかわからなかったのですが、ymlファイルの構文が間違っているとこのエラーがでるようです。

読みこんでいるymlファイルの構文を見なおしてみたらエラーを修正できました☆（ゝω・）vｷｬﾋﾟ
Let’s Chat は Firefox で使うか、Chrome で使うか - デスクトップ通知から

# はじめに

Let's Chat には Chrome/Firefox のデスクトップ通知機能があります。左上のアカウントのドロップダウンの中の Notification で有効にできます。

では、Firefox と Chrome のどちらを使った方が良いのでしょうか？

# 結論

Chrome の方が良い。

# どうして

## 1. 通知の重なり

どちらのブラウザも、ログインしているルームの発言と、メンションのあった内容がデスクトップに通知されます。しかし、Firefox ではメンションのあった発言と通常の発言のデスクトップ通知が重なり合って表示されてしまって見づらいです。

## 2. メンションの持続

メンションのあった発言は、Firefox だとそのうち消えてしまいますが、Chrome ではクリックするまで残り続けます。
Redmine のメール設定

#目的
Redmine のメール設定

#前提
[link-1]:http://qiita.com/ikep-panda/items/641b50fdf8c394ddfb6b
[Redmineインストール][link-1] 済み
特に記載ないものは **root** ユーザで実行

#Gmailアカウント作成
設定ファイルにユーザ／パスワードを記述するため、セキュリティを考慮して**送信用アカウント**を作成しておく
[Gmailアカウント作成](https://www.gmail.com/intl/ja/mail/help/about.html)

#Redmine 設定
##configuration.yml 設定
Redmineフォルダの **/config/configuration.yml** を以下の通り編集

```shell-session
production:
  email_delivery:
    delivery_method: :smtp
    smtp_settings:
      enable_starttls_auto: true    # 追加
      address: "smtp.gmail.com"    # 変更
      port: 587    # 変更
      domain: "smtp.gmail.com"    #  変更
      authentication: :plain    # 追加
      user_name: "********@gmail.com"    # 追加(作成した送信用Gmailアドレス)
      password: "********"    # 追加(送信用Gmailアドレスのパスワード)

  rmagick_font_path: /usr/share/fonts/ipa-pgothic/ipagp.ttf
```

各設定項目は[Redmine.JP のconfiguration.ymlの設定項目](http://redmine.jp/config/configuration_yml/) を参照
※抜粋

| 設定項目 | 説明 |
|:-----------|:----------------------|
| delivery_method | Redmineからメールを送信する方法です。SMTPサーバを使う場合は :smtp 、sendmailコマンドを使用する場合には :sendmail です。 |
| port | SMTPサーバのポート番号を指定してください。 |
| authentication | SMTPサーバの認証方式を指定してください。 :plain, :login, :cram_md5 のいずれかです。SMTPサーバが認証を必要としない場合はこの項目は不要です。 |
| domain | Redmineが動作しているサーバのFQDNを入力してくだしさい。 |
| user_name | 認証の際に使用するユーザ名を指定してください。認証を必要としない場合はこの項目は不要です。 |
| password | 認証の際に使用するパスワードを指定してください。認証を必要としない場合はこの項目は不要です。 |


##Apache 再起動

```shell-session
[root@centos7 ~]# service httpd restart
Redirecting to /bin/systemctl restart  httpd.service
```

##ユーザ設定
「管理」→「ユーザ」より対象ユーザを選択
**受信用メールアドレス**を設定して保存
![redmine_mail_1.png](https://qiita-image-store.s3.amazonaws.com/0/71253/32eedb6e-f1cc-8837-855c-c2b9903a97a2.png)

##メール通知設定
「管理」→「設定」→「メール通知」タブを選択
上記で作成した**送信用アカウントのメールアドレス**を設定して保存
右下の「テストメールを送信」クリックで、メールの送受信を確認

#おわりに
ひとまずGmailを使ったメール送信はこれでオッケー
社内サーバのRedmineはGmail使えないので、どうするかは別途
【WatchKit】Glanceの情報によってWKInterfaceをかえる

# 目次
* やりたいこと
* storyboard
* Glance上のコード
* InterfaceControllerのコード

## やりたいこと
WatchKitにはiOSのAppDelegateのように、アプリ全体を管理するクラスがないみたい（認識が間違っていたらご指摘ください）
なので、各Interfaceから他のInterfaceへ情報をどうやって渡すのだろうと思っていたらHandoffの機能を使えばそれが実現できるそうです。

今日はGlanceの情報によってWKInterfaceの画面を切り替える処理を調べてみました。

例えば、カウントダウンタイマーアプリを作りたいとして、
カウントダウン中、カウントダウン終了などのアプリの状態によって、GlanceからWKInterfaceを立ち上げた時のWKInterfaceを切り替えたいときはあるかと思います。

そんなときは、Handoffの機能を使うとGlanceの情報をWKInterfaceに渡せるそうです。
渡した後はWKInterfaceでどのInterfaceを表示するかを切り替えればOK

## storyboard
下記のように二つのInterfaceがあるとします。
あとでWKInterfaceで切り替えの指定をするのでstoryboardでIdentifierを指定しておきます。

1. firstPage
2. secondPage


![スクリーンショット 2015-04-19 13.06.51.png](https://qiita-image-store.s3.amazonaws.com/0/31587/8c3abe4f-6f7f-e83e-9cab-1c95fd37d5a1.png "スクリーンショット 2015-04-19 13.06.51.png")

![スクリーンショット 2015-04-19 13.09.02.png](https://qiita-image-store.s3.amazonaws.com/0/31587/3b5b2145-08bc-dd93-e969-8188966c7080.png "スクリーンショット 2015-04-19 13.09.02.png")



## Glance上のコード


```swift:GlanceController.swift
override func awakeWithContext(context: AnyObject?) {
    super.awakeWithContext(context)
        
    // Configure interface objects here.
    updateUserActivity("com.personal-factory.watchHandoff.sample", userInfo: ["hoge":"test"],webpageURL :nil)     
    }
```

Glance上のコードです。WKInterfaceに渡したい情報を
```- updateUserActivity:userInfo:webpageURL:```に渡して実行します。今回は["hoge":"test"]という辞書を渡します。

------
```swift
func updateUserActivity(_ type: String,
               userInfo userInfo: [NSObject : AnyObject]?,
             webpageURL webpageURL: NSURL?)
```
  
| 引数 | 　 | 
|:-----------|:------------|
| type | アクティビティを受信側で判別するための文字列（activityType）を指定。逆DNS形式。空文字及びnil指定は不可 | 
| userInfo | 他のデバイスに渡す辞書式の情報。次の型が使用可能。NSArray, NSData, NSDate, NSDictionary, NSNull, NSNumber, NSSet, NSString.| 
| webpageURL | 活動を継続するためにブラウザにロードするためにWebページを含むURL。 URLのスキームは、HTTPまたはHTTPSでなければなりません。 | 



## InterfaceControllerのコード
Glanceから渡された情報によってstoryboardのInterfaceを切り替える処理を書いていきます。

```swift:InterfaceController.swift
    override func handleUserActivity(userInfo: [NSObject : AnyObject]!) {
        print(userInfo)
        if let handleData = userInfo["hoge"] as? String{
            if handleData == "test"{
                 WKInterfaceController.reloadRootControllersWithNames(["secondPage"], contexts: nil)
            }else{
                WKInterfaceController.reloadRootControllersWithNames(["firstPage"], contexts: nil)
            }
        }
    }

```

```- handleUserActivity:```をoverrideすると```- updateUserActivity:userInfo:webpageURL:```で情報が渡されたときに実行される仕組みです。

-----
```swift
class func reloadRootControllersWithNames(_ names: [AnyObject],
                                 contexts contexts: [AnyObject]?)

```
Namesに指定したstoryboardのIdentifierのInterfaceが立ち上がります。

## 参考
[WatchKitでHandoff](http://blog.haranicle.net/watchkit_handoff/)

[HandoffをつかってApple Watchの作業をiPhoneに引き継ぐ](http://qiita.com/koogawa/items/970fdf2396fde489a6f5)
Swiftで録音するサンプル書いてみた


DetectMic
https://github.com/nmisawa/DetectMic

プロジェクト名がDetectなのは、マイクの認識をしようとしたところから始まっただけ。
selfを多用しちゃったのはObjective-Cの癖か、、

機能としては録音、停止、録音中のpeak値などをUILabelに表示する簡単なものなので、Swiftでやってみようっていう方には参考になるかと思います。

; がいらない、if文でのカッコがいらない、呼び出し方など苦労しました。
PHP7調査(20)preg_replace関数のe修飾子の廃止

PHP7で、preg_replace関数のe修飾子が廃止されます。代わりにpreg_replace_callback関数を使ってね、とのこと。まーそうですよね。

そもそもPHP 5.5以降はdeprecatedになっていたので、誰も使ってないはず…。

# 参照

* [PHP RFC: Remove deprecated functionality in PHP 7](https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7)
* [RFC: Remove preg_replace /e modifier](https://wiki.php.net/rfc/remove_preg_replace_eval_modifier)
* [例えばPHPのpreg_replace関数でe修飾子を避ける - hnwの日記](http://d.hatena.ne.jp/hnw/20100815)
mruby で例外が起こった場所の backtrace を rescue 節など他の場所でも取得できるようにする

## 追記 (2016/01/11)

現在の [mruby](https://github.com/mruby/mruby) の master の挙動がここで書いている対策が必要ないような動作になっているため、
この記事に書いてある様なことをする必要はなくなっているかと思います。

## 本文

mruby で以下の様なコードを実行すると

```ruby
def g
  raise "test"
end

def f
  begin
    g
  rescue => e
    raise e
  end
end

begin
  f
rescue => e
  puts "e.backtrace"
  puts "#{e.backtrace.map{|v| "  " + v}.join("\n")}"
end


```

以下のように出力されます。

```
e.backtrace
  exception_default.rb:18

```

backtrace を出力するところの rescue 節の中を指し示しています。

rubyだと以下のように出力されます。

```
e.backtrace
  exception_default.rb:3:in `g'
  exception_default.rb:8:in `f'
  exception_default.rb:15:in `<main>'
```

以下を見ると現状の mruby の挙動のようです。

https://github.com/mruby/mruby/issues/1661
http://qiita.com/seanchas_t/items/ca293f9dd4454cd6cb6d

デバッグ時などは ruby の挙動のほうが
例外が起こった場所がわかりやすいので
mruby本体は書き換えずにrubyのような出力が
出来る方法を考えました。
以下の処理を追加すると、
mruby での backtrace が ruby と同じようなものになります。

```ruby
class Exception
   
  alias_method :old_initialize, :initialize 
  alias_method :old_backtrace, :backtrace 
  
  @@initializing = false
  @@current_backtrace = nil
  
  def initialize(*args)
    old_initialize(*args)
    
    unless @@initializing
      # not thread safe
      @@initializing = true
      begin
        raise ""
      rescue => e
        @stored_backtrace = e.backtrace[2..-1]
      end
      @@initializing = false
    else
      
    end
  end
  
  def backtrace
    if @stored_backtrace
      @stored_backtrace
    else
      self.old_backtrace
    end
  end
end
```


先ほどのコードの先頭にこのコードを挿入すると、mrubyでの出力は以下のようになります。

```
e.backtrace
  exception_better_backtrace.rb:37:in Object.g
  exception_better_backtrace.rb:42:in Object.f
  exception_better_backtrace.rb:49
```

コード及び確認用コードは以下においてあります。

https://github.com/dycoon/mruby_better_backtrace_snipet

## 追記 (2015/11/29)

mrbgems を作りました。
https://github.com/dycoon/mruby-ruby-like-backtrace
(Gem::LoadError)が出たのでbundle updateしました

Rails generateコマンドを実行したところ(Gem::LoadError)が出ました。
# (Gem::LoadError)が発生
`rails g model`を実行したところspringというgemで(Gem::LoadError)がでました。

```bash:railsコマンドでエラー
bundle exec rails g model user provider:string uid:string nickname:string image_url:string 

/home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/bundler-1.8.2/lib/bundler/runtime.rb:34:in `block in setup': You have already activated spring 1.3.3, but your Gemfile requires spring 1.3.2. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
```
エラーメッセージでは `bundle exec` をつければ直るかもと書いてありますが、コマンドはそもそも `bundle exec` をつけて実行しています。

# bundle update をする
おそらくRailsのGemfile.lockは `spring (1.3.2)` と書いてあるのにも拘らず、入っているspringが1.3.3なのかなと思いました。

```bash:springのバージョンを上げる
bundle update
```
`bundle update` をすればGemfile.lockのspringのバージョンが上がるのかなと思い実行しました。

```bash:Gemfile.lockのspringのバージョンが更新される
spring (1.3.4)
```
spring1.3.3で良かったのですが1.3.4になってしまいました。

# 再度rails generateコマンドを実行
`rails g` を再び実行します。

```bash:railsコマンドでモデルを作成
bundle exec rails g model user provider:string uid:string nickname:string image_url:string 

      create    db/migrate/20150419035119_create_users.rb
      create    app/models/user.rb
      invoke    rspec
      create      spec/models/user_spec.rb
      invoke      factory_girl
```
今度はうまくいきました(☝ ՞ਊ ՞)
第30回オフラインリアルタイムどう書く「とある世界のタクシー料金」の ruby による実装

問題 http://nabetani.sakura.ne.jp/hena/ord30taxi/
実装リンク集 http://qiita.com/Nabetani/items/c70417d384720a3339d6
イベント https://yhpg.doorkeeper.jp/events/22168

で。
当日お見せした実装

```ruby
DISTS=->(){
  raw="AB1090e  AC180e  AD540r  BC960e  BG1270e  CD400r  CF200e  DE720r  DF510r  EG1050r  FG230r"
  raw.scan( /([A-Z]{2})(\d+)([er])/ ).each.with_object({}){ |(path, dist, city),o|
    o[path]=[dist.to_i, city.to_sym].freeze
  }
}.().freeze

def solve_impl( paths, dist, cost )
  return cost if paths.empty?
  curpos=paths[0]
  if curpos[0]<dist
    solve_impl( paths.drop(1), dist-curpos[0], cost )
  else
    solve_impl( paths, 200+dist, cost+{e:60, r:50}[curpos[1]] )
  end
end

def solve( src )
  paths=src.chars.each_cons(2).map{ |a,b|
    DISTS[a+b] || DISTS[b+a]
  }
  start =  "ABC".include?(src[0]) ? [995,400] : [845,350]
  solve_impl( paths, *start ).to_s
end

DATA.each.map do |line|
  ix, src, expected = line.split(/\s+/)
  next unless src
  actual = solve( src )
  ok = actual==expected
  puts [ ok ? nil : "**NG**", ix, src, actual, ok ? nil : expected ].compact.join("  ")
  ok
end.all?.tap{ |all_ok|
  puts "Everything is Okay!" if all_ok
}
__END__
0 ADFC  510
1 CFDA  500
```

いつも通りテストデータの大半を省略。

スタックの消費が気になるところだけど、再帰呼び出しで実装。

計算のロジックは見ての通り簡単。`solve_impl` が主要部。`paths` の経路を進むんだけど、距離 `dist` までは料金計算済み。計算済みの料金は `cost`。という状況を進めている。
初乗りの部分は再帰呼び出しにはいらないので外に出して、 `solve` が担当。

配列に対して `drop(1)` を繰り返しているのがちょっと残念で、計算量を考えたら C++ の `std::deque` のようなものに載せたいところだけど、そういうものは手軽には ruby にはないので仕方ないし、そんなことを気にする前に割り算をして計算量を減らすべき。

難易度としては普通ぐらいになったみたい。
出題者の気分としては、前回の問題（ http://nabetani.sakura.ne.jp/hena/ord29devdice/ ）よりもちょっと面倒で書きにくい感じもするんだけど。

ciel さんが http://qiita.com/cielavenir/items/14b9f8b38af1c61aca12 に書いている通り、初乗りの距離の1の位が 5 で、町と町の間の距離の1の位がゼロなのは、境界条件で楽をするため。
出題側も厳密に定義しなくて済むので楽だし、実装側も適当に書いても合うので楽。

ちなみに。
町の名前「円来」「炭州」は、エンライテンド と レジスタンス に由来しているので「えんらい」「たんす」と読むんだけど、私自身はかのゲームのプレイヤーではない。
Pythonの内部構造

今はPythonについて本を読んでるのですが、言語を習得する前にPythonしくみが面白かったので投稿してみました。

Pythonは一般的に「オブジェクト指向型スクリプト言語」？みたいな部類に分類されています。これはJavaのようなオブジェクト指向のプログラミング言語とPerlのようなスクリプト言語の中間を取っているらしく。記述はスクリプト言語のようにできるし、構造的にはオブジェクト指向のような機能も備えた言語らしいです。

この言語はC,C++,Javaのように実行する前にコンパイルする必要はないらしく、実行する度にファイルに書き換えが行われていれば自動的にソースコードをバイトコードに書き換えて、そのバイトコードをPVM（Python Virtual Machine）上で実行させます。PVMはバイトコードを上の行から最後の行までを順に実行していくだけの仮想機械なので、C言語のようにコンピューター自身が理解できるバイナリーに書き換える必要がなく、PVMがバイトコードを理解して実行してくれます。このような言語の仕組みをインタプリタといいます。

インタプリタの利点は言語のバージョンやコンピュターに左右されずにどのコンピューターでも一度バイトコードを作ってしまえばPVMで実行ができるという点です。C言語のようにコンピューターごとにソースコードをコンパイルして多くのステップを踏んでバイナリまで書き換える必要がないので汎用性があるのでしょう。たしかJavaもインタープリタを採用してるのでJavaに詳しい方は疑問に思う事はないと思います。欠点としてはバイナリまで書き換えず、仮想機械で走らせるため速度がCに比べると遅くなるという点らしいですが、これに関しては勉強不足なので深くまでは理解しきれていません。もしわかる方がいれば教えてください。

参考資料：初めてのPython　第３版　（発行元：オーライリージャパン）
[Qiita] ソースコード挿入時に番号付きリストのカウントアップがリセットされることを防ぐ方法

Qiitaの記事を書いている時、番号つきのリストの項目にソースコード入れると番号がリセットされてしまうことに困っている人も多いのではないでしょうか？
私もその一人でしたが、同様の問題が起きてしまうはてな記法における解決法で解決できそうなので、メモとして残しておきます。
（参考：[はてな記法で番号付きリスト中に改行する方法](http://d.hatena.ne.jp/masakanou/20080126/p3)）

# 対策なしの場合

## Markdown

何も考えず、番号付きのリストの項目にソースコードを入れた例です。
ソースコードの前に改行を入れる必要があるため、番号がリセットされてしまっています。

```
1. リスト1

本文1

\```c
#include <stdio.h>

int a = 60;
flota c = 80.0f;

int main()
{
    return 0;
}
\```

2. リスト2

本文2
```

## 結果

1. リスト1

本文1

```c
#include <stdio.h>

int a = 60;
flota c = 80.0f;

int main()
{
    return 0;
}
```

2. リスト2

本文2

# \<ol>要素を追加する

\<ol>要素を追加することで、番号付きリストを自分で作成することが出来ます。
ただしこの場合でも、ソースコード部分が正しくハイライトされない問題が残ります。

## Markdown

```
<ol><li>リスト1
本文1

\```c
#include <stdio.h>

int a = 60;
flota c = 80.0f;

int main()
{
    return 0;
}
\```

</li><li>リスト2

本文2

</li></ol>
```

## 結果

<ol><li>リスト1
本文1

```c
#include <stdio.h>

int a = 60;
flota c = 80.0f;

int main()
{
    return 0;
}
```

</li><li>リスト2

本文2

</li></ol>

# 対策後

ソースコードを正しくハイライトさせるためには、\<ol>要素の直前に文章が必要です。
文章を入力しない場合は全角スペースを追加します。

## Markdown

```
（ここに全角文字列を入れる。全角スペース１個でも良い）
<ol><li>リスト1
本文1

\```c
#include <stdio.h>

int a = 60;
flota c = 80.0f;

int main()
{
    return 0;
}
\```

</li><li>リスト2

本文2

</li></ol>
```


## 結果

（ここに全角文字列を入れる。全角スペース１個でも良い）
<ol><li>リスト1
本文1

```c
#include <stdio.h>

int a = 60;
flota c = 80.0f;

int main()
{
    return 0;
}
```

</li><li>リスト2

本文2

</li></ol>

# 最後に

番号付きリストの項目にソースコード入れた時に、番号付きリストのカウントアップがリセットされることを防ぐ方法を示しました。
問題は解消しましたが、あまり綺麗な解決法ではないのでもしかしたらもっと良い方法があるのかもしれません。

# 参考情報
* http://d.hatena.ne.jp/masakanou/20080126/p3
LaravelのEloquentを使う

Laravelは使わずに、ORMとして、Eloquentだけ使う方法を検討してみます

## ドキュメント
php5.3〜で使いたかったのでドキュメント的にはこちらを見ます

- 入門的なやつ  
http://laravel.com/docs/4.1/eloquent
- api document  
http://laravel.com/api/4.1/Illuminate/Database.html



ざっと日本語で調べると  
http://laravel3.kore1server.com/docs/database/eloquent


こちらのページが出てきたのですが、バージョンが３系なので、
`has_one`→`hasOne`とかメソッド名が変わっており、
そのままコピペして動かそうとすると動かないので注意です。



## composer でインストール
```sh
composer require "illuminate/database=~4.1"
```

※php5.3で使いたかったので、5.3対応している最新バージョン

## 実際に使う時にどうするか
https://github.com/mapyo/sample/tree/master/php/eloquent-sample

この辺に動くやつを作って置きました

#### シングルトン
https://github.com/mapyo/sample/blob/master/php/eloquent-sample/Model/Manager.php

#### シングルトンを使うやつ
https://github.com/mapyo/sample/blob/master/php/eloquent-sample/Model/Eloquent.php

#### サンプル
https://github.com/mapyo/sample/blob/master/php/eloquent-sample/sample.php

こんな感じで使えるようになりまっす。

```php
<?php
use Model\Eloquent;
use Model\User;

// composerのautoload設定
$loader = require('./vendor/autoload.php');
$loader->add('Model\\', __DIR__);

// 初期化処理
Eloquent::init();

$user = User::find(1);
var_dump($user->name);

$results = Eloquent::getConnection()
    ->select('select * from my_users');
var_dump($results[0]['name']);

$log = Eloquent::getConnection()->getQueryLog();
var_dump($log);
```

## 所感
めんどくさくなって雑にまとめたんだけど、ORM便利！！
もっといい書き方があればどなたか教えてください〜

動くものはこの辺に書いてます  
https://github.com/mapyo/sample/tree/master/php/eloquent-sample
Errbitに初めてPull Requestを送ったらmergeされたよ



## はじめに

意識高そうに書いてますが、OSSへのPull Requestと言っても小さなドキュメントです。
ただ、ドキュメンテーションにしても結局は熟練者のソースを読んだり、動作させてみたりしないとドキュメントも書けません。OSSへの貢献は、一連のワークフローの中にコードリーディングが組み込まれる事になるので、とても勉強になりました。

この投稿をみて「自分もOSSにPull Requestを送ってみよう」と、初めの一歩を踏み出される方がいれば、幸いです。

僕も初心者なので、引き続き精進したいと思います。

## 経緯

お仕事で[Errbit](https://github.com/errbit/errbit)を使い始めて、有料サービスと遜色ない機能に感動しました。
同時に、何故かとても優しい気持ちになり、このプロダクトにほんの少しだけ貢献する気持ちになりました。

[ここ](https://github.com/errbit/errbit/issues/479)を見る限り、1年くらいAPIのドキュメンテーションがほったらかしにされているようです。もったいないのでドキュメントを書いてみました。


## 変更箇所

https://github.com/errbit/errbit/pull/872

## Pull Request

![スクリーンショット 2015-04-19 0.07.36.png](https://qiita-image-store.s3.amazonaws.com/1489/34321/62ecd479-683d-0d01-8e6d-c5e08bea0bfb.png "スクリーンショット 2015-04-19 0.07.36.png")

![スクリーンショット 2015-04-19 11.38.38.png](https://qiita-image-store.s3.amazonaws.com/0/34321/0fc0e456-576e-452e-c99c-a0df20552d89.png)

## 思ったこと

絵文字入りのPull Requestとか送って怒られないか、ドキドキしました。。。
憧れのプロダクトに、自分の書いたドキュメントが取り込まれるのは素直に嬉しく思います。とても感動しました。
あと、英語はやっぱり難しいですね。

## 参考

- [Pull request templates make code review easier](https://quickleft.com/blog/pull-request-templates-make-code-review-easier/)
- [GithubでのOSSプロジェクト開発フロー](http://totutotu.hatenablog.com/entry/2015/04/04/Github%E3%81%A7%E3%81%AEOSS%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%8B%E7%99%BA%E3%83%95%E3%83%AD%E3%83%BC)
- [初めてのPull Requestを送りたいあなたへ](http://qiita.com/icoxfog417/items/3d23aa154b483ef611d3)
- [オープンソースプロジェクトで上手いことやってくための10の方法](http://qiita.com/vvakame/items/6dd8937806e5fab5b0b7)
Docker Windows Client を Cygwin で動かすと tty を enable にできない件

Docker Windows Client を Cygwin で動かすと 

```lang:
$ docker run -t -i ubuntu bash
time="2015-04-19T10:12:43+09:00" level=fatal msg="cannot enable tty mode on non tty input"
```

と怒られる。

これは、既に Github に Open Issue としてあがっていた。
["cannot enable tty mode on non tty input" in Cygwin in Windows #12469](https://github.com/docker/docker/issues/12469)

Cygwin の問題のようだ。

msysgit の bash か cmd.exe/PowerShell を使えばこの問題は発生しない。

Git\bin\bash.exe ならちゃんとコンテナ上の bash につながりました。

```lang:
bash.exe"-3.1$ docker run -t -i ubuntu bash
root@57d86023f148:/#
```

デタッチして、コンテナIDを確認

```lang:
root@57d86023f148:/# bash.exe"-3.1$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED
STATUS                   PORTS               NAMES
57d86023f148        ubuntu:latest       "bash"              12 minutes ago
Up 12 minutes                                pensive_ptolemy
8518a008a628        ubuntu:latest       "/bin/bash"         9 hours ago
Exited (0) 9 hours ago                       thirsty_elion
bash.exe"-3.1$
```

["cannot enable tty mode on non tty input" in Cygwin in Windows #12469](https://github.com/docker/docker/issues/12469)
を見る限り、"we'll probably need to add a hack to fix this behavior of Cygwin."ということで対応は検討中のようだが、しばらくは Docker Windows Clientを使うときには、Cygwin は使わない方が良いようだ。
winser を使って Hubot を自動起動する

# 前提

* Hubot を動かすサーバは Windows (Windows 7 で確認)
* Windows で Hubot が動かせている（そのうち記事にします）

# 概要

Let's Chat と同じく、npm の winser パッケージを使ってサービス化します。なんか --env オプションがうまく動かなかったり、引数が設定されないので、そこは手動で処理します。

# 手順

```
C:\Path\To\Hubot>npm install winser
C:\Path\To\Hubot>node_modules\.bin\winser -i --startcmd node
C:\Path\To\Hubot>node_modules\winser\bin\nssm.exe edit hubot
```

で、出てくる GUI で2つ調整をします。
なんか、nssm64.exeってのもいますが、64bit 環境でも nssm.exe を使いました。良く分かっていません。

## Arguments

winser に引数を渡してもうまくいかなかったのでこっちで。
Arguments の項目に引数を渡します。ポイントは Coffee の実行から渡すようにすることです。`C:\Users\<UserName>\AppData\Roaming\npm\node_modules\coffee-script\bin\coffee node_modules\hubot\bin\hubot -a lets-chat`

## Environment

右の端にあるタブの「Environment」に Let's Chat 関係の環境変数を設定します。

```
HUBOT_LCB_TOKEN=<TOKEN_STRING>
HUBOT_LCB_ROOMS=<ROOM_ID>,<ROOM_ID>,...
```

## おまじない

ちょっと PATH に自信がなかったので、一番左に戻って node のパスをフルパスにしておきます。

これでサービスとして Hubot が設定されました。
postfixで配信経路を指定

## main.cfでtransport_maps指定

```diff:/etc/postfix/main.cf
+ transport_maps = hash:/etc/postfix/transport
```

```bash:
/etc/init.d/postfix restart
```

## transportファイル

```bash:/etc/postfix/transport
myaddr@icloud.com smtp:192.168.100.4
icloud.com        smtp:mx1.mail.icloud.com

.mydomain.com     smtp:localhost
mydomain.com      smtp:localhost
```

```bash:設定反映
postmap transport
```

* myaddr@icloud.com にメールを送るときは 192.168.100.4 に配信
* *@icloud.com にメールを送るときは mx1.mail.icloud.com に配信
* *@*.mydomain.com にメールを送るときは localhost から配信
* *@mydomain.com にメールを送るときは localhost から配信
Chef初心者向け資料置き場


他者へのChef説明用資料置き場です。
概念から、導入背景、よく使う機能の説明をまとめています。

## 概念
以下で「Chefとは？」基礎的な概念と基礎的な動作を学びましょう。
 - [インフラストラクチャ自動化フレームワーク「Chef」の基本 (1/2)](http://goo.gl/4qzWjP)
 - [Chef を始める #1 – 概要、Chef Server を EC2 上にインストール、Workstation の設定まで ｜ Developers.IO](http://dev.classmethod.jp/server-side/chef-server-install/)

## 導入背景
なぜChefなどの自動化フレームワークが必要なのかを以下で学びましょう。
Immutable InfrastructureやInfrastructure as Codeを進めていく必要があり、
「インフラ構築の自動化」の技術も肝になります。

 - [大規模システム構築に求められる自動化とChefの基本的な考え方とは](http://goo.gl/FUaBw0)
 - [インフラ系技術の流れ](http://goo.gl/t5SGsy)
 - [「Immutable Infrastructure」 by 伊藤 直也氏 #jawsdays – JAWS DAYS 2014 参加レポート Vol.02](http://goo.gl/QGcyyf)
 - [今さら聞けない Immutable Infrastructure](http://goo.gl/NflZyI)

## 操作、設定方法
以下で基本的な操作、設定方法を学びましょう。
 - [サーバー設定ツール「Chef」の概要と基礎的な使い方 - さくらのナレッジ - Part 4](http://knowledge.sakura.ad.jp/tech/867/4/)

## ChefServer12について
ChefServer12の機能とインストールについては以下を参照ください。
 - [KDDI Cloud Blog ｜ Chef Server12をKCPS上に構築、活用方法を検証](http://cloudblog.kddi.com/devops/1755/)
 - http://docs.chef.io/server/install_server.html
Chefに関する最新情報はこちらが早いです。Chef英語サイトの和訳を載せられています。
 - [CL Lab « CREATIONLINE, INC.](http://www.creationline.com/lab)

## Recipeの書き方
以下にTipsとアンチパターンがいい感じにまとめられています。
 - [Chefレシピ逆引きメモ - Qiita](http://qiita.com/makoto_kw/items/53a84380559c087eb8fb)
recipeからtemplateに変数を渡す方法は以下を参考にさせていただきました。
 - [Chefのtemplateにrecipeからデータを渡すvariablesについて - Qiita](http://qiita.com/kenjiskywalker/items/c16afc2f8ac28765da91)
users cookbookについてはこちらを参考に構成させていただきました。
 - [Chef を始める #3 – ユーザ作成を自動化する 〜 Data Bags を使ってみる 〜 ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/chef-user-create-data-bags/)
Aurelia skelton-navigation の補足


Aureliaの[navigationスケルトンプロジェクト](https://github.com/aurelia/skeleton-navigation/releases)は[get started](https://github.com/aurelia/documentation/blob/master/Japanese/get-started.md)でも使われていますが、get startedでは説明されていないこともあるので、ここで紹介します。

対象となるskelton-navigationは、2015-4-18 時点のmasterです。

## 動かすまで

get startedの通りで動かないということはないです。つまづくとしたら、npmとjspmの周辺でしょう。

## ビルドコマンド

gulp の主要なタスクは下記の通りです。`build/tasks` フォルダにタスクごとにファイルが分けて配置してあります。

* watch - アプリケーションサーバを起動してアプリケーションが動く状態にします。ソースを変更すると自動でリロードしてくれます。
* serve - アプリケーションサーバの起動のみです。
* build - アプリケーションのビルドを行います。`src` 以下のjsファイルをbabelでコンパイルして `dist` に配置します。
* clean - distディレクトリ中のファイルを削除します。
* test - Karmaで `test/unit` 以下のテストを実行します。
* tdd - `test` と同じですが、常にソースを監視して、ソースが変更されたらKarmaを実行するようにします。
* e2e - SeleniumによるEnd to Endテストを実行します。`test/e2e/dist` というディレクトリに出力されます。
* prepare-release - ビルドを行い、リリース用にドキュメントを生成して、docディレクトリに配置します。

`e2e` を実行する前には、`watch`または`serve`で、アプリケーションサーバを起動しておく必要があります。

## get startedとの違い

get startedでは`index.html`と`src`フォルダを削除して、1から作成しますが、この手順で作成するソースと、元々あるソースには違いがあります。

元々のソースではanimatorプラグインを読み込んでいるため、スライドインのエフェクトがかかっています。
具体的にどこが違うかというと、`index.html` で、

```markup
  <body aurelia-app="animation-main">
```

のようにanimation-mainを読み込むように指定し、`src/animation-main.js` で

```javascript
export function configure(aurelia) {
  aurelia.use
    .standardConfiguration()
    .developmentLogging()
    .plugin('aurelia-animator-css');

  aurelia.start().then(a => a.setRoot('app', document.body));
}
```

のように、Aurelia自体の設定を行っています。`app.js` が呼ばれる前に、Aureliaの設定やプラグインの組み込みを行っています。
これはAurelia読み込み前の初期化にも応用できると思います。

ここで使っている`aurelia.use` のAPIはdocs.md でも説明されています。ただanimator プラグインがどのような挙動をするのかは、分かっていないので、後で調べてみようと思っています。
javaのクラス実行を別ディレクトリからする時のオプション

現在のディレクトリにhello.classがあるときは

```
$ java hello
Hello World!
```

でいけるけど、
一個前のディレクトリにある時に

```
$ java ../hello
```

ってすると

```
エラー: メイン・クラス...helloが見つからなかったかロードできませんでした
```

ってなる。
2分ハマってヘルプ見て解決

```
    -classpath <ディレクトリおよびzip/jarファイルのクラス検索パス>
                  クラス・ファイルを検索するディレクトリ、
                  JARアーカイブおよびZIPアーカイブの:で区切られたリストです。
```

これや！

```
$ java -classpath ../ hello
Hello World!
```

Qiitaに書くのが楽しい時期です。
Cmd.CombinedOutput()のerrorには何が返ってくるか

カブローン！
Qiita初投稿です。

Cmd.CombinedOutput()のerrorにはnilが返ってこないという話を耳にしたので、
何が返ってくるか検証してみました。

```go:cmd.go
package main

import (
        "fmt"
        "os/exec"
)

func main() {
	out, err := exec.Command("aaa", "-b").CombinedOutput()
	fmt.Println("----- non-existent command -----")
	fmt.Println(string(out))
	fmt.Println("----- error -----")
	fmt.Println(err)
	fmt.Println("----- end -----\n")

	out, err = exec.Command("cat", "not_found_text").CombinedOutput()
	fmt.Println("----- error command -----")
	fmt.Println(string(out))
	fmt.Println("----- error -----")
	fmt.Println(err)
	fmt.Println("----- end -----\n")

	out, err = exec.Command("cat", "text").CombinedOutput()
	fmt.Println("----- correct command -----")
	fmt.Println(string(out))
	fmt.Println("----- error -----")
	fmt.Println(err)
	fmt.Println("----- end -----")
}
```

catを使ったのでcatで読むファイルも作りました。

```text:text
text file!!!
text file!!!!
text file!!!!!
```

結果発表〜！

```
$ go run cmd.go 
----- non-existent command -----

----- error -----
exec: "aaa": executable file not found in $PATH
----- end -----

----- error command -----
cat: not_found_text: No such file or directory

----- error -----
exit status 1
----- end -----

----- correct command -----
text file!!!
text file!!!!
text file!!!!!
----- error -----
<nil>
----- end -----
```

**まとめ**
・存在しないコマンド
　　標準出力＆標準エラー出力無し
　　errorにコマンドが存在しないと返ってくる
・存在するコマンドのエラー
　　標準エラー出力にコマンドが投げたエラーが返ってくる
　　errorに終了ステータスが1だったことが返ってくる
・存在するコマンドの正常系
　　標準出力にコマンド結果が返ってくる
　　errorはnil

結果的に正常なコマンドを投げればerrorはnilが返って来ることがわかりました。
errorがnilかどうかで標準出力か標準エラー出力かを判断すればいい感じですかね。
(またはCmd.StdinPipe()、Cmd.StdoutPipe()、Cmd.StderrPipe()あたりを駆使すればもっといいかも。時間あったら検証したい。)

Qiita初投稿でした。
こんなんでいいでしょうか？
与えられた文字列を加工して返すgulp/browserifyのテンプレート


[mizchi/gulp-reiny](https://github.com/mizchi/gulp-reiny "mizchi/gulp-reiny") と[mizchi/reinify](https://github.com/mizchi/reinify "mizchi/reinify") を作った時のメモ。コンパイラを作った。文字列を加工して返したい。それだけ。

`compile = (foo) -> foo` みたいな関数があるとして、その結果をラップしたいだけのものを作るとき、どうなるか。

## gulp

```coffee
through = require 'through2'
replaceExt = require 'replace-ext'
compile = (text) -> text

module.exports = (opt) ->
  stream = through.obj (file, enc, callback) ->
    if file.isNull()
      @push(file)
      return callback()
    else if file.isBuffer()
      file.contents = new Buffer compile(file.contents.toString())
      file.path = replaceExt(file.path, '.js')
      @push(file)
      return callback()
    else if file.isStream()
      throw new Error('Streams are not supported')
    return callback()
  return stream
```

## browserify

```coffee
through = require('through')
compile = (text) -> text

module.exports = (file) ->
  inputString = ''
  write = (buf) -> inputString += buf
  end = ->
    @queue(compile(inputString))
    this.queue(null)
  return through(write, end)
```
NetBeansでgitプロジェクトをインポート

# はじめに
Eclipseから乗り換えたときの疑問。

NetBeansでは「チーム→Git→クローン」の手順で資材をローカルへクローンすることができるが、プロジェクトをインポートする方法が分かりづらい。

本記事ではgitプロジェクトをインポートするまでの手順を記載。

# 手順
1. クローン。NetBeansの「チーム→Git→クローン」や、ターミナルの「$ git clone xxxxxx.git」によりクローン。
2. フォルダの取込。クローンしたディレクトリをエクスプローラーで確認し、そこからドラッグ＆ドロップでNetBeansへ持っていく。
3. プロジェクト作成。NetBeans上で対象ディレクトリを右クリック→「フォルダのプロジェクトを開く」。

Eclipseのようにディレクトリツリーで保持したければ「ツール→お気に入りに追加」で良い。
PM2 で hubot を常時起動する＠Windows

# メモ

なかなかうまくいかなかったがようやく動かせたのでまずはメモ程度に

## うまくいかなかった原因

<hubot dir>\node_modules\hubot\bin\hubot という CoffeeScript を動かせば良いのだが、coffee の spawn に失敗する

## 解決法

PM2 には Node.exe を起動してもらって、

coffe-script の coffee という名前のJavascriptに hubot の CoffeeScript を引数で渡して起動する

具体的には
```
C:\Hubot>pm2 start --name hubot C:\Users\<username>\AppData\Roaming\npm\node_modules\coffee-script\bin\coffee -- node_modules\hubot\bin\hubot -a lets-chat
```
とすれば良いみたい。

## TODO

再起動して様子を見る

【2015/4/19追記】
サービスにならないので、やっぱり winser を使ってサービス化する
CMake + OpenCL

CMake 3.1 より、OpenCL の include path 及び library path を探索してくれる FindOpenCL.cmake が追加されました。
今回は CMake を使って Makefile を生成し OpenCL プログラムを作成してみます。

# 環境 #
|            |                      |
|------------|---------------------:|
|         OS |      Windows 7 64bit |
|        GPU | nVidia GeForce 750Ti |
|      CMake |                3.2.2 |
|  コンパイラ |   Visual Studio 2013 |

# FindOpenCL.cmake について #
OpenCL のライブラリを探すにあたって、何かしら環境変数などで探索先を指定していると予想できます。とりあえず FindOpenCL.cmake を読んでみましょう。

```cmake:
find_path(OpenCL_INCLUDE_DIR
  NAMES
    CL/cl.h OpenCL/cl.h
  PATHS
    ENV "PROGRAMFILES(X86)"
    ENV AMDAPPSDKROOT
    ENV INTELOCLSDKROOT
    ENV NVSDKCOMPUTE_ROOT
    ENV CUDA_PATH
    ENV ATISTREAMSDKROOT
  PATH_SUFFIXES
    include
    OpenCL/common/inc
    "AMD APP/include")
```

上記のようにベンダー別の環境変数を参照しているようです。今回は nVidia 環境ですので ```NVSDKCOMPUTE_ROOT``` もしくは```CUDA_PATH``` を設定すれば良いことが判ります。
FindOpenCL.cmake は結果として

- OpenCL_FOUND
- OpenCL_INCLUDE_DIRS
- OpenCL_LIBRARIES
- OpenCL_VERSION_STRING
- OpenCL_VERSION_MAJOR
- OpenCL_VERSION_MINOR

を定義します。よって CMakeLists.txt 以下のように利用すれば OK です。

```cmake:
find_package(OpenCL REQUIRED)
include_directories(${OpenCL_INCLUDE_DIRS})
add_executable(opencl_app src.cpp)
target_link_libraries(opencl_app ${OpenCL_LIBRARIES})
```

# 実際にアプリケーションを作る #

使用したコードは次のような単に platform と device を取得するだけのものです。

```c++:main.cpp
#include <CL/cl.h>
#include <iostream>

int main(){
    cl_uint num_platforms;
    cl_platform_id platforms;
    cl_int ret = clGetPlatformIDs(1, &platforms, &num_platforms);
    if (ret != CL_SUCCESS){
	std::cerr << "Error: Can't get platform ids" << std::endl;
	return -1;
    }

    cl_device_id dev;
    cl_uint num_devices;
    ret = clGetDeviceIDs(platforms, CL_DEVICE_TYPE_GPU, 1, &dev, &num_devices);
    if (ret != CL_SUCCESS){
	std::cerr << "Error: Can't get device ids" << std::endl;
	return -1;
    }
    return 0;
}
```

そして次の CMakeLists.txt を利用して Visual Studio の sln を生成します。

```cmake:
cmake_minimum_required(VERSION 3.1)

find_package(OpenCL REQUIRED)

include_directories(${OpenCL_INCLUDE_DIRS})
add_executable(opencl_test main.cpp)
target_link_libraries(opencl_test ${OpenCL_LIBRARIES})
```

後は GUI なり コンソールから CMake を実行すれば OK です。

# まとめ #

CMake を使って OpenCL を用いたアプリケーションをビルドしてみました。今回は特に GPU を用いた演算などは行いませんでしたが、OpenCL_VERSION_STRING を用いることで、環境に応じて用いる kernel のソースコード を変更するなど、より柔軟にアプリケーションの開発が可能と考えられます。
個人的には、見つかったライブラリのベンダーなども定義して返してくれると、環境依存のコードを #ifdef で分けるなどしやすいかなと思います。
(OpenCL_LIBRARIES から類推することは可能ですが)
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」文字をグラフィックで表示する

# 文字をグラフィックで表示する
**enchant.js**と、**tmlib.js**には「LABEL」という文字を表示させるスプライトが用意されています。
しかし、**enchant.js**のLABELを使うとXPERIA AやGalaxy Sシリーズなどで不具合が起こります。
Galaxyでは表示がおかしくなるだけ（それでも困るのですが）ですが、XPERIA Aは標準ブラウザが落ちます。
これでは文字列表示を使うことが出来ません。
ですので、ASCIIで定義されている127文字だけですが、グラフィックで表示する機能を用意しています。

```coffeescript
    stringobj = dispImageStrings
        x: x座標
        y: y座標
        size: 0.5
        color: 'white'
        scene: GAMESCENE_SUB2
        opacity: 0.8
        labeltext: 'hogehoge'
```
上記のように呼ぶと、指定した座標に「hogehoge」と表示されます。
これを使って英数字であればXPERIA Aの標準ブラウザでも、落ちずに動かすことが出来ます。
この関数が返すのは「type:CONTROL」のオブジェクトになるので、

```coffeescript
    removeObject(stringobj)
```
とやることで画面から削除することが出来ます。

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
初心者のためのポインタ講座　～ポインタって結局なんの役に立つの？～

初心者が初心者なりに、ポインタについて学習したことをまとめてみます。
間違っていたらツッコミを入れてあげてください。

# はじめに
私は専門が「[ActiveBasic](http://www.activebasic.com/)」という言語なので、サンプルはそれで表記させていただきます。
が、C言語を参考に作られている言語でもあるため、Cへの修正は容易です。
もし、「プログラミングを勉強したいけど、何にしようかな…？」と悩んでいる方がいらっしゃいましたら、ぜひぜひActiveBasic（以降、ABとも表記）を始めてみてください！化石言語とか言わずに！！

また、サンプルでたまにCも書いてますが、実行などでの検証は行っておりません。
あしからず。

# そもそもポインタとは？
諸説通り、メモリのアドレスという説明がやはり正解なのでしょうが、それではわかりにくい！！
なので私は「*動的な配列*」と説明しようと思います。
もちろん、メモリのアドレスという説明が正解ですが、おそらく「動的な配列」という表現のほうがとっつきやすくなると思います。
なので、あえてこれで説明しようと思います。

# 配列を動的に作成する！？
例えば配列変数を定義する際に、

```lang:ActiveBasic
Dim a As Long
a = 100
Dim array[a] As Long
```
とやると、「アホか！」と怒られます。
Cだと、

```lang:C
long a;
a = 100;
long array[a];
```
かな？

ではどうやって、配列を好きなだけ定義するか。
ここで、ポインタを使います。

```lang:ActiveBasic
Dim array As *Long		'*[型]でポインタを表す（C言語も一緒）
Dim num As Long

'5つ分のLong型の配列を定義
array = malloc(SizeOf(Long)*5)

'それぞれに値を代入。もちろんForやWhileなどのループで代入してもOK
array[0] = 0
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 4

'中身の確認！
For num = 0 To 4
	MessageBox(0, Str$(array[num]), "", 0)
Next

'確保した配列用のメモリを開放（mallocやcallocを使うと、必ずfreeをしないといけない）
free(array)
```
Cだとこう？

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

/* メイン関数 */
int main(){
	long *array;	//Cでは、変数名の前に「*」をつけるとポインタになる
	long num;
	
	//5つ分のLong型の配列を定義
	array = malloc(sizeof(long)*5);
	
	//それぞれに値を代入。もちろんforやwhileなどのループで代入してもOK
	array[0] = 0;
	array[1] = 1;
	array[2] = 2;
	array[3] = 3;
	array[4] = 4;
	
	//中身の確認！
	for (num=0; num<5; num++){
		printf("%ld\n",array[num]);
	}
	
	//確保した配列用のメモリを開放（mallocやcallocを使うと、必ずfreeをしないといけない）
	free(array);
}
```

今回は、Long型の変数を5個用意してみました。
ざっくり利用している関数の説明をば。

* malloc関数（またはcalloc関数）：ポインタ用にメモリを指定した数だけ確保します
* sizeof関数：変数の型（今回だとLong型）が使うメモリ数を返します
* free関数：mallocまたはcallocで確保したメモリを開放します

このような流れになります。


# 結局ポインタって
動的に配列を作成できるのは、あくまでポインタの一部分の能力であり、全てではありません。
ですが、おそらくよく使うテクニックの一つではあると思います。
私はこのテクニックを知り、ポインタへの理解がぐぐぐっと深まりました。

結局ポインタとは、既存の型を利用して、その分のメモリを確保し、その「場所」の情報を持っているわけですね。

500MBのテキストデータを読み込みたい！
↓
Byte型（1つ1文字）で500MB分メモリを確保！
↓
じゃあ、その場所は「1020」ね！

の「1020」のようなアドレスをポインタ変数は持っているわけです。

様々な参考サイト様がありますが、私は[http://effy.ldw.jp/c/pointer2.html](http://effy.ldw.jp/c/pointer2.html)様が一番好みでした。
もちろん人それぞれの好みですので、あくまで参考程度に。

では、今回はこのへんで。
MongoでGroup化したときに、Group化に使うフィールド以外のフィールドを参照する方法


## 前提
pagesというcollectionに以下のdocumentが格納されているとする。titleが重複しているものを取り除いて、titleとurlを取得したい（取得するurlはなんでもいいとする)

```javascript:pages
{
  title: "a",
  url: "http://www.a.com"
},
{
  title: "a",
  url: "http://www.b.com"
}
```

## group化

_idに指定したものでgroup化される。

```javascript:mongo
db.pages.aggregate([
  {
    $group: {
      _id: "$title",
      title : { $first: '$title' },
      url: {$first: "$url"}
    }
  }
])
```


```sql:対応するsql
SELECT title AS _id, title, url FROM pages GROUP BY title;
```

## 結果

```javascript:document例
{
  title: "a",
  url: "http://www.a.com"
}
```

## 確認のためにcountを見る

```javascript:mongo
db.pages.aggregate([
  {
    $group: {
      _id: "$title",
      name : { $first: '$title' },
      url: {$first: "$url"},
      count: { $sum: 1 }
    }
  },
  { $match: { count: { $gt: 1 } } }
])
```

```sql:対応するsql
SELECT title AS _id, title, url, count(1) FROM pages GROUP BY title HAVING count(1) > 1;
```

```javascript:結果
{
  title: "a",
  url: "http://www.a.com",
  count: 2
}
```
SwiftとJavascriptの通信

UIWebViewのJavascriptとSwiftの相互のやり取りについて調べてみた。[WKWebView](http://qiita.com/ShingoFukuyama/items/eede79a284c3669846e9)を使えばスマートに出来そうだけど、ios7で使いたかったので、WKWebViewを使わない方向で実装してみました。

ライブラリ（というほど大層なものではないですが）にしたので参考までにどうぞ。
https://github.com/gomo/JsNoty

PullToRefreshでAjaxを読み込みたい場合などに活躍すると思います。

## SwiftからJavascriptへ

これは単純に`stringByEvaluatingJavaScriptFromString`でイベントをfireしてあげればいけますね。

```swift
let script = String(format: "document.dispatchEvent(new CustomEvent(\"%@\", {detail:%@}))", name, "{foo:\"bar\"}");
```

データを渡したい時は`{detail:%@}`というキーに入れるとJS側で取得できます。jQueryを使ってる時は`event. originalEvent.detail`になるのでそこを探してください。

## JavascriptからSwiftへ

これは適当はprotocolでページをロードし、`UIWebViewDelegate::shouldStartLoadWithRequest`で捕まえるのが一般的なようです。

Javascript側からは

```js
location.href = 'jsnoty://foobar/';
```

Swift側では

```swift
class ViewController: UIViewController, UIWebViewDelegate, JsNotyDelegate {
    private var jsNoty:JsNoty!;
    override func viewDidLoad() {
        super.viewDidLoad()

        self.jsNoty = JsNoty(webView: self.webView)
        self.jsNoty.delegate = self

        let url = NSURL(string: "http://www.expample.com/path/to/page.html")
        let request = NSURLRequest(URL: url!)
        self.webView.loadRequest(request)
    }

    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        if(request.URL!.scheme == "jsnoty"){
            //ここで何かする
            return false;
        }

        return true
    }
```

気をつけないといけないのは`window.onload`の中で呼ばないと、`jsnoty://foobar/`が出ちゃいます。Chromeではページが読み込まれた後だと、存在しないprotocalの場合ページ遷移をしないようですが、ブラウザの互換を調べてないので、UIWebViewからのアクセス以外はしない方がいいかもしれません。

もう1点、Swift側で受信してから次を呼ばないと認識できないっぽいです。なのでJsNotyではキューイングして、Swift側の処理をまって次を呼ぶようにしました。自分で実装するとここがちょっと面倒かも。

ちなみに、iosからの接続時にUserAgentを書き換える方法も書いておきます。この3つを組み合わせれば、UIWebViewとWebページとの連携は大抵のことが出来ると思います。

UserAgentの書き換えは、最初の送信の前にやらないとダメなようです。なので`AppDelegate`でやるようです。

```swift
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        //UserAgentを上書き
        let webView:UIWebView = UIWebView()
        let userAgent:String! = webView.stringByEvaluatingJavaScriptFromString("navigator.userAgent")
        let customUserAgent:String = userAgent.stringByAppendingString(" from.ios.UIWebView")
        
        let dic:NSDictionary = ["UserAgent":customUserAgent]
        NSUserDefaults.standardUserDefaults().registerDefaults(dic as [NSObject : AnyObject])
        
        return true
    }
```
Mongoで同じdocumentの違うfieldでdocumentを更新する方法


## 前提
flowersというcollectionに以下のdocumentが格納されているとする。名前が空文字だった場合に、japanese_nameをいれたい

```javascript:document例
{
  name: "",
  japanese_name: "ヒヤシンス"
}
```

## 更新

update関数の第一引数が条件文だが、自分自身のdocumentを参照する必要があるので、findしてからupdateする

```javascript:
db.flowers.find({name: ""}).forEach(
  function(elem){
    db.flowers.update({_id: elem._id}, {$set: {name: elem.japanese_name}})
  }
)
```

対応するSQLは

```sql:対応するsql
UPDATE flowers SET name=japanese_name WHERE name = "";
```

## 結果

```javascript:document例
{
  name: "ヒヤシンス",
  japanese_name: "ヒヤシンス"
}
```