OmniAICreator/Qiita-1.07M huggingface dataset:
dem-bones でメッシュシーケンス(deformer, 連番メッシュ, blendshapes, etc)から skinning(bone) をメッシュを生成する

## 背景

deformer, 連番メッシュ(e.g. Alembic cache), blendhapes から, skinning を生成したい(主にリアルタイム描画向けや, スキャンしたモデルに骨格を入れたいとき)

同等のものとして, Maya とかで deformer を skin にベイクするなどの機能ありますが, ソフトに依存せず単体で処理したいときもあります.

## dem-bones

https://www.ea.com/news/open-source-dem-bones
https://github.com/electronicarts/dem-bones

オフィシャルでは Windows, macOS の prebuilt がありますが, Linux で動かしたいように fork を作りました.

https://github.com/syoyo/dem-bones

怪しいバグも直してあります(コードわかりずらくてつらかった...). また, Alembic, FBX を optional にしてビルドしやすいようにしています.

## 使う

使う分には, そんなに苦労しないはずです. サンプルがあるのでそちらが参考になります.

700 頂点 + TR 1950X でもそこそこ計算に時間かかります(OpenMP 有効 CPU).
頂点数が万単位だと処理時間結構かかってしまうかもしれません.

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">たいせつな dem-bones で mesh sequence からの skinning への変換検証業務 &gt; An automated algorithm to extract the linear blend skinning (LBS) from a set of example poses <a href="https://t.co/YO2qjv4Mzu">https://t.co/YO2qjv4Mzu</a> <a href="https://t.co/ILwVUhzw3X">pic.twitter.com/ILwVUhzw3X</a></p>&mdash; Syoyo Fujita 🌸 RayWa(Ray and Peace) (@syoyo) <a href="https://twitter.com/syoyo/status/1234732653577785344?ref_src=twsrc%5Etfw">March 3, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

階層構造は作ってくれないようです.

また, 既存の skinned model を最適化(少ない bone 数にするなど?)することもできます.

## helper bone 生成とか

すでに先人がいました. Maya plugin ですが, dem-bones と RBF(radial basis function) https://lesterbanks.com/2015/04/skinning-converter-for-maya/ の自前実装を使っています. ありがとうございます.

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Lots of videos on corrective joints lately so wanted to try with a twist. Using a modified version of DemBones, my RBF solver, and a base skeleton w/ corrective deformations on top, auto generate corrective joints to replicate the deformation <a href="https://twitter.com/hashtag/Maya3d?src=hash&amp;ref_src=twsrc%5Etfw">#Maya3d</a><a href="https://t.co/tVL9UrzfPm">https://t.co/tVL9UrzfPm</a></p>&mdash; Chad Vernon (@chadvernon) <a href="https://twitter.com/chadvernon/status/1225644937745551360?ref_src=twsrc%5Etfw">February 7, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


## TODO

* [ ] .obj 連番メッシュに対応する
* [ ] glTF などで skin 情報をエクスポートする
* [ ] deom-bones を参考に, Example-based Helper Bone Rigging https://mukai-lab.org/projects/helper-bone-rigging/  を実装する
SAS言語備忘録_SAS日付で過去から未来へループ

#ファイル名に日付が入ってるデータセットを扱う
SAS言語のマクロ変数に開始日と終了日をYYYYMMDD形式で持たせてSAS日付に変換してひたすらループさせるだけ。

```Sample.sas
%let START=20190715;
%let END=20190810;

%let S_DATE=%sysfunc(inputn(&START.,yymmdd8.));
%let E_DATE=%sysfunc(inputn(&END.,yymmdd8.));

%let ROOP=%eval(&E_DATE.-&S_DATE.);

%put &S_DATE.;
%put &E_DATE.;
%put &ROOP.;

%macro get_roop(ROOP);
	%do i=0 %to %eval(&ROOP.);
		%let T_DATE=%sysfunc(putn(%eval(&S_DATE.+&i.),yymmddn8.));
		%put &T_DATE.;
	%end;
%mend;

%get_roop(&ROOP.);
```
C#でSQLiteを使うのに必要なパッケージ

C#でSQLiteを使うのに必要なパッケージです。
探したら情報ありそうだけど、探すのも面倒なのでメモを残しておきます。

VS:2017

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41649/ad71dc11-b9e2-9f11-82c5-8723ede6a3a9.png)
タッチタイピングの正確性があがらない同士のためのメモ

プログラミングにおいて、タッチタイピングは必要不可欠なものだと思います。
しかし、僕のような初心者にはなかなか難しいものです。
ちなみに僕は[このサイト](https://www.e-typing.ne.jp/roma/check/)でBランクぐらいの速さです。
練習してもなかなか速くならず、どうしたら速くなるのか考えながら練習していました。

僕の今の課題は速さよりも正確性を上げることです。
正解率が90%程度で、いつも100%になりません…
自分の苦手な指はいつも同じようなミスをしていて、意識して直そうとするとまた別の箇所でミスをするという感じでした。

#正確性を上げるには
正確性を上げるにはどうしたらいいのか考えたら、いい練習法を思いついて、自分の中では劇的に効果があったので自分と同じような悩みを抱えた同士の少しでも力になれたら嬉しいなと思い、この記事を書いています。

# 練習法
僕が思いついた練習法は、**2keyづつタイプ**したあとあえてそこで**少しだけ間を開ける**やり方です。
例えば、『正確性を上げたい』とタイプしたいときは、
``se () i () ka () ku () se () i () wo () a () ge () ta () i``
と()のところで**0.5秒ぐらい静止**します。
そしてその静止しているときに次タイプするキーを想像します。
次にタイプするキーを想像しながら静止することと、静止する時間を**いつも一定にする**ことがポイントです。
慣れてきたら、3keyづつ、4keyづつなど増やしていってもいいかもしれません。


# タイピングが早い人とは
タイピングが速い人はどんな人なのでしょうか？
僕は、**あるキーとその次のキーを押すまでの間の時間が短い人**が速い人だと思います。もちろん正確であることが前提です。

よく爆速でキーボードのタイプ音を鳴らしながらタイプをしてたかと思うと、ピタッと静止してしまう人がいます。果たして彼はタイピングが速いのでしょうか？
たとえ瞬間的に加速したとしても苦手なキーのところで止まってしまっては、結局全体としては速くないのではないかと疑問です。


# 目指すところ
雰囲気や形だけまねても意味がないと思うので、僕は**すべてのキーが安定して速くタイプできる人**になりたいです。
そのためには、自分の苦手なキーを理解することが必要だと思います。自分はこんな時にミスをしやすいとか、ここで悩んでしまうとかできるだけ具体的にするのがいいかと思います。

だからこの練習法により、自分がどこで止まってしまうのかが理解しやすくなると思います。

さらに2キーづつタイプすることで一つ目のキーと二つ目のキーとの間の時間が短くする練習にもなり、あるキーとその次のキーを押すまでの時間を短くすることに繋がります。

# 思いついた経緯
Fortniteというゲームがあるのですが、そのなかで**raider464**という名前のプレイヤーがいます。
彼はそのゲームの中で必須のスキルである**編集**というスキルが世界一速くできるといわれています。
時間があったら、彼の動きを見てみてほしいと思います。[こちら](https://www.youtube.com/watch?v=qWuQHYbk9RU)
同じ人間とは思えません…
そのなかで練習法を紹介していたのですが、それを参考にしました。
[別の動画](https://www.youtube.com/watch?v=2RVBe_qsRRY)のコメントでこのように指摘している方もいました。
>raiderは、編集確定してから、次の編集を開始するまでの時間を限りなく、0に近づける事が大事だと言っているね。

>編集開始してから、確定までを速くするのはみんな意識してるけど、むしろこちらの方が大事、
>人間て速い作業をする時、いくつかのまとまった小節に分けて、それを体に覚えさせる訳だけど、
>1個終わって、一息して、さて次は、、
>って、数フレーム無意識でしている。

>この小節間をなくせるかが、重要

>滅茶苦茶早業する人や、意識配分化物に見える人は、皆この時間が少ない

これをタッチタイピングに応用できないかと思い、この練習法を思いつきました。

# まとめ
ここまで偉そうに語ってしまいましたが、しょせんは僕の思い付きです。果たして本当に効果があるのかはわかりません。先人のもっといい方法があるのかもしれません。
もしもっといい練習法があるよという方は教えてくだされば嬉しいです。
Azure Cosmos DB Java SDK で ドキュメントがすでにあれば更新、存在しなければ新規作成




```java

package com.microsoft.azure.documentdb.sample;

import java.util.Date;
import java.util.Iterator;

import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.microsoft.azure.documentdb.ConnectionMode;
import com.microsoft.azure.documentdb.ConnectionPolicy;
import com.microsoft.azure.documentdb.ConsistencyLevel;
import com.microsoft.azure.documentdb.Document;
import com.microsoft.azure.documentdb.DocumentClient;
import com.microsoft.azure.documentdb.FeedOptions;
import com.microsoft.azure.documentdb.FeedResponse;
import com.microsoft.azure.documentdb.ResourceResponse;

public class HelloCosmodDB002UpdateDocument {

	public static void main(String[] args) throws Exception {

		// Azure Cosmos DB Libraries for Java
		// https://docs.microsoft.com/ja-jp/java/api/overview/azure/cosmosdb?view=azure-java-stable

		String host = "{yourhost}";
		String database_id = "{your_database}";
		String collection_id = "{your_collection}";

		// Get key from Azure Web Console
		// read write key
		String key = "{your_key}";

		String endPoint = "https://" + host + ".documents.azure.com:443";

		ConnectionPolicy policy = new ConnectionPolicy();
		policy.setConnectionMode(ConnectionMode.DirectHttps);

		try (DocumentClient client = new DocumentClient(endPoint, key, ConnectionPolicy.GetDefault(),
				ConsistencyLevel.Session)) {

			// Name? ID?
			String collectionLink = String.format("/dbs/%s/colls/%s", database_id, collection_id);

			JsonObject json;

			FeedOptions options = new FeedOptions();
			options.setEnableCrossPartitionQuery(true);

			FeedResponse<Document> res = client.queryDocuments(collectionLink, "SELECT * FROM c WHERE c.id=\"1000\"",
					options, "{your_pkey}");

			Iterator<Document> itr = res.getQueryIterator();

			if (itr.hasNext()) {
				Document doc = itr.next();
				Gson gson = new Gson();
				json = gson.fromJson(doc.toJson(), JsonObject.class);
			} else {
				json = new JsonObject();
				json.addProperty("id", "1000");
			}

			json.addProperty("text2", "This is test for update.");
			json.addProperty("lastupdate", System.currentTimeMillis());

			Document d = new Document(json.toString());

			ResourceResponse<Document> response = client.upsertDocument(collectionLink, d, null, false);
			client.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


```
Power Appsで2種以上の文字列で文字列分割を行う

# はじめに
おもむろにですが...

```
contributes.menus["editor/context"][0].group
```
こういう文字列がありまして、これをPowerAppsで

```
["contributes","menus","editor/context","0","group"]
```
こんな配列にしたかった時のTIPSです。
※実際にはもう少しいろんなところに [ やら . が入ります

この処理を行うには少なくとも3つの操作が必要だと思われます。
    1. "."ピリオド でSplit
    2. "[" カッコでSplit
    3. "]"を削除

ここで厄介なのは1,2です。PowerAppsのSplitは分割に利用できる**文字列**は1つです。
```Split("Hello/World","/")``` こんな書式。
ですので、AでSplitしてBでもSplitするみたいな操作は、素直にはできないです。
また、Splitの対象は文字列です。なので、
```Split(Split("Hello/World","/"),"o")```
こういう操作もできません。

# 2つの文字列で文字列分割

ではどうするか。余計なコレクションも生み出したくない。そんな時には、以下のような数式で解決できました！

```
Ungroup(
    ShowColumns(
        AddColumns(
            Split(
                "Hello/World",
                "/"
            ),
            "SpSpRes",
            Split(
                Result,
                "o"
            )
        ),
        "SpSpRes"
    ),
    "SpSpRes"
)
```

```Hello/World``` を例として、処理の流れを見ていきます。

## STEP1 : 文字列分割１
数式の一番深いところは

```
Split("Hello/World","/")
```
この単純な分割です。これによって作られるものは、"Result"という列名の配列です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/db3ea542-24a9-7503-7079-11a4d43ab6e9.png)

この結果の各行をさらに"o"で分割して、**一つにまとめた配列を作る**のがゴールです。

## STEP2: AddColumns
STEP1でできた結果にAddColumnsをしています。

```
AddColumns(
    [STEP1の数式],
    "SpSpRes",
    Split(
        Result,
        "o"
    )
)
```
STEP1の結果できる配列は、列名が"Result"です。
ここでやっているのは、そのResultの値を、さらに"o"で分割した結果を、SpSpRes"という列名でAddColumnしなさいという数式です。
これを実行すると以下のような入れ子の配列が生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/75d7d533-ac42-ddff-458d-04afece09e0d.png)

ここまでできたらほとんど完成です。

## STEP3 : ShowColumns
ここではShowColumnsで、*SpSpRes* (ちょうど入れ子になっている部分) のみ表示させています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/591cc54e-57c3-84ec-8df8-b386fd01077d.png)

## STEP4 : Ungroup
入れ子の列はUngroupで解除です！ 
これで結果として、"Result"を列名とした、"/"と"o"という2種の文字列で分割した結果の配列が得られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/229d9768-619b-e9a2-f5d0-4b77f150034e.png)

# おわり
2つの文字列で文字列を分割する場合には、
Split→AddColumns(...,Split())→ShowColumns→Ungroup
という手順で、余計な変数やコレクションを作らずに配列を得ることができます。
3つ以上の場合、素直には、ここで得られた結果をベースにもう一度同じ操作を行えばよいでしょう。
ぜひ何かの機会にご活用ください。


参考：
- [Ungroup + Table = UNION (ALL)](https://qiita.com/h-nagao/items/f4a65e7c84357599b8b8)
- [Power Appsで一意なデータを取り出す方法](https://qiita.com/h-nagao/items/57b1062b74157b85f559)
array.mapでオブジェクトの配列から新しいオブジェクトの配列を返す

業務で必要になって調べたので備忘録です。

```javascript
const petList = [
  {
    name: 'hana',
    kind: 'dog',
    old: 8,
  },
  {
    name: 'maruo',
    kind: 'cat',
    old: 5,
  },
  {
    name: 'sora',
    kind: 'dog',
    old: 6,
  }
]
```

### array.mapでオブジェクトの配列から1つのプロパティだけ抜き出す

オブジェクトの配列から特定のプロパティだけ抜き出した配列を作る場合には、
お馴染みの書き方でいけます。

```javascript

const petNames = petList.map(pet => pet.name)
console.log(petNames)
//["hana", "maruo", "sora"]
```

### array.mapでオブジェクトの配列から新しいオブジェクトの配列を返す

各値から以下のようなオブジェクトを作って、その配列を返したい場合があるとします。

```javascript

{
  name: 'hana@8歳',
  kind: 'dog'
}
```

以下のように書きます。
{ name: `pet.name@pet.old歳`, kind: pet.kind}でオブジェクトを作ってあげて、それを()で囲みます。

```javascript
const newPetList = petList.map(pet => ({ name: `${pet.name}@${pet.old}歳`, kind: pet.kind }))
console.log(newPetList)
//[{ name: "hana@8歳", kind: "dog"}, { name: "maruo@5歳", kind: "cat"}, { name: "sora@6歳", kind: "dog"}]
```

### まとめ
array.mapは最高
【Windows】Explorerがなぜか重い、開かなくなった時の対処方法

今回もメモとして載せておきます。

いきなりExplorerが重くなったり開かなくなったりする時ありませんか？

私はたまにあるのですが、一々PC自体を再起動するのがめんどくさいので、調べてみました。

- [エクスプローラーが開かないか起動しない問題を修正する](https://support.microsoft.com/ja-jp/help/4087370/windows-10-fix-file-explorer-wont-open-or-start)

上記の公式の対処方法を見たのですが、私はただExplorerを再起動させたかっただけなので、ちょっと趣旨が違っていましたね笑

# 解決方法

- [【cmd】Windows10でエクスプローラーが動かない時にコマンドプロンプトでエクスプローラーだけを再起動する方法](http://onocom.net/blog/【cmd】windows10でエクスプローラーが動かない時にコマ/)
- [コマンドプロンプト/プロセスの強制終了など・taskkill](https://win.just4fun.biz/?コマンドプロンプト/プロセスの強制終了など・taskkill)

ありがたやぁ。ここに載ってました。

さくっと手順だけ説明します。

1. `Windows key + R`で「ファイル名を指定して実行」に「cmd」と入力する。  
    でもいいですが、`Windows key`のみ押して「cmd」と入力でコマンドプロンプトすぐ出てくる気がします。

2. 以下のcommandでExplorerを強制終了する。    

    
    ```
taskkill /IM explorer.exe /F
```

    `/IM`オプションによりプログラム名で停止させることができます。
ここではExplorerを停止させたいので`explorer.exe`を指定しています。

    `/F`オプションによりプロセスの強制終了を指定することができます。
今回は強制終了することを目的としているので`/F`オプションを付けています。

3. 以下のcommandでExplorerを再起動する。     

    ```
explorer
```

以上です。

コマンドラインは便利ですね～。
VSCodeでMarkdownとPlantumlを使ってDocx 書き出しをする

## 要望要件定義、ざっくり設計などをWord（GoogleDocument）で作りたくない。

* だがしかしチーム共有などで 「GoogleDocument」を使う現場
* Markdown を管理するGitリポジトリなんて作ってもらえない

そんな時、VSCodeでMarkdownで書いてDocxに落として最終的にGoogleDocumentで開けばええやん。
※ とにかくはじめに書く段階では使いたくない

### POINT

* graphviz をインストール
* Pandoc をインストール
* ImageMagic をインストール
    * DLL版じゃない方
* VSCodeExtention の Markdown-Preview-Enhanced をインストール
* Markdownファイルの先頭に下記を書く
    * See. https://github.com/shd101wyy/markdown-preview-enhanced/blob/master/docs/pandoc-word.md

```
---
title: "たいとる"
output: word_document
---
```

* `ctrl+k` → `v` でプレビューを開く
* プレビューから「Pandoc」を選択して書き出し
* GoogleDriveにアップ
* GoogleDocument で開く

**おまけ**

* Plantuml の雛形

```
skinparam shadowing false
autonumber
participant "あいう" as a
```
Laravelのページネーションをクリックしたときに確認をする

#やりたいこと
Laravelのページネーションを選択したときに
本当に移動していいか確認したい。

環境
Laravel6
jQuery

#やり方

下記のようにページネーションを設置する

```html:app.blade.php
{{$hoges->links()}}
```

すると、標準だとこのようなHTMLに展開されます。

```html
<nav>
    <ul class="pagination">
        <li class="page-item disabled" aria-disabled="true" aria-label="« 前">
            <span class="page-link" aria-hidden="true">‹</span>
        </li>
        <li class="page-item active" aria-current="page">
            <span class="page-link">1</span>
        </li>
        <li class="page-item">
            <a class="page-link" href="//localhost;page=2">2</a>
        </li>
        <li class="page-item">
            <a class="page-link" href="//localhost;page=2" rel="next" aria-label="次 »">›</a>
        </li>
    </ul>
</nav>
```
![SC000024.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/a49612b6-b877-94d2-c4d8-67fad408eb41.jpeg)


これを確認すると、現在いるページ（1ページ目）や前へのボタンは`span`タグになっています。

つまり `page-item`クラスの子要素で、`page-link`クラスを持った`a`タグがクリックされたときに確認すればよさそうです。

```js:confirm.js
    $(".page-item a[class='page-link']").on('click', function (e) {
        if (!confirm('移動しますか？')) {
            e.preventDefault();
        }
    })
})
```

押してみると、確認が表示されました。
1行でアコーディオン( jQuery )

jQueryで簡潔にアコーディオンを実装するときのサンプル。
※ 改行してないだけでホントは３行です
※ CSSを含めるともっとたくさんあります

## CodePen
<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="tatun" data-slug-hash="vYOJXKo" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="1行でアコーディオン">
  <span>See the Pen <a href="https://codepen.io/tatun/pen/vYOJXKo">
  1行でアコーディオン</a> by たっつん (<a href="https://codepen.io/tatun">@tatun</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## ポイント

```js
$(function(){
    $('h3.question').on("click", function() {
        // toggleClassでクラスのつけ外し、slideToggleでスライドのアップダウン
        $(this).toggleClass('opened').next().slideToggle();
    });
});

``` 

ちょっとしたアニメーションならjQueryとCSSでサクッと作るのもいいですね！
jinja2を使ってみた

前回：[Flaskを使ってwebアプリケーション開発](https://qiita.com/nanaco/items/5638e35dd313adca95b0)の続きです。

# ルーティングを追加

前回作成した`app.py`に新たなルーティングを追記していきます。

```python:app.py
from flask import Flask, render_template
app = Flask(__name__)

# 略

@app.route("/hello/<whom>")
def hello(whom):
  return render_template("hello.html", whom=whom)
```

`<whom>`は変数となっていて、たとえば`/hello/taro`でアクセスした場合、whomにはtaroが入ってきます。

`return render_template("hello.html", name=whom)`では、ルーティングから受けっとった`taro`を変数`name`に代入することで、それを`hello.html`ないで使用することができます。

# テンプレートファイル作成
Flaskは、テンプレートをtemplatesフォルダから検索するため、ディレクトリ`templetes`を作成する必要があります。

```
$ midir templates
```

`templetes`の中にhello.htmlを作成します。

```html:hello.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>Hello</title>
</head>
<body>
  <h1>Using Jinja2 Template engine</h1>
  <h2>Hello {{name}}</h2>
</body>
</html>
```

# 参考
[VS CodeとFlaskによるWebアプリ開発「最初の一歩」](https://www.atmarkit.co.jp/ait/articles/1807/24/news024_3.html)
TerraformでAzure管理時、 "features": required field is not set エラーが出るのを修正

# エラー発生
こんなconfigファイルを使っているとエラーが出るようになりました

```azure.tf
provider "azurerm" {
}
```

```
Error: "features": required field is not set
```

# 原因
https://github.com/terraform-providers/terraform-provider-azurerm/releases

> Provider Block: The Azure Provider now requires that a features block is specified within the Provider block, which can be used to alter the behaviour of certain resources

2020-02-24にリリースされた AzureRM provider `v2.0.0` で必須ブロックが増えたようです。

# 解決方法

```azure.tf
provider "azurerm" {
  features {}
}
```

空で良いので `features` ブロックを追加しましょう。

# 参考

https://www.terraform.io/docs/providers/azurerm/index.html#features

https://stackoverflow.com/questions/60384689/terraform-azurerm-2-x-error-features-required-field-is-not-set
添付した画像を非同期でプレビュー表示し、OCRで文字を取得する

#はじめに

こちらは以前のOCRの記事の関連になります。
[OutsystemsのGoogle Cloud Vision OCRを使ってみた](https://qiita.com/fuyuiro/items/44f84f684eda9a67bdcf)


#想定読者
・画像のプレビュ－を非同期で行いたい
・非同期でOCRを行いたい

#事前準備

■Forgeから下記モジュールをDL

・OCR
https://www.outsystems.com/forge/component-overview/1572/googlecloudvisionocr

・File Upload And Image Preview 
https://www.outsystems.com/forge/component-overview/3717/file-upload-and-image-preview-on-choosefile

■Google Vision APIのAPIキーを取得



#実装

####1.画像アップローダーと、File Upload And Image PreviewのWebblockを配置

このタイミングでアップロードした時点で画面での確認が可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/5798f08b-81d3-63e9-2b81-1a56da5e5dea.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/d48093ca-8daa-b8b9-dda4-8246639c3d3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/5fb03b20-52fa-0d51-c767-aae45d5fb61f.png)


WebbloclkのNotifyアクションがはしります。


####2.アップロードしたデータをJsonDeserializeしてStructureに格納



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/9e873503-b310-8ecd-3e33-160402c6f62f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/04e8cd5e-247a-71b9-8b71-9ee39716c2a0.png)


####3.Structureに格納したデータをOCRの下記処理にかけます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/c3ec0d55-f508-9900-bb50-f4db84795cc6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/6f04542e-a252-f055-6380-c09f6ab025de.png)


####4.OCR処理にかけた後、取得したTextをSplitします。
そして正規表現にて画像内で欲しい部分の条件を組み、取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130275/151357b8-d3fa-e25e-ee6f-cf2a0b970bcf.png)

####5.最後にAjaxRefreshをかけて完了


#終わりに

実際に数をこなしてみると、OCRの成功率はそこまで高くなく残念な結果となりましたが、
逆に精度が上がれば使えるかなという印象です。
この実装の仕方で合っているかもわからないですが、誰かのお役に立てれば幸いです。
フォームの入力制限、よく使うやつまとめ

##名前
最初の要素の場合は、`autofocus`をつけると便利かも。

```html
<input type="text" name="name" required autofocus>
```

##メールアドレス
`required`+`pattern`
`pattern`を指定しても`required`が無いと空でも送信できてしまう。
`type="email"`でも入力制限はかかるみたいだけど、ちょっと弱めみたい&内容を把握しておきたいので。

```html
<input type="text" name="email" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$">
```

##電話番号
`type="tel"`+`pattern`+`placeholder`
type=telは、別に入力制限とかしてくれない。国によって電話番号の形式が違うかららしい。つまり気休め。正規表現でパターンを指定する。
placeholderで、ハイフンを入力しない旨を示す。

```html
<input type="tel" name="phone" pattern="^0\d{9,10}$" placeholder="09011112222">
````

##パスワード
`type="password"`
`required`、`minlength`を指定

```html
<input type="password" name="pw" required minlength="8">
```

##ファイルアップロード
`type="file"`、`accept`属性で拡張子を指定。
拡張子の指定方法は以下を参照。
[accept-HTML5入門](http://html5.cyberlab.info/elements/forms/input-accept.html)

```html
<input type="file" name="image" accept="image/png,image/jpeg,image/gif">
```
cloudbuildはdocker buildと同じではない

表題の通り

.gitignoreに追加されているファイルはcloudbuildでは含まれない。

トリガーを使ってgithubのリポジトリから行っている場合、そりゃそうだろ感はある

gcloud builds submit --tag ~~のコマンドを使ってbuildした場合でも同様に、.gitignoreされているファイルはCOPYされない。
T-SQLでループ内のDECLAREによる宣言時、代入を行わないと初期化されない

## 事象
ループ、またはカーソル内で、毎回変数を`null`で初期化したい時、`DECLARE`による宣言のみだと初期化されない。

## 原因
- ループ、カーソルで宣言済み変数名を宣言してエラーにならず、アドレスが更新されない。
- 代入処理がなければ値は変更されない。
って仕様があるのだと思う。多分。ドキュメントが見つからなかった。

## 結論
- `DECLARE`で初期化する場合、代入をする。
- または、ループ内の`DECLARE`を避け、ループの外で`DECLARE`してループ内は`SET`で初期化する。

## 調査
### 初期化できるパターン1

```sql
BEGIN
  DECLARE @count INT = 0
  WHILE @count < 2
    BEGIN
      SET @count = @count + 1
      DECLARE @id INT = null -- ここ

      PRINT '代入前: null?'
      PRINT CONVERT(NVARCHAR(10), @id)

      SET @id = 1;

      PRINT '代入後: 1?'
      PRINT CONVERT(NVARCHAR(10), @id)

    END
END
GO

-- 結果
[2020-03-03 11:06:41] [S0001] 代入前: null?
[2020-03-03 11:06:41] [S0001]
[2020-03-03 11:06:41] [S0001] 代入後: 1?
[2020-03-03 11:06:41] [S0001] 1
[2020-03-03 11:06:41] [S0001] 代入前: null?
[2020-03-03 11:06:41] [S0001]
[2020-03-03 11:06:41] [S0001] 代入後: 1?
[2020-03-03 11:06:41] [S0001] 1
```

### 初期化できるパターン2

```sql
BEGIN
  DECLARE @count INT = 0
  WHILE @count < 2
    BEGIN
      SET @count = @count + 1
      DECLARE @id INT = 2 -- ここ

      PRINT '代入前: 2?'
      PRINT CONVERT(NVARCHAR(10), @id)

      SET @id = 1;

      PRINT '代入後: 1?'
      PRINT CONVERT(NVARCHAR(10), @id)

    END
END
GO

-- 結果
[2020-03-03 11:10:45] [S0001] 代入前: 2?
[2020-03-03 11:10:45] [S0001] 2
[2020-03-03 11:10:45] [S0001] 代入後: 1?
[2020-03-03 11:10:45] [S0001] 1
[2020-03-03 11:10:45] [S0001] 代入前: 2?
[2020-03-03 11:10:45] [S0001] 2
[2020-03-03 11:10:45] [S0001] 代入後: 1?
[2020-03-03 11:10:45] [S0001] 1
```

### 初期化できないパターン

```sql
BEGIN
  DECLARE @count INT = 0
  WHILE @count < 2
    BEGIN
      SET @count = @count + 1
      DECLARE @id INT -- ここ

      PRINT '代入前: null?'
      PRINT CONVERT(NVARCHAR(10), @id)

      SET @id = 1;

      PRINT '代入後: 1?'
      PRINT CONVERT(NVARCHAR(10), @id)

    END
END
GO

-- 結果
[2020-03-03 11:09:56] [S0001] 代入前: null?
[2020-03-03 11:09:56] [S0001]
[2020-03-03 11:09:56] [S0001] 代入後: 1?
[2020-03-03 11:09:56] [S0001] 1
[2020-03-03 11:09:56] [S0001] 代入前: null?
[2020-03-03 11:09:56] [S0001] 1
[2020-03-03 11:09:56] [S0001] 代入後: 1?
[2020-03-03 11:09:56] [S0001] 1
```

## 参考
[SQLSercer - DECLARE](https://docs.microsoft.com/ja-jp/sql/t-sql/language-elements/variables-transact-sql?view=sql-server-ver15)
【AWS】【SAA対策】ElastiCache

# ElastiCache
## サービス概要
クラウドでのメモリ内分散キャッシュ環境のセットアップ、管理、およびスケーリングを AWS クラウドで簡単に行うことができる。
高パフォーマンスでコスト効率に優れるだけでなく、サイズ変更も可能なメモリ内キャッシュを提供しながら、分散キャッシュ環境のデプロイと管理に伴う複雑性を排除。
ElastiCache は、Redis と Memcached エンジンのどちらでも使用可能。

## 特徴
### Amazon ElastiCache for Memcached
- アプリケーションに必要な情報は、デプロイした ElastiCache ノードのホスト名とポート番号のみ。
- Memcached の ElastiCache 自動検出機能を使用すると、アプリケーションはキャッシュクラスター内のすべてのノードを特定し、接続可能。（利用可能なホスト名とポート番号のリストを管理する必要なくなる。）
- キャッシュノードの障害の自動検出と復旧。
- 自動検出を有効にしたクラスター内のノードが自動検出されるため、ノードの追加または削除時にアプリケーションに変更を加える必要なし。
- ノードとクラスターの柔軟なアベイラビリティーゾーンの配置。
- 他の AWS のサービス (Amazon EC2、Amazon CloudWatch、AWS CloudTrail、Amazon SNS など) とも連携した、安全でパフォーマンスの高い管理対象インメモリキャッシュソリューション。

### Amazon ElastiCache for Redis
- キャッシュノードの障害の自動検出と復旧。
- 障害が発生したプライマリクラスターから、レプリケーションをサポートする Redis クラスター内のリードレプリカへの自動フェイルオーバーを備えたマルチ AZ。
- Redis バージョン 3.2 以降では、すべてのバージョンで転送時の暗号化と保管時の暗号化 (認証あり) がサポート。このサポートは、HIPAA 準拠のアプリケーションのビルドに役立つ。
- 耐障害性向上のためのノードとクラスターのAZの柔軟な配置。
- Amazon EC2、Amazon CloudWatch、AWS CloudTrail、Amazon SNS などの AWS のサービスとの統合。

## 種類やタイプ

#### MemchachedとRedis
|                  |   Memcached      |  Redis     |
|:-----------------|:------------------|:-------------------|
| ケース         |・シンプルなデータ型だけで充分な場合<br>・マルチスレッドが必要な場合| ・複雑なデータ型が必要な場合<br>・永続化が必要な場合<br>・フェイルオーバーが必要な場合<br>・pub/subが必要な場合|
| スナップショット          |   - |      有り       |
| マルチスレッド    |    有り |    -       |
|暗号化| - | 有り |
|高可用性| - | 有り |


## 類似サービスとの比較
|                  |   RDS       |    DynamoDB       |Redshift|ElastiCache|
|:-----------------|:------------------|:-------------------|:-------------------|:-------------------|
| 概要             | ・リレーショナルデータベース。<br>・主なDBエンジンをサポート、ツールがそのまま使えるため、オンプレからの移行に便利。<br>・データベースソフトウェアのパッチは自動パッチが可能。|  ・NoSQL データベースサービス。<br>・結果整合性<br>・write直後のreadでは整合性が取れない場合あり。<br>・「強い整合性」オプションを指定すると性能は落ちる。<br>・レコードのサイズに上限あり。<br>・リージョンサービスでありプライベートネットワークからはNAT経由でアクセスする必要あり。    |・データウェアハウスタイプ<br>・スケーラブル<br>・高パフォーマンス|・メモリーキャッシュタイプ<br>・Memcached：Key-Value Store形式のメインメモリキャッシュ。マルチノートのキャッシュクラスタ。<br>・Redis：Memcached：Key-Value Store形式のメインメモリキャッシュ。|
| 場所          |   AZ サービス（VPC内に配置） |      リージョン      |	AZ サービス|	AZ サービス（VPC内に配置）|
| バックアップ             |  スケージュールで1日1回取得可能(手動可)※ただし、バックアップ中はI/O停止、止めたくない場合はマルチAZ利用する必要あり |       -      |-|(memcached)バックアップ機能はなし(Redis)Snapshotによる永続化|
| ユースケース             |  OS以下レイヤの管理不要、高可用性な、既存データベースの利用など |  大量のオンライントランザクション処理など|大容量データの分析など|DBの負荷低減用のメモリキャッシュ|

## ベストプラクティス
- 遅延読み込み
 - 必要なときにのみキャッシュにデータを読み込むキャッシュ戦略。
- 書き込みスルー
 - データがDBに書き込まれると常にデータを追加するか、キャッシュのデータを更新する。
- TTL
 - 「遅延読み取り」と「書き込みスルー」利点を活かす戦略。それぞれの書き込みに有効期限 (TTL) を追加し、過剰なデータでキャッシュがいっぱいになる事態が避けられる。
 - TTL は、キーの有効期限の秒数を指定する整数値
- 高スループットかつ低レイテンシなインメモリデータストアからデータを取得し、大量のデータを扱うアプリケーションを構築したり、既存アプリケーションのパフォーマンス改善を検討する際にElastiCacheの利用がよい。（ex.ゲームのユーザー行動データの処理の高速ぱふぉーまなすなど）
will_paginateのwindowオプションの実装が間違ってる？

# はじめに
Railsでページング機能を実装するgemはいくつかありますが、自分はwill_pagenateを使ってます。そのオプションが意図通りに機能せず、実装が間違ってるのかなと思ったんですが、結論としては合ってそうだという話です。

#事象
will_pagenateでは、Viewに表示するページリンク範囲のオプションがあります。

outer_window：最初と最後のページの後（前）に表示するページ数
inner_window：表示しているページの前後に表示するページ数

自分はouter_windowを0、inner_windowを1に設定していました。
それなので、挙動は以下の画像のようになります。

<img width="315" alt="スクリーンショット 2020-03-03 16.39.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104983/f2c2a0f4-c4af-56f8-0ad4-e8d1841573b1.png">
outer_windowは0なので、2ページと16ページは表示されません。
inner_windowは1なので、現在のページである5ページの前後である、4ページと6ページが表示されます。
想定通りの動作です。

しかし4ページを選択すると以下の様な挙動となりました。
<img width="308" alt="スクリーンショット 2020-03-03 16.43.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104983/332b738b-bde0-00ed-4556-e5f620bb6097.png">

outer_windowは0なので、2ページは表示しません。
また現在のページも4ページなので、一つ前の3ページまでしか表示されず、2ページは「…」で省略されるはずです。
それにも関わらずに2ページが表示されています。
#コード
will_pagenateのコードを見てみましょう。
GitHubでview_helper周りのコードを確認してみると、以下の様な記述がありました。

```ruby:view_helpers/link_renderer_base.rb
# left window
if outer_window + 3 < middle.first # there's a gap
  left = (1..(outer_window + 1)).to_a
  left << :gap
else # runs into visible pages
  left = 1...middle.first
end
```

ページの表示をleft、middle、rightに分けている様です。
必要であればleftとmiddleの間にgap(「...」のこと)を挿入します。

このコードは、outer_windowに+3した数字が、middleの最初のページより小さい場合は、gapを挿入すると書いてあります。
今回は4ページを選択しているので、middleの最初のページは4-1=3、outer_window+3=3となり、gapを挿入する条件を満たしません。
それゆえ2ページ含め全て表示されてしまいます。

#理由
このケースで表示を「...」としても1件(2ページ目)しか表示を省略できません。
ということをどちらにせよ1文字分のスペースは占有するということです。

それであれば、なんの機能も持たない「...」を表示させるより、ページリンクを表示した方がユーザーの役に立ちますよね。

ということで2ページ以上省略できない場合は、そのままページリンクを表示させていると思われます。

#おわりに
ちなみに他のページングgem（kaminari,pagy）を使ってみたんですが、will_pagenateと同じ挙動でした。標準的な動作のようですね。
【マネジメント】大規模スクラムとは

大規模スクラムについて学ぶ
https://qiita.com/yunon_phys/items/565490c5475777fce8d2
http://enterprisegeeks.hatenablog.com/entry/2016/07/11/081117
https://www.slideshare.net/ItsukiSakitsu/agilejapan2015
TwitterBotにはユーザ名エスケープが必要

##起きたこと
・Twitterボットが突然凍結された

##凍結理由
・個人情報を含む情報を発言した、とのこと

##原因
・住所をユーザー名としているユーザーに、ユーザー名込みでリプライを飛ばした。

運用しているBotには、Twitterユーザー名を引用して挨拶を返す機能がある。
「～さん、おはよう」的なやつ。

今回は、そのユーザー名が「○○県○○市○○999-9[^1]」という名前だった。
[^1]: 掲載にあたり伏せているが、実在する住所
これが、Twitter社のおそらく自動検知プログラムで、許可がない個人情報の暴露として誤検知された模様。

##対応
・ひとまず自分が持っているアカウント全てで対象ユーザーをブロック。

##根本対応、今後の教訓
・ユーザー名を引用するときは、エスケープ処理が必要。

・住所らしき文字列をはじく。
⇒郵便番号と、○○[都道府県]○○市くらいまでは弾く必要がありそう。

・メールアドレスっぽい名前と、電話番号も怪しい。
⇒「nnnn＠nnnn.nnn」と「999-9999-9999」のパターン


##感想
該当のTwitterBotは、学生の頃からずっと動いてるやつ。
(GAE+python2.7)
特に便利機能を持ってた業務アカウントでもなく、当時ハマってたゲームのキャラクターbotである。
キャラクターごとに何個かアカウントがあったのだが
悲しいことにそれぞれログインして、ブロック作業をする必要があった。

なお、このbotを制作してた当時はuserStreamが出てまなしくらいの時代で、
しょっちゅうpost制限とかかかるためにサブ垢複数持ってるのが当たり前、なんて時代だった。

該当のユーザー名(ていうか住所)でググってみると
特定の界隈ではなんか有名なヤバイやつが住んでる住所らしい。
必ずしも本人とはわからないけども。

愉快犯なのかこうなることを知らずにやってるのかはわからないけど
ほんと困る出来事だった。

まさか運用開始から9年近くたって、こんなユーザーが現れるとは。

とはいえ、TwitterBotを開発するときに、気を付けないといけないポイントがわかったのはありがたい教訓である。

しかしながらTwitterさん、ユーザー名に自ら住所を設定するやつは
そもそも入力チェックで弾くべきではないですかね…。
【MC】KCUにかんする情報

KCUがらみは以下のページにいろいろ書いてある。

・基本１年契約

・KCU待ち時間=ログの「kcu wait time」=MCの管理のRoboServerの「KCU待機時間」

https://knowledge.bizrobo.com/hc/ja/articles/360029748592-%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E7%A8%BC%E5%83%8D%E7%8A%B6%E6%B3%81%E3%82%92%E5%88%86%E6%9E%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84-
KCU待ち時間については上記のページに記載あり


https://knowledge.bizrobo.com/hc/ja/articles/360028154971-MC%E4%B8%8A%E3%81%A7KCU%E3%81%AE%E5%88%A9%E7%94%A8-%E6%B6%88%E8%B2%BB-%E7%8A%B6%E6%B3%81%E3%82%92%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%97%E3%81%A6%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95
どのステップでどれくらい待ちが発生しているかというログが出力できるのは上記のページに設定方法がある

https://knowledge.bizrobo.com/hc/ja/articles/360027878932-KCU%C3%A3%C2%81%C2%AE%C3%A5%CB%86%C2%A9%C3%A7%E2%80%9D%C2%A8-%C3%A6%C2%B6%CB%86%C3%A8%C2%B2%C2%BB-%C3%A7%C5%A0%C2%B6%C3%A6%C2%B3%C2%81%C3%A3%E2%80%9A%E2%80%99%C3%A7%C2%A2%C2%BA%C3%A8%C2%AA%C2%8D%C3%A3%C2%81%E2%84%A2%C3%A3%E2%80%9A%E2%80%B9%C3%A6%E2%80%93%C2%B9%C3%A6%C2%B3%E2%80%A2
https://basicrobo.com/%E6%99%82%E9%96%93%E3%81%8C%E3%81%8B%E3%81%8B%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E5%AF%BE%E5%BF%9C/
Flaskを使ってwebアプリケーション開発

```bash
$ pip install flask
```

# 最小アプリの作成
```python:app.py
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello_world():
  return "Hello, World!"
```

`from flask import Flask`でflaskパッケージからFlaskクラスをインポートしています。
`@app.route("/")`でルートを好きなように設定することができます。

## 実行
```bash
$ export FLASK_APP=app.py
$ flask run
```




# 参照
[VS CodeとFlaskによるWebアプリ開発「最初の一歩」](https://www.atmarkit.co.jp/ait/articles/1807/24/news024.html)
PowerShellで文字コード変換

#文字コード変換したいけど・・・
まだまだIBMホストが動いているのか文字コードをEBCDICにして納品する先がありました。
SJIS⇒UTF-8はサクラエディタなどで簡単に変換できますがEBCDICとなると話は別。
WindowsPCの標準機能で解決するとしたらPowerShellかなぁと思いいろいろ調べました。
[こちら](https://www.atmarkit.co.jp/ait/articles/0804/18/news155.html)をほぼほぼそのまま流用させていただきました
そして出来上がったのがこちら。

```Convert.ps1
# スクリプトファイルのパラメータを宣言（先頭から「変換対象のフォルダ」
# 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」）
param(
  [String]$in = "BEFORE",
  [String]$out = "AFTER",
  [String]$from = "Shift-JIS",
  [String]$to = "IBM290"
)

# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
$enc_t = [Text.Encoding]::GetEncoding($to)
# 与えられたパスから合致するファイルリストを再帰的に取得
Get-ChildItem $in -recurse |
  # 取得したファイルを順番に処理
  ForEach-Object {
  # 取得したオブジェクトがファイルの場合のみ処理（フォルダの場合はスキップ）
    if($_.GetType().Name -eq "FileInfo"){
  # 変換元ファイルをStreamReaderオブジェクトで読み込み
      $reader = New-Object IO.StreamReader($_.FullName, $enc_f)
  # 保存先のパス、保存先の親フォルダのパスを生成
      $o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
      $o_folder = Split-Path $o_path -parent
  # 保存先のフォルダが存在しない場合にフォルダを自動生成
      if(!(Test-Path $o_folder)){
        [Void][IO.Directory]::CreateDirectory($o_folder)
      }
  # 保存先ファイルをStreamWriterオブジェクトでオープン
      $writer = New-Object IO.StreamWriter($o_path, $false, $enc_t)
  # 変換元ファイルを順に読み込み、保存先ファイルに書き込み
      $tmp = $reader.Readtoend()
      $reader.Close()
      $tmp = $tmp -replace "`r`n",''
      $writer.Write($tmp)
  # ファイルをすべてクローズ
      $writer.Close()
    }
  }
```
同じ階層にBEFOREフォルダを作成して、その中に変換したいファイルを放り込んで実行するとAFTERフォルダの中に文字コード変換後のファイルが同名で作成されます。
今回は改行コードなしだったので最後にCRLFを削除してますのでご注意を。
#SJISからUTF-8（BOMなし）も・・・
今度はUTF-8への変換ということでファイルの容量も大きいことからPG流用したところBOM付きのためリテイク。
いろいろと調べてBOMなしの時はこちら。

```Convert2.ps1
# スクリプトファイルのパラメータを宣言（先頭から「変換対象のフォルダ」
# 「変換後のファイルの保存先」「変換前の文字コード」「変換後の文字コード」）
param(
  [String]$in = "BEFORE",
  [String]$out = "AFTER",
  [String]$from = "Shift-JIS",
  [String]$to = "UTF-8"
)

# 引数$from、$toから、文字コードを表すEncodingオブジェクトを生成
$enc_f = [Text.Encoding]::GetEncoding($from)
# BOMなしの場合はオブジェクト作成!!
$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
  # 与えられたパス（c:\tmp\convert）から合致するファイルリストを再帰的に取得
  Get-ChildItem $in -recurse |
  # 取得したファイルを順番に処理
  ForEach-Object {
  # 取得したオブジェクトがファイルの場合のみ処理（フォルダの場合はスキップ）
    if($_.GetType().Name -eq "FileInfo"){
  # 変換元ファイルをStreamReaderオブジェクトで読み込み
      $reader = New-Object IO.StreamReader($_.FullName, $enc_f)
  # 保存先のパス、保存先の親フォルダのパスを生成
      $o_path = $_.FullName.ToLower().Replace($in.ToLower(), $out)
      $o_folder = Split-Path $o_path -parent
  # 保存先のフォルダが存在しない場合にフォルダを自動生成
      if(!(Test-Path $o_folder)){
        [Void][IO.Directory]::CreateDirectory($o_folder)
      }
  # 保存先ファイルをStreamWriterオブジェクトでオープン
      $writer = New-Object IO.StreamWriter($o_path, $false, $Utf8NoBomEncoding)
  # 変換元ファイルを順に読み込み、保存先ファイルに書き込み
      $tmp = $reader.Readtoend()
      $reader.Close()
      $tmp = $tmp -replace "`r`n","`n"
      $writer.Write($tmp)
  # ファイルをすべてクローズ
      $writer.Close()
    }
  }
```
【MC】MCからロボをダウンロードできる

MCからロボをダウンロードできる
https://knowledge.bizrobo.com/hc/ja/articles/360027607571-MC%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%89%8B%E9%A0%86%E3%81%A8MC%E3%81%B8%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E6%89%8B%E9%A0%86
【MC】一定の時間が経過したらロボを停止する

"時間をきめて、越えたら強制停止する　
https://knowledge.bizrobo.com/hc/ja/articles/360039152632-MC%E3%81%AE%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E5%86%85%E3%81%AE%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AB%E5%AE%9F%E8%A1%8C%E6%99%82%E9%96%93%E3%81%AE%E4%B8%8A%E9%99%90%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95"
Qiitaの使い方について

#Qiitaの使い方
Qiitaはさまざまな記事があり、PHP初心者の自分でもわかりやすいように説明をしてくれるサイトがあったり、自分が忘れてしまわないうちにメモ代わりに使う人もいてさまざまです。
###伝え上手とどんな構成で書いているのか
参考にさせていただいたサイト
https://qiita.com/minato-naka/items/cc9da5fc1bc8cc4240a8
この方のを参考にPHPを勉強させていただきました。
メリットとデメリットがすごくわかりやすく、デメリットの対処法なども書いてありPHP初心者の自分にとってものすごくPHPがどういうものなのかということが分かりました。
PHPは型がコロコロ変わるよという説明をしてくれています。
実際にソースコードを用いて説明してくれるので、変わっている様子が見られて本当に変わってるんだ！とわかります。
###面白い点
https://qiita.com/tadsan/items/154070f1ee4c7fe4ae47
PHPの記事を調べていて、おもしろいなと思ったのがこのサイトです。
PHPでのvoidにすごい詳しく書いており、使い道などを紹介していますが、voidは何がnullなので結果がほとんど何も帰ってこない悲しい結果になっています。おもしろかったので、
是非見てください。
ありがとうございました。
vimで「カーソルを包むカッコの中で色々したい」と思うとき

## tl;dr

- 今自分がいるカッコの中の要素を、末尾まで削除したい → それvim標準のmotion `])` でやれるよ
- 今自分がいる関数呼び出しの引数リストの中で、n個の引数を削除したい → vim-swapのオプション使うと便利だよ

## 今のカッコの中で末尾まで○○したい

### 背景

たまによくあるのが、関数の呼び出しの中で「ここから後いらねんだよなぁ」となったとき。

```js
    foo(arg1, arg2, arg3, arg4)
//cursor:---^
```

こういう場合は単に `dt)` としてしまえば、 `, arg2, arg3, arg4` が消せます。

<details><summary>ref: `:help t`</summary>
<pre>t{char}                 右に向かって [count] 番目に現れる {char} まで移動しま
                        す。カーソルは {char} の左側の文字に置かれます
                        inclusive。
                        {char} は f コマンドと同様に入力できます。</pre></details>

ですが、引数にカッコが含まれてる場合もたまによくあります。

```js
    foo(arg1, arg2, bar(baz(qux())), quux())
//cursor:---^
```

これをとっさに `d5t)` ってやれるの、レインマンくらいでしょう。

### 解決策

そんな時、 `])` を使うと便利です

<pre>])			[count] 次のマッチするものがない ')' に移動します。
			|exclusive|。
</pre></details>

上の例だと、カーソル位置から見ると、 `bar(〜)` も `baz(〜)` も（以下同文）マッチするので、
最後に `foo(` の片割れである `)` が引っかかります。
で、 exclusive motionなので、その手前までが対象になりますね。

### 注意点

じゃあ、今のカッコの中で始点まで…と思って「逆だし `[(` じゃね？」と思って使うと、
ちょっと失望します。

```js
    foo(bar(), arg2, arg3, arg4)
//cursor:-----------^
```

この状態で `d[(` とやると、

```js
    foo arg3, arg4)
```

こうなります。なぜか始点の `(` が消えるんですね。なぜだ。

## aside: 引数リストのn個を○○したい

一方で、 **末尾だの始点だのじゃなくて、引数n個消したいんだけど** という場合もあると思いますが、
その場合は [machakann/vim-swap](https://github.com/machakann/vim-swap) を使うと、

```viml
map <Plug>(swap-textobject-i)
map <Plug>(swap-textobject-a)
```

があるので、omapとxmapで`i,`や`a,`に割り当てると便利です。

i.e. 

```viml
omap i, <Plug>(swap-textobject-i)
xmap i, <Plug>(swap-textobject-i)
omap a, <Plug>(swap-textobject-a)
xmap a, <Plug>(swap-textobject-a)
```
大阪の天気をWebAPI経由で取得する（python）

# 目的
大阪の天気をWebAPI経由で取得した際の備忘録です（python）

# 準備

下記を参照いたします。
天気の情報は、www.drk7.jp 様のサイトを参照いたします。

> [気象庁の天気予報情報を XML で配信](https://www.drk7.jp/weather/)
> [PythonでXMLから降水確率を取得する](https://qiita.com/m_nish/items/d391cfae0ca01c6f1bd8)


# コード



```python:weather.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import datetime
import requests
import xml.etree.ElementTree as ET

def chance_of_rain(pref_url, date):
    if date is None:
        date = datetime.datetime.today().strftime("%Y/%m/%d")
    root = ET.fromstring(requests.get(pref_url).content)
    for area in root.iter('area'):
            for info in area.findall('info'):
                if info.get('date') == date:
                    rainfallchance = info.find('rainfallchance')
                    for period in rainfallchance.findall('period'):
                        yield period.get('hour'), period.text

if __name__ == '__main__':
    prefecture = 'http://www.drk7.jp/weather/xml/27.xml'
    hours = '00-06', '06-12', '12-18', '18-24'
    date = datetime.datetime.today().strftime("%Y/%m/%d")
    print('大阪の降水確率 ', date)
    for hour, percent in chance_of_rain(prefecture, date):
        if hour in hours:
            print('%sh %s%%' % (hour, percent))
```

```
$ python weather.py 
大阪の降水確率  2019/08/13
00-06h 0%
06-12h 0%
12-18h 10%
18-24h 10%
```

いい感じに可視化するにはどうすればいいんでしょうか。

# 参考
[気象庁の天気予報情報を XML で配信](https://www.drk7.jp/weather/)
[PythonでXMLから降水確率を取得する](https://qiita.com/m_nish/items/d391cfae0ca01c6f1bd8)
[降水確率を取得しようとしたら案外手間取った話](http://ism1000ch.hatenablog.com/entry/2014/02/04/033533)
[【Python】raspberry pi 置き時計に天気予報を追加した件](https://qiita.com/Kazuya_Murakami/items/6a65a23ff4071259caa3)
[PythonのTkinterを使ってみる](https://qiita.com/nnahito/items/ad1428a30738b3d93762)
【随時更新】HPE スイッチ コマンド【運用編】

HPE スイッチを業務利用する中で
よく使うコマンドを備忘録として残します

Ciscoスイッチはこちら
[>> 【随時更新】Cisco スイッチ コマンド【運用編】](https://qiita.com/0tuy0r0hi/items/cdee728a492b115596cc)
##基本編
####システムビューに移行
```
> system-view
```
Ciscoでいうenableです
なお、コンフィギュレーションモードとの
区別はないそうです

---
####ログアウト
```
> quit
```
モードの移行にも使います

---
####ページ送りを無効
```
> screen-length disable
```
disp curr等の長い結果を見る際に
--more-- が出てこなくなります

---
####相手の機器にtelnet接続
```
> telnet IPアドレス
```
相手側の機器の設定によっては
telnetできない場合もあります

---
####ヘルプ(コマンド、引数の候補表示)
```
> ?
```
とても便利なので多用しましょう
sからはじまるあのコマンドなんだっけ・・・
そんなときでも大丈夫
わかるところまで入力して?を入力するだけ
スペルチェックにも使える最強コマンドです

##設定確認編
####現在の設定の確認
```
> display current-configuration
```
現在の設定値を見たい場合や
バックアップを取る際に使います

---
####保存されている設定の確認
```
> display saved-configuration
```
名前のとおり起動時に読み込まれる
設定の確認に使います

---
####結果から検索対象を含む行を表示
```
> コマンド | include "検索対象"
```
Linuxでいうgrepと一緒です

---
####結果から検索対象を含むまない行を表示
```
> コマンド | exclude "検索対象"
```
Linuxでいうgrep -vと一緒です

---
####結果を検索対象が含まれる行から表示
```
> コマンド | begin "検索対象"
```
以外に使う頻度が高いので覚えておくと便利です

---
####機器のバージョン確認
```
> display version
```
設定によってはVer依存するのもあるので
一応確認しておきましょう

---
####機器と接続されているSFPのシリアルNoを表示
```
> display device manuinfo
```
SFPがちゃんと認識されているか
確認する時に使います

---
####インターフェースの情報を表示
```
> display interface brief
```
インターフェースごとの速度
VLANを見たい時はこちら

---
####インターフェースの情報を表示２
```
> display ip interface brief
```
インターフェースごとに設定されている
IPアドレスを見たい時はこちら

---
####VLANの情報を表示
```
> display vlan brief
```
登録されているVLANの一覧が確認できます

---
####ルーティングテーブルの確認
```
> display ip routing-table
```
登録されている
ルーティングテーブルの一覧を確認できます

---
####ARPテーブルの確認
```
> display arp
```
MACアドレス解決されて
登録されているものが表示されます

---
####接続されているMACアドレスの確認
```
> display mac-address
```
接続されている全ての
MACアドレス一覧が確認できます

---
####vpn-instanceの確認
```
> display ip vpn-instance
```
登録されているvpn-instanceの
一覧を確認できます

---
####リンクアグリゲーションの状態確認
```
> display link-aggregation summary
```
登録されているリンクアグリゲーションの
一覧を確認できます

---
####システムログの確認
```
> display logbuffer
```
システム的なログを見たい時に使います

##疎通確認編
####通信相手の応答有無の確認
```
> ping IPアドレス
```
リーチアビリティが取れているか
確認したい時に使います

---
####通信経路上のルータを確認
```
> tracert IPアドレス
```
どのルーターを通るのか確認できます

##おわりに
以上がHPEスイッチ運用で
よく使うコマンドでした

また使うものが増えてきたら
随時更新していきます
ClickOnce「FTP サーバーと通信するためのコンポーネントはインストールされていません。」

###ClickOnce「FTP サーバーと通信するためのコンポーネントはインストールされていません。」

ClickOnceで公開した時に「FTP サーバーと通信するためのコンポーネントはインストールされていません。」となりFTPサーバーにアップロードされないときの対応
###手順
1.Visual Studio Installerを起動し変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431695/7c0a4511-6d55-e761-7f9c-af147766206a.png)

2.ASP.NETとWEB開発にチェックをいれて変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431695/e8b7729c-6dec-d163-2377-5bb00a615ae4.png)

以上でClickOnceで公開可能になる。

###原因
Web配置のコンポーネントが必要だったと思われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431695/b911ed7a-b9d4-5cfa-3f12-b6cfa52711f0.png)
Ruby  じゃんけんプログラムを作ろう

# 要件を整理してみよう
プログラミングを勉強したての頃、FIzzBuzz問題やじゃんけん問題を作成することがあると思います。
今回はそのじゃんけん問題をRubyで作っていこうと思います。

# 最初はグー

```ruby:
puts "じゃんけん・・・・"
puts "[0]グー\n[1]チョキ\n[2]パー"
```
この後自分の手を0、1、2で入力し、グー、チョキ、パーを判定します。
また自分の手をplayer_hand、相手の手をprogram_handととし、相手の手はランダムで決定されるようにします。

```ruby:
player_hand = gets.to_i
program_hand = rand(3)
```
この時、グー、チョキ、パーを0、1、2で判別するためにグー、チョキ、パーを配列に置く必要があります。

```ruby:
jankens = ["グー", "チョキ","パー"]

```
ここまでの処理は

```ruby:
puts "あなたの手:#{jankens[player_hand]}, 相手の手:#{jankens[program_hand]}"
```
で表示出来ます。


ここまでの処理

```ruby:
puts "じゃんけん・・・・"
puts "[0]グー\n[1]チョキ\n[2]パー"

player_hand = gets.to_i
program_hand = rand(3)

jankens = ["グー", "チョキ","パー"]
puts "あなたの手:#{jankens[player_hand]}, 相手の手:#{jankens[program_hand]}"
```
# 勝ち負け判定
あいこの場合はplayer_handとprogram_handが==の時、
・勝ちの場合は
①player_handがグーの時、program_handがチョキ
②layer_handがチョキの時、program_handがパー
③player_handがパーの時、program_handがグー
の3通りです。
・最後に負けの場合ですが、上記の処理以外は全て負けとなりますので、上記に当てはまらない場合は負けとなります。
これをまとめると

```ruby:
if player_hand == program_hand
  puts "あいこで"
  return true
elsif(player_hand == 0 && program_hand == 1)||(player_hand == 1 && program_hand == 2)||(player_hand == 2 && program_hand == 0)
  puts "あなたの勝ちです"
  return false

else
  puts "あなたの負けです"
  return false
end
```
となります。

# あいこの時は
勝ちか負けであればゲームは終了となりますが、もしあいこだった場合、ゲームは続行します。
よって上記までの処理をループします。

```ruby:
puts "最初はグーじゃんけん・・・・"

def janken
  puts "[0]グー\n[1]チョキ\n[2]パー"

  player_hand = gets.to_i
  program_hand = rand(3)

  jankens = ["グー", "チョキ","パー"]
  puts "あなたの手:#{jankens[player_hand]}, 相手の手:#{jankens[program_hand]}"

  if player_hand == program_hand
    puts "あいこで"
    return true
  elsif(player_hand == 0 && program_hand == 1)||(player_hand == 1 && program_hand == 2)||(player_hand == 2 && program_hand == 0)
    puts "あなたの勝ちです"
    return false

  else
    puts "あなたの負けです"
    return false
  end
end



next_game = true

while next_game
  next_game = janken
end
```
以上でじゃんけん問題の制作を終わります。
[chrome] ウィンドウを最前面にするショートカット

# はじめに
ウィンドウを最前面にして作業をしたいと思って

# やり方
最前面にしたいウィンドウで`Alt+Space`を押す
`常に最前面に`をクリック

# まとめ
このやり方はChromeに限らず適用できると思います。いろいろと活用してみてください。
プロ野球選手で理解する「醜いアヒルの子の定理」

# 1 醜いアヒルの子の定理とは
　醜いアヒルの子(白鳥の子)とアヒルの子は，似通った2羽のアヒルの子が似ているのと同じ程度に似ているという意味である．正直，この説明だけだと，ちょっと何言ってるかわからない．よって，プロ野球選手に例えることで，この定理をわかりやすくしようと思う．
# 2 解説
## 2.1 プロ野球選手に例えて状況を設定する
　まず，プロ野球選手を見分けるために，3つの特徴を用いる．1つ目は，パワーがある(ホームランが多い選手の特徴を「パワーがある」と表現する)．2つ目は，ミート力がある(打率が高い選手の特徴を「ミート力がある」と表現する．3つ目は，走力がある．
　これらの特徴を以下の文字とする．
・S₁：パワーがある
・S₂：ミート力がある
・S₃：走力がある
　このとき，3つの特徴によって，プロ野球選手は8つ(=2³)のクラスに分類される．各クラス1人のプロ野球選手をサンプルとし，例を挙げる．このとき，それらの野球選手をxiとする(iはこの記事で紹介する順番．特に特徴Sの数字と関連付けてはいない)．
・x₁：バレンティン(パワー，S₁)
・x₂：青木宣親(ミート，S₂)
・x₃：赤星憲広(走力，S₃)
・x₄：松井秀喜(パワーとミート，S₁⋂S₂)
・x₅：山田哲人(パワーと走力，S₁⋂S₃)
・x₆：イチロー(ミートと走力，S₂⋂S₃)
・x₇：柳田悠岐(パワーとミートと走力，S₁⋂S₂⋂S₃)
・x₈：醜いプロ野球選手(3つの特徴は該当なし)
(野球を知らない人にもイメージしてもらえるように，なるべく有名選手で例を挙げました．そのため，厳密な査定ではないので，ご了承ください．)
これらをベン図に整理すると，以下のようになる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581527/ec3fef36-beb4-b5a7-e478-98bc0ab140e0.png)
左図の特徴のベン図と，右図の選手のベン図が対応している．ちなみに，左図の各点は，その範囲内にテキトーに点を打ったものである．各プロ野球選手の能力を考慮して，厳密に点の位置を定めたものではないので，ご了承ください．
## 2.2 ペアの野球選手の類似度を評価する
　上図のように，3つの特徴によって，8種類のクラスができる．クラスとは，上右図における，同じ色の領域である．このとき，8種類のクラスそれぞれを「含むor含まない」と選択をすることで，さまざまな特徴を記述することができる(S₁，S₂，S₃は特徴を記述するための基本となる特徴．例えるなら，文章を書くための文字)．例えば，S₁⋂S₂は，「X₄のクラスを含む，X₇のクラスを含む，他のクラスは含まない」という記述により表現できる．このようにして，全ての特徴の記述は，2⁸個になる．これは，8つのクラスについて「含むor含まない」の2通りの選択肢があるため，2の8乗が総数となるからである．
　ここからが重要である．松井秀喜とイチローの共通点は，松井秀喜(x₄)の属するクラスとイチロー(x₆)の属するクラスを含む特徴の記述である．このときの，特徴の記述は，2⁶個である．なぜなら，x₄の属するクラス(赤色)と，x₆の属するクラス(緑色)は，含むことが確定しているので，残りの6つのクラスで「含むor含まない」の選択を考えれば良いからである．
　一方で，醜いプロ野球選手とイチローの共通点も，同様にして特徴の記述が2⁶個となってしまう．2人の共通点である「特徴の記述の数」を類似度とした場合，**「松井秀喜とイチロー」の類似度は，「醜いプロ野球選手とイチロー」と同じになった．**そんなバカな...
## 2.3 醜いアヒルの子の定理とは，何が問題なのか
　類似度を定める際に，特徴の記述を数えたことが問題である．特徴を1つずつ数えるということは，どの特徴も同じ重要度として扱っていることを意味する．つまり，ただ特徴を選び出すだけでは，我々はパターンを認識できないということを，この定理は述べているのである．
# 3 感想
　特徴は重要性が付加されることで，初めて認識に役立つことがわかった．重要な特徴は，重要なものとして扱う必要があるということである．だから，機械学習における重み付けには，このような意味がある．当たり前のことだが，こうして考えてみると，面白いと思った．
【CakePHP3】【PHPUnit】コントローラーのテストでファイルをPOSTする方法

半日つぶしたので備忘録として。

POSTデータと`$_FILES`にそれぞれ画像の情報を入れれば正常に送れる。
（おそらく実践では`csrf_token`が必要になるはず）

```php
public function testIndex()
{
	$fileKey = 'image_key';
	$fileInfo = [
		'name' => 'image_name.jpg',
		'tmp_name' => 'path/to/tmp_image_name.jpg',
		'type' => '%拡張子と同じ形式%',
		'error' => UPLOAD_ERR_OK,
		'size' => '%ファイルサイズ%',
	]
	$_FILES = [
	    $fileKey => $fileInfo,
	];
	$this->post('index', [$fileKey => $fileInfo]);
}
```
Laravel5.7 新規画像投稿〜画像表示まで

###はじめに
備忘録的視点でLaravelを使った画像投稿の方法を記述。
したいこと
→投稿するたびに、任意の画像たちが画面に出力される
##準備物
DB・・・diariesテーブルとeimgカラム作成
投稿画面・・・newpost.blade.php
出力画面・・・home.blade.php
ルート・・・web.php
コントローラー・・・DiaryController.php
モデル・・・Diary.php

あと、ここには書いてないけど出力画像の大きさを指定するhome.css

##実装過程
①画像投稿用のフォームを用意
②画像パスをDBへ保存
③指定した画像を任意storageフォルダに保存
④DBから画像パスを呼び出して、該当画像をstorageから出力

#①画像投稿用のフォームを作成
inputタグを使って画像データを指定する。
投稿画面用にnewpost.blade.phpを作成。
newpost.blade.php

```php

<form method="POST" action="{{ route('store') }}" enctype="multipart/form-data">
@csrf
  <div class="li-content">
     <label>新規画像</label>
     <div class="basic">
     <input type="file" name="eimg" id="eimg" placeholder="画像選択"></div>
  </div>
</form>
```

ポイント
1.画像データ(パス)をDB保存するのでmethodはPOST
2.routeでstoreメソッドを通って画像パスを保存する(後述)
3.ファイルを送るときのおまじない、enctype="multipart/form-data"をかく
4.inputタグにはtype="file"とname="eimg"を入れておこう(②で使う)


#②画像パスをDBへ保存
DBへ画像パスを保存するには、以下の工程が必要。
web.php

```php

Route::post('/newpost','DiaryController@store')->name('store'); //保存処理
```
DiaryController.php

```php
public function store(Request $request){

        $imgPath = $this->saveImage($request->file('eimg'));

        $diary = new Diary();
        $diary->eimg = $imgPath;

        $diary->save();
        return redirect()->route('home');
    }
```

ポイント
1.ユーザーが任意で選択した画像パスをsaveImageメソッドの引数にいれる
 →saveImageメソッドは後述
2.入れて処理したものを、$imgPathに格納

3.DBのカラムに予め用意したeimgに、$diary->save()で保存


#③指定した画像を任意storageフォルダに保存
アクセス権限をprivateにしつつ、引数に$imageを入れてsaveImage関数を生成
DiaryController.php

```php
private function saveImage($image)
    {
         // デフォルトではstorage/appに画像が保存される。
         // 第2引数にpublicをつけることで、storage/app/publicに保存される。
         // 今回は、第１引数にPictureをつけて、
         // storage/app/public/Pictureに画像が保存されるようにする。
         // ※自分で指定しない場合、ファイル名は自動で設定される。
       $imgPath = $image->store('Picture', 'public');

       return 'storage/' . $imgPath;
    }
```
このsaveImageメソッドが②でのユーザー画像パスと結びついて保存される。

#④DBから画像パスを呼び出して、該当画像をstorageから出力
最後に画像を出力する
home.blade.php

```php
@foreach ($diaries as $diary)
            <div class="estate-img1">
                <img src="{{ asset($diary->eimg) }}">
            </div>
@endforeach
```
DiaryController.php

```php
public function home ()
    {
        $diaries = Diary::all();
        return view('home', ['diaries' => $diaries]);
    }

```

ポイント
1.画像を投稿するたびにその画像が画面に並んで欲しいので、foreachで回す
2.Diaryモデルをインスタンス化し、第２引数で'DBのdiariesテーブルにあるデータを$diariesに入れたよ'と宣言し、home.blade.phpを表示する

#終わりに

DBに直接画像を保存することはできないので、画像のパス(住所みたいなもん)を保存してあげて、
画像のお呼び出しがあったときに、storage内の画像パスと合致したものが出力される仕組みを作ってあげる。
雑だけど、まーこんな感じ。
Jupyter Notebookをコマンドラインから一瞬でも早く起動させたいがためのメモ

# この記事の概要

私はMacユーザ、しかもコマンドラインインターフェースを好んで良く使います。しかし仕事柄、データを可視化したりする場合には`Jupyter Notebook`が便利。そこで、Jupyter Notebookを少しでも早く起動するためのメモをここに残しておきます。

# aliasを.bashrcに設定

Macではシェルの設定ファイルをいじることで、エイリアスを設定することができます。実際に設定してみましょう。

ホームディレクトリに移動します。

```zsh
$ cd
```

[Vim](https://www.vim.org/)を用いて`.bashrc`(zshを使用している場合は.zshrcなど)を、以下のように編集します。

```bash
# for Jupyter Notebook
alias jn='jupyter notebook'
```

もし他のコマンドに設定したい場合は上述の`jn`の部分を好きな文字列に変えてください。
編集した.bashrcファイルを読み込みます。

```bash
$ source .zshrc
```

# .bash_profileに.bashrcを読み込むように支持を書く

ターミナルを立ち上げるときに毎回`source .bashrc`をタイプしていては元の木阿弥です。そこで`.bash_profile`に以下を追記します。

```bash
# read .bashrc
source ~/.bashrc
```

これで次回からターミナルの起動と同時に.bashrcの内容が反映されるようになります。

# Jupyter Notebookを起動

```zsh
$ jn
```

で無事にJupyter Notebookを起動できるようになりました。タイピング数が少なくなるだけでQOLが爆上がりします。
特定のコードを全て書き換える/消去する方法

1.comd + F
2.findをreplaceに書き換え
3.テキストフィールドがもう一つ（計2つ）出現するので、入れ替えたいテキスト/後のテキストを入力

スーパー便利

https://hacknote.jp/archives/16403/