OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】PHPのメール送信

メールフォームもどきの実装の備忘録です。

**※2019/03/16追記：
コメントにもありますが、今回の用途は、限られたローカルでの利用だったため、
本番利用できるようなものではないです。**


## javascript
POSTしている箇所(javascript)

```.javascript
submit(){
  const data = {
    from: "hoge@gmail.com",
    to: "fuga@gmail.com",
    title: "メールのタイトル",
    body: "メールの本文"
  };

  const xml = new XMLHttpRequest();
  xml.open("POST", "control_unit.php", false);
  // HTTP リクエストヘッダーの値を設定。setRequestHeader: openの後、sendの前に記述する。
  xml.setRequestHeader("Content-Type", "application/json");
  xml.send(JSON.stringify(data));
}
```

## php
値を受け取ってメールとして送信(php)

```.php
$request = json_decode(file_get_contents('php://input'), true);

class mail {
  public function sendMail() {
    global $request;
    mb_language("Japanese"); // 文字化け対応
    mb_internal_encoding("UTF-8"); // 文字化け対応
    $email = $request["from"];
    $subject = $request["title"];
    $body = $request["body"]."\n";
    $to = $request["to"];
    $from = "From: $email\r\nReturn-Path: ".$email;

    mb_send_mail($to, $subject, $body, $from, "-f ".$email);
  }
}

$mail_class = new mail();
echo $mail_class -> sendMail();
```

##XAMPPの設定（windows）

###xampp/php/php.iniの設定

```.ini
;設定前
;sendmail_path =

;設定後
sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t"
```

###xampp/sendmail/sendmail.iniの設定
```.ini
;outlookの場合
smtp_server=smtp.office365.com
smtp_port=587
auth_username=各自のアドレス
auth_password=各自のパスワード
```

上記設定したら、Apacheの再起動を忘れずに。

macはSMTP認証なしで送れたけど、windowsのそこらへんがよくわからなかった。
外付けHDDにある音楽データをiTunesに表示させる方法

##外付けHDDにある音楽データをiTunesに表示させる方法
Macの容量がいっぱいで、外付けハードディスク(Apple LaCie)にiTunesに入っている音楽を移行しました
このままではiTunesライブラリに外付けHDDに入っている音楽が表示されません。

iTunesアプリを閉じて完全に終了する
↓
iTunesアプリが完全に開いてない状態
↓

```
option＋iTunesアプリクリック
```

