OmniAICreator/Qiita-1.07M huggingface dataset:
Python > __init__.py > 指定ディレクトリをパッケージとして扱うために必要 (空ファイルでも可)

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

> a file named `__init__.py`. This can be empty, but Python needs it to treat the directory containing it as a package.

関連: [What is `__init__.py` for?](http://stackoverflow.com/questions/448271/what-is-init-py-for)

answered Nov 7 '10 at 3:31
caritos
による回答にて`mydir/spam/`のimport例が紹介されている。
Rで農薬検索をする[準備編]

急に畑のナスにアブラムシが湧いた！農薬は何を使えばいいんだ！！！

そんなときもRがあれば大丈夫。

とりあえず今回はデータの支度を。

# お約束

実際の登録内容が絶対です。

**!!農薬は有効期限内のものをラベルの記載内容を守って使用しましょう!!**

※なお、Windows向けですがACFinderという素晴らしいソフトがあるのでRなど使用せずそちらを利用するのがおすすめです([農薬登録情報検索クライアント ACFinder](http://acfinder.kabe.info/))

# 使用したパッケージ

```r
library(magrittr)
library(dplyr)
library(data.table)
library(dtplyr)
library(RUnicode)
library(readr)
library(stringr) # 次回つかいます
```

`RUnicode`の使用にあたってはICUライブラリのインストールも必要なので別途用意しておく。(cf. [abicky/RUnicode: R package to proceed Unicode characters]( https://github.com/abicky/RUnicode))

ちなみに`RUnicode`のインストールの時、

```r
エラー: Could not find build tools necessary to build RUnicode
```

と怒られてうまく行かなかったが、

```r
options(buildtools.check = function(action) TRUE)
```

とやったらうまく行った。理由は良く理解していない(cf. [xcode - Error: "Could not find build tools necessary to build stringi" when trying devtools::install_github() - Stack Overflow]( http://stackoverflow.com/questions/38725060/error-could-not-find-build-tools-necessary-to-build-stringi-when-trying-devto))。

# ファイルの入手

## ダウンロード
農薬の登録情報はFAMICで公開されているものを使用するので、予め注意事項を確認しておきましょう(要確認: [農薬登録情報ダウンロードの説明 - 独立行政法人農林水産消費安全技術センター（FAMIC）]( http://www.acis.famic.go.jp/ddownload/index.htm))。

事前に`chem_data`ディレクトリを作業ディレクトリ内に準備しておく。

ダウンロードは`download.file()`にURLと保存先を教えればやってくれる。

```r
## 登録情報ダウンロード
# set url
kihon_url <- "http://www.acis.famic.go.jp/ddata/datacsv/H2904120.zip"
tekiyo1_url <- "http://www.acis.famic.go.jp/ddata/datacsv/H2904121.zip"
tekiyo2_url <- "http://www.acis.famic.go.jp/ddata/datacsv/H2904122.zip"
# download file
download.file(kihon_url, "chem_data/kihon.zip")
download.file(tekiyo1_url, "chem_data/tekiyo1.zip")
download.file(tekiyo2_url, "chem_data/tekiyo2.zip")
rm(kihon_url, tekiyo1_url, tekiyo2_url)
```

ダウンロード元のURLはおそらく登録情報が更新されると変更となるので注意。

## 解凍

解凍は`unzip()`。ファイルへのパスが返ってくるので、これを受け取ればついでにリネームができる。農薬登録情報のファイル名は更新ごとに変更されている様子なので、適当にリネームしておいたほうが良いだろう。リネームは`file.rename()`。

```r
tmp <- unzip("chem_data/kihon.zip", exdir = "chem_data")
file.rename(tmp, "chem_data/kihon.csv")
tmp <- unzip("chem_data/tekiyo1.zip", exdir = "chem_data")
file.rename(tmp, "chem_data/tekiyo1.csv")
tmp <- unzip("chem_data/tekiyo2.zip", exdir = "chem_data")
file.rename(tmp, "chem_data/tekiyo2.csv")
rm(tmp)
```

# データの読み込みと前処理

## データ読み込み

Shift_JISなのでencodingの指定をしないと文字化けする場合がある。
`read_csv`が早いよみたいな話を聞いてやろうとしたら若干ハマった。`read_csv`でencodingを指定するには`locale=locale(encoding="CP932")`のようにやるそうだ。

あと列名に丸数字が入ってて後々面倒なことになりそうなので早めに潰しておいたほうがいい。

```r
kihon <- read_csv("chem_data/kihon.csv", locale=locale(encoding="CP932"))
tekiyo1 <- read_csv("chem_data/tekiyo1.csv", locale=locale(encoding="CP932"))
tekiyo2 <- read_csv("chem_data/tekiyo2.csv", locale=locale(encoding="CP932"))
tekiyo <- rbind(tekiyo1, tekiyo2)
rm(tekiyo1, tekiyo2)
names(tekiyo)[21:25] <- paste0("有効成分", 1:5, "を含む農薬含む農薬の総使用回数")
```

## Unicode正規化

半角カナとか㍑とか入ってて後々アレっぽいのでこれも潰しておく。

`RUnicode`べんり。`%<>%`べんり。

```r
kihon %<>% mutate_if(is.character, unormalize)
tekiyo %<>% mutate_if(is.character, unormalize)
```

ついでに登録基本部を適用表にくっつけておく。`left_join`は`by=`を省略すると適当に空気読んでアレしてくれてよい。

```r
chemicals <- left_join(tekiyo, kihon)
```

# 準備は整った

これで支度は整いましたが、**たいへんなのはこれからです。**
Amazon SESとNetwork.Mail.Mimeでメールを送信してみた

Amazon SESをSMTPサーバとして使いHaskellからメールを送るサンプル。
要はSSLで包んでSMTPを使えばいい。
以下、サンプルコード。


```hs
import GHC.Base
import Data.String (IsString)
import Network.HaskellNet.SMTP.SSL
import Network.Socket (PortNumber(..))
import Network.Mail.Mime (Mail(..), Address(..), plainPart)

_port :: PortNumber
_port = 465

_host :: IsString a => a
_host = "email-smtp.us-east-1.amazonaws.com"

_user :: IsString a => a
_user = "SMTP-ACCESS-KEY"

_pass :: IsString a => a
_pass = "SMTP-SECRET-KEY"

sendMailWithSES :: IO ()
sendMailWithSES = doSMTPSSLWithSettings
    _host
    defaultSettingsSMTPSSL { sslPort = _port
                               , sslLogToConsole = True
                               }
    (
    \conn -> do
        auth <- authenticate LOGIN _user _pass conn
        _    <- if auth then
                  do
                    return ()
                  else
                    error "authenticate failed."
        mail <- return $ Mail {
                  mailFrom = address "jabara ses" "ah+ses@jabara.info"
                , mailTo = [address "jabara" "ah@jabara.info"]
                , mailCc = []
                , mailBcc = []
                , mailHeaders = [("Subject", "test mail")]
                , mailParts = [[plainPart "This is Haskell send mail via Amazon SES."]]
                }
        sendMimeMail2 mail conn
        -- sendPlainTextMail
        --     "ah@jabara.info" -- receiver
        --     "ah+ses@jabara.info" -- sender
        --     "test" -- subject
        --     "this is test mail." -- body
        --     conn
    )
  where
    address name email = Address (Just name) email
```
なんかインストールしてるっぽいスクリプト

[なんかしてるっぽい出力をするスクリプト](http://qiita.com/yushimizu/items/6d6bbd5ff979e54ac27e)が意外に好評だったので、以下のようになんかインストールしてる版を作りました。
pipを参考に作成しています。

<img width="404" alt="スクリーンショット 2017-04-19 1.29.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/107187/bcfb9eed-af13-015a-0a18-04cd17609d11.png">

今回はLinux版だけになります。
なんかインストールしている間ぼーっとして疲れを癒しましょう。

```bash:InstallSomething.sh
#!/bin/bash

#define library name
libraries=("ujthsk" "wtpkty" "dancmu" "ckbbbw" "dgkujy" "rahtzz")
# 1 - 100
progressBarSize=20

while :
do
    library=${libraries[$(($RANDOM % ${#libraries[*]}))]}
    echo "Collecting ${library}"

    fileSize=$((($RANDOM % 1000) + $progressBarSize))
    percentSize=$(($fileSize / $progressBarSize))
    
    fileName="${library}-"$(($RANDOM % 10))"."$(($RANDOM % 10))"."$(($RANDOM % 10))".tar.gz"
    echo "    Downloading ${fileName} (${fileSize}kB)"
    
    nowSize=0
    # loop downloading
    while [ $nowSize -lt $fileSize ]
    do
        progressSize=$(($RANDOM % 100))
        nowSize=$(($nowSize + $progressSize))
        sizeQuotient=$(($nowSize / $percentSize))

        # protect over 100 percent
        if [ $nowSize -gt $fileSize ] ; then
            nowSize=$fileSize
            sizeQuotient=$progressBarSize
        fi

        # make progress bar
        progressBar=""
        for i in `seq 1 $sizeQuotient`
        do
            progressBar=$progressBar"#"
        done
        for i in `seq 1 $(($progressBarSize - $sizeQuotient))`
        do
            progressBar=$progressBar" "
        done

        #progress bar
        echo -en $(($sizeQuotient * (100 / $progressBarSize)))"%|${progressBar}| ${nowSize}kB ${progressSize}kB/s \r"

        sleep 1s
    done
    
    echo
    echo "Installing..."
    for i in `seq 1 1 20`
    do
        echo -en '|\r' ; sleep 0.05;
        echo -en '/\r' ; sleep 0.05;
        echo -en '-\r' ; sleep 0.05;
    done
    echo "Successfully installed: ${fileName}"

    if [ $(($RANDOM % 10)) -lt 1 ] ; then
        echo "Building wheels for collected packages..."
        sleep 3s
    fi
    echo
    sleep 1s
done
```
Python / numpy > 項目名の行を持つデータファイルを読む > genfromtxt()を使う

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

### 対象ファイル

以下のようなファイルの値を読取りたい。

```bash
$ head IntField-Y 
x y z |E|^2 Ex.r Ex.i Ey.r Ey.i Ez.r Ez.i
-0.2094395102 -1.466076572 -5.235987756 1.117036835 -0.02405501404 0.01851210121 0.4265089085 0.9619413614 0.0789243352 -0.05143356113
0.2094395102 -1.466076572 -5.235987756 1.117036835 0.02405501406 -0.01851210123 0.4265089085 0.9619413614 0.0789243352 -0.05143356113
-1.047197551 -1.047197551 -5.235987756 1.080829273 -0.03701212691 0.09467516163 0.4467058558 0.9303997369 0.0629824475 -0.0365979255
-0.6283185307 -1.047197551 -5.235987756 0.8888575386 -0.01687903824 -0.0712841231 0.4031262231 0.8443906708 0.08152662539 -0.0365822794
-0.2094395102 -1.047197551 -5.235987756 1.355786123 0.000532696637 -0.07408332312 0.2568592009 1.131470229 0.05970715325 -0.02304404718
0.2094395102 -1.047197551 -5.235987756 1.355786123 -0.0005326966253 0.0740833231 0.256859201 1.131470229 0.05970715325 -0.02304404718
0.6283185307 -1.047197551 -5.235987756 0.8888575386 0.01687903825 0.07128412309 0.4031262231 0.8443906708 0.08152662538 -0.0365822794
1.047197551 -1.047197551 -5.235987756 1.080829273 0.03701212691 -0.09467516164 0.4467058558 0.9303997368 0.06298244747 -0.03659792549
-1.047197551 -0.6283185307 -5.235987756 1.699276704 -0.02108930862 -0.06464253993 0.3399972729 1.255779421 0.04140882396 -0.01893399186
```

区切り文字はカンマでなく空白。

### 参考

http://www.mwsoft.jp/programming/numpy/csv.html

### loadtxt() > 失敗


```test_read_170418a.py
import numpy as np

data = np.loadtxt('IntField-Y', delimiter=' ')
print(data[:,0])  # 1st columne
print(data[:,1])  # 2nd columne
```

```txt:run
$ python test_read_170418a.py 
Traceback (most recent call last):
  File "test_read_170418a.py", line 9, in <module>
    data = np.loadtxt('IntField-Y', delimiter=' ')
  File "/home/user/tensorflow-GPU/local/lib/python2.7/site-packages/numpy/lib/npyio.py", line 930, in loadtxt
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "/home/user/tensorflow-GPU/local/lib/python2.7/site-packages/numpy/lib/npyio.py", line 659, in floatconv
    return float(x)
ValueError: could not convert string to float: x
[1]+  終了                  subl test_read_170418a.py
```

項目名の行(`x y z |E|^2 Ex.r Ex.i Ey.r Ey.i Ez.r Ez.i`)でエラーが出る。

### genfromtxt() > 成功

```test_read_170419a.py
import numpy as np

#data = np.loadtxt('IntField-Y', delimiter=' ')
data = np.genfromtxt('IntField-Y', delimiter=' ')
print(data[:,0])  # 1st columne
print(data[:,1])  # 2nd columne
```

```txt:run
$ python test_read_170419a.py 
[        nan -0.20943951  0.20943951 ...,  1.04719755 -0.20943951
  0.20943951]
[        nan -1.46607657 -1.46607657 ...,  1.04719755  1.46607657
  1.46607657]
```

genfromtxt()を使うことで項目名の行を持つ空白区切りのデータファイルを読むことができた。
項目名の行の文字列はnanとなるが、データとして扱わないため問題はない。
技術英語 > stories handed down through the generations

@ http://thecodist.com/article/the-six-goals-of-every-programming-project

> Quality, which I consider being continuously available and functional, can ...

意訳「品質、それは継続的に使えて、機能的であること。それは、...できる」

<hr>
関連して思い出したのは

http://www.loe.org/shows/segments.html?programID=04-P13-00053&segmentID=1

> Community isn’t just the place that surrounds us but what we make of that place. And **stories handed down through the generations** are what keep a community alive. 

意訳「Communityはただ単に周囲にあるものでなく、我々がその場から作り上げるものだ。そして世代を通して継承された(逸)話はCommunityを活性化するものである」
2017年4月的なMacの開発環境構築 - その1

なんか数年に一度、同じように最近の動向を調べて環境整備するってのをやっている気がする...

- [OS X 10.9.4なローカルでHomebrewやrbenvな開発環境でRubyやRailsを再整備するアレコレ - Qiita](http://qiita.com/yamazaki/items/711654056d134692de45)
- [Mac再インストールと開発環境の再構築 - Qiita](http://qiita.com/yamazaki/items/f9a69df419b8b06e1e2a)

そろそろMacBook Pro (13-inch, Early 2011)を卒業したいっ！

けど、[1TBのSSD(Amazonにリンク)](http://www.amazon.co.jp/gp/product/B00VX82KBK/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00VX82KBK&linkCode=as2&tag=0881-22X)にしてからストレスとトラブルがないので、そのまま使い続けている... 開発をもっとヘビーにするようになると、メモリか、CPUが足りなくてイライラするのかなぁ... でも、CPUは2.7 GHz Intel Core i7だから問題にはならなそう？どちらかというとメモリ8GBが足りなくなりそうな気がする...

ということで、とりあえず、ウェブ徘徊して2017年の記事をピックアップ
以下、良さげだった順、参考になった順に列挙

- [Macクリーンインストールからpython開発環境構築メモ【2017/4現在】 - Qiita](http://qiita.com/sue_charo/items/2b0bca00ba2470965d1f)
- [Macで作るRails環境構築手順 | tsuchikazu blog](https://tsuchikazu.net/mac_rail_setup/)
- [新しいMacbookを買ったの開発環境を作った | hikonaz blog](http://hikonaz.com/2017/01/mac-dev-settiong/)
- [Macbook ProをSierraでクリーンインストール&環境復元したよ](https://techracho.bpsinc.jp/hachi8833/2017_01_04/32378)
- [MacBookを開発環境に設定していくメモ - Qiita](http://qiita.com/taka4sato/items/b34741f8033a1dd1621a)
- [MacBookでVagarnt+Apache+PHP7.0を使った開発環境の構築 | よだねっと](https://yoda56.com/archives/203)

変わらず、今もHomebrew全盛っぽいので、素直に、それでw

`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

数分で完了して、お医者さんに確認

```bash:
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: Your Xcode (8.0) is outdated.
Please update to Xcode 8.3.1 (or delete it).
Xcode can be updated from the App Store.
```

あれっ、App Storeのアップデート対象に上がってこなかったのは、なぜ？と思いつつも、とりあえず、30分かけてXcodeをアップデート

```bash
$ brew doctor
Your system is ready to brew.
```

というところで、早朝作業はタイムアップ
GNOME3のオススメ拡張機能7コ

# GNOME3のオススメ拡張機能7コ
## Dash to Dock
![Dash to Dock](https://qiita-image-store.s3.amazonaws.com/0/102243/55ca5958-459f-e216-5ce3-d7fdfadbfec5.png)
[Dash to Dock - GNOME Shell Extensions](https://extensions.gnome.org/extension/307/dash-to-dock/)
ActivityウィンドウにあるDockを常に表示します。Macに近くなります。
## Window List
![Window List](https://qiita-image-store.s3.amazonaws.com/0/102243/334d5b31-5b63-9dcc-a43a-87e5aca04f2c.png)
[Window List - GNOME Shell Extensions](https://extensions.gnome.org/extension/602/window-list/)
ウィンドウリストを画面下部に表示します。Windowsに近くなります。上のDash to Dockとお好みで使い分けます。
## Applications Menu
![Applications Menu](https://qiita-image-store.s3.amazonaws.com/0/102243/4ac80cdf-b574-c561-19a6-4697ccb22fee.png)
[Applications Menu - GNOME Shell Extensions](https://extensions.gnome.org/extension/6/applications-menu/)
画面上部のパネルにGNOME2やMATEであったようなアプリケーションメニューを追加します。
## User Themes
[User Themes - GNOME Shell Extensions](https://extensions.gnome.org/extension/19/user-themes/)
画面上部のパネルやポップアップメニューのテーマを適用できるようになります。テーマは一部CSSで記述されているので、カスタマイズも簡単です。(洋モノのテーマは大抵字が小さい...)
## AlternateTab
[AlternateTab - GNOME Shell Extensions](https://extensions.gnome.org/extension/15/alternatetab/)
Alt+Tabのスイッチャーをアプリ単位ではなく、ウィンドウ単位で切り替えれるようにします。Windowsに近くなります。(SSは取りづらかったのでやめた...)
## No Topleft Hot Corner
[No Topleft Hot Corner - GNOME Shell Extensions](https://extensions.gnome.org/extension/118/no-topleft-hot-corner/)
画面右上のホットコーナー(ホバーするとアクティビティ画面を表示する機能)を無効にします。
## Multi Monitors Add-on
[Multi Monitors Add-on - GNOME Shell Extensions](https://extensions.gnome.org/extension/921/multi-monitors-add-on/)
マルチディスプレイ環境で画面上部のパネルを全てのスクリーンに表示します。
## オマケ: 僕が使用しているテーマ
![僕が使用しているテーマ](https://qiita-image-store.s3.amazonaws.com/0/102243/6982ea6c-2f20-f497-c182-31b72dcd76d2.png)

* [[Arc OSX themes] Arc-OSX-themes - www.gnome-look.org](https://www.gnome-look.org/content/show.php/Arc-OSX-themes?content=175536)
* [[Paper] Download - snwh.org](https://snwh.org/paper/download)<br/>
GNOME Shell テーマはCSS(`/usr/share/gnome-shell/theme/gnome-classic.css`)を弄ってパネルの文字を大きく(11pt)にしてあります。
* [Better Font Rendering In Linux With Infinality ~ Web Upd8: Ubuntu / Linux blog](http://www.webupd8.org/2013/06/better-font-rendering-in-linux-with.html)<br/>
`fontconfig-infinality` を利用して文字のアンチエイリアシングをApple風にする方法はこちら。
PowerShell 2.0 から IE11 を操作しスクレイピングするサンプルコード（querySelector編）

Win7 (PowerShell 2.0) + IE11 な環境でスクレイピングしたかったので．

querySelector()、querySelectorAll() に CSS セレクタを指定して DOM 要素を取得しています．

InvokeMember() でメソッドを呼び出す必要がありました（後述）．
試していませんが getElementById() や getElementsByTagName() を使う場合も同様と思います．


# ソースコード

※管理者権限で実行する必要があります

```PowerShell:ie.ps1
# IEのページ読み込みが完了するまで待機する
function Wait-IE($ie)
{
    # ビジーでない状態が3秒くらい継続したら読み込み終わったと判断する（適当）
    $i = 0
    while ($i -lt 3) {
        if ($ie.Busy) {
            $i = 0
        }
        else {
            $i++
        }
        Start-Sleep -Seconds 1
    }
}

# CSSセレクタでノードを得る（複数ノード）
function Select-Nodes($node, [string]$selector)
{
    $nodes = [System.__ComObject].InvokeMember("querySelectorAll", [System.Reflection.BindingFlags]::InvokeMethod, $null, $node, $selector)
    $result = New-Object System.Collections.Generic.List[System.__ComObject]
    for ($i = 0; $i -lt $nodes.Length; $i++) {
        $result.Add([System.__ComObject].InvokeMember("item", [System.Reflection.BindingFlags]::InvokeMethod, $null, $nodes, $i))
    }
    $result
}

# CSSセレクタでノードを得る
function Select-SingleNode($node, [string]$selector)
{
    [System.__ComObject].InvokeMember("querySelector", [System.Reflection.BindingFlags]::InvokeMethod, $null, $node, $selector)
}


$ie = New-Object -ComObject InternetExplorer.Application
$ie.Visible = $false

# (1)Googleの検索結果一覧を取得してみる
$ie.Navigate("https://www.google.co.jp/search?q=test")
Wait-IE $ie
$links = Select-Nodes $ie.Document "h3.r a"
$links | % { $_.innerText }

# (2)別のキーワードで検索してみる
$text = Select-SingleNode $ie.Document "#lst-ib"
$text.Value = "google"
$btn =  Select-SingleNode $ie.Document "#_fZl"
$btn.click()
Wait-IE $ie

$ie.Visible = $true
```

# はまったポイントなど

* COM オブジェクトのメソッドを直接コールできない → InvokeMember() を使用 (https://blogmaster365.wordpress.com/2014/07/31/powershell-%E3%81%A7ie%E8%87%AA%E5%8B%95%E5%AE%9F%E8%A1%8C/)
    * Office のインストールの有無など環境による？
* Navigate() でページ遷移後、IE オブジェクトが無効になる → 原因はわかりませんが管理者権限で実行することで回避できました
プログラミング学習記録３日目

<h3>Ruby on Rails</h3>
コントローラーとビューの自動生成 : 
rails generate contoroller コントローラー名　アクション名
アドレス入力→home_controllerのtopアクションにリクエスト→
top.home.erbを返す。


<h4>Ruby on Railsの流れまとめ</h4>
ブラウザ
↓
ルーティング:
routes.rb ,　使用可能なルートの確認方法 :rake routes
root 'controller名#アクション名' : ルートの取り方
↓
コントローラー: controller.rbにアクション追加
変数の定義→ビューで利用可能
def
@変数名 = "○○○○○○○"
end
↓
ビュー: erbファイルにブラウザに返す情報追加 
<%= link_to "表示するテキスト","URL"%> : リンク作成 
✴︎"URL"は,"/アクション名", アクション名_path ←''無しでもOK,計3パターン
↓
ブラウザ

ファイル、フォルダの作り方は、command lineの方法を利用可能。しかしちょっと手間。

デザインの共通部分 : app/asserts/stylesheets内の.sccsファイルを編集
ビューの共通部分 : application.html.erbを編集

投稿用フォームの場合
<%= form_tag '情報送信先' do %>
＜input type = 'text' name = 'title'＞ 
＜textarea name = 'content'＞＜/textarea＞
＜input type = 'submit',value = "表示するテキスト"＞
<%end%> ←　=イコールは不要
nameによってUserの入力値にname属性をつけている。

次にコントローラーにおいて以下の設定をする
def create
   @title = params[:title]
   @content = params[:content]
end
これによりcreateアクション→name属性を持つ入力値'title'をparamsとして習得→@titleに代入
contentも同様にできる。
Sequel ProからVagrant(rails-dev-box)に接続する方法

## はじめに

以下が環境になります。

* Mac OSX 10.12.3
* Vagrant 1.9.2
* Virtualbox 5.1.14

Vagrantで開発環境を作っていてboxにrails-dev-boxを使っていて、[Sequel Pro](https://www.sequelpro.com/)でVagrant内のMySQLに接続をしようと思った際に少しハマったので書いておきます。
rails-dev-boxでの開発環境の作り方は[rails-dev-boxを使ってRailsの開発環境を作る](http://qiita.com/sayama0402/items/99bbf6d0977c5c6414cb)に記載しています。

vagrant上のリモートのmysqlにssh経由でアクセスをして、Sequerl Proとコネクトします。


## やり方


MySQLの項目
> mysqlはユーザーとパスワードがrootである前提
> もしrootでないのであれば、[rootユーザーの作り方](http://qiita.com/sayama0402/items/2ac53e5614d90481a345)を参照してください

```

host: 127.0.0.1
user: root
pass: root
dbname: //指定しなくても良い
port: //指定しなくても良い
```

SSHの項目

> 以下の項目の詳細を知るためにはboxのssh configを見る必要があります。ターミナル
rails-dev-boxをクローンしたディレクトリで`vagrant ssh-config`と入力します。
すると以下のような結果が返ってきます。

```
Host default
  HostName 127.0.0.1
  User ubuntu
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/username/Vagrants/rails-dev-box/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
```
以上を踏まえて以下に整理

ssh 鍵を入力する部分は`vagrant ssh-config`で出た結果のIdentityFileのprivate_keyまでのパスを選択する。

<img width="478" alt="スクリーンショット 2017-04-19 0.20.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/19716/203f584a-c168-974c-9fb9-ff8ac68acc32.png">


---

以上でvagrant上のmysqlのデータを快適に見ることが出来るようになります！
PowerBuilder - 「PowerBuilder」とはなんぞや？（初心者向け）

# **はじめに**

オープン系のWebシステムとスマホアプリをメインの主戦場としておりますが、たまに業務系や基幹系のお話しを伺うことがあり、そこで「**PowerBuilder**」なる「聞いたことあるけど、単語以上のことは何も知らない」ネタを頂きましたので調べてみました。

# **想定読者**

下記のような方々は恐らく役立つと思います。

* 「PowerBuilderという単語を初めて聞いた」
* 「聞いたことあるけど、何が出来るの？」
* 「ウチのシステムはPowerBuildrってので作られてるらしいけど、何それ？」

# **PowerBuilderとは**


## **単語**

"PowerBuilder" 以前に、基本となる単語をば。

* IDE ( Integrated Development Environment : 英語, 統合開発環境 )
* RAD ( Rapid Application Development : 英語, 計算機プログラミング環境)
* SAP SE ( Systemanalyse und Programmentwicklung Societas Europaea ： 独語, 企業名 )
* Appeon : 企業名
* OData ( Open Data Protocol : 英語, データの照会や更新などを行うリソースベースなプロトコル )

## **PowerBuilderで出来ること**

PowerBuilderは主として業務用アプリケーションに使用されている。サードパーティ製の拡張機能をビルドすることが可能であり、 Appeon社 や Visual Expert 社が提供している。

PowerBuilderはIDEに位置づけされるものであり、C++やC#で書かれている。また、PowerBuilderを使用することで、Microsoft Visual Basic, Microsoft Access のように、GUIでウィンドウの表示などの処理を記述することができる。

## **PowerBuilderの提供会社**

SAP と Appeon が2010年にSybaseからPowerBuilderを取得したあと、2016年にAppeonが開発とサポートの中心的な役割を担うことで合意している。

## **PowerBuilderの歴史**

- 1991 : Powersoft によって開発される
- 1993 : Powersoft が株式公開する
- 1995 : Sybase により $904 million で取得する
- 2010 : $5.8 billion で SAP が取得する
- 2010 : メジャーアップデートを行い、Microsoft .NET Framework に対応する
- 2014 : OData, dockable windows, 64-bit native applications に対応する

PowerBuilder は下記のような理由によりしばらく元気がなかったらしい。

- 1996年に水増しされた売上報告が発見され、Sybaseの株が急落した後、Powersoftの初期開発チームのメンバーの多くがSybaseを離れた
- Microsoft Visual Basic, Microsoft Access, and Delphi のような、GUIでデータベースと接続を作ることが出来る競合の製品によってマーケットのシェアを減らした
- PowerBuilderはWebで遅く、ライバル企業がWeb開発をサポートをする中で、長らく2層構成（伝統的なクライアント - サーバ構成）に基づく開発を続けた。2層構成による開発はスピード感のある開発が出来る一方で、N層システムに対してスケーラブルな拡張性に欠ける面がある。

## **所感**

* 一時期は隆盛を極めたようですが、2000年代以降は元気がない模様
* 2007年のマイナビニュースで COBOL 同様に「◯んだ技術？」として取り上げられている
* 2010年にSAP/Appeonが取得してから、.NET対応したりして開発とサポートは継続している

PowerBuilder自体をどのように販売しているかまだ調べきれていないですが、下記のようなイメージであってるかな。。

1. SIerがPowerBuilderのライセンス購入
2. SIerがPowerBuilderを使ってアプリケーション作成
3. 作成したアプリケーションをクライアントに納入

> - （ネットを見る限りだと）日本では販売代理店がサポート含めて対応している感じがする。
- 枯れた技術とは言え、隆盛を極めただけあって使用経験のある企業やエンジニアはそこそこいるはず。
- 隆盛を極めたころにPowerBuilderを使用して納入されたアプリケーションのサービス寿命が近づいているところが沢山ありそう。ただし、別サービスにコンバートするには相応のコストがかかるため、予算とコストを鑑みなからIDE/RADを使用して決められた枠に沿った作り直しするか、本格作り直しするか、そのまま使い続けるか、、、といったところか。。

※あくまで所感です



# **参考**

* [PowerBuilder - Wikipedia](https://en.wikipedia.org/wiki/PowerBuilder#History)
* [Sybase - Wikipedia](https://ja.wikipedia.org/wiki/Sybase)
* [[公式]Appeon](https://www.appeon.com/)
* [RAD (計算機プログラミング環境) - Wikipedia](https://ja.wikipedia.org/wiki/RAD_(%E8%A8%88%E7%AE%97%E6%A9%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E7%92%B0%E5%A2%83))
* [[公式]Powersoft](http://www.powersoft-services.co.uk/)
* [実例から考える、HTML5時代のエンタープライズ・アーキテクチャ - HTML5 Experts.jp](https://html5experts.jp/mitsuruog/9518/)
* [OData を使用して PSQL データベースをスマートフォン / タブレット アプリで使用可能に - AG TECH CORP.](https://www.agtech.co.jp/products/pervasive/psql/Odata/)
* [パワービルダーという開発ツールがすごく便利だとききます。どこがどのように便利である（であった・・）のかを、茶飲み話として知りたいです。 - 人力検索はてな](http://q.hatena.ne.jp/1075436681)
* [本当に"死んで"いる? さびれゆくコンピュータスキル"トップ10" - 米誌調査 - マイナビニュース](http://news.mynavi.jp/articles/2007/05/28/deadskills/)
Pepper会話アプリ「ほぼ会話(2歳)」の使い方

#Pepperと会話したかったのに・・・
ペッパーのある日常で、困っていることといえば
話しかけても会話が成立しないことではないでしょうか?

このアプリは基本的な会話のプログラミングにより
話しかけたワードによって日常会話が成り立つアプリです。

今はまだ2歳児なので、決められた返答しかできず、
聞き取り能力も未熟ですが、

将来的にはどんどんバージョンUPをしていく予定です。
(バージョンUPすると、1つ歳をとります。)

いつの日か、「ほぼ会話(100歳)」のリリースを夢見て…。

#アプリのインストール
ダウンロードしたアプリのペッパーへのインストール方法は、以下のページからご確認ください。
アキナイアプリインストール手順書
http://qiita.com/trustring_pepper/items/50e253c6b99f929d3daf

※弊社のサービスは、Biz版のPepperのみのサービスではなく、一般向けのPepperをお持ちのお客様も対象にしております。
　そのため、インストールするためのPCが必要となります。何卒ご了承くださいませ。

#ほぼ会話(2歳)は会話を楽しむアプリ
Pepperに話しかけると応答してくれるアプリです
標準のフリートークのモードだといまいち会話が成り立たなくてがっかり・・・
そんなときに試してください

#会話するまでの流れ
##アプリのインストールが終わるとロボアプリランチャーにアイコンが表示されます
![IMG_7746.JPG](https://qiita-image-store.s3.amazonaws.com/0/175870/5276212c-4166-c45d-eced-114863d2f825.jpeg)

##ほぼ会話(2歳)のアイコンをタッチしてください
![IMG_7747.JPG](https://qiita-image-store.s3.amazonaws.com/0/175870/60de1718-a3cb-7836-4094-e25cac14b4b5.jpeg)

##ロゴが表示されるので少し待ちます
![IMG_7749.JPG](https://qiita-image-store.s3.amazonaws.com/0/175870/ce4f1650-fe82-4fe0-b829-83aef0ffcb7a.jpeg)

##会話の待ち受け画面になるので話しかけます
![IMG_7750.JPG](https://qiita-image-store.s3.amazonaws.com/0/175870/eadb3456-70bc-640c-a49d-370773bd418b.jpeg)

##どんな風に話しかけたらいいの？
###あいさつや褒めてあげたりしてください
おはよう
元気？
かわいい
名前は？
アルバイト？
時給いくら？
何ができるの？
ただいま
しゃべって
おっけーぐーぐる
へいしり
###ほかにもまだまだ反応する言葉があります。探してみてくださいね。

##でもお高いんでしょ？
執筆時点（２０１７年４月）では無料です
２０１７年５月から有料化予定です
複数アプリが使えて低価格定額制という野心的なアプリストアです
気になった方、興味がある方はアプリストアも御覧ください

---
アキナイアプリインストール手順書
http://qiita.com/trustring_pepper/items/50e253c6b99f929d3daf
アプリストア：Akinai App Market for Pepper
http://akinaiapp.com/
開発元：トラストリング株式会社
http://www.trustring.jp/
Ubuntuで見る動画がカクつくので対処

OSが32bitだったので64bitに入れ直したら直った。

# 重かった時の状況
PC:Optiplex990(SSF)
OS:Ubuntu16.04(32bit)
CPU:Intel(R) Core(TM) i7-2600
メモリ:2GB×2 + 4GB×2 = 12GB

クロームで動画を見るとカクつく。

スペックはそんなに悪くないはずだし、システムモニターを見てもメモリを食いつぶしてたりCPUを1コア独占していたりするプロセスはない。

しかし動画を見ていると数秒毎に一瞬画面が固まる。

# 結論に至るまでの過程
他の処理が普通に動く時でも動画はカクつく。
クローム以外のブラウザではカクつかない。
よりスペックの低いWindowsPCのクロームで動画を見てもカクつかない。
となると、Ubuntu上のchromeが何かおかしいでの動画再生がなにかおかしい。

調べてみると、Googleはlinux向け32bit版chromeの開発を打ち切っていた。
https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/FoE6sL-p6oU
インストールはできるが、ブラウザ自体のバージョンも内臓されているFlash Playerのバージョンもとても古いものしか入れられない。

そもそもなんで32bitのUbuntuを入れていたかというと、以下のような意見を見たことがあったから。

 * Windowsは32bit版だとメモリを4GBバイトまでしか詰めないけど、Ubuntuではそんなことはない。
 * 64bit版も32bit版も処理速度はそんなに変わらない。
 * 64bit版はまだ32bit版に比べて不安定。

けどchromeの開発が終わりに向かっている32bitを使い続ける方がどう考えても不安定。
そういう訳で64bit版に置き換えました。

するとchromeのバージョンは新しくなり、動画もスイスイ動くようになりました。
俺式Latexチャートシート


毎週進捗レポートを強要されている人が毎回利用しているLatexのチャートシートです.

## Latexのすヽめ
LaTeXは, 他のレポート作成ツール(ex Word)と比べて, 簡単に`章立ての変更`, `図へのキャプション`, `参照` が可能です.

### 外部TeXファイルの参照
外部ファイルを参照することにより, とても完結したTex lifeを送れます.

```
\input{./_dir_/_name_.tex}
```

### 画像貼り付け
パッケージにdvipdfmxを利用するとpngも表示できる.
\usepackage[dvipdfmx]{graphicx}

```tex:img
\begin{figure}[htbp]
	\begin{center}
	\includegraphics[width=5cm]{file.png}
	\caption{captionString}
	\label{fig:type}
	\end{center}
\end{figure}
```

### ソースコード挿入
lstinputlistingのタイトルを\begin{document}の前で宣言しておくことで名前を変えられる.
\def\lstlistingname{リスト}

```tex:list
\lstinputlisting[caption=captionString,label=list:listString]{./source.txt}
```

### テーブル
そのまま tableです。
`tabular`のオプションはそれぞれ以下のような意味を持っています。

|オプション|意味|
|:--:|:--:|
|`l`|左寄せ|
|`c`|中央揃え|
|`r`|右寄せ|

```tex:table
\begin{table}[htb]
  \begin{center}
    \caption{caption_string} 
    \begin{tabular}{|l|c|r|} \hline
      aa & bb & cc \\ \hline
    \end{tabular}
    \label{table:labelString}
  \end{center}
\end{table}
```
macOS で node.js から Headless Chrome を操作してスクレイピング

# はじめに

この記事は、[macOS で Headless Chrome を試す](http://qiita.com/gorohash/items/eb7d898ce96f5c5a71fd) の続きです。
macOS 上で Chrome をヘッドレスモードで起動するまでは、前の記事を読んでください。

# 下準備

node.js でスクリプトを書く準備をするため、以下のコマンドを実行します。
なお、node.js はあらかじめインストールされていることを想定しています。

```
$ mkdir try-headless-chrome && cd try-headless-chrome

$ npm init --yes
```

## chrome-remote-interface をプロジェクトに追加する

プログラムから Headless Chrome を操作するためには、Chrome Debugging Protocol を利用します。これを node.js から使うための [chrome-remote-interface](https://github.com/cyrus-and/chrome-remote-interface) を npm を用いてプロジェクトに追加します。

```
$ npm i -S chrome-remote-interface
```

# 発生した通信内容を取得してみる

では、実際にスクリプトを書いて http://qiita.com に含まれる `img` タグを取得してみます。

```js:index.js
// chrome-remote-interface を読み込む
const CDP = require("chrome-remote-interface");

CDP(client => {
  client.Page
    .enable()
    .then(() => {
      // Qiita にアクセス
      return client.Page.navigate({ url: "http://qiita.com" });
    })
    .then(() => {
      // DOM を取得
      client.DOM.getDocument((error, params) => {
        if (error) {
          console.error(params);
          return;
        }

        // ルート以下の img タグを取得
        const options = {
          nodeId: params.root.nodeId,
          selector: "img"
        };
        client.DOM.querySelectorAll(options, (error, params) => {
          if (error) {
            console.error(params);
            return;
          }

          // 取得した各タグの情報を表示
          params.nodeIds.forEach(nodeId => {
            const options = {
              nodeId: nodeId
            };
            client.DOM.getAttributes(options, (error, params) => {
              if (error) {
                console.error(params);
                return;
              }
              console.log(params.attributes);
            });
          });
        });
      });
    });
}).on("error", err => {
  console.error(err);
});
```

これを実行すると、以下のような結果が得られるはずです。
なお、これを実行する際には Chrome がヘッドレスモードで起動している必要があります。方法は前回の記事 [macOS で Headless Chrome を試す](http://qiita.com/gorohash/items/eb7d898ce96f5c5a71fd) を参考にしてください。

```
$ node index.js
[ 'class',
  'landingHeader_siteid',
  'src',
  'https://cdn.qiita.com/assets/siteid-large-c5f1d2812cc28cb0621d57061b9eb0f5.png' ]
[ 'class',
  'landingOtherServices_serviceLogo',
  'src',
  'https://cdn.qiita.com/assets/landing-kobito-0868b90bcc1770f0e1c98a513fdc0154.png' ]
[ 'class',
  'landingOtherServices_serviceLogo',
  'src',
  'https://cdn.qiita.com/assets/landing-team-6e3e3b738fc71c1c1d8c838218c8f94f.png' ]
```

# まとめ

node.js から Headless Chrome を操作して任意のタグの情報を抽出するまでをやってみました。ここから先は [Chrome Debugging Protocol のリファレンス](https://chromedevtools.github.io/debugger-protocol-viewer/) を参考に試行錯誤していくしかなさそうです。

# 参考

* [Headless Chromium](https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md)
* [How to install and use Headless Chrome on OSX](https://objectpartners.com/2017/04/13/how-to-install-and-use-headless-chrome-on-osx/)
Ubuntuが重かったので対処

以前Ubuntuがやたら重かった時にウィンドウマネージャーをMutterにしたら直ったという話。

ただし根本的な原因はよくわからなかった上に、最近再現しようと思ってもできなくなっていた。

# 重かった時の状況
PC:Optiplex990(SSF)
OS:Ubuntu16.04
デスクトップ環境:MATE
CPU:Intel(R) Core(TM) i7-2600
メモリ:4GB

そんなに悪くないスペックのはずなのにマウスカーソルがカクつくぐらい重たかった。

# 結論に至るでの過程
システムモニターを開いてみると、プロセスを見る限りではメモリが大量に使っていたりCPUが100%近くになっていたりするプロセスはなかった。

が、リソースタブを開いて見るとCPUの一つのコアだけ100%まで使いこまれていた。
そのコアの使用率が下がったと思ったら、入れ替わるように別のコアの使用率が100%近くになる。

再度プロセスタブを確認すると、Xorgの使用率が13%になっていた。100%/8≒13%なので、どうもこれが怪しい。

Xorgについて調べてみると、どうもウィンドウマネージャーが関係するプロセスらしい。

ウィンドウマネージャーはMATE Tweakというアプリのウィンドウで設定ができる。
デフォルトでは「Macro (Compton GPU コンポジット)」だかになっていたはず。

調べてみると「Macro (コンポジットなし)」にすると軽くなるよ、という話も有ったが、私の環境ではそれにしても効果が無かった。

MutterというウィンドウマネージャーにするとXorgの挙動が落ち着いてPCが軽くなった。
大人の科学Vol.27 JapaninoをUbuntu16.04で触ってみた

# はじめに

[はじめての Arduino - プロ生勉強会 第35回](http://www.nicovideo.jp/watch/sm27204809)を見て、Arduinoを触りたくなった。
そんな折、Japaninoが付録の大人の科学を積読していたのを思い出し、触ってみたので、その時の作業内容を忘れないようにメモしておく。

# 手順
## PC環境
- Ubuntu16.04 64bit

## 光残像キット組み立て
本にとても丁寧に書いてあるのでそのとおりに組み立てる。
なぜか本がない場合は、下記サイトで組み立て方が配布されていた。
http://otonanokagaku.net/magazine/vol27/pdf/vol27furoku.pdf

## arduino開発環境インストール
```shell-session
sudo add-apt-repository ppa:arduino-ubuntu-team
sudo apt-get install arduino 
arduino&
```

（初回のみ）シリアル通信するために、「dialout groupに追加しますか？」というダイアログが表示されるので、"Add"。
すると下記のような画面が表示される。

![Screenshot from 2017-04-17 22-14-17.png](https://qiita-image-store.s3.amazonaws.com/0/37714/bf8b5c9e-45c1-bc2f-ccea-c3cc9bf98835.png)

## PCとJapaninoを接続
JapaninoのUSB端子をPCに接続する（USB延長ケーブルがあったほうが取り回しやすい）。

## arduino SDKの設定
1. 「ツール」＞「マイコンボード」＞「Arduino Pro or Pro Mini (3.3V,8MHz)w/ATmega168」
2. 「ツール」＞「シリアルポート」＞「/dev/ttyUSB1」（Japaninoを挿すと見える） 

## Lチカ実行
1. 「ファイル」＞「スケッチの例」＞「01.Basics」＞「Blink」
2. マイコンボードに書き込む
3. 7番のLEDが光れば成功！

## I♥U実行
1. [Japanino特設サイト](http://otonanokagaku.net/japanino/index.html)から、[pdeファイル](http://otonanokagaku.net/japanino/sketch/pde/poviloveu.pde)をダウンロード。
2. 「ファイル」＞「開く」＞「1.のespを選択」
3. マイコンボードに書き込む
4. ハンドルを一生懸命回すと「I♥U」の文字が！

ちなみに、「I♥U」のスケッチには日本語コメント(EUC-JP)が入っていて、上記arduino SDKだと文字化けした。
エンコード変えるか日本語版SDKをビルドすれば回避できると思うが、~~めんどくさい~~日本語コメントが好きじゃないので、放置。

# 参考ページ
[UbuntuでJapanino](https://www16.atwiki.jp/saltysugar/pages/11.html)
zshの便利コマンド(？)たち

# bash & zsh

```shell-session
$ bash
$ zsh
```
でそれぞれbash, zshに切り替えることができます.


#引数なしcd

```shell-session
$cd
```

だけだとホームディレクトリにいきます.

でもこれはbashでも同じみたいですね.

とくにホームディレクトリに行きたいことは多々あるのでこれは自分もとても重宝してます.

## ちなみに

とくにitermやhyperを使ってるといちいち

```shell-session
$ cd ~/hogehoge/foo/repo_name
```

みたいな煩わしいこともあります.
そんなときは

```shell-session
$ pwd ~/bar
$ z repo_name 
$ pwd ~/hogehoge/foo/repo_name
```

素晴らしい...

よくつかうディレクトリを優先的に移動の対象にしてくれるようです.

逆に一度もzで移動したことがない or ほとんど移動したことがないようなディレクトリは何度かcdで移動する必要はあるみたいです.

###セットアップ
[ここ](https://github.com/rupa/z)からzipでダウンロードして

```shell-session
$ echo 'export PATH=$PATH:Users/PATH_TO_z.sh' >> ~/.zshrc
$ echo 'source ~/PATH_TO_z.sh' >> ~/.zsh_profile
```

ハッピーハッキング.


# !
<b>一つ前のコマンドを!の数に応じて返します.</b>
<b>特に!が偶数個の時は、2より何倍大きいかによって一つ前のコマンドをその倍数分だけ倍にしてコマンドに入力されます.</b>
<b>奇数個の時はさらに末尾に！をつけて返します</b>

![arinomama.png](https://qiita-image-store.s3.amazonaws.com/0/105153/d8d29176-e00b-82a0-17b1-60ea8c026582.png)


```shell-session
$ hogehoge
=> zsh: command not found: hogehoge(当然)
$ !!!!! #(5個の!なので5 = 2*2 + 1), つまりhogehoge*2 + !
$ hogehogehogehoge!

$ foo
=> zsh: command not found: foo
$ !!!!
$ foofoo
```
<img width="277" alt="スクリーンショット 2017-04-18 23.24.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/105153/92aef3f2-07f8-6b60-048c-ba88b446debf.png">

<img width="286" alt="スクリーンショット 2017-04-18 23.24.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/105153/98805d6e-57eb-ea69-24c5-e536aec1dce1.png">


##つまりこういうこともできるわけです

<img width="385" alt="スクリーンショット 2017-04-18 23.25.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/105153/f108cbed-e1b1-d8cc-a097-9f79e78c209d.png">

誰得.


# r 
<b>一つ前のコマンドを返してくれます.</b>
`!` と違うのはコマンドラインにオートコンプリートしてくれるのに対して `r`は値を返すということ.

<img width="266" alt="スクリーンショット 2017-04-18 23.28.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/105153/d15b9171-e2b6-aa41-7e4f-7d47c18b4a4a.png">



# おわりに
これらはたまたま見つけたコマンドたちでかなり印象に残ってたものたちです.

今後も謎コマンド見つけたら随時更新して行く & 謎コマンドあったらコメントお願いします🙇
ElasticCacheのバックアップとリストア

## ElasticCacheのバックアップ/リストアについて検討したメモ

### 概要と制限
- クラスタモードが有効な場合、全てのインスタンスタイプにて自動バックアップとリストアをサポートする
http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/backups.html#backups-constraints

- プライマリからのバックアップ作成は、アプリケーションに影響が出るため、レプリカからのバックアップが望ましい。
なお、手動バックアップはノード毎に20回/24時間まで
http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/backups.html#backups-performance

- 最大バックアップ保持期限は35日

### 方針
#### バックアップ
①ElasticCacheのバックアップ機能を利用せず、バッチ処理で1時間毎、1日毎にRDSのバックアップを作成する
- ElasticCacheからS3に書き込むIAMロール作成
- S3のバックアップ用バケットに時間、日付のディレクトリを作成
- 時間毎のバックアップは各レプリカで順繰りに作成、48時間を超えるバックアップは削除する
- 日付毎のバックアップは、夜中などに時間毎の最終バックアップをコピー、30日を超えるバックアップを削除
> - バックアップの保存期間や保存頻度の設定・管理が柔軟
> - クラスタモードが無効、かつt*インスタンスの場合はバックアップ用のリードレプリカ外部インスタンスを立てる
> - バッチ処理はlamdaやawsBatchの利用を想定
http://htnosm.hatenablog.com/entry/2015/08/26/090000

②ElasticCacheのバックアップ機能を利用せず、バッチ処理で1日毎にRDSのバックアップを作成する
- ElasticCacheからS3に書き込むIAMロール作成
- S3のバックアップ用バケット作成
- 夜中などにバックアップ作成、30日を超えるバックアップを削除
> - バックアップの保存期間や保存頻度の設定・管理が柔軟
> - クラスタモードが無効、かつt*インスタンスの場合はバックアップ用のリードレプリカ外部インスタンスを立てる

③ElasticCacheのバックアップ機能を利用して、1日毎にRDSのバックアップを作成する
- ElasticCacheからS3に書き込むIAMロール作成
- S3のバックアップ用バケット作成
- 自動バックアップ設定を行う
> - バッチを作成・管理しなくて良い、細かい設定が必要なければ一番お手軽
> - クラスタモードが無効、かつt*インスタンスの場合は利用不可

上記を設定、検証、手順作成

#### リストア
- バックアップから新しいクラスタを作成
- 既存のクラスタを削除
- エンドポイント用に新しいクラスタの名前を既存クラスタ名にリネーム
もしくは、
- バックアップから新しいクラスタを作成
- 既存クラスタを空にして新しいクラスタのデータを投入
- 新しいクラスタを削除
http://blog.serverworks.co.jp/tech/2016/07/25/redis-scaledown/

上記を検証、手順作成

### 確認事項
- 利用されるのはクラスタモード有効/無効のもの?
- バックアップ周期が適切か不安

### 追記
一般的にはキャッシュサーバのバックアップを取るのはレアケースであり、結果的に本件では利用しなかった。
利用するケースはあると思う。
react+Recharts注意点

# react+redux+immutable+rechartsアーキテクチャ
　流行なreact.jsアーキテクチャの利用で気づいたことをメモする。

## rechartsコンポーネントのdata属性はネイティブなJavaScriptの配列に限られる。
　react+reduxアーキテクチャでstateには変更不可のコレクションが好ましい。
　例えば、stateに保存されるデータの型immutable.jsのList場合、list.toJS()でJavaScript配列に変換してからdata属性に設定しなければならない。

## rechartsのLineで描画される線の太さ
　ドキュメントに公開されていないが、属性strokeWidth={2}のように設定すれば、線の太さを調整できる。

## immutableを使う理由
- setなどのメソッドでコレクションを変更しようとすると、コピーされた新しいオブジェクトを返すことができる。
- リストやマップなどの複雑のオブジェクトが深いコピーが行える。
- 機能豊富であり、便利なコレクションやメソッドが提供されている。
PHPで学ぶデザインパターン(Adapterパターン)

# Adapterパターンとは
異なる2つのインターフェース(API)の間に入って、その差を埋めるためのデザインパターンのことをAdapterパターンと呼びます。
すでにあるものと必要なものの間に入ってその差を埋めるようなイメージです。

AクラスがBクラスを呼び出そうとする際に、何かしらの不都合があって呼び出せないとしましょう。
その際にBクラスを変更するのではなく、新しくCクラスを作成して、AクラスはCクラス経由でBクラスを呼び出そうとする仕組みです。
図にするとこんな感じですかね。

<img width="506" alt="スクリーンショット 2017-04-18 23.00.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/144753/5f646302-f2aa-3bff-0769-a8179306f252.png">


# Adapterパターンで登場する概念
1. Target 
必要となるメソッドを定義しています。
先ほどの例でいうところの吹き出しに当てはまります。

2. Client 
呼び出し元
先ほどの例でいうところのAクラスに当てはまります。

3. Adaptee 
適合される側のことで、すでに何かしらのメソッドを持っています。
先ほどの例でいうところのBクラスに当てはまります。

4. Adapter 
今回のデザインパターンのメイン部分です。
clientとadapteeの間に入り、targetを満たすようにします。
先ほどの例でいうところのCクラスに当てはまります。

# 簡単なコードを書いてみる

## Adaptee
既存のコードと仮定します。元々Bannerクラスはあったとしましょう。

```php
class Banner
{
    private $string;
    
    public function __construct($string)
    {
        $this->string = $string;
    }

    public function showWithParen()
    {
        echo "(" . $this->string . ")";
    }

    public function showWithAster()
    {
        echo "*" . $this->string . "*";
    }
}
```

## Target
clientから先ほどのBannerクラスを直接呼び出せないと仮定し、adapterパターンを使ってそれを解決したいです。
解決するために必要なメソッドを考えinterfaceとして定義しておきます。

```php
interface Output
{
    public function outputWeak();

    public function outputStrong();
}
```

## Adapter
clientとadapteeの間に入り、targetを満たすようにadapterを作成します。
これにより既存のadpteeであるBannerクラスには変更を加えずに、clientから呼び出せるようになりました。

```php
class OutputBanner extends Banner implements Output
{
    public function __construct($string)
    {
        parent::__construct($string);
    }

    public function outputWeak()
    {
        $this->showWithParen();
    }
    
    public function outputStrong()
    {
        $this->showWithAster();
    }
}
```

## Client
ここでadapterであるOutputBannerクラスを呼び出します。


```php
class Main
{
    public function main()
    {
        $ob = new OutputBanner("hoge");
        $ob->outputWeak();
        $ob->outputStrong();
    }
}
```

# メリット
既存のコードを再利用しやすいということと、既存のコードに手を加えなくて済むということでしょうか。
手を加えなければテストコードを書き換える必要もありませんし、不具合があっても対象が追加したadapterの部分であるということはわかりやすいと思います。

## 実務で使っている場面
自分が触っているプロダクトでは、一部ソースコードのリプレイスを行いました。
そのため極力リプレイス前の古いコードは直接使用しないように、このadapterパターンを使っています。
古いコードを再利用しつつ、リプレイス後のディレクトリへコードを書き、リプレイス前のコードは直接使用しないようにしています。

# 参考
Java言語で学ぶデザインパターン入門
[Do You PHP](http://d.hatena.ne.jp/shimooka/20141211/1418298136)
[TECHSCORE](http://www.techscore.com/tech/DesignPattern/Adapter/Adapter1.html/)
VIRLをProxy環境、ローカルNTPサーバを使う場合の設定

[前提]
・VILRサーバから見たProxyサーバのIPアドレスは192.168.1.254、proxyポートは3128とする
・VILRサーバから見たNTPサーバのIPアドレスは192.168.1.253とする

#1. Proxy関連の環境設定
##1.1. bashrcファイルの設定

```
$ sudo nano .bashrc
---最下位に追記---
export http_proxy=http://192.168.1.254:3128/
export https_proxy=https://192.168.1.254:3128/
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$https_proxy
```

##1.2. virlファイルの設定
・「proxy: True」と「http_proxy: http://192.168.1.254:3128/」を追記

```
$ sudo nano /etc/virl.ini
---
## Is your system behind a http proxy?
## Default
proxy: True

## Example
## proxy: True

## IF enabled above what is your web proxy?
## Default
http_proxy: http://192.168.1.254:3128/
```


##1.3. aptコマンドの環境設定

```
$ sudo nano /etc/apt/apt.conf
---最下位に追記---
Acquire::http::proxy "http://192.168.1.254:3128/";
```

#2. NTP関連の環境設定
##2.1. NTPファイルの設定
・「server pool.ntp.org iburst」と表示されている行を削除、「server 192.168.1.253」を追記

```
$ sudo nano /etc/ntp.conf
---
server 192.168.1.253
```

##2.2. virlファイルの設定
・「ntp_server: 192.168.1.253」を追記

```
$ sudo nano /etc/virl.ini
---
## If behind a firewall/proxy change this to an ntp server thats reachable from$
##
## Default
ntp_server: 192.168.1.253
## Example
## ntp_server: ntp.ubuntu.com
```

#3. VIRLサーバ再起動
・上記設定をVIRLサーバ再起動にて反映させる

```
$ sudo shutdown -r now
```

#4. （参考）非インターネット環境でVIRLを使う場合
・VIRLはアクティベーションの関係でインターネットアクセスが必須だが非インターネットアクセス環境でも一応は使える。
最低限、NTPサーバだけローカルで準備して設定、アクティベーション問題を回避する方法は以下コマンドを打つとよい。

```
$ sudo salt-call state.sls virl.hostname.init
```

（参考）
https://learningnetwork.cisco.com/thread/98908
http://community.dev-innovate.com/t/cannot-use-virl-without-internet-connection/3627/60
Kotlin で Async (await) な LINE BOT を書いてみた

SDK は公式の Java SDK がそのまま使える。

1. webhook を受け取る
2. 非同期で getProfile を呼ぶ
3. 完了したら、TextMessage で返す

```kotlin
package com.example

import com.linecorp.bot.client.LineMessagingClient
import com.linecorp.bot.model.event.MessageEvent
import com.linecorp.bot.model.event.message.TextMessageContent
import com.linecorp.bot.model.message.Message
import com.linecorp.bot.model.message.TextMessage
import com.linecorp.bot.spring.boot.annotation.EventMapping
import com.linecorp.bot.spring.boot.annotation.LineMessageHandler
import kotlinx.coroutines.experimental.future.await
import kotlinx.coroutines.experimental.future.future
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication


@SpringBootApplication
@LineMessageHandler
open class Application(val client: LineMessagingClient) {
    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            SpringApplication.run(Application::class.java, *args)
        }
    }

    @EventMapping
    fun echoText(event: MessageEvent<TextMessageContent>) = future<Message> {
        val userProfile = client.getProfile(event.source.userId).await();
        return@future TextMessage("${event.message} from ${userProfile.displayName}");
    }
}
```
[ Laravel ] Laravelことはじめの時に参考としているサイト

さて、とあることからLaravelでサイトを組み始めています。(2016年12月のことです)
基本、公式サイトを一通り目を通しますが、やっぱり説明が簡素なのと、サンプルコードが少ないので、チュートリアル系のサイトは重宝しています。
その中でも、これは参考になっているかな？というのをぼへぼへの独断と偏見でセレクトしています。

基本、英語のサイトですがコード読めれば大丈夫かと思います。
あと、自身の使っているバージョンと、記事に書かれているバージョンには気をつけましょう。


# LaravelAPIの検索サイトが便利

- [Namespaces \| Laravel API](https://laravel.com/api/5.3/index.html)
    - 例） Modelクラス
        - [Illuminate\\Database\\Eloquent\\Model \| Laravel API](https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html#method_getKeyName)

# Laravelのチュートリアルが満載

- [Laracasts Video Courses on PHP, JavaScript, and more\.](https://laracasts.com/series)
    - ビデオチュートリアル、step by stepでわかりやすい

- [Laravel Tutorials \| Learning Laravel](http://learninglaravel.net/tags/tutorials)
    - その名も[Learning Laravel](http://learninglaravel.net/)、Laravelを学ぶリソースが満載です。

- [Tag Archive for "laravel" \| Scotch](https://scotch.io/tag/laravel)
    - 簡単な実例があって、わかりやすい

- [SCode](http://www.hc-kr.com/)
    - 動画は見ていませんが、tips的なのは記事からも拾えます


# 参考になる記事が多いサイト

- [Articles \- Laravel 5 \- Devartisans](http://devartisans.com/categories/laravel5)
- [Laravel Archives \- Tutsnare](http://tutsnare.com/category/tutorials/laravel/)
次元解析で考える

# 次元解析とは(Wikipediaより)

>次元解析（じげんかいせき、英: dimensional analysis）とは、物理量における、長さ、
>質量、時間、電荷などの次元から、複数の物理量の間の関係を予測することである。
>物理的な関係を表す数式においては、両辺の次元が一致しなくてはならない。この規則を逆に
>利用すると、既知の量を組み合わせ、求めたい未知の物理量の次元に一致するように式を立て
>れば、それは正しい関係式になっている可能性が高い。

要するに、欲しい量の **単位** から、与えられた量をうまく組み合わせなさいという話です。

# 簡単な例（速度とか道のりとか時間とか)

簡単な例として、小学校で習う"みはじ"を見てみます。

## それぞれの単位

道のりの単位：m（メートル）
時間の単位：　s（秒）
速さの単位： m/s （秒速Xメートル）

## 例題
さとるくんが時速100kmで３０秒間ダッシュしたときに進む距離は何mか。

## 考え方

求める量は距離。単位はm（メートル）。
与えられた量は、時速。単位はkm/時（１時間あたりにXkm）
あとは継続時間。単位は秒（30秒）

求める量の単位になるように、与えられた量の組み合わせをとります。
そのための準備として、単位をそろえます。

時速100km　＝　100km/時 = 100 x 1000 m/時 = 100 x 1000m/時(3600秒/時）= 27.77 m/秒

求める量の単位は m 。一方、与えられた量の単位は　m/秒　と　秒

答えは簡単で、

進む距離（m）＝27.77 (m/秒) x 30 (秒) = 27.77 x 30 (m/秒 x 秒) = 833.1 (m)
※単位も数字と同じようにかけたりわったりする。 m/秒 x 秒 = m ➗ 秒 ✖️　秒　= m

## 例題：２９年度春期情報処理試験より。
>本社と工場の間で専用線で接続してデータを伝送するシステムがある。
>このシステムでは2000バイト/件の伝票データを２件ずつまとめて、それに400バイトのヘッダ情報を付与して送っている。
>伝票データは１時間に平均100,000件発生している。回線速度を1Mビット/秒としたとき、回線利用率はおよそ何％か。

## 考え方

求める量は、回線利用率（％）ですが、これは **無次元量（単位なし量）** です。 
で、回線利用率を考えます。
どういう関係式で考えてもいいですが、問題に出てきている単位を見てみると
「バイト（ビット）」、「件」、「時間（秒）」があります。
単位なし量を求めるということは、すなわち、
**同じ単位を持つ量どおしで割り算する**
ということです。この問題の場合には、バイト➗バイトになるように式を組み立てるか、
件➗件になるようにするか、あるいは（件/時間）➗（件/時間）のようにするかいくらか考えられます。

### 出てきた量を並べてみる

* 伝票データの容量：2000B/件
* １回の送信件数：2件/回
* ヘッダーの容量：400B/回　（１回の送信で１個のヘッダをつけている）
* １時間あたりの伝票データ件数：100,000件/時
* 回線速度：1Mビット/秒（１秒間で１Mビットのデータを流**せる**）

### 二次的な量を求める

手近なところから、組み合わせて意味ある量を作る。

* **１回の送信データ量（B/回)** ＝ [伝票データ量] + [ヘッダーデータ量] = 2000(B/件) x 2 (件/回) + 400 （B/回） = **4400 (B/回)**

* １時間あたりの送信データ回数（回/時） =  100,000(件/時) ➗ 2 (件/回) = 50,000 （回/時）
　→１時間に50,000回データ送信をしている。

### さらに高次の量を求める。

二次的な〜のところで、　B/回という単位を持つ量と、回/時 という単位を持つ量が出てきたので、
これをかけてみる。

* 単位：B/回 x 回/時　＝　B/時　→**１時間あたりの送信データ量！！！**
* 数値： 4400 x 50,000 = 220 （MB/時）

ここまでくれば大体わかってくるかなと。
回線速度は一秒あたりのデータ容量　→　3600倍すれば、１時間あたりのデータ容量になる

ということで、
### 最後の答え ###

利用率＝使う量➗使える量＝１時間あたりの送信データ量　➗　１時間あたりのデータ容量
　＝　220M(B/時) ➗ (1M x 3600) （bit/時）= 220 M(B/時) ➗ 450M (B/時) = 0.4888

百分率に直すと49％になります。


おわり。
Prestoで配列を行に変換する




# 配列 -> レコード

## 配列が入っているカラムをそれぞれ別レコードに変換したい

例えば`tbl`テーブルの`time_ranges`カラムに以下のような配列が入っているとする。

```
["16:00~16:30","16:30~17:00","17:00~17:30","17:30~18:00","18:00~18:30","18:30~19:00","19:00~19:30","19:30~20:00","20:00~20:30","20:30~21:00","21:00~21:30"]
```

### クエリ例

```sql
SELECT 
  time_range
FROM
  tbl CROSS
JOIN
  UNNEST(time_ranges) AS t(time_range)
```

### 実行結果
<img width="294" alt="スクリーンショット 2017-04-18 22.46.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/23487337-c7ca-30b6-ef23-e33e65f30848.png">





## 配列の順番も合わせて別々のレコードに変換したい

`WITH ORDINALITY`句をつけて、配列の順番を格納するカラムをUNNEST後のカラム構造の末尾に追加すればよい。


### クエリ例

```sql
SELECT 
  time_id,
  time_range
FROM
  tbl CROSS
JOIN
  UNNEST(time_ranges) WITH ORDINALITY AS t(
    time_range,
    time_id
  )
```

### 実行結果

<img width="443" alt="スクリーンショット 2017-04-18 22.44.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/1ef6f0bf-1c67-437b-b0a9-fdb13bfe7eb1.png">


## 文字列の配列が入っているカラムをそのまま連結した1つの文字列にしたい

`ARRAY_JOIN' を使えば一発なことに気づいた

```
SELECT
  ARRAY_JOIN(ARRAY['Hello', ' ', 'World', '!'], '')
```

以下は不要

~~`REDUCE`関数を使って、`CONCAT`をapplyする。~~

```
SELECT
 REDUCE(ARRAY['Hello', ' ', 'World', '!'],
        '',
        (s, x) -> CONCAT(s, x),
        s -> s)
```

## 参考
Presto Documentation
https://prestodb.io/docs/current/sql/select.html

https://prestodb.io/docs/current/functions/lambda.html#reduce
PostgreSQLをビルドする(Win10 x64)

# 趣旨

仕事で提案する前提でPostgreSQLを勉強することにしたんですが、Windows版の公式ビルド(zip/exe)の再頒布ライセンスが明確に説明されていなかった(見つけられなかった？)ので怖くて使えず、自分でビルドする所から始めてみることにしました。

# 環境

この記事では、最小要件(config.pl無変更)かつx64ネイティブのみを対象とします。

```cmd:systeminfo
OS 名:                  Microsoft Windows 10 Pro
OS バージョン:          10.0.14393 N/A ビルド 14393
OS 製造元:              Microsoft Corporation
OS 構成:                スタンドアロン ワークステーション
OS ビルドの種類:        Multiprocessor Free
システム製造元:         Microsoft Corporation
システム モデル:        Virtual Machine
システムの種類:         x64-based PC
プロセッサ:             1 プロセッサインストール済みです。
                        [01]: Intel64 Family 6 Model 60 Stepping 3 GenuineIntel ~3200 Mhz
BIOS バージョン:        Microsoft Corporation Hyper-V UEFI Release v1.0, 2012/11/26
システム ロケール:      ja;日本語
入力ロケール:           ja;日本語
タイム ゾーン:          (UTC+09:00) 大阪、札幌、東京
Hyper-V の要件:         ハイパーバイザーが検出されました。Hyper-V に必要な機能は表示されません。
```

## 1. 必要なファイルをダウンロードする

- [x] PostgreSQL 9.6.2 ソースコード  
    ライセンス: [The PostgreSQL Licence (PostgreSQL)](https://www.postgresql.org/about/licence)  
    配布元: https://www.postgresql.org/ftp/source/v9.6.2
- [x] Visual C++ 2015 Build Tools  
    配布元: http://landinghub.visualstudio.com/visual-cpp-build-tools  
    備考: VC++ 2017 は執筆現在、PSQL側のビルドステップが対応していない為、使用するとエラーとなります。
- [x] Visual C++ Build Tools 2015 Update 3 (x86 and x64)  
    配布元: https://my.visualstudio.com/downloads  
    備考: 「Visual C++ Build Tools 2015 Update 3」でページ内検索して下さい。
- [x] Diff (DiffUtils for Windows)  
    配布元: http://gnuwin32.sourceforge.net/packages/diffutils.htm
- [x] Strawberry Perl  
    配布元: http://strawberryperl.com

## 2. 開発環境を整備する

### 1. Visual C++ 2015 Build Tools をインストール

![vc2015bt.png](https://qiita-image-store.s3.amazonaws.com/0/12642/108a89cd-823f-6a5c-1b0d-6ee2e2a18b29.png)

PostgreSQLのビルドではWindows SDKを使用する為、「Windows 8.1 SDK」も追加機能として選択する必要があります。

### 2. Visual C++ Build Tools 2015 Update 3 をインストール

コンパイラやライブラリなどのバグ修正が含まれているため、同時に済ませておきます。

### 3. Diff をインストール

![diffutils.png](https://qiita-image-store.s3.amazonaws.com/0/12642/269170af-544a-9fb5-06c8-e6e6e093a884.png)

インストール先のbinフォルダを PATH 環境変数に追記する必要がある為、このパスは控えておいて下さい。
完了後、PATH 環境変数に追記します。

![path.png](https://qiita-image-store.s3.amazonaws.com/0/12642/de46775e-75f9-cab8-25ed-5af89ca14452.png)

### 4. Strawberry Perl を展開

ポータブル版の場合、PostgreSQLをビルドする前に portableshell.bat を実行する必要がある為、
展開したパスを控えておいて下さい。

### 5. PostgreSQL を展開／ビルド

展開後、スタート メニューから```Visual C++ 2015 x64 Native Build Tools Command Prompt```を実行し、
作業フォルダを```[PostgreSQL]src\tools\msvc```に変更します。

```config_default.pl``` を、 ```config.pl``` にコピーします。

```[StrawberryPerl]portableshell.bat``` を実行し、Perlへのパスを通します。

```build``` を実行すると、ビルドステップが開始されます。

完了後、 ```install [好きな場所]``` を実行すると、 ```pg_``` から始まる各種ツールや、
```include```、 ```lib``` などのフォルダが生成されます。

![psql.png](https://qiita-image-store.s3.amazonaws.com/0/12642/56bac6f0-800a-202e-fbd3-f8805ac79bc7.png)

# 参考

* Windowsにおけるソースコードからのインストール (日本PostgreSQLユーザ会)  
  https://www.postgresql.jp/document/9.6/html/install-windows.html