OmniAICreator/Qiita-1.07M huggingface dataset:
プロジェクトごとにVSCodeの色とテーマを変えて気持ちを切り替える

VSCodeの設定は「ユーザー設定」と「ワークスペースの設定」がわかれており、すべてのプロジェクトで使いたい設定と、個別のプロジェクトで使いたい設定を分けることができます。

これを利用することで、プロジェクト間でエディタの色やテーマを使い分けることができるので、設定方法と設定の例について説明します。

## ワークスペースの設定

設定は`Cmd(Ctrl)+,`で開くことができ、ユーザー設定とワークスペースの設定が分けられています。
各プロジェクトの設定は画像の枠で囲った部分からアクセスできます。

<img width="564" alt="スクリーンショット_2019-04-07_22_46_22.png" src="https://qiita-image-store.s3.amazonaws.com/0/24124/56c1d743-1d7f-d2b7-e3dd-fddc42f97bd5.png">

（ユーザー設定はmacOSの場合は`~/Library/Application Support/Code/User/`に保存され、ワークスペースの設定は各プロジェクトの`.vscode/settings.json`に保存されます。）

ちなみに`.vscode/settings.json`はgitのグローバル設定でignoreするようにしとくと誤pushが防げて便利です。

## 部分的に色を変える
筆者はエンジニアとして複数の会社のプロダクトに関わっています。そのときにVSCodeの色が一緒だと、どのプロダクトを開発しているか分かりづらくなることがあります。

そこで`.vscode/settings.json`で、部分的に色を変更する項目を設定しています。

```json:.vscode/settings.json
{
  "workbench.colorCustomizations": {
    "titleBar.activeBackground": "#4aa1c4",
    "activityBarBadge.background": "#4aa1c4"
  }
}
```

<img width="547" alt="スクリーンショット 2019-04-07 22.41.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/24124/3d13933b-039a-ae20-56aa-268735790c97.png">

カスタマイズできる項目を公式サイトを見るといいです。
https://code.visualstudio.com/api/references/theme-color

## テーマごと変える
技術書典に向けて、VSCodeで原稿を書いています。しかし、仕事でも使っているエディタで書いていると、いまいち執筆気分になりきれません。
そこで、執筆のプロジェクトでは、色を個別に変更するのではなく、テーマごと変えています。

```json:.vscode/settings.json
{
  "workbench.colorTheme": "Solarized Light",
}
```

ライトテーマとダークテーマを切り替えるだけで、別のエディタを触っている気分になるのでおすすめです。

<img width="623" alt="スクリーンショット 2019-04-07 22.54.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/24124/79ff3eb3-01e1-4d0f-0851-ff92122b4a40.png">
Swiftのバージョンアップについて

バージョン違いで発生していたエラーを解消しようと思い、Xcodeをアップデートした際にSwiftもアップデートしました。

ただ、アップデートしただけではダメで、Xcodeで変更を反映させないといけないことを知りました。

<img width="554" alt="スクリーンショット 2019-04-07 22.50.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/239560/ff71addc-fc0d-e090-55a9-023d69750a31.png">

*Swift Language Version*の箇所を変更しないと反映されないです。

いま思うと、Eclipseとかでも同じように変更を反映しないといけないのに、言語が変わると当たり前のことが抜け落ちてしまうなあと感じた瞬間でした。
データベース設計：データベース正規化をする

最近私はブロックチェーン技術を使うのを休止しました。今、私は昔のバックエンド技術を使用したいと思います。だから、私はデータベースについて復習しました。私はデータベースについて私の知識をリフレッシュしました。

# データベースとは
データベースはデータの集まりです。このコレクションはコンピューターシステムに保存されます。データベースはデータを保存するだけでなく、ユーザーがこのデータを操作できるようにします。データベースはデータを保存するだけでなく、ユーザーがこのデータを操作できるようにします。データベースはデータ管理を簡単にします。

データベースについてもっと知りたい、このリンクをクリックしてください：https://www.guru99.com/introduction-to-database-sql.html

# データベース正規化
データベース正規化は、データベース野中のデータ設計を体系化する方法です。データベースの中の各テーブルは特定のトピックに関するものであり、サポートするトピックのみが含まれているという考え方です。データの繰り返しを排除し、挿入と更新と削除のエラーを回避するために行われます。

### 挿入のエラー
特定の事実をまったく記録できない状況があります。ユーザーはNULLを入力するように強制されます。できるだけnullを入力しないでください。

### 更新のエラー
同じ情報が複数の行にあります。これらのデータに更新があると、更新によって矛盾が生じる可能性があります。特にデータベースがすでに大きくなっている場合は、ユーザーによる更新が難しくなります。

### 削除のエラー
特定の事実を表すデータを削除するには、まったく異なる事実を表すデータを削除する必要があります。ユーザーは削除すべきではない重要なデータを削除する可能性があります。

## 正規化のレベル

正規化のレベルは三つがあります。各レベルはあなたのデータベースを組織して最適化します。

### 最初の正規形

最初のステップは、情報が最初の正規形になっていることを確認することです。 テーブルが最初の正規形になると、情報の検索、フィルタリング、およびソートが簡単になります。

- データはデータベーステーブルの中にあります。テーブルには行と列の情報が格納されています。そして、1つ以上の列が各行を一意に識別する。この列は主キーです。
- 各列にはアトミック値が含まれており、列の繰り返しグループはありません。値がアトミックの場合、値をさらに細分することはできません。

これが最初の正規形になったテーブルの例です：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300943/f8e6596a-4a6c-aa35-d121-ba0690b2d635.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300943/a01af007-8ee6-5c89-e79d-56644448a315.png)

### 第二正規形

テーブルを第二正規形に配置するのは、それらを単一の目的に絞り込むためです。これにより、データベース設計が明確になり、更新エラーを排除できます。

- テーブルは最初の正規形でなければなりません。
- すべての列は、テーブルの主キーに依存しています。

これが第二正規形になったテーブルの例です：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300943/77fd0061-e1de-7e5f-b055-a0ec144ba38f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300943/c7a1a231-0714-2ace-2698-a9c4b67a00bf.png)

### 第三正規形
第三正規形は、各テーブル間の関係を固定します。

- テーブルは第二正規形でなければなりません。
- 接続あるのデータを持つテーブル間には関係がなければなりません。

これが第三正規形になったテーブルの例です：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300943/43920c2e-616a-c486-2646-4cd5e37ec0bb.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/300943/2d63cf9d-8d6b-76e0-971c-23d972065907.png)

# まとめ

データベースにはたくさんデータが含まれています。これらのデータすべてを管理することはとても難しいだ、特にデータ設計が最適化されていない場合です。データ管理は簡単でなければならず、エラーなく行わなければなりません。これは、データがコンピュータシステムのとても大切な部分だからです。データはシステムが正しくそして誠実に機能する必要があるという事実を表しています。そのため、データの整合性を確保するためにデータベースの正規化を行う必要があります。

ソース:
https://en.wikipedia.org/wiki/Database
https://en.wikipedia.org/wiki/Database_normalization
https://www.essentialsql.com/get-ready-to-learn-sql-database-normalization-explained-in-simple-english/
https://www.guru99.com/introduction-to-database-sql.html
Laravelでコントローラで使っているパスカルケースのクラス名から、ルート用のスネークケースに変換して登録する

LaravelでコントローラのAPIを一括で登録できないかと調べていて、クラス名の配列から登録するようにしました。

```php:api.php
	// ルートのTips @see https://qiita.com/sawadashota/items/65da8557a86c03204027
	// 補助 @see https://qiita.com/sympe/items/9297f41d5f7a9d91aa11
	// API呼び出しの場合、index（一覧）, store（新規作成）, show（１ユーザ情報）, update（編集）,destroy（削除） を使う
	// create（新規作成用のフォームGET）, edit（編集用のフォームGET）は使わない
	$routeDefaultSet = ['only' => ['index', 'store', 'show', 'update', 'destroy']];

	// 複数形の名称から単数形、先頭を大文字にする @see https://stackoverflow.com/questions/37513473/laravel-get-model-by-table-name
	$controllers = [
		SaleController::class,
		SaleItemController::class,
       // ... 以下コントローラが続く
	];

	foreach ( $controllers as $controller ) {
		// App\Http\Controllers\UserController::class => UserController
		$controllerName = preg_replace('/([^\\\\]+)$/', '$1', $controller);
		$controllerName = str_replace('Controller', '', $controllerName); // 末尾のControllerを省く
		$snaked = Str::snake($controllerName); // SaleItem => sale_item へ変換
		// 次のような形で基本CRUDのエンドポイントを定義 Route::apiResource('sale', SaleController::class, $routeDefaultSet);
		Route::apiResource($snaked, $controller, $routeDefaultSet);
	}
```

`Str:snake()`でパスカルケースからスネークケースに変換できました。
https://laravel.com/api/5.8/Illuminate/Support/Str.html


