OmniAICreator/Qiita-1.07M huggingface dataset:
URLから指定したURLクエリキーの値を取得する

URLから指定したURLクエリキーの値を取得する実装コード例です。

例） URLのidクエリ値を取得したい
`https://hoge.com?name=shota&id=1234`

```swift
extension URL {
    /// 指定したURLクエリパラメーターの値を取得する
    ///
    /// - Parameter key: URLクエリパラメーターのキー
    /// - Returns: 指定したURLクエリパラメーターの値（存在しない場合はnil）
    func queryValue(for key: String) -> String? {
        let queryItems = URLComponents(string: absoluteString)?.queryItems
        return queryItems?.filter { $0.name == key }.compactMap { $0.value }.first
    }
}
```

```swift
// 利用例
let value = URL(string: "https://hoge.com?name=shota&id=1234")?.queryValue(for: "id")
print(value!) // 1234
```
FactoryBotで複数個を一括で作る

```ruby
create_list(:user, 10)
```

`create_list` に個数を渡すだけ。
神🎉

通常の `create` 同様、引数も渡せます

```ruby
create_list(:user, 10, name: 'hoge')
```

create以外にもbuildも

```ruby
build_list(:user)
```

---

公式ドキュメントが読みやすくて感動
https://devhints.io/factory_bot

FactoryGirlも同様でした
https://www.rubydoc.info/gems/factory_girl/2.2.0/FactoryGirl%2FSyntax%2FMethods:create_list
ERR! 400 Bad Requestでnpm auditに失敗する時の対処法

