OmniAICreator/Qiita-1.07M huggingface dataset:
[RoR]railsにgoogle map を表示する

#概要
RubyOnRailsにgoogle map のjqueryプラグインの導入したときの手順
RubyOnRailsにはGoogle-Maps-for-Railがあるけど、オプションの設定方法などが、いまいちわからりずらかった。
そこでjqueryのプラグインのjquery.gmap3を使いました。

#環境
Ruby   2.2.2
Rails    4.2.3

#google mapを表示する
##1.必要なjsを取得、格納
githubから[jquery.gmap3](https://github.com/bumberboom/jquery.gmap3)をDL(Download ZIPから取得)

DLした中からjquery.gmap3.jsを取り出し、プロジェクトDir/vendor/assets/javascripts/に格納

##2.プロジェクトにinclude
プロジェクトDir/app/views/layouts/application.html.erbにGoogleMapAPIをincludeする

```lang:application.html.erb
<script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false"></script>
<%= javascript_include_tag "application" %>
```

プロジェクトDir/app/assets/javascripts/application.jsにjquery.gmap3.jsをincludeする

```lang:application.js
//= require jquery
//= require jquery_ujs
//= require twitter/bootstrap
//= require turbolinks
//= require_tree .
//= require jquery.gmap3
```
＊twitter boot strapを導入しているとjquery部分が先に記述されている

##3.google mapを表示したいviewを編集

```lang:view
<div id="gmap3"></div>
<script>
  $(function() {
    $('a[href="#map-tab"]').on('shown.bs.tab', function(e) {
      $("#gmap3").gmap3({
        address: '表示したい住所',
        zoom: 16,
        navigationControl: true,
        mapTypeControl: true,
        scaleControl: true,
        markers: [{
          address: '表示したい住所(マーカー)',
        }]
      });
      $.gmap3.panTo($("#gmap3"), {address: '中心にしたい住所'});
      google.maps.event.trigger(gmap3, 'resize');
    });
  });
</script>
```
＊緯度経度でも設定できるが、google mapで取得した緯度経度を設定すると、何故かずれてしまうので、住所で設定している

twitter bootstrap のタブ中にgoogle mapを配置すると、タブ変更時に巧く描画できない。
そこで、タブをクリックされた際に、google mapがrisizeされるようにjsを記述する。
Clojure clojure.data.csv の使い方

CSV の読み書きをするライブラリ。パースした結果はベクタのリストになる。

GitHub
https://github.com/clojure/data.csv
ドキュメント
http://clojure.github.io/data.csv/

```clj
(ns clj-data.csv)

(require '[clojure.data.csv :as csv])

(let [filename "usa-states.csv"
      csv (slurp filename)
      rows (csv/read-csv csv)]
  rows)

(let [filename "usa-states.csv"
      csv (slurp filename)
      rows (csv/read-csv csv)]
  (doseq [row rows]
    (let [code (first row)
          name (second row)]
      (println (str code " => " name)))))

(let [filename "test.ltsv"
      csv (slurp filename)
      rows (csv/read-csv csv :separator \tab)]
  (map (fn [row]
         (str (first row) " => " (second row)))
       rows))

(with-out-str
  (csv/write-csv *out* [["foo" "bar"]
                        ["baz" "qux"]]))

(csv/write-csv *out* [["foo" "bar"]
                      ["baz" "qux"]
                      ["I'm" "pen"]]
               :separator \tab)

```

サンプルコードとサンプルデータ
https://github.com/kyanny/playground/tree/gh-pages/clj-data.csv
[RoR]railsにbootstarpを導入したときの手順

#概要
RubyOnRailsにCSS/jsフレームワークであるbootstrapを導入したときの手順

#環境
Ruby   2.2.2
Rails    4.2.3

#参考
- [RailsにBootstrapデザインを適用する](http://qiita.com/kamizuno/items/5c3ecceea5aa78e25058)

- [gem 'twitter-bootstrap-rails'　のgithub](https://github.com/seyhunak/twitter-bootstrap-rails)

#前提
Railsアプリのプロジェクトを作成済み、scaffoldも実施ずみ

#導入
##1.必要なgemのインストール
プロジェクトDir/Gemfileを開き、以下を修正、追加

```lang:Gemfile
# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby
# less
gem 'less-rails'
# JavaScript engine
gem 'execjs'
# bootstrap
gem 'twitter-bootstrap-rails'
```

Gemfileを修正後、ターミナルで

```lang:cmd
bundle install  --path vendor/bundle
```
を実行

##2.Railsプロジェクトに必要なファイルをインストール

ターミナルで

```lang:cmd
rails generate bootstrap:install less
```
を実行

##3.Railsプロジェクトにbootstrapを適用させる
アプリのレイアウト(プロジェクトDir/app/views/layouts/application.html.erb)に適用させる

ターミナルで

```lang:cmd
rails generate bootstrap:layout application fluid
を実行
```
 fluidでレスポンシブデザイン。

scaffoldで作成された各viewに適用させる
ターミナルで

```lang:cmd
rails generate bootstrap:themed XXX
```
を実行
XXXには適用させるmodel名
encodeURIComponent を使ってエスケープされない文字もエンコードしたいとき


### encodeURIComponent を使ってURLエンコードをしたいけど、エスケープされない文字もエンコードしたいときの方法です。

* `encodeURIComponent`アルファベット、10進数字、- _ . ! ~ * ' ( ) はエスケープしないので下記の方法で対応。  

<br>
#### メソッド
例: . (ドット)と、 - (ハイフン) も URL エンコードしたい場合、`/[.-]/g` を指定するとよいです。

```js
function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[.-]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}
```

### 使い方
```js
str = "hoge-abcd.foo-efg";
res = fixedEncodeURIComponent(str);
console.log(res);
// "hoge%2dabcd%2efoo%2defg"
```

<br>
>
参考文献 : [MDN encodeURIComponent()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent)
encodeURIComponent は次を除く全ての文字をエスケープします : アルファベット、10進数字、- _ . ! ~ * ' ( )
Dockerfile

これ使いこなせないなら生lcxで良いような、、、

[Docker user guide](https://docs.docker.com/engine/userguide/)抜粋

```lang:Dockerfile
# This is a comment
#命令        命令文
FROM ubuntu:14.04
MAINTAINER myname <myname@exsample.com>
RUN apt-get -qq update
RUN apt-get -qqy install ruby ruby-dev
RUN gem install sinatra
code
```
- FROM  
Docker に対してソースとなるイメージ
- MAINTAINER  
イメージ管理人  
- RUN  
イメージの中で実行するコマンド
- ADD  
ローカルファイルシステムのファイルやディレクトリをDockerイメージにコピー
ローカルにあるmyfile.txtをイメージの/myfile.txtにコピー  
`ADD myfile.txt /`  
コンテキスト内のみ可能
- CMD  
コンテナーの実行コマンド(docker run)  
`CMD ["/usr/local/bin/run.sh"]`を記述しておくと
`docker run -i run_image`で起動すると/usr/local/bin/run.shスクリプトを実行
`docker run -i run_image /usr/local/bin/run.sh`と同じ
- ENTRYPOINT  
コンテナーの実行コマンド
- WORKDIR  
作業ディレクトリの指定
- ENV  
環境変数の指定
- USER  
実行ユーザーの指定
- EXPOSE  
ポートのエクスポート
- VOLUME  
ボリュームのマウント

# build
`docker build -t="(所属)/(名前):(タグ)" .`
Dockerfile を . で指示
ハッシュへの代入方法のBenchmark

# 背景
チームのRubyコードの中で、
ハッシュへの代入方法が統一されてないことに気がついた。
以下の二通り

```rb
param.store('user_id', 10)
param['user_id'] = 10
```

統一したいね、できればパフォーマンスいいほうを採用したいね。
と。

# いざ実験

```rb
require 'benchmark'

param = {}
param2 = {}
Benchmark.bm 10 do |r|
  r.report "Hash#store" do
    for i in 0..1000000
      param.store("Hello world #{i}", i)
    end
  end
  r.report "Hash#[]=" do
    for i in 0..1000000
      param2["Hello world #{i}"] =  i
    end
  end
end
```

# 結果

```
                 user     system      total        real
Hash#store   1.250000   0.060000   1.310000 (  1.304982)
Hash#[]=     1.210000   0.060000   1.270000 (  1.275874)
```

ほぼ変わらない。。微々たる差だが、早いみたいなので、Hash#[]=を採用しようと思う。
個人的にもRuby初心者で他の言語触ったことがある人でも直感的に分かるので、
こっちの書き方のほうが好きだ。

```rb
param['user_id'] = 10
```

# 編集 & 追記
scivolaさんからコメントいただきまして、コードを修正しました。
RubyとSlackでライフハックならぬコミケハック

年の瀬ですがみなさんいかがお過ごしでしょうか。  

私は冬コミに1日目2日目と参加してきて足と腰と肩がバッキバキになりました。運動不足はダメですね。
この記事をご覧の方で参加されている方はどれくらいいらっしゃるでしょうか。

# 戦場の有明
コミケに参加する上で気になるのは、やっぱり目的とする品を購入できるか否かですよね。
自分みたいに同人誌を買いに回りに回った後で企業ブースに行ったりしていると、当日分が完売していないだろうかと心配になります。企業でなくとも人気サークルさんのところも怖くなりますね。

# 販売情報を素早く得たい
というわけで、Twitterのリアルタイム性を利用して、「在庫状況に関係ありそうなツイート」をSlack経由で通知するスクリプトを勉強がてら書きました。
能動的にツイートを見に行かずとも通知が来るので余裕が出るかなーと思います。

これを思った時には既に待機列中だったので、ConnectBotでUbuntu14.04の入った自宅マシンに繋いでいじいじしてました。
メモ書きレベルですが何かの参考になれば幸いです。

# 実装
## SlackにPostする
まずはターゲットとなるチャンネルへのエンドポイントを作ります。
[こちら](http://qiita.com/satoshi03/items/14495bf431b1932cb90b)の投稿にしたがって作成し、`Webhook URL`をメモしておきます。

さて、このエンドポイントを叩くわけですが、勉強も兼ねて直接コーディングします。

今回は[こちら](http://qiita.com/pinori/items/a0ded83cbd4680408966)の投稿を参考に書きました。

```ruby:slack_client.rb
require 'net/http'
require 'json'

class SlackClient
  def initialize(url)
    @url = url
  end

  def post(text)
    data = { "text" => text }
    request_url = @url
    uri = URI.parse(request_url)
    Net::HTTP.post_form(uri, { "payload" => data.to_json })  
  end
end
```

## Twitter APIを叩く
Slackの次はTwitterのAPIにアクセスします。
Slackと異なり、TwitterAPIの利用にはOAuth認証が必要ですので、事前に[アプリ](https://apps.twitter.com)作成によってトークンを取得しておきます。
コーディングはGemに頼ってしまいましょう。

```
$ gem install twitter
```

```ruby:twutil.rb
require 'twitter'

token = {
  consumer_key: 'xxxx',
  consumer_secret: 'xxxx',
  access_token: 'xxxx',
  access_token_secret: 'xxxx'
}

@rest = Twitter::REST::Client.new(token)
@stream = Twitter::Streaming::Client.new(token)
```

見たとおり、Twitterのアプリ管理から作成したトークンをベタ書きしただけのファイルです。

pryなんかでrequire_relativeしてすぐに叩けるので、APIをいじったり動作確認したいときによく使っています。

## メイン部分を書く
とりあえずStreamingAPI使ってこんな感じに。

```rb
require_relative 'twutil'
require_relative 'slack_client'

@target_sns = %w(foo bar)
@slack = SlackClient.new("https://hooks.slack.com/services/xxxx/xxxx/xxxx")

begin
  puts "Connecting to streaming server..."
  @stream.user do |st|
    next unless st.kind_of?(Twitter::Tweet)
    next if st.retweeted_status?
    next unless @target_sns.include?(st.user.screen_name)
    @slack.post(st.url.to_s) if st.text =~ /\d限|限数|わずか|[減少]|残り|完売|売り?切れ?/
    puts "#{st.text} from @#{st.user.screen_name}"
  end
rescue EOFError
  puts "Connection lost at #{Time.now}"
  retry
end
```

Slackのインライン展開に任せて、正規表現で関係ありそうなワードとマッチすればそのURLを通知しています。
また、販売状況以外にも、`/色紙|ポスター|抽選/`などとすれば、サークルさんの色紙・ポスター抽選の結果も見逃しを防止できるかと思います。
最後はEOFErrorでコネクションが失われることがあるので例外処理を入れています。

## 使う
コミケ会場の回線は安定しているとは限らないので、コネクション消失時に停止しないようにtmux上で走らせていました。
マナーモードにした携帯を胸ポケットに入れておけばﾌﾞｰﾌﾞｰ震えていい感じに。

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/7d069c89-6c08-7693-205e-6b28860787f3.png)

# 最後に
3つのファイルを作成しましたが、個人的には`~/fragment`配下に置いています。その名の通り、プロジェクトというほどの規模でもないスクリプトを書き捨てたりしていますが、こういうものはみなさんどのようにしているのか気になります。
あとコードとか英語とか雑なので適切な形など教えて頂けると喜びます。
ダブリのある条件分岐はマッピングできるかもよ

例えば、以下のような２重のswitchがあるとします。

```js
function whoDoesWhat_long(a, b) {
  switch (a) {
    case 'worker':
      switch(b) {
        case 'morning':
          console.log('get ready for working!');
          break;
        case 'evening':
          console.log('work hard!');
          break;
        case 'night':
          console.log('sleep well for tomorrow!');
          break;
      }
      break;
    case 'student':
      switch(b) {
        case 'morning':
          console.log('sleep till noon...');
          break;
        case 'evening':
          console.log('have breakfast');
          break;
        case 'night':
          console.log('play video games');
          break;
      }
      break;
    case 'fish':
      switch(b) {
        case 'morning':
          console.log('swim slowly');
          break;
        case 'evening':
          console.log('swim quickly');
          break;
        case 'night':
          console.log('swim very slowly');
          break;
      }
      break;
  }
}

whoDoesWhat_long('worker', 'evening');  // work hard!
```

 

まず、主語が何であるかによって分岐します。次に、時間帯によって分岐して、行動をalertします。
そんな２重の条件分岐があるとします。


でも、これってマッピングできるなあと気づいたのでメモします。

 

結論から言うとこんな感じ。

```js

var status = {
  'worker'  : 0,
  'student' : 1,
  'fish'    : 2
};
var time = {
  'morning' : 0,
  'evening' : 1,
  'night'   : 2
}
var text = [
  ['get ready for working!', 'work hard!', 'sleep well for tomorrow!'],
  ['sleep till noon...', 'have breakfast', 'play video games'],
  ['swim slowly', 'swim quickly', 'swim very slowly']
];
function whoDoesWhat_short(a, b) {
  var who = status[a];
  var what = time[b];
  console.log(text[who][what]);
}

whoDoesWhat_short('worker', 'evening'); // work hard!

```

 

まず、主語と時間帯を数値化するオブジェクトを作っておきます。それぞれを数値化したら、それらを利用して連想配列からテキストを選択します。

以上です。

 

ちょっと回りくどいようですが、こっちの方が読みやすくコードも短いです。
さらに、あとから項目を追加することもカンタンです。
kuromoji.jsでmecab-ipadic-NEologdを使う


JavaScriptだけで形態素解析ができる[kuromoji.js](https://github.com/takuyaa/kuromoji.js)で、[mecab-ipadic-NEologd](https://github.com/neologd/mecab-ipadic-neologd)を使いたいなーと思って、試してみました。

# 結論
* 辞書生成はできた
* 辞書サイズが大きすぎてメモリ馬鹿食いする
* 読み込みに時間がかかる

サーバサイドでの使用ならいいかもしれませんが、クライアントサイドでの利用は難しいかなと思いました。
サーバサイドなら素直にmecab使うほうが楽な気はしますね。

# 辞書生成方法
## 追加辞書の用意
[ここ](https://github.com/neologd/mecab-ipadic-neologd/tree/master/seed)から追加辞書をダウンロードして解凍します。
ここではmecab-user-dict-seedを追加しようと思います。

```zsh
$ xz -dkv mecab-user-dict-seed.*.csv.xz
```

kuromojiでは辞書のもととなるcsvがEUC-JPの必要があるので変換します。
ここでは適当に`neo.csv`としておきます。

```zsh
$ nkf -e mecab-user-dict-seed.*.csv > neo.csv
```

## 辞書の生成
kuromojiをcloneして、npm installしておきます。

```zsh
$ git clone https://github.com/takuyaa/kuromoji.js.git
$ npm install
```

生成した`neo.csv`をscripts/input以下に配置して、`scripts/build-dict.js`を編集して`neo.csv`を読み込むようにします。


```js:scripts/build-dict.js
var tid_files = [
    "Adj.csv",
    "Adnominal.csv",
    "Adverb.csv",
    "Auxil.csv",
    "Conjunction.csv",
    "Filler.csv",
    "Interjection.csv",
    "Noun.adjv.csv",
    "Noun.adverbal.csv",
    "Noun.csv",
    "Noun.demonst.csv",
    "Noun.nai.csv",
    "Noun.name.csv",
    "Noun.number.csv",
    "Noun.org.csv",
    "Noun.others.csv",
    "Noun.place.csv",
    "Noun.proper.csv",
    "Noun.verbal.csv",
    "Others.csv",
    "Postp-col.csv",
    "Postp.csv",
    "Prefix.csv",
    "Suffix.csv",
    "Symbol.csv",
    "Verb.csv",
    "neo.csv"  // 追記
];
```

gulp build-dictを実行して辞書を再生成します。
mecab-user-dict-seedは非常にサイズが大きいので、メモリの上限を変えています。
(少し起動方法が強引ですが)

```zsh
$ node --max-old-space-size=4096 node_modules/.bin/gulp build-dict
```

`dist/dict/`のファイルが更新されていれば完了です。
あとはプログラムに読み込ませて使いましょう。

# 参考
* [kuromoji.jsの辞書に単語を追加する](http://qiita.com/muraken720/items/dc67c8dc32138be7b3f8)
たまりにたまった画像フォルダなんかをランダムに拾って思い出すワンライナー

たまりにたまって何があるのかわからないフォルダとか、ありますよね？
そういうフォルダを整理する際、1から1つずつ見るのも面白くないので、
**ランダムにいくつかピックアップして**見てみる、というのはいかがでしょうか？
毎日ちょっとずつ読むだけなら負担も軽いでしょうし、蓄積した情報の思わぬ有効活用に繋がるかもしれませんよ！

と、いうわけで特定のフォルダ以下のファイルを5つ同時に開くワンライナーを書いてみました。 :arrow_down:

```bash
$ yes 'start $(/usr/bin/find 問題の画像フォルダのパス | shuf -n 1)' | head -n 5 | bash
```

※私は開発以外は主にWindowsを使う野郎なんで、今回は[MSYS2](https://msys2.github.io/)を使うことにしました。
Macな方は`start`を`open`に、`/usr/bin/find`を普通に`find`に、`shuf`を`gshuf`（要`coreutils`）に書き換えればよいのではないでしょうか？
（`open`の仕様を知らないのですが、やっぱり`open`のほうがもっと便利に出来たりするのかな。。。）

`start`コマンドの仕様なのか、パスにスペースが含まれていたりすると上手く動かないみたいなんで、もうちょっと工夫が必要そうですね。。。
適宜`start`以外のコマンドで開くのも良いのではないかと。

# 参考

[Linux - コマンドとコマンドをつなぐ糊 - Qiita](http://qiita.com/greymd/items/32d4dcb6fff4832f1fc5)
[シェル芸 - 【たのしいな】様々なコマンド達を何も考えずにつないで遊ぶ - Qiita](http://qiita.com/greymd/items/a4ecf8e70f11eb1e5f72)
入門- IoT まわりの Amazon Web Services

# まとめると・・・
　IoT周りで世を騒がしていると評判の Amazon Web Services(以下 AWS ) について少し調べてみました。
・Amazon Kinesis は、膨大な同時実行数に対応できるScalableな一時保存場所。
・Amazon Lambda は、AWS内で Event Driven でコードを実行する環境。

# Amazon Kinesis とは？
　データレコードの大量のストリームをリアルタイムで収集し、処理する。Amazon Kinesis は、さまざまなデータストリーミングの問題解決に使用できるだけでなく、一般的にはデータのリアルタイム集計にも使用可能。集計データはその後でデータウェアハウスや MapReduce クラスターに読み込むことができる。用途としては、センサーデータやログデータなどの同時実行数が膨大な通信向けの一時的なデータ保存。以下のような制限がある。
・データレコードはストリームに追加されてから 24 時間のみアクセス可能
・データ(Base64 エンコーディング前)の最大サイズは、最大1MB
・デフォルトのシャード制限は50シャード
など

###シャード制限について
　シャードとは、Amazon Kinesis ストリームの基本的なスループットの単位。1シャードは、1 MB/秒のデータ入力と 2 MB/秒のデータ出力の能力を提供。1つのシャードは 1 秒当たり最大 1,000 件の PUT レコードをサポート。一般的な使い方としては、Amazon Kinesis に送られたデータを、24時間以内に、RESTAWS CLIなどを使って、DynamoDB や REDSHIFT などに格納＆分析する。Amazon EMR クラスタを使用して Amazon Kinesis stream を直接読み取って
処理することも可能。

# Amazon Lambda とは？
　AWS インフラストラクチャを使用してコードの実行を代行するコンピューティングサービス。実行できるコードは、Node.js、Java((Java 8 互換)、および Python。キャッチできるイベントは、Amazon DynamoDB 内のテーブルの更新、Amazon S3 バケット内のオブジェクトの変更、Amazon CloudWatch ログへの出力、Amazon Simple Email Service へのメールの着信、Amazon SNS からの通知の送信、Amazon Kinesis ストリームへのメッセージの着信、Amazon Cognito でのクライアントデータ同期イベント、およびモバイルアプリケーション、ウェブアプリケーション、その他のウェブサービスからのカスタムイベントがある。用途としては、Kinesis で受け取ったデータを Lambda でまとめて処理するなどが考えられる。Amazon Kinesis に関してはプルイベントモデルになっていて、Kinesis にデータ格納後ではなくて Amazon Lambda が定期的に polling して、取ってきたデータ複数を Amazon Lambda で処理する仕組みとなっている。以下のような制限がある。
・リクエストあたりの最大実行時間は 300秒
・Invoke リクエスト/レスポンス本文のペイロードサイズは6MB
など


# その他
　Amazon Drone, Amazon echo, Amazon Dash などサービスは、2lemetry(IoTプラットフォーム提供サービスプロバイダ)の買収によって加速化している様子。つまり、デバイス側も押さえているということ。


#リファレンス
[Amazon Kinesis サービス](http://aws.amazon.com/kinesis/)
[Amazon Kinesis とは](http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/introduction.html)
[Amazon Kinesis FAQ](https://aws.amazon.com/jp/kinesis/faqs/)
[Amazon Kinesis の制限](http://docs.aws.amazon.com/ja_jp/kinesis/latest/dev/service-sizes-and-limits.html)
[AWS Lambda Developer Guide](http://docs.aws.amazon.com/lambda/latest/dg/lambda-dg.pdf)
[AWS Lambda とは](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)
[AWS Lambda FAQ](https://aws.amazon.com/jp/lambda/faqs/)
[AWS Lambda の制限](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html)
[AWSではじめよう、IoTシステム構築](http://www.slideshare.net/AmazonWebServicesJapan/awswebinar-awsiot)
[AWS初心者向けWebinar AWSでBig Data活用](http://www.slideshare.net/AmazonWebServicesJapan/awswebinar-awsbig-data)


#ディスクレーマー
　Tipsに記載された内容は、情報の提供のみを目的としています。したがって、本Tipsに用いた内容は、必ず読者ご自身の責任と判断によってご利用ください。Tipsの活用の結果について、Tips作成者はいかなる責任も負いません。本Tipsは Amazon 社の製品サポートとは無関係ですので、本Tipsを元に Amazon 社サポートに問い合わせることはご遠慮ください。なお、本Tipsにおいて示されている見解は、Tips作成者の見解であって、Amazon 社の見解を必ずしも反映したものではありませんのでご了承ください。本Tips記載の情報は、2015 年 12 月 30 日時点のものを掲載していますので、ご利用時には、変更されている場合もあります。
XMLDB - XML文書に含まれるタグ数のカウント方法まとめ



# 概要
　Oracle Database(注1) の XMLDB に関する Tips をご紹介します。バリデーションチェックなどの用途で、XML文書に含まれるタグ数をカウントすることがある場合、以下のクエリで確認することができます。

```SQL:XMLDB
SELECT XMLCast(XMLQuery ('count(//*)' PASSING <列名>
RETURNING CONTENT) AS NUMBER) cnt FROM <表名>;
```

# 解説
　XMLデータとして、次の3件のデータが INSERT 済みの場合、以下の実行結果となります。XML文書単位でのタグの総数が出力されます。

```SQL:テストデータ例
'<tag0>100</tag0>' ,'<tag0><tag1>100</tag1></tag0>' ,'<tag0><tag1>100</tag1><tag2>円</tag2></tag0>'
```

```SQL:実行結果例
SELECT id , XMLCast(XMLQuery ('count(//*)' PASSING xml
RETURNING CONTENT) AS NUMBER) cnt FROM xmltab;
            ID        CNT
    ---------- ----------
             1          1
             2          2
             3          3
```

# ご参考
　上記のSELECTを実行する前提となるテーブル作成などのスクリプトは次の通りです。

```SQL:XMLDB
--テーブル作成
CREATE USER userctx IDENTIFIED BY userctx DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE TEMP;
GRANT CONNECT , RESOURCE TO userctx;
CONNECT userctx/userctx 
CREATE TABLE xmltab (id NUMBER PRIMARY KEY, xml XMLTYPE); 
INSERT INTO xmltab VALUES (1, XMLTYPE('<tag0>100</tag0>')); 
INSERT INTO xmltab VALUES (2, XMLTYPE('<tag0><tag1>100</tag1></tag0>')); 
INSERT INTO xmltab VALUES (3, XMLTYPE('<tag0><tag1>100</tag1><tag2>円</tag2></tag0>')); 
COMMIT; 
--XML インデックス作成
CREATE INDEX xmlidx ON xmltab (xml) INDEXTYPE IS XDB.XMLINDEX PARAMETERS('PATH TABLE pathtab (TABLESPACE users) PATH ID INDEX pathid (TABLESPACE users)VALUE INDEX value_idx (TABLESPACE users) ORDER KEY INDEX order_key(TABLESPACE users)') NOPARALLEL;
--コンテキストインデックス作成
EXECUTE CTX_DDL.CREATE_SECTION_GROUP('psg','PATH_SECTION_GROUP'); 
EXECUTE CTX_DDL.CREATE_PREFERENCE('jv_lexer','JAPANESE_VGRAM_LEXER');
CREATE INDEX xmlidx2 ON xmltab (xml) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER jv_lexer SECTION GROUP psg TRANSACTIONAL') NOPARALLEL;
--XML インデックスのパス表にコンテキストインデックス作成
CREATE INDEX xmlidx3 ON pathtab (VALUE) INDEXTYPE IS CTXSYS.CONTEXT PARAMETERS('LEXER jv_lexer SECTION GROUP psg TRANSACTIONAL') NOPARALLEL;
--オプティマイザ統計情報の収集
EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'USERCTX',TABNAME => 'XMLTAB',no_invalidate => FALSE,CASCADE => TRUE);
```

# 注釈
使用している Oracle Database のリリースは、11g Release 2 です。
JavaScriptのsplitとjoinで不純物探知

stringクラスのsplitとarrayクラスのjoinを使えば、不純物探知ができるよねというお話。

 

以下のコードを例に取ります。

```js
var hello = "hellohellohellohellohelloohello";

var exceptForHello = hello.split('hello').join('');
if(exceptForHello !== '') {
  console.log('Not pure! ' + exceptForHello + ' is founded!');
}
```

最初にhelloがたくさん並んだ文字列があります。一見、すべてhelloに見えますね。

 

次に、split('hello').join('')をしています。これは文字列を配列化して、さらに文字列に戻しています。
配列化の際に、splitの引数で文字列を区切る事ができます。


その区切り文字としてhelloを指定すると、結果的にhelloを削ぎ落とすことができます。

 

'hello,hello,hello'

たとえば上記の文字列にsplit(',')とすると、

['hello', 'hello', 'hello']となります。

これは、カンマを捨てたことに等しいです。

 

この仕様を利用したのが、先述のhelloの削ぎ落としです。これよって、不純物のみが抽出されます。その上でjoinを使って配列要素を連結します。これが不純物の文字列です。
この文字列の長さが０ならば、つまり１文字もなければ不純物は無いということになります。


splitを多重にかけることによって、複数条件で絞り込むこともできますね。
ただし、文字列置換のような不足の事態は起こり得ますが…。

 

参考：
このテクニックは、競技プログラミングのこちらの回答を見て発見しました。感謝です。
[http://abc023.contest.atcoder.jp/submissions/401872](http://abc023.contest.atcoder.jp/submissions/401872)
terminalの「コンッ」って音を消す方法

会社忘年会のビンゴでMac Book Air 11inch メモリCPUカスタムを頂いたので色々設定中です。

Macのターミナルで、何もコマンド入力していない状態などで←キーを押すと、
「コンッ」って音が鳴る。怖い。
コマンドヒストリーからコマンド探してて↓キーを連打してて、最終コマンドまで来ちゃって続けてキー連打すると、
「ココココンッ」って音が鳴る。怖い。

![terminal.png](https://qiita-image-store.s3.amazonaws.com/0/107499/312ea1eb-c3f6-f177-ae56-40dd8e2d78ef.png)
メニュー -> ターミナル -> 環境設定 -> プロファイル -> 詳細 -> オーディオベル
のチェックを外す

これで怖い思いしないで済みます。
モジュールメソッドから同じモジュールのメソッドを使う


メソッドをモジュールメソッドとして使いたい
includeしてでなく、関数っぽく使いたいパターン。


```rb

module Hoge
	def self.hoge
		p "hoge"
	end
end

Hoge.hoge # hoge
```

こんなの。

module作る時とかこっちの方がわかりやすい気がして気に入ってます。



でも、これはできない。できそうなのに。

```rb

module Hoge
	def self.hoge
		fuga
	end

	def fuga
		p "fuga"
	end
end

Hoge.hoge # undefined local variable or method `fuga' for Hoge:Module (NameError)
```

Hoge::hogeは特異メソッド。  
Hoge#fugaはインスタンスメソッド。


Hoge::hogeの中でselfを見ると、Hoge。

なので、インスタンスメソッドとしてのHoge#fugaは呼べない。
同じ空間においてあげたら呼べる。


```rb

module Hoge
	class << self
		def hoge
			fuga
		end

		def fuga
			p "fuga"
		end
	end
end

Hoge.hoge # fuga
```

さらに、こうするとインスタンスメソッドとモジュールメソッドを同時に定義する。

```rb

module Hoge
	module_function
	def hoge
		fuga
	end

	def fuga
		p "fuga"
	end
end
```
C言語を頑張る！　03

こんにちは！えりにゃんです。

ちょっと先に進みまして、繰り返し文の作り方に入りました！
forとかwhileとかよく聞くやつ、やっと何者か理解できた！ｗ

#for文の練習
今日も変わらず大学の課題でっすヾ(*´∀`*)ﾉ

##もんだい
キーボードから値を入力し、１から入力された値までの奇数の和を求めて出力するプログラムを作成しなさい。ただし、for文を使うこと。
また、0 や負数が入力された場合は合計値を0と表示すること。

##作ってみた！
```lang:キーボード入力と和の計算
#include<stdio.h>

int main(void)
{
    int i,num,sum=0;
        printf("入力値：\n");
        scanf("%d",&num);

    for(i=1;i<=num;i=i+2){
            sum += i;
    }
    printf("合計値：%d\n",sum);
    return 0; 
}
```


#while文の練習
もういっちょヾ(*´∀`*)ﾉ

##もんだい　２
整数を入力し、入力された整数の数だけ「\*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。
但し、0または負の値が入力された場合は、「\*」は表示せず、改行のみを表示すること。

##作ってみた！２
```lang:*いっぱい並ぶやーつ
#include<stdio.h>

int main(void)
{
    int i=1,num;
    scanf("%d",&num);
    while(i<=num){
      printf("*");
      i++;
    }
    printf("\n");

    return 0;
}
```

##ひとこと
奇数の計算をどうやるかがすごい迷った。。
i%2==1  とかでも作れるのかな？


#教えて下さいー！
「もっとこうしたほうがいいよ！」ってアドバイスがあれば
ぜひぜひ教えて下さいませヾ(´∀`)ﾉ♪

明日は早起きして冬コミ3日目いくぞー！　な、えりにゃんでしたヾ(*´∀`*)ﾉ♪
データセンターで作業する時の気をつけたいこと

# 概要
最近クラウドが流行していてなかなか行く機会がないですが、
全く行かないわけでもないし今後新人君が入ったら伝えておきたいので汎用的なメモ。
以下は複数人でサーバを新規で複数台設置と、OSを入れて他の拠点からNW疎通確認までを想定。

# 準備
- 作業目的と作業範囲の明確化
データセンター作業は何かとしんどいので、
何が必須作業で何がオプション扱いで何時までに何をすべきでどう判断予定なのかを事前に共有しておく。

- 社内に作業連絡
  - いつ、どこのラックに(ラック内のサーバ一覧)、何をするのかを情報共有しておく

- 入館/搬入申請

- 集合について
  - [ ] 集合日時はいつか
  - [ ] 集合場所はどこにするのか
  - [ ] 交通手段
     - 現地集合するのか、どこかからタクシーや業者を使って一緒に乗るのか。

# 持参物
## 必須
 - [ ] 写真付き身分証明証（免許証）
 - [ ] PC
 - [ ] OSのイメージディスク
 - [ ] 携帯
 - [ ] チーム内の緊急連絡先
 - [ ] ベンダーの連絡先
 - [ ] サーバのシステム構成図・ユーザガイド
    - メモリの動作モードの確認とか
 - [ ] LANケーブル
   - サービス用とリモートマネジメント用で色分けしておくと便利
   - ケーブルはきちんとツイストペアのものを使う
 - [ ] テプラ
    - サーバのフロントだけじゃなくて後ろにも貼っておくと便利
    - LANケーブルに着けたいときはテープ同士しか接着しない特殊なテープを使うと糊が残らないから良いかも
 - [ ] マスク

## オプション
 - [ ] 携帯充電器
 - [ ] 引越し屋さんが持ってそうなゴム手袋
   - レールやケージナットで手を切りやすいから一人で１０台以上の設置とかはあると嬉しい
 - [ ] ドライバー
   - DC内でも貸出あるけど先端が磁石とかだと作業しやすい
 - [ ] ネジザウルス
   - 前任者が棚板等のネジを電動ドライバで強力に締めててネジを外すときにドライバでやるとネジ穴が潰れて外せなくなることがあるため
 - [ ] VMサーバ/スイッチングハブ
   - ２つを持参しておくと持参PC上のVMに対して複数のサーバがPXEBootやyumを使いたいときに便利
 - [ ] 養生テープ

# 作業時
- ラック内の電源キャパシティを確認してから１台ずつ電源を投入すること
    - 電源は大抵A系統とB系統あるから電源を冗長化するなら必ず両方から取ること
- サーバのパーツを触るときは金属に触れて放電してから触る
- サーバの設置は出来ればラックの前後に人を配置して設置時に他のケーブルや機器と接触しないよう確認しながら作業する
- 電源・LANケーブルの抜線は必ずサーバ側から抜く
- LANケーブルを結線するときは必ず同一セグメントからpingを打ちながらやる
- 設置後はラック内のサーバとユニット番号を確認してメモしておく
    - オフィスに戻ったらラック図を反映しておく
2016年に実現してほしいWebGLあるいはBlender周りの妄想

WebGLやBlenderのアドベントカレンダーの記事を読んでいて思いついた妄想です。
基本的に他力本願かつ無茶なものが多いですので、ブレインストーミングのつもりでお楽しみください。
***

##Electron製のゲームエンジン及びエディタが登場
UI及び３ＤビューはWebGL描画。
ブラウザ、Android、iPhoneでも動作。
レンダラ、物理エンジンがプラグイン形式で切り替え可能。
TypeScriptで書かれている。
ゲームオブジェクトもTypeScriptからの利用を前提に設計されている。

##Electron製のBlenderライクなモデリングソフトが登場
UI及び３ＤビューはWebGL描画。
レンダリングは基本はWebGL。プラグインでCycles等も可能。
もちろんブラウザ上でも動く。
前述のゲームエンジンとの相性が良い。むしろ一体化してほしい。
（WebGLのレンダリング結果がそのままゲームエンジンで動く！）
Blenderライクなのは筆者の願望。

##GLSLマテリアルなるものが提唱される
BlenderのマテリアルをGLSLで再現したようなもの。
（GLSLマテリアルという名称もBlender由来）
前述のゲームエンジン、モデリングソフトをはじめとしてWebGL全般で使用可能。
標準規格も誰かによって決められる。
筆者は実現方法までは考えていない。

##頂点シェーダの投稿サイトとフラグメントシェーダの投稿サイトが合体したような投稿サイトが登場
しかもこのサイトの投稿から標準規格に対応したGLSLマテリアルが生成でき、jsファイルにできる。
ここで生成したjsファイルからWebGLのテクスチャを生成できる。

##上記サイトを応用したゲームエフェクト投稿サイトが登場
WebGLでプレビューできるゲームエフェクト投稿サイト。
完全に筆者の願望。

##メジャーなコンポジット系のソフトがWebGL出力をサポートするようになる
特にAviUtl等のフリーソフトがサポートすることで、個人ＨＰでもWebGLのアニメーションが使われるようになる。

##ＲＰＧツクールＭＶにWebGLによる３Ｄ描画のプラグインが登場
戦闘や立ち絵がＭＭＤになったりする。
「すごいけど重すぎ」と話題になる。
※発展著しいので既にあるかもしれません。

##Three.jsのC++版が登場
あるいは既に存在するライブラリのどれかが完成。
Android、iPhoneで動作させるのが目的。

##GOMLがCSSに対応
構造とスタイルの分離、スタイルのカスケードが可能に。
思いつきです。

##有名どころのWebGLライブラリが次々と巨大プロダクトに採用されてライブラリ界隈が殺伐としてくる
しないでほしい。
買収をゴールとしたベンチャーというやつですね。怖いですねー。

##WebGLエンジニアの専門化が進む
ライブラリを作る人、ゲームエンジンを作る人、コンバータを作る人、レンダリング技術の人など専門化が進む。
専門に特化した勉強会、スクール、イベントが開催される。

##ワロタロ制作のWebGL製シューティングが完成
ちょー面白いと話題に（泣
　

***

それでは皆様、良いお年を～
環境移行:Xcode4.6から7.2へ

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2015/12/30/ios_dev_xcode46_72/)のほうで更新します。

Macを新しくしました。

今回、Xcodeは4.6から7.2に一気にアップグレードする事となりました。
基本は、元々下記のようなディレクトリで作業していたので、これを丸ごと新しいマシンに持っていって、Test.xcodeprojを起動しました。

`Test
+--Test
+--Test.xcodeproj
`

すると、プロジェクトのアップグレードを求められたので、そのまま許可。
いくつか問題が出ましたが、下記の通り対応しました。

## 問題1:#importエラー
下記のようなエラーが出ました。
`Use of undeclared identifier 'GL_SRC_ALPHA'`

OpenGLの#importが元々書いて無かったようで、追加したらエラー解消されました。
何故今までエラーが出なかったのか…。

## 問題2:ボタンの枠が無くなった
どうやら、iOS7からデザインが変わってしまったようで、そのままだとボタンの枠が無くなり、ラベルとパッと見同じものとなってしまいました。

下記の追加start〜endの記述を追加すれば、白枠を追加する事が出来るようになりました。

```objc++:Test.m
UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = CGRectMake(0, 0, 100, 20);
[btn setTitle:@"title" forState:UIControlStateNormal];	// 有効な時のタイトル設定
[btn setTitleColor:[UIColor colorWithRed:(1.0 green:0.0 blue:0.0 alpha:1.0] forState:UIControlStateNormal];
btn.tag = 1;		// タグ設定

// 追加 start ----------
btn.layer.borderColor = [UIColor whiteColor].CGColor;
btn.layer.borderWidth = 1.0f;
btn.layer.cornerRadius = 10.0f;
// 追加 end ------------

[btn addTarget:viewController action:@selector(selTouch:) forControlEvents:UIControlEventTouchUpInside];

[view addSubview:btn];	// Viewに追加
```

## その他
他にも個人的に色々設定しました。

### シミュレータサイズ
しかし、シミュレータのサイズが大きすぎて色々とテストに不都合発生。

`Simulator->Window->Scale、50%`

と、するとかなりコンパクトになりました。

### Xcode細かい設定
Xcode->Preferences...->Text Editing
　1.Editing
　　ShowのLine numbersにチェックを入れる
　　　左端に行数が表示されます
　2.Indentation
　　Prefer indent usingをSpacesからTabsに変更
　　　インデントをスペースではなくタブになります

これでひとまず開発進められそうです。
Docker基本コマンド

# Dockerイメージ入手
`docker pull イメージ名:タグ名(バージョン)`
タグ名(バージョン)を指定しない場合はイメージの最新版が落とされる
デフォルトのレジストリは、[Docker Hub](https://hub.docker.com/) の公開レポジトリ
# Dockerイメージ一覧表示
`docker images`
> デフォルトで、/var/lib/docker  

#Dockerコンテナの作成と実行
`docker run オプション イメージ名:タグ名 コンテナで実行するコマンド`
多分これが一番使う
`docker run -t -i ubuntu:14.04 /bin/bash`
## オプション
- フォアグラウンドの実行  
`-iは標準入力`  
`-tは擬似端末の割り当て`
- バックグラウンドの実行  
`-d`  
## コンテナを命名して実行
`docker run オプション --name コンテナ名 イメージ`
命名していないコンテナはランダムな名前が割り当て、命名したほうが後が楽？

## 例)
### 今回追加したイメージをフォアグランドで実行させる
`docker run -it ubuntu`
root@*(ID)*:/#とプロンプト表示

# Dockerコンテナの停止
`docker stop (ID)`
# Dockerコンテナの削除
`docker rm (ID)`
# 停止して削除
`docker rm -f (ID)`

# Dockerイメージ消去
`docker rmi イメージ名:タグ名 (ID)`
## noneの一括削除
```
docker rmi `docker images | grep none | awk '{print $3}'`
```
# 動いてるコンテナ確認
`docker ps`
# 全てのコンテナの確認
`docker ps -a`

# イメージ作成
`docker commit コンテナID 名前`
1．detach
`CTRL-p+CTRL-q `
2．保存(commit)
`docker commit -m "コメント" コンテナID 名前`
3．確認
`docker images`
4.attach
`docker attach コンテナID`

# 他
Imageが大きくなってきたらexportしてimport.
AUFSあたりが最新のみに
自作OS（1） GRUBからの起動

# はじめに

作りかけては断念し、というのを繰り返していたので、記録を兼ねて、記事にしていきます。

# 環境

今更、ブートローダーから書くのもだるいし、今時のOSっぽくないしということで、GRUBを使って起動させます。これで、アセンブリ言語を使う箇所が減らせます。

さらに、よくあるOS入門系の記事は、x86をターゲットに32bitOSを作っていますが、これも今時っぽくないので、x86_64をターゲットにしたいと思います。

なお、Bochsで、「The Multiboot Speci cation version 1.6」に準拠したものを起動させられなかったので、0.6.96準拠で行きたいと思います。

# loader

GRUBに対応するには、multi boot headerが8192byte以内に存在している必要があります。それをloader.sで設定して上げる必要があります。

ついでに、なるべく早い段階でC言語で記述できるように、スタックポイントなどを指定して、メイン関数を呼び出します。

最低限の設定を行ったあと、C言語で記載した、カーネル本体にジャンプします。

```asm:loader.s
MAGIC_NUMBER	equ	0x1BADB002
MAGIC_FLAGS     equ	0x03
ALIGN_MODULE	equ 0x00000000
CHECK_SUM		equ	-(MAGIC_NUMBER + MAGIC_FLAGS)

STACK_SIZE	equ	0x1000				; Kernel Stack Size

global	loader
extern 	kmain

section .mbheader
align 8
mbheader:
				dd	MAGIC_NUMBER
				dd	MAGIC_FLAGS
				dd	CHECK_SUM

section .text
align	8
loader:
;;; Initilized Stack Point
				mov	esp, stack + STACK_SIZE

				push	ebx
				push 	eax

				call	kmain
.loop:
				hlt
				JMP	.loop

section	.bss
align	8
stack:
				resb	STACK_SIZE
```
```c:kernel.h
#ifndef __KERNEL_H__
#define __KERNEL_H__

typedef struct
{
	unsigned int	flags;
	unsigned int	mem_lower;
	unsigned int	mem_upper;
	unsigned int	boot_device;
	unsigned int	cmdline;
	unsigned int	mods_count;
	unsigned int	mods_addr;
	unsigned int	syms1;
	unsigned int	syms2;
	unsigned int	syms3;
	unsigned int  syms4;
	unsigned int	mmap_length;
	unsigned int	mmap_addr;
	unsigned int	drives_length;
	unsigned int	drives_addr;
	unsigned int	config_table;
	unsigned int	boot_loader_name;
	unsigned int	apm_table;
	unsigned int	vbe_control_info;
	unsigned int	vbe_mode_info;
	unsigned short	vbe_mode;
	unsigned short	vbe_interface_seg;
	unsigned short	vbe_interface_off;
	unsigned short	vbe_interrace_len;
} BOOTINFO;



void kmain(unsigned int magic, BOOTINFO *bootinfo);

#endif
```
```c:kernel.c
#include <kernel.h>

void kmain(unsigned int magic, BOOTINFO *bootinfo)
{
}
```
```c:link.ld
ENTRY(loader)

SECTIONS  {
		. = 0x00100000;
		.mbheader ALIGN (0x1000):
		{
				_kernel_start = .;
				*(.mbheader)
		}

		.text ALIGN (0x1000):
		{
				*(.text)
		}

		.rodata ALIGN (0x1000):
		{
				*(.rodata*)
		}
		.data ALIGN (0x1000):
		{
				*(.data)
		}
		.bss ALIGN (0x1000):
		{
				*(COMMON)
				*(.bss)
				_kernel_end = .;
		}
}
```



# 初期化状態
カーネル本体にジャンプした時点で、下記のように設定されています。

- EAX 0x2BADB002
- EBX ブート情報を記録したアドレスへのポインタ
- CS  読み取り実行セグメント offset 0  limit 0xFFFFFFFF
- DS,ES,FS,GS,SS 読み取り書き込みセグメント offset 0  limit 0xFFFFFFFF
- A20GATE 有効
- CR0 PG clear  PE set
- EFLAGS VM clear IF clear


# 今回のソース
https://github.com/yakawa/yakawa_os/releases/tag/v0.0.1
Visual Studio Team ServicesでASP.NET5用ビルドサーバを構築する

# ASP.NET5環境のビルドサーバ環境を構築する

現在のところ、ASP.NET5 を Visual Studio Team Services でビルドをしようとすると、標準のHostedのエージェントを使用すると、DNX（ASP.NET5のランタイム)が入っていないためビルドできません。

そのため、自前でエージェントサーバを構築する必要があります。本記事では Windowsサーバで ASP.NET5 をビルドするための、ビルドサーバ構築手順を共有いたします。

## 1. インスタンスを起動する

Azure等を使って、Visual Studio Enterprise 2015 Update1 + Azure SDK 2.8 入りの仮想マシンを起動するのが楽だと思います。

インストール時は遅いマシンだと時間がかかるのでStandard DS3の高級インスタンスを使ってセットアップを実行しました。Visual StudioはEnterpriseでなくてもCommunityでもよいと思います。

Windows10 のインスタンスの場合、MSDNに加入していないと起動できません、その場合は2012 R2 のサーバを選択しましょう。

## 2. 事前条件のソフトウェアをインストールする

[Web Platform Installer](http://www.microsoft.com/web/downloads/platform.aspx) をダウンロードし実行しましょう。
GUIの画面で次のアプリケーションをインストールしておきましょう。

```
Microsoft Azure PowerShell
Microsoft Azure Cross-Platform Command Line Tools
```

ASP.NET 5のインストール

下記のリンクに、Visual Studio にインストールする手順と、コマンドラインとしてインストールする手順が載ってます。ビルドサーバを構築する場合、コマンドラインの手順を実施する必要がありそうです。

[Installing ASP.NET5 On Windows](https://docs.asp.net/en/latest/getting-started/installing-on-windows.html#install-asp-net-5-from-the-command-line)

cmdを管理者モードで起動して、上記の手順書に乗っているこのコマンドでDNVM (Dot Net Version Manager)をインストールします。

```
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "&{$Branch='dev';iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.ps1'))}"
```

次に新規のcmdを起動すると、dnvmコマンドが使えるようになっているので、DNX (Dot Net eXecution Environment)つまり実行環境をインストールしましょう。

```
dnvm upgrade -r coreclr
dnvm upgrade -r clr
```

自分のお好みのランタイムが設定されていたら完了です。

```
dnvm list

Active Version           Runtime Architecture OperatingSystem Alias
------ -------           ------- ------------ --------------- -----
  *    1.0.0-rc1-update1 clr     x86          win             default
       1.0.0-rc1-update1 coreclr x64          win
```

自分のお好みのランタイムが設定されていない場合は、`dnvm use`コマンドで選択しましょう。

## 3. Visual Studio Team Servicesのエージェントのインストール

### 3.1. VSTS でのエージェントの設定

VSTSの、`Control Panel > DefaultCollection > Agent queues` のパネルで、`New queue...`を選択して、
ビルドサーバ用のエージェントを設定しましょう。お好みの名前を決めて作成してください。(e.g. ASPNET5)

ここで、作成したエージェント名はエージェントをビルドサーバに設定するときに必要になります。

### 3.2. エージェントのインストール

Windws用のVSTS Agentは VSTSの `Contorl panel > Default Collection > Agent queue` のタブのページに存在
する、「Download agent」リンクをクリックすることで得られます。

![AgentPool.PNG](https://qiita-image-store.s3.amazonaws.com/0/3470/bf271b08-bb16-8bc3-2f37-4dd38cef2bf3.png)


### 3.3. エージェントの設定

ブートした、Windowsエージェントサーバで、エージェントをダウンロードし、管理者権限のコマンドプロンプトを起動し、
展開された、ディレクトリの中の`ConfigureAgent.cmd`を実行します。

実行すると、下記のような内容が聞かれますので事前に準備しておきましょう。

* プールの名前 (e.g. ASPNET5)
* VSTSのURL (e.g. https://xxxxxx.visualstudio.com)
* VSTSで設定したエージェント名 (ASPNET5)
* Windowsマシンの管理者名とパスワード (任意)
* VSTSに接続するMSアカウント (任意)

これらを入力し、`Would you like to install the agent as a Windows Service (Y/N)?` にYと答えると、
サービスで、VSTSエージェントが起動するようになります。

## 4. Visual Studio Team Servicesで、ASP.NET5をビルドするときのTips

### 4.1. ビルド時にError:The expected lock file doesn't exist. Please run "dnu restore" to generate a new lock file.

このエラーは、`dnu restore`コマンドが内部で実行されていなこととに起因します。　`Visual Studio Build` タスクを使っている場合、`Restore NuGet Packages`にチェックが入っているかをご確認ください。
Fortran規格の解説本まとめ

ANIS/ISO/JIS 文書そのものではなくそれを解説・敷衍した本を並べます。解題として内容の要約を本の序文等から採っています。

#FORTRAN II
-  Khuynsmouk等編「FORTRAN規約」 コロナ社 昭和３８年 (西暦1963年) : 米国 IBM 社によって創始せられた FORTRAN 言語に関する一般的な説明および解説。IBM 709/7090 FORTRAN II に基づく。
 
#FORTRAN66
- 菅忠義「電子計算機基礎講座３　標準言語ＦＯＲＴＲＡＮ」共立出版、昭和４７年（西暦1972年）：JIS FORTRAN を言語の立場から解説したもの。

- 西村恕彦「電子計算機プログラム用言語　ＪＩＳ　ＦＯＲＴＲＡＮ全釈」オーム社、昭和４９年（西暦1974年）：FORTRAN の仕様そのものを対象とする研究書。

#FORTRAN77
- 西村恕彦／酒井俊夫・高田正之「岩波ＦＯＲＴＲＡＮ辞典」岩波書店、1986年：
FORTRAN77 の言語仕様を厳密に解説したもの。

#Fortran90
##Fortran8x
- Michael Metcalf, _FORTRAN OPTIMIZATION_  (Chap.12), Academic Press (1984).
 ：FORTRAN の長期的将来像を記述する。 
- Michael Metcalf & John Reid, _Fortran 8x Explained_, Oxfprd University Press (1987/1989).  次期 Fortran 規格のドラフトを包括的に解説する。（なおドラフトが改定されたため内容を改定して二回出版されている。）

##Fortran90
- Michael Metcalf & John Reid, _Fortran 90 Explained_, Oxford University Press (1990). Fotran90 の全機能を詳細に解説する。（邦訳：西村 恕彦, 和田 英穂, 西村 和夫, 高田 正之 訳「bit別冊　詳解Fortran 90」共立出版 1993年）
- Jeanne C. Adams, Walter S. Brainerd, Jeanne T. Martin, Brian T.Smith & Jerrold L.Wagner, _FORTRAN 90 HANDBOOK　Complete ANSI/ISO Reference_, McGraw-Hill (1992). 最新 ISO/ANSI Fortran 規格の完全な記述を与える。 

#Fortran95
- Michael Metcalf & John Reid, _FORTRAN 90/95 explained_, Oxford University Press (1996). _Fotran90 Explained_ に新たに 95 に関する章を加え詳細に解説する。
- Jeanne C. Adams, Walter S. Brainerd, Jeanne T. Martin, Brian T.Smith & Jerrold L.Wagner, _FORTRAN 95 HANDBOOK  COMPLETE ANSI/ISO REFERENCE_, MIT press (1997). Fortran95 規格の完全な記述を与える。 
- Michael Metcalf & John Reid, _FORTRAN 90/95 explained second edition_, Oxford University Press (1999). _FORTRAN 90/95 explained_ を改定し 90/95 を統合して記述する。新たに Technical Report に対する章を設けた。

#Fortran2003
- Michael Metcalf, John Reid & Malcolm Cohen, _fortran 95/2003 explained_, Oxford University Press (2004). _Fotran 90/95 Explained 2nd ed._ に新たに 2003 に関する章を加え詳細に解説する。
- Jeanne C. Adams, Walter S. Brainerd, Jeanne T. Martin, Brian T.Smith & Jerrold L.Wagner, _The Fortran 2003 Handbook  The Complete Syntax, Features and Procedures_, Springer  (2009). Fortran2003 規格の詳細かつ包括的な記述を与える。 

#Fortran2008
- Michael Metcalf, John Reid & Malcolm Cohen, _Modern Fortran explained_, Oxford University Press (2011). _Fotran 95/2003 Explained_ に新たに 2008 に関する章を加え記述する。
Macアプリケーションのショートカットキーを変更して誤操作を防ぐ方法



ChromeのSave Pages As...がcmd+Sに割り当てられていて、ブラウザ上で文章を書く時に癖で無意識にcmd+Sを押してしまいデスクトップに要らないファイルが溜まっていくのが鬱陶しいので、そのショートカットキーを変更することで対処している。

同様に、Kobito for MacのPost to Qiitaコマンドにcmd+ctrl+Sショートカットキーが割り当てられていたが、これも間違って公開してしまわないか不安だったので変更することにした。

## 方法

System Preferences... -> Keyboad -> Shortcuts -> App Shortcutsから変更可能。アプリケーションにショートカットキー変更機能がない場合はこの方法が良いっぽい。

適当に、間違って押してしまわないようなショートカットキーに変更しておく。

![Screen Shot 2015-12-30 at 8.12.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8065/b7cdd6a0-4f5e-e732-b1f4-60c5a36757b9.png "Screen Shot 2015-12-30 at 8.12.21 PM.png")

![Screen Shot 2015-12-30 at 8.24.16 PM.png](https://qiita-image-store.s3.amazonaws.com/0/8065/1a8d62db-858a-ef2f-e0f1-64af6de6c475.png "Screen Shot 2015-12-30 at 8.24.16 PM.png")
カレントディレクトリの絶対パスをクリップボードにコピーする

Mac限定

## クリップボードにコピーする
pbcopyコマンドを使うことでクリップボードにコピーできる．

```
$ pbcopy
test
```

とかやると，testがクリップボードにコピーされる．

## カレントディレクトリを表示する

```
$ pwd
/hoge/bar/
```
絶対パスが表示される．

## 本題
パイプしてやるとpwdの出力をそのままコピーできる．

```
$ pwd | pbcopy
```

これでペーストしてやればカレントディレクトリの絶対パスをクリップボードにコピーできる．
当たり前だが，パイプしてやればどんな出力でもコピーできるので，

```
$ cat hoge.txt | pbcopy
```
とすれば，hoge.txtの内容がコピー可能．
ruby 継承時のinitializeの挙動と、考察

こまごまとした処理を実現するのにRuby使ってますが、処理内容をまとめていく必要が出てきたので、継承の練習を。


# 子にinitializeが存在しない場合、親のものが継承される 

例えばこんな、親クラスのinitializeでインスタンス変数に値を設定し、子クラスのメソッドでその変数に対する表示処理をするケース。

## ソース

```rb
class Ex1 
  
  def initialize()
   @hoge = 'piyo'
  end

end

class Ex2 < Ex1

 def d1
  p @hoge
 end

end

e2 = Ex2.new

e2.d1
```

## 実行結果

親クラスのinitializeで設定した値が反映されている。

```
$ ruby extend_minimal.rb 
"piyo"
```

# 子にinitializeが存在する場合、そっちが優先される

親クラスと子クラス両方でinitializeを設定してみた

## ソース

```rb
class Ex1 
  
  def initialize()
   @hoge = 'piyo'
  end

end

class Ex2 < Ex1
    
 def initialize()
  @fuga = 'fusa'
 end

 def d1
  p @hoge
 end
 
 def d2
  p @fuga
 end

end

e2 = Ex2.new

e2.d1
e2.d2
```

## 実行結果

子クラスのinitializeで設定した値が表示されている。
一方、親クラスのinitializeが無視されている。

```
$ ruby extend_minimal2.rb 
nil
"fusa"
```
Linuxのtcでiptablesを使って特定のフローに遅延やロスをかける

いっつもやり方を忘れてググるのだが、ストレートにやりたいことを記載したページがなく、断片的な情報から組み立てるのに時間がかかってしょうがないので備忘録。そもそもtcについてちゃんと理解してないので覚えられないんだろうが、勉強はおいおい。

ちなみにtcのフィルタで直接指定する方法もあるけど、iptablesの方が慣れてるし分かりやすいよね、ってことでこっちのやり方が好き。

## 192.168.0.1宛のicmpだけ20%のパケロスを発生させる

フローの指定はiptablesでマッチ条件が書けるものなら何でもよい。一例として記載したパターンを示す。

```bash
# まずキューを作成する
# ...のだが、のっけから意味わかってなくておまじない状態
tc qdisc add dev veth105 root handle 1: prio bands 9 priomap 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

# ロス20%のキューを作成する
tc qdisc add dev veth105 parent 1:2 handle 20: netem loss 20%
#                               ^^^ (1)    ^^^ (2)
# (1) このキューのclass id? 次にフィルタを作成する時に指定するので、この値は重要
# (2) なんぞこれ。handle id? とりあえず被らないようにしておこう(^ω^)

# フィルタを作成してロス20%のキューに入るパケットを定義する
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 2 fw flowid 1:2
#                                                             ^ (3)       ^^^ (4)
# (3) iptablesでmarkする際の番号を指定する。この番号がマークされたパケットが次で指定するキューに入る
# (4) 割り当てる先のキューのclass idを指定。先ほど作成したキューの(1)と合わせる！

# iptablesでmarkのルールを作る
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.1 -o veth105 -j MAKR --set-mark 2
#                                                                                 ^ (5)
# (5) markする番号。(3)と合わせる！

# やめたいときは、キューを削除すればフィルタごとまるっと消える
tc qdisc del dev veth105

# iptablesのルールを消すのも忘れずに
iptables -t mangle -F
```

これでとりあえずOK!!

## 応用

netemの部分を書き換えてあげれば、遅延や帯域制限等好きに使える。netemで出来る内容は以下に丁寧に記載されているので、そちらを参照。

http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

色々なnetemのキューを作ってフロー毎に割り当てたいときは、上に書いたマッチングの部分に注意して複数ルールを記載してやればよい。

```bash
# おまじない(^ω^)
tc qdisc add dev veth105 root handle 1: prio bands 9 priomap 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8

# いろんなキューを作成する
tc qdisc add dev veth105 parent 1:3 handle 30: netem loss 40%
tc qdisc add dev veth105 parent 1:4 handle 40: netem delay 1234ms
tc qdisc add dev veth105 parent 1:5 handle 50: netem delay 1000ms 50ms 25% duplicate 30% loss 30% 25%
#                               ^^^ これ

# キューとmarkのマッチング
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 3 fw flowid 1:3
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 4 fw flowid 1:4
tc filter add dev veth105 protocol ip parent 1: prio 1 handle 5 fw flowid 1:5
#                                                             ^ コレ       ^^^ これ

# フロー毎にmarkを変える
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.3 -o veth105 -j MAKR --set-mark 3
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.4 -o veth105 -j MAKR --set-mark 4
iptables -t mangle -A OUTPUT -p icmp -d 192.168.0.5 -o veth105 -j MAKR --set-mark 5
#                                                                                 ^ コレ
```

ちなみにフローを限定する必要がなければ直接デバイスにnetemをかけると楽ちん。めんどくさい時はこっちで。ただdelayとかlostとか入れるとsshも引きずられて大変なことになる。

```bash
tc qdisc add dev veth100 root netem loss 20%
```

netem超便利。nagiosの検証はかどる。
Laravel5.1でbladeテンプレートを用いてPDFを作る

Laravel(PHP)でbladeテンプレートを用いたPDFを作りたい、と色々なライブラリを試してみた結果、何だかんだでTCPDFが一番しっくりと来たのでメモしてみます。

ComposerからTCPDFをインストール～日本語TrueTypeフォントのインストールまではこちらの記事を参考にさせて頂きました。
[Laravel 4.2のPDFファイル作成 - Qiita](http://qiita.com/edisonthk/items/01c84ed6d0fceee19a8c)

先に挙げたURLを参考にTCPDFをインストールしたLaravel5.1.27(LTS)の環境で、PDFを作ってみます。
任意のControllerのuse句に
`use TCPDF;`
として、次のような関数を作ります。

```HogeController.php
    public function getPrint()
    {
        //PDF作成
        $pdf = new TCPDF();
        //フォント名,フォントスタイル（空文字でレギュラー）,フォントサイズ
        $pdf->setFont('ipaexg','',10);
        //ページを追加
        $pdf->addPage();
        //viewから起こす
        $pdf->writeHTML(view("hoge.print")->render());
        //第一引数はファイル名、第二引数で挙動を指定（D=ダウンロード）
        $pdf->output('hoge' . '.pdf', 'D');
        //今回は適当にブラウザバック
        return Redirect::back();
    }
```

これでroutes.phpに
`Route::controllers(['hoge' => 'HogeController']); `
等のルートを書いてあげれば、ブラウザからbladeテンプレートで作成したhoge.pdfをダウンロードさせる事ができます。

また、サーバー上にPDFファイルを保存しながらダウンロードをさせたい場合は、

```
    //中略
    $pdf_path = storage_path() . '/hoge.pdf';
    $pdf->output($pdf_path, 'F');
    return Response::download($pdf_path);
```

で出来ます。
TCPDFのパラメータ等はこちらの日本語訳がとても参考になります。
[TCPDFマニュアル（勝手訳）](http://tcpdf.penlabo.net/method/)

また、TCPDFは外部CSSを読み込むものの、bootstrapのような複雑なCSSは読んでくれないという都合上、PDF出力用のbladeテンプレートを作ってあげる必要があります。
2015/12/30現在の最新版ではmargin: 0 auto;の様なセンタリングが効かなかったりするので、tableタグで無理やり配置する必要がありますが、帳票のような物なら短期間で作成可能だと思います。

以上です。
UnityのResourcesの使い方

## 概要
各シーンで使用する素材(SEやBGMやスプライトなど)を○○Managerなどにアタッチしておき、
あらかじめヒエラルキー上に配置しておくとメモリの消費が激しい。
メモリが多いPCなどでアプリを実行する場合はあまり気にする必要性はないが
スマートフォン上だとメモリが足りなくなり、アプリがクラッシュする問題が発生する。
そのため、Resourcesなどを使用して該当の素材を使用する時のみ読み込むようにした方がよい。
また使用しなくなった素材についてはメモリ開放を行い快適なアプリ環境を保つ必要性がある。

## Resourcesを使うメリット、デメリット
- メリット
メモリに優しい  

- デメリット
スクリプトの再利用性がなくなる場合がある

## Resourcesからデータを読み込む
```sample.cs
//スプライトの読み込み
private Sprite buttn;
buttn = Resources.Load("Image/StageSelect/OrangeButton", typeof(Sprite)) as Sprite;

//BGM(SE)の読み込み
private AudioSource audioSource;
audioSource = gameObject.AddComponent<AudioSource>();
audioSource.clip = Resources.Load("Sound/BGM/sample") as AudioClip;

//Prefabの読み込み
GameObject prefab;
prefab = (GameObject)Resources.Load ("Prefabs/sample");
```
## メモリを開放する
シーンの切替時にもメモリ開放される(？)かもしれないけれど、とりあえず明示的にも記載しておく方がよい。

```sample.cs
//現在使用していないアセットを破棄する
Resources.UnloadUnusedAssets();
```
## 参考サイト
- 複数のリソースの読み込み速度の検証結果
http://baba-s.hatenablog.com/entry/2015/02/03/095136

- ResourcesからスライスしたSpriteを取得する3つの方法
http://tsubakit1.hateblo.jp/entry/20131222/1387654182

- Unity　プレハブの動的生成を止まらないようにする
http://crosstie-bell.com/blog/unity%E3%80%80%E3%83%97%E3%83%AC%E3%83%8F%E3%83%96%E3%81%AE%E5%8B%95%E7%9A%84%E7%94%9F%E6%88%90%E3%82%92%E6%AD%A2%E3%81%BE%E3%82%89%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/

- Resourcesから非同期でインスタンス化する
http://tsubakit1.hateblo.jp/entry/2014/08/21/005830

- ロードの待ち時間を短くする
http://tsubakit1.hateblo.jp/search?q=%E3%83%AD%E3%83%BC%E3%83%89%E3%81%AE%E5%BE%85%E3%81%A1%E6%99%82%E9%96%93%E3%82%92%E7%9F%AD%E3%81%8F%E3%81%99%E3%82%8B

- Unity でリソースの解放を行う
http://loumo.jp/wp/archive/20140419000115/

- 公式リファレンス
http://docs.unity3d.com/ja/current/ScriptReference/Resources.html
Pythonのsubprocessで標準出力を出しつつ、文字列化する


subprocessで ``subprocess.PIPE`` を使って標準出力を取得できますが、Consoleには表示されなくなります。
Consoleにリアルタイムに表示しつつ ``str`` として取得したかったので、やり方を調べてみました。

## --追記--

``yield`` を使ったこっちの方が良い。

* [Pythonのsubprocessで標準出力をリアルタイムに取得する]

## Code

```Python
import sys
import subprocess


def run_and_capture(cmd):
    '''
    :param cmd: str 実行するコマンド.
    :rtype: str
    :return: 標準出力.
    '''
    # ここでプロセスが (非同期に) 開始する.
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    buf = []
    
    while True:
        # バッファから1行読み込む.
        line = proc.stdout.readline()
        buf.append(line)
        sys.stdout.write(line)
        
        # バッファが空 + プロセス終了.
        if not line and proc.poll() is not None:
            break
    
    return ''.join(buf)


if __name__ == '__main__':
    msg = run_and_capture('du ~/')
    print msg
```

## 説明

1. ``subprocess.Popen(cmd, ...)`` でプロセスを開始する
    * ``stderr=subprocess.STDOUT`` でstderrをstdoutへ一纏めにする
    * ``stdout=subprocess.PIPE`` で標準出力をパイプする
1. ``Popen.stdout.readline()`` でパイプした標準出力を1行ずつ取得＆出力する
1. パイプした標準出力をすべて回収 + プロセスが完了するまで待つ
1. ``''.join(buf)`` で文字列結合する



[Pythonのsubprocessで標準出力をリアルタイムに取得する]:http://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17
pandasのデータフレームの列を入れ替える

pandasのDataFrameの列を入れ替えるには、ixで列名を入れ替え後の順番に指定してあげましょう。

例

```py3
df
'''
これがデータフレームdfだとします
    a   b   c   
A   0   1   2   
S   5   6   7   
'''

#このコードを実行すると…
df.ix[:,['a','c','b']]
'''
以下のようになります
    a   c   b   
A   0   2   1
S   5   7   6
'''
```

以上でpandas初心者の私が躓いたポイントの解説でした。

追記：
もちろん列のインデックスを数値で指定しても大丈夫です。
windowsでNTP時刻同期の精度を向上させるには


はじめに
=====
NTPは時刻同期を行うためのプロトコルです．
PCの時刻は基本的にNTPで同期していれば正確，と思っていたのですが，特にwindowsの場合，デフォルトの設定では用途によって十分な精度で同期されていませんでした．そこで，出来る限り正確に同期させるための設定を調べたのでまとめます．

windowsのNTPクライアント機能
=====
windowsではW32Timeサービスによって時刻同期が行われています．
このサービスの仕様について以下の様な記載があります．
> ネットワーク上のノード間の W32Time サービスの精度は、保証およびサポートされません。W32Time サービスは、時間が重要となるアプリケーションのニーズを満たす完全な機能を備えた NTP ソリューションではありません。W32Time サービスは、主に次の手順を実行するように設計されています。
> * Kerberos v5 認証プロトコルが正しく動作するようにします。
>  * クライアント コンピューターに緩やかな同期時刻を提供します。
> W32Time サービスは、1 ～ 2 秒の範囲で同期時刻を確実に維持できません。このような許容誤差は、W32Time サービスの設計仕様に含まれていません。(https://support.microsoft.com/ja-jp/kb/939322)

(追記)
W32Timeサービスはデフォルトで起動していない場合があります．「タスクマネージャー」の「サービス」から起動状態を確認できます．「状態」が「実行中」であれば問題ありません．停止している場合は下記コメントに頂いたように，「サービス管理ツール」から設定を変更する必要があります．

W32Timeサービスの設定
=====
W32Timeサービスの設定を変更することで同期精度を向上させることが可能です．W32Timeサービスの設定はレジスタの変更が必要です．

##NTPサーバ
windowsはデフォルトの設定ではアメリカのサーバを参照していたりします(最近は違う？)．```ntp.nict.jp```や組織内のntpサーバを使いましょう．なお，組織内でドメインコントローラ等がある場合勝手なこと（これ以降の設定変更）をすると怒られるかも知れません．

##NTPサーバへのポーリング間隔
ntpサーバに対して一定間隔でポーリングを行うことで時刻同期を行っています．デフォルトでは１週間（604800秒）となっています．これではいくらなんでも長すぎるので変更します．
```HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient\SpecialPollInterval```が秒単位のポーリング間隔です．ポーリング間隔を短くしすぎるとサーバ側に負荷がかかってしまいます．
参考までに```ntp.nict.jp```の場合
>1時間平均で20回(1日の合計が480回)を超えないようにしてください。 それ以上が必要な場合は事前にご連絡ください。 (https://www2.nict.go.jp/aeri/sts/tsp/PubNtp/qa.html#q1-4)

この条件を満たすためにはポーリング間隔を256秒以上にします．

なお，W32Timeサービスには現在時刻の精度からポーリング間隔を徐々に長くしていく機能もあるようです．今回は省略します．


##stepモードとslewモード
システムの時刻は，様々なシステムでタイムスタンプとして利用されています．もし時刻に逆戻りが発生するとタイムスタンプが前後してしまうなど問題が発生します．そこで，正しい時刻に瞬時に変更する（stepモード）のではなく，時刻の戻りが生じないように徐々に正しい時刻に合わせる（slewモード）機能が実装されています．
時刻のズレが大きい場合stepモードになりますが，その条件についてはググってください．ここではslewモードにおけるパラメータのについて説明します．
これらは```HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Config```内にあります．

### UpdateInterval
UpdateIntervalは時刻のズレを補正する間隔を表します．この値が小さいほど頻繁に時刻を修正します．私は100にしました．

## 設定の反映
GUIの"インターネット時刻設定"から"今すぐ更新"を押下すると反映される？

## 同期状況の確認
現在のシステム時刻とntpサーバの時刻との差を確認するコマンドがあります．
```w32tm /stripchart /computer:ntpサーバアドレス```

オプションとして ``` /samples:5```によって表示する回数を指定できます．デフォルトでは無限に表示され続けます（停止するにはCTRL+C）．また，```/dataonly```を追加することで，オフセットのみ確認できます．
(@ghostさんよりコメントを頂いたので追記いたしました．フィードバックありがとうございました．)

#おわりに
設定を変更することで数ミリ秒から十ミリ秒オーダの精度を維持できていると思われます．

#参考にしたページ
[ Windows Time サービス - Slew モードと Step モード ](http://blogs.technet.com/b/jpntsblog/archive/2012/12/28/slew-step.aspx)
[ デイトレードなときどき日記 - Windows7での時刻合わせ ](http://www.daytradenet.com/blog/tokidoki/archives/12/11/041530.html)
[ Windowsネットワーク時刻同期の基礎とノウハウ（改訂版）：
第3回　w32tmコマンドとレジストリによるWindows Timeサービスの制御 ](http://www.atmarkit.co.jp/ait/articles/1207/12/news146.html)
vagrant up失敗ーWindows - BIOS編ー

当たり前のように使えると思っていた`vagrant up`.

## Timeoutになってしまう

どれだけ待ってもいっこうに終わりそうもない。エラーメッセージもタイムアウトしたとだけしかでていない。

## デバッグ

どこでつまずいているか確かめるために、実際にVMの中で動いている内容を確認する。下記のコメントアウトをはずして、`vagrant reload`


```rb:Vagrantfile
  config.vm.provider "virtualbox" do |vb|
    vb.gui = true
  end
```

## vagrant reload後

>　VT-x/AMD-V hardware acceleration is not available on your system. Your 64-bit guest will fail to detect a 64-bit CPU and will not be able to boot.

どうやらBIOSのほうで制限がかかっている模様。

## Windowsを再起動

Windowsが立ち上がる前に、`F2`（Systemによって違うかも）を押してBIOSを起動する。

## BIOSにてVirtualization Technologyを設定

BIOSを起動したら`Power`に矢印キーで移動し、Virtualization Technologyを`Enable`に変える。

設定を保存して終了。

## 解決！

これで無事Vagrant upもできるようになった。