OmniAICreator/Qiita-1.07M huggingface dataset:
機械学習の流れ(kagglelを例に)

# 機械学習とは
データを入力すると、データを出力する数式をモデルと呼ぶ。
-　モデルは原形を持っているが、学習データを元にパラメータが決まる。
　例　y = ax +b という式の原形は決まっているが、aとbはパラメータで「学習」で調整される。
　y を目的変数、xを説明変数と呼ぶ。

- 出力された値を元に「分類」や「値の予測（=回帰）」を行う。
　例　出力値を予測値として使う。10以上だったら「正」と判定する。


# 機械学習プログラムの手順

kaggleを例に手順を説明します。

## データ読込み

CSVファイル等からデータを読み込みます。

## EDA(探索的データ解析:Exploratory data analysis)

データの傾向を掴みます。（これにより、どの変数を使うか等を考えます。）
matplotlib,seaborn,pandas等を使います。

- データの分布はどうなっているか？
- データはどのような種類の値をとるか？
- 外れ値がないか？
- 欠損値（NULL）の値はないか？
- 変数間の相関はないか？（使わなくてよい変数はないか？）
- 目的変数の正解ラベルの分布はどうなっているか？

## 前処理

Pandasを使って、使用するデータを加工します。

- 外れ値　外れ値がある場合は除外します。
- 正規化  モデルによっては、0～1の間に変数の値が収まるように正規化した方がよい。（線形回帰など） 　
- カテゴリー変数の数値化　数値への変換、または、One-Hotベクトル化する。使用するモデルによっては必要ない。
- 欠損値補完　欠損値がある場合、最大値や最頻値等で補完する。（あえて補完しない。補完する値も予測する等ある。）


## モデル作成
モデルを作成します。
モデルの複雑度が上がるほど精度が上がるが、過学習しやすくなります。
単純なモデルほど解釈がしやすいです。

■分類
・ロジスティク回帰
・ニューラルネットワーク
・決定木
・決定木系（/Random Forest/XGboost/CatBoost/LightGBM)

■回帰系
・線形回帰モデル
・決定木系（Random Forest/XGboost/CatBoost/LightGBM)

## チューニング
モデルのハイパーパラメータをチューニングします。（グリッドサーチ等の方法がある。）
例：決定木の木の数、深さ


## 検証

モデルが過学習を起こしていないか確認するため、学習データから検証用のデータを作成して評価します。
- ホールドアウト法
- 交差検証法

## 評価

評価指標には以下のようなものがあります。

分類・・・Accuracy（正解率）、AUC(偽陽性率、真陽性率を考慮)
回帰・・・RMSE(平均平方二乗誤差：Root Mean Square Error)

## 採択

モデルを採択します。（精度がよい。分かりやすい等の基準で選びます。）


## 備考

````
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

le.fit(train["Sex"])
train["Sex"] = le.transform(train["Sex"])
test["Sex"] = le.transform(test["Sex"])
```

```
le2 = LabelEncoder()
le2.fit(train["Embarked"])
train["Embarked"]  = le2.transform(train["Embarked"])
test["Embarked"]  = le2.transform(test["Embarked"])
```
file_put_contents(): Exclusive locks are not supported for this stream, Laravelを Mac OS Xにインストールした際のエラー対応方法

Laravelをインストール後、サイトにアクセスした際、file_put_contentsエラーが出たので、その対応方法は、
filename.phpの下記の記述を変更すると治る

これから
```return file_put_contents($path, $contents, $lock ? LOCK_EX : 0);```
これへ
```return file_put_contents($path, $contents, $lock ? LOCK_SH : 0);```
でなおります。
リソースのフルルーティング 

#resources : pohtos
この記述により、アプリケーション内に以下7つのルーティングが作成される。
*いづれもPhotsコントローラに対応付けられる。

#７つのルーティング
☆HTTP動詞 / パス / コントローラ#アクション
GET/photos/photos#index　　　　　
GET/photos/photos#new
POST/photos/phots#create
GET/photos/photos#show
GET/photos/photos#edit
PATCH_PUT /photos/photos#update
DELETE/photos/photos#destroy
VBA ディレクトリ内のデータ一括読み込み→セル出力　集計値作成

## 案件
研究報告書の特定のセルに研究データ保存
セル内容：１月の検体数　○個
ファイル名　１月の検体数.xlsx　
表題のように一括でデータ取得し
合計値を算出

##　コード(とりあえず動く形)

Sub main()
    'ディレクトリ内読み込み
    Dim dstSheet As Worksheet
    Set dstSheet = ThisWorkbook.Worksheets(1)
    Const Path As String = "D:\testReadVba\"
    Dim buf As String
    buf = Dir(Path & "*.xlsx")
    Dim i As Long
    Do While buf <> ""
        i = i + 1
        Dim srcBook As Workbook
        Set srcBook = Workbooks.Open(Path + buf)
        Dim srcSheet As Worksheet
        Set srcSheet = srcBook.Worksheets(1)
        dstSheet.Cells(i, 1).Value = buf
        dstSheet.Cells(i, 2).Value = srcSheet.Cells(1, 1)
        srcBook.Close False
        buf = Dir()
    Loop
    '合計値出力
    Dim r As Long
    r = Range("B1").End(xlDown).Row + 1
    Range("A" & r) = "合計"
    With Range("B" & r)
    .Formula = "=SUM(B1:B" & (r - 1) & " )"
    .AutoFill Destination:=.Resize(1, 2)
    End With
End Sub
プライベートな Vagrant に ngrok でアクセスする

```
% ngrok http --region=ap -host-header=rewrite example.local:80 
```

[Rewriting the Host header](https://ngrok.com/docs#http-host-header)


## 前提条件

Vagrant のネットワークは private で IP 指定

```ruby:Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"
```
hosts 設定済み

```shell:/etc/hosts
192.168.33.10  example.local
```


## 環境

```
% sw_vers 
ProductName:    Mac OS X
ProductVersion: 10.14.5
BuildVersion:   18F132

% vagrant -v
Vagrant 2.2.4

% VBoxManage -v      
6.0.8r130520
```
【Salesforce】G-Connector for Salesforceの使用方法【一括処理】

今回はスプレッドシートでSalesforceを一括処理が行える魔法のツールの紹介です。
その名も「G-Connector for Salesforce」

# 使用手順

## G-Connector for Salesforceの取得
<img width="481" alt="アドオンクリック.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/f7602997-6ea2-3712-c0e6-fdc260a6b5b8.png">
スプレッドシートのアドオンをクリックします。


<img width="530" alt="アドオンを取得.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/ffa82974-b410-926c-edd4-a79fefe2e384.png">
アドオンを取得をクリックします。

<img width="808" alt="G-Con取得.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/be696ad9-15ef-0ae0-b4c9-e580071a9360.png">
1. 右上の検索ボックスに「g-connect」を入力します。
2. 「G-Connector for Salesforce」の無料ボタンを押します。

これで「G-Connector for Salesforce」の追加は完了です！

## Salesforceへログイン
<img width="730" alt="ログインクリック.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/a8f79fda-61ad-60fe-b81c-e46e380eec91.png">
1. スプレッドシートのアドオンにG-Connectorの項目がありますのでクリックします。
2. Login to Productionをクリックします。

<img width="435" alt="Loginクリック.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/6f785ad5-c1b8-d224-017f-843933129502.png">
Loginボタンをクリックします。

<img width="1169" alt="ログイン完了.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/80362def-7371-e594-d745-b790256475f5.png">
この画面が出たらログイン完了です。
このタブは閉じてOKです！

## SOQLの実行
<img width="858" alt="SOQL入力画面展開.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/3819d61c-3083-91b3-577d-bd8b183713fc.png">
アドオンからGet Data Using SOQLをクリックします。

<img width="735" alt="SOQL文入力.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/7e42e65c-a000-d5be-ecdb-69b8d22b9bf4.png">
このような画面が開きますので、赤枠内にSOQL文を入力し、Get Dataボタンクリックでシート出力されます。
出力先シートはPut toのラジオボタンで選択できます。

・New sheet→新規シートへ出力される
・Active sheet→現在アクティブなシートへ出力される(**入力中のデータも全て上書きされるので注意**)


【参考サイト】
https://www.sunbit.co.jp/blog/2018/02/21708/

---

ちなみにSELECT文の入力は可能なのですが、UPDATEやINSERTは有料プランに課金する必要があります😇
データの更新を行う場合はdata loaderを使用した方が安上がりです😊

data loaderについてはこちらから↓
[【Salesforce】DataLoaderの使用方法【登録・削除・更新】](https://qiita.com/SyogoSuganoya/items/f8bd8dcc2e7357a30478)
Pythonにおける繰り返しの手法 : for文

# 目的
Pythonの基本文法を得ること(初心者向け)

# 内容
Pythonにおける繰り返しの手法

# for文の記法
```python:
for 繰り返し変数 in シーケンス:
  ループ内で実行するブロック