# その他
クラス名は名前空間のフルパス（ `\App\Http\Controllers\UserController` )で記述して補完と静的解析を効かせたかったんですが、フルパスからクラス名への変換が出来ませんでした。
インスタンス化すればできそうではあるんですが…。

```php
$class = \App\Http\Controllers\UserController::class;

// \App\Http\Controllers\UserController => UserController に変換ができない
```

[Best way to new up a class with only classname as a string](https://laracasts.com/discuss/channels/laravel/best-way-to-new-up-a-class-with-only-classname-as-a-string "Best way to new up a class with only classname as a string")
[PHP: ReflectionClass::getName - Manual](https://www.php.net/manual/ja/reflectionclass.getname.php "PHP: ReflectionClass::getName - Manual")
[PHP: get_class - Manual](https://www.php.net/manual/en/function.get-class.php "PHP: get_class - Manual")
今週のプログラミング学習内容｜Pythonで２つのリストをまとめてループ処理するには

今回は、今週個人的に学んだ内容から3点抜粋して紹介します。
Pythonで２つのリストをまとめてループ処理する方法は最後の3番目で説明しています。

# 1.「純粋な」プログラミング言語と「マルチパラダイム」プログラミング言語の違い
* プログラミングパラダイムとは、プログラミングのスタイル、型、道のことで、プログラミングする人の基本的考え方や流儀とも言える。　
* プログラミング言語によって、主に対応するプログラミングパラダイムが異なる
  *  c言語：手続き型
  *  Java：オブジェクト指向型
  *  Haskell：関数型

## 純粋なプログラミング言語
1つのプログラミングパラダイムのみに100%対応するプログラミング言語の総称。ただし、そのような言語はまれで、ほとんどは2つ以上のプログラミングパラダイムを導入してプログラミングできる。

## マルチパラダイムプログラミング言語
複数のプログラミングパラダイムに対するプログラミング言語の総称。例として、Scaleはオブジェクト指向と関数型を統合したマルチパラダイム言語である。

# 2.C++の初歩的見方
下記のコードの簡単に説明する。　

    #include <iostream>
    #include <string>
 
    using namespace std;
 
    int main(){
        string s,t;
        t ="文字は、";
        cout << "文字列を入力する：";
        cin >> s;
        cout << t+s << "です。" << endl;
        return 0;
    }


* includeはヘッダファイルと呼ばれるファイルを読み込む宣言で、iostoreamというファイルを読み込む

* using　namespaceは指定された名前空間を使うことを意味する。標準名前空間はstdと表記する。

* contは標準出力の出力を司るオブジェクトで、＞＞や＜＜でストリームと呼ばれる対象に対するデータのやり取りを行う
endlは改行を表す

* cin
  キーボードから入力した数値をそのまま出力する。例：cin＞＞a；

* メンバ関数の宣言と実装の組み合わせ　void　set(int　num)が宣言なら、Csmpleクラスのsetメンバ関数を表すCSample::set(int　num)で実装

ちなみに、実行結果は以下である。

    文字列を入力する：   
    文字は、(キーボードから入力した文字列)です

# 3.Pythonで２つのリストをまとめてループ処理する方法
２つのリストをまとめるzip()をfor文に組み込む。
また、このrange()は0～n-1までの連続した数値の要素を持つリストで、reversed()で逆順になる。

    ２つのリストをまとめてループ処理する方法：
    for (i,j) in zip(range(n),reversed(range(n))):

ちなみに、zip()の動きは以下である。

    zipの使用例：
    word = ["J", "M", "B"]
    number = [2, 1, 8]
    result = zip(word, number)
    print result # [('J', 2), ('M', 1), ('B', 8)]
Microsoft Azure資格 (AZ-100) を取得するまでにやったお勉強のお話

# はじめに
Microsoft Azure の資格の一つである AZ-100 を取得したので、
勉強した内容&所感についてメモします。
（試験内容には触れていません)

# AZ-100について
https://www.microsoft.com/ja-jp/learning/azure-exams.aspx#exam-az-100-section
こちらを参照のこと

# 事前知識
+ 実際のAzure構築経験はなく、パブリッククラウドに携わる実務経験もありませんでした
+ いくつかセミナーには参加していましたが、実際のポータルを触ったのは試験に向けて勉強を始めてからになります
+ AWSはSolution Architect Associateを取得できるくらいには勉強しました

# やったこと
+ mstep( https://partner.microsoft.com/ja-jp/training/mstep-online )への登録
+ 練習用のWeb問題集を解きました(不明点は以下で解消しました)
  + Azureのアカウントを作成して実機にて確認しました
  + Microsoft のドキュメントを読み込みました
+ その他、参考にした書籍
  + 「Azureテクノロジ入門 2019」  
    Azureの概要を一通り攫うのにおすすめです
  + 「ひと目でわかるAzure Active Directory 第2版」  
    ID管理に利用されるAzure Active Directoryの参考資料として利用しました

# 試験が終わったあとの所感
+ Azure PowerShell コマンドをもう少し勉強しておいても良かったかもしれません
  + 合格はしましたが、数問出題されていたので、、、
+ (個人的には)英語慣れしていないため、問題文を理解するために頭を使いました
AWSで請求アラートを設定する

## AWSの請求アラートとは？
AWSの利用料金が設定金額を超えた場合に飛んでくるアラートのこと。
無料枠を超えたくない場合や予想以上の支払い請求を避けるために設定しておくのが無難です。
アラートは**メールで**お知らせされます。

## 設定手順
設定は２つのサービスにまたがっています。
まずはアラートを飛ばす設定からです。

### 請求アラートを有効にする
『サービス＞Cost Management』を選択します。
Cost Managementの『設定＞Billingの設定』からコスト管理設定を行います。
![スクリーンショット 2019-04-07 11.42.01.png](https://qiita-image-store.s3.amazonaws.com/0/281085/c4862d40-1f97-8402-dbcd-f81ca5fd14bf.png)
『無料利用枠の使用のアラートを受信』と『請求アラートを受け取る』の２つにチェックを入れて、メールアドレスを入力します。
チェックボックス・メールアドレスの入力をしたら『設定の保存』を選択します。

### 請求アラームを作成
『サービス＞CloudWatch』を選択します。
リージョンがバージニア北部でなければ設定できないので、バージニア北部以外になっている方がいたら、右上『サポート』の左隣にある地域名を『バージニア北部（us-east-1）』に変更しましょう。

まずは『アラーム』を選択します。
![スクリーンショット 2019-04-07 11.48.27.png](https://qiita-image-store.s3.amazonaws.com/0/281085/2c0bc9f6-0436-7d00-4aa4-871b7b0f63ea.png)
次に『アラームの作成』。
![スクリーンショット 2019-04-07 11.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/281085/2c52b473-b561-742e-dcd8-49d4023be8f9.png)
『すべてのメトリクス』タブの『Billing』を選択します。
![スクリーンショット 2019-04-07 11.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/281085/73cbc9ef-4b76-542d-6992-07821173cf50.png)
続いて『概算合計請求額』をクリック。
![スクリーンショット 2019-04-07 11.52.33.png](https://qiita-image-store.s3.amazonaws.com/0/281085/7a6d0235-f84a-0715-32d7-a528419e0f6b.png)
『USD・EstimatedCharges』を選択。
![スクリーンショット 2019-04-07 11.54.18.png](https://qiita-image-store.s3.amazonaws.com/0/281085/2ff42cb6-fff0-b404-6c70-1145e50f5b74.png)
右下の『メトリックスの選択』をクリックして確定します。
![スクリーンショット 2019-04-07 11.57.37.png](https://qiita-image-store.s3.amazonaws.com/0/281085/3b051590-78bf-6f57-1277-80cae7ed20ac.png)

次のページでは金額と通知先を設定します。
![スクリーンショット 2019-04-07 12.00.05.png](https://qiita-image-store.s3.amazonaws.com/0/281085/dd7cd244-02ef-96c2-48ac-4abf304fa59e.png)
最後に右下の『アラームを作成』で設定完了です。

## さいごに
データは６時間以内の１データポイントでも設定した金額を超えるとアラートで知らせてくれます。
自分は現在、無料利用枠を超えた時点と１０USDを超えた時点の２つを設定しています。
うまく活用して予想外の出費を防ぎつつ、AWSで開発を楽しみたいですね！
php-master-changes 2019-04-06

今日はデフォルトの php.ini に、opcache.file_update_protection と opcache.lockfile_path を追加する修正、ドキュメントの更新、Appveyor の php-sdk バージョン更新、clone した PDO/PDOStatement オブジェクトの利用で SEGV が起きる問題の修正があった！

# 2019-04-06
## petk: Add opcache.lockfile_path and opcache.lockfile_path to ini settings
- https://github.com/php/php-src/commit/1dd5ab0cadcc4f2920316b0d24f00a48f92424c8
- [7.4~]
- デフォルトの php.ini に、opcache.file_update_protection と 
opcache.lockfile_path を追加

# petk: [ci skip] Bring release process docs up 2 date
- https://github.com/php/php-src/commit/8184d87136e3357c7f4e2de55f90f0598b8b0605
- [7.4~]
- docs/release-process.md の記述を更新

## cmb69: Update Appveyor CI to php-sdk-2.2.0beta4
- https://github.com/php/php-src/commit/7b0ed8975dfaa7c2bbf1480c8633efeb450be78e
- [7.2~]
- Appveyor の php-sdk のバージョンを更新

## camporter: Fix bug [#77849](https://bugs.php.net/bug.php?id=77849) Disable cloning of PDO handle/connection objects to avoid segfault
- https://github.com/php/php-src/commit/9ec1525eb5840f8a38470df65f3a36b43eaf28f0
- [7.2~]
- ext/pdo で、clone した PDO オブジェクトを使おうとすると SEGV を起こす問題の修正
- clone ハンドラを潰して例外にするようにしてる

## krakjoe: Follow up [#77849](https://bugs.php.net/bug.php?id=77849) PDOStatement objects in undefined state after clone
- https://github.com/php/php-src/commit/a2b8a62abf905f02504c81d7dd868ac83dfc7207
- [7.2~]
- ext/pdo で、↑の問題が PDOStatement でもあったので同様に対応
Rails で不用意に timestamp に null: false してはいけない

# 要約

Rails(ActiveRecord) で ```timestamp``` に不用意に ```null: false``` を使うのは止めましょう。痛い目を見ます。

# 前提

Rails で社内の業務システムを作っていて、そのうちの一つに処理を予約できる機能があります。モデルはこんな感じです。

```ruby:scheduled_task.rb
class ScheduledTask < ApplicationRecord
  include ScheduledTasksHelper

  validates :mail, :task, :done_at, presence: true
(省略）
end
```

そして migration は（2段階ですが）こんな感じでした。

```ruby
class CreateScheduledTasks < ActiveRecord::Migration[4.2]
  def change
    create_table :scheduled_tasks, options: 'ENGINE=InnoDB DEFAULT CHARSET=utf8', force: :cascade do |t|
      t.string :mail
      t.string :task
      t.timestamp :done_at

      t.timestamps null: false
    end
  end
end
...
class NotNullToScheduledTasks < ActiveRecord::Migration[4.2]
  def change
    change_column :scheduled_tasks, :mail, :string, :null => false
    change_column :scheduled_tasks, :task, :string, :null => false
    change_column :scheduled_tasks, :done_at, :timestamp, :null => false
  end
end
```

※ このときは Rails 4.2 系でした。今は 5.2 系です。

# 起きたこと & 解決方法

## 問題発生

上の状態だと ```db/schema.rb``` がこんな風になります。

```ruby:db/schema.rb
  create_table "scheduled_tasks", id: :integer, force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.string "mail", null: false
    t.string "task", null: false
    t.timestamp "done_at", default: -> { "current_timestamp()" }, null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```

これで何が起きたかというと...

```ruby
task = ScheduledTask.new(mail: 'foo@example.jp', task: 'lock:yes', done_at: Time.now + 7200)
task.save!
puts task.done_at #=> 2019-04-07 23:54:05 +0900
```

これは問題ないのですが

```ruby
task.update_attributes!(mail: 'bar@example.jp')
puts task.done_at #=> 2019-04-07 21:54:10 +0900
```

あれ…？ 設定した日時が変更されている!? なぜ？ 変更していないのに…???

しばらく悩んだ後、答えは目の前に書いてありました。

```ruby:db/schema.rb
（省略）
    t.timestamp "done_at", default: -> { "current_timestamp()" }, null: false
```

「なんか ```default: -> { "current_timestamp()" }``` って書いてあるんですけど…」

## 解決

原因が分かれば、何故こうなったかも分かりました。

- ```default``` に ```current_timestamp()``` が設定されている
- 新規登録（```ScheduledTask.create```）の際は ```done_at``` が必須だが、更新（```ScheduledTask.save```）の際は必須ではない
  - ```done_at``` の値が変わらない場合、ActiveRecord が更新 SQL 文から ```done_at``` を省略する
  - ```done_at``` が省略された場合、```current_timestamp()``` によって現在日時が設定される

ということで以下の migration を適用し、

```ruby:20190407074931_remove_default_from_done_at.rb
class RemoveDefaultFromDoneAt < ActiveRecord::Migration[5.2]
  def change
    change_column :scheduled_tasks, :done_at, :datetime, null: false
  end
end
```
以下のように ```done_at``` からデフォルト値を削除することで想定通りの動きになりました。

```ruby:db/schema.rb
  create_table "scheduled_tasks", id: :integer, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t|
    t.string "mail", null: false
    t.string "task", null: false
    t.datetime "done_at", null: false
（省略）
  end
```


## 疑問

しかし何処で ```current_timestamp()``` がデフォルトに設定されたんだろうか？ おかしいなぁ…
機械学習やモデリング・予測について私が勝手に思うこと

#募集要項はビビらなくてもよい
　あくまで私の経験ですが、代理店として色々なクライアントとお付き合いさせていただいたり、自分の居た企業のデータから振り返ってみたところ事業の保持するデータを用いて予測までやっている企業はホント少数です。大会社の事業予測とかはやっているケースを見ますが、サービス規模でやるには、必要データが足りなかったり、そもそも計測していないというケースが多々だからです。

　それなのにデータアナリストの募集要件とか見ると、以下みたいな情報書いてあるところ多いですよね。。。
　・Python、R、ほかプログラミング言語を用いた分析フローの実装経験
　・多変量解析、データマイニングの基礎知識
　・統計解析、数理統計、機械学習、自然言語処理などを用いた分析経験

　これって一見ビビるのですが、実際ほとんどやってないところもあるのでぜひ応募してチャレンジしてみてください！面接まで行けたらどこまで本当にやってるのか聞いてみてください。

　大体事業における施策の予測までしている会社はほぼないと思います。

　一方確かに医療における画像パターンからの陽性判定などの機械学習に向いている分野はありますが、各企業のデータを予測するという部分は中々まだ進んで行く段階ではないと個人の経験上思っています。そのくらいそもそもの基盤ができていないし、その事業に使えるためのデータの見直しは非常に時間もコストもかかるからです。

　ですが、この部分を突き詰め率先して実施していける企業は他に差をつけることが出来ると言えると思っていますし、目下勉強中で私が突き詰めてやりたい仕事の一つでもあります。

#DataRobot凄い
　私はまだまだ機械学習という知識は少ないまでも、その部分をかなり補ってくれるツールに最近触れる機会がありました。それがDataRobotです。

　必要なパラメータを含んだデータを入れたらこれだけ一瞬で色々なモデルを作れるとは。。。。
　※前処理はまあまあ大変です。

　2nd、3rdPartyデータ等様々な友好データを色々入れて、すぐにモデルを作って検証することが可能です。

　とても高価なので使用できる企業も限られているし、やはり機械学習で何を予測して何に使用するのかが、重要となってきます。

　しかしすごく可能性のあるツールだなと思いますので、使い込んだら是非紹介できる範囲で色々書けたらと思っています。
accepts_nested_attributes_forを使用した子レコードの保存方法

# 使用が想定される場面
![Untitled Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/114933/66127877-630c-3612-2509-61ef488c1360.png)

- 例えばHomeモデルとStationモデルで1対多の関係の場合、Homeの作成時にStationもまとめてDB操作したい時。
- Homeをsaveしようとするタイミングで、Homeのバリデーションに加えてStationのバリデーションも自動で走り、問題なければ両方が作成させる処理をしたい時。        
※子レコード(この場合はStation)のバリデーションやsaveとか考慮したくない時。
 has_many、belongs_to、has_oneの関係で使用出来る。
- has_manyの場合で子レコードにあたる部分を複数まとめて登録したい時。    
※controllerでbuildの部分を複数回実行して複数作成しておくと、フォームも自動的に複数個表示させる。

#Modelの定義

```ruby:models/home.rb
has_many :stations, dependent: :destroy
accepts_nested_attributes_for :stations, allow_destroy: true
```
```ruby:models/station.rb
belongs_to :home, optional: true
```
外部キーは、レコードに保存させる場合nilだと、バリデーションが発生してしまう。
つまりは、stationsテーブルは、homeのidが決定していないと正常に保存できない。
つまりは、homesレコードが保存された後でないといけない。
この状況を解消するため、 optional: trueを指定する。

#Controllerの定義

```ruby
def new
  @home = Home.new
  # buildする際は、timesメソッドを使用することで、複数の子レコードをviewに渡すことが出来る。
  2.times{@home.stations.build}
end

def create
  if Home.create(home_params)
    redirect_to root_path
  else
    render 'new'
  end
end


private
 def home_params
    params.require(:home).permit(:name, :price, :address, :year, :content, stations_attributes: [:line, :station, :walk])
  end

  def set_params
    @home = Home.find(params[:id])
  end

  def update_params
    params.require(:home).permit(:name, :price, :address, :year, :content, stations_attributes: 
                                [:line, :station, :walk, :_destroy, :id])
  end
```

#viewの定義
```html:new.html.erb
<%= form_for(@home) do |f| %> |
  <div class="field"> |
    <div>
      <%= f.label :name, "物件名" %> |
    </div>

# 省略

<% @home.stations.each_with_index do |station, index| %>
  <%= f.fields_for :stations, station do |s_f| %>
  <h2>最寄り駅<%= index + 1 %></h2>
  <div class="field">
    <div>
      <%= s_f.label :line, "路線名"  %>
    </div>
    <div>
      <%= s_f.text_field :line %>
    </div>
  </div>
  <div class="field">
    <div>
      <%= s_f.label :station, "駅名"  %>
    </div>
    <div>
      <%= s_f.text_field :station %>
    </div>
  </div>
  <div class="field">
    <div>
      <%= s_f.label :walk, "徒歩分数"  %>
    </div>
    <div>
      <%= s_f.text_field :walk %>分
    </div>
  </div>
  <% end %>
<% end %>
```
時折、fields_forで表示してもうまくフォームが表示されないときがあります。
その時はfields_forの第2引数のところに直接指定する。
※この例だと、station(@home.stationsに当たるもの)を指定する。


## accepts_nested_attributes_forを使用せず、Form Objectを使用する場合
https://moneyforward.com/engineers_blog/2018/12/15/formobject/
https://qiita.com/9ro/items/10e3676741e09ffb98bb
- 参考URLはこちら
Unity VisualEffectGraph -インストール方法-

#はじめに
　3月に開催されたUnity道場でVisualEffectGraphを扱っていました。動画を見て私も触り、面白かったのでUnityでVFXを始める方法を書いてみました。
　下の位なら数分で出来ます。凄いのはUnity道場さんの方で紹介しているのでそちらをご覧ください。
 （Unity道場：https://www.twitch.tv/videos/402900582）

![image.png](https://media.giphy.com/media/QwswIQQbvePloRTW6Q/giphy.gif)
・散らばるコイン

#Unityプロジェクト作成
　今回使うUnityバージョンは「2019.1.0b10」です。2018.3系でも出来るらしいのですが、PackageManagerにVEGの古いバージョンしかインストールできなかったので2019プレビュー版を使います。
　まずプロジェクト作成時にHDRPを選択。LWRPでも出来ますが今回はHDRPに設定します。LWRPはテラシュールブログさんが詳しく書いているのでそちらをご覧ください。
 （テラシュールブログ：http://tsubakit1.hateblo.jp/entry/2019/04/03/233240）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/240e8c04-3d2a-f7f2-90f3-14ed92035241.png)
・プロジェクト作成時にHDRPを選択

#PackageManagerからVisualEffectGraphをインストール
　上部の「Window」から「Package Manager」を開き、PackageManagerの上部の「Advanced」から「Show Preview Packages」にチェックを入れて、またPreview状態の「VisualEffectGraph」を表示させます。
　PackageManagerから「VisualEffectGraph」を開き、右ウィンドウ右下からインストール。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/23f29067-601b-6d90-2c2e-d1f420ed0c50.png)
・PackageManagerでVisualEffectGraphを選択

#VisualEffectGraphを開く
　・Projectで「Create」、「VisualEffects」、「VisualEffectGraph」と選択していき、VEGを新規に作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/4bedf5eb-d381-c781-b47d-9a2cb69d678c.png)

　・Parameterのウィンドウが使わない時に開いたままだと邪魔なので、上部の「Blackboard」を押して消すと見やすくなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/393006/a20b13df-c92b-87bf-7e84-eb53a4ce1683.png)

　これでVEGを使えるようになりました！
　後は適当にノードを使って楽しんでいきましょう！

　追記
　シンプルパーティクルの解説を書きました。
　Unity VisualEffectGraph -シンプルパーティクル解説-
　https://qiita.com/KoniroIris/items/e396fe2a6c65c2e4e2b4
【Mac】MacでスクショをクリップボードにコピーしてGithubのコメントやIssuesにペーストでアップする方法

## 環境
- Mac
- Github

## できること
- Macでスクショを撮った後にローカルに保存せずにGithubに直接アップできる

## やりかた
1. `command`+ `shift` + `ctlr`+ `4`（数字キー） でエリアを選択してスクショを撮る
2. GithubのIssuesなどのコメント欄で `ctrl` + `v`
3. `![Uploading image.png…]()` みたいなのが表示されて、しばらくすると ```![image](https://user-images.githubusercontent.com/121212/5fdasfda3-e68afe00-5982-11e9-8c79-6fda65705d3f.png)``` みたいに表示されて自動でアップロードされる

こんなやりかたがあったのかとびっくりしたので投稿しました。
Slackでできるのは知ってたので、もしかしたらと思ってやったらできてびっくり。
あれ？もしかしてみんな知ってる…？

## 追記
Qiitaでも同じことができました。マジびっくり。
Windows版Python3のセットアップとHelloWorldまで

業務でPython使ったコードを引き継ぎしそうな予感なので、セットアップ方法とかメモしとく。

## 手元のマシンのOS確認

Windowsをターゲットにしているのだが、社内でも微妙に32bitやWindows7が生き残っていたりしているので、一応事前に確認しましょ。(7か10かは関係ないけど)
折角なので？コマンドで調べる方法で紹介

- PowerSehll

```powershell
$env:PROCESSOR_ARCHITECTURE
```

又は

```powershell
(Get-WmiObject Win32_OperatingSystem).OSArchitecture
```


- コマンドプロンプト

```plaintext
echo %PROCESSOR_ARCHITECTURE%
```

`PROCESSOR_ARCHITECTURE`で確認すると、32bitの場合は`x86`、64bitの場合はそれ以外(`AMD64`など)になる。
PowerShellの`(Get-WmiObject Win32_OperatingSystem).OSArchitecture`で見ると、`32ビット`とか`64ビット`と表示されるので詳しくない人でもわかりやすい。

## Pythonのインストール

### インストーラのダウンロード
- [ここ](https://www.python.org/downloads/)から任意のバージョンを選んでクリック  
開発の都合とかがなければ最新バージョンで。(記事執筆時点ではv3.7.3)
- ページ下のほうにスクロールすると、環境別のダウンロードリンクリストがある
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/51e446aa-dff4-18e1-15f6-54562e235c51.png)
今回はWindows対象なので、調べたシステムのbit数が32bitだったら、`Windows x86 *** installer`、64bitだったら`Windows x86-64 *** installer`を選んでダウンロード。
`***`のところは3種類あり、次のような違いがある。

|種類|説明|
|:--|:--|
|enbeddable zip file|zipパッケージ版。作成するアプリに実行環境として埋め込む時などに使うもの|
|executable installer|オフライン環境のPC向けのインストーラ。当然だがこのインストーラのダウンロードする時点ではインターネット接続が必要。|
|web-based installer|オンライン環境のPC向けのインストーラ。インストール中に必要ファイルをダウンロードしながら進むので、環境構築時に対象PCがインターネットにつながっていないと使えない。|

基本的には`web-based installer`でいいと思う。自身の環境を見返して、上表の説明と合わせて選べばいい。

### インストール

基本的にはダウンロードしたインストーラを実行して、`Install Now`をクリックするだけ。
特別な事情がなければ`Add Python 3.7 to PATH`にチェックを入れておいたほうがいい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/17649349-ad52-0a06-b565-dbff503b6e20.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/580ea1d2-0f33-020a-37e5-e8410386b2f1.png)
そのままプログレスバーが出て、しばらくすると上記の完了メッセージが出てインストール完了する。
なお、デフォルト設定では、カレントユーザ(インストール中のログインユーザ)向けにしかインストールされないので、PCのユーザ全体に向けてインストールする場合は、`Customize installation`を選ぶ。

## HelloWorldを表示してみる

PowerShellかコマンドプロンプトで`Python`と打って起動してみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/91d37d26-dc52-720f-1178-0865117a7b07.png)
こんな画面になればOK。
対話型なのでこのままコマンド的に打っていけば実行されるが、実用上は`.py`のテキストファイルにコードを書いて実行していくので、適当なエディタ(VSCodeなど)で以下のコードを書いて`helloworld.py`として保存する。

```python:helloworld.py
import time

print("Hello World!!")
time.sleep(5)
```
PowerShellかコマンドプロンプトで`helloworld.py`を作ったディレクトリに移動して、`python helloworld.py`を実行すると、画面に`Hello World!!`が表示されて5秒後に次の入力受付になる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/f84beace-b354-0eb2-c49b-937cbc3f94e7.png)
`*.py`ファイルを直接起動することもできる。この場合はデフォルトでPythonターミナルが起動して表示された後、5秒後にターミナルが消える。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/291298/7a54af15-5cae-44ba-071b-790b80457f6b.png)

## 終わりに
とりあえずpythonのインストールとおなじみの確認方法をまとめた。
pipを使ったパッケージの追加とかもそのうち記事にして、今後の引継ぎとかではこの記事見せればOKみたいにしたいなぁ…

## 参考

- [Pythonドキュメント-3.WindowsでPythonを使う-](https://docs.python.org/ja/3.7/using/windows.html)
- [Pythonダウンロードリンク](https://www.python.org/downloads/)
データの重要性の考察

データの重要性ってどのくらい意識してますか？
　まあ自分も偉そうに聞いておいて分かってるか分からないし、一旦データの本質から考えようとwikipediaからデータの意味を引用しましたが「伝達、解釈、処理などに適するように形式化、符号化されたもの、または再度情報として解釈できるものをいう。」とあります。
　
　まあ私が考えるに例としてふさわしいか分かりませんが、私は寿司が好きで良く回転寿司とかに行きます。頼むもの、皿の数と値段、滞在時間など計測さえすれば何でもデータに置き換え分析することが可能です。これは前記した皿の数など形式化してまさに情報として解釈したものですよね。

![寿司.png](https://qiita-image-store.s3.amazonaws.com/0/285951/91df6fd2-84e4-871e-7e17-7c2bbadc15a9.png)


　何なら自分が毎日買うものや生活上の行動も全てデータに置き換えられます。自分の一日の行動を全てデータに置き換えたらどうでしょうか。。。？まあ分析可能なのでしょうがちょっと嫌ですね笑。
　まあ色々脱線してしまいましたが、何が言いたいかというとデータで表せないものなんて基本的に無いってことです！そしてデータが関連しないものなんか無いし、無くなることも無いということです。
つまりデータだけは絶対に勉強しといて損はないと思ってます。
　
　なぜなら一例として世の中で言われる仕事を勝手にやってくれるAIだってデータがなければ動きません。機械学習による予測だってきちんとパラメータが揃っていなければ正確な予測やモデル化だってできません。それだけ人間がやっていることって結構複雑ですし、様々な要因が絡みます。これを全て自動化するなんていずれ出来るでしょうが、恐らく私の感覚的には本格的な事業活用ってかなり先です。
　
　つまり全てこの先の技術にデータは関わってくるのです。それを仕組みも知らないでただ動くから良いやという意識は非常に危険です。目指すべきはデータに振り回される側ではなくデータを操る側です。
　
　そして、重要なのにも関わらず、データをきちんと使えている人があなたの周りにどのくらい居るでしょうか？
　
　だからこそ差をつけるチャンスなのです。改めて是非データの重要性を再認識して向き合い方の意識を変えるべきだなと思います。
EC2からCloudWatchLogに転送する


## IAM Roleの設定

`/etc/awslogs/awscli.conf`に秘密情報を保持して連携する方法もあるのですが、アンチパターンなので、ロールを設定してEC2に割り当てます。

### IAMからロールを作成

ロールの作成ボタンをクリックします。

<img width="1432" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/7dff9ae8-ccb9-b3ee-958f-80420f6b726c.png">

EC2にロールを割り当てたいのでEC2を選択します。

<img width="1434" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/39ffbecb-13cc-0b01-6aec-ac0877234f00.png">


ここでは、ポリシーとして`CloudWatchLogFullAccess`をロールに設定します。

<img width="1432" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/19d1177f-8e78-2c05-7ef9-a98f3e033653.png">

適当なロール名を設定してロールを作成します。

<img width="1434" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/189c9a34-86ad-6a48-a1c7-e1bdbbdc4af0.png">

### EC2作成時にロールを割り当てる

上記でEC2に作成したロールを割り当てます。

<img width="1433" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/6588b569-988a-122f-e7de-64aaae71ced0.png">


## エージェントのインストール

先ほど作成したEC2インスタンスでエージェントをインストールします。

```
sudo yum install  -y awslogs
```

## 設定ファイルの編集

設定ファイルを編集します。

### `/etc/awslogs/awscli.conf`

```
[plugins]
cwlogs = cwlogs
[default]
region = ap-northeast-1
```

### `/etc/awslogs/awslogs.conf`

参考) [CloudWatch Logs エージェントのリファレンス
](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html)

```
[general]
state_file = /var/lib/awslogs/agent-state

[/var/log/messages]
datetime_format = %b %d %H:%M:%S
file = /var/log/messages
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /var/log/messages

# 追加したセクション
[/logs/MyProject]
datetime_format = %Y-%m-%d %H:%M:%S # ログの日時フォーマット
file = /logs/MyProject/app.log # ログファイルパス
buffer_duration = 5000
encoding = utf_8
log_stream_name = {instance_id}
initial_position = start_of_file # 初期ポジション
log_group_name = /logs/MyProject
```
[項目の説明]

- datetime_format: ログの日時フォーマット
- file: ログファイルのパス
- buffer_duration: ログの送信間隔
- log_group_name: CloudWatch Logのロググループ名
- log_stream_name: ロググループのストリーム名
- encoding: エンコーディング

## エージェントの起動

エージェントを起動します。

```
sudo systemctl start awslogsd
sudo systemctl enable awslogsd
```

## ログの連携確認

手頃なログがなかったので、CLIでログを出力してみます。

```
# CloudWatchにログを連携できるか確認する
date '+%Y-%m-%d %H:%M:%S Message from EC2' >> /logs/MyProject/app.log
date '+%Y-%m-%d %H:%M:%S Message from EC2' >> /logs/MyProject/app.log
date '+%Y-%m-%d %H:%M:%S Message from EC2' >> /logs/MyProject/app.log
date '+%Y-%m-%d %H:%M:%S Message from EC2' >> /logs/MyProject/app.log
date '+%Y-%m-%d %H:%M:%S Message from EC2' >> /logs/MyProject/app.log
```

CloudWatchコンソールからログが確認できればOKです。

<img width="1389" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/07bc407f-95ba-afe2-81c6-1fd6e3f734f3.png">

<img width="1280" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/13a85c4c-537e-9bc4-e022-fa46dea35225.png">

<img width="1273" alt="8.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/2506f089-53ec-6686-c340-04b3a74f028e.png">
pngをsvg に変換するためにGoで書かれたpng2svgを使ってみた

自分向けの作業メモ

## png を svg に変換する

探してみるといろいろとあるようだったが、今回はGoで書かれた`png2svg`を使用することにした。

https://github.com/xyproto/png2svg

## Install

```bash
go get -u github.com/xyproto/png2svg/cmd/png2svg
```

## Usage

使い方はリポジトリ内の `README` を見れば分かる感じになっている。

https://github.com/xyproto/png2svg#example-usage

ただ、svgへの変換処理が少し時間がかかる感じで、個人的には処理の進捗が分かるように下記のオプションを付けている。
(画像によっては進捗表示させないとハングしたのかと疑うぐらいに時間かかるものもあったため。参考までに自身のマシンは2016年のMacBook Pro)

```bash
png2svg -v -q -o output.svg input.png
```
【SAS】ods excel でエクセルのシート間区切り位置を設定する。


SAS のアウトプットウインドウに表示される内容をエクセルに吐き出したい状況は割とよくある。

DDEや `proc export`でデータセットの出力をすることができるが、先述のアウトプットウインドウに近い出力は期待できない。

ではどうするか。

## ods excel を使う。
2019/3月時点ではベスト。

ただし`ods excel`を使う時の壁があり、それはシートをどこで区切るかを明示しなければならないことだ。

```
ods excel file='パス\アウトプット先エクセル.xlsx'    
    options(
        sheet_interval = 'proc'
    );

proc print data=sashelp.class(obs=5);
run;

ods excel close;
```

上記の`sheet_interval`の設定だと、`proc print`でデータセットをエクセルに吐き出した直後でシートが切り替わる。

また、
(SHEET_INTERVAL= 'BYGROUP' | 'PAGE' | 'PROC' | 'NONE' | 'NOW' | TABLE’)が選択できる。


しかし、これだと毎回シート切り替えポジションを考慮しなくてはならず、マクロでシート毎に異なるアウトプットをしたい時に対応できない。


## ダミーテーブルでシート切り替えを行う。

妥協案を探して見た結果がこれ。

アウトプットウインドウに表示されないテーブルを置く。
トリック臭い感は否めないがもっとも楽な対応だと思う。

詳細はこちら（英語）→　[ODS excel & multiple sheets](https://documentation.sas.com/?docsetId=odsug&docsetTarget=p09n5pw9ol0897n1qe04zeur27rv.htm&docsetVersion=9.4&locale=en)

```
ods excel options(sheet_interval="none");
　・
　・
　・

/* Add dummy table start */
ods excel options(sheet_interval="table");
ods exclude all;
data _null_;
file print;
put _all_;
run;
ods select all;
/* Add dummy table end */

ods excel options(sheet_interval="none");
　　・
　　・
　　・
```
1. `sheet_interval='table'`でシート切り替えポジションをテーブルに指定。
2. `ods exclude all;`　でアウトプットウインドウへ表示をオフ。
3. `data _null_;`　から　`run;`　は実際には表示されなくなる。内容はぶっちゃけなんでもいい。
4. テーブル自体は作成されるので、テーブル直後で次のシートに切り替えが有効になっている。
4. `ods select all;` で再度アウトプットウインドウへの表示をオン。

これでダミーテーブル前後の`ods excel`の`sheet_interval`の設定がなんであろうと、ダミーテーブルがシート間を分けるポジションとなる。


## 終わりに

このダミーテーブルをマクロ化して置くと便利。
これで晴れてマクロ化ができたのでめでたしめでたし、、な訳あるかい。

ods excelは現状ベストだけど、まだまだ十分な機能が揃っているとは思えない。

あと公式ドキュメントももう少し図やコード増やしてわかりやすくして欲しい、、。

SASェ、、、。



質問、間違いなどがあればコメントください。
[Android]TransactionTooLargeException の原因と対処法

## 事象

Androidで以下のようなエラーが計測される。

```
Fatal Exception: java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 3181388 bytes
       at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3950)
       at android.os.Handler.handleCallback(Handler.java:790)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:164)
       at android.app.ActivityThread.main(ActivityThread.java:6501)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
```

## 原因

インテントに1MB以上の大きなデータを持たせると、このエラーが出てクラッシュする事がある。

## 対処法

エラーメッセージからは、どこでクラッシュしているかを知る事は困難。
`onSaveInstanceState` で `.putExtra/.getExtra` や `.putParcelable/.getParcelable` などしている箇所を洗い出し、1MB以上セットしていそうな箇所を対処する。

対象のデータは、 `onPause` のタイミングで一旦ファイルなどに退避し、 `onResume` のタイミングで再度呼び出して展開する。ファイルに退避する場合、そのパスをインテントに持っておいて、 `onDestroy` で削除するようにしておくと良いかもしれない。
今日Portable DVD Playerを買いました

今日、Portable DVD Playerを買いました。
画面付きでHDMI対応でないものと、画面なしでHDMI対応のもの。

画面付きでHDMI対応のものを探していたら、それぞれ別に買った方が１台買うより安いかもしれないことに気がついた。

もともとテレビの前とテレビのないとこの２箇所で使いたかった。

それならそれぞれに１台づつ買えばいいことに気がついた。

#1. 画面付き
Matures ADP-9012MK, ¥8980円（税別）¥9,690円（税込）ポイント分減額 ¥8,721円
https://kakaku.com/item/K0000947594/
9940円（税込）

価格.comよりYamada電機の店舗の方が安い商品があることを知りました。

課題は、商品の箱に、AC電源ケーブルが付属しているかどうかを書いていなかったこと。
かー電源付属は明記していた。

Yamada電機
https://www.yamada-denkiweb.com/262651019

この商品にはHDMI端子がついていない。

#2. 画面なし

EAST DV-H2228, ¥3680円(税別), ¥3974円(税込), ポイント分減額　3577円(税別）


https://kakaku.com/item/K0001062866/
5135円（税込）

#わかったこと

##1. 価格.comで買うよりも、安い値段で購入できる商品がある

##2. 通販よりも、店頭で買う方が安い商品がある

##3. 機能を限定すれば、売れ筋は費用対効果がよい

##4. 二つの別の商品を買って、必要な機能を利用する方法がある

##5. 最新機能を無理に追いかけない方が費用対効果がよいことがある。
今回の場合はbleaRAY

#課題

ポイント還元だと、会社によって違うが、Yamada電機の場合には、支払額に対してポイントがつく。
ポイントで減額すると、その次につくポイントが減る。
10%ポイントでも、10%ポイントを使って減額していると、結局9%分しかポイントがつかないことになる。

ポイント率が高い場合は、ポイント還元を使わずに、ポイント率が低いときにポイント還元を使うのがコツ。

|  |  | Matures ADP-9012MK | EAST DV-H2228 |
|:--|:--|:--|:--|
| 電源 | AC | 1 | 1 |
|  | 自動車 | 1 | - |
|  | 電池 | 1 | - |
| 画面 |  | 9inchi | - |
| リモコン |  | 1 | 1 |
| 対応媒体 | DVD | 1 | 1 |
|  | DVD-R | 1 | 1 |
|  | DVD-RW | 1 | 1 |
|  | DVD+R | 1 |  |
|  | DVD+RW | 1 |  |
|  | CD | 1 | 1 |
|  | CD-R | 1 | 1 |
|  | CD-RW | 1 | 1 |
| 対応形式 | DVD-Video | 1 | 1 |
|  | DVD-VR(CRPM) | 1 | 1 |
|  | CD-DA | 1 | 1 |
|  | MP3 | 1 | 1 |
|  | WMA | 1 | 1 |
|  | JPEG | 1 | 1 |
|  | Kodak PictureCD | 1 |  |
| 接続媒体 | USB | 2.0- 1port | 2.0- 1port |
|  | SD | 16G | 16G |
|  | MMC | 1 | - |
| 出力 | アナログ | 1 | 1 |
|  | HDMI | - | 1 |
|ケーブル|アナログ|1|1|
||HDMI||1|


### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Youtube のコメントを取得する in Golang

Golang で YouTube Data API を使用して動画のコメントを取得します。

## Requirement
- Golang 1.11
- Youtube API Key
    - 取得方法はここでは説明しません

## 準備
- ライブラリのインストール

```
$ go get google.golang.org/api/googleapi/transport
$ go get google.golang.org/api/youtube/v3
```

## 手順
### 1. コードダウンロード
```
$ git clone https://github.com/Doarakko/api-challenge
$ cd api-challenge/youtube-data-api
```
### 2. YouTube API Key を入力
```golang
const developerKey = "your key"
```
### 3. コメントを取得する動画の ID を入力
動画 URL の以下の箇所が `videoId` です。
![](https://qiita-image-store.s3.amazonaws.com/0/245792/50ff8a6b-1323-b068-4f3d-926b25d56e5a.png)

```golang
func main() {
	videoID := "input video id"
	getComments(videoID)
}
```
### 4. 実行
```
$ go run youtube-comment.go
"「今すぐにでも走って逃げたいのですが動けないんです」<br />私:音を立てちゃダメなのかな...？<br />「ゾウにくぎ付けです」<br />私:お前の勝手やんけ" by みちゃ
いいね数: 1281 返信数: 15

"確かにゾウの群れ見て感動してウシガエル食べたくなる時ありますよね" by れあるまどりーど
いいね数: 1494 返信数: 87

"「油断は禁物です」で草" by 42度.
いいね数: 743 返信数: 5

"象を見た感動とウシガエルを食べることが全く関係なくて草" by ステラ
いいね数: 653 返信数: 14

"感動してこけてカエル食べてフランスを皮肉る　色々詰め込みすぎてもうメチャクチャｗ" by A77V
いいね数: 298 返信数: 0
```

## 解説
```golang
call := service.CommentThreads.List("id,snippet").
    VideoId(VideoID).
    Order("relevance").
    MaxResults(maxResults)
```
- `Order`
`Order` に `relevance` を指定することで、グッド数とコメント数が多い順に取ってこれます。
デフォルトは `time` で直近のコメントをとってきます。

- `MaxResults`
取ってくるコメントの最大値を設定します。
デフォルトは 20 個です。

- `SearchTerms`
`SearchTerms("any word")` を使用することで、指定した文字が含まれるコメントのみ取ってこれます。

```golang
call := service.CommentThreads.List("id,snippet").
    VideoId(VideoID).
    SearchTerms("草").
    Order("relevance").
    MaxResults(maxResults)
```
```
$ go run youtube-comment.go
"<a href="https://www.youtube.com/watch?v=Qs3sShlgKGk&amp;t=3m19s">3:19</a>草" by 涼宮ハルヒ
いいね数: 1 返信数: 0

"叩いて滑るのは草" by ダレノガレ明美「公式」
いいね数: 0 返信数: 0

"いっつも嫌な顔してて草" by Car Mix
いいね数: 11 返信数: 0

"カエル捕まえるの上手すぎて草" by トニーバーネット
いいね数: 0 返信数: 0

"<a href="https://www.youtube.com/watch?v=Qs3sShlgKGk&amp;t=4m00s">4:00</a> ここ草" by ビーストシニア
いいね数: 0 返信数: 0
```

- 値の指定方法

```golang
authorName := item.Snippet.TopLevelComment.Snippet.AuthorDisplayName
text := item.Snippet.TopLevelComment.Snippet.TextDisplay
likeCnt := item.Snippet.TopLevelComment.Snippet.LikeCount
replyCnt := item.Snippet.TotalReplyCount
```
[公式ドキュメント](https://developers.google.com/youtube/v3/)にレスポンスのフォーマットが載っているので、それにあわせて指定すると簡単です。

エディタの補完機能も👍



## Reference
- [YouTube Data API ドキュメント](https://developers.google.com/youtube/v3/)
- [YouTube Data API 公式サンプル（Golang）](https://github.com/youtube/api-samples/tree/master/go)
- [Youtube のコメントを取得する in Python](https://qiita.com/Doarakko/items/191209bf14cf5d76fa6f)
railsでファイルのpathやURLをいい感じに書く

- Pathnameクラスを使うとよさそう
- http://doc.okkez.net/2.4.0/view/class/Pathname
     - `パス名をオブジェクト指向らしく扱うクラスです。` らしい

# ありがちな書き方

- 文字列を結合する
- `/`を自分で書かなきゃでつらい

```rb

"http://www.example.com" + "/tmp" + "/abc.csv"
=> "http://www.example.com/tmp/abc.csv"
```

## Fileを使用する
- 割といい感じ

```rb
> File.join("http://www.example.com", "tmp", "abc.csv")
=> "http://www.example.com/tmp/abc.csv"
```

## Pathnameを使う
- オシャレにかけます🙆‍♀️

```rb
> (Pathname("http://www.example.com") / "tmp" / "abc.csv").to_s
=> "http://www.example.com/tmp/abc.csv"
```
railsアプリにReactのモーダルをサクっと入れる

#0.前提
サーバーサイドメインだけど、フロントエンドも触ってみたい人用。
railsをAPIモードで作成、、、とかはしません。
react-railsでさくっとやります。

#1.React-Railsの導入
webpackerとreact-railsを入れます。

```ruby:gemfile
gem 'webpacker'
gem 'react-rails'
```

インストーラを走らせます。

```
$ bundle install
$ rails webpacker:install     
$ rails webpacker:install:react
$ rails generate react:install
```


application.html.erbにヘルパーを埋め込みます。

```ruby:application.html.erb
<%= javascript_pack_tag 'application' %>
```


おわり。

#2.React-modalの導入

npmかyarnでReact-modalをインストールします。

```
$ npm install react-modal
$ yarn add react-modal
```

おわり。

#3.modalコンポーネントの作成

javascript/components配下にApp.jsを用意し、以下のように書きます。

```javascript:App.js
import React from 'react';
import Modal from 'react-modal';

const customStyles = {
  content : {
    top                   : '50%',
    left                  : '50%',
    right                 : 'auto',
    bottom                : 'auto',
    marginRight           : '-50%',
    transform             : 'translate(-50%, -50%)'
  }
};

class App extends React.Component {
  constructor() {
    super();
    this.state = {
      modalIsOpen: false
    };

    this.openModal = this.openModal.bind(this);
    this.afterOpenModal = this.afterOpenModal.bind(this);
    this.closeModal = this.closeModal.bind(this);
  }

  openModal() {
    this.setState({modalIsOpen: true});
  }

  afterOpenModal() {
    // references are now sync'd and can be accessed.
    this.subtitle.style.color = '#f00';
  }

  closeModal() {
    this.setState({modalIsOpen: false});
  }

  render() {
    return (
      <div>
        <button onClick={this.openModal}>Open Modal</button>
        <Modal
          isOpen={this.state.modalIsOpen}
          onAfterOpen={this.afterOpenModal}
          onRequestClose={this.closeModal}
          style={customStyles}
          contentLabel="Example Modal"
        >

          <h2 ref={subtitle => this.subtitle = subtitle}>Hello</h2>
          <button onClick={this.closeModal}>close</button>
          <div>I am a modal</div>
          <form>
            <input />
            <button>tab navigation</button>
            <button>stays</button>
            <button>inside</button>
            <button>the modal</button>
          </form>
        </Modal>
      </div>
    );
  }
}

export default App;
```

おわり。

#4.modalを表示するviewを用意する

```ruby:home.html.erb
<%= react_component("App") %>
```

表示したい場所に上記のヘルパーを埋め込んでおけばOKです。

#5.終わりに
かなりサクっと書きました。
実際に利用する際は、コンポーネントに値を渡すことが多いと思います。
そういった場合は、

```
<%= react_component('HelloMessage', name: 'John') %>
```

という風に書きます。リテラルだけでなく、インスタンス変数も渡せます。
【Rust】構造体に自身のフィールドの参照の配列を持たせる方法

Rustはライフタイムに厳しく、また複雑なため説明が丁寧でも対処法がわかりづらいことが多いです。
私は次のような状況での解決方法がついに分かったため、備忘録としても、また今回のケースにぴったりの解決法が調べても出てこなかったため残します。

簡単な例として、シューティングゲームのエネミーが弾のテクスチャと自身の発射した弾の配列を持っているとします。

```rust
struct Bullet<'a>(&'a Texture);

struct Enemy<'a> {
  bullet_texture: Texture,
  bullets: Vec<Bullet<'a>>
}

impl<'a> Enemy<'a> {
  fn new(bullet_texture: Texture) -> Self {
    Enemy { bullet_texture, bullets: vec![] }
  }
  fn shot(&mut self) {
    self.bullets.push(Bullet(&self.bullet_texture));
  }
}
```
このコードの場合次のようなエラーになります。

```
error[E0495]: cannot infer an appropriate lifetime for borrow expression due to conflicting requirements
  --> src\main.rs:15:30
   |
15 |     self.bullets.push(Bullet(&self.bullet_texture));
   |                              ^^^^^^^^^^^^^^^^^^^^
   |
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 14:3...
  --> src\main.rs:14:3
   |
14 | /   fn shot(&mut self) {
15 | |     self.bullets.push(Bullet(&self.bullet_texture));
16 | |   }
   | |___^
note: ...so that reference does not outlive borrowed content
  --> src\main.rs:15:30
   |
15 |     self.bullets.push(Bullet(&self.bullet_texture));
   |                              ^^^^^^^^^^^^^^^^^^^^
note: but, the lifetime must be valid for the lifetime 'a as defined on the impl at 10:6...
  --> src\main.rs:10:6
   |
10 | impl<'a> Enemy<'a> {
   |      ^^
   = note: ...so that the expression is assignable:
           expected Bullet<'a>
              found Bullet<'_>
```
.....。なんとなく言ってることはわかるのですが、これを読んでもすぐに対処法が思いつきそうにはありません。

最初、BulletのライフタイムはEnemyと同じかそれより短いので、弾が持つEnemyのフィールドへの参照がより長く生存することはないと思い、このエラーの原因がずっとわかりませんでした。

ただ問題点はそこではなかったようで、次のようにコードを変えるとエラーが出なくなります。

```rust
  fn shot(&'a mut self) { // lifetime parameter
    self.bullets.push(Bullet(&self.bullet_texture));
  }
```
（ここからは自論です。違っているかもしれません。）
先ほどのエラー内容の最初、`anonymous lifetime #1`という表現がありましたが、これは`&mut self`に与えられる参照のライフタイムのことです。
`Enemy`構造体の定義時にいくつかライフタイムを与えましたが、それらが示すのは、「`Enemy.bullets`配列が持つ参照のライフタイムと`Enemy`のライフタイムは同じ」というものでした。
しかし最初のコードでは`shot()`に与えられる参照(`&mut self`)のライフタイムが明示されていなかったため、`&self.bullet_texture`のライフタイムとの関係性が不明なままでした。これが原因だと思います。
なので、`&'a mut self`とすることで回避できた...ということだと思います。

もっと詳しく解説していただける方がいらっしゃいましたらコメントなどくださると幸いです。
交通流シミュレータ SUMO でグリッド地図を生成し，GUIで読み込む

#概要
交通流シミュレータSUMOで都市の交通流をシミュレートするには，車両等を走らせるための地図が必要になります．
本稿では，SUMOに付属するNETGENERATEを利用して単純なグリッド地図（信号付き）を生成し，GUI版のSUMOで読み込んで確認します．地図の生成には細かい設定がありますが，その一部について説明します．

#環境
- Windows10 64bit
- SUMO version 1.1.0
 
SUMOのインストール方法は下記を参照してください．
[Quiita: 交通流シミュレータ SUMO をWindowsに導入する](https://qiita.com/jagimo/items/a137b5c7d4e3e70e0919)

# NETGENERATEでグリッドの地図を生成する
###まずは信号なし版を生成してみる
SUMOのシミュレーションを実行するには，地図や信号の情報を記載したnet.xmlファイルが必要になります．
今回はグリッドの地図を生成します．コマンドラインで作業ディレクトリに移動し，下記コマンドでnet.xmlファイルを

```
$ netgenerate --grid --output-file=grid.net.xml
```

○○.net.xmlの○○は任意のファイル名で構いません．
SUMOのインストーラでPATHを通すにチェックを入れてあれば，netgenerateのコマンドを打てるようになっているはずです．

###sumo-guiで地図を確認する
下記コマンドでsumo-guiを起動後，ツールバーのFile → Open Network で生成したnet.xmlファイルを読み込みます．

```
$ sumo-gui
```
![grid.png](https://qiita-image-store.s3.amazonaws.com/0/366359/55cd5c56-4807-63c7-e3e8-24d1c6af2a3b.png)


グリッドの地図が読み込まれました．ただし，交差点の信号を表わすバーはグレーアウトしており，現時点では信号は設定されていません．

また，デフォルトでは5×5になっていますが，下記コマンドのようにすれば変更することができます．
この例では，8×8のグリッドを60mメッシュに変更し（デフォルトは100m），制限速度を22.22m/s（デフォルトは13.89m/s） に設定しています．

```
$ netgenerate --grid --output-file=grid_TLS.net.xml --grid.number 8 --grid.length 60 --default.speed 22.22
```

その他の設定項目やデフォルト値は[公式ドキュメント（英語）](https://sumo.dlr.de/wiki/NETGENERATE)を参考にしてください．

###信号つきの地図を生成する

信号付きの地図を生成する場合，--tls.guess オプション を付けてNETGENERATEを実行します．

```
$ netgenerate --grid --output-file=grid.net.xml --tls.guess --tls.guess.threshold 30
```

--tls.guess オプションでは信号を設けるべき交差点をルールベースで判定し設置します．
--tls.guess.threshold 30 は，30km/h以上の制限速度の道路に対して信号を設置する閾値のオプションになります．値は任意に変更可能です．デフォルトの閾値が69.4444 km/h ですので，グリッド地図の制限速度がデフォルト（13.89m/h ≒ 50km/h）のまま--tls.guessオプションだけ付けても信号は生成されません．なので，--tls.guess.thresholdで信号を生成する道路の制限速度の閾値を設定しなおす必要があります．

sumo-guiで再度生成したnet.xmlファイルを読み込むと，交差点に信号が設定されています．

![gridTLS.png](https://qiita-image-store.s3.amazonaws.com/0/366359/5096bcc2-3a88-1515-595c-e6a579054f68.png)

#おわりに
今回はSUMO付属のNETGENERATEを用いて，簡単なグリッド地図を生成し，信号を設定しました．
NETGENERATEではグリッド以外にも蜘蛛の巣状やランダムな形状の地図も生成できるので，[公式ドキュメント（英語）](https://sumo.dlr.de/wiki/NETGENERATE)を参考にしてみてください．

また，今回は仮想の道路ネットワークを生成しましたが，OpenStreetMapから実際の地図を読み込むことも可能で，他の方が解説されていますので参考ページに掲載しておきます．

SUMOでシミュレーションを実行するためには，今回生成したnet.xmlファイルの他に，誰がいつどこへ行くを定義したトラフィックデマンドファイル（rou.xml）が別途必要になります．トラフィックデマンドファイルについては今後深く掘り下げて行く予定です．

#参考ページ
- NETGENERATE公式ドキュメント（英語）: https://sumo.dlr.de/wiki/NETGENERATE)
- Qiita: OpenStreatMapの地図を使ってSUMO（交通シミュレータ）を実行（@nattof）: https://qiita.com/nattof/items/d198557126b7d3636f10
データ型って、結局なに？～Java8より～

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@yuka_ponです。

Java8の勉強をしていると、**データ型**という言葉をよく耳にします。
そして、結局データ型って何？と毎回思います。

そこで、今回はデータ型について、ドットインストール「Java8入門」から学んだことをまとめました。


#データ型とは？
そもそも、データ型とは一体何でしょうか？


## Javaのデータ型について
Javaにおいて数字の配列を打つときに、**int**を使いますよね？
これが、データ型を表しています。

つまり、データ型とはデータの種類を示しているのです。
文字または数字で表すように、データには様々な形で表すことができます。
Javaにおけるデータ型は、その種類に応じて型が決まっているのです。

その型とは、次の2つがあります。


##基本データ型
まず、**基本データ型（プリミティブ型）**があります。
これは、Javaによって予め定義された型です。

その基本データ型には、さらに次の3つの型があります。

###整数型
整数型とは、小数以外の数字、すなわち整数で配列された型です。
その整数型にも、byte、char、short、intなどの種類があります。

###浮動小数点型
これは、浮動小数点、すなわち小数で配列された型です。
その中に、double、floatの種類があります。

###論理型
論理型とは、**真**と**偽**で表す型のことです。
主に、booleanが種類としてあります。



##参照型
**参照型**とは、データの場所を示す型です。
基本データ型はデータそのものを表すので、違いを理解しておくと良いです。

その参照型にも、クラス型、インターフェイス型、型変数、配列型が種類として挙げられます。

基本データ型との使い分けは、扱うデータの範囲で決めることが多いです。
膨大なデータを使うときは基本データ型、限られた範囲でデータを扱うときは参照型と予め決めておくことをおすすめします。


今回参照したホームページは、[こちら](https://eng-entrance.com/java-vaiable-datatype)です。
【Java】標準出力に色をつける

変数***i***が0-7へ変化してるのでそこに注意してください

```java:Color.java
public class Color{
    public static void main(String[] args){
        //文字色を変える
        for(int i=0;i<8;i++){
            //int i =0;
	    System.out.println("\u001b[00;3"+i+"m esc[00;3"+i+" \u001b[00m");
        }
        //背景色を変える
        for(int i=0;i<8;i++){
	    System.out.println("\u001b[00;4"+i+"m esc[00;4"+i+" \u001b[00m");	
        }
    }
}
```

出力結果
<img width="145" alt="スクリーンショット 2019-04-07 20.44.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/377231/40c5824e-c4ac-a926-11bb-62fcefa6ffc0.png">


こんなかんじで色付けできます

また，頻繁に使うって人はこんなかんじで先にストック作っておくのもいいと思います

```java:Color.java
public class Color{
    public static void main(String[] args){
        String red    = "\u001b[00;31m";
        String green  = "\u001b[00;32m";
        String yellow = "\u001b[00;33m";
        String purple = "\u001b[00;34m";
        String pink   = "\u001b[00;35m";
        String cyan   = "\u001b[00;36m";   
        String end    = "\u001b[00m";
        
        String[] names = new String[]{red,green,yellow,purple,pink,cyan};
        for(int i=0; i< names.length; i++){        
	    System.out.println(names[i]+"hello"+end);
        }
    }
}
```

コマンドライン
<img width="80" alt="スクリーンショット 2019-04-07 21.20.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/377231/4fc7a96b-c68e-debe-c16c-0bca5fd2cf7b.png">
よく使うGitコマンドまとめ

個人的によく使うGitコマンドをまとめました。

このGitコマンドを使用してリポジトリに変更内容を記録し、
ソースコード等のバージョン管理を行います。

# リポジトリ関連

##・リポジトリの作成

```console
$ git init {ディレクトリ}
```

##・リポジトリのクローン

```console
$ git clone {クローンするリポジトリのURL}
```

##・リモートリポジトリからローカルリポジトリに取り込む
※originは省略できます

```console
$ git pull origin {リモートブランチ名}

$ git pull
```

##・リポジトリの状態を確認

```console
$ git status
```

##・ローカルリポジトリの変更をリモートリポジトリに送信

```console
$ git push origin {リモートブランチ名}
```

HEADでブランチ名を入力しなくてもできる

```
$ git push origin HEAD
```

# ブランチ関連

##・ローカルブランチの確認

```console
$ git branch 
※git branch -vv でより詳しく表示
```

##・リモートブランチの確認

```console
$ git branch -r
```

##・ローカルとリモートを同時に確認

```console
$ git branch -a
```

##・派生ブランチの作成 

```console
$ git branch {ブランチ名}
```

##・作業ブランチの変更

```console
$ git checkout {ブランチ名}
```

##・派生ブランチを作成し、そこに作業ブランチを変更

```console
$ git checkout -b {ブランチ名}
```

##・ローカルブランチの削除
小文字だとマージ済みのブランチのみ削除、
大文字にするとマージ済みで無くても削除できます

```console
$ git branch -d {ブランチ名}

$ git branch -D {ブランチ名}
```


# コミット関連

##・コミットするファイルの指定

```console
$ git add {追加または変更したファイル}
```

##・addの取り消し

```console
$ git reset {addを取り消すファイル名}
```

##・変更点をコミット(保存)

```console
$ git commit 
```

##・変更したファイルを全て指定してコミット

```console
$ git commit -a
```

##・メッセージを書き込んでコミット

```console
$ git commit -m "コミットメッセージ"
```

##・直前のコミットを取り消す

```console
$ git reset {オプション} HEAD^
```
オプション
--hard ワークディレクトリの内容も戻す
--soft ワークディレクトリの内容はそのまま

##・指定したコミットを打ち消すコミットをする
※コミットIDはlogで確認

```console
$ git revert {コミットID}
```

##・ログの確認

```console
$ git log
```