OmniAICreator/Qiita-1.07M huggingface dataset:
NuxtJSの国際化にはnuxt-i18nを使おう

現在日本語の記事ではNuxtJS上でvue-i18nを使って国際化を行う方法のみ説明されています。
しかしそれらは１年以上前のものだったりして少々古く、2018年10月現在では`nuxt-i18n`というnuxt用にvue-i18nを拡張したプラグインが開発されています。
なので今回はこの`nuxt-i18n`を使って国際化を行ってみたいと思います。

## 前準備: Nuxtプロジェクトの作成

以下設定でNuxtプロジェクトを作成します（Project Name以外デフォルト）

```terminal
$ create-nuxt-app
> Generating Nuxt.js project in /Users/wildmouse/develop/practice
? Project name nuxt-with-i18n
? Project description My mind-blowing Nuxt.js project
? Use a custom server framework none
? Use a custom UI framework none
? Choose rendering mode Universal
? Use axios module no
? Use eslint no
? Use prettier no
? Author name (wildmouse)
? Choose a package manager npm
```

プロジェクトの作成が完了したら`cd nuxt-with-i18n`で移動し、準備完了。

## nuxt-i18nの追加

次に`nuxt-i18n`のインストールを実行。

```terminal
$ npm install --save nuxt-i18n
```

でインストールが完了します。

## nuxt-i18nの設定

インストールが完了したら`nuxt.config.js`に設定を追加していきます。

```js:nuxt.config.js
modules: [
  [
    'nuxt-i18n',
    {
      locales: [
        { code: 'ja', iso: 'ja-JP' },
        { code: 'en', iso: 'en-US' },
      ],
      defaultLocale: 'ja',
      vueI18n: {
        fallbackLocale: 'ja',
      },
      vueI18nLoader: true
    }
  ]
],
```

## 国際化させる文章を登録

プロジェクトでの設定が完了したら、次に個々のページで対応化させたい単語・文章の登録をします。
各vueファイルの`<template>`上部に`<i18n>`タグを追加し、JSON形式で記述することで国際化が可能になります。

```vue:index.vue
<i18n>
  {
    "ja": {
      "hello": "こんにちは世界"
    },
    "en": {
      "hello": "Hello World"
    },
  }
</i18n>
```

## 国際化した文言を表示させる

文言が登録できればあとはtemplate側で使用すればOK。

```vue:index.vue
<template>
  <div>
    {{ $t('hello') }}
  </div>
</template>
```

`npm run dev`を叩いて http://localhost:3000 にアクセスすると、`こんにちは世界`と表示されているのが確認できるはずです。
## 参考
https://github.com/kazupon/vue-i18n-loader
http://kazupon.github.io/vue-i18n/
Ruby で競技プログラミングをするときのまとめ（多次元配列編）

