OmniAICreator/Qiita-1.07M huggingface dataset:
コードが書けないのはウェブデザイナーではない！


って書きましたが、そんなことはないと思います；

今は私バリバリコード書いているのですが、昔はデザインだけ作る人でした。まぁやっぱりコードは書けた方が便利だよなと思うので、私がコーディングを習得した経緯を振り返って見ます。

## 最初はコードが書けないウェブデザイナー
最初のころは私はPhotoshopでデザインだけ作ってコーダーにそれを渡すだけのWebデザイナーでした。

それでもやっぱり仕事していく中でHTMLとCSSを触る機会はやってくるので、仕事をふられて難しそうだなぁと思っても大体「できます」と見栄を切って自分で自分を追いつめながら仕事の中で覚えていきました。

「できます」と言ってできなかったらめちゃくちゃ怒られるし、みんなに迷惑かけますからね。そう言っちゃった時点で結構必死になるんですね。

ただ、本当にどうにもできそうにないものは正直に「できません」って言ってました。

## 小さい会社だったから色々させてもらえて良かったかも

そういうチャレンジをどんどんさせてくれる職場なんかだと成長の度合いも違うかもしれませんね。ベンチャーや小さい会社なんかはそう意味で色々やらせてくれるのでいいかもしれません。
少しでもHTMLやらCSSのコードの書き方を覚えると後は加速度的に技術を習得できます。

そして面白いものでそうやって仕事の中で覚えてくると楽しくなって
色々調べてコードを書きたくなっていきました。

なのである程度わかってくると家に帰っても自分で色々調べて習得していって、加速度的に技術を習得することができると思います。HTMLとかCSSを覚えたらjQueryとかもなんとなくわかるのでJavascriptもなんとなくわかってきます。

## やはりコーディングを学び始めた最初がきついですね。

なので、産みの苦しみではないのですが

最初の駆け出しのころの技術が身に付いてないときが一番苦しいかもしれません。

その一番最初でつまづくと習得できずにコードを書くのを諦めてしまったりするのかもしれません。

つまづかないコツとしては、やはり<u>「あせらない（すぐに結果を求めない）」</u>ことが大事かなと思います。
どうしても、習得の時間には個人差があるものです。

## グラフィックデザイン畑からプログラミング習得ってのは時間かかるよね

それまでにある程度なにかしらプログラミングをやった経験のある人などはすぐに習得できてしまう人もいるのではないでしょうか？

ただやっぱり今までグラフィックデザイン一本で来た人がコードを書く技術を習得するには、結構時間がかかるんではないかな？と思います。自分自身コードが書けるようになったなと思えるようになったのはウェブ業界に入って３年ぐらいたってからでした。（おそっ！）


その中であせらずにコツコツやっていけば必ず書けるようになると自分に言い聞かして、あきらめないってことが一番大事なのかな？と思います。

あとはつまづく、つまづかない関係なく「絶対習得してやる！」と自分を追い込むということも大事ですかね？

## 私のウェブデザイナーへの転向事情

自分の場合、印刷物の制作会社からウェブ制作会社に転職したので、その時点でウェブの技術を習得せざるおえなかったですし、逆を言えばウェブのことだけさせてもらえたので（それでも３年かかりましたがｗ）それがよかったかな？とは思います。

例えば、転職した会社が広告代理店の制作だったりしたらウェブ以外にも紙やCMの制作など色々やらないといけないので、もしこういった環境だったらコードを書く技術を習得するのはもっと時間がかかったのではないかな？（もちろん個人差はあると思います）と思っています。

## 今時はフロントエンドエンジニアっていうらしいね
そうですね。昔よりフロントエンドはやることが増えてるし、そうなりますよね。自分の友達でも最初大学でC言語とか学んでた奴がフロントエンドエンジニアになってますもん。

今の最新の制作現場ではフロントにプログラミングの要素がすごい入って来ていて（ReactとかAngularとかVueとか）フロントエンドエンジニアってのが出てくるぐらいにフロントの開発にかかる比重が高くなってる感じがしますね。

これからPWAとかもiOSで正式に採用されるので仕事はどんどん増えそうですね。

## まとめ
* 最初はコードが書けなくたっていい！
* 小さい会社で色々チャレンジさせてもらって良かった。
* 焦らずコツコツ学ぼう！（石の上にも3年）
* グラフィックデザイナーだって大丈夫！
* フロントエンドのコード書けると転職にも強いぞ！

といったところでしょうか？
・・・何をまとめたかったのか；；；
PCの基礎的知識

授業でした内容を自分のメモとして書き残します。

---

#IEEE802.11とは
IEEE802.11とは、無線の通信規格である。
主に5種類あり、それぞれ周波数帯や最大通信速度が異なる。

- 『 IEEE802.11a 』
    - 周波数帯：5GHz
    - 最大通信速度：54Mbps

- 『 IEEE802.11b 』
    - 周波数帯：2.4GHz
    - 最大通信速度：11Mbps

- 『 IEEE802.11g 』
    - 周波数帯：2.4GHz
    - 最大通信速度：54Mbps

- 『 IEEE802.11n 』
※IEEE802.11nには２つある
    - 周波数帯：2.4GHz
    - 最大通信速度：600Mbps

    - 周波数帯：5GHz
    - 最大通信速度：600Mbps

- 『 IEEE802.11ac 』
    - 周波数帯：5GHz
    - 最大通信速度：6.9Gbps

#USBの種類
USBは今、主に２つのものが使われている。
この２つで大きく異なるのは、**データの転送速度**である。

- 『 **USB2.0** 』
    - 480Mbps
- 『 **USB3.0** 』
    - 5Gbps

#ONUとは
『 Optical Network Unit 』の略。
日本語では、『 光回線終端装置 』という。

光ファイバーの通信回線を利用する際に必要な機器。
一般的に、光ファイバーにONUを接続し、その先にイーサネット方式でLANやPCを接続する。

光ファイバーの中を流れてきた光の信号を電気信号に変えたり、光ファイバーへ送り出す電気信号を光の信号に変える。
電柱の上にONUが置かれている場合もある。

#PCの基礎的知識諸々
- 1byte = 8bit
- C言語のint型 = 4byte
- イーサネット = 有線
- Windows 10 Pro、Windows 10 EnterPrise、Windows Homeなどがある

---

最後までお読みいただき、ありがとうございました。
WindowsのWSL上にDocker開発環境を立ててみる

Qiita初投稿。
エンジニアの出来損ないが、メモ程度に開発日記を書いていきます。
先輩方のご指摘を餌にして育っていくつもりなので思ったことは何でもぶつけてください。

今回は、自宅のwindows PCにdocker開発環境を作ります。
Windowsでもbashを扱うことができるようになっていたので、Windows Subsystem for Linux(WSL)を活用していきます！

# 目的
幅広にコーディングを楽しむために、快適なDocker環境を自宅PCに構築していきます。
職場ではLinux系サーバにdockerなりk8sなり入れてソイヤソイヤと開発しているのですが、Windowsでのdocker環境構築は初挑戦です。

# 環境
* OS
    * Windows10 pro : Version 1709
* WSL
    * Ubuntu : 16.04.3 LTS
* Docker
    * Docker for Windows : Version 18.03.0-ce-win59 (16762)

# 準備
### WSL

先人の記事を参考に入れます。
これはサクッと入ります。
[Windows 10でLinuxプログラムを利用可能にするWSL（Windows Subsystem for Linux）をインストールする](http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)

### Docker for Windows
インストーラを公式からダウンロードし、インストール
https://docs.docker.com/docker-for-windows/install/

※stable channelとedge channelがありましたが、今回は安定を選びました

# 設定
### DockerをWSL上で動かせるようにする
WSL内でDockerエンジンを動かすことができないため、Windows上でDocker Engineを起動し、WSLからはDocker daemonへアクセスするように設定します。(詳しくはよくわかりませんが・・・)

* Docker側の設定
    1. タスクバーのインジゲータからDockerアイコンを右クリック
    2. 設定を開き、全般(General)タブの"Expose daemon on tcp://localhost:2375 without TLS"にチェックを入れる
    
    <img width="622" alt="setting.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/84094/e5188af0-965c-248d-a27f-0878e4fbe842.png">



* WSL側の設定
    * `~/.bashrc`に以下を追記
    
    ```bash
    export DOCKER_HOST=tcp://0.0.0.0:2375
    alias docker="DOCKER_HOST=${DOCKER_HOST} docker"
    alias docker-compose="docker-compose -H ${DOCKER_HOST}"
    ```

### ボリュームマウント
dockerでボリュームマウントオプションを入れてもボリュームマウントができていない問題ハマったので、メモに残します。

* Docker側の設定
    1. タスクバーのインジゲータからDockerアイコンを右クリック
    2. 設定を開き、"Shared Drives"タブにてマウントしたいディレクトリがあるディスクを選択
    3. "Apply"で設定を適用し、起動中であれば念のためDockerを再起動

