OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsでPython使うときのおすすめ

# Windowsで使いやすいPython環境の構築
結論から申し上げますと、Py Launcher+Pipenvが使いやすいです。
## Pythonのインストール
1. [Python公式](https://www.python.org/)からインストーラーをダウンロード
1. デフォルトのままインストール（Py Launcherあり、Pathは通さない）
1. コマンドプロンプトで"py"と入力して実行
![スクリーンショット 2021-05-23 122526.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617239/d85f42e7-0e70-2e44-4134-a267e3bac234.png)
1. Pythonが起動出来たらOK

## Pipenvをインストール
1. pipでインストールできますが、Py Launcherでpip使うときは下記のようになります。  
```
py -m pip install pipenv
```
1. インストール成功したらOK

## Pipenvの超基本的使い方
1. 新しいフォルダをつくる
1. エクスプローラーで開く
![スクリーンショット 2021-05-23 125116.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617239/4aec921e-f9ca-8ff0-afa9-8178911d2163.png)
1. アドレス欄に```cmd```と入力するとコマンドプロンプトが開きます
1. 開いたコマンドプロンプトで  
```py -m pipenv install <ここにインストールしたいパッケージ>```  
※<ここにインストールしたいパッケージ>のところは"numpy"とか"matplotlib"とかそういうことです。
1. 仮想環境が自動的に作成された後、パッケージのインストールが行われます。
1. 上記が終わったら、```py -m pipenv shell```を実行します。
1. 構築された仮想環境下に変化します。
詳しい使い方は公式で  
[Pipenv: 人間のためのPython開発ワークフロー](https://pipenv-ja.readthedocs.io/ja/translate-ja/)

## その他
* 仮想環境にパッケージをインストールするときは、一度仮想環境を出てから```pipenv install```で行いましょう。
* Pythonは複数のバージョンをインストールすることができます。
* 仮想環境を作るときにPythonのバージョンを指定するときは  
```py -m pipenv --python 3.8 install```  
※--python の後に数字で指定します。
【解決済み】ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)の解決方法

Mysqlで`mysql -u root`とすると、タイトル通り`ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`というエラーが発生した。

結論から言うと、mysqlのサーバーが停止しているだけ。

```
mysql.server status
```

とコマンドを入力して、`ERROR! MySQL is not running`と表示されたら、サーバーが起動していない。

```
mysql.server start 

//実行結果
Starting MySQL
. SUCCESS! 
```
上記コマンドでサーバーを起動させてから`mysql -u root`と実行すれば、無事ログインできるはず。
carrierwaveでS3にアップロードしたファイルをダウンロード

## コード
Companyモデルにsample_csvという名前のカラムがある想定。

ダウンロードされるファイル名がsample.csvになるように設定している。

```erb
<%= link_to 'サンプルCSVをダウンロード', @company.sample_csv.url(query: { 'response-content-disposition' => "attachment; filename=sample.csv" }).to_s %>
```

このリンクをクリックするとブラウザにファイルがダウンロードされる。

リクエストした先のアクションでsend_dataを使う実装だとメモリを使ってサーバーに負荷をかけてしまうが、このやり方はRailsアプリケーションにリクエストを送らないのでサーバに負荷をかけないのがメリット。

## 参考
- https://github.com/carrierwaveuploader/carrierwave/blob/v2.2.1/lib/carrierwave/uploader/versions.rb#L194
- [rails + carrierwave S3: force link_to to download - Stack Overflow](https://stackoverflow.com/questions/17631559/rails-carrierwave-s3-force-link-to-to-download)
- [Content-Disposition - HTTP | MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Disposition)
AWS lambdaについて調べてみた【初学者向け備忘録】

## はじめに

フロントエンドの学習にあたり最近AWS Amplifyを利用し始めました。おそらく昨今のフロントエンドエンジニアはAWSの各種サービスの理解も避けては通れないということでまずはAWS Lambdaについて調べてみました。（2021年5月現在）

## AWS Lambda

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

AWS Lambdaはサーバーレスでコードの実行環境を提供し、ソースコードをデプロイするだけでプログラムを実行してくれるサービスになります。プログラムとは別にトリガーをというイベントを用意し、イベントが呼ばれるたびにデプロイしたプログラムが実行されます。

例えば、API Gatewayへリクエストがあったときに送られた内容によって外部のDBサービスとやり取りをして結果を返すREST APIのような動きを行ったり、DynamoDBのテーブルが更新されたときに処理を行ったり、S3バケットに画像がアップロードされた時に画像を変化する処理を行ったりと他のAWSサービスと連携して利用することが主な使い方になります。
![スクリーンショット 2021-05-23 11.38.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268181/88e9f678-dba2-2817-0e3f-75b08508c7b6.png)
AWS Lambdaの動作の特長としては、普段は停止状態で待機、リクエストがあった際に起動して動作を開始します。このため停止状態からの起動が入る場合はレスポンスに若干の時間を要します。これをコールドスタートといいます。また起動後はしばらくの間は起動したまま待機状態となるためすぐに実行することができます。これをウォームスタートといいます。

利用料金についても実行数と実行処理時間に応じて課金されるため停止状態のときは料金がかからないのも大きな特徴です。

また、AWS Lambdaでは、主に下記言語に対応していてフロントエンドとはまた別の言語で記述することができます。
- Node.js
- Python
- Java
- Ruby
- Go
- .Net Core

負荷にあわせてスケーリングも自動的に行なってくれるため負荷の高いサービスにも柔軟に対応することが可能です。ただアカウントひとつの同時実行数が東京リージョンでの初期値が秒間1000となっており、複数のLambda関数を実行している場合はすべてをあわせて1000となるので注意が必要かもしれません。

シンプルな処理を行うためにわざわざサーバー環境を用意することなく手軽に構築できる、リクエスト量に応じてスケーリングを自動的に行なってくれるというところが最大の利点だと思います。

## AWS App Runnerとのすみわけ

https://aws.amazon.com/jp/blogs/news/introducing-aws-app-runner/

先日AWS App Runnerという新サービスの提供が発表されました。既存のコンテナもしくはGitHubのソースコードからデプロイすることができ、まだNode.jsとPythonのみのサポートながらドメインの紐付けなど行うことができより柔軟なバックエンドの構築を行うことができそうです。

詳細の理解がまだできていないのですが、Amplifyのバックエンド寄りのイメージとなるのでしょうか？？RubyなどもサポートされればRails環境をHerokuのように構築できる？？

サービスの進化が速く理解が追いつかないのですが、ひとまず下記ワークショップから試してみようと思います。

https://www.apprunnerworkshop.com/

## 関連記事

https://qiita.com/himorishige/items/3522feea1c25035e92a7

## 参考サイト

**Lambda**

https://qiita.com/zaburo/items/d31c1cb2055143991dfb

https://www.bit-drive.ne.jp/managed-cloud/column/column_14.html

**App Runner**

https://iselegant.hatenablog.com/entry/2021/05/19/142254

https://zenn.dev/waddy/articles/app-runner-nextjs
RSpecでimgタグのオプションをテストする(alt, srcなど)

### 前提条件

以下がユーザーのアバター画像を表示させるヘルパーメソッドである

```ruby:application_helper.rb画像を表示させるヘルパーメソッド
def display_avatar_for(user, size: Settings.avatar_size[:in_feed])
  resize = "#{size}x#{size}^"
  crop = "#{size}x#{size}+0+0"
  avatar = user.avatar
  image_tag(avatar.variant(gravity: :center, resize: resize, crop: crop).processed, alt: "#{user.username}", class: "avatar")
end
```

```ruby:実際に生成されるHTMLのimgタグ
<img alt="Test_User" class="avatar" src="http://localhost:3000/rails/active_storage/representations/redirect/ey..44/ava0.jpg">
```

これに基づき、imgタグのalt属性をチェックすることで、意図した内容が表示されているか確認する。

### 結論（alt属性

```ruby:spec/system/**_spec.rb
let(:user) { create(:user) }
:
expect(page).to have_selector "img[alt='#{user.username}']"
```

以上で確認が可能である。

### その他（src属性

また、src属性を確認する場合は、以下のように記述できる。

```ruby:spec/system/**_spec.rb
let(:filename) { "ava0.jpg" }
:
expect(page).to have_selector "img[src$='#{filename}']"
```

`src$=~~`の`$`により、~~が含まれるかどうか、を確認してくれる。（曖昧検索のように…）
よって上で生成されたimgタグでも反応してくれる様になる、という話でした。

以上です！記事に目を通してくださりありがとうございました！！！
ACMの検証保留中が発行済みにならない問題

Route53にホストゾーンを作成した際にできるNSタイプの4つの値は、デフォルトで末尾に.がついていますがこれが誤りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/9b96d1bb-79a3-5c09-7e05-35d668e5d1bc.png)
<hr>
正しくは下記の通り.なしです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/503ba6be-ce0b-0b66-9ab8-d05a53c50d15.png)
<hr>
ネームサーバーの値も忘れずに変更します。私はお名前ドットコムでドメイン取得をしたのでお名前ドットコムで設定しております。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/9f177d93-438a-93a6-fe1e-06b8a88ac98c.png)
<hr>
無事発行済みになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630191/23e5fd77-34cb-be09-5ec0-9728f8f7fa14.png)
クッキーとセッションって何？[図あり]

クッキーとセッションについて図を用いて理解していこうと思います。

■前提
・HTTP通信・・・クライアントとサーバーの間でテキストでやりとりしましょうというお約束のこと。(下記の図)

#セッション
![Untitled (Draft)-1 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/d1ea7b40-6bbe-6569-d0c8-72e8a422517c.jpeg)

簡単に言うと一連の通信のことをセッションと言います。

[例え]
リクエスト（この情報が欲しいな〜）してレスポンス（これだよー）が返ってくるこの一連の流れのこと

#通常のHTTP通信
![Untitled (Draft)-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/7dedebcd-9900-632f-7d99-fa53d9e59589.jpeg)
またWebではHTTP通信をしています。

普通のHTTP通信だと上図のように情報を保持できないの通信を行う度に初めての状態が続きます。

これだと不便なことがあります。

[例え：ECサイト]
・以前見た商品の履歴が見れない。
・商品をお気に入りに入れていたのにお気に入りに入っていない。
など不便なことが起こります。

サーバーからしたら
「誰ですか？初めましての人だな！」という状態。

ではどうしたら不便なことが解決できるか？
クッキーとセッション管理を使うことによって解決が可能です。


#クッキー、セッション管理を使ったHTTP通信

![Untitled (Draft)-3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/a2722565-e3c6-f47b-420c-efc3dfc1c52a.jpeg)
クッキー、セッション管理を使ったHTTP通信だと上図のように情報を保持できます。

先ほどの不便なことは解決されるわけです。

具体的に見ていきましょう。

#クッキー、セッション管理仕組み
![Untitled (Draft)-4 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/b532b2dd-204c-1287-2bf0-c2a22c396563.jpeg)
クッキー・・・クライアント側でセッション情報を持つもの

セッション管理・・・情報を保持するための仕組み

セッション情報（セッションID）・・・保持したい情報そのもの


■初回
①サーバーからセッションIDが発行されます。
セッションIDをクッキーが格納し、クライアントにクッキー（クッキーかけら）を渡します。
この時点でクライアントとサーバーにクッキー（クッキーかけら）があります。
クッキーがユーザー情報を持っているイメージ。

■２回以降
②クッキー（クッキーかけら）をサーバーに渡します。

③クライアントとサーバーのクッキー（クッキーかけら）を合体させることによって、
サーバーは以前ユーザーだと判断できます。



ざっとですけど概要はこんな感じだと思います。
具体例で考える、Recall / Precisionの使い分け

## はじめに

`Recall/Precision`といった指標を何度も何度も忘れてしまう人(ボク)向けの記事です。

## 前提

以下の方を前提としてます。
- 簡単な算数がわかるかた。
- True Positive, False Positiveとかは知ってる方。

## RecallとPrecisionの定義の確認

ざっくりとは、以下の感覚をつかむといいと思います。
- **「何でもかんでもTrue!」**って予測すると上がるのが、**Recall**
- **「確率が超高い時しかTrue」**って予測すると上がるのが、**Precision**

$$Recall = \frac{TP}{(TP + FN)} = \frac{真にTrueなレコードに、Trueと予測した数}{真にTrueなレコードの数} $$

$$Presicion = \frac{TP}{(TP + FP)} = \frac{真にTrueなレコードに、Trueと予測した数}{Trueと予測した数} $$

> わからない方は、こちらなどを参考に。 [(Accuracy/Recall/Precisionってややこしくない??)](https://qiita.com/K5K/items/5da52e99861483cae876)

## Recall/ Presisionの使い分け方

「Recall/Precision」どっちを重要視すればいいか、
具体的なケーススタディと共に見て行きましょう。

- True事象の**「重要度」**と**「めんどくさい度」**で決める (再掲)

### ケーススタディ1：ガン患者の予測

```
患者に対して、癌かどうかを予測をする。
患者がガンである : True
患者がガンでない : False
```

皆さんなら、PrecisionとRecallどっちを重視するでしょうか？

癌は**「重要度(危険度)」**が**非常に高い**です。
**「本当は癌」**の方を**「癌でない」**と予測したら、最悪**命を落とす**結果になるかもしれません。
ガンの見落としはできるだけ防がなければいけないので、**Recall**が重要になります。

一方で、Recallが高ければいいわけでもないです。
「患者全員が癌だ！」というモデルを作れば、Recallは100%になります。
しかし、全員に精密検査をするという「めんどくささ」も発生します。

結果としては、**「Recallは限りなく100になる中で、F1-scoreが高いモデル」**がいいということになりますね。

### ケーススタディ２ : 風邪患者の予測

```
患者に対して、風邪かどうかを予測をする。
患者が風邪である : True
患者が風邪でない : False
```

風邪は**「重要度(危険度)」**がそこまで高くありません。
「風邪じゃない」と予測した人が、「本当は風邪だった」場合でも、そこまで大きな問題になりません。
一方、**診断する際には「面倒くささ」が発生します。**「ちょっと体調悪い」くらいの患者1000人を全部陽性として診断すると、**全員診察するという「コスト」**が発生します。
この場合は、「確実に患者だろう」という人を予測したいので。**Precision**が重要になります。

とはいえ、Precisionの指標だけ見ればいいわけではありません。
「とんでもなく体調悪い患者だけ、Trueにするモデル」を作レバPrecisionは上がりますが、
1/1000しかTrueと予測しないモデルは、ほとんど事業貢献してません。

なのでこの場合は、
**「Precisionが高い精度になるよう、Accuracyを高める」**という意識になります。

## まとめ

Recall, Precisionどちらを使うかは、
**『True事象の「重要度」「めんどくささ」で評価』**するのが大事になります。

一方、「重要度」「めんどくささ」は一意に定義できるモノでもなく、それだけ見ればいいものでもありません。
偏りすぎない臨機応変な評価を心がけていきましょう。(自分への戒め。)

ご意見とか間違えた解釈あれば、コメントいただけると幸いです。
【React】Module not found: Can't resolveの解決法

<h2>症状</h2>
Reactでnpm startしたらコンパイルエラーが発生して、正常に動作しませんでした。
翻訳すると、「モジュールが見つかりません」となりました。

エラーの内容から推察するに、importが悪さしているようです。

```react:エラー
Failed to compile.

./src/containers/hofa.jsx
Module not found: Can't resolve '../component' in 'C:\Users\environment\project\containers
```

```react:Hoge.jsx
import React from "react";
import {fetchfuga} from "../apis/fygaApis";

export const Hoge = () => {
  fuga = fetchfuga()

  returnn(
      <Wrapper>
        {fuga}
      </Wrapper>
  )
}
```

```react:fugaApis.js

export function fetchfuga =() = {
  return "Fuga";
}

```

<h2>解決策</h2>
import文を修正することで解決しました。
エラーに行数が出たりしないので、少してこずりました。
importするときに、VScodeの補完機能などでパスを指定すると、安全かなと思われます。

```react:Hoge.jsx
import {fetchfuga} from "../apis/fugaApis";
```

<h2>参考</h2>

https://stackoverflow.com/questions/44439205/cant-resolve-module-not-found-in-react-js
warning: ignoring broken ref refs/remotes/origin/HEAD 対処法

## タイトルのようなwarningが出てbranchが消せなかったので色々試した備忘録

以下の記事を参考にさせていただいて

[gitで warning: ignoring broken ref refs/remotes/origin/HEAD ってエラーが出た時の対処法](https://qiita.com/Kazuhiro23/items/c64e0a7b75da7767d684)

fetchして大丈夫かなーと思ったんですが、タイトルのようなwarningがまた出る。

```
git branch -d ブランチ
```
でも消えない

### 解決法

更に別記事に辿り着きました。
[How to fix “warning: ignoring ref with broken name” in git?](https://stackoverflow.com/questions/34990734/how-to-fix-warning-ignoring-ref-with-broken-name-in-git)

私の場合はローカルに残っていたみたいで、もう不要だったので削除しました。

![スクリーンショット 2021-05-23 11.24.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88038/35473d58-c509-13d4-9b3b-5d6f89c95bca.png)

finderの.gitの中で該当ファイルを直接削除しました。
初投稿 データベースとは

# この記事を書く理由
 - 今回、このアカウントでのQiita記事初投稿となります。（以前のアカウントはなぜか停止された。）
 - 今後、良い記事を量産して行きたいのですが、まずはとにかく記事を書いて、Qiitaに慣れようという趣旨です。

# データベースとは
- 電子媒体にファイル形式で保存された情報

# リレーショナルデータベースとは
- 複数の列と行からなる表形式でデータを管理するデータベースのこと

# 参考文献
スッキリわかるSQL入門 第2版 ドリル222問付き　中山清喬/飯田理恵子　株式会社インプレス 2018年
MacでGitをバージョンアップする

# はじめに
MacのbrewコマンドでインストールしたGitをバージョンアップします。

# 方法

brew自体を最新に更新します。
バージョンアップが存在するかを確認する。

```bash:バージョンアップ確認コマンド
brew update
brew outdated | grep git
```

実行結果で`git`が表示された場合は、バージョンアップが可能です。
下記のコマンドでアップグレードを行います。

```bash:アップグレードコマンド
brew upgrade git
```

## bashコンプリートファイルの設定

実行結果に表示されているように、下記のフォルダに、コンプリートファイルが格納されているので、.bash_profileで読み込むように設定します。

```bash:コンプリートファイルについての説明
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
```
kintone アプリアクション先のレコード保存後にアプリアクション元のレコードを更新する

アプリアクションを実行して、アクション先のアプリのレコード保存成功後イベントを受けて、アクション元のレコードを更新するサンプルです。

※コードにはエラー処理などは入れてませんのであくまで参考程度にしてください。

# 環境

* TypeScript

# 動作イメージ
kintoneな人はイメージできると思いますが。。。

Aアプリ・・・アクション元
Bアプリ・・・アクション先

1. Aアプリ---（アプリアクション）---> Bアプリの新規登録画面が別タブで開かれる
2. Bアプリ---（いろいろ編集）--->保存--->サーバーの保存成功
3. Bアプリで登録したデータをAアプリに更新登録


# コード


```typescript
'use strict'
interface KintoneEvent {
  record: kintone.types.SavedFields;
}
class AppAction {
  appId: number
  recordId: number
  action: number
  constructor(action?: number, appId?: number, recordId?: number) {
    this.action = action;
    this.appId = appId;
    this.recordId = recordId;
  }
  isAction() {
    if (this.action !== null) {
      return true;
    } else {
      return false;
    }
  }
}
// アプリアクションで呼ばれたレコード作成時にレコード保存成功後イベントを受けて
// 別アプリのレコードを更新する
const EVENTS = ['app.record.create.submit.success'];
kintone.events.on(EVENTS, (event: KintoneEvent) => {
  // アプリアクションからの同線かを確認して、違ったらリターンする。
  // https://example.cybozu.com/k/100/edit?action=1234567&app=99&record=1
  const href: string = window.location.href;
  const params = (new URL(href)).searchParams;
  if (!params.has('action')) {
    return event;
  }
  let appAction = 
    new AppAction(
      Number(params.get('action')),
      Number(params.get('app')),
      Number(params.get('record')),
    );

    return new kintone.Promise((resolve) => {
    // アプリアクション元のレコードを更新する
    const record = event.record;
    const body = {
      'app': appAction.appId,
      'id': appAction.recordId,
      'record': {
        'customerCode': {
          'value': record['顧客コード'].value
        }
      }
    };
    resolve(kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', body));
  })
  .then(result => {
    // アプリアクションの呼び出し元のウィンドウをリロードする。
    const response = result;
    console.log(response);
    const windowOpenerRef = window.opener;
    windowOpenerRef.location.reload(true);
    return event;
  })
  .catch(error => {
    console.log(error);
  })

});
```

# スクリーンショット

アプリAでアプリアクション実行。
![スクリーンショット 2021-05-23 11.48.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/2af01ee1-dba9-23af-f65b-93cfe49feebd.png)

アプリBでデータ入力して保存。
![スクリーンショット 2021-05-23 11.49.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/4f4da57a-b6e7-b9ac-3763-1a416430760d.png)

保存成功時に、顧客コードが自動で採番されます。
![スクリーンショット 2021-05-23 11.49.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/e9907e95-93a1-dfd2-2491-055cc08b50de.png)

自動採番された顧客コードをアプリAに戻してリロードします。
![スクリーンショット 2021-05-23 11.49.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/03d87ddd-6ab9-c22d-650d-662fd82b695e.png)


# 参考

https://developer.mozilla.org/ja/docs/Web/API/URL/searchParams

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number

https://developer.mozilla.org/ja/docs/Web/API/Window/opener

https://developer.cybozu.io/hc/ja/articles/201941784
Hyper-V で拡張セッションでログインできない問題

#問題
Hyper-V Ubuntu18.04で拡張セッションからログインしようとすると
login failed for display 0
がでる．

#解決
UbuntuのAutomatic login をoffにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/400001/d42b7d05-dfc5-a083-93e1-8ce588b66a13.png)

#参考
https://tsuna-can.hateblo.jp/entry/2021/03/14/100000
Life Cycle:SwiftUI Appで作成した時にFirebaseを初期化する方法

# はじめに
Xcode12よりプロジェクト作成時に、追加されたLife CycleのSwiftUI Appを選択してプロジェクト作成した後、`Firebase.configure()`をどう記述すればわからなかったので調べた結果を残します。

![スクリーンショット 2021-05-23 11.50.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/3ea41a67-da54-07d5-1a46-67a6b0087a1f.png)


# Firebaseの公式ドキュメントによると
[Firebaseの公式ドキュメントを確認](https://firebase.google.com/docs/ios/setup?hl=ja#initialize-firebase)すると

> FirebaseApp 共有インスタンスを構成します。通常はアプリの
 > application:didFinishLaunchingWithOptions: メソッドで行います。

と書かれていますが、実際にAppDelegate.swiftがLife Cycle SwiftUI Appを選択してしまうと存在しません。

# 解決方法
`HogeHogeApp.swift`に追記すればできます。
まず`@UIApplicationDelegateAdaptor`を追記して、AppDelegate使えるようにします。

```swift:HogeHogeApp.swift
@main
struct ChatAPPApp: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate //←この行を追加
    
    var body: some Scene {
        WindowGroup {
            HomeView()
        }
    }
}
```

次に`HogeHogeApp.swift`に下記のコードを追記します。

```swift:HogeHogeApp.swift
class AppDelegate: NSObject, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        FirebaseApp.configure()
        
        return true
    }
}
```

# 参考
[[Xcode 12] アプリの起動について変更になった部分まとめ](https://dev.classmethod.jp/articles/xcode12_change_appdelegate/)
[AtCoder] ABC 202 C - Made Up

https://atcoder.jp/contests/abc202/tasks/abc202_c

$1 \le n \le N$の整数 $n$ に対して、$A_{i} = n$ となる $A_{i}$ の個数を数え上げます。
同様に $n$ に対して $B_{C_{j}} = n$ も数え上げます。
同じ $n$ に対する $A_{i}$ の個数と $B_{C_{j}}$ の個数を掛け合わせて組み合わせ $(i, j)$ が求められます。
それを全ての $n$ に対して計算すると答えが求められます。
言語はC++(GCC 9.2.1)でAtCoderのコードテストで確認しています。

```c++
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
  ll N, a, ans = 0;
  cin >> N;
  vector<ll> A(N, 0), B(N, 0), C(N, 0), D(N, 0);
  for (ll i = 0; i < N; i++) {
    cin >> a;
    A[a-1]++;
  }
  for (ll i = 0; i < N; i++) {
    cin >> B[i];
  }
  for (ll i = 0; i < N; i++) {
    cin >> C[i];
  }
  for (ll i = 0; i < N; i++) {
    D[B[C[i]-1]-1]++;
  }
  for (ll i = 0; i < N; i++) {
    ans += A[i] * D[i];
  }
  cout << ans << endl;
}
```
Amplify SNS WorkshopをTypeScript×ReduxToolkit×Chakra uiでやってみた

今回 [こちら](https://amplify-sns.workshop.aws/ja/ "Amplify SNS Workshop")のAmplify SNS Workshopをやってみました。
公式では言語をJS、状態管理をHooks、UIキットをMaterial-uiでした。
アレンジを加えるために言語をTS、状態管理をRTK、UIキットをChakraでやってみました。

#Amplify SNS Workshopについて
このworkshopではハンズオン形式でAmplifyについてざっと学ぶことができます。
かなり詳しく解説をしてくれているのでAmplify初学者には勉強になると思います。ちなみにハンズオン動画もありました。

https://aws.amazon.com/jp/blogs/startup/event-report-amplify-week-202004/



#Workshopをやってみて

そもそものAWSについて理解をしていないとついていけない箇所があるかなと思います。
私自身がAWSはAmplifyをやりつつ勉強をしていく形をとっていたので、いきなりAWSのサービスがたくさん出てくると内部でどのようなことが起きているか分からずついていけなくなりました。
しかしブラックボックス状態のまま進めてしまうとゆくゆく自分の首を絞める結果になりそうだなと思ったので、分からないサービスや用語は可能な限り調べて、分かるようにしてから進めるようにしました。
その甲斐あって、このWorkshopをやる前よりはかなりAWSについて理解できたかなと思います。（とは言ってもまだまだ分からないことばかりです。）

#最後に

かなりLambda関数の理解に苦労しました。
何をやっているのか、どういった役割ががあるのかは理解できたのですが、自分自身で書くとなると全く書けないです。なので時間に余裕がある時にでもLambda関数や他のサービスについて学んでいきたいと思います。


参考記事

https://toumasblog.org/aws-lambda/

https://times.hrbrain.co.jp/entry/2020/12/08/redux-toolkit-async-thunk
【初心者でもわかる】gridを使った中央揃えの方法と、flexboxを使った中央揃えの方法

#どうも7noteです。gridとflexboxを使った中央揃えの方法一覧

webではコンテンツの中央揃えは頻出します。

**上下の中央揃え、左右の中央揃え、上下左右の中央揃え**の書き方をマスターすることはWEB制作では必須になるでしょう。

grid、もしくはflexboxを使った中央揃えは指定した子要素を中央揃えにすることができます。
なので、**中央揃えにしたい親要素に対して使用します。**

## 「上下左右」の中央揃え

### ■ flexboxを使った「上下左右」の中央揃え

```style.css
.oya {
  display: flex;
  justify-content: center;
  align-items: center;
}
```

### ■ gridを使った「左右左右」の中央揃え

```style.css
.oya {
  display: grid;
  justify-content: center;
  align-items: center;

  /* もしくは */
  display: grid;
  place-items: center;
}
```



## 「上下」の中央揃え

### ■ flexboxを使った「上下」の中央揃え

```style.css
.oya {
  display: flex;
  align-items: center;
}
```

### ■ gridを使った「左右」の中央揃え

```style.css
.oya {
  display: grid;
  align-items: center;
}
```

## 「左右」の中央揃え

### ■ flexboxを使った「左右」の中央揃え

```style.css
.oya {
  display: flex;
  justify-content: center;
}
```

### ■ gridを使った「左右」の中央揃え

```style.css
.oya {
  display: grid;
  justify-content: center;
}
```

## まとめ

上下左右の中央寄せをするのであれば、flexboxかgridが有力な方法でしょう。
上下左右中央寄せを最も短く書ける方法なら、

```
display: grid;
place-items: center;
```

これで2行で書くことができます。

これ以外の方法でも中央揃えにする方法は様々ありますが、flexboxかgridが使えればレイアウトを作成するのに困る場面はそこまで多くないでしょう。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【LeetCode】就活に向けたコーディングテスト対策 #01

#はじめに
こんばんは．
M1就活生が[LeetCode](https://leetcode.com/)から，easy問題を中心に**Python**を用いて解いていきます．

https://leetcode.com/

↓では，解いた問題のまとめを随時更新しています．
[まとめ記事](https://qiita.com/halpi/items/43761b89a1873dcc9a5c)

https://qiita.com/halpi/items/43761b89a1873dcc9a5c

#問題
今回解いたのは，難易度easyから [問題1のTwo Sum](https://leetcode.com/problems/two-sum/) です．
問題としては，整数numsの配列と整数targetが与えられたとき，numsの中から整数2つを選び，その合計がtargetと一致するインデックスを返すというもの．
なお，同じ要素は2度使えないとのこと．
>Example 1：
>Input: nums = [2,7,11,15], target = 9
>Output: [0,1]
>Output: Because nums[0] + nums[1] == 9, we return [0, 1].

#書いたコード
とりあえず，思いついたままに書いてみました．

```python
class Solution():
    def twoSum(self, nums, target):
        for i in range(len(nums)):
            for j in range(len(nums)):
                if i == j:
                    continue
                if nums[i] + nums[j] == target:
                    return [i, j]
```

うーん，何をやっているかはわかるものの，総当りでの解き方なので，実行時間がやはりかかってしまいます．
`range`を`enumerate`にしたり，内側のループは開始位置を変えてやれば`if`が不要になるなど，まだまだ改良すべきところがありますね．
問題としては解けたのでとりあえずよしとします．

なお，LeetCodeには，ユーザーがそれぞれの言語で解法を投稿しています．
Python3を使ったコードで，パット見での評価が高そうなものとして以下がありました．

```python
class Solution:
    def twoSum(self, nums, target):
        h = {}
        for i, num in enumerate(nums):
            n = target - num
            if n not in h:
                h[num] = i
            else:
                return [h[n], i]
```
なるほど．．ちょっとよくわからん．

3つほどヒントがあったので，大事そうな部分を読んでみます．

>Hint 2:
So, if we fix one of the numbers, say
x
, we have to scan the entire array to find the next number
y
which is
value - x
where value is the input parameter. Can we change our array somehow so that this search becomes faster?

xを固定すると，targetと一致する組み合わせ(x,y)を全探索しないといけない．
このとき，yはvalue - xだよとのこと．

>Hint 3:
The second train of thought is, without changing the array, can we use additional space somehow? Like maybe a hash map to speed up the search?

なるほど，辞書を使えば効率よく書けるということか．

つまり，辞書に`x = num`を格納していき，`y = target - x`となるようなyが辞書に存在していれば，その組み合わせのインデックスを返せば良いということですね．

#おわりに
正直，解法を見ても頭でわからないことが多かったので，実際紙に書いて整理してました．
easy問題とはいえ，なかなか難しくないですか？（汗）

今回書いたコードはGitHubにもあげておきます．

https://github.com/halpi17/LeetCodeStudy/blob/master/001/twoSum.py

[前回](https://qiita.com/halpi/items/43761b89a1873dcc9a5c)　[次回](https://qiita.com/halpi/items/09035b5daf6b87bc1a25)
NoMethodError (undefined method `upload' for nil:NilClass):の解決法。

AWSのS3の導入過程でで画像を投稿すると、上記のエラーが。

環境変数のキーを確認しても間違いは無かったです。




```  
def create
    @item = Item.new(item_params)
    if @item.save   #<=ここでエラーが出ます
      redirect_to root_path
    else
      render action: :new
    end
  end
```

エラーが文をコピーして検索すると、同じようなエラーの記述がありました。環境変数を使えるようにするためのコマンドsource ~/.zshrcを忘れていただけでした。
同一の値をグループ化してその中でソートしたい

##同時刻の中で逆順化されているログ
どういうわけかわからんのですが、「同時刻の中で逆順化されているログ」（？）が
手元に来ました。こういう風なものです↓↓↓。

log.csv

|Num|Time  |Contents|
|:-:|:----:|:------:|
|1  |10:00 |A|
|2  |11:00 |C|
|3  |11:00 |B|
|4  |12:00 |F|
|5  |12:00 |E|
|6  |12:00 |D|
|7  |13:00 |J|
|8  |13:00 |I|
|9  |13:00 |H|
|10 |13:00 |G|

ソートに失敗しているのかロギングの設定がおかしいのか、原因はさておき、
「A→J」の順にしないと、ログの正しい順番は把握できない様子。

これをサラッと、何とかしたい。

```powershell:同じ値の奴でgroupして、その中でsort
$Log = Import-Csv .\log.csv                        # log.csvをインポート
$GroupByTime = $Log | Group-Object -Property Time  # Timeで「同時刻グループ」を作る

<# $GroupByTime
Count Name  Group
----- ----  -----
    1 10:00 {@{Num=1; Time=10:00; Contents=A}}
    2 11:00 {@{Num=2; Time=11:00; Contents=B}, @{Num=3; Time=11:00; Contents=C...
    3 12:00 {@{Num=4; Time=12:00; Contents=D}, @{Num=5; Time=12:00; Contents=E...
    4 13:00 {@{Num=7; Time=13:00; Contents=G}, @{Num=8; Time=13:00; Contents=H...
#>

# 「同時刻グループ」内を、Numで逆順にする（Numは文字列なので数値にキャスト）
$GroupByTime | %{$_.Group | Sort-Object -Descending {[int]$_.Num}}

```

結果。

|Num|Time  |Contents|
|:-:|:----:|:------:|
|1  |10:00 |A|
|3  |11:00 |B|
|2  |11:00 |C|
|6  |12:00 |D|
|5  |12:00 |E|
|4  |12:00 |F|
|10 |13:00 |G|
|9  |13:00 |H|
|8  |13:00 |I|
|7  |13:00 |J|

あとはNumを「1→10」に書き換えれば正しい順番のログになるはず。
同一の値をグループ化して、その中で順序入れ替えるとか、いじくるにはこの方法が楽かなと思いました。
独学yolov5まとめ

#はじめに
本投稿はyolov5について筆者がネットサーフィンで得た情報をまとめています。
随時更新するつもりです。

#参考サイト
[yoloの歴史](https://www.theseus.fi/bitstream/handle/10024/452552/Do_Thuan.pdf?sequence=2&isAllowed=y)
[yolov4の解説参考サイト](https://medium.com/axinc/yolov4-%E7%89%A9%E4%BD%93%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%99%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%A2%E3%83%87%E3%83%AB-480f0a635317)
[yolov3の元論文](https://arxiv.org/pdf/1804.02767.pdf)
[yolov4の元論文](https://arxiv.org/pdf/2004.10934.pdf)
[Scaled yolov4の元論文](https://arxiv.org/pdf/2004.10934.pdf)
[CSPの元論文](https://arxiv.org/pdf/1911.11929.pdf)
[SPPの元論文](https://arxiv.org/pdf/1406.4729.pdf)
[PANの元論文](https://arxiv.org/pdf/1803.01534.pdf)
[]()

#yolov5について
・yolov4とyolov5はほぼ同じ時期に開発された
・今までのyoloがCだったのに対して、yolov5はpythonを用いて書かれている。
・将来的に有望なのはyolov5っぽい（pytorchのコミュニティの方が多いから）
#yolov5の構造について
yolov5はyolov4の構造と非常に似ていて、主に3つの構造が用いられている。
- Backbone: CSP network
- Neck: SPP, PAN
- Head: YOLOv3 head using GIoU-loss
（補足）
backbone: 画像からの特徴抽出の役割
neck: backboneを通過した特徴マップを改造して、より精度の高い特徴量を算出する
head: クラス分類やバウンディングボックスの位置を予測して出力する

#Backbone
##CSP network
CSP(Cross Stage Paritial)
###1.どんなもの？
計算量を減らす目的で用いられたネットワーク。


#Neck
##SPP（Spatial pyramid pooling)
・複数のカーネルサイズで一斉にPoolingすることで幅広く精密な情報を取得する手法。


##PAN（Path Aggregation Network)
・YOLOv3ではFPNを使用している

#head
##YOLOv3
・yolov2からのアップデート版
・SSD321と同じmAPで速度が3倍早い
・SSD513とYOLOV3-608ではほぼ同じmapで速度が2倍早い
・YOLOv2とDarknet-19を使用している
WSL2でROS(1)の初期設定まとめ

#背景
ROSの環境設定に毎度時間がかかってしまうので、検索時間を短縮するために参考にしたサイトをステップごとに残します。

#はじめに
kinetic/melodicのインストールであれば、

#WSL2の有効化・Ubuntuのインストール
https://qiita.com/poramal/items/3562472d52fe60f61c56

#GUIの設定
https://qiita.com/ryoi084/items/0dff11134592d0bb895c

xeyesで正しく設定できているか確認する
####エラーが出るとき
https://qiita.com/sorasso/items/27afc7a06c6e4495b792

#ROSのインストール（build系のインストールはしない）
kineticまたはmelodicのインストールであれば、
[ROS講座](https://qiita.com/srs/items/25a56a6abda41dcf396e)の[サンプルコード](https://github.com/project-srs/ros_lecture.git)内にある `ros_lecture/install/install_ros_(ディストリビューション)` をsourceで実行することでビルド可能な状態まで設定してくれます。（ありがとうございます。）

※Melodic以降、rosdepのインストールが自動ではなくなったので、`apt-cache search ros-melodic` の後に`sudo apt-get install python-rosdep` を追加すると良いと思います。

https://qiita.com/srs/items/25a56a6abda41dcf396e

https://github.com/project-srs/ros_lecture.git

もしくは公式の手順を参考にしましょう。

http://wiki.ros.org/melodic/Installation/Ubuntu

#catkin buildを使う
https://qiita.com/harumo11/items/ae604ba2e17ffda529c2

https://zenn.dev/suisuiso/articles/08177aacbffc7a

https://demura.net/education/16350.html

catkin buildがどうしても失敗する場合は.bashrcに
`source ~/catkin_ws/devel/setup.bash`
があるか確認しましょう。

#Ubuntuの環境設定の最終形
~/.bashrcのファイル末尾に以下の5行が追加されていればOK

```~/.bashrc
export LIBGL_ALWAYS_INDIRECT=""
export GAZEBO_IP=127.0.0.1

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
```

#おまけ - VSCodeでWSL2を使う
1. VSCodeをインストール
2. WSL上で `code .` と入力

これだけで必要な設定が適用され、次回以降はVSCode上からもWSLを起動できます。

https://qiita.com/_masa_u/items/d3c1fa7898b0783bc3ed

#おまけ2
このページも参考に

https://waregawa-log.hatenablog.com/entry/2020/10/10/234148


#最後に
対処したのにビルドが上手くいかないときは`source ~/.bashrc` 忘れかもしれません。
快適な環境構築を最短で行いたいものです・・・
plunkerでcssフレームワーク その9

#概要

plunkerでcssフレームワークやってみた。
semantic使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.6/semantic.min.css" >
    <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.6/semantic.min.js" ></script>
```

#成果物

https://embed.plnkr.co/plunk/NlLTnIDS6j5tVRYM

以上。
Django 仮想環境　作る〜

Djangoで仮想環境を作ります。
ターミナル。vsコードを使います。

仮想環境を作る理由は複数のDjangoで作ったアプリがある場合、
それは作成時期によりバージョンが変化します。

ひとくくりにするとエラーが発生するので、アプリ毎に仮想環境を作る必要です。


1、仮想環境を作る

デスクトップに新規フォルダ名「Django」を作る
ターミナルを開く
cdコマンドで「Django」のフォルダーに移動

Django/myーappのフォルダを作る

`python3 -m venv my-app`

my-appの中に入る（入ると（my-app)と表示させる
`source my-app/bin/activate`

仮想環境から抜けるコマンド
`deactivate`

2、仮想環境内にDjangoをダウンロードする

`pip install Django`

3、仮想環境内の基本設定を作る

`django-admin startproject ABCD`

ABCDはフォルダ名

フォルダが
「Django/my-app」
「Django/ABCD」
の二つになる



4、サーバーを起動する

Django/フォルダ名　に移動する。
目次3で作ったフォルダ内で下記コマンドを実行する

`python manage.py runserver`

下記にアクセスできればOK
`http://127.0.0.1:8000/`

5、Djangoを日本語設定にする

vsコードで目次3で作ったフォルダを開く
Django/ABCD/settings.pyを開く

`LANGUAGE_CODE = 'ja'`
`TIME_ZONE = 'Asia/Tokyo'`

上記を変更後、リロードで日本語になるか確認

6、もう一つフォルダを作る

基本設定とは別にアプリ用のフォルダを作ります。

「Django/ABCD」
の中にさらにアプリ用のフォルダを作る

`python manage.py startapp new_app`
　new_appがフォルダ名になる

フォルダが
「Django」の中に
「Django/my-app」
「Django/ABCD」
その中に
「Django/ABCD/ABCD」
「Django/ABCD/new_app」
が作成される

7、基本設定にnew_appを登録する

基本設定を開く
ABCD/settings.pyの中に
目次6で作成したnew_appを登録する

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'new_app',#追加

]
スイフト規則_変数, 定数, コメント, print()関数

すべてのプログラミング言語にはそれぞれの規則が存在します。
そのため、各言語が学びやすく、困難の差も現れています。
作成が簡単なものと難しいものがあります。
代表的な例として、CとJavaでルールが異なります。 もちろん、共通のルールもありますが、
今日はスイフトのルールについて見ていこうと思います。

### 基本的な命名規則

詳しい命名規則については[APIデザインガイドラインとアップル](https://swift.org/documentation/api-design-guidelines/)の[公式文書](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingBasics.html)で確認できます。
最も基礎的な名前のつけ方について見ていくことにしましょう。

>1) 変数·定数·関数·メソッド·タイプなどの名前です。
>>1.スイフトの予約語やキーワードを使用することはできません。
2. 既存の名前も使用できません。 (コードの範囲によります)
3. 演算子として使用できる記号も不可です。
4.数字ではスタートできません。
5.空白が含まれた名前も不可です。 (空白を基点に区分します!)

>2）関数、メソッド、インスタンスの名前は、頭文字を小文字を使用します。
>3）クラス、構造体、エクステンション、プロトコル、列挙型の名前は、頭文字を大文字を使用します。
>4) 大·小文字を区別します。

＃一部の予約語の場合は、カン·セピョ(` `)を使用して名前として使用できます。
＃スイフトの場合、セミコロンを付けることは選択肢です。 しかし、貼らないほうがコードが見やすいです。 （笑）

### Console log
JavaではConsolelogを出力するためにSystem.out.print()関数を使用する。
Swiftにも同様にconsolelogを出力するための関数が存在するが、それがprint()関数です。
(dump)もあります。 と言います）

### 文字列に変数値の使用方法
コンソログを出力するとき、変数の値、あるいはメソッドのリターン値などを出力して確認するために使うこともあります。
そのため、文字列内に該当値を表示したい場合に使用する方法は　\（　値　）です。

### コメンタリー
ソースコードに情報を残す方法として使用されるのが注釈です。
当該ソースコードを共有して、初めて見る人が当該コードの役割を教えるために説明しておいたものと見ることができます。
しかし、注釈を残す方法は各言語で少しずつ異なります。
スイフトで注釈を残す方法を調べてみることにしましょう。

>1.「一行の注釈です」
一行の注釈は2つのスラッシュを使って表しています。 //

>2.複数の列の注釈をください
複数の行をコメントで処理するときはスラッシュと星印を使用します。 /* */
そうすると、注釈内部にあるコードまたは文章は全て注釈扱いになります。

>3.重畳しています、注釈
スイフトでは、複数行の注釈の中に複数行の注釈または一行の注釈を入れる重複注釈をサポートしています。
したがって、いくつかの注釈の締めくくりを上手くしなければなりません。

### 変数と常數
変数と定数を利用して、プログラムで使用されるデータをメモリに一時的に保存します。
>1.変数ですね
変数を作成する方法は、varキーワードを使って作成します。
基本的な作成方法は、var【名前】:【タイプ】=【値】です。
値を初期化せず、タイプまで決めて変数を作っておいても大丈夫です。
そして、値を初期化する場合、変数タイプを使わなくてもコンパイラがタイプを推論して指します。
var【名】:【タイプ】var【名】=【値】

>2.上手です
定数を生成する方法は、letキーワードを用いる方法です。
定数の場合、初期化しないとエラーになる場合があります。
let [名前]=[値]let [名前]:[タイプ]=[値]
オプショナルについては後ほどですが…

これで、スイフトの基本的な変数生成について見てみました。
plunkerでcssフレームワーク その8

#概要

plunkerでcssフレームワークやってみた。
bootstrap使ってみた。

#サンプルコード

```
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">

```

#成果物

https://embed.plnkr.co/plunk/F3j7v0iXRKXxRYQ2

以上。
Pugを無印HTMLに変換する。

CodePenで参考にしたいHTMLがPugで、もう一つが無印なのでPugを無印に変換したい。

変換したいコードはこれだけで、たぶん簡単なんだろうけど、そもそもがわかってない。

```pug.html
.m-container
  .m-body
    .m-base
      .m-tempo
  .m-stick
```

[覚えるのはこれだけ！Pug(Jade)のよく使う9つの書き方](https://www.tam-tam.co.jp/tipsnote/html_css/post12789.html) の以下のあたりなのかな。

>クラス属性はドット（.）、ID属性はシャープ（#）で表す



ツールに頼る。
[pug(jade)からhtmlまたはhtmlからpug(jade)へ変換する](https://trueman-developer.blogspot.com/2018/12/pugjadehtmlhtmlpugjade.html)


```html.html
<div class="m-container">
    <div class="m-body">
        <div class="m-base">
            <div class="m-tempo"></div>
        </div>
    </div>
    <div class="m-stick"></div>
</div>
```

無事CodePenで無印HTML側に移植して表示できた。
【LeetCode】就活に向けたコーディングテスト対策 #00

#はじめに
はじめまして，国立大学情報系M1のhalpiと申します．
晴れて大学院生にもなり，大学生活やバイト，研究で忙しくなるものの，インターンや就活の対策も怠るまいとアウトプットを日々意識しております．

そんなこんなで，インターンや就活の際には，コーディングテストはつきものということで，Qiitaでコーディングテスト対策の記事を投稿していこうと思いました．

コーディングテストについて調べたところ，基本的にはアルゴリズムとデータ構造について問われるとのこと．
対策に関しては，[LeetCode](https://leetcode.com/)というGAFAのコーディングテストも載っているという学習サイトが広く使われているそうです．

https://leetcode.com/

そこで，**LeetCode**から，easy問題を中心に**Python**を用いて解いていきます．

#問題
解いた問題は，別記事として投稿していこうと思います[^1]．
随時，下の表に追記していきます．

[^1]: できれば早くて効率の良いコーディングができればと心がけていますが，**読みやすい**，**あとから読んでわかりやすい**コードで**問題を解く**ことを目的としています．

| No | # | Title | Difficulty |
|:-:|:-:|:-:|:-:|
| 001 |  [1.](https://leetcode.com/problems/two-sum/) |  [Two Sum](https://qiita.com/halpi/items/60571d16f3dffb8d4ae9) |  easy |
|  002 | [7.](https://leetcode.com/problems/reverse-integer/solution/)  | [Reverse Integer](https://qiita.com/halpi/items/09035b5daf6b87bc1a25)  | easy  |
|  003 | [9.](https://leetcode.com/problems/palindrome-number/)  | [Palindrome Number](https://qiita.com/halpi/items/7e20f661cdbcd127d960)  | easy  |
|  004 | [13.](https://leetcode.com/problems/roman-to-integer/)  | [Roman to Integer](https://qiita.com/halpi/items/f889b47cace3031dd54c)  | easy  |
|  005 | [14.](https://leetcode.com/problems/longest-common-prefix/)  | [Longest Common Prefix](https://qiita.com/halpi/items/642c039cb339a5e4cf66)  | easy  |
|  006 | [20.](https://leetcode.com/problems/valid-parentheses/)  | [Valid Parentheses](https://qiita.com/halpi/items/84f93e57d6742678dff4)  | easy  |
|  007 | [21.](https://leetcode.com/problems/merge-two-sorted-lists/)  | [Merge Two Sorted Lists](https://qiita.com/halpi/items/5a25d5295e96608966d3)  | easy  |
|  008 | [26.](https://leetcode.com/problems/remove-duplicates-from-sorted-array/)  | [Remove Duplicates from Sorted Array](https://qiita.com/halpi/items/62fed7603931695f9574)  | easy  |
|  009 | [27.](https://leetcode.com/problems/remove-element/)  | [Remove Element](https://qiita.com/halpi/items/387dce16bca5ce7a99ad)  | easy  |
|  010 | [28.](https://leetcode.com/problems/implement-strstr/)  | [Implement strStr()](https://qiita.com/halpi/items/7336ad1df98ec7a6890d)  | easy  |
|  011 | [35.](https://leetcode.com/problems/search-insert-position/)  | [Search Insert Position](https://qiita.com/halpi/items/1f1a3c81989606c0e376)  | easy  |
|  012 | [53.](https://leetcode.com/problems/maximum-subarray/)  | [Maximum Subarray](https://qiita.com/halpi/items/f7af9573982c417a159e)  | easy  |
|  013 | [58.](https://leetcode.com/problems/length-of-last-word/)  | [Length of Last Word](https://qiita.com/halpi/items/132ef389e15d28f395c6)  | easy  |
|  014 | [66.](https://leetcode.com/problems/plus-one/)  | [Plus One](https://qiita.com/halpi/items/d82ce980a10829455748)  | easy  |
|  015 | [67.](https://leetcode.com/problems/add-binary/)  | [Add Binary](https://qiita.com/halpi/items/399d37b0c0b0db7fb03e)  | easy  |

#おわりに
全く関係のないことですが，いざ記事を書こうとすると，思うように言葉が出てこない，思っていること・考えていることを言語化するのが難しいですね．
日々言葉にする（考える）スピードと，キーボードから入力するスピードが乖離していることが原因でしょうか？
何せ，アウトプットをしつつ，ライティング能力も伸ばしていく必要があると実感しました．
EclipseでGitを使う方法

## まえがき

javaについて勉強しているので、アウトプットとして記述していきます。
今回は、Eclipseでgitを使う方法を記載していきます。

##　gitにニューリポジトリを作る

[github](https://github.co.jp/)ログインし、ニューリポジトリを作成してください。
右上の＋ボタンをクリックすると作成画面に移動します。

##　作成画面

![スクリーンショット 2021-05-22 17.32.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/6cd993d0-faaf-dce5-2f99-3e56fbb0f986.png)

Repository nameにプロジェクト名を入れます。
好きなプロジェクト名でいいです。

PublicかPrivateのどちらかにチェックをします。

・Publicは作った作品を公開します。
・Privateは作品を非公開にします。

create repositoryをクリックしたら、作成されます。

##　Eclipseにgitプラグインのインストール
EclipseにGitを使うためのプラグイン「EGit」をインストールします。

![スクリーンショット 2021-05-22 17.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/5e8f0d48-10b3-7520-1d34-a05c8e1a7964.png)

「ヘルプ」→「新規ソフトウェアのインストール」をクリック

![スクリーンショット 2021-05-22 17.54.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/7a979528-29db-889d-5d95-36a715377290.png)

まずは、作業対象を入力せず、右上の「追加」を押します。

リポジトリーの追加が出たら、以下の２点を入力します。

・名前に「EGit」
・ロケーションに「http://download.eclipse.org/egit/updates」

できたら、追加を押します。

![スクリーンショット 2021-05-22 17.59.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/ee8b4319-41c5-fa72-ce12-e4727b6d9517.png)

一覧が表示されたら、全てチェック入れて「次へ」を押す。
そしたら、インストールするものの一覧が表示され、何もせずに「次へ」を押します。

![スクリーンショット 2021-05-22 18.02.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/d9f10671-4058-7120-d2d2-61f1656b81bd.png)

利用規約に同意し「完了」を押すとインストールが実行されます。

少ししたら、Eclipseの再起動を促されるので、再起動すればインストール完了です。

## Eclipseにgitをつなげる

先程gitで作ったリポジトリをEclipseで表示させます。


まずは、インストールしたEGitを開きます。

![スクリーンショット 2021-05-23 10.19.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/78f819b1-cbe5-4beb-d654-36e5cf630bda.png)

パースペクティブを開いてください。
開かれた画面からGitを選び、OKを押します。

![スクリーンショット 2021-05-23 10.17.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/c5ec23ed-9fb1-bef4-e0ff-11d85f666ca2.png)

左端を見ていただくと、Gitリポジトリーが開かれており、「Gitリポジトリーのクローン」をクリック

※英語で書かれている場合もあります。

![スクリーンショット 2021-05-23 10.06.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/cd2fa32b-35d5-2965-1458-2b0720fa13b3.png)

ソースGitリポジトリーが開かれますので、
・ロケーションからGitで作ったリポジトリのURLを記入します。URLを記入すると、ホストとリポジトリー・パスが自動で書かれるので、そのままにします。

※リポジトリのURLがわからない方は、Gitの作成したリポジトリを開き、コードをクリックすると書いてあります。
![スクリーンショット 2021-05-23 10.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/47df8dc6-99ea-d116-82ed-d4c46a9a74be.png)

・認証では、Gitのユーザーとパスワードを記入し、セキュア・ストアに保管にチェックします。

![スクリーンショット 2021-05-23 10.34.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/a11498eb-7826-c02b-1e72-1879e11d1a3c.png)

以上の２点ができたら、「次へ」をクリック。

ブランチ選択が出ます。
開きたいリポジトリーを選び、タグ・フェッチ戦略はデフォルトのまま「次へ」をクリック。

ローカル宛先が出ますが、デフォルトのまま「次へ」をクリック。
![スクリーンショット 2021-05-23 10.07.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1053584/b92a72a3-d72b-af8c-2212-f5e9943a64b3.png)

以上で完成です。

##　参考文献
[EclipseでGitを使ってみる](https://www.blog.danishi.net/2019/04/30/post-866/)
kintone ルックアップコピーフィールドのマスクを外してルックアップ先に無いデータを保存する

TypeScriptの自習記事です。

kintoneカスタマイズで、ルックアップフィールドを設定しておいて、後からコピー項目には一時的にルックアップに無いデータを入力して保存したい時があります。
例えば、顧客台帳にはあとで正式に登録するんだけど、とりあえずお客様の名前を打ち込んでおきたい時など。

# 環境

* TypeScript


# コード
チェックボックスのchangeイベントハンドラーにて、フィールドのマスクを外す処理を記述します。
レコード編集画面を表示した時にチェックボックスのチェック状態を判別してマスクを戻してますが、ここはレコード保存前のイベントで戻しても良いかもしれません。

変更されたフィールドの情報は、`event.changes.field` で取得できます。

```typescript
'use strict';
interface KintneEvent {
  record: kintone.types.SavedFields;
  changes: any;
}
kintone.events.on(['app.record.edit.change.チェックボックス'], (event: KintneEvent) => {
  const checkbox = event.changes.field;
  if(checkbox.value.length !== 0) {
    event.record.住所.disabled = false;
  } else {
    event.record.住所.disabled = true;
  }
  return event;
});
kintone.events.on(['app.record.edit.show'], (event: KintneEvent) => {
  const checkbox = event.record.チェックボックス;
  if(checkbox.value.length !== 0) {
    event.record.住所.disabled = false;
  }
  return event;
});
```

# kintoneアプリ

チェックボックスのチェック前。住所フィールドはルックアップコピーフィールドです。
![スクリーンショット 2021-05-23 10.20.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/30c11860-c21f-82ef-0a2c-c74b74e459af.png)

チェックボックスのチェック後。住所フィールドのマスクが外れます。
![スクリーンショット 2021-05-23 10.20.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214523/98f77bac-7ad3-ac9d-ca2f-1459bc8f06a5.png)

# 参考

* レコード編集画面のフィールド値変更時イベント
https://developer.cybozu.io/hc/ja/articles/202166270#step3

* 変更されたフィールドやテーブル内の行オブジェクトを取得する
https://developer.cybozu.io/hc/ja/articles/202166270#step11

* レコード編集画面の表示後イベント
https://developer.cybozu.io/hc/ja/articles/202166270#step1
AWS CLIで複数アカウントを使い分ける。

# はじめに
開発用環境、本番環境など複数の環境を管理している方も多いかと思いますが、同じ端末で複数環境のアカウントを使い分ける方法を記載します。

# AWS CLIのインストール
以下から自分の環境に合ったAWS CLIのインストーラをダウンロードしてインストールします。

- [AWS コマンドラインインターフェイス](https://aws.amazon.com/jp/cli/)

以下コマンドを実行し、バージョン表示が出ればインストール完了です。

```shell:aws_cliバージョン確認
aws --version
```

```shell:表示例
aws-cli/2.1.38 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
```

# IAMユーザの作成
AWSにIAMユーザを作成していないようであれば作成しておきましょう。

`IAM`から新規ユーザを作成するだけですが、`aws cli`で使うので作成時に「**プログラムによるアクセス**」はチェックするようにしましょう。

![capture_19042021_084941.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/6b161082-9829-da10-8214-61d9051a90d3.jpeg)

また、ユーザ作成時に最後に表示されるアクセスキー、シークレットアクセスキーが書かれたCSVは後ほど使うのでダウンロードするようにしましょう。

# AWS CLIのデフォルトセットアップ
先ほど`aws cli`をインストールしたPCで`aws configure`コマンドを実行して対話式で`aws cli`をセットアップします。

途中で聞かれる**アクセスキー**、**シークレットアクセスキー**は、ダウンロードしたCSVに書かれているキーを入力します。

```shell:aws_cliのデフォルトセットアップ
aws configure
AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットアクセスキー]
Default region name [None]: [リージョン名(東京ならap-northeast-1)]
Default output format [None]: [アウトプットフォーマット(json/text/table/yaml/yaml-stream)]
```

リージョン名は東京なら`ap-northeast-1`、アウトプットフォーマットはお好きなフォーマットを選択。

再度`aws configure`を実行すれば後から変えられるので、適当に選びましょう。

# AWS CLIの追加セットアップ
他のアカウントを追加するには`aws configure`コマンドに`--profile`オプションを追加して実行することで追加できます。

```shell:aws_cliのデフォルトセットアップ
aws configure --profile [任意のプロファイル名]
AWS Access Key ID [None]: [アクセスキー]
AWS Secret Access Key [None]: [シークレットアクセスキー]
Default region name [None]: [リージョン名(東京ならap-northeast-1)]
Default output format [None]: [アウトプットフォーマット(json/text/table/yaml/yaml-stream)]
```

# 設定情報の場所
各ユーザのホームディレクトリ配下に`.aws`ディレクトリが作成されており、その下に`config`と`credentials`が作成されています。

`config`にはリージョンとアウトプットフォーマットの設定、`credentials`にはアクセスキー、シークレットアクセスキーの情報が登録されています。

```shell:.aws/config
[default]
region = ap-northeast-1
output = text
[profile プロファイル名]
region = ap-northeast-1
output = text
```

```shell:.aws/credentials
[default]
aws_access_key_id = XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[プロファイル名]
aws_access_key_id = YYYYYYYYYYYYYYYYYYYY
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
```

# 複数アカウントの使い分け
最初に登録したアカウントは`default`というプロファイルで登録されているため何もオプションを付与しなければ`default`のアカウントでコマンドが実行されます。

追加したアカウントで実行したい場合は各コマンドの後ろに`--profile [プロファイル名]`として実行することで追加したアカウントでコマンドが実行されます。

# おわりに
`aws-cliv2`になって`output`形式で`yaml`が選択できるようになったのはうれしいですね。
`CloudFormation`等のコードを作成するときに役立ちそうです。
capistranoでのDeprecation Noticeエラー


##エラー内容
capistranoを使用してデプロイ環境を構築している際にDeprecation Noticeの表示がされました。

```
$ bundle exec cap production deploy

 >Deprecation Notice] Future versions of Capistrano will not load the Git SCM
 >plugin by default. To silence this deprecation warning, add the following to
 >your Capfile after `require "capistrano/deploy"`:

    require "capistrano/scm/git"
    install_plugin Capistrano::SCM::Git
```

##解決法
エラー内容にある以下記述を反映させます。

```
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
```

まずはじめに、config/deploy.rbに以下記述があれば削除。

```:config/deploy.rb
set :scm, :git  ←削除
```

次に、Capfileに追記。

```:Capfile
#require "capistrano/deploy"の下に追記。
require "capistrano/scm/git"
install_plugin Capistrano::SCM::Git
```

capistranoのアップデート後に発生することがあるみたいですが、今回は新規導入時に発生しました。
エラーメッセージの内容をどこに追記すれば良いか分からないこともあると思うので、備忘録も兼ねて残しておきます。
Vue3のSFCファイル(.vueファイル)用のesbuildプラグインを作りました

vue3のSFCファイル(.vueファイル)用のプラグインが見つからなかったので、プラグインを作成しました。
一般的にはvueでesbuildを使いたい場合はviteを使えば良いと思うのですが、いくつかの事情[^1]からviteを使いたくない場合があると思うので、このプラグインはそういう方向けです。

https://github.com/kena0ki/esbuild-plugin-vue-iii

## 機能
esbuildでvueファイルがバンドルできるようになります。内部的には[plugin-vue](https://github.com/vitejs/vite/tree/main/packages/plugin-vue)(viteのプラグイン)を使っているので、実験的機能である `<script setup>`([RFC](https://github.com/vuejs/rfcs/blob/script-setup-2/active-rfcs/0000-script-setup.md))にも対応しています。

## インストール
`esbuild` と共に、`esbuild-plugin-vue-iii` をインストールします。

```shell
npm i -D esbuild esbuild-plugin-vue-iii
```

## 使い方
一般的な esbuild の[プラグインの使い方](https://esbuild.github.io/plugins/#using-plugins)と同じです。

```js
const build = require('esbuild').build;
const vue3Plugin = require('esbuild-plugin-vue-iii').vue3Plugin;

build({
  entryPoints: ['index.ts'],
  bundle: true,
  outdir: 'dist',
  plugins: [vue3Plugin()],
}).catch(() => process.exit(1));
```

## 未サポートの機能
1. Pre-Processors
2. CSS Modules
3. Template Static Asset Reference
4. Custom Blocks
5. SFC Src Imports
6. Source Map

3.と6.は対応する予定ですが、それ以外は対応するか未定です。

[^1]: viteを使いたくない例

 - CommonJs を使ったライブラリが使えない場合がある([issue#162](https://github.com/vitejs/vite/issues/162#issuecomment-630573458))
 - Web Worker がFireFoxで動かない（例えばmonacoの機能が一部機能しない）([issue#2493](https://github.com/vitejs/vite/issues/2493))
 - 小さいプロジェクトなのでvite使うまでもない
（GPU対応）docker-compose更新のすゝめ

# 概要

以前では，docker-composeを使用してGPUを割り当てるコンテナを作るときには

- nvidia-container-runtimeのインストール
- /etc/docker/deamon.jsonの設定

など，いくつかの手順を踏み，docker-compose.ymlでruntimeオプションを設定する必要がありました

[こちらを参考にしました](https://qiita.com/sht47/items/0706f19c67eb30e0954f)

この手法ではruntimeオプションは割り当てるGPUの個数などを指定できません。
（通常のdocker runではgpusオプションで割り当てるGPUの数やidを指定できる）

しかし，**docker-compose v.1.28にて簡単に，しかも割り当てるGPUの詳細な指定が可能となりました。**

# 参考資料

[docker docs - Compose における GPU アクセスの有効化](https://matsuand.github.io/docs.docker.jp.onthefly/compose/gpu-support/)

# 設定の方法

簡単2ステップ（Linux）

1. docker-composeのアップデート（v1.28以降）
2. docker-compose.ymlの設定

## docker-composeのアップデート

docker-composeのインストールはサイトのコマンドをコピペするのですが**バージョンを必ずv1.28.0以上**にしてください。[リリースノート](https://github.com/docker/compose/releases)

```bash
# バージョンを1.28.0以上にする
sudo curl -L https://github.com/docker/compose/releases/download/1.28.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
```

## docker-compose.ymlの設定

deployオプションを新しく追加します

```yaml
services:
  test:
    image: nvidia/cuda:10.2-base
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
          - driver: nvidia
            count: 1
            capabilities: [gpu, utility]
```

countオプションかdevice-idsオプションのどちらかが指定できます

countオプション → 使用するGPUの個数を指定したいとき
device-idsオプション → 使用するGPUを直接指定したいとき

と使い分けます

# おわり。

普段困ったときはqiitaを見るのですが紹介されてないものもあるんですね。[公式ドキュメント](https://matsuand.github.io/docs.docker.jp.onthefly/)様様
（調査不足の可能性あり）

Ubuntu16.04&20.04で確認したのですが割とどのような環境でも動くような気がしてます
Rails コントローラとアクションを定義する

#コントローラとアクションを定義する

```csharp
$ rails g controller users index
```

「rails g controller コントローラ名 アクション」と定義すると、コントローラとアクションを同時に作成できる。

アクション名は、半角スペースを空けて連続で記述すれば、いくつも同時に作成できます。

```csharp
$ rails g controller users index show create
```
VSCodeの拡張機能（2個目）からQiitaの記事を投稿できるのかやってみた。

# 前回の記事
1個目 vscode_qiitaapi
vscode_qiitaapi - Visual Studio Marketplace
https://marketplace.visualstudio.com/items?itemName=yuuyu.vscode-qiitaapi&ssr=false#overview

前回のレビュー記事
VSCodeの拡張機能からQiitaの記事を投稿できるのかやってみた。 - Qiita
https://qiita.com/masakinihirota/items/eb7927aff8356c55e147

# レポジトリ
https://github.com/yuu-1st/vscode_qiitaapi
https://github.com/neet/vscode-qiita

# 総評
|評価|拡張機能名|
|---|---|
|○|vscode_qiitaapi（前回投稿したのVSCode拡張機能、↑記事）|
|△|vscode-qiita（今回のVSCode拡張機能）|

### vscode_qiitaapi ○
テンプレートを事前に書いているのでテンプレート作成後なら記事の投稿が簡単、投稿に特化。
機能がシンプル。
テンプレートは一旦書き方を覚えれば楽。
更新が安心で楽。（ショートカット登録で更に楽）
テンプレートが面倒（デフォルト値がほしい）
投稿や更新をたくさんする人はこちらのほうが良いと思う。
vscode_qiitaapiの方はつい先日リリースしたばかり。

### vscode-qiita △
テンプレートがいらないこと、右クリックで公開できること。
更新ができない＜＝かなり痛い（やり方見落としているだけかも）
記事一覧が取得できること。
投稿が面倒、投稿等は右クリックで出来るのは楽。
記事投稿時に、タイトル名やタグを記入するので使いにくい。
記事投稿時にタグを5つも設定するのは非常に面倒。
その他のリスト表示機能等ちょっとした使いやすさは上回っている。
最後のメンテナンスは9ヶ月前。

# 環境
Windows10
VSCode

vscode-qiita △
neet/vscode-qiita: 🔍 Smart Qiita integration for Visual Studio Code
https://github.com/neet/vscode-qiita

前回投稿したのとは別のQiita投稿用のVSCode拡張機能

違い
テンプレートがいらない。
記事一覧が取得できる。
ただし連続して記事一覧は取得できない。一旦、記事一覧をクリアしてしまうと一度VSCodeを再起動させる必要がある。
記事一覧から編集できる。
記事一覧上で右クリックからブラウザで表示、タイトルの編集、タグの編集、投稿を公開、削除、が可能。
mdファイル上で右クリックから投稿できる。
更新が出来ない、具体的には更新できず新しい記事として提出されてしまう。
（実際2重投稿になってしまったので慌てて消した。）

|評価|名前|最終更新月|インストール数|Version|
|---|---|---|---|---|
|○|vscode_qiitaapi|21年5月|4 installs | 0.1|
|△|vscode-qiita |19年2月| 594 installs | 0.1.11|