OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング教育をサポートしよう！！

# 2020年度小学校プログラミング教育必修化
システム開発って難しいですよね。多くのプロジェクトが失敗して、なかなか成功しません。
たとえ、要件定義がうまくいっても、設計で失敗。実装まで漕ぎついても、出来上がったものが要件を満たしていないなんてことがよくあります。

# とある教科書の内容

とある教科書とその補足資料に示してあった人感センサーライトの例でおさらいしてみましょう。

## 要件定義
> 人が近づくと明かりがつき、しばらくすると消えるプログラムをつくり、発光ダイオードをつけたり、消したりしてみましょう。
![要件定義.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/ab711957-a93b-fef2-8557-74a3e224855c.png)

## 設計書
システムエンジニアのみなさん、このようなフローチャートのようなものを書いていませんか？
そもそもフローチャートって書きますか？
![設計図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/cd5d544d-1e1a-a278-faa3-0161722c6ccb.png)
「人勧センサー」の分岐で、「感知したら」の否定は「感知しなかったら」の方が良いと思います。なぜなら、「感知しなくなったら」というのは、感知している状態から感知していない状態へ遷移したことを示唆する表現になっていませんか。そうです、これらはいわゆるイベント（トリガー）のことですよね。
「感知したら」イベントと「感知しなくなったら」イベントを用意して、それぞれのイベントハンドラで、「オン」と「オフ」とを行います。イベントって、フローチャートでは、どうやって表現するんでしたっけ？？？このひし形は、状態変化を待っているようにも、見えます。
もう一つ、開始直後って、オンですか？オフですか？
フローチャートって動作しないから、検証が本当に難しいです。図示しても、日本語の曖昧な表現が残ってしまいます。これらが設計を難しくしている要因でもありますよね。

## 実装（プログラミング）
さぁ、プログラマーのみなさん、設計書をもとに、レッツ、プログラミング！！
![実装.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/3d5b47fc-92a3-ecd4-7bf9-80183fad65b2.png)
あれ、あれぇー、フローチャートには分岐が１つしかなかったのに、センサーブロックが２つになっちゃいましたね。「ずっとくりかえす」は、プログラマーさんがフローチャートの行間（矢印）からしっかりと読み取れましたね。

## 納品
それでは、完成ということでお客様へ納品しました。そしたら、しばらくして、「しばらくしても消えない」とお客様からご意見をいただきました。なぜでしょうか？

* 人が近づいていない状態で、開始する<br>⇒　発光ダイオードは消えている（1～2秒間ついているかもしれない）
* 人が近づく<br>⇒　発光ダイオードがつく
* しばらくすると<br>⇒　あれ？消えない・・・
* 人が離れると<br>⇒　発光ダイオードが消える

# プログラミング教育
さて、どこに問題があったのでしょうか。プログラミングが**バグっている**のでしょうか（小学生の流行語）。
2020年度から小学校でもプログラミング教育が必須化されます。ソフトウェア開発で日ごろからプログラミングを経験しているシステムエンジニアやプログラマーのみなさん、その経験をプログラミング教育に生かしてみませんか？

## 補足
ここに登場するとある教科書とは、次の内容解説資料である「新しい理科 | 2年度用 小学校教科書のご紹介 | 東京書籍」（編集上の留意点）から、抜粋したものです。
https://ten.tokyo-shoseki.co.jp/text/shou/rika/introduction/page08.html

実は、「しばらくすると消える」んです。なぜならば、電源にコンデンサーを使っているからです。

[![FireShot Capture 091 - 新しい理科 - 2年度用 小学校教科書のご紹介 - 東京書籍 - ten.tokyo-shoseki.co.jp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/e6383f07-d12a-d619-fb8b-55d5828e8ead.png)](https://ten.tokyo-shoseki.co.jp/text/shou/rika/introduction/page08.html)

# 瑕疵対応
改めて、システムエンジニアとプログラマーは、お客様と要件を再確認し、設計を見直し、プログラムを修正することにしました。
![人感センサーライト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/2e41b05f-4c1a-273a-3602-dbd8459cba27.png)

## 小学校プログラミング教育の手引
いったいこの教科書はどうして、こうなっちゃったのかなー。
[小学校プログラミング教育の手引（第二版）（PDF:3,685KB）](http://www.mext.go.jp/component/a_menu/education/micro_detail/__icsFiles/afieldfile/2018/11/06/1403162_02_1.pdf)を見ると、もっと的確なプログラム例（p.26）が示されていますよね。この記号の意味が分かるなら、あのフローチャートのようなものって必要でしたか？
![FireShot Capture 056 -  - www.mext.go.jp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/a129e997-298e-8e50-c294-484c82c5fed8.png)
最もポピュラーなプログラミング言語の変遷アニメーション(#プログラミング言語 #人気)

Twitterで流れてきたツイートで面白い動画があったのでご紹介します。(ツイートをなくさないためのメモでもあります)

【2020/02/22】ツイートのURLは [こちら](https://twitter.com/vronnie911/status/1125268670324695041?ref_src=twsrc%5Etfw)。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">StackOverflow language popularity through the years <a href="https://t.co/sxItm4rCrp">pic.twitter.com/sxItm4rCrp</a></p>&mdash; Veronika Romashkina (@vronnie911) <a href="https://twitter.com/vronnie911/status/1125268670324695041?ref_src=twsrc%5Etfw">May 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

「StackOverflow language popularity through the years」というタイトルにあるように、StackOverflow内でのpopularityみたいですが 2008年9月～2018年11月の期間のグラフをアニメ化しています。
JavaScriptとPythonに注目してみると割りとドラマチックですｗ

【開始時点=2008年09月】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/569c6f2b-e489-d9ef-645d-d583b85035a4.png)

【終了時点=2018年11月】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/7f6c41eb-85bc-50a4-4b68-589dc3b7fa61.png)

【2019/05/16 07:31追記】
ツイートの動画の元ネタは以下のページみたいです。全期間での質問数ではJavaScriptが1位みたいです。一か月毎に区切って計測するとPythonがJavaScriptを抜いたとのことみたいです。
https://www.globalapptesting.com/blog/picking-apart-stackoverflow-what-bugs-developers-the-most

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/23bfe949-5530-e449-db04-9e1327b672e4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140610/e67fb1a1-37f5-72c4-e756-d998bb51f7d4.png)
テスト2

```vb
Sub zip作成2()
Dim zipFile As Variant, sh As Object, fso As Object, ts As Object

zipFile = "C:\Users\user\Desktop\ジップ用" & ".zip" '作成するzipファイルのフルパス
Set sh = CreateObject("Shell.Application") 'Shellオブジェクトを格納
Set fso = CreateObject("Scripting.FileSystemObject") 'fsoオブジェクトを格納

'空zip作成
Set ts = fso.CreateTextFile(zipFile, True) 'ファイル作成
ts.Write "PK" & Chr(5) & Chr(6) & String(18, 0) '空のzipファイルの中身
ts.Close '閉じる

'zipへ元のフォルダを追加(これがないとzipフォルダが正常に動作しない)
sh.Namespace(zipFile).CopyHere sh.Namespace("C:\Users\user\Desktop\ジップ用")
Application.Wait [Now()+"0:0:5"] '5秒待ち

End Sub
```
Laravel-admin TODO機能の作成①(Helpersのscaffold)

#概要
Laravel-adminの拡張機能であるHelpersのscaffoldを使ってTODO管理機能の雛型を作成する。

#前提条件
1. 命名はTodoとする
2. ユーザー単位で管理

#作業

###入力
app直下にModelsフォルダを作成しておく
とりあえずこんな感じで入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413817/923606de-eece-2a8b-0b8f-8e58ace4a8bd.png)


Table name: todos
Model     : Todo
Controller: TodoController

| Field name | Type            | Nullable | Key    | Default value | Comment |
|------------|-----------------|----------|--------|---------------|---------|
|user_id     | unsignedInteger |          | NULL   |               | ユーザID |
|title       | string          |          | NULL   |               | タイトル |
|detail      | text            |          | NULL   |               | 詳細     |

Primary key: id
Created_at & Updated_at: on
Soft deletes : off

※Primary keyはフィールドに入力せずとも作成される

###成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413817/d7fbf2d2-5665-d382-8227-00d94c75ae22.png)

###確認

migrateも実行済みになってるはずなのでDBを確認する

```
show tables;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413817/727c469a-fe56-103e-63ed-699821cab586.png)

todosテーブルが存在する
カラムの情報も確認する

```
show columns from todos;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413817/9a4a3b9c-e78c-cce2-b149-4748ad4d214b.png)

Modelsの確認

`devproject\app\Models\Todo.php`が存在すること

Controllerの確認
`devproject\app\Admin\Controllers\TodoController.php`が存在すること

#ルーティングに追加

```devproject\app\Admin\routes.php
    $router->resource('todo', 'TodoController'); // 追加
```

#動作確認

[https://homestead.test/admin/todo](https://homestead.test/admin/todo)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413817/2ecc2743-0b49-e73d-4c9f-4a0bdcd03b14.png)

##残念なところ
Controllerは別で作ったほうが良い（下のコマンドで作成したControllerと比較）
`php artisan admin:make Todo2Controller --model=App\\Models\\Todo`
次回があれば`Create controller`のチェックは外す

##結果
あくまでも雛型と割り切って使うのであればいいと思う。
自分は使わないかなー。

#次について
やっと、laravel-adminのコーディングをしていきます。
楽しみです！

[Laravel-admin TODO機能の作成②](https://qiita.com/ksri-soln/items/6d6cba15aa19318ca6fb)
Flutter for DesktopでWindowsアプリ開発環境を構築

`6/13追記: Macでもほぼ同じ方法で実行出来ることを確認しましたので、bashでの方法も追記しました。`
# はじめに
Flutter for Desktopは、2019年5月7日の[Google I/O](https://developers.googleblog.com/2019/05/Flutter-io19.html)にて発表された内容になります。
公式にて、「開発初期段階だから警告なしに変わるかも」,「めんどくさいから頑張って」的なニュアンスの表現がありましたが、理解すると簡単だったので、今回はExampleのアプリを利用して、導入部分を紹介します。
## Flutterとは
Flutter（フラッター）は、Googleによって開発されたフリーかつオープンソースのモバイルアプリケーションフレームワークである。FlutterはAndroidやiOS向けのアプリケーションの開発に利用されている。([Wikipedia](https://ja.wikipedia.org/wiki/Flutter))
#早速やっていきます。
##開発環境
今回はコマンドプロンプトのみで構築します。 

```
Windows10 [10.0.17134.590]
Flutter (Channel stable v1.5.4-hotfix.2)
```
公式にはVisual Studio 201*が良いよと書いてあったので、必要な方はインストールしてください。
(SublimeText, Visual Studio Code等でも動きました)
##手順
```
git clone https://github.com/flutter/flutter.git
```
公式からFlutter本体をとってきます。
※環境変数に``` <CloneDir>/flutter/bin ```を追加するのもお忘れなく。

bash

```
export ENABLE_FLUTTER_DESKTOP=true
```
(~/.bash_profileに記入しておきましょう。)

powershell

```
$env:ENABLE_FLUTTER_DESKTOP="true"
```
CMD

```
set ENABLE_FLUTTER_DESKTOP=true
```

```
flutter
```

FlutterのDesktopモードを有効にし、flutterを実行します。
すると、いろいろダウンロードされるはず。しばらく時間がかかります。

```
git clone https://github.com/google/flutter-desktop-embedding.git
```
また、今回はExampleをCloneします。

```
cd flutter-desktop-embedding/example
flutter run
```
うまくいけば次のような画面が起動するはずです。(下部はCMD)
<img width="732" alt="キャプチャ3.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/210747/2c3dbb0b-7f4a-6c21-bebb-312c0eb5e9fb.png">
実行されたアプリケーションは、```lib/main.dart```を変更することでアプリの内容を変更できます。
また、```--hot```オプションを付けることで、ホットリロードや、ホットリスタートも簡単に実行できます(!!!)
### いいなと思った点
- クロスプラットフォーム開発がお手軽
- UIがMaterialで整っている。
- Dart言語はJS好きの筆者にはとっかかりやすい(JavaとCとかの中間的な印象)
- ホットリロードで開発速度向上
- Desktopについてはレスポンシブ対応
- そしてある程度高速。

まだ、「いい案を考えている」とか、「警告なしに変えるかもよ」とか言っているFlutterですが、 日本語情報が少ないことと、拡張性さえ無視すれば十分有用、全然実用的な選択肢だと思います。
###つまずいたところ
- 
 一番最初に環境変数の設定をしておらず、androidのsdkなどがインストールされ、```flutter doctor```して！とか言われました。これが難解だった。

## 参考になるドキュメントたち
[Flutter Desktop-shells Wiki](https://github.com/flutter/flutter/wiki/Desktop-shells)
[macOS/Linux,Powershell等での環境変数の設定方法](https://github.com/google/flutter-desktop-embedding/blob/master/example/README.md)
招待リンクの場所を忘れましたが、公式Discordもあります。質問などは推奨されてませんが、議論は活発に行われていますので、のぞいてみたらいいかもしれません。


###記事の紹介
今回紹介したホットリロードを[Web開発の際に導入する](https://qiita.com/karuhi/items/e2056d35a42d49081832)
OSXにredmine 3.4を入れるメモ①

## 環境
- macOSX HighSierra
- Redmine 3.4
- ruby 2.4.5
- rails 4.2.0


## 今回の目標
redmineをmacOS上に表示させる。

## 方法

基本的に http://guide.redmine.jp/RedmineInstall/ を参考になります。


### エラーと解決
#### その1
上記サイトに従って作業を勧めていくと、いくつかエラーにあたった。

```
$ bundle install --without development test
(略)
An error occurred while installing rmagick (2.16.0), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.16.0' --source 'https://rubygems.org/'` succeeds before bundling.
```
こんな感じでエラーメッセージが出てくるので、素直に`$ gem install rmagick -v '2.16.0' --source 'https://rubygems.org/'`する。


```
$ sudo gem install rmagick -v '2.16.0' --source 'https://rubygems.org/'
(略)
checking for outdated ImageMagick version (<= 6.4.9)... no
checking for presence of MagickWand API (ImageMagick version >= 6.9.0)... no
(略)
extconf failed, exit code 1
```
なんだかちゃんとできていない。ImageMagickのバージョンがあっていないようなので https://qiita.com/sho012b/items/362abe993248c686fcf4 を参考に入れ直す。

再度、`$ bundle install --without development test`を試すと成功。一安心。

#### その2

```
$ RAILS_ENV=production bundle exec rake db:migrate
rake aborted!
Mysql2::Error: Access denied for user 'root'@'localhost' (using password: YES)
(略)
```
こんなエラーがでてきた。'root'ではなく'redmine'で設定した気が。。
`database.yml`を開く。

```
production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: root
  password: "パスワード"
  encoding: utf8
```

やはり`username: root`なので'redmine'に変更する。
`$ mysql.server restart`してから`$ RAILS_ENV=production bundle exec rake db:migrate`した。解決。

#### その3

```
$ sudo chown -R redmine:redmine files log tmp public/plugin_assets
chown: redmine: illegal group name
```
よくわからないので無視。←


## 結果
redmineのガイドに沿って進めると、`bundle exec rails server webrick -e production`でサーバーを起動し http://localhost:3000/ にアクセスするとredmineが表示されるようになる。


今回はここまで。
ネットワーク層についてのメモ

##ネットワーク層とは？

OSI参照モデルの第3層(低レイヤから数えて3番目の層)のこと。

##ネットワーク層は何に使う？

- あるネットワーク(送信元のネットワーク)から別のネットワーク(送信先)にパケットを転送する
- ルーティング(通信経路の選択)
- IPアドレスの割り当て

##代表的なプロトコルは？

- IP(InternetProtocol)
- ICMP(InternetControlMessageProtocol)
- ARP(AddressResolutionProtocol)
- RARP(ReverseAddressResolutionProtocol)
Firebase Cloud Firestoreの導入時に発生したエラー：Error: 9 FAILED_PRECONDITION: The Cloud Firestore API is not enabled for the project

#Firebaseのコンソールにて、Firestoreのデータベースの作成で失敗

[Firestoreのスタートガイド](https://firebase.google.com/docs/firestore/quickstart?authuser=0)には以下のように記載されています。
>1. Firebase コンソールを開き、新しいプロジェクトを作成します。
>2. [データベース] セクションで [Firestore ベータ版を試してみる] をクリックします。
>3. [有効にする] をクリックします。
>
>Cloud Firestore プロジェクトを作成すると、Cloud API Manager で API も有効になります。

しかし、３．の工程でインターネットの通信が途切れたりしてデータベースの作成に失敗すると、以下の画像の状態になってしまいます。
失敗した場合、「最読み込み」や「コレクションの追加」を行っても、Firestoreの操作を行うことができません。

また、Cloud FunctionsからFirestoreをアクセスを試みると下記のエラーが発生します。

```
Error: 9 FAILED_PRECONDITION: The Cloud Firestore API is not enabled for the project
```

<img width="1249" alt="スクリーンショット 2019-05-13 21.00.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132961/84679b40-a526-fe8e-3868-9a5663d57545.png">

#解決策
Firestoreを操作できない原因は、[Google Cloud Platform](https://cloud.google.com/)上のCloud API ManagerのAPIが無効のままになっているためです。
そのため、Google Cloud Platformへアクセスして、以下の画像のようにFirestoreのAPIを有効にすれば、Firestoreを操作することができるようになります。

<img width="296" alt="スクリーンショット 2019-05-14 20.04.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132961/5f4f22a8-c14f-af19-a65b-69c99ced86a6.png">

![4427C57E-C276-4D33-81A8-19212B451B3D.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132961/3cb7bb89-8604-1d7d-0e72-5f38e97eb5c7.jpeg)
thor hoge と書きたい


# どういうはなし？

Ruby でコマンドラインツールを作る方法はいくつもある。

まず Rake。
Rakefile という名前のファイルにタスクを書いておけば，

```console
rake hoge
```

のように，`rake`に続けてタスク名を書くことで実行できる。

しかし，タスクにパラメーターを渡すやり方が，環境変数を介す

```console
rake hoge name=foo
```

といったもので，やや冗長。
また，タスクやパラメーターの与え方を表示するヘルプを自前で書かないといけないのが面倒。

[Thor](https://github.com/erikhuda/thor) はこれらの問題を解決する。

しかし，Thor だと

```console
thor fuga:hoge
```

のように，コマンド名が `fuga:hoge` のような形になってしまう。
つまり，`fuga` というコマンドの `hoge` というサブコマンド，という形で動かすことになっている。
なんとか

```console
thor hoge
```

だけの形で使いたいのだが，というのがこの記事の主旨。

# Thor おさらい

Thor をいちおう知っている，という前提で書くので，ご存知なければ例えば以下の記事を参照されたい。

* [Thor入門 - RakeからThorへ - - Qiita](https://qiita.com/yatmsu/items/5ba7016db33c13d7a882)
* [Ruby の CLI ツールの作成を支援する、 thor gem の基本について。 #thor #ruby - Qiita](https://qiita.com/tbpgr/items/10a5c236cfb528c76ef5)

Thor の使い方は大雑把に二種類あるが，この記事では

```rb:honyarara.thor
class Fuga < Thor
  desc "hoge", "Hogehoge"
  def hoge
  end
end
```

と書いて，

```console
thor fuga:hoge
```

と書くやり方を前提にする。
なお，ファイル名は拡張子が `.thor` なら何でもいい。

# コマンドを単に hoge と書きたい

上記のように，`Fuga` クラスに `hoge` メソッドを定義すると，`fuga:hoge` という Thor コマンドができる。

しかし，単に

```console
thor hoge
```

という形で使いたいんだよなあ。
Thor の解説記事や本家サイトなどを見ても，なかなかこの方法が見当たらない。

`default_command` というやり方もあるんだけど，これは `fuga:hoge` の `:hoge` が略せるというもので，ちょっと違う。
コマンド一覧を

```console
thor list
```

で表示したときも

```console
fuga
----
thor fuga:hoge  # Hogehoge
```

となる。あくまで `fuga` の `hoge` ということ。
`hoge` コマンドの説明を見ようとして，

```console
thor help hoge
```

としても，「そんなコマンドは知らん」と言われてしまう。

# 解決：Default という特別なクラス

いろいろ探っているうちに，いちおうやり方が分かった。
クラス名を以下のように `Default` にすればよいようだ。このクラス名は特別であるらしい。

```honyarara.thor
class Default < Thor
  desc "hoge", "Hogehoge"
  def hoge
    puts "hoge"
  end
end
```

これだと

```console
thor hoge
```

の形で使えるし，

```console
thor help hoge
```

で説明を見ることもできる。

ただ，コマンド一覧を

```console
thor list
```

で表示すると

```console
default
-------
thor :hoge  # Hogehoge
```

という表示になる。
惜しい。`:` は表示してくれなくていいのに。
いやもちろん

```console
thor :hoge
```

とコロン付きで打っても期待どおりに動くのだけれど，わざわざそんな打ち方しないので，コロン抜きで表示してほしかった。
（自分が使うぶんには気にしないのだが，他人に使ってもらうコマンドラインツールだと，いちいち説明しないといけないのが面倒くさい）
Laravel + Vue Todoアプリ

Laravel + Vue TodoアプリをGitにデータ一式アップしたので
構築までの手順のみ記載します。
※詳しいコード説明は一番下に明記してあるURLから参照してください。
その記事を元に作成しています。

# 前提
・ virtualboxとvagrantはインストール済み
・ Macの場合、gitコマンド使うにはXcodeのインストールが必要
　※AppStoreからダウンロード可
・ 一度はLaravelをvagrant環境で構築したことがある方におすすめします

# 実行環境
MacOS Mojave　バージョン10.14.3
VirtualBox バージョン 5.2.28 r130011 (Qt5.6.3)
Vagrant　Version: 2.2.4

# 完成イメージ
![img.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393193/a6eae123-b1eb-e945-b69e-51e9ee9adfbd.jpeg)


# 手順1　Gitからアプリデータをクローン
`git clone https://d-mori-570415@bitbucket.org/d-mori-570415/laravelvuetodo.git`
※フォルダ名は「LaravelVueTodo」でクローンされます
変更は可能ですが、手順3の名称もその変更したものにしてください

（注）クローン後、codeと同階層に隠しファイル「.git」が入っていますので、このファイルを必ず削除してください。vagrant up時にエラーが出ます。

フォルダに移動
`cd LaravelVueTodo`

# 手順2　Homesteadファイルをクローン
`git clone https://github.com/laravel/homestead.git Homestead
`

# 手順3　Homestead.yaml生成 + 修正
`cd Homestead`
`bash init.sh`
map箇所に「laravelvuetodo/」を追加
`folders:
   - map: ~/code #修正前
   - map: ~/laravelvuetodo/code #修正後
`

# 手順4　仮想環境を立ち上げる
1.`vagrant up`
2.`vagrant ssh`
3.`cd code`

# 手順5　不足分のデータを追加する
PCの適当な場所（デスクトップが分かりやすい）に下記composerコマンドを用いてLaravelの初期データをダウンロードする
`composer create-project --prefer-dist laravel/laravel blog "5.5.*"`
その中の「vendor」フォルダのみ「手順1」でクローンしてきたフォルダの中に入れる
※入れないとエラーになります

# 手順6　envファイル生成
`cp -p .env.example .env
php artisan key:generate
`

# 手順7　todosテーブルをマイグレートする
`php artisan migrate
`
　

最後に「192.168.10.10/todo」でアクセスすると描画される

# 参考記事
□【Laravel 5.5 or latest】Homestead で mac に Laravel 開発環境を構築
https://qiita.com/7968/items/68b3566d92d2b007038e
□Laravel5.7でVueを利用した開発をしてみる
https://qiita.com/zaburo/items/603f422ed78c15c47a2a
フラッターアプリビルダー(Flutter App builder )

![flutteruibuilder.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416669/b2b24bad-a504-ad52-f080-4fd6d5e7a6f3.png)
良い知らせです。 Flutterについて話したのを覚えていますか？うん、いつか輝いているでしょう！しかし今でも、あなたはそのWebアプリケーションを見たことがありますか？それはゴージャスです！簡単で、ユーザーフレンドリーで速いです。会うFlutter Studioウェブアプリケーション、更新された！

アプリの最初のバージョンはFlutterの初期のアルファバージョンに基づいていて、ウィジェットのセットは限られていました。更新されたアプリは現在、さまざまな画面でよりよく機能し、正確に複数のデバイスに表示されます。 iPad、Nexus、Samsung、Android、およびそれらの利用可能なモデルの多くを含む68種類のデバイスから選択できます。さらに、現在、Flutter Studioは完全で実用的なコードを生成し、flutter.ioウィジェットカタログにリストされていないいくつかの新しいものを含む、より完全なウィジェットのセットを持っています。

長編小説。新しいバージョンは本当にレスポンシブで、本物のAndroidとiOSデバイスをWeb上で正確に表示し、ピクセルパーフェクトデザインを表示します。

より多くのウィジェットとテーマを提供します
ウィジェットを直感的に編集して正確なコードを作成することができます
デザイン重視
完全で実用的なアプリケーションコードとpubspec.yamlファイルを作成します。
可愛いでしょ？ここでFlutter Studioを自分で試してみてください。

http://flutterappbuilder.club

FlutterAppbuilderは最新のウェブベースのFlutter Appビルダーです

PSクロスプラットフォームのモバイルアプリ開発のための最新のプラットフォームについて話すこともお勧めします（Flutterほど多くのデバイスを扱うことはできませんが、ネイティブのiOSとAndroidの場合は、必要なものはすべてそれだけです）。楽しんで楽しい一日を！
テスト1

```vb
Sub sample()
Dim myObj As Object
Dim myDir As String
Dim myFileName As String
Dim myFileList As String
Dim myFileCount As Long
Dim wb As Workbook
'------------------------------------------------------------------------
 'フォルダ選択ダイアログの表示
    Set myObj = CreateObject("Shell.Application"). _
    BrowseForFolder(0, "フォルダを選択してください", 0)
    If myObj Is Nothing Then Exit Sub
    myDir = myObj.Items.Item.Path
    If Right(myDir, 1) <> "\" Then myDir = myDir & "\"
'------------------------------------------------------------------------
 'フォルダ内のExcelファイルを確認
myFileName = Dir(myDir & "*.xls")
Do While myFileName <> ""

        If myFileName <> ThisWorkbook.Name Then
            myFileList = myFileList & Chr(13) & myFileName
            myFileCount = myFileCount + 1
        End If
        
        myFileName = Dir()
        
Loop
    
If myFileCount = 0 Then
       MsgBox "ファイルは見つかりませんでした。マクロを終了します。", 48
       Exit Sub
ElseIf vbNo = MsgBox(myFileCount & " 個の .xls ファイルが見つかりました。マクロを実行しますか？" _
                                       & Chr(13) & myFileList, 4, "ファイル確認") Then
       MsgBox "キャンセルしました。"
       Exit Sub
End If
'------------------------------------------------------------------------
 'CSV処理
myFileName = Dir(myDir)
Dim KCount As Long
Dim fso As Variant
Dim Spath As String
Dim Epath As String
Dim Fname As String
Set fso = CreateObject("Scripting.FileSystemObject")

Epath = "C:\Users\user\Desktop\csv変換用" & "\"
Application.DisplayAlerts = False
Application.ScreenUpdating = False

Do While myFileName <> ""

        If myFileName <> ThisWorkbook.Name Then
            KCount = Len(fso.getextensionname(myFileName))
        
            Set wb = Workbooks.Open(myDir & myFileName)
            wb.SaveAs Filename:=myDir & Left(myFileName, Len(myFileName) - KCount) & "csv", _
            FileFormat:=xlCSV
            Fname = wb.Name
            Spath = wb.FullName
            wb.Close
            Name Spath As Epath & Fname
            
        End If
        
        myFileName = Dir()
        
Loop
'------------------------------------------------------------------------

Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox "完了しました。"

 End Sub
```
Macでcsvファイルをsjisに変換してexcelで文字化けせずに開けるようにした（ついでにAutomator）

csvダウンロードは基本utf8が多いと思うんですが、今までファイルで開いてGUIで変換してたんですが、もうそろそろめんどくさくなってきたのでターミナルで一発変換できる方法探しました。

ついでにautomator化してみたら結構良かった。

## nkfをインストール

```
brew install nkf
```


## sjisに変換

`--overwrite` でファイルを上書き処理してくれます。

```
nkf -s --overwrite xxx.csv
```

## nkfのオプション

- `-g` 現在の文字コード確認
- `-j` JISコード(ISO-2022-JP)変換
- `-w` UTF8変換
- `-e` EUC-JP変換
- `-Lu`  unix改行形式(LF)に変換
- `-Lw`  windows改行形式(CRLF)に変換
- `-Lm`  macintosh改行形式(CR)に変換


## automator化

`which nkf` をして、nkfコマンドのpathを取得。

↓

<img width="533" alt="converSJIS_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16795/9c84b4f2-29ba-2b63-c8de-006f790347b1.png">

↓

<img width="1117" alt="convertSJIS_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16795/bc0dee04-8a8b-6a94-1690-0315788b683f.png">

入力するシェルコマンドはこれにしました。

`/usr/local/bin//nkf -s --overwrite "$@"`

## 使ってみた

![convertJIS0.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16795/ac767be0-2929-a9b9-192d-b3491cac14fc.gif)

## 最後に

やってみたらとても便利でした。
automator初利用でしたが思ってた以上に良いですね。

次からアプリ入れるよりシェルスクリプト書いてクイックアクション化する方が良いですね。画像サイズ変換とかそういうのにも使えそうです。
Haskell のリストを左結合で連結すると効率が悪い理由

「Haskellのリストを左結合で連結すると効率が悪い」というのは色んなところで言われているし有名だけど、その理由を詳しく解説している日本語の記事がググっても見あたらなかったので書いてみます。

「左結合で連結する」というのはつまり `(a ++ b) ++ c` ってことです。
右結合・左結合については [Haskellの右結合と左結合](http://haskell.hatenablog.com/entry/Haskell-right-associativity-and-left-associativity) などを参照してください。

## 解説

まずはリストの連結関数 [(++)](https://github.com/ghc/ghc/blob/e142ec99e91ef4bdffd367780e945526ec6ef7e2/libraries/base/GHC/Base.hs#L1172) の定義をおさらいします。

```Haskell
(++) []     ys = ys
(++) (x:xs) ys = x : xs ++ ys
```

左のリストが空でない間はずっと下のパターンを通るので、

```
  [1,2,3] ++ [4,5,6]
= 1 : ([2,3] ++ [4,5,6])
= 1 : (2 : [3] ++ [4,5,6])
= 1 : (2 : (3 : ([] ++ [4,5,6])))
= 1 : 2 : 3 : [4,5,6]
```

上記のように展開されていきます。
つまりこの関数は、

1. 左のリストを `a:b:c: ... :[]` の形に展開していく
2. 最後の `[]` を右のリストに置き換える

という手順を踏んでいることに注目してください。

効率の悪い `(a ++ b) ++ c` をこの手順に則って見ていくと、

1. 括弧がついてるので、 a ++ b を先に評価する
2. a を展開する
3. a の末尾の [] が b になり、新しいリスト ab ができる
4. ab ++ c を評価する
5. ab を展開する (a にあった要素も、もう一度展開される)
6. ab の末尾の [] が c になり、新しいリスト abc ができる

となって、同じ要素を重複して走査してしまっています。

一方、効率の良い `a ++ (b ++ c)` を同じ手順に則って見ていくと、

1. 括弧がついてるので b ++ c を先に評価する
2. b を展開する
3. b の末尾の [] が c になり、新しいリスト bc ができる
4. a ++ bc を評価する
5. a を展開する
6. a の末尾の [] が bc になり、新しいリスト abc ができる

となって、今度は同じ要素が重複して走査されることはありません。

## 検証

実際にどう評価されるかを確かめるためには `Debug.Trace` が使えます。
以下は検証用のコードです。

```Haskell:Lib.hs
{-# LANGUAGE Strict, StrictData #-}
-- 遅延評価の場合は出力順が変わってややこしくなるので、正格評価にする
-- 結合の効率はどちらも変わらない

module Lib where

import Debug.Trace

-- 正格評価なリストを作る
-- StrictモードのHaskellでも、標準のリスト([a])は遅延評価のままなので、このモジュール内でデータ構造を定義する必要がある
-- このListは正格評価される
data List a = Nil | Cons a (List a) deriving (Show)
toL :: [a] -> List a
toL [] = Nil
toL (x:xs) = x `Cons` toL xs

infixr 5 +#+
(+#+) Nil ys = ys
(+#+) (x `Cons` xs) ys = (traceShowId x) `Cons` (xs +#+ ys) -- traceShowId で評価された時に値を表示する

-- List a を評価するためだけの関数
-- seq は浅いので、深く評価するために専用のものを作る
eval :: List a -> ()
eval Nil = ()
eval (x `Cons` xs) = x `seq` eval xs
```

GHCi で確かめてみましょう。
左結合の場合

```
ghci> a = toL [1..5]
ghci> b = toL [6..10]
ghci> c = toL [11..15]
ghci> eval $ (a +#+ b) +#+ c
1 # a を展開
2
3
4
5 # a の展開完了。 ab ができる
1 # ab を展開
2
3
4
5
6
7
8
9
10 # ab を展開完了。 abc ができる
()
```

右結合の場合

```
ghci> a = toL [1..5]
ghci> b = toL [6..10]
ghci> c = toL [11..15]
ghci> eval $ a +#+ (b +#+ c)
6 # b を展開
7
8
9
10 # b の展開完了。 bc ができる
1 # a を展開
2
3
4
5 # a の展開完了。 abc ができる
()
```

以上です。
分かりやすくなってると良いなぁ。

### 参考情報

- [Strict Haskell](https://kazu-yamamoto.hatenablog.jp/entry/20151117/1447726679)
- [Haskellのseqについて](https://kmiyag.hatenablog.com/entry/2018/12/18/165942)
Vue+electron製ツールでSlackにメッセージを送る - をやってみた手順

最近Twitter/Qiita界隈ではワイ記法で有名になりつつあるらしい弊社ですが、会社標準というわけではないので標準語でお送りします。

今日の仕事を終えて、勤怠報告用のslackチャンネルに書き込もうとしたとき、ひとつのtweetが目に入りました。

```
これ見ながら俺も作ってみる
Vue+electron製ツールでSlackにメッセージを送る https://qiita.com/unotovive/items/0e0a117340eaa04c9f77 #Qiita
```

お？??
これは便利なのでは？と思ったので作ってみることにしました。

【元記事】
Vue+electron製ツールでSlackにメッセージを送る
https://qiita.com/unotovive/items/0e0a117340eaa04c9f77

App.vue ファイルのソースコードがあるだけで何も説明がなかったので、実際にアプリをビルドしてみるところまでのやってみたことをアウトプットしておきます。

Electron vue のサイトを参考に作業を進めました。
https://simulatedgreg.gitbooks.io/electron-vue/content/ja/

# 前提

macOS Mojave 10.4

```
$ node -v
v10.14.2

$ npm -v
6.4.1

$ yarn -v
1.16.0
```

なんせ元記事にはApp.vueしかないので、手元にある環境で進めてみます。

## vue-cli のインストール

```
$ npm install -g vue-cli
```

## プロジェクトの作成

```
$ vue init simulatedgreg/electron-vue slackbtn
$ cd slackbtn
```

`slackbtn` というディレクトリの中に、プロジェクトが作成されました。ディレクトリ名は適宜変更可能です。

## ライブラリのインストール

```
$ yarn
```

## アプリ起動

```
$ yarn run dev
```
ここで開発中のアプリが起動してきました。

## App.vue の実装

元記事にかかれている `App.vue` のソースコードを `src/App.vue` へそのまま貼り付けました。

slackのAPIを使うライブラリを使っているので、プロジェクトへ追加します。

```
$ npm i messaging-api-slack
```

### slackのアクセストークンを取得

こちらの記事を参考に取得しました。Permission選択のところで postMessage を入力すると必要なものを入力すると良いです。

Slack API 推奨Tokenについて
https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21

OAuth Access Token と書かれた項目をコピーし、 `src/App.vue` の43行目に貼り付けます。

45行目、 `client.postMessage()` の第1引数に、メッセージを書き込みたいslackのチャンネル名を書きました。
例) #project_kintai


ここまでで実装できたはずなので、改めてアプリを動かします。
（先程のアプリが動いたままの場合は Control + C で停止します。）

```
$ yarn run build
```


無事起動しました。ボタンを押したら指定したチャンネルに絵文字が投稿されていました。

これにて、`:sagyo-shuryo-作業終了_navy:` です。
[WPF]prism.unity(6.3.0)を試したまとめ(RegisterTypeとRegisterInstanceの違いなど)


**Prism関連**
https://qiita.com/tera1707/items/4fda73d86eded283ec4f#prism%E9%96%A2%E9%80%A3wpfxaml


# この記事について
この記事は、前二つの記事(↑参照)のまとめです。

# 試した環境
| モノ |バージョン|
|:---|:---|
|VisualStudio|2017|
|Prism.Unity|6.3.0|

# RegisterTypeとRegisterInstanceの違い

| 使うメソッド|用途/特徴|
|:---|:---|
|RegisterInstance　　　　　　　　　　　　　　　　　　　　|動的な情報を登録する(外部で作成したインスタンスをコンテナに渡す)注入したいクラスに、new時に引数を渡したい場合は、こっちをすればよいっぽい。|
|RegisterType　　　　　　　　　　　　　　　　　　　　　　|静的な情報を登録(登録時はインスタンス化なしで、注入時にコンテナ内で都度インスタンスを作成する)|
※[参考：【Unity】RegisterInstanceとRegisterTypeの違い。](http://pro.art55.jp/?eid=1177842)

# コードから見たDIの便利ポイント
※本格的な実践はしてないので、以下はほぼ想像です。

実際に簡単なDIを使うコードを書いてみて、下記が便利かなと思った。

注入するクラス(今回でいうと`Dog`や`Cat`)を、使うところ(`Person`)でnewしなくてよいので、Personの単体テストをするときに、DogやCatを単体テスト用のものに差し替えたいとき、登録の部分(RegisterInstance)でnewしているところだけ差し替えればよいので、Personの中でnewしてるところを書き換えるよりは確かに楽そう。(特に、DogやCatを使うところが多い場合に)

単体テスト用猫クラスを作って、

```cs
public class UnitTestCat : IAnimal
{
    public UnitTestCat() => Console.WriteLine(" UnitTest猫 コンストラクタ");
    public void Cry() => Console.WriteLine("UnitTestニャ～");
}
```
登録の部分だけ差し替える。

```cs
container.RegisterInstance<IAnimal>(new UnitTestCat());
```
これで実行すると、注入される側の`Person`に何も手を入れなくても、単体テスト用の猫クラスを使って、Personが動く。

同じように、分担して開発してるときに、`Person`クラスを作っている人は、とりあえず簡易的に動かすための猫クラスを作っておいて、Personクラスの開発中はそれで猫を動かす。猫が出来上がったら、登録の部分だけそっちに載せ替える、ということができそうなので、確かに楽になりそう。


# わかったこと
- DIは、注入される側クラスのコンストラクタの引数で、そこで使うクラスのインスタンス(=依存性)を渡してやって実現できないこともないが、多数のクラスインスタンス(=依存性)を使う場合、コンストラクタの引数で多数のクラスインスタンスを受け渡ししないといけなくなり、煩雑になる。[(参考：こういうやり方)](https://qiita.com/ritukiii/items/de30b2d944109521298f#%E3%81%A7%E3%82%82%E3%81%93%E3%82%8C%E3%81%A3%E3%81%A6%E3%81%9D%E3%81%AE%E3%81%86%E3%81%A1%E5%BC%95%E6%95%B0%E3%81%8C%E5%A4%A7%E9%87%8F%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E3%81%AE%E3%81%A7%E3%81%AF)
- そういった問題を緩和するために、DIのためのライブラリが存在している。
    - .netで使えるものでいうと、`prism.unity`や`mef`がある。
    - DIコンテナを自前でつくると大変なので、一般的には、これらのライブラリを使ってDIを行う。
    - DIコンテナを使うと、単体テストや分担開発が楽になる...っぽい。
- 確かに試してみたように、単体テストや分担開発が楽になりそうな気がするが、DIのためのコードをかかないといけないので、**デメリット**もありそう。(想像するに、下記)
    - コード量が増える(インターフェース必須、DIに登録/注入等しないといけない)
    - 分担が楽だということは、逆に分担しない/一人で開発するようなときは、「分担開発が楽」のメリットは半減しそう。
    - DIのライブラリに色々(バージョンも日々新しくなっている)あって、書き方が日に日に変わっていくので、自分(と周りの関係者)がそれを知っていないといけない、また流れに追いついてないといけない。(**それって、一般的なレベル(=全員がDIに詳しいわけではない)の会社で、分担開発が楽になってるといえるのか？**)
    - 開発の途中からDI導入、とかは難しそう。割とスキルのある(DIを使っての設計をよくわかっている)メンバーが、最初からきちんとつくること前提でないと、DIコンテナがあるのに使ってない、とか無茶苦茶になりそうな気がする。

# 今回の結論
- 確かに、単体テスト、分担開発ではうまくやれば便利そう。
- ただし比較的大きな開発の場合に限られる。一人で開発するような小さなものについてはDIは~~要らなさそう~~使わないという選択肢もアリ。

# 参考

かずきさんprism教育ページ
prismを、機能一つ一つに分けて説明してある。
https://github.com/runceel/PrismEdu

DIの解説
DIについて、コードを交えて優しく書いてくれている。
https://hiroronn.hatenablog.jp/entry/20170531/1496186979

DI(Unity)でInstanceを登録、読み出しのサンプル～依存性注入
サンプルコード。
http://blogs.wankuma.com/nakamura/archive/2008/10/28/160029.aspx
http://blogs.wankuma.com/nakamura/archive/2008/10/29/160096.aspx

RegisterInstanceとRegisterTypeの違い
http://pro.art55.jp/?eid=1177842
[WPF]prism.unity(6.3.0)の簡単な実装サンプル②(登録～依存性注入まで)(RegisterType使用)

**Prism関連**
https://qiita.com/tera1707/items/4fda73d86eded283ec4f#prism%E9%96%A2%E9%80%A3wpfxaml

# 試した環境
| モノ |バージョン|
|:---|:---|
|VisualStudio|2017|
|Prism.Unity|6.3.0|

# やりたいこと
[以前の記事](https://qiita.com/tera1707/items/44dfe3997beb7044112c)で、`RegisterInstance`を使ってUnityのDIコンテナにインスタンスを登録し、それを別のクラスに注入、ということを試した。その時に、別のやり方(`RegisterType`を使ったやり方)もあるようだったので、そちらのやり方もメモしておく。

RegisterInstanceとRegisterTypeの違いは、[別ページ](https://qiita.com/tera1707/items/d00545447475815f69c4)参照。

# サンプルを元に考える

以前と同じように、[こちら](http://blogs.wankuma.com/nakamura/archive/2008/10/29/160096.aspx)をベースにさせていただいています。

```cs
using Microsoft.Practices.Unity;
using System;

namespace ConsoleApp10
{
    class Program
    {
        static void Main(string[] args)
        {
            // DI コンテナを生成
            UnityContainer container = new UnityContainer();

            Console.WriteLine("[Main] 名前を指定してインスタンスを登録する。");
            
            // 名前を指定してインスタンスを登録(RegisterType()) //ここではDogやCatのコンストラクタは呼ばれない(newしてないから、注入されるときにnewされる)
            container.RegisterType<IAnimal, Cat>();
            container.RegisterType<IAnimal, Dog>();

            // 依存性を注入する
            Console.WriteLine("[Main] 依存性を注入する。");
            var person = container.BuildUp<Person>(new Person());

            // ペットを呼ぶ
            Console.WriteLine("[Main] ペットを呼ぶ。");
            person.CallPet();

            Console.ReadLine();
        }
    }

    // 動物インターフェース
    public interface IAnimal
    {
        void Cry();// 鳴き声を出力する
    }

    // ネコ(IAnimalインターフェースの実装)
    public class Cat : IAnimal
    {
        public Cat() => Console.WriteLine(" 猫 コンストラクタ");
        public void Cry() => Console.WriteLine("ニャ～");
    }

    // イヌ(IAnimalインターフェースの実装)
    public class Dog : IAnimal
    {
        public void Cry() => Console.WriteLine("バウ！");
        public Dog() => Console.WriteLine(" 犬 コンストラクタ");
    }

    // 依存性を注入されるクラス
    public class Person
    {
        [Dependency]
        public IAnimal Pet { get; set; }

        // ペットを呼ぶ
        public void CallPet() => Pet.Cry();
    }
}

```


# コードの流れ
- 依存性の登録～注入までは、下記のような流れで行う。
    - `UnityContainer container = new UnityContainer();`で**DIコンテナを生成**する
    - `container.RegisterType<インターフェース, インターフェースを実装したクラス>();`で**クラス**をコンテナに登録する
    - `container.BuildUp<注入先クラス>(new 注入先クラス());`で、登録したコンテナを使って注入先クラスをnewすると同時に依存性(注入先で使うクラス達)を**注入する**
    - 注入先クラスで、注入されたクラス(のインスタンス)を**使う**

# 動作メモ
### インスタンス化する(=コンストラクタが呼ばれる)タイミング
- 登録時は、インターフェースとそれを実装したクラスのペアを登録しているだけなのでnewされない。
依存性を注入するときに、都度newされる。
- **複数のクラスに注入されるときは、その都度newされる。(全クラスで同じインスタンスを見るわけではない)**

### コンストラクタについて
DogやCatクラスに、引数のあるコンストラクタを作ると、なぜか`var person = container.BuildUp<Person>(new Person());`のところで落ちてしまう。(「使えるコンストラクタがない」旨の例外発生)
→なぜ？
擬似乱数の話(線形合同法)

# はじめに
備忘録も兼ねて，大学の講義で勉強した内容をまとめます．
# 擬似乱数とは？
- コンピュータが生成する乱数
    - ソフトウェアで扱っている乱数は，実は完全なランダムではない
    - とあるアルゴリズムに従って生成
        - 周期が存在する
        - 計算式と初期値が分かれば同じ乱数列を再現できる

## 線形合同法について
線形合同法(Linear Congruential Generator:LCG)は，擬似乱数生成アルゴリズムの中で最もポピュラーで簡単なもの，ポケモンをはじめ様々なゲームで使われている乱数．
生成式は以下

$x_{n+1} = (A \times x_n + C) mod M$

初期値の$A$, $C$, $M$, $x_0$が決まればあとは上の漸化式に当てはめて生成ができる．
線形合同法の生成周期について

- 周期の最大は$M$
    - 条件(全て満たして周期が最大になる)
        - $C$と$M$が互いに素(最大公約数が$1$)
        - $A-1$が$M$の全ての素因数で割り切れる
        - $M$が$4$の倍数ならば$A-1$も$4$の倍数

### 計算例
手計算するのは面倒なのでPythonのプログラムに計算を任せます(怠惰)
計算プログラムは以下

```python
#coding:utf-8
A, C, M = map(int, input().split())
# 初期値の入力
x = int(input())
cnt = 0

# 最大周期を確認するためにrangeはM+1に設定
for i in range(M+1):
    print('x%d: %d' % (cnt, x))
    x = (A * x + C) % M
    cnt += 1
```
(...もっと賢い書き方があったかもしれないですが目を瞑ってください)

- 周期が最大にならない例と実行結果

$A=3, C=4, M=11, x_0=1$として実行してみます．

```
3 4 11
1
x0: 1
x1: 7
x2: 3
x3: 2
x4: 10
x5: 1
x6: 7
x7: 3
x8: 2
x9: 10
x10: 1
x11: 7
```
初期値$1$からスタートして，$x_5$でまた計算結果が$1$になるので周期は$5$ということになります．この例では「$A-1$が$M$の全ての素因数で割り切れる」という条件を満たしていないので，周期が最大にならないということが分かります．

- 周期を最大($M$)にする例と実行結果

$A=13, C=5, M=12, x_0=1$として実行してみます．

```
13 5 12
1
x0: 1
x1: 6
x2: 11
x3: 4
x4: 9
x5: 2
x6: 7
x7: 0
x8: 5
x9: 10
x10: 3
x11: 8
x12: 1
```

初期値$1$からスタートして，$x_{12}$でまた計算結果が$1$になるので周期は$12$，つまり$M$ということになります．

### 線形合同法の弱点

最大周期の例の計算結果を見ると分かりますが，割る数(ここでいうところの$M$)が偶数の場合，乱数は奇数と偶数がそれぞれ交互で生成されてしまいます．
「カルドセプトサーガ」というすごろくのようなゲームでこの仕様を知らずに乱数プログラムを実装した結果次に出るダイスの目が奇数か偶数かが推定できてしまうバグを生み出してしまったようです．
すごろくゲームでダイスの目が事前に分かってしまうのは致命的ですね...

#おわりに

勉強した範囲内ではありますが線形合同法についてざっとまとめてみました．
もし説明不足や間違った記述がありましたら指摘してくださると助かります．
乱数生成アルゴリズムには線形合同法の他にもメルセンヌ・ツイスタ法やxorshiftなどもあるみたいです，余力があればいつか勉強してまとめたいです．

#参考リンク

- Algoful - 線形合同法 ( http://algoful.com/Archive/Algorithm/LCG )
bashでPythonのバージョン指定を行う

ubuntu等のLINUXにはデフォルトでpythonの2系がインストールされているが、PythonとOpenCVの互換性の面からPythonの3系を使いたい場合がある。
しかし、Pythonのデフォルトは2系になっているため、3系をメインで使いたい場合、デフォルトにしておくと便利である。今回は、Pythonの2系から3系をデフォルトにする方法を説明する。

# バージョンの確認
ターミナルで``` $python ```でPythonを起動するとデフォルトに設定されているバージョンが立ち上がる。

# 環境変数の設定をする
 環境変数の設定を行う場合、'bash'に記述する。bashには、'bash_profile'と'bashrc'があり、このファイルに設定を記述することで使用環境をユーザ好みにカスタマイズできる。
'bash_profile'はログイン時に一回実行される設定で'bashrc'はシェルの起動時に一回実行されるといった特徴があり、今回は'bashrc'に記述をする。
まずは
```$which python3```
でPythonの3系がインストールされている場所のパスを確認する。
次に、
```$vi ~/.bashrc```
で設定ファイルを開き、好きな場所に
```alias python = 'Pythonの3系がインストールされている場所のパス'```
を記述する。
最後に、
```$source ~/.bashrc```
で設定を反映させる。

設定をしたら再び、
```$python```
でPythonを起動し3系が立ち上がれば設定完了です。
Python公式ドキュメントを読む - １

# 前書き
Python勉強するため、まず公式ドキュメントに目を通すことにしたので、まとめていく。


# 1. やる気を高めよう
このタイトルでいいん？笑
https://docs.python.org/ja/3/tutorial/appetite.html
## Pythonってざっくりどんなや？
- シェルスクリプト、バッチファイルより多くの機構があり、大きなプログラムの開発にも向いている
  - シェルスクリプトはファイル操作、テキスト操作には向いているが、GUIアプリケーション、ゲームには向いていない
- C、Javaよりも実行時に多くのエラーチェックを行なっている
  - C, C++, Javaはプログラムを書けるが、試し書きだけでも重労働
- 可変長配列や辞書など高級な型を持つ超高級言語
  - 高級感 C < Java < Python

## コーディング面での特徴
- 同じ機能をC, Javaで実装したときよりも短く、読み安く書ける
  - 複雑な処理を１つの実行文で書けたりする
  - 処理のグルーピングをインデントで行う
  - 変数、引数の宣言が不要（引数の宣言？）
- C言語のプログラムを組み込めたり、命令を投げれたりする

## 余談
Pythonの由来はBBCのショー番組 `モンティパイソンの空飛ぶサーカス (Monty Python's Flying Circus)` 
寸劇見ることも推奨してるw
Compute Engineのアクセススコープ変更

Compute Engineのインスタンス作成後にアクセススコープ権限を変更したくなり少し調べたので記載します。

## アクセススコープの変更方法

アクセススコープを変更するにはインスタンスを一度停止し、
gcloudコマンドでスコープの追加・削除をする必要があります。

## Cloud Shell

gcloudコマンドはGCPのWebコンソールから利用できるCloud Shell上から実行できます。
コンソールの右上にある以下のアイコンから起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413429/a224bcd4-e0d2-1f8e-ded5-c849466f0954.png)


## アクセススコープを有効にする

カンマ区切りで複数のスコープを設定します。このコマンドは追加ではありません。
仮に1つしかスコープが指定されていなければスコープが1つだけになってしまうのでご注意ください。

```
gcloud beta compute instances set-scopes projects/プロジェクトID/zones/ゾーン/instances/インスタンス名 --scopes default,compute-rw,bigquery,storage-full
```


## すべてのアクセススコープを有効にする

**cloud-platform** のスコープを指定することですべてのアクセススコープが有効になります。

```
gcloud beta compute instances set-scopes projects/プロジェクトID/zones/ゾーン/instances/インスタンス名 --scopes cloud-platform
```


## すべてのアクセススコープを無効にする

```
gcloud beta compute instances set-scopes projects/プロジェクトID/zones/ゾーン/instances/インスタンス名 --no-scopes
```






## 参考

- [gcloud beta compute instances set-scopes](
https://cloud.google.com/sdk/gcloud/reference/beta/compute/instances/set-scopes)
VSCodeでGASを編集できるようにした

#GASをVSCodeで実行できるようにした
Claspを使うと便利という話を聞いて、使えるようにしてみた
やった後の（うろ）覚え書

##インストールする環境
Windows10

##手順
0.[ClaspのRead me https://github.com/google/clasp/blob/master/README.md](https://github.com/google/clasp/blob/master/README.md)

1. VSCodeをインストールする
[VSCode https://code.visualstudio.com/](https://code.visualstudio.com/)

2. node.jsをインストールする(今回は推奨版を使用)
[node.js https://nodejs.org/ja/](https://nodejs.org/ja/)

3. VSCodeでnodeのバージョンをチェックしてnpmが使えるようにしとく
「Node.js Modules Intellisense」を拡張機能で追加しているが、これ必要かもしれない

4. ターミナルから以下のコマンド
`npm i @google/clasp -g`

5.アクセス許可を与える
[https://script.google.com/home/usersettings](https://script.google.com/home/usersettings)　→ON

以上でできた様子
ログインは `clasp login`でできた



###追加リンク(関係はないけど、この設定をしたのには関係ある)
[政府統計の総合窓口 e-stat](https://www.e-stat.go.jp/)
[GAS Reference](https://developers.google.com/apps-script/)
[Java]標準API(javax.script)でURLからJsonをGetして扱う

#はじめに

Javaでライブラリとか使わず気軽にJSONって扱えないのかなと思ってちょっと調べたメモ

Java8 で確認・検証してますが、javax.script は Java6 からあるみたい。

##サンプル

お天気情報をGetで取得します。

お天気Webサービス仕様 - Weather Hacks - livedoor 天気情報
http://weather.livedoor.com/weather_hacks/webservice

```java:Sampleクラス
public static void main(String[] args) {
  try {
    System.out.println("東京の天気");
    URL url = new URL("http://weather.livedoor.com/forecast/webservice/json/v1?city=130010");
    String json;
    // Get通信してStringに（evalするために丸括弧で囲む）
    try (BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream()));) {
      json = br.lines().collect(Collectors.joining("", "(", ")"));
    }// ↑ "({"forecasts":[{"dateLabel":"x",...},{"dateLabel":"y",...},...],...})" こんなString

    Bindings jsObj = (Bindings) new ScriptEngineManager().getEngineByName("js").eval(json);

    jsObj = (Bindings) jsObj.get("forecasts");
    // get(key)で取得できるが、戻りはObject型。必要に応じてキャスト

    // js配列は values() で
    jsObj.values().stream()
        .map(o -> (Bindings) o)
        .map(o -> o.get("dateLabel") + "\t" + o.get("telop"))
        .forEach(System.out::println);

  } catch (Exception e) {
    e.printStackTrace();
  }// 例外処理はまるっと雑にしちゃっています。ごめんなさい。
}
```

##ポイント

大事なところはインタフェース [javax.script.Bindings](https://docs.oracle.com/javase/jp/8/docs/api/javax/script/Bindings.html) へのキャストです。

ScriptEngine.eval() の戻り値が Objectクラスで、JsonをScriptEngineで実行させた場合のインスタンス [ScriptObjectMirror](https://docs.oracle.com/javase/jp/9/docs/api/jdk/nashorn/api/scripting/ScriptObjectMirror.html) などがアクセス制限で import できずに、キャストさせることができないので、リフレクションを駆使して操作しているパターンの情報が多い。

ScriptObjectMirror が実装している Bindings インターフェースは Map\<String,Object\> を継承している。
なのであまり難しいことは考えずにシンプルに get(String key) や keySet(),values() などMapのメソッドを利用することができます。
いやいや、Bindingsインターフェースとかいわれてもよくわかんないですよな場合は、もう Map\<?,?\> にキャストしちゃってもいいと思います。

キーはStringなので特に問題ないと思うのですが、get()の戻りなどは、またまたObjectクラスなので、Jsonのネストが深い場合は、Bindings か Map でキャストして操作します。
ちなみにjavascript配列は、インデックス番号を文字列としたキー("0","1","2",...)でアクセスできるよう格納されていると思われる。が、そもそも Map.values() を利用してアクセスすればいいんじゃないかなと思っています。
【ExcelVBA】指定した位置に表示範囲ごとアクティブセルを移動する

# 行・列番号またはセルアドレスを指定して移動する
ワークシート上でアクティブセルを移動するには、マウスかキーボードの矢印キー、もしくはショートカットキーを使いますよね。
でも縦横に長い表組とか(業務でありがち)で、先頭や末端以外の中間のセルには移動しにくい…
いっそ100行目とかAB列とかBX10とか直接指定して移動したい！って場合向けのマクロです。

普段は自分用のアドインに入れてCtrl＋Lのショートカットキーを設定して使っています。
エディタのノリで移動できてとても便利です。
アドインファイルの作り方とかはこの辺でざっと解説しています。
[【Excel】シート名を部分一致で検索するアドインを作る](https://qiita.com/11295/items/fdc1c2448d39078658eb)

# 機能
ダイアログに移動先を入力すると、表示画面上の位置は変えずにアクティブセルを指定した場所に移動します。
画面上でのアクティブセルの位置は変わらず、シートだけをスクロールする感じ。
入力値が移動先として妥当でない場合、何もしないで処理を終了します。
なお、全角/半角、大文字/小文字は中で変換しているので、気にせず入力できます。

- 行番号を指定する場合、数字(列位置は変更なし)
- 列番号を指定する場合、アルファベット(行位置は変更なし)
- セルを指定する場合、A1形式のセルアドレス

※ `Z100:AZ200`みたいな単一セルではなく範囲を指定した場合、範囲の左上のセルに移動します。

# ソースコード
```vb
' 指定した行番号・列番号にアクティブセルを移動する
Sub FocusCell()
    Application.ScreenUpdating = False
    Dim value As String: value = Trim(InputBox("移動先の行/列番号・セルを入力してください。", "移動先の指定", ActiveCell.address(False, False)))
    If Len(value) = 0 Then
        Exit Sub
    End If
    value = UCase(StrConv(value, vbNarrow))
    
    If Not value Like "*[!0-9]*" Then
        ' 行番号を入力した場合
        If Not isEnabledCellAddress("A" & value) Then
            Exit Sub
        End If
        Dim row As Long: row = CLng(value)
        Dim column As Long: column = ActiveCell.column
    ElseIf Not value Like "*[!A-Z]*" Then
        ' 列名を入力した場合
        If Not isEnabledCellAddress(value & "1") Then
            Exit Sub
        End If
        row = ActiveCell.row
        column = Range(value & "1").column
    ElseIf isEnabledCellAddress(value) Then
        ' A1形式でセルを指定した場合
        row = Range(value).row
        column = Range(value).column
    Else
        ' 有効な位置が指定されなかった場合
        Exit Sub
    End If
    
    With ActiveWindow
        With .VisibleRange
            Dim scrollRow As Integer: scrollRow = ActiveCell.row - .Cells(1, 1).row
            Dim scrollCol As Integer: scrollCol = ActiveCell.column - .Cells(1, 1).column
        End With
        
        Call Cells(row, column).Activate
        Call Application.Goto(ActiveCell, True)
        Call .SmallScroll(up:=scrollRow, toleft:=scrollCol)
    End With
    Application.ScreenUpdating = True
End Sub

' 文字列が有効なセルアドレスか判定する
Private Function isEnabledCellAddress(ByVal address As String) As Boolean
    isEnabledCellAddress = True
On Error GoTo RangeError
    Dim rng As Range: Set rng = Range(address)
    Exit Function
RangeError:
    isEnabledCellAddress = False
End Function
```
Mysql dump import で　テーブルを高速　オプティマイザ

Mysqlでは大量データーを削除後、テーブルサイズが変わらない時はオプティマイザが必要です。
`optimize table tablename` でもテーブルをオプティマイザできますが、時間かかる場合はあります。


+ オプティマイザ対象先の古いテーブルをdumpする

```
mysqldump -uwebmaster -h192.168.0.01 -pxxxxxxxxxx DATABASE_NAME table_name  > table_name.sql`
```

+ 万が一のため、古いテーブルをリネームする

```
ALTER TABLE table_name RENAME to table_name_old;
```

+ DumpしたSQLをインポートする

```
mysql -uwebmaster  -h192.168.0.01 -pxxxxxxxxxx DATABASE_NAME < ./table_name.sql
```

+ 古いテーブルを完全に削除する

```
drop table table_name_old;
```

これでtable_nameをオプティマイザできる
LINE WORKS + Azure Automation + IFTTT で LINE WORKS Bot からトークメッセージ送信

こちらの記事で Microsoft Flow と Azure Automation を使った LINE WORKS のトーク BOT API のメッセージ送信を紹介しました。

TITLE: LINE WORKS + Azure Automation + Microsoft Flow で LINE WORKS Bot からトークメッセージ送信
URL: https://qiita.com/iwaohig/items/3056b95597772061d17b

本記事では、IFTTT から Azure Automation を介した LINE WORKS のトーク Bot 連携を紹介します。

#Azure Automation の準備

Azure Automation の Runbook の準備は、上述の記事を参照してください。

IFTTT では、Runbook を直接呼びだすことはできませんが、Azure Automation で Webhook が設定できるので、IFTTT の Webhooks の機能を利用します。

TITLE: webhook を使用した Azure Automation の Runbook の開始
URL: https://docs.microsoft.com/ja-jp/azure/automation/automation-webhooks

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/f941f876-44b6-4cec-5907-63db362f74a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/c9ff1848-a2ce-3b54-ef64-840ad64fa2e4.png)

#IFTTT の準備

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/0ea11db8-7b98-6ee9-8398-f7ae8156fc6a.png)


IFTTT のアプレット作成時に "THAT" のアクションを指定する部分で Webhooks を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/77ac3511-28f6-e25d-417b-03246c30fdce.png)

Webhokks の URL に Azure Automation の Runbook で生成した Webhook の URL を記述し、Method は POST を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396107/fa8abc5f-3355-d228-3717-fdc783c18ad6.png)

#動作確認

作成したアプレットの "Check now" ボタンをクリックし、LINE WORKS の Bot からトークメッセージが送られることを確認します。

また、アプレットを有効にしトリガーに指定した動作によりメッセージが送られることを確認します。
開発環境でアプリ内課金しようとしたらエラーが出た

dev環境でアイテムを課金購入しようとしたらエラーダイアログが出てきた

#解決策

どうやらiOSアプリのアプリ内課金の動作テストをする際には、普段実機で使っている Apple ID（通常アカウント）では、リリース前のアプリのアプリ内課金はできないらしく、iTunes Connectで作ったテスト用アカウントが必要らしいです。

なので一旦使用しているappleIDをサインアウトしてsandbox用のものでサインインしなおしたら通りました


#参照
https://joyplot.com/documents/2016/11/12/itunes-connect-purchase-account/
https://akiyoko.hatenablog.jp/entry/2013/11/09/144703
古いサーバーにWindows2012R2をインストールしようとしてはまった話

**先に結論を言うと、DVD-R DLを買うと難しいことしなくてもすぐにインストールできるからおすすめです。**

とあることから、HPのML350p Gen8をWindows2012R2に仕立てなければならなくなったので、鼻歌交じりでやってたら予想外、なまら苦労したので、そんな人はもう少なくなってるとは思うけど、自身の備忘録として書きとめようと思います。
あと、多分、この年代の筐体に2016とか入れようとしてもおんなじことが起きるかもしれません。同じ症状が出た場合、ぜひ試してみてください。

#事の発端
まあ、windows2008が動いていたから、ライセンスを持っている2012R2に入れ替えしたいってだけ。ありがちの作業がこんなに大変になるとは・・・!


###最初にやったこと
Win2012R2のISOをダウンロードし、2008でマウント、アップグレードでインストール!でいいかなあと、そんなに大事なサーバでもないのでサクッと楽しようとしたところ...途中でエラー発生。
ロールバック。これを数回繰り返す。
パス[offlineServicing]で無人設定を適用できませんでした。
ってのが出てたけど、「まあ、なんかのエラーなんでしょ。」と思い、大した気にしない。
※といいつつ、検索してるけど、イマイチなんだかどうなんだろうって感じで結局無視。
![IMG_6479.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104684/98e368bd-88c0-c1a8-45fa-f468bd01ca02.jpeg)


###次にやったこと
ブータブルUSBをつくって再セットアップを直接起動してみよう!と思い、ブータブルUSBを作る。
ブータブルUSBについては、https://docs.microsoft.com/ja-jp/windows-server-essentials/install/create-a-bootable-usb-flash-drive
ここ見るとよくわかります。
やっぱり途中でエラー出る。くーっ!!

###その次にやった事
もしかしたらRAID?そう。これ、RAID1で組んでいるので、なんかその辺がダメなのかもしれない。
RAIDの再構成をしてみる。ダメ。
んじゃ、次はHPのIntelligent Provisioningでインストール試してみる？と思い、別なUSBメモリにISOファイルを入れ込んでIntelligent Provisioningからインストール。失敗。
いよいよ嫌な予感がしてきた。
基本的にHPのサーバちゃんはIntelligent Provisioningでインストールするのが常とう手段なので、Intelligent Provisioningのアップデートでもしてみようかな?

###Intelligent Provisioningアップデート。が、しかし。
Intelligent Provisioningをアップデート。
https://h20392.www2.hpe.com/portal/swdepot/displayProductsList.do?category=IP
より、HPE Intelligent Provisioning Recovery Media Version 1.63をダウンロードし、DVDを作る。んで、インストール。無事アップデート完了。なんか見た目も変わって良さげ。
さあ、ここまできたらあと一歩。
Intelligent Provisioningから、インストールを....なに。ISOファイルを見つけられないだと?
Intelligent Provisioningアップデート前は、USBに入れ込んだISOファイルの読み込みができていたので、アップデート後、それができない。もうなんなの。

###再度ブータブルUSBだ!!
Intelligent Provisioningをアップデートしたってことはなんかいい感じにファームウェアとか変わってるはずだから、ブータブルUSBいけるんじゃね？と思い、起動。
あれ、今度はストレージが見えない....なんだよこれもう。
しかし、ここで、あれ？と思えました。RAIDを再構築したにも関わらず、こんな表示出るってことは、やっぱりRAID周りだよな？きっと。ドライバがダメっぽいよな？

###ドライバの検索
んで、検索してみました。ありました。

[HP MicroServer Gen 8 に Windows Server 2012 R2 をインストールする際の注意点](https://satsumahomeserver.com/blog/3335)

こちらの記事の通り、うちが使っているRAIDコントローラも、HP Dynamic Smart Array B120i RAID Contorollerです。そうかやっぱりこの辺が問題なのかと思ったのもつかの間、解決策をみると、「RAIDを切ってください」とのこと。
記事も2013年のものなので、当時はドライバも提供されてなかったんでしょう。今ならあるはず。

https://support.hpe.com/hpsc/swd/public/detail?swItemId=MTX_abaa5952034546cf8b66d214e9

ありました。これをダウンロードしてうまく入れ込めればなんとかなるかしら。
Intelligent Provisioningでのインストールではドライバの読み込みできないから、ブータブルUSBでやればドライバの読み込みできるはず。

###ドキドキのドライバ適用
ということで、ブータブルUSBからインストーラーを起動、ドライバ適用.....見えた!!ついに見えたよ!!
やっとインストールできるぜ!!と思ったのもつかの間

**「新しいパーティションを作成できなかったか、既にあるパーティションが見つかりませんでした」**

のエラー。
もう、見つけろよ。Windowsよ!!

###調べてみた
どうやら、上のエラーは、USBメモリでインストールやらなんやらさせると出てくる問題っぽい。
[Windows10のクリーンインストールで躓きがちなこととその対策](https://qiita.com/tarosuke@github/items/a593fd091cbbc3f2ba8b)
こちらを参考に、ブータブルUSBの内容をHDDに書き込み。

##結果
やっとインストールが...できた!!
と、まあ、原因がわからず錯綜したので、何気に5日間くらいこれかけてる()んですが、たぶんいろいろやることなく、

- Windows2012R2を素直にDVDなどに焼く。（ただし2層じゃないと焼けない。）
- https://support.hpe.com/hpsc/swd/public/detail?swItemId=MTX_abaa5952034546cf8b66d214e9 のドライバをダウンロードしてUSBメモリに搭載しておく
- DVDから起動して、ドライバを読み込みインストールする。

こうすることで、ブータブルUSBの内容をわざわざHDDにコピーさせることもなく、時間を無駄にしないはずです。まあ、いろいろ試すとそれだけ楽しいんですけどね（辛いけどw）。
YouTubeをページを開いた瞬間に再生させる方法(2019/5/14現在)

##はじめに
Webサービスの基本はメディアサイトだと思っていて、おそらく世界最大であろう下記のサイトを見てタイムリーに動画再生をさせる方法が気になった。

「CNN」
https://edition.cnn.com/

##結論
下記のコードになります

```sample.html
<!DOCTYPE html>
<html>
  <body>
    <!-- 1. The <iframe> (and video player) will replace this <div> tag. -->
    <div id="player"></div>

    <script>
      var tag = document.createElement('script');

      tag.src = "https://www.youtube.com/iframe_api";
      var firstScriptTag = document.getElementsByTagName('script')[0];
      firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

      var player;
      function onYouTubeIframeAPIReady() {
        player = new YT.Player('player', {
          height: '360',
          width: '640',
          videoId: 'M7lc1UVf-VE',
          events: {
            'onReady': onPlayerReady,
            'onStateChange': onPlayerStateChange
          }
        });
      }
      function onPlayerReady(event) {
        event.target.playVideo();
      }
      var done = false;
      function onPlayerStateChange(event) {
        
      }  
    </script>
  </body>
</html>
```

##諸々
スマホのブラウザではいかなる方法でもページを開いた瞬間に再生させることはできない。
videoタグでもできるとの情報がありましたができないようです。

##参考
やっぱり公式ドキュメントが最強ですね

iframe 組み込みの YouTube Player API リファレンス
https://developers.google.com/youtube/iframe_api_reference?hl=ja
乱数で出力した数値の桁数の求め方


	public static void main(String args[]) {
		Random random = new Random();
		int num = random.nextInt(10000)+1;
		int valLen = String.valueOf( num ).length();
		System.out.println(num + "の桁数は" + valLen);
	}
}

このコードは1以上1000未満の数値をランダムに出力する
String.ValueOf()メソッドを使うことで数値から文字列へ変換し、.lenghtで
文字化した数値の桁数を測る
さくらサーバで特定のディレクトリだけPHPのバージョンを変更したらLaravelのartisanが動かなかった

# 前提
* サーバのPHPのバージョン設定は5.6系（大人の事情で変更できない）
* Laravel 5.8.*を使いたい
* タイトルの通り php.cgi で任意のディレクトリのみPHPのバージョンを7.3.*に変更


# 症状
ssh接続してLaravelディレクトリのartisanファイルのある階層に移動して

```
$ php artisan list
```

を実行しても何も表示されない。


# 対応
こんな具合に直接指定する。

```
$ /usr/local/php/7.3/bin/php artisan list
```


# まとめ

```php:info.php
<?php
phpinfo();
```

を

```
$ php info.php
```

したらおめーのバージョンは5.6って言われた（当たり前）。