OmniAICreator/Qiita-1.07M huggingface dataset:
[連載 GLSL 物語] チカラが欲しいか……（第四話）さらにその先へ

# さらにその先へ

ベクトルディスタンスフィールドにベクトルディスタンスフィールドを掛けてさらにベクトルディスタンスフィールドを掛けてみましょう

![vdfcircle.png](https://qiita-image-store.s3.amazonaws.com/0/135381/8f24e36a-30bd-b5ff-346c-2e7e4027e1eb.png)
https://goo.gl/ds5B55

```glsl
 precision mediump float;
 uniform vec2  m;       // mouse
 uniform float t;       // time
 uniform vec2  r;       // resolution
 uniform sampler2D smp; // prev scene
 
 #define PI 3.14159265359
 #define TWO_PI 6.28318530718

 #define N 60.
 #define N2 15.

 
 void main(void){
  vec2  p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y); // 正規化
  float r = floor(degrees(atan(p.y,p.x))/N)*N+N/2.;
  vec2  q = vec2(cos(radians(r)),sin(radians(r)))*.8-p;
  float r2 = floor(degrees(atan(q.y,q.x))/N2)*N2+N2/2.;
  vec2  s = vec2(cos(radians(r2)),sin(radians(r2)))*.2-q;

  float l=step(length(s),.02);
  gl_FragColor = vec4(vec3(l), 1.);
 }
```

単純に、ベクトルディスタンスフィールドをチェインするだけでいいですね。

これで、花火のように2段階で分裂するパーティクルのようなものも作ることができますね。

もちろん、さらに、無限にチェインすることができます。かつ、別に円のディスタンスフィールドでなくてもいいんですよ。分割数も、それぞれのチェイン毎に別々でも構わないです。

夢がひろがりませんか？

# ベクトルディスタンスフィールドの正体に迫る

ところで、このベクトルディスタンスフィールド(=ディスタンスフィールド)って何者なんでしょう。ディスタンスフィールドは、イラストレーターやSVGのベクターデータと同じで拡大縮小してもジャギが出ないデータです。しかし、イラストレーターやSVGのベクターデータと全く互換性がありません。ディスタンスフィールドをベクトルディスタンスフィールドに戻したとき、同じベクトルデータということで関係性はあるのでしょうか？

もし、このシェーダーの世界にベジエ曲線を持ってこれたら、どれだけ表現力が上がるのでしょうか。フォントも表示できるし、夢が広がりますね。

次回、このベクトルディスタンスフィールドを可視化して正体に迫ります。

[[連載 GLSL 物語] チカラが欲しいか……（最終話）ベクトルディスタンスフィールドの正体に迫る](https://qiita.com/7CIT/items/97ee21b7532aa056de2b)
UDデジタル教科書体を英語設定のPCにインストールする

この[ニュース](http://www.morisawa.co.jp/about/news/3681)をみて、やった～、これで教科書体フォントを使える、っと喜んでたんですが「Windows 10 Fall Creators Update」をインストールして、なおかつ「日本語 Language Pack」もインストールしたのにUDデジタル教科書体フォントが見当たりません。

調べた結果、以下の手順を必要とするということが分かりました。手順の通りにやったら無事にUDデジタル教科書体フォント（全部で6種類）がインストールされてWordなどでも選択できるようになりました。

ちなみに私のPCは英語設定です。アメリカなんで当然ながら。なので、スクショも英語設定のものです。

#ステップ１「Settings」メニューから「Manage Optional Features」を選ぶ

![2017-12-06 23_44_02-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/9f11615a-4bde-9b46-39f9-1760343c88f3.png)

#ステップ２ 「Add a feature」ボタンをクリック

![2017-12-07 00_17_04-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/f4043ebb-d82b-24b1-0229-0afe0b421037.png)

#ステップ３ 「Japanese Supplemental Fonts」を選ぶ
![2017-12-06 23_45_24-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/f4753cc0-af8e-3384-de86-8c2e83e3be7a.png)

UDデジタル教科書体フォントが確認できます。

![2017-12-06 23_45_53-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/c934940c-3c74-c2cb-a192-cedf3d205e6c.png)

#ステップ４ ダウンロードの完了を待ちます
![2017-12-06 23_46_32-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/40daf346-3b36-1458-21b9-656dedb39381.png)

#完了

![2017-12-07 00_21_31-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/c5363768-ebde-d2f9-cd20-f683e6c21c1b.png)

現在作成中の micro:bitを使った[コンピュータ・サイエンス講座の教材](https://makecode.microbit.org/courses/csintro/algorithms/unplugged?lang=ja)（ちなみに翻訳もやってます）

![2017-12-07 00_23_43-Zoomit Zoom Window.png](https://qiita-image-store.s3.amazonaws.com/0/103139/45803faf-9b07-8493-1b24-017e53fe1954.png)

読みやすいですね。小学生も読む教材は出来れば教科書体の方がいいかなと思います。
xgboost の中を覗いてみる

機械学習の代表の一つに`xgboost` がある。予測精度はいいが、何をやっているか理解しにくい。`xgboost` の `xgb.importance` を使うとどのフィーチャーが一番影響力があったか分かるが、特定の予測結果をこのブラックボックスがなぜそのような予測に至ったか把握しにくい。

## `{xgboostExplainer}` で予測結果を説明する
`{xgboostExplainer}` は xgboost の予測モデルを理解するのに役立つ。現在 Kaggle で行われているメルカリのデータを使って簡単にこのパッケージを試してみた。

```{r}
library(xgboost)
library(xgboostExplainer)
library(data.table)

set.seed(123)

rmseEval=function(yTrain,yPred) {
  mseEval=sum((yTrain - yPred)^2)/length(yTrain)
  return(sqrt(mseEval)) }

df.train <- fread("data/train.tsv", stringsAsFactors = F,  
                  colClasses = c(brand_name="character", category_name="factor",
                                item_condition_id="numeric", shipping="numeric"))
df.train <- df.train[,-c('train_id', 'name', 'item_description')]
df.train <- df.train[sample(.N)]
df.train$price =  with(df.train, ifelse(price > 0, log(price), price))
df.train[brand_name == "", brand_name:=-1]
df.train$brand_name <- as.factor(df.train$brand_name)

train <- df.train[1:1037774,]
test <- df.train[1037775:1482535,]

xgb.train.data <- xgb.DMatrix(data.matrix(train[,-"price"]), label=train$price,missing=NA)
xgb.test.data <- xgb.DMatrix(data.matrix(test[,-"price"]), label=test$price,missing=NA)

param <- list(boost='gbtree',objective='reg:linear',colsample_bytree=1,
             eta=0.12,max_depth=9,min_child_weight=1,alpha=0.3,
             lambda=0.4,gamma=0.2,subsample=0.8,seed=5,silent=TRUE)

xgb.model <- xgb.train(param =param,  data = xgb.train.data, nrounds=100, watchlist=list(train=xgb.train.data,
                                                                                       test=xgb.test.data))

xgb.preds.train = predict(xgb.model, xgb.DMatrix(data.matrix(train[,-"price"])))
xgb.preds.test = predict(xgb.model, xgb.DMatrix(data.matrix(test[,-"price"])))
```
結果は

```{r}
rmseEval(train[,price], xgb.preds.train)
rmseEval(test[,price], xgb.preds.test)
# [1] 0.5903865
# [1] 0.5951557
```

例えば以下のような場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138674/faeb35b9-c30b-77c5-0383-1da913b5dc43.png)

3.14という予測結果が出る。
これを `xgboostExplainer` で分析してみると:

```
explainer = buildExplainer(xgb.model,xgb.train.data, type="regression", n_first_tree = xgb.model$best_ntreelimit - 1)
pred.breakdown = explainPredictions(xgb.model, explainer, xgb.test.data)
showWaterfall(xgb.model, explainer, xgb.test.data, data.matrix(test[,-'price']) ,idx_to_get, type = "regression")
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138674/c6ea3f8e-27e0-1afa-a6dd-23fa65c81600.png)
この1件に関してどのフィーチャーがどの程度貢献したか分かる。

さらに全件に対して分析してみると面白い傾向が発見できたりもする。

例えば LuLaRoe というカジュアルな服とVictoria's secret というブランドの価格と服の状態の関係をみてみるため、全件に関して状態別に価格の影響度をグラフ化してみると:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138674/43f14eee-015e-98ea-a75a-0fe0afaeaed8.png)

ここで、赤は Victoria's secret、青は LuLaRoe を表している。そして横軸は状態(数字が大きいほど悪い状態)を表している。グラフから分かる通りVictoria's secret は5(最悪)になると途端に値段がすごく下がる。反対にLuLaRoe は状態が悪くても値段がそんなに下がらなかったりする。ということは LuLaRoe で状態が悪くても高く売れるかもしれない?!

`{xgboostExplainer}` を使うと`xgboost` を使ってデータからいろんな発見が得られたり、モデルを改善するためのヒントがみつかりそうな気がする。
macOS High Sierra (10.13.2)にアップデートしたらサーバにSSHできなくなった

## 概要
macOS High Sierra 10.13.2 にしたら、一部のサーバにSSHで入れなくなってしまった:astonished:

## 詳細
どうやら、 High Sierra 10.13.2 にしたら、OpenSSHが 7.6p1 になり、1024bitのRSA鍵が使えなくなったようです。
* [Cannot make it work with an ssh client from OpenSSH 7.6p1 #58](https://github.com/gliderlabs/ssh/issues/58)
* [OpenSSH 7.6 changelog](https://www.openssh.com/txt/release-7.6)
> * Refuse RSA keys <1024 bits in length and improve reporting for keys
>   that do not meet this requirement.

## 実際のターミナル
```sh:ターミナル
[hanamiche@MacBook]:~$ ssh account@server
Enter passphrase for key '/Users/hanamiche/.ssh/id_rsa':【パスフレーズを入れる】
Load key "/Users/hanamiche/.ssh/id_rsa": Invalid key length
account@server: Permission denied (publickey).
```

## 最後に
AWSやGCP用に新しく作った鍵は4096bitなので大丈夫でしたが、さすがに更新をサボりまくっていた10年以上前に作成した鍵はなどは更新作業しないといけないですね。
ついつい、面倒で鍵の更新などは怠り気味なので気をつけたいと思いました:frowning2:

## 後日談
[Termius](https://www.termius.com/) を使うと1024bitの鍵でも問題なく使えました。
仕事で使っている鍵が1024bitでも、「あと3ヶ月で転職するんだ」とか、「あと3ヶ月で全サーバ更新だ！」とかそう言う事であれば延命できそうです。
プチCapistrano的行為を行う


## 背景

複数のサーバにまたがってログを確認する、などということをするときに、いちいち

- ssh して
- cd して
- less して
- exit して

を繰り返すと非常にだるい

## 解決策

[capistrano/sshkit](https://github.com/capistrano/sshkit)を使うと、コマンドラインの操作を自動化出来ます。
公式サンプルも豊富です => [これ](https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md)

## サンプル

複数のインスタンスに入って、ホームディレクトリの中にあるファイルを覗いてみることにします。
以下のようになります。

また ruby の実行バイナリまでのパスを書くと、リモートにおいてある ruby のスクリプトも実行出来ます

```ruby:get_log_file.rb

require 'sshkit'
require 'sshkit/dsl'

hosts = ['192.168.10.4', '192.168.10.5', '192.168.10.6']

hosts.each do |host|
  remote = SSHKit::Host.new(host)
  remote.user = 'vagrant'
  remote.ssh_options = {
  	keys: ['/home/r-fujiwara/path/to/private/key'],
  	auth_methods: %w(publickey)
  }
  
  rb_path = '/usr/local/rbenv/shims/ruby'
  on remote do
    # なんかのログをのぞく
    execute :cat, '/home/remote_user/some.log'

    # Rubyを実行    
    execute :rb_path, '/home/remote_user/hoge.rb'
  end
end

```

## 応用

- thorを使って任意のシェルをコマンドラインから渡すことも出来ます。

```ruby:sshkit-implemantation.rb
#! /usr/bin/env ruby

require 'sshkit'
require 'sshkit/dsl'
require 'thor'

hosts = ['192.168.33.4', '192.168.33.5', '192.168.33.6']

def execute_host(command, args)
  hosts.each do |host|
    remote = SSHKit::Host.new(host)
    remote.user = 'vagrant'
    remote.ssh_options = {
      keys: ['/home/r-fujiwara/path/to/private/key'],
      auth_methods: %w(publickey)
    }
  
    on remote do      
      execute command.to_sym, args
    end
end

class CLI < Thor
  desc "exec", 'exec shell script'
  option :command, aliases: "c"
  option :args, aliases: "a"
  def exec
    execute_host(options[:command], options[:args])
  end
end

CLI.start(ARGV)
```

これを以下のように実行することでリモートのrubyのプロセスを確認することが出来ます。

```
$ ./sshkit-implemantation.rb exec -c 'ps' -a 'aux|grep ruby'
```
Project Euler Q41 【パンデジタル素数】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$n$桁パンデジタルであるとは, $1$から$n$までの数を各桁に$1$つずつ持つこととする.

\#下のリンク先にあるような数学的定義とは異なる

例えば$2143$は$4$桁[パンデジタル数](https://ja.wikipedia.org/wiki/%E3%83%91%E3%83%B3%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E6%95%B0)であり, かつ素数である. $n$桁（この問題の定義では9桁以下）パンデジタルな素数の中で最大の数を答えよ.

## 解答

$1+2+3+4+5+6+7+8+9=45=3*15$、
$1+2+3+4+5+6+7+8=36=3*12$、
$1+2+3+4+5+6+7=28$
以上より、求める値は$7$桁の数($7$桁のパンデジタル素数が存在しなければ別だが)。

```bash
seq 1234567 7654321 |
grep -v "[0|8|9]" |
factor |
awk 'NF==2{print $2}' |
awk '{s=1;for(i=1;i<=7;i++){s*=index($0,i)};print $0,s}' |
awk '$2!=0{print $1}' |
tail -1
7652413
```

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/041.html
vpc lambdaで外部通信する場合の注意点

# 問題
AWS lambdaをvpc内に設置して外部通信しようとしたらタイムアウトした

public subnet (Internet GW付き)

# 原因
https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#configuration-vpc-internet-access

vpc lambdaにはpublic ipが割り当てられない
（public subnetがauto-assignなpublic IPでも！）

えー。

AWS Lambda は、指定された VPC 情報を使用して、Lambda 関数から VPC リソースにアクセスするための ENI をセットアップします。各 ENI には、指定されたサブネットの IP アドレス範囲からプライベート IP アドレスが割り当てられますが、**パブリック IP アドレスは割り当てられません。**

# 対策

private subnetに設置し、nat-gw経由で出て行くようにする

```Lambda 関数でインターネットアクセスが必要な場合は、パブリックサブネットまたはインターネットに接続していないプライベートサブネットに添付しないでください。代わりに、NAT インスタンスまたは Amazon VPC NAT ゲートウェイを介して、インターネットにアクセスしているプライベートサブネットにのみ添付してください。```
jQuery をユーティリティとして見直してみる

## **jQueryさんは簡単に書ける事がメリット**

仮想DOMや規格標準化によってすっかり先を越されてしまったjQueryさんですが、

**「簡単に書ける(タイプ数的に)」**というメリットを生かして、**「既存サイトに対して何かするユーティリティとして再利用できるのでは」**と考えて作った**「jQuery Console」**の紹介です。

一昔前に流行った「JSが仕込まれたブックマークを呼び出す」手法でできており、IE9以降であれば、ブラウザ関係なく利用できるはずです。

- http://ltside.com/jqc/

今回は概念的な説明なので、利用方法等はページをご参照ください。

## **jQuery Console でスクレイピングしてみる**

例えば・・・定番の「Qiitaさんのトレンド」のスクレイピングをやってみましょう。

![jqc.png](https://qiita-image-store.s3.amazonaws.com/0/65983/1ad9b49c-c334-0b85-a23b-4fdea4596d15.png)

```js:jQuery(JavaScript)
$(".p-home_main a.tr-Item_title").tableout();
```

これで完成！簡単ですね。CSSセレクタを指定して、何をするかをつなげて書くのが基本です。
QiitaさんはjQueryを利用していないようですが、jQueryConsoleでは、非対応のサイトでもjQueryが使えます。

![jqc2.png](https://qiita-image-store.s3.amazonaws.com/0/65983/06bc511f-703c-d104-83c6-fbb5abd99590.png)

右端に隠れていますが、リンクも取得できています。
*※後で気が付いたのですが、tableout()はこれまた昔に作ったjquery拡張で「Handsontable」が利用されています。*

```js:jQuery(JavaScript)
$(".p-home_main a.tr-Item_title").map(function(i,e){return {
  link: e.href,
  count: $(e).parent().find(".tr-Item_likeCount").text(),
}}).tableout();
```

`$()`で取得したデータを`map()`で加工して`tableout()`しています。見たまんまですが、`map`に1行分の処理をコールバック関数として詰めています。
引数`e`がDOMなので、`e.href`の様に直接取得するもよし。jQueryお得意のエレメント移動を駆使して取得するのも便利でよろしいかと思います。
結果：
![jqc3.png](https://qiita-image-store.s3.amazonaws.com/0/65983/adcd6951-e5c3-0cbd-d854-47f2732c4067.png)

今回は例としてスクレイピングに絞ってみましたが、自動操作を行うスクリプトを簡単に書いたり、使い方は色々です。
https://qiita.com/tags/jqueryconsole
をご参照下さい。

## **おわりに**
jQuery Console製作当初はそうでもなかったのですが、「CSP(contents-security-policy)」対応で読み込みが制限されているサイトが多くなっています。そもそも外部スクリプト呼ぶなって話ですが・・今回はjQueryを見直してみるという話題までで閉めさせていただきます。

以上、ご清覧ありがとうございます。
概観からGoのWebFrameworkを選ぶ（2016/02）から1年半・・・

## 結論 is Revel
Go WebFrameworkでググると一番上に出ちゃいますね、結局続きかけてな記事でお恥ずかしい・・・
[概観からGoのWebFrameworkを選ぶ（2016/02）](https://qiita.com/jumbOrNot/items/45f86db15a5a6c8a0622)

この記事から2年弱。結局今どういう状況かと、どう変化したかを書きます。

## そもそも

小さなwebサービスの開発をGoで書きました。エンジニア3名くらい、週末や空いた時間を使って気軽にやっていました。みんなバックグラウンドが違うしハーフコミットだったので、好きに書いてました。

## 結論 is Revel is 特に問題ない

良かった点は
- RailsっぽいアーキテクチャとGoの厳しいルールが程よい
- サンプルがわかりやすい
- アップデートが頻繁

正直、そんなパフォーマンス要求されるサイトでもなかったので、ただ書きやすくて誰でもすぐコード書けそうな状況を作れれば良かったので、**WebFrameworkの前提知識がメンバー内でそれなりにあって余裕があるならフルスタックなフレームワークで良かった**と思います。

それでも紆余曲折はありました。

- gorm か gorp？
- structの使い方に悩む
- パッケージ管理でinstallでよくビルド失敗 gom -> glide -> dep
- go version管理でデプロイ失敗
- goの環境作るの面倒問題
- 
etc...etc...

見てわかると思うんですが、正直Goじゃなくてそれを取り巻く
開発環境・ツール・インフラに実はツラミがありました。

### 開発環境

**最初**
- goenv
- gom
- go ver1.5.3
- revel ver0.15.0

**今**
- vagrant
- gvm
- dep
- go ver1.7
- revel ver0.18.0

です。revelが先日の2017-10-30に最新版が出て、As of Revel 0.15.0, Go 1.6+ is required になり、revel自体をパッケージ管理してないと、 **go getするたびに最新版が入ってくる(tag/branch/commit指定とかできない)**ので、goのバージョンあげないといけないんですよね・・・
revelのパッケージ管理もdepが推奨されるようになっているので、こちらも対応が必要でした。

「Macですぐ環境つくれたほうがいいし、goenvでローカルを汚さないようにしとけばええやろ！」とか甘いこと考えてたんですが、[GO言語の1.6.3より前のバージョンを使っている人は MacOS Sierraにアップグレードしないほうがいい話](https://qiita.com/TO-ON_Kikaku/items/431ebdd8292cbfca999c)とかあってですね。**「そもそもMacでGo書くな」**という啓示がありまして、諦めてVagrantで環境を用意しました。
Ansibleで最初デプロイとかをしていたので、これを作ることは容易でした。

revelのバージョンが上がったり、goのバージョンが変わったりで結構面倒なので、その度に別のVMを立てて検証してました。

### デプロイ
[Revel Deployment](https://revel.github.io/manual/deployment.html)は

    - Build the app locally and copy it to the server.
    - On the server, pull the updated code, build it, and run it.
    - Use Heroku to manage deployment.

というのが書かれています。うちはさくらのVPSでサーバ管理しているので、特にいい手段もなく最初はAnsibleでデプロイしてました。
よくビルドで（特にgomで）コケていたので、面倒だったので、CircleCIに変更しました。
ただCircleCIでgoの環境作ってビルドすると結構重かったので、**ビルド用のサーバ用意してそこでビルド、生成されたバイナリを本番にscpする**というので解決してました。冗長だけどいいのです、1バイナリデプロイ（笑)です。

AWSだと[BOXFUSE](https://boxfuse.com/)というサービスが、唯一サポートしているようです。
日本じゃあまり聞かないサービスですね。

## それで今だとどうなのか？

**201602**

|Framework|Star   |リポジトリ見ての印象|
|:--------|:-------|:------|
|Revel| 6,337|サンプル・モージュール・クーロンもプロモページもあっていい感じ|
|beego| 6,234|Sinatraを参考にしているのでさくっとAPI作るのには良さそう、Auto API documentsが気になる|
|Gin| 5,425|すごく早いらしい、martiniの40倍早いらしい|
|martini| 8,178|一番人気、名前もいいね。唯一日本語ドキュメントがある|
|goji|2,947 |シンプル（小並感）|
|echo|2,976 |Ginよりさらに早い。まだ若い感じする|

**201712**

|Framework|Star   |リポジトリ見ての印象|
|:--------|:-------|:------|
|Revel| 9,137(+2,800)|あんま伸びてないけど、最近もアップデートしたしちゃんとGoの最新機能を使っている印象|
|beego| 13,198(+6,964)|説明ページも動画あったりリッチ、APIサーバを作るには良さげ|
|Gin| 13,361(+7,936)|一番伸びたな、やっぱ一番早いからかな。|
|martini| 9,795(+1,617)|あの頃の大人気martiniがあんま伸びてない、2014年から更新されてないしな・・・|
|goji|3,344(+397) |これも更新ない|
|echo|8,831(+5,855) |v3.2.5まで来ているw、issueとプルリクたくさん上がっている。レビューしきれてなさそう|
|[iris](https://github.com/kataras/iris)|8,361(new)|良さある、ベンチ早い|

ということで、そこまでRevel伸びてないし、star数と更新頻度で見ればRevel/beego/Ginのどれかな気がしますね。**webアプリケーション作るならRevel、APIサーバ作るならGin、はじめてGo触る人が多ければbeegoがいいかも。** 
いまだにWebでなんのフレームワーク使ってGoを触るかがもやもやしているので、この辺いい知見がある方がいればシェアいただければ幸いです。 :pray:
Capybaraを使ってtooltipの値を検証してみる


タイトルの通り、Capybaraを使ってtooltipの値を検証したい時に手間取ったのでメモする。

例としてツールチップにマウスオーバーした際に「すごーい！」と表示されるか検証する場合のテストを書いてみる。

``` ruby
context 'ツールチップにマウスオーバーした場合', js: true do
  before { find('.tooltip').hover }

  it 'tooltipの値が表示されてること' do
    expect(page).to have_content 'すごーい！'
  end
end
```

## 説明
* JavaScriptを使った検証のため、`js: true`を設定する
 * ついつい書き忘れるので注意！

* `find`メソッドを使ってcssセレクタで対象のタグを絞り込む
  * 例では`tooltip`というクラス名で探させているけど他にもIDやタグでも絞り込むことも出来る

| 指定対象|書き方|
| --- | --- |
| クラス|find('.hoge')|
| ID|find('#hoge')|
| タグ|find('h1')|

* `hover`メソッドを使ってマウスオーバーを表現する
iOS11でのUIBarButtonItemのサイズについて

## 問題
iOS11においてUIBarButtonItemのレイアウト設定がautolayoutに対応してしまい、指定したサイズで表示できない

## 解決方法
Setimageで画像をセットした後に要求バージョンの指定をし、 バージョンに見合った処理を書く

```swift

if #available(iOS 9.0, *) {
    leftbtn.widthAnchor.constraint(equalToConstant: 44).isActive = true
    leftbtn.heightAnchor.constraint(equalToConstant: 23).isActive = true
}
```

#### 要求バージョンについて
https://qiita.com/reima21/items/ef02b865496528f0dc6b
10分で出来るご飯マップ。

このエントリはNIJIBOX Advent Calendar 2017の9日目です。

みなさんこんにちは。
今回の記事は箸休めに簡単なマップを作るだけです。
過度な期待はしないでください。


# 作るもの
- 1. googlemymapでのご飯マップ(所要時間:10分)
- 1´.ご飯ガチャ(所要時間:30分)

## 1.ご飯マップでの材料
1.googlemap

### 作成手順(所要時間:10分)
1.googlemymap作成　
上部のピンを自社に置き、レイヤー右のメニューからデータビューで
**店名、系統、価格帯、おすすめメニュー欄**を追加。
あとはピンからお店を追加していく！
で、完成！！！
三ヶ月もするとこんな具合に
<img width="852" alt="スクリーンショット 0029-12-07 15.16.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/174240/05a70256-3695-caea-4f7e-ecc9808332a3.png">

これだけでも結構楽しいのですが、
開拓し終わってしまうと選ぶのも面倒になってきます。
なのでslackで**めしどこかたのむ**と呟くとbotが適当にお店を選んでくれるシステムを作ります。

## 1´.ご飯ガチャの材料
- 1.googleスプレッドシート
- 2.google apps script
- 3.slack & Outing Webhooks
 
### 作成手順(所要時間:30分)

#### ①.適当なスプレッドシートを作成します。
#### ②.googlemymapのデータビューからコピペで先ほどのシートに貼り付けます。こんな感じ
<img width="446" alt="スクリーンショット 0029-12-07 16.10.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/174240/9fcf2007-f925-4665-d967-6f228ebee686.png">

#### ③.google app script　作成します。
#### ④.slack連携用に下記ライブラリを追加します。
リソース>ライブラリ..>ライブラリを追加
**M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO**

#### ⑤下記のコードをコード.jsに上書きします。
e.parameter群はWebhook実行時にslackから送られてくる値になります。

```js:コード.js
function doPost(e) {
  var token = e.parameter.token;
  //webhook発で無ければ何もしない
  if (token != "WfkZfq5SS6nuFvw2OeoF1cTb") {//OutingWebhookのtoken
    return;
  }

  //②で作成したスプレッドシートからURLの/d/~/edit/までのID部分を貼り付け
  var spreadsheet = SpreadsheetApp.openById('1q6yvBrnDBYVN2pO_iXa0ozF70klytU3CReGWDmxNGcE');
  var sheet = spreadsheet.getSheets()[0];
  var data = sheet.getDataRange().getValues();
  
  var maxCount = data.length - 1;
  //店名カラム
  var col = 1;
  //ランダムな行数作成
  var row =  Math.floor(Math.random() * maxCount) + 2;
  
  var tenmei = sheet.getRange(row, col).getValues();
  
  //スラック発言(https://api.slack.com/custom-integrations/legacy-tokens にてlegacytoken生成)
  var slackApp = SlackApp.create("xoxp-xxxxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxxxxxxx"); 
  slackApp.chatPostMessage(e.parameter.channel_id,
  "今日のランチは" + tenmei + "がいいですよ", {
     username : "ご飯ガチャ",
     icon_emoji : ":thinking_face:"}
  );
}
```
#### ⑥slackからアクセス出来るようシステムを公開します。
- 公開>ウェブアプリケーションとして公開から
- **次のユーザーとしてアプリケーションを実行**:自分
- **アプリケーションにアクセスできるユーザー**:全員(匿名含む)
- **現在のウェブ アプリケーションの URL**　をコピーしておきます。

※ソース更新時にプロジェクトバージョンを挙げないと反映されません。

#### ⑦.Outgoing Webhooks を設定する。
- slackに行き、左上のメニュー>App 管理>上部の検索に 発信Webフック から導入
- チャンネル : 呟きに反応する部屋を決めます。
- 引き金となる言葉 : トリガーとなる言葉の設定です。(めしどこかたのむ)
- URL : 先程コピーした”現在のウェブ アプリケーションの URL”を貼り付けます。
- トークン : slackからの通信かを判断するためのものです。念の為、コード.jsに入れておいたほうが、良いですね。
- 以下は今回使わないので初期値のまま 設定を保存で作業終了です。

### 動作確認
さて、動くかつぶやいてみます。

<img width="761" alt="スクリーンショット 0029-12-07 16.12.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/174240/b39f0b42-7d8c-eee4-b025-a8b08cb94420.png">

うごいたあああああ
おわり。
GoでURLからファイルを取得してS3へ保存

一度ファイルを作成してから、S3へ配置します。
（ストリームのままS3へ保存する方法教えてください！）

```go
// download file
response, err := http.Get(url)
if err != nil {
  return fmt.Errorf("download error: %s - %s", url, err)
}
defer response.Body.Close()

// create file
output, err := os.Create(filename)
if err != nil {
  return fmt.Errorf("file create error: %s - %s", filename, err)
}
defer output.Close()

// copy
n, err := io.Copy(output, response.Body)
if err != nil {
  return fmt.Errorf("file copy error: %s - %s", filename, err)
}

cli := s3.New(session.New(), aws.NewConfig().WithRegion("ap-northeast-1"))

input := &s3.PutObjectInput{
  Body:   output,
  Bucket: aws.String("bucket-name"),
  Key:    aws.String("filename"),
}
if _, err := cli.PutObject(input); err != nil {
  return fmt.Errorf("put object error: %s", err)
}

// delete file
if err := os.Remove(filename); err != nil {
  return fmt.Errorf("file delete error: %s - %s", filename, err)
}

fmt.Printf("download from %s -> %s (%dbytes)\n", url, filename, n)
```
Microsoft Azure Backup の登録

Microsoft Azure Backupは、オンプレミスのデータをAzureへバックアップするツールである。
ここでは、サーバーの特定フォルダをバックアップする手順について記述する。




1. Azure Potal -[Recovery Services コンテナー]-[追加]-[＜対象となるコンテナ名＞]
2. [Recovery Services コンテナー]-[＜対象となるコンテナ名＞]-[概要]-[バックアップ]
    * ワークロードはどこで実行されていますか？:オンプレミス
    * 何をバックアップしますか？：ファイルトフォルダー
3. 先に、「資格情報コンテナー資格情報」のダウンロードが必要。［既に最新の Recovery Services エージェントを使用しています］にチェックし、[ダウンロード]でローカルフォルダに保存する。ファイル「xxxx.VaultCredentials」がダウンロードされる。
4. オンプレミス側でRecovery Services エージェントのインストールを行う。画面のURLをクリックして対象サーバー上で実行する。設定がうまくいくと、[続いて資格情報の登録]になるので、先ほどのファイル「xxxx.VaultCredentials」を選択する。[次へ]でパスフレーズの生成をクリックする。このパスフレーズの保存先を指定して保存しておく。
5. しばらくすると登録されるので、[Microsoft Azure Recovery Agentの起動]のチェックをし[閉じる]
6. すると、Microsoft Azure Backupが起動するので、[操作]-[バックアップのスケジュール]で各情報を設定する。

d:\BackupToAzure フォルダーを4週毎に保持し、4週間保存する場合

|項目|設定値|
|:--|:--|
|バックアップする項目の選択|d:\BackupToAzure|
|指定頻度|週|
|時刻を指定|2:00|
|間隔|4週ごと|
|曜日を指定|土曜日|
|保持ポリシー|週単位の保持ポリシー|
|間隔|2:00|
|期間|4週間|

7. 初回は、[今すぐバックアップ]を実行する。
8. Azure Potal-[Recovery Services コンテナー]-[＜対象となるコンテナ名＞]-[概要]-右側 バックアップ バックアップの利用状況で次のいずれかの値が設定されていればバックアップされている。
    * Cloud- LRS 0 B
    * Cloud -GRS 0 B
複数のCognosサーバを同一サーバにインストールする際のポイント

#概要
予算が限られている状況では、1つのサーバ内にBIツールを複数入れることがある場合があると思いますが、今回はCognosをバージョン違いで入れる際のポイントを記載します。

#環境
Cognos10とCognos11のインストール

#内容
共存させる際は以下の設定について変更が必要です。
・ポート
・ディレクトリ

###ポート
○デフォルトのアプリケーション・サーバーを使用している場合は、ポートの競合を回避するために9300以外のポート番号を使用する必要があります。
○ IBM Cognos Analytics はポート番号の範囲を予約するので、ポート番号のオフセットを少なくとも 100 にしてください。
また、開いているポートは以下のコマンドで確認ができます。
 netstat -oan

（変更の必要なポート）
　・ゲートウェイ用ディスパッチャー URI
　・外部ディスパッチャー URI
　・内部ディスパッチャー URI
　・外部アプリケーション用ディスパッチャー URI
　・Content Manager URI
　・ローカル・ログ・サーバーのポート番号

###ディレクトリ
それぞれのバージョンまたはインスタンスは、別々のディレクトリーにインストールする必要があります。
デフォルトは　C:\Program Files\ibm\cognos\analytics
【メモ】CANVASの領域をなんちゃってレスポン

仕様は
常にウインドウサイズ一杯まで広がる。
640px未満は通常の半分の高さになる。

```html:sample.html
<canvas id="mycanvas">
</canvas>
```

```javascript:sample.js
window.onload = function(){
  draw();
}
window.onresize = function(){
  draw();
}
function draw(){
  var canvas = document.getElementById('mycanvas');
  if (!canvas || !canvas.getContext) return false;
  canvas.width = document.documentElement.clientWidth;
  if(canvas.width > 640){
    canvas.height = 300;
  }else{
    canvas.height = 300 * 0.5;
  }
  var ctx = canvas.getContext('2d');
}
```

課題
onloadとonresizeで同じdraw()を実行させてるのが気持ち悪い。
同時に書けたりするのか調べる
JQuery的にこういうの
$(window).on('load resize', function(){
})
Ryzen Threadripper 16 コアで BitZeny(yescrypt) をマイニングする(2017/12/23 時点 14.7 khash/s)

<img width="945" alt="Screen Shot 2017-12-07 at 16.27.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/d145d411-206f-4b4a-5540-57cff923f07a.png">


漢なら 16 コア CPU でマイニングし, 冬の暖房がわりにしたいですね!

最近流行りの BitZeny のマイニングを Ryzen Threadripper 16 コア(1950X)でしてみましょう!

http://bitzeny.org/
http://bitzeny.cswiki.jp/

ぜにぃ姫の人気に嫉妬です!

## Wallet を用意する.

とりあえずは Web ウォレットを使いました.

https://bitzeny.jp

## miner をコンパイルする

Ubuntu 16.04.3 で cpuminer https://github.com/bitzeny/cpuminer をコンパイルしました.

autoconf, libcurl4-XXX-dev あたりを入れてから `autogen.sh` しないと, `./configure` で CURL が見つからないとかエラーが出ますのでご注意ください. 

ご参考

BitZenyのMinerをUbuntuでビルドして採掘する
https://qiita.com/s_ktmr/items/f46c0d814a340407cf06

Ubuntu 標準 gcc(gcc 5.4)では, Ryzen でも `-march=native` で問題なくコンパイルできました.
(古いコンパイラや Ryzen 未対応 clang だと Ryzen 向けにコンパイルできないときがあるのでご注意ください)

## マイニングプール

とりあえず手っ取り早く試したかったので, 登録がいらない lycheebit を使いました.

http://lycheebit.com/

BitZeny はマイナーが 10 クライアントしかないくて悲しい...
(2017/12/06 時点)

lycheebit で, 半日くらい回して 19.6 ZNY 入手できました(2017/12/06 時点でおよそ 500 円相当). ただ, このときはこれはたまたまうまく見つかっただけでした(lycheebit だと, 日によってはまったく獲得できないときもある).

最近はプールも増えてきたので, 登録制プールのほうが採掘しやすそうです.

## 性能

デフォルト設定で 32 threads, 10.7 khash/s でした.
16 threads で 11.0 khash/s あたりで, 19~24 threads で 13.5 ~ 14.0 khash/s でした. 物理コア数 x 1.2 ~ 1.5 くらいが最適のようです.


### AVX を切る

さらに, Ryzen threadripper の場合は, AVX を使わないほうが性能が出ました(14.7 ~ 15.0 khash/s).

AVX を無効にするには, `./configure` で `--disable-assembly` とします(`CFLAGS` 最適化オプションも `-O2` と普通の最適化レベルにしました)

システムトータル(電源ケーブルにワットチェッカーを差して計測. 1950X + DDR4-2666 64 GB mem + X399 マザー + 1070 Ti(画面表示用のみ. nvidia-smi で見ると 6W ほど消費) + SSD 1 枚)で 283 W でした. CryptoNight ではシステムトータル 180 W だったので 100 W ほど消費電力が高いですね. 

アイドル時は 70 W ほどでした.

### Powertune する

GPU でマイニングする場合, powertune 必須なので, CPU でも powertune し電力効率を上げてみたいと思います.

Linux で CPU の電力制御はいくつかやり方はあるようですが, 
今回は Ubuntu 16.04 で `cpufreq-info` と `cpufreq-set` を使って CPU 周波数を設定しました.

bash シェルスクリプトで以下のようにして各コアの CPU 周波数を設定します.

```bash
#!/bin/bash

for i in $(seq 0 31); do
   sudo cpufreq-set -u 2.8GHz -c $i
done
```

1950X では, 標準構成の BIOS 設定では 3.4GHz, 2.8GHz, 2.2GHz が選択できました(詳細は `cpufreq-info` 参照).

23 threads, no AVX の構成で以下となりました.

| CPU freq         |  khash/s |  watt   | khash/s per watt   |
|:-----------------|---------:|--------:|-------------------:|
| 3.4 GHz(default) |     14.7 |    283  |  0.0517            |
| 2.8 GHz          |    11.99 |    153  |  0.0783            |
| 2.2 GHz(lowest)  |     9.59 |    142  |  0.0675            |

2.8 GHz の時が一番電力効率がよいですね! 3.4 GHz 283 W と比べて 130 W 低いです. 130W の削減は, 30 円/khw として月 2808 円, 1日 93.6 円の節電となります!

## TODO

* コア(thread)の数や, スケジューリング(governor)を調整してみる.
* メモリ速度をチューニングしてみる
* 優秀な若人が, BitZeny マイニングを極めることで, Ryzen 用に yescrypt アルゴリズムの最適化がおこなわれるスキームを確立したい.
GitLabイシューを活用して社内業務を標準化する

## この記事は

この記事は[iRidge Advent Calendar 2017](https://qiita.com/advent-calendar/2017/iridge)の8日目の記事として書いています。

アイリッジの開発では、GitLabを利用しています。開発業務は当然ながらGitLab上でやりとりされるのですが、非開発業務でもGitLabを活用しています。今回はその様子を紹介します。

## GitLabとは
GitLabはもともと、GitHubのようなソースコード、イシューの管理ツールでした。ですが、近年はCI/CD、DevOpsといった機能を備え、開発の統合プラットフォーム化しています。日本語の情報も徐々に増えてきて、コミュニティも活性化しているという印象です。2016年からアドベントカレンダーも開催していますね。 :snowman:

- 公式 https://about.gitlab.com/ 
- コミュニティ https://gitlab-jp.connpass.com/
- 2017アドベントカレンダー https://qiita.com/advent-calendar/2017/gitlab


## イシューを活用した社内業務

ここから本題です。アイリッジのGitLabには `iridge/iridge` というプロジェクトがあります。このプロジェクトで全社に存在する課題を管理しています。このプロジェクトには全社員が参加しています。

- プロジェクトトップページ
![toppage.png](https://qiita-image-store.s3.amazonaws.com/0/49109/e420bf26-2c5e-9150-5750-54f429420de0.png)

GitLabやSlackなどのアカウント管理業務といった社内業務は、このプロジェクトのイシューとして依頼し、各担当者が実行するというフローができています。

- イシュー一覧
![issuelist.png](https://qiita-image-store.s3.amazonaws.com/0/49109/e1d6db4a-a8e6-e66b-9a57-f1ed949fbd0a.png)

### イシューテンプレートを使った標準化

依頼を標準化するために、GitLabの[イシューテンプレート機能](https://gitlab.com/help/user/project/description_templates.md)を利用しています。テンプレートを見ると依頼に必要な情報、依頼方法が書かれているので、依頼時の手戻りをなくすことができています。

- テンプレートを使って依頼する

<img width="892" alt="issuetmpl.png" src="https://qiita-image-store.s3.amazonaws.com/0/49109/b55b55f9-9405-441b-0cd1-29f863a18191.png">

テンプレートはこのプロジェクトのソースコード（Markdown形式）として管理しているので、依頼のフローが変わった場合は、テンプレートを更新するようにしています。また、作業者向けの作業手順書も、このプロジェクト内で管理する場合もあります。

## まとめ
開発ではない社内業務でGitLabというエンジニア向けのツールを使い、業務の標準化・生産性向上につなげている例を紹介しました。参考になれば幸いです。
VSCode の Vim プラグインにコントリビュートした！

> **この記事は、[VisualStudioCode AdventCalendar 2017](https://qiita.com/advent-calendar/2017/vscode) 8日目の記事です。**

## はじめに

2017 年は私にとって Vim を使い始めた年になりました。
しかし普段は IDE などにある Vim のプラグインを使っています。


**そして VSCode にも Vim のプラグインがあります！**


![Vim for Visual Studio Code](https://i.imgur.com/rBl0OKd.png)

[Vim for Visual Studio Code](https://github.com/VSCodeVim/Vim)


## 目からウロコ、Vim の EasyMotion プラグイン

Vim には沢山のプラグインがあり、その中に EasyMotion というカーソル移動を爆速で行えるプラグインがあります。イメージで言うと、**目線の先にカーソルを移動** することができるスグレモノです。

EasyMotion の機能についは、現在保守を行っている方のブログ記事に詳しく説明されています。

[Vimのカーソル移動はもっともっと爆速になる! Vim-EasyMotion v3.0 をリリースしました](http://haya14busa.com/vim-easymotion-ver-3-dot-0-overwin-motions/)

![Imgur](https://i.imgur.com/2k6vNC5.gif)

(たとえば "wo" から始まる箇所へ一瞬でジャンプすることが出来ます)


## 勢いでコントリビュート

人気プラグインのため VSCodeVim でも EasyMotion がサポートされていたのですが、やや機能が足りていなかったので思い切って機能追加をしてコントリビュートすることにしました。


## VSCode の拡張機能は TS もしくは JS で簡単開発

VSCodeVim は TypeScript で作られていたので、TypeScript (もしくは JavaScript) が分かる人なら機能追加もそう難しくありません。

EasyMotion ではカーソル移動先を強調表示するという挙動がありますが、VSCodeの拡張機能用 API に **Decoration API** というものがあるので再現可能です。

VSCode の登場時は拡張機能がそもそもサポートされていませんでしたが、現在はかなり細かい所にも手が届きます。**拡張機能の作りやすさ、自由度の高さ** は VSCode の非常に良いところだと思います。


[VSCode の拡張機能用 API 一覧 (英語)](https://code.visualstudio.com/docs/extensionAPI/vscode-api)


## さいごに

VSCode の話なんだか Vim の話なんだかよく分からなくなってしまいました...。

VSCodeを含め、たいていのプラグインは GitHub でホストされている OSS なので、お気に入りのプラグインがあったら思い切ってコントリビュートすると良いと思います。

***VSCode と VSCode のプラグインを盛り上げていきましょう！***
TouchDesignerで動的に四角形を増やして飛ばす 

#はじめに
登録時にTouch Designerって書いててすいませんでした！！！！
お触り警察の人ごめんなさい！！！！

#TDはリアルタイムな増減が苦手

単純な図形を楽器のアタックに合わせて散らかすことは良くあることだ。

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

oFならまあ一瞬ですが、
TDだと辛い。

TDは個数が決まってるものを、
大量にざっくり似たような動きでコピーするのは得意ですが、

- 動的に数が変わる
- 決まった点Aから点Bに移動する

的な地味な絵作りは結構難しい。

もちろんReplicatorやCopy Sop使っても可能ですが、
めちゃ重い。

頓知を効かせてChopだけで何とかして、
インスタンシングで描画する必要があります。

##Event Chopを使う

というわけでEvent Chopを使います。

こいつはPulseを突っ込んであげたり、
createEventなどの関数を呼んであげると、
ADSRベースのチャンネルデータを作ってくれます。

##ADSR

ADSRとはAttack, Decay, Sustain, Releaseの略で、
DTMやってる人にはお馴染みだと思います。
[ADSRの解説](https://ja.wikipedia.org/wiki/ADSR)

ざっくりいうと、１から０まで時間をかけて減衰する値を作ります。

Trigger Chopでも同じようなことは出来るんですが、
Event Chopの良いところは、叩けば叩くだけチャンネルのサンプル数が増えていくところです。
そして決めた時間が経ったらサンプルはちゃんと死んでくれる。

サンプル数が増減するので、こいつをインスタンシングに使うと良さそうです。

##固定の値も持てるよ

Event ChopはADSRに影響されない、
つまり時間で変化しない固定の値を持つこともできます。
これで四角形の発生元と向かい先を作れば良いですね。

##流れ


1. Event Chopに任意のチャンネルを作る(四角形の初期値と向かい先)
2. 使い回すADSRの値を設定
3. createEvent関数でEventを発生させる
4. ADSRを使ってBlend Chopで２つの値を補間
5. インスタンシングする


##チャンネルの準備するよ

３番目のインレットにconstantsなどでチャンネルの名前を教えてあげます。

<img width="635" alt="スクリーンショット 2017-12-07 15.40.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/100022/cb35d7d5-08e3-073c-8fd6-4ff0de76567c.png">

##ADSRの値を設定

後述のcreateEvent関数で設定しなかった値は、
UI上で設定した値が入ります。
なので、共通の値は設定しときましょう。
今回は1から0までシンプルに落ちて欲しいのでこんな感じ。

ただ、これだと何も動かないのでDecay Timeのみスクリプトから設定します。

![スクリーンショット 2017-12-07 16.41.27.png](https://qiita-image-store.s3.amazonaws.com/0/100022/f65f811e-a23a-b0e1-bee8-83d23d67e4c1.png)



##createEvent関数呼ぶよ

次にcreateEvent関数を呼びます。
ポイントはsamples引数です。

ここにリストを突っ込んでやると
１で作った名前の順番でチャンネルが作られます。

また、decayTimeなど、ADSRの値をチャンネル毎にランダマイズしたりもできます。
要は四角形が飛んでく速さをランダマイズ出来るってことです。

```
start = 0
goal = random.random() * 2.0 - 1.0
decay = random.random()
e = op('event1')
e.createEvent(decayTime = decay, samples=[start,goal])
```
[Event Chopのリファレンス](https://www.derivative.ca/wiki099/index.php?title=EventCHOP_Class)

##ADSRで補間するよ

Select ChopでADSR、初期値、向かい先、とそれぞれのチャンネルを取り出して、
Blend ChopでADSRの値を利用して補間します。

ついでにADSRの値もrenameしてscaleなどに使います。
これで移動しながら徐々に消えていく四角形が出来ます。

<img width="489" alt="スクリーンショット 2017-12-07 16.05.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/100022/4c050a6e-c8f5-c1f8-8dd5-d6d7bbe9d9de.png">


この時にBlend Chopの入力順に注意しましょう。

<img width="427" alt="スクリーンショット 2017-12-07 16.04.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/100022/60bdccfc-2344-1c80-97a6-f50bc8328cfa.png">


##インスタンシング
<img width="928" alt="スクリーンショット 2017-12-07 16.01.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/100022/441fad34-2b88-549f-6614-d1b0cc4da204.png">

特にいうことなし

[toe置いときます](https://github.com/kezzardrix/MoveRect)

##補足

###S Curve Chopとの相性が最高

エクスペリメンタルビルドだけにしか入ってないですが、
ADSRの値をLookUpとSCurveでぐんにゃりさせると使い勝手良いです。

[S Curve Chop](https://www.derivative.ca/wiki099/index.php?title=S_Curve_CHOP)

###孔明の罠

世間のチュートリアルの中には、
Event Chopを使わずにTableに必要な値を格納して、
Execute Datで毎フレーム更新して死活管理する、みたいなのもあります。

が、これ落とし穴があって、TableはStringなので、
値の読み書き時に文字列の変換が走るんですね。

なのであんまり数増やせずにすぐに重たくなります。
非推奨。
addGlobalScopeを使って分かりやすいソースコードを書きましょう

```sql:Members
 | ID | name  | role   | email 
 |-------------------------
 | 1  | 一郎  | admin  | itiro@test.com
 | 2  | 次郎  | guest  | jirou@test.com
 | 3  | 三郎  | admin  | saburou@test.com
```

以前の書き方：

```php:old_version.php
$admin = Memeber::where('role', 'admin')->get();
$guest = Memeber::where('role', 'guest')->get();
```

現在の書き方：

```php:new_version.php
$admin = Admin::all();
$guest = Guest::all();
```
```php:App\Member.php
class Member extends Model
{
    protected $table = 'members';
}
```
```php:App\Admin.php

use App\Member;
use Illuminate\Database\Eloquent\Builder;

class Admin extends Member
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('role_admin', function(Builder $builder) {
            $builder->where('role', 'admin');
        });
    }
}
```
```php:App\Guest.php

use App\Member;
use Illuminate\Database\Eloquent\Builder;

class Guest extends Member
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('role_guest', function(Builder $builder) {
            $builder->where('role', 'guest');
        });
    }
}
```
以上です。

感想
---
グローバルスコープを利用して、明示的なモデル名を使えば、ソースコードがもっと分かりやすくなります。
sync.WaitGroupで非同期処理

複数のgoroutineで並列処理するならWaitGroupが便利だって聞いた:blush:

```go:waitgroup.go
package main

import (
	"fmt"
  "sync"
)

func main() {
  wait := &sync.WaitGroup{} // WaitGroup作成
  for i := 0; i < 10; i++ {
    index := i
    wait.Add(1) // waitインクリメント
      go func() {
          defer wait.Done() // goroutineが終わったらデクリメント

          if err := DoSomething(); err != nil {
            fmt.Println("error!", index)
            return // deferでwait.Done()することで、return処理が書きやすい
          }

          fmt.Println("success!", index)
      }()
  }
  wait.Wait() // 全てのwaitの終了を待つ
}

func DoSomething() error {
  // do something
  return nil
}
```

```shell-session
$ go run waitgroup.go
success! 9
success! 2
success! 3
success! 1
success! 6
success! 5
success! 7
success! 8
success! 0
success! 4
```
超離散化について

超離散化について紹介します。

# 事前知識
- 微分方程式
- 離散化

# 超離散化とは
ざっくり言えば、すごい離散化ですw
丁寧に言えば、従属変数の離散化です。
![box-ball2_3.024.jpeg](https://qiita-image-store.s3.amazonaws.com/0/137522/cebcb2fa-6217-3a8c-841a-efd6ce58ae49.jpeg)

離散化(差分化)は、独立変数の離散化でしたが、超離散化ではさらに従属変数をも離散化してしまいます。つまり、**全ての変数を離散化**してしまうわけです。
表にしてみるとこうなります。

 | 連続系 | 離散系 | 超離散系
 --- | --- | --- | ---
独立変数 | 連続 | 離散(一部連続) | 離散
従属変数 | 連続 | 連続 | 離散


# 超離散化で用いる公式
超離散極限ってやつです。
>$\displaystyle\lim_{\varepsilon\to+0}\log(e^{A/\varepsilon}+e^{B/\varepsilon}) = \max(A, B)$

こんな式が成り立ちます。証明はしないですが、実際に見てみましょう。
$A = x, B = 0$として、$\varepsilon$を0に近づけてみます。

![ultraDiscrete.gif](https://qiita-image-store.s3.amazonaws.com/0/137522/a2aba857-2d1d-eda0-fab5-598e5b6faff9.gif)
赤い線が $f(x) = \varepsilon\log(e^{x/\varepsilon}+1)$
黒い線が $g(x) = max(x, 0)$ を表しています。
赤い線が黒い線に近づいていくのが見て取れます。

# 超離散化
![box-ball2_3.027.jpeg](https://qiita-image-store.s3.amazonaws.com/0/137522/00b780d4-7584-9b58-f8b2-561012b8946e.jpeg)

これで超離散化ができました。

# 何が嬉しいのか
全ての変数を離散化することにどのような利点があるのでしょうか。

まず、超離散化がどのような微分方程式に適用可能かに目を向ける必要があります。ここでは、一般的に差分化の方法が知られている、可積分系(つまり解を求められる微分方程式)を対象としています。

例えば、コンピュータでシミュレーションを行うことを考えます。可積分系を数値的にシミュレーションすると、その可積分性を表す性質はほとんど保たれていません。それらを超離散化することによって、ある程度忠実に(性質を残したまま)離散化することができるのです。また、離散化されているので、コンピュータで簡単にシミュレーションすることができるという利点もあります。
Googleタグマネージャで外部リンクのクリック数を計測する

##外部ページへ飛んだユーザーアクセス数の計測方法

1.GAのセグメントを開く
2.イベントアクション(gtm.linkClick)を指定
3.イベントラベル(ex. ○○○.×××.jp/)URLを指定
csv to html.table using jinja2 memo

# メモ

- DB -> pandas ---export---> csv ---import---> df ---> list() -> jinja2

- hoge.csv

```py3
import pandas as pd
df = pd.DataFrame({'name': ['apple', 'orange'], 'price': ['$1', '$2']})
df.to_csv('hoge.csv', index=None)
```

- app.py

```py3
# -*- coding: utf-8 -*-

import pandas as pd
from flask import Flask, render_template

# make instance
app = Flask(__name__)

# show csv data as table format
@app.route("/csvtbl")
def csvtbl():
	# import csv as pandas.Dataframe
	df = pd.read_csv('hoge.csv')
	return render_template('csvtbl.html',
	                       title='CSV to table',
	                       # df to list format
	                       data = list(df.values.flatten()))

if __name__ == "__main__":
    app.run(debug=True)
```

- csvtbl.html

```html
<table>
	<thead>
		<tr>
		{# get column name #}
		{% for key, item in data.items() %}
			<th>{{key}}</th>
		{% endfor %}
		</tr>
	</thead>
	<tbody>
	<tr>
		{# set value#}
		{% for row in data2 %}
			<td>{{row}}</td>
		{# if show 3 columns, show next row #}
		{% if loop.index0 % 2 == 1 %}
	</tr>
	<tr>
		{% endif %}
		{% endfor %}
	</tr>
	</tbody>
</table>
```
- localhost:5000/csvtbl.html

![tbl.png](https://qiita-image-store.s3.amazonaws.com/0/78079/08d51bf4-a7ae-d565-43a3-be464b920b46.png)
Windows7環境でrspec:installする際のInvalid argument @ dir_s_mkdirの応急処置

Ruby(Rails)を始めたばかりで手探りの状態で、ネットなどを見ながら勉強をしています。
その途中でテストフレームワークRSpecを使い方法を試している際にエラーが発生してしまいました。

## Windows環境でrspec:installを実行

環境の準備などは終わっている状態で、**rspec-rails**をインストールした後に以下のコマンドを実行する際に、エラーが発生しました。

```
$ rails g rspec:install
identical  .rspec
       exist  spec
      create  spec/C:/Users/oooo/AppData/Local/Temp/～/spec/spec_helper.rb
C:/Ruby24/lib/ruby/2.4.0/fileutils.rb:252:in `mkdir': Invalid argument @ dir_s_mkdir - C:.... (Errno::EINVAL)
...
```

とりあえず、エラーメッセージで検索をしてみたところ、[rspec-railsのissue#1555](https://github.com/rspec/rspec-rails/issues/1555)が見つかりました。そこを眺めてみると、テンポラリーディレクトリの確認等が行われていたので、自分の環境を確認してみる事にしました。

## テンポラリーの場所を確認と変更

とりあえずRuby上で環境変数とテンポラリーディレクトリがどうなっているのか確認してみました。

```rb
irb(main):001:0> require 'tempfile'
=> true
irb(main):002:0> Dir.tmpdir
=> "C:/Users/oooo/AppData/Local/Temp"
irb(main):003:0> p ENV['TMPDIR']
nil
=> nil
```

C:/Users/oooo/AppData/Local/Temp がテンポラリのディレクトリとなっているようであり、原因まではわかりませんがここだと問題があるようです。

そこでShellに

```
export TMPDIR=c:/tmp
```

を定義して先程のコマンドを実行してみました。

```rb
irb(main):001:0> require 'tempfile'
=> true
irb(main):002:0> Dir.tmpdir
=> "C:/tmp"
irb(main):003:0> p ENV['TMPDIR']
"C:\\tmp"
=> "C:\\tmp"
```

テンポラリーディレクトリと環境変数が設定した値になっている事は確認できました。

## rspec:installに再挑戦

テンポラリーディレクトリが切り替わったので、rspec:installをもう一度試してみる事にしました。

```
$ rails g rspec:install
create .rspec
create spec
create spec/spec_helper.rb
create spec/rails_helper.rb
```

とりあえず、エラーが発生せずに処理が終わったことが確認できました。

まだRuby自体も始めたばかりなので、もっといい方法があるのかもしれませんが、今の段階ではこれで解決としました。
AWS EC2上のUbuntu16.04にデスクトップ環境を構築してMacからつなぐ


# はじめに
## やりたいこと
AWS EC2上にUbuntu16.04のインスタンスをたてて、そのインスタンスにMacからリモートデスクトップが接続する

## なんでこの記事を書いたか
ぐぐってみると、日本語、英語で色々なドキュメントが出てきた。それらを参考に色々試したがサクッとはいかなかった。「どれを参考にすればいいねん！」って人向けに「これを実行すればサクッと構築できるよ」という情報を提供したかったから書いた。
ちなみに、X Window System、ubuntu-desktop、xrdp、Xfce4、GNOME、KDE、Unity、vncなどなど、
用語がわからなすぎたのでハードルが高く感じた。


## いまはただのメモ
とりあえずメモ代わりに投稿するかってくらいのモチベーションで投稿してます。
もしここの記述がようわからんとかあれば、コメントいただければ少しずつ細かく書いていきます。

## 想定している読者レベル
- EC2インスタンスをたてたことがある
- なんとなくlinuxコマンドがつかえる

# 用語
## X Window System
ディスプレイにウィンドウを表示したり、マウスやキーボードを使ってやりとりするためのシステム。WindowsやMacではOSとこのソフトウェアが一体化しているが、Linuxでは一体化してないのでもし先述のことを行いたい(=GUI)場合はインストールする必要がある。MacのOS Xの「X」とWindowsの「Window」がまざった「X Window System」という名称で紛らわしい。単に「X」と呼ばれることもある。

## Xfce, GNOME, KDE, Unity, 
デスクトップ環境を実現するためのシステム。色々あってややこしいが、デスクトップ上のデザインや機能が微妙に違うだけ。今回はXfceを使った。

## vnc
ネットワーク越しに、別のコンピューターのデスクトップ画面を表示してGUI操作することができるシステム。今回Ubuntuで環境を構築するにあたって参照した記事ではvnc4serverかTightVNCのどちらかを使っていることが多かった。



# 手順

###  EC2インスタンス作成
下記参照にEC2インスタンスを作成
- AMIはクイックスタートにあるUbuntu 16.04
- セキュリティグループのインバウンドにポート5901を追加
- とりあえずt2.microでいい


### デスクトップ環境構築
この[記事](https://aws.amazon.com/jp/premiumsupport/knowledge-center/connect-to-ubuntu-1604-windows/)のとおりでOK


```
sudo apt update && sudo apt upgrade

sudo sed -i 's/^PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
sudo /etc/init.d/ssh restart

sudo passwd ubuntu

sudo apt install xrdp xfce4 xfce4-goodies tightvncserver

echo xfce4-session> /home/ubuntu/.xsession

sudo cp /home/ubuntu/.xsession /etc/skel

sudo sed -i '0,/-1/s//ask-1/' /etc/xrdp/xrdp.ini

sudo service xrdp restart

tightvncserver
```

### つなぐ
Finder起動->移動->サーバへ接続で、vnc://XX.XX.XX.XX:5901に接続。
XX.XX.XX.XXは作成したEC2インスタンスのIPかパブリックDNSを指定。
ただしvncはそのままでは暗号化されてないので、セキュアなことをやりたい場合はご自身で対応をお願いします。

### ついでに日本語化
chromeをインストールしたら、日本語が文字化けしてたので日本語化してみた。
- [“Language support” icon missing in System Settings](https://askubuntu.com/questions/331515/language-support-icon-missing-in-system-settings/331872#331872)
- [英語環境でセットアップしてしまったUbuntuで日本語を使えるようにする](https://qiita.com/hachisukansw/items/154b5349f99a7152fd46)

### 補足
- tightvncserverでなくてvnc4serverでもOKだと思います(試してない)
- xrdpはaptからのインストールでOK
VisualStudio2017 で MicrosoftReport を使う


##機能拡張の設定
- VisualStudio2017で[ツール]→[拡張機能と更新]
- オンラインで検索「Microsoft Report」を検索
- 「Microsoft Rdlc Report Designer for Visual Studio」の「ダウンロード」ボタンをクリック
- VisualStudio2017を閉じる
- インストールが開始される
- 完了したらVisualStudio2017を起動

##レポートビューアー設定(WindowsFormの例)
- WindowsFormプロジェクトを作成
- nuget で「Microsoft.ReportingServices.ReportViewerControl.Winforms」を登録
	Install-Package Microsoft.ReportingServices.ReportViewerControl.Winforms -Version 140.1000.523
- ツールボックスの上のほうを右クリックして「アイテムを選択」をクリック
- .Net Framework タブの参照ボタンをクリックする
- ソリューションを保存してるフォルダの、packages\lib\net40 フォルダを開く
(例：C:\Projects\ReportViewerTest\WindowsFormsApp1\packages\lib\net40)
- Microsoft.ReportViewer.WinForms.dll のファイルをダブルクリックする
- ツールボックスにReportViewerが表示される

## レポート作成
- VisualStudio2017で[プロジェクト]→[新しい項目の追加]
- 「レポート」または「レポート ウィザード」を選択
- rdlcファイルが作成される

###参考リンク
https://marketplace.visualstudio.com/items?itemName=ProBITools.MicrosoftReportProjectsforVisualStudio

https://marketplace.visualstudio.com/items?itemName=SqlReportingServices.MicrosoftRdlcReportDesignerforVisualStudio-18001

https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.Webforms/140.340.80

https://www.nuget.org/packages/Microsoft.ReportingServices.ReportViewerControl.Winforms/
数多あるWebサービスをつなげて遊ぼう 



## はじめに
こんにちは。[CYBIRDエンジニア Advent Calendar](http://qiita.com/advent-calendar/2017/cybird) 9日目の@crystal_geyserです。
8日目は@tossyzさんの[失敗…](https://qiita.com/tossyz/items/c031af83bb90ec974077)でした。

今回、初めて参加してみたものの公に出せるほどの技術話もあまりなかったので箸休め的な内容を書きました。技術的なお話は他の方にお任せということで....
なので、エンジニアだけでなく非エンジニアの方たちにも活用できるそんなお話を書きたいなーと思ってます。
読みづらいところもあるかもしれませんが読んでいただければと思います。

## 今日書くこと
さて、これ読んでくださっている皆さん、年末も押し迫る中いかがお過ごしでしょうか？僕はここ最近は「Web連携サービス」なるもので遊んでいます。

そもそも、これを知ったきっかけは月初めに発生する大量の催促メール送信作業です。定型文を作ったところで対して楽にはならない....かといってほっといても欲しいものは手に入らない。けど、プログラムでどうにかするほどのモチベーションは上がらない。そんなわがままな気持ちで出会いました。

今回は僕が実際に使ってみた3つのサービスについてとその感想について書きました。もちろん個人的な感想なのでその辺はご理解をください。

## そもそもWeb連携サービスとは？？
現在、次から次へと新しいWebサービスが毎日誕生しています。
皆さんもなくてはならないサービスがあるのではないのでしょうか？
このような数多あるWebサービスを、きれいに連結させて相互に情報のやり取りを可能にしたのが「Web連携サービス」です！

今回、紹介するのは「[IFTTT](https://ifttt.com/)」「[Zapier](https://zapier.com/)」「[Integromat](https://www.integromat.com/en/)」です。

これらサービスを使えばwebサービス同士を組み合わせ、自分のオリジナルのアプリを作成できます。

**「AAをしたらBBをする。」**

このように特定のトリガー(AA)に応じて発生するアクション(BB)を登録することで作業の効率化ができるかもしれません。
例えば「特定のメールがGmailに届いたら」(トリガー)「ChatWorkで投稿する」(アクション)などです。

では、各サービスの特徴や使ってみての感想などを書いていきたいと思います。

## IFTTT
IFTTT(イフト)は「if this then that」というシンプルなコンセプトにしています。そして、各webサービスを連携し「レシピ」と呼ばれるアプリを作成しすることができます。
連携できるサービスは[こちら](https://ifttt.com/search/services)です。

### メリット
- IFTTTはPC版だけでなくスマートフォンのアプリもある
- GPSやお天気サービスと連携できる。
 - 天気が雨ならSMSに通知するなどもできます。

スマートフォン特有のアプリなんかが連携できるのは遊びごごろをくすぐりますね。

### デメリット
- ChatWorkと連携ができない
 - CYBIRDではちょっと困りますね。

## Zapier
Zapier(ザピア)はIFTTTの連携サービスが増えたサービスです。
連携できるサービスは[こちら](https://ifttt.com/search/services)です。

### メリット
- ZapierはChatWorkと連携できる

- プログラムとも連携できる。
 - アクションにプログラムを設定することで応用の幅が広がります。


### デメリット
- スマートフォンアプリがない
 - 公式はリリースしたいと言っているがいつになるのやら...

## Integromat
先ほど紹介したIFTTTとZapierにはそれぞれいいところも悪いところもあります。
IntegromatはIFTTTとZapierのいいところ合わせたサービスになります。

IFTTTとZapierは
**「AAをしたらBBをする。」**
でした。

けれども、integromatは
**「AAをしたらBBをしてCCもしてDDもする。DDしたらEEもする。」**
です。

はい！最強ですね！

### メリット
上記でも述べたようにIFTTTとZapierが合わさったことです！

なので、

- スマートフォンアプリ有り
- GPSと連携可能
- プログラムと連携可能
- mysqlとの連携可能....etc

### デメリット
- マニュアルが無い
 - 初見でやろうとするとかなり疲れます。

できることが多すぎて正直難しいです。

## まとめ
ざっくりと説明しましたがここでは語りきれないほどやれることはたくさんあります。
少しでも興味があったら実際に使ってみてください。

最初は他の人が作ったレシピが共有されているので参考にしてみてください。
基本的にやりたいことは大抵は共有されています。

しかし、残念なことに無料版では制限がかかってしまいます。
それでも、問題なく使用することができます。

発想一つで無限の可能性です。是非、皆さんも利用してみてください。


## 最後に

[CYBIRD エンジニア Advent Calendar](http://qiita.com/advent-calendar/2017/cybird) 明日は、@garyumaruさんの[社内ゲームジャム（12/8-12/9）の振り返りです！](https://qiita.com/garyumaru/items/f5fc8893044bc32be9e9)楽しみですね！
BeanstalkでRailsのDelayedJobでメール送信がエラー

# エラー

ActionMailerを使ってメール送信を作っていて、とりあえずお手軽にDelayedJobを使ってバックグラウンド送信しようとしていた時に出たエラーです。
内容は `delayed_jobs` テーブルの `last_error`というカラムに保存されていました。

```
can not load translations from 
/var/app/ondeck/vendor/bundle/ruby/2.4.0/gems/activesupport-5.1.4/lib/active_support/locale/en.yml: 
#<Errno::ENOENT: No such file or directory @ rb_sysopen - 
/var/app/ondeck/vendor/bundle/ruby/2.4.0/gems/activesupport-5.1.4/lib/active_support/locale/en.yml> 
.......
```

# 原因

エラーをそのまま見ると、該当のファイルがない的なことなんですが、
そもそも `/var/app/ondeck` というのがミソでした。

## Beanstalkの仕組み

BeanstalkでBrue-greenデプロイを実現するために、アプリのデプロイは二つのディレクトリを使って行われています。

`/var/app/ondeck`　→アプリがデプロイされるディレクトリ
`/var/app/current`　→実際にアプリが動くディレクトリ

`ondeck` にデプロイされたアプリが `current` にコピーされるという流れみたいです。

Beanstalkでアプリをデプロイした時に、delayed_jobの起動をやっていたのですが、
その段階ではondeckにビルドされていて、メール送信時にondeckのディレクトリを探しに行ってたのが直接の原因みたいでした。

# 対策

デプロイ時のdelayed_jobの起動を下記のようなコマンドで実行してあげることで正常にメール送信できるようになりました。

``` 03_container_command.config
06-delayed_job:
    command: RAILS_ENV=production ./bin/delayed_job --pid-dir=/var/app/support/pids restart
    cwd: /var/app/current
```

# 参考

http://junkheap.net/blog/2013/05/20/elastic-beanstalk-post-deployment-scripts/
https://www.codesd.com/item/how-to-restart-delayed-job-automatically-when-deploying-a-track-project-on-amazon-elastic-beanstalk.html
Microsoft Azure Backup の削除

Microsoft Azure Backupは、オンプレミスのデータをAzureへバックアップするツールである。
バックアップ手順は、比較的簡単だが、削除手順が少々手間なのでその手順を記述する。

## オンプレミスサーバー側での手順

1. ディスクップにあるMicrosoft Azure Backup を起動する
2. [操作]-[バックアップのスケジュール]で[バックアップスケジュール ウィザード]が起動する。ポリシー項目の選択で、「すべてのバックアップスケジュールの使用を停止して、保存されているバックアップをすべて削除する」をクリックし、[次へ]
3. [完了]で、設定されていたバックアップスケジュールが削除される。このときセキュリティPINが必要。Azure Potal[設定]-[プロパティ]-[セキュリティPIN]-[生成]で取得した値を入力する
4. これでバックアップスケジュールは削除されたが、バックアップデータは、削除されたバックアップ データは、14 日間保持される。その後にバックアップが削除される。


## すぐにRecovery Services コンテナーを削除したい場合

バックアップを直ちに削除したい場合は次の手順で削除する

1. Azure Potal -[Recovery Services コンテナー]-[＜対象となるコンテナ名＞]-[概要]
2. ポリシー-[バックアップポリシー]-[Default Policy]-[削除]
3. 管理-[バックアップインフラストラクチャ]-管理サーバー[保護されたサーバー]-[Azure
 Backup Agent]-[＜保護されているサーバー名＞]クリック-[削除]-[サーバー名の入力]-[削除]
4. [Recovery Services コンテナー]-[＜対象となるコンテナ名＞]-[概要]-[削除]-[はい]で即時にバックアップが削除される。
[VirtualBox] Ubuntu 17.10(artful)に最新版VirtualBox 5.2をインストールする

標準レポジトリには5.1.30が入っています。
最新版の5.2をインストールしてみました。

```shell-session
sudo sh -c "echo 'deb http://download.virtualbox.org/virtualbox/debian '$(lsb_release -cs)' contrib non-free' > /etc/apt/sources.list.d/virtualbox.list"
wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox_2016.asc -O- | sudo apt-key add -
sudo apt-get update
sudo apt-get install virtualbox-5.2
```

# インストール結果

5.1とはちょいちょいUI違いますね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59475/afd9e1ff-bb45-fc72-1b83-517ca07faa2d.png)


Systemctlのユニットも細かく分かれているみたいです。

```shell-session
% systemctl list-unit-files |grep vbox
vboxautostart-service.service              enabled        
vboxballoonctrl-service.service            enabled        
vboxdrv.service                            enabled        
vboxweb-service.service                    enabled        
```

# トラブル

ゲストOS起動時はNATが動いてネットワークが使えるのに、少し時間が経つと使えなくなります。なんでだろう。。。？
5.1.30でも同じ症状でした。

## 解決

準仮想化がダメだったようです。Intel MTに変えたら問題解消しました。

# 参考

- https://help.ubuntu.com/community/VirtualBox/Installation
ネガティブ・ポジティブの力

[グロービス Advent Calendar 2017](https://qiita.com/advent-calendar/2017/globis) の7日目です。

**「ネガティブではダメ、ポジティブでいい」**ってよく言われますが、ネガティブとポジティブ、そのものはいいことでもない、悪いことでもない、うまく使いば力になると思います。

## ネガティブとポジティブとは
`物事`を如何考えているかの違いで、ネガティブは否定的で、陰陽の陰極であり、ポジティブは肯定的で、陰陽の陽極です。分離して存在することはできないじゃないかと思います。

## ネガティブとポジティブの力
|物事|ネガティブ|ポジティブ|
|---|---|---|
|ユーザーからシステムの動きがおかしいって言う問い合わせが来ました。でも再現できない|システムにきっとbugがある、問い合わせをしてないユーザーもあるはずと考えて、調査・修正して、システムを改善する|システムには問題ない、ユーザーの使い方が悪いと思うと、結果はシステムは変わらない、ユーザーが離れる|
|vim勉強|vimの勉強のハードルが高いから、諦める。|最初のハードルが高いが、慣れると楽になる。勉強した結果、生産性が高くなった。|
|lockが発生するsql（`update users set num = num + 1`）をtransactionに入れるべきか（データが変になっても大きな問題にはならないケース）|データの整合性を保つためにはtransactionに入れるべき、結果はdeadlockになりやすい、rqsが減る|整合性の問題発生はデータベースが処理途中でdownしたり、ネットワークが切れたり以外は発生しないし、頻度は超稀で、年に数えるぐらいしか発生しないから、transactionの外にlockが発生するsqlを書く。結果はrqsに影響ない。変なデータも少ない|
|lockが発生するsql（`update users set num = num + 1`）をtransactionに入れるべきか（データが変になるのは絶対許さないケース）|データの整合性を保つためにはtransactionに入れる|問題意識がない、稀に発生するから大丈夫と思う。稀にしか発生しないが、発生したら、大きなトラブルに繋がる。|
|変な仕様|自分の判断を信じない、変な仕様通りに作業を進んで、結局、問題が発生し、ユーザーに迷惑かけ、残業で対応する。|自分の判断を信じて、仕様をもう一回確認する。結果は手戻り作業を減らし、ユーザーに迷惑かけない。|
|原発|原子力がコントロールできないだから、使わない方がいい。結果はもっとgreenエネルギー開発に投資|原子力は安全性が検証されているから、使ってもいい。実際は安全なものはない、問題発生したら、解決できるかを一回見直す必要がある。|
|active record|弱点がもあるから、生sqlでよりシンプルになるものは生sqlでやる|active recordがいい、全てをactive recordで書く、結果はperformanceが低い、読みにくいコードになる|
|best practice|best practiceがあくまで参考で、個別の課題に対する解決案ではない|best practiceが大好きで、何もかもそっちに嵌まろうと思い。|
|自分がやった作業について|自信がない、きっと問題があるから、セルフチェックする。結果はいいものを作成する。偉い人間ほど作品を仕上げる時間が長い。|自分の腕を信じて、問題ないと思い込む。結果は何時かは問題が発生する。|
|適当な成果に対する考え|これでは、ユーザー満足度が下がる。改善に挑む|適当になった理由を探す。ユーザーが理由に興味ないし、似た商品（サービス）があると、すぐ離れる|

## 結論

「ネガティブになる、ポジティブになる」ではなく、自らネガティブ・ポジティブになり、物事を考えて、決断をした方がいい。
macのシェルスクリプトで特定の日付から特定の日付を一日ずつ出力する

忘れそうなので自分用のメモ
macはBSDであるためGNU版のコマンドが入ってないことに気がつくまでに時間がかかってしまった

# 下記20171001から20171031の日付を出力する例

```
#!/bin/sh

d="20171001"

while [ "$d" != "20171031" ]; do
    echo $d
    d=$(date -v+1d -j -f "%Y%m%d" "$d" "+%Y%m%d")
done
```

# 出力結果

```
20171001
20171002
・
・
・
・
20171031
```