OmniAICreator/Qiita-1.07M huggingface dataset:
【iOS開発】Digitsで無料のSMS認証を試しんぐ

<h1>Digits</h1>
<p>Digitsは無料でSMS認証ができるフレームワークで、Twitter社が公開した<a href="https://dev.twitter.com/products/fabric">Fabric</a>というフレームワーク郡の一部です。今回はこれを試しんぐ。</p>
<p><a href="https://dev.twitter.com/products/fabric">Fabric</a>のSDKは現在(2014/11/14)、限られた人数にしか公開されておらず、使うためには順番待ちする必要があります・・・
<font color="#808080" size=2>(筆者は１週間位待ちましたが、順番が来なかったので問い合わせのメールを何通か送ったら順番が回ってきました。)</font></p>
<h3>下準備</h3>
<p><a href="https://dev.twitter.com/products/fabric">Fabric</a>にログインし、<a href="https://dev.twitter.com/products/fabric">Fabric</a>の<a href="https://fabric.io/downloads">クライアントアプリケーション</a>をインストールしましょう。クライアントを使ってXcodeプロジェクトに簡単に各フレームワークを組み込めるので大変便利です。</p>
<h3>組み込みのボタンクラスを使う</h3>

```objc
#import <TwitterKit/TwitterKit.h>
.
.
.
    DGTAuthenticateButton *authenticateButton = [DGTAuthenticateButton buttonWithAuthenticationCompletion:^(DGTSession *session, NSError *error) {
        // 認証のコールバック。errorに何か入ってたり、sessionがnilだったらエラーハンドリングしましょう。
    }];
    authenticateButton.center = self.view.center;
    [self.view addSubview:authenticateButton];
```

<p>最短で、この組み込みのボタンを設置するだけでSMS認証を実装できます。。。すばらしい。DGTSessionクラスから電話番号やユーザーID、トークンなどが取得できます。</p>
<h3>コードから認証機能を呼び出す</h3>

```objc
#import <TwitterKit/TwitterKit.h>
.
.
.
//一番シンプルなパターン。ただ認証のUIを呼び出すだけ
    [[Digits sharedInstance] authenticateWithCompletion:^(DGTSession *session, NSError *error){
        //認証のコールバック
    }];
//認証のUIを呼び出しつつ、そのタイトルだけ変えたいとき
    [[Digits sharedInstance] authenticateWithTitle:<任意のタイトル> completion:^(DGTSession *session, NSError *error){
            //認証のコールバック
    }];
//認証のモーダルビューを表示するViewControllerを指定したいとき
    [[Digits sharedInstance] authenticateWithViewController:<任意のコントローラ> title:<任意のタイトル> completion:^(DGTSession *session, NSError *error){
        //認証のコールバック
    }];
```
<font color="#808080" size=2>※シミュレーターでは言語設定を日本語にしても、組み込みのUIが英語表示されるのですが、実機ではちゃんと日本語で表示されました。</font>
<p>参考</br>
<a href="https://dev.twitter.com/twitter-kit/ios-reference">https://dev.twitter.com/twitter-kit/ios-reference</a></p>
</br>
</br>
</br>
<p><a href="http://blog.valeur3.com/?p=1632">ブログもみてね☆</a></p>
Sketch 3の痒いところに手が届くおすすめplugin集

#はじめに
Sketchってすごいですよね〜！Photoshopみたいにスライス大変じゃないし、スマホのUIKitも最初からある程度入ってるのでプロトタイピングには最適です。でもそんなSketchでも痒いところは何点かあります。
そんな痒みを止めてくれるプラグインを紹介していきたいと思います！

#とりあえず
##sketchToolboxをダウンロード＆インストール
http://sketchtoolbox.com/
こちらからダウンロード。こいつがあると他のｐluginのインストールが楽チンです

でもこの中にないものもあるので（今んとこあんまない笑）
##Sketch App Sources
このサイトはたくさんのSketchの素材やpluginが配布されているので是非ご活用を！
http://www.sketchappsources.com/

#plugin
いよいよプラグインです
##Save Page to PNG
https://github.com/joshpuckett/SketchPlugins
このプラグインはsketchの作業ページをpngで同じ階層に吐き出してくれるというもの。
取引先がSketchをもっていない場合でもこのpngを渡せばアプリやページの全貌も簡単に共有できます！

#素材集
おすすめの素材も紹介しておきます！


これからもどんどん追加していきます！
express4系のルーティング/リクエストについて

##express4系でのリクエストバインド
 どこに書けばいいか分からないので、とりあえず/routes/hoge.jsを作成してその中に書く。

```js:index.js
var express = require('express');
var router = express.Router();
// GET users listing. 
module.exports = {
    form : function (req, res)  {                         
          res.render('form',{ title: 'Hello express'});  //ejsファイル呼び出し
    },
    check : function (req, res) {
        res.render('check',{ title: 'Hello express'});  //ejsファイル呼び出し
    }
};
```
　
　app.jsの中にリクエストに対するルートを書く。localhost:port/、localhost:port/form、localhost:port/checkで、hoge.jsの処理を実行する。(この場合ただの画面遷移)

```js:app.js
{省略}

var routes = require('./routes/index');
var hoge = require('./routes/hoge');

{省略}

app.get('/',routes);
app.get('/form',hoge.form);
app.post('/check',hoge.check);

{省略}
```

　次は、ejsファイルにボタンとかつけて、ボタン押したら画面遷移とかしてみる。
　DBにデータ放り込んだり、出したりもしてみる。
EC2リザーブドインスタンス変更についての備忘録

EC2のRIを検討していて、よくわからなかったので調べた。

http://aws.amazon.com/jp/ec2/purchasing-options/reserved-instances/

>ニーズが変化した場合、リザーブドインスタンスを同一リージョン内の他のアベイラビリティーゾーンに移行したり、ネットワークプラットフォームを変更したりすることもできます。また、Linux/UNIX RI であれば、リザーブドインスタンスタイプを同一インスタンスファミリー内の別のタイプに変更することも可能です。どの場合も、追加料金は必要ありません。

## ファミリーとは？
t2とかm3とかドットの前についている記号のこと。
例）
　t2ファミリー
　　t2.micro
　　t2.small
　　t2.medium

## インスタンスには容量の係数がある
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ri-modification-instancemove.html#ri-modification-instancenormalization

>|インスタンスサイズ|正規化係数|
|:-----------|------------:|
|micro|0.5|
|small|1|
|medium|2|
|large|4|
|xlarge|8|
|2xlarge|16|
|4xlarge|32|
|8xlarge|64|

## 分割する場合
### Before
m3.2xlargeをRI（係数１６）

### After
m3.medium × 8台（係数2*8=16)

## 結合する場合
### Before
m3.medium × 8台分RI（係数2*8=16)

### After
m3.2xlargeにm3.medium８台分のRIを割り当て（係数１６）

## 変更後の月額料金について
変更後のインスタンスタイプのRI料金が適用される。

## 結合時の注意点
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ri-modifying.html
>リザーブドインスタンスを結合するときは、リザーブドインスタンスの終了日における 24 時間形式での時間の桁が同じである必要がありますが、分または秒の桁が同じである必要はありません。つまり、同じ日の 13:01 と 13:59 に終了するリザーブドインスタンスは結合できますが、12:59 と 13:01 に終了するリザーブドインスタンスは結合できません。
Rails の development mode が裏でやっていること

自社製 Rails アプリケーションをカスタマイズしすぎて遅くなったので、すべてのSQLを精査して何が遅いのか調べていました。その時、Rails の development mode が色々なことをやっているのがわかったので、メモしておきます。そもそも、development モードはシステムの応答速度を調べるのには向かない、というだけの話ですが…。

