OmniAICreator/Qiita-1.07M huggingface dataset:
【みにくいアヒルの子定理】ミルクボーイ風解説

「どうも～ミルクボーイですー」
「お願いします～」
「あーありがとうございますー。先日G検定の合格通知いただきましたー:tada:」
「こんなもんなんぼあってもいいですからね」
「ゆーとりますけどもね」

# 学習済みAIおかん

「うちのAIおかんが好きな鳥がおるらしいんやけど」
「その名前を忘れてもうたらしくてね」

「好きな鳥の名前を忘れてしもうて、どうなってんねんそれ」

「それで色々聞くんやけど全然わからへんねんな」

「わからへんの？いやほんなら俺がね、AIおかんの好きな鳥の名前ちょっと一緒に考えてあげるから」
「どんな特徴があったか教えてみてよ」


# アヒルを思い出したいAIおかん

「AIおかんが言うにはな、その鳥にはくちばしがあって羽が生えとるらしいねん」

「その特徴では具体的な鳥を絞れへんがな。他には何か言ってなかった？」

「その鳥は鳥類に分類されるらしいねんな」

「いや、だからその特徴ではわからへんねん」
「カモノハシではない、ってことしか分からへんでそれー」
「他には何か言ってなかった？」

「AIおかんが言うにはな、その鳥は足が2本あってそこに羽毛は生えてないらしいねん」

「いやだからその特徴では（以下略）

AIおかんは適切にアヒルとしての特徴を抽出できていないようです。

# 白鳥を思い出したいAIおかん
「実はAIおかんはもう1種類好きな鳥がおるらしいねんな」

「さっきはうまく特徴を捉えてなかったけど、今度は大丈夫やろー」
「じゃあその鳥の特徴を教えてくれるー？」

「AIおかんが言うにはな、その鳥にはくちばしがあって羽が生えとるらしいねん」

「それさっきも言ってたやん」
「そんなんほとんど全部の鳥に当てはまるんやから1種類の鳥の特徴としては不適切やで？」
「他には何か言ってなかった？」

「その鳥は鳥類に分類されるらしいねんな」

「おんなじやん」
「さっきの鳥と重複する特徴はもう教えてくれんでいいのよー」

「AIおかんが言うにはな、その鳥は肺呼吸しとるらしいねん」

「いやだからその特徴では（以下略）


# この定理が言いたいことは

おかんが人間なら好きな鳥の特徴をあげる際に、鳥類全般に共通する特徴を言うことはなかったはずです。
しかし、AIおかんはどうやら白鳥の特徴として鳥全般の特徴を選んでしまったようです。

確かに翼やくちばしは鳥の大きな特徴であり、鳥の種類を分類する学習をさせず、複数のモデルそれぞれ1つずつに1種類の鳥を学習させるとうまくいかない可能性があることも頷けます。

例えば白鳥とそれ以外を分類するAIでアヒルを判定した場合、アヒルを白鳥と判定する特徴だけを選んでしまうかもしれません（今回のケースだと鳥としての特徴だけを選択していた）

この定理では、学習時に適切な特徴を選べるような設計をしなさいよ、ということが言いたいのだと私は理解しています。

# あとがき
公式テキストだけ読んでみにくいアヒルの子定理理解できる人いるんだろうか。。。

ちなみにG検定自体はめちゃくちゃ簡単でかつ体系的にAI事情を学べるのでAI興味ある方は勉強してみるといいかもしれません。（試験は受ける意味があるのかどうかしらん）

間違ってたらマサカリください:bow:
warning package.json: No license field

# はじめに
yarnやnpmでパッケージをaddしようとした時に題のような警告が出たので解決方法を記す。