![tumblr_inline_nhgxxlaHT81qa4tsw.png](https://qiita-image-store.s3.amazonaws.com/0/119598/29ec9b7d-9ae1-d7bc-d5c8-c126ed06959d.png)

npm6系で [`npm audit`](https://docs.npmjs.com/cli/audit) を実行しようとした時に下記のようなステータスコード400のエラーが返ってくることがあります。

```terminal:terminal
npm ERR! code E400
npm ERR! 400 Bad Request - POST https://registry.npmjs.org/-/npm/v1/security/audits
```

- [npm audit returns 400 from registry when non-registry packages satisfy specs that exist in the registry](https://npm.community/t/npm-audit-returns-400-from-registry-when-non-registry-packages-satisfy-specs-that-exist-in-the-registry/462)
- [https://npm.community/t/400s-coming-back-from-registry-on-npm-audit/397](https://npm.community/t/400s-coming-back-from-registry-on-npm-audit/397)

本記事執筆時点での最新バージョン（node@10.14.1(LTS) / npm@6.5.0）でも発生しているこの不具合は、npmコミュニティでもバグ報告されており、Kat Marchánさんも把握していると見られることから将来のアップデートによって解消することが予想されます。が、現時点では厄介な現象になっています。原因としてはnode_modules内の特定のパッケージがプライベート・フォークされたパッケージを参照していることが考えられるようです。

### 一時的な解決法
私の場合は以下のコマンドで再び`npm audit`が実行できるようになりました。

```terminal:terminal
rm package-lock.json && npm i && npm audit fix
```

`package.json`は残して`package-lock.json`だけ消すのがポイント。
誰かの役に立てば幸いです。
Google Cloud Buildの導入

Google Cloud Buildを使い、WEBフロントコードのビルドの自動化を行いましたのでGoogle Cloud Buildの簡単な導入方法について紹介しようと思います。

## Google Cloud Build とは
2018/7/24のサンフランシスコで行われたGoogleのクラウド・カンファレンスでCI/CDプラットフォームとして発表されたGCP上で継続的なビルド、テスト、デプロイを実現するマネージドサービスです。

- 1日あたり120分までのビルド時間が無料（これを超える部分の料金は毎分0.0034ドル）
- 最大10並列処理まで
- もともと Container Builderって名前のサービスだった

今回はWEBフロントのコードをビルドしてGCSに配置するのに使用しています。１ビルド数分で完了するため無料で使用可能です。

## デプロイ要件
- develop、staging、production環境ごとにデプロイ
- 社内で開発した共通コンポーネントをGitHubのprivateレポジトリで管理しているためビルド時に取得が必要

## デプロイ設定
GCPのCloud Buildでトリガーの作成（2018/09/28時点 ベータ版）を行います。このトリガーをGitHubのレポジトリと連携させて、特定のブランチにマージが実行された時に「cloudbuild.yaml」を実行するように設定します。


```cloudbuild.yaml
steps:
# 1 Get rsa and known_hosts files to access to git
- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://*******.com/ssh/gitlab-deploy-key', '/root/.ssh/id_rsa']
  volumes:
  - name: 'ssh'
    path: /root/.ssh
- name: 'gcr.io/cloud-builders/gsutil'
  args: ['cp', 'gs://*******.com/ssh/known_hosts', '/root/.ssh/known_hosts']
  volumes:
  - name: 'ssh'
    path: /root/.ssh
# 2 Set up files to access to git
- name: 'gcr.io/cloud-builders/yarn:node-8.11.0'
  entrypoint: 'bash'
  args:
  - '-c'
  - |
    chmod 600 /root/.ssh/id_rsa
    cat <<EOF >/root/.ssh/config
    Hostname github.com
    IdentityFile /root/.ssh/id_rsa
    EOF
  volumes:
  - name: 'ssh'
    path: /root/.ssh
# 3 Start deploy
- name: 'gcr.io/cloud-builders/yarn:node-8.11.0'
  args: ['install']
  volumes:
  - name: 'ssh'
    path: /root/.ssh
- name: 'gcr.io/cloud-builders/yarn:node-8.11.0'
  args: ['run', 'build:$_REACT_APP_ENV']
- name: 'gcr.io/cloud-builders/gsutil'
  args: ['-m', 'cp', '-r', 'build/*', 'gs://*******.com/']
```

トリガーにはアンダーバーから始まる変数の設定が可能ですので、これを使って環境別のビルドコマンドの切り替えを行なっています。ここでは「_REACT_APP_ENV」という変数を作成しています。

社内共通コンポーネントのprivateレポジトリへアクセスできるようにGCSに鍵を配置しておいてビルド実行時に取得し、その鍵を利用してアクセスできるようにしています。（# 1、# 2 の部分）

鍵の設定が不要であれば「# 3 Start deploy」以下のスクリプトだけ（volumes 部分も不要）で済むので非常にシンプルなファイルでの記述が可能になっています。

## まとめ
今回はシンプルなCloud Buildの導入の紹介をさせていただきました。鍵の管理にはKMSを使った方がシンプルかもしれません。今後はこれにテストも組み込んでいく予定です。

GitHubにCloud Build のアプリを入れることでビルド結果をGitHub上で確認できるようになります。コマンドベースの記述で簡単に構築できますので皆さんもぜひ使ってみてください。
IBMCloudを使って初めてのアプリ構築

初めてIBMCloudを使った際に使用したサイトをまとめたので、これからIBMCloudを使ってアプリの開発を試みている人は是非活用してください！

# **IBM Cloud (旧 Bluemix)**
[IBM Cloudの開始	](http://nikami.org/ibm-cloud-%e7%84%a1%e6%96%99-%e3%82%af%e3%83%a9%e3%82%a6%e3%83%89%e3%81%ab%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e3%82%92%e7%ab%8b%e3%81%a1%e4%b8%8a%e3%81%92%e3%82%8b%e6%96%b9%e6%b3%95/)
まずはここから登録。

[ConversationのTips](https://qiita.com/ishida330/items/ae7277598cd3e08fc3a2)
Watson Conversation APIの様々なTipsが載っています。チャットボット系を作るときは役に立つと思います。

# **Node-RED**
[Node-RED日本ユーザ研究会](https://nodered.jp/docs/)
Node-REDの基本的な使い方は網羅されています。一部、javascriptの書き方にも触れているので、このサイトだけで簡単なアプリに必要な知識は揃うと思います。

[Node-REDの開始](http://dotnsf.blog.jp/archives/1022398342.html)
前半のNode-REDの開始のところはNode-RED開始時の共通手順なので参考になります。

[Node-REDのセキュリティ制限	](https://qiita.com/ymunemasa/items/5ae9629670df40eebe04)
設定しないと誰でも編集できてしまい、せっかく作ったアプリが書き換えられる可能性があります。

[Node-REDのノード	](https://qiita.com/k4h4shi/items/3a9d1d9286555ccdb77a)
各ノードの説明。辞書代わりになります。

[簡単なWebサイトを作ってみる	](https://qiita.com/egplnt/items/e8eeed3432900945c084)
Node-REDで簡単なウェブサイトをコピペだけで作れます。

# **javascript**
[javascript入門](https://qiita.com/akiinu/items/5d1178fa1102b939cd71)
javascriptの基本的な書き方が載っています。node.jsで必要な知識となるjavascriptの知識はそんなに多くないので、このサイトと上記の「Node-RED日本ユーザ研究会」で事足りると思います。（if文やswitch文すらnodeが用意されているので、javascriptでコーディングする必要がありません）

# **その他**
[LINE連携手順](https://simple-it-life.com/2017/08/20/line-bot/)
LINEのmessaging APIを使用してLINE botを作る手順が一通り書いてあります。

[LINE bot作成手順	](https://www.ibm.com/think/jp-ja/business/think-watson-migration/)
LINE botを作る場合、このサイトのstep2は採用すべきです。上記サイトより高度なbotが作成できます。

[Slack bot連携手順](https://qiita.com/KURO-BLACK/items/0cb3fac16c26876e5d00)
Slack botを作成する手順です。このサイトにあるようにnode.jsで実装する場合、パレットからSlack用のnodeをインポートするとかなり楽です。

[Google APIの使用	](https://qiita.com/916/items/621d44615b48ae0dfe9d)
無料で使用できるGoogle APIを使いこなせると一気に作れるアプリの幅は広がります。（一部、機能制限や課金があるものもあるので注意）またこちらのサイトを参考にすればWebアプリが作れます。

[Web APIとは](https://qiita.com/NagaokaKenichi/items/df4c8455ab527aeacf02)
初心者向け。APIが何か書いてあります。

[無料API一覧](https://www.find-job.net/startup/api-2013)
2013年版とかなり古いので一部使用できないものもありますが、無料で使用できるAPIが一覧で載っています。

[地図との連携](https://qiita.com/zuhito/items/2625c85d35f6289f118b)
一瞬で作れる。しかもハイクオリティ。
分散connection poolについて

## なぜconnection pool必要？
- connectionの数が無限ではない、例えば、mysql、Redis、Http serverなどがサポートするMax connectionがある
- リソースを作成するのに時間がかかる。例えば、毎回新しいDB connection、websocketを作成するとパフォーマンス低下になります。

## connection poolの仕組みを紹介する面白い記事
https://wa3.i-3-i.info/word12762.html

## connection poolの活用例
- よく使うのはdatabase connection pool
- web serviceの制限で、同時サポートできるconnection数が限られている場合

## [Generic connection pooling for Ruby](https://github.com/mperham/connection_pool)を調べる
- 特徴: 汎用的に、何でもpoolで管理できる
- connection pool実装するときに押さえるべきポイント
  - lockが必要：複数のところで同時にconnection poolからconnectionを取ったり、戻したりするときに、競合が発生しないように、lockが必要
  - timeoutが必要：connectionの取り出しで、connection poolが使い切った場合、一定の時間を待て、諦める

## なぜ分散connection pool必要？
複数processや、分散サーバで処理を実行するときも、同じpoolを共有することができない

## 解決案を探る
- まず分散処理でも使えるlockが必要で、この[redlock-rb gem](https://github.com/leandromoreira/redlock-rb)を発見
- poolのサイズを管理する必要があるので、redisを使うと分散処理で、同じ情報を参照することができる

## 分散connection poolを実装して見ました
初期版はここ：https://github.com/qiuyin/connection_pool
表のConnectionPoolクラスは基本そのままで、分散queueを追加して、分散connection poolを実現しました。
新規に追加した分散queue: lib/connection_pool/distributed_sized_queue.rb
aitendoの1.8インチTFT液晶モジュール [M018C7735S541]を使用する

aitendoで1.8インチTFT液晶モジュール [M018C7735S541](http://www.aitendo.com/product/16367)を購入しました。
![M018C7735S541](https://www.aitendo.com/data/aitendo/product/20170910_3232de.png)

販売元のサイトには使用実績やサンプルコードも載っていませんが、
・適度なサイズの文字を出すのに使いやすそう
・基板の後ろに印刷されている*ST7735*はメジャーなものらしく、[専用のライブラリ](https://github.com/adafruit/Adafruit-ST7735-Library)も出ているので何とかなりそう
・1000円程度とそれなりに安い
ということで購入してみました。

表示はArduino Unoで試してみました。
ライブラリのダウンロード方法は以下の1,2いずれかで行います。

######１．サイトから直接ダウンロード
1．　[ライブラリのサイト](https://github.com/adafruit/Adafruit-ST7735-Library)から[Download Zip] でダウンロード
![スクリーンショット 2018-12-14 9.34.51.png](https://qiita-image-store.s3.amazonaws.com/0/59911/f2ffe700-d66d-ed1a-9586-506d6da334ad.png)
2.　Arduino IDEのメニューから　
　スケッチ＞ライブラリをインクルード＞.ZIP形式のライブラリをインストール
　でダウンロードしたライブラリを選択してインストール
![スクリーンショット 2018-12-14 9.42.07.png](https://qiita-image-store.s3.amazonaws.com/0/59911/640222a2-74f2-4137-9f27-6a0c05ee2103.png)

######2．ライブラリマネージャーでダウンロード
1.　スケッチ＞ライブラリをインクルード＞ライブラリを管理...でマネージャーを開く
2.　検索窓に[ST7735]と入力し、表示される
　Adafruit ST7735 and ST7789 SPI displaysをインストール
![スクリーンショット 2018-12-14 9.49.21.png](https://qiita-image-store.s3.amazonaws.com/0/59911/c7c4802b-fc63-ea49-ad30-0ee7c3ec76ed.png)



インストールするとスケッチ例が追加されるので
ファイル＞スケッチ例＞Adafruit ST7735 and ST7789 Library＞graphic test
を開く
![スクリーンショット 2018-12-14 9.53.19.png](https://qiita-image-store.s3.amazonaws.com/0/59911/c76b5f0d-f131-dc70-23b0-5553f8f266fc.png)
ファイルをのぞくと

```
For Arduino Uno: MOSI = pin 11 and SCLK = pin 13
  #define TFT_CS        10
  #define TFT_RST        9 // Or set to -1 and connect to Arduino RESET pin
  #define TFT_DC         8
```
とあるので、5V,GNDおよびバックライトのBLEDを接続した上でその通りに接続し...
 **DCがない・・・RESETとRSがある・・・**
![IMG_6182.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/751092fa-b399-183b-009a-87b0968cc479.jpeg)

[Arduinoのサイト](https://www.arduino.cc/en/Reference/TFTConstructor)によると、
cs : int, pin for chip select
***dc : int, pin used for***
rst : int, pin used for reset
forなんだよ。。
[もう少し調べた](https://forum.arduino.cc/index.php?topic=583009.0)ところ、
DC  Data / Command
RS  Register Select
RSTはリセットでRSはレジスターセレクトなのか。。
といった感じで調べながら試行錯誤した結果、

基板-Uno
　5V-5V
　RESET-RESET
　RS-D8
　MOSI-D11
　SCK-D13
　CS-D10
　MISO-D9
　~~SD-~~
　BLED-5V
　GND-GND

の9本の接続で表示することができました。
基板のシルク印刷も間違っているようです。

![IMG_6190.jpg](https://qiita-image-store.s3.amazonaws.com/0/59911/1688bb48-24b2-92b3-240a-53e205a1fbc5.jpeg)

フォントは[色々使える](https://learn.adafruit.com/adafruit-gfx-graphics-library/using-fonts)ようで、

```
#include <Fonts/FreeSans24pt7b.h>

tft.setFont(&FreeSans24pt7b);
```
のように使用します。
カラーは[RGB565の16bit](https://learn.adafruit.com/2-8-tft-touchscreen/graphics-library)なので

```
((r&0x1f)<<11)+((g&0x3f)<<5)+((b&0x1f)<<0))
```
のようになります。
デフォルトの画面向きは縦向きですが、横向きに使いたい場合は

```
tft.setRotation(3); // or 1
```
のように指定します。

消費するピンもそこそこ多く、ライブラリとフォントで８割メモリを使ってしまうので、
![スクリーンショット 2018-12-14 10.45.31.png](https://qiita-image-store.s3.amazonaws.com/0/59911/f23982fd-8c4d-70c2-4442-c9b6eeb60169.png)
パーツとして使い回せるように、これも[I2Cデバイス化](https://qiita.com/ELIXIR/items/69e34b2d068d7ffba9e3)して使っていきたいと思います。
基礎的なGitコマンド

今まではEclipseのeGitでギットを使ってました!
…が、最近コマンドでギットを利用するようになって書こうとー！

# Gitをコマンドで使ってみようー

概念としては
Githubサーバー上に上がっているモノ:リモート
自分のパソコンにあるモノ:ローカル

一旦すでにプロジェクトがあると仮定して自分のローカルにクローンしましょう
対象のgitプロジェクトに入ってclone or downloadをおして
Clone with SSHの方でクローンしてみましょー

```ruby:
git clone [クローンしたいリポジトリ名]　[クローンしたい自分のパソコンのディレクトリ]
```

したら生成されました〜〜わーい　笑

```ruby:
git fetch　
```
フェッチ = リロードみたいな概念で理解できると思います。
リモートリポジトリの更新情報をローカルに持ってきます。


```ruby:
git pull　 origin [リモートのブランチ名]
```
originはリモートを指します！
リモートからコードを引っ張ってくることはpullで行われます。

```ruby:
git status
```
これは今のローカルソースの状態が確認できます。
まだgit管理上にあがってないディレクトリ内のファイルとか、すでにgit管理中のファイルが変更されてるかどうか

```ruby:
git add *
git add [変更したり新しく追加されたファイル名だったり]
```
git statusで確認できたファイルをギットstage状態にあげます。
*　は変更点の赤い文字全部を
下の方は指定したファイルだけをstage状態にあげます。
addするとstatusで赤い文字だったファイルの状態が緑になります。

```ruby:
git commit -m 'コミットの内容'
```
シングルクォーテーションで囲まれている内容はコミットのコメントになります。
commitのコマンドを実行すると緑文字だけがコミットされます　※赤い文字はコミットされません！！


```ruby:
git push　origin [リポジトリ名]
```
originですよねー　ということは、　サーバーにプッシュしますね。サーバーに上がります。
注意点としてはプッシュする前に最新の状態のリポジトリをプルすることですね！
プッシュして競合起きると困りますからね、、

```ruby:
git log
```
今までのコミット履歴の確認ができます。

```ruby:
git reset --soft [logで出た後ろの黄色い文字列]
```
git logがめちゃくちゃになったり、、ま、、いろいろな理由でコミットを戻したい時に使います。
例えばlogに　git説明1,git説明2, git説明3とかのコメントでコミットがい～っぱいになって
ログの確認が見にくくなる可能性があるので、きれいにします。
例えばログが↓こういう状態

```ruby:
log
commit git説明3 sldkfjsdfk
commit git説明2 dksalsdkf234l
commit git説明1 da2349sdlkfjdk
commit 別の説明　ssdfl32948123　
```
この状態で一番下の **別の説明**にもどしましょう。

コマンドは```git reset --soft ssdfl32948123```になりますね。
こうすると今まではコード変更はstageに残ったままgit説明１をコミットする前に戻ります。
なので、git commit でコミットすると

```ruby:
log
commit 新しいgit説明 ksdf9234sldfk
commit 別の説明　ssdfl32948123　
```
となってきれいになります！４行が２行に！

```ruby:
git branch
```
これだと今自分が使ってるローカルのブランチが確認できます。

```ruby:
git diff　ssdfl32948123
```
みたいにすると今の状態との差分の確認ができます。



最近良く使って見たgitコマンドを書きました、、が
自分が理解したのがよく伝わってたのかなーと不安ですが、、:tired_face:
今日はここまで！:santa_tone2:
ExcelVBAの参照設定が開かない場合の対処法

ExcelVBAの参照設定を開こうとしたところ、「システムレジストリへのアクセスでエラーが発生しました」と表示されてしまったので、解決方法をメモ。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/306544/1bb4eec0-2cd5-e578-6dbe-9753e8a5b83a.png)

まず、「Windows」＋「R」で「ファイル名を指定して実行」画面を開きます。
テキストボックスに「regedit」と入力して「OK」ボタンを押下してください。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/306544/7b2217aa-b5c8-04ad-9b76-d7f2ae6afed1.png)

レジストリエディタが開きます。
「HKEY_CLASSES_ROOT\TypeLib\{57A0E746-3863-4D20-A811-950C84F1DB9B}」を右クリックし、「アクセス許可」を選択すると、「{57A0E746-3863-4D20-A811-950C84F1DB9B}のアクセス許可」画面が表示されます。
ここでは権限を追加したいので、「追加」ボタンを押下してください。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/306544/f4358d8e-7886-6343-3fef-4018e852a9f4.png)

「ユーザーまたはグループの選択」画面が表示されるので、テキストボックスに権限を付与したいユーザーの名前を入力してください。
とりあえず「Users」と入力しておけば、すべてのユーザーに権限が付与されます。
入力したユーザー名が不安な場合は、「名前の確認」ボタンを押下すればユーザー名を確認することができます。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/306544/760eae54-0759-06b1-5085-c4a101642089.png)

「OK」ボタンを押下すると、ユーザーが追加されます。
これで権限の付与は完了です。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/306544/1760dcd7-dad5-8f66-ca87-69926582cb30.png)

ExcelVBAの参照設定が開くようになっています。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/306544/d6f150cc-230e-b623-4db9-0aa8f2f2684c.png)
![07.png](https://qiita-image-store.s3.amazonaws.com/0/306544/7fa1f5d2-f542-50f4-0d51-2be5406fdfb3.png)
【An error occurred while installing pg (1.1.3)】について。

#postgresqlインストール失敗(cloud9使用)
 `$rails generate~`

エラー発生!!
#####An error occurred while installing pg (1.1.3)
→ふむふむ。。pgをインストールしれば良いのね。

`$gem install pg -v '1.1.3'`

#####An error occurred while installing pg (1.1.3)

→また同じエラー（○時間悩むw）

#解決策

①`$sudo yum install postgresql postgresql-server postgresql-devel postgresql-contrib`

②`$bundle install`

<b>postgresql</b>がインストールされてない→該当のコマンド（①）見つけるの苦戦。
写経の勧め

#写経の勧め
##なぜこれを書いたか
実は最近プログラムコーディングが増えてきて結構人のプログラミングを見る機会が増えてきたため書いてみました。
##写経をすると良いというのは
うーーーーーん。
何故かというと誰しも簡単にプログラムをかけるわけではないです。
誰かのサンプルコードをまねして覚えることが多いと思います。
自分も実際悩んだ時にGoogleで自分のやりたいことを実際に打って確認します。

ググレカスとはなぜGoogleにヒントがあるのに検索しず会社の開発者の打ったコードを当てにするのということから言われる言葉です。
実際に今調べていることを検索ワードに引っ掛けてみると『C# Dataset』となるわけですが。
その先を打たなくしては最適解のサンプルコードはGoogleでは出てきません。
出そうとして頑張んないといけません。
『C# Dataset Fill』なんて打ってみると欲しいコードが見つかります。
そのまま映しては意味がありません。
まねるのは一部だけあとは自分で努力をします。
そうすることで自分の知識が深まるわけです。
何もせずしてコードをコピペではオリジナリティもなければ重たいといった結果が出てきます。
そういった場合は軽くしたいのでワードをさらに追加して検索していけば自分のコード自体も素晴らしいコードに切り替わります。
そうやって本業のソフトウェアエンジニアは変わっていくわけです。
他者に頼れと言うわけではなく良い所は使って自分なりに書ける部分は自分でコーディングすればいいってことです。

最近、フリーランスと言いながらコードを書かず外に発注する輩も増えてますがそれは自信がないからです。
自信があれば『俺についてこい』と言えるはずですが。
自分は何度かハッカソンのチームリーダーやアイデアソンのメンターをやってきましたが対外自分の側にもっていきたい奴は打ち合わせなどに参加せず突っ走ってしまってから反省するタイプが最近増えてきていると思っています。
プログラムのクラス談議を初心者の目の前でへっちゃらでできるやつは用語に踊らされています。
職業エンジニアはそういう姿を見て実際に開発してみろよと思うわけですが実際にやってみたらできなかった実例って結構多いです。
自分もスマホ育成時代にヘルスケアのアプリを作ろうとして失敗しているのでよくわかります。

調べる能力を上げ真似自分なりにビルドアップこれが本来のエンジニアの姿だと私は思っています。
日本人は恥ずかしがり屋か？

#最初に、あるいは言い訳
　世の中には賢い人がいっぱい居て、おかげで日々技術が進歩しています。
本当にありがたいことです。
　そのような最新技術のお話は他人に任せておいて、今回のテーマはWeb上の行動についての国民性の違いについて書きたいと思います。
「おいおい、技術系のサイトで何かいているんだよ！」
そんなツッコミは正しいのですが、「世界標準のUXを作ったのに、CVRがイマイチ・・・」と悩んでいる方のお役にたてれば幸いです。
#参考にした資料
※**今回利用したデータについては[ここ](https://amadeus.com/en/insights/research-report/journey-of-me)をご覧ください。**
　APACの旅行者のWeb上での傾向を分析したものです。
![publicdomainq-0014242aee.jpg](https://qiita-image-store.s3.amazonaws.com/0/315661/dab18c27-e3cd-b422-115e-0dad4b14cae8.jpeg)
画像はデータ公開元への敬意です。
#何の為に分析するのか？
　私の所属している会社は個人に対してモノを販売しています。（いわゆるBtoC）しかも、顧客のターゲットは全世界！
　そこで問題になってくるのが、**『日本人にとって使いやすいサイトが、他国の人にとって使いやすいのか？』**という問題。
　先に結論から書いてしまいます。
　**『日本人にとって使いやすいサイトは、他国の人にとって使いやすいとは限らない？』**です。
　何故、『使いにくい』と書かないかというと、他国は多数存在していて、意外と日本人と似たメンタリティを持った国もあったりするのです。
#国によってサイトの雰囲気が違ったりするものなの?
　これは、本当に違ってきます。例えば経路検索のサイトを比較すると
　日本代表：[NAVITIME](https://www.navitime.co.jp)
　オーストラリア代表：[Roma2Rio](https://www.rome2rio.com/)
　...全然ちがいますよね。
　どちらのサイトも利用者の特性に合わせて作られているはずなのに、完成品がまるで違ってきています。
#日本と海外のサイトを比べてみると
　日本代表：[H.I.S](https://www.his-j.com/Default.aspx)
　アメリカ代表：[agoda](https://www.agoda.com/)
　一番の違いはファーストビューの情報量。文字の数からして全然違います。
因みに、お隣韓国は：[ハナツアー](http://www.hanatour.com/)
　ちょうど中間みたいな感じですか。何が書いてあるか読めませんが
この様なサイトをぼんやり眺めていると明らかになる日本のサイトの特徴があります。
##日本のサイトの特徴をあげると

- ファーストビューの情報量が多い
- 検索項目が詳細
- 口コミやお勧めの情報が多い

#日本人を他の国と比べてみると
話は変わって、分析データから見える日本人の特徴です
####日本人は秘密主義？

- 個人情報を入力することに躊躇する日本人は69%
- 個人情報を入力することに抵抗がある人の割合はAPAC圏内の平均が36%
- 最も開放的なのがインドネシア人の20%
- 比較的日本人に似ているのがオーストラリア人の62%

　　⇒これだけで、日本人向けのサイトの場合、入力欄が多いことが購入の妨げになることがわかりますね。
####日本人はPC好き？

- APAC圏内の平均的な旅行の検索/予約でスマホやタブレットの利用率は54%(検索)/46%(予約)
- それに対し日本人は30%(検索)/23%(予約)
- もっと顕著なのがオーストラリア人で33%(検索)/20%(予約)
- 逆にスマホ利用率が最も高いのがインドネシアと中国。割合はほぼ100%

　　⇒ちなみに弊社、Skyticketでのスマホの申込割合はもっと高いです。比較的安価な国内線の申込みが主力であることが原因かもしれません。
　　⇒インドネシアや中国はPC保有数とスマホ保有数の差が顕著に表れていますね。
####旅行に重要なのは何？
旅行商品で何を重要視するかについて尋ねたところ、

- APAC全体では『金額の安さ』(37%)でした。
- それに対し日本人が重要視するのは『快適さ』(43%)
- オーストラリア『金額の安さ』(44%)
- 中国『豪華さと安全』
- シンガポール『旅程の立てやすさ』(40%)

　　⇒『金額の安さ』が重要というのは、それだけ旅行が一般的だという事が言えますね。
　　　中国の『豪華さと安全』が上位に来るというのは、それだけ旅行というものが特権的なものであると思われます。
####旅行の情報はどうやって手に入れる？
- 日本人の旅行情報の収集方法はSNS(48%)と旅行レビューサイト(47%)。
- 中国、彼らは旅行会社(Ctrip、Tuniuなど)のお勧めに従う事が多いようです(62%)
- 韓国人は『身近な仲間の情報』(48%)

　　⇒日本の旅行サイトにレビューと観光情報があふれているのには理由があるようです。

#もう一つの観点
　日本のサイトが情報量が多くてレビューにあふれている理由については納得いただけたかと思います。
　でも、これだと英語圏のサイトがシンプルな構造になっている理由がわからないです。

その答えとして私が有力視しているのが言語特性です。
例えば、あなたが日本語ネイティブだとした場合[このサイト](http://www.hanatour.com/)でチケット予約をできますか？
私はできません。だって、何が書いてあるかわからないから。
でも[このサイト](https://www.skyscanner.com/)なら頑張る事が出来そうです。
その理由は

- 英語だから少しは理解できる
- 情報量が少ないから頑張れる

英語サイトは英語ネイティブでない利用者も利用するのです。なのでエントリーレベルの英語力でも利用可能なサイト作りが重要になってくるのです。
逆に、日本語や韓国語、アラビア語などネイティブ以外の利用者が少ないサイトは情報量をいかに盛り込めるかが重要になります。
スマホなどの画面サイズの制限の大きい端末が主流になるにつれ、このジレンマに苦しめられるWebデザイナー達が増える事でしょう。

#
Amazon ECSに任せて見えてきたDockerのエッセンス

本記事は[Docker Advent Calendar 2019](https://qiita.com/advent-calendar/2018/docker)の13日目の記事になります。

## TL;DR
- Webサービスの運用をECSに全て任せる環境にしてみた
- したらいろいろ問題と発見がでてきた話
- 構築ノウハウではありません
- Kubernetesはまだちょっと敷居が高いかも…という方にちょうどいいかも

## まえがき

通常、WebサービスをDockerで運用する場合で、AWS環境にデプロイするとしたら選択肢は

- EC2にDockerホストさせる
- ECS
- Elastic Beanstalk

もしくはリージョンにこだわらなければ

- EKS

になるかと思います。

せっかくDockerというシンプルな仮想環境を扱うので、マネージド感が強いEBより、dockerコマンドで動くことが直感的に描きやすいECSを使うことにしました。
が、使ってみるとECSもまぁまぁ独自性が強い（後述します）

## 基本構成
- CIサービスを用いてアプリケーションのビルド、アプリケーションが乗っかるDockerイメージのビルド、ECRへのpushを行う
- 最後の部分のPull（ECS ← ECR）とECSのサービスアップデートは手動でもいいけど、Githubでオペレーション全て完結したいのであればそのままCIサービスに任せるのがよいでしょう
- ステージングか本番か環境によってレジストリを変えるという手もあるが、せっかくステージングで動作保証ができているイメージが有るのであれば、それをそのまま本番へPullするのが素直で余計なビルドの手間も省ける

*赤破線枠の中がECS（簡略化のためにMulti-AZやサブネットは省略しています）*
![ECS Architecture Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/19203/7ee139ee-8eb1-f0d3-79fe-f5baba0712fa.png)


## ECSの独自性
ECSが扱う単位には

- クラスター
- サービス
- タスク

があり、さらにその中に複雑な定義箇所があります。それらがECSの理解の最初のハードルかと思います。

例えば、EC2にDokcerをホストする環境をつくり、イメージをPullして動かすにしても何かしらエージェントは必要でしょう。
仮に複数イメージを同時に起動し相互に連携させたいとなると

- グループ単位（docker-compose相当）でコンテナを管理するエージェントも必要で、それがECSでいうService
- 「個別のイメージ（プラスdocker runオプション）」がECSサービスの中で定義されるTask Definition

と個人的に定義しています。

そして、ECSクラスターは複数のEC2インスタンスと複数のServiceが多対多で関係しあって存在する状態も管理する。

## Fargate
さらにFargateというサービスの誕生のおかげでEC2を意識することなく、「複数のServiceの中の複数のタスク」の管理だけでよくなりました。ホスティングの実体を意識しないで良いというのはある意味不安もありますが、無数のマイクロサービスの運用していくという点で考えるとこれは大きい。

速度や料金の問題から、フルスタックなWebサービスをFargateだけで賄うのはまだ先になりそうですが、Fargateで済んでしまうものは全てこちらに寄せたいと思わせるだけの力があります。

## カナリーデプロイ
タスクを気軽にデプロイできる一番のポイント
ポートを分けて自分たちだけで本番で検証したり何かあったときの影響を少なくできるのが心強い

## 本題
ようやくかよ❗という感じですが上記のECS運用を踏まえ、ここからが本題になります。
### コンテナ管理がベースになると小さくしたい欲が出てくる
- 本当に常駐しておかなければならないプロセス（コンテナ）はなんだ
- バックアップ処理や即時性不要な非同期ジョブは全て別コンテナに切り出せる
- コンテナのPortabilityがそのまま再利用性に繋がる

そしてそれらの効用として

### マイクロサービスの粒度がつかめる
基本的にECSタスクで分割できるということはそういうこと
とにかく、アプリ間の依存がないというのは素晴らしい

### リソースを意識せざるをえない
Fargateの「EC2を意識しないでよい」点とは矛盾するようだが、インスタンスリソースはよしなにやってくれるという信頼があると逆説的に落とせるコンテナは落としたくなるため、リソースやコスト意識が勝手に高まる。イメージの軽量化や分割の技術が、増え続ける世の中のコンピューティングリソースの問題に対して大きな意味をもつようになってくると感じます。

## あとから気づく課題
### レジストリのグルーピングをちゃんとしたい
最初から名前空間/ で計画的に切っておけばよかった

### ECSサービスのグルーピング、名前付け重要
上のレジストリもそうだが、ECSサービス名やタスク名など、あとから変更するとなるとなかなか手間がかかる

### タスクを増やすのは気軽にできるが
そのためにcloudformationのテンプレートを毎度書くのはなかなか手間だしALBのターゲットグループへの依存が増えるのが少し気になる。

## まとめ
総合的なコストは他の運用方法とさほど変わらず、それでいて得られる知見が多いです。
開発環境はDockerだけど、本番ではやったことのないSREの方などにはおすすめします:nerd:
IE11で:hoverの挙動がおかしい件 (色が戻らない)

## なにがおきているか

以下のHTMLファイルをIE11で開き、ボタンを押下する。

```html:hover.html
<html>
<head>
<style>
.hoge:hover {
}
</style>
</head>
<body>
<input type="button" value="click">
<button>click</button>
</body>
</html>
```
すると、以下のように他の場所をクリックするまで色が戻らない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/27443/cfb951f2-4c59-ef2b-c44f-7d0a327c6b44.png)

## 発生条件

1. IEのドキュメントモードが8以上
2. Windows 10 / Windows7でAeroテーマあるいはWindows7ベーシックテーマ利用時

## 再現した環境

* Windows 10 Pro 1709 / IE 11.492.16299.0 (更新バージョン: 11.0.70)
* Windows 10 Pro 1709 / IE 11.371.16299.0 (更新バージョン: 11.0.60)
* Windows 7 Professional SP1 / IE 11.0.9600.18638 (更新バージョン: 11.0.41)
* Windows 7 Enterprise SP1 / IE 11.0.9600.18860 (更新バージョン: 11.0.49)
* Windows Server 2012 R2 / IE 11.0.9600.19180 (更新バージョン: 11.0.95)
* Windows 8.1 Enterprise / IE 11.0.9600.18894 (更新バージョン: 11.0.50)
* Windows 10 Enterprise 1803 / IE 11.1.17134.0 (更新バージョン: 11.0.47)
* Windows 10 Pro 1809 / IE 11.194.17763.0 (更新バージョン: 11.0.100)

## 暫定対処

以下のように関係のないプロパティで:hoverを設定しておけばとりあえずは回避可能。
あるいは、:hoverの定義自体をすべて削除すれば回避可能。

```html:hover_fixed.html
<html>
<head>
<style>
input:hover, button:hover {
  hoge: none;
}
</style>
</head>
<body>
<input type="button" value="click">
<button>click</button>
</body>
</html>
```

## いつから発生しているのか

不明。さすがに昔からこんな現象であれば気づいていると思うが…。
ネットでの類似情報はまだ見つけられていません。
何か情報をお持ちの方がいれば、情報共有頂けると幸いです。

とりあえず、[Microsoftフォーラム](https://social.technet.microsoft.com/Forums/ja-JP/e437ab8e-eb00-422e-9aa5-436890fa2d94/ie1112391hover12398333941236425147124251239412356?forum=internetexplorerja)には投稿してみました。（これが正解なのかよくわかりませんが…）

~~もしかして、Windows10 1809だと発生しない？(未確認)~~
→ 1809でもダメでした。
Nullオブジェクトを使ってnil値のチェックをなくす方法

# はじめに
こんにちは！ みんなのウェディングのエンジニア@kiyokuroです。 この記事はくふうカンパニーアドベントカレンダーの15日目になります。

今回はNullオブジェクトを使ってnil値のチェックを省略した実装について書きたいと思います。

例えば、必ずしもログインを要求しないアプリケーションでは、ユーザが存在しない(nil)こともしばしばあると思います。ユーザが存在しない時は何も表示しないのであれば問題ないですが、「名無しのユーザ」と言ったユーザが存在しないときには決まった値を表示する要件もあると思います。
そんなオブジェクトの存在性によって仕様がある時の対処方法を説明します。

#Nullオブジェクトとは
オブジェクトのフィールドへの問い合わせ時にnilチェックを行い、クライアントがフィールドに問い合わせる時にnilが含まれることを意識しなくて済むようにするためのパターンです。

# 使用例
今回の仕様は以下のものとします。
- ログインしていたらユーザ名とユーザのIDを表示する
- ログインしていなかったら「名無しのユーザ」と言う名前とブラウザーIDを表示する

## Nullオブジェクトを使わないとき
nilチェックをすると次のようになると思います。
例えばviewでユーザ名とIDを表示する時。

```ruby
- if @user
  = @user.name     -# => kiyokuro
  = @user.user_id  -# => 1234
- else
  名無しのユーザ
  @browser_id      -# => 1234567890
```
このようにcurrent_userのフィールドにnilを許容しているものが多いと、表示処理の度にnilチェックが必要になりコード量が増え複雑になっていきます。

## Nullオブジェクトを使う
そこでNullオブジェクトを使います。
まずはuserがnilの時のNullユーザオブジェクトとしてNullUserを作ります。
Userクラスを継承置き換えるフィールド以外はUserクラスとして振る舞うようにします。

```ruby
class NullUser < User
  def id
    browser_id
  end

  def name
    "名無しのユーザ"
  end
end
```
次にUserクラスにNullUserオブジェクトを生成するファクトリメソッドを追加します。
そしてUserがnilであればNullUserを返すようにします。

```Ruby
class User < ApplicationRecord
  def self.find(id)
    find_by(id: id) || null_user
  end

　　 private

    def self.null_user
      NullUser.new
    end
end
```
これで検索したUserが存在すればUserを返し、存在しなければNullUserを返すようになりました。

```ruby
User.find(1) #存在するUserのID
=> #<User:
id: 1,
name: "kiyokuro">

User.find(2) #存在しないUserのID
-> #<User:
id: 1234567890
name: "名無しのユーザ">
```
クライアントのリクエストに対してUserの存在性に関係なく値を返せるようになったので、viewやmodelで条件記述を省くことができるようになりました。
上記の例では`find`メソッドで`ActiveRecord::RecordNotFound`の例外が発生しなくなるため、アプリケーション内のクライアントでは上記の仕様を適用する場合でないと使用できません。

## 全てのクライアントが同じ返答を期待しないとき
Userが存在するか否かで別の振る舞いを期待するクライアントがある時は、ユーザがUserクラスであるかNullUserであるか判定できるようにします。
UserクラスとNullUserクラスにis_nil?メソッドを実装してUserクラスであれば`false`、NullUserクラスであれば`true`を返すようにします。

```Ruby
class User < ApplicationRecord
  def is_nil?
    false
  end

  def self.find(id)
    find_by(id: id) || null_user
  end

　　 private

    def self.null_user
      NullUser.new
    end
end
```

```Ruby
class NullUser < User
  def is_nil?
    true
  end

  def id
    browser_id
  end

  def name
    "名無しのユーザ"
  end
end
```
これでUserの存在性を判定して処理を追加できます。

```Ruby
if @user.is_nil?
  # 会員登録ページにリダイレクト
else
  # マイページにリダイレクト
end
```

# 最後に
いつでもどこでも使える便利な方法という訳ではありませんが、viewやモデルで存在性判定の条件記述が増えてきた時には利用できないか検討できるのではないかと思います。

## 参考書籍
新装版　リファクタリング　既存のコードを安全に改善する
https://www.amazon.co.jp/dp/B01IGW5MG0/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

## 明日は
[くふうカンパニーアドベントカレンダー](https://qiita.com/advent-calendar/2018/kufu)15日目は[KotaSakurai](https://sakurawi.hateblo.jp/)さんです
SageMakerのノートブックでPipenvを使う

## はじめに
こんにちは。
ニッチな需要だと認識していますがタイトルの通り書かせていただきます。
Amazon SageMakerのノートブックインスタンスでは最初からDockerが使えたりawscliが使えたり、tensorflowやmx-netなどが入ったカーネルを選択したり特に環境構築を行わずともそれなり使える環境が簡単に用意することができ便利です。一応jupter notebookのcondaタブで環境を編集することはできますが少し面倒です。今回はプロジェクトの環境管理をPipenvを用いていたこともあり、どうにかPipenv環境をそのままノートブックインスタンスで使うことができないか考えてみました。

## ノートブックインスタンス関連の機能紹介
SageMakerはいくつかの機能のあつまりで構成されているのですが、全部使う必要はなく個別につかうことができます。
大別してノートブック機能、トレーニング機能、推論機能です。
今回はSageMakerのノートブック機能の簡単な説明を行います。
![スクリーンショット 2018-12-04 11.36.00.png](https://qiita-image-store.s3.amazonaws.com/0/287793/d30d543f-b595-ed6f-1bfa-0da588be9f09.png)

### ノートブックインスタンス
SageMakerの目玉機能？の一つです。
ある程度設定された**jupyter notebook(lab)が簡単に使えるのが最大の魅力**です。
これ単体でも機能します。インスタンスなので当然マシンパワーを設定でき後からでも自由に強さを変更できます。
ただ、`/home/ec2-user/SageMaker`以外の場所はインスタンス再起動時にリセットされるので注意しなければいけません。

### ライフサイクル
ノートブックインスタンスの最初の構築時または起動時に実行するスクリプトを記述でき任意のノートブックに紐付けることができる機能です。今回はこれを使って`/home/ec2-user/SageMaker`内のPipenvfileから作られる環境をインスタンスに元から入っているjupyterにカーネルとして追加します。

### Git リポジトリ
2018年11月28日に追加された新たな機能です。
Gitリポジトリを指定しておき、これと紐付けたノートブックインスタンスにリポジトリをクローンします。
httpだけでsshを使ったクローンはできないようです。すこし試してみたところ同一VPC内のgitlabに対しても使うことができましたが、「別にインスタンス内で手動でクローンすればよくない？」みたいな感じです。シークレットマネージャと連動してuser名とpassを管理するのでその辺の入力手間が省けるくらい？
今回は関係ない機能です。

## 設定
ライフサイクルの「ノートブックの開始」に以下を書いて、

```sh
#!/bin/bash

set -e

sudo -u ec2-user sh << EOS
pip install --upgrade 
export PIPENV_VENV_IN_PROJECT="42"
cd /home/ec2-user/SageMaker
/home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/pip install pipenv
/home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/pipenv install -d ipykernel
/home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/pipenv run ipython kernel install --user --name=pipenv
EOS
```

ノートブックインスタンスに紐づけるだけです。
![コメント 2018-12-17 203709.jpg](https://qiita-image-store.s3.amazonaws.com/0/287793/7ddab8ef-264b-2e28-a697-ffd16426028f.jpeg)

ただしく、設定できると以下のようにたくさんの既存カーネルに紛れて、先ほど設定したpipenvカーネルが追加された状態で起動します
![コメント 2018-12-17 210811.jpg](https://qiita-image-store.s3.amazonaws.com/0/287793/dd13dd77-8230-a9b4-bf7f-71a4934bb506.jpeg)


### 説明
* ライフサイクルはrootユーザで実行されるが普通にノートブックを使う場合はec2-userなためuserを指定して実行します
* PIPENV_VENV_IN_PROJECTの環境変数を設定するとpipenv環境(.venv)がプロジェクトディレクトリに生成されるようになり、次回起動時起動が早くなる気がする
terminalで確認すると.venvが使われていることがわかります。
![コメント 2018-12-17 211240.jpg](https://qiita-image-store.s3.amazonaws.com/0/287793/c416ee1f-46ed-8051-7b45-42fc3bdd8188.jpeg)
* あとはノートブックに`~/SageMaker`の環境を追加しています

## 感想
（コピペするだけなはずなのに私用PCがwindowsを使っていたためライフサイクルをコピペすると改行コードの違いでスクリプトが動かず少々困りました。）
決まったものしか使えないのかと思いきやカスタマイズする余地が残されてて、頑張ればなんとでもなるのはよいと思いました。SageMakerのノートブックインスタンスは機械学習用途となっていますが全然他のことに使えそうです。機械学習用途に関しても始めるならこれ以上ないくらいに十分な環境であり、その上サンプルもたくさん用意されているので勉強にもなりそうです。
最後に、いるのかわかりませんが同じことがしたい人の役に立てれば幸いでした。
GTK+3でCSSを適用する

せしまるです。

GTKのボタンを角丸にしたい、ボックスに枠をつけたいなど、見た目を変更したいときはCSSを使います。
CSSの書き方はWeb開発の時とあまり変わりません。

以下にCSSとコードからCSSを読み込む処理を記載します。

```css:test.css
// 特定のウィジェットに適用するとき.
GtkLabel{
    color:red;
}

// 特定のウィジェットの特定の状態の時
// 今回はトグルボタンが押されている時
GtkToggleButton:checked{
    background-image:none;
    background-color:red;
}

// ウィジェットにクラスを指定した場合は、クラス名で指定できる.
.button_a{
    color:white;
}

.button_b{
    border:2px solid #000000;
    border-radius:10px;
    font-size:15px;
}
```

```c++:reader.cpp
void LoadCss(){
    // CSS読み込む際に必要です.
    GtkCssProvider* provider = gtk_css_provider_new();
    GError* error;

    // CSSファイルの読み込み.
    gtk_css_provider_load_from_path(provider, ここにファイルパスを記述, &error);

    if( error != NULL ){
        // 読み込み失敗.
        return;
    }

    // 読み込んだCSSの適用
    gtk_style_context_add_provider_for_screen(gdk_screen_get_default(), GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_USER);
}
```

このCSSを適用した場合、見た目は以下のようになります（ボタンだけ）
左が「.button_a」右が「.button_b」を適用しています。
![2018-12-14_10h21_19.png](https://qiita-image-store.s3.amazonaws.com/0/284493/36ce5edd-c93d-b8dd-cb42-359f5afff1b5.png)

このような感じでウィジェットの見た目を変更することができます（白にするんじゃなかった）。
心理的安全性の基本中の基本。ミッション・コミュニケーション量を確保せよ！


# 心理的安全性をどうやって作るか？

- 人と話すこと。雑談すること。以上。
- 時間は1回あたり10秒で良い。1秒でも。
- たくさんの専門知識はすべて「コミュニケーション量」の上に成り立つ気がした。
- 人は常にメッセージを発信しあう生き物だから。全てのテクニックは基本がないと成り立たない。

# 参考文献

- サピエンス全史
- プレゼン関係の本
- GO WILD 人間社会が村であることに関して


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/515481f4-f9e8-cd78-2f57-46f57c099be8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/273ccd99-a973-89a2-e8af-297bd4dbc42f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4cd57337-b738-fd24-f054-c1f9fa7de48a.png)


# link

[心理的安全性ガイドライン（あるいは権威勾配に関する一考察） - Qiita](https://qiita.com/hirokidaichi/items/5d8c4294083d85654a04#%E5%B9%B4%E9%BD%A2%E5%B7%AE)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
bitbucketからgithubにプッシュ先を変更する

#12/13 bitbucketからgithubにプッシュ先を変更する

bitbucketを使っていたが、githubに変えたかったのでメモ。

初めてgitのリポジトリにpushする時は、先にssh-keyの設定が必要です。

例えば、railsチュートリアルでずっとbitbucketを使っていたが、githubに変えたい時など。

（githubにアカウント登録済である前提で進めます）

まずgithubログイン後、右上のアカウントメニューから、***your repository→clone or download***でプッシュしたいリポジトリのURLを確認

```
(ssh接続のURL)
git@github.com:xxxxxxxxxアカウント名/リポジトリ名.git
```

プッシュ先を変更する前に、現在のプッシュ先を確認

```
git remote -v
```

その後以下のコマンドを入力

```
git remote set-url origin gitのリポジトリURL
```

もし初回でremoteを追加する必要があればadd
```
git remote add origin gitのリポジトリURL
```

その後pushするも、まだSSH接続出来ていないとのエラーが出ます。

```
The authenticity of host 'github.com ('000,444,612,113)' can't be established.
RSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
RSA key fingerprint is MD5:1111111111111111111111111111111111111
Are you sure you want to continue connecting (yes/no)?←ここはyesと入力
```
まずSSH接続の設定をするため、ターミナルでsshキーを表示するコマンドを入力。

```
cat ~/.ssh/id_rsa.pub
```

以下のように表示されるので、メールアドレス以外を全てコピーし、gitのsshキーを設定する。

```
ssh-rsa
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkkkkkoooihuihoafoihaounofijpihjoifehkjonnoiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhhsssssssssssssssskkkkkkkdddddddddddddddkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
```

もし表示されなければ、以下のコマンドで新しくsshキーを作成します。

```
ssh-keygen
```

その後、公開鍵を表示します。

```
cat ~/.ssh/id_rsa.pub
```

sshキーの設定場所は、
githubログイン後、***右上のsetting→ssh and gpg key→new ssh keyを選択***

コピーした公開鍵を貼り付けし、ADDsshkeyを押すと公開鍵が追加される。

最後に、ターミナルで以下のコマンドを打ち、ssh接続出来ているか確認する。

```
ssh -T git@github.com
```

下記のメッセージが表示されればSSH接続完了です！

```
Hi 〇〇〇アカウント名 You've successfully authenticated, but GitHub does not provide shell access.
```

もう一度

```
git push origin master
```

でgitのリポジトリにプッシュ出来ました！

もし、

```
git push origin master
error: src refspec master does not match any.
error: failed to push some refs to 'git@github.com
https://qiita.com/tesoro/items/af4a80b7ebb9ad34e5fd
```
というエラーが出たらmasterブランチがないということなので、

```
git init
git add -A
git commit -m "First commit"
git push origin master
```
でpush出来ました！

(参考１)[https://qiita.com/muneo/items/1321bf8cdb21178a73e2]

(参考2)[https://qiita.com/tesoro/items/af4a80b7ebb9ad34e5fd]
raspberry pi 1でtensorflow lite その8

#概要

raspberry pi 1でtensorflow liteやってみた。
tfliteファイルを作ってみた。
kerasモデルから作ってみた。
データセットは、sin.

#環境
tensorflow 1.12

#データセットを作る。


```
import numpy as np 

x = np.linspace(-3.3, 3.4, 40)
y = np.sin(x)
data = np.c_[x, y]
np.savetxt('sin.csv', data, delimiter = ',', header = "x,y")
print ("ok")
```

#kerasモデルを学習してセーブする。


```
import numpy as np 
from tensorflow.contrib.keras.api.keras.models import Sequential
from tensorflow.contrib.keras.api.keras.layers import Dense, Activation
from tensorflow.contrib.keras.api.keras.optimizers import SGD, Adam
import matplotlib.pyplot as plt

data = np.loadtxt('sin.csv', delimiter = ',', unpack = True)
x = data[0]
y = data[1]
model = Sequential()
model.add(Dense(30, input_shape = (1, )))
model.add(Activation('sigmoid'))
model.add(Dense(40))
model.add(Activation('sigmoid'))
model.add(Dense(1))
sgd = Adam(lr = 0.1)
model.compile(loss = 'mean_squared_error', optimizer = sgd)
model.fit(x, y, epochs = 1000, batch_size = 20, verbose = 0)
print ('save model')
model.save('sin_model.h5')
predictions = model.predict(x)
print (np.mean(np.square(predictions - y)))
preds = model.predict(x)
plt.plot(x, y, 'b', x, preds, 'r--')
plt.show()
```

#kerasファイルからtfliteファイルを作る。


```
import tensorflow as tf
import tensorflow.contrib.lite as lite

converter = lite.TFLiteConverter.from_keras_model_file("sin_model.h5")
tflite_model = converter.convert()
open("sin_model.tflite", "wb").write(tflite_model)
print ("ok")
```

#tfliteファイルを検証する。


```
import numpy as np
import tensorflow as tf
import tensorflow.contrib.lite as lite
import matplotlib.pyplot as plt

data = np.loadtxt('sin.csv', delimiter = ',', unpack = True)
x = data[0]
y = data[1]
interpreter = lite.Interpreter(model_path = "sin_model.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
input_shape = input_details[0]['shape']
pred = []
for i in x:
  input_data = np.array([[i]], dtype = np.float32)
  interpreter.set_tensor(input_details[0]['index'], input_data)
  interpreter.invoke()
  output_data = interpreter.get_tensor(output_details[0]['index'])
  pred.append(output_data[0][0])
plt.plot(x, y, 'g', x, pred, 'r--')
plt.show()

```
![sin.png](https://qiita-image-store.s3.amazonaws.com/0/18104/2546a4b0-921e-ba22-d03b-23ad3c7c5b8a.png)

以上。
LaravelのPivotモデルを使い中間テーブルから関係を取得する

# この記事について

[Laravel Advent Calendar 2018 - Qiita](https://qiita.com/advent-calendar/2018/laravel) の14日目の記事です。

本記事ではコードは要点となる部分しか記述していないので、他の箇所も見たいという方はGitHubに公開したサンプル [GitHub - kkznch/laravel_pivot_example](https://github.com/kkznch/laravel_pivot_example) を参照してください。


# はじめに

## 概要

多対多リレーションを操作するための中間テーブルに三つ以上の関係を持たせた際に、pivot属性から関係先にどうやってアクセスするかについて書いていきます。

## 環境

- PHP 7.2.4
- Laravel 5.7.16


# やりたいこと

テーブル構成が以下のようにあるとする。

![20181214_LaravelAdventCalendar_ER図.png](https://qiita-image-store.s3.amazonaws.com/0/9284/e7a21157-8d84-67f6-752d-4b241bc18a03.png)

上記のテーブル構成において、あるユーザが複数のグループに所属しているとき、それらのグループでそのユーザに割り振られているロールを以下のように取得したい。

```php
$user->groups()->find(1)->pivot->role
```


# 実装手順

## 1. マイグレーションファイルを作成する

前述したテーブル構成通り `id`, `name` カラムを持つ users, groups, roles テーブルをそれぞれ定義する。

同様に `user_id`, `group_id`, `role_id` を持つ中間テーブル user_group テーブルを定義する。これらのカラムは users, groups, roles テーブルを参照する外部キーとする。

## 2. Group, Role モデルクラスを作成する

`php artisan make:model` コマンドで Group, Role モデルクラスをそれぞれ作成する。
なお、Group, Role モデルクラスの中身は空のままでよい。

## 3. UserRole Pivotクラスを作成する

以下のように UserRole Pivotクラスを作成する。

```php:UserRole.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Relations\Pivot;

class UserGroup extends Pivot
{
    protected $table = 'user_group';

    public function role()
    {
        return $this->belongsTo(Role::class);
    }
}
```

継承しているのはModelクラスではなく、**Pivot**クラスなので注意すること。

## 4. User モデルクラスを作成する

ここが肝になる部分。
`php artisan make:model` コマンドで User モデルクラスを作成し、以下のように編集する。

```php:User.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $fillable = ['name'];

    public function groups()
    {
        return $this
            ->belongsToMany(Group::class, 'user_group')
            ->using(UserGroup::class)->withPivot(['role_id']);
    }
}
```

`using()` で先程指定した中間テーブルのカスタムモデルとなるPivotクラスを指定し、 `withPivot()` でpivot属性を介して中間テーブルの指定した要素へのアクセスを可能にする。


# 使い方

`php artisan tinker` を起動して以下を実行してみる。

```php
>>> $user = User::find(1)
>>> $user->groups()->find(1)
=> App\Group {
     id: 1,
     name: "グループ１",
     created_at: "2018-12-09 01:18:03",
     updated_at: "2018-12-09 01:18:03",
     pivot: App\UserGroup {#2894
       user_id: 1,
       group_id: 1,
       role_id: 1,
     },
   }

>>> $user->groups()->find(1)->pivot->role
=> App\Role {
     id: 1,
     name: "ロール１",
     created_at: "2018-12-09 01:18:03",
     updated_at: "2018-12-09 01:18:03",
   }
```

`$user->groups()->find(1)` を実行した段階ではpivot属性には `user_id`, `group_id`, `role_id` が含まれていることが分かる。

この状態で `$user->groups()->find(1)->pivot->role` を実行すると、User モデルクラスで定義した `groups()` から特定のグループに関する関係を取得し、更にpivot属性を介して UserRole Pivotクラスで定義した `role()` からロールに関する関係を取得できる。


# おわりに

以前からQiitaに登録はしていたものの投稿はしていなかったため、今回が初の投稿となりました。
いつもは人が書いた記事を遠目で見て参考にしているだけでしたが、書いてみるのも割といいものだなと思いました。

記事中の実装や考え方について、間違っている or 他に良い方法などがあれば教えていただければ幸いです。


# 参考文献

- [Eloquent：リレーション 5.7 Laravel](https://readouble.com/laravel/5.7/ja/eloquent-relationships.html)
- [[メモ][Laravel]Pivotモデルについて一瞬つまづいたポイントメモ - Qiita](https://qiita.com/yosida001/items/f0cc896df6a67b3ed8bc)
メモ > npm install -g gh-pages




yarn build としたら、ビルド結果に以下のように表示された。

```
The project was built assuming it is hosted at the server root.
You can control this with the homepage field in your package.json.
For example, add this to build it for GitHub Pages:

  "homepage" : "http://myname.github.io/myapp",

The build folder is ready to be deployed.
You may serve it with a static server:

  yarn global add serve
  serve -s build

Find out more about deployment here:

  http://bit.ly/2vY88Kr
```

package.json に以下を追加した。

```js
"homepage" : "http://username.github.io/myapp",
```

次のビルドではさらにアドバイスが

```shell-session
  yarn add --dev gh-pages

Add the following script in your package.json.

    // ...
    "scripts": {
      // ...
      "predeploy": "npm run build",
      "deploy": "gh-pages -d build"
    }

Then run:
  yarn run deploy

Find out more about deployment here:
  http://bit.ly/2vY88Kr
```
  
  
というわけでpackage.jsonに以下を追加
```
"predeploy": "npm run build",
"deploy": "gh-pages -d dist"
```

※dist はビルドした結果が作成されるフォルダ名



## gh-pagesコマンド

gh-pages コマンドが入ってなかったのでインストールする。

```shell-session
npm install -g gh-pages
```

deploy

```shell-session
yarn deploy
```
メモ > MSTest







[MSTestでprivateメソッドをテストする – 山本隆の開発日誌](https://www.gesource.jp/weblog/?p=7742)


[C# - リフレクションで非同期のプライベートメソッドを呼び出したい｜teratail](https://teratail.com/questions/80652)


[C# - statcクラスのprivateメソッドのテストを実施したい｜teratail](https://teratail.com/questions/28151)
Macでphpの環境開発をしよう【MANP】


WEBサーバーの動作環境では、LANP（Linux,Apache,MySQL,PHP)が有名です。
しかしいきなりLinuxを始めるのは敷居が高い‥。初心者には馴染みにくい設定も多く存在します。
そこで初心者にオススメな開発環境であるMANPのインストール方法について紹介していきます。

Macで開発環境をするには、WEBサーバー,PHP,データベースのソフトウェアが必要です。

<h4>インストールしよう

MAMP環境を作る方法は大きく3つの方法があります。特にMAMP環境が一括でインストールできるものは、構築する手間を省くことができます。
PHPプログラミングに集中することができるため初心者はまず以下の方法でインストールしてみましょう。

【MANP】は先程あげたソフトウェアを一括インストールができる便利な機能です。
まずはサイトにアクセスして、MANPをダウンロードしましょう。
https://www.mamp.info/en/
一括インストール可能なため、インストールが終了次第、画面を閉じても大丈夫です。

<h4>動作確認をしよう

インストールが終わったら早速動作確認をしましょう。
アプリのコントロールパネルよりApacheを開き、WEBサーバーにアクセスします。

ブラウザに
http://localhost
と入力して正常にページが表示されれば大丈夫です。

MAMPまたはXAMPPをインストールした場合、以下のディレクトリに「phpinfo.php」を作成します。
MAMPの場合 アプリケーション＞MAMP＞htdocs
XAMPPの場合 アプリケーション＞XAMPP＞htdocs
「phpinfo.php」は、以下の内容をコピーしてください。
<? phpphpinfo(); ?>
ここまでの作業が完了したら、ブラウザを起動して以下のURLを入力してください。
http://localhost/phpinfo.php
正常にWebページが表示されたら、PHPは動作しています。表示されたWebページは、PHPの環境について記載されています。
以上がMacでMAMP環境での動作確認作業になります。
php-master-changes 2018-12-13

今日は php-fpm の systemd デフォルト設定の変更、imagecropauto() の $mode のデフォルト値の扱い修正、unserialize() のリファクタリング、Password Hashing Registry まわりのメモリリークの修正があった！

# 2018-12-13
## candrews: Implement FR [#72510](https://bugs.php.net/bug.php?id=72510): systemd service should be hardened
- https://github.com/php/php-src/commit/40c4d7f1820df1872a71ab07fd26da45a203e37f
- sapi/fpm の systemd のデフォルト設定をセキュアなものに変更
- 以下に変更される
    - ProtectHome=true
    - PrivateTmp=true
    - ProtectSystem=full
    - NoNewPrivileges=true
    - PrivateDevices=true
    - CapabilityBoundingSet=CAP_SETGID CAP_SETUID
- /tmp がサービス毎独立したものになるので、他プログラムや SAPI での実行と /tmp 共用するのが前提の場合に「アぁん？」となりそう、CLI 実行で xhprof 形式のプロファイルデータを /tmp 下に吐いて Web のビューアで見ようとしたら見えねえ！とか（一部ディストリビューションでは今でもほっとくと起きてる奴かも？）

## cmb69: Resolve imagecropauto() default $mode quirk
- https://github.com/php/php-src/commit/8c781c1c203f1e4b30aef2446a0ece7ebba6c76b
- ext/gd で、[imagecropauto()](http://php.net/manual/ja/function.imagecropauto.php) のデフォルトの $mode を GD_CROP_DEFAULT とし、直接 -1 を渡すのを deprecated に

## dstogov: Improve unserialize()
- https://github.com/php/php-src/commit/71f430cf067aa7c7ecc4a813df7d6cad19bf8148
- [unserialize()](http://php.net/manual/ja/function.unserialize.php) のリファクタリング
- [Serializable](http://php.net/manual/ja/class.serializable.php) を実装してる奴を含むオブジェクト等によって再帰的にシリアライズ / アンシリアライズの処理が呼ばれる際、BG(serialize).level や BG(unserialize).level を調整しながら処理するような構造になってる
- [#36424](https://bugs.php.net/bug.php?id=36424) やその際の[修正コミット](https://github.com/php/php-src/commit/89e93723fb11a623a42518d5de2c6f5e51243fda)を参照
- BG(unserialize).level が 1 以下の場合の処理を単純化してるような感じかな？

## dstogov: Improve unserialize()
- https://github.com/php/php-src/commit/db30e0ce1653cfdadf1a7e15dea20d2ffc38c556
- [unserialize()](http://php.net/manual/ja/function.unserialize.php) のリファクタリング
- データ構造のメモリレイアウト変えて最適化みたいな感じか？という気がするけどあまり見れてない

## dstogov: Fixed memory leaks
- https://github.com/php/php-src/commit/d206630f13812ba63cf62765d4731149700125e3
- [Password Hashing Registry まわり](https://qiita.com/sj-i/items/35b427df3ebbadb65e1d#sgolemon-implement-password-mechanism-registry) のメモリリーク修正
raspberry pi 1でtensorflow lite その6


#概要

raspberry pi 1でtensorflow liteやってみた。
tfliteファイルを作ってみた。
freeze_graphなpbファイルから作ってみた。
データセットは、xor.

#環境

tensorflow 1.12

#モデルを学習してfreezeなpbファイルに変換する。


```
import tensorflow as tf
import tensorflow.contrib.lite as lite
import numpy as np
from tensorflow.python.framework import graph_util

X = [[0, 0], [0, 1], [1, 0], [1, 1]]
Y = [[1, 0], [0, 1], [0, 1], [1, 0]]
x = tf.placeholder(tf.float32, shape = [None, 2], name = "input")
y = tf.placeholder(tf.float32, shape = [None, 2])
w1 = tf.Variable(tf.random_uniform([2, 2], -1, 1, seed = 0))
w2 = tf.Variable(tf.random_uniform([2, 2], -1, 1, seed = 0))
b1 = tf.Variable(tf.zeros([2]))
b2 = tf.Variable(tf.zeros([2]))
h1 = tf.sigmoid(tf.matmul(x, w1) + b1)
h2 = tf.nn.softmax(tf.matmul(h1, w2) + b2, name = "output")
cost = -tf.reduce_sum(y * tf.log(h2))
opti = tf.train.GradientDescentOptimizer(0.1).minimize(cost)
graph = tf.get_default_graph()
graph_def = graph.as_graph_def()
with tf.Session() as sess:
  sess.run(tf.initialize_all_variables())
  for i in range(10000):
    sess.run(opti, feed_dict = {
      x: X,
      y: Y
    })
  for i in [[1, 1], [1, 0], [0, 1], [0, 0]]:
    print (i, sess.run(h2, feed_dict = {
      x: [i],
    }))
  output_graph_def = graph_util.convert_variables_to_constants(sess, sess.graph_def, ["input", "output"])
  with tf.gfile.GFile("xor2_graph.pb", "wb") as f:
    f.write(output_graph_def.SerializeToString())

```

#pbファイルからtfliteファイルに変換する。


```
graph_def_file = "xor2_graph.pb"
input_arrays = ["input"]
output_arrays = ["output"]
converter = lite.TFLiteConverter.from_frozen_graph(graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("xor2_model.tflite", "wb").write(tflite_model)
```

#tfliteファイルを用いて、検証する。


```
import numpy as np
import tensorflow as tf
import tensorflow.contrib.lite as lite

interpreter = lite.Interpreter(model_path = "xor2_model.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
print (input_details)
print (output_details)
input_shape = input_details[0]['shape']
input_data = np.array([[0.0, 0.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[1.0, 0.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[0.0, 1.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)
input_data = np.array([[1.0, 1.0]], dtype = np.float32)
print(input_data)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
print (output_data)

```


以上。
DataからInt32配列の取得

#事の始まり
Int32データの配列が出力されているバイナリファイルをDataオブジェクトとして読み込んで、Swift上でInt32配列に置き換えて扱うお話。
これが思ったよりも一筋縄ではいかなかった。
#C言語だったら？
C言語だと以下のようなコードになると思います。
（コードを簡略化するために読み込みデータ長は1024でハードコードしています。）

```
int buf[1024];
FILE *fp = fopen("binary.dat", "r");
fread(buf, sizeof(int), 1024, fp);
fclose(fp)
```

#Swift4での実装方法
(Swift3でも同じ方法でいけるらしい？です。)

```
var buf:[Int32]? = nil
if let fileUrl:URL = Bundle.main.url(forResource: "binary", withExtension: "dat")
{
	do
	{
		let dat:Data = try Data(contentsOf: fileUrl)
		buf = dat.withUnsafeBytes{
			Array(UnsafeBufferPointer<Int32>(start:$0, count:1024))
		}
	}
	catch
	{
		buf = nil
	}
}
```

C言語やObjective-Cで慣れていると、逆にややこしいですね。
Int32だけでなくFloatやInt16、Doubleでも多分同様でできると思います。
ただし、UInt8配列への変換はキャストすれば、オペレーターがやってくれるみたい。

```
let byteBuff:[UInt8] = [UInt8](dat)
```
Djangoの使い方（インストールから立ち上げ）

[はじめてのDjangoアプリ作成](https://docs.djangoproject.com/ja/2.1/intro/tutorial01/)の実践です。

##環境
macOS mojave
python 3.7.1(anaconda)
Django 2.1.2
##Djangoのinstall
anacondaなので、ターミナルに以下入力。
`conda install django`
終わったら、バージョン確認。
`python -m django --version`

```
2.1.2
```

##新規プロジェクト作成
プロジェクトを置くところに移動してから、
`django-admin startproject mysite`
mysiteというフォルダが作成される。

`django-admin startproject mysite .`
のように最後に「.」をつけると、現在の作業ディレクトリにDjangoをインストールして、という明示的な意味になるそうだ。どちらもでもうまくいく。

###startprojectで作成されたディレクトリとファイル
ターミナルから`$ tree`で確認できる。

```
mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
```

manage.py …サイト管理用のスクリプトファイル
setting.py …サイトの設定ファイル
urls.py …urlresolverを使ったURLのパターンリストを含んでいる。
とりあえず、この辺りを押さえておいて、ほかのファイルを削除しないこと。

##開発用サーバーの立ち上げ

`python manage.py runserver`

ブラウザで `http://127.0.0.1:8000/` にアクセスすると、

<img width="1349" alt="スクリーンショット 2018-12-14 8.54.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/178483/0a8ec0fd-16af-b884-6181-196f74cb6d3c.png">

無事にDjangoが稼働しました。

日本語のセッティングにするには、`setting.py`を以下のように修正する。

```
# setting.py

LANGUAGE_CODE = 'ja-AP'
TIME_ZONE = 'Asia/Tokyo'
USE/TZ = Flase

```
こうして`http://127.0.0.1:8000/` にアクセスすると、ちゃんと日本語になりました。

<img width="1399" alt="スクリーンショット 2018-12-18 13.51.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/178483/4cc88631-7b5a-b3c2-d50e-115b740a194b.png">


##アプリケーションを作る
`python manage.py startapp polls`
これでpollsというディレクトリ（中身↓）ができる。

```
polls/
    __init__.py
    admin.py
    apps.py
    migrations/
        __init__.py
    models.py
    tests.py
    views.py
```
pollsディレクトリに移動して、ビュー（view）の作成をすすめる。
##ビュー（view）の作成

ブラウザで表示されるページをDjangoで作成していきます。

###polls/views.pyを編集

```
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, from Django. You're at the polls index.")
```

###URLの対応付け polls/urls.py

viewを呼ぶだめには、URLの対応付けが必要
URLconfをpollsディレクトリに作る->file urls.pyを作って以下入力。

```
# polls/urls.py
from django.urls import path
# カレントディレクトリからviewsをインポート
from . import views

# pathのなかの引数3つ、’’はURL（この場合は、localhost:8000/polls)
# 第1引数はURL、第2引数はviewsファイルのindex関数を参照。
urlpatterns =[
	  path('', views.index, name='index').
]

```

次はルートのURLconfであるmysite/urls.pyにpolls.urlsモジュールの記述を反映させる。

```
# mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
```

###対応付け mysite/urls.py

django.url.includeのimportを追加して、url patternsのリストにincludeを追加する。
紐付けができたら、もう一度確認。

###localhost:8000/polls/

<img width="1349" alt="スクリーンショット 2018-12-14 9.25.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/178483/d8b6331e-8e5d-f8af-1270-8e238d2dfc41.png">

viewができて、pollsとmysiteのurls.pyでURL対応付けが完了しました。

### path関数
path関数は引数を4つとるが、うち、routeとviewは必須で、kwargsとnameは省略可能。