OmniAICreator/Qiita-1.07M huggingface dataset:
「試練」を「快感」に感じた人の話

#前書き

　致知出版社[『1日1話、読めば心が熱くなる365人の仕事の教科書』][1]の一節の感想文である。
[1]:https://www.amazon.co.jp/1%E6%97%A51%E8%A9%B1%E3%80%81%E8%AA%AD%E3%82%81%E3%81%B0%E5%BF%83%E3%81%8C%E7%86%B1%E3%81%8F%E3%81%AA%E3%82%8B365%E4%BA%BA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E5%B0%BE%E7%A7%80%E6%98%AD/dp/4800912474

　今日読んだ記事。沖縄から菓子職人を目指し上京し、独立後、多くの職人の師として慕われ、日本スイーツ業界の父と称された人の話である。
　自らの経験を経て、「試練」を「快感」に感じるようになったという。マゾでは無さそうである（失礼）
　不器用だけど「情熱」そして「人間力」のパワーが半端ないなと思って感銘を受けた。
　現在のエンジニアにも必要なヒントが書かれてあると思ったので紹介します。

#本題<br>【6月7日】耐え抜くところから信用はついてくる 比屋根 毅 エーデルワイス社長

比屋根毅。実業家。尼崎市で洋菓子店エーデルワイスを創業し、数々の職人を育て日本の洋菓子業界の発展に寄与した。
日本スイーツ業界の父と呼ばれる。この本の5月3日の記事の著者、牧野も比屋根の愛弟子である。
1937年生まれ。2020年、82歳没。

比屋根が語るのは、自らの菓子職人としての修行時代からエーデルワイス創業時の経験。
自らの経験がエーデルワイスの社是となり、社員への訓示へも繋がっているという。
冒頭、修行時代を振り返る。

>『当時の大阪の菓子屋では職人が自分で作った菓子を、喫茶店とかパン屋さんなんかに直接売りにいったんです。
　売れ残ったら給料から引かれます。必死でした。ベテランは得意先を持っているからいいですが、僕にはあてなんかないから
　いつも売れ残ってしまう。』

って冒頭から衝撃だ。現在でいうところのフランチャイズチェーン店のオーナーか。
菓子職人が、若手時代から、自分で売り先を見つけ、売りにいって、売れ残ったら給料から天引き。
そりゃ必死になるだろう。ていうか、いくら菓子職人としての腕があっても、経営者感覚がなければ続かない。

>『そこで実は生活が苦しかったもので空手を教えに行っていたんですが、その弟子がたくさんいる。
　こいつらを使ってうまく売る方法はないだろうかと考えたんです。』

なるほど。比屋根は沖縄出身。沖縄は空手の発祥地だ。現在でいうところの副業ってところか。
いや、もしかしたら空手の先生の方が儲かっていたのかもな。弟子がたくさんいるって。
比屋根は、大阪の戎橋の上で、パン箱にケーキをずらっと並べてその弟子たち売らせたという。
これが大当たり。最高の売り上げを上げたという。
その後、比屋根は独立した。だが、自ら創業した経営は芳しくなかったらしい。

>『この時のことを思い出した。「そうだ、あの時のように外に売りにいこう」と思ったわけです。
　これで買いに来なかったら、もう店を閉めようと、捨て身の覚悟でしたね。』

そしてこの作戦が功を奏したという。一流企業がお客さんへの土産に使ってくるようになり、そこから運が広がっていったという。

>『お客さんがお客さんを呼ぶというのでしょうか。一、二年する頃には売上百億の店を目指そうと思い始めました。
　まだ売上何千万の頃です。菓子業界で、明治とか森永のようなところは別として一職人が独立して百億の店を経営しているところは
　ありませんでした。』

なんか、現在のユーチューバーみたいだな。扱う商品は違うけど。個人が企業なみの売上をあげる感じ。
昭和40年ごろ、1960年代の話である。比屋根がもし現在の若者だったとしたら、もしかしてユーチューバーでも大成していたかもな。

>『どうしてそんなことを思いついたかといいますと、本田宗一郎さんとかソニーの創業の頃の話を書いた本を読んでいたんです。
　ソニーの盛田さんとか多くの偉大な人たちが「成功するためには大きなことを言わなければいかん。有言実行だ。
　大きな風呂敷を広げることが必要なんだ」と言っているんですね。そういうことに刺激を受けて当時の日記に、
　「菓子屋のソニーになるんだ」と書いているんですよ。』

なるほど。先人の創業者の本を読んでいたのか。先人の教えから学ぶ姿勢。本には先人が先に経験している叡智が詰まっているもんな。
だが、ビジネスの規模が大きくなればなるほど、高い目標を持てば持つほど、その難易度は高くなる。橋の上で路上販売をするのとは訳が違う。
比屋根はシステムの勉強を始め、アメリカやヨーロッパに行ったり本を読んだりして事業拡大に取り組んだ。
年間の売上に匹敵するような研究所を借金して建てた。心労で円形脱毛症になり、頭は禿げ、顔には黒い斑点がたくさんできたという。

>『”弱り目に祟り目”と言いますが、その頃に営業は売上金を持ち逃げするわ、経理は不正をするわで悪いことが一時にどっと起こりました。
　しかしこういう時に支えになったのは、僕が育てた職人たちです。彼らは一人も裏切らなかった。
　僕は試練にあった時にいつも思うことがあるんです。「神様は僕を一回りも二回りも大きくなれよということでいまこの試練を与えてくれているんだ」と。
　そう思った瞬間から試練を快感に感じるんですよ。うちの会社の社是は「忍耐と信用」ですが、耐えて耐えて耐え抜くところから信用はついてくるのでは
　ないかと思います。社員に一番口やかましくいうのは「苦しみの中からしか人間としての成長はないんだ。楽をしようとしたら駄目だ。
　神様は絶対にいいことは与えてくれない」ということです。』

ふむ。沖縄から菓子職人を目指して上京し、修行時代から厳しい試練にあい、その試練を乗り越えて乗り越えて自ら成長していった比屋根。
円形脱毛症になりながらも、部下である営業や経理に裏切られながらも、自ら育てたという職人たちの存在が心の支えになったという。
そして、また、弟子の職人たちも比屋根を慕う。それは以前読んだ【5月3日】の牧野の記事からも読み取れる。

不器用だが、菓子作りに情熱を注いだ比屋根の人徳であろう。その比屋根が辿り着いた境地が「試練を快感に感じる」こと。
自らが注ぐものへの情熱。その情熱のパワーが強いからこそ、試練はどんどん訪れるのだろうし、そしてそれを乗り越えた時、また一歩成長するのだ。
だから比屋根は「快感」に感じるようになったのだろう。
あと「快感」のもう一つの要素もあるな。それは弟子たちからの「信用」だ。自らの情熱に基づく行動に対して、試練に立ち向かう行動に対して、
自らを慕ってくれている、信用してくれている人たちがいる。決して裏切らない、固い絆で結ばれた「信用」を築き上げることができるのだ。

（参考）
日本スイーツ業界の父・比屋根 毅さんが100人を超える弟子たちに伝え続けたもの　―致知出版社　
https://www.chichi.co.jp/web/20200609_hiyane/
はじめてのReactおさわりお兄さんの成長記録#2～ReactでDBは扱えるの？～

#目次
・シリーズ記事の紹介
・今回の焦点
・結論

##シリーズ記事の紹介
はじめてのReactおさわりお兄さんの成長記録#1
https://qiita.com/T-AKIRA/items/a0e93631c4e3b56649d7

##今回の焦点
前回記事にて「今後の課題まとめ」にて挙げた
・RDBとの接続方法調査
についてを記述するぞぅ！

##結論
__ReactだけでDB接続は無理っぽいヨ！__
おさ兄は今までクライアントサイド・サーバーサイドをセットで触ってきたから
当然できるものと思い込んでいたけど///

DBにアクセスしたければ
別言語でにAPI作ってそこに対してReactちゃん（jstx）でアクセスしてあげるという
そんな感じになるんでちゅね！

API作成については僕のReactロードマップにはないので
省いていこうかしら。
ただ、node.jsを使って
jsonを返すっていう簡易サーバー立てられるようだから
そこで課題にある
・REST通信のやり方（javascript久しぶりなので復習的な感じなのかReactならではなのか）
を以下Qiitaページを参考にやってみようかな！
https://qiita.com/t12u/items/2be73956b788c745048f#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB
kotlinでsingletonを作ってみた

実務で使ったので備忘録として記載しておきます

## singletonパターンとは？
オブジェクト指向のデザインパターンの一つなります。
使うタイミングとしては、複数インスタンスがある場合にsingletonパターンを使うと一つにまとめることができます。

Singletonは、初回の取得で初期化されると、二度目以降は必ず同じインスタンスを返します。
そのためClassから呼び出された場合でも、同じオブジェクトが得られるはずです。

### なぜSingletonを使うのか？
上記のsingletonパターンとは？でも記載していますが、同じインスタンスを作成する場合にSingletonを使うか検討してみてもいいかなと思います。

### Singletonの定義
- `object` でSingletonを作成できる
- Singletonのインスタンスは1つのみ

```
object HogeHoge {
    fun main() {
      println(HogeHoge.isHoge().toString())
    }
    // hogehoge
}
```