```
- **繰り返し変数** : シーケンスの要素が、１つずつ繰り返し変数に代入される。
- **シーケンス** : 簡単に言えば、リストや複数の文字から構成された文字列のこと。
- **ループ内で実行するブロック** : 特定の条件で実行するコードの範囲。

# 実装
```python:member.py
mcz = ['たなか', 'すずき', 'さとう', 'たかはし', 'こばやし']
for member in mcz:
  print(member)
```
- 1行目 : 変数 mcz に5人分の名前が入ったリストを代入する。
- 2行目 : ループが回るたび、繰り返し変数にリストの要素が1つずつ代入される。
- 3行目 : 繰り返し変数を表示するという処理を、リストの要素分だけ繰り返し、その結果、リストの要素が1つずつ画面に表示されていく。

# 結果
```
たなか
すずき
さとう
たかはし
こばやし
```
何も問題がなければ、以下の行が表示されます。
エラーが起きていた場合は、「for文で始まる行の最後に**コロン(:)**がない」
「ブロックに**インデント**がない」「スペルミス」などの理由があげられます。

# 補足
ループが終わった後、**for文**に添えたリストはどうなっているのか。
リストの内容を表示して確認してみましょう。

```python:member.py
mcz
```
**実行結果は。。。**

```
['たなか', 'すずき', 'さとう', 'たかはし', 'こばやし']
```
**for文**に添えたリストには、特に変化はないようです。
ループでは、リストの要素を1つずつ抜き出しているようにも見えます。
しかし実際は、要素を1つずつ、繰り返し変数に代入しているだけなのです。
そのため、for文に添えたリストの内容は変化しません。
【Salesforce】DataLoaderの使用方法【登録・削除・更新】

SalesforceをCSV形式でデータの登録から削除まで行えるツール
「DataLoader」の紹介です。


## DataLoaderのインストール

<img width="442" alt="設定クリック.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/9c7f7eed-103f-1a8e-a639-ed7df863ff7e.png">
<img width="171" alt="設定データローダ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/5e039e8f-65cd-5839-7b67-a774d2d56eff.png">
1. Salesforceの設定をクリックをします。
2. 左上のクイック検索に「データローダ」と入力します。
3. データローダをクリックします

<img width="1043" alt="ダウンロードリンク.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/43297c7f-d539-e08b-5e29-050b199ff90d.png">
使用しているOSのダウンロードリンクをクリックします。
ZIPファイルがダウンロードされますので、展開します。

これでインストールの完了です。

## インストールする前に
DataLoaderは、Javaを使用しますのでお使いのPCにJavaが入っていない場合こちら↓を参考にJavaをダウンロードしてください。

[初心者のためのJavaのダウンロードとインストール方法(失敗の対応も解説)](https://www.sejuku.net/blog/20017)


## 使用方法(ログイン編)
<img width="90" alt="アイコン.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/6c247a45-1a6c-851c-8041-bc463ef73e89.png">
DataLoaderのアイコンをクリックします。

<img width="818" alt="アップデートクリック.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/1b06fccf-363d-a660-154b-1577ec3b6e7d.png">
使いたい機能のボタンをクリックします。
・Insert→登録
・Update→更新
・Upsert→登録、更新
・Delete→削除
・Hard Delete→削除(復元不可)
・Export→出力
・Export All→全出力

今回は更新手順を紹介します。
(Export、Export All以外は同じ手順になります)

<img width="702" alt="ログイン遷移.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/856271c3-ddb3-8c41-fe75-372bf12b6cc3.png">
1. OAuthを選択します。
2. Productionを選択し、Log inをクリックします。

<img width="418" alt="ログイン.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/b44aad86-caec-2fa1-d082-d4c9c94c03b0.png">
このようなダイアログが表示されますので、ユーザ名とパスワードを入力し、ログインをクリックします。

<img width="420" alt="アクセス許可.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/4f29c25c-75d1-f547-b932-e3339a9fe633.png">
許可をクリックします

<img width="702" alt="ログインネクスト.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/15e8d240-3fff-615a-a8eb-2866ec537433.png">
Nextボタンが活性化されるのでクリックします。
これでログイン完了です🎉

## 使用方法(Update編)

1. データ操作を行うオブジェクト(テーブル)を選択します。
2. Choose CSV fileで用意したCSVファイルの選択をします。
3. Nextボタンを押します。
4. 確認ダイアログが表示されますので、OKを押します。

データ操作を行うレコードを選択します。
Create or Edit a Mapボタンを押します。

Auto-Match Field to Columnsボタンを押します。

下部分の表のNameに値が入力されていることを確認し、OKボタンを押します。

先ほどマッピングした項目で反映されていることを確認し、Nextボタンを押します。

ログ出力先を選択し、Finishボタンを押すと完了です。
Finishボタン押下後に、操作を行なっても問題ないかという確認アラートが表示されますが、OKボタンを押せば問題ないです！

最後にSalesforce側を確認し、データが更新されていることを確認しましょう。
Swift - filterを使った配列操作とその使用例を丁寧に解説

##filterの使いどころ

配列の中から、**指定した条件に当てはまるもの**だけを残したい場合に使います。
filterを使うと新しい配列が得られ、**もとの配列を変更するわけではない**という点に注意しましょう。

```swift:Sample1.swift
// グループの年齢を格納する配列があるとする(22才, 35才...)
let ages = [22, 35, 19, 24, 28, 17, 20, 18]

// 未成年者（minor）の年齢だけを残した配列を作り、minorAgesに代入する
let minorAges = ages.filter { $0 < 20 }
print(minorAges) // [19, 17, 18]

// もとの配列は変わらない
print(ages)      // [22, 35, 19, 24, 28, 17, 20, 18]
```

##filterの書き方
`{ $0 < 20 }`の部分でその要素を残すか残さないかの条件を指定します。
`$0`には配列の要素が順番に入っていき、`{ }`内が`true`と判定されればその要素は残ります。反対に、`{ }`内が`false`と判定されればその要素は新しい配列には含まれません。

例えば上の例では、最初に`$0`には配列の最初の値の`22`が入ります。
`{ 22 < 20 }`の判定は`false`になるので、この`22`は新しい配列の中に含まれずに除外されます。
一方、配列内の`19`, `17`, `18`に関しては`{ $0 < 20 }`の判定が`true`になるので、新しい配列に含まれます。

##filterとisEmptyを組み合わせた便利な書き方

実際の現場でよく見る`filter`と`isEmpty`を組み合わせた書き方の紹介です。
例として**グループの中に未成年者が1人でもいたら入れないPUB**を考えてみましょう。
以下のように書けば、1人も未成年者がいなければ`canEnterPub`は`true`となり、未成年者がいる場合`canEnterPub`は`false`となります。

```swift:Sample2.swift
// グループの年齢を格納する配列があるとする(22才, 35才...)
let ages = [22, 35, 19, 24, 28, 17, 20]

// Pubに入れるかを判定し、結果をcanEnterPubに代入する
let canEnterPub = ages.filter { $0 < 20 }.isEmpty

print(canEnterPub) // false
```

`Sample1.swift`の例で見たように、`ages.filter {$ < 20}`の部分は`[19, 17, 18]`になります。**今回はそれを新しい変数に代入するのではなく、配列がもともと持つ`isEmpty`をそのまま適用しています**。`配列.isEmpty`のように書けば、配列の中身が空っぽであるときに`true`を、要素が1つでもあれば`false`を返します。

これを利用して、PUBに入れるか（= 未成年者が1人もいないか）というのをたった1行で判定して変数に結果を格納しています。このような便利な書き方もあわせて試してみてください。

##追記
@herara_ofnir3 様がコメントで`allSatisfy`を利用したより良い別解を提示して頂きました！

##ちなみに
僕は新しく知ったことを実際にコードで確かめたい時には[paiza.io](https://paiza.io/ja/projects/new)をよく使っています。ちょっとしたアウトプットをするときなどに重宝しています。

##関連
[Swiftにおけるreduceの使い方](https://qiita.com/pkaTaka/items/93e6e6920946e86b0a1c)
ASP.NETでリピーターコントロール内で動的に引数を指定してリンク先を作成したい

Web FormのASP.NETで
リピーターコントロールを使っている時、かつ、動的に引数を指定してリンク先を作成したい。
(コメントを頂いたので追記しました。)

画面はこんな感じにします。(ヘッダ部はCSSを置きたかっただけで、本筋には関係ありません)

```html:aspx
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style>
        .red	{color:red;}
        .grn    {color:green;} 
    </style>
