OmniAICreator/Qiita-1.07M huggingface dataset:
gulp & Browserifyでnode_modules以外のmoduleもrequireする

サンプルプロジェクトは[こちら](https://github.com/wordijp/multi-require-test)です。

# 概要

このプロジェクトは、gulp & Browserify構成でnode_modules以外のmoduleもrequireする為のサンプルプロジェクトです。
以下のmoduleを、複数のパッケージ管理、パッケージ管理外からrequireしています。

```coffee:app.coffee
$ = require('jquery')        # 野良からrequireしたい
_ = require('underscore')    # Bower配下からrequireしたい
Enumerable = require('linq') # node_modules配下からrequireしたい
```

# Usage

```
npm install
bower install
gulp (build | watch | clean)
```

## node_modules以外のrequire対応方法

node_modules以外のrequire対応は、[flexi-require](https://github.com/wordijp/flexi-require)を利用しています。

これをbrowserify.pluginに設定値とともに渡してbundleする事により、node_modules以外のmoduleもrequire出来るようにしています。

例えば、このサンプルプロジェクトではunderscore以外のmoduleをpublic/common-bundle.jsへ、アプリロジックとunderscore moduleをpublic/bundle.jsへと分けていますが、その時の処理は以下のようになっています。

```coffee:gulpfile.coffee

entries = ['./lib/scripts/app.js']

# underscore以外のmoduleをcommon-bundle.jsへ
b = browserify()
b.plugin('flexi-require', {
  getFiles: () -> entries, # このファイルで使用しているmodule一覧がrequireされる
  require:['*', './non_package_modules/jquery-2.1.3.js:jquery']
  external: ['underscore']
})
b.bundle()
  .pipe(source 'common-bundle.js')
  .pipe(gulp.dest 'public')

# アプリロジック、underscore moduleをbundle.jsへ
b = browserify(entries)
b.plugin('flexi-require', {
  require: ['underscore']

  external: ['*']
})
b.bundle()
  .pipe(source 'bundle.js')
  .pipe(gulp.dest 'public')
```

※実際にはwatchifyの対応やbundle-common.jsを必要時にだけbundleしてる等の対応をしてる為もう少し複雑になっています。

# ファイル構成

```
root
├── gulpscripts                        - gulp用スクリプト置き場
|   ├── ast-parser.coffee              - コードのパース処理を行う(get-requires-from-filesで使う)
|   ├── get-requires-from-files.coffee - ファイルからrequire文字列を取得する
|   ├── gulp-callback.coffee           - gulpのストリームの流れからcallbackを呼ぶ
|   └── to-relative-path.coffee        - 絶対パスを相対パスへ
├── bower.json          - Bowerパッケージ
├── package.json        - nodeパッケージ
├── non_package_modules - 野良module
|   └── jquery-2.1.3.js - (あえてパッケージ管理をしていない)
└── gulpsfile.coffee - gulpメイン
```

# flexi-requireを作った経緯

このプラグインは、node_modules以外に対応した使われているmoduleをbundleファイルに含めるプラグインです。

Browserifyでnode_modules以外のmoduleも扱うプラグインは他にも[browserify-bower](https://github.com/tminglei/browserify-bower)や[debowerify](https://github.com/eugeneware/debowerify)等がありますが、browserify-bowerは使われていないmoduleも含めると動作になっており、bundleファイルの不要な肥大化が起こります、その為未使用のmoduleを取り除くには設定値側のメンテが必要になってしまいます。

debowerifyはその心配がないのですが、こちらはtransformに渡すプラグインとなっており、コード内のrequire文字列を直接書き換えてしまう為、bundleファイルを分割した際にaliasが変わっている為に参照が切れる、という問題が起こります。

flexi-requireはこれらの問題を解決する為に作成しています。
Railsで作成したアプリケーションをApache/Passegerで動作させるまでのメモ


###インストールのディレクトリ構成

1. /var/lib 下に作成したRailsアプリケーション(仮にRApp1)を配置する。
2. /var/www/html/<配置したいディレクトリ名>　→　/var/lib/RApp1/public にシンボリックリンクを張る。

###データベースの設定を変更（productionの追加）をする。

``` database.yml
development:
  adapter: sqlite3
  pool: 5
  timeout: 5000
  database: db/development.sqlite3

production:
  adapter: mysql2
  database: <データベース名>
  host: <データベース・サーバアドレス>
  username: <DBアクセス／ユーザー名>
  password: <DBアクセス／パスワード>
  encoding: utf8
  
```


###データベースを反映させる。

実DBからリバースしたケースでは、DB:reset で再構築

```terminal
$ rake db:reset RAILS_ENV=production
```


空の状態からmigrateで反映できるときは以下。

```terminal
$ rake db:migrate RAILS_ENV=production
```

###Gemをインストールする

```terminal
$ bundle install
```

####production環境/development環境でインストールするGemを使い分けたい場合
例）Prodiction環境ではMySql2、Development環境では Sqlite3を使う場合

```Gemfile
group :development, :test do

  gem 'sqlite3'

end

group :production do

  gem 'mysql2'

end
```

のように書いておき、production環境でGemをインストールするときは、

```terminal
$ bundle install --without development test
```

を実行する。

###apache/passenger をインストールする
※筆者はRedmineを動作させるのにインストール済みであった為、インストール手順は割愛

``` passenger.conf
RailsBaseURI /RApp1
SetEnv SECRET_KEY_BASE <暗号文字列>
```
※railsアプリケーションが動作するフォルダを指定する。
※production環境は、SECRET.KEYを環境変数から取得することを推奨されている為、環境変数SECRET_KEY_BASEをここで設定している。
※暗号文字列は以下のコマンドで取得する

``` terminal（railsアプリフォルダにて）
$ bundle exec rake secret
ここに<暗号文字列>が出力される。
```

####passengerの設定を反映させる。
``` terminal
＃ service httpd restart
```

以上
【Swift】バックグランドの音楽とアプリ内の効果音(AVfoundation)を同時に再生する

備忘録です。

音楽を鳴らしながら利用できるアプリを作りたかったのですが、
アプリの中でAVfoundationで効果音を鳴らすと後ろで流している音楽が止まってしまいました。
それを解消するときのポイントです。

###ポイント
・鳴らす効果音はcaf形式にすること
・appdelegate内でおまじないをすること

###効果音はcaf
mp3形式の効果音を利用していましたが、caf形式に変換する必要があります。
cafへの変換はmacであればターミナルで

`$ afconvert -f caff -d 0 "元ファイル.mp3" "新しいファイル.caf" `

などで変換可能です。

###AppDelegateでおまじない

```lang:AppDelegate.swift

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {        
        
        // バックグラウンドでの音の再生を許可
        let audioSession : AVAudioSession = AVAudioSession.sharedInstance()
        audioSession.setCategory(AVAudioSessionCategoryAmbient, error: nil)
        
        return true
    }
```
が自分の場合は必要でした。
デフォルトではAVFoundationは他音声と同時再生しない仕様になっているそうです。
バックグラウンドで音楽と共存できない！という方がいればお試しください

###参考
http://www.ecoop.net/memo/archives/ios_play_sounds_and_background_music_simultaneously.html
https://developer.apple.com/jp/documentation/AudioSessionProgrammingGuide.pdf
https://sites.google.com/a/gclue.jp/swift-docs/ni-yinki100-ios/3-avfoundation/001-yin-yuanno-zai-sheng
CentOS環境にて、Sublime Text 3で日本語入力を可能にする。

##はじめに。
[以前の投稿](http://qiita.com/tethys_seesaa/items/cac307a6f5ced282d9fc)で、MobaXtermから呼び出したソフトウェアにてMozcを使うことにより日本語入力ができるようにしました。
しかし自分のメインエディタである[Sublime Text 3](http://www.sublimetext.com/3)では、この方法で日本語入力ができません。
[この辺](http://qiita.com/kanpou_/items/bc739c1215fc222f17c8)を見ると、Ubuntuでは比較的楽なステップでMozcによる日本語入力が可能ですが、CentOSだと`emacs-mozc`にかなり依存性が存在し、これのインストールが比較的ハードルとなります。
[このサイト](http://memo.poolbird.com/2013/11/centos-64-mozc-install.html)を参考に、`emacs-mozc`インストールし、CentOS上のSublime Text 3にて日本語入力可能にしてみました。その時のメモです。

##Vineからのパッケージをアンインストールする。
依存性がかなり面倒くさいので、[以前入れた](http://qiita.com/tethys_seesaa/items/cac307a6f5ced282d9fc)Vineからのパッケージをアンインストールします。

```shell-session
sudo rpm -ev mozc
sudo rpm -ev mozc-utils-gui
sudo rpm -ev ibus-mozc
sudo rpm -ev tegaki-zinnia-japanese
sudo rpm -ev mozc-server
```

##Mozc、emacs-mozcのダウンロード。

ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/sawaa/CentOS_CentOS-6/x86_64/

上記から、下記をダウンロードします。

`zinnia-0.06-0.el6.1.1.x86_64.rpm`
`zinnia-tomoe-0.06-0.el6.1.1.x86_64.rpm`
`mozc-tools-1.5.1090.102-1.el6.1.noarch.rpm`
`mozc-1.5.1090.102-1.el6.1.x86_64.rpm`
`emacs-common-mozc-1.5.1090.102-1.el6.1.x86_64.rpm`

***

http://www.filewatcher.com/b/ftp/ftp.pbone.net/vol2/ftp5.gwdg.de/pub/opensuse/repositories/home%3A/sawaa/CentOS_CentOS-6/noarch-0.html

上記から、下記をダウンロードします。
`emacs-mozc-1.5.1090.102-1.el6.1.noarch.rpm`
`emacs-mozc-el-1.5.1090.102-1.el6.1.noarch.rpm`

##Mozc、emacs-mozcのインストール。
下記のような感じです。

```
sudo rpm -ivh zinnia-0.06-0.el6.1.1.x86_64.rpm
sudo rpm -ivh zinnia-tomoe-0.06-0.el6.1.1.x86_64.rpm
sudo rpm -ivh mozc-1.5.1090.102-1.el6.1.x86_64.rpm
sudo rpm -ivh mozc-tools-1.5.1090.102-1.el6.1.noarch.rpm
sudo rpm -ivh mozc-1.5.1090.102-1.el6.1.x86_64.rpm
sudo rpm -ivh mozc-1.5.1090.102-1.el6.1.x86_64.rpm
sudo rpm -ivh ibus-mozc-1.5.1090.102-1.el6.1.x86_64.rpm
sudo rpm -ivh emacs-common-mozc-1.5.1090.102-1.el6.1.x86_64.rpm
sudo rpm -ivh emacs-mozc-1.5.1090.102-1.el6.1.noarch.rpm
sudo rpm -ivh emacs-mozc-el-1.5.1090.102-1.el6.1.noarch.rpm
```
##IBUSのセットアップ
[以前](http://qiita.com/tethys_seesaa/items/cac307a6f5ced282d9fc#%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E9%96%A2%E4%BF%82)と同じなので省略します。

##Sublime Text 3の日本語入力
[こちら](http://qiita.com/kanpou_/items/bc739c1215fc222f17c8)にある通り、パッケージ`SublimeMozcInput`を使用しました。レポジトリの追加、パッケージのインストールは参考先と同じです。

##結果
デフォルトのキーバインド(ctrl + \ キー)で日本語入力が可能になりました。

![subl.png](https://qiita-image-store.s3.amazonaws.com/0/32925/4d2a4fd2-5097-a5a4-a9f7-31428ca962a3.png)

##おわりに。
最近、Linux上で日本語入力を入れることが多くなり、Sublime Text 3で対応する必要に迫られ、かき集めてみました。CentOSで`emacs-mozic`は **依存性地獄** とは以前から聞いていましたが、なんとかなりました。
Android Stuidoで実機を接続解除する手順(Macの場合)


![スクリーンショット 2015-05-05 17.01.30.png](https://qiita-image-store.s3.amazonaws.com/0/58330/eddd8cfd-65b5-c9e4-3b4a-401193721dbf.png "スクリーンショット 2015-05-05 17.01.30.png")

1. [command] + [shift] + [a] を同時に押す

2. `Enter action or option name:`と表示されるので、`adb`と入力する

3. `Android: Enable adb Integration`が表示されているので`ON/OFF`のスイッチを`OFF`にする

4. USBを外します

5. 念のために`ON/OFF`のスイッチを`ON`にしておく
Rails単体でAngularJSとTwitterBootStrapを組み合わせた環境構築


* Rails単体でAngularJSとTwitterBootStrapを共存させる方法について、自分のやりたい手法がまとまった記事がなかったので構築手順をまとめました。
* AngularJSとTwitterBootStrapの詳しい使い方については書いていません…
* 深く使い込んだ訳ではないので問題があれば随時追記予定。

## 概要
* [UI Bootstrap](http://angular-ui.github.io/bootstrap/)を用いて2つを共存させる。
* [Rails Assets](https://rails-assets.org/)を用いてAngularJSのパッケージ管理をする。
* 簡素な自分用アプリを作る予定だったのでフロントとバックは分けずにRails単体。
  * Yeomanも使わない。

## 詳細

### TwitterBootstrap導入

* gemの[twitter-bootstrap-rails](https://github.com/seyhunak/twitter-bootstrap-rails)を使って導入する。

#### 手順
* 既にいいページがたくさんあるので手順は割愛。
  * https://github.com/seyhunak/twitter-bootstrap-rails/blob/master/README.md
  * http://qiita.com/mm36/items/564fe34f57d9f9e3acf5
  * http://ruby-rails.hatenadiary.com/entry/20140801/1406818800

#### その他
* `app/assets/javascripts/application.js`に追加されるbootstrapのrequireは後に追加するUI Bootstrapと競合しそうなので後で手で外す必要がありそう。

### AngularJS導入
* [Rails Assets](https://rails-assets.org/)を使って導入する。
  * Bowerのパッケージをgemにコンバートしたものをホストしているサービス。
  * BowerとBundlerをうまい具合につないでくれる。
  * というわけでこれに乗っかるのが楽そう。

#### 手順
* Gemfileにsourceを追加する。

  ``` Gemfile
source 'https://rails-assets.org'
```
  これで`gem 'rails-assets-<Bower パッケージ名>'`の記法でBowerのパッケージが入る。

* Gemfileに適宜必要なパッケージを追加する。

  ``` Gemfile
gem 'rails-assets-angular'
gem 'rails-assets-angular-resource'
```
  これでbundle installすると依存パッケージと共にinstallされる。

* AngularJSを読み込むようにする。

  ``` app/assets/javascripts/application.js
//= require angular
//= require angular-resource
//= require myapp_angular
```

* アプリを作成して導入完了。

  ``` app/assets/javascripts/myapp_angular.js.coffee
window.App = angular.module('myApp', ['ngResource'])
```

#### その他
* ここまでの手順でも両方それっぽく動くのだが、jQueryでDOM直接操作する等はAngularJSのポリシーに反しているとのことなのでTwitterBootstrapとの相性が悪い。

### UI Bootstrap導入

* [UI Bootstrap](http://angular-ui.github.io/bootstrap/)
  * 「BootstrapのコンポーネントをDirective化し、AngularJSのバインディングで扱えるようにしたもの」とのこと。
* こちらもRails Assetsで導入する。

#### 手順

* [angular-ui-bootstrap-bower](https://github.com/angular-ui/bootstrap-bower)をGemfileに追加する。

  ``` Gemfile
  gem 'rails-assets-angular-ui-bootstrap-bower'
```
  * [angular-ui-bootstrap](https://github.com/angular-ui/bootstrap)もあるが、こっちはソースコード本体なのでGemfileにはbower用の名前を指定する。本体の説明についてはこっちのリポジトリを見るのが良さそう。

* こちらもjsで読み込めるようにする

  ``` app/assets/javascripts/application.js
//= require angular
//= require angular-resource
//= require angular-ui-bootstrap-bower
//= require myapp_angular
```

* 利用するモジュールにui.bootstrapを追加して導入完了

  ``` app/assets/javascripts/myapp_angular.js.coffee
window.App = angular.module('myApp', ['ngResource', 'ui.bootstrap'])
```


#### 動作確認

* [公式サイト](http://angular-ui.github.io/bootstrap/)にあるDirectiveを適当に使って動作を確認する。

``` app/views/hoges/show.html.haml
%div{'ng-controller' => 'HogesController'}
  %alert{type: 'info'} {{hoge.name}}
  %alert{type: 'danger'} {{hoge.name}}
```

## 参考文献
この辺の情報を組み合わせてまとめた。
  * http://qiita.com/zoetro/items/eb3a44e4baa8c367b4aa
  * http://tnakamura.hatenablog.com/entry/2014/06/19/113000
  * http://www.ohmyenter.com/?p=1071
はじめてのMEANスタック #1


#プロジェクト作成
こちらを参考にしてみた。
http://cwbuecheler.com/web/tutorials/2013/node-express-mongo/

node.js、expressはインストール済みとして進めます。
MacOSXで作業していますが、他OSでもあまり変わらないと思います。

```
$express nodetest
```

nodetestというディレクトリが出来るので移動します。
そこにpackage.jsonというファイルがあるので
mongodbとmonkを追加します。
mongooseが有名ですが、ここではmonkを使います。
理由は参考にした先がmonkだから。。


```package.json
{
  "name": "nodetest",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.12.0",
    "cookie-parser": "~1.3.4",
    "debug": "~2.1.1",
    "express": "~4.12.2",
    "jade": "~1.9.2",
    "morgan": "~1.5.1",
    "serve-favicon": "~2.2.0",
    "mongodb": "*",
    "monk": "*"
  }
}
```
追加したのは末尾の２項目です。
実際の内容はexpressのバージョンによって変わってくると思います。

npm installコマンドでpackage.jsonにしたがってインストールします。

```
$npm install
```

ここでmonddb用のディレクトリを作っておきます。
まだ要らないけど。

```
$mkdir data
```

下記コマンドでWebサーバとして動きます。

```
$npm start
```
http://localhost:3000/
にアクセスしてみると"Welcome to express"というメッセージが出ています。

#ハローワールド
とりあえず自動で生成されたapp.jsを開いてみると既に60行ほどのコードが出力されています。

```app.js
app.use('/', routes);
app.use('/users', users);
```

ここがルーティングの定義で「/」以下にアクセスしたときの動作を
route/index.jsで定義します。
今はusersは無視しておきます。

```route/index.js
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;
```
自動生成した時点のindex.jsの内容が上記の通りです。
これは「/」にアクセスするとviews/index.jadeで描画するということになります。
テンプレートとして明示的に指定した場合はjadeではなくejsなど。

ここにハローワールド用のルーティングを追加してみましょう。

```route.index.js
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

/* GET Hello World page. */
router.get('/helloworld', function(req, res) {
    res.render('helloworld', { title: 'Hello, World!' })
});

module.exports = router;
```
"GET Hello World page"のブロックを追加しました。
/helloworldにアクセスするとhelloworld.jadeで描画するという指定です。
helloworld.jadeというファイルはもちろん存在しないのでviewsディレクトリの下に新規作成します。

```views/helloworld.jade
extends layout

block content
    h1= title
    p Welcome to #{title}
```
jadeはインデントで動作が変わるので注意。
1行目はlayout.jadeの内容を継承しますという指定。
layout.jadeの中に"block content"という箇所があるので
それがここで記述した"block content"以下に置き換わります。

ここで再度npm startして、
http://localhost:3000/helloworld
にアクセスすると「Hello, world!」と出ていれば成功。

今回はここまで。
Meteor モバイルアプリ(iOS/Android)のスプラッシュ画像(起動画面画像)を変更する方法


# Meteor モバイルアプリのスプラッシュ画像を変更する

Meteor のモバイルアプリ(iOS/Android)起動時に表示されるスプラッシュ画像を変更するには、Meteor プロジェクトディレクトリ直下にある mobile-config.js に以下の記述を追加します。

```javascript:mobile-config.js
App.launchScreens({
  // iOS
  'iphone'            : 'resources/splash/splash-320x480.png',
  'iphone_2x'         : 'resources/splash/splash-320x480@2x.png',  // 640x960
  'iphone5'           : 'resources/splash/splash-320x568@2x.png',  // 640x1136
  'iphone6'           : 'resources/splash/splash-375x667@2x.png',  // 750x1334
  'iphone6p_portrait' : 'resources/splash/splash-414x736@3x.png',  // 1242x2208
  'iphone6p_landscape': 'resources/splash/splash-736x414@3x.png',  // 2208x1242
  'ipad_portrait'     : 'resources/splash/splash-768x1024.png',  
  'ipad_portrait_2x'  : 'resources/splash/splash-768x1024@2x.png', // 1536x2048
  'ipad_landscape'    : 'resources/splash/splash-1024x768.png',
  'ipad_landscape_2x' : 'resources/splash/splash-1024x768@2x.png', // 2048x1536
  
  // Android (9-patch PNG)
  'android_ldpi_portrait'  : 'resources/splash/splash-200x320.9.png',
  'android_ldpi_landscape' : 'resources/splash/splash-320x200.9.png',
  'android_mdpi_portrait'  : 'resources/splash/splash-320x480.9.png',
  'android_mdpi_landscape' : 'resources/splash/splash-480x320.9.png',
  'android_hdpi_portrait'  : 'resources/splash/splash-480x800.9.png',
  'android_hdpi_landscape' : 'resources/splash/splash-800x480.9.png',
  'android_xhdpi_portrait' : 'resources/splash/splash-720x1280.9.png',
  'android_xhdpi_landscape': 'resources/splash/splash-1280x720.9.png'
});
```

Android のスプラッシュ画像は 9-patch PNG(*.9.png) という特殊な PNG 画像になっています。
9-patch PNG の詳細については以下のサイトを参考にしてください。

- Draw 9-patch | Android Developers<br>http://developer.android.com/tools/help/draw9patch.html
- [Android アプリの UI デザイン] 9-patch の作りかたのまとめと Tips ｜ Developers.IO<br>http://dev.classmethod.jp/smartphone/android/android-ui-design-9-patch/


# 参考

- App Splash Screen Sizes · phonegap/phonegap Wiki<br>https://github.com/phonegap/phonegap/wiki/App-Splash-Screen-Sizes
- Mobile Config File | Documentation - Meteor<br>http://docs.meteor.com/#/full/mobileconfigjs
- App.launchScreens | Documentation - Meteor<br>http://docs.meteor.com/#/full/App-launchScreens
.pyファイルの再import

# 概要

IPython Notebook等でmoduleの読み込みだけしてコード自体は別のテキストエディタで編集しているときに2回目以降のimportが効かなかったのでメモ。

# 解決策

sys.modulesから読み込みたいモジュールを消す。

```py:fuga.py
import sys
try:
    del sys.modules['hoge']
except Exception as e:
    pass
import hoge
```
APUEの中に書いてあるdaemonの書き方

Daemon Coding Rules
-------------------

1. call `umask` to set file mode creation mask.
2. `fork` and have parent process `exit`.
  * When invoked as shell command, letting parent `exit` make the shell think the command is finished
  * ensure that the child process is not a process group leader. This is a prerequisite for `setsid`
3. call `setsid`
  * The child process will be the leader of the new process group
  * The child process will be the leader of the new process session
  * The child process will be detached from its controlling terminal
4. `chdir`
5. close files inherited from its parent
6. redirect stdin, stdout, stderr to `/dev/null`
Laravel5でHTML/Form Helper等を使わない場合の対応メモ


Laravel5から、HTML/Formヘルパーが標準では読み込まれなくなりました。また、普通のForm（POST）でも、csrf_tokenが要求されうようになったので、無理に使うこともないかなと。

Laravelに限らず、HTML系のHelperってあまり意味を感じないし、ここのところは、各種JS,CSSフレームワークとの連動が必要なのでむしろ邪魔です（強いて言うなら、postでdeleteする時に1行で書ける時だけ便利）。

Helperを使わない場合に遭遇する面倒なことへの対処をまとめる。

###Form関連

####action先の指定

action先の指定は悩ましい。action="hoge/create"などとするのが無難だが、hoge/index=/みたいに指定していた際に、相対パスが崩れてしまう（とにかくうまくいかない）。なので、url()を使う（で囲む）のが無難。

```html
<form method="post" action="{{url('posts/create')}}" id="form_create">
```


####csrf_tokenの送付

csrf_tokenはcsrf_token()で生成できるので、hiddenのvalueに入れて送付。

```html
<input type="hidden" name="_token" value="{{csrf_token()}}">
```

####idの送付

更新処理等で、

```html
{!! Form::open(['action' => ['PostsController@postEdit', $post->id]]) !!}
```
という感じで送ったidは、Controller側で、

```php
public function postEdit(Request $request,$id){}
```

として受けられるが、普通に<form>のhiddenでPOSTすると、$request->idで取得する必要がある。

####delete（等の際、Formで改行が入るのを直す）

多くのRESTでは、deleteはpostで受ける。ということは、Formを仕込む必要がある。これを、Helperだと、

```html
{!! Form::open(['action' => ['PostsController@postDelete', $article->id]]) !!}
```
という感じで書ける。getにして、<a href=""></a>で書いてしまってもまあ、内部システムならいいかなと思うが、Formで書くと、長い。まあ、長いのはいいのだが、<form>はblockなので、改行が入る。こを防ぐには、styleでinlineを指定する。

```html
<form method="post" action="{{url('posts/delete')}}" style="display:inline;">
	<input type="hidden" name="id" value="{{$post->id}}">
	<input type="hidden" name="_token" value="{{csrf_token()}}">
	<button type="submit" class="btn btn-info btn-xs btn-delete">削除</button>
</form>
```

とりあえず、こんな感じ。

必要に応じて随時メモる。
Laravel5でAPI(JSON Response)


###やりたいこと
・json_encode()のようにJSONで値を返したい。
・外部サイトからPOSTを受ける際のcsrf_token()チェックを無効にしたい（する必要がある）

###JSON Response

なにも難しいことはない。
普通に配列を作って、Response::json($array)で返す。
最もシンプルな例は、こんな感じ。Content-Typeもapplication/jsonとしてくれるようだ。

```php
Route::get('hoge',function(){

	$response = array();

	$response["status"] = "OK";
	$response["message"] = "No problem";

	return Response::json($response);

});
```

ajax？のリクエストでもValidator等も普通に使える。まあ当然。

```php
public function create()
{
	//
	$input = \Input::all();

	$rules = [
		'name'=>'required',
		'email'=>'required',
		'password'=>'required',
	];

	$messages = [
		'name.required'=>'name is must.',
		'email.required'=>'email is must.',
		'password.required'=>'password is must.',
	];

	$validation = \Validator::make($input,$rules,$messages);

	$response = array();
		
	if($validation->fails()){

		$response['status'] = "NG";
		$response['message'] = "validation error.";

		return \Response::json($response);


	}else{

		//
		//DB書き込みなどの処理

		$response['status'] = "OK";
		$response['message'] = "no problem.";

		return \Response::json($response);
	}
}
```

###POSTの際のcsrf_token対応
外部からPOSTされる場合、csrf_tokenのチェックを無効にする必要がある。が、どうやら、特定のRouteにだけ適用/非適用をというのができないみたい。

####全部OFFにする

app/Http/Kernel.phpの

```php
'App\Http\Middleware\VerifyCsrfToken',
```
の行をコメントアウトするか消す。

特定のコントローラでのみONにするのなら、当該のコントローラのコンストラクタに、

```php
$this->middleware('App\Http\Middleware\VerifyCsrfToken'); 
```
と書くことでONにできるらしい。が、メソッド単位では無理らしい。exceptは使えないのだろうか？そのうち試す。

###追記

Laravel5.1でexpectがサポートされるようだ（2015年5月4日）。

```php
protected $except = [
 'webhook/*'
];
```
Laravel5でテスト(PHPUnit)


Laravelでは、PHPUnitとPHPSpecの両方が最初から使えるようになっている。
Compose.jsonを見ると、

```php
	"require-dev": {
		"phpunit/phpunit": "~4.0",
		"phpspec/phpspec": "~2.1"
	},
```
となっている。

###最初のテスト

####テストファイルの場所
Laraveでは、testはtestsディレクトリに置く。これは、phpunit.xmlの中で定義されているので必要に応じて変えることもできる。

####テストファイルの命名規則

・テストファイルはファイル名を、xxxTest.phpとすることでテスト対象となる。
・メソッドは、testXXXXX()とするか、@testコメントをつけておくとtestと認識される。

####テストの書き方

testsフォルダの中には、

・ExampleTest.php
・TestCase.php

の２つのファイルがあり、ExampleTest.phpは、

```php
<?php

class ExampleTest extends TestCase {

	/**
	 * A basic functional test example.
	 *
	 * @return void
	 */
	public function testBasicExample()
	{
		$response = $this->call('GET', '/');

		$this->assertEquals(200, $response->getStatusCode());
	}

}
```
となっており、TestCase.phpを継承しているのがわかる。Laravelにおける全てのテストはこのTestCase.phpを継承する。

####テストの実行
テストは、

```bash
アプリフォルダにおいて、./vendor/bin/phpunit
```
とすることで、testsフォルダ内のテストが実行される。ファイル別に実行したい場合は、

```bash
./vendor/bin/phpunit ExampleText.php
```
などとする。

###簡単なWebAPIのテスト

個人的に最もよく利用するWebAPIのテストを行ってみる。まず、サンプルとして、ルートに、

```php
Route::get('apis/echo',function(){

	$res['status'] = "OK";
	$res['message'] = "No problem";

	return Response::json($res);
});
```
と書いてみる。statusとしてOK。messageとしてNo problemを返す。

```php
{"status":"OK","message":"No problem"}
```

SimpleApiTest.phpを作る。artisanコマンド等はないみたい。ExampleTest.phpをコピーするのが早い。

```php
<?php

class SimpleApiTest extends TestCase {

	public function testEchoApi()
	{
		//call $this->clientは5から廃止された？
		$response = $this->call('GET', '/apis/echo');

		$this->assertEquals(200, $response->getStatusCode());

		$obj = $response->getData();
		//response->getContent()もある
		//$decode = $response->getData(true);とするとarrayで返る

		$this->assertEquals("OK",$obj->status);
		$this->assertEquals("No problem",$obj->message);
	}

}
```
こんな感じで書ける。callするURLの頭は/をつけたほうがいいらしい。

responseのメソッドは

・getStatusCode()
・getContent()
・getData()

などが最低限、assertは、

・assertEquals()

があればなんとかなる！？

・assertTrue
・assertFalse
・assertNull(\$var)
・assertRegExp(\$pattern,$str)

なども。詳しくはPHPUnitのページへ。

###前処理の実行
テストに先立ち、実行したい処理があればsetUp()に書く。なお、その時は必ずparent::setUPを呼べと。

```php
	public function setUp(){

		//必要らしい
		parent::setUp();

		//artisanコマンドの実行
		Artisan::call('migrate:refresh');
		Artisan::call('db:seed');

		//filterが無くなったので使えない（代わりに何かある？）
		//Route::enableFilters();
	}
```
migrateなど、artisanコメンド等も実行できる。

###その他調べ物

・testの際に自動的にtest dbにする機構（laravel5からは変わった）
・Route::enableFilters()相当機能のがどうなったか
Laravel5でカスタムライブラリ使いたい

Laravel5でカスタムライブラリを利用する時のメモ。どこに置いて、どう使う？か。
結論から言えば、「こうしろ！」というのは無いみたい。たぶん。

###簡単編

どこでもいいので、置く。そして後はnamespaceを指定し、呼び出し。composerでロードする方法もあるが、とりあえずこれがあれば十分。

例えば、appにMyLibsフォルダを作り、その中にMyClass.phpを置く。

```
<?php namespace App\MyLibs;

class MyClass{

	public function sayHello(){
		return "Hello!";
	}

}
```
これを呼び出すには、例えばルートにて、

```
Route::get('hoge',function(){

	$hello = new App\MyLibs\MyClass;
	return $hello->sayHello();
	
});
```
とする。もちろんuse App\MyLibs\MyClass;としてもよい。

###ファサードを作る
ある程度の規模なら、ファサード化したほうがLaravelっぽい。

・元クラスの作成
・サービスプロバイダの作成
・サービスプロバイダの登録
・サファードクラスの作成
・利用

という流れになる。

####元クラスの作成

めんどいので、上記のMyClassをそのまま使う。

####サービスプロバイダの作成

ひな形を作る。

```
php artisan make:provider HelloServiceProvider
```

ファサードクラスでgetFacadeAccessor()が返す文字列と、クラスをbindする。

```
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelloServiceProvider extends ServiceProvider {

	/**
	 * Bootstrap the application services.
	 *
	 * @return void
	 */
	public function boot()
	{
		//
	}

	/**
	 * Register the application services.
	 *
	 * @return void
	 */
	public function register()
	{
		//
		$this->app->bind(
			'hello',
			'App\MyLibs\MyClass'
		);
	}

}

```

これだけ。

####サービスプロバイダの登録

config/app.phpにプロバイダを登録。

```
'providers'=>[
...
			'App\Providers\HelloServiceProvider',
...
]
```

####ファサードクラスの生成

特定の場所はないようなので、とりあえずapp直下に作る。生成コマンドは無いようだ。

```
<?php namespace App;

use Illuminate\Support\Facades\Facade;

class Hello extends Facade
{
	protected static function getFacadeAccessor(){
		return 'hello';
	}
}
```

####エイリアスの設定

折角なので\Hello::で呼べるようにしたい。config/app.phpのaliasesに追加する。

```
'aliases'=>[
...
		'Hello'		=> 'App\Hello',
...
]
```

####利用
例えばルートにて、

```
Route::get('hoge',function(){

	// $hello = new App\MyLibs\MyClass;
	// return $hello->sayHello();

	return \Hello::sayHello();
});
```

うーん。めんどい。これにより、ファサードクラスで戻る文字列を変更するか、サービスプロバイダでbindするクラスを変えれば、元コードを変更せずに機能を変えられる・・・。
Laravel5でカスタムバリデーション


Laravelでカスタムバリデーションを作るのはちょっとめんどい。
いくつかのやり方があるようですが、ここでは、Validatorを継承したクラスを作り、それをサービスプロパイダに登録するやりかたを検証してみます。

###やりたいこ
・なんでもいいので、カスタムバリデーションを作る。

###やりかた
・Illuminate\Validation\Validatorを継承したクラスでルールを定義
・サービスプロバイダを定義
・サービスプロバイダを登録
・カスタムバリデーションを使う

という流れ

###Validatorを継承したクラスにルールを記述
場所はどこでもいいのだけどapp/Servicesに置いているサンプルがあったので、それをまねる。
クラスを定義しない方法もありますが、ここにどんどん増やしていけばいいので、クラスを１つ作っておく方が楽。

```php
<?php namespace App\Services;


class CustomValidator extends \Illuminate\Validation\Validator
{
	public function validateFoo($attribute,$value,$parameters){
		return $value == "foo";
	}

	public function validateBoo($attribute,$value,$parameters){
		return $value == "boo";
	}

}
```
こんな感じ。実際は正規表現でパターンみたりする。
ここで重要なことは、validateFooやvalidateBooという名前は、使用時には、foo, booとなる。つまり、validateはプリフィックスとなる。また、ルールの頭は小文字となる。なお、validateMyRuleとした場合は、myRuleとなるようだ（なお、カスタムエラーメッセージの定義にはmy_ruleとなるような記述もあるが未確認）。

###サービスプロバイダを定義
ServiceProviderのひな形は、artisan make:providerでつくる。

```php
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use App\Services\CustomValidator;

class ValidatorServiceProvider extends ServiceProvider {

	/**
	 * Bootstrap the application services.
	 *
	 * @return void
	 */
	public function boot()
	{
		//
		\Validator::resolver(function($translator,$data,$rules,$messages){
			return new CustomValidator($translator,$data,$rules,$messages);
		});
	}

	/**
	 * Register the application services.
	 *
	 * @return void
	 */
	public function register()
	{
		//
	}

}
```

###サービスプロバイダの登録
config/app.phpにプロバイダを登録

```php
		'App\Providers\ValidatorServiceProvider',
```

###カスタムバリデーションを使う
登録が完了すれば、後は普通のルールと同じ。

```php
		$input = \Input::all();

		$rules = [
			'name'=>'required',
			'email'=>'required',
			'password'=>'boo',
			'card'=>'foo',
		];

		$messages = [
			'name.required'=>'name is must.',
			'email.required'=>'email is must.',
			'password.required'=>'password is must.',
			'password.boo'=>'password is boo.',
			'card.foo'=>'カードはfooと入れて下さい。',
		];

		$validation = \Validator::make($input,$rules,$messages);
```
標準のメッセージはlang/en/validation.phpのcustomをいじればいいらしい（なくても動く）。attribute毎に定義しないといけないのかな？

```php
	'custom' => [
		'card' => [
			'foo' => 'card is must from lang.',
		],
	],
```

###メモ

おかしくなったら

```bash
php artisan cache:clear
```

を、実行してみる。SFTPで同期作業していた際に、何度かパーミッションのエラーが出た。その際にcache:clearで治った。
[Rails4][gem]bundleした後に出たエラーとその対処法



## エラー


````terminal

g08m11$ rails c
There is a version mismatch between the spring client and the server.
You should restart the server and make sure to use the same version.

CLIENT: 1.3.3, SERVER: 1.3.4

````

## 解決方法

````terminal

g08m11$ gem list | ggrep -i spring

guard-spring (0.0.4)
spring (1.3.4, 1.3.3, 1.2.0)

g08m11$ gem uninstall spring --version = '1.3.4'
ERROR:  While executing gem ... (Gem::Requirement::BadRequirementError)
    Illformed requirement ["="]

g08m11$ gem uninstall spring --version '=1.3.4'
Successfully uninstalled spring-1.3.4

g08m11$ rails c
Loading development environment (Rails 4.1.8)
[1] pry(main)>

````

## ちなみに

上記でgrepではなくggrepを実行していますがタイプミスではありません。



[【比較結果付き】macでgrepを最新版にするためにやったことまとめ](http://g08m11.hateblo.jp/entry/2014/03/12/012511)
C++で競技プログラミングするときの雛形

```lang:template.cpp

#include<bits/stdc++.h>
#define FOR(k,m,n) for(int(k)=(m);(k)<(n);(k)++)
#define REP(k,n) FOR((k),0,(n))
#define ALL(a) begin(a),end(a)
using namespace std;
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef unsigned long long ull;
typedef unsigned long ul;
typedef unsigned int  ui;
const int INF=numeric_limits<int>::infinity();
const int MOD=1000000007;
const double EPS=1e-9;
int main(int argc,char**argv)
{
  cin.tie(0);
  ios_base::sync_with_stdio(false);
  return EXIT_SUCCESS;
}
```
日本語の文字（ひらがなカタカナ漢字）だけにマッチする正規表現 in Perl

```lang:perl
# ひらがな, かたかな, 漢字のいずれかを一文字以上含む行を抽出
use Encode qw/decode_utf8 encode_utf8/;
if (decode_utf8($_) =~ /(\p{InHiragana}|\p{InKatakana}|\p{InCJKunifiedideographs})/) {
  print;
}
```
環境によるかも知れないが、decode_utf8する必要があった。

ScriptとBlockという二つの分類方法。Blockは連続したコードポイント(文字のID)をまとめたものであるのに対し、後者はコードポイントと関係ない基準でまとめあげたグループ（漢字全体、とか）。ScriptではHan、BlockではCJKunifiedideographが、それぞれ漢字集合に付けられた名前。（Hanはhan4yu3のhan。han2yu3なら韓語。）InCJKunifiedideographs も Han  も漢字だが、前者のほうが範囲はせまい。日本語に限定したい場合にどちらが良いかは分からない。

InHiraganaとHiragana、InKatakanaとKatakanaもやや異なる。特にカタカナの場合、半角を含むか、中黒（・）や長音符（ー）を含むかどうかという大きな違いがある。詳しくは [こちら](http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html#standard ) を参考に。

ググって出てきた。多謝。
http://d.hatena.ne.jp/mukku-ver3/20100104

長いintroductionがなく、簡便な正規表現の解説。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm
お名前クラウドサーバー(たぶんアプリクラウドも）でPlay FrameworkのDB接続に失敗する場合にすること

GMOのお名前クラウドでPlayFrameworkを立てて、application.confで以下のようにmysql接続する設定を書いていた。

```
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/anime_admin_development?characterEncoding=UTF8"
```

activator runで起動すると以下のような意味不明なエラーがでる

```
[root@10-134-25-12 sora-playframework-scala]# activator
[info] Loading project definition from /mnt/code/sora-playframework-scala/project
[info] Set current project to sora_scala (in build file:/mnt/code/sora-playframework-scala/)
[sora_scala] $ start 80
[info] Wrote /mnt/code/sora-playframework-scala/target/scala-2.11/sora_scala_2.11-1.0-SNAPSHOT.pom
 
(Starting server. Type Ctrl+D to exit logs, the server will remain in background)
 
Play server process ID is 16051
[info] play - database [default] connected at jdbc:mysql://localhost/anime_admin_development?characterEncoding=UTF8
[error] n.s.e.Cache - Unable to set localhost. This prevents creation of a GUID. Cause was: 10-134-25-12: 10-134-25-12: unknown error
java.net.UnknownHostException: 10-134-25-12: 10-134-25-12: unknown error
        at java.net.InetAddress.getLocalHost(InetAddress.java:1484) ~[na:1.8.0_25]
        at net.sf.ehcache.Cache.<clinit>(Cache.java:214) ~[net.sf.ehcache.ehcache-core-2.6.8.jar:na]
        at net.sf.ehcache.config.ConfigurationHelper.createCache(ConfigurationHelper.java:296) [net.sf.ehcache.ehcache-core-2.6.8.jar:na]
        at net.sf.ehcache.config.ConfigurationHelper.createDefaultCache(ConfigurationHelper.java:219) [net.sf.ehcache.ehcache-core-2.6.8.jar:na]
        at net.sf.ehcache.CacheManager.configure(CacheManager.java:722) [net.sf.ehcache.ehcache-core-2.6.8.jar:na]
Caused by: java.net.UnknownHostException: 10-134-25-12: unknown error
        at java.net.Inet4AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_25]
        at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:907) ~[na:1.8.0_25]
        at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1302) ~[na:1.8.0_25]
        at java.net.InetAddress.getLocalHost(InetAddress.java:1479) ~[na:1.8.0_25]
        at net.sf.ehcache.Cache.<clinit>(Cache.java:214) ~[net.sf.ehcache.ehcache-core-2.6.8.jar:na]
[info] play - Application started (Prod)
[info] play - Listening for HTTP on /0.0.0.0:80
```

mysqlほホストにはlocalhostを指定してるのに10-134-25-12に接続しにいってしかもドメインからIPに変換できないよ＞＜とエラーになってる。
まさに(ﾟДﾟ)ﾊｧ?状態だが、お名前クラウドはeth0が通常のローカルホストで、eth1にもなんかインターナルIPがふられておりこれが10.34.25.12となっていた。

理由は不明だがplay->mysqlが10-134-25-12に接続しにいってる以上/etc/hostsに以下のような設定をふやせばとりあえず問題は解決する

```
[root]# cat /etc/hosts
127.0.0.1   localhost.localdomain localhost 10-134-25-12
```
.gitはo-xしておいたほうが良い

.gitがo+xだと
気が付かずにDocumentRoot配下に.gitフォルダを放り込んだ場合、
.git/config などwebから閲覧できる状態になる。

```
chmod o-x .git
```

しておけばよい。



所有者がapacheの場合は別の方法で.gitにアクセス出来ないようにすること。
Macでanacondaを使ってpython3の機械学習環境を構築する

# macでanacondaを使ってpython3を用いた機械学習環境を構築する
## 概要
機械学習を実践するにあたって、matlaboやRに変わって、pythonを使うことが多くなってきているようだ。
オープンソースのプロジェクトが活発で、pythonさえ覚えれば、matlaboのlibraryを使ったグラフ描画を行ったり、numpy、scipyを使って数値計算をすることが出来るため人気のよう。
pythonのversion違いなどによる、コンフリクトを避けるためanacondaやminicondaを使うのが簡単なよう。
anacondaとminicondaの違いは今のところ理解していないが、anacondaは全部盛り、minicondaは自分で使いたいライブラリを個別にインストールするよう。
注意点としては、python2とpython3で言語仕様が大きく変更されたこと。


## pyenvのインストール

```
brew install pyenv
```

```{~/.bash_profile}
eval "$(pyenv init -)"
```

## anacondaのインストール

```
現在インストールされているバージョンの確認
pyenv versions

anacondaの最新版を探す
pyenv install -l

python3に対応したanacondaはanaconda3
pyenv install anaconda3-xxxxx
```

## python shellをのversionをanacondaにするには
```
bash_profileを読み込ませる（terminalを再起動等)したあと
pyenv shell anaconda3-xxxxx
```

## python shell上でファイルを実行する
```
python shellの起動
python

python3だと
>>> exec(open("hoge.py").read())

python2だと
>>> execfile("hoge.py")
```

## python shellのversionを共存させる。

```
pyenv local 2.7.9 3.4.2
pyenv rehash
```
pyenv rehashしないと反映せず、ハマりました。
ESXiにSSHログイン後メンテナンスモードを解除する

# 前提(以下で確認した)
* ESXi 5.0.0
* ESXi 5.1.0

# ESXi ログイン
* 前提としてESXiログイン可状態設定(コンソールで直接/VCenterで)

```c:command
ssh root@IPAddr
```

# ESXi メンテナンスモード解除

```c:command
vim-cmd hostsvc/maintenance_mode_exit
```

# VM仮想ゲスト一覧

```c:command
vim-cmd vmsvc/getallvms
```

# VM仮想ゲスト状態確認

```c:command
vim-cmd vmsvc/power.getstate [Vmid つまり 数字]
```

# VM仮想ゲスト電源ON

```c:command
vim-cmd vmsvc/power.on [Vmid つまり 数字]
```

## シナリオ
* ESXiホストの電源全部落ちている状態から起動したい
* VCenterインストールVM仮想ゲスト[vcenter] を起動したい

### 1. ESXi ログイン(Windows [Putty/TeraTerm] or Linux [OpenSSH] など)

```c:command
   ssh root@192.168.111.14
```

### 2. VM仮想ゲスト一覧

```c:command
   ~ # vim-cmd vmsvc/getallvms
   Vmid        Name                                 File                                  Guest OS          Version   Annotation
   1      vcenter          [esxi_local] vcenter/vcenter.vmx                   windows7Server64Guest   vmx-08
   2      vtest            [esxi_local] vtest/vtest.vmx                       centos64Guest           vmx-08
   3      vmyumrepov        [esxi_local] vmCent6.4Minimal/vmCent6.4Minimal.vmx   centos64Guest           vmx-08
   4      vmCent06minimal   [esxi_local] vmCent06Minimal/vmCent06Minimal.vmx     centos64Guest           vmx-08
```

### 3. VM仮想ゲスト状態確認(ESXi)

```c:command
   ~ # vim-cmd vmsvc/power.getstate 1
   Retrieved runtime info
   Powered off
```

### 4. VM仮想ゲスト電源ON(ESXi)

```c:command
   ~ # vim-cmd vmsvc/power.on 1
   Powering on VM:
```

### 5. VM仮想ゲスト状態確認 再び(ESXi)

```c:command
   ~ # vim-cmd vmsvc/power.getstate 1
   Retrieved runtime info
   Powered on
```

### 6. VM仮想ゲストログイン(Windows [RDP])

```c:RemoteDeskTop
   192.168.111.184:3389
```
Cannot render console from 10.0.2.2!と言われました

`remote: true`な呼び出しをしていたら、コンソールに`Cannot render console`という表示がでました。

```
Started GET "/events/404" for 10.0.2.2 at 2015-05-05 04:21:25 +0000
Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by EventsController#show as JS
```

`config/application.rb`にwhitelistを追加したら表示がでなくなりました。

```rb:whitelisted_ipsを追加
config.web_console.whitelisted_ips = '10.0.2.2'
```

# 参考
http://stackoverflow.com/questions/29417328/how-to-disable-cannot-render-console-from-on-rails
Vagrant Teraterm pluginを作ってみた

過去に [Windows - VagrantにTeratermマクロで接続する - Qiita](http://qiita.com/tiibun/items/61c64c6b261887d455ee) なんて記事を書いていましたが、どうせならとプラグインを作ってみました。

## インストール
（TeraTermはインストールしておく必要があります）
```
vagrant plugin install vagrant-teraterm
```

## 使い方
```
vagrant teraterm
```

または

```
vagrant teraterm　id
```

```id``` はglobal-statusで出てくるid


## 設定

何も設定しなくても最低限動作はすると重います。

```ruby
Vagrant.configure(2) do |config|
  # ...
  config.teraterm.exe_path = 'C:\Program Files (x86)\teraterm\ttermpro.exe'
  config.teraterm.ini_path = "teraterm.ini"
  config.teraterm.log_path = "teraterm.log"
  config.teraterm.extra_args = "/ssh-v"
  # ...
end
```

* ```exe_path``` ttermpro.exeファイルパス。設定がなくてもPATHかProgram Filesから探します。
* ```ini_path``` TERATERM.INIファイルパス。絶対パスかVagrantfileからの相対パス。
* ```log_path``` ログファイルパス。絶対パスかVagrantfileからの相対パス。
* ```extra_args``` 追加の引数。


## ソースリポジトリ

https://github.com/tiibun/vagrant-teraterm

不正な動作等あればissue, PRください。

今回、Vagrantのpluginはおろかrubyのコードも初めて書いたのでおかしかなところがあると思いますのでアドバイスいただけると幸いです。
Kodiの操作コマンド

#HDMI ON/OFF  
OFF

	tvservice -o

ON

	tvservice -p

#音量調節

	kodi-send -a "SetVolume(10)"
	kodi-send -a "SetVolume(100)"
	kodi-send -a "Mute"

#再生停止

	kodi-send -a "PlayerControl(Stop)"

#Kodi 再起動

	kodi-send -a "KODI.RestartApp"
Try Package つくった。

# Try

[try](https://atom.io/packages/try)

元々 Vim で [tryit](https://github.com/t9md/vim-tryit) を作って、使ってた。
単純な機能だが、使用頻度はとても多かった。
Vim から Atom に乗り換えた(??本当か?俺!?)ので作った。  

機能としては選択した範囲を決まったファイルの末尾に貼り付けるだけのパッケージ。

![gif](https://raw.githubusercontent.com/t9md/t9md/12fba4ff60861ae1acd973407c93a62edf61c956/img/atom-try.gif)

# 何の役に立つのか？

コードを読んでいてどう動くのか想像ができないコードに出くわした時、実際に動かして動きを確かめるのが一番だ。
そんな時に良くあるワークフローは

1. コードを選択してコピー
2. 一時ファイルをつくって貼り付け
3. [script](https://atom.io/packages/script) のようなスクリプトランナーで実行して動作確認、その後色々いじりながら更に理解を深める。

1と２はパターンなのでワンステップにしたい。
2 の部分で、どのディレクトリに、どのファイルに、どんな拡張子に、といった事を決めるのに若干の脳のコンテキストスイッチが発生してこれはバカにならない。
この僅かなコンテキストスイッチにより、集中が切れ、脳のメモリがクリアされてしまうかもしれないから。

この Package は 1と2の部分をワンステップにする。
選択して、Try バッファに貼り付ける。
例えば、CoffeeScript のコードなら、`try.coffee` に貼り付ける。
貼り付け先のファイル名はカーソル位置のGrammar scope を見るので、Markdown 内の CoffeeScript とかでも try.coffee に貼り付ける。

# 使い方

エディタ内でテキストを選択した状態で、

- キーマップから `try:paste`
- Command palette から `try:paste`.
- コンテキストメニューから、`Paste to Try`.


# Keymap

デフォルトのキーマップはありません。
自分で好きなのを設定して下さい。

e.g.

* `F10` で貼り付ける場合

```coffeescript:keymap.cson

'atom-text-editor:not([mini])':
  'f10': 'try:paste'
  
```

* [vim-mode](https://atom.io/packages/vim-mode) つかってるなら以下で Visual mode から `space t` で貼付けできる。

```coffeescript:keymap.cson
'atom-text-editor.vim-mode.visual-mode':
  'space t': 'try:paste'
```

# To improve scope2extname.

Grammar の Scope から拡張子への変換テーブルは未だ未熟です。
使って足りなければ、以下の Issue にコメントして下さい。
[Improve scope 2 extname mapping](https://github.com/t9md/atom-try/issues/1).

# TODO

- [x] Paste した部分をハイライト
vimでdeleteいろいろ

最初**vi**の使いにくさとカスタマイズの弱さが嫌で長らく**emacser**だったのですが、NeoBundleとかを知ってから**vim**に乗り換えています。
.vimrcをいろいろいじると簡易なIDEとしても十分使え...ることもありますし(**go言語**の場合は**かなりよい**)、colorschemeがイイカンジですから。

改めていろいろ使ってみると「こんなのあったらいいなあ」→「実はありました！」みたいなのが多くて驚きます。
今回は**delete**についてメモ代わりにまとめてみました。

### 基本的なお話(おさらい)
**vim**の場合、**delete**(削除)は消したい位置にカーソルを持って行ってコマンドモードで
`d<enter>`もしくは`dd`(1行削除)
みたいにします。つまり**d**がdeleteコマンドです。念のため。

### 今回のお題
こういう行があったとします。

```
          hello, xdelete!!!
```

- 左側の空白を削除したい

あっちこっちで編集してるとうっかりハードタブとソフトタブ(スペース)が入り混じったりしてインデントがぐちゃぐちゃになるケースって結構あると思います。そのときは左側の空白を一回消してタブ打ち直すか！となりませんか？(**go**だと**go fmt**があるから無敵か...)
こういう場合は行頭にカーソルを移動してから
`d/h<enter>`(文字'h'より手前を削除)
または正規表現を使って
`d/\S<enter>`('\S'(空白以外の文字)より手前を削除)でOK。
文字数がわかってれば` 10x `でもいいんですが上記のようにハードタブと混じってるとアウトですし。
結果はもちろん

```
hello, xdelete!!!
```

になります。

- 特定の文字まで含めて削除したい

xdeleteのxがイヤンな感じなので消します。
この場合は`dfx`(文字'x'を含めて削除)。
結果は

```
delete!!!
```
になります。

- カーソルがどこにいてもその単語をまるまる消したい

例えばカーソルがhelloの最初のlの前にいた場合、単純に`dw`ってすると

```
          he, xdelete!!!
```
になりますが、`daw`とすると単語がまるまる消えて

```
          , xdelete!!!
```
になり、`daW`とすると続くカンマと空白まで消えて

```
          xdelete!!!
```

となります。

## 補足

他のコマンド、c, y, tなどでも同じように使えます。
OpenelecとKodiのカスタムスプラッシュ

##Kodiのカスタムスプラッシュ画像の場所

    /usr/share/kodi/media/splash.png

注）カスタムイメージにする必要あり

##OpenELECでカスタムスプラッシュ画像の場所

    /flash/oemsplash.png

###/flashに書き込み権限を付けてマウントするコマンド

    mount -o remount,rw /flash
素数だ・・素数を数えるんだ・・・


**■コード確認**

```
[root@entaku19890818 ~]# cat prime.py
#coding: UTF-8
from bottle import route,template,run
@route('/prime')

def prime():
        MAX = 10000
        LIST = range(2, MAX + 1)
        for i in range(2, int(MAX ** 0.5)):
                LIST = [x for x in LIST if (x == i or x % i != 0)]
        for j in LIST:
                 print j

run(host='www.entaku19890818.com', port=8080)
```

**■実行**

```
[root@entaku19890818 ~]# python prime.py
Bottle v0.13-dev server starting up (using WSGIRefServer())...
Listening on http://www.entaku19890818.com:8080/
Hit Ctrl-C to quit.

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
42.146.144.127 - - [05/May/2015 12:58:58] "GET /prime HTTP/1.1" 200 0
```

ホントはWebに表示したいんだけどなー
Kodiの設定時に一旦ロックをかけてから設定するための手順

###Kodiのロックファイルを作成してしばらく停止させる

    touch /var/lock/kodi.disabled

###HDMIをONにする

    tvservice -p

###ロックファイルを削除

    rm /var/lock/kodi.disabled

###XBMCを再起動する

    kodi-send -a "RestartApp"
rbenvでインストールできるバージョンリストを最新にする

## 背景
rbenvからruby2.2.2をインストールしようとしても2.2.2が見当たらない。困った。 :sweat: 

```
rbenv install 2.2.2
ruby-build: definition not found: 2.2.2
```

## 前提
- 以下のパッケージがhomebrew経由インストール済み:beer:
    - rbenv
    - ruby-build
- すでにrubyがインストールできる環境になっている:gem:

## やること
ruby-buildをアップグレードして、最新のリストを手にいれる。
前提としてhomebrew自身を更新しないといけない。

```
brew update && brew upgrade ruby-build
```

最新のパッケージが表示されることを確認。

```
rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
  1.8.7-p249
  1.8.7-p302
  1.8.7-p334
  1.8.7-p352
  1.8.7-p357
  ...
```
Mac OS XからRaspberry Pi用のOpenelec起動SDカードを作成する

[インストールの説明URL](http://wiki.openelec.tv/index.php/HOW-TO:Installing_OpenELEC/Writing_The_Disk_Image#tab=Mac_OSX)

[http://openelec.tv/get-openelec](http://openelec.tv/get-openelec)にアクセスして最新版のRaspberry PiのファームウェアDownloadする。  

Downloadされたファイルをダブルクリックして解凍する。

ターミナル.appを起動する。

SD Cardをセットしてから

	diskutil list

でSD CardのIDENTIFIER情報を表示する。


SD Cardをunmountしてから下記のコマンドでSD CardにImage Fileを書き込む。  
（ifの部分にはダウンロードしたImage Fileを、ofの部分にはSD CardのIDENTIFIER情報をSetする）

	diskutil unmount /dev/disk2s1
	sudo dd if=~/Downloads/OpenELEC-RPi.arm-5.0.8.img of=/dev/disk2

30分程度待ったら完了。
Openelecのパーティーション拡張

ログイン後に

	cd /
	touch /var/lock/kodi.disabled
	killall -9 kodi.bin
	fuser -m /storage | xargs kill -9; umount /storage
	
ドライブの情報を表示する

	mount

partedを起動する

	parted /dev/mmcblk0
	
partedの中で
	
	change to sectors display:
	unit s
	show partitions, make note of starting sector of your partition:
	p
	remove the partition:
	rm 2
	
pで表示された情報を元にパーティーション情報を設定する

	mkpart primary 258048 -1

partedを抜ける

	quit parted

パーティーションを拡張する

	e2fsck -f /dev/mmcblk0p2
	resize2fs /dev/mmcblk0p2
	mount /dev/mmcblk0p2 /storage
	df -h

Kodiを起動する

	rm /var/lock/kodi.disabled
Openelecのカスタマイズ

## Ram Disk を作成

###OpenELEC kodiログファイルを tempfs に移動
    rm -R /storage/.kodi/temp
    cd /storage/.kodi
    ln -s /dev/shm temp

###OpenELEC ログファイルを tempfs に移動
    rm -R /storage/logfiles
    cd /storage/
    ln -s /dev/shm logfiles

##IP address, DNS, Default Router, Wifi SSID and Password
    ~/.kodi/userdata/addon_data/os.openelec.settings

## crontabの設定
    ~/.cache/cron/crontabs/root

##Bonjour共有ディレクトリの(samba)設定
    /etc/samba/smb.conf
    ~/.config/samba.conf


## KodiのUIから設定

System > Setting > Services > Webserver > Allow control of XBMC via HTTP

System > Setting > Services > Webserver > port

System > Settings > Audio output > Dual audio output

System > Appearance > International > Timezone country

System > Appearance > File lists > Allow file renaming and deletion

System > Appearance > File lists > Show hidden files and directories

System > OpenELEC > Services > SSH > Start ssh server at boot

System > OpenELEC > Services > crond > Start cron deamon at boot

System > OpenELEC > Network


/storage/.xbmc/userdata/guisettings.xml

settings > mymusic > playlist > repeat > true
settings > myvideo > playlist > repeat > true
iOS device登録がいつまでもloadingで終わらない

## 問題
chromeでdevice登録がいつまでも終わらず困った


## 解決法

コンソールを開いたら
```
Uncaught jquery.cookie.js?${info.entry.commit.revision}:25 Uncaught 
URIError: URI malformed
```

とログが出ていた

safariを使って同じ作業を実行したらうまくいった。

##  結論
safariを使おう
Playgroundでリソース（plist、xml等々）にアクセスする

すぐに値や結果を見られて便利なので、Playgroundで小さく作って検証し、本体プロジェクトに組み込んでいます。
その際、plistにどうやったらアクセスできるか調べましたが、できると幸せになれたので書いてみます。

## 手順
### パッケージの内容を表示
まず、Playgroundファイルを右クリックしてメニューを表示し、`パッケージの内容を表示`を選択します。

![スクリーンショット_2015-05-05_11_48_36.png](https://qiita-image-store.s3.amazonaws.com/0/4900/438f2f9e-92aa-d342-8dfa-96600f00f658.png "スクリーンショット_2015-05-05_11_48_36.png")

### Resourcesフォルダの設置
パッケージの内容が表示されたら、Resourcesフォルダを設置します。

![スクリーンショット_2015-05-05_11_49_10.png](https://qiita-image-store.s3.amazonaws.com/0/4900/82dcd035-eb47-3762-f760-f4f2b01850d7.png "スクリーンショット_2015-05-05_11_49_10.png")

### リソース設置
Resourcesフォルダ内にリソースファイルを置きます。
例では適当なplistを置いてみました。

![スクリーンショット 2015-05-05 11.52.05.png](https://qiita-image-store.s3.amazonaws.com/0/4900/d606166a-c110-877c-c823-8ab7d5ce02f3.png "スクリーンショット 2015-05-05 11.52.05.png")

これだけでOKです！

## アクセス方法
先の例で設置したplistにアクセスする場合は、こんな感じでいけます。

```swift
let dict = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("My", ofType: "plist")!)
```

他の種類のリソースファイルでもアクセスできますので、ご活用ください。
Meteor モバイルアプリ(iOS/Android)のアイコンを変更する方法


# Meteor モバイルアプリのアイコンを変更する

Meteor モバイルアプリのアイコンを変更するには、Meteor プロジェクトディレクトリ直下の mobile-config.js ファイルに以下の記述を追加します。
アイコンのパスは Meteor プロジェクトディレクトリからの相対パスになります。

```js:mobile-config.js
App.icons({
  // iOS
  'iphone'   : 'resources/icons/app_icon-60x60.png',
  'iphone_2x': 'resources/icons/app_icon-60x60@2x.png', // 120x120
  'iphone_3x': 'resources/icons/app_icon-60x60@3x.png', // 180x180
  'ipad'     : 'resources/icons/app_icon-76x76.png',    
  'ipad_2x'  : 'resources/icons/app_icon-76x76@2x.png', // 152x152

  // Android
  'android_ldpi' : 'resources/icons/app_icon-36x36.png',
  'android_mdpi' : 'resources/icons/app_icon-48x48.png',
  'android_hdpi' : 'resources/icons/app_icon-72x72.png',
  'android_xhdpi': 'resources/icons/app_icon-96x96.png'
});
```

簡単ですね。

なお、mobile-config.js は自動生成されないので、無ければ手動で作成してください。

# 参考

* Mobile Config File - Metoer Documentation<br>http://docs.meteor.com/#/full/mobileconfigjs
* App Icons - Meteor Documentation<br>http://docs.meteor.com/#/full/App-icons
派生開発における変更指示をモデルで表現する（試案編）

さて、派生開発の「変更」をどうモデル化するか。。。前回までのあらすじはこちら。

*  [派生開発における変更指示をモデルで表現する（問題編）](http://qiita.com/kenjihiranabe/items/293f42ef8b42f437c05e)

# デルタの導入

欲しいものは、「修正」そのものをストレートに表現することです。なので、クラスの「修正」を表すステレオタイプ、《delta》を導入します。これは、クラスに対する変更指示そのものを示すクラスです。赤ペンで書くことを、少々フォーマルにして、このクラスの中に情報として書いて行きます。さらに、サブとなるステレオタイプ、《add》, 《delete》, 《modify》も導入。

* デルタ: 《delta》
* 追加: 《add》
* 削除: 《delete》
* 変更: 《modify》

この 3 つに分け、変更を表現します。変更を「クラス」として閉じ込める分けです。さらに、この変更指示は、上位の変更要求に対応するはずです。この変更要求を「要求」（UMLでは《requirement》、SysMLの要求図で使う「要求要素」)と結ぶと、さらにトレーサビリティが分かりやすくなるでしょう。

# 記述例

簡単な例です。

* 赤ペンで表現した場合

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/3d2d07b8-0d6e-b36b-ee71-ceb3cbadf745.png)

* デルタ記法

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/1baf524f-5906-6221-5e74-c9e12b6a16c6.png)

もっと大きなモデルだと、見た目はこんな感じになる。

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/d075dcd7-2cc8-8da9-8c73-5644635510b1.png)

こう考えると、デルタの領域に中心の設計モデルとは「別に」、パターンやアーキテクチャが見つけられないか、と考えている。

例えば、

* 変更が変更前のアーキテクチャを横断して入る「レイヤー縦断デルタ」パターン
* 局所的な変更で収まる「エンカプスレーテド・デルタ」パターン

などなど、想像している。


# 考察

デルタ、という要素を定義することで、「変更」をダイレクトにモデル化してみた。さらに、要求要素との関係も示すことで、変更意図をトレースすることができる。

1. astah を使って書いているが、この書き方はクラス図にしか使えない（「《delta》クラス」はクラス図にしか置けない）。できれば、他の図、例えば状態遷移図、アクティビティ図などでも使いたいだろう。その場合、「《delta》状態」、「《delta》アクティビティ」などモデル要素を作って行くのだろうか？

1.  実務的には、クラスでなく操作や属性（関数や変数）に直接、変更指示を書きたくなると思う。その場合、《delta》クラスでなくさらに細かい粒度に対応しないといけない。しかし、クラス図の依存関係矢印は、直接操作に引けないのであった。。。。

対応方法として、「ノート」要素を使ってしまう手もあると思う。これが実践的かもしれない。上記1,2の両方の問題を一気に解決できる。

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/a8f3155f-f3db-94d5-c592-10803d040a02.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/51055/9a681b7c-b217-6ff5-3897-951e809adc6b.png)

しかし、形式化からはずれてしまう。。。

# あとがき

今日は、「派生開発カンファレンス」が開かれます。（私、基調講演を仰せつかりました）。ぼくは派生開発に関しては素人なのですが、なんとかこの案を叩いてくれることで実用的なモデルを使った派生開発の一歩になればと思っています。

(※ 5/16 追記：パターンを考察してみた。)