```
fun isHoge(): String {
   return "hogehoge"
}
```

### まとめ
- Singletonはデザインパターンの一種
- Singletonを使いたいときは`object`の宣言が必要
- `object`の宣言は呼び出した時にしたときに初期化されるので注意する

## 参考記事
- https://qiita.com/tanakahisateru/items/001a0722c3b2504cd4ee
機械学習の論文に出てくる記号の意味まとめ

# この記事の対象者

論文や専門書にある数式の意味を読み取りたい人｡

数式に出てくる記号がどのようなことを意味を表しているのかをまとめています｡厳密には異なるものを含まれているので参考程度にしてください｡

# はじめに

論文や専門的な本を読んだときに自分の知らない記号やなんとなくで読んでいたものをまとめてみました｡
今後も追加していく予定です｡いくつかは自分で解釈したものや文脈により意味が変わることがあるので､参考程度にしてください｡

# 関数の書き方(f(x),f[x])
```math
f[x]\\
f(x)
```

関数の取る値により､カッコの形が変わります｡$x$が離散変数の場合$f[x]$､連続変数の場合は$f(x)$と書きます｡

# 集合
```math
\mathcal{g}\\
\mathbb{X} = \lbrace 小,中,大 \rbrace
```

質的な値を表すのに使われます｡文書によって異なりますが､だいたいは花文字のアルファベットか太字のアルファベットで書かれています｡

# サンプリング(X~p(x))

```math
X \verb|~| p(x)
```

書体が崩れてしまっていますが､大文字の$X$と関数$p(x)$の間にチルダが書かれているものです｡これは実際のデータ$X$が確率密度関数$p(x)$に従って分布していることを表しています｡ここで$X$は複数の値や概念を表しており､$x$は実際の値を表しています｡サイコロの目を例とすると､出てくる目は1から6までの値になります｡これは集合を利用して

```math
x = \lbrace 1, 2, 3, 4, 5, 6 \rbrace
```

と書くことができます｡サイコロの目が出る確率は全て6分の1なので､確率密度関数$f$に$x$のどの値を入れても$\frac{1}{6}$になります｡なので､

```math
X = \lbrace \frac{1}{6}, \frac{1}{6},  \frac{1}{6},  \frac{1}{6},  \frac{1}{6},  \frac{1}{6} \rbrace
```

となります｡値が複数ある時(すなわち同時確率)の場合はまとめて

```math
X, Y \verb|~| p(x, y)
```
と書くこともあります｡

# 正規分布､ガウス分布(N)

```math
N(0, 1)\\
N(\mu, \sigma^2)
```

$N(\mu, \sigma^2)$は平均$\mu$､分散$\sigma$の正規分布であることを表しています｡チルダと合わせ､$x  \verb|~| N(\mu, \sigma^2)$のように使用します｡これは$x$が平均$\mu$､分散$\sigma^2$で生成されることを表しています｡

# 期待値､平均(E､￣)

```math
\mathbb{E}[x]\\
\mathbb{E}_{p(x)}[x]\\
\mathbb{E}_{\tau}[x]\\
\bar{x}
```

変数$x$の取る期待値(=平均)を表しています｡中央の式は$x$が確率密度関数$p$に従っていることを表しています｡$\mathbb{E}$の下の添字は期待値の対象が何であるかを表しています｡$\bar{x}$は$x \in X$tとなる入力$x$の平均値であることを表しています｡


# ノルム(||x||)
```math
||x|| = \sqrt{x_1^2 + x_2^2 + ... + x^2_n}
```
ノルムは一般的にベクトルの大きさを表すために利用されます｡これは､ノルムの式の形が三平方の定理の式とよく似ていることからもイメージしやすいと思います｡しかし､場合によってはベクトルの成分に重みをつけたい場合や成分を2乗ではなく3乗にしたい場合など､式を多少アレンジして使用したい場合があります｡その場合､

```math
||x||_w = \sqrt{w_1x_1^2 + w_2x_2^2 + ... + w_nx_n^2}\\
||x||_3 = \sqrt{x_1^3 + x_2^3 + ... + x_n^3}
```

のようにノルムの右下になにかしらの記号を書くことで､明示的に一般的なノルムとはことなることを表しています｡

# 積分
```math
\int x dx\\
\int_\mathcal{G} xdx
```
意味的には､膨大な数のなにかの総和を取りたいときや､値の間隔が短いものの総和を求めたいときに使います｡ほとんどの場合､$\Sigma x$とほぼ同じ意味として解釈できます｡

# 近似(二重の~､≒､^)
```math
\approx\\
\fallingdotseq\\
\simeq\\
\sim\\
\hat{y} = \hat{f}(x)
```
近似または限りなく等しいことを表しています｡日本では$\simeq$､海外では$\approx$を使用することが多いです｡サンプリングを表す記号として$\sim$がありますが､この記号は近似として使用されることもあります｡

一番下の式は､$\hat{y}$が近似した関数$\hat{f}$からの出力であることを表しています｡この場合､｢文中で求めた関数の出力である｣という意味で使われることもあります｡(機械学習の論文の場合､こちらの意味のほうが多いです｡)
Webpack と React と ローカル画像

# はじめに
`create-react-app`コマンドで React プロジェクトを作った場合。
以下のコードだと`img.png`が表示されないけど、

```react:App.js
import logo from "./logo.svg";

function App() {
  return (
    <div className="App">
        <img src={logo} className="App-logo" alt="logo" />
        <img src="./img.png" />
    </div>
  );
}

export default App;
```


次のコードだと表示されるやつ。

```react:App.js
import logo from "./logo.svg";
import img from "./img.png";

function App() {
  return (
    <div className="App">
        <img src={logo} className="App-logo" alt="logo" />
        <img src={img} />
    </div>
  );
}

export default App;
```

# build
最初のコードで`build`したときのディレクトリ構造。
`build/static/media`の中に、`img.png`は入ってない。

```
build
    - static
        - js
        - css
        - media
            - logo.svg
```

画像が表示される方のコードで`build`したときのディレクトリ構造。
`build/static/media`に`img.png`が含まれている。

```
build
    - static
        - js
        - css
        - media
            - logo.svg
            - img.png
```

# Webpack
`import img from "./img.png"`と書くことで、Webpack に「このファイル使うのでビルドに含めてください」と伝えられる。

ただし使用する画像数が多いと build ファイルが大きくなってしまうので、その場合は画像を public フォルダ内や外部サーバに置いたりする。
[vim] バックスラッシュが打てない　MacOS

`⌘`+ `option` + `¥`

通常だと、`option` + `¥`で打てるのだが、vimだとescと同じ挙動になってしまう。。。

困ってキーボードを触って試していたらできた。
打てなくて困っている人はお試しを！
Bitriseで生成された特定ファイルをAPPS & ARTIFACTSにデプロイする

## 結論 :ok_woman_tone2: 

`$BITRISE_DEPLOY_DIR` 配下にファイルを置く