## EXPLAIN について
　PostgreSQL では、SQL の計算に際して DBMS がどのようなアルゴリズムを選択したか、各 JOIN 句にどの程度の負担があるか等を表示する EXPLAIN というコマンド（標準SQLにはない）があります。 ( https://www.postgresql.jp/document/9.1/html/using-explain.html ) 使い方は簡単で、調べたい SQL の頭に EXPLAIN とつけるだけで実行できます。しかし、これを読み解くのは難しいです。cost が増えている個所を見るくらいのことしかできませんでした。あとは、INDEX がきいているかどうか、くらいはわかるかもしれません。


## Rails が自動で行う EXPLAIN について
　Rails の development mode だと一定時間（デフォルトでは0.5秒）を越えた SQL に対して rails が自動的に EXPLAIN を行います。EXPLAIN には通常のSQLの数倍の時間が掛かるので、EXPLAIN の計算自体がレスポンスを悪くしていることがあります。応答速度を調べたいときには condig/environments/development.rb の下記の行をコメントアウトしておけば EXPLAIN は行われません。

```ruby
config.active_record.auto_explain_threshold_in_seconds = 0.5
```

## Rails が自動で行う奇妙な SQL について
　これも Rails の development mode の話です。上記とは別に、モデルへの初回アクセスの際に奇妙な SQL が発行されていることがあります。たとえば、下のようなものです。

```sql
            SELECT COUNT(*)
            FROM pg_class c
            LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind in ('v','r')
            AND c.relname = 'users'
            AND n.nspname = ANY (current_schemas(false))
```

```sql
           SELECT a.attname, format_type(a.atttypid, a.atttypmod),
                     pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
              FROM pg_attribute a LEFT JOIN pg_attrdef d
                ON a.attrelid = d.adrelid AND a.attnum = d.adnum
             WHERE a.attrelid = '"users"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum
```

これらは Rails が自動的に発行している SQL で、rake db:migrate が適切に行われているかを検査するためのものようです。( http://stackoverflow.com/questions/17180642/what-are-these-two-strange-queries-that-keep-running-on-every-request ) この SQL は、あらゆるモデルに対して一回ずつ発行されるため、特定の計算結果が遅くなったりすることがあります。モデルのソースコードを書き換えたりして、リロードが行われた時に呼ばれるようですが、そうではない時も呼ばれたような気がします。なので、時間を測ろうと思ってもブレが出てしまって大変でした。
パーソナル・クラウド・コンピューティング Urbit まとめ


1970年代からの全ての技術を捨てて、完全に新しく作っているソフトウェア Urbitのまとめ

新しすぎてHacker Newsでもわけわからない人続出な感じです。

## Urbitとは何か?

1970年代からのシステム・ソフトウェアに飽きたので、スクラッチで自分達で書いた (by 公式ドキュメント)

## コンセプト

グローバルなファイルシステムを統合されたグルーバルなコンピュータ

* ネットワーク上の物理的なハードウェア: ship
* Shipは、キャリア(一番大きい。256のみ存在)からサブマリーン(最小。無限に存在)まである
* Ship は、ローカルでの計算に利用される
* 他のshipに暗号化されたメッセージを送受信する


## システム

以下が一から書かれている

* Nock: 最小限のバーチャルマシン
* Hoon: 型関数言語
* Arvo: イベント・ドリブンなサーバOS(libuvを利用)
* Clay: Arvoの機能: セキュアで参照付き透過なDecentrizedファイルシステム


## 参考

* 公式サイト [Urbit](http://urbit.org/ "Urbit")
* 公式サイトのドキュメント [Urbit · Personal Cloud Computing](http://doc.urbit.org/ "Urbit · Personal Cloud Computing")
* 詳細ドキュメント[Documentation · Urbit](http://doc.urbit.org/doc/ "Documentation · Urbit")
* Hacker News [Urbit: a personal cloud computer | Hacker News](https://news.ycombinator.com/item?id=8578151 "Urbit: a personal cloud computer | Hacker News")
* 簡単な紹介記事 [Sensemaking: A Brief Introduction to Urbit](http://alexkrupp.typepad.com/sensemaking/2013/12/a-brief-introduction-to-urbit.html "Sensemaking: A Brief Introduction to Urbit")
* GitHub [urbit/urbit](https://github.com/urbit/urbit "urbit/urbit")
grunt-contrib-copyでフォルダを除外する


以下のフォルダ構成で「hogehoge」フォルダをコピーしない用のGruntfile.jsが

```フォルダ構成
src/
├── controller
│   └── Common.ts
├── hogehoge
│   ├── en.po
│   └── ja.po
├── model
│   └── User.ts
└── view
    ├── Top.html
    └── Sample.html
```

これです↓


```js:Gruntfile.js
"use strict";

module.exports = function (grunt) {
  grunt.initConfig({
        copy: {
          main: {
            expand: true,
            src: ['**/*',  '!**/hogehoge/**'],
            cwd: 'src',
            dest: 'release/src',
          }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-copy');


  grunt.registerTask('default', ['copy']);
};
```
Rails4へTwitter BootStrapの適用方法


bundleインストールを、そのアプリに対して行いたいので、事前準備とかしていますが、
特にその必要がないのであれば、本とかよく書いてる方法で問題ないです。

## 事前準備
### ディレクトリの作成
Railsアプリ用のディレクトリ（例：silky）を作成し、Gemfileだけを作成します。

```
$ mkdir test1
$ cd test1
$ bundle init
``` 

### Gemfileの編集
```
$ vi Gemfile
```
以下は必須となります。

 * gem 'therubyracer', platforms: :ruby（有効化）
 * gem 'less-rails' （追記）
 * gem 'twitter-bootstrap-rails'（追記）


```Gemfile
source 'https://rubygems.org'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.1.7'

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.0'

# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'

# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'

# See https://github.com/sstephenson/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'

# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'

# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'

group :doc do
  # bundle exec rake doc:rails generates the API under doc/api.
  gem 'sdoc', require: false
end

# BootStarpで追加。
gem 'less-rails'
gem 'twitter-bootstrap-rails'

# Google Maps for Rails
gem 'gmaps4rails'
gem "geocoder"

# Use ActiveModel has_secure_password
# gem 'bcrypt-ruby', '~> 3.1.2'

# Use unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano', group: :development

# Use debugger
# gem 'debugger', group: [:development, :test]
```

bundle installを実行する。

```
$ bundle install --path vendor/bundle
```

### Railsアプリを準備する

```
$ bundle exec rails new . -T
```

GemfileはOverwriteしたくないので（ｎ）を選択する。

### BootStrapのインストール

```StyleSheetをlessで導入したい場合
$ bundle exec rails generate bootstrap:install less
```

```StyleSheetをcssで導入したい場合
$ bundle exec rails generate bootstrap:install static
```

### BootStrapをapplication.html.erbに適用する。
```
$ bundle exec rails g bootstrap:layout
```
layoutは指定可能だが、省略するとapp/views/layouts/application.html.erbに適用する。

### テスト用にscaffoldする。
```
$ bundle exec rails g scaffold Post title:string description:text
$ bundle exec rake db:migrate
```

### scaffoldで作成されたviewにBootStrapを適用する。
```
$ bundle exec rails g bootstrap:themed Posts -f
```

### 起動して確認する。
```
$ bundle exec rails s
```

### ナビゲーションバーのかぶりを修正する。
最終行に追加する。

```app/assets/stylesheets/bootstrap_and_overrides.css.less
/* universal */
html { overflow-y: scroll; }
body { padding-top: 60px; }
section { overflow: auto; }
textarea { resize: vertical; }
.center { text-align: center; }
.center h1 { margin-bottom: 10px; }
```

### Webrickを一度止めて、もう一度起動して確認する。
```
$ bundle exec rails s
```
gulpでSass/Compass


gulpを使ってSass/Compassをはしらせたいと思います。

タスクの流れは、
scssファイルの監視 > cssファイル書き出し > ブラウザリロード

※ ライブリロードは、[こちら](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei)のChromeエクステンションを使用しています。

## 使うプラグイン

* gulp-compass
* gulp-watch
* gulp-livereload


## ディレクトリ構造

```
├── config.rb
├── css
│   └── style.css
├── gulpfile.js
├── package.json
└── scss
    └── style.scss
```


## package.jsonの作成

```json:package.json
{
  "name": "gulp-test",
  "version": "1.0.0",
  "description": "gulp test",
  "main": "gulpfile.js",
  "author": "rayfields",
  "license": "MIT",
  "devDependencies": {
    "gulp": "~3.8.10",
    "gulp-compass": "~2.0.1",
    "gulp-watch": "~1.1.0",
    "gulp-livereload": "2.1.1"
  }
}

```

プラグインをインストール

```bash
$ sudo npm install
```

## タスクの記述

gulpで実行したいタスクを記述します。
ファイル名は`gulpfile.js`です。

```js:gulpfile.js
'use strict';

var gulp 		= require('gulp');
var compass 	= require('gulp-compass');
var livereload	= require('gulp-livereload');

var SCSS_FILE 	= './scss/**/*.scss';


/*
 * Compass
 */
gulp.task('compass',function(){
    gulp.src([SCSS_FILE])
        .pipe(compass({
            config_file : 'config.rb',
            comments : false,
            css : 'css/',
            sass: 'scss/'
        }))
        .pipe(livereload());
});


/*
 * Watch
 */
gulp.task('watch',function(){
    gulp.watch(SCSS_FILE, function(event){
        gulp.run('compass');
    });
});

gulp.task('default', ['watch']);

```

gulpを実行！

```bash
$ gulp

# scssファイルを保存すると以下のようにログが表示されます

[15:56:01] Using gulpfile ~/***/gulpfile.js
[15:56:01] Starting 'watch'...
[15:56:01] Finished 'watch' after 8.83 ms
[15:56:01] Starting 'default'...
[15:56:01] Finished 'default' after 7.64 μs
gulp.run() has been deprecated. Use task dependencies or gulp.watch task triggering instead.
[15:56:30] Starting 'compass'...
[15:56:30] Finished 'compass' after 7.72 ms
    write css/style.css

[15:56:32] style.css was reloaded.
[15:56:32] Live reload server listening on: 35729
```
TypeScriptの基本型まとめ

## Boolean(論理型)
```ts
var isDone: boolean = false;
```

## Number(数値型)
TypeScriptのNumber型は実数も含みます。

```ts
var height: number = 6,
    width: number = 5.24;
```

## String(文字列型)
```ts
var name: string = "Bob";
name = 'smith';
```

## Array(配列)
### 1つ目の書き方
```ts
var list: number[] = [1, 2, 3];
```

### 2つ目の書き方
```ts
var list: Array<number> = [1, 2, 3];
```

## Enum(列挙型)
C#の列挙型のような感じらしいです。

### 0番目の値が0のままで良い場合
```ts
enum Color {Red, Green, Blue};
var c: Color = Color.Green;
```

### 0番目の値を0以外にしたい場合①
```ts
enum Color {Red = 1, Green, Blue};
var c: Color = Color.Green; // Color.Green === 2
```

### 0番目の値を0以外にしたい場合②
```ts
enum Color {Red = 3, Green = 7, Blue = 9};
var c: Color = Color.Green; // Color.Green === 7
```

### 列挙名を取得する
```ts
enum Color {Red = 1, Green, Blue};
var colorName: string = Color[2];
console.log(colorName);
```

## Any(Object型？)
どんな型でも入ります。

```ts
var notSure: any = 4;
notSure = "any型はどんな型でも入るンゴ";
notSure = false;
```

### いろんな型のデータをリストっぽくしたいとき
```ts
var list:any[] = [1, true, 'strrrr'];
list[1] = 100;
```

## Void
返り値なし。

```ts
function warnUser(): void {
    console.log('be careful.');
}
```

## 注意
Numberとnumberは区別されます。

[原文(Handbook - Welcome to TypeScript)](http://www.typescriptlang.org/Handbook#basic-types)
クローズド環境にGitBucket立てるまでの流れ

社内環境でGithubクローンみたいなの使いたいと思って探したら[GitBucket](https://github.com/takezoe/gitbucket)がデプロイ簡単とのことで動かす所までやってみました。GitBucketは@takezoenさんが開発しておりOSSとして公開されているGitHubクローンなアプリで、Scalaで書かれていてTomcat等で動かすことが出来て便利。



###動かすサーバを用意

　今回は適当にCentOS6.5を用意。仮想で適当に構築。

###Javaのインストール
yumを使用。バージョンは1.7をインストールします。

```
# yum -y install java-1.7.0-openjdk-devel.x86_64
```

###Tomcatのインストール
wgetでTomcat(7.0)を直接取ってきます。(yumで入れようとすると6.xが指定されるため）
取り合えず入れた時の最新版(v7.0.56)を指定します。

```
# wget http://ftp.riken.jp/net/apache/tomcat/tomcat-7/v7.0.56/bin/apache-tomcat-7.0.56.tar.gz
```

適当なディレクトリで解凍して/usr/local/下に移動させる。

```
# tar -xvzf apache-tomcat-7.0.56.tar.gz
# mv apache-tomcat-7.0.56 /usr/local/tomcat
```


###Gitbucketを設置
webappsディレクトリに移動し、gitbucket.warファイルをダウンロードして配備するだけです。

```
# cd /usr/local/tomcat/webapps/
# wget https://github.com/takezoe/gitbucket/releases/download/2.5/gitbucket.war
```

ダウンロードが終了したら以下のようにTomcat起動する

```
# cd /usr/local/tomcat/bin/
# ./startup.sh
```

サーバにブラウザからアクセスして、Gitbucketの画面が表示されれば成功！

```
http://[サーバのIPアドレス]：8080/gitbucket/
```

実は裏で環境的にネットワーク制限(proxyとか認証)などで色々苦労したけど、とても簡単に動かせて良いです。
ORMLiteはDAOの生成は思ったほど時間がかからない。

ORMLiteを使うときの注意点として、DAOの生成はコストがかかるので使いまわした方がいいっていう記事があるので、時間だけでも計測してみました。
こちらの記事を参考にさせてもらいました。
http://qiita.com/opengl-8080/items/133314cfed9b3b404572

テストコードでこんな感じのソースを作ってみます。

```
HogeHoge hogehogeEntity = new HogeHoge();
long count = 1000;
//ヘルパー作成
ORMDatabaseHelper helper = new ORMDatabaseHelper(loginActivity);

Calendar startCal = null;
Calendar endCal = null;

/*都度DAOを生成する*/
startCal = Calendar.getInstance();
for(int i = 0;i < count;i++){
    Dao<HogeHoge,Long> dao = helper.getDao(HogeHoge.class);
    dao.createOrUpdate(hogehogeEntity);
}
endCal = Calendar.getInstance();
Log.i(TAG, "同じhelperで毎度DAOを生成した場合(ミリ秒):" + (endCal.getTimeInMillis() - startCal.getTimeInMillis()));

/*DAOを事前に生成しておき、都度DAOを生成する*/
Dao<HogeHoge,Long> dao2 = helper.getDao(HogeHoge.class);
startCal = Calendar.getInstance();
for(int i = 0;i < count;i++){
    dao2.createOrUpdate(hogehogeEntity);
}
endCal = Calendar.getInstance();
Log.i(TAG,"同じhelperでDAOを使いまわした場合(ミリ秒):" + (endCal.getTimeInMillis() - startCal.getTimeInMillis()));

```

結果なんですが、ほとんど変わらなかったです。

1回目。
同じhelperで毎度DAOを生成した場合(ミリ秒):2402
同じhelperでDAOを使いまわした場合(ミリ秒):2174

2回目。
同じhelperで毎度DAOを生成した場合(ミリ秒):2329
同じhelperでDAOを使いまわした場合(ミリ秒):2338

何度やっても0.3秒以内の差にしかならず、それほど目立った差にはなりませんでした。
少なくとも時間的な意味では、DAOを生成しても使いまわしても、あんまし差が無いかもしれないです。
ディスクアクセスの量とかもっと詳しい見方をすると違うのかもしれんですが…。

モデルクラスとか設計するときに「DAOを使いまわせるように設計しないとなー」と悩んでいる方々は、思い切って使い切りにしちゃうのも良いかと思います。
helperの生成にはすごく時間かかりましたので、helperは多分使いまわした方がいいと思いますが…。
Hash から文字列でもシンボルでも値を取り出す

## 概要

Ruby の [Hash](http://docs.ruby-lang.org/ja/2.1.0/class/Hash.html) は key が文字列かシンボルかどうかを区別します。

### 例

```ruby
hash = { yuno: 'ゆの', miyako: '宮子' }
hash[:yuno]  #=> "ゆの"
hash['yuno'] #=> nil

hash = { 'sae' => '沙英', 'hiro' => 'ヒロ' }
hash[:sae]  #=> nil
hash['sae'] #=> "沙英"
```

きっちりしてて結構なんだけど、
key が文字列かシンボルか意識しなくても value を取り出せるとありがたい場合もありますよね。

そういえば、Rails 4 の Controller の `params` って文字列でもシンボルでも value を取り出せますよね。
あれの型は実は Hash ではなくて Hash のサブクラスである [ActiveSupport::HashWithIndifferentAccess](http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html) なんです！
(正確には、さらにそのサブクラスである [ActionController::Parameters](http://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html) です。)

Hash を HashWithIndifferentAccess に変えてその恩恵を受けるには `Hash#with_indifferent_access` というインスタンスメソッドを利用します。

### 例

```ruby
require 'active_support'
require 'active_support/core_ext'

sugoi_hash = { yuno: 'ゆの', miyako: '宮子' }.with_indifferent_access
sugoi_hash[:yuno]  #=> "ゆの"
sugoi_hash['yuno'] #=> "ゆの"

```

やったね宮ちゃん！ (ドヤァ

![1NFb2.jpg](https://qiita-image-store.s3.amazonaws.com/0/6697/e494ae73-22b9-bb79-4ad3-8f46300f8070.jpeg)

## 参考

* [Object::HashWithIndifferentAccess < Hash](http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html)
* [ActionController::Parameters < ActiveSupport::HashWithIndifferentAccess](http://edgeapi.rubyonrails.org/classes/ActionController/Parameters.html)
cocos2d-x AndroidとiOSでブラウザを起動する方法


[この記事](http://discuss.cocos2d-x.org/t/opening-urls-in-external-browser/2642)を自分向けにしたものです。

新しいファイルを作らなくてよいので楽かなと…


# 対象

- cocos2d-x 3.2.0
- Xcode 6.1
- Eclipse Juno (Android Developer Tools) 

# iOS対応

cocos2d_libs.xcodeprojの次のファイルを編集します。

## platform/ios/CCApplication


```c++
// CCApplication.h

class CC_DLL Application : public ApplicationProtocol {

public:
  void openURL(const char* url);

};
```

```objc
// CCApplication.mm
void Application::openURL(const char *urlStr) {
    NSString* str = [NSString stringWithUTF8String:urlStr];
    NSURL* url = [NSURL URLWithString:str];
    [[UIApplication sharedApplication] openURL:url];
}
```

# Android対応

cocos2d/cocos/platform/androidの以下のファイルとsrcのjavaファイルを編集します。


```c++
// CCApplication.h

class CC_DLL Application : public ApplicationProtocol {
  virtual void openURL(const char* pszUrl);
};

```

```c++
// CCApplication.cpp

void Application::openURL(const char* pszUrl) {
    JniMethodInfo minfo;
    if(JniHelper::getStaticMethodInfo(minfo,
        "org/cocos2dx/cpp/AppActivity",
        "openURL",
        "(Ljava/lang/String;)V"))
    {
        jstring StringArg1 = minfo.env->NewStringUTF(pszUrl);
        minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, StringArg1);
        minfo.env->DeleteLocalRef(StringArg1);
        minfo.env->DeleteLocalRef(minfo.classID);
    }
}
```

```java
// /src org.cocos2dx.cpp.AppActivity.java

public class AppActivity extends Cocos2dxActivity {

private static AppActivity me = null;

    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
        me = this;   // => added!
    }
    
    public static void openURL(String url) { 
        Intent i = new Intent(Intent.ACTION_VIEW);  
        i.setData(Uri.parse(url));
        me.startActivity(i);
    }
}
```

# 利用例

```c++
// SampleScene.cpp

void SampleScene::tapped(Ref* pSender) {
  Application::getInstance()->openURL("http://www.abc.def/~~~");
}
```
このサイトのセキュリティ証明書の取り消し情報は、使用できません。

**※この記事は未解決事項です。**

##問題点
Windows7 環境で起動するとなぜか毎日表示される。
「このサイトのセキュリティ証明書の取り消し情報は、使用できません。続行しますか？」のメッセージ。

とにかく鬱陶しい。証明書をインストールして成功しても、なぜか毎日「こんにちは。」

![security.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/78671439-961f-cab4-3ad3-e0623a6383cc.png)

![cert.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/2b89e178-81fb-e53a-10a4-746787d1906b.png)

##対応方法1

そこで、ローカルグループポリシーエディタで、[公開キーのポリシー]-[証明書パス検証の設定]を選択。

![localgroup.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/d24967c8-fc36-536e-582a-e2f0e387ced0.png)

証明書パス検証の設定のプロパティで、[ネットワークの取得]タブを選び、[これらのポリシーの設定を定義する]をチェックする。

![cert_path.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/3d65f58e-2d16-c4b2-3d1f-67a0ea2ba375.png)

ここまでで、何の設定をしているのか正直言って不明であるが、息の根を止めたようだ。


##後日復活

その後日、再度表示されるようになった。どうやら上記の対応方法1では息の根を止められなかったようだ。

##対応方法2

そこで、今度はIEの設定で[インターネットオプション]-[詳細設定]-[サーバーの証明書失効を確認する]のチェックを外してみる。

IEは一切使ってないし関係ないので、効果ないと思うが…。

![security.PNG](https://qiita-image-store.s3.amazonaws.com/0/3184/f5c6a699-8184-2917-3d7a-e36ca0836f55.png)

数日待ってみる。
Swift から MDCSwipeToChoose を使う


[MDCSwipeToChoose](https://github.com/modocache/MDCSwipeToChoose "") を Swift から使ってみる時のメモ。

# Podfile の準備

Podfile を作って pod install

```Podfile
platform :ios, "8.0"
pod 'MDCSwipeToChoose'

```

# Bridging Header の準備

UIKit も import しておかないとエラーになります。

```BridgingHeader.h
#ifndef BridgingHeader_h
#define BridgingHeader_h

#import <UIKit/UIKit.h>
#import <MDCSwipeToChoose/MDCSwipeToChoose.h>

#endif
```

# ViewController 中に配置

```swift
import UIKit

// ... in a view controller

override func viewDidLoad() {
    super.viewDidLoad()

    var options = MDCSwipeToChooseViewOptions()
    options.delegate = self
    options.likedText = "Keep"
    options.likedColor = UIColor.blueColor()
    options.nopeText = "Delete"
    options.onPan = { state -> Void in
        if state.thresholdRatio == 1 && state.direction == MDCSwipeDirection.Left {
            println("Photo deleted!")
        }
    }

    var view = MDCSwipeToChooseView(frame: self.view.bounds, options: options)
    view.imageView.image = UIImage(named: "photo.png")
    self.view.addSubview(view)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

// This is called when a user didn't fully swipe left or right.
func viewDidCancelSwipe(view: UIView) -> Void{
    println("Couldn't decide, huh?")
}

// Sent before a choice is made. Cancel the choice by returning `false`. Otherwise return `true`.
func view(view: UIView, shouldBeChosenWithDirection: MDCSwipeDirection) -> Bool{
    if (shouldBeChosenWithDirection == MDCSwipeDirection.Left) {
        return true;
    } else {
        // Snap the view back and cancel the choice.
        UIView.animateWithDuration(0.16, animations: { () -> Void in
            view.transform = CGAffineTransformIdentity
            view.center = view.superview!.center
        })
        return false;
    }
}

// This is called then a user swipes the view fully left or right.
func view(view: UIView, wasChosenWithDirection: MDCSwipeDirection) -> Void{
    if wasChosenWithDirection == MDCSwipeDirection.Left {
        println("Photo deleted!")
    }else{
        println("Photo saved!")
    }
}

```
Haproxyのインストール（ソースからrpmの作成Ver.）

# 必要モジュールのインストール
yum install rpm-build pcre-devel gcc

# インストールの準備
mkdir -p /root/rpmbuild/SOURCES
mkdir -p /root/rpmbuild/SPECS
cd /root/rpmbuild/SOURCES

# ソースのダウンロード
wget http://www.haproxy.org/download/1.5/src/haproxy-1.5.5.tar.gz
tar zxvf haproxy-1.5.5.tar.gz
cp haproxy-1.5.0/examples/haproxy.spec ../SPECS/

# RPMのビルド
cd /root/rpmbuild/SPECS
rpmbuild -ba haproxy.spec

# Haproxyのインストール
rpm -Uvh /root/rpmbuild/RPMS/x86_64/haproxy-1.5.5-1.x86_64.rpm

mkdir /var/lib/haproxy

# ログ出力の設定
```/etc/rsyslog.conf
#*.info;mail.none;authpriv.none;cron.none                /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local6.none                /var/log/messages

local6.*                                                /var/log/haproxy.log

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

$ModLoad imudp
$UDPServerRun 514
```

# ログのローテート設定
```/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
/var/log/haproxy.log
{
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
```

# 設定＠サンプル
```/etc/haproxy/haproxy.cfg
global
        log         127.0.0.1 local6
        maxconn     16384
        chroot      /var/lib/haproxy
        uid 99
        gid 99
        daemon
#       debug
        spread-checks 5
        nbproc      4 #CPUのコア数に合わせる

defaults
        log             global
        option          tcplog
        mode tcp
        retries 2
        timeout connect 5s
        timeout client  20s
        timeout server  20s
        timeout check   10s

listen http
        bind *:80
        mode tcp
        balance roundrobin
        option  log-health-checks
        option  tcp-smart-connect
        option  contstats
        server  read1 192.168.1.11:80 check port 80 inter 30000 fall 1
        server  read2 192.168.1.12:80 check port 80 inter 30000 fall 1
```
pepperめも_03:ペッパーのフォルダ構造

#ペッパーのフォルダ構造
ペッパーの中身をいろいろみてみたので、まとめました！
※随時追記していきます

#wwwのルートディレクトリ

```
cd /var/www/
```

ペッパーにブラウザでつないだ時に表示される、ロボットウェブページと旧ロボットウェブページが置かれています。ペッパーの起動時にタブレットに表示されるのもここなのかな？（未確認）

libsフォルダにjQueryがあるのがちょっと面白いと思いました！

qimessaging.js を使って、ロボット本体と接続しているみたいですね！
詳しい使い方が気になります！

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/d7871755-646e-00b2-0e1c-c6b180b1d83b.png)

#ペッパーにインストールされているアプリ

```
cd /home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior
```

appsフォルダに、インストールされているアプリが入っているようです。

.lastUploadedChoregrapheBehavior フォルダに、Choregraphで転送したアプリがはいっているとのこと！

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/bf0d6c11-9394-6f6b-9c85-4cd416061a1d.png)

このフォルダは、再生ボタンを押すごとに全削除されるとのこと。
SSHやFTPで接続している時に再生ボタンを押すと、中身のファイルが空に見える時があります。

※SSHの場合は、上位フォルダに移動してから、再度そのフォルダに移動すると最新の情報が表示されます。
※FTPの場合はよくわかんないので、なにかいい設定とかあったら教えて欲しいです！

#写真などの保存先フォルダ

```
cd /home/nao/recordings
```

recordingsフォルダに、take pictureで保存したファイルが保存されます！
iPhoneのカメラロールみたいに使える・・・のかな？

record videoの動画ファイルもここに保存されます。
※record videoバグってるけど・・・。（2014年11月18日現在）

![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/40994/ccda1ac4-f180-d6af-8635-e24e23dd4ae8.png)

#テンポラリ

```
cd /tmp
```

この中にある、tmpxxxxxxみたいな名前のフォルダに、record soundの音声が保存されます。
謎ですね・・・。(2014年11月18日現在）

![2014-11-18 12.17.58.png](https://qiita-image-store.s3.amazonaws.com/0/40994/37b3fa68-1341-f0c9-a448-6bf3fb57b82d.png)


#おしまい
以上、ペッパーくんのフォルダとかのめもでした！
タブレットの中もみてみたいですねー
shellでも並行実行できる


```bash:test.sh
 ## the parallel処理のサンプル 
    for ((i=0;i<5;i++));do
      {
        sleep 3;echo 1>>aa && echo "done!"
      }& #& loop並行実施する様に
    done
    wait #すべての並行実行完了まで待ちます
```

実行結果と時間を計る（3秒かかる）

```bash
~ koukou.chou.ts$ time ./test.sh 
done!
done!
done!
done!
done!

real	0m3.014s
user	0m0.007s
sys	0m0.012s
90201667n:~ koukou.chou.ts$ 
```
スクリプトパラレルで実行している様子も見れる


```bash
~ koukou.chou.ts$ ps  -ef | grep test.sh| grep -v grep
1903612162 98968 95673   0  2:54PM ttys002    0:00.00 /bin/bash ./test.sh
1903612162 98969 98968   0  2:54PM ttys002    0:00.00 /bin/bash ./test.sh
1903612162 98970 98968   0  2:54PM ttys002    0:00.00 /bin/bash ./test.sh
1903612162 98971 98968   0  2:54PM ttys002    0:00.00 /bin/bash ./test.sh
1903612162 98972 98968   0  2:54PM ttys002    0:00.00 /bin/bash ./test.sh
1903612162 98975 98968   0  2:54PM ttys002    0:00.00 /bin/bash ./test.sh


```
Nitrous.ioで Laravelを動かす

## 環境整備

### zip解凍ができるように、peclでインストール

```
pear config-set php_ini /home/action/.parts/etc/php5/php.ini
pecl config-set php_ini /home/action/.parts/etc/php5/php.ini     
pecl install zip
```

### バーチャルホストを作成

```
vim /home/action/.parts/etc/apache2/httpd.conf
```

```
<VirtualHost *:4000>                                                                                    
    DocumentRoot "/home/action/workspace/laravel/public"                                                
    <Directory "/home/action/workspace/laravel/public">                                                 
        Options Indexes FollowSymLinks                                                                  
        AllowOverride All                                                                               
        Require all granted                                                                             
    </Directory>                                                                                        
</VirtualHost> 
```

### Apache2 を再起動
```
parts restart apache2
```

### Composerのバージョンアップ
```
composer self-update
```

### Laravelのプロジェクトを作成
```
cd /home/action/workspace/
composer create-project laravel/laravel laravel --prefer-dist
```

### プレビュー
[preview->port 4000]
arrayに存在しないkeyを指定しても動くぞ！？

やりたいこと

```php
$scores = array('出来杉' => 100, 'のび太' => 8);
$border_line = 60;
($scores['出来杉'] > $border_line); # => true
($scores['のび太'] > $border_line); # => false
```
合格判定をやりたい


```php
$scores = array('出来杉' => 100, 'のび太' => 8);
$border_line = 60;
($scores['コロ助'] > $border_line); # => false
```
ファッ！？

```php
$scores = null;
$border_line = 60;
($scores['コロ助'] > $border_line); # => false
```

ファッ！？


「エラーになるのでは？」
「現在進行形で動いてます！」
itemIdを指定してコンポーネントを取得する

itemIdを指定してコンポーネントを取得する場合は、2種類の方法がある。
Ext.Queryable.downと、Ext.Queryable.queryByIdの2つ。

queryByIdのソース見るとdownを呼んでいるだけなので、itemIdの先頭に#をつけるのが好きか嫌いかだけの問題ですかね。

```js
    queryById: function(id){
        return this.down('#' + id);
    },
```

```coffeescript
Ext.onReady ->
	# 表示するビューオブジェクト
	view = null
	# 画面の構築
	cfg = 
		layout:'border'
		items:[
			region:'center'
			layout:'fit'
			tbar:[
				text:'test1'
				handler: ->
					# 親→子方向に検索 itemIdには、先頭に#を付ける
					item = view.down("#txtArea")
					console.log item.getValue()
			,
				text:'test2'
				handler: ->
					# itemIdには、先頭に#を付けない
					item = view.queryById("txtArea")
					console.log item.getValue()
			]
			items:
				xtype:'codemirror'
				theme: 'blackboard'
				mode: "text/x-coffeescript"
				itemId:'txtArea'   # <- itemIdを指定
				showToolbar:false
	# 画面の表示
	view = Ext.create("Ext.Viewport",cfg)


```
Backboneアプリケーションコードレビューガイド

単純にチェックできるやつだけ。

## イベントのAPI

`on`や`off`と言った、古いAPIを使っていないか？特別な理由がない限り、`listenTo`や`stopListening`を使う。

## サブビューの管理

Viewの中でViewのインスタンスを作ったら、`remove`の中で`remove`すること。

> 適切なライブラリを使えば考える必要がない。

## `remove`の実装

* `super`を忘れていないか
* `stopListening`は必要ないことが多い

## `render`の返値

`this`を返すこと。

## イベントハンドラ

サブビューのイベントを処理してはいけない。
Raspberry piでpd-extendedを使う

#セットアップ～初期設定までをざっと書くよ。

１，Raspberry piのHPから最新版のraspbianを落とす。

２，Windowsならば、win32Diskimagerを使って、SDカードに落としてきたimageを書き込む。

３，raspberry piにキーボードとマウスとHDMIを挿して、電源を差し込む。（起動する）

４，初期設定画面になるので、まず使用するSDカードの容量を増やす。（Expand Filesystem）

５， Internationalisation Options > I3 Change Keyboard Layoutでキーボードの設定（Generic 105-key (Intl) PC5→Other→Japanese→Japanese - Japanese (OADG 109A）

６，OS Updateをする

７，再起動()

８，コマンドラインから startXでGUIを起動し、ターミナルから
```
sudo apt-get update
```
を実行

９，pd-extendedのRepositoryを追加するために
```
sudo nano /etc/apt/sources.list
```
を実行し、
```
deb http://apt.puredata.info/releases wheezy main
```
を書き加える。

１０，もう一度 sudo apt-get update

１１，pd-extendedをインストールするために
```
sudo apt-get install pd-extended
```

１２，このままではswap容量が足りずにサウンドファイルを沢山使うとkillされてしまうため、swap容量を増やす

１３，現在のswap領域の状態を確認。
```
swapon -s
```
１４，次に、dphys-swapfile を停止。
```
sudo /etc/init.d/dphys-swapfile stop
```
１５，それからdphys-swapfile の設定ファイルを変更。

CONF_SWAPSIZE の値を変更する。(1024MB位で良い)
```
sudo nano /etc/dphys-swapfile
```
CONF_SWAPSIZE=1024 

１６，dphys-swapfile を起動
```
sudo /etc/init.d/dphys-swapfile start
```

ここまでやると、そこそこ重めのpdファイルでもちゃんと読んで動いてくれる。
もしCPUスピードが足りなければ
```
raspi-config
```
で、本体の設定画面に入って、overclockしてみるのもいいかも。

本体の音声端子から音を出すととてもノイジーなので、USBオーディオ（1500円程度のもので充分）を使うとより実用的。
チェーンとコールバックの違い by Chris Coyier

> この記事は、[The Difference Between Chaining and Callbacks - by Chris Coyier](http://codepen.io/chriscoyier/blog/the-difference-between-chaining-and-callbacks)の日本語訳です。

***
##チェーンとコールバックの違い

少し前のことになりますが、私が運営をしている「[jQueryを走り書きから学ぶ](http://css-tricks.com/lodge/learn-jquery/table-of-contents/)」という勉強会を開いた時にこのテーマをまとめました。既にご存知の方には明確な違いかもしれませんが、私自身この違いについて非常に混乱した記憶があるので掲載させて頂きます。

jQueryではとても簡単にチェーンを作ることができます。
一つの要素コレクションに対して、つなげて、つなげて、つなげるだけです。

```js
// これはチェーンです。
$(".thing")
  .addClass("cool")       // これをつなげます！
  .animate({              // そしてつなげます!
    "padding": 20
  }, 4000)
  .css("color", "red");   // そしてつなげます!
```

↑のチェーンにおいて、3つのつなげられたチェーンは素早く順々に実行されます。
ここである疑問が湧きます。処理の待機は一体どうなっているのでしょうか？3つの処理はどの処理がどの処理を待機して素早く順々に実行されているのでしょうか？

実は、これら3つの処理は同期的に実行されています。そのため、この例では`animate`が実行されるより前にクラス名である「cool」が要素に対して付加されることになります。このようにしてアニメーションが始まり、その次のタイミングで要素の文字色は赤になります。

アニメーションのスタートは同期的に行われるため、文字色の変更より先に開始されますが、文字色の変更の開始タイミングはアニメーションの終了を待ちません。チェーンでは前処理の開始タイミングのみが次処理の開始タイミングの引き金となり、処理の終了タイミングについては無視さるのです。

もし、次の処理をアニメーションの終了タイミングで行いたい場合どうすればよいでしょうか？そのときは「コールバック」の出番です。

こちらを見てください。

```js
// これは「コールバック」です。
$(".thing")
  .animate({              // 実行します
    "padding": 20
  }, 4000, function() {
    $(this).css("color", "red"); // アニメーションの終了時に実行されます。
  });
```

全てはタイミングの違いだったのです。
Goで入力と出力をくっつける練習

具体的には、標準入力を取って、外部コマンド（今回はRuby、まあなんでもいい。docker execとかにつないだら夢がありそう）をそのまま流し込んで、出力を一行ずつ取る。

[`bufio.Scanner`](http://golang.org/pkg/bufio/#example_Scanner_lines) が、node.jsの[carrier](https://github.com/pgte/carrier)みたいな感じで一行ずつ取るのに向いていた。あと、nodeの感覚でパイプをつなげられる[go-pipe](https://labix.org/pipe)を使った。これは便利だった。

* スキャンし続けるgoroutineを回す
* コマンドの終了を監視するgoroutineを回す
* 標準入力を取るメインループを回す

と言う感じでうまく行ったっぽい。

```go:pipe_spike.go
package main

import (
	"bufio"
	"fmt"
	"os"
	"os/exec"

	"gopkg.in/pipe.v2"
)

func runScanLoop(scanner *bufio.Scanner) {
	for scanner.Scan() {
		if text := scanner.Text(); text != "\"\"" {
			fmt.Printf("%v\n", text)
		}
	}

	if err := scanner.Err(); err != nil {
		fmt.Fprintln(os.Stderr, "reading command input:", err)
	}
}

func runWatchCmdLoop(cmd *exec.Cmd, term chan bool) {
	cmd.Wait()
	fmt.Println("Process exit detected")
	term <- true
}

func main() {
	ruby := "puts 'Start'; while str = gets; exit if str.start_with?('quit'); p str.chomp.reverse; end"
	cmd := exec.Command("ruby", "-e", ruby)
	stdout, err := cmd.StdoutPipe()
	stdin, err2 := cmd.StdinPipe()
	if err != nil || err2 != nil {
		panic(err)
	}

	if err := cmd.Start(); err != nil {
		panic(err)
	}

	// Invoke first input
	fmt.Fprint(stdin, "\n")
	scanner := bufio.NewScanner(stdout)
	go runScanLoop(scanner)

	term := make(chan bool, 1)
	go runWatchCmdLoop(cmd, term)

	go func() {
		<-term
		fmt.Println("Exited...")
		os.Exit(0)
	}()

	for {
		p := pipe.Line(
			pipe.Read(os.Stdin),
			pipe.Write(stdin),
		)
		if err := pipe.Run(p); err != nil {
			panic(err)
		}
		if s, err := pipe.Output(p); err != nil {
			fmt.Println(s)
			panic(err)
		}
	}
}
```

![gospike.gif](https://qiita-image-store.s3.amazonaws.com/0/569/5b151ac5-8301-cb76-5b5f-41b1e7472375.gif)


なお、これがFukuoka.rbでの成果物であることは内緒である。
AquaSKK+ACT他のセットアップ

http://sourceforge.jp/projects/aquaskk/releases/ からダウンロードしてインストール

https://github.com/eiel/aquaskk-act にAquaSKKでACT使う諸々があるのでセットアップ

```
$ https://github.com/eiel/aquaskk-act.git
$ cd aquaskk-act
$ rake install
```

http://hitode909.hatenablog.com/entry/20110421/1303274561 を参考にgoogle-ime-skkをセットアップ

```
$ gem install google-ime-skk
$ google-ime-skk
```

ログアウトして入力設定したりして終わり

以前やった時はAquaSKK+ACTが(他の方の設定だったけど)うまく動かなかったのでGoogle IMEを使っていたのですが今回久しぶりにやってみたところ難無く出来たので大変ありがたい。
swiftでDelegate/DataSourceを分離したいときに気をつけること


UITableViewのDataSourceやDelegateを分離しようとしてうまくいかなかった話。

## DelegateになるにはNSObjectを継承している必要がある
UIKitのDelegateはそれぞれNSObjectProtocol継承であるっぽい。
なので

```swift
class MyTableViewDataSource : NSObject, UITableViewDataSource{

}
```

といった具合で継承されてないとうまくいかない

## Delegateはメンバ変数化しておく

これは完全にswiftから入ったがゆえかなあと思った。

例えばさくっとこんな感じで書いたとすると

```swift
class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.dataSource = TableViewDataSource()
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
	
	// DataSourceの件数そのまま出すといいだろうーみたいな感覚
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return  (self.tableView.dataSource as TableViewDataSource).data.count
    }
}
```
みたいなことをしていると`EXC_BAD_ACCESS`に見舞われる。
一体何なんだこれはと思っていたがおそらくdataSourceの参照先が開放されてしまっているのだろう。

なので下記のようにViewControllerのメンバーにしておく必要がある模様。

```swift
class TableViewController: UITableViewController {
    var dataSource : TableViewDataSource = TableViewDataSource()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.dataSource = dataSource
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return dataSource.data.count
    }
}
```
Go の相対パス import ができたりできなかったり

ツッコミお待ちしております。

追記: 下記は go version go1.3.3 windows/386 で確認しています。~~また Linux だと期待通りに動きます~~ (thanks @heliac2000)。~~(というか Windows だけ通らない？)~~

追々記: GOPATH 配下では `go build` はローカルパッケージを参照できないことを教えてもらいました  (thanks @mattn)。GOPATH 配下以外では Windows / Linux 共に (おそらくその他の環境でも) ローカルパッケージを参照することができます。

# 前提

```
. (GOPATH)
└─src
  └─hoge
    ├─main.go
    └─localpackage
      └─func.go
```

```go:main.go
package main
import (
    "fmt"
    "./localpackage"
)
func main() {
    fmt.Println(localpackage.LocalFunc())
}
```

```go:localpackage/func.go
package localpackage
func LocalFunc() string {
	return "LocalFunc()"
}
```

```bat
hoge> go version
go version go1.3.3 windows/386
```

# ビルド

ビルドします。

```bat
hoge> go build
can't load package: \hoge\main.go:6:2: local import "./localpackage" in non-local package
```

はい。

# ファイルを指定してビルド

気を取り直してビルドします。

```bat
hoge> go build main.go
(成功するので何も表示されない)
```

はい。

# で？

"." で始まってたら該当ファイルからの相対パスと見なす、みたいな優しさがほしい。
App Video Preview（App Store内動画）でやっていいこと／悪いこと


App Storeのスクリーンショットは、もはやアプリの画面が一切写ってないアプリがあったりとわりとフリーダム感ありますが、動画に関しては結構制約が厳しいようです。
最近、[自社のアプリ](https://www.drwallet.jp/)で動画を入れてみたので、そこで起きたやってもいいこと、やったらダメなこと（リジェクト）をご紹介します。

## やっていいこと

### スクリーン上に装飾されたテキストを重ねる
![スクリーンショット-2014-11-14-11.48.43.jpg](https://qiita-image-store.s3.amazonaws.com/0/21397/47c3bac6-85d6-5bbb-7489-196b680f3275.jpeg "スクリーンショット-2014-11-14-11.48.43.jpg")


### 「今すぐダウンロード！」的なことを表示する
![スクリーンショット-2014-11-14-11.52.29.jpg](https://qiita-image-store.s3.amazonaws.com/0/21397/a8a3d351-7852-2794-6a23-cf828cdb2c35.jpeg "スクリーンショット-2014-11-14-11.52.29.jpg")

## やったらダメだったこと

### アプリ画面以外の要素を表示する
![img0000013.jpg](https://qiita-image-store.s3.amazonaws.com/0/21397/d0d7803a-301e-2992-620d-dfb8c5be00e6.jpeg "img0000013.jpg")


上の例だと、下の方にワイプ的にアプリ画面以外の要素がスクリーン上に重ねられていますが、これをしたらリジェクトされました。

> 3.14: App previews may only use video screen captures of the app, voice-overs, and textual and design overlays, or the app will be rejected

## まとめ
あくまでも、App Store内動画はアプリのスクリーンキャプチャーをベースに作る必要があり、余計な要素が目立っている場合はリジェクト対象になりそうです。

## あわせて読みたい
[AppStoreに動画が載せられるようになったので、その仕様とよくある質問まとめ - Qiita](http://qiita.com/exilias/items/cdd3c5f3be4760361300)
rails s実行時にA server is already running.と出る時の対処法




ちょっとはまったのでメモ。

[Qiita](http://qiita.com/ytr_i/items/f5114cfb9ba3b0631bc0)

ここを参照させて頂いたが、
  
```bash
$ ps ax
```
   
で表示される一覧見てもどこが起動中か分からなかったので、他の方法調べた。

tmp/pids/server.pid
を開いたら書いてある数字をコピペして、

```bash
$ kill -9 (コピペした数字)
   
```
を実行してrails sしてみたら成功した！


根本的な理由はあまり分かってない。
有名どころの Web 開発用エディタで Terminal を実行した際の比較（Mac）


Coda のようにウインドウ上で Terminal を実行できるエディタを比較しました。

※Coda と IntelliJ は持っていないので体験版で比較（ ~~IntelliJ テラ欲しす...~~ WebStorm 買いました）

### いきなり感想

|名前（パッケージ名）|評価|備考|
|:--|:-:|:--|
|Code 2|△|テキストがカラーで出力されない|
|Sublime Text 3（Glue）|×|コマンド入力部分が独特。カラー非対応|
|Atom（Term2）|◎|よさげ、必要十分|
|Brackets（Terminal）|△|よさげだが別途 tty.js が必要|
|IntelliJ IDEA 14|◎|文句の付け所がない|

そこそこ高いだけあって、IntelliJ が優秀。

~~Atom（Term2）も良いが、画面を左右や上下に分割した際にドラッグ&amp;ドロップでサイズを変更できない（※）ので、Terminal を小さくしたい時に不便。~~

~~※キーボードショートカットでなら変更可能（別途 Layout manager などサイズ変更用のパッケージが必要）~~

~~_5/20 追記:_ Atom v0.193.0 からドラッグ&amp;ドロップでのパネルサイズ変更に対応。しかし、今度はパッケージ（Term2）に問題が発生しており、快適とは言い難い...~~

_7/7 追記:_ ここ1ヶ月位 Term2 が立て続けに update され、かなり安定しました。IntelliJ と比較すると Atom は動作が非常に軽快なので、自分好みにカスタマイズする手間を惜しまなければ、Atom も有力な選択肢になりそうです。

---

### スクリーンショット

#### Coda 2

![coda - treminal.png](https://qiita-image-store.s3.amazonaws.com/0/54471/4fb5e65b-b7d4-6f69-88b8-833232479c20.png "coda - treminal.png")

#### Sublime Text 3（Glue）

![sublime text 3 - terminal.png](https://qiita-image-store.s3.amazonaws.com/0/54471/6ba353f9-50ad-db1e-4c9e-2c2b036d8fb8.png "sublime text 3 - terminal.png")

#### Atom（Term2）

![atom.png](https://qiita-image-store.s3.amazonaws.com/0/54471/be5380d6-0969-b685-b3b4-8a0416c94727.png "atom.png")


#### Brackets（Terminal）

![brackets - terminal.png](https://qiita-image-store.s3.amazonaws.com/0/54471/7d972d4c-0bda-a5a0-62da-9df7d15afffc.png "brackets - terminal.png")

#### IntelliJ IDEA 14

![indellij - terminal.png](https://qiita-image-store.s3.amazonaws.com/0/54471/65d8e483-42fb-4d04-2865-0969c8768e39.png "indellij - terminal.png")
UnityでAssert


[2016/04/06追記]
気づいたらDebugクラスにもAssert関数がありました＼(^o^)／
http://docs.unity3d.com/ja/current/ScriptReference/Debug.Assert.html
これで `Debug.Log` とかと同等に扱えるね！やったね！
[追記ここまで]

----

[2015/06/27追記]
Unity 5.1 から、Unity公式でAssertが用意されたようです٩( 'ω' )و
http://docs.unity3d.com/ScriptReference/Assertions.Assert.html
もう自前で書かなくてもいいね！やったね！
[追記ここまで]

----

とりあえずC#でのAssertってどうするの？って思ってMSDNを調べてみた。

[Debug.Assert メソッド (Boolean) (System.Diagnostics)]( http://msdn.microsoft.com/ja-jp/library/kssw4w7z.aspx )

なるほど。Unityでどう動くのかやってみよう！

```csharp
// Use this for initialization
void Start () {
    System.Diagnostics.Debug.Assert( false, "assert test message." );
}
```

しかし何も起きなかった。無念。
というわけで自分で実装することに。

```csharp
[System.Diagnostics.Conditional( "DEBUG" )]
void Assert( bool condition, string message ) {
    if( !condition ) {
        UnityEngine.Debug.LogError( message );
    }
}
```

`System.Diagnostics.Conditional` 属性を付与してるので、使う場合は [Player Settings] > [Other Settings] > [Configuration] > [Scripting Define Symbols] で `DEBUG` を定義しておく。
そうすることで、リリース時には呼び出しもされず、関数も事実上存在しないものに出来る。らしい。
まだ運用で試してないけど上手く扱えそう。

[Conditional (C# プログラミング ガイド)]( http://msdn.microsoft.com/ja-jp/library/4xssyw96.aspx )
screen(1) の起動問題ワークアラウンドのメモ


Ubuntu 14.04。しばらく使っていると、一般ユーザで screen(1) (GNU Screen) が起動しなくなる。その際には、tmux(1) も動かない。root ユーザであれば起動する。

~~~~
$ screen
[screen is terminating]
~~~~

screen(1) 利用中に「No more PTYs」と出ることも多いので pseudo terminal の使い尽くしかと思ったが、そうでもないようだ。

~~~~
$ cat /proc/sys/kernel/pty/{nr,max}
28
4096
~~~~

何なんでしょうね。strace(1) すると S ビットが無視されるようなので、現象が再現しづらいですし。

再現性が低いために、未解決ぎみ。 ∥ [Bug 813607 – cannot use screen in xterm as user, root appears to work](https://bugzilla.redhat.com/show_bug.cgi?id=813607)

とりあえずのワークアラウンド。 ∥ [screen terminates immediately](http://www.linuxquestions.org/questions/linux-newbie-8/screen-terminates-immediately-4175444530/)

~~~~
$ ll /usr/bin/screen
-rwxr-sr-x 1 root utmp 421768 11月  8  2013 /usr/bin/screen
$ sudo chmod u+s /usr/bin/screen
$ ll /usr/bin/screen
-rwsr-sr-x 1 root utmp 421768 11月  8  2013 /usr/bin/screen
$ screen
Directory '/var/run/screen' must have mode 755.
$ sudo chmod 755 /var/run/screen
~~~~

では。
Uchiwa 0.3.2でSensuに接続できない場合の対処

## 問題

SensuとUchiwaの更新をしたら，Uchiwaで以下のようなエラーがポップアップするようになった．
ただし，Nginx経由の時だけ発生し，3000番に直接アクセスすると発生しなかった．

```
Oops! Something went wrong.
Could not fetch Sensu data. Is Uchiwa running?
```

## 環境

- Ubuntu Server 14.04
- Sensu 0.16.0
- Uchiwa 0.3.2

## 対処方法

どうやら，更新によってAPI用のURLが追加されたらしい．
(SensuやUchiwaの情報を取得するもの? `/health/`，`/get_sensu`，`/get_config`など．)

このURLをNginxの設定に追加してやれば良さそうだ．

```
server {
    listen 80;

    location ~ (/uchiwa/|/health/|/get_sensu|/get_config|/get_client|/delete_client) {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        rewrite /uchiwa/(.*)$ /$1 break;
    }
}
```

これでNginxを再起動すると，アクセスできるようになった．

## Issue

GitHubに，既に「Apacheでリバースプロキシできなくなった」旨のIssueが上がってた．
更に，URLを相対パスに修正するプルリクも投げられてるので，近々マージされるかな?

- [0.3.2 broke reverse proxy with Apache · Issue #197 · sensu/uchiwa](https://github.com/sensu/uchiwa/issues/197)
- [Relative API Requests by tjwallace · Pull Request #198 · sensu/uchiwa](https://github.com/sensu/uchiwa/pull/198)

一応，Issue #197に「Nginxだとこれで動いたよ!」というコメントを書いておいた．
型クラスの練習：プロパー型と型コンストラクタとの組み合わせ

# 型クラス(Type Class)の練習

## プロパー型
まずはプロパー型(proper type)と呼ばれる普通のヤツ。ここではIntとStringに対応した例。
implicitの宣言として、valでもobjectでもいけるので２つ書いておいた。

```scala
object Main extends App {
  
  def decorate[T](x: T)(implicit deco: Decorating[T]) = deco(x)

  trait Decorating[T] {
    def apply(x: T): String
  }
 
  implicit val DecoratingString = new Decorating[String] {
    def apply(x: String) = s"SSS $x SSS"
  }
 
  implicit object DecoratingInt extends Decorating[Int] {
    def apply(x: Int) = s"III $x III"
  }

  println(decorate(100))  // III 100 III
  println(decorate("hello")) // SSS hello SSS
}
```

## 型コンストラクタ
次に1階カインド型(1st-order-kinded type)とか型コンストラクタ(type constructor)とか呼ばれる型パラメータを取るヤツ。
ここではOptionを使う。

以下、Option[String]に対応した例。
Option[Int]も同じようにやるだけなので省略。

```scala
implicit object OptionString extends Decorating[Option[String]] {
  def apply(x: Option[String]) = x.fold("")("OOO SSS " + (_:String) + " SSS OOO")
}

println(decorate(Option("hello")))  // OOO SSS hello SSS OOO
```

## 組み合わせ
上記でも出来るのだが、でも待って欲しい。
Decorating[String]も宣言しているのにDecorating[Option[String]]ではほぼ同じようなコードを書いてしまっている。
Decorating[Option[String]]からDecorating[String]のコードを呼び出して再利用したいはず。
こうやれば出来る。
これでStringにもIntにも対応できている。

```scala
  implicit def DocoratingOption[T](implicit d: Decorating[T]) = new Decorating[Option[T]] {
    def apply(x: Option[T]) = x.fold("")("OOO " + d(_: T) + " OOO")
  }

  println(decorate(Option("hello")))  // OOO SSS hello SSS OOO
  println(decorate(Option(9)))  // OOO III 9 III OOO
  println(decorate(Option.empty[Int]))  // 何も表示されない
```

Option[T]のT部分を動的にしないといけないのでimplicit defで実現している。

## プログラム全体
最後に今回のプログラムを貼り付けておきます。

```scala
object Main extends App {
 
  def decorate[T](x: T)(implicit deco: Decorating[T]) = deco(x)
 
  trait Decorating[T] {
    def apply(x: T): String
  }
 
  implicit val DecoratingString = new Decorating[String] {
    def apply(x: String) = s"SSS $x SSS"
  }
 
  implicit object DecoratingInt extends Decorating[Int] {
    def apply(x: Int) = s"III $x III"
  }
 
  implicit def DocoratingOption[T](implicit d: Decorating[T]) = new Decorating[Option[T]] {
    def apply(x: Option[T]) = x.fold("")("OOO " + d(_: T) + " OOO")
  }

  println(decorate("hello"))
  println(decorate(9))
  println(decorate(Option("hello")))
  println(decorate(Option(9)))
  println(decorate(Option.empty[Int]))
}
```