</head>
```

```html:aspx
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">
                <ItemTemplate>

                    <a name="links" class="red" href='<asp:Literal ID="lits" runat="server" Text=""> 
                    </asp:Literal>' target='_blank'>A案</a>

                    <a class="red" href='<%# "./newpage.aspx?KEY=" + Eval("KEY") %>' target='_blank'>B案</a>

                    <asp:HyperLink ID="hlk" runat="server" Text="" Target="_blank">C案</asp:HyperLink>

                    <br />
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </form>
</body>
```

ソースコードはこちら

```c#:c#
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                // テスト用にテーブルを作成
                DataTable dt = new DataTable();
                dt.Columns.Add("KEY");
                dt.Columns.Add("NAME");

                //テーブルに値をセット
                for (int i = 0; i < 3; i++)
                {
                    DataRow dr = dt.NewRow();
                    dr["KEY"] = i;
                    dr["NAME"] = "NAME[" + i.ToString() + "]";
                    dt.Rows.Add(dr);
                }

                //リピーターコントロールにテーブルをBindする
                Repeater1.DataSource = dt;
                Repeater1.DataBind();
            }
        }
```
DataBind時に、ItemDataBoundが動きます。
C案では、cssもソースコードでセットしています。

```c#:c#
        protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DataRowView view = (DataRowView)e.Item.DataItem;

                //A案
                ((Literal)e.Item.FindControl("lits")).Text = "./newpage.aspx?KEY=" + view["KEY"] + "";

                //C案
                ((HyperLink)e.Item.FindControl("hlk")).NavigateUrl = "./newpage.aspx?KEY=" + view["KEY"];
                ((HyperLink)e.Item.FindControl("hlk")).CssClass = "grn";
            }
        }
```

実行時に生成されるHTMLは以下の通り(部分)。

```html:aspx
<a name="links" class="red" href='./newpage.aspx?KEY=0' target='_blank'>A案</a>
<a class="red" href='./newpage.aspx?KEY=0' target='_blank'>B案</a>
<a id="Repeater1_hlk_0" class="grn" href="./newpage.aspx?KEY=0" target="_blank">C案</a>
```

呼ばれた方はこんな感じで受け取ります。参考まで。

```c#:c#
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                string data = Request.QueryString["KEY"].ToString();
                Label1.Text = data;
            }
        }
```

いろんな書き方ができますね。
シンプルなのはB案、インライン式が嫌ならC案、何らかの都合でBC案ではうまく制御できない時はA案をご参考にどうぞ。
Manjaro で日本語ディレクトリを英語表記にする

# はじめに

日本語ディレクトリ(デスクトップ、ドキュメントなど)を英語表記にする。

# 環境

- Manjaro Linux 18.0.4 illyria
- kernel: 4.19.45-1-MANJARO
- i3wm

# 手順

`xdg-user-dirs-gtk` のインストール。

```
sudo pacman -S xdg-user-dirs-gtk
```

以下のコマンドを実行。

```
LC_ALL=C xdg-user-dirs-gtk-update
```

# 参考

- [Manjaro Fluxbox 15.12の日本語ディレクトリ名を英語名に戻した - haiju's 開発メモ](https://haiju.hatenablog.com/entry/2016/10/01/110920)
salesforceメモ

# vscodeインストール
[Visual Studio CodeでSalesforceの開発環境を構築する](https://qiita.com/shunkosa/items/e6248520bff90f397158)

java 環境設定(windows)
salesforcedx-vscode-apex.java.home
Code→Preferences→Settings
settings.jsonに以下のように設定する
```settings.json
{
    "salesforcedx-vscode-apex.java.home":"C:\\Program Files\\Java\\jdk1.8.0_211"
}
```
Android の Camera2 API と Mobile Vision API を使って バーコードを検出する

[Camera2 API と　Mobile Vision API を使って 顔検出する](https://qiita.com/ohwada/items/f66dcf14295d9e7c0bf5)
の続きです。

### 概要

前回の記事では、カメラからの連続画像から顔を検出した。
今回の記事では、カメラからの連続画像からバーコードを検出する。

下記の公式サンプルコードでは、カメラの制御に 旧来の Cameara API を使っている。

[googlesamples barcode-reader](https://github.com/googlesamples/android-vision/tree/master/visionSamples/barcode-reader/app/src/main/java/com/google/android/gms/samples/vision/barcodereader)

[Cameara API](https://developer.android.com/reference/android/hardware/Camera)

この記事では、Camera2 API を使って 同様の機能を持つ アプリを作成する。

前回の記事で作成した顔検出のアプリをベースにする。

Mobile Vision API を使ったバーコード検出 に関して下記の記事を参考にした。

-  [Google Play サービスでのバーコード検出](https://developers-jp.googleblog.com/2015/09/google-play_30.html)

- [Mobile Vision Barcode APIを用いたバーコード機能の実装方法]
(https://www.rozkey59.tokyo/entry/2018/03/26/225014)

### Mobile Vision API の設定

AndroidManifest.xml を変更する


``` AndroidManifest.xml

    <!-- 顔検出のとき -->
        <meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="face" />

    <!-- バーコード検出のとき -->
        <meta-data
            android:name="com.google.android.gms.vision.DEPENDENCIES"
            android:value="barcode" />
```

### バーコードを検出する

顔検出のときと同様の処理を行う。

### BarcodeDetector

BarcodeDetector を生成する

``` Java
  MultiProcessor<Barcode> processor

  BarcodeDetector barcodeDetector = new BarcodeDetector.Builder(this).build();

  barcodeDetector.setProcessor( processor );
```

### FrameProcessor

カメラからの連続画像を受け取り BarcodeDetector に渡すための FrameProcessor クラスを作成する。

このクラスは、顔検出のものをそのまま流用する。


### BarcodeTracker

BarcodeDetector から顔検出の結果を受け取るための BarcodeTracker クラスを Tracker を継承して作成する

[reference: Tracker](https://developers.google.com/android/reference/com/google/android/gms/vision/Tracker)


### 検出したバーコードの上に長方形を表示する

顔検出のときと同様の処理を行う。

ViewGroup を継承した CameraSourcePreview を作成する。
CameraSourcePreview の子のビューとして、カメラのプレビュー画面を表示する TextureView と長方形を表示するオーバーレイ用の View を作成する。

### 複数のバーコードから１つを選ぶ

画面をタッチして選択する。

タッチした画面の位置とバーコードの長方形の位置から、近くにあるものを選択する。


``` Java
    Barcode best = null;
    float bestDistance = Float.MAX_VALUE;
     for (BarcodeGraphic graphic : graphicOverlay.getGraphics()) {
            Barcode barcode = graphic.getBarcode();
            if (barcode.getBoundingBox().contains((int) x, (int) y)) {
                best = barcode;
                break;
            }
            float dx = x - barcode.getBoundingBox().centerX();
            float dy = y - barcode.getBoundingBox().centerY();
            float distance = (dx * dx) + (dy * dy);  
            if (distance < bestDistance) {
                best = barcode;
                bestDistance = distance;
            }
    }