↓
![スクリーンショット 2019-03-16 13.50.10.png](https://qiita-image-store.s3.amazonaws.com/0/95187/00330e88-c4fc-b95e-aac7-b4129e67ceab.png)
ライブラリを選択をクリック
↓
![スクリーンショット 2019-03-16 13.52.59.png](https://qiita-image-store.s3.amazonaws.com/0/95187/bea89747-6f58-b601-7ea6-51a43a8f2bed.png)
外付けHDDの音楽フォルダをここで選択したいので
外付けHDDの中にあるiTunes Library.itlファイルを選択
↓
開く

これで外付けHDDの音楽がiTunesに表示されます


※外付けハードディスクにはiTunesアプリは移行できません。iTunesの中の写真、音楽は移行できます。
壊してよいオモチャ(Breakable Toys)について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/431158d1-720f-34ce-65d7-c8d8eb67c723.png)

こちらの本を読んでパターンを1つずつまとめ
個人的に実践可能そうなものから

## アプレンティスシップ・パターンとは
アプレンティスシップとは徒弟制度のことで、よく起きる問題への共通の解決策に実際なっているものをパターン化したもの

### アプレンティスであるということは
**今まで行ったことや今やっていることをより良く、さらに賢く、もっと速く行う方法が常にあるという態度を基本的に持つこと**

## 前提
- あなたの曖昧で暗黙の知識を他の人々が共有できると、安易に思い込まない事
- パターン同士は結びついているので、あるパターンを既に知っているという事は未知のパターンを辿る事ができる
- 優れたプログラマになる方法を教えるのではなく、優れたプログラマになるための学び方を教える

## 壊してよいオモチャ(Breakable Toys)とは
サンドボックスを作りましょうという事

## 傾向
成功と同じ数(もしくはそれ以上)の失敗を経験するもの

## 問題
業務は基本的に、失敗は許されない環境。
しかし学びの最善策は、たいていは失敗すること。
困難時の再挑戦だけが私達を成長させる。

## 解決方法
既知の業務システムの類似システムをオモチャのシステムとして構築することで失敗できるようにする

## ポイント
- 生活に関連した有用なシステムを選定する
- 車輪の再発明かどうかは関係なく、試行可能かつ被害が自分だけな事に価値がある
- 典型例は独自のwikiを実装する事
- 重要なのは新たなことを学ぶ事
- オモチャであり楽しめるべきである事を忘れない

## 行動
- 好きなツールで、最も単純で、最高の品質のwikiを作る
- 最小構成でリリースする
- 開発者として興味のある事を追求する
- 例えば得られるもの
  - HTTP
  - REST
  - 構文解析
  - ウェブデザイン
  - キャッシング
  - 全文テキスト検索
  - データベース
  - 並列性
  - ストレージ
  - マイグレーション
  - データ移行

## 関連パターン
- [最低である(Be the Worst)](https://qiita.com/dich1/items/d08e6e21007218fc9f38)
- 無知をさらけ出す(Expose Your Ignorance)
- 学びを記録する(Record What You Learn)
- ソースを活用する(Use the Source)

## 書籍情報
Dave H. Hoover (著), Adewale Oshineye (著), 柴田 芳樹 (翻訳), アプレンティスシップ・パターン
https://amzn.to/2UCKF9D

## 雑感
環境構築がすぐできるというのが大前提とは感じる
Shade3D(ver16)で、Pythonスクリプトで生成したデータを、3Dプリンタ用に整形する

＜Shade3D(ver16)＞

Pythonスクリプトで、小さな球を、たくさん配置することで、数式に従った図形を作ることができる。

→前記事参照
[Shadeスクリプト(Python)で、メビウスの輪を作る](https://qiita.com/santarou6/items/2856ce018b3ce5627f8f)

この場合、たくさんの小さなオブジェクトが配置されることになるが、一体化して、一つのオブジェクトにしないと３Ｄプリント用のデータとならない。

この整形に一定のコツがあるので、ここにメモする。
（一つのやり方に過ぎないので、単にご参考）

１．
まず、スクリプト実行後、多数配置される、「球」を全選択する
<img width="839" alt="１.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/ffc92e32-9d04-d9c8-1764-677ce14b980e.png">

２．
「編集」、「共通」から、「ラッピングメッシュ」
<img width="318" alt="２.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/6f206a4b-31a0-70e1-ee30-0541f2b31d1a.png">

3.
一体化された、「ポリゴンメッシュ」ができる。ので、これ以外（の多数の「球」）を全部捨てる
<img width="521" alt="３.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/3c457af9-2afc-678c-8d3d-666fee2c559c.png">
<img width="245" alt="４.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/7a3a7021-bea1-271e-f75d-9db33ae20b77.png">

４．
出来たポリゴンメッシュは、メが細かすぎるので、
「編集」、「メッシュ」から、「ポリゴンリダクション」
削減率は、「0.1」にする、を二回ほどやれば、程々に減る
<img width="281" alt="５.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/7e761e5d-d2cd-19c4-6f22-edd5e04a60d6.png">
<img width="445" alt="６.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/770ff78f-6e7b-a281-ad53-b85fac43e0f0.png">
<img width="419" alt="７.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/af4b1dfd-1a47-04d0-50d6-60e47072f339.png">

５．
多少、角ばっているので、
「編集」、「メッシュ」から、「スムーズ」。
やればやるほどなめらかになるものでもなく、やりすぎると逆になめらかさが減るので「レベル」はすこし上げる程度（私は「0.2〜0.3」にしている）
<img width="285" alt="８.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/5d280182-b678-3485-877c-dc18a3d956ba.png">

6.
３Ｄプリント用に、stlファイルを出力へ。
「一括チェック」を経て、「STL出力」へ
<img width="279" alt="９.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/5a71433a-ece9-0c6d-2594-c472f53a96a1.png">
<img width="580" alt="１０.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/cbdc556a-be46-3e6a-4a88-bbecfdc4ea63.png">
<img width="269" alt="１１.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/ddcad846-14c0-1a4f-5a36-3f605c28cb01.png">

7.
参考（ウェブ上にstlファイルを配置し、viewstlから参照することで、動かして見せることができる）
[viewstl](https://www.viewstl.com/?embedded&url=http://thomas.cranky.jp/stl/sample_kiji.stl)

<img width="456" alt="１２.png" src="https://qiita-image-store.s3.amazonaws.com/0/107418/0d94e7b3-f61a-e495-4552-ffd7f6661ddb.png">
JSON入門

# JSON入門
[JSON入門 レッスン1 JSON概要 \- YouTube](https://www.youtube.com/watch?v=emUeHPKaYGE&feature=youtu.be&list=PLXOP1_-wmgsDGSTj-jRjKqNlOrb0kR16Z)
## JSONとはなんなのか？
* ObjectとArrayの組み合わせ

Java Script Object Notation というくらいなので、

* JavaScriptのオブジェクトをそのままの形で文字列化したもの
* 構造としてkey・value形式
* valueには配列もオブジェクトも入れられる

こんなの

```json:animal.json
[ 
{ 
    "name": "Meowsy", 
    "species" : "cat", 
    "foods": { 
        "likes": ["tuna", "catnip"], 
        "dislikes": ["ham", "zucchini"] 
    } 
}, 
{ 
    "name": "Barky", 
    "species" : "dog", 
    "foods": { 
        "likes": ["bones", "carrots"], 
        "dislikes": ["tuna"] 
    } 
}, 
{ 
    "name": "Purrpaws", 
    "species" : "cat", 
    "foods": { 
        "likes": ["mice"], 
        "dislikes": ["cookies"] 
    } 
} 
] 
```
### 特徴
* 平易なテキストデータ
* XMLと違って軽い
* 形式がJavaScriptのオブジェクトと同じ形式なので、プログラムで容易に取り込める

### データ型
* 文字列
* 数値
* ブーリア
* 配列
    * [] で囲む
* オブジェクト
    * ｛｝で囲む
    * keyとvalueの形式にする必要がある


### [JSONLint \- The JSON Validator](https://jsonlint.com/?code=)
jsonの形式が正しいかどうかをvalidateしてくれるエディター

JavaScriptにて

オブジェクトをJSONに変換する

```js
JSON.stringify(Animals)
```

JSONをオブジェクトに変換する

```js
JSON.parse(Animals)
```
Viewcontroller、CustomViewでよく使うスニペット

#1.はじめに
仕事でこれだけあればとりあえず新規画面では労力軽減。
毎回一から入力するのがとても面倒なのでスニペットに登録しておくと捗ります。
毎度おなじみ備忘録兼ねて載せます。

#2.スニペットとは?
[Xcodeでコードスニペット（入力補完）を追加する方法【開発効率向上】](https://qiita.com/gmaesak/items/d53d82b170e3486f0886)
に色々載っているますが、ちょっと古いので、Xcode10で位置が変わっているので載せますが、皆さんご存知だと思います。ビギナー向けです。
Xcodeのこの位置にあるやつです。

<img width="1280" alt="スクリーンショット 2019-03-16 12.24.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/52d9745c-9006-fd4e-a9ec-96adc1ddcc8a.png">

#3.スニペット登録方法
登録したい範囲を選択状態にして、右クリックから`Create Code Snippet`をクリックすると画像のように登録画面詳細が出て、初期状態ではtitleに`My Code Snippt`だけが入っているので、あとはお好みで変更して閉じれば完了です。
とても簡単です。

<img width="746" alt="スクリーンショット 2019-03-16 12.28.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/dc3f0644-c5b8-efb3-92b4-2161dcac9481.png">

<img width="1279" alt="スクリーンショット 2019-03-16 12.27.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/3878aab7-5b1c-d3d6-f9d2-b2e50fd09266.png">

あとはスニペットをタップするか、キーワードを記述すると予測変換で出てくるようになります。

<img width="457" alt="スクリーンショット 2019-03-16 12.27.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/b630b0a9-e716-2103-9a77-06cf056521c2.png">

<img width="567" alt="スクリーンショット 2019-03-16 12.52.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/184792/a1f46c25-98d5-e85f-2304-e9490dcb4444.png">


#4.よく使うスニペット
###1.ViewController

```swift
// MARK: - IBOutlet Properties
    
    // MARK: - Properties
    
    // MARK: - Private Properties
    
    // MARK: - Override Funcs
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.initView()
    }
    
    // MARK: - IBAction
    
    // MARK: - Public Funcs
    
    // MARK: - Private Funcs
    
    private func initView() {
        
    }
```

###2.CustomView

```swift
// MARK: - Outlet Properties
    
    /// コンテントビュー。
    @IBOutlet var contentView: UIView!
    
    // MARK: - Properties
    
    // MARK: - Private Properties

    // MARK: - Override Funcs
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.commonInit()
    }
    
    // MARK: - IBActions
    
    // MARK: - Private Funcs
    
    /// xibからカスタムViewを読み込む。
    private func commonInit() {
        Bundle.main.loadNibNamed("hogehoge", owner: self, options: nil)
        
        // Viewの大きさを定義
                self.contentView.frame = self.bounds
                self.addSubview(self.contentView)
        
                // xibファイルのViewをカスタムViewクラスに追加する
                addSubview(self.contentView)
    }
    
    // MARK: - Public Func
```

#5.最後に
毎回こんなことしてたら日が暮れる...は言い過ぎですが、先に定義しておくとあとでリファクタリングしなくて済みます。
あとはテーブルビューのdelegate、datasourceでデフォルトで使う関数を全て１つのスペニットとして登録しておいて使い回したりもありですね。
ストーリボードスニペット機能とかあればもっと捗りそうですよね。
以上、少ないですが、皆さんもスニペット使ってみてください。
[書き途中]SQL練習問題詰め合わせ

-商品ごとに、売上数量の一番多い担当者を取得し、商品 ID、商品名、該当の担当者 ID、担当者名を表示せよ

```sql:sample

SELECT
    Product_M.Product_ID,
    Product_M.Product_name,
    ISNULL(担当者Product_毎売上.担当者ID, 0) AS 担当者ID,
    ISNULL(担当者M.担当者name, '（該当なし）') AS 担当者name,
    ISNULL(担当者Product_毎売上.売上数量, 0 ) AS 売上数量   -- 問題に指定はないが参考情報として表示
FROM
    Product_M
    LEFT JOIN (
        -- Product_毎の最大数を求めるサブクエリ
        SELECT
            担当者Product_毎売上temp.Product_ID,
            MAX(担当者Product_毎売上temp.売上数量) 売上数量最大
        FROM
            (
                -- Product_と担当者毎の売上数量の合計を求めるサブクエリ
                SELECT
                    売上データ.担当者ID,
                    売上データ.Product_ID,
                    SUM(売上データ.数量) 売上数量
                FROM
                    売上データ
                GROUP BY
                    売上データ.担当者ID,
                    売上データ.Product_ID
            ) 担当者Product_毎売上temp
        GROUP BY
            担当者Product_毎売上temp.Product_ID
    ) Product_毎売上最大
    ON Product_M.Product_ID = Product_毎売上最大.Product_ID
    LEFT JOIN (
        -- Product_と担当者毎の売上数量の合計を求めるサブクエリ
        SELECT
            売上データ.担当者ID,
            売上データ.Product_ID,
            SUM(売上データ.数量) 売上数量
        FROM
            売上データ
        GROUP BY
            売上データ.担当者ID,
            売上データ.Product_ID
    ) 担当者Product_毎売上
    ON  Product_M.Product_ID = 担当者Product_毎売上.Product_ID
    AND Product_毎売上最大.売上数量最大 = 担当者Product_毎売上.売上数量
    LEFT JOIN 担当者M
        ON 担当者Product_毎売上.担当者ID = 担当者M.担当者ID
ORDER BY
    Product_M.Product_ID
```
CLIでS3にバックアップファイルを転送してみる

# 経緯
利用しているサービスでローカル上にバックアップが作成され、サーバーダウンでバックアップファイルも消えるという本末転倒な状態だったのでローカルのバックアップファイルをS3に転送するというスクリプトを作成しました。

# バックアップ仕様
- ローカルのバックアップファイルは毎日作成され「日付.zip」という命名で作成される

# 環境
- CentOS6系

# 事前準備
1. S3のバケットを事前に作成しておきます。
2. [参考資料](https://aws.amazon.com/jp/getting-started/tutorials/backup-to-s3-cli/)を参照してIAMのユーザー作成をして*Access Key ID*と*Secret Access Key*を取得してください。  
参考資料では*AdministratorAccess*を付与していますが、S3を利用する場合は権限設定はS3だけでいいと思います。  
*aws configure*の*Default region name*は東京リージョンであれば「ap-northeast-1」を設定してください。

# 利用について
毎日クーロンで実行することを想定しています。
また、バックアップファイルが溜まっていく一方なのでS3とローカルから削除する処理も追加しております。
バックアップファイルの容量が大きく、S3の料金が高額になってしまうことを防ぐためです。

# スクリプト
```sh:main.sh
#!/bin/bash
today=$(date "+%Y%m%d")

# ファイルの存在チェック（ファイルパスは適宜変更）
ls -l /file_path/${today}.zip
file_check=`echo $?`

if [ ${file_check} -eq 0 ] ; then
  # ローカルファイルをS3のバケットに送る（バケット名は適宜変更）
  aws s3 cp /file_path/${today}.zip s3://bucket_name/
fi

# 過去10日のバックアップファイルを削除
targetDay=`date --date "${today} 10 days ago" +%Y%m%d`

# ローカルに削除対象のファイルが存在するかチェック
ls -l /file_path/${today}.zip
local_backup_check=`echo $?`
if [ ${local_backup_check} -eq 0 ] ; then
  rm -f /file_path/${targetDay}.zip
fi

# バケット内に削除対象のファイルが存在するかチェック
aws s3 ls s3://bucket_name/${targetDay}.zip
s3_backup_check=`echo $?`
if [ ${s3_backup_check} -eq 0 ] ; then
  aws s3 rm s3://bucket_name/${targetDay}.zip
fi
```
以上です。
他にもCLIでS3を操作できるのでいろいろ試してみようかなと思っています。

# 追記
事前準備で「アクセスキーとシークレットアクセスキーを取得してください」と記載しましたが、
EC2でCLIを利用するのであればRoleを利用した方法もあります。
というかRoleが推奨されているようです。
試してみるって悪いこと？

# 事の起こり
以前いた現場で、「JavaのSimleDataFormatって、この仕様の場合どう使えばいいんですかね？」という質問というか雑談をされた。

# ほんなら別クラスで試してみたら？
使ったことのある人ならばわかると思うんですけど、あれの使い方、ソラで出てきます？
「これで合ってるだろ」でいきなり実装に入れて、本当にそれ思った通りの動きします？
テストする段階で、うわーもっとちゃんと調べとけばよかった！ってなるより、個人的には「別クラスでmain作って、そこでサンドボックス的に試す」ほうがいいんじゃないかと思います。
だって、そこコケたり想定外の動きしたら、後続のテスト止まるじゃないですか。
テスト担当者が自分ではない場合、そういう細々したバグ挙がって対応で手が止まるぐらいなら、サンドボックスで試してから実装に入れるほうが堅実（という言葉が適切かはわからない）じゃないかなと思います。

# すごく難色を示された
「まぁあなたはそういうやり方なのかもしれないですけどね」的なことを言われた。
うーん、それってバッチリな答えを他人から引き出したかっただけなのかな。
自分で試してみて、「こうしてみたけど、こんな結果になって思い通りにならなかった」っていう証跡を他人に見せないと、答えも引き出せないと思うんだけどなぁ・・・。
試してもないけど、答え教えて！って、傲慢というかテキトー過ぎない？
でもこれって、他人に仕事のスタイルを強制する手段なのかなあ。

# とりあえずやってみて、ダメなら聞いてみるスタイル
最近の社員さんはわからないけど、私が新入社員だったとき（遠い目）に上司からよく言われたことは

+ そのわからないって言ってること、どこまで調べた？
+ 調べてどこまで自分でやってみて、どこがわからなかった？
+ どっちもやってない？じゃあ○ね（一応伏せ字にしておくよ！）

でした。
当たり前ですよね。調べてもない、やってもないのに「わからないよぅ」って聞いてたんですから（恥ずかしい・・・）。
でもこの当たり前が意外と出来てなかったりする。
調べて・やってみて自分の寿命が縮む呪いをかけられてるならしょうがないですけど、そうでもないなら命までは取られないんだし、とりあえずやってみよう。それでダメなら聞いてみよう。
聞いてみるステップの前に「今自分は何がわかってないんだ」という整理が出来るので、私はそういうスタンスで仕事をしてます。
他人に聞く前に要点を整理するって大事じゃないかな。
私がよくやりがちなんですけど、要点が整理出来てないせいで、言ってることが支離滅裂になって相手に伝わらないんですよね・・・これは気をつけたい。ほんとに。

# わからないところは紙に書いてはいけない
やりがち。紙に残すだけまだいいんですけど、「ここわからないんですよね」って見せられた自筆の字が汚すぎて読めない・・・
と、「あー、そういうことですね。わかりました！」ってその紙に追記しているようなのだけど、所詮裏紙だったりするので扱いをテキトーにしちゃうんですよね。挙げ句
「あれってどうやったっけ・・・確か質問して答えも書いといたけどあの紙どこ行ったっけ・・・まぁええわもう１回聞いたろ！」
という、聞く人・聞かれる人どちらにも幸せではない結果が生まれます。かなしい。
せめてテキストファイルに残すとか、メールやExcel等眼の前の箱にいくらでも残す手段はありますやんか。
「おれのさいきょうのずのうにのこってるからへいき」
という人はすみません、一緒に仕事したくないです・・・自分ではその頭脳信用出来るのか知らんけど、私はその頭脳見られないからわかんないから信用出来ない。
人の記憶力って大したことないですよ。私昨日飲んだ酒の種類も忘れてるし。
あと、そういう人って周りが優秀だから助かってるだけ、ってこと多い気がします。

# まとめ
+ Utilの使い方がわからない？じゃあ目の前の箱でそのUtil切り出して試してみればいいじゃない。
+ 調べてもない・やってみてもない？ちょっと会議室行こうか（ﾆｯｺﾘ）。
+ 調べて・やってみたけどわからない。人に聞く前に「わかっていないこと」をまず整理する。
+ わからないこと・わかったことは紙に書くべきでない。頭の中にあるとか論外。
+ 昨日飲んだ酒、9999や（今思い出した）。
Rubyでinterfaceっぽいことをやってみる

こんな感じ？

```ruby
# モジュールの特異メソッド(モジュールメソッド) の使い方はこちらをご参考
# https://qiita.com/fukumone/items/95117f418dec590ebbc8s

module BasicInterface
  def self.check_methods(klass, method_symbols)
    puts "Cheking #{klass} class..."

    method_symbols.each do |symbol|
      if klass.instance_methods.grep(symbol).length == 0
        puts "you must implement '#{symbol}'"
        raise NoMethodError
      end
    end

    puts "#{klass} has included #{self}!"
  end
end

module DisplayInterface
  include BasicInterface
  def self.included(klass)
    must_define_methods = [:input, :output, :frequency]
    BasicInterface.check_methods(klass, must_define_methods)
  end
end

class YabaiDisplay
  def input ;  end
  def output ;  end
  def my_option ;  end

  # 下のコメント外すとクラスが定義できるのが確認できます。
  # def frequency ;  end

  # 先にメソッドが定義されないといけないので最後にincludeする
  include DisplayInterface
end

```
#1 心が色で伝わるランプアート「sentiment」

![IMG_1531.JPG](https://qiita-image-store.s3.amazonaws.com/0/64515/bde106da-0b4a-64b7-3008-5cdff2d4c1a2.jpeg)

最近起きている間は仕事をするか作品を作るかの生活をずっと続けており、楽しくやっております。
こちらで作った作品をご紹介していければと思います。


##作品名

「sentiment」


##コンセプトムービー
https://www.youtube.com/watch?v=Ee3RUH2pmCY


##コンセプト

私たちがインターネット上で文字でコミュニケーションをとる際、知らず知らずのうちに自分の中に生じた様々な感覚を捨象しています。
色や香り、味といった様々な感覚が絡み合って心の中に芳醇な感覚が生まれていても、気持ちを人に伝える時にはテキストで例えられる範囲で表現しているのです。
sentimentは自然言語処理の技術を使い、あなたが発した言葉からあなたの心の中に灯っていたであろう色を予測して相手に伝えます。
LINEで送ったメッセージの内容を19種類の感情に分類し、それぞれの感情に応じた色の光を発してくれます。
sentimentは他者に伝えるために一度エンコードされたあなたの気持ちを再びデコードし、より豊かなコミュニケーションを可能にするメディアです。


##原理・アーキテクチャ

今回の作品はおおまかに下記のような流れで動いています。
![sentiment.png](https://qiita-image-store.s3.amazonaws.com/0/64515/3994343f-cacb-03d6-ca8d-58cb3c1c3213.png)

1.LINEで送信されたテキスト情報をLINE Messaging APIでnode jsで立てたサーバーに連携
2.テキスト情報感情分析APIで分析
3.感情分析の結果をRGB値に対応させてhttp経由でESP-WROOM-02開発ボードに受け渡し
4.RGBごとに電圧を変えて発光色を決定

感想などいただけると嬉しいです。引き続き作品作り頑張ります！
【Android初挑戦シリーズ】kotlinでのswitch/caseはwhen

こんなかんじでTwitterのクローンアプリを実装しながらAndroidの学習を進めています。
<img width="417" alt="スクリーンショット 2019-03-16 10.56.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/114709/369a281c-02be-52fe-8072-a6b46a9fa6e5.png">

# whenをみかけた場所
Twitterのタブレイアウトを実現しようと思ってたのでタブレイアウトを最初にやってたらwhen文に出会いました。

```kotlin:MainActivity.kt
private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->

        when (item.itemId) {
            R.id.navigation_home -> {
                message.setText(R.string.title_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_search -> {
                message.setText(R.string.title_search)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                message.setText(R.string.title_notifications)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_directmail -> {
                message.setText(R.string.title_directmail)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }
```

どうやらAndroidではActionイベントがコールバックで取得できるっぽい。
ボトムバーが押された時に、押されたボタンにテキストを設定して選択中モードにする処理が書いてあります。
(むかーし大学でAndroid勉強した時は、イベントリスナーに登録してSwift/ObjcのDelegateっぽいので処理書いてた気がする。)

## kotlinの場合
よくある `switch` でなく、`when` を使います。それに、 `case G: ` のような記述ではなく、`G ->`のようにアロー演算子(?)的な書き方をします。複数行の処理を書きたいときは `-> { }` のように中括弧で囲むようです。`default` のラベルも必要ないです。(`else`として書けます)

(caseが重複しそうなのでAmazon→Microsoftにしてます)

```kotlin:when.kt
when (stringValue) {
    "G" -> print("Google")
    "A" -> print("Apple")
    "F" -> print("Facebook")
    "M" -> print("Microsoft")
    "GAFM" -> {
        print("Google")
        print("Apple")
        print("Facebook")
        print("Microsoft")
    }
}
```

#swiftの場合
比較対象としてSwiftで書いてみます。swiftは基本的には条件分岐のオペランドには()が必要ないです。(つけても良い)。馴染み深い `switch/case` スタイルですね。複数行の処理もそのまま書けば良いだけです。 `kotlin` も `swift` も、新しい言語なのでどちらも`break` は必要じゃないですね！(かってにbreak

(クセで改行してますが、`case "G": print("Google")` と1行でも書けます)

```swift:switch.swift

switch stringValue {
case "G":
    print("Google")
    
case "A":
    print("Apple")
    
case "F":
    print("Facebook")
    
case "M":
    print("Microsoft")

case "GAFM":
    print("Google")
    print("Apple")
    print("Facebook")
    print("Microsoft")

default:
    print("Swiftではケースを網羅した時以外はdefaultが必要です。")
}

```

# TODO
わかったら書くリスト！
- Androidでのテスト
- AAC
- LiveData
- Fragment
- Activity
- ライフライクル
SQL Server > エラー:18456 でログインできない場合



サーバーを構築した直後とか、
パスワードは間違ってないはずなのに、SQL Server認証でログインできないという場合。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/98270d1a-d09e-c310-7776-70792b5b6fda.png)


## 1. 確認
サーバー・プロパティ → セキュリティ → サーバー認証
`SQL Server認証モードとWindows認証モード`が選択されているか確認する。


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/e692ce60-43bb-cc0e-0ae6-19de761b5b7f.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/563eac1c-5e95-556c-0b64-f733aaf5f895.png)


## 2. 再起動
SQL Serverの再起動を行う

SQL Server 構成マネージャーを開く

以下のどちらかで開く
- コントロールパネル → 管理ツール → コンピューターの管理
- SQL Serverツール群の中の SQL Server 構成マネージャー


↓の例は、コンピューターの管理の中のSQL Server 構成マネージャー
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/50dc0710-0ad2-83c4-dc41-f02b92c3ad2d.png)


以上
Cloud 9(AWS)でReact環境

最近、Awsの勉強をはじめました。
今回はCloud 9上でreact環境を整えたいと思います。

cloud 9上でEC2をたてことを前提にすすめます。

```
#まずはnpm init
npm init

#reactインストール
npm install react --save

#react便利ツールのインストール
npm install -g create-react-app

# nvm(最初から入っている)を使ってバージョンアップ(デフォルトで6系が用意されている)
nvm install v8

#アプリケーションの作成
create-react-app app

#起動
cd app
npm start

```
Amazon Linux 2で、あるユーザをsudoできるようにする

## sudo設定の変更

sudo設定ファイルを開く

```
sudo visudo
```

下記の行を変更

```
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL
# ↑ これをコメントアウト

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL
# ↑ これをコメントアウトを外す
```

## ユーザをwheelグループに追加する

```
sudo usermod -aG wheel 対象ユーザ名
```

## 対象ユーザがログイン中の場合はログインをしなおす

ログイン中だと反映されませんので、一度ログアウトしてログインします。
eksctlのconfig-file構造（v0.1.24）

https://github.com/weaveworks/eksctl/blob/0.1.24/pkg/apis/eksctl.io/v1alpha4/types.go
--config-fileを使うときのテンプレメモ（動作未確認）
exampleのyamlはあったが全項目網羅してそうなものが見当たらなかったので
まあしかしすぐに古くなる…

```yaml:tmpl.yaml
apiVersion: eksctl.io/v1alpha4
kind: ClusterConfig

metadata:
  name: string
  region: string
  version: string
  tags:
    string: string

nodeGroups:
  - name: string
    ami: string
    amiFamily: string
    instanceType: string
    availabilityZones:
      - string
    tags:
      string: string
    privateNetworking: bool
    securityGroups:
      attachIDs:
        - string
      withShared: bool
      withLocal: bool
    desiredCapacity: int
    minSize: int
    maxSize: int
    volumeSize: int
    volumeType: string
    maxPodsPerNode: int
    labels:
      string: string
    allowSSH: bool
    sshPublicKeyPath: string
    SSHPublicKey:
      - byte
    sshPublicKeyName: string
    iam:
      attachPolicyARNs:
        - string
      instanceProfileARN: string
      instanceRoleARN: string
      instanceRoleName: string
      withAddonPolicies:
        imageBuilder: bool
        autoScaler: bool
        externalDNS: bool
    PreBootstrapCommands: 
      - string
    overrideBootstrapCommand: string
    clusterDNS: string

iam:
  serviceRoleARN: string

vpc:
  id: string
  cidr: ipNet
  securityGroup: string
  subnets:
    private:
      string:
        id: string
        cidr: ipNet
    public:
      string:
        id: string
        cidr: ipNet
  extraCIDRs: 
    - ipNet
  sharedNodeSecurityGroup: string

availabilityZones:
  - string

status:
  endpoint: string
  certificateAuthorityData:
    - byte
  arn: string
  stackName: string
```

これにない項目はおとなしくflagで付けましょう

具体的なほうはこっち
https://github.com/weaveworks/eksctl/tree/0.1.24/examples
Contentful x React でWebページ作成

#Contentful x React でWebページ作成
ContentfulというHeadless CMSを使って、簡単にwebサイトが管理できるかやって見ました。
ググって組み合わせが少なそうな、Reactを選択して試して見ました。

##やること
- Contentful上で管理された、コンテンツをReactで作った簡易のWebページに表示すること
- (Viewがあれば）　BlogのPaginationの管理を行う


###Contentful上でのプロジェクト作成
ここは、すでに色々なサイトで記載されているので、そちらをご参考にしてください。
参考
https://note.mu/kenhasuda/n/n8c64a658dcfe

ここで、やりたいこととしては、以下２つです

- アカウントを作る
- サンプルコンテンツを作る（要は、contentful上にデータを置くこと）

###ReactでContentfulを参照するコードを作成する
まず、SDKをインストールします

```
npm install contentful
```
次にAPIを参照するためのconfigの設定をします

```config.js
//spaceおよびaccessTokenは各自のアカウントを使ってください
config={
   space:'******',
   accessToken:'********'
}
```
次に、Contentfulへ参照するAPIを使うコードを書きます。

```Contentful.js
import React, { Component } from 'react';
import * as contentful from 'contentful';
import config from config.js

const Contentful=(skip,data)=>{
   var client = contentful.createClient(config);

       //contentfulのAPIを使ってデータを参照する
   return new Promise(function(resolve,reject){
       client.getEntries({
           order: 'sys.createdAt',
           'content_type': data,
           //1ページあたりのコンテンツ数
           'limit':2,
       }).then((entries) => {
           console.log(entries);
           resolve(entries)
         })
   })
}
export default Contentful

```
これでOK。次に、実際にContentful.jsを実行さたあと、返ってくるログを見ると。

```
includes: {Asset: Array(2)}
items: (2) [{…}, {…}]
limit: 2
skip: 0
sys: {type: "Array"}
total: 5
stringifySafe: ƒ value()
toPlainObject: ƒ value()
__proto__: Object
```
細かい内容は、ログを見てもらえればApp.js側で表示する場合、返値.itemsで値をとればOKです。下のソースだと、(１)のところですね。
ここでは、titleのみを表示させるので返値.itmes.fields.titleなので、(2)のようになります
Mapの回し方については、割愛します。

```Body.js

import React, { Component } from 'react';
import Contentful from './Contentful'

class  BodyHome extends React.Component{
   constructor(props){
       super(props)
       this.state={
           arraryData:[],
       }
   }
   componentDidMount(){
       Contentful().then((resolveData)=>{
           console.log(resolveData);
           this.setState({
               arraryData:resolveData.items  //(１)         
 })
       })
   }
  render(){
const MapList =()=>(
       <div>{this.state.arraryData.map((arrays)=><li key={arrays.fields.title}}>{arrays.fields.title}</li>)}</div>)  //(2)
  return(
      <MapList/>
     )
   }
 }
export default BodyHome
```
最後にこのソースをApp.jsにのせてる

```App.js

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import BodyHome from './pages/BodyHome';

class App extends Component {
  render() {
    return (
      <div className="App">
          <BodyHome/>
      </div>
    );
  }
}
export default App;

```
これReact側は完了。実行すると

```
npm start
```

下図のようにlocalhostで表示されたので、一旦やりたいことは完了。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/136486/d6a8cb2e-ffb6-5277-26f1-8f0005397d94.png)

軽くドキュメントを読むと、Netlifyと相性が良いっぽいので、次はNetlifyを使ったCI系をやるかも。。。
Paginationの管理の仕方は、次回以降・・・
【jQuery】classの付け外しによるアコーディオン作成

以下のような、質問を押下するとその質問の答えだけ表示されるようなアコーディオンをjQueryを使って作ります。
https://shintaro-hirose.github.io/test_-02/


まずはhtmlを記述します。

```html:index.html
    <div id="faq">
        <div class="faq-item">
            <div class="question">
                <p class>質問１</p>
                <span>+</span>
            </div>
            <p class="answer">答え１</p>
        </div>
        <div class="faq-item">
            <div class="question">
                <p class>質問２</p>
                <span>+</span>
            </div>
            <p class="answer">答え２</p>
        </div>
        <div class="faq-item">
            <div class="question">
                <p class>質問３</p>
                <span>+</span>
            </div>
            <p class="answer">答え３</p>
        </div>
    </div>
```
faq-itemが3つ並列しており、その中で+マークをspanで貼り付けています。

<div align="center">
    <img src="https://qiita-image-store.s3.amazonaws.com/0/376127/0fa819fe-9ef8-7548-1b68-3a78d1797e7d.png" width=50%)>
</div>

さて、ここからjsやcssをいじっていきましょう。

###デフォルトで答えを非表示にする

```css:style.css
.answer{
    display:none;
}
```

###jQueryを実装する

```javascript:script.js
$(function(){
    $('.faq-item').click(function(){
        var $answer = $(this).find('.answer');
        if ($answer.hasClass('open')){
            $answer.removeClass('open');
            $answer.slideUp();
            $(this).find('span').text('+');
        } else {
            $answer.addClass('open');
            $answer.slideDown();
            $(this).find('span').text('-');
        }
    });
});
```

手順としては、
faq-itemをクリックしたときに...

　クリックしたitemの答えを変数answerに入れる

　もしanswerにクラスopenが含まれていたら...
　　answerからクラスopenを取り除く
　　答えを非表示にする
　　spanの中身を書き換える

　もしanswerにクラスopenが含まれていなければ...
　　answerにクラスopenを追加する
　　答えを表示する
　　spanの中身を書き換える

以上で、アコーディオンをつくることができました。
今回書いたプログラムはこちら↓
https://github.com/shintaro-hirose/test_-02
[Notch] StandAloneで頑張るために その5

（無駄が多いので、お忙しい方は最後のまとめをご覧ください！）

ガスト ノッチ!!!!!!!! 千田です!!!!

僕はミッフィーが大好きなので、先日、ミッフィーがいっぱい書かれたシャツを買いました。
すげーかわいい。
お気に入りなのですが、周りからは「あぁ、、、」と思われているようで、
道を歩いていると二度見されます。はい。
それでもめげません。落ち込んだりもしたけれど、私は元気です。

ちなみにこれです。

![021000700.001.-_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/63228/a30287a4-1c91-9833-47c1-51443506608b.jpeg)
https://www.graniph.com/shop/g/g02100070000102_yevent_z24/
グラニフさんで売ってます。

レディース用のシャツ（すげーかわいい）が欲しくて、無理やり試着しようとして、
店員さんにたしなめられたのは内緒です。

さて本題。
##StandAloneで頑張るために その5

今回は一つ飛ばして

3、どの辺のコンピュータがいいのか？　

をやっちゃいます。
オペレーションに関してはいろいろ思うところあり、
もうちょっとまとめます。

では早速
どの辺のコンピュータがいいのか？　

まずはGPUから、
「proならQuadro」なんてこと、PC屋さんに言われたりしますが、
そもそも、
Quadro=OpenGL向き
GeFouce=DirectX向き
という違いがあると思います。

じゃあNotchはどっち向きなのよ？
と、[NotchMarks](https://www.notch.one/notchmarks/)覗いてみると、、、、
最速はQuadro6000(70万円！！！！リアルタイムレイトレ！）続いてRTX2080Ti。
ということは、Notchはどちらでも行けるよ！って理解であってますか？
なんか勝手にDirectX系だと思ってました。

ひとまず、Notchはどちらでも行けるよ！
ってことにして、2080Tiって思ったんですけど、
価格的に考えて、2080でもいいかも、と思いRTX2080を選択。
Hippotizerよりちょっと遅いけど、まぁまだそこまでガリガリやってないし。
これで大丈夫。

じゃあCPUは？
「proならXeon!」なんてこと、PC屋さんに言われたりしますが、
きっと、そこそこのCPUで行けるでしょ。i7の新しいのなら。
なんて、ざっくり考えですが、細かくやっていくときりがないので、
i9系CPUにしました。まぁこれだけ積んどきゃ大丈夫でしょって感じです。

メモリは？32GBも積んでれば、まぁ行けるでしょ。64ありゃそらいいけどさ。

と結構、あっさり選んできました。
理由としては、
・まだスペックに困るほどガリガリやっていない。
・Windowsは後から何とでもなる。（これ最高！）
以上。

で、パソコン探していくわけですが、
じゃあ、自作するかー。と、後のこと考えなければなるのですが、
今後台数増やしてよ！ってなったとき大変なので、メーカー物にします。

メーカー物の嫌なところは
・わけのわからんプリインストールアプリが入ってくる。

これ、一度大手メーカーさんに
「プロ機！と謳ってるPCにわけのわからんアプリいれるんじゃねーよ、
クリーンな状態で納品してよ！」
って言ったら、怒られました。
「当社のプリインストールはわけわからなくありません。」と。
おかげで、全台クリーンインストールでした。

なので、
第一条件
「プリインストールアプリを最小限にしているメーカー物」がいい。

続きましてRTX2080を搭載しているもの。
そうするとゲーミングがわんさか出てきます。
結構小型でいい！よしこれだ！と思ったんですが、、、
カタログを見ると、、、
PCIボードはGPUで埋まってる、、、、、

まぁNDIしか使わないならいいけど、、、PCIも使いたいなぁ、、、、
んーーーどうしよう、、、
と悩みまして、
第二条件
「PCIスロットに空きがある」

この2つの条件満たすなら、もう自作したほうが早くない？？？
なんて思いますが、がんばって探します。

そこで行きついたのが
・MouseComputer　DAIVシリーズ

Boxxもいいかな　と思ったのですが、Quadroのラインナップが多そう。

プリインストールもマカフィのみだったので、クリーンインストールまでしなくてよくて、
楽でした。


さて、ここで今日のまとめ。
みなさん！結局どれくらいのスペックがいいと思います？？
皆さんが使ってる環境と、
「本当はこれが、このスペックのが欲しいのよ！！！！」
というのを大募集します。
また、やっぱりプロならXeonなんだよー　とか
そういうところが疎いので、教えてください。

コメントやFacebook Notch日本コミュニティ、
[twitter](https://twitter.com/yasuhiro_chida) にて情報をお願いいたします！！！

今後、このページに追加していきます。


##本日のまとめ
僕が選んだPC

MouseComputer DAIV-DGX760  
CPU i9-9940X  
GPU RTX2080
メモリ　64GB（結局積みました、、、、）
【Unity】PlayerSettingsの変更がProjectSettings.assetに保存/反映されない問題の原因と対応

# 問題の具体例
前からたまに起きていたような気がするけど、PlayerSettingsの設定を変更してもProjectSettings.assetに反映されない場合があって困った。

具体的には

　　`Automatically Sign`にチェックを入れているのにビルドすると証明書関係でコケている
　　　↓
　　保存したはずなのにProjectSettings.assetの`appleEnableAutomaticSigning`が`0`のまま

という状況。

「なんじゃこりゃ」と思って`Bundle Identifier`とかを書き換えて保存してみると、こちらは正しく保存されている。特定の項目だけ保存されないぽい。

他の人にも再現せず、アセットとかエディタ拡張を疑うもたくさん入れすぎてて調査するのがしんどすぎる状況。

# ググったら解決した
[Android player settings not always saved](https://forum.unity.com/threads/android-player-settings-not-always-saved.276902/)

>Typical, just after posting I found a solution! It seems the problem was caused by having multiple Inspector tabs open.

5年も前の記事だしレスポンスもほとんどないから目立たないポストだったけど、まさにこれだった。

同じことをしてる人がどれくらいいるかわからないけど、自分はInspectorウィンドウを常にNormalとDebugの２つ開いている人間（同一ウィンドウの別タブにしてある）なので、片方のウィンドウで設定を変更してももう片方の値で上書きされるようだった。

DebugのInspectorウィンドウはNormalと同じウィンドウの別タブにしてて隠れているので普段は見ておらず、完全に盲点だった。

というわけでDebugのInspectorウィンドウを閉じたら直った。めでたしめでたし。
Python製WebRTC ライブラリ aiortc のデータチャネルを介したファイル転送(P2P直接通信)を行うサンプルプログラムを動かしてみる


#環境
2者とも同一マシンで、シェルのセッションが別なだけ。カレントディレクトリは同じ。
OSはMacOS Mojave。Pythonのバージョンは3.5。

#WebRTC関係の情報
- TURNサーバを使わないので、UDPホールパンチングが通る2者間でないと転送は失敗すると思います（今回は同一マシンですが・・・)
- aiortcのコードを確認しましたが、UDPホールパンチングのための情報を教えてくれるSTUNサーバは、明に指定しない場合、googleが提供？しているテスト用公開サーバ ( stun:stun.l.google.com:19302 ) を利用するようです。
- 以下でやっているSDP情報の2者間での交換は、通常？のWebRTCを利用したシステムではシグナリングサーバなどが仲介して行うわけですが、今回はそれを手動でやっています。

#手順
```bash
$ git clone https://github.com/aiortc/aiortc.git
$ cd aiortc/examples_mod/datachannel-filexfer

$ brew install ffmpeg opus libvpx pkg-config

python3系列でないとaiortcのインストールがこけるようなので注意
必要ならpyenv-virtualenv等で専用の環境を作った方がいいかも。
$ pip install aiortc uvloop
```



- 送信側

```bash
$ python filexfer.py send ../apprtc/README.rst
-- Please send this message to the remote party --
{"sdp": <JSONでずらずらと情報が並んでいます>, "type": "offer"}

-- Please enter a message from remote party --
```

- 受信側

```bash
カレントディレクトリのものは消しておく
$ rm README.rst
$ python filexfer.py receive README.rst
-- Please enter a message from remote party --
```

起動時はここまでの出力。
そこで、最初に送信側で標準出力に出たSDP情報をコピペしてリターン。
すると、送信側にに渡すSDPが出力された。

```bash
{"sdp": <JSONでずらずらと情報が並んでいます>, "type": "offer"}

-- Please send this message to the remote party --
{"sdp": <JSONでずらずらと情報が並んでいます>, "type": "answer"}

-- Please enter a message from remote party --
```

送信側に渡す用のSDP情報をコピペして、送信側のターミナルでコピペしてリターン。

したら受信側に以下の出力が出た。

```bash
received 972 bytes in 0.0 s (0.730 Mbps)
-- Please send this message to the remote party --
{"type": "bye"}
```

最後に、これを送信側にコピペしてリターンしたら送信側はプログラムが終了。
受信側はそのまま。
とりあえず、Ctrl-Cで終了させた。

ファイルを受信できたか受信側で確認（元々カレントディレクトリにREADME.rstは存在しなかった）。

```
$ less README.rst
=> 内容は問題なし！
```

以上!
【Keynote】スペルチェックの赤い点線を非表示にする方法

Keynote にコードを貼ると、どうしても出てくるスペルチェックの赤い点線。
こんな感じです↓ 目障りなので消したいですね。
![cap_2019-03-16_9_19_44.png](https://qiita-image-store.s3.amazonaws.com/0/88183/907ba4de-c78e-6e68-e848-a5448ada5bdb.png)

非表示にする方法ですが、下図のように
**編集 > スペルと文法 > 入力中にスペルチェック**
でオフにすれば解決です。
![Keynoteでスペルチェックの赤波線を消す.png](https://qiita-image-store.s3.amazonaws.com/0/88183/afc1400b-3086-fc24-352e-12653e3f038f.png)
React: TypeScript の lint で module.hot 周りでエラーが出た際の解決方法

# TypeScript の lint で`module.hot`周りでエラーが出る

ReactやPreactでHMRをやろうとする際、TypeScript (tsx) で書いていると lint で怒られることがある。

```
Property 'hot' does not exist on type 'NodeModule'
```

## @types/webpack-env を追加すればよいだけ

`yarn add --dev @types/webpack-env`しよう。

```
if (module.hot) {
  module.hot.accept("./Top.tsx", () => {
    const AppHMR = require("./Top"); // eslint-disable-line global-require, @typescript-eslint/no-var-requires
    render(<AppHMR.default />, document.querySelector("#app"));
  });
```

毎回調べてる気がしたので、もういい加減書き残しておこうと思いました。

### 参考

https://github.com/vitaliy-bobrov/angular-hot-loader/issues/5
Providerクラスと継承元のDataProviderクラスのこと


easylanguageをさわりだして日が浅いのでよく理解できていないことが多い。ちゅーか、ほぼわからん。
今回、ProviderクラスとDataProviderクラスのことについてメモ。防備的に私的に。


EasyLanguage公式オブジェクトリファレンスによると
###DataProviderクラスは
```
DataProvider クラス : プロパイダークラスの非同期データパスを開閉するオブジェクトの構造を定義します。
継承階層 : 
elsystem.Object
   elsystem.DotNetObject
       elsystem.ELComponent
            tsdata.common.DataProvider
プロパティ : 
	boolean Load : データプロバイダーへの接続を確立する場合は真に設定されます。
	boolean Realtime : 提供されるデータがリアルタイムの場合は真です。リアルタイムでない場合は偽です。
	enum State : データプロバイダーの状態を取得します。
		Falled : 3
		Loaded : 2
		Loading : 1
		Unloaded : 0
	TimeZone : TimeZone オブジェクトを取得します。ローカル = 0、取引所 = 1。
		Exchange : 1
		Local : 0
メソッド : 
	CloseProvider : DataProvider への接続を閉じます。
	LoadProvider : DataProvider への接続を開きます。
イベント : 
	StateChanged : プロバイダの状態が変更されるたびに発生します。ハンドラーの args パラメーターが返すプロパティについてはStateChangedEventArgs クラス参照
==>
StateChangedEventArgs クラス
継承階層 :
	elsystem.Object
		elsystem.EventArgs
			tsdata.common.StateChangeEventArgs
プロパティ:
	object NewState : 状態変更イベントの後の DataProvider の状態です
```
ということ。
で、Providerクラスの１つであるところの
###QuotesProviderクラス

```
QuotesProvider クラス : 、クオートデータストリームの中にある銘柄のクオートフィールドについて、アップデートされた指定リストの情報にアクセスできます。クオートデータで変更が発生するたびに Updated イベントが呼び出されます。
継承階層 : 
	elsystem.object
		elsystem.ElComponent
			tsdata.common.DataProvider
				tsdata.marketdata.QuotesProvider
プロパティ : 
	int Count : プロバイダーコレクション内で使用可能なクオートの数を取得します。
	object Data : クオートに関するデータを取得します。
	list Fields : プロバイダーコレクションに含まれるクオートフィールドを表す名前のリストを取得および設定します。名前のリストについては、「QuoteFields」を参照してください。
	object Quote[index] : Fields リスト内で指定インデックス位置を持つQuote オブジェクトを取得します。
	object Quote[name] : Fields リスト内で指定名を含む Quote オブジェクトを取得します。
	string symbol : クオートの提供対象銘柄を取得および設定します。
メソッド : 
	Contains(QuoteFieldName) : 指定名を持つクオートがコレクションに存在する場合は真です。
	Contains(QuoteObj) :指定したクオートオブジェクトがコレクションに存在する場合は真です。
	Create() : QuotesProvider クラスの新規インスタンスを初期化します。
イベント : 
	Updated : PriceDataStream オブジェクトがアップデートされると発生します。ハンドラーの args パラメーターが返すプロパティについては、「QuoteUpdatedEventArgs」を参照してください。
==>
QuoteUpdatedEventArgs クラス: クオートのアップデート情報をレポートするオブジェクトの構造を定義します。
継承階層
	elsystem.object
		elsystem.EventArgs
			tsdata.marketdata.QuoteUpdatedEventArgs
プロパティ
	string Feild : アップデートされたクオートの名前
	object Quote : アップデートされた Quote オブジェクト
	enum Reason : アップデートの理由を取得します (InitialUpdate:1 , realtimeupdate:0)
メソッド
	create() : クラスのインスタンスを作成します。
```


いろいろあるんだがポイントは
1. DataProviderは非同期データパスの開閉をしますよ
2. QuotesProviderもDataProviderからの警鐘なので非同期通信ですよ
3. それぞれ、通信の戻り先のハンドラがあって、そこでデータを取得します
てことかの

こまかくは
QuotesProviderはinitialupdateとrealtimeupdateにわかれてますってことか
で、realtimeupdateを取得したければ、realtimeプロパティにtrueをセットしとけよってことだろう、たぶん。

QuotesProviderでいえば、銘柄名とか上場市場なんかはrealtimeで変化する値じゃないけど、
気配値とか数量、現在値とかはrealtimeでほしい値だから、なにを取得したいかで分別してね、ってことだろうな、たぶん。
Visual Studio > ソースコードのプレビュー機能を切る




プレビュー機能がどういうものかは、以下を参照

![vs.gif](https://qiita-image-store.s3.amazonaws.com/0/49910/2c0efd2a-31a1-caaf-d89d-6e0d301f52a5.gif)


ファイルを選んだだけで表示が切り替わるのがうっとおしいので、切る

プレビューのON/OFFは画面を小さくしてると見つからないが、
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/45dade24-ad6b-7f55-c60a-4f1469c9ab46.png)

ソリューションエクスプローラーを広げると出てくる。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/cc339ce9-d147-d82e-1d07-c2fe96b50a64.png)


以上
GraalVMを使う　→　おそい　（というか、Javaが十分早い。Goよりも。）

[GraalVM](https://www.graalvm.org/docs/why-graal/)をご存知ですか？
Oracleの作成した、多言語ランタイムです。Javaを各OS向けにネイティブコンパイルすることができます。
フットプリントの軽さや、起動の速さなどを目指しており、Dockerなど、コンテナ技術との組み合わせが期待される技術です。

というわけで、速さを確認してみます。

2019/03/17 修正：
dotnetコマンドでDebugビルドで計測していたので、Releaseビルドで計測し直しました。
2019/03/19 修正：
GraalじゃなくてGraalVMのほうが正しくね？とコメントいただきました。そのとおりだと思ったので修正しました。

# フィボナッチで対戦
随分前に、[Node.jsをつかう → はやい](https://qiita.com/ukiuni@github/items/3a5e8681edf2cdf1b54c) という記事を書きました。
そのプログラムを使用して、Node.js、Java、GraalVMを対決させてみます。
(Graal以外のランタイムがちょっと古いのは許してほしいです。)

# 環境
MacBook Pro (Retina, 13-inch, Late 2012)
プロセッサ 2.9 GHz Intel Core i7
メモリ 8 GB 1600 MHz DDR3

# Node.js

```js:コード
function fib(n){
  if(n <= 1) {
    return n;
  }
  return fib(n - 1) + fib(n - 2);
}

console.log(fib(40));
```
結果。

```
$ node -v
v10.11.0
$ time node fib.js
102334155

real	0m1.752s
user	0m1.494s
sys	0m0.078s
```

ふむ。

# Java
続きまして、Java。

```java:コード
public class fib {
  static int fib(int n) {
    if(n <= 1) {
      return n;
    }
    return fib(n - 1) + fib(n - 2);
  }

  public static void main(String[] arg){
    System.out.println(fib(40));
  }
}
```

実行

```
$ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
$ javac fib.java
$ time java fib
102334155

real	0m0.555s
user	0m0.536s
sys	0m0.028s
```

うぉぉ、、、早い。Node.jsより早いのは意外。

# GraalVM
コードはJavaと一緒。

```
$ native-image --version
GraalVM Version 1.0.0-rc13
$ native-image fib
//省略、、、すっごい時間かかる。
$ time ./fib
102334155

real	0m0.737s
user	0m0.728s
sys	0m0.005s
```

あれ。。。Javaのほうが早い。。。。

というわけで、GraalVMにとっては残念な結果。
というか、Javaがすごく早くてびっくりしました！

# 番外編 Golang
早い、軽いの代名詞、Golangで同様の実験をしてみました。

```go:コード
package main

import "fmt"

func fib(n int) int {
  if(n <= 1) {
    return n
  }
  return fib(n - 1) + fib(n - 2)
}

func main() {
  fmt.Println(fib(40))
}
```

```
$ go version
go version go1.11 darwin/amd64
$ go build fib.go
$ time ./fib
102334155

real	0m0.767s
user	0m0.759s
sys	0m0.006s
```

GraalVMと同じくらい。

# 番外編その2 C#（Dotnet）

Javaと同様のVM言語。

```cs:コード
class fib {
  public static long Fib(int n) {
    if (n <= 1)
        return n;
    return Fib(n - 1) + Fib(n - 2);
  }
  static void Main(string[] args) {
    System.Console.WriteLine(Fib(40));
  }
}
```

```
$ dotnet --version
2.1.101
//プロジェクトをdotnet new consoleとかで作ってから、、、
$ dotnet build -c Release
//いろいろ出る。
$ time dotnet bin/Debug/netcoreapp2.0/demo.dll
102334155

real	0m3.962s
user	0m3.922s
sys	0m0.031s
```

~~とてつもなく遅い。。。コンテナ時代には向かない言語かな。。。~~

2018/03/17 追記
すいません。Debugビルドの方で実行していました。
Releaseビルドで実行した結果です。

```
$ time dotnet bin/Release/netcoreapp2.0/demo.dll
102334155

real	0m1.021s
user	0m0.932s
sys	0m0.054s
```
GraalVM、Goには及ばない感じだが、そこそこの速度が出ています。

# 番外編その3 python

```python:コード
def fib(n):
  if n <= 1:
    return n
  return fib(n - 1) + fib(n - 2)

print(fib(40))
```

```
$ python3 --version
Python 3.7.0
$ time python3 fib.py
102334155

real	0m56.411s
user	0m55.466s
sys	0m0.347s
```

お察し。

# 結果
Javaがめっちゃ早い。
こういう、小さいアプリケーションはJavaの苦手領域だと思っていたので、非常に驚きました。
Javaでいいじゃない。
Tools

# ツール

個人で使うツールのメモです。基本的にはマイナーなツールたちのメモで（いつもURLや製品名を忘れるので）。
メジャーなものは記載しなくてもわかるので、書いてないこともある（気分）。


## Editor

* https://code.visualstudio.com/
  * プラグイン
* https://www.sublimetext.com/
* https://coteditor.com/
* https://panic.com/jp/coda/
* http://www.artman21.com/jp/jeditOmega/
* https://atom.io/
* https://hide.maruo.co.jp/software/hidemaru.html
* https://sakura-editor.github.io/
* https://notepad-plus-plus.org/

## Markdown Editor

* http://markdownpad.com/
* http://pad.haroopress.com/

## Git GUI

• https://gitup.co/
• https://www.gitkraken.com/
• https://www.git-tower.com/

## OSX icon editor 

• https://freemacsoft.net/liteicon/
• ~~https://panic.com/blog/ja/candybar-mountain-lion-and-beyond-2/~~

## MindMap Editor

* https://mindnode.com/
* http://jp.xmind.net/
* https://www.mindomo.com/ja/

## Theme

* https://draculatheme.com/
【Rails】一つの検索フォームで子モデルも一緒に検索できるようにする方法

##検索フォームの実装方法
検索フォームの実装方法は下記を参考にすれば、比較的簡単にできます。

・[railsで検索フォームを作ろう！！](https://qiita.com/yusuko/items/cff4e46aeafbc3beecf2)
・[Ruby on Rails 検索機能拡張 (railsチュートリアル)](https://qiita.com/mochikichi321/items/5c9630c5d87b47130942)
・[【開発メモ】Railsアプリに検索機能を実装する方法をわかりやすくまとめてみた。](https://freesworder.net/rails-search/)
・[【Rails】１つの検索フォームで複数カラムをまたいで検索する方法](https://qiita.com/bSRATulen2N90kL/items/6a7c99bf3641ac6838fb)

##ここからが本題

includesで関連するテーブルをまとめて取得し、referencesで親子関係をきちんと明記することがポイントです。

```
親モデル名.includes(:子モデル名).where(['検索したいカラム名 LIKE ? OR 検索したいカラム名 LIKE ? ', "%#{search}%", "%#{search}%"]).references(:子モデル名)
```

・[includesに関するリファレンス](http://railsdoc.com/references/includes)
・[referencesに関するリファレンス](http://railsdoc.com/references/references)
oracle archivelog管理に必要そうなコマンド

アーカイブログを管理しようとして知ったコマンド、SQLをメモ
# 環境
* oracle12cR2
* Red Hat Enterprise Linux Server release 6.6

# アーカイブログの出力先ディレクトリ
* /u03/app/oracle/fast_recovery_area/[sid_連番]/archivelog

# アーカイブログ出力容量設定
*  alter system set DB_RECOVERY_FILE_DEST_SIZE=サイズ;

※サイズを10GBに設定する
as sysdbaでsqlplus
```
alter system set DB_RECOVERY_FILE_DEST_SIZE=10G;
```

# アーカイブログ出力容量の使用量確認
```
select
name,
round(space_limit/1024/1024/1024,2)||'GB' space_limit,
round(space_used/1024/1024/1024,2)||'GB' space_used,
round((space_limit - space_used)/1024/1024/1024,2)||'GB' space_available,
NUMBER_OF_FILES,
round(space_used/space_limit ,3)*100 used_percent
from 
v$recovery_file_dest;
```
* 結果

```
name space_limit spacce_used space_available number_of_files used_percent
-------------------------------------------------------------------------

/u03/app/oracle/fast_recovery_area 10GB 9GB 1GB 20 90
```
コーディングのためのタイピング


## ライブコーディングというものを見て
schooの生配信で、コーディングしながら、プログラムの解説をしている人がいた。
３０分もしないうちに成果物として、実際に動くものを作って動かしていた。

技術力は前提として、エンターテイメント性に感動！
コーディングの速さ ＝ タイピング？(勘違い)

## e-typingに没頭(何故か日本語)
<img width="641" alt="スクリーンショット 2019-03-07 18.08.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/63965/caf2df9e-d267-3035-a5bf-9c905b0eb3fb.png">
定期的にトレーニングしては見たものの、これ以上は伸びそうもない。

というか、@,[,],;,:,<,>,(,),$,%,#とか全然打てない。。。c,v,q辺りも。

## [typing.io](https://typing.io/)を発見
没頭
<img width="1112" alt="スクリーンショット 2019-03-08 17.51.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/63965/409dca6b-a9b0-2ce7-e03d-79567b8a1ea6.png">


### WPM（word per minutes）が25くらいからのスタート 
typing.ioのWPMの計算方法は、5文字で１単語換算して、タイピング時間（分）で割る
e-typingに換算すると→25×5=125
e-typingで253くらいだったので、やはり、日本語のタイピングとコーディングは別物ということがわかる


* 全言語3周してみた→WPM：平均30(150)
* 調子が良いと→WPM：35(155)くらい
* 1周でも、5498行打ち込むことになるので、3周はそこそこ時間がかかる
* しかしWPMが125→155はだいぶ上達したのでは？
* ＋3周したら、35(175)になるか？


<img width="679" alt="スクリーンショット 2019-03-08 17.55.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/63965/806b7f3c-2c1d-e12c-dda5-2f1a1960917d.png">




## 副次的効果
* 気分転換  
黙々と打ち込んでいく作業が結構病みつきになる
* 言語の癖  
これを始めたあとで、PHPを使うことになったが、なんとなく馴染みが早かったような

## 課題
* 技術力 orz_
* キーボード依存 
* 補完とかキーバインド等他の要素も関係する

### 一定の効果はあり
【Rails】DBから取得したデータを変換してViewに表示する方法メモ

##DBのデータを英語から日本語に変換して表示したかった
こんな感じにDBに英語で保存されているデータを日本語で表示したい。

```
DBデータ
contact_genre（カラム名)
"GENERAL"
↓
表示したい表記
"一般的なお問い合わせ"
```

##現状
当たり前だがこれだとDBのデータがそのまま表示される

```inquiries_controller.rb
   def show
      @inquiry = Inquiry.find(params[:id])
    end
```

```show.html.erb
 <tr>
    <th>問い合わせ種別</th>
    <td><%= @inquiry.contact_genre %></td>
  </tr>
```

##カスタムヘルパーで解決した
今まであまり使ったことがなかったのですが、カスタムヘルパーを作って表示することができました。

```inquiries_helper.rb
    def view_inquiry_contact_genre(inquiry)
      case inquiry.contact_genre
      when "GENERAL" then
        "一般的なお問い合わせ"
      else
        "例外"
      end
    end
```

```show.html.erb
 <tr>
    <th>問い合わせ種別</th>
    <td><%= view_inquiry_contact_genre(@inquiry) %></td>
  </tr>
```
Swift Windows OS Dockerで簡単環境起動

# 概要
Windows環境でSwiftをやりたい。
DockerでSwift環境を簡易に起動。
## 前提
Dockerがインストールされている事。
## Swift Docker Official Images
<a href="https://hub.docker.com/_/swift">https://hub.docker.com/_/swift</a>
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_03.jpg"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_03.jpg" alt="" width="868" height="376" class="alignnone size-full wp-image-1142" /></a>
# 実行
## Pull

```shell
docker pull swift
```

## REPL起動

```shell
docker run --privileged --cap-add sys_ptrace -it --rm swift swift
```

私の環境では「--privileged」を追加しないとエラーになりました。
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_01.jpg"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_01.jpg" alt="" width="842" height="209" class="alignnone size-full wp-image-1135" /></a>

## コンテナ起動

```shell
docker run --privileged -it --name swiftfun swift /bin/bash
```
「--privileged」を追加しないと、REPL起動でエラーになります。
起動した環境には「vi」は入っていません。
<a href="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_02.jpg"><img src="http://www.cloudsquare.jp/kumonosu/wordpress/wp-content/uploads/2019/03/docker_swift_02.jpg" alt="" width="928" height="228" class="alignnone size-full wp-image-1139" /></a>
とあるエンジニアの問題意識 2019-03-15


# 武士の一閃に時間は要らぬ。
プログラミングも同じである。 エンジニア KaRaKUri。 
# コードを読めば分かるじゃんと、優れた エンジニア であれば言うかもしれない。
コードの察知力が高い人と、低い人がいる。エンジニア KaRaKUri。 
# プログラマとしてのこだわりは、あまりないので、他の人とうまくやっていける気がする。
エンジニア。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/782








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->