* WSL側の設定
WSLでは`/mnt`配下にディスクがマウントされている状態です。
一方、Docker for Windowsでは`/`直下にディスクがマウントされているみたいです。
その環境誤差気づかずに`docker run -v /mnt/c/Path2MntDir <Docker image>`を必死に叩いていたため、ボリュームマウントが上手くいかない現象が起きていたようです。
[Githubのissue](https://github.com/Microsoft/WSL/issues/1854)で解決しました。
    1. `mkdir /c`
    2. `mount --bind /mnt/c /c`
    3. `docker run -v /mnt/c/Path2MntDir <Docker image>`

# まとめ
* インストール自体は簡単
* WSLがDocker for Windowsのdaemonに疎通できる設定が必要
* ボリュームマウントがしたい場合はWSLとDocker for Windowsの設定値に注意

快適な開発環境へ向けて第一歩を踏み出せました。
rubyでmongodb3(ユーザ認証付き)への接続・DB操作検証メモ

#はじめに
centos7上で動作するmongodb3（ユーザ認証設定あり）をruby(2.5.0p0)から操作する検証を行った際の自分メモです。
mongodb3の構成は@SOJO様の記載した[こちらの手順](https://qiita.com/SOJO/items/dc5bf9b4375eab14991b)をご確認ください。

## ruby gem [mongo]のインストール
```bash
sudo gem install mongo
```

## 検証プログラム
詳細はコメントをご確認ください。尚、Rubocopさんがブチ切れる構文です:wink:

```ruby
require 'mongo'

#
class UseMongo
  # 標準出力を汚さないためのおまじない。商用利用時は出力をlogfileにする設定変更要。
  Mongo::Logger.logger.level = Logger::FATAL
  # 接続情報の定数化
  CLIENT = Mongo::Client.new(
    %w[127.0.0.1:27017], # array(ip:port) default_setting
    database: 'test',
    user: 'myuser',
    password: ENV['TEST_DATABASE_PASSWORD']
  )
  # 操作対象となるコレクション（rdbmsのテーブル）を定数化
  COLLECTION = CLIENT[:test_collection]

# insert処理検証
  def insert(item)
    return false if item.nil? || item.length.zero?
    # example
    COLLECTION.insert_one(item)
    true
  rescue StandardError => e
    e
  end

  # collectionを全て取得するメソッドなのでactive_recordっぽくallメソッドとする。
  def all
    COLLECTION.find
  rescue StandardError => e
    e
  end
  
  #Whereメソッドkey,val指定でデータ取得
  def where(key, val)
    return false if key.nil? || key.length.zero?
    return false if val.nil? || val.length.zero?
    COLLECTION.find({"#{key}": "#{val}"})
  rescue StandardError => e
    e
  end

  # whereのIN句 [col] IN (array)として検索。
  def where_in(col ,arr)
    return false if col.nil? || col.length.zero?
    return false if arr.nil? || arr.length.zero?
    COLLECTION.find({"#{col}":{ '$in': arr }})
  rescue StandardError => e
    e
  end
end

# exapmle　以下、動作確認したいメソッドをコメントアウトして実行。
mongo = UseMongo.new

# v = { hoge: 'fuga', cat: 'tama' }
# doc = {vern: ['食べログ3.5','高評価','美味い','高い']}
# mongo.insert(v) # insert
# mongo.insert(doc) # insert
# mongo.all.each {|m| puts m }
# mongo.where('hoge', 'fuga').each {|w| puts w }
# arr = %w[キツい 高い]
# mongo.where_in('vern',arr).each {|w| puts w }

```
Go言語のfmtパッケージは小数点以下を切り捨てない

Goのfmtパッケージには書式演算子があります
https://godoc.org/fmt

浮動小数点数型のfloat64を、小数点以下第n位で切り捨てたい場合には
書式演算子 `%f` を使って文字列型に一度変換して、浮動小数点数型に変換する方法が楽かと思います

ですが、 `%f` は指定した有効桁数で小数点以下を切り捨ててくれないので、この方法は使えません

### サンプルコード
```go
package main

import (
	"fmt"
)

func main() {
	// 小数点以下第3位で切り捨てられることを期待
	s := fmt.Sprintf("%.3f", 0.0019)
	fmt.Println("%s", s)
}
```
#### 実行結果

```
%s 0.002
```

四捨五入されます
参考: https://play.golang.org/p/C5AP_7V3wd9

### 代替案
小数点数以下第n位を有効桁数として切り捨てたいときは、 math パッケージの `Pow` や `Floor` メソッドを使って実装するのがよいかと思います
https://godoc.org/math#Floor

参考: https://gist.github.com/DavidVaini/10308388
パソコン設定

※自分のメモ用になります。

環境:Windows10

##IPアドレスの設定
まず初めにスタートメニューなどからコントロールパネルを開く、
次にネットワークと共有センターにを選択して左の"アダプターの設定の変更"を選ぶ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/f792d44b-0ceb-5473-6ebd-e4a5b1a8c834.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/c575c6f9-1a90-3cb0-7b45-9a1b4965cb42.png)
その後出てくるウィンドウの中で自分が設定したいネットワーク接続を選択して右クリックからプロパティを選択し、プロトコルバージョンの設定したい方を選択する。(今回はIPv4を選択)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/d8bba09d-3093-55d6-755a-65b3e7255169.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/79582c33-df18-d464-c42f-757fa3676bc7.png)
後に出てくるウィンドウの中から次のIPアドレスを使うを選択して、下にある
IPアドレス サブネットマスク デフォルトゲートウェイを追記して、
DNSサーバーも使用する場合、選択して優先DNSサーバーを追記する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/909b793f-b6e7-ff15-8b5b-32e0eedc2690.png)
その後再起動してネットワークに接続できていれば成功。
IPアドレスの変更方法

#IPアドレスの設定変更
1.画像↓の赤丸している場所をクリックして、「ネットワークとインターネットの設定」って言うのがあるのでそいつをクリックしよう
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/7ae7b1ce-af48-4c0b-6acd-9e331edd7a3b.png)

2.そしたら、設定画面が開くので下のほうにある「ネットワークと共有センター」をクリックしよう。
　
※コントロールパネルからでも、「ネットワークと共有センター」を開くことはできます。
　開き方は人それぞれなので、自分のやり易い方法でやってください　

3.ネットワークと共有センターが開いたら、左の項目の中から「アダプターの設定の変更」っていうやつをクリックしよう。

4.そしたら、画面が移動して「ネットワーク接続」という画面にきたと思います。
おそらく、画面に「Wi-Fi」か「イーサネット」って項目があるはずなので、そいつを右クリックしてプロパティをクリックしよう。

5.クリックすると、選択したネットワークの設定画面が出てくると思います。
その画面の中に「インターネットプロトコルバージョン4（TCP/IPv4）」っていうのをクリックしよう。

6.クリックしたら、IPv4のプロパティが出てくるので使おうとしているIPアドレス等を入力してOKボタンを押せば設定は終了です。
※「IPアドレスを自動的に取得する」っていう項目もあるので試すのもありかも？？
※設定後に繋がらない場合は、入力ミスがないかなど色々と見直してください

#最後に…
ネットワークの設定なんて、めったに開くことはないと思います！
Azure AD B2C のススメ(1)

# Azure AD B2C のススメ(1)

