OmniAICreator/Qiita-1.07M huggingface dataset:
Cannot read property 'pickAlgorithm' of null 解決方法

## エラーまでの経緯
Vue.js学習の為、新規で構築したまっさらなLaravel8のプロジェクトにVue.jsをインストールするべく下記コマンドを実行したところエラーが発生。

エラーによると、pickAlgorithmを読み取ることができないらしい。

```
test-laravel $ npm install vue@next vue-loader@next @vue/compiler-sfc

npm ERR! Cannot read property 'pickAlgorithm' of null

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/yusei/.npm/_logs/2022-04-25T01_35_47_680Z-debug-0.log
```

## 解決
キャッシュをクリアして再インストールで解決！

```
test-laravel $ npm cache clear --force
npm WARN using --force Recommended protections disabled.

test-laravel $ npm install vue@next vue-loader@next @vue/compiler-sfc

added 33 packages, and changed 1 package in 7s

75 packages are looking for funding
  run `npm fund` for details
npm notice 
npm notice New minor version of npm available! 8.5.5 -> 8.7.0
npm notice Changelog: https://github.com/npm/cli/releases/tag/v8.7.0
npm notice Run npm install -g npm@8.7.0 to update!
npm notice 
```

## 参考記事
https://stackoverflow.com/questions/69567381/getting-cannot-read-property-pickalgorithm-of-null-error-in-react-native
【備忘録・Ruby】to_○メソッドまとめ

## 初めに
こんにちは、だいごです。
今回はRubyのto_○メソッドをまとめていきます。
よかったらご覧ください。

## to_○メソッドまとめ
今回まとめていくto_○メソッドは以下に記すものになります。
- to_sメソッド
- to_iメソッド
- to_aメソッド
- to_fメソッド
- to_hメソッド
- to_symメソッド

今回はまとめないメソッドはこちらになります。
- to_cメソッド(=複素数に変換)
- to_rメソッド(=有理数に変換)

### to_sメソッド(s:string)
文字列以外のオブジェクトを文字列に変換するメソッド。

```ruby
オブジェクト.to_s

# 使用例
10.to_s 
=> "10"
nil.to_s 
=> ""
hoge.to_s 
=> "hoge"
```

### to_iメソッド(i:integer)
文字列を整数に返すメソッド。
また、小数を整数に変換することもできる。
もし、文字列に整数と認識できないものがあれば、その場合は0を返す。

```ruby
文字列.to_i

# 使用例
"10".to_i
=> 10
"9.9".to_i
=> 9
"test".to_i
=> 0
```

### to_aメソッド(a:array)
ハッシュ、範囲オブジェクトなどを配列に変換するメソッド。

```ruby
オブジェクト.to_a

# 使用例
(1..5).to_a
=> [1, 2, 3, 4, 5]
("a".."e").to_a
=> ["a", "b", "c", "d", "e"]
```

### to_fメソッド(f:float)
レシーバであるオブジェクトをFloatクラスのオブジェクトに変換するメソッド。
簡単に言えば、小数に変換するメソッド。
浮動小数点数と認識されない場合は0.0を返す。

```ruby
オブジェクト.to_f

# 使用例
10.to_f
=> 10.0
"hoge".to_f
=> 0.0
```

### to_hメソッド(h:hash)
配列をハッシュに変換するメソッド。

```ruby
二次元配列オブジェクト.to_h

# 使用例
array = [[:japan, yen],[:us, dollar],[:china, yuan]]
array.to_h
=> {japan: "yen" , us: "dollar" , china: "yuan"}
```

### to_symメソッド(sym:symbol)
シンボル（Symbolオブジェクト）を返すメソッド。
Symbolオブジェクトは、コードの上では文字列のように見えるが、プログラム内部では整数として扱われているため、文字列を扱うより高速に処理される。

```ruby
オブジェクト.to_sym

# 使用例
"hoge".to_sym
=> :hoge
```

## 終わりに
今回はRubyのto_○メソッドについてまとめました。
用途に合わせてきちんと使い分けれるようにしたいです。
ご指摘・コメントお待ちしております。
ありがとうございました。

## 参考
https://qiita.com/sabakan789/items/5e559f830506959c4e00
20220425AWS学習メモ

AWSの基本観点

1.	単一障害点のない設計になっているか
2.	スケーリングする設計になっているか
3.	セキュリティ面に問題ないか
4.	コストの最適化がされているか

初心者学習方法

・インターネット
https://aws.amazon.com/jp/blogs/news/2022-aws-beginner-learning/

https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

他YoutubeにあるAWS解説動画、公式非公式含む

AWSサミット2022
https://aws.amazon.com/jp/summits/japan/

【メモ】
動画は1.5倍速で聞こう

・オフ
AWSがわかる
https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E5%8D%B3%E6%88%A6%E5%8A%9B-Amazon-Web-Services%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF%E3%81%A8%E6%8A%80%E8%A1%93%E3%81%8C%E3%81%93%E3%82%8C1%E5%86%8A%E3%81%A7%E3%81%97%E3%81%A3%E3%81%8B%E3%82%8A%E3%82%8F%E3%81%8B%E3%82%8B%E6%95%99%E7%A7%91%E6%9B%B8-%E5%B0%8F%E7%AC%A0%E5%8E%9F/dp/4297108895/ref=asc_df_4297108895/?tag=jpgo-22&linkCode=df0&hvadid=342458612368&hvpos=&hvnetw=g&hvrand=11363943521457391210&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009562&hvtargid=pla-1031061044592&psc=1&th=1&psc=1

クラウドプラクティショナー認定
https://www.amazon.co.jp/%E4%B8%80%E5%A4%9C%E6%BC%AC%E3%81%91AWS%E8%AA%8D%E5%AE%9A%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC%E7%9B%B4%E5%89%8D%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E7%AC%AC2%E7%89%88-%E5%B1%B1%E5%86%85%E8%B2%B4%E5%BC%98/dp/4798067156/ref=sr_1_1?crid=15FTQP3J2ZFVE&keywords=%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC&qid=1650852389&s=books&sprefix=%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%2Cstripbooks%2C264&sr=1-1

ソリューションアーキテクト認定
https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/4815607389/ref=sr_1_7?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=WRSV9FPM5ONK&keywords=%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88&qid=1650852286&s=books&sprefix=%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88%2Cstripbooks%2C212&sr=1-7

AWSではじめるLinux入門ガイド　※現コンソールと少し違うので注意
https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BLinux%E5%85%A5%E9%96%80%E3%82%AC%E3%82%A4%E3%83%89-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4839970963/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1R0W51N68S6T1&keywords=AWS%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8BLinux&qid=1650852576&s=books&sprefix=aws%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8Blinux%2Cstripbooks%2C232&sr=1-1

【メモ】
各本は新品で買うと高い、メルカリ、ブックオフでもあまり見かけない、中古でも高い
1k以下の安いのを発見した場合は、お得かも
AWSがわかるとAWSではじめるLinux入門ガイドは図書館にあった、2週間借りれる、ほかに予約なければ延長も

クラウドプラクティショナーは基本学習のため、ソリューションアーキテクトは資格として持ってるといいかも、知らんけど

以上
既に存在しているリモートブランチをローカルブランチとして持ってきたい

## 1. terminalを開く
リモートブランチirukaをローカルブランチに持ってくる

> <img width="562" alt="スクリーンショット 2022-04-25 10 53 12" src="https://user-images.githubusercontent.com/79749395/165008091-d02b7b86-676b-4fac-8c0c-705f34907403.png">

↑`git branch -a`でリモート追跡ブランチにremotes/origin/irukaが存在していることを確認

（ローカルでリモートブランチであるorigin/irukaの存在を認識できているということ）
## 2. リモートブランチorigin/irukaをローカルブランチirukaとして作成する
コマンドは
~~~
git checkout -b ローカルで作成するブランチ名　リモートのブランチ名
~~~

今回だと
- iruka （ローカルブランチ：まだない）
- origin/iruka （リモートブランチ：既に存在）
なので

~~~
git checkout -b iruka origin/iruka
~~~
とする（[git checkout -bとは](https://git.command-ref.com/cmd-git-checkout.html)）

> <img width="559" alt="スクリーンショット 2022-04-25 10 53 25" src="https://user-images.githubusercontent.com/79749395/165008098-45b905f0-e869-4920-b8a9-5c70c9d49840.png">

~~~
git branch -vv
~~~
でローカルのirukaブランチが作成できており、かつリモートブランチのorigin/irukaと接続できていることがわかる（[git branch -vvとは？](https://git.command-ref.com/cmd-git-branch.html)）
こんなURLは嫌だ！ ユーザーのURLが連番数字だ。プロフィールURLにはユーザー名を使おう。

# こんなURLは嫌だ

ユーザーのURLが連番数字だ。


`https://menta.work/user/5694`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89618/4b158b33-46a6-600c-8f63-3fbe1a4a62ef.png)


- URLを見てどんなページか分からない、5694番のユーザーって何よ
- ユーザーが自分のURLを広めにくいというか、URLだけで自分を示せないので取り回しが悪い、愛着が湧かない

ある程度の規模以上のサイトでも、何故かユーザーIDをURLに使わないサービスがある。なんだかもったいないなと思う。

# Twitterの場合

Twitterはドメインスラッシュ以下がすぐにユーザーだ
https://twitter.com/YumaInaura

homeページなど主要機能のページは、予約語のような感じで、こちらもスラッシュ以下すぐでアクセスできる
https://twitter.com/home











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Laravelのマイグレーションの注意点

# マイグレーション
この記事に色々載っています。
下の資料は最新版です。

https://readouble.com/laravel/9.x/ja/migrations.html

```php
$table->integer('folder_id'); //integrは数字の設定ができない
$table->integer('folder_id',1); //これはだめ


$table->date('due_date')->default(now());//defaultで１指定はできない　
$table->date('due_date')->default(1);//defaultで数字で指定はできない　

$table->timestamp('email_verified_at')->nullable(); //入るかわからない場合はnullableを使う
$table->string('remember_token',255)->nullable();
```
マイグレーションを使う時気をつけてください。



# 参考資料

https://readouble.com/laravel/6.x/ja/helpers.html



https://readouble.com/laravel/
CloudWatchでBillingアラートを作成する

こんにちは。
先日AWSマネジメントコンソールでEC2を立てて3日ほど放置したところ約10USDほどの課金があり、円安の影響をモロに受けたCultivateです。

このような悲劇を繰り返さないためにも、本日はCloudWatchを用いたアラート作成を行いたいと思います。


＜手順＞


①マネジメントコンソールにログインし、リージョンをバージニアへ設定する（バージニアリージョンに請求情報がまとめて格納されているため）

②Billingにアクセスし、「請求」タグにある「請求設定」を選択する。

③画面中央の「請求アラートを受信する」というチェックボックスにチェックを付け、詳細設定を保存する

④CloudWatchへアクセスし、「アラーム」タグの「請求」を選択する。

⑤「アラームの作成」を選択し、メトリクス名（今回はEstimatedCharges)、Currency(今回はUSD)を選択する

⑥アラームの名前を設定する

上記手順でCloudWatchのアラートを有効化できます。
Laravelでscssを使いてぇ

**環境**
OS:macOS Montery
PHP: PHP 8.1.4
Laravel: Laravel Framework 8.83.8
MySQL : 5.6.38 - MySQL Community Server (GPL)
Node.js: 14.17.6
npm: 6.14.15

# scssを記述するファイルを作る
 /resouses/sassフォルダを開く
するとapp.scssが存在していると思うので、
同じフォルダ内(sassフォルダ内)に

_style.scss
を新規ファイルで作成


# さっき作ったファイルを読み込む 
app.scssを開いて
@import 'style';
を追記

# _style.scssに適当に書いていく
```_style.scss

.loginMainView{
  background-color: #e9ecef;
}

```

# コンパイルする
ターミナルで以下コマンド実行
```
npm run dev
```

これでエラーが出なければ
public/css/app.cssに反映されてるはず！


# background-imageなど画像パスを指定したい場合
完成イメージはこんな感じです。
```
  // publicフォルダのapp.cssから見てのパスを指定する
background: url(../img/IMG.JPG) center/cover;
```

## webpack.mix.jsを編集
```webpack.mix.js
 mix.js("resources/js/app.js", "public/js")
 .sass("resources/sass/app.scss", "public/css")
 .options({
     processCssUrls: false
 });
```

**ポイント**
```
.sass("resources/sass/app.scss", "public/css")
```
上記は
「resources/sass/app.scssをコンパイルしたとき、
public/cssに反映させます」
という意味。

```
 .options({
     processCssUrls: false
 });
```
これをつけないと、以下のようになって、パスの指定がややこしいです。
```
.example {
  background: url(/images/example.png?d41d8cd98f00b204e9800998ecf8427e);
}
```

## ファイルを指定する
**画像ファイルの階層**
アプリ名/public/img/IMG.JPG

**app.cssの階層**
アプリ名/public/app.css

app.cssから見てIMG.JPGの場所を指定するので、
```
../img/IMG.JPG
```
となります。

**結果こんな感じ**
```
background: url(../img/IMG.JPG) center/cover;
```
Laravel で Whoops, looks like something went wrong. のエラー表示を変える

Laravel プロジェクトでエラーがでました。

> Whoops, looks like something went wrong.

↓はスクショです。
![CleanShot 2022-04-25 at 10.44.38@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/f6458d80-9d47-145a-ee34-c9941756051e.png)

# Whoops, looks like something went wrong. の問題
この問題点というのは、エラー箇所がすぐに特定できないの点です。

エラーをわかりやすくすることで問題の解消をすすめたいです。

# APP_DEBUG=true にする
laravel に .env ファイルがあるので、APP_DEBUG を有効にします。

```
vim laravel/.env

APP_DEBUG=true
```

エラーメッセージが変わりました。

![CleanShot 2022-04-25 at 10.50.25@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1624/4e4f09aa-6ab9-dcaa-91ce-747192d58b42.png)

成功です。

# 参考
[Laravelでのデバッグ方法4パターンまとめ \- Qiita](https://qiita.com/rarrrrsQ/items/34f3867bbcb17604e136)
VSCodeでMarkdownを編集している時に、ファイル内検索で「前の一致項目」のショートカットが効かない時

# TL; DR

VSCodeのショートカットの
「Markdown Preview Enhanced: Run Code Chunk」のWhen式を
`editorLangId == 'markdown'`
から
`!findInputFocussed && editorLangId == 'markdown'`
へ変更する。

※ 条件に`!findInputFocussed`を追加する。

## 背景

デフォルトのキーバインドだと`Shift + Enter`に「前を検索」が割り当たっている。
When式は`editorFocus && findInputFocussed`なため、検索フォーム選択時のみ動作するようになっている。

しかし、「Markdown Preview Enhanced」の拡張機能をインストールしていると、
同じ`Shift + Enter`に「Markdown Preview Enhanced: Run Code Chunk」も割り当たる。
When式のデフォルトが`editorLangId == 'markdown'`のみなため、Markdownファイル内なら最優先で実行されてしまう。

そのため、「Markdown Preview Enhanced: Run Code Chunk」を「検索フォーム選択時以外」で動作させるようにすることで、
検索フォーム選択時には「前を検索」が実行されるようにした。
応用情報技術者試験にほぼ無勉で合格した話

# 前回の基本情報技術者試験を経て
昨年の秋期試験の時に下記のような記事を作りました。
こちらに記載した勉強法で今回も試験に臨もうとしたのですが、結論から言うと、他にやることができてほとんど勉強できませんでした。

正確な時間は測っていませんが、約10時間ほどしか勉強できなかったと思います。
今回はそういう状況で結果はどうだったのか、振り返ってみてのポイントは？など誰かの参考として残しておきたいと思います。

https://qiita.com/pike3/items/24eafae0b45c514af8d0

## 自己採点の結果
応用情報技術者試験は基本情報技術者試験のCBT試験と違って、受験後すぐに結果が届きません。
合否と採点結果は2ヶ月後とだいぶ先になってしまうため、今回は自己採点しました。

結果は次の通りです。

午前試験：62.5点
午後試験：63点（TAC）、68点（iTEC）

※午後試験についてはIPAの回答の掲載がまだなので、資格スクールの回答例を元に採点しています。

合格基準は午前・午後ともに6割らしいので、かなりギリギリでしたね・・・
でも、自己採点の結果だといちおう合格しています。


# 勉強方法
ほぼ無勉といっても、いちおう10時間ほどは勉強したので、その内容について。

簡単に言うと、前回の基本情報技術者試験の勉強法を途中までやった形です。

午前試験については、過去問道場のオプションで「計算問題なし」で全問やりました。
ただ、1回流しただけで、解説などあまり読まずに終わってしまいました。

午後試験については、同じく過去問道場で必須のセキュリティは過去問すべて解きました。
あとは「経営戦略」「システムアーキテクチャ」「組込みシステム開発」「プロジェクトマネジメント」「ITサービスマネジメント」「システム監査」を2,3問程度問題と回答をざっと見ただけです。

# 受験時のポイント
午前試験は基本情報技術者試験とほぼ変わらないので、特にこれといったポイントはありません。

午後試験は記述式になっているので、いくつかポイントがあります。

## 選択問題で選んだ問題
選択問題は10問中4問選択する必要がありますが、私の場合は次の4問選択しました。

* システムアーキテクチャ
* 組込みシステム開発
* プロジェクトマネジメント
* システム監査

これらはほぼほぼ国語の問題なので、問題文に回答が隠れています。
今回勉強に時間が取れなかったので、無勉でも点が取れそうなものを選択しました。

## 記述式はできるだけ本文の言葉を使うべし
自己採点をしていて、自分でやらかしてしまったなと思ったのが記述式の一部で自分の言葉で書いてしまったことです。
資格スクールの回答例だと問題本文中の言葉を使っていて、そりゃ本文中の言葉のほうが確実だし、説得力があるよなーと思ってしまいました。

## 本文と問題文を読んで早めに選択問題を決める
私は結果として、上記4問を選択したのですが、試験時間中に他の問題も見ました。
結果として選ばなかった問題に時間をかけてしまったため、早めにどの問題を選ぶか判断したほうが良かったなーと思いました。

実際に全問解くのに試験時間ギリギリになってしまったので・・・

# さいごに
つまり、何が言いたいかと言うと、 **応用情報技術者試験は勉強しなくても合格する可能性があるので、諦めずに必ず受験してください！** ということです。
特に基本情報技術者試験に合格した人なら、同じような問題が出たりするので、より合格率は高いと思います。

また、実際に試験会場に行くと、いくつかの席が空いており、この中には受験せずに諦めてしまった人がいるんだなーと思いました。

受験費用も払って、勉強も少ししたのであれば、それらが勿体なくないですか？
仮に不合格だったとしても、受験した経験は必ず次の試験に活かせると思うので、ぜひ諦めずに受験してみてください！

※追記
無事合格していたのでタイトルを更新しました！
ローカルブランチとリモートブランチを紐づける

## 1.　terminalを開く
- リモートブランチはGitHubで作成している
    - [GitHubでリモートリポジトリを作成するを参照](https://qiita.com/kitutune/items/68ec48d72f940219ebbe)
- ローカルブランチはterminalで作成している
    - [terminalでローカルブランチを作成するを参照](https://qiita.com/kitutune/items/7fe379b9698aebb1d0f4)

↓リモートブランチ

<img width="346" alt="スクリーンショット 2022-04-25 9 35 31" src="https://user-images.githubusercontent.com/79749395/165003573-ed27a79e-4808-4f34-8f05-df549068f7e4.png">

↓terminalで見た各種情報
> <img width="543" alt="スクリーンショット 2022-04-25 9 27 42" src="https://user-images.githubusercontent.com/79749395/165003384-168158ec-8979-4245-b963-e3da2bbcd8c6.png">

※↑git branch -a の部分でリモート追跡ブランチが
`origin/main`
しか無いことがわかる

他のリモートブランチ(origin/sameとか)をterminalではまだ認識していないということ

## 2.　ローカルブランチookamiとリモートブランチorigin/kameを紐づける
まずはookamiブランチにcheckout(移動)
<img width="548" alt="スクリーンショット 2022-04-25 9 28 00" src="https://user-images.githubusercontent.com/79749395/165003386-196ff9e3-a5be-4e22-837f-898cccc4008c.png">
↑作業ブランチをookamiにした

## 3. リモートブランチをterminalに認識させる（追跡ブランチを作成させる）
~~~
git fetch
~~~

することでリモートブランチが増えていることを認識させる（[git fetchとは](https://git.command-ref.com/cmd-git-fetch.html)）

> <img width="356" alt="スクリーンショット 2022-04-25 9 29 25" src="https://user-images.githubusercontent.com/79749395/165003388-7469b97a-d889-45ab-8e15-445570b2e38c.png">

↑認識したので各リモートブランチに合わせてローカルに追跡ブランチが作成されたことがわかる

`remotes`とついているのが追跡ブランチ

- remotes/origin/irukaがリモート追跡ブランチ（ローカルにある）
- origin/irukaがリモートブランチ（オンライン上にある）

`git branch -a`ではリモートブランチが見えないことがこれでわかるね

## 4. ローカルブランチookamiとリモートブランチorigin/kameを紐づける


既にローカルのookamiブランチにいるので

~~~
git branch -u origin/kame
~~~

で繋がる（[git branch -uとは](https://git.command-ref.com/cmd-git-branch.html)）

~~~
git branch -vv
~~~
で紐づいているとことがわかる（[git branch -vvとは](https://git.command-ref.com/cmd-git-branch.html)）
> <img width="566" alt="スクリーンショット 2022-04-25 9 29 48" src="https://user-images.githubusercontent.com/79749395/165003390-b05cf847-849e-430c-b1ce-43415be9e0b7.png">
fishシェルでパスを追加するときの方法

M1Macでfishシェルでライブラリなどをインストールした時のメモ

## 環境
AppleM1 チップ(2020年製)
Monterey バージョン12.3

## 行った手順
①ライブラリのインストール
②パスの確認
-シェルの変更
-シェルの確認
③config.fishへの追加

## ①ライブラリのインストール
今回はnodenvのnpmを利用して、`Vue@CLI` をインストールした。

```:ターミナル(fish)
$ npm install -g @vue/cli
```

インストールは無事成功したが、fishシェルを利用しており、Vueのパスが通ってないことに気づく。

```:ターミナル(fish)
$ vue --version

fish: Unknown command: vue
```

## ②パスの確認
まずはパスを確認しようと思い、 whichコマンドを利用したが、fishシェルでは表示できなかったため、シェルの変更をした。

```:ターミナル(fish)
$ chsh -s /bin/zsh
👉 シェルの変更
$ exec $SHELL -l
👉 シェルの再起動
Type help for instructions on how to use fish
```

zshシェルに切り替えた上でVueのパスを確認しなおした。

```:ターミナル（zsh）
$ which vue
👉 パスの確認
ユーザー名/.anyenv/envs/nodenv/shims/vue
```
ちなみに、`echo $SHELL` で利用中のシェルを確認でき, `cat /etc/shells`で、ホスト上で利用できるシェルを確認できる。

```:ターミナル(fish)
$ echo $SHELL
👉 現在利用しているシェルの確認
/opt/homebrew/bin/fish

$ cat /etc/shells
👉 利用できるシェルの確認
/bin/bash
/bin/zsh
/opt/homebrew/bin/fish
```
## ③config.fishへの追加

```:ターミナル（zsh）
$ vim ~/.config/fish/config.fish
```
fishのバージョンが 3.4.1 だったので、fish_add_pathを使用することができた。
以下の記述を `config.fish`　に追加した。

```:ターミナル（zsh）
# Vue
set -gx VUE_HOME $HOME/.vue
fish_add_path .anyenv/envs/nodenv/shims/vue
```
詳細なfishの文法を調べていないため、この記述方法は間違っている可能性がある。
最後に、fishシェルに戻し、ターミナルの再起動、バージョン確認をしたところVueのパスがうまく通っていた。

```:ターミナル（zsh）
$ chsh -s /opt/homebrew/bin/fish
$ exec $SHELL -l
```

```:ターミナル（fish）
$ vue -V
@vue/cli 5.0.4
```
Tableau URLの生成の仕組み

# はじめに
<!-- 発端や概要を記載 -->
Tableauのワークブックをパブリッシュすると、URLが変わる現象が発生した為、
原因と対応策を調査をしました。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [TableauのURLの仕組みと生成の特徴](#Chapter1)
1. [URLが変わらないようにするには](#Chapter2)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# TableauのURLの仕組みと生成の特徴
<h2> URLの構成</h2>
Tableau Server ではワークブックをパブリッシュしたときに、基本的に以下のような組み合わせで生成されているので、

ダッシュボード URL リンクが変わらないように運用する必要がある為、いくつかポイントを抑える必要がある。
- URL構成
 https://＜Tableau Server名・IP＞/#/site/＜サイト名＞/views/＜ワークブック名＞/＜ビュー名・ダッシュボード名＞

<h2> 生成の特徴</h2>
このときに＜ワークブック名＞や＜ビュー名・ダッシュボード名＞は実際の名前を元に生成されるが、他に以下のような特徴がある。

- 日本語など全角の文字列は反映されない（削られる）
- 空白や記号は反映されない（削られる）
- 半角英数はそのまま反映される
- 上記のルール適用後に重複してしまう＜要素＞が存在するときは、一意になるように数値が追加される
- プロジェクトは URL に反映されないため、他のプロジェクトにあるワークブック名と重複する可能性もある

<h3> 例 1 半角英数のみで構成されている</h3>
サイト: デフォルト
ワークブック名: Test Workbook
ビュー名: Sheet 1
ダッシュボード名: Dashboard 1

- Sheet 1 URL
　 https://tableau.example.com/#/views/TestWorkbook/Sheet1
- Dashboard 1 URL
　 https://tableau.example.com/#/views/TestWorkbook/Dashboard1

<h3>  例 2 半角英数のみで構成されている</h3>
サイト: デフォルト

ワークブック名: Test Workbook
ビュー名: Sheet 1

同じファイル名が Project 1 と Project 2 に存在する
- Project 1/TestWorkbook/Sheet 1 URL
　 https://tableau.example.com/#/views/TestWorkbook/Sheet1
- Project 2/TestWorkbook/Sheet 1 URL
　 https://tableau.example.com/#/views/TestWorkbook_16353001465040/Sheet1

あとからパブリッシュしたワークブックには一意になるように数字が付与されている

<h3> 例 3 日本語と数字で構成されている</h3>
サイト: デフォルト

ワークブック名: テストワークブック
ビュー名: シート 1、シート 2
ダッシュボード名: ダッシュボード 1

- シート 1 URL
　 https://tableau.example.com/#/views/_0/1
- シート 2 URL
　 https://tableau.example.com/#/views/_0/2
- ダッシュボード 1
　 https://tableau.example.com/#/views/_0/1_1

ワークブック名部分は「テストワークブック」に半角英数がないため「_0」が割り当てられてしまっている
ビュー名の「シート 」の部分は削られて「1」と「2」だけが残る
ダッシュボード名の「ダッシュボード 」の部分が削られたのちに、ビュー名とかぶらないように _1 が追加されて [1_1] になる

<h3> 例 4 日本語と数字で構成されていて、単純な日本語の削除だけだと例 3 と重複してしまう</h3>
上記の例 2 が存在する状態に以下のワークブックをパブリッシュ


サイト: デフォルト
ワークブック名: 本番データワークブック
ビュー名: シート 1
ダッシュボード名: ダッシュボード 1

- シート 1 URL
　 https://tableau.example.com/#/views/1/1
- ダッシュボード 1
　 https://tableau.example.com/#/views/1/1_1

ワークブック名部分は「本番データワークブック」に半角英数がないのと、例 2 と重複しないように「1」が割り当てられてしまっている
ダッシュボード名、ワークブック名その他は例 2 と同じ

<h3> 例 5 日本語と英数字が混在している</h3>
サイト: デフォルト

ワークブック名: Prod-Section-1本番データワークブック2021
ビュー名: SHシート 1、SHシート 2
ダッシュボード名: DASHダッシュボード 1、DASHダッシュボード 2

- SHシート 1 URL
　 https://tableau.example.com/#/views/Prod-Section-12021/SH1
- SHシート 2 URL
　 https://tableau.example.com/#/views/Prod-Section-12021/SH2
- DASHダッシュボード 1 URL
　 https://tableau.example.com/#/views/Prod-Section-12021/DASH1
- DASHダッシュボード 2 URL
　 https://tableau.example.com/#/views/Prod-Section-12021/DASH2

ワークブック名、ビュー名、ダッシュボード名ともに英数字のみが残った URL になる

<a id="#Chapter2"></a>
# URLが変わらないようにするには

例3,4の場合、日本語のみのワークブック名やビュー名・ダッシュボード名のご利用が多いと、数字だけの URL になったり、
ワークブック内での重複が起きて、意図しないURLになりやすいのが現状。

URLの変更が起きにくいように以下の点を実施した。

- サイト全体でワークブック名が他のワークブックと重複しにくいように、固有の英数字を追加する
- ワークブック内の各シートでも日本語を削ったあとの名前が重複しないように、固有の英数字を追加する
- ワークブックを Tableau Desktop にパブリッシュするときは、確実に同じ場所のワークブックを指定して上書きパブリッシュする
　 同じ名前で違うプロジェクトに保存すると、サイト内での重複とみなされて URL の＜ワークブック名＞の部分に数字が付与される要因になる


<h2>以上
PHPのpreg_match()でよく使う正規表現の備忘録

PHPのpreg_match()をよく使うのですが、毎度毎度正規表現を調べており面倒であったため、よく使うものを備忘録として残します。

# 本記事の環境

ホストOS：Windows10 Pro 64bit 16GB
ゲストOS：Red Hat Enterprise Linux 8.3 (Ootpa)
Oracle VM VirtualBox：6.0.4a
vagrant：Vagrant 2.2.14
Apache：2.4.37
Tera Term：4.105
PHP：7.4

```php
// 空である場合
if (preg_match("/\A[ 　\t\r\n]+\z/", XXX) || (XXX == "")) {
}

// 月(01～12)である場合
if (preg_match("/\A(0[1-9]|1[0-2])\z/", XXX)) {
}

// 英数字である場合
if (preg_match("/\A[a-zA-Z0-9]+\z/", XXX)) {
}

// テキストファイル(.txt)である場合
if (preg_match("/\.txt/i", XXX)) {
}

// 日本語、英数字、スペースを許可する場合
if (preg_match("/\A[ぁ-んァ-ヶーa-zA-Z0-9一-龠０-９ 　]+\z/", XXX)) {
}

// 半角英数字混在で6桁以上20桁以下(=パスワードチェックで使う想定)
if (preg_match("/\A(?=.*?[A-z])(?=.*?\d)[A-z\d]{6,20}+\z/", XXX)) {
}

// 半角数字で6桁以上20桁以下(=パスワードチェックで使う想定)
if (preg_match("/\A\d{6,20}\z/", XXX)) {
}

// 半角英数字で6桁以上20桁以下(=パスワードチェックで使う想定)
if (preg_match("/\A\w{6,20}\z/", XXX)) {
}
```
Railsのエラーではまったらやること

### 結論
1. エラー文を読む
2. デバッグツールを使いながらエラー解消を試みる
3. それでも解消できなければ誰かに質問する

です。


### エラー文を読む
エラーにはまっている人はエラー文をしっかり読んでいない印象があります。しっかりエラー文を読みましょう。エラーをきちんと読んでなかった人はこれするだけで大分変わります。また、エラーを直せない原因として単純に知識不足の場合もあるのでその場合は公式ドキュメントを読んで勉強し直しましょう。

### デバッグツールを使いながらエラー解消

putsなどを使ってデバッグしていないでしょうか？デバッグツールを使った方が変数の中身など覗きやすいので利用していきましょう。デバッグツールのイメージがつかない方もいると思うので簡単な使用例を出します。

gem pry-byebugを用いて変数のuserの中身を覗きます。

まず覗きたい変数の近くにbinding.pryを差し込みます。

```ruby
def show
  user = User.find(42)
  binding.pry
  render json: user, status: :ok
end
```

次にユーザー詳細ページにとぶとターミナルが先ほどbinding.pryを差し込んだ位置で止まります。ここで"user"と入力しエンターすると以下のようにuserの中身が見られます。

```ruby
    2: def show
    3:   user = User.find(42)
    4:   binding.pry
 => 5:   render json: user, status: :ok
    6: end

[1] pry(#<UsersController>)> user
=> #<User id: 42, email: "hoge@bar.com">
```


エラーが出た時にとても便利なのでぜひ使っていきましょう。


### それでも解消できなければ誰かに質問する

エラーを読み、デバッグツールを使ってもエラーが解消できない場合は質問しましょう。質問することで自分の心理的負担も減りますし、質問しようとすることで頭の中が整理され自己解決したり良いことだらけです。

質問できる相手がいなければ質問サイトを使うと良いです。[Stack Overflow](https://stackoverflow.com/)や[Terateil](https://teratail.com/)が良いでしょう。


以上がRailsのエラーではまったらやることになります。

ここまで読んでいただきありがとうございます。僕は今までこの３ステップを踏んで解決できなかったエラーはないので参考になるかと思います。お役立てれば幸いです。
まとめてレコードを作成する時はトランザクションを使おう

# トランザクションとは

**トランザクション**とは...コンピュータ システムにおける、永続的なデータに対する不可分な一連の処理

**ロールバック**とは...データ更新などで障害が起こったときに、その前の状態にまで戻ることをいう


# トランザクションの具体例

例えばTwitterでフォローしてる人のツイートを通知ONにしている時、

・ツイートの作成
・通知の作成

の二つはセットで作成されるべきです。ツイートだけ作成に成功する、または通知だけ作成に成功するというのはよろしくないですね。そういう時に、処理をトランザクションとして書くことで一連の処理を確実にすることができるようになります。もし、エラーが発生した場合はロールバックされ元の何も手を加えられていない状態に戻ります。

個人開発やポートフォリオの作成ですとこういった守りの開発（他にもエラーハンドリングとか）が疎かになりがちかと思いますが実務では必須なので日頃の開発から癖づけておくと良いかもです。

Railsですとトランザクションはこんな感じに書けます。

```ruby
  def create
    ActiveRecord::Base.transaction do
      tweet = Tweet.create!(text: 'hoge')
      @notification_targets.each do |target|
        tweet.notifications.create!(target_id: target.id)
      end
    end
  end
```

# トランザクションするときは例外が出るようにしよう

ロールバックはトランザクション中に例外が発生することで起こります。なので逆にいうと作成してはいけない時にちゃんと例外を出さないと不正にレコードが作成されてしまいます。

具体的にいうと以下のようなコードが悪い例です。

```ruby
  def create
    ActiveRecord::Base.transaction do
      tweet = Tweet.new(text: 'hoge')
      tweet.save
      @notification_targets.each do |target|
        notification = tweet.notifications.new(target_id: target.id)
        notification.save
      end
    end
  end
```

saveメソッドレコードの作成に失敗してもfalseを出すのみで例外は出ません。基本, エクスクラメーションマーク（！）をつけることで作成に失敗した際例外が出るようになるので"!"をつけましょう。

そして、トランザクション失敗時の処理はrescue部分に書くのですがrescueするエラーはちゃんと指定しましょう。なんでもrescueしてしまうのは良くないので。


```ruby
  def create
    ActiveRecord::Base.transaction do
      tweet = Tweet.new(text: 'hoge')
      tweet.save
      @notification_targets.each do |target|
        notification = tweet.notifications.new(target_id: target.id)
        notification.save
      end
    end
  rescue ActiveRecord::RecordInvalid => invalid
    puts invalid.record.errors
  end
```
Railsアプリで時々あるServiceディレクトリの役割

# はじめに
Serviceを今まで、なんとなくで利用してきていたので「Serviceとはなんだ？」というのを調べてみました。

# 事前知識

ファットモデル...ビジネスロジックが大量に書かれているモデル

ビジネスロジック...業務システムの中で、具体的な業務で扱う様々な実体（商品、顧客、在庫など）を表現し、また、それらの関係や処理の方法、業務の流れなどをデータモデルやプログラムコードなどとして実装した部分。


# Serviceとは？

僕はServiceを「ファットモデルになることを回避し、コードを読みやすくするためのコード分割先」という意味だと理解しました。

具体的にServiceに置かれる処理は

・外部サービスを利用する処理
・複数のモデルに渡る複雑な処理

になります。

Serviceを活用することでコントローラーもモデルもすっきりしコードの可読性が上がるというわけです。

# Serviceはどのように書く？

書き方はどうやら多岐にわたるようです。そのため逆にどこにでも共通しているのが書き方の規約をプロジェクトで決めてるということです。

例えば

・クラス名は、{動詞}{目的語}Serviceという命名規則
・publicメソッドは"call"だけ
・１serviceに１機能

といったような感じです。

実際にRailsで書かれているオープンソースを見てみるとわかり易いと思います。

こちらは分散SNS Mastodonのservicesディレクトリです。こちらから一部抜粋します。
https://github.com/mastodon/mastodon/tree/main/app/services

```ruby:block_service.rb
class BlockService < BaseService
  include Payloadable

  def call(account, target_account)
    return if account.id == target_account.id

    UnfollowService.new.call(account, target_account) if account.following?(target_account)
    UnfollowService.new.call(target_account, account) if target_account.following?(account)
    RejectFollowService.new.call(target_account, account) if target_account.requested?(account)

    block = account.block!(target_account)

    BlockWorker.perform_async(account.id, target_account.id)
    create_notification(block) if !target_account.local? && target_account.activitypub?
    block
  end

  private

  def create_notification(block)
    ActivityPub::DeliveryWorker.perform_async(build_json(block), block.account_id, block.target_account.inbox_url)
  end

  def build_json(block)
    Oj.dump(serialize_payload(block, ActivityPub::BlockSerializer))
  end
end
```


Mastodonはこのように基本、Serviceのpublicメソッドにはcallメソッド１つしか書いていないです。（他は全てprivate)


# 結局、Serviceに書くと何が嬉しい？

結局、Serviceに書くメリットは何かというと以下かなと思いました。

・コントローラー、モデルの可読性が上がる
・単一責任の原則に従って書くことで運用がしやすくなる。
・外部APIを利用するコードの置き場に迷わなくなる
cscの作法 その150

# 概要
cscの作法、調べてみた。
opencvやってみた。
Filter2Dでシャープネス、やってみた。

# 写真


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9af75bfe-3fa6-cdd2-0d97-a2f3e947d020.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "シャープネス";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			float[,] kernel = {{ 0, -1, 0}, { -1, 5, -1}, { 0, -1, 0 }, };
			Cv2.Filter2D(src, dst, MatType.CV_8U, InputArray.Create(kernel), new OpenCvSharp.Point(-1, -1), 0, BorderTypes.Default);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}



```
以上。
cscの作法 その149

# 概要
cscの作法、調べてみた。
opencvやってみた。
Filter2Dでぼかし、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/a180903c-2ed2-9fb4-b86b-749e09c7b022.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "ぼかし";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			double[,] kernel = { {0.1111, 0.1111, 0.1111}, {0.1111, 0.1112, 0.1111}, {0.1111, 0.1111, 0.1111}, };
			Cv2.Filter2D(src, dst, MatType.CV_8U, InputArray.Create(kernel), new OpenCvSharp.Point(-1, -1), 0, BorderTypes.Default);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}



```


以上。
terminalでローカルブランチを作成する

## 1.terminalを開く
<img width="718" alt="スクリーンショット 2022-04-25 8 49 16" src="https://user-images.githubusercontent.com/79749395/165002044-5c9870de-d8e3-45ef-8a9b-0bc6b77a0d43.png">

## ２.ローカルブランチとしてkituneを作成する

>~~~
>git branch kitune
>~~~
> このやり方だとただ作成されるだけ
> ~~~
> git branch -a
> ~~~
> で見ればわかるがmainブランチから移動していない
<img width="384" alt="スクリーンショット 2022-04-25 8 53 54" src="https://user-images.githubusercontent.com/79749395/165002047-117c5a0f-dab6-4813-b08e-b5c1774b3e79.png">

## 3. ローカルブランチとしてookamiを作成する
> ~~~
> git checkout -b ookami
> ~~~
> こっちの方法だと作成したブランチに移動するところまで含まれる
> ~~~
> git branch -a
> ~~~
> で確認すると作業ブランチがookamiに移動していることがわかる
<img width="384" alt="スクリーンショット 2022-04-25 8 56 29" src="https://user-images.githubusercontent.com/79749395/165002049-b4c8e861-b02b-48b4-8997-1a0b11c1317e.png">
cscの作法 その148

# 概要
cscの作法、調べてみた。
opencvやってみた。
WarpAffineで回転、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/1f634a0d-abf6-0587-eb5b-7f0cbc844979.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "回転";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			double v = 0.5;
			Point2f[] srcm = new Point2f[3];
			srcm[0] = new Point2f(0, 0);
			srcm[1] = new Point2f(0, 1);
			srcm[2] = new Point2f(1, 0);
			Point2f[] dstm = new Point2f[3];
			dstm[0] = new Point2f(0, 0);
			dstm[1] = new Point2f((float) Math.Sin(v), (float) Math.Cos(v));
			dstm[2] = new Point2f((float) Math.Cos(v), (float) -Math.Sin(v));
			Mat m = Cv2.GetAffineTransform(srcm, dstm);
			Cv2.WarpAffine(src, dst, m, src.Size(), 0, 0, 0);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}



```


以上。
cscの作法 その147

# 概要
cscの作法、調べてみた。
opencvやってみた。
WarpAffineで縮小、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3c012b33-368f-5c84-c19b-e8b611c1d437.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "縮小";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			float v = -0.1f;
			Point2f[] srcm = new Point2f[3];
			srcm[0] = new Point2f(0, 0);
			srcm[1] = new Point2f(0, 1);
			srcm[2] = new Point2f(1, 0);
			Point2f[] dstm = new Point2f[3];
			dstm[0] = new Point2f(0, 0);
			dstm[1] = new Point2f(0, v + 1);
			dstm[2] = new Point2f(v + 1, 0);
			Mat m = Cv2.GetAffineTransform(srcm, dstm);
			Cv2.WarpAffine(src, dst, m, src.Size(), 0, 0, 0);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}



```

以上。
cscの作法 その146

# 概要
cscの作法、調べてみた。
opencvやってみた。
WarpAffineで拡大、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b3b78571-dbce-79c9-c5d3-a489c1066967.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "拡大";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			float v = 0.1f;
			Point2f[] srcm = new Point2f[3];
			srcm[0] = new Point2f(0, 0);
			srcm[1] = new Point2f(0, 1);
			srcm[2] = new Point2f(1, 0);
			Point2f[] dstm = new Point2f[3];
			dstm[0] = new Point2f(0, 0);
			dstm[1] = new Point2f(0, v + 1);
			dstm[2] = new Point2f(v + 1, 0);
			Mat m = Cv2.GetAffineTransform(srcm, dstm);
			Cv2.WarpAffine(src, dst, m, src.Size(), 0, 0, 0);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}




```


以上。
GitHubでリモートブランチを作成する

## 1.GitHubのリポジトリを開く
~~~
git ls-remote
~~~
で現在あるリモートリポジトリの確認
> <img width="1440" alt="スクリーンショット 2022-04-25 8 38 20" src="https://user-images.githubusercontent.com/79749395/165001480-b6b92058-e1a7-4194-878c-92527c55eddd.png">

## 2.リモートリポジトリにsameという名前でリモートブランチを追加する

`Find or create a branch...`

の欄にsameと打ち込み

`Create branch: same from 'main'`を押下 
> <img width="1440" alt="スクリーンショット 2022-04-25 8 38 41" src="https://user-images.githubusercontent.com/79749395/165001486-65423e7b-0a76-4f75-a30a-bf2964014edc.png">

## GitHub上でリモートブランチsameが作成できたので確認

> <img width="1440" alt="スクリーンショット 2022-04-25 8 38 46" src="https://user-images.githubusercontent.com/79749395/165001488-70b48d73-c23f-4375-84d8-45a09c2fa711.png">



### ちゃんとterminalでも認識できている


> <img width="1440" alt="スクリーンショット 2022-04-25 8 38 53" src="https://user-images.githubusercontent.com/79749395/165001489-536bf651-b667-47e9-8808-cef11b4a5e2c.png">
cscの作法 その145

# 概要
cscの作法、調べてみた。
opencvやってみた。
WarpAffineで上下移動、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/880b2e90-d663-19ad-d595-7cd0766dcea4.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "平行移動 上下";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			int v = 100;
			Point2f[] srcm = new Point2f[3];
			srcm[0] = new Point2f(0, 0);
			srcm[1] = new Point2f(0, 1);
			srcm[2] = new Point2f(1, 0);
			Point2f[] dstm = new Point2f[3];
			dstm[0] = new Point2f(0, v);
			dstm[1] = new Point2f(0, v + 1);
			dstm[2] = new Point2f(1, v);
			Mat m = Cv2.GetAffineTransform(srcm, dstm);
			Cv2.WarpAffine(src, dst, m, src.Size(), 0, 0, 0);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}

```


以上。
新卒1年目がスクラムマスターを経験して良かったこと


こんにちは。Web系のベンチャーで新卒1年目~2年目にかけて3ヶ月ほど、スクラムマスター(本開発部は小規模のため、スクラムイベントは一部のみ行っています)を担当していたエンジニアです。
所属している会社は、新卒でも様々な領域に挑戦できるような環境であるので、以前からスクラムマスターを担当しています。
また本記事は前提として、スクラム開発について知識が殆どないような人にも分かるような内容を書いています。
それでは、本文に入ります。

## 見出し

今回、エンジニア兼スクラムマスターを4ヶ月担当し、経験して良かったことを2つ挙げます。それは以下2つです。

* 自分の振る舞いを見直す習慣
* 開発しているサービス全体としての視点を持つ習慣

これは今振り返ると、個人ではどうしても修正することが難しい部分であったと強く感じたため、ここに書くことにより、上記2つを意識するきっかけとなったり、新たにスクラムマスターをしようと考えている方の後押しになればと思っております。
それでは以下、各内容の詳細を見ていきます。

## 詳細

#### 自分の振る舞いを見直す習慣
まず、スクラムマスター含めファシリテーターは本来、会議を円滑に進める役割である必要があります。なので、その司会者に問題があると出席者は不要なことに気を取られてしまうため、その議題上の目的を短時間で達成することができません。
ですが私の場合、業務上の他のタスクで問題があった場合、その内容を引きずるなどして、スクラムマスターとしての役割を果たすことに支障が出ていました。つまり、スクラムマスター時に自信がないことが行動にまで滲み出ているようで、それについて指摘を受けることがありました。なので、「自分が役割を果たすこと」にのみ意識を集中させ、不要なことに気をとられないために、「自身から出てくる不安」や「議題にとって不要な意見を拾わない」といった気を取られないための習慣が必要でした。スクラムマスターを行うことにより、そういった習慣付けがより身につくと思います。

#### 開発しているサービス全体としての視点を持つ習慣
新人は学ぶべきことが多く、キャパが溢れる状態が続くことが多いと思います。ですが、これにかまけて視野を狭くしていると、チーム全体でどのような開発プロジェクトが進んでいるのか、事業部内で１つのサービスがどのような開発内容で進んでいるのかの視点が抜け落ちてしまいます。なので、自分が全体のどの部分の開発を担っているかの視点が抜け落ちると、自分で開発の仕様（文言や機能）を決めるときには正しく決められない、外部の人に機能を説明するときには伝えられないといった問題が生じてしまいます。
それがスクラムマスターを担当することによって、「ある話題が出たとき、詳しそうな方にお話していただこう」という意識を持って業務時間を過ごすようになるため、スクラムマスターを担当する前より、各人の開発内容を鮮明に記憶しようと意識を持った生活することができます。このような視点で生活しているとサービス全体としてのどの開発がどのように動いているかも自然と考えられることにも繋がるため、上記に挙げた問題も解消されます。
また、こういった思考や行動は「自分が相手方に貢献できる部分は何か」「相手方にお助けしていただけそうな部分は何か」なども習慣的に考えられるようになるため、今後も様々な場所で活きそうだと感じます。

## まとめ
ここまで読んでいただき、ありがとうございました。
上記2つはいずれも、所属している事業が求めるレベルには達していないので、内容は参考程度によろしくお願いいたします。
エンジニア兼スクラムマスターということもあり、エンジニアの役割・スクラムマスターの役割を一つの議題の中で使い分ける必要もあり、上手く行かずお助けいただいたことも多分にありますが、個人としては今後の社会人生活に活きる、良い経験となった感覚が強くあります。

これで以上となりますが、上記の部分で気になる点などがある方は、コメントいただけると助かりますのでよろしくお願いいたします！
cscの作法 その144

# 概要
cscの作法、調べてみた。
opencvやってみた。
WarpAffineで左右移動、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/18ea6125-31b7-6917-9a26-2d2eaaea6cec.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "平行移動 左右";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			int v = 100;
			Point2f[] srcm = new Point2f[3];
			srcm[0] = new Point2f(0, 0);
			srcm[1] = new Point2f(0, 1);
			srcm[2] = new Point2f(1, 0);
			Point2f[] dstm = new Point2f[3];
			dstm[0] = new Point2f(v, 0);
			dstm[1] = new Point2f(v, 1);
			dstm[2] = new Point2f(v + 1, 0);
			Mat m = Cv2.GetAffineTransform(srcm, dstm);
			Cv2.WarpAffine(src, dst, m, src.Size(), 0, 0, 0);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}





```


以上。
cscの作法 その143

# 概要
cscの作法、調べてみた。
opencvやってみた。
WarpAffineで斜め移動、やってみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/e4c0d2f2-e7f8-bee5-4b6d-51015fbaeedb.png)

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using OpenCvSharp;

namespace cv
{
	public class Form1 : Form {
		public Button button1;
		public Form1() {
			Text = "平行移動 斜め";
			button1 = new Button();
			button1.Location = new System.Drawing.Point(50, 50);
			button1.Size = new System.Drawing.Size(100, 30);
			button1.Text = "show";
			Controls.Add(button1);
			button1.Click += new EventHandler(button1_Click);
		}
		private void button1_Click(object sender, EventArgs e) {
			Mat src = new Mat("cv.png", ImreadModes.Color);
			Mat dst = new Mat();
			int v = 100;
			Point2f[] srcm = new Point2f[3];
			srcm[0] = new Point2f(0, 0);
			srcm[1] = new Point2f(0, 1);
			srcm[2] = new Point2f(1, 0);
			Point2f[] dstm = new Point2f[3];
			dstm[0] = new Point2f(v, v);
			dstm[1] = new Point2f(v, v + 1);
			dstm[2] = new Point2f(v + 1, v);
			Mat m = Cv2.GetAffineTransform(srcm, dstm);
			Cv2.WarpAffine(src, dst, m, src.Size(), 0, 0, 0);
			Cv2.ImShow("src", src);
			Cv2.ImShow("dst", dst);
		}
		[STAThread]
		static void Main() {
			Application.Run(new Form1());
		}
	}
}



```


以上。
Qtでデバッグ出力をする

# Qtデバッグ出力

- qDebug()
- qInfo()
- qWarning()
- qCritical()

※ログの重要度 qDebug() < qInfo() < qWarning() < qCritical()
## 使用例
```
#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << "Debug Message";
    qInfo() << "Info Massage";
    qWarning() << "qWarning Mwssage";
    qCritical() << "qCritical Message";

    return a.exec();
}
```
## QString文字列の引用符を消す
```
QString str = "hoge";
qDebug() << str;           // 「"hoge"」引用符付きで表示される
qDebug().noquote() << str; // 「hoge」引用符無しで表示される
qDebug << "hoge";          // 「hoge」引用符無しで表示される

```
## 関数名を表示する
```
Q_FUNC_INFO // 関数名表示マクロ
__LINE__  // 行表示マクロ
```
## クラス名を表示する
```
class MyLabel : public QLabel
～略～
qDebug() << MyLabel::staticMetaObject.className(); // 「MyLabel」と表示される
QLabel *label = new MyLabel;
qDebug() << label->metaObject()->className(); // 「MyLabel」と表示される
```
## 走り書きメモ
- デバッグレベルの区別方法
    - qInstallMessageHandler関数
    - qSetMessagePattern関数
    - QLoggingCategoryクラス
- リリースビルド時のログレベル設定(qmakeはあるっぽい、CMakeでもできる？)
[ARKit] 画像を認識してみる

# ARKitで画像を認識する

#### まず認識したい画像を用意する。
Assets.xcassetsの下にある+メニューからNew AR Resource Groupを選択し、AR Resourcesグループを作成する。
作成したら画像をドラッグアンドドロップでimportする。

![スクリーンショット 2022-04-25 7.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474285/aac732a5-c480-93a9-8503-ad64ae29d5cd.png)

画像でwarningが起きたら下記のルールに違反しているか疑ってみる。
注意 
* ARKitで使用する画像は縦横480ピクセル以上の解像度(ある一定程度の画質が必要）
* 均一の色でしか構成されていない画像は使えない（青一色とか）。ヒストグラムが広く分布している必要がある。（要はカラフルである必要がある）


#### 現実世界でのサイズを決定する
 画像のインスペクターから画像サイズを指定する。
![スクリーンショット 2022-04-25 7.07.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1474285/7cdb719a-40ce-bcbe-8e11-27b0c87266c5.png)


### ARSessionに画像を設定する方法(二つ存在する）

#### 1 ARWorldTrackingConfigurationに認識したい画像を設定する(画像トラッキング）
ARSessionのトラッキングを設定するARWorldTrackingConfigurationのプロパティには下記のものが存在する

https://developer.apple.com/documentation/arkit/arreferenceimage

 ```swift
var detectionImages: Set<ARReferenceImage> { get set }
 ```
名前の通り、重複を許さない画像を認識をセットできるプロパティなのでここにAR Resource Groupをセットする

```swift
let configuration = ARWorldTrackingConfiguration()
 configuration.detectionImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)!
 arView.session.run(configuration)
```

#### 2 ARImageTrackingConfigurationに認識したい画像を設定する(画像検出）

trackingImagesプロパティに設定する
```swift
var trackingImages: Set<ARReferenceImage> { get set }
```

```swift
let configuration = ARImageTrackingConfiguration()
configuration.trackingImages = ARReferenceImage.referenceImages(inGroupNamed: "AR Resources", bundle: nil)!
 arView.session.run(configuration)
```

画像が認識できるという点は同じですがパフォーマンスやどこまでトラッキングするかで異なる部分が多いそう。
```ARWorldTrackingConfiguration < ARImageTrackingConfiguration```

```理由```
ARWorldTrackingConfigurationは、現実世界の平面をトラッキングする設定であるため、現実世界の面の一部として設定した画像を認識する。（要は画像以外の面も検出する）
ARImageTrackingConfigurationは、画像のみのトラッキング設定であるため、2D画像だけをトラッキングする。他の面はトラッキングしない

#### ARアンカーの追加時に必要な処理を書く
ARSessionDelegateの下記メソッドがARアンカーが追加されたときに呼ばれるので、ここの中で必要な処理を加える。
 ```func session(_ session: ARSession, didAdd anchors: [ARAnchor])```

```swift
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
        for anchor in anchors {
            // 「ARImageAnchor」だけ取り出す
            guard let imageAnchor = anchor as? ARImageAnchor else {
                continue
            }
            
            // nameでImageAnchorの名前を取り出し、どの画像が検出されたかを調べる。
            guard let name = imageAnchor.name else {
                continue
            }
          if (name == 〇〇){
           //検出された名前が指定のものだったら。。
　　　　　　　　　　　　　　　　　　　　// ここに指定したARコンテンツを画像の上に出現させる処理を書く
}
 
        }
    }
```

### まとめ　ARKitの画像を認識する流れ。

ARKitは認識した場所にARImageAnchorを配置することで実現している。
アンカーが追加された際にARResourceに追加した画像のどれが認識されたかを判断し、処理を実行する

```ARImageAnchorとは```
ARImageAnchorはARAnchorのサブクラス。アンカーが追
加、更新、削除されるたびにARSCNViewDelegateやARSessionDelegateのメソッドが呼ばれるので、
そこでARImageAnchorに変換して適切なプロパティを使用できる


https://developer.apple.com/documentation/arkit/arimageanchor
流れ
0 画像検出か画像トラッキングをするための画像を設定する(ARWorldTrackingConfigurationかARImageTrackingConfiguration）
1 ARSessionが開始される
2 カメラのライブ映像内の画像を認識する
3 ARKitがARImageAnchorを追加する
4 認識された画像がどれか調べる
5 必要な処理をおこうなう。
AWS AmplifyでGoogle Domainsの独自ドメインホスティング環境を構築してみた

![img](https://day-journal.com/memo/images/logo/aws/amplify.png)

### AWS AmplifyでGoogle Domainsの独自ドメインホスティング環境を構築してみました :tada:  

<br>

今回は、[Google Domains](https://domains.google.com)で取得した「.dev」ドメインをAWS Amplifyで利用する方法をためしてみました。

<br>
<br>

事前準備

- Amplifyで静的サイトホスティング環境構築
 
https://qiita.com/dayjournal/items/57cb0a8232d11c6c99af

<br>

## Amplify Consoleで独自ドメイン設定

はじめに、Amplify Consoleで独自ドメイン設定をする方法です。

Google Domainsで取得した「.dev」ドメインを「ドメイン管理」で設定します。
![img](https://day-journal.com/memo/images/try-087_01.png)

リダイレクトとSPAのルーティング対応を設定します。
![img](https://day-journal.com/memo/images/try-087_02.png)

「ドメイン管理」 → 「アクション」 → 「DNSレコードの表示」をクリック。CNAMEの情報をメモします。
![img](https://day-journal.com/memo/images/try-087_03.png)

Amplifyの設定はこれで完了です！

<br>

## Google Domainsで独自ドメイン設定

最後に、Google Domainsで独自ドメイン設定をする方法です。

[Google Domains](https://domains.google.com)にアクセス → 対象のドメインの「管理」をクリック。
![img](https://day-journal.com/memo/images/try-087_04.png)

対象ドメインの管理画面で「DNS」をクリック。
![img](https://day-journal.com/memo/images/try-087_05.png)

Amplifyで取得したCNAMEの情報を入力 → 「保存」をクリック。設定後「ウェブサイト」をクリック。
![img](https://day-journal.com/memo/images/try-087_06.png)

転送元に「@」、転送先に「.dev」ドメインを入力 → オプションを設定 → 「転送」をクリック。
![img](https://day-journal.com/memo/images/try-087_07.png)

正常に設定されるとWebSiteのプレビューが表示されます。
![img](https://day-journal.com/memo/images/try-087_08.png)

設定した「.dev」にアクセスするとWebSiteが表示されます。
![img](https://day-journal.com/memo/images/try-087_09.png)

最後に、[PageSpeed Insights](https://pagespeed.web.dev)で移行前の環境と移行後のAmplify(CloudFront & S3)でWebSiteのパフォーマンスを測定してみました。パフォーマンスがかなりよくなりました！
![img](https://day-journal.com/memo/images/try-087_10.png)

<br>

AWS Amplifyについて、他にも記事を書いています。よろしければぜひ :bow:
<a href="https://day-journal.com/memo/tags/AWS-Amplify" target="_blank">tags - AWS Amplify</a>

やってみたシリーズ :grinning:
<a href="https://day-journal.com/memo/tags/Try" target="_blank">tags - Try</a>

https://qiita.com/dayjournal/items/57cb0a8232d11c6c99af

https://qiita.com/dayjournal/items/c6e4ca20887a093560a0

<br>
<br>

<a href="https://dayjournal.booth.pm" target="_blank"><img src="https://day-journal.com/memo/images/etc/book.png" alt="book"></a>
Databricksジョブでマトリクスビューとジョブの修復がサポートされました

Databricksジョブでジョブに含まれるタスクの処理時間・ステータスを俯瞰できるマトリクスビューと、失敗したタスクのみを再実行できる修復(リペア)機能がサポートされました。間も無く日本リージョンでも利用できるようになります。

# マトリクスビュー

これまでは一覧でしかジョブの実行結果を確認することができませんでしたが、対象のジョブ詳細画面の右上に表示されるトグルスイッチで**マトリックス**を選択することで、マトリクスビューに切り替えることができます。
![Screen Shot 2022-04-25 at 7.28.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4447f5fd-75c5-1e96-2011-f5800510e181.png)
ジョブ全体の所要時間、タスクごとのステータスをマトリクス上で確認することができます。
![Screen Shot 2022-04-25 at 7.29.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/11d4cd51-c0ec-995c-da8d-f7a1d88d9e91.png)

- **Job Runs**の行の棒グラフはジョブの実行時間に応じた長さで表示されます。
- セルの色はジョブ、タスクのステータスに対応します。成功は緑、失敗は赤、スキップされたタスクはピンクになります。
- それぞれのセルの上にマウスカーソルを移動すると、詳細を確認することができます。
![Screen Shot 2022-04-25 at 7.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/dca0e633-9676-8b99-63db-2b037edd576d.png)
![Screen Shot 2022-04-25 at 7.32.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/8ce082ac-004b-9a8e-e648-6d1bc307658c.png)

# ジョブのリペア

Databricksジョブはマルチタスクジョブであり、複数のタスクからジョブを構成することができます。ただ、これまでは、途中のタスクで処理が失敗しても、そこから再開することができませんでした。このリペア機能を活用することで、失敗したタスクからジョブを再開することができます。

1. まず、意図的にタスクでエラーが起きるようにしてみます。
![Screen Shot 2022-04-25 at 7.49.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/a0df8e72-48ca-d615-2588-67822a420801.png)

    こちらの`filter-baby-names`タスクのノートブックの最後の行の`display`を`display1`に変更します。これでジョブを実行すると、2つ目のタスクがエラーとなります。
![Screen Shot 2022-04-25 at 7.45.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/59cb9b9e-4fb0-2c1c-e220-7d12ce6259fa.png)

1. 失敗したジョブの詳細画面に移動すると右上に**修復ジョブの実行**ボタンが表示されます。
![Screen Shot 2022-04-25 at 7.45.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/71ffe56b-e31e-d029-217a-e2d121cc7c11.png)

    このボタンを押すと失敗したタスクから処理を再試行します。このボタンを押す前に上で明示的に混入させていたエラーを直します。

1. **修復ジョブの実行**ボタンを押すと、パラメーターを指定するためのダイアログが表示されます。ジョブのパラメーターを変更する場合にはここで指定します。
![Screen Shot 2022-04-25 at 7.46.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/3882a686-f816-829e-772f-63b0d11e1631.png)

1. **修復ジョブの実行**ボタンを押すと、失敗したタスクから処理が再開します。
![Screen Shot 2022-04-25 at 7.46.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6f031e75-77af-ae41-0032-f8c24c203cc0.png)

この機能を活用することで、大規模なジョブが失敗した場合でも全ての処理をやり直す必要がなくなります。

# Databricksジョブのマニュアル

Databricksジョブのマニュアルはこちらを参照ください。

https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a

本記事で紹介した新機能の説明はこちらとなります。

- [ジョブ実行の参照](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a#%E3%82%B8%E3%83%A7%E3%83%96%E5%AE%9F%E8%A1%8C%E3%81%AE%E5%8F%82%E7%85%A7)
- [成功しなかったジョブ実行のリペア](https://qiita.com/taka_yayoi/items/b3275a1983c51a8bbe1a#%E6%88%90%E5%8A%9F%E3%81%97%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%B8%E3%83%A7%E3%83%96%E5%AE%9F%E8%A1%8C%E3%81%AE%E3%83%AA%E3%83%9A%E3%82%A2)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
100日後くらいに個人開発するぞ！day007

## 今日はお問い合わせフォームを作ってみた！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/381df7d2-e2e3-9da1-fc62-df18bb383847.png)


### 入力欄を作る要素
- input要素：入力された１行のテキストを受け取る要素
- textarea要素：入力された複数行のテキスト入力を受け取る要素

### 送信ボタンの作り方
- 送信ボタンはinput要素を用いて作る
    - type属性を指定して入力する内容の種類を選べる
        - submitを指定すると送信ボタンになる（テキストはデフォルトで「送信」になる）
            - 例：`<input type="submit">`
        - value属性を指定して表示されるテキストを変更できる
            - 例：`<input type="submit" value="送信">`

### 複数のセレクタに同じCSSを指定する方法
- 複数のセレクタに同じCSSを指定するには複数のセレクタをコンマ(,)で区切ることで同じCSSを適用できる
    - 例：`input,testarea{border:3px solid #ff0000}`






## HTML&CSS初級編を修了！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/72a9bb0d-6d84-5b4b-eab6-70cebaedbd2f.png)