OmniAICreator/Qiita-1.07M huggingface dataset:
Inkscape の Mac OS X 版を download できない

# 前提

- 2015-12-20 時点
- Mac OS X 10.11.2
- Inkscape 0.91 r13725

# 問題

[Inkscape 公式の日本語向け download page](https://inkscape.org/ja/download/mac-os/) の情報が古い。link 先 (0.48.5) が存在しない。

# 解決策

[Inkscape 公式の英語向け download page](https://inkscape.org/en/download/mac-os/) は更新されている (0.91) のでそちらを参照する。

Inkscape 0.91 では Mac OS X 10.11.2 が対象 (Mac OS X 10.7-10.10) から外れているが、ぼくが触っている範囲では問題なく動作しているように見える。
budoで簡単にreact componentのdemoページを作る

react componentを作ったら、demoページも用意してあげたいですよね。でも、demoページから使えるようにするには、ES6（で書いてる前提です :smile: ）のコードをtranspileして、必要なライブラリを一つのjsにまとめて、といったことをする必要があり、「demoページ用のbuildタスク別に用意すんの？」という気分になります :disappointed_relieved: 

そんなときは`budo`を使うと幸せになれます。

# budo
https://github.com/mattdesl/budo

ページロード時に、指定のsourceに対して自動的にbrowserifyを実行してくれるサーバです。live reloadにも対応しているので、browserifyを使った開発用サーバというのが本来の用途になると思います。詳しくは上記サイトを見てください。

# 使い方
```
budo examples/bundle.js --dir examples -- -t babelify
```

最初の引数`examples/bundle.js`が、ページロード時にbrowserifyを実行する時のsourceファイルとなります。

`--dir`は、ルートディレクトリを指定します。指定が無い場合、`budo`がbuild結果のjsを読み込んだ素のhtmlを勝手に作成してくれますが、自分で独自の`index.html`を作ったり静的コンテンツを参照させたい場合はルートディレクトリを指定して、そこに`index.html`などを置きましょう。今回はcomponentを描画させる`div`を指定したかったので、自分で`index.html`を用意しました。

`--`以下はbrowserifyに渡されるオプションで、今回はES6からトランスパイルしたいので`-t babelify`を渡しています。

ルートになる`examples/`には、以下のようなindex.htmlを置いておきます。

```html
<!DOCTYPE html>
  <body>
    <div id='sample1'></div>
    <div id='sample2'></div>
    <script type='text/javascript' src='bundle.js'></script>
  </body>
</html>
```

`src`は、sourceに指定したファイル名になります。(デフォルトではディレクトリ名はいらないですが、`--serve`オプションを使うとビルド結果のjsのパスを任意に設定できます)

コマンドを実行すると、

```
[0001] info  Server running at http://192.168.59.3:9966/ (connect)
[0009] 8108ms    1.69MB (browserify)
```

といったログが出てくるので、`http://192.168.59.3:9966/`にアクセスすると、`examples/index.html`の内容と、ビルドされた`bundle.js`に従って描画された画面が見れる事でしょう。

package.jsonの`start`コマンドに定義しておけば`npm start`で起動できて幸せ。

# 終わり
今回書いた内容で実際にデモページ入りのReact Componentのプロジェクトを作ったのでこちらに置いておきます。Text内のurlをaタグのリンクにして表示するReact Componentです。
https://github.com/hokuma/auto-text-link
Swift Macアプリで、メインウインドウを閉じた時にアプリ自体を終了させる

# 概要

mac アプリで、メインウインドウの左上クローズボタンを押した時、プロセスを終了させる方法。
デフォルトだと、ウインドウは閉じるけどドックからは取り除かれない。

# 方向性

方法としてはいくつかありますが、基本的には

- メインウインドウのインスタンスを取得
- そのデリゲートメソッド windowWillClose 内で、アプリ終了コードを書く

となります。

AppDelegate 内で、(ストーリーボード → IBOutlet なんかで) メインウインドウのインスタンスを取得できると思ったけどうまくできなかったので、結局 WindowController のカスタムクラスを書くことにしました。

# 実装方法

mac アプリを Xcode から新規プロジェクトで作る際、NSViewController の独自クラス (デフォルト名 ViewController ) を自動的に作ってくれますが、これと同様に UIWindowController の独自クラスを作ります。

- File -> New -> File...
- Cocoa Class を選択して Next
- Class: WindowController
  Subclass of: NSWindowController
  Language: Swift
  → クラスファイル作成。

- ストーリーボードを開き、Window Controller Scene の中の Window Controller を選択。
- 右ペインの Custom Class の Class 欄に、**WindowController** を指定。さっき作ったクラス。

これで、WindowController を独自にいじれるようになりましたので、中の UIWindow のデリゲートを繋ぎ、デリゲートメソッドを書きます。

```swift:WindowController.swift
import Cocoa

class WindowController: NSWindowController {

    override func windowDidLoad() {
        super.windowDidLoad()
        self.window!.delegate = self
    }

}

extension WindowController: NSWindowDelegate {
    func windowWillClose(notification: NSNotification) {
        NSApplication.sharedApplication().terminate(NSApp.keyWindow!)
        
    }
}
```

UIWindowのインスタンスは self.window で取得できますので、このようにしてデリゲートを書いてやれば良いでしょう。
WindowController は ViewController 同様、扱うことが多いと思いますので最初にカスタムクラス化しておくと便利ではないでしょうか。
メモ

# Git Related

Initialize user info
Git config --global user.name = "Your name"
Git config --global user.email = "Your email address"

Colorize diff
git config --global color.ui true

# Rails

How to use Hirb
http://ruby-rails.hatenadiary.com/entry/20141024/1414160189#hirb-install

How to build one-to-many relationship
http://ruby-rails.hatenadiary.com/entry/20141203/1417601540

How to erase all the data after scaffolding
http://gutch.hatenablog.com/entry/20110304/1299212122

# Vim

About pathogen
http://mkataigi.hatenablog.com/entry/20101107/1289134775

Enable "wget" command on mac
https://thomashunter.name/blog/install-wget-on-os-x-lion/
CLI から OS X を Software Update


```
$ softwareupdate -l
$ sudo softwareupdate -ia
```

`softwareupdate -h` から抜粋

```
** Manage Updates:
	-l | --list		List all appropriate update labels (options:  --no-scan)
	-d | --download		Download Only
	-e | --cancel-download		Cancel a download
	-i | --install		Install
		<label> ...	specific updates
		-a | --all		All appropriate updates
		-r | --recommended	Only recommended updates
	--background		Trigger a background scan and update operation
	--ignore <label> ...	Ignore specific updates
	--reset-ignored		Clear all ignored updates
	
-v | --verbose	Enable verbose output
-h | --help	Print this help
```
Inkscape の Color Profile に Japan Color 2001 Coated が表示されない

# 前提

- Mac OS X 10.11.2
- Inkscape 0.91 r13725

# 問題

File > Document Properties... > Color > Available Color Profiles に `Japan Color 2001 Coated` が存在しない。

Mac OS X の default の ICC Profiles には `Japan Color 2001 Coated` は含まれていない。

# 解決策

ICC Profile を Mac OS X に install すると良い。

## 利用可能な ICC Profile の確認

Spotlight などで 「 ColorSync ユーティリティ」を起動する。

「プロファイル」を選ぶと「インストールされている ColorSync プロファイル」に利用可能な ICC Profile が表示される。

※日本語表示だと Inkscape に表示されるものとの対応関係がいまひとつ分かりづらいので注意する。

## ICC Profile の install

Adobe ICC Profile を download し install する。

http://download.adobe.com/pub/adobe/iccprofiles/win/AdobeICCProfiles.zip

download した上記の zip file を展開すると `Japan Color 2001 Coated` を含む ICC Profile file (`*.icc`) がある。

上記 file を、すべての user 向けなら `/Library/ColorSync/Profiles` へ、現在の user 向けなら `~/Library/ColorSync/Profiles` へ copy する。

# 参考

- [ICCプロファイル - Wikipedia](https://ja.wikipedia.org/wiki/ICC%E3%83%97%E3%83%AD%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)
- Adobe Photoshop Help > [ICC プロファイルについて（Photoshop 6.0 以降）](https://helpx.adobe.com/jp/photoshop/kb/216943.html)
- Adobe Download > [Adobe ICCプロファイル - ICCプロファイル for Windows - Downloads](https://www.adobe.com/jp/support/downloads/1330.html)
- Adobe Download > [Adobe ICCプロファイル - ICCプロファイル for Macintosh - Downloads](http://www.adobe.com/jp/support/downloads/1331.html)
- [Getting and installing ICC profiles - Scribus Wiki](http://wiki.scribus.net/canvas/Getting_and_installing_ICC_profiles)
ESP8266 > 内部プルダウン / プルアップ > INPUT_PULLUPは動く / INPUT_PULLDOWNは動かない

設定によって有効になる（と思われる)内部プルアップ、プルダウン抵抗について。


pinMode ( sensor1, INPUT_PULLUP );
は動くが
pinMode ( sensor1, INPUT_PULLDOWN );
はうまく動かないようだ。


https://github.com/esp8266/Arduino/issues/478

> If I set them to INPUT, then the pin behaves like a floating input. Otherwise, INPUT_PULLDOWN and INPUT_PULLUP seem to behave exactly the same.

...

> Links2004 commented on 28Jun
espressif write:
There are no pull-down functions on GPIO pad now, so we should never use these registers.
http://bbs.espressif.com/viewtopic.php?f=5&t=481


上記２つ目のリンクの元から抜粋

> Note:
There are no pull-down functions on GPIO pad now, so we should never use these registers.
Add external resistance to pulldown the pin.

「プルダウンの場合は、外部抵抗を入れること」とのこと。
Reactのチュートリアル+Express+MongoDB

[Reactのチュートリアル](https://facebook.github.io/react/docs/tutorial.html)を触ったのですが、バックエンドがないとPOSTできないのでつまらない。ExpressとMongoDBを追加して動くようにしてみました。

タスクランナーは普段はGruntなのですがGulpを使ってみました。
Livereloadの代わりにBrowserSyncを導入してみました。

[https://github.com/110chang/react-express-mongodb](https://github.com/110chang/react-express-mongodb)

![fig-react-express-mongodb.png](https://qiita-image-store.s3.amazonaws.com/0/33768/2ed64ccf-cbe0-64c1-95f2-4ef5886c284b.png)

```bash
$ node -v # v0.12.0
```

# Reactのチュートリアルに必要なパッケージ

- react
- rect-dom
- jQuery（ajax用）

```js:main.js
var React = require('react');
var ReactDOM = require('react-dom');
var $ = require('jquery');

//...以降、チュートリアルのコード
```

チュートリアルではajaxのためにjQueryを使っていますが、superagentでもいいとおもいます。

# JSXをGulpでコンパイルするのに必要なパッケージ

- gulp
- browserify
- baberify
- babel-preset-react
- vinyl-source-stream

```js:gulpfile.js
var gulp = require("gulp");
var source = require('vinyl-source-stream');
var browserify = require('browserify');
var babelify = require('babelify');

//...

gulp.task('concat', function() {
  browserify({
    entries: ['path/to/main.js'],
    debug : !gulp.env.production
  }).transform(babelify, { presets: ["react"] })
    .bundle()
    .pipe(source('bundle.js'))
    .pipe(gulp.dest("./public"));
});

//...

```

babel-preset-reactは`require`しませんがコンパイルの時に必要です。

vinyl-source-streamは、Nodeの`Stream`をGulpで扱えるように変換してくれるものらしい。Streamはデータを`pipe`でつないで処理できるようにするインターフェースということのようです。

Lintは、[SublimeLinter-eslint](https://github.com/roadhump/SublimeLinter-eslint)を入れました。

# バックエンドに必要なパッケージ

- mongo
- express
- body-parser（POSTを受け取る際に必要）

bodyParserの使用法はdeprecatedうんぬんの情報が錯綜していて苦労した。
今のところ以下のように使う模様。(2015/12/20現在)

```js:app.js
var express = require('express');
var parser = require('body-parser');

var app = express();
var server = http.createServer(app);

//×app.use(parser());
app.use(parser.urlencoded({extended: true}));
app.use(parser.json());

//...
```

via [ExpressでPOSTを処理するメモ](http://qiita.com/K_ichi/items/c70bf4b08467717460d5)

CRUDは「[Node.js+Express+MongoDBでWeb APIをつくる](http://qiita.com/itagakishintaro/items/a1519998a91061cbfb1e)」に掲載されているものを使わせていただきました。

# その他のタスク用

- gulp-live-server（expressを起動するため）
- gulp-sass
- browser-sync（ブラウザ確認用）

BrowserSyncをプロキシで使いました。`proxy`と`files`と`port`を指定する。

```js:gulpfile.js
var browsersync = require('browser-sync');

//...

browsersync.init({
  proxy: 'http://localhost:XXXX/',//expressのローカルアドレス
  files: ['./public/**/*.*'],//watch対象
  port: 3333,//出力先
  open: false,//鬱陶しいのでブラウザを開くのを止める
});

//...
```

BrowserSyncはローカルネットで表示されているページを全て同期できるのですごく便利そう。GhostLabが要らない子に…

via [gulp + node + express で BrowserSync 使おう。](http://mid0111.hatenablog.com/entry/2015/08/19/200657)

[この記事はブログにも掲載しています](http://110chang.com/knowledge/react-express-mongodb/)
パスワードを優しくチェックしてくれる、Drupal8先輩素敵！という話

Drupal超初心者ですが、
「ゆる〜くてOK」という言葉を信じて、書いてみます。

今回のテーマは、「Drupalのパスワード強度チェッカー」です。

先日、関西オープンフォーラム（KOF）のDrupalのハンズオンセッションに参加して、初めてDrupal8のインストールを体験することができました。

その時に、パスワードを設定する画面があったのですが、そこのユーザーインターフェイスがとても親切で良いと思いました。

![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/44791/0126373e-0b4d-b529-c458-ccfdd50c11fc.jpeg)

私が知っているパスワード強度チェックは、だいたいパスワードの強度が「弱い」とか「普通」とか「高い」とかいう程度のメッセージが表示される程度で、なぜそういう判定なのか、については教えてくれないことが多かったです。

この場合、いじわるな先輩に教えを請う後輩のような気分になります。

しかし、このDrupal8のパスワード強度チェッカーは、どうやれば強固なパスワードにすることができるかを、リアルタイムで表示してくれます。とても親切！

しかも、それを達成すると、その指摘がひとつずつ消えていってくれるので、思わず、全部制覇してスッキリしたくなるような効果もあるように思います。

責任範囲を明確にする、という観点からすると、そもそもパスワードをしっかり設定するのは自分自身で責任をもって行うことであり、自分が設定したパスワードの強度が弱くて乗っ取られるなどの被害にあったとしても、その責任が完全にその人個人の範囲内、ということで済むのであれば、こういったおせっかい機能は不要、というような考え方もあるかと思います。

しかし、ある人が弱いパスワードを設定したことに起因することが、その人以外にも影響がでてくると、そうもいっていられなくなるのではないかと思います。例えば、典型的なシチュエーションとしては、会社で、個人が設定する自分のパスワードが脆弱で、それが原因で情報漏洩などがおこってしまうと、場合によってはその影響は会社全体に及ぶ可能性があると思います。なので、パスワードを強制的に定期的に変更させるなどの方法で、脆弱なパスワードが設定される等のリスクを減らすための指示をしてくるのではないかと思います。

Drupal8の場合は、あまりそういった直接の影響はないようには思いますが、乗っ取られる人が多いと、Drupal8の評判が落ちるとか、乗っ取られるケースが増えると、インターネット全体がより危険な場所になってしまう、といった社会的責任の観点から、こういった機能を用意しているのではないかと思います。

利用者を親切に案内し、さらに、より強度の高いパスワードを設定したくなるような仕掛けがあるDrupal8。すばらしいと思いました。

しかし、パスワード管理、どんどん大変になってきてますよね。同じパスワードをつかっちゃだめとか、１２文字以上とか、ホント大変です。

さらに今後、パスワードは３２文字以上だ、いや６４文字以上じゃないと安心できない、とか、記号も必須だ、強度が最強でないと設定してはダメ、とかなってくると、いよいよ本格的に、パスワード以外の方法に移行したいですよね。。。
FMC2Goスケジューラーにおける絞込み検索機能


[FileMaker Advent Calendar 2015](http://www.adventar.org/calendars/865)の20日目

# FMC2Goスケジューラーにおける絞込み検索機能
[参加したFileMakerワークショップの当日のメモと記憶を手繰って復習してみる](http://qiita.com/or2/items/3cd018e23543e8e24bf1)の続き

3つ目のテーマとしてFMC2Goスケジューラーにおける絞込み検索機能を深堀りしてみる

## まずは検索機能を見てみよう
### パターン1
![151220-01.png](https://qiita-image-store.s3.amazonaws.com/0/89027/0a0dfa68-d174-9dd1-c42c-56eabd67e89c.png)
で、絞り込み条件(金曜日のセッションを見てみたい)でクリックすると
![151220-02.png](https://qiita-image-store.s3.amazonaws.com/0/89027/420e67ce-ce0d-fd67-62e6-ef1179fc4a3f.png)
こうなる

### パターン2
![151220-03.png](https://qiita-image-store.s3.amazonaws.com/0/89027/e435b764-0c11-414c-039d-4158c59fa0f9.png)
自由ワードで検索できる

## とっかかりとして
ファシリテータの永井さんより「この機能を見ていくにあたっては結果から見ていくとわかりやすい」という情報をもらったので、明日からその通りスクリプトを紐解いていくことにする

## その前に気になる機能を見てみる
![151220-04.png](https://qiita-image-store.s3.amazonaws.com/0/89027/503f9468-b973-5b49-c809-d76f424c5172.png)
絞り込み条件を選択した時のこの見た目
これを紐解いてみる

### 「絞込み」ボタン
まずは「絞込み」ボタン
![151220-05.png](https://qiita-image-store.s3.amazonaws.com/0/89027/8e68f65e-ad4d-f660-ef9f-7bc87efbc2b9.png)
レイアウトモードに切り替えてみたところ「ポップオーバーボタン」になっているようだ

ポップオーバーボタン
> ポップオーバーを開くレイアウトオブジェクト。

ポップオーバー
> 他のレイアウトオブジェクトを含むことができるレイアウトオブジェクト。ポップオーバーには内容領域（オブジェクトが配置される場所）があり、タイトルを含むことができます。ポップオーバーを開くには、ポップオーバーボタンをクリックします。ポップオーバーは移動して常に表示画面内にとどまります。

### 選択されたら見た目を変える仕組み
![151220-06.png](https://qiita-image-store.s3.amazonaws.com/0/89027/93dcfc28-6663-2222-c2f1-cfae7edbe54f.png)
これは条件付き書式で実現されているようだ

詳しくは
[ホーム > データベースのデザインと作成 > レイアウト上のオブジェクトの編集 > レイアウト上のオブジェクトの選択と操作 > レイアウトオブジェクトの条件付き書式の定義](http://www.filemaker.com/help/12/fmp/jp/html/edit_layout.10.17.html#156183)
を参照

> オブジェクトが指定された条件を満たす場合は、自動的に変更するようにレイアウトオブジェクトの書式設定ができます。

> 条件付き書式の設定はデータの表示方法や印刷方法に影響するだけで、データがどのようにデータベースに保存されるかについては影響しません。

左側の○には
![151220-07.png](https://qiita-image-store.s3.amazonaws.com/0/89027/588bea80-ceea-ae51-c9cf-5e95b6a3e409.png)

右側の表示項目には
![151220-08.png](https://qiita-image-store.s3.amazonaws.com/0/89027/be066408-47a4-a8f5-049c-e5c1dd003cfa.png)

のように条件付き書式が設定されている

そして当該のボタンが押されたら
![151220-09.png](https://qiita-image-store.s3.amazonaws.com/0/89027/2b468633-ad75-0db3-7f7a-823666b48e1e.png)
のように「Session Filter」スクリプトが割り当てられている

今日はここまで
[*Cordova*] Cordova + AngularJS + Onsen UI環境構築

# はじめに
環境構築メモ。

# 環境構築
## Cordova
公式に従ってインストール済。

## プロジェクト作成

```bash
$ cordova create qiita_sample com.example.qiitaSample QiitaSample -d
$ cd qiita_sample
$ cordova platform add ios
```

## Onsen UIの設定
下記を実行するとwww以下にbower_componentsというディレクトリができる。

```bash
$ cd www
$ bower install onsenui
```

`index.html`を修正。

```html:index.html
<!DOCTYPE html>
<html ng-app="sampleApp">
    <head>
        <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">
        <meta name="format-detection" content="telephone=no">
        <meta name="msapplication-tap-highlight" content="no">
        <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width">
        <!-- Onsen UIのCSSを読み込み -->
        <link rel="stylesheet" href="bower_components/OnsenUi/css/onsenui.css">
        <link rel="stylesheet" href="bower_components/OnsenUi/css/onsen-css-components.css">

        <link rel="stylesheet" type="text/css" href="css/index.css">
        <!-- Onsen UIとAngularJSのjsを読み込み -->
        <script src="bower_components/angular/angular.min.js"></script>
        <script src="bower_components/OnsenUi/js/onsenui.min.js"></script>
        <title>Hello World</title>
    </head>
    <body>
        <ons-button>
            <i class="fa fa-google-plus"></i> ログイン
        </ons-button>
        <script type="text/javascript" src="cordova.js"></script>
        <script type="text/javascript" src="js/index.js"></script>
    </body>
</html>
```

```js:index.js
var app = angular.module('sampleApp', ['onsen']);
```

```css:index.css
/* デフォルトの指定をすべて削除 */
```

## エラーが出てないかの確認
以下を実行してから`http://localhost:8000/ios/www/`にアクセス。

```bash
$ cordova serve
```

コンソールにエラーが出てないことを確認。

![スクリーンショット 2015-12-18 10.28.37.png](https://qiita-image-store.s3.amazonaws.com/0/48912/0a9565ab-35d0-298b-9b69-e22295d54756.png)
mrubyのJITにおけるメソッド再定義の対処方法

Rubyはメソッドの再定義が出来るのですが、これがJITコンパイラを作るときに問題になります。メソッドそのものを再定義しなければならないのはもちろん、各所に散らばっているそのメソッドを呼び出している元も書き換えなければならないからです。さもなければ、再定義されているかを毎回チェックする必要があり、大幅に速度が落ちます。
mrubyのJITではコードの自己書き換えを駆使することで速度を落とさず再定義に対処しています。ただし、メモリ効率が悪いので、頻繁な書き換えには向きません。

mrubyのJITではこんな感じで生成コードを管理しています。この場合は、メソッドfooの場合です。
entry tableってのがあって、RITE VMの命令毎に対応する機械語コードのアドレスが入っています。Tracing JITなのでプログラムが全て機械語になっている保証はないですので、これを見て対応する機械語命令があればそれにジャンプするっていう仕組みになっています。対応する機械語が無い場合は0が入ります。

![](http://f.st-hatena.com/images/fotolife/m/miura1729/20151220/20151220094320.png?1450572505)

さてメソッドfooを再定義してみましょう。この場合、すでに各所にfooの呼び出しが散らばっていてこのままでは古いコードが引き続き使われてしまいます。
ちなみにmrubyのJITではcall命令ではなくjmp命令を使ってメソッド呼び出しをします。戻り先はcallinfoに格納します。
![](http://f.st-hatena.com/images/fotolife/m/miura1729/20151220/20151220095410.png?1450572855)

再定義時に前に定義された命令は、次のように書きかえられます。

+ entry tableをすべて0クリアする
+ 生成コードにパッチを当てる。パッチの内容はreset_callerを呼び出して、VMに戻るというものです。

reset_callerはこの無効化したメソッドを呼んだブロックやメソッドの生成された機械語も無効化する関数です。callinfoを参照すればcaller のirepが取れるのでこういう芸当が可能です。
reset_caller(mrb_reset_caller)の定義は[ここ](https://github.com/miura1729/mruby/blob/master/src/jit.c#L794-L837)にあります。
mrb_reset_callerはランチャーでレジスタに入ってるmrb_state構造体(esi)とpc(ebx)を取り出してmrb_reset_caller_auxに引数として渡すようなことをしています。実際の仕事はmrb_reset_caller_auxが行います。

![](http://f.st-hatena.com/images/fotolife/m/miura1729/20151220/20151220094322.png?1450572632)

このようにパッチを当てられた元のメソッドを呼び出すと、呼び出し元がreset_callerによってクリアされてしまいます。

![](http://f.st-hatena.com/images/fotolife/m/miura1729/20151220/20151220094323.png?1450572701)

きれいに消されてしまいました。これでこのブロックからは元の機械語が呼ばれることはありません。実行頻度が高ければすぐに新しいメソッドの定義の機械語が生成されることでしょう。
どれだけ沢山の場所から呼ばれていても同様にクリアされますので問題ありません。

![](http://f.st-hatena.com/images/fotolife/m/miura1729/20151220/20151220094324.png?1450572726)
リモートワークで使って便利だったツールリスト 7選


### 1. Github / 今更なにを、、と思うでしょうが.. 
hookしてチャットとつなげているので、常に通知が飛ぶ＝リモートでも仕事していることがリアルタイムでわかる。
コーディング以外のところでも（素材やアセット管理など）プルリク→レビューのフローを取り入れることで、誰が何をしているのか可視化できる。

### 2. Sqwiggle / 今やリモートワークを代表するツール？ 
https://www.sqwiggle.com/

ビデオチャットツール。
常時カメラのキャプチャをとっているので、今いるのかいないのかがわかる。
最初は雑談でもあいさつでもなんでもいいから使う癖をつけておくと、恥ずかしさが減って自然に使える用になる。
いったん利用に慣れてしまうと使わないのが不便に、、50名チームだったらオフィスでも使いたいくらい


### 3. trello / サクサク動作でタスク管理ができる 
https://trello.com/

動作が軽快で使っていて楽しいので、チケットを消化したくなる。
大規模なプロジェクトには向いていないけれども、ちょっとしたチームのTODOを管理したり、2~3人での仕事を分業したりするのに向いている

### 4. slack / 定番チャット
正直、skypeでもchatworkでも何でもいいが、普段の業務連絡を万一メールで連絡していたら、今すぐやめてチャットにするべき。
botとつなぎやすかったり、各種サービスとインテグレーションが充実しているものの方がリモートワーク向き。

### 5. Gyazo / ぱしゃっと撮ったらすぐ共有！ 
https://gyazo.com/ja
スクリーンキャプチャをアップロードするサービス。
社内ではアップロード先を自社サーバーにして使用。
メモでも、エラーでも、モックのUI確認にも使える。

### 6. Google Document / リアルタイム議事録に！
テレカンやビデオ会議中に使うと、複数人での同時編集ができて便利。
他の人がハイライトしているところもわかるので、「ここちょっと見て欲しいです〜」みたいなこともできるし、どこを気にしているのかを知ることもできる。

### 7. ScreenHero / gyazoでは情報不足なときには画面共有
https://screenhero.com/
だいたいgyazoでぺろっとキャプチャを張るとことすむのでそこまで出番は多くないけれども、込み入った説明や指差しながら「ここをこうして・・・」といった連絡をしたいときに使う。
Ansibleでローリングリブート(SSHチェック)

クラスタを組んでいる構成で、一台ずつサーバをリブートしたい時に使います。

やることは下記とほぼ同じですが。ポートのチェックではなく*SSHのログインを試行*しています。これは、グローバルIPを持たず踏み台を使ってログインしているサーバに有効です。

> **Thanks >** Ansibleでサーバ一括起動し、SSHログインできるまで待つ 
> http://qiita.com/wanghm/items/0efa793f9f89d4312164

`hosts`ファイルにインベントリを記述して、以下のように実行します。

> ansible-playbook -i hosts reboot.yml

```reboot.yml
---
- hosts: all
  serial: 1
  tasks:
    - name: Check SSH connection
      local_action:
        module: shell
          ssh {{ inventory_hostname }} hostname

    - name: reboot!
      shell: |
        nohup sh -c "sleep 5;shutdown -r now" &
      ignore_errors: True

    - name: Wait for server to down
      local_action:
        module: shell
          while ssh {{ inventory_hostname }} hostname;do sleep 1;done

    - name: Wait for server to restart
      local_action:
        module: shell
          until ssh {{ inventory_hostname }} hostname;do sleep 1;done
```
電子回路 > プルアップ抵抗の計算 > 10k x ３プルアップ / 1つのプルアップ


http://qiita.com/ie4/items/ae850cdb2c617f3fd6af#comment-ec3250b22557356feca1
や
http://qiita.com/7of9/items/a24430f4a43390ae8b9f#comment-80cd888280e232e7d59c
などで気になったプルアップ抵抗について。

キルヒホッフの電流法則を使えばいいのではないかと思った。

同じ大きさの電流を3つのピンに流す場合としている。

つまり、プルアップ抵抗を10kから3.3kに変更したら３つのピンに対してプルアップが有効になるのでは。<font color=red>基板や接続機器を壊すかもしれないので実践時には注意</font>。

（追記)
下図の左のIの向きは逆です(正しくは下向き)。外出前の5分で書いたので、きちんと見直せてませんでした。

![DSC_0036.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/45f541f9-0311-1d54-c39c-1258b9c549d1.jpeg)

## 備考

ただし、１つの抵抗でプルアップする場合は、ピン同士がHi-Z(ハイインピーダンス）にならない場合、スイッチなどを使ってGNDに落とそうとするのはだめなような気がする。

常にプルアップのままなら使えなくはなさそう。

I2Cのディジーチェーン接続などで１つのプルアップ抵抗で使えているのは、ほかのピンをHi-Zにできるからなのか、未消化。
React Native with Fastlane

# Fastlane

[Fastlane](https://fastlane.tools/)はコマンドラインでAppleのReview申請,証明書発行などを自動化するツールです。Push通知の証明書もコマンドで非常に簡単な作成できてしまう一度使ったら止められないツールです。

# React Native with Fastlane

React Nativeのアプリを作ると、結局はAppleへ申請をするので、Fastlaneを使うことができます。

##　インストール

READMEに従ってインストールすれば問題ないです。FastlaneはRuby2.0.0以上が必要です。

```
 $ gem install fastlane
 $ xcode-select --install
```

React Nativeの場合、iosディレクトリがプロジェクトのルート直下にあると思うのでそこに移動して、

```
 $ cd ios
 $ fastlane init
```

インタラクティブに色々聞かれるので質問に答えていくとfastlaneディレクトリができて、インストールが完了します。

私のfastlaneディレクトリは下記のようになっています。

```
fastlane/
├── Appfile
├── Deliverfile
├── Fastfile
├── Preview.html
├── Snapfile
├── SnapshotHelper.swift
├── actions
├── metadata
│   ├── copyright.txt
│   ├── en-US
│   │   ├── description.txt
│   │   ├── keywords.txt
│   │   ├── marketing_url.txt
│   │   ├── name.txt
│   │   ├── privacy_url.txt
│   │   ├── release_notes.txt
│   │   └── support_url.txt
│   ├── primary_category.txt
│   ├── primary_first_sub_category.txt
│   ├── primary_second_sub_category.txt
│   ├── secondary_category.txt
│   ├── secondary_first_sub_category.txt
│   └── secondary_second_sub_category.txt
└── screenshots
    ├── README.txt
    ├── en-US
    │   ├── 3.5\ Device\ 1.jpg
    │   ├── 3.5\ Device\ 2.jpg
    │   ├── 3.5\ Device\ 3.jpg
    │   ├── 3.5\ Device\ 4.jpg
    │   ├── 3.5\ Device\ 5.jpg
    │   ├── 4.0\ Device\ 1.jpg
    │   ├── 4.0\ Device\ 2.jpg
    │   ├── 4.0\ Device\ 3.jpg
    │   ├── 4.0\ Device\ 4.jpg
    │   ├── 4.0\ Device\ 5.jpg
    │   ├── 4.7\ Device\ 1.jpg
    │   ├── 4.7\ Device\ 2.jpg
    │   ├── 4.7\ Device\ 3.jpg
    │   ├── 4.7\ Device\ 4.jpg
    │   ├── 4.7\ Device\ 5.jpg
    │   ├── 5.5\ Device\ 1.jpg
    │   ├── 5.5\ Device\ 2.jpg
    │   ├── 5.5\ Device\ 3.jpg
    │   ├── 5.5\ Device\ 4.jpg
    │   └── 5.5\ Device\ 5.jpg
    └── screenshots.html
```

## 使い方

私が使っているコマンドを解説します。


```
 $ fastlane deliver
```

アプリのDescription等のファイルをiTunes connectにアップロード。アプリの情報をファイルで管理、githubで保存できて便利です。ただし、`fastlane snapshot`はReact Nativeでは動かないので、[Sketchのプラグイン](http://sketchtoappstore.com/)でまとめてsnapshotを作成して、`screenshots`のディレクトリ内に入れて、`fastlane deliver`しています。

```
 $ fastlane pem
```

Push通知の証明書作成、アップロード。作成するプロセスを知っている人はわかると思いますが、異常に簡単です。

```
 $ fastlane gym
```

アプリをビルドして、ipaファイルを作成します。ビルドをReleaseに変えて作ってくれます。ipaファイルを作って、`fastlane deliver`を行うとバイナリのアップロードまで行ってくれます。

# Summary

このようにReact Nativeでも基本的にiOSと変わらず、Fastlaneを使うことができます。React Nativeで全てのツール群を使えるようにはまだなっていないので、こういったiOSの資産を使っていくと便利になります。
Node.js 実践講座 〜基礎編〜 その7

# はじめに
この記事では、npmを使用してパッケージをインストールし、インストールしたパッケージを使用する方法について解説します。

# ワークスペースの作成
```
mkdir workspace/js/basic/04-npm
touch workspace/js/basic/04-npm/index.js
touch workspace/js/basic/04-npm/.gitignore

cd workspace/js/basic/04-npm
```

# lodashの使用
この章では汎用のデータ処理ライブラリであるlodashの使用するサンプルプログラムを作成します。

## package.jsonの生成
下記コマンドを入力してpackage.jsonを生成します。

```
npm init -f
```

生成されるpackage.jsonの中身は下記のようになります。

```package.json
{
  "name": "04-npm",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

package.jsonにはパッケージの情報が記載されます。

## パッケージのインストール
下記コマンドを入力してlodashをインストールします。

```
npm install --save lodash
```

インストールが成功すると`node_modules`という名前のディレクトリが作成され、`node_modules`の中には`lodash`という名前のディレクトリが作成されます。`lodash`の中には`lodash`のソースコードが格納されます。

## ソースコードの内容
ソースコードの内容を下記に示します。

```index.js
'use strict';

var _ = require('lodash')

var users = [
  { name: 'A', age: 20 },
  { name: 'B', age: 30 },
  { name: 'C', age: 40 },
]

var result = _.find(users, 'name', 'B')

console.log(result)
```

## 実行コマンド
実行コマンドを下記に示します。

```
node index.js
```

## 実行結果
実行結果を下記に示します。

```
{ name: 'B', age: 30 }
```

## 解説
lodashのfind関数は第1引数として指定される配列やオブジェクトから、第2引数で指定されるプロパティが、第3引数に等しいものを探し、その結果を戻り値として返します。

今回は第2引数と第3引数にそれぞれ`name`と`B`を指定しているので、`name`が`B`である`users`の2番目の要素が戻り値として返されます。

# おわりに
この記事で基礎編は終え、次回からは事例編としてNode.jsを使用した実践的なサンプルプログラムの作成手順をご紹介します。
Octopress + S3 + CloudFront + 独自ドメインで運用しているブログをhttps転送運用にした


# 概要 と 動機

Octopress + S3 + CloudFront + 独自ドメインで運用しているブログを

- https対応
- http → httpsに転送

対応させてgoogle検索上位にきてほしい。

&

httpsじゃないページなんてありえないっすよー。とか真面目に営業するのに言い訳ができる。

コスト的にはAWSは特に変わらず(無料)、純粋にSSL証明書のお値段のみ。


# やったこと と ハマりどころ

Octopress + S3 + CloudFront + 独自ドメイン までは運用してる状況においてやること

1. 証明書を取得
2. 証明書をAWSにアップロード
3. CDNに設定し、http → https 自動転送ONにする


## 1. 証明書を取得

[SSLストア　【RapidSSL 1,620円 Verisign 60,000円 GeoTrust 12,780円】](http://www.ssl-store.jp/)で、COMODO PositiveSSLを1年1200円で購入。

メールで認証があって、最終的には中間証明書3つと自分の証明書が送られてくる。

### アップロード用に中間証明書の結合

中間証明書で指定できるのが1ファイルのみのようなので結合してしまう。本来はopensslコマンドでやるべきらしいが、単なるファイルの結合なのでcatでやってしまう。

```
cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > COMODO-bundle.crt
```


### 秘密鍵をdecryptしておくこと

まぁこのあたりはApache使うときにするのと同じ。

`openssl rsa -in secret_key.pem -out secret_key.pem.decrypt`


## 2. 証明書をAWSにアップロード

- file:// で指定すること。
- pathオプションで `/croudfront/.+/` な正規表現にマッチさせないと後ででてこない
- アップロードはroleいるので注意

```shell-session
$ aws iam upload-server-certificate \
  --server-certificate-name certificate_object_name \
  --certificate-body file:///Users/pharaohkj/octopress_phalanxware_com.crt \
  --private-key file:///Users/pharaohkj/secret_key.pem.decrypt \
  --certificate-chain file:///Users/pharaohkj/COMODO-bundle.crt \
  --path /cloudfront/path/
```

## 3. http → https

CloudFrontのconsoleに入って、対象のDistributionを選んで

### Generalタブ > Editボタン

**SSL Certificate** を **Custom SSL Certificate (example.com)** に。(さっきの `--server-certificate-name` がでるはず)

### Originsタブ > 対象のドメインとパスを選ぶ > Editボタン

**Origin Protocol Policy** を HTTP Only なのを確認。よくわからない。おそらくCDNとS3間の接続プロトコル指定ということだと思うんだが・・・。 Match Viewer を選んだら私はcacheにヒットしない、というような( `CloudFront attempted to establish a connection with the origin, but either the attempt failed or the origin closed the connection.` )エラーになった。

### Behaviorタブ > 対象を選んで > Editボタン

**Viewer Protocol Policy** を Redirect HTTP to HTTPS に変更。httpsのみとかってのは最初からいくならこれでもいいかもね。


# 課題

Amazonプラグインとかが、リンクや画像の埋め込みを **http** で作っちゃったりして、イマイチ。
技術英語 > Think about it this way. / Let's put it this way. / You're not alone in that thinking.

@ LOE > August 24, 2012
http://loe.org/shows/shows.html?programID=12-P13-00034
> Think about it this way.

<hr>
関連して思い出したのは

Let's put it this way.

「こうしよう」というフレーズで、Star Trek Voyagerで何回か出てきた。トム・パリスがよく言いそう。

http://aoki.com/etc/podcast/post_2047.html
> 「このように言わせてください」
「この表現を使わせてください」
慎重な、思慮深い表現でものごとを言い表す際に使います。


<hr>
関連して思い出したのは

> <font color=red>You're not alone in that thinking</font>, it appears.
http://www.gamefaqs.com/boards/745183-hyrule-warriors/72832746/836741819

僕が覚えた時の出典はどこだったか。。。会議の質疑応答のフレーズ集だったと思う。
こっそりブランチを使う

Git で merge や rebase をするときに、失敗したらどうしようと恐れを感じることはありますか？私はあります。reflog + reset --hard や rebase --abort などを用いて操作をする前の状態を再現できることは知っていますが、コンフリクト解消中に別の作業が割り込んできて作業中断したり、コンフリクトしてやり直してを何度も繰り返したりしていると、どこにどう戻せばいいのかわからなくなってしまうことがあります。
私はそういう不安への対策としてこっそりブランチを作って作業しています。「こっそり」の意味はブランチを作って作業した痕跡が最終的に元のブランチの履歴（コミットグラフ）に残らないということです。ここでは

* 一時ブランチで作業して、うまくいったら元のブランチをそれに合わせる
* バックアップを取った上で作業し、うまくいかなかったらバックアップから戻す

の2つの手順を紹介します。これらのフローは merge や rebase に限らず、複数人で開発している状況でこっそり何かを試してみて、うまくいったら採用、うまくいかなかったら破棄としたい時にも、Git の強みである軽量なブランチを活用して、作業内容によらず一定の手順で元に戻せるという利点を与えてくれます。ブランチいちいち作るのは大げさに感じてしまうかもしれないですが、失敗したら元に戻せるという安心感を持って作業できますし、こっそりやるのであれば他人の目を気にする必要もないので気軽にやったらいいと思います。

# 一時ブランチで作業

１つ目の手順、一時ブランチで作業して、うまくいったら元のブランチをそれに合わせる方法を紹介します。
元のブランチが仮にdevelopという名前だったとして、それに沿った名前でブランチを作成してチェックアウトします。

```
% git checkout -b develop_temp
```

ここで作成した一時ブランチ上でやりたかった作業(merge/rebase/その他)をします。

## 作業がうまく行ったとき

作業の結果をコミットしたら、元のブランチをチェックアウトして作業していたブランチに同期してやれば、元のブランチで作業していたのと履歴上の区別は付きません。

```
% git commit -a
% git checkout develop
% git reset --hard develop_temp
```

外部リポジトリへの反映が必要なら push します。
最後に不要になった一時ブランチを削除します。

```
% git branch -d develop_temp
```

## 作業がうまく行かなかったとき

作業がうまくいかなかった時は元のブランチ(例えばdevelopという名前だったとします)を強制チェックアウトして、一時ブランチを消してしまえば、作業前の状態を復旧できます。

```
% git checkout -f develop
% git branch -d develop_temp
```

# バックアップとってから作業

２つ目の手順、バックアップを取った上で作業し、うまくいかなかったらバックアップから戻す方法を紹介します。
元のブランチが仮にdevelopという名前だったとして、それに沿った名前でブランチ(あるいはタグでもよいと思います)を作成して、現状のバックアップを取っておきます。

```
% git branch develop_backup
```

元のブランチでやりたかった作業(merge/rebase/その他)をします。

## 作業がうまく行ったとき

作業の結果をコミットします。

```
% git commit -a
```

外部リポジトリへの反映が必要なら push します。
バックアップブランチがもう不要であれば削除します。もし後で必要になるかもしれない場合は残しておいてもよいです（他の人が後で必要とするかもしれない場合や、バックアップとの差異をレビューしてもらいたい場合など、バックアップブランチを push するケースもあります）。削除する場合は

```
% git branch -d develop_backup
```

とします。

## 作業がうまく行かなかったとき

作業がうまく行かなかった場合は、reset で HEAD をバックアップに合わせ、バックアップを削除すれば、作業前の状態を復旧できます。

```
% git reset --hard develop_backup
% git branch -d develop_backup
```

# まとめ

Git のブランチをこっそり使う2通りの方法を見ました。こういう使い方をしている人はたくさん居ると思うのですが、他で紹介されているのを見つけられなかった(こっそりやっていて表に出てこないのか、私の探し方が甘いのか)ので紹介してみました。わかりやすい名前でブランチを作っておくことで、reflog から何を探したらいいのかと悩まずに済むという安心感を持って作業を行えますのでよかったら使ってみてください。
DOMってなんぞや


よくDOM（ドム）って単語を耳にするけど、実際それって何なの？って思ったので少し調べました。

##DOMとは
>Document Object Model (DOM) は、W3Cから勧告されている HTML文書やXML文書をアプリケーションから利用するためのAPIである。 Level 1 から Level 3 まで勧告されている。
wikipediaより引用：https://ja.wikipedia.org/wiki/Document_Object_Model

レベル分けされているっていうのは知らなかった。
HTML文書、XML文書をアプリケーションから利用する、一体どんなふうにhtmlタグとかにアクセスしているんだろうか？

##DOMとNode
>DOMは文書を、より特化した他のインターフェイスを実装もする Node オブジェクトの階層構造として表わす。

wikipediaより一部抜粋：http://www.doraneko.org/misc/dom10/19981001/cover.html
このNodeってなんなの？少し調べてみた

###Node
>英語で節、交点、結節点のこと。
>・ネットワークの節点。コンピュータネットワークではサーバ、クライアント、ハブ、ルータ、アクセスポイント等、センサネットワークではセンサ端末。交通分野においては、交通結節点。
>・連結リストや二分木、二分探索木における節点。
>・グラフ理論において、リンクによって結ばれる頂点。
>・交点 (天文)。特に、月の交点。
>・電子回路において、2本以上の配線が接続される点。回路図では黒丸で描く。
>・Node.js - サーバサイドJavaScriptのフレームワーク。

wikipediaより引用：https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%83%89

結節点、、node オブジェクトが結び目になって構造を形成しているのかな？
で、階層構造っていうのが、ノードツリーって呼ばれていて、木構造と言うデータ構造をしている

この木構造には下記のようなnodeがあるんだそうだ

- 子ノード：child node
- 親ノード：parent node
- 兄弟ノード：sibling node
- 根ノード：root node
- 葉ノード：leaf node
- 内部ノード：internal node、inner node

木構造：https://ja.wikipedia.org/wiki/%E6%9C%A8%E6%A7%8B%E9%80%A0_(%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0)

ようするに、DOMというAPIを使って、HTML文書をノードの階層構造として認識しているって事なんだね。
そして、DOMはHTML文書を１２種類のノードに分類するらしい

- Document
	- ドキュメント、階層のルートに相当
- DocumentFragment
	- ドキュメントフラグメント
- DocumentType
	- ドキュメントタイプ
- EntityReference
	- エンティティリファレンス
- Element
	- エレメント、要素に相当
- Attr
	- アトリビュート、属性に相当
- ProcessingInstruction
	- 処理命令
- Comment
	- コメント
- Text
	- テキストノード、タグ以外の文字データに相当
- CDATASection
	- CDATA セクション
- Entity
	- エンティティ
- Notation
	- ノーテーション

##JavaScriptでのアクセス方法

    window.document

で「documentノード」にアクセスしてるって事なのかな？

documentノードの子ノードに当たるElementノードにアクセスするのは

    document.getElementsByTagName("p")

と書いて、これはdocumentノード内の「p」というElementノード（documentノードの子ノード、もしくは子孫ノード）にアクセスしているって事になるのかな。

という事は、このノードツリーがわかりさえすれば、JavaScriptでHTML文書内にある要素にはアクセスが可能になるってわけだ。

実際、知らずに使っている事が多かったし、jQueryとか使うとこういう知識がなくても簡単に要素へアクセスができちゃうからだろうなーと思う。
Mecabの「too long sentence」エラーの解消方法


[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)の20日目の記事です。

もうすぐクリスマスですね。

ということで、MroongaでトークナイザにMecabを採用している時にたまに出くわす「mecab_sparse_tostr() failed len=XXX err=too long sentence.....」というエラーの解消方法を紹介します。

# そもそもの原因
メッセージからも読み取れるとおり、取り込む文章が大きすぎてリソースが溢れてるというのは以下の記事でも触れています。

* [【全文検索】Groongaで学ぶ全文検索 2015-11-20に参加してきました](http://qiita.com/ukitiyan/items/5fb565595bf1db583651)

# 解消方法

Groongaバージョン 5.0.1 から追加されたプロパティを設定するだけです。
[5.0.1リリース - 2015-03-29](http://groonga.org/ja/docs/news.html#release-5-0-1-2015-03-29)
> [実験的][mecab] チャンクに分割してトークナイズできるようにしました。この機能は MeCabの "too long sentense" エラーの回避策です。有効にするには GRN_MECAB_CHUNKED_TOKENIZE_ENABLED 環境変数を yes に設定します。この設定により、Groonga は長いテキスト (デフォルトでは 8192 バイトを越えるテキスト)を小さなチャンクと呼ばれるかたまりに分割してMeCabへと渡します。この処理により、上記のエラーが発生しないようになります。

以下で実際に再現から解消されるかを検証してみます。
環境はAmazon Linux(Micro)で実施してます。

## 再現方法

1. 以下を参考にMroongaをインストールします。トークナイザーとして MeCabもインストールしてください。

	[2.5.4. CentOS 6（OracleのMySQL 5.7パッケージを利用）](http://mroonga.org/ja/docs/install/centos.html#centos-6-with-the-oracle-mysql-5-7-package)

2. データベースを用意します。

		# mysql -uroot -p
		mysql> create database mecabdb default character set utf8;
		mysql> grant all privileges on mecabdb.* to mecab@'%' identified by 'Mecab1234!';
		mysql> exit;

3. テーブルを用意します。

		# mysql -uroot -p mecabdb
		mysql > CREATE TABLE `mecab_test` (
		  `id` int(11) NOT NULL AUTO_INCREMENT,
		  `content` LONGTEXT,
		  PRIMARY KEY (`id`),
		  fulltext index(content) comment 'parser =　"TokenMecab"')
		ENGINE=mroonga AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

4. ビック文章をインサートしてみます。

		# mysql -umecab -p mecabdb < big text.sql
		ERROR 1026 (HY000) at line 1: [tokenizer][mecab] mecab_sparse_tostr() failed len=2257788 err=too long sentence.

再現しました。このエラーを見ると現実逃避するためにスプラトゥーンを朝までやり続けた日々を思い出すわけですが、もう怖くありません。

## 解消方法

1. Mroongaを停止します。

		# service mysqld stop
2. 起動スクリプトにGRN_MECAB_CHUNKED_TOKENIZE_ENABLED 環境変数を設定します。

		# vi /etc/init.d/mysqld
		export GRN_MECAB_CHUNKED_TOKENIZE_ENABLED=yes
		を序盤に追記

3. Mroongaを再開します。

		# service mysqld start


## 結果確認

1. ビック文章をインサートしてみます。

		# mysql -umecab -p mecabdb < big text.sql
エラー出てませんね。

2. インサートされてるか確認します。

		# mysql -umecab -p mecabdb
		mysql> select count(*) from mecab_test;
		+----------+
		| count(*) |
		+----------+
		|        1 |
		+----------+
		1 row in set (0.00 sec)


# まとめ（感想）
* 解決方法を須藤さんに伺った時は「ココらへんのソース読んでください」と言われ、どうなるこかと思いましたが、すんなり解決して良かったです。
* お陰様で年を越せそうです。来年もよろしくお願いします！
DB操作を行うクラス設計時の備忘録


#概要
データベースを操作するクラスをテーブルごとに分ける設計を考えたが、復数のテーブル操作を一つのトランザクションで行う際に設計上つまづいたのでメモメモ

#課題
クラスを下記のような構成で作成したが、一つのテーブルを操作するたびにDBへの接続を行う仕様になっていたため、一つのトランザクションで復数テーブルの操作ができなくなってしまいましたorz

* Database  
内容：コンストラクタでDBへの接続を行う。テーブル毎のクラスで共通して使用するメソッドを定義
* Table1　extends Database  
内容：テーブル１を操作するメソッドを定義
* Table2　extends Database  
内容：テーブル２を操作するメソッドを定義

ソースはこんな感じ

```php
class Database
{
const SERVER = "サーバー名";
const USER = "ユーザ名";
const PASS = "パスワード";
const DATABASE = "DB名";

public $link;

public function __construct(){
    $this->link = new mysqli(self::SERVER,self::USER,self::PASS,self::DATABASE);
    if($this->link->connect_errno){
        die("接続失敗".$this->link->error);
    }
}
}

class Table1 extends Database {
    public function add(){
        $link->query("INSERT INTO table1 (・・・・) VALUES(・・・・)");
    }
}
class Table2 extends Database {
    public function add(){
        $link->query("INSERT INTO table2 (・・・・) VALUES(・・・・)");
    }
}

//それぞれでデータベースに接続しているためどうやって一つのトランザクションで復数テーブルを操作しよう。。。
$table1 = new Table1();
$table1->add();
$table2 = new Table2();
$table2->add();


```


#解決方法
理想の流れは　
DB接続　→　トランザクション開始　→　テーブル１操作　→　テーブル２操作　→　コミット
なので、
クラスDatabaseのコンストラクタでDBへの接続を行うことをやめ、DB接続をクラスDatabaseで独立させる。
そして、MySQL サーバーへの接続を表すオブジェクトをテーブル操作するメソッドに引数として渡すことで解決できました。
以下、解決後のソースの流れはこんな感じ

```php
class Database
{
const SERVER = "サーバー名";
const USER = "ユーザ名";
const PASS = "パスワード";
const DATABASE = "DB名";

public $link;

public function connect(){
    $this->link = new mysqli(self::SERVER,self::USER,self::PASS,self::DATABASE);
    if($this->link->connect_errno){
        die("接続失敗".$this->link->error);
    }
    return $this->link;
}

public function begin_transaction($link) {
    return $link->begin_transaction;
}

public function commit($link) {
    return $link->commit;
}

}

class Table1 {
    public function add($link){
        $link->query("INSERT INTO table1 (・・・・) VALUES(・・・・)");
    }
}
class Table2 {
    public function add($link){
        $link->query("INSERT INTO table2 (・・・・) VALUES(・・・・)");
    }
}

$DB = new Database();
$link = $DB->connect();
$DB->begin_transaction($link);
$table1 = new Table1();
$table1->add($link);
$table2 = new Table2();
$table2->add($link);
$DB->commit($link);
```
【Groongaで学ぶ全文検索 2015-12-18】ドリルダウンについて


# はじめに

2回目の参加です。仕事で20分遅刻しました。すみません >_<


# ドリルダウンについて

## ドリルダウンとは

ドリルダウンとは - IT用語辞典 
> ドリルダウンとは、データ集計や分析で用いる手法の一つで、集計範囲を一段階絞ってより詳細な集計を行うこと。また、そのようなソフトウェアの機能。例えば、各年のデータが表示された画面で、特定の年を指定してその年の月単位のデータを表示したりするような操作のことを言う。

* 集計範囲を一段階絞ってより詳細な集計を行うこと。
* 別名、ファセット
* BIとかOLAPでよく用いられる

BIとは - IT用語辞典
> BI（Business Intelligence、BI）とは、業務システムなどから蓄積される企業内の膨大なデータを、蓄積・分析・加工して、企業の意思決定に活用しようとする手法。ERPパッケージやCRMソフトなどからもたらされるデータの分析を専門家に依存せず、経営者や社員が必要な情報を自在に分析し、経営計画や企業戦略などに活用することを目指している。

OLAPとは - IT用語辞典 
> OLAP（On-line Analytical Processing、OLAP）とは、データベースに蓄積された大量のデータに対し複雑な集計、分析を行い、素早く結果を提示することができるシステム。

## データの持ち方

* データの持ち方として、行指向と列指向（カラムナ）がある
* 行指向は行毎にワンセットのデータを持つ
	* RDBMSで用いられ、集計が苦手気味
* 列指向は列毎にワンセットなデータを持つ
	* データウェアハウスで用いられ、集計が得意
* なのでGroongaは列指向採用してる

| 行指向 |列指向 | 
|:-----------|:------------|
|![行指向](http://www.publickey1.jp/blog/11/columnardb01.jpg)|![列指向](http://www.publickey1.jp/blog/11/columnardb02.jpg)

## Groongaの強み
* 一定量の情報を取得して、突き合わせ処理してるので早い
	* 1個ずつやるより一気にガッとやった方が効率が良いから
* 1回のselectでn個のdrill downすることができる
ので早い
	* 因みに複数キーをサポートしたのはGroonga4.0.8からみたいですね。
http://groonga.org/ja/blog/2014/11/29/release.html
* 2段のドリルダウンを行う場合、1個目のScanと2個目のScanを同時に走らせている
* 集計時、結果セットをHashテーブルで持つことでキー毎の集計を高速化してる
* 更にバリューに当該レコードの情報を保持してるので、集計結果を表示するときに色々使える

## 実際のパフォーマンス

* 色々探したけど見つからないので、時間みて検証したい。。


# まとめ

* ほぼ用語集な内容ですみません。
* ドリルダウンやカラムナーについては、知っておかないといけない知識ということは再認識できた。
* ドリルダウンって、絞り込みじゃなくて集計です！という須藤さんの言葉が分かったようで、実は理解出来ていないことを今知った。。
* 最近バタバタしてるし、遅刻してしまったし、少し不完全燃焼（楽しみにしていたセミナーだったのに・・）
* 次回は業務を落ち着けて、遅刻しないように参加します！
Google Apps Scriptで画像の文字列を抜き出す

##概要
Google Apps Scriptで画像から文字を抜き出すコードを書きました。
近所のヨーカドーのWebチラシをGoogle Apps Scriptで毎日読み込み、
ヨーグルトが安かったらスマフォに通知するのが目標でした。

先に結論からいうと、チラシだとOCRの精度が悪くGoogleのOCRはこれからと言ったところでした。
青空文庫をキャプチャして読み込んだ例が以下となります。

##ポイント
DriveAppではなくDrive APIを使うのがコツです。

##Drive APIを有効にする
Drive APIはデフォルトでOFFなので、エディタを開いたら有効にする必要があります。
1.GASのエディタ > リソース > Google の拡張サービスを開く
2.Drive APIをONにする
![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/45865/cec2fdbb-de53-f519-1fa3-17bd6ea44bde.jpeg)
3.Google デベロッパー コンソールを開く
4.検索窓で「Drive API」を検索
5.Drive APIを有効にする

##スクリプト
URLからファイルを読み込み、OCRしながらGoogle Driveにアップロードします。
アップロードされるとGoogle Documentとして処理され、画像の下に読み取ったテキストが表示されます。

```javascript:コード.gs
function myFunction() {

  // Driveに保存するファイル情報
  var resource = {
    title: '20151220', // ファイル名
    mimeType: 'image/png' // ファイルのMIMEタイプ
    // mimeType: 'application/pdf'
    // mimeType: 'image/jpeg'
  };
 
  // 対象のファイル
  var response = UrlFetchApp.fetch('https://qiita-image-store.s3.amazonaws.com/0/45865/a99e5512-5306-2a2d-31f1-58c106a995c6.png');
  var mediaData = response.getBlob();

  // OCRの設定
  var optionalArgs = {
    ocr: true,
    ocrLanguage: 'ja'
    // ocrLanguage: 'en'
  };
  
  // Google Driveにファイル追加
  var file = Drive.Files.insert(resource, mediaData, optionalArgs);

  // 読み取ったテキスト
  // スプレッドシートに保存したり、メールで飛ばしたり
  // var doc = DocumentApp.openById(file.id);
  // var text = doc.getBody().getText();
}

```

##読み込んだ画像
![笑う唖女.png](https://qiita-image-store.s3.amazonaws.com/0/45865/a99e5512-5306-2a2d-31f1-58c106a995c6.png)

##OCR結果
ふりがなが読み取りを阻害してる気がします。
>笑う呼女
夢野久作
「キキキ------ケ工ケ工ケ工------ キキキキッ」 形容の出来ない奇妙な声が、突然に聞こえて来たので、座敷中皆ジンとなった。 それはこの上もない拳曲歳い座敷であった。 ) * 宙所家の奥座敷、十置と十二置続きの広間に被宿リの大勢のお客が、酒を飲んでワイ?ィ奉っていた。奇妙な謡曲を謡う者、流行節を唄 い唄い座ったまま躍り出しているもの・不安とか、不吉とかいう形のミジンも頭していない靴そのもののような暗の人々の集まりであっ た。それが皆、突然にシンとしてしまったのであった。 「...何じゃったろかい。今の声は...」 「ケダモノじゃろか」 「鳥じゃろか」 「猿と人間と舎の子のような・」 「...春先に記端かん等じゃが------」 - - 皆、その声の方向に顔を向けて耳を澄ました。 三間の床の間にリと 松と竹の学備称。その前に新郎の当主甘川澄夫と、新婦 リ リ*リ た。墓の諸寺伯と そのリた老人。仲人役の郡奉師会長墨野琴豊斐は 鶏ースッキリしたエロックコートに繋鞭 で駆の一ー当ーリ所員堅長リ舎長、同リたような村 でも望しい老若がータースはかり情経に頑張って所狭しと並んだ田舎料理を盛んにパク付いては、氏神様から借りて来た五合一升一升 五合入のリ大歪を理わしている。豊担当酔っている。リのの、まなほんのリのロといっ壺い座敷であった。 縁側の橋学際に生っている仲人役の栗野博士夫妻は最前から頻りに気を離んで、新郎新婦に席を緊きせようとしていたが、田舎の風俗に慣 れない新部の選夫がモジモジしている時にナカサ力立ちそうになかった。ゃ、立上りそうな腰構えになると又も歪を請識に来る者がいるの で又も尻を廃付けなければならなかった、登うしてやっと歪が絶えた機会を覚縮って本気に立上ろうとしたところへ今一度前と違った奇怪な 叫び声が聞こえたので、又もベタリと腰を諭したのであった。 「ァワァワァワ・ェべェペ----- 工べ...」 「何じゃい。アル雄ャンの声じゃないかい」 「亜ヤンの非人が何か賞いに来とるんじゃろ」 「ウン。お玄関の方角じゃ」 は 「ああ、ピックリした。俺はまた生きた猿の皮を剥ぎよるのかと思うた」 「...シッ...猿ナンチ事云うなよ」
オ *ヘへ三エナー4ーrぐ》lメーォー 山ー二 lーーtーロエ」へい ° 島 ベr、ローX2は上、"-l L -*マ十ャートー

##読み込んだ元ネタ
夢野久作 - 笑う唖女 (青空文庫)
http://www.aozora.gr.jp/cards/000096/files/931_22204.html
ロードバランサ配下でCodeIgniterのシステムを動かす

# はじめに

CodeIgniterに限らず、負荷分散のためにロードバランサ配下に複数のwwwサーバを配置してシステムを動かすというのは、結構あることだと思います。

CodeIgniterでは、config.phpの`$config['proxy_ips']`という配列にロードバランサ（リバースプロキシ）のIPアドレスを入力することで、`$this->input->ip_address()`や`$this->input->valid_ip($ip)`等のメソッドで、ロードバランサのIPアドレスではなく、上位の（本来のアクセス元の）IPアドレスを取得できるようになります。

なお、実際のシステム運用においては、ロードバランサ配下のwwwサーバの共有ストレージはどうするのか、セッション管理はどうするのか等、他に考慮すべき点があります。

本投稿においては、ロードバランサ配下でCodeIgniterのシステムを動かすために必要な設定等をまとめていきます。


※現在執筆中です。随時更新します。
[sails.js] WaterlineのアダプターのTips

# はじめに
**アドベントカレンダーに遅刻して申し訳ございません。**

WaterlineというNode.jsで使えるORMパッケージがあり、そのアダプターのTipsを簡単にまとめます。

## アダプターのひな形を生成する
### ダミープロジェクトを作る
`sails.js adapter`でググると

https://github.com/balderdashy/sails-adapter-boilerplate

が引っかかり、これを使えばいいのかーと一瞬思いそうなのですが、違います。

実際には下記のコマンドを実行しダミーのプロジェクトを生成してそれを使います。

```shell-session
$ sails generate adapter foo
```

こののコマンドを実行すると

```
.
└── api
    └── adapters
        └── foo
            ├── CONTRIBUTING.md
            ├── FAQ.md
            ├── LICENSE
            ├── README.md
            ├── fooAdapter.js
            ├── lib
            │   └── adapter.js　←　こいつをいじる
            ├── package.json
            └── test
                ├── integration
                │   └── runner.js
                └── unit
                    ├── README.md
                    └── register.js
```

のようにファイルが生成されるので、`adapter.js`の中身をいじってアダプターを作ります。

ファイルの中身を見るとわかるのですが、

- boilderplateの方

```js
...
    /**
     * 
     * This method runs when a model is initially registered
     * at server-start-time.  This is the only required method.
     * 
     * @param  {[type]}   collection [description]
     * @param  {Function} cb         [description]
     * @return {[type]}              [description]
     */
    registerCollection: function(collection, cb) {

      // Keep a reference to this collection
      _modelReferences[collection.identity] = collection;
      
      cb();
    },
...
```

- sails generate adapterの方

```js
...
    /**
     *
     * This method runs when a model is initially registered
     * at server-start-time.  This is the only required method.
     *
     * @param  {[type]}   connection [description]
     * @param  {[type]}   collection [description]
     * @param  {Function} cb         [description]
     * @return {[type]}              [description]
     */
    registerConnection: function(connection, collections, cb) {

      if(!connection.identity) return cb(new Error('Connection is missing an identity.'));
      if(connections[connection.identity]) return cb(new Error('Connection is already registered.'));

      // Add in logic here to initialize connection
      // e.g. connections[connection.identity] = new Database(connection, collections);
      connections[connection.identity] = connection;

      cb();
    },
...
```

という風に関数の名前もシグネチャも違うので、boilderplateの方は使わない方がいいのではないかと思います。

## アダプターの中身を書く

Waterlineのアダプターで実装すべき関数は、https://github.com/balderdashy/sails-docs/blob/master/contributing/adapter-specification.md でカテゴリー分けされています。

- Semantic インタフェース
    - CRUDを提供する
- Query インターフェース
    - 検索機能を提供する
- Migratable インターフェース
    - マイグレーションや、テーブルのメタデータを変更する機能を提供する
- SQL インタフェース
    - 生のSQLを実行する機能を提供する

他にも色々あるようなのですが、そもそもexperimentalなのが多く、使うことはないと思います。また実際に実装する際は、`sails generate apdater`で生成されたファイルにすでに書かれている関数の中身を作成するだけで基本十分なのではないかと思います。

で、後は実装していくだけなのですが、モデル情報を取るためには、`registerConnection`の第二引数である`collections`の`definition`プロパティに、モデル定義の`attributes`の情報がほぼそのまま入っているので、それを利用します。

# まとめ
遅刻したのに微妙な記事で誠に申し訳ございません。
Vectorの平均値と中央値を求める

##平均値の求め方
合計して要素の数で割る

```c++:mean.cpp
float mean(vector<float> v) {
    int size = v.size();
    float sum = 0;
    for (int i = 0; i < size; i++){
        sum += v[i];
    }
    return sum / size;
}
```

##中央値の求め方
要素の値でソートして中央の要素を返す
要素の数が偶数だったら中央2つの平均を返す

```C++:median.cpp
float median(vector<float> v) {
    float size = v.size();
    vector<float> _v(v.size());
    copy(v.begin(), v.end(), back_inserter(_v));
    float tmp;
    for (int i = 0; i < size - 1; i++){
        for (int j = i + 1; j < size; j++) {
            if (_v[i] > _v[j]){
                tmp = _v[i];
                _v[i] = _v[j];
                _v[j] = tmp;
            }
        }
    }
    if (size % 2 == 1) {
        return _v[(size - 1) / 2];
    } else {
        return (_v[(size / 2) - 1] + _v[size / 2]) / 2;
    }
}
```
homebrew-caskがErrorになると思ったら本家に移行してた

homebrewとcaskをupdateしたらerrorが出るようになりました。

```
$ brew cask list
Error: Cask 'alfred' definition is invalid: Bad header line: parse failed
```
どうやら2015/12/10時点でhomebrew-caskが本家に移行したらしいです。
https://github.com/caskroom/homebrew-cask/pull/15381
https://github.com/Homebrew/homebrew/pull/46795

というわけでhomebrew-caskは削除してねってことみたいなので以下のCommandを実行します。

```
$ brew uninstall --force brew-cask; brew update
```
これでErrorなく使えるようになりました。

[caskroom.io](http://caskroom.io/)を見るとインストール方法も`Tap`に変わってます。
これはもう古い。
`$ brew install brew-cask`
これからはこっち。
`$ brew tap caskroom/cask`

これからはcaskのupdateをいちいちしなくてもよいので管理が楽になりましたね。すばらしい。


ちなみに[caskroom/homebrew-cask](https://github.com/caskroom/homebrew-cask)でのリリースは[v0.60](https://github.com/caskroom/homebrew-cask/releases/tag/v0.60.0)で最後みたいです。
お疲れ様でしたm(_ _)m
プロジェクトオイラーで学ぶJAVA8


Java8で導入されたストリームAPIなどを勉強のためにプロジェクトオイラーの問題を解いてます。

#問題1
10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.

同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.

#解答
わかりきったことですが、
1から999までループしながら3または5の倍数か判定しながら足していきます。
##Java7までのコード
```java
    public static int sum() {

        int sum = 0;

        for (int i = 1; i < 1000; i++) {

            if (i % 3 == 0 || i % 5 == 0) {
                sum += i;
            }
        }

        return sum;
    }
```

##Java8でのコード
ストリームAPIとラムダ式を使って記述しました。

```java
    public static int sum() {
        return IntStream.range(1, 1000).parallel().filter(x -> x % 3 ==0 || x % 5 == 0).sum();
    }

```
UIImagePickerControllerで画像を選択した後に確認画面を追加する

iOSのメッセージアプリは、フォトライブラリーから写真を選択した後、その写真を使うかどうかの確認画面が用意されています。今回、UIImagePickerControllerを使って確認画面を追加する処理を作成しました。

# 完成イメージ

![MyImagePicker.gif](https://qiita-image-store.s3.amazonaws.com/0/75307/a5c5eb3d-9b04-80d5-c31b-c0e6e00f253a.gif "MyImagePicker.gif") 

# UIImagePickerControllerを表示する

iOS8以降では、UIImagePickerControllerをストーリーボード上のView Controllerに適用して表示することは、できないかあるいはかなり難しい実装となります。そのため、ストーリーボードは使わず、直接UIImagePickerControllerをインスタンス化して表示します。

```swift:ViewController.swiftより抜粋
@IBAction func open_imagepicker(sender: UIBarButtonItem) {
    let ipc = UIImagePickerController()
    ipc.delegate = self
    ipc.sourceType = .PhotoLibrary
    self.presentViewController(ipc, animated:true, completion:nil)
}
```

# UIImagePickerControllerから確認画面を表示する

UIImagePickerControllerで画像が選択されると、UIImagePickerControllerDelegateのプロトコルが呼び出されます。この中で確認画面を表示します。UIImagePickerControllerはUINavigationControllerでもあるので、UIImagePickerControllerから確認画面を表示することができます。

```swift:ViewController.swiftより抜粋
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
    // フォトライブラリーで画像が選択された時の処理
    guard let confirmController = storyboard?.instantiateViewControllerWithIdentifier("confirm") as? ConfirmController else {
        return
    }
    confirmController.delegate = self
    confirmController.image = image
    picker.pushViewController(confirmController, animated: true)
}
```

# 確認画面で画像が選択された

確認画面で画像が選択された時には、イメージピッカーを表示している画面に戻ります。今回はこの確認画面用のConfirmDelegateプロトコルを作成しています。

```swift:ConfirmDelegate.swift
import UIKit

protocol ConfirmDelegate {
    func confirm(confirm: ConfirmController, picker: UIImagePickerController?, selectedImage: UIImage?)
}
```

```swift:ConfirmController.swiftより抜粋
@IBAction func confirm(sender: UIButton) {
    let picker = self.parentViewController as? UIImagePickerController
    self.delegate?.confirm(self, picker: picker, selectedImage: self.image)
}

```

```swift:ViewController.swiftより抜粋
func confirm(confirm: ConfirmController, picker: UIImagePickerController?, selectedImage: UIImage?) {
    // 確認画面で確認した時の処理
    self.selectedImage.image = selectedImage
    picker?.dismissViewControllerAnimated(true, completion: nil)
}

```

# 感想

なるべくストーリーボードを積極的に使っていきたいと日々思っているのですが、UIImagePickerControllerはストーリーボードの使い方がわからない、個人的には残念な例です。

# サンプルコード

https://github.com/nakaken0629/ImagePickerSample
Exponentiation Operator

# Exponentiation Operator

この記事は [JavaScript stage 0,1,2,3 Advent Calendar](http://qiita.com/advent-calendar/2015/esnext) の2日目の記事です。書けるところまで一人で書いてみようと思ってみました。

**ちなみに執筆当時は stage 3 です**

Exponentiation Operator はいわゆるべき乗を行う新しい演算子です。 JavaScript には Math.pow という関数がありますが、あれをやるための演算子です。

```js
let squared = 2 ** 2;
// same as: 2 * 2

let cubed = 2 ** 3;
// same as: 2 * 2 * 2

let a = 2;
a **= 2;
// same as: a = a * a;

let b = 3;
b **= 3;
// same as: b = b * b * b;
```