[AzureAD B2C](https://azure.microsoft.com/ja-jp/services/active-directory-b2c/)、非常に素晴らしい仕組みなのにイマイチマイナーな感じがするのでもっと広まってほしいと思い実例を交えつつ紹介記事を。
AzureAD B2Cってなんだよって一口に言うと、Azure上のMicrosoft Account他様々なソーシャルログインに対応したID管理サービスです(AzureADって昔からあるActiveDirectoryの名前を引き継いでいるせいで一般に機能を誤解されがちだと思います)。
GoogleやFacebookアカウントでのログインに加えローカルアカウントでのログイン(何と言えば良いんでしょう？非ソーシャルログイン？)までまるっと提供してくれるのでID管理するのにDBに個人情報が〜パスワードが〜と悩まされる事なくサービスの開発に集中できます。

## ディレクトリ作成

とりあえずディレクトリを作りましょう。リソースの新規作成ボタンを押し、B2Cディレクトリを作成します。

![1-create.png](https://qiita-image-store.s3.amazonaws.com/0/246831/850b60cd-b135-ad89-2dc5-b68e60b2fe1a.png)

正式名称 "Azure Active Directory B2C" なので "AzureAD B2C"だと出てきません。注意。

![1-create-2.png](https://qiita-image-store.s3.amazonaws.com/0/246831/47cac077-9620-9e6d-6565-9df4800ca8aa.png)

組織名とドメイン名を登録して作成開始です。多少時間は掛かります。

![1-created.png](https://qiita-image-store.s3.amazonaws.com/0/246831/c90339fa-efc7-4e1b-b784-edce3da43fc2.png)

出来上がったら作成した AzureAD B2Cリソースの設定か、右上のアカウント情報からディレクトリの切り替えを使用して作成したディレクトリに切り替え、設定を進めていきましょう。

## ID プロバイダー設定

次に ID プロバイダー設定を行っていきます。

![1-id-provider.png](https://qiita-image-store.s3.amazonaws.com/0/246831/5ed6c339-efbc-f076-7fde-2370f6d853f6.png)

まず IDプロバイダーを開きます。ローカルアカウントというのは外部の認証を使わず、作成したディレクトリに直接ユーザを登録する使い方の事です。
Qiitaで言えばメールアドレス・パスワードによる登録のようなもの。これが AzureB2C から提供される事によって通常ならローカルアカウント(自前で管理)+外部認証になりがちなシステムがユーザ管理を全て外にぶん投げる事ができるようになるというのが非常に気に入っています。
で、ローカルアカウントにはユーザ名かユーザ登録時のメールアドレスのどちらを入力させるかです。

![1-select-provider.png](https://qiita-image-store.s3.amazonaws.com/0/246831/43bcc43c-a85a-acd3-3878-3abc84342e77.png)

追加ボタンを押し、使用するIDプロバイダーを追加していきます。プロバイダーごとの設定手順は
[ハウツー記事](https://docs.microsoft.com/ja-jp/azure/active-directory-b2c/active-directory-b2c-overview#how-to-articles)に操作手順が記載されています。
いつの間にやらプレビュー含め10種類も^^; 

![1-id-provider-add-google.png](https://qiita-image-store.s3.amazonaws.com/0/246831/66c48422-8cc8-7013-9946-f207ea3858df.png)

とりあえずここでは Googleアカウントでのサインインを追加します。
別途 Google Developer Console からプロジェクト・認証を追加し、クライアントID/シークレットを持ってきます(詳しい手順は公式ドキュメント参照)。

## ポリシー作成

![1-create-policy.png](https://qiita-image-store.s3.amazonaws.com/0/246831/e7f5bd0e-4b8a-c3ce-3de0-692d3634e3c5.png)

戻ってポリシーを追加していきます。
追加したいポリシーの種類を選択して 追加 ボタンを押し、名前と各種設定を行っていきます。
ここではサインイン・アップ用に "B2C_sign_in_up" というポリシーを作成し、ローカルアカウントと先程追加した Google の IDプロバイダーを有効としました。

## アプリケーション作成

![1-create-application.png](https://qiita-image-store.s3.amazonaws.com/0/246831/860c06b3-5e22-0ded-8b94-2719a0690c9f.png)

作成したB2Cディレクトリで認証を行うアプリケーションを作成します。通常の AzureAD 連携を行うアプリケーションと同じ要領です。これは Webアプリを作成する場合の例です。
一度保存するとアプリケーションIDが払い出されるのでメモっておきましょう。

![1-test-policy.png](https://qiita-image-store.s3.amazonaws.com/0/246831/1bab4e12-66bb-3164-8749-fd8086c9b53d.png)

また、アプリケーション登録後にポリシー編集画面に戻るとこんな感じでサインイン画面のテストを行う事ができます。

![1-test-sign-in-up.png](https://qiita-image-store.s3.amazonaws.com/0/246831/829f158c-1733-5542-c906-3a31ff11a587.png)

リンクを開いてみるとこんな感じ。追加済みIDプロバイダーもしくはローカルログインによるサインインとローカルアカウントのサインアップが表示され、サインイン・サインアップの動きを確認できます。
もちろん応答URLには何もありませんのでその後は何もありませんが。

# まとめ

とりあえずディレクトリを作成してアプリケーションの認証を設定して試せる所まで駆け足で説明しました。
次回はこのディレクトリの認証を利用したアプリケーションの実装を解説していきたいと思います。
検証環境にのみBasic認証を設置する

## 概要
本番環境は、認証をかけず、検証環境にのみBasic認証のアクセス制限をかける方法を調べたメモを残しておく。

## 設定ファイルの記述
.htaccessでも設定可能です。

```:.htaccess
<IfDefine test>
  AuthUserFile /var/www/.htpasswd
  AuthGroupFile /dev/null
  AuthName 'Please Enter Your Password'
  AuthType Basic
  require valid-user

  Satisfy any

  Order deny,allow
  Deny from all
  Allow from 127.0.0.1
  Allow from 153.1.1.1
  Allow from 153.1.1.2
</IfDefine>
```

できることならconfファイルで設定する方がいいかと思う。

```:www.qa-example.com.conf
<VirtualHost *:80>
    SetEnv APP_ENV "local"
    DocumentRoot   /var/www/www.qa-example.com/httpd/
    ServerName     www.qa-example.com
    CustomLog      "logs/www.qa-example.com-access.log" combined
    ErrorLog       "logs/www.qa-example.com-error.log"

    <Directory "/var/www/www.qa-example.com/httpd/">
        DirectoryIndex index.html
        AllowOverride All

        AuthUserFile /var/www/.htpasswd
        AuthGroupFile /dev/null
        AuthName 'Please Enter Your Password'
        AuthType Basic
        require valid-user

        Satisfy any

        Order deny,allow
        Deny from all

        # allow ip address
        Allow from 127.0.0.1
        Allow from 150.1.1.1
        Allow from 153.1.1.2
    </Directory>
</VirtualHost>
```
設定、お掃除

今日はPC番号やIPアドレスの設定をしてから部屋のお掃除をした配線がぐちゃぐちゃになっていたので綺麗にまとめた
延長コードを束ねたら出荷する可能性があるので気を付けてやらないといけないです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/4d8b9b8e-c5f4-6a31-11f7-c0af81b6af3a.png)
考えてやらないと出火したら大変なので皆さん気を付けましよう。

学校に入る前はIPアドレスなど何のことかわからなかったです。
そもそも2種類もあるなんて思ってなかったです

<h1>グローバルIPアドレス</h1>
後述するプライベートIPアドレス、リンクローカルアドレス、特殊用途のIPアドレスなどを除いたIPアドレスは「グローバルIPアドレス」と呼び、インターネットの接続用に利用される。そのため、ICANNを頂点とした階層的な委譲関係によって、世界的な管理が行われている。

通常、パソコンやルーターなどをインターネットに接続すると、ISPに割り振られているグローバルIPアドレスの中の1つがパソコンなどに割り当てられる。

<h2>プライベートIPアドレス</h2>
プライベートIPアドレス（ローカルIPアドレス）は、プライベートネットワーク（外部から利用できない社内LANなど）のアドレスとして使うことができる。異なるプライベートネットワークを相互接続してルーティングすることも可能である。

プライベートIPアドレスとして、次のアドレス空間が予約されている。ネットワークの規模に応じて、使い分ける必要がある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/267db87a-b596-0726-c7da-ea0c3f561436.png)
ループ処理を用いた名称セットについて

お世話になります。

ループ処理を用いた名称セットについて質問です。

３つのチェックボックスに名称として、A　B　C　と
それぞれセットしたいのですが、

配列とループ処理（forなど）を使う場合どのように
コードを書けばよいか困っています。

プログラムなどでアドバイスを頂けますでしょうか。

画面構成は以下のようなものです。

![スクリーンショット (18).png](https://qiita-image-store.s3.amazonaws.com/0/197776/05f2ddce-e7ca-3802-69ec-1b91b08a4385.png)
フロント周り 必要となる知識を広く浅く学ぶ01

#目的
フロント周りで必要となる知識を広く浅く学び、実務に生かす。

#内容
##HTML
###HTMLとは
Hyper Text Markup Language（ハイパーテキスト・マークアップ・ランゲージ)
Webページを作るための最も基本的なマークアップ言語のひとつ。他にはXML、XHML、SGMLなどある。
[マークアップ言語の種類と特徴](https://mynavi-creator.jp/blog/article/what-is-mark-up-language)

###HTMLができた理由
研究者が研究状況の確認や資料を探すなどの行為を、簡単に探して見ることができる方法はないかと考えて生まれた。生まれた場所は、スイス・ジュネーブにあるCERN(欧州原子核研究機構)で、欧州12か国が共同で研究を行う機関であり何千人という科学者が入れ替わり立ち代わりで訪れていたらしい。
[HTMLの誕生からザッと要点紹介](https://matome.naver.jp/odai/2136874479784697001)

##W3C
World Wide Web Consortium（ワールド・ワイド・コンソーシアム）
Web技術の標準化を行う非営利団体
[about W3C](https://www.w3.org/Consortium/)

###W3Cができた理由
開発者たちが次々と新しいタグを導入していき、Webページ開発者は苦労し始めた。
その為タグを標準化する必要性があると感じ、世の中のWebの標準的な技術（HTML、SVG、DOMなど）の
技術を策定し標準化へと導いていく組織が必要とのことでW3Cが設立した。

##ひと休憩
会社名|Microsoft|Netscape|
---|---|---
ブラウザー|IE|NS|
スクリプト言語|JScript|Javascript|
Javascriptで書いたコードはIEではJScriptで動いてるらしいです。

##レンダリングエンジン
###レンダリングエンジンとは
ウェブページ記述用言語で書かれたデータを解釈し、実際に画面に表示する文字や画像などの配置を計算するプログラム。模写をしてくれる仕組み
[HTMLレンダリングエンジンとは](http://wa3.i-3-i.info/word1358.html)

###実務
ブラウザーで検証をする際は、ブラウザーというよりレンダリングエンジンの検証という認識で考える
どのブラウザーがどのレンダリングエンジンを採用してるのか見れば、全てのブラウザーを見なくても良い。
###レンダリングエンジンの状況
ブラウザー|レンダリングエンジン|評価|
---|---|---
IE|Trident|ひどい|
FireFox|Gecko||
Opera|Presto||
Safari|WebKit|すごい|
Chrome|Blink|すごい|
iOS|WebKit|すごい|
評価基準は、HTML5/CSS3の対応が早いか遅いか
ちなみにiOSは、OSのアップデートでブラウザーもアップデートをする

##ベンダーフレックス
###ベンダーフレックスとは
CSS3で採用される予定の機能で、先頭に付ける-moz-や-webKit-などを指す

###主要ブラウザのベンダープレフィックス
ブラウザー|ベンダーフレックス|
---|---|---
Firefox|-moz-|
Chrome|-webKit-
Safari|-webKit-
IE|-ms-

##ひと休憩
###フロント界隈でBig News
[「Firefoxのベンダーベンダープレフィックスに、-WebKit-が導入」](https://it.srad.jp/story/16/01/05/0431236/)
WebKitが独自に実装したCSSプロパティをFirefoxでも有効と認識されてレンダリングの際に設定が反映されるようになった。なぜBigNewsなのか。それは手間が省けるから。「-moz-」を書かなくても良い。FireFoxを気にしなくて済むということ。
（個人的には、ベンダープレフィックスに苦しめられた経験がないのでBigNewsさがわかりません）


###ブラウザーのベンダープレフィックスの対応可否の確認
[Can I use.com](https://caniuse.com/)
検索にかけたセレクターが、"どのブラウザー" の "どのバージョン"に対応をしているかがわかる。
セレクターのブラウザー対応状況を確認する際は、ここにアクセス
<img width="1271" alt="スクリーンショット 2018-04-18 12.07.21.png" src="https://dena-incubation-tech.qiita.com/files/838e7c6b-7f43-4025-0c19-800e4b77eabe.png">



#まとめ
格ブラウザーのレンダリングエンジンの状況、W3Cが出す最新セレクターなど
フロント周りの情報をおさえておくことが大事。
(ブラウザ戦争については、長くなりそうなので機会があれば書く。)
フロント周り 必要となる知識を広く浅く学ぶ02

#目的
フロント周りで必要となる知識を広く浅く学び、実務に生かす。

#内容
##WHATWG
###WHATWGとは
Web Hypertext Application Technology Working Group 
HTMLとWebアプリケーションに必要なAPIの開発に取り組んでいるコミュニティ
[About WHATWG](https://whatwg.org/)

###設立した背景
2004年、既存団体であるW3C（World Wide Web Consortium）が考えているXHTMLについての方向性、Webサイト構築現場のニーズへの対応に対して不満を表明した、Apple、Mozilla、Operaに所属するメンバーにより設立

###実務
HTML5/CSS3の策定&勧告をする組織は2つある。その為、W3Cが策定&勧告する情報のみではなく、WHATWGの情報も確認する

##JavaScript
###JavaScriptの歴史
年号|組織|内容|
----|----|----
1995年|Netscape|JavaScriptを考案|
1997年|Netscape|JavaScriptを規格化へ|
1997年|ECMAインターナショナル|ECMA-262 初版を出す
1998年|ECMAインターナショナル|ES2
1999年|ECMAインターナショナル|ES3
2000〜2003年|史上最大の変更規模|ES4 中止
2009年|ECMAインターナショナル|ES5
2015年|ECMAインターナショナル|ES6
2016年|ECMAインターナショナル|ES2015
...|...|...
####文言
#####[ECMAインターナショナル](https://ja.wikipedia.org/wiki/Ecma%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8A%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB)
情報通信システムの分野における国際的な標準化団体。

#####[ECMAScript](https://ja.wikipedia.org/wiki/ECMAScript)
JavaScriptを基にして標準規格化されたスクリプト言語。Ecma Internationalによって策定されてる。
ECMAScript(JavaScriptの規格)
　∟ActionScript(実装)
　∟JavaScript(実装)
　∟....(実装)

#####ES4が中止した理由
史上最大の変更規格により、格ブラウザーで賛否が生じた。
結果、大幅な規格変更は中止になり修正版であるES3.1で落ち着いた。

賛否|ブラウザー|主張|
----|----|----
賛成|Apple、Mozilla、Google、Opera|ES4で|
反対|Microsoft、Yahoo|ES3.1(修正版)で|

##JavaScriptエンジン
###JavaScriptエンジンとは
JavaScriptを解釈してブラウザーで実行するもの
[Javascriptエンジンまとめ](https://tsuchikazu.net/phantomjs-browser-javascript-engine/)

###JavaScriptエンジンの種類
ブラウザー|JavaScriptエンジン|評価|
----|----|----
IE|Chakra|ひどい|
Microsoft Edge|Chakra|ひどい|
Firefox|SpiderMonkey||
Safari|Nitro||
Chrome|V8|世界最速|

###JSの進歩
当初はアラートを出すぐらいの人気のない言語
2005年 Google Maps登場で、JSの真値が広まりJSが急成長。

##Node.js
###Node.jsとは
Google Chromeに搭載されている高速なJavaScriptエンジンV8をコマンドラインから使えるようにしたJavaScript言語処理系
[Node.js とは何か？](https://qiita.com/kobalab/items/e0c2a3d5a9f4c172bad0)

###できた背景
JavaScriptはブラウザー向け言語だったが、「サーバで使いたい」の声が上がる。
ブラウザー外でJSを動かす為のソフトが登場

#まとめ
JavaScriptエンジン、ECMAScrip(規格)について情報を要チェック。
UIScrollViewを置いてもNavigationControllerのSwipeで戻るを使えるようにする

```swift
import Foundation

class LeftEdgeNoGestureScrollView: UIScrollView {
    
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        if point.x - self.contentOffset.x <= 30 {
            return nil
        }
        
        return super.hitTest(point, with: event)
    }
}
```


30は適当です。
IPアドレスの変更方法　授業の学習

#はじめに
エクスプローラーにあるネットワークを右クリックしてからでもできるのですが、今回デスクトップアイコンからやっていきます。

#動作一覧
1 デスクトップアイコン作成
2 IPアドレス変更

#デスクトップアイコン作成
もともとデスクトップにネットワークと言うアイコンが置いていない方はまずどこでもいいのでデスクトップで右クリックを押します。
そしたら一番下の個人用設定を押します。
![ip_1.png](https://qiita-image-store.s3.amazonaws.com/0/249273/6a26b3cf-217d-9f4d-bcc6-1f14f56e2b80.png)
このような画面が出てくるので赤線で囲まれているテーマを押します。![ip_2.png](https://qiita-image-store.s3.amazonaws.com/0/249273/43b59cb6-c62c-97c2-0c18-9f6368d7d2fb.png)
右側のデスクトップアイコンの設定を押します![ip_3.png](https://qiita-image-store.s3.amazonaws.com/0/249273/645b8e4f-e5fa-3c76-8313-6a9538b83c83.png)
そしたら赤で囲んであるネットワークにチェックを入れて適応ボタンを押すだけです。
#IPアドレス変更
さっきの設定をしたらデスクトップにネットワークのアイコンが出ているはずなのでそれを右クリックしてプロパティを押します。
![ip_4.png](https://qiita-image-store.s3.amazonaws.com/0/249273/95488391-68c6-e817-169e-f17cd357718e.png)
開いたらアダプターの設定の変更を押します。![ip_5.png]
(https://qiita-image-store.s3.amazonaws.com/0/249273/2e4edf2c-cde8-c8f9-b97c-d23fabf9f548.png)
次に赤線のインターネットプロトコルバージョン4(TCP/IPv4)をクリックしてプロパティを押します。
![ip_6.png](https://qiita-image-store.s3.amazonaws.com/0/249273/57535d04-497b-bbea-393b-7c96f87941c1.png)
次のIPアドレスを使うにチェックを入れて、下のIPアドレスに入れたい数字を入れてOKボタンを押して終了です。
dockerコマンド

- `$ docker exec -it <コンテナID or コンテナ名> /bin/bash` 起動中のコンテナ上でコマンドを実行する.
- `docker run` コンテナを作成する.
- `docker stop` コンテナを停止する.
- `docker start` コンテナを起動する.
- `docker restart` コンテナを再起動する.
- `docker attach` 起動中のコンテナに接続する．
- `docker rm` コンテナを破棄する(コンテナを停止する必要がある)
- `docker wait` コンテナが停止するまでブロックする.
- `docker ps` 起動中のコンテナを表示する．
- `docker inspect` コンテナの全情報を表示する（IPを含む）．
- `docker logs` コンテナのログを表示する．
- `docker events` コンテナ内のイベントを表示する．
- `docker port` コンテナのportを表示する．
- `docker top` コンテナのプロセスを表示する．
- `docker cp` コンテナ内のファイルをホストにコピーする．
- `docker export` コンテナのファイルシステムを出力する．
- `docker pull` レジストリからdockerイメージ，もしくはレポジトリを取得する．
- `docker import` ファイルシステムのtarballからイメージを取得する．
- `docker tag` イメージにタグをつける．(タグ名は<username>/<imagename>が奨励されている)
- `docker build` Dockerfileからイメージを作成する．
- `docker commit` コンテナからイメージを作成する．
- `docker rmi` イメージを削除する.
- `docker insert` URLからイメージにファイルを取り込む．
- `docker load` 標準入力としてtarファイルからレポジトリを取り込む．タグとイメージを含む(バージョン0.7現在)
- `docker images` 全イメージを表示する．
- `docker history` イメージの履歴を表示する.
PC名・IPアドレスの確認と変更

授業でした内容を自分のメモとして書き残します。

---

#PC名の確認・変更
##PC名の確認
PC名を確認するには、主に２つの方法がある。

###コントロールパネルから

[ コントロールパネル ] ⇒ [ システム ] の順にクリック

###ショートカットキーから

[ スタートボタン ] + [ Pause Break ]

##PC名の変更
PC名を変更するには、管理者のパスワードが必要になる。
※管理者権限を持つアカウントはパスワード入力不要

1. ” コンピュータ名、ドメインおよびワークグループの設定 ” 内にある、[ 設定の変更 ] をクリック
2. 管理者のパスワードが問われるので、パスワードを入力※
3. [ コンピュータ名 ] のタブ内にある[ 変更 ] をクリック
4. ” コンピュータ名 ”下記のテキストボックスから、PC名を変更
5. [ OK ] をクリックすると再起動を促されるので、すべてのタブを閉じてから、再起動する

#IPアドレスの確認・変更
IPアドレスを確認・変更する前に、” ネットワークと共有センター ” の表示が必要になる。
その方法は、主に２つの方法がある。

###ネットワークから

[ ネットワーク ] を右クリック ⇒ [ プロパティ ]

###Wi-Fiアイコンから
デスクトップ右下にある、Wi-Fiアイコンを右クリック ⇒ [ ネットワークとインターネットの設定を開く ] をクリック ⇒ 左側にある ” Wi-Fi ” を選択 ⇒ ” 関連設定 ” の [ ネットワークと共有センター ] をクリック

##IPアドレスの確認
IPアドレスを変更するには、管理者のパスワードが必要になる。
※管理者権限を持つアカウントはパスワード入力不要

1. ” アクティブなネットワークの表示 ” 内 ” 接続 ” 横の、 [ Wi-Fi～ ] をクリック
2. 下側にある” 動作状況 ”内の [ プロパティ ] をクリック
3. 管理者のパスワードが問われるので、パスワードを入力※
4. 中央チェックボックスの中から、[ インターネット プロトコル バージョン４(TCP/IPv4) ] をダブルクリック

##IPアドレスの変更
※IPアドレスを自分で入力する場合
⇒ ” IPアドレスを自動的に取得する ” が選択されている場合は、” 次のIPアドレスを使う ” を選択する

1. IPアドレスを入力する（192.168.～.～）
2. サブネットマスクを入力する（255.255.255.0）
3. デフォルトゲートウェイを入力する（192.168.～.～）
4. 優先DNSサーバを入力する（デフォルトゲートウェイと同じ値）
5. [ OK ] をクリック

---

最後までお読みいただき、ありがとうございました。
Windows10のPC名の変更、固定IPアドレスの設定

*　Windows10のPC名の変更

デスクトップ上のPCアイコンを右クリックして、プロパティを選択すとシステムという画面が出て来る。ここで「設定の変更」ボタンをクリックする。
![スケッチ.png](https://qiita-image-store.s3.amazonaws.com/0/251603/5812d650-b9a9-f6d0-c9c6-e2ad8d1d3e2b.png)
次の画面が出てきたら、変更ボタンをクリックする。
![スケッチ (1).png](https://qiita-image-store.s3.amazonaws.com/0/251603/3c4c486b-4ac5-2e37-98b2-8fa93b038ff8.png)
コンピューター名のところに新し名前を入力して、OKボタンをクリックすると完了となる。
![スケッチ (2).png](https://qiita-image-store.s3.amazonaws.com/0/251603/4c81a22c-7976-5437-d764-86f0fef11ef6.png)
最後に、再起動が必要です。

*　固定IPアドレスの設定

デスクトップ上のネットワークアイコンを右クリックして、プロパティを選択する。
ネットワークト共有センターの画面にアダプター設定の変更ボタンをクリックして、現在使っているネットワークを右クリックして、プロパティを選択する。
![スケッチ (3).png](https://qiita-image-store.s3.amazonaws.com/0/251603/87cc92aa-4ba0-31e3-779f-05aac8220fbe.png)
下の画像通り固定IPアドレスを設定する。
![スケッチ (4).png](https://qiita-image-store.s3.amazonaws.com/0/251603/9283c681-4fd8-9d25-6e32-9cc099571e10.png)
最後に、再起動が必要です。
【Python】AWS Lambdaで外部モジュールを使用する

LambdaでPythonのrequestsを使おうとして詰まったのでメモ(˘ω˘)

## 解決法
結論を言っちゃうと、モジュールを実行ファイルと一緒にzipでアップロードすれば良い

## やり方
今回は「requests」を使用したいのでpipでインストールする

```terminal:terminal
(˘    ) $ cd $PROJECT_DIR
(ω˘   ) $ pip install requests -t ./

(˘ω˘  ) $ tree -L 1
.
├── bin
├── certifi
├── certifi-2018.4.16.dist-info
├── chardet
├── chardet-3.0.4.dist-info
├── function.py
├── idna
├── idna-2.6.dist-info
├── requests
├── requests-2.18.4.dist-info
├── urllib3
└── urllib3-1.22.dist-info
```

*.dist-infoとbinは必要無いので削除

```terminal:terminal
( ˘ω˘ ) $ tree -L 1
.
├── certifi
├── chardet
├── function.py
├── idna
├── requests
└── urllib3
```

依存関係のあるモジュールが全てインストールされているか念の為確認

```terminal:terminal
(  ˘ω˘) $ pip install pipdeptree
(   ˘ω) $ pipdeptree -p requests
requests==2.18.4
  - certifi [required: >=2017.4.17, installed: 2018.1.18]
  - chardet [required: <3.1.0,>=3.0.2, installed: 3.0.4]
  - idna [required: <2.7,>=2.5, installed: 2.6]
  - urllib3 [required: <1.23,>=1.21.1, installed: 1.22]
```

必要なモジュールが揃っている事が確認出来たのでこれらをzipで固める

```
(    ˘) $ zip -r hoge.zip ./*
```

出来たzipファイルをLambdaのコンソールからアップロードする

「コードエントリタイプ」をクリック
![Screen Shot 2018-04-19 at 15.46.59.png](https://qiita-image-store.s3.amazonaws.com/0/243481/62a2b970-af5f-00ce-3405-3292e7175c61.png)

.zipファイルをアップロード
![Screen Shot 2018-04-19 at 15.47.09.png](https://qiita-image-store.s3.amazonaws.com/0/243481/826b5367-e563-1551-6598-93142bfc9a01.png)

先ほどのzipファイルを選択し、アップロードして画面右上の保存ボタンをクリック
![Screen Shot 2018-04-19 at 15.47.55.png](https://qiita-image-store.s3.amazonaws.com/0/243481/19dc837f-6451-5578-38e9-8341e4ee0451.png)

インラインエディタにアップロードしたファイル・ディレクトリが表示されたらOK
![Screen Shot 2018-04-19 at 15.52.59.png](https://qiita-image-store.s3.amazonaws.com/0/243481/98af7909-39b5-500c-dcca-f7ba69b0c322.png)

これでfunction.pyからrequestsをimportする事が出来る(アップロードした他のモジュールも可)

## おまけ
pip時に以下のエラーが出た時の対処法

```
distutils.errors.DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both
```

.pydistutils.cfgファイルをホームディレクトリに作成し、以下を記載すればキットイケル(˘ω˘)

```terminal:terminal
$ touch ~/.pydistutils.cfg
```
```bash:.pydistutils.cfg
[install]
prefix=
```
WPFによる画面作成の基本

#WPFの画面作成
初めにする事は、プロジェクトを作成する時1を選択し、2で名前を決めて作成します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/249265/99031d08-f0e1-4db9-7725-977eb5cac291.png)
次にやる事はXAML変種画面の所にあるGridタグの中にコードを追加します。

を入力します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/249265/18e9d94c-c584-edad-d813-9f753d2576c9.png)

```xml
<Grid Margin="15">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="15*"/>
            <ColumnDefinition Width="85*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
         </Grid.RowDefinitions>
</Grid>
```

Grid.RowDefinitionsタグはGridコントロールの列を表します。
２つのColumnDefinitionタグで,２つの列を指定しておりwidthプロパティは幅列を意味し、ピクセル単位の数値を指定します。
その後に*（アスタリスク）を指定すると、Gridコントロール全体の横幅に対して指定した比率で列の幅を設定します。
入力が終わるとデザイン変更画面のウィンドウがこうなります。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/249265/011d04a2-69b4-481d-2a91-6651cbc48064.png)
この画面はセルの大まかなレイアウトが作成出来た事がわかります。
これらの列と行の数はGrid.RowDefinitionsとColumnDefinitionを記述した数と一致します。


#開発環境
OS : Microsoft Windows10 (64bit)
IDE : Microsoft Visual Studio 2012

#最後に
今回授業やった事はウィンドウ作成とボタンの配置など大まかな事しかやらなかったのですが、次回はボタンの中身を触っていきます。
難しいと思いますが楽しみなので、頑張りたいと思います。
Dockerコンテナ内でapt-get installが失敗するとき（Unable to locate package ...とか言われるとき）の対処法

## 結論
apt-get updateしてからapt-get installする。

## 原因
Dockerの問題、ではなくubuntuの問題。
apt-getで管理するパッケージには依存関係があるので、パッケージリストを更新してからinstallすればよい。
開発環境の準備

# OSのインストール

- `Ubuntu`のイメージディスクをダウンロード
- `iso`イメージをDVDに焼く
- 焼いたDVDを使ってWindows PCのOSを`Ubuntu`に書き換える。
    - Englishで入れるとあとで引っかかる点が軽減します。

# Ubuntuのセットアップ

- (企業系の場合)Proxyの設定
- (企業系の場合)証明書の設定
- `update`する。<br>
  ```
  $ sudo apt-get update
  ```

(ディスプレイなしで，そこそこセキュリティを意識して使いたいときの設定)

- `ssh`を入れる<br>
  ```
  $ sudo apt-get install openssh-server 
  ```
- 他のPC(例えば，windowsPC)からsshで入れることを確認する
   - ubuntu PCで`ifconfig`してipアドレスを確認する
   - windows PCからping投げて確認する。
     <br>
     ```
     ping xxx.xxx.xxx.xxx
     ```
   - windows PCにsshクライアントソフトとして`Tera Term`か`MobaXterm`をインストールする。
   <br>
   個人的には，鍵生成に`Tera Term`使って，常用は`MobaXterm`です。
   - `MobaXterm`を使ってWindows PCからUbuntu PCにリモートログインする。
   - `Tera Term`で公開鍵認証に使うSSH鍵生成する
   - 生成した鍵の公開鍵をサーバ側(Ubuntu PC)に置く。
   - 公開鍵のアクセス権限を変更する
   <br>
   ```
   $ sudo chmod 700 ***_rsa
   ```
   - 認証鍵方式以外アクセスできないように設定変更する
   ```
   $ sudo nano /etc/ssh/sshd_config
   ```
      - `PermitRootLogin no`
      - `PasswordAuthentication no`
      - `RSAAuthentication yes`
      - `PubkeyAuthentication yes`
      - `PermitEmptyPassswords no`
      - `ChallengeResponseAuthentication no`
      - `X11Forwarding yes`
      - (たしかこんな設定のはず)
   - `MobaXterm`の設定を変更する
      - `SSH -> Advanced SSH settings -> Use private key`に秘密鍵の場所を設定する。
      <br>
      なくしやすいので，`c`直下か自身のユーザーアカウント直下に置いたりします。 
   - 認証鍵方式で接続できるか確認する。
   - パスワード方式で接続できなくなってるか確認する

(GPUありの場合の設定)

- `nvidia driver`を`ver 390`以上のものをインストールする
- OpenGLをインストールする
  <br>
  ```
  $ sudo apt-get install freeglut3-dev libglew-dev mesa-utils
  ```

# Docker環境をインストールする

2018.4.19現在の話

- Docker CEを公式のガイドに従ってインストールする
    - [公式のガイド](https://docs.docker.com/install/linux/docker-ce/ubuntu/#install-docker-ce-1)　　
    - あとでGPU使いたくて`nvidia-docker`をインストールする人は以下のコマンドで。
    <br>
    ```
    sudo apt-get install docker-ce=18.03.0~ce-0~ubuntu
    ```
   - 以下のコマンドが動くか確認する
   ```
   $ sudo docker run hello-world
   ```
   - (企業の人は多分動かないので)dockerのProxy設定する
   - `sudo`なしでdockerコマンド使えるように`docker`グループにユーザを`add`する
- (GPUを使いたい人は)`nvidia-docker2`をインストールする
   - 以下のコマンドが動くか確認する
   <br>
   ```
   $ docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
   ``` 
- `$ xhost +localhost`する

これで完了。
jenkinsのSlack Notificationsプラグインでユーザーにメンションする


Include Custom Message でユーザー宛にメンションしたかったのですが、単純に `@ユーザー名` だとただのテキストになってしまい、メンションになりませんでした。
正しくメンションするには `<@ユーザー名>`と `<>`で囲む必要があります。

参考
https://api.slack.com/docs/message-formatting#linking_to_channels_and_users
cakephp3 bin/bake acl DbConfig

cakephp/acl の AclShell の $tasks['DbConfig'] でエラー

* $tasks['DbConfig'] をコメントアウトして回避した
* _validateTasks() に引っかかってる


```
# ./bin/cake acl view -h
Exception: Task `DbConfig` not found. Maybe you made a typo or a plugin is missing or not loaded?
 in [/var/www/myapp/vendor/cakephp/cakephp/src/Console/Shell.php, line 326]
```

あーこれ3.6からか

* https://github.com/cakephp/cakephp/blob/3.5.15/src/Console/Shell.php#L303
* https://github.com/cakephp/cakephp/blob/3.6.0/src/Console/Shell.php#L310
論理演算の評価順について

今、

```cpp
if(++iter != end && *iter == value) {/* ... */}
```

のようなコードを書いていてふと心配になった。短絡評価は保証されていただろうか？　そしてそもそも評価順序は保証されていただろうか？　短絡評価が保証されていなければ、上のコードはSEGVしかねないし、評価順序が保証されていなければ、意図通り動くことが保証されない。

C++17以前は多くの式の評価順序が未規定だ。

```cpp
std::cout << f() << g() << h(); // ???
```

詳細は以下を。
https://cpprefjp.github.io/lang/cpp17/expression_evaluation_order.html

## 論理AND, ORの評価順序と短絡評価は保証されている

n3337（C++11直後）の§5.14, §5.15には、以下のような記述がある。非常に短いため、この部分だけならサラッと読めるので信用ならんという人は自分であたってみて欲しい。C++のドラフトはGitHubで公開されている。

https://github.com/cplusplus/draft

> N3337
> 5.14 論理AND演算子
> ...
> `&`とは異なり、`&&`は左から右に評価されることが保証されている。最初のオペランドが`false`だった場合、2つめのオペランドは評価されない。
> ...
> 5.15 論理OR演算子
> ...
> `|`とは異なり、`||`は左から右に評価されることが保証されている。さらに、最初のオペランドが`true`だった場合、2つめのオペランドは評価されない。

n4659では§8.14と§8.15になっている。

というわけで、論理and/orの評価順、そして短絡評価までが規格で保証されていることがわかった。安心してその振る舞いに依存することが出来る。
WPFで画面作成

#ウィンドの作成
1.Visual Studioを起動させましょう。
2.ファイルメニューから新規作成→プロジェクトでC#の中のWPFアプリケーションを選択してOKボタン
![01.png](https://qiita-image-store.s3.amazonaws.com/0/249279/b9355421-5d08-fdd5-401c-e8250a8eeb36.png)

3.こんな感じの画面が開くはず

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/e2a3ea9d-0e74-c7ef-76af-96c77f9c7655.png)


※以前に作った開く時はファイルメニューから開くで作ったやつを選択すれば開きます
##追加
1.右か左のあるソリューションエクスプローラーの中にあるプロジェクト名を右クリック
2.そしたら、追加→ウィンドウを選択
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/2ec2b233-ebc3-0584-7d85-ad0118e4db28.png)
3.ここで使う項目を選択して、名前を決めた後は追加ボタン押すだけです。
　そうすると、ソリューションエクスプローラーに追加されているはずです。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/406ecb0d-3d19-26f1-71a1-866494ff3327.png)
##最後に…
今日の授業では、ウィンドウの作成をしてみました。
ただ、教科書の内容を写しただけで、ほとんど内容が理解できていません。
なので、家で教科書と睨めっこする事になりそうです。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249279/c4925cfa-50d1-40d0-0a2a-21222b29a336.png)
Laravel5.6 で URL からコントローラのアクションを逆引きする

## やりたいこと

```php:routes/web.php
Route::get('hoge', 'HogeController@index');
Route::get('fuga', 'FugaController@index');
```

みたいになっているときに `https://xxx.com/hoge` という情報から `HogeController@index` を得たい。


## 確認環境

* Laravel 5.6
* PHP 7.1

## コード

`Route::getRoutes()` でiterable なルーティング一覧  `Illuminate\Routing\RouteCollection` を返してくれるようなので、それを使う。

```php
function uriToAction($uri, $method = 'GET')
{
    $route = collect(Route::getRoutes())
        ->where('uri', $uri)
        ->filter(function ($route) use ($method)  {
            return in_array(strtoupper($method), $route->methods);
        })
        ->first();

    return $route->action['uses'] ?? null;
}
```

```:実行結果
>>> uriToAction('hoge');
=> "App\Http\Controllers\HogeController@index"
```

あとはお好みで `parse_url()` などを使ってフルの URL から解決できるようにしたり、`App\Http\Controllers\` を削ったりとか。

このコードではルーティングパラメータに対応してないが、それも頑張ればできそう。
Android Studioの使い方

#はじめに

授業で初めてAndroid Studioを使ってアプリ作成をすることになりました。
Android Studioは聞いた事があるといった程度で、実際に使うのは初めてでした。
今回も自分用の学んだ事のメモとして使います。

※添付している画像は全てスクリーンショットとペイントで編集しました。

#開発環境
- OS : Microsoft Windows10 (64bit)
- IDE : Android Studio Ver3.1.1

#Android　Studioのプロジェクト作成
###プロジェクト作成ウィザードを起動する

![top.png](https://qiita-image-store.s3.amazonaws.com/0/249280/72bb5c2a-252e-cb45-8974-583ba877c311.png)
①Android Studioを開き、Welcome画面の[Start a new Android Studio project]を選択
　これでプロジェクト作成ウィザードが起動する。

###プロジェクトの基本情報を入力
![create.png](https://qiita-image-store.s3.amazonaws.com/0/249280/2fa87270-2ddb-0ce3-74fb-5dea0d2c99f2.png)

①Application nameに付けたい名前を入れる
②Company domainに[android.wings.websarva.com]と入れる
　Package nameに[com.websarva.wings.android.hello]と表示されていることを確認
③Nextを選択

※Project locationはデフォルトのままで大丈夫
###作成アプリのターゲットを選択
![create2.png](https://qiita-image-store.s3.amazonaws.com/0/249280/328277e2-080b-6078-54e7-035ef804ba31.png)

①チェックが入っているのが[Phone and Tablet]のみにする
②[API 15: Android4.0.3(IceCreamSandwich)]が選択されていることを確認
③Nextを選択
###作成アプリのテンプレートを選択
![create3.png](https://qiita-image-store.s3.amazonaws.com/0/249280/ee9477cc-711b-c5e0-fbc7-c4fbb67cf8cb.png)

①Empty Activityを選択
②Nextを選択
###アクティビティの情報を入力する
![create4.png](https://qiita-image-store.s3.amazonaws.com/0/249280/5bc135d3-12ee-f755-2386-3fd6f838a425.png)
①Activity Nameが[MainActivity]と入力されているか確認
②Generate Layout Fileがチェックされているか確認
③Layout Nameが[activity_main]と入力されているか確認
④Backwards Compatibility(AppCompat)がチェックされているか確認
※各入力欄はデフォルトのままで大丈夫

![create5.png](https://qiita-image-store.s3.amazonaws.com/0/249280/a37cb85b-0f1c-7ae4-0153-15ab4487df82.png)
※プロジェクト作成中の画面
ここまでで、プロジェクトが作成される

![create6.png](https://qiita-image-store.s3.amazonaws.com/0/249280/1c6aafb6-7789-7e31-b1a0-36dd28ec72f1.png)
ここからでも作成できる

初めてAndroid Studioを触ったのでまだまだ使い方がわからない所が多いですが、
今回はここまでで一旦区切り、次に続きます。
Android Studio基礎学習

#今回はAndroid Studioの基礎勉強をしました
#開発環境
OS:Microsoft windows10(64bit)　
IDE:Android Studio Ver3.1.1
#Android Studioの公式サイト
Android Studioのインストールする際はこちらのリンクから↓↓
https://developer.android.com/studio/index.html?hl=ja

私は今回Android studioはもともとインストールしていました。
#動作内容
####1Android studioのアップデート
####2Android Studioの初期設定
####3追加のSDKのダウンロード
####4AVD作成
####5Androidアプリ作成
#今回の課題
AVDを作成しAndroid studioで軽く作ったアプリを動かすこと。
最初は動作内容の1.2.3をこなしてその次にAVDを作成しました。![a.PNG](https://qiita-image-store.s3.amazonaws.com/0/249273/3135971a-081f-cdec-1a5c-8be4eeb13f7f.png)


そして今回はまだ始めたばかりなのでので軽く作ったこのHello Androidと書いてあるアプリをAVDで動くようにするだけです！![b.PNG](https://qiita-image-store.s3.amazonaws.com/0/249273/13df2352-19b5-cfee-866b-c66da0d67a1f.png)

あとは教科書を参考に進めていきました。
![d.PNG](https://qiita-image-store.s3.amazonaws.com/0/249273/25e2d350-aec0-178e-6427-9a24b6d01b18.png)

![e.PNG](https://qiita-image-store.s3.amazonaws.com/0/249273/e8e6b6b2-ce4f-ccf5-6296-551835520f5a.png)

![f.PNG](https://qiita-image-store.s3.amazonaws.com/0/249273/0baf4a08-c89a-5b39-8a9a-16abbe1ec68a.png)

この画像のように進めていくと..
![c.PNG](https://qiita-image-store.s3.amazonaws.com/0/249273/1963c7bc-1c60-521d-e9f5-2ecb1fe376d8.png)
####上に何かメッセージは出ていますが何とか完成できました！

#最後に
今回は簡単なプログラムでしたがこれからもそれを積み重ねて頑張っていきます。
レガシーなTomcatプロジェクトを外部のGradleプロジェクトから参照してテスト及びレポーティング自動化

# レガシーなTomcatプロジェクトを外部のGradleプロジェクトから参照してテスト及びレポーティング自動化

## Overview

システム開発に携わっていると、Java＋ApacheTomcat＋Eclipseの`Tomcatプロジェクト`で構築されたWebアプリケーションを見かけることがよくあります。
そういったシステムの改修案件などがあった場合でも、やはりテストコードは書きたいもの。
テストコードを書いたら、Jenkinsさんとかから実行して、テスト結果などをレポーティングしたい。

そんな希望を実現するために試行錯誤した結果、こういう形式はどーかなーとたどり着いたので公開します。
ソース一式はGitHubで管理しているので、そちらをご利用下さい。
https://github.com/Yu-Yamaguchi/GradleBuildForExtarnalTomcatProjectSample

## サンプルプロジェクトの構成

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/246556/43aad14b-2f38-2703-b056-51325cdb2f2d.png)

- TomcatProject
 - 既存のTomcatプロジェクト
 - Eclipse上の認識が`Tomcatプロジェクト`となってしまっているため、MavenプロジェクトやGradleプロジェクトとして認識させることができない制約がある。（とします）
- TomcatProjectGradle
 - Gradleプロジェクトとして認識されるプロジェクト
 - `TomcatProject`にあるテストコードを実行し、レポート出力する定義などをまとめているプロジェクト
 - このプロジェクトから`TomcatProject`をフラットタイプのマルチプロジェクトとして認識させている

## 反省点

TomcatProject内部にテストコードを書かずに、TomcatProjectGradle側にテストコードを記述することができたかもしれない。（今回のケースでは、テストコードをTomcatProject内に作成することが制約上OKだったので上記構成となっている。）

### やってること

* 外部に設置されたプロジェクトに対するBuild
* JUnitの結果レポート出力
* FindBugsのレポート出力（HTML対応）
* jacocoによるカバレッジレポート出力（HTML対応）

## 使い方

コマンドプロンプトからカレントディレクトリをTomcatProjectGradleに変更して実行してください。

### CI用に全てのタスクを適切な順序で実行する

`gradlew  clean  ci`
このタスクでは、以下のタスクが順番に全て実行されます。

1. clean … 全てのタスク実行前にクリーンする。
1. findbugs … findbugsはcheckタスクの依存関係に標準でセットされているため、check実行時に、先行して実行される。
1. testAll … check.dependsOn += testAllで依存関係をセットしているため、check実行時に、先行して実行される。
1. check … checkstyleの実行
1. checkstyleReport … check実行結果のxmlからHTMLのレポートを出力
1. jacoco … jacocoによるコードカバレッジレポートをHTML形式で出力

### 個別にタスクを実行したい場合

- 指定したTestSuiteのJUnitを実行する。
 - `gradlew testAllTests`

- FindBugsを実行する。
 - `gradlew findbugsTest`

- Checkstyleを実行する→実行後にCheckstyleのレポートを出力する。
 - `gradlew check`
 - `gradlew checkstyleReport`

- jacocoによるカバレッジレポートを出力する。
 - `gradlew jacoco`
deferについて

deferについて知らない事があったので書き留めておきます。
以下を見て知りました。
[darshanime/notes](https://github.com/darshanime/notes/blob/master/golang.org)

## 例
``` go
package main

import "fmt"

func trace(s string) string {
	fmt.Println("entering: ", s)
	return s
}

func un(s string) {
	fmt.Println("leaving: ", s)
}

func a() {
	defer un(trace("a"))
	fmt.Println("in a")
}

func b() {
	defer un(trace("b"))
	fmt.Println("in b")
	a()
}

func main() {
	b()
}
```

## 結果
``` bash
C:\Windows\system32\cmd.exe /c ( go run main.go)
entering:  b
in b
entering:  a
in a
leaving:  a
leaving:  b
```
MySQLの基本的なコマンド


ターミナルからrootでログイン
`$mysql -u root`


データベース一覧を表示する
`MariaDB [(none)]> show databases;`

hoge_databaseを選択する
`MariaDB [(none)]> use hoge_database;`

現在のデータベース内のテーブル一覧を表示する。
`MariaDB [hoge_database]> show tables;`

fuga_tableのテーブル列の情報を表示
`show columns from fuga_table;`

fuga_tableの全エントリを表示
`MariaDB [hoge_database]> select * from fuga_table;`


テーブルの作成

```
create table db_name.tbl_name
   (col_name1 data_type1,
    col_name2 data_type2, ...);
```

カラムの情報を表示
`SHOW COLUMNS FROM fuga_table`

カラムの名前を変更
`alter table Pi1_BCM change  OldName NewName boolean;`


自動インクリメントidの設定
` ALTER TABLE Pi1_BCM modify id BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY;`

追加日と変更日の自動挿入
`` `creation_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, ``
`` `modification_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ``


リクエストが有った時のクライアントの時間と、SQLサーバ側の時間を保存するテーブルの例

```
CREATE TABLE switch_time
   (id  BIGINT AUTO_INCREMENT NOT NULL PRIMARY KEY,
   creation_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
   c_date VARCHAR(10),
   c_time VARCHAR(8),
   BCM INT,
   level TINYINT(1),
   tick  INT UNSIGNED
);
```
HPバーをスライドで調整する方法

こんにちは！ほたてです。
今回は、Unityで使われるSliderを、HPバーとして使用する方法を**スクリプトの書き方**をメインにして紹介したいと思います。
スクリプト以外の基本的な手順は[こちら](https://qiita.com/KatsuyaAkasaka/items/9acd52828204b13c93f1)で紹介されているのを参考にしています。


##注意点
上記のURLを参考にした際に気をつけておかなければならないことをいくつか挙げておきます。

・MovingEnemyを選択し、必ず**MovingEnemyを親としてCanvasを作成した後にそのCanvas内でSliderを作りましょう!**おそらく、すでにCanvasはゲーム画面として使われているものがあると思いますが、それとは別にもう一つCanvasを作っておく必要があります。

・MovingEnemyにCanvasとSliderとこれから紹介するScriptをつけたら、inspectorビューの**Applyをクリック**しましょう。そうすると、プレファブ化されているゲームオブジェクト全てにHPバーが適用されます！


最終的にはMovingEnemyのヒエラルキービューはこんな感じ。Canvas名は紛らわしいのでSliderCanvasという名前に変更しています。
![スクリーンショット 2018-04-19 14.03.08.png](https://qiita-image-store.s3.amazonaws.com/0/249989/b588ca26-cc7f-2c9a-24a3-85024d756271.png)

MovingEnemyのInspectorビューはこんな感じを目指します！EnemyHPScriptの中身をこれから解説していきます！
![スクリーンショット 2018-04-19 14.03.20.png](https://qiita-image-store.s3.amazonaws.com/0/249989/d99416c0-aeab-477c-1cf4-4eb03faf8921.png)


##スクリプトでHPバーを調整する方法
本題に入る前に、おそらく、以前の鬼宿題の通りだと、MovingEnemyにはEnemyScriptが付いていたと思いますが、今回はそれとは別に新しくEnemyHPScriptというものを作りました。最終的には、EnemyScriptを外して、新しく作ったEnemyHPScriptをつけましょう。

###1:SliderのMaxvalueを調べる
まず、SliderのInspectorビューのMinvalueを0,MaxValueを1,Valueを1に設定しましょう。
![スクリーンショット 2018-04-19 14.22.09.png](https://qiita-image-store.s3.amazonaws.com/0/249989/67527896-1a8b-6270-6094-c9a6394720c4.png)

###2:スクリプト解説
本題のScriptの説明をしていきます。**slider.maxValueは敵HPの最大値**を示していて、今回だと最大HPは1です。**slider.valueは現在のHP**と考えましょう。

Startメソッドで最初に敵HPの最大値を所得して、Updateメソッドで、現在の敵HPを随時更新していきます。

Damageメソッドは前回のEnemyScriptとほぼ同じ内容ですが、最大HPを１と考えているので、ここでは一度の攻撃で0.2減る設定にしています。前回から書き換えていなければ、GunScriptからDamegeメソッドを呼び出す設定にしてあるはずなので、ここでの**関数名は必ずDamage**のままにしておきましょう！

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EnemyHPScript : MonoBehaviour {

	public Slider slider;
	float moveEnemyHp;
	public GameObject Bomb; // 爆発のオブジェクト

	// Use this for initialization
	void Start () {
		moveEnemyHp = slider.maxValue;
	}
	
	// Update is called once per frame
	void Update () {
		slider.value = moveEnemyHp;
	}

	void Damage(){
		moveEnemyHp -= 0.2f;
		if (moveEnemyHp <= slider.minValue) {
			if (Bomb) {
				// 爆発を起こす
				Instantiate (Bomb, transform.position, transform.rotation);
			}
			ScoreManager.instance.enemyCount++;
			Destroy (this.gameObject);
		}
	}

	// 物にさわった時に呼ばれる
	void OnTriggerEnter(Collider col){
		// もしPlayerにさわったら
		if (col.gameObject.tag == "Player") {
			col.SendMessage ("Damage"); //ダメージを与えて
		}
		// 自分は消える
		Destroy (this.gameObject);
	}
}
```

後は、前述したように、このScriptをMovingEnemyにつけて、sliderを関連づけましょう。そして、Applyするのを忘れずに！


##おまけ
Canvasが常にPlayerの方を向くようにするには下記のコードを**MovingEnemy内のCanvas**につけましょう!(ここではSliderCanvas)

```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIScript : MonoBehaviour {

	private RectTransform myRect;

	// Use this for initialization
	void Start () {
		myRect = GetComponent<RectTransform> ();
	}
	
	// Update is called once per frame
	void Update () {
		myRect.LookAt (Camera.main.transform);
	}
}

```
AWS CLIによるAmazon SNSのSMS通知トピック作成

基本的なことを交えて備忘録を記していきます。
用語の説明は他の方が説明してくださっているのでご参考ください。

* [Amazon SNS で、iOS・Androidにpush通知する方法#用語の整理](https://qiita.com/papettoTV/items/f45f75ce00157f87e41a#%E7%94%A8%E8%AA%9E%E3%81%AE%E6%95%B4%E7%90%86)

# 環境

* Windows 7 64bit

# はじめに

AWS CLIをインストールし、`aws configure`で必要な設定をいろいろ事前にしといてください。

# Amazon SNS

## トピックの作成

```console
> aws sns create-topic --name test
```
* 名前は任意
* ちなみに、マネジメントコンソールから作成する場合はトピック名に加えて表示名を作成できますが、`aws sns create-topic`で作成する場合はトピック名＝表示名になります。

### オプション

`--cli-input-json`と`--generate-cli-skeleton`の説明は省きます。

| オプション名 | 型 | 必須 | 説明 |
|:-:|:-:|:-:|:--|
| `--name` | 文字列 | ○ | 作成したいトピックの名前。<br>**注**：トピック名は大文字と小文字のASCII文字、数字、アンダースコア、ハイフンから構成されなければならず、また文字列長は1から256文字まででなければなりません。 |

## サブスクライブ

```console
> aws sns subscribe --topic-arn "arn:aws:sns:us-west-2:0123456789012:test" --protocol sms --notification-endpoint +8101234567
```
* SMS通知を行いたい場合は、`--protocol`オプションに`sms`を指定。
* `--notification-endpoint`に対象の電話番号を指定。

### オプション

| オプション | 型 | 必須 | 説明 |
|:-:|:-:|:-:|:--|
| `--topic-arn` | 文字列 | ○ | 作成したトピックARNを指定。<br>トピック名ではなく、ARNを指定しなければならないので注意。 |
| `--protocol` | 文字列 | ○ | 通知のプロトコルを指定。<br>プロトコルの種類の詳細は後述。 |
| `--notification-endpoint` | 文字列 | 任意 | 通知先のエンドポイントを指定。<br>プロトコル毎の対照は後述。 |

### `--protocol`の種類とそれに対応する`--notification-endpoint`

| プロトコル | エンドポイント |
|:-:|:--|
| `http` | `http://`から始まる文字列 |
| `https` | `https://`から始まる文字列 |
| `email` | emailアドレス |
| `email-json` | emailアドレス |
| `sms` | SMSが可能な端末の電話番号 |
| `sqs` | `Amazon SQS`上のARN |
| `application` | アプリケーションとして`Amazon SNS`に登録してあるエンドポイントARN |
| `lambda` | `AWS Lambda`関数のARN |

* `--notification-endpoint`は、次の`aws sns publish`でも指定できるので任意なんだと思います。
* トピックに通知先(サブスクリプション)を登録することをサブスクライブというそうですが、Pub/Subの文脈からすると個人的にちょっとまだしっくりきてないです。

## パブリッシュ

```console
> aws sns publish --topic-arn "arn:aws:sns:us-west-2:0123456789012:test" --message file://test-messagetxt
```

### オプション

| オプション | 型 | 必須 | 説明 |
|:-:|:-:|:-:|:--|
| `--topic-arn` | 文字列 | --topic-arn、--target-arn、もしくは--phone-numberのうち一つは必須 | 発行したいトピック。 |
| `--target-arn` | 文字列 | 同上 | トピックARNか、エンドポイントARN。<br>両方は不可。 |
| `--phone-number` | 文字列 | 同上 | SMSメッセージを配信したい電話番号。<br>E.164形式での指定が必要。 |
| `--message` | 文字列 | 必須 | 本文。ヘルプ見るといろいろ書いてあります。詳細は`aws sns publish help`で確認ください。 |
| `--subject` | 文字列 | 任意 | プロトコルがemailの場合の件名。 |
| `--message-structure` | 文字列 | 任意 | "json"のみが指定できる有効な値。"json"を指定すると、`--message`オプションにjsonを指定でき、[ここ](https://docs.aws.amazon.com/ja_jp/sns/latest/dg/PublishTopic.html)に書いてあるような、プロトコル毎に異なるメッセージの送信が実現できる |
| `--message-attributes` | map | 任意 | map形式でメッセージ属性を指定。 |

# 雑感
`Amazon SNS`のSMS通知が制限にひっかかってしまい、それなりの数の送られるべきSMSメッセージが滞留しっぱなしになってしまったので、制限緩和申請適用後に一斉通知を楽にすべく色々調べました。
結果としてあまりSMSに限定されない内容になってしまいました・・・

ご指摘ございましたら是非コメントや編集リクエストお願いします。
C++ Builder 10.2 Tokyo > Key > ProgramID > com.embarcadero.$(ModuleName) > for non windows platforms (e.g. android)

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

「バージョン情報」に見慣れない文字列(ProgramID)が見られる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/22409e8c-d790-16ef-53dc-9b8c3736d70d.png)

何に使うのか?

https://www.finalbuilder.com/resources/blogs/postid/752/delphi-versioninfo-errors

> "What's this ModuleName variable?? What's com.embarcadero.$(ModuleName) ? I didn't put that there...."
>
Or "what's this MSBuildProjectName variable?"
>
This all stems from Embarcadero's support for non windows platforms (in this case I would suggest andriod). The default values for version info Berlin and later have "$(ModuleName)" in the FileDescription, ProductName and ProgramID fields.

non windows platforms環境用のキーのようだ。

[unity > android > Bundle Identifier has not been set up correctly > 数値や_で始めたらだめ](https://qiita.com/7of9/items/f29a37bbef952b84709c)
で指定した「com.unity3d.2dHideLineOnPanel」に似ている。
google api ツイート内容を140文字以上取得する

# 標準では140以上の時は省略される

```
$param = array(
    "count" => 200,// max 200
    // "exclude_replies"  => true,
    "include_rts" => 1
  );

$result = $twitter->get(
    "statuses/user_timeline",
    $param
);
foreach($result as $tweet)
{
  print_r($tweet);
}
```
この$tweet->textに入る文字は140以上になってしまう時、語尾に切り捨てられ「…」が代わりに追加される。

全文表示させたい時は$paramに
`"tweet_mode" => "extended",`
を追加。
公式ドキュメント https://developer.twitter.com/en/docs/tweets/tweet-updates

とあるのだが、
以前場合によって切り捨てられてしまう。

`display_text_range`が140で切り捨てられている。
URLとかの場合は肥えて表示されているようだが…。

と思ったがそれはRTの時だけのようなので、
まぁこのままでいいということになった。

結果的に下記

```

$param = array(
    "count" => 200,// max 200
    // "exclude_replies"  => true,
    "include_rts" => 1,
    "tweet_mode" => "extended",
    "truncated" => false
  );

date_default_timezone_set('Asia/Tokyo');
foreach($result as $tweet)
{

    if(($tweet->id != $max_id) && strpos($tweet->full_text , $hashtagTxt) !== false) {
      $day = date("Y.m.d", strtotime($tweet->created_at));
      $twArray[$inputI]["id"] = $tweet->id;
      $twArray[$inputI]["txt"] = $tweet->full_text;
      $twArray[$inputI]["date"] = $day;
      $twArray[$inputI]["url"] = "https://twitter.com/".$tweet->user->screen_name."/status/".$tweet->id;
      $inputI++;
    }
    $i++;
}
```
text が full_textになるから注意。
またdateは日本設定にしておかないとずれてくるのでそれも注意。