OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubのIssueをスプレッドシートで一括生成


Githubでプロジェクトを進めていく時、タスク分けをIssueで管理をしているのですが、
GithubのUIってIssueを一気に作れないんですよね。
いちいち毎回POSTしてポチポチしていかないと、、、

プロジェクト始める前の作業であんまり時間取られたくもないので、ちょっとしたツールを作ってみました。


## このツールでできること

 - Issueをボタン一つで複数作れる
 
 -> Excelの見積書とか使ってたら、見積書コピペするだけでIssueが勝手にできちゃいます。




## 作ったもの

https://docs.google.com/spreadsheets/d/1tuS1ekAV7rR1v6s0OrFA3n3nwVwo5ciyN39bVNl5KSM/edit?usp=sharing
<font color=red>*必ず自分の環境に一旦落とし、他人のアクセスができない状態にした上で使用してください。</font>

ここから飛べます。

ソースコードは[こちら](https://github.com/ayasamind/createIssues)


使用したのはGoogle Spread SheetとGoogle Apps Script。

Spread Sheetに入力された値を成形、JSONに変換した上で、
GithubのAPIに対してGoogle Apps ScriptからデータをPOSTすることでIssueを作成しています。


## 使い方

必要な情報はGithubの
- リポジトリユーザー名
- リポジトリ名
- アクセストークン

の三つだけ。

### アクセストークンを作る

Githubで右上のアイコンを押して

Settings -> Developer Settings -> Personal Access Tokens -> Create New Tokens

から作成ができます。
これ一つでOrganization上のディレクトリにもアクセスできてしまうので、権限に関してはしっかり設定しましょう。

<img width="838" alt="github.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/84bd7a4c-efac-3d4d-b01d-d704b809a53f.png">

今回はこんな形で設定しています。
間違ってもdelete_repoにはチェックつけないように、、、
アクセストークンの管理は厳重に。



### IssueBuilderを使ってみよう


アクセストークンができたら、準備OKです。

https://docs.google.com/spreadsheets/d/1tuS1ekAV7rR1v6s0OrFA3n3nwVwo5ciyN39bVNl5KSM/edit?usp=sharing
このリンクを開いて、左上のメニューから

ファイル -> コピーを作成

を押して自分の環境にIssueBuilderを落とします。
他のユーザーから見える状態になっていないか、必ず事前に確認をしてください。


Issue Builderを開いて、ユーザー名、リポジトリ名、アクセストークンを入力します。
<font color=red>*必ず自分の環境に落とし、他人のアクセスができない状態にした上で入力してください。</font>


<img width="637" alt="data.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/23830bb9-0a1c-1dd5-70f7-c582073bbfd2.png">


次に作成したいIssue名とホディを書きます。
<img width="1018" alt="add.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/843897b2-da2e-132f-2402-82dc9049d427.png">

ボディはマークダウンで書いてもちゃんと認識してくれます。


### 実行！

「Issueを作成」ボタンを押すとIssueが自動生成されます。

<img width="1112" alt="result.png" src="https://qiita-image-store.s3.amazonaws.com/0/205370/d154f60b-7251-1df1-724e-184eea62f7e9.png">


できましたー
画面遷移がない上に、アクセストークンさえ作ってしまえば、ユーザー名とリポジトリ名を入力するだけでIssueが作れちゃいます。思ってたより便利だった。笑


## 今後の拡張

とりあえずぱぱっと作ったのでまだタイトルとボディしか追加できません。
ラベル貼るとかはすんなりできそうですので、いつか作るかもしれません。



## 追記

ラベルの作成機能を追加しました。
ラベル欄にラベル名を入力すると、入力した名前のラベルを貼ります。
複数ラベルを貼りたい場合は、

「ラベル1,ラベル2,ラベル3」

といった形で区切っていただくと、三つのラベルができます。
gitメモ

#gitメモ

## ディレクトリ初期化(リポリトリ自体を新規で作成する場合)
```
git init
```

## 取得
```
git clone ssh://{ユーザ名}@{ホスト名}:{ポート番号}/path/to/remote/repogitory my_repogitory
```

## ローカルブランチ確認
```
git branch
```

## 追跡中のリモートブランチ確認
```
git branch -r
```

## 全ブランチ確認
```
git branch -a
```

## ブランチのリファレンスを確認
```
git branch -vv
```

## 更新取得
```
git fetch --all
```

## ブランチの選択
```
git checkout -b local_branch_name target_branch_name
```

## あるブランチから新しいブランチを作る
```
git branch new_branch_name origin/new_branch_name
```
※masterをベースにしたければgit checkout masterしてから実行する

## プッシュ(リモート送信)テスト(-n)
```
git push -n origin new_branch_name
```

## ローカルで作成したリポジトリをリモートにプッシュ(リモート送信)する
```
git push origin new_branch_name
```

## プッシュするローカルターゲットを常に現在選択中のブランチにする
```
git config --global push.default "current"
git config --global user.name "ユーザ名"
git config --global user.email メールアドレス
```

## ローカルリポジトリとリモートが紐付いていない時
```
git branch --set-upstream-to=origin/repo_name repo_name
```
旧

```
git branch --set-upstream repo_name origin/repo_name
```

## 差分表示(すべて)
```
git diff
```
## 差分表示(ファイルごと)
```
git diff path/to/file
```
## 差分表示(ステージに上げたものすべて)
```
git diff --cached
```
## 差分表示(ステージに上げた当該ファイル)
```
git diff --cached path/to/file
```

## 現在のブランチの更新一時退避一覧
```
git stash list
```

## 現在のブランチの内容を一時保存(一つずつ)
```
git stash save
```
※saveは省略可

## 現在のブランチにStashした内容を持ってくる(一つずつ)
```
git stash pop
```

## 現在のブランチにStashした内容を持ってくる(id指定)
```
git stash pop stash@{0}
```

## 指定したStashを削除
```
git stash drop stash@{0}
```

## コミット対象追加
```
git add some_file1 some_file2
```

## コミット対象追加(対話モードで選択)
```
git add -p some_file1 some_file2
```

## コミット
```
git commit
```

## 更新内容を元に戻す
```
git checkout HEAD some_file
```

## コミット状態を取り消し
```
git reset --soft HEAD
```

## コミットとaddを取り消し
```
git reset HEAD
```

## コミット後、そのコミット状態を取りやめる
```
git reset --hard HEAD
```

## push後にreset --hardかけた場合の強制プッシュ
```
git push -f
```

## ログを確認
```
git log
```

## ログを確認(ファイル毎差分表示)
```
git log  -p
```

## ログを確認(更新ファイル表示)
```
git log --stat
```

## ログを確認(直近3件)
```
git log  -3
```
※数字のぶんだけさかのぼって表示

## コンフリクト時、現在のファイルをそのまま採用する
```
git checkout --ours file_name
```

## コンフリクト時、マージしてきたファイルをそのまま採用する
```
git checkout --theirs file_name
```
Meteor + Blaze で匿名質問サービスをつくろう：第3夜 ルーティング

[Meteor + Blaze で匿名質問サービスをつくろう：第2夜 Twitter ログインの実装](https://qiita.com/plageoj/items/67790c3ba3122fb1ea9d) から続きです。

# ルーティングを追加する

SPA には必須のルーティングを追加します。

Meteor では、`iron-router` を使うのが一般的ですので、特に何も考えずこれを使うことにしましょう。
他にも flow-router 等もあります。パッケージによってはどちらかの router でしか動かないものもありますので、確認しておいたほうがいいかもしれません。

迷った場合は iron-router をおすすめします。

## パッケージを追加

```bash
$ meteor add iron:router

Changes to your project's package version selections:

iron:controller        added, version 1.0.12
iron:core              added, version 1.0.11
iron:dynamic-template  added, version 1.0.12
iron:layout            added, version 1.0.12
iron:location          added, version 1.0.11
iron:middleware-stack  added, version 1.1.0
iron:router            added, version 1.1.2
iron:url               added, version 1.1.0


iron:router: Routing specifically designed for Meteor
```

## ルート定義

必要最小限のルートを決めました。

|ルート|名前|機能|
|:---|:---|:---|
|/|Home|新規登録、ログインはここで。ログインすると、自分宛の質問が表示される。|
|/user/:userid|User|特定ユーザーに投げられている質問を一覧。|
|/user/:userid/q|Enqueue|特定ユーザーあてに新しく質問を投げる。|
|/q/:qid|Question|特定の質問を表示する。回答をツイートするためのリンクもここに。|

これに対応するルート定義ファイルを書きます。

Meteor では、`client/` `server/` **以外**の場所にあるすべての JS ファイルは、
**クライアントとサーバーのどちらでも実行できるようになります**。
が、混乱を防ぐため新しく `shared/` フォルダを作成し、共通の JS ファイルは
ここに置くことにしましょう。

```javascript:shared/Router.js
Router.route('/', function() {
    this.render('Home');
});
Router.route('/user/:userid', function() {
    this.render('User');
});
Router.route('/user/:userid/q', function() {
    this.render('Enqueue');
});
Router.route('/q/:qid', function() {
    this.render('Question');
});
```

## Template を作成

さきほど定義したルートに対応するテンプレートを作成します。
`client/templates` フォルダを作成し、ここに入れていくことにしましょう。

本来は1つのファイルの中にいくつでもテンプレートを書けるのですが、
1ファイル1テンプレートにすると、IDE との相性がよいのでおすすめです。
また、必ずしもファイル名とテンプレート名を一致させる必要はありませんが、
これも揃えてほいたほうが見やすいでしょう。

実行時には、Meteor がすべてのテンプレートを結合して1つのファイルとして出力してくれます。

```html:client/templates/Home.html
<template name="Home">
</template>
```

UI の作り込みは第4夜にとっておいて、名前だけのテンプレートを残りの
`User` `Enqueue` `Question` についても作成します。

それでは第3夜はここまで。

[ソースをGitHubで見る](https://github.com/plageoj/queuestion/tree/9cfa0c5e5c9cb6cbdc758a94f56941de234ae302)
git branch -dで１つずつ消すのがめんどかったので一括削除サブコマンドを自作した話

こんにちは、
今日はgitでブランチを一括で消す方法がなかったので、自作して設定するところまでのお話をしようと思います


各開発者は、機能開発が完了した後マージリクエストを送り、私がチェックしています。 
チェックする時は、localにcheckoutして動作等のチェックを行っているんですが、、。

![](https://i.imgur.com/2g3mzaf.png)

気づいたらどんどんbranchは増えていき、一個ずつ削除していくのが面倒、ストレス、やめて。。
なので調べてみたが、branchを一括で消す方法が全然引っかからなかったので、オレオレ一括削除サブコマンド作ってラクしよう!って魂胆ですね


## git rmbranch
![](https://i.imgur.com/2YZ5WaH.png)

```shell=
git rmbranch <BranchName>
```

branch名は完全一致ではなくlike検索仕様にしてあるので、名前やプロジェクト名でまとめて一括削除できる！！！  
rmbranchは作ったので[コチラからどうぞ!](https://github.com/takutoarao/shellutils/blob/master/git-rmbranch)


## サブコマンドの設定
ひとまず、自分のローカルにサブコマンド置いとくようディレクトリを作成
### ファイル作成
```shell
mkdir ~/commands;
touch git-rmbranch;
chmod 755 git-rmbranch
```
とでもしておく。

### パスを通す
```shell=
PATH = $PATH:/Users/araotakuto/commands
```

そしたら、git-rmbranchにshellscriptを書いていけばOK!:ok_woman:

楽に仕事していこう!
LLLで環境構築から初期化コードをコンパイルするまで

この記事は[Ethereum Advent Calendar 2017](https://qiita.com/advent-calendar/2017/ethereum)の15日目の記事です。

Qiitaで記事を書くのは初めてなので、拙い部分が多いと思われますが誰かの役に立てれば幸いです。
今回はSolidityの代わりにLLLでコントラクタをコンパイルするところまでやってみます。

参考：https://media.consensys.net/the-structure-of-an-lll-contract-5adfd322be2

# LLLでスマートコントラクタを書く理由
Ethereumのコントラクトは、EVM(Ethereum Virtual Machine)という仮想環境上で実行されます。SolidityやLLLで書かれたコードはバイトコードにコンパイルされてからEVMにデプロイして、初めて実行できるようになるわけですが、Ethereumにはトランザクションにgasを支払う必要があります。デプロイもトランザクションの一種なので当然gasを支払う必要が出てきます。

このgasというのは言ってしまえば手数料となりますが、当然トランザクションデータ長、デプロイする場合はバイトコード長が短い方が安く済みます。

Solidityは書きやすい反面、レイヤーが高く抽象化されています。そのためバイトコードは意図してるよりも長くなりがちです。
一方でLLLは手間がかかる一方で、アセンブラコードが容易に想像できる構造をしているので、出力されるバイトコードの長さもある程度想像できるものになります。

LLLはそういった点で優れており、またEVMやコントラクトの理解につながると思います。


# 環境設定
### 環境
Mac OS X High sierra 10.13.1

### LLLコンパイラのビルドとインストール
LLLのコンパイラ(lllc)のインストールを行なっていきます
まず作業用のディレクトリにgit cloneしましょう
`$ git clone --recursive https://github.com/ethereum/solidity.git`
solidityディレクトリに移動します。
`$ cd solidity`

ビルドようのディレクトリを作成します。
`$ mkdir build & cd build`

solidityフォルダを指定してcmakeを実行します。
`$ cmake ..`

インストール
`$ make install`

`$lllc --version
LLLC, the Lovely Little Language Compiler
Version: 0.4.20-develop.2017.12.4+commit.4cad0b22.Darwin.appleclang`
と表示されればインストール完了です。
次からは実際にLLLでコントラクトを書いていきます。

# LLLで何もしないコントラクタを書いてみる

とりあえず、何もしない、支払いを受け付けないコードを見ていきましょう。
solidityでは`payable`は関数の有無で自動で判別されているので、当然バイトコード化した時にもコストを払っていることになっていますが、LLLでは判別から書いていくことでコスト削減につながります。


とりあえず、コードを見ていきましょう。

```
(seq
  (when (callvalue) (panic))
  (codecopy 0x00 (bytecodesize) 32))
  (sstore 0x00 (mload 0x00)))
```

`seq`は中括弧`{}`に相当するもので、これでスコープを指定します。

`(when (callvalue) (panic))` の行を見ていきます。
`(when PRED BODY)`はPREDの値が0以外の時にBODYを実行することになっています。
`callvalue`はcall時の引数なので何か引数があったら`panic`で実行を終了します。

続いてメモリ上にコントラクタを読み込んでいきましょう。
`codecopy`ではコントラクタの場所と長さを指定することでメモリ上にコピーされます。
`sstore`はメモリからストレージ上にコピーするためのものでコントラクタが永続的に機能するためのものです。`mload`でメモリからコピーしてから`sstore`最後でEVMのメモリ上にコピーされました。

## コンパイル

```
lllc your_file_name.lll --hex
3415600657fe5b60206014600039600051600055
```

これでメモリ上に支払い不可の何もしないコントラクタがコンパイルされてバイトコードが出力されました。
ABIは何もしていないコードなので空のままです。

# おわりに
ここから先に実際にコントラクタ部分を書いていく場合、情報が少ないのでLLLのリファレンスとgithubのコードを追いかけながら書いていくことがメインとなるでしょう。

またgithub上に`lll-stdlib`を公開してくれている方がいるので、リファレンスと併用しながら書いていくといいと思います。

https://github.com/zigguratt/lll-stdlib

LLLのLispライクな見た目とは異なってアセンブラ単位でコードを書いていくので学習コストが思ったより高かったのですが、変更点のあまりないような細々したコントラクタをいくつか作らないといけない時にはsolidityよりもLLLの方が適しているとも感じました。
触ってみるとEVMの挙動が少しづつ理解できるので、実用レベルに到達しないまでも実際に使ってみるのも悪くないと感じました。
Toolbarが急に消える

再現環境 : Nexus 5 (Android 6.0.1)

以下はどうも `android.support.v7.widget.Toolbar` バグっぽいです。 
（Nougatの端末では再現せず）

---

EditTextに入力していたら、なぜかtoolbar部分が消えた。

EditTextを改行不可にする `android:inputType="text"`

```app/src/main/res/layout/content_main.xml
<EditText android:layout_width="match_parent"
          android:layout_height="70dp"
          android:layout_marginLeft="16dp"
          android:layout_marginRight="16dp"
          android:inputType="text"/>
```

適当に EditText に文字を入力する（そのまま横に入力が進む）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5691/a0a5284d-b731-a396-3bbe-784126ff1712.png)

ある程度進むと急に `toolbar` が上に巻き取られて消える。（スクロール時の動きと同じ感じ）
青いtoolbar部分が消えてしまう。

toolbarの指定はこんな感じ

```app/src/main/res/layout/app_bar_main.xml
<android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />
```

`app:layout_scrollFlags="scroll|enterAlways"` が悪さをしている模様。

---

指定を解除すれば発生しないが、recyclerViewなどでちゃんとスクロールしている箇所ではこのままが良い場合、以下のような感じで特定のviewでだけ指定解除できる。

```app/src/main/java/com/example/mariko/drawercheckedittext/MainActivity.java
AppBarLayout.LayoutParams params = (AppBarLayout.LayoutParams) toolbar.getLayoutParams();
params.setScrollFlags(0);
```

kotlinだともっと簡潔

```
val params = toolbar.layoutParams as AppBarLayout.LayoutParams
params.scrollFlags = 0
```

参考 : https://stackoverflow.com/questions/30771156/how-to-set-applayout-scrollflags-for-toolbar-programmatically

どうも現象としては recyclerView などでスクロールさせている箇所以外だと発生してしまう。
ScrollViewで挟んでもダメっぽい。

ミニマルな再現コードは、AndroidStudioでCreate New Project > Navigation Drawer Activityで作ったプロジェクトで再現できた。 `app:layout_scrollFlags="scroll|enterAlways"` を追加するだけ。
Nougatの端末では再現できずだったので、Marshmallow以下だけかも。
VSCodeでCmd+Qをミスタイプしてしまう悲しみから救済される

`cmd+w` のつまりが。。。。ってなる。

こちらでconfirmが出るようになるし、複数立ち上げてる場合は個別に閉じれるようになります。
[Quit Control for VSCode](https://marketplace.visualstudio.com/items?itemName=artdiniz.quitcontrol-vscode)
[![Screenshot from Gyazo](https://gyazo.com/f306827d084d446d65d287fc84bd4fd8/raw)](https://gyazo.com/f306827d084d446d65d287fc84bd4fd8)

happy!
[js]配列のコピー

# はじめに
reduxのstateで配列のコピーがうまくできておらず、勝手にstateが更新されてはまったのでメモ

# 参照渡し
[こちら](https://qiita.com/takahiro_itazuri/items/882d019f1d8215d1cb67)の記事を読めばわかるが、jsの配列はobjectの一種でobjectと同じ参照渡しである。
そのため、普通に変数に入れて値を更新するると、参照先の値も変更されてしまう。

```js
const itemArr = [
  {id: 1, value: 10},
  {id: 2, value: 100},
]

const newItemArr = itemArr
newItemArr[1].value = 200

console.log(itemArr[1].value) // 200
console.log(newItemArr[1].value) // 200
```
# shallow clone
concatやsliceを使うと配列自体はコピーされるが、その中のobjectは参照渡しになってしまう。

```js
const itemArr = [
  {id: 1, value: 10},
  {id: 2, value: 100},
]

const newItemArr = itemArr.concat()
newItemArr[0] = 1
newItemArr[1].value = 200

console.log(itemArr[0]) // {id: 1, value: 10}
console.log(itemArr[1].value) // 200
```

# deep clone
外部のライブラリーを使うことでobjectの値までコピーすることができる。[参考](https://qiita.com/takeharu/items/7d4ead780710c627172e)
## lodash
lodashのcloneDeepを使うと簡単に実装できる。

```js
import _ from 'lodash'

const itemArr = [
  {id: 1, value: 10},
  {id: 2, value: 100},
]

const newItemArr = _.cloneDeep(itemArr)
newItemArr[0] = 1
newItemArr[1].value = 200

console.log(itemArr[0]) // {id: 1, value: 10}
console.log(itemArr[1].value) // 100
```
Heroku で２要素認証していた→携帯紛失かつリカバリーコードもない場合の対応

# はじめに
もともと想定していた内容が間に合わなかったので、小ネタ。Advent Calendar としてはあとで差し替えます...自分の話でもないですし、仕事上での話でもない、ひとから聞いた話です。

# 結論
 `account-lockout@heroku.com` にメールする。２要素認証を解除して貰えます。
Qiitaで下書き保存されまくって困ってる方へ。

なんか下書きが暴発して困ってるとか社内で言われたのでさくっと。
ブラウザのコンソールで叩くとまとめて下書き削除できるよ。
404起きるけど実行してしばらく放置でリロードどうぞ。

```js
$('.teamDrafts_infoColumn .btn-danger').each(function() { var href = $(this).attr('href'); $.ajax({ url: href, method: 'delete' }); });
```
VDM++における型定義

# はじめに
VDM++は**形式仕様記述言語**と呼ばれる言語で、形式手法を適用するために用います。
VDM++についての詳しい説明は[こちら](http://research.nii.ac.jp/~f-ishikawa/vdm/faq.html)

本記事は型定義に関してのまとめです。

# 型定義
VDM++はプログラミング言語でいう**型**が存在しており、大きく分けて基本型と合成型が存在します。

> 基本型 : 単純に価の集まりをモデリングするもの。
> 合成型 : 型構成子を他の型（合成型あるいは基本型）に適用することによって得られる型。
> --- _[VDM++によるオブジェクト指向システムの高品質設計と検証より引用](https://www.amazon.co.jp/VDM-%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%AB%98%E5%93%81%E8%B3%AA%E8%A8%AD%E8%A8%88%E3%81%A8%E6%A4%9C%E8%A8%BC-architects%E2%80%99-archive/dp/479811961X)_

簡単に言うと、基本型は型の最小な定義で、合成型は型（基本型か合成型）の組み合わせによってできる型です。

## 基本型
大きく分けて**ブール型**、**数型**、**文字型**、**引用型**の4つの型が存在する。

### ブール型
いわゆる真理値を扱う型。

|記号  |意味  |値  |
|---|---|---|
| **bool**  |真理値  | true, false  |

### 数型 
いわゆる数字を扱う型。その中でも５種類存在します。

|記号  |意味  |値  |
|---|---|---|
| **nat1**  |正の自然数  | 1, 2, 3 など  |
| **nat**  |自然数  |0, 1, 2 など  |
| **int** |整数 | -2, -1, 0, 1 など|
| **rat** |有理数 | -2.1, -2.0, 1.0, 1.1 など|
| **real** |実数 | -3.1, -1/3, 1/2, 2.2 など|

### 文字型
単一の文字を扱う型。 **文字列は文字型の集合(seq of char)です。**

|記号  |意味  |値  |
|---|---|---|
| **char**  |文字  | '1', 'a', '壱' など  |

### 引用型
いわゆる列挙型を扱う型。

|記号  |意味  |値  |
|---|---|---|
| **\<QuoteLit\>**  |引用型  | \<運転中\>, \<停止中\>, \<加速中\> など  |

**注：QuoteLitは任意の文字列**

例えば合成型の選択型を利用することで状態を表すことができます。

```
自動車の状態 = <運転中> | <停止中> | <加速中>
```

## 合成型
そのうち書きます。

# 参考
* [VDM++によるオブジェクト指向システムの高品質設計と検証より引用](https://www.amazon.co.jp/VDM-%E3%81%AB%E3%82%88%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E9%AB%98%E5%93%81%E8%B3%AA%E8%A8%AD%E8%A8%88%E3%81%A8%E6%A4%9C%E8%A8%BC-architects%E2%80%99-archive/dp/479811961X)
* [形式手法の技術講座―ソフトウェアトラブルを予防する](https://www.amazon.co.jp/%E5%BD%A2%E5%BC%8F%E6%89%8B%E6%B3%95%E3%81%AE%E6%8A%80%E8%A1%93%E8%AC%9B%E5%BA%A7%E2%80%95%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%92%E4%BA%88%E9%98%B2%E3%81%99%E3%82%8B-%E4%BD%90%E5%8E%9F-%E4%BC%B8/dp/4883732584)

参考にさせていただきました。ありがとうございました。

# おわりに
私はソフトウェア工学に関する研究室に所属する学生です。研究室配属後に形式手法のこと、形式使用記述のこと、VDM++のことを知りました。
VDM++には素晴らしい実績があります。しかし、VDM++の勉強をしようと思っても、なかなかインターネット上では日本語の記事が見つかりません。適用例が多くヒットします。入門者にはとても敷居が高いと思いました。また、VDM++があまり普及していないという要因もあるかと思います。
そこで、入門者向けの記事をネット上で公開することで、VDM++を盛り上げることにつながるのかなあと思い、少しづつ記事にしていこうと考えました。
私自身VDM++の入門者であり、間違いを書くことは多々あるかと思うので、その時はぜひコメント欄にてご教授頂けると幸いです。
SDEとSIEの基礎

#はじめに
3回目の記事投稿です。今回は確率微分方程式(SDE)と確率積分方程式(SIE)についてです。SDEもSIEも文字どおり微分方程式やRiemann積分の中に確率過程が入った方程式です。確率が入った場合をどのようにして計算できるようにするのか、ざっくりと見ていきましょう。
#ODEとSDEの違い

一般的な微分方程式(ODE)といえばx(t)がtについて微分可能な関数でf(t,x)がtとxの関数であるとき区間0$\leq t \leq T$において
$
\frac{dx(t)}{dt}=x'(t)=f(t,x(t)),\\
x(0)=x_0\\
$
という形で、ここから$dx(t)=f(t,x(t))dt$と変形し、$x'(t)$の連続性から両辺をtで積分して
$
x(t)=x(0)+\int_{0}^{t}f(s,x(s))ds\\
$
と表すことができる。

ここまではODEである。SDEはここに「ランダムな揺らぎ」を加えるのである。
前回の記事で定義したBrown運動B(t)は微分可能ではないが形式的に微分して
$
\xi(t)=\frac{dB(t)}{dt}=\dot{B}(t)\\
$
ここで$\xi(t)$はWhiteNoiseと呼ばれる揺らぎである。

今、時刻t,位置xにおけるNoiseの強さを$\sigma(t,x)$と表すと0$\leq $t $\leq$ T全体でのNoiseの影響は
$
\int_{0}^{T}\sigma(t,X(t))\xi(t)dt=\int_{0}^{T}\sigma(t,X(t))\dot{B}(t)dt=\int_{0}^{T}\sigma(t,X(t))dB(t)\\
$
と表される。

#SDEを作ろう
拡散やBrown運動の数学モデルに関する物理現象に利用されるSDEの一般式を作るために水中の粒子の微視的な動きを例に取り上げよう。
速度変化する水中の粒子は色々な方向の粒子と衝突し、一定の衝撃度を引き起こすことによって不規則な動きをするが、「水中の温度」によってこの動きは激しさが変わる。時刻tにおける粒子の初期位置からの一方向における変位をX(t)とする。この時、時刻t、位置xにおける温度の影響を表す尺度を$\sigma(t,x)$とすれば微小な時間区間$[t,t+\delta t]$における衝撃度による変位は$\sigma(t,x)(B(t+\delta t)-B(t))$と表すことができる。

仮に時刻t、位置xにおける速度を$\mu(t,x)$とおけば先ほどの微小な時間の区間における水中の動きによる粒子の変位は$\mu(t,x)\delta t$である。

したがって時刻t、位置xにおける粒子の全変位は
$
X(t+\delta t)-x\approx \mu(t,x)\delta t+\sigma(t,x)(B(t+\delta t)-B(t))・・・(*)
$

SDEでは先ほどの式を次のように置き換える。
$
・\delta t=dt\\\
・\delta B=B(t+\delta t)-B(t)=dB(t)\\\
・X(t+\delta t)-X(t)=dX(t)\\\
$

上記の3式と(*)を対応させると
$
dX(t)=\mu(t,X(t))dt+\sigma(t,X(t))dB(t)...(1)$
$
※\mu(t,X(t)...ドリフト係数(ざっくりいうと拡散過程の中で定義されるベクトル)\\\
\sigma(t,X(t))...拡散係数(ざっくりいうと拡散過程の中で定義される行列)\\\
$
(1)が確率過程X(t)におけるSDEの式である。

#SDEからSIEへ

SDEとSIEの関係を簡潔にまとめます。

確率過程X(t)がSDEの解であるとはすべてのt>0に対して
積分$\int_{0}^{t}\mu(s,X(s))ds$と確率積分$\int_{0}^{t}\sigma(s,X(s))dB(s)$が存在し
かつ
$SIE:X(t)=X(0)+\int_{0}^{t}\mu(s,X(s))ds+\int_{0}^{t}\sigma(s,X(s))dB(s)$
を満たすことである。

#SDEを金融の問題へ応用
以下のような問題を考えてみよう。

不確実なリターン率(リスク資産の収益率)で増える銀行預金講座に1円預けた時、時刻tでの価値x(t)を計算しよう。金利をrとすると複利計算からx(t)は$\frac{dx(t)}{x(t)}$=rdtを満たす。もしこのrにwhiteNoiseである$\xi(t)$を加えるとrはr+$\sigma\xi(t)$に変わる。

このとき、リスク資産の現在の価値を表す確率過程$X(t)$は
$\frac{dX(t)}{dt}=(r+\sigma\xi(t))X(t)$
$X(0)>0$
に従うとみなすことができる。これを変形すると
SDE:$dX(t)=rX(t)dt+\sigma\xi(t)X(t)dB(t)$
を得る。

ちなみに伊藤の一般公式に当てはめてあげて出てきた式
$X(t)=e^{(\mu-\frac{1}{2}\sigma^2)t+\sigma B(t)}$
(導出は省きました、一般公式に当てはめるだけ)
この解X(t)は幾何Brown運動と呼ばれ、金融のBlackScholesモデルにおけるリスク資産である。

#####参考文献
成田 著. 確率解析への誘い -確率微分方程式の基礎と応用-. 共立出版. p.34-37, 148-156.
foliumメモ

# 概要

foliumについて調査した結果のメモ書き

# 公式ドキュメント
http://python-visualization.github.io/folium/docs-master/

# folium.Map

マップオプジョクトの生成

![screenshot 2017-12-15 16.30.55.png](https://qiita-image-store.s3.amazonaws.com/0/65095/9a28cc0b-306a-f48a-8fc6-7e13b533b2f7.png)


* location  
中心座標を指定
* tiles  
地図の種類を指定
  * OpenStreetMap(default)
  * Stamen Terrain
  * Stamen Toner
  * Mapbox Bright
  * Mapbox Control Room  
  * 他にも色々ある
* zoom_start  
初期描画時の地図の大きさ

# folium.Marker
マーカーの設置

![screenshot 2017-12-15 16.58.58.png](https://qiita-image-store.s3.amazonaws.com/0/65095/b176832f-4b85-007c-3f01-6900d1295e7a.png)

* location  
マーカーを設置する座標
* popup  
マーカークリック時のポップアップ内メッセージ
* icon  
色やアイコンの指定
  * prefix  
  アイコンソースを指定。[こちらのサイト](https://glyphsearch.com/?library=font-awesome)で使用可能なアイコンは確認可能
     * glyphicon(default)  
     Glyphicons
     * fa   
     FontAwesome
Laravel Valet でローカル開発中の.devドメインのページにchromeからアクセス出来ない。

#困った
さて、[Laravel Advent Calendar 2017](https://qiita.com/advent-calendar/2017/laravel)にノリでエントリーしたのはいいけど、なにを書こうかと自分の開発中のプロジェクトのコードを眺め、ちょっと動作を確認しようとしてはまりました。
まさしく今日のことです。

Valetを利用していままで問題なくアクセス出来ていた"PRODUCT.dev"にアクセス出来ません。

私はローカル環境の管理が雑なので、apacheやvagrantのポートフォワードなんかとぶつかっているとかを疑って一通り環境をクリアにしてみたのですが、それでもダメでした。

#https:// ?
ふと、

```console
$ valet open
```

としたところ「safari」が起動、なにも問題なくプロジェクトのトップページが表示されました。もしかしたら、とFireFoxで確認するとこちらでも問題ありません。
私は「chrome」を常用しています。どうもそのchromeに問題あるようです。検索するとありました。

[Chrome 63 now forces .dev domains to HTTPS - Laravel News](https://laravel-news.com/chrome-63-now-forces-dev-domains-https)

「Chrome 63」って、つい先週（2017.12.7）更新された版ですよね。
「.dev」ドメインに対して勝手にhttps、つまり強制的にセキュアアクセスするようになったとのこと。

# $ valet domain test
上の記事で紹介されているように

```console
$ valet domain test
```

と付加するドメインを「.test」に変更したところ問題なくchromeからでも"PRODUCT.test"へアクセス出来るようになりました。

上の記事で紹介されているページを覗くと、

[Don't Use .dev For Development - iyWare](https://iyware.com/dont-use-dev-for-development/)

[RFC2606](https://tools.ietf.org/html/rfc2606)では以下の4つのドメインが開発テスト用に予約されているとのこと。

- .test
- .example
- .invalid
- .localhost

この中でも本来のテスト用として相応しいのは「.test」になるようです。

なお、件の「.dev」はどこが管理しているのかというと
[Delegation Record for .DEV - iana](https://www.iana.org/domains/root/db/dev.html)
なるほど、Google。
（「Charleston Road Registry」はGoogle傘下のレジストリ）

…後で"PRODUCT.dev"で連携を定義ししてあるところを書き換えないと。
カスタムリストとワークフローを組み合わせて掲示板を作成する

この記事は、Office 365 Advent Calendar 2017 に参加しています。 Office 365 Advent Calendar 2017 https://adventar.org/calendars/2585

勤務先のSharePoint Onlineを活用した掲示板の事例を紹介します。Qiitaへの投稿ですが、あまり技術的な要素は
ないことをご容赦ください（自分が企画し、社内でSharePoint利用が拡大した事例です）

#1.利用状況
(1)システム開発会社の本部（250名程度）の情報共有基盤として利用
(2)2017年5月にリリースし、本日までに232件投稿済み
(3)システム開発に関する事項を投稿（業務連絡として利用）

#2.掲示板を利用しようとしたきっかけ
(1)従来はメールが主流であったが、本部内で情報共有がうまくいかずにトラブルが発生する事例があったため
(2)本部で共有するべき案件をルール化し、該当するものはSharePointに登録してより円滑に情報共有できるようにした
※メールはその当時に受け取った人しか確認できない。見逃し・削除によって、対応が漏れる恐れがある

#3.開発期間
(1)従来の情報共有方法との使い分けを明確にすることが求められたため、企画にかなり時間がかかった
(2)2016年11月にトップに企画を報告し、質疑応答や追加要望に応え、2017年3月にパイロット運用開始
(3)各種会議等で操作方法を説明し、2017年5月リリース

#4.掲示板開設において工夫したこと
(1)掲示板投稿と同時に、メールでプッシュ通知もできるようにした（ストックとフローを組みあわせた）
(2)プッシュ通知の範囲を選択可能とした
　①選択肢より通知範囲を選択できるようにした（全員・Aセンター・Bセンター・Cセンターなど）
　②SharePointデザイナーでワークフローを作成し、通知範囲の選択によりメール発信先を切り替えた
(3)掲示板投稿時にキーワードを登録できるようにし、メタデータ検索できるようにした
(4)Webパーツの「最近変更があったアイテム」を利用し、投稿状況が一目で分かるようにした
(5)SharePointが投稿と同時に記録する情報（投稿日時や投稿者）をうまく活用し、ユーザーが入力する項目をできるだけ減らした
(6)Java ScriptやCSSを使い、フォームの大きさを調整したりリストの見た目を整えた

#5.ユーザーからの評価
(1)メールと違い宛先を自分で入力する必要がないため、他部署への情報共有が楽になった
(2)メールを探す手間が減った（一元管理されているため）
(3)掲示板を確認時に前後のアイテムが自然と目に入るため、他の業務の漏れに気づく機会が増えた

Japan Sharepoint Group等でもう少し詳細に説明できたらと考えています。
SharePointの業務利用に生かせていただけたらと思い投稿しました
Jupyter Notebookで指向性をグラフ化してみた

この記事は[呉高専エンジニア勉強会 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/kure-kosen)の16日目の記事です。

こんにちは、呉高専専攻科のちゃんゆーです。

僕の隣の研究室は日本トップクラスの電磁波の研究をしてて「ほげー」って感じで見ているのですが、話を聞くと指向性のグラフを、Excelなんかを駆使して何重にもレイヤーを重ねて、手作業で作っているとのことでした。
「こんなんPython使えば一発でしょ」と思って簡単なスクリプト書いたらほんとに一発でできたお話です。

# 環境

```bash
$ cat requirements.txt

appnope==0.1.0
bleach==2.1.1
cycler==0.10.0
decorator==4.1.2
entrypoints==0.2.3
html5lib==1.0b10
ipykernel==4.6.1
ipython==6.2.1
ipython-genutils==0.2.0
ipywidgets==7.0.1
jedi==0.11.0
Jinja2==2.9.6
jsonschema==2.6.0
jupyter==1.0.0
jupyter-client==5.1.0
jupyter-console==5.2.0
jupyter-core==4.3.0
MarkupSafe==1.0
matplotlib==2.1.0
mistune==0.7.4
nbconvert==5.3.1
nbformat==4.4.0
notebook==5.2.0
numpy==1.13.3
pandas==0.20.3
pandocfilters==1.4.2
parso==0.1.0
pexpect==4.2.1
pickleshare==0.7.4
prompt-toolkit==1.0.15
ptyprocess==0.5.2
Pygments==2.2.0
pyparsing==2.2.0
python-dateutil==2.6.1
pytz==2017.2
pyzmq==16.0.2
qtconsole==4.3.1
simplegeneric==0.8.1
six==1.11.0
terminado==0.6
testpath==0.3.1
tornado==4.5.2
traitlets==4.3.2
wcwidth==0.1.7
webencodings==0.5.1
widgetsnbextension==3.0.3

```

もしかしたらいらないのも混ざっているかもしれない。

要は `jupyter` 、 `pandas` 、 `numpy` と `matplotlib` を使います。


# jupyter notebookの起動

```
$ jupyter notebook
```

これでブラウザが勝手に起動して、jupyter notebookが使えるようになります。


# 実装

## 前提
csvのヘッダーは

```
Phi [deg],data1,data2,data3,data4
```

このようになっておりました。
実験によっては `data5, data6...` となるそうです。

データ数が増えるのはいいとして、これ指向性だから極座標形式で描画しないといけない。
できるだろうけど文献がほとんどないぞ。がんばろう。

## コード

```python3:scratch.ipynb

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

df = pd.read_csv('sample.csv')

deg = df['Phi [deg]']
values = df.iloc[:, 1:]

lines = ['-', '--', '-.', ':', '.', ',']

ax = plt.subplot(111, projection='polar')

ax.axes.set_theta_zero_location('N')
ax.set_theta_direction(-1)
ax.set_rlabel_position(0)
ax.set_xticks(np.pi/180. * np.linspace(0,  360, 12, endpoint=False))

ax.spines['polar'].set_color('darkgray')

plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 12

plt.ylim(-60.1, 5)

theta = deg*np.pi/180
r = values

for i in range(len(values.columns)):
    label = values.columns[i]
    line = lines[i%len(lines)]
    ax.plot(theta, values.iloc[:, i], line, label=label)

plt.legend(bbox_to_anchor=(0.5, -0.15),  ncol=len(values.columns), loc='center')
plt.savefig('sample.png', dpi=500, bbox_inches='tight')
plt.show()

```

がんばった。
殴り書きみたいな感じですが、 `sample.csv` を読み込んでうまい具合にグラフを描画してくれて `sample.png` が書き出されます。


# 結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/177433/444645cb-a8ce-a9f8-22e2-dbb64dfc3168.png)

こんな感じで表示されました。わーい。

なんか自分も電磁波のプロフェッショナルになった気分♪


# その後とまとめ

その研究室の人に見てもらって、めっちゃ喜んでもらいました。
が、実用上は、論文用にモノクロ出力しないといけないとか、凡例の位置の調整をしないといけないとかで、その都度プログラム修正しないといけないので、実際に使われることはありませんでした。

そのあたりまで作り込んで、全てWeb上で完結するシステム構築すれば1万円くらいで売れたんじゃないかと思ってます。笑
ざんねん。

とはいえ、よいpandasとmatplotlibの復習の機会になったんで感謝です！
JavaからDockerを起動してOfficeドキュメントをPDF変換する


# 1. はじめに
* 動作環境はCentOS7上のdockerを対象とする。
※  Windows上のdockerではうまく動作しないことも確認済み
* javaのバージョンは1.8で確認済み

# 2. Dockerのインストール
CentOS上にDockerをインストールします。
詳細は公式のページ参照
https://docs.docker.com/engine/installation/linux/docker-ce/centos/

```bash
yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce
systemctl enable docker
systemctl start docker
```

# 3. Dockerの設定
(1). CentOS7のイメージを構築します

```bash
docker pull centos:centos7
docker run -it centos:centos7 /bin/bash
```

(2). LibreOfficeとIPAフォントを導入します

```bash
yum update -y
yum install libreoffice* ipa-*-fonts
```

(3). 作業用フォルダを作成します

```bash
mkdir /tmp/
exit
```

(4). DockerのCONTAINER IDを確認します

```bash
docker ps -a
```
(5). 「office」の名前でコミットします
*${CONTAINER ID}*には先ほど確認したCONTAINER IDを入れます。

```bash
docker commit ${CONTAINER ID} office
```

(6). 正しく動作するか確認します
CentOS上に「/var/tmp/test.xlsx」ファイルが存在するものとします。
正常に実行されると「/var/tmp/test.pdf」が生成されます。

```bash
docker run --rm=true -it -v /var/tmp:/tmp office libreoffice --headless --nologo --nofirststartwizard --convert-to pdf --outdir /tmp /tmp/test.xlsx
```

# 4. Javaのコーディング
javaのprocessクラスでdockerを起動するサンプルです。

```java

	/**
	 * Docker経由でPDF変換を行う
	 * @param excelFileName
	 * @param pdfFileName
	 * @return
	 * @throws InterruptedException
	 */
    public boolean convertPDF(String excelFileName) throws InterruptedException {

		//起動コマンド指定
		String[] command = {
				"docker", "run", "--rm=true", "-v", "/var/tmp:/tmp", "office", "libreoffice", "--headless"
                , "--nologo", "--nofirststartwizard", "--convert-to", "pdf", "--outdir"
                ,"/tmp", "/tmp/"+excelFileName };

        ProcessBuilder pb = new ProcessBuilder(command);

		try {
            //コマンド実行
			Process process = pb.start();

            //コマンド実行の結果を待機
			int ret = process.waitFor();

            //標準出力
			InputStream is = process.getInputStream();	
			printInputStream(is);

            //標準エラー
			InputStream es = process.getErrorStream();	
			printInputStream(es);

		}
		catch (Exception e) {
			return false;

		}

		return true;
    }
    
	/**
	 * 標準・エラー出力を表示する
	 * @param is
	 * @throws IOException
	 */
    public static void printInputStream(InputStream is) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(is));
		try {
			for (;;) {
				String line = br.readLine();
				if (line == null) break;
				System.out.println(line);
			}
		} finally {
			br.close();
		}
	}
```
2つのNullableを同時にUnwrapする独自スコープ関数(的なもの)


# 前置き
Kotlinといえばスコープ関数。
そのスコープ関数の中でも一番利用頻度が高いのが `let` による`Nullable` のアンラップですね。

```Kotlin
fun doSomething(a: String) {
	print(a)
}

fun hoge(a: String?) {
	a?.let { doSomething(it) } // a == null の場合は表示されない
}
```

これは

```Kotlin
if(a != null) {
	doSomething(a) // aはsmart castによりStringとして扱われる
}
```

と書くこともできますが、オブジェクトのNullableなプロパティ等に対して使うことはできません。

```Kotlin
class Hoge {
    var a: String? = null
}

fun doSomething(hoge: Hoge) {
    if (hoge.a != null) {
        fuga(hoge.a) // コンパイルエラー "Smart cast to 'String' is impossible, because 'hoge.a' is a mutable property that could have been changed by this time"
    }
}

fun fuga(str: String) {
    print(str)
}
```

`hoge.a != null` の判定を行ってから `fuga(hoge.a)` を呼ぶまでの間に何らかの要因(別スレッドから書き換えられる等)で `hoge.a` が `null` になってしまう可能性があるからキャストできないよ、ということです。

当然、こういう場合は以下のようにするのが最適解ですね。

```Kotlin
hoge.a?.let { fuga(it) } // ① hoge.aをアンラップした値はitでそのまま取り出せる
hoge.a?.let { a -> fuga(a) } // ② もちろんパラメータ名を指定することもできる
hoge.a?.let(::fuga) // ③ 関数参照(でいいのかな？)で呼び出す
```

# 本題

さて、こういうケースを考えてみましょう。

```Kotlin
fun doSomething(a: String, b: String) {
    // do something
}
```

この `doSomething` をNullableな2つの値で呼び出すことを考えます。

```Kotlin
class Hoge {
    var a: String? = "a"
    var b: String? = null
}
```

もちろん、

```Kotlin
if (hoge.a != null && hoge.b != null) {
    doSomething(a, b)
}
```

と書いても先述の通りsmart castが効かないのでNGです。
かと言って、

```Kotlin
hoge.a?.let { a ->
    hoge.b?.let { b ->
        doSomething(a, b)
    }
}
```

と書くのも無意味なネストができるだけ...

# そこで
こんな関数を定義してみました。

```Kotlin
inline fun <T1, T2, R> T1.letWith(other: T2?, action: (T1, T2) -> R): R?
    = other?.let { action(this, other) }
```


## 使い方
こんな風に使います。

```Kotlin
hoge.a?.letWith(hoge.b) { a, b -> doSomething(a, b) }
```

こうすることで、 `hoge.a` と `hoge.b` がどちらも `null` じゃない時にだけクロージャの中を実行する、という動作を実現できます。
もちろん、

```Kotlin
val str = hoge.a?.letWith(hoge.b) { a, b -> "a: $a, b: $b" } ?: "(empty)"
print(str)
/*
 * hoge.a != null && hoge.b != null → a: $a, b: $b
 * hoge.a == null || hoge.b == null → (empty)
 */
```

のようにelvis演算子を使うこともできます。

2変数の同時アンラップで悩まされている方、ご参考にしてみてはいかがでしょうか？

# 注意
お気づきの方もいるとは思いますが、これは `hoge.a` と `hoge.b` のどちらが `null` かを判定する必要がある場合には使えません。
あくまでどちらも `null` でない時だけ特定の処理をしたいという場合を想定しています。
Rubyで画像をアニメ風に変換する

# 動機
以下の記事に触発され、同じことをRubyで実装してみました。
[画像処理で写真をアニメ風に変換する](https://qiita.com/kurehajime/items/161a56956235494b2f88)

# ソースコード
```ruby:animated_pict.rb
#!/usr/bin/env ruby

require 'rmagick'

def distance(first,second)
  first_f = first.map{|num| num.to_f} # 要素を実数に変換
  second_f = second.map{|num| num.to_f} # 要素を実数に変換
  first_f.zip(second_f).map{|f,s| (f-s)**2}.inject(:+)**(0.5)
end

color_set = [
  [0,0,0], [65535,65535,65535], [32768,0,0], [65535,0,0],
  [32768,32768,0], [65535,65535,0], [0,32768,0], [0,65535,0],
  [0,32768,32768], [0,65535,65535], [0,0,32768], [0,0,65535],
  [32768,0,32768], [65535,0,65535]
]

img = Magick::ImageList.new("pict.png")
img.rows.times do |row|
  img.columns.times do |column|
    pixel = img.pixel_color(column,row)
    distances = color_set.map{|color| distance(color, [pixel.red, pixel.green, pixel.blue])}
    color_hash = distances.zip(color_set).to_h
    min_dis_color = color_hash[distances.min] # 距離が一番近い色を取り出す
    new_color = Magick::Pixel.new(min_dis_color[0],min_dis_color[1],min_dis_color[2])
    img.pixel_color(column,row,new_color)
  end
end

img.write("animated_pict.png")
```

# 実行結果
元の画像
![fruit.jpg](https://qiita-image-store.s3.amazonaws.com/0/189330/e485abd0-d28c-8719-ab7c-6ea977d11ca3.jpeg)

処理したあとの画像
![anime_fruit.jpg](https://qiita-image-store.s3.amazonaws.com/0/189330/bf9a3724-ea50-6ff4-131b-11dea8fef4d2.jpeg)
ブラウザによって、JSエンジンが解釈できる「日付書式」が違う

この記事は [BRIGHT VIE Advent Calendar 2017](https://qiita.com/advent-calendar/2017/brightvie) 16日目の記事になります。

#はじめに

私が、IonicなどのiOSアプリやWebアプリを開発している時、
ブラウザはChromeを使い開発しています。

Chromeで動作検証をし、問題なさそう！と思ったタイミングで、
実機へ移すと「スクリプトエラーでてるやん・・・」みたいなことがたまにあります。

#ChromeとSafariのJSエンジンの違い

この違いによって、Mac上(Chrome)では上手く動いていたのに、
実機へもっていくとスクリプトエラーで動かない！といったケースが起こってしまいます。

■各ブラウザごとのJSエンジンの違い
Chrome：[Chrome V8](https://developers.google.com/v8/)
Safari：[JavaScriptCore](https://trac.webkit.org/wiki/JavaScriptCore)

#Date型の書式解釈の違い

「そんな書き方だめでしょ！」という批判は、今回は無しでお願いしますｗ

以下の書き方は、ChromeもSafariもOKです。

```js
var f = new Date("2017/02/03 14:00");
console.log(f);

//Chrome・Safari ◯
// → Fri Feb 03 2017 14:00:00 GMT+0900 (JST)
```

ですが、以下の書き方はSafariでは怒られます。

```js
var f = new Date("2017-02-03 14:00");
console.log(f);

//Chrome ◯
// → Fri Feb 03 2017 14:00:00 GMT+0900 (JST)

//Safari ✕
// → Invalid Date

```

「ハイフン付きの日付書式なんて使っちゃだめだよ」と言われてしまいそうですが、
使ってしまったものは仕方ないので、
「以降注意していこう！」と、自分自身に気をつけながら日々成長です。

（そもそも、なんでこんな差異がエンジンごとにでてしまうんだ、、そっちを直してくれ！ともたまに思いますｗ）
【EC-CUBE】MySQL8で新しく予約語となった「rank」を「sort_no」に変更した話

EC-CUBE Advent Calendar 2017 17日目の記事です。
[前回の記事](https://qiita.com/okazy/items/2c6afc6c04fc0e2a5cc0)の続きです。

# 概要
MySQL8で `rank` が新しく予約語となりました。
EC-CUBEでも `rank` をソート順のカラム名として利用していたのでMySQL8対応で別のカラム名に置換する必要が出てきました。
この対応でいろいろと周辺の状況についても調べましたのでここにまとめます。

# SQLの予約語
プログラミング言語において字句的には識別子としてのルールを満たしているにもかかわらず、識別子にならない字句要素。SQLには予約されたキーワードと予約されていないキーワードがある。（[wikipedia](https://ja.wikipedia.org/wiki/%E4%BA%88%E7%B4%84%E8%AA%9E)より引用）

## 予約語
SQLの予約語はそのままではカラム名等として使用できません。
MySQL8で新しく予約語が増えたため、MySQL8でEC-CUBEのインストールを使用とするとエラーが発生してしまいました。
EC-CUBEで使用しているカラム名で新しく予約語となったのは `rank` だけでした。

## 非予約語（キーワード）
SQLの非予約語（キーワード）はある文脈では特別な意味を持ちますが、カラム名等として使用できます。
EC-CUBEでも非予約語をカラム名として使用していますが、こちらはエラーとならず使用できます。
非予約語は将来予約語となる可能性がありますので、出来れば使用しない方がよいです。

| DB | EC-CUBEで利用している非予約語例 |
|:--:|:---|
| MySQL | name,visible,status,password,value,subject,work,code,source,event,handler |
| PostgreSQL | id,name,event,rank,version,source,handler,password,work,header,value,hierarchy |


この機会にいろいろなSQLの予約語を調べましたので予約語の一覧を作成しました。
[こちら](https://qiita.com/okazy/items/9dd6552fc678077e27cd)の記事で投稿しておりますので予約語を調べられる際はご活用ください。

# EC-CUBEにおける `rank` 
EC-CUBEでは項目の表示順を保存するカラム名として `rank` を使用しておりました。
カテゴリーや商品規格、配送方法、支払方法等の12個のデータテーブルだけでなく、22個のすべてのマスタデータテーブルで `rank` を利用していましたので対応が必要な範囲はかなり広いものとなりました。

# 対応方針
EC-CUBE3.nではORMとしてDoctrineを使用しております。
MySQLではバッククオートで囲むことで予約語でも使用可能となるのですが、Doctrineがこちらの手法に対応しておりません。
ですので今回は `rank` を `sort_no` へ変更することで対応することにしました。

# 対応方法
実際にやった作業内容はIDEの検索/置換機能と目grepを組み合わせた泥臭い作業でした。
EC-CUBE3.nではフレームワークを利用して開発が進められており、命名規則もフレームワークに沿っておりますのである程度グループ分けをして置換していくことができました。

+ コメントの `rank` -> `sort_no`
+ 文字列リテラルの `rank` -> `sort_no`
+ プログラム内の `Rank` -> `SortNo`
+ プログラム内の `rank` -> `sortNo`

実際の対応内容は[こちら](https://github.com/EC-CUBE/ec-cube/pull/2643)のプルリクですのでご確認いただければと思います。
上記のプルリクでは `rank` 以外のカラム名の変更も同時に行っています。

## カラム名変更でチェックが必要な個所
### Entity
- アノテーションでカラム名の定義が書かれているので修正
    - 例: `@ORM\Column(name="sort_no", type="smallint", options={"unsigned":true})`
- クラス変数を修正
    - 例: `private $sort_no;`
    - キャメルケースではなくスネークケースなので注意
- getter / setter の修正
    - 例: `getSortNo` / `setSortNo`
    - ドキュメンテーションコメントや引数も合わせて修正しましょう。
    - 呼び出している側も修正が必要です。
        - IDEのリファクタリングを活用出来ればよかったんですが、今回は対象テーブルが多かったので `getRank` / `setRank` で横断検索して置換をしました。

### Repository
- createQueryBuilderの修正
    - 例: `$qb = $this->createQueryBuilder('cn')->orderBy('cn.sort_no', 'DESC');`
    - 文字列リテラルで指定されています。スネークケースで置換しましょう。
- 変数の修正
    - 例: `$sortNo`

### import_csv
EC-CUBEのインストール時にインポートされるデータです。
`src/Eccube/Resource/doctrine/import_csv/`のディレクトリにあります。

- 1行目がカラム名になっているので修正
- `src/Eccube/Resource/doctrine/import_csv/dtb_csv.csv` の `field_name` のカラムの修正
    - CSVで吐き出されるカラムの場合は確認が必要

### Controller / Service / FormType / Twig
- こちらでも識別子として使用されている個所が多々ありました。
    - 大文字/小文字/コメント/コード/文字列リテラルを区別して検索/置換していきました。

### EC-CUBEのインストーラーまわり
初期データ作成処理で修正が必要な個所がありました。
インストールは画面からのインストールとコマンドでのインストールで処理が別々になっていますのでどちらもチェックが必要です。

- eccube_install.php
- src/Eccube/Controller/Install/InstallController.php

### Test
- 検索/置換とテストを走らせてみてこけたところの修正が必要です。

上記に上げた修正だけで網羅できるということではないのでその他の個所も検索等を使って確認をお願いします。

## 最後に
EC-CUBEのカラム名変更をする機会は少ないかと思いますが、カラム名を変更されえる方がおられましたら参考にしていただけると嬉しいです。
Redmineで特定のプロジェクト名・バージョン名から残工数を算出するSQL

です。
動作環境:redmine-3.3.3-1

本当はバーンダウンチャートを実現したかったんですが、
下手にプラグイン入れて壊れるのが怖ったので…。

スキーマはbitnami_redmine前提です。

```sql:残工数算出SQL
select
  sum(estimated_hours * (100 - done_ratio) / 100) as '残工数(h)' 
from
  bitnami_redmine.issues i 
  left join bitnami_redmine.projects p 
    on i.project_id = p.id 
  left join bitnami_redmine.versions v 
    on p.id = v.project_id 
    and i.fixed_version_id = v.id 
where
  p.name = 'プロジェクト名' 
  and v.name = 'バージョン名'
```
githubにpushできない

色々本読んでやっていたが、うまくいかない。

途中でわけわからなくなり、新しい本を買ってその方法を試す。

また途中でわけわからなくなり、別の方法を始めから試す

別の方法をwebページで探す。


そんなこんなをやっていて、わけわからなくなってきた。


結局、二台のパソコンでpushできるようにやっており、認証用の鍵をつくったのはいいが、パソコンの数だけ認証キーを登録しないといけないのに


違うパソコンで登録したパソコンで必死につなごうとしていた。
もっかい、パソコンごとに鍵を登録すると無事pushできた。



鍵の登録の仕方など
https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/
ransackを使って検索機能と複数ワードのAND検索の実装

# gemのransackを使って、検索機能の簡単実装
#前提条件
Ruby 2.3.0
Ruby on Rails 5.1.1

> 参考にしたサイト
https://qiita.com/LuckOfWise/items/e020e896e71d47d0c6a4

まずはransackのgemをインストール
Gemfileに以下を追加。

```
gem 'ransack'
```
で

```
bundle install
```
これでransackのgemが使えるようになりました。
まずコントローラのインスタンス変数に検索したいオブジェクトをransackメソッドを使い代入し、
それをresultメソッドで受け取ったものをインスタンス変数に代入する。

***app/controllers/blogs_controller***

```
def index
  @keyword = Blog.ransack(params[:q]) #:q(query)は検索窓に入力された値をパラメータで取得
  @blogs = @keyword.result
end
```

お次は、viewで検索窓を作成する。一般的だとfor_tag使用して書くらしいが、
ransackでは、すでに用意されたsearc_form_forというビルドツールが使えます。

***views/blogs/index.html.erb****

```
<%= search_form_for(@keyword, method: :get) do } |f| %>
  <%= f.label :title_cont_any %><br>
  <%= f.submit '検索する' %>
<% end %>
```
カラムの後の`_cont_any`の説明はここへ
https://qiita.com/nysalor/items/9a95d91f2b97a08b96b0
検索をかけるワードへの条件のようです。これransackの最低限のことはできます。

# 複数ワードのAND検索
上記のままだと検索窓に"代々木　カフェ","築地　海鮮丼"のようなスペースを使用したand検索ができません。
原因はparameterで受け取った値が`{"title_cont_any"=>["代々木 カフェ"]}`のままでしたので、２つの単語に別けた配列にしたいです。理想→`["代々木","カフェ"]`

***app/controllers/blogs_controller***

```
  def index
    if params[:q] != nil
      params[:q]['title_cont_any'] = params[:q]['title_cont_any'].split(/[\p{blank}\s]+/)
      @keyword = Blog.ransack(params[:q])
      @blogs = @keyword.result
    else
      @keyword = Blog.ransack(params[:q])
      @blogs = @keyword.result #検索の結果を受け取る。
    end
  end
```
何も検索をかけてない状態（初期状態）ですと、paramsにnilが返ってきていたので、splitメソッドがnilclassのエラーを起こしていたので、条件分岐しました。
参考：https://qiita.com/EastResident/items/54047e6e85dda0418dad
特にリモートでMatplotlibでグラフを描いて保存する際のトラブル予防策

# リモート環境で`matplotlib.pyplot.plot`を実行
`DISPLAY`変数がないリモート環境で`matplotlib.pyplot.plot`を実行しようとすると

```
RuntimeError: Invalid DISPLAY variable
```

のような例外が出てしまいます。次の2パターンのいずれかで対策できます。

```py3
import matplotlib
import os

if "DISPLAY" is not in os.environ:
  matplotlib.use("Agg")

from matplotlib import pyplot
```

以上の方法がよく採用されますが、`isort`などパッケージのソート順をいじるツールなどと相性が悪いです。次のように書けば、追加の記載なしで`isort`などが問題なく使えます。ただし、程度の多少はわかりませんが、オーバーヘッドはあります。

```py3
from matplotlib import pyplot
import os

if "DISPLAY" is not in os.environ:
  pyplot.switch_backend("Agg")
```

# 図を複数保存
図を複数保存する際にもトラップがあります。次の`pyplot.close()`を書かないと2つ目以降のグラフが以前`plot`したグラフの上に書かれてしまいます。**`savefig`は`show`と違ってキャンバスを消してくれません。+**忘れないようにしましょう。

```py3
windows = (scipy.signal.hamming, scipy.signal.hann, scipy.signal.blackman)
for window in windows():
  pyplot.plot(window(256))
  pyplot.savefig(window.__name__ + ".svgz")
  pyplot.close()
```
phpUnitの便利メモ：　コマンドラインで実行するとき便利なオプション紹介

## あるディレクトリー内のすべてのテストを実行させたい時

該当ディレクトリーのファイル名をすべて「～Test.php」になるように変更するのもできますが、既存の物が多いと面倒ですね。
別の方法として、自分で決めた末尾をphpUnitの設定に書く方法。
でも、これもあんまりやりたくない場合があります。
その時は、[--test-suffix]の設定を使います。実行コマンドに以下のような記述を足すだけで、指定のディレクトリー内にある、ファイル名が「.php」で終わっているすべてのファイルが実行されるようになります。

```
--test-suffix=.php
```

## 時間がかかるテストを素早く止めたい時

ケースの数が多く、時間がかかるテストがある場合、途中の失敗を早く確認したいときがあると思います。
とはいえ、毎回それで設定ファイルを触りたくないですし・・・

### 失敗したら、実行を止めたい時

```
--stop-on-failure
```
を付けます。
さらにデバッグ情報を出した状態にすると見やすいので、私はよく

```
--stop-on-failure --debug
```

という組み合わせを使います。このオプションは「失敗またはエラーで停止」をしてくれるので、下に書いた、エラーで停止を組み合わせる必要はないです。

### エラーがでたら、実行を止めたい時

上の記述と似ています。エラーの場合、最後まで待ちたくない時は

```
--stop-on-error
```

か

```
--stop-on-error --debug
```

で止まってくれます。

## phpの設定値を実行するときだけ書き換えたい時

ローカルのphp.iniを毎回触るのは面倒だし、場合（環境）によってできない時だって、あります。
しかし、それでも大きなデータを扱うテストしたかったり、色々とありますよね・・・
phpunitのコメントに、php.iniの設定値を実行中にだけ、上書きできるオプションがあります。

例えば、メモリを大きく、と：

```
 -d memory_limit=128M
```

とコメントに足せばOKです。

これももちろん、他のオプションと組み合わせることができます。

```
 -d memory_limit=128M --debug --test-suffix=.php
```

とかにして、一気にデバッグ情報を確認しながら、ディレクトリー内のテストを全部実行してしまいましょう。多い場合時間がかかりかもしれませんが、その間は、コーヒーでも飲んでしまえば、いいんです。＾＾
BitnamiのMattermost on 無料枠のGCE


GitLabは無料枠では不可能なので，Bitnamiのmattermostを簡単に無料枠のGoogle Compute Engine (GCE)で動かしてみたので備忘録として記事にしました．
#BitnamiのMattermostの起動
1. GCEの検索窓からmattermostと検索すると，Mattermost Team Edition Certified by Bitnamiがサジェストされるのでそれをクリックします．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213482/95ec4f37-e937-a07b-68fa-097d9f85800d.png)
 
2.Compute Engine上で起動をクリック．
<img width="812" alt="スクリーンショット 2017-12-15 15.14.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/213482/a2fc3155-6953-44d6-b408-0807d96ce4a8.png">

3. Zoneをus...，Machine typeをmicro，Boot disk type in GBを30，Allow HTTP traficとAllow HTTPS traficにチェックを入れるという以下のような設定でデプロイをクリックします．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213482/9dedd141-6dd7-6548-4dc1-2eb1d23802ee.png)

#外部IPの設定
１．　GCEのVMインスタンスのページから先程作成したmattermost-2-mvをクリック．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213482/76ec246f-1aef-277f-7a4c-e27fca98217b.png)

2.　編集をクリックする．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213482/5d133204-6b1a-734e-8e56-e542b868ac83.png)

3.　ネットワークインターフェースのペンマーククリック．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213482/25d6730c-f13f-0c8d-8357-8e5ffb03a350.png)

4.　外部IPをクリックし，　固定のIPアドレスを作成し，設定します．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213482/3afe719f-c966-d8f5-18f2-314ebbdf76f2.png)
5. [Freenom](http://www.freenom.com/ja/index.html)でドメインを取得する．IPアドレスはGCEで取得した外部IPアドレスに設定します．

これによって，mattermostをhttps://（5で取得したドメイン）でmattermostにアクセスできます．
管理者名とそのパスワードはGCPのDevelop managerに書いてあります．

#メールの設定
　メールは普通のポート(25,465,587)は閉じられていますので，[SendGridを用いた手法](https://cloud.google.com/compute/docs/tutorials/sending-mail/using-sendgrid?hl=ja)を用い，Mattermostのシステムコンソールからsmtpサーバ等を同様に設定すればよい．

#letsencryptによるSSL通信
[ここのように](hhttps://qiita.com/fumi1/items/17a7ecac422a06b1dc11)certbotをインストールし，証明書を発行する．Nginxの設定ファイル/opt/bitnami/nginx/vhosts/mattermost.confの ssl_certificateを/etc/letsencrypt/live/(取得したドメイン名)/fullchain.pemに
   ssl_certificate_keyを/etc/letsencrypt/live/(取得したドメイン名)/privkey.pemに書き換えて，sudo /opt/bitnami/ctlscript.sh restartを実行すればよい．
Gradleから指定したProcessing3.3.6で動かなかったP3Dを動かす話

# 環境
- Kotlin 1.2.0
- Processing 3.3.6
- Gradle

# なんでP3D動かんの
KotlinからProcessingを動かそうとしたときに、なぜかP3Dだけ動かなくなりました。

```main.kt
fun main(args: Array<String>) :Unit=fuga().run(args)

class fuga:PApplet(){
    override fun settings(){
        size(600,600, PConstants.P3D)
    }
    override fun setup(){

    }
    override fun draw(){

    }
    fun run(args:Array<String>):Unit=PApplet.main("fuga")
}
```
size命令の引数にP3Dを書き足すだけでもう動かない。

ほげー。

こんなエラーが出てました。

```
Caused by: com.jogamp.opengl.GLException: Profile [なんかOpenGLのバージョンがいくつも並んでる] is not available on WindowsGraphicsDevice[type .windows, connection decon, unitID 0, handle 0x0, owner false, NullToolkitLock[obj よく分からない16進数]]
```

# エラーについて二日かけて調べる
調べても全く意味が分からないのでここで二日くらい費やしたのですが、ヘトヘトになったところで似たようなStack Overflowを発見しました。

https://stackoverflow.com/questions/45766632/com-jogamp-opengl-glexception-profile-gl-default-is-not-available-on-windowsgra


`MinusJTK` って書いてある。

僕は英語が読めないので、内容が分からずもはや投げやりでここに書かれたライブラリをbuild.gradleに書き足すことにしました。
（.jarファイルをダウンロードしてきてもできるかもしれない。）

```
dependencies {
    //この上に他のライブラリがいろいろ書かれている
    compile 'edu.mines.jtk:edu-mines-jtk:1.1.0'
}
```

なぜか動いた。
なんで？
というかbuild.gradleからこれ消しても動くようになったのでエラー文を再現できない。
なんで？？？？？

# このライブラリ一体なんだろう
https://github.com/MinesJTK/jtk
>The Mines Java Toolkit (Mines JTK) is a set of Java packages and native (non-Java) software libraries for science and engineering. Applications currently include digital signal processing, linear algebra, optimization, meshing, interpolation, and 2D and 3D graphics.

Google翻訳先生カモン
>Mines Java Toolkit（Mines JTK）は、Javaパッケージと、科学技術用のネイティブ（非Java）ソフトウェアライブラリのセットです。 アプリケーションには現在、デジタル信号処理、線形代数、最適化、メッシュ、補間、2Dおよび3Dグラフィックスが含まれます。

3DグラフィックスのプラグインはProcessingに含まれているはずなのになんで動かなかったんだ……？？？？？

# 信用できない非常に雑な考察
もしかしたら、このMinusJTKが必要だったわけではなく、この中に入っているJOGLの最新バージョンが必要だったのかもしれない。
MinusJTKが入ることによってJOGLのバージョンが上がって、P3Dが動くようになった？？？？？？？
非常に雑な考察なので誰も信用しないでください。

# 終わり

というわけで僕はこのライブラリの解説およびなぜ動くようになったのかの理由を募集しています。
同じ問題で困っている人は一回試してみると良いかもしれません。


# 追記

Processingにこんなissueが立てられてました。
https://github.com/processing/processing/issues/5350
全く同じエラーだ！！！！！
GradleからProcessing 3.3.6を選択するとjogl-all-nativesのjarファイルが指定されていないことで起きていたエラーだそうです。
というわけで、次のバージョンでは修正されていると思われます！
安心！
How to use SQL Builder on Object Browser Oracle 13.1

### OB for Oracle Ver13.1

 Since the version 13.1, SQL Builder feature has gone :exclamation: :anger: 
 Here is how to enable SQL Builder ...


### Windows Registry

```
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\SystemIntegrator\OB13]
"ShowSqlBuilder"=dword:00000001
```

![2017-12-15_163216.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/29457b64-41a2-eb13-7cc6-7e49377ac584.jpeg)
![2017-12-15_163302.jpg](https://qiita-image-store.s3.amazonaws.com/0/114634/b071ae02-752d-ab84-63fb-42ea4ec69813.jpeg)



cf.Oracle 消えたSQLビルダ･･･その復活の呪文
https://products.sint.co.jp/siob/blog/revival-spell-sql-builder
ROOTの導入

#ROOTについて
みなさん、ROOTを使ってますか？
わたしが所属する信大工学部ではほとんどの人がROOTを権限のほうだと勘違いしていました（そりゃROOTなんてみんな使っていると言いますよね。。。）
**今回取り上げるのは解析・描画ツールのROOTです**

まずROOTというソフトウェアの紹介から。
ROOTの制作者は**[CERN](https://home.cern/)**です
CERNでは素粒子物理学を行っている世界規模の実験団体なのは半分くらいの人が知っていると思います

ROOTとほかの解析ソフトの違いをまとめると
・C++/Pythonのプログラムへの組み込みが可能
・フィッティングなどのライブラリが豊富
が主な特徴になります

![gr1.jpg](https://qiita-image-store.s3.amazonaws.com/0/150236/1fcdcfff-8e64-f3c9-bd5a-90366130783a.jpeg)
もちろん、ほとんどの人がGnuplotで済ませているような、こんな感じのグラフの作成もできます(画像はGoogle先生より)

残念な点を挙げるとするなら、Pythonへの組み込みで**Python3にはまだ対応してないところ**ですね
（まだまだ若いPythonがPython2に囚われているのがかわいそうです。早くPython3への対応してください。。。）

では、導入してみましょう

#ROOTの導入（本題）
自分の環境ではcmakeのバージョンで怒られたので、camke(3.9)への更新を行いました
cmakeを適当なところから持ってきて
```./bootstrap
 make
 make instal```
でインストールできるはずです

ここからROOTのインストールです
```cd ~ #(どこでもいいですが明示的に書いてます)
 curl 
 https://root.cern.ch/download/root_v6.10.08.source.tar.gz
 cd hoge #{展開したいディレクトリ}
 sudo tar zxvf ~/root_v6.10.08.source.tar.gz
 cd root-6.10.08
 ./configure
```
あとは展開したディレクトリにPATHを通せばokです

#まとめ
あとはやりたいことをやってみてください
という投げやりになってしまうのが解析ソフトの導入回の悪いところなのでこんな感じのことができるよってサイト(pdf)を紹介
[ROOT指南書](http://cycgw1.cyric.tohoku.ac.jp/~kawamura/storage/necoroot.pdf)
[PyROOT](https://www-zeuthen.desy.de/~middell/public/pyroot/pyroot.html)
(Pythonへの組み込みについてのサイト)

卒論や会議と被ってしまい少々焦っているので誤字脱字主語述語の対応が取れてないurlのコピーミスとかはコメントください
落ち着いたら訂正します(大学卒業後…？)