OmniAICreator/Qiita-1.07M huggingface dataset:
fence_vmware_soap(ESXi6への接続)

fence_vmware_soapではESXi6(無償版)への接続はどうなのか確認してみました。
(ESXi7無償版も同様のようです。2021/03/25追記)

結論から言うと、fence_vmware_soapの問題なのか状態取得(status)や、リスト取得は出来ますが、電源操作(on,off)は、手元の環境(無償版ESXi6)では出来ない仕様のようで確認できていません。

 - [Start VM with virsh not possible with ESXi 6.0](https://communities.vmware.com/thread/542433)
 - [Current license or ESXi version prohibits execution of the requested operation](http://kb.cloudberrylab.com/kb1032/)

上記のリンクに書かれている通りで、virshでESXi6(無償版)に接続後にstartなどを実行すると以下のエラーになります。

```
error: internal error: HTTP response code 500 for call to 'PowerOnVM_Task'. Fault: ServerFaultCode - Current license or ESXi version prohibits execution of the requested operation.
```

fence_vmware_soapでは、ESXi6(無償版)に接続後にon/offなどを実行すると以下のエラーになります。

```
Failed: Timed out waiting to power xxx
```

同じ事象は、以下でMLにも去年報告されて解決したように見えませんが。。ライセンスということで解決したのかも知れません。
 - [fence_vmware_soap: fail to shutdown VMs](http://lists.clusterlabs.org/pipermail/users/2016-July/003415.html)

ちなみに、fence_vmware_soapとは関係ありませんが、無償版でもesxiホストにssh接続を経由して、vim-cmdコマンドを実行すれば、on/offなどを実行することは出来ます。(esxcli vmでは、停止のみしか出来ないようです)
 - [VMware ESXiをSSHでがんばるぞい(コマンドライン操作色々)] (http://qiita.com/binzume/items/096ce77f73b6e853c342)

# 環境
 * ESXi6.0.0 (Build 3620759)
 * RHEL7.3
 * fence_agent 4.0.25

# 内容
 RHEL7系では、RHEL6系と異なりfence_vmware_soapの実行に、ssl-insecureオプションの指定が必要です。

## リスト取得
 xxx.xxx.xx.9のESXi6ホストでは、rh68-stone,rh73-01,rh73-02のゲストが稼働中です。

```
[root@rh73-01 ~]# fence_vmware_soap -o list  -a "xxx.xxx.xx.9" -l "root" -p "xxx" -z --ssl-insecure
rh68-stone,564dcbca-2399-3923-68b9-bb3df9a08a3b
rh73-02,564dcb21-20fb-2318-8eca-650942fffa57
rh73-01,564d8146-f965-782f-80ce-bd4fe9f16e30
```

## 状態取得
 rh73-02ゲストの状態を取得してみます。

```
[root@rh73-01 ~]# fence_vmware_soap -o status  -a "xxx.xxx.xx.9" -l "root" -p "xxx" -z --ssl-insecure -n rh73-02
Status: OFF
```

## 電源on
 rh73-02ゲストを電源ON(poweron)してみますが、失敗します。(これはライセンスの問題）

```
[root@rh73-01 ~]# fence_vmware_soap -o on  -a "xxx.xxx.xx.9" -l "root" -p "xxx" -z --ssl-insecure -n rh73-02
Failed: Timed out waiting to power ON
```

## 電源off
 電源がonのrh68-stoneゲストを電源OFF(poweroff)してみますが、失敗します。(これはライセンスの問題）

```
[root@rh73-01 ~]# fence_vmware_soap -o status  -a "xxx.xxx.xx.9" -l "root" -p "xxx" -z --ssl-insecure -n rh68-stone
Status: ON
[root@rh73-01 ~]# fence_vmware_soap -o off -a "xxx.xxx.xx.9" -l "root" -p "xxx" -z --ssl-insecure -n rh68-stone
Failed: Timed out waiting to power OFF
```

後日、vSphere6.5環境のvCetnerサーバ/ESXiホストへの接続をLinux-ha-JapanコミュニティからリリースされているPacemaker1.1.16リポジトリパッケージ内のfence-agentに含まれるfence_vmware_soapで確認しましたが、問題なく動作しました。(2017/11/24追記)

以上です。
td-agentでAWS S3へログアップロード

## TL;DR

- ① td-agentをインストール
- ② td-agentディレクトリ調整
- ③ td-agent設定ファイル設定

## 準備

下記ログファイルをtd-agent経由で、AWS S3へアップロードする。
なお、apacheインストールと、AWS S3へのAMI設定が済んでいる状態とする。

```
/var/log/httpd/access_log
/var/log/httpd/error_log
```

## 操作手順

① td-agentをインストール

td-agent インストール
> curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

インストールバージョン確認
> td-agent -v																							

Plugin インストール	
> td-agent-gem install fluent-plugin-s3
> td-agent-gem install fluent-plugin-forest

② td-agentディレクトリ調整

ログ配置場所作成	
> mkdir /var/log/td-agent/s3

設定ファイル追記	
> vi /etc/td-agent/td-agent.conf

対象ログディレクトリの権限変更	
> chmod o+x /var/log/httpd

③ td-agent設定ファイル設定

> vi /etc/td-agent/td-agent.conf

```
#Apache
<source>
 type tail
 format none
 path /var/log/httpd/access_log
 pos_file /var/log/td-agent/httpd.access.pos
 tag td.httpd.access
</source>

<source>
 type tail
 format none
 path /var/log/httpd/error_log
 pos_file /var/log/td-agent/httpd.error.pos
 tag td.httpd.error
</source>

<match td.httpd.**>
 type forest
 subtype s3
 <template>
  aws_key_id (your-aws-key)
  aws_sec_key (your-aws-secretkey)
  s3_bucket test-backup
  s3_region ap-northeast-1
  s3_enpoint s3-ap-northeast-1.amazonaws.com
 </template>
  <case *.httpd.access>
   buffer_type file
   buffer_path /var/log/td-agent/buffer/httpd.access
   path log/httpd/access_log/${hostname}/access_log_
  </case>
  <case *.httpd.error>
   buffer_type file
   buffer_path /var/log/td-agent/buffer/httpd.error
   path log/httpd/error_log/${hostname}/error_log_
  </case>
</match>

```

下記設定項目があれば、ローカルバッファからS3へのアップロード待機時間を設定することが可能。

```
time_slice_format %Y%m%d
time_slice_wait 10m
```

td-agent停止時にファイルバッファをS3へアップするか、アップせずに残しておくは下記で選択可能。
```
flush_at_shutdown true
```


### 参照

- fluentdのoutput_s3プラグイン
http://qiita.com/munazo/items/d665e2c4e86f42d06cf7

- これは便利！fluentdが更に便利になるfluent-plugin-forest
http://tech-sketch.jp/2014/03/%E3%81%93%E3%82%8C%E3%81%AF%E4%BE%BF%E5%88%A9%EF%BC%81fluentd%E3%81%8C%E6%9B%B4%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%AB%E3%81%AA%E3%82%8Bfluent-plugin-forest.html

- Fluentdの仕組み -バッファ機能でログ収集漏れを防ぐ-
http://tech-sketch.jp/2013/05/fluentd-buffer.html
Pomodoro in Linux

新しいソフトを導入するのが面倒だったので、下記で済ませた。

```sh:~/bin/pomo
#!/bin/bash

count=1

while true; do
    echo "-------------------"
    echo "pomodoro start"
    notify-send -u critical -i appointment -t 10000 "pomodoro start!"
    sleep 1500
    echo "done step $((count++))"
    echo "take a rest 5 minutes"
    notify-send -u critical -i appointment -t 300000 "pomodoro end..."
    sleep 300
done
```

実行権限を付けて

```
chmod +x ~/bin/pomo
```

下記コマンドをtmuxとかで出しっぱなしにしておく

```
$ pomo

-------------------
pomodoro start
done step 1
take a rest 5 minutes
-------------------
pomodoro start
done step 2
take a rest 5 minutes
```

Macの場合は、`notify-send` を `osascript -e`とかにしてあげれば動くのか。
RedHat7にmariadbのインストール

chkconfigやら、serviceコマンドが、systemctlコマンドに移行されているようで、
最初少々焦りました。


## パッケージインストール

```
# yum install mariadb　mariadb-server
```

確認

```
# rpm -qa |grep maria
```

## 設定
最低限の設定のみ。
/etc/my.cnfの、[mysqld]ディレクティブに、文字コードを明示的に指定。

```
[mysqld]
character-set-server = utf8
```


## サーバー起動時のデーモン有効設定

```
# systemctl list-unit-files mariadb.service
UNIT FILE       STATE
mariadb.service desabled

# systemctl enable mariadb.service
systemctl list-unit-files mariadb.service
mariadb.service enabled
```

手動での起動と終了はこんな感じ。

```
# systemctl start mariadb.service
# systemctl stop mariadb.service
```
The Basic - Numeric Literals


まず最初に、 _リテラル(literals)_ とは、

```
var hoge = 123
```

の 「123」のように、明記された値のこと。
Numeric Literals は Numeric が数値の意味なので、数値リテラルであり、それはプログラム内で数値で明記された値のこと。

## 整数リテラル - Integer literals
整数のリテラル値のこと。進数の違いで表記が異なる。

* 10進数の場合、接頭辞は不要。
* 2進数は 0b を接頭辞とする。
* 8進数は 0o を接頭辞とする。
* 16進数は 0x を接頭辞とする。

これらは、下記のようになる。

```
let decimalInteger = 17 // 10進数で 17
let binaryInteger = 0b10001 // 2進数で 17
let octalInteger = 0o21 // 8進数で 17
let hexadecimalInteger = 0x11 // 16進数で 17
```

## 小数点リテラル - Floating-point literals
Double, Floatのリテラル値のこと。整数リテラルと同じルールで表記できる。

* 10進数の場合、接頭辞は不要。
* 2進数は 0b を接頭辞とする。
* 8進数は 0o を接頭辞とする。
* 16進数は 0x を接頭辞とする。

### べき指数
小数点リテラルはべき指数を扱える。べき指数は大文字小文字問わず半角英字 e で表わされる。

```
1.25e2 は 1.25 x 10の2乗 もしくは 125.0 を意味する。
1.25e-2 は 1.25 x 10の-2乗 もしくは 0.0125 を意味する。
```

16進数 float は大文字・小文字を問わない半角英数 p で表記されるべき指数を必ず持たなければいけない。

```
0xFp2 は 15 x 2の2乗 もしくは 60.0 を意味する。
0xFp-2 は 15 x 2の-2乗 もしくは 3.75 を意味する。
```

下記の小数点リテラル値はどれも10進数での 12.1875 である。

```
let decimalDouble = 12.1875
let exponentDouble = 1.21875e1
let hexadecimalDouble = 0xC.3p0
```

## 数値表記のフォーマット
数値リテラルを記述する際は、桁数を揃えるために 0 を使って桁数を揃えたり、 _ を使って区切りを表現できる。

```
// 0 を使って桁数を揃える
let paddedOne = 001 // 数値としては 1
let paddedTen = 010 // 数値としては 10

// _ を使って桁の区切り
let oneMillion = 1_000_000
```
swarmからleaveしたworkerを掃除する

worker nodeは`docker swarm leave` するとswarmから外れるのですが、
manager nodeから `docker node ls`すると `Down`状態のまま残ってしまっています。ほうっておくと邪魔なので、以下のようなコマンドで掃除しています。

```
docker node ls -f role=worker | grep Down |\
 awk '{print $1}' | xargs docker node rm
```

`docker swarm leave`した`worker`はリストからも消してしまっていいと思うんだけど
Botkitでとりあえず始めるSlackBot

## なにこれ？
とりあえずSlackBotを作ってみたい、(ほかのスクリプト言語と比べて)JavaScriptの経験がある人向けの記事です。
本格的な開発、デプロイは含まれていません。
筆者もとりあえず始められたところです。

## Botkitとは
BotkitはSlackBotなどの作成に便利なツールキット。
SlackBotをとりあえず作ってみたいという用途に適していると思う。
使用言語はJavaScript

## 始め方
SlackBotを作ることが目的なので、Slackアカウントはある前提。
開発環境はWindowsまたはCloud9。

1. Slack AppのBotsをInstall
    * https://my.slack.com/services/new/bot
2. BotsのName,Iconなどを設定
3. BotsのAPI Tokenをコピー
    * 流出するとSlackメッセージを見られたり書かれたりするので秘匿すること
4. 開発環境にNode.jsを入れる
    * Cloud9ならworkspaceのtemplateでNode.jsを選べばよい、その場合7までスキップ
5. 開発フォルダ(以後ルート)を用意
6. ルートで `npm init` してNodejsの準備
7. 続けて `npm --save botkit`　でBotkitをインストール
    * `--save` は、これから作成するBotがBotkitに依存することを設定ファイルに記録する
8. node_modules/botkit/slack_bot.jsをルートにコピー
    * いくつかサンプルが用意されているが、シンプルで見やすそう
    * そのまま編集すると面倒なので、いったんコピーしておく
9. コピーしたslack_bot.jsの72行目あたり`var Botkit = require('./lib/Botkit.js');` を`var Botkit = require('botkit/lib/Botkit.js');`に書き換える
    * コピーして場所を変えたので、使用モジュールパスの修正
10. `set token=hogehoge` <br> `node slack_bot.js`
    * Cloud9:`toke=hogehoge node slack_bot.js`
    * hogehoge部分はコピーしていたAPI Token
11. Slackのメッセージ欄で`/invite @foobar` と打ってBotをチャンネルに迎える
    * foobarのところはBotに設定したName

これで完成。Botに向かって `@foobar Hello` と言えば何か返してくれる。

反応する文字列、返答内容などはslack_bot.jsを書き換えればいい。その辺はまた今度。
gem install libv8で "../src/objects.h:5252:44: error: shifting a negative signed value is undefined"というエラーが出る問題からの脱出

環境:
MacOSX 10.11.6 EL Capitan

```

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

(中略)

../src/objects.h:5252:44: error: shifting a negative signed value is undefined [-Werror,-Wshift-negative-value]
  static const int kElementsKindMask = (-1 << kElementsKindShift) &
                                        ~~ ^
../src/objects.h:7386:36: error: shifting a negative signed value is undefined [-Werror,-Wshift-negative-value]
      (~kMaxCachedArrayIndexLength << kArrayIndexHashLengthShift) |
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
2 errors generated.

```

というエラー

http://qiita.com/south37/items/9a3269c28d9fba80f0b7
を参考に

```
$ bundle config build.libv8 --with-system-v8
```

MacとXcodeのバージョン変えるとv8つかってるrubyracer周りでいつもハマるので
さくっとできて便利だけどmac上でrails動かすのもそろそろ潮時かな〜（Docker移行中）
rails generate controllerで不要なファイルを生成しない


`rails g controller hogehoges`を実行すると_test,_helper,_coffeeなど使用しないファイルまで生成してしまう。

```
% rails g controller hogehoges                                                                                              [12:22:35]
Running via Spring preloader in process 3176
Expected string default value for '--jbuilder'; got true (boolean)
Expected string default value for '--helper'; got true (boolean)
Expected string default value for '--assets'; got true (boolean)
      create  app/controllers/hogehoges_controller.rb
      invoke  haml
      create    app/views/hogehoges
      invoke  test_unit
      create    test/controllers/hogehoges_controller_test.rb
      invoke  helper
      create    app/helpers/hogehoges_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/hogehoges.coffee
      invoke    scss
      create      app/assets/stylesheets/hogehoges.scss
```

## 設定を config/apprication.rb に追加する

以下の設定で使用しないファイルが生成されなくなる。

```config/applicaiton.rb
module PairsLike
  class Application < Rails::Application
    # ここから下を追加
    config.generators do |g|
      g.javascripts false
      g.helper false
      g.test_framework false
    end
  end
end
```

## 既に作成したファイルを削除して再実行

`rails d`で消してください。削除しきれなかったら手動で消してください。

```
Running via Spring preloader in process 3612
Expected string default value for '--test-framework'; got false (boolean)
Expected string default value for '--jbuilder'; got true (boolean)
Expected string default value for '--test-framework'; got false (boolean)
Expected string default value for '--helper'; got false (boolean)
Expected string default value for '--assets'; got true (boolean)
      create  app/controllers/hogehoges_controller.rb
      invoke  haml
      create    app/views/hogehoges
      invoke  assets
      invoke    coffee
      invoke    scss
      create      app/assets/stylesheets/hogehoges.scss
```

### 無事、不要なファイルを省けた。
欲しいファイルのみが作成されているのが分かります。以上。
React CSS moudulesでclassNameを複数渡す

#React CSS moudulesでclassNameを複数渡す
※備忘録

React CSS moudulesでclassNameを複数渡すやりかた
テンプレートリテラルを利用して複数渡す

```javascript
import { 
  hoge,
  active
} from './style.css'


// className切替
const classNameSwitch = (active) => {
  if(active){
     return `${hoge} ${active}`
  } else {
     return hoge
  }
};


const App = ({active}) => (
  <div className={classNameSwitch(active)}>
    hoge
  </div>
);

```
JIRAスクラムボードにクイックフィルターを追加する

スクラムボードのクイックフィルターを使うと簡単にボードに表示される課題を絞り込むフィルターを適用したり、フィルターを切り替えたりできます。
<img width="1005" src="https://qiita-image-store.s3.amazonaws.com/0/138322/9bc773de-5814-69a2-3cef-021796e99e29.png">


クイックフィルターを設定するにはボードの設定を開きます。
<img width="1005" src="https://qiita-image-store.s3.amazonaws.com/0/138322/48cb4242-218b-9292-2f89-249ee55034de.png">

<img width="436" src="https://qiita-image-store.s3.amazonaws.com/0/138322/d4fe4724-d4a5-401b-3bfd-a15dde597fd7.png">

ボードの設定画面で左のサイドメニューから"Quick Fileters"を選択します。
<img width="255" src="https://qiita-image-store.s3.amazonaws.com/0/138322/d31a4f4a-5142-b1c1-e07e-c3634b88894b.png">

あとは、JQLでフィルターを定義できます。タイプするたびに候補を表示してくれるのでJQLをに詳しくなくても大丈夫です。
<img width="845" src="https://qiita-image-store.s3.amazonaws.com/0/138322/e71c80e8-15a4-d809-ce5a-b33fc2dab03f.png">
Googleのサービスを利用して短縮URLを得る

おぼえがき

参考

[https://developers.google.com/url-shortener/v1/getting_started?hl=ja](https://developers.google.com/url-shortener/v1/getting_started?hl=ja)

# APIKeyの発行
https://console.developers.google.com

0. プロジェクトを作成
0. ライブラリから"URL Shortener API"を選択
0. 認証情報からAPIKeyを作成

# 短縮URLの作成

https://www.googleapis.com/urlshortener/v1/url?key={APIKey}
メソッド：POST
ヘッダ：Content-Type: application/json
ボディ：{"longUrl":"{短縮したいURL}"}

にアクセスすると
レスポンスが
```json
{
    "kind": "urlshortener#url",
    "id": "{短縮URL}",
    "longUrl": "{短縮したいURL}"
}
```

になるので、短縮URLでアクセスすれば元のURLにリダイレクトされる。
JSONについて

JSONとはたくさんのデータをまとめることができるデータフォーマット。

JSONを扱うには、オブジェクトリテラルの知識があったら助かる。

『人についてのデータ』を作ってみる。

{
    "name":"石橋",
    "age":19
    "size":"L"
}

『複数人についてのデータ』
配列を使います。

{
  "people":[
   {
    "name":"石橋",
    "age":19
    "size":"L"
   },{
    "name":"橘",
    "age":19
    "size":"S"
   },{
    "name":"森",
    "age":19
    "size":"L"
   }]
}
   
データ取得方法は、
people[1].name　で　橘　と表されます。
people[2].name  で　森,
people[0].age   で　19,
people[2].size  で　L ,
こんな感じ。
NOKIA 5110 LCD + アナログセンサー (esp8266 +atmega)

![IMGP6429.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/389544e3-e449-5f94-b608-7fe6e4e18dd6.jpeg)

esp8266+ MCU連携の作例となります。
nokia 5110 LCD (Philips PCD8544 コントローラ )
+Analog Sensor のDeepSleep(省エネ)版
NTP時計,アナログ温度センサー値の表示、
センサー値のクラウド送信の機能としています

### Youtube

https://www.youtube.com/watch?v=DQ4aur8LQ1I

### Parts
![ss-5110-ebay.png](https://qiita-image-store.s3.amazonaws.com/0/159710/e4f01ca7-634d-5535-5acb-164c0d566592.png)

84*48 LCD Module White Backlight Adapter PCB for Nokia 5110 Arduino
/ 1.97 USD
Sensor LM60BIZ / 100JPY

***
### Git
arduino.cc さんのコード参考にしています。
http://playground.arduino.cc/Code/PCD8544

makeKuc-nokia5110-1:
https://github.com/kuc-arc-f/makeKuc-nokia5110-1

### Schematic
esp8266+arduino搭載基板で、
LCD 周辺のみです。
![ss-5510-3.png](https://qiita-image-store.s3.amazonaws.com/0/159710/56a24ecf-4184-3097-b56a-5dc6df845f7c.png)

*1) ボード側の都合でピン結線を参考コードから変えています。
  arduinoと結線する場合は、そのまま修正なしで良いかと思います。
*2) GNDと、LIGHTを結線すると、バックライト点灯しました。

### 全体の 概観
![IMGP6433.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/bbf07cc5-1eda-e8d9-c90c-a91432c3986e.jpeg)


###温度ログ
![ss-5110-0216p1.png](https://qiita-image-store.s3.amazonaws.com/0/159710/ad35b0e8-e3d6-1fe2-6323-fca85fc30967.png)
celeryでタスクをインポートせずに呼ぶには

#背景
pythonアプリでメッセージキューイングを利用したい。そこでRabbitMQ+Celeryを選択したが、環境の都合によりcallerはPython2でworkerは3で動かしている。

#環境
Linux Mint 17
Python:callerは2.7.6(Mint標準)、workerは3.5.2
RabbitMQ:3.2.4-1
celery:4.0.2

#困ったこと
Celeryのチュートリアルには、タスクを呼ぶ為にはcaller側でもタスクを定義したモジュールをインポートしろとある。ところがインポートすると、callerとworkerのPythonのバージョンの違いにより、エラーになる。

tasks.py

```
from celery import Celery
celery.config_from_object('celeryconfig')

@celery.task
def add(x, y):
    return x + y
```

caller.py

```
from tasks import add #ここでエラーになる/そもそもファイルが見えない

add.delay(4, 4)
```

#おかしいな
callerとworkerの間には当然brokerが介在し、amqpというプロトコルで通信する。今回は同一ホストだが、リモートでも分散環境でも対応しているはず。そういう環境ではインポート出来るとは限らんやんね？そもそも何故インポートしている？メソッドシグネチャの読み取り？

#結論を早く言え
タスク名を文字列で渡せるメソッドがありました。引数はapply_asyncと同じだそうです。

caller.py(改)

```
from celery import Celery
celery.config_from_object('celeryconfig')

result =celery.send_task('add', (4, 4), queue = 'hayosei')
result.get(timeout = 1000)
```


#注意点
メソッド名=タスク名であってもタスク名の定義は[必須](https://gist.github.com/johnpaulhayes/8403108)。workerにそんなタスクは知らんと言われたらチェック。

tasks.py(改)

```
from celery import Celery
celery.config_from_object('celeryconfig')

@celery.task(name='add')
def add(x, y):
    return x + y
```

#参考サイト
<a href="http://stackoverflow.com/questions/18433071/celery-how-to-send-task-from-remote-machine">python - Celery - How to send task from remote machine? - Stack Overflow</a>
<a href="https://gist.github.com/johnpaulhayes/8403108">correct task definitions when using tasks by name.</a>
<a href="http://docs.celeryproject.org/en/latest/reference/celery.html#celery.Celery.send_task">公式の説明</a>
Backlog API をつかってチームのメンバーの予定時間・実績時間の更新を追う方法

```
https://xx.backlog.jp/api/v2/users/myself?apiKey=YOURAPIKEY
curl "https://xx.backlog.jp/api/v2/space?apiKey=YOURAPIKEY"|jq .
curl "https://xx.backlog.jp/api/v2/users?apiKey=YOURAPIKEY"|jq -c '.[]'|grep "チームメンバー1"
curl "https://xx.backlog.jp/api/v2/users/チームメンバー1USERID/stars?order=desc&count=100&apiKey=YOURAPIKEY"|jq -c ".[]"
curl "https://xx.backlog.jp/api/v2/users/チームメンバー1USERID/activities?order=desc&count=100&apiKey=YOURAPIKEY"|jq -c ".[]"
curl "https://xx.backlog.jp/api/v2/users/チームメンバー1USERID/activities?order=desc&count=100&apiKey=YOURAPIKEY"|jq -c ".[]|.id,.type,.content.summary,.content.changes"
```

でとれる、
```
[{"field":"estimatedHours","field_text":"lbl.changelog.estimatedHours","new_value":"2","old_value":"","type":"standard"}]
```
estimatedHours などの情報がそれになる。
オブジェクトリテラルについて

オブジェクトリテラルについて

{プロパティ名：値、プロパティ名：値 ...}

{'A':'田中','B':'小林','C':'加藤',....}
Aさんは田中、Bさんは小林、Cさんは加藤みたいな感じ。
簡単に言うと、そのプロパティ名ならその値みたいな..

これにより、たくさんのデータをまとめることが可能になる。
Visual Studio 2010逆引きメモ


## プロジェクトをビルドするとキーファイル関連のエラーについて

VS2010で作成したプロジェクトをビルドするとキーファイル関連のエラーが出たのでメモ。

### エラーメッセージ

次のキー ファイルをインポートできません: test.pfx。
キー ファイルはパスワードで保護されている可能性があります。
この状況を解決するには、証明書をもう一度インポートするか、
次のキー コンテナー名で、証明書を厳密な名前の CSP に手動でインストールしてください
: VS_KEY_?????????? 

### よくわからないけど解決

プロジェクトのプロパティ>署名>"アセンブリに署名する(A)"にチェックを入れるとなぜかビルド通る。(以前はこのチェックは外してありました。)
OpenCV3.2 tesseract-ocr TEXT VS2015 64bit であきらめないで！(改)

OpenCV3.2の 64bit環境でのTEXTモジュールでtesseract-ocrが組み込めなくて泣いている人、涙を拭いてください。

できます。

まず tesseract-ocrの準備ですが

https://github.com/peirick/VS2015_Tesseract.git

これを使います。

説明をよく読んでビルドしても失敗するでしょう。原因はご存じコードページです。

http://qiita.com/nsugimot/items/06e0b34b5fecb74a879f

ここに書いておきましたのでコードページを英語に換えてからもう一度説明をよく読んで
ビルドすると成功します。
しかしながら、説明をよく読んでできたバイナリは32ビット版なので、
64bitに変更してコンパイルします。
けど、このバイナリもOpencvでうまくリンクできないでしょう。
デフォルトのVS2015_TesseractソリューションではMTモデルなのでMDモデルに変更しないと
OPENCVでリンクするときにエラーになります。

OPENCVのビルドに関してですが、
CMAKEGUIを開いてコンフィグするところまではいろいろなところで説明されているので省きます。
tesseract-ocr 組み込みのポイントは

Tesseract_IncludeDirで
C:\software\tesswint\tesseract_3.05\api;C:\software\tesswin\tesseract_3.05\ccutil\;C:\software\tesswin\tesseract_3.05\api\ccstruct\C:\software\tesswin\tesseract_3.05\ccmaim\;C:\software\tesswin\tesseract_3.05\viewer\
という感じで上に書いてあるディレクトリを全部指定してあげることです。

そして同様に
Lept_LIBRALYも
C:/software/tesswin/x64/Release/liblept.lib;C:/software/tesswin/x64/Release/giflib.lib;C:/software/tesswin/x64/Release/libjpeg.lib;C:/software/tesswin/x64/Release/libpng.lib;C:/software/tesswin/x64/Release/libtiff.lib;C:/software/tesswin/x64/Release/libwebp.lib;C:/software/tesswin/x64/Release/zlib.lib;C:/software/tesswin/x64/Release/openjpeg.lib
という感じで全部書いて指定してあげます。

Tesseract_LIBRALYは
C:/software/tesswin/x64/Release/libtesseract.lib
でいけます。

C:\software\tesswinは私のPCの環境の作業ディレクトリですから、そこは皆さんの環境に
併せてください。環境変数を使えば良いかもしれませんが確認してません。

こうやればOPENCV側のCMAKEの定義ファイルも変更しないでいけます。
Worldにも、組み込めます。

あと、World化するなら、TessaractAPIとOPENCV内部ではMat(pix)でやり取りしているので
VS2015_TesseractのLeptonicaをビルドするときの指定でgifとopenjpegを無効にしておけば
Lept_LIBRALYの指定もliblept.libだけで大丈夫になるような雰囲気がありますね。
やってみればわかりますが。僕はやってみました。できました。
Tessaract単体でテストするだけの目的だったらOpenJpegもGifもいらないと思いますし。

OPENCV完全体ビルドに一歩近づきました。

作業終わったらコンパイル用に変更したコードページは日本語に戻し忘れないようにしましょう。

以上、よろしくお願いします。
Excelグラフでマイナス値のラベルが表示できなくて困った際の解決方法

#はじめに
Excelでグラフを作る際にラベルをいい感じに表示できなくて困った際の解決方法を備忘録として投稿
※Excel2013での方法

#やりたいこと
例えば以下の様な売上グラフがあった場合に、前月比がマイナスになっている6,7,8月のラベルを表示したい（主軸の境界値の最小値を0にしている為、マイナス値は隠れてしまっている）
![image](https://qiita-image-store.s3.amazonaws.com/0/123420/900bccba-910b-a787-8a2e-33f49f2792b6.png)

#やり方
1. グラフを右クリック＞グラフの種類の変更＞前月比を100%積み上げ折れ線にし、第2軸にチェック
![image](https://qiita-image-store.s3.amazonaws.com/0/123420/2b7116c9-e736-659c-a936-64bc813a40f7.png)
これだけでとりあえずマイナス値のラベルは表示される。が、プレビューで出ている通り、折れ線がじゃまだったり、第2軸が凡例と被っていたりして見た目的にもう少しキレイにしたかったので以降の手順で調整。
　　

2. 第2軸を右クリック＞軸の書式設定＞軸のオプション最小値を-1000.0＞ラベルの位置をなしに設定
※軸のオプションの最小値は適当な値を入力。マイナス値が大きいほどラベルの横の位置が揃う。
![image](https://qiita-image-store.s3.amazonaws.com/0/123420/99569f7e-bfa9-cb40-0f82-cd62eb3ab3ee.png)
　　
3. 折れ線の書式を線なしに設定＞1月の0というラベルをクリックし削除＞グラフのプロットエリアを少し下げ（上の余白を広げ）＞前月比というラベルを追加したらいい感じにできた。
![image](https://qiita-image-store.s3.amazonaws.com/0/123420/495faeab-078c-4790-1f1f-47826332b1e7.png)

# さいごに
Excelグラフの見た目調整は、簡単にできそうでなかなか思ったように出来ないことがある為、このような小技を駆使することがあるので、やり方を忘れない為にも今後も投稿していきたい。

# ついでに①
合計のラベル表示は以下記事を参考にした。
http://excel-magic.com/post-103/

# ついでに②
前月比の書式はユーザー定義で以下のように設定した。
[青]"+"#,###;[赤]"-"#,###;0

以上
Microsoft Updateを有効にする。ただし、コマンドラインで。

Windows Updateではなく**Microsoft** Updateです。

Windows本体だけではなく、OfficeやVisual Studioまで更新してくれるサービスです。
世間ではあんまり評判よくないですが、自分はそこそこ活用してます。

これを有効化する操作自体は別に難しくないのですが、[公式の方法](https://support.microsoft.com/ja-jp/help/901037/how-to-enable-and-to-disable-microsoft-update)ではGUIから設定する方法しか紹介されておらず、
端末が大量にある場合や、処理を自動化（無人化）したい場合に問題となります。
が、実はMicrosoft Updateを司るCOMコンポーネントを直接操作することで、
GUIを介さずにMicrosoft Updateを有効化することが出来ます。

有効化操作をバッチコマンド化し、グループポリシーなどを利用してタスクとして端末に配布すれば、
有効化しなければならない端末が複数あっても苦にならないでしょう。
何らかの理由でInternet Explorerが使えない場合や、「**[スタート]メニューを使用して、更新プログラムを確認してください**」などというエラーでMicrosoft Updateを有効化出来ない場合でもバッチコマンド経由なら有効化できます。

#スクリプト（バッチファイル）
単にVBScriptやJScriptで実行しても結果は同じですが、管理者として実行させるにはバッチファイル形式のほうが便利なので、スクリプト埋込み式バッチファイルとして作成しています。

- Windows7、Windows10で動作確認をしています。
- コード利用は利用者の責任でお願いします

##Microsoft Update有効化

```bat:MSUpdEnable.cmd
@if(0)==(0) ECHO OFF

net stop wuauserv
cscript.exe /nologo //E:JScript "%~f0" %*
net start wuauserv

GOTO :EOF
@end
@以降がJScript

var svc = WScript.CreateObject("Microsoft.Update.ServiceManager")
svc.AddService2("7971f918-a847-4430-9279-4a52d1efe18d",7,"")
```


##Microsoft Update無効化
参考として無効化用スクリプトも。

```bat:MSUpdDisable.cmd
@if(0)==(0) ECHO OFF

net stop wuauserv
cscript.exe /nologo //E:JScript "%~f0" %*
net start wuauserv

GOTO :EOF
@end
@以降JScript

var svm = WScript.CreateObject("Microsoft.Update.ServiceManager");
svm.RemoveService("7971f918-a847-4430-9279-4a52d1efe18d");
```
**解説**
参考文書のスクリプトをJScriptに書き換えてバッチに埋め込んでます。
スクリプト実行前後でアップデートサービスを停止、再開しています。

#使い方
スクリプトをコピペしてバッチファイルを作成、適当な場所に保存し、「管理者として実行」してください。
タスクスケジューラ等に組み込んでも構いません。

#参考文書
Opt-In to Microsoft Update
https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa826676(v=vs.85).aspx
jQueryでスムーススクロールすると、コールバックが2回呼ばれちゃう問題

しばしばこんな風にjQueryでスムーススクロールを行うのですが、これだとcallbackが2回呼ばれてしまうのですね。

```javascript
var position = 0;
var speed    = 400;
var ease     = 'swing';
var callback = function() {
    // do something...
};

$('html,　body').animate({scrollTop: position}, speed, ease, callback);
// これでは、htmlとbodyそれぞれで2回、callbackが呼ばれてしまうのだー
```

以前だと、以下のようにブラウザ判別して `body` か `html` のどちらかをセレクタに適応することで回避できたのですが、`.browser`はjQuery2/3ではもう使うことは出来ませんよね。このためだけにuserAgentからブラウザ判別するのも面倒ですね。

```javascript
// Webkitならbody、それ以外ならhtmlをスクロールイベントの対象にするよ。
$($.browser.webkit ? 'body' : 'html').animate({scrollTop: position}, speed, ease, callback);
```

というわけで、最近は `done()` を使ってこんな風にしてますよ。有名なjQueryプラグインとかでも、このあたり結構いい加減だったりしてよくハマるので、知っておくと便利かもしれません。

```javascript
// 完成形:)
$('body, html').animate({scrollTop: position}, speed, ease).promise().done(callback);
```
functionsでinput/outpup bindingに変数を使って動的にする方法


functionsのbinding（トリガー、入出力設定）は,function.jsonで行います。
例）Storage Tableからの入力

```function.json
{
  "bindings": [
    {
      "type": "table",
      "name": "MasterDataTable",
      "tableName": "MasterData",
      "take": 10000,
      "connection": "storageaccount_STORAGE",
      "direction": "in",
      "filter": "applicationID eq 1"
    }
  ]
}
```

MasterDataTableのMasterDataテーブルから`applicationID=1`のデータを取得しています。json形式なので一見固定ですが、ここに変数を設定できる方法が２つあります。

#変数{}を使う
`{}`を使うことで変数設定でき、triggerから取得したjsonのプロパティで変換できます。
上記例でいうと

```function.json
{
  "bindings": [
    {
      "type": "table",
      "name": "MasterDataTable",
      "tableName": "MasterData",
      "take": 10000,
      "connection": "storageaccount_STORAGE",
      "direction": "in",
      "filter": "applicationID eq {appID}"
    }
  ]
}
```

`1`を`{appID}`に置き換えたことで、 *triggerからの入力で置き換わる値* になります。例えばtriggerからの値が

```json
{  
  "key1":"val1",
  "appID":2
}
```

であれば、{appID}が2に置き換わって解釈されるので、`applicationID=2`の値をMasterDataテーブルから入力として取得することができます。つまりfunctionsに入ってくるデータ（triggerの値）によって、動的に変えれるということですね。

#アプリケーション設定%%を使う
設定したアプリケーション設定（該当のfunctions -> Function Appの設定 -> アプリケーション設定の構成 -> アプリの設定）をfunction.jsonに使えます。

```function.json
{
  "bindings": [
    {
      "type": "table",
      "name": "MasterDataTable",
      "tableName": "%MASTER_DATA%",
      "take": 10000,
      "connection": "storageaccount_STORAGE",
      "direction": "in",
      "filter": "applicationID eq {appID}"
    }
  ]
}
```

`tableName`を`%MASTER_DATA%`に変えてます。これはデータ毎に値を変える、というより、設定値の外部化or環境変数のような使い方ですね。

* ソース管理に機密性の高い値を書きたくない場合に管理対象から外す
* 開発と本番で変わる値を設定することで、ソースコードはそのままで切り替えれる

といった利用になります。

## 補足：アプリケーション設定
![アプリケーションの設定.png](https://qiita-image-store.s3.amazonaws.com/0/1533/f3f98284-1db9-8638-3ae5-bf4b8c6bce78.png "アプリケーションの設定.png")

## 補足：アプリケーション設定の変更
上記のように、ポータルから変更もできますが、プログラマブルにREST APIを使って設定値を変更する機能も提供されています。どんなRESTなのかは、実際にRESTの動作を確認できるこちらが参考になります。
https://resources.azure.com/
sql結果をcsvにする方法

## sqlの結果をcsvにする方法

○○のデータちょうだい！
って言われた時に便利:tulip:

sqlの結果をcsvにする方法です。

```
admin in /cygdrive/c/work/project (sample_branch●)
$ mysql -h project-db -u root -p project < ../test.sql > ../test.tsv
Enter password:

```

今回の例だとworkディレクトリにSQLを書いたtest.sqlファイルを置きます。

:star: ../　ドットを2回続けてスラッシュ=> 一つ上のディレクトリのこと
           →今回の例だとprojectのひとつ上のwork

「実行結果を>のあとに書いてあるファイルにしてね」というコマンドなので
実行するとworkディレクトリにtest.tsvが作成されます。

できたtsvファイルをお好きなエディタで開いて、タブをカンマに置換するとcsvになります。

## おまけ

sql結果のなかで検索をする方法:sunflower:

```
admin in /cygdrive/c/Work/project (sample_branch●)
$ mysql -h project-db -u root -p project -e "select * from member" |grep 田中
Enter password:
 田中 きいた 24 A 2016-03-18 13:43:16 2016-03-18 13:43:16
 田中 きいこ 22 A 2016-03-18 13:45:16 2016-03-18 13:45:16
 田中 きいみ 21 B 2016-03-18 13:46:18 2016-03-18 13:46:18
```

select * from memberの結果のうち「田中」が含まれるレコードのみを表示します。
likeと違うのは、どのカラムが「田中」なのかは指定していないところです。
お手軽にsql結果を検索できます。
tablesorter：動的に行追加（先頭）した後でもソートを有効にする方法（及びスクロール位置の記憶）

#0.はじめに
jQueryのpluginの一つであるtablesorterの使い方を書いてみます。
なお、使用するのは
①http://tablesorter.com/docs/
ではなく
②https://mottie.github.io/tablesorter/docs/index.html
です。
①は2008年から更新されていないようです（changelogより）
②は多機能ですが、多機能すぎてどう使ってよいかわからずだったのでこの記事でまとめてみます

#1.tablesorterの基本設定
#1.1.tableに対しtablesorterを設定する
myTableというidを持つtableに対しtablesorterを設定するには以下で十分です。

```js:tablesorter()
$("#myTable").tablesorter();
```

widgetsやthemeを読み込むと以下のような設定も可能になります。

```js:tablesorter()
$("#myTable").tablesorter({
  theme: 'blue',			// カラーを青に
  widgets: ['zebra', 'scroller'],	// ゼブラカラーの適用と、スクロールバーの表示
  widgetOptions: {
    scroller_height: 120,		// テーブルの最大サイズ
    scroller_upAfterSort: true,    
    scroller_jumpToHeader: true,   
    scroller_barWidth: null,
  }
});
```

上記で使用しているのは以下のjsたち。

- https://mottie.github.io/tablesorter/js/jquery.tablesorter.widgets.js
- https://mottie.github.io/tablesorter/js/widgets/widget-scroller.js
- https://mottie.github.io/tablesorter/css/theme.blue.css


#2.先頭行の追加
##2.1.先頭行に行追加する方法
先頭に行追加するには、対象テーブルのtbodyタグに対しprepend()すればよいです。

```js:prepend()
$('#myTable tbody').prepend(
  "<tr>" + 
    "<td>・・・</td>" +
    ・・・
  "</tr>"
);
```

##2.2.tablesorterをupdateする
行を追加しただけでは、ソート機能が有効になりません。
widgetsでzebraを指定している場合、ゼブラカラーも適用されません。
なので、行追加後に更新を行います。

```js:trigger("update")
$("#myTable").trigger("update");
```

これで追加した行の値もソートされるようになります。

#3.スクロール位置の記憶
テーブルを更新すればソートが可能になりますが、スクロールバーが先頭に移動してしまいます。
大量の行データがあり、参照中に動的に行追加されるようなケースの場合に、行追加させるたびに先頭へ自動遷移してしまってはみずらくて仕方ありません。
そこで、テーブル更新前後でスクロール位置を変化させない方法を実装します。

方法は

1.　テーブル更新前のスクロール量と全体の高さを記憶する
2.　テーブル更新
3.　行追加前後の全体の高さの差分（増加分）を記憶してあるスクロール量に追加し、スクロール位置を決定する

です。「行追加前後の全体の高さの差分（増加分）」というのは、本ケースが「先頭行に追加」されるからです。
追加された行が必ずしも一定の高さではないことを想定し、このような作りとしています。

ソースはこのようになります。

```sample.js
/* スクロールバーの位置を取得 */
var element = $("#myTable").parents('.tablesorter-scroller-table');
var scTop = element.scrollTop();		//現在のスクロール量
var scHeight1 = element[0].scrollHeight;	//全体の高さ

/* テーブル更新 */
$("#myTable").trigger("update");

/* スクロールバーの位置を設定 */
var scHeight2 = element[0].scrollHeight; 	// 全体の高さ（再取得）
scTop = scTop + (scHeight2 - scHeight1); 	// スクロール量（全体の高さの差（増加分）を追加）
element.scrollTop(scTop); 			// スクロール設定
```

[デモ](https://jsfiddle.net/fj58p/2sbmgzox/2/)をJSFiddleに作成してみました。
スクロールした状態で「行追加」してもテーブルの表示内容は変わらないはずです。

※ゼブラカラーは変わってしまうため、見た目変わっているように見えてしまいますが・・・

#4.ソート中のテーブルに対して
ソートキーが設定されている状態だとスクロール位置が変わってしまいます。
正確にはscrollTop()が効いていないです。
setTimeoutで遅らせるとうまくいったのでソートが完了する前にscrollTop()を行っていることが原因な模様。
そこで"sortEnd"にて実施してみるも・・・ダメ

今のところsetTimeoutで対処しております。
facebook Messengerでの複数人がいるアイコンっぽいのを書いてみた

### 作りたいもの
こういうやつ
<img width="71" alt="skitch.png" src="https://qiita-image-store.s3.amazonaws.com/0/4450/5a94a221-19a2-6a2b-4962-14e0f8f86ece.png">

### 書いてみた
出来たものはこちら
<img width="373" alt="スクリーンショット 2017-02-17 11.02.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/4450/48e80a6d-f6aa-7c5b-40f9-baea0e4aa1c0.png">

コード
https://jsfiddle.net/cfyjvgu8/4/

### ざっくり説明
いい感じに画像を並べてclip-path使ってマスクする。

### ２人の場合
２人の場合は、そのまま画像を並べてマスクすると人の顔が半分に切れちゃうので、それぞれを真ん中によるようにマスクしたのを左右に並べてから丸に切り抜いた。

```html
<div class="img-mask">
  <div class="half-mask is-l">
    <img src="https://dgndea2fsuumd.cloudfront.net/assets/profile/luckofwise/luckofwise_thumbnail-ec70c49062639cfcc3b416789101e5b696d1887fc347e66d36722b8327193483.jpg" class="img-lg">
  </div>
  <div class="half-mask is-r">
    <img src="https://dgndea2fsuumd.cloudfront.net/assets/profile/interu/interu_thumbnail-9f8bc95d65c661c21d3588a003bb6ed4aec3bccee12d024c5b5c12a418bdf85d.jpg" class="img-lg">
  </div>
</div>
```

```CSS
.img-mask {
  width: 100px;
  height: 100px;
  position: relative;
  clip-path: circle(50px at center);
  -webkit-clip-path: circle(50px at center);
}
.half-mask {
  width: 50%;
  height: 100%;
  display: inline-block;
  overflow: hidden;
  position: absolute;
}
.half-mask img {
  position: absolute;
  left: -50%;
  width: 200%
}
.is-l {
  left: 0;
}
.is-r {
  right: 0;
}
```

https://jsfiddle.net/z0cLfrxv/

### ３人の場合
３人の場合は、２人の場合の左だけ残して、半分のサイズの画像を右上と右下に配置してから丸に切り抜いた。

```html
<div class="img-mask">
  <div class="half-mask is-l">
    <img src="https://dgndea2fsuumd.cloudfront.net/assets/profile/luckofwise/luckofwise_thumbnail-ec70c49062639cfcc3b416789101e5b696d1887fc347e66d36722b8327193483.jpg" class="img-lg">
  </div><img src="https://dgndea2fsuumd.cloudfront.net/assets/profile/interu/interu_thumbnail-9f8bc95d65c661c21d3588a003bb6ed4aec3bccee12d024c5b5c12a418bdf85d.jpg"
  class="img-sm is-tr"><img src="https://dgndea2fsuumd.cloudfront.net/assets/profile/tochi/tochi_thumbnail-d11047528417be03dacdb7f633d9e25f4e0ce2a64ed1ecb6f9b4040a88d03648.jpg" class="img-sm is-br">
</div>
```

```CSS
.img-mask {
  width: 100px;
  height: 100px;
  position: relative;
  clip-path: circle(50px at center);
  -webkit-clip-path: circle(50px at center);
}
.half-mask {
  width: 50%;
  height: 100%;
  display: inline-block;
  overflow: hidden;
  position: absolute;
}
.half-mask img {
  position: absolute;
  left: -50%;
  width: 200%
}
.is-l {
  left: 0;
}
.img-sm {
  width: 50%;
  height: 50%;
  position: absolute;
}
.is-tr {
  top: 0;
  right: 0;
}
.is-br {
  bottom: 0;
  right: 0;
}
```

https://jsfiddle.net/7ffvykm8/1/

### 追記
今回はシンプルな円なのでclip-path使わなくてもborder-rodiusでも同じように書けます。
clip-path使わない版も参考までに残しておきます。
https://jsfiddle.net/7ffvykm8/4/
TypeScript 2ではシングルトン(Singleton)パターンが短く書ける

プログラミングには、**アプリケーションでインスタンスを一つだけ生成することを保証する「シングルトン（Singleton）パターン」**という手法（デザインパターン）があります。例えばゲームのアプリを作るとき、ゲームのデータを管理するクラスのインスタンスは1度生成して使い回したい場合もあるでしょう。

TypeScript 1系では記事「[TypeScriptでシングルトン(Singleton)パターンを使おう](http://qiita.com/tonkotsuboy_com/items/6d86d68200326757195d)」で示すような冗長な書き方が必要でしたが、TypeScriptの2系では短かく書けるようになりました。

# TypeScript 2+でシングルトンパターンを使う方法
**TypeScript 2+ではコンストラクターにアクセス修飾子`private`(クラス内でのみアクセス可能)を設定できます**。`Hoge`クラスをシングルトンパターンで実装します。

```ts:TypeScript
/**
 * シングルトンパターンで実装されたHogeクラス
 */
class Hoge {
  /** インスタンス */
  private static _instance:Hoge;

  /** プライベートコンストラクタ */
  private constructor() {
  }

  /** インスタンスの取得 */
  public static get instance():Hoge {
    // _inctanceが存在しない場合に、new Hoge()を実行する。
    if (!this._instance) {
      console.log("☆ インスタンスを作成します。 ☆");
      this._instance = new Hoge();
    }

    // 生成済みのインスタンスを返す
    return this._instance;
  }
}
```

# インスタンスの取得
`Hoge`クラスのインスタンスを取得するには`Hoge.instance`を実行します。

```ts:Hogeのインスタンスの取得
const hoge:Hoge = Hoge.instance;
```

`Hoge.instance`を複数回実行しても、`Hoge`のインスタンスは一度しか生成されません。次のサンプルコードで挙動を確認します。

```ts:TypeScript
// Hogeクラスのインスタンスが新規生成される。「☆ インスタンスを作成します。 ☆」のログが出力される。
const hoge1:Hoge = Hoge.instance;

// インスタンスが新規作成されないため、ログは出力されない。
const hoge2:Hoge = Hoge.instance;

// ■ コンストラクタがprivateな為、new Hoge()ではコンパイルエラー
// const hoge:Hoge = new Hoge();
```

コンソールログを見るとわかるように、**`Hoge`クラスのインスタンスは一度きりしか生成されない**のがわかります。インスタンスの取得はHoge.instanceでのみ行われるため、■部分のクラス外の`new Hoge()`はコンパイルエラーとなります。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/957c0698-6696-5358-2ad0-ab45593fe83e.png)


# 最後に
TypeScript 2で実装された`private`なコンストラクタによって、シングルトンパターンがすっきり実装できるようになりました。TypeScriptのプロジェクトでシングルトンが必要になった場合にご利用ください。
データ分析で大切なこと　５項目（作成中）

データ分析で大切なこと　５項目を実際のツール(主に jupyter で、実践するためのメモ）

１　データが存在すること
* データの存在チェック
  * 今年のデータがあるか？ kaggle にデータアップしたときに アップし忘れがありました。
２　データが入手可能なこと
３　データ処理が可能なこと
４　データが間違っていないこと
５　データには価値があること
rhel7にruby-develをインストール

## なんのためruby-develを入れたのか
- rubyの開発環境を構築していく中でgemのインストールがうまくいかなかった。よく見るこのエラー

```
$ sudo gem install mysql
Fetching: mysql-2.9.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
    ERROR: Failed to build gem native extension.

    /usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h


Gem files will remain installed in /usr/local/share/gems/gems/mysql-2.9.1 for inspection.
Results logged to /usr/local/share/gems/gems/mysql-2.9.1/ext/mysql_api/gem_make.out
```

- 調べてみるとruby-develをいれろーと。

## ruby-develをインストールする方法
- 開発環境

```
$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.3 (Maipo)

$ ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

```

- [参考記事](http://stackoverflow.com/questions/30665912/no-ruby-devel-in-rhel7)

```
原因はoptionalのレポジトリはenable=0(false)だった。それをenable=1(true)にしてあげたら行けた
# 該当レポジトリを検索。[]に入ってるのがrepo-id
$ grep -B1 -i optional /etc/yum.repos.d/*

# enableをONにする
$ yum-config-manager --enable <repo-id>

# 必須かはわからないがやっておく。キャッシュ
$ sudo yum makecache

# インストール
$ sudo yum install ruby-devel
...
インストール:
  ruby-devel.x86_64 0:2.0.0.648-29.el7

完了しました!
```


## これで本題
```
$ gem install mysql
Building native extensions.  This could take a while...
Successfully installed mysql-2.9.1
Parsing documentation for mysql-2.9.1
unable to convert "\x80" from ASCII-8BIT to UTF-8 for lib/mysql/mysql_api.so, skipping
Installing ri documentation for mysql-2.9.1
1 gem installed
$ gem list

*** LOCAL GEMS ***
...省略...
mysql (2.9.1)

```

## バンザイ
.htaccess 特定ファイルを指定　　


```

<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
AuthUserFile /home/hoge/html/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
order deny,allow

<Files hoge.php>
#<Files hoge.php|fuga.php>
require valid-user
</Files>


```
Visual Studio Code に組み込まれている Markdown 拡張機能を切り出してみた


## これは何？

Visual Studio Code の source tree から Markdown Extension (Markdown モードは拡張機能として実装されています)を切り出したものです。(ベースは、vscode insiders 1.10.0 2017-02-16T07:02:25.975Z)

* [satokaz/vscode-markdown-mock](https://github.com/satokaz/vscode-markdown-mock)

動きは、標準の Markdown モードと同じです。

- 自分の勉強用に切り出してみた
- 勉強用途やオレオレ Markdown プレビューなどを作成する場合に参考になります
  - Markdown-it plugin を追加してみるとか、新しい機能を追加してみるとか、まったく別なものにしてしまうとか。。。
- clone して、npm install を実行後、F5 キーを押せばすぐに動かすことができます(できるはず)

```bash
$ git clone https://github.com/satokaz/vscode-markdown-mock.git
$ cd vscode-markdown-mock
$ npm install
$ code .
```

- F5 キーでデバッグ開始
- vscode に組み込まれている markdown extension を上書きします
![スクリーンショット 2017-02-16 18.29.54.png](https://qiita-image-store.s3.amazonaws.com/0/65800/65c9f064-4d4c-04ea-2879-5127f04d35df.png "スクリーンショット 2017-02-16 18.29.54.png")
`[/Users/satokaz/Gits/vscode-markdown-mock]: 拡張機能 /Applications/Visual Studio Code - Insiders.app/Contents/Resources/app/extensions/markdown を /Users/satokaz/Gits/vscode-markdown-mock で上書きしています。`

  - なので、別な拡張機能の雛形に使う場合は、package.json の編集やコマンドがぶつからないようにする必要あり

- [extension.ts](https://github.com/satokaz/vscode-markdown-mock/blob/master/src/extension.ts#L157) の 175 行目を変更し、Preview の tab head には 🌸 のアイコンがつくようになっているので、少しわかりやすいかなと思います(変更点はこれだけ)
![スクリーンショット 2017-02-16 18.28.47.png](https://qiita-image-store.s3.amazonaws.com/0/65800/0f2c9aae-5f44-d4bf-320e-7d1758f7cc56.png "スクリーンショット 2017-02-16 18.28.47.png")

## .vsix

[`vsce`](https://code.visualstudio.com/docs/tools/vscecli) をインストールして package も作れます。

作成したものは、こちらに。`VSIX からのインストール` で拡張機能としてインストールすることもできます。

* [vscode-markdown-0.2.0.vsix](https://github.com/satokaz/vscode-markdown-mock/blob/master/vscode-markdown-0.2.0.vsix)

## ちょっと改造したもの

ちょっと改造したものを showHTML ブランチに作成しています。

* https://github.com/satokaz/vscode-markdown-mock/tree/showHTML

- こちらの branch は、下記 2 つのコマンドを追加
  - 🌸 Markdown: 🌸 show HTML: Output Chnnel (出力) に HTML レンダリングを出力 
  - 🌸 Markdown: 🌸 create HTML File: .md ファイルと同じディレクトリ(何も入力しないで Enter だけ押す)に HTML ファイルとして保存し、ブラウザで開く

![スクリーンショット 2017-02-17 10.05.46.png](https://qiita-image-store.s3.amazonaws.com/0/65800/82b37e85-14b8-0120-9a54-04d0819ae08b.png "スクリーンショット 2017-02-17 10.05.46.png")

## その他
切り出し方は、[README.md](https://github.com/satokaz/vscode-markdown-mock/blob/master/README.md) で。

- filter-branch を使って、新しいリポジトリとして切り出すことで、hash 値が書き換わってしまうが commit log を残せる。(が、容量を必要とする)

```bash
$ git clone https://github.com/Microsoft/vscode.git
$ cd vscode
$ git filter-branch --subdirectory-filter extensions/markdown HEAD

// リポジトリを掃除(必要であれば
$ git gc --aggressive
$ git prune
$ rm -fr .git/refs/original
```
Mavenの依存モジュールを操作する

# Mavenの依存モジュールを操作する

ソースは公開されているがMavenリポジトリで公開されていないモジュールを利用するときに困ったので、依存関係を処理するコマンドのメモ。

- 例えば[AzureのNotificationHubsを叩くモジュール](https://github.com/Azure/azure-notificationhubs-java-backend/tree/master/NotificationHubs)

- 参考
  - [Apache Maven Assembly Plugin](https://maven.apache.org/plugins/maven-assembly-plugin/)
  - [Azure/azure-notificationhubs-java-backend](https://github.com/Azure/azure-notificationhubs-java-backend)
  - [Maven Assembly Pluginで実行可能jarをつくる](http://kiririmode.hatenablog.jp/entry/20160429/1461855600)

## jarを生成

- `target`フォルダにjarファイルを生成する。

```shell
$ mvn package
```

- ソースとJavadocのjarファイル生成

```shell
$ mvn source:jar javadoc:jar
```

### テストをスキップする

- `maven.test.skip`プロパティを利用
  - `-D`オプションでコマンドラインから指定できる。

```shell
$ mvn package -Dmaven.test.skip=true
```

### fat jar(uber-jar) を作成

- 依存するモジュールを一つのjarにまとめる。
  - `assembly`プラグインを利用する（または`shade`）。
    - ここでは`assembly`を利用する。

#### `pom.xml`

- `assembly`プラグインを追記し、ディスクリプタ`jar-with-dependencies`を設定する。
  - https://maven.apache.org/plugins/maven-assembly-plugin/usage.html

```xml
<build>
  [...]
  <plugins>
    [...]
    <plugin>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.0.0</version>
      <configuration>
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
      </configuration>
      <executions>
        <execution>
          <id>make-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
```

- `package`コマンドで、`target`フォルダに`*-jar-with-dependencies.jar`が出力される。
  - 通常の`jar`ファイルもあわせて出力される。

```shell
$ mvn package
```

## 依存ライブラリをダウンロード

### 任意のフォルダにダウンロード

- `dependency:copy-dependencies`で依存しているモジュールをダウンロードする。
  - デフォルトでは`./target/dependency`にダウンロードを行う。
    - `outputDirectory`プロパティでダウンロード先フォルダを変更できる。
    - `classifier`プロパティでソースファイル・Javadocのダウンロード指定を行う。
      - その他オプション: http://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html

```shell
$ mvn dependency:copy-dependencies
$ mvn dependency:copy-dependencies -Dclassifier=sources
$ mvn dependency:copy-dependencies -Dclassifier=javadoc
```

### ローカルリポジトリにダウンロード

- デフォルトのローカルリポジトリ
  - `${HOME}/.m2/repository`
    - リポジトリを変更するなら`maven.repo.local`プロパティを変更する

```shell
$ mvn dependency:go-offline
```
PHP5.6でmbstringのインストール

# yumでのmbstringのインストール
EC2でApache立ててPHP入たいとき、AWSの公式チュートリアル  

http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html

のとおりにやると、LAMP環境があっという間に立ち上がります。
でも、これ翻訳だからかな？　日本語環境で必須のmbstringがうまく動かないのです。

そこで

```
$ sudo yum install php-mbstring
```

ってやるって記事がネット上に多いんだけど、PHP5.6では

```
$ sudo yum install php56-mbstring
```

ってやりましょう！
Ubuntu 16.04 でニフティクラウド NAS サーバーの NFS マウント

検証に必要なので作業したメモ。

まず、必要なパッケージをインストール。

```
# apt-get -y install nfs-common
```

マウント先のディレクトリ作成。

```
# mkdir /nfs
```

マウント実行。

```
# mount -t nfs4 ${NAS サーバーの IP}:/ /nfs
```

マウントされてる。

```
# df -h | grep nfs
${NAS サーバーの IP}:/  985G   72M  985G   1% /nfs
```

いったんアンマウント。

```
# umount /nfs
```

サーバーが再起動されてもいいように `/etc/fstab` に書いておく。

```
# echo '${NAS サーバーの IP}:/ /nfs nfs defaults 0 0' >> /etc/fstab
```

`/etc/fstab` の内容をもとにマウントできるか確認。

```
# umount /nfs
```

マウントできてる。

```
# df -h | grep nfs
${NAS サーバーの IP}:/  985G   72M  985G   1% /nfs
```

## 参考資料

* [Ubuntu 16\.04 LTS : NFSクライアント\(Ubuntu\) ： Server World](https://www.server-world.info/query?os=Ubuntu_16.04&p=nfs&f=2)
ReactOSを使ってみた (0.4.4)

https://www.reactos.org/download

![iso.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bceec05a-c293-7f2b-4fa6-2da25ed31c1a.png)

左側をダウンロード。（右側のLiveCDはアプリケーションの追加やDISKのインストールに対応していない）

## インストール後

* NICをPCnet指定しないと利用できない。

![nic.png](https://qiita-image-store.s3.amazonaws.com/0/25728/88fcc5fc-d18e-085f-c61f-f94c1e1e145c.png)

## FireFox 45が動いた。

![install.png](https://qiita-image-store.s3.amazonaws.com/0/25728/52390388-f817-98da-a243-ca82de9d6fda.png)

![top.png](https://qiita-image-store.s3.amazonaws.com/0/25728/eead61ac-ff3e-933c-165e-90ec00af237d.png)

![kiji.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b958cf52-ed1c-234c-5340-a8354e69f788.png)



（Firefox47にバージョンアップすると動かなくなる）
![error2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/707cbf94-bd63-17a0-c4cd-e8e8edb54bb9.png)

![error.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b51d857b-baee-166a-6ee9-f9565dd23d7b.png)
[Unity] Shader Forgeを使ってUV座標より中心から現れるサークルを描く

#はじめに
正方形の板ポリに対してUV座標を使ってサークルを描く方法を紹介する。
というか書いた本人の備忘録です:smirk:

#環境
Unity 5.5.0p3
Shader Forge v1.34


#ノードの接続方法
![Desktop 2017-02-17 07.33.38.png](https://qiita-image-store.s3.amazonaws.com/0/36154/4d71598b-7f3e-801b-c47e-5523346808da.png)

この方法だとマイナス方向の輪もできてしまうので
問題のときはclampするかabsするかしてください。

#あとがき
速さを求める場合はもっとほかの方法があるかもしれません。
またもっと簡略的な計算で似たような結果を得られることもあります。

説明しやすいように位相をずらすところでパイと乗算してるけど
厳密にやらなくても適当な値でもいけるので、そこらへんはお好みで。

UVをもとにしているので長方形になると楕円になります。
そういう場合はピボットからの頂点座標の距離でなんとかできるんじゃないかな？
技術英語 > let's take a look at a string with [more than one occurrence] of some letters:

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

> let's take a look at a string with **more than one occurrence** of some letters:

```py
>>> set( 'letters' )
{'l', 'e', 't', 'r', 's'}
```

試してみた。
http://ideone.com/XZ94r4

```py
myset = set( 'she sells seashells by the seashore' )
print(myset)
```

```txt:結果
set(['a', ' ', 'b', 'e', 'h', 'l', 'o', 's', 'r', 't', 'y'])
```
Neovim のプラグインを Haskell で書いてみる

Neovim は Vim とは異なり、プラグインを書く際に言語ごとのインターフェイスというものは存在せず、MessagePack-RPC で Neovim とは独立して動くプラグインと通信をして色々と操作するというモデルのようです。

ということで、Haskell で Neovim のプラグインを書いてみました。

# TL;DR

[GitHub](https://github.com/satosystems/neovim-plugin-hello-haskell) に動作するサンプルコードを置きました。ビルドして実行すれば以下のように動きます。

![screenshot-01.png](https://qiita-image-store.s3.amazonaws.com/0/31613/9bd4eccd-53e6-9128-cfa1-da16b4bd1fcd.png)

![screenshot-02.png](https://qiita-image-store.s3.amazonaws.com/0/31613/805b74ca-18c3-6963-50a1-f0d7996d5da0.png)

# 説明など

[nvim-hs](http://hackage.haskell.org/package/nvim-hs) という Neovim のプラグインプロバイダーを利用して実装しました。このパッケージにも丁寧な説明が書かれているのですが、私は Neovim も Vim もプラグインを書いたことがないので、勝手がわからず結構つまづきました。

ひとつ目はファイルの構成です。

```
.
├── app
│   └── Main.hs
└── src
    ├── Hello
    │   └── Plugin.hs
    └── Hello.hs
```

ソースはこんな感じになっています。nvim-hs の説明にもしっかり書かれていたのですが、Hello.hs と Plugin.hs は Hello.hs で Template Haskell を使用している都合上、まとめることができないようです。なので、実装を Plugin.hs に書いて、設定などを Hello.hs に書くようにします。

ふたつ目は Neovim から呼び出されるエントリポイントになるシェルスクリプトです。

シェルスクリプトは以下のようになり、チェックなどを省くとビルドしてできたバイナリを stack 経由で呼び出しているだけです。

```bash
#!/bin/bash

plugin_name=neovim-plugin-hello-haskell
plugin_dir="$(cd $(dirname $0) && pwd)"

pushd $plugin_dir > /dev/null

if [ -d "$plugin_dir/.stack-work" ]; then
  stack exec $plugin_name-exe -- "$@"
  rc=0
else
  echo "No development directories found. Have you built the project?"
  rc=2
fi

popd > /dev/null

exit $rc
```

nvim-hs のオリジナルのサンプルは、stack 経由で nvim-hs のバイナリを呼び出していたため、いったいどういう仕組みで実装したコードが実行されるのかがわからず、ここでかなり遠回りしました。

# dein.vim で管理できるようにする

お作法として GitHub のリポジトリを以下のようにしておく必要があるようです。

```
.
├── autoloaded
│   └── neovim-plugin-hello-haskell.vim
└── plugin
    └── neovim-plugin-hello-haskell.vim
```

autoloaded は必要になったタイミングで読み込まれる処理を、`plugin` は Neovim 起動時に読み込まれる処理に分けるのが良いようです。今回のサンプルは関数ひとつなので、`plugin` に置きました。

Vim Script の名前はなんでも大丈夫なようです。おそらく `runtime!` で読み込んでいるのでしょう。

この Vim Script は頑張って Haskell で書こうとせずに VimL で書くほうが楽だと思います。ほとんどボイラープレートなので、VimL がよくわからなくても一度作ってしまえば以降は困りません。

```.vim
if !has('nvim')
  finish
endif

if exists("g:loaded_neovim_plugin_hello_haskell")  " ここと
  finish
endif
let g:loaded_neovim_plugin_hello_haskell = 1  " ここの変数名だけ変える

let s:save_cpo = &cpo
set cpo&vim

let s:script_dir = expand('<sfile>:p:h')
call rpcrequest(rpcstart(s:script_dir . '.sh'), "PingNvimhs")

let &cpo = s:save_cpo
unlet s:save_cpo
```

上記スクリプトを少しだけ解説します。

`if has('nvim')` は、Neovim だけで動作させたい場合のガードです。Haskell のプラグインは Neovim でしか動作しないので付けておいたほうが親切です。

`if exixts(...)` から `let ...` は 2 回以上実行しないためのガードです。 `g:loaded_` という変数名で開始するのが慣習のようです。変数にプラグイン名を含めるとバッティングしなそうです。

次の `let s:save_cpo = &cpo` と `set cpo&vim` はプラグインを読み込む際にユーザの設定を一時的に無効にするおまじないです。

その次の 2 行がプラグインの処理です。

最後の `let &cpo = s:save_cpo` と `unlet s:save_cpo` は、一時的に無効にしたユーザの設定をもとに戻すおまじないです。

# 今後の課題

* ステートフルなプラグインの作成
* ~~プラグインマネージャで管理するためのお作法~~
undo-treeを新規ウィンドウに表示する

## undo-treeとは

undo,redoを可視化するemacsプラグイン。
https://www.emacswiki.org/emacs/UndoTree

便利プラグインなので愛用しているが、一部の振る舞いに不満があったので変更した。

## 不満だった振る舞い

undo-tree-visualizerを起動した時に、ウィンドウが複数分割されている場合
そのうちの1つのウィンドウ上にバッファを表示する。
さらに、visualizerを閉じた時にもともと開いていたバッファに戻らない場合がある。

## 変更

以下のように変更。

* 現在のウィンドウの右側に新規ウィンドウを作成しその上にバッファを表示
* visualizerを閉じた時はウィンドウごと閉じる
* ウィンドウサイズは現在のウィンドウの1/4のサイズ(比率は変更可能)


以下はソースコードのdiff
https://github.com/yakumo890/undo-tree/commit/81a1ad67e39df1afcb12c3841e7a5c6e5e614f39

現状の実装だと、必ず現在のウィンドウの右側に作成されるため
ウィンドウをたくさん分割している時に不具合が起こりうる。
自分はあまりウィンドウを分割しないのでそこまで問題ないが、
作成される位置を変更できるようにしたほうが良さそう。

以上。
UnityでOculus Rift + Oculus Touchを使う流れ


![12533755_365594227153485_1612029821804609536_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/42909/94d7230e-4116-6219-9481-7a65d977ca32.jpeg "12533755_365594227153485_1612029821804609536_n.jpg")



最近Oculus Touchを手に入れたので、それをUnity上で使うための方法を調べたのでメモしておきます。(2017/02/17現在）

##必要なもの

- Unity 5 ([Oculus Utiliesのバージョンによって対応しているUnityのバージョンが異なります](https://developer3.oculus.com/documentation/game-engines/latest/concepts/unity-sdk-version-compatibility/)）
- [Oculus Rift](https://www.oculus.com/rift/)
- [Oculus Touch](https://www.oculus.com/touch/)
- [Oculus Utilities for Unity 5](https://developer3.oculus.com/downloads/)
- [Oculus Avatar SDK](https://developer3.oculus.com/downloads/)

##UnityでOculus Touchを使う流れ

1. 新規プロジェクトを作成する
2. Oculus Utilitiesをインポートする
3. Oculus Avatar SDKの中にあるUnityパッケージをインポートする
4. Player SettingsでVirtual Reality Supportedをオンにし、Oculusを追加する
5. Oculus Avatar SDKのサンプルシーンであるControllersシーンを開く
6. シーンをプレイしてOculus Touchが画面内で動いて入れば成功