OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsでRuby/GTK3を実行する

MacやLinuxの場合，
```gem install gtk3```
でインストールできるらしいのですが，Windowsだと少し面倒なのでメモ．

## RubyInstaller for Windows をダウンロード

- 以下からRubyInstallerをダウンロードします．
  - https://rubyinstaller.org/downloads/
- 以後 rubyinstaller-2.6.3-1-x64.exe をダウンロードしたものとして説明します．

## ダウンロードしたrubyinstaller-2.6.3-1-x64.exeを実行

- ウィザードに従って進めます．
![ri1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/a09744aa-c339-13e3-bf46-1c3f3f4deb73.png)

- ダブルクリックでrbを起動したい場合は，「Associate .rb and .rbw files ～」にチェックを入れます．
![ri2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/ab0e1853-ec0d-b51c-82e8-bb55f1c7fa9a.png)

- 最後の画面で「Run 'ridk install' to setup MSYS2 ～」にチェックを入れます．
![ri3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/064d0c31-24b0-19ce-4b2f-0b8e78de08f0.png)

- 以下のコンソールが起動します．
![ri4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/43c04ebb-cac9-2e54-70b7-e4b4b1df74cd.png)


## MSYS2をインストール

- 「1」を入力し，「MSYS2 base installation」を実行します．
![ri5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/6bb5861f-521e-1714-31f9-a0040e883c3b.png)

- 以下のウィザードが起動するので「次へ」をクリックします．

|![ri6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/28e4e1f7-60fe-1e82-9128-84ee0e5d727e.png)|
|:-:|

- インストール先フォルダを選択します．(以後「C:\msys64」にインストールしたものとします)
![ri7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/4417863e-f9ab-55ff-d083-5b7ece445053.png)

- 「次へ」をクリックします．
![ri8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/1543430c-bf7a-15ea-e5b9-3857e72ec4d2.png)

- 「完了」をクリックします．
![ri9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/e5390382-4a95-d604-7ad4-d333490a4e9c.png)

- 続いて「2」を入力し，「MSYS2 system update (optional)」を実行します．
![ri10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/c3f8bc61-bcc8-e565-8bb5-ff957452ea65.png)

- 続いて「3」を入力し，「MSYS2 and MINGW development toolchain」を実行します．
![ri11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/c4349f10-578a-1dbb-e85f-8e1c0b15a565.png)

- 完了したらEnterを押します．
![ri12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/3ca1506d-e735-438d-22ec-b7c6acd42171.png)


## GTK3のインストール

- コマンドプロンプトを開き，インストールしたRuby環境を用いて，GTK3をインストールします．  

```
> cd C:\Ruby26-x64\bin  
> gem install gtk3
```

- 結構時間がかかりますが，インストールが完了すると以下のようになります．  
![ri14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/19ff27c3-5d2b-5383-63cf-f8adef263f20.png)


### 動作確認

- 以下のコードを任意の場所へ保存します．

```test.rb
#!ruby -w

require "gtk3"
cWindow = Gtk::Window.new()
cWindow.signal_connect(:destroy){Gtk.main_quit()}
cWindow.show()
Gtk.main()
```

- インストールしたRuby環境でtest.rbを実行します．

```
> C:\Ruby26-x64\bin\ruby.exe test.rb
```

- 以下のウィンドウが起動すればOKです．  
![ri15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/457334/1a10eb58-db2a-1a98-78f1-bcbf92e50e4d.png)
【Linux】ファイル閲覧コマンドまとめ

# この記事は？
ログファイルを閲覧することが多いので、自分なりに調べてまとめてみました。
※編集については現在不要であったため未調査です。(viなど)

# 一覧
- cat
- view
- head
- tail
- less
- more

##cat
ファイルの内容を一気に表示する。
カーソルがファイルの終端まで行ってしまうので、行数が多くて先頭から見たいという場合には不向き。
(他のコマンドもだけど、出力する行数が多すぎると文字化けしてしまう場合がある？)

-nで行番号表示・-Sで連続する空白行を1行に置き換えるなど便利そう。

catコマンドと逆順で表示するtacコマンドもあるらしい(未確認)

##view
viを読み取り専用モードで起動する。
検索がかけられるのでログから特定の行を参照したい時とか重宝してます。
(viについては不勉強なので後日学びます。)

##head
ファイルの先頭から指定行を出力する。デフォルトは10行。
-nで行数の変更可能。
最大の特徴は複数ファイルを指定可能なこと。ヘッダーの比較とか抜き出しとかやるとき便利？

##tail
ファイルの最後から指定行を出力する。デフォルトは10行。
-fでリアルタイムにファイルの監視が可能。(例：ファイルに対して追記されれば標準出力にも反映される。)
tail -fn 0 [ログファイル]を実行してから対象の機能を動かす、のような使い方をすると、機能開始時からのログを出すことが出来るのでとても便利。

##more
画面に収まる分だけ出力する。スペースで1画面、Enterで1行ずつ進むことが出来る。
容量の大きいテキストとかを読むときは早くていい。

##less
moreの機能を拡張したコマンド。
検索やナンバリング・空白行をまとめるなどが可能。
また、閲覧中にShift＋fを押すことで、ファイルの更新をリアルタイムで反映するモードに移行できる。(tail -fより便利そう？)

#まとめ
今まではtail -fnを使うことがほとんどでしたが、目的によってコマンドを使い分けることで生産性が高められるのかなと思います。
CRUD機能のD(Delete)におけるデータベース間とのやりとり

CRUD機能とは、ほぼ全てのソフトウェアが有する4つの永続的な基本機能の頭文字をそれぞれ並べた用語のことをいう。 その4つの機能とは、Create（生成）、Read（読み取り）、Update（更新）、Delete（削除）を指す。

今回は、DのDeleteについての仕組みを解説する。そのため、主にコントローラのdestroyアクションについて解説する。Deleteは、既にデータベースに存在するデータを削除することである。Deleteの流れは、destroyアクションのみを実装すれば良い。


#Deleteの処理の流れ

削除したいデータをデータベース上の特定テーブルから抽出して削除する処理

ルーティングを設定する。

```ruby

delete  'tweets/:id'  => 'tweets#destroy'
```

destroyアクションを作動させるためのhttpメソッドは、**delete**を用いる。


コントローラを設定する

```ruby

def destroy
    tweet = Tweet.find(params[:id])
    if tweet.user_id == current_user.id
      tweet.destroy
    end
end

```
コントローラの記述は、editアクションやupdateアクションのときと同様削除したいデータのidと現在ログイン中のユーザーのidが一致していれば、抽出したデータを削除するという処理を行う。

ちなみに、if文を１行に省略して記述する方法として、後置ifを用いて記述する方法がある。

```ruby
def destroy
    tweet = Tweet.find(params[:id])
    tweet.destroy if tweet.user_id == current_user.id
end
```
Nullについて

### Nullは ゼロでも空でもない！
Nullはゼロ(0)ではない。もちろん、空でもないのだ。
ゼロや空と教える人は素人だ。信用しないほうが良い。
では、Nullは何なのか？
**Nullは不定**なのだ。値が定まっていない状態なのだ。
値は設定不可能もしくはわからない状態なのだ。
「声の色は？」 これは設定の不可能なのだ
「電車で隣に座っている人の名前」わからないけれど、名前はある。
このような状態がNullなのだ。
ちなみに、ゼロも空も値が定まった状態なのでNullではないのだ。
Nullは不定なので、１＋不定 は 不定 なのだ。
すなわち 1 + Null = Null なのだ。
わからない値(Null)に 1 を足した結果はわからない(Null)なのだ。

SQLをやったことがある人は、SUMとか集計できるぞ！というかもしれない。
SQLの集約関数は、Nullを無視する。
**Nullを無視**するのだ。これは、件数を取得するとわかる。
tbl
+----+
│ col│
+----+
│  10│
+----+
│  20│
+----+
│Null│
+----+

select count(col) from tbl
結果：2 (カラム指定の場合はNullは無視)である。
ただし、
select count(*) from tbl
結果：3と返る。
このSQLはテーブルのレコード数を取得するので、カラム単体のNullは考慮(無視)されない。

最後にもう一度だけ、
**Nullは ゼロでも空でもない！**
IBM Cloud上に無料で‘WordPressのサイトを

今日はIBM Cloud上のKubernetesサービスを使って費用ゼロでWordPressのサイトを立ち上げてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/911a2029-65c2-68a1-642f-698a0041b1fa.png)

＊費用はかかりませんが無料のライトアカウントではできません。クレジットカードの登録は必要です。
＊元ネタはこれです。英語問題なければこちら見たほうがいいです。https://github.com/IBM/scalable-wordpress-deployment-on-kubernetes?cm_sp=IBMCode-_-scalable-wordpress-on-kubernetes-_-Get-the-Code
*GitやIBM Cloud CLI, kubectlなどはあらかじめインストールしておいてください。
　
"私はWindows 10 homeでやりました。途中WSLが必要になりました。

手順は
1. Secret用のpassword.txt を作成
2. コードをローカルにクローン
3. Kubernetesクラスター上に永続ボリュームを作成
4. MySQLのサービス、WordPressサービスをデプロイ
5. ブラウザーで確認

ではやってみましょう。
1. Secret用のpassword.txt を作成
　設定したいパスワードをpassword.txtに入れて以下のコマンドで改行がないようにしてください。
$ tr -d '\n' <password.txt >.strippedpassword.txt && mv .strippedpassword.txt password.txt
(私はWindows環境だったのでwslで上のコマンドいれました。

2. コードをローカルにクローン
$ git clone https://github.com/IBM/Scalable-WordPress-deployment-on-Kubernetes.git
でコードをクローン
$ cd  Scalable-WordPress-deployment-on-Kubernetes
でコードのあるフォルダーに移動してください。

3. Kubernetesクラスター上に永続ボリュームを作成
　以下のコマンドでローカルヴォリュームを作成してください
$ kubectl create -f local-volumes.yaml

4. MySQLのサービス、WordPressサービスをデプロイ
以下のコマンドでMySQL, WordPressをデプロイしてください。
$ kubectl create secret generic mysql-pass --from-file=password.txt
$ kubectl create -f mysql-deployment.yaml
$ kubectl create -f wordpress-deployment.yaml
次に以下のコマンドでPodを確認してください。
$ kubectl get pods
以下のような結果が得られるはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/037947c1-f1f2-f599-d922-e7f00f0a66d3.png)

5. ブラウザーで確認
‘以下のコマンドでクラスターのパブリックIPアドレスを確認してください。
$ ibmcloud ks workers <your_cluster_name>
次にサービスのポート番号を以下のコマンドで確認してください。
$ kubectl get svc wordpress
PORt(s)の2番目の値、たぶん30000台の番号がポート番号になります。
ブラウザーを立ち上げ上記　IPアドレス:ポート番号でアクセスしてみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/697071b0-a822-fd0a-b324-c45820c96318.png)
CRUD機能のU(Update)におけるデータベース間とのやりとり

CRUD機能とは、ほぼ全てのソフトウェアが有する4つの永続的な基本機能の頭文字をそれぞれ並べた用語のことをいう。 その4つの機能とは、Create（生成）、Read（読み取り）、Update（更新）、Delete（削除）を指す。

今回は、UのUpdateについての仕組みを解説する。そのため、主にコントローラのeditアクションとupdateアクションについて解説する。Updateは、既にデータベースに存在するデータを新たに更新することである。Update処理の流れとしては、editアクション→updateアクションの順番となる。


#1.Updateの処理の流れ

データベース上既に存在する特定のデータを抽出する処理(editアクション)
　　　　　↓
抽出したデータを更新し、再びデータベースに保存する処理(updateアクション)


#2.データベース上既に存在する特定のデータを抽出する処理(editアクション)

データを更新するためには、編集画面に移動する必要がある。

ルーティングを設定する。

```ruby

get   'tweets/:id/edit'  => 'tweets#edit'
```

コントローラを設定する

```ruby

def edit
    @tweet = Tweet.find(params[:id])
end
```
editアクションは、データベースの特定のテーブルから,編集したいレコード(ここでは、ツイートのid)を抽出する。そして、そのデータを編集画面のビューに送る。

#3.抽出したデータを更新し、再びデータベースに保存する処理(updateアクション)

editアクションによって呼び出された編集画面に新規投稿する。その際、ビューの方であらかじめ、ルーティングが呼び出される記述をする。(今回は、form_tagを使う。)

```html
<%= form_tag("/tweets/#{@tweet.id}", method: :patch ) do %>
```
これにより、編集をして新規投稿した時にルーティングが呼びだされる。ちなみに、編集をする際に使用するhttpメソッドは**patch**である。

ルーティングの設定

```ruby

patch   'tweets/:id'  => 'tweets#update'
```
これにより、新規投稿した時にコントローラのupdateアクションが実行するようになる。


コントローラの設定

```ruby

  def update
    tweet = Tweet.find(params[:id])
    if tweet.user_id == current_user.id
      tweet.update(tweet_params)
    end
  end

```
updateアクションは、編集するデータがログイン中のユーザーであれば、編集されたデータを新規投稿を行い、テーブルに新たなレコードを保存するようになる(データベースとのやりとりにおいては、createアクションと同じ動きをする。)


ちなみに、if文を１行に省略して記述する方法として、後置ifを用いて記述する方法がある。

```ruby
def update
    tweet = Tweet.find(params[:id])
    tweet.update(tweet_params) if tweet.user_id == current_user.id
end
```
[備忘録]GitHubの情報を取得する by vue.js

# GitHubの情報を取得する

# 準備
`https://github.com/settings/tokens` の `Personal access tokens` で `Generate new token` してapiを用意

# 簡易的な方法
```
https://api.github.com/users/[username]?access_token=[Personal access token key]
```

# ソースコード
axiosを使用します

`npm install --save-dev axios`

app.vue

``` vue.js
<template>
  <div id="app">
    <GitData repoName="UserName" />
  </div>
</template>

<script>
import GitData from "./components/Git.vue";

export default {
  name: "app",
  components: {
    GitData
  }
};
</script>
```

Git.vue

``` vue.js
<template>
  <div class="gitdata">
    <h>public repo num : {{this.userDatas.public_repos}}</h>
  </div>
</template>


<script>
import axios from "axios";

export default {
  name: "GitData",
  props: {
    repoName: String
  },
  data() {
    return { userDatas: [] };
  },
  mounted() {
    const request = axios.create({
      baseURL: "https://api.github.com"
    });
    request
      .get(
        `/users/${this.repoName}?access_token=api_key` // api key は　gitにあげない！.envなどで管理
      )
      .then(res => {
        this.userDatas = res.data;
        console.log(res);
      });
  }
};
</script>

<style lang="scss">
</style>


```

# memo
apiの取得はどこですれば？
今回はDOMに描画するのでmountedでする。
https://qiita.com/kimullaa/items/2bf8948dffb8c52d2b6b

> created
> インスタンスの初期化が済んで props や computed にアクセスできる
> DOMにはアクセスできない
> mounted
> created + DOMにアクセスできる
enumerate関数

## enumerate関数
インデックスと要素を同時に取り出すことができる

```
word_ja = ['あ','い','う','え','お']
word_en = ['a','b','c','d','e']

for idx, num in enumerate(zip(word_ja, word_en), start=1):
    ja, en = num
    print(idx, ja, en, nl)

----output----
1 あ a
2 い b
3 う c
4 え d
5 お e
--------------
```
gst-launchとの長き戦い

# はじめに

この記事は自分の甘さを戒めると共に、他の人に`gst-launch`を使う際の覚悟を問うものである。

私が行いたかったことは、`Jetson Nano`という小型のコンピュータに取り付けたUSBカメラの映像を、ネットワーク越しからただ閲覧したかっただけである。それだけの事なのに、大変なことになったので書き留めることにした。

# gst-launchの真実

カメラや動画ファイルを処理したい場合`GStreamer`を使うことができる。GStreamerはライブラリ群とツール群がら構成され、その中の一つである`gst-launch-1.0`というコマンドを使えば様々な処理をプログラミングなしで行うことが可能である。

「プログラミングなしで」という言葉につられて`gst-launch-1.0`を使ってみた人は多いのではないだろうか。`gst-launch-1.0`では引数に様々な処理を連結させることによりパイプラインを実現している。

このパイプラインが複雑で「とりあえず簡単に使ってみたい層」の期待を大きく裏切っているように思う。`gst-launch-1.0`のパイプラインを使って思ったことは「素人には難しい」の一言に尽きる。よくよく考えれば当たり前のことで、簡単に扱えると思った自分が甘すぎたことを反省するばかりである。

## コピペは動かない！

GStreamerほどの歴史があると、インターネットの検索で沢山のサンプルに出会うことができる。正常に動くものもあれば、そうでないものもある。正常に動かない理由は下記のようなものである。

- カメラやマイクのデバイス指定をする部分が異なる
- カメラ独自のエンコーディング機能に頼った部分が含まれている
- 古いプラグインが存在しない
- ある機器固有のプラグインを使っている
- そもそも間違っている(typoとか)

時と場所が変わればパイプラインも変わるのだということを認識せざるを得ない。逆に言えば

「動くコピペ以外に手を出すな！」

と言いたい。あなたがやりたい事は、あなたが思っている以上に奥深く、そして面倒な事の可能性の方が大きい。


## 映像・音声の知識は必須！

まず「gst-launchを使えばプログラミングなしで様々な処理ができる」のは真実である。しかし「様々な処理に必要な知識が不要」という訳ではない。

- 入力となるカメラや動画ファイルについての知識が必要である
- 出力となる動画ファイルやネットワークプロトコルについての知識が必要である
- パイプラインの各要素の組み合わせを調べて正しく接続する必要がある

例えばカメラの場合、どんな形式で映像を出力するのか(YUYV or H264 or MPEG?)、ファイルの場合は映像のコーデックは何で音声のコーデックは何を使っているのか。ネットワークに出力する場合、IPアドレスやプロトコルなどの知識が必要である。

映像の専門家や365日毎日エンコーディングをする「とにかく画質にうるさいツワモノ」でもない限り、こんな知識は普通持ち合わせていない。そんなツワモノであっても一箇所間違えるだけで動かないのである。

## パイプラインも難しい!

上記だけでも大変なのだが、GStreamerのパイプラインの知識が必要である。

- パイプラインの構成要素(ElementやLinkなど)
- 用語(src, sink, pad, etc.)

さらに「パイプラインの記法」が難しい。gst-launch-1.0のパイプラインの記法に関する[公式マニュアル](https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html?gi-language=c#pipeline-description)をざっと読んでみたがとても難しい。主な要因は次の3つ。

- パイプラインの例に解説がない
- スペースがセパレータとして使われ、さらに異なる意味で使われることがあり、可読性が悪い[^1]
- カッコが範囲指定やリストとして使われ区切りの明確化に使用できない[^2]

[^1]: GST_DEBUG_DUMP_DOT_DIR使えばグラフ化できる。
[^2]: Binを活用すれば書けそうではある。

そして恐ろしいのが

- パイプラインの一箇所でも間違えるとうまく動かない

という点である。パイプラインだから当たり前と言えば当たり前だが、問題点が二箇所以上に渡ると原因究明が途端に難しくなる。`gst-launch-1.0`を使えば楽に処理できると考えていたのに、楽をするために死ぬほど勉強するハメになる。

# まとめ

`gst-launch`は決して動画処理の特効薬ではない。心してかかれ！
JavaFX ボタンとラベル

```Main.java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 300, 275));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

```

```Contololler.java

package sample;

import javafx.scene.control.Button;
import javafx.scene.control.Label;

public class Controller {
    public Button btn01;
    public Label lb01;

    public void onButtonClicked() {
        String string;
        string = "Button clicked";

        lb01.setText(string);

    }
}


```

```sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.GridPane?>

<GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
    <Button fx:id="btn01" mnemonicParsing="false" onAction="#onButtonClicked" text="Button" GridPane.columnIndex="1" GridPane.rowIndex="1" />
   <Label fx:id="lb01" prefHeight="17.0" prefWidth="86.0" text="Label" />

</GridPane>

```

Mainでボタンをつけなくてよい

ボタンをおすとラベルがかわる

![btn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236420/719a1ab8-6f21-aa68-f9ee-c55e5b692eea.png)
アジャイル開発におけるユーザーストーリーの分割パターン

# 分割するモチベーション
- 可能な限り小さくリリースして**すぐにフィードバックを得たい**
- 管理可能な大きさにとどめておくことで**マネジメントを容易にしたい**

# 目次
- [業務フロー分割](#業務フロー分割)
- [CRUD分割](#crud分割)
- [IF分割](#if分割)
- [データパターン分割](#データパターン分割)
- [非機能要件分割](#非機能要件分割)

# 業務フロー分割
実際の業務の流れに沿ってユーザーストーリーを詳細化する

**Before:frowning2:**
商品の紹介記事を投稿したい

**After:relaxed:**
記事を作成したい＋記事に対して上司からレビューをもらいたい＋記事に対して法務部からレビューをもらいたい＋記事を公開したい

# CRUD分割
CRUD(Create, Read, Update, Delete)の観点でユーザーストーリーを分割する

**Before:frowning2:**
ブログ機能がほしい

**After:relaxed:**
記事を作成したい＋記事を参照したい＋記事を編集したい＋記事を削除したい＋記事を投稿したい

# IF分割
アプリケーションのインターフェースごとにユーザーストーリーを分割する

**Before:frowning2:**
記事を参照したい

**After:relaxed:**
スマホで記事を参照したい＋PCで記事を参照したい

# データパターン分割
処理対象となるデータのパターンに基づいてユーザーストーリーを分割する

**Before:frowning2:**
記事を投稿したい

**After:relaxed:**
一般公開記事を投稿したい＋限定公開記事を投稿したい

# 非機能要件分割
アプリケーションの機能以外に関する要件について元のユーザーストーリーから切り出す

**Before:frowning2:**
記事を参照したい（受け入れ条件：参照ボタンクリック後5秒以内に描画完了）

**After:relaxed:**
記事を参照したい＋記事をスムーズに参照したい（前述の受け入れ条件）

# 参考
- https://agileforall.com/resources/how-to-split-a-user-story/
- https://www.youtube.com/watch?v=KGpbg4gCLyw
- https://medium.com/the-liberators/10-powerful-strategies-for-breaking-down-user-stories-in-scrum-with-cheatsheet-2cd9aae7d0eb
- https://www.scrum.org/resources/blog/how-teach-scrum-team-split-stories
G検定を受験してみました

#G検定とは
一般社団法人　日本ディープラーニング協会の実施する資格試験です。
2019年7月6日に2019年第二回が実施されました。
概要は[公式HP](https://www.jdla.org/)に掲載されていますが、以下のようになっています。

- 概要：ディープラーニングを事業に活かすための知識を有しているかを検定する
- 受験資格：制限なし
- 試験概要：120分、小問226問の知識問題（多肢選択式）、オンライン実施（自宅受験）
- 出題問題：シラバスより出題
- 受験料： 一般 12,960円 (税込) 学生 5,400円 (税込)


#なぜ受験をしたのか
- 機械学習について体系的に勉強をしたかった
- 今年度の個人目標として資格を取得したかった
の2点です。

#シラバスについて
これも公式HPに全て記載されていますので、大きくまとめると
- 人工知能
- 機械学習
- ディープラーニング
- 法整備関連
となっております。

例題も載っているので、目を通してもらえればなんとなく雰囲気はわかると思います。

#試験に向けての勉強
勉強を始める前までは、体系的に学んだことはなく各知識をつまみ食いしたような状態でした。
そのために公式テキストをまずは最初に読み込みました。
[深層学習教科書 ディープラーニング G検定(ジェネラリスト) 公式テキスト](https://www.shoeisha.co.jp/book/detail/9784798157559)

正直なところ、この本を読んだだけでは表面的な知識のみが身につきます。
読んでも理解できないところが多々あるので、そこは逐一検索して補完する必要があります。
この本を一通り読み終えた後に模擬試験が見つかったので、解いてみたら全く歯が立ちませんでした。

勉強方法を変え、模擬試験を完璧にする方向へとシフトしました。

そして試験前前日に
[AI白書 2019 ](https://www.amazon.co.jp/dp/4049110148/)
を軽く目を通しました。
全部をじっくり読む時間はありませんでしたが、時事関連の内容はこちらを読むのが一番確実に知識得られる思います。

#試験本番
13時からとありますが、12時50分~13時10分ならいつでも始められます。
120分226門ということで、見たことない問題、用語が出たらすぐに検索をするをひたすら繰り返していました。
模擬試験と一語一句同じものもあるので、そこはクリックをするのみでした。
前半部に今年起こったことに関する時事問題が多く出題されたために、途中までは30秒を超えるペースでしか解けずかなり焦りました。
後半部に知識の一問一答が多かったために、そこで時間を挽回することができました。
全体として7割弱くらいの出来だったと思います。

結果が来てからまた試験についての感想や思ったことを書いていきたいと思います。
自分のQiitaにGoogle Analyticsが導入できた件

## 自分のQiitaにGoogle Analyticsが導入できた件
実はQiitaでは自分の記事についてのアクセスを、Google Analyticsで解析することができます。

手順については、この記事をご覧ください。
[QiitaでGoogleアナリティクスを利用する手順](https://qiita.com/Qiita/items/c7f704e3786df3aa7a11)

まさかこのような機能があったとは知らなかったので、驚きました。便利ですね。
この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Sublime TextにJavaScriptのリアルタイム文法チェックをしてくれるSublimeLinter-jshintをインストールする方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - Sublime Text Version 3.2.1

# SublimeLintをインストールする
1. [Package Controlをインストールする](https://qiita.com/ponsuke0531/items/3d06cff74fd0daafddd9#%E3%81%A8%E3%81%AB%E3%81%8B%E3%81%8F%E3%81%AF%E3%81%98%E3%82%81%E3%81%AFpackage-control)
1. Package ControlでSublimeLintをインストールする

# Node.jsをインストールする
[CentOS 7 Node.js のインストール手順 - Qiita](https://qiita.com/daskepon/items/16a77868d38f8e585840)

## 1. リポジトリを追加する

```bash
$ curl -sL https://rpm.nodesource.com/setup_8.x | sudo bash -
## Installing the NodeSource Node.js 8.x LTS Carbon repo...
# 省略
## Run `sudo yum install -y nodejs` to install Node.js 8.x LTS Carbon and npm.
## You may also need development tools to build native addons:
     sudo yum install gcc-c++ make
## To install the Yarn package manager, run:
     curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
     sudo yum install yarn
```

## 2. Node.jsをインストールする
```bash
$ sudo yum install nodejs
Loaded plugins: fastestmirror, ovl
Repository google-chrome is listed more than once in the configuration
# 省略
Installed:
  nodejs.x86_64 2:8.16.0-1nodesource

Complete!
```

## 3. バージョンを確認する
```bash
$ node -v
v8.16.0
```

# jsHintをインストールする
[jsHintとSublimeLinter-jshintを入れるメモ for mac - tweeeetyのぶろぐ的めも](https://tweeeety.hateblo.jp/entry/2017/07/25/221720)

```bash
# インストールする
$ sudo npm install -g jshint
/usr/bin/jshint -> /usr/lib/node_modules/jshint/bin/jshint
+ jshint@2.10.2
added 30 packages from 15 contributors in 1.614s

# バージョンを確認する
$ jshint -v
jshint v2.10.2
```

# SublimeLinter-jshintをインストールする
1. Package Controlで[SublimeLinter-jshint](https://github.com/SublimeLinter/SublimeLinter-jshint/blob/master/README.md)をインストールする
HTML の 文字 に 色 を つける ～CSS color: カラーコード;～

# 目的
- HTMLファイルの文字の色を設定する方法をまとめる

# 押さえるポイント
- 文字の色を変えたい要素をCSSで指定して色を設定する。
- colorプロパティを使用する。
- 色の指定にはカラーコードを用いて指定する。
※カラーコード・・・色を表すRGB値を十六進法で表記した文字列の事  
※カラーコードの見本は[こちら](https://www.colordic.org/)で確認できます。

# 書き方の例(CSS)

``` css
要素の名前かクラス名 {
    /* カラーコードで文字の色を設定する */
    color: カラーコード;
}
```

# より具体的な例
HTMLのh1要素の文字を赤に設定する。

～サンプルコード～

- 下記にHTMLファイルの内容を記載する。

``` html
<h1>おはようございます。</h1>
```

- CSSで上記のHTMLファイルのh1要素の文字の色を赤色にする設定を行う。
- 下記にCSSファイルの内容を記載する。

``` css
h1 {
   color: #ff0000;
}
```
カスタムバリデーションで他のモデルのカラムを使用する

###About
カスタムバリデーションで他のモデルのカラムを使いたい場合の記載方法について記載しています。

###Environment
この記事ではmacbook(unix)にインストールしたruby 2.5.1p57, Rails 5.2.3を使用しています。

#Validationとは
「バリデーション」とは、「検証、実証、認可、妥当性」を意味する英単語
「質的な良し悪し」を判断するのではなく、「システム的な適合不適合」を判断するための言葉

小難しく書きましたが、意図しないデータをDBに登録できない様、バリデーションをかけることが一般的であるそうです。
>(参考文献)
https://career-picks.com/business-yougo/validation/

##カスタムバリデーション
通常、バリデーションは以下の様な形式で設定しますが、複雑なバリデーションを設定したい場合、自作のバリデーション(= カスタムバリデーション)を作成します。

```ruby:通常
class User < ApplicationRecord
  validates :user_id, presence: true
  validates :email, presence: true
end
```

基本的には、以下の様に定義したメソッド名をvalidate に続けて記載することで、設定可能です。

```ruby:カスタムバリデーション
class User < ApplicationRecord
  validates :user_id, presence: true
  validates :email, presence: true
  validate :if_user_does_not_have_nickname

  def if_user_does_not_have_nickname
    return if nickname.present?
    errors.add(:nickname, "Nickname is absent")
  end
end
```

##他のモデルのカラムも組み合わせたい場合
validationを考えていると、他のモデルのカラムを条件として加えたい時があるかと思います。
その様な場合、モデル間でアソシエーションを組むことで他のモデルのカラムを使用することができます。

(例)睡眠時間を記録するアプリ
・日付がデータとして渡されている
・もしユーザの睡眠記録が一つもなければ、睡眠記録の新規作成が可能
・睡眠記録がすでにある場合は、渡されたデータが既存の睡眠記録の最終日付の翌日にマッチしているかどうか調べる
・ミスマッチの場合、渡されたデータを新規登録しない

```ruby:sleep.ruby
class Sleep < ApplicationRecord
  # アソシエーションの設定。読み込み順の関係で、カスタムバリデーションより必ず上に記載してください。
  belongs_to :user
  validates :slept_time, presence: true
  validates :wakeup_time, presence: true
  # カスタムバリデーションの呼び出し(コントローラでnew, createメソッドの場合のみ)
  validate :dates_cannnot_be_registered_if_there_is_no_yesterdays_date, on: [:new, :create]

  # カスタムバリデーションの作成
  def dates_cannnot_be_registered_if_there_is_no_yesterdays_date
    # もし日付があり、ユーザの睡眠記録がない場合は処理を抜ける(= そのまま新規登録する。)
    return if date.present? && user.sleeps.blank?
    # もし日付がユーザの最新の睡眠記録の日付の翌日でない場合は、データを新規登録しない。
    if date != user.sleeps.last.date.tomorrow
      errors.add(:date, "You can't register that there is no data about before days.")
    end
  end
end
```

#最後に
いかがでしょうか。アソシエーションを組めていれば、意外と簡単に実装できてしまいます。
私はbelongs toの記述位置がカスタムバリデーションの下になっていたため、エラーと何時間も格闘する羽目になりましたが...。
参考になれば幸いです！

###筆者について

TECH::EXPERTにて4月よりruby, railsを学習している未経験エンジニアです。
記載内容に不備・不足があればご指摘いただけると幸いです。
至らぬ点ばかりですので、改善点がありましたらどんどんご指摘下さい！
[Oracle] SEND_BUF_SIZEとRECV_BUF_SIZE設定時のWindowサイズの変化


カーネルパラメータ

- net.core.rmem_max
- net.core.wmem_max

と、
sqlnet.ora(またはtnsnames.ora)に指定する以下のオプション

- SEND_BUF_SIZE
- RECV_BUF_SIZE

両方ともTCP受信/送信バッファの最大値を設定するパラメータとあり、SEND_BUF_SIZE/RECV_BUF_SIZEを設定する意義がわからなかったので、検証してみた。

結論からいうと、[SEND|RECV]_BUF_SIZEの設定有無にかかわらずnet.core.[r|w]membmaxを上限にWindowサイズが自動調整された。ただし、[SEND|RECV]_BUF_SIZEを指定した場合は、設定した値までWindowサイズがどんどん増加していく。net.core.[r|w]membmaxのみの場合は、ある程度のサイズで収束する。

# 検証環境
環境1
- OEL 6.10 (UEK4)
- DB 11.2.0.4 (環境2へDBリンク)

環境2
- CentOS 6.10
- DB 11.2.0.4
環境1と環境2の間でDBリンクを張る。環境1と環境2の間のレイテンシ(ping応答時間)は30ms程度
環境1にSQL*Plusでログインし、環境2のテーブルをDBリンクを使用してSelectする。
環境2側で、tcpdumpを取得し、Windowサイズの変化を見る。

# 結果
赤線が設定なし。青線がRECV_BUF_SIZEを1MBに設定。オレンジがRECV_BUF_SIZEを2MBに設定した場合のWindowサイズの変化。RECV_BUF_SIZEを設定した場合は、初期値は一緒だけど、指定した値までどんどん上昇していくのがわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/80ee5235-79d6-688b-df93-65d220196501.png)

windowサイズは、tcpdumpのwin列に2のwscale乗をかけた値で算出。wscaleはスリーウェイ・ハンドシェイクからキャプチャしないと値を取得できないので注意
Oculus Questで物理キーボードを使用する

# はじめに
Oculus Questで文字入力する場合には、通常ソフトウェアキーボードが表示されて入力することになるのですが、あまり入力しやすくはないように思います。
そこで物理キーボードを使えないか調べてみたところ、Bluetoothでキーボード接続を実現されている方がいて、やり方を公開されていました。
[Oculus Quest も文章書き＆開発マシンにする]
(https://wlog.flatlib.jp/?itemid=1878)
(2019/8/7追記)
Oculus Quest Build 7.0アップデート後は、普通に設定メニューからペアリングできるようになったため、上記の手順は不要と思われます(試してはいませんが、メニューに設定項目があることは確認しました)。

Oculus Questをつけた状態では当然キーボードが見えないのですが、自分はブラインドタッチは無理だったので、キーボードのモデルを作って物理キーボードと位置合わせして入力してみました。

#開発環境
Unity 2019.1.9f1
Oculus Integration for Unity - 1.37
TVLauncherGo 1.0
Logicool K380BK Bluetooth ワイヤレス キーボード

# 動作例
キーボードのモデルの位置を、物理キーボードの位置と合わせて・・・
![com.oculus.vrshell-20190708-222938_Trim1_300x300_fps10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/058c8fd4-c06b-fbee-4733-0c7b65014251.gif)

testと入力
![com.oculus.vrshell-20190708-222938_Trim2_300x300_fps10.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215278/3a9dc146-b327-5449-5f67-84b0937d34a8.gif)

全然正しく入力できてません。
位置が微妙にずれているためか、思ったようにキーボードが押せていないです。

# 所感
キーボードのモデルは写真をテクスチャとして張り付けただけですが、VR空間中でのサイズが物理キーボードのサイズと一致するようにする調整が若干面倒でした。後から気が付いたのですが、VR空間内で調整すれば簡単だったかも・・
このままではとても実用に耐えないので、やはりソフトウェアキーボードを使うことになりそうです。

# 補足
キーボードの入力確認に使用したのは以下のコードです。
OVRDebugConsole.Logは通常はログ出力に使うものなので1文字入力ごとに改行されてしまいますが、とりあえず確認には使えるかと。

```C#:OVRDebugConsoleTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OVRDebugConsoleTest : MonoBehaviour
{
    void Update()
    {
        if (Input.inputString != null && Input.inputString != "")
        {
            OVRDebugConsole.Log(Input.inputString);
        }
    }
}
```

# 追記
カメラで手元のキーボードを見えるようにすると、多少操作しやすいような気がします。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ROSを使ってAndroidスマホからカメラ画像をPublish=&gt;OculusQuestで画像をSubscribeして表示してみました。<br>手元のキーボードを見ながら操作しています。 <a href="https://t.co/i7AEpEtnR4">pic.twitter.com/i7AEpEtnR4</a></p>&mdash; 高浜 (@SatoshiTakahama) <a href="https://twitter.com/SatoshiTakahama/status/1232301751178412033?ref_src=twsrc%5Etfw">February 25, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Docker でコンテナ間の通信をする

# 0. はじめに

Dockerの初歩的なところ。


# 1. Dockerでコンテナ間の通信をしたい

別の言い方をすると、別のコンテナに接続したい。
例） GitLabのコンテナを立てたので、devコンテナから git pull したい

# 2. 解決策
ネットワークを作って、通信させたいコンテナを同一ネットワークに接続すればよい。

(1) ネットワークの作成

`docker network create <network名>`

(2) ネットワークにコンテナを追加

`docker network connect <network名> <container1>`
`docker network connect <network名> <container2>`

（3） 各コンテナのipアドレスの確認

`docker network inspection <network名>`

以上です。
tailコマンドでワイルドカードを使用する

# コマンド

```terminal
$ tail *.log
```

- 拡張子が**.log**のファイルをtailコマンドで表示する

## 出力結果

```
$ tail *.log
==> 2019_fuga.log <==
aaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccccc
ddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeee

==> 2019_hoge.log <==
aaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccc
dddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeee
```

- 出力ファイルは、　**==> ファイル名 <==**　のように区切られて表示される
    - **==> ファイル名 <==**　の下に出力されたものが、そのファイルの中身

## その他

- catコマンドでも同様にワイルドカードを使用する事が可能

```terminal
$ cat *.log
aaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbb
ccccccccccccccccccccccccc
ddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeee
aaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccc
dddddddddddddddddddddddddddd
eeeeeeeeeeeeeeeeeeeeeeeeeeee
```

# 参考
- [tailコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-tail)
【Ruby】モジュールについて（ネームスペースの活用）

#はじめに
今回はモジュールによるネームスペース（名前空間）の作成に関してまとめました！

モジュールには様々な用途があります。
主に以下のような用途です。

**・クラスにインスタンスメソッドを追加する(ミックスイン)**
**・クラスにクラスメソッドを追加する(ミックスイン)**
**・クラス名などの重複を防ぐためにネームスペース(名前空間)を作成する**
**・ミックスインせずにモジュール単体としてメソッドを定義**
など。

今回はこれらの機能のうち、上から３つ目のネームスペースに関してのみまとめています。
１つ目及び２つ目の機能（ミックスイン）に関しては別記事にてまとめていますので、ぜひこちらでご覧ください:information_desk_person_tone2:
→　https://qiita.com/tomokichi_ruby/items/b348d7a44928262cc7e4

#ネームスペース(名前空間)とは
**各要素に一意の異なる名前をつけた範囲のこと**です。
また**要素の名前が衝突しても識別できるように、要素の集合に対して付与された名前のこと**。

例えば複数名で同じアプリケーションを作成する場合などは特に、クラス名やメソッド名が被ってしまう危険性があります。
この名前の衝突を防ぐために活用するのがネームスペースであり、モジュールにてこのネームスペースを作ることができます！

#モジュールによるネームスペースの付け方

```test.rb
module Admin
 class User
  #メソッドなど
 end
end

module Guest
 class User
  #メソッドなど
 end
end

```
上記の例では、Userクラスが２つ存在していますが、区別するためにそれぞれAdminとGuestモジュール内に入れています。
このようにモジュール内のクラスを参照する場合は`モジュール名::クラス名`とすればOKです！
例えば、クラスからインスタンスを作成する時は

```test.rb
Guest::User.new
```
このようにするだけです！

#ネームスペースの定義の応用
すでにモジュールが定義されている場合で、そのモジュール内にクラスを追加したい場合は、
以下のように`class モジュール名::クラス名`と宣言することもできます。

```test.rb
module Admin
end

class Admin::User
  #メソッドなど
end

```
#さいごに
ネームスペースについて解説しました！
大規模なプロジェクトになるほど、モジュールによるネームスペースの活用は必要になってきます。
モジュールを有効活用していきたいですね:relaxed:
最後までご覧いただきありがとうございました！
【備忘録】WindowsでPythonファイルを自動実行する

こんばんは、@0yanです。
先日、別の部署の課長から「毎月第1営業日に、Eラーニングの研修受講履歴を送って欲しいのだけど」と依頼を受け、「忘れそうだな・・・」と思ったため、早速、Seleniumで研修受講履歴をダウンロード＆Gmail送信するコードを書き、Windows上で自動実行することにしました（サーバを自由にたてる権限はないため）。
以下、WindowsでPythonファイルを自動実行するための備忘録です。

# 流れ
1.pythonファイルを作成する
2.batファイルを作成する
3.タスクスケジューラに登録する

### batファイルを作成する
任意の場所にbatファイルを作成します。例えば、
- PC123というユーザー名で、PycharmProjects直下のtest.pyを自動実行したい
- Anaconda3フォルダ直下にpython.exeがある
という場合、以下のように記述します。
※batファイルでコメントアウトする際は、シングルクオーテーションを先頭につけます。

```test.bat
'実行したいファイルが格納されているディレクトリの絶対パス
cd C:\Users\PC123\PycharmProjects

'python.exeの絶対パス 実行したいファイル名
C:\Users\PC123\Anaconda3\python.exe test.py
```

### タスクスケジューラに登録する
@Richard_Roe さんの記事が分かり易かったので、そちらに譲ります。
（参考になりました。ありがとうございました！）

>[Windowsでbatファイルを自動実行したい時（タスクスケジューラの設定）](https://qiita.com/Richard_Roe/items/44e16841f16ee40c6113)
JAVAFX コンボボックス

アンカーペインにコンボボックス入れた図

```sample.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.layout.AnchorPane?>

<?import javafx.collections.FXCollections?>
<?import java.lang.String?>
<AnchorPane maxHeight="-Infinity"
            maxWidth="-Infinity"
            minHeight="-Infinity"
            minWidth="-Infinity"
            prefHeight="400.0"
            prefWidth="600.0"
            xmlns:fx="http://javafx.com/fxml/1">
    <ComboBox layoutX="36.0" layoutY="50.0" prefWidth="150.0" >
        <items>
            <FXCollections fx:factory="observableArrayList">
                <String fx:value="項目１" />
                <String fx:value="項目２" />
                <String fx:value="項目３" />
                <String fx:value="項目４" />
                <String fx:value="項目５" />
            </FXCollections>
        </items>
    </ComboBox>
</AnchorPane>

```

FXMLでコンボボックスの中身を書くことができる

![combobox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236420/190829b2-0b42-f926-aff3-f8264514adef.png)
iOSのFIDO対応についての考察

# はじめに
FIDOは2019年に入り、AndroidやWindowsで対応が進む一方iOSやmacOSはそのような話は出てきていなかった。しかし、WWDC2019にてSafariのFIDO対応が発表された。今後のiOSやmacOSでのFIDOの対応について考察をしてみる。

# FIDOとは
- Fast IDentity Online（素早いオンライン認証）の略語
- 従来のパスワード認証に変わる、生態認証ベースの認証技術
- 簡単に説明すると、鍵の作成とサービスへの鍵の登録というフェーズで構成される
- 「鍵」は厳密にはPKIの秘密鍵であり、登録は公開鍵を登録する

# FIDOの何が嬉しいのか？
### メリット
- パスワードを介在しないので、パスワード管理から開放される
- パスワードを介在しないので、総当たり攻撃のリスクが無い
- 接続先が正しいか信頼チェーンによる認証が入るためフィッシングに強い

### デメリット
- 秘密鍵を作成したデバイスを紛失したらログインできなくなる
- １ユーザが複数デバイスを使ってログインしたい場合、その分だけ公開鍵の登録が必要になる

# FIDOの全体像

### FIDO
- UAF　：パスワードの代わりに生体認証を使う方式（モバイルアプリ向け）
- U2F　：PINと生体認証を組み合わせる方式

### FIDO2
- WebAuthn　：JavaScriptによりWebブラウザから生体認証を呼びだす仕組み
- CTAP	　：生体認証が無いデバイスが、生体認証を持つデバイスを利用するためのデバイス間プロトコル

### それぞれの方式の評価

|方式|PIN入力|外部デバイスによる生体認証|サービスへのアクセス方法|
|:-:|:----------:|:-------------------:|:------------------:|
|UAF|不要|NG|専用アプリ|
|U2F|必要|OK|Webブラウザ|
|WebAuthn|不要|NG|Webブラウザ|
|WebAuthn + CTAP|不要|OK|Webブラウザ|

# ブラウザの対応状況 
[IBMの調査](https://community.ibm.com/community/user/security/blogs/philip-nye/2019/05/22/getting-closer-to-fido2-webauthn-adoption)によると各種ブラウザの2019/5/22時点の対応状況は以下の通り

|ブラウザ|U2F|WebAuthn|CTAP|
|:-:|:-:|:-:|:-:|
|Chrome Desktop|対応済|対応済|対応済|
|Chrome Android|対応済|対応済|対応済|
|Firefox|開発中|対応済|対応済|
|Edge|未対応|対応済|対応済|
|Safari macOS|未対応|開発中|開発中|
|Safari iOS|未対応|未対応|未対応|

# WWDC2019での対応公表
WWDC2019のセッション[Whats new in Authentication](https://developer.apple.com/videos/play/wwdc2019/516/)にてmacOS10.15のSafariでFIDOに対応することを公表した。

# yubicoのiOSサポート開始発表
2019年7月に入りセキュリティキー大手の[yubicoがiOSのサポートを開始したと発表](https://support.yubico.com/support/solutions/articles/15000006479-getting-started-on-ios)

2019年9月12日にiOS13よりNFCタグへの情報書き込みができるようになったため、YubikeyのNFC機能がiOSでも使えるようになると[Yubicoが発表](https://www.yubico.com/2019/09/yubico-ios-authentication-expands-to-include-nfc/)した。

YubikeyがiOSで使えるようになったとしてもWebAuthnで使えないとあまり旨みがないのではというところではあるが、~~確認したところiOS13でもSafariとChromeではWebAuthnには対応していない様子。~~ [iOS13.3のリリースノート](https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_3_release_notes)によると、iOS13.3よりSafariがFIDO2に対応するようになるとのこと。

唯一BraveブラウザというものだけWebauthnに対応しており、iOSデバイスでもWebAuthnが動作することを確認した。
※ただし現状ではライトニング形式に対応したYubikeyを使うことになる
![capture.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200963/0d3bd9d1-206b-1a59-2b33-950c1c22a604.jpeg)


# iOSとmacOSの今後についての考察
macOS10.15でFIDOの対応が発表され、yubicoもiOSをサポートすることを発表した~~ため、近い将来iOSでもU2FとWebAuthnが利用できるようになる可能性が高い~~。前述の通り、既にiOSでもブラウザは限定されるがWebAuthnの利用は可能。しかし、AndroidのようにOS標準としてiOSでCTAPが使えるようになるのかは不明。

12/5に行われたFIDOアライアンス東京セミナーでのKDDIの発表にて、FIDO活用事例としてiPhoneをBLEのCTAPで認証器化してPC側の認証を行うという社内向けアプリを紹介していた。そのため、いま現在技術的にはiPhoneを認証器化することは可能な様子。

また、Googleの取組みとして **caBLE** というBLEでAndroidでもiOSでも生体認証機器がついているデバイスをFIDOの認証器化する仕組みを現在構築しているということも紹介されていた。


# iOSをCTAPを使って認証器化する方法
[CTAPのプロトコル仕様](https://fidoalliance.org/specs/fido-v2.0-ps-20190130/fido-client-to-authenticator-protocol-v2.0-ps-20190130.html)に沿って実装を行えば現時点でiPhoneを認証器化することは可能。

作成したアプリが正しく動くか確認するためのドライバが必要になるが、公式に用意されている[Conformance Tool](https://fidoalliance.org/certification/functional-certification/conformance/)が利用できる。
※利用するためには申請が必要

作成したアプリをAppStoreで一般公開できるかについては不明。
deviseでユーザー認証をしよう

#deviseでカラムを追加して、ログイン機能を実装するには・・・

##userモデルを作成するところまではこちら
https://qiita.com/mokku/private/aa4191817369edb269fb
最低限のログインページ実装は上で完了しています。


##deviseのビューを生成する


```
$ rails g devise:views
Running via Spring preloader in process 5927
      invoke  Devise::Generators::SharedViewsGenerator
      create    app/views/devise/shared
      create    app/views/devise/shared/_error_messages.html.erb
      create    app/views/devise/shared/_links.html.erb
      invoke  form_for
      create    app/views/devise/confirmations
      create    app/views/devise/confirmations/new.html.erb
      create    app/views/devise/passwords
      create    app/views/devise/passwords/edit.html.erb
      create    app/views/devise/passwords/new.html.erb
      create    app/views/devise/registrations
      create    app/views/devise/registrations/edit.html.erb
      create    app/views/devise/registrations/new.html.erb
      create    app/views/devise/sessions
      create    app/views/devise/sessions/new.html.erb
      create    app/views/devise/unlocks
      create    app/views/devise/unlocks/new.html.erb
      invoke  erb
      create    app/views/devise/mailer
      create    app/views/devise/mailer/confirmation_instructions.html.erb
      create    app/views/devise/mailer/email_changed.html.erb
      create    app/views/devise/mailer/password_change.html.erb
      create    app/views/devise/mailer/reset_password_instructions.html.erb
      create    app/views/devise/mailer/unlock_instructions.html.erb
```

##ビューファイルの編集を行う
今回は、追加でニックネームを入力してもらいたいのでニックネームの入力欄を追加します。
※一旦、仮で反映させておきます。


```ruby:new.html.erb
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  <%= render "devise/shared/error_messages", resource: resource %>

  <div class="field">
    <%= f.label :nickname %><br />
    <%= f.text_field :nickname, autofocus: true, autocomplete: "email" %>
  </div>

```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397779/ca8df51b-a26d-2b9e-74a6-e1b1d5032f71.png)

ニックネーム入力欄ができました。


##コントローラを作成しよう

ターミナルで下記コマンドを入力してコントローラを作成する

```
$ rails g controller [コントローラ名]
$ rails g controller users
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397779/d54fe13b-04d2-8e0f-736e-49d211adad78.png)











##参考
deviseのビューファイル
https://qiita.com/yasuno0327/items/ff17ddb6a4167fc6b471
Cygwinでc++ファイルをコマンドライン引数を指定して実行する

##実行環境
実行にはwindows10でcygwin64 terminalを使っています。

##やってみる
今回は~/lesson11/src内のtrain.cppファイルを例に実行します。
train.cppファイルの中身は以下のようになっています。このプログラムはプログラム名と仮引数を表示するというものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/1cc899fd-5a7c-6901-267f-29dd6c34f216.png)
メイン関数の引数であるargcとargvはそれぞれargument_countとargument_vectorの略です。
・argc
  メイン関数にプログラム名と仮引数と合わせた個数を渡します。
・argv
  char*へのポインタで配列の最初の文字列であるargv[0]を指します。

-----------------------------------------------------------------
まず、実行したいファイルがある場所に移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/abefe237-7d9d-133f-30c1-49795b8cb4f7.png)

g++ [ファイル名]と打ち込んでコンパイルします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/c98144b6-1d81-4042-f350-17852fa18992.png)
すると、ディレクトリ内にa.exeというファイルが生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/b6a5eaf0-5bbe-1abc-0242-9adc27c58259.png)
コンパイルされたファイルは./a.exeと叩くと実行できますが、今回はコマンドライン引数を指定するので./a.exeの後に引数を加えて実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440828/b13d9434-c130-f976-251a-4688dfbdbe6b.png)
表示することができました。

##参考文献
-[新明解　c++入門](https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3C-%E5%85%A5%E9%96%80%E7%B7%A8-%E6%98%8E%E8%A7%A3%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/4797394633/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E6%96%B0%E6%98%8E%E8%A7%A3c%2B%2B&qid=1562593625&s=gateway&sr=8-1)
HTML で 画像 を 表示 する ～HTML <img src="表示させたい画像のURLかファイルパス">～

# 目的
- HTMLで画像を表示する方法をまとめる。

# 押さえるポイント
- imgタグを用いる。  
- imgタグのsrc属性によって表示させる画像を指定する。
- 画像の指定にはURLかファイルパスを用いる。


# 書き方の例

``` html
<img src="表示させたい画像のURLかファイルパス">
```

# 注意するポイント
- imgタグではテキストをタグで囲む事がないため、終了タグが必要ない。
- 多くの属性が存在しており、画像の名前を指定することで画像検索などで表示させ安くすることも可能。
- 画像のサイズの変更も可能
- ローカル作成環境などで、ローカルの画像を表示したいときは相対パス(表示させたいHTMLファイルからの相対的なファイルパスの記載方法)を用いて画像を指定する。
※属性に関しては別記事でまとめます。  
※画像サイズの変更に関しては別の記事でまとめます。

# 具体的な例
- HTMLの画面に画像を表示する。
- ウェブの表示画像はフリー画像サイト「いらすとや」にある[ネオンテトラ](https://1.bp.blogspot.com/-PjZz2WJ1Zj0/VMIvCILIJzI/AAAAAAAAq2w/bmdFdi5l4Z4/s800/fish_neontetra.png)とする。
- ローカルの画像表示はhtmlファイルと同じ階層に「photo」フォルダを作成しその中に存在する「sumida_aquarium_1.JPEG」ファイルとする
※ローカル画像ファイルの場所が言葉のみだと分かりにくいため下記にフォルダ構成をまとめる。  

```
# HTMLファイルが設置してあるフォルダ内の構成

HTMLファイル
photoフォルダ
    ┗sumida_aquarium_1.JPEG
```


～サンプルコード～

```html
<!-- ウェブの表示画像 -->
<img src="https://1.bp.blogspot.com/-PjZz2WJ1Zj0/VMIvCILIJzI/AAAAAAAAq2w/bmdFdi5l4Z4/s800/fish_neontetra.png">

<!-- ローカルの表示画像 -->
<img src="./photo/sumida_aquarium_1.JPEG">
```

～プレビュー画面～
ウェブの表示画像
<img src="https://1.bp.blogspot.com/-PjZz2WJ1Zj0/VMIvCILIJzI/AAAAAAAAq2w/bmdFdi5l4Z4/s800/fish_neontetra.png">

ローカルの表示画像
![sumida_aquarium_1.JPEG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f0c2f0b3-8150-fdcd-51e8-ca283f52708e.jpeg)
Leetcode #905: Sort Array By Parity

```swift
func sortArrayByParity(_ A: [Int]) -> [Int] {
    var oddArray = [Int]()
    var evenArray = [Int]()
    for num in A {
        if num % 2 == 0 {
            evenArray.append(num)
        } else {
            oddArray.append(num)
        }
    }
    return evenArray + oddArray
}
```
GitHub Desktopを用いたローカルリポジトリへの追加とリモートリポジトリの作成手順


#GitHub Desktopを用いたローカルリポジトリへの追加とリモートリポジトリの作成手順

ローカルにあるアプリを**GitHub Desktop**を用いて、
「ローカルリポジトリへ追加」、「リモートリポジトリ」する手順をまとめました。

流れを大きく分けると
**ローカルリポジトリの追加**　**→**　**リモートリポジトリの作成**
となります。

##ローカルリポジトリの追加
###１、左上の「Current Repository」をクリック
<img width="1280" alt="スクリーンショット 2019-07-08 21.53.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/0d5167af-658f-52c4-0576-0c777696e226.png">

###2、「Add」→「Add Exsiting Repository」をクリック
<img width="1280" alt="スクリーンショット 2019-07-08 21.56.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/837f2bba-4bd2-89a6-510e-1e531add45d9.png">

###3、下記の画面が表示されるので、アプリが格納されているディレクトリを指定し、「Add Repository」をクリック
※今回は「〜/github-sample」 を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/cadc25b2-92eb-06be-fc64-5bbecaea6b10.png)
**↓**
<img width="1280" alt="スクリーンショット 2019-07-08 22.08.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/ba864b0c-0a27-b09a-d36a-519f109bb955.png">

###4、①コメントを追加し、②「Commit to master」をクリック
<img width="1280" alt="スクリーンショット 2019-07-08 22.11.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/388e4cf1-df1f-643e-101f-7dfb72030da0.png">

###5、下記の画面になり、ローカルリポジトリの作成は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/4414235a-bdce-a213-c6fd-b4aae3f78528.png)

##リモートリポジトリの作成
続いてリモートリポジトリの作成手順です。
###1、ローカルリポジトリ作成後に表示されている画面の右上の「Publish repository」をクリックします。
<img width="1280" alt="スクリーンショット 2019-07-08 22.21.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/99e18e15-6b6e-19a7-342a-edaa0827f64c.png">

###２、下記のようなモーダルが表示されるので、「Publish　Repository」をクリックすると、リモートリポジトリーが作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407247/9a28970b-4527-76de-cabc-9956cada6f6b.png)
railsの基礎知識　※自分メモ用

#Rails学習コース

modelとApplication Record
Postモデル

rails g modelによってPostモデルが定義された「post.rb」app/modelsに作成

◎ターミナル◎

Post＝モデル名
content=カラム名
:text=データ名

>　rails g model Post content:text

そして、このコマンドによって、以下の2つのファイルが作成される。 
・app/modelsフォルダにモデルが定義されたファイル
・db/migrateフォルダにマイグレーションファイル

◎ターミナル◎

>rails cosole


```ex)text = "Hello"```


##テーブルに投稿データの保存

posts テーブルにデータを追加するには下の図のように、
① new メソッドで Post モデルのインスタンスを作成
② posts テーブルに保存
これら2つの手順を行っていく。

![スクリーンショット 2019-07-08 21.30.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435981/726c3c1c-0ce3-7606-dc77-47b28c086734.png)

◎具体的なコマンド↓↓↓

```
post1 = Post.new(content: "ライオン")　新しいの生成
post1.save　セーブする
```


###1、テーブルからデータを取り出す方法###

①テーブルからデータを1つ取り出す
②contentカラムの値を取り出す
→「Post.first」で取得したデータから投稿内容を取得することができる

```
①post = Post.first
②post.content
```

####2、テーブルからデータを取り出す方法####

↓↓テーブルからすべてのデータを取り出す方法↓↓

```
posts = Post.all
```

※「Post.all」では、テーブルにある全てのデータが配列で取得できる

↓↓投稿の配列から１つのデータを取り出す方法↓↓

```
Post.all [0] 
```

※Post.all [0] のように、インデックス番号で1つの要素を取得できる

↓↓配列のデータから投稿内容を取り出す方法↓↓

```
Post.all[0].content
```

rails consoleまとめ

>データの作成(new,save)
>データ取得(Post.all,post.content..etc)
STM32CubeIDEで学ぶFreeRTOS (1) - シグナルイベント（イベントフラグ）

[前回記事](https://qiita.com/imagou/items/8af2ad999b2a80009c6f)では、ひとまずFreeRTOSを動かしてみる、までやってみました。

今回（から）は、**FreeRTOSの主要機能を体験**してみたいと思います。

# はじめに

## CMSIS-RTOS

当初、動作確認においては、FreeRTOSのI/Fをまんま使おうかと思っていました。

がしかし、STM32CubeIDEの生成コードを見るに、CMSIS I/Fでラップしている模様です。
郷に入りては、、、で、そいつに従うこととします。仕様は以下。

**Function Overview**
http://www.keil.com/pack/doc/CMSIS/RTOS/html/functionOverview.html

## 機能を選ぶ

RTOSといえばタスク間通信、タスク間通信で最も簡単なものといえば、イベントフラグでしょう。

前述CMSISによれば、こいつを**「シグナルイベント」**と呼ぶらしいです。今回はそれを紹介します。

# 本編

## 1. 環境

[前回記事](https://qiita.com/imagou/items/8af2ad999b2a80009c6f)と同じです。
**なお、FreeRTOSの有効化やタスク追加等はこの記事に倣っていますので、いったんは試してみることをお勧めします。**

- IDE: [STM32CubeIDE](https://www.st.com/ja/development-tools/stm32cubeide.html)
- 評価用ボード: [STM32L4 Discovery kit IoT node](https://www.st.com/ja/evaluation-tools/b-l475e-iot01a.html) - 型番はB-L475E-IOT01A

## 2. やってみよう！

実現仕様は以下。**地味に高機能です。**

1. [UART受信を割り込みで受ける](#2-1-usart割り込み有効化)
1. [割り込みで受信した旨をタスクにイベント通知](#2-2-割り込み実装)
1. [イベントを受けたタスクは、単にエコーバック](#2-3-タスク実装)

### 2-1. U(S)ART割り込み有効化

「Device Configuration Tool」（iocファイルが開いた状態）の左側、「Categories」から「Connectivity」-「USART1」を選びます。
その後、「NVIC Settings」タブで、割り込みを有効化します。
![SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-8_14-51-34_No-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447304/7594b2d2-3946-7309-8c07-ded48d02ce13.png)

設定変更したので、コード生成も忘れずに！

### 2-2. 割り込み実装

main.cの上部、「/* USER CODE BEGIN 0 */」の箇所を以下とします。

```c
/* USER CODE BEGIN 0 */
uint8_t g_RxData;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  /* Re-Initialize Rx */
  HAL_UART_Receive_IT(&huart1, &g_RxData, 1);
  /* Set Signal */
  osSignalSet(myTask02Handle, 1);
}

/* USER CODE END 0 */
```

### 2-3. タスク実装

ユーザータスクを以下とします。

```c
  /* USER CODE BEGIN StartTask02 */
  /* Initlize Rx */
  HAL_UART_Receive_IT(&huart1, &g_RxData, 1);
  /* Infinite loop */
  for(;;)
  {
    /* Wait Signal */
    osSignalWait(1, osWaitForever);
    /* Echo Back */
    HAL_UART_Transmit_IT(&huart1, &g_RxData, 1);
    osDelay(1);
  }
  /* USER CODE END StartTask02 */
```

### 2-4. 動かしてみる

Tera Termで動作確認しましたが、無事入力した文字がエコーバックされています（雑）！

## 3. かんたんな解説

[実現仕様](#2-やってみよう)とコメント、実動作の通りです、、、というのはさすがに雑過ぎますね。笑

### 3-1. シグナルイベント（イベントフラグ）とは

シグナルイベント（イベントフラグ）は、名前通りイベント（＝何かあったよ！）を通知する仕組みです。
本例でのイベントとは、**「受信したことをタスクに伝える」**です。

```c
  /* Set Signal */
  osSignalSet(myTask02Handle, 1);
```

でイベントを設定しています。第一パラメータはタスクハンドル（タスクを指し示す番号）。

```c
    /* Wait Signal */
    osSignalWait(1, osWaitForever);
```

でイベントを待ち合わせています。第二パラメータは「無限に待つよ」という意味です。
ともに存在するパラメータ「1」は、イベントを指し示すビットです。

参考までに、CMSIS仕様は以下です。

**Signal Events**
http://www.keil.com/pack/doc/CMSIS/RTOS/html/group__CMSIS__RTOS__SignalMgmt.html

### 3-2. U(S)ART受信割り込み

最初に以下呼び出しをしないと、受信割り込みが上がりません。
また、割り込みハンドラで再度呼び出さないと、以降の割り込みが上がりません。よって複数個所に記載しています。

```c
  HAL_UART_Receive_IT(&huart1, &g_RxData, 1);
```

パラメータは「1byte受信したら割り込みを上げなさいよ」としています。

### 3-3. 問題点

タスク（イベント受信側）で受信データを吸い上げていますが、タイミング的に遅い可能性があります。

本来は、割り込みで速やかに受信データを退避してから、何らかの手段でタスクに通知すべきでしょう（と次回記事への伏線を書いてみました）。

# おわりに

uITRONなどと比べると、断然シンプルでわかりやすく、使いやすいと思います！

次回もタスク間通信、メッセージあたりの記事を書く予定。
深層学習前編2 修了課題 (現場で潰しが効くディープラーニング講座)

# 修了課題
- irisデータセットを使い、花の種類を分類するニューラルネットワークを作る
- 構成は入力層を4ノード、中間層を5ノード(活性化関数はReLU関数)、出力層をソフトマックス関数を使い、誤差関数は交差エントロピーで行う
![無題19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/ede10027-567f-8cbb-dc37-d3ff8e1e7649.png)

![無題20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/a8b7f296-2792-0c2f-3f38-d8329b3be98c.png)
![無題21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/7c42e90b-99a8-23a5-b13c-f8ee69a4170f.png)
![無題22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/03ca888a-468c-1d69-1e93-b3a80f897110.png)
![無題23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440745/2ffd5cea-11cf-e62c-d71a-966ba98c3ebe.png)

##### 結果
- 重みの初期値をHeで決め、学習率最適化手法としてAdaGradを使用。
- 少し過学習を起こしている。ドロップアウト率やL2正則化の係数を増やすなどをしたが、過学習の抑制と高い予測精度の両立はできなかった

##### 修了課題
- Q1.課題の目的とは?どのような工夫ができそうか
    - 課題の目的は、がくの長さ、がくの幅、花弁の長さ、花弁の幅の4つの入力データから3種類の花のうち、どの種類の花なのかを予測すること
    - データ数が150個と少ないので、誤りがない範囲で4つの入力データを操作し学習データを増やせば予測精度が高くなると考える

- Q2.課題を分類タスクで解く場合の意味は何か
    - 回帰タスクで解くと、花の種類を表す0,1,2を連続した数値として学習する。分類タスクで解くと0,1,2の値をカテゴリを表す値として学習することができる

- Q3.irisデータとは何か2行で述べよ
    - がくの長さ、がくの幅、花弁の長さ、花弁の幅の4つの数値とそれに対する花の種類から構成されているデータ
excelの全てのシートを書き出しtsvで出力するvbs

excelファイルからデータをテキストファイルにタブ区切りで取り出すスクリプトです。いろんなところの継ぎはぎでできています。
ローカルに保存しておくよりはここで供養。というかもうVB書きたくない。

## 使い方
読み込むexcelファイルを閉じ、最初の行に読み込むexcelファイルの名前に変えて適当な同じディレクトリに保存するか、３行目の変数に絶対パスで入れちゃってください。vbsがあるディレクトリにシート.txtの形でテキストが出力されます。終わると正常終了というダイアログが出るので、それまでそのテキストは開かないでください。
区切り文字を変えればほかの形式も可能です。
貧相なマシンでも、詰め込まれたexcelファイルでも動くように非表示にしています。動いているかどうかはタスクマネージャーを見てexcelのプロセスが仕事してるかどうかを見てください。Windows95, 98, Meという試された環境では確認できません。ごめんなさい。

## ソース
```vb:吸出し.vbs
Dim ExcelFile: ExcelFile = "test.xlsx"
Dim Delimiter: Delimiter = vbTab
Dim Path: Path = CreateObject("WScript.Shell").CurrentDirectory & "\" & ExcelFile
Dim objXls, objWorkbook
Set stream = CreateObject("ADODB.Stream")
    stream.Charset = "UTF-8"
Set objXls = CreateObject("Excel.Application")
If objXls Is Nothing Then 
    WScript.Echo "起動失敗。。。終了します。"
    WScript.Quit
End If
objXls.Application.Visible = False

Set objWorkbook = objXls.Workbooks.Open(Path)
For i = 1 To objWorkbook.Sheets.Count
    stream.Open
    Set objWorksheet = objWorkbook.Sheets(i)
    If objWorksheet.Visible = False Then
        objWorksheet.Visible = True
    End If
    Set objRange = objWorksheet.UsedRange
    If Err.Number > 0 Then
        WScript.Echo "Open Error"
    Else
        For intR = 1 To objRange.Rows.Count
            For intC = 1 To objRange.Columns.Count
                stream.WriteText objRange(intR, intC).Text & Delimiter, 0
            Next
            stream.WriteText vbCrLf, 0
        Next
        stream.SaveToFile objWorksheet.Name & ".txt", 2
    End If
    stream.Close
Next
objXls.Application.DisplayAlerts = False
objWorkbook.Close
objXls.Quit
Set objWorkbook = Nothing
Set objXls = Nothing
WScript.Echo "正常終了"

```
iPadのWifiがたまに切れる機種がある場合の対処

#iPadのWifiモデルを使用していると、同じ機種、環境下でもたまにWifiが切れる機種がある。

##環境
iPad Air2 Wi-fiモデル

##手順
システムサービスの「Wi-Fiネットワーク」を オフ にする
設定→プライバシー→位置情報サービス→システムサービス→Wi-fiネットワークを
オンからオフに変更する。

この方法にたどり着かず、色々な方法を試して半日ほどつぶした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/bbfebd9c-b367-06bc-ccb6-f0ff9658413e.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/d8f941c2-d0c2-bae7-7f8a-4a80d627c9ae.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399986/ade04aef-9fa7-44d3-fb52-a26667e0fe55.png)