OmniAICreator/Qiita-1.07M huggingface dataset:
インフラ作業をユーザにやってもらう為にAnsible Tower でやったこと

# はじめに
度々行っている作業を、依頼元に直接やってもらってハッピーになれないか
AWX(AnsibleTower)ならGUIもあるし良いかも
そう思って取り組んだときのメモから引用しました

# 課題
1. ユーザに必要なデータを入力してもらう必要がある(インベントリの編集は不可)
2. とにかく簡単な手順にする

# 対応策
1. AWXの`SURVEY`機能に頼りました
2. Ansibleの`delegate_to`を利用しました

## 1. AWXのSURVEY機能について

AWXではジョブテンプレートに対して、SURVEYという機能が利用できます。
SURVEYを使うと、ジョブ実行時にプロンプトを表示して`extra_vars`の値の入力を求めることができます。
入力値は選択形式にしたり、デフォルト値を決めたり、コメントを付けたりできて、利用者のフォローをすることができます。

例えば、作業対象のサーバを選択させるために以下のようなSURVEYを設定します。
![スクリーンショット 2020-12-06 21.13.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122764/39d1ff82-a85a-813e-e7c2-00d83a22cd10.png)

そうすると、ジョブの実行時に以下のようにプロンプトが表示され、入力値の選択が求められます。
![スクリーンショット 2020-12-06 21.48.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122764/5707063c-2bee-13fb-7bff-115ad4e29313.png)

なお'選択肢'の形式以外にも、テキストであったりチェックボックスだったりも利用できます。
詳しくは以下の公式ドキュメントがわかりやすいです。
https://docs.ansible.com/ansible-tower/3.4.3/html_ja/userguide/job_templates.html#surveys

## 2. `delegate_to`と組み合わせる

作業に利用するパラメータはSURVEYで集めることに成功したけれども、作業対象のサーバを柔軟に変更することが難しい。
実行時にインベントリを選択してもらえれば良いんだけどもインベントリの整備や権限管理が大変。
そんなわけで、SURVEYとAnsibleの`delegate_to`と組み合わせて利用しました。

先程の例からだと、SURVEYで取得した作業対象サーバの値(target_server)を、以下のようにAnsible playbook側で`delegate_to`として指定するだけです。

```yaml
---
- name: Demo
  hosts: localhost
  tasks:
  - name: Create config file to work directory
    template:
      src: ./templates/ifcfg-eth0.jinja2
      dest: /tmp
      owner: root
      group: root
      mode: 0644
    delegate_to: "{{ target_server }}"
```

こうすることでお手軽に、ユーザ側で作業対象サーバを切り替えることができます。
SURVEYの機能で選択肢を限定することができるので、作業対象外のサーバにアクセスされることを防ぐこともできます。

# おわりに
短いですが以上です。
アドベントカレンダー参加登録したものの、書こうと思っていたネタはすでに記事があったので慌てて別のネタを書きました :sweat:
Fitbitについてわかったこと


#はじめに
恥ずかしながら初めてQiitaに投稿します。皆さんの貴重な時間をありがとうございます。

社内では、Wellnessアンバサダー(通称ウェルピー)という健康についての情報を共有したり、
MTGやイベントを行う組織の一員だったりします。
Wellnessアンバサダーの活動は健康経営の一環だったりするのですが、
個人的にはただ興味があったから参加してみただけで、私自身は健康的とは言い難いです。

さて、そんな私が先日、スマートウォッチを購入したのでFitbitなるものに初めて触れました。
そこでやったことやわかったことなどを紹介していきたいなと思います。

#Fitbitとは
健康づくりとフィットネス関連商品の開発に情熱を注ぎたいと思っていたEricとJamesが2007年に立ち上げた企業です。
主な商品はスマートウォッチ。あとスマートウォッチとデータをやりとりするためのAPIも開発しています。
スマートウォッチで取得したデータを「Fitbit」という社名を冠したスマホアプリと連携させ、
ユーザーの健康状態を把握する仕組みを作り上げました。
今日では、FitbitAPIを利用し、たくさんの健康系アプリが出ています。

#やったこと
当初、FlutterとFitbitAPI連携を目指していました。
が、特に有用な記事が見当たらず、以下の2つを手探り状態でやりました。

1. Flutterで元々作っていたアプリをスマートウォッチで起動させてみた
1. FlutterでFitKitというライブラリがあったので使ってみた



#わかったこと
##タップとスワイプくらいで済ませられるものじゃないとUI/UX的に厳しそう

|ログイン画面|テキスト入力時|
|:---:|:---:|
|![スクリーンショット 2020-12-05 18.16.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652455/e64bc662-cd37-0e78-fbc9-4d3ce362db41.png)|![スクリーンショット 2020-12-05 18.16.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652455/ba6035bb-8d99-46c2-68c6-3fa2285bcecc.png)|

ちなみに元々のスマホ画面はこちら↓
![スクリーンショット 2020-12-05 18.15.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652455/d5cbc0bd-ad0b-8565-35fa-bff4720ef446.png)
スマートウォッチ用のアプリを作る際は注意が必要ですね。
特にテキスト入力は正常に入力すらできないので、ユーザーの操作としては、タップとスワイプで済ませられるものじゃないと厳しそうだと思いました。


##FitKitのサンプルがよく分からない画面だった

![スクリーンショット 2020-12-05 18.11.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652455/403a8e5f-9d75-a48e-5785-4b70826edc47.png)
「Read」でデータを読み込みそうなのは何となく分かるのですが、「Revoke permissions」はちょっと何言ってるか分かんなかったです。多分、スマートウォッチと連動するときの許可だと思うのですが、何もしてないのにRevokeの意味が分からなかったです。RequestとかRegisterとかならまだ分かるのですが。。。
FitKitのリファレンスをみても私にはさっぱりでした。。。
https://pub.dev/packages/fit_kit

#試してみたいこと
- 今回購入したCharge3というスマートウォッチではwifi対応してないのでシミュレータでの確認だったのですが、ものによってはwifi経由でインストールできるっぽいので新しめのスマートウォッチを購入して試してみたいです。
- FitKitはGoogleFITと連動するっぽいので、FlutterとFitbitを連携させる場合、以下の2つの方法かなと思ってますが、まだ試せてないです。
       1. FitKitを使ってGoogleFITと連携させ、GoogleFITとFitbitを連携させる(連携方法不明)
       2. FlutterのAPI周りの実装とFitbitのAPIを調査して連携(下記の参考記事の合わせ技)
           - 参考記事
               - https://qiita.com/makopo/items/32f41128c2e055cec68f
               - https://dev.classmethod.jp/articles/flutter_api_call_1/

#おわりに
まだまだ触りはじめなので、大した情報は共有できませんでしたが、さらに調査を進めて当初の目的を果たしたいと思います。また、2019年にGoogleがFitbitを買収したっぽいので、GoogleFITとFitbitが統合されるか、FlutterでFitbit連携のライブラリが出るのを密かに待ってます。

余談ですが、Fitbit Studioという開発環境も見つけました。
javascriptベースでシミュレータも使えて、スマートウォッチアプリの開発ができそうだったので興味ある方はご覧ください。

https://dev.fitbit.com/getting-started/

参考記事
https://www.jonki.net/entry/2018/07/19/001525
ActiveJobと周辺知識についてまとめてみた

# はじめに

ActiveJobを使う上での前提知識や周辺知識を深めようと思いまとめてみました。
用語の定義、メリデメ比較、スタイルガイドなどを中心に書いています。
具体的な実装方法は書いていません。

# ActiveJobとは？
Active Jobは、ジョブを宣言し、それによってバックエンドでさまざまな方法によるキュー操作を実行するためのフレームワークです。
Rails4.2から導入されました。

cf. [Active Job の基礎 \- Railsガイド](https://railsguides.jp/active_job_basics.html#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)


## 用語の整理

| 用語 | 説明 |
| ---- | ---- |
| ジョブ | 端末ごとに見た一連の処理<br>例：定期的なクリーンアップ、請求書発行やメール配信 |
|キュー|先に入れたものを先に出すというルールのデータ構造の１つ<br>先入先出（FIFO）と書かれることもある|
| エンキュー | キューに要素を追加すること |
| デキュー | キューから要素を取り出すこと |
| キューイング | キューを用いて要素の管理を行うこと |
| キューイングシステム（ライブラリ) | キューを持っているシステム|
|メッセージ| キューに流れるデータの1単位|
| メッセージキューイング | 異なるソフトウェア間でデータを送受信する手法の一つ<br>直接データを渡すのではなく一旦第三者のソフトウェアに預けることで、送信側も受信側も好きなタイミングで送受信処理をおこなうことができるようにする方式 |

参考

* [【一通りわかる】Linuxでのジョブの基本的な扱い方まとめ](https://eng-entrance.com/linux-job#i)
* [キュー \(queue\)とは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word14716.html)
* [キュー（待ち行列）とは \- IT用語辞典 e\-Words](http://e-words.jp/w/%E3%82%AD%E3%83%A5%E3%83%BC.html)
* [メッセージキューイング（MQ）とは \- IT用語辞典 e\-Words](http://e-words.jp/w/%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%AD%E3%83%A5%E3%83%BC%E3%82%A4%E3%83%B3%E3%82%B0.html)
* [ストリーム処理を支えるキューイングシステムの選び方](https://www.slideshare.net/laclefyoshi/ss-67658888)


## キューイングライブラリ(一例）

* delayed_job
* sidekiq
* Resque

## ActiveJobを使う/使わない場合のメリデメ比較

| | ActiveJobあり | ActiveJobなし |
| ---- | ---- | ---- |
|メリット | キューイングライブラリへの依存が減る<br>- ライブラリ固有のコードを書かずに済む<br>- ライブラリ変更時にビジネスロジックの書き換えが不要 | ライブラリ固有の機能を使える(ものもある) |
|デメリット| ライブラリ固有の機能が使えない | ライブラリ変更時にコードの修正範囲が広い |

参考

* [【Rails, Linux】『Active Job』と『ジョブ』についてまとめてみた](https://qiita.com/yokoto/items/e7d0e5a7f9ad152293a1)
* [【Rails】SidekiqをActiveJob経由で使うのが良いか、直接使うのが良いのか。 \- とーますメモ](http://thoames.hatenadiary.jp/entry/2018/03/22/131701)

## リリースノート
* [Ruby on Rails 4\.2 リリースノート \- Railsガイド](https://railsguides.jp/4_2_release_notes.html#active-job)
* [Ruby on Rails 5\.0 リリースノート \- Railsガイド](https://railsguides.jp/5_0_release_notes.html#active-job)
* [Ruby on Rails 5\.1 リリースノート \- Railsガイド](https://railsguides.jp/5_1_release_notes.html#active-job)
* [Ruby on Rails 5\.2 リリースノート \- Railsガイド](https://railsguides.jp/5_2_release_notes.html#active-job)
* [Ruby on Rails 6\.0 リリースノート \- Railsガイド](https://railsguides.jp/6_0_release_notes.html#active-job)


## スタイルガイド

[Rails: Active Jobスタイルガイド（翻訳）｜TechRacho（テックラッチョ）〜エンジニアの「？」を「！」に〜｜BPS株式会社](https://techracho.bpsinc.jp/hachi8833/2020_09_30/96694)

※ 以下のリストは、実装・レビュー時にチェックしやすいように、スタイルガイドの項目を質問文に言い換えたものです

* 引数に(idではなく)ActiveRecordモデルを渡しているか？
* 引数を破壊的に変更していないか？ 処理待ちのジョブがキューに残っていないか？
* 引数は十分少ないか？
* タスクの緊急度に応じたキューを指定しているか？
 - 重い処理や緊急でない処理を、緊急性の高いキューに入れていないか？
 - 優先度の高いキューを通常(の優先度)のキューに入れていないか？
* 冪等性は保証されているか？ あるいは許容できる理由はあるか？
* デプロイ中にジョブが実行されても問題ないか？
* 原子性は保証(成功 or 何もしないように実装)されているか？
* ジョブ中で(利用厳禁である)スレッドを使っていないか？
* ジョブのリトライメカニズムを(隠蔽・切り出しせず)ジョブ中に書いているか？
* バッチ処理にリトライは付いているか？
* トランザクションのコミットが完了したジョブのみキューに入れているか？
* ビジネスロジックをジョブ中に書いていないか？
IHE Delftの水文学系のQGIS上級者向けチュートリアル日本語版公開しました

## OpenCourseWareのサイトについて

世界的に水関係で権威のあるオランダのIHEデルフトでGISを教えている[Hans](https://twitter.com/hansakwast)さんが中心となって、FOSS4Gのフリーのオンライン教材のポータルサイトとして[OpenCourseWare](https://courses.gisopencourseware.org)を今年10月頃からローンチされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/3f7c3f0f-62ee-ff1b-2b9a-68c4b2b9f56a.png)


## 日本語化のきっかけ

このサイトにある水資源、水文学系の素晴らしいGIS教材をぜひ日本語にしたいとHansさんに連絡し10月中旬頃から少しずつ[QGIS Advanced Tutorial](https://courses.gisopencourseware.org/course/view.php?id=10)の10個の教材の翻訳に着手し、12月7日より日本語版の[QGIS上級者向けチュートリアル](https://courses.gisopencourseware.org/course/view.php?id=19)を正式にサイトで公開しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/858331/5448911c-95b7-b67e-65c3-56f0758f4211.png)


水関係でGISをお使いいただいている方、これから使っていきたいと考えていらっしゃる方のお役に立てればと思っています。

今後も当サイトの他の英語教材も翻訳していきたいと思っています。

## 実行環境について

QGIS3.16のMac版を使って翻訳していましたが、一部動かない時がありました。QGIS3.10 LTRをお使いになることをお勧めいたします。QGISは[こちら](https://qgis.org/en/site/)からダウンロードしていただけます。

## お願い

水文学系の英語を訳すのに結構大変でした。その際はQGISのSAGAツールの翻訳などが大変参考になり、できるだけQGISと整合が取れるように翻訳しましたが、一部正しくない翻訳もあるかもしれません。訳文の訂正などは随時行っていきたいと思いますので、何かありましたら、[五十嵐](https://twitter.com/j_igarashi)までご連絡いただければ助かります。

## QGISのサポートについて

このOpenCourseWareは基本的にサポートや研修などはなく、ご自身のペースで完結して学習できることを念頭に作成されています。日本語でのQGISのサポートや、講習会などをご希望の際は、別途MIERUNE Incまでご連絡いただければと思います。
Confluenceを使いこなそう！便利な機能5選

# この記事について

この記事は、[aslead Agile](https://aslead.nri.co.jp/solution/aslead_agile.html)の開発チーム「[オキザリス](https://speakerdeck.com/viva_tweet_x/huesudeyong-qi-wode-taxin-gui-timugashi-yan-wozao-rifan-sitejin-nizhi-rumadefalsewu-yu)」にて行っているアウトプット企画である「[チーム「オキザリス」Advent Calendar](https://qiita.com/advent-calendar/2020/oxalis)」の7日目の記事です。

# Confluenceとは？

[Confluence](https://www.atlassian.com/ja/software/confluence)は、アトラシアン社による企業向け**wikiツール**です。
私達asleadチームではほとんどすべてのドキュメントをConfluenceで管理しており、使わない日はないくらいお世話になっています。

wikiツールなので、もちろん

- オンラインでの共同編集が可能※
- 履歴を残せる（任意の時点に巻き戻し可能）
- Markdown対応

などの便利機能も持ち合わせていますが、この記事ではConfluence独自の機能に焦点を当てています。

※オンラインでのドキュメント管理に慣れてしまうと、共同編集ができない＆版管理に気を使うオフラインでのドキュメント管理にはもう戻れません…

# 便利な機能5選

ここから、私の選ぶConfluenceのいけてる機能を5つ紹介します。

## 1.テンプレート

議事録などある程度フォーマットが決まっているドキュメントは、テンプレートを用いると簡単に作成できます。テンプレートの種類は多数用意されていますし、自分で登録することもできます。

下の図は、議事録テンプレートの一例です。たったワンクリックでここまで完成します！
![議事録テンプレート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559424/0bf94e25-9e03-e157-63d4-667fd93dca6f.png)


## 2. 豊富なマクロ

カレンダーやコードブロック等の挿入、表のフィルタリング表示、表のグラフへの変換などなど、ありとあらゆる機能が揃っています（「便利なConfluenceマクロ紹介」だけで後日記事にしようと思います）。
豊富なマクロのおかげで、Confluenceでは非常に自由度の高い表現が可能です。

例えば、コードブロックはこのように表示されます。下書きモードではただの文字ですが、閲覧モードでは文字色が変わって可読性高く表示されていますね。
![コードブロック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559424/ecdebbf6-06d5-2ff3-c6f7-7f029fae428e.png)




## 3.権限制御が簡単

Confluenceではページごとに権限設定を変更することができます。私達は、一部のメンバー間だけで共有したい情報も、権限設定を適切に行ったうえでConfluence上に記録しています。

例えば私達が普段利用しているConfluenceでは、基本的に部のメンバー全員が閲覧できる状態でページが作成されるように運用しています。しかし「会計を担当しているメンバーだけで法人クレジットカードの情報を共有したい」「マーケティングチーム内だけでGoogleアカウントのログイン情報を共有したい」といった場面で、権限制御機能が活躍します。
設定は簡単で、下記の権限設定画面でデフォルト（全員）を「アクセス不可」にした上で、共有したいメンバーやグループを追加するだけです（表示のみor表示・編集可能のいずれかを選択できます）。
下の図では1人だけ、つまりこのページ作成者のみが、表示や編集を行うことができる設定になっています。

![権限制御.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559424/1f15e7a6-4480-474e-1c8b-6bfd8d7d0687.png)

※こちらは有料プランの機能です。


## 4.メンション機能

"@"に続けてユーザー名をタイプすることで、メンションを行えます。メンションされたメンバーは、メールやConfluenceの通知欄から通知内容を確認できます（通知設定は変更可能）。

例えば、会議の準備の際、Confluence上のアジェンダに出席者をメンションしておけば、自分から連絡することなく出席者へアジェンダ内容を通知することができます。

## 5.他のアトラシアン製品との連携

他の有名なアトラシアン製品に、Jira Software（通称Jira）という課題管理ツールがあります。ConfluenceとJiraを連携させて使うことで、Confluenceに書かれた文章をそのままJiraチケットとして起票することができます。Confluence上だけでチケット起票が完結するのがミソで、逐一ページ切り替え（Confluence→Jira）を行う必要がないのはとてもストレスフリーです。逆に、このようにして起票されたJiraチケットには、起票元のConfluenceページURLがリンクされます。

例えば下の図のように、Confluenceでとった議事録に今後のタスクリストが記載されている場合、それらを1つ1つJira画面で打ち込むことなく簡単にチケット化できます。

![jira直接起票.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559424/bb886c18-4ef6-e2e5-a895-368d0b33ba5f.png)



# 最後に

Confluenceには、上記以外にも多くの便利機能が備わっています。
10ユーザまでのフリープランもありますので、気になる方は気軽にお試し利用することもできます。
便利機能を活用することによる地道な時間短縮の積み重ねで、生産性向上を目指しましょう！
1分で学ぶAjax入門

Ajaxってなんですか？という質問に口頭で答えられるようになればいいなーと思い改めてJSONについて超初歩的な解説の記事を作成しました。

## 前提知識:同期通信とは？
画像の遷移がある通信。
ブラウザで画面が白くなって、画面を切り替わるのは同期通信だから。
専門用語で書くとブラウザがあのページ見たい！とリクエストをサーバーに送ります。
その後サーバーがレスポンス(応答)しデータと渡します。
この間はユーザーは真っ白な画面を見る事しかできず、ページによっては退屈させてしまいます。
![スクリーンショット 2020-12-04 8.57.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/aa338b42-f6e8-c72b-e4b9-22896bc6e841.png)


## 前提知識:非同期通信とは？
画像の遷移がない通信。
ブラウザで画面が白くならないで画面一部が切り替わる通信。
Twitterのいいね!とか非同期通信にあたる。
専門用語で書くとプラウザから一部の情報をリクエストするので、他の部分のデータが変わらない。
そのため真っ白な画面にならず、ページの更新が早くなります。


## Ajaxとは？
Asynchronous JavaScript  XMLの略。
Asynchronous は非同期の略。
XMLとはざっくり説明すると文書やデータの意味や構造を記述方法の１つ。HTMLに似てる。これらをまとめると

**JavaScriptの非同期通信を使って、XML形式のデータをWebサーバから貰う。そのため待ち時間が少なくて済む！**

という事になります。
![スクリーンショット 2020-12-04 8.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840696/2d9f8f26-79bd-2bbd-e498-9b82f34e91ab.png)

## 使用例
一番わかりやすいのは[googleマップ](http://maps.google.co.jp/)でしょう。

続きまして、アルサーガパートナーズ Advent Calendar 2020 8日目の記事は @ryuji-odaさんのDB知識です:tada:
第6回(変数とメソッド)

![Mac OS X-10.15.7](<https://img.shields.io/badge/MacOSX-10.15.7-brightgreen>) ![ruby-2.7.1p83](<https://img.shields.io/badge/ruby-2.7.1p83-brightgreen>) 

# variable

## お題

受け取った引数ARGVをnameという変数(variable)に代入してそれを打ち出すcodeを書け．

    > ruby name_variable.rb Rudy
    Rudy

## 簡単な解説

rubyの変数は型宣言の必要性がない.イコールで代入.

```ruby
name = 'Rudy'
```

## 詳しい解法

とりあえずRubyを出力する.name\_variable.rbに以下のように書く.

```ruby
p "Rudy"
```

結果

    > ruby name_variable.rb Rudy
    "Rudy"

nameに代入してRudyと打ち出すように変更

```ruby
name = "Ruby"
p name
```

結果

    > ruby name_variable.rb Rudy
    "Rudy"

ARGVを受け取って，自分の名前を返すように変更

```ruby
name = ARGV[0]
p name
```

結果

    > ruby name_variable.rb Rudy
    "Rudy"

# method

## お題

    > ruby hello_method.rb Rudy
    Hell Rudy.

と返すhello methodを作りなさい．

## 解説

methodは0個以上の引数(argument)を取ることができる.例えば次の通り.

```ruby
def hello(name)
  p name
end
```

## 解法

```ruby
def hello(name)
    puts "Hello #{name}."
end
name = ARGV[0]
hello(name)
```

結果

    > ruby hello_method.rb Rudy
    Hell Rudy.

<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" name="fn.1" class="footnum" href="#fnr.1">1</a></sup> <p>DEFINITION NOT FOUND.</p></div>


</div>
</div>

------
 - **source** ~/grad_members_20f/members/yoshida/c2_name_method_hello.org
RailsのSystem Specで利用するChromeをバージョン管理する方法

## はじめに

RailsのSystem Specではデフォルトではローカル環境にインストール済みのChromeが利用されます。
その場合、設定不要でChromeを使ったテストを簡単に実行出来るというメリットがあるのですが、複数人での開発やCIといった各環境間でのバージョン不一致が発生しやすいというデメリットがあります。
バージョン不一致が発生すると、特定環境でだけ何故かテストが失敗するみたいな原因を特定しにくい問題が起こる可能性があります。
また、コードを何も変更していないのに、いつの間にかChromeのバージョンが上がっていてテストが壊れるみたいな問題が発生する可能性もあります。（そして忙しいタイミングに限ってそういった問題は起こりやすい気がします、、）

そこで今回はDockerを使わずにお手軽にSystem Specで利用するChromeのバージョンをコードで管理する方法を紹介します。

## 設定方法

puppeteerを依存パッケージに追加。

```
yarn add -D puppeteer
```

spec/rails_helper.rbに設定追加


```ruby:rails_helper.rb
RSpec.configure do
  # ...
  
  module_path = Rails.root.join('node_modules/puppeteer')
  chromium_revision = `node -e "process.stdout.write(require('#{module_path}/lib/cjs/puppeteer/revisions').PUPPETEER_REVISIONS.chromium)"`
  chromium_path = `node -e "process.stdout.write(require('puppeteer').createBrowserFetcher().revisionInfo('#{chromium_revision}').executablePath)"`
  chromium_major_version = Webdrivers::ChromeFinder.version.split('.').first
  Webdrivers::Chromedriver.required_version = Webdrivers::Network.get("https://chromedriver.storage.googleapis.com/LATEST_RELEASE_#{chromium_major_version}")
end

```

## 解説

上記の設定をすることで、System Specではpuppeteerに含まれるChromiumが使用されるようになります。
puppeteerではバージョン毎にインストールされるChromiumのバージョンが固定されています。
それによって、puppeteerのバージョンを更新しない限りChromiumのバージョンが変わるということも起こり得なくなります。

## gemの紹介

プロジェクト毎にこの設定を追加していくのは面倒ですし、puppeteerのAPI変更時の手間も増えるので以下のようなgemも用意してあります。
gemを利用する場合は、gemをインストールしてspec_helper.rbにrequireを1行足すだけで設定完了です。

https://github.com/SonicGarden/puppeteer_helper

良かったら使ってみてください。
Swftools(pdf2pwf)のMacへのインストール

# Swftoolsのインストール方法　for Mac

pdfをswfに変換する必要があったのでオープンソースの変換ツールを入れた時のメモ書きを投稿します。

## gitからソースを取得

https://github.com/matthiaskramm/swftools
から取得
<pre>
git clone git://github.com/matthiaskramm/swftools　swftools
</pre>

## 足りないライブラリをインストール

<pre>
brew install freetype
brew install giflib
</pre>

## ビルドとインストール
<pre>
./configure
make
make install
</pre>

## make時のエラーが出るので
<pre>
xpdf/GlobalParams.cc:925:12: error: ordered comparison between pointer and zero ('char *' and 'int')
    if(pos1>=0)
       ~~~~^ ~
xpdf/GlobalParams.cc:927:17: error: ordered comparison between pointer and zero ('char *' and 'int')
    else if(pos2>=0)
            ~~~~^ ~
2 errors generated.
</pre>

## ソースの修正

https://github.com/macports/macports-ports/commit/be0a05d923809a5bad3af8bef7eca051de7016a1

GlobalParams.ccのソースを!= NULLに修正

<pre>
make clean
make
make install
</pre>

## インストールできたか実際に変換してみる

pdfをswfに変換
<pre>
pdf2swf infile.pdf -o outfile.swf
</pre>

完了です。
第5回(入出力)

# puts hello\_world

## お題

    Hello world.

と打ち出すプログラムを作る.

## 解法

まずはシングルで囲って，

```ruby
puts 'hello world'
```

を試す．puts\_hello\_world.rbに書いて

    > ruby puts_hello_world.rb

結果

```ruby
hello world
```

## 類題

pとかprintとかも試す. 結果の違いはコメントに

```ruby
# print
print 'hello world'
#改行なしで出力

# p
p 'hello world'
#改行されるが出力結果が" "で囲まれる

# pp
pp 'hello world'
#pと同じ

# printf
printf 'hello world'
#printと同じ
```

# getsなんだけど，ARGVで行きます！

## お題

    > ruby hello_name.rb Rudy

と打ち込んだ時に，

    Hello Rudy.

と返ってくるcodeを書け．

## 簡単な解説

putsしたら普通はgetsだが，今回はARGVというのを使う.

```ruby
puts ARGV[0]
```

とhello\_name.rbに打ち込んで，

    > ruby hello_name.rb Rudy

結果

    > Ruby

次に"Hello Rudy"と打ち出させることを考える．

## 解法

hello\_name.rbに次のように書く

```ruby
puts "Hello #{ARGV[0]}"
```

同じように実行

    > ruby hello_name.rb Rudy

結果

    > Hello Ruby

他の方法も試す

```ruby
#
puts "Hello "+ARGV[0]
#

#
print "Hello #{ARGV[0]}\n"
#

#
print "Hello "+ARGV[0]+"\n"
#

###結果は全てHello Ruby
```

## 類題

次に"Hello Rudy."というのをどこかへ保存することを考える.

    ruby hello_name.rb bob > hello_name.txt

catで中身確認

    cat hello_name.txt

結果

    Hello bob

<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">

<div class="footdef"><sup><a id="fn.1" name="fn.1" class="footnum" href="#fnr.1">1</a></sup> <p>DEFINITION NOT FOUND.</p></div>


</div>
</div>

------
 - **source** ~/grad_members_20f/members/yoshida/c1_puts.org
Excel + VBA + バッチファイルでセットアップ作業の自動化をやってみる

# 概要
なんかのソフトをインストールする際に、手でやる作業を自動化し、時間短縮＆ミス防止を図ってみる。
Excelで設定値、実行日時等を管理。ボタンを押したら、VBA or バッチファイル実行など。

## IPアドレス取得
```vb
Sub IPアドレス取得_Click()
'
' IP アドレス取得
'   WMI を用いて IP アドレスを取得
'
    Dim NetAdapters, objNic, strIPAddress
    Set NetAdapters = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") _
                           .ExecQuery("Select * from Win32_NetworkAdapterConfiguration " & _
                           "Where (IPEnabled = TRUE)")
     'ネットワークアダプターが複数ある場合、複数IPが割り当てられている場合は最初のみ取得
    For Each objNic In NetAdapters
        For Each strIPAddress In objNic.IPAddress
            GetIPAddress = strIPAddress
            Range("B4").Value = GetIPAddress
            Exit Sub
        Next
    Next
End Sub
```

参考: http://mt-soft.sakura.ne.jp/kyozai/excel_vba/300_vba_kiso/70_getinfo/index.htm

## ホスト名取得

```vb
Sub ホスト名取得_Click()
    Dim WshNetworkObject As IWshRuntimeLibrary.WshNetwork
    Set WshNetworkObject = New IWshRuntimeLibrary.WshNetwork
      
    Range("B7").Value = WshNetworkObject.ComputerName
    
    Set WshNetworkObject = Nothing
   
End Sub
```
参考: https://www.moug.net/tech/exvba/0150087.html


## hostsファイルへの追記
```vb
Sub hostsファイル編集_Click()

    Dim ret As Long

    ' hostsファイルを退避してリネーム
    FileCopy "C:\Windows\System32\drivers\etc\hosts", "C:\Users\81806\Desktop\host_bak"
    ' 退避したファイルから編集用のファイルを作成
    FileCopy "C:\Users\81806\Desktop\host_bak", "C:\Users\81806\Desktop\host_edit"
    ' 編集用のファイルに、IPアドレスとホスト名の組み合わせを追記
    Open "C:\Users\81806\Desktop\host_edit" For Append As #1
        Print #1, Range("B4") & "             " & Range("B7")
    Close #1
    
    ' hostsファイルを置き換え
    If Dir("C:\Work\Test.txt") <> "" Then
        ret = MsgBox("同名のファイルが存在します。" & vbCrLf & _
                  "上書きしますか？", vbYesNo)
        If ret = vbNo Then Exit Sub
    End If
    FileCopy "C:\Tmp\Test.txt", "C:\Work\Test.txt"

End Sub
```


## UAC無効

``` deleteUac.bat
@echo off
  reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v "ConsentPromptBehaviorAdmin" /t REG_DWORD /d "0" /f
  reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v "PromptOnSecureDesktop" /t REG_DWORD /d "0" /f
  reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" /v "EnableLUA" /t REG_DWORD /d "1" /f
  pause
exit
```

参考: https://www.atmarkit.co.jp/ait/articles/1810/25/news017.html
【Javascript】Javascriptで読み上げ【そのままコピペOK】

#結論
```html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
  </head>
  <body>
        <div>
            <input id="text" type="text" max="255" value="こんにちわ" />
            <a onclick="speak()">CLICK ME</a>
        </div>
        <script>
            //text読み上げ
            let isSpeech = false;
            if ('speechSynthesis' in window) {
                isSpeech = true;
            } else {
                alert("このブラウザは音声合成に対応していません。")
            }
            function speak(){
                if (isSpeech){
                    var speak   = new SpeechSynthesisUtterance();
                    speak.text  = document.getElementById('text').value;
                    speak.rate  = 1; // 読み上げ速度 0.1-10 初期値:1 (倍速なら2, 半分の倍速なら0.5, )
                    speak.pitch = 1; // 声の高さ 0-2 初期値:1
                    speak.lang  = 'ja-JP'; //(日本語:ja-JP, アメリカ英語:en-US, イギリス英語:en-GB, 中国語:zh-CN, 韓国語:ko-KR)
                    var voice = speechSynthesis.getVoices().find(function(voice){
                        return voice.name === 'Google 日本語';
                    });
                    // 取得できた場合のみ適用する
                    if(voice){
                        speak.voice = voice;
                    }
                    speechSynthesis.speak(speak);
                }
            }
        </script>
  </body>
</html>
```
LaravelでMailableクラスでメールを送信する方法

【メモです。】

#コントローラーの作成

```
php artisan make:controller SampleMailController
```
#ルーティングの追加
```
Route::get('/mail', 'SampleMailController@send');
```
#コントローラーに処理を追加
```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Mail\SendTestMail;

use Mail;

class MailSendController extends Controller
{
    public function send()
    {
        $to = [
        [
            'email' => 'XXXXX@XXXXX.jp',
            'name' => 'Test',
        ]
    ];

        Mail::to($to)->send(new SendTestMail());
    }
}
```


#Mailableクラスの作成
```
php artisan make:mail SendTestMail
```

#SendTestMail.phpの編集

```
public function build()
{
    return $this->view('emails.test')
                ->from('XXX@XXXX','Test')
                ->subject('This is a test mail');
}
```

#views/emailsの下にtest_text.blade.phpファイルを作成し、メール本文を記述
好きなように書けばOK


#【余談】複数人にメールを送信したい場合
コントローラーの処理を下記のように変える。

```
$to = User::all();

Mail::to($to)->send(new SendTestMail());
```

#【余談2】引数を渡す
コントローラーで下記のように引数に値を渡す。

```
$user = User::find(1);

Mail::to($user)->send(new SendTestMail($user));
```

あとはMailbleクラスの方で好きなように記述。

```
public function __construct($user)
    {
        $this->user = $user;
    }

    public function build()
    {
        return $this->text('emails.test_text')
                    ->from('XXX@XXXXX','Reffect')
                    ->subject('This is a test mail')
                    ->with(['user' => $this->user]);
    }
```
未経験脆弱性診断師が学ぶCSRF対策

こんにちはこんばんは、2回目の投稿となります、yukimalo9です。
前回の投稿から、反省点がいくつもあり、
その全てがうまくこの記事に活かせるようにと書き進めております。

さて、今回も” 未経験脆弱性診断師が学ぶCSRF対策”と題して、
学びはじめのCSRFとその対策について、新人脆弱性診断士目線からの記事を備忘録としてまとめさせていただきます。

今回取り扱う題材は
#CSRF(クロスサイト•リクエストフォージェリ)

こちらもまた、脆弱性の中では名の通った者だと思いますが、
そもそもどういったものなのか…
CSRFの概要について見ていきましょう。


![6B5C6941-BE38-4BD2-BB3A-F163781738C3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839926/9ee36130-47b5-4a35-833b-0ff4ed1029f1.png)


CSRF(クロスサイト•リクエストフォージェリ)は、
利用者がブラウザ上に仕込まれた悪意のある罠サイトにアクセスした段階で、
そのWebアプリケーションにおいて重要な処理が勝手に行われてしまう脆弱性です。

ここで言う”重要な処理”というのは、
Webアプリケーション内で自分のアカウント情報に直結するものであったりします。

例えば、プロフィール情報の変更や相手へのメッセージの送信、情報発信やクレカ決済などがこれに当たります。
超有名SNSでも、乗っ取られたアカウントが固定文とURLらしきものを含んだものをツ◯ートしてた、
なんてこともこれに該当しますね。。。

結構被害アカウントを周りでも見かけるということは、
それだけ被害数のある、開発サイドの人間であれば対策を取らねばならない脆弱性となっています。


今回はそのCSRFの対策を一緒に考えていきましょう！


ではそもそもなぜCSRFが起こってしまうのか…

順序としてはこう。

CSRFを起こすには、重要処理を行えるようログイン状態であることが必要になります。

そして攻撃者が用意した罠をサイトを閲覧したりURLをクリックすることで、
仕込まれたスクリプトによりログイン情報を使用されそのままリクエストが発行されてしまいます。
攻撃の対象となってしまったサーバは、
どの段階でどのページからリクエストが送信されたかを判別していない場合、
リクエストの区別がつかず、サーバはこのリクエストを通してしまいます。※
結果として、元のユーザにとって不本意な形でリクエストが送信されていますね。

今回はCSRF対策のための術のひとつをご紹介致します。



問題は※の部分で、攻撃対象となったサーバに、
どのページでのリクエストが発行されたかを示すことが出来れば良いわけです。
実際には攻撃者からは想像しにくい乱雑な文字列として**ワンタイムトークン(CSRFトークン)**を発行し、それを受けて照合させるのです。

もう少し詳しく言うと、
フォーム送信ページにてinputタグにhiddenで、発行されたCSRFトークンを埋め込み、フォーム送信すると値がパラメータとして引き継がれます。
このパラメータの値を先程発行したものと比較して、
一致するならリクエスト受理するとすれば、外部からのものは受け付けなくなりますね！


これ、簡単そうに思えて意外と対策されていないものをいくつも見たことがあります。
考えてみれば簡単なのになとも思うのですが、
学んでみないとこれは分からないものです…笑


要は、毎回ランダムにワンタイムトークンを発行してその照合を毎回行うことで、
言わば使い捨ての鍵を毎回渡してもらってはその鍵付きの扉を潜るようなイメージで、
リクエストを数珠繋ぎにすることによって攻撃者の付け入る隙を無くすのであります。

当然そのトークンを攻撃者は知り得ないため、トークン情報のない攻撃者によるリクエストは許可されず、
攻撃者の行いたかった正常なリクエスト発行はできません。

これにより、CSRFは対策されたと言えます。

![F75BDBD3-1907-4214-BA7C-D3FD1666111F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/839926/57a9f03b-a6d3-6179-924c-45836b917973.png)


他にも対策方法はいくつかあって、
重要処理を行う前にログインを求めたり、
最近よく見かけるパズルを完成させたりするものや、
ランダムな文字列をそのまま読み取って入力したりなどありますが、
どれも、前のリクエストから引き続き発行意思のある利用者が変わっていないですよ、という引き継ぎを行なっています。

こういった対策が取られていたんですね。



今回はCSRF対策について見てきました。
いかがだったでしょうか？
相変わらずの文章力の無さはさておき、2回目ともなると構成等も他のサイトを意識しながら書けたかなとは思います。
が、またご指導いただきたいので指摘箇所等あればどうぞよろしくお願いします。

それでは今回はこの辺で…
社長室に呼び出しを受けたことはありますまいか

[アドベントカレンダーではありますまいか Advent Calendar 2020](https://qiita.com/advent-calendar/2020/mba)、7日めの記事です。

良いおとなの皆様、良いおとななのにいわゆる職員室的なところへの呼び出しというものを食らったことはありますか。私はあります。会社でな。どこにでもルールというものは存在する。[コーディング規約](https://qiita.com/Nobu-NEWTON/items/63982bd3d15894c93dd5) もそうでしょう。規約は規約。守ることには意味がある。ただ「なぜ」守るのかを考えだすことで話が複雑になっていく。

## 出勤簿に押印をすることになった

ある時弊社で出勤簿に押印をするというルールができた。絶対だ。弊社はいわゆるIT屋さんだが、カードキーで入退勤も記録できているはずなのだが、関係ない。とにかく

**押印をしたものだけを出勤とみなす**

それがルールだ。

## 私の苗字は山田

改めて書くが私は「山田」さんで社内で通っている。山田さんなんて社内に何人いるかわからない。山田を名乗るすなわち anonymous と変わらないと思っていた。さてそんな折のこの押印ルール。私は「山田」のハンコなんて押して意味があるのでしょうか？

答え：ない

そう思った私はハンコではなく「山田」とサインすることにした。これで筆跡にて私を私本人として一意に保つことができる。「山田」のハンコなんて100均でも買えるのだ。ハンコを押していたら出勤証明にならないでしょう。

## 社長に呼ばれる

なんなら私むしろ偉くね？くらいの勢いで自信をもってサインをしていた私だったのですが、それがきっかけで社長室に呼ばれることになりました。曰く「押印をしたものだけを出勤とみなす」、すなわち私は出勤と認められないということらしい。どおいうことだ。納得がいかないのですぞ。しかしそういう問題ではないらしい。

**「押印をしたものだけを出勤とみなす」**

**それがルールだからだ** というのです。

## ハンコなら何でも良いんだな？

確たる意思をもってサインをしていたので私は憤慨しました。
だけではなく「ハンコなら何でも良いんだな？」という思想のもと規約そのものをテストすることにしました。

それがこいつ。笑点の山田君ハンコ～（ネコ型ロボット風）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/bafd9072-0f02-4012-2afa-1002868f5a3c.png)

押し続けました。まあこんなものを押してくるのは私だけでしょうから私の目的（山田なんてanonymous → 自己同一性を証明したい）も満たすことができこれはナイスアイディアだったと言えましょう。その後呼びだされたか。私はね、一生懸命、一生懸命押印しましたよ。そうですその後呼び出されることは無かったのです！
(その点ブレないのは良いところである)



## 結論
[**コーディングルールの準拠を徹底するだけで全体として信頼できるソフトウェアを作れるというわけではない**ことや適切なコーディングルールを選択することが信頼性の向上に寄与するようなルールを選択することによってメリットが得られる](https://blogs.itmedia.co.jp/morisaki/2013/05/post-3f00.html) とかいう報告があるようで、**規約自体もそれによりけり、見直しが必要**。[規約そのものに縛られて失敗する事例もある。](https://splus-software.co.jp/b0112/) つまりルールは理由を理解しておいたほうがいい。

ハンコを押させる理由は出勤記録をとるためではなく「ルールそれ自体を守ることを意識させるため」だった。まあもともと出退勤はカードキーで記録されているのだから。
**ルールを守ることは大事だ。しかしルールを守ることが「なぜ」大事なのかがわからないで守るルールは無意味だ。**

コードを書く時には「なぜこれはこう書かないといけないのか」を考えながらコーディング規約と向き合ってみるのも良いのかもしれません。その時は意志を強くもって。社長室に呼ばれてもくじけない心をもって向き合うくらいでいいとおもいます。

以上です～
フォロー機能について【初学者・Rails】

#フォロー機能とは
まずはじめに、フォロー機能とはなんなのか？
Twitterをしているとよく分かると思うのですが、
フォローしたり、フォローされたり、そういった機能のことです。

具体的にどういった仕組みで成り立っているのか？
一つずつ紐解いていきます。

まず、登場人物として、
・フォローする側のユーザー
・フォローされる側のユーザー
がいます。

つまり、ユーザー同士の多対多の関係であると言えます。

そして、多対多ということは、
中間テーブルが必要になってきます。

しかし、ここで問題が発生してきます。

例えば、いいね機能を実装するときをイメージしてほしいのですが、
いいね機能で必要なモデルは
・userモデル
・postモデル
・likeモデル（中間テーブル）
この３つが必要になってくるわけです。
[![Image from Gyazo](https://i.gyazo.com/7b23a5ff81e1c4f882f1da219b711a59.png)](https://gyazo.com/7b23a5ff81e1c4f882f1da219b711a59)

ただ今回のフォロー機能の場合、
中間テーブルをRelationshipモデルとした時、
・Usersモデル
・Relationshipモデル(中間テーブル)
この２つしか存在しません。
つまり、User→Relationship→Userという流れでデータを引っ張ってきます。
[![Image from Gyazo](https://i.gyazo.com/0e40ec64811ecfe285abef6592406977.png)](https://gyazo.com/0e40ec64811ecfe285abef6592406977)

そうすると、Userモデルの中に
・フォローする側
・フォローされる側
っていうのがごっちゃになってしまうので、
うまくそれらを分けてあげる必要があります。

#DB設計
##UserとUserの多対多の関係
仮にUserモデルの中を
・フォローする側　　→　Followingモデル
・フォローされる側　→　Followerモデル
とします。

[![Image from Gyazo](https://i.gyazo.com/a7e95aac76d97ac8f38744d6f439c622.png)](https://gyazo.com/a7e95aac76d97ac8f38744d6f439c622)

で、中間テーブルを
Relationshipモデルとします。
・Followingモデルのid　→　following_id
・followerモデルのid　　→　follower_id

[![Image from Gyazo](https://i.gyazo.com/557ce2fe6adeaa06a5c5e800aa7017b1.png)](https://gyazo.com/557ce2fe6adeaa06a5c5e800aa7017b1)

##しくみ
ここまでをまとめると
FollowingとFollowerは同じUserモデルであり、
フォローするかされるかで呼び方が変わるようなイメージです。

例えば、
Twitterで、
自分のフォローを見る時、自分のid(following_id)とペアのfollower_idを引っ張ってくることで見ることができる
[![Image from Gyazo](https://i.gyazo.com/5a1429331f65236076e0adcea6da184f.png)](https://gyazo.com/5a1429331f65236076e0adcea6da184f)

自分のフォロワーを見る時、自分のid(follower_id)とペアのfollowing_idを引っ張ってくることで見ることができる
[![Image from Gyazo](https://i.gyazo.com/19d7fce2c38ca184eff3db1628156210.png)](https://gyazo.com/19d7fce2c38ca184eff3db1628156210)

つまり、上記の例より
自分のidが
・following_idであれば、フォローを見ることができる
・follower_idであれば、フォロワーを見ることができる
というわけです。

今回はいったんここまで。
具体的な実装については後日あげます。
Ubuntu18.04でのメモリサイズ(スワップサイズ)の増やし方

# はじめに
スワップサイズの拡張には**再起動は不要です**。一時的にいつもよりメモリが必要になった場合などにオススメです。OSを再起動するとスワップ設定が消えますが、設定を永続化することも可能です。しかし、**設定の永続化の説明はこの記事ではしません**
※スワップはメモリが満タンになった際に使用する領域です。高速なメモリーではなく低速なハードディスクを使用するので処理が遅くなります。

# 手順
以下の４コマンドで拡張可能です。

```sh
sudo fallocate -l 10G /swapfile2
sudo chmod 600 /swapfile2
sudo mkswap /swapfile2
sudo swapon /swapfile2
```

# 説明付き手順
**詳細な説明が必要な場合**は以下を参考にしてください。

スワップ先となる空のファイルを作成します。

```sh
$ sudo fallocate -l 10G /swapfile2
```

パーミッション（アクセス権限制御）を変更し、rootユーザのも読み書き可能にします
swapfile2の項目が表示され、「-rw-------」になっているはずです。

```sh
$ sudo chmod 600 /swapfile2
$ ls -l /swapfile*
-rw------- 1 root root  2147483648 12月 12  2019 /swapfile
-rw------- 1 root root 10737418240 12月  7 06:09 /swapfile2
```

スワップファイルとして登録
「ラベルはありません」といった表示は無視して大丈夫です。

```sh
$ sudo mkswap /swapfile2
mkswap: /swapfile2: 警告: 古い swap 署名を消去しています。←これが出ない場合もあり
スワップ空間バージョン 1 を設定します。サイズ = 10 GiB (10737418240 バイト)
ラベルはありません, UUID=223464a4-99a0-2b77-9876-fc2c46ff123a
```

スワップファイルを有効にします

```sh
$ sudo swapon /swapfile2
```


スワップが使用可能であることを確認します

```sh
$ sudo swapon --show
/swapfile  file   2G 928.1M   -2
/swapfile2 file  10G     0B   -3
```
【Ruby on Rails】gem(Kaminari)を使ってページネーション機能を追加する方法

#目的
ポートフォリオ制作にあたり、少しでも機能数を増やしたく、今回はユーザー一覧に対し、ページネーション機能を追加しました。
ページネーションとは、件数を指定して、１ページに全て表示するのではなく、複数のページに表示するものです。これがないと、１ページに大量のデータが表示されてしまいます。
gemを使うことで、簡単に実装することができました。

#手順
Gemfileの一番下に、下記を追記します。

```ruby:Gemfile
gem 'kaminari'
```
ターミナルにて、下記実行します。

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

下記、`.page`移行を追記します。
５件ずつ表示したい場合は、`.per(5)`とします。


```:users_controller.rb
@users  = User.where.not(name: "ゲストプレイヤー").where.not(id: current_user.id).page(params[:page]).per(5)
```

`.each`文の後に、`<%= paginate @users %>`を追記します。

```/users/index.html.erb
<% @users.each do |user| %>
  <%= link_to user.name, user_path(id: user.id) %><br>
<% end %>
<%= paginate @users %>
```
#Railsサーバーを再起動する
多分、再起動しないとうまく表示されないと思います。私の場合は、サーバー再起動だけでは表示せず、ブラウザのキャッシュも一度削除したら、表示しました。

こんな感じです。
![スクリーンショット 2020-12-07 5.53.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693502/555b03ac-4b11-c089-5949-2627badc7c8d.png)

#参考にしたページ
https://qiita.com/residenti/items/1ae1e5ceb59c0729c0b9
動画編集の仕事が増えてきたことから、撮りためた動画の内容を簡単に把握したくて、いくつかのシーンをピックアップした画像を簡単に生成できないか考えてみた

# はじめに

趣味が高じて動画撮影や編集のお仕事が増えくる中、30万円近く出して4Kカメラを購入して色々と撮影をする日々が続いている今日この頃。
撮影した動画が増えすぎて困っていたことから、タイトルにある通り動画を一つ一つ見なくてもサムネイルで内容を把握できる画像が欲しくなり、そんな画像を生成するスクリプトを作ってみたのでメモしておきます。

# 実行環境

- Python 3.x
- OpenCV

# 事前準備

以下のようなフォルダ構成にします。

```
┬ make_img.py
├ mp4
│ ├ 動画1.mp4
│ └ 動画2.mp4
└ img
```

mp4というフォルダの中に動画データを入れ、imgという空のフォルダを作成します。

# スクリプトを作成

```py:make_img.py
from glob import glob
import cv2
import os
import random

def make_thumb(filename):
    
    # 対象ファイルの取得
    cap = cv2.VideoCapture(filename)
    
    # 総フレーム数の取得
    frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    
    # サムネイルの行列数
    row = 4
    col = 4
    num = row * col
    
    cnt = 0
    
    for r in range(row):
    
        for c in range(col):
            
            # フレーム番号の取得
            if cnt == 0:
                j = int(0.5 * frames / num)
            else:
                j = int(frames / num) * (cnt)
            
            # フレームの移動とキャプチャ
            cap.set(cv2.CAP_PROP_POS_FRAMES, j) 
            ret, frame = cap.read()
            
            # 画像リサイズ
            h = int(frame.shape[1] / col)
            w = int(frame.shape[0] / col)
            frame = cv2.resize(frame, (h, w))
            
            # 取得したフレームを横に結合
            if c == 0:
            	im = frame
            else:
                im = cv2.hconcat([im, frame])

            cnt += 1
        
        # 横に結合した画像を縦に結合
        if r == 0:
            img = im
        else:
            img = cv2.vconcat([img, im])
	
    cap.release()
    
    return img

def main(bgn=0):
    
    # ファイル一覧の取得
    files = glob("./mp4/*.mp4")
    files.sort()
    print("ファイル数 :", len(files))
    
    i = bgn
    
    for filename in files[bgn:]:

        print("\r{:05} {}".format(i, filename), end="")
        img = make_thumb(filename)

        # 画像の保存
        f = "./img/" + filename.split("/")[-1].replace("mp4", "jpg")
        cv2.imwrite(f, img)

        i += 1
    
    print()
    
if __name__ == "__main__":
    main()
```

# スクリプトを実行

以下のコマンドで実行します。

```sh:
$ python make_img.py
```

実行すると以下のような画像がimgフォルダに保存されます。
![20200212_鹿島町PR動画_中画質.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114240/8abac1b4-604a-5854-02ec-666ceca13f15.jpeg)
できた！
Docker をつかって RAR 形式のファイルを展開（解凍）する

　Windows 10 で [ubuntu Docker image][1] と [unrar][2] をつかって RAR 形式のファイルを展開する手順です。ホスト OS の Windows 10 には RAR 展開ソフトウェアをインストールせずに、Docker コンテナで展開処理します。

　RAR 形式に圧縮されたファイルを展開するためには WinRAR や 7-Zip のような RAR 圧縮ファイルを扱えるソフトウェアが当然必要になりますが、Docker を利用することによって、ホスト OS ではなくコンテナに展開プログラムをインストールし、用が済めばコンテナごと破棄する、という使い方ができます。普段から RAR 形式をよく利用するのであればソフトウェアをインストールしておけばよいですが、稀に使用する程度という人にとって、ホスト OS に専用ソフトウェアをインストールせずに済みます。

### 1. ubuntu イメージを取得する

　ファイルの展開に使用する Linux コンテナイメージを [docker hub][1] から取得します。ここでは現時点の ubuntu:latest である [20.04 Focal Fossa][3] を使用します。

```shell-session:ubuntuイメージを取得する
> docker pull ubuntu

    Using default tag: latest
    latest: Pulling from library/ubuntu
    Digest: sha256:c95a8e48bf88e9849f3e0f723d9f49fa12c5a00cfc6e60d2bc99d87555295e4c
    Status: Image is up to date for ubuntu:latest
    docker.io/library/ubuntu:latest
```

### 2. ubuntu コンテナに unrar をインストールする

　初期イメージに unrar は含まれていないため、unrar をインストールしたコンテナを作成します。unrar のインストールには ubuntu のパッケージ管理ツール apt-get を利用します。

```shell-session:unrarをインストールする
> docker run -it ubuntu /bin/bash -c "apt-get update && apt-get -y install unrar && rm -rf /var/lib/apt/lists/*"

    ...
    Reading package lists... Done
    Reading package lists... Done
    Building dependency tree
    Reading state information... Done
    The following NEW packages will be installed:
      unrar
    0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
    ...
```

### 3. コンテナから新しいイメージを作成する

　ファイルを展開するときに使用する新しいイメージを作成します。イメージの名前は任意ですが、下記の例では `my/unrar` としています。まず、`docker ps` でコンテナ ID を確認して（下記の例では `9b720fae191a` ）、`docker commit` でイメージを作成し、イメージを作成した後は `docker rm` でコンテナを削除します。

```shell-session:新しいイメージを作成する
> docker ps -l

    CONTAINER ID        IMAGE               STATUS
    9b720fae191a        ubuntu              Exited (0) 3 minutes ago

> docker commit 9b720fae191a my/unrar
> docker rm 9b720fae191a
```

### 4. RAR 形式の圧縮ファイルを展開する

　ホスト OS のファイルシステムにある RAR 形式の圧縮ファイルを展開します。下記の例では「New Text Document.rar」から同じフォルダに「New Text Document.txt」を展開しています。 `docker run` は実行する度にコンテナを作成しますが `--rm` オプションを指定しておくと処理終了時にコンテナが自動で削除されるようになります。

```shell-session:RARアーカイブを展開する
> docker run -v ${PWD}:/tmp -w /tmp -i --rm my/unrar unrar e -r './New Text Document.rar'

UNRAR 5.61 beta 1 freeware      Copyright (c) 1993-2018 Alexander Roshal

Extracting from ./New Text Document.rar

Extracting  New Text Document.txt                                     OK 
All OK
```

　使用しなくなったときは、Docker コンテナとイメージを削除します。

　以上の手順のうち、新しいイメージを作成するまでの手順้は Dockerfile と `docker build` コマンドで代用することもできます。Dockerfile を下記のような内容で用意しておいて `docker build -t my/unrar .` を実行すると、my/unrar イメージからすぐに unrar を実行できる（上記 4 の手順）状態になります。この流れは unrar に限らず、Windows で Linux のプログラムを実行したい、という場面に応用できます。

```dockerfile:Dockerfile
FROM ubuntu:latest

# set a directory for the app
WORKDIR /tmp

# install unrar
RUN apt-get update && apt-get -y install unrar && rm -rf /var/lib/apt/lists/*
```

[1]: https://hub.docker.com/_/ubuntu
[2]: https://packages.ubuntu.com/search?keywords=unrar
[3]: https://releases.ubuntu.com/20.04/
Windows 10 Home で IIS の Windows 認証機能を有効化する

　Windows 10 Home で IIS の「Windows 認証」機能が必要となるとき、Home edition に含まれない機能であるらしく **Feature name IIS-WindowsAuthentication is unknown** というエラーになることがあります。この場合「Windows の機能の有効化または無効化」の画面で見ても「Windows 認証」機能が表示がされず有効化することもできません。しかし、%SystemRoot%\servicing\Packages に **Microsoft-Windows-IIS-WebServer-AddOn-2-Package~31bf3856ad364e35~amd64~~10.0.\<build\>.\<revision\>.mum** というファイルがあれば [DISM.exe (Deployment Image Servicing and Management)](https://docs.microsoft.com/windows-hardware/manufacture/desktop/add-or-remove-packages-offline-using-dism) でパッケージを追加して、「Windows 認証」を含む種々のセキュリティ機能を有効化できるようになります。.mum ファイルの名前は、システムのバージョンによって微妙に異なるようです。

```text:Error-0x800f080cの例
Feature name IIS-WindowsAuthentication is unknown.
A Windows feature name was not recognized.
Use the /Get-Features option to find the name of the feature in the image and try the command again.
```

　DISM.exe は管理者としてコマンドプロンプトから実行します。このときに /Add-Package オプションで .mum パッケージ ファイルのパスを指定します。

```shell-session:DISM.exe
dism /online /norestart /add-package:%SystemRoot%\servicing\Packages\Microsoft-Windows-IIS-WebServer-AddOn-2-Package~31bf3856ad364e35~amd64~~10.0.19041.546.mum
```

　パッケージを追加できたら「Windows の機能の有効化または無効化」の画面から Internet Information Services > World Wide Web Services > Security にある「Windows 認証」を有効化します。

パッケージ追加前 | パッケージ追加後
:-:|:-:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58/855af302-f4fe-0519-b5ae-8e43dbd05db6.png)  追加前は Windows 認証を有効化できない | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58/fac2b0dc-c739-62b7-812e-47f6c516993b.png) Windows 認証を含む機能が追加されている

**参考リンク**

- [stack overflow - Windows 10 Home: Windows authentication][1]
- [stack overflow - iis windows authentication is missing at windows 10 (ASP.NET Visual Studio 2015)][2]

[1]: https://stackoverflow.com/questions/38364218/windows-10-home-windows-authentication
[2]: https://stackoverflow.com/questions/38048420/iis-windows-authentication-is-missing-at-windows-10-asp-net-visual-studio-2015
(React)npm start起動時のCORS回避

# 前提
フロントエンド -  React.js
バックエンド - Go

# 問題
`npm start`でサーバを起動した際、React App内で外部APIをfetchすると、CORSエラーが発生する。

# すでに行った対処[(参考にした記事)](https://qiita.com/att55/items/2154a8aad8bf1409db2b)

- fetchの第二変数に`{mode: 'cors'}`を追加する。
- GoのResponse Headerに`w.Header().Set("Access-Control-Allow-Origin", "*")`を追加。

この二つの対処では、CORSエラーは解消されなかった。

# 解決法
[(ここに書いてあった。プロキシを挟むと良い。)](https://create-react-app.dev/docs/proxying-api-requests-in-development/)
 
ブラウザからのAPIの送り先が`localhost:4000`の場合は、React Appのpackage.jsonに、
`"proxy": "http://localhost:4000",`
と追加で記述すると良い。

fetchで`localhost:4000/api`にリクエストを投げたい時は、
`fetch("/api", {mode: 'cors'}).then....`
と書く。
【Vue CLI】Cannot read property 'hoge' of undefined への対応

# はじめに
`Cannot read property 'hoge' of undefined`
Vue.jsを用いた開発をしている人なら、誰もが一度は見たことのあるエラーです。

エラーの原因が多岐に渡り、Vueのフレームワークを使い慣れていない人にとっては原因の特定が難しいのではないかと感じています。筆者も最初は戸惑いました。

そこで、ある程度Vue.jsを書けるようになってきた自分なりに、このエラーと直面した際に考えるべき原因と、対処法をまとめてみました。


Vue.js(特にVue CLI)を用いた際に注目して書いています。

# Cannot read property 'hoge' of undefined とは
コード上ではエラーが出ないのに、いざ実行するとコンソールにこんなものがでて、うまく動かないことがあります。

```
Cannnot read property 'hoge' of undefined
```

日本語にすると、「undefinedのhogeというプロパティが読めないよ」という意味です。
筆者も最初勘違いしていたのですが、この場合`undefined`となっているのは`hoge`ではなく、**hogeの一つ前のオブジェクト**です。例えば、`piyo.hoge`というコードを書いていてこのエラーが出たなら、問題があるのは`hoge`ではなく`piyo`だということになります。

英語を勉強しないとダメですね。

# 原因


Vue CLIでこのエラーが出る場合、大抵は以下のどれかが原因だと思います。

#### `piyo`にデータが入っていない場合
`piyo`にデータが入っていない場合、当然`piyo.hoge`にもデータは存在せず、上記のエラーが生じます。

#####コンポーネント間で変数を共有しようとしている。
vuexやpropsなどを用いない場合は、コンポーネント間で変数は共有されません。
従って、あるvueファイルで作った変数を他のvueファイルで使おうとするとすると上記のエラーが出ます。

#####関数を実行する順番を間違えている。

>`piyo`に値を入力する関数は書いているものの、その関数を呼び出す前に使用してしまう場合です。
同一ファイルにすべて書いている場合はコードの実行順が分かりやすいですが、他のコンポーネントをimportして使用することが多いVue CLIでは分かりにくく、混乱しやすいのではないでしょうか。まずは、importされている順番を確認しましょう。

##### 非同期処理を考慮せずに書いている。

>**非同期処理**とは、プロジェクトがAPIなどにアクセスし、データを取ってくる間に、他の部分のコードが進んでしまうことです。上記の「**関数を実行する順番を間違えている。**」の仲間です。

#### `piyo.hoge`は存在するが、正しく呼び出せていない場合
ちゃんと値を代入することは出来ているのだから、正しく呼び出しましょう。ネットに転がっている普通のJavaScriptのサンプルコードをVue.jsっぽく書き直そうとしているうちに訳が分からなくなってしまい、このエラーとなる場合が多い気がします。

##### thisの挙動を考慮していない。

>`this`を用いてdataやcomputedの値を参照書いている場合に限りますが、これが原因で苦しめられる人は初学者の方に特に多そうです。
JavaScriptはthisの挙動がアロー関数の場合と通常関数の場合で異なるため、dataにアクセスしようと思って`this`を使ったのに思わぬ挙動をしていることがあります。
個人的には、アロー関数が使えるところではアロー関数を使うように心がけるとエラーが減ると思っています。

### スペルミス

>単純に変数のスペルを間違えてしまった場合もこのエラーが出ることがあります。
灯台下暗しとはこのことです。エラーの原因が分かった時には、嬉しさと悔しさが一緒にきて複雑です。


## 原因が似ているエラー
**①hoge is not a function**

```
hoge is not a function
````

`Cannot read property 'hoge' of undefined` は `hoge` がオブジェクトだった場合に起こるものですが、`hoge`が**関数**だった場合、上のようなエラーが出ます。
エラーへのアプローチ方法としては全く同じです。

**②Cannot read property hoge of null**

```
Cannot read property hoge of null
```

`piyo.hoge`が存在した時に、piyoが無い(null)場合、こうなります。
例えば、データが一つも入ってない場合などが挙げられます。
基本的なエラーへのアプローチは`Cannot read property 'hoge' of undefined`と一緒で大丈夫でしょう。

# 終わりに
Vue CLIに限らず、どんな言語やフレームワークでもエラーとの戦いは辛く厳しいものですが、エラーに当たったときに「新しい知見を得た！」と思ってポジティブに捉えて精進していきたいです。

# 参考文献

- [プログラミング初心者歓迎！「エラーが出ました。どうすればいいですか？」から卒業するための基本と極意（解説動画付き）](https://qiita.com/jnchito/items/056325421b7e36f02335)
- [JavaScriptでよく見るエラーとその対策](https://sbfl.net/blog/2019/02/01/javascript-error-messages/)
- [【JavaScript】アロー関数式を学ぶついでにthisも復習する話](https://qiita.com/mejileben/items/69e5facdb60781927929)
Excelでポケモン全国図鑑一覧表を作った

#はじめに
　どうも、ホウエン地方のポケモンリーグチャンピオン、ダイゴです......嘘です、ただのダイゴです。今回はタイトルの通り、Excelでポケモン全国図鑑一覧表を作りました。完全なる自己満足ですが、悪しからず。
#動機
　私はここ最近、ポケットモンスターにはまっている。このゲームには大まかに対戦、収集という二つの楽しみ方がある。私は収集をメインにプレイしている。この収集という要素にはとても大きな目標が存在する。それがポケモン全国図鑑完成である。私もそれを目標にしている。だが、これの厄介なのは過去のソフトに手を出さない限り達成は不可能だということだ。また、自分が何を登録していないのか、どのソフトで捕まえられるのか把握するのは非常に面倒だ。だから今回私は、なるだけ手間を省くべく、ポケモン全国図鑑一覧表を作成することにした。
#仕様について
　まず今回はポケモンHOMEというアプリの図鑑を前提に登録済みかどうかを考える。初めにポケモン898匹の名前を入力した。地方、伝説、幻などのといった項目を作る。また、今回は出現するソフト別だと作業量が恐ろしいことになるため、地方別に出現するポケモンという項目にした。作成した表をテーブル化した。これにより、〇のついたものだけを抽出できる。また、現在何匹登録されているかを表示するため、COUNTIF関数を用いた。
　そして出来上がったのがこちら。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/869421/e4937ec3-ea86-7c47-e282-f6829ce40433.png)

　間に合いませんでした、はい。今のところ、ポケモンが初めて登場した地方にしかチェックをつけてない。見やすいように色を付けてみたが、却って見づらい気がする......
#改善点・反省点
次は地方ではなく、どのソフトで出現するかを表示するようにしたい。
もう少し見やすい配色にしたい
#おわりに
十分に作った価値はありそうである。今年中には完成させたい。これを機にExcelを勉強し直そうと思う。
TypeScriptのアップデート中に EEXIST のエラーが表示されてちょっと詰まったことの解決手順

今回は今までなぜかグローバルのTSのアプデができずに無視してたところついに立ち向かった（面倒くさがり）
そのせいでバージョン 1.5.3 に甘んじていました。

```
npm i -g typescript@latest
```
で最新版のTypeScriptにアプデしようとしたら案の定エラーが表示。

```
npm ERR! code EEXIST
npm ERR! syscall symlink
npm ERR! path ../lib/node_modules/typescript/bin/tsc
npm ERR! dest /Users/myuser/.nodenv/versions/12.16.0/bin/tsc
npm ERR! errno -17
npm ERR! EEXIST: file already exists, symlink '../lib/node_modules/typescript/bin/tsc' -> '/Users/myuser/.nodenv/versions/12.16.0/bin/tsc'
npm ERR! File exists: /Users/myuser/.nodenv/versions/12.16.0/bin/tsc
npm ERR! Remove the existing file and try again, or run npm
npm ERR! with --force to overwrite files recklessly.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/myuser/.npm/_logs/2020-12-06T17_00_41_920Z-debug.log
```

nodenvを使っている人が遭遇したことあるかもしれないエラー。npm installなどでも遭遇する人がいるらしいが詳しくは見ていない。

## 再インストールであっさり解決？
結果としては

```
npm ERR! Remove the existing file and try again, or run npm
```
これの言う通りにして解決した。このエラーで言うところの existing file は

```
npm ERR! dest /Users/myuser/.nodenv/versions/12.16.0/bin/tsc
```
のことだから、直接 tsc に対して " rm -rf tsc " で削除した。
これでOK。なはず。

## typescriptアップデートの再チャレンジ

しかしここで再びアプデコマンドを打ったところなんとまた同じエラーが発生。
今度は、「tscフォルダ」ではなく「tsserverフォルダ」に対して怒られた。そのため tsc と同じように削除した。

## ３度目の正直でついに

その後、再び 

```
npm i -g typescript@latest
```
で無事に最新版にアプデできた。バージョンは 4.1.2。
1.5.3から4.1.2はなかなかの跳躍。


## npm ERR! syscall symlink ってなんだ
タイトルにもある通り、つまづいた理由はこのエラーがよくわからなくて放置。ちゃんと調べてなかったのでよくわからなかった笑
調べたところ symlink とはショートカットのディレクトリ名を意味しており、プログラミングとは関係なく日常でもショートカットのファイルなどを作成する機会があると思うがそれと同じものになるとの理解であってるかと。

つまりsymlinkによってAというショートカットのディレクトリ(中身は入っていない)を呼び出すことで、本体であるBを呼び出すことができるらしい。

今回のケースで言えば具体的には
Aがこれ（npm ERR! path ../lib/node_modules/typescript/bin/tsc）
Bがこれ(npm ERR! dest /Users/myuser/.nodenv/versions/12.16.0/bin/tsc)
に当たると思われる。というか path は文字通りの意味で、 dest が目的地であり本体のことを指しているはず。

そのため今回は本体のフォルダを削除することで再インストールできたということになります。
nodenvの場合は各nodeバージョン毎に入っているライブラリバージョンも異なるためショートカットという形で呼び出しているのかなと思います。


## 問題は解決できたけれど...
しかし結局のところなぜエラーが生じたのかわからかった。。
他のライブラリやモジュールでも同じエラー生じるはずなので。

```
npm i -g typescript@latest
```
バージョンが古すぎてそのまま上書きアプデできなかったとか？？
Laravelプロジェクト作成時に"Could not find package laravel/laravel with stability stable."と出る

# 筆者の環境
- macOS Catalina バージョン10.15.6
- PHP 7.4.13
- Composer 2.0.8

# 発生問題
久しぶりに新規Laravelプロジェクトをローカルに作成しようと思い、いつも通りターミナルから以下のコマンドを打つと…

```
$ composer create-project laravel/laravel laravel_sample --prefer-dist
```

以下のエラーが。

```
  [InvalidArgumentException]
  Could not find package laravel/laravel with stability stable.
```

仕方がないのでlaravel/installerを使おうと思い、以下のようにlaravel/installerをインストールするコマンドを打つと…

```
$ composer global require "laravel/installer"
```

以下のエラーが。

```
  [InvalidArgumentException]
  Could not find package laravel/installer.

  Did you mean one of these?
      laravel/installer
      codemyviews/vanilla-installer
```
# 解決策
結論、Composer自体を完全にアンインストールし、インストールし直したら無事エラーも起きずLaravelプロジェクトが作成でき、laravel/installerもインストールできました…（詳細な原因は分からず…）

アンインストール手順については以下の記事を参考させて頂きました。
（アンインストール時に必要となる.composerとcomposer.pharのパスはMacでは、「/Users/ユーザ名/.composer」、「/usr/local/bin/composer/composer.phar」となります。）

[[PHP]Composer自体を完全にアンインストールする方法 | akamist blog](https://akamist.com/blog/archives/287) 

問題の原因は特定できませんでしたが、ひとまずアンインストールすることで解決できました。
「Could not find package laravel/laravel with stability stable」に遭遇時の対処法はネット上ではあまり見つからなかったため、今回投稿致しました。
同じような問題に遭遇した方の参考になれば幸いです。
AR Quick Lookで気軽にAR！

#はじめに
この記事はLife is Tech！Members Advent Calendar 2020 の7日目の記事です！
Life is Tech！のメンバーなら誰でも参加できます！！12月7日現在、11枠余っています！！ぜひ！！

#AR Quick Lookって？
iOS12から導入された、ブラウザ上でARオブジェクトを配置することができる機能です！!
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/2b43faca-be62-413d-97b8-15456654e8d6.png"><img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/9a7f901f-de36-e766-f4b3-bd0fa691f7db.jpeg">
↑AR上のiPhone12miniとリアルのiPhone7を比べた様子
購入前にサイズ感をARで確かめることができる

https://developer.apple.com/jp/augmented-reality/quick-look/

#実際に作ってみよう
このAR Quick Look、とっても簡単に使うことができるんです！
usdzという形式の3Dデータをsafariで開くだけでできちゃいます！

↓実際に作ったもの
https://sugijotaro.github.io/MonolithAR/

↓参考にしたサイト
https://note.com/ynakajima/n/na66359bf9533

#まとめ
テスト前なので内容薄々でごめんなさい！！テスト終わったらしっかり書き直します🙇‍♂️🙇‍♂️