- リクエストに応じて追記していきます。
- 環境は [AtCoder](https://beta.atcoder.jp/) を想定しています。なお AtCoder の Ruby のバージョンは 2018年10月現在 2.3.3 です。

## 入力について

### 入力が地図のパターン

$H$, $W$ は整数
$c_{i,j}$ はなんらかの文字

> $H \quad W$
> $c_{1,1}c_{1,2}...c_{1,W}$
> $c_{2,1}c_{2,2}...c_{2,W}$
> $:$
> $c_{H,1}c_{H,2}...c_{H,W}$

文字列の配列にしたいとき

```ruby:
H, W = gets.split.map(&:to_i)
c = H.times.map { gets.chomp }
```

１文字ずつの二次元配列にしたいとき

```ruby:
H, W = gets.split.map(&:to_i)
c = H.times.map { gets.chomp.chars }
```

### 入力が数の二次元配列のパターン

$H$, $W$ は整数
$a_{i,j}$ は整数

> $H \quad W$
> $a_{1,1} \quad a_{1,2} \quad ... \quad a_{1,W}$
> $a_{2,1} \quad a_{2,2} \quad ... \quad a_{2,W}$
> $...$
> $a_{H,1} \quad a_{H,2} \quad ... \quad a_{H,W}$

```ruby:
H, W = gets.split.map(&:to_i)
a = H.times.map { gets.split.map(&:to_i) }
```

### 入力が幅と高さのみで、二次元配列を自分で作るパターン

$H$, $W$ は整数

> $H \quad W$

```ruby:
H, W = gets.split.map(&:to_i)
a = H.times.map {|i|
  W.times.map {|j|
    # i, j による初期値
  }
}
```

## 処理について

### 文字列の配列の各文字ごとに何かしたいとき

文字だけでいいとき

```ruby:
c.each {|line|
  line.chars {|ch|
    # ch の処理
  }
}
```

インデックスが必要なとき

```ruby:
H.times {|i|
  W.times {|j|
    # c[i][j] の処理
  }
}
```

### 二次元配列の各要素ごとに何かしたいとき

要素だけでいいとき

```ruby:
a.each {|row|
  row.each {|elem|
    # elem の処理
  }
}
```

インデックスが必要なとき

```ruby:
H.times {|i|
  W.times {|j|
    # a[i][j] の処理
  }
}
```

両方（`H` と `W` がわかっているなら上で十分）

```ruby:
a.each_with_index {|row, i|
  row.each_with_index {|elem, j|
    # i, j, elem の処理
  }
}
```

### 地図とかで上下左右を参照するとき

```ruby:
H.times {|i|
  W.times {|j|
    [
      [-1,  0], # 上
      [ 1,  0], # 下
      [ 0, -1], # 左
      [ 0,  1], # 右
    ].each {|di, dj|
      if 0<=i+di && i+di<H && 0<=j+dj && j+dj<W
        # c[i + di][j + dj] の処理
      else
        # 範囲外のときの処理
      end
    }
    # c[i][j] の処理
  }
}
```

### 地図とかで斜めも含め八方を参照するとき

```ruby:
H.times {|i|
  W.times {|j|
    (-1..1).each {|di|
      (-1..1).each {|dj|
        if di==0 && dj==0
          # c[i][j] の処理
        elsif 0<=i+di && i+di<H && 0<=j+dj && j+dj<W
          # c[i + di][j + dj] の処理
        else
          # 範囲外のときの処理
        end
      }
    }
    # c[i][j] の処理
  }
}
```

## インデックスについて

### 注意１：範囲外のアクセス（`size` 以上のとき）

`a[i][j]` のようにアクセスしたとき、`i` が `a.size` 以上であると `a[i]` が `nil` を返し、そのまま `[j]` でアクセスしてエラーを起こします。

```
undefined method `[]' for nil:NilClass (NoMethodError)
```
対処法として、`i` の大きさを確認するか、`a[i]` が `nil` でないことを確認しましょう。

### 注意２：範囲外のアクセス（`0` 未満のとき）

注意１では触れませんでしたが、Ruby では 配列のインデックスに負数を指定することができます。

`-1` が一番最後で、後ろから `-1`, `-2`, ... という具合で指定できます。

これは便利なときと不便なときがあって、地図が上下左右でつながっている（ドラクエみたいな）問題では便利ですが、そうでないときは不便です。

不要なときは `i` の大きさを確認しましょう。`a[i]` が `nil` であるとは限らなくなるので、 `nil` チェックは使えません。

## 出力について

`c` が文字列の配列のとき

```ruby:
puts c
```

`c` が文字の二次元配列のとき

```ruby:
puts c.map(&:join)
```

`a` が数値の二次元配列で、スペース区切りで出力するとき

```ruby:
puts a.map {|line| line.join(" ") }
```

または

```ruby:
a.each {|line| puts line.join(" ") }
```
iOS12で追加されたショートカットを使って会社のslackに遅刻の連絡をする

#はじめに
ついにiOS12がリリースされましたね。
地味なアップデートかなとの印象でしたが、新しく追加されたショートカットというアプリでWeb APIを叩けることを知ってからはその印象はガラッと変わりました。

というわけで、この記事ではショートカットを使って、ボタン一つで会社のslackチャンネル上に、遅刻の旨と到着予想時刻を送信するショートカットを作ります。

<img width="414" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/268579/626c719f-ae76-f5d0-eb58-2301ba579575.png">
↑これを実行すると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/268579/a19f5584-6db4-5dc8-9786-03612b63d758.png)
↑こんな感じになる。

#作り方
###投稿したいslackの認証トークンを手に入れる
今回はメッセージを送信するだけなので、`Send messages as user`というトークンがあればOKです。
以下の記事を参考に取得しました
[Slack API 推奨Tokenについて](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)

###新しいショートカットを作成する
ショートカットアプリから新しいショートカットを作成します。
※ショートカットアプリはiOS12にアップデートしても自動でインストールはされないので、個別でAppStoreからダウンロードしましょう

###会社までの移動時間を取得する
必要なコマンドを下のドロワーから追加すると、ショートカットのスクリプトが組めます。
追加したコマンドは長押しで移動できます。
矢印で繋がっているコマンドは、上のコマンドからのデータの入力を表しています。

<img width="414" alt="IMG_6108.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/268579/60d4fda0-c75a-fd62-d6e6-96491e9abb48.png">
オフィスの住所の部分は、各自の会社の住所を入力してください。

###到着時刻を計算する
<img width="414" alt="IMG_7F3DDA82B0E2-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/268579/db2fbcfb-e73e-a88d-eb22-a86e8a806b4c.jpeg">
現在の日付と移動時間から会社への到着予想時刻を取得して変数に追加しておきます。

###その日の出社時刻を取得する
<img width="414" alt="IMG_6116.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/268579/6cb29f76-7607-d46c-e2a6-fa20a3f5ee73.png">
到着予想時刻は`2018/10/15 11:23`という形式なので、正規表現を使って時間の部分を出社時刻`10:00`に置き換えます。(10時というのは例えです。）
わざわざ一度テキストにしてから再び日付形式に変換しているのは、日付のままだとこのような操作ができないからです。

###間に合いそうかどうかで条件分岐させる
<img width="414" alt="IMG_DDDD738806AD-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/268579/1adba3cc-e80f-5c80-768b-5c216dc10337.jpeg">
到着予想時刻が出社時刻が大きい場合、遅刻することが予想されるので、遅刻連絡の処理に分岐します。

この画像中ではついでに到着予想時刻の時間の部分だけを変数に追加しておいてあります。
あとで使います。

###APIのエンドポイントを作成する
<img width="414" alt="IMG_BCFBECFBE9F1-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/268579/dfeb881a-9f30-a4d2-1936-f31684967b67.jpeg">
`token=`の後ろにはさっき取得した認証トークンをそのまま貼り付けます。
`channel=`の後ろには投稿したいチャンネル名を書きます。
どちらも特に""などで囲む必要はありません。
（改めて見返してみると、チャンネルの指定までをURLの方に書くべきですね）

詳しくは以下の記事を参考にしました。
[Slack APIでメッセージ送信](https://qiita.com/mizuki_takahashi/items/3f77c2e5b6142563ce66)

###エンドポイントを叩く
<img width="414" alt="IMG_D9C46578FC0E-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/268579/f11c4f55-73ba-da76-7f34-789078847fb5.jpeg">
ちょっとわかりづらいですが、「URLの内容を取得」というコマンドでURLを入力で受け取ると、エンドポイントを叩くことができます。
今回はPOSTなので方法はPOSTにしてください。

これでslackの指定したチャンネルに遅刻メッセージが送れるはずです。

ついでに、間に合いそうな時はメッセージは送信せずに、自分の携帯にその旨を通知しましょう。

###名前をつける
<img width="414" alt="IMG_6120.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/268579/79fa2f61-87f1-9027-bb3f-787d5c2f8fc5.png">
編集画面の右上にあるニンテンドースイッチみたいなボタンをタップすると、名前などの編集ができます。
好きな名前とアイコンをつけて、ホーム画面がウィジェットに追加しときましょう。
siriに追加すれば、例えば「遅刻する！！」と叫ぶだけで会社へ遅刻連絡ができるようになりますね（電車の中でそんなこと叫んでたら変な奴ですが）


#終わりに
今回はやりませんでしたが、遅刻の理由などをいくつか登録しておき、ショートカットを起動した時に選べるようにすれば、複数の遅刻理由に対応できます。
他にも連絡を入れた後に、電車の乗り換え経路を表示するなどのカスタマイズもできます。

また、今回はslackでしたが、Web APIが使えれば正直なんでもできるので、夢が広がります。
是非みなさんも快適な自動化ライフを！



Twitterもやってるので、よければフォローお願いします。
→https://twitter.com/ObataGenta
Active Recordから返されたオブジェクトが単一か配列か気をつける

#はじめに
Ruby on Railsを勉強していく過程で、よくつまずいたり勘違いしていた事について簡単にまとめてみました。
初学者の方には、為になるかも知れません。（ベテランにとってはゴミ記事です）
間違い等ありましたらご指摘下さい。

◾️Version
・Ruby `2.4.1`
・Rails `5.1.4`

#Active Record とは

`Active Recordでは、データベースからオブジェクトを取り出すための検索メソッドを多数用意しています。これらの検索メソッドを使用することで、生のSQLを書くことなく、データベースへの特定のクエリを実行するための引数を渡すことができます。`
[引用元](https://railsguides.jp/active_record_querying.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%8B%E3%82%89%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%8F%96%E3%82%8A%E5%87%BA%E3%81%99)
欲しいデータを取り出すとき、Active Recordが用意してる検索メソッド使うと便利ですって話ですね。
#データベースから検索する
例としてMovieモデルが存在し、以下のカラムを持つとします。

- 映画タイトル(:name)
- 監督(:director)
- 主演(:main_cast)
- 公開年(:released_at)

早速**Total Recall**というタイトルの映画を検索してみます。
今回は`find_by`と`where`という2つのメソッドのみに焦点を当てて行きます。
##find_byの場合
```
Movie.find_by(name: "Total Recall")
=>　#<Movie
  id: 11111,
  name: "Total Recall",
  director:  "Paul Verhoeven",
  main_cast: "Arnold Alois Schwarzenegger",
  released_at: 1990>
```
映画のデータが出てきました。
監督がポール・バーホーベン、主演がアーノルド・シュワルツネガー（シュワちゃん）ということが分かりましたね。
これを変数に格納すれば、変数から監督や主演を出力できます。

```
total_recall = Movie.find_by(name: "Total Recall")
・・・
・・・
#監督名を出力させたい
total_recall.director
=> "Paul Verhoeven"
```
##whereの場合
```
Movie.where(name: "Total Recall")
=>　[#<Movie
  id: 11111,
  name: "Total Recall",
  director:  "Paul Verhoeven",
  main_cast: "Arnold Alois Schwarzenegger",
  released_at: 1990>,
#<Movie
  id : 22222,
  name: "Total Recoll",
  director: "Len Wiseman",
  main_cast: "Colin James Farrell",
  released_at: 2012>]
```
おっと、シュワちゃん版（1990年版）の他にもう一つ、2012年版の情報も出てきました。
実はリメイクされていたので、**Total Recall**という映画は2つ存在してたんですね。

それぞれのメソッドについてですが、

- **`find_by`**：条件にマッチするデータが複数あっても単一でしか返さない（マッチした最初のレコードのみ返す）。
- **`where`**：条件にマッチした全データを**配列**にして返す（[ ]で囲まれているのがわかると思います）。

従って、条件にマッチしたデータ全てを返して欲しい場合は`where`を使用しなくてはなりません。
しかし、「タイトルが**Total Recall**で主演が**シュワちゃん**」という条件で検索して、1990年版のTotal Recallのみを返して欲しい場合もあります。
そんな時はwhereのAND条件です。
##where(AND条件)

```
Movie.where(name: "Total Recall", main_cast: "Arnold Alois Schwarzenegger" )
=>　[#<Movie
  id: 11111,
  name: "Total Recall",
  director:  "Paul Verhoeven",
  main_cast: "Arnold Alois Schwarzenegger",
  released_at: 1990>]
```
これで1990年版のTotal Recallのみに絞り込むことが出来ました。
ただし、ここで気をつけねばならないことは、
「1つに絞り込むことが出来ても、**オブジェクトは配列**」だということです。
例えば、先ほどのように「シュワちゃん版Total Recall」を変数に格納して、変数から監督を呼び出したい時、エラーが発生します。

```
schwa_ban = Movie.where(name: "Total Recall", main_cast: "Arnold Alois Schwarzenegger" )
・・・
・・・
# シュワちゃん版Total Recallの監督名を呼びだしたい
schwa_ban.director
NoMethodError: undefined method `director' for ・・・
```
find_byの場合はうまくいったのに、なぜundefined methodが起こるのでしょう。
これはレシーバーである`schwa_ban`変数の正体が**配列**だからです。
**directorを知ってる（返せる）のは配列の中の要素**ということですね。
要素に聞かないと返ってこないというわけです。
なのでeachなりmapなり要素に対するアプローチをするメソッドで対応しなければなりません
（もっと簡単な方法あるかも？）。

#まとめ（一言でまとめると）
whereで1レコード分のみの検索をしても、find_byと違って配列で返してくるので気をつけようという事でした。
（find_byと混同しがち）
Redmineのproduction.logをログローテーションする方法

# 事象
redmineのproduction.logが開けない

# 原因
redmineのproduction.logが肥大化しすぎ
※一応tailコマンドで行数指定で開けるがこのまま肥大化し続けるのはよくないため、対応

# 対処法
logrotateで月次でログをローテーションさせる
※logrotateのツールで複数のログファイルを圧縮、削除、メールで送信するための機能

## 1. logrotateのインストールを確認
```
yum list installed | grep logrotate
```
## 2. redmineの個別logrotateファイルを設定
```/etc/logrotate.d/redmine
/opt/rails/redmine/log/*log {
    monthly
    missingok
    notifempty
    copytruncate
    compress
    su redmine redmine
}
```

## 3. logrotateをデバッグ
```
logrotate -d /etc/logrotate.d/redmine
```

## 4. logrotateを手動実行
```
logrotate -f /etc/logrotate.d/redmine
```

# つまづいたポイント
logrotateしたときに「because parent directory has insecure permissions」というエラーが発生
　⇒ローテーションする際に権限でエラーが発生していると考えられる

- 参考URL
[logrotateしたときにbecause parent directory has insecure permissionsというエラーが出る](https://qiita.com/tjinjin/items/b2108b5178c096795a76)
java-source-attacher

java jarファイル中ソースを読みたい場合、java-source-attacherというpluginをdownloadすれば、便利です。

①eclipse→help→eclipseマーケットプレース
下記のURLを検索して、インストールして、
http://marketplace.eclipse.org/content/java-source-attacher
②jarファイルにで、右クリックして、attach java sourceをクリックして、
classファイルを読める。
注意：上記①でブロキシー発生する場合、
eclipse→設定→一般→ネットワーク接続→
httpとhttps編集（ユーザとパスワードを入力してください。）
【MySQL】データベース作成の手順

## rake db:migrateが通らない
業務中、`rake aborted! `のエラーしか返ってこず。

## MySQLのDBが作成されていない
調べた結果、原因はこれでした。
以下に、MySQLのデータベース作成手順をまとめます。

##mysqlのデータベース作成手順

１．terminalで下のコードを打ってMySQLに入ります。

```terminal
$ mysql -u root -p
```

２．　文字コードを日本語（utf8)に指定してデータベースを作成します。

```terminal
mysql > CREATE DATABASE データベース名 CHARACTER SET utf8;
```
３．　GRANT構文で、今回はすべての実行権限を持つユーザーを作成します。

```terminal
mysql > GRANT ALL PRIVILEGES ON *.* TO データベース名 IDENTIFIED BY 'パスワード';
```
４．　最後に、MySQLから出て作成完了です。

```terminal
mysql > quit
```

今日はこのあたりで失礼します。

## 参考サイト
MySQL/ユーザとDB作成
http://wiki.minaco.net/index.php?MySQL%2FユーザとDB作成#d0a450a0

railsのapp作成でmysqlを使用する時の導入とハマるところ　rake db:createができるまでの流れ
https://qiita.com/Kaisyou/items/17142ff2d080d565fedc

Rake db:migrateを実行できない
https://teratail.com/questions/37664
Docker入門  コンテナのライフサイクル

# コンテナのライフサイクル
コンテナとは、一緒の仮想環境。
生成されてから停止されるまでのステータスを追っていく。


## created

コンテナを生成する

```
docker create --name status-test -it alpine /bin/sh
```

そして、`docker ps -a`で状態を見てみる

```
$docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d75e0580aa81        alpine              "/bin/sh"           4 seconds ago       Created                                 status-test
```
ステータスは`Created`。
この状態ではまだコンテナは起動していない。


## running

実際にコンテナを起動してみる。
`$ docker start コンテナ名`で起動する

```
$ docker start status-test
status-test
```

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d75e0580aa81        alpine              "/bin/sh"           4 minutes ago       Up 6 seconds                            status-test
```
ステータスが、`Created`から`Up 6 seconds`に変わりコンテナが起動されたことが確認できる。


## paused
こんどは、`start`で起動したコンテナを`$ docker pause コンテナ名 `停止させてみる

```
$ docker pause status-test
status-test
```
とりあえず成功。
肝心のステータスは、、、

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
d75e0580aa81        alpine              "/bin/sh"           8 minutes ago       Up 4 minutes (Paused)                       status-test
```
`Up`にはなっているがその横に`(Paused)`の文字が。
一時停止状態になっていることが確認できます。


## restarting

一時停止したコンテナを`$ docker unpause コンテナ名 `で再起動させてみます。
この状態で一瞬だけ`restarting`になります！！


```
$ docker unpause status-test
status-test
```

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
d75e0580aa81        alpine              "/bin/sh"           13 minutes ago      Up 8 minutes                            status-test
```
一時停止時にあった `(Pause)`の文字が消えてますね！ナイス！
そして、時間は`start`実行時のからカウントされてるみたいですね。


## exited
`exited`はコンテナが終了した状態を指す。（この状態だとコンテナ自体はまだ存在している。）
`$ docker stop コンテナ名`を実行したときもこのステータスになる

```
$ docker stop status-test
status-test
```

```
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
d75e0580aa81        alpine              "/bin/sh"           20 minutes ago      Exited (137) About a minute ago                       status-test
```
ステータスが`running`から`Exited`へ変更された。
`$docker start`でまた`running`状態へ戻すことができる。



## removing
Dockerのコンテナ削除中を表すステータス。
通常は、コンテナ削除にそう時間を要さないためこの`removing`状態をみることはなかなかレア


### コンテナ削除方法
停止中のコマンドの削除

```
$docker rm コンテナ名
```

起動中のコンテナの削除
強制的に削除する

```
$ docker rm -f コンテナ名
```

または
停止させてから削除コマンドを実行する

```
$ docker stop コンテナ名
$ docker rm コンテナ名
```

## dead
コンテナが正常に終了できなかったときの状態
基本的に社会復帰させるのは不可能なので、迷わず削除！！削除！！削除！！


### まとめ

```         
              paused    dead
              /         /
created -> running -> exited -> removing
              \       /
              restarting
            
```
上記のようなライフサイクルでコンテナのステータスは変化する。
`exited`の状態を`start`で再起動させる場合は一度`restarting`を経由する
VSCodeで、ファイル保存時に勝手にスペースや改行がされる

# TL;DR


VSCodeで、ファイル保存時に勝手にスペースや改行がされるのでそれを直す手立てのひとつです

こんな感じになります
![vs-code-setting.gif](https://qiita-image-store.s3.amazonaws.com/0/183059/719f70eb-5a55-5372-1ff3-0b0662f23ad1.gif)

保存(空白が入る) → むむっ:fish: → editor.formatOnSave → false(チェックを外す)
→　直った:fish:


# 対象読者

- VScode version 1.28.1
- PCを新しくして、VSCodeをSettingSyncで同期したけど、思わぬ機能が発動してしまった人:santa:

# 結論

キャプチャですべてネタバレしましたが、
1. command + ,(設定)
2. editor.formatOnSave
3. チェックを外す

勝手なスペースやインデントを無にしよう

ムムム！

# 参考
https://devadjust.exblog.jp/23791887/

mov→mp4→gifにした際に使用した便利な変換サイト
https://convertio.co/ja/mov-mp4/
PHPでフォーム作成(仮)


**(自分用)復習箇所メモ:XSSとSQLインジェクション**<br>
エラーを起こしていた原因と難しかったところを厳選した。

##PDO接続

```pdo.php
//PDO接続のテンプレート
try {
  $pdo = new PDO(DSN, DB_USERNAME, DB_PASSWORD);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

} catch (PDOException $e) {
  echo $e->getMessage();
  exit;
}
```

# フォーム作成

## index.php

### SQLの連携と表示

username,password,don,dbnameをdefine()でやると、うまく動かなかった
そのため、必要なファイルにすべて変数を記述した
index.phpでないとダメなのか?


``` index.php

define('DSN','mysql:host=localhost;dbname=yamaguchi_db');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
```


## input.php 

### $_SESSION

session_start();を始めに記載しておく
valueに入れて表示させる

###バリデーション(入力必須)required


必須項目はHTMLから設定できることを知らなかったため時間がかかった
これに関する調べ方が、PHPに限ったものだったので答えが出てこなかった


```input.php

<input type="number" name="number" value="<?php
　　if(isset($_SESSION['number']))
　　echo htmlspecialchars($_SESSION['number'], ENT_QUOTES, utf-8);
　　?>" required>

```


## confirm.php

### $_POST

元のHTMLの属性をnameで設定していないことで、時間がかかった<br>
間違いの原因は、idにしていたから


###バリデーション(入力規定)

- /^[0-9]+$/
<br>半角数字で連続する数字の列で入力可能
- /^[a-zA-Z]+$/
<br>半角英字で連続する文字列を入力可能



###リダイレクト

エラー項目がある場合、入力画面に戻す
その際にSESSIONを使って、正しく入力されていた情報を保持

- どのようにしてリダイレクトするか
<br>errors()の配列を作って、下に書いてあるバリデーションのコードをifに入れた. 
<br>その後に不適切であれば、$errors['number']とかで適当な変数をつける. 
<br>count()を使ってerrorsの中身が0でないとき、リダイレクトで返す


###XssとSQLインジェクション

入力内容をJavaScriptのコードやSQLの文などにすると、悪さをできる
そのために、対策をする


```confirm.php

//バリデーション
!preg_match("/^[a-zA-Z]+$/", $yourName);

//リダイレクト
header('Location:input.php’);

//バリデーションとリダイレクト組み合わせ

$errors = array();

if(!preg_match("/^[0-9]+$/", $number)){
  $errors['number2'] = "半角数字で入力してください";
}

if(count($errors) !== 0){
  header('Location: input.php');
  exit();
}


//XSS対策
htmlspecialchars($_SESSION[”yourName”]);

```



## complete.php

### SQLに挿入

SQLの文で、VALUESをVALUEにしていたからエラーになっていた


```complete.php
//SQLインジェクション
$sql = "INSERT INTO form_table (number, name, age, note) VALUES (:number, :name, :age, :note)";
$stmt = $pdo->prepare($sql);
$params = array(':number' => $_SESSION['number'], ':name' => $_SESSION['name'], ':age' => $_SESSION['age'], ':note' => $_SESSION['note']);
$stmt->execute($params);

```
c++ クラスの基本 データメンバとゲッタの命名

##データメンバとゲッタの命名

c++ ではデータメンバとゲッタの名前を同一にできない。

1. データメンバとゲッタ名を異なる名前にする

```c++
Class C{
    int number;
    int full_name;
  public:
    int no() {return number;}
    int name() {return full_name;}
}
```

2. データメンバ名に下線をつける

```c++
Class C{
    int no_;
    int name_;
  public:
    int no() {return no_;}
    int name() {return name_;}
}
```

3. ゲッタの先頭にget_をつける

```c++
Class C{
    int no;
    int name;
  public:
    int get_no() {return no;}
    int get_name() {return full_name;}
}
```
filemaker-ruby にて、「タイプ」が「オブジェクト」で「オプション/コメント」が「外部（オープン）」のフィールドの戻り値について

# filemaker-ruby とは
`filemaker-ruby` とは、Ruby で FileMaker の API を扱うための gem です。
https://github.com/mech/filemaker-ruby

# レコードの各フィールドの戻り値はどのような形をしているか
この gem を使うと例えば任意のレコードにおける各フィールドの値を取得することができます。ただ、テキストで取得できる値以外のいわゆる「オブジェクト」はどのように戻ってくるのでしょうか。

<img width="206" alt="スクリーンショット 2018-10-15 16.06.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/72181/a8fb2ee6-cc98-0d77-53a7-0a3b3d568281.png">

結論を申し上げますと、`HTTP::URI` クラスのオブジェクトとして戻ってきます[^1]。

# 戻り値を料理する
オブジェクトのフィールドの戻り値が `HTTP::URI` クラスのオブジェクトとわかったので、あとは自在に料理しましょう。メソッドとしては以下のようなものが使えます。

`#to_s`、`#scheme`、`#userinfo`、`#host`、`#port`、`#registry`、`#path`、`#opaque`、`#query`、`#fragment`、`#opaque`、`#opaque`、`#opaque`、 

# 具体例
具体的な例を挙げます。`foobar` というフィールドが以下のようにオブジェクトフィールドだったと仮定します。画像を埋め込んだオブジェクトフィールドです、

```ruby
"foobar"=>#<URI::HTTP http://123.123.123.123/fmi/xml/cnt/FIELD_NO_NAME.jpg?-db=YOUR_DB_NAME&-lay=YOUR_LAYOUT_NAME&-recid=RECORD_ID&-field=foobar(1)>,
```

このオブジェクトに対して前述したメソッドを与えて操作ができます。その結果が以下です。

```
to_s: http://123.123.123.123/fmi/xml/cnt/FIELD_NO_NAME.jpg?-db=YOUR_DB_NAME&-lay=YOUR_LAYOUT_NAME&-recid=RECORD_ID&-field=foobar(1) #=> foobar.to_s
scheme: http #=> foobar.scheme
userinfo: #=> foobar.userinfo
host: 123.123.123.123 #=> foobar.host
port: 80 #=> foobar.port
registry: #=> foobar.registry
path: /fmi/xml/cnt/FIELD_NO_NAME.jpg #=> foobar.path
opaque: #=> foobar.opaque
query: -db=YOUR_DB_NAME&-lay=YOUR_LAYOUT_NAME&-recid=RECORD_ID&-field=foobar(1) #=> foobar.query
```

# 注意点
得られた URI にアクセスする場合には BASIC認証 が必要です。ユーザ名とパスワードは FileMaker のそれと同一です。

# 参考
- [class URI::HTTP \(Ruby 2\.5\.0\)](https://docs.ruby-lang.org/ja/latest/class/URI=3a=3aHTTP.html)	

[^1]: 「タイプ」が「オブジェクト」で、「オプション/コメント」が「外部（オープン）」のフィールドです
フロントエンドのいろは

# CSSの設計

## Webサイト構築の大まかなワークフロー
1. 企画・立案
2. 案件定義
3. Webサイト設計
4. 画面デザイン
5. マークアップ・CSS設計
6. JavaScript開発
7. ページ量産
8. システム開発
9. 公開

## マークアップ前に考慮すべきこと
- ページレイアウトのパターンはいくつそんざいするのか
- コンテンツ内にどのような要素が配置されるのか
- ウェブデザインの手法はレスポンシブWebデザインなのか、アダプティブWebデザインなのか
- そのWebサイトの性質は、ECサイトなのか、コーポレートサイトなのか、ポータルサイトなのか、それ以外なのか
- Webサイトを公開した後は誰が運用をしていくのか
- CMSやシステムが入るのか
- 推奨環境・端末は何になるのか
- 外部サービスとの連携はあるのか
- ユーザ層のターゲットはどのあたりか

## 保守性
モジュールの疎結合を考慮し、特定のページや場所、構造に依存せず制作の効率化や保守性を保つことが出来る仕組みを整える。

## 拡張性
基本的な内部構造に影響を与えずに、モジュールの機能を変更したり拡張できるようにすること。
モジュールを実装する上で、既存のモジュールを元にサイズ、色などが違った、別の派生モジュールを簡単に増やせるような設計を心がけると良い。

## 再利用性
再利用可能な部品としてモジュールを設計することができれば、同じようなHTML,CSSのコードを書く必要がなくなり、制作や運用の効率化に繋がる。また、デザインに一貫性を保つことができ、ユーザビリティの向上にも繋がる。

## CSSの破綻理由を考える

CSSには柔軟性がある一方で、スコープのコントロールやカプセル化といった概念を実装できるプログラム的な機能がない。
曖昧性や理解に苦しむ表現が多用されると、コードに一貫性がなくなり、破綻を生む。
言語に足りない機能に関しては、コーディング規約やガイドラインを定めドキュメントにするのがよい。
また、`p`や`h1`のような要素への直接のスタイル定義はできるだけ、避けてクラスを定義した上で、クラスセレクタにスタイルを定義するように心がける。

[Webデザインのスタイルガイドの作り方 | UX MILK]
(http://uxmilk.jp/67670)

#### スコープ
ある変数や関数などが特定の名前で参照される有効範囲のこと。変数や関数が使える範囲、影響する範囲をコントロールすることにより、保守性の高いプログラムを書くことが出来る。

#### カプセル化
オブジェクト指向プログラミングが持つ特徴の一つ。何かしらのデータや結果を返す処理の内部構造を外部から遮断し、機能を独立させるという考え方。


## 基本形


```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>サイトタイトル</title>
  </head>
  <body>
  </body>
</html>
```

## スタイルシートの読み込み

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>スタイルシート読み込みバージョン</title>
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
  </body>
</html>
```


## コンテンツ・サイドバーを追加

```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>スタイルシート読み込みバージョン</title>
    <link rel="stylesheet" href="css/reset.css">
    <link rel="stylesheet" href="css/style.css">
  </head>
  <body>
    <header class="header">
    </header>
    <div class="wrapper">
      <main class="main">
      </main>
      <div class="sidemenu">
      </div>
    </div>
    <footer class="footer">
    </footer>
  </body>
</html>
```



## 豆知識
### 接頭辞
- ヘッダーやフッター、メインコンテンツやサイドバーなどには、レイアウトカテゴリを用いる事がある。
上記のように比較的大枠のスタイルにID属性を付与する慣習があり、明示的に`l-`という接頭辞を付与する。
- レイアウトではなく、モジュールの場合は、`m-`や`mod-`を付けても良い。
- 常態を表すスタイルは`is`をつける。例： `is-hidden` `is-active`
    - JavaScriptで変化するスタイルに定義するため、複雑化するルールセットを上書くと同時に、同時に２つの常態が競合することは考えられないので、`!important`を使用しても良い。


参考：
はじめてのCSS設計
HTML5/CSS3モダンコーディング
Rails findとfind_eachの違い

find_eachはデータの量が多い時に用いる。
分割してレコードを取得して処理をする。
デフォルトで1000件ずつ処理をする。

スタート位置を変更したい場合は `start` オプションを用いる

取得件数を指定したい場合は `batch_size` オプションを用いる
HerokuにHeroku Postgresを導入してアプリケーションを動かしてみる2

# 前回のあらすじ

500番のエラーが出て動かない所。
今回はその問題を解決する。

# ローカル環境で試してみる
まずローカル環境で正常に動作するかを検証する。

<img width="1440" alt="スクリーンショット 2018-10-13 10.57.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/943f0ce5-fc16-fcb2-3e47-6c3dd5201dc0.png">

ローカル環境で動かした所、「Undefined variable: items」の文字がitemsが宣言されていないからか？
とりあえずBoardControllerの変数がitemになっていたのでitemsに変更。

<img width="1440" alt="スクリーンショット 2018-10-14 18.16.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/6c1eb9cc-11ad-7246-3e60-4b0078fa4ed9.png">

とりあえずローカル環境では動いた。
しかしheroku側ではうごかない。。。なぜ。

<img width="1440" alt="スクリーンショット 2018-10-14 18.19.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/94962984-8fac-272a-f7cf-9c35f5c65c45.png">

どうもこの記事によると.gitignoreが怪しいらしい。

[LaravelアプリケーションをHerokuにデプロイ後、謎のエラーに苦しんだ話]
(http://shigechi-64.hatenablog.com/entry/2018/01/08/195232)

編集してみたけどエラー。。。

<img width="1440" alt="スクリーンショット 2018-10-14 18.36.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/2bf281d3-e448-e7a2-9357-9fefe146c4ef.png">

Herokuが更新されているか確認。

```:commnad
heroku run bash
```
見た所大丈夫そう。うーん。なにが原因なのか。

この記事によるとlaravel　にデバッグモードがあるらしい。やってみよう。

[Laravel localhost works, but heroku gives 500 error]
(https://stackoverflow.com/questions/31665706/laravel-localhost-works-but-heroku-gives-500-error)

```:./config/app.php
/*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', true),
```

おっ！エラー内容が出てきた。

<img width="1440" alt="スクリーンショット 2018-10-14 20.20.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/c6733c0b-1363-0b5d-6b98-20321ce91225.png">


~~どうもControllerのat Model::all()でエラーが起きてるらしい。~~

単純にデフォルトの接続をpgsql(postgleSQL)に変更してあげればよかった見たい。

```database.php
'default' => env('DB_CONNECTION', 'pgsql'),
```

<img width="1440" alt="スクリーンショット 2018-10-15 16.29.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/268048/c71f3fbd-96b8-31f7-0b1b-bf34015d6ea2.png">

ひとまずトップページが見れたのでよかったよかった。
CognosAnalytics で折れ線グラフを作る

CognosAnalyticsを使っている方にとっては、朝飯前な内容かもしれないのですが自分はちょっとハマったのでメモ的に残すことにしました。

データを準備してパッケージも作り、後はグラフで書くだけというところからのお話です。
まず、「新規→レポート」でレポート編集画面に入ります。
さっそくグラフを追加しようと＋をクリックして、「視覚化」を選択します

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148873/fa258a29-8649-c987-85db-b366c88ada57.png)

すると、以下のように様々なグラフが選択できるような画面が表示されます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148873/cb7c0e26-0d70-48db-f0ec-ed47c6f66bcd.png)

如何にも良さそうなので、この折れ線グラフを選択しますが・・・
作成してみてもなかなか希望通りのグラフができない・・・なんていうことがあります。

そんな時は、グラフの種類を選択する画面で右上のギャラリーの変更をしてみます。
デフォルトでは、以下にあるとおり「新規の視覚化」が選ばれた状態になっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148873/462e917b-dd52-b3ba-715c-450f70c6d330.png)

これを、「グラフ」に変更してみましょう。
表示されるギャラリーがガラリと変わり種類も増えました。
折れ線グラフも、選択肢がかなり増えています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148873/6a051fbb-5f9d-9103-0e7d-f337b41ae621.png)


私の場合、めでたく「クラスター折れ線グラフ」というのを選択することで無駄に悩んでいた状況を解決でき、欲しいグラフを作成することができました。

意図通りのグラフが書けないと悩んでしまうとき、もしかすると上記のようにすると良いグラフを見つけられるかもしれません。
皆さんにも参考になれば幸いです。
iptables起動中にservice --status-all を実行すると「ファイアウォールは停止」と表示される

結論から書くと
**この表示は「iptables」ではなく「ip6tables」の状態を示しています。**

service ip6tables start
を実行し、ip6tablesが起動した状態になるとこの表示は消えます。

iptablesの状態にかかわらず「ファイアウォールは停止」と表示されるのはややこしいですね。。。
【MATLAB】AWGNで送信するための関数

```matlab
function [ RX ] = AWGNchannel( TX,EbNo,M )
%TX:送信シンボルベクトル
%M=多値数　QPSKなら2,16QAMなら4,64QAMなら6
temp_size = size(TX);
SNR = M*10^(EbNo/10);
No = 1/SNR;
noise = normal_rand(sqrt(No/2),temp_size(1),temp_size(2)) + 1j*normal_rand(sqrt(No/2),temp_size(1),temp_size(2));

RX = TX + noise;

end
```

```matlab

function [ output_args ] = normal_rand( sigma,height,width )
%sigma:生成したい正規分布の乱数の標準偏差
    output_args = sigma * randn(height,width);
end
```
WindowsServer 2012 R2でネットワークの場所を変更する方法

#概要
WindowsServer 2012 R2でネットワークの場所を変更する方法を記載します。

※PowerShellを使って変更する方法を記載します。

#PowerShellを使ってネットワークの場所を確認する

```ruby:PowerShell
Get-NetConnectionProfile 
```

#PowerShellを使ってネットワークの場所を変更する

**プライベートに変更する場合**

```ruby:PowerShell
Get-NetConnectionProfile | where Name -eq "<ネットワーク名＞" | Set-NetConnectionProfile -NetworkCategory Private
```

**パブリックにする場合**

```ruby:PowerShell
Get-NetConnectionProfile | where Name -eq "<ネットワーク名＞" | Set-NetConnectionProfile -NetworkCategory Public
```

#補足

ネットワークの場所が変更されるとファイアウォールの設定も変更されてしまうので気を付けましょう。
【MATLAB】64QAM変復調用の関数

#BPSK→64QAM

```matlab
function [ TX_64QAM ] = bit_2_64QAM( TX_bit )

temp_size = size(TX_bit);

TX_bit1 = TX_bit(:,1:3:end);
TX_temp = TX_bit(:,2:3:end) + 1j*TX_bit(:,3:3:end);

TX_temp2 = zeros(temp_size(1),length(TX_bit)/3);
TX_temp2(and(TX_bit1 < 0 , TX_temp == 1-1j)) = -1;
TX_temp2(and(TX_bit1 < 0 , TX_temp == 1+1j)) = -3;
TX_temp2(and(TX_bit1 < 0 , TX_temp == -1+1j)) = -5;
TX_temp2(and(TX_bit1 < 0 , TX_temp == -1-1j)) = -7;
TX_temp2(and(TX_bit1 > 0 , TX_temp == 1-1j)) = 1;
TX_temp2(and(TX_bit1 > 0 , TX_temp == 1+1j)) = 3;
TX_temp2(and(TX_bit1 > 0 , TX_temp == -1+1j)) = 5;
TX_temp2(and(TX_bit1 > 0 , TX_temp == -1-1j)) = 7;

TX_64QAM = (TX_temp2(:,1:2:end)  + 1j *TX_temp2(:,2:2:end))/sqrt(42);

end
```

#64QAM受信信号→64QAM硬判定

```matlab
function [ RX_symbol ] = QAM64_2_symbol( RX_64QAM )
%QAM64_2_SYMBOL この関数の概要をここに記述
%   詳細説明をここに記述
RX_64QAM_I = real(RX_64QAM)*sqrt(42);
RX_64QAM_Q = imag(RX_64QAM)*sqrt(42);

RX_64QAM_I(RX_64QAM_I > 6) = 7;
RX_64QAM_I(and(RX_64QAM_I < 6 , RX_64QAM_I > 4)) = 5;
RX_64QAM_I(and(RX_64QAM_I < 4 , RX_64QAM_I > 2)) = 3;
RX_64QAM_I(and(RX_64QAM_I < 2 , RX_64QAM_I > 0)) = 1;
RX_64QAM_I(and(RX_64QAM_I < 0 , RX_64QAM_I > -2)) = -1;
RX_64QAM_I(and(RX_64QAM_I < -2 , RX_64QAM_I > -4)) = -3;
RX_64QAM_I(and(RX_64QAM_I < -4 , RX_64QAM_I > -6)) = -5;
RX_64QAM_I(RX_64QAM_I < -6) = -7;

RX_64QAM_Q(RX_64QAM_Q > 6) = 7;
RX_64QAM_Q(and(RX_64QAM_Q < 6 , RX_64QAM_Q > 4)) = 5;
RX_64QAM_Q(and(RX_64QAM_Q < 4 , RX_64QAM_Q > 2)) = 3;
RX_64QAM_Q(and(RX_64QAM_Q < 2 , RX_64QAM_Q > 0)) = 1;
RX_64QAM_Q(and(RX_64QAM_Q < 0 , RX_64QAM_Q > -2)) = -1;
RX_64QAM_Q(and(RX_64QAM_Q < -2 , RX_64QAM_Q > -4)) = -3;
RX_64QAM_Q(and(RX_64QAM_Q < -4 , RX_64QAM_Q > -6)) = -5;
RX_64QAM_Q(RX_64QAM_Q < -6) = -7;

RX_symbol = (RX_64QAM_I + 1j * RX_64QAM_Q)/sqrt(42);

end
```

#64QAM硬判定→BPSK
```matlab
function [ RX_bit ] = symbol_2_bit_64QAM( RX_symbol )
%SYMBOL_2_BIT_64QAM この関数の概要をここに記述
%   詳細説明をここに記述
temp_size = size(RX_symbol);

RX_temp = zeros(temp_size(1),temp_size(2)*2);
RX_temp(:,1:2:end) = real(RX_symbol) * sqrt(42);
RX_temp(:,2:2:end) = imag(RX_symbol) * sqrt(42);

RX_bit1 = zeros(temp_size(1),length(RX_symbol)*2);
RX_bit2 = zeros(temp_size(1),length(RX_symbol)*2);
RX_bit3 = zeros(temp_size(1),length(RX_symbol)*2);

RX_bit1(RX_temp > 0) = 1;
RX_bit1(RX_temp < 0) = -1;

RX_bit2(abs(RX_temp) < 4) = 1;
RX_bit2(abs(RX_temp) > 4) = -1;

RX_bit3(abs(RX_temp) < 2) = -1;
RX_bit3(and(abs(RX_temp) < 6 , abs(RX_temp) > 2)) = 1;
RX_bit3(abs(RX_temp) > 6) = -1;

RX_bit = zeros(temp_size(1),length(RX_symbol)*6);
RX_bit(:,1:3:end) = RX_bit1;
RX_bit(:,2:3:end) = RX_bit2;
RX_bit(:,3:3:end) = RX_bit3;

end
```
PHP　基本的なfor文

昨年から少しずつやっていたPHPに関して書きたいと思います。

まずは思い出していくために、基本的なfor文を使ってやりました。

開発環境はterapadとxammpとMicrosoft Edgeです。

Windows 10で行っています。

それでは本日書いたPHPのソースコードです。
````PHP sample.php
<?php 

 for($i = 1; $i < 10; $i++){
	echo "Hello World";
 }
```````
上記のように書くと、結果はこうなります。
![2018-10-15 (1).png](https://qiita-image-store.s3.amazonaws.com/0/200171/680fa9f2-48b3-c970-2df8-66fb3865d5e0.png)

横に、Hello worldと出力されます。

これを縦に出力したいな、という場合にはこうなります。
``````PHP sample1.php
<?php 

 for($i = 1; $i < 10; $i++){
	echo "Hello World"."<br>";
 }
`````

結果も見てみましょう。

![2018-10-15 (3).png](https://qiita-image-store.s3.amazonaws.com/0/200171/d696a3a6-4c6a-3189-c083-034330587f46.png)

何が変わったかというと、

echo "Hello world"と書かれたところの後にbrと

入っているか、入っていないかの違いになります。

このbrタグは何を示しているかというと、改行を示しています。

brタグがない場合には横に表示され、brタグを入れると縦に表示されます。

初歩的な内容ではありますが、とても大事な事です。

物は試し、でPHPをはじめて見るのもいいかと思います。
【MATLAB】16QAM変復調の関数

#BPSK→16QAM
```matlab
function [ output_args ] = bit_2_16QAM( TX )

TX2 = (TX(:,1:2:end) + 1j*TX(:,2:2:end))/sqrt(2);
TX2(TX2 == (-1-1j)/sqrt(2)) = -3;
TX2(TX2 == (-1+1j)/sqrt(2)) = -1;
TX2(TX2 == (1-1j)/sqrt(2)) = 3;
TX2(TX2 == (1+1j)/sqrt(2)) = 1;

output_args = (TX2(:,1:2:end) + 1j*TX2(:,2:2:end))/sqrt(10);


end
```
#16QAM受信信号→16QAM硬判定

```matlab

function [ output_args ] = QAM16_2_symbol( input_args )

Real_RX = real(input_args);
Imag_RX = imag(input_args);

Real_RX((Real_RX) > 2/sqrt(10)) = 3/sqrt(10); 
Real_RX(and(Real_RX < 2/sqrt(10) , Real_RX > 0)) = 1/sqrt(10);
Real_RX(and(Real_RX > -2/sqrt(10) , Real_RX < 0)) = -1/sqrt(10); 
Real_RX(Real_RX < -2/sqrt(10)) = -3/sqrt(10); 

Imag_RX(Imag_RX > 2/sqrt(10)) = 3j/sqrt(10); 
Imag_RX(and(Imag_RX < 2/sqrt(10) , Imag_RX > 0)) = 1j/sqrt(10);
Imag_RX(and(Imag_RX > -2/sqrt(10) , Imag_RX < 0)) = -1j/sqrt(10); 
Imag_RX(Imag_RX < -2/sqrt(10)) = -3j/sqrt(10); 

output_args = Real_RX + Imag_RX;

end
```
#16QAM硬判定→BPSK
```matlab

function [ output_args ] = symbol_2_bit_16QAM( input_args )
%SYMBOL_2_BIT この関数の概要をここに記述
%   詳細説明をここに記述
temp_size = size(input_args);
output_args = zeros(temp_size(1),length(input_args)*4);

temp = input_args*sqrt(10);
RX_Real = real(temp);
RX_Imag = imag(temp);
RX_16QAM_bit = zeros(temp_size(1),length(input_args)*2);
RX_16QAM_bit(:,1:2:end) = RX_Real;
RX_16QAM_bit(:,2:2:end) = RX_Imag;
RX_16QAM_bit(RX_16QAM_bit == 3) = (1-1j);
RX_16QAM_bit(RX_16QAM_bit == 1) = (1+1j);
RX_16QAM_bit(RX_16QAM_bit == -1) = (-1+1j);
RX_16QAM_bit(RX_16QAM_bit == -3) = (-1-1j);
Real_16QAM = real(RX_16QAM_bit);
Imag_16QAM = imag(RX_16QAM_bit);

output_args(:,1:2:end) = Real_16QAM;
output_args(:,2:2:end) = Imag_16QAM;

end
```
学協会にslackは導入できたのか？-導入から約3週間時点での感触やメモ

学協会にslackは導入できたのか？-導入から約3週間時点での感触やメモ



slack提案～導入初期：

提案~口説き文句
・無料
・試験導入
・情報共有

・コミュニケーション
・みんな使ってますよ
・導入事例（NASA,IBM...）
・働き方改革
・リモート（台風とか育児介護とか。単純に楽、単身者でも洗濯とか銀行とか）




<b>導入初期</b>
・小さく始める
・勝手に始める
・slackはべんり、良い、楽しいという刷り込み
  -即レスを心がける。
  -絵文字で積極的に反応する。
  -便利機能は早めにレクチャ（リマインダ）

<hr>

<h2>導入初期の基本操作教育</h2>
<ul> 
<li>1W　基本操作3種</li>
<li>2W　さらに便利に使うための操作3種</li>
<li>3W　メール転送、通知設定、その他必要なこと</li>
</ul>

<h3>▼これだけは抑えておきたい基本操作3つ</h3>
<ol> 
<li>メッセージを書く</li>
<li>メンション</li>
<li>メッセージに対するアクション（絵文字、引用返信）</li>
</ol> 


<h3>▼slackをより快適に使うための操作3つ</h3>
<ol> 
<li>チャンネルに入ろう＆出よう</li>
<li>リマインド</li>
<li>メッセージの検索</li>
</ol> 

<p>
はじめはあえて詳しく説明せずに、まずはそれぞれ使ってもらう。
<br>獅子は千尋の谷スタイル。
<br>率先して、様々な機能を使い、こういうのもあるのか、と思わせる作戦。
<br>頃合いをみて、基本操作3種について改めて解説。
<br>
<br>読んだらリアクションしてね！を折に触れアピール（承認欲求でなく、読んだのかどうかまじでわからないので）
<br>操作に戸惑っている人には特に対面、マンツーマンで詳しく説明。
<br>マンツーマン説明すると、どこに引っかかっていたのか発見することも。
<br>
<br>はじめはとにかく基本操作を徹底する。
<br>社内メールでの連絡があった時にも、それslackでやりません？と誘導する。
<br>
<br>質問があったときは、その内容を#tipsチャネルにバンバン共有する。
</p>



<hr>

学協会にslackは導入できたのか？
導入から約3週間時点での感触


事務局内では導入移行、slackが浸透してきた。
「じゃ、あとはslackに書いておくから」なんていう会話も聞こえてくるようになった。
外部のやりとりはメールがメインになるが、職場内ではslackということでこのまま定着しそう（やった！）


委員会（外部の大学、企業などほ含む）での導入は、現在のところ難しい。
-対面で説明できる機会が少ない。
-所属機関によっては、セキュリティの都合でslackが使えないらしい（NASAでも使ってるよ、と言いたいけど言えない）
-もともとメーリングリストでの議論もそこまで活発では無かった（時々議論が盛り上がってメールの応酬が多くなることはあるが）



<b>学び</b>
-思ってもみなかったポイントで操作に躓いていることがあった。たとえば、絵文字リアクションは直近のコメントにしか行えないという思い込み（？）をしている人もいた。ツールに対するセンス、感覚は人によって異なる。
-#tipsチャネルに一度流したことでも、質問があれば根気強く説明する必要がある。
-反応がなくてもめげない、反応して！と呼びかける。




<b>今後の課題</b>
-有料プランに移行するかどうか
-外部機能との連携（そもそもの業務の在り方、データ管理の方法、方針のテコ入れ）
【MATLAB】QPSK変復調用の関数

##QPSK変調用の関数
入力ベクトルは{$-1,1$}のBPSK変調信号の系列としてください。

```matlab
function [ TX_qpsk ] = bit_2_QPSK( TX )

TX_qpsk = (TX(:,1:2:end) + 1j*TX(:,2:2:end))/sqrt(2);

end
```

##QPSK変調の受信信号に対する硬判定用の関数

```matlab
function [ output_args ] = QPSK_2_symbol( input_args )

Real_RX = real(input_args);
Imag_RX = imag(input_args);

Real_RX(Real_RX > 0) = 1/sqrt(2); 
Real_RX(Real_RX < 0) = -1/sqrt(2); 

Imag_RX(Imag_RX > 0) = 1j/sqrt(2); 
Imag_RX(Imag_RX < 0) = -1j/sqrt(2); 

output_args = Real_RX + Imag_RX;

end
```

##硬判定されたQPSK受信信号をBPSK信号に直すための関数
```matlab

function [ output_args ] = symbol_2_bit_QPSK( input_args )

temp_size = size(input_args);

output_args = zeros(temp_size(1),temp_size(2)*2);

RX_Real = real(input_args)*sqrt(2);
RX_Imag = imag(input_args)*sqrt(2);
output_args(:,1:2:end) = RX_Real;
output_args(:,2:2:end) = RX_Imag;

end
```
PowerShellでファイルの一覧を取得する

#やりたい事
- エクスプローラー上で、選択したフォルダ内に存在するファイル一覧を取得したい。
- 取得した一覧を加工しやすいようにテキストファイルに出力したい。

##PowerShellでバッチを作成
DOSでも可能だが、対象のパスにスペースが入っていた場合に面倒なのでPowerShellで行う。

```list.ps1
Get-ChildItem $args -Name > list.txt

Start list.txt
```

##作成したバッチのショートカットを「送る」へ登録する
###Windows8以前の場合
スタートメニューまたはスタート画面の検索窓に「shell:sendto」と入力し、ショートカットを配置する。
配置するショートカット名は、送るメニューにそのまま表示されるので、適当な名前に変更する。
###Windows10の場合
下記フォルダにショートカットを配置する。
**%AppData%\Roaming\Microsoft\Windows\SendTo**

※だいたいは
**C:\Users\[ユーザー名]\AppData\Roaming\Microsoft\Windows\SendTo**

##配置したショートカットのプロパティを開き、リンク先を変更する
ps1ファイルそのままのショートカットでは、送るメニューに表示されない為。

例）Cドライブ直下にps1ファイルを配置していた場合
**powershell -f C:\list.ps1**

##終わり
あとはファイル一覧を取得したいフォルダを選択し、送るメニューに追加されたアイテムをクリックすればメモ帳（既定のプログラムを変更していない限り）が立ち上がり、ファイルの一覧が表示されている。
【MATLAB】各種変調方式のAWGN通信でのBER特性

以下のコードを実行すれば各種変調方式(BPSK,QPSK,16QAM,64QAM)におけるBER特性を求められるはずです。

```matlab
clear all

Nt = 2; %送信アンテナ数
L = 6 * 10^6; %送信ビット数
EbNo = 0:16;

RX_bpsk_symbol = zeros(Nt,L);
RX_bpsk_bit = zeros(Nt,L);

BER = zeros(4,length(EbNo));

for count_s = 1:length(EbNo)
    TX_bit = randi([0 1],Nt,L);

    TX_bpsk = ones(Nt,L);
    TX_bpsk(TX_bit == 0) = -1;

    TX_qpsk = bit_2_QPSK(TX_bpsk);
    TX_16qam = bit_2_16QAM(TX_bpsk);
    TX_64qam = bit_2_64QAM(TX_bpsk);

    RX_bpsk = AWGNchannel(TX_bpsk,EbNo(count_s),1);
    RX_qpsk = AWGNchannel(TX_qpsk,EbNo(count_s),2);
    RX_16qam = AWGNchannel(TX_16qam,EbNo(count_s),4);
    RX_64qam = AWGNchannel(TX_64qam,EbNo(count_s),6);
    
    RX_bpsk_symbol(real(RX_bpsk) < 0) = -1;
    RX_bpsk_symbol(real(RX_bpsk) > 0) = 1;
    
    RX_qpsk_symbol = QPSK_2_symbol(RX_qpsk);
    RX_16qam_symbol = QAM16_2_symbol(RX_16qam);
    RX_64qam_symbol = QAM64_2_symbol(RX_64qam);
    
    RX_bpsk_bit(RX_bpsk_symbol == 1) = 1;
    RX_bpsk_bit(RX_bpsk_symbol == -1) = 0;
    
    RX_qpsk_bit = symbol_2_bit_QPSK(RX_qpsk_symbol);
    RX_16qam_bit = symbol_2_bit_16QAM(RX_16qam_symbol);
    RX_64qam_bit = symbol_2_bit_64QAM(RX_64qam_symbol);
    
    RX_qpsk_bit(RX_qpsk_bit == 1) = 1;
    RX_qpsk_bit(RX_qpsk_bit == -1) = 0;
    RX_16qam_bit(RX_16qam_bit == 1) = 1;
    RX_16qam_bit(RX_16qam_bit == -1) = 0;
    RX_64qam_bit(RX_64qam_bit == 1) = 1;
    RX_64qam_bit(RX_64qam_bit == -1) = 0;

    BER(1,count_s) = sum(abs(TX_bit(:) - RX_bpsk_bit(:)))/(Nt*L);
    BER(2,count_s) = sum(abs(TX_bit(:) - RX_qpsk_bit(:)))/(Nt*L);
    BER(3,count_s) = sum(abs(TX_bit(:) - RX_16qam_bit(:)))/(Nt*L);
    BER(4,count_s) = sum(abs(TX_bit(:) - RX_64qam_bit(:)))/(Nt*L);
    disp(['Eb/No = ' num2str(EbNo(count_s)) ' finished !'])
end
```

QPSK関連の関数の中身はこちら：https://qiita.com/Seiji_Tanaka/items/f8958c6d2f4b4780de5b
16QAM関連の中身はこちら：https://qiita.com/Seiji_Tanaka/items/add956f5a692bc18cf65
64QAM関連の中身はこちら：https://qiita.com/Seiji_Tanaka/items/2a3c822bdfea6dcf5412
AWGNchannelの中身はこちら：https://qiita.com/Seiji_Tanaka/items/f033e56b54e596637bfa

グラフ出力用のコードも貼っておきます。

```matlab
figure

semilogy(EbNo,BER(2,:),'-^','Color',[252,200,0]./255,'LineWidth',3,'MarkerSize',12,'MarkerFaceColor',[1,1,1])
 hold on
semilogy(EbNo,BER(3,:),'-s','Color',[0,145,197]./255,'LineWidth',3,'MarkerSize',12,'MarkerFaceColor',[1,1,1])
hold on
semilogy(EbNo,BER(4,:),'-v','Color',[40,182,89]./255,'LineWidth',3,'MarkerSize',12,'MarkerFaceColor',[1,1,1])
grid on

set(gca,'FontSize',20);

ax = gca;
ax.LineWidth = 2;

set( gca, 'FontName','Times','FontSize',20 ); 

ylim([10^(-6) 10^(-0)])
xlim([EbNo(1) EbNo(end)])

xlabel('{\sl E}_{\rm b}/{\sl N}_{\rm 0} [dB]','FontSize',20,'Interpreter','tex')
ylabel('BER','FontSize',20)
lgd = legend({'QPSK','16QAM','64QAM'},'Location', 'best');
lgd.FontSize = 12;
```


![untitled.jpg](https://qiita-image-store.s3.amazonaws.com/0/271946/cb61a384-d0a4-3664-bc31-a9e0dbc18313.jpeg)

こんな感じで結果がグラフが出力されます。
SlackのAPIで取得できる「user_name」とは

# はじめに

Slackの日本語化し，設定項目も色々変わっている．

Outgoing Webhooksで取得できる `user_name` は，Slackアプリ上の設定項目には無い．
では，どこにあるのか．

# user_nameとは
## 以前はどこに
かつて，日本語化する前の設定項目には，「氏名」「表示名」の代わりに「Full Name」と「username」があったと記憶している．（Full Nameは，姓・名でフォームが分かれていた）

おそらく，設定項目がわかりにくいなどといった判断がされたのだろう，メンションなどに使われる名前は「表示名（任意入力）」となった．

## いまの場所
現在では，変更場所はWeb上へと移った．

Web上でプロフィールを編集するページに移っている．

<img width="339" alt="スクリーンショット 2018-10-15 14.57.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/170435/eb4c6f28-763b-e80e-42f9-b2636d4d7142.png">

赤枠をクリックした時に開かれるWebページの一番下にある．
（閉じられていくので「開く」を押すと展開される）

<img width="916" alt="スクリーンショット 2018-10-15 15.02.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/170435/8e1190b5-6e39-fb03-6ca8-dbc2e1370d37.png">

ここで確認・変更が可能になっている．


この場所でしか変更できないようになっている．
なので，　Outgoing Webhooksなどで取得できる `user_name` を変更したい場合は，ここを編集しなければ変更されない．
**Slackアプリ上のプロフィールで，氏名や表示名をいくら変更しても変わらないのだ．**


## ユーザー名のデフォルト設定

ユーザー名の仕様が追加される前からあるワークスペースの場合，おそらく当時の「username」がそのまま使われているはずだ．
一方，この機能が実装された後にワークスペースを建てた（新しくチームを作った）場合，「メールアドレスの＠より前」の文字列が使われている模様．

そのため，人によっては，Slack上の表示名と全く関係のないものになっているかもしれない．
が，特段気にする必要はないだろうと思う．（普段見えないし）

たとえば，自分のSlackチームのAPIなどを使っている人から変更するよう言われたりだとか，ユーザー名も統一しとかないと気になる人だとか，変更する人はそのくらいだろう（僕は後者だった）


## APIを使う上でどうすればいいのか

それで，実際にAPIを使用するとき，ユーザー名をそのまま使用すると表示名と関係ない名前になってしまう可能性がある．
それでも問題ない場合はいいのだが，チームの人も閲覧するだとかで表示名との統一をしなければいけないときはそうも言ってられない．

ユーザーID（ユーザーごとにユニークで振られる英数字）は変わらないので，それを使ってメンバー一覧APIなどから取得するのが一番整合性が取れる方法だろう．

上のSlackアプリ内のスクショで黒塗りしてある場所が，自分のユーザーIDとなる．チーム全員の情報が欲しい場合は，メンバー一覧API( `users.info` )を叩けば取得できる．
PhpStormで「:void」や戻り値型の入力疲れを解消する設定

PhpStormの[Live Template](https://www.jetbrains.com/help/phpstorm/using-live-templates.html)はメソッドをはやしたりするときに便利だが、メソッドの戻り値の型を書くためにカーソル移動しなければならず入力にもたつく。

型宣言でもたつく例:

![before.gif](https://qiita-image-store.s3.amazonaws.com/0/889/19e0ac97-16da-93b9-c182-7195869c6080.gif)

## 解消法

これを解消するには、「Preference」→「Editor」→「Live Templates」→「PHP」→「pubf」を開き、テンプレートに`: $RETURN_TYPE$`を追記する。そのうえで、「Edit Variables」を開く。

<img width="1115" alt="Preferences.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7f58b67b-9a94-26ab-0584-114876f70161.png">

`RETURN_TYPE`の「Expression」に`"void"`(ダブルクオートつき)と入力し、「OK」を押す。

<img width="526" alt="Edit_Template_Variables.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/f31f9f73-7f60-8f76-9636-202342e16cec.png">

## 解消後の動作

次のように`:void`が入力されたテンプレートが展開される。

![after.gif](https://qiita-image-store.s3.amazonaws.com/0/889/aa630ff6-04c2-0a05-305b-7d7af1e23e9d.gif)

また、戻り値の型を変えたいときもタブキーを押していけば、`void`のところまでジャンプできるので便利である。

![after2.gif](https://qiita-image-store.s3.amazonaws.com/0/889/2d2893c2-7c81-c5ac-732f-01d43e947b3b.gif)
複数アカウトでtwittering-modeを使う

意外と簡単に実現できたので備忘録として残しておきます。

gpg(GNU Privacy Guard)ファイルをアカウントごとに生成し、バッファーや基本設定部分をその都度リッセトしながら切り替えているだけです。設定を見ていただければ、"な〜んだ(^o^)" という落ちでしょうね。

## 設定

````lisp
;; Clear existing twit buffers
(defun my/reload-twit ()
  (mapcar
   (lambda (buffer)
     (twittering-deactivate-buffer buffer)
     (kill-buffer buffer))
   (twittering-get-buffer-list))
  (twittering-unregister-killed-buffer)
  ;; Clear variables
  (setq twittering-private-info-file-loaded nil)
  (setq twittering-account-authorization nil)
  (setq twittering-oauth-access-token-alist nil)
  (setq twittering-buffer-info-list nil)
  (setq twittering-timeline-data-table (make-hash-table :test 'equal))
  (twit))

(defun my/twit-1 ()
  (interactive)
  (setq twittering-private-info-file 
        (expand-file-name "~/.twittering-mode.gpg"))
  ;; timeline to read on startup
  (setq twittering-initial-timeline-spec-string '("minoruGH" ":mentions" ":home"))
  (my/reload-twit))

(defun my/twit-2 ()
  (interactive)
  (setq twittering-private-info-file 
        (expand-file-name "~/Dropbox/dotfiles/twittering-mode2.gpg"))
  ;; timeline to read on startup
  (setq twittering-initial-timeline-spec-string '("gospelhaiku" ":mentions" ":home"))
  (my/reload-twit))

;; Twitterring-mode settings
(use-package twittering-mode)
(setq twittering-use-master-password t)

;; 以降、必要な共通設定を書きます。

````

## Twitterの公式アプリで複数アカウントを切り替える
紐付けのメールアドレスさえ確保できれば、複数アカウントの取得は何も問題ありませんが、
Emacsのtwittering-modeで複数環境を構築するには、アカウントごとにgpgファイルを生成させる必要があります。

そのために公式アプリで複数アカウントを切り替えられる用に設定しておくと便利です.

- [複数アカウントを公式アプリで切り替える方法](https://pc-etcetera.com/twitter-9/) 

## アカウントごとの twittering-mode.gpg を作る
いろんなやり方があると思いますが、私が試した最も手っ取り早い方法を紹介しておきます。

1. 上記で紹介した「複数アカウントを公式アプリで切り替える」準備ができたら、まずChromeとかのプラウザを起動し、まずサブのアカウントでログインしておきます。
2. 次にEmacsからtwittering-modeを起動するとプラウザがログイン中のTwitterとの連携を聞いてくるので承認するとPINコードが表示されるのでmini-bufferにコピーしてEnterします。
3. つづいてgpgのパスフレーズを聞かれるので任意のパスワードを入力（2回）するとTimelineが表示されます。
4. いちどEmacsを閉じて、~/.twittering-mode.gpg が作成されているか確認し、無事生成されていたらそのファイルをどこか別の場所に移動します。コピーではなく移動です。
5. 上記の設定例では、~/Dropbox/dotfiles/ に移動して、twittering-mode2.gpg にリネームしています。
6. プラウザでログインしているサブアカウントをログアウトして、メインのアカウントにログインし直します。
7. 以後、サブアカウントのときと同様の手順で、~/.twittering-mode.gpg を生成させます。
8. 以上で準備完了です。

Emacsを再起動して、 ````M-x my/twit-1```` / ````M-x my/twit-2```` と切り替えてみましょう。Emacsを起動するたびにgpgのパスフレーズを聞かれるのはやむを得ませんが、快適に切り替わるはずです。
Concourseでdocker-image-resourceを使うときのyamlメモ

こんな感じで指定して使う。
(どこか間違えていたのか上手くいかなくて困ったので、今後の個人的なコピペ用)

```yaml
resources:
- name: dockerhub-repo
  type: docker-image
  source:
    repository: neilli/something-repo
    username: neilli
    password: xxxxxxxxxxxxxxxxxxx

- name: ecr-repo
  type: docker-image
  source:
    repository: 000000000000.dkr.ecr.us-east-1.amazonaws.com/something-repo
    aws_access_key_id: XXXXXXXXXXXXXXXXXXXX 
    aws_secret_access_key: ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
```
GASでLINEbotを作る

Google Apps Scriptを使ってlineのおうむ返しボットをコピペで作れるサンプルをご紹介します。


## 準備

### 1. Line develope登録。

URL：https://developers.line.me/ja/


参考(<a href=https://qiita.com/yoshizaki_kkgk/items/bd4277d3943200beab26 target="_blank">https://qiita.com/yoshizaki_kkgk/items/bd4277d3943200beab26<a>)


### 2. Messaging apiでChannelを作る

* プロバイダーを作成


<a href=https://developers.line.me/console/ target="_blank">Messaging API</a>で以下を設定

* アプリアイコン画像
* アプリ名
* アプリ説明
* プラン(Developer Trial,フリーがあるがDeveloper Trial
  でおっけー)
* 大業種,小業種
* メールアドレス

(割と適当でおっけーです。)

利用規約に同意し、チャンネルができたら、QRコードで友達追加し、自動メッセージが送られて来たら準備完了です！
あとで、戻ってくるのでこのページは閉じないで下さい。


## GASの準備
<a href=https://drive.google.com/drive/u/0/my-drive target="_blank">Google Drive</a>から新規=>その他=>アプリを追加
<img width="737" alt="GAS.png" src="https://qiita-image-store.s3.amazonaws.com/0/220907/924b4085-c568-1277-d473-5e0d50b33cf9.png">


Google Apps Scriptを選択し、追加します。
その後、新規ファイルから作成可能になります。



## 実装部分
* 上でGASの新しいファイルを作り以下をコピペして下さい。


```js:line_bot.gs
var CHANNEL_ACCESS_TOKEN = 'YOUR_CHANNEL_ACCESS_TOKEN'; // Channel_access_tokenを登録

function doPost(e) {
  var event = JSON.parse(e.postData.contents).events[0];
  var replyToken= event.replyToken;

  if (typeof replyToken === 'undefined') {
    return; // エラー処理
  }
  var userId = event.source.userId;
  var nickname = getUserProfile(userId);

  if(event.type == 'follow') { 
    // ユーザーにbotがフォローされた場合に起きる処理
  }

  if(event.type == 'message') {
    var userMessage = event.message.text;
    // 今回は鸚鵡返しなので届いたメッセージをそのまま返します。
    var replyMessage = userMessage 

    // もし届いたユーザーからのメッセージによって他にやりたい処理
    // (ex: spread sheetへの記入など)がある場合は、ここに入れて下さい。

    var url = 'https://api.line.me/v2/bot/message/reply';

    UrlFetchApp.fetch(url, {
      'headers': {
        'Content-Type': 'application/json; charset=UTF-8',
        'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
      },
      'method': 'post',
      'payload': JSON.stringify({
        'replyToken': replyToken,
        'messages': [{
          'type': 'text',
          'text': replyMessage,
        }],
      }),
    });
    return ContentService.createTextOutput(
      JSON.stringify({'content': 'post ok'})
    ).setMimeType(ContentService.MimeType.JSON);
  }
}

// profileを取得してくる関数
function getUserProfile(userId){ 
  var url = 'https://api.line.me/v2/bot/profile/' + userId;
  var userProfile = UrlFetchApp.fetch(url,{
    'headers': {
      'Authorization' :  'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
  })
  return JSON.parse(userProfile).displayName;
}

```
## 公開

1. 再びMessaging APIのページに戻り、Channel access tokenを発行(その時出てくるログは無視して大丈夫です。)し、それをGASの一番上の行の`YOUR_CHANNEL_ACCESS_TOKEN`のところに貼り付けて下さい。

2. これで、GAS部分は完成で。メニューバーから`公開`=>`Webアプリケーションとして導入`をクリックし、表示される作成手順に従って記入を進めて下さい。(公開範囲は`全員(匿名ユーザーも含む)`にします。)

3. 最後に表示されたURLをコピーしMessaging APIで`Use webhooks`を有効にし、`Webhook URL`のところに貼り付けます。
4. `Verify`をクリックし、チェックマークがついたら成功です。(メッセージを送って確認して見ましょう。)

※注意: GASを公開したあと、修正して再び公開する場合必ずバージョンを新規作成して下さい。そのままだと、反映されない可能性があります。
Scala で JSON のための  Enum をシールドクラスで作る

```scala
sealed abstract class BloodType(val code: Int)
object BloodType {
    case object A extends BloodType(0)
    case object B extends BloodType(1)
    case object AB extends BloodType(2)
    case object O extends BloodType(3)
    val map: Map[Int, BloodType] = getClass.getClasses
        .map(_.getField("MODULE$").get(null).asInstanceOf[BloodType])
        .map(x => x.code -> x).toMap
}
```
```scala
import play.api.libs.json._

implicit val format = new Format[BloodType] {
    override def writes(o: BloodType): JsValue = JsNumber(o.code)

    override def reads(json: JsValue): JsResult[BloodType] = json.asOpt[Int]
        .flatMap(code => BloodType.map.get(code))
        .fold(JsError("error"))(v => JsSuccess(v))
}
```