# 解決方法
package.jsonの中にライセンスに関するパラメータを追加してあげる。OSSのように他人と共有しない場合は"UNLICENSED"だが、MITなどの場合は別の指定が必要。
具体的なパラメータ指定の詳細などは[こちら](https://docs.npmjs.com/files/package.json)を参考。

```package.json
{
...
  "license": "UNLICENSED"
...
}
```


# おわりに
[こちら](https://blog.pinkumohikan.com/entry/set-unlicensed-to-license-field-when-private-product)を参考。
AWS 認定 高度なネットワーキング – 専門知識に合格してきた話

本日(3/29)の10:30開始の試験です。
受けたばかりでほくほくのやつをメモ書き程度ですが記しておきます。
もちろん、問題そのものについては何もかけません。

## me
- 今回でaws認定11冠
- しがないWebエンジニア
- 過去には広く浅くでサーバー構築してwebサービス作って運営して、ってことをやってる
- aws歴2年半くらい
- awsのインフラもけっこう浅いところまで
- フルスタックであり、ノンスタックでもある


## やったこと
- Udemyで問題を解いた
- 英語わかんないけど家で自転車漕ぎながらUdemyの動画みた
- サンプル問題の日本語訳を解いた
- 直前でいくつかblackbeltを流し見した

9割方Udemyでした。


## Udemy
詳しいことはまた別の記事で、とは思いますが、
ざっくりいうと専門知識は国内の情報が少なすぎてあんまり選択肢がないです。
基本、これで問題を解いて、解いた問題の理解を含め、同じ分野の問題が出た時に応用して考える、って流れでしょうか。

## サンプル問題の日本語訳
試験に向かう電車の中、こちらの記事を読ませていただきました。
[AWS認定セキュリティ専門試験が発表されたのでサンプル問題を日本語訳してみた](https://dev.classmethod.jp/articles/scs-spring-2018-sample-questions/)

これらの問題がそのまま出るってことはないけど、分野も難易度もまあまあ近かった気はする。

## Blackbelt
いくつか問題を解いてて、このあたりが厚そうだと判断。

- Direct Connect
- Route53 (リゾルバとかフォワーダーとか）
- VPCピアリング

試験会場の近くのカフェでさらっとBlackbeltに目を通しました。
Direct Connectは使ったことなくてイメージしにくいところはあったものの、AwsのVGW使ってVPNを確立させてみたことはあったのでその知識が役に立った。
じゃないとBGPとかわかんないしね。

あとはだいたい持ってた知識でいけたんだけど、あえていうのであればVPCフローログ周りかな。

## 試験
なんかみたことあるような問題が多くて45分で全部解けてしまった。（しかしハイスコアだったとは言ってない）
**専門知識** のしょっぱなからある試験だし、機械学習とかビックデータに比べると信頼できる情報が多いですね。
これについてはudemy様々です。
udemyは値引きの時に利用するのが基本ですので、上手に使いましょう。いつも2000円とかそのくらいでコース買ってます。いずれ受けるやつを安い時にとりあえず買っておいたりとか。
userSettingsとapplicationSettings

## (アプリケーション名).exe.Configの中身について

- Settings.settingsから編集する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252335/8949c5ec-1dc7-afce-9a69-3aecb6f31466.png)

- スコープは、ユーザーとアプリケーションがある。ユーザは書き換えが可能、アプリケーションは固有。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252335/0de31c24-fb1f-a9c8-823d-32adeda64016.png)

- ユーザの場合、userSettings内に記載され、アプリケーションの場合は、applicationSettingsに記載される。

```c#:xxxx.exe.Configの中身
    <userSettings>
        <WindowsFormsApp1.Properties.Settings>
            <setting name="Setting1" serializeAs="String">
                <value>aaa</value>
            </setting>
        </WindowsFormsApp1.Properties.Settings>
    </userSettings>
    <applicationSettings>
        <WindowsFormsApp1.Properties.Settings>
            <setting name="Setting2" serializeAs="String">
                <value>bbb</value>
            </setting>
        </WindowsFormsApp1.Properties.Settings>
    </applicationSettings>

```

## userSettings

``` c#:読み出し
textBox1.Text = Properties.Settings.Default.Setting1
```

Save()で設定した値を保存する。

``` c#:値の設定と保存
// 値の設定
Properties.Settings.Default.Setting1 = "a"
// 全部まとめて保存
Properties.Settings.Default.Save();
```

``` c#:デフォルト値に戻す
Properties.Settings.Default.Reset();
```

- 保存先は、C:\Users\(ユーザ名)\AppData\Local\(アプリケーション名)\xxxxxx\user.config にある。
- デフォルト値は、(アプリケーション名).exe.Config

## applicationSettings
- 読み出しの方法はuseSettingと同じだが、保存ができない。

## (メモ) 1つの設定値に複数の値を設定する
カンマで区切って文字列として設定しておき、Splitで分離する。
 
``` c#:xxxx.exe.Config
<setting name="Setting1" serializeAs="String">
  <value>aaa,bbb,ccc</value>
</setting>
```

``` c#
comboBox1.Items.AddRange(Properties.Settings.Default.Setting1.Split(','));
```

## 参考
- [C#でアプリケーション設定を取得・保存する、いくつかの方法](https://seraphy.hatenablog.com/entry/20120708/p1)
- [Visual Studioでアプリケーションの設定を保存する](https://dobon.net/vb/dotnet/programing/mysettings.html)
メモ①

```pyrhon:test.py
# coding:utf-8

import os
import shutil
import sys

"""
no_args：all
be_args：ID or date or lopg.level
"""
DIST_DIR = '/出力先'


def main():
    args = sys.argv

    # Noneオプションを設定
    for index, item in enumerate(args):
        if args[index] == 'false':
            args[index] = None

    # カレントディレクト配下を検索
    try:
        for root, folders, files in os.walk('test'):
            for file in files:

                # ターゲットファイル
                isTarget = False

                # ファイル名と拡張子を分離
                name, extension = os.path.splitext(file)

                # .logのみ出力対象とする
                if extension == '.log':
                    # コピー元ファイルのフルパスを取得
                    base_file = os.path.join(root, file)

                    # オプション判定様にパスを分解
                    split_base_path = base_file.split('/')

                    # IDオプションの設定
                    if args[1]:
                        if args[1] == split_base_path[1]:
                            isTarget = True

                    # 日付オプションの設定
                    if args[2]:
                        if args[2] in split_base_path[3]:
                            isTarget = True
                        else:
                            isTarget = False

                    # Log.Levelオプションの設定
                    if args[3]:
                        isTarget = False
                        with open(base_file, 'r') as file:
                            line = file.readline()
                            if args[3] in line:
                                isTarget = True

                    # 設定したオプションに合致するファイルをターゲットフォルダにコピー
                    if isTarget:
                        result_file_name = split_base_path[1] + '_' + split_base_path[3]
                        result = DIST_DIR + str(result_file_name)
                        print(base_file + ' ==>> ' + result)

                        # 出力
                        shutil.copy2(base_file, result)
    except Exception:
        print('ファイルのコピーに失敗しました')

if __name__ == '__main__':
    print('#########  処理開始  #########')
    main()
    print('#########  処理終了  #########')



```
【React】超カンタンなSPAサイトを一通り作成してみて

#経緯
フロントエンドエンジニアとしてキャリアチェンジするにあたって、React.jsでのポートフォリオ作成に取り組む過程で、中でも一番興味があり、尚且つはじめに取り組むのに比較的カンタンなSPAサイトを作成してみました。

#注意
あくまで、初学者が自分用のメモ、もしくは同じく同等のレベルの初学者方の参考に少しでもなればと思い投稿いたしますので、中級者異常の方にとってはあまり参考にならない記事となっておりますので、ご了承ください。

#今回のディレクトリ構成
directory
 　ーApp.js
 　ーindex.js
 　ーcomponents
  　　ーHeader
   　　　ーHeader.jsx
   　　ーTop
　　　ーTop.jsx
 　　ーimg
　　　ーreact.png
あくまで、わかりやすいように今回の記事で解説する部分のみ表示しています。

#個人的につまづいたポイント
1. 各コンポーネント同士の連携
2. 画像の読み込み
3. .jsxはHTMLではなくてXML
4. 階層構造

#1. 各コンポーネント同士の連携
今回のポートフォリオを作成するにあたって、表示したいページごと単位だけではなくてHeaderやFooterもコンポーネントで作成してみました。
その際に、一般的なサイトと同様にHeader部分にナビゲーションを入れて、各ページに遷移することを試みました。
それにあたって、Header.jsxに非同期処理でのページ遷移を行うためのRouterタグ等を、以下のように予め用意しておきます。

```react:Header.jsx
import React from 'react';
import {
    Route,
    Link
  } from "react-router-dom";
  import Top from '../Top/Top';

function Header() {
  return (
    <div>
     <Router>
      <nav>
      <ul>
        <li><Link to="/">top</Link></li>
      </ul>
      </nav>
      <Route path="/" exact component={Top} />
    </Router>
    </div>
  );
}

  export default Header;
```

そして、このHeaderコンポーネントを受けるApp.jsには以下のように読み込みを行います。
ただ、私が個人的に勘違いしていたポイントとして、このHeaderコンポーネントを受けるApp.jsにも以下のようなimportが必要と思い混んでいたため、、

```react:
import {
    HashRouter as Router,
    Route,
    Link
  } from "react-router-dom";
```

このようなエラーメッセージが出てしまいました。
既にHeader.jsxでimportされているため、重複してしまっていますよというメッセージですね。
<img width="1053" alt="スクリーンショット 2020-03-29 7.54.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/602592/c6fa5d0b-19d8-55f3-bf22-ae81b2380299.png">


App.jsではこのようにシンプルで問題ありません。

```react:App.js
import React from 'react';
import './App.css';
import Header from './components/Header/Header';

function App() {
  return (
    <div>
      <Header />
    </div>
  ); 
}


export default App;
```


#2. 画像の読み込み
画像の読み込みなんて、そんなところでつまずくわけないだろ笑って言われちゃうかもしれませんが、ここで個人的にはだいぶ時間を取られてしまいました。
その要因としては画像もimportしなければいけないということ。
入力方法としては以下の通り.

```
import Src from '../../img/react.png'
.
.
.
<img className="img" src={Src} alt="Src" />
```
そして、import後にはimgタグでこのように入力すれば問題ありません。


#3. .jsxはHTMLではなくてXML
ここが一番のカルチャーショックだったのですが、これまでHTMLでのコーディングしか経験がなかったため、XMLでのコーディングの作法とは若干異なる部分でやられました。
具体的にはbrやimgのような閉じタグのないようなものです。

```
//HTMLでの書き方
<br>
<img>

//XMLでの書き方
<br/>
<img/>

//閉じタグがないとこんな感じのエラーが出てしまいすよ
Parsing error: Expected corresponding JSX closing tag for <img>
```

とまあ、こんなことかよ！
と思われるようなことでも、XMLのカルチャーがない人間にとっては全くの想定外なので気をつけたいですね。



#4. 階層構造
これはシンプルに考え方や感覚、経験の問題なのですが、意外と気がつかなかったりもするので気をつけましょう。
参考記事を添付いたします。
（http://w-d-l.net/html__course__high_level_link/ ）


#最後に
ここまで、超初歩的なミスをまとめた記事を作成しましたが、自分にとっての振り返りとしてのみではなく、これから勉強される方にとっても何かしらの参考になれば幸いでございます。
復習

https://qiita.com/4npei/items/a6d4e2179c3a9a25c775

root メソッド
ルーティングにおいて、ルートパスにアクセスした際に呼び出すコントローラーやアクションを指定することができるメソッド。以下のようにto:と共に記述

root to: 'コントローラー名#アクション名'


エラーコード「404」
「404」もとい「404 not found」は、クライアントからのリクエストしているページをWebサーバーが見つけられなかった時に返すコード。Webサーバーに「あなたが見たいページ、探したけど見つからないんですけど、ほんとにあるの？」と言われている状態
テキストエディタでtkinterモジュールを呼んでも期待通りに動かないエラー

# tkinterモジュールを呼んでも期待通りに動かない...
Pythonエンジニアとして今後たくさんの開発に携わりたいと考えてPythonを初めていざ、開発を行おうと参考書に基づいてtkinterモジュールを使用したアプリ制作を行おうと思いました。
しかしエラーが発生し、ウィンドウが開かない...

今までにPubyやPHPなどに触れてきたためエラーに直面することは慣れておりましたので早速エラーの内容を確認しようと思いました。
エラー文の一部には下記のような内容が書かれていました。

```
If this fails your Python may not be configured for Tk
```

しかしIDLEでは期待通りに動作するのにどうしてテキストエディタだと動作しないのか？


つまり**わたしのPC(Mac)にTcl/Tkが内蔵されていない**ということだと思いました。


## PATHの問題？

```
$ ls -al /usr/bin/wish*
$ which wish
$ echo 'puts $tcl_version;exit 0' | wish
$ echo $PATH
```
こちらをターミナルで試しその出力結果が下記になります！


```
ChisakinoMacBook-Pro:~ Chisaki$ ls -al /usr/bin/wish*
lrwxr-xr-x  1 root  wheel    7  9 21  2018 /usr/bin/wish -> wish8.5
-r-xr-xr-x  1 root  wheel  127  8 18  2018 /usr/bin/wish8.5
ChisakinoMacBook-Pro:~ Chisaki$ which wish
/usr/bin/wish
ChisakinoMacBook-Pro:~ Chisaki$ echo 'puts $tcl_version;exit 0' | wish
8.5
ChisakinoMacBook-Pro:~ Chisaki$ echo $PATH
/Users/Chisaki/.pyenv/shims:/Users/Chisaki/.pyenv/bin:/Library/Frameworks/Python.framework/Versions/3.7/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/Users/Chisaki/.pyenv/shims:/Library/Frameworks/Python.framework/Versions/3.8/bin:/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/opt/mysql@5.6/bin:/Users/Chisaki/.rbenv/shims:/usr/local/opt/mysql@5.6/bin:/usr/local/opt/mysql@5.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
```

## 古いバージョンのTcl/Tkが有効になっていたΣ（・□・；）

出力結果から**新たにPythonをアンインストールして最新のtcl/tkが内蔵されるようにして、再びインストールを行う**ことを考えました。

```
$ pyenv uninstall 3.7.6
```
```
$ env \
  PATH="$(brew --prefix tcl-tk)/bin:$PATH" \
  LDFLAGS="-L$(brew --prefix tcl-tk)/lib" \
  CPPFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PKG_CONFIG_PATH="$(brew --prefix tcl-tk)/lib/pkgconfig" \
  CFLAGS="-I$(brew --prefix tcl-tk)/include" \
  PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I$(brew --prefix tcl-tk)/include' --with-tcltk-libs='-L$(brew --prefix tcl-tk)/lib -ltcl8.6 -ltk8.6'" \
  pyenv install 3.7.6
```
```
$ pyenv global 3.7.6
```

上から順番にこれらを実行したところテキストエディタでtkinterモジュールを呼んで動作することが確認できました^_^
デプロイ後、動作確認でエラーが出た！！エラー確認方法

# はじめに
Qiita初投稿です。
プログラミングを初めて3ヶ月になる初学者です。
初めてデプロイ自分でしたので、その後のエラー対処がわからず躓きました。メモがわりに記述していきます。

# エラー
ローカルではうまく動作していた。
しかしデプロイ後、見れていたはずのページでエラーが、、、
[![Image from Gyazo](https://i.gyazo.com/8183977ad4011bf9f6e295e898cdcb9c.png)](https://gyazo.com/8183977ad4011bf9f6e295e898cdcb9c)
加えて、何が原因のエラーなのかが分からない、、、
ちなみにAWSでデプロイしています。

# 本番環境でのエラー確認方法
　1. EC2にssh接続する
　2. $ `cd /var/www/アプリケーション名`
　3. $ `cd current`
　4. $ `less log/production.log`を実行する。
　 [![Image from Gyazo](https://i.gyazo.com/471c91204f36c9c492187939b9eb5079.png)](https://gyazo.com/471c91204f36c9c492187939b9eb5079)
すると今までのログが表示されるので、エラー箇所を探す。
今回のエラー箇所は下から２行目の
` ActionView::Template::Error (Asset was not declared to be precompiled in production.`
となります。
簡単にエラー文を訳すと**assetがプリコンパイルされていない**みたいなこと。

#アセットパイプラインとは
Ruby on Railsのアプリケーション内で使用したいJavaScriptやCSS、画像ファイルを「開発作業がしやすいようにファイルを分割してコーディングができるようにしつつ、最終的に一つのファイルに**連結・圧縮**する」仕組み。
つまり、JavaScriptやCSS、画像ファイルがHTML化されたファイルとひも付いてからWebブラウザ画面上に表示されるようになる。
**本番環境ではこのアセットパイプラインが自動で通ってくれないため、手動で設定する必要がある。**

#エラーの修正
エラー文の次の行に
Add `Rails.application.config.assets.precompile += %w( items/new.js )` to `config/initializers/assets.rb`
と解決方法が書かれていた。
この文章の通り
`config/initializers/assets.rb`ファイルに
`Rails.application.config.assets.precompile += %w( items/new.js )`の記述を加えることで解決した。

# おわりに
アセットパイプラインのエラーはよくあるらしい、、
初のデプロイ後のエラーで少し焦っていましたが、エラー文さえ見つけることができれば、なんとか解決できると思います。
***
＊間違っていたらすいません。
# 参考URL
[Rails初学者がつまずきやすい「アセットパイプライン」](https://www.transnet.ne.jp/2016/02/28/rails%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8Dcolnr%E3%80%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3/)
[初学者のメモ　デプロイ後のエラー文を確認する方法](https://qiita.com/mailok1212/items/b2b3f97a2cdec822b672)
laravelのbladeでapp.phpにエイリアスを定義せずにconst使う


app.phpにエイリアス定義したくなかった系です。

```php:blade
@php
use App\Enums\HogeCode;
@endphp

{{HogeCode::teacher}}
```

```php:HogeCode
<?php

namespace App\Enums;

final class HogeCode
{
    // 定数メンバ
    const student = 1;
    const teacher = 2;

    // key/valueの連想配列
    const enum = [
        self::student=>'生徒',
        self::teacher=>'先生',
    ];
}
```

## 参考

* [任意のClassに書いた定数を、bladeから呼び出す【52日目】 - エンジニアのひよこ_level10](https://www.nyamucoro.com/entry/2017/12/04/211921)

* [Laravelで定数をつかうよ - Qiita](https://qiita.com/clustfe/items/4fa169c6d5114a9b6f4e)
    * Laravelでconst使う時の別パターン
        * configを使う方法
        * config/app.phpでalias切って使う方法
VSCodeからRemote SSHで接続しようとすると「UNPROTECTED PRIVATE KEY FILE!」と言われる場合の対処法 (windows10)

# VSCodeからRemote SSHで接続しようとすると「UNPROTECTED PRIVATE KEY FILE!」と言われる場合の対処法 (windows10)

## 背景
2020年3月28日、昨夜まで接続できていたAWS環境に突然繋がらなくなった。
自動更新を有効にしているとこういった理不尽がしばしば降りかかる。

接続時に出てくるエラーは以下。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\Users\\ユーザー名\\.ssh\\秘密鍵名.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\Users\\ユーザー名\\.ssh\\id_rsa": bad permissions
```

## 結論

1. 秘密鍵ファイルを右クリックしてプロパティを表示
2. 「セキュリティ」タブの「詳細設定」から継承の無効化を選択
3. 「継承されたアクセス権をこのオブジェクトの明示的なアクセス許可に変換します。」を選択し「OK」
![fig1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296916/c339d276-fccc-3bbf-66fd-3ce5a6ac97b7.png)
4. 再度「セキュリティ」タブの「編集」から自身以外のユーザーを削除して「OK」
![fig2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/296916/a8a1935d-0f91-b21e-9c6c-a4f05baef3fd.png)
5. この状態で接続を試す

## おわりに

「ユーザーディレクトリ配下に秘密鍵を置けば良い」と思っていたが、突如それでは機能しなくなってしまった。
同じ現象に悩んでいる人の助けになれば幸いです。
Yiiの拡張機能schedulingを使ってみた

## 導入

1. composer.jsonの `require` に `"omnilight/yii2-scheduling": "*"` を追加

    ```json:composer.json
    "require": {
        ...,
        "omnilight/yii2-scheduling": "*"
    },
    ```

1. `composer update` を実行
1. `console/config` に `schedule.php` を作成し、cronに設定する処理を記述
1. 以下のcronを設定

    ```
    * * * * * php yiiコマンドが実行できるpath schedule/run --scheduleFile=schedule.phpがあるpath 1>> /dev/null 2>&1
    # 例) /var/www/html/app にyiiのプロジェクトがある場合
    php /var/www/html/app/yii schedule/run --scheduleFile=/var/www/html/app/console/config/schedule.php 1>> /dev/null 2>&1
    ```

## schedule.phpでできること
### 時間指定

| 内容       |     関数   | crontabでの意味 | 備考 |
|:-----------------|:------------------|:---|:---|
| 毎分 | everyMinute() | * * * * * ||
| N分おき | everyNMinutes($minutes) | */N * * * *||
| 5分おき | everyFiveMinutes() | */5 * * * *||
| 10分おき | everyTenMinutes() | */10 * * * *||
| 30分ごと | everyThirtyMinutes() | 0,30 * * * *||
| 毎時(0分実行) | hourly() | 0 * * * * ||
| 毎日(0時実行) | daily() | 0 0 * * * ||
| 毎月(1日実行) | monthly() | 0 0 1 * * ||
| 毎年(1/1実行) | yearly() | 0 0 1 1 * ||
| 1時と13時実行 | twiceDaily() | 0 1,13 * * * ||
| 時間指定 | dailyAt('19:30') |  30 19 * * *  |引数は10:00,19:30などを渡す|


### 曜日指定
| 内容       |     関数   | crontabでの意味 |
|:-----------------|:------------------|:---|
| 月曜日 | mondays() | * * * * 1 |
| 火曜日 | tuesdays() | * * * * 2 |
| 水曜日 | wednesdays() | * * * * 3 |
| 木曜日 | thursdays() | * * * * 4 |
| 金曜日 | fridays() | * * * * 5 |
| 土曜日 | saturdays() | * * * * 6 |
| 日曜日 | sundays() | * * * * 0 |
| 月〜金 | weekdays() | * * * * 1-5 |
| 曜日と時間指定 | weeklyOn(5, '17:30') | 30 17 * * * 5 |

### カスタム
| 内容       |     関数   | crontabでの意味 |
|:-----------------|:------------------|:---|
| カスタム | cron('* * * * * *') | * * * * * |

## 例) schedule.php

```php:schedule.php
$schedule->exec('ls')
->everyMinute()
->sendOutputTo(Yii::getAlias('@app')  . '/schedule.log')
->description('lsコマンドの実行');

$schedule->command('sample')
->everyMinute()
->sendOutputTo(Yii::getAlias('@app')  . '/sample.log')
->description('SampleControllerのactionIndexの実行');

$schedule->command('sample/view')
->everyMinute()
->sendOutputTo(Yii::getAlias('@app')  . '/sample-view.log')
->description('SampleControllerのactionViewの実行');
```

## メリット
- cron処理のgit管理ができる
- cron変更時のオペレーションミスを減らせそう<br>
    - `crontab -e` と `crontab -r`の打ち間違いなど

## デメリット
- cron処理の実行時間やタイミングの変更のたびにリリース作業が必要。
- schedule.phpでやること/やらないことを決めておかないと複雑になりそう。

## GitHubリポジトリ
[omnilight/yii2-scheduling](https://github.com/omnilight/yii2-scheduling)
[Docker] PHP 5.6 + MySQL 5.6の環境をDockerで作る方法

# PHP 5.6 + MySQL 5.6の環境をDockerで作る方法

こんにちは、ITエンジニアの田中です。
今回は、PHP 5.6 + MySQL 5.6の環境をDockerで作る方法を説明します。

## この記事の対象者

PHP7.4がすでにリリースされているこの2020年に、
2014年8月28日リリースされたPHP5.6の環境が必要になった希少なあなたに向けて書いた記事です。
過去のアプリケーションのリファクタリングをするときには有益です。

## 構築される環境

- PHP 5.6.40
- Apache/2.4.25 (Debian)
- mysql Ver14.14 Distrib 5.6.47

## 前提環境

- dockerインストール済み

私の環境
- mackbook

## フォルダ構成

```
root/
　├ app/
　│　└ public (Web公開されるパス)
　├ config/
　│　└ php/php.ini (phpで使用する設定ファイル)
　├ data/ (mysqlのデータ)
　├ initdb.d (コンテナーを作成するときに実行されるSQL)
　└ docker-compose.yml
　└ Dockerfile
```

## Apache設定ファイルを取得・変更

Apacheの設定を変更し、公開フォルダを変更します。

■ 変更前
/var/www/html

■ 変更後
/var/www/html/public

下記の記事を参考にしてください。
https://qiita.com/eidera/items/19decbfc290b4776cfc3

## Dockerfileの作成

下記のDockerfileの内容をコピーして作成してください。

```
FROM php:5.6-apache

# PHPのインストール
RUN apt-get update \
    && apt-get install -y \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libmcrypt-dev \
        libpng-dev \
        openssl libssl-dev \
        libxml2-dev \
    && docker-php-ext-install -j$(nproc) iconv mcrypt pdo_mysql mbstring xml tokenizer zip \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install mysql \
    && pear channel-update pear.php.net \
    && pear upgrade-all \
    && pear config-set auto_discover 1 \
    && pear install DB 

# apacheのrewriteを有効にする
RUN cd /etc/apache2/mods-enabled \
    && ln -s ../mods-available/rewrite.load

COPY /config/php/php.ini /usr/local/etc/php/php.ini

WORKDIR /var/www/html
```

## docker-compose.ymlの作成

下記のdocker-compose.ymlの内容をコピーして作成してください。

```
web:
    container_name: web
    build: .
    ports:
     - "80:80"
    environment:
      # bargeでは、/usr/local/binも追加しておかないと起動できない。
      PATH: ${PATH}:/usr/local/bin:/root/.composer/vendor/bin
    volumes:
      - ./app:/var/www/html
      - ./config/apache2/sites-available:/etc/apache2/sites-available
    links:
      - db

db:
    image: mysql:5.6
    container_name: mysql5.6
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --init-connect="SET NAMES utf8" --innodb_file_per_table=1 --innodb_file_format=BARRACUDA
    environment:
        MYSQL_ROOT_PASSWORD: rootpassword
        MYSQL_DATABASE: libary_beauty
        MYSQL_USER: local
        MYSQL_PASSWORD: password    
    volumes:
        - "./data:/var/lib/mysql"
        - "./initdb.d:/docker-entrypoint-initdb.d"
    ports:
        - "13306:3306"
```

## テスト用のPHPファイル

下記のtest.phpの内容をコピーして作成してください。
そして、app/publicの下に置いてください。

```
<?php
  echo "<h1>これはテストです！</h1>";
```

## buildして起動

```
> docker-compose build
> docker-compose up
```

## テスト実行

下記のURLにアクセスしてください！
http://localhost/test.php

太字で表示されれば成功です！

私の環境での表示イメージをです！
![FireShot Capture 052 -  - localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282387/f28e7a97-3db1-9068-91e6-49a83fe937fd.png)

## 終わりに

わかりにくい部分があれば、コメントください！

これからも役立つ情報を公開していくのフォローお願いします！
HTML+JavaScript だけで バイナリダウンロードしてみるテスト、「月日＋曜日から西暦を、マクロを使わずにEXCEL計算式のみで判別・計算する 車輪の再発明 (xlsx)」

## 長過ぎるタイトルに飽きた方は、以下をダウンロード😲

月日＋曜日から西暦を判別、または、年月日から曜日計算できます。
マクロを使っていないので、ダウンロードして使っても安心ですよ。

Qiita に JavaScript を 埋め込んでみたかったんだけど、これだと 結局 CodePen依存なので、あんまり意味ないので、
任意のバイナリファイルを JavaScript に 埋め込んで、HTML+JavaScript だけで ダウンロードさせるテスト。
何の意味があるかは 人それぞれってことで😁

以下から、ダウンロードできます。
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="skurioka" data-slug-hash="eYNbjQY" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="eYNbjQY">
  <span>See the Pen <a href="https://codepen.io/skurioka/pen/eYNbjQY">
  eYNbjQY</a> by Kurioka Shinya (<a href="https://codepen.io/skurioka">@skurioka</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

![Screenshot 2020-03-29 at 12.06.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273671/6a09f9c2-8a00-1ee2-7336-c7f29718ce98.png)
バグに気付いた人は、プログラミングに向いていますね！😁

参考記事：
<a href='https://qiita.com/Qiita/items/edae7417214c8e957f54'>Qiitaで記事にCodePenが埋め込めるようになりました</a>
<a href='https://qiita.com/kareharide/items/93f0257ee5c31e239e63'>JavaScriptでバイナリを扱いたい</a>
ウォーターフォール開発経験の長いチームにアジャイル開発を体験してもらった

# 概要
ウォータフォールでの開発経験が長いチームメンバにて、アジャイル開発推進プロジェクトとしていくつかのアジャイル開発のプラクティスをレクチャーし、その感想を伺いました。

# メンバの現職ではどのようにプロジェクトを進めているか
* 機能単位のタスクを出して見積もりを行う
* 線表(スケジュール)を引く
* 基本的にスケジュール通りに進めていく
* 遅れが出たら別部署から助けを借りる、人を増やす、お客さんと調整を行う
* 「この人はこの機能を担当」という風に分担し、個人でコーディングを進めていく(他の人がどんなプログラムを書いているかは全く見えない)
* 基本的にその部署が今までやってきた案件をとってくるため「なにこれ」という仕事はこない

# メンバが感じているウォーターフォールの良いところ/悪いところ
## 良いところ
* 得意な案件を慣れた手順で開発していくため、不安なくプロジェクトを進めることができる
* 「こういうものを作りたい」という設計書がコーディング段階で明確になっているのでストレスがない

## 悪いところ
* 工程が進めば進むほど変更があると手戻りが大きくなるため変更に弱い
* 他の人の進捗が見えにくいため、できない人が進んでいるか心配になる

# 導入したプラクティス
* スプリントを区切ってのスクラム開発
* カンバンによるタスク管理
* テスト駆動開発
* ペアプログラミング
* リファクタリング
* ストーリーポイントによる見積もり

## スプリントを区切ってのスクラム開発を導入しての感想
* 一番価値があると思う機能だけを設計してすぐにコーディングをするので、PlanからDoまでのスパンが短いのが良いと思った。ウォーターフォールだと全てをPlan(設計)してからじゃないとDo(コーディング)できないので検証するには遅い。

## カンバンによるタスク管理を導入しての感想
* タスクの粒度が小さく慣れなかったが、タスクが小さいとそれに集中して作業できてよかった
* 誰が今なにをやっているか、が可視化されて進捗の不安がない

## テスト駆動開発を導入しての感想
* 少しずつ形になっていくのが面白い
* テスト仕様書やテスト報告書を納品物として求められた時にテスト駆動開発は相性が悪そう
* テストが仕様書のように振る舞うのはすごく面白いと思うので、お客さんから理解を得られるならば積極的に取り入れたい

## ペアプログラミングを導入しての感想
* 困りごとがすぐ解決してやりやすい(一人で悩んでいる時間が減る)
* コーディングしている時間よりも、考え事をしていたり調べごとをしている時間が長いので、ペアプロにしても生産性はほとんど下がらないと思った
* 人月計算と相性が悪そう
* 現職ではみんなでコーディングしようという雰囲気が一切ないため導入は心理的障害がありそう

## リファクタリングを導入しての感想
* ウォーターフォールでは作って終わりであるケースが多いため、リファクタリングをする動機はあまりない
* 綺麗なコードである必要はない。動けばヨシ！
* やった方がいいことは分かる
* アジャイル開発は仕様変更が当たり前にやってくるので、コードベースを変化が受け入れられる体制にしておくことは重要だと思った

## ストーリーポイントによる見積もりを導入しての感想
* 感覚で見積もるよりも精度が高かった
* スプリントをこなすごとに精度が改善されていくのを体験できた 

# まとめ
ウォーターフォールによる開発は、「今までやってきて慣れた案件をやる」という意味では非常に効率的に作用します。IT業界に落とされた案件が分解あるいは丸投げされて個々の組織の得意領域で引き受け、定型化された作業で実現されていくことでシステム開発がなされています。
アジャイル開発はそれを全て取って代わるかというと自分はそうではないと考えています。アジャイル開発で行う方が効率が下がることも多々あるでしょう。
一方で、ウォーターフォール開発は変化に弱いことが明らかになり、その場にいる現場のPGの方々も仕様の変化に対して脆弱であることを認識しています。
時代の流れとして、「ユーザがなにを求めているか分からない。とりあえず仮説を立ててやってみて、フィードバックを受けてプロダクトを成長させていこう」というやり方でやっていく重要性が増しています。
その際に、上記のようなプラクティスは役に立つと思われます。
【python】日付を分割

時系列データを分析する際、タイムスタンプなどのカラムで
**「2016-12-17 09:59:17」**
というような形式で保存されている場合があります。
この形式から、機械学習で扱えるように、
**日付を年、月、日、時間、曜日に分割**する方法を掲載します。

今回は、下記のようなダミーデータを使用します。

```python:time.py
import pandas as pd
df = pd.read_csv('df.csv')
df.head()

# 出力
    patient	Last UpDdated
0	5.0	    2020-03-22 10:00:00
1	4.0	    2020-03-22 11:00:00
2	6.0	    2020-03-22 12:00:00
3	10.0	2020-03-23 10:00:00
4	3.0	    2020-03-23 11:00:00

df.info()
#出力
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 21 entries, 0 to 20
Data columns (total 3 columns):
patient          21 non-null float64
Last UpDdated    21 non-null object
dtypes: float64(2),　object(1)
memory usage: 800.0+ bytes
```

Last UpDated列の日付を分割します。
■順番
**①object型からdatetime64[ns]型に変換**
　　`pd.to_datetime(df['Last UpDdated'])`
**②.dt.〜で年、月、日、時間、曜日、を取得**
　　`df['Last UpDdated'].dt.month`

```python:time.py
df['Last UpDdated'] = pd.to_datetime(df['Last UpDdated']) # 型を変換
df.dtypes

# 出力
patient                 float64
Last UpDdated    datetime64[ns]
dtype: object

# 列「manth」追加
df['month'] = df['Last UpDdated'].dt.month
# 列「day」追加
df['day'] = df['Last UpDdated'].dt.day
# 列「hour」追加
df['hour'] = df['Last UpDdated'].dt.hour
# 列「week」追加
df['week'] = df['Last UpDdated'].dt.dayofweek
# Last UpDdatedを削除
df = df.drop(['Last UpDdated'],axis=1)

df.head()

#出力
	patient	month  day	hour  week
0	5.0	    3	   22	10	  6
1	4.0	    3	   22	11	  6
2	6.0	    3	   22	12	  6
3	10.0	3	   23	10	  0
4	3.0	    3	   23	11	  0
```

Last UpDated列の値を元に、月、日、時間、曜日列が追加されました！
曜日は０〜６のint型になっています。
20200329_Pythonによるデータ分析入門第２版の個人的まとめ

日本ディープラーニング協会主催 もくもく会 #5「オンライン学習リモートもくもく」の3時間を使って『Pythonによるデータ分析入門第２版』をまとめる。
(https://jdla.connpass.com/event/171304/)

【まとめようと思ったMotivation】
・仕事でデータ解析をやっているがまともに学んだことがないので一度体系的に学びなおしたい
・いつもQiitaにお世話になっているので恩返ししたい
・自分のやっていることのログを残したい＆共有したい

【英語全文_Official】
https://www.programmer-books.com/wp-content/uploads/2019/04/Python-for-Data-Analysis-2nd-Edition.pdf

【英語全文_GitHub】
https://github.com/chenomg/CS_BOOKS/blob/master/Python%20for%20Data%20Analysis%2C%202nd%20Edition.pdf

【Code】
https://github.com/nkimoto/pydata-book

【表示確認】

```python:qiita.py
df1 = DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'b'],
                 'data1': range(6)})
df2 = DataFrame({'key': ['a', 'b', 'a', 'b', 'd'],
                 'data2': range(5)})

df1.head()
```
JupyterLab で COVID19_simulator 作ってみた

# COVID19_simulator
コロナウイルスなどの感染シミュレーションを行うプログラムです。
- 言語: Python
- JupyterLab(.ipnyb)で開発しています
- ipycanvasというライブラリを使っています(結構インストールしにくいので注意)

## 元ネタ
- こちらの記事「[コロナウイルスなどのアウトブレイクは、なぜ急速に拡大し、どのように「曲線を平らにする」ことができるのか](https://www.washingtonpost.com/graphics/2020/health/corona-simulation-japanese/)」

ちょっとこれパラメータいじってみたいなーとか思ったのがきっかけです。
誰かNotebookで作ってくれないかなーと思って探したけど見つからなかったので作ってみました(・ω・)

## デモ
- [こちらのツイート](https://twitter.com/yasubeitwi/status/1241337020770684928) でデモしています。動画です。
自宅待機の割合を３段階で切り替えて、感染速度の変化具合を見ることができます。

## github
https://github.com/PythonBeginners/Meetup027_COVID19_simulator/

## ソース
- 01_ipycanvas_basic_usage.ipynb
ipycanvasのインストールを行います。Dockerでは上手く行かなかったのでMacで動作確認しています。

- 02_interval_timer.ipynb
アニメーションを行うために使用したタイマークラスの動作確認メモです。

- 03_simple_anim.ipynb
シンプルなアニメーションを実装してみたときの動作確認メモです。

- 04_ball_anim.ipynb
ボールをアニメーションさせる実装をしてみたときの動作確認メモです。

- 05_COVID-19_simulator.ipynb
こちらが作成したCOVID-19_simulatorになります。 
と言ってもカウント表示も実装しておりませんし、実装としては中途半端ですが。。。
プルリクお待ちしてます！

## 注意
ipycanvasが結構曲者ですので、インストール頑張ってください！ 
インストールが上手く行っても、最後のCOVID-19_simulatorではエラーが出たので、詳しくはNotebookのコメントを読みながら動かしてみてくださいmm

## 解決できない場合は
2020/03/28(土)にオンラインで行われた[PythonBeginners沖縄 #27](https://python-beginners-okinawa.connpass.com/event/171709/) でハンズオンを行った際にトラブルシューティングもしています。上記でも解決できない場合は [公式slack](https://join.slack.com/t/python-beginners-oki/shared_invite/enQtNDc0NTc2NjcwODE4LTk2NWU2MDk4MGQ5ZGM0MDI0MDcwMTk0ZGMwMDg3MmU2Njc3NjQ1YWM1ODIwNTI4YzU0M2IwMmMyMzVhZGJhNGI) の #general もご参照ください。
Cloud9でRailsのバージョンを変更する

# 環境
Cloud9

# 手順
Cloud9でRailsを動かそうとしたところ、最新の環境が入っているものと思いきや、デフォルトで入っているバージョンが5.0.0であった。

```cmd
$rails -v
Rails 5.0.0

$gem list rails
rails (5.0.0)
```

実は、5.2を利用したかったので、バージョンを上げる事とする。
バージョンを上げるには、最新のバージョンを追加でインストールして、既存のバージョンと同居させる事となる。古いバージョンが上書きされる事はありません。

```cmd
$gem install rails

$rails -v
Rails 6.0.2.2
```

インストールしたが、バージョンを指定しなかったので、この時点で最新のバージョンがインストールされる事となる。実は、5.2をインストールしたかったため、バージョンを指定して、再度、インストールする事に。

```cmd
$gem install -v 5.2 rails

$gem list rails
rails (6.0.2.2, 5.2.0, 5.0.0)

```

これで、３種類のバージョンが混在する事となったが、最新のバージョンは不要なので、このバージョンのみ削除する事とする。

```cmd
$gem uninstall rails -v 6.0.2.2
```
```cmd
$gem list rails
rails (5.2.0, 5.0.0)
```

削除されました。
だがしかし、アンインストールしたバージョンがまだ残っている。

```cmd
$rails -v
Rails 6.0.2.2
```
railtieをアンインストールする必要があったようです。

```cmd
$gem uninstall railties -v 6.0.2.2
Successfully uninstalled railties-6.0.2.2
```
これで、5.2の環境になりました。

```cmd
$rails -v
$Rails 5.2.0
```

# 補足
gem list railsコマンドは、gem list | grep railsでやっても、同じ結果とになります。

# 参考
https://yuruli.info/railsverup-rails-in-gem-on-aws-cloud9/
https://qiita.com/Hassan/items/eef26c870eb26a0c68e0
NNC Challengeに参加しました

###はじめに
こんにちは、Qiita初投稿のkaru_beeです。Neural Network Consoleを用いてPIXTAの写真素材を画像分類するNNC(Neural Network Console)Challengeに参加しました

###NNC Challengeとは？
以下のURLを参照してください。
https://nnc-challenge.com/

###学習データ提供
学習用データ提供：PIXTA 

###今回のテーマ
『画像内人物をNNCで学習させ画角/焦点距離による画像分類を作り出す』

###やったこと
####1．ダウンロードしたデータにアノテーション（タグ付け）する
本当にざっくりですけど、焦点距離で5つのクラスに分けます。

クラス0.望遠  ： 焦点距離 = 100mm
クラス1.広角  ： 焦点距離 = 28mm
クラス2.準広角： 焦点距離 = 35mm
クラス3.標準  ： 焦点距離 = 50mm
クラス4.中望遠： 焦点距離 = 85mm

焦点距離を調べるには、各画像ファイルのExifデータを見ます。
ファイル→プロパティ→詳細
![exif.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287637/9128831f-c22a-6767-9107-c4c38844e34f.jpeg)

NNCのアノテーションのやり方は、以下の動画に詳しく解説されています。
https://www.youtube.com/watch?v=v6Rr6IODwK4
アノテーションした５つの画像フォルダを、上記の動画の説明に従いNNCクラウドにアップロード。
最終的には10,000点のデータセットのうち、1クラス250枚を1セットとし1250枚をアノテーションして90:10でtrain test splitしました。


####2．画像分類モデルを作成する
非常にベーシックな構成のCNNです。
入力画像64*64*3chを、指定した5クラスに分類します。
![model.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287637/4c122eff-1335-2d05-4f2f-cdb33424b6b6.jpeg)


####3．結果
・学習結果
![gakusyu.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287637/ded276f8-5374-51a4-02be-0c4b732e3957.jpeg)

・検証結果
![ACCU.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287637/c26d862e-e762-7030-f2cb-04ace19a290b.jpeg)
![MATRIX.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287637/966cf04a-7531-f265-4816-f90d30617ca7.jpeg)
以上、いまひとつな結果となってしまいました。やはり、焦点距離だけで学習した画像を分類するのは、非常に厳しいようです。焦点距離以外にも何らかの特徴量を追加しなくてはならないようですね。

今回は残念ながら提出締め切り2日前なので、ここでギブアップです(笑)

####4．感想
・今回はNNCクラウド版のCPU10時間無料枠で実施し、有料版のGPUは使いませんでしたが、特に学習時間のストレスは感じなかったです。

・NeuralNetworkConsoleについては、これでもかというくらいコードを書かなくても良いように設計されています。GUI大好きな人ならお手軽にディープラーニングを始めることが可能です。
 
最後まで読んでくれてありがとうございました。
同じLAN環境にあるラズパイへのSSH接続

ラズパイにSSH接続する際、

- 有線接続するのは線の取り回しが面倒
- 自宅等に置いているが、外部持ち出しする可能性もあり固定IPにはしたくない
- ドメイン名を振ったりとかも面倒

といった理由から自宅LAN環境にてWiFiでのSSH接続をしたい。
ただ、ラズパイのIPアドレスは毎度変わる可能性があり困る

この条件での対応方法いくつかあるかも知れないけれど、
とりあえずはarp-scanコマンドでラズパイのIPアドレスを探してアクセスしています。

※ラズパイは起動時にLANに自動で接続するように事前に設定済みの想定。


## 1.arp-scanコマンドでラズパイのIPアドレスを探す
`sudo arp-scan -l --interface en0`

`sudo arp-scan -l `
でも可


```
$ sudo arp-scan -l --interface en0
Interface: en0, type: EN10MB, MAC: f0:18:98:25:c7:11, IPv4: 10.247.55.5
Starting arp-scan 1.9.7 with 256 hosts (https://github.com/royhills/arp-scan)
10.247.55.7	cc:f4:11:b3:cb:cb	(Unknown)
10.247.55.13	b8:27:eb:65:9f:ef	Raspberry Pi Foundation
:
```
のように表示されarp-scanだとMACアドレスの先頭からラズパイとわかる。


※Fingというスマホアプリを使うのでもよいかも。

## 2.ssh
IPアドレスが分かったら普通にssh

`ssh [user]@[ipアドレス]`

IDパスワードは各々設定しているもので。
ラズパイのデフォルトだと

```
ID: pi
PW: raspberry
```
のはずです。


`ssh pi@[ipアドレス]`
Swift MkMapViewで地図アプリ作成してみた（19）- UserDefaultsでデータをバックアップする

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)

#UserDefaultsでデータをバックアップする
###UserDefaultsとは
ユーザーのデフォルトデータベースへのインターフェイスで、アプリを終了しても消えない永続的なデータを保存できる。
簡単なので、ユーザの設定データなどちょっとしたデータを保存するのに良い。

###データをバックアップするクラスを作成する
データをバックアップするクラスを作成して、UserDefaultsの変数を宣言する。

```swift:
import Foundation
import UIKit

class UserDataManager: NSObject {
    // UserDefaultsを宣言する
    let userDefaults = UserDefaults.standard
```

クラス初期化時に、UserDefaultsのデータを初期化する。
maxSpeedをUserDefaultsで管理するものとする。

```swift:
// クラスの初期化
override init() {
    userDefaults.register(defaults: ["maxSpeed": 0.0])
}
```

###UserDefaultsからデータを読み込む
UserDefaultsから変数speedにデータを読み込む。

```swift:
// 保存したデータを読み込む
func roadData() {
    speed = userDefaults.object(forKey: "maxSpeed") as! Double
}
```

###UserDefaultsにデータを書き込む
UserDefaultsのmaxSpeedにデータを書き込む。

```swift:
// 保存したデータを読み込む
func saveData(_ speed: Double) {
    userDefaults.set(speed, forKey: "maxSpeed")
}
```
Xbyak_aarch64をRaspberry Pi3で動かす

# あらすじ
Armv8-A(AArch64)向けJust-In-Timeアセンブラ[Xbyak_aarch64](https://github.com/fujitsu/xbyak_aarch64)をRaspberry Pi3で動かしてみた。
Xbyak_aarch64はArmv8-AのAArch64 stateの命令でJITコードを組み立ててそれを動かせるOSSである。
もともとはArmv8-AなCPUを搭載したArmサーバで動かす用途に開発されたっぽい。
Xbyak_aarch64を動かすためには、AArch64 stateが動くCPUで、かつ、64ビットOSが動いていて、かつ、64ビットの実行ファイルをmakeできる環境が必要となる。試してないけど、たぶんAndroidスマホでも動くはず。

# 実行環境
## Hardware(ハードウェア)
Raspberry Pi 3 Model B Rev 1.2
CPUはBCM2835

## OS
```
$ uname -a
$ Linux ubuntu 5.3.0-1029-raspi2 #21~18.04.1-Ubuntu SMP Mon Feb 17 18:03:27 UTC 2020 aarch64 aarch64 aarch64 GNU/Linux
```
# 実行方法
- [Ubuntuのサイト](https://ubuntu.com/download/raspberry-pi)からRaspberry Pi3用の64-bit用のUbuntu 18.04.4 LTSをダウンロード。
- ダウンロードしたファイルを展開し、win32diskimagerでマイクロSDHCカードに書き込み。
- Internetにつなぐ必要があるため、Raspberry Pi3に有線LANケーブルを接続する。
- 書き込んだカードをRaspberry Pi3に差し込んで電源onして起動。
- プリセットされているアカウント(ID:ubuntu、Password:ubuntu)があるので、これでログイン(以降も同じ)。
- キーボード設定が英語キーボードになっていたのを日本語キーボードに変更する。

```
sudo dpkg-reconfigure keyboard-configuration
```

- 必要なパッケージをインストールするため、以下を実行。

```
sudo apt update
sudo apt upgrade
sudo apt install g++
```

- Xbyak_aarch64をダウンロードする。

```
git clone https://github.com/fujitsu/xbyak_aarch64.git
```

- サンプルプログラムをmakeしてみる。Xbyak_aarch64はc++11をサポートするため、オプションを付けておく。

```
cd xbyak_aarch64/sample
g++ -std=c++11 add.cpp
```

- サンプルプログラム(JITで「3+7」を実行するコードを組み立て、それを実行する)を動かしてみる。標準出力に7が出力され、JITコードが動いているっぽい。

```
./a.out
7
```
ファイルマッチング

ファイルAとファイルBのマッチングスクリプト
キーマッチしたレコードのみをファイルBから抽出

※ほぼ個人メモです。

```python
# -*- coding: utf-8 -*-

#　ファイルAとファイルBでキーマッチング
#　前提
#　　・ファイルAとファイルBのキーは昇順でソートされている
#　　・ファイルは固定長
#

# マッチングファイル名、出力ファイル名
fileA = "a.txt"
fileB = "b.txt"
fileOut = "out.txt"

# ファイルのレコードサイズ
recsizeA = 4
recsizeB = 8

# キー開始位置
keyposA = 0
keyposB = 0

# キー長
keysize = 2


#-----------------------------------------------
# 処理開始
#-----------------------------------------------
fpa = open(fileA, 'rb')
fpb = open(fileB, 'rb')
fpout = open(fileOut, 'wb')

reca = fpa.read(recsizeA)
recb = fpb.read(recsizeB)

# どちらかのファイルが読み取れなくなるまで繰返し 
while len(reca) == recsizeA and len(recb) == recsizeB :
    if reca[keyposA:keysize] == recb[keyposB:keysize] :
        fpout.write(recb)
        recb = fpb.read(recsizeB)
    elif  reca[keyposA:keysize] < recb[keyposB:keysize] :
        reca = fpa.read(recsizeA)
    elif  reca[keyposA:keysize] > recb[keyposB:keysize] :
        recb = fpb.read(recsizeB)

fpa.close()
fpb.close()
fpout.close()
        

```
【Laravel】アロー演算子の読み解き方

# はじめに
最近PHPやLaravelを学習し始めた僕ですが、オブジェクトのメンバ（メソッド、プロパティ）を取得する役割の**アロー演算子**について触れる機会が多くあり、読み解くのに苦労したので自分なりにまとめたいと思います。
初学者が故に間違っている点ありましたらご指摘いただけると幸いです。

# アロー演算子てなんぞや
`->`これです。
右辺に使いたいメソッドやプロパティ。左辺にそれらが置いてあるクラスを記述します。

具体的な使い方としては

```php
class PostController extends Controller
{
    private $post;

　　public function __construct(Post $instanceClass)
   {
       $this->post = $instanceClass; 
   }

    public function index () {
        $post = $this->post->all(); 
    }
}
```
`$this->post` PostControllerで定義した$postを呼んでる。呼び出す時＄は取る。
`post->all()` コンストラクタでPostモデルを$postに代入しているので、モデルクラスの返り値であるCollectionインスタンスのallメソッドを実行できる。
モデルクラスの返り値がなぜcollectionインスタンスかについては下記参照してください。
[Laravel 5.8 コレクション](https://readouble.com/laravel/5.8/ja/collections.html)

## 読み解くコツは返り値を把握すること
個人的にはそのメソッドがどういう処理を行って、どんな値を返すのかを一つ一つ読み解くのがポイントだと思います。
返り値を把握する方法は、みなさん大好きな`dd()`でコツコツとデバッグしていくのがベストです。

# 最後に
railsを学習してた僕からしたらアロー演算子の表記が違和感ありすぎて理解に苦しみました。
単純にオブジェクトのメソッドやプロパティを呼び出すために使用しているものだと考えれば、さくさく読めるようになると思います。
ひとつひとつのアロー演算子で区切られた処理を地道にddしていき、メソッドの返り値を理解することが、初学者にとっては最善の策だと思います。
CNCF News (03/23 - 03/27 2020)

### [Deployment Bottlenecks and how to tame them](https://www.cncf.io/blog/2020/03/23/deployment-bottlenecks-and-how-to-tame-them/) - March 23, 2020

- ```CNCF Member Post```
- デプロイに関するボトルネック、及びその扱い方についての記事。DevOps への移行への難しさに関して、テクノロジの問題とマネジメントの問題が絡んでいる。
- まず以下を確認しましょう
    - デプロイを保留しているチケット数
    - チーム内メンバが懸念していること、待っていること
- deployment を最適化するアプローチ
  1. CI/CD パイプライン
  2. [welve Factors](https://12factor.net/) に沿ったアプリケーションデザイン、特に [Disposability](https://12factor.net/disposability)
  3. [Canary Releases](https://martinfowler.com/bliki/CanaryRelease.html) のようなセーフティネットの活用

- デプロイのボトルネックを除去して価値を最大化するために
  1. 最も重要なタスクであること
  2. デプロイが万全に準備完了していること（テストやドキュメンテーション等について）

- WalkMe, LaunchDarkly, Rookout のようなツールを使用して、不必要な Deployment を避けましょう。

### ディスクレーマ

- ニュースの内容は私自身の理解ですので、正しい内容はリンク先をご確認ください。
- 認識齟齬、誤記などありましたらご指摘いただけますと幸いです。
Googleドライブでショートカット的なものを作る方法

#ショートカットとは何？
Windowsを使っている人は解ると思うが、実体とは別の場所におけるアレです。これがなかなか厄介だったりします。

#実際に作ってみよう
例えばGoogleDrive:\MyFile\唐沢貴弘\OnlyProject\CRN.mdファイルがあるとしてGoogleDrive:\MyFile\VVANを作ってそこからCRN.md開けたい。
GoogleDrive:\MyFile\唐沢貴弘\OnlyProjectで「***Ctr***+***Shift***+***CRN.md*の位置でタッチパッド(左)をドラッグ＆ドロップ**」で出来ます。たったこれだけです。
声に出して言ってみよう、「***Ctr***+***Shift***+***File*の位置で左タッチパッドをドラッグ＆ドロップ**」。
もう一回、ご一緒に、「***Ctr***+***Shift***+***File*の位置で左タッチパッドをドラッグ＆ドロップ**」。
覚えるまで、ご一緒に、「***Ctr***+***Shift***+***File*の位置で左タッチパッドをドラッグ＆ドロップ**」。
もう覚えたかな？
無理な場合もう一つ方法があります。
声に出して言ってみよう、「***File***にカーソルを合わせて**右タッチパッドを叩いてドライブにショートカットを追加**を選択。**目的の場所を選択**」
もう一回、ご一緒に、「***File***にカーソルを合わせて**右タッチパッドを叩いてドライブにショートカットを追加**を選択。**目的の場所を選択**」
覚えるまで、ご一緒に、「***File***にカーソルを合わせて**右タッチパッドを叩いてドライブにショートカットを追加**を選択。**目的の場所を選択**」
もう覚えたかな？
GoogleDrive:\MyFileにCRN.mdのショートカットをコピーして、名前を変更を選択、VVANと付ける。これで出来上がり。

##Googleドライブショートカットの(PCショートカットより)良い点
- 移動した場合でも移動先の場所を指してくれる(PCのように、あったのに動かないってことはない)。
- ゴミ箱に入れたファイルの場合、「ゴミ箱にあります。」と表記してくれる。

##Googleドライブショートカットの(PCショートカットより)悪い点
- 最初の方だと案外難しく２番目の場合，深層に置く場合大変(共有ファイル)。

#感想
基本的にPCよりショートカットも優れているような希ガス。積極的にGoogleドライブを使う方、ChromeBookを使う方は、これを覚えることが必須だと思う。Googleのサービスは使いこなせば使いこなすほど作業効率が上がるので是非皆さんも沢山使ってみよう。
『OAuth徹底入門』のサンプルコードについて

Node.js 8系 + Express等のフレームワーク・ライブラリで構成されています。OAuthの主要プレイヤー3種類（クライアント、認可サーバー、保護対象リソース）はそれぞれ独立したサーバになっており、http://localhost:9000, http://localhost:9001, http://localhost:9002 で動作します。それぞれ単一のJavaScriptファイルであることが多いです。

書籍中では独立したターミナルで起動するのが良いとしています。実際、トラブルシューティングのためにはそのほうがよいです。単に一つのターミナルで一括起動する場合には例えば次のような感じでbashスクリプトで起動はできます

```
#!/bin/bash

(
    trap "kill 0" SIGINT
    # TCP 9000
    (node client.js) &
    # TCP 9001
    (node authorizationServer.js) &
    # TCP 9002
    (node protectedResource.js) &
    wait
)
```

最近のNode.js、例えば本稿執筆時点での12系では動作しません。原著が2017年発行、ソースコードのメンテナンスはあまりされていない印象です。

`async/await` 前提の現在のコードとは異なり、現在では非推奨のライブラリ（例えば `sync-request`）や古いバージョンを使っています。

私自身JSまわりがあまり得意でない中で警備に修正をかけてみたのですが、サンプルコードとしては非本質的な対応を求められて、さらに何か「現代的には正しいけど読みづらい」コードになってしまうようでした。 `async/await` が最たるものですが `nosql` ライブラリを更新した際のインターフェース変更みたいなのも面倒そうでした（あまり調べてません）

一方、筆者のコードはProductionのコードとしては大NGなことを意図的にやっているところもあるため、JavaScriptの開発の参考になるわけでもありません。

よって、純粋にOAuthを勉強するのならNode.jsのバージョンは8に落として、ソースコードは動作する擬似コードくらいの認識でいるほうが良いようでした。

本格的にJS界隈でOAuthのコードを書くのなら書くで、本書のサンプルコードを見ずにフルスクラッチで書くようにした方が良いと思います（私の場合はPythonで書くことになるかな）

書籍の情報そのものは（もしかすると少し古いのかもしれませんが）OAuthの動作の仕様的・原理的側面の説明がしっかりされているのでオススメできるように思います。

一方、サンプルコードは（筆者も分かった上で）いまいち本番向けではないので、注意したほうが良いと思います。

「（筆者も分かった上で）」というのがまぁ大変そうで、実際アロー演算子やletなどを使わずに書いているのが印象的です。

＃ うーん……PythonであればPython3.5くらいをターゲットに構成すればこんなに変化はないと思うんですけどね……Node.jsの辛みを感じた気がしましたが気の所為？
railsを勉強し始める際に知った方がいいものメモ

# この記事の目的

- 対象：これからrailsを始める人
- 目的：railsの勉強してて当然のように出るよく分からん概念、言葉を網羅的に先に知っておく

# REST

この記事が分かりやすかったです

「REST理論をわかりやすく。」
https://qiita.com/geshi/items/5275cc9d089105625c5f

## railsにおけるREST

railsチュートリアル
https://railstutorial.jp/chapters/toy_app?version=5.1#cha-a_toy_app

railsチュートリアルのコラム2.2がわかりやすい。railsでのRESTはアプリケーションを構成するコンポーネントを下記に対応させること。

- RDBMSのCRUD（Create/Read/Update/Delete）
- HTTPRequestの各メソッド（GET/POST/PUT/DELETE）

## RESTなコンポーネントをすぐに作れるresourceとresources

### routesに記述

```routes.rb
Rails.application.routes.draw do
  resource :posts
end
```

これで下記が生成される。

<img width="889" alt="スクリーンショット 2020-03-29 10.31.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/166a2f37-7241-a32c-1b67-5b25e80c7c2d.png">

ちなみに単数の場合はresourceで複数のものを扱う場合、例えばshowが複数になるのを想定する場合はresourcesになる。

```routes.rb
Rails.application.routes.draw do
  resources :posts
end
```

で下記

<img width="881" alt="スクリーンショット 2020-03-29 10.33.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193389/6d1fc796-b10b-7ec3-5346-5068ba1a591d.png">


# MVC

「Railsの一連の流れをMVC,ルーティングの観点からまとめてみた」
https://qiita.com/s_tatsuki/items/66ffee4519451812a448

# Activerecord

「Active Record の基礎」
https://railsguides.jp/active_record_basics.html

activerecordはSQLをいい感じに翻訳してくれるもので例えばmysqlやpostgresqlなどsql自体が変わってもactiverecordが翻訳して伝えてくれる。
vistaでkicad

#概要

vistaでkicadやってみた。
ltspiceでネットリスト作って、kicadで読み込んでみた。

#環境

windows vista 32bit
kicad 4.0.4

#利用したライブラリー

https://github.com/Michifumi/PcbNetList

#ltspiceでネットリストを出力。

tools-export netlist-calay

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/89e2c5b1-7d1d-15e2-f055-e2f621d5abbe.png)



#calay.netに変更。


```
/N001     R1(1) R2(2) C1(1);
/in       R1(2);
/out      R2(1) C2(1);
/0        C1(2) C2(2);
```
#partlist.csvを書く。


```
Reference, Value, Footprint, Datasheet
"C1","0.1u","Capacitors_SMD:C_0603_HandSoldering",""
"R1","1K","Resistors_SMD:R_0603_HandSoldering",""
"C2","0.1u","Capacitors_SMD:C_0603_HandSoldering",""
"R2","1K","Resistors_SMD:R_0603_HandSoldering",""
```

#pcbnewで変換する。

ツールースクリプトコンソールを開く。
execfile("Any2kicad.py")

#pcbnewでネットリストを読み込む。

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2f45f5ef-ebbf-b950-f492-b5dd9a54b3d8.png)


以上。
JavaScriptの配列はクセが強い ～lengthを疑え～

ブラウザの開発者ツールで以下を確認してみましょう。

```js:最終的に6個の要素を持つ配列が出来そうなソース
a=[10]
a[5]=20
a
a.length
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42843/a4f64e42-22d4-3426-1db0-d94a538794d6.png)

`empty × 4` の部分が曲者で、実はこの部分には「要素は無い」。
a[1] を評価すると `undefined` になるので「aの1番目には `undefined` が入っている」かのように見えますが、正確には存在しないキーを指定されたから `undefined` になっただけです。

# それが何？

さて、例えば終端が不確定な配列データをグラフ上にプロットしたいとかの要件で「配列の長さを最低N個まで拡張する」という関数を作る場合、何も考えずに実装するとこういうソースになると思います。

```js
function fillUp(arr, length) {
  arr[length - 1] = arr[length - 1]; // 配列の長さがlength以上なら何も起こらず、未満ならundefinedが代入される事で配列の長さがlengthまで伸びる、ような気がする
  // a.length = Math.max(a.length, length) // こちらでも
}
```

冒頭のaを与えて `fillUp(a, 10)` を実行すると確かに `a[9]` に `undefined` は入るし `a.length` も10になります。
が、lengthが10だからといって10回ループする事を期待して `a.forEach()` を実行しても実際には3回しかループしません。

```js:
fillUp(a, 10)
b=a.length
a.forEach(() => --b) // bはゼロになるはず
b
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42843/27cc90b8-0fb2-985b-3611-522b6ef9e6f8.png)

更に、「undefinedの要素を別の値に置き換えた配列を作りたい」といった処理も失敗します。

```js:
a2 = a.map(v => v === undefined ? 'empty' : v)
a2[1] // 'empty'に…ならない！
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42843/f8a238c8-b8fa-7e19-cdd5-2769b22b2b81.png)

今aは具体的にはどういう状態か、以下で確認できます。

```js:
[...Array(a.length)].map((x,i) => ({index:i, exists: (i in a), value: a[i]}) )
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42843/d75cb93b-1041-c4d0-5535-9033c72fb751.png)

おわかりいただけただろうか。

# 紛らわしいので何とかしたい

万能薬は無い気がします。どなたかご存知なら教えてください。

参照する側で気を付けるなら `a.~` をやめて `[...Array(a.length)].map((x,i) => a[i]).~` を使います。面倒臭い！

```js:修正前
a.map(v => v === undefined ? 'empty' : v)
```

```js:修正後
[...Array(a.length)].map((x,i) => a[i]).map(v => v === undefined ? 'empty' : v)
```

データを作る側で対処するなら、地道に埋めたてます。

```js:修正前
function fillUp(arr, length) {
  arr[length - 1] = arr[length - 1];
}
```

```js:修正後
function fillUp(arr, length) {
  [...Array(length)].forEach((x,i) => arr[i] = arr[i])
}
```

# という事はpopも実際に代入されている値しか取り出さないのでは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42843/78a7ca30-4139-d020-9dfd-b3c3456d51c0.png)

あ、そこはlength準拠の挙動なんですね…。

# 番外編 - これは添え字？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42843/33c06635-595e-b71a-3022-2a6764e3f8a2.png)

a.lengthは1から変わらず、 "2.1" というキーの独自プロパティが生えただけでした。 `forEach` や `map` や `pop` も2.1には反応しません。「だからどうした？」とか言わない。
Swift MkMapViewで地図アプリ作成してみた（18）- 位置情報から速度、平均速度、最高速度を求める

#記事一覧
[Swift MkMapViewで地図アプリ作成してみた（記事一覧）](https://qiita.com/rain_00_00_09/items/3151b3faf2303fe78312)

#前提条件
[（02）- 現在位置を取得する](https://qiita.com/yuta-sasaki/items/18496f0f9aa1e89350e0)で取得した位置情報から、速度、平均速度、最高速度を求める。

```swift:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) {
    // この関数で受信した位置情報から、速度、平均速度、最高速度を求める。
    let lonStr = (locations.last?.coordinate.longitude.description)! // 経度
    let latStr = (locations.last?.coordinate.latitude.description)!  // 緯度
}
```

#位置情報から速度、平均速度、最高速度を求める
###速度を求める
locations.last!.speedで秒速が取得できる。
時速に変換したい場合は、以下の通りとなる。

```swift:秒速を時速に変換する
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) {
    // 秒速を少数第2位の時速に変換
    let speed: Double = floor((locations.last!.speed * 3.6)*100)/100}
```

###平均速度を求める
速度の合計値を受信回数で除算するとで、平均速度を求めることができる。

```swift:平均速度を求める
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) {
    // 平均速度の更新
    self.avgSumSpeed += locations.last!.speed
    self.avgSumCount += 1
    let tmpAvgSpeed = floor(((self.avgSumSpeed / Double(self.avgSumCount)) * 3.6)*100)/100
```

###最高速度を求める
単純に過去の最高速度を保存する。

```swift:最高速度を求める
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations:[CLLocation]) {
    // 秒速を少数第2位の時速に変換
    let speed: Double = floor((locations.last!.speed * 3.6)*100)/100}
    // 最高速度
    if speed > dMaxSpeed {
        dMaxSpeed = speed
    }
```
Dartのクラス

# Dartのクラス

DartのクラスはC#なんかとはいろいろと違うみたい。わからない事だらけ。

新しいことが理解できたら追記していくことにする。

```dart
class Person
{
	//-------------------------------------------------------------
	// Publicメンバ
	//-------------------------------------------------------------
	String firstName;
	String lastName;
	
	//-------------------------------------------------------------
	// Privateメンバ
	//-------------------------------------------------------------
	int    _age;
	
	//-------------------------------------------------------------
	// コンストラクタ
	//-------------------------------------------------------------
	// this + メンバ変数名の引数で、各メンバ変数に値を代入可能。
	Person(this.firstName, this.lastName)
	{
		_age = 0;
	}
	
	//-------------------------------------------------------------
	// 名前付きコンストラクタ
	//-------------------------------------------------------------
	Person.newBorn()
	{
		this.firstName = "名前はまだない";
		this.lastName  = "吾輩は人である";
		this._age      = 0;
	}
	
	//-------------------------------------------------------------
	// Call関数
	//-------------------------------------------------------------
	// インスタンス名で呼び出せる特殊な関数
	call()
	{
		return "$lastName $firstName, age $_age.";
	}
    
	// セッター
	void set age(int value) => _age = value;
	
	// ゲッター
	int get age => _age;
    
}

class Boxer extends Person
{
	double _weight;
	
	Boxer(String first, String last, double weight):
		_weight = weight,
		super(first, last);
	
	Boxer.newBorn():
		this._weight   = 48.0,
		super("I have no ring name yet", " I'm Boxer");

    // factoryを付けるとfactoryメソッドとしてインスタンスを返せる。
    factory Boxer.instance()
    {
        Boxer instance = new Boxer.newBorn();
        return instance;
    }

	Introduce() => "$lastName $firstName, age  $_age. I'm Boxer";
	
	void setAge(int value) => _age = value;
	void getAge() => _age;
    
    @override
    Call() {
    	return Introduce();
    }
}

main()
{
	Person man = Person("Take", "");
    man.age = 30;
	
	Boxer red_boxer = Boxer("Yuto", "", 15);
    //red_boxer.age = 7;							// 親クラスのセッターは呼べない？
	red_boxer.setAge(7);

	Boxer blue_boxer = Boxer.instance();
	blue_boxer.setAge(18);

	print(man());
	print(red_boxer.Introduce()	);
	print(blue_boxer());							// 子クラスのCall関数を呼べない？
	
}

```

```dart
// 実行結果
 Take, age 30.
 Yuto, age  7. I'm Boxer
 I'm Boxer I have no ring name yet, age 18.
```



[参考サイト]

>[Flutter入門のためのDart入門](https://qiita.com/teradonburi/items/913fb8c311b9f2bdb1dd)