OmniAICreator/Qiita-1.07M huggingface dataset:
【Flutter】Firestoreからデータを読み込む。FutureBuilderとStreamBuilder

Flutter勉強中です。Firestone からデータを取得して表示するときに躓いてしまったので備忘録。

非推奨なメソッドや返り値の扱いに戸惑ってしまった。
FutureBuilderやStreamBuilderといかに組み合わせて使うかがポイントだった。

※`Firebase.initializeApp()`などの初期化は省略しています。

## FutureBuilder (最初に一度だけ読み込む)



```Dart
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class HogeApp extends StatelessWidget {
  
  @override
  Widget build(BuildContext context) {
    // ★1 FutureBuilderを使う
    return FutureBuilder<QuerySnapshot>(
        // ★2 futureに`Future<QuerySnapshot>`を渡す。
        future: FirebaseFirestore.instance.collection('posts').get(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            // ★3 `List<DocumentSnapshot>`をsnapshotから取り出す。
            final List<DocumentSnapshot> documents = snapshot.data.docs;
            return ListView(
                children: documents
                    .map((doc) => Card(
                          child: ListTile(
                            title: Text(doc['text']),
                            subtitle: Text(doc['email']),
                          ),
                        ))
                    .toList());
          } else if (snapshot.hasError) {
            return Text('エラーだよ');
          }
        });
  }
}

```
1. `FutureBuilder`を使う
2. futureに`Future<QuerySnapshot>`を渡す。
`FirebaseFirestore.instance.collection('posts').get()`
古いチュートリアルなどで載っている`getDocuments()`は非推奨。`get()`を使うべし。

3. `List<DocumentSnapshot>`をsnapshotから取り出す。mapとかで操作するために。ここも`documents`は非推奨。docsを使うべし。

## StreamBuilder （データの更新があるたびに自動で更新）
チャットアプリなどデータの更新が頻繁なものに有効です。

```Dart
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class HogeApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    // ★1 StreamBuilderを使う
    return StreamBuilder<QuerySnapshot>(
        // ★2 streamに`Stream<QuerySnapshot>`を渡す。
        stream: FirebaseFirestore.instance.collection('posts').snapshots(),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            // ★3 `List<DocumentSnapshot>`をsnapshotから取り出す。
            final List<DocumentSnapshot> documents = snapshot.data.docs;
            return ListView(
                children: documents
                    .map((doc) => Card(
                          child: ListTile(
                            title: Text(doc['text']),
                            subtitle: Text(doc['email']),
                          ),
                        ))
                    .toList());
          } else if (snapshot.hasError) {
            return Text('エラーだよ');
          }
        });
  }
}

```

1. `StreamBuilder`を使う
2. streamに`Stream<QuerySnapshot>`を渡す。
`FirebaseFirestore.instance.collection('posts'). snapshot()`

3. `List<DocumentSnapshot>`をsnapshotから取り出す。ここは同じ。

## まとめ

- FutureやStreamを渡して、builderで返り値のsnapshotを処理する
- 躓いたら公式ドキュメントやクラスの定義などを調べよう。

間違いがあれば指摘していただけるとありがたいです。


## 参考になったサイト
[Cloud Firestore | FlutterFire](https://firebase.flutter.dev/docs/firestore/usage/)

[Firebaseを使ったアプリ | Flutterで始めるアプリ開発](https://www.flutter-study.dev/firebase-app/firestore)
バリュードメインで取得したドメインを"さくらのブログ"で使用する方法

## 概要
バリュードメインで取得した独自ドメインを"さくらのブログ"で使用する方法を記します。（さくらのブログサービスについてであり、レンタルサーバーのWordPressではありません。）
単にレンタルサーバーのIPへ向けるだけならドメインのネームサーバーをさくらのNSに置き換えた方が早いですが、さくらのブログサービスはレンタルサーバーとIPが違うため、バリュードメインのNSを使いゾーンを手動で設定します。

手順だけ知りたい方は「[バリュードメインで取得したドメインの設定](#バリュードメインで取得したドメインの設定)」へ。

### 対象サービス
* [バリュードメイン](https://www.value-domain.com/)。
ドメインの取得。
* [さくらのブログ](https://www.sakura.ne.jp/function/blog/)。
レンタルサーバーを契約すると使えるブログサービス。

## 調査

まず、既にさくらで取得したドメインがあるのでそのドメインをさくらのブログに適用してDNSのゾーンを確認しました。

1. [さくらのレンタルサーバコントロールパネル](https://secure.sakura.ad.jp/rs/cp/)へログイン（IDは初期ドメイン*.sakura.ne.jp）。
2. 左サイドのメニュー＞ドメイン/SSL＞ドメイン/SSL＞ドメイン/SSLページを開く。
3. ドメイン新規追加で取得済みのドメインを選択し、追加する。
4. ドメイン一覧から、追加した当該のドメインの「設定」ボタンをクリックする。設定画面より、「さくらのブログで使用する」を選択し、対象のブログのサブドメイン名を選択し「保存する」ボタンをクリック。

次に、設定した値がネームサーバにどのように記録されているかを確認します。

1. [さくらインターネット 会員認証](https://secure.sakura.ad.jp/auth/login)へ会員IDでログイン。会員メニュートップが開く。
2. 「ドメインの確認」ボタンをクリック。契約ドメイン一覧が開く。
3. 「ドメインメニュー」ボタンをクリック。管理ドメインとネームサーバの一覧が開く。
4. 当該ドメインの「ゾーン編集」ボタンをクリック。現在のゾーン情報を確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271948/c14e9278-7d30-cd7c-2d62-bd01836d85cf.png)

__わかったこと__

* さくらのブログのIPは59.106.18.132、59.106.18.133である。
（どうやらさくらのブログサービスは、必ずこの2つのようです。）
* mailとftpだけレンタルサーバーのIPへ向くようになってる。

以上より、バリュードメインで取得したドメインに対しても、バリュードメインのNSに同じような形でゾーンを設定します。

### バリュードメインで取得したドメインの設定
手順としては、まずさくらのレンタルサーバー側にバリュードメインで取得したドメインを追加し、その後バリュードメイン側でゾーンの編集を行います。

####さくらのレンタルサーバー側の設定

1.　[さくらのレンタルサーバコントロールパネル](https://secure.sakura.ad.jp/rs/cp/)へログイン（IDは初期ドメイン*.sakura.ne.jp）。
2.　左サイドのメニュー＞サーバ情報＞サーバ情報＞サーバ情報ページを開く。
3.　サーバ基本情報に、IPv4のIPアドレスが記されているので記録する。
4.　左サイドのメニュー＞ドメイン/SSL＞ドメイン/SSL＞ドメイン/SSLページを開く。「ドメイン新規追加」ボタンをクリック。
5.　ページの一番下までスクロールし、「他社で取得したドメインを移管せずに使う」ボタンをクリック。
6.　別画面が開くので「他社で取得した独自ドメインの追加」のテキストボックスに_"バリュードメインで取得した当該のドメイン"_を入力し「追加」ボタンをクリック。
7.　追加済みドメイの一覧に戻ると、今追加したドメインが確認できる。

####バリュードメイン側の設定

1. バリュードメインログイン後「[ドメインの設定操作](https://www.value-domain.com/modall.php)」ページを開く。
2. 当該ドメインの「ネームサーバー」ボタンをクリック。ネームサーバ変更ページを開く。
3. ネームサーバは初期値の「ns1.value-domain.com」～「ns5.value-domain.com」であるかを確認する。初期化する場合は、「当サービス内のネームサーバー（ns1～5.value-domain.com）を利用する」をクリック後、保存ボタンをクリック。終わったら1.のページへ戻る。
3. 当該ドメインの「DNS/URL」ボタンをクリック。以下のテキストの_ドメインとIP_を書き換えて貼り付けし、保存ボタンをクリック。
4. ゾーン情報が反映するまで待つ（__3時間くらいかかります。気長に待ちましょう__）。

```
a @ 59.106.18.132
a @ 59.106.18.133
a mail (レンタルサーバのIPアドレス)
mx mail.example.com. 10
cname www @
cname ftp mail
```

設定手順は以上です。
指定した拡張子を持つファイルを調べて、ファイル名の配列を返すメソッド


###1. 定義したメソッド

```Python:Python
def get_ext_matching_file_names(ext_pattern_list, search_directory_path) :
	  file_names_list = os.listdir(search_directory_path)
	  # 上記のいずれかの拡張子を持つファイルのファイル名を格納する配列を用意
	  available_filename_list = [] 
	  # 上記のいずれかの拡張子を持つファイルのファイル名を配列に格納する
	  for file_name in file_names_list:
   		   ext_check_result = []
   		   for ext in ext_pattern_list:
    		     boolean = ext in file_name
    		     ext_check_result.append(boolean)
    	   if True in ext_check_result:
    		    available_filename_list.append(file_name)
	  return  available_filename_list
 
```
 
###２. 使い方

カレントディレクトリに格納されているファイルを対象に、実行する場合は、以下のコードで実行します。

```Python:Python
import os.path

# カレントディレクトリの絶対パスを取得
current_directory_path = os.getcwd()
# abstract_path = os.path.abspath()

# 探したいファイルの拡張子
available_ext_list = ['pdf', 'docx', 'xlsx', 'pptx']

file_list = get_ext_matching_file_names(available_ext_list, current_directory_path)

print(file_list)
# 出力例
['sample.xlsx', 'siryou1.pptx', 'sample.docx']
```
学習を応用し0からプログラム作成

todolist2
画面遷移せずに編集できるようにしました。
![todo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474793/1d05eb7d-45f1-3c57-611b-c63daa98b4d3.gif)


todolistの作成
![todo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474793/775d403f-84c0-f1d9-496a-dd8c297b07cc.gif)



####今回は、お客様アンケート（仮）を作成　2020/11/27

```
<?php

//評価が0の時にアドバイスをお願いし、０以上の時は感謝の言葉を伝えるプログラム
echo 'より良いサービスを制作するため、アンケートにご協力お願いいたします' . PHP_EOL;

echo '評価(５点満点中):';
$status = trim(fgets(STDIN));

$a = $status;

if ($a > 1) {
    echo 'ご利用ありがとうございました' . PHP_EOL;
} else {
    echo '品質向上の為何かアドバイスをいただけないでしょうか' . PHP_EOL;
}
$Impressions = trim(fgets(STDIN));
//aが１より大きければご利用ありがとうございました！aが１より小さければアドバイスのお願い
//標準入力と、半角スペース削除の処理、if文のみを使用した処理です。
```

![first_production.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474793/7193d20c-a405-ddcd-1462-729fcf7bfd1e.gif)


これからもアウトプットしていきます！


Gif動画の作り方　（参考にさせていただきましたありがとうございます)
https://youtu.be/aQOpbP3hr0A

Homebrew使って、ffmpegをインストールして簡単に作成

動画の有るディレクトリまで移動
```ls -lh```動画の容量確認

```ffmpeg -i （変更したいファイルの名前） -r (数字)（変更したいファイルの名前）.gif```
-rの後ろに1~20を設定。１秒間に表示したい画像の数大きくなればなるほどスムーズにみれる

例 
```ffmpeg -i sample.mov -r 10 sample.gif```
enterで完了

GIFの確認は選択して、スペースキーを押す
＊他にも様々なオプションがある.

#テキスト版メモ帳の作成をしました
![memo2.1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474793/fb682cce-1c66-8dea-720b-a00dee47c1b7.gif)

#####今回行った事
テーブル作成
デーベースへの接続
メモ内容の登録・表示
接続と登録のエラー内容表示
実行環境でMySQLを使用したデータ表示
#####感想
・データベース接続に様々なやり方がありかなり迷走
・データの取得、登録が上手くできずにエラーの解読に時間がかかる。
・調べながら制作すると自分の分かっていない部分がはっきり分かる。
・オンライン学習と実際調べながら制作するのは違うことかもしれない。
・エラーを調べている内に、これはどうなのだろうと別の疑問が出てきて調べ、解決したい課題から離れてしまう時が多々あり、遠回りしてしまうので注意。
・何より時間が過ぎるのがあっという間です！

#掲示板を製作いたしました(その名は、励まし掲示板)現在は、利用できません。
誰もが励まし合える優しい世界を！
困っているときや、言いづらい思いなどを、吐き出し、その時に励ましの言葉を貰ったり、現状を文章にすることで客観的にみて、救われる人もいるのではないかと思い製作いたしました。

http://first-bulletin-board.herokuapp.com/index.php

成果物の製作は、結局挫折してしまいましたが、毎日何かしら課題があり、どう解決していくか考えて、試す作業はとても楽しく、中々解決できなくて、辛いときもありましたが、上手く動いた時の達成感は、何よりも嬉しかったです！
プログラマーには、なれませんでしたがまた何か作りたいです笑
次は、アクション系のタイピングゲームを作りたい！


最後まで読んでいただきありがとうございました！
未経験新人脆弱性診断士が学ぶSQLインジェクション

初めまして、今年から未経験で脆弱性診断の勉強を始めたyukimalo9と申します。

Qiita初投稿となります！
ROM専でお世話になったイメージしかないQiitaですが縁あって今回投稿する運びとなりました。

最初の題材として取り上げるのは、脆弱性の中でもビッグネームでしょう…
##SQLインジェクション


SQLインジェクションとは、
本来データベースにアクセスできるはずのないユーザが、
サイト側の想定しないSQL文を用いて不正なアクセスができてしまう恐ろしい脆弱性です…

数ある脆弱性の中でもかなり代表的なものであり、
その巧妙さから、新人研修でSQL文にほんの少しだけ触れていた私は

『マジかよ！そんなことが！？』

と思いました…笑


では実際にどんなものなのか、そしてどう対策すべきなのか、拙いながら書かせていただきます。

…の前に一旦注意事項を。

###その辺のWebページなどにSQLインジェクションを働かせるコマンドは絶対に入力しないで下さい！

当たり前ですが、データベースへの不正アクセスですので…！

では…

例として、とある入力フォームがあったとします。
ユーザはこのフォーム内に文字列を入力してその情報を送信することでデータベースへのアクセスを行うとします。
ここに入力される文字列は、データベースに問い合わせるSQL文中に
’入力される文字列’
として挿入されます。


ではもっと具体的にしてみましょう。
とあるWebサイトでログインしたいとき、データベース(今回はMySQLとする)に問い合わせるSQL文は以下のようになります。

![61479C8E-B45F-473E-9A88-339425A56BB5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839926/6a21ee0d-0cb6-e9e6-70e7-81f4310feade.png)


…このシングルクォーテーションマーク(‘)とSQL文特有の文法や文字から無理矢理こじ開ける入力文字列が以下の赤シングルクォートで囲まれた文字列です。

![FBB3C3EF-6A3A-4192-A518-D67431A365D1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839926/40c102d6-84cf-c51d-eb76-00880296fda7.png)

これによって
idが1 or 1が1
のとき、つまり絶対に条件文は正になってしまいます。

一方MySQLではハイフン2つ(— )以降はコメントアウトとなり、その直前には終端文字(;)もあることから、
意味をなすSQL文は前半部分のみになります。

idとpasswordというカラム内のレコードが全て返ってしまい、ログイン認証としてはクリアされてしまいます。



よく見ると、たしかになぁ…！という感想になります。
なかなかおもしろいですね！



ちなみに開発側からの見解はほとんど経験がないため、多くは語れないのですが、
SQLインジェクションの対策として挙げられるのは

・エスケープ処理
・WAFの導入

が主になるでしょうか。

エスケープ処理は一番物理的に効果を発揮するもので、
SQL文中で意味をもってしまうシングルクォーテーションマーク(‘)やセミコロン(;)などを
通常の文字として認識させるような設定することです。

対してWAF(ワフ)はWeb Application Firewallの略称で、
SQLインジェクションやXSS(クロスサイトスクリプティング)などの脆弱性への対策であり、
Webアプリケーションにアクセスが届く前に、悪意のあるアクセスをシャットアウトしてくれます。


こういった不正なアクセスから引き起こされる事象は決してあってはならないものでありますが、
提供側は必ずそのケアをしておかなければならないことも言うまでもありません。
私も欲深に学んでいこうと思います。



今回初投稿ということで、かなり拙い文章で申し訳ないですが、
指摘箇所等ございましたら是非ご指導いただきたいです。
よろしくお願い致します。
プログラミング言語の種類

今回はAndroidアプリを作っている際にpythonが遅いという記事を発見したので、なぜ遅いのか調べたことについて書いていきたいと思います。

# 開発環境
* MacOS
* VSCode
* python3.7(anaconda)

[初心者のためのPython入門](https://www.tuyano.com/index3?id=506001#:~:text=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%AA%E3%82%BF%E3%81%A8%E3%81%84%E3%81%86%E3%81%AE%E3%81%AF%E3%80%81%E3%82%BD%E3%83%BC%E3%82%B9,%E3%81%84%E3%82%8B%E3%80%81%E3%81%A8%E3%81%84%E3%81%86%E3%81%93%E3%81%A8%E3%81%A7%E3%81%99%E3%81%AD%E3%80%82&text=Python%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99,%E3%80%8C%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%97%E3%83%AA%E3%82%BF%E3%80%8D%E3%81%8C%E5%BF%85%E8%A6%81%E3%81%A7%E3%81%99%E3%80%82)
[コンパイラ言語とは？インタプリタ・スクリプトとの違いやJITについても解説](https://www.modis.jp/staffing/insight/column_76/#:~:text=%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF%E5%9E%8B%E8%A8%80%E8%AA%9E%E3%81%AE%E5%A0%B4%E5%90%88,%E5%87%A6%E7%90%86%E3%81%97%E3%81%A6%E3%81%84%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82&text=%E3%81%9D%E3%81%AE%E3%81%9F%E3%82%81%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E8%A8%80%E8%AA%9E%E3%81%AF%E3%80%81%E5%87%A6%E7%90%86,%E9%80%9F%E3%81%84%E3%81%A8%E3%81%84%E3%81%86%E7%89%B9%E5%BE%B4%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)


# プログラミング言語の種類
まずプログラミング言語には、**スクリプト言語とコンパイラ言語、インタプリタ言語、LL言語**などの種類があり、`スクリプト言語とLL言語に関しては、明確な定義は無い`というのが結論でした。

コンパイラ言語とインタプリタ言語は相反する言語として考えられております。
`コンパイラ言語`の代表例としましては、`C/C++やC#、GO`などが挙げられます。
`スクリプト言語`の代表例としましては、`PythonやRuby、PHP`などが挙げられますね。

# それぞれの言語の特徴
#### スクリプト言語とLL言語
比較的簡単に記述することができ、初心者が手を出しやすい言語であると言われています。

#### コンパイラ言語
`ソースコード全部を一旦全て機械語に翻訳(コンパイル)して、その時に新しいファイル(実行ファイル)`を作り出します。そしてその`実行ファイルを開くと実行結果がわかる`という流れになります。

* メリット
・処理速度が速い

* デメリット
・短いソースコードであっても、`毎回実行ファイルを作る必要が出てくる`ため面倒
・書き方が複雑であったりする場合が多いので、初心者には手を出しづらい。
・全コードを翻訳してから実行するため、どこでエラーが起きたのかわかりにくい

#### インタプリタ言語
ソースコードを`一行ずつ翻訳する(コンパイル)`ため、実行ファイルなどを作る必要がなく、実行できる。

* メリット
・簡単に記述することが可能。
・一行ずつ翻訳するため、翻訳できない場所がエラーだとわかるため、`エラーの発見が容易`。
・`簡単に実行することができ`、尚且つテキストエディタ内で処理を完結させることができる。

* デメリット
・一行ずつ翻訳するということで、全部を一気に翻訳するコンパイラ言語よりは`処理速度が低下する`。


#### 実行のわかりやすい流れ
* コンパイラ言語
└`プログラムを実行 => 全ソースコードを一気に機械語に翻訳(コンパイル) => 実行ファイルを作成 => 実行`

* インタプリタ言語
└`プログラムを実行 => 一行ずつ翻訳 => 一行ずつ実行`

＊コンパイラ言語は`Google翻訳などに一気に翻訳してもらう`、インタプリタ言語は`自分で一行ずつ翻訳していく`というイメージがわかりやすいのではないかと思います。
Instance IDの定義

今回の主な話題：Instance IDの定義、モデルMesh Compression導入設置、Static BatchingがDrawCallへの影響。

---
###アセット管理
Q1:公式ドキュメントでInstance IDへの定義は次のとおりです。

**「The instance id of an object is always guaranteed to be unique.」**

したがって、一つのSpriteアセット、ゲーム内のInstance IDは唯一はずですが、テスト中に妙な問題が起こしました。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/9d0a1b51-7f6e-15cf-48b9-b22edaf3e7dd.png)
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/46fe7a85-e671-9617-de5f-c767f627e8f9.png)
これはプリントImageにあるSpriteのInstance IDですが、アセットファイルにこの画像を選択し、InspectorのDebugモードで表示されたInstance IDと一致しません。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/ef223845-9d5e-2a8e-4850-a229470b6915.png)
後で、Imageに対応するSpriteのGUIDをプリントしました。.metaファイルのGUIDに対応しているため、Instance IDに一致性がない理由がわかりません。
>私はそう理解しています。コードで取得したInstance IDと、Inspectorで確認された画像のInstance IDが属するオブジェクトはインスタンスではありません。つまり、Instance IDの唯一性は具体的なアセットではなく、オブジェクトインスタンスに対するものです。

>たとえば、プロジェクト内のPrefabファイルのInstance IDと、シーン内のインスタンス化されたオブジェクトのInstance IDも異なります。

---
###アセット管理
Q2: 3Dモデルをインポートすると、Mesh Compressionの設置は、最終的にどんな結果を導きますか？Unityのドキュメントを読んだで、それはメッシュのストレージの圧縮最適化にすぎないようです。直接的な利点は、パッケージ本体が小さくなることですが、一部のモデルが変形しやすくなることもあります。

では、問題は下記のようです。
1）ロード時には圧縮により遅くなりますか？または、圧縮完了後にMeshにロードして初期化する速度は早くなれますか？（パッケージが小さくなりましたから）
2）これを開くと実行中のパフォーマンス最適化に役立ちますか？
3）このスイッチは法線効果に影響しますか？
4）このオプションを開くことをお勧めしますか？
>1）数値上の精密桁数のみが削減されるため、ロード速度の差は小さいはずです。さらに、メッシュ自体がそれほど大きくない場合、ロード速度は非常に高速ですから、ロードの違いを気にする必要はありません。
2）ドキュメントによると、Compressionをオンにするかどうかに関係なく、ロード後にメモリ占用が同じになりますから、実行時のパフォーマンスに違いはないはずです。
3）法線の部分が圧縮されるかどうかは本当に言いにくいので、具体的なプロジェクトと組み合わせて確認する必要があります。
4）このオプションを有効にするかどうかは、モデル自体によって異なります。アーティストさんが視覚的に許容できると感じる限り、Compressionをできるだけ高く選択すれば良いです。

---
###レンダリング
Q3:UWA Blogで前の記事を読みましたが、一つ疑問があります。なぜStatic BatchingはDrawCallの数 に影響しませんか？
>正確には、Unityバージョン5.0〜5.3で、Static BatchingはGraphics DriverにあるDraw Callの回数を影響しません。これは、これらのバージョンでは、Unityが4.xのようにindex bufferを動的にバッチ処理しないためです。この点は、UWA DAYでもう詳しく説明しました。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/db94649b-65d0-2728-6e14-415f1ce4ebb7.png)
ただし、Unity 5.4バージョン以降、Draw Callバッチ操作は元に戻され、以前の4.xと同じであるため、現在Unity 5.5、5.6、および2017以降のバージョンを使用している場合は、Static Batching後にDraw Callは変わる可能性があります。

---
###コード
Q4：サブクラスが親クラスのシリアル化されたフィールドがInspectorに表示されないようにする方法はありますか？注：親クラスフィールドはvirtulではありません。
>PropertyAttributeは実現できはずです。考え方は大体次とおります。PropertyDrawerは、OnGUIの時にSerializedObjectのタイプを判断し、それが親クラスである場合にのみ本格的な描画を行います。

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
curl: Google Cloud Translation API テキストの翻訳

参考ページ
[テキストの翻訳（Advanced）](https://cloud.google.com/translate/docs/advanced/translating-text-v3)

```bash:get_translation.sh
export GOOGLE_APPLICATION_CREDENTIALS=./***.json
#
curl \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://translation.googleapis.com/v3/projects/project-translation/locations/global:translateText
```

```json:request.json
{
  "model": "projects/project-translation/locations/global/models/general/base",
  "sourceLanguageCode": "de",
  "targetLanguageCode": "ja",
  "contents": ["Es war einmal ein kleines Mädchen."]
}
```

実行結果

```json
{
  "translations": [
    {
      "translatedText": "かつて少女がいました。",
      "model": "projects/754292033128/locations/global/models/general/base"
    }
  ]
}
```

モデルを変更してみました。

```json:request.json
{
  "model": "projects/translation-jp/locations/global/models/general/nmt",
  "sourceLanguageCode": "de",
  "targetLanguageCode": "ja",
  "contents": ["Es war einmal ein kleines Mädchen."]
}
```

実行結果

```json
{
  "translations": [
    {
      "translatedText": "昔々、小さな女の子がいました。",
      "model": "projects/754292033128/locations/global/models/general/nmt"
    }
  ]
}
```
RTX3070+Ryzen7 5800Xで機械学習PCを組ーむぞっ(組み立て編)

※本記事は自作PCの組み立て講座ではなく、次回の最新GPUでの機械学習環境構築の布石記事です
組み立てについて知りたい方はブラウザバック推奨です。
#今は時期がいい。
今は時期がいい。
最近RTX3000番台のGPUとZen3アーキテクチャの新型Ryzenが発売された。
CPUとGPUが同時期に発売された今、自作PCを一つも持たない僕にとってはいい機会であった。

秋葉で3万ちょいで買ったlet's noteに入れたubuntuで機械学習の勉強をしている僕だったが、ニューラルネットワークに手をつけ始めてからというものの、かなり前のPCの為、計算時間がとてつもなくなって待っている間何も手がつけられなくなってしまったため、デスクトップの自作PCを作るのは好都合だ。

(あとApexとかもしたいよね、折角だし。)

御祝儀価格とか、ストレージが時期が悪いとかはいい。買いたい時が、買い時。

#機械学習PCに求める要件
機械学習をするぞ！っていうPCを作る場合、いくつか制限されることがあるので、初めに「どんなPCを組みたいかな」っていう要件を書き出しておく。同志の方は、是非次のセットアップ編も参考にして欲しい。

1.NvidiaのGPUを使うこと。
最近RadeonのGPUが出たけど、TensorFlowのGPU版を使う場合、NvidiaのCUDAというソフトを使わなければいけない。故にNvidiaのGeForceが一般学生には適当なGPUだろう。
RadeonはopenGLのサポートが強いイメージがあるので、映像編集、Unityとかを使って機械学習はしないよって人には丁度いいのではないだろうか。

2.Windows/Linuxを共存させること。
自作PCを作ったのにゲームをしないのももったいない。故にWindowsが必要。機械学習をするならlinuxがいい。故にLinuxが必要。そんな状況を解決するのがデュアルブートとか仮想環境とかという技術だろう。
けど仮想環境は処理が遅くなりそうで怖い。
ということで物理的にSSDを二つ用意して、それぞれWindowsとLinuxをインストールする。
Bios起動の後に使うディスクを選べば簡単に使い分けができる。

3.インテリア性
美しいPCを組みたいのは自明の理。
見た目が美しければモチベも上がる。

#ってわけで
<h3>どーん</h3>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/58040609-a6d8-5616-3e11-f9be1bbf6c8f.jpeg" width=70%>
構成
CPU:　　　　Ryzen7　　　　　　　5800X
GPU:　　　　Zotac　　　　　　　 RTX3070 OC model
マザー:　　　ASROCK 　　　　　　X570 pro4
メモリ:　　　GSKILL 　　　　　　Trident Z Neo 16GB×2　3200
クーラー:　　COOLER MASTER 　HYPER 212 with edition
電源:　　　　Apex Gaming 　　　AG-750M
ストレージ:　Western Digital 　　black/500GB
　　　　　　 Crucial 　　　　　　P1/500GB  
PCケース:　　NZXT　　　　　　　H510
約20万円の構成。
#組む。
<h3>CPUくっつけて</h3>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/af0c3d12-cede-ddf2-2af0-de2fdee31b6e.jpeg" width=50%>
(ピン折れめちゃ怖かった)
<h3>GPUくっつけて</h3>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/ade96560-530e-6e81-f6a3-81cf21d513a1.jpeg" width=50%>
(美しい)
<h3>その他適当にぶっさして</h3>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/2c1609a4-0160-2ef7-ac2a-d6179463c1ba.jpeg" width=50%>
(大体説明書とか見ればわかる。吉田製作所さんとかとモヤシさんとかコジコジさんとかしみおじさんとかのyoutube見れば手順も丁寧に解説してるのでおすすめ。)
<h3>こうじゃぁぁあ</h3>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/5e298ced-cb6a-181f-d736-9de95a3112b1.jpeg" width=50%>
Bios起動。お疲れ様。
説明書が読めないチンパンジーじゃない限り普通に組めるから安心して欲しい。
組み方とかパーツの選び方とか、それを自分で調べるのが自作PCの醍醐味だから、特にこれを選べとかはないよね。選んでる時、迷ってる時が一番楽しいって言われるしね。


#まとめ
今回はただの自作PC回だったので次回は本題のLinuxとWindowsのディスクデュアルブートについてと、TensorflowのGPUインストールについて書いていくので、是非ストックして欲しい。
最後にはベンチマークも取りたいな。
それではまた。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718725/569da4a5-bfdb-7767-49ec-567790318503.jpeg" width=50%>
IPv4からIPv6にして、お家のWi-Fi速度を上げる

生産性向上のために、お家の通信環境を見直してみました。
コロナ流行ってる今だから、リモートの人は重宝する？

###現状
・ソフトバンク光
・Macbookから据置のWindows10にRemoteDesktopで接続（固定IPv4）している
・集合住宅、家族の端末、アレクサ、家電、とりあえず色んな物が接続されている
・誰かが動画を見ていたり、ゲームを起動してたりしていると、`もたつく感`がある

###なぜ早くなるのか
IPv4はPPPoE接続。（要認証）
IPv6はIPoE接続。（認証不要）
プロバイダへの接続方式が別物になるからとのこと。
**毎回の通信の認証にかかる時間分早くなる。**

###メリット
* NURO光IPv6(IPoE)の場合は**工事や再契約が必要**になってしまうが、
使用しているルーターがIPv6(IPoE)対応機種の場合は**オプション変更のみ。**
* `IPv4 over IPv6`を使うことにより、**IPv6(IPoE)環境からIPv4(PPPoE)環境を快適に閲覧可能。**
* 利用者がまだ少なく、増えたとしてもアドレスパターンが豊富。

###IPv4 over IPv6とは
IPv6(IPoE)の通信パケットの中にIPv4(PPPoE)をカプセル化しIPv6で通信する。IPv4のみ対応のサイト等であっても、IPv4(PPPoE)で混雑する網終端装置を通らないで接続可能。理論上、安定した速度が見込める。

###デメリット
* 追加でお金がかかる。ただしプロバイダによってはIPv6(IPoE)オプションプランが無料なところもある。
* **IPv6(IPoE)にまだまだ非対応のサイトやアプリ**がある。
* **自宅がIPv6(IPoE)環境になると、外部からIPv4(PPPoE)通信（公共のWi-Fiとか）で、自宅へのアクセスができない。**
* 試してみないと実感できない。（地域による）

#####IPv6対応サイト
| 検索エンジン | 動画サイト | SNS |
|:----------:|:------------:|:------------:|
| Google     | YouTube     | Facebook     |
|            | NETFLIX     | Instagram    |
など

#####IPv6非対応サイト
| 検索エンジン | 動画サイト | SNS |
|:----------:|:------------:|:------------:|
| Yahoo     | Amazon Prime Video | Twitter     |
など

###必要な手順
①対応プロバイダーへIPv6 IPoEを申し込む
②対応Wi-Fiルーターの準備
③回線開通後の接続

####早くなった方々
https://note.com/nayucolony/n/n79c77cc6dd05#LDmnR
https://hgot07.hatenablog.com/entry/2020/03/22/014614

####まとめ
* 外部から自宅へ接続するアプリやサーバー等を使用している場合、IPv6(IPoE)対応か確認する必要がある。
* 家から外部への通信のみしか利用しない方は快適に利用可能。
* **普及していけばデメリットは減っていく。**
* **何かしらの運営している人は対応に盛り込んで欲しい。**
Dockerで始めるDjango生活(2日目)

### 初めに
2日目です。
1日目は[こちら](https://qiita.com/ghayato/private/52d0a89cdee5b4528e9a)
今回はdjangoの設定などを見ながら日本語化してアプリケーションを作成するのがゴールになります。

### 目次
1. 前回の復習
2. settings.pyについて
3. アプリについて
  1. アプリを作成する
  2. アプリの中身について
4. 最後に

## 1. 前回の復習
まずはコンテナを起動しましょう！

```
# docker exec -it c9b27b34be02 /bin/sh
```
開発ディレクトリに遷移します。

```
# cd /root/projects/myproject/myproject
```
サーバーを起動します。

```
# python3 manage.py runserver
```
http://127.0.0.1:8000/
に遷移して以下の画面が出れば大丈夫です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895676/f6f62421-c26a-0d23-61c8-d5b938851388.png)

## 2. settings.pyについて
まずは、settings.pyの中身を見ていきます。
さすがに全部を見ると長いのでいくつかを紹介します。
### DEBUG
DEBUGはブール値になっています。
デフォルトではTrueになっています。
Djangoのデバッグモードのオンオフの切り替えを行います。
#### True
アプリケーションによってキャッチできないエクセプションが起こるとエクセプションの詳細ページを表示します。
#### False
Trueで表示されていた詳細ページを表示しないようにします。
本番環境では必ずFalseにしてください。機密データが漏れたりするので！！！

### ALLOWED_HOSTS
デバッグモードがオンの時、テストの実行中には適用されません。
ドメインやホストはここに追加します。
### INSTALLED_APPS
Djangoにインストールされているアプリを追加します。
アプリを新たにインストールした場合はここに追加する必要があります。
以下ではデフォルトでインストールされているアプリを書いておきます。
#### django.contrib.admin
管理サイト
#### django.contrib.auth
認証のためのアプリ
#### django.contrib.contenttypes
コンテンツタイプを処理するためのアプリ
#### django.contrib.sessions
セッションのためのアプリ
#### django.contrib.messages
メッセージのためのアプリ
#### django.contrib.staticfiles
静的ファイルを管理するためのアプリ


### DATABASES
djangoで使用するデータベースの情報を書きます。
デフォルトではSQLite3が設定されています。

### LANGUAGE_CODE
djangoで使用する言語を書きます。
デフォルトではen-usになっているのでjaに変更しておきます。

### TIME_ZONE
djangoで使用するタイムゾーンを書きます。
デフォルトではUTCになっているのでAsia/Tokyoに変更しておきます。

ここまでくると以下のようにdjangoの起動画面が日本語化されたと思います。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895676/a9434350-68c8-937d-9295-c9449e163598.png)

## 3. アプリについて
djangoにはプロジェクトとアプリと言う概念があります。
イメージとしてはプロジェクトが親でアプリが子になります。
1つのプロジェクトに対して同じ設定を持つアプリを複数作成する事が可能です。
### 1. アプリを作成する
これからブログアプリを作成してみようと思います。

```
# ls
db.sqlite3  manage.py  myproject
# python3 manage.py startapp blog
# ls
blog  db.sqlite3  manage.py  myproject
# tree blog
blog
|-- __init__.py
|-- admin.py
|-- apps.py
|-- migrations
|   `-- __init__.py
|-- models.py
|-- tests.py
`-- views.py

1 directory, 7 files
#
```
新たにblogディレクトリが作成されました。
### 2. アプリの中身について
上で作成したblogディレクトリの中身を紹介していきます。
#### admin.py
ここでモデルを登録します。
#### apps.py
blogアプリケーションの構成が書かれています。
#### migrations
blogアプリケーションのモデルの変更を追跡してデータベースを同期します。
#### models.py
blogアプリケーションのデータモデルです。
#### tests.py
blogアプリケーションのテストを追加することができます。
#### views.py
blogアプリケーションのビューです。

## 4. 最後に
今回はファイルやファイルの中身についての紹介がメインになりました。
次回は実際にモデルを作成していこうと思います。
お疲れ様でした！
Quest２でファイルが参照できない問題の解決法

OculusQuest2で`READ_EXTERNAL_STORAGE`権限を与えてもファイルが参照されない問題についての解決法が分かったので備忘録としてQiitaに置いときます。。

##経緯
Quest1からQuest2に同じアプリをビルドしてみたタイミングでvideoplayerでurl指定したはずの動画が流れず

##原因
Quest2がandroid10になっていた(Questは8.0)

##解決方法
__手順1__

`android：requestLegacyExternalStorage = "true"` を`AndroidManifest.xml`のアプリケーションタグに追加する。

```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto">
  <application android:label="@string/app_name" android:icon="@mipmap/app_icon" android:allowBackup="false" android:requestLegacyExternalStorage="true">
    <activity android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:configChanges="locale|fontScale|keyboard|keyboardHidden|mcc|mnc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|touchscreen|uiMode" android:launchMode="singleTask" android:name="com.unity3d.player.UnityPlayerActivity" android:excludeFromRecents="true">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
      <meta-data android:name="com.oculus.vr.focusaware" android:value="true" />
    </activity>
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="false" />
    <meta-data android:name="com.samsung.android.vr.application.mode" android:value="vr_only" />
    <meta-data android:name="com.oculus.supportedDevices" android:value="quest|delmar" />
  </application>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-feature android:name="android.hardware.vr.headtracking" android:version="1" android:required="true" />
</manifest>
```
[AndroidManifest](https://us.v-cdn.net/6024342/uploads/editor/xk/81gm9s8uzxjq.txt "AndroidManifest")
textファイルなのでxmlに変換してAssets/Plugins/Androidに置く。

__手順2__
bildtoolのバージョンを上げる。(`android：requestLegacyExternalStorage = "true"`がapiレベル29で追加されたものなのでbildtoolのバージョンを上げないとエラーが起きる。)

[Android Studio](https://developer.android.com/studio?hl=ja)をインストールし"Android 10.0 API Level29"をインストールする。
![スクリーンショット 2021-01-09 002951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912815/56c1829e-7b8b-fb0d-064b-7e84c63e47f9.png)
生成されたsdkファイルを"C:/Program Files/Unity/Hub/Editor/2019.4.16f1/Editor/Data/PlaybackEngines/AndroidPlayer/"
に置き換える。(ローカルディスクに保存して参照するのもあり。)

これでbuildするとbuildtoolのバージョンが上がっている。~~はず~~
上がっているかどうかは  "プロジェクトネーム/Temp/gradleOut/build.gradle"を開くと確認できる。
![スクリーンショット 2021-01-09 003923.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/912815/f360db42-3421-d414-29cf-493323ac6226.png)
フロントエンドやるなら入れておくべきPrettierってなに？

#プログラミング勉強日記
2020年11月27日
TwitterでフロントエンドやっててPrettierを入れてない人はいないというツイートを見かけて、Prettierってなんだ？って思ったので調べてみた。

#Prettierとは
　Prettier(読み方：「プリティア」)はソースコードを綺麗にしてくれるコードフォーマッターである。
　特に複数人で開発を行っているときに、各自が自由にコードを書いてしまうと、書き方が様々で読みにくくなってしまう。統一されていないコードはメンテナンス性も悪くなり、ミスの原因となる。そこで、コードフォーマッターを利用すると、自動的に決められたコードスタイルにしてくれるので、コードスタイルを意識することなくコーディングすることができる。

#Prettierのメリット
　コードフォーマッターはWebStormやVisual Studio CodeといったWeb制作のエディタに付属しているが、これらはユーザ環境に依存するので、開発者によってエディタが違うとコードフォーマットを統一することは難しくなる。PrettierはNode.js上で動作するのでユーザー環境に依存することなく、コードフォーマットを統一できる。

　また、PrettierはJavaScriptだけでなくWebの様々な言語にも対応する。(JSX, Flow, TypeScript, HTML, YAML, CSS, Less. SCSS, JSON, GraphQL, Markdown, styled-components, styled-jsx, Vue, Angular)


#導入方法

##0. Node.jsをインストールしてコマンドラインを起動する
　[これから](https://nodejs.org/ja/)Node.jsをインストールする。
　Windowsではコマンドプロンプトを起動して、作成したアプリまで移動する。

##1. Prettier本体をインストールする
　Prettierを実行するために、以下のコマンドを入力してインストールする

```
npm install -D prettier
```

##3. package.jsonに追記する

```json:package.json
{
  "scripts": {
    "format": "prettier --write 'src/**/*.js'"
  },
  "devDependencies": {
    "prettier": "^1.10.2"
  }
}
```

##4. コマンドを実行してコードを整形する

```
npm run format
```


#参考文献
[Prettierの導入方法
フロントエンド開発で必須のコード整形ツール](https://ics.media/entry/17030/)
[Prettierの使い方解説。フロントエンドで必須のコード整形ツールで、プログラミング学習の効率も上がります。](https://www.youtube.com/watch?v=zoaIv5ifoPI&feature=youtu.be)
Ruby 技術者認定試験 Gold に合格しました

# はじめに
[Ruby技術者認定試験 Silver 合格](https://qiita.com/superrino130/items/0b22c639bacc43ec9282)から半年たちましたが、
2020-11-27 に Ruby技術者認定試験 Gold に合格しました。
![20201127a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538241/6ed1d412-56c6-7967-5c8a-ec8254dcf653.png)

この記事が受験を考えている方の参考になれば幸いです。
# 勉強方法
勉強は次の４つを行いました。

+ AtCoder
+ 試験対策本
+ 模擬試験
+ ｗｅｂ上の体験談

# AtCoder
AtCoder さんの問題を引き続き解いております。
AtCoderの問題でクラスを使用する機会は少ないのですが、他の競技者のコードを読んだりすることにより、コードの読解力が深まると思います。

使用頻度：中
# 試験対策本
試験対策本はSilverに引き続き次の本を使用しました。
*[Ruby技術者認定試験合格教本 Silver/Gold対応　Ruby公式資格教科書](https://www.amazon.co.jp/gp/product/4774175676/)*
*[サポートページ](https://gihyo.jp/book/2015/978-4-7741-7567-6/support)*
第4章　オブジェクト指向と第5章　組み込みクラスを中心に読み返しました。
第8章　Ruby技術者認定試験Gold演習問題はさらさらっと見ただけで、もう少しやっておけば点数が取れたと思います。

評判の`メタプログラミングRuby 第2版` は図書館で2回借りましたが、合わなかったようでほとんど読まなかったです。

使用頻度：中
# 模擬試験
模擬試験問題は次のページを使用しました。
+ *[スマホでRuby試験勉強 | Ruby１問１答](https://ruby1mon1tou.com/)*
+ *[REx - Ruby Examination](https://rex.libertyfish.co.jp/)*

上の2つは繰返し解くことができますので、学習効果が高いと思います。
`Ruby１問１答` は本番より易し目、`REx - Ruby Examination`は本番より難し目と思います。
お薦めは、Ruby１問１答を覚えない程度に毎日やることだと思います。

使用頻度：高
# ｗｅｂ上の体験記
やはり頻繫に出題される問題や引っ掛かりやすい問題もあるようですので、体験記が役立ちます。
[気軽に楽しくプログラムと遊ぶ](https://tamata78.hatenablog.com/entry/2015/08/17/215136)
[資格取得に40代後半からチャレンジ](http://asura23.blog.fc2.com/blog-category-18.html)
Qiita にも沢山あります。

使用頻度：特高
# まとめ
試験勉強に一番のお薦めは、**[Ruby１問１答](https://ruby1mon1tou.com/)** です。~~REx は難しいので心が折れる~~
毎日、少しずつやる事が定着につながると思います。
但し、問題数に限りもあり幅が狭くなると思われますので、試験対策本で補う必要はあると思います。
ある程度自信が付いたところで、体験記を参考に仕上げをやるといいと思います。

最後に、Qiitaの記事にコメントをいただいた皆様に感謝を申し上げます。

```ruby.rb
begin
  puts "Ruby Gold" + "を受験しょう".to_str
rescue
  p "StandardErrorとそのサブクラス".inspect
ensure
  print "Happy Programming".to_s
end
```
PC-98 MASM32でグラフィック描画してみた

#環境
- Windows 10 Home (64bit)
- MASM32
- Neko Project Ⅱ x64
- DiskExplorer

#ソース

```nasm:gvram.asm
comment *
ml /c /AT /Fl gvram.asm
link16 /t gvram;
*
	.model	tiny

	.code
	org	100h
start:
	mov	al, 01h
	out	6ah, al		; 16色モード
	mov	al, 4bh
	out	0a2h, al	; G-GDC CSRFORMコマンド
	mov	al, 0h
	out	0a0h, al	; 縦方向の拡大率
	mov	al, 08h
	out	068h, al	; 400ラインモード
	mov	al, 0dh
	out	0a2h, al	; G-GDC STARTコマンド

	mov	al, 0		; 16色モードのパレット設定
	mov	dl, 0
	mov	cx, 16
L1:
	out	0a8h, al	; パレット番号
	out	0aah, al	; G 輝度
	out	0ach, al	; R 輝度
	xchg	ax, dx
	out	0aeh, al	; B 輝度
	xchg	ax, dx
	inc	al
	add	dl, 2
	cmp	dl, 0fh
	jbe	@f
	mov	dl, 0fh
@@:
	loop	L1

	mov	ax, 0a800h
	lea	bx, tile_b
	call	draw
	mov	ax, 0b000h
	lea	bx, tile_r
	call	draw
	mov	ax, 0b800h
	lea	bx, tile_g
	call	draw
	mov	ax, 0e000h
	lea	bx, tile_i
	call	draw
	mov	ax, 4c00h
	int	21h

;	ax	gvram segment
;	bx	tile addr
draw:
	mov	es, ax
	mov	di, 0
	mov	dx, 5*200
@@:
	mov	si, bx
	mov	cx, 8
	cld
	rep movsw
	dec	dx
	jnz	@b
	ret

tile_b	dw	0ff00h, 0ff00h, 0ff00h, 0ff00h, 0ff00h, 0ff00h, 0ff00h, 0ff00h
tile_r	dw	00000h, 0ffffh, 00000h, 0ffffh, 00000h, 0ffffh, 00000h, 0ffffh
tile_g	dw	00000h, 00000h, 0ffffh, 0ffffh, 00000h, 00000h, 0ffffh, 0ffffh
tile_i	dw	00000h, 00000h, 00000h, 00000h, 0ffffh, 0ffffh, 0ffffh, 0ffffh

	end	start
```

#おまけ
![gvram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257554/f7643998-3af9-b52e-bcd3-780bb0f719e4.png)
TypeScript入門

## 特徴

- 型定義が使える(変数, 引数、返り値、オブジェクト)
- インターフェース、クラス
- 入力補完(vs codeなど)


## 例

変数の定義

```tsx
let name: string; // name を文字列型として宣言
name = "ebihara";
name = 0; // エラー： 文字列ではない

// 直接代入
const name: string = "hogehoge"
```

変数の定義(配列)

```tsx
const array: string[] = [];
array.push("ebihara");
array.push(1); // エラー：配列の型と合わない

// 直接代入
const array: string[] = ["hogehoge", "fugafuga"];
```

## [クリーンアーキテクチャ](https://qiita.com/nrslib/items/a5f902c4defc83bd46b8)

- 層を分けて実装していくことで仕様変更に強くなる(必要な奏の部分だけの修正でいい)
- 層→Presentation Layer(UIなど)、Domain Layer(UseCasesなどビジネスロジック), Data Layer(entity定義など)

ex.

- page(Presentation Layer)
- EmployeeUseCase(Domain Layer)
- repositoryやdomain(Data Layer)
THREE Image Transitionを自分サイトに取り入れる

# 概要
HTMLのスライダーをテンプレートを使ってサクッと実装しようと思い、[PHOTPSHOPVIP](https://photoshopvip.net/100275)さんのサイトの中にあった、[THREE Image Transition](https://codepen.io/zadvorsky/pen/PNXbGo)を自分のサイトに取り入れてスライダーを実装しようと思いました。
**しかし、少しハマってしまいました。**
そのまま、コピー&ペーストではダメな様です。
そこで、自分なりの解決方法をメモも兼ねて記載しておきます。
（初投稿のため、至らない部分がありましたら申し訳ございません。）

#解決方法
テンプレートに加えて、以下のプログラムをindex.html上に追加しました。

```HTML:index.html
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r75/three.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.18.0/TweenMax.min.js"></script>
<script src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/175711/bas.js"></script>
<link href="css/styles_myself.css" rel="stylesheet">
<script src="js/scripts_myself.js"></script>
```

styles_myself.cssとscripts_myself.jsは、サイト上のテンプレートをそのままコピペしてあります。
ファイルのパスは各々調節してください。

#その後の調整
実装が完了すると以下の様になると思います。
![スクリーンショット 2020-11-27 17.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637828/96386394-7940-98dc-2078-961a919e2c79.png)
しかし、このままだとスライダーだけのページになってしまうので、追加したcssを編集します。

```CSS:styles_myself.css
body {
  margin: 0;
  /* overflow: hidden; */
}

canvas {
  /* background-image: radial-gradient(#666, #333); */
}

#instructions {
  position: absolute;
  color: #fff;
  bottom: 0;
  padding-bottom: 6px;
  font-family: sans-serif;
  width: 100%;
  text-align: center;
  pointer-events: none;
}
```
**background-image**と**overflow**をコメントアウトすることで背景を消し、スライダーを表示させることができます。

#最後に
このスライダーはThree.jsが使われているそうです。
私は、Three.jsは触ったことがないばかりか、HTML,css,JavaScriptについての知識もあまりないので、もしより良い改善策がありましたら、ご教授ください。
また著作権などの権利については、ご自身でお調べになってから使ってくださいね！
最後まで見ていただき、ありがとうございました。

#参考にさせていただいたサイト
https://photoshopvip.net/100275
https://codepen.io/zadvorsky/pen/PNXbGo
CentOS8.2でSCPを利用する手順

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---
VPSサーバー（CentOS8.2）を構築しているが、既存の別サーバーからファイルをコピーしたい。方法はいろいろあるが、今回はscpコマンドを使った。大した内容ではないが、手順をメモしておく。

scpコマンドは、SSHプロトコルを使用するので、ホスト間でファイルを転送する場合にネットワーク通信は暗号化され、安全にファイルの転送を行える。

## scpのインストール
SCP はopenssh-clientsパッケージに入っている。CentOS8ではインストール済みのようだ。

```bash

$ yum -y install openssh-clients
```

## scpコマンドの使い方
コマンドの使い方は、以下の感じになる。ファイルやディレクトリをホスト間でコピーできる。from,toのどちらかには、ユーザー名とIPアドレスの指定が必要になる。-rオプションはサブディレクトリをリカーシブに処理し、-pオプションは属性（更新日時やアクセス権限）も合わせて保持させるかどうか。

```bash

$ scp -p  fromFile user@toIp:toDir
$ scp -pr fromDir user@toIp:toDir
$ scp -p  user@fromIp:fromFile toDir
$ scp -pr user@fromIp:fromDir toDir
$ scp -p  user@fromIp:fromFile user@toIp:toDir
$ scp -pr user@fromIp:fromDir user@toIp:toDir
```

## 実行例

例えば、稼働中の現行サーバー（157.xxx.xxx.xxx）にあるファイルをローカルサーバーの作業領域（/var/share9）にコピーしてみる。taconanaユーザーで行ってみる。MySQLのバックアップ用のシェルファイルと最新のバックアップファイルをコピーしている。

```

$ mkdir /var/share9
$ chmod 666 /var/share9

$ scp -p taconana@157.xxx.xxx.xxx:/var/share7/*.sh /var/share9
The authenticity of host '157.xxx.xxx.xxx (157.xxx.xxx.xxx)' can't be established.
RSA key fingerprint is SHA256:XTzxuKcaiqXUfexxxxxxxxxYXExceI9Ryscjs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '157.xxx.xxx.xxx' (RSA) to the list of known hosts.
taconana@157.xxx.xxx.xxx's password: ***
mysql-backup.sh                                  100%  537   630.0KB/s   00:00
$ ls -lag /var/share9
-rwxr-xr-x  1 root  537 Oct 14  2017 mysql-backup.sh

$ mkdir /var/share9/mysql-backup
$ chmod 666 /var/share9/mysql-backup

$ scp -p taconana@157.xxx.xxx.xxx:/var/lib/mysql/backup/backup-20201127.tar.gz /var/share9/mysql-backup
taconana@157.xxx.xxx.xxx's password: ***
backup-20201127.tar.gz                           100%   13MB   6.0MB/s   00:02
$ ls -lag /var/share9/mysql-backup
-rw-r--r-- 1 root  13813392 Nov 26 11:45 backup-20201127.tar.gz
```

以上

| [../](https://qiita.com/taconana/items/e45f19e83c825a9ba75e) |
---
2.17.2 HSデータI/O /バンド選択/ROI抽出

# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)


# 概要


MATLABには2020aの途中から、ハイパースペクトル画像処理用のライブラリが追加されています。とてもさりげなく追加されています。私は前職で衛星画像処理をしていましたが、残念ですがハイパースペクトル画像を扱ったことはありませんでした。とってもいい機会だわ！ということで少し触ってみたので、せっかくなので使い方を紹介したいと思います。




動作環境としては、MATLAB2020bのImage Processing Toolboxとなります。その上で、アドオンとして、[Image Processing Toolbox Hyperspectral Imaging Library](https://www.mathworks.com/matlabcentral/fileexchange/76796-image-processing-toolbox-hyperspectral-imaging-library)　をインストールする必要があります。




対応ファイル：[I2_17_2_HyperSpectral_display.m](https://github.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/blob/master/demo_files/I2_17_2_HyperSpectral_display.m)


# 初期化

```matlab:Code
clc;clear;close all;imtool close all;
```

# ハイパースペクトル画像の読み込み


データの読み込みです。



```matlab:Code
hcube = hypercube('paviaU.hdr');
```



[公式ドキュメント](https://www.mathworks.com/help/images/ref/hypercube.html)を見ると、




> The input file can be a national imagery transmission format (NITF) file, Hyperion level 1R (L1R) file stored in hierarchical data format (HDF), ENVI header or image file, or metadata text extension (MTL) file that contains satellite data from earth observing (EO) satellites.
>
>
>
>   -  EO-1 Hyperion 
>   -  EO-1 Advanced Land Imager (EO-1 ALI) 
>   -  Landsat Multispectral Scanner (Landsat MSS) 
>   -  Landsat Thematic Mapper (Landsat TM) 
>   -  Landsat Enhanced Thematic Mapper Plus (Landsat ETM+) 
>   -  Landsat Operational Land Imager / Thermal Infrared Scanner (Landsat OLI / TIRS) 



とか




>The `hypercube` function reads satellite data that are stored in georeferenced tagged image file format (GeoTIFF).




となっていますね。




上のコードの場合は、ENVIのヘッダーファイルを指定しています。これでも同名の.datファイルを自動で読むことができます。


# 表示用にRGBバンドを抽出

```matlab:Code
img = colorize(hcube, 'Method','rgb','ContrastStretching',true);
% 可視化
imshow(img);
```


![figure_0_png.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202697/0e42b606-f8f8-df7e-8489-d329d4f3bdaf.jpeg)


これ便利じゃないですか？！メタデータからRGBバンドに該当するチャンネルを自動で抽出してくれて、RGB画像を表示しています。ちなみに'Method'プロパティで'falsecolored'とか'cir'を指定することもできて、それぞれ最も情報量の多い3バンド、[NIR,R,G]の3バンドになるようです。詳しくはこちらも[公式ドキュメント](https://www.mathworks.com/help/images/ref/hypercube.colorize.html#namevaluepairarguments)をご覧ください。




この記事では、とりあえずジャブということで表示だけです。


# 謝辞


本記事は [@eigs](https://qiita.com/eigs) さんの[livescript2markdown](https://github.com/minoue-xx/livescript2markdown)を使わせていただいてます。


# 目次へのリンク


[MATLABによる画像処理・コンピュータービジョン入門目次](https://qiita.com/tohruk/items/e5f7939b622bcf2e3c4c)
Swift Xibファイルを使い始めるとloadNibNamedでexc_bad_access 落ちました

お仕事の方のプロジェクトでは、
xibファイルがたくさん採用されたため、最近xibファイルを使い始めました。

xibファイルを追加するソースコードの箇所で落ちて、
EXC_BAD_ACCESSが発生してはまったのでメモしておきます。

Xcodeで新規ファイルを作成する時に、Viewを選択すると、xibファイルが生成、
Viewで必要なパーツをドラッグ、CocoaTouchClassでソースコードで書きます。

例えば、PlayerViewのxibファイル（Custom View）を作った。
同じ名前でCocoaTouchClassを作り、このようにコードを書きます。

```Swift
class PlayerView: UIView {

    var playerLayer:AVPlayerLayer?
    @IBOutlet weak var timeLabel: UILabel!
        
    override func layoutSubviews() {
        super.layoutSubviews()
        playerLayer?.frame = self.bounds
    }

//　以下も書く場合があるようですが、これの有無による違いがよくわかりません。
//    override init(frame: CGRect) {
//        super.init(frame: frame)
//        loadFromNib()
//    }

    required public init?(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)
        loadFromNib()
    }
    
    private func loadFromNib(){
        let view = Bundle.main.loadNibNamed("PlayerView", owner: self, options: nil)?.first as! UIView
        view.frame = self.bounds
        self.addSubview(view)
    }
}
```

そうすると、xibファイル(Interface)がcocoa touch class(ソースコード)と関連付できます。
しかし、ビルドしてみるとこの行

```Swift
let view = Bundle.main.loadNibNamed("PlayerView", owner: self, options: nil)?.first as! UIView
```

でthread 1: exc_bad_access (code=2, address=0x7ffee5b3eff8)が発生して落ちました。
いろいろ記事を見ましたが、[この記事](https://stackoverflow.com/questions/19355104/exc-bad-access-on-custom-uiview-with-custom-xib/35922837)が救ってくれました。

私の場合、原因がこれです！
FileOwnerをPlayerViewに設定し、
xigファイル内のViewのCustomClassも重ねてPlayerViewに設定してしまったからです。
Viewで重複設定した分外したら、落ちなくなりました。
![スクリーンショット 2020-11-27 17.28.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/644086/3af27f5b-2a10-cdf1-90ac-fd0ed68607e1.png)
ついにSequelProの後継が出たよ！

# はじめに
MySQL等を触る際にとても便利なDBクライアントツール
皆さんは何を使っていますか？

僕は今まで「[SequelPro](https://github.com/sequelpro/sequelpro)」を使っていました。

# SequelProの更新が止まった
今まで沢山お世話になったSequelProですが、ある日からパッタリと更新を辞めました。

製作者に何があったのかは分かりませんが、未解決の課題は積もっていき1000を超える量となってしまい、本格的に乗り換えを検討が必要となりました。

# SequelPro難民を救うべく立ち上がった開発者達
SequelProが非アクティブになってから何年も経った時、ついにコミュニティが立ち上がりました。

SequelProをフォークして後継となる[SequelAce](https://github.com/Sequel-Ace/Sequel-Ace)を作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354659/ee79867b-a712-f934-5623-e1a0c6290e93.png)

あくまでフォークしたものなのでライセンスはSequelProに帰属します。

>License
Copyright (c) 2020 Moballo, LLC. All rights reserved. Forked from Sequel Pro: Copyright (c) 2002-2019 Sequel Pro & CocoaMySQL Teams. All rights reserved.
Sequel Ace is free and open source software, licensed under MIT. See LICENSE for full details.

開発も活発に行われているため、SequelProユーザーにはとても嬉しいニュースですね。

# 使用感
使用感はSequelProとほとんど変わりません。
最近流行りのダークモードにも対応しており、UIがさらに洗練された印象です。
まさにSequelProの上位互換という感じですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354659/b639327f-c6f3-5bcc-09ec-40574fe956bb.png)


# ダウンロード方法
ダウンロードは[AppStore](https://apps.apple.com/us/app/sequel-ace/id1518036000?ls=1)から可能です。

また、以下のコマンドでHomebrew経由でダウンロードすることも可能です。

```
$ brew cask install sequel-ace
```

# まとめ
CLIの魅力もありますが、DBクライアントツールは作業効率を大きく向上してくれる大切な要素だと思います。

ぜひお気に入りのDBクライアントツールを導入して効率的に開発を行っていきましょう〜！
投稿記事を表示するときにthe_content(); ではなくthe_excerpt();で表示する

知識の整理のために以前学習したデイトラというオンラインサービスの上級編を2周目しています。

そのなかで、あれっと思ったのが投稿記事一覧を表示するときに投稿記事の本文の一部を表示させるときのタグです。

実案件で確かthe_contentでやっていて、文字数の制御を`functions.php`で行っていたのですがthe_excerpts();を使えば簡単に制御できるんですね。笑
あかんですねやっぱり忘れちゃうなぁ。

![174cc2be7bed3e3ab782a995cfdb6da2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/4de6cf0a-3f9e-0736-01ff-5854bd59a7a7.png)

実際にこのように表示されます。
ちなみに、ここを入力しないと本文から110文字表示されます。（デフォルト値）
![e65e84156ae47c0909e323f57085d652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/9ee44551-be4c-f3d2-1d41-8154844c5b6d.png)

参考(https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_excerpt)

表示内容を変えることもできますので、ご参考まで。

![6b96a11c3444be417290c9d93b82be93.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592040/717ab02a-e84d-451b-1ec8-894aa829dbd2.png)


```functions.php
//文字数を20字に制御
function custom_excerpt_length( $length ) {
  return 20;	
}	
add_filter( 'excerpt_length', 'custom_excerpt_length', 999 );

//[...]を[もっと読ませて〜]に変更
function new_excerpt_more($more) {
	return '[もっと読ませて〜]';
}
add_filter('excerpt_more', 'new_excerpt_more');

```
OpenSouceMapに当校の場所を記載してみた。


産業技術短期大学校情報技術科アドベントカレンダー2020用の記事です。

OpenStreetMapに関する記事を書こうと思います。
OpenStreetMapとは・・・
オープンデータの地図情報です。

さて、地図上で矢巾駅からの経路をJavascriptで表示するものを作りたかったのですが、、

＼ないー！／
![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/3df3c950-067e-3979-6971-a814715b86a7.png)

岩手医科大学はあるのに
矢巾に岩手医科大学より古くからある当校がない・・・・

ということで、OpenStreetMap（OSM）の編集をしてみました。
#編集してみる
まずはOSMにユーザー登録をし、ログインができたら
編集ボタンを押して編集したい地へとたどり着きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/f3f11d78-a2a7-2446-adfe-7ed10aaad697.png)

俯瞰した写真が現れます。
上空から見た写真だとちゃんと存在していますね！

##地点の登録
まずは地点を登録しましょう。
①「ポイント」を選択します。
②地図上で地点を選択します。
③左側の欄で
　「短大」と探すと短大の敷地か建物かを選べます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/f057cf43-8c80-b686-9022-5f89ed493813.png)


##敷地の登録
当校のエリアを囲んでみましょう。
①「エリア」を選択します。
② 地図内で敷地を囲みます。
　クリックで点が打てますので、いい感じに囲みます。
　最初に打った点に重ねてクリックするとエリアを囲み終わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/d023050a-2a44-7bf2-c0f5-0703906b3ac7.png)

③左側の欄に敷地に対する説明を入力します。
　「短大」と探すと短大の敷地か建物かを選べます。
　敷地を選択し、詳細情報の入力画面に移ります。
　今回は初めてということもあり、名称とWebサイトのみ入力しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/9f4d5176-b3ec-0845-8ac5-93624b04d7e8.png)


##建物の登録
①「エリア」を選択します。
② 地図内で建物を囲みます。
　非常に細かく、何度かやり直しました。。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/b0eeb0ea-cdb5-547c-e2db-6773fdf5a6e4.png)
こちらも検索から「短大・高専・専門学校（建物）」を選択し、
詳細な情報を追記。（近くの不来方高校を参考に・・・）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/1e8a0f3f-e48c-335e-1b2c-920e7ffde482.png)

編集が終わったら「保存」ボタンからアップロードして全世界に公開します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/41eb121f-7ad0-509c-13f2-4cd644ae95ab.png)

ヤッター！
登録されました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/eccb0cb9-e2d9-1f3d-ec67-e66a03d55a24.png)

引きで見るとこんな感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61550/ece07443-5513-2115-0471-d1e49d875276.png)

##さいごに
OSMはユーザー登録すればだれでも編集可能です！！
広い岩手県ですから、まだまだ手つかずの地がありそうです。
みなさまも周りの施設などを登録してみましょう。

世界がOpenStreetMapを必要とする理由
https://qiita.com/nyampire/items/073c850f083cf9fb8d35


ちょっと脱線しますが、
企業に頼らず地図を作る（OSM）
↓
自分たちのテクノロジーで住んでいる町を豊かにする
↓
こういった考えはシビックテックにも繋がります。（無理やり感）
CodeforIwateという団体もありますので、ぜひ参加してみてください。
https://code4iwate.org/


次回はこの地図を使って経路を表示してみたいと思います！


<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="result" data-user="h-abe" data-slug-hash="dyXLZWR" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Map">
  <span>See the Pen <a href="https://codepen.io/h-abe/pen/dyXLZWR">
  Map</a> by abeharuna (<a href="https://codepen.io/h-abe">@h-abe</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
irisデータセットでデータサイエンス超絶初歩入門する

#動機
自然言語処理の文書分類の前に普通の分類やってみたい

#設定
かの有名な__iris__データセット使います
適当にsklearnで訓練用、検証用、テスト用にわけて精度測ります
モデルはおなじみ__lightgbm__です

#コード
```
import numpy as np
from pandas import DataFrame
import pandas as pd
import lightgbm as lgb
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

iris = load_iris() #irisdatasetの読み込み

data = iris["data"]
target = iris["target"].reshape(150,1)
dataset = np.concatenate([data, target], axis=1)
features = iris['feature_names']
features.append("target")
df = DataFrame(dataset, columns=features)

#中身の確認
print(df) 

#訓練とテストにデータを分ける
train_set, test_set = train_test_split(df, test_size = 0.3, random_state = 123)
eval_set, test_set = train_test_split(test_set, test_size = 0.5, random_state = 123)

#目的変数と説明変数に分ける
x_train, y_train = train_set.drop("target", axis=1), train_set["target"]
x_eval, y_eval = eval_set.drop("target", axis=1), eval_set["target"]
x_test, y_test = test_set.drop("target", axis=1), test_set["target"]


#lightgbmのパラメータを設定
params = {
    'task': 'train', #訓練する
    'num_class': 3, #irisデータは目的変数が3種類であるため
    'boosting_type': 'gbdt',
    'objective': 'multiclass', #多クラス分類
    'metric': {'multi_logloss'}, #多クラス分類の損失
    'verbose': -1
}

#入力データの統合
lgb_train = lgb.Dataset(x_train, label=y_train)
lgb_eval = lgb.Dataset(x_eval, label=y_eval)

#訓練
model = lgb.train(params=params, #パラメータ 
                train_set=lgb_train, #訓練データ
                num_boost_round=100, #計算回数
                valid_sets=lgb_eval, #検証データ
                early_stopping_rounds=10) #アーリーストッピング

#テストデータで予測＆精度確認
y_pred = model.predict(x_test, num_iteration=model.best_iteration)
y_pred = DataFrame(np.argmax(y_pred, axis=1).reshape(len(y_pred),1))

#単純な精度
print(accuracy_score(y_test, y_pred))
#Recall Precsionなど
print(classification_report(y_test, y_pred))
#混同行列
print(confusion_matrix(y_test, y_pred))
```

#参考
>http://wordroid.sblo.jp/article/180966841.html
Rails seedファイルによる初期データの設定

HerokuでRailsアプリをデプロイした際に自身のアプリケーションでは管理権限のあるユーザーしかユーザーを作成出来ない仕様のアプリケーションなのですが、root画面がログイン画面なので操作出来ないと思い色々考えていたらseedファイルという便利なものがあるのを知り導入しました。

##seedファイルとは
初期データを記述できるファイルです。これがある事で上の件であったり、データベースを作り直す度にテストユーザーの作成時間を短縮する事が出来ます。

db/seeds.rbに記述します。

```ruby
User.create!(
   name: 'テスト',
   email: 'test@test.com',
   password: 'xxxxxx',
   admin: true
)

```

###開発環境に反映する

```
$rails db:seed
```
###Heroku: 本番環境に反映する

```
heroku run rake db:seed
```
↑がないと本番環境に反映されません。


ちなみになんですが恥ずかしながら、HerokuでもRails cが使えるのを知らなかったです。