OmniAICreator/Qiita-1.07M huggingface dataset:
bitbucketをhttps接続から（id_rsa以外の鍵で）ssh接続するように変更する手順（mac）

# はじめに
gitのリポジトリにはsshキーを使用して接続するのが一般的です。
ここで作成した公開鍵は他の用途にも利用して問題ないものですので、他のサーバーに接続する時にも利用するのが一般的です。

とはいえ初めはhttps接続でgitを始めると思うので、https接続からssh接続に変更するタイミングはいずれやってきます。

その際の手順についてまとめます。
※macでの設定方法です

# 手順
## SSH鍵の生成
まずはじめにSSH接続するための鍵を作成します。

[githubの提示する手順](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/)を参考にしています。

```
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
```

オプションの説明
-b: bit数。デフォルトは2048。高い方が解読されにくい。
-t: 生成する鍵の種類。
-C: コメント。


実行すると次のように聞かれます。

```
Enter a file in which to save the key (/Users/you/.ssh/id_r
sa): 
```

これに対して、作成する鍵ファイル（今回はother_id_rsaとします）の絶対パスを入力します。

```
/Users/you/.ssh/other_id_rsa
```

その後passphraseを登録すると
`/Users/you/.ssh/other_id_rsa`と`/Users/you/.ssh/other_id_rsa.pub`が作成されます。
前者が秘密鍵（絶対公開してはいけません）、後者が公開鍵になります。

## bitbucket / github にSSHキーを登録

[githubの提示する手順](https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/)
[bitbucketの提示する手順](https://confluence.atlassian.com/bitbucket/set-up-an-ssh-key-728138079.html#SetupanSSHkey-Step3.AddthepublickeytoyourBitbucketsettings)
を参考にしています。

下記コマンドでクリップボードに公開鍵（ただのテキスト）をコピーします。

```
pbcopy < ~/.ssh/other_id_rsa.pub
```

githubやbitbucketのSSH鍵設定画面でペーストし、登録します。


## bitbucket / github への接続方法をhttps接続からssh接続に変更する
まずは現状の設定の確認のために下記のコマンドを実行して下さい。

```
git remote -v
````

下記のように表示されればssh接続になっているので設定は不要です。

```
origin	git@bitbucket.org:your-organization/example.git (fetch)
origin	git@bitbucket.org:your-organization/example.git (push)
```

下記のように表示されるとhttp接続になっているので、originのURLを変更する必要があります。

```
origin	https://your-account@bitbucket.org/your-organization/example.git (fetch)
origin	https://your-account@bitbucket.org/your-organization/example.git (push)
```

その場合は下記コマンドで変更してください。

```
git remote set-url origin git@bitbucket.org:your-organization/example.git
```

## bitbucket / github に接続する際に利用する鍵を指定する
現在の状態ではgithub/bitbucketに接続する際に、デフォルトの`~/.ssh/id_rsa`を利用してしまいます。
なので`~/.ssh/config`に設定を追加しましょう。
このファイルに追加することで接続先別に利用する鍵を設定することができます。

bitbucketの場合

```~/.ssh/config
Host bitbucket.org
    HostName bitbucket.org
    User your-account
    IdentityFile ~/.ssh/other_id_rsa
```

githubの場合

```~/.ssh/config
Host github.com
    HostName github.com
    User your-account
    IdentityFile ~/.ssh/other_id_rsa
```


## 秘密鍵のパスワードを毎回入力しないようにする
ここまでの設定で `git clone` などをすると、秘密鍵のパスワードの入力を求められてしまいます。
毎回これを入力するのは大変なので`ssh-add`を使ってパスワードをmacのキーチェーンに保存しましょう。


[githubの提示する手順](https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent)を参考にしています。

下記コマンドを実行します。

```
ssh-add -K ~/.ssh/other_id_rsa
```

するとpassphraseの入力を求められるので入力します。
以上でキーチェーンへの登録は完了です。
キーチェーンを開いて 「other_id_rsa」で検索してみると、登録されたデータが確認できます。


※はじめに記述されているssh-agentを立ち上げる下記コマンドはmacでは不要です。

```
eval "$(ssh-agent -s)" 
```

# まとめ
以上で設定は終わりです。

macの場合はキーチェーンなどがあるので割と設定が簡単にできますね。
conohaのVPS + nginx+お名前.comで取得したドメイン&サブドメインの設定

タイトルの材料でサブドメインを付けたサイトをつけようとしたら色々ハマったので、備忘録に

# 前提
- [x] conohaVPSを既に借りている
- [x] nginxをインストール済
- [x] お名前.comでドメインを取得している
- [ ] conohaにドメインの設定をしている
- [ ] conohaにサブドメインの設定をしている
- [ ] nginxにサブドメインの設定をしている

# TL;DR
サブドメインとは:https://www.nadukete.net/domain-guide/beginners/subdomain.html

# Domeinの設定
##必要手順
- お名前.comでサブドメインの追加をする必要がある
- conohaでサブドメインの追加をする(当然、お名前.comの名前と同じ
- nginxの`/etc/nginx/conf.d`内に適当な名前.confを作る必要がある

## Conohaでドメインの設定をする
このURLでドメインの設定をする→https://manage.conoha.jp/DNS/
![ConoHaコントロールパネル 0030-02-09 21-39-47.png](https://qiita-image-store.s3.amazonaws.com/0/141049/045b9205-47b6-ddc4-7c8c-5d08f11d613c.png)

## Conohaでサブドメインの設定をする
conohaでDNS＞対象のドメイン＞編集ボタンを押す
以下の設定をして保存する
![ConoHaコントロールパネル 0030-02-09 21-53-13.png](https://qiita-image-store.s3.amazonaws.com/0/141049/a21716ed-a5f0-951a-7908-a0b29b09870c.png)


## お名前.comの設定
こちらの記事を参考にしたらできる: https://qiita.com/megane42/items/df84f87c0bdcdd015eb6
## お名前.comでサブドメインの設定をする
1. 上の4つのタブの「ドメイン設定」から「DNS関連機能の設定」を選択
2. 変更したいドメインを選択し、「次へ進む」ボタンをクリック
3. 「DNSレコード設定を利用する」を選択
4. host名には自分が決めたサブドメインを、valueにはconohaVPSのIPアドレスを追加する

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f39353436392f34363030616664332d313036662d326238332d373236332d3030616638306534316461332e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/141049/1469c890-0ad1-b4e4-dc50-374c728279e2.png)


## Nginxの設定
↑までできたら、次はNginxの設定をする
＊上記の設定の反映までに少し時間がかかる

brewでnginxをinstallしていたら、`/etc/nginx/conf.d/`がある。
そこに適当な名前のファイル.confを作って、下のように書いて保存する

```:/etc/nginx/conf.d/適当な名前.conf
server {
  listen 80;
  server_name サブドメイン名.ドメイン名;   # サブドメインがhoge, 取得したドメインがsample.comならhoge.sample.com
  location / {
    proxy_pass http://127.0.0.1:ポート番号; #自分のアプリが使用するアプリのポート番号を入れる必要がる（IPTABLESを使用するならportを開けておく必要がある）
  }
}
```

```sudo nginx -s reload```などでnginxの再起動をする。
Xamarin を利用する人が見るべき情報源・おすすめ本・問題解決方法

Facebook で Xamarin を学習したい人がいたのでその時に送り付けた文章をもとに作成しています。
# 対象者

- プログラミングはやったことあるけど、 Xamarin については知らない人。
- 自分で調べて解決しようととする人。
- 大学生

# Xamarin を学習したい人が学習をした方がいい順番

自分が Xamarin を使い始めたころと比べるとはるかに日本語での情報が増えてきたので１回まとめてみたいと思います。

1. Xamarin 初心者向けの本を図書館とかで借りる
2. JXUG.org にあるハンズオンをいくつか試してみる
3. Xamarin 公式ドキュメントと和訳本を見ながら小さな規模の作品を作成する
4. 英語のドキュメント等を利用してアルバイトとかでXamarin を利用したもの作成できるようになる

# 解説

## Xamarin 初心者向けの本を図書館とかで借りる

Xamarin について書かれた入門書はいくつかあります。
その中からおすすめな本をいくつか紹介します。
買うのが難しい人は、大学の図書館に購入申請をして入れてもらうといいでしょう。（春休み中に入れてもらいましょ！

### かずきのXamarin.Forms入門

元Microsoft MVP で現在Microsoft社員をされているかずきさん (@okazuki )さんの書かれた本？です。内容が網羅的！

http://amzn.to/2Bj798R

### Essential Xamarin, Extensive Xamarin

Xamarin についての詳しい人が書いた同人誌が商業誌になった本です。
一般的な商業誌では手が回らないようなレベルの高い記事を中心に書かれています。
一番の見どころは Xamarin を開発している @atsushieno さんの記事も載っていることでしょうか。
それ以外にもユニークな記事がたくさん収録されています。

#### Essential Xamarin

http://amzn.to/2ERudLC

#### Extensive Xamarin

http://amzn.to/2ESRbSP

自慢ですが、 Extensive Xamarin の方に Microsoft Cognitive Services と Xamarin を連携させるお話を書きました。

### Xamarin エキスパート養成読本

プログラミングの経験がまだあまりない人におすすめ！！

http://amzn.to/2EQHvIo

### Xamarinネイティブによるモバイルアプリ開発 C#によるAndroid/iOS UI制御の基礎 

すでに iOS, Android でアプリを作成した方におすすめ。

http://amzn.to/2ERBE5J

より詳しい Xamarin の本の解説については、 Microsoft MVP のにゃんちゅうさんの記事が参考になるかと思います。

http://toshi0607.com/event/how-to-deal-with-xamarin-books/

## JXUG.org にあるハンズオンをいくつか試してみる

入門書を読んだ方は、その知識を使って Xamarin についてのハンズオンに挑戦してみるといいと思います。
ハンズオンについては、 JXUG(Japan Xamarin User Group) というグループのウェブサイトに掲載されています。

http://jxug.org/links.html

>Dev Days 簡易版のハンズオン

が手軽でお勧めです。
自慢ですが、このリンク集は私が作りました。

## Xamarin 公式ドキュメントと和訳本を見ながら小さな規模の作品を作成する

ハンズオンをいくつかさらってみてある程度知識がついてきたところで
その知識を使って小さな規模のアプリを Xamarin を利用して作成するといいと思います。

そのためには、さらに知識が必要になります。そのためのドキュメントは、

### Xamarin は公式ドキュメント

Xamarin は公式ドキュメントが優秀なのでのぞいてみるといいでしょう。
しかし、英語で記述されています。

https://www.xamarin.com/

### Xamarin の和訳本

そんな方には Xamarin についての公式本を和訳した本が出ているのでそれを購入するといいと思います。
内容がとにかく多いですが、その分知識はつきます。

http://amzn.to/2BlhHUT

## 英語のドキュメント等を利用してアルバイトとかでやれるように知識をつける

### さらにグレードアップルするために

#### Xamarin.Forms 使うなら、 Github 見れば細かな仕様とか確認できる
https://github.com/xamarin/Xamarin.Forms

#### 情報を得るときのコツは英語でググること。

日本語でまずググるのはいいけど、あまり出てこない。エラーの解決方法については特に出てこない。

StackOverFlow は Xamarin においても重要な情報源になります。

https://stackoverflow.com/

#### 細かなTipsについては、

Microsoftの公開している サンプル（という規模ではないが）が参考になるので詰まったら気分転換にソースコードを眺めると良い
特にアプリケーションの実際に開発を進めていく上での構成とかは参考になる箇所が多いかと思います。
https://github.com/Microsoft/SmartHotel360-mobile-desktop-apps
緑本メモ: MCMCサンプルをJAGSとRで実行 - ランダム効果1個版 (10.3.1節)

[緑本サイト](http://hosho.ees.hokudai.ac.jp/~kubo/ce/IwanamiBook.html)から`data7a.csv` と `model.bug.txt` をダウンロードする。
[9章の例題をJAGSでやるメモ](http://d.hatena.ne.jp/dichika/20120522/1337681689)の記載の通り、ダウンロードした `model.bug.txt` の文末にセミコロン`;` を追加しておく。

このファイル(データとモデル)をもとに下のようにして、パラメータの推定・可視化と、MCMCが収束しているかの評価値をそれぞれ出力する。

## パラメータの推定と可視化

下のRコードで、切片βと個体差のばらつきsのパラメータをJAGSによるMCMCによって推定する。

```r
library('rjags')

d <- read.csv("data7a.csv")
filename <- 'model.bug.txt'
N <- nrow(d)

list.data <- list(
  N = N,
  Y = d$y
)

inits <- list(
  beta  = c(0),
  r     = rnorm(N, 0, 0.1),
  s     = 1
)

m <- jags.model(
  file = filename,
  data = list.data,
  inits = list(inits, inits, inits),
  n.chain = 3
)

update(m, 100)

post.list <- coda.samples(
  m,
  c("beta", "s"),
  thin = 10, n.iter = 10100
)
summary(post.list)

plot(post.list)
```

`summary(..)` で出力されるβ,sの推定値：

```
1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

        Mean     SD Naive SE Time-series SE
beta 0.05688 0.3395 0.006168       0.011131
s    3.03808 0.3723 0.006764       0.007663
```

`plot` で出力されるサンプリングのトレースと、周辺事後分布の近似：

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7006/e50427c3-1841-9b8f-840f-62d8b6564558.png)

## MCMCの収束の評価値の出力

[9章の例題をJAGSでやるメモ](http://d.hatena.ne.jp/dichika/20120522/1337681689)と同様に `R2jags` で収束評価値 `R-hat` を出力する：

```r
library('R2jags')

post.jags <- jags(
  data = list.data,
  inits = list(inits, inits, inits),
  parameters.to.save = c("beta", "s"),
  n.iter = 10100,
  model.file = filename,
  n.chains = 3,
  n.thin = 10,
  n.burnin = 100)

print(post.jags) # R-hat
```

出力結果（右から二番目の列に `R-hat`）：

```
Inference for Bugs model at "model.bug.txt", fit using jags,
 3 chains, each with 10100 iterations (first 100 discarded), n.thin = 10
 n.sims = 3000 iterations saved
         mu.vect sd.vect    2.5%     25%     50%     75%   97.5%  Rhat n.eff
beta       0.045   0.332  -0.607  -0.176   0.039   0.262   0.709 1.001  2500
s          3.019   0.364   2.393   2.758   2.996   3.247   3.806 1.001  3000
deviance 223.184  13.582 197.821 213.551 222.686 232.133 251.500 1.001  3000
```

R-hatが1.0付近で1.1より小さければ収束していると判断。
docker-compose+nginxでリバースプロキシを設定する

#この記事について
dockerで複数Webサービスをたてる時に
他コンテナのサービスをnginxでリバースプロキシをしたので、
その時の設定をまとめます。

# 構成
サービス

 - nginx 
 - jenkins (CIツール)
 - portainer (Dockerコンテナ管理ツール)

遷移したいURL

- nginx
    - http://localhost
- jenkins
    - http://localhost/jenkins
- portiner
    - http://localhost/portiner

``` docker-compose.yml
version: "3"
services:
  nginx:
    build: nginx #./nginx/Dockerfileを使って起動する
    ports:
      - "80:80"
    depends_on: #jenkins,portainerの後に起動させるため設定する
      - jenkins 
      - portainer
  jenkins:
    image: jenkins/jenkins:lts
    environment:
      - JENKINS_OPTS=--prefix=/jenkins #Nginxで設定するためにprefixを指定する
    ports:
      - "8080:8080"
    volumes:
      - ./jenkins/home:/var/jenkins_home
    restart: always
  portainer:
    image: portainer/portainer
    ports:
      - "9001:9000" #右側で指定したポート番号をnginxで使用する
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./portainer/data:/data
    restart: always
```

``` bash:./nginx/Dockerfile
FROM nginx # 公式のimageを使う
COPY ./default.conf /etc/nginx/conf.d/default.conf # nginx設定ファイルをコンテナにコピーする
```

portinerの設定に関しては
https://github.com/portainer/portainer-compose/blob/master/nginx/config/portainer.conf
を参照する

``` bash:./nginx/default.conf
  upstream portainer {
      server portainer:9000;
  }

  server{
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    location /jenkins {
      proxy_pass    http://jenkins:8080;
    }

    location /portainer/ {
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_pass    http://portainer/;
    }

    location /portainer/api/websocket/ {
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_http_version 1.1;
      proxy_pass http://portainer/api/websocket/;
   }
}

```
rbenv: no such command `install'

# rbenv install -l で　rbenv: no such command `install'

ruby-buildはインストール済みでもこれが発生しました。

下記実行済みでありruby-buildも勿論存在している。

```bash
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

なので、ruby-buildに用意されている、./install.shを叩くをインストールされる。

```bash
sudo .rbenv/plugins/ruby-build/install.sh
```
FreeCADのpythonマクロでTree viewをReport viewに表示 してみた

```python
# -*- coding: utf-8 -*-
def MYSelect_all():
# https://forum.freecadweb.org/viewtopic.php?f=3&t=19248
# Code: Select all
    Gui.Selection.clearSelection()
    for obj in FreeCAD.ActiveDocument.Objects:
        if obj.ViewObject.isVisible():
           Gui.Selection.addSelection(obj)
    return
# ------------------------------------------------------
def MYclear_report():
# https://forum.freecadweb.org/viewtopic.php?t=9825
# clear console and clear report by python
    from PySide import QtGui
    mw=Gui.getMainWindow()
    r=mw.findChild(QtGui.QTextEdit, "Report view")
    r.clear()
    return
# ------------------------------------------------------
import time
print "開始:",time.ctime()
MYclear_report()
MYSelect_all()
# https://www.freecadweb.org/wiki/Manual/jp
# 選択機能を使う
for o in Gui.Selection.getSelectionEx():
	print "オブジェクト = ",o.ObjectName ,"(",o.Object.Label,")"
	for s in o.SubElementNames:
		print "name: ",s
	for s in o.SubObjects:
		print "object: ",s

Gui.Selection.clearSelection() 
print "終了"

# o.Labelとすると、以下のエラーがでます。
# <type 'exceptions.AttributeError'>: 'Gui.SelectionObject' object has no attribute 'Label'
```
(参考)マクロでラベルを出力する方法を教えて下さい
https://forum.freecadweb.org/viewtopic.php?f=16&t=26805
Git 大文字·小文字ファイル変更を差分対象の設定にする方法

## 差分対象にしているか確認するコマンド
### Windows10
```
git config -l --local |findstr core.ignorecase
```
### Mac OS X
```
git config -l --local | grep core.ignorecase
```


### 戻り値
```
// 差分対象にしていない
core.ignorecase=true

// 差分対象にしている
core.ignorecase=false
```


## 差分対象を変更
```
// 差分対象にしない
git config core.ignorecase true

// 差分対象にする
git config core.ignorecase false
```
[atom] Rails・React開発で便利なパッケージ


## linter-ruby
Rubyのコードをチェックしてくれる．

## linter-jshint
JavaScriptのコードをチェックしてくれる．

## language-javascript-jsx
JavaScript, ES6, ES7, React JSX, Flowなどのフォーマットが扱えるようになる．

## react
React.js(jsx)をサポートし，インデント，補完などもしてくれる．

## atom-beautify
コードインデントを綺麗に整形してくれる．

## highlight-selected
単語をダブルクリックすると，同じ単語をハイライト表示される．

## maximize-panes
選択中のパネルを'cmd+shift+enter'で一時的に最大化．

## japanese-menu
設定が日本語になる．

## file-icons
ファイルアイコンがカラフルになる．
Excelのセルに設定する入力規則リストの文字数制限

##エクセルのセルに設定する入力規則のリストには文字数制限がある
- 設定できる文字数は1000文字以内との事
- VBAなどで長い文字列を直接設定すると、バリデーションルール違反となる
- 参照データは別のシートや別の範囲に書出し、そこを参照する様にコーディングすべし
Pepperが突然しゃべらなくなった時の原因メモ

今まで直面した(たぶん)全パターンメモ

### ① 機体の音量が小さくなっている
　→ Pepperの音量をあげましょう

### ② 発話させようとしている言語と機体の設定言語が異なる
例) 日本語をしゃべらせようとしてるけど実はPepperは英語モードだった
　→ Pepperの言語を切り替ましょう

### ③ 発話させようとしている言語がインストールされていない
例) 中国語が入ってない一般発売モデルで中国語を読ませようとしていた
　→ 対応言語がインストールされている機体を使いましょう

### ④ セリフ内に全角の特殊文字が潜んでいる
【要注意文字リスト】
・ **全角の**特殊文字：「①」「゜」「㎡」「㍍」「％」「￥」絵文字など
　※半角だとOKなやつもある
・一部の非常用漢字・旧漢字：「髙橋」など
　※非常用・旧でもほとんどはOKだけど稀にダメなものがある

例) 「昔々おし゛いさんとおは゛あさんが住んでいました❤︎」
　→ Excelからコピペする時とか注意しましょう
　→ 入力ルールや制限をつけましょう
　※ 読めない文字だけスキップするパターンと、発話丸ごとできなくなるパターンがあるみたい

### ⑤ 謎の制御文字[BS]が混入している
Sublime Textで開いた時に出現するこいつ
https://qiita.com/krat/items/d4248e5b7af87898d323
Dialogの.topファイルに混入するとダメっぽい
　→ Sublime Textで確認しましょう
 
### ⑥ 発話に使っているSay内のスクリプトが古いライブラリのもので、現行のNaoqiに対応していない
　→ 新しいver.のSDK内のライブラリにあるboxと差し替えましょう

### ⑦ SDK ver2.5.5.5のSayをTimelineの中に入れる
この状態にするとなぜか**英語だけ**発話できなくなる
（Sayを外に出すと発話できるようになる）
![say_2.5.png](https://qiita-image-store.s3.amazonaws.com/0/65230/a4ce6614-d185-da4b-095e-f204c0490b35.png)

　→ 2.5.5.5のSay boxを使わないようにしましょう
【Azure】サーバからBlob Storageにファイルアップロード（Azure CLI）

#Azure CLIをYumインストールする
[Azure CLIインストール方法（MicroSoft公式ドキュメントより引用）](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-yum?view=azure-cli-latest)


#方法
###Azureにログイン

```
# az login
```


###ファイルアップロード

```
# az storage blob upload -c <アップロード先コンテナ名> --file <アップロードするファイルpath> --account-key <アクセスキー> --account-name <ストレージアカウント名> --name <アップロード後の名前>
```


##その他
###ファイル削除

```
# az storage blob delete -c <コンテナ名> --account-key <アカウントキー> --account-name <ストレージアカウント名> --name <削除するファイル名>
```

###コンテナ内のBlob一覧表示
```
# az storage blob list -c <コンテナ名> --account-key <アカウントキー> --account-name <ストレージアカウント名>
```
特定の Static Cell を消す

### Static Cells で定義した TableView から、緑の cell を消す

![1518172925454.JPEG](https://qiita-image-store.s3.amazonaws.com/0/230887/2ccdb153-5961-cdc2-90bd-bdb92ae00359.jpeg)


## cell の height を 0 にする

```swift
    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        if indexPath.row == 4 {
            return 0
        }
        return super.tableView(tableView, heightForRowAt: indexPath)
    }
```

height を 0 にしただけなので、Storyboard 上には緑の cell は残り続ける。気持ち悪い…。

![スクリーンショット 2018-02-09 13.26.25.png](https://qiita-image-store.s3.amazonaws.com/0/230887/0997b7cf-dedf-ddde-73ac-a874b3da3ed0.png)

## cell のロードをスキップする

```swift
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return super.tableView(tableView, numberOfRowsInSection: section) - 1
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.row > 3 {
            return super.tableView(tableView, cellForRowAt: IndexPath(row: indexPath.row + 1, section: 0))
        }
        return super.tableView(tableView, cellForRowAt: indexPath)
    }
```

前述の方法よりコード量は多くなるが、無駄な cell をロードするコストが減る。
ポするとプテピピックするサーバレスBOTを作りました

# 💡作ったもの
Slack の特定の Reaction に反応し、Reactionで反応し返してくれるサーバレスBOTです。

![demopo](https://qiita-image-store.s3.amazonaws.com/0/130874/8746d9d7-0fe2-bb9d-8e94-eaf706eeea81.gif)

Slack の BOT と Subscribe を使うことで、全ての Reaction を API-Gateway 経由で Lambda に受信します。
特定の Reaction だった場合は Slack API を呼び出して、Reaction を複数つけ返します。
Slack BOT は手動で設定する必要がありますが、AWS 側は Serverless Framework を使うことで環境構築を自動化しています。

Serverless Framework なしで作る手順は[前回記事](https://qiita.com/saitotak/items/822bf2dce7e3baa25ae0)参照。

# :octocat:成果物
[saitota/SlackServerlessReactionBot](https://github.com/saitota/SlackServerlessReactionBot)

# ✋構築手順
## 必要なもの
- AWS アカウント
- Serverless Framework
- Slack アカウント

## 導入手順
### 1. [ここ](https://api.slack.com/slack-apps) からBOT作成
    - Bot User
        - Display Name
        - Default Username
    - Permissions
        - OAuth & Permissions
            - Scopes
                - channels:history
                - channels:write
                
### 2. トークンを２つ取得
    - Permissions
        - OAuth & Permissions
            - OAuth Access Token
            - Bot User OAuth Access Token

### 3. リポジトリをClone

```bash:console
$ git clone https://github.com/saitota/SlackServerlessReactionBot.git
```

### 4. Serverless の設定ファイルを編集、先程のトークンで書き換えてください

``` sererless.yml
OAUTH_TOKEN: 'xoxp-000000000000-000000000000-000000000000-0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x'
BOT_TOKEN: 'xoxb-000000000000-0x0x0x0x0x0x0x'
```

### 5. Serverless Framework でデプロイ (事前にaws-cliの初期設定が必要です)

```bash:console
$ sls deploy ./SlackServerlessReactionBot
...
api keys:
  None
endpoints:
  POST - https://0x0x0x0x0x.execute-api.ap-northeast-1.amazonaws.com/prod/
functions:
  fnc: SlackServerlessReactionBot-prod-fnc
```

### 6. Slack BOT のエンドポイント設定と、Subscribe設定をします
- Event Subscriptions
    - Request URL: `set your endopint url(you can see in your deploy log)`
- Subscribe to Workspace Events
    - reaction_added
    - reaction_removed

### 7. 設定完了！
Slackで `HOOK_REACTION` のリアクション（デフォルトは👍）をつけてみましょう

## ハマった所
Lambda が実行されると Slack から下記メールが届いて、勝手に Subscribe が Disable されることがありました。ググっても情報なくログ見てもわからず、API-Gateway と Lambda-Function を再作成すると治りました。根本原因わかりませんでしたが、HTTP Return Code が悪かったのかもしれません。

```text:emailfromslack
Events are disabled for BOTNAME.
Something's gone awry with BOTNAME, so we've temporarily stopped sending events to it. Not to worry—we're sure you can get it fixed right up.

Please log in to correct the problem, and feel free to reply to this email if you need help.
```

# 📝あとがき
　公開用に Serverless Framework を使ってみました、クラウド環境構築部分をコード化でき、配布可能な形にできるのでとても素敵です。BOT 作成のところも自動化できるといいんですけどね。
gradleでビルドしたライブラリをgroovyで使う

mavenのローカルリポジトリとかいろいろ面倒なこと調べてハマったけど、
単純に`groovy`で *classLoader* に追加すれば使えるらしい。

```sh
$ gradle -v

------------------------------------------------------------
Gradle 4.1
------------------------------------------------------------

Build time:   2017-08-07 14:38:48 UTC
Revision:     941559e020f6c357ebb08d5c67acdb858a3defc2

Groovy:       2.4.11
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM:          1.8.0_131 (Oracle Corporation 25.131-b11)
OS:           Mac OS X 10.12.6 x86_64
```

# gradle側

## 配置

```sh
$ tree
.
├── build.gradle
└── src
    └── main
        └── java
            └── hoge
                └── xxxxx
                    └── MyLibrary.java
```

```groovy:build.gradle
apply plugin: 'java-library'

group = "hoge"
archivesBaseName = 'xxxxx'
version = "0.0.1"
```

```java:src/main/java/hoge/xxxxx/MyLibrary.java
package hoge.xxxxx;

public class MyLibrary {
    public String testMethod() {
        return "HelloWorld!";
    }
}
```

## ビルド

```sh
gradle build
```

すると `xxxxx-0.0.1.jar` ができる。

```
.
├── build
│   ├── classes
│   │   └── java
│   │       └── main
│   │           └── hoge
│   │               └── xxxxx
│   │                   └── MyLibrary.class
│   ├── libs
│   │   └── xxxxx-0.0.1.jar
│   └── tmp
│       ├── compileJava
│       └── jar
│           └── MANIFEST.MF
```

# groovy側

*classLoader* に追加して

```groovy:a.groovy
this.class.classLoader.rootLoader.addURL(new URL("file:///path/to/xxxxx-0.0.1.jar"));
@Grab(group='hoge', module='xxxxx', version='0.0.1')

import hoge.xxxxx.MyLibrary

println new MyLibrary().testMethod()
```

実行。

```sh
$ groovy a.groovy
HelloWorld!
```

## groovysh

`groovysh` の場合は `@Grab` 書くと何故がエラーになるので、これでOK。

```sh
$ groovysh
Groovy Shell (2.4.12, JVM: 1.8.0_131)
Type ':help' or ':h' for help.
-----------------------------------------------------------------------------------------------------------------------
groovy:000> this.class.classLoader.rootLoader.addURL(new URL("file:///Users/kuryu/workspace/grb2/build/libs/xxxxx-0.0.1.jar"));
===> null
groovy:000> import hoge.xxxxx.MyLibrary
===> hoge.xxxxx.MyLibrary
groovy:000> println new MyLibrary().testMethod()
HelloWorld!
===> null
groovy:000>
```
Unity2017でARアプリ - 5.Blenderで作ったオブジェクトを組み込む

BlendeのオブジェクトをUnityへ取り込んでみます。
##1.Blenderで立体を作る
手抜きですが・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/1982bc4d-a163-c12d-8a10-8608dbffcde0.png)
blendファイルで保存しました。
UV展開する必要は特にないかもしれません。
##2.Unityへインポートする。
>Unity Documentation
Blender からオブジェクトをインポート
https://docs.unity3d.com/ja/2017.3/Manual/HOWTO-ImportObjectBlender.html

によると、「blend ファイルをプロジェクトの Assets フォルダーに保存します」それだけです。
そこで、保存したblendファイルをAssetsにドラッグアンドドロップしたところ、インポートされました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/23194563-a8e0-e29d-3d98-0475dad02077.png)
上図はテクスチャーを貼ってみたところです。
なお、青い球はUnityのShereです。
##3.動作テスト
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/dd54621f-6e7a-8c0c-0df8-6439ca8cf672.png)
MacVimをMarkdownプレビュー＆編集ツールにする

## 必要なプラグイン


* [previm](https://github.com/kannokanno/previm)  
プレビュー用のプラグインです
* [vim-markdown](https://github.com/plasticboy/vim-markdown)  
プレビューするだけなら必要ないですが、シンタックスハイライトなど便利です

## 必要な設定

主にPrevim用の設定です。

```vim
" {{{ previm plugin settings
"---------------------------------------------------
let g:previm_open_cmd = 'open -a Google\ Chrome'
augroup PrevimSettings
    autocmd!
    autocmd BufNewFile,BufRead *.{md,mdwn,mkd,mkdn,mark*} set filetype=markdown
augroup END
" }}}

```

## 書いて保存する

```md
## 見出し
* リスト１
* リスト２
```

## プレビューする

バッファを開いた状態でPrevimOpenコマンドを実行すると

![previm.gif](https://qiita-image-store.s3.amazonaws.com/0/20045/03af0a61-e5cc-4208-5ce7-9aab14ea10bd.gif)

ブラウザが開いてMarkdownで書いたドキュメントをプレビューできます。

<img width="360" alt="sample_md_browser.png" src="https://qiita-image-store.s3.amazonaws.com/0/20045/34459e76-ed1d-333b-d4ab-56fa52fe89db.png">

以上です。
java 配列、リスト、マップの勉強

# はじめに
javaの配列型、リスト型、マップ型を整理するためにまとめました。
LL言語しか使ったことがなかったのでjavaはかなりとっつきにくく感じますね。。

# 型の宣言
### 配列

```:java
String[] demo_array = new String[3];
```
### リスト

```:java
List<String> demo_list = new ArrayList<>();
```
### マップ

```:java
Map<String, String> demo_map = new HashMap<>();
```

# 値の代入
### 配列
Array[index] = value で代入

```java
demo_array[0] = "赤";
demo_array[1] = "黄";
demo_array[2] = "緑";
```

### リスト
List.add(value) で代入

```java
demo_list.add("赤");
demo_list.add("黄");
demo_list.add("緑");
```

### マップ
HashMap.put(key, value)で代入。

```java
demo_map.put("red","赤");
demo_map.put("yellow","黄");
demo_map.put("green","緑");
```

# 取得
### 配列
array[index]で取得

```java
// 配列の取得
String color_red = demo_array[0];
// 配列の取得（一括）
for (String color : demo_array) {
    System.out.println(color);
}
```

### リスト
list.get(index)で取得。

```java
// 値の取得
String color_yellow = demo_list.get(1);
// 値の取得(一括)
for (String color : demo_list) {
    System.out.println(color);
}
// ラムダを使うと..
demo_list.forEach(value -> System.out.println(value));
```

### マップ
HashMap.get(key)で取得。

```java
// 値の取得
String color_green = demo_map.get("green");
// 値の取得(一括)
for (String key : demo_map.keySet()) {
    System.out.println(demo_map.get(key));
}
// ラムダを使うと..
demo_map.forEach((key, value) -> {
    System.out.println(key);
    System.out.println(value);
});
```
Planning Analytics Local と Cognos Analytics のCAM認証実装手順

#概要
Cognos TM1の認証でCAM認証というCognos BIの認証機能を利用する認証方式がありました。
Cognos TM1の後継のPlanning Analytics Local(PAL)でもCAM認証がありますが、相手はCognos Analyticsとなります。
今回、初めてPALでのCAM認証を実装してみましたので、手順を投稿しておきます。

#手順
まず、普通にCognos AnalyticsとPlanning Analytics Localの導入と、それぞれ動作するところまで手順省略します。

PALのインストール先の以下のフォルダに「bi_interop.zip」というファイルがあるので、右クリックして「すべて展開」を選択します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/413fe8d7-1562-a240-fc06-32611db7efe9.png)

展開先として、大胆にもCognos Analyticsのフォルダを指定します。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/8543d3f2-bb44-1cc2-0455-2e65a75e775b.png)

思い切って上書き。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/fa3b7943-087d-8eb5-1e41-713acac3e238.png)

置き換え。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/66bc9074-ef9d-8ea3-bfe5-3a867d70de2d.png)

以下のCognos Analyticsのフォルダの「tm1web.html」というファイルをメモ帳で編集します。
編集箇所は赤枠の「tm1webServices」のHOSTNAMEのところを、TM1Webのホスト名を指定します。
※できればFQDNで指定しましょう。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d9bf047c-5855-7e75-7387-bf39bfc8a4a1.png)

同様に以下のファイルも変更する。
**C:\Program Files\ibm\cognos\analytics\webcontent\pmhub.html**
// Update the following to point to the location of the pmhub service(s)
var pmhubURLs = ["http://hostname:9510","http://hostname:9580"];

**C:\Program Files\ibm\cognos\analytics\webcontent\planning.html**
// Update the following to point to the location of the planning service(s)
var planningServices = ["http://hostname:9510","http://hostname:9580"];

次に、Cognos Analyticsのwebcontentフォルダの下の「tm1」というフォルダごとコピーします。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/0de1eb5f-bee6-c43d-0261-4c6474b5fc7f.png)

貼り付け先は、以下のフォルダ。Cognos Analyticsのwebcontentの「bi」フォルダの下に貼り付けます。
※この手順、マニュアルとかに書いてないですが、これをやらないとエラーになります。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b2ebf490-7135-7ef5-2a4e-1e7d3662871e.png)

各TM1サーバーの、Tm1s.cfgファイルを編集します。
編集箇所は、以下のServerCAMURIとClientCAMURI。
HOSTNAMEは、Cognos AnalyticsのHOSTNAMEです。※できればFQDN。
ちなみに、SSOなどでCognos AnalyticsにオプショナルのGatewayを構成している場合、ClientCAMURIはこちらになります。
ClientCAMURI=http://HOSTNAME/ibmcognos/bi/v1/disp
あと、今まで書いていたCAMPortalVariableFileは書かなくて良いみたいです。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5c16b3e8-03f2-a0b9-946e-4a38c5e31ea8.png)

IntegratedSecurityModeはもちろん「5」。
![010.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/25aa4404-abfd-aef4-a750-28029380ec0f.png)

Cognos AnalyticsのCognos Configurationで、Cognos Application FirewallにTM1側のHOSTNAME(FQDN使用の場合FQDN)を記載します。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e5946994-29e3-f3e3-5118-6504ae38edca.png)

Cognos Analytics及びPlanning Analytics Localのサービスを起動します。

TM1Webにアクセス。以下の画面になるので「ログオン」。
![011.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/869ba335-f9c2-eb84-6078-2d5650bbab85.png)

Cognos Analyticsのログイン画面にリダイレクトされるので、IDとパスワード指定してサインイン。
![012.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/6145b17a-3969-b982-ee66-00288f25a8ee.png)

TM1Webに戻ってきて、CAMのユーザーでログインが完了しています。
![013.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/a1520832-3731-771f-db31-7084e2d12f43.png)

ご活用下さい。
PrimeReactのテーブルコンポーネントが多機能で結構使える

PrimeReactっていうReactのUIライブラリがある。OSS

- [公式サイト](https://www.primefaces.org/primereact/#/)
- [GitHubページ](https://github.com/primefaces/primereact)

元々はPrimeFacesっていうJava系のUIライブラリがあって、それのReact版 (Angular版のPrimeNGもある)
公式サイトのガイドやサポートがしっかりしていて、それなりの安心感がある

名前とかアイコンはトランスフォーマーのコンボイからとってるっぽい
[Optimus Prime - Wikipedia](https://en.wikipedia.org/wiki/Optimus_Prime)

2017/03にα版が公開されて、徐々に機能追加されていき2017/09にバージョン1.0.0がリリースされた
現在もアップデートがされていて、この記事を書いている時(2018/02/09)のLatest releaseは1.4.0
スタイルはBootstrapライクで親しみやすいが、余白が少なめな印象はある

今回はPrimeReactのテーブルコンポーネントを触って見たので、その感想
Data > DataTable (https://www.primefaces.org/primereact/#/datatable)


## 特徴

### 多機能なテーブルが作れる

自前で実装するにはそれなりに工数がかかる機能が標準で使える
各機能のデモが公式ページで見れるので、実装前に吟味もしやすい

- ページング
- ソート
- フィルタ
- 編集機能
- 行選択
- 行折りたたみ
- 列幅調整
- 列入れ替え
- 列表示/非表示
- CSV出力
- データの非同期読み込み

### ヘッダー部分に自前のコンポーネントが入れられる

テーブル系のライブラリによっては機能を増やすあまり、実装上の制約があるものもある
(ヘッダーに文字列しか挿入できなかったり、ライブラリ標準のボタンしか設置できなかったり...)
PrimeReactのテーブルはヘッダー内も自由にコンポーネントが書けるので、ライブラリによる制約がなく使える

ヘッダーに制約があることでライブラリを採用できなかったりするので、そこは安心


## 導入

実際にコンポーネントをimportして使うまでにはざっと以下の手順

1. npmパッケージのインストール
  `npm install primereact --save`

2. 各CSSのimport
  - 共通CSS：`primereact.min.css`
  - 使用テーマ：`themes/omega/theme.css`
  - FontAwesome：`font-awesome.css` (デフォルトのアイコンとして使用されている)

3. あとは使いたい場所で使いたいコンポーネントをimport
  `import { DataTable } from "primereact/components/datatable/DataTable"`

特にハードルは感じなかった


## 締めの感想
- スタイルの癖があまりないので、基本は他のUIライブラリを使って一部分だけPrimeReactを使用するとかでもうまく馴染みそう
- テーブル以外にも割と凝ったコンポーネントがあるので、要件にマッチすれば使えるところには使えそう
MacBook Pro (13-inch, 2017) は 4K/60Hz 出力できないのか？

最近、MacBook Pro (13-inch, 2017) を使い始めたのですが、4K/60Hz 出力できなくて困っています。
GPU は Intel Iris Plus 650 なので、仕様上は出力できるはずと思うのですが...。

ググってもぜんぜん情報がないため、60Hz出力できなかった環境を列挙しておきます。

# 試した環境
## ディスプレイ
- [LG Ultra HD 27UD58P-B](http://www.lg.com/jp/monitor/lg-27UD58P-B)

MacBook Pro (15-inch, 2017) からは DisplayPort 経由で 4K/60Hz 出力できているディスプレイです。

## ケーブル
- [Apple USB-C Digital AV Multiport Adapter](https://www.apple.com/jp/shop/product/MJ1K2AM/A/) + HDMIケーブル（ノーブランド）
- [ANGONO UTD010 USB-C to DisplayPort](https://www.amazon.co.jp/gp/product/B073M5F2RK/)
- [ANGONO UCTH020 USB-C to HDMI@60Hz](https://www.amazon.co.jp/gp/product/B073M2LRJD/)
- [J5 create Type-C to DisplayPort Cable](https://www.amazon.co.jp/dp/B016ZZMV0U/)

# 今の気持ち
LG Ultra HD 27HD58P-B に対して、MacBook Pro (13-inch, 2017) からの 4K/60Hz 出力は、たぶんできない。
【Mac】Localのファイルをリモートホストへ転送する方法

##やりたいこと
タイトルのことを、踏み台サーバを経由して行う。

##解決策
```ruby:terminal
$ scp -i ~/.ssh/秘密鍵ファイル ~/Desktop/update.sql user@host:
```
- scp
    - ファイルを転送する。
    - 通信はsshで暗号化される
    - Unix系のコマンド
    - 順番
        - scp [option] [コピー元ファイル(path)] [コピー先path]
- iオプション
    - scpコマンドにおけるオプション
    - 秘密鍵の読み込み

~/.sshにある、秘密鍵をサーバ側の公開鍵と合わせないといけないので、permision deniedが出るときはここを確認する。
[Elixir] 2進数で書かれたメッセージを文字に変換する

↓以下の記事で紹介されていた [Humans Not Invited](http://www.humansnotinvited.com/) というサイトですが
https://gigazine.net/news/20180208-humans-not-invited-captcha/

meta description を見てみると2進数で説明が書いてあることに気づきました :sparkles:

![スクリーンショット 2018-02-09 18.36.22.png](https://qiita-image-store.s3.amazonaws.com/0/55219/dc96adec-85f2-ca7d-040a-cef1600213b2.png)

```html
<meta name="description" content="011010000111010101101101011000010110111001110011001000000110111001101111011101000010000001101001011011100111011001101001011101000110010101100100001011000010000001110111011001010110110001100011011011110110110101100101001000000110001001101111011101000111001100100001">
```

何が書いてあるか気になったので、Elixirを使って調べてみる :thinking: 


`for`使ったバージョン

```elixir
desc = "011010000111010101101101011000010110111001110011001000000110111001101111011101000010000001101001011011100111011001101001011101000110010101100100001011000010000001110111011001010110110001100011011011110110110101100101001000000110001001101111011101000111001100100001"

for <<x::binary-8 <- desc>> do
  String.to_integer x, 2
end
#'humans not invited, welcome bots!'
```

パイプ演算子使って書いたバージョン

```elixir
"011010000111010101101101011000010110111001110011001000000110111001101111011101000010000001101001011011100111011001101001011101000110010101100100001011000010000001110111011001010110110001100011011011110110110101100101001000000110001001101111011101000111001100100001"
|> String.codepoints |> Enum.chunk(8) |> Enum.map(&Enum.join/1) |> Enum.join(&String.to_integer(&1, 2))
#'humans not invited, welcome bots!'
```

やってることは2進数の文字列を8ビットごとの配列に変換し、それを更に整数の配列に変換しているだけですが、
iex上で実行すると 文字列として表示してくれます ( ~~なんでだろう~~)
iPhoneにipaを入れるツール

Apple Configurator 2
https://itunes.apple.com/jp/app/apple-configurator-2/id1037126344?mt=12

<img width="1007" alt="スクリーンショット 2018-02-09 18.47.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/17904/e0d6fb1b-e797-4472-be03-9a2cb85e6b5b.png">

Macに実機を繋いで、メニューバーの追加ボタンから指定フォルダのipaを追加する。
![スクリーンショット 2018-02-09 18.48.41.png](https://qiita-image-store.s3.amazonaws.com/0/17904/f37062bc-d5d1-e762-27bb-2814ff820964.png)
解决docker删除container出现device or resource busy


## 问题：

基本环境是CentOS7.3 kernel version：3.10.0-514.el7.x86_64 

**docker info**:
Containers: 10
 Running: 10
 Paused: 0
 Stopped: 0
Images: 31
Server Version: 17.12.0-ce
Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: false
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 89623f28b87a6004d4b785663257362d1658a729
runc version: b2567b37d7b75eb4cf325b77297b140ea686ce8f
init version: 949e6fa
Security Options:
 seccomp
  Profile: default
Kernel Version: 3.10.0-514.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 40
Total Memory: 31.15GiB
Name: web-130.fof.lczq.com
ID: JBM5:LNHC:TWFW:XJHW:P7SA:6KCE:HT23:HAFE:EWC3:TWBJ:XOZK:PNG5
Docker Root Dir: /data1/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
 127.0.0.0/8
Registry Mirrors:
 https://wmsl2uyx.mirror.aliyuncs.com/
Live Restore Enabled: false

服务器因为电源问题自动关机，重启以后发现有的container不能被删除。

```
docker-compose down

报错：
Error response from daemon: driver "overlay" failed to remove root filesystem for <some-id>: 
remove /data1/docker/overlay/<some-id>/merged: device or resource busy

```

## 排查

经过排查发现是:/data1/docker/overlay/<some-id>/merged 是空的，但是无法删除。手动rm也会报"device or resouce busy"

尝试过重启docker，但是问题依旧。即使将docker stop，也无法删除目录。

查看mount信息，也没有发现任何挂载信息。

在docker的service里增加了

```
[Service]
# MountFlags "slave" helps to prevent "device busy" errors on RHEL/CentOS 7.3 kernels
MountFlags=slave
```
也没有解决

## 解决

最后通过搜索，发现可以通过查看进程的mountinfo来查找占用目录的进程。

```
grep <some-id> /proc/*/mountinfo

```

一般通过查找可以找到PID。

根据这个PID发现是一个/usr/libexec/colord的程序在使用。

查了一下程序的信息，发现确实是将之前删除不了的目录写在了mountinfo中。

找到进程就好办了。直接将这个进程kill掉。

重新执行docker-compose down，提示删除成功。


## 分析

估计是重启之前container的pid被这个colord占用了。导致container无法启动，同时删除的时候因为将目录写入了mountinfo中，导致无法删除。
FullCalendar の DOM 構造に基づいた SCSS

FullCalendar https://fullcalendar.io/docs/ で CSS をあれこれいじるために書き下しました。

theme-* は、 ThemeSystem の設定で設定される変数なので、 Standard なのか、 Bootstarp なのか、JqueryUI なのかに応じて書き換えてください

```scss
  > div.fc.theme-widget.fc-ltr {
    > div.fc-toolbar.fc-header-toolbar {
      // ヘッダー
    }
    > div.fc-view-container {
      > div.fc-view.fc-month-view.fc-basic-view,
      > div.fc-view.fc-basicDay-view.fc-basic-view,
      > div.fc-view.fc-basicWeek-view.fc-basic-view {

        > table.theme-tableGrid {
          > thead.fc-head > tr {
            > td.fc-head-container.theme-widgetHeader {
              > div.fc-row.theme-headerRow {
                > table.theme-tableGrid {
                  > thead > tr {
                    > th.fc-day-header.theme-widgetHeader { // fc-{day_of_the_week}　(fc-sun とか、曜日のクラスもここ
                      span { // 曜日
                      }
                    }
                  }
                }
              }
            }
          }
          > tbody.fc-body > tr {
            > td.theme-widgetContent {
              > div.fc-scroller.fc-day-grid-container {
                > div.fc-day-grid.fc-unselectable {
                  > div.fc-row.fc-week.theme-dayRow.fc-rigid {
                    > div.fc-bg { // 日付のセル
                      > table.theme-tableGrid {
                        > tbody > tr {
                          > td.fc-day.theme-widgetContent { // fc-{day_of_the_week}　(fc-sun とか、曜日のクラスもここ
                            &.fc-today.theme-today {
                            }
                       > tbody > tr {
                          > td.fc-day.theme-widgetContent { // fc-{day_of_the_week}　(fc-sun とか、曜日のクラスもここ
                            &.fc-today.theme-today {
                            }
                          }
                        }
                      }
                    }
                    > div.fc-content-skeleton { // 日付のセル内に書く内容。日付とイベント
                      > table {
                        > thead > tr {
                          > td.fc-day-top { // fc-{day_of_the_week}　(fc-sun とか、曜日のクラスもここ
                            &.fc-today.theme-today {
                              a.fc-day-number { // 日付表示
                              }
                            }
                          }
                        }
                        > tbody > tr {
                          > td { // no events, no classes
                          }
                          > td.fc-event-container {
                            > a.fc-day-grid-event.fc-h-event.fc-event { // .fc-start.fc-end もここ
                              > div.fc-content {
                                span.fc-title { // イベントの title
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
```
【Ruby】コメントアウトの小さなメモ


```ruby:test.rb
puts "test1"
# puts "test2"

puts "test3"

=begin
puts "test4"
=end

puts"test5"

__END__
puts"test6"
puts"test7"
```

```sh:出力
test1
test3
test5
```

参考：
【Ruby】コメントの書き方 - Qiita https://qiita.com/Mocacamo/items/318b193ded19fd37ffd6
【Ruby】SeleniumとMechanizeとNet/HTTPでCookieを行ったり来たり

Seleniumで手に入れたCookieでNet/HTTPのPOSTリクエストをしたい

Seleniumで手に入れたCookieをMechanizeにセットしてアクセスして画像を保存したい
<br>
そんな日ってありますよね😖
<br>
cookieを渡そうと思っても、なんかそれっぽい記事があまりない・・・

作ったので書いておきます👏

```cookie_parser.rb
require 'mechanize'
require 'selenium-webdriver'
require 'net/http'

gmail = 'https://mail.google.com/'
MAIL = '<メアド>@gmail.com'
PASS = '<パスワード>'

def request_mail(cookie)
  uri = URI.parse("<頑張ってPOST用のURL見つけてね>")
  request = Net::HTTP::Post.new(uri)
  request.content_type = "application/x-www-form-urlencoded;charset=UTF-8"
  request["X-Same-Domain"] = "1"
  request["Origin"] = "https://mail.google.com"
  request["Accept-Language"] = "ja,en-US;q=0.9,en;q=0.8,pt;q=0.7"
  request["User-Agent"] = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
  request["Accept"] = "*/*"
  request["Authority"] = "mail.google.com"
  request["Content-Length"] = "0"
  request["Cookie"] = cookie
  null = nil
  response = Net::HTTP.start(uri.hostname, uri.port, {use_ssl: uri.scheme == "https"}) do |http|
    http.request(request)
  end
  # 適当にParseしてるから、おかしかったら書き換えて
  eval(response.body.force_encoding("UTF-8").gsub(")]}'\n\n", ''))
end

def login_selenium(driver)
  sleep(1)
  driver.find_element(:name, 'identifier').send_key(MAIL)
  driver.find_element(:id, 'identifierNext').click
  sleep(1)
  driver.find_element(:name, 'password').send_key(PASS)
  driver.find_element(:id, 'passwordNext').click
  driver
end

class CookieParser
  def selenium_to_mechanize(driver, agent)
    driver.manage.all_cookies.each do |cookie|
      agent.cookie_jar << Mechanize::Cookie.new(cookie[:name], cookie[:domain], {:value => cookie[:value], :domain => cookie[:domain], :path => cookie[:path]})
    end
    agent
  end
  
  def mechanizes_to_nethttp(agent)
    cookie_str = ''
    agent.cookie_jar.to_a.each do |cookie|
      cookie_str += cookie.to_s + '; '
    end
    cookie_str
  end
end

agent = Mechanize.new
driver = Selenium::WebDriver.for :chrome
driver.navigate.to(gmail)

driver = login_selenium(driver)
sleep(3)

# SeleniumのCookieを取得
selenium_cookie = driver.manage.all_cookies
# puts selenium_cookie

cookie_parser = CookieParser.new

# seleniumのCookieをMechanizeに渡す
agent = cookie_parser.selenium_to_mechanize(driver, agent)

# mechanizeのCookieを取得
mechanize_cookie = agent.cookie_jar
# puts mechanize_cookie

# MechanizeのCookieをNet/HTTPに渡す
puts request_mail(cookie_parser.mechanizes_to_nethttp(agent))


```

リクエスト用のヘッダ情報は検証モード等を使って手に入れてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/150607/7d16dc56-7b8e-5ee7-7574-fd466faf6389.png)
CurlをコピーしてRubyのリクエストに変換してくれるやつオススメ✌️
[Curl to ruby](https://jhawthorn.github.io/curl-to-ruby/)
<br>
作ってみると簡単なんだけど、探すと時間かかった・・・
Elasticsearch(5.4.2)の謎を解明するための実験結果。１データノード・1シャードで作ると早かった

# 構成
物理3台、SSD、JVM8G

# シャードの適切な数は？
実験した結果
検索もインデックシングも１データノードあたり１シャードが最も早かった。
データノードが４なら4シャードが最速。

# 経緯
20シャードで開発開始（１Gバイト毎に1シャードという記述をどこかでみたので・・・）
CPUやIOPSから・・・本気出してない感じがあったので、イロイロといじくりまくった結果1シャードが最も早かった。

# 感想
・データノード数増加を想定して、少し多めのシャードにする
・結局レプリカも必要なので２シャードが最小になる
・もしインデックスが複数あるならバラけるので１データノード１シャード（＋レプリカ）でいいかも。



#Elasticsearch(5.4.2)実験記事
[サービス無停止でデータノードを安全に削除してメンテする。](https://qiita.com/mokoenator/items/28bd41611274c5f4c771)
[ダウンタイムなしてデータノードを追加できる？](https://qiita.com/mokoenator/items/4d92edda8b7fac5d1668)
[アクセスノード、受付ノードの振る舞いについて](https://qiita.com/mokoenator/items/9ccadbfcb6ce42ab24e4)
[辞書ファイル、スクリプトファイルの配置ノードは？](https://qiita.com/mokoenator/items/2b080ec5417a0564baf7)
[２データノードをダウン(障害だ)させて復活させる](https://qiita.com/mokoenator/items/8b1c8f7160981e9a6938)
[１データノード・1シャードで作ると早かった](https://qiita.com/mokoenator/items/38602224a50625894683)
Githubのprivate repositoryをnpm install する時に詰まりました

# 経緯
package.jsonにGithubのprivate repository が含まれており
$ npm install
の際にエラーが出て、なかなか解決できませんでした。

## 結論
こちらで解決しました。
[githubのprivate repositoryをnpmでインストールする](https://qiita.com/shinout/items/c6f12d69e68b312d62fa)


“package.json“の“dependencies“に他のモジュールと同様に記述するようです。

記事を読んでいて、特に詰まった部分はありませんでした。


## まとめ
記事を描いてくださった@shinoutさん、誠にありがとうございます。

なかなかエラーを解決できなかったので、非常に参考になりました。
pythonのリストでの括弧　() []

---

pythonのコードを久しぶりに書いたら、しょうもないミスをしたので、メモしておきます。

---
pythonのリストは`files=[]`のように書くことができ、

```
files=["ms1.txt","ms2.txt","ms3.txt"]
for i in range(0,3):
 print(files[i])
```

という風に書けば、

```
ms1.txt
ms2.txt
ms3.txt
```

と出力されます。こう見ると、とても簡単なのですが、久しぶりにコードを書いた自分は

```
files=["ms1.txt","ms2.txt","ms3.txt"]
for i in range(0,3):
 print(files(i))
```

と書いてしまいました。2つの違いは`print`文の中の`files[]`と`files()`で、括弧が違います。
リストの要素番号を`files()`と指定すると、以下のようなエラーが返ってきます。

```
    print(files(i))
TypeError: 'list' object is not callable
```

最初、なんでこんなエラー文が返ってくるかわからなかったのですが、調べてみたら
>`list()`は引数にiterableなオブジェクト(タプルや文字列)を指定するとリストに変換されます。

[リスト型の使い方](http://www.task-notes.com/entry/20150813/1439434800)
~~とのこと、いわれてみたら確かに`str()`や`int()`などと同じような関数ですね...今回は、整数を引数に指定したためにこのエラーが出てしまいました。~~

##追記
コメントで指摘してもらいましたが、エラー文はこれが原因ではないみたいです。どうも、こういう風に書くと、関数として認識されるところまではあっているみたいですが、pythonはcallメソッドにより関数を定義されていないかどうかを判断するみたいです...classやメソッドは使ったことがないのでよくわからないので、間違ったことを言っているかもしれません
FactoryGirl (Bot) - create vs build vs build_stubbed

If you are new to writing RSpec tests in Rails using FactoryGirl (bot), you can ask yourself what is the difference between **create**, **build** and **build_stubbed**. In this article, we will do our best to help you understand them better.

Let's say we are testing a valid profile creation:

```
FactoryBot.define do
  factory :profile do
    user
    sequence(:name) { |n| "Name#{n}" }
  end
end

describe Profile, type: :model do
  it 'creates valid profile' do
    expect(FactoryBot.create(:profile)).to be_valid 
  end
end
```


`FactoryBot.create(:profile)` will create profile object and all association for it. They will all be persisted in the database. Also, **it will trigger both model and database validations**. Example test performance with **create** is:

![create performance image](https://storage.kraken.io/kk8yWPxzXVfBD3654oMN/af97c5d7d8f67d27c8f49bf45842c627/create_performance_2_.png)

*Note: after(:build) and after(:create) will be called after the factory is saved. Also, before(:create) will be called before factory is saved.*

On the other hand, `FactoryBot.build(:profile)` won't save the object, but will still make requests to a database if the factory has associations. **It will trigger validations only for associated objects**. Example test performance with **build** is:

![build performance image](https://storage.kraken.io/kk8yWPxzXVfBD3654oMN/2d20ab35f3e4ba7250416336a1767f17/build_performance.png)

*Note: after(:build) will be called after factory is built.*

`FactoryBot.build_stubbed(:profile)` does not call database at all. It creates and assigns attributes to an object to make it behave like an instantiated object. It provides a fake **id** and **created_at**. Associations, if any, will be created via build_stubbed too. **It will not trigger any validations**.  Example test performance with **build_stubbed** is:

![build performance image](https://storage.kraken.io/kk8yWPxzXVfBD3654oMN/d6c3397f46fbbd24352a687c425b78ef/build_stubbed_performance.png)

*Note: after(:stub) will be called after factory is stubbed via buildstubbed.*

Keep in mind that this was a very simple test example. Better performance results are expected with more complex test suites.

Thank you for reading this article. Hopefully, it helped you better understand the differences between the ways to instantiate the objects when testing with FactoryBot.

Interested in similar topics? Be sure to check our take on [Rspec let vs before](https://kolosek.com/rspec-let-vs-before) and explanation on [FactoryGirl associations](https://kolosek.com/factory-girl-associations/). Also, if you're totally new to RSpec, we have [a guide to set it up](https://kolosek.com/rails-rspec-setup).

Originally published on [kolosek.com](https://kolosek.com/factory-girl-build-vs-build_stub/).
Maya XGen Interactive Grooming Spline を CyHair に変換する

![maya-preview.jpg](https://qiita-image-store.s3.amazonaws.com/0/36275/ba4d37a7-9f89-f080-f057-8793ad26633a.jpeg)

![gltf-spline-draw.png](https://qiita-image-store.s3.amazonaws.com/0/36275/80abe124-b960-480c-3b75-5dcccef05f77.png)


漢なら Maya Gen Interactive Grooming Spline を CyHair 形式に変換したいですね!

やりましょう!

コードはここにあります.

https://github.com/syoyo/xgen-spline-to-cyhair

## 概要

髪の毛や Fur のデータフォーマットとして, CyHair フォーマットが有名です. http://www.cemyuksel.com/cyCodeBase/soln/using_hair_files.html

Maya XGen のカーブを CyHair 形式にしたくなりますね.

ただ, Maya XGen Interactive Grooming の機能では, なぜか Maya NURBS カーブに変換する機能がありません(内部表現が Spline だからでしょうか. Interactive Grooming では無い XGen 機能だと Maya NURBS に変換できます). 

調べてみると XGen Spline API というのが提供されていて, これでスプラインデータにアクセスできるようになっています.
(Arnold とか VRay などのレンダラーではこれを介してカーブのデータをやりとりしているようですね)

https://knowledge.autodesk.com/support/maya/learn-explore/caas/CloudHelp/cloudhelp/2017/ENU/Maya/files/GUID-23DD8241-2736-4E3B-AFDB-A77E7E4A4DD6-htm.html

XGen Spline API 経由ですと, いろいろとアトリビュートにもアクセスできるようなので, これを使ってみましょう.
(キャッシュを Alembic で Curves として書き出すことはできますが, Alembic だとアトリビュートが全部付与できるか? 不明)

## Maya から XGen データを書き出す.

XGen Interactive Grooming Spline データは, 以下の MEL コマンドで, ファイルに書き出すことができます.

```
xgmExportSplineDataInternal -output "/path/to/export.xgen" "[description1]_Shape.outRenderData";
```

ここで `[description1]` はノードの名前です. たとえば, `xgen1` というノードがあったら, DAG 名(?)は `_Shape.outRenderData` をつけた `xgen1_Shape.outRenderData` となります.

この辺りの詳細は xgen の devkit あたりをあさってみてください.

## XGen API を使う

`xgmExportSplineDataInternal` で吐き出したデータを読み込むのに XGen C++ API を使います.

XGen C++ API は, OpenMaya API には依存していないので, スタンドアロンアプリとしてつくることができます.

ちなみに, XGen API を含んだバイナリを実行する時には, Maya のライセンスは求められないようです(もともと XGen は別アプリだったので, ライセンス認証のしようが無い?)

### スタンドアロンアプリのビルド
 
基本的には XGen の `include` と `lib` にパスを通してあげれば問題なく使えます

詳細はコンバーターの `CMakeLists.txt` あたりを参照ください.

OpenMaya などには依存していませんが, `libclew` と `libPtex` あたりだけ maya 本体の `lib` への依存関係があるので, 実行時 `LD_LIBRARY_PATH` でサーチパスを調整する必要あります.

## CyHair ファイルをつかう.

コンバートした CyHair データは, PBRTv3 でレンダリングしてみたり,

https://github.com/mmp/pbrt-v3/blob/master/src/tools/cyhair2pbrt.cpp

cyhair_to_gltf https://github.com/syoyo/tinygltfloader/tree/master/examples/cyhair_to_gltf で OpenGL preview してみましょう!


Happy Hair/Fur rendering!

## TODO

* Modifier のつき方によっては期待される形状がエクスポートされないので原因を究明する.
* XGen のファイルフォーマットは公開されているっぽいので, XGen API を使わずに自作で XGen ファイルをパースできないか検討する.
* Photobooth hair 形式にも対応する.
* 優秀な Maya XGen 若人が, XGen C++ API を使いこなすことで, 人類史上最速で優秀な Maya XGen Spline 変換若人へと昇華するスキームを確立する旅に出たい.