OmniAICreator/Qiita-1.07M huggingface dataset:
【Python入門】おすすめのパッケージ管理システムのpipのインストール方法とは?

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

参考サイト：[【Python入門】おすすめのパッケージ管理システムのpipのインストール方法とは?](http://programming-study.com/technology/python-pip/)

#【Python入門】おすすめのパッケージ管理システムのpipのインストール方法とは?


Pythonには豊富なパッケージがあり、それらを組み合わせることで他の言語よりも簡単かつ高度なプログラミングをすることができます。それらのパッケージを管理する仕組みとして、pipというものがあります。pipは最新のPythonの場合は標準で付属していますが、Pythonのバージョンが古い場合は自分でインストールする必要があります。

今回は、Windowsにpipをインストールする方法を説明します。

##distributeのインストール

pipをインストールするには、まずdistributeというパッケージが必要なので、先にdistributeをインストールします。distributeのインストーラーを公式ページからダウンロードします（リンク：https://pypi.python.org/pypi/distribute）


![pip1-e1482987993277.png](https://qiita-image-store.s3.amazonaws.com/0/152507/1586fe22-a5b4-6286-3ca0-5a355a97982c.png)

なお、distributeのバージョンは0.7.3と0.6.49の2つがありますが、0.7.3は0.6.49がすでにインストールされていて、それをアップグレードするときのみ使用できるので、まずはバージョン0.6.49をダウンロードしましょう。

ダウンロードできたら、圧縮されているので解凍します。解凍したフォルダを開いて、setup.pyというファイルがあることを確認します。


![pip2.png](https://qiita-image-store.s3.amazonaws.com/0/152507/172831ba-9c7d-10d2-cb47-66936de72a97.png)

確認できたら、setup.pyがある階層でコマンドプロンプトを起動しましょう。そのフォルダ上でシフトキーを押しながらマウスを左クリックし、メニューから「コマンドウィンドウをここでひらく」をクリックすることでコマンドプロンプトを開けます。

コマンドプロンプトを開いたら、「python setup.py install」と入力し、エンターキーを押します。これで、distributeがインストールされます。

![pip3-e1482988055902.png](https://qiita-image-store.s3.amazonaws.com/0/152507/b4d95a6d-7b81-27b4-032c-69052a5d7d4e.png)


##easy_installでpipをインストール

distributeがインストールされると「easy_install」というコマンドが使えるようになります。このeasy_installを使って、pipをインストールします。

pythonがインストールしてあるフォルダに行き、さらにその中のScriptsフォルダを開きます。例えば、Python3.2をインストールしているなら「C:\Python32\Scripts」のようになります。そこから先ほどと同じようにコマンドプロンプトを起動します。

まずは、コマンドプロンプトからeasy_installがインストールされているかを確認します。「easy_install」と入力し、エンターキーをクリックします。インストールされている場合、以下の画像のように表示されます。


![pip4-e1482988090505.png](https://qiita-image-store.s3.amazonaws.com/0/152507/07411aee-f7a7-1b8c-8cd6-8810281ca128.png)

easy_installがインストールされていることが確認できたら、コマンドプロンプトに「easy_install pip」と入力し、エンターキーを押します。pipのインストールが始まります。あとは待っていればpipのインストールが完了します。

![pip5-e1482988123241.png](https://qiita-image-store.s3.amazonaws.com/0/152507/112652e2-6acb-4a71-a1fb-2d7fc8377562.png)


##pipの基本的な使い方

pipにはいくつかのコマンドがありますが、基本的には以下の2つを使います。

```
①	pip install (パッケージ名)・・・・パッケージをインストール
②	pip uninstall (パッケージ名)・・・パッケージをアンインストール
```

これ以外のコマンドについてはpip helpと入力してヘルプを表示することで調べることができます。Pythonには便利なパッケージがたくさんあるので、ぜひpipを利用していろんなパッケージをインストールしてみてください。
深層学習(人工知能学会著)の単語メモ1

#はじめに
深層学習(人工知能学会著)について読み進めながら出てきた専門用語を解説します。第１章はニューラルネットワーク関連用語の基本知識がほとんどです。
(深いトピックに入る前の単語ばかりなので、追記する可能性があります）

https://www.amazon.co.jp/dp/B01B768QJW/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

#第１章：階層型ニューラルネットワークによる深層学習
➢内部表現(internal representation)
潜在表現または特徴ともいわれる。観測データから本質的な情報を抽出した内容。つまりは、何かを与えた時、それを最もよく表すような特徴情報。深層学習(deep learning)では、多層ニューラルネットワークによって対象のデータから本質的な特徴を抽出する。
Ex)多数の筆跡から誰かの筆跡を特定したい際、文字のくせなどが特徴として現れる

➢次元削減(dimension reduction)
データの変動構造を説明する少数の変数を抽出する事。主成分分析などにおいて変数を削減する時に用いられる概念

➢醜いアヒルの子の定理(ugly duckling theorem)
醜いアヒルの子（白鳥の子）と普通のアヒルの子（アヒルの子）との類似点について、普通のアヒルの子同士の類似点と同数となる。（目が黒いか黒くないか、体が白いか白くないか）
すなわち、対象を表現するための特徴を選択する事、また重み付けする事なしに表現の近さに基づいた対象の分類が不可能である事を示している。

➢ノーフリーランチ定理(no free lunch theorem)
すべての問題に対して万能なアルゴリズムは存在しない定理。判別したい対象に対して最適化されたアルゴリズムが汎用的なアルゴリズムよりも有利という事。感覚的にもわかると思われる。

➢表現学習(representation learning)
人手で良い内部表現(特徴の重み付けなど）をデザインするアプローチではなく、データを入力して良い内部表現を観測データから学習させるアプローチ。

➢パーセプトロン(perceptron)
ニューラルネットワークの構成要素。
入力Xiに対して重みWiをかけ、その結果に関数を作用させて出力yとする。
この関数を活性化関数という。
i=3の場合
![IMG_20170114_160805.jpg](https://qiita-image-store.s3.amazonaws.com/0/85120/7861379f-07a5-8392-0673-32ccba237e2a.jpeg)
js クレジットカード番号のマスクをつくる

##お題
クレジットカード番号を確認するときの形式、下四桁以外隠す関数をつくる

```js
function maskify(cc) {
//write your code.
}
maskify("4556364607935616") 
```

##出力結果　例

```js

maskify("4556364607935616") // "############5616"
maskify(     "64607935616") //      "#######5616"
maskify(               "1") //                "1"
maskify(                "") //                 ""

maskify("Skippy") //"##ippy"
maskify("Nananananananananananananananana Batman!") // "####################################man!"
```


##つかったもの
split()
for文
join()

##考え方
・split()で引数を分割する
・for文で後ろから四つを残して”#”に入れ替える
・join（）してかえしておわり


##コード

```js
function maskify(cc) {
  cc = cc.split("");
  for(var i = 0; i < cc.length - 4; i++){
    cc[i] = "#";
}

cc = cc.join("");
return cc
}
```

##ES6

```js
maskify = (cc) => '#'.repeat(Math.max(0, cc.length - 4)) + cc.substr(-4);
```


##正規表現を使ったコード

```js
function maskify(cc) {
  return cc.slice(0, -4).replace(/./g, '#') + cc.slice(-4);
}
```

###他にもコードが浮かんだ方、コメントお待ちしております。
おまえはpackage.jsonに列挙されたmoduleの意味をわかっているか。俺はわかってない。(browserify関連編

あーes20xxでーreactでーbrowserifyだかwebpackでーファイルの更新監視してーブラウザも更新してー
のためにググったりしながら気がつくとpackage.jsonが

```
  "devDependencies": {
    "@kjirou/utils": "0.0.3",
    "autoprefixer": "6.5.3",
    "babel-core": "6.18.2",
    "babel-plugin-espower": "2.3.1",
    "babel-preset-es2016": "6.16.0",
    "babel-preset-react": "6.16.0",
    "babel-register": "6.18.0",
    "babelify": "7.3.0",
    "browser-sync": "2.18.2",
    "browserify": "13.1.1",
    "dictify": "1.1.0",
    "eslint": "3.12.2",
    "espower-loader": "1.2.0",
    "fixpack": "2.3.1",
    "gulp": "3.9.1",
    "gulp-concat": "2.6.1",
    "gulp-postcss": "6.2.0",
    "gulp-rename": "1.2.2",
    "gulp-sass": "2.3.2",
    "jsdoc": "3.4.3",
    "keymirror": "0.1.1",
    "mocha": "3.2.0",
    "node-notifier": "4.6.1",
    "power-assert": "1.4.2",
    "react": "15.4.1",
    "react-dom": "15.4.1",
    "react-redux": "4.4.6",
    "redux": "3.6.0",
    "redux-create-reducer": "1.1.1",
    "redux-thunk": "2.1.0",
    "run-sequence": "1.2.2",
    "sanitize.css": "4.1.0",
    "string": "3.3.3",
    "uuid": "3.0.1",
    "vinyl-source-stream": "1.1.0",
    "watchify": "3.7.0"
  },
```
とかなんとかなってて、よーわからんってなってはいないか？おれはなっている。

そんなpackage.jsonにありがちなモジュールのうちbrowserify関連のものを理解しようと思ったのが、このエントリー。
「具体的に連携させるために何をするのか」はこのエントリーでは扱わない。

# 図解 reactがbabelでbrowserify！
図にするとこんな感じだろう
![browserify.001.png](https://qiita-image-store.s3.amazonaws.com/0/12657/35e6a9c5-f847-9848-0635-97e2a3e4175d.png)

# この図があっていれば

- 大枠としては「書いたJSを(brwserifyで)[browserify](https://github.com/substack/node-browserify)する」ことであるのがわかる
- その過程で書いたJSは「[transform](https://github.com/substack/node-browserify#browserifytransform)という仕組みを経由してbabelでtranspileされる」
- [babel](https://github.com/babel/babel)は当然brwserifyと依存が無いので「間を繋いでいるのが[babelify](https://github.com/babel/babelify)」
    - babelifyはbrowserifyのtオプション経由で指定され、transformerとして中で振る舞う

# その他
- babel + babel-preset-xxx はbrowserifyと関係無いので、覚えておけば他のバンドラーとかでも使いまわせる
- [watchify](https://github.com/substack/watchify)はbrowserifyするファイルが更新されたら上記の流れでbrowserifyするやつ
- [browsersync](https://browsersync.io/)は指定されたファイルが更新されたらブラウザを更新するやつ

# 付録
- browserifyのトランスフォーマー一覧
    - https://github.com/substack/node-browserify/wiki/list-of-transforms
「PythonでWebScraping」の入り口。メモ

仮想環境を立てておく。

```
$ pyvenv-3.5 env
```

仮想環境に入る。

```
$ source env/bin/activate
(env) $
```

[requests](http://requests-docs-ja.readthedocs.org/en/latest/)とBeautifulSoup4をinstallして、Pythonを起動。

```
(env) $ pip install requests
(env) $ pip install BeautifulSoup4
(env) $ python
```

あとは下記の流れ。

```
>>> import requests
>>> res = requests.get('スクレイピングしたいURL')
>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup(res.text, 'html')
>>> soup.select_one('タグとかセレクターとか指定する').text //ここをいろいろ変えるよ
```

「//ここをいろいろ変えるよ」って書いてあるとこは下記を参考。select_one()のとこを、find()とかいろいろ変える。

★BeautifulSoup objectのよく使うmethod

BeautifulSoup.find() -> タグを検索して最初にhitしたタグを返す
BeautifulSoup.find_all() -> タグを検索してhitしたタグのリストを返す
BeautifulSoup.find_previous() -> 一つ前のタグを返す
BeautifulSoup.find_next() -> 一つ後ろのタグを返す
BeautifulSoup.find_parent() -> 親タグを返す
BeautifulSoup.select() -> css selectorでタグのリストを返す
BeautifulSoup.select_one() -> css selectorで検索して最初にhitしたタグを返す

↑
この命令軍は[ここ](https://github.com/pynyumon/pynyumon/blob/master/2_scraping.md)から引用してます。


例
```
soup.find（'li'）
soup.find_all('li')
```

その他「Python　スクレイピング」でググったら出てくるので割愛。
mewでGmailから送受信する設定

こちらの設定を参考にさせて頂きました。
https://jedipunkz.github.io/blog/2013/08/12/emacs-mew-gmail/
http://d.hatena.ne.jp/rubikitch/20100502/mail


```lisp:~/.emacs
(autoload 'mew "mew" nil t)
(autoload 'mew-send "mew" nil t)
(setq mew-fcc "+outbox")
(setq exec-path (cons "/usr/bin" exec-path))

(setq user-mail-address "Your Gmail Address@gmail.com")
(setq user-full-name "Your Name")
(setq mew-smtp-server "smtp.gmail.com")
(require 'mew)
(setq mail-user-agent 'mew-user-agent)
(define-mail-user-agent
  'mew-user-agent
  'mew-user-agent-compose
  'mew-draft-send-message
  'mew-draft-kill
    'mew-send-hook)
```

```lisp:~/.mew.el
; Stunnel
(setq mew-prog-ssl "/usr/bin/stunnel4")
; IMAP for Gmail
(setq mew-proto "%")
(setq mew-imap-server "imap.gmail.com")
(setq mew-imap-user "Your Gmail Address@gmail.com")
(setq mew-imap-auth  t)
(setq mew-imap-ssl t)
(setq mew-imap-ssl-port "993")
(setq mew-smtp-auth t)
(setq mew-smtp-ssl t)
(setq mew-smtp-ssl-port "465")
(setq mew-smtp-user "Your Gmail Address@gmail.com")
(setq mew-smtp-server "smtp.gmail.com")
(setq mew-fcc "%Sent")
(setq mew-imap-trash-folder "%[Gmail]/ゴミ箱")
(setq mew-use-cached-passwd t)
(setq mew-ssl-verify-level 0)
```
Haskell で AtCoder をやってみる(ABC003)

# 問題 A に挑戦
```Haskell
import Control.Monad

main :: IO ()
main = readLn >>= print . (\n -> (`div` n) . (*10000) . sum $ [1..n])
```
正解！
合成！モナモナ！合成！モナモナ！

# 問題 B に挑戦中
Haskell で AtCoder をやってみる(ABC002)

# 問題 A に挑戦
```Haskell
import Control.Applicative

main :: IO ()
main = print =<< maximum . map (read :: String -> Int) . words <$> getLine
```
正解だーー！
モナってやったぜ＼(^o^)／

# 問題 B に挑戦中
Haskell で AtCoder をやってみる(ABC001)

# 問題 A に挑戦
```Haskell
import Control.Applicative

main :: IO ()
main = do
    x <- read <$> getLine
    y <- read <$> getLine
    putStrLn $ show $ x - y
```
正解！ヒャッハーーーー！！

# 問題 B に挑戦
```Haskell
import Control.Applicative
import Text.Printf

main :: IO ()
main = do
    m <- (/1000) . read <$> getLine
    putStrLn $ calc m

calc :: Double -> String
calc x | x < 0.1               = "00"
       | x >= 0.1 && x <= 5.0   = printf "%02d" $ (truncate $ x * 10 :: Int)
       | x >= 6.0 && x <= 30.0  = show $ (truncate $ x + 50 :: Int)
       | x >= 35.0 && x <= 70.0 = show $ (truncate $ ((x - 30) / 5) + 80 :: Int)
       | otherwise             = "89"
```
またまた正解！フォーーーーーーー！！！

# 問題 C に挑戦
```Haskell
import Control.Applicative

main :: IO ()
main = do
    [x, y] <- map read . words <$> getLine
    let calcY = (roundUp $ ((fromIntegral y) / 60) * 10) * 6
    let resY = checkW calcY $ wList wPower wMinSpeed wMaxSpeed
    let resX = if resY == 0 then "C" else checkD (x * 10) $ dList dName dMinAngle dMaxAngle
    putStrLn $ resX ++ " " ++ show resY

roundUp :: (RealFrac a, Integral b) => a -> b
roundUp x
    | n <= -0.5 = m - 1
    | n >= 0.5  = m + 1
    | otherwise = m
    where (m, n) = properFraction x

class Check a where
    check :: a -> Int -> Bool
data Direction = Direction { name :: String , minAngle :: Int , maxAngle :: Int } deriving Show
instance Check Direction where
    check (Direction _ minA maxA) x = if x >= minA && x < maxA then True else False

-- 方位
dName :: [String]
dName = ["NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"]

dMinAngle :: [Int]
dMinAngle = [1125, 3375..32625]

dMaxAngle :: [Int]
dMaxAngle = [3375, 5625..34875]

dList :: [String] -> [Int] -> [Int] -> [Direction]
dList [] [] [] = []
dList (x:xs) (y:ys) (z:zs) = createD x y z : dList xs ys zs
    where
        createD dx dy dz = Direction { name = dx, minAngle = dy, maxAngle = dz }

checkD :: Int -> [Direction] -> String
checkD t ys = case res of
        [] -> "N"
        otherwise -> name $ head res
    where
        res = flip filter ys $ \y -> check y t

-- 風力
data Wind = Wind { power :: Int , minSpeed :: Int , maxSpeed :: Int } deriving Show
instance Check Wind where
    check (Wind _ minS maxS) x = if x >= minS && x < maxS then True else False

wPower :: [Int]
wPower = [0..11]

wMinSpeed :: [Int]
wMinSpeed = 0:xs
    where
        xs = map (\x -> (truncate (x * 60)) + 1) [0.2, 1.5, 3.3, 5.4, 7.9, 10.7, 13.8, 17.1, 20.7, 24.4, 28.4]

wMaxSpeed :: [Int]
wMaxSpeed = map (\x -> (truncate (x * 60)) + 1) [0.2, 1.5, 3.3, 5.4, 7.9, 10.7, 13.8, 17.1, 20.7, 24.4, 28.4, 32.6]

wList :: [Int] -> [Int] -> [Int] -> [Wind]
wList [] [] [] = []
wList (x:xs) (y:ys) (z:zs) = createW x y z : wList xs ys zs
    where
        createW wx wy wz = Wind { power = wx, minSpeed = wy, maxSpeed = wz }

checkW :: Int -> [Wind] -> Int
checkW t ys = case res of
        [] -> 12
        otherwise -> power $ head res
    where
        res = flip filter ys $ \y -> check y t
```
正解、やったぜ！
しかし、コードが長すぎるような・・・
今度書き換えよう・・・

# 問題 D 挑戦中
rbenvでRubyインストール時にエラーになる場合の対応

## エラー内容

rbenvでRuby2.0.0-p195をインストールしようとしたら次のエラーが出てインストールができなかった。

```
# rbenv install 2.0.0-p195
Downloading yaml-0.1.6.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/7da6971b4bd08a986dd2a61353bc422362bd0edcc67d7ebaac68c95f74182749
Installing yaml-0.1.6...
Installed yaml-0.1.6 to /root/.rbenv/versions/2.0.0-p195

Downloading ruby-2.0.0-p195.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p195.tar.bz2
Installing ruby-2.0.0-p195...

WARNING: ruby-2.0.0-p195 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.


BUILD FAILED (CentOS release 6.8 (Final) using ruby-build 20170112)

Inspect or clean up the working tree at /tmp/ruby-build.20170114060145.4940
Results logged to /tmp/ruby-build.20170114060145.4940.log

Last 10 log lines:
ossl_pkey_ec.c:821: error: for each function it appears in.)
make[2]: *** [ossl_pkey_ec.o] エラー 1
make[2]: ディレクトリ `/tmp/ruby-build.20170114060145.4940/ruby-2.0.0-p195/ext/openssl' から出ます
make[1]: *** [ext/openssl/all] エラー 2
make[1]: *** 未完了のジョブを待っています....
installing default pathname libraries
linking shared-object pathname.so
make[2]: ディレクトリ `/tmp/ruby-build.20170114060145.4940/ruby-2.0.0-p195/ext/pathname' から出ます
make[1]: ディレクトリ `/tmp/ruby-build.20170114060145.4940/ruby-2.0.0-p195' から出ます
make: *** [build-ext] エラー 2
```

ログが出力されている/tmp/ruby-build.20170114060145.4940.logの内容は次のとおりだった。

```
(略)
compiling ossl_pkey_ec.c
ossl_pkey_ec.c: In function ‘ossl_ec_group_initialize’:
ossl_pkey_ec.c:766: 警告: implicit declaration of function ‘EC_GF2m_simple_method’
ossl_pkey_ec.c:766: 警告: assignment makes pointer from integer without a cast
ossl_pkey_ec.c:821: error: ‘EC_GROUP_new_curve_GF2m’ undeclared (first use in this function)
ossl_pkey_ec.c:821: error: (Each undeclared identifier is reported only once
ossl_pkey_ec.c:821: error: for each function it appears in.)
make[2]: *** [ossl_pkey_ec.o] エラー 1
make[2]: ディレクトリ `/tmp/ruby-build.20170114060145.4940/ruby-2.0.0-p195/ext/openssl' から出ます
make[1]: *** [ext/openssl/all] エラー 2
make[1]: *** 未完了のジョブを待っています....
installing default pathname libraries
linking shared-object pathname.so
make[2]: ディレクトリ `/tmp/ruby-build.20170114060145.4940/ruby-2.0.0-p195/ext/pathname' から出ます
make[1]: ディレクトリ `/tmp/ruby-build.20170114060145.4940/ruby-2.0.0-p195' から出ます
make: *** [build-ext] エラー 2
```

## 対応

これはRubyのバグで、パッチを適用すれば良い。

1. パッチ適用のためパッケージをインストール

    ```
    # yum install patchutils patch
    ```
2. パッチを適用

    ```
    # curl -fsSL "https://github.com/ruby/ruby/commit/0d58bb55985e787364b0235e5e69278d0f0ad4b0.patch" |   filterdiff -x a/ChangeLog | rbenv install --patch 2.0.0-p195
    ```

## 参考URL

https://github.com/rbenv/ruby-build/wiki#make-error-for-200-p247-and-lower-on-fedorared-hat
GTK#でFixedウィジェットの背景色の色付けを挑むもうまくいかないので、あれやこれや試してみた唯のまとめ的な何か

GTK#でFixedウィジェットの背景色の色付けを挑むもうまくいかないので、あれやこれや試してみた唯のまとめ的な何か

## 検証手順

1. 以下のよう画面を構成する。
    * サイズや場所は適当に。
    
    ```
    - MainWindow: Window
        +- vbox1: VBox
            +- menubar1: MenuBar
            +- eventbox1: EventBox
                +- fixed1: Fixed
            +- alignment1: Alignment
                +- eventbox2: EventBox
                    +- fixed2: Fixed
            +- fixed3: Fixed
                +- eventbox3: EventBox
                    +- fixed4: Fixed  
                +- fixed5: Fixed      
            +- eventbox4: EventBox
                +- fixed6: Fixed
                    +- eventbox5: EventBox
                        +- fixed6: Fixed        
                    +- fixed7: Fixed
    ```
2. MainWindowのコンストラクタの中身を以下のように書き換える

    ```c#
            Build ();

            this.ModifyBg (StateType.Normal, new Gdk.Color (200, 240, 200));
            this.eventbox1.ModifyBg (StateType.Normal, new Gdk.Color (0, 0, 255));
            this.eventbox2.ModifyBg (StateType.Normal, new Gdk.Color (0, 255, 255));
            this.fixed3.ModifyBg (StateType.Normal, new Gdk.Color (0, 255, 0));
            this.eventbox3.ModifyBg (StateType.Normal, new Gdk.Color (255, 0, 0));
            this.fixed5.ModifyBg (StateType.Normal, new Gdk.Color (0, 0, 100));
            this.eventbox4.ModifyBg (StateType.Normal, new Gdk.Color (255, 0, 0));
            this.eventbox5.ModifyBg (StateType.Normal, new Gdk.Color (0, 255, 0));
            this.fixed8.ModifyBg (StateType.Normal, new Gdk.Color (0, 0, 255));
    ```


3. Build & Run !

## 結果

```
- MainWindow <- ⚪︎
    +- vbox1
        +- menubar1
        +- eventbox1 <- ⚪︎
            +- fixed1
        +- alignment1: Alignment
            +- eventbox2: EventBox <- ⚪︎
                +- fixed2: Fixed
        +- fixed3: Fixed <- X
            +- eventbox3: EventBox　<- X
                +- fixed4: Fixed  
            +- fixed5: Fixed <- X     
        +- eventbox4: EventBox <- ⚪︎
            +- fixed6: Fixed
                +- eventbox5: EventBox <- ⚪︎
                    +- fixed6: Fixed        
                +- fixed7: Fixed <- X
```

* fixed3の下は、たとえEventBoxおいても着色されず。
* そもそもfixed7はイベント受け取れないので、着色されなかったのだろう

### すくしょ

![実行結果](https://qiita-image-store.s3.amazonaws.com/0/11233/796ae009-9e6e-4938-f044-85e36e30cb02.png)
Bash on Windows で セキュリティソフトにaptの邪魔をされるとき

半ば諦めて公式対応してくれるのを期待していたのですが、ふと思いついたのでやってみたらできました。

# apt updateできない？
いろいろやりたいことを妄想して、いざパッケージをインストールしてみようとすると、いきなり壁にぶちあたります。
curlでのhttpは通信できるけれど、aptコマンドでのhttpでは通らない。。
[apt update / install でリポジトリにつながらない (ただし、 curl だとつながる)](http://qiita.com/kobanyan/items/db5eddd25248e661c304#apt-update--install-%E3%81%A7%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%89%E3%81%AA%E3%81%84-%E3%81%9F%E3%81%A0%E3%81%97-curl-%E3%81%A0%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8B)

私の環境でもSymantec Endpoint Protectionを使っていて、一応、ファイアーウォールを無効にすれば、apt updateは成功しましたが、いつも無効にしておくわけにもいきません。

また、ファイアーウォールのルールはサーバー側で制御しているので、あまり多くのことを試すことができませんが、アプリケーションごとに通信の許可（ホワイトリスト）みたいなことはやっていませんでした。

# ローカル通信は別なルールになるのでは？
ファイアウォールのルールで遮断されているなら、別なルールを使う通信ならいけるかも、と思ってWindows側のローカルにプロキシを立ててそこを経由させてみました。

# プロキシ経由で接続してみる
プロキシには簡単に立てられる、[BlackJumboDog](http://blackjumbodog.codeplex.com/)を使わせていただきました。

msiとzipで配布されているので、よりお手軽なほうのzipでダウンロードしてきて、解凍。
起動したら、オプション→プロキシサーバ→ブラウザのダイアログで、「プロキシサーバ[Browser]を使用する」にチェックをつけて、以下の設定を。

* 基本設定タブ
 * クライアントから見たポート:8080
 * 待ち受けるネットワーク：IPv4 127.0.0.1
 
* ACLタブ
 * 指定したアドレスからのアクセスのみを許可する
 * 利用者（アドレス）の指定：お好きな名前で127.0.0.1を追加

準備ができたら、Bashでこんな感じにするといけます。

    # export http_proxy="http://localhost:8080/"
    # apt update

sudoでやりたいって方は、-Eオプションをつけて実行すると環境変数を引き継いでくれます。

    $ export http_proxy="http://localhost:8080/"
    $ sudo -E apt update
Cloud9でCakePHP2の環境を5分でつくる

### 最初

- Workspace name : お好みで
- Template : PHP,Apache&...

### CakePHP2のgit clone

```bash
~workspace $ git clone -b 2.x git://github.com/cakephp/cakephp.git 
```

### ApacheのDocumentRoot設定変更

```bash
$ cd /etc/apache2/sites-enabled
$ sudo vi 001-cloud9.conf

#    DocumentRoot /home/ubuntu/workspace
     DocumentRoot /home/ubuntu/workspace/cakephp

$ service apache2 restart
```
### PostgreSQLの起動

```bash
$ sudo service postgresql start
```

### cakephp/app/Config/core.php

```bash
Configure::write('Security.salt', 'hogehogehogehogehogehogehogehogehogehoge');
Configure::write('Security.cipherSeed', 'piyopiyopiyopiyopiyopiyopiyopiyo');
```

以上
Haskell の配列多すぎワロタ事件簿 1(STVector 編)

# それはある日起こった
Yesod での Web アプリ作成も一段落し、
Haskell 力を向上させるべく、競プロに勤しんでいた。
ある時「配列用意して破壊的操作したら余裕だぜ！」という問題に出会い、
調べてみた矢先だった。
配列の種類が大量にあるではないか・・・

| immutable | mutable | 
|:-----------|:------------|
| IArray | STArray |    
| Vector| MVector|

さらには boxed, unboxed、Data.Array は古い、行列は Repa(標準では使えない)やら、
*何これ・・・どれをどういう時使うんだ・・・*
とりあえず、mutable の Vector が速いらしいのでテストしてみることにした！

```Haskell
import Control.Monad
import Control.Monad.ST
import qualified Data.Vector as V
import qualified Data.Vector.Mutable as VM

main :: IO ()
main = print $ V.toList $ sideEffect [0..100]

sideEffect :: [Int] -> V.Vector Int
sideEffect as = runST $ do
        vec <- V.thaw $ V.fromList as
        forM_ [0..10] $ \x -> VM.unsafeWrite vec x 2
        loop 0 vec
        V.freeze vec
    where
        loop i v = when (i < VM.length v) $ do
            VM.unsafeWrite v i 1
            loop (i + 1) v
```
* List から Vector に変換
* immutable, mutable の相互変換
* 再帰を使ったループ処理
* for(map 的な)ループ処理

これは便利そうだ＼(^o^)／
次は STArray を試してみる予定♪
Windows7 64bitにApache2.4とPHP5.6を設定するメモ

# Windows7 64bit環境にApache2.4とPHP5.6を設定するメモ

Windows7 64bit環境ローカルで動かす用の設定備忘録

## PHP5.6設定

#### PHP5.6.29ダウンロード
- http://windows.php.net/download/
- 「PHP 5.6 (5.6.29)」項の「VC11 x64 Thread Safe (2016-Dec-08 21:51:13)」Zipをダウンロード
- experimentalだけど気にしない。

#### フォルダ配置
- php-5.6.29-Win32-VC11-x64.zip を「C:\\php」として展開

#### php.ini編集
- 「C:\\php」内のphp.ini-developmentをコピーして、php.iniにリネーム
- php.iniを編集。コメント外したり、追記したり

```ini:php.ini
; extension_dir = "ext"
extension_dir = "C:\php\ext"

extension=php_mbstring.dll
extension=php_mysqli.dll
extension=php_openssl.dll
```

## Apache2.4設定

#### Apache2.4.25ダウンロード
- https://www.apachelounge.com/download/
- 「Apache 2.4.25 Win64」のhttpd-2.4.25-win64-VC14.zipをダウンロード

#### フォルダ配置
- httpd-2.4.25-win64-VC14.zipを展開してできた「Apache24」フォルダをCドライブ直下に配置。C:\Apache24

#### httpd.conf編集
- C:\Apache24\conf\httpd.confを編集する

```text:httpd.conf
#Listen 12.34.56.78:80
Listen 127.0.0.1:80


#LoadModule xml2enc_module modules/mod_xml2enc.so
LoadModule php5_module "C:/php/php5apache2_4.dll"


#ServerName www.example.com:80
ServerName localhost:80

<IfModule mime_module>
    ...
    #AddOutputFilter INCLUDES .shtml    
    AddHandler application/x-httpd-php .php
</IfModule>

PHPIniDir "C:/php"
```

#### Apache2.4をサービス登録
- コマンドプロンプトを起動し、「C:\Apache24\bin」に移動
- "httpd -k install"入力
- 「コントロール パネル」-「管理ツール」-「サービス」を開き、Apache2.4が登録されていればOK


C:\Apache24\bin\ApacheMonitor.exeなどからApacheを起動し、http://localhost にアクセスし、"It works!"と表示されればOK
bashrcでPATHを追加したらコマンドが動かなくなった時の復活方法

お馬鹿なミスを抜け出すtipsです

# PATHを書くのをミスった
私はbashrcにPATHの設定とか書いているんですが
色々環境構築する時にPATH追加したりしますよね？

その時にbashrcに通したいPATHを書くんですが
お恥ずかしいことならが
たまに書き方をミスったり、消しちゃいけないやつを消したりしちゃって

**コマンドが効かなくなることがあります**

# コマンドが効かなくなると非常にツライ
もちろんPATHをミスっちゃっているわけですから
`vim`も`less`も`ls`もおなじみのコマンドが全て使えなくなります

とりあえずパニックになる

# 抜け出す方法
現象の根源のbashrcを直してあげれば
コマンドが使える状態に直るわけですから
なんとか編集をしてあげましょう

その方法は
**絶対パスでコマンドを呼び出す**

vi　なら `/usr/bin/vim` (環境によって置き場が異なるかもしれないので探す)
で立ち上がります

参照とかしたければ　`ls`→ `/bin/ls`

ただ注意点は
絶対パスを調べたくて `which`　しても
コマンドが効かないことです

頑張って探すしかない

大抵のコマンドは　`/bin/`配下にあるので
試行錯誤でコマンド駆使して乗り切ります
因子分析（promax回転）でRとSPSSの結果を一致させる

# 概要
- 因子分析でpromax回転をさせたとき，SPSSとR（psychパッケージのfa関数）と値が一致しない．
- [こちらのサイト](http://norimune.net/2226)によると，*共通性の平方根で重み付けしていない*ことが原因とのこと．
- 同じく，[上記サイトでその差分を吸収する関数を公開してくださっている](http://norimune.net/2219)のでそれを使う．

# 内容
## 背景
- 共同研究者と同じアンケートデータを同じ手法（promax回転，最尤法）で解析しているはずなのに，結果（数値）が大幅に異なることが…

## 原因
- 共同研究者はSPSS，こちら側ではR（psychパッケージのfa関数）を使っているので，そこに原因があるのは確実
- よく見たら，SPSSはkaiserの正規化をしているのに，Rではしていなかったので，kaiser関数を当ててみたりする
- それでも合わず…
- [こちらのサイト](http://norimune.net/2226)によると，*共通性の平方根で重み付けしていない*ことが原因とのこと．

## 解決方法(Usage)
− 同じく，[上記サイトにその差分を吸収する関数がある](http://norimune.net/2219)のでそれを使う．

たとえばこんな感じ

``` R:sample.R
dat <- read.csv("sample.csv", h=T, row.names=1)
print(promax2(fa(dat,2,rotate="varimax", fm="ml")),digits=3)
```

に，してあげると，小数点以下3桁目くらいに細かいズレがあるものの，ほぼSPSSの結果と一致するような値を得ることが出来る．

### 解析例
たとえば[こちらのサイト](http://www.u-gakugei.ac.jp/~kishilab/spss-factoranalysis.htm)の例だと，SPSS（バージョンその他不明）で得たとして紹介されているLoadingは以下の通り

|SPSS|因子1|因子2|
|:---:|---:|---:|
|社会| .940|-9.146E-02|
|国語| .829|-3.322E-02|
|英語| .648|.249|
|数学| -.127|1.042|
|理科| .175|.599|

R(version 3.3.2)のpsych(v1.6.8)と，上記のサイトにあるpromax2を用い，同じデータを処理[^1]して得たLoadingは以下の通り（SPSSと比較しやすいように順番を入れ替え済み）

[^1]: 上述の sample.R がその時の処理

|R|   ML2|    ML1|
|:---:|---:|---:| 
|社会 | 0.940| -0.092|
|国語 | 0.829| -0.033|
|英語 | 0.647|  0.295|
|数学 |-0.127|  1.041|
|理科 | 0.174|  0.601|


## 検索用のタグ
因子分析，プロマックス回転，promax回転，SPSS，R，値，一致しない．
imgui で日本語が「?」になる場合の対処

[imgui](https://github.com/ocornut/imgui) で日本語を表示する際、以下のようにします。

```cpp
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("フォントのパス", 10.0f, nullptr, io.Fonts->GetGlyphRangesJapanese());
```

これで日本語を表示していると、たまに「?」になってしまう文字があります。
例えば「瞳」などです。

# 「?」になる原因
これは、`io.Fonts->GetGlyphRangesJapanese()` で取得できるグリフの範囲が JIS X 0208 で表示できるものより狭いことにあるようです。

# 対処法

JIS X 0208 で表示できる文字すべてを登録すればよいので、以下を参考にグリフの範囲を作成します。

ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT

出来上がる配列は量が多いので、こちらに張り付けておきました。

https://gist.github.com/benikabocha/6b9ee35557b7058810dc2f4a06fe0304

これを次のように使います。

```cpp
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("フォントのパス", 10.0f, nullptr, glyphRangesJapanese);
```
ECRにpushしたイメージをワンライナーで古いものから削除する


**ECRにライフサイクルポリシーの機能が追加されたので自分で消す必要がなくなりました！**
ルールを設定すればルールに応じて自動で削除されます。詳細は下記を確認して下さい。
https://aws.amazon.com/jp/blogs/news/clean-up-your-container-images-with-amazon-ecr-lifecycle-policies/

==============以下、ライフサイクルポリシーの機能がなかったときの話==============

ECRのレポジトリ毎のイメージ数の最大は初期値で1000です（申請すれば上限は上げられます）。
上限を超えたとき自動では削除してくれないので定期的に削除する必要があります。
tagに時系列の判断できるものを付けていれば簡単に削除できますが、gitのcommitidなどを付けているとそれだけでは時系列が分からないので削除が面倒になります。
そういった場合でもECRはpushされた時間をimagePushedAtとして保持しているのでその値を参照すれば時系列的に古いイメージを判別することが出来ます。
（あくまでもpushされた時間なのでイメージそのものが古いかどうかは判別できません。）

imagePushedAtを使って古いイメージを削除するワンライナーは下記の通りです。


```

aws ecr describe-images --repository-name <レポジトリ名> --query 'imageDetails[]' | jq 'sort_by(.imagePushedAt) | .[].imageTags[]' -r | head -n <削除件数> | xargs -I{} aws ecr batch-delete-image --repository-name <レポジトリ名> --image-ids imageTag={}

```

`<レポジトリ名>`と`<削除件数>`を指定の値に置き換えて実行すれば、古いものから指定件数分削除されます。
bashでもUTF-8 with BOMなファイルを作りたい

# はじめに

普段はC++の記事を投稿しています。
Windows使いなもんで、Bashを使うのに

- Cmder + ComEmu + MSYS2 + bash
- Cmder + ComEmu + MSYS2 + bash + SSHでLinuxへ + bash
- [Cmder + ComEmu + MSYS2 + bash + SSHでLinuxへ + bash + prootでarchilinuxを動かして + bash](http://173210.github.io/proot)

とかしてやってます(どんだけ間に挟むんだ)

# 動機

ちょっとcsvを自動加工する必要が出てきまして、Windows向けにpowershellとLinux向けにShellScript(on bash)を書くことになったんですね。

要件として、出力ファイルは**UTF-8 with BOM**にしたいというものがありまして、powershellだと

```ps1
"arikitari" | out-file -encoding:utf8 $out_file
"na" | Add-Content -encoding:utf8 $out_file
"world!" | Add-Content -encoding:utf8 $out_file
```

とかすれば良かったりするんですが、はて、これはShellScript(on bash)ではどうすればいいのかな、と。

# 先行例

[コマンドラインでUTF-8テキストのBOMを追加したり削除したりする – skmks](http://unicus.jp/skmk/archives/498)

もちろんそういうことを思う人は私だけではないわけで、先行例がありました。
ここでは``nkf``コマンドと``uconv``コマンドを使う2つの例が出ていました。
そして**多分、``nkf``コマンドを使うのが王道**なんでしょう。

# 問題点

![image](https://qiita-image-store.s3.amazonaws.com/0/94177/226d5c70-f635-f92a-d0a8-fb22161d26b1.png)

``nkf``コマンドも``uconv``コマンドも普通(CentOS 7)入っていないんですね！

# ではどうするか

解決の糸口となったのがこの記事です。

Bash/Zsh スクリプトならバイナリを扱える。さて何をしよう……
http://qiita.com/akinomyoga/items/215faa630508ffc6e6e0

どうやらbash/zshでならバイナリを扱えるというではないですか。
つまり

```plain:UTF-8のBOM
0xEF 0xBB 0xBF
```

を直接書き込めばいいわけです。

# というわけで実装した

```bash
#!/bin/bash
function writebinary {
  LC_ALL=C printf "$(printf '\\x%x' "${data[@]}")" > "$1"
}
function write_utf8_bom {
  #BOM:0xEF 0xBB 0xBF
  local -a data=(239 187 191)
  writebinary $1
}
write_utf8_bom bom.txt
echo "arikitari" >> bom.txt
echo "na" >> bom.txt
echo "world!" >> bom.txt
```

確認してみましょう。

```sh
$hexdump -C bom.txt
00000000  ef bb bf 61 72 69 6b 69  74 61 72 69 0a 6e 61 0a  |...arikitari.na.|
00000010  77 6f 72 6c 64 21 0a                              |world!.|
00000017
```

いいですね。

# 追記
@kkdd さんから教えてもらったので。

まず``echo``コマンドのmanを覗いてみましょう。

```sh
ECHO(1)                                                                                                 User Commands                                                                                                ECHO(1)

NAME
       echo - display a line of text

SYNOPSIS
       echo [SHORT-OPTION]... [STRING]...
       echo LONG-OPTION

DESCRIPTION
       Echo the STRING(s) to standard output.

       -n     do not output the trailing newline

       -e     enable interpretation of backslash escapes
```

改行を阻止する``-n``とエスケープを使えるようにする``-e``を組み合わせると

```bash
#!/bin/bash
function f()
{
  echo -en '\xef\xbb\xbf'
  echo "arikiari"
  echo "na"
  echo "world!"
}
f > bom.txt
```

```sh
$hexdump -C bom.txt
00000000  ef bb bf 61 72 69 6b 69  61 72 69 0a 6e 61 0a 77  |...arikiari.na.w|
00000010  6f 72 6c 64 21 0a                                 |orld!.|
00000016
```

同じ結果が得られたゾイ！これはいい。教えていただきありがとうございます。


# 余談

ところでこれ、``#!/bin/bash``を``#!/bin/sh``にしても動くんですが、うーむ、わかんねぇ。

# License

[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)

<a href="https://commons.wikimedia.org/wiki/File:CC-BY_icon.svg#/media/File:CC-BY_icon.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/CC-BY_icon.svg/1200px-CC-BY_icon.svg.png" alt="CC-BY icon.svg" width="88px"></a>
Rで来店顧客の多い時間を週ごとに分析（ggplot+facet_grid使用）

# はじめに
Rを使って、時間帯ごとの来店数を、週ごとに別の棒グラフで分析する方法を記録したいと思います。

# 対象データ
```data:service.csv
cancel,weekday,hour,attention,sex,age
0,2,18,0,2,10
0,5,12,0,1,10
0,4,17,0,2,10
0,0,10,0,1,10
0,4,17,0,2,10
1,0,17,0,1,10
-------
```
左から→キャンセルフラグ,曜日,時間,注意フラグ,性別,年代
となります。
（注意フラグは、一定のキャンセル数以上の場合に1が入ります）
こんな感じのcsvデータを利用します。

# 結果グラフ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156795/f4cd6e0a-7d0f-6293-383f-a93a987bd56c.png)
※木曜、土曜は午前のみ営業
※14時台は来店が少なく、他は週ごとに多い時間帯が変化している様子

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

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

# 週と時間それぞれでgoroupする（dplyrの機能）
df <- group_by(df, weekday, hour)

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

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

# 先頭行を出力
head(df)

##  Source: local data frame [6 x 3]
##  Groups: weekday [1]
##  
##    weekday  hour count
##      <int> <int> <int>
##  1       0    10    37
##  2       0    11    29
##  3       0    12    35
##  4       0    14    21
##  5       0    15    35
##  6       0    16    37

# 週のレベルを設定
custom_label <- as_labeller(c("0"="月", "1"="火", "2"="水", "3"="木", "4"="金", "5"="土"))

# plotを作成
gp <- ggplot(
  df,
  aes (
    x = hour,
    y = count,
    fill= hour
  )
) 
gp <- gp + geom_bar(stat = "identity")
gp <- gp + facet_grid(weekday ~ ., labeller = custom_label)  # facetgridで週ごとに表示
gp <- gp + ggtitle("週と時間による来店数の分析")
gp <- gp + scale_x_continuous(breaks=c(10, 11, 12, 13, 14, 15, 16, 17, 18)) # xの刻み
plot(gp)
```

# まとめ
今回は来店顧客の時間ごとの分析を、集別にしてみました。
参考になりましたでしょうか。
Unity 5 のスプライトを照らしたり暗くする

照明を暗くしても、スプライトは暗くなりませんでした。
そのときの対処をメモ書きしておきます。
環境は Unity 5.5.0f3 Personal (64bit) です。

![bandicam 2017-01-14 11-48-56-068.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/b9b07ea9-618c-89bd-0734-64f23788e3fa.gif)
成功したときの映像。

#シーン全体を暗くする
Unity5.5ではデフォルトで照明が用意されています。
特に Light を追加していない状態ならば、このデフォルトの照明を操作することで暗くできます。
メニューの Window > Lightning で表示される Lightning ウィンドウの Environment Lightning の Ambient Intensity を 0 にすると暗くすることができました。
(Ambient Intensity は Skybox が None の場合は表示されませんので注意してください。)

しかし、 Cube などと違って Sprite は Diffuse というマテリアルを適用しないと照明に関係なく表示されました。
![bandicam 2017-01-14 13-50-03-839.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/f52aab4d-dd38-81d7-d337-dda816fea1e0.gif)
Cubeは照明の強さに応じて暗くなったり明るく照らされますがSpriteは一定の明るさでした。

# スプライトへのマテリアルの適用
Material を新規作成して、Shader を Sprites Diffuse にします。
その Material を Sprite にドラッグアンドドロップなどで適用します。
これで、 Cube などと同じように照明の効果を表現できます。

## マテリアルの作り方
![2017-01-14_133456.png](https://qiita-image-store.s3.amazonaws.com/0/46088/0b92cc27-b1eb-c48b-49f0-c3809d519ce5.png)

Project ウィンドウのポップアップメニュー Create > Material などで Material を作成します。

![2017-01-14_133600.png](https://qiita-image-store.s3.amazonaws.com/0/46088/bef3dc6c-134c-cfc9-5b9b-e17fbdbe3866.png)

作成した Material のインスペクタの上側にある Shader ドロップダウンリストで Sprites > Diffuse を選択します。

![2017-01-14_133630.png](https://qiita-image-store.s3.amazonaws.com/0/46088/db023da2-8d58-d1ab-dedf-c9ba60519543.png)

Material のインスペクタが次のようになりました。

![2017-01-14_133714.png](https://qiita-image-store.s3.amazonaws.com/0/46088/7fb73abe-45ba-f6b9-0d39-c74561231b7c.png)

この Material を適用したい Sprite のコンポーネントに追加します。

# 結果
この記事の最初にものせたように、 Directional Light にも Cube と同様に照らされるようになりました。
![bandicam 2017-01-14 11-48-56-068.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/b9b07ea9-618c-89bd-0734-64f23788e3fa.gif)

また、Environment Lightning のデフォルトの照明にも対応でき、 Ambient Intensity を変えることで暗くしたり明るく照らしたりできるようになりました。
![bandicam 2017-01-14 11-56-10-782.gif](https://qiita-image-store.s3.amazonaws.com/0/46088/b25616a1-26e9-3ff7-6a71-62da2a736560.gif)

# 参考サイト
* Unity5の世界を暗黒の闇で覆う方法 - テラシュールブログ : http://tsubakit1.hateblo.jp/entry/2015/03/26/011351
* Unity Tutorial: How to make lighting affect 2D sprites in Unity 5 - YouTube : https://www.youtube.com/watch?v=kzJ5QIy-klM
Laravelを5.2から5.3にあげるときに別環境反映時のcomposer updateに注意

# 注意
Laravelのアップグレードガイドに沿って5.2から5.3へのバージョンアップを行った上で、別の環境にも適用しようと行ったところ、下記のようにcomposer updateが行えない現象が発生しました。

```bash
[vagrant@localhost laravel]$ composer update
> php artisan clear-compiled

                                                                                                                                                                
  [ErrorException]                                                                                                                                              
  Declaration of App\Providers\EventServiceProvider::boot() should be compatible with Illuminate\Foundation\Support\Providers\EventServiceProvider::boot(Illuminate\Contracts\Events\Dispatcher $events)
                                                                                                                                                                

Script php artisan clear-compiled handling the pre-update-cmd event returned with error code 1
```

解決策としては下記のように、単純に`--no-scripts`をつけてあげます。

```bash
composer update --no-scripts
```

以上。

# 経緯と原因
というだけでなく、その経緯、エラーの原因を記していきたいと思います。


そもそも、Laravelのアップデート手順として

1. composer.jsonの更新
- composer update
- Laravel使用側のソースの書き換え

といった順番をとると思います。
書き換えたcomposer.json及び、他ソースをGitに反映しますよね。
その後、別環境にある同じプロジェクトに更新を反映させる手順は下記になると思います。

1. Gitからソースを反映
- composer update

そのときに下記のようなことが起こります。

1. Laravelを使用している側のソースが5.3のものに変わる
- Laravelのcoreが5.2のまま、5.3の使用方法で動作する
- composer update時、更新前にartisanが使用されるため、5.3用に書き直したソース(EventServiceProvider等)が5.2を参照しエラーを発生させる
- composer update失敗

流れとしては以上です。
なので対策としては最初にcomposer updateするときはartisanコマンドを起動しないように`--no-scripts`をつけてあげればいいというわけです。
sshの鍵の種別と変換

#sshの鍵形式
ssh(PuTTY,OpenSSH,ssh.comのそれぞれの形式)について、使う形式と拡張子の(一部自分独自)ルールについてメモ

| 拡張子 | 形式 | ヘッダ(か先頭行)の書式 |
|:----|:----|:----:|
|(no extention) | OpenSSH private key(旧形式と新形式あり)|-----BEGIN RSA PRIVATE KEY-----(旧) <br> -----BEGIN OPENSSH PRIVATE KEY-----(新)|
|.pub           | OpenSSH public key (authorized_keysに直接追加できる)|(1行で書かれる) <br> 種別 公開鍵 コメント|
|.ppk           | PuTTY private(and public) key|PuTTY-User-Key-File-2: ...|
|.ppk.pub       | PuTTY public key (RFC 4716)|---- BEGIN SSH2 PUBLIC KEY ----|
|.bin           | ssh.com(SECSH) private key|---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----|

Windows(でなくてもいいけど)だったら、PuttyGenの最新で鍵を操作する分には変換に困らないとは思う[^1]

OpenSSHは`ssh-keygen`で変換は効くが、試したことがないので、ちょっとわからない[^2]


##参考
https://tools.ietf.org/html/rfc4716
https://www.ietf.org/proceedings/50/I-D/secsh-publickeyfile-01.txt
http://www.glamenv-septzen.net/index.php?id=1221_1#idb58b9b

[^1]: http://ice.hotmint.com/putty/
 が最新の開発に追従している(PuTTYでECDSAやEd25519もいける)&日本語OKなので、使い勝手がよいと思う

[^2]: manが翻訳されていたので、一部引用
 http://euske.github.io/openssh-jman/ssh-keygen.html

 ```text
 -m 鍵の形式
   鍵を変換する-i オプション (import) あるいは-e オプション (export) で使われる鍵の形式を指定します。サポートされている形式は:"RFC4716"(RFC 4716/SSH2 の公開鍵あるいは秘密鍵)、"PKCS8"(PEM PKCS8 の公開鍵)あるいは"PEM"(PEM の公開鍵) です。デフォルトの形式は、"RFC4716"になっています。
 ```
そういえばMacでAndroidアプリつくるために必要な準備ってなんだっけ？


結論からいうと、JAVA_HOMEの設定を忘れると後でパスが上手く通らなくて困るからそれを忘れないようにしましょうというお話。

## 手順
1. JDKのインストール
2. JAVA_HOMEの設定
3. Android Studioのインストール

## 1. JDKのインストール
JDKはJava開発の基本ソフト。Java Development Kit の略。
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

落としてきたJDKのバージョンを確認するコマンド

```  
java -version
```

java 1.8をインストールできたことが確認できる

```
java version "1.8.0_112"
Java(TM) SE Runtime Environment (build 1.8.0_112-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b16, mixed mode)
```

## 2. JAVA_HOMEの設定
ここが大事。一般的にはJDKの利用はインストールだけで問題ないようですが、Android StudioでJDKを使うためには、JDKのパスをJAVA_HOMEという環境変数に保存する必要があります。
作業はこれだけ。

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

```

意味としては、環境変数JAVA_HOMEに、javaのバージョン1.8を指定してそのパスを入れるということをしています。

環境変数の一覧以下のコマンドで見ることができます。これで上記環境変数JAVA_HOMEが追加されたことがわかります。

```
export -p
//私の環境だと↓が追加されている
//JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home"
```


また、[/usr/libexec/java_home という地味で優秀なやつがいる](http://qiita.com/yohjizzz/items/194973bf2f34608ae85a)に詳しくjava_homeのことが書かれています。


## 3. Android Studioのインストール

https://developer.android.com/studio/index.html?hl=ja

Android Studioセットアップ時に必要なSDKを自動で取得してくれます。

個人的にハマったのは、プロジェクトファイルを開いてGradleが走ったときに（iOSでいうところのcocoa pod的なもの）パスが合わなくてなんでだろ？ってなった点でした。
Clean Architecture を勉強してみた

Clean Architecture についてアレコレ話をして
自分の中で落ち着いたので走り書きレベルのまとめ

かなり手抜きっぽいけど、イメージ図にするとこんな感じ。
(画面から処理を呼んだ際、データベースから何かを読み込んで画面に反映する、みたいな構造です)
![class-specification.png](https://qiita-image-store.s3.amazonaws.com/0/19986/f7294963-bed4-3a23-fb93-012b2ac9597c.png)

TL;DR
--------------------------------------------------------------------------------

* 最も変化しないであろう根本的なデータ構造を一番下位に用意
    - DBとやり取りするデータ構造や、画面表示用のデータ構造は随時変換する
* インターフェースが重要
    - 特に上位に処理を委譲する時はかなり大事
    - テストも書きやすくなる
* ファイル数は結構多くなりそう

今までは DB用データ構造 <--> 画面表示用のデータ構造 で直接変換してたけど
両者の間に変更されにくいデータ構造を置くのは良いかも、と感じた。
また、テストを書きながら、インターフェースを介して依存性を下げる構造も改めて感心した。

内側から外側の処理が呼びたい！
--------------------------------------------------------------------------------

内側から外側の処理を呼ぶ時はインターフェースを経由するのが重要です  

ダメな実装  
![ng.png](https://qiita-image-store.s3.amazonaws.com/0/19986/a062926a-af1e-7052-a4a2-2434c0d44d71.png)

良い実装  
![ok.png](https://qiita-image-store.s3.amazonaws.com/0/19986/ac03ad77-1c88-de6a-82e0-e404dc50729c.png)

おみやげ
--------------------------------------------------------------------------------

作図は[PlantUML](http://plantuml.com/)を使いました。
一番上のイメージ図を作成する際に使ったファイルを[GitHub](https://github.com/MasayukiFukada/CleanArchitectureUMLTemplate)に置いたので  
設計等で使えそうならテンプレートにでもどうぞ。
CentOS7にZF2.5 MySQL Doctrine2 Redis を入れて開発環境を整える

CentOS7の上にLAMP環境を作るメモ。
もはやこれトレンドだけど、書き始めたときは先進だったんだよね。下書きのまま長く放置してしまいました。
いまだわかっていないところもありますが、とりあえずりりーすしておきましょ。コメント大歓迎です。

PHP７インストール

```lasso:コンソール
yum --enablerepo=remi-php70 -y install php  php-common php-devel php-mbstring php-pear php-fpm php-pdo php-mysqlnd php-intl php-pecl-redis php-gd php-gmp php-pecl-json php-xml php-phpunit-PHPUnit php-pecl-xdebug
```
php 本体たぶん
php-common なにこれ
php-devel コンパイル用
php-mbstring 日本語扱うのに必須。
php-pear 今どき使わないかも。一応
php-fpm なんだっけ
php-pdo データベース抽象化モジュール
php-mysql MySQLアクセスに必要
php-intl
php-pecl-redis Redisアクセスに必要
php-gd 画像処理
php-gmp 多桁数計算
php-pecl-json json用
php-xml xml用
php-phpunit-PHPUnit PHP単体テストユニット（開発環境用）
php-pecl-xdebug 不正値を大きく表示してくれるのでいいね（開発環境用）


httpd.conf の `AllowOverride All`にする件忘れるな。

ZendFramework2.5にDoctrineを載せて…接続しているデータベースの既存テーブルから
Entityをジェネレートするコマンド

```lasso:
./vendor/doctrine/doctrine-module/bin/doctrine-module orm:convert-mapping --namespace='Application\Entity\' --force  --from-database annotation ./module/Application/src/
```

↑そのEntityに`getter` `setter`を入れるコマンド

```lasso:
./vendor/doctrine/doctrine-module/bin/doctrine-module orm:generate-entities ./module/Application/src/ --generate-annotations=true
```






#参考記事#
[VagrantにCentOS7&PHP7のLAMP環境を構築する](http://www.unionnet.jp/develop/php7/)
[CentOS7にyumでRedisを入れる](http://qiita.com/mighty5/items/41426f417fe591955056)
[Composerをインストールしてみた](http://qiita.com/CatCable/items/02364adacf36410f449e) ：あらゆるOSへインストール詳細記事
[PHP7の上で Zend Framework 2.5 を動かす②](http://qiita.com/mighty5/items/0737034e216a76c40195)

[Zend Framework とともに Doctrine を使用する](http://www.ibm.com/developerworks/jp/opensource/library/os-doctrine-php-zend/#N101AA) ：リンクを辿るとZF2用へ飛びます
[Doctrine Project](http://www.doctrine-project.org/)
[Doctrine 2 ORM Module for Zend Framework 2](https://github.com/doctrine/DoctrineORMModule#doctrine-2-orm-module-for-zend-framework-2)
[Zend Developer Tools](https://github.com/zendframework/ZendDeveloperTools#zend-developer-tools)
[Zend Framework2でデバッグツールバーを利用する](http://qiita.com/sasezakit/items/87dee03c9b365c352635)
[A Quick Guide to Using the MySQL Yum Repository](http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)
ElixirからCowboy 1.0と2.0を使ってみる Part 9

# はじめに
ElixirにてCowboyを直接動かすための記事となります。
[前回](http://qiita.com/hayabusa333/items/364db1934c0af8cf5ef8)の記事では、cookieの操作を行い、cookieの追加を行いました。
今回の記事では、リクエストの中にあるcookieの情報を確認してみます。

[Cowboy1.0のサンプルコードはこちらになります](https://github.com/hayabusa333/elixir_cowboy_example/tree/cookie_read_cowboy)

[Cowboy2.0のサンプルコードはこちらになります](https://github.com/hayabusa333/elixir_cowboy_example/tree/cookie_read_cowboy_two_pre4)

# バージョン
使用した言語やライブラリのバージョンは下記となります。

## cowboy 1.0のバージョン
|  | Version |
|:-----------|--------:|
| Elixir | 1.3.2 |
| Erlang | 19.2 |
| Cowboy | 1.0.4 |

## cowboy 2.0のバージョン
|  | Version |
|:-----------|--------:|
| Elixir | 1.3.2 |
| Erlang | 19.2 |
| Cowboy | 2.0.0-pre4 |

# Cookieの情報を読み取る

今回はCookieの情報を読み取る内容となっておりますので前回のHandlerに追加でコードを記載していきます。

## cowboy 1.0の場合

``` elixir:lib/elixir_cowboy_example/cookie_handler.ex
  def handle(req, state) do

     # cookiesメソッドにて全てのcookie情報を取得できる
     {all_cookies, req} = :cowboy_req.cookies(req)
     # cookieにて第一引数で引き渡した文字列のcookie情報を取得できる
     {cookie_val, req} = :cowboy_req.cookie("hoge", req)

     IO.inspect all_cookies
     IO.inspect cookie_val

     cookie_req = :cowboy_req.set_resp_cookie("server", "add_cookie", [
       {:max_age, 3600},
       {:domain, "localhost"},
       {:path, "/"}
       ], req)

     headers = [ {"content-type", "text/html"} ]
     body = "push cookie"
     { :ok, reply } = :cowboy_req.reply(200, headers, body, cookie_req)

     {:ok, cookie_req, state}
  end
```

## cowboy 2.0の場合

``` elixir:lib/elixir_cowboy_example/cookie_handler.ex
  def init(req, opts) do

    # parse_cookiesにて、全てのcookie情報を取得し
    # parse_cookiesにて取得した情報はListで束縛されているため
    # List.keyfindにて値を取得できる
    all_cookies = :cowboy_req.parse_cookies(req)
    cookie_val = List.keyfind(all_cookies, :hoge, 0)

    IO.inspect all_cookies
    IO.inspect cookie_val

    # mathc_cookiesにてmatchした情報のみを取得することもできるが
    # matchしなかった場合にはクラッシュするようになっている
    # IO.inspect :cowboy_req.match_cookies([:hoge], req)

    cookie_req = :cowboy_req.set_resp_cookie("server", "add_cookie", 
       %{max_age: 3600, domain: "localhost", path: "/"},
       req)

    header = %{"content-type" => "text/html"}
    body = "push cookie"
    { :ok, reply } = :cowboy_req.reply(200, header, body, cookie_req)

    {:ok, cookie_req, opts}
  end
```


# 記載したコードの実行
コードの記述が完了しましたので、それでは実行していきましょう。
いつも通り `iex -S mix` にて cowboy を実行していき、`http://localhost:4000/cookie`にアクセスしてみましょう。
下記のように表示される

# Cowboy1.0の場合

cookieメソッドにて、値を習得した場合に存在しない値を取得しようとすると`:undefined`となる

```cmd
iex(1)> [{"server", "add_cookie"}]
:undefined
```

# Cowboy2.0の場合

List.keyfindにて値を取得するため、値がない場合には`nil`となる

```cmd
iex(1)> [{"server", "add_cookie"}]
:nil
```

# 最後に

今回はサーバ上にてcookie情報を取得する方法を実装しました。
持っているCookie情報から処理を変える方法などもありますので、使用することもあるかとおもいますが、1.0と2.0にてメソッド名が違うため注意が必要です。
それではまた次回

# 参考サイト
[Cowboy User Guide](https://ninenines.eu/docs/en/cowboy/1.0/guide/)
[Cowboy User Guide](https://ninenines.eu/docs/en/cowboy/2.0/guide/)
PythonでPPAP

Pythonの特殊メソッドを使ってPPAPをやってみました。
文字列の足し算、掛け算を`__add__`、`__mul__`を使ってやりました。


# コード

```py:PPAP
import re

## PPAP class
class PPAP(str):
    def __add__(self, other):
        self.print_materials(other)
        result = "{1}-{0}".format(self, other)

        print("Oh, {0}!".format(result))

        return PPAP(result)

    def __mul__(self, other):
        match = re.search("(\w+)-(\w+)", other)
        mate_1, mate_2 = match.group(1), match.group(2)
        result = "{0}-{1}-{2}".format(mate_2, mate_1, self)

        print("{0}!!".format(result))

        return PPAP(result)

    def print_materials(self, other):
        print("I have a {0}~".format(self))
        print("I have a {0}~".format(other))


# PPAPの実行
pen = PPAP("pen")
apple = PPAP("apple")
pineapple = PPAP("pineapple")

print("---(1st Phase)---")
result_1 = pen + apple
print("---(2nd Phase)---")
result_2 = pen + pineapple
print("---(Last Phase)---")
result_1 * result_2
```

```:result
---(1st Phase)---
I have a pen~
I have a apple~
Oh, apple-pen!
---(2nd Phase)---
I have a pen~
I have a pineapple~
Oh, pineapple-pen!
---(Last Phase)---
pen-pineapple-apple-pen!!
```
context switchが多いプロセスを集計してソートするonliner

`pidstat -w`コマンドの出力から`cs/s`の値をプログラム名ごとに集計して昇順ソートします。

```
pidstat -w 2 1 | grep "^Aver" | awk '{a[$6]+=$4}END{for(i in a)print i" "a[i]}' | sort -nk2
```
RGB LED +Sensor +deepSleep(esp8266) with Atmega328P

esp8266+ MCU(ATmega328P)連携の作例となり。
3.3V系arduino 、arduinoライブラリ等を使用した製作事例の一部となります。
## RGB LED+ Analog Sensor の飾り系でDeepSleep(省エネ)版
![IMGP6408.JPG](https://qiita-image-store.s3.amazonaws.com/0/159710/4b70c03c-1e86-9d32-51ae-b44023995710.jpeg)

### youtube
https://www.youtube.com/watch?v=R3A6hPbOOSE
***
### Parts
RGB LED /OST4ML8132A_OptoSupply (1 PCS) / 40 JPY
http://akizukidenshi.com/catalog/g/gI-08347/

Sensor LM60BIZ / 100JPY
breadBoard / 100JPY

***
### Schematic
https://github.com/kuc-arc-f/makeKuc-RGB-Analog2/blob/master/pcb/RGB_Analog.pdf
![ss-schRGB-0114a2.png](https://qiita-image-store.s3.amazonaws.com/0/159710/2b3609d3-d4bd-b965-c8dc-05cfced077c0.png)
***
### analog DATA
![ss-RGB-0114a1.png](https://qiita-image-store.s3.amazonaws.com/0/159710/1186e723-c159-5eec-7b31-dea23d5c9f82.png)

***
### Driver ,Git
https://github.com/kuc-arc-f/makeKuc-RGB-Analog2

***
### related- Parts: mkuBoard-44
http://kuc-arc-f.com/make/?p=1070
### related: List :
http://kuc-arc-f.com/make/?p=1199
SQLアンチパターン：インデックスショットガン (闇雲インデックス)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- パフォーマンスを最適化する

# アンチパターン

闇雲にインデックスを使用する

- インデックスを定義しない、もしくは、少しだけ
- インデックスを多く定義する、もしくは、役に立たないのを定義する
- インデックスを活用しないクエリーを実行してしまう

インデックスは、オーバーヘッドを発生させる
- insert、update、delete の時にインデックスは更新されるが、selectの方が多いので、インデックス維持のためのオーバーヘッドと、selectのためのオーバーヘッドを比べて考える

インデックスを使えないクエリを実行する
- 複合インデックスでは、順番が大切（左から右）で、順番通りに使わないといけない
- 無駄なインデックスになる時がある

- インデックスは、SQLの規格ではない

## 用いてもいいパターン

汎用的なデータベースを設計する必要がある場合
- この場合は、あとで必要なことがわかる

# 解決策

# まとめ

データとクエリについての理解を深め、MENTOR の原則に基づいてインデックスを管理しましょう。

# 感想

- MENTOR の原則
- 複合インデックスは、設計とアプリケーションの実装両方をしないといけなさそう


[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
kv言語でSliderとTextInputの値を連動させる

## 概要
kv言語でSliderとTextInputの値を連動させる．

### 環境
 - Python: 3.5.2
 - Kivy: 1.9.1

## python
```python:main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout

class RootWidget(BoxLayout):
    pass

class MainApp(App):
    def build(self):
        return RootWidget()

if __name__ == '__main__':
    MainApp().run()
```


## kv
```python:main.kv
<RootWidget>:
    orientation: 'vertical'

    BoxLayout:	# dummy

    BoxLayout:
        size_hint_y: None
        height: 50.0

        Slider:
            id: testSlider
            size_hint_x: 0.75
            min: 0.0
            max: 100.0
            value: 20.0
            # on_touch_move: testTextContent.text = '{:.0f}'.format(self.value) # sliderはイベント不要

        TextInput:
            id: testTextContent
            size_hint_x: 0.25
            text: '{:.0f}'.format(testSlider.value)  # sliderの値を取得
            multiline: False
            on_text_validate: testSlider.value = int(self.text)  # sliderに値を設定
    		
    BoxLayout:	# dummy
```

## 結果
![2017-01-14_10h30_52.png](https://qiita-image-store.s3.amazonaws.com/0/43136/202658d0-c250-795f-b4cc-ac621c40566d.png)
arduinoで「collect2.exe: error: ld returned 5 exit status」 その２


#概要
arduino ide v1.6.6で自分の環境では(windows xp sp3)、上記エラーで、参った。

#対策
xpでやりたいので、動く、ld.exeを探す。

v1.05が良かった。
/hardware/tools/avr/avr/binにあるやつを、コピペした。