```



### バーコードのサンプル

下記のサイトで作成した

９種類のうち日本の郵便番号バーコードは検出できなかった。


[バーコードどころ](https://barcode-place.azurewebsites.net/)

[郵便番号・バーコードマニュアル](https://www.post.japanpost.jp/zipcode/zipmanual/p10.html)

### スクリーンショット
![vision3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/27dd1192-be30-9735-a95f-e020ebdbde2d.png)


サンプルコードを GitHub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Vision3
数値型

##数値型の例
```go
func main() {
	var (
		u8  uint8     = 255
		i8  int8      = 127
		f32 float32   = 0.2
		c64 complex64 = -5 + 12i
	)
	fmt.Println(u8, i8, f32, c64)
	fmt.Printf("type=%T value=%v", u8, u8)
}
```
`%T`は型を、`%v`は値を表示します。

##番外編
###いろいろな計算式
演算の中に小数が含まれていると計算結果も小数表示される。

```go
func main() {
	fmt.Println("1+1=", 1+1)
	fmt.Println("10-1=", 10-1)
	fmt.Println("10/2=", 10/2)
	fmt.Println("10/3=", 10/3)
	fmt.Println("10.0/3=", 10.0/3)
	fmt.Println("10/3.0=", 10/3.0)
	fmt.Println("10%2=", 10%2)
	fmt.Println("10%3=", 10%3)

	/* 出力結果
		1+1= 2
		10-1= 9
		10/2= 5
		10/3= 3
		10.0/3= 3.3333333333333335
		10/3.0= 3.3333333333333335
		10%2= 0
		10%3= 1
	*/
}
```
インクリメントとデクリメントの計算。

```go
func main() {
	x := 0
	fmt.Println(x)
	x++
	fmt.Println(x)
	x--
	fmt.Println(x)
}
```
2進数

```go
func main() {
	fmt.Println(1 << 0) //0001 0001
	fmt.Println(1 << 1) //0001 0010
	fmt.Println(1 << 2) //0001 0100
	fmt.Println(1 << 3) //0001 1000

	/* 出力結果
		1
		2
		4
		8
	*/
}
```
`fmt.Println(1 << 0)` 1をゼロ回シフトした場合という処理
>【参考】
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)
>https://golang.org/ref/spec#Numeric_types
Curryingについて調べてみよう！

# Currying??

curryを見て、カレーを連想するのは、良くないです。
「Haskell Brooks Curry」という人の名前です。

curryは、複数の引数を持つ関数を呼び出す場合に、パラメータの数より少ない数のパラメータを引数として受け取ると、足りないパラメータを引数として受け取る。

つまり、関数一つが、n個の引数を受ける過程をn個の関数として、それぞれの因子を受けるようにするもです。

# Curryingを使ってみよう！！

```javascript
var greet = function(greeting, name) {
  console.log(greeting + ", " + name);
};
greet("Hello", "uni"); 
```

一旦、挨拶をする関数を作りました。
結果は、Hello, uniが出ます。

```javascript
var curryGreet = function(greeting) {
  return function(name) {
    console.log(greeting + ", " + name);
  };
};

var greet = curryGreet ("Hello");
greet("uni"); 
greet("DIO"); 
```

結果は、Hello, uniとHello, DIOが出ます。

今回は、4つの因子を使います。


```javascript
var curryGreet = function(greeting) {
  return function(separator) {
    return function(emphasis) {
      return function(name) {
        console.log(greeting + separator + name + emphasis);
      };
    };
  };
}; 
```

これに対して、新しい関数を作りました。

```javascript
var sampleGreet1 = curryGreet("Hello")("...")("?");
sampleGreet1("uni"); 
sampleGreet1("DIO");
```

結果は、Hello...uni?とHello...DIO? が出ます。
もちろん、色んなバリエーションを作ることができます。

```javascript
var sampleGreet2 = curryGreet("Hello")(", ");
sampleGreet2(".")("uni"); 
sampleGreet2(".")("DIO");
```

結果は、Hello, uniとHello, DIOが出ます。

```javascript
var sampleGreet3 = sampleGreet2("?");
sampleGreet3("uni"); 
sampleGreet3("uni");
```

結果は、Hello, uni?とHello, DIO?が出ます。

少しは、理解できましたか？
CurryingはJavaScriptで結構便利な技術です。
curryingを導入することで関数の引数ネーミングと処理が楽になります。
Gemfileの削除方法


使用しないGemfileを削除する方法です。

### 例えばwill_paginateをGemfileから削除する

```
$ bundle exec gem uninstall Gemの名前
```

今回の場合だと

```
$ bundle exec gem uninstall will_paginate
```

削除が完了したら、Gemfileから削除したふたつのGemを削除する

```gemfile.
gem 'will_paginate',           '3.1.6' # 削除
gem 'bootstrap-will_paginate', '1.0.0' # 削除
```

これでOK
Firebaseアプリをデプロイ後、Googleログインしようとすると403エラーがてたときの対処方法。

## 環境
Windows10 64bit
Chrome バージョン: 74.0.3729.169（Official Build） （64 ビット）
node -v v12.3.1
npm -v 6.9.0
firebase -V 6.10.0

ChromeブラウザでGoogleにログイン済みだとします。
（PCのデフォルトブラウザはChrome）

## 問題
Firebase console
https://console.firebase.google.com/
からFirebaseプロジェクトを設定しておき、ローカルでアプリを作成後、初期化`firebase init`&デプロイ`firebase deploy`します。
その後サイトに飛びGoogleログインしようとする時に起こる403エラーの対処方法。

## それまでの流れ
Firebase console
https://console.firebase.google.com/
からプロジェクトを作成後、Authenticationの設定をします。

開発＞Authentication＞ログイン方法＞GoogleでGoogleを有効にする画面で、プロジェクトのサポートメールを入力できません、しかし**このメールは必須のはず**です。

![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/c8a2f222-77a7-245f-fb0f-cf14028e3873.png)

でも入力用のボックスがないのでスルーしてしまうしかなく、保存ボタンを押したあと、Firebase deploy をしてサイトを表示したあとにGoogleログインしようとするとこの403エラーが出ます。

## 解決方法
そこで、エラー画面の

> .403. That’s an error.
Error: restricted_client
Application: XXXXXXXXXXXXXX
You can email the developer of this application at: unconfiguredapp@google.com
This app is not yet configured to make OAuth requests. To do that, set up the app’s OAuth consent screen in the Google Cloud Console.
Learn more ＜＜ここのリンク（下記画像画面に飛びます）


このLearn moreのリンクをクリックしてOAuth同意画面タブのサポートメールのところでメールを選択すると次回からはログインできるようになります。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44761/92bbdd18-8fdd-cdf2-8331-bd958430cc52.png)
【電子百葉箱】SparkFun weather:bit 使ってみる

#IoT百葉箱を作ってみたい
##概要
- いろいろな共同研究をしているため、昨今、土いじりというか、農業や園芸に関心が向いてしまっています。そのため、百葉箱を作ってみようと思います。いつ完成するか？ですが、そのためのページです。

##狙いと計画
- 狙い１：本校には風車が設置されています。その風車の発電量と風速や風向のデータを取得したい。
- 狙い２：屋外設置用の太陽電池電池システムを評価したい。[三ツ星産業社製 EC電源 EC1000](https://www.mitsuboshisangyo.com/%E8%A3%BD%E5%93%81%E6%A1%88%E5%86%85/ec1000-%E3%82%AB%E3%82%BF%E3%83%AD%E3%82%B0/)
- 狙い３：[OpenLog](https://www.switch-science.com/catalog/2716/)を用いてオフラインで計測する。microbitのデータを電子化するため。
- 狙い4:Weatherbit+Microbit+BLE+RaspiZero＋AmbientでIoT化したい。[実績 研究室の室温をIoT計測](https://qiita.com/tmdoi/items/cc7a278aedc994f40549)をもとにデータ数を拡張してAmbientに記録したい。
- 狙い5:超塑性研究会や奈良高専のIoTセミナーのネタにしたい。



# 取得データ 

- 2019年05月30日から06月02日まで　[エクセル形式](https://github.com/tmdoi/weather-bit/blob/master/LOG20190630-0701.xlsx)／[生データ](https://github.com/tmdoi/weather-bit/blob/master/LOG00007.csv)

#技術情報

- 公開コード 常時記録するモードにした[Ver beta0618](https://makecode.microbit.org/_9qR05EaKtHik)
- 公開コード 風速の単位をm/sにした [Ver beta0602](https://makecode.microbit.org/_gwiCcPXupKcz)
- [Weather Kit ハードウェアマニュアル](https://www.sparkfun.com/datasheets/Sensors/Weather/Weather%20Sensor%20Assembly..pdf?__hstc=250566617.a6827076e495cf0b4480b208f2937410.1559442796038.1559442796038.1559442796038.1&__hssc=250566617.2.1559442796038&__hsfp=3984380210)
- 素材01 [SparkFun weather:bit](https://www.switch-science.com/catalog/3383/)
- 素材02 [SparkFun OpneLog](https://www.switch-science.com/catalog/2716/)
- 公開コード [Ver beta0528](https://makecode.microbit.org/_4DFgYpEwHWYU)

#画像の記録

- ![IMG_1803.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237044/7c7f0dfb-d619-5601-8726-e82fbfd5488f.jpeg)
- ![IMG_1804.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237044/3ac0bb85-1aab-e5df-822a-7d190abedbe0.jpeg)

#履歴
- 2019.06.02 初めてデータが取得できた。
- 2019.05.27 下書きとして、書き始めた。
Hyperledger Fabricを使ったコミュニティ内仮想通貨構築 2日目

理解がたりないので
チュートリアルを実施

lightsailの最安プランだと、メモリが足りなくなるので
swap領域を追加。私は4GBほど追加しました。


前回から実行していれば、
/var/fabric/fabric-samples　配下にサンプルネットワーク構築用のスクリプトがあります。


サンプルネットワークの起動
```
cd /var/fabric/fabric-samples/fabcar/
./startFabric.sh javascript
```

#アプリケーションのインストール

ディレクトリの移動
```
cd /var/fabric/fabric-samples/fabcar/javascript
```

##npmのアップデート
```
 npm i npm to update 
