OmniAICreator/Qiita-1.07M huggingface dataset:
Vue CLI × Laravel × VuetifyでCSSいらずの爆速開発でTodoリストを作る part2

#前回のパート
前回はVue CLIとLaravelの環境構築を含め、VuexやVue RouterのセットアップとVue MetaとVuetifyの
インストールを行いました
前回の記事はこちら→[Vue CLI × Laravel × VuetifyでCSSいらずの爆速開発でTodoリストを作る part1](https://qiita.com/Kyu-Taro/items/c42cf6f701e7d673ec52)
今回は、本記事で作成するTodoリストに使うテーブル作成から行います

#Authの導入
まずはターミナルから`$ php artisan serve`と`$ npm run serve`を実行して
LaravelとVue CLIを動かしておいてください

また事前に、.envファイルのDBの設定とDBの作成を行ってください
Laravelの認証を使うためにAuthを導入していきます
コマンドにて下記を実行してください
`$ composer require laravel/ui`
`$ php artisan ui vue --auth`
`$ php artisan migrate`
`$ npm install`
`$ npm run dev`
上記を順に実行することで、LaravelでAuthが導入できLaravel側でのデフォルトの認証画面にアクセスできる状態になります(今回はview側はVueを使用するため使いません)

#マイグレーションの作成
まず今回使うテーブルは2種類になります
ユーザーの情報を扱う、UsersテーブルとTodoの情報を管理するTodosテーブルになります
Usersテーブルは上記のAuthの導入をした際に、作成されているUsersテーブルをそのまま使うので
ここで作るテーブルはTodosテーブルのみになります
早速Todosテーブルのマイグレーションを作成していきます
コマンドにて下記を実行
`$ php artisan make:migration create_todos_table --create=todos`

作成されたファイル`database/migrations/XXXX_XX_XX_XXXXXXX_create_todos_table.php`を開き下記と同じ様に書き換えてください

```XXXX_XX_XX_XXXXXXXX_create_todos_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class TodosCreateTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->id();
            $table->integer('user_id');
            $table->text('text');    
            $table->softDeletes();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('todos');
    }
}
```

上記が完了したら、マイグレーションを実行しましょう
`$ php artisan migrate`
実行したら作成したマイグレーションのテーブルが作成できているか、確認してください

以上で今回使用する、テーブルの準備が整いました

#終わりに
今回は、Authの導入とマイグレーションファイルの作成を行いました
次回から会員登録やログインなどの認証まわりの実装に入っていきます

次のパートはこちら→[Vue CLI × Laravel × VuetifyでCSSいらずの爆速開発でTodoリストを作る part3](https://qiita.com/Kyu-Taro/items/ea7452abfdf473e16cd5)
Raspberry Pi 初期設定

# はじめに
Raspberry Pi の初期設定について，他人に教えることが有ったのでメモを残しておきます。

# 環境
- Raspberry Pi model 3 B
- Raspbian OS 2019-07-10(Buster)

# OS イメージのダウンロード
- [公式HPからダウンロード](https://www.raspberrypi.org/downloads/raspbian/)

# SDカードに焼く
- 今回はddコマンドを使用

## Mac
SDカードを挿したら，

```
diskutil list
```
でSDカードのパスを確認する。
今回は，```/dev/disk-hoge``` として記事を書く。
次に，SDカードをアンマウントする。

```
diskutil unmountDisk /dev/disk-hoge
```
最後に，ddコマンドを使ってSDカードに焼く

```
sudo dd if=raspbian.img(イメージファイルのパス) of=/dev/rdisk-hoge(SDカードのパス) bs=16m(書き込む際のブロックサイズ)
```
ブロックサイズは環境によって最適な値が異なる。
詳しくは，他の人の記事を参考にすること。

## Ubuntu

```
df -h
```
コマンド辺りでSDカードのパスを確認する。
今回は，```/dev/mmcblk0``` として記事を書く。
次に，SDカードをアンマウントする。

```
umount /dev/mmcblk0
```

最後に，ddコマンドを使ってSDカードに焼く

```
sudo dd if=raspbian.img of=/dev/mmcblk0 bs=16m
```
ddコマンドのプログレスバーを表示させることもできるので，他の人の記事を読んでみる事。


# Raspberry Pi のWi-Fi接続 (ヘッドレスインストール)
最初からWi-Fiに接続し，ssh接続をし設定できるように準備をする。
SDカードのbootディレクトをterminal等で開き，

```
touch ssh
```

を作成し，sshを有効化する。
次に，Wi-Fiアクセスポイントの設定をする。
bootディレクトリ下に'wpa_supplicant.conf'に設定を書けばOK

```
network={
    scan_ssid=1 #ステルスAPの場合
    ssid="ssid"
    psk="暗号化キー"
}
```

# Raspberry Pi の起動
編集したSDカードをRaspberry Pi に接続し，起動する。
初期状態は，ユーザ名: pi，ホストネーム: raspberrypi，パスワード: raspberry である。
ローカル内で接続する際は，

```
ssh pi@raspberrypi.local
```
で接続可能である。
あとは，ご自由に自分の使いやすい環境を構築しましょう。

```
sudo raspi-config
```

で初期設定(ホストネームやパスワードの変更)などが可能です。
pubspec.yamlから消したパッケージのエラーが出る時はlockファイルを消してinstallしなおせばいい

タイトルが全てです。

# 問題

[Flutter freezedパッケージいい感じかも](https://qiita.com/_masaokb/items/19a93be6079a80ac2d85)をみていて自分で動かした際、`flutter pub pub run build_runner build`においてがっつりエラーがでた。

どうやら`pubspec.yaml`から`freezed_annotation`を入れ、`json_annotation`を消してinstallをしたにもかかわらず`pubspec.lock`に`json_annotation`の依存関係が残っていた。

# 解決

`pubspec.lock`を削除してinstallをし直せばOKです。
HTMLのリアルタイムプレビュー環境を雑に整える

#はじめに
HTMLファイルを書くとき、以前は一回一回VSCodeをターミナルで起動し、ファイルを編集してからChromeで確認するという面倒な方法を取っていました。しかも、普段はVimを使ってるのでVSCodeを使う機会はそうありません。しかし先日、N予備校のプログラミング学習コースが無料で提供されているということで、Webを一回しっかりと触ってみたいと思うようになりました。そういうわけで、快適にHTMLファイルのブラウザ表示の確認をするためにVSCodeの設定をしたいと思います。

#HTML Previewのインストール
といっても、やることは至極簡単です。VSCode左側の![Screenshot from 2020-03-17 16-16-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588760/56b92854-8335-74fd-dae8-8d8226334513.png)マークを選択して、「html preview」と検索すれば簡単にVSCodeの拡張機能がヒットします
![Screenshot from 2020-03-17 16-19-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588760/ce7cee41-3c50-9acc-a8d8-66e4aed2c95a.png)
Installをクリックです
![Screenshot from 2020-03-17 16-20-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588760/67d9f61f-33b4-22d9-64fa-dd677d85f6e0.png)
`This extension is enabled globally「この拡張機能はグローバルに使用可能です」`と表示されましたので、早速使ってみましょう！![Screenshot from 2020-03-17 16-42-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588760/df6dd7c6-1c5f-bb92-5b19-0b7e4ce2d93c.png)


VSCode内でHTMLファイルを選択します。


この状態で**`ctrl`を押しながら`k`、その後`ctrl`と`k`を離して単体で`v`を叩きます。**

![gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588760/c360b004-27be-c7eb-135b-c79bebd9ca67.gif)

ブラウザ表示できました！画面は「うまれた歳からの秒数を表示するページ」です。このHTML Previewですが、JavaScriptで付けた動きも表示してくれるみたいですね！**（Texファイルなどにも対応しているPreview拡張を入れても、JavaScriptの動作を確認できませんでした。）**Webページを作る時にかなり効く機能ではないでしょうか。

※僕、レポート類全部Texファイルで書いてGit管理したいと考えているんですが、Tex対応してる拡張の方を入れてもHTML Previewはちゃんと動きました。複数刀流が良さげですね。

#参考
Visual Studio Codeでhtmlコーディングはリアルタイムプレビューがすごく良い
https://rui-log.com/vscode-html-cording/#VScodeMarkdown
Haskellの型クラスで遊ぶ

#Haskellで「初めての型クラス」

Haskellの型クラスのことがよく分からなかったので、とりあえず、適当に作って動かしてみました。
分からなければ、実際に作り、動かす！

#Haskellの型クラスを用いたプログラム

```class.hs
data Book = Dic | Novel | Comi | Note

data Fun = Toobad | Bad | Usual | Good | Verygood

data Pages = Pages Book Int

isfun :: Book -> Fun
isfun Dic = Toobad
isfun Novel = Toobad
isfun Comi = Verygood
isfun Note = Usual

fun_tostring :: Fun -> String
fun_tostring x =
    case x of
        Toobad -> "Too Bad!!"
        Bad -> "Bad!"
        Usual -> "Usual..."
        Good  -> "Good.."
        Verygood -> "Very Good!!"

class Haskell a where
    fun :: a -> Int
    difficult :: a -> Int

instance Haskell Pages where
    fun _ = 100
    difficult _ = 10000

f b = fun b

main::IO()
main = do
    let haskell_book = Pages Dic 600

    let fun=fun_tostring(isfun ((\(Pages book page) -> book) haskell_book))
    print fun

    let page=((\(Pages book page) -> page) haskell_book)
    print page

    let h = f haskell_book
    print h
```

実行結果は

```
"Too Bad!!"
600
100
```

##解説

`Book`は、本の種類を定義してます。
`Fun`は、面白さ、`Pages`は、ページ数を定義します。

関数`isfun`は、`Book`型を取り`Fun`型を返します。
`fun_tostring`は、`Fun`型を取り、それに応じた`String`を返します。
クラス`Haskell`は、関数`fun`と`difficult `を持ち、`Int`型を返します。
クラス`Haskell`のインスタンスは、相当手を抜いており、単純に決まった数値を返します。

###main関数内

main関数内の解説をします。

```class.hs
    let haskell_book = Pages Dic 600
```

`haskell_book`は、600ページある辞書であると、定義しています。

```class.hs
    let fun=fun_tostring(isfun ((\(Pages book page) -> book) haskell_book))
    print fun
```

ラムダ関数により、`haskell_book`から本の種類を取り出し、`isfun`関数によりその本の種類の面白さを調べます。
`fun_tostring`関数により、面白さに応じた`String`型を取得します。
それを`print`します。（実行結果１行目）

```class.hs
    let page=((\(Pages book page) -> page) haskell_book)
    print page
```

`haskell_book`から、ページ数を取り出し、`print`します。（実行結果２行目）

```class.hs
    let h = f haskell_book
    print h
```

関数`f`に、`haskell_book`を渡し、関数`fun`を実行してます。（実行結果３行目）

##今回の型クラスいじりで知ったこと

今回、Haskellの型クラスを知るために、いろいろいじってみました。
知ったことと言っても、型クラスの使い方くらいです。
[Python] 図の色を指定する方法まとめ

## 色の指定

### color名

[Python でデータサイエンス: matplotlib で指定可能な色の名前と一覧]
(https://pythondatascience.plavox.info/matplotlib/%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)

### cmap名
[beizのノート: matplotlibのcmap(colormap)パラメータの一覧。]
(https://beiznotes.org/matplot-cmap-list/)


### RGB値＋透明度Aによる色の指定

- 文字列で指定: '#????????'，上から2桁ずつRGBAの順．透明は末尾2桁を00．
- タプルで指定: (R,G,B,A)の順，各値は0-1．透明は0.0

ちなみに全くの透明で見えないという状態は「透明度0%」と呼ぶ．
一覧は以下．
[原色大辞典]
(https://www.colordic.org/)
[Qiita@konifar: ARGBのカラーコード透明度まとめ]
(https://qiita.com/konifar/items/106731d8a35303606597)
参考：[Python by Examples: Transparent colors]
(http://python.omics.wiki/plot/matplotlib/transparent)

例：

```Python
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0.0, 15.0, 0.1)
y = np.sin(x)
plt.plot(y      , color='#ff4500'  ) # orangered
plt.plot(y - 1.0, color='#4169e1'  ) # royalblue
plt.plot(y - 2.0, color='#4169e199') # royalblue，透明度60%
plt.plot(y - 3.0, color='#4169e133') # royalblue，透明度20%
plt.plot(y - 4.0, color='#4169e100') # royalblue，透明度0%なので見えない
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270660/6a0a16c8-6e60-5d06-edca-872c36719eca.png)


### 色の名前→RGB値の変換にはcolors.to_rgb(color_name)

- to_rgb : (R, G, B)　 の長さ3タプル
- to_rgba: (R, G, B, A)の長さ4タプル

これで色の名前＋透明値の指定が簡単に．

```Python
from matplotlib import colors
print(colors.to_rgb ('royalblue')) # (0.2549019607843137, 0.4117647058823529, 0.8823529411764706)
print(colors.to_rgba('royalblue')) # (0.2549019607843137, 0.4117647058823529, 0.8823529411764706, 1.0)
```

[stackoverflow: Python from color name to RGB]
(https://stackoverflow.com/questions/51350872/python-from-color-name-to-rgb)




## imshowの色を離散的に指定

``` Python
from matplotlib import colors
cmap = colors.ListedColormap(['white', 'red'])
bounds=[0,5,10]
norm = colors.BoundaryNorm(bounds, cmap.N)
img  = plt.imshow(zvals, interpolation='nearest',
                  cmap=cmap, norm=norm)
plt.colorbar(img, cmap=cmap, norm=norm, boundaries=bounds, ticks=[0, 5, 10])
```

https://stackoverflow.com/questions/9707676/defining-a-discrete-colormap-for-imshow-in-matplotlib


## 1つのカラーマップから離散的に色を指定

複数の折れ線グラフを描くときなど．

```Python
cmap = plt.get_cmap("Blues")
for i in xrange(len(y)):
    plt.plot(x, y[i], c=cmap(float(i)/N))
```

[Qiita@Tatejimaru137: Matplotlibのグラフの色を同系色で揃える（カラーマップ）](https://qiita.com/Tatejimaru137/items/c18692d0e7144b431518)


## カラーマップの基準を調整

[Qiita@aisha: 【Python】カラーマップの基準を調整](https://qiita.com/aisha/items/6552aad86bd217befceb)
Rails + GitHub の導入

## 概要
Ruby on Rails 作成したアプリケーションを GitHub に登録して管理するまでの流れになります。

## 目次
1. Rails アプリケーションのローカルリポジトリを作成
2. GitHub にリモートリポジトリを作成
3. ローカルリポジトリとリモートリポジトリを結びつける
4. ローカルリポジトリをリモートリポジトリに反映


## 1. Rails アプリケーションのローカルリポジトリを作成
ターミナルで rails new コマンドを実行し、ローカルレポジトリを作成します。

```rails:ターミナル
$ rails _<railsのバージョン>_ new <アプリの名前> -d <データベースの種類>

# （例）
# $ rails _5.2.3_ new test-github -d mysql
# "5.2.3"バージョンで、データベースに "mysql" を使用し、"test-github" という名前のアプリを作成する。
```
## 2. GitHub にリモートリポジトリを作成
GitHub で「＋」メニューから「 New repository 」をクリックします。
![image](https://user-images.githubusercontent.com/56828853/76825723-034fd700-685e-11ea-9a75-7e339059da2b.png)

リモートレポジトリ名を入力し、「 Create repository 」ボタンをクリックしてリポジトリを作成します。
![image](https://user-images.githubusercontent.com/56828853/76826988-216b0680-6861-11ea-8f25-4a5df1b0afd7.png)

以下の様な画面になれば、リモートリポジトリの作成は完了です。
![image](https://user-images.githubusercontent.com/56828853/76827984-4fe9e100-6863-11ea-97c7-728424a3002b.png)

## 3. ローカルリポジトリとリモートリポジトリを結びつける
まずURLをコピーします。
![image](https://user-images.githubusercontent.com/56828853/76828561-9a1f9200-6864-11ea-955c-4617956d497c.png)

次にコマンドで操作します。

```rails:ターミナル
$ cd ~/test-github
$ git remote add origin <先程コピーしたURL>

# (例)
# git remote add origin https://github.com/username/test-github.git
```

```rails:コマンド説明
git remote add
# ローカルリポジトリにリモートリポジトリの情報を付与して、紐づけを行うためのコマンドです。

origin
# リモートリポジトリの場所の別名です。他の名前をつけることも出来ますが、GitHubのリモートリポジトリに対してはoriginとすることが一般的です。
```

以上で紐づけは完了です。以下のコマンドで確認しましょう。

```rails:ターミナル
$ git remote
origin
``` 
ここで origin と出力されれば完了です。
## 4. ローカルリポジトリをリモートリポジトリに反映
3.で紐づけが完了したので、ローカルリポジトリの現状の情報を、リモートリポジトリに反映します。
以下のコマンドを実行します。

```rails:ターミナル
$ cd ~/test-github
$ git add .　　　　　　　　　　　　　 # すべて(.)の修正ファイルをインデックスに追加
$ git commit -m "first_commit"　　# コミットメッセージを付与してコミット
$ git push origin master
```

```rails:コマンド説明
git add <記録するファイル名>
# インデックスに追加して、変更修正記録の対象とすることができます。

git commit -m "<コミットメッセージ>"
# インデックスに追加されている変更修正を、コミットするためのコマンドです。-mのオプションはコミットメッセージと呼ばれ、どのような変更を行ったのかメモを残せます。

git push
# ローカルリポジトリでのコミットをリモートリポジトリ（origin）に反映させる操作ができます。
```
最後にブラウザで確認してみましょう。先程のリモートリポジトリ作成後のページをリロードしてください。
![image](https://user-images.githubusercontent.com/56828853/76833974-af4dee00-686f-11ea-9a03-72ec766dd003.png)
上記のような表示なっていれば正しく反映できています。

以上で Rails + GitHub の導入は完了です。
Moment.jsで対象の日付が期間内か判定するisBetween()の使い方メモ。

タイトルの通りです。

isBetWeen()は対象の日付が期間内かどうかを判定する事ができます。

## 追記：Moment.jsはレガシープロジェクトになりました
Moment.js for Apps ScriptのおおもとであるJSのMoment.jsは2020年9月をもって新機能などの開発は廃止となりました。 詳しくは[こちら](https://momentjs.com/docs/#/-project-status/)
今後新規開発するときはあまりMoment.jsを使わない方がいいかもしれません。

JSとしては[Luxon](https://moment.github.io/luxon/)というのが後継となるそうです。
Luxon for Apps Scriptとかできるといいですね！

## 使い方

```javascript

moment('2020-03-03').isBetween('2020-03-01', '2020-03-05', 'day', '(]'); // true
```

param1: 比較したい期間の初め
param2: 比較したい期間の終わり
param3: どの単位で比較するか
param4: 以上、より大きい、以下、未満の指定

param3はyear, month, day, hour, minuteのどれか、
param4は下記の通り。
'(' : '<'
')' : '>'
'[' : '<='
']' : '>='

重複判定とかに役立てられる。
GitHub上で自分のリポジトリのwiki内を検索する方法

## 自分のリポジトリのwiki内を検索する方法

- どこに何を書いたかわからなくなった私のような人用。

### 1.検索窓に以下のように検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95786/35a12e77-4343-ba1a-b679-1ead2f0cde07.png)

- GitHubのヘッダーの検索窓に以下のようにキーワードを入力して検索する。

```
[検索したいワード] user:[自分のユーザ名]
```

例

- `firebase` というキーワードを `sonoshou` ユーザの中のリポジトリのwikiから検索する。

```
firebase user:sonoshou
```

### 2.Wikis を選択

- 検索した直後は、 `Repository` が選択されているので、 `Wikis` を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95786/b4d18b29-7251-5f83-d205-ea09c51fa242.png)


## その他（参考URL）

- 親切に、公式が、日本語で、wiki検索について記載されています。
  - [ウィキを検索する](https://help.github.com/ja/github/searching-for-information-on-github/searching-wikis)
- また、wiki検索以外の検索についても記載されています。
  - [GitHub上で検索する](https://help.github.com/ja/github/searching-for-information-on-github/searching-on-github)
Node.jsでDeprecationWarningを出さずにencodeとdecode

# 環境
```zsh
$ node --version
v12.16.1
```

# 経緯
`Buffer` を使って、encodeしたかった時に`DeprecationWarning`が出てしまったため対処
encode自体は問題なくできるが、[nodejsのドキュメント](https://nodejs.org/ja/docs/guides/buffer-constructor-deprecation/)的には対応した方が良さそう

```test.js
const before = 'hogehoge'  // これをbase64でencodeしたい
const buffer = new Buffor(before)
const after = buffer.toString('base64')
console.log(after)
```
↓

```zsh
$ node test.js
aG9nZWhvZ2U=
(node:631) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.
```

# やったこと
`new Buffer`の書き方を修正した

```test.js
const before = 'hogehoge'
const after = Buffer.from(before).toString("base64");
console.log(after)
```

↓ 無事エラーが消えた！

```zsh
$ node test.js
aG9nZWhvZ2U=
```

# ちなみに、decodeはこちら
```test.js
const after = 'aG9nZWhvZ2U'
const before = Buffer.from(after, 'base64').toString()
console.log(before)
```
↓

```zsh
$ node test.js
hogehoge
```

# 参考
https://stackoverflow.com/questions/23097928/node-js-throws-btoa-is-not-defined-error
円周率には全ての数字の組み合わせが現れるか？

　ふと気になったので検証してみた。
今回は

```math
\begin{align}
f(x) &= x桁の整数がすべて現れるような桁数
\end{align}
```
として計算します。
例えば、f(x)=33というのは、（整数部を含め）小数第32位まで見ればすべての数字が表れるということを示しています。

 ある無理数において特定の数列が存在することを証明するのには観測するしかなく、観測するまでそれが存在するかどうかは分からないが観測した瞬間に特定の数列が無理数に存在することが示されるの、面白くないですか？ぼくは面白いと思います。例えば0が12桁連続で存在する場所だったり、直観に反していたとしても観測さえしてしまえば存在するのです。13桁連続で存在する場所はぼくは知らないのですが、存在するかもしれないと考えたらワクワクします。日本科学未来館とかでそんな感じの展示があった気がするけれど、最後に行ったのが小学生の頃なので詳細までは覚えてないです。

##検証コード

```python

n = int(input())
with open("pi-10oku.txt") as f:
    pi = f.read()
    print("read")

length = [False] * (10**n)
for i in range(len(e)):
    length[int(e[i:i+n])] = True
    if sum(length) == 10**(n):
        print(i+1)
        break
```

pi-10oku.txtは[こちら](https://www.tstcl.jp/ja/randd/pi.php "円周率")からダウンロードできます。
String型で検証するので、小数点はあらかじめ消しておくと良いでしょう。
もしくはこちらのプログラムで計算することが出来ます。
[参考:円周率を求める](https://cheeseshop.hatenadiary.org/entry/20080314/1236237562 "円周率を求める")

```python

def arctan(p, n):
    x = p//n
    nn = n*n
    c = 1
    s = x
    k = 1
    while x > 0:
        x //= nn
        k += 2
        c = -c
        s += c*(x//k)
    return s

def pi_mantissa(digit, redund=10):
    p = 10**digit
    q = 10**redund
    p *= q
    pi = 4*(12*arctan(p,18)+8*arctan(p,57)-5*arctan(p,239))
    pi //= q
    return pi

print(pi_mantissa(求めたい桁数))
```

こちらのプログラムは、1万桁程度なら高速に求めることが可能ですが、桁数が多くなるほど計算時間がめちゃくちゃ伸びるので注意してください。
##実行結果

```
n=1 -> f(x)=33
n=2 -> f(x)=606
n=3 -> f(x)=8554
n=4 -> f(x)=99847
n=5 -> f(x)=1369561
```

##感想
 nが大きくなったらなんか収束しそうだけど計算を待つのがしんどいです。
 途中経過とかを見ていると、やはり最初はテンポよく見つかっているけれど後の方になっていくにつれて見つかるのが遅くなってゆくので、コンプガチャが違法になる理由も分かるなぁと思いました。

###余談
ネイピア数だとこうなります。
ネイピア数は良い感じのネットソースが無かったのですが、[こちら](http://ankokudan.org/d/e.htm "ネイピア数")のデータを良い感じにコピペしたり改行や空白を置換すると使えるデータになります。
置換に関しては、ぼくは普段Wordを使っていますが、好きなものを使えばいいと思います。

```
n=1 -> f(x)=21
n=2 -> f(x)=371
n=3 -> f(x)=8090
n=4 -> f(x)=102125
n=5 -> f(x)<1000000
# n=5 において、100万桁調べたときは99999通り見つかっています
```
100万桁までのデータしか見つからなかったので、n=5の解を見つけることが出来ませんでした。
Vueのプロジェクトを作成してみるだけの記事


# 初めに
[Vueのプロジェクト作成だけで躓いた](https://qiita.com/knoth071211/items/2a90c07abed00cff9e72)を書いた際にそもそも古いバージョンのvue-cliを使っていたことを知り書き直しました。

VueJS触れるときのテンプレートとして作りました。
プロジェクト作成→ローカルでの実行→テストの実行 ができることを目標とします。

# 実施環境

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.3
BuildVersion:	19D76

$ node -v
v13.9.0

$ npm -v
6.14.2
```

# Vueを使えるようにするまで
## npmを使ってVueCLIをインストールする
(今回はグローバルインストールしていない)

``` 
mkdir VueJsProjects
cd VueJsProjects
npm init -y
npm install @vue/cli
```

## Vueのパスを通す

```
sed -i '' 's/\"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"/\"vue\": \"vue\"/g' package.json
```

## プロジェクトを作成する
以下の設定でプロジェクトを作成していきます。

```
$ npm run vue create hogehoge
Vue CLI v4.2.3
? Please pick a preset: Manually select features
? Check the features needed for your project: Babel, Router, Linter, Unit, E2E
? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
? Pick a linter / formatter config: Basic
? Pick additional lint features: (Press <space> to select, <a> to toggle all, <i> to invert selection)Lint on save
? Pick a unit testing solution: Jest
? Pick an E2E testing solution: Cypress
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? Yes
? Save preset as: hogehoge_preset
? Pick the package manager to use when installing dependencies: Yarn

...(中略)

🎉  Successfully created project portfolio.
👉  Get started with the following commands:

 $ cd hogehoge
 $ yarn serve
```
unittest参考：https://vue-test-utils.vuejs.org/ja/guides/choosing-a-test-runner.html
E2E参考：https://qiita.com/os1ma/items/5429cd8e12ac43a6a803

## 実行の前に
yarnを使っていないのでインストールから始めます。

```
$ brew install yarn
$ yarn --version
1.22.4
```

## 実行

```
cd hogehoge
yarn serve
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52392/9893921a-1038-d5ec-609e-4d01dcb8ca73.png)

## Git管理

gitリポジトリは自動的に作成されている…。

```
$ git status
On branch master
nothing to commit, working tree clean
```

## 自動テスト

### unittest
```
$ yarn test:unit
yarn run v1.22.4
$ vue-cli-service test:unit
 PASS  tests/unit/example.spec.js
  HelloWorld.vue
    ✓ renders props.msg when passed (29ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        2.007s
Ran all test suites.
✨  Done in 5.50s.
```

### e2eテスト

```
$ yarn test:e2e
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52392/7d88151e-78e5-0295-b982-56d21c9d3d07.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52392/4a335d05-16a3-86e9-d27d-d3081308c9d2.png)
画面テスト自動化いいね！

## 後処理
pushするならする

```
git remote add origin [作成済みのリポジトリを使用]
git push -u origin master
```

# まとめ
普通に、簡単に、VueJsのテスト実行までできました。
[前回](https://qiita.com/knoth071211/items/2a90c07abed00cff9e72)のようにバージョンミスとかで無駄に時間を取られないように注意していきたいですね。
4M5E(修正予定)一部重複

4M5E
http://http://www.n-iinet.ne.jp/4m5e.htm

がリンク切れになっている。

#対策(action)

関連文献から、元情報の復元方法を探る。

元情報が転載可能かどうかを確認する。

#参考資料(reference)

原子力研究施設等の事故・故障等に適用した
根本原因分析手法
佐藤 猛 渡辺 憲夫 吉田 一雄
大洗研究開発センター
安全管理部
Health and Safety Department
Oarai Research and Development Center
May 2009
Japan Atomic Energy Agency 日本原子力研究開発機構
JAEA-Technology 2009-028　原子力研究施設等の事故・故障等に適用した根本原因分析手法日本原子力研究開発機構
Takeshi SATO, Norio WATANABE and Kazuo YOSHIDA
https://jopss.jaea.go.jp/pdfdata/JAEA-Technology-2009-028.pdf

KWS 振り返りのなぜなぜ分析による
問題解決力を育成する取り組み
An Approach to Develop Problem Solving Skills Using Ask-Why by KWS Retrospectives
　松　原　裕　之※ 1　　花　原　雪　州※ 2
Hiroyuki MATSUBARA Sessyu HANAHARA
https://www.jstage.jst.go.jp/article/jsee/63/5/63_5_46/_pdf/-char/ja
GoogleDriveにアップロードした画像から、外部参照可能なURLを生成しimgタグ化するコードを書いてみた

#概要

Codepenを最近よく使うようになって、画像使いたいなーでも有料会員になるほどでもないなーって思って、
コードペン上で画像を扱う方法をググってみたら、ゆんつ様の下記記事に遭遇！

▼こんぷれ / ゆんつ様
[CodePenの無料会員で画像を使うには](https://konpure.com/2019/04/07/post-10384/)
※詳細はゆんつ様の記事をご参照ください！

要約すると、GoogleDriveやDropBoxにアップロードされた画像から共有リンクを生成し、
共有リンクの一部を書き換えて画像参照できるようにするといった内容です。

この記事はゆんつ様の記事を参考に、JavaScriptを使って、
GoogleDriveにアップロードした画像リンクを1回の作業で終わるようコードを書いてみたという話です。

#作ろうと思ったきっかけ

私はGoogleDriveでアイコンや画像とかをまとめてるので、
GoogleDirveでの手順を参照して、さっそくやってみたわけですが

<strong>使ってみたい画像の共有を押して、
共有リンクコピーして、
imgタグのsrcに貼り付けて、
URL書き換えて…
…以下画像分繰り返し…

だあああああああめんどくさい！
想像以上にめんどくさい！

10分ほど気の遠くなるちまい作業を続けながら、考えました。
このめんどくさい作業を一回で終わらせたいと…
↓
<strong>考えた結果
画像はアップロードした時点で固有IDが与えられるなら、
フォルダ内のアイコン、画像の分だけ繰り返し処理でURLを加工してimgタグ化してしまえば、
この作業しなくて済むんでは？</strong>と、思いついたわけですね


#出来上がったコード

```javascript:ソース

// removeSize関数：url の末尾に指定されている画像サイズを取り除く処理
const removeSize = (url) => {
        if (url.match('=w300-k-iv165')) {
            return url.repalce('=w300-k-iv165', '');
        } 
        else if (url.match('=w300-k-iv1')) {
            return url.replace('=w300-k-iv1', '');
        }
        else if (url.match('=w300-k-iv5')) {
            return url.replace('=w300-k-iv5', '');
        }
        else if (url.match('=w300-k-iv2')) {
            return url.replace('=w300-k-iv2', '');
        }
        else if (url.match('=w300-k-iv3')) {
            return url.replace('=w300-k-iv3', '');
        }
        else if (url.match('=w200-h190-p-k-nu-iv1')) {
            return url.replace('=w200-h190-p-k-nu-iv1', '');
        }
        else if (url.match('=w200-h190-p-k-nu-iv165')) {
            return url.replace('=w200-h190-p-k-nu-iv165', '');
        }
}

// フォルダ内の画像を全て取得
let picture = document.getElementsByClassName('l-u-Ab-zb-Ua');

// 取得した画像の数だけ、加工処理を繰り返す
for (let i = 0; i < picture.length; i++ ) {

　　// 画像の名前を取得して変数labelに代入
    const label = picture[i].closest('.jGNTYb').getAttribute('aria-label'); // ※1

　　//  取得した画像のimgタグからsrcを取得し、取得したソースの一部を外部参照URLのフォーマットに置き換える処理  
　　const url = picture[i].getAttribute('src').replace('https://lh3.google.com/u/0/d/', 'https://drive.google.com/uc?export=view&id=');

　　//　removeSizeでURL末尾のサイズ指定を取り除いたURLを取得し、imgタグのsrcにぶち込んだものをconsoleに出力
    console.log(`${label}\n<img src="${removeSize(url)}" alt="">`);
}
```

<a href="https://gyazo.com/eebd174e22dfba60d6ccf25c0d38c334"><img src="https://i.gyazo.com/eebd174e22dfba60d6ccf25c0d38c334.gif" alt="Image from Gyazo" width="720"/></a>

#使い方

1.基本的には、GoogleDriveで適当なフォルダを作成します。

2.フォルダにアイコンや画像をアップロードします。

3.Chromeデベロッパーツール（F12 / Ctrl + Shift + I）を起動して、consoleタブから、上記コードをペーストし実行します。

4.出力されたimgタグをテキストファイルなどにコピペします。

あとは、使いたい時に生成したimgタグをそのままコピペして貼るだけで、使えます。
もしも画像を追加した場合は、再生成する必要がありますが、手作業でURLを加工するよりが楽かなと思います！

#注意

フォルダを作らずに、マイドライブ上で上記コードを実行すると、
変数labelのgetAttributeがnullだよ！と怒られます。

これは、フォルダ内とマイドライブ上で祖先要素のclassが異なるため、指定したclassを持つ祖先要素が見つからずに発生するエラーです。
マイドライブ上で使いたい！という方は、変数labelの`closest('.Ccie2c')`とする事で、リンクを生成する事が出来ます。
AKS クラスタで使っている Public IP を Azure CLI で取得する

# コマンド

```bash
$ export NODE_RESOURCE_GROUP=$(az aks show -g my-k8s-cluster -n my-cluster -o tsv --query nodeResourceGroup)
$ az network public-ip list -g $NODE_RESOURCE_GROUP -o tsv --query "[?!(tags.type == 'aks-slb-managed-outbound-ip')].ipAddress"
```

# 解説

1. AKS クラスタのノードプールがあるリソースグループ名を取得
2. リソースグループ名を指定して IP アドレスの一覧を取得しクエリでフィルタしたものを出力

## フィルタ条件

ロードバランサ（ALB）の SKU が Standard の場合、 ALB に対し Public IP か IP プレフィックスが必ず 1つ必要になる。
この Public IP リソースはノードプールがあるリソースグループ上にデプロイされるので、Kubernetes 上で使用している Public IP と同じ場所に存在しているが、リソースタグで `"type": "aks-slb-managed-outbound-ip"` が指定されているのでこれを省いた IP アドレスの一覧を取得している。

# 参考

[Undocumented public IP in AKS-provisioned load balancer #1281 - GitHub](https://github.com/Azure/AKS/issues/1281)
Google Colab で youtube-dl を使ってみた

Google Colab上で、youtube-dl を動かしてみましたので、メモとして残します。

## 簡単3ステップ
その名の通り youtube-dl では youtube 動画を保存できるのですが、人によっては「よく分からないものを自分のPCに直接インストールするのは怖い」という人もいると思います。

そんな人向けに、自分のPCに直接インストールせずに機能が使えて、しかもノートブックを終了すれば全て自動的に破棄される、Google Colab を使った youtube-dl の使い方をお伝えします！




## 前提
Google Colab の利用開始には Googleアカウント が必要です。
また、ダウンロードした動画は直接PCにダウンロードすると異常に時間がかかるので、マウントした Google Drive に保存することをおすすめします。

## 導入方法
それでは導入していきます。
### 1. Google Drive のマウント
```
from google.colab import drive 
drive.mount('/content/drive')
```
[google Colaboratoryでファイルを読み込む方法](https://qiita.com/uni-3/items/201aaa2708260cc790b8)
こちらなどを参照して Google Colab に Google Drive をマウントしてください。

### 2. youtube-dl のインストール
以下のコマンドで youtube-dl をインストールします。

```
!pip install youtube-dl
```
または

```
!sudo wget https://yt-dl.org/downloads/latest/youtube-dl -O /usr/local/bin/youtube-dl
!sudo chmod a+rx /usr/local/bin/youtube-dl
```

### 3. youtube-dl で動画をダウンロード
以下のコードで youtube 動画をダウンロードします。
必要に応じて動画の映像のみ、または音声のみでもダウンロード可能です。

```
!youtube-dl "URL"
```
以上！

## (おまけ) Colab 上にダウンロードしたファイルの保存
マウントした Google Drive の任意のフォルダに youtube からダウンロードした動画(音声)ファイルを保存していきます。

```
!cp -rf /content/[保存するファイル名] drive/'My Drive'/[任意のフォルダ]
```

これで Google Drive を確認すると、指定した任意のフォルダに動画(音声)ファイルが保存されているはずです！

## 参考サイト
[youtube-dl(Github)](https://github.com/ytdl-org/youtube-dl)
[一つのYoutubeチャンネルから再生回数TOP10を一括ダウンロード](https://qiita.com/marrin/items/9c61605432370c5176e1)
[youtube-dlを使ってYouTubeから最高画質で最高音質の動画をダウンロードする](https://qiita.com/shiooooooooon/items/dd86601ebdfe09591686)
laravel-dompdf の使い方

1) プロジェクトの作成

```bash
laravel new pdf01
```

2) ライブラリーのインストール

```bash
cd pdf01
composer require barryvdh/laravel-dompdf
```

```bash
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
```

3) コントローラーの作成

```bash
php artisan make:controller HomeController
```

```php:app/Http/Controllers/HomeController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HomeController extends Controller
{
    //
public function index() {
        $pdf = \PDF::loadView('generate_pdf');
        return $pdf->download('test01.pdf');
        }
}
```

4) View の作成

```php:resources/views/generate_pdf.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My First Page</title>
</head>
<body>
<h1>Hello World!!</h1>
<blockquote>
        Good Afternoon<p />
</blockquote>
Mar/17/2020 PM 15:48<p />
</body>
</html>
```

5) routes の作成

```php:routes/web.php
<?php

use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::get('pdf', 'HomeController@index')->name('generate_pdf.index');
```

6) サーバーの起動

```bash
php artisan serve --host 0.0.0.0
```

7) クライアントからアクセス

http://hostname:8000/pdf/

![dompdf_mar17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/838967e0-bea7-03cd-0f3c-469c63069833.png)

test01.pdf という PDF がダウンロードされます。
![dompdf_mar1702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/b63b99b2-30bf-fd1a-2914-4eb20302d28f.png)
初心者向けatcoder-cliを使った環境構築(Mac編)

## はじめに
久しぶりに競技プログラミング欲が出たのでAtCoderやろーと思ったところ、便利なCLIツールが出ていたのでセットアップをしました。加えて暗黙知なところを少し書き残して置こうと思います。

## 使用ツール
[online-judge-tools](https://github.com/kmyk/online-judge-tools)
[atcoder-cli](https://github.com/Tatamo/atcoder-cli)

## ツールのインストール

[こちらの製作者様ページ](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-installation-guide/)に丁寧に解説されています。

[@Adaachillさんの記事](https://qiita.com/Adaachill/items/3d4ddad56c5c2cc372cd)も非常に参考になります。

## やりたいこと
- デフォルトで指定したコンテストの問題すべてをダウンロードしておきたい（面倒なので）
- コンテスト用ディレクトリを作成したらテンプレートを用いたファイルの生成をしておいて欲しい
- なんらかのショートカットキーで実行ファイルを作って欲しい
- `oj t`でテストして欲しい

以上の欲求を解決していこうと思います。

### デフォルトで指定したコンテストの問題全てをダウンロードしておきたい。

[デフォルト動作の設定](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/)を見つつ設定していきます。
atcoder-cliのconfigで設定するだけでOKです。

1. `$ acc config default-task-choice all`
2. 終わり

### コンテスト用のディレクトリを作成したらテンプレートを用いたファイルの生成をしておいて欲しい

[テンプレートの設定](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/)を見つつ設定していきます。リンク元と内容一緒です。

1.``$ cd `acc config-dir` ``
2. cppという名前のディレクトリを作成します。
`$ mkdir cpp`
3. 雛形である`main.cpp`と`template.json`ファイルを作ります

```javascript:template.json
{
    "task":{
        "program":["main.cpp"],
        "submit":"main.cpp"
    }
}
```

```cpp:main.cpp
#include<bits/stdc++.h>
using namespace std;
int main() {

}
```

4. `$ acc templates`を使用して正常に読み込まれているか確認する。
5. デフォルトでテンプレートを使用するように変更する
`$ acc config default-template cpp`
6. 終わり

### ショートカットキーで実行ファイルを作って欲しい

`oj t`でテストしてもらう為には実行ファイルを作る必要があります。codeRunnerとか使ってもいいですが、ビルドタスクでショートカットキーを使い、実行ファイルを作っていきます。

[Visual Studio Codeを使ってC++でHello World](http://tatamo.81.la/blog/2018/12/07/atcoder-cli-tutorial/)

1. 上のリンクに書いてある通り手順をこなす。
>- ⌘+shift+Pでコマンドパレットを開く
>- Tasks: Configure Tasksを入力してEnter
>- テンプレートからtask.jsonを生成を選択
>- 最後にOthers を選択

2. 出現した`task.json`ファイルを編集
なお、ここではc++14を使う前提にしています。
設定値の詳細は上記のリンク先で確認してください。

```javascript:task.json
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "build main.cpp",
            "type": "shell",
            "command": "g++",
            "args": [
                "-O2", "-std=c++14", "-o", "${fileDirname}/a.out", "${file}",
            ],
            "group": {
                "kind": "build",
                "isDefault": true,
            }
        }
    ]
}
```
3. ショートカットキーを設定する
**VScodeの[Code] -> [基本設定] -> [キーボードショートカット] -> [run build task]で検索 -> お好きなキー割り当てに変更**
4. 実行ファイルを作りたいファイルと同じディレクトリでビルドタスクを実行する。
5. 終わり


### `oj t`でテストして欲しい

上の実行ファイルをビルドタスクで作るようにしたのであれば、configをいじるだけで終わりです。
1. ビルドタスクを作る
2. `$ acc config default-test-dirname-format test`をする
ojのテストディレクトリはtestで作成するため、そちらに合わせる。oj側を変えてもOK
3. `oj t`でテストする
4. 終わり

## まとめ

あとは通常の使用法通りに
1. `$ acc new <contest>`
2. `$ cd <contest>`
3. `main.cpp`にコードを書く
4. ビルドタスク実行
5. `oj t`でテスト
6. `acc s`で提出

といった流れで簡単にできます。シェルスクリプトも書く必要が無くなって、かなり便利ですね。
環境がノンストレスになったので精進に励みたいと思います。
第5回 機械学習のための特徴量エンジニアリング - 特徴選択

## はじめに

本記事では交互作用特徴量について解説しています。本記事は主に「[機械学習のための特徴量エンジニアリング](https://www.amazon.co.jp/dp/4873118689/ref=cm_sw_em_r_mt_dp_U_lRGxEbH5KBJJX)」を参考とさせて頂いておりますので、気になる方は是非チェックしてみてください。

## 特徴選択とは
モデルの予測に有効ではない特徴量を削除する手法です。有効でない特徴量はモデルの学習時間を増大させ、精度も下げてしまいます。

## フィルタ法
フィルタ法はモデルに関係なく、データセットのみを見て特徴量を削減する方法です。それぞれの特徴量がどれだけ予測に使えるかを指標をもとにして数値化し、実際に使う特徴量を選びます。この指標には**ピアソンの相関係数**, **カイ二乗検定**, **ANOVA**などがあります。
具体的には、特徴量同士の相関が高すぎる特徴量を削除したり、目的変数との相関が低すぎる特徴量を削除したりします。しかしモデルを全く考慮しない手法なので、モデルによって有効になる可能性のあった特徴量を削除してしまうかもしれません。

## ラッパー法
ラッパー法はデータセットから一部の特徴量を取り出し、モデルに学習させます。この工程を複数回行い、有効である特徴量を決めるという手法です。実際にモデルに組み込みながら特徴量選択を行うので、フィルタ法のようにモデルに有効になる可能性のあった特徴量を事前に削除してしまうことはありません。ですが計算量が膨大になってしまいます。

## 組み込み法
組み込み法はモデルの学習時に特徴量選択が組み込まれていることを指します。決定木では特徴量の重要度を計算しながらモデルの学習を行うため、学習が終わったあとに特徴量の重要度が高いものを選択する手法となっています。組み込み法はラッパー方より品質は劣りますが、計算コストを抑えることができ、フィルタ法のよりモデルに有効な特徴量を選択できるので、バランスの取れた手法となっています。

## 最後に
YouTubeでITに関する動画を上げていこうと思っています。
YoutubeとQiita更新のモチベーションに繋がるため、いいね、チャンネル登録、高評価をよろしくお願い致します。
YouTube: https://www.youtube.com/channel/UCywlrxt0nEdJGYtDBPW-peg
Twitter: https://twitter.com/tatelabo


## 参考
https://qiita.com/shimopino/items/5fee7504c7acf044a521
rosserialでArduinoと通信

##rosserialでArduinoと通信
    $ sudo apt-get install ros-kinetic-rosserial-arduino
    $ sudo apt-get install ros-kinetic-rosserial

Arduino IDEに、rosserialのライブラリをインストールする。

    $ cd ~Arduino/libraies
    $ rosrun rosserial_arduino make_libraries.py .
    $ ls 
    readme.txt  ros_lib
    $ cd ros_lib
    $ ls 
    ackermann_msgs           laser_assembler    smach_msgs
    actionlib                map_msgs           std_msgs
    actionlib_msgs           nav_msgs           std_srvs
    actionlib_tutorials      nodelet            stereo_msgs
    ArduinoHardware.h        pcl_msgs           tests
    ArduinoTcpHardware.h     polled_camera      tf
    bond                     ros                tf2_msgs
    controller_manager_msgs  roscpp             theora_image_transport
    control_msgs             roscpp_tutorials   time.cpp
    control_toolbox          rosgraph_msgs      topic_tools
    diagnostic_msgs          ros.h              trajectory_msgs
    duration.cpp             rospy_tutorials    turtle_actionlib
    dynamic_reconfigure      rosserial_arduino  turtlesim
    examples                 rosserial_msgs     velodyne_msgs
    gazebo_msgs              sensor_msgs        visualization_msgs
    geometry_msgs            shape_msgs         wiimote
Docker + Go の Hello Worldビルド

Dockerの中で go をビルドして、Hello World することがゴールです。
手順をシンプルに書いていきます。

まず Docker と Docker-compose を入れておきます。これは省略します。


# Dockerディレクトリを作成

以下のようにファイルを作ります。

```
./docker
./docker/.env
./docker/docker-compose.yml
./docker/go
./docker/go/Dockerfile

./src/
./src/go
```

# Dockerの設定

## Docker全体用の設定

今回はコンテナは1つしか作りませんが、
今後の拡張を考えたつくりにはしておきます。
常にクセづけておくことで、迷うことがなくなります。

```shell:.env
COMPOSE_PROJECT_NAME=go-docker-starter
```

## goビルド用コンテナ

```docker:docker-compose.yml
version: '3'
services:

  go:
    build: ./go
    container_name: '${COMPOSE_PROJECT_NAME}-go'
    tty: true
    volumes:
      - "../src/go:/opt/src"
```

```Dockerfile:Dockerfile
FROM golang:1.14.0
```


# Dockerコンテナ作成

```shell
cd ./docker
docker-compose build
docker-compose up -d
```
これで Dockerコンテナが起動します。
docker-compose build せずとも、 up -d だけでもビルド一緒にしてくれているのですが、
それは気を利かせてくれているだけなので、動きを理解するためにも build してみましょう。


# go の初期ソースコード作成

```go:./src/sample.go
package main

import "fmt"

func main() {
	fmt.Printf("Hello World\n")
}
```


# sample のビルド


## デバッグ用ビルド & 実行

変更する度に行うビルドです。

```shell
docker exec go-docker-starter-go bash -c "cd /opt/src/ && GOOS=linux GOARCH=amd64 go run sample.go"
```

## ビルド

```shell
docker exec go-docker-starter-go bash -c "cd /opt/src/ && GOOS=linux GOARCH=amd64 go run sample.go"
```
sample.go と同じディレクトリに出力されます。
`-o`オプションで出力先を指定することもできます。

# github

https://github.com/dd0125/go-docker-starter
画像アップロードとリサイズ

##Carrierwaveとminimagick
画像アップロードするにはCarrierwaveを使います。
画像ファイルをリサイズするにはminimagickを使います。
ターミナル

```
$ brew install imagemagick
```
Gemfileの一番下に

```
     〜省略〜
gem 'carrierwave'
gem 'mini_magick'
```
ターミナル

```
$ bundle install
```
ターミナル

```
$ rails g uploader image
```
【例】モデル名をMessageとします

```app/models/message.rb
class Message < ApplicationRecord

       〜省略〜

  mount_uploader :image, ImageUploader
end
```
```app/uploaders/image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick
  # storage :fog
# 〜省略〜
  process resize_to_fit: [800, 800]
# 〜省略〜
end
```
まずは必要なgemを導入します。「carrierwave」と「minimagick」をGemfileに追記し、ターミナルからbundle installを実行覚ます。
次に、画像のアップローダーを作成します。ターミナルで、rails g uploader imageコマンドを実行すると、app/uploadersディレクトリ以下にimage_uploader.rbが作成されます。
次に、Messageモデルを編集しimage_uploaderをマウントする記述を行います。
最後に、image_uploader.rbを編集して、MiniMagick経由で画像のリサイズを行えるようにします。
「include CarrierWave::MiniMagick」のコメントアウトを外します。
その後、任意の箇所に「process resize_to_fit: [800, 800]」と追記します。
resize_to_fitは縦横比を維持したまま、縦横を800px以内にリサイズするという意味です。
#React でマテリアルUIをインストールして「ローディング中のぐるぐる」を使う

# package.json

dependencies に @material-ui/core を追加する

```diff
{
  "name": "example",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "react": "^16.13.0",
    "react-dom": "^16.13.0",
+    "@material-ui/core": "latest",
    "react-scripts": "3.4.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

```

# App.js

ぐるぐるを三個置いてみる

```js
import React from 'react';

import CircularProgress from '@material-ui/core/CircularProgress'

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

export default App;
```

# 画面例

yarn install
yarn start

して動作確認する

![image](https://user-images.githubusercontent.com/13635059/76725170-b81bc280-6790-11ea-9868-a8fa3ed57b38.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3039








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Power AutomateのYammerコネクタの仕様覚書

# この記事について
Power AutomateのYammerコネクタでハマった仕様についての覚え書き。

# Post Messageに関する仕様
## タイトル
ブロードキャストが空欄あるいはいいえの場合、タイトルを入力してフローを実行するとエラーとなりYammerに投稿できない。

![Yammer02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/0f3445ea-05e3-05dd-1a27-9356877962d6.png)

実行履歴にも"Title is only allowed for messages with type announcement"と残る、とてもわかりやすい仕様。

![Error_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/0719789e-3a52-a626-64e2-d423ed4590ad.png)

## HTMLをメッセージテキストとして投稿する
### ブロードキャストがはいの場合
HTMLが**反映される。**

![HTML_OK.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/5afdbc3e-9ce2-d398-5d49-2b9ec54434e9.png)

### ブロードキャストが空欄あるいはいいえの場合
HTMLが**反映されない。**

![HTML_NG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/5b692a97-aa15-37ee-1bb9-124380c06ca9.png)

### 解決方法
ブロードキャストとして投稿したくないがHTMLは反映させたい。そんな場合は、Content Conversionコネクタのアクション"HTML to text"を投稿の前に追加する。
![CC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/338126/cb19286d-3234-21a9-1535-c8184ee9d84f.png)
#React で Component を複数個配置した時のエラー と return を囲む空タグの意味 /  Parsing error: Adjacent JSX elements must be wrapped in an enclosing tag. 

# コード

```js
import React from 'react';

import CircularProgress from '@material-ui/core/CircularProgress'

function App() {
  return (
    <CircularProgress />
    <CircularProgress />
    <CircularProgress />
  );
}

export default App;
```

エラー

![image](https://user-images.githubusercontent.com/13635059/76724553-aafdd400-678e-11ea-8b4a-b823184c770a.png)


# 解決

タグで囲めば良いらしい。

```js
import React from 'react';

import CircularProgress from '@material-ui/core/CircularProgress'

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

export default App;

```

# Fragment

より正しそうな書き方

```js
import React from 'react';

import CircularProgress from '@material-ui/core/CircularProgress'

function App() {
  return (
    <React.Fragment>
      <CircularProgress />
      <CircularProgress />
      <CircularProgress />
  </React.Fragment>
  );
}

export default App;
```

# 空のタグ

エラー回避のハックだろうか？ 空のタグでも良いみたいだ。

```js
import React from 'react';

import CircularProgress from '@material-ui/core/CircularProgress'

function App() {
  return (
    <>
      <CircularProgress />
      <CircularProgress />
      <CircularProgress />
    </>
  );
}

export default App;

```

と思ったら Fragment の短縮記法らしい。

https://reactjs.org/docs/fragments.html#short-syntax

![image](https://user-images.githubusercontent.com/13635059/76804771-776b8a00-6820-11ea-9528-0e43e19ccd51.png)


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3038








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
macOC CatalinaにアップデートしたらGitが動かなくなった

# macOC CatalinaにアップデートしたらGitが動かなくなった
```
$ git
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

# 以下のコマンドでインストール
```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

![スクリーンショット 2020-03-17 8.49.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593240/acbcb128-7c4f-e7ee-557a-a7e5ce246092.png)


![スクリーンショット 2020-03-17 8.50.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593240/c47028c3-d50e-e06d-f032-26962ed02d67.png)

![スクリーンショット 2020-03-17 9.43.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593240/b3f5e91e-39cd-9f92-bfe1-1bd1dce58ae1.png)
一時フォルダ内だからといってファイルを閉じ忘れてはいけない

# 結論

一時フォルダを消してもそのファイルが完全に消えずハードディスクを圧迫して困ります、ちゃんと閉じましょう

# 紹介： 一時フォルダ

Rubyでは簡単に一時フォルダが作れてブロックが終わるとフォルダが消えてくれるので作業フォルダとして扱いやすいです

```ruby
Dir.mktmpdir('test') do |dir|
  # ファイル作ったり開いたり
end
```

# 失敗： ファイルを開く（閉じない）

どうせ一時フォルダで消えるのだからと Open して使うだけで閉じるのを忘れていると....

```ruby
Dir.mktmpdir('test') do |dir|
  # ファイル生成処理
  f = File.open(path)
  # 作業
end
```

# 問題: ファイルが消えない

tmp フォルダは空っぽなのにハードディスクがどんどん圧迫されていく...
そう Linux だとプロセスが残る限り完全に消えていないのです
Rails server や Delayed Job Woker の再起動などを行い問題の処理のあるプロセスごと一旦落とさない限り残り続けてしまいます

```console
$ lsof | grep delete
bundle 23931 (略) /tmp/test20200317-23931-cayd6g/test.pdf (deleted)
```
※）上記例では プロセス 23931 が掴んでいるため仮削除状態

# 対処： 閉じましょう

ファイルが開放されるので一時フォルダの削除とともに完全に削除されます
これを行っていればプロセスごと落とす必要はありません

```ruby
Dir.mktmpdir('test') do |dir|
  # ファイル生成処理
  File.open(path) do
    # 作業
  end
end
```

# 参考

* [rmでファイルを削除してもディスク使用量が減らなかった](https://qiita.com/asigochan/items/3e6f3539b849ef23f2d1)
PHPのforeach文で最初と最後を判別したい処理したくて、resetとendを使ってみたが・・・

PHPのforeach文で最初と最後を判別したかったので、備忘録の為に記載。


```php

$array = ['sibuya', 'ebisu', 'meguro', 'gotanda', 'osaki'];
foreach ($array as $key => $value) {
    if ($value === reset($array)) {
        print "${value}は最初だよ\n";
    }
    if ($value === end($array)) {
        print "${value}最後だよ\n";
    }
}
```
結果

```
sibuyaは最初だよ
osaki最後だよ
```

配列要素の最初 `sibuya` を2つ用意したらどうなる？

```php

$array = ['sibuya', 'ebisu', 'sibuya', 'gotanda', 'osaki'];
foreach ($array as $key => $value) {
    if ($value === reset($array)) {
        print "${value}は最初だよ\n";
    }
    if ($value === end($array)) {
        print "${value}最後だよ\n";
    }
}
```
結果

```
sibuyaは最初だよ
sibuyaは最初だよ
osaki最後だよ
```

おいおい！笑
配列要素内に重複する値が入ってると予期せぬ動きが・・・
待てよ・・・最後の要素も・・・

配列要素の最後 `osaki` を2つ用意したらどうなる？


```php

$array = ['sibuya', 'ebisu', 'osaki', 'gotanda', 'osaki'];
foreach ($array as $key => $value) {
    if ($value === reset($array)) {
        print "${value}は最初だよ\n";
    }
    if ($value === end($array)) {
        print "${value}最後だよ\n";
    }
}
```

結果

```
sibuyaは最初だよ
osaki最後だよ
osaki最後だよ
```

ジーザス・・・


ループ内で `reset` や `end` を使うのはご法度らしいですね。
https://qiita.com/ay123/items/90d0e107813e00f2b11f
Vimで書いたスクリプトをファイル保存せずに実行する

Vim初心者向け.

Vimで書いたスクリプトを, ファイルに保存せずに実行したい場面がたまにあるのではと思います. ちょっとしたコードを試しに動かしてみたいときなど.

それを実現するためのプラグインもありますが, たいていのインタプリタなら――たとえばbashなら, `:w !bash` で行えます.

Pythonのスクリプトなら, `:w !python` や `:w !pipenv run python`.
nodejsでもOK. `:w !node`.

実行するスクリプトによっては, カレントディレクトリを意識しないといけないケースもあります.
カレントディレクトリの確認は `:pwd`, 変更は `:lcd path/to` or `:cd path/to` (lcdとcdは, 影響範囲が現在のバッファだけか全てかの違いがある).
fishの補完をhjklで選びたい

## fishの補完選択
fish_greetingを古のAAにしているインターネット老人会の図: ![fish_greetingを古のAAにしているインターネット老人会の図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7912/06099f8f-fd0c-5361-b63d-2621dcf06d63.png)

zshからfishに乗り換えました
文法の違いとかで困るんじゃないかとか、今まで敬遠していたんですが、先週末思い切って乗り換えました

で、概ね設定は済んだのですが、最後までどうしてもうまくいかなかったのが、この補完の選択
↑の図だと`hoge/fuga`とか`hoge/hogehoge`とか`hoge/piyo`を候補で表示してくれてますが、これを選ぶのがツラい
なにがツラいってデフォルトだとキーバインドが全然わからない

## viモードにする
`fish_vi_key_bindings`を実行すると、キーバインドがviライクなモードに入ります
`i`でインサートモードに入ったり、`Ctrl-[`でコマンドモードに入ったり
しかしこれでもまだ問題は解決されません
補完候補は、ある程度文字を入力したあと`Tab`を押して表示させるわけですが、
「ある程度文字を入力」
してるので当然インサートモードになります
コマンドモードであれば、`hjkl`で補完候補を選択できるのですが、インサートモードではもちろんできません

できればzshの

```zsh
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'j' vi-down-line-or-history
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'l' vi-forward-char
```
のように、「インサートモードでも補完候補選択に入ったら`hjkl`で選べる」みたいなのがやりたいわけです

## bind
というわけでキーバインドの設定を変更します
fishは`bind`を実行することでキーバインドを変更できます
今回の目的だと、このように設定するのが正解でした

```fish
  bind -M insert k "if commandline -P; commandline -f up-line; else; commandline -i k; end"
  bind -M insert j "if commandline -P; commandline -f down-line; else; commandline -i j; end"
  bind -M insert h "if commandline -P; commandline -f backward-char; else; commandline -i h; end"
  bind -M insert l "if commandline -P; commandline -f forward-char; else; commandline -i l; end"
```
### なにをしているのか解説
`bind -M insert k` まずこれで「インサートモード中の`k`のキーのbind設定」を宣言
`if commandline -P` 「いまページャコンテンツを表示しているか(補完候補などを表示している状態かの判定)」
`commandline -f up-line` ↑の判定がtrueだったら`up-line`コマンドを実行
`else; commandline -i k` ↑の判定がfalseだったら通常の`k`を入力

というbind設定になってます
こうすることで、補完候補表示時は`hjkl`がカーソル移動になり、それ以外の場面では通常通りの文字入力にすることができます

## 感想
補完候補でカーソルを左に動かす、上に動かす、みたいなコマンドがどれなのか全然わからなくて超しんどかったです
でもよく考えたらデフォルトのキーバインドとかよく見ろよって話で、[この辺](https://github.com/fish-shell/fish-shell/blob/master/share/functions/fish_vi_key_bindings.fish)見てたらすぐわかりました :sweat: 
あと、「普通に`k`を入力する」とか結構ハマりました
最初は`commandline -f self-insert`とかしてたんですが、違うんですよね
`commandline -i k`でいいのか〜って気づくまで結構かかりました←

これでたのしいfishライフが送れそうです :smile:
エラーメッセージ

##errorsメソッド
【例】app/views/groups/の中に_form.html.hamlファイルを作成したとします

```app/views/groups/_form.html.haml
= form_for group do |f|
  - if group.errors.any?
    .chat-group-form__errors
      %h2= "#{group.errors.full_messages.count}件のエラーが発生しました。"
      %ul
        - group.errors.full_messages.each do |message|
          %li= message
                      〜省略〜
```
group.saveのように変数groupの保存をしようとした時に、失敗するとgroupにエラーメッセージが格納されます。
その変数に対してerrorメソッドを使用するとエラーメッセージの取得ができます。
any?メソッドによって、エラーメッセージの有無を判定しています。
full_messagesメソッドによってエラーメッセージ全件の内容を取得しています。
gitのコミットログで文字化けを起こさない方法

EUCの開発環境等でよく頻発するのでメモ

```
$ git commit ← -mをつけないのがポイント
```
その後vimが立ち上がるので

```
:set fileencoding=utf-8
```
と入れて、日本語コメントを入れると文字化けしなくなります。
【Python】PyInstallerでExe化すると、No module named 'pyproj.datadir' が出るときの対処

# 背景
Pythonファイルをコマンドプロンプト等から起動すると問題なく動いていた。
しかし、[PyInstaller](https://pypi.org/project/PyInstaller/)でExe化したファイルを実行すると、[pyproj](https://pypi.org/project/pyproj/)をインポートするところで、以下のエラーが送出され、プログラムが落ちてしまった。
> ModuleNotFoundError: No module named 'pyproj.datadir'

# 環境
+ Windows 10
+ Python 3.7.4
+ PyInstaller 3.6
+ pyproj 2.4.0

# 対処法
specファイル内の、Analysis()のdatasにpyprojのパスを追加するとうまくいった。

```:.spec
a = Analysis(['hoge.py'],
             pathex=['C:\\workspace\\hoge\\src'],
             binaries=[],
             datas=[
                    ('C:\\Users\\grin\\Anaconda3\\envs\\py_37\\Lib\\site-packages\\pyproj\\*', '.\\pyproj\\'),
                    ],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

```

# 追記(2020/08/04)
>FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\grin\\AppData\\Local\\Temp\\_MEI103442\\skyfield\\data\\nutation.npz'

のようなFileNotFoundErrorが出た場合も、該当するファイルパスをdatasに追加すれば大丈夫です。

```
datas = [('C:\\Users\\grin\\Anaconda3\\envs\\py_37\\Lib\\site-packages\\skyfield\\data\\*', '.\\skyfield\\data\\'),],
```

# 参考URL
+ https://github.com/pyproj4/pyproj/issues/273
+ https://stackoverflow.com/questions/55824830/i-get-error-no-module-named-pyproj-datadir-after-i-made-py-to-exe-with-py
+ https://pythonhosted.org/PyInstaller/spec-files.html
+ https://stackoverflow.com/questions/57482672/filenotfounderror-errno-2-when-running-pyinstaller-executable
git マスターとのマージ そしてpush

作業中ブランチにて

```
git stash (必要に応じて)
git checkout master
git pull
git checkout [ブランチ名]
git merge master
```

コンフリクトあって解消したあとに

```
git add [コンフリクトしたファイル]
git stash pop (最初のgit stashをした場合)
git commit
git push origin [ブランチ名]
```

masterをチェックアウトして

```
git checkout master
git merge --squash [ブランチ名]
```

ブランチでの変更を取り込んだ後に

```
git commit
```

ログに残したいメッセージ以外を削除してコミット

```
git push origin master
```

ブランチを削除

```
git push --delete origin [ブランチ名]
```