[参考:Bitrise/利用可能な環境変数](https://devcenter.bitrise.io/jp/builds/available-environment-variables/)

## モチベーション :fire: 

Androidプロジェクトにおいて日次で[detekt](https://github.com/detekt/detekt)を実行して
どの種別のWARNINGがその日時点でどれだけ出ているかを定量的に判断できるようになるWorkflowを作成した

増減の推移は分かるようになったので、より可視化して見やすくするために、detekt実行時の `detekt.html` をどこかにファイルを配置/ホスティングしたかった

## 解決策 :punch: 

### 生成ファイルを $BITRISE_DEPLOY_DIR に配置

`$ ./gradlew detekt` を実行すると `app/build/reports/detekt/detekt.*` に各フォーマットのレポートが生成される

Bitrise Workflowの`Script`内に以下を記述
※ コピー元は動作環境を確認してください

```shell
...
cp app/build/reports/detekt/detekt.html $BITRISE_DEPLOY_DIR/detekt.html
...
```

### Workflowの最後に `Deploy to Bitrise.io - Apps, Logs, Artifacts` を追加

**Deploy directory or file path** で設定されている `$BITRISE_DEPLOY_DIR` 配下のファイルがすべてAPPS & ARTIFACTSにデプロイされます

![スクリーンショット 2021-09-30 10.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63740/d376e71a-b756-b069-0daa-e390313e5443.png)

`View Detail`でページ内でhtmlがプレビューされます。もしくはダウンロードして確認します

## ボツ案 :no_good_tone2: 

Firebase Hostingに対して生成されたhtmlを静的にホスティング
そんなに圧迫しないだろうがコスト面とやりたいことに対してオーバーだったので見送り
terraformでcloudfrontにAlarmを設定する

今回はterraformでCloudFrontにAlarmを設定してみます。
対象として、[前回の記事](https://qiita.com/Lycaony/items/3d7a800073ba8f5e0b7d)で作成したCloudFront+S3の環境に対して設定してみます。

#providerのaliasの設定
今回CloudFrontにAlarmを設定しますが、注意点としてCloudFrontのメトリクスは"us-east-1"のリージョンにしか送信されません。
このため、Alarmやその送信先のSNS Topicについてもus-east-1で作成を行う必要があります。

terraformではaliasのパラメータを付けることで、別の設定を持つProviderを設定できるのでus-east-1のProviderを作成しておきます。

```tf
provider "aws" {
  alias      = "global"
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
  region     = "us-east-1"
}
```
ここでは"global"というalias名で設定しています。

#通知先の作成
## SNS Topicの作成
まずはAlarm状態になった際の通知先(SNS Topic)を作成しておきます。
前述したように、us-east-1のリージョンに作成しないと動作しない為、providerパラメータに先ほど作成したglobalのproviderを設定しています。

```tf
resource "aws_sns_topic" "tfNotificationGlobalTopic" {
  provider   = aws.global
  fifo_topic = false
  name       = "tfNotificationGlobalTopic"
}
```

## サブスクリプションの登録
次に実際に通知される宛先を登録します。
今回emailを通知先として登録しています。
※登録後に宛先のメールアドレスに確認のメールが飛んできますので、忘れず確認しておいてください。

```tf
resource "aws_sns_topic_subscription" "subscription1" {
  provider  = aws.global
  topic_arn = aws_sns_topic.tfNotificationGlobalTopic.arn
  protocol  = "email"
  endpoint  = var.notification_mailaddress
}
```
※notification_mailaddress(通知先のメールアドレス)はtfvarsで定義しています。

#Alarmの作成
今回は500系エラーの５分間の平均が30%以上になった場合にalarm状態にします。
対象として、前回の作成したcloudfrontのdistibutionを設定し、alarm時のアクションに先ほど作成したtopicを設定しています。

```tf
resource "aws_cloudwatch_metric_alarm" "tfWatchAlarm" {
  provider            = aws.global
  namespace           = "AWS/CloudFront"
  alarm_name          = "tfWatchAlarm"
  metric_name         = "5xxErrorRate"
  comparison_operator = "GreaterThanOrEqualToThreshold"
  evaluation_periods  = "1"
  period              = "300"
  statistic           = "Average"
  threshold           = "30"
  dimensions = {
    DistributionId = aws_cloudfront_distribution.distribution.id
    Region         = "Global"
  }

  actions_enabled = true
  alarm_actions   = [aws_sns_topic.tfNotificationGlobalTopic.arn]

}

```

#まとめ
これらの設定で、CloudFrontに対してAlarmの設定が行えます。
今回はCloudFront+S3の環境に対して設定しており、まず発生することはありませんが、
これらの設定はCloudFrontDistribution全般に対して有効なはずです。

注意点としては、us-east-1のリージョンで設定が必要というところになると思います。

※最終的なコードこちら。
[Github - terraform_cfs3_cloudwatch](https://github.com/matsui-110/terraform_cfs3_cloudwatch)
Spring bootでmysqlに接続する

# 環境
・Windows10
・MySQL5.7

# 手順
## １．依存関係の定義

SpringJDBCを使ってmysqlに接続するために必要な依存関係を定義する。

https://qiita.com/niwasawa/items/024a01c502962eb90b1d
ここではMavenプロジェクトの場合の説明が載っている。

Gradleプロジェクトの場合も同様。以下を参考。
https://learning-collection.com/springboot%E5%85%A5%E9%96%80-vol-6%EF%BC%9A%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E6%BA%96%E5%82%99%E3%82%92%E3%81%97%E3%82%88%E3%81%86/

```build.gradle
dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'mysql:mysql-connector-java'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

```

```app.properties
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=java
spring.datasource.password=cafebabe
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.sql.init.mode=always
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.data-locations=classpath:data.sql
spring.sql.init.encoding=utf-8

```

以下項目は環境によって設定が異なる可能性が高いので注意が必要。

```
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=pass
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.data-locations=classpath:data.sql
```

また、以下２つ

```
spring.sql.init.schema-locations=classpath:schema.sql
spring.sql.init.data-locations=classpath:data.sql
```
に関しては、src/main/resources配下のパスを記載する。
私の場合、resources直下にsqlを配置しているので、上記のようになる。


## ２．mysqlをインストール
私の場合以前すでにインストール済みだったため割愛。
以下ページが参考になりそう。
https://qiita.com/ryo-sato/items/bd026f5e627a746f1734

## ３．mysqlのサービス起動
・タスクマネージャでMySQLのサービス名を確認する

・コマンドプロンプトを管理者権限で実行する
https://qiita.com/takuya0301/items/df6cde3bbaf9e13ef8f0

・コマンドプロンプトで以下コマンドを実行

```
> net start <MySQLのサービス名>
```

私の環境の場合、

```
> net start MySQL57
```
となる。

## ３．データベースの作成

・MySqlにログインする
コマンドプロンプトで以下コマンドを実行

```
> mysql -u <ユーザ名> -p
```
・パスワードを求められるので、パスワードを入力する
[（参考）Mysqlパスワードのリセット](https://liginc.co.jp/web/programming/mysql/87393)


・新しいデータベースを作成する

```
mysql> create database <DB名>;
```

DB名：testdbの場合の例は以下。

```
mysql> create database testdb;
```

・データベースが作成されたことを確認する

```
mysql> show databases;
```
４．アプリを起動する


## 参考サイト
[MySQLのコマンド]
(https://qiita.com/CyberMergina/items/f889519e6be19c46f5f4)
[spring公式サイト]
(https://spring.pleiades.io/guides/gs/accessing-data-mysql/#initial)
【Django】ForeignKeyのon_deleteの設定値をまとめたい

## 目的
現在、作成しているサービスにて、あるテーブルのレコードを削除した際に、関連して削除されるレコードのテーブルを知りたかった。
`python manage.py inspectdb`で`on_delete`の情報も出力されるかなと思ったが、そうでもなかった。

## 確認環境
- `Django1.X`
  - かなり古いので、コードが動かなかったらごめんなさい

## コード
- ざっくり書いているので、手直しして使用してください。。

#### 全modelsのForeignKeyのフィールドとon_deleteを出力するカスタムコマンド
```python
from django.core.management.base import BaseCommand
from django.db.models import get_models


class Command(BaseCommand):
    def handle(self, *args, **options):
        # 全modelsクラスを取得（Djangoが自動生成したmodels含む）
        models = get_models(include_auto_created=True)
        # models名でソートしてループ
        for model in sorted(models, key=lambda model: model._meta.db_table):
            # テーブル名取得
            table = model._meta.db_table
            # フィールド取得
            meta_fields = model._meta.fields
            # 出力
            self.stdout.write('')
            self.stdout.write('■■■ Table ■■■')
            self.stdout.write('{table}'.format(table=table))
            self.stdout.write('')
            self.stdout.write('■■■ ForeignKey Field ■■■')
            # フィールド分ループ
            for meta_field in meta_fields:
                # ForeignKeyか？
                if 'ForeignKey' in str(meta_field):
                    # フィールド名取得
                    name = meta_field.name
                    # フィールドのverbose_name取得（使ってないけど）
                    verbose_name = meta_field.verbose_name
                    # on_deleteの設定値取得
                    del_kind = str(meta_field.rel.on_delete).split(' ')[1]
                    # 出力
                    self.stdout.write('{name}:{del_kind}'.format(name=name, del_kind=del_kind))
```

#### 指定したテーブルのレコードを削除した際に、関連してレコードが削除されるテーブルを出力するカスタムコマンド
```python
# テーブル名を指定してCASCADEでレコードが削除される項目
class Command(BaseCommand):
    def handle(self, *args, **options):
        # 入力値取得（削除対象テーブル）
        delete_target_table = args[0]
        # 入力値が存在するか
        if delete_target_table:
            # 全modelsクラスを取得（Djangoが自動生成したmodels含む）
            models = get_models(include_auto_created=True)
            # models名でソートしてループ
            for model in sorted(models, key=lambda model: model._meta.db_table):
                # テーブル名取得
                table = model._meta.db_table
                # フィールド取得
                meta_fields = model._meta.fields
                # フィールド分ループ
                for meta_field in meta_fields:
                    # ForeignKeyか？
                    if 'ForeignKey' in str(meta_field):
                        # フィールド名取得
                        name = meta_field.name
                        # on_deleteの設定値取得
                        del_kind = str(meta_field.rel.on_delete).split(' ')[1]
                        # 指定したテーブル かつ on_deleteがCASCADEか？
                        if (name == delete_target_table) and (del_kind == 'CASCADE'):
                            # テーブル名出力
                            self.stdout.write(table)
                            # modelsのループに戻る
                            break
        else:
            print('削除対象のテーブルを入力してください')
```
Pythonを用いたCronbach's α(クロンバックのアルファ)の計算方法


Cronbach's α（クロンバックのアルファ）は
>各質問項目（変数）が全体として同じ概念や対象を測定したかどうか（内的整合性）を評価する信頼係数です。

引用：[統計WEB](https://bellcurve.jp/statistics/glossary/1274.html)

リッカート法で収集したデータを分析する際にCronbach's αを計算することが多いです。

## Cronbach's αを計算する関数
相関係数を用いてCronbach's αを計算することができます。

```Python
def cronbach_alpha(data):
    df_corr = data.corr()
    
    N = data.shape[1]
    
    rs = np.array([])
    for i, col in enumerate(df_corr.columns):
        sum_ = df_corr[col][i+1:].values
        rs = np.append(sum_, rs)
    mean_r = np.mean(rs)
    
    cronbach_alpha = (N * mean_r) / (1 + (N - 1) * mean_r)
    return cronbach_alpha
```

複数の質問があるデータフレームをdataという引数に入れれば、計算完了です。
注意事項というか当たり前なのですが、逆転項目を反転して全て同じ方向に揃えることを忘れないようにお願いします。


計算式は以下の通りです。（n: 質問数(カラム数)、r：　相関係数）


```math
a = \frac{n\bar{r}}{1+(n-1) \bar{r}}
```

## Cronbach's αの解釈

経験的にはCronbach's αは以下のように解釈します。

| Cronbach’s Alpha| Internal consistency |
|:-:|:-:|
|  0.9 ≤ α |  Excellent |
| 0.8 ≤ α < 0.9  | Good |
| 0.7 ≤ α < 0.8 | Acceptable |
| 0.6 ≤ α < 0.7 | Questionable |
| 0.5 ≤ α < 0.6 | Poor |
| α < 0.5  | Unacceptable |


0.8あたりなら内的整合性があるのではないかという感じです。

## 例：Cronbach's αを求めてみる

質問が三つで一つの概念を測定しているサンプルデータを作成します。

```Python
df = pd.DataFrame({'Q1': [1, 2, 2, 3, 2, 2, 3, 3, 2, 3],
                   'Q2': [1, 1, 1, 2, 3, 3, 2, 3, 3, 3],
                   'Q3': [1, 1, 2, 1, 2, 3, 3, 3, 2, 3]})
df
```

|Q1 |Q2 |Q3 |
|--:|--:|--:|
|  1|  1|  1|
|  2|  1|  1|
|  2|  1|  2|
|  3|  2|  1|
|  2|  3|  2|
|  2|  3|  3|
|  3|  2|  3|
|  3|  3|  3|
|  2|  3|  2|
|  3|  3|  3|



上で作成した関数を実行します。

```Python
np.round(cronbach_alpha(df), 3)
```

結果

```
0.774
```

## 最後に
Rでやれば心理学系のライブラリに標準で搭載されているかと思いますが、僕が以前調べた際にはPythonでの一般的なライブラリを見つけられなかったのでちょっと動くような関数を作ったという経緯があります。

これからもローカルにあるコードを極力共有していくように心がけていこうと思っています。

この記事は以下の情報を参考にして執筆しました。

- [Cronbach’s Alpha: Theory and Application in Python
Understand and calculate the most important measure of scale reliability.](https://towardsdatascience.com/cronbachs-alpha-theory-and-application-in-python-d2915dd63586)
- [pingouin.cronbach_alpha](https://pingouin-stats.org/generated/pingouin.cronbach_alpha.html)
- [How to Calculate Cronbach’s Alpha in Python](https://www.statology.org/cronbachs-alpha-in-python/)
- [相関係数行列からクロンバックのαを求める](https://onoshima.github.io/stat/cronbach/)
Mysql2::Error::ConnectionError (Access denied for user ‘ユーザー名’@‘ホスト名’ (using password: YES)):の対処法

#問題

直訳ですがRails s でサーバーを起動したが、Mysql のアクセスに拒否されたと言うことでエラーが出てしまいました。


#解決策

config/database.yml のパスワードを修正する必要があるようです。
password を Mysql のパスワードと同じにします。




```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: 任意のユーザー名
  password: 任意のパスワード
  socket: /tmp/mysql.sock
```

この password を Mysql のパスワードと同じにします。

尚、Mysql のパスワードはMysql に接続した後、以下の方法で設定、変更できます。

```
mysql> set password for ユーザー名@ホスト名=password(‘設定したいパスワード’);
```

ユーザーとパスワードの対応はこれで。

```
mysql> select user, host, password from mysql.user;
```


#参考

参考にさせていただきました。ありがとうございます。

https://uxmilk.jp/12396
Docusaurusを始める

# Docusaurusとは

- ドキュメントサイトを作れるツール。
- Markdownでドキュメントを書く → Docusaurusで静的HTMLを生成 → ホスティングという流れで使う。
- バージョンごとのドキュメント、国際化、検索、ダークモード、テーマのカスタマイズに対応している。
- Reactベースで作れている。
- Facebookが作っているOSS。
- 競合ツールとしては次がある
    - GitBook
    - honkit
    - MkDocs
    - docsify

# Docusaurusを試す

## インストールと起動

Node.jsをインストールした環境で次のコマンドを実行する:

```zsh
npx @docusaurus/init@latest init my-website classic
```

my-websiteにコードが生成されるので、そこへ行き開発サーバーを起動する:

```zsh
cd my-website
npx docusaurus start
```

起動するとサイトがブラウザに表示される。

![CleanShot 2021-09-30 at 09.04.49@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/3143a8cb-4e41-7ff5-d532-c90c6192eafc.png)


## ページを作る

Docusaurusでは、src/pagesにファイルを作るとそれがページになるという仕様になっている。ファイルとURLの関係は次のようになる。

- src/pages/index.js -> localhost:3000/
- src/pages/foo.md -> localhost:3000/foo
- src/pages/foo/bar.js -> localhost:3000/foo/bar

### Reactコンポーネントでページを作る

ためしに、Reactコンポーネントでページを作ってみよう。src/pages/my-react-page.jsにファイルを作り、内容は次のようにする。

```js
import React from 'react';
import Layout from '@theme/Layout';

export default function MyReactPage() {
  return (
    <Layout>
      <h1>My React page</h1>
      <p>This is a React page</p>
    </Layout>
  );
}
```

ファイルを保存したら、`http://localhost:3000/my-react-page`にアクセスする。すると、たった今作ったページが表示される。

![CleanShot 2021-09-30 at 09.09.23@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/8ecd3c9b-b3fc-3ead-0b71-36f2521d2e64.png)


### Markdownでページを作る

今度はMarkdownでベージを作ってみよう。`src/pages/my-markdown-page.md`にファイルを作り、内容は次のようにする:

```md
# My Markdown page

This is a Markdown page
```

作ったページは`http://localhost:3000/my-markdown-page`を開くと見れる。

![CleanShot 2021-09-30 at 09.11.42@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/c9295ad3-d24c-08ad-0b31-4d5688aa4bea.png)


## ドキュメントページを作る

ドキュメントページは上で作った普通のページとは異なり、次のような特徴が出る:

- サイドバー(目次)に表示される
- 前後ページのナビゲーションのがつく
- バージョニングできる

### ドキュメントページをMarkdownで作る

`docs/hello.md`に次の内容でファイルを作る:

```md
# Hello

This is my **first Docusaurus document**!
```

このページは`http://localhost:3000/docs/hello`にアクセスすると見れる。

![CleanShot 2021-09-30 at 09.15.37@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/9ea64a30-7201-a335-6e47-05042b0a8e20.png)


### サイドバーをカスタマイズする

frontmatterを設定すると、サイドバーに表示されるページタイトルを任意に変更できる。

```md
---
sidebar_label: 'Hi!'
sidebar_position: 3
---

# Hello

This is my **first Docusaurus document**!
```
Veturで"Type annotations can only be used in TypeScript files."が出る場合

TypeScript化したVue.jsプロジェクトに過去のVue.jsプロジェクトからコンポーネントを移植してTS化していた際、Veturが`Type annotations can only be used in TypeScript files.`とエラーを出して型定義をさせてくれませんでした。

## 原因
凡ミス中の凡ミスですが、原因は`<script>`タグに`<script lang="ts">`と記載していないことでした。


## 参考
[Couldn't resolve 'types' can only be used in a .ts file. Vetur(8010) #1347](https://github.com/vuejs/vetur/issues/1347)
e-statの研究

#概要

官製lod、e-statを研究してみる。

#方針

sdgsの視点、社会起業家の視点で、研究してみる。

#サンプルコード

```
var src = document.getElementById('src');
var out = document.getElementById('out');
var endpoint = "https://data.e-stat.go.jp/lod/sparql/alldata/query";
function run() {
	var query = src.value;
	var xhr = new XMLHttpRequest();
	xhr.onreadystatechange = function() {
		if (xhr.readyState == 4 && xhr.status == 200)
		{
			out.value = JSON.stringify(JSON.parse(xhr.responseText).results.bindings, null, 2);
		}
	};
	xhr.open("POST", endpoint, true);
	xhr.setRequestHeader("Accept", "application/sparql-results+json");
	xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	xhr.send("query=" + encodeURIComponent(query));
}

```

#成果物

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

以上。
React v17から学んだEvent Delegationについて

こんにちは、Another works フロントエンドエンジニアのみやぞんです。
つい最近、Reactのアップデートを行ったので React v17 での変更で学んだことについて紹介したいと思います。

##アップデート内容
- 新機能 “なし”
- 段階的なアップグレードが可能になった

公式：https://ja.reactjs.org/blog/2020/10/20/react-v17.html



## 破壊的変更があった部分
アップデート内容にもあった「段階的なアップグレード」を実現するための変更が「Event Delegationの変更」です。React v17 における最も大きな変更と言えます。
公式の言うEvent Delegation(イベント委譲)の変更とは、イベントハンドラが登録される方法が変わったということです。 これまではdocumentオブジェクトで全てのイベントをハンドリングしてましたが、v17 からは ReactDOM.render() の第二引数で渡された要素上でイベントをハンドリングします。
(Event Delegationでイベントのハンドリング場所を一箇所に集めることのメリットはメモリ節約やコード量の点にあるみたいです。)

以下の図は公式からの引用です。

![react_17_delegation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386799/c5777211-87e3-d6af-65cd-dfedc6ff9325.png)
￼
この図にある通り、React は DOM の Event Delegation を利用して document にイベントハンドラを登録しています。 DOM の Event Delegation については W3C の図を引用します。

￼
## Event Delegation

![20201030001442.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386799/3f399a33-5add-65b5-b0bb-90f3c2716f7d.png)

https://www.w3.org/TR/uievents/#event-flow より
DOMのイベント実行までの流れには以下のようなフェーズがあります。

#### Capture Phase
イベントオブジェクトはターゲットの親たちを経由して Window からターゲットの親要素へと伝搬します。

#### Target Phase
イベントオブジェクトは、イベントオブジェクトのイベントターゲット(イベントがトリガーされる場所)に到着します。

#### Bubbling Phase
イベントオブジェクトはターゲットの親たちを逆順に伝搬し、ターゲットの親から始まり、Window で終了します。


これまでのReactではインラインで宣言したonClickなどのイベントはdocument.addListenerされます。つまり、イベントの登録をdocumentに対して行います。
デフォルトではバブリングフェーズでイベントが発火するので、この場合だと発火するタイミングは「要素をクリックしてバブリングフェーズに入ってからdocumentまでさかのぼったとき」です。

一方でReact v17では、documentではなくその下のReactをマウントしている部分(RootNode)に登録されます。なので、イベント発火のタイミングはバブリングフェーズでRootNodeに到達したときとなります。

## 実際のコード
これで何が変わるのかというと、Reactの外にaddEventListenerにてイベントハンドラを登録しているときの挙動です。例えばReactのRootNodeよりも上層のbodyやdocumentに対して addEventListener を使いイベントハンドラを登録している場合にReact v17へのアップデートで違いが出ます。

- React v16
https://codepen.io/hk206/pen/wvexLwy

- React v17
https://codepen.io/hk206/pen/MWoBMYx

上記のコードは、React v16, v17でそれぞれ同じコードを書いているのですが、挙動が異なります。
このコードには　body　に対して登録したイベントと、ボタンにインラインで指定したイベントがあります。ボタンをクリックしたときは**e.stopPropagation()**によりバブリングを止め、そこから上層のイベントは発火しないように制御できます。
このコードで実現したかったのは、ボタンを押したときはボタンに書いた処理は走ってほしいけど、bodyをクリックしたときの処理は走らせないというものです。

### React v16
React v16の場合はクリック時にどちらも走ってしまいます。なぜでしょう？
これは冒頭にも説明したとおり、インラインで書かれたイベントはdocumentオブジェクトに登録されるからで、処理としてはボタンをクリックしてからバブリングフェーズでbodyの処理がはじめに発火し、それからさかのぼってdocumentに登録されたイベントを発火します。stopPropagationを実行するときにはすでにbodyは通過しているため、思ったような挙動にはなりません。

### React v17
ここではReactのRootNodeがbodyよりも下にあることを前提とします。
React v17ではちゃんと意図したとおり、ボタンクリックの場合はボタンの処理のみ、その外をクリックしたときはbodyに登録した処理が走っています。これはインラインで記述したイベントの委譲先がdocumentではなくReact RootNodeになっているからで、stopPropagationはbodyの下にあるRootNode要素で実行されるのでバブリングが止まり、bodyの処理が走ることはありません。

## おわりに

これが、今回のアップデートで変更があったイベントハンドラの登録先の変更です。(Event Delegation)

実際のケースでは、例えばモーダルの外をクリックしたときに閉じる処理を実装する場合に、モーダルの最外要素にe.stopPropagation()を記述することでbodyのクリック、つまりモーダルの外側がクリックされた時にだけモーダルを閉じる仕様を簡単に実現することができます。これまでのようにモーダルの外をクリックしたのか、中をクリックしたのかという処理をわざわざ書く必要はありません。

簡単ですが、以上がReact v17へのアップデートで私が学んだEvent Delegationについてでした。
またフロントチームでLT会やプログラミング研究会という機会を活用して技術の深堀りを続けていこうと思います。
【初心者向け】現場で既存の実装を参考にする際のtips(コツ)

##【この記事なあに？】
経験年数一年半のビギナークラスのwebエンジニアによる、
現場経験0~数か月くらいの新米プログラマへ向けた情報共有です。
少しでも役に立てば幸いです。

:::note warn
【注意】
最終的にどう対処するかは、
現場の先輩や上司の方針/指導/判断に従うのが一番だと思います。
この記事は、
「既存機能の実装を参考にするようにしろって言われたけど、なんかやり方とかあるのかしら」
という状態の初心者に向けた、参考程度の内容です。
:::

##【まず自分で探してみよう】
1.社内で過去の実装案件を**まとめて確認できる手段**がないか探す。
　例)confluenceなどの社内wikiに、一覧で見れる表やドキュメントを残していないか
　　 どこかにテスト項目書ファイルを保管していないか

2.エディタやIDE(VSCodeとかEclipseとか)の検索機能で、
　変数や定数、データベースのカラムなど、
　**同じものを利用している機能**がないか探す

3.使えそうなものがないか**試験環境を操作**して探す
　(現場へ参画して日が浅く、開発中のサービスへの理解が浅い時点であれば、
　ソースを見ながら色々触るのは理解を深められる行為としてもってこいなはずなので、
　適度にやると効果的)

##【わからなかったら先輩や上司に相談しよう】
自分ひとりじゃサッパリ分からないとか、なんか考慮漏れしてるかも…、
というときは、自分が分かってる部分、考えたことなんかを手土産に、
上司や先輩に相談すると良いです。

特に、そのサービスの開発に長く携わっている人は、サッと答えを出せる可能性が高いです。

「ああ、それならいついつに僕が実装した、この機能を参考にしたらいいよ」
「それだとこういうケースに対応できないから、そこだけこれを参考にして考え直してみて」
なんて答えがもらえるかもしれません。

##【結局のところ】
上司や先輩とチームとしての連携ができていて、
どんな風に過去の実装を参考にしたらいいか、
自分一人で対処できない問題にどうチームで取り組んでいくかという、
**仕事の仕方**が共有されていれば、
そんなに困らない部分ではないかと思います。

でも**連携不足**だと、
無駄に時間を浪費してしまったり、
微妙に参考にならない機能を自分で見つけ出してそれを参考にしてしまうこともあります。

この一年二年くらいで、強制的にリモートワークをはじめた現場は、
円滑なコミュニケーションをとるノウハウがなく、
新人のリモートでの扱いに慣れていないケースもあると思います。

なので新人としてこれに困ったときは、上司や先輩に**素直にSOS**を出して、
・その現場で過去の実装はどんなふうに掘り返しているのか、
・探す際に使えるものはどんなのがあるか、
みたいな仕事の仕方を聞いてみると自分を救える可能性が高いと思います。
**（たとえ「今更そんな初歩的なこと聞くなんて…」と思ってしまうくらい、
　参画して時間が経っている気がしたとしても）**


場合によっては、
「自分でなんとかする能力を培って欲しくて、あえてやり方を伝えていなかった」なんて、
**知らぬ期待と教育**を施されているケースもあるので、そういうのを明らかにするためにも、
時間がかかり過ぎるようなら手土産をもって**SOS**を出しましょう。

**自分でできることはした**という部分がクリアできていれば、
たいていはお小言なしで教えてもらえると思います。

##【そもそも】
今回記事にした内容に限らず、
新人である自分に**仕事の仕方**が伝えられていない場合、
上司や先輩の中では**なんとなく上手くいってる部類**の、
仕事の仕方において**ふわっとした部分**として処理されている可能性もあります。

質問してみると
「確かに自分ってそれどうやってるんだっけ？なんで上手くやれてるんだろ？」と、
**整理し直して共有**してくれるかもしれません。

ただし、コミュニケーション不足で**伝える機会がなかった**というケースも有り得るので、
どんなに上司や先輩が忙しくても、**自分からまずSOSを出してみる**のが大事だと思います。

「どうしたらいいかわかんないです！」と思いっきり泣き叫びましょう。

**心の中で泣いてても、上司は気づいてくれないので…。**
プログラマがQAチームのためにできる5つの事

プロジェクトに所属する一人のプログラマとして、
QAチームのために自主的にやっている事をまとめました。
エビデンスは無い為、ツッコミ大歓迎です。

# 1．影響範囲を過不足なく伝える
例えばログイン機能へエラー処理を追加した場合に
> 影響範囲：ログイン画面

と書いてしまうと、QAチームはログイン画面のUIと挙動の全てを検証する羽目になってしまいます。
エラー処理を追加しただけなら、UIやログイン成功時の処理は影響範囲外のはずです。
この場合は

> 影響範囲：ログイン画面のログインボタン押下時の異常系

と書くことで、QAチームが必要最小限の検証で済むようにしています。


# 2．検証中に遭遇する既存バグを、事前に伝える

プログラマは影響範囲を細かく把握しているため、検証中に見つかったバグがデグレか既存バグか容易に切り分けできます。
しかしQAチームが切り分けする場合は、古いバージョンと動作を比較する必要があるため時間がかかります。

そこで、自分が行う単体試験中に見つかった既存バグは起票し、検証を依頼するタイミングでその既存バグを伝えることで、QAチームはバグの切り分けをしないで済むようにしています。

# 3．試験方法を伝える

例えば通信速度が遅い環境で起きるバグを修正した場合、試験に使える方法(Network Link Conditionerなど)を伝えることで、QAチームが効率的に検証が行えるようにしています。
また、アプリ内にデバッグメニューを用意している場合は、その使い方も伝えています。

# 4．起こりうるバグを伝える

複雑な実装をしたり影響範囲が非常に広い場合、検証の難易度は高くなります。
例えばバックグラウンドで定期的に行う処理は、動作が目に見えないため試験項目が漏れやすいです。

そのようなケースでは影響範囲と合わせて「起こりうるバグ」を伝えています。
例えばバックグラウンドで行われるニュース自動取得機能を修正した場合、「起こりうるバグ」は以下になります。

* アプリを再インストールした場合に、ニュースがしばらく表示されない
* アプリ起動時には記事が更新されるが、10分後に記事が自動更新されない
* サーバ上で非公開になった記事がアプリ上で表示され続ける

これらを伝える事で、QAチームは
「そのバグが起こりうるなら、あのケースも確認したほうがいいな」
とイメージできるようになり、検証の精度が向上すると考えています。

# 5．感謝を伝える
QAチームがバグを検出してくれるからこそ、我々プログラマは安心して開発に集中できます。
そのためQAチームに検証のお礼を伝えるようにしています。

QAとエンジニアの関係が良好になれば心理的安全性が高まり、コミュニケーションが活発になることでバグを大きく減らせると考えています。
Flutter for webでビルドしたファイルをAWS S3にホスティングしてみる

## はじめに
Flutter for webでビルドしたファイルをAWS S3にホスティングして簡易的に公開してみました。

## 前提
Flutter for webのプロジェクトが作成されていること。
AWSが使用できること。

## 手順
作成してあるプロジェクトのディレクトリ内で以下のコマンドを実行し、Web向けにbuildを行います。

```terminal
$ flutter build web --release
```

処理が終わるとbuildという名前のディレクトリが作成されます。

次にAWS S3のバケットを作成します。このとき以下のように「パブリックアクセスをすべてブロック」のチェックを外して作成を行います。
![スクリーンショット 2021-09-30 7.26.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1568184/e947de6b-62ce-b139-8b5a-a3ca88db7411.png)

作成されたバケットに対し、アップロードを行います。
アップロードするファイルは先ほど作成されたbuildディレクトリにあるwebディレクトリの中身すべてになります。このときwebディレクトリ自体をアップロードするのではなく、中にあるファイル、ディレクトリをアップロードしてください。
アップロードすると以下のようになります。
![スクリーンショット 2021-09-30 7.44.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1568184/403aef80-303d-9647-571f-bfbafd6cf2dc.png)

次に、アップロードしたファイルをすべて公開にします。
![スクリーンショット 2021-09-30 7.49.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1568184/67cab387-6f85-1c0a-7738-5f81c5cf1ced.png)

以下のように、バケットのプロパティから静的ウェブサイトホスティングの編集をクリックし、設定を行います。
![スクリーンショット 2021-09-30 7.55.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1568184/42d81c90-c640-67d7-ad2b-c17a28c032db.png)

バケットのプロパティの静的ウェブサイトホスティングの項目にあるURLをクリックすることで、公開されたサイトにアクセスすることができます。
![スクリーンショット 2021-09-30 8.25.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1568184/86c198e8-c9cb-b703-c310-388659bdfb68.png)


# 参考
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html
キューが関係する数式

今一つ理解できんかったなぁ。

```
 AND( 
 ISCHANGED( Status ),
 ISPICKVAL(Status,'Completed'), 
 $Profile.Name = 'Profile 1', 
 Owner:Queue.QueueName <> 'Sales',
 OR(
 RecordType.DeveloperName = 'abc', 
 RecordType.DeveloperName = 'xyz'
 ) 
 )
```

[profile1 should be able to Complete the case only if the Case Owner is queue:sales-->where do I add the queue](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000BsTNYSA3)


これも良く分からん
+ [Record Trigger, with a scheduled path, Flow formula - Evaluating whether Lead owner is queue](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007XEp7O)
MySQLへのつなぎ方

##データベースを作成する
```
mysql -u root -p
```
-u ユーザー名
-p パスワード認証

MySQLにログイン完了後、kakekomi(私が作成したいデータベース名)というデータベースを作成します

```
mysql> CREATE DATABASE `kakekomi`;
```

作成したデータベースを確認するには

```
mysql>show databases;
```

下記のような表示されます。

```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| easywms            |
| kakekomi           |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.01 sec)
```

PHPに戻って、エンコード数の設定を記述（これをやっておかないとHEROKUした時にエラーのオンパレードとなる）

````php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        \Schema::defaultStringLength(191);
    }
````
##envを設定する。

```php:.env

//直すべきとこ３つ
DB_DATABASE=kakekomi→DB名
DB_USERNAME=root→mysqlのユーザー名
DB_PASSWORD=secret→ご自身のmysqlのパスワード
```

##DATABASEも設定しよう
```php:config/database.php

//上の設定と同じように３つ合わせよう
'mysql' => [
//　　　　　　　　　　　　　　　　　　　　　：
//　　　　　　　　　　　　　　　　　　　　　：
     'database' => env('DB_DATABASE', 'kakekomi'),//DB名
     'username' => env('DB_USERNAME', 'root'),//mysqlのユーザー名
     'password' => env('DB_PASSWORD', 'secret'),//→ご自身のmysqlのパスワード
//　　　　　　　　　　　　　　　　　　　　　：
//　　　　　　　　　　　　　　　　　　　　　：
],

```

#### 懺悔、、
私はバカでした。皆様のありがたい記事を拝見しながら、記事に書かれているpassword=>secretを鵜呑みにして、そのまま入れていました。自分のパスワードに決まってるでしょ！
SQL文 DROP・TRUNCATE・DELETE 全て削除命令だけど何が違う？

##はじめに
どうも、未経験からエンジニア転職を目指しているもきおです。

実務案件にて一度MySQLのレコード(テーブルデータ)を削除してそこからまたレコードを入れ直す必要があり、SQLの削除命令を調べると色々とあるみたい。

ここで今回は3つの削除命令のそれぞれの違いをまとめていきたいと思います。

※キー制約に関しては以下の記事にまとめてるので良ければそちらもご覧ください！

https://qiita.com/mokio/items/6a4a76c7d4c962860ea4

※10/1日追記
TRUNCATEではロールバック出来なくなることを追記しました。

##DROP
テーブルを<font color="red">**完全に削除**</font>

```bash:構文
DROP TABLE テーブル名;
```

![スクリーンショット 2021-09-30 6.14.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/4b714a10-eb5e-bc32-77d3-e73fe5fb016b.png)

テーブル情報を跡形もなく消し去る命令文
<font color="red">**テーブル設定（索引やキー制約）も削除**</font>
##TRUNCATE
テーブル内レコード(挿入したデータ)を全削除、<font color="red">**オートインクリメントはリセット**</font>
テーブル情報は残ります。
<font color="red">**注意：**</font>TRUNCATEするとロールバックはできなくなります。
###ロールバック(ROLLBACK)
実行されるとトランザクション中の処理が取り消され、トランザクション実行前の状態に戻りトランザクション前の状態に戻る事。
###トランザクション(TRANSACTION)
複数のSQL文をまとめて一つの処理としてまとめてデータベースへ反映させること。
一連の流れの途中で処理が止まってしまうと問題がある処理の際に利用される。

ここら辺は後日また記事にしたいと思います。

```bash:構文
TRUNCATE TABLE テーブル名;
#WHERE句で条件指定することはできない
```

![スクリーンショット 2021-09-30 6.14.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/98d6fc84-e316-4ab8-09f4-65c561ca0be4.png)

図のようにオートインクリメントはリセットされるので、TRUNCATEした後にまたデータを挿入するとid番号がリセットされた状態で割り振られます。

###ところでオートインクリメントって何？
PRIMARY KEYにオプションで付けることが出来る要素で、idを指定せず挿入してもid番号が自動的に割り当てられるオプションのこと。オートインクリメントを設定しておけばデータ挿入時にいちいちid=5とか記載しなくても自動でidが割り振られる便利なオプションです。



##DELETE
テーブル内レコードを全削除、または条件に一致したものだけ削除。
<font color="red">**オートインクリメントリセットされない**</font>

```bash:構文
DELETE FROM テーブル名;
```
![スクリーンショット 2021-09-30 6.15.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1089852/8e8979cd-d4df-b678-9665-66e173d206be.png)

オートインクリメントはリセットされないので図のようにid番号が引き継がれた状態で割り振られます。

##あとがき
いかがでしたでしょうか？
今回の実務ではDELETEだとidがどんどん蓄積されてしまうのでTRUNCATEが適していたと結論付けられました。
このUdemyを参考に作成させていただきました。

https://www.udemy.com/course/aws-rds-mysqlsql/

最後までご覧いただきありがとうございました！
この記事が少しでも良いと感じていただけましたらLGTMポチッとしていただけますと幸いです。
Flutter for webの開発環境をdockerで動かしてみる

# はじめに
ローカル環境にインストールしたくないけど、Flutterを試してみたい！という方向けに書いてみました。
Googleが開発したモバイルアプリケーション開発用のフレームワークで、dartという言語を使用しています。一つのソースコードでiOSやAndroid、Web向けのアプリを作成することができます。
今回の記事ではWeb向けの開発環境を動かしてみます。

# 環境
macOS Big Sur
Docker version 20.10.7

# 前提
dockerがインストールされていること

# 手順
まずはじめに、作業用ディレクトリを作成します。

```terminal
$ mkdir flutter_study
$ cd flutter_study
```

dockerのimageをプルします。
imageは[cirrusci/flutter](https://hub.docker.com/r/cirrusci/flutter)を使用させていただきます。

```terminal
$ docker pull cirrusci/flutter:stable
```

プルし終わったら、コンテナを立ち上げます。

```terminal
$ docker run --name flutter -d -p 8888:8888 -it -v ${PWD}:/build --workdir /build cirrusci/flutter:stable
```

立ち上げたコンテナに入ります。
 
```terminal
$ docker exec -i -t flutter bash
```

Flutter for webを使用するように設定します。

```terminal
# flutter config --enable-web
```

プロジェクトを作成します。

```terminal
# flutter create flutter_sample
# cd flutter_sample
```

作成されたプロジェクトを実行します。

```terminal
# flutter run -d web-server --web-port=8888 --web-hostname 0.0.0.0
```

ブラウザで http://localhost:8888 を開いてみてください。
以下のようなページが表示されば成功です。

![スクリーンショット 2021-09-30 6.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1568184/617f5ced-b4f7-576c-8ea5-6dfe2290c691.png)
Pythonで1行で複数データを扱う方法

Python3で1行でスペースで分けられた複数の数の和を求めるプログラムです。

```python3
# coding: utf-8
# 入力
input_line = input()
#数の和の変数を定義
goukei=0
#スペースで仕切って数字を取り出す
for num in input_line.split():
#データを整数型に変換して合計を求める
    goukei += int(num)
#合計を標準出力する
print(goukei)
AWS Dev Day Online Japanを視聴したので、その記録

https://aws.amazon.com/jp/about-aws/events/2021/devday/

AWS Dev Day の 9/28, 29 の資料寄せ集めです。ちょっとしたメモだったりが混ざっており、ごった煮です。


## Day2 General Session

https://twitter.com/akitsukada/status/1443063990112821254?s=20

### Customer Obsession
https://www.amazon.co.jp/b?ie=UTF8&node=4967768051

### PR FAQs for Product Documents
https://medium.com/agileinsider/press-releases-for-product-managers-everything-you-need-to-know-942485961e31

### Weekly Business Review
https://medium.com/@samirlakhani/things-i-liked-about-amazon-4495ef06fbda

各KPIを週次でレビューする、WBR（Weekly Business Review=週次経営会議）

### Two-Pizza Team
https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/two-pizza-teams.html

印象に残った話のメモ: 

> ネームブランドだけで定着しない、エンジニアは売り手市場 (Amazonですらそうなんだ)。いかに定着してもらうか。「上に行けば偉い」わけじゃない。楽しい環境づくりをして、喜んでもらって仕事する。社内のメンバーであっても楽しさの提供。難しいけど、「成長」しかない


## アプリケーション開発者は Amazon ECS あるいは Kubernetes をどこまで知るべきか

https://speakerdeck.com/toricls/you-build-it-you-run-it

### You build it, you run it

https://aws.amazon.com/blogs/enterprise-strategy/enterprise-devops-why-you-should-run-what-you-build/

### The Twelve-Factor App

https://12factor.net/ja/

https://www.slideshare.net/AmazonWebServicesJapan/the-twelvefactor-appaws

### 責任共有モデル

https://aws.amazon.com/jp/compliance/shared-responsibility-model/


https://twitter.com/toricls/status/1443164877585989632?s=20



## まとめ

https://hackmd.io/2hJK3N_WQcWp36AgHiWuNA?view



## ほか資料

### LayerX インボイスのAI-OCRを支える非同期処理アーキテクチャ

https://docs.google.com/presentation/u/1/d/1-eGkBHpMVGjvOhrDpJfvPHX1AasXtHunAmYJHEJLtaY/edit#slide=id.gebbd5bab07_0_468

### AWS CDK はどう使いこなすのか、初期開発から運用までのノウハウ

https://twitter.com/tmk2154/status/1442823883401302018?s=20

https://dev.classmethod.jp/articles/aws-devday-online-japan-know-how-from-initial-development-to-operation-on-how-to-use-aws-cdk/


### プログラミング学習サービスのこれまでを支えてきた技術と、これからを創っていく技術

https://twitter.com/ProgateJP_inc/status/1442733029265330180?s=20


### 2021年版、サーバーレスのテスト手法を考える

https://speakerdeck.com/_kensh/serverless-testing-2021


### Amazon Auroraを活用したソーシャルゲームの複数ワールドデータ統合

https://speakerdeck.com/fujiwara3/aws-dev-day-online-japan


### 1,000+のCloudWatch Alarmsを自動生成する技術

https://speakerdeck.com/hiroga/aws-cdk-technics-to-generate-1-000-plus-cloudwatch-alarms


### AWSにおけるアプリチームとインフラチームのコワーク設計

https://speakerdeck.com/iselegant/co-working-design-about-app-and-infra-on-aws


### SageMaker StudioとStep Functionsを用いてMLOpsへの一歩を踏み出そう

https://speakerdeck.com/takapy/sagemaker-studiotostep-functionswoyong-itemlopshefalse-bu-wota-michu-sou

### AWS Step Functions × AWS SAMで実現する家族ノートの低運用コストETL基盤

https://speakerdeck.com/shoichiron/kazokunote-stepfunctions-awssam-etl

### AWS Amplifyを軸にした フルサーバーレスなアプリケーション構成
https://speakerdeck.com/seike460/full-serverless-application-on-aws-amplify


以上です。
Git 基本知識

#Gitの準備

###-共同開発とGitの役割-
####共同開発は３つにステップがある。
[step1]コードを変更する
[step2]共有する準備をする
[step3]共有する
・共同開発では、自分のかいたコードを他の人に共有する必要があり、この共有のところがGitのの活躍する場。

```
git init
```
・gitリポジトリを新しく作るためのコマンド。
・このコマンドを実行することで、gitディレクトリができる。

```
git status
```
・現在のGitの状態を表示するコマンド。
・このコマンドを実行すると、現在いるブランチ、ファイルの状態変化（編集やインデックスの追加）が確認できる。
・自分が変更したファイルのファイル名を表示する。変更があったファイル（addされてないファイル）は赤色で表示され、変更後（addされたファイル）は緑色で表示される。

```
git diff
```
・変更内容を把握するコマンド。追加されたコードが緑色で表示。

#git confing　（Gitの設定）

```
git confing --list
```
・コマンドで実行した場所で有効になっている設定項目と設定項目とその設定値が全て表示される。

```
git confing --global user.email メールアドレス
```
・メールアドレスの設定。

```
git confing --global user.name '名前'
```
・名前の設定。

#git add -----変更内容をインデックスに追加するコマンド

```
git add ファイル名
```
・個別のファイル単位で追加。

```
git add ディレクトリのパス/*
```
・特定ディレクトリ以下のファイルをまとめて追加。

```
git add -A
```
・全ての変更をまとめて追加（追跡対象でないファイルも含む）。
・便利なオプションだが、余計なファイルが追加されていないか 'git status' などで確認する。

#git commit 

```
git commit -m 'コミットメッセージ'
```
・インデックスに追加された変更内容をコミットするコマンド。　

#git log

```
git log
```
・過去のコミット情報一覧を見るためのコマンド。

#git show -----過去のコミットの詳細を確認するためのコマンド

```
git show　コミットID
```
・コミットの情報や差分を見る。

```
git show　コミットID:ファイル名
```
・特定コミット時点でのファイルの状態を見る。

#git checkout -----ブランチの作成と移動ができる

```
git checkout -b ブランチ名
```
・ブランチの作成（同時にブランチを移動する）。

```
git checkout ブランチ名
```
・ブランチの移動。

#git branch -----ブランチの作成や削除、一覧の確認などができる

```
git branch
```
・ローカルリポジトリのブランチ一覧を表示する。

```
git branch ブランチ名
```
・ブランチの作成（ブランチの移動は行わない）。

```
git branch -d ブランチ名
```
・ブランチの削除（マージされていないブランチも削除）。

```
git branch -D ブランチ名
```
・ブランチの削除（マージされていないブランチも削除）

#git merge 

```
git merge ブランチ名
```
・現在いるブランチに別のブランチをマージする。

#git reset -----変更を取り消してコードをを以前の状態に戻す

###コミットのみを取り消す（--soft）

```
git reset --soft 取り消しするコミットコード
```
・コミットのみ取り消す。コミットは削除されるが、コミットに含まれていたコードの変更はインデックスに残された状態になる。

```
git reset --soft HEAD^
```
・直前のコミットを取り消しする場合。

###コミットとインデックスを取り消す（--mixed)

```
git reset --mixed 取り消しするコミットコード
```
・コミットとインデックスの変更を取り消す。コード変更は作業ツリーに残された状態になる。

```
git reset --mixed HEAD^
```
・直前のコミットとインデックスを取り消す。

###コミット内容を全て取り消す（--hard）

```
git reset --hard 取り消しするコミットコード
```
・変更を全て取り消す。一度取り消してしまうと先に戻すことはできないので扱いは注意（リモートリポジトリにコミットが残っている場合は別）。
・やりがちなミスとしてuntrackedな状態のファイルが消せない。untracked状態のファイルはGit操作の対象外なのでgit reset時に戻すため、一度　「git add ファイル名　-N」でGit管理下に追加する。

```
git reset --hard HEAD^
```
・直前のコミット内容を全て取り消す。

##git log

```
git log
```
・コミットIDの確認。

```
git log -p
```
・変更内容を見る。表示内容が多い時は、上下キーで移動して「Q」で終了。

##git add HEAD

```
git add HEAD ファイル名
```
・特定のファイルの取り消し。

#リモート、リモートリポジトリ（共有ファイルの置き場。ファイルをアップロードしたり、ダウンロードをする。）

##git remote　-----リモートブランチに関する操作を行う

```
git remote add リモートブランチ名　URL
```
・リモートブランチを登録。

```
git remote -v
```
・リモートブランチの確認。

#git push -----ファイルにアップロード

```
git push -u リモートリポジトリ名　ブランチ名
```
・登録したリモートリポジトリをファイルにアップロード→このアップロードをプッシュという。
・リモートブランチ（コミット）をpush（upstreamブランチが設定されていない場合）。

```
git push
```
・リモートブランチ（コミット）をpush（upstreamブランチが設定されている場合）。

###＊upstreamブランチとは
・リモート上にあるローカルブランチに対応するブランチのこと。
・ローカルブランチでpushやpullの操作をすると、upstreamブランチに対してその操作を行う。

#git pull -----ファイルをダウンロード

```
git pull リモートリポジトリ名　ブランチ名
```
・リモートリポジトリからファイルをダウンロードする。→このダウンロードをプルという。

```
git pull
```
・今いるブランチの最新コミットを取得する。
Djangoでよく使うQuerySetを共通化する

# Managerを使う

結論からお話しすると`Manager`を使用します。
もちろんこのほかにも方法はありますがこの方法が一番ベターかと。

#実装する

今回使用するmodels.pyはこちら。

```python:models.py
class Charge(models.Model):
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    month = models.DateField()

    class Meta:
        db_table = "charge"
```
## カスタムマネージャーを追加


`Charge`モデルからidを元に一つのオブジェクトを取得するメソッドを追加します。
そして次に`Charge`モデルのカスタムマネージャーをモデルに追加します。

```python:models.py
from django.core.exceptions import ObjectDoesNotExist

class ChargeManager(models.Manager):
    def find(self, charge_id):
        queryset = self.get_queryset()
        try:
            return queryset.get(pk=charge_id)
        except ObjectDoesNotExist:
            return None

class Charge(models.Model):

# ...
# カスタムマネージャーを追加
    objects = ChargeManager()
```

これで`Charge.objects.find("charge_id")`と書くことで実行することができます。
この方法では`Manager`に複数のメソッドを持たせてそれを組み合わせてより複雑なクエリセットを作ることも可能です。

# 参考

https://jairvercosa.medium.com/manger-vs-query-sets-in-django-e9af7ed744e0
【Python】PyPIでのトークン認証でハマる


#後日談

改めて調べたら、「 ``__token__`` しか使えないよ（意訳）」と説明している記事がありました 0(:3　)～ =͟͟͞͞(’､3)_ヽ)＿

https://qiita.com/que9/items/de1d54c3c37e67dbe798

---

プロジェク別のトークンを作ることができるのですが、こんなことを言われます。

- 全プロジェクト共通で ``__token__`` を使おうとすると警告文が表示される。
- 異なるプロジェクトで ``__token__`` を使うことはできない。
    - つまり、全プロジェクト共通で ``__token__`` を使うしかない。

---

#１．はじめに

PyPIの認証でトークンを使うほうがあります。が、次のようなエラーになります。

```sh
$ ./upload.sh testkana dist/sphinxcontrib.kana_text-0.19.0rc1.tar.gz
Uploading distributions to https://test.pypi.org/legacy/
Uploading sphinxcontrib.kana_text-0.19.0rc1.tar.gz
100%|██████████| 24.1k/24.1k [00:00<00:00, 28.1kB/s]
NOTE: Try --verbose to see response content.
HTTPError: 403 Forbidden from https://test.pypi.org/legacy/
Invalid or non-existent authentication information. See https://test.pypi.org/help/#invalid-auth for more information.
```

#２．現状の結論（2021-09-30）

トークンを使う時のユーザー名は ``__token__`` しか使えない。結果としてプロジェクト別にトークンを使い分けることはできない。

次のメリットがあるので、それでもトークンを使うことにする。

- パスワード長は、本来のユーザー名+パスワードより遥かに長い。
- 本来のユーザー名/パスワードが漏洩するよりも、リスクが限定的。

#３．確認したこと

``__token__`` 以外で、次のパターンを確認したけどNGだった。

- ``__`` で挟む、大文字混在 → NG
- ``__`` で挟む、小文字のみ → NG
- ``__`` で挟む、小文字+5文字以内 → NG
- ``__`` なし、大文字混在 → NG

#以上
【Python・Windows】指定ウィンドウを最上部に固定して作業効率を上げるスクリプト

# はじめに
画像などを参考・参照しながら作業したいことってありますよね。
Windowsでは基本的にフォーカスされているウィンドウが最上部に出てくるため、画面を分割表示するなどしないといけません。捗りません。
その画像などが横長ならまだしも、縦長だと目も当てられません。

そこで、ショートカットキーで最上部ウインドウを設定できる簡単なスクリプトを書きました。

# できたもの
```python 
import win32gui
import win32con
import win32api
import time


class TopLevelWindows:

    def __init__(self):
        self.top_window = None

    def toggle(self):
        if self.top_window:
            self.__unset_z_pos_0()
        else:
            self.__set_z_pos_0()
        return

    def __set_z_pos_0(self):
        self.top_window = win32gui.GetForegroundWindow()
        win32gui.SetWindowPos(self.top_window, win32con.HWND_TOPMOST, 0,
                              0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
        print(win32gui.GetWindowText(self.top_window), 'is setted to top.')
        return

    def __unset_z_pos_0(self):
        try:
            win32gui.SetWindowPos(self.top_window, win32con.HWND_NOTOPMOST, 0,
                                  0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
            print(win32gui.GetWindowText(self.top_window), 'is unsetted to top.')
            self.top_window = None
        except Exception as e:
            print(e)
        return

    def quit(self):
        if self.top_window:
            self.__unset_z_pos_0()
        return


def get_key_state(keycode):
    return win32api.GetAsyncKeyState(keycode) >> 15 < 0


if __name__ == '__main__':
    w = TopLevelWindows()
    flag = False
    hz = 2000
    hz_high = int(hz*2**(7/12))
    ms = 100

    while True:
        time.sleep(.5)
        if get_key_state(18) and get_key_state(84): # alt+t

            w.toggle()
            if flag:
                win32api.Beep(hz_high, ms)
                win32api.Beep(hz, ms)
                flag = False
            else:
                win32api.Beep(hz, ms)
                win32api.Beep(hz_high, ms)
                flag = True

```

`win32***`以外をあまり使いたくなかったので、かなり原始的にキーイベントを取得しています。
# 使い方

実行後、`alt+t`でアクティブウィンドウが最上部に固定されます。
もう一度押すと（というか次の0.5秒も押し続けても）、固定が解除されます。
固定（解除）されると、ビープ音が鳴るので目安になります。

batファイルでも作って、デスクトップに放っておけばちょっとした時に便利です。
ascとdescについて

# ascの意味は？
***ascの意味は昇順です。***
1,2,3のように小さい数からからだんだん大きくなっていくものです。
idなら小さい順にデータが並んでいきます。

# descの意味は?
***descの意味は降順の意味です。***
3,2,1のように大きい数からだんだん小さくなっていきます。
idなら大きい順に並びます。

# どちらかがどういう意味　なのか迷った時
プログラミングは暗記ではありませんが、
この２つの意味はすぐにわかるようにした方がいいと思います。

⚫︎覚え方
下の参考資料を引用します。

|asc|desc|
|--|--|
|***aから始まる。abcdで昇順***|***dから「始まるdcbaで降順***|

みたいに考えると理解しやすいかと思います。

# どういうときに使う？
例えばこのような場面で使えるともいます。(ここではRuby on railsのコードを使います)

```rb
@student = Student.order(number: :asc) #例えば出席番号順だと１から最後まで並び替えられます。

@staff = Staff.order(updated_at: :desc) #これはスタッフのデータの更新した順番になります。

@staff = Staff.all.order(id:) #昇順と降順どちらも使わない場合は昇順になるみたいです。
```

⚫︎補足 ```orderとは？```
***orderはデータベースから取得してきたものを並び替えるメソッド***です。


# 最後に
簡単な内容だったと思うのですが初学者の方向けの記事です。
参考になってもらえたら幸いです。


# 参考資料

https://marycore.jp/coding/asc-desc/

https://qiita.com/tsuchinoko_run/items/c31ed7e0b0672e6d898a