```

##アプリインストール
```
$ npm install
> pkcs11js@1.0.18 install /var/fabric/fabric-samples/fabcar/javascript/node_modules/pkcs11js
> node-gyp rebuild

added 4 packages in 26.504s
```

アプリケーションの サンプルの用意が完了しました。
``` 
pwd /var/fabric/fabric-samples/fabcar/javascript
ls
enrollAdmin.js  invoke.js  node_modules  package-lock.json  package.json  query.js  registerUser.js  wallet
```

次回は、上記JSファイルを中身解説や、管理ユーザの登録を行います。

［参照］（https://hyperledger-fabric.readthedocs.io/en/release-1.4/write_first_app.html）
【CentOS6/CentOS7】システムサービス管理新旧対比

#CentOS6/CentOS7のシステムサービス管理新旧対比

| CentOS6まで | CentOS7 | 処理内容 |
|:-----------|:------------|:------------|
| service name start       |      systemctl start name.service |           サービスを起動               |
| service name stop        |      systemctl stop name.service |            サービスを停止      |
| service name restart     |      systemctl restart name.service |         サービスを再起動     |
| service name condrestart |      systemctl try-restart name.service|      サービスが実行中の場合のみ、再起動      |
| service name reload      |      systemctl reload name.service |          設定を再読み込み    |
| service name status      |      systemctl status name.service<br>-enabled<br>-disabled<br>-static<br>systemctl is-active name.service |                               サービス状態の表示<br>：OS起動時の自動起動設定<br>：OS起動時の自動起動オフ<br>：他のサービスに依存して起動<br>サービスが実行中か確認     |
| service --status-all     |     systemctl list-unit --type service --all |全サービスの状態表示    |
| chkconfig name on        |     systemctl enable name.service |           サービスの有効化    |
| chkconfig name off       |     systemctl disable name.service |          サービスの無効化    |
| chkconfig --list name    |     systemctl status name.service<br>systemctl is-enabled name.service|   サービス状態の表示<br>サービスが有効か確認    |
| chkconfig --list           |     systemctl list-unit-files --type service |全サービスの有効／無効表示    |
| chkconfig --list           |     systemctl list-dependencies --after |     事前依存サービスの表示    |
| chkconfig --list           |     systemctl list-dependencies --before |    事後依存サービスの表示    |
価格に自動で消費税額8%を加算して、データベースに保存するコードの書き方

#自動で消費税額8%を加算してからデータベースに保存する方法

商品の新規作成が行われた際、ユーザーが入力した価格に自動で消費税額8%を加算してからデータベースに保存するコードを書く。


model/product.rbのファイルに以下のように記述する。

```Ruby
class Product < ApplicationRecord
  def add_tax
    self.price = (price * 1.08).round
  end
end
```
こうすれば、ユーザーが入力した価格に自動で消費税額8%を加算してからデータベースに保存することができる。

その理由は、モデルのファイル内にメソッドを記述することで、モデルクラスのインスタンスに対してメソッドを追加できるからである。

この場合、product.rbにメソッドを書けば、Productクラスのインスタンスである@productに対して、@product.add_taxの様にメソッドを使うことができる。
API で LINE WORKS の外部トーク連携を有効化する

##API で LINE WORKS の外部トーク連携を有効化する

LINE WORKS はメンバーごとに、一般の LINE ユーザーや、組織外の LINE WORKS ユーザーとのメッセージ送受信を許可できます。

GUI の管理画面からも設定できますが、API 操作による設定も可能です。

TITLE: LINE/LINE WORKS 連携 (メンバー単位)
URL: https://developers.worksmobile.com/jp/document/100600701?lang=ja

##PowerShell による API 実行例
以下、PowerShell による API 実行例

```
$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("Content-Type","application/json; charset=UTF-8")
$header.Add("consumerKey","<Server API Consumer Key>")
$header.Add("Authorization","Bearer <Server Token>")

$Uri = "https://apis.worksmobile.com/r/<API ID>/contact/v2/domains/$domainId/worksats/line/accounts/<USER ID>"

Invoke-RestMethod -Uri $Uri -Method Post -Header $header

```
.batファイル(Windowsのコマンドプロンプト等から起動するバッチファイル)の書き方メモ

# 定番
- `REM` でコメント
- `@echo off` で実行するコマンドを非表示
- `cd /d %~dp0` でスクリプトが置かれている場所をカレントディレクトリにする

# 環境変数
- 環境変数は`set VAR=abc` で設定して、`%VAR%`で参照する
- 実行結果を変数に入れるには、`for文`を使う。その中で環境変数を使う場合は、`%%VAR%%`のように、`%`を2つ書く

```
for /f "usebackq delims=" %%a in (`az acr show --name %%VAR%% --query id --output tsv`) do set ACR_ID=%%a
```

# 便利な使い方
- 他のバッチファイルをサブルーチンとして呼び出すには、`call`を使う。例：`call a.bat`
- 複数行にまたがる時は、行末に`^`を書く
- 現在時刻の表示は、`time /T`
- 指定秒数ウェイトを入れるには、`timeout 10` で10秒待つ

- 明示的にバッチファイルを終了してコマンドプロンプトに戻るには、`exit /b 0`。単に`exit 0`と書くと、コマンドプロンプトを終了して閉じてしまう。

- `where` コマンドで、プログラム(コマンド)がどこにあるか探す。Linuxの which 。

# その他
- azコマンドは`.cmdファイル`なので、`call az aks get-versions` のように`call`で呼ばないと、コマンドプロンプトを終了して閉じてしまう。
- kubectlやhelmは`.exeファイル`なので、そのまま書けばOK。
Flux Standard Action(FSA)の説明

[Reduxの公式チュートリアル](https://redux.js.org/basics/actions#note-on-boilerplate)では、

>Other than type, the structure of an action object is really up to you. If you're interested, check out Flux Standard Action for recommendations on how actions could be constructed.

>(訳)Typeを除き、Actionオブジェクトの構造はあなた次第です。もし興味があれば、Actionをどのように構築したらいいかの推奨事項について[Flux Standard Action](https://github.com/redux-utilities/flux-standard-action)を調べてください。

とあります。このFlux Standard Action(FSA)について説明します。

## 目次
- なぜFSAが必要なのか
- FSAの内容


## なぜFSAが必要なのか

前述の通り、Flux/ReduxのActionには、オブジェクトであれば何でも指定できます。

しかし、例えばアプリごとにデータをpayloadフィールドに入れたりdataフィールドに入れたりと実装がばらついた場合、コードを再利用することが難しくなります。

このような問題を回避するため、Actionの書き方に規約を持たせようというのがFSAが必要な理由です。

## FSAの内容
### Actionの条件
- 必須条件
    - プレーンなJavaScriptオブジェクトであること。
    - `type`プロパティを持つこと。
    - 「`type`,`error`,`payload`,`meta`」以外を含まないこと。
- オプション条件
    - `error`プロパティを持つこと。
    - `payload`プロパティを持つこと。
    - `meta`プロパティを持つこと。

### `type`の条件
`type`はActionの性質を特定するための識別子である。

`type`は文字列定数であること。ある`type`どうしが等価であるならば、それらは厳密等価演算子(`===`)で比較して等価であること。

### `payload`の条件
`payload`はどんな値でもよい。ActionのTypeについてではない情報や、Actionのステータスではない情報は、すべて`payload`に含まれるべきである。

`error`が`true`であるときは、`payload`はerrorオブジェクトであるべきである。

### `error`の条件
Actionがエラーを表す場合、オプションの`error`プロパティを`true`に設定してもよい。このとき、`payload`はエラーオブジェクトであるべきである。

`error`が`undefined`か`null`など、`true`以外の値である場合、エラーと解釈してはいけない。

### `meta`の条件
`meta`は、どんな値であってもよい。`meta`は、`payload`の一部ではないあらゆる種類の追加情報を意図している。

## 参考文献
- [Redux](https://redux.js.org/)
- [Flux Standard Action](https://github.com/redux-utilities/flux-standard-action)
TensorFlowの学習モデルファイルのまとめ


# TensorFlowの学習モデルファイル
　色々複雑で人類には早すぎる気がするので、とりあえず自分の知見をメモします。

　随時更新中です。


## 公式情報
　まずは、ここらへんを解読していく必要があります。人類には早すぎる感があります。

[TensorFlow : Mobile : モバイル配備のためのモデルを準備する](http://tensorflow.classcat.com/2017/12/17/tensorflow-mobile-prepare_models/)

## モデルファイルの中身を確認する方法
　TensorFlow公式のSummarize_Graphとnetronというツールがあります。Summarize_Graphはビルドが大変なので、netronが楽です。

[netron](https://github.com/lutzroeder/netron)

　両方とも、以下に詳しい使い方が書いてあります。 @PINTO 氏は神です。

[how-to-check-the-graph-structure-of-a-pb-file-part1](https://github.com/PINTO0309/OpenVINO-YoloV3#how-to-check-the-graph-structure-of-a-pb-file-part1)

　以下のブラウザ版であれば、ネットに繋がっていればセットアップせずすぐ使えます。。

[netron（ブラウザ版）](https://lutzroeder.github.io/netron/)

　モデルファイルはprotocolbuffer(.pb)ファイルやjson形式のモデルファイルを読み込めます。

## モデル変換
[MMdnn](https://github.com/microsoft/MMdnn)
マイクロソフトのツール。様々な変換が可能です。まだ試したことはないです。

[keras_to_tensorflow](https://github.com/amir-abdi/keras_to_tensorflow)
Kerasのモデルから、TensorFlowのモデルへ変換できるツールです。前使った時は、エラーが出て失敗しました。色々制約がある気がします。
scrapyのCSSセレクタ(cssselectパッケージ)で `:nth-of-type() is not implemented` に遭遇した場合

# 概要

scrapyで特定のCSSセレクタを指定する際にサボって死んだ話。
対象は `cssselect==1.0.3`

## 結論

:nth-of-type()はちゃんとタグを指定しましょう。

# 事象

とあるWebサイトをクロールする際に

```
.article-list > .content-box:nth-of-type(1) > div > div
```

以下のようなCSSセレクタを記述したところ

```
cssselect.xpath.ExpressionError: *:nth-of-type() is not implemented
```

というエラーが発生した。

# 調査

Githubで該当のエラーメッセージを検索すると

https://github.com/scrapy/cssselect/blob/cb7a7e21de1ba9347d58a6a14b7c78b3de1f49ca/cssselect/xpath.py#L506

```
    def xpath_nth_of_type_function(self, xpath, function):
        if xpath.element == '*':
            raise ExpressionError(
                "*:nth-of-type() is not implemented")
        return self.xpath_nth_child_function(xpath, function,
                                             add_name_test=False)
```

どうやらelementを指定していない場合以外は動く様子。

そもそも、この `:nth-of-type()` は同じタグの中での処理なので完全にここで書いてないのはサボりだ。

https://www.w3.org/TR/selectors/#typed-child-index

というわけで、ちゃんとタグを補ったら動いた。

# あとがき

そもそも、順番を考慮してパースしないといけないHTMLを扱っている状況自体がつらい....
WindowsXPのPCをLinux Mintに移行した話

家の中に眠っていたWindows XP搭載のPCをLinux Mintに移行しました。
# PCのスペック
* Panasonic製Let's note CF-Y4GW8AXR（2005年発売）
* OS：Windows XP
* CPU：インテル(R) Pentium(R) M プロセッサ低電圧版 758 （2次キャッシュメモリー2 Mバイト、 動作周波数 1.50 GHz、フロントサイド・バス 400 MHz）

# インストールしたOS
Linux Mint 19.1 "Tessa" - Xfce (32-bit)（[ダウンロードページ](https://www.linuxmint.com/edition.php?id=266)）

# インストール手順
## isoイメージファイルDVDの作成
この作業は別のPC(Windows10)で行いました。
1. [ダウンロードページ](https://www.linuxmint.com/edition.php?id=266)からisoイメージファイルをダウンロード
2. DVDをPCにセット
3. isoファイルをエクスプローラーで選択→「ディスクイメージツール」→「書き込み」
![dvdへの書き込み_1_edit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356779/73329408-c41c-188e-8d38-2c3948b0c0a0.png)
4. 「書き込み」を選択
![dvdへの書き込み_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356779/e4fa4b37-aec6-252b-ed99-d62be06f4784.png)
5. しばらく待つと書き込み完了。
![dvdへの書き込み_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356779/03f5e36e-5f71-0945-17ea-8081ff318495.png)

## Linux Mintのインストール
1. Windows XPの方のPCのBIOS設定において、「DVD」がブートの最上位になるように設定
2. DVDをセットしてPCを起動
3. Windowsではなく、DVDに入っているLinux Mintが立ち上がる
4. Linux Mintが立ち上がったら、ディスクトップにある「Install Linux Mint」をダブルクリック
5. 言語設定：日本語
6. キーボードレイアウト：日本語
7. Wi-Fi設定：設定しませんでした
8. インストール準備：「サードパーティーソフトウェアをインストールする」はチェックせず。（一度チェックしたら、次に進まなかったので2回目は外しました。）
9. インストールの種類：ディスクを削除してLinux Mintをインストール
10. エリア：Tokyo
11. 名前、コンピュータ名、ユーザー名、パスワードを入力
12. インストールが完了するまで待ちます。
13. インストールが終わったら、ダイアログに従って再起動。
14. 途中でインストールメディア（DVD）を抜くように支持されるので、指示通りにDVDを抜いて続けます。
15. ログイン画面が表示されたら、11で設定したものを入力
16. 無事に起動したらインストール完了

# 感想
約15年前のPCだったのでインストールできるかどうか不安でしたが、無事にできました。DVDドライバが古く、DVDの読み込み時にカリカリと音がしていたのですごく怖かったです。笑
7年前発売のDynabook（Windows10）よりも起動が早くなってびっくりしました。DynabookもLinuxに移行しようかな。

## 後日談
ターミナルはそれなりの速度で使えたのですが、ブラウザはさすがに使い物にならない速度でした。バッテリも消耗していてACアダプタがないとだめだったので、結局お蔵入りとなりました。笑


# 参考
https://qiita.com/technopocket/items/0ff4dd2a09b0538b726c
SSRモードのNuxt を Firebaseにホストするまでの手順

SPAモードならスタティックファイルのホスティングでいいと思うけど、SSRでやりたいのでその方法を調べた。

# リポジトリ

- master: https://github.com/sterashima78/firebase-nuxt-example
- 以下の作業が完了した時点: https://github.com/sterashima78/firebase-nuxt-example/tree/v1

# Firebaseのプロジェクト作る

https://console.firebase.google.com に行ってアカウントとプロジェクトを作る。

```bash:firebase-toolsが入ってなかったら
npm i -g firebase-tools 
```

# ひな形を作る

参考: 
- https://ja.nuxtjs.org/guide/installation/
- https://firebase.google.com/docs/functions/get-started
- https://firebase.google.com/docs/hosting/quickstart

```bash
mkdir firebase-nuxt-example #今回のプロジェクトroot
npx create-nuxt-app app # nuxtのテンプレート
firebase login
firebase init functions # SSRをfunctionで行う
firebase init hosting # 静的ファイルを配信するのに使う
```

# 各設定変更

## firebaseの設定

参考: 
- https://firebase.google.com/docs/hosting/full-config
- https://firebase.google.com/docs/functions/manage-functions

- `hosting.public` で指定したディレクトリがHostingされる
- `hosting.rewrites` はHostingされたファイルがない時に設定どおりにリダイレクトされる
    - ここでは全部 app という関数へ流すように指定
- `functions.source` で指定したディレクトリにfunctionsで使われるファイルを入れる

```json:firebase.json
{
  "hosting": {
    "public": "dist/client",
    "ignore": [
      "firebase.json",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "function": "app"
      }
    ]
  },
  "functions": {
    "source": "dist/server"
  }
}
```

## functionsで使う依存を追加

```bash
cd functions && npm install --save express nuxt
```

## functionsで使う設定

nodejsのバージョンを10にする

```json:functions/package.json
{
  "name": "functions",
  "description": "Cloud Functions for Firebase",
  "scripts": {
    "serve": "firebase serve --only functions",
    "shell": "firebase functions:shell",
    "start": "npm run shell",
    "deploy": "firebase deploy --only functions",
    "logs": "firebase functions:log"
  },
  "engines": {
    "node": "10"
  },
  "dependencies": {
    "express": "^4.17.1",
    "firebase-admin": "~7.0.0",
    "firebase-functions": "^2.3.0",
    "nuxt": "^2.8.0"
  },
  "devDependencies": {
    "firebase-functions-test": "^0.1.6"
  },
  "private": true
}

```

## functionsで呼び出す関数を定義

参考：
- https://firebase.google.com/docs/functions/http-events
- https://ja.nuxtjs.org/api/nuxt-render-route

hostingからリダイレクトされる app という関数で公開

```js:functions/index.js
const functions = require('firebase-functions');
const { Nuxt } = require('nuxt')
const app = require('express')()
const nuxt = new Nuxt({
  dev: false,
  buildDir: '.nuxt',
  build: {
    publicPath: '/'
  }
})

function handler(req, res) {
  nuxt.renderRoute('/', { req }).then(result => {
    res.send(result.html)
  }).catch(e => {
    res.send(e)
  })
}

app.use(handler)
exports.app = functions.https.onRequest(app)
```

# ビルド

dist以下に必要なファイルを配置する

- .nuxt は functionsに必要
- .nuxt/dist/client はHostingで配信する
- static もHostingで配信する

```bash:build.sh
rm -rf dist
mkdir -p dist
# server
cp -R functions dist/server
cp -R app/.nuxt dist/server/
#client
cp -R app/static dist/client
cp -R app/.nuxt/dist/client/* dist/client/
```

# 動作確認

```
firebase serve
```

# デプロイ

```
firebase deploy
```

# 終わりに

- SSRをする際はFunctionsを使う
- NuxtをExpressと一緒に使う
- 静的ファイルはHostingで配信する

ここから AuthenticationやFirestoreを追加していきたい。
環境構築からReact始めるメモ

後から手順起こしたりしてるので漏れなどあるかも。  

## 環境/ツール
- Mac OS X Mojava 10.14.5
- anyenv 1.1.0
- nodenv 1.3.0
- node 11.1.0
- npm 6.9.0
- yarn 1.15.2

## 環境構築
### anyenv
```shell
$ brew install anyenv 
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
$ anyenv --version
anyenv 1.1.0
$ anyenv install -l
```

### nodenv
```shell
$ anyenv install nodenv
$ exec $SHELL -l
$ anyenv versions
$ which nodenv
/usr/local/anyenv/envs/nodenv/bin/nodenv
$ nodenv --version
nodenv 1.3.0
```
_元々ndenvを入れようとしていたけど、古くてもう非推奨らしい_

### node
```shell
$ nodenv install 11.1.0
$ nodenv global 11.1.0
$ nodenv version
11.1.0 (set by /usr/local/anyenv/envs/nodenv/version)
$ which npm
/usr/local/anyenv/envs/nodenv/shims/npm
$ npm --version
6.9.0
```

## React&Typescriptの準備
```shell
$ npx create-react-app hello-world --typescript
$ npm start
```
ブラウザが起動してサンプル画面が出るはず。
_既存のnodeとかがあるとnode_modulesとかがコンフリクトしたりするので初期化する必要あり。_

## 参考
- https://qiita.com/rinpa/items/81766cd6a7b23dea9f3c
- https://booth.pm/ja/items/1312652

圧倒的感謝！！
プログラミング初心者がFlaskとSQLAlchemyで開発してHerokuにデプロイしてみた。

初投稿です。

少し前にバズった記事、

https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a

を読ませていただいて、「Progateを一度やった程度の初心者」という言葉に励まされて、僕もFlaskを学んで見ました。製作期間は１週間ほど。

結果出来上がったものがコレになります。

https://mymonobyttmone.herokuapp.com/

端的に言うと、自分の持っているものをリスト化してみようっていうものです。ミニマリストとか断捨離する人向け。断舎離したものも表示できるので捨てたものを思い出すために使うのにもいいかなって思ったり。作ってるときは「すごいのができるぞー」と思っていたんですが完成したらしょぼいなこれ誰が使うんだよ……。（自分すら使ってない）

今回はHerokuにデプロイまで実践してみるのが目的なので、これで許してください。

## 学習に使用したサイトなど
###Flaskチュートリアル
https://study-flask.readthedocs.io/ja/latest/index.html

ほぼこのサイトからコードを流用したり、コピペしたりさせていただきました。多少記述が古かったりしましたが、ググれば出てくるので問題なし。Herokuへのデプロイはエラーが出まくったので参考にならなかったかもしれない。
###Paiza Flask入門

https://paiza.jp/works/search_courses/2115

唯一Flaskが学べるプログラミング学習サービスだと思います。ProgateやドットインストールにはFlaskがないので。

簡潔でわかりやすい講座だったと思います。FlaskチュートリアルにはないSQLAlchemyのデータベースの連結についても解説されています。あと声が可愛い（重要）。最初の２ヶ月分が１ヶ月分の料金で利用できます。

###Pycharm Professional

IDEは初めて触ったのですが、非常に優れていると思いました。Google Chromeとこれだけ立ち上げれば開発できるので初心者に優しいと思います。学生はプロフェッショナルが無料で使えるのでぜひ使いましょう。

https://qiita.com/tetrapod117/items/92f965cf1928739b70e4



## 感想：意外と簡単？

**とりあえず完成させるのは意外と難しくない**、というのが最初の感想です。Flaskは上記の記事にも書かれている通り、優れたチュートリアルがありますし、Hello Worldするだけなら一瞬です。プログラミング学習している人はProgateなどの学習サイトを何周もするよりも、一旦作ってみるのがいいと思います。自分で作ったものが動くのは最高に気持ちいです。

ただ、何がなんだかわからないまま写経したり、よくわからないけど動くって部分が多数あるのでやっぱり**きちんと学ぶには時間が足りていないなと感じます。**

そして、**Flaskはやっぱり日本語情報が少ないです。**参考書はほぼなく、Teratailや個人のブログ、Qiitaなどを参考に作りました。ときにはStack Overflowの英文も頑張って読みました。英語は雑魚なのですが、**意外と簡単な英語で書かれているし、コードのみを見ても参考になるので食わず嫌いは良くないと思いました。**とくにこだわりがないのなら初めてはRailsがいいのかなってやっぱり思いました。

あと最後にちょこっと触れたGitが全くわからなかったのでやらねばという気持ち。addしてpushしただけ。なんだブランチとマスターって（困惑）

## 次にやろうと思うこと

Djangoで開発してみたいです。Flaskではログイン処理がうまく理解できておらず、ユーザーを削除したらログアウトさせる処理が書けませんでした。なのでユーザー削除機能は実装しませんでした（）Djangoならそのあたりいい感じにしてくれそうなので。

あと、Gitの基礎的なことはわかるようにしたいです。

## おわりに

**プログラミング苦しいけど楽しい！**多分これからも苦しんで苦しんで、ちょっとだけ楽しくなるのを繰り返していくのだと思います。

あと、最初から最後まで一人でやってみて、情報の取捨選択とかコード改変技術とか、**自走力のようなものがついた気がしました。**これからもがんばります。

それと、これからはQiitaで開発日記を書いていこうと思います。いかに短い記事であろうとエラーの解決につながると気づいたので。偉大なる先人の知恵…！

プログラミング初心者の人へ。
Twitterにいるエンジニアはつよい人ばっかりなので絶望しそうになりますが、僕のようなよくわからんモノを公開してしまう人間もいるので気を確かに持って一緒に頑張りましょう。
【UiPath】ファイル一覧を比較して差分だけ残す

##概要
前日に保存した画像ファイルと今日保存した画像ファイルの差分をとり、
今日新規追加された画像のみ残し、前日と同じファイルは削除します。

**2019/05/22保存分**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/73dbe58e-382d-6985-3c2d-9d38cd18da0b.png)
**2019/05/23保存分**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/6f4ffd6c-665e-1e5c-a1fe-c35ef8013678.png)

##背景
他のエンジニアさんが前述の処理を実装していたのですが、前日と今日の画像ファイルを二重ループでチェックしており、処理に非常に時間がかかっていました。
前日1000ファイル×当日1000ファイル=1000×1000ループ
となり、**指数関数的に処理時間が延びていく**ことになります。

数秒で終わらせたいと思い、Invode Codeを使って実現してみました。

##フローチャート
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/db1c3ccc-bbcd-4374-9f69-df46266d178d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/f5f631df-60bb-d7c2-11b8-e4fff1072414.png)

1. 前日のファイル一覧を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/3e22d2a8-b9a1-87d9-b8e9-0c360474c229.png)

2. 今日のファイル一覧を取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/e3c2acf7-6317-edf2-1d55-74bbc22a7663.png)

3. 前日と今日のファイル一覧を比較し、同じファイル名だったファイルをListに格納。
格納するのは**今日のフォルダ内のファイルパス**です。

**Code**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/763272fb-bb98-9071-9cf6-eda4810ba597.png)

```vb
Dim ys, td As String
result = New List(Of String)
For Each ys In ysImgFiles
 For Each td In tdImgFiles
  Dim ysfileNm, tdfileNm As String
    ysfileNm = Path.GetFileName(ys)
    tdfileNm = Path.GetFileName(td)
    If tdfileNm.Equals(ysfileNm) Then
      result.Add(td)
      Exit For
    End If
  Next
Next
```

**Argument**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/6b0f6137-c7a1-0189-aac8-84afb1011633.png)

4. 同ファイル名リストをもとに、今日のフォルダ内から全削除します。

**Code**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/6147718d-6402-8934-91a6-8c45848971f9.png)

```vb
Dim d As String
For Each d In delFiles
 File.Delete(d)
Next
```

##実行結果
新規追加された画像ファイルのみ残っています。
処理時間はほんの数秒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/33d00ba2-cf4b-2bb0-c54e-4157cbfbb765.png)


##補足
VB.NETのコードでやっていることなので、Blue Prismでも作れそうです。
ストロングパラメーターについてサクッと解説。

RUby on Rails にはストロングパラメータという仕組みが存在します。

これは何かというと、**「Web上から入力されてきた値を制限することで、不正なパラメータを防ぐ仕組み」**です。MassAssingment脆弱性というセキュリティ上の問題に対処するための仕組みとしてRails4系から導入されました。

MassAssingment脆弱性についてはこちら
https://qiita.com/tbpgr/items/63028f5e19a2d1617e40


ストロングパラメーターはDB(データベース)の更新を安全にしてくれるもの。

クラッカー(悪意のある者)が、Webアプリケーションに不正な情報を送ろうとしたときに、ストロングパラメータがあればそれを防ぐことができます。



使い方の例

```
def user_params

params.require(:user).permit(:name, :email, :password, :password_confirmation)

end
```

requireは「必要とする」, permitは「許可する」という意味の英単語。

 

つまり、params[:user][:name]　はOKだけど、params[:password]やparams[:email]は受け入れられないということです。require(:user)で:userを要求しているからですね。


requireというメソッドでPOSTで受け取る値のキー設定
permitメソッドで許可して受け取る値を制限
 

そもそもparamsとはRailsにて「送られてきた値を受け取るためのメソッド」です。

その送られてくる情報は主に、「getのクエリパラメータ」or「POSTでformを使って送信されるデータ」です。

 

GETとPOSTについてはこちらのリンクを参考にすると分かりやすいです。

https://qiita.com/Sekky0905/items/dff3d0da059d6f5bfabf

※Webの仕組みについて知るには、「Webを支える技術」という本がオススメです。



もう少し詳しくストロングパラメーターを使うべき理由を説明します。

なぜ使うべきかというと、先程も述べたMass Asignmentというセキュリティの問題を回避するためです。

例えば、データベース上でユーザーの管理者がtrueかfalseかを判断しているとします。

ブラウザからストロングパラメータを使わずに何でも値を受け入れてしまったら、管理者情報をtrueとして値を送信されてしまう可能性があります。受け取る値を制限していなかった場合、悪意のあるユーザーに管理者権限を乗っ取られてしまうということですね。

 

管理者権限が乗っ取られてしまったら、せっかく自分で作ったWebアプリが嫌な目にあいますよね。

そのためにはストロングパラメータをきちんと設定すればOKです。

 

Qiitaの以下の記事がとても分かりやすいです。
https://qiita.com/mochio/items/45b9172a50a6ebb0bee0
react-waypointを使って無限スクロールを実装する

#概要
最近、フリーワードで写真検索できるのを作りました。
[こちら](https://searchphotos-react.firebaseapp.com)です。

使ったAPIは[unsplash](https://unsplash.com/developers)です。

ここでは、写真を配列で保存してコンポーネント側でマップで回しています。
下までスクロールするたびに配列に追加する関数を作る方法を見ていきます。

#インストール

```terminal
yarn add react-waypoint
```

[公式](https://github.com/civiccc/react-waypoint)

#書いていく
ここでは色々書いていますが、写真配列のコンポーネント周辺だけを見ていきます。

```javascript:components/MainPage.js
import { Waypoint } from 'react-waypoint';

return (
  <ImageListContainer>
    <Images /> //イメージコンポーネント
    <Waypoint onEnter={this.loading} />
      {loading && (
        <div style={{ position: 'absolute', bottom: '2rem' }}>
          <Waiting /> //非同期の間のローディングコンポーネント
        </div>
      )}
  </ImageListContainer>
);

const mapStateToProps = state => {
  return {
    loading: state.photo.loading
  };
}
```
ここでは下までスクロールした時に発火さしたいと思うコンポーネントの下に`<Waypoint />`を起きます。
`<Waypoint />`につける`onEnter`で発火したい関数を起きます。そのほかのオプションについては公式を見てください。
ここでは関数の中は割愛します。
`<Waiting />`はAPIとの通信で写真を取得しているのですが、その非同期の間にアイコンなどを出すためのコンポーネントです。

以上でできると思いです。

#余談
ここからは自分用メモです。
アクションでAPIとの通信をして、写真を配列で取得しているのですが、`reducer`で保存する時に少しハマりました。

```javascript:reducers/photoReducer.js
const initialState = {
  photos: [],
  term: '',
  isPhotos: null,
  page: 1,
  loading: true
};

case 'ADD_PHOTOS':
  return {
    ...state,
    // photos: [ ...state.photos, action.payload.photos ], こうするとエラー
    photos: state.photos.concat(action.payload.photos),
    page: action.payload.page,
    loading: false
  };

```

上のエラーが起きるのは、配列の中に配列を保存しちゃっているので、こういう時は`concat`を使うといいみたいですね。学びました。

ただ、`photos: [ ...state.photos, ...action.payload.photos ]`だといけたのかな？
PHP基礎の基礎

学習過程の覚え書き

#文字の出力
```php:index.php
<h1><?php echo '任意の文字列'; ?></h1>

```
※命令の終わりには「;」をつける

#変数宣言

```php:index.php
<?php $a = 'アイウエオ'; ?>

```

#外部ファイルを読み込む設定

```php:index.php
<?php include('sample.php'); ?>

```


##PHPを書くときに気をつけること

①一つのファイルに複数のPHPブロックがある場合、全てのブロックは1つのブロックと見なされる

```php:index.php
<?php
 $str = 'ブロック1';
?>

<html>
  <head>
    <?php 
      $echo $str; //ブロック1が出力される
      $str = 'ブロック2'; //変数$strが上書きされる
    ?>
・・・

```

②半角スペース、タブ、開業は変数名内でなければ無視されるので書いても問題ないが、全角は「''」「""」で囲んでないとエラーになる


#配列の書き方

```php:index.php
<?php 
  $array = array(235,'これは文字列です',3.14,FALSE);//最初に入れる値が決まってないなら$array = array();でもいい
 ?>
```

#配列への値の入れ方

```php:index.php
<?php 
  $array = array();
  $array[] = 'アイウエオ';
  $array[2] = 235;
 ?>

```

#配列の値の取り出し

```php:index.php
<?php 
  $array = array();
  $array[] = 'アイウエオ';
  echo $array[0];
 ?>

```

#連想配列
キーと値の組み合わせでもてる

```php:index.php
<?php 
  $array = array('スイカ'=>'甘い','レモン'=>'酸っぱい','柿'=>'渋い');
 ?>

```

#連想配列の値の挿入
[]内にキーを指定する

```php:index.php
<?php 
  $array = array();
  $array['スイカ'] = '甘い';
 ?>

```
#連想配列の値の取り出し

```php:index.php
<?php 
  $array = array();
  $array['スイカ'] = '甘い';
  echo $array['スイカ'];//甘い
 ?>

```

#条件分岐あれこれ
###switch文

```php:index.php
<?php 
 switch($num){
  case 1:
   echo '1です';
   break;
  case 2;
   echo '2です';
   break;
 }
 ?>

```
#if文(条件分岐)

```php:index.php

if($num == 3){
  echo $num;
}elseif($num ==5){
  echo '５です';
}
```

#while文

```php:index.php

$i = 0;
while($i < 1000){
  echo $i;//条件を満たしている場合に実行する処理
  $i++;
}

```
#for文

```php:index.php

$i = 0;
for($i = 1; $i < 1000; $i++){//左から変数の初期化,条件、ループするごとに実行する処理
  echo $i;//条件を満たしている場合に実行する処理
}

```

#関数宣言
※関数名が同じでも引数の数が違うと別の関数として扱われる

```php:index.php
function total($price{//priceは引数、呼び出し元で渡す必要がある
  $result = price * 1.08;
  return '価格は'.result.'円です';
})

```

#ローカル変数とグローバル変数

```php:index.php

$num = 200;//グローバル変数

function total($price{
  echo $num;//関数内で作られるローカル変数なので何も出力されない
  $result = price * 1.08;
})
echo total($num);//グローバル変数の$numがtotalメソッドで計算された結果の216が出力される
echo $num;//単純にグローバル変数の200が表示される。

//関数の中でグローバル変数を使用したい場合
function total($price{
  global $num;
  echo $num;//200
})