OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftからObjective-Cのクラスを参照するためにした設定

SwiftのユニットテストからObjective-Cのクラスを参照するためにした設定メモ。変更したのは以下の点。

1. Podfileの設定
2. Xcodeでプロジェクトの設定
    - Bridging Header
    - コンパイルオプション
    - Deploy Target
    - Precompiled Header

一つ一つ調べながらやってしまったが、Testsターゲットを後から追加したことによる設定の差分が問題だったので、デフォルトのターゲットの設定に合わせていけば解決する。


## Podfileの設定

TestsターゲットでCOCOAPODSのライブラリが参照できていなかったので、[公式ドキュメント](http://guides.cocoapods.org/using/the-podfile.html
)を参考に、複数のターゲット間で同じライブラリを共有するようにした。

```
link_with 'MyApp', 'MyApp Tests'
```

上記をPodfile追記し、"pod install"すればTestsターゲットからもライブラリが参照できる。  
これでXcodeのプロジェクト設定でTestsターゲットのBuild Phasesが変更される。


## Xcodeでプロジェクトの設定
### bridging headerファイル

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/Migration.html

ドキュメントに書かれているように、SwiftからObjective-Cのクラスを参照するには"MyApp-Swift.h"というようなファイルが必要になる。  
これはXcodeの案内に従って、bridging headerファイルを作成してコンパイルすれば作成される。  
ただし、初回設定時にデフォルトの"MyApp"には設定が入るが、"MyApp Tests"には入らないようなので注意。

Testsからだけ参照できない、というときは"Build Settings"タブの"Swift Compiler - Code Generation"の"Objective-C Bridging Header"にHeaderファイルを指定すれば解決。

今回の件とは関係ないが、Objective-CクラスはSwiftクラスのサブクラスにはできないので、既存のコードを書き換えていくときは注意。

### コンパイルオプション
"unimplemented IR generation feature"というのが出たので、[こちら](http://stackoverflow.com/questions/24898401/xcode6-beta4-archive-build-error-unimplemented-ir-generation-feature-bitcast-bet/24901663#24901663)を参考に"Build Settings"タブの"Swift Compiler - Code Generation"の"Optimization Level"を"Fastest [-O]"から"None [-Onone]"にした。


### Precompiled Header
TestsターゲットではPrecompiled Headerも指定されていなかったので、こちらも追記した。  
具体的には"Build Settings"タブの"Apple LLVM 6.0 - Language"の"Prefix Header"という箇所。

Precompiled Headerがあることを前提に書かれているコードで、Testsで使用しないとHeaderファイルの読み込み順がかわって、importしているはずのライブラリや定数が参照できなかったりする。


### Deploy Target
"Build Settings"タブの"Deployment"の"iOS Deployment Target"をデフォルトのターゲットと合わせておく。  
COCOAPODSが対象のiOSのSDKに依存しているようなので、異なるバージョンを使おうとすると実行時にライブラリが見つからずにエラーになる。
エディタ別ColdFusionシンタックスハイライト

色々とエディタは派閥（？）があるので、見つけたものをそれぞれメモがてら。  

##目次
* Sublime Text 3
* 秀丸
* サクラエディタ
* Eclipse

##Sublime Text 3
最近お気に入りのエディタですが、如何せんShift-JISがうまく扱えないので出番が半減しています。
UTF-8ベースなので、日本語/Shift-JISを扱うには別途設定が必要ですが、CFEclipseの様に単語補完してくれるので便利。
テキストエディタなのでEclipseを使うよりは軽いです。

### エディタのインストール
Sublime Text 3
<http://www.sublimetext.com/3>

### ColdFusionタグのハイライト
1. Package Controlからインストール出来ないので、githubからリポジトリをcloneして、developmentをチェックアウトします。  
<https://github.com/SublimeText/ColdFusion>

上記が難しい場合は（Proxyでhttps無理な場合とか）は、以下の方法で設定します。

1. 以下URLからzipファイルをDLします。  
<https://github.com/SublimeText/ColdFusion/archive/development.zip> 
2. 解凍し、ディレクトリ名を"ColdFusion"に変更します。 
3. 以下のディレクトリに先ほどの解凍しリネームしたフォルダを配置します。  
    * **Windowsの場合**  
    C:\Users\\[ユーザー名]\AppData\Roaming\Sublime Text 3\Packages  
    * **Macの場合**  
    /Users/[ユーザ名]/Library/Application Support/Sublime Text 3/Packages  

##秀丸
定番のエディタですね。
強調表示として設定ができます。

### エディタのインストール
秀丸エディタ
<http://hide.maruo.co.jp/software/hidemaru.html>

### ColdFusionタグのハイライト

1. 以下URLから圧縮ファイルをダウンロードし、解凍します。
<http://hide.maruo.co.jp/lib/hilight/coldfusion.html>

2. [ファイルタイプ別の設定] > [強調表示]を選択して、ユーザ定義として先ほどのファイルを追加します。

##サクラエディタ
ないと思い込んでいたらあったので、さすがという感じです。
こちらも強調キーワードとして設定できます。

### エディタのインストール
サクラエディタ
<http://sakura-editor.sourceforge.net/>

### ColdFusionタグのハイライト
####強調キーワード (*.kwd) の設定方法
以下のページを元に強調キーワード (*.kwd) を設定します。
<http://sakura.qp.land.to/?Customize%2F%B6%AF%C4%B4%A5%AD%A1%BC%A5%EF%A1%BC%A5%C9>

####ColdFusion用キーワード
次に、以下を参考にColdFusion用キーワードとして設定します。
<http://sakura.qp.land.to/?Customize%2F%C5%EA%B9%C6%2F16>

####タイプ別設定一覧の設定（参考）
* **[スクリーン]タブ**
    * ファイル拡張子：cfc,cfm
* **[カラー]タブ**
    * 強調キーワード：先ほどインポートしたCFのキーワード
    * コメントスタイル （ブロック型）： `<!---` と `--->`

##Eclipse（CFEclipse）
これもある意味定番ですね。
Eclipseを使用しているので単語補完ができますが、メモリを食うのでスペックが良いマシンでないと辛いところです。
（まぁ、今はそこまでスペックしんどいマシンもそうそうないか……）

### エディタのインストール
Eclipse
<https://www.eclipse.org/downloads/>  
Pleiades - Eclipse プラグイン日本語化プラグイン
<http://mergedoc.sourceforge.jp/>

### ColdFusionタグのハイライト
* CFEclipse（Eclipseプラグイン）  
<http://cfeclipse.org/default/>

1. 以下の記事を参考に、CFEclipseをEclipseに設定します。  
昔はEclipse用のColdFusionエクステンションをAdobeが提供してたんですが、CF9以降は提供を辞めてしまったようなので、ColdFusionエクステンションの部分は無視してください。  
<http://www.adobe.com/jp/devnet/coldfusion/articles/eclipse_extensions.html>

#### EclipseでのColdFuison開発の参考
<https://www.ibm.com/developerworks/jp/opensource/library/os-eclipse-cfeclipse/>
CakePHP 本体の全てのテストをコマンドラインから実行する

CakePHP にはコマンドラインからテストを実行するためのインターフェースが用意されているようで、下記のように cake コマンドを使ってテストを実行する必要がありました。CakePHP 本体の全てのテストを実行したい場合は `core` に続いて `AllTests` を渡します。

```bash
./app/Console/cake test core AllTests
```
rails4.1.4 + sidekiq 3.2.1 でつまづいた話

railsで非同期処理を実現したくてsidekiqを導入しようとしたら詰まったのでメモ。

##1. bundle install後、rails sがエラーをはいて失敗する

エラー内容

```
(rails_root)/config/application.rb:10:in `<module:Sidekiq>': uninitialized constant Sidekiq::Rails::Application (NameError)
```

原因
原因の部分のソースをみたら下記になっていた

~~~ruby:application.rb
require File.expand_path('../boot', __FILE__)

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Sidekiq
  class Application < Rails::Application   #ここでエラー
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de
  end
end
~               
~~~~

解消法（これでいいのか？）
/config/boot.rbに sidekiqをrequireしてあげるとエラーが解消

```ruby:boot.rb
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
require 'sidekiq' #追記

```

##2.sidekiq側でNet::HTTPが同じくName errorになる

 ワーカーの処理をapp/worker/myworker.rbに記述

```ruby:app/worker/myworker.rb
class Myworker
    include Sidekiq::Worker

    def perform(snippet_id)
        snippet = Snippet.find(snippet_id)
        uri = URI.parse("http://pygments.appspot.com/")
        request = Net::HTTP.post_form(uri, lang: snippet.language, code: snippet.plain_code) 
        snippet.update_attribute(:highlighted_code, request.body)
    end
end
```

sidekiqの処理でエラー

```
2014-08-11T15:37:31.364Z 13408 TID-oxxdxyfw8 WARN: uninitialized constant Net::HTTP
2014-08-11T15:37:31.364Z 13408 TID-oxxdxyfw8 WARN: /Users/dolin/work/sidekiq/app/workers/myworker.rb:7:in `perform'
```

Net::HTTPが初期化できていないと

解消法（これでいいのか？）
/config/boot.rbに sidekiqをrequireしてあげるとエラーが解消

```ruby:boot.rb
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
require 'sidekiq' #追記
require 'net/http' ##これも追記？？
```

感想と疑問

無理矢理エラーを解消をしようとして、書いちゃいけない場所に書いている & ２重読み込みをしている可能性がとても高い記述になっちゃいました。

railsの起動でライブラリがどのように読み込まれていくのか勉強しないとまずい。
net/httpとかなんでsidekiq側で読み込まれないのか謎だし。
[Groovy]traitを使って無理やりお手軽ダックタイピング

#概要
クラス宣言時にimplementsを使って、クラスにtraitを組み込むことができますが、クラス生成時（new）に**as**キーワードを使うことで、そのオブジェクトに対してtraitを組み込むことができます。

#サンプルソース

```groovy
class A {
    def doSomething() {
        "This is Class A"
    }
}

class B {
    def greeting() {
        "This is Class B"
    }
}


def exec( def obj ) {
    "${obj.doSomething()} - executed!"
}
```

#実行してみる
以下のコードは当然問題なく実行できます。

```groovy
def a = new A()
assert exec(a) == "This is Class A - executed!"
```

以下は当然エラーになります。

```groovy
// execメソッドは、渡されたオブジェクトのdoSomething()を実行するので、
// 今回渡しているBクラスにはそんなメソッドは無いので当然エラーになる。
def b = new B()
assert exec(b) == "This is Class B - executed!"
```
#クラスを全くいじらずにこの問題を解決する
そこで、Groovy2.3から利用できる**trait**の出番です。
traitとasキーワードを使って、このクラスBにdoSomethingメソッドを動的に追加してあげることがでます。

```groovy
trait Wrapper {
    def doSomething() {
        greeting()
    }
}

def b = new B() as Wrapper
assert exec(b) == "This is Class B - executed!"
assert b.greeting() == "This is Class B"
```
この使い方が実用的か、問題ないかは置いておいて、こんなことができますよ、ということです。
【Android】ShareCompatを使って簡単にシェアボタンを実装しよう


で、**ShareCompat**を使ったらどんなことが出来るのかというと以下のスクリーンショット見たいなやつです。

![ScreenShot39.png](https://qiita-image-store.s3.amazonaws.com/0/47302/0bc7da44-855f-69bf-6cbe-9a591736ef24.png "ScreenShot39.png")

Google Chromeさんにも共有するボタンがあって、同じような画面が開かれるかと思います。

なので今回はこいつを簡単に実装できる`ShareCompat`を紹介します。

ちなみに今回は`SupoprtLibrary`を使うので、`SupportLibrary`を使っていないという猛者はうまく置き換えてみてください。

今回は以下の記事を参考にさせて頂きました。

[Android Tips #35 ShareCompat で簡単に共有アクションをつくる](http://dev.classmethod.jp/smartphone/android/android-tips-35-sharecompat/)

ありがとうございました！

## 目次

1. [ソースコード](#1)
2. [ShareCompatとは](#2)
3. [暗黙的インテントとは](#3)
4. [終わりに](#4)

<span id="1"></span>
## 1. ソースコード

早速ソースコードを御覧ください。

```java:Share.java
String articleURL = "記事のURL"
String articleTitle = "記事のタイトル"
String sharedText = articleTitle + " " + articleURL;
 
// builderの生成　ShareCompat.IntentBuilder.from(Context context);
ShareCompat.IntentBuilder builder = ShareCompat.IntentBuilder.from(this.getActivity());
 
// アプリ一覧が表示されるDialogのタイトルの設定
builder.setChooserTitle(R.string.menu_article_detail_share_chooser_title);
 
// シェアするタイトル
builder.setSubject(articleTitle);
 
// シェアするテキスト
builder.setText(sharedText);
 
// シェアするタイプ（他にもいっぱいあるよ）
builder.setType("text/plain");
 
// Shareアプリ一覧のDialogの表示
builder.startChooser();
```

これを実装したら上のようなスクリーンショットが表示されると思います。

ちなみにTwitterのアプリを選択すると

![ScreenShot47.png](https://qiita-image-store.s3.amazonaws.com/0/47302/7f4a525d-ed68-3d3b-528b-07d861ba9b63.png "ScreenShot47.png")


こんな感じになります。

では１つずつ噛み砕いて行きたいと思います。

<span id="2"></span>
## 2. ShareCompatとは

AndroidDeveloperのリンクは以下になっています。

[ShareCompat | Android Developers](http://developer.android.com/reference/android/support/v4/app/ShareCompat.html)

ちなみに今回使った`ShareCompat.IntentBuilder`はこちらです。

[ShareCompat.IntentBuilder | Android Developers](http://developer.android.com/reference/android/support/v4/app/ShareCompat.IntentBuilder.html)

先ほどの文章を引用させて頂きます。

> ShareCompat は Activity 間のデータのやりとり (共有) のためのユーティリティクラスです。Support Package に含まれているクラスなので Android 1.6 (APIレベル4) から使用することができます。
> 
> Activity 間のデータのやりとりは Intent を使っておこないますが ShareCompat を使うことで ACTION_SEND や ACTION_SEND_MULTIPLE といった共有アクションの暗黙的 Intent をつくったり、逆に共有アクションの詳細な情報を取得するといったことを簡単に実装することができます。

Android4.0以上の場合はShareActionProviderを使うのが妥当らしいです。

が、まだまだAndroidで4.0以上のアプリを作る（正確には日本向けに作る）のはないと思っているので、`SuportLibrary`でバージョンを気にせず使える`ShareCompat.IntentBuilder`を使うほうがよろしいかと思います。

<span id="3"></span>
## 3. 暗黙的インテントとは

で、上記の引用部分で出てきました、**暗黙的インテント**というワードですが、こちらが素敵な仕組みとなっています。

暗黙的Intentとは動作のみを指定して他のアプリケーションを起動します。

起動される側（呼び出される側）のアプリケーションは、反応したいイベントに対して返事をする仕組みとなっています。

**暗黙的インテント**とは逆に**明示的インテント**というのがあります。

例えば、ブラウザを起動する際に、ブラウザアプリを**明示して**起動することも出来ます。

しかし、それだとユーザーさんが好んでいるブラウザが使えなかったりするので、UX的には悪いかと思います。

そこを**暗黙的インテント**を使えば、ブラウザを開きたいという呼び出しに対して反応したアプリ一覧をユーザーさんに選択させることが出来ます。

使ってみるととっても便利なので、ぜひ使ってください！

<span id="4"></span>
## 4. 終わりに

暗黙的インテントがこんなに強力だと思っていませんでした。

多分これから沢山のことに対して使うことになるだろうなと思っています。

ではお疲れ様でした。
Excelスクショ問題の解決策を現役エンジニアが本気で考えた。

#はじめに
SIerのExcelスクショ問題が少し前にバズっていた。
SIerでは、プログラムを手動で操作し、その時の画面写真をExcelに貼り付けた資料を作る事で、プログラムが正常に動作するエビデンスとしている。
そもそも、なぜそのような作業が必要なのかは、下記の方のブログが詳しいのでここでは語らない。

[- > Excelスクショ問題について周りの方へのお願いと、今職人となっている方への励ましの言葉（元職人より） | 羽根帽子の太公望](http://www.jmuto.info/2014/08/excel-screen-shot-problem.html)

ここで語りたいのは、「Excelスクショ作業はなぜ自動化されないのか？」とそれに対する解決策だ。

#原因
まず原因はこれらだと思う。

##セキュリティの観点から自動化ツール導入に制限がある。（そのツールがスパイウェアでない保証はありますか？）
フリーウェアの導入や有名でないシェアウェアの導入の際に問題になる。それらのツールがスパイウェアの類でない事を証明する事は難しい。万が一それらがスパイウェアであった場合は、顧客情報も預かっているために企業の存続を脅かす事態となる。

##テストコードを書く予算を顧客に納得させられない。（その分の開発予算増加を顧客企業の経営層に納得させられますか？）
システム開発の受注先を決める最大の基準が金額だ。テストコードを書く事で保守作業の費用を抑えられるが、その抑えられる費用の額は不確定なので、その基準に盛り込めない。部分最適化ならぬ開発最適化な予算が基準になる。

##テスト自動化の教育をする時間がない。（プロジェクト単位での業務の中で、テスト自動化の教育予算と時間は誰が用意してくれるのですか？）
SIerの業務はプロジェクト単位で動く事が多い。プロジェクトリーダーからすれば教育はプロジェクト自体への利益還元率が低い為、優先されない。長期的な教育目的で開発者を育てるインセンティブが現場にない。

#解決策
テスト仕様書(Excel)自体がUIテストを自動で行ってくれればいい。
そして、それはExcelVBAのみで実装されていればいい。
近いものとして、[Excelenium(エクセレニウム)](http://d.hatena.ne.jp/language_and_engineering/20090524/p1)や[Selenium VBA(セレニウムVBA)](http://www.moongift.jp/2013/12/selenium-vba-%E8%87%AA%E5%8B%95%E3%83%86%E3%82%B9%E3%83%88%E3%81%8Cexcel%E3%83%91%E3%83%AF%E3%83%BC%E3%81%A7%E4%B8%80%E6%B0%97%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%AB%EF%BC%81/)があるが、[Selenium(セレニウム)](http://www.seleniumhq.org/)のインストールを必要とする為に導入が難しい現場もある。
だから、ExcelVBAのみで実装されたそれがあればいい。
ツール自体はダウンロードできなくても、最悪VBAライブラリのコピペはできる。

#試みの紹介
開発3日目位のα版ですが、DIYの原則に従い実装してみました。

■nezuQ/PaperTester（PaperTester.xlsm）
https://github.com/nezuQ/PaperTester
　※★テスト仕様書シートに書かれた操作が自動実行します。
　　　対応する操作の種類は、操作一覧シートに記入しています。

#問題点
山積みです。DIYではなくDIWOしたいです。
エンジニアがエンジニアらしい仕事をできるように、一緒にOSS開発しませんか？

#続き
[Excelスクショ問題の解決策を現役エンジニアが本気で考えた。【2】](http://qiita.com/nezuq/items/8b9438108b5195a3c0bf)
[Excel単体テスト仕様書からIE自動操作用のVBSコードを自動生成する。]
(http://qiita.com/nezuq/items/21d191b3f0e494d78215)
Chrome Appsを作る（Hosted Apps編）

Chrome Appsを作る機会があったので、手順をメモがてら残しておきたいと思います。

#Chrome Appsの種類
はじめに、Chrome Appsの種類について簡単に。大きく分けて２種類あります。
###Hosted Apps
自身で管理するWebサーバーからWebアプリを提供することができるので、一般にWebブラウザからのアクセスを想定して提供しているWebサービスをChrome Web Storeでそのまま公開することができる。ストア上で提供できるブックマークのようなイメージで動作する。マニフェストファイルの作成とホスティングしているドメインの所有証明をすれば、Storeで登録・公開できる。また、ユーザー管理や独自の課金の仕組みなど、細かい管理をしたい場合はHosted Appsが向いている。
###Packaged Apps
従来のWebサービスと異なって、サーバーを介さずにWebアプリを提供できる。Webアプリに必要なファイルをまとめてユーザーのローカル環境にインストールして、デスクトップアプリケーションやスマートフォンのアプリのように動作する。HTMLやCSS、JavaScriptを使って記述するデスクトップアプリケーションのように動作する。Webサーバーとの連携も可能。動作もChromeブラウザウィンドウ上ではなく、独立したウィンドウで動作し、「Chromeを立ち上げる→アプリを起動」としなくても直接起動できる(Macだとランチャー画面にも表示できる)ため、Webアプリであることを意識させない作りが可能。

#Hosted Appsを作ってみる
既存のWebサービスをアプリとして提供する場合、Hosted Appsは簡単な設定と画像の準備だけで作成する事ができます。具体的には、Appsのロゴにするアイコン画像と、WebアプリのURLや使用するリソース、アクセス許可等を記述するmanifest.jsonファイルを準備するだけで実装できます。任意のフォルダを作ってその中にアプリのアイコン画像とmanifest.jsonファイル（テキスト）を作成します。
![スクリーンショット 2014-08-11 15.09.15.png](https://qiita-image-store.s3.amazonaws.com/0/48393/49aa842f-99d5-f4c5-acc0-a1bf5931eec0.png)

###manifestファイル
続いて、manifest.jsonにアプリの設定を書いていきます。manifestファイルには、アプリの名前や説明、サービスのURL、使うアイコンの情報等、アプリ構成に必要な情報や設定を記述します。

```JSON:manifest.json
{
    "manifest_version": 2,
    "name": "Sample",
    "description": "Chrome Web App Sample",
    "version": "0.0.1",
    "app": {
        "launch": {
            "web_url": "http://example.com"
        }
    },
    "icons": {
        "16": "icon-16.png",
        "48": "icon-48.png",
        "128": "icon-128.png"
    },
    "permissions": [
        "background"
    ]
}
```

manifestファイルのフォーマットは[公式ドキュメント](https://developer.chrome.com/extensions/manifest)で掲載されていますが、代表的な項目をあげておくと、

| 項目 | 概要 |
|:----------:|:------------|
|manifest_version|マニフェストファイルのバージョン。執筆時点では2を指定する。|
|name|アプリの名前。|
|description|アプリの説明　Chromeの拡張機能欄に表示される。|
|version|アプリのバージョン。アップデートの度に数値を上げなければならない。|
|web_url|提供するWebサービスのURL。|
|icons|Iconとして使用するファイルの名前。|
|permissions|アプリに実行を許可する項目。必要に応じて追加する。|

といった具合です。気をつけなければならないのが、"manifest_version"の項目で、これを指定しないとChromeに読み込むときに、「Could not load extension from 'file path...'. The 'manifest_version' key must be present and set to 2 (without quotes). See developer.chrome.com/extensions/manifestVersion.html for details.」といって怒られてしまいます。また、"name"、"version"は必須項目なので、記述するようにします。

###iconファイルを作る
iconを作るときにも注意点があります。最低限、128×128pxのアイコン画像を用意する必要がありますが、アイコン画像の外側は枠で隠れることがあるため、中央の96×96pxの領域にアイコン画像表示されるようにして、外側の左右16px、上下16pxの領域を透過にすることが推奨されています（[Chrome Supplying Images Guidelines](https://developer.chrome.com/webstore/images)）。

（例）
![icon-128.png](https://qiita-image-store.s3.amazonaws.com/0/48393/9bcce439-13ab-f252-2ef0-47f3c62b2cd4.png)

#Chromeに読み込んでテストする
以上で一通りの作業は終了なので、実際にChromeに読み込んでテストします。ChromeにはStoreで配布する前に、実際にテストできる機能が備わっています。アドレスバー右のボタンから、[ツール]>[拡張機能]を選択し、デベロッパーモードのチェックを入れると次のようなボタンが現れます。
![スクリーンショット 2014-08-11 16.09.37.png](https://qiita-image-store.s3.amazonaws.com/0/48393/17f7b1ca-9136-3722-7b6d-c2178d6167a7.png)
一番左にある、[パッケージ化されていない拡張機能を読み込む…]を押してmanifest.json、アイコンファイルを含むフォルダを読み込むと、Chrome上にインストールされ、ChromeのApp一覧からもアクセスできるようになります。

#Sample
とても簡単ですが、サンプルの中身をそのまま[GitHub](https://github.com/moshisora/ChromeHostedApp)にアップしてあります。
IPython notebookでemacs or vimのキーバインドを使う

皆さん、**超便利**なipython notebook使ってますよね。
そして、vimやemacsユーザーの皆さんは、vimのキーバインドやemacsのキーバインドが使えなくて苦しんでますよね？

--------

***そんなあなたに魔法のjsコードをプレゼントしましょう。***

--------

以下のjsを、`$IPYTHONDIR/profile_default/static/custom/custom.js`の末尾に追記しましょう。

```js:魔法のコード
var my_keymap = 'emacs';
// var my_keymap = 'vim';

$.getScript("/static/components/codemirror/keymap/" + my_keymap + ".js");

IPython.RawCell.options_default.cm_config = {keyMap: my_keymap};
IPython.Cell.options_default.cm_config.keyMap = my_keymap;
IPython.TextCell.options_default.cm_config.keyMap = my_keymap;
IPython.MarkdownCell.options_default.cm_config.keyMap = my_keymap;
IPython.HeadingCell.options_default.cm_config = {keyMap: my_keymap};
IPython.CodeCell.options_default.cm_config.keyMap = my_keymap;
```

環境変数`IPYTHONDIR`が存在しない場合は、ipythonを起動して、以下のコードで確認できます。(典型的には`$HOME/.ipython`, `$HOME/.config/ipython`が多いみたいです。詳しくは[ここ](http://ipython.org/ipython-doc/1/config/overview.html#configuration-file-location)。)

```py
import IPython
IPython.utils.path.get_ipython_dir()
```

ちなみに確認環境はipython2.1.0.
expectを外部から使用する際に気を付けること

エラー処理、処理内容非表示など、expectを外部から使用する際に気にした点のメモです。
  
当たり前と言えば当たり前なのですが、正しくその処理が終わったかを確認する必要が重要です。いわゆるエラー処理や終了コードの話です。あまりコードを書き慣れていない頃は気にしないですよね。  
  
os.systemで簡単に戻り値を確認できるので、終了コードを意識して記載しておくと親切なプログラムが作れると思います。    
  


直前の終了コード確認コマンド
---------  
  

正常終了

```
$ echo $?
0
```
  

異常終了

```
$ echo $?
1
```
  
  
expectの終了コードについて
--------
expectとsendで処理を1行1行書くとexit 0で終わってしまいます。  重要な箇所には必ず以下のようにエラー処理を付けておくのが好ましいと思います。  
  

書き方①

```
expect {
 default {exit 1}
">"
}
```
  

書き方②

```
expect {
 "XXXX" {exit 2}
 "#"
}
```
  
sshの過程などの出力を表示しない方法  
----------- 

出力なし 

```
#!/usr/bin/expect
log_user 0
```
  

テキストに出力

```
#!/usr/bin/expect
log_user log.txt
```
  
  
interact文について 
----------

「spawnの入出力をキーボードと画面にする」という動作です。勘違いしていましたが、制御をシェルに戻すだけなのでtelnetやsshのセッションは切れていないことに注意です。
:nth-of-typeと:notの組み合わせはうまくいかない

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2106">元の記事はコチラ</a>
- - - - - - - - - - - 
いろいろ悩んだけど、結局できないことがわかった。
<!-- extract -->

```html

<style>
#selector-test .red {
	background-color: red;
}
#selector-test li:not(.red):nth-of-type(2n+1) {
	background-color: blue;
}
#selector-test li:not(.red):nth-of-type(5) {
	background-color: yellow;
}
</style>

<ul id="selector-test">
	<li>list1</li>
	<li>list2</li>
	<li class="red">list3</li>
	<li>list4 blueなはず</li>
	<li>list5</li>
	<li>list6</li>
	<li>list7</li>
	<li>list8</li>
	<li>list9</li>
	<li>list10</li>
</ul>

```

notはnth-of-typeに対して何もしないんだ。
nth-of-typeの対象にカウントされないと思っていたけど、しっかりカウントされてます。
list3に「.redクラスがついていてるからlist4が3番目（奇数）になるはずだ」と思ってもそうなりません。
　　
その証拠に、:not(.red).nth-of-type(5)はやっぱり5番目なのです。
知らなかったよ。
　　
###参考
http://stackoverflow.com/questions/12356158/css-nth-of-type-and-not-selector

###デモはこちら
 → <a href="http://workabroad.jp/posts/2106">http://workabroad.jp/posts/2106</a>
[iOS] カスタムStatic libraryのリンク方法

## 概要
Xcodeを使用して、カスタムStatic Libraryをアプリケーションにリンクする方法を説明します。カスタムStatic Libraryのインストール方法については、[iOS用Staticライブラリのビルドおよびインストール方法](http://qiita.com/wheel/items/54c87aea3c7cd468f0d2)をご覧下さい。

## 環境
* 作成日: 2014/08/11
* OS: Mac OS X 10.9.4
* Xcode: Xcode6 beta5
* 言語: Objective-C

## 実行/設定手順
Static Libraryを使用する側のXcode Projectに関して、次を設定します:
1. ヘッダファイルの検索パスの指定: `Build Setting`→`Search Paths`→`User Header Search Paths`に、`$(HOME)/local/include`を追加します。
2. ライブラリの検索パスの指定: `Build Setting`→`Search Paths`→`Library Search Paths`に、`$(HOME)/local/lib`を追加します。
3. ライブラリのリンク: `Build Setting` → `Linking` → `Other Linker Flags`に、`-lリンクするファイル名`を追加します。
3. リンカに与えるロード設定: `Build Setting` → `Linking` → `Other Linker Flags`に、`-ObjC -all_load`を追加します。本オプションについては、[-ObjC とか -all_load って何をやってるのか調べてみた](http://akisute.com/2011/05/objc-allload.html)を参照してください。


## トラブルシューティング
Xcodeで `Unknown class MyClass in Interface Builder file.`エラーが起きる場合、[対処策](http://stackoverflow.com/questions/1725881/unknown-class-myclass-in-interface-builder-file-error-at-runtime)、もしくは[-ObjC とか -all_load って何をやってるのか調べてみた](http://akisute.com/2011/05/objc-allload.html)を参照してください。本文署では後者を採用しています。
kld-intersectionsを使って2つのベジェ曲線の交点を求めてみた

# はじめに

[d3.jsでベジェ曲線をドラッグで変形するサンプル - Qiita](http://qiita.com/hnakamur/items/d6639b1127cc27d1a6ed)を発展させて、交点を求めて表示するようにしてみました。

デモ: http://bl.ocks.org/hnakamur/73af30f05fced219a33f
ソース: https://github.com/hnakamur/d3.js-drag-bezier-curves-example/tree/use-kld-intersections

# 交点が見つからない場合があることが判明

交点の計算には [kld-intersections](https://www.npmjs.org/package/kld-intersections) を使いました。

大体の場合は良いのですが、位置によっては交点の一部が見つからない場合があります。初期表示の状態がまさにそうなっていて本当は交点が2つあるのに1つしか見つかっていません。制御点を移動すると2つになるのですが、最初の位置に戻すと1つになってしまいます。

# 別の交点の計算方法を調査中

[A Primer on Bézier Curves](http://pomax.github.io/bezierinfo/)の[Curve/curve intersection](http://pomax.github.io/bezierinfo/#curveintersection)では曲線を分割していってバウンディングボックスが重なるかどうかを判定していき、ピクセルサイズより小さくなったらそこが交点という方法が説明されていました。

一方、[Computer Aided Geometric DesignというタイトルのPDF](http://tom.cs.byu.edu/~557/text/cagd.pdf)の"7.3 Intersection of a Parametric Curve and an Implicit Curve"では片方の曲線をx(t), y(t)で表して、もう片方の曲線をf(x,y)で表してg(t)=f(x(t), y(t))=0をtについて解くという方式で交点を求めています。

"a polynomial root finding problem"になるので非常に効率がいいとのことなのですが、具体的にどのように方程式を作って解けばいいのか、私の理解が追いついておらず、さらなる勉強が必要です。
Error: Failed to create the AWS Elastic Beanstalk application version

AWS Elastic Beanstalk Command Line Tool を使って `eb aws.push` した際に 
`Error: Failed to create the AWS Elastic Beanstalk application version` というエラーが出る場合のワークアラウンド。

とりあえず直近の commit log を英語で書きましょう。

ざっとソース追ってみた限り boto.beanstalk.layer1#create_application_version の description に日本語が入るとエラーになるみたい。。。

公式リポジトリも見つからず。どこに報告すればいいんだろ。
collection_selectタグでclassが反映されない


ちょっとハマったのでメモ。

```ruby:_form.html.erb
<%= f.collection_select(:target, code.all, :code_no, :code_value, {class: "form-control input-sm"}) %>
```


リファレンスに従ってcollection_selectにclassオプションを指定しても、出力されるHTMLに指定したclassが出力されない。。。


StackOverflowを見て解決しました。

http://stackoverflow.com/questions/18163621/rails-4-collection-select-not-inserting-class-attribute

```ruby:_form.html.erb
<%= f.collection_select(
        :target_id, code.all, :code_no, :code_value,
        {prompt: ""}, {class: "form-control input-sm"}) %>
```

promptを渡してあげることで無事classが出力されました。


## promptとは？

promptオプションとは値が未設定の時にリストの先頭に値を表示するかどうかを制御するオプション。
値を渡した場合はそれが初期値となるらしい。

試しに、上記コードで「{prompt: ""}」としていた箇所を、「{prompt: true}」としてみると、
「Please Select」という値が初期値として表示されました。
逆に、「{prompt: "false"}」とすると、リストの１行目が初期表示されました。
classがcollection_selectの場合は第7引数、f.collection_selectの場合は第6引数としてclassが渡されればOKのようですね。



## 参考

http://rails.hatenadiary.jp/entry/2013/03/15/122116
gulp + webpack + mocha + assertでブラウザとコンソール両方でテストするサンプル

# サンプルソース

ソース: [hnakamur/solve-quadratic-equation.js](https://github.com/hnakamur/solve-quadratic-equation.js)

```js:https://github.com/hnakamur/solve-quadratic-equation.js/blob/9e6b4c5776d6f63b524618870749e3f9dbfcf8a0/gulpfile.js
var gulp = require('gulp');
var gutil = require('gulp-util');
var webpack = require('webpack');
var WebpackDevServer = require('webpack-dev-server');
var webpackConfig = require('./webpack.config.js');
var open = require('gulp-open');
var mocha = require('gulp-mocha');

// default task is browser test
gulp.task('default', ['browser-test']);

// browser test
gulp.task('browser-test', function (callback) {
  var myConfig = Object.create(webpackConfig);
  myConfig.devtool = 'eval';
  myConfig.debug = true;

  new WebpackDevServer(webpack(myConfig), {
    publicPath: '/' + myConfig.output.publicPath,
    stats: {
      colors: true
    }
  }).listen(8080, 'localhost', function (err) {
    if (err) throw new gutil.PluginError('webpack-dev-server', err);

    gulp.src('./test/index.html')
      .pipe(open('', {url: 'http://localhost:8080/webpack-dev-server/test/index.html'}));
  });
});

// node.js test
gulp.task('test', function (callback) {
  gulp.src('test/solve-quadratic-equation_test.js', {read: false})
    .pipe(mocha({reporter: 'nyan'}));
});
```

テストを実行するためのJavaScriptのコードは[JavaScript テストフレームワーク『Mocha』をブラウザ上で使う方法 | TM Life](http://tmlife.net/programming/javascript/javascript-test-framework-mocha-borwser-usage.html)を参考にしました。ありがとうございます！

```js:https://github.com/hnakamur/solve-quadratic-equation.js/blob/9e6b4c5776d6f63b524618870749e3f9dbfcf8a0/test/index.js
require('mocha/mocha.css');
var $ = require('jquery');
require('mocha');

mocha.setup('bdd');

require('./solve-quadratic-equation_test');

$(function() {
  mocha.run();
});
```

assertは[assert](https://www.npmjs.org/package/assert)をnpmでインストールしてrequireするようにしました。

```js:https://github.com/hnakamur/solve-quadratic-equation.js/blob/9e6b4c5776d6f63b524618870749e3f9dbfcf8a0/test/solve-quadratic-equation_test.js
var solveQuadraticEquation = require("../index");
var assert = require("assert");

describe('solveQuadraticEquation', function(){
  describe('Two roots', function(){
    it('should return two roots for x * x - 5 * x + 6 = 0', function(){
      var roots = solveQuadraticEquation(1, -5, 6);
      assert.equal(2, roots.length);
      assert.equal(2, roots[0]);
      assert.equal(3, roots[1]);
    });
// …(略)…
```

# テスト実行方法

## ブラウザでのテスト

webpack-dev-serverを8080ポートで起動して、ブラウザでテスト。

```shell-session
gulp
```

[webpack dev server](http://webpack.github.io/docs/webpack-dev-server.html)に書かれていますが、パスの先頭に ```/webpack-dev-server/``` を加えてアクセスすると、ファイルを更新して保存するとwebpack-dev-serverとブラウザが自動的にリロードされます。

別途[BrowserSync](http://www.browsersync.io/)を利用しなくても、自動リロードされてお手軽です。

![browser-test-with-webpack-dev-server.png](https://qiita-image-store.s3.amazonaws.com/0/3227/2333a6aa-e96d-2b6e-3e3f-db19d488d242.png)


## コンソールでのテスト

```shell-session
gulp test
```

![gulp-test.png](https://qiita-image-store.s3.amazonaws.com/0/3227/76067275-a118-db1a-f4cc-c044876007b9.png)
[WordPress]マルチサイトで別ブログの記事が属するカスタムタクソノミーを取得


switch_to_blogしてget_taxonomiesをしても取得できない。
調べたら、

[[WordPress]switch_to_blog()を使うとget_terms()が動かないので、直接DBからデータを取得する](http://www.kigurumi.asia/tech/461/)

にばっちりの方法がかかれていた。ありがたい。
でもカスタムタクソノミーのslugが被るとうまくいかなかったので以下のようにした。

```php:function.php
function get_taxonomies_by_blog_post($taxonomy, $blog_id, $post_id) {
    // ブログを切り替える
    switch_to_blog($blog_id);
    global $wpdb;
    // クエリ作成
    $query = "
    SELECT *
    FROM $wpdb->term_relationships
    LEFT JOIN $wpdb->term_taxonomy
        ON $wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id
    LEFT JOIN $wpdb->terms
        ON $wpdb->terms.term_id = $wpdb->term_taxonomy.term_id
    WHERE $wpdb->term_relationships.object_id = %d
        AND $wpdb->term_taxonomy.taxonomy = %s
    ";
    // プレースホルダ
    $args = array($post_id, $taxonomy);
    // データを取得
    $taxonomies = $wpdb->get_results( $wpdb->prepare( $query, $args ) );
    // ブログを戻す
    restore_current_blog();
    return $taxonomies;
    }
```

```
引数
$taxonomy 取得するカスタムタクソノミー名
$blog_id 取得するブログID
$post_id 取得する投稿ID
```

テンプレートではこんな感じで使う

```php
<?php
switch_to_blog(2);
$args = array( 'post_type' => array('hogehgoe') );
$arr = get_posts( $args );
foreach($arr as $v ){ ?>
    <?php $cat = get_taxonomies_by_blog_post('hogehoge_taxonomy', 2, $v->ID); ?>
    <a href="<?php echo get_permalink($v->ID); ?>">
        <?php echo $cat[0]->name ?> : <?php echo esc_html($v->post_title); ?>
    </a>
<?php }
restore_current_blog(); ?>
```

カテゴリーをとってきてるのはここ

`$cat = get_taxonomies_by_blog_post('hogehoge_taxonomy', 2, $v->ID);`

ちなみに$catにはカテゴリー情報のオブジェクトが配列で入ってる。

```
var_dump($cat);

array(1) {
  [0]=>
  object(stdClass)#2806 (11) {
    ["object_id"]=>
    string(3) "111"
    ["term_taxonomy_id"]=>
    string(1) "1"
    ["term_order"]=>
    string(1) "2"
    ["term_id"]=>
    string(1) "4"
    ["taxonomy"]=>
    string(16) "hogehgoe_taxonomy"
    ["description"]=>
    string(0) ""
    ["parent"]=>
    string(1) "0"
    ["count"]=>
    string(2) "2"
    ["name"]=>
    string(12) "ほげほげ"
    ["slug"]=>
    string(7) "hogehoge"
    ["term_group"]=>
    string(1) "0"
  }
```
Percol | Ubuntu 12.04 環境に percol をインストール

# Percol | Ubuntu 12.04 環境に percol をインストール

## 概要
Ubuntu 12.04 環境に percol をインストールします。

## 前提
* Python2.7 をインストール済み

## 手順
### setuptools のインストール

~~~bash
$ sudo apt-get install python-setuptools
~~~

### pip のインストール

~~~bash
$ sudo easy_install pip
$ pip -V
pip 1.5.6 from /usr/local/lib/python2.7/dist-packages/pip-1.5.6-py2.7.egg (python 2.7)
~~~

### percorl のインストール

~~~bash
$ sudo pip install percol
Downloading/unpacking percol
  Downloading percol-0.0.7.tar.gz
  Running setup.py (path:/tmp/pip_build_root/percol/setup.py) egg_info for package percol
    
Installing collected packages: percol
  Running setup.py install for percol
    changing mode of build/scripts-2.7/percol from 644 to 755
    
    changing mode of /usr/local/bin/percol to 755
Successfully installed percol
Cleaning up...
~~~

### pip freezeでインストール内容を確認

~~~bash
$ pip freeze | grep percol
percol==0.0.7
~~~

### percol の呼び出し確認

~~~bash
$ percol
                                    __
        ____  ___  ______________  / /
       / __ \/ _ \/ ___/ ___/ __ \/ /
      / /_/ /  __/ /  / /__/ /_/ / /
     / .___/\___/_/   \___/\____/_/
    /_/
                                 0.0.7 

You did not give any inputs to percol. Check following typical usages and try again.

(1) Giving a filename,

 $ percol /var/log/syslog

(2) or specifying a redirection.

 $ ps aux | percol
~~~

## 参照
https://github.com/mooz/percol
Percol | Windows7 + Cygwin(64) 環境に percol をインストール

# Percol | Windows7 + Cygwin(64) 環境に percol をインストール

## 概要
Windows7 + Cygwin(64) 環境に percol をインストールします。

## 前提
* Python2.7 をインストール済み
* cygwin, wget をインストール済み

## 手順
### setuptools のインストール

※%Python% => python のインストールディレクトリ

~~~bash
$ cd %Python%
$ wget https://bootstrap.pypa.io/ez_setup.py
$ python ez_setup.py
~~~

### pip のインストール

※最新版だとうまく動作しないため 1.4.1 を使用

~~~bash
$ easy_install https://pypi.python.org/packages/source/p/pip/pip-1.4.1.tar.gz
$ pip -V
pip 1.4.1 from /usr/lib/python2.7/site-packages/pip-1.4.1-py2.7.egg (python 2.7)
~~~

### pecorl のインストール

~~~bash
$ pip install percol
Downloading/unpacking percol
  Downloading percol-0.0.7.tar.gz
  Running setup.py egg_info for package percol

Installing collected packages: percol
  Running setup.py install for percol
    changing mode of build/scripts-2.7/percol from 644 to 755

    changing mode of /usr/bin/percol to 755
Successfully installed percol
Cleaning up...
~~~

### pip freezeでインストール内容を確認

~~~bash
$ pip freeze
git-remote-helpers==0.1.0
percol==0.0.7
wsgiref==0.1.2
~~~

### percol の呼び出し確認

~~~bash
$ percol
                                    __
        ____  ___  ______________  / /
       / __ \/ _ \/ ___/ ___/ __ \/ /
      / /_/ /  __/ /  / /__/ /_/ / /
     / .___/\___/_/   \___/\____/_/
    /_/
                                 0.0.7

You did not give any inputs to percol. Check following typical usages and try again.

(1) Giving a filename,

 $ percol /var/log/syslog

(2) or specifying a redirection.

 $ ps aux | percol
~~~

## 参照
https://github.com/mooz/percol
Hubot | forever で Hubot(Hubot-Kandan adapter) をデーモンとして起動する

# Hubot | forever で Hubot(Hubot-Kandan adapter)  をデーモンとして起動する

## 概要
forever で Hubot-Kandan をデーモンとして起動します。

## 前提
* 検証環境は Ubuntu 14.04
* node.js, npm はインストール済み

## 手順
### forever のインストール

~~~bash
sudo npm install forever -g
~~~

### hubot-kandan 起動スクリプトの作成

~~~bash:start_hubot.sh
#!/bin/bash
forever start -c coffee node_modules/.bin/hubot -a kandan
~~~

### hubot-kandan 停止スクリプトの作成

~~~bash:stop_hubot.sh
#!/bin/bash
forever stop -c coffee node_modules/.bin/hubot
~~~

### hubot-kandan 再起動スクリプトの作成

~~~bash:restart_hubot.sh
#!/bin/bash
./stop_hubot.sh
./start_hubot.sh
~~~

## 確認

~~~bash
$ cd %hubot%

# Hubot ( hubot-kandan ) を 起動
$ ./start_hubot.sh
info:    Forever processing file: node_modules/.bin/hubot

# 起動確認
$ forever list
info:    Forever processes running
data:        uid  command script                            forever pid  logfile                         uptime
data:    [0] oNQH coffee  node_modules/.bin/hubot -a kandan 4628    4630 /home/vagrant/.forever/oNQH.log 0:0:0:52.791

# Hubot ( hubot-kandan ) を 起動
$ ./stop_hubot.sh
info:    Forever stopped process:
data:        uid  command script                            forever pid  logfile                         uptime
[0] oNQH coffee  node_modules/.bin/hubot -a kandan 4628    4630 /home/vagrant/.forever/oNQH.log 0:0:2:20.968

# 停止確認
$ forever list
info:    No forever processes running

# 再起動の確認のため、 Hubot を起動
$ ./start_hubot.sh
info:    Forever processing file: node_modules/.bin/hubot

# 再起動の確認のため、新規の Hubot Script を追加。スクリプトを追加します
$ vi ./scripts/deathma.coffee
# スクリプトの編集内容は下記記事のものを利用します。
# HubotのScriptを自作する - デスマコロシアムのURLを返却するScript
# http://qiita.com/tbpgr/items/7ed860b22ea6c7191111
~~~

* 新規追加した script がまだ有効化されていないことをKandanから確認

![before_restart.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ad393284-b737-8e8b-54bd-2a409742470c.png)

* Hubotを再起動します

~~~bash
$ ./restart_hubot.sh
info:    Forever stopped process:
data:        uid  command script                            forever pid  logfile                         uptime
[0] Or0F coffee  node_modules/.bin/hubot -a kandan 4676    4678 /home/vagrant/.forever/Or0F.log 0:0:6:54.571
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: node_modules/.bin/hubot
~~~

* 新規追加した script が有効化されたことをKandanから確認

![after_restart.png](https://qiita-image-store.s3.amazonaws.com/0/43480/81af5681-4049-51cf-0516-83ff77aaa351.png)

## 参照
https://github.com/nodejitsu/forever
FTPサーバの構築


外部のシステムとファイルのやりとりを自動的にやる必要があり、FTPサーバを構築する必要がありましたので、そのメモ。

# FTPサーバ(vsftpd)のインストール

```bash
$ sudo yum install vsftp
```

# FTPサーバの設定

FTPサーバをインストールして作成された設定ファイルを編集します。

```bash
$ sudo vi /etc/vsftpd/vsftpd.conf
```

| 名前 | 設定値 |備考|
|:------------:|:------------:|:------------|
|anonymous_enable|NO|匿名ユーザーのログイン禁止|
|chroot_local_user|YES|ユーザーのルートディレクトリをログインしたディレクトリにする<br><br>つまりログインしたディレクトリから上にいけなくなる<br><br>ただしchroot_list_enable=YESの場合はchroot_list_fileで指定したユーザーは除外される|
| userlist_enable|YES|ユーザーのアクセス許可設定<br><br>userlist_denyがNOの場合はユーザーリスト（※1）で指定したユーザーのアクセスのみを許可する|
| userlist_deny|NO|ユーザーのアクセス許可設定|
| pasv_enable|YES|FTPの接続をパッシブモードにする<br><br>[パッシブモードとは](http://e-words.jp/w/PASVE383A2E383BCE38389.html)|
| pasv_addr_resolve|YES|IPアドレスからホスト名を取得<br><br>pasv_addressにIPアドレスを指定する場合はいらないかも|
| pasv_address| <接続先サーバのアドレス> | |
| pasv_min_port| <ポート番号>|使用するポートの最小値|
| pasv_max_port| <ポート番号>|使用するポートの最大値|
| user_config_dir| <ディレクトリのパス>|ユーザーごとの設定ファイルを格納してあるディレクトリ<br><br>このディレクトリの下にユーザーIDと同じ名前のファイル名を作成するとそこの設定ファイルを見に行く<br><br>ログインディレクトリをユーザーごとに変更する場合（※2）などに使えます|
| use_localtime|YES|タイムスタンプを日本時間に変更|

pasv〜とuser_config_dir、use_localtimeはおそらくないので新規に追加します。

※1
ユーザーリストは
userlist_file=<ファイルパス>
で指定します。何も指定しなければ`vsftpd/user_list`か`vsftpd/vsftpd.user_list`の中を見るようです。

この中には1行ごとにユーザー名を入れていくだけ。


* * *

※2
ログインディレクトリを変更する場合は`local_root`を使用します。
例）hogehogeユーザーの場合

```/etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vsftpd_user_conf
```

```
touch /etc/vsftpd/vsftpd_user_conf/hogehoge
vi /etc/vsftpd/vsftpd_user_conf/hogehoge
```

```/etc/vsftpd/vsftpd_user_conf/hogehoge
local_root=/var/ftp/hogehoge
```
VisualStudioTools for Unity のインストールとデバッグ方法

最近無料化した、Visual Studio Tools for Unity の導入方法と、インストール後のUnityのデバッグ方法についてのメモです。
このツールを使用することで、VisualStudio上でブレークポイントを設定してデバッグや、コールスタック表示などのデバッグが可能になります。

なお、スクリーンショットなどはVisualStudio2010を使用したときのものです。

##1. Visual Studio Tools for Unityのダウンロード##
  下記ホームページからダウンロードできます。

　[VisualStudio2010](http://visualstudiogallery.msdn.microsoft.com/6e536faa-ce73-494a-a746-6a14753015f1)
　[VisualStudio2012](http://visualstudiogallery.msdn.microsoft.com/7ab11d2a-f413-4ed6-b3de-ff1d05157714)
　[VisualStudio2013](http://visualstudiogallery.msdn.microsoft.com/20b80b8c-659b-45ef-96c1-437828fe7cf2)
　[VisualStudio2015](https://visualstudiogallery.msdn.microsoft.com/8d26236e-4a64-4d64-8486-7df95156aba9)


##2. Visual Studio Tools for Unityのインストール##
　**Visual Studio ○○○○ Tools for Unity.msi**というファイルが落ちてくるので、実行します。
　なお、実行前にUnityとVisualStudioは念のため終了させておいたほうがいいです。
　インストール画面では、基本的にNextやYesなどを押していけば問題ないです。


##3. プロジェクトへパッケージをインポート##
デバッグを行うためには、作業中のUnityプロジェクトに、専用のパッケージ(中身はDLLなど)をインポートする必要があります。

 インポートするには、
　
　a．ウィンドウメニューの「Assets」→「Import Package」→「Visual Studio ○○○○ Tools」をクリックします。
　![uvst01.png](https://qiita-image-store.s3.amazonaws.com/0/50022/e260b79a-d2b7-bc37-3143-7c440ee2e19d.png)

　b. 下記のようなメニューが出てくるので、全部にチェックを入れて「Import」を押せばＯＫです。
　![uvst02.png](https://qiita-image-store.s3.amazonaws.com/0/50022/baf96491-c949-9d7c-1762-151a660077e4.png)

　c. インポートが成功すると、Assetsフォルダ以下に*UnityVSフォルダ*
が生成され、必要なファイルがインポートされています。
　　また、Windowメニューに「Visual Studio Tools」が追加されます。

　d.インポートすると、Unityで使用するソリューションファイルが**UnityVS.unity.sln**という専用のファイルに変更されます。（プロジェクトファイルなども専用のファイルに変わります）
　インポート後にスクリプトなどをダブルクリックしてVisualStudioを起動しようとすると自動で生成されます。
　もし生成されない場合は、下図のウィンドウメニューからも生成することができます。
![UnityVS05.png](https://qiita-image-store.s3.amazonaws.com/0/50022/8f2c7baa-96d6-e344-0c73-48ad7db177ce.png)


##4. VisualStudioからのデバッグ方法##

　**a.デバッグ開始方法**
　デバッグ方法はとても簡単で、通常のアプリケーションをビルドするときと同様に、VisualStudioからデバッグ実行するだけです。（ツールバーにある「▲｣ボタンを押すetc）
　VisualStudioがデバッグ実行状態になります。

　初回のみ、デバッグ実行をすると下記のようなアタッチ先ウィンドウが表示され、実行中のUnityにアタッチをする必要がある場合があります。（ビルドしていない場合はまずビルドが走ります）
　![uvst03.png](https://qiita-image-store.s3.amazonaws.com/0/50022/dae10290-2243-7c09-b645-0cc8e5320b03.png)

　アタッチ状態でブレークポイントを設定しておけば、Unityのエディターからプレビューするとブレークを張ったところで処理をとめることができます。
　ここでUnityがフリーズすることがあるようです。その場合は最悪Unityプロセスを終了させてUnityを再起動します・・・

　**b.デバッグ終了方法**
　終了方法も、通常のアプリケーションをデバッグしているときと同じで、デバッグ実行を終了させるだけです。（ツールバーにある「■｣ボタンを押すetc）
「保守性・管理性が劇的に上がるPHPのスマートなコードの書き方12選」が酷すぎて草

http://bulkserver.jp/blog/2014/08/07/php-code/
正直釣りではないかと疑うレベル。


> 1．括弧の省略
> この括弧は基本的にはつけますが、中の実行コードが1つだけの場合は省略することができるのです。
> 命令が二つ以上であれば括弧でくくる必要があります。セミコロン（;）が2個以上のときはカッコでくくり、1個の場合は省略してもよいと覚えるといいでしょう。
> 省略することで見やすくなるので、おすすめです。

いきなり有り得ない。
{}の省略は絶対的悪手で厳禁です。

**PSR-2**
http://www.infiniteloop.co.jp/docs/psr/psr-2-coding-style-guide.html
> 各構造本文は、中括弧で囲わなければなりません。 これは構造の見え方を標準化し、追加実装等が発生した際のエラーを抑えます。

**Zend framework**
http://framework.zend.com/manual/1.12/ja/coding-standard.coding-style.html
> 場合によっては、これらの文で波括弧が必要ないこともあります。 しかし、このコーディング規約では、このような例外を認めません。 "if"、"elseif" あるいは "else" 文では、常に波括弧を使用しなければなりません。

**Pear**
http://pear.php.net/manual/ja/standards.control.php
> 構文的に省略可能な場合でも、波カッコを使用することを推奨します。 波カッコを付けることにより可読性が向上し、 新しく行を追加した際に論理的なエラーが紛れこむ可能性が減少します。

**CakePHP**
http://book.cakephp.org/2.0/ja/contributing/cakephp-coding-conventions.html
> 制御構造では、必要でなくとも常に中括弧を使います。 これはコードの可読性を高め、論理エラーが発生しにくくなります。

**Symfony2**
http://docs.symfony.gr.jp/symfony2/contributing/code/standards.html
> 制御文の本体の行数に関わらず、波括弧で制御文本体を囲います

[CodeIgniter](http://codeigniter.jp/user_guide_ja/general/styleguide.html)、[Yii](http://www.yiiframework.com/doc/guide/1.1/ja/basics.convention)には記載無し。

Pearが推奨している以外は全て{}必須です。


> 2．三項演算子
> 3．switch文

ここはまあいいや。
でもswitchのほうは例題がおかしいな。


> 4．for文
> 繰り返しの処理には以下のようにwhile文を使用します。

いや、どこの世界の常識だよ。
forとwhileとforeachは目的に応じて使い分けるべき。
つうかこの中じゃwhileが一番使わないよな。


> 5．変数宣言のみで配列への要素追加
> 配列への要素の追加はarray_pushを以下のように用います。

[array_push()](http://jp1.php.net/manual/ja/function.array-push.php)は関数呼び出しのオーバーヘッドがあるので、$array[]を使うのがデフォルト。
何らかの理由がある、あるいは配列を追加するときにarray_push()を使う、とすべき。


> 6．引数のデフォルト値
> `function test ($a = デフォルト値 , $b = デフォルト値 , $c)`

このような書き方はできない。
http://php.net/manual/ja/functions.arguments.php
> 引数のデフォルト値を使用する際には、デフォルト値を有する引数はデフォルト値がない引数の右側に全てある必要があることに注意して下さい。そうでない場合、意図したような動作が行われません。

.

> 7．関数でのglobal宣言

global死すべし。


> 8．条件式での変数定義
> それがtrueやfalseを示すものであれば、それ自体を条件式の中で変数に代入することができます。

いやそんな新発見みたいに言われても。
ファイル読み込みとか定番ですよね。

http://php.net/manual/ja/function.fgets.php
`while (($buffer = fgets($handle, 4096)) !== false)`
http://qiita.com/rana_kualu/items/8b4e09f0410605f8180c
`while(($now = gmp_nextprime($now)) < $max)`

例のように比較で括ればtrue/false以外のものも代入可能。


> 9．文字列への変数挿入
> `'私は'.$name.’と言います。年齢は’.$old.’歳です。よろしくおねがいします。’;`
> `"私は{$name}と言います。年齢は{$old}歳です。よろしくおねがいします。";`


`'私は' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . ’と言います。年齢は’. (int)$old . ’歳です。よろしくおねがいします。’;`
だよなあ。
つうか年齢にoldって。


> 10．empty

なんか微妙だけどまあいいや。
[リファレンス](http://jp1.php.net/manual/ja/types.comparisons.php)くらい示しておいた方がいいとは思いますが。


> 11．関数の中で同じ関数の呼び出し

再帰呼出しってキーワードくらい出しとこうよ。
どうでもいいが他項目のレベルに比べて再帰だけ妙にハードル高い気がする。

```php
function test($num){
    if($num<10){
        $a=$num++;
        test($a);
    }else{
        return false;
    }
}
```
あとこの関数は永久に止まりませんね。

> 12．結合代入演算子（.=）
> とても便利なので覚えてくといいでしょう。

さすがにこれを知らないとか無いだろ。
[+=とか<<=](http://php.net/manual/ja/language.operators.precedence.php)も個別に紹介していく気だろうか。


> まとめ

1、6、7以外はいちゃもんみたいになってしまったが、まあとにかく参考にしてはならないという点は揺るがない。
これを真に受けて{}を省略する人が出てこないことを祈るのみです。
[状態マシン図] 終了状態 (final state)

黒丸が開始疑似状態、黒二重丸が終了状態である。

![final_state1.png](https://qiita-image-store.s3.amazonaws.com/0/11188/38d9ba6a-0022-6c4f-a6b6-c50ae228241f.png)

これはプリンタの状態マシン図である。この図から以下のことが読み取れる

1. 状態マシンがスタートすると、電源ON状態になり、電源LED点灯したあと、待機中になる。
1. 待機中のときに、印刷要求が起きると、印刷中になる。
1. 印刷中になると、「印刷する」を開始し、それが終了すると、自動的に待機中に戻る。
1. 電源ON状態ではいつでも、電源OFF要求が起きると、電源LED消灯したあと、終了状態に遷移する。
1. 電源OFF要求が起きると、待機中であれば、直ちに、終了状態に遷移する。
1. 電源OFF要求が起きると、印刷中であれば、「印刷する」を直ちに中断して、終了状態に遷移する。印刷の終了を待つことはない。

UMLでは、終了状態は以下の特徴を持つと決められている。

1. 終了状態を起点とする遷移は設定することができない。
1. 入場時アクション、退場時アクション、doアクティビティを設定することができない。
1. 内部遷移を設定することができない。

次に、上の状態マシンを拡張して、印刷中状態に、サブ状態を設定し、その領域に３つの状態を追加してみよう。

![final_state2.png](https://qiita-image-store.s3.amazonaws.com/0/11188/32196575-212a-18ad-2db1-33a8f19d68cf.png)

印刷中のサブ状態には、領域が１つあって、その領域には終了状態がある。領域に終了状態があるときは、そこからどこにも遷移しない、という意味ではなく、 その領域が終了した、という意味に変わる。印刷中状態には領域が１つしかないので、その領域が終了したら、印刷中状態が終了したことを意味する。そうする と、ヌル遷移をたどって、待機中に遷移する。

一方、電源ON状態であれば、いつでも、電源OFF要求が有効であり、最上位の終了状態に遷移する。そこに遷移すると、そこからはもう、どこへも遷移できない。

整理すると、

1. 最上位で、終了状態に遷移すると、もうどこにも遷移できない。
1. 状態がサブ状態を持ち、そのサブ状態が領域を持っていて、そこに終了状態がある場合は、その終了状態に遷移すると、その領域が終了したことを意味する。
1. 状態のもつすべての領域が終了したら、その状態が終了したことになり、その状態を起点とするヌル遷移が発火して、その状態を抜けてくる。

印刷中状態を起点とするヌル遷移があるが、これは、印刷中に入場したら、ただちに退場してくる、という意味ではなく、印刷中の終了状態に遷移するまで、ヌル遷移が発火しないことを意味する。

つまり、終了状態が、最上位にあるのか、領域にあるのかで、振る舞いが変わる。

次に、UMLの定義を確認しよう。UML2.0 State Machine (状態機械) モデルでは、節点には疑似状態と状態があり、最終状態（終了状態）は状態である。最終状態（終了状態）は疑似状態ではない。

![uml20_state_machine_final.png](https://qiita-image-store.s3.amazonaws.com/0/11188/ea60c385-b5ff-6fc9-8c50-84a4905ff718.png)

まとめると、終了状態は、以下のような状態である。

1. 終了状態を起点とする遷移は設定することはできない。
1. 終了状態を含む領域を含む状態には、その状態を起点とする遷移を設定することができ、その遷移にはイベントを設定できる。ヌル遷移に設定することもできる。
1. 2のような終了状態には、他の状態と同様、とどまることができ、イベントを待ち受けることができる。

---

関連記事

1. [状態マシン図] 終了同期を取る<br>
[http://qiita.com/saltheads/items/f49e7418bb3034949bad](http://qiita.com/saltheads/items/f49e7418bb3034949bad)
Unity Androidのapk作成ではまった

Error building Player: Win32Exception: ApplicationName='ドライブ\****\sdk\tools\zipalign.exe', CommandLine='4 "D:\aaa\bbb\ccc/ddddd/Package_unaligned.apk" 
"D:\aaa\bbb\ccc/ddddd/Package.apk"', CurrentDirectory='ccc/ddddd'


■解決策
ここに書いてある通り
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10131113960

*ドライブ\aaaa\sdk\build-tools\19.1.0の直下にあるzipalign.exeを*
*ドライブ\aaaa\sdk\tools　の下にコピーする。*
もう少しだけ Dockerfile と仲良くしたい

概要
=====

Dockerfile ともっと仲良くしたい。
すごく大きな不満があるわけじゃないけれど、↓のようなことができると嬉しい。

- 1 つのプロジェクト内で複数の Dockerfile を用途に応じて使い分けたい
- ある Dockerfile から別の Dockerfile を include したい
- Dockerfile 内で変数が使えたりすると嬉しい

Rails プロジェクトを想定していますが、他のフレームワークでも rake と ActionView が使えるならイケるはず。

実装
=====

`rake dockerfile:build` という rake タスクを作ってみる。

```lib/tasks/dockerfile.rake
namespace :dockerfile do
  desc "build Dockerfile"
  task :build  => :environment do
    view_context = ActionView::Base.new('.')

    # 必要に応じて値をバインドする
    view_context.assign(name: 'hoge')

    out = view_context.render(template: "Dockerfile.#{Rails.env}", prefixes: '')
    File.write("#{Rails.root}/Dockerfile", out)
  end
end
```

プロジェクトのルートにそれぞれの環境に応じた Dockerfile を erb 形式で作ってあげる。

```
ProjectRootDir
├── Dockerfile.base.erb
├── Dockerfile.development.erb
├── Dockerfile.production.erb
├── Dockerfile.staging.erb
└── Dockerfile.test.erb
```

中身はこんな感じ。

```Dockerfile.base.erb
# Add application
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

RUN mkdir /home/app/my_app
ADD . /home/app/my_app
RUN chown -R app:app /home/app/my_app
WORKDIR /home/app/my_app
RUN bundle install
```

```Dockerfile.development.erb
FROM kakipo/my-base:latest

MAINTAINER <%= @name %>

<%= render file: 'Dockerfile.base.erb' %>

# Add mysql
# only for development
RUN sudo apt-get -y install mysql-server
RUN mkdir /etc/service/mysql
ADD docker/mysql.sh /etc/service/mysql/run

EXPOSE 80

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]
```

で、 `rake dockerfile:build RAILS_ENV=development` としてやると、プロジェクトのルートディレクトリに `Dockerfile` が作成される。

``` Dockerfile:Dockerfile
FROM kakipo/my-base:latest

MAINTAINER hoge

# Add application
WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bundle install

RUN mkdir /home/app/my_app
ADD . /home/app/my_app
RUN chown -R app:app /home/app/my_app
WORKDIR /home/app/my_app
RUN bundle install

# Add mysql
# only for development
RUN sudo apt-get -y install mysql-server
RUN mkdir /etc/service/mysql
ADD docker/mysql.sh /etc/service/mysql/run

EXPOSE 80

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]
```

上手に焼けました。


終わりに
=====

やんごとなき事情によってこんな対応になってしまったのだけれども、もっといい方法があると思う。
extern(C++)時のwchar及びdcharの名前修飾が変

**D 2.067.0にて修正されました**

環境:Windows
バージョン:2.065及び2.066.0-rc2

C++で書かれたライブラリ等を利用しようとした時に
extern(C++)と書くことでx64であれば
MSVC++でコンパイルされたlibやobjを直接リンクすることができますが
dmd側の名前修飾が正しくないのではないかと思います


```lang:test.d
extern(C++){
    void fc2(wchar){}
    void fc4(dchar){}
}
```

```lang:test.cpp
void fc2(wchar_t){}
```

**test.cppのobj**
cl 17.00.50727.1 (MSVC++) x86/x64
`void fc2(wchar_t)   ?fc2@@YAX_W@Z   void __cdecl fc2(wchar_t) // msvc`
dmc 8.42n x86
`void fc2(wchar_t)   ?fc2@@YAX_Y@Z   void __cdecl fc2(wchar_t) // dmc`

**test.dのobj**
dmd 2.065 x86/x64
`void fc2(wchar)     ?fc2@@YAX_Y@Z   void __cdecl fc2(wchar_t) // dmc
void fc4(dchar)     ?fc4@@YAXK@Z    void __cdecl fc4(unsigned long)`
dmd 2.066.0-rc2 x86
`void fc2(wchar)     ?fc2@@YAXG@Z    void __cdecl fc2(unsigned short)
void fc4(dchar)     ?fc4@@YAX_Y@Z   void __cdecl fc2(wchar_t) // dmc`
dmd 2.066.0-rc2 x64
`void fc2(wchar)     ?fc2@@YAXG@Z    void __cdecl fc2(unsigned short)
void fc4(dchar)     ?fc4@@YAX_W@Z   void __cdecl fc4(wchar_t) // msvc`

期待される名前修飾 x86 (dmc製objとリンク可能)
`void fc2(wchar) ?fc2@@YAX_Y@Z void __cdecl fc2(wchar_t) // dmc
void fc4(dchar) ?fc4@@YAXK@Z void __cdecl fc4(unsigned long)`
期待される名前修飾 x64 (msvc製objとリンク可能)
`void fc2(wchar) ?fc2@@YAX_W@Z void __cdecl fc2(wchar_t) // msvc
void fc4(dchar) ?fc4@@YAXK@Z void __cdecl fc4(unsigned long)`

~~2.065はdmcから引きずったバグなのかと思いましたが~~
(↑dmcとmsvcのwchar_tの名前修飾が違うのは仕様のようです)
2.0660-rc2ではよりおかしくなっているようにも感じます

wchar_tの厳密な正しい表現ではないかもしれませんが
http://dlang.org/htod.html では
wchar_tをwcharに変換すると表記されているので間違ってはいないと思います

8/13: dcharの大きさと記載不足などを修正
2015/12/17: だいぶ前に直っているが修正