OmniAICreator/Qiita-1.07M huggingface dataset:
Python > dir({}) > dictオブジェクトの属性を返す

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
```

@shiracamus さんの[コメント](http://qiita.com/7of9/items/c1958d662ec776f7df61#comment-06571c9aff0fe06914ab)にて教えていただいた以下についての整理。

`>>> dir({})
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']
`

`{}`は何型か。

```
>>> type({})
<type 'dict'>
```

dirの用法。
https://docs.python.jp/3/library/functions.html#dir

> 引数がある場合、そのオブジェクトの有効な属性のリストを返そうと試みます。

上記で見られる個々のものは「属性」ということらしい。
UnityでResourceをLazy（遅延）ロードしたい

# あらまし

- Resourcesのリソースをインスタンス変数として持ちたい（AudioClipとか、Prefabとか）
- でもResources.Loadはランタイムにしか呼べない
- その変数が使われる時はランタイムであることが保証されている（StartとかUpdateとか）
- なんかLazyないっぽい？

**=> よし、Lazy作ろう**

# 結論

こんな感じのLazyクラスを作ればよい

```csharp
using System;
using UnityEngine;

namespace Hexat
{
    // Basic
    public class Lazy<TParam, TOut>
    {
        protected TParam param;
        protected TOut value;
        protected Func<TParam, TOut> provider;

        public Lazy(TParam param, Func<TParam, TOut> provider)
        {
            this.param = param;
            this.provider = provider;
        }

        public TOut Value
        {
            get { return value != null ? value : (value = provider(param)); }
        }
    }

    // Without initialization params
    public sealed class LazyObject<T> : Lazy<object, T>
    {
        public LazyObject(Func<T> provider) : base(null, o => provider())
        {
        }
    }

    // Resource
    public sealed class LazyResource<T> : Lazy<string, T> where T : UnityEngine.Object
    {
        public LazyResource(string path) : base(path, Resources.Load<T>)
        {
        }
    }
}
```

# 使い方

音を鳴らす感じのクラス

```csharp

using System;
using System.Collections.Generic;
using UnityEngine;

namespace Hexat
{
    public sealed class SoundManager : MonoBehaviour
    {
        private static LazyResource<AudioClip> LazyAudio(string name)
        {
            return new LazyResource<AudioClip>(name);
        }
        private Dictionary<string, LazyResource<AudioClip>> _clips = new Dictionary<string, LazyResource<AudioClip>>()
        {
            {Sounds.SE_PLAYER_CRASH, LazyAudio("Sounds/crash")},
            {Sounds.SE_PLAYER_JUMP, LazyAudio("Sounds/jump")},
            {Sounds.SE_PLAYER_EQUIP, LazyAudio("Sounds/equip")}
        };
        private Dictionary<int, AudioSource> _channels = new Dictionary<int, AudioSource>();
        private AudioSource GetChannel(int channel)
        {
            if (_channels.ContainsKey(channel)) return _channels[channel];
            return _channels[channel] = gameObject.AddComponent<AudioSource>();
        }

        private AudioClip GetClip(string clip)
        {
            return _clips[clip].Value;
        }
        
        public void Play(string key, int channel = 0)
        {
            var cnl = GetChannel(channel);
            var clp = GetClip(key);
            cnl.clip = clp;
            cnl.Play();
        }
    }
}

```
[CSS][メモ] IE11でflex-basisにbox-sizingが効かない

以下のような、よくあるボックス横並びのUIをコーディングしていて遭遇したのでメモ。

```css
ul {
  display: flex;
  flex-wrap: wrap;
  width: 960px;
  margin: 0 20px;
}

li {
  flex: 0 0 184px;
  height: 40px;
  padding: 10px;
  box-sizing: border-box;
}
```

上記のコードでChromeでは1行5列のリストが表示されるが、
IE11ではbox-sizingが効かず、5列目が落ちてしまう。

これに対処する為には、以下のように```max-width```を```flex-basis```と同値で指定する必要がある。

```css
ul {
  display: flex;
  flex-wrap: wrap;
  width: 960px;
  margin: 0 20px;
}

li {
  flex: 0 0 184px;
  max-width: 184px; /* ← これを追加 */
  height: 40px;
  padding: 10px;
  box-sizing: border-box;
}
```

これでIE11でも正しく表示できる。
AppCodeでQuickを実行する

AppCodeでQuickの実行(テスト)ってどうやるんだろう？って調べたのでメモ。
結果的には、XCTestを実行するのと同じようにすれば良いだけでした。

まずは`Run` - `Edit Configurations...`を選択し、

![スクリーンショット 2017-03-16 12.39.57.png](https://qiita-image-store.s3.amazonaws.com/0/6092/77bc515f-8036-c372-8c4c-332e81499e92.png)

`XCTest/Kiwi`の設定を追加します。

![スクリーンショット 2017-03-16 12.45.56.png](https://qiita-image-store.s3.amazonaws.com/0/6092/0b983d14-c8c4-79bf-f31c-ee4ac3c730c9.png)

一応`Single instance only`にしていますが、設定しなくても動きます。

![スクリーンショット 2017-03-16 12.46.42.png](https://qiita-image-store.s3.amazonaws.com/0/6092/a0e89e59-0a2d-0077-ec56-cbbb3b3f6a7c.png)

`Run` - `Run - '設定した任意の名前'`でテストを実行します。

![スクリーンショット 2017-03-16 12.56.10.png](https://qiita-image-store.s3.amazonaws.com/0/6092/1eb37426-1cd8-8509-2fec-573bb84499ae.png)

失敗する場合はデバイスの設定が漏れている可能性があるので、確認してください。

![スクリーンショット 2017-03-16 12.48.58.png](https://qiita-image-store.s3.amazonaws.com/0/6092/3080f0c9-96da-db72-a0e9-f424e7b664e2.png)

こんな感じで結果が表示されます。

![ValidationRuleUserIdTests_swift_-_ValidatorSample_-____mpos_ValidatorSample_.png](https://qiita-image-store.s3.amazonaws.com/0/6092/94c3c041-29ab-14c1-e996-cfaba8199b77.png)

任意のテストだけ実行したい場合はテストクラス内で`Run 'All in XXXX...'`を実行すれば良いです。

![スクリーンショット 2017-03-16 13.08.26.png](https://qiita-image-store.s3.amazonaws.com/0/6092/81ac7852-f176-99b1-994e-734a28e75783.png)

IntelliJ IDEAに慣れていたので、Xcodeよりはスムーズに扱えて良い感じです。
git で差分納品用の zipファイル を作成しつつ、不要なファイルは含めないようにする

あるコミット間の差分ファイルだけを取り出して、zip にまとめたい。かつ、一部条件のファイルは zip 内に含めたくない、という場合の設定方法です。

差分納品作業のときなどに便利。

### 【追記】

↓会社のブログに、もうちょっと丁寧に書き直しました
https://www.tam-tam.co.jp/tipsnote/program/post12992.html

---

# コマンド例

```
git archive master --format=zip -o output.zip --prefix=data/ `git diff --name-only --diff-filter=d tag1 tag2`
```

このコマンドと、 .gitattributes ファイルでの設定とを組合せます。



# 説明

## まずは git diff

tag1 と tag2 のコミット間の差分を取り出すには、以下

```
git diff --name-only --diff-filter=d tag1 tag2
```

`tag1` とかのところはタグでもブランチ名でもコミットIDでもかまわない

`--name-only` で、ファイル名のみをリスト出力する
`--diff-filter=d` で、削除されたファイルは出力させない (納品には不要なため)

## 次に git archive

指定されたブランチの、ファイルをまとめてくれる。

```
git archive master --format=zip -o output.zip --prefix=data/ (ここにファイルリストを入れる)
```

masterブランチを対象とし、`--format` で圧縮フォーマットをzipに指定、出力先を `-o` オプションで設定。
`--prefix=` は、圧縮ファイル内にフォルダ階層を作ってくれて便利。(末尾にスラッシュがないとフォルダを作らず、ファイル名のプレフィクスとなるので注意)

## 不要ファイルを除外する設定

たとえば `/dev/src` 配下のファイルは、zip内に含めたくないという場合。
.gitattributes ファイルにて設定が可能。

```
/dev/src export-ignore
```

このような記述の書かれた .gitattributes がある状態で `git archive` を実行すると、指定されたファイルやフォルダはアーカイブされなくなる。


## 以上を組み合わせる

前述の `git archive` の `(ここにファイルリストを入れる)` の部分に、`git diff` コマンドを埋め込む。
以上で、冒頭のコマンドとなります。

```
git archive master --format=zip -o output.zip --prefix=data/ `git diff --name-only --diff-filter=d tag1 tag2`
```

こんなかんじです。
Android Nougat(7.0)で表示崩れや挙動がおかしい場合に確認すること

AndroidユーザーでNougatを使っている人が少しづつ増えているが、7.0でのみ発生するレイアウト崩れや表示関連の不具合が発生した場合に第一に疑った方が良いこと。

# 表示サイズの変更
https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=ja
ここの「ユーザー補助機能の改善」の部分。

Android 7.0からディスプレイの表示サイズ(DPI)の変更が可能になり、端末全体で表示サイズを変更することが出来るようになった。
実際に変えているユーザーもいるらしい

設定の方法は
設定 → ユーザー補助 → 表示サイズ → スライダーでサイズを変更

もし謎な現象が起きていて、他のOSや端末だと再現できない、などがあれば試してみると良いかもしれない。
たとえばRecyclerViewでgetChildAt(0)をやると取得したいIndexのViewが正しく取得出来なかったりする場合もあるようなので注意したいところ。
※端末によって出たり出なかったり

一見すると些細な機能だけど意外とアプリへの影響があったりするので、
新しいOSが出た場合は、一通り新機能を試してみたほうがよさそう。
Vue.jsで実装されたformの値をフロント側からJavascriptで変更する

# 問題

WebViewアプリなどでやむを得ず`input`フォームにフロント側から値を入れたい場合に、通常であれば`value`に突っ込むだけで良かったのですが、Vue.jsだとそれだけでは裏側の値にまで反映されないみたいです。

# 解決法

`input`イベントを更新のトリガにしているようなので、`value`の変更後に呼んであげるだけでした。

```
document.getElementById('accountId').value = 'アカウントID';
document.getElementById('accountId').dispatchEvent(new Event('input'));
// 送信ボタンなど
document.getElementById('button').click();
```
CHIRIMENのファームをCMN2015-1_B2GOS-20170301に更新後にやること

# そのままでは今まで作ったWeb I2C API対応アプリが動かなくなる!

[CHIRIMEN](https://chirimen.org/)のイメージを現時点(2017/03/16)の最新である[CMN2015-1_B2GOS-20170301](https://github.com/chirimen-oh/release/releases/tag/CMN2015-1_B2GOS-20170301)に更新すると新しいスタートアップ画面やWeb I2C APIの品質改善などの恩恵が得られます。

しかし何も行わないと、アップデート前の環境で動作していたWeb I2C API対応のWebアプリが **そのままでは動作しなくなります！**

でも、ご安心ください。**簡単に対応させることができます。**
ここでは、その対処方法を書きます。

# 対処方法。→ **Polyfillを入れ替えるだけ！ アプリは修正の必要なし!**

以上！

でもいいんですが、一応やり方を書きますw

## 1. 新しいPolyfillをダウンロード

[CMN2015-1_B2GOS-20170301](https://github.com/chirimen-oh/release/releases/tag/CMN2015-1_B2GOS-20170301)に対応したPolyfillは、[CMN2015-1_B2GOS-20170301](https://github.com/chirimen-oh/release/releases/tag/CMN2015-1_B2GOS-20170301)のパッケージに含まれて居ます。

https://github.com/chirimen-oh/release/releases/tag/CMN2015-1_B2GOS-20170301 の `Downloads`から`CMN2015-1_B2GOS-20170301-2.zip`をダウンロードしてください。

![1](http://chrmn.dfm.lrv.jp/blog/replace/1.png)

zipファイルを展開すると、中にimageと一緒にPolyfillが入っています。

![2](http://chrmn.dfm.lrv.jp/blog/replace/2.png)

## 2. Webアプリに入っている古いPolyfillを削除

WebアプリのPolyfillがどこに入っているか?を確認しましょう。

ここでは、[CMN2015-1_B2GOS-20170301](https://github.com/chirimen-oh/release/releases/tag/CMN2015-1_B2GOS-20170301)リリース前に[chirimen-oh/examples](https://github.com/chirimen-oh/examples/tree/master)からダウンロードしたi2c-ADT7410のサンプルを例に話を進めます。

以前の[chirimen-oh/examples](https://github.com/chirimen-oh/examples/tree/master)では、`bower install`でPolyfillが導入されていましたので、下記のように`bowser_components/webgpio/dist`配下にPolyfillがインストールされています。

![3](http://chrmn.dfm.lrv.jp/blog/replace/3.png)

`bowser install`を使わずにインストールした場合、別の場所にあるかもしれません。
一旦、`index.html`から`webgpio.js`あるいは`webi2c.js`のパスを確認のうえ、Polyfillを **全て削除** してください。

## 3. 新しいPolyfillを入れる！

古いPolyfillを消しましたので、同じ場所に新しいPolyfillを入れましょう。


![4](http://chrmn.dfm.lrv.jp/blog/replace/4.png)

これで、Polyfillの差し替えは完了です。

新しくなったCHIRIMENをお楽しみください！
Slack経由でRaspberryPiにC/C++のソースをビルドさせる

# Slack経由でRaspberryPiにC/C++のソースをビルドさせる
## 1. はじめに
どうもISAOXです。
今回もSlack経由でRaspberryPiに何かやらせるシリーズです。
以下の投稿記事でSlack上でBOTに命令を出せば遠隔のRaspberryPi(以下RPi)のスクリプトを実行できるようになりました。
この記事の環境もこれをベースにしてます。参考下さい。

* [GitHub + Slack + RaspberryPiを用いたHUBOT開発環境の構築](http://qiita.com/IsaoNakamura/items/c6be85cf99d93c8d50a2)

今回は遠隔のRPiにC/C++のソースをビルドしてもらいます。
PC上でRPi向けのソースコードを修正し、ちょっとコンパイルが通るか確認したいことがあります。
これができれば、RPiに直接接続しなくてもRPi上でコンパイルが通るくらいは確認できます。
出先などRPiと離れた所にいてもSlackさえ使えればコンパイルができるわけです。

## 2. 前提条件
この記事の前提条件は以下です。

* インターネットに接続したRaspberryPi(Raspbian)がある。
* RPi上でHUBOTを起動できる環境にしている
* Slackを利用している + Slack上でHUBOT用のBOTを追加している。

## 3. RPiにC/C++のソースをビルドさせる道具の準備
RPi上でC/C++のソースをビルドさせるのはMakefileを使う前提とします。
Makefileがあるディレクトリでコマンドmakeを実行してビルドします。
`make`

なので、Makefileがあるディレクトリに移動してmakeを実行するShellスクリプトを用意してRPi上に配置します。
第１引き数にMakefileがあるディレクトリパスを指定する仕様です。

```make_bin.sh
#!/bin/sh

cd $1
make clean
make
```

## 4. RPi上のHUBOTがShellスクリプトを呼ぶ準備
RPi上のHUBOTが読み込むcoffeeスクリプトに『make』という文字列が来たら上記Shellスクリプトを呼び出す命令を追記します。
追記したらRPiを再起動するなどしてHUBOTが最新のcoffeeスクリプトを読み込んでおくようにしておきましょう。

```test.coffee
  robot.respond /make (.*)/i, (msg) ->
    target = msg.match[1]
    @exec = require('child_process').exec
    command = "sudo -u pi sh /home/pi/GitHub/StudyRPi/Hubot/iotbot/my_exec/make_bin.sh #{target}"
    msg.send "Command: #{command}"
    @exec command, (error, stdout, stderr) ->
    msg.send error if error?
    msg.send stdout if stdout?
    msg.send stderr if stderr?
```

## 5. Slack上のBOTにC/C++のソースをビルドしてもらうように命令する
Slack上でBOTに以下のようにしてC/C++のソースをビルドしてもらうように命令します。
するとBOTが反応しRPiのShellスクリプトを実行してくれました！
![Picture](https://github.com/IsaoNakamura/StudyRPi/blob/master/Hubot/image/sc_make.png?raw=true)
※上のスクリーンショットはSlack上の『DIRECT MESSAGES』上で入力しているので頭に指定するBOT名は省略してます。
国内初のウェブプッシュサービスbpushのOSS化と運営して学んだことについて

# bpushをオープンソースにしてみた

下記の記事を投稿したのが 2015年04月28日 で、もう少しで２年になります。

[ウェブにプッシュ通知をもたらすウェブサービス「bpush」を作った](
http://qiita.com/devneko/items/f50eb4d30edea83305f6)

この記事を投稿してから bpush はほんの少し話題になりました。それから約２年。
クラウドサービスとしてのbpushは2017年3月末をもってサービスをクローズし、
大幅に機能拡充してオープンソースソフトウェアとして公開することになりました。

https://github.com/dotneet/bpush

### 主な機能追加

 - Firefoxサポート(VAPID対応)
 - 日々の送受信数などの統計ページの用意
 - ユーザーをタグ付けするAPIの用意(指定タグのユーザーにAPI経由で通知を送信)
 - golangによる高速なAPIの追加

余談ですが、クリック数の計測のためのAPIがPHPだと間に合わないという問題がありまして、わりと最近ですがクリック数計測のAPIをgolangで書きました。
少し処理が違うのですが、PHP7 で 200req/s くらいだったものが 5000req/s くらいの速度になり久々に型付き言語の速度を実感しました。

技術的なところは下記でも少し説明していますのでよろしければ読んでみてください。
[ウェブサイトでプッシュ通知を行うサービス「bpush」で使っている技術](http://qiita.com/devneko/items/af8ad5bd94e09259e035)

基本的にPHP/Silexで作られています。ウェブプッシュを実装したい方は、PHPのサーバサイドやServiceWorker周りは参考になるかと思います。

## なぜサービスをクローズしたか

bpushは国内初のウェブプッシュ通知クラウドサービスでした。
しかし、いまでは法人によって安定的に運営された競合サービスが大量に存在します。___大量に！！___
いまとなっては機能・品質・安定度・信頼のどれをとってもbpushが優るところはないでしょう。
このためbpushをクラウドサービスとして残す意味はもはやありません。

## なぜオープンソースにしたか

既にクラウドサービスとして魅力のないbpushですが、自社データセンターなどで動かすための
ライセンス版の購入に関する問い合わせは現在もときどきあります。
コンプライアンスの問題や価格の問題からクラウド版を導入できない組織はそれなりに存在します。
ソースコードごと手に入るのなら、bpushにはまだ価値があります。

また、現在では自分が開発に携わるサービスにbpushを利用しています。
OSS化によってなんらかのフィードバックが得られればそのサービスにとっても有益なことです。

これらのことからbpushをオープンソース化することにしました。

というのが建前で、本当はGitHubのスターが欲しいだけです。
GitHubのスターを付けてくれると嬉しいです。
開発速度も上がるかもしれません。
___スターをください！___
https://github.com/dotneet/bpush

# bpush運営を通して学んだこと

ビジネスの人にはあたりまえなことですが、エンジニアな自分には下記のような意識が欠けていたと感じました。

### 参入障壁が低い分野はあっというまに競合が増える

現在世界にどれだけウェブプッシュ通知のクラウドサービスが存在すると思いますか？数えてないのでわかりませんが、100を超えててもおかしくないと思います。国内だけでも10は超えているでしょう。bpushが公開されてから半年くらいしてから(半年もしてないかも)同じく個人開発のpushnateさんが生まれました。それから更に半年のうちに３つほど法人が参入してきました。気づいていないだけでもっとあったかもしれません。
なんでこんなに競合が増えるのか。簡単です。簡単だからです。bpushの最初の公開バージョンは開発にたしか２週間かかっていないと思います。ファーストコミットが4月21日で記事の公開が4月28日なので、１週間強くらいかもしれません。知識があればそれくらい簡単に作れるものです。そしてビジネス的価値が容易に見いだせるものです。そりゃみんな作るよね。

### ビジネスをやりたかったら本気で

競合が増えると、宣伝や機能拡充など様々な対策をしなければユーザーは取られてしまいます。はっきり言ってしまうと、参入障壁が低くビジネス価値が見出しやすい分野で個人開発者が競合と戦うのは無理です。___だって仕事あるし。___ 開発も宣伝もやっている暇ないもん。
もしビジネスにしたいのだったら、仕事をやめてそれで生きていくつもりでやらないと駄目でしょう。

### 説明資料の整備とか法人化はやっぱり信用のうえで重要

企業で導入を検討される方はほとんど説明資料を求めてきます。そんなものないのでプレーンテキストで返していましたが、やはり信用に響くところはあったかと思います。あと個人のサービスだというところも信用に響いていた感はあります。

# 最後に

___スターください!!___

https://github.com/dotneet/bpush
Rust Language Server(RLS)でVisual Studio Codeの補完を行う

# 背景

Visual Studio Code(vscode)でRustコードを書く際、選択肢としてあるのが [vscode-rust](https://marketplace.visualstudio.com/items?itemName=kalitaalexey.vscode-rust) だったが、最近は[あんまり実装に時間取れないからrls-vscode使ってね(意訳)](https://github.com/editor-rs/vscode-rust)という事なので、そちらを使うことにする。

# 注意

**RLSは2017/12月現在まだα開発段階なので、仕様が変わる場合や、致命的なエラーが出る場合もあるので注意。**
何かあったら、`rustup update nightly`で取得できる最新版で直るのを待つか、ソースから何とかするしかない。

# Rust Language Server(RLS)とは

言語開発をする上で、IDEやエディタに補完機能、構文解析等の機能を統一的に提供するために定められた [language server protocol](https://github.com/Microsoft/language-server-protocol) のRustのための実装。
公式リポジトリは https://github.com/rust-lang-nursery/rls
2017/12現在ではまだnightlyだが、[安定版リリースは2018年前半を目標としているらしい](https://www.ncameron.org/blog/when-will-the-rls-be-released/)

# 用意するもの

* [Visual Studio Code](https://code.visualstudio.com/)
* [rustup](https://www.rustup.rs/)
    * http://qiita.com/chikoski/items/b6461367e8c3875bb235 を参考に
    * RLSが2017年12月現在でnightlyのものしかないので、nightlyツールチェインをinstallしておくこと
    * インストールさえしてしまえば、他のツールチェインでも大体使用可能(詳細は未調査)
* [rls-vscode(vscodeのrustプラグイン)](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust)

# RLSのインストール

**RLSがrustupに対応したので、rustupのみでインストール可能**

現在RLSは開発段階のものなので、正式なリリースは存在しない。そのため、ツールチェインはnightlyのものを使用する必要がある。
大体公式リポジトリの説明に書いてある内容。

1. `rustup update nightly`を実行してツールチェインをアップデートする
2. `rustup component add --toolchain=nightly rust-analysis` で、標準ライブラリのメタデータを取得
3. `rustup component add --toolchain=nightly rls-preview`でrls本体をインストール
4. `rustup component add --toolchain=nightly rust-src` で、rust本体のソースをDLする
    * 標準ライブラリのコード補完に必要で、gitから落としたソース( https://github.com/rust-lang/rust )があるならば必要ない

成功すれば、`rustup run nightly rls`を実行すると、rlsプロセスが起動する。(Ctrl+Cで停止)
コンポーネントの更新は、`rustup update nightly`で一括更新される

# vscodeプラグインの設定

ほとんどデフォルトで動作するが、`rust.cfg_test`は、テストプロジェクトがある場合はtrueにしておかないと、テストコードを解析してくれないので注意。

# 確認方法

1. コマンドプロンプトで、`cargo new --bin [プロジェクト名]`で新規プロジェクトを作成
2. ディレクトリが作成されるので、vscodeでフォルダを開く
3. .rsファイルを開いた時、下の方に`RLS: done`という表示が出ればOK

プラグインとRLSからの出力メッセージは"Rust Language Server"で確認可能。
詳しいメッセージが欲しい場合は、`rust-client.revealOutputChannelOn`を設定する。

# RLSの設定項目

まだ予告なしに変わるかもしれない段階なので、ここでは詳細に書かないが、
https://github.com/rust-lang-nursery/rls/blob/master/README.md の"Configuration"節を参考にしてRLSの挙動を制御できる。

基本的にはsettings.jsonに対応する項目があるので、それを設定する。

# 注意点

2017/12現在、Cargo.tomlで指定したような外部crateへの定義ジャンプは可能だが、[標準ライブラリにはジャンプできない](https://github.com/rust-lang-nursery/rls/issues/227)ので、
ウェブのドキュメントを合わせて読むようにすると良い。

## rls-previewが消える場合

nightlyの取得タイミングによっては、rls-previewが消えるらしいとのこと。
https://github.com/rust-lang-nursery/rls/issues/611
現在根本的な解決策を考えている段階らしいので、とりあえずの対処法を記しておく。

1. rls-previewが存在するバージョンを探す(記事執筆時点で確認されているのは`nightly-2017-12-01`)
2. `rustup install [確認したバージョン]`を実行して、特定バージョンのツールチェインを入れる
3. `rustup component add rls-preview rust-src rust-analysis --toolchain [確認したバージョン]` で必要コンポーネントをインストールする
4. vscodeのユーザー設定ファイルを開き、`rust-client.channel`の値に、確認したバージョンを入れる

どのバージョンが有効か、という効率の良い特定方法は現在調査中。

# 使ってみた感想

コード補完、文法エラー、定義に移動等、必要と思う機能は一通り揃っているため、割と制約が多いrustでは多いに開発の役に立つのではないかと思う。
ただし、メソッドチェーンでつなげた場合の補完がうまくいかなかったりなど、VSに慣れているとちょっと不便だなという所もまだある。
早く正式リリースになってほしいなぁと思う。
grep > link > bash scriptから使用している.nclファイルを表示する > $ grep -oh "\w*\.ncl" proc_vallatlon_170315_exec 

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
```

bash script

```proc_vallatlon_170315_exec
#!/usr/bin/env bash

# 

OUT_VALFILE="out_val_170315"
OUT_LATFILE="out_lat_170315"
OUT_LONFILE="out_lon_170315"

IN_LATLONFILE="LN-latlon_nc"

# TODO: 0m > change values for [ti]
# TODO: 0m > add parameters for input_filename
ncl -Q read_lat_lon.ncl ti=0 > $OUT_VALFILE

ncdump -v XLAT $IN_LATLONFILE | grep -A 9999 "XLAT =" | grep -v "XLAT" | tr "},;" " " > $OUT_LATFILE

ncdump -v XLONG $IN_LATLONFILE | grep -A 9999 "XLONG =" | grep -v "XLONG" | tr "},;" " " > $OUT_LONFILE

python calc_latlon_avg_std_170315.py 
```

上記は短いのでいいが、長くなったbash scriptから使用している.nclファイル(NCAR Command Languageファイル)を見つけるにはどうするか。

参考 http://stackoverflow.com/questions/1546711/can-grep-show-only-words-that-match-search-pattern

```
$ grep -oh "\w*\.ncl" proc_vallatlon_170315_exec 
read_lat_lon.ncl
```
Top N 件をとる効率的なHive / Prestoクエリ

遅いクエリを眺めてたら、Prestoでrow_numberを使ってナンバリングをした後に、rank<=10といったことをしているクエリが多々あった。
例えばPrestoだと、row_numberは全レコードを保持して処理するので、件数が多ければ多いほど遅いし、メモリ消費量もあれなことになる。例えば数億件でrow_numberをすると2~300GBピーク時に使ってそうだ。
https://github.com/prestodb/presto/issues/5298


なので、効率的なPrestoとHive0.13のクエリを書いておく。

# Presto

## ダメな例(row_number)

データ件数数億件で、30分以上かかっても終わらなさそう。

```sql
SELECT checksum(rnk)
FROM (
  SELECT row_number() OVER (PARTITION BY l_orderkey, l_partkey ORDER BY l_shipdate DESC) AS rnk
  FROM lineitem
) t
WHERE rnk = 1
```

## 良い例(rank)

数億件で1~2分程度で終わる。メモリ消費も数GB程度。

```sql
SELECT checksum(rnk)
FROM (
  SELECT rank() OVER (PARTITION BY l_orderkey, l_partkey ORDER BY l_shipdate DESC) AS rnk
  FROM lineitem
) t
WHERE rnk = 1
```

# Hive

## 悪いとまでは言わないけど良くない例(row_number, rank)

Hiveのrankやrow_numberはあんまりパフォーマンス的には変わらなそう。（コードまでは見てない。）
数億件で4~6分くらい。

```sql
SELECT count(rnk)
FROM (
  SELECT rank() OVER (PARTITION BY l_orderkey, l_partkey ORDER BY l_shipdate DESC) AS rnk
  FROM lineitem
) t
WHERE rnk = 1
```

```sql
SELECT count(rnk)
FROM (
  SELECT row_number() OVER (PARTITION BY l_orderkey, l_partkey ORDER BY l_shipdate DESC) AS rnk
  FROM lineitem
) t
WHERE rnk = 1
```

## 良い例 (each_top_k)

HiveというよりはHivemallの関数にeach_top_kがある。これはまさにTop N件を取得するための関数。
これを使うと3分くらいで処理が終わるようになる。下記の例では、COUNT用にMRの段数を1つ増やして3分なので、それを消せばもう少し早く終わるのではないかなと。


```sql
SELECT COUNT(rnk) FROM (
  SELECT each_top_k(
      1, concat(l_orderkey, '+', l_partkey), l_shipdate,
       l_orderkey, l_partkey
    ) as (rnk, l_shipdate,  l_orderkey, l_partkey)
  FROM (
    SELECT l_orderkey, l_partkey, l_shipdate
    FROM lineitem
    CLUSTER BY l_orderkey, l_partkey
  ) t0
) t1
```

ちゃんちゃん。
[EC2] SSH 接続時のログインメッセージにインスタンスタイプとかリージョンとか表示する

対象は Amazon Linux で動いてる EC2。
SSH接続して作業するときに、このインスタンスってどのインスタンスタイプで動いてたっけ？って知りたいときとかに便利。

こんな感じのシェルスクリプトを ```/etc/update-motd.d/40-instance-meta``` とかって名前で保存して実行権限与えておいてください。

```bash:/etc/update-motd.d/40-instance-meta
#!/bin/sh
instance_type=$(curl -s http://169.254.169.254/latest/meta-data/instance-type/)
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=$(echo ${az} | sed -e 's/[a-z]$//g')

cat << EOF
 INSTANCE TYPE : ${instance_type}
 REGION : ${region} (${az})

EOF
```

そのあとで ```update-motd``` コマンドを root 権限で実行すると、次回 SSH ログイン時からログインメッセージ変わります。あら便利

```
Last login: Wed Mar 15 15:05:40 2017 from xxx.xxx.xxx.xxx
      ___         _            __
     / _ | __ _  (_)_ _  ___  / /____
    / __ |/  ' \/ /  ' \/ _ \/ __/ _ \
   /_/ |_/_/_/_/_/_/_/_/\___/\__/\___/

https://aws.amazon.com/amazon-linux-ami/2016.09-release-notes/

 Nginx 1.11.10, PHP 7.1.2, Percona MySQL 5.6.35, WP-CLI 1.1.0

 amimoto     https://www.amimoto-ami.com/
 digitalcube https://en.digitalcube.jp/

 INSTANCE TYPE : t2.small
 REGION : ap-northeast-1 (ap-northeast-1c)

```
Visual Studio 2015でPlatform Toolsetが無いエラー

#概要
Visual Studio 2015で、ネットから入手したプロジェクトをコンパイルしたときに
```
MSB8020 The build tools for v120(Platform Toolset='v120') cannot be found.
```
でコンパイルできない。

#理由
もともとのプロジェクトはVisual Studio 2013でコンパイルしたことを想定して作られていて、Platform Toolset v120が必要だが、それが無いのでエラーになっている。

#対応
以下から、Microsoft Build Tools2013をダウンロードしてインストールすることで、
https://www.microsoft.com/en-US/download/confirmation.aspx?id=40760
これで、Platform Toolset v120がVisual Studio2015から使用できるようになります。

#補足
もともとVisualStudioはあまり経験がありません。ネットで得た知識を纏めて自分のために書いています。
詳しい方、間違いがあったら指摘してください。
keynote にハイライトしたコードを載せる

いつも使うオプションを忘れてしまうのでまとめ

```sh
highlight -O rtf -l -j 2 -s Candy -k 'VL Gothic' -K 24 index.js | pbcopy
```

| オプション名 | 意味 |
| --- | --- |
| `-O`| 出力形式 |
| `-l` | 行数表示 |
| `-j` | 行数の桁数 |
| `-s` | テーマ |
| `-k` | フォント |
| `-K` | フォントサイズ |

使えるテーマの一覧

```sh
highlight --list-scripts=themes
```

<kbd>highlight</kbd> 自体は HomeBrew でインストールする

```sh
brew install highlight
```
Dockerでエラーが出たので解消した（ERROR: Dependency conflict: an older version of the 'docker-py' package is polluting the namespace.）

### 環境
macOS Sierra
Version 10.12.3

Docker
Community Edition
Version 17.03.0-ce-mac2
Channel: stable
### エラー内容

ある日突然、Dockerを起動しようとしたら下記のエラーが発生

```shell-session
$ docker-compose up
ERROR: Dependency conflict: an older version of the 'docker-py' package is polluting the namespace. Run the following command to remedy the issue:
pip uninstall docker docker-py; pip install docker
```

言われたとおりにやってみても治らない(T_T)

```shell-session
pip uninstall docker docker-py; pip install docker
```



### 原因
最近はAWS Elastic Beanstalkを使うことが多いのですが、そのクライアントであるawsebcliで使ってるライブラリのVersionの相性がよくないよう
https://github.com/docker/compose/issues/4569#issuecomment-284891018

### 解消方法
virtualenvを使って仮想環境に EB CLI をインストールすることで回避
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install-virtualenv.html
ページの内容の通りにインストール

ebを使うときには仮想環境をアクティブ化します

```shell-session
$ source ~/eb-ve/bin/activate
```

再度Docker起動

```shell-session
$ docker-compose up
ERROR: Dependency conflict: an older version of the 'docker-py' package is polluting the namespace. Run the following command to remedy the issue:
pip uninstall docker docker-py; pip install docker
```

以下を実行

```shell-session
pip uninstall docker docker-py; pip install docker
```
※~/eb-ve/bin/activateにパスが通ってない状態で

### 動作確認

dockerが起動できるようになってると思います。

ebも確認

```shell-session
$ eb ssh
INFO: Attempting to open port 22.
INFO: SSH port 22 open.
..
 _____ _           _   _      ____                       _        _ _
| ____| | __ _ ___| |_(_) ___| __ )  ___  __ _ _ __  ___| |_ __ _| | | __
|  _| | |/ _` / __| __| |/ __|  _ \ / _ \/ _` | '_ \/ __| __/ _` | | |/ /
| |___| | (_| \__ \ |_| | (__| |_) |  __/ (_| | | | \__ \ || (_| | |   <
|_____|_|\__,_|___/\__|_|\___|____/ \___|\__,_|_| |_|___/\__\__,_|_|_|\_\
                                       Amazon Linux AMI
```

ssh、deployできればおｋ
linux > ファイル内の複数の文字(例: }と,と;)を空白に変換する > cat sample_170316.dat | tr '},;' ' '

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
```

サンプルファイル。

```
$ cat > sample_170316.dat << EOT
> 314,159,265;}
> EOT
```

```
$ cat sample_170316.dat 
314,159,265;}
```

上記のファイルから}と,と;を空白(' ')に変換したい。

trを並べる方法をしていたが、見通しが悪かった。

```
$ cat sample_170316.dat | tr "}" " " | tr "," " " | tr ";" " "
```

実はtr１つでできた。

```
$ cat sample_170316.dat | tr '},;' ' '
314 159 265  
```

シングルクォーテーションとダブルクォーテーションの使い分けは未消化。

参考 http://unix.stackexchange.com/questions/33110/using-sed-to-get-rid-of-characters

空白が不要の場合は、以下でいい。

```
$ cat sample_170316.dat | tr -d '},;' 
314159265
```

### 検索用キーワード

- remove characters
- sed
ChefTips: only_if, not_if は複数使える

Chef の Guard機能（only_if, not_if）が 1つのリソース内で複数 指定可能、というお話。
周知の事実なのかもだけど、公式マニュアルには書いてない？ようだったので。

Common Functionality: guard
https://docs.chef.io/resource_common.html#guards

only_if と not_if の混在も可能。
最終的に、一個でもskipしちゃうGuard条件があるとSkipされる

```bash
[root@vcent01 ~]# cat <<_EOL_ | chef-apply -s
execute "guard test" do
  user "root"
  command <<-EOM
    echo "execute"
  EOM
  only_if "exit 0"
  only_if "exit 0"
end
_EOL_

Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * execute[guard test] action run
    - execute     echo "execute"
```

```bash
[root@vcent01 ~]# cat <<_EOL_ | chef-apply -s
execute "guard test" do
  user "root"
  command <<-EOM
    echo "execute"
  EOM
  only_if "exit 1" # <- skip
  only_if "exit 0"
end
_EOL_

Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * execute[guard test] action run (skipped due to only_if) <- skipしちゃった
```

`only_if` と `not_if` の混在の例。

```bash
Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * execute[guard test] action run (skipped due to only_if)
[root@vcent01 ~]# cat <<_EOL_ | chef-apply -s
execute "guard test" do
  user "root"
  command <<-EOM
    echo "execute"
  EOM
  only_if "exit 0"  # <- only_if と not_if の混在も可能
  not_if "exit 1"
end
_EOL_

Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * execute[guard test] action run
    - execute     echo "execute"
```

混在してても最終的には 一個でもskipしちゃうGuard条件があればskip。

```bash
[root@vcent01 ~]# cat <<_EOL_ | chef-apply -s
execute "guard test" do
  user "root"
  command <<-EOM
    echo "execute"
  EOM
  not_if "exit 0" # <- skip 
  only_if "exit 0"
end
_EOL_

Recipe: (chef-apply cookbook)::(chef-apply recipe)
  * execute[guard test] action run (skipped due to not_if) <- skipした
```
jsファイルをGulpで自動圧縮(minify)

Gulpのインストールは「[SassをGulpで自動コンパイルする](http://qiita.com/ichigo_daifuku3/items/5394aa96c9e09e9d69a1)」に記載したので省略します。

# jsファイルを自動圧縮する手順

## Gulpプラグインをインストール
使いたいプラグインをインストールします。
今回は以下のプラグインを使用します。

javascriptの圧縮

    npm install gulp-uglify --save-dev

ファイル名変更

    npm install gulp-rename --save-dev

エラーハンドリング

    npm install gulp-plumber --save-dev


## gulpfile.jsの作成
gulpfile.jsを作成し、以下を記述します。
すでにgulpfile.jsがある場合は、必要な部分だけ追記します。

```javascript
var path = require('path');
var fs = require('fs');
var pkg = JSON.parse(fs.readFileSync('./package.json'));
var assetsPath = path.resolve(pkg.path.assetsDir);

var gulp = require('gulp');

// javascript minify
var uglify = require('gulp-uglify');
 
// file rename
var rename = require('gulp-rename');

// error handling
var plumber = require('gulp-plumber');

gulp.task('js', function() {
    gulp.src([path.join(assetsPath, 'js/**/*.js'),path.join('!', assetsPath, 'js/**/*.min.js')])
        .pipe(plumber())
        .pipe(uglify())
        .pipe(rename({extname: '.min.js'}))
        .pipe(gulp.dest(path.join(assetsPath, 'js/')));
});

gulp.task('default', function() {
    gulp.watch([path.join(assetsPath, 'js/**/*.js'),path.join('!', assetsPath, 'js/**/*.min.js')],['js']);
});
```

## package.jsonにパスを追記
gulpfile.jsを他のプロジェクトでも使い回したいので、パスはpackage.jsonに記述するようにします。

```json
"path": {
    "assetsDir": "./assets/"
},
```

## 実行
以下のコマンドを実行します。

```
gulp
```

すると、監視状態になり、jsディレクトリ内のjsファイルが変更・保存される度に自動で圧縮され、min.jsファイルができるようになります。
Vue.js でUnittestする時 nextTick() の使い方が使うブラウザによって変わる

#前提
- Vue.js 2.1.1
- karma + mocha + chai


#経緯

1. Vm のデータを更新後、画面上の表示文字列が変わることを確認する Unittest を書いた
2. 当初 browser に PhantomJS を指定していたが、Chrom に変更した
3. assert がうまく出ない！！

#原因

1. Vue.nextTick() が ブラウザの Promise サポート有無によってい使い方が変わる

- ブラウザが Promiseをサポートしない nextTick() のコールバックを指定する (PhantomJS)

```js
   it('画面が更新される', function(done) {
      cmp.upate_value = 'test';
      Vue.nextTick(function() {
          expect(cmp.$el.textContent).to.equal('test');
          done();
      });
   });
```

- プラウザが Promiseをサポート する nextTick() は コールバックをサポートせず、Promise を返す (Chrome など)

```js
   it('画面が更新される', function(done) {
      cmp.upate_value = 'test';
      Vue.nextTick()
      .then(function() {
          expect(cmp.$el.textContent).to.equal('test');
      })
      .then(done)
      .catch(done);
   });
```

# 解決案

- Waitしてくれる関数を定義する

```js
/**
 * 更新待ち
 * @param {function} callback
 * @param {function} done
 */
function waitForUpdate(callback, done) {
    /** Promise がサポートされている場合、Promise が返される **/
    if(typeof Promise !== 'undefined' && isNative(Promise)) {
        Vue.nextTick().then(callback).then(done).catch(done);
    }
    /** Promise がサポートされていない場合、Callbackを指定する **/
    else {
        Vue.nextTick(function () {
            callback();
            done();
        });
    }
}
function  isNative(Ctor) {
    return /native code/.test(Ctor.toString());
}
```

テストはこんな感じ

```js
   it('画面が更新される', function(done) {
      cmp.upate_value = 'test';
      waitForUpdate(function() {
          expect(cmp.$el.textContent).to.equal('test');
      },done);
   });
```
[CSS] display プロパティを変更できない要素

テキストボックス (`input` 要素) やボタン (`button` 要素)は、 `display` を `inline-block` 以外に変更することができません。`display: none` にはできます。

`<button>`の中にテキストとアイコンを表示して、上下中央に揃えたいときなど、ボタンに `display: flex` や `display: inline-flex` を指定したくなることはありますが、残念ながらできません。

嘘のように思うかもしれませんが、残念ながら本当です。次のサンプルコードで確認することができます。

## サンプルコード

```html
<!-- とりあえず span で試してみます -->
<span>Span</span>

<!-- input -->
<input type="text" value="Input">

<!-- button も確認 -->
<button type="button">Button</button>
```

```scss
span,
input,
button {
  display: block; // display を block にすることで、幅 100% になることを期待
  background-color: pink; // デバッグ用に色を付けます
}
```

## 結果

![image](https://qiita-image-store.s3.amazonaws.com/0/42519/79594c20-e0f3-6e2b-8a90-792177aaef9b.png)

[デモはこちら](https://jsfiddle.net/0k9Lqps4/)

`span` の場合は幅が 100% になっているのに、`input` や `button` は幅が変化していません。

## display: inline-block から変更できない要素

W3C にこのような記述があります。

> When the button binding applies to a **button element**, the element is expected to render as an **inline-block** box rendered as a button whose contents are the contents of the element.

引用元: https://www.w3.org/TR/html51/rendering.html#rendering

つまり、**ボタン は inline-block としてレンダリングされます**ということ。

このような要素をすべて挙げると以下の通りです。上のページ内を `inline-block` で検索しました。

- button 
- input (type=image と type=hidden を除く)
- meter
- progress
- select
- textarea
- (keygen)

開発者ツールで見てみると `display` が変更できているように見えますが、実際には変わっていません。なお、変更できないと言っても、最初に書いた通り、`display: none` は設定できます。

## 置換要素

さらに、 **置換要素** と呼ばれる要素があり、これらも CSS の扱いが特殊なので注意が必要です。「埋め込みコンテンツ」と「画像」が置換要素で、 上のリスト除外した `input[type=image]` も置換要素のひとつです。

置換要素一覧：

> 10.4 Replaced elements
> 10.4.1 Embedded content
> 10.4.2 Images
> 10.4.3 Attributes for embedded content and images
> 10.4.4 Image maps

引用元: https://www.w3.org/TR/html51/rendering.html#replaced-elements

置換要素ってなんでしょうか？ MDN には次のように書かれています。

> CSS において、置換要素は CSS のスコープの外で表現される要素です。 CSS の整形モデルとは独立して表現される外部オブジェクトです。
> 
> もっと簡単な言葉で言い換えれば、コンテンツが現在の文書のスタイルに影響されない要素です。置換要素の位置は CSS を使用して変更することができますが、置換要素自身のコンテンツは違います。 <iframe> のような一部の置換様子では、独自のスタイルシートを持つことができますが、親文書のスタイルは継承されません。
> 
> CSS が置換要素において影響できることは、要素のボックス内におけるコンテンツの位置の制御に対応するプロパティがだけです。詳しい情報はコンテンツボックス内のオブジェクト位置の制御をご覧ください。

引用元: https://developer.mozilla.org/ja/docs/Web/CSS/Replaced_element

まとめると以下のようになります。

## まとめ

display プロパティを変更できない要素:

- フォームコントロール系
    -  button, input, meter, progress, select, textarea, keygen

CSS の扱いが特殊な要素:

- 埋め込みコンテンツ
    - embed, iframe, video, canvas, object, (applet), audio
- 画像
    - img, input[type=image], map, area

[すべてのデモはこちら](https://jsfiddle.net/aefuuoj5/)
ec2_group_factsモジュールをAnsible2.2で使えるようにする




AnsibleでAWSリソースの情報を取得する*_factモジュールは何かと便利なのですが、セキュリティグループの情報を取得するためのモジュールであるec2_group_factsは、Ansible2.2xでは使えません。

[公式ドキュメント](http://docs.ansible.com/ansible/ec2_group_facts_module.html)によると
> New in version 2.3.

とのこと。

他のfact系モジュールは使えるのになんでこれだけ。。。と思ってたら[ansible-modules-extras](https://github.com/ansible/ansible-modules-extras/blob/devel/cloud/amazon/ec2_group_facts.py)にありました。

早速使えるようにしてみましょう。

まず、モジュールを格納するディレクトリを決めます。
今回はカレントディレクトリにlibraryというディレクトリを作成します。

```command
$ mkdir ./library
$ cd library
```


モジュールをダウンロードします。

```command
$ curl -O https://raw.githubusercontent.com/ansible/ansible-modules-extras/devel/cloud/amazon/ec2_group_facts.py
```


ansible.cfgでモジュールのディレクトリを指定します。
[defaults]に下記を追記します。

```bash:ansible.cfg
[defaults]
library = ./library
```

このモジュールにはboto3が必要なので、インストールします。
OSX El Capitanの場合

```command
$ sudo -H pip install boto3 --ignore-installed six
```

これでec2_group_factsモジュールが使えるようになりました。
jQueryで英数字にルビを振る

サーバーから出力された英数字にルビを振って欲しいと依頼が来たが、結局実装することはなく、せっかくなので備忘録もかねて。

````html:html
<p class="txt">HOGEHOGE123</p><!-- ここのテキストがサーバーから出力された文字列と仮定する -->
<ruby class="txt-kana"></ruby>
````

````js:jQuery
$(function(){
    var txt = $('.txt').text();
    var kana = $('.txt-kana');
    // 英数字とルビを連想配列にする。
    var str = {
        "A": "えー",
        "B": "びー",
        "C": "しー",
        "D": "でぃー",
        "E": "いー",
        "F": "えふ",
        "G": "じー",
        "H": "えいち",
        "I": "あい",
        "J": "じぇー",
        "K": "けー",
        "L": "える",
        "M": "えむ",
        "N": "えぬ",
        "O": "おー",
        "P": "ぴー",
        "Q": "きゅー",
        "R": "あーる",
        "S": "えす",
        "T": "てぃー",
        "U": "ゆー",
        "V": "ぶい",
        "W": "だぶる",
        "X": "えっくす",
        "Y": "わい",
        "Z": "ぜっと",
        "0": "ぜろ",
        "1": "いち",
        "2": "に",
        "3": "さん",
        "4": "よん",
        "5": "ご",
        "6": "ろく",
        "7": "なな",
        "8": "はち",
        "9": "きゅう"
    };

    for (var i = 0; i < txt.length; i++) {
        kana.append('<p>' + txt[i] + '</p>' + '<rt>' + str[txt[i]] + '</rt>');
    }
});
````

`txt[i]`には`HOGEHOGE123`が以下のように順番に入る。

````
H
O
G
...
````

`str["A"]`のキーで、値の「えー」を取得できる。
`str[txt[i]]`とすると、順番に
`str["H"]`
`str["O"]`
`str["G"] ...`となるので、それぞれの値「えいち」「おー」「じー」...を出力する。

`append()`で`<ruby>`に表示。
`<ruby>`はデフォルトだと、テキストの上に表示されるので、以下画像のようになる。

<img width="202" alt="スクリーンショット 2017-03-16 10.36.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/105520/1f1df8b8-fc81-5ce7-d1e3-7b7a717e44ec.png">

最終的にすごい簡単なコードで実現できたが、やたらと時間がかかってしまい、ロジックの考え方がまだまだだなと認識させられたので自戒を込めて投稿。
二分木をブラウザにカッコよく描画する

# 二分木を動的にブラウザ上で表示したい

Webアプリケーションで[二分木](https://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86%E6%9C%A8)に限らず、ノードとエッジのあるグラフを表現したくなることがあります。

この記事では以下のような二分木をvis.jsを用いて作成する際のエッセンスをまとめます

![binalytree.png](https://qiita-image-store.s3.amazonaws.com/0/19483/60ad3bea-357c-2d1e-ab85-6cf9a82f51ea.png)

# 動くサンプル
jsfiddle にサンプルを書いておきました
https://jsfiddle.net/seiketkm/fxy5rtkd/

表示されている二分木が操作可能（拡縮、選択、移動、引っ張りなど）なのがとても面白いです。

# ライブラリ

[vis.js](http://visjs.org/) のnetworkモジュールを使っています。
この記事内ではほかのものは一切使ってないです。

# エッセンス

二分木として表示するために重要なのは、表示時のオプションです。
ドキュメントは[このあたり](http://visjs.org/docs/network/layout.html#)に記載があります。
hierarchicalに以下二つを指定しています。

### direction

上下関係を設定します。```"UD"```の指定で上にrootノード、下に枝葉が表示されます。
指定しない場合は広がるように描画されます。
参考；[広がるような描画例](http://visjs.org/examples/network/basicUsage.html)

### sortMethod

```"directed"``` を指定することでエッジ（ノード間の連結）の向きに基づいて親子関係が描画されます。
指定しない場合は```"hubsize"```がデフォルト値で採用されて、ノードがつながるエッジの数が多いものがroot扱いになります。

```javascript:options
var options = {
	layout: {
	    hierarchical: {
	        direction: "UD",
	        sortMethod: "directed"
	    }
	}
};
```

# まとめ

vis.jsを用いてノードとエッジのあるグラフ構造を描画できる。
vis.jsの提供するグラフの操作感はかなり強力。

# 次やること

ノード/エッジ操作時のイベント処理をしていきたい所存です
Amazon Pollyを触ってみる

##Amazon Pollyとは

Amazon AI サービスの1つで、文章をリアルな音声に変換するサービスです。
現在では、24の言語と47の音声が利用可能です。
プレーンテキストか、SSMLのどちらかから、音声を生成します。

公式ドキュメント：http://docs.aws.amazon.com/ja_jp/polly/latest/dg/what-is.html


##SSMLでの音声生成
Pollyではテキストをそのまま読んでくれますが、
SSMLで記述するれば、発音、ボリューム、話す速度などをカスタマイズすることも出来ます。

ex)

```xml:
<speak><prosody volume='-10dB' pitch='x-low' rate='x-slow'>こんにちは<break time='3s'/>元気？</prosody></speak>
```

このように、音量、ピッチ、スピードを調整できます。
\<break time='3s'/>を入れることで、3秒間隔を空けることもできます。

Pollyでは日本語の声はMizukiさんという女性の声が用意されていますが、
このSSMLを再生させると、おばあさんみたいな声になりました。

その他、SSMLについては下記を参照ください。
https://www.w3.org/TR/2010/REC-speech-synthesis11-20100907/



##Lexiconsの設定
Lexiconを登録することで、単語の発音をカスタマイズできます。
たとえば、PPAPという文字列をペンパイナッポーアッポーペンと読ませることが出来るようになります。
やり方は、こちらのファイルをLexiconにアップロードし、音声生成の際に指定すればOKです。
ただし、残念ながら日本語は未対応のようです。

```xml:test.pls
<?xml version="1.0" encoding="UTF-8"?>
<lexicon version="1.0"
      xmlns="http://www.w3.org/2005/01/pronunciation-lexicon"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/2005/01/pronunciation-lexicon
        http://www.w3.org/TR/2007/CR-pronunciation-lexicon-20071212/pls.xsd"
      alphabet="ipa" 
      xml:lang="es-US">
  <lexeme>
    <grapheme>PPAP</grapheme>
    <alias>pen pineapple apple pen</alias>
  </lexeme>
</lexicon>
```




##APIで音声を生成する
SynthesizeSpeechというAPIを呼び出すことでも、音声をmp3ファイルに出力したり、ストリームで受け取ることができます。

JavaScriptで実行する際を例に記載します。

```js:
var params = {
  LexiconNames: [
    "example",
    //複数指定可
  ],
  OutputFormat: "mp3" | "ogg_vorbis" | "pcm", //必須
  SampleRate: "8000" | "16000" | "22050", 
  Text: "STRING_VALUE", //必須
  TextType: "ssml" | "text"
  VoiceId: "Mizuki", //必須
};
polly.synthesizeSpeech(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});
```

- SampleRateに指定できる値

|OutputFormat|SampleRateに指定できる値|デフォルト値|
|:-----------------|:-----------------|:-----------------|:-----------------|
|mp3, ogg_vorbis|8000, 16000, 22050|22050|
|pcm|8000, 16000|16000|

- TextTypeのデフォルト値：text（プレーンテキスト）


**Response Elements**

- ContentType

|リクエストのOutputFormat|返されるContentType|
|:-----------------|:-----------------|
|mp3|audio/mpeg|
|ogg_vorbis|audio/ogg|
|pcm|audio/pcm|

- RequestCharacters
合成された文字の数。

- AudioStream- （Buffer, Typed Array, Blob, String, ReadableStream）
合成音声を含むストリーム。

参考：http://docs.aws.amazon.com/ja_jp/polly/latest/dg/API_SynthesizeSpeech.html#API_SynthesizeSpeech_ResponseSyntax
詳細はこちらをご覧ください。


##最後に
日本語の文章だと、聞き取りずらいこともありますが
英語の発音はしっかりしているみたいです。

今度はPollyでメールか何かを音声として出力してみようかと考えています。
View Paths 和訳（Railsガイド）

&nbsp; [RailsGuide](http://guides.rubyonrails.org/) の[View Paths](http://guides.rubyonrails.org/action_view_overview.html#view-paths) の部分が、日本語訳では、本投稿作成時において、[(執筆予定)](https://railsguides.jp/action_view_overview.html#%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E3%83%91%E3%82%B9) となっていましたが、ほんの十数行なのでちょろっと和訳してみました。以下で(　)は原文を補足するために追加した部分です。

>
# 5 ビューのパス
>
&nbsp;&nbsp;レスポンスをレンダリングする時に、コントローラは個々のビューが（ファイルシステム上の）どこに存在するのかを解決する必要があります。デフォルトでは、コントローラは`app/views`ディレクトリの中だけを探します。
&nbsp;&nbsp;（このデフォルトの動きに加えて、）`prepend_view_path` および `append_view_path` を使うことで、（`app/views`ではない）他の場所をビューの探索対象に加え、それらに（探索対象としての）順位を付与することができます。
>
## 5.1 Prepend view path
>
&nbsp;&nbsp;このメソッドが便利なのは、たとえば、サブドメインへのアクセスに対して、（app/views　ではない）異なるディレクトリにビューを配置したいときです。
&nbsp;&nbsp;こんな風に使います。

```ruby

prepend_view_path "app/views/#{request.subdomain}"

```
>
&nbsp;&nbsp;こうすると、ビューのパスを解決するときに、まず最初に、（app/views　ではなく）指定されたディレクトリの中を探します。
>
## 5.2 Append view path
>
&nbsp;&nbsp;同様に、以下によってもビューの探索パスを追加できます。

```ruby

append_view_path "app/views/direct"

```
>
これによって、app/views/direct が、探索パスのうちの最後のパスとして追加されます。


以上です。
和訳のおかしいところあれば、ご指摘ください。m(_ _)m
Cognos パフォチュー事例 - DMRとリレーショナルの混在

##概要
何度かCognosプロジェクトのパフォーマンスチューニング支援で見かけた問題です。
DMR(Dimensionally Modeled Relational)のモデルと、リレーショナルのモデルを1つのクエリー内に同居させていて、レポート実行のパフォーマンスが悪化している事例です。

##説明
リレーショナルモデルとは、Framework Managerでモデルを作成した際に、下図の青枠のようなクエリーサブジェクトのセットとして構成されるモデルです。一般的に使用されているモデルです。
DMRとは、同じくFMでモデル作成時に、オレンジ枠のように階層構造を持ったディメンションベースで構成されているモデルです。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/3baadfa9-6d9d-3e82-fa14-343fe6a279c9.png)

これらのモデルは、1つのパッケージ上に共存させることも、1つのクエリー上に共存させる事も可能なのですが、1つのクエリー上に共存させた場合、レポート実行時に「ローカル処理」が発生して、レポートのレスポンス遅延が現れやすくなります。
「ローカル処理」とは、リレーショナルモデル側の結果セットと、DMRモデル側の結果セットを結合する際に、データベース上で行うのではなく、Cognos BIノード上に両結果セットを持ってきて、Cognos BIノード上で結合処理を行う事を言います。
「ローカル処理」は、基本的に1CPUコアで処理されますので、データベース上で処理を行うより、処理時間が長時間化する事になります。

レポートを開発する際は、この様なDMRモデルとリレーショナルモデルの混在が無いか、常に注意する事が必要と覚えておいて頂ければと思います。
JAWS-UG情シス支部 第8回議論会からの学び

JAWS-UG情シス支部 第8回議論会に参加してきました。
そこで出た話題などを踏まえて、自分のまとめをしたいと思います。
※8回そのもののまとめではなく、踏まえた学びのお話し。

# AWSアカウント

##複数利用の是非

* 開発と本番で分離するか、サービスごと、パートナー先、部門毎etcと話題に出たけど絶対解は無さそう
* 全体的な傾向としては会社管理のアカウントは右肩上がりに増える傾向にはあった

##アカウント権限の付与

* [rootユーザーは使用しない](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_root-user.html)。これはAWSの推奨事項。
* IAMユーザーの発行については、会社規模、AWSに関わる人数規模次第。
* 多数のAWSアカウントと権限発行が必要な場合はIAMユーザーでは運用が回らないので、Active Directoryなどの[既存認証基盤で管理](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/introduction_identity-management.html#intro-identity-federation)する

##権限付与とログ監査

* 権限付与は最小限に絞らないと怖い。絞り切れないのなら、最低限Denyは設定する。[CloudTrail](https://aws.amazon.com/jp/cloudtrail/)は変更できないようにする
* CloudTrailのログ監査については実運用としては厳しい印象。
* 参考としては、先日のJAWS Daysの[知らない間に使われていませんか？ ～AWSの利用監査対策～](http://jawsdays2017.jaws-ug.jp/session/1786/)が同様の話題。そこではSumoLogicを使用してWeeklyレポートの送付や、不審な操作はリアルタイムアラートをしているとの紹介。

#ec2-user

* ec2-user についても絶対解はない。
* AWSとしては、「新しいユーザー用にユーザーアカウントを作成することは、ec2-user アカウントへのアクセス権を複数のユーザーに (経験のないユーザーも含めて) 与えるよりも、はるかに安全です。」との[説明](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/managing-users.html)。
* ec2-userは削除しても実害はないようなので、削除かSSH禁止にするのもあり。実施方法は、[ここ](http://qiita.com/yangci/items/ef2ab9b6f0d28bad0881#ec2-user%E3%81%AE%E5%89%8A%E9%99%A4)がわかりやすい
* EC2のOSにログインしなくても困らないような環境にしていくのが幸せかな。
Githubでmentionされた通知だけをLambdaでまとめてSlackに通知したい! (改)

## 概要

本人専用のGithub通知をSlackに投げるツールを作成しました。
https://github.com/gaishimo/github-participating-notifications

以前にも以下で同じ用途のものを作成したのですが、コードとか色々と古くなっているので、もう一度しっかり作り直してみようということで、新たに再作成しました。
[Githubでmentionされた通知だけをLambdaでまとめてSlackに通知したい! - Qiita](http://qiita.com/gaishimo/items/a6299cf47c491f8324bf)



## これはどういったもの?

Lambda Functionを定期的に実行し、自分宛のParticipating通知があったら以下のような形でSlack Channelにメッセージを送ります。

<img width="573" alt="slack_message_format.png" src="https://qiita-image-store.s3.amazonaws.com/0/10393/5ffdb582-1f44-28af-d517-82c5f67e5756.png">

自分にmentionされたコメントや、自分の関わっているIssueやPull Requestに対し変更があった場合に早く気付くことを目的としています。

自分のPull Requestに対して相手からコメントがあった場合や、相手がIssueで自分をメンションしてコメントしてきたのにすぐに気づかなくて対応が遅れたりといったケースって結構あるのではないかと思います。そういった場合にすぐに気づけば早くアクションを起こすことができ、開発もスピーディに進みます。

既存のSlackのGithubアプリやWebhookを使ったりすることで通知すること自体は出来るのですが、それらはリポジトリ単位でチーム全体に通知するものであり、個人のためのものではありません。個人専用にプロジェクト横断的にまとめてParticipating通知をコメントしてくれるものが欲しいということで作成しました。

## 技術

コードはES2017(Babel)で記述しています。

AWS Lambdaのデプロイには[Claudia.js](https://claudiajs.com/)を使います。
Claudia.jsはLambdaのデプロイツールです(詳しくは[こちら](http://qiita.com/gaishimo/items/42b2a31db320a843391f))。

## 使い方

### 事前準備

リポジトリをCloneします。

```
git clone git@github.com:gaishimo/github-participating-notifications.git
```

AWSアカウント(IAM Profile)とAWS CLIを用意、Claudia.jsのCLIツールをインストールします。
こちらを参照: [Installing and configuring Claudia.js](https://claudiajs.com/tutorials/installing.html)

### 設定値の用意

GithubのPersonal Tokenと、SlackのWebhook URLを用意し、値を`env.json`に指定します。

```
cat <<-EOS > env.json
{
  "GITHUB_TOKEN": "<your Github personal access token>",
  "SLACK_WEBHOOK_URL": "<your Slack WebHook url>"
}
EOS
```

GithubのPersonal Tokenは、`repo`と`notification`のscopeを持っている必要があります。
Webhookは自分専用のChannelのものを指定してください。

### 通知テーブル(DynamoDB)の作成

既に通知したNotificationを保存するために、DynamoDBのテーブル(`github_notifications`)を作成する必要があります。

以下のAWS CLIコマンドで作成できます。

```
aws dynamodb create-table \
  --table-name github_notifications \
  --attribute-definitions AttributeName=id,AttributeType=N AttributeName=at,AttributeType=S \
  --key-schema AttributeName=id,KeyType=HASH AttributeName=at,KeyType=RANGE \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
  --query TableDescription.TableArn --output text
```

### デプロイ

デプロイは、以下のコマンドで実行できます。

```
npm run create
```

実際は以下のコマンドが実行されます。

```
npm run transpile && claudia create --name github-participating-notifications --handler bin/lambda.handler --region ap-northeast-1 --set-env-from-json env.json --policies policies --timeout 10
```

regionは`ap-northeast-1`になっていますが、必要に応じて変更します(package.json)。


### 実行テスト

以下でLambdaを直接実行できます。通知が無ければ特にSlackにメッセージはコメントされません。

```
npm run test-lambda
```

### スケジューリング設定

Lambdaが定期的に実行されるようにスケジューリング設定します。以下のclaudia.js CLIのコマンドで設定できます。

```
claudia add-scheduled-event \
  --name simple-lambda-scheduled-event \
  --event event.json \
  --schedule 'rate(5 minutes)'
```

`--schedule 'rate(5 minutes)'`の部分を各自適切な時間に変更してください。

以上で自分専用の通知が走り出します!
Crystal Reports installation error on Windows 7 x86 32bit

as of March 15, 2017

**UPDATE**
Fixed at 
SAP Crystal Reports, developer version for Microsoft Visual Studio - **Service Pack 16** and after

https://wiki.scn.sap.com/wiki/display/BOBJ/SAP+Crystal+Reports%2C+developer+version+for+Microsoft+Visual+Studio+-+Service+Pack+16+-+Fixed+Issues


---

There had been a bug in SAP Crystal Reports, developer version for Microsoft Visual Studio prior to **Service Pack 16**

https://wiki.scn.sap.com/wiki/display/BOBJ/SAP+Crystal+Reports%2C+developer+version+for+Microsoft+Visual+Studio+-+Service+Pack+15+-+Fixed+Issues

- How to FIX

>Installing onto Windows 10 x86 format indicates there is no VS installed - as a temporary workaround create the 64 bit regsitry key the installer is looking for:

>HKLM\SOFTWARE\Wow6432Node\Microsoft\DevDiv\vs\Servicing\14.0\professional

>Create key named “Install” REG_DWORD and value as 1
Python > set > set()にて変換 > dictionaryはkeyだけになる > dictionaryのvaluesをsetに変換する方法を教えていただきました / dir({}) / help({}) / help({}.values)

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1721 / 12833)

> You can create a set from a list, string, tuple, or dictionary, discarding any duplicative values.

試した。

http://ideone.com/y39M6a

```py
astring = set( 'letters' )
print(astring)

alist = set( [ 3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])
print(alist)

atuple = set( (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5))
print(atuple)

adict = set(  { 'item1': 'double edged sword', 'item2': 'Korejanai Robo'} )
print(adict)
```

```txt:結果
Success	time: 0 memory: 23304 signal:0
set(['s', 'r', 'e', 'l', 't'])
set([1, 2, 3, 4, 5, 6, 9])
set([1, 2, 3, 4, 5, 6, 9])
set(['item2', 'item1'])
```

dictionaryはkeyだけになる。

@ No.1731 / 12833

> When you give set() a dictionary, it uses only the keys:

### 教えていただいた事項

@shiracamus さんの[コメント](http://qiita.com/7of9/items/c1958d662ec776f7df61/#comment-84bc16dbf992ba52ed26)にてdictionaryのvaluesを取り出す方法を教えていただきました。

以下についても教えていただきました。

- `dir({})`
- `help({})`
- `help({}.values)`

情報感謝です。
PHP-FPM+Apacheの環境で、PHP側でDigest認証をかける

ディレクトリ単位でなく、もっと細かく制御してDigest認証をかける必要が出てきたので、PHP側で制御しようと思ったのですが、ちょっと引っかかってしまいました。

# CodeIgniter用ライブラリ
システムのベースがCodeIgniterだったので、適したライブラリ（[あずみさん作](http://a-zumi.net/codeigniter-digest-auth-library/)）を入れて、Digest認証を行うこととしました。

…ところが、正しいパスワードを何度入れても認証画面が消えず、認証を通すことができませんでした。

# 立ちはだかる壁
Apacheと一体化する`mod_php`と違って、PHP-FPMは別プロセスで動いているので、相互のデータのやり取りでうまくいかないことがあります（[環境変数の設定に悪戦苦闘した例](http://qiita.com/jkr_2255/items/51ef6112a11465ed5e6e)）。今回もそれと同様に、Apacheが`Authorization:`ヘッダをクリアしていました。

## 設定変更…しようとしたけれど
調べてみると、[CGIPassAuth](https://httpd.apache.org/docs/2.4/en/mod/core.html#cgipassauth)というディレクティブがあって、これを付ければヘッダを通してくれるし、しかも`.htaccess`で設定できることがわかりました。で、実際に設定したところ、無情にも「Internal Server Error」の画面を拝むこととなってしまいました。

Apacheのドキュメントを確認してみると、`CGIPassAuth`が使えるのはApache 2.4.13以降ですが、手元のApacheは2.4.6ということで、リビジョン差で動かない、という結論でした。

## 別なルートで設定する
どうしたものかと調べていくと、[StackOverflowの投稿](http://stackoverflow.com/questions/17018586/apache-2-4-php-fpm-and-authorization-headers)にたどり着きました。`CGIPassAuth`が使えない場合に、`SetEnvIf`でセットする、という技が紹介されていました。

```.htaccess
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
```

もちろん、これでは通常の`PHP_AUTH_XXX`系で取れなくなるので、`$_SERVER['REDIRECT_HTTP_AUTHORIZATION']`と、PHP側でアクセスする変数も別なのにする必要がありました。