OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleAppEngineを使ってレスポンスを自動的にgzip圧縮してもらう

GoogleAppEngineにdjangoのアプリを載せていたのですが、
レスポンスサイズが大きいな……と思い、gzip圧縮しよう！と思ったら予想以上にドハマリしてしまったので。
備忘録的に。

## 事象
当初はDjangoのdjango.middleware.gzip.GZipMiddlewareを使用して解決のはずだったんですが、
headerにAccept-Encodingを入れてもgzip圧縮されて帰ってこず！
おかしいなと思い、request headerを見てみると、プログラム上ではAccept-Encodingのヘッダーが消えている！
何故だッ！？ と、思ったらちゃんとドキュメントに書いてありました。

[removed_headers](https://cloud.google.com/appengine/docs/standard/go/reference/request-response-headers#removed_headers)

- Accept-Encoding
- Connection
- Keep-Alive
- Proxy-Authorization
- TE
- Trailer
- Transfer-Encoding

上のrequest headerは勝手に消えるみたいですねー

## 解決
ではでは、Accept-Encodingなしでどうやってgzip化するかどうか判定させよう？と思ったら、これもちゃんと書いてありました。
[response_compression](https://cloud.google.com/appengine/docs/standard/go/how-requests-are-handled#response_compression)

```
curl \
-H "accept-encoding:gzip" \
-H "user-agent:gzip" \
https://xxxxxxxxxx.appspot.com/sugoi_api/
```

request headerのAccept-EncodingとUser-Agentの**両方**にgzipと含まれていれば、
上のcurlの戻りがアプリ上で特に何もしなくても自動的にgzip化してくれて返してくれました。

ちなみに一般的なブラウザのUAにはgzipと含まれていないんですが、ちゃんとgzip圧縮されたものが返却されました。
なので、gzip解凍ができるブラウザ、またはgzipってプログラム上で明示的に入れていれば圧縮して返すよ！ということなのかなと。

いやけど、User-Agentも判定に入れるってわかりにくくないですかね？
いやちゃんと最初から全部読んでいれば良かったんですが……うむむむ。
AnacondaのPATHの設定

##**はじめに**
condaを使用してpythonの仮想環境を構築しようとした際に、

```bash
-bash: conda: command not found
```
となってしまいanacondaのパスが通っていなっかのでその解決法の基礎的なメモ

Anacondaのインストールからの解説は以下を参考

- [Anaconda で Python 環境をインストールする](https://qiita.com/t2y/items/2a3eb58103e85d8064b6)

***
##**解決法**
まずターミナルで以下のコマンドを実行

```bash

$ vi ~/.bash_profile
```
vimが開いたら

- i (インサートモードにする）
- 以下のパスを.bash_profileに追加

```bash
export　PATH=/Users/user_name/anaconda3/bin:$PATH
```
- esc（インサートモードの終了）
- :wq（保存して終了）
- 以下のコマンドをターミナルで実行して、追加したパスを反映させる

```bash
$ source ~/.bash_profile
```
ここまで終わって、pythonのパスを確認してみると

```bash
Python 3.6.5 |Anaconda, Inc.| (default, Apr 26 2018, 08:42:37) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
```
無事、パスが通っていることが確認できました。
[AutoHotKey]コマンドラインでTwitterに画像投稿するとき、添付画像をプレビューする関数


- [\[AutoHotKey\]関数内で動的ホットキーを定義する \- Qiita](https://qiita.com/catfist/items/b7c9d2b21a15beee6238)

↑の続きでもある。

![](https://i.imgur.com/844rZeQ.jpg)

こんな感じ。

`SplashImage`で画面左上から4つまで並べます。（Twitterが4つまでだから）

画像が縦長でも横長でもよしなに並べます。

```:ahk
SplashTile(img,length)
{
    gui,add,picture,hwndmypic,%img%
    controlgetpos,,,width,height,,ahk_id %mypic%
    ; via https://autohotkey.com/board/topic/12001-finding-the-widthheight-of-a-picture/
    if (width > height)
    {
        zH = -1
        zW = %length%
        zX = 0
        ZY := (length - (height * (length / width))) / 2
    }
    Else
    {
        zH = %length%
        zW = -1
        zX := (length - (width * (length / height))) / 2
        ZY = 0
    }
    static X
    static Y
    static counts
    counts += 1
    If (counts = 1 or counts = 3)
        X = 0
    Else
        X := length + 5
    If (counts < 3)
        Y = 0
    Else
        Y := length + 25
    H := (length + 20)
    SplashImage, %counts%:%img%, A B2 W%length% H%H% X%X% Y%Y% ZH%zH% ZW%zW% ZX%zX% ZY%zY% CWBlack CTWhite, , %counts%,
}
```
アプリケーションを高速化するBOLTを試してみた

#はじめに
Facebookがアプリケーションを高速化するBOLTというツールを公開したので試してみました。
以下によると、2-15% ほどアプリケーションの性能が上がるそうです。

https://code.facebook.com/posts/605721433136474/accelerate-large-scale-applications-with-bolt/?r=1

記事を読む感じだと、プロファイルデータをもとにプログラムバイナリの配置を修正し、プログラム命令自体の CPU キャッシュへの載り方とTLBミスの発生を最適化するようです。

#環境
CentOS7 の環境でやりました。
BOLT (perf) は CPU のパフォーマンスカウンタを使って性能プロファイリングをするので、AWSなどの仮想マシンでは実行できない可能性があります。

また、BOLTのビルド時にはかなり大量のメモリを使います。ビルドだけはAWSなどを利用したほうが良いかもしれません。（私は m5.4xlarge を使いました。）

## 環境
OS: CentOS 7.4
メモリ： 64GB 程度 ※BOLT ビルド時にかなりメモリを使います
ディスク: 30GB 程度の空き  ※BOLT ビルド時にかなり容量を食います

# ビルド方法
## 準備
まずは必要なパッケージを入れます。
ビルドには新しい目の GCC がいるので GCC の7 系を入れます。

```bash
$ sudo yum groupinstall 'Development Tools'
$ sudo yum install centos-release-scl-rh epel-release
$ sudo yum install cmake3
$ sudo yum install -y "devtoolset-7-gcc*"
$ sudo yum install -y ninja-build
```

ビルドは以下に従って実行します。
https://github.com/facebookincubator/BOLT

```bash
$ git clone https://github.com/llvm-mirror/llvm llvm
$ cd llvm/tools
$ git checkout -b llvm-bolt f137ed238db11440f03083b1c88b7ffc0f4af65e
$ git clone https://github.com/facebookincubator/BOLT llvm-bolt
$ cd ..
$ patch -p 1 < tools/llvm-bolt/llvm.patch

$ cd ..
$ mkdir build
$ cd build
$ scl enable devtoolset-7 bash   # gcc のバージョン切り替え
$ cmake3 -G Ninja ../llvm
$ ninja-build
```

LLVM のビルドになり、かなり時間がかかるので気長に待ちましょう。
正常にビルドできれば llvm-bolt というバイナリができます

```bash
$ ls -l bin/llvm-bolt
-rwxrwxr-x. 1 centos centos 1137884624  6月 23 11:33 bin/llvm-bolt
````


# 実行方法
実行も下記に手順があります。
https://github.com/facebookincubator/BOLT

プログラムを実行して perf でプロファイルデータを取り、それをBOLTに渡してバイナリを最適化するという流れです。

適当なアプリケーションがないので、今回はUnixBenchのベンチマークプログラム (dhry2) を最適化してみました。

## dhry2 のビルド
BOLTで最適化できるよう、プログラムのリンク時に "-Wl,--emit-relocs" をつけておきます。


```bash
$ git clone https://github.com/kdlucas/byte-unixbench.git
$ cd byte-unixbench/UnixBench/
$ gcc -o pgms/dhry2 -Wall -pedantic -O3 -ffast-math -march=native -mtune=native -I ./src -DTIME -DHZ= ./src/dhry_1.c ./src/dhry_2.c -Wl,--emit-relocs
```

## BOLT の実行
最初に perf でプロファイルを取り、BOLT を実行してプログラムを最適化します

```bash
$ sudo perf record -e cycles:u -j any,u -o perf.data -- ./pgms/dhry2 10
$ sudo perf2bolt -p perf.data -o perf.fdata ./pgms/dhry2
$ sudo llvm-bolt ./pgms/dhry2 -o ./pgms/dhry2.bolt -data=perf.fdata -reorder-blocks=cache+ -reorder-functions=hfsort+ -split-functions=3 -split-all-cold -split-eh -dyno-stats
$  ls -l ./pgms/dhry2*
-rwxrwxr-x 1 user1 user1   19648  6月 23 19:53 ./pgms/dhry2
-rwxr-xr-x 1 root  root  8399680  6月 23 20:40 ./pgms/dhry2.bolt
```

# 性能比較
最適化前／後でそれぞれ dhry2 の性能値を取り比較してみました。

||性能値|改善率｜
|-------|---|---|
|最適化前|81063732|-|
|最適化後|78195069|-3%|


ほぼ誤差の範囲ですね。
UnixBenchではプログラムが小さくて最適化の効果があまりなかったのだと思います。
もう少し複雑なプログラムがあれば効果が見えるかもしれません。
LaTeXで作ったPDFファイルをPDF/A準拠にする(Mac)

# PDF/Aを作りたい
LaTexを使って書いた書類をdvipdfmxなどでPDFに変換することがある．その場合に出力されたPDFファイルは大抵問題なく使えるが，たまにPDFファイルが特定の規格に準拠していることが求められる場合がある．

論文原稿が[PDF/A](https://www.iso.org/standard/38920.html)準拠していることを求められた．Adobe Acrobatなどの有償ソフトウェアを使えばできるが，今回はオープンなソフトウェアでPDF/Aへの変換と準拠チェックを行う．


# PDFファイルのPDF/A形式への変換手順

## 準備

`Ghostscript`でできる．Homebrewでインストールされていることを前提にする．なければ`brew install ghostscript`.

## PDFを作る

Illustratorなどで作成する．今回はカラーモードをRGBで作成する．ICCプロファイルは`AdobeRGB1998`を指定する．[参考ページ](https://www.pdfa.org/pdfa-and-colors/)

## Ghostscriptの設定ファイルを作成する

Ghostscriptがインストールされているディレクトリに設定ファイルの雛形が置いてある．Homebrewでインストールしたので`/usr/local/Cellar/ghostscript/9.23/share/ghostscript/9.23/lib/PDFA_def.ps`にあった．`9.23`はバージョンによって異なるので注意．これを適当な場所にコピーして保存．

```bash
$ cd <some-directory>
$ cp /usr/local/Cellar/ghostscript/9.23/share/ghostscript/9.23/lib/PDFA_def.ps .
```

`PDFA_def.ps`を編集．

```
%!
% This is a sample prefix file for creating a PDF/A document.
% Feel free to modify entries marked with "Customize".
% This assumes an ICC profile to reside in the file (ISO Coated sb.icc),
% unless the user modifies the corresponding line below.

% Define entries in the document Info dictionary :
/ICCProfile (AdobeRGB1998.icc) % Customise
def

[ /Title (Title)       % Customise
  /DOCINFO pdfmark

% Define an ICC profile :

[/_objdef {icc_PDFA} /type /stream /OBJ pdfmark
[{icc_PDFA}
<<
  /N currentpagedevice /ProcessColorModel known {
    currentpagedevice /ProcessColorModel get dup /DeviceGray eq
    {pop 1} {
      /DeviceRGB eq
      {3}{4} ifelse
    } ifelse
  } {
    (ERROR, unable to determine ProcessColorModel) == flush
  } ifelse
>> /PUT pdfmark
[{icc_PDFA} ICCProfile (r) file /PUT pdfmark

% Define the output intent dictionary :

[/_objdef {OutputIntent_PDFA} /type /dict /OBJ pdfmark
[{OutputIntent_PDFA} <<
  /Type /OutputIntent             % Must be so (the standard requires).
  /S /GTS_PDFA1                   % Must be so (the standard requires).
  /DestOutputProfile {icc_PDFA}            % Must be so (see above).
  /OutputConditionIdentifier (sRGB)      % Customize
>> /PUT pdfmark
[{Catalog} <</OutputIntents [ {OutputIntent_PDFA} ]>> /PUT pdfmark
```

`/ICCProfile (AdobeRGB1998.icc) % Customise`の部分が重要．

## 変換

以下のようなBashスクリプトで変換した．

```

#!/bin/bash

OUT=<path-to-output-file>.pdf
IN=<path-to-input-file>.pdf

# PS should be absolute path
PS=<path-to-PDFA_def.ps> 

gs -dPDFA=1 \
    -dBATCH \
    -dNOPAUSE \
    -dNOOUTERSAVE \
    -sDEVICE=pdfwrite \
    -sOutputICCProfile=AdobeRGB1998.icc \
    -o ${OUT} \
    ${PS} \
    ${IN}

```

## 変換されたファイルがPDF/Aに準拠しているかどうかの判定

[veraPDF](https://github.com/veraPDF/veraPDF-apps)が使える．READMEにしたがってインストールをすれば`verapdf-gui`, `verapdf`が使えるようになる．　`verapdf-gui`はGUIのツールで，以下のようにファイルを選んでExecuteボタンを押せば結果を見ることができる．

<img width="705" alt="PDF_A_Conformance_Checker_と_「LaTeXで作ったPDFファイルをPDF_A準拠にする_Mac_」を編集_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/137648/3fcda37a-ffdd-be1d-91cd-41439cbc07e1.png">
【SSH】なかなか覚えられない基本の備忘録

#はじめに
業務中に耳にしたIT用語と諸々について、覚えては忘れてを繰り返しており、
そろそろ自分の底のないバケツ並みの脳みそに呆れ始めたので
とりあえずまとめました。(メモしてたことを並べただけ。。。)
これで多分きっともう絶対に忘れない。(｀・ω・´) 

#参考

- [SSHなるものをよくわからずに使っている人のための手引書](https://qiita.com/kenju/items/b09199c4b3e7203a2867)
- [sshで公開鍵認証を使ってアクセスする](https://qiita.com/mountcedar/items/43157ff1225c56500655)
- [ターミナルでSSH (Mac OS X)](https://blog.thingslabo.com/archives/000003.html)
- [インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](https://qiita.com/tag1216/items/5d06bad7468f731f590e)

#**SSHとは**

##そもそもなんでSSHを使わないといけないのか？？
サーバを遠隔から操作するために、SSHでネットワークから接続しないといけないらしい。

##SSHのいいところと特徴
暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。
パスワードなどの認証部分を含むすべてのネットワーク上の通信が暗号化される。

- SSHは「Secure Shell」の訳で、**リモートシェル**に特化しています。
- **公開鍵認証**という仕組みを用いて、セキュアな通信を実現しています。
- **プロトコル**でもある。他にはHTTPとかがあるらしい。

>プロトコルとは、ネットワーク上で**データを通信するための手順や規約の集合のこと**
「protocol」には「規約」「議定書」といった意味がある。
引用：https://www.weblio.jp/content/%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB?edc=BINIT

HTTPもSSHもOSI参照モデルと呼ばれる層の最上位、アプリケーション層に位置している。
<img width="479" alt="スクリーンショット 2018-06-12 18.26.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/186535/effd56c8-d3ae-9a10-3bc5-5c48e8cb3ada.png">

引用：[OSI参照モデルまとめ](https://qiita.com/tatsuya4150/items/474b60beed0c04d5d999)


##SSHを使えば！
リモートサーバに安全にログインできる！
ファイルをセキュアに送受信できる！！！

>セキュア：
IT分野では、**システムやネットワーク、データなどが安全な状態に保たれている**こと。
(安全を意味する英単語securityの形容詞secure)
引用：http://www.kddi.com/yogo/%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3/%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2.html

とりあえず安全！！！(｀・ω・´)




#SSHのログイン認証方法〜安全に通信するために〜
##パスワード認証
- 必要なもの：ユーザ名とパスワード(この組み合わせ一般的によく見る)
- 安全面：ユーザ名とパスワードがわかれば誰でもログインできちゃうから微妙・・・？！
- 心配の穴埋めのために：SSHの設定ファイルを変更して無効にするのが標準(は？)

##公開鍵認証による接続
- 必要なもの：公開鍵(事前にローカル側で作成)と秘密鍵
- やること：公開鍵をログイン先のサーバに登録する
- 接続できる人：登録された公開鍵に対応した秘密鍵を持っているクライアントのみ
- 安全面：パスワード認証より安全

##↑の、公開鍵認証について
###公開鍵認証するのに必要な作業
- （クライアント側）公開鍵と秘密鍵を生成
- （クライアント側→サーバ側）公開鍵をコピーし、サーバ側に設置


##秘密鍵と公開鍵
###どうやってつくるの？
```
$ cd ~/.ssh
$ ssh-keygen -t rsa -f <filename>
```

ssh-keygenコマンドを叩くと、~/.sshディレクトリがまず作成され、
その中に公開鍵（id_rsa.pub）と秘密鍵（id_rsa）が作成される。

##パスフレーズとは
秘密鍵を使う際に必要なパスワード
秘密鍵が盗まれた時の対策として存在するらしい。


#**SSHコマンド**
```
ssh [user@]hostname [command]
```
リモートホストに接続してコマンドを実行する時に使用する。

```-F configfile```
設定ファイルを指定する。デフォルトでは`~/.ssh/config`が使用される。

###コンフィグ(config)とは
>コンフィグとは「設定」という意味(configuration（コンフィギュレーション）の略語)
IT業界では**コンピュータ、サーバ、ネットワーク機器などの設定**のこと
引用：http://it-yougo.com/system-term/%E3%82%B3%E3%83%B3%E3%83%95%E3%82%A3%E3%82%B0config/

以上！

今まで手順を覚えて事務的に叩いてたけど、なんとなく背景が見えてきた気がする。。。。orz
[GAS]GASの処理時間を調べられるようにしておきたい。

#やったこと
GASの1つの関数?で処理時間を6分を超えるとタイムアウトエラーになってしまうそうワニ🐊
今のところ自分が作っているものではそんなこともないだろうと思ってますワニですが、
いざという時の為に調べられるようにするワニ。

#ソースコード
これがコードワニ🐊

```GASのソース.
function myFunction() {

  // 処理や関数の頭で現在の時刻を取得する(ms)
  var funcStartTime = new Date().getTime();

  // 10ms待ち  
  sleep(10);
  
  // 処理や関数が終わったら、終了時点の時刻を取得する(ms)
  var funcEndTime = new Date().getTime();
  
  // 終了時点の時刻-開始時点の時刻を差し引いて処理時間を求める(ms)
  var funcProcessTime = funcEndTime - funcStartTime;
  
  // 処理時間をログ出力
  Logger.log(funcProcessTime);
}

function sleep(time)
{
    var startTime = new Date().getTime();

   while (true)
   {
     var elapsedTime = new Date().getTime();

     if ((elapsedTime - startTime) > time)
     { 
       break;
     }
     elapsedTime = null;
   }
}

```

#所感
・qiitaに挙げるレベルのものかは存じませぬが、、怒られない限り載せておくワニ🐊
Haskellで競プロの問題を解いてみる

# 軽く自己紹介
僕(@kaicho8636)は普段、C++, Pythonで色々しながらHaskellを勉強中なのですが、言語の制約が緩いプロコンとかで使えないかなぁと思ってこの記事を書きました。
# 今回使うサイト
[AIZU ONLINE JUDGE β](https://onlinejudge.u-aizu.ac.jp/home)
# Problems & Solutions
## 第1問
### [JOI-Trial 0582](https://onlinejudge.u-aizu.ac.jp/challenges/sources/JOI/Trial/0582)
> 　三角形の形は辺の長さで決まる． 順番に３つの正整数が与えられたとき， 辺の長さがそれらの値と一致する三角形が存在するかどうかを調べ， 存在するなら鋭角三角形，直角三角形，鈍角三角形のいずれかを判定し， 次の入力へ進む． 三角形が存在しないとき， それまでに入力された，三角形，直角三角形，鋭角三角形，鈍角三角形の 個数を空白で区切って出力し， それ以降の入力は無視して終了する． 入力の中には必ず三角形が存在しないようなものがある と仮定してよい. 入力の行数は判らないが各行には３つの正整数が空白で区切って書かれている． ただし，各整数は100 以下とする.

>出力ファイルにおいては， 出力の最後の行にも改行コードを入れること． 

### [僕の回答](https://onlinejudge.u-aizu.ac.jp/solutions/problem/0582/review/2961567/kaicho8636/Haskell)

```haskell:0582.hs
import Data.List
import Control.Applicative

data Tri = NotT | SharpT | RightT | DullT

typeOfTri :: [Int] -> Tri
typeOfTri [a, b, c]
  | c > a+b = NotT
  | x == LT = SharpT
  | x == EQ = RightT
  | x == GT = DullT
  where x = compare (b*b+a*a) (c*c)

loop :: Int -> Int -> Int -> Int -> IO ()
loop a b c d = do
  tri <- sort . fmap read . words <$> getLine :: IO [Int]
  case typeOfTri tri of
    NotT   -> putStrLn . unwords $ show <$> [a, b, c, d] 
    SharpT -> loop (a+1) b c (d+1)
    RightT -> loop (a+1) (b+1) c d
    DullT  -> loop (a+1) b (c+1) d

main :: IO ()
main = loop 0 0 0 0
```
う〜ん、結構数学的思考も求めてきますね…

## 第2問
### [JOI-Trial 0583](https://onlinejudge.u-aizu.ac.jp/challenges/sources/JOI/Trial/0583)
> 　入力ファイルの１行目に正整数 n が書いてあり， ２行目には半角空白文字１つを区切りとして， n 個の正整数が書いてある． n は 2 または 3 であり， ２行目に書かれているどの整数も値は 108 以下である． これら２個または３個の数の公約数をすべて求め， 小さい方から順に1行に1個ずつ出力せよ． 自明な公約数（「１」）も出力すること．

>出力ファイルにおいては， 出力の最後行にも改行コードを入れること．
 
### [僕の回答](https://onlinejudge.u-aizu.ac.jp/solutions/problem/0583/review/2961905/kaicho8636/Haskell)
```haskell:0583.hs
import Data.List
import Control.Applicative
import Control.Monad

getDivisor :: Int -> [Int]
getDivisor n = [m | m <- [1..n], n `mod` m == 0]

getCommon :: [Int] -> [Int] -> [Int]
getCommon xs ys = [x | x <- xs, y <- ys, x == y]

main :: IO ()
main = do
  getLine
  xs <- fmap read . words <$> getLine :: IO [Int]
  let cds = foldr1 getCommon $ fmap getDivisor xs
  putStr . unlines $ show <$> cds
```
こっちは割と問題自体は簡単ですね。
効率を追求するならStateモナドとか使ったほうがいいのかな？
最後に改行いれたら怒られました。
改行コードとか大嘘じゃん…

# まとめ
Haskellでもある程度競プロはできる。

## まとめ'
Haskeller少なスギィ…
<img width="1246" alt="スクリーンショット 2018-06-23 19.53.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/213120/39187625-36f8-20c9-6698-9bffce56718c.png">
Menoh を試してみる

Chainer4、Chainer4+iDeep、Menohでざっくりと性能比較してみました。

Menohは、PFNが発表した、C++推論エンジンです。

https://research.preferred.jp/2018/06/menoh-release/

# 必要なものをインストール

```
$ sudo apt install cmake libopencv-dev
$ sudo apt install autoconf automake libtool curl make g++ unzip
```

## protobuf をインストール

aptで入るprotobufは古いので、コードからインストール。

```
$ git clone https://github.com/google/protobuf.git
$ cd protobuf
$ git submodule update --init --recursive
$ ./autogen.sh && ./configure && make && make check
$ sudo make install
$ sudo ldconfig # refresh shared library cache.
```
## mklをインストール

0. https://software.intel.com/en-us/mkl から、"Intel Math Kernel Library"をダウンロード
1. MKLに必要なものをインストール `$ apt install -qq cpio g++`
2. `$ tar xvzf downloads/l_mkl_2018.3.222.tgz && cd l_mkl_2018.3.222 && sudo ./install.sh` 画面に従いインストール
3. `$ export LD_LIBRARY_PATH="/opt/intel/mkl/lib/intel64:/opt/intel/lib/intel64:$LD_LIBRARY_PATH"` (必要ならば、~/.bashrc などに書く)

[参考:Chainer 4.0 + iDeep がすごい](https://qiita.com/ikeyasu/items/62781ac2eeff5be4e5f4#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95)

## mkl-dnnをインストール

```
$ git clone https://github.com/intel/mkl-dnn.git
$ cd mkl-dnn/scripts && ./prepare_mkl.sh && cd ../
$ mkdir -p build && cd build && cmake .. && make
$ sudo make install
```

# menoh をインストール

```
$ git clone https://github.com/pfnet-research/menoh.git
$ cd menoh
$ mkdir data
$ python3 retrieve_data.py
$ mkdir build && cd build
$ cmake ..
$ make
$ sudo make install
```

# 評価

GCEのf1-microで試そうかと思いましたが、メモリーが足らなかったので、[手元のPC](https://qiita.com/ikeyasu/items/db16a5d9fc68fa21b3d5)で、[nvidia-docker2](https://qiita.com/ikeyasu/items/6e1069be9304f8342074)上での動作です。

|env  |msec  ||
|---|---|---|
|Chainer4(CPU)  |604msec  ||
|Chainer4 + iDeep  |98msec  ||
|menoh(mkl)  |103.9 msec  ||

## Chainer 4 の場合

604 msec

https://github.com/peisuke/DeepLearningSpeedComparison/blob/master/chainer/vgg16/predict.py を利用

```
$ predict.py
mxnet-vgg-16 : 0.604022 (sd 0.003342)
```

## Chainer 4 + ideep の場合

98 msec

https://gist.github.com/ikeyasu/971ece2e32ddf36bcc40a71762f68cd9#file-predict_ideep-py

```
$ python3 predict_ideep.py
mxnet-vgg-16 : 0.097915
```

## menohの場合

103.9 msec

menoh のサンプルを20回実行し、1回当たりの実行時間を求めるように修正
https://gist.github.com/ikeyasu/bfb4d5cd6f636cdcbc16e41cf8f95347

実行するモデルは、 https://gist.github.com/ikeyasu/971ece2e32ddf36bcc40a71762f68cd9#file-convert_to_onnx-py で変換した onnx で、Chainer4 で実行したものと同じ。

```
$ example/vgg16_example_in_cpp --model ../../DeepLearningSpeedComparison/chainer/vgg16/vgg16.onnx
vgg16 example
103.9
```

<!--
# onnx-chainerをインストール

```
$ sudo pip3 install onnx-chainer
```
-->

# まとめ

ざっくりとした評価ですが、menohと、chainer4 がだいたい同じでした。
（とくに、Pythonだからといってオーバーヘッドがある様なタスクではないので、当然ですね）
Macのシステム容量が大きすぎるときの対処法

##**はじめに**
Macの**システム**領域が80Gと表示され空き容量がほとんどない状態になってしまった。そこで調べてみると同じ様な問題を抱えている人がいたため、一番簡単な解決法のメモを残します。
まずシステム容量のボトルネックになっている部分はどこなのかを以下のコマンドをターミナルに打つことで確認。

```terminal
$ sudo du -sh /*
```
確認した結果、/coresが**20G**以上を占めていることが発覚。
***
##**対処法**
coresに関してはコアダンプというファイルで削除しても問題ないらしい。。。
そこで、以下のコマンドをターミナルに打ち込むことで削除

```terminal
$ sudo rm -r /cores/
```
また、ターミナルを使用せずに削除する場合はFinder上で以下のショートカットを実行し、隠しファイルを表示

```terminal
command ⌘ + shift ⇧ + .
```
隠しフォルダをデフォルトで表示する設定にするためには以下を参照

- [【Mac】隠しファイル・隠しフォルダを表示する方法](https://qiita.com/TsukasaHasegawa/items/fa8e783a556dc1a08f51)
***
##**最後に**
今回は上記の方法＋キャッシュファイルの削除である程度、問題は解決したが、coresファイルが削除も継続的に出現する場合は以下を参照。

- [Macでコアダンプの生成を停止する](https://qiita.com/bloodia/items/81aa2c6660f9c8f85803)
KVMの仮想ネットワークをブリッジモードにして、VMを物理ネットワークセグメントに参加させてみた

libvirtを使用してVMを作成すると、デフォルトではNAT環境下に置かれます。
なので、ホストが接続しているネットワークセグメントには存在しておらず、NATを通して外部と通信することになります。
そこで今回はNATを通さなくても外部と通信でき、ホストと同一セグメント上にVMを作成する方法を書きたいと思います。

#環境
- HOST
    - CentOS 7.5 (CUI)
    - NIC eth0
    - bridge br0
    - virtual NIC vnet0
- VM
    - CentOS 7.5
    - NIC eth0

#完成図のイメージ
![KVM.jpg](https://qiita-image-store.s3.amazonaws.com/0/173064/3d5e5a2c-a7cb-add0-09c9-d738b0804fa6.jpeg)

#前提
- 仮想化に必要な各種パッケージ(libvirtなど)はインストール済み
- virt-installを使用してVMの作成した経験あり

上記に関係する説明は省略しますので、インストールがまだの人や不安な人は以下のページを参考にしてください。

- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-installing_the_virtualization_packages-installing_virtualization_packages_on_an_existing_red_hat_enterprise_linux_system
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-guest_virtual_machine_installation_overview-creating_guests_with_virt_install

#ホストでブリッジを作成
まずはホストでブリッジを作成して、そのブリッジをeth0に接続してみたいと思います。

```
# nmcli con add type bridge ifname br0                     // ブリッジの作成
# nmcli con mod eth0 master bridge-br0 slave-type bridge   // eth0をbr0に接続
# systemctl restart network

// 以下確認
# nmcli con

NAME        UUID   TYPE      DEVICE  
bridge-br0  xxxxx  bridge    br0        　　　　　　　　　　  // br0が作成されました
eht0        xxxxx  ethernet  eth0

# brctl show
bridge name  bridge id	  STP enabled   interfaces
br0          xxxxxxx	     no           eth0             // eth0がbr0に接続されました
```

これでブリッジの作成は完了です。

#VMの作成
virt-installを使用してVMを作成しましょう。

```
# virt-install --name demo --memory 1024 --vcpus 1 --disk size=20 --location /path/to/iso --graphics none --network bridge=br0 --extra-args 'console=tty0 console=ttyS0'
```

オプションのnetworkに作成したブリッジを指定すると、デフォルトのNATではなく、ホストと同一セグメント下にVMを作成
できます。インストール中にネットワーク設定をする際は、スタティックかDHCPサーバがあればDHCPを設定しましょう。

VMの作成が完了したら、ホストのブリッジに仮想インターフェースが接続されているか見てみましょう。

```
# brctl show
bridge name  bridge id	  STP enabled   interfaces
br0          xxxxxxx	     no           eth0
                                          vnet0           // 仮想インターフェース
```

このように正しくVMが作成できていれば、仮想インターフェースが増えていると思います。

これでVMをホストの同一セグメントに参加させることができました！

#参考
- https://jamielinux.com/docs/libvirt-networking-handbook/bridged-network.html
[AutoHotKey]関数内で動的ホットキーを定義する


## 動機
ホットキーでスクリーンショットを撮った後、TwitterとかImgurとか投稿先を選びたい。

## 実装
とりあえず、保存した画像ファイルを`SplashImage`でいい感じに表示する。

その後、TwitterならTキーとかのホットキーを動的に定義する。

```:ahk
HoldImage(img,length)
{
    ; 画像サイズを取得
    ; https://autohotkey.com/board/topic/12001-finding-the-widthheight-of-a-picture/
    gui,add,picture,hwndmypic,%img%
    controlgetpos,,,width,height,,ahk_id %mypic%
    if (width > height)
    {
        zH = -1
        zW = %length%
        zX = 0
        ZY := (length - (height * (length / width))) / 2
    }
    Else
    {
        zH = %length%
        zW = -1
        zX := (length - (width * (length / height))) / 2
        ZY = 0
    }
    ; テキストによるズレを吸収するため、ウィンドウ高さの指定はなし
    SplashImage, %img%, ABM2 W%length% X0 Y0 ZH%zH% ZW%zW% ZX%zX% CWBlack CTWhite, , T: Tweet`ni: Imgur`nEsc: Cancel, , Cica
    global imgfile := img ; パラメータをグローバル変数に格納する
    Hotkey, t, Tweet, On
    Hotkey, i, Imgur, On
    Hotkey, Esc, Cancel, On
    Return ; 関数コール時に実行されるのはここまで
    Tweet:
        Tweet(imgfile)
        Hotkey, t, Off
        Hotkey, i, Off
        Hotkey, Esc, Cancel, Off
        SplashImage, Off
        Return
    Imgur:
        Imgur(imgfile)
        Hotkey, t, Off
        Hotkey, i, Off
        Hotkey, Esc, Cancel, Off
        SplashImage, Off
        Return
    Cancel:
        Hotkey, t, Off
        Hotkey, i, Off
        Hotkey, Esc, Cancel, Off
        SplashImage, Off
        Return
}
```

`Tweet()`関数と`Imgur()`関数は別途定義してあると思いねえ。

定義先のラベルは、関数外に置いてもよい。関数内に書く場合、ホットキー入力を待たずに実行されないよう、`Return`のあとに書く。

ホットキーでは別の[スレッド](http://ahkwiki.net/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89)が作成されるため、変数やパラメータの内容が引き継がれない。よって、グローバル変数に格納しておく必要がある。
SQLチューニングについて(1) SQLチューニングの目的と方法


# SQLチューニングとは
　性能の悪いSQLを発見し、その処理過程を改善することを指します。
　実行したい一つの処理に至るためにとることができるSQLアプローチは数多くありますが、性能という点でもそれぞれのアプローチにより異なる結果が伴われます。
　目的の処理結果を変えずにその過程を最適化する、それがSQLチューニングです。

# 性能の良いSQLとは
　そもそも性能の良いSQLとは何でしょうか。
　端的に言えば、**少ないリソースで処理を行うことができるSQL**です。リソースを多く使用してしまう例としては、以下のようなことが挙げられます。

- 索引を使用していない
- 適切な索引を使用していない
- 無駄なソートを行っている<br><br>
[参考：津島博士のパフォーマンス講座　第9回 良いSQLについて](http://www.oracle.com/technetwork/jp/database/articles/tsushima/tsm09-1598259-ja.html)<br>
[参考：津島博士のパフォーマンス講座　第11回 良いSQLについて（2）](http://www.oracle.com/technetwork/jp/database/articles/tsushima/tsm11-1598263-ja.html)

　上記の例は、索引の使用、SQLテキストの記述内容といった個別的な観点での問題です。
　こういった各観点において**使用リソースの削減**を実現することができているSQLを指して、**性能の良いSQL**ということができます。

　これは、**いかにスマートなSQL文を記述するか**、ということとは同義ではありません。
　なぜならば、SQLを実行するうえでは、SQLテキスト自体は一つの構成条件にしか過ぎないからです。



# SQLチューニングが必要な状態とは
　SQLチューニングが必要な状態とは、**アプリケーションのパフォーマンスに問題がある状態**を指します。上記の例にあったように、例えば「無駄なソートを行っている」というのもパフォーマンスに悪影響を与えるものです。

　しかし、ならばSQLテキストがすべて適切なものであればパフォーマンスが最適化されるかといえば、そうではありません。なぜならば、SQLが処理される手順である**実行計画**の算出においては、SQLテキスト以外の様々な情報が使用されているからです。

　上記を踏まえパフォーマンスが低下してしまう原因を考慮すると、以下の２点にまとめることができます。

<bR>
1. **オプティマイザのインプット情報** が正確ではない
2. **オプティマイザが生成した実行計画** が適切ではない。
<bR>

　オプティマイザ（DBの頭脳）は、**インプットされている情報**に基づき処理の**実行計画**を算出します。

　したがって、まずはオプティマイザにインプットされている情報を確認・修正することが必要です。
　そのうえで算出される実行計画がまだ適切でなければ、それを適切な形に成るよう種種の修正を加えていきます。
　


## オプティマイザのインプット情報

　オプティマイザにインプットされる情報とはなんでしょうか。
　前述したとおり、インプット情報とはオプティマイザが実行計画を算出するための材料となる情報群になります。その内容はというと、表の情報であったりSQL文本体であったりします。
　　
　その中でも最も重要なものは、**統計情報**と呼ばれるものです。
　インプットされる情報について、以下のようなものがあります。具体的な中身については、後続の記事をご覧ください。

- 統計情報
- SQLテキスト
- 初期化パラメータ


[SQLチューニングについて(2) オプティマイザのインプット情報について](https://qiita.com/nanairoGlasses/items/587afb73968ea14940e3#1-cpu速度やio関連の情報を確認する---システム統計情報初期化パラメータの取得)


## オプティマイザの実行計画

　上述したインプット情報に基づき、オプティマイザはSQL処理の実行計画を算出します。

　インプットされた情報が正確なものであれば実行計画も正確なものになるはずですが、例えば統計情報のデータ変動幅が大きかったり、そもそもインプットする情報を適切なものに更新することができないなどの状況が発生し得ます。それでは実行計画も正確なものにはなりません。

　そのような場合には、実行計画が理想的なものになるように能動的なアプローチをかけていく必要があります。
　
　この場合ではオプティマイザによらず自分の理想に向けて実行計画を修正する必要がありますので、**自分で実行計画の妥当性を判断できる**スキルが求められます。

　実行計画の読み方、修正の仕方などについては後続の記事をご覧ください。

[~~SQLチューニングについて(3) 実行計画の読み方について~~ 執筆中]()
[~~SQLチューニングについて(4) 実行計画の修正について~~ 執筆中]()
　

# 終わりに

　本記事では、SQLチューニングとは何か、どのような方法でそれを達成できるのかを概観しました。　
　具体的な内容への踏み込みは後続記事で行っていきたいと思っているので、そちらもご覧いただければ幸いです。



<br><br><br><br><br>
# 参考
本記事を執筆するにあたり、以下の情報サイト・書籍などを参考にさせていただいています。

*情報サイト*
- [津島博士のパフォーマンス講座：http://www.oracle.com/technetwork/jp/database/articles/tsushima/index.html](http://www.oracle.com/technetwork/jp/database/articles/tsushima/index.html)
- [統計情報はなぜ必要か：http://www.doppo1.net/oracle/tuning/statistics_outline.html](http://www.doppo1.net/oracle/tuning/statistics_outline.html)

*書籍*
- 「即戦力のOracle管理術」技術評論社
- 「Oracle SQLチューニング」翔泳社
【Python】改行コードの取り除く方法

**Python**でテキストファイルを読み込んで、その内容を出力する際に、
改行コードで行と行の間に余分な空行が入ったことがあります。

- 事象

```test.txt
# 元のテキストファイル
Hello World.
Hello World.
Hello World.
```
``` test.py
fname = "test.txt"
with open(fname,"r") as file:
	for i in file:
	    print(i)
```
```
#画面に出力結果
Hello World.

Hello World.

Hello World.
```

この改行コードを取り除く方法は以下にまとめます。

- 検証：Python Version: 3.6.4
- 方法１ 
**rstrip**

```way1.py
with open(fname,"r") as file:
	for i in file:
	    print(i.rstrip('\n'))
```
- 方法２
**replace**

```way2.py
with open(fname,"r") as file:
	for i in file:
	    print(i.replace('\n',''))
```
- 方法３
**splitlines**

```way3.py
with open(fname,"r") as file:
	for i in file.read().splitlines():
		print(i)
```
AWS EC2上へのLightGBMインストール

基本的にはリンク先のLinux手順に従えば問題無し
https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html

## ソースコードダウンロード
```bash
git clone --recursive https://github.com/Microsoft/LightGBM
cd LightGBM
```
## ビルド
```bash
mkdir build ; cd build
cmake ..
make -j4
```

## Pythonパッケージインストール
リンク先にはこれは書いてないが、これを忘れていているとPython上で使えない

```bash
cd ../python-package
python setup.py install
```

## (追記)Cmakeインストール
cmakeが入っていない場合のcmakeインストール

```bash
yum install gcc-c++
wget https://cmake.org/files/v3.10/cmake-3.10.0.tar.gz
tar -xvzf cmake-3.10.0.tar.gz
cd cmake-3.10.0
sudo ./bootstrap
sudo make
sudo make install
```

以上
Docker内のUbuntu上のHyperLedger Fabric 1.1 Composerでチュートリアルを実施＆REST APIで公開してみた。 

# 概要
https://qiita.com/mogiken/items/be2317b07a41f494a494 で構築したDocker環境のHyperLedgerでチュートリアルを実施しました。
そのあとREST APIで公開するまでの手順です。
タイムアウトが出るときはEXPORT設定やインスタンスの状態をチェック。
yoコマンドはrootでは動かないので注意。

# PlaygroundのConnection: Web Browserのチュートリアル
参考：https://hyperledger.github.io/composer/latest/tutorials/playground-tutorial.html
Playgroundを起動してブラウザからhttp://localhost:8080/ でアクセスします。
「Connection: Web Browser」の「Deploy a new business network」からチュートリアルの通り作成します。特に問題なく動作します。
この環境はブラウザ上で実行しているだけ。デバッグ用です。ここで開発・動作確認します。

# Playgroundで動作完了したらサーバー環境にDeployします。
参考：https://hyperledger.github.io/composer/latest/tutorials/developer-tutorial.html
基本、コマンドラインで実行しまう。PlaygroundにそれらしいUIはありますが、動きが不安定です。Web BrowserでExportしたカードもインポートできません。

yoコマンドがrootで実行できないのでfabricアカウントでテンプレートを作成したあとrootにコピーして使います。
  $ adduser fabric  パスワードもfabric
  $ su fabric
  $ cd
  $ yo hyperledger-composer:businessnetwork    #下記のように入力
  ? Business network name: tutorial-network
  ? Description: test
  ? Author name:  mogi
  ? Author email: mogi@gashfara.com
  ? License: Apache-2.0
  ? Namespace: org.example.mynetwork
  $ exit  #rootにもどって作成したテンプレートを編集する。
  $ cd ~/fabric
  $ mv /home/faric/tutorial-network .
  $ vim tutorial-network/models/org.example.mynetwork.cto
  チュートリアルのようにモデルを編集します。 
  vim tutorial-network/lib/logic.js
  チュートリアルのようにスクリプトを編集します。 
  vim tutorial-network/permissions.acl
  チュートリアルのようにアクセス権を編集します。 
  $ cd tutorial-network
  $ composer archive create -t dir -n .
    ファイル　tutorial-network@0.0.1.bna が作成される。
  このカードをサーバーにdeployします。
  $ composer network install --card PeerAdmin@hlfv1 --archiveFile tutorial-network@0.0.1.bna
  $ composer network start --networkName tutorial-network --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card
    このタイミングでDockerのインスタンスが１つ増えます。
  $ composer card import --file networkadmin.card
  $ composer network ping --card admin@tutorial-network
  playgroundで登録が確認できます。

# REST APIの公開
  $ cd ~/fabric
  $ composer-rest-server　　#下記のように入力
  ? Enter the name of the business network card to use: admin@tutorial-network
  ? Specify if you want namespaces in the generated REST API: never use namespaces
  ? Specify if you want to use an API key to secure the REST API: No
  ? Specify if you want to enable authentication for the REST API using Passport: No
  ? Specify if you want to enable event publication over WebSockets: Yes
  ? Specify if you want to enable TLS security for the REST API: No

  ブラウザから　http://localhost:3000/explorer で表示できます。

<img width="1364" alt="スクリーンショット 2018-06-23 19.11.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/23175/53c26ae9-f86c-b9eb-3f9d-f3ccc54c0a09.png">
層圏トポス: 層の2つの定義の同値性

「層・圏・トポス」を読んでいきます.
層についても2通りの定義がなされ (p.15, 18) その間の変換の方法が示されていますが, この記事ではその変換によって同値なものに写っていることを確認します.
つまり、1つ目から2つ目に変換して1つ目に戻すことで同等の層が得られることと, 逆に2つ目から始めてやはり同等の層が得られることを確認します.

## 層 A → (S,p) → A'

- $X$ 上の層 $A$ (定義1形)
- $S = \\{ (x,f)/\\!\\!\equiv ~:~ f \in A, x \in Ef \\}$ (定義2形)
    - $p : S \to X, (x,f)/\\!\\!\equiv~ \mapsto x$
- $A' = \\{ U \text{ 上の } p \text{ の (連続な) 断面 } :~ U \in \mathcal O_X \\}$ (定義1形)

$A$ と $A'$ とが同型であることを示したい.

$f' \in A', f': U \to S$ について, $f'$ は断面なので $f'(x)=(x, g_x)/\\!\\!\equiv$ という形になっている. この $g_x$ は $\equiv$ の条件から, $x$ の周りのみで共立している.
とういわけで $g_x$ を $x$ の近傍で制限したものを $x \in U$ 全体で集めて貼り合わせることで $f \in A$ を構成することを考える.

点 $x \in U$ に対して $f(x)=(x,g_x)/\\!\\!\equiv$ の近傍は $U$ 上での $x$ の近傍 $U_x$ を取った時に
$$W_x = \\{(y,g_x)/\\!\\!\equiv ~:~ y \in U_x\\} ~(\subseteq S)$$
と定められいている.
$f'$ は連続関数と定められているので $W_x$ を $f'^{-1}$ で戻した
$$V_x = f'^{-1}(W_x) = \\{ y \in X ~:~ (y,g_y) \equiv (y,g_x) \text{ and } y \in U_x \cap Eg_y \cap Eg_x \\} ~(\subseteq Eg_x)$$
は $x$ を含む開集合である.

各点 $x \in U$ について $g_x$ を取ってこれを $g_x \rceil V_x$ に制限することにする.
2点 $x_1, x_2 \in U$ から構成した $g_{x_1} \rceil V_{x_1}$ と $g_{x_2} \rceil V_{x_2}$ とは共立する.
なぜなら, 点 $y \in E(g_{x_1} \rceil V_{x_1}) \cap E(g_{x_2} \rceil V_{x_2}) = V_{x_1} \cap V_{x_2}$ において $(y, g_{x_1}) \equiv (y,g_y) \equiv (y,g_{x_2})$ なので
$$\exists V_y, y \in V_y \subseteq (Eg_{x_1} \cap Eg_{x_2}) \text{ and } g_{x_1} \rceil V_y = g_{x_2} \rceil V_y.$$
各点 $y$ での貼りあわせは唯ひとつに定まるので

```math
\begin{align*}
g_{x_1} \rceil V_{x_1} \cap V_{x_2}
& = \bigcup \{ g_{x_1} \rceil V_y ~:~ y \in V_{x_1} \cap V_{x_2} \} \\
& = \bigcup \{ g_{x_2} \rceil V_y ~:~ y \in V_{x_1} \cap V_{x_2} \} \\
& = g_{x_2} \rceil V_{x_1} \cap V_{x_2}
\end{align*}
```

となって結局共立する.

というわけで
$$G = \\{ g_x \rceil V_x ~:~ x \in U \\} ~(\subseteq A)$$
を作ると $G$ の任意の2元は共立し, $\bigcup G$ が唯ひとつ定まる. これを $f \in A$ とする.
以上で $f' \in A'$ から $f \in A$ を構成したが, これが $A' \to A$ の同型を与える.
逆は $f \in A$ を $f'(x) = (x,f)/\\!\\!\equiv$ に写せばよい.

## 層 (S,p) → A → (T,q)

- $X$ 上の層 $S$
    - $p:S\to X$
- $A = \\{ U \text{ 上の } p \text{ の (連続な) 断面 } f (:U\to S) :~ U \in \mathcal O_X \\}$
- $T = \\{(x,f)/\\!\\!\equiv ~:~ f \in A, x \in Ef \\}$
    - $q:T\to X$

$S$ と $T$ とが同型であることを示す.

点 $y \in S$ について, $p$ の局所同相性より,
ある $V \subset S (y \in V), U \in X$ があって $p\vert_V : V \to U$ は同相写像となるので $(p\vert_V)^{-1} : U \to V$ が存在する.
後ろに埋め込み ($V \to S$) を足して $(p\vert_V)^{-1} : U \to S$ とすれば, これは $p$ の断面であるので $A$ の元である.
従って $(y, (p\vert_V)^{-1}) \in T$. $y$ をコレに写す写像が同型を与える.

逆は, $(x,f)/\\!\\!\equiv~\in T$ を $f(x) \in S$ に写せばよい.
この操作は $\equiv$ の定義より, 代表元に取り方に依らず一意に定まる.
Auth0 + ColdFusion Web App Sample

##需要あるの？
あんまりない気がしますが…。Auth0公式にはColdFusionのサンプルなんかないし、せっかくなのでPHPサンプルソースを参考に同じような感じに仕上げてGitHubに公開しました。
https://github.com/namitan/cf_auth0_sample

##こんなかんじ

```php:login.cfm
<CFSET domain        = Application.AUTH0_DOMAIN>
<CFSET client_id     = Application.AUTH0_CLIENT_ID>
<CFSET client_secret = Application.AUTH0_CLIENT_SECRET>
<CFSET redirect_uri  = Application.AUTH0_CALLBACK_URL>
<CFSET audience      = Application.AUTH0_AUDIENCE>

<CFIF audience eq "">
  <CFSET audience = "https://#domain#/userinfo">
</CFIF>

<CFSET auth0 = createObject("component", "Auth0").init({
  'domain' : domain,
  'client_id' : client_id,
  'client_secret' : client_secret,
  'redirect_uri' : redirect_uri,
  'audience' : audience,
  'scope' : 'openid profile',
  'persist_id_token' : true,
  'persist_access_token' : true,
  'persist_refresh_token' : true
})>

<CFSET auth0.login()>
```
PHPのサンプルに似た感じで呼び出すように作ってあります。API叩いたりとかはAuth0.cfcにまとめてあります。PHPのAuth0 SDKは中身見てないので、全然違うことしてるかもしれませんが…。

クライアントIDとかはApplication.cfcに定義がありますので書き換えて使ってください。

```php:Application.cfc
<CFFUNCTION name="onApplicationStart">
    <CFSET Application.AUTH0_CLIENT_ID     = "your client id">
    <CFSET Application.AUTH0_DOMAIN        = "yourdomain.auth0.com">
    <CFSET Application.AUTH0_CLIENT_SECRET = "your client secret">
    <CFSET Application.AUTH0_CALLBACK_URL  = "http://127.0.0.1:8500/">
    <CFSET Application.AUTH0_AUDIENCE      = "">
</CFFUNCTION>
```

##いきさつ
ちょっとしたアプリを思いついたので放置気味のVPSで動かしてみようかなと思ったんですが、やっぱり認証は入れなきゃだよなあと調べてみたら[Auth0](https://auth0.com/)がなんだかサクッといい感じにできそうだということで挑戦してみたのでした。

認証については実装してみてなんとなく概要はわかったかなというところ。これからもう少し学びたいです。

関係ないけど、CFMLのシンタックスハイライトがないのでこれまで`html`を使ってましたが、試しに`php`を使ってみたらすっきりしていてこっちのが見やすい。。。

##追記
Luceeでも動作確認しましたので、タグ追加しました。
O'REILLY Hadoop 第3版のサンプルコードを動かす手順


## 環境

- Mac
- IntelliJ IDEA
- Java 1.8
- Maven 3.5.4
- Hadoop 2.2.0

## Java インストール

- Javaがインストールされていることを確認

```shell
$ java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
```

- まだインストールされていなければインストール

```shell
$ brew cask install java
```

- JAVA_HOMEを設定

```shell
$ vi ~/.bash_profile
# 以下の行を末尾などに追加
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
$ source ~/.bash_profile
$ echo $JAVA_HOME
```

## Maven インストール

- Mavenがインストールされていることを確認

```shell
$ brew list maven
```

- まだインストールしていなければインストール

```shell
$ brew install maven
```

- Mavenがインストールされたことを確認

```shell
$ mvn --version
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T03:33:14+09:00)
...
```

- MAVEN_HOMEを設定

```shell
$ vi ~/.bash_profile
# 以下の行を末尾などに追加
export MAVEN_HOME=/usr/local/Cellar/maven/3.5.4

$ source ~/.bash_profile
$ echo $MAVEN_HOME
```

## Hadoop インストール

第3版のサンプルソースは `Hadoop 1.2.1/0.22.0/0.23.x/2.2.0` のバージョンでテストしているとのこと。

https://github.com/tomwhite/hadoop-book/tree/3e

ここではver2.2.0のインストールを行う。

- hadoop-2.2.0.tar.gz をダウンロード、解凍

```shell
$ cd ~
$ wget https://archive.apache.org/dist/hadoop/core/hadoop-2.2.0/hadoop-2.2.0.tar.gz
$ tar xvzf hadoop-2.2.0.tar.gz
$ ln -s hadoop-2.2.0 hadoop
```

~~(任意) `/usr/local` に移動して、エイリアスを作成~~ 
~~(※)Macのデフォルトの/usr/localのパーミッションだと、HDFSの起動できないと報告があったので、この手順はやらないでください。~~


- HADOOP_HOMEを設定＆HadoopのbinをPATHに追加

```shell
$ vi ~/.bash_profile
# 以下の行を末尾などに追加
export HADOOP_HOME=$HOME/hadoop
export PATH=$PATH:$HADOOP_HOME/bin

$ source ~/.bash_profile
$ echo $HADOOP_HOME
$ hadoop version
Hadoop 2.2.0
...
```

## O'REILLY Hadoop 本のサンプルコードプロジェクトをチェックアウト

- 著者のGithubからチェックアウト(第3版のサンプルコードブランチは3e)

```shell
$ cd path/to/workdir
$ git clone https://github.com/tomwhite/hadoop-book
$ cd hadoop-book
$ git checkout 3e
```

- IntelliJを起動して `Import Project` を選択

- `Maven` を選択後、ひたすら `Next` ボタンを連打して、最後に `Finish` ボタンを押す

- Hadoop ver2.2.0 のjarを使用してサンプルコードをパッケージング

```shell
$ mvn package -DskipTests -Dhadoop.distro=apache-2
```

hadoop-examples.jar がプロジェクト直下に作られた事を確認

```shell
$ ll hadoop-examples.jar
```

## サンプル実行

- 2章のMaxTemparatureクラスを実行

```shell
$ cd path/to/workdir/hadoop-book
$ export HADOOP_CLASSPATH=hadoop-examples.jar
$ hadoop MaxTemperature input/ncdc/sample.txt output
```

- 実行結果が本に書いてある結果と一致していることを確認

```shell
$ cat output/part-r-00000
1949	111
1950	22
```
Amazon Linux Booting process

# 概要
Amazon Linuxを利用して、```sudo /etc/init.d/xxx```を利用することが多くて、そちらどう動いてるかを調べた

# booting process
[こちらを参考にして、](https://www.thegeekdiary.com/centos-rhel-7-booting-process/)
systemdが使っていないので、少し変更した

1. The computer’s BIOS performs POST.
1. BIOS reads the MBR for the bootloader.
1. GRUB 2 bootloader loads the vmlinuz kernel image.
1. GRUB 2 extracts the contents of the initramfs image.
1. The kernel loads driver modules from initramfs.
Kernel starts the system’s first process, systemd.
1. Reads configuration files from the /etc/ directory
  * Execute /etc/rc{runlevel}.rd
  * Execute /etc/rc.local

## rc3.rd
runlevel3でログインする場合は多くて、rc3.rd下のファイル一覧確認すると

```bash
$ ls -la /etc/rc3.d/
一部省略
lrwxrwxrwx  1 root root   17  5月  9 01:32 S10network -> ../init.d/network
lrwxrwxrwx  1 root root   15  3月 19  2015 S90crond -> ../init.d/crond
一部省略
```

/etc/init.d/下のスクリプトからリンクをつけて、実行されるのは/etc/init.d/下のスクリプトファイル

## init.d script
/etc/init.d/crondを例で見ると、shellスクリプトを実行するだけ

```bash
case "$1" in
    start)
        hogehoge
    stop)
        hogehoge
    restart)
        hogehoge
    reload)
        etc...
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
esac
exit $?
```

### 実行順番
1. Kから始まるscriptを先に実行、番号が小さい方から実行
   * Kはkill、停止の意味
1. Sから始まるscriptを先に実行、番号が小さい方から実行
   * Sはstart、開始の意味

### chkconfig
chkconfigで起動してるサービスが多くて

```bash
# chkconfig: 2345 90 60
```
runlevel 2345で起動する、起動する時の順番は90、停止時には60という意味

[こちらは詳しい](https://qiita.com/shell/items/30031862d91cedf9ceef)

### nginxなどどう起動してるか分かる
/etc/init.d/nginx中身を見ると、config file、pidfileの場所が分かるので、その辺不明な時には起動スクリプト確認するのが一番早い

```
sysconfig="hogehoge"
lockfile="hogehoge"
pidfile="hogehoge"

NGINX_CONF_FILE="hogehoge"
```

## grub
/boot/grub/grub.confで設定

```bash
default=0 # titleの0番実行
fallback=1
timeout=1
hiddenmenu

title Amazon Linux 2015.03 (3.14.35-28.38.amzn1.x86_64)
root (hd0,0)
# kernelのパス
kernel /boot/vmlinuz-3.14.35-28.38.amzn1.x86_64 root=LABEL=/ console=ttyS0
# initrdのパス
initrd /boot/initramfs-3.14.35-28.38.amzn1.x86_64.img
```
Vue CLI UIが想像以上に便利だった話

# 概要
最近、vue-cliがバージョンアップしていて、ふーんとか思いながら流してたんですが、vue-cli uiという機能があることを教えてもらい改めて調べて動かしたら結構感動してしまったので、記事にしてみました。cli-uiどうなん？って思った方のお役に立てていただければと思います。

# プロジェクトを始める
## いつものCLI

とりあえずcliをグローバルインストール！！

```
npm install -g @vue/cli
```

以下コマンドで、バージョンが3.0以上になっているのを確認しましょう。

```
vue --version
```

以下、コマンドでvueのプロジェクトを始めましょう

```
vue create [project-name]
```

ここから、設定やらエコシステムやら選んでいきます。

<img width="350" alt="スクリーンショット 2018-06-22 18.10.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/105049/c9a98b68-48e0-5c4c-5acc-bc28b06a8b5d.png">

ここまでは、普通の便利なCLIですね。この後はいつものエディタでいつも通り開発していきます。<img width="327" alt="スクリーンショット 2018-06-22 18.11.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/105049/7827c6cd-8cff-32a8-48a4-ae5544d967f1.png">



## CLI UI
ここからがGUIでvueのプロジェクトを作っていきます。
以下のコマンドをうってみてください。

```
vue ui
```

そうすると、ブラウザでなにやら画面が出て来ますね！
![スクリーンショット 2018-06-22 18.17.03.png](https://qiita-image-store.s3.amazonaws.com/0/105049/7cedac0f-9d5f-7b46-5e35-4c734c2a9e1c.png)

これが、vue-cliのui環境です！
ここから、プロジェクトを作成していきます。
プロジェクト名やディレクトリなどを設定していきます。
![スクリーンショット 2018-06-22 18.17.53.png](https://qiita-image-store.s3.amazonaws.com/0/105049/5ce4ef7f-1c32-361d-df6a-abb70db0a42c.png)

BabelとかPWAとか Vuexとかの設定もポチポチするだけで、簡単に構築できます。
（めちゃくちゃ便利ですね）
![スクリーンショット 2018-06-22 18.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/105049/edf33cf0-03fc-453a-7c13-e3786d946738.png)

ESLint周りの設定も簡単です！
![スクリーンショット 2018-06-22 18.20.34.png](https://qiita-image-store.s3.amazonaws.com/0/105049/a81ad8c0-9a56-3719-ef63-fe6103180d31.png)

色々設定したら後はプロジェクトの構築ですね！
ここは少し時間を要します。（ワクワクしますね）
![スクリーンショット 2018-06-22 18.20.50.png](https://qiita-image-store.s3.amazonaws.com/0/105049/8e599cab-6e70-49e0-9f32-f5ca17d3d94d.png)


プラグインの管理や追加もコードに手を出すことなく出来るようになってます！（涙目）
![スクリーンショット 2018-06-22 18.35.20.png](https://qiita-image-store.s3.amazonaws.com/0/105049/5c0153df-7da5-7e30-cc20-f4238901a90d.png)

さてさて、ここからアプリを動かしていくわけですが、どうやって動かすのか、、、
もちろんいつも通りターミナルでコマンド打っても起動するのですが、cli-uiでは以下のように、serve やbuildと言った項目から「タスクの実行」ボタンを押すだけで、アプリが簡単に起動します。便利というかここまで再現したか！という感じですね。
<img width="1005" alt="スクリーンショット 2018-06-23 18.12.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/105049/5bc5309e-eb71-92d0-4c6b-70899e61b242.png">
ここまで、vue-cliの新しい機能について説明しました。vueの人気さと共に便利ツールがどんどん生まれてきて、vueの活用の幅が広がってきますし初学者がたくさん増えるといいなと思いました。
2の補数を理解する

プログラミングを始めたばかりのころ、マイナスの数は2の補数で計算しますよー。
たとえば8bitの場合、41
　00101001
のマイナスの数(-41)は、反転して1を足しますよー。
要は、
　11010110
に1を足して、
　11010111
ってやれば、-41になりますよー。と本に書いてあって、それを覚えました。

情報処理試験とかでも出るんですかね？

なぜ？

と思ったものですが、なぜを説明している本はないんですね。残念ながら。

なので、簡単に説明したいと思います。

理解するには前提が二つあります。

前提1.
マイナスの数とは、元の数と足し合わせるとゼロになる数(足し算の逆元)ということで良いですよね？
　41 + (-41) = 0
このような感じです。当たり前ですね。

前提2.
8 bit の整数において足し算は、普通に使っている足し算と定義が違います。
仮に、この 8 bit 整数における足し算の記号を ++ と定義するなら、
　a ++ b = (a + b) % 256
となります。
256になった場合は、桁があふれてしまうので、それを無視するわけです。


ここで、反転する(not)の性質を見てみると、
　00101001
+)11010110
　11111111

といった感じで、必ず255(11111111)になります。

さらにこれに 1 を足すと 256 になるわけですが、前提2からこれは 0 になります。

ということで、

　a ++ not(a) ++ 1 = 0

なわけです。直観的に、結合側は成り立ちそうなので、

　a ++ (not(a) ++ 1) = 0

と言い換えられます。
元の数と2の補数を足すと必ず 0 になります。

ということは前提1を考えれば、

　2の補数は元の数のマイナスの数である

と言えそうです。

というわけで、なんとなく謎の計算を覚えさせられていたわけですが、理由はとっても単純で当たり前の結果だったりします。


*補足*

ここでは、数をどのように2進数で表現するか(符号化)については言及していません。
たとえば 10000000 を 128 と解釈するのか、 -127 と解釈するのか、などですね。

何の前提もなくマイナスの数と言っていますが、正確に言うなら2進数の加算の逆元は2の補数で計算できますという話でしかないですね。
Python3でキーロガーを作ってみた

始めて投稿します。
始めての投稿なので、この表現はまずいとか、
こうしたら見やすくなるとかありましたら、
教えていただけるとありがたいです。

#作ったきっかけ。

・PythonでGUIのものを作ってみたかった。
・Githubも利用して、ソースコードを上げたかった。
・(作成するもの自体は何でも良かった感はあるきがする。)

#作成時間

２～３週間程度。
基本的には仕事の合間で作ってた感じ。

#ソースコード

https://github.com/whalego/Key_Counter

#苦労したとことか、詰まったこととか

###●Pygame使ってみて
最初にTkinter使おうと思ったけど、
スレッドの処理とかよくわからないので、
簡単にかけそうなPygameを利用しました。
中身的にはゲーム作ったりするようなので、
GUI系の関数とかいっぱいあって使いやすかったです。

###●Pyhookedについて
Python3を使うにあたって、
Pyhookを使うのにいろいろしないといけないっぽいので
どこかの記事にあった手軽なPyhookedを利用しました。
あとPygameの中に入ってるEventだと非アクティブのときに
キーボードの入力取れないので、それでコレにしました。

###●スレッドの処理について
・まずは、ちゃんとPyhookedの中にあるサンプルコードを
ちゃんと読めばよかったなと後悔しています。
いろいろマルチプロセスとか調べてみたけど、
イマイチ使い方わからなかったです。
次回ではないけど、次はリベンジしてみたいと思う。

・threadingの使い方で、ウィンドウを閉じたときに
窓が残り続けて、Pyhookedだけ動作していることが気になってたけど、それはThreadが閉じられたときに一人しか居ないと一緒に閉じてくれるデーモンスレッドってのでなんとかなった。

```Python
setDaemon(True)
```

###●データの保存については
プログラムが動いてるうちは辞書に値を保存していく方向で、
ずっと起動しっぱなしだとだんだんメモリ食ってくのかなぁと思ったけど、とりあえずこの形で。
※スレッド間でのデータのやり取りとしては不適切らしいので、
　次回はちゃんとしたデータのやり取りを出来るようにしたいと思う。
また、プログラムの起動終了時の受け渡しについては、
はじめはDB使おうかなとも思ったけど、
そんな大規模じゃないしと思いCSVで保存することにしました。
あと、受け取れる値は、Pyhookedのソースコードに書いてあった対応キーだけに取ってます。
ここに関してはPyhookedのソースコードも弄らないと取れなさそうなので、
今回は諦めました。
(英語読めないので、ソースコードの利用規約とかよくわからないしね)

大まかには以上になります。

#作成した感想
Pythonってやっぱソースコード読みやすいし、
他人が書いたのもなんとなく把握しやすくて便利だと思いました。
JavaとCとVBSとか勉強しましたが、
とりあえず業務でつかない限りはPython一択ですね。
あとプログラム起動するとわかるけど、GUIはとてもクソです。
今回は機能だけちゃんと動けばいいかなぁと思ってたので、
そこまでこだわらなかったです。
今後GUIで機能の多いもの作成する際には、
凝ったデザインも作ってみたいですね。

以上になります。
1日目　目標は衛星画像のSemantic Segmentation。

このページは、私のDeep Learningの成長記録と備忘録を兼ねて書きます。

目標は、タイトルのとおり衛星画像のSemantic Segmentationです。
メモとして自分の記録用にも考えましたが、Qiitaのサービスを使って公開し共有することで、同じことにトライする方のお役にも立てればと思っています。

Semantic Segmentationについては、Qiita　にもいくつか記事があり、参考にしているものもあります。ただ、最新のモデル（アルゴリズム）を使って、自分のしたいものの学習モデルを作る方法まではあまり多くありません。
ということで、自分で試しながら、またできれば間違えいがあった場合ここで指摘してもらいんがら、自分の学習もしていきます。

**目標**
・衛星画像のSemantic Segmentaion

**環境**
・ubuntu 16.04LTS
・Cuda 8.0
・GPU GTX1070
・Python 3.5
・Chainer

**学習モデル**
kaggle DSTL https://www.kaggle.com/c/dstl-satellite-imagery-feature-detection
Inria Satellite image set https://project.inria.fr/aerialimagelabeling/

Semantic Segmentationは多数のモデルがでていますが、その中でも比較的高精度でSegmentationができるpspnetを用います。

ChainerにはPSPNetのモデルがすでに用意されています。
https://github.com/mitmul/chainer-pspnet

手法は、上記のコードを理解し、自分で学習モデルをつくり、それを使って任意の衛星画像より情報を抽出することです。
でも、Chainerについては初心者なため、このコードをみただけでは、どうやって自分のデータから学習モデルを使って実行するのかがわかりません。
そのため、まずはChainerから勉強していきます。

そのため、まずは上記のPSPnetのモデルをセット（公開）された方のQiitaのページを参考に、環境構築と簡単なモデル作成をします。
https://qiita.com/mitmul/items/1e35fba085eb07a92560

次は，[２日目 環境構築及びニューラルネットワーク構築](https://qiita.com/nigo1973/items/643cc91ebbf2fae47ca9) につながります．
LINQ


AKB48 53rdシングル 世界選抜総選挙 × SHOWROOM
https://www.showroom-live.com/event/akb48_sousenkyo_53rd
のイベント結果を使い、LINQを勉強してみた。

# ランキングの読込
```csharp
string path = @"総選挙6-15.txt";

var sjisEnc = Encoding.GetEncoding("Shift_JIS");
var texts = File.ReadAllLines(path, sjisEnc);

var members = new List<Member>();
var ranking = new Ranking();

foreach (var text in texts)
{
    Match match = Regex.Match(text, @"^(\d+)位\s(\S+)\s(\S+)\s?[(|（](.+)[)|）](.+)\spt$");

    if (match.Success)
    {
        int id = Unique.New(members.Select(m => m.Id));
        Member member = new Member()
        {
            Id = id,
            FirstName = match.Groups[3].Value,
            LastName = match.Groups[2].Value,
            TeamName = match.Groups[4].Value,
        };

        if (!members.Any(m => (m.FirstName == member.FirstName)
            && (m.LastName == member.LastName) && (m.TeamName == member.TeamName))){
            members.Add(member);
            int.TryParse(match.Groups[5].Value, out int point);
            ranking.Dictionary.Add(id, point);
        }
    }
}
```

# グルーピング
## GroupBy
チーム別に名前を出力する。
```csharp
var team = members.GroupBy(m => m.TeamName);

// team: IEnumerable<IGrouping<string, Member>>
foreach(var t in team)
{
    System.Diagnostics.Debug.WriteLine(t.Key);
    foreach (var m in t)
    {
        System.Diagnostics.Debug.WriteLine(m.LastName + " " + m.FirstName);
    }
}
```


## ToLookup
チーム別にグルーピングし、STU48に所属するメンバーだけを出力する。
```csharp
// lookup: ILookup<string ,member>
var lookup = members.ToLookup(m => m.TeamName);
var stu = lookup["STU48"];
foreach(var s in stu)
{
    System.Diagnostics.Debug.WriteLine(s.LastName + " " + s.FirstName);
}
```

# 結合
## Join
```csharp
var rankInMembers = members.Join(ranking.Dictionary,
    m => m.Id,
    d => d.Key,
    (m, d) => new { Id = m.Id, Name = m.LastName + " " + m.FirstName, SR_Point = d.Value });
foreach(var r in rankInMembers)
{
    System.Diagnostics.Debug.WriteLine(r.Name + " " + r.SR_Point);
}
```
PythonをインストールしてPygameを動かすまで

## 1. はじめに

最近はPythonがQiitaタグランキングを独占。
超トレンドになっているのにも関わらず、~~プロジェクトで使う機会がなかった~~触れていなかったので、入門していきたいかと思います。

【2020/02/21 追記】
Pythonを使ってこんなの作ってみました！
[**【LINE BOT + COTOHA API】君の文章は相手を不快にしていないか？COTOHA先生にチェックしてもらおうぜ**](https://qiita.com/i-tanaka730/items/a32b3ce7ca8c7edc9634)

## 2. Pythonで作れるもの
Pythonはシンプルかつ高機能な言語であるため、様々なシステムで活用されています。
Pythonで作れるものは大きく分けると「WEBアプリ」「データ解析／分析ツール」「人工知能」になります。
また、Pythonで作られているシステムには以下のようなものがあります。

* WEBアプリ
 * YouTube
 * Instagram
 * Dropbox
 * Pinterest
* データ解析／分析ツール
 * Jupyter
 * graph-tool
 * Numpy
 * Pandas
 * Scipy
* 人工知能
  * Pepper

## 3. Pythonのインストール
では早速開発環境を作っていきましょう。今回の構築先はWindowsです。
Pythonのバージョンは3.6.5になります。(2018/06/23時点)
Pythonのインストールは以下から行います。
https://www.python.org/downloads/

①「Download Python 3.6.5」をクリックし、インストーラーをダウンロードします。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/247638/a694899c-617c-a041-6ee3-c33783f798ac.png)

②自動で環境変数にパスを追加するため、「Add Python 3.6 to PATH」にチェックを入れ、「Install Now」をクリックします。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/247638/2ee3a38f-769c-2146-f650-b0ba86eadf99.png)

③インストールが完了したら、「Close」をクリックしてダイアログを閉じます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/247638/c4fd6e9c-2795-2044-9d55-99b24f0974af.png)

④コマンドプロンプトを起動し、「python --version」と打ちます。バージョンが表示されれば成功です。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/247638/23e38881-8c32-aa0a-2e56-59d627ed89f1.png)

## 4. Pygameのインストール
続いてはPygameのインストールを行います。

①コマンドプロンプトを起動し、「python -m pip install pygame」と打ちます。
![g1.png](https://qiita-image-store.s3.amazonaws.com/0/247638/0c0b4d4d-8408-22a8-b9cf-5c06ba2e123b.png)

②「python」コマンドを打ったあと、「import pygame」と入力し、エラーが表示されなければ成功です。
![g2.png](https://qiita-image-store.s3.amazonaws.com/0/247638/bb30d6ef-9553-6d32-8636-0bed4f884fd7.png)

## 5. Pygameを動かしてみる
Pygameのインストールが成功すると、以下にPygameフォルダができあがると思います。
"C:\(ユーザフォルダ)\AppData\Local\Programs\Python\Python36-32\Lib\site-packages"
たくさんのサンプルゲームがインストールされますので、以下のサイトを参考にしてみて下さい。
http://westplain.sakuraweb.com/translate/pygame/Examples.cgi

今回はインベーダーゲームをしてみましょう。
①コマンドプロンプトで、「python -m pygame.examples.aliens」と打ちます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/247638/41ed1080-8deb-cb02-1387-e2b678f1b7a9.png)

②インベーダーゲーム起動します！
![2.png](https://qiita-image-store.s3.amazonaws.com/0/247638/c1115cf9-95c0-9d75-f37d-90e835d3cc75.png)

## 6. PythonのIDE(おまけ)
PythonのIDEは以下のようなものがあります。
~~中でもPyCharmがイケイケらしいです。~~
個人的にはやはりVisual Studio派でした(^^;)

|名前   |URL|
|---|---|
| PyCharm| https://www.jetbrains.com/pycharm/|
| IDLE| (Pythonに付属)|
| Eclipse	| https://www.eclipse.org/|
| PyScripter	| https://sourceforge.net/projects/pyscripter/|
| Wing	| https://wingware.com/|
| Visual Studio Code| https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx|
| Visual Studio Community| https://www.microsoft.com/ja-jp/dev/products/community.aspx|