OmniAICreator/Qiita-1.07M huggingface dataset:
Merry Christmas & Happy New Year!

![greeting_1000x500.png](https://qiita-image-store.s3.amazonaws.com/0/103124/b7b2b22d-7f4d-0e92-8e77-cca912496b11.png)

# Merry Christmas & Happy New Year!

予約システム「Coubic (クービック)」https://coubic.com と、サロン・マッサージの当日・前日予約サービス「Popcorn (ポップコーン)」 https://popcorn.coubic.com を運営しているクービック株式会社は、今後もご利用いただいているユーザー様・ビジネスオーナー様のご要望を受けながらサービスを改善し、機能強化を行っていきます。

# クービック株式会社では新しい仲間を募集しています
クービック株式会社にご興味をお持ちの方はぜひ Facebook ページ https://www.facebook.com/Coubic.Inc よりメッセージを送っていただければ幸いです。
CapistranoでSCMを使わずローカルファイルをデプロイする

IDCF Advent Calendarの20日目の記事です:sob:

# はじめに
リモートサーバでGitが使えない状況とか、CIローカルでビルドしてGitにはコミットしないときとか、CapistranoでローカルのファイルをSCM使わずにデプロイしたいときって結構ありますよね。
Capistrano 3でSCM使わずにローカルファイルをデプロイする情報ってあまりないような気がするので紹介します。

# capistrano-scm-copy
もちろん自分でガリガリタスクを書けば実現できますが、[capistrano-scm-copy](https://github.com/wercker/capistrano-scm-copy)というGemを使うと非常に簡単に実現できます。
CIサービスの[Wercker](http://wercker.com/)が出してるGemです。

capistrano-scm-copyを使えば、ざっくりCapistrano 2の`deploy_via :copy`みたいなことができます。

ローカルで`tar`で`archive.tar.gz`というファイルを作成し、それをリモートサーバにUploadしてリリースパスに展開するというシンプルな仕組みです。

# 使い方
## アプリ
今回デプロイするアプリは基本的なRubyアプリケーションを考えますが、Rubyじゃないプロジェクトでも基本は同じです。
次のようなディレクトリ構成になっています。

```bash
$ tree . -L 2
├── Gemfile
├── Gemfile.lock
├── bin
│   └── example
└── lib
    └── example.rb
```

## Capistranoセットアップ
GemfileにCapistranoのGemを追加します。

```ruby:Gemfile
group :development, :test do
  gem "capistrano"
  gem "capistrano-scm-copy"
end
```

`bnndle install`して、Capistranoの初期化を行います。

```bash
$ bundle install
$ bundle exec cap install STAGES=staging,production
mkdir -p config/deploy
create config/deploy.rb
create config/deploy/staging.rb
create config/deploy/production.rb
mkdir -p lib/capistrano/tasks
create Capfile
Capified
```

`Capfile`に`require 'capistrano/copy'`を追加します。

```ruby:Capfile
# Load DSL and set up stages
require 'capistrano/setup'

# Include default deployment tasks
require 'capistrano/deploy'
require 'capistrano/copy'

# Load custom tasks from `lib/capistrano/tasks` if you have any defined
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
```

## 改めてディレクトリ構成
セットアップ後のディレクトリ構成は次のようになります。
隠しファイルも表示しています。

```bash
$ tree . -a -L 2
.
├── .bundle
│   └── config
├── .gitignore
├── .vagrant
│   └── machines
├── Capfile
├── Gemfile
├── Gemfile.lock
├── Vagrantfile
├── bin
│   └── example
├── config
│   ├── deploy
│   └── deploy.rb
└── lib
    ├── capistrano
    └── example.rb

11 directories, 11 files
```

## config/deploy.rb
`config/deploy.rb`にデプロイ設定を書いていきます。

```ruby:config/deploy.rb
# config valid only for current version of Capistrano
lock '3.4.0'

set :application, "example"
set :deploy_to, "~/example"
set :keep_releases, 5
set :log_level, :info

set :bundle_without, %i(development test)

# capistrano-scm-copyの設定
set :scm, :copy
```

オプションもいくつかあります。

* `exclude_dir`: デプロイしないファイルやディレクトリを指定することができます
* `include_dir`: デプロイするファイルやディレクトリを指定することができます。デフォルトで`*`になっているのですべてのファイルがデプロイ対象となります
* `tar_verbose`: `tar`コマンドの途中経過を出力するオプションです。

## config/deploy/production.rb
今回のサンプルではVagrantでたてたVMにデプロイする設定を書いています。
適当に読み替えてください。

```ruby:config/deploy/production.rb
role :server, %w(127.0.0.1)
set(
  :ssh_options,
  port: 2222,
  auth_methods: %w(publickey),
  keys: [File.expand_path("../../../.vagrant/machines/default/virtualbox/private_key", __FILE__)],
  user: "vagrant"
)
```

## デプロイ
デプロイは至って簡単でいつもどおりのコマンドを実行するだけです。

```bash
bundle exec cap production deploy
```

今回のサンプルだとデプロイ前にVagrantの起動が必要です。

```bash
vagrant up
```

# おわりに
今回使ったファイルは[GitHub](https://github.com/nownabe/examples/tree/master/capistrano-scm-copy)においてあります。

このように`capistrano-scm-copy`を使うと簡単にローカルファイルをデプロイすることができます :laughing: 
ネットワークに制限がある環境や、CIでビルドするアプリケーションなどでぜひ使ってみてください :sparkles:
Goで標準入力の先頭をみてJSONとして読むかどうか切り替える

標準入力から「JSON、もしくはそれ以外のなにか」が流れてきた場合に、先頭1バイトを見て `{` で始まっていたらJSONとして、そうでなければ行単位で読み込みたい、というのをGoで書く。

[bufio.ReaderのPeek](https://golang.org/pkg/bufio/#Reader.Peek) を使うとできます。
(thanks to @acidlemon)

```go
package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
)

func main() {
	reader := bufio.NewReader(os.Stdin)
	b, _ := reader.Peek(1)
	if string(b) == "{" {
		var v interface{}
		dec := json.NewDecoder(reader)
		dec.Decode(&v)
		fmt.Println("json", v)
	} else {
		line, _, _ := reader.ReadLine()
		fmt.Println("line", string(line))
	}
}
```

実行結果

```
$ echo foo | go run main.go
line foo
$ echo '{"foo":"bar"}' | go run main.go
json map[foo:bar]
```
[#php]年度を取得する関数

htmlで書かれてた古いサイト(Expressで編集されてたらしい)を
部分的に.phpに直して自動更新できるように直していってます。

その過程で、年度を取得できると嬉しいので実装しました。

```php
/**
 * @input: start_date, the start date of a fiscal year
 * @output: fiscal year
 */
function getFiscalYearOfToday($start_date='04/01'){
  $today = date('Y/m/d');
  $start_year = date('Y').'/'.$start_date;// 2015/04/01 or 2016/04/01
  if(strtotime($today) >= strtotime($start_year)){
    // e.g. 2015.4.1 ~ 2015.12.31 => 2015
    $year = date('Y');
  }else{
    // e.g. 2016.01.01 ~ 2016.03.31 => 2015
    $year = date('Y') - 1;
  }
  return $year;
}
```

デフォルト値で4月1日を入れていて、その日より前か後かで年度を取得します。
これでまた少しヘルシーになった。

Thanks to [【PHP】日付比較 - Qiita](http://qiita.com/konweb/items/233a7fefe3f33ec595ae)

## 追記(2017/03/18)

コメントに頂いている通り、大幅にコードを短くすることが可能で、下記の1個めの方がそれに相当します。
しかし、VM上でCentOS7, php5.4.16ではうまく実行されず、2個めを書くことにしました。

```php
echo (new \DateTime('-3 month'))->format('Y');# 1個め
echo date('Y', strtotime('-3 month'));#　2個め
```
JavaScriptでデスクトップ通知（HTML5 Notification）

デスクトップ通知ができる「Notification」の通知を出してみるところまでです。

# 通知だけ
とりあえず動かすだけなら

```html:test.html
<script>
var n = new Notification("Hello World");
</script>
```

# Notificationの利用可否チェック
現時点でIEは未対応です

```js:test.html
if (window.Notification) {
  alert('Notificationは有効です');
} else {
  alert('Notificationは無効です');
}
```

# パーミッション確認
ブラウザにサイトごと許可・拒否されているか保存されており、初めての場合はdefaultが返ってきます

```js:test.html
if (Notification.permission === 'granted') {
  alert('通知許可されています');
} else if (Notification.permission === 'denied') {
  alert('通知拒否されています');
} else if (Notification.permission === 'default') {
  alert('通知可能か不明です');
}
```

# リクエスト
意図的に許可のリクエストを行う場合はrequestPermissionを指定します。最初の通知の場合はブラウザから通知して良いかどうか確認されます。リクエストを行わず通知を行った場合は、ブラウザから確認されるので必ずしも必要というわけではなさそうです。

```js:test.html
Notification.requestPermission(function(result) {
  if (result === 'denied') {
    alert('リクエスト結果：通知許可されませんでした');
  } else if (result === 'default') {
    alert('リクエスト結果：通知可能か不明です');
  } else if (result === 'granted') {
    alert('リクエスト結果：通知許可されました！！');
  }
})
```

# 通知
Notification を行います

```js:test.html
var n = new Notification("Hello World");
```

# 組み合わせ
チェックと通知を組み合わせてみました

```html:notification.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Desktop Notification</title>
</head>
<body>

<script>

// Notification対応しているかどうか
if (window.Notification) {
  alert('Notificationは有効です');

  // Permissionの確認
  if (Notification.permission === 'granted') {

    // 許可されている場合はNotificationで通知
    alert('通知許可されています');
    var n = new Notification("Hello World");

  } else if (Notification.permission === 'denied') {

    alert('通知拒否されています');

  } else if (Notification.permission === 'default') {

    alert('通知可能か不明です');

    // 許可が取れていない場合はNotificationの許可を取る
    Notification.requestPermission(function(result) {
      if (result === 'denied') {

        alert('リクエスト結果：通知許可されませんでした');

      } else if (result === 'default') {

        alert('リクエスト結果：通知可能か不明です');

      } else if (result === 'granted') {

        alert('リクエスト結果：通知許可されました！！');
        var n = new Notification("Hello World");
      }
    })
  }
} else {
  alert('Notificationは無効です');
}

</script>

</body>
</html>
```
Testing > 考察 > FTPサーバーからファイルを取得して処理する実装のテスト

```txt:開発環境
C++ Builder XE4
```

あるFTPサーバーからファイルを取得して処理するプログラムを開発するとき、その実装をどのようにテストするか

1. 実際にFTPサーバーを立てる
  - linuxなどで可能
  - 取得するファイルをどのように用意するのか? (マニュアルで用意?)
  - ネットワークに影響を与えないため、ローカル環境に立ててローカル接続 (開発PCもローカルに入れる)
2. FTPサーバーと接続したことにする
  - ファイルは開発PCの別フォルダに用意しておき、それを読込む
  - 実際のFTPサーバーとの接続部分は別途検証が必要
  - 再現実験がしやすい
  - フォルダ内のファイルを調整することで、テスト状態をコントロールしやすい
3. 相手先のエミュレータを作成する
  - エミュレータのデバッグに時間をとられる
  - （ループバックができないとして) エミュレータを動かす別環境が必要
  - エミュレータのソフトを変更することで、応答をカスタマイズ可能


FTP接続の場合は、別にエミュレーターを作るほどでもないと思えてきた。

案2でよさそう。
これは今読んでいるGrenningの本の「ダブル(代役)」というものなのだろう。

テストの目的が高負荷の通信試験などであれば、選択肢は変わる。その場合はきちんとしたFTPサーバーを使うことになりそう。

今やろうとしている実装は、「取ったあとのファイル処理」に重きを置いている。
BEAR.Sunday 2015

## BEAR.Sunday 2015

 * [v1.0.0](http://koriym.github.io/blog/2015/05/31/first-bear-sunday-stable-release/) 安定板リリース (5/31)

 * [PSR7対応](https://bearsunday.github.io/manuals/1.0/ja/psr7.html)
 * [Excite ママ](http://mama.woman.excite.co.jp/)など幾つかのBEAR.Sunday v1.0アプリの登場。
 * [データベース、ページャーライブラリ](http://bearsunday.github.io/manuals/1.0/en/database.html)
 * [Siren](https://github.com/kuma-guy/BEAR.SirenModule)などのハイパーメディアサポート
 * [Webフォーム](http://bearsunday.github.io/manuals/1.0/ja/form.html)
 * [PHPStormプラグイン](https://plugins.jetbrains.com/plugin/8030?pr=phpStorm)

今年は5/31にBEAR.Sunday v1.0をリリースしました。その後は実際の運用での細かな修正や幾つかのライブラリが追加され、アプリケーションが幾つかリリースされました。年内開発終了して来年以降にリリースされるアプリケーションもあります。

BEAR.Sundayではデータベースアクセスやテンプレートエンジンといった**機能を提供**をするのがライブラリ、それらの**機能を結びアプリケーションに制約**をもたらすのがフレームワークと考えています。

**フルスタック**という伝統的なフレームワークの形から、ここ数年で機能が単体で使える**コンポーネント志向**のフレームワークという流れが現れました。最新のPSR7対応のフレームワークはそのコンポーネントは汎用の物を使い**コンポーネント間の制約**だけを持ちます。HTML表現ですらオプションになっていますが、これはBEAR.Sundayも同じです。

## フレームワーク

2013年に行われたイベント[PHP Frameworks Day](https://www.youtube.com/watch?v=anr7DQnMMs0&feature=youtu.be&t=31m47s)でPHPの開発者ラスマスさんへ質問がありました。

> Can you tell us your opinion about a framework ?

Rasumusの答えはシンプルで明快です。

> They all sucks !　（会場笑）

この質問の答えは面白いので是非聞いて欲しいのですが、まとめてある[ブログ記事](http://www.phpclasses.org/blog/post/226-4-Reasons-Why-All-PHP-Frameworks-Suck.html)があります。

> 1. Frameworks Execute The Same Code Repeatedly Without Need
> 2. Frameworks Require Too Many Interdependent Classes
> 3. Needlessly Complicated Solutions
> 4. Duplicating the Web Server Functionality

これらはBEAR.Sundayでも取り組むべき問題だと考えていてDIやDIコンパイラで対処の試みがあります。DIを理想的な形、つまりブートストラップで１つのルートオブジェクトを作りそれをキャッシュしたり、設定からオブジェクトを作るのではなく、設定からファクトリーコードをコード生成しパフォーマンスや実際にどうオブジェクトが作られるか明快にしています。[DIP](https://en.wikipedia.org/wiki/Dependency_inversion_principle)に従い、全体のライブラリのバージョンをロックするようなグローバルなバージョンを持ちません。

メジャーバージョンアップ、つまり[semver](http://semver.org/lang/ja/)での後方互換性の破壊は嬉しいことではなく、後方互換性を破壊しないと機能追加が出来ない設計上の失敗 - できれば避けたいこととも考えています。

機能の追加はライブラリの仕事と考えればBEAR.Sundayのこれからは、それらをスムーズに統合できるか、[パフォーマンス](https://github.com/kenjis/php-framework-benchmark)は十分か、トラブルシューティングの助けがどれだけできるか、ユーザーの設計上のアイデアを実現できるか、などフレームワークとしての機能の充実になるかと思います。

今年もお世話になりました。来年2016年もBEAR.Sundayを宜しくお願い致します。
AndroidでBox2Dを利用する(2015年)


AndroidでBox2D(物理演算ライブラリ)を利用するには、jBox2dというライブラリがあります。

[jBox2D](http://www.jbox2d.org/)

Box2Dはすごく有名な物理演算のライブラリですが、何故か「Android Box2D」では情報が少なく(リンク切れなど)、また3年くらい前の古い情報ばかりなので、ここで改めて2015年度版として導入方法を書いておきます。

# 環境

・AndroidStudio ver1.4.1
・compileSdkVersion 23
・minSdkVersion 15

# 導入

まずはライブラリを入手します。

[http://grepcode.com/snapshot/repo1.maven.org/maven2/org.jbox2d/jbox2d-library/2.2.1.1](http://grepcode.com/snapshot/repo1.maven.org/maven2/org.jbox2d/jbox2d-library/2.2.1.1)
(※)必ず最新版(といっても2013年ですが^^;)の2.2.1.1をインストールしてください。それ以外のバージョンだと、APIに`FixtureDiff`が無かったりと、正常に動作できませんでした。

入手したjarファイルをAndroidStudioにインポートします。
libsフォルダにjarファイルをドラック＆ドロップして、
`[File]>[ProjectStructure...]>[Depedencies]>[+]>[Libraly Depedencies]`から、
該当のjarファイルをプロジェクトに追加します。

# 実装

SurfaceView上でjBox2Dを展開します。
サンプルプロジェクトをGithubにアップしましたので詳しくはそちらをご参照ください。

[https://github.com/SatoshiImanishi/Test_jbox2d](https://github.com/SatoshiImanishi/Test_jbox2d)

# リファレンス

[公式のドキュメント](http://box2d.org/documentation/)

あくまでjavaで！ということだと[Nature of Code -Processingではじめる自然現象のシミュレーション](http://www.amazon.co.jp/dp/4862462456)という本にjBox2dのことが基礎から詳しく書かれていた気がします。Processingの本です。超おもしろい本です。

おわり
文字列検索アルゴリズムいろいろ


# KMP法
クヌース-モリス-プラット法(Knuth-Morris-Pratt algorithm)とは、文字列検索アルゴリズムの一種。テキスト(文字列)Sから単語Wを探すにあたり、不一致となった位置と単語自身の情報から次に照合を試すべき位置を決定することで検索を効率化するアルゴリズム。

# BM法
ボイヤー-ムーア法(Boyer-Moore String Search Algorithm)は、効率的な文字列検索アルゴリズムの一種。検索文字列(パターン)の前処理を行うので、テキスト上の全文字をチェックする必要はなく、前処理で得た情報を活用してスキップしながら処理していく。一般にパターン文字列が長いほど検索が高速化される。

# 隠れマルコフモデル
隠れマルコフモデル(Hidden Markov Model)は確率モデルの一つである。「システムがパラメータ未知のマルコフ過程である」と仮定し、観測可能な情報からその未知のパラメータを推定する。自然言語処理では、ChaSenで応用される。

# 条件付き確率場
条件付き確率場(conditional random field)は無向グラフにより表現される確率的グラフィカルモデルの一つであり、識別モデル。自然言語処理では、Mecabで応用される。
c++ builder > アプリケーションのオープンで時々エラー > モジュール 'SHELL32.dll'のアドレス 76C03EDD でアドレス 00030002 に対する読取り違反がおきました。 > ::ZeroMemory(&sinfo,sizeof(SHELLEXECUTEINFO)); > 初期化忘れ

```txt:動作確認
C++ Builder XE4
```

### 注意
(追記 2018/11/14)

**以下で使用しているZeroMemoryは最適化で吹き飛ぶため、SecureZeroMemory()の使用が推奨されます。**

- [C++ > SecureZeroMemory() > 最適化で吹き飛ぶ ZeroMemory() の代替](https://qiita.com/7of9/items/53fcfc1124b38cde9da1)

### エラーと対策

ShellExecuteEx()を使って他のアプリケーションを開く処理にて、時々だが以下のエラーが出ていた。

```
モジュール 'SHELL32.dll'のアドレス 76C03EDD でアドレス 00030002 に対する読取り違反がおきました。
```

コードを見ていて、デジャビュに襲われた。

以下と同じ対策で解決した。
http://qiita.com/7of9/items/7b8e8e5ec4111df6dcf5

```
::ZeroMemory(&sinfo,sizeof(SHELLEXECUTEINFO));
```

初期化忘れだった。

他のアプリを扱う処理関連の学習がまだ足りない。
エンジニアが若い世代に追い抜かれないためにするべき3つのこと

アドベントカレンダーも最終日となりました。最低ストックと最高ストックの二冠を達成して一応 CTO の面目は保ちました。これであと2年くらいは席が確保できそうです。

さて、最終日ですが<strike>老害にならないため</strike>エンジニアが若い世代に追い抜かれないための3つのこと、と題してあくまでも自分に言い聞かせる TTD (Things To Do) で締めたいと思います。ストック目当てじゃないので<strike>あえてタグ付けはしません</strike>（→修正: タグ必須でしたｗ）。

# 常に新しい美
経験が豊富になればなるほど、特に成功体験が多い人ほど過去と同じ技術を使い回すものです。これはある程度責任のある地位に就くとリスクヘッジと言う意味でも当たり前の事ですが、さすがに5年、10年も前のプログラミング技術は今では通用しません。言語の仕様だけでなく、フレームワーク、ライブラリ、通信規約、インフラ、などこれらのスタイルは毎日のように新しいものが提案されています。また、そういう地位の人が若い人材に古い技術をさもデファクトかのように吹聴することで負のスパイラルは加速していきます。

「たった一度の失敗で立ち止まるな」とはよく言いますが、その逆も然りで、

**たった数度の成功でも立ち止まるな**

ということです。新しい技術を取り入れること自体が成功体験と考えられるようになりたいものです。

ちなみに「常に新しい美」というのは赤いハイビスカスの花言葉で、ハワイの州花でもあります。あと、僕の誕生日の誕生花らしいです。ほんとどうでもいいですね。

# 若いエンジニアの意見を大事にする
若いエンジニアの提案を頭ごなしに否定するのもよくありません。仮に自分が失敗した同じ経験を歩もうとしていたとしても全否定するのではなく、むしろ貴重な体験として扱わせてあげましょう。ズバリ答えを示すのではなく、あえて失敗の道を歩ませて、その過程を経験させるのも手です。
ただし、勝手にやれと言うのではなく、こっそり見守っておく事が重要。そして仮に成功すれば自分の事のように喜んであげましょう。そうする事で自分の成功体験にもなり、お互い成長できます。

逆に、失敗した時に「ほれ見たことか」というのは厳禁です。老害以前に人として魅力が無いです。

# 謙虚になる
成功体験が多いとついつい勘違いしがちですが「俺スゲー！」的な自意識過剰な状態は続けば続くほど成長を阻害します。ただ、これを客観的に見るのはなかなか難しいです。特に自分(達)の技術力がどれくらいのものなのかというのは比較対象が無いとわからないので、やはり外部との摩擦は必要だと思います。それは勉強会だったり、Qiita などの技術ブログでの交流だったり、オープンソースのコントリビューターとしての活動だったりと、人によって様々ですが、自分の力量を腕試しする場としてそういう世界に飛び込んでいく気持ちはいつまでも持っておきたいですね。

あと、古い技術があってこその新技術です。また、古い技術から学ぶ事も多いです。古い技術を見下さず、新しいことを憶えてもそればかりに固執しない。常に柔らかい頭でいたほうが、技術の吸収力は衰えないものです。


# まとめ
以上、<strike>老害と呼ばれないために周りに根回しする</strike>エンジニアが若い世代に追い抜かれないためにするべき3つのこと、でした。ネタ記事ではないです！

みなさま良いお年を！
R言語 - tf-idfによる文書の特徴抽出

# はじめに
　似たような文書がいくつかあって、それらの違いが何なのかを大まかに把握したいというシチュエーションはありませんか？例えば、とある製品の新機能を紹介した資料があって、昔と今のトレンドにどのような変化があるかを大まかに把握したい、というようなシチュエーションです。このような場合、文書の特徴を抽出する手法の一つである、tf-idf(Term Frequency - Inverse Document Frequency)を利用するとよいでしょう。
　tf-idf は、文書中の単語に関する重みの一種であり、主に情報検索や文章要約などの分野で利用されます。tf-idf を簡単にご説明すると、単語が１つの文書中にどれだけ出現するか、それと、全文書の中で単語が出現する文書がどれだけあるかを計算しています。詳しい計算式は Web で調べてもらえればすぐに見つかると思います。この Tips では、tf-idf を、RMeCab ライブラリの docMatrix ファンクションで利用しています。処理の流れは次の通りです。
![image](https://qiita-image-store.s3.amazonaws.com/0/106773/53bf648b-dc4c-68a4-2dfa-04dbc90df5f3.png)

# tf-idfによる文書の特徴抽出
▼サンプルスクリプト

```R:R
# 日本語形態素解析のライブラリ(注1)を読み込みます
library (RMeCab)
# ワーキングディレクトリを指定します
setwd("ワーキングディレクトリ")
# 除外キーワードリストを読み込みます
e1 <- read.table('Exclude.txt', header=T)
# 文書が格納されているディレクトリを指定します
targetDir <- "文書が格納されているディレクトリ"
# tf-idfで文書の特徴を抽出します
test <- as.data.frame( docMatrix(targetDir,  weight = "tf*idf" ) )
# 除外用フラグを追加します(4列目になります)
test <- cbind(test, c(rep(0, times=nrow(test))))
# キーワード列を複製します(5列目になります)
test <- cbind(test, c(rownames(test)))
# 除外キーワードリストに含まれる単語の除外用フラグをオンにします
test[na.omit(match(e1[,1], test[,5])), 4] <- 1
# 文書「DB9.2」から、頻出度が20以上の単語を抽出します
DB9.2 <- test[ test[,1] > 19 & test[,4] == 0 , ]
# 配置先(x,y)をランダム値から生成してバインドします(6,7列目になります)
p <- cbind(sample(1:nrow(DB9.2)),sample(1:nrow(DB9.2)))
DB9.2 <- cbind(DB9.2,p)
# グラフ描画します
plot(DB9.2[,6],DB9.2[,7],type="n",xaxt = "n", yaxt = "n",frame = FALSE,ann=FALSE)
text(DB9.2[,6],DB9.2[,7],labels =DB9.2[,5],cex=DB9.2[,1]/40)
title(main="DB9.2 ホットキーワード",cex.main=1.4,font.main=4,col.main="red")
```
▼実行結果例
![image](https://qiita-image-store.s3.amazonaws.com/0/106773/9525ef5f-a828-f879-4019-a6c6db5879f1.png)

```R:R
# 文書「DB12.1」から、頻出度が20以上の単語を抽出します
DB12.1 <- test[ test[,3] > 19 & test[,4] == 0 , ]
# 配置先(x,y)をランダム値から生成してバインドします(6,7列目になります)
p <- cbind(sample(1:nrow(DB12.1)),sample(1:nrow(DB12.1)))  # ポジションをランダム決定する
DB12.1 <- cbind(DB12.1,p)                                  # ポジションを結果にバインド(6,7列目)
# グラフ描画します
plot(DB12.1[,6],DB12.1[,7],type="n",xaxt = "n", yaxt = "n",frame = FALSE,ann=FALSE)
text(DB12.1[,6],DB12.1[,7],labels =DB12.1[,5],cex=DB12.1[,1]/40)
title(main="DB12.1 ホットキーワード",cex.main=1.4,font.main=4,col.main="red")
```

▼実行結果例
![image](https://qiita-image-store.s3.amazonaws.com/0/106773/0c37186e-8dba-9308-dcc2-59058a8e90c8.png)

# 注釈
注 1 サンプルスクリプトは、RMeCab 0.9993 を使用しています。
Safariの選択部分をHTMLごとblockquoteで引用するTextExpander用AppleScript



* TextExpanderに「Content: アップルスクリプト」として登録
* Safariで引用部分を選択しておき、テキストエディタ上でAbbreviationを入力して実行
* HTMLタグを含めて引用するのが特徴
	* リンクを反映できる
* Thanks: <a href="http://www.toshiya240.com/2012/07/web-html.html" target="_blank">Happy-Go-Lucky: Webページを HTML のまま引用するブックマークレット</a>


```applescript:blockquote.scpt
tell application "Safari"
	tell current tab of window 1
		do JavaScript "var htmlText = '';
if (document.selection) {
	var c = document.selection.createRange();
	htmlText = c.htmlText;
} else {
	var nNd = document.createElement(\"div\");
	var sel = getSelection();
	if (sel == null || sel == '') {
		htmlText = '';
	} else {
		var w = getSelection().getRangeAt(0).cloneContents();
		nNd.appendChild(w);
		htmlText = nNd.innerHTML;
	}
}
'<blockquote cite=\"' + location.href + '\" title=\"' + document.title + '\">\\n' + htmlText + '\\n' + '<cite><a href=\"' + location.href + '\" target=\"_blank\">' + document.title + '</a></cite>\\n' + '</blockquote>\\n';"
	end tell
end tell
```



## 更新履歴

* 2012-10-31: Google Chrome版として作成
* 2015-12-25: Safari版に修正
Ubuntu 15.10 日本語版をVirutualBox上にインストールする方法(sshできない罠も解消)



# はじめに
Ubuntu15.10の環境が必要になりインストールを試みたのですが、多分8時間位はまってたのでもはや愚痴という感じで投稿してみます(^O^)
ちなみに OSX ElCapitan 10.11.2でやってます。

# 困ったこと
## VagrantでUbuntuを立ち上げるべく、boxをDLしてVagrant upすると必ず下のエラーが出て途中でコケる
```
default: Warning: Connection timeout. Retrying...
```
普段会社でVagrant使ってるから余裕だろうなと思って甘く見てたらとても苦しめられました。

##Vagrantfileの設定でGUIを起動するようにすると、GUIからは普通にログインできる。
それならば、、、と普通にvagrant sshすると下のエラーになる

```
ssh_exchange_identification: Connection closed by remote host
```
いや、ぐぐりまくりました。

## VagrantはあきらめてVirtualboxのisoイメージを[Ubuntu 15.10 日本語 Remix リリース](https://www.ubuntulinux.jp/News/ubuntu1510-ja-remix)からDLしてインストールするも、Mac側からsshできず下のエラーになる

```
ssh_exchange_identification: Connection closed by remote host
```
vagrant sshのときと同じエラーですね。ぐぐると大体IPの許可とか出てきて、それは設定したんだけどな。。。

これまででてきたエラーでひたすらぐぐること数時間。
無駄とは思えない知識が色々身についた上に、
ついにたどり着いた[コメント](https://forums.ubuntulinux.jp/viewtopic.php?id=5566)

![image](https://qiita-image-store.s3.amazonaws.com/0/57284/6f30f0ae-3e76-cbce-c0e2-a4d9a8efd59e.png)


そういえば新卒でエンジニア研修受けた時に、sshサーバーのインストールとかやった記憶が思い出される。まさかsshサーバー入ってないとかなんという罠＼(^o^)／


# あとはsshサーバーインストールするだけ
「Ubuntu ssh」とかで適当にぐぐると出るわ出るわインストール方法

```
sudo apt-get install openssh-server
```
このコマンドでインストールして無事にsshできました。
いまいじくってるVirtualBoxからVagrant box作成しようと思いましたけど、すでにDLしてあるboxにsshサーバーインストールすればそれで以上終了っぽいですね。めでたしめでたし。
っていうかvagrant upでこけたりvagrant sshできないboxをしれっと置いておく罠やめてほしい。。。ほぼ一日はまってたので、この記事が誰かの役に立つことと祈って投稿します。ぐぐったらこの記事出てくれたら最高です。
__fbBatchedBridge (line 1 in the generated bundle) の対処

自分用メモ。

ReactNativeのandroidでpackagerサーバーは動いているのに急にアプリから接続できなくなった場合、デバイス上のサーバーのIP/Port設定が何らかの原因で消えている可能性がある。

アプリのメニューから`Dev Settings`を選んで設定すると疎通するかも。
MySQLの負荷が高くて困ったときにやること

遅刻してごめんなさい！

ここでは、「負荷が高い」とはリソースが枯渇した、あるいは枯渇しそうな状態で、かつそれがシステムに影響を及ぼしている、あるいは影響を及ぼしうる状態を指します。

# 負荷の傾向を見る

snmpdが返す値や `SHOW ENGINE INNODB STATUS` などの値を見て負荷の傾向を見ましょう。
当社では[Cloudforecast](https://github.com/kazeburo/cloudforecast)を使ってこれらの情報メトリクスとして収集しています。
メトリクスを常に計測しておき、通常の状態と異常な状態を可視化しておくことは非常に重要です。

## CPUネックかIOネックか

![graph2.png](https://qiita-image-store.s3.amazonaws.com/0/7335/0561860a-7cd9-4298-72f4-95f3f2538d7e.png)

負荷の原因としてどのリソースが不足しているのかを見極めます
CPUが原因で詰まっているか、IOが原因で詰まっているか、という具合で大別できるのでまずそれを見ましょう。

CPUネックの場合はCPUを100%近く使いきっていることが多いです。
また、複数コアあって一部のコアを使い切っている場合も多いです。
CPU使用率が特定の数で張り付いていた場合、一部のCPUを使いきっている可能性を考えて良いでしょう。

IOが原因で詰まっている場合は多くの場合、CPU使用率のio waitが上がります。0%付近で安定するのが理想的な状態です。
SSDなど高速なストレージを使っている場合はio waitが殆ど上がらない場合もあります。

主にInnoDBを使っている場合はBuffer PoolへのRead/Writeの量を見るという手があります。
IOネックである場合に、Read/Writeのどちらがネックになっていそうか当たりをつけることができます。

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/7335/da59e680-5912-e1c9-9068-8047e1536b71.png)
![graph3.png](https://qiita-image-store.s3.amazonaws.com/0/7335/683c8f9e-2e9b-f198-647d-b247b8e692cf.png)


## クエリの傾向

クエリの改善によって負荷の傾向を改善できる場合があります。

MySQL Handlersをみることでクエリの傾向をある程度推測することができます。
たとえば、Handler Read Rnd Nextが出ているとランダムリードが多いと言うことができるため、フルテーブルスキャンが発生している可能性があると言えるでしょう。
![graph4.png](https://qiita-image-store.s3.amazonaws.com/0/7335/6bef3c1b-39ab-a70d-5a9d-67462ff86d1c.png)


また、Slow Query Logを出しておいて、それを見るのも良いでしょう。
簡単に集計するにはMySQL付属のmysqldumpslowを使うと良いです。

```shell-session
mysqldumpslow -s t /var/lib/mysql/slow-query.log # 時間順
mysqldumpslow -s c /var/lib/mysql/slow-query.log # 回数順
```

slow query logだけでは、N+1問題を発見することは難しいため、より詳細な解析が必要になる場合があります。
その場合はpt-query-digestを使うと便利です。

ほか、常にslow query logを常にtailしてtmuxに流しておくと、問題解決に役立つ場合があります。

## クエリの解析と改善

ボトルネックとなっていそうなクエリを発見したらそれを詳しく調べます。

EXPLAINを活用しましょう。
詳しい話はいろんなところでなされているのであえてここで詳しく触れる必要はないでしょう。

ざっくり、 `Using filesort` や `Using temporary` などが出たら要注意。
また、 TYPEが `ALL` になっている場合はフルテーブルスキャンとなっていますので危険です。

EXPLAINを見ながら、うまくINDEXを活用したり、Slaveで良いクエリはSlaveに追いやったり、不要なソートをなくすなど、クエリを改善します。
可能であればINDEXを追加するなどの対策も行って良いでしょう。（ただし、運用中のシステムの場合、システムの機能に影響を出さないようテーブルロックの時間に注意する必要があります。）

## 最初に戻る

改善を行ったら、負荷の傾向の変化を観察しましょう。
場合によっては裏目に出る場合もあります。また、システムの機能を破壊していないか、アプリケーションのエラーも監視するべきでしょう。
リソースに余裕ができたら対応完了です。やりましたね！

# まとめ

かなりざっくりではありますが、MySQLの負荷が高くて困ったときにやることを書いてみました。
これらは一朝一夕で出来るものではありません。
普段からメトリクスやログを見て、ちょっとした問題でも詳しく調べてみる。といったことを心がけてみて、普段からこれらのエミュレートしておくと良いでしょう。
Java8時代のフレームワーク Spark Framework


# Spark Frameworkとは
RubyのSinatoraというフレームワークにインスパイアされて作られた、シンプルなウェブ・アプリケーション・フレームワークです。
Java8のLambdaをサポートしていて、シンプルに記述することが可能です。

組み込みのWebサーバが内蔵されているため、APサーバを別途建てること無くアプリケーションを実行することが出来る点もイマドキな感じがします。

http://sparkjava.com

ScalaでもScalatraというSinatra Likeなフレームワークが有り、それを使っていた身としてはしっくりくるフレームワークでした。


## 依存関係を追加

では、Saprk Frameworkを使ってみましょう。
今回は、Gradleを使ってプロジェクトを作成します。


```groovy:build.gradle
group 'sample'
version '1.0.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.sparkjava:spark-core:2.3'
}
```

## APIを作成

Spark Frameworkを使ってAPIを作成します。

```java:Hello.java
package sample;
import static spark.Spark.*;

public class Hello {

    public static void main(String[] args){
        get("/hello", (request, response) -> "Hello World");
    }
}

```

## 実行
http://localhost:4567/hello

Hello Worldと表示されました。


Spark Frameworkについても詳しい使い方は、ドキュメントを参照してください。
http://sparkjava.com/documentation.html





## 実行可能jarの作成

Gradleを使って、実行可能jar の作成を行います。

```groovy:build.gradle
buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'eu.appsatori:gradle-fatjar-plugin:0.3'
    }
}

group 'sample'
version '1.0.0-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'eu.appsatori.fatjar'

repositories {
    mavenCentral()
}

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile 'junit:junit:4.12'
    compile 'com.sparkjava:spark-core:2.3'
}

fatJar {
    baseName = 'spark-sample'
    manifest {
        attributes('Main-Class': 'sample.Hello')
    }
}
```


## 実行

```sh
java -jar spark-sample-1.0.0-SNAPSHOT.jar
```

## まとめ

Spark Frameworkを使用すれば、とても簡単にWebアプリケーションを作成することができますね。
いろいろなFrameworkを使ってきましたが、今のところ一番楽に使うことができます。
私が30歳のときに知っておきたかったこと

# はじめに
メリークリスマス。Advent Calendarの今日が最後となりました。

私は現在43歳です。今振り替えると20歳代後半から30歳代がキャリアを積んでいく中でとても大切な時間だったと思います。その期間をどう過ごすかによって40歳代、50歳代が大きく変わってくると思います。振り返りのまとめとして今思うと30歳くらいの私が知っていれば良かったなと思うことを書いてみたいと思います。

# ピークをコントロールする
何かを達成しようとすると限界に近いところまでチャレンジすることが求められます。ただそのチャレンジにも個々に差はありますが限界があります。常に限界に近いところを維持し続けることはできません。

私の場合、結果をできるだけ多くだそうと長い時間働いていました。長い時間働いていたので結果は多く出せはしたのですが、リリース前の大切な時期に体調を崩し大変な思いでリリースしなければらないこともありました。

当時はこんなにがんばっている俺すげーなんて思うこともありましたが、今から思うとピークはいつなのか、そこにピークを持って行くにはどうしたらいいのかが考えられておらず、場当たり的ながんばりだったと思います。開発は長期戦でここぞというピークをどこにするかを見定め、今は手を抜くのか、がんばるのかコントロールし、ピーク時に絶好調の状態を作ることが大切です。

また体を鍛えておくことでピークをコントロールしやすくなります。私は38歳からフルマラソンを始めましたが、それまでは腰痛や倦怠感に悩まされていました。フルマラソンをはじめてからそのような症状はなくなり、もっと早く始めていれば良かったなぁと思っています。

ポイントは**リリース前のようなピークは予め分かっているので、ピークには絶好調の状態にしておくこと**です。

# 自分へ最大の投資をする
ここで言う投資とは時間とお金ですが、時間の投資は[10000時間の法則][link-1]などでも書かれているのでここでは多くを書きません。何かを達成するためには相応の時間の投資は不可欠だということです。
[link-1]:http://matome.naver.jp/odai/2135372857393394401

私は英語がとても苦手だった[^1]のですが、エンジニアであっても英語はできたほうがいいと思い、毎日こつこつラジオを聞いたり、本を読んだり1日1時間程度の勉強を3年間続けました。TOEICのスコアもある程度までは伸びたのですが、伸び悩んでいました。35歳のとき、このままでは英語ができないままになると思い、大枚叩いてプライベート英会話教室に通い始めました。以前よりも時間を費やしていないにも関わらず、あれよあれよといううちに伸びました。当たり前ですが英語は会話する言語ですので会話が大切だったんですね。私はその会話する機会をお金で買ったのです。もっと早く英会話に行っておけば良かったなぁと思っています。

ポイントは**何かを達成するために時間の投資も大切ですが、お金でその効率が良くなるのであれば、お金を使うことも大切**です。

# 定期的に初心を振り返る
30歳代は将来に対する漠然とした不安や大事な選択を迫られるなど、いろいろ悩むことが多い時期だと思います。私も例に漏れずとても悩みました。30歳代中盤からずっと行っているのですが、私の場合一年に一度10日ほど休みを取って、海外一人旅など仕事とは全然関係ないことを行い、その中でぼーっとその年を振り返り、改めてアプレッソに入社した初心を振り返ります。その振り返りの中で次の一年をどのように過ごそうかを決めます。そうすることで自分はどの方向に向かって行っていたのかを定期的に振り返ることができ、漠然とした不安の払拭に繋がったり、納得のいく選択をできたりしました。

ポイントは**定期的にまとまった時間で振り返りをすること**、**振り返りの際には仕事はやらないこと**です。

# 自分の人生、自分で決める
アプレッソに入社して2年が経ったころ、経営状態があまり良くなく、会社の雰囲気も良くなく、社員のモチベーションは高くない状況でした。もちろん私も少なからず影響を受け、モチベーションも上がりづらく、仕事に集中しきれないこともありました。

当時私はある重要なお客様を担当しており、深夜、早朝までサポートさせていただいていました。社内の状況が状況で、がんばっている人はとても少なく、なんで自分だけ・・・と思ったことも多々ありました。そのとき前で書いた振り返りを行い、初心を取り戻すことができました。会社、周りがどんな状況であっても自分には関係なく、アプレッソでやりたかったことをやり続け、自分の糧とすることを決めることができました。その後は精神的にも安定し、仕事に集中することができるようになりました。周りに影響され、自分の人生に良くない結果を残すのはもったいないですよね。

ポイントは**周りがどうであれ自分の人生はやっぱり自分で決めないと**です。

# 解決できそうにない課題は条件や前提を付けてみる
私がトラブルなどで瞬間的に解決できそうにない課題にぶつかったとき、理想的な解決方法を一旦側に置き、何か条件や前提を付けてみて、解決の糸口を探します。

* パフォーマンスを犠牲にすれば解決できるのか？
* 品質を犠牲にすれば解決できるのか？
* スケジュールを取らせてもらえれば解決できるのか？
* お金があれば解決できるのか？
* リソースが調達できれば解決できるのか？
* 何かを予定にあるものを変更すれば解決できるのか？

最初は小さな条件や前提を付けてみて、これがこうなら解決できるのかを自問自答し、最後のほうは大胆なともすると不可能と思われる条件、前提を付け自問自答しています。ほとんどの場合、現実的な条件、前提を見いだすことができ、それらを提案したり、承認してもらったりしています。

ポイントは**解決できそうにない課題にぶち当たったときに脳が「できない」縛りにならないようにすること**です。

# さいごに
私もこの記事を定期的に見て自分への振り返りにしようと思います。また私の経験が皆さまのお役に立てれば幸いです。

[^1]: 高校3年生の英語の通知簿はすべて最低点で追試を受けました・・・
THttpClient の落とし穴（解決編）


これは [Delphi Advent Calendar](http://qiita.com/advent-calendar/2015/delphi) 補欠の記事です。

#落とし穴を埋める

[落とし穴１](http://qiita.com/items/998547937c7d05d34977)と[落とし穴２](http://qiita.com/items/1361696efeb4348f2acc)を、まとめて何とかするクラス TDownloadThread を作りました。

[ソースはこちら](https://gist.github.com/freeonterminate/90c46568010a081805ef)。

これを使うと簡単にダウンローダーが実装できます。
たとえば、こんな感じです。

```delphi
procedure TDownloadManager.Start;
begin
  FListener.StartDownload;

  // 作成と同時にダウンロード開始（FreeOnTerminate = True なので自動解放）
  FDownloader :=
    TDownloadThread.Create(
      FFileName,
      FURL,
      FPort,
      False,
      DownloadProgress,
      DownloadComplete);
end;

procedure TDownloadManager.DownloadComplete(
  Sender: TObject;
  const iSuccess: Boolean);
begin
  // ダウンロード完了
  FListener.EndDownload;
end;

procedure TDownloadManager.DownloadProgress(
  Sender: TObject;
  const iRead, iTotal: Integer;
  var ioAbort: Boolean);
begin
  // 進捗イベント
  FListener.DownloadProgress(iRead, iTotal);
end;
```

実際に使うためには、もっと汎用化して Basic 認証などにも対応したり、非ビジュアルコンポーネント化してあげたら良いと思います。
（と、いいつつ、僕はほぼこのままのクラスを使っていますが）
Coursera Machine Learningの課題をPythonで: ex7-1 (K-meansクラスタリングで画像圧縮)

CourseraのMachine LearningのMatlab/Octaveプログラミング課題をPythonで実装していくシリーズ。
今回は教師なし学習の最初の課題、K平均クラスタリングをやります。

### はじめに：課題の内容

元画像（.png）は、RGBそれぞれ256階調で、1677万色のもの。この色情報を、K平均クラスタリングによって16のクラスタに分類し、16色の画像にするのが課題です。

### PILライブラリのインストール
画像処理にはpillowというライブラリを使うのでインストールしておきましょう。
`pip install pillow`

pillowのドキュメントは[こちら](http://pillow.readthedocs.org/en/3.0.x/)。

### コードの最初：ライブラリをインポート
```py
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
```

### 最初に画像を読み込み
画像データの読み込みには`PIL.Image.open()` を使い、128 x 128 x 3 の3次元のnumpy arrayに読み込みます。これを、`reshape(128*128, 3)`して、クラスタリングに渡せる形の 16384 x 3 の2次元行列に変換(flatten)します。

```py
img = np.array(Image.open('bird_small.png')) # imgは128x128x3 の3次元行列 
img_flat = img.reshape(128*128,3)/255 # 16384x3 の2次元行列に変換
```

### クラスタリングを実施
クラスタリングは、`KMeans.fit(data)`一発でできます。KMeansのパラメータで`n_clusters=16`と、16個のクラスタに分けるよう指定します。

```py
model = KMeans(n_clusters=16).fit(img_flat)
```

### 結果の表示
クラスタリングの結果、各ピクセルがどのクラスタに分類されたかは `model.labels_`（0-15の数字）、各クラスタの重心の値は`model.cluster_centers_`（16x3行列） に格納されています。
これを使って、各ピクセルの値をクラスタの重心で置き換えた行列は、`model.cluster_centers_[model.labels_]`として作成することができます（16384 x 3 の2次元行列）。これを、画像で表示できる形の 128 x 128 x 3 の3次元行列に戻すため、`reshape(128, 128, 3)`します。

```py
img_comp = model.cluster_centers_[model.labels_].reshape(128,128,3)
plt.imshow(img_comp)
```

元画像と結果の画像はこちら。16色に減色されているのがわかります。

![ex7-1.png](https://qiita-image-store.s3.amazonaws.com/0/96897/4331ad5f-e3bd-c596-2a6f-bf2461d9e5ef.png)
![ex7-2.png](https://qiita-image-store.s3.amazonaws.com/0/96897/a9f936bd-df93-da16-0704-57dea1b409e3.png)

### 全コード
全コードはこちらになります。短いですね。

```py
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

img = np.array(Image.open('bird_small.png')) # imgは128x128x3 の3次元行列 
img_flat = img.reshape(128*128,3)/255 # 16384x3 の2次元行列に変換

model = KMeans(n_clusters=16).fit(img_flat)
img_comp = model.cluster_centers_[model.labels_].reshape(128,128,3)
plt.imshow(img_comp)
```

### おわりに
10ウン年前に画像処理を研究する学生だった頃にK平均クラスタリングをC++でスクラッチ実装しましたが、数百行のプログラムにはなっていたような...
ライブラリが整備されて、いい時代ですね。
Android アプリ備忘録

イベント処理
・AndroidAnnotations

HTTP通信
・OkHttp
・HttpURLConnection
・Volley
・org.apache.http(deprecated in Android 5.1)
・AndroidHttpClient(deprecated in Android 5.1)

APIのレスポンス
・JSON
・XML

非同期処理とプログレスバーの書き方
※メインスレッドからネットワーク通信ができないので
・AsyncTask
・ProgressDialog

サポートライブラリ
※新しい API level で追加された機能を古い API level でも使用できる
　android.support.v4とか

Facebook SDK導入
※ここでも英語力が必要になる
・Boltsが必要?

Maven Central Repository は Java の依存関係を管理するための主要なホストです。
社内ハッカソンのすゝめ

[Wantedly Advent Calendar 2015](http://qiita.com/advent-calendar/2015/wantedly)の記事です。

Facebookでは創業時から社内ハッカソンをする文化があるそうです。夜通し行われる社内ハッカソンで、新機能のプロトタイプが作成されているとか。「いいね！」ボタンなど数々の新機能も元々はハッカソンだという話も聞きます。

それにならって、Wantedlyでも毎年12月末にエンジニアも非エンジニアも全員参加のハッカソン、Wantedlythonを開催しています。今年2015年で3回め。投資家を審査委員に招いて、豪華賞品もでるので全力で取り組みます。普段使っていない技術に取り組むエンジニア、ウケ狙いの発表に走るチーム、緻密なビジネスモデルを組み立ててくるチーム、戦術は様々です。

少し話が飛びます。Wantedlyのシステムにとって、2015年はmonolithicな巨大Railsアプリから、micro services的なアーキテクチャへの転換が始まった年でした。マルチプラットフォームのグループチャット[Sync](https://www.wantedly.com/sync)や、外部サイトに埋め込みwidgetを提供する[Open API](https://www.wantedly.com/developers)の公開など、事業戦略の推進に伴い開発スタイル、技術戦略にも変化が必要になりました。

結果として、2015年12月時点でWantedlyは大小様々なサイズのRailsアプリ、Sinatraアプリ、Ruby以外にもnode.jsやpython、Go製のAPIサーバなど、言語にとらわれず、適材適所な技術を用いたシステム構成に変化してきています。

一方で、問題が全くないわけではありません。例えば、開発チーム全体を見渡すと、サーバサイドエンジニアの多くはまだ従来の単一のRailsアプリケーションの開発を続けています。

ということで、今年のWantedlythonでは内部APIの利用を題材にすることにしました。ハッカソンを通じて、Wantedlyシステム全体の新しいアーキテクチャを理解し、体感してもらうことで、今後のプロダクトづくりの発想やシステム開発に活かしてもらうというのが狙いです。

Wantedlyが将来APIを外部公開した場合に、どんな可能性があるのか。ハッカソンの結果が楽しみです。

(この文章は12/9の投稿予定日ではなく、12/25ハッカソンの最中に書かれました。)
VR向けで「HMDを被った時のVR画面」と「VR画面を外からみた画面」の2つを別々に表示する

【下書き】

#VR向けで「HMDを被った時のVR画面」と「VR画面を外からみた画面」の2つを別々に表示する
[【Unity】Unity 5.3で個人的に気になった機能まとめ ](http://tsubakit1.hateblo.jp/entry/2015/12/09/000000)
毎度おなじみテラシュールウェア（ブログ）さんに
>『VR向けで「HMDを被った時のVR画面」と「VR画面を外からみた画面」の2つを別々に表示するAPIも追加』

とあったので試してみました。

1.PC側カメラのTargetEyeをNoneに
2.oculus側に表示したいカメラを追加
（この時点でeditor上では動いてる気がする）
3.showDeviceView = false
※両方にmaincameraタグ付きっぱなので要検証

以上。
ただ、PC側のアス比が変わっておかしいので調査続行。
PC側がx軸に二倍されてる？？？
また、マルチディスプレイもやってみましたが
VRモードと組み合わせると大変なことになったので、ノウハウ貯まるまでやらないほうかがいいかも
SOTA edison 導入メモ


# SOTA edison版 開発のための基本情報のメモ

## マイコン

intelのedisonというマイコンらしいです。
* http://www.buildinsider.net/small/edisongalileo/01

## SW追加

* ソフトウェア等を追加するときはopkgコマンドを使います

```
# opkg install vim
```
などなど

## SDK

* 公式ページで配布されているVstone MagicというSDKを使います。（要会員登録

## SOTA取り扱い説明書

* http://www.vstone.co.jp/sotamanual/

## アクセスポイントの接続

* QRコードでやると楽チン

## IPを調べる

* △のボタン2つ3秒同時長押し、何回か△押して決定ボタンでIP喋る

## sshで接続

```sh
$ ssh root@ipアドレス
Password:edison00
```
c++ builder > TeeChart > 対数スケールでY軸ラベルとY軸タイトルが重なる問題の回避

```txt:動作確認
C++ Builder XE4
```

TeeChartにおいて対数スケールにした時にY軸ラベル(0.0001とか)とY軸タイトル (何かの値[単位])という文字列が重なる。

`LeftAxis->AxisValuesFormat = L"#0.####";`
の時に顕著に重なる。

TChart1のデザインタブで設定をいくつか試したが改善せず。

以下を見つけた。
http://www.newtone.co.jp/support/suqatcd1.html

XE4用のTeeChartでは以下のように対応する。

```Unit1.cpp
target->MarginLeft = 4;
target->LeftAxis->Title->Caption = kLeftAxisTitle + L"\r\n";
```

プロパティがリンクのものといくつか違っていた。

また、リンクでは += などしていたが、こうすると何回かその処理を通るときにまずいので固定値に変更した。

対数スケールと線形スケールの切替えなどする時に複数回通るため。
Rubyでprotectedなクラスメソッドを作る（疑問もあるけど）

ひょんな拍子に、Rubyで`protected`なクラスメソッドを作る機会が生じましたが、ちょっとハマる箇所が出てきましたので、メモ程度に書き残しておきます。

# Rubyの`protected`
C++やJavaの`protected`と違って、Rubyの`protected`は、「`self`がそのメソッドを定義したオブジェクトの場合」だけメソッドを呼べる、という意味合いです。@tbpgr さんの[こちらの記事](http://qiita.com/tbpgr/items/6f1c0c7b77218f74c63e)に詳しいです。

## クラスメソッドを`protected`にすると
つまり、クラスメソッドを`protected`にすると、「クラスオブジェクト」自体が`self`になる場面、すなわちそのクラスやサブクラスのクラスメソッド内、あるいは特異クラスの中からしかアクセスできなくなります。呼べる箇所はかなり限定的です。

# どんなときに使う？
なかなか使う機会がないようにも思えますが、`new`を`protected`にしてみると、外部からは別のクラスメソッドでインスタンスを取るしかない、というクラスを作れます。もちろんそれだけであれば`private`でもいいのですが、継承関係などを考えていると`protected`でうまくいく、という例がありました（ただし、これでせいとうなのかはちょっと判断がついていません）。

# 実際にしてみる方法
Rubyでメソッドのアクセス権を変える方法としては、大分すれば2つあります。

* `public`、`private`、`protected`を引数なしで使って、状況を切り替えたうえでメソッドを定義する
* これらのメソッドにシンボルを渡して、そのメソッドだけ可視性を切り替える

クラスメソッド用に、`private_class_method`や`public_class_method`が用意してありますが、需要がないからか`protected_class_method`は用意してありません。そして、`new`などは親クラスの側で用意してあるので、`protected`な雰囲気の中で再定義するわけにも行きません。ということで、`class << self; protected :new; end`というように特異クラスをオープンすることになりました。

# 疑問～子クラスのが呼べるけど、どうなの？
ただ、これを書くために改めて調べていたのですが、やはり疑問が出てきました。抽象的な親クラスにいくつかの子クラスがある状況で、親クラスで`protected`したとはいえ、子クラスのクラスメソッドを親クラスのクラスメソッド内から呼べてしまっているのです。これは意図した動作なのか、はたまたたまたま動いているだけなのかわからず、気持ち悪い状態に陥っています。

```rb:問題のコード

class AbstractParent
  class << self; protected :new; end
  def self.some_method
    # 実際には状況によって子クラスは入れ替わる
    klass = Child1
    obj = klass.new # エラーにならない
    # 後略
  end
end

class Child1 < AbstractParent; end
class Child2 < AbstractParent; end

```
Dart x StageXL : No Html , No CSS で Webサイトを作成する

No Html、 No CSS で、Webサイトを作りつつ。Material Design 的な　コンセプトを取り入れる。

皆さんは、どう考えますか。

SEO対策の問題はあるかも知れません。

しかし、私はこの潮流に賛成です。
検索エンジンのクローラーの性能が向上して、このようなサイトを分析できるようになってくれる事を期待します。

大手検索エンジン会社の古びたテクノロジーのために、古びたスキームに従うなんて、不憫ですよね。怠慢に他なりません。くたばれGoogle

### Röckdöt for Dart

https://github.com/blockforest/rockdot-generator
http://rockdot.sounddesignz.com/template/

![スクリーンショット 2015-12-25 14.30.16.png](https://qiita-image-store.s3.amazonaws.com/0/54192/9f3a260d-5ab8-e991-865c-551f29957c9b.png)


## StageXL を利用したサイト

http://www.wish-baker.com/?m=1#DEAR%20DART!/1/3/3/6/2/1

![スクリーンショット 2015-12-25 14.40.08.png](https://qiita-image-store.s3.amazonaws.com/0/54192/a49470bd-eb83-58db-d84f-b46bd4c059ea.png)



# StageXLを使ってみよう。

これらのサイトの基盤となっているStageXLを使用してみましょう。

http://www.stagexl.org/
https://github.com/bp74/StageXL
https://github.com/bp74/StageXL_Samples

## Sampleを動かしてみよう。
```
$ git clone https://github.com/bp74/StageXL_Samples
$ cd StageXL_Samples/
$ pub get
$ pub serve
```

Dartiumで、http://localhost:8080 にアクセスすると、以下のようなページが表示されます。

![スクリーンショット 2015-12-25 14.47.27.png](https://qiita-image-store.s3.amazonaws.com/0/54192/da45ca29-16b9-1968-54a5-93051926d0d4.png)

![スクリーンショット 2015-12-25 14.47.46.png](https://qiita-image-store.s3.amazonaws.com/0/54192/2825209b-831d-2221-6fd6-5efa441662d1.png)

![スクリーンショット 2015-12-25 14.48.04.png](https://qiita-image-store.s3.amazonaws.com/0/54192/73dd098f-3782-3884-a820-97a24830d3a1.png)




<br>
<br>
-------
Kyorohiro Work
http://kyorohiro.strikingly.com/
年末年始休暇向け課題図書（2015-2016）

# はじめに
来年のWebアプリ開発に向けて読んでおいてほしい書籍をリストアップしておきます。
独断と偏見に満ちてるので、「これ面白くなかった」「役に立たねぇ」など休み明けにコメントください！
Amazonに作った、[課題図書リスト](http://www.amazon.co.jp/gp/registry/wishlist/15UA0NP4K8EIB/ref=cm_wl_list_o_1?)より抜粋してます。


# 読み物系


・[Webを支える技術 -HTTP、URI、HTML、そしてREST](http://www.amazon.co.jp/dp/4774142042/ref=wl_it_dp_o_pC_nS_img?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I2TMU4OBAMWVF1)
まずは全体像を抑えますか。

・[アジャイルサムライ−達人開発者への道](http://www.amazon.co.jp/dp/4274068560/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I1ZF681SVI8FPF)
スクラムで開発したいね。


・[情熱プログラマー ソフトウェア開発者の幸せな生き方](http://www.amazon.co.jp/gp/registry/wishlist/15UA0NP4K8EIB/ref=cm_wl_huc_title)







# フロントエンド系
バックエンドとの連携はRESTをイメージしています。画面はXAMLやらthymeleafなどのテンプレートに依存せず、HTML5+CSS3で行きたい。バックエンドのサービスを起動しなくてもある程度は動くようにしたい。

・[JavaScript 第6版](http://www.amazon.co.jp/dp/4873115736/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I2UC8Q5YUMPB4Y)
Javascriptはとても柔軟ですよ。


・[AngularJS アプリケーションプログラミング](http://www.amazon.co.jp/dp/4774175684/ref=wl_it_dp_o_pC_S_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I2TF9J9QZT1RE2)
フロント側のフレームワークはこれにするか。


・[Bootstrapファーストガイド―CSS設計の手間を大幅に削減!](http://www.amazon.co.jp/dp/4877833609/ref=wl_it_dp_o_pC_S_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I2WW7L7O7BLX3C)


・[シングルページWebアプリケーション ―Node.js、MongoDBを活用したJavaScript SPA](http://www.amazon.co.jp/dp/4873116732/ref=wl_it_dp_o_pC_S_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I2582TAM7P45U6)
JavaScriptベースでフロントからバックエンドまで作る。やってみたい。野望。




# バックエンド系
SpringBootを使って品質・生産性を上げたい。簡単にアプリづくりができるが、その基盤技術は理解する必要がある。

・[はじめてのSpring Boot―「Spring Framework」で簡単Javaアプリ開発](http://www.amazon.co.jp/dp/4777518655/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=ISUQ04UZGDLP7)
薄い本です。情報まとめてくれてます。一通り学べます。


・[Java EE 7徹底入門 標準Javaフレームワークによる高信頼性Webシステムの構築](http://www.amazon.co.jp/dp/4798140929/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I3A5M17SGIXJMM)
JPAあたりを中心に。


・[理論から学ぶデータベース実践入門 ~リレーショナルモデルによる効率的なSQL ](http://www.amazon.co.jp/dp/4774171972/ref=wl_it_dp_o_pC_S_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I2OZVLE7QGAY10)


・[SQL実践入門──高速でわかりやすいクエリの書き方](http://www.amazon.co.jp/dp/4774173010/ref=wl_it_dp_o_pC_S_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I2SJM1OKMX0IM7)


# 要件定義系
・[成功する要求仕様 失敗する要求仕様](http://www.amazon.co.jp/dp/4822282910/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=IR0T9WIW7LSLY)


・[[改訂第2版] [入門+実践]要求を仕様化する技術・表現する技術 -仕様が書けていますか? ](http://www.amazon.co.jp/dp/4774142573/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&colid=15UA0NP4K8EIB&coliid=I1E6OP4VWY557B)


# さいごに
勉強し続けることって大切ですね。「継続は力なり」ですが、その前に「継続は力のいることなり」ですね。
Alfresco 5 : Google Docs の連携をインストール後に解除する方法

オープンソースのファイル管理システム《 **Alfresco** 》の運用メモです。
あくまでメモです。

Alfresco 5 では、インストール時にGoogle Docsとの連携を許可してしまうと、このように『 **Googleドキュメントで編集する** 』といったメニューが表示されてしまいます。

![2015-12-25_11h51_10.png](https://qiita-image-store.s3.amazonaws.com/0/49156/10a96700-a504-3f8d-364c-9d5df27920d2.png)

![2015-12-25_11h52_07.png](https://qiita-image-store.s3.amazonaws.com/0/49156/74d59393-55bf-611a-65f8-0982d3b0405f.png)

このメニューを表示させなくするには、``alfresco-global.properties`` に ``googledocs.enabled`` という項目を追加してGoogle Docsとの連携を解除する必要があります。

ファイルのバックアップを取得。

```bash
$ cd /opt/alfresco-5.0.d/tomcat/shared/classes/
$ cp -p alfresco-global.properties alfresco-global.properties.20151225
```

続いてファイルを編集します。

```bash
$ vi /opt/alfresco-5.0.d/tomcat/shared/classes/alfresco-global.properties

下記を適当なところに追加します
googledocs.enabled=false
```

あとはAlfrescoを再起動すれば完了です。

```bash
$ /etc/rc.d/init.d/alfresco restart
```

きちんとメニューが消えます。

![2015-12-25_12h00_45.png](https://qiita-image-store.s3.amazonaws.com/0/49156/123925ed-b2eb-c7bf-2298-b8a3601ccbad.png)

![2015-12-25_13h08_56.png](https://qiita-image-store.s3.amazonaws.com/0/49156/d1dfdce3-f40a-4558-e878-c513f9190314.png)

作業完了です。
トリックアートに着想を得た立体表示

###こんにちは. 慶應大の井阪建と申します. 
　[Delphi Advent Calender 2015](http://qiita.com/advent-calendar/2015/delphi)のラストを務めさせていただきます. このような記事を書きながら過ごすクリスマスは最高ですね. 
　普段研究では, Delphiをメイン言語として使っています.  特にこだわりなどがあるわけではなく, [luxidea](http://qiita.com/luxidea)こと中山さんに勧められて使い始めました. 仕様などは詳しくないので, ボロが出ないようあまり細かいことは触れないようにしたいと思いますw
###さて, みなさんの中で[このような](http://fav.me/d7hwjis)トリックアートをご覧になった方はいらっしゃいますでしょうか?
　壁からキャラクタの腕が飛び出してきているように見えますよね. 初めて見たときはびっくりしました. これは永井秀幸さんという若手（24才, 僕よりも若い）のアーティストの作品です. このトリックアートの原理は, アナモルフォーシスと呼ばれています.[^1] 簡潔にいうと, ある1点から見たときの3次元空間像を, そこから見たままに2次元平面に写し取ってしまおう! という考えです.
　ある特定の1点から見ると立体的に見えるという仕組み, ということは・・視点をずらしてしまうと不自然に見えてしまうわけです. それなら, 立て掛けたスケッチブックを2枚のディスプレイに置き換えて, ユーザの視点を追跡し, 適切に見えるようコンテンツの描画をリアルタイムに微調整してやれば, 運動視差効果も相まって, 裸眼でそのコンテンツを立体的に見せることができるのでは？という着想に至りました.

###以下, 実装について述べます. 環境はRad Studio XE7となります.

![fig4.png](https://qiita-image-store.s3.amazonaws.com/0/106509/21e33a64-5044-a5e0-f141-12e643793688.png)

　上図が手法の基本的な流れになります. まず, Viewport3D上に直交した2枚のPlaneと対象のModel3Dを配置します. このバーチャル空間を, 現実世界で直交に配置されたディスプレイに描画することを考えます. 上述したアナモルフォーシックな描画はどのようにすれば実現できるでしょうか? 
　Camera座標を頂点とした視野錐台の後方面（以下, スクリーンとします）を, Planeの位置, 角度, 大きさと同一に揃えてやれば, そのCamera座標に対応する現実空間の座標からディスプレイを見たときに適切に表示されそうです. バーチャル空間ではPlaneの位置は通常固定ですから, スクリーンの位置も固定されるわけです. このような透視変換はCamera位置が変化すると, 視野錐台の形状が左右上下で不均等になることから, off-axis投影と呼ばれています.

![fig5.png](https://qiita-image-store.s3.amazonaws.com/0/106509/0fc3bea5-37df-58bd-cc19-e574eb5a689d.png)

　Delphiでは, System.Math.Vectorsの中に透視変換を行うCameraのプロパティが宣言されています. ここでスクリーンのパラメタを弄ろうと考えたのですが, 読み取り専用の値に設定されており, 書き換えることができません. そのままではカメラの移動と共にスクリーン位置も動いてしまいます. Cameraが動いたら, 反対向きに同じ分だけスクリーンを動かしたいわけです. そこで, クラスヘルパで書き込み可能な値にしています. こうすることで, 上図のようにCamera位置が変わると, 壁面と床面の描画は変化せず, Model3Dの描画だけ変化するという結果が得られます. 実装にあたって, [luxidea](http://qiita.com/luxidea)ことサイバー和尚様に非常にお世話になりました.
　余談ですが, 最初, 通常の透視変換をしたあと, 得られた画像をPlaneが元の矩形に戻るように射影変換するという, とてもムダなことをしていましたorz

###さらに, ユーザの視点移動に伴ってカメラ位置を変化させます. 
　OpenCVの顔追跡ライブラリを使ってWebカメラから, ユーザの顔の位置と大きさを取得し, その値でCamera位置を制御することで, リアルタイムに描画更新を行っています. [こちら](https://youtu.be/r8LBF13NdCk?t=20s)に結果動画がありますのでご覧ください.
　光源を動かして, 影の形状を変化させるということもしたかったのですが, 現環境ではシェーダの取り扱いがいかんせん難しい. ということで, 今回はLight, Model3D共に不動という設定になっております. 初期テクスチャはAutodesk Mayaの方でModel3DにベイクしたものをRad Studioで読み込んでいます.
　先日, 学内の技術展示会 [KEIO TECHNO-MALL 2015](http://astavision.com/contents/report/1644) に本システムを出展したところ, 悪くない感触を得ることができました. 

###この手法の弱みとして, 両眼視差情報が欠けていることが挙げられます.
　冒頭で書きましたが, アナモルフォーシスというのはあくまでも1点から見たとき, つまり単眼で見たときに最大の威力を発揮します. ですので, 片目で見るとより立体的に見えます. ただ, ユーザに片目を意図的に瞑ってもらうというのは, 体験としてどうかと思うわけです.
　そこで, 両眼視差の欠損を補う方策を色々考えています. 詳しくは来年3月以降に公開される私の修士論文をぜひご参照ください. 学外向けにもPDFが公開されるはずですので. 
　それではみなさま, 良いお年をお過ごしください. 

[^1]: レオナルド・ダ・ヴィンチの時代からあったりします
[MATLAB] colorbar

%MATLAB colorbar

function [ colormapi ] = interp_cm( colormap, n )
%interpolate colormap
%   Detailed explanation goes here

cms = size(colormap);
x = [0:1/(cms(1)-1):1];
xi = [0:1/(n-1):1];

colormapi = interp1(x, colormap, xi);

end

%Example:
%cm = interp_cm(colormap('jet'),24);
%colormap(cm);
AWSに請求の件で電話したい場合

初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。 - Qiita
http://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694

上記の記事で以下のようなくだりがありましたが、AWSでは請求関連の問い合わせは普通に日本語をしゃべれる人と電話できるので、その方法を念のためメモしときます。

> 5分待っても、レスがないので、立て続けに3回くらい、お問い合わせメールをおくりました。本当にすみませんでした。ちなみに、どこかにAWSの問い合わせ電話があったので、そこにかけたら、外人の方が出てくれまして、日本人いますか？と訪ねてみたのですが、日本人はおらず、メールしてと言われたりもしました。

1. 初めにマネジメントコンソールにログインします。
　

2. 画面の言語を「日本語」にします。(必須ではないですが)
![1.png](https://qiita-image-store.s3.amazonaws.com/0/79518/843c0675-3d8b-d795-3044-6692736e0117.png)
　
3. 画面右上の「サポート」メニューから「サポートセンター」を選択します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/79518/1018b86e-a61e-2c35-1c91-0e405ab5ad6c.png)
　
4. 「ケースの作成」をクリック
![3.png](https://qiita-image-store.s3.amazonaws.com/0/79518/7878c3e6-d334-99c9-6cb7-e2e37f406236.png)
　
5. 必要事項を記入

- 問い合わせ内容は**「アカウントおよび請求サポート」**
- 「サービス」は「請求に関して」カテゴリは「お支払に関する問題」とか
- お問い合わせ言語は**「日本語」**
- 連絡方法に「電話」
- 電話番号を入力 (市外局番から入力。**但し先頭の「0」は入力しない。**)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/79518/19724629-080e-d814-d1de-322acd6b2b8a.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/79518/c61a4f06-5699-e918-f599-fdbde41ec316.png)

最後に「送信」をクリックすると、上で入力した電話番号にシステムから電話がかかってきて、AWSサポートにつながります。なお「AWSサポートからのお知らせ」に大きく書いてありますが、**システムからの電話は非通知なので、非通知着信拒否してるとつながりません。一時的に許可するなどして下さい。**

おしまい。
TypescriptでD3.jsを使う時の最小限のセットアップ

D3.js をTypeScriptで使う際に必要になる必要最小限のセットアップ手順。
D3以外のライブラリについても同様にセットアップの参考になると思います。

以下の手順を実行した結果が https://github.com/yohm/minimal_ts_d3 にあるので参考にしてください。

## 対象読者

- Typescriptに興味があり、試してみたい人

## ソフトウェアバージョン

- typescript 1.7.5
- tsd 0.6.5
- d3 3.5.12

## 事前準備

typescriptのコンパイラ、http-server、tsdをインストールする。

```
npm install -g typescript http-server tsd
```

typescriptを導入すると、tscコマンドが使用できるようになる。
http-serverは別のもの（例えばSinatraなど）でも問題無い。

[tsd](https://github.com/Diullei/tsd) というのは、typescriptの型定義ファイル（~.d.ts）を管理するパッケージマネージャー。
rubygemでいうところのbundlerのようなもの。
[DefinitelyTyped](http://definitelytyped.org/tsd/) のリポジトリからコピーしてきてもよいが、tsdを使った方が管理しやすい

### tsdの使い方

tsdを使って型ファイルをインストールすると、インストールされたファイルがtsd.jsonに記録される。tsd.jsonはbundlerでいうところのGemfile.lockに相当するもの。

型定義ファイルの検索

```
tsd query d3
```

型定義ファイルのインストール

```
tsd install d3 --save
```

`--save`オプションをつけるとtsd.jsonを更新する。（bundlerでいえば、Gemfileを編集して`bundle install`することに相当）
インストールされたファイルはtypings以下に保存される。

```
$ tree .
|-- typings
    ├── d3
    │   └── d3.d.ts
    └── tsd.d.ts
```

`tsd.d.ts` ファイルにインストールしたtsdファイルへの参照（ここではd3.d.ts）が入っている。
自分のコードからはtsd.d.tsを参照するようにしておけば良い。

typingsファイルはリポジトリに入れる必要はないので、`.gitignore` にtypingsディレクトリを追加しておく。
別の場所でcloneした後は、`tsd install` とすると必要なファイルがtypingsにインストールされる。

## htmlとtsの準備

index.htmlとhello.tsファイルを以下のように準備する。

```index.html
<!DOCTYPE html>
<meta charset="utf-8">
<style>
</style>
<body>
<script src="//d3js.org/d3.v3.min.js"></script>
<script src="/hello.js"></script>
```

```hello.ts
/// <reference path="typings/tsd.d.ts" />

d3.select("body").append("p").text("Hello world!");
```

htmlからはhello.tsをコンパイルして生成されるJSファイル（hello.js）を参照するようにする。
hello.tsの最初の行には、型定義ファイルへの参照を書く。

`tsc hello.ts` コマンドでhello.tsをコンパイルするとhello.jsがつくられる。
hello.tsを監視して、更新されるたびにコンパイルするためには `tsc -w hello.ts` を実行する。
hello.jsはhello.tsからの精製物なので、gitの管理下には入れないように .gitignoreに*.js を追加する。

`http-server` でサーバーを起動後、 http://localhost:8080 にアクセスするとページを確認できる。
CentOS7でfishを入れると競合でDockerをインストールできない。解消はDocker1.10

[docker-engine.rpm push the fish completion in the wrong place · Issue #16668 · docker/docker]

初めてbash以外から乗り換えてDockerも覚えようとしたらこれか！

```zsh

# repo登録は割愛
yum install fish
fish
yum install docker-engine

.
.
.

Dependencies Resolved

==================================================================================================================================================================
 Package                                       Arch                          Version                                      Repository                         Size
==================================================================================================================================================================
Installing:
 docker-engine                                 x86_64                        1.9.1-1.el7.centos                           dockerrepo                        8.2 M
Installing for dependencies:
 audit-libs-python                             x86_64                        2.4.1-5.el7                                  base                               69 k
 checkpolicy                                   x86_64                        2.1.12-6.el7                                 base                              247 k
 docker-engine-selinux                         noarch                        1.9.1-1.el7.centos                           dockerrepo                         21 k
 libcgroup                                     x86_64                        0.41-8.el7                                   base                               64 k
 libsemanage-python                            x86_64                        2.1.10-18.el7                                base                               94 k
 policycoreutils-python                        x86_64                        2.2.5-20.el7                                 base                              435 k
 python-IPy                                    noarch                        0.75-6.el7                                   base                               32 k
 setools-libs                                  x86_64                        3.3.7-46.el7                                 base                              485 k

Transaction Summary
==================================================================================================================================================================
Install  1 Package (+8 Dependent packages)

Total size: 9.6 M
Installed size: 41 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test


Transaction check error:
  file /usr/share/fish/completions/docker.fish from install of docker-engine-1.9.1-1.el7.centos.x86_64 conflicts with file from package fish-2.2.0-3.2.x86_64

Error Summary
-------------


```

リリース待つかzshにするかな

[docker-engine.rpm push the fish completion in the wrong place · Issue #16668 · docker/docker]:https://github.com/docker/docker/issues/16668