OmniAICreator/Qiita-1.07M huggingface dataset:
php csvファイル読み込み

#php csvファイル読み込み

csvファイルを読み込んで、中身を配列で返却。
ファイルが開けない場合は例外を投げる。

```php:
public function readCsv($path) {
    try {
        $file = new SplFileObject($path);
        $file->setFlags(
            SplFileObject::READ_CSV | 
            SplFileObject::READ_AHEAD | 
            SplFileObject::SKIP_EMPTY | 
            SplFileObject::DROP_NEW_LINE
        );
    } catch (RuntimeException $e) {
        throw $e;
    }
    $res = [];
    if (empty($file) == FALSE)
        foreach ($file as $v) 
            $res[] = $v;
    return $res;
}
```
ファイルの読み込み設定は下記となります。

>SplFileObject::DROP_NEW_LINE
>行末の改行を読み飛ばします。
>
>SplFileObject::READ_AHEAD
>先読み/巻き戻しで読み出します。
>
>SplFileObject::SKIP_EMPTY
>ファイルの空行を読み飛ばします。期待通りに動作させるには、READ_AHEAD フラグを有効にしないといけません。
>
>SplFileObject::READ_CSV
>CSV 列として行を読み込みます。

※配列にして返してますが、$fileをそのまま返しても良い気がする・・・。


##備考
php7.0以降で書く場合は、引数・戻り値ともに型指定ができるので下記になる。


```php:
public function readCsv(string $path) :array {}
```

**参考(SplFileObject クラス)**
http://php.net/manual/ja/class.splfileobject.php
C++プログラマだけど、Intel RealSense SDKを使って笑顔度を判定したい（準備編）

自分のアプリに笑顔度を判定する仕組みを入れたかったんだけど、製品は馬鹿みたいに高いので、お安いものをと探したら「Intel RealSense SDK」に行き当たりました。

ということで、とりあえずダウンロードからインストール、そしてサンプルプログラムの実行までをまとめてみます。

ちなみにカメラはUSBカメラを使う想定です。
あとOSはWindowsです。
※RealSenseは**Windows版**しか無い

#SDKのダウンロード
「Intel RealSense SDK」のダウンロードは[ここ](https://software.intel.com/en-us/intel-realsense-sdk/download)から行うのだが、その前にアカウントを作っておくように。
（仮登録後、Intelからメールが送られてきて、Verifyを行います）

ログイン後、「Face Tracking & Recognition」をダウンロードする。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/130771/2e0344cf-5dce-b9dd-aa73-f866ac3457e6.png)

2種類のインストーラ（Online版かOffline版）が指定できるが、やや大きいがOffline版の方がおすすめ。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/130771/a90478b0-183c-0aa8-8493-4d2ed9086fea.png)

#SDKのインストール
ダウンロードしたファイルを実行して、インストールを行う。
これはそんなに難しくない。
（というか、ほとんどの工程が難しくない）
![image3.png](https://qiita-image-store.s3.amazonaws.com/0/130771/c4dff03b-e22e-8cf0-3f51-483d9dbafac6.png)

#サンプルの実行
おそらく、
　C:\Program Files (x86)\Intel\RSSDK\bin\x64
にサンプルの実行モジュールが置かれているので、「FaceTracking.exe」を実行してみます。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/130771/55327ea0-f4cd-b575-222a-ab9313d28fb4.png)

いきなり「Start」ボタンを押しても動きません。
メニューの「Profile」を「2D」に切り替える必要があります。
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/130771/aa25495d-29ab-18f3-de18-4ec5f8db2c3b.png)

これで「Start」ボタンを押すと動き出します。
ただこれでは笑顔度が表示されません。
一旦止め、「Expressions」をチェックします。
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/130771/f2df6e61-20d9-83ce-31c5-542715dff6fd.png)

これで実行すると、画面左側に様々な文字情報が表示され、その中の「Smile」の値が笑顔度になります。（0～100）
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/130771/9fb86928-f559-8aba-cea0-de17a26c3753.png)

あとはこのサンプルのソースが
　C:\Program Files (x86)\Intel\RSSDK\sample\face\FaceTracking
にありますので、これを参考にしながら自分のアプリを作成します。

なお、SDKのリファレンス等は
　C:\Program Files (x86)\Intel\RSSDK\doc
にあります。（PDFかヘルプファイル）

#その他
このサンプルを他のPCに持って行っても動きません。
ランタイムが必要なのですが、インストーラがありません。
てことで、これはヘルプの通り、
　C:\Program Files (x86)\Intel\RSSDK\runtime
を実行モジュールと同じところにコピーすると動くようになります。
![image9.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3d5c00e5-622b-d6f8-bd09-ae166517da4f.png)

なお、古いバージョンのランタイムは、[ここ](https://software.intel.com/en-us/articles/previous-intel-realsense-install)の下の方にあります。
![image8.png](https://qiita-image-store.s3.amazonaws.com/0/130771/6de25e00-67cd-552c-2886-76a80967436d.png)
PL/SQLプロシージャで　ORA-01861　で詰んだ件

今まで動いていたPL/SQLプロシージャが
ある日突然動かなくなりました。

```
ORA-01861 : literal does not match format string (リテラルが書式文字列と一致しません。)
```

３つの問題が同時に起きていたのを切り分けできず
相当な時間を浪費してしまったケースをご紹介。


#答えから先に言うと、

- 日付のformatが異なっていると発生するOracleエラー
- nls_parametersのdate_langが勝手に書き換えられていた
- プロシージャの入力がDATE型で、入力に至る前に暗黙的なVARCHAR→DATEをやってた

という３つの問題が同時発生していました。

##いろんな書き方をするよねみんな

日付を文字列で表現するときは、
人によっていろんな書き方をします。

例えば「2017年1月12日」なら

```
'17-01-12' --'RR-MM-DD'
```

だの

```
'12-JAN-17'　--'DD-MMM-RR'
```

だの

```
'20170112'　--'YYYYMMDD'
```

だの

人によってかなり好き勝手に表現します。


これの指定が間違っている時に
ORA-01861
が発生します。

#フォーマットを指定して変換する例

```
TO_DATE('17-01-12','RR-MM-DD')
```


第二引数を省略した場合は
環境変数的なNLSパラメータに依存します。


#NLSパラメータを確認するSQL

```
 select * from v$nls_parameters;
```


# プロシージャの処理の前で暗黙的な変換してた件！



```
create or replace PROCEDURE hoge(
  inputHoge IN OUT VARCHAR2
  inputDate IN OUT DATE
  )
```

で、ここが一番悩んだのですが、

ORA-エラーを吐いていたのは
プロシージャの入力がDATE型だったので
そこで暗黙的変換をしていたのに気が付かなかったのです。

以下のように変更して回避しました。

```
create or replace PROCEDURE hoge(
  inputHoge IN OUT VARCHAR2
  inputDateChr IN OUT VARCHAR2
  )
```

一度文字列型のまま受け取って、
プロシージャの下の方で明示的に変換する処理を追加。


この投稿が誰かのお役に立てば幸いです。
【Python入門】breakを使ってループを止める方法とは?

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】breakを使ってループを止める方法とは?](http://programming-study.com/technology/python-break/)

#【Python入門】breakを使ってループを止める方法とは?


Pythonのループ文にはfor文とwhile文の2種類が用意されており、for文は一定の回数、while文は特定の条件を満たす間、処理を繰り返していきます。同じ処理を何度も入力しなくても繰り返してくれる便利な構文ですが、時には途中でループ文を抜け出したくなる時があります。そんな時はbreak文を使えば処理を中断し、ループ文を抜け出す事が出来ます。今回はbreak文の使い方について説明します。


ループ処理を途中で終了したい場合は、if文を使えば疑似的に実現することができます。例として、ループの要素を調べ、100より大きい数字があった場合はエラーとなるコードを書きたいとします。

```
list1 = [24, 55, 32, 65, 74, 120, 72, 67]

loop_flag = 0

for num in list1:
    if(loop_flag == 0):
        if(num < 100):
            print(num)
        else:        
            loop_flag = 1
    

if(loop_flag == 1):    
    print('エラー：無効な数字が見つかりました')
```

実行結果
>
24
55
32
65
74
エラー：無効な数字が見つかりました

この例では、ループを続けるかどうかのフラグ（loop_flag）を用意し、条件を満たす数字が出てきた場合にはフラグを1にしてループ内の処理を実行しないようにしています。この方法なら見かけ上はループを中断しているように見えますが、実際には途中から何もしないループをしているだけでとても無駄ですし、コードも長いです。こんな時はbreak文を使いましょう。

```
list1 = [24, 55, 32, 65, 74, 120, 72, 67]

for num in list1:
    if(num >= 100):
        print('エラー：無効な数字が見つかりました')
        break
    
    print(num)
```

実行結果
>
24
55
32
65
74
エラー：無効な数字が見つかりました

実行結果はさきほどと全く同じですが、breakを使ったほうが短いですし、見やすいですね。break文はループ文の中で主にif文とともに使われます。if文で特定の条件を満たした場合に、break文を使ってループを途中で中断し、抜け出します。break文以降の構文はすべてスキップされるので、エラー文などを表示する際は、break文より前に記述するようにしましょう。

##while文におけるbreak文

途中でループを中断するbreak文ですが、当然while文で使うこともできます。

```
list1 = [24, 55, 32, 65, 74, 120, 72, 67]

index = 0

while(index < len(list1)):
    if(list1[index] >= 100):
        print('エラー：無効な数字が見つかりました')
        break
    
    print(list1[index])
    index += 1
```

実行結果
>
24
55
32
65
74
エラー：無効な数字が見つかりました

さきほどのfor文をwhile文に置き換えましたが、break文の使い方は同じです。もちろん結果も同様になります。

##else節とbreak文

Pythonのfor文およびwhile文にはif文と同様にelse節が用意されています。ループ文のelse節は、その繰り返しが正しく終了する場合に実行されます。例えば、一通りループ文を回した後に、そのループ文が終わったことを伝えるメッセージを表示したい場合は、次のようになります。

```
list1 = [24, 55, 32, 65, 74, 120, 72, 67]

index = 0

for num in list1:
    print(num)
else:
    print('ループが完了しました。')
```

実行結果
>
24
55
32
65
74
120
72
67
ループが完了しました。

同じループのブロックの中で、最後の一度だけ処理を行うことが出来るので、非常に便利なelse節ですが、実はbreak文でループを抜けた場合は実行されません。

```
list1 = [24, 55, 32, 65, 74, 120, 72, 67]

index = 0

for num in list1:
    if(num >= 100):
        print('エラー：無効な数字が見つかりました')
        break
    
    print(num)

else:
    print('ループが完了しました。')
```

実行結果
>
24
55
32
65
74
エラー：無効な数字が見つかりました

こちらは、これまでの例と同様に100以上の数字が見つかった場合はエラーとなり、ループをbreakで抜けるようにしています。すると、最後のelse節が実行されず、「ループが完了しました」というメッセージは表示されません。

breakとelseを使えば、「breakをしたかどうか判断し、していない時だけ特定の処理をする」ことが簡単に出来ます。

本来であればbreakしたかどうかを判断するための変数を用意して、if文で変数の中身を確認してbreakしたかどうかを判断します。無駄な変数が増えてしまいますし、面倒ですね。else節なら、その中にbreakしていない時だけ行う処理を書くだけで終わってしまいます。無駄な変数もif文も必要ありませんね。
Rmagickのインストールでエラー (2017/1版)

すでにQiitaには複数の「Rmagickインストールでエラー」記事がありますが、新しい事由によりエラーが起きていた記録のまとめ

```
$ brew install imagemagick
```

ではうまくいきません。
(最新のImageMagick 7がインストールされてしまい、ディレクトリ構成がrmagickの想定と一致しない)

# 正しい手順

以下の問題を解決しています

 * 7.x には対応していないので imagemagick の古い(6.x)バージョンを指定している
 * 最近のHomebrewが自動的に`brew update`を実行するのを抑止して`brew install` している
 * pkgconfigの設定が指定されていない問題を修正

```
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
$ git checkout 6f014f2b7f1f9e618fd5c0ae9c93befea671f8be
(ImageMagick 6の最後のリビジョン)
$ cd -
$ export HOMEBREW_NO_AUTO_UPDATE=1
$ brew install imagemagick
$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig bundle install
$ unset HOMEBREW_NO_AUTO_UPDATE
```
Amazon Linux上でcomposerをインストールしてみる

## 動作環境
Amazon Linux AMI release 2016.09

### 1.下記のコマンドを実行
`curl -sS https://getcomposer.org/installer | php`

[ec2-user@localhost ~]$ curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading 1.2.4...

Composer successfully installed to: /home/ec2-user/composer.phar
Use it: php composer.phar

### 2.下記のコマンドを実行
`sudo mv composer.phar /usr/local/bin/composer`

[ec2-user@localhost ~]$ sudo mv composer.phar /usr/local/bin/composer

### 3.下記のコマンドを実行
`which composer`

[ec2-user@localhost ~]$ which composer
/usr/local/bin/composer


下記のサイトを参考にさせていただきました。
ありがとうございました！

参考
https://www.crunchtimer.jp/blog/technology/php/4993/
【Python入門】range関数で繰り返し処理をする方法とは?

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】range関数で繰り返し処理をする方法とは?](http://programming-study.com/technology/python-range/)

#【Python入門】range関数で繰り返し処理をする方法とは?

Pythonではfor文を使って一定の回数だけ処理を繰り返すことがあります。その際に、数値のリストを用意してその長さだけ回すこともできますが、rangeを使うともっと楽に、Pythonらしい記述をすることができます。

今回はPythonのrangeの使い方について説明します。

##rangeの使い方

Pythonで一定回数処理を繰り返す場合は、その回数文の長さのリストを使うことで実現できます。例えば、5回繰り返したい場合は長さ5のリストを使います。

```
list1 = [1, 2, 3, 4, 5]
count = 0

for x in list1:
    count += 1
    
print('ループ回数：{}'.format(count))
```
実行結果

>ループ回数：5

この方法でも問題はありませんが、例えば100回や1000回といった長い回数繰り返す場合は、それだけの長さのリストを用意するのは面倒ですし、時間もかかります。

特定の数だけループを繰り返したい場合はrange関数を使いましょう。range関数は指定した長さの、連続した整数のリストを自動で生成する関数です。for文とrange関数を組み合わせることで、任意の回数だけループをすることができます。

```
for 変数 in range([始まりの数値,] 最後の数値[, 増加する量]):
    #ループ処理
```

rangeには始まりの数値、最後の数値、増加する量の3つの引数がありますが、このうち始まりの数値と増加する量は省略することができます。range()に数値を1つ渡すと、それが最後の数値となり、0から「最後の数値 – 1」までの値が格納されたリストが作成されます。

```
count = 0

for x in range(5):
print(x)
    count += 1
    
print('ループ回数：{}'.format(count))
```
    
実行結果
>
0
1
2
3
4
ループ回数：5

この例ではrange()に5を渡しているので、「0から4までの要素を持つ長さ5のリスト」が作られ、そこから一つずつ要素を取り出すので、5回のループを行うことができます。最初の数字を0ではなく任意の数字にしたい場合は、引数の「始まりの数値」を入力します。

```
count = 0

for x in range(1, 5):
    print(x)
    count += 1
    
    
print('ループ回数：{}'.format(count))
```

実行結果
>
1
2
3
4
ループ回数：4

rangeの引数を(5)から(1,5)に変更しました。これにより、rangeによって返されるのが「1から4までの要素を持つ長さ4のリスト」になったので、ループ回数が4回になりました。

また、「増加する量」を指定すれば、次の要素に追加される値も自由に変えることができます。これにより、0から8まで2ずつ増えるリストや、0から9まで3ずつ増えるリストなどを簡単に作ることができます。

```
count = 0

for x in range(0, 10, 2):
    print(x)
    count += 1
    
print('ループ回数：{}'.format(count))
```

実行結果
>
0
2
4
6
8
ループ回数：5

この例では開始が0, 最後が10になっていますが、増える量を2にしています。そのためrangeは「0から8まで2ずつ増える長さ5のリスト」を返すことになるので、ループ回数は5回となります。

また、rangeでは負の数を使うことができます。始まりの値と最後の値を逆にし、増える量を負の数にすることで、逆順に並んだリストを作成することもできます。

```
count = 0

for x in range(10, 0, -2):  #負の数を渡す
    print(x)
    count += 1
    
print('ループ回数：{}'.format(count))
```

実行結果
>
10
8
6
4
2
ループ回数：5

##xrangeとの違い

Pythonのバージョンが2.x.xの場合は、rangeとよく似た関数としてxrangeがあります。xrangeは使い方や実行結果はrangeと全く同じです。

```
count = 0

for x in xrange(5):
print(x)
    count += 1
    
print('ループ回数：{}'.format(count))
```

実行結果
>
0
1
2
3
4
ループ回数：5

では、rangeとxrangeとの違いは何かというと、xrangeのほうがメモリを節約できるという点です。rangeは引数で指定された要素を持つリストを作り、そのリストから要素を取り出すようにしてfor文を実行します。これに対してxrangeでは最初にリストを作ってからfor文を実行するのではなく、for文で取り出す際に必要に応じて値を生成します。つまりリストを作らないため、同じ処理を行う上でもxrangeのほうがメモリを節約することができます。

ただ、rangeとxrangeの差はとても些細なものなので通常ではわざわざxrangeを使う必要がありません。基本的にはrangeを使うとよいでしょう。

また、Python3系では、rangeの構造がxrangeに近いものになったのでxrange自体が廃止されてしまいました。そのため、Python3系の場合は特に気にせずrangeを使うとよいでしょう。
Rで「来店した動機はなんですか？」のアンケート結果を分析

# はじめに
Rを使って「来店した動機はなんですか？」という内容のアンケート結果を分析する方法を記録したいと思います。
今回は「通りがかり」「知人の紹介」などの来店動機を、性別ごとに分析しようと思います。

# 対象データ
```data:enquete.csv
sex,trigger
"男性",""
"女性","通りすがり"
"男性","通りすがり"
"女性","知人の紹介"
"男性","通りすがり"
"女性","通りすがり"
"女性","知人の紹介"
-------
```
左から→性別,きっかけ
となります。
こんな感じのcsvデータを利用します。

# 結果グラフ
![graph.png](https://qiita-image-store.s3.amazonaws.com/0/156795/41a9b876-273c-47f3-4841-8b0f8cba1d34.png)

![pie_m.png](https://qiita-image-store.s3.amazonaws.com/0/156795/b0d05bee-74e4-0003-550c-2f75cd60d63d.png)

![pie_f.png](https://qiita-image-store.s3.amazonaws.com/0/156795/6fc0b14c-2831-38ce-20e2-0a75cdabedb2.png)

# コード
```
# ggplotのインストール
install.packages("ggplot2")

# dplyrのインストール（データフレーム操作を支援するライブラリ）
install.packages("dplyr")

# モジュールのロード
library(ggplot2)
library(dplyr)

# csvの読み込み（先頭行をヘッダに。ファイル文字コードはUTF-8。セパレータは,）
# パラメータをきちんと明示した方が安定する
# encoding="UTF-8"とfileEncoding="UTF-8"は違うので注意
df <- read.csv("enquete.csv", header = TRUE, fileEncoding="UTF-8", stringsAsFactors = FALSE, sep = ",")

# 先頭行を出力
head(df)
##     sex    trigger
##  1 男性
##  2 女性 通りすがり
##  3 男性 通りすがり
##  4 女性 知人の紹介
##  5 男性 通りすがり
##  6 女性 通りすがり

# 性別ときっかけどちらかが空白のデータは除外
df <- df[df$sex != "", ]
df <- df[df$trigger != "", ]

# 先頭行を出力
head(df)
##     sex    trigger
##  2 女性 通りすがり
##  3 男性 通りすがり
##  4 女性 知人の紹介
##  5 男性 通りすがり
##  6 女性 通りすがり
##  7 女性 知人の紹介

# 性別ときっかけそれぞれでgoroupする（dplyrの機能）
df <- group_by(df, trigger, sex)

# group対象の行数をカウントしてcountというカラムを追加（dplyrの機能）
df <- summarize(df, count=n())

# arrangeを使ってtriggerの降順で並び替え（dplyrの機能）
df <- arrange(df, desc(trigger))

# 先頭行を出力
head(df)

##  Source: local data frame [6 x 3]
##  Groups: trigger [3]
##  
##       trigger   sex count
##         <chr> <chr> <int>
##  1 通りすがり  女性   285
##  2 通りすがり  男性   180
##  3 知人の紹介  女性    96
##  4 知人の紹介  男性    36
##  5 ネット検索  女性   132
##  6 ネット検索  男性   105

# plotを作成（棒グラフ用）
gp <- ggplot(
  df,
  aes (
    x = trigger,
    y = count,
    fill= sex
  )
) 
gp <- gp + geom_bar(position = "dodge", stat = "identity") 
gp <- gp + ggtitle("来店動機の男女比")
plot(gp)

# plotを作成（男性円グラフ用）
df_m <- data.frame(
  trigger = df[df$sex=="男性","trigger"],
  count = df[df$sex=="男性","count"]
)
gp <- ggplot(df_m, aes(x="", y=count, fill=trigger))
gp <- gp + geom_bar(width = 1, stat = "identity")
gp <- gp + coord_polar(theta = "y")
gp <- gp + ggtitle("男性の動機")
gp

# plotを作成（女性円グラフ用）
df_f <- data.frame(
  trigger = df[df$sex=="女性","trigger"],
  count = df[df$sex=="女性","count"]
)
gp <- ggplot(df_f, aes(x="", y=count, fill=trigger))
gp <- gp + geom_bar(width = 1, stat = "identity")
gp <- gp + coord_polar(theta = "y")
gp <- gp + ggtitle("女性の動機")
gp
```

# まとめ
今回は「来店した動機はなんですか？」のアンケート回答結果の分析をしてみました。
参考になりましたでしょうか。
RでユーザーのホームディレクトリをOS非依存に取得する方法

Rでユーザーのホームディレクトリを取得する方法。
Mac, Linux, Windowsに対応。
MacとLinuxの両方に同じ解析用のデータをホームディレクトリの下の階層に保存していて、
MacとLinux両方でデータを解析する際に使ってます。
例えば、リモートのLinuxのサーバーで重めの計算をして、手元のPCでデータをまとめたり、可視化する場合とか。

```R:RScript
> homeDir <- switch(Sys.info()[["sysname"]],
                    "Linux"   = paste0("/home/",    Sys.info()[["user"]]),
                    "Darwin"  = paste0("/Users/",   Sys.info()[["user"]]),
                    "Windows" = paste0("C:/Users/", Sys.info()[["user"]]) )
> homeDir
[1] "/Users/JeJeNeNo"
> setwd(paste(homeDir, "Directory", "For", "Analysis", sep="/"))
```
飲食店経営者がillustratorを習得したら全部自分でデザインできた

※こちらの記事は、プロスタ編集部がプログラミングの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[飲食店経営者がillustratorを習得したら全部自分でデザインできた](http://programming-study.com/case/illustrator-design/)

#飲食店経営者がillustratorを習得したら全部自分でデザインできた

飲食店を経営している30代前半男性がillustratorを習得して、看板やチラシ等を自分でデザインできるようになった話です。

##自分でデザインするためにillustratorを始めた

私は飲食店を経営しているのですが、開店当初に決めていたコンセプトがありました。それは我々が満足のいくお店を作るのではなく、お客様に満足してもらえるようなお店づくりをしようということでした。特に私のお店にはお子さんにも多くご来店して頂きたかったので、私好みのシックというよりは可愛らしいポップな感じにしようと思ったのです。元々イラストを描くことが好きだった私はそのイメージを具現化するのに、他人ではなく自分でデザインしてしまおうと決めました。そこからillustratorを学習する日々が続きました。

##オークションでillustratorを購入

私は物件選びや材料を吟味していていかなければならない中、illustratorを購入することにしました。オークションでillustratorCS6の正規品が50000円程で販売されていたのでそちらを購入しました。それとillustratorはphotoshopよりも難易度が高いという情報を得ていたので、illustrator CS6スーパーリファレンスfor Windowsという書籍を2700円程度で購入して参考にすることにしました。他に行き詰った時にはAdobeやWebデザインレシピというサイトも参考にしました。

##悪戦苦闘の毎日

購入してからは悪戦苦闘の日々で、illustrator内に頻繁に出てくるパスやベジェ曲線といったものからレイヤーというものまでさっぱり意味がわかりませんでした。特にペンツールでベジェ曲線を描くのですが、癖があり過ぎて私の思うようには動いてくれません。結果として、このベジェ曲線だけでもまともに使えるようになったのは、私の場合約4ヶ月ほど必要でした。図形などのオートシェイプやフォントなどは元々Microsoftofficeを使えるので問題ではありませんでした。しかし、基本的なことを習得するのに、毎日illustratorと向き合っても半年はかかってしまいました。とはいえ、どれだけ忙しくてもillustratorを最低1時間は毎日立ち上げて練習していたので、普通に習得しようとしていれば1年以上は必要だったのではないでしょうか。

##たくさん描いて、何度も使って覚えるのがコツ

私は毎日努力して学習したおかげで、お店をオープンする前にはデザインすることが出来るようになっていました。そして開店時には看板やチラシ、popやポスターに至るまで全てセルフプロデュースで行えたのです。もちろんお子さん達にも好評で、グッズを作っても興味を持って購入してくれます。とにかく初心者には難しいベジェ曲線も、慣れしかありません。コツはたくさん描いて、何度も使ううちに覚えていくことでしょう。何度も作品を作っていれば、そのうち壁に当たるのでそれを解決していくのが習得するコツなのではないかと思います。もしも時間が取れない方や、もっと短期間で学習したい人は通信学習などの選択も良いと思います。

【オススメ記事】
➡︎[ Illustratorの本・参考書の評判](http://programming-study.com/language/illustrator-books/)
➡︎[ Illustratorを学べる18スクールまとめ](http://programming-study.com/language/illustrator/)
➡︎[ Photoshopを習得したら格安で販売促進できた話](http://programming-study.com/case/photoshop-restaurant/)
【Progate体験談】非エンジニア起業家がゼロからPHPを学習した話

※こちらの記事は、プロスタ編集部がプログラミングの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【Progate体験談①】非エンジニア起業家がゼロからPHPを学習した話](http://programming-study.com/case/progate-entrepreneur/)

#【Progate体験談】非エンジニア起業家がゼロからPHPを学習した話

非エンジニアの起業家がリリースしたサービスのバグを自分で直すために、[progate](http://programming-study.com/website/prog-8/)でゼロからプログラミングを学んだ体験談です。

##Webサービスのバグを直すためにゼロからプログラミングを始める

Progate（プロゲート）を初めて知ったのはFacebook上で友達がオススメだと投稿していた記事でした。「新しくリリースされたこのオンライン学習サービスは無料なのに使えてスゴイ！」のような内容だったと思います。
その当時の私は起業してWebサービスを開発した直後。これからリリースという時にそのWebサービスに複数のバグが見つかりプログラマーにも逃げられ、もう自分でプログラミングを勉強するしかないと腹をくくっていた時でした。まさに何か良い学習サービスはないかと探していたタイミングでしたので、この紹介記事が目に留まったのです。さらに、学習するならオンラインで分かりやすい教材で、お金もないのでできれば無料のサービスを探していたので、その意味でもProgateは私にうってつけのサービスだったのです。

##全くの初心者でも挫折しないprogate

当時、Progateはまだリリース直後で選択科目はそれほど多くはありませんでした。それでも私が学習したかったWebサービスの開発言語であるPHP（基礎編）はありましたので、すぐに利用登録したのを覚えています。そもそも私は根っからの文系でプログラミングの経験は皆無という全くの初心者なので、プログラミングを覚えられるかどうか以前に、拒否反応が出て挫折しないかが心配でした。ところがProgateは、学習画面や教材の見せ方などが初心者にも分かりやすいようにかなり工夫されていて、不安なくすぐにのめりこむことができたのです。

一般的にプログラミングの学習といえば、分厚い参考書を片手にパソコンに入力し、それをプレビューするには別の小難しいプログラムをインストールしてそれに表示させなければいけなかったりします。ところが、Progateのトレーニング画面は、プログラムの入力画面とそのプレビュー画面が同じ画面内で見られるようになっていて、いちいち別のソフトを起動したりする必要がないので、プログラミングの学習だけに集中することができるようになっています。
また、サンプル問題も分かりやすかったですし、分からなくなればいつでもテキスト教材をワンクリックで確認できますので、サービスが使いにくいなどの余計なストレスは一切感じませんでした。使い心地に関してはかなり優秀なサービスであることは間違いと思います。

Progateの学習カリキュラムは言語やテーマによって違い、学習するテーマ毎に細かく章に分けられていて、それぞれの章が無理なく完結できる程度の量になっています。これだとテキストがぎっしり詰まった教材とは違い、ちょっとした隙間時間にひとつのテーマを完結できるので、テンポ良く無理なく学習することができるのです。これは非常に挫折しにくい仕組みだと思いますね。
結局、私はPHP（基礎編）の全7回を仕事の合間に繰り返しやりながら約2週間をかけて修了しました。PHP（基礎編）を修了すると、最終的にPHPを使った簡単なフォームを自力で作ることができるようになっているのですが、私も自分でフォームのプログラムを書けた時は思わず一人で歓声を上げたのを覚えています。

##プログラミング初心者がぶつかる最大の壁は苦手意識

Progateは主にプログラミングの学習に特化したサービスですが、特に初心者の方にはオススメです。というのも、Progateは、ユーザーがプログラミングの学習に集中できるようにかなり工夫されているので、誰でも最初の障壁を簡単に越えることができるからです。プログラミング初心者にとっての最初の障壁とは、文系・理系とか頭の良し悪しではなく、プログラミングや言語に対する苦手意識そのものです。それを知らずに最初から気合を入れて小難しい参考書を買ってきて、一人しかめっ面でパソコンに向かってしまうと、拒否反応を起こし結局苦手意識を払拭できないまま挫折してしまうのです。
逆に言えば、最初にこの壁さえ乗り越えてプログラミングが面白いと感じることができれば、あとはただ量をこなしてただひたすら勉強すればいいだけです。だからProgateは初心者にオススメなのです。しかも無料なので、もし自分に合わなかったとしても何もリスクはありません。

プログラミング初心者の学習の最大の敵は苦手意識です。食わず嫌いのままプログラミングをあきらめるのはもったいないと思います。もし、少しでも興味があるなら、とにかくまずは始めてみることを強くオススメします。

【オススメ記事】
➡︎[【Progate体験談②】Progateに出会ってプログラミングの面白さにはまった](http://programming-study.com/case/progate-interesting/)
AzureResourceGroup で仮想マシンでApache動かすまで

## まえがき
Azure には AppService がありますが、諸事情で仮想マシンを使ってWebサービスを提供したくなることもあるでしょう  
今回は AzureResourceGroup を使い、スケーラブルな仮想マシンでWebアプリケーションを公開するまでをやります

## 成果
https://github.com/kheiakiyama/arm-virtualmachine-web

VisualStudio から配置すればできます
とはいえ apache のデフォルト画面しか見えません

## 所感
- AzureResourceGroup を VisualStudio で編集するの、エディタが優秀すぎて素の json いじってると思えない
- 仮想マシンのスケールセット、送り込むとマシンごとにアップグレードできたりしていい感じ
- 肝心のアプリケーションに関わる部品をスケールセットのテンプレートにどう組み込むかが課題  
ShellScript で全部書くのはつらいので ansible や chef みたいな何かが欲しくなりそう
- ストレージがいっぱい生まれてどれがどれかよくわからなくなる
VisualStudioTeamServices で AppService 使って DevOps する

## まえがき
[VisualStudioTeamServices](https://azure.microsoft.com/ja-jp/services/visual-studio-team-services/) (以下、VSTS)の Build を見てみると、Azure 周りのデプロイが充実していました。
Azure はポータルでポチポチしてデプロイする派だったのですが、これを機にDevOpsっぽい動きができないか試してみました。

## 今回やりたいこと
- Webアプリケーションのデプロイ(AppService + SQL データベース)
- ソースコードの更新とともに AppService を更新する

## やり方
- VSTS でプロジェクトを作成
- VisualStudio で AzureResourceGroup のプロジェクトを作成  
参考: [Visual Studio での Azure リソース グループの作成とデプロイ](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/vs-azure-tools-resource-groups-deployment-projects-create-deploy)
- VisualStudio で一度デプロイ  
この時点でAzureの構成がデプロイされる
- AppService で「継続的配信(プレビュー)」を設定(これによってVSTSのBuildが作成される)  
以降、コードの更新時に AppService が更新される  

## ダメだったやり方
- Build を自力で Build Definitions から作成し、`Azure App Service Deploy` を使ってデプロイ  
引数の zip をどう用意すべきかがわからず断念
- ARM Template から App Service にデプロイするパターン  
参考: [Deploy Azure Web App using ARM Template from Visual Studio 2015](http://blogs.perficient.com/microsoft/2016/03/deploy-azure-web-app-using-arm-template-from-visual-studio-2015/)  
Blob を介するときにエラーとなり、解決できなかった。  

```
Storage account: xxxx not found. Selected Connection 'ServicePrincipal' supports storage account of Azure Resource Manager type only.
```

クラシックの Storage を間違って使うと発生するエラーと想像したがわからず。

## 所感
- プレビューの機能使うのはどうなの？と思ったが、AppService側はプレビューでもVSTS側は通常の機能を使っているだけ。ステージングなら問題なく使えるんじゃないだろうか。
- 2年ほど前に触ったときは Build 周りが複雑すぎて理解できなかったが、自由度の低いJenkinsくらいにわかりやすくなった  
(私個人としてはMSが用意する設定でないと動かせなったことから、もっと使わないとダメだ)
- AzureResourceGroup がいわゆる infrastructure as code になるのでよさげ
- 本番環境でAzureの構成とソースを一気に更新するフローを考えたい
【schoo体験談】学習のコツは集中して動画を見倒すこと

※こちらの記事は、プロスタ編集部がプログラミングの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【schoo体験談①】学習のコツは集中して動画を見倒すこと](http://programming-study.com/case/schoo-entrepreneur/)

#【schoo体験談】学習のコツは集中して動画を見倒すこと


起業1年目の方がWebサイトのスマホ対応を迫られて、[schoo](http://programming-study.com/school/schoo/)（スクー）を使ってWEBデザインやWordpressを勉強した体験談です。

##使い始めたきっかけはビジネスモデルの研究

様々なテーマの授業動画をオンラインで見ることができる動画学習サービス「schoo（スクー）」を私が初めて知ったのは、schooがリリースして間もない頃でした。当時私は起業１年目だったのですが、良い動画学習サービスがあるらしいという情報を耳にし試しに利用してみたのがきっかけです。つまり、最初は学習目的ではなく、どんなサービスなのか、ビジネスモデルを勉強する目的で利用し始めました。

当時のschooはまだリリース直後ということもあり、閲覧できる授業動画もさほど多くはなかったので、あまり利用はしませんでした。そもそもがビジネス目的でしたし、あと何よりも一度に見ることが出来る動画の数が決まっていたことも利用しない理由でした。（当時はまだ無料のみで見放題サービスはありませんでした）

##Webサイトのスマホ対応をするために猛勉強

私がschooを頻繁に利用するようになったのは最初の利用登録から１年ほど経った頃です。ちょうど運営しているWebサイトのスマホ対応を迫られていた時で、そのために必要な知識を身につけるために再びschooを利用し始めたのです。
この時は既に新設されていた月々の定額見放題を迷わず選びました。無料でも利用はできるのですが、それだとほぼリアルタイムだけで見たい録画動画はほぼ見ることができず勉強にならないからです。

私は早速、最新のWEBデザインやWordpress関連の動画を中心に手当たり次第に見まくりました。特にスマホ化に関係するレスポンシブデザインやCSS3辺りの授業は重点的に何度も視聴して勉強し、過去１年で6時間程度だった視聴時間が2ヶ月間で30時間を超えました。そのおかげでどうにか自力でスマホ対応をすることができるようになったのです。

##集中して関連動画を見倒すのがコツ

schooの動画はひとつのテーマについて講師の方と司会進行役のスタッフが会話形式で授業を行う形式の動画で、会員の閲覧者は生徒（受講者）という形になっています。リアルタイム視聴ならチャットで質問やコメントなどのやり取りができて楽しいのですが、時間の制約があるのと、見たい授業が必ずしもあるとは限らない点がやや難点かもしれません。
ちなみに私の場合は、とにかく1日でも早く知識を身につけたかったので録画やリアルタイム関係なく関連動画を何度も繰り返し見ることに徹しましたが、集中して学習したい場合は定額会員になって時間関係なく動画を見倒すのが良いと思います。
また、schooでは動画だけでなくその授業で使用するテキスト資料も一緒に見ることができるのですが、実はこれが勉強の際にかなり役立ちます。動画を見ながらテキストを見てももちろん良いのですが、プログラムやHTMLなど見るだけでは覚えられないサンプルソースを後から確認する時に非常に便利なのです。

##講師と双方向のコミュニケーションができる動画学習サービス

私が最初に利用した時はまだサービスの方向性が定まっていなかった時期で動画やサービスも充実しているとは言い難かった状況でしたが、今や視聴できる授業動画はジャンル・数共に豊富になっています。動画の良いところはただ見るだけでテキストを読む何倍もの情報を取り込むことができる点ですが、schooはそれに加え個性的な講師陣のトークや双方向のインタラクティブ性もプラスに繋がっていると思います。
もし利用される場合は、まず無料で試しに気になる授業を見てみた後、見たい授業があれば定額会員になって好きな時に好きなだけ見るのが一番オススメの利用方法です。

【オススメ記事】
➡︎[【schoo体験談②】初心者の女性がschooでプログラミングを学んでIT企業に就職した話](http://programming-study.com/case/schoo-woman/)
今までシェルスクリプトで順番に実行していたコマンドを簡単に並列実行させる方法

#スクリプトの実行に時間がかかるのをなんとかしたい
シェルスクリプトで複数のコマンドを実行させたいとき、上から順に1つずつ実行するから終わるまで時間がかかってつらい。

#既存のスクリプト（上から順に実行される）
```
#!/bin/bash
param=huga

./hoge.sh aa 1 $param
./hoge.sh bb 2 $param
./hoge.sh cc 3 $param
./hoge.sh dd 4 $param
```

#並列実行させる方法
```
#!/bin/bash
param=huga

cat << EOS | perl -pe 's/\n/\x00/' | xargs -0 -n 1 -P 3 -I{} sh -c '{}'
./hoge.sh aa 1 $param
./hoge.sh bb 2 $param
./hoge.sh cc 3 $param
./hoge.sh dd 4 $param
EOS
```
実行させたいコマンド群の前後におまじないを書くだけ。

ヒアドキュメントでコマンドをxargsに渡し、shで実行させています。ただ普通に渡すと半角スペースを区切りと判断してしまうので、コマンドの引数が正しく渡されません。そこで一旦改行(\n)をNULLにして、NULLを区切りにするように-0オプションを付けてます。
しかしこのままだと今度は、引数も含めた文字列全体を1つのコマンドとして認識してしまうので、「sh」ではなく「-I{} sh -c '{}'」という風にしています。ちょっとまわりくどいですね。(^^;;

これで一連のコマンドを並列実行してくれて、しかも終了するまでちゃんと待っていてくれます。xargsって素晴らしい！ちなみに -P で並列実行数を変更できます。

他にもっと簡単な方法があるよ！こうゆう場合には動かないよ！という情報がありましたら教えてください。xargsの使い方を1時間前に知ったばかりなもので。(^^;;

##追記：もっとシンプルな方法
```
#!/bin/bash
param=huga

cat << EOS | xargs -L1 -P 3 -I{} sh -c '{}'
./hoge.sh aa 1 $param
./hoge.sh bb 2 $param
./hoge.sh cc 3 $param
./hoge.sh dd 4 $param
EOS
```
akaneharaさんより、よりシンプルな方法を教えていただきました。ありがとうございました。
Unityで INSTALL_FAILED_VERSION_DOWNGRADEが原因で実機テストが出来ない

これまで何度も実機(Androidスマホ)でテスト出来ていたにもかかわらず、ある日突然Build and runでエラーがおきた。

コンソールを見ると以下のメッセージが

[Qiita]
Installation failed with the following output:
[  0%] /data/local/tmp/Package.apk
(省略)
[100%] /data/local/tmp/Package.apk
	pkg: /data/local/tmp/Package.apk

Failure [INSTALL_FAILED_VERSION_DOWNGRADE]

どうやらApkのインストールが失敗しているらしい。

そして答えがまるまる書いてあるのだがINSTALL_FAILED_VERSION_DOWNGRADEと書かれている。

何が起こったかというと、スマホ側にインストールしてあるアプリのVersionの方が新しいと誤解されてしまい
「ダウングレードは無理」と怒られている状態。

これを解決するにはUnityのEdit -> Project Settings -> PlayerでPlayer Settingsを開き
AndroidのタブにあるOther SettingsでVersion/Bundle Version Codeを、スマホ側よりも新しいものにする。

それが嫌ならアプリをアンインストールして、再度インストールすればいい。（これならVersionのチェックが起こらない）


で、なぜこのような問題が起こるかというと
複数のPCでUnityを使っているときに起こりやすい。(Github/Bitbucketなども併用）
あるPCでVersion1.10を作ったのに、それを忘れて別のPCでVersion1.09という名前で作ろうとすると
「それはダウングレードだから無理だよ」と怒られる。
sublime text 3でpackage controlが動かない

しょうもないことですが、調べても前例が出てこなかったので備忘録として。

##sublime text 3でpackage controlが動かない
・package controlが入ってることは確認できた
・エディタ自体をインストールし直したりなどもしてみたが変わらず
※windows端末

##ユーザー設定でignoreされていた
基本設定→基本設定-ユーザ
で設定ファイルを覗いてみると、

```
{
	"color_scheme": "Packages/User/SublimeLinter/Monokai (SL).tmTheme",
	"font_size": 12,
	"ignored_packages":
	[
        "Package Control",
		"Vintage"
	]
}
```

上記のようになっていました。
Package Controlの記述を消してみると、あっさり解決。
この設定した人は後で職員室にきてほしい。

##まとめ
普段使いしていないエディタとはいえ、最低限の設定は知っておきたいと思いました…
OpenCVのdrawContoursに関するメモ書き

# drawContours()
findContours()などで取得した輪郭を描画する関数。

## 使い方
基本的なところは[opencv.org](http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#drawcontours)にある。

# CV_FILLEDってなんだ
opencv.orgにあったソースコードではthicknessにCV_FILLEDが指定されていた。

```cpp:main.cpp
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;

int main(int argc, char** argv)
{
	std::cout << "CV_FILLED is " << CV_FILLED << std::endl;
}
```

```shell-session:result
CV_FILLED is -1
```

CV_FILLEDは-1のことだった。負の数を指定することで塗りつぶしを行っている。
Swift3とAlamofireでPDFファイルをダウンロードしてReaderで表示する


PDFデータをダウンロードしてきて、ローカルに保持しておくサンプルです。

ViewControllerにちょっと書いてみての動作確認になります。

ユーザ作成でなく、バックアップにも含めたいので、Library/ディレクトリに入れます。


```ViewController.swift
override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let destination: DownloadRequest.DownloadFileDestination = { _, _ in
            let documentsURL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask)[0]
            let fileURL = documentsURL.appendingPathComponent("test.pdf")
            return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
        }
        
        Alamofire.download("http://cdn.oreillystatic.com/oreilly/booksamplers/9781491908693_sampler.pdf", to: destination).response { response in
            print(response)
            if response.error == nil, let pdfPath = response.destinationURL?.path {
                print("pdfPath::::\(pdfPath)")
                let document = ReaderDocument(filePath: pdfPath, password: nil)
                if let document = document {
                    if let readerVC = ReaderViewController(readerDocument: document) {
                        readerVC.delegate = self
                        readerVC.transitioningDelegate = self
                        readerVC.modalPresentationStyle = .fullScreen
                        self.present(readerVC, animated: false, completion: nil)
                    }
                }
            }
        }
    }
```

ReaderViewControllerDelegateは必要なので追記

```ViewController.swift
extension ViewController: ReaderViewControllerDelegate {
    func dismiss(_ viewController: ReaderViewController!) {
        self.dismiss(animated: true, completion: nil)
    }
}

```

Alamofire
https://github.com/Alamofire/Alamofire#downloading-data-to-a-file

PDFViewerはこちらを使います。
https://github.com/vfr/Reader
git-grepで特定のディレクトリを除外する

`git-grep` には `--exclude` オプションがないので `ls-files` や パイプラインで除外するしかないと思っていたのだけど、指定するパスにglobのワルドカードパターンで否定条件を渡せることを知った。

```bash
# Vendor/ ディレクトリは除外したい
git grep amazon -- ':!Vendor/' .
```

ダブルダッシュは `--` 以後をオプション(`--hoge`とか)でなくコマンドの引数テキストになることを明示していて、そこにワイルドカードの既述を食わせるために必要らしい。

- [What does "\-\-" \(double\-dash\) mean? \(also known as "bare double dash"\) \- Unix & Linux Stack Exchange](http://unix.stackexchange.com/questions/11376/what-does-double-dash-mean-also-known-as-bare-double-dash)
- [Man page of GLOB](http://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html)

## 参考

[How to exclude certain directories/files from git grep search \- Stack Overflow](http://stackoverflow.com/questions/10423143/how-to-exclude-certain-directories-files-from-git-grep-search) 
で知った。
どの環境のシェルやgrepでも動くのかはまだ知らない。
R(3.6)をUbuntuにインストール

# 背景
Ubuntuのデフォルトの公式レポジトリから利用できるRパッケージは古いので、
最新のR(3.6)が使えるように環境構築する。

# パッケージ管理システムの設定
`lsb_release -cs`でUbuntuのコードネームを確認。Ubuntu 16.04の場合は`xenial`、18.04の場合は`bionic` 。

```bash:ternimal
$ lsb_release -cs
bionic
```

このコードネームを使って、ダウンロード元のミラーサイトを`/etc/apt/sources.list`の末尾に追加します。ここではRStudioのミラーサイトを使います。

```bash:terminal：RStudioのミラーサイトを使う場合
echo -e "\n## For R package"  | sudo tee -a /etc/apt/sources.list
echo "deb https://cran.rstudio.com/bin/linux/ubuntu $(lsb_release -cs)-cran35/" | sudo tee -a /etc/apt/sources.list
```

上のコマンドを実行すると以下のような文字列が`/etc/apt/sources.list`の末尾に追加されているはずです。

```bash:/etc/apt/sources.listの末尾

## For R package
deb https://cran.rstudio.com/bin/linux/ubuntu bionic-cran35/
```

次にダウンロード元の公開鍵を取得して、aptに登録します。

```bash:terminal
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
#上記コマンドがプロキシやファイアウォールの設定などでうまく動かない場合は代わりに次の１行を実行
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

# 上記のコマンドのどちらかを実行した後、次の１行で公開鍵を登録
gpg -a --export E298A3A825C0D65DFD57CBB651716619E084DAB9 | sudo apt-key add -
```
3行目もうまく行かない場合はgpgコマンドに以下のオプションを追加します。
`--keyserver-option http-proxy=http://<アカウント>:<パスワード>@プロキシサーバ:ポート`

# Rのインストールとアップデート
最後にaptでRをインストールします。

```bash:terminal
sudo apt update
sudo apt install r-base
```


# 参考
http://qiita.com/wonder_zone/items/c0cb4033c2a599b3d662
http://askubuntu.com/questions/197564/how-do-i-add-a-line-to-my-etc-apt-sources-list
http://qiita.com/yh_cake/items/68dfc688243be09ab22b
https://refspecs.linuxbase.org/LSB_3.0.0/LSB-PDA/LSB-PDA/lsbrelease.html
https://cran.r-project.org/bin/linux/ubuntu/README.html
https://blog.rstudio.org/2013/06/10/rstudio-cran-mirror/
https://qiita.com/nmatsui/items/816051fe6445db116e9a
dockerのコンテナ・イメージを謎のコマンド群で消すのもいいけどdocker-cleanコマンドもいいよ

謎のワンライナーでかっこよく消してもいいと思うけど、ツールを使いたい人はdocker-cleanを使おう。


## インストール
macなら下記コマンドでインストール

```
brew install docker-clean
```

それ以外の人はこんなかんじで。

```
curl -s https://raw.githubusercontent.com/ZZROTDesign/docker-clean/v2.0.4/docker-clean |
sudo tee /usr/local/bin/docker-clean > /dev/null && \
sudo chmod +x /usr/local/bin/docker-clean
```

## 使い方

止まってるcontainers、タグついてないimages、使ってないvolumes、ネットワークはこれで消せる。
dockerわかんないけど、とりあえず、ゴミを消したい人は`docker-clean run`しとけばOK

```
docker-clean run
```

何もかも消したいときはこれ

```
docker-clean all
```


詳細はここみてね。
[ZZROTDesign/docker-clean: A script that cleans docker containers, images, volumes, and networks.](https://github.com/ZZROTDesign/docker-clean "ZZROTDesign/docker-clean: A script that cleans docker containers, images, volumes, and networks.")
NATゲートウェイの設定 / AWSのプライベートサブネットから、インターネットに接続する

# ◆ 今日やること

AWSのプライベートサブネットから、インターネットに接続する場合、NATゲートウェイが必要です。
プライベートサブネットに配置したEC２インスタンスからyum installとか実行する時に必要ですよね。

NATゲートウェイの設定がないと、インターネットに出て行けません。

```bash

$ sudo yum install -y mongodb-org
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest                                                                          | 2.1 kB     00:00
amzn-updates/latest                                                                       | 2.3 kB     00:00
https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/repodata/repomd.xml: [Errno 12] Timeout on https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/repodata/repomd.xml: (28, 'Connection timed out after 30000 milliseconds')
Trying other mirror.

failure: repodata/repomd.xml from mongodb-org-3.2: [Errno 256] No more mirrors to try.
```

# ◆ 実装編

### > NATゲートウェイの作成

サブネットの選択は、**Publicサブネット**にしましょう

<img width="910" alt="NATゲートウェイの作成.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/4e699779-a38d-b6fd-618b-74f8f78ca3af.png">


### > ルートテーブルの設定をします

0.0.0.0/0の送信先ターゲットを上記で作成したNATテーブルに変更します。

<img width="1051" alt="ルートテーブル.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/04480132-4351-2479-ee65-ca9626b4e3a5.png">

### > 確認

AWSのプライベートサブネットから、インターネットに接続できるようになったかと思います。
以下を実行して、インストールが完了すればOKです。

```bash

$ sudo yum install -y mongodb-org
```
UnityでNCMBプッシュ通知を実現するまでの道のり

NCMBでプッシュ通知を実現するまでの道のり（手順）を、自分のために書いておく。(他の人の役に立つかどうかは不明)

#最初はURLが飛びまくる（たらい回し)

まず以下のURLにアクセスする
http://mb.cloud.nifty.com/doc/current/push/basic_usage_unity.html

すると、以下のURLで設定終わらせろ、といわれるのでアクセス
http://mb.cloud.nifty.com/doc/current/push/basic_usage_android.html

すると、今度は、以下のURLで設定を終わらせろ、といわれるのでアクセス。
http://mb.cloud.nifty.com/doc/current/tutorial/push_setup_android.html


#mobile backendとFCMの連携に必要な設定
このページの作業をすべて終わらせる。
http://mb.cloud.nifty.com/doc/current/tutorial/push_setup_android.html


#Androidでプッシュ通知
上のページの作業がすべて終わったら、こちらのページに戻る
http://mb.cloud.nifty.com/doc/current/push/basic_usage_android.html

で、「Android Manifestの編集」までを行う。
その次の「配信端末情報の登録」はAndroid + Javaなので、Unityは関係ない。

ちなみにインストールするライブラリは3つと書いているが2つでいい。
>SDK Managerで必要なライブラリをインストールする
>Android Support Library
>Android Support Repository（Android Studioの場合）
>Google Play Services

と書いてあるが、以下の知恵袋にあるようにAndroid Support Libraryはインストールしなくていい。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11159189471

以下２つだけインストール
>Android Support Repository（Android Studioの場合）
>Google Play Services


#Unityでプッシュ通知
その作業が終わったら、ようやくUnityのページに戻る。

ページに書いてある通りに作業をすすめる。
http://mb.cloud.nifty.com/doc/current/push/basic_usage_unity.html

「イベントリスナーの登録」はやらなくていい。
それはプッシュ通知を入れ終わった後、やりたいことがある人のための機能。
プッシュ通知自体で必要というわけではない。

「イベントリスナーの登録」をすっ飛ばして、「ダッシュボードからプッシュ通知を配信する」へいって
実際にプッシュ通知してみる。実際にプッシュ通知が来たら成功。

ちなみに当然だけど作ったApkをスマホにインストールして1回は起動しておく必要がある。
ダッシュボードの「installation」に自分のスマホが登録されているなら、プッシュ通知が届く。


#アプリ側でプッシュ通信を行う場合

NCMBのダッシュボード(Web）ではなく、アプリ側でプッシュ通信を行いたい場合は、
以下のように記載すれば、単純なものは飛ばせる。


    NCMBPush push = new NCMBPush();
    push.Message = "message";
    push.Title = "title";
    push.PushToAndroid = true;
    push.SendPush();


#アプリ側でプッシュ通信＋絞込みを行う場合

これが参考になる
https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/263

#アプリ側でInstallationを編集する方法

ここにやり方書いてる
http://mb.cloud.nifty.com/doc/current/push/filter_unity.html

けど、書かれている通りにやるとうまく動かない。
公式のドキュメント通りにやって動かないって何なんですかね・・・。
https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/611
Vim/syntastic/cargo-quickfixを使ってrustcコンパイル結果を確認しながらコードを書く

以下の様なことができるようになります。

![cargo-quickfix with vim](https://camo.githubusercontent.com/bf62a2ddd6f7da70c4e44fbe3fddbc29142bf094/68747470733a2f2f692e6779617a6f2e636f6d2f30333134383166623435646335303162333966383433613962366464353932382e676966 "cargo-quickfix with vim")


## cargo-quickfixのインストール

[cargo-quickfix](https://github.com/hhatto/cargo-quickfix) は `rustc` コンパイル結果をVimのquickfix(errorformat)でパースしやすい形で出力するツールです。 `cargo build --message-format json` の結果をパースして整形表示しています。

インストールは
[cargo-quickfix](https://github.com/hhatto/cargo-quickfix) を `git clone` してきて `cargo install` でインストールします。

[rustup](https://www.rustup.rs/)等を使ってRust, cargoあたりのセットアップは終わってる前提です。

```shell-session
$ git clone https://github.com/hhatto/cargo-quickfix.git
$ cd cargo-quickfix
$ cargo install --force
```

インストールが終わったら、おもむろに`cargo new`で作成したプロジェクトで `cargo quickfix` を実行してみます。

```shell-session
$ cargo quickfix
src/main.rs:3:5: warning: unused import: `std::thread`, #[warn(unused_imports)] on by default
src/main.rs:24:9: warning: unused variable: `stderr`, #[warn(unused_variables)] on by default
```

`ファイル名:行数:カラム数: 警告レベル: メッセージ` の形式で1行につき1つのメッセージを表示します。

## Vim/syntasticと合わせて使う

cargo-quickfixのインストールに引き続き、Vim/[syntastic](https://github.com/vim-syntastic/syntastic)用に設定を変更します。

```
$ mkdir -p PATH_TO_VIM_SYNTASTIC/syntax_checkers/rust
$ cp -p vim_syntastic/cargo.vim PATH_TO_VIM_SYNTASTIC/syntax_checkers/rust/
$ vim .vimrc
let g:syntastic_rust_checkers = ['cargo']   "" 'cargo'を追加する
```

これで冒頭のような環境が整います。

## 制限事項とか

* `cargo new` で作成したプロジェクトディレクトリ直下でしか動作しないと思います。`cargo build` 実行しているので。
* `cargo build` を実行するので意図せず `target` ディレクトリ配下にバイナリが作られたりします。
* 初回実行時や巨大なプロジェクトだと実行に時間がかかると思います。（ `cargo-check` とかに置き換えたらちょっとは速くなるかな...？）
* Rustのファイルさわるときに毎回これ走ってしまう。 `Cargo.toml`があるとかそういうのチェックしたほうがいいかもしれない。

## おわりに

[rustc.vim](https://github.com/rust-lang/rust.vim/blob/master/syntax_checkers/rust/rustc.vim)だとcargoで作ったプロジェクトとかで外部crateが解決できなかったので、あまり実用的ではなく使っていませんでした。（もしかしたら私の設定がおかしいだけなのかもしれないです。。。） `cargo-quickfix`使うとそのあたりをうまく処理できるようになったので、少しの間使ってみようかと思います。

みなさんもよければ使ってみてください。
activerecord raw sql

https://ruk.si/notes/ruby/ruby_on_rails_raw_sql

http://patshaughnessy.net/2010/9/4/activerecord-with-large-result-sets---part-1-select_all-vs--find

http://qiita.com/yut_h1979/items/4cb3d9a3b3fc87ca0435

using ActiveRecord::Base.connection.exec_query instead of ActiveRecord::Base.connection.execute which returns a ActiveRecord::Result (available in rails 3.1+) which is a bit easier to work with.

http://stackoverflow.com/questions/15408285/rails-3-execute-custom-sql-query-without-a-model
XMLHttpRequestで取得したHTMLにDOMでアクセスしたい

##やりたいこと
JavascriptでXMLHttpRequestを使って、サイト内の別ページに存在するHTML要素にDOMでアクセスしたい。


##XMLHttpRequest
別ページにあるid="hoge"のタグのinnerTextを取得する例

```javascript
var url = "/otherpage";
var request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = "document";
request.send("");
request.onreadystatechange = function() {
  if (request.readyState == 4 && request.status == 200) {
    var target = request.response.getElementById("hoge").innerText;
    console.log(target);
  }
}
```
* 非同期モード限定なので、明示的にXMLHttpRequest.open()メソッドのasyncプロパティをtrueにしておく
* XMLHttpRequest.open()をコールしたあと、.send()をコールする前にresponseTypeプロパティに"document"を指定しておく

以上でresponseオブジェクトに対してDOMでアクセスできるようになる。
（responseTextオブジェクトではないので注意）

##参考
XMLHttpRequest の HTML パース処理
https://developer.mozilla.org/ja/docs/HTML_in_XMLHttpRequest
XMLHttpRequest で レスポンスを dom として html をパースする
http://takuya-1st.hatenablog.jp/entry/2016/05/30/194801
macOS Sierraでssh、Their offer: diffie-hellman-group1-sha1　と言われ接続できない

2016/12/24に、自分へのクリスマスプレゼント？で、新しいMacBookPro 13' TouchBar無しを購入しました。
自宅で、Pogoplugにssh接続できるようにしているのですが･･･

#ターミナルからsshで接続すると怒られる
以下のエラーが出力されて接続できません。（*には実際のアドレスが表示される）
　　Unable to negotiate with 192.168.\*.\* port 22: no matching key exchange method found.
　　Their offer: diffie-hellman-group1-sha1

当然ながら、scpによるデータコピーもダメでした。

#Sierraからは、レガシーな暗号が無効に
どうやら、1024ビットの”diffie-hellman-group1-sha1″鍵交換のサポートがデフォルトで無効になるようです。

[Apple、macOS SierraでOpenSSH v7を採用。いくつかのレガシーな暗号が無効に。 ](http://applech2.com/archives/20160816-macos-sierra-open-ssh-v7.html)

#KexAlgorithms追加で解決させる
Openpogo側でOpenSSHのバージョンを上げることが正しい対応なのだと思いますが、以下のように解決しました。

[OpenSSH Legacy Options](http://www.openssh.com/legacy.html)

~/.ssh/config というファイルに以下を追記します。（*には実際のアドレスを記述）
>Host 192.168.\*.\*
>KexAlgorithms +diffie-hellman-group1-sha1


無事、Pogoplugにssh接続できるようになりました。
もちろん、scpもOKです。
ASPIREセルフポータルのセキュリティ対策～アクセス元IPアドレス制限～

ソフトバンクのホワイトクラウドASPIRE(以下ASPIRE)のセルフポータルサイトでは、接続元となる
 IP アドレスの制限を行うことが可能です。これにより、アカウントを不正に利用されるリスクを
低減させることが可能です。ここでは、IPアドレス制限の設定方法について説明をします。

１　ASPIREセルフポータルサイトの右端「テナント設定」タブをクリック
２　左ペインメニューにて「設定」をクリックし、▼メニューを展開。
３　「アクセス元IPアドレス」をクリック

|アクセス制御設定画面|
|---|
|![SnapCrab_NoName_2017-1-12_15-55-1_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/143230/aed701d8-cb38-1698-9b0a-f33a54fdb8d7.png)


アクセスを許可するIPアドレスは、最大10件まで登録することが可能です。
以下の画面にて、「内容を変更する」ボタンをクリックすることで、セルフポータルへの
アクセス元IPアドレスを登録していくことが可能になります。

|IPアドレス設定画面|
|---|
|![SnapCrab_NoName_2017-1-12_15-55-19_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/143230/afa9a86d-d613-e861-674c-d671cf6a907a.png)

実際に許可したいアクセス元のIPアドレスを入力します。

|IPアドレス設定画面|
|---|
|![SnapCrab_NoName_2017-1-12_15-52-47_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/143230/6c29c247-3c1b-fc7b-3b96-bd542cc18700.png)


最後に「OK」をクリックし、許可されたIPアドレス一覧に記載されれば設定は成功です。
アクセス許可を設定していないIPアドレスからセルフポータルサイトにアクセスした場合には、
「Forbidden」がブラウザ上で表示されるはずです。

なお実際の設定情報の反映（追加・削除ともに）は　毎日24:05に 反映されるため、即時設定が反映されるのでは
ありませんので、ご注意ください。
【ドットインストール体験談】自宅でAndroidアプリのプログラミングを習得

※こちらの記事は、プロスタ編集部がプログラミングの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【ドットインストール体験談】自宅でAndroidアプリのプログラミングを習得](http://programming-study.com/case/dotinstall-android/)

#【ドットインストール体験談】自宅でAndroidアプリのプログラミングを習得

[dotinstall](http://programming-study.com/website/dotinstall/)（ドットインストール）を使って、Androidアプリの開発を趣味で始めた20代男性会社員の体験談です。

パソコンが好きで、IT関連の企業に就職したかったのですが、就職活動では入社することができませんでした。現在は、ITやパソコンとはほとんど関連のない仕事をしています。しかし、趣味で、プログラミングできるようになりたいと思い続けていました。社会人なので通学して、プログラミングスキルを学ぶ時間はとれません。仕事の都合もあるので、自宅で自由にプログラミングが勉強できれば良いなと思っていました。そんな時、インターネットでプログラミング学習サイトを検索して、ドットインストールを知りました。

##アプリを作るために「Androidアプリ開発入門」を始める

他にもプログラミング学習サイトはあったのですが、一番簡単に始められそうな印象のサイトだったので、「ドットインストール」で学習を始めました。最初に始めたのは、「Androidアプリ開発入門」のコースです。単に、「自分のスマホでも見ることの出来るアプリが作りたい」という単純な動機で、このコースを選びました。最初は無料で、ネット上の動画を見て、その通りにパソコンを操作するだけです。パソコンに苦手意識のない方なら、最初は比較的すらすらと進められると思います。

私の場合は、「Androidアプリ開発入門」のコースは、休日2日間の間に終了しました。このコースで、だいたい、Androidアプリの開発環境が、自分のパソコン上に整いました。

##壁を乗り越えることで開発力がついた

その次に、「Androidでクイズアプリを作ろう」のコースを見て、クイズアプリを作成しました。ここまでは、意外にすんなり、プログラミングの独習が進んだのです。この調子で、サクサク作れるようになるという期待を持ちました。

しかしその期待は、次のコースで打ち砕かれました。とても興味を惹かれた「Androidでメモアプリを作ろう」というコースに取り掛かってみてからわかったのですが、このコースは初心者にはかなり難しかったのです。メソッドや、Viewの種類、数が断然増えるのです。クイズアプリや、他のゲームアプリは、単純な「メソッド」の組み合わせで完成するのですが、メモアプリを作成する、という時にかなりてこずりました。動画の通りにパソコンを操作しても、どうしてもエミュレータで上手く動きません。この時、大きな壁にぶつかった感がありました。

結局、その壁を乗り越えるために、他のサイトなども参考にしつつ、何度もJavaを書き変えたり、クラスを置きかえたり、紆余曲折しました。結果的には、メモアプリが完成し、自分のスマホ画面でも使えるようになりました。その時点で、かなりのAndroidアプリ作成力がつきました。

##学習のコツはトライアンドエラーを繰り返すこと

一番に言えることは、プログラミングやパソコンが好きでないと、やはり独学でのプログラミング習得は難しいということです。好きで、プログラミングを始めたい人は、途中で難しい部分があってもとりあえずあきらめずに進んでみてください。どうしても進めない場合は、他のプログラムを作ってみると、そこから得られる知識で、解決したりします。プログラミング勉強のコツは、やはり実際にプログラミングをしてみて、失敗と成功の繰り返しで学んでいくことだと思います。自分は全くの初心者だったので、何度も投げ出しそうになりました。

ただ、自分が作成したプログラムのアプリが画面上で動くのを見ると、やる気が起きます。最初はごく簡単なアプリしか作れないと思いますが、少しずつ難しいアプリ作成に挑戦していくのが良いと思います。私は学習を始めてから現在まで2年程、勉強を続けています。今では、趣味でゲームアプリを作り込んでおり、かなり複雑なAndroidゲームを作れるようになりました。
【C言語上達事例】組込みソフトウェアを開発するためにC言語を習得

※こちらの記事は、プロスタ編集部が現在大変人気の高いC言語の学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【C言語上達事例⑩】組込みソフトウェアを開発するためにC言語を習得](http://programming-study.com/case/software/)

#【C言語上達事例】組込みソフトウェアを開発するためにC言語を習得

機器メーカーに勤めている40代のエンジニアの方がソフトウェアのシステムを作るためにC言語を習得した事例です。

##ひょんなことから組込みソフトウェアの開発を担当することに

私は中堅の機器メーカーに勤めている40代のエンジニアで、電子回路などハードウェアの設計開発を担当しています。3～4年ほど前の話になりますが、あるプロジェクトで電子回路の設計をしましたが、ソフトウェアの担当予定者が突然会社を辞めてしまいました。誰がソフトウェアを作るのか大いに揉めましたが、社内には人員を回してくれる余裕がないので私が担当する羽目になってしまいました。その理由の一つは私がアセンブラでプログラムを作れるということでした。しかし、せいぜい規模の小さいテストプログラム程度のもので製品レベルのものは作ったことはありませんでした。

納期も余裕がなくかなり不安でしたが、キャリアアップのためにも頑張ってみることにしました。マイコンを動作させる、いわゆる組込みソフトウェアと呼ばれるプログラムです。わが社の製品のソフトウェアはほとんどC言語で書かれており、その製品もC言語とがメインとなることは決められていたため、全部アセンブラでやろうとしていた私の目論見は外れてしまいました。

##入門用の書籍を使って学習を始める

最初にとりかかったのは社内にあったC言語の入門用の書籍を読むことでしたが、始めのうちは特に理解が出来ないことはありませんでした。しかし、ポインターの章でかなりの時間を費やしてしまいました。というのも、アセンブラ言語のアドレスという概念とポインターがごっちゃになってしまったためで、なまじ知識があったことがかえって邪魔をしてしまいました。

勉強ばかりしていても仕事は進まないので、少しプログラムを作っては実際にマイコンを動かしてみるという作業を積み重ねていきました。この頃には不安よりもプログラムを作る楽しさの方が勝っていたようでとても夢中になってしまいました。

##セミナーでスキルが上がった

また、この時期に大いに役に立ったのがマイコンの製造元会社の無料のソフトウェアに関するセミナーでした。都内にある会社のオフィスでトレーニング用のマイコンボードを使ってプログラミングを習得するという内容でしたが、マイコンの動作のしくみやC言語のテクニックを色々と学習出来てかなりスキルが上がったと思います。講師の方の懇切丁寧な指導のおかげだと思っています。

##プログラミングにはまることで上達

そして製品のプログラムも思ったより順調に進んだのですが、どんどんとプログラミングの魅力に引き込まれ時間が経つのも忘れていた結果だと思います。必要に迫られて始めたことでしたが、実際にやってみると意外と面白くプログラミングには色々な可能性があることを実感しました。スキルアップすることもでき、今では私が設計したハードウェアのソフトはほとんど私自身で作っています。

【オススメ記事】
➡︎ [【C言語上達事例⑨】30代女性プログラマー、C言語習得の鍵は「遊び」](http://programming-study.com/case/software/)
【MySQL上達事例】初心者の女性が5ヶ月でMySQLをマスターした話

※こちらの記事は、プロスタ編集部が現在大変人気の高いMySQLの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【MySQL上達事例③】初心者の女性が5ヶ月でMySQLをマスターした話](http://programming-study.com/case/mysql-woman/)


#【MySQL上達事例】初心者の女性が5ヶ月でMySQLをマスターした話

初心者の30代の女性がMySQLを5ヶ月でマスターした体験談です。

##仕事の都合でMySQLの学習を始める

プログラミング学習を始めたきっかけは、仕事の都合で急にMySQLを勉強する必要が出たという差し迫った状況に陥ったからでした。当時は、WordとExcelが使える程度で、簡単なデータベースであるAccessすらさわったことがなかったにも関わらず、MySQLがメインで必要とされるソフトを使ってシステムを構築する羽目になってしまいました。

##３冊の書籍を使って勉強

MySQLを勉強する前に、データベース周りのことが全くわからなかったので、会社から以前に誰かが使っていたらしいORACLE UNIVERSITYのトレーニングテキスト(今思えばPL/SQLだった……)をもらいました。しかし、当然のことながら何が書かれているのか全くわからないまま、データベース設計をさせられそうになるという、恐ろしい事態になりました。

しかし、パニックを起こしている時に、それを見かねた経験豊富な協力会社の方が声をかけてくれ、「細かいことはいいからまずはデータベースについての考え方を学べ」との助言をいただき、本を数冊薦めてくれました。ひとまず「これならわかるOracle超入門教室 第2版」でデータベースの基礎を学び、それから「基礎からのMySQL 改訂版」、「初めてのPHP、MySQL、JavaScript＆CSS」で、MySQLの細かいところを勉強しました。オライリー本は関係のない部分も多くて、最初から読もうとして挫折し放置していたのですが、必要な部分だけ読むところから始めて、とにかく業務中や空いた時間に何度も読み返しました。

	
[これならわかるOracle超入門教室 第2版](https://www.amazon.co.jp/gp/search/ref=as_li_qf_sp_sr_tl?ie=UTF8&camp=247&creative=1211&index=aps&keywords=%E3%81%93%E3%82%8C%E3%81%AA%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8BOracle%E8%B6%85%E5%85%A5%E9%96%80%E6%95%99%E5%AE%A4%20%E7%AC%AC2%E7%89%88&linkCode=ur2&tag=liaffiliate-22)
新品価格
￥2,138から
(2016/5/2 20:14時点)


[基礎からのMySQL 改訂版 (基礎からシリーズ)](https://www.amazon.co.jp/gp/product/4797369450/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4797369450&linkCode=as2&tag=liaffiliate-22)
中古価格
￥2,368から
(2016/3/29 11:49時点)

[初めてのPHP、MySQL、JavaScript＆CSS](https://www.amazon.co.jp/gp/search/ref=as_li_qf_sp_sr_tl?ie=UTF8&camp=247&creative=1211&index=aps&keywords=%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEPHP%E3%80%81MySQL%E3%80%81JavaScript%EF%BC%86CSS&linkCode=ur2&tag=liaffiliate-22)
新品価格
￥3,888から
(2016/5/2 20:37時点)

➡︎ オススメのMySQLの本は[こちら](http://programming-study.com/language/mysql-books/)

##とにかく実践あるのみ

MySQLを学ぶ過程で必要になったSQLについての理解はネットで検索してたどり着いたミックさんのホームページをこれも仕事の合間に読み込み、勉強させてもらいました。とにかく時間がなかったので、演習問題などを悠長に解いている暇はなく、問題を読んだらすぐ答えを確認。なんとなくデータベースの概要がつかめたら、あとはテキストを片手に実践あるのみでした。

とにかく何かプログラムを書いてはエラーが出る。エラーが出たらテキストで何がダメだったのか調べ、直す。そのエラーを直したと思ったら別のエラーが出る。またテキストで調べる、と作っても作ってもシステムが壊れていく経験をしました。

##上達のコツは自分で手を動かして何かを作り上げること

システム開発期間とほぼ並行に勉強していたので、マスターするのにかかったのは5ヶ月ですが、最後の2ヶ月くらいはさすがにテキストは近くにおいてたまに確認する程度でした。恐らく、3ヶ月くらいでなんとかなっていたと思います。費用は、実費でかかったのは本代だけですが、体が動かなくなったり精神的に不安定になったり、お金以外の犠牲がありました。システム開発が絡んでいなければ、こんなに追い込まれることもなかったと思います。

また、協力会社の方に技術的な疑問点が質問できたのは大きかったと思います。やはり実際に理解している方から直接話を聞くことで、素早く理解することができます。

とにかくシステムを構築しなければいけないプレッシャーがすごかったので、挫折をしている暇すらありませんでした。業務に即して学ぶのが一番効率がいいかとは思いますが、そうでない方もやはり、実際に自分で手を動かして何かを作り上げる体験をすることが一番の近道ではないかと思います。
RustとElixirを勉強するためにDockerfileを書いた


## はじめに

新しく言語を勉強したいときにJupyter notebookを使うと、メモなどを残しつつ効率よく勉強できそうなので、RustとElixirを対象にしたJupyter notebookをDockerで動かしてみました。

## 使い方

Docker Hubに登録してあるので、以下のコマンドで使用できる。

```bash:shell
$ docker pull junsuzuki/jupyter-rust
$ docker run -d -p 8888:8888 junsuzuki/jupyter-rust
```

あとはブラウザで```http://localhost:8888```にアクセスするとRustとElixir（とPython）がJupyter notebookで使えます。

このままでも遊ぶのには良いのだが、Dockerを停止するとせっかく勉強した内容が消えてしまう。
その場合、```docker run```するときに、以下ようにするとホストのディレクトリをマウントでき、Dockerを終了してもデータが消えないですむ。

```bash:shell
$ docker run -v {マウントしたいディレクトリへの絶対パス}/notebooks/:/notebooks -d -p 8888:8888 junsuzuki/jupyter-rust
```

## 参考

以下の記事を参考にしました。

[Pythonista以外が環境を汚さずにJupyter Notebookに触れる方法 あるいは，Rubyist以外が環境を汚さずにJupyter NotebookでRubyに触れる方法](http://qiita.com/izumin5210/items/5531f58f31d788bb8b9b)
[JupyterのPythonラッパーKernel(Rust)を作ってみた](http://qiita.com/m0riiiii/items/6b0561824c299dc7c4d2)