OmniAICreator/Qiita-1.07M huggingface dataset:
Metabaseを社内環境に作成する

最近なにかと話題になっているMetabase. 
BI始めてみたいという場合に、手っ取り早く無料で作れるのは魅力だなと、、、ということで、社内の環境に立ててみたのでそれをメモ

環境はHyper-V上に Ubuntu 10.04.3 を使ってみました
OSのセットアップは適当にやってください

1. まずはプロキシ
まずは、社内環境でプロキシがいるのでターミナルを開いて情報をセット
export http_proxy="http://[Proxy-Host]:[Port]"
export http_proxy="http://[Proxy-Host]:[Port]"

と思ったが、うまくできなかったのでGUIで設定
https://qiita.com/aoi70/items/aa65514595a82cf303e5


2. Metabaseのjarを持ってくる
環境構築の方法はDockerを使ったりいろいろなやり方があるのですが、とりあえずシンプルにjarを持ってきてやる
適当にフォルダは切っておいてください
wget http://downloads.metabase.com/v0.27.2/metabase.jar

jarを動かすのに必要なパッケージをインストールします。
とりあえずこれ入れれば動きました
sudo apt-get install default-jre gcj-5-jre-headless openjdk-8-jre-headless gcj-4.8-jre-headless gcj-4.9-jre-headless openjdk-9-jre-headless

3. Metabaseを起動する
jarを実行する
java -jar /opt/metabase/metabase.jar &

起動にはそこそこ時間がかかる（数分）

4. アクセスする
ブラウザを立ち上げてアクセスしてみます
http://localhost:3000

するとなにやらどこをクリックしてもよくわからず待たされる画面が出てきます
（裏で何か起動しているんでしょうか）
辛抱強くまってログインの出てくるまで待ちましょう
こんなログイン画面が出てきます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/7f0fad2e-101d-20d0-bf18-7556ff494e2f.png)

とりあえずここまで
Rustで関数のオーバーロード


Rustには関数のオーバーロード機能はありませんが、それっぽい事をしたい場合、以下のようにすれば出来ます。
※もっと良い方法があったら、教えてください！

```Rust
trait DoSomething<T> {
    fn do_something(&mut self, c:T);
}

struct DoSomethingImpl {
}

impl DoSomething<i32> for DoSomethingImpl {
    fn do_something(&mut self, c:i32) {
        println!("i32");    
    }
}
impl DoSomething<f32> for DoSomethingImpl {
    fn do_something(&mut self, c:f32) {
        println!("f32");
    }
}

fn main() {
    let mut d = DoSomethingImpl{};

    //引数の型によって自動的に呼ばれる関数が変わる
    DoSomething::do_something(&mut d, 10i32);    //i32
    DoSomething::do_something(&mut d, 1.5f32);    //f32
}
```
https://repl.it/@mas_yo/function-overloading
DataGripでmod_spatialiteを使う

JetBrains謹製のデータベースIDE、DataGripを使い始めてみました。
Windows環境下でmod_spatialiteを利用できるようにするのに手こずったのでメモしておきます。

## 要はパスを通すだけなんですけど…^^;
mod_spatialite.dll（Windowsの場合）他一式の格納パスを通しておけばいいのですが、IDEの設定がなかなかわからず時間を費やしてしまった。。

1. `File` -> `Data Sources`
2. ドライバ一覧から`Sqlite`を選択
3. `Advanced`タブから`VM environment`（右の`…`から設定）
4. `Path`に`mod_spatialite.dll`の格納ディレクトリを追加

![image.png](https://qiita-image-store.s3.amazonaws.com/0/101923/ff234ed5-47dc-e015-e01f-151fa5a189ea.png)

あとは、`load_extension`で読み込むことができます。

```sqlite3
SELECT load_extension('mod_spatialite');
SELECT spatialite_version();
```

（結果）

|"spatialite_version()"|
|:-:|
|4.4.0-RC0|

めでたしめでたし。

### ちなみに
「`load_extension()`にフルパスを指定すればいいよ」てな記述もあるのですが、、いろいろ試してみたけれど、どうもうまくいきません。Windowsのパス表記だと無効なのかもしれません。
Vue.jsを使って高校情報のDB単元の教材を作った

# はじめに
　今回は高校情報の情報の科学の教科書に記載されているDB単元のDBの機能について教える教材を作った。
　GitHub pagesにあげているのでぜひ動かして使ってみてほしい。またソースコードも全てGitHubで公開している。
#### [データベース単元の教材リンク](https://hikaru7719.github.io/books-db/dist/index.html)

#### [GitHub](https://github.com/hikaru7719/books-db)

<img width="1210" alt="スクリーンショット 2018-01-12 14.13.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/136442/df5b9f96-9dbf-9f76-80c7-537f7330f260.png">

#開発環境
Node.js         v8.2.1
npm             5.6.0
Vue.js          2.9.2
Foundation(CSS) 6.4.3

#機能
　雛形の作成にはvue-cliを用いた。
　教材はDBの機能について学習できるものとなっている。
本教材では本テーブルと著者テーブルを用いて学習を行う。
具体的に学習できるDBの機能は

* 選択（whereを使った条件指定のSelect文）
* 射影（カラム指定のSelec文）
* 結合（Inner　Joinを用いたテーブル結合）
* 
これ以外の他にテーブルにレコードを挿入することができる。

## レコードの挿入

1. 画面メニューのAdd Columunをクリック。
2. ISBN、タイトル、著者、出版年、出版社、ジャンルを入力し、add bookをクリック。
3. レコードが追加される。
![add_column.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136442/5dc19a89-0ca5-26da-2515-1f20208dfc70.gif)

## 選択
1. 画面メニューのSelectionをクリック。
2. ISBN,author,genre　の欄に条件を入力する。
3. 条件に合う検索結果が表示される。

![selection.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136442/9a1b8498-69aa-4bd5-a68b-456a2c788283.gif)

## 射影
1. 画面メニューのProjectionをクリック。
2. 表示したいカラムのチェックを入れる。
3. 検索結果が表示される

![projection.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136442/66c656bb-aaf1-b658-57f1-0c12e6cc6472.gif)

## 結合
1. 画面メニューのJoinをクリック。
2. スイッチボタンを押す。
3. 結果が表示される。

![join.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/136442/bf02a4c7-c694-9772-8853-1b3eb5361285.gif)

# 使ったVue.jsの機能
* {{data}}
* v-if
* v-for
* v-bind
* v-on
* methods,watach関数
* vue-router
* コンポーネント間の値の受け渡し(props)、親要素の関数呼び出し（emit）

# おわりに
今回はVue.jsを使って高校情報のDB単元の教材を作った。
vue-cliを使うことで非常に開発がしやすかったし、何かアプリケーションを作ることによってVue.jsの理解も深まったので非常に良かった。

# 参考文献
* [Vue.js公式リファレンス](https://jp.vuejs.org/index.html)
CSSでボタンを真ん中に持ってくるには？

CSSでボタンを真ん中に持ってくるには、このように

<div></div>で囲ってあげないと効かない。


```html

            <div class="submit">
                <input type="submit" value="送信する" class="submit-botton">
           
```

```html
<div>
```
で囲わずに

```html
<input type="submit" value="送信する" class="submit-botton">
```
だけでやろうとしてもできないので、必ず

```html
<div>
```
で囲ってあげる。
DataBindingでカスタムセッターに定数を指定する場合にattributeがnot foundになる場合の対処

カスタムセッターで以下みたいなセッターを作り、param2をXML側で定数にしようとした時にハマった。

``` kotlin
@BindingAdapter("app:param1", "app:param2")
@JvmStatic
fun setParam(view: View, param1: Int?, param2: Int?) {
  // いい感じにモニョモニョする
}
```

xmlで指定する場合は `app:param2="123"` みたいないつも通りなやり方じゃなくて
ちゃんとデータバインディングのお作法の `app:param2="@{123}"` と指定する必要がある
WebページのHTMLと読み込まれているCSS,JSをwgetでぶっこぬく

# WebページのHTMLと読み込まれているCSS,JSをwgetでぶっこぬく

クライアント「ここのページのここをちょっとこう修正したときの見た目を確認したいんだけど、簡単に見せてもらえない？」
僕「わかりました」
僕（これくらいの修正ならカンプ作るよりHTML修正しちゃったほうが早いな・・・）
　（ここのページのソース一式もらってない・・・）
　（わざわざ連絡してソース一式送ってもらうのもあれやな・・・）
 
 というときに使えるのがwgetです。
 以下のコマンドをたたくと、カレントディレクトリに対象ページのソースがババっとダウンロードされます。

 ```bash
 wget -p   http://hogehoge.com
 ```
 
### 便利なオプション
* -p HTMLから読み込まれるCSSやJS、画像を一緒にダウンロードする
* -k HTMLのリンクをローカルを指すよう書き換える

ベーシック認証がある場合は以下のようにユーザ名とパスワードを明記します。

 ```bash
 wget -p --user=username --password=password  http://hogehoge.com
 ```
 
 Linuxコマンドなので、Windowで利用する場合はBash on Ubuntu on Windowsで実行するのが良いです。
 参考：[Windows Subsystem for Linuxをインストールしてみよう！ - Qiita](https://qiita.com/Aruneko/items/c79810b0b015bebf30bb "Windows Subsystem for Linuxをインストールしてみよう！ - Qiita")
LaTeX Beamerの"Beamerらしく"ないおすすめテーマ集

BeamerとはLaTeXでプレゼンテーション用のスライドを作成するためのパッケージである。[このように](https://hartwork.org/beamer-theme-matrix/)数多くのテーマが存在するが、大抵はどれも同じような見た目で、Beamerで作ったことがすぐにわかってしまう。https://github.com/martinbjeldbak/ultimate-beamer-theme-list にも様々なテーマが公開されているが、数が多すぎたり特定の大学向けのものが多く、なかなか使いづらい。
そこであまり"Beamerらしく"ないテーマで誰でも使いやすいものを集めて紹介したいと思う。

見つけ次第追加する予定なので他にあれば教えてください。あと全てを使ってみたわけではないので、日本語でうまく動かない可能性もありますが悪しからず。

# Metropolis

https://github.com/matze/mtheme

これは一番使いやすいと思う。言われなければBeamerだとは全くわからないだろう。TeX Liveにも含まれているのでインストールが不要なのもありがたい。[ドキュメント](http://ftp.jaist.ac.jp/pub/CTAN/macros/latex/contrib/beamer-contrib/themes/metropolis/doc/metropolistheme.pdf)がしっかりしているのでカスタマイズがしやすい点もGood。

# Execushares

https://github.com/FuzzyWuzzie/Beamer-Theme-Execushares

"A minimalist and modern Beamer theme." とのこと。赤が基調でインパクトがある。Beamer感ゼロでおしゃれ。

# nkly/beamer-modern

https://github.com/nkly/beamer-modern

その名の通りモダンなデザイン。こちらも使いやすそう。

# Irubataru/beamer-themes

https://github.com/Irubataru/beamer-themes

[コメント](https://qiita.com/htlsne/items/70cbb488e7a87cd9e228#comment-bff02950947adcbff910)で教えていただきました。
モダンでおしゃれなテーマが4つあり、どれも非常に使いやすそう。

# Focus

https://github.com/elauksap/focus-beamertheme

こちらもシンプルなテーマ。READMEがある程度しっかりしており、色やfootlineはカスタマイズできるらしい。

# Pure Minimalistic

https://github.com/kai-tub/latex-beamer-pure-minimalistic

黒が基調のとてもシンプルなテーマ。READMEにある通り、色やロゴなどはカスタマイズ可能な模様。

# Auriga

https://github.com/anishathalye/auriga

白が基調のとてもシンプルなテーマ。

# BredeleDiapo

https://git.framasoft.org/Framatophe/BredeleDiapo

フランス語だがまあまあ良い感じ。

# simple

https://github.com/famuvie/beamerthemesimple

その名の通りシンプルなテーマ。

# bjeldbak

https://github.com/martinbjeldbak/beamertheme-bjeldbak

こちらもシンプル。

# aecio/beamer-theme

https://github.com/aecio/beamer-theme

シンプル。

# kmbeamer

https://github.com/kmaed/kmbeamer

Blackboard, DarkConsole, Notebookという3種類のテーマがある。なかなか面白い。

# s4ndm4n

https://github.com/ruempel/beamer-s4ndm4n

ダークでかっこいい。

# Beamerports

https://bitbucket.org/marczellm/beamerports/overview

PowerPointのテーマのBeamerへの移植が5種類ほど。

# Keynote風

http://www.shawnlankton.com/2008/02/beamer-and-latex-with-keynote-theme/

AppleのKeynoteっぽいアレ。
Google Apps Scriptの新しい3つの機能 その② Apps Script API

この記事は2018/1/11にGoogle Apps Scriptに新しく追加された3機能の紹介記事の2番目です。
https://gsuite-developers.googleblog.com/2018/01/three-new-tools-to-help-improve-your.html?m=1

# 新機能

1. [Dashboard](https://qiita.com/soundTricker/items/59979d0bb065fdd8d536)
2. `Apps Script API` (この記事)
3. [CLI Tool clasp](https://qiita.com/soundTricker/items/354a993e354016945e44)

一つ一つが結構しっかりした機能なので記事を分けて説明したいと思います。
今回は2つめのGoogle Apps Script APIです。

# 新しいApps Script API

今までもGASには2つのAPIがありました。

1. Import/Export API
2. Execution API

しかし1.のImport/Export APIはGoogle Drive APIを無理やり拡張したもので、
基本的にはコードのダウンロードと、アップロードのみを担当するAPIでした。

Execution APIは昔紹介させていただいたものです。

今回新たに作成されたApps Script APIは今まであったExecution APIを再作成・拡張し、
更に管理に必要な新機能群を追加したRestful APIです。

主に以下の機能があります。

* 新規GASプロジェクトの作成・修正
    * なんとContainer Bound Scriptにも追加できます。やばい。
* Web AppsやAdd-ons、executables(execution apiで実行可能なGAS)のデプロイ
* 監視API
* GASの実行

ほぼ進化のレベルです。

## やれること

一覧で見ると以下です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/a7d49364-4e3c-365d-c3ae-b156724d6a89.png)


## 使い方

真面目に書こうか悩んだのですが、多分↓を見るのが一番早いです。

https://developers.google.com/apps-script/api/quickstart/js

簡単に言うと
1. クラウドプロジェクトでApps Script APIをONに
2. OAuth周りの設定
3. 実行

です。

コードとか設定を書かずに試したい方は、API Explorerから試すといいと思います。
https://developers.google.com/apis-explorer/#search/apps%20script/script/v1/

# まとめ

APIが出来たことにより、やれることが一気に増えました。
でも大体の人が考えるのは、「これでローカルでの開発が捗る。 でもツールが必要...」ってことだと思います。
Googleさんは抜け目がありません。 新たにこのAPI群を利用したCLIツール`clasp`が登場しました。

次の記事 → [clasp](https://qiita.com/soundTricker/items/354a993e354016945e44)
順序ロジステック　平行線検定

Rで順序ロジステック回帰をやったときの平行線検定（複数の式の偏回帰係数が等しいかどうかの検定）のやり方がわからなかったが、Rのbrant パッケージのbrant関数で出来るようだ。
以下サンプルコード

```
library(brant)
library(MASS)

data(survey)
smoke_data <- survey 
smoke_data$Smoke <- ordered(smoke_data$Smoke,levels=c("Never","Occas","Regul","Heavy"))


model1 <- MASS::polr(Smoke ~ Sex + Height, data=smoke_data, Hess=TRUE)
summary(model1)

# 平行線検定
brant(model1)



```
VSCodeで困ったこと二つ

VSCodeを使っていて困ったことが二つありました。

**1.タブを開いても上書きされてしまって複数タブでひらけない**
***2.⌘ + option + ↑ or ↓* でカーソルを追加してインデントを変えようとすると空白行が詰まる**

どちらもしょぼい問題で申し訳ないですが僕はこの二つでずっとイライラしていました笑

**まず1.の解決方法から**

これは結構単純で解決方法は二つあります。

・ファイルをダブルクリックして開く（開いてるタブのタイトルをダブルクリックする）
・開いておきたいタブ内で *⌘ + K* を押した後に *Enter* でタブを固定

設定を変えればデフォルトで固定されると思いますが、それはそれでタブを開きすぎた後に不要なタブを閉じる作業が伴うので上の二つが良いかなという感じです。

そして**2.の解決方法**

あまり頻度の高くない問題かもしれませんが僕はここ最近テンプレートエンジンのPugを使うことがあって、そこでインデントを厳密にしなければエラーが出てしまうので、複数行のインデントを一斉にずらしたいときにこの問題でイライラしてました。

文字だけだとわかりづらいかもしれないので画像を貼っておきます。

<img width="345" alt="スクリーンショット 2018-01-12 12.06.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/198264/910aa92f-b807-0563-c4fc-f70fa1d7fbfc.png">

まず対象範囲のカーソルを増やします。空白行はスペース等が入ってないのでもちろん行頭にカーソルができます。

<img width="359" alt="スクリーンショット 2018-01-12 12.06.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/198264/c018d83d-7fbe-813c-d402-f100057da03a.png">

そこで詰めるとこうなってしまうので、

<img width="354" alt="スクリーンショット 2018-01-12 12.08.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/198264/19718cd4-8634-7e4a-ccce-8ac9310e6312.png">

ドラッグで対象範囲を選択して（全体の場合は *⌘ + A* で全選択）

<img width="326" alt="スクリーンショット 2018-01-12 12.09.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/198264/4cf8f267-68e3-e8a3-9307-bdcb08e1f425.png">

*⌘ + [*　で左に1つ詰めることができます（右にズラす場合は]を）
Goで文字列の置き換えをする(strings packageのReplace)

# Goで文字列の置き換えをする(strings packageのReplace)
Goで文字列の置き換えをする際には、[strings.Replace](https://golang.org/pkg/strings/#Replace) を使用する。

## 使い方 
置き換える全体の文字列、置き換え前の部分文字列、置き換え後の部分文字列、置き換えを行う部分文字列の数を指定して置き換えを行う。

関数のシグネチャは以下
`func Replace(s, old, new string, n int) string`
引用元: [strings - The Go Programming Language](https://golang.org/pkg/strings/#Replace)

第1引数:置き換えされる全体の文字列
第2引数:第1引数の全体の文字列の中で、置き換えされる部分文字列
第3引数:第2引数を置き換え後の部分文字列
第4引数:置き換えを行う部分文字列の数

なお、第4引数を-1にすると第1引数内の全ての第2引数で指定した部分文字列を第3引数で指定した部分文字列に置き換える。



##　実際に使ってみた

### コード

```go
package main

import (
	"fmt"
	"strings"
)

func main() {
	str := "Go Java JavaScript Typescript CofeeScript"
	// 普通に表示
	fmt.Printf("str : %s\n", str)

	// 最初の"Java"という文字列だけ置き換え
	replaced1 := strings.Replace(str, "Java", "Replaced", 1)
	fmt.Printf("replaced1 : %s\n", replaced1)

	// 全部のJavaを置き換え
	replaced2 := strings.Replace(str, "Java", "Replaced", -1)
	fmt.Printf("replaced2 : %s\n", replaced2)

	// 全部のScriptを置き換え
	// Typescriptの"script"は小文字のため、変更されない
	replaced3 := strings.Replace(str, "Script", "Replaced", -1)
	fmt.Printf("replaced3 : %s\n", replaced3)

}

```

### 実行結果

```
str : Go Java JavaScript Typescript CofeeScript
replaced1 : Go Replaced JavaScript Typescript CofeeScript
replaced2 : Go Replaced ReplacedScript Typescript CofeeScript
replaced3 : Go Java JavaReplaced Typescript CofeeReplaced
```

### 参考にさせていただいたサイト
[strings - The Go Programming Language](https://golang.org/pkg/strings/#Replace)
Google Apps Scriptの新しい3つの機能 その① Dashboard

最近はGASの記事をあんまり書いてない大橋です。

2018/1/11にGoogle Apps Scriptに新しい3つの機能が追加されました。
https://gsuite-developers.googleblog.com/2018/01/three-new-tools-to-help-improve-your.html?m=1
もうこの機能が、歴戦のGAS Userたちにとって素晴らしいものばかりで、ぜひ紹介したいと思います。


# 新機能

1. Dashboard (この記事です)
2. [Apps Script API](https://qiita.com/soundTricker/items/13719acd2628ed87894c)
3. [CLI Tool clasp](https://qiita.com/soundTricker/items/354a993e354016945e44)

一つ一つが結構しっかりした機能なので記事を分けて説明したいと思います。
まずは1つめのDashboardから


# 新しいGoogle App Script Dashbaord

https://developers.google.com/apps-script/guides/dashboard

Google Apps Scriptの作成者・管理者向けに新しいApps Script Dashboardが作成されました。
https://script.google.com
※アクセスしてもScript Editorに飛ぶ方は、incognito modeとかだとうまくいきます。 それかブラウザのキャッシュ全部消す必要があるかも

![dashbaord.png](https://qiita-image-store.s3.amazonaws.com/0/2965/c82320a1-70ea-5682-14ae-ae6b589de6cd.png)

新しいDashboardでは主に以下のような機能があります。

* 既存のGASプロジェクトの閲覧・検索
    * なんとSheetsや、Documentsに紐付いたGAS (Container Bounds Script)も一覧に表示されます。
* 新しいプロジェクトの作成
* プロジェクトの詳細の閲覧
    * ↑の画像のように実行数や、OAuth Scopeの参照が可能です。
* 選択した複数のプロジェクトの監視
* ログやクラウドプロジェクトへのリンク
* Apps Script APIのON/OFF

## 既存のGASプロジェクトの閲覧・検索

本当に今まで欲しかったGASプロジェクトの一覧表示、検索機能があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/e590df68-fdc6-23f8-966c-ef9ac8889931.png)

今までContainer Bounds Scriptは探しづらく、Sheetsや、Documentsを開いてはGASエディターを探すということを繰り返していましたが、探すのがかなり楽になりました。

なお検索も可能ですが、多分名前で検索している感じがします。 中身のコードまでは見てくれないようです。(そこまでやったら神ですが)

## 新しいプロジェクトの作成

このあたりは普通ですね。　左上の「+ 新規スクリプト」からGASエディターが開きます。

## プロジェクトの詳細の閲覧

上に挙げた画像のように、プロジェクトのOAuth Scope、ユーザの利用数、成功失敗数などの情報が閲覧できます。
この画面から、紐付いているコンテナ(SheetsやDocuments)を表示したり、直接GASエディターを表示できます。

## 選択した複数のプロジェクトの監視

閲覧機能で表示していた各種監視データ(実行数など)を、複数のプロジェクトでまとめてみることが可能です。
リリースしたばかりのプロジェクトとか、利用具合を見たりするのに便利ですね。

また監視とは別機能ですが、実行履歴を見ることも出来ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/7219a33b-0d44-6929-7ea5-e5d43bd47168.png)


## ログやクラウドプロジェクトへのリンク

小さい機能ですが、簡単にStackdriver Loggingや、コンテナ、クラウドプロジェクトに移動できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/56b54f35-a87c-37b6-f0b2-f087a3dd90b7.png)

一覧からサラッと行けるので、便利ですね

## Apps Script APIのON/OFF

そもそもこのDashbaordは Apps Script APIで出来ているらしいです。
つまりは外部からもこのような機能が利用できるということなのですが、外部からこれらのAPIを利用するためにはAPIをONにしなければなりません。
通常はクラウドプロジェクトからONにするはずですが、このダッシュボードからも実行できるようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/f7b64894-75da-f62a-8b38-c01500811499.png)

# まとめ
如何でしたか? 新しいGASのDashboardは今まで作る・実行するだけだったGASをより管理しやすく、そして監視しやすくしました。
そしてこれらの機能群は新しいApps Script APIに支えられているようです。
ぜひ新しいDashboardを使ってみてください。

次の記事 → [Apps Script API](https://qiita.com/soundTricker/items/13719acd2628ed87894c)
macで特定ディレクトリ以下の改行コードをLFにする

# 概要
git add をしたら

```shell-session
$ git add .
warning: CRLF will be replaced by LF in public//vendor/hoge.js.
The file will have its original line endings in your working directory.
```

と言われる。

元CRLFのファイルをgitにコミットするとLinuxにデプロイしたときに
diffが永遠に出続ける謎の呪いにかかって解けなくて詰むことがある。

これを防ぐために事前に改行コードをLFにしてからコミットしましょう。

# nkfをインストール
改行コード置換なら、nkfがいいよとみんなが言ってる。
Macにはデフォでnkfが入っていない。
なのでnkfをMacに入れることにする。

```shell-session
$ brew update
$ brew install nkf
```
# 特定のディレクトリ以下の改行コードをまるっと置換
./public/vendor配下のファイルを全部LFにする。

```shell-session
$ find ./public/vendor -type f \( -name "*.js" -o -name "*.css" -o -name "*.md" -o -name "*.txt" -o -name "*.json" -o -name "*.scss" -o -name "*.less" -o -name "*.html" -o -name "*.svg" -o -name "*.php" \) | xargs nkf --overwrite -Lu
```

これで世界に平和が訪れます。

2018/01/15修正
```find ./public/vendor -type f```だとバイナリファイルも一緒に処理してしまってヤバいことになることが分かったので、拡張子をちゃんと指定してやることにしました。
```find ./public/vendor -type f```は世界に平和ではなく災いが訪れます。
良い子のみんな、気をつけて。
AWS Cloud9でAngularアプリ開発(後編)

# はじめに
[前編](https://qiita.com/siro33950/items/3e4ab29deef8d97ef00a)ではCloud9の環境構築をおこなったので、今回は実際にAngularの環境構築～実行までを行おうと思います。

## node, npmのバージョンを確認
Angular-CLIは現状、nodeが6.9.0以上、npmが3.0.0以上必要なので、まずはバージョンの確認をします。
Cloud9にはIDE上にコンソールがあるので、そこにコマンドを入力すれば確認できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118147/2baa4b66-a341-747f-fbbc-338cce9ea149.png)
Cloud9はデフォルトでnodeが6.12.3、npmが3.10.10がインストールされているので問題なさそうです。

ちなみに、Cloud9ではワークスペース毎にEC2インスタンスが違うので、ワークスペースを別に立てればインストールされたモジュールを共有しなくてもよくなります。
つまり、今まで一台のPCではNodeなどのバージョン管理が大変でしたが、Cloud9を利用すればバージョン毎にワークスペースを立てれば済むようになるわけです。

## Angular-CLIのインストール
Angularの開発にはかかせないAngular-CLIをインストールします。
Cloud9のコンソールに[公式](https://github.com/angular/angular-cli)に記載されている通りに入力します。

```sh
npm install -g @angular/cli
```
体感で1分ほどでインストールが完了しました。

## Angularプロジェクトの作成
Angular-CLIを利用してプロジェクトを作成します。
sample-angular-appの部分には作成するアプリ名が入るので、適宜読み替えてください。

``` sh
ng new sample-angular-app
cd sample-angular-app
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/118147/0dc0b5cc-4cfb-f40a-73d1-245d0d337f22.png)
今回は2分ほどで完了しました。

## Angularアプリを実行
まずは公式の通り以下のコマンドで起動してみます。

``` sh
ng serve
```

起動したら、上部にあるPreview -> Preview Runnig Applicationを選択して、起動した画面を見てみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118147/3b94db08-d8a9-d447-a71d-06cc8a3487b6.png)
すると、「Invalid Host header」と表示されて失敗します。
これは、ホスト名が指定されたものと違うことが原因のようなので、ホスト名を明示して起動してみます。
ng serveのオプションの--publicを利用することでホスト名を明示することができます。
指定するホスト名には、Preview用ブラウザに記載されているURLをそのまま利用します。

```sh
ng serve --public https://xxxxxxxx.vfs.cloud9.ap-southeast-1.amazonaws.com
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/118147/76ba3b71-7dbd-2dd9-b3fe-a3d0b5b98712.png)

今度は上手くアクセスすることができました。
理由はわかりませんが、初回アクセス時にはロードに時間がかかるので辛抱強く待ちましょう。

## 起動コマンドをpackage.jsonに記載する
毎回URLを記載するのは面倒なので、起動コマンドをpackage.jsonに記載して省略出来るようにします。
今回修正するscriptの部分は、プロジェクトを作成した直後では以下の内容です。

```js
  "scripts": {
    "ng": "ng",
    "start": "ng serve",
    "build": "ng build --prod",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
```

この、"ng serve"のコマンドに --public https://xxxxxxxx.vfs.cloud9.ap-southeast-1.amazonaws.comを追加します。
修正後は以下のようになります。

```js
  "scripts": {
    "ng": "ng",
    "start": "ng serve --public https://xxxxxxxx.vfs.cloud9.ap-southeast-1.amazonaws.com",
    "build": "ng build --prod",
    "test": "ng test",
    "lint": "ng lint",
    "e2e": "ng e2e"
  },
```

修正を保存したら、実際に利用できるかを試してみましょう。
package.jsonで修正するのはnpmのコマンドなので、以下のコマンドで起動します。

```sh
npm run start
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/118147/2715d677-de0e-956f-66ec-232be92f6bfc.png)

無事起動することが確認できました。

# おわりに
[前編](https://qiita.com/siro33950/items/3e4ab29deef8d97ef00a)から、AWS Cloud9を利用してAngularアプリの開発環境構築を行いました。
Cloud9を利用することで簡単に開発を始められるので、今後プロト等作成する時には積極的に利用していきたいです。
ブラウザで自動実行できるテストツールを作ってみた


######2018/01/12 13:08 文章のインデント修正をしました。
---

#0. 今回お話しすること
+ ブラウザ自動テスト計画を作ったよ
+ ファイルをダブルクリックするだけでブラウザが自動で立ち上がり、自動で画面遷移するよ
+ 単純な遷移だけでなく、ページ内のjavascript関数をキックすることもできるよ


#1. 背景

webサイトに組み込んでいるjsライブラリを更新することを検討し始めました。

いわゆるリッチテキストエディタを更新しようと思ったのですが、これまで書いた文章を新エディタで開いて保存する際、htmlのタグ構造が変わったりすることで画面崩れしないかが心配になりました。

そのため旧エディタで作成したテスト的な旧文書を、ひたすら新エディタで開いては保存し、開いては保存し、その前後のhtmlに差分がないかを確認しようという話が出てきました。

もちろん人力でやるのはしんどいので、自動でできないものかと思い、このJSツールを作ってみました。


#2. 実際のコード

##2.1 参考

以下のサイトを参考にしました
[JScript / VBScript (WSH)で，IEを自動操作しよう ](http://language-and-engineering.hatenablog.jp/entry/20090713/p1)

このサイトでは、単純な画面遷移や、プロパティの変更についての説明がありますが、
javascript関数のキック方法がなかったので、それも併せて紹介します。


##2.2 コード

```javascript:test.js
// main関数を実行
main();

function main(){
    // IEのオブジェクトを作成する
    var ie = WScript.createObject("InternetExplorer.Application");
    // IEを画面表示する
    ie.visible = true;
    // 指定したページを表示する
    ie.navigate("http://hoge.test.com/PATH/login");

    // ページが表示されるまで待機
    waitIE( ie );
    
    // 画面上にあるログイン情報を入力
    ie.document.getElementsByName("loginid").item(0).value  = "hoge";
    ie.document.getElementsByName("password").item(0).value = "fuga";
    // submitしてログイン
    ie.document.FORM_NAME.submit();

    waitIE( ie );
    
    // 登録画面を表示表示
    ie.navigate("http://hoge.test.com/PATH/create");

    waitIE( ie );
    
    // javascriptをキックして、保存処理を実行(もちろん引数も入れられます)
    ie.navigate( "javascript:formSubmit(1);");

}

// IEでページが表示されるまで待機
function waitIE( ie ){    
    while( ( ie.busy ) || ( ie.readystate != 4 ) ){
        WScript.sleep( 100 );
    }
}

```
manコマンド

#### manコマンドのメモ
manのヘルプ

```
man man
```
man [番号] [調べたいもの]
番号は以下の種類がある

```
       1   Executable programs or shell commands
       2   System calls (functions provided by the kernel)
       3   Library calls (functions within program libraries)
       4   Special files (usually found in /dev)
       5   File formats and conventions eg /etc/passwd
       6   Games
       7   Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7)
       8   System administration commands (usually only for root)
       9   Kernel routines [Non standard]
```
ゆるふぁい#3 ゆるい議事録 (2018年1月11日実施)

ゆるふぁい#3 2018年1月11日 のゆるい議事録っぽいもの

## 書籍の話

Delphi 書籍をまとめている URL
http://owlsperspective.blogspot.jp/p/books.html

- 洋書に関しては、電子書籍だと、同じ行を何度も読んでしまいがちだよねーw
- 電子化されていると、分からない言葉はコピペして調べられるから便利

などなど

## データベースに関する話

- ストアド使うと....
- メインスレッドじゃなくてサブスレッドで回すとか
- データベースの設計、拡張による差分の管理に関する話

などなど

## 国際化アプリケーションの罠

- CSV の仕様って統一されていないという罠

参考
ロケールによる違い https://help.salesforce.com/articleView?id=reports_export.htm&type=5
CSV https://ja.wikipedia.org/wiki/Comma-Separated_Values
区切り文字 https://ja.wikipedia.org/wiki/%E5%8C%BA%E5%88%87%E3%82%8A%E6%96%87%E5%AD%97

などなど
Swaggerとは

##Swaggerとは
Swagger は RESTful APIを構築するためのオープンソースのフレームワークのこと。
「Open API Initiative」という団体がRESTful APIのインターフェイスの記述をするための標準フォーマットを推進していて、それがSwagger。
日本ではまだそこまで普及していないが、海外ではデファクトスタンダードみたい。

##Swaggerを使うと何がいいの？
SwaggerUIとSwaggerEditorが素晴らしいため。
SwaggerUIはSwaggerの書式（Swagger Spec）で書いておく自動的にドキュメント化してくれ、コードからドキュメント生成が可能。
また、そのドキュメントから実際のリクエストが投げられます。仕様書からテストまで出来るという優れもの！らしい…。
http://blog.takuros.net/entry/2015/12/02/082248

##Swaggerのツール類と手法
主に下記のツールが提供されている。
SwaggerSpec：RESTAPIに対して Swagger の仕様に準じたドキュメント 
SwaggerEditer：Swagger Spec の設計書を記載するためのエディタ 
SwaggerUI：Swagger Spec で記載された設計からドキュメントをHTML形式で自動生成するツール 
SwaggerCodegen：Swagger Spec で記載された設計からAPIのスタブを自動生成 

また、上記ツールを使うアプローチとしては、大きく下記の２パターンがあるらしい。
■トップダウン形式
1.SwaggerEditorでSwagger Specificationを編集、定義
2.SwaggerCodegenでSwagger Specificationからソースコードを生成

■ボトムアップ形式
1.既に存在するREST APIのソースコードからSwagger Coreのアノテーションなどを使用しSwagger Specification定義
2.生成されたSwagger SpecificationをもとにSwagger UIによって、RESTAPIをドキュメント化
https://qiita.com/disc99/items/37228f5d687ad2969aa2

##SwaggerEditerを使ってみる。
①SwaggerEditorを使ってみたいので、サンプルのJsonファイルをYAMLに変換
https://www.json2yaml.com/

②YAMLファイルをExcelで整形（ダミー値とかを除去）
Excelツール

③SwaggerEditor上で確認をする
http://editor.swagger.io/

##他APIドキュメンテーションツールとの比較など
https://www.slideshare.net/dcubeio/api-67703513
[ARKit] HitTestで使うタイプをうまく使い分ける

ARアプリを作成する際に必要となってくるHitTestですが、ヒットテストで使うタイプの特徴を知っておくだけで開発が楽になります。

# hitTest(_:types:)

ARSCNViewにはヒットテストと呼ばれるものがあり、このヒットテストを用いて現実世界の座標を取得する

```
func hitTest(_ point: CGPoint, 
       types: ARHitTestResult.ResultType) -> [ARHitTestResult]
```

## ARHitTestResult
どのように検出するかを設定する
- featurePoint
- estimatedHorizontalPlane
- existingPlane
- existingPlaneUsingExtent

### featurePoint
一番特徴点が近い点の結果を返す

一番自由に結果を取得できるタイプ。
垂直面もいけるが、特徴点次第なので空中の座標が取れたり、思った箇所にオブジェクトが置けない印象がある
例)平面に限らずタップした位置がどこかしらの位置にオブジェクトを配置したい時

### estimatedHorizontalPlane
現在のフレームに対して水平面だと推定される位置の結果を返す

### existingPlane
存在する平面のアンカーの位置の結果を返す

机の上を最初に認識してそのあとに床を測定しようとすると机の上の高さの延長線上の座標が取得されてしまうので注意
例)認識した平面の延長線上にもオブジェクトを配置したい

### existingPlaneUsingExtent
平面アンカーのフレームを考慮した位置を返す

例)認識したアンカーの平面の枠内の内でオブジェクトを配置したい

## [ARHitTestResult] 
取得した結果は、カメラからの距離が近い順にソートされた配列となっている
y座標が一番小さいものを採用したりすることもできる

##感想
個人的にはしっかり水平面に何かしらのオブジェクトを配置したいのであれば、
existingPlaneかexistingPlaneUsingExtentを用いて検出済みのアンカーに対してヒットテストを行うことをオススメしたい。
featurePointやestimatedHorizontalPlaneはアンカーの検出を待たずにヒットテストができるメリットがある反面、精度にかける部分も出てくるので、用途に応じた使い分けをしてください。
馬鹿でかいデータを送る方法（rsync&sshをバックグラウンドで動かし続ける）

突然だが**馬鹿**でかいデータを送りつけたい。別のサーバに。

#馬鹿でかいデータを作る
実態はどこかにあるとして検証用に馬鹿でかいダミーデータを作る。
ddコマンドを使って以下の通り作れる。

```
dd if=/dev/zero of=1G.dummy bs=1M count=1000
mkdir ~/dst
mv 1G.dummy ~/dst
```

実に**馬鹿でかい**。


#馬鹿でかいデータを送りつける
次に馬鹿でかいデータを送りつけます。
ここではrsyncを使いました。

```
nohup sudo rsync -av -e ssh ~/src/ user@192.168.x.x:~/rsync_ssh/dst 
```

（userはユーザ名、192.168.x.xはIPアドレス）
→Ctrl+Zでサスペンドにする。

```
jobs -l
```
→停止中のジョブ一覧がでてくるので停止中のジョブ番号を控える。（ここでは１）

```
bg 1
```
→バックグラウンド実行する。

ここでターミナルを消すとバックグラウンドで動き続けます。
別ターミナルで確認するとrsyncが動き終わったのが確認できました。


#何故この記事を書いたか
```
nohup sudo rsync -av -e ssh ~/src/ user@192.168.x.x:~/dst &
```
これでいけるのかなと思ったらパスワード認証通せず止まってしまい（？）バックグラウンドで動かせなかった。公開鍵認証だったらいける？（まだ試せていない）

#参考
■rsyncをバックグラウンド且つログアウトしても処理が継続されるよう実行する方法
http://devilab.net/archives/1200
■ログアウトしても scp による転送が終了しないようにする方法
http://d.hatena.ne.jp/yohei-a/20100212/1265950974
CentOS7にWordPressをインストール

# はじめに
WordPress、インストールしてみたのでメモです。
本当はpostgresqlでやりたかったのですが、
うまくいかなかったので、
公式ページ通りの構成でやったほうが無難と思われます。

# 構成
・CentOS7.4
・MariaDB
・Apache-HTTPD 2.2.31　（documentRoot  /xxx/htdocs とします）
・PHP 5.6.31

# インストール
## MYSQL（MariaDB）

```
yum install mariadb mariadb-server mariadb-devel
```
iamdaisukeさんの記事を参考にしました。
https://qiita.com/iamdaisuke/items/adc561e057a69afebad8

sibatanさんの記事も大事。
https://qiita.com/sibatan/items/70bd4c7c416ae0548090

ユーザー&DB作成と権限付与はpugiemonnさん、Arini_207さん。
ここで ユーザー：wordpress、DB：wordpressを作っておきます。
https://qiita.com/pugiemonn/items/247dccb6dc56e373ba92
https://qiita.com/Arini_207/items/d11306757e77ac45eead

## Apache-HTTPD,PHP
今回は割愛します。

## WordPress
・ダウンロードしてくる
https://ja.wordpress.org/releases/

・解凍して"wordpress"フォルダを、/xxx/htdocs/wordpress にコピー。

・http://xxx/wordpress/wp-admin/install.php にアクセス。


あとはmariadbで準備した内容を入力するだけです！！
link > PowerShell > 行連結文字 > `

```txt:動作環境
Windows 10 Pro (64bit) Fall Creators Update適用済
```

https://stackoverflow.com/questions/113542/how-can-i-uninstall-an-application-using-powershell
で見た以下のコード。

```
$app = Get-WmiObject -Class Win32_Product `
                     -Filter "Name = 'Software Name'"
```

1行目の「`」は行の継続性を表すものなのだろう。

[PowerShell基礎文法最速マスター](http://winscript.jp/powershell/?s=%8Ds%8Cp%91%B1%95%B6%8E%9A%60) @ PowerShell Scripting Weblog by 牟田口大介さん
> 10.知っておいたほうがよい文法
1行にすると長いコードを複数行に書くには行継続文字`を用いる。VBの_。

### 関連

- [行連結 > C, C++ / bash / Fortran(固定形式) / Fortran(自由形式)](https://qiita.com/7of9/items/021bb0fa9443c2efc44b)
System Specで記述したE2EテストをCircle CI上で行うためにやった設定


# 3行で
- RailsアプリでE2Eテストしたい
- Rails 5.1 で SystemTestCaseという機能が入り、RSpecユーザにはSystem Specという同等のgemがあるのでそれを使う
- Circle CIで動かす方法

## 前提
- Ruby on Rails 5.1 以上
- 今回E2Eテストを導入した対象のRailsアプリはDBを持たずにAPIと通信してデータ持ってきて表示するだけのアプリです。そのため、DBが絡んだ設定などが抜けてます

# RSpecの設定
RSpecの設定は [rspec\-rails 3\.7の新機能！System Specを使ってみた \- Qiita](https://qiita.com/jnchito/items/c7e6e7abf83598a6516d) を読んだらわかりました。すごい丁寧です。

今回はChromeのヘッドレスモードを使いたかったので以下になりました。

```ruby:spec/spec_helper.rb
  config.before(:each) do |example|
    if example.metadata[:type] == :system
      driven_by :selenium_chrome_headless, screen_size: [800, 1000]
    end
  end
```

# Circle CIの設定
Circle CI 上で動かしたいので、以下の設定が必要になりました。

- 2.0対応
- Dockerイメージは `ruby:2.3-node-browsers` にする
- 失敗時のスクリーンショットをArtifactsに保存
- `store_artifacts` を設定
- 日本語文字化け問題を解決する

## 2.0対応
Circle CI を2.0対応しました。2.0にしないと新しいバージョンのChromeが動かせないため[^1]、Chromeのヘッドレモードでのテストができないからです。

Circle CI 2.0対応のときにはドキュメントを読みつつ[Circle CI 2\.0 移行時のキャッシュ設定メモ \- Qiita](https://qiita.com/gaaamii/items/b2e8178d7d6e1423374f)みたいなメモを残しながらやりました。

## Dockerイメージ
`ruby:2.3-node-browsers` を使いました。`-browsers` つけたものにするのは、e2eテストにChromeが必要なためです。

会社によっては独自のDockerイメージを用意してDockerHubに上げてそれを使う、というところもあるようですが[^2] 、今回はあるものを使えました。

## store_artifacts を設定
`store_artifacts` に、テスト結果のファイルが入るパスを指定することで、Circle CIの画面上のArtifactsという画面からテスト結果を閲覧できるようにしました。

## 日本語文字化け問題を解決する
文字化け問題というかフォントが無い問題と書いたほうがいいでしょうか。手っ取り早い方法として、普通に毎回 `apt-get install` で日本語フォントをインストールするように設定しました。

# 雑感
DB絡むといくつか面倒なことがありそうですが、今回対象のアプリケーションはそうではなかったのでそこまで大変ではなかったです。

# 参考
- [Storing and Accessing Build Artifacts \- CircleCI](https://circleci.com/docs/2.0/artifacts/)
9410082/#browsers)
- [A Guide to Testing Rails Applications — Ruby on Rails Guides](http://guides.rubyonrails.org/testing.html#system-testing)
- [退屈なブラウザ作業はSeleniumにやらせようーーはじめてでもできるブラウザ操作自動化 \- Mercari Engineering Blog](http://tech.mercari.com/entry/2017/10/31/122018)

[^1]: [ubuntu\-14\.04\-XL\-922\-9410082 \- CircleCI](https://circleci.com/docs/1.0/build-image-ubuntu-14.04-XL-922-9410082/#browsers)
[^2]: [E2E テストを CircleCI 2\.0 \(Beta\) で完結させてみた話 \| feedforce Engineers' blog](http://tech.feedforce.jp/run-e2e-test-on-circleci-2_0.html)
AWS Cloud9でAngularアプリ開発(前編)

# AWS Cloud9とは

ブラウザ上で動作するIDEで、40以上の言語に必要なツールがあらかじめインストールされているため起動すればすぐに開発を始められる。
AWSが運営してるだけあって、AWSの他のサービスとの連携も簡単(らしい)。
複数人で同時に編集できたりハイライトした部分が相手からも見えるなど、ペアプロやコードレビューに向いた機能もある。

## バージョン
ちなみにインストールされているバージョンは執筆当時で
Java : 1.7
node : 6.12.3
npm : 3.10.10
Python : 2.7.12
でした。
もちろんアップデートする方法はあるみたいです。

## 料金
Cloud9は基本的にEC2上で動作するようになっていて、課金はこの時に利用するEC2の料金のみ。
t2.microで構成すれば無料枠内で利用できる。
もちろんリッチな構成で作れば早くなる。
詳しくは[公式](https://aws.amazon.com/jp/cloud9/pricing/)を見てください。

# AWS Cloud9環境の準備

では実際にCloud9の環境を準備してみます。
まずは[Cloud9のトップ](https://console.aws.amazon.com/cloud9/home)にアクセス。
すると、普段東京リージョンで利用している人はこんな画面に遷移したと思います。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/13bb91dd-8ede-e6d9-c227-ce8d0fdb3299.png)

実はCloud9は現在***東京リージョンには来ていない***んです。
なので、おとなしく別のリージョンに移動しましょう。
するとこんな画面に遷移するので、右側にあるオレンジ色のCreate environmentをクリックしてCloud9の準備を始めましょう。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/bda9fff5-9cab-4f57-cccc-c425fc8be2ca.png)

## Environment name and description
最初に環境の名前を設定します。
今回はcloud9-angular-sampleという名前にしました。
Descriptionの部分は環境の説明を書く部分なので今回は省略。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/621b85aa-2e0c-c97c-d5e5-7b06b8d60584.png)

## Environment setting
次にCloud9を構築するサーバの設定をしていきます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/ae69cdae-d2fc-ca62-dab5-18dd76cb5edf.png)

### Environment type
一番上のEnvironment typeは環境のタイプの設定です。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/a2654546-626b-73c2-bc1b-643ae391cc61.png)
上が新規にEC2インスタンスを作成してそこにCloud9環境を作る設定、
下が既存のEC2インスタンスもしくは自分で構築したサーバに環境を作る設定になります。
下の設定の場合には色々条件があるみたいなので[公式の解説](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ssh-settings.html)を参照するようにしてください。
今回は新規にインスタンスを作成するので上を選択します。

### Instance type

新規インスタンスを選択すると、作成するインスタンスの構成を設定する必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118147/8ccce646-63d7-1096-f96f-cea190ec75d6.png)
今回は無料枠内で利用したいのでt2.microを選択します。
もちろんリッチな構成にすればそれだけ快適になるので、ここは好みで大丈夫です。

### Cost-saving setting
この設定をすることで、Cloud9を使用していない時、自動的にインスタンスを閉じてくれるようになります。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/d64a2c84-71e6-c3e6-5bdb-88fc0535e592.png)
今回は30分に設定しておきました。

他の設定についてはデフォルトのままNextStepを押して先へ進みます。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/8aa38feb-78ff-d18e-3ac4-4f93911224f0.png)

## 準備完了
確認画面のCreate environmentを押すと、グルグルしてる画面に遷移します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/118147/9e051e9d-6189-20b2-13fd-3ea882ad1675.png)

初回はインスタンスの起動等々ありますが、だいたい1分ほどで準備が完了します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/118147/9e505a6c-5cc1-8677-c47f-09521e55c83a.png)

# おわりに
前編はCloud9の環境構築までを行いました。
[後編](https://qiita.com/siro33950/items/005790021823bc2afef0)ではCloud9上でAngularの環境構築～実行までをやってみます。
C#のメモ帳 ソリューションエクスプローラにbinの幽霊が…


![幽霊.png](https://qiita-image-store.s3.amazonaws.com/0/157849/0c6fb34e-5a18-3f36-4be3-d1bb8e2c74d5.png)

[環境]
Win7
VisualStudio2015
C#、フォームアプリ


[症状]
気が付いた時には、表示されるようになっていました…
binを削除しようとすると、「システムコールレベルが間違っています。」のエラーが発生します。
objは削除できますが、もう一度ソリューションを立ち上げると、また表示されます。

トラブルは発生していませんが、気持ちが悪いです。
ご存知の方がいらっしゃましたら、消し方を教えて頂けないでしょうか？
Project Euler Q63 【べき乗の桁の個数】

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


## 問題
$5$桁の数 $16807 = 7^5$は自然数を$5$乗した数である. 同様に$9$桁の数 $134217728 = 8^9$も自然数を$9$乗した数である.

自然数を $n$ 乗して得られる $n$ 桁の正整数は何個あるか?

## 解答

```bash
time seq 99 |
awk -M '{for(i=1;i<=99;i++){print i^$1,i,$1,length(i^$1)}}' |
awk '$3==$4' |
wc -l
49

real    0m0.250s
user    0m0.218s
sys     0m0.168s
```

$99$までで十分であることは誰も保証していない。
下記サイト様を確認すると$99$ですらやり過ぎであることが分かる。
[Project Euler 63 - maple0705のブログ](http://maple0705.hatenablog.jp/entry/2016/08/28/160552)

が、一旦答えが出たのでよしとする。。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/063.html
【no more コピペ】一度列挙しただけで、いろいろ同時に定義する方法



enumと同時に同じ内容の文字列を定義したい時など、コピペせずにやる方法の紹介です。

```C++
#include <iostream>

using namespace std;

//名前を列挙する この時点ではE()は定義されていない
#define ENM \
E(AAA)\
E(BBB)\
E(CCC)

//enum定義
#define E(x) x,
enum MyEnum {
    ENM

    //ここが
    // AAA,
    // BBB,
    // CCC,
    //と展開される
};
#undef E

//文字列定義
#define E(x) #x,
const char* strs[] = {
    ENM

    //ここが
    // "AAA",
    // "BBB",
    // "CCC",
    //と展開される

};
#undef E

//関数宣言
#define E(x) void func_##x();
    ENM
    //ここが
    // void func_AAA();
    // void func_BBB();
    // void func_CCC();
    //と展開される
#undef E

//switch case文と、関数呼び出し
int func_x(MyEnum x) {
    switch(x) {
    #define E(x) case x: func_##x(); break;
    ENM
    //ここが
    // case AAA: func_AAA(); break;
    // case BBB: func_BBB(); break;
    // case CCC: func_CCC(); break;
    //と展開される
    #undef E
    }
    return 0;
}

int main() {
    func_x(AAA);
    func_x(BBB);
    func_x(CCC);
}

void func_AAA() {
    cout << "func_AAA\n";
}
void func_BBB() {
    cout << "func_BBB\n";
}
void func_CCC() {
    cout << "func_CCC\n";
}

```

https://repl.it/@mas_yo/enum-auto-declare
Glideで連続で1枚のViewにCenterCropした画像をフェードインして表示する

Glide 4で実装した

`.thumbnail` にGlideで読み込んだ画像を当て込むといい感じにクロスフェードする

``` kotlin
Glide.with(view.context)
        .load(image)
        .apply(RequestOptions().centerCrop())
        .thumbnail(Glide.with(view.context).load(p).apply(RequestOptions().centerCrop())) // 1個前の画像をサムネイルとして表示してスムーズに画面切り替えを実現する
        .transition(DrawableTransitionOptions.withCrossFade())
        .into(view)
```
OSXでLLDBをビルドする

以下の手順でOSX用のLLDBがビルドできた。

- OSX用のLLDBをビルドする手順
  - シンプル版 [Building lldb on Mac](https://gist.github.com/thlorenz/a068c202f2487ec13809)
  - 複雑版 [Alternate more complex ways to build](https://gist.github.com/thlorenz/a068c202f2487ec13809#file-more-advanced-steps-md)
- 自己証明書を作成する手順
  - http://llvm.org/svn/llvm-project/lldb/trunk/docs/code-signing.txt

上記で説明されているステップは以下の通り。

- キーチェーンにlldb_codesignという名前で自己証明書を作成する
- (Homebrewで)swigをインストール
- ソースコードを取得する
- 必要ならパッチを当てる

以上の準備が整ったら

```
$ open lldb.xcworkspace/
```

でワークスペースを開き、ターゲットをLLDBに変更すれば、Xcode上でLLDBを起動することができる。
ビルドにはちょっと時間がかかる。

とりあえず何でもよいのでコンソールアプリケーションのプロジェクトを作る。
XcodeのDerived Dataの設定を相対パスにしておくと、出力バイナリが探しやすい。
例えば~/helloにhelloというプロジェクトを作り、Derived Dataがbuildのとき、Edit SchemaのArguments Passed On Launchで

```
-- ~/hello/build/hello/Build/Products/Debug/hello
```

のように起動時にバイナリが指定できる。(先頭はハイフン二つ)

```
(lldb) b main
(lldb) r
```

で、起動してmain関数で止まるはずである。

上記手順にもある通り、OSX用のLLDBではJITサポートが無効になっている。これは [Debugging JIT-ed Code With GDB](https://llvm.org/docs/DebuggingJITedCode.html) で説明されている、JITでコンパイルしたコードをソースレベルデバッグする機能のこと。

もともとパフォーマンス上の理由により無効化されたらしいが、現在も無効のままの理由は不明。

- http://lists.llvm.org/pipermail/llvm-dev/2017-June/114063.html
Rails：カラム名変更用のmigrationファイル生成コマンド備忘録

たまに使うけど絶妙な頻度なので忘れてる

# コマンド
```
$ rails g migration rename_user_name_column_to_users
```

# 書式
```
$ rails g migration rename_変更したい現在のカラム名_column_to_テーブル名（大体が複数形のはず）
```
Windows 10 > DVDドライブ起動にする

```txt:動作環境
とあるメーカーのWindows 10 PC (Fall Creators Update適用済)
```

DVDから起動するソフトを動かそうとして、方法が分かりにくかった。
内蔵のDVDドライブを使用する。

以下の手順のようだ。

- Windows 10を起動する
- [完全シャットダウン](https://qiita.com/7of9/items/25d274327d801712cba8)する
- F12を押しながら起動する
    - メーカー、型番によってはF2の場合もある?
    - Boot Menuが表示される
- ODDを選択する


参考: [Windows 上から 「 BIOS 設定 」 画面を表示する方法 ( Windows10 )](https://www2.mouse-jp.co.jp/ssl/user_support2/sc_faq_documents.asp?FaqID=21649)
IEはproxypac記述に関わらずlocalhostはプロキシを見に行かない

社内プロキシで苦しまされていますが、タイトルのとおりです。

Redmineを試験的に自分の業務に取り入れましたが、
IEは127.0.0.1がプロキシを見に行く設定でもちゃんとローカルを見てくれます。
でもChromeはちゃんとproxypac通りに挙動するので困ります。

lmhostあたりに `127.0.0.1 mylocal`とか書いたらどうなるんでしょうか。
実験する権限もありませぬ。
sedでうまくいかない時の^Mの削除 [linux環境で有効(多分)]

結論
```$ cat file_A  | dos2unix > file_A
$ cat file_A  | unix2dos > file_A 
```
のどちらかで解決。

ーーーーーー

人から転送してもらったテキストファイルをlinux環境でsedコマンド使って置換した時にvi環境で^Mが発生してしまった。。
別に支障はないのだけどどうしても気になる。

---file_A---
```  ISMEAR = -5    
  SIGMA  = 0.05   
  NPAR   = 15
  LORBIT = 11
```
というファイルに対してキーワードのある１行分を置換したい時、
```
sed -i 'NPAR/c\  NPAR=10' file_A
```
で出来たのだけど、置き換わったファイルが次のようになってしまってる。



---file_A（置換後)---
```  ISMEAR = -5^M 
  SIGMA  = 0.05^M
  NPAR   = 15^M
  LORBIT = 11^M
```
・・・・なんか気持ち悪い。。

[sed ^M 削除]
で調べたら
```sed -e "s/\r//g" file_A
sed -e 's/^M//g' file_A
```

で直るそうなのだが自分の環境(Linux)では効果がない。。
しばらくネットで探して見たら
```$ cat file_A  | dos2unix > file_A
$ cat file_A  | unix2dos > file_A
```
で解決した(どちらか一方でOk）。Windows環境の改行コード(CRLF)がLinuxで化けた(?)みたい。



参考記事
https://qiita.com/dharry/items/b4eead2868dddf1499f0
http://www.koikikukan.com/archives/2013/10/15-013333.php
Unityでカメラのequirectangular画像を作成してみる

[c++ - Converting a Cubemap into Equirectangular Panorama - Stack Overflow](https://stackoverflow.com/questions/34250742/converting-a-cubemap-into-equirectangular-panorama)
を参考にしてUnityのカメラの標準機能を使ってCubemapを作成しequirectangularに変換してUIのImageに表示してみた。

![index.gif](https://qiita-image-store.s3.amazonaws.com/0/16768/1fe67145-db28-4574-d5e5-07ba38fd4137.gif)


## やったこと　

* [CubemapToEquirectangular/CubemapToEquirectangular.shader at master · Mapiarz/CubemapToEquirectangular · GitHub](https://github.com/Mapiarz/CubemapToEquirectangular/blob/master/Assets/Shaders/CubemapToEquirectangular.shader) をAssetsに配置する　
* 　以下のようなスクリプトを作成しカメラに割り当てる。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CubeMapCamera : MonoBehaviour {

    public Camera camera;
    public Cubemap cubemap;
    public Image image;
    public Material convMaterial;

    public int outputWidth = 4096;
    public int outputHeight = 2048;
    public int cubeWidth = 1280;

    private RenderTexture renderTexture;
    private Texture2D equirectangularTexture;

    // Use this for initialization
    void Start () {
		if (camera == null)
        {
            camera = Camera.main;
        }

        if (cubemap == null)
        {
            cubemap = new Cubemap(cubeWidth, TextureFormat.RGBA32, false);
        }

        if (convMaterial == null)
        {
            Shader conversionShader = Shader.Find("Conversion/CubemapToEquirectangular");
            convMaterial = new Material(conversionShader);
        }
        renderTexture = new RenderTexture(outputWidth, outputHeight, 24);
        equirectangularTexture = new Texture2D(outputWidth, outputHeight, TextureFormat.ARGB32, false);
        image.GetComponent<Image>().material.mainTexture = equirectangularTexture;
    }
	
	// Update is called once per frame
	void Update () {
        camera.RenderToCubemap(cubemap);

        Graphics.Blit(cubemap, renderTexture, convMaterial);
        equirectangularTexture.ReadPixels(new Rect(0, 0, outputWidth, outputHeight), 0, 0, false);
        equirectangularTexture.Apply();
    }
}
```

* AssetsでMaterialを作成しShaderに上記のConversion/CubemapToEquirectangularを指定する。作成したMaterialを上記スクリプトのconvMaterialに設定する。
* UIのImageを作成し、上記スクリプトのimageに設定する。

## はまったこと

* 以下のようにSpriteを作成してimageを更新していると処理に時間がかかって動画がコマ送り状態になる。

```csharp
image.sprite = Sprite.Create(equirectangularTexture, new Rect(0, 0, equirectangularTexture.width, equirectangularTexture.height), Vector2.zero);
```

* WebGL出力する際はShader用のmaterialを作成しておく必要がある。以下のようにMaterialを作っているとGraphics.Blitでエラーになって画像を表示されない。

```csharp
Shader conversionShader = Shader.Find("Conversion/CubemapToEquirectangular");
convMaterial = new Material(conversionShader);
```
UE4のVR Preview開始時に高さが合わないのを何とかしたかった

# はじめに

UE4でVR Previewを見るときにPlayボタンを押してからOculusを被っていたんですが、センサーの範囲外だとカメラが床の高さになってしまい、やり直しが面倒なので四苦八苦した記録です。

# VR Previewを遅延させてみる

VR Previewを実行した時にOculusがセンサーの範囲に入っていればいいので、VR Previewの前に遅延を入れてみました。
それで必要なことは次の3つです。

* 実行の契機となるもの(ボタンとか)
* タイマー
* BluepirntもしくはC++からVR Previewの機能を実行する方法

1つ目はエディタ拡張にするには大袈裟なのでalweiさんの[UE4 Blutilityによるお手軽なエディター拡張](http://unrealengine.hatenablog.com/entry/2016/10/05/215937)で解説されている方法のうち、`GlobalEditorUtilityBase`を継承したBlutilityアセットをダブルクリックして呼び出す方法を使います。

2つ目はBlueprintの`Set Timer by Event`ノードを使います。

3つ目は試行錯誤した結果、VR Previewの機能そのものを直接実行できなかったので、Playボタンのキーボードショートカットの`Alt+P`をツールバーに送る事で実現できました。
これは関数ライブラリーとしてC++クラスを追加して次のコードを書きます。

```cpp:MyBlueprintFunctionLibrary.h
#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()

	UFUNCTION(BlueprintCallable, Category="MyBPLibrary")
	static void PlayInEditor();
};
```

```cpp:MyBlueprintFunctionLibrary.cpp
#include "MyBlueprintFunctionLibrary.h"
#include "Kismet2/DebuggerCommands.h"

void UMyBlueprintFunctionLibrary::PlayInEditor()
{
	FPlayWorldCommands::GlobalPlayWorldActions->ProcessCommandBindings(EKeys::P, FModifierKeysState(false, false, false, false, true, true, false, false, false), false);
}

```

依存モジュールがあるので`PublicDependencyModuleNames`に`"Slate", "SlateCore", "UnrealEd"`を追加します。

```c#:MyProjectBuild.cs
using UnrealBuildTool;

public class MyProject : ModuleRules
{
	public MyProject(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
	
		PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });

		PrivateDependencyModuleNames.AddRange(new string[] { });

        if (Target.bBuildEditor == true)
        {
            PublicDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore", "UnrealEd" });
        }

		// Uncomment if you are using Slate UI
		// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
		// Uncomment if you are using online features
		// PrivateDependencyModuleNames.Add("OnlineSubsystem");

		// To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
	}
}
```

適当なフォルダにBlutilityを作って以下のノードを組みます。
そしてこのアセットを呼び出すと3秒後にVR Previewが始まります(厳密には最後に実行したプレイモード)
やったね！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/2575aa02-963d-c087-2ebf-fa068418df92.png)


# もっと簡単な方法

レベルブループリントに以下のノードを組んでおけばOculus Touchの左コントローラーのメニューボタンを押したときに位置トラッキングをリセットできるのでした。ちゃんちゃん

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8995/814e4492-8ff5-b1fd-6e85-ef6d7ee299fe.png)
filterNotNullを使っていこう

ちょっといいなって思ったので共有します


## 例えばこんなの

例えば下記のようなfor文を書いたとします

```kotlin

for (model in list){
  if (model != null){
    //なんかの処理
  }
}

```


これをfilterNotNullを使うと


```kotlin

list.filterNotNull().forEach {
 //なんかの処理
}

```


ってかけます。
美しい。
ransack で xxx_or_null を使って検索できるようにする


参考
+ https://github.com/activerecord-hackery/ransack/issues/123#issuecomment-247083120


```rb:config/initializers/ransack.rb
module Arel
  module Predications
    def eq_or_null(other)
      left  = eq(other)
      right = eq(nil)
      left.or(right)
    end

    def not_eq_or_null(other)
      left  = not_eq(other)
      right = eq(nil)
      left.or(right)
    end

    def gteq_or_null(other)
      left  = gteq(other)
      right = eq(nil)
      left.or(right)
    end

    def lt_or_null(other)
      left  = lt(other)
      right = eq(nil)
      left.or(right)
    end

    def in_or_null(other)
      left  = self.in(other)
      right = eq(nil)
      left.or(right)
    end
  end
end

Ransack.configure do |config|
  config.add_predicate 'eq_or_null', arel_predicate: 'eq_or_null'
  config.add_predicate 'not_eq_or_null', arel_predicate: 'not_eq_or_null'
  config.add_predicate 'gteq_or_null', arel_predicate: 'gteq_or_null'
  config.add_predicate 'lt_or_null', arel_predicate: 'lt_or_null'
  config.add_predicate 'in_or_null', arel_predicate: 'in_or_null', wants_array: true
end
```
【PHP】JSON ファイルを Unicode デコード(アンエスケープ)するワンライナー

自分用スニペットです。

```shell
php -r "file_put_contents(__DIR__.'/decode.json', json_encode(json_decode(file_ get_contents(__DIR__.'/unicode.json')), JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));"
```
centos6にsamba

### centos6にsambaをインストール

sambaインストール

```
yum install samba samba-client samba-common -y
```
共有フォルダの作成

```
mkdir [共有フォルダのパス]
chmod -R 0777 [共有フォルダのパス]
chown -R nobody:nobody [共有フォルダのパス]
```

設定ファイルを編集

```
cp smb.conf smb.conf.org
vi smb.conf
```
```
[Share]
#共有させるフォルダ
path = [共有フォルダのパス]
#マイネットワークに表示させるか否か
browsable =yes
#書き込み可能かどうか
writable = yes
#ゲストユーザのログインが可能かどうか
guest ok = yes
#読込みのみとするか
read only = no
```

samba起動

```
/etc/rc.d/init.d/smb start
/etc/rc.d/init.d/nmb start
```

Sambaを自動起動するように設定

```
chkconfig smb on
chkconfig nmb on
```

共有フォルダにアクセスできるユーザーを設定
（既存のユーザーをSambaサーバーアクセス用ユーザーとする）

```
smbpasswd -a [ユーザー名]
```
centos7は 'pdbedit' というものになるらしい

上記を行いcentos6の共有フォルダをcentos6からマウントすると
以下のエラーが発生
謎。

```
mount -t cifs //[ipアドレス]/[共有フォルダ] [マウント先] -o user=[ ユーザーID],password=[パスワード],uid=apache,gid=apache,file_mode=0777,dir_mode=0777

mount error(112): Host is down
Refr to the mount.cifs(8) manual page (e.g. man mount.cifs)
```
Selenium2(WebDriver)で画面の出力結果が影響を受けてないことをテストしてみた

Seleniumでどんなことができるか遊んでみたのでメモ。
###環境：
>Windows OS
python 3.6.1 
Selenium 3.8.1(python)

###事前準備：
1.pythonは入っていたので、pipでseleniumのinstall
`>pip install -U selenium`
2.検査に使用するwebdriverのバイナリを取得
chrome用：https://sites.google.com/a/chromium.org/chromedriver/downloads
今回はお試しなのでChrome特化で作ってるが、本来はUAを複数指定できるような汎化を行いたい。

###実際に書いたコード:
```exam.py
from selenium import webdriver
from filecmp import cmp

#Constants
BASE_FILE = "base.png"
EXAM_FILE = "test.png"
CHROME_DRV = "C:\selenium\drivers\chromedriver"
BASE_URI = "http://localhost/original/"
EXAM_URI = "http://localhost/revised/"

#Chrome
def getExamScreen(target_uri, export_file, ua):
    driver = webdriver.Chrome(executable_path = ua)

    driver.set_window_size(800,600)
    driver.get(target_uri)
    driver.get_screenshot_as_file(export_file)

    driver.close() 

def chkNotDiff():
    if(cmp(BASE_FILE, EXAM_FILE)):
        print("Same!")
    else:
        print("Different!")


#original env
getExamScreen(BASE_URI, BASE_FILE, CHROME_DRV)

#changed env
getExamScreen(EXAM_URI, EXAM_FILE, CHROME_DRV)

chkNotDiff()
```
ポイントは、プログラムの修正結果が表示に影響を与えてないのであれば、変更前に描画された画面のスクリーンショット(base.png)と、修正後に描画されたスクリーンショットの内容(test.png)は等価である、という仮説である。
このためには現状のスクリーンショットも評価用の画面も同じ条件でファイル作成する必要があるので、seleniumで取得している。
現状サイトが準備できない場合は、テスト用のbase.pngをあらかじめ検証環境を利用して作成して事前準備して、original envとなっている処理を行わなければ問題ないだろう。
C | C++ > 配列の初期化 > int a[100] = {0}; | staticストレージと同じ方法で初期化

```txt:動作環境
C++ Builder XE4
```

実装をしている中で配列の初期化を思い出した。

数年前に最初に読んだ記事は本の虫さんの以下の記事だった。
[多くのプログラマは言語を表面的な理解だけで使っている](https://cpplover.blogspot.jp/2010/09/blog-post_18.html)

この記事で知ったのが「staticストレージと同じ方法で初期化」ということ。

今日検索をして、以下も見つけた。
[Initialize static member array to zero](https://stackoverflow.com/questions/19069766/initialize-static-member-array-to-zero)
Anaconda上にjanomeとgensimを使った自然言語処理環境構築

NLPの環境を作りました。備忘録です。
MecabでなくてJanomeを使っているのは環境構築が簡単だからです。本格的に使うのならMecabの方がいい
でしょう。

#実行環境
- Windows10 Pro 64bit
- Anaconda 4.4.7
- Python 3.6
- Janome
- gensim

#環境構築
Anaconda Navigatorを起動して仮想環境を作ります。
![10.CreateEnv01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/d08b4132-d1c0-95b5-5e19-fe8b582ee9c0.jpeg)
![10.CreateEnv02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/3e7355dd-4716-7707-277d-996c9837664c.jpeg)

ターミナル起動
![20.InstallPackages01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/78f9a88e-f3ea-fca8-acb9-2d0145b5ecb1.jpeg)

```
pip install janome
```

![20.InstallPackages02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/7a857607-2c48-c16b-ab06-6f6b6eeae8e4.jpeg)

```
pip install gensim
```

![20.InstallPackages03.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/3460addb-4002-2508-cf79-d0cdc6852698.jpeg)

```
pip install scikit-learn
```

![20.InstallPackages04.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/a6d7af9c-562a-edb1-6d37-135d6b7bec03.jpeg)

#使ってみた
##Janomeで形態素解析
Jupyter notebookで実行しています。

```python
from janome.tokenizer import Tokenizer
# 簡単な使用方法
t = Tokenizer()
for token in t.tokenize(u'すもももももももものうち'):
    print(token)
```

![30.Janome01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/bb690fb4-ba58-a024-e373-57711674f9f2.jpeg)

scikit-learnでtf-idfやgensimでword2vecもしていますが、時間があったら追記します。