OmniAICreator/Qiita-1.07M huggingface dataset:
はじめての Flask #1 ~はじめてのウェブアプリ~

[次回 ~POSTを受け取ろう~](https://qiita.com/nagataaaas/items/3116352da186df102d96)

> 改訂 (2022/08/26)
> 今現在Flaskは、Pythonで新しくWebアプリを作る際の選択肢として最適とは言えません。APIサーバを作るのであればFastAPI, それ以外であればResponderなどをお勧めします。

# はじめに
この記事は

**Pythonはさわったことがある・分かるけれど、webアプリの作り方がわからない…** や **自信が無くて、どうやって始めればいいかわからない…**
といった方向けの入門記事です。

# インストール
この記事では、Python3がインストールされていることを前提に進めていきます。おすみでない方は
[Python3 install](https://www.python.org/downloads/) から端末にあったPython3をダウンロード、インストールしてください。

インストールが終わったら、コマンドプロンプト、terminal等で

```
$pip install flask
```

と実行してください。必要なライブラリ(第三者が提供する機能群)がインストールされます。

# おはよう、世界！
では、一番簡単なwebアプリ "Hello, World!"を画面に表示するサイトを作ってみましょう。

```python
from flask import *  # 必要なライブラリのインポート

app = Flask(__name__)  # アプリの設定


@app.route("/")  # どのページで実行する関数か設定
def main():
    return "Hello, World!"  # Hello, World! を出力

if __name__ == "__main__":  # 実行されたら
    app.run(debug=True, host='0.0.0.0', port=8888, threaded=True)  # デバッグモード、localhost:8888 のマルチスレッドで実行
```

これを実行して、**http://127.0.0.1:8888/** に接続してみてください。

> Hello, World!

と画面に表示されているはずです。

# おはよう、ユーザーさん！
今度は、urlの中身を受け取ってそれを出力してみましょう。

mainのあとに

```python
@app.route("/<name>")
def hello_name(name):
    return "Hello, {}".format(name)
```

と付け加えて実行してみてください。
最終的に

```python
from flask import *

app = Flask(__name__)


@app.route("/")
def main():
    return "Hello, World!"


@app.route("/<name>")
def hello_name(name):
    return "Hello, {}".format(name)

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=8888, threaded=True)
```

こうなっていると思います。
試しに **http://127.0.0.1:8888/Python** に接続するとわかりますが、出力される内容が
> Hello, Python

になっていますよね。
`<name>`の中にPythonが割り当てられた結果です。このように、urlのデータを読み取って動的にページを作ることもできます。

# 次回予告
次回は、[偶数・奇数判定サイトを作ってみましょう！！](https://qiita.com/nagataaaas/items/3116352da186df102d96)
Postgre SQL をインストールする

## はじめに
「Postgre SQL」をインストールし、Employeeテーブルを作成してみる。

## 開発環境
Windows 10 Pro 1709(16299.192)
PostgreSQL 10.4 Released!

## 手順
１．PostgreSQL のインストール

２．Employeeテーブル作成

３．EmployeeテーブルにInsert


## １．PostgreSQL のインストール
### URL

```
https://www.postgresql.org/download/
```

### インストーラのダウンロード
#### 1. 「Windows」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/b72e4e6b-2d44-8ddc-0a5c-427c4872da7d.png)

#### 2. 「Download the graphical Installer」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/f1578ae4-fc91-56aa-8014-e68a529f3fe0.png)

#### 3. 「Download for Windows」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/f14f2c16-7c2e-5901-a3f2-1d7df649f250.png)

### インストーラの実行
#### 4. ダウンロードしたファイルをダブルクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/70f9dd2b-6a13-1a88-4cec-a2b9b28829f1.png)

#### 5. 「Next」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/2e92a2d2-d95d-a506-627e-25987c9e3f90.png)

#### 6. 「Next」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/e74a6911-a816-bd7f-083c-816dc570ff45.png)

#### 7. 「Next」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/f33aa16c-1fb8-8521-25e0-a10e26b3cad6.png)

#### 8. パスワードを入力し、「Next」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/3f3e0f45-8731-05dc-b7c9-b47c744e5419.png)

#### 9. port、DBユーザを確認し、「Next」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/3187d0ef-9ba5-7048-6a9c-7df6d7c7091c.png)

#### 10. インストールが始まるのでしばらく待つ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/b818ea01-66f4-6486-4d93-e3e3b7ddef4c.png)

#### 11. インストールが完了したので、「Finish」クリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/cdd3e5da-875a-5120-8d5f-ff0482853a23.png)


## 2．Employeeテーブル作成
### psql起動

#### 1. Windowsのメニューから、「PostgreSQL」-> 「PSQL」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/78f6cf8a-f5e4-8837-486d-0d2dd385b922.png)

### DDL実行
#### 2. 以下のコードをcopy and paste
```
CREATE TABLE Employee
(id    CHAR(5)    NOT NULL,
name   TEXT       NOT NULL,
email  TEXT       NOT NULL,
PRIMARY KEY (id));
```
#### 3. ```\d```でテーブルが作成されていることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/ccfd1f59-ef9d-8654-f67c-b7818ef9de9d.png)

## 3．EmployeeテーブルにInsert
### DML実行

#### 1. 以下のコードをcopy and paste
```
INSERT INTO Employee VALUES ('00001', 'Hayako Sato', 'hanako@abc.com');
INSERT INTO Employee VALUES ('00002', 'Ryo Ikeda', 'taro@abc.com');
INSERT INTO Employee VALUES ('00003', 'Hayako Sato', 'ryo@abc.com');
```
#### 2. ```select * from Employee;```でテーブルが作成されていることを確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/214982/126c94f3-87e2-a0cc-056c-f463abd3733d.png)


## おわりに
- ```Postgre SQL```は、Auto Commitがデフォルトです。

- DDL（Data Definition Language）: データ定義言語。
・CREATE(作成)、ALTER(変更)、DROP(削除)　など
- DML（Data Manipulation Language）: データ操作言語。
・SELECT、INSERT(挿入)、UPDATE(更新)、DELETE(削除)など　
- DCL（Data Control Language）: データ制御言語。
・COMMIT(変更の確定)、ROLLBACK(変更の取消)、GRANT(権限の付加)、REVOKE(権限の取消)など
【Ruby】String#scanと正規表現の小さなサンプルメモ

# サンプルコード

```ruby
str = "stringabcdefg---ff"

p str.scan(/a/)
p str.scan(/h/)

# .
# なんでもいい一文字
p str.scan(/.a/)
p str.scan(/..a/)
p str.scan(/..a./)

# ^
# 行の先頭
p str.scan(/^str/)
p str.scan(/^tr/)

# $
# 行の最後
p str.scan(/fg$/)

# *
# ワイルドカード、直前の文字が無い or 直前の文字が1個以上連続する
p str.scan(/g*/)
p str.scan(/-*/)

# +
# 最低1個は直前の文字が連続する
p str.scan(/g+/)
p str.scan(/-+/)

# ?
# 直前の文字が無い or 1つだけある
p str.scan(/g?/)
p str.scan(/-?/)

# .*
# なんでもいい文字の連続
p str.scan(/gab.*/)

# |
# 区切られた文字のいずれか
p str.scan(/a|f/)

# []
# []で括られた文字のどれか
p str.scan(/[af]/)

######### do end
str.scan(/[af]/) do |matched|
  p matched
end
```

## 実行結果

```sh
/home/kure/.rbenv/versions/2.5.0/bin/ruby -e $stdout.sync=true;$stderr.sync=true;load($0=ARGV.shift) /home/kure/mml-search/crawler/scan_test.rb
["a"]
[]
["ga"]
["nga"]
["ngab"]
["str"]
[]
[]
["", "", "", "", "", "g", "", "", "", "", "", "", "g", "", "", "", "", "", ""]
["", "", "", "", "", "", "", "", "", "", "", "", "", "---", "", "", ""]
["g", "g"]
["---"]
["", "", "", "", "", "g", "", "", "", "", "", "", "g", "", "", "", "", "", ""]
["", "", "", "", "", "", "", "", "", "", "", "", "", "-", "-", "-", "", "", ""]
["gabcdefg---ff"]
["a", "f", "f", "f"]
["a", "f", "f", "f"]
"a"
"f"
"f"
"f"
```

# 参考

Ruby 正規表現のまとめ - Qiita https://qiita.com/agotoh/items/87960d256e427d5673a9

サルにもわかる正規表現入門 http://www.mnet.ne.jp/~nakama/
Visual Studio Code 重複行を削除する

## 目的

重複したテキストデータを削除したい。

## 手順

### 1. 行をソートする

- `Command` + `A` でソートする行を範囲選択する
- `Command` + `Shift` + `P`
  - `>Sort Lines Ascending` 昇順または降順に並び替える

### 2. 正規表現で重複行を削除する

- 検索窓を表示する: `Command` + `F`
- 正規表現を使用する: `Command` + `option` + `R`
- 検索ボックスへ入力: `(^.*$)(\n(^\1$)){1,}`
- 置換ボックスへ入力: `$1`
- すべて置換: `Command` + `option` + `Enter`

## キャプチャ動画

![17a2626a47f8eeffd061f1e87097edec.gif](https://qiita-image-store.s3.amazonaws.com/0/52879/6c5f50b9-70a6-c18c-05ef-836202db8a78.gif)

## 補足

`(^.*$)\n(^\1$)`、 `$1` の正規表現の補足です。

まず、正規表現では括弧で囲われた部分は変数に代入されます。
括弧の数に応じて `$1,$2,$3...` と代入されていきます。
`\1` は前方で記憶した文字列をマッチしています。

改行を挟んで二行続けて同じかチェックして、一行目に置換するイメージです。

## 参考

- http://www.geocities.jp/oraclesqlpuzzle/regex/regex-6-1.html
- https://gist.github.com/eiichi-worker/777ba6bf9380cd0bf22aa214e8861192
- https://qiita.com/ik_miyabi/items/12d1127056cdf4f0eea5
畳み込みニューラルネットワーク(CNN)の設計（一）

## はじめに

画像分類にて、畳み込みニューラルネットワークをよく使ってきました。その経験を整理して、メモとして残したいと、知見を共有し、誰かの役に立てられば、もしく有識者の指摘を頂ければ、嬉しいことです。

## 問題

> ネットワークは何層にしたらいいの？

## 深いCNNがILSVRCに勝つ

画像分類と言えば、ImageNetにて、毎年行われるImageNet Large Scale Visual Recognition Challenge（通称：ILSVRC）という画像認識のコンペが有名です。
ImageNetというのはスタンフォード大学が立ち上げ、２万2千カテゴリのラベル付けされた、1400万枚の画像セットです。画像分類の多くの研究はこのデータセットを使って行います。
以下は2010年〜2015年の間、ILSVRCに優勝したモデルのtop-5誤認識率とモデルのレイヤ数です。

![cnn_ilvsrc.png](https://qiita-image-store.s3.amazonaws.com/0/26321/bb5787dd-c868-0130-dbb3-7543245e0d17.png)


2012年にAlexNetと呼ばれるCNNを用いた手法が、それまでの画像認識のデファクトスタンダートで有ったSIFT + Fisher Vector + SVMというアプローチに大差を付けて優勝し、一躍深層学習が注目される事となった。
その後、VGG, GoogleNet, ResNetが続々登場して、top-5の誤認識率を毎年更新していた。これらCNNモデルの進化について、一番大きな特徴はネットワークが段々深くなって来た。特に、2015年にMicrosoft Researchから提案されたResNetが最大1000層以上の深いニューラルネットワークを構築することが可能となった。単純に畳み込み層を重ねっていくというわけではないですが、ネットワークの深さは如何に重要であることはわかると思います。

## 深いCNNの問題

ネットワークは深いほど精度向上すると考えられるので、いざ深いネットワークを学習させようとすると、下図のように精度が劣化する問題がある。

![cnn_err.png](https://qiita-image-store.s3.amazonaws.com/0/26321/b6d10d90-f561-7a42-2ddd-9308b749d8f0.png)

注目して欲しいのは、test error だけではなくてtraining errorでも、深いネットワーク（56-layer）の方が精度が悪くなっており、単純な過学習ではない。
深いネットワークの問題は、学習の時、勾配消失という現象が起きやすいのだ。ニューラルネットワークの訓練には誤差逆伝播法（バックプロパゲーション）が使われて、勾配が消失してしまうと、学習ができなくなり、精度が上がらないのだ。

## 勾配消失の対策

勾配消失の対策としてよく上げられているのはResNetだと思います。
ResNetのアイディアはシンプルで、「ある層で求める最適な出力を学習するのではなく、層の入力を参照した残差関数を学習する」ことで最適化しやすくしている。
以下は一般的なネットワーク(2層の畳み込みブロック)

![plain_network.jpg](https://qiita-image-store.s3.amazonaws.com/0/26321/053d8e11-cfdc-537f-aba4-9519a3921ac6.jpeg)

kerasで書けば、

```python
# 仮にfilter数64, サイズ3*3
x_conv = Conv2d(64, (3, 3), activation='relu')(x)
x_conv_conv = Conv2d(64, (3, 3), activation='relu')(x_conv)
```

ResNetでは、Shortcut Connectionというパスを追加して、残差ブロックという構造にする。

![residual_block.jpg](https://qiita-image-store.s3.amazonaws.com/0/26321/79d2b00a-6051-8aa8-75b3-3b78e78bdf07.jpeg)

kerasで書けば、

```python
x_conv = Conv2d(64, (3, 3), activation='relu')(x)
x_conv_conv = Conv2d(64, (3, 3), activation='relu')(x_conv)
# short connection
add_conv = layers.add([x_conv_conv, x])
# add_convは次のレイヤの入力になる
```

残差ブロックの導入により、勾配消失を防ぐことが出来て、結果的に学習できるネットワークの深度の限界を押し上げることに成功した。そして精度向上を果たした。

## 巨人の肩に乗ろう

ネットワークを深くすれば精度は高くなるが、気をつけなければならないのは、レイヤ増加による収穫逓減だ。現場では、モデル精度(accuracy)、学習スピード（operations）、メモリの消費量三者のバランスを如何に取るかというところになるだと思います。
以下は様々なCNNネットワークタイプ

![cnn_type.png](https://qiita-image-store.s3.amazonaws.com/0/26321/9efd74d3-6133-d3c9-e432-e8a0e3d8bfb6.png)

一番シンプルなAlexNetは、精度が低いけど、スピードが早い、メモリ消費も少ない。よく使われているVGGはより深いので、精度が高くなる一方、スピードが遅い、メモリ消費も大きくなる。注目して欲しいのは、InceptionとResNetです、スピードと精度が一番バランスよく取られているのだ。基本的に、精度が欲しければ、極端的に深いResNetを作る、スピードが欲しければ、Inceptionを選ぶ。
ネットワークの設計はゼロから少しずつ模索するのもいいですが、自分のニーズに合うネットワークタイプをベースにして改造した方がもっと効率的だろう。

## まとめ

CNNにおいて、層を重ねるごとに、より高度で複雑な特徴を抽出出来て、ネットワークが深いほど精度が高くなる。ところが、深いネットワークには勾配消失現象が起きやすくて、学習することは困難だ。それを解決するため、残差ブロックは有効手段の一つだ。また、現場ではモデル精度(accuracy)以外に、学習スピード（operations）とメモリの消費量も考慮しなければならないので、ニーズに合うCNNタイプをベースにして設計するのは効率的だろう。その有力候補として、ResNet, Inceptionが上げられる。

## 参考

[ResNet 論文](https://arxiv.org/pdf/1512.03385.pdf)

[ResNet 解説](https://deepage.net/deep_learning/2016/11/30/resnet.html)
bashからzshに移行してみた！（mac）

ちょっとまだあまりよくわかっていないのですが、
bashよりzshの方が良いというのを聞いたので、早速使ってみました。

#1. homebrewでzshをインストール

まずはインストールします。

```
$ brew install zsh
```

そして、/etc/shellsに以下のコードを追記します。

```
/usr/local/bin/zsh
```

そして、zshを使うよ〜〜って指示を出します。

```
$ chsh -s /usr/local/bin/zsh
```



ちなみに、僕は2番目の手順をせずに、zshを使うよ〜〜〜って言い始めたので、コンピュータに怒られました。
その時のエラーがこれ

```
chsh: /usr/local/bin/zsh: non-standard shell
```
これが出たら、2番目を忘れている可能性大ですので、やってみてくださいね。


#環境設定

一回ターミナルを再起動すると、もうzshに切り替わっています！
さてさて、
なんか出ていますねえ。

```
This is the Z Shell configuration function for new users,
zsh-newuser-install.
You are seeing this message because you have no zsh startup files
(the files .zshenv, .zprofile, .zshrc, .zlogin in the directory
~).  This function can help you with a few settings that should
make your use of the shell easier.

You can:

(q)  Quit and do nothing.  The function will be run again next time.

(0)  Exit, creating the file ~/.zshrc containing just a comment.
     That will prevent this function being run again.

(1)  Continue to the main menu.

--- Type one of the keys in parentheses ---1
```
要は、
0 => 環境設定について何もせずに終了
1 => 環境設定について、.zshrcファイルを作って終了。ちなみにこのファイルに設定とか書くみたい
2 => 環境設定を対話形式で進めていくよ〜


僕は1にしました。


# 3.プラグインマネージャーzgenを入れてみる。

社員さんにzgenがrecommendと言われたので、入れてみます。

zgenについては、個人ブログですが、これが分かりやすいかも、、、
[zshのプラグインマネージャzgenについて](http://yukidarake.hateblo.jp/entry/2015/08/25/194603)


## 3-1. zgenを入れます。

まずは、zgenのgithubに行きましょう。
[zgenのgithub](https://github.com/tarjoilija/zgen#example-zshrc)

そして、README.mdを確認します。
お、インストール方法かいてるじゃん〜


README.mdにもかいていますが、同じことをつらつら言います。
まずはクローン

```
git clone https://github.com/tarjoilija/zgen.git "${HOME}/.zgen"
```

.zshrcをロードします

```
source "${HOME}/.zgen/zgen.zsh"
```

自分のテキストエディタ（僕はatom）で.zshrcを開く

```
atom .zshrc
```

これを追記

```
# if the init scipt doesn't exist
if ! zgen saved; then

  # specify plugins here
  zgen oh-my-zsh
  
  # generate the init script from plugins above
  zgen save
fi
```

で、もう一回.zshrcをロードする

```
source .zshrc
```

なんかできた。
まだあまりよくわかっていないですが、なんかできました。

## （追記）bashの設定をzshにも適用する

bashでwebpackやgrep -rコマンドが使えていたのに、zshで使えなくなりました。
なんでや！って思って、teratailで質問。そうしたら、bashの設定をzshにコピペしていないからだということが判明。

確かに、bashの設定は「.bash_profile」や「.bashrc」から読み込みますが、zshの設定は「.zshrc」から読み込むので、移さないといけなかった。。。
というわけで、bashの設定をzshの設定にコピペしましょう！
AWS ELasticBeanstalkのRails環境でSPAを動かすには

# TL;DR
RailsのルーティングはAPIのパス以外は、Vueのルートパスにルーティングするように設定したというだけの話。

## 前提
- インスタンス
    - 環境: Puma with Ruby 2.5 running on 64bit Amazon Linux/2.7.2
    - フロント: Vue.js(Nuxt.js)
- Rails設定
    - APIモードではなく通常のプロジェクトで作成
- Vueの配置位置
    - app/public/{VueRoot}

## 経緯
ローカルで開発している段階では以下のようにRailサーバとVueサーバ別個に立ち上げていたので問題は起きなかった。というか後に問題になることを気づかなかった。

```console
$ cd {RailsRoot}
$ rails s // endpoint -> localhost:3000
$ cd {RailsRoot}/public/{VueRoot}
$ npm run build // localhost:3001

// ブラウザでlocalhost:3001にアクセス
```

## AWS上にデプロイ後
Railsアプリケーションとしてデプロイしてるので、当然RailsにアクセスしてVueを表示したいわけです。なのでまず、RailsルートにアクセスしたらVuの起動ページを返す設定を追加。

```ruby
# routes.rb
Rails.application.routes.draw do
  root to: 'hoge#top'
  # Rails APIのルーティング設定は省略
end

# hoge_controller.rb
class HogeController < ApplicationController
  def top
    # return Vue root page
    render file: 'public/fuga/dist/index.html', layout: false, content_type: 'text/html'
  end
end

```
トップページは表示されました。

## 下層ページ
Vue側のルーティングが動いた際、Railsのルーティングが動いてRailsの404が表示されてしまう。
→おそらくVueのルーティング〜レンダリングとRailsの404、どちらが先に動くかは不定になると思われる。

なので下層ページの際はRails側のルーティングは動かないようにしたい。

```ruby
# routes.rb
Rails.application.routes.draw do
  root to: 'hoge#top'
  # Rails APIのルーティング設定は省略


  # !!! 下記を追加 !!!
  get '*path', to: 'hoge#top'

end
```
これでとりあえずOKでした。
C#でAWS Lambda ～ デバッグ方法

####やること
- [ ] 1. Visual StudioからAWSツールを使ってLambdaにソースを入れる
- [x] 2. Lambdaにソースを入れる前に、ローカルでデバッグする

#前提
前回の[”C#でAWS Lambda ～ 一番基礎的な使い方”](https://qiita.com/akihiyo/private/78c4ab0675105ca6b9dc)のやり方で、VS2017でコードを書いて、Lambdaにアップロードできている状況になっていること
####前回までの簡単な概要
ソリューションファイルの中にLambda用のプロジェクトがある。
VSからLambdaにPublishして、動作確認ができている。
が、
このままだと、いちいちPublishしないと実行結果が確認できないし、デバッグもできないorz
なので、
ソリューション内にテスト用ドライバを作って、VSの実行ボタンで簡単に実行でき、かつデバッグもできるようにする。

###テスト用プロジェクトの追加
１ソリューションに１プロジェクトだと、ソリューションエクスプローラにソリューションが見えない（？）ので、**ファイル→追加→新規プロジェクトの追加**をする
![Qiita01.png](https://qiita-image-store.s3.amazonaws.com/0/185989/ffb4b2e8-e702-be09-d7ff-93fb2644027f.png)
多分、*AWS Lambda Project with Tests*でやるんだろうが
![2018-05-20 (1).png](https://qiita-image-store.s3.amazonaws.com/0/185989/3abcd478-076f-789e-bc69-b3e619b6de26.png)
ここはあえて、.NET Core標準のプロジェクトを作る
ConsoleApp1という名前にしておきます。
![2018-05-20 (2).png](https://qiita-image-store.s3.amazonaws.com/0/185989/0015efc5-8b53-6499-3d3a-8415823c4111.png)
コンソールアプリ（.NET Core）を選択。
¥bin の下に、exeが作られてDOS画面で実行するイメージですね。

で、VSの緑三角を押すと、このコンソールアプリが実行するようにします。
ConsoleApp1プロジェクトで右クリック、*スタートアッププロジェクトに設定*
![2018-05-20 (3).png](https://qiita-image-store.s3.amazonaws.com/0/185989/07068a52-fd4d-571d-e486-0a097361d238.png)
はい。
![2018-05-20 (4).png](https://qiita-image-store.s3.amazonaws.com/0/185989/67d6a829-0dbc-1e07-d8fb-a08fda6614bf.png)
ConsoleApp1から、Lambda用プロジェクトを使えるようにします。
プロジェクトを参照設定します。
*依存関係→参照の追加*
![2018-05-20 (6).png](https://qiita-image-store.s3.amazonaws.com/0/185989/45294432-3c0d-279c-ab7c-ac391a9f9916.png)
Lambda用プロジェクトが見えますね。これをチェック
![2018-05-20 (5).png](https://qiita-image-store.s3.amazonaws.com/0/185989/fb69cc5f-4ff3-d00b-1936-e2d8fd1442de.png)
これで、コンソールプロジェクトが起動して、Lambda用プロジェクトを呼び出せるって事になります。

もういっちょ
Lambda用プロジェクトのFunctionには、入力パラメータとして・・・

```csharp:Function.cs
        public string FunctionHandler(string input, ILambdaContext context)
```
string　の方は、入力パラメータとしてわかりますが
ILambdaContext はなんぞ。。
多分ログを書いたりするもののようなので、このオブジェクトを作って渡して上げる必要がありそうです。

Nugetから*Amazon.Lambda.TestUtilities*を入れませう。
![2018-05-20 (7).png](https://qiita-image-store.s3.amazonaws.com/0/185989/ef452087-9aad-7d6e-8441-444bb332895c.png)
はい。
コンソールアプリが起動されると、Mainが動きますんで
Mainの中身を弄ります。↓こんな感じに。

```csharp:Program.cs
using System;

namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {
            AWSLambda1.Function fnc = new AWSLambda1.Function();
            string modoriTi = fnc.FunctionHandler("hogehoge", new Amazon.Lambda.TestUtilities.TestLambdaContext());

            Console.WriteLine(modoriTi);
            Console.ReadKey();  
        }
    }
}
```
この状態でとりあえず実行してみませう。
![2018-05-20 (8).png](https://qiita-image-store.s3.amazonaws.com/0/185989/c80af5a7-5f2f-ef78-78b7-d9fcc288d072.png)

はい。
あとはブレークポイントを置けばなんとかなります。
Google Code Jam 2018 Qualification Round - Go, Gopher!

# 対話式問題

あんまりHaskellには向いてない感？
C++で書いたのとあまり変わらない感じになりました。

# 一部分を置き換えたリストの生成

「リストの一部分を置き換えたリストを生成」する良い方法が思いつかなかったので無理やりです。

```listmod.hs
f :: Int -> a -> [a] -> [a]
f n a xs = take n xs ++ (a : drop (n+1) xs)
```

O(n)で効率も良く無いと思うのですが、もっと良い方法ってあるんでしょうか？

# 解答の方針

領域の大きさ(1000x1000)とTest2のサイズ(A=200)を比べると、簡単に済ませるにはとにかく一列に埋めていけば良い。

## 手順

1. (2,2)を要求 -> (1,1), (1,2), (1,3)が返ってくるまで要求し続ける
2. 次に(3,2)を要求 -> (2,1), (2,2), (2,3)が返ってくるまで以下同文
3. 以下同様に
4. 要求されたマス目の数に足りるところまできたら、(0,0)が返ってくるまでひたすら(n,2)を要求する

(i,2)を要求している時に(i-1,1), (i-1,2), (i-1,3)が埋まるのを待っているわけですが、その間に返ってきている(i,* ), (i+1,* )もマークしておくと試行回数を減らすことができる。

# 実装

```gcj.hs
import Control.Monad
import System.IO

f :: Int -> [a] -> a -> [a]
f n xs a = take n xs ++ (a : drop (n+1) xs)

solve :: Int -> Int -> [Int] -> IO ()
solve n a xs = do
    putStrLn $ shows n " 2"
    (x:y:_) <- (map read.words) <$> getLine
    let ns@(n0:n1:n2:nr) = f (((x+1-n)*3)+(y-1)) xs 1
    case n0+n1+n2 of
        3 | n < a  -> solve (n+1) a (nr ++ [0,0,0])
        3 | n == a -> s2 (n+1)
        otherwise  -> solve n a ns

s2 :: Int -> IO ()
s2 n = do
    putStrLn $ shows n " 2"
    (x:y:_) <- (map read.words) <$> getLine
    case (x,y) of
        (0,0) -> return ()
        (_,_) -> s2 n

main = do
    hSetBuffering stdout NoBuffering
    t <- readLn
    replicateM_ t $ do
        a <- readLn
        solve 2 ( (a+2) `div` 3 - 2 )  [0,0,0,0,0,0,0,0,0]
```

## main

hSetBuffering stdout NoBufferingでバッファリングを無効化が必要。

## solve

(n-1,* )が埋まるまで同じnで再帰して、埋まったらnを+1して再帰する。
結局要求している(n,2)を中心として3x3のマスしか見ていないので、9マス分だけ用意しておけば良い。2次元リストにすると要素の差し替えが面倒になるので、要素9個のリストを用意。
(n-1,* )をリストの先頭になるように配置しておき、埋まっていないところを0、埋まったところを1とすると、先頭3つの要素の和が3かで判定できる。埋まったらその分リストをスライドする。

## s2

要求を満たせるところまできたらひたすら(0,0)が返ってくるまで繰り返すだけ。
Fetchについて

新卒エンジニア2ヶ月目。
Fetchについて理解が足りないので少し勉強した。
ド素人なりに、「こんなのもわからないのか」的なレベルから書く。

# そもそもFetchってなに？
Fetchの日本語訳は「取ってくる」とか「引き出す」とかいう意味。
MozillaのFetch概説<https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch>にはこう書かれている。

> 
fetch() から返される Promise は レスポンスが HTTP 404 や 500 を返していても HTTP エラーステータスを拒否しません。その代わりに正常に解決し (ok ステータスは false にセットされます)、そしてネットワークの失敗または何かがリクエストの完了を妨げた場合のみに拒否するでしょう。

ん？Promise？広瀬香美かな？
とりあえず非同期処理とかメソッドチェーンができるとか便利だっていうことはこれ<https://qiita.com/toshihirock/items/e49b66f8685a8510bd76>を読んでなんとなく理解した。
できれば別記事でまとめておきたい。

とりあえずFetchリクエストを投げるとPromiseでレスポンスが返ってくるらしい。

# Fetchのサンプルコード
Fetch概説のサンプルコードがこれ。

```
fetch('http://example.com/movies.json')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson);
  });
```

多くのサイトで「thenなんてわかって当たり前でしょ」となっていたので一応書く(自分でもふわっとしている)。

## thenについて
こちらのブログ<https://liginc.co.jp/344056>が読んでてわかりやすかったので引用。
> 
promiseオブジェクトは、 then() と catch() という2つのメソッドを持っており、promiseオブジェクト内部の状態が Fulfilled になると、 then() メソッドのコールバックが呼ばれ、逆に Rejected になると catch() メソッドのコールバックが呼ばれます。
つまり、実質的に new Promise() のコールバック内で resolve() を実行すれば then() メソッドのコールバックが呼ばれ、 reject() を実行すれば catch() メソッドが呼ばれるということです。

Promiseオブジェクト内部の状態については同ブログより
>
- Fulfilled – コールバック関数内でresolve()が呼ばれた時
- Rejected – コールバック関数内でreject()が呼ばれた時
- Pending – 初期状態

とある。つまりPendingの初期状態から、
- resolveメソッドが呼ばれた場合、状態がFulfilledへ遷移し、thenメソッドのコールバックが呼ばれる
- rejectメソッドが呼ばれた場合、状態がRejectedへ遷移し、catchメソッドのコールバックが呼ばれる

という風に解釈できる。
ということはサンプルコードにcatchコールバックを追加するには

```
fetch('http://example.com/movies.json')
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson);
  })
  .catch(function(error) {
    console.log(error);
  });
```

という風に書けば良いはず。
Mac の sudo コマンドでパスワードを聞かれるまでの時間を伸ばす

```
$ sudo visudo
```

Macにログインする時のパスワードを聞かれるので、入力する。

エディタが起動するので、以下の行を追加する。

```diff
+ Defaults timestamp_timeout = 1440 # 有効時間を分で指定

## sudoers file.
##
## This file MUST be edited with the 'visudo' command as root.
```

保存終了すると即時反映される様子。

# 操作がよく分からない場合

vimという特別なエディタが起動するので、次のとおりに操作する。

- `a` キーを押す (入力モードに入る)
- 何もない行に移動する。
- `Command + V` で `Defaults timestamp_timeout = 1440` をコピペする。 (「右クリック」→「貼り付け」でも良い)
- `Esc` キーを押す (入力モードを終える)
- `:x` と入力する (保存終了)

# 環境

- Mac OS X Sierra

# 参考

- [Linux - sudo パスワード持続時間の調節！ - mk-mode BLOG](https://www.mk-mode.com/octopress/2013/08/06/linux-sudo-adjust-password-timeout/)
- [Change Sudo Password Timeout | LinuxG.net](http://linuxg.net/change-sudo-password-timeout/)

>The timestamp_timeout:
>
>The timestamp_timeout defines the number of minutes that can elapse before sudo will ask for a password again. To modify the timestamp_timeout, edit the /etc/sudoers file.
>I recommand you to use visudo, when editing the /etc/sudoers file.









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PDOで could not find driver が出たとき

# PDOとは

PHPからデータベースを操作するときにPDO (PHP Data Objects) という仕組みを使う。PDOがデータベースの違いをラップしてくれるおかげで、MySQLでもSQLiteでもMariaDBでも同じ感じでPHPから操作できる。
(ちなみにMongoDBなどNoSQLは別の方法が必要らしい)

# ドライバが見つかりません

```
could not find driver
```

PDOを使っていたのだが、ある日から上記のメッセージしか出ないようになった。心当たりはPHPのバージョンをアップデートしたことくらい。
PDOからデータベース(僕の場合MySQL)を操作するためのドライバがインストールされてないことが原因らしい。以下のコードで確認できる。

```bash
$ php -m | grep pdo
pdo_sqlite
```

確かにSQLiteのドライバしか無い。
yumでPHPを7.2にアップデートしたのが原因っぽいので、同じくyumでドライバもインストール。

```shell
$ yum install --enablerepo=remi,remi-php72 php-mysql
```

これでまた動くようになった。
pingで任意のデータ列を送る

#はじめに
普段何気なく使っているpingコマンドだが，送信しているパケットの中身については特に考えたことがなかったためまとめてみることにした．

#実行環境
mac OS High Sierra（10.13.4）


#pingとは？

```shell
$ ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=59 time=6.408 ms
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=9.990 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=6.384 ms
^C

--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 6.384/7.594/9.990/1.694 ms
```
基本的には，`$ ping {ipアドレス or ホスト名}`で事足りる． pingを飛ばすことで，宛先のホストが正しく応答しているかどうか確認することができる．
私自身，基本的にpingを飛ばす際にはipアドレスやホスト名しか指定しないのだが，実はpingコマンドにはいくつかオプションが存在している．

#オプション
詳しくは`ping オプション`などとググると出てくるが，今回使用するのは以下の3つ．

* `-c`　パケットを飛ばす回数を指定する
* `-p`　パケットのデータパターンを指定する，パターンは指定したパケットサイズ分だけ繰り返される
* `-s`　パケットのサイズをbyte単位で指定する（デフォルトは56byte）

#実践
今回は，pingコマンドで`8.8.8.8`に対して`Hello World!`という文字列を送信してみることとする．
データは16進数文字列で指定しなければならないので，まずは文字列→16進数文字列の変換を行う．
（[こちらのサイト](https://singoro.net/16henkan/)を使用させていただいた）
変換の結果，`48656c6c6f20576f726c6421`という16進数文字列を送信すれば良いことがわかった．いま，この16進数文字列は12byteなので，

```shell
$ ping 8.8.8.8 -c 1 -s 12 -p 48656c6c6f20576f726c6421 

PATTERN: 0x48656c6c6f20576f726c6421
PING 8.8.8.8 (8.8.8.8): 2 data bytes
10 bytes from 8.8.8.8: icmp_seq=0 ttl=59

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
```

このようなpingを飛ばした．これは`8.8.8.8`に対して，`1回`，データ部分に`48656c6c6f20576f726c6421`を乗せた`12byte`のパケットを送信するコマンドである．

ところが実際にwiresharkを用いて飛ばしたパケットを見てみると，次のようなことがわかった．

<img width="549" alt="スクリーンショット 2018-05-20 14.07.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/171438/2e283a78-3853-9f66-00ac-3a0d83364afd.png">

データが4byteしか送られていない．12byteって指定したはずじゃ...
実はこれは正しい挙動で，本来なら`-s 20`として20byteのパケットを送らなけばいけなかった．

#ICMPヘッダフィールド
[こちらのページ](https://www.itbook.info/study/ping6.html) が大変参考になった．
pingはICMPを利用したプロトコルであり，パケットにはICMPヘッダが付与される．このサイズが8byteなので，パケットサイズ12byteのうち8byteがヘッダに使用され，残り4byte分しかデータを送ることができなかったというわけである．

#気を取り直して
```shell
$ ping 8.8.8.8 -c 1 -s 20 -p 48656c6c6f20576f726c6421

PATTERN: 0x48656c6c6f20576f726c6421
PING 8.8.8.8 (8.8.8.8): 20 data bytes
28 bytes from 8.8.8.8: icmp_seq=0 ttl=59 time=5.425 ms

--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 5.425/5.425/5.425/0.000 ms
```

<img width="737" alt="スクリーンショット 2018-05-20 14.20.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/171438/58ee3c9c-1721-8077-c681-22bd0b3a0053.png">

<img width="1232" alt="スクリーンショット 2018-05-20 14.21.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/171438/90759c83-0d42-32a4-7ddc-243692618cc4.png">

無事に```Hello World!```を送信できた．

#まとめ
pingで任意のデータ列を送信したい場合は,

1. 送信したい文字列を16進数に変換
2. ```-p```で16進数文字列，```-s```で16進数文字列のサイズに8を足した数字を指定


すれば良いことがわかった．
普段何気なく使用しているコマンドだが，調べてみると結構面白い．
Pythonのlambdaって分かりやすい



**lambda(無名関数)** ってネタにされることが多いですよね。
その割にあんまり使われない。
でも、実はかなり使い勝手のいいものなんですよ！


『**lambdaわからないおじさんです!!**』って人のための、解説です。
※Python3でのlambdaの解説なので、ほかの言語に関しては当てにしないでください。

# 文法

lambdaは

```python

lambda 引数: 返り値
```

という形で書きます。

短く書いているだけですので、無名ではなくする(関数を定義する)と

```python
def func(引数):
    return 返り値
```

と同等です。上記のlambda式と、関数funcは同じ実行をします。　つまり


```python

def double(n):
    return n * 2

lambda_ver = lambda n: n * 2

print(double(2) == lambda_ver(2))
    # True
```
となります

あるいは、以下のように引数をつけずに実行することも可能です。

```python
lambda: random.rand()
```

また、引数を複数用いることもできますし、可変長引数やキーワード引数の受付も可能です。

```python
f = lambda x, *args, rival, **kwargs: [rival, args, kwargs]
f(1, 2, 3, rival="ruby", name="python", author="Guido")
    # ['ruby', (2, 3), {'name': 'python', 'author': 'Guido'}]
```

すごく簡単ですよね。


# 何が嬉しいの？

lambdaを使うと何が嬉しいかというと、**mapやsortの時、特別な動作をしたいけれど、わざわざ関数を定義するのもなぁ…** っていうときにパパっとかける点です。

たとえば、すでにある整数のlistにそれぞれを2乗して符号はそのままにしたい！なんてことがあるかもしれません。その時に関数を定義すると、

```python
from math import copysign

lis = [2, -10, 5, -3, 6, 7, -8]

def func(n):
    return int(copysign(n**2, n))
    # return n ** 2 * [1, -1][n < 0] と同義

lis = list(map(func, lis))
    # [4, -100, 25, -9, 36, 49, -64]
```
というようになります。

こんなことのために毎回関数を用意していたら面倒ですよね。

なので、
```python
from math import copysign
lis = [2, -10, 5, -3, 6, 7, -8]

lis = list(map(lambda x: int(copysign(x**2, x)), lis))
    # [4, -100, 25, -9, 36, 49, -64]
```

という風にlambdaを使って書くことができます。

また、**名前と得点をtupleとして持っているlistを、得点でsortしたい！(tupleを要素として持つlistを、それぞれのtupleの2番目の要素でsortしたい)**
といったときにも

```python
score = [("Adam", 64), ("Bob", 82), ("Charlie", 21), ("David", 91)]

score.sort(key=lambda x: x[1])
    #[('Charlie', 21), ('Adam', 64), ('Bob', 82), ('David', 91)]
```
という風にできます。

どうですか。
新開地が開けそうでしょう…

ということで、lambdaの解説でしたー
40代おっさんの手習いで始めるPython（2018/05/20編）其の壱

ずっとVB.NETのレガシーなプログラムを書いてるおっさんではあるが、最近の技術についていくためにも、ひとまずPythonを学びWebアプリをサクッと作れるようにはなっておきたいと考え、その記録をblogに残す事とした。面倒臭いけどこういうの大事かもな、と言う自己満足である

ひとまず以下のサイトを参考にした。そのため、使うテンプレートはjinja2である。
[「bottle」+「jinja2」を使ってサイト構築 1 ](https://www.blog.umentu.work/python%e3%83%95%e3%83%ac%e3%83%bc%e3%83%a0%e3%83%af%e3%83%bc%e3%82%af%e3%80%8cbottle%e3%80%8d-%e3%83%86%e3%83%b3%e3%83%97%e3%83%ac%e3%83%bc%e3%83%88%e3%82%a8%e3%83%b3%e3%82%b8%e3%83%b3%e3%80%8cjinja2/)

こんな風にフォルダを掘って、準備。
<img width="521" alt="スクリーンショット 2018-05-20 14.08.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/69f1ba4b-d912-8a94-35cb-eb190351e19e.png">
実行ファイルが run.py、その他テンプレート定義のファイルとか画像とかはそれぞれのフォルダに格納していくらしい。

ソースコードを読み解いていくと、template('<name>')関数からテンプレートを読み込んだ結果を文字列で返し、それをウェブブラウザにするという構造のようだ

<img width="505" alt="テンプレート設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/39977059-b128-b414-8b42-98c77dfab1a0.png">
上記のように置いたファイルを、以下のコードで指定している
<img width="585" alt="ソース指定.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/24069fb8-7426-7b46-a49c-e5d6675d3c66.png">

そう考えられたので、適当にいじり倒してみることにする。

下のように新しくファイルを用意して
<img width="505" alt="スクリーンショット 2018-05-20 14.27.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/6f91c5a3-f016-b902-b1db-552f10ce15c3.png">

こいつをコードのガワから開くように変更する。
<img width="586" alt="スクリーンショット 2018-05-20 14.29.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/1ce2cfd2-1069-d2dd-c782-ee7769b98c46.png">

上記のように変更した後実行すると、文言を変更したnext.tplの内容を元にしたページを開けるようになった。テンプレートの指定はこれで良いというのが判る。

テンプレートとしてフォームを設定することも出来る。受け取るためには当然フォームに名前を設定しなければならない。
<img width="432" alt="テンプレート側.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/97c47c28-8309-dd5b-4254-819ba212a2d0.png">
上にあるようにフォームに設定した name を、
<img width="435" alt="コード側.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/9c01b313-de00-56e8-0417-896658ebb577.png">
こんな風に request モジュールを使って取得する。formsの後ろにフォームの name に設定した文字列を入れることで文字列が取得できる。

テンプレートに変数を組み込みたかったら、このようにする。
<img width="307" alt="テンプレート変数定義.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/19e3f6a4-6e5f-efe5-8e56-b89c5059ec75.png">
こうした上で、コード側でテンプレートを開くときに以下のように記述すると、テンプレートをブラウザで開く際、指定の変数定義の部分を置き換えてくれる。

<img width="427" alt="コード側の置きかえ実装.png" src="https://qiita-image-store.s3.amazonaws.com/0/258622/ca06c07c-4076-5018-d7da-7c44392ddbde.png">

requestモジュールの使い方に関しては[ここ](https://qiita.com/tomotaka_ito/items/62fc4d58d1be7867a158)を参考にあちこち見て回った。

とりあえず、ザックリとした概要、簡単な使い方は理解した。
自宅でもsqlite3モジュールを利用したデータベースを使ったデータ管理も覚えたし、これで少し勝手なWebアプリが開発できそう。

とりあえずメール送信機能を実装した上で、なんかわかりやすくて自分だけ使いそうなアプリを組もう。

まずは一つ賢くなったところで、少し本格的に動くモノを作ってみたい。
【自分メモ】Pythonのscikit-learnについて

随時追加削除予定




#入門用
Qiita
scikit-learn（sklearn）の使い方
https://qiita.com/kenta1984/items/c2f3b2609071717dcf71
　　　サイキットラーン公式を引用しつつとりあえずサクッと分析ができる内容を説明
　　　スケーリングのための minimax_scale 関数や train_test_split 関数での分割
　　　正解率（accuracy）、適合率（precision）、再現率（recall）を出したい場合もある

scikit-learn で線形回帰 (単回帰分析・重回帰分析)
https://pythondatascience.plavox.info/scikit-learn/線形回帰

Qiita
ROC曲線とAUCについて定義と関係性をまとめたよ
https://qiita.com/koyamauchi/items/a2ed9f638b51f3b22cd6


前処理大全と言う本が良著らしい
https://www.amazon.co.jp/dp/B07C3JFK3V/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

#不平衡データ
データサイエンティスト(仮) 
Pythonでデータ分析：imbalanced-learnで不均衡データのサンプリングを行う
http://tekenuko.hatenablog.com/entry/2017/12/11/214522
　これはすごい！sklearn.datasets.make_classification関数でダミーデータを作る方法が書いてある！
　　　imbalanced-learnパッケージでSMOTEも使っている
　　　　　　imbalanced-learn API — imbalanced-learn 0.3.0 documentation

Qiita
[Python]不均衡データ分類問題に対する定番アプローチ：under sampling + baggingを実装したよ
https://qiita.com/nekoumei/items/6448a86a8d255619c4f4
　これもすごい。UnderSampling + Bagging を実装している
　　imblearnのBalancedBaggingClassifierが適切らしい。汎化性能高いぞ
　　　　TJOもRでやっている
　　　　　　　　https://tjo.hatenablog.com/entry/2017/08/11/162057


不均衡データにおけるsampling
https://qiita.com/shima_x/items/370587304ef17e7a61b8
　　　　アルゴリズムベースの方が、データレベルアプローチよりもロバストな結果になったそうです
　　　　アルゴリズムベースは、SVMに重み調整したものではないかと・・・
testとjeの仕組み

高級言語のif文に相当するものはassemblyでこのように表現されることがあります。

(gas表記)

```
        test %rax, %rax
        je .L0
```

これの意味を解説します。

## `test %rax, %rax`

test命令は、2つのオペランドの ビットAND演算を行い、結果がゼロならゼロフラグ(ZF)を立てます。
この例の場合はオペランドが両方同じものなので、raxが0の場合のみゼロフラグが立ちます。

## `je ラベル`

je命令は、ゼロフラグ(ZF)をチェックして、フラグが立っていればラベルへジャンプします。

注意点は、jeは `test`の意味や`%%rax`の内容などは感知していなくて、単にZFの値のみを見ているということです。

# jeの"Jump if Equal"の意味は？

もともとは 「CMP命令の両オペランドが等しいならジャンプせよ」ということからついた名前のようです。
(CMP命令の両オペランドが等しければゼロフラグがたつ → ゼロフラグが立っていればjeはジャンプする）

ですが、この名前は非常に紛らわしいので名前の由来はいったん忘れたほうがよさそうです。

とりあえず JEはJZ("Jump if Zero")と同じと覚えておけばよさそう。

参考 https://stackoverflow.com/questions/13064809/the-point-of-test-eax-eax
Materialize でmodalが開かない解決策

## 結論
Bootstrapとは違って、modalの初期化が必要
画面読み込み時に以下のコードを実行。
よく見たら公式ドキュメントに書いてある。

```js

  // 素のJS
  document.addEventListener('DOMContentLoaded', function() {
    var elems = document.querySelectorAll('.modal');
    var instances = M.Modal.init(elems, options);
  });

  // 以下jQuery
  $(document).ready(function(){
    $('.modal').modal();
  });
```

https://materializecss.com/modals.html

## その他
Nuxt.jsでMaterializeを使うときの設定メモ

```shell
npm i materialize-css
```

```shell
npm i jquery
```

を忘れずに。

```js
const pkg = require('./package')
const webpack = require('webpack')

module.exports = {

  /*
  ** Headers of the page
  */
  head: {
    ....
  },

  /*
  ** Customize the progress-bar color
  */
  loading: { color: '#3B8070' },

  /*
  ** Global CSS
  */
  css: [
    'materialize-css/dist/css/materialize.css'
  ],

  /*
  ** Plugins to load before mounting the App
  */
  plugins: [
  ],

  /*
  ** Nuxt.js modules
  */
  modules: [
    ....
  ],

  /*
  ** Axios module configuration
  */
  axios: {
    // See https://github.com/nuxt-community/axios-module#options
  },

  /*
  ** Build configuration
  */
  build: {
    vendor: ['jquery', 'materialize-css'],
    plugins: [
      // set shortcuts as global for bootstrap
      new webpack.ProvidePlugin({
        $: 'jquery',
        jQuery: 'jquery',
        'window.jQuery': 'jquery'
      })
    ],
  ....
  }
}


```
cuDNN v7.0.5 for CUDA 9.0のインストール[On Windows 10]

Windows 10にTensorflow環境を構築するため、[CUDA 9.0のインストール](https://qiita.com/spiderx_jp/items/cccb2fb35fdaced022ce)に続き、cuDNN v7.0.5をインストールしました。

#前提条件
- Windows 10 Pro Version 1803
- Visual Studio Community 2015 Update 3
- NVIDIA GeForce GTX 1080 Ti
- CUDA 9.0


#cuDNN v7.0.5 (Dec 5, 2017)ダウンロード
[Nvidiaのサイト](https://developer.nvidia.com/rdp/cudnn-archive)からWindows 10用のcuDNN v7.0.5 for CUDA 9.0（cudnn-9.0-windows10-x64-v7.zip）をダウンロードしてきます。

※ユーザ登録が必要です。

#インストール
cudnn-9.0-windows10-x64-v7.zipを解凍すると、以下のようなファイルが格納させているので、各々所定の場所にコピーします。

```
cudnn-9.0-windows10-x64-v7
└─cuda
    │  NVIDIA_SLA_cuDNN_Support.txt
    │
    ├─bin
    │      cudnn64_7.dll  => C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin\ にコピー
    │
    ├─include
    │      cudnn.h  => C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include にコピー
    │
    └─lib
        └─x64
                cudnn.lib  => C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\x64 にコピー
```


以上
ROS講座12 Rviz概要

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 16.04 |
| ROS | Kinetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

#概要
ロボットのプログラムでは可視化が大切です。ほかのプログラムと違い3次元座標は値を数値で表示してもわかりにくく、3次元の可視化GUIの実装は多くの手間がかかります。
ROSではRvizが（3次元での）可視化を担当します。今後はこのRvizの使い方を解説していきます。

#機能
## Rviz上での表示例1
Rvizで出来ることをみてみます。これは私のオリジナルロボットをシミュレーション上で動かしている時のRvizの様子です。
![vis_rviz_overall_mod.png](https://qiita-image-store.s3.amazonaws.com/0/254442/ca805b1c-7f04-a3d1-355d-e1a6bde2f530.png)

1. 3DView（ロボットの状態の表示）  
ここがRvizの本領で、ロボットの位置、間接の角度などを表示することができます。ロボット本体を見なくてもロボットの状態を監視することができます。LIDAR等のセンサーの状態を表示することもできます。
2. OverView（値やエラー情報の表示）  
例えば特定の気になる値があるときにその値をオーバーレイで表示することができます。またハードウェア接続のエラーを表示することもできます。
3. パネル表示（カメラ画像）  
ロボットのカメラ画像やそれに加工をした画像を表示することができます。
4. パネル操作（cmd_velの送信）  
パネルのGUI経由でtopicを送信することができます。

## Rviz上での表示例2
またこれ以外にも以下のようにロボットの認識状況を表示することができます。この例ではLIDARの認識状況（赤い点）とSLAMにより生成された地図（黒とグレー）がRviz上に表示されています。

![viz_rviz_nav.png](https://qiita-image-store.s3.amazonaws.com/0/254442/a0d515bb-5ab0-f8ae-e341-0c4e57cca317.png)

## 制限
ここで注意したいのはRvizはシミュレーターではないことです。ROS用のシミュレーターとしてはgazeboというものがあります。またRvizを使えば自動的にロボットの状態を表示してくれるというものではありません。自分でRviz上の表示を指定するプログラムを書かなければなりません。
つまりRvizというのは`printf("Angle:%f",angle)`のように関節の角度をターミナルに表示する代わりにGUI上に表示されたロボットの関節の角度を変更するものです。

#使うまでの流れ
1. URDFファイルを記述してロボットのLinkやjointを定義する。
2. Rviz上のロボットを動かすROSノードを作成する。
3. launchファイルを記述してRvizやほかのROSノードを起動する。

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
エラーメッセージについて。

質問です。
バリデーションで引っかかった時のエラーメッセージのことなんですが

｀｀｀config.i18n.default_locale = :ja｀｀｀
を.rbに記述し

｀｀｀ja:
  activerecord:
    models:
      user: ユーザー
    attributes:
      user:
        id: ID
        created_at: 登録日時
        updated_at: 更新日時
        birthday: 生年月日
        email: メールアドレス
        salon_id: サロン
        password: パスワード｀｀｀
をja.ymlに記述し
app.rbに
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
を記述したんですが、
日本語にならなかったです。改善点や問題点はありますでょうか
Xcode版playgroundが使えないときにやっていること

swiftのコードをちょっと書いて実行する時にとても便利なXcode版のplayground
swiftの初心者である私はサンプルコードを書いてプログラムを学んでいるので`playgroundの様な応答性の高いものが欲しい。`
だがしかし、いざplaygroundを起動してコードを書いてもなかなか返事が返って来ない。
<img width="956" alt="スクリーンショット 2018-05-20 12.06.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/240708/1c3eaf8f-8e76-d87d-cb87-a2d0f848ca7c.png">

2018/3/19日、Xcodeのアプデが来て"Fixes an issue that caused Xcode to slow down when editing a playground"プレイグラウンドの修正が入るよって言っていた。
<img width="879" alt="スクリーンショット 2018-05-20 12.07.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/240708/309a52c7-f791-4ae4-d838-50e70402b365.png">


ということで、playgroundが遅くなったときにやっている方法を紹介します。

#解決策1　メモリ足りてるか問題。
playgroundを使用するにあたってメモリ不足は重大な問題です。
とりあえず最初はメモリが十分に余っているか確認してください！
確認方法はアクティビティモニタアプリケーションから

<img width="806" alt="スクリーンショット 2019-08-16 11.36.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/5c20fd3c-68f4-b0b3-5876-d6261ee52160.png">

最低メモリが2GBくらいあったら動作が安定する。

#解決策2　ファイルをクラウドで操作していないか？！！
今まで私はどこでも編集できるようにファイルの場所をDropbox内のフォルダに入れていた。ここで私はある仮説を立てた。

**glaygroundはインタラクティブな実行環境な上にコードの予測変換などが出来て常にファイルの整合が保たれていないと使えないんじゃね？と。**
つまり、Dropboxの様なオンラインストレージとローカルにある複数のコンピュータとの間でデータの共有や同期をしているものはコードの整合に時間がかかるのでplaygroundが激重だったということだ。

#早速ローカルのフォルダで試してみる
パスは
>
/Users/hiromen/ドキュメント/MyPlayground.playground

場所はローカルであればどこでも良い。~~**icloudフォルダ**で試したが出来た！~~

#結論
* Xcodeのplaygroundが使えた。

#以下の記事はmacを使用していないひとLinuxでswiftコードを書いているひと向け


##1 ターミナルから対話的に行う(Pythonのインタラクティブモード)
ターミナルでswift(あるいは　xcrun swift)と入力しswiftを動作させるとplaygroundのように対話的に利用することができる。

```
$swift
Welcome to Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.39.1). Type :help for assistance.
1>
///あるいは..
$xcrun swift
Welcome to Apple Swift version 4.1 (swiftlang-902.0.48 clang-902.0.39.1). Type :help for assistance.
1>
```

##2 ソースコードをコンパイルする
あらかじめテキストエディタでswiftのコードを書いておきターミナルでそれをコンパイルする方法
今回はwhy.swiftをコンパイルしていきたいと思う。

**まずコードを書く**

```swift:why.swift
for _ in 1...5 {
  print("なぜplaygroundが使えないの？")
}
```
**ターミナルを起動してファイルのあるディレクトリに移動後以下のように叩く**

```
$ swiftc why.swift      ///コンパイルされる(エラーがあれば吐かれる)
$ ./why　　　　　　　　　　///実行
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
```
2行書けば実行できる。普段はこっちを使う。
###コンパイルせずに実行するには...
コンパイルせずに解釈実行するには以下のようにターミナルを叩く

```
$ swift why.swift
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
なぜplaygroundが使えないの？
```

1行で実行できる(笑)

~~以上で私がplaygroundが使えないときにswiftコードを確認する際に使っている方法でした。~~
playgroundが使えなかった理由がフォルダの場所(Dropbox)にあった。仮説を立てることが大切だなと感じました。
JSONオブジェクトの並びから連結された配列を得る（jq コマンド利用）

こんにちは
「[jqで連続するオブジェクトを配列にする](https://qiita.com/eielh/items/aff045e1689be8e89972)」 で紹介されている ```--slurp/-s``` オプションを使い、オブジェクトの並び（[JSONL](https://jsonlines.org/)形式）を受け取って処理してみました。

ここでオブジェクトの並びとは、

```console
$ echo "1 2 3" | jq -c '.' | echo $(tr '\n' ' ')
1 2 3
```

```--slurp/-s``` オプションを使い、これを配列化すると、

```console
$ echo "1 2 3" | jq -s -c '.' 
[1,2,3]
```

```console
$ echo [1] [2,3,[4]] | jq -s -c '.'
[[1],[2,3,[4]]]
$ man jq
--slurp/-s:
  Instead of running the filter for each JSON object in the input, read the entire input stream into a large array and run the filter just once.
```

```'[]'``` で [] の中身を取り出すと（一番外の [] を外すと）、元のオブジェクトの並びへ戻ります。

```console
$ echo [1] [2,3,[4]] | jq -s -c '.[]' | echo $(tr '\n' ' ')
[1] [2,3,[4]]
```

### 配列を連結など

また、```--slurp/-s``` オプションを使い、配列を連結するには、```add``` を使います。

```console
$ echo [1] [2,3,[4]] | jq -s -c add
[1,2,3,[4]]
```

オブジェクトも連結（マージ）できます。

```console
$ gzcat a.json.gz b.json.gz n.json.gz
{"a":1}
{"b":2}
{}
$ gzcat a.json.gz b.json.gz c.json.gz | jq -s -c add
{"a":1,"b":2}
```

フラットな配列を得るには、```flatten``` を使います。

```console
$ echo [1] [2,3,[4]] | jq -s -c flatten
[1,2,3,4]
```

オブジェクトの並びの処理：

```console
$ echo "1 2 3" | jq -c '[.]' | echo $(tr '\n' ' ')
[1] [2] [3]
$ echo "[1,2,3]" | jq -c '.[]' | echo $(tr '\n' ' ')
1 2 3
```
CPUにグリスを塗る。


４年前に買ったPCのCPUにグリスを塗ったら、温度が下がり、CPUファンの音が静かになったという話。

CPUグリスの塗り直しに必要なこと、やることをまとめておく。

# 環境
 * ４年前に買ったデスクトップPC。BTOパソコン。購入以降CPUは交換していないし、グリスも塗りなおしていない。実際ファンを外してみると、古いグリスが固まり、かさかさの状態だった。
 * ファンは純正のものを使用しているが、最近CPUファンの音がうるさい気がする

 * OSはUbuntu 16.4。最近18.4を使っていたが、フリーズした後正常に立ち上がらなくなった。調べるのが面倒だったので、近くにあった16.4を入れた
 * CPUは、`Intel(R) Celeron(R) CPU G1820`

# ビフォアー

効果がわかるように、事前の温度を調べる。

```
# パッケージが入っていなければいれる
$ sudo apt install lm_sensors
```

こんな感じ。

```
$ sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +27.8°C  (crit = +105.0°C)
temp2:        +29.8°C  (crit = +105.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +63.0°C  (high = +80.0°C, crit = +100.0°C)
Core 0:         +63.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:         +61.0°C  (high = +80.0°C, crit = +100.0°C)
```

このときのCPU使用率は調べておくの忘れたけど、20%~30%ほどだった気がする。ちなみに、ユーチューブを見ながら作業している。

ターミナルとChromiumしか使わずにこの状態。

# アフター

塗り直し後の結果を先に書いておく。

```
$ sensors
acpitz-virtual-0
Adapter: Virtual device
temp1:        +27.8°C  (crit = +105.0°C)
temp2:        +29.8°C  (crit = +105.0°C)

coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +36.0°C  (high = +80.0°C, crit = +100.0°C)
Core 0:         +35.0°C  (high = +80.0°C, crit = +100.0°C)
Core 1:         +34.0°C  (high = +80.0°C, crit = +100.0°C)
```

ビフォアーを測ったときと、同じ使い方をしながら計測。25度くらい下がっていて、気になっていたCPUファンの音も静かになった。

# 用意したもの

全部で1000円くらい。Amazonで揃えた。（マスキングテープ以外）

### 必要
 * SANWA SUPPLY シリコングリス TK-P3S
    * Amazonで500円くらい
 * シルコット ウェットティッシュ 除菌 アルコールタイプ 99.99除菌 本体 40枚
    * 古いグリスを拭き取る

### なくてもいい
 * サンワサプライ エアダスター(逆さ使用OKエコタイプ) CD-31ECO
    * ほこりを飛ばす
 * マスキングテープ 
    * CPUにグリスを塗るときに、はみ出さないように

# 手順
個人的にやったことを書くが、ユーチューブで「CPUグリス　塗り方」とかで検索するといろいろ出てくる。ググるよりも動画のほうがわかりやすい。

 * PCのケーブル類を外して、ふたを外す
 * CPUファンを外す
 * CPUファンを綺麗にする
    * ほこりを取る
    * 古いグリスをウェットティッシュで拭き取る
 * CPUを綺麗にする
    * CPUをつけたまま、古いグリスをウェットティッシュで拭き取る
 * CPUにグリスを塗る
    * マスキングテープを使うとはみ出さずに塗れる
    * 量はネットの情報をみて適当に
    * どばっと出てくるので、はじめはティッシュとかに出してみると失敗しない
    * 指で伸ばした。ヘラとかテレカを使うといいとか聞くが、そんなの家にない
 * CPUファンにグリスを塗る
    * CPUとの接地面に薄く塗る。これも指で伸ばした
    * CPUにしっかり濡れていれば、やらなくていいと思う
 * CPUファンをはめる
 * ケースをはめて、ケーブル類ももとに戻す
 * 電源を入れて、CPUファンが回っていることを確認する

# まとめ

グリスの塗り直しは、お安くできて、簡単にできるし、効果的。
Vapor 3.0 で Leaf テンプレートの中で HTML をエスケープせず出力したい場合

例えば Markdown をコンバートした HTML など、HTML エスケープをせずに生の HTML をそのまま Leaf テンプレートに埋め込みたい場合。

Vapor 2.0 までは `#raw()` というタグがあってそれを使うことで実現できたが、なくなっている。

## 結論

`text` というのが HTML 文字列だったとして、

```
#(text)
```

ではなく

```
#get(text)
```

とすれば OK。XSS には気をつけましょう :grin: 

## 蛇足

`#get()` ってのがあると知らなくて (Vapor の Discord 見てて知った) 、今までわざわざカスタムタグとして作っちゃった…マジで無駄なことをしてた…

```swift
import Leaf

public final class RawTag: TagRenderer {
    public func render(tag parsed: TagContext) throws -> Future<TemplateData> {
        try parsed.requireParameterCount(1)
        return Future.map(on: parsed.container) {
            if let string = parsed.parameters[0].string {
                return .string(string)
            } else {
                return .null
            }
        }
    }
}
```
Xamarin.iOSにPull Requestを投げるまで

## はじめに

最近Xamarin.iOSのバグを発見して[Pull Request](https://github.com/xamarin/xamarin-macios/pull/4103)を提出しました。その手順を書き留めておきます。

## ビルドする

[Build & Run](https://github.com/xamarin/xamarin-macios/wiki/Build-&-Run)を読んで`make world`まで実行します。

いくつか気をつけるポイントがありました。

Xamarin.iOSのリポジトリにはsubmoduleがあるので、それも含めてcloneします。

``` shell
git clone --recursive git@github.com:xamarin/xamarin-macios.git
```

Xcodeは指定されたバージョンが必要です。2018/5/18時点で最新は9.3.1ですが、9.3.0が要求されました。次のコマンドで依存関係を確認できます。

```
./system-dependencies.sh --provision-visual-studio
```

古いXcodeは`/Applications/Xcode93.app`のようにファイル名末尾にバージョンを追加してインストールします。

## テストを実行する

`make world`が終わったらテストを実行してみます。テストは`tests`フォルダに入ってます。

[README.md](https://github.com/xamarin/xamarin-macios/blob/master/tests/README.md)にテストのビルド、実行方法が書いてあります。

私が実行したかったテストは`monotouch-test`フォルダ内にありました。それをiPhoneシミュレータで実行するコマンドは次のとおりです。

```
$ make
$ make run-ios-sim-monotouch-test
```

全てのテストを実行する(`run-all`)とディスクをかなり消費します。狙ったテストだけを狙った環境で実行するのが良いでしょう。

一度実行するとシミュレータが閉じてしまいます。もう一度確認するには、Xcodeからシミュレータを立ち上げてインストールされたテストアプリを実行します。

## 修正する

[Monoのコーディングガイドライン](http://www.mono-project.com/community/contributing/coding-guidelines/)に従って修正します。
特に気をつけるポイントは(と[の前にスペースを入れることです。Visual Studioでコピペするとこのスペースが削除されてしまいます。見た目にも気づきづらいのでコピペ元がOKだからと安心せずに確認する必要があります。

修正するときには必ずテストを書くようにしましょう。

## Pull Requestを投げる

コミットを整理し、masterにrebaseしてからPull Requestを投げましょう。

Pull Requestを投げるとContribution License Agreementにサインしろと言われるので確認しましょう。

## 最後に

XamarinはOSSです。バグを発見したら、自前で回避するのもいいですが、本家に修正を投げてみてはいかがでしょうか。
かなりレスポンスがいいので意外と早く終わるかもしれませんよ。私の場合、Pull Requestを投げてから5分でレビュー指摘が返ってきました。
xmodmapが日本語入力の度に無効になる

#環境
Ubuntu 16.04.4 LTS

#症状
xmodmapを使ってcapslockをbackspaceへ置き換えたが、日本語入力の度にキーマップが元に戻ってしまう

#ggった
[ubuntuのフォーラム](https://forums.ubuntulinux.jp/viewtopic.php?id=15894)で、似たような症状になった方を見つけ、以下の解決策にたどり着いた。
「fcitxを導入すれば解決できる」

#しかし
私の環境だとfcitxは導入済み、上記以外の解決策を見つけらず困る。

#原因
入力メソッドに「キーボード - 日本語」と「mozc」の二種あり、英語入力だと前者、日本語入力だと後者、といちいち入力メソッドが切り替わっていた。

#結論
「現在の入力メソッドの設定」から「キーボード - 日本語」を削除し、入力メソッドが切り替わらないようにすると、リマップ設定を維持出来た。
無事解決。
FlutterでTextFormFieldの入力値を隠す

![スクリーンショット 2018-05-20 12.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/139360/417388fc-2d9b-7f6f-d17e-4e7fe6e251cf.png)


入力値を「・・・・・・・」にする方法を紹介します。


## obscureText = true にする
```dart
new TextFormField(
                decoration: new InputDecoration(
                  border: const UnderlineInputBorder(),
                  labelText: 'Password',
                ),
                obscureText: true,
              )
```

これだけです。
【enum】リソースの状態を表す

#enumとは
リソースの区分けや状態を示すのに利用されます。

例えばbookを投稿し、それをみんなで共有できるものがあるとします。
そして投稿されているbookの投稿者が、そのbookを公開・非公開設定できるものとします。

今回で言えば、bookというリソースの中で公開・非公開という状態区分けがあります。
enumを使うことでこのような機能を簡単に作ることができます。


#enumの使い道
今回必要になる状態は、公開状態と非公開状態です。
その場合の設定手順は以下になります。

まず、bookテーブルにstatusカラムを追加します。
下のenumで定義していますが、投稿したらそのまま公開状態にしたいのでデフォルトを１にします。

```
#ターミナル
rails g migration AddStatusToBooks status:integer


#migrationファイル
  def change
    add_column :books, :status, :integer, default: 1, null: false, limit: 1
  end
```

次にenumを追加します。

```book.rb
enum status:{nonreleased: 0, released: 1}
```
ここでは公開するという英語であるreleaseを使います。さらにedをつけることで状態を表します。
非公開状態を０とし、公開状態を１とします。

こうすることで様々なメソッドがつけるようになります。
そのメソッドの種類についてはこちらの記事が非常に参考になります。

[Rails enumについてまとめておく]
(https://qiita.com/shizuma/items/d133b18f8093df1e9b70)

そして、最後に公開・非公開ボタンを押せばそのbookの状態を変えられるようにします。


```books_controller.rb

  def release
    book =  Book.find(params[:id])
    book.released! unless book.released?
    redirect_to edit_book_path(book), notice: 'この作品を公開しました'
  end

  def nonrelease
    book =  Book.find(params[:id])
    book.nonreleased! unless book.nonreleased?
    redirect_to edit_book_path(book), notice: 'この作品を非公開にしました'
  end

```

```edit.html.erb
<% if @book.released? %>
  <%= link_to '非公開にする', nonrelease_book_path(@book), method: :patch %>
<% else %>
  <%= link_to '公開する', release_book_path(@book), method: :patch %>
<% end %>

```
公開非公開機能の完成です。

#enumのメリット

1.便利なメソッドを自動生成してくれる。
上の記事を見ていただければいいのですが、便利なメソッドがたくさん作り出されます。
インスタンスにreleased!とかをつけるだけでカラムを変更できたり、released?をつければtrueやfalseを返してくれます。簡単にカラムの値を調べたり、変更できたりできるのは非常にやりやすいです。

2.マジックナンバーを使わなくて済む。
どちらかというと、こちらの方が自分的には大きな理由ですが、マジックナンバーを使わなくて済みます。
マジックナンバーはプログラムを書いた人にしかわからない数字のことです。
上のedit.html.erbにある、if @book.released?もif @book.status == 1と無理矢理書くこともできますが、１ってなんやねん!?となりますよね。でもreleased?と書かれていれば感覚的に意味がわかります。他の人たちと共有して仕事するときに可読性を上げられます。
【備忘録】virtualenvを使ってみる。

#はじめに
Pythonの仮想環境作成をするツールのコマンドメモです。

#Python環境の作成
Pythonの仮想環境の作成を行う。

```console
$ virtualenv hoge_env
Using base prefix '/usr'
New python executable in /home/username/Desktop/Python_Projects/hoge_env/bin/python
Installing setuptools, pip, wheel...done.
```

上記のやり方だとデフォルトで使用しているPythonのversionの環境ができる。

versionを指定したい場合は以下のやり方で行う事ができる。

```console
$ ls /usr/bin/ | grep python
python
python-config
python2
python2-config
python2.7
python2.7-config
python3
python3-config
python3.6
python3.6-config
python3.6m
python3.6m-config

$ virtualenv hogehoge --python=/usr/bin/python2.7
Running virtualenv with interpreter /usr/bin/python2.7
New python executable in /home/username/Desktop/Python_Projects/hogehoge/bin/python2.7
Also creating executable in /home/username/Desktop/Python_Projects/hogehoge/bin/python
Installing setuptools, pip, wheel...done.
```
#仮想環境の有効化・無効化
まずは有効化

```console
$ pwd
/home/username/Desktop/Python_Projects/hoge_env
$ source bin/activate
(hoge_env) $ python
Python 3.6.5 (default, Apr 14 2018, 13:17:30) 
[GCC 7.3.1 20180406] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()
(hoge_env) $
```
次に無効化

```console
(hoge_env) $ deactivate
$
```

# 環境の削除
削除は`rm -r`で行う

```console
$ pwd
/home/username/Desktop/Python_Projects
$ ls
hoge_env  hogehoge
$ rm -r hoge*
```