OmniAICreator/Qiita-1.07M huggingface dataset:
rails4系で request spec で post すると、数値が文字列として解釈される問題


# こんなmodel

```
$ rails g scaffold user name:string, role:integer
```
```app/models/user.rb
class User < ActiveRecord::Base
  enum role: { worker: 1, manager: 0 }

  validates :role,
    inclusion: {in: User.roles.keys}
end
```

# こんなテスト

```spec/requests/users_spec.rb
require 'rails_helper'

RSpec.describe "Users", type: :request do
  describe "POST /user" do
    subject do
      post users_path, user: { name:'name', role:1 }
    end
    it { expect{subject}.to change{User.all.size}.from(0).to(1) }
  end
end
```

# 結果

```
  1) Users POST /user
     Failure/Error: @user = User.new(user_params)

     ArgumentError:
       '1' is not a valid role
```

# ナンデ? きちんと intger の 1 渡したよ!?

- paramの扱いが、controllerでテストするときと異なるらしい

# どうしたら良いの?

応急処置的には、JSONフォーマットで渡せば良い

```.rb
      #post users_path, user: { name:'name', role:1 }
      post users_path, { name:'name', role:1 }.to_json, CONTENT_TYPE: 'application/json'
```

# 応急処置以外だと?

そもそも request でテストしないということを推奨している人もいる

- [Rails4のFunctional Testには注意しよう - Qiita](http://qiita.com/soutaro/items/b990dc9b0f9e46b0f4c2)

# 上の人はRails4だとうまくいかないと言っていたけど、Rails5ならどう?

Rails5.0.0.1で試してみたけど再現した

# 参考

- [Request Specs Converting Non String Values to Strings · Issue #610 · rspec/rspec-rails](https://github.com/rspec/rspec-rails/issues/610)
atom.io ショートカット　メモ

以下、atom.io を使った際のショートカット、学びメモ

①
何かの拍子で、Key Binding Resolver　が表示されるようになり、非表示としたくなったら、

[command] + [.] キーを押せば、表示、非表示の切り替えが可能です。
git のトップレベルで任意シェルコマンドを実行する alias

git プロジェクトのトップディレクトリに cd して、そこからコマンドを実行したいことは多いはず。それを簡単に実行する。

# 概要

引数を exec するシェルコマンドを alias 定義する。

# 定義方法

git の alias として以下を定義する。例えば、`~/.gitconfig` に次記述。

```shell-session:~/.gitconfig
[alias]
	exec = !sh -c 'exec "$@"' $(which sh)
```

# 使い方いろいろ

```shell-session
git exec make all
# => git レポジトリのどこにいようが、トップレベルで make が実行される

git exec pwd
# => トップレベルディレクトリのパスを取得できる

git exec bundle exec rails s -d
# => rails git プロジェクトのどこにいようが、サーバーをデーモンでスタート
```
Rubyで正規表現に一致したものを部分的に取得する

文字列から正規表現に一致しているものを別々に取り出したい時とかたまにある
例えば `one-two` となっていたときに `one` と `two` を別々に取りたいとする
(つまり、ハイフン(-)の前と後ろを取る)

```rb
words = 'one-two'
match = words.match(/(?<first>.+)-(?<second>.+)/)
match[:first]  # => one
match[:second] # => two
match.captures # => ['one', 'two']
```

#### その他の方法

@yancya さんから類似機能のコメントいただきましたので追記します。

=~ を使ってマッチさせると、勝手に名前付きキャプチャの名前の変数にバインドされる。

```rb
words = 'one-two'
/(?<first>.+)-(?<second>.+)/ =~ words
first  #=> "one"
second #=> "two"
```
カスタムバリデーター便利だった>_<

####カスタムバリデーターとはバリデーションを好みにカスタマイズできてしまうもの。
自分ルールが作れる! :neckbeard: 


備忘録として一連の流れを書いていきます。
登録フォームでのsave時にこのvalidatorを発動させます。

**ユーザーが銀行コードを入力し、そのコードがBankテーブル上に存在しなければ(そのコードに合致する銀行は存在しませんという内容の)警告を表示させるようなイメージです。**



```ruby:new.html.slim 

= form_for @bank_account do |f|
 
       = f.text_field :bank_code   #銀行コード
       = f.text_field :account_num #口座番号 物足りなかったので書いただけで特にカスタムバリデーターとは関係ないです

  = f.submit
```

###続いてカスタムバリデーターの本体を作成し定義する
app/validators/bank_validator.rbというファイルを作成

```ruby:app/validators/bank_validator.rb
class BankValidator < ActiveModel::EachValidator  #classはファイル名で
  def validate_each(record, attribute, value) #ここの引数たちはおまじないだと思って問題ない
    unless Bank.find_by(code: value) # 銀行のテーブルを参照しその中のcodeの値と受け取ったvalueを比較する => falseならバリデーター発動！！！！！
      record.errors[attribute] << (options[:message] || "は正しくありません") # ここも意味がわからなかったらコピペで全然おkです
    end
  end
end
```

参考までに引数たちに何が入ってるのか確認してみると
p record 
=> **BankAccount id: nil, bank_code: "aaaaa", created_at: nil, updated_at: nil>**
p attribute
=> **:bank_code**
p value
=> **"aaaaa"**

こんな感じで入ってます!

###最後にモデル内の設定
presence: trueはご存知だと思いますが、その後ろの**bank: true**が重要です。

```ruby:bank_account.rb

class BankAccount < ApplicationRecord
  validates :bank_code,  presence: true, bank: true #ここの最後の部分でカスタムバリデーターを使いますよという合図 
end
```

**bank_codeをaaaaaでsubmitした結果**
![160818-0001.png](https://qiita-image-store.s3.amazonaws.com/0/94552/42b839c4-a1ce-6b0c-dda9-5b536e2ff75e.png)

できてますね！

[参考railsガイド-validator]
(http://railsguides.jp/active_record_validations.html#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)
ターミナルでフォルダ/ディレクトりをコピーするコマンド


testフォルダをコピーしてtest2を作りたい

```
$ mkdir test
$ cp -r test/ test2
¥ scp test/ hoge@hoge.jp:tmp/
```

cpコマンドに「-r」付けるだけだとは...
ちなみにscpコマンドも同じで「-r」をつける

※scpとは
> scpコマンドはファイルをSSHで暗号化した上で転送してくれるコマンドです。ローカルからリモートもしくはリモートからローカルへの転送に使用できます。
引用元：http://www.ksknet.net/linuxrz/scp.html
&>/dev/null と >/dev/null の違い

bashの場合の `&>/dev/null` と `>/dev/null` の違いについて。

## 前提
|用語|説明|
|:--|:--|
|標準出力|画面に表示されるメッセージのこと (`echo`等で出力)。ファイルディスクリプタ1番。STDOUT。|
|標準エラー出力|シェルで実行して、エラーが発生した時に表示されるエラー・メッセージのこと。ファイルディスクリプタ2番。STDERR。|
|/dev/null|出力が破棄され、なにも表示されない。|
|>|リダイレクト。出力する場所を指定する|
|&ファイル・ディスクリプタ|出力先を特定のファイルディスクリプタに送りたい場合は「&ファイル・ディスクリプタ」とする|

## &>/dev/null と >/dev/null
### &>/dev/null
`>/dev/null 2>&1`と同じ。
標準出力と標準エラー出力の両方共を破棄する。

### >/dev/null
`1>/dev/null`と同じ。標準出力を捨てる。

## 参考
* [Difference between 2>&-, 2>/dev/null, |&, &>/dev/null and >/dev/null 2>&1](http://unix.stackexchange.com/questions/70963/difference-between-2-2-dev-null-dev-null-and-dev-null-21)
Chainer+Tkinterで、自分で手書きした数字を認識してみる

### こんな人向けです
- Chainerのexampleを実行できた！けどちゃんと学習できたのか、いまいちよくわからない
- 自分で書いた数字を認識してみたい

### 作ったもの
左側に数字を書くと、右側に認識結果が表示されます。
<img width="610" alt="Screen Shot 2016-09-12 at 8.21.17 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/136986/2dbc97c6-1f41-e511-a9f7-5af29b662e63.png">


### 参考
- GUIのアイデア : [ofxMSATensorFlow](https://github.com/memo/ofxMSATensorFlow)
- Tkinterでお絵描き : [モンキーPython](http://www.nslabs.jp/monkey-python-02b.rhtml)

# VisualizeChainer
コードを置いたので実行してみてください。
https://github.com/nabehide/VisualizeChainer

## 動作確認した環境
* Mac OSX El Capitan
* Python 2.7.10
* chainer 1.13.0
* h5py 2.6.0
* numpy 1.11.1
* pillow 3.3.0

入っていない場合はpipなどでインストールしてください。

## 実行方法
コマンドの実行に必要なものです。

 - Git : https://git-scm.com/
 - wget : 
  - Macであれば ```brew install wget``` でインストールできます

下記コマンドでGUIが起動します。

```
$ git clone https://github.com/nabehide/VisualizeChainer
$ cd VisualizeChainer/MNIST
$ wget https://github.com/nabehide/VisualizeChainer/releases/download/v1.0.0/20160818_MNIST.model.zip
$ unzip 20160818_MNIST.model.zip
$ python main.py
```

左側のcanvasに数字を書いて、左下のjudgeボタンを押すと、右側のresultに認識結果が表示されます
<img width="610" alt="Screen Shot 2016-09-12 at 8.21.17 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/136986/2dbc97c6-1f41-e511-a9f7-5af29b662e63.png">

## コードの説明
canvasの見た目はTkinterですが、裏でPILのキャンバス（？）にも同時に描画しています。
「judge」ボタンを押すと、裏キャンバスのデータをpngに変換　→　28×28にリサイズ　→　データをNNに入力　→　認識結果を得る
という流れです。
かなり回りくどいんじゃないかと思うので、今後シンプルにしたいです。
アプリ時代のメールアドレス確認処理について考えたメモ

アプリ時代、というかバックエンドがAPIな時代に、メールアドレス確認処理をどう実装していくか考えたメモ。

## 概要

* 一般的なメールアドレス確認処理をユーザーに強いられるアクション、導線、実装内容あたりで良し悪しを一旦整理

## 背景

* なんだかんだ言って、世の中のいろんなサービスを利用する際にメールアドレスが必要、メールアドレスの確認処理ではいろんな実装がある
* 送るタイミングは色々にせよ、確認メールにURLが含まれていて、それをクリックしたら確認完了＆戻れみたいなのが思い浮かぶが、それだともちろんWebのエンドポイントも必要になる
* 電話番号認証(SMS)ではキャリアの迷惑メール対策とかからURLではなく認証コードを送るのが一般的なきがするが、メールの場合でも同様でいいのではないか? API実装のみで済ませたい

この背景があるので、以下の文章にはどうしてもURLdisなバイアスがかかってしまうだろうなとは認識している。

##　URL vs 認証コード

### 比較対象

最小限の単位で切り出して比較する。

* URL
 * 1. メールアドレスを入力し、確認メールが送られる
 * 2. メールを確認
 * 3. URLをクリック
* 認証コード
 * 1. メールアドレスを入力し、確認メールが送られる
 * 2. メールを確認
 * 3. 認証コードを（機械的　or 記憶能力を用いて）コピー
 * 4. 認証コードを入力

### ユーザーの手間

* URL
 * 簡単
* 認証コード
 * コピペが必要なので、URLクリックよりは面倒

### 確認後の導線

* URL
 * URLを開いた先が「メールアドレスを確認しました。おつです」程度なら、メールアドレスを入力した環境(アプリなりなんなり)に戻る必要がある
* 認証コード
 * メールアドレスを入力した環境に認証コードを入れるため、その後の処理にはスムーズに進められる

例えばアプリからのメアド登録の場合、URLをクリックしてブラウザを立ち上げるまでは簡単で良いが、その後にアプリ側で処理を続けるところで離脱が起きてしまわないかちょっと心配である。

### 実装内容

* URL
 * メールアドレス入力させる機能
 * 確認メール送信
 * アクセスされたら確認済みにする処理を行うエンドポイント(=Webアプリケーション)
* 認証コード
 * メールアドレス入力させる機能
 * 確認メール送信
 * 認証コードを検証する機能

URLの方は確認済みにする処理のためだけにWebアプリケーションを用意する必要があるってのはちょっと...という思いがある。

### 乗っ取り対策

メールは本人しか見れない&悪い人がそのメアドの確認したいと思っているという前提。

* URL
 * 「メールで送られてきてるURLふんでおいて」
* 認証コード
 * 「メールで送られてきてる認証コード教えて」

細かい話をすると、URL踏ませる方が成功の可能性はたかそう
...とはいえ、このレベルになると、あんまり変わらなそう。

## 一旦まとめ

* 一長一短
* アプリがメインであれば、確認済みにするためのWebのエンドポイント作りたくないっていう理由で認証コード使っても大丈夫そう

## もしメールアドレスの確認が任意だったら

認証コードよりもURLでやるのが簡単そう。

## その他

* そもそもGETのリクエストで重要な処理させるやり方についても色々言いたいこともなくはない
* メールアドレス確認だけで考えたらこれでいいが、例えばパスワード忘れでメールを送るとかになると再びこの話が出てきそう
Passenger の gem のバージョンとかあげたら undefined symbol: rb_data_typed_object_alloc が出た

# 事象
やってたこと

* Ruby のバージョンあげる
* passenger の gem のバージョンをあげて、ビルドしなおし

Rails アプリにアクセスしたら、エラー
```
undefined symbol: rb_data_typed_object_alloc
```
# 解決方法
gem を全部インストールしなおしたら直った。
NLP100: 第1章 準備運動

言語処理100本ノック
***
時間がないので適当なところが多々あります.

```py
# coding:utf-8
# 00 文字列の逆順
string = "stressed"
print string[::-1]
print "".join(reversed(string))


# 01 「パタトクカシーー」
string = u"パタトクカシーー"
print string[0::2]
print string[1::2]


# 02 「パトカー」＋「タクシー」＝「パタトクカシーー」
string1 = u"パトカー"
string2 = u"タクシー"
ret = ""
for s1, s2 in zip(string1, string2):
    ret+=(s1+s2)

print ret


# 03 円周率
string = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
string.replace(", ", "").replace(".", "")
words = string.split(" ")
print "".join(map(lambda x: str(len(x)), words))


# 04 元素記号
string = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
words = string.split(" ")
n = [1, 5, 6, 7, 8, 9, 15, 16, 19]
d = {}
for idx, word in enumerate(words):
    if idx+1 in n:
        d[idx+1] = word[0]
    else:
        d[idx+1] = word[0:2]

print d


# 05 n-gram
def ngram(seq, n=2):
    ret = []
    N = len(seq)-n+1
    for i in xrange(N):
        ret.append(seq[i:i+n])

    return ret

seq1 = "I am an NLPer"
seq2 = seq1.split(" ")

print ngram(seq1)
print ngram(seq2)


# 06 集合
seq1 = "paraparaparadise"
seq2 = "paragraph"
X = set(ngram(seq1))
Y = set(ngram(seq2))
print "X: %s"%X
print "Y: %s"%Y
print "X+Y: %s"%(X|Y)
print "X-Y: %s"%(X-Y)
print "X&Y: %s"%(X&Y)


# 07 テンプレートによる文生成
def template(x=12, y="気温", z=22.4):
    return "%s時の%sは%s"%(x, y, z)

print template()


# 08 暗号文
string = u"与えられた文字列の各文字を，以下の仕様で変換する関数cipherを実装せよ．"
def cipher(string):
    l = "abcdefghijklmnopqrstuvwxyz"
    ret = ""
    for s in string:
        if s in l:
            s = chr(219-ord(s))

        ret += s

    return ret

print cipher(string)# encode
print cipher(cipher(string))# decode


# 09 Typoglycemia
import random

def typoglycemia(string):
    ret = []
    for word in string.split(" "):
        if len(word) <= 4:
            ret.append(word)

        else:
            typo = word[0] + "".join(random.sample(word[1:-1], len(word[1:-1]))) + word[-1]
            ret.append(typo)

    return " ".join(ret)

string = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind."
print typoglycemia(string)
```
bxSliderで「次へ」「前へ」ボタンをオリジナル画像に変更する

# 概要
 - bxSliderで表示する「次へ」「前へ」のナビゲーションボタンをオリジナルの画像に差し替えます。
 - bxSliderに同梱されているナビ画像、CSSには手を入れません。

# HTMLとCSS
 - スライダーエリアの左右にnaviボタンを配置
 - CSSは必ずjquery.bxslider.min.cssの後に読み込むよう指定

```css:ナビ部分のcss
.feed-prev-btn {
  background-image: url(../images/btn_prev.png);
}
.feed-next-btn{
  background-image: url(../images/btn_next.png);
}
.feed-prev-btn:hover {
  background-image: url(../images/btn_prev_on.png);
}
.feed-next-btn:hover{
  background-image: url(../images/btn_next_on.png);
}
.feed-prev-btn .bx-prev {
  width: 100%;
  display: block;
}
.feed-next-btn .bx-next {
  width: 100%;
  display: block;
}
.navi-btn {
  margin: 79px 8px 0 9px;
  width: 23px;
  height: 23px;
  -webkit-background-size: 23px;
  background-size: 23px;
  background-repeat: no-repeat;
  background-position: center center;
  float: left;
}
```
```html:sliderエリア
<div class="contents-list">
    <div class="navi-btn feed-prev-btn" id="feed-prev-btn"></div>
    <ul class="slider-area" id="feed">
        <li>ここにスライダー表示する要素を複数並べる</li>
        <li>ここにスライダー表示する要素を複数並べる</li>
        <li>ここにスライダー表示する要素を複数並べる</li>
    </ul>
    <div class="navi-btn feed-next-btn" id="feed-next-btn"></div>
</div>
```
# bxSliderの指定
 - 今回は自動スライドする設定にしています
 - スライダーとnaviボタンにホバーしたときには自動スライドを停止させている

```js:bxSliderの指定
var bxParam = {
    auto: true,//自動スライドの実施
    pause: 5000,//自動スライドの待ち時間
    autoHover: true,//スライダーにホバーしたときに自動スライドを停止
    minSlides: 5,//一度に表示させるスライドの最小数
    maxSlides: 5,//一度に表示させるスライドの最大数
    moveSlides: 5,//一度に移動するスライド数
    slideWidth: 164,//各スライドの幅を指定
    slideMargin: 10,//各スライド間の余白を設定
    controls: true,//前後のコントロールを追加するかどうかの設定
    pager: false,//ページ送りを追加するかどうかの設定
    nextSelector: "#feed-next-btn",//オリジナルのナビエリアを、
    prevSelector: "#feed-prev-btn",//jQueryのセレクタで指定できる
};

$(function () {
	var slider = $("#feed").bxSlider(bxParam);
        //naviボタンがオリジナルのため、ホバー時の処理を手動で実装
	$(".navi-btn").on({
	    "mouseenter": function(){slider.stopAuto();},
	    "mouseleave": function(){slider.startAuto();}
	});
});
```
 - nextSelector、prevSelectorオプションで画像ボタンを背景表示しているdivを指定
 - これで、prevSelectorで指定したdivにbxSliderが、```<a class="bx-prev">Prev</a>```といったタグを追加してくれる(nextSelectorも同様)
 - 上記のCSSでbxSliderが追加したAタグをブロック要素に変えて、文字を非表示にしている

# まとめ
 - ナビゲーションエリアをjQueryのセレクタで指定できるため、色々と応用が利く
 - 画像ボタンに限らず、どんな場所でもnaviボタン化できる
ゼロから始めるWeb Accessibility入門：セマンティックHTML

# 前回まで
[ゼロから始めるWeb Accessibility入門：概要](http://qiita.com/toshinori/items/d5c81131aadc9610c36a)
[ゼロから始めるWeb Accessibility入門：誤解](http://qiita.com/toshinori/items/b94f3ae3f26893490624)

アクセシブルなHTMLを構築するために、セマンティクスが重要です。
その要素は、何を意味しているのかを明確にマークアップしていくことが大事です。

* タイトル
* パラグラフ
* リスト
* 画像

これらの要素を正しい意味を伝えるのがアクセシビリティ対応の基本です。

# HTMLリストのダメな記述
```html
<div class="list-item">1つ目のリスト項目</div>
<div class="list-item">2つ目のリスト項目</div>
<div class="list-item">3つ目のリスト項目</div>
```
# HTMLリストの正しい記述
```HTML-OK
<ul>
  <li>1つ目のリスト項目</li>
  <li>2つ目のリスト項目</li>
  <li>3つ目のリスト項目</li>
</ul>
```

セマンティックHTMLでマークアップする最も重要なメリットは、スクリーンリーダー（音声読み上げソフトウェア）がこれらのパターンを認識でき、ユーザに音声で伝えられることです。
視覚的にも聴覚的にも同じ情報を提供し、見るユーザと聞くユーザが確実に同じコンテンツを同じように経験できるようになります。

セマンティック属性は従来のセマンティックHTMLを置き換えるものではなく、HTMLのセマンティクスをより強化するものです。

# 次回
[ゼロから始めるWeb Accessibility入門：ボタン](http://qiita.com/toshinori/items/941ebbbbe3e4b0d5b01d)
【Laravel】migrate:resetとかmigrate:rollback時に「Class 'なんたらテーブル' not found」する場合の対処

#概要
マイグレーションファイル作成した。
試しにマイグレーションするぞ！

> $ php artisan migrate
> Migrated: テーブル名

やったー動いた！resetの方も試そう。

> $ php artisan migrate:reset
> 
> [Symfony\Component\Debug\Exception\FatalErrorException]
> Class 'テーブル名' not found

・・・え？

#オートローディングのクラスマップにマイグレーションファイルのディレクトリを追加する

```json:ルート/composer.josn
{
  --- 省略 ---
  
  "autoload": {
    "classmap": [
      "database/migrations" これを追加
    ]
  },
```

#composer dump-autoload
いま追加したオートローディングの設定を元に「vendor/composer/autoload_classmap.php」を更新する。

> $ composer dump-autoload

更新されれば「vendor/composer/autoload_classmap.php」に

> 'テーブル名' => $baseDir . '/database/migrations/テーブル名.php',

みたいなのが追加されるはず。これでClass not foundは解消される、はず。

> $ php artisan migrate:reset
> Rolled back: テーブル名

#補足
オートローディングの設定の方は１度やれば良いんだけど、

$ composer dump-autoload

の方は当然マイグレーションファイルを追加するたびに必要になる。ちょっと面倒。なんかぐぐったらこれが面倒みたいなQiitaのドキュメントあった気がしたからもしかしたら良い方法があるのかもしれない。
違うブランチにコミットしてしまった

##問題
間違ってmasterにコミットしてしまった、もしくは、違うブランチにコミットしてしまった。

##解決方法

```shell-session
git checkout master
git checkout -b [新しいブランチ]
git cherry-pick [追加したいコミットのハッッシュ]
git checkout [間違えたブランチ]
git reset --hard HEAD~
```
Vagrantでマウントに失敗する

##問題

vagrant up時、以下のようなエラーが出て、マウントの失敗する。

```
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3`,dmode=777,fmode=666 vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant`,dmode=777,fmode=666 vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device
```

##解決方法

```
vagrant ssh

sudo yum install -y http://bay.uchicago.edu/centos-vault/6.5/updates/x86_64/Packages/kernel-devel-2.6.32-431.3.1.el6.x86_64.rpm

sudo /etc/init.d/vboxadd setup
```

##参考サイト
http://www.websuppli.com/vagrant/430/
Docker for AWS/Azure(D4x)でDatadogのAgentをglobalサービスで起動。スケール変更時にも勝手に全部見える。


DatadogのDockerホスト向けAgentはD4xにちょうどいいかもしれないと思ったので起動してみる。

## run => serviceに変換する

Dockerホスト向けAgentのインストラクションからはこう来るので、

```
docker run -d --name dd-agent \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  -v /proc/:/host/proc/:ro \
  -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \
  -e API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx datadog/docker-dd-agent:latest
```

globalモードのサービスとして動かせるように変換と。こうしておけばノードが増減しても全体でAgentが稼働する状況を保てる。

```
docker service create --name global-dd-agent \
  --mode global \
  --limit-cpu 1 \
  --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock,readonly=true \
  --mount type=bind,source=/proc/,target=/host/proc/,readonly=true \
  --mount type=bind,source=/sys/fs/cgroup/,target=/host/sys/fs/cgroup,readonly=true \
  -e API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
  datadog/docker-dd-agent:latest
```

そういえばglobalにも対象絞りができるんだろうか？まあ今回はいいや。

## Serviceの確認

全部のNodeでAgentが動きだしたね。

```
$ docker service ps global-dd-agent
ID                         NAME                 IMAGE                           NODE                            DESIRED STATE  CURRENT STATE           ERROR
b2m3d5lvyng0dn0p20ubpktpj  global-dd-agent      datadog/docker-dd-agent:latest  ip-192-168-xxx-xxx.ec2.internal  Running        Running 25 seconds ago  
b71c81rhk8k1qzybme6on0csl   \_ global-dd-agent  datadog/docker-dd-agent:latest  ip-192-168-xxx-xxx.ec2.internal  Running        Running 20 seconds ago  
0tkbe30m150unwuh58hw4svb2   \_ global-dd-agent  datadog/docker-dd-agent:latest  ip-192-168-xxx-xxx.ec2.internal  Running        Running 23 seconds ago  
arc0tozq3ypoltqntli23eo4a   \_ global-dd-agent  datadog/docker-dd-agent:latest  ip-192-168-xxx-xxx.ec2.internal  Running        Running 12 seconds ago  
ev76xdu7vc8r1pgldd1g5ui1f   \_ global-dd-agent  datadog/docker-dd-agent:latest  ip-192-168-xxx-xxx.ec2.internal  Running        Running 22 seconds ago  
8atpxhwzhf4lie9xs50rq5geb   \_ global-dd-agent  datadog/docker-dd-agent:latest  ip-192-168-xxx-xxx.ec2.internal  Running        Running 20 seconds ago
```

Datadog側にもガサっと情報が上がってきました。

![Events___Datadog.jpg](https://qiita-image-store.s3.amazonaws.com/0/7454/610a0c14-e933-89d8-0f5f-18c11a0c4600.jpeg "Events___Datadog.jpg")

Dockerコンテナの作られたりする様子もあがってきて色々と丁度いいかも。


## おわりに

globalのサービスは、一発タスクにも使える。例えば事前にdocker imageをpullしておきたいとか。
テーブル内で長い文字列を決まった長さで改行させる方法

テーブルの中に長い文字列が入る可能性があり、
テーブルセルの決まった長さで折り返し（改行）させたいときの対処法です

### ①テーブルセル幅を固定する設定
```html
<table ~~~ style="table-layout:fixed;width:100%;">
```
これで幅が固定できます

### ②テーブルセル幅を設定

固定する設定ができていても、その長さが決まってないといけない、ってわけです
colgroupタグとcolタグでやってもらいましょう

```html
<table ~~~ style="table-layout:fixed;width:100%;">
	<colgroup>
		<col style="width:33%;">
		<col style="width:33%;">
		<col style="width:33%;">
	</colgroup>
	<tbody>
		<tr><td>hey</td><td>hey</td><td>hey</td></tr>
		<tr><td>hey</td><td>hey</td><td>hey</td></tr>
		<tr><td>hey</td><td>hey</td><td>hey</td></tr>
	</tbody>
</table>
```

BootstrapなんかのCSSライブラリを使ってる場合はすでにできている可能性がありますね
こんな風に↓

```html
<th class="col-xs-2">aaaaa</th>
<th class="col-xs-3">bbbbb</th>
<th class="col-xs-3">ccccc</th>
<th class="col-xs-2">ddddd</th>
<th class="col-xs-2">eeeee</th>
```

Bootstrapといえばグリッドシステムつかいますよね

### ③改行させる設定
さていよいよ本命の作業

```html
<td ~~~ style="word-wrap:break-word;"></td>
```

これだけ。

以上テーブルでうまく改行させる方法でした。
Servo （や Mozillaな）プロジェクトにコントリビュートしたくなった時に役立ちそうなリンクまとめ


# Prelude

みなさま、こんにちは。
ある日突然、Servo や Firefox などの Mozilla なプロジェクトにコントリビュートしたい！って思い立つ時ってありますよね？

そんな時にすぐにコントリビュート開始できるように、読むべきドキュメントを独断と偏見でまとめました。

（主に自分向けです）
（間違いがあったり、これも追加したほうがいいよねというものが合った場合は、`編集リクエスト`でお知らせください）

# Servo

- [Servo 本家](https://servo.org/)
- [Servo Blog](https://blog.servo.org/)
- [Servo Starters](https://starters.servo.org/)
- [Servo GitHub リポジトリ](https://github.com/servo/servo)

`Servo本家`は Servo プロジェクトのサイトですね。
Servo とはなんぞや？を知りたいときは、ここを見るのが早いかも。

`Servo Starters`は、Servo 初心者がコントリビュートを始めたいけど、どこからはじめたらいいんだっけ？に答えてくれるサイト。
言語別（Rust, Python, JS...）に初心者向けの Pull Request がリストアップされていてここを漠然と眺めているだけでも、面白いです。
（まさに今の私にうってつけ！）

`Servo Blog` は一週間ごとのプロジェクトの動きが分かります。

`Servo GihHubリポジトリ`は、そのままです。

以下の記事も（ちょっと古いですが）Servo プロジェクトがドコを目指しているのかがパッと見てわかってよかったです。

- [Servo の現況概説的なおはなし](http://saneyukis.hatenablog.com/entry/2013/07/16/004928) (ちょっぴり古い)

## Rust (主に日本語)

せっかく Servo のコントリビューターを目指すんなら、Rust も読み書きできるようにならないとね！

- [プログラミング言語 Rust](http://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/)
- [Rust by Example](http://rust-lang-ja.org/rust-by-example/index.html)

Rust はドキュメントの翻訳プロジェクトが活発に活動してるみたいですね！
こういったところでもコントリビュートできそうですね！

- [Rust のドキュメントの翻訳プロジェクトを開始します。](http://qiita.com/blackenedgold/items/3b068769736e671805f0)
- [プログラミング言語 Rust の翻訳プロジェクト・リポジトリ](https://github.com/rust-lang-ja/the-rust-programming-language-ja)
- [Rust by Example の翻訳プロジェクト・リポジトリ](https://github.com/rust-lang-ja/rust-by-example-ja)

# Firefox

- [Firefox の簡単なビルド方法](https://developer.mozilla.org/ja/docs/Mozilla/Developer_Guide/Build_Documentation/Simple_Firefox_build)
- [Code Firefox cheatsheet](http://www.codefirefox.com/cheatsheet)

# Mozilla 全般

- [Contributing to the Mozilla codebase](https://developer.mozilla.org/ja/docs/Introduction)
- [Mercurial for Mozillians](http://mozilla-version-control-tools.readthedocs.io/en/latest/hgmozilla/index.html)
- [repositories](https://hg.mozilla.org/)
- [mach ](https://developer.mozilla.org/ja/docs/Mozilla/Developer_guide/mach)
Githubリポジトリで発生したイベントを取得する


```
$ curl -u <username> https://api.github.com/repos/:owner/:repo/events
```

# イベントのコミットID(SHA1)からブランチ作成

```
$ curl -u <github-username> -X POST -d ‘{“ref”:”refs/heads/<new-branch-name>”, “sha”:”<sha-from-step-1>"}’ https://api.github.com/repos/:owner/:repo/git/refs
```

# 参考

[Github’s reflog — Git Tips — Medium](https://medium.com/git-tips/githubs-reflog-a9ff21ff765f#.of7xsob69)
Ruby | "/dev/null" をハードコーディングせずに出力する

```rb
File::NULL # => "/dev/null"
```

# 環境

- Mac OS X El Capitan 
- ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]


# 参考

- http://stackoverflow.com/questions/8681868/is-there-something-like-a-null-stream-in-ruby
- https://www.mutuallyhuman.com/blog/2011/09/28/a-casual-look-at-upcoming-changes-in-ruby-1-9-3








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Delphi > @x: xのポインタ / p^: 指定アドレスの値取得

http://stackoverflow.com/questions/437683/how-to-get-the-memory-used-by-a-delphi-program
にてDelphiコードがある。これをC++ Builder用に組替えようとしている。

```delphi
  if GetProcessMemoryInfo(GetCurrentProcess,
      @MemCounters,
      SizeOf(MemCounters)) then
```

delphiのコードは読むのはあやふやである。上記の@という表記は初めてみた。

http://kakinotane.s7.xrea.com/delphi/d2/d030.html
> `p := @x;　　　// @x で x のアドレスを p に代入`
> `y := p^;　　　// p が指すアドレスに格納されている値

アドレスのようだ。
また、指定アドレスに格納されている値を読むのは`p^`のようだ。
Meteorのあんちょこ꒰｡･ω･`;꒱ Reactive-Dict

# 概要

- [reactive-dict package | Atmosphere](reactive-dict package | Atmosphere)
- [Storing temporary UI state in a Reactive Dictionary | TUTORIAL](https://www.meteor.com/tutorials/blaze/temporary-ui-state)

# パッケージ追加

```bash:console
$ meteor add reactive-dict
                                              
Changes to your project's package version selections:
                                              
reactive-dict  added, version 1.1.8           

                                              
reactive-dict: Reactive dictionary      
```
JQUERYでCSSセレクタの書き方

#いままでは
```
$(this).css("width", "100px").css("height", "100px");
```

といった感じにチェーンで繋いでました（笑）

#こんな風に書ける
```
$(this).css({width: "100px", height: "100px"});
```
らしい。
railsっぽくていいすね（謎）
メモメモ
c++ builder > アプリ使用メモリの確認 > 失敗編

```txt:動作環境
C++ Builder XE4
```

### 失敗編1

FastMMでメモリリークを調査中だが、Logを見ても特定が難しくなってきた。
ソースを全部読みながら静的解析になるだろうか。

実行中のアプリのメモリ使用量はタスクマネージャで確認できるが、任意の時間でのメモリ使用量を取得したくなった。

[stackoverflow](http://stackoverflow.com/questions/437683/how-to-get-the-memory-used-by-a-delphi-program)のapenwarrによる回答にDelphi実装でのメモリ確認コードがあった。

C++ Builderに組み替えてみた。

```
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TMemoryManagerState st;

	GetMemoryManagerState(st);
	int result = st.TotalAllocatedMediumBlockSize + st.TotalAllocatedLargeBlockSize;

	int sbtsize = st.SmallBlockTypeStates.Size();
	TSmallBlockTypeState sb;
	for(int idx=0; idx < sbtsize; idx++) {
		sb = st.SmallBlockTypeStates[idx];
		result = result + sb.UseableBlockSize * sb.AllocatedBlockCount;
	}

	ShowMessage(IntToStr(result));
}
```

delphiでのforイテレータの使用はC++ Builderではそのまま使えなかったと思うので、上記のようなfor()文に変更した。

実行したところ、メモリ使用量は0になった(タスクマネージャで確認したところ2208K使用)。
インスペクタで確認したところsb.AllocatedBlockCountなどが0になっている。
sb.UseableBlockSize などには数値が入っている。

apenwarrの回答に対する以下のコメントと関係があるのかどうか。

> 	
besides the above, this method shows the amount of memory allocated by the application, not the amount of memory used by it 

### 失敗編2

同じstackoverflowのリンクのJim McKeethによるDelphiコードをC++ Builder実装しようとしたが、psAPIをincludeしてもTProcessMemoryCounters型などが見つからなかった。
ゼロから始めるWeb Accessibility入門：誤解

#前回
[ゼロから始めるWeb Accessibility入門：概要](http://qiita.com/toshinori/items/d5c81131aadc9610c36a)


# アクセシビリティのさまざまな誤解
アクセシビリティという言葉が指す範囲は広く、抽象的です。人によって、言葉からイメージする内容にもかなり差があり、誤解によるすれ違いが起きる場合もあります。すれ違いによって取り組みが後退しないようにするためにも、誤解されやすい点をまとめました。

## ビジュアルデザインを劣化させる？
アクセシビリティに配慮すると、ビジュアルデザインが強い規約を受け、見た目が劣ったものになると思われることもあります。アクセシビリティ向上の施策には、文字と背景に一定のコントラストをつける、スタイルの一貫性を保つ、といったルールが含まれます。これはコンテンツを見せるためのものでありサイトの見た目を劣化させるようなものではない。
Webのビジュアルデザインが求める「美しさ」は、ユーザが見たときに、きちんと伝わり、整って見えるという意味での美しさです。自己主張のためのアートとしての美しさではない。

## 文字サイズ変更ボタンをつけなければならない？
アクセシビリティの誤解でもっとも典型的なものは、コンテンツには文字サイズ変更ボタンが必要だというものです。
実際には、文字サイズ変更ボタンがなくてもユーザは文字サイズを変えられます。

## アクセシビリティは高齢者、障害者のためだけの施策？
アクセシビリティは障害者や高齢者のための施策であり、他の大多数のユーザには関係ない、と思われていることもあるようです。
しかし、実際にはアクセシビリティ向上の恩恵を受けるのは障害者や高齢者だけではありません。一時的な怪我や病気、デバイスの故障、周囲の状況など、さまざまな理由でアクセスがしづらくなることがあります。

## アクセシビリティとは縁のないサイトがある？
「うちの商品は障害者には使えないので、アクセシビリティは関係ない」という人もいます。が、意外な使われ方をしていることがあります。
視覚障害者はカメラを使えないはず、、、と思ったら大間違いで撮影した映像を他人に見てもらったりと、積極的に使っていることがあります。仮に本人が使わなくても、知人に製品を勧めたり、会社情報にアクセスしたりと、さまざまなニーズがあります。

「このコンテンツには凝った映像表現があるから、見えない人が来ても無意味だろう」というのも同じです。サイトの運営者の「どうせ使えないだろう」という思い込みを、ユーザは簡単に克服し、以外な方法で利用してしまうことがあります。
Webにはそれだけのパワーが秘められています。

## 常に大きなコストがかかる？
アクセシビリティ向上の取り組みには大きなコストがかかる、と思われていることがあります。
答えは、NOともいえるしYESともいえます。

多数のサイトはHTMLで構築されますが、HTMLは本質的にアクセシブルなもので、適切に作れば、それだけで最低限のアクセシビリティは確保されます。テキストの書き方やコンテンツ自体のわかりやすさなど、技術によらない部分での配慮も必要になりますが、追加の費用がかかるような特別なものではありません。
最初からアクセシビリティを考慮して構築すれば、特別な対応は必要ないのです。しかし、以下のような状況では追加のコストが発生する場合があります。

### 後から修正する場合
アクセシビリティを考慮していないサイトを、後からアクセシブルにすることは困難です。アクセシビリティの問題は戦略や設計に起因することも多く、表層的な部分の修正では対応できないこともあります。
特に、アクセシビリティの要件があいまいなままでプロジェクトが進み、終盤になって問題が浮上した場合、大きな追加コストが発生することもあります。

### 動画や音声コンテンツに字幕をつける場合
動画や音声のコンテンツは、マシンリーダビリティの低いメディアでありそのままではアクセシブルになりません。
字幕をつける、キャプションや代替テキストを容易する、といった対応が必要になります。

### Javascriptをアクセシブルにする場合
近年では、ユーザの操作に反応してナビゲーションを行うなど、複雑なものが増えてきました。このようなリッチなインターフェイスでは、既存のフォームコントロールを使わないこともあり、環境によって操作が困難だったり、動的に変化した部分を認識できないようなケースがあります。
このようなリッチなインターフェイスをアクセシブルにする場合は、相応なコストがかかります。

## アクセシビリティへの取り組みは難しい？
たしかに、アクセシビリティへの取り組みの中には、難しいものも存在しています。たとえば、動画に字幕を付ける対応などは、運用コストを考えると難しいことも多いです。

しかし、アクセシビリティはゼロか1かではありません。ガイドラインに存在するすべての施策を完璧に実施しても、全ての人のアクセスが完全に保証されるわけではないです。施策を行えば、より多くの人が、より快適にアクセスできるようになります。わずかでもアクセシビリティが向上すれば、それでアクセスできるようになる人が現れるはずです。それを少しずつ積み上げていけば、将来的には大きくアクセシビリティが向上するかもしれません。

高すぎる目標を設定する必要はありません。
ガイドラインで設定された基準を達成できなかったとしても、取り組みが無意味だということではありません。

# 次回
[ゼロから始めるWeb Accessibility入門：セマンティックHTML](http://qiita.com/toshinori/items/bc27612266306f06e884)
AWSのDynamoDBに最小のコードでscanでデータを取得する

## これや

http://docs.aws.amazon.com/sdk-for-go/api/service/dynamodb/#example_DynamoDB_Scan

```dynamo.go
package main

import (
	"fmt"
	"log"
	"path"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/dynamodb"


	sess := session.New(&aws.Config{Region: aws.String("us-east-1")})

	svc := dynamodb.New(sess)

	params := &dynamodb.ScanInput{
		TableName: aws.String("TABLE_NAME"), // Required
		AttributesToGet: []*string{
			aws.String("TARGET_ COLUMN"), // Required
			// More values...
		},
	}
	resp, err := svc.Scan(params)

	if err != nil {
		// Print the error, cast err to awserr.Error to get the Code and
		// Message from an error.
		fmt.Println(err.Error())
		return
	}

	// Pretty-print the response data.
	fmt.Println(resp)
}
```

```json
{
  Count: 2,
  Items: [{
      TARGET_COLUMN: {
        S: "foo"
      }
    },{
      TARGET_COLUMN: {
        S: "bar"
      }
    }],
  ScannedCount: 2
}
```
Indy / memory leak > TIdCriticalSection > IdStack.pas > 意図的なleak

```txt:動作環境
C++ Builder XE4
```

FastMMでTeeChartを使うソフトのメモリリークをチェック中。

`21 - 36 bytes: TIdCriticalSection x 1`
のようなリークが見られる。


[stackoverflow](http://stackoverflow.com/questions/1270913/delphi-memoryleak-in-idstack-but-who-uses-idstack)によると

> FAstMM reports a memoryleak from a TIdCriticalSection in IdStack.pas. I understand this is a intentional leak, that is documented in the code.

ということで意図的なleakらしい。

IdStack.pasを使うユニットの判別についてもリンク先に記載あり。
Serverman VPS SSH接続が複数できない場合の対処

#目的
DTI Serverman VPS SSH接続が複数できない（※SSHログインが拒否される）ことがあったので、対処しました。

#方法
仕組みは理解していないが、下記のページを参考に実施したらOKとなった。
**<font color="red">セキュリティなどは考慮していないので、勉強したら追記したい。</font>**

[参考：FIX: ssh openpty error session_pty_req session 0 alloc failed](https://eligere.wordpress.com/2008/04/25/fix-ssh-openpty-error-session_pty_req-session-0-alloc-failed/)

#詳細

> コマンド入力（※即時反映）
`/sbin/MAKEDEV tty`
`/sbin/MAKEDEV pty`
`mount -t devpts devpts /dev/pts`

Permanent: 恒久対処は、下記fstabに記載を追加　※今回はすでに存在したので、既存はコメントアウトしました。

```ruby:/etc/fstab
#none   /dev/pts        devpts  rw,gid=5,mode=620       0       0
none    /dev/pts        devpts  defaults        0       0
```
[Linux] 割り込み関連の資料まとめ

work queue 周りで調査する機会があったので割り込みに関係する資料のまとめ

# top half
[割り込み](http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2011-02-08/index.html#interrupt-request_irq)
[2.3　ハードウェア割り込み処理 - Linux Kernel Documents Wiki - Linux Kernel Documents - OSDN](https://osdn.jp/projects/linux-kernel-docs/wiki/2.3%E3%80%80%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A2%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E5%87%A6%E7%90%86)

# bottom half (Softirq、Tasklet、Work Queue)
[割り込みの後半部、Softirq、Tasklet、Work Queue](http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2011-02-15/)
[カーネル API: 第 2 回、遅延可能な関数、カーネルのタスクレット、およびワークキュー](https://www.ibm.com/developerworks/jp/linux/library/l-tasklets/)
[ワークキュー - Linuxの備忘録とか・・・(目次へ）](http://wiki.bit-hive.com/north/pg/%A5%EF%A1%BC%A5%AF%A5%AD%A5%E5%A1%BC)

# 書籍
[Linuxカーネル2.6解読室 : 高橋浩和, 小田逸郎, 山幡為佐久 : 本 : Amazon.co.jp](https://www.amazon.co.jp/Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB2-6%E8%A7%A3%E8%AA%AD%E5%AE%A4-%E9%AB%98%E6%A9%8B%E6%B5%A9%E5%92%8C/dp/4797338261)

+ OSDN で 2章までは公開されています
+ [目次 - Linux Kernel Documents Wiki - Linux Kernel Documents - OSDN](https://osdn.jp/projects/linux-kernel-docs/wiki/%E7%9B%AE%E6%AC%A1)

# その他参考
[irqbalanceサービスについて - のぴぴのメモ](http://nopipi.hatenablog.com/entry/2012/08/15/163742)
[Linuxでロードバランサやキャッシュサーバをマルチコアスケールさせるためのカーネルチューニング - ゆううきブログ](http://blog.yuuk.io/entry/linux-networkstack-tuning-rfs#RPS-Receive-Packet-Steering)
メール配信サービス"MailChimp"でできること


- メルマガ送れる
- 配信後の数値をレポートしてくれる
- カスタマイズが簡単&おしゃれ

といったメリットがあるらしい **MailChimp**。
前にちょっとだけ（本当にちょっとだけ）調べたメモが残っていたので一応投稿しておく。

###参考

- 公式サイト（英語です）

http://mailchimp.com/

- 日本語でまとめたわかりやすいサイト

http://www.loftwork.jp/column/2013/20131010_mailchimp.aspx

##アカウント作成

- メールアドレス
- ユーザーID
- パスワード

※ 設定するパスワードの条件は **少なくとも１つの小文字・大文字・数字・特殊記号（$, %等）を含む8桁以上**

上の３つを入力すればメールが送られてくるのでアクティベートしたら作成完了。
ログイン後にその他に必要な事項も入力をするのですが、会社等の住所入力が必須となっていました。
（英語入力なので住所の順番は日本の逆で）

##ダッシュボードの項目

###1. リストの作成
ここで言うリスト(List)とは連絡先のことです。一度リストのマスターを作成しちゃえば楽チン。
###2. キャンペーンの作成・一斉送信
リストにあるメンバーにメール形式でキャンペーン情報を送ることができます。
###3. 参加申し込みフォームが作れる（しかもカスタムできるっぽい）
ウェブサイト、Facebook、iPadなどなどにも対応。
###4. 共同管理ができちゃう
複数のユーザーでアカウントを共有できるので、キャンペーンの作成もできるし分析レポートの管理もできる。
###5. ドメインのチェック
キャンペーン情報を送るときに大事なドメインはここでチェックできますよ、って書いてる（と思う）
Vue.jsをちょっと使ってみる


簡単なところだけとりあえずメモしたので投稿します。

#準備

cdnとかでソースを読み込み。
[このへん](https://jp.vuejs.org/guide/installation.html "このへん")とか。

#記法のポイント

- `new Vue` の中にかいていく
- `new Vue`はスクリプトが読み込まれた段階で実行される
- `new Vue` と `el` は１：１対応

```js:script.js
$(function(){
    var app = new Vue ({
        el: "#app", // 適用箇所
        data: { // データ
            message: "Hello World",
            morning: "Good morning",
            event: [],
            loading: true
        },  
        created: function(){ // スクリプトを読み込んだ時点で読み込むところ
            var url = "./api/event.php";
            var xhr = $.get(url);
            xhr.success(function(response){
                app.loading = false;
                app.count = response.results_available;
                app.events = response.events;
            })
        }

        methods: { // いろんなメソッドをここで作成
          load: function(start) {
              var url = "./api/event.php";
              var xhr = $.get(url, {
                      start: start
              });
              xhr.success(function(response){
                  app.message = start + "件目からの読み込み"
              })
          }
        }
    })
})
```


##v-for
ディレクティブの１つ。
他に `v-if` なんかもある。


#コンポーネント

- `Vue.extend` を使う
- コンポーネントは `new Vue` の中でしか動かない

#htmlタグを解釈して表示するには（信用できるAPI投げる時だけ使おう）

`{{}}` を `{{{}}}` にするだけ。

#便利なやつ

```
<a :href="message">
```

属性の前にコロン `:` をつけることで後ろのやつが `{{}}` でつけられてるのと同じ意味になるらしい。



#注意点

##Bladeと一緒に使うときは@マークをつける

Bladeで変数を読み込むときにも `{{}}` は使うので、Vue.jsを使うときは両者がかぶる。
なので **JSフレームワーク** のほうは前に@マークをつけて `@{{}}` とする。
CentOS7でLet's Encryptを使う

# 初めに

CentOS7上で、独自ドメインのSSL/TLS 証明書を無料で取得できて、しかも商用利用もできる、Let's Encrypt の設定をしてみました。Let's Encrypt 自体については https://letsencrypt.jp/ を参照ください。

# インストール

CentOS7 では、certbot をyum でインストールできます。Web Server は apache なので、合わせて、certbot-apache もインストール。

```
yum install certbot certbot-apache
```

# 設定

今まで開けていなかった、https ポートへのアクセス許可

```
sudo firewall-cmd --add-port=443/tcp --zone=public
sudo firewall-cmd --add-port=443/tcp --zone=public --permanent
```

--permanentがないと一時的な設定でしかないのに注意

# SSL証明書の自動設定

　バーチャルホストで運用しているそれぞれのホスト名 host1.sample.com と host2.sample.com の２つの証明書を設定します。
もちろん、sample.comは自分のドメインに置き変えないと動作しません。

```
sudo certbot run --apache -d host1.sample.com -d host2.sample.com
```

もし不足パッケージがあれば yum でインストールするかを聞いてくるので、y を入力するとインストールしてくれます。

２つのホストの証明書が１コマンドで同時に取得できます。Apache設定ファイルとして、ssl.conf を指定すると、ここに全部のホスト分の SSL証明書へのパス等が自動で設定されます。なお、SSL証明書は　/etc/letsencrypt/archibe/host1.sample.com/　のようなホスト
名のディレクトリに保存されます。

certbotを実行すると以下のように、httpアクセスをhttpsにリダイレクトするかを聞いてきますのでお好みのものを選びます。

~~~
Please choose whether HTTPS access is required or optional.
----------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
----------------------------------------------------------------
~~~
~~http をすべて https にリダイレクトするセキュア設定は、CentOS上では動作しなかったので、必要ならば手動で設定します。~~
Secureを選ぶと、apacheのVirturalHOSTの設定部分に以下ようなの２行が追加されました。

~~~
RewriteCond %{SERVER_NAME} =host.exsample.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
~~~

# SSL証明書の更新

証明書の有効期限が３か月なので、更新が必要です。更新も certbot でします。

```
certbot renew
```

このコマンドは、証明書の期限切れ近くにならないと更新されないので、cronで、１週間に１度くらい実行しておくと安心と思います。

なお、renew でドメイン名は指定できないようです。下のメッセージが出ました。

```
Currently, the renew verb is only capable of renewing all installed 
certificates that are due to be renewed; individual domains cannot be specified 
with this action. If you would like to renew specific certificates, use the 
certonly command. The renew verb may provide other options for selecting 
certificates to renew in the future.
```

# 参考

こちらのページを参考にしました。

* https://letsencrypt.jp/usage
* http://knowledge.sakura.ad.jp/knowledge/5573/
無限ループSQL

無限にループして終了しないQuery
明示的にrollbackやcancelを行う必要があります。
テスト等に使用可能です。

with temp(c1) as 
(select 1 from tablename union all select c1 from temp)
select * from temp

※注意点※
・tablenameは任意のdummy表を指定してください。
・DB2 for z/OSでは稼働することを確認済みです。他のRDBMSではエラーとなる可能性があります。
初回 vagrant up でリトライアウト

初回の vagrant up で延々と Authentication failure. Retrying... が発生し、リトライアウトしてしまうというネタの１バリエーションです。環境は以下の通り。

- Host OS : Windows10
- SSH Client : PuTTY
- Vagrant : 1.8.5
- VirtualBox : 5.0.26
- Guest OS : CentOS 7.x(bento/centos-7.1)

# 事象
```cmd:エラー
D:\> mkdir laravel
D:\> cd laravel
D:\laravel> vagrant init
（作られた Vagrantfile をエディタで修正）
D:\laravel> diff.exe Vagrantfile.orig Vagrantfile
15c15
<   config.vm.box = "base"
---
>   config.vm.box = "bento/centos-7.1"
D:\laravel> vagrant up
（中略）
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
    default: Warning: Authentication failure. Retrying...
    default: Warning: Authentication failure. Retrying...
　　（これを30回ほど繰り返す）
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period.
```

先に、先人の別解を示します：

- [vagrant upコマンド実行時にAuthentication failure.エラーが発生する](http://qiita.com/shyse/items/9ec50b868b90f847c75f)
  - デフォルトのinsecure_private_keyを使う方式
- [VagrantでSSH鍵の設定 - [Authentication failure. Retrying…]の対処策](http://qiita.com/Esfahan/items/e5f707dc6d116c2cc751)
  - 鍵を作り直す方式

ただ、自分の場合はもっと単純な理由でした。まず、vagrant ssh-config で接続パラメータを確認します。

```cmd
PS D:\laravel> vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile D:/laravel/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```

PuTTY では OpenSSH 互換キーが使えないので、PuTTYgen.exe で private_key をインポートし、hoge.ppk を作成して秘密鍵として指定します。その後、PuTTY で vagrant@127.0.0.1:2222 に接続しようとすると、Server refused our key と怒られて、パスワード認証にフォールバックしました。

```cmd
Using username "vagrant".
Server refused our key
vagrant@127.0.0.1's password:
```

パスワード "vagrant" でログインします。

やっぱり鍵のペアがおかしいのかなと思って作りなおしたりしていましたが、鍵の設置のため、何気に ~/.ssh を確認すると、なんと authorized_keys のパーミッションが誤っていたのを発見。即修正しました。

```bash
[vagrant@localhost ~]$ cd .ssh
[vagrant@localhost .ssh]$ ls -l
-rw-rw-r--. 1 vagrant vagrant 389 Aug 18 05:42 authorized_keys
[vagrant@localhost .ssh]$ chmod 600 authorized_keys
[vagrant@localhost .ssh]$ ls -l
-rw-------. 1 vagrant vagrant 389 Aug 18 05:42 authorized_keys
```

今回のケースでは、結果的にこれだけで接続できました。念のため、いったん box を消してからやり直してみても上記手順でうまくいくので、自動作成される private_key は有効のようでした。
Cloudera Managerでクライアント専用マシンを管理する

Cloudera Manager(以下CM)はサーバプロセスの管理だけでなく、クライアントマシンの設定も管理することができる。
本記事ではクライアントマシンの登録方法を紹介する。

# 環境

- Cloudera Manager 5.8

# 技術説明

## Gatewayロール

CMではNameNodeやDataNodeのようなサーバプロセス用のロールの他に、Gatewayという特殊なロールが存在する。
これはクライアント専用のホストに付与するためのロールで、これらのロールに対しては設定ファイルだけをデプロイする。
ちなみに全てのロールは暗黙的にGatewayロールが付与されている。Cloudera Manager 管理下のホストで簡単に hadoop 等のコマンドが実行できるのはこのためである。


## Cloudera Manager におけるクライアントマシン準備手順

以下の手順で、Cloudera Manager 管理下のクラスタにクライアントマシンを準備することができる。

1. 新規ホストを登録する
2. Gatewayロールを付与する
3. クライアント設定を展開する


### 新規ホストを登録する

[Cloudera Managerで新規ホストを追加する](http://qiita.com/shiumachi/items/13c102303a3cd357729f) を参考にして、新規ホストを登録する。


### Gatewayロールを付与する

ホスト登録の際にホストテンプレートを使って設定していればこの項目は不要。

HDFSのGatewayロールは下記のように設定する。

**HDFS** → **インスタンス** → **ロールインスタンスの追加** を選択し、画面の指示に従って対象のホストにGatewayロールを割り当てる。


<img width="1109" alt="CM57 HDFS インスタンス.png" src="https://qiita-image-store.s3.amazonaws.com/0/17749/e368afb9-b857-3e3c-d3ca-12f35c33f180.png">



### クライアント設定を展開する

ホスト登録の際にホストテンプレートを使って設定していればこの項目は不要。

クラスタの **▼** メニューから **クライアント設定の展開** をクリックすれば、設定が配布される。


![CM58 クライアント設定の展開(クラスタ).png](https://qiita-image-store.s3.amazonaws.com/0/17749/a6d5aba6-fb20-50c0-bc64-39366f3dcb59.png)



# 参考

ロールインスタンス
http://www.cloudera.com/documentation/enterprise/latest/topics/cm_mc_role_instances.html

クライアント設定ファイル
http://www.cloudera.com/documentation/enterprise/latest/topics/cm_mc_client_config.html
IntelliJ CE + Delve で Go 言語のデバッグ環境構築(Mac)

## 注意

**golang 用 IDE の [GoLand](https://www.jetbrains.com/go/) が正式リリースされ、下記の手順は無効となりました（プラグインが無償提供されなくなった模様）。**

## 概要

無償提供されている [IntelliJ Community Edition](https://www.jetbrains.com/idea/) と [Delve](https://github.com/derekparker/delve) で golang のデバッグ環境を macOS 上に構築します。

## IntelliJ Community Edition インストール
[IntelliJ Community Edition](https://www.jetbrains.com/idea/) をダウンロードしてインストールする。

## Go プラグインインストール
IntelliJ -> Preference -> Plugins -> Browse repositories で Go を検索して Go のプラグインをインストールする。
<img width="814" alt="スクリーンショット 2016-08-18 15.00.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/5407/6df0872f-0a26-89cf-6b07-1391e8273cb7.png">

## Delve インストール
Homebrew でインストールする。
```brew install go-delve/delve/delve```

## デバッグ設定
IntelliJ -> Run -> Edit Configurations
左上 + をクリックして Go Application を選択する。
Name に任意の名前を入力し、File に main 関数を含むソースコードを指定して OK ボタンをクリックする。
<img width="1066" alt="スクリーンショット 2016-08-18 15.48.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/5407/5501b5a5-2703-0d6e-a141-92f54440d03a.png">

## デバッグ実行
任意の場所にブレークポイントをはり、
IntelliJ -> Run -> Debug から先ほど作成した設定を選択する。
OSXのパスワード入力を求められるので入力すると無事デバッグできるようになっている。
<img width="778" alt="2016_08_18_16_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/5407/3d19ce23-a90f-0397-4249-955e78291843.png">
標準入力の行数をページ分割する perl5スクリプト

## 使いかた

```
command-too-long-output | perl pager.pl 3 1
```

動作確認

```shell-session
$ a=0;while [ $a -lt 20 ]; do echo "line $a"; a=$(($a+1)); done | perl pager.pl 3 1
line 0
line 1
line 2
$ a=0;while [ $a -lt 20 ]; do echo "line $a"; a=$(($a+1)); done | perl pager.pl 3 2
line 3
line 4
line 5
$ a=0;while [ $a -lt 20 ]; do echo "line $a"; a=$(($a+1)); done | perl pager.pl 3 7
line 18
line 19
```
第一引数 が 1ページあたりの件数
第二引数 が ページ数

## スクリプト
```pager.pl
use strict;
use warnings;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

my ($count, $page) = @ARGV;
$count ||= 0;
$page ||= 1;
my @lines = ();
push @lines, $_ for <STDIN>;
my $start = $count * ($page - 1);
my $end = $start + $count;
if (@lines - 0 < $end) {
  $end = @lines - 0;
}
print for @lines[$start...$end-1];
```
WindowsでAdHoc(ipaファイル)の有効期限を調べる方法

今ってTestFlightが主流でAdHocってあんまり使われてないんでしょうかね？

年一でAdHocが期限切れを起こすため、AdHocファイル（ipaファイル）の書き出し直し作業を手動でやっている（＆やってもらっている）のですが、ちゃんと期限が伸びたipaファイルになっているかを確認する手段が判らなかったので適当に作ってみました。

## コード

仕事のメイン機がWindowsという事もあってC#で実装。

```csharp:hoge
        internal static string GetExpirationDate(string path)
        {
            try
            {
                using (var archive = ZipFile.OpenRead(path))
                {
                    foreach (var ent in archive.Entries)
                    {
                        if (string.Compare("embedded.mobileprovision", ent.Name, true) == 0)
                        {
                            using (var stream = ent.Open())
                            {
                                var buffer = new byte[ent.Length];
                                stream.Read(buffer, 0, (int)ent.Length);

                                var cms = new SignedCms();
                                cms.Decode(buffer);
                                var xml = Encoding.UTF8.GetString(cms.ContentInfo.Content);
                                var m = Regex.Match(xml, @"<key>ExpirationDate</key>.*?<date>(.*?)</date>", RegexOptions.Singleline);
                                if (m.Success)
                                {
                                    DateTime res;
                                    if (DateTime.TryParse(m.Groups[1].ToString(), out res))
                                    {
                                        return res.ToString();
                                    }
                                    return m.Groups[1].ToString();
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception) { }

            return "??";
        }
```

参照に`System.IO.Compression`、`System.IO.Compression.FileSystem`、`System.Security`辺りを突っ込まないと使えないかも。
ZIP（=ipa）の中の`embedded.mobileprovision`ファイルを解凍してCMSでデコードして、`ExpirationDate`キーの値を拾ってきているだけです。



＃そもそもアプリ数が増えてくるとAdHocを作りなおすのが面倒くさいのですが、その辺皆さんどうされていますか？
ESP8266でBlynkとThingSpeakの両方にデータを送信したい

## Blynkは美しい
センサーデータを収集して可視化するサービスはいろいろありますが、最近 [Blynk](http://www.blynk.cc/) というサービスを知りました。他のサービスと比べて、特にBlynkはデザインが美しく、メインで使いたいなーって思うサービスです。

![IMG_6408.PNG](https://qiita-image-store.s3.amazonaws.com/0/129769/6bd8a642-c737-732f-9ad0-2401940cc283.png)

ただ、（私の調査不足かもしれませんが）アプリを起動していない時のデータは保存されていないようで、History Graphを見ると、その間のデータは抜けてしまっていました。

## ThingSpeakでデータを蓄積する
[ThingSpeak](https://thingspeak.com/) もデータの収集・可視化を行うサービスで、グラフをブラウザ上で見ることができます。Blynkのようにスマホのアプリを起動していない時でも、常にデータを収集してくれています。

## じゃあ両方使おう！あれ…うまくいかない？
ということで、

* リアルタイムのセンサーデータを見るのは Blynk
* 過去のセンサーデータを見るのは ThingSpeak

で行うようにしてみました。ところが、Blynkを使用しているとThingSpeakへのデータ送信が失敗するのです（ThingSpeak.writeFields()の戻り値が-302）。ThingSpeakのライブラリを使わずに、HTTPで直接アクセスするプログラムを書いてもだめでした。
　Blynkのアプリ側でオフラインにすると、問題なくThingSpeakに送信できます。もしかしてESP8266は同時に1コネクションしか通信できないのか…？

## 解決策：ThingSpeakに送信するときだけBlynkをオフラインにする
```c
void loop() {
  Blynk.run();
    :
  //数分おきに行うThingSpeakへ送信する処理
  if(...) {
    Blynk.disconnect();  // Blynkから切断
      :
    ThingSpeak.setField(1, tbuf);
    ThingSpeak.setField(2, hbuf);
    ThingSpeak.setField(3, pbuf);
    int code = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
      :
    Blynk.connect();  // Blynkに接続
  }
    :
}
```
これでThingSpeakにも接続できるようになりました。Blynkから切断している間はもちろんアプリからアクセスすることはできませんが、ThingSpeakへの送信は数分に1回ですし、1-2秒で完了するので、特に支障はないでしょう。

## やっぱりIoTクラウドサービスは便利
データを収集するだけなら簡単ですが、グラフを表示させるとなると自分で作るのは大変。過去のデータに加えて、最新のデータに更新していく処理を考えると、自分じゃ作りたくないですね。(^^;; なので、こうやってデータを可視化してくれるサービスは本当に助かります。

![FullSizeRender.jpg](https://qiita-image-store.s3.amazonaws.com/0/129769/96266463-af5b-f9f7-3667-102393343afd.jpeg)
Dockerでubuntu bashを起動してnginxを起動するまで（失敗編）


- dockerコマンドでubuntuを起動
    `$ docker run -it ubuntu bash`

- ubuntuが起動する

```bash:/etc/os-release
root@xxxxxxxxxx:/# cat /etc/os-release 
NAME="Ubuntu"
VERSION="16.04 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
UBUNTU_CODENAME=xenial
```

- apt-get update
    `# apt-get update`

- nginxのインストール
    `# apt-get install nginx`

- vimのインストール
    `# apt-get install vim`

- nginx.confの編集
    `# vim /etc/nginx/nginx.conf`

- nginxの起動
    `# service nginx start`

```
 * Starting nginx nginx                                        [ OK ] 
```

- プロセス確認
    `# ps -ef | grep nginx`

```
root       825     1  0 06:00 ?        00:00:00 nginx: master process /usr/sbin/nginx
www-data   826   825  0 06:00 ?        00:00:00 nginx: worker process
www-data   828   825  0 06:00 ?        00:00:00 nginx: worker process
www-data   829   825  0 06:00 ?        00:00:00 nginx: worker process
www-data   830   825  0 06:00 ?        00:00:00 nginx: worker process
root       837     1  0 06:03 ?        00:00:00 grep --color=auto nginx
```

- browser
起動したけどブラウザで見るための起動オプションをつけなかったのでブラウザで確認できなかった。
→やり直し
Excel 情報収集用マクロメモ1

※記載内容はメモとして作成しているため、修正が必要な部分があるかもしれません。


####**指定したWEBページから表をコピーするマクロ**


    With ActiveSheet.QueryTables.Add _
         (Connection:="URL;http://info.finance.yahoo.co.jp/ranking/?kd=1&tm=d&mk=1", _
         Destination:=Range("$B$8"))
                 
        .WebSelectionType = xlSpecifiedTables
        .WebTables = "1"
                 
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        
        .Refresh
         
    End With

**指定値**
Connection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;URL指定
Destination&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;貼り付け先指定
WebSelectionType = xlSpecifiedTables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webページ内の一部を取得する
WebTables = "1"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表１を指定、同ページ内で複数指定する場合は"1,2,3"と、要素番号を指定	


**テキスト形式を指定**
WebFormatting = xlWebFormattingNone
WebPreFormattedTextToColumns = True
VS2015のC#コードをVS2013で読み込むためのTips


Visual Studio 2015にバンドルされているC#のバージョンは6.0で、
Visual Studio 2013にバンドルされているC#のバージョンは5.0。

そのため、
VS2015で作ったコードにC# 6.0のコードが混じっているとVS2013で開いたときにビルドできない場合がある。

下記の手順を踏むことで、
(無理やり)VS2013にC# 6.0のビルドをさせるようにすることができる。


## .NET Compilersをインストール

ツール > Nugetコンソールより、下記のコマンドを実行
```
Install-Package Microsoft.Net.Compilers -Version 1.3.2
```

## Web.Comfigの変更

Webアプリの場合、そのままではIISのバージョンとかみ合わずにエラーになる。

langversionを6からDefault(=6)に変更することで、なんとなく通るようになる。

```xml
compilerOptions="/langversion:6 
```
を
```xml
compilerOptions="/langversion:Default
```
に変更


これでビルドが通るはず。