OmniAICreator/Qiita-1.07M huggingface dataset:
iOSで、StoryBoardを使用してTableViewControllerにNavigationControllerをつける方法


0. xcodeを開いている
1. ストーリーボードを開く
2. TableViewControllerにフォーカス
3. 上部メニューの"Editor"をクリック
4. "Embed In"にマウスオーバー
5. "Navigation Controller"をクリック

下記ページに救われました。
[[Objective-C]StoryBoardを使ってNavigationController+TableViewController(XCode4.2/iOS5)](http://d.hatena.ne.jp/ar_tama/20120104/1325665506)
padrino で omniauth-github を使用して github 認証


http://www.padrinorb.com/blog/padrino-and-omniauth-overview
上記を参考にして行いました。

### 対象読者
padrino で CRUD 開発が出来る方。

## github 側
まず github 上で application の設定を行います。
https://github.com/settings/applications/
→ Register new application

Authorization callback URL は以下のように設定します。
http://******/auth/github/callback

設定が終わると、
Client ID と Client Secret が取得できます。


## padrino 側
Gemfile に以下を追加します。

```Gemfile
gem 'omniauth-github'
```

bundele します。

```app.rb
module AuthProject
  class App < Padrino::Application
    use ConnectionPoolManagement
    register Padrino::Mailer
    register Padrino::Helpers
    use OmniAuth::Builder do
      provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET']
    end
```

github で取得した Client ID を ENV['GITHUB_KEY'] に
Client Secret を ENV['GITHUB_SECRET'] に記述します。
今回は、設定ファイルでの設定を割愛します。


```controllers/auth.rb
AuthProject::App.controllers :auth do
  get :index do
    render :index
  end

  get :destroy do
    set_current_account(nil)
    redirect url(:auth, :index)
  end

  get :callback, :map => '/auth/:provider/callback' do
    auth = request.env['omniauth.auth']
    account = Account.find_by_provider_and_uid(auth['provider'], auth['uid']) ||
    Account.create_with_omniauth(auth)
    set_current_account(account)
    redirect 'http://' + request.env['HTTP_HOST'] + url(:account, :profile)
  end
end

```

```controllers/account.rb
AuthProject::App.controllers :account do
  get :profile do
    content_type :text
    current_account.to_yaml
  end
end
```

```views/auth/index.erb
<!DOCTYPE html>
<html>
<head>
  <title>github認証</title>
</head>
<body>
  <% if logged_in? %>
    <%= link_to 'sign out', '/auth/destroy/' %>
  <% else %>
    <%= link_to 'sign in with github', '/auth/github/' %>
  <% end %>
</body>
</html>
```

### model を作成します。
```sh
$ padrino g model Account name:string email:string role:string uid:string provider:string
$ padrino rake ar:migrate
```

```models/account.rb
class Account < ActiveRecord::Base
  def self.create_with_omniauth(auth)
    create!(
      provider: auth['provider'],
      uid: auth['uid'],
      name: auth['name'],
      role: 'users'
    )
  end
end

```
githubユーザの情報でアカウントを作成するようにします。

これで認証が行えるようになりました。

認証でのアクセス制限を行う場合は以下のように設定します。

```app.rb
register Padrino::Admin::AccessControl

set :login_page, '/auth'
access_control.roles_for :any do |role|
  role.protect "/account"
end

# now we add a role for users
access_control.roles_for :users do |role|
  role.allow "/account/profile"
end
```

以上です。
PHP7 ( phpng ) をインストールして爆速体験をしてみる。

#PHP7 (phpng) をインストールして爆速体験をしてみる。
**現在php7 (phpng)は開発者向けのAlpha版以下の完成度です。
お試しになる方は自己責任でお願いします。**
##前準備
###bison-2.7 をインストール
Fedora 20 や、CentOS 7 ではyum でインストールできるが、CentOS 6 の場合は以下からダウンロードする。
http://ftp.gnu.org/gnu/bison/
バージョンは必ず2.7を使う。新しい物はダメ。
ダウンロードし、解凍したディレクトリで、

    ./configure
    make
    make install

###re2c をインストール
Fedora 20 や、CentOS 7 では yum でインストール出来るが（多分）、CentOS 6の場合は以下からダウンロードする。
http://sourceforge.net/projects/re2c/files/re2c/
ダウンロードし、解凍したディレクトリで、

    ./configure
    make
    make install

###その他
PHP7 (phpng)のソースコード取得には、git が必要なので、まだインストールしていなかったら、

    yum install git
等でインストールしておく。
あと、automake, autoconf 等も必要ではないかと思う。

##PHP7 ( phpng ) のダウンロードからインストールまで
##ソースコードのダウンロードとコンパイルの準備
適当なディレクトリを作成して、

    git clone https://git.php.net/repository/php-src.git
    cd php-src
    git branch phpng origin/phpng
    git checkout phpng
    ./buildconf
##configure設定
詳細は、「./configure --help」でオプションを見ることができるが、基本的にはphp-5.6.xと変わらない。
php をこまめにインストールする方には、configureをオプションごとシェルファイルとして作っておくことをおすすめする。
すでにphp5系をインストール済みであれば、prefix設定推奨。

    ./configure \
        あとはお好みのオプションで

※裏ワザ
ここで生成された Makefile を開き、「-O2」となっている部分を「-O3」と書き直す。
コンパイルの時間がかかるようになるが、phpの実行速度は10%程度速くなる。
これは、php5などでも使えるテクニック。
ただし、何が起こるか保証はできない。決して商用サービスなどで使わないように。

##コンパイル
あとは通常のPHPと同様

    make
    make test
    make install
    cp php.ini-お好み /path/to/php.ini
##php.ini の設定
以下は例

    max_execution_time=600
    memory_limit=128M
    error_reporting=0
    display_errors=0
    log_errors=0
    user_ini.filename=
    realpath_cache_size=2M
    cgi.check_shebang_line=0
 
    zend_extension=opcache.so
    opcache.enable_cli=1
    opcache.save_comments=0
    opcache.fast_shutdown=1
    opcache.validate_timestamps=1
    opcache.revalidate_freq=60
    opcache.use_cwd=1
    opcache.max_accelerated_files=100000
    opcache.max_wasted_percentage=5
    opcache.memory_consumption=128
    opcache.consistency_checks=0
開発する時は opcache は何かと邪魔なので、無効にしてもいい。
WEBサーバでテストする場合は「opcache.enable=1」も追加する。
##PHP7( phpng )の実行

    /path/to/php -v
と実行し、

    PHP 7.0.0-dev (cli) (built: Dec  5 2014 23:29:26)
    Copyright (c) 1997-2014 The PHP Group
    Zend Engine v2.8.0-dev, Copyright (c) 1998-2014 Zend Technologies
        with Zend OPcache v7.0.4-dev, Copyright (c) 1999-2014, by Zend Technologies

と出てくれば成功。

いくつか検証したが、速度的にはphp5.6.0 の2倍程度はでていそう。

WordPress は動作した。（プラグインの中には動作しないものもある）

もし、運用中のWordPressでやらかしてしまった場合は、
1. 一旦php5に戻す
2. 怪しげなプラグインを削除する
3. php7を再インストール（ make install だけでいい）
4. 動作チェック
を繰り返す。

詳しくは、
http://www.mixp.net/php/894
も、ご参照ください。

2015年1月3日 Qiitaデビューしました。
2014年以前の記事は、
http://www.mixp.net
へどうぞ。--伊良部
[Python&Unix]複数のPDFファイルを1つにする。


はじめに
=====
　連番の複数のPDFファイルを一つにする。

使うもの
-----
- Python(ここでは2.7.9ですが何でも良い。)
- ghostscript(以下の、GSコマンド)
- 連番のpdfファイル
  - 別に連番でなくても良いが、連番だと構成がラク。

やってる事
-----
1. lsコマンドで連番のリストを作成
2. gsコマンドの引数用に、スペース区切りの文字列に変換。
3. gsコマンドを実行

ではさっそく．．．．。
======

ソース
-----
```python
#!/usr/bin/env python
import commands,os
list = commands.getoutput("ls *.pdf").split("\n")

prm = ""

for i in range(len(list)):
	prm =  prm + " " + list[i]

cmd = "gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=all.pdf"+prm
print cmd

commands.getoutput(cmd)


```

一カ所for文があるけど、きっともっと簡単な方法があるハズ・・・。
(おしまい。)


コメント頂いたpdftkを使った方法
=========================================

インストール
-------------------------
``` shell
$ brew pull https://github.com/Homebrew/homebrew/pull/25953
$ brew install pdftk
```


その他
=====
[参照](http://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2F%E8%A4%87%E6%95%B0PDF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%921%E3%81%A4%E3%81%AEPDF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B%E6%96%B9%E6%B3%95%E3%83%BBgs%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89)
Neo4jをBasic認証とSSLで外部からアクセス可能にする

# はじめに
Neo4jのデフォルト設定では、同一ホストからのアクセスのみ許可されているだけです。これだと、クラウド上にNeo4jを配置した場合など、外部からアクセスする際にちょっと扱いづらいので、Neo4jにBasic認証とSSLを有効にして外部からアクセス可能な設定にしてみます。

Neo4jの[公式マニュアル](http://neo4j.com/docs/2.1.6/security-server.html)にもセキュリティに関するページがありますが、ちょっとややこしい感があったのでもう少し簡易な方法です。

# 外部からのアクセスを許可する
まず、Neo4jに外部からアクセスできるよう、```org.neo4j.server.webserver.address=0.0.0.0```の部分のコメントを外します。

```conf/neo4j-server.properties
#let the webserver only listen on the specified IP. Default
#is localhost (only accept local connections). Uncomment to allow
#any connection.
org.neo4j.server.webserver.address=0.0.0.0
``` 

# HTTPSを有効にする

以下の設定をtrueにしてHTTPSを有効にします。

```conf/neo4j-server.properties
# Turn https-support on/off
org.neo4j.server.webserver.https.enabled=true
```

これだけだと、オレオレ証明書によるHTTPSです。ちゃんとした証明書を使いたい場合は、公式マニュアルに方法が[書いてある](http://neo4j.com/docs/2.1.6/security-server.html)のでそちらを参照してください。

# Basic認証を設定する
今回は、Neo4jにBasic認証機能を追加してくれる[プラグイン](https://github.com/neo4j-contrib/authentication-extension)を使ってみます。

## プラグインのダウンロード
こちらの[ページ](https://github.com/neo4j-contrib/authentication-extension)にアクセスしてページの一番下にあるjarファイルをダウンロードします。
今回は、DBがNeo4j community 2.1.6だったので、
```authentication-extension/authentication-extension-2.1.5-1.0-SNAPSHOT.jar```
というのを使ってみました。微妙にバージョンが違うようですが気にしない。

## プラグインの保存
ダウンロードしたjarファイルをNeo4jがインストールされている場所下の```plugins```フォルダ配下に保存します。

## 設定ファイルの編集

設定ファイルに以下の行を追記します。
```username```と```password```の部分は、Basic認証で使用するユーザ名とパスワードです。

```conf/neo4j-server.properties
org.neo4j.server.credentials=username:password
org.neo4j.server.thirdparty_jaxrs_classes=org.neo4j.server.extension.auth=/auth
```

最後にNeo4jを再起動して設定完了です。
これで、ブラウザおよびAPIからのアクセスなどからアクセスした際、Basic認証を求められるようになります。

```
https://neo4j.hoge:7473/
```
Firefox OS デスクトップクライアント「b2g」を Linux ( Fedora 20 ) にインストールする

#Firefox OS を Linux ( Fedora 20 ) にインストールする手順。

##前もって準備すべきパッケージ類

    autoconf 2.13
    bison
    bzip2
    ccache
    curl
    flex
    gawk
    git
    gcc / g++ / g++-multilib
    java sdk (jdk)
    make
    OpenGL shared libraries
    patch
    X11 headers
    32-bit ncurses
    32-bit zlib
    mercurial
    dbus-glib-devel
    yasm
    gstreamer-devel
    gstreamer-plugins-base-devel

##ソースコードのダウンロード
###mercurialの場合

    hg clone http://hg.mozilla.org/mozilla-central
    cd mozilla-central
    hg pull -u

###gitの場合

    git clone https://github.com/mozilla/gecko-dev
    cd gecko-dev
    git pull

###.mozconfig の作成
ダウンロードしてきたディレクトリの中に「.mozconfig」を作成する。
内容は以下の通り。

    . "$topsrcdir/b2g/config/mozconfigs/common"
 
    mk_add_options MOZ_OBJDIR=../build
    mk_add_options MOZ_MAKE_FLAGS="-j9 -s"
 
    ac_add_options --enable-application=b2g
    ac_add_options --disable-libjpeg-turbo
  
    # This option is required if you want to be able to run Gaia's tests
    ac_add_options --enable-tests
 
    # turn on mozTelephony/mozSms interfaces
    # Only turn this line on if you actually have a dev phone
    # you want to forward to. If you get crashes at startup,
    # make sure this line is commented.
    #ac_add_options --enable-b2g-ril

###ビルド

    ./mach build

##Gaia のダウンロード

    git clone https://github.com/mozilla-b2g/gaia
    cd gaia
    git pull

###custom-setting.json の作成
gaia/build/config/custom-setting.json を作成。
内容は以下の通り。

    {
        "lockscreen.enabled": false,
        "lockscreen.locked": false,
        "devtools.debugger.remote-enabled": true
    }

###プロファイルの作成
gaia ディレクトリの中で make を実行する。

    make DESKTOP_SHIMS=1 NOFTU=1 DEBUG=1

##デスクトップクライアントの実行
b2gの .mozconfig の MOZ_OBJDIR　で指定したところに、build ディレクトリができているので、その中の「dist/bin/b2g」を実行する。

    /path/to/b2g -profile /path/to/gaia/profile-debug

###起動画面
![FirefoxOS_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/0f06624d-d3d1-8012-0287-4ff4ec9323ca.jpeg)

###ホーム画面
![FirefoxOS_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/39434/78e09a3e-f6a0-725b-8ff5-46a2c76b0c28.jpeg)

もう少し詳しい説明は、
http://www.mixp.net/firefox-os/1030
にあります。


2015年1月3日 Qiitaデビューしました。
2014年以前の記事は、
http://www.mixp.net
へどうぞ。--伊良部
ファイルパスを表す文字列から親のフォルダ部分を取り出す関数


車輪の再発明してる感が半端ないが応用が効きそうなのでメモ。

```vbnet
function getParentDir(byval path)
    dim splitedPath
    splitedPath = split(path, "\")
    splitedPath(ubound(splitedPath)) = ""
    getParentDir = join(splitedPath, "\")
end function

msgbox getParentDir("C:\hoge\fuga\poge.txt")
' C:\hoge\fuga\

msgbox getParentDir("\\hoge\fuga\poge.txt")
' \\hoge\fuga\

msgbox getParentDir("\\192.168.0.100\hoge\fuga\poge.txt")
' \\192.168.0.100\hoge\fuga\

```
Railsのルーティングをカスタマイズして、主キー以外をactionに渡す方法

[ブログ転載](http://shinyatto.hateblo.jp/entry/2015/01/03/163039)


# 要求された事例

ユーザのモデルはUserだが、ユーザ詳細画面のURLを `/users/<user.id>`はいやだ！　`/people/<user.nickname>`にしたい！！ Viewでのリンクもlink_to を使いたい！！！
  

  
# 解決方法
pathメソッドでのパラメータの渡し方がキモだった。


**route.rb**

```rb
Rails.application.routes.draw do
  get '/people/:nickname' => 'users#show', as: :people
end
```
`as: :people`の指定で `people_path`メソッドが作られるので、link_toに渡せる。


**users_controller.rb**

```rb
class UsersController < ApplicationController
  def show
    @user = User.find_by(:nickname => params[:nickname])
  end
end
```


**hoge.html.erb**

```erb
<%= link_to people_path(nickname: user.nickname) %>
```


これで解決。

# 実際と戸惑い
ビューで毎回 `people_path(nickname: user.nickname)` と書くにはD…
`user.link_to`のようにメソッドチェーンにしたいけど、モデルに書いてはいけないような気がしたので、helperメソッドにした。


**users_helper.rb**

```rb
module UsersHelper
  def people_link_to(user)
    people_path(nickname: user.nickname)
  end
end
```

こういった "データには関係ないのでモデルではないが、モデルにひもづいているhtml生成のメソッド"ってどこに書けばいいのか相変わらず謎。
gem install pg のエラー対処


## エラー内容

```gem install pg```をしようとしたら下記のようなエラーが発生した。

```
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing pg:
        ERROR: Failed to build gem native extension.

C:/Ruby/bin/ruby.exe extconf.rb
checking for pg_config... no
No pg_config... trying anyway. If building fails, please try again with
 --with-pg-config=/path/to/pg_config
checking for libpq-fe.h... no
Can't find the 'libpq-fe.h header
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=C:/Ruby/bin/ruby
        --with-pg
        --without-pg
        --with-pg-dir
        --without-pg-dir
        --with-pg-include
        --without-pg-include=${pg-dir}/include
        --with-pg-lib
        --without-pg-lib=${pg-dir}/lib
        --with-pg-config
        --without-pg-config
        --with-pg_config
        --without-pg_config


Gem files will remain installed in C:/Ruby/lib/ruby/gems/1.8/gems/pg-0.10.1 for
inspection.
Results logged to C:/Ruby/lib/ruby/gems/1.8/gems/pg-0.10.1/ext/gem_make.out
```

libpq-fe.h が見つからないとのこと。

## 解決方法
postresqlをインストールすれば一緒にインストールされる。

```
$ brew install postgresql
```
文字列と数値の相互変換

Swiftに組み込まれているユーティリティだと何もできないに等しいので、諦めてCの関数（Darwinモジュール）やFoundationモジュールの関数を使うといいようです。

なお文字列化についてはsprintf的なものを [pure Swiftで実装](https://github.com/gfx/Swift-StringFormat) もしてみたのですが、非常に遅いので素直にFoundationによるString拡張である `String(format:arguments:)` を使うのがよさそうです。

## String -> Int

`String#toInt():Int?` だとInt32を、 `Darwin.atoll()` だとInt64に対応できます。ただし挙動が微妙に異なります。

また、Cの関数はエラーの通知をerrnoで行うため忘れがちだということに注意してください。

```swift
// swift playground
import Darwin
"123".toInt() // {Some 123}
atoll("123") // 123

// 大きすぎる値の場合
"10000000000000000000".toInt() // nil
atoll("10000000000000000000") // 9,223,... （黙ってオーバーフロー）

// 整数でない文字列
"foo".toInt() // nil
atoll("foo") // 0
errno == EINVAL // true （errnoでエラーを通知する）

// 整数から始まるが厳密な整数ではない文字列
"12.3".toInt() // nil
atoll("12.3") // 12
```

## String -> Double

`Darwin.atof`が使えます。

```swift
import Darwin

atof("12.34") // 12.34
atof("1e2") // 100.0
```

## Int -> String

10進法なら文字列の式展開が、16進法ならFoundationがString型に型拡張で追加するString(format:arguments:)が使えます。

```swift
import Foundation

let x = 0xcafe
"\(x)" // "51966"

String(format:"%08x", 0xcafe)  //   "0000cafe"
String(format:"%08X", 0xcafe)  //   "0000CAFE"
String(format:"%#08x", 0xcafe) // "0x0000cafe"
```

## Double -> String

適当でよければ文字列の式展開が、精度などを細かく指定したいならString(format:arguments:)が使えます。

```swift
import Foundation

let x = 1.0

"\(x)" // "1.0"
String(format:"%.2f", x) // "1.00"
String(format:"%g", x)   // "1"
String(format:"%e", x)   // "1.000000e+00"
```
[Swift]割と役立つ！！sortを調べたのでメモ


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##sort(昇順・降順・逆さま)

```
//昇順
var arr: [Int] = [1, 3, 2, 6, 1, 4, 9, 8]
arr.sort{$0 < $1}
println(arr)
//[1, 1, 2, 3, 4, 6, 8, 9]


//降順
var arr2: [Int] = [1, 3, 2, 6, 1, 4, 9, 8]
arr2.sort{$0 > $1}
println(arr2)
//[9, 8, 6, 4, 3, 2, 1, 1]


//逆さま
var arr3: [Int] = [1, 3, 2, 6, 1, 4, 9, 8]
println(arr3.reverse())
//[8, 9, 4, 1, 6, 2, 3, 1]
```

###sortを分解していく

```
sort(arr) {
	(s0: String, s1: String) -> Bool in 
	return s0 > s1
})
```

コンパイラの型推論に任せる

```
sort(arr) { s0, s1 in 
	return s0 > s1 
})
```

さらに引数も返り値も省略できます！！

```
sort(arr, >)
```


さらに$nを使用すれば引数を省略してこんな風にも

```
sort(arr) { $0 > $1 }
//または
sort(arr, { $0 > $1 })
//または
arr.sort{ $0 > $1 }
```

[takabosoft](http://qiita.com/takabosoft)様ご指摘ありがとうございます！！！
iOS8,7両対応のUIAlertView

iOS7,8両対応の汎用アラートビュー
ご自由にお使いください

2015/1/3追記
iOS7でバグってました・・・
nil引数でもUIAlertControllerを使うことで落ちます
のでAnyObjectに変更しました

```iOS:AlertView.swift

import UIKit

// iOS7,8両対応アラートビュー
class AlertView: NSObject, UIAlertViewDelegate {
    var clickedButton:((AnyObject?,Int?)->())?
    
    
    // アラートイベント
    func alertView(alertView: UIAlertView,clickedButtonAtIndex buttonIndex: Int){
        clickedButton?(alertView,buttonIndex)
    }
    
    override init(){
        super.init()
    }
    
    func showAlert(title:String,message:String,parent:UIViewController,callback:((AnyObject?,Int?)->())? = nil){
        if greaterThanOrEqual(8,0,0){
            
            self.clickedButton = nil

            let alert:UIAlertController = UIAlertController(title:title,
                message: message,
                preferredStyle: UIAlertControllerStyle.Alert)
            
            alert.addAction(UIAlertAction(title: "OK",
                style: .Default,
                handler: { (action) -> Void in
                    if(callback != nil){
                        callback!(action,nil)
                    }
                }
                ))

            // 表示する
            parent.presentViewController(alert, animated: true, completion: nil)
            
        }else{
            let alert: UIAlertView = UIAlertView(title: title,
                message: message,
                delegate: self,
                cancelButtonTitle: "OK")
            
            self.clickedButton = callback
            
            alert.show()
        }
    }    
}

```

使い方

<pre>
var alertView = AlertView()
alertView.showAlert("タイトル",
                            message: "メッセージ",
                            parent: self,// 親ViewController
                            callback:{(alert,buttonIndex)->Void in
// OKボタン押されたときの処理
// nilでなければiOS7
var alertView = alert as? UIAlertView
// nilでなければiOS8
var action = alert as? UIAlertAction
                            })

</pre>
多段SSHの方法


よく忘れるのでメモ
Amazon VPCなどを使っているときにPrivateIPしか割り当てられていないサーバにログインする方法。
鍵はローカルに持ちたいので多段SSHする。

自分のローカルマシンの.ssh/configに記載する。

```conf
Host <踏み台サーバ>
  HostName <public IPアドレス>
  User ec2-user
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking=no
  PasswordAuthentication no
  IdentityFile <鍵のパス>
  IdentitiesOnly yes
  LogLevel FATAL
  PermitLocalCommand  yes

Host <Privateのサーバ>
 HostName <Private IP>
 User ec2-user
 IdentityFile <鍵のパス>
 ProxyCommand ssh -W %h:%p <踏み台サーバ>

```
[Swift]遅延評価(lazy)を調べたのでメモ


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで **Braian** になっちゃった。

##lazyとは何か？
**初期化のコストカット** で使用されます！
変数を初期化する際にlazyを先頭につけておくと、実際にその値が参照されるまでは生成しないようにできる。つまりは初期化のコストカットですね。
(プロパティの初期化をインスタンスの初期化ではなく、そのプロパティにアクセスした時に初めて行われるようにすることができる)

**@lazyをつける時は必ず変数(var)で宣言しなければならない！！**

```
struct SomeStructure {
	@lazy var value = OtherStructure()
}

//変数valueはプロパティにアクセスされるまで初期化されない。

```

メモリーの消費を抑えることもできるみたいです。わかりませんが！！
【mkdirからデプロイまで3分】Sinatra+Haml+Sass+Coffee でサクッとHerokuに公開して捨てるwebアプリ

# あいさつ

Rubyでゴニョゴニョして、Haml+Sass+Coffeeでサクッとviews作って

Herokuにサクッとpushして公開して吐いて捨てるようなアプリの作り方です.

チャチャッと動いたモノを見せたい時とかに便利

3分というのはビジネスロジックの構築を除くプロジェクトのひな形作ってデプロイに至るまでの時間.

適当なひな形を持ってきた方が早いかもしれませんが、一回は手を動かさないとなんか気持ち悪い人向け.


今回使ったのはここに置いときました、jqueryとか定番ライブラリ入れとくと便利そう

https://github.com/gogotanaka/herokuSinatraMinimum


# 以下説明

### 手順1: フォルダを作ってgemを揃える

今回は`your_app`というアプリを作る事とします.

    $ mkdir your_app; cd your_app
    $ git init
    $ bundle init

`Gemfile` が作られるので以下のように編集

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

gem 'sinatra'

# Assets
gem 'haml'
gem 'sass'
gem 'coffee-script'

group :development do
  gem 'foreman'
  gem 'heroku'
end
```

    $ bundle install --path vendor/bundle

### 手順2: 諸々のファイルを用意

    $ mkdir views
    $ touch app.rb Procfile views/index.haml

最低限必要なのは`app.rb Procfile views/index.haml`の3つだけ、

とりあえず動くように以下のように編集.

```app.rb
require 'bundler/setup'
require 'sinatra'

require 'haml'
require 'sass'
require 'coffee-script'

get '/' do
  @mes = 'Hello!'
  haml :index
end
```

```sh:Procfile
web: bundle exec ruby app.rb -p $PORT
```

```views/index.haml
:sass
  h1
    color: red

:coffee
  alert 'Hello!'

%h1= @mes
```

### 手順3: ローカル確認

    $ bundle exec foreman start

![Screenshot 2015-01-02 14.57.59.png](https://qiita-image-store.s3.amazonaws.com/0/30440/154e18a7-c5b8-f505-2fff-1ad6b0722d2b.png)

いいね

### 手順4: Herokuにpush

    $ bundle exec heroku create your-project
    $ git add -A; git commit -m 'Init'
    $ git push heroku master
    $ bundle exec heroku open
    

完成〜

https://your-project.herokuapp.com/

本気でやれば1分30秒台目指せるな.


あとはJQueryやらお好きなライブラリを入れて、忍ばせておくと便利です

### 手順5: 見せびらかして捨てる
AWS の自分用メモ (EC2/VPC/SecurityGroup等)

インフラ知識の乏しい人がAWSを勉強している。そのメモ。
読んでくれた方の指摘とか大歓迎です。

#1. VPC (*VirtualPrivateCloud*)
* 仮想ネットワーク領域、またはその領域の設定をできる機能。
* 複数のサブネットを持たせることができ、同一VPC内ではサブネット間の通信が特に設定などをしなくてもデフォルトで可能。
* VPC同士は独立している。
* VPC毎にプライベートIPアドレスを割り当るが、サブネットのIPアドレスはVPCのIPアドレスの範囲内でしか設定できない。
* VPCに割り当てられるIPアドレスは最大で「/16」(約65000)。
* **ElasticIPアドレス**(グローバルIPアドレスのこと。略：EIP)はVPCの設定として持っており、VPCにEIPを作成し、それをインスタンス(仮想サーバー)と関連付けることでインスタンスにグローバルIPアドレスを付与する。
* EIPはVPC内の複数インスタンスに付け替えることもできる。(※1)

※1 - 正確には**ENI**という仮想NICにEIP割り当て、ENIをインスタンスに設定する

#2. EC2 (*AmazonElasticComputeCloud*)
* CPU、メモリ、ストレージ、**AMI**(※2)を組み合わせて仮想サーバー(インスタンス)を作成できる機能。
* インスタンスはVPC内、サブネット内に構築。
* インスタンス毎にメタデータを**タグ**として最大10個まで設定できる。(key/value形式)
* 専用のAMIを選択することでNATも作成することができる。

※2 - AMI (*AmazonMachineImages*)：OSやアプリケーションなどのソフトウェアをパッケージ化したテンプレートイメージ。

#3. セキュリティ
### Ⅰ．SecurityGroup
* インスタンス毎に設定が必要なファイアーウォール(のようなもの)。
* 送信元(インバウンド)と送信先(アウトバウンド)を別々に設定。
* 許可するプロトコルやポート、IPアドレスを個別(/32)または範囲(CIDR)で指定。
* 1インスタンスにつき最大5つのセキュリティグループが設定可能。
* 1つのセキュリティグループには最大50の設定が可能。

### Ⅱ．NACL (*NetworkAccessContralList*)
* サブネット毎に任意に設定できるファイアーウォール(のようなもの)。(※3)
* 送信元と送信先を設定できるが、ステートレスなのでインバウンドに対するレスポンスはアウトバウンドのルールに則ります。(逆も然り)
* プロトコルやポート、IPアドレスの範囲(CIDR)を指定し、許可/拒否を設定。
* 1サブネットに1つしか設定できません。
* 1つのNACLには最大40の設定が可能。

※3 - 正確にはデフォルトで全ての通信を許可する設定がある。

##おわり
間違っていたらごめんなさい。
ちなみに「最大○○個まで」と書いてある上限値は申請することで緩和できるものもあるみたいです。
詳しくは[コチラ](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_Appendix_Limits.html)。
次回はELBやRDSなどを書くつもりです。
名前空間に既にロードされているクラスと、importしたいクラスの名前衝突を回避する

`Compiler`という名のクラスをJavaからインポートしたいとします。

```clj
(ns leiningen.zinc
  "Typesafe scala zinc incremental compiler plugin for leiningen."
  (:require [leiningen.classpath :as classpath]
            [leiningen.core.main :as main])
  (:import  (com.typesafe.zinc Compiler Setup)))
```

一見問題なさそうですが、`ns`マクロを評価すると、下記のようなエラーが出力されます。

```
Caused by: java.lang.IllegalStateException: Compiler already refers to: class clojure.lang.Compiler in namespace: leiningen.zinc
```

`com.type.safe.zinc.Compiler`が、暗示的に参照されている`clojure.lang.Compiler`と衝突しているようです。

`ns`マクロは、デフォルトで、`clojure.core`内の全ての関数、`java.lang`内の全てのクラス、そして`clojure.lang.Compiler`をマップに加えてから生成されます。


まず思いつくのは、`require`の[:as](https://clojuredocs.org/clojure.core/require)オプションで別名をつけてやることで名前衝突を回避できるかどうかですが、この場合、`clojure.lang.Compiler`は既にロードされているので、ライブラリをロードする`require`を用いることができませんし、`as`は名前空間に別名をつけるもので、クラスは対象でありません。

では、`import`側でエイリアスをつけることは可能でしょうか？docstringと[ソースコード](https://github.com/clojure/clojure/blob/clojure-1.6.0/src/clj/clojure/core.clj#L3136)を見る限り、サポートされていないようです。

更に調べると、[refer](https://clojuredocs.org/clojure.core/refer)を用いると、名前空間内のパブリック変数を参照し、かつ`:exclude`、`:only`、`:rename`のフィルターをかけることができるようです。

まずは、名前空間のマップにバインドされている内容の一覧を取得してみましょう。

```clj
leiningen.zinc=> (ns-map 'leiningen.zinc)
{primitives-classnames #'clojure.core/primitives-classnames, +' #'clojure.core/+', Enum java.lang.Enum,
...
number? #'clojure.core/number?, Compiler clojure.lang.Compiler,...
```

名前空間のマップはVarと、Classの両方を含んでいます。`refer`はVarにしか適用できませんので、`refer`のフィルタをクラスである`clojure.lang.Compiler`に適用させることはできません。

そこで、`ns-unmap`を用いて、名前空間マップからCompilerのエントリを取り除き、それから改めて、`import`を`ns`マクロのキーワードとしてではなく、`import`マクロを直接呼び出すことで、`Compiler`エントリを追加しています。

```clj
(ns leiningen.zinc
  "Typesafe scala zinc incremental compiler plugin for leiningen."
  (:require [leiningen.classpath :as classpath]
            [leiningen.core.main :as main]))
(ns-unmap *ns* 'Compiler)
(import  (com.typesafe.zinc Compiler Setup))
...
```

このような操作が煩雑であれば、`import`をせず、`com.typesafe.zinc.Compiler`をフルパスで指定して使えば良いでしょう。
mecab-rubyのMeCab::Tagger#parseToNodeをEnumberatorする


MeCabは伝統的なライブラリーなので、インタフェースの中にEnumberatorという概念がない。mecab-rubyはSWIGで実装されるものなので、MeCabのC++のAPIをそのままにrubyに接続することである。だからMeCab::Tagger#parseToNodeの戻り値もEnumberatorではなく、C++風のMeCab::Nodeである。

```ruby
# -*- coding: utf-8 -*-

require "mecab"

node = MeCab::Tagger.new.parseToNode("すもももももももものうち")

while node
  puts "#{node.surface}\t#{node.feature}"
  node = node.next
end

```

Enumberatorの戻り値が欲しいから、調べると、[mickey24](http://d.hatena.ne.jp/mickey24/about)さんの[『mecab-rubyのMeCab::Tagger#parseToNodeの戻り値が気に入らないのでアレする](http://d.hatena.ne.jp/mickey24/20120507/mecab_ruby_parse_to_node_fix)』という文を拝読した。mickey24さんの方法は下記である。

```ruby
# -*- coding: utf-8 -*-

require "MeCab"

module MeCab
  class Tagger
    # parseToNodeの別名（エイリアス）を作ってprivate化する
    alias_method :parseToNode_org, :parseToNode
    private :parseToNode_org

    # parseToNodeを再定義する
    def parseToNode(*args)
      #オリジナルのparseToNodeを呼び出す
      node = parseToNode_org(*args)
      # NodeのArrayを作って返す
      nodes = []
      while node
        nodes.push(node)
        node = node.next
      end
      nodes
    end
  end
end

if __FILE__ == $0
  nodes = MeCab::Tagger.new.parseToNode("俺、この戦争が終わったら結婚するんだ。")

  # Array#eachが使える！
  nodes.each do |node|
    puts "#{node.surface}\t#{node.feature}"
  end
end
```

使い方はRuby風になった、良かった。

でも、厳しく極めて考えて見ると、少し問題があると思う：

* 少しメモリを無駄にする。
    MeCab::Nodeは「単方向線形連結リストのノード」であり、NodeのArrayを作って返してしまうと、少しメモリを無駄にする。

* 再定義する影響が大きい。
    Ruby特有なやり方で、MeCab::TaggerをOpenしてparseToNodeを再定義するのは、慎重にしなければならないことである。再定義したら、**古い呼び出し方が無効になる**と、特に大きいプロジェクトの中に、影響が大きすぎると思う。柔軟に再定義したほうかいいと思う。

上記の理由で、下記の再定義やり方を考えた：

```ruby
# -*- coding: utf-8 -*-

require "mecab"

module MeCab
  class Tagger
    # parseToNodeの別名（エイリアス）を作ってprivate化する
    alias_method :parseToNode_org, :parseToNode
    private :parseToNode_org

    def parseToNode(*args)
      #オリジナルのparseToNodeを呼び出す
      node = parseToNode_org(*args)
      return node unless block_given?

      # NodeのEnumberatorを作って返す
      while node
        yield node
        node = node.next
      end
    end
  end
end

if __FILE__ == $0

  # Ruby風に使える
  MeCab::Tagger.new.parseToNode("俺、この戦争が終わったら結婚するんだ。") {|node|
    puts "#{node.surface}\t#{node.feature}"
  }

  # 古い使い方も出来る
  node = MeCab::Tagger.new.parseToNode("すもももももももものうち")
  while node
    puts "#{node.surface}\t#{node.feature}"
    node = node.next
  end

end
```

要するに、

* 互換性を得る: 
    block_given?での判断で、古い呼び出し方も出来る。

* メモリ安定：
    yield nodeで、「単方向線形連結リスト」から、「単方向イテレータ」になる。配列を構造するのを避けた。
【メモ】Ubuntu Unityが壊れたので復元


dconf editorをいろいろいじっていたら、突然あぼーんした。  
背景画像、デスクトップは表示される。一応右クリックメニューも大丈夫だが、何しろGUIが全部吹っ飛んでしまったので、非常にビビりました。  

というわけでメモ。以下の記事をホントそのまんまやっただけですが・・・

http://m12i.hatenablog.com/entry/2014/05/24/100539


>1.ログイン後 Ctrl＋Alt＋F1キー入力 でコンソール画面に遷移。

>2.「（マシン名） login:_」という表示されるのでログインユーザ名を入力しEnter（パスワードを聞かれたら適宜入力しEnter）。

>3.「DISPLAY=:0.0 gnome-terminal」と入力しEnter。

>4.Alt＋F7キーを押下するとデスクトップ画面に復帰するが端末ウィンドウが新たに表示されている。

>5.このターミナル上で「dconf reset -f /org/compiz/」と入力してEnter。

>6.「sudo shutdown -r now」と入力してEnter。OSが再起動する。

>7.再起動後ログインをするとランチャーやツールバーが復帰していた。

これでなんとか直りました。

ただしUnityの設定はリセットされているので、再設定が必要ですが。
シェルスクリプトでスペースや改行が入っているファイル処理するときには、IFSを設定する。


## IFSを設定する

### 例
```sh:mp4tomp3.sh
#!/bin/bash

IFS=$'\n'

files=$(find . -type f -name "*.mp4")

for file in $files
do
    file_without_extension=${file%.*}
    
    echo "change from "${file}" to "${file_without_extension}.mp3
    ffmpeg -i $file -acodec libmp3lame -ab 64k -ac 1 ${file_without_extension}.mp3
done
```

明示的にIFSを設定することで for ループでスペースなどを含んだファイルを処理するときにファイル名が分割されることがない。

## 参考
- http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/sh-text/sh/node31.html
- http://yanor.net/wiki/?%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%2F%E6%96%87%E6%B3%95%2F%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%20IFS
Rails app を TravisCI と PostgreSQL 9.4 でテストする



# やりたいこと

最新(9.4)のPostgreSQLを使ったRails appをTravisCIでテストしたい。

手元で使ってるSQLite3もついでにテストしておく。

MySQLは一旦おいとく。

# 手順

## Gemfile(抜粋)

```Gemfile
group :development, :test do
  gem 'sqlite3', '~> 1.3.10'
end

group :production, :test do
  gem 'pg', '~> 0.17.1'
end
```

`:test` グループで `sqlite3` と `pg` がインストールされるようにする。手元のMacで動かすために `brew install postgresql` が必要になってしまったのが難点ではある。

## `config/database.travis.yml`

TravisCI用の `database.yml` を用意しておいて、テスト実行前にコピーする。

```config/database.travis.yml
sqlite: &sqlite
  adapter: sqlite3
  database: db/<%= Rails.env %>.sqlite3

postgresql: &postgresql
  adapter: postgresql
  username: postgres
  password:
  database: YOUR_APP_NAME_<%= Rails.env %>
  min_messages: ERROR

defaults: &defaults
  pool: 5
  timeout: 5000
  host: localhost
  <<: *<%= ENV['DB'] || "postgresql" %>

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults
```

## `.travis.yml` (抜粋)

事前処理をいろいろ指定している。

* `before_install` : PostgreSQL 9.4をインストール
	 * 走ってるpostgresqlを止める
	 * PostgreSQL 9.1〜9.3を削除
	 * `pg_hba.conf` を書き換え
		 * http://www.postgresql.org/docs/9.4/static/auth-pg-hba-conf.html
		 * デフォルトではUnixユーザとpostgresのユーザ名が違うと怒られる
* `env` : sqliteとpostgresqlでテストするよ、と宣言
* `script` : テストを実行するコマンド
* `before_script` : テスト実行前の操作
	* `config/database.travis.yml` をコピー
	* テスト用データベースを作成

```.travis.yml
before_install:
  - sudo /etc/init.d/postgresql stop
  - sudo apt-get update
  - sudo apt-get purge postgresql-9.1 postgresql-9.2 postgresql-9.3
  - sudo apt-get language-pack-es postgresql-9.4
  - sudo chmod 777 /etc/postgresql/9.4/main/pg_hba.conf
  - sudo echo "local   all         postgres                          trust" >  /etc/postgresql/9.4/main/pg_hba.conf
  - sudo echo "local   all         all                               trust" >> /etc/postgresql/9.4/main/pg_hba.conf
  - sudo echo "host    all         all         127.0.0.1/32          trust" >> /etc/postgresql/9.4/main/pg_hba.conf
  - sudo echo "host    all         all         ::1/128               trust" >> /etc/postgresql/9.4/main/pg_hba.conf
  - sudo /etc/init.d/postgresql restart
  - psql --version
env:
  - DB=sqlite
  - DB=postgresql
script:
  - RAILS_ENV=test bundle exec rake db:migrate --trace
  - bundle exec rake db:test:prepare
  - bundle exec rake
before_script:
  - cp config/database.travis.yml config/database.yml
  - psql -c 'create database YOUR_APP_NAME_test' -U postgres
```

# 参考リンク

* http://stackoverflow.com/questions/9321153/rails-database-setup-on-travis-ci
* http://docs.travis-ci.com/user/using-postgresql/
* https://github.com/travis-ci/travis-ci/issues/2983
* https://code.google.com/p/plv8js/source/browse/.travis.yml

# ひとりごと

* HerokuはまだPostgreSQLが9.3なので、Travisで用意されている9.3を使えば簡単だったはず
* でも近いうちに上がるだろうし、9.4でやらない理由はない
* …と思ったらわりといらない苦労をしてしまった :cry:
マップから使いたいキーバリューペアを抽出し、なおかつデフォルト値もセットしたい

Clojureのフレームワークでは、設定値をマップで渡されて、関数内で必要なものを抽出して用いるケースが多いようです。（例：Leiningenのproject.clj。[pprintプラグイン](https://github.com/technomancy/leiningen/tree/master/lein-pprint)を使って表示してみます。）

```clj
$ lein pprint
Leiningen's classpath: ../src::/usr/local/Cellar/leiningen/2.5.0/libexec/leiningen-2.5.0-standalone.jar
Applying task pprint to []
{:description "test project using lein-zinc",
 :compile-path
 "/Users/kenjin/github/lein-zinc/test-project/target/classes",
 :deploy-repositories
 [["clojars"
   {:password :gpg,
    :username :gpg,
    :url "https://clojars.org/repo/"}]],
 :group "test-project",
 :useZincServer true,
 :license
 {:name "Eclipse Public License",
  :url "http://www.eclipse.org/legal/epl-v10.html"},
 :resource-paths
 ("/Users/kenjin/github/lein-zinc/test-project/dev-resources"
  "/Users/kenjin/github/lein-zinc/test-project/resources"),
 :uberjar-merge-with
...
```

で、このマップが、Leiningenのプラグインの関数に引数として渡されます。

```clj
(defn zinc "lein zinc plugin entry point" 
  [project]
  (let [{:keys [useZincServer zincPort]
         :or {useZincServer false
              zincPort 9999}} project]
  (main/debug "zinc task is invoked")
  (main/debug "zincPort:" zincPort)
  (main/debug "useZincServer:" useZincServer)))
```

マップバインディングフォームのキーワード[:keys](http://clojure.org/special_forms#Special Forms--Binding Forms (Destructuring)-Map binding destructuring)を用いることで、使いたいキーワードをマップから抽出して、そのキーワード名がそのまま変数となり、値を格納します。（[clojure.core/keys](https://clojuredocs.org/clojure.core/keys)とは違うことに注意！）

```
$ DEBUG=true lein zinc
Leiningen's classpath: ../src::/usr/local/Cellar/leiningen/2.5.0/libexec/leiningen-2.5.0-standalone.jar
Applying task zinc to []
zinc task is invoked
zincPort: 9999
useZincServer: true
```

`project.clj`にキーバリューが指定されていればその値が用いられます。（上記の例では`useZincServer`)　但し、存在していない場合は`nil`が返されます。デフォルト値を設定したい場合は、キーワード[:or](http://clojure.org/special_forms#Special Forms--Binding Forms (Destructuring)-Map binding destructuring)を用います。上記の例では、`project.clj`に`zincPort`が設定されていないので、デフォルト値の`9999`が用いられています。
Elastic Beanstalk でデプロイ後のフックで delayed_job 等を実行する (Ruby 2.1 (Puma))

Elastic Beanstalk の Configuration を 
64bit Amazon Linux 2014.03 v1.0.9 running Ruby 2.1 (Puma) にした際に
64bit Amazon Linux 2014.02 running Ruby 1.9.3 で使っていた方法ではエラーが出たのでメモ。
(どのバージョンから変更になったのかはわかりません)

従来通り Elastic Beansgtalk 環境の /opt/elasticbeanstalk/hooks/appdeploy/post/ 以下に、
デプロイ後実行されるスクリプトが配置されるように .ebextensions 以下の設定を行うのは同じだが、
以下の点で既存の設定に修正が必要になった。

* 環境変数は . /opt/elasticbeanstalk/containerfiles/envvars で読み込む
* source $EB_ROOT/containerfiles/scripts/use-app-ruby.sh でフック内で使用する ruby を設定


```.ebextensions/99_delayed_job.config
commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      # 以下2行が必要!!!
      . /opt/elasticbeanstalk/containerfiles/envvars 
      source $EB_ROOT/containerfiles/scripts/use-app-ruby.sh
      cd $EB_CONFIG_APP_CURRENT
      su -c "RAILS_ENV=production bin/delayed_job --pid-dir=$EB_CONFIG_APP_SUPPORT/pids restart" $EB_CONFIG_APP_USER
```

ちなみに 64bit Amazon Linux 2014.02 running Ruby 1.9.3 では、以下のように
envvars のパスが異なり、use-app-ruby.sh も不要でした。　

```.ebextensions/99_delayed_job_old.config
commands:
  create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true
files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      # envvars のパスが違う
      . /opt/elasticbeanstalk/support/envvars 
      cd $EB_CONFIG_APP_CURRENT
      su -c "RAILS_ENV=production bin/delayed_job --pid-dir=$EB_CONFIG_APP_SUPPORT/pids -n 4 restart" $EB_CONFIG_APP_USER
```
様々なプログラミング言語を試しに使ってみたいときにCoding Groundが便利

## Coding Ground - 多言語対応オンラインコンパイラ・エディタ -

**[Coding Ground](http://www.tutorialspoint.com/codingground.htm)**は、Tutorials Point社がウェブサイト上で無料で提供しているオンラインコンパイラ環境兼コードエディタです。下記にあるような様々なプログラミング言語やそのメジャーなライブラリをウェブブラウザ上で編集し、実行結果をその場で確認できる、便利なサービスです。

![codingground.png](https://qiita-image-store.s3.amazonaws.com/0/38958/05fef5f4-be61-36e6-3265-aadbc6fa6b91.png)

試しにScalaで素数検索をしてみた画面がこちらです。
![codingground_scala.png](https://qiita-image-store.s3.amazonaws.com/0/38958/68671e58-8f4d-3204-d147-06534eb21394.png)
プロジェクトを短縮URLで共有できる機能がついていますので、私のこのコードそのものをいじってみたい方は[こちらのページ](http://goo.gl/XK8wsy)へどうぞ<sup><a href="#1" name="#1-ret">※</a></sup>。
※[object Object]というエラーが表示された場合には、何度かページをリロードしてみてください。<a href="#1-ret" name="1">↩</a>

特定の分野のプログラミング言語をお試しで実行できるクラウドサービスは多々ありますが、Coding GroundはJava、Rub、C++、Python、JavaScriptはもちろんのこと、Objective-CやCOBOL、Erlang、VB.net、GOに至るまで実に広範な言語をカバーしています。また、各言語のプロジェクトをGitHub, Dropbox等に保存する機能も付いています。色テーマが選べること、vimやEmacsの入力方式に切り替えることができる点も良いです。

ついでなので、全くさわったことのないアセンブリ言語でHello Worldもしてみました。言語のことはよく知りませんが、開発環境を整えなくてもとりあえずコードを走らせる極初歩的な段階は簡単にできました。
![codingground_nasm.png](https://qiita-image-store.s3.amazonaws.com/0/38958/4dd07916-2754-0462-546f-fdeaf7c65219.png)

いけてない点としては、画面右または下側のLinuxのコマンドターミナルでの入力速度が非常に緩慢なことと、クラウドストレージサービス関連の一部機能が開発中で使えないこと、ウェブブラウザの関係でエディタの端が隠れて表示できなくなったりする現象がたまにあること、があげられますが、今後ブラッシュアップされていくでしょう。

はてなブックマークがまだ一つも付いていなかったので比較的新しいオンラインサービスだと思います。便利ですので、様々なプログラミング言語をさくっと試したいというときにはCoding Groundを使ってみてはいかがでしょうか。
Clojureでのrequireとdirectory

Clojureでのrequireと名前空間の関係の簡単な整理。多分Javaと同じだと思うけれど、ディレクトリと名前空間を違いをよく理解していなかったので備忘録として。

まずはカレントディレクトリに以下のソースを置く。

```clj
(ns com.lewuathe.hello)

(defn hello
  [name]
  (str "Hello," name))
```

[Leiningen](http://leiningen.org/)のREPLから参照する。

```bash

% lein repl
nREPL server started on port 52380 on host 127.0.0.1 - nrepl://127.0.0.1:52380
REPL-y 0.3.5, nREPL 0.2.6
Clojure 1.6.0
Java HotSpot(TM) 64-Bit Server VM 1.8.0-b132
    Docs: (doc function-name-here)
          (find-doc "part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=> (require 'com.lewuathe.hello)
FileNotFoundException Could not locate com/lewuathe/hello__init.class or com/lewuathe/hello.clj on classpath:   clojure.lang.RT.load (RT.java:443)

```

見つからないらしい。ファイル名で探す。

```
user=> (require 'hello)
nil
user=> (com.lewuathe.hello/hello "Kai")
"Hello,Kai"
```

`require`はあくまでもパス名で探すらしい。
名前空間と同じディレクトリ名を掘ってみる。

```
% mkdir com/lewuathe/hello
% mv hello.clj com/lewuathe/hello
```

```clj

% lein repl
user=> (require 'com.lewuathe.hello.hello)
nil
user=> (com.lewuathe.hello/hello 'Kai')
"Hello,Kai'"
```

見つかった。`require`でソースを探しにいくときは。

```clj

(require '<ソースファイルのディレクトリまでのパス>.<ファイル名>)
```
となるみたい。
bash > 対数スケールで等間隔に取りたい

bashのスクリプト内で対数スケールで等間隔を取りたい時があります。

自分が知っている方法は

    for rad in 1E-4 1E-3 1E-2 1E-1 1E0 1E2; do
      echo $rad
    done

のようにforで回す方法です。

ただ、この場合、inの後の数値リストは自分で用意しないといけないです。

別プログラムで等間隔の数値を出力したものをはりつけるというのでもいいのですが、`seq 1 10`のようなコマンドを組み合わせてbashスクリプトのみで、0.0001から10の範囲で等間隔を取れないか思案中です。

良い案があれば教えていただきたいと思います。
フィーチャスペックでテスト失敗時に自動的に save_and_open_page を実行する方法


## save_and_open_page を使うときに困る事と実現したい事

save_and_open_page はRSpecのフィーチャスペックの実行中に、その時点の画面の状態をブラウザで確認できるメソッドです。

```ruby
click_on 'Create User'
# ブラウザで画面を開く
save_and_open_page
expect(page).to have_content 'ユーザを作成しました'
```

実際のブラウザの状態を目で確認できるので大変便利なのですが、 `save_and_open_page` を毎回付けたり消したりする必要があります。

フィーチャスペックはその性質上、ある程度の長いテストになります。
そのため、ポイントAで発生した問題を解決したら、今度はポイントBで問題が発生した、なんていうことが時々発生します。
その場合は再度 `save_and_open_page` を挟み込まなければいけません。

```ruby
scenario '長いテスト' do
  # ...
  save_and_open_page
  expect(page).to have_content 'ほげほげ'
  # ...
  save_and_open_page # ここにも追加？
  expect(page).to have_content 'ふがふが'
  # ...
  save_and_open_page # ここにも追加？
  expect(page).to have_content 'ぴよぴよ'
end
```

さらに、テストが失敗する、しないに関わらず `save_and_open_page` を呼ぶとブラウザが起動します。
テストが失敗するときはブラウザが起動すると助かりますが、何も問題が発生していないポイントでブラウザが起動すると逆に迷惑です。

そこで、 **「テストが失敗したときにだけ自動的に `save_and_open_page` を呼んでブラウザを起動する」** という仕組みを入れてみましょう。

## セットアップと使い方

`spec/rails_helper.rb` に次の設定を追加します。

```ruby
RSpec.configure do |config|
  # 他の設定...
  config.after do |example|
    if example.metadata[:type] == :feature and example.exception.present? and example.metadata[:open_on_error] == true
      save_and_open_page
    end
  end
end
```

自動的に `save_and_open_page` を呼び出したいテストに `open_on_error: true` タグを付けます。

```ruby
scenario '長いテスト', open_on_error: true do
  # ...
  expect(page).to have_content 'ほげほげ'
  # ...
  expect(page).to have_content 'ふがふが'
  # ...
  expect(page).to have_content 'ぴよぴよ'
end
```

こうするとテストが失敗したときにだけ `save_and_open_page` が呼ばれて、テスト失敗時点の画面を確認できます。
テストがパスしたときは何も起きません。

### 補足

- `open_on_error` というのは僕が勝手に名付けたタグ名なので、好きなタグ名に変えて構いません。
- `save_and_open_page` を付けたり消したりする必要はありませんが、`open_on_error: true` を付けたり消したりする手間は発生します。
- `open_on_error: true` はあくまでデバッグ用のタグなので、`git push` する前には削除しておく方が良いでしょう。

## 参考文献

- [How to make Rspec save_and_open_page automatically when any spec fails](http://stackoverflow.com/a/16935806/1058763)

## あわせて読みたい

- [使えるRSpec入門・その4「どんなブラウザ操作も自由自在！逆引きCapybara大辞典」](http://qiita.com/jnchito/items/607f956263c38a5fec24)
WindowsでRuby On Rails 4.2.0をインストールしてみた

実施日：2015/01/02 

## 環境 ##
 - マシン環境
   - Windows7 32ビット
 - インストールソフトウェア環境
   - Ruby 2.1.5
   - Dev Kit 4.7.2
   - Ruby On Rails 4.2.0

## Ruby 本体のインストール ##

 1. http://rubyinstaller.org/downloads/ から「Ruby Installers」にある「Ruby 2.1.5」をダウンロード。
   - 64ビット環境の方は「Ruby 2.1.5 (x64)」をダウンロード。
 2. Ruby Installerを実行。基本はそのまま「次へ」。
   - rubyへのパスを通すのが面倒な場合はインストール時のオプションで「Ruby の実行ファイルへ環境変数 PATHを設定する」にチェックを入れる。
 3. コマンドプロンプトで`ruby -v`でバージョンが表示されればOK。

## DEVELOPMENT KITのインストール ##
 1. http://rubyinstaller.org/downloads/ から「DEVELOPMENT KIT」にある「For use with Ruby 2.0 and 2.1 (32bits version only):」内の「DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe」をダウンロード。
   - 64ビット環境の方は「For use with Ruby 2.0 and 2.1 (x64 - 64bits only)」内の「DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe」をダウンロード。
 2. 解凍する。
 3. コマンドプロンプトを起動して解凍したフォルダに移動して以下を入力してインストール
    - `ruby dk.rb init`
    - `ruby dk.rb install`

## Ruby On Railsのインストール ##
 1. コマンドプロンプトで以下を入力
    - `gem install rails`
       - メモ：インストールには少し時間がかかります。私のマシンは遅いのでインストールに25分かかりました。
    - `rails -v`と入力して`Rails 4.2.0`と表示されればインストールは成功。

## Ruby On Railsのインストール中に以下のエラーが発生した場合の対処方法 ##
 > ERROR:  Could not find a valid gem 'rails' (>= 0), here is why:          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/latest_specs.4.8.gz)

 - 対策
    - SSL証明書の問題のため、自分で入手してアップデートをしてあげればよい。

 - 手順
    1. 以下から「AddTrustExternalCARoot-2048.pem」をダウンロード。
      - https://gist.github.com/luislavena/f064211759ee0f806c88
    2. 上記のpemファイルを「${RUBY_HOME]/ruby/2.1.0/rubygems/ssl_certs」にコピー
    3. Ruby On Railsのインストール手順を再実行

## インストール後に最初に参考にしたサイト ##
 - [小学生でもわかるRuby on Rails入門](http://openbook4.me/projects/92)
     - 手順通りで全て動作を確認。

### 参考URL ###
 - [Railsを利用するための環境設定](http://www.buildinsider.net/web/rubyonrails4/0102)
 - [さくらインターネットのスタンダードプランにRuby 2.1.5を入れたは良いがgem install も update も効かなかった件](http://kawairi.jp/weblog/vita/2015010119001)
 - [bundle install がこけるようになった(改訂版)](http://qiita.com/akaneko3/items/a162def655ce791e356f)
HTMLのtextareaをviキーバインドで編集するjQueryプラグイン

私は普段使うエディタはvimなのですが、このvimというエディタは操作体系がかなり独特で、カーソルの移動モードとテキストの編集モードが明確に分かれていたり、カーソルの移動が「h、j、k、l」の横並びのキーで行うなど、他のエディタとかなり違います。
そして、この操作体系に慣れてしまうと逆に通常のカーソルキーを使って編集するようなエディタを使うのが苦痛になります。
なので、HTMLのtextareaに適用することでviキーバインドが一部使えるようにする、jQueryプラグインを作りました。
しかし、今のバージョンは機能を実現することだけを目指したので、かなり複雑でメンテナンスしづらい作りになっているので、現在絶賛リファクタリング中です。

https://github.com/digitarhythm/vixtarea/
シェルスクリプトのlint

シェルスクリプトのLint。メモ書き。

#-n オプション

構文チェックします。 -nつけて実行すればよい。冗長的になる-nvのほうがわかりやすいかも。

```shell-session
 $ sh -n  hoge.sh
 $ sh -nv hoge.sh
```

bashでPosixに準拠したコード、いわるゆbashに依存しないボーンシェルスクリプトの場合は、set -o してあげる。

```shell-session
 $ set -o posix
 $ bash -nv hoge.sh
```

# checkbaskisms

Perl製のシェルスクリプトのlint。Posixに準拠しているかどうかチェックします。bashやksh固有のコードをチェックするってことですね。
http://sourceforge.net/projects/checkbaskisms/

こんなコード、配列は素のshでは...。このように叱ってくれます。

```shell-session
$ cat foo.sh 
#!/bin/sh
elems[0]=0
elems[1]=1
for x in ${elems[*]}; do
  echo $x
done

$ ./checkbashisms foo.sh
possible bashism in foo.sh line 3 (bash arrays, H[0]):
elems[0]=0
possible bashism in foo.sh line 4 (bash arrays, H[0]):
elems[1]=1
possible bashism in foo.sh line 5 (bash arrays, ${name[0|*|@]}):
for x in ${elems[*]}; do
```

posix準拠なコードのチェックだけで、構文まではチェックしてくれない。少し残念。

```shell-session
$ cat hoge.sh
#!/bin/sh
for x in 1 2 3 do
  echo $x
done

$  ./checkbashisms hoge.sh
$ echo $?
0
```

# shlint

ruby製のシェルスクリプトのlint。中身はcheckbaskismsを呼んで + 各シェルで -n しているだけみたい。
https://github.com/duggan/shlint


```shell-session
$ gem install shlint
```

```shell-session
$ cat foo.sh
#!/bin/sh
elems[0]=0
elems[1]=1
for x in ${elems[*]}; do
  echo $x
done

$ shlint --debug ./foo.sh
possible bashism in ./foo.sh line 3 (bash arrays, H[0]):
elems[0]=0
possible bashism in ./foo.sh line 4 (bash arrays, H[0]):
elems[1]=1
possible bashism in ./foo.sh line 5 (bash arrays, ${name[0|*|@]}):
for x in ${elems[*]}; do
Using zsh...
Testing ./foo.sh
Using ksh...
Testing ./foo.sh
Using bash...
Testing ./foo.sh
Using dash...
Testing ./foo.sh
Using sh...
Testing ./foo.sh
Checking for bashisms...
```

# shellcheck

最強なシェルスクリプトのlint。チェック厳しすぎる。
http://www.shellcheck.net/

![shellcheck.png](https://qiita-image-store.s3.amazonaws.com/0/11595/6efc7982-45a6-3475-7ce5-7656c34a8045.png)


WEB版だけでなくて、コマンドライン版もあるので、テスト自動化しやすい。
無視したい箇所には、そのコードの上に所定のコメントを書けばOKなようです。すこぶる便利ですね。

```
# shellcheck disable=code[,code...]
```


というので、shellcheck最強。
RailsTutorialのテスト駆動開発が上手くいかない時の対処

#はじめに
現在、[RailsTutorial](http://railstutorial.jp/)を勉強中ですが、[3.2.1 テスト駆動開発](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-TDD)で壮大につまずいたので、対処法を備忘録として記します。

#対象バージョン
`ruby 2.0.0`
`rails 4.2.0`
`rspec-core 3.1.7`
`rspec-rails 3.1.0`

#どう上手くいかないか
[RailsTutorial 3.2.1テスト駆動開発](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-TDD)をそのまま実行すると、下記の様なエラーが出る

```bash
$ bin/bundle exec rspec spec/requests/static_pages_spec.rb 
(rails_dir)/sample_app/spec/spec_helper.rb:85:in `block in <top (required)>': uninitialized constant Capybara (NameError)
...

```

#対処方法

1. `spec/requests/static_pages_spec.rb` のrequireするファイルを変更する

```rb

- require "spec_helper"
+ require "rails_helper"

```
参考：[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp/read#leanpub-auto-section-11)より引用


```
最初の行にある require 'rails_helper' に気をつけてください。そしてこれをタイプするのに慣れてください。今後すべてのスペックにこの行が含まれることになります。これはRSpec 3で新しく登場した内容です。以前のバージョンでは spec_helper と書いていました。Rails固有の設定はこのファイルに移動しています。その結果、 spec_helper はかなり小さくなりました。この内容は第9章でもう少し詳しく説明します。
```



2.`spec/rails_helper.rb`に`Capybara::DSL`を読み込む

```rb
RSpec.configure do |config|
...
  config.include Capybara::DSL #ブロック内の最終行にでも追記
end
```

#以上でテストが通るようになります

```
$ bin/bundle exec rspec spec/requests/static_pages_spec.rb

(rails_dir)/sample_app/db/schema.rb doesn't exist yet. Run `rake db:migrate` to create it, then try again. If you do not intend to use a database, you should instead alter (rails_dir)/sample_app/config/application.rb to limit the frameworks that will be loaded. 
### ちなみに上記はDBをmigrateしていないため出てしまいます

.

Finished in 0.17833 seconds (files took 7.04 seconds to load)
1 example, 0 failures

```
アイコンフォントや文字フォントをコマンドラインで画像として出力する



## ユースケース

- アイコンフォントを画像として出力したい。
- 検索に引っかかりたくない文章を画像として出力したい。


## 事前準備

ImageMagickをインストールします。

```bash
brew install imagemagick
```
	
※[CactuslabのOSX版バイナリ](http://cactuslab.com/imagemagick/)をインストールするのも楽です。

## 作成方法

1. 出力したいフォントをFontbookでインストールしておきます。

2. 出力したいフォントファイルのパスを取得します。

	```bash
	convert -list font
	```	
	`glyphs:`にパスが表示されます。

### ケース1:入力が難しい文字の場合

アイコンフォントなどで、アイコンに対応する文字をキーボードから入力しずらいケースです。

1. Fontbookを開きます。
2. Fontbook上で出力したい文字をコピーします。
3. 何らかのエディタにペーストしてUTF8で保存します。
4. 以下を実行します。

```bash
convert -font '[Fonts配下のフォントのフルパス]' -pointsize [出力したいフォントサイズ] label:@[utf8のファイル名] [出力画像ファイル名].png
```

※ImageMagickの制限

#### 例

GitHubの[Octicons](https://octicons.github.com)を使う例です。

```bash
convert -font '/Users/s/Library/Fonts/octicons.ttf' -pointsize 50 label:@github.txt github.png
```

![github.png](https://qiita-image-store.s3.amazonaws.com/0/15414/857a5a19-4cbf-3369-bbd2-75d96fa8ff95.png "github.png")

## ケース2:入力が簡単な文字の場合

アルファベットなど入力が簡単な文字のケースです。こちらはテキストファイルを作る必要がないです。

```bash
convert -font '[Fonts配下のフォントのフルパス]' -pointsize [出力したいフォントサイズ] label:'[出力したい文字]' [出力画像ファイル名].png
```

#### 例

```bash
convert -font '/System/Library/Fonts/HelveticaNeueDeskInterface.ttc' -pointsize 50 label:'Apple' apple.png
```
![apple.png](https://qiita-image-store.s3.amazonaws.com/0/15414/ace407e9-1545-14c7-dd3c-520737c3aefa.png "apple.png")

## その他

`convert -font`には様々なオプションがあります。以下の公式サイトにオプションの詳細が画像付きで掲載されています。

- [ImageMagick v6 Examples -- 
 Text to Image Handling](http://www.imagemagick.org/Usage/text/)

## 追記 (2015/1/3)

ttfフォント内の全ての文字を個別のPNG画像として出力するツールを作りました。

- [sl2/TTF-to-PNG - GitHub](https://github.com/sl2/TTF-to-PNG)