OmniAICreator/Qiita-1.07M huggingface dataset:
GW連休明けのエンジニアがコンフォートゾーンを抜け出すための5つの方法

連休明けや新たな挑戦に直面すると、多くのエンジニアが憂鬱な気持ちになることがあります。
しかし、コンフォートゾーンを抜け出すことは成長と進歩につながる重要なステップです。
以下では、エンジニアがコンフォートゾーンを抜け出し、新たな挑戦に向けて自信を持つための5つの方法を紹介します。

# 1.新しい技術に挑戦する:
コンフォートゾーンを抜け出す最初のステップは、新しい技術やツールに挑戦することです。自分が慣れ親しんでいる領域から少し離れて、新しい言語やフレームワークを学ぶことで、自身のスキルセットを広げることができます。例えば、もしバックエンドエンジニアであれば、フロントエンドの基礎を学んでみることも一つの選択肢です。

# 2.プロジェクトの責任範囲を広げる:
自分が担当しているプロジェクトの範囲を広げることで、新たな領域に挑戦することができます。もし、特定のモジュールや機能に絞られている場合は、他の領域にも積極的に関わるようにしましょう。これにより、新たなスキルの習得や他のエンジニアとの協力が増え、自身の成長に繋がります。

# 3.アウトサイドプロジェクトに参加する:
自身のスキルを活かしてアウトサイドプロジェクトに参加することは、コンフォートゾーンを抜け出す良い方法です。オープンソースプロジェクトやボランティア活動、または独自のプロジェクトを立ち上げることで、新たな挑戦や新しい人々との交流が得られます。これにより、自己啓発や新たな視点を得ることができます。

# 4.プレゼンテーションやトレーニングを行う:
自分の知識や経験を他の人に伝えるために、プレゼンテーションやトレーニングを行うことも、コンフォートゾーンを抜け出すための効果的な方法です。他のエンジニアやチームメンバーに向けて、自身の専門知識や技術についてのトレーニングを行ったり、プレゼンテーションを行ったりすることで、自信を深めることができます。新たな役割や責任を担う機会も得られるかもしれません。

# 5.メンターを見つける:
自身の成長をサポートしてくれるメンターを見つけることは、コンフォートゾーンを抜け出す上で非常に重要です。メンターは、経験豊富なエンジニアや業界のリーダーであることが望ましいです。彼らからの指導やアドバイスを通じて、新たなスキルや知識を習得し、自身のキャリアの方向性を見つけることができます。

# 結論:
エンジニアがコンフォートゾーンを抜け出し、新たな挑戦に向けて自信を持つためには、新しい技術に挑戦したり、プロジェクトの責任範囲を広げたりすることが重要です。また、アウトサイドプロジェクトに参加したり、プレゼンテーションやトレーニングを行ったりすることも効果的です。さらに、メンターを見つけることで自身の成長を促進させることができます。コンフォートゾーンを抜け出す勇気を持ち、新たな可能性を追求することで、エンジニアとしての成長と進歩を達成できるでしょう。

# まとめ

エンジニアがコンフォートゾーンを抜け出すためには、以下の5つの方法を試してみることが重要です。

1.新しい技術に挑戦することで、スキルセットを広げましょう。
2.プロジェクトの責任範囲を広げることで、新たな領域に挑戦しましょう。
3.アウトサイドプロジェクトに参加することで、新たな挑戦や交流の機会を得ましょう。
4.プレゼンテーションやトレーニングを通じて、自身の知識や経験を他の人に伝えることで、自信を深めましょう。
5.メンターを見つけて指導やアドバイスを受けることで、成長をサポートしてもらいましょう。
これらの方法を組み合わせて取り組むことで、エンジニアとしてのスキルや自信を向上させ、新たな挑戦に果敢に取り組むことができます。コンフォートゾーンを抜け出す勇気を持ち、成長と進歩を追求しましょう。素晴らしい成果が待っています！

# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
【SwiftUI】SearchBar選択時にPull-to-refreshのインジケータが表示されない

# 環境
Xcode 14.2
Swift 5.7
iOS 15 & 16

# 事象
以下のようにSearchBar（searchable）とPull-to-refresh（refreshable）を両方付けると、SearchBar選択時に下スワイプしてもインジケータが表示されません。ただ、refreshableは呼ばれています。

```swift:TestView
struct TestView: View {
    @State var searchText: String = ""

    var body: some View {
        NavigationView {
            List {
                Text("hoge1")
                Text("hoge2")
                Text("hoge3")
                Text("hoge4")
                Text("hoge5")
            }
            .searchable(text: $searchText)
            .refreshable {
                print("refreshable")
            }
        }
    }
}
```
<img width = 300 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/d39f95f3-af41-14e1-ea66-653b58686e66.png">

# 対応
navigationBarTitleDisplayModeをinline、navigationBarDrawerDisplayModeをalwaysで指定したらインジケータが表示されるようになりました。

```diff_swift:TestView
struct TestView: View {
    @State var searchText: String = ""

    var body: some View {
        NavigationView {
            List {
                Text("hoge1")
                Text("hoge2")
                Text("hoge3")
                Text("hoge4")
                Text("hoge5")
            }
-            .searchable(text: $searchText)
+            .navigationBarTitleDisplayMode(.inline)
+            .searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
            .refreshable {
                print("refreshable")
            }
        }
    }
}
```
<img width = 300 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2647121/43ca640f-171b-4285-7f35-843ddd0a75fc.png">
HTML 代表的なタグと属性

# はじめに
HTMLのタグは100種類以上あり，全部を覚えるのは大変である．本記事では最低でも覚えるべき代表的なタグをまとめる．

# 代表的なタグ
**１．p**
```html
    <p>文章１</p>
    <p>文章2</p>
```
↓結果
![p.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/a7ae9dad-a9db-0a06-d1a0-2eb8ed6809b8.png)
`<p>`タグはパラグラフ(paragraph)の"p"で<ins>段落</ins>を作るときに使う．`</p>`の後ろで必ず改行される．

**２．h1~h6**
```html
    <h1>見出し1</h1>
    <h2>見出し2</h2>
    <h3>見出し3</h3>
```
↓結果
![h.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/579d0d27-7588-29d1-44d2-338bc77b53b0.png)
`<h1>〜<h6>`タグは<ins>見出し</ins>を作るときに使う．数字が大きくなるほど小さい見出しになる．

**３．img**
```html
    <p>下は画像</p>
    <img src="画像.png">
```
↓結果
![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/a294038a-2b93-9609-1f24-d7cac43850c5.png)
`<img>`タグは<ins>画像を貼る</ins>ときに使う．`<img>`タグは終了タグは使わない．

**４．aタグ**
```html
    <p>これはリンクではない</p>
    <a href="指定したリンク先">これはリンク</a>
```
↓結果
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/aaa4ee38-501a-cfc1-708b-d57d6d2901be.png)
`<a>`タグは<ins>リンク</ins>を作るときに使う．リンクをクリックすることで，属性で指定したリンク先に飛ぶ．

**５．ul・ol・li**
```html
    <ul>
        <li>項目１</li>
        <li>項目２</li>
    </ul>
    <ol>
        <li>番号付き項目１</li>
        <li>番号付き項目２</li>
    </ol>
```
↓結果
![li.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/a877466b-7887-8b1f-d71b-382e5b03c184.png)
`<ul>・<ol>・<li>`タグは<ins>箇条書き</ins>を作成するときに使う．項目自体は`<li>`，順序なしの箇条書きには`<ul>`，順序ありの箇条書きには`<ol>`を使用する．

**６．br**
```html
    <p>あいうえお<br>かきくけこ<br>さしすせそ</p>
```
↓結果
![br.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/3dd51dbf-b6b4-9c32-c9aa-612db8ece81c.png)
`<br>`タグは<ins>意図的な改行</ins>を作るときに使う．`<p>`タグでも改行されるが，改行させるために使うべきではない．

**７．div**
```html
<div class="group" style="color: red;">
    <p>本文１</p>
    <p>本文２</p>
</div>
```
↓結果
![div.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/8f5ba6aa-5246-ced7-b45d-0a853973f448.png)
`<div>`タグ自体には特定の意味を持たないが，要素を<ins>グループでまとめる</ins>ために使う．複数の要素をグループ化させることで，複数の要素に同じCSSを適用しやすくなる．

**８．span**
```html
<span class="group" style="color: red;">
    <p>本文１</p>
    <p>本文２</p>
</span>
```
`<div>`タグと同様に`<span>`タグ自体には特定の意味を持たないが，要素をグループでまとめるために使う．`<div>`タグは前後に改行が入るのに対して，`<span>`タグは前後に改行を入れずにグルーピングできるという点が異なる．

**９．hr**
```html
    <p>本文１</p><hr>
    <p>本文</p>
```
↓結果
![hr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3133563/48a911cd-833b-a82f-252a-8a5c866b45d1.png)
`<hr>`タグは文章を区切る<ins>水平線</ins>を作る際に使う．

# 代表的な属性
属性には<ins>特定の要素にのみ指定できる属性</ins>と，<ins>どのタグにも指定できるグローバル属性</ins>の2種類がある．以下はグローバル属性である．

| 属性名 | 役割 |
| :--: | :--: |
| id | 要素に固有の名前を指定する |　
| class | 要素に分類名（種類）を指定する |
| title | 要素に補足情報を指定する |
| lang | 要素内の言語を言語コードで指定する |
| name | 要素に名前をつける |
| href | リンク先を設定する |
| style | 要素に直接スタイルシートを適用する |
CPLEXをPythonで使いたい【CPLEXインストール〜Pythonでの実行まで】

# おことわり
この記事は、研究室のゼミの発表に向けての下書き的な意味合いが強いです。
画像が多すぎたり、逆に説明の至らない箇所が多くあるかもしれないことをご了承ください。
(主に学部生から院生を対象にしていますので、必要に応じて一部読み替えてください)

# 背景
私のいる研究室では、数理最適化ソルバーを使った問題を研究の題材としている人が多いのですが、アカウントの作り方から実際に使えるまでのドキュメントがなく、誰かまとめてくれないかなーという声が挙がったので、私がまとめました。

# 会員登録orログイン
ここからアクセスする。
https://www.ibm.com/academic/topic/data-science

既にアカウントがあるならLogin。
アカウントを持ってないならRegisterで作成する。英語で学位や卒業時期の入力があります。

無料のアカデミック版を使いたいので、学校のメールで登録する。
利用規約は、リンクをクリックして下までスクロールしなきゃチェックが付かないのでお忘れなく。



# インストール
ここからアクセスする(会員登録と同じ)。
https://www.ibm.com/academic/topic/data-science

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/9be4dc41-282a-4d06-17ff-1ce3265ced5f.png)

上のような画面が出てきたら、左上の方にあるCoursewareをSoftWareに変えて、`ILOG CPLEX Optimization`を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/346ba91b-f5b1-659a-5acf-06e652e29c27.png)

上の画像の灰色部分がそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/04ccca20-5b4b-6741-6b9f-473a05a31ebe.png)

ログイン出来ていれば上のような画面になるはずなので、Downloadをクリック。

ここからは、自分のパソコンに合ったものを選んでダウンロードする。
Windowsなら`for Windows x86-64`、Macなら`for OSX(M1ならARM64)`で原則大丈夫なはず。

# ダウンロード出来ない？
もし下の方に`If Download does not start install/re-install Download Director`と表示されていたら、リンクをクリックしてダウンロードする。
ファイルを開くのにJavaが必要だったと思うので、[Java](https://java.com)を入れて無かったら入れておく。


# ダウンロード出来たら

基本的には指示に従えばOK。IBM Download Director Appが開けたら流れでPATH等をデフォルトで設定できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/25e18208-23dc-9395-fabe-16e31248b78a.png)

この画面まで持っていけたら後は待つだけ。

# CPLEXの確認
ターミナル上で`cplex`と入力して、下のようになればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/fbead35d-7556-f839-a323-ecd3e1a6a24d.png)

# バージョンの確認
`python -V`で、パソコンにインストールしてあるPythonのバージョンを確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/1216316c-96ce-5d09-78fc-17f1a7f53d84.png)

下の画像のディレクトリにアクセスして、インストールしたCPLEXがどのバージョンに対応しているか確認する。

こっちはWindows
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/55b9090a-e690-9b65-fabd-98d049188a5a.png)

こっちはMac(アプリケーションから)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835713/40a1e629-1980-65c0-de18-ac6319c50ec7.png)



この例では、どちらも3.8~3.10が対応しています。

# インストールされているPythonが対応していない？
対応している[Python](https://www.python.org/downloads/)のバージョンを入れる必要があります。
Macならpyenvを使った方が利口なのかも？

https://zenn.dev/kenghaya/articles/9f07914156fab5

# setup.pyの実行
[先程](#バージョンの確認)OSごとに画像で示したPythonのバージョンのフォルダの中に、インストールしたcplexのバージョンのフォルダがあり、更にその中に`setup.py`があると思うのでそれを実行します。

ターミナルを開いて`python setup.py install`を実行

もし、新しくPythonをインストールしたなら、バージョンを指定した仮想環境を作って実行するか、`py -3.x setup.py install`のようにバージョンを指定して実行。

実行した後、`pip list`でcplexがあればひとまず安心。

権限がなくて実行できなかったら、管理者権限で実行しましょう。

https://qiita.com/tackky/items/387be5c84f4f119e19ba

https://www.ibm.com/docs/ja/icos/20.1.0?topic=cplex-setting-up-python-api




成功していそうだったら、後はコードを書いて確認するだけです。

# コードを書く
Qiita内でも既にサンプルを用意してくださっている記事がいくつかあるので、それが動くか確かめてみましょう。
任意の場所にファイルを作成して、setup.pyを実行したのと同じ環境で実行してあげてください（仮想環境入るなり、バージョンを指定するなり）

https://yambi.hatenablog.com/entry/20160716/1468673454

解が出れば使えているはずです。
sshをパスワードなしでやりたい!

sshするときに毎回パスワードを求められて、入力するのがめんどくさくなったので、公開鍵認証を用いてパスワードを入力することなくsshが行えるようにしました。

## 公開鍵認証のポイント
公開鍵認証のポイントは、パスワード認証とは違って、認証に必要な秘密情報（この場合は秘密鍵）そのものはネットワーク上に送出されないという点です。また認証に使われる署名は一時的なものであり、再利用はできないため、署名そのものを盗んでも意味がありません。そのためパスワード認証に比べ、通信の盗聴に強いと言えるでしょう。また仕組み上、秘密鍵を推測して偽造することは非常に困難です。こうした理由により、公開鍵認証を採用することで、パスワード認証よりもセキュリティレベルを上げることができるのです。
(引用)ニフラク.“SSH公開鍵認証とは”. ニフラク. 2022/3/29.
https://pfs.nifcloud.com/navi/words/ssh.htm, (2023/05/17)

## 秘密鍵と公開鍵作成する
パスワードの代わりに公開鍵を使って認証をします。そのため、まずは秘密鍵と公開鍵を生成します。
初めにhomeディレクトリに`.ssh`のディレクトリが存在するかどうかを確認してください。
もし存在しない場合は作成してください。
その後`.ssh`に移動してください。

次に以下のコマンドをターミナルで実行してください。
```
ssh-keygen -t ed25519 -C "your_email@example.com"
```
このコマンドは秘密鍵と公開鍵を作成するコマンドです。
実行するといくつかのことを聞かれますので対応をしていきます。
一つ目の質問ではどこになんて名前で保存するかを聞かれます。わかりやすい名前をつけることをお勧めします。ここで何も入力せずに進むと`.ssh`のディレクトリの中に`id_ed25519`という名前で作成されます。
なおこれ以降の説明では`id_ed25519`この名前を使って説明をしていきます。

二つ目の質問ではパスワードをどうするかを聞かれます。ここは何も入力せずに進んでください。
三つ目は二つ目と同じパスワードを入れてくださいと言われますので、そのまま何も入力せずに進んでください。

これで秘密鍵と公開鍵が作成されました。
`.ssh`のディレクトリの中を確認すると`id_ed25519`と`id_ed25519.pub`が作成されていると思います。
名前を変えた場合は変えた名前の鍵が代わりに作成されていると思います。
ここで注意ですがこちらの`id_ed25519`は秘密鍵なので漏らさないようにしてください。

念の為ですが公開鍵のパーミッションを600にしておきましょう。
```
chmod 600 id_ed25519.pub
```

## 公開鍵をログイン先サーバーに登録する

手元の環境の`.ssh`に`config`ファイルを作成してください。
`config`の中に以下のように記述してください。
```
Host お好きなホスト名
  HostName xxx.xxx.xxx.xxx
  User ユーザー名
  StrictHostKeyChecking yes
  PasswordAuthentication no
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes
```

公開鍵をログイン先に転送します。
ローカルの公開鍵をログイン先のサーバーにコピーします。
```
ssh-copy-id -i id_ed25519 ユーザ名@xxx.xxx.xxx.xxx
```

これでログイン先のサーバーにコピーされたはずです。
次に今コピーした`id_ed25519.pub`の名前を以下のようにしてください。
`authorized_keys`

これでsshをするとパスワードを聞かれることがなく快適にログインができるようになったと思います。

```
ssh お好きなホスト名
```
## 参考
https://pfs.nifcloud.com/navi/words/ssh.htm
https://zenn.dev/noraworld/articles/ssh-rsa-sha1-disabled
AWS Certified Machine Learning – Specialty＿勉強メモ（６日目）

# はじめに
標記の資格試験に向けての勉強メモです。

# 勉強メモ
・IP Insightsアルゴリズムはトレーニングデータとして、CSVファイルのみをサポートする（parquetや RecordIO-protobufは使用不可能）。

・推論パイプラインモデル内では、Amazon SageMaker は呼び出しを一連のHTTPリクエストとして処理する。

・コスト効率良く速くトレーニングジョブを完了するためにおすすめの方法
→　データ形式をprotobuf RecordIO形式に変換し、パイプモードを使用する（S3からデータをストリーミング可能）。

・SageMakerアルゴリズムのうち、増分トレーニングをサポートしている組み込みアルゴリズムは、オブジェクト検出アルゴリズム、画像分類アルゴリズム、セマンティックセグメンテーションアルゴリズムの3つだけ。

・/home/ec2-user/SageMaker フォルダー内に保存されたファイルとデータのみが、ノートブックインスタンスのセッション間で保持される。
※ このディレクトリの外に保存されたファイルとデータは、ノートブックインスタンスが停止して再起動されるときに上書きされる。

・パブリックインターネット経由で接続する代わりに、Virtual Private Cloud (VPC) のインターフェイスエンドポイントを介して、VPCからノートブックインスタンスに接続可能。

・プライベートサブネット内のインスタンスは、パブリックサブネット内にあるネットワークアドレス変換(NAT)ゲートウェイを使用してインターネットにアクセス可能。

・Glueジョブは出力をRecordIO-protobuf形式で書き込むことができない。

・Sagemaker Linear Learner アルゴリズムの自動モデル調整を使用すると、線形学習器の内部調整メカニズムが自動的にオフになる。これにより、並列モデルの数、num_modelsが1に設定される。

・L1正則化は、モデル内の特徴の数を完全に減らすもの。
→ 「L1正則化を減らす」とは、モデル内により多くの特徴を保持し、それによってバイアスを取り除くことである。

・L2正則化は特徴の重みを単に削除するのではなく「調整」する。

・modeは、SageMaker BlazingTextアルゴリズムのWord2Vec(教師なし)モードとテキスト分類(教師あり)モードの両方で唯一必須のハイパーパラメータ。

・SageMaker K-meansアルゴリズムの必須ハイパーパラメータ
→ feature_dim（入力データ内の特徴の数）、k（必要なクラスターの数）

・Redshift Spectrumを使用すると、データをRedshiftテーブルにロードすることなく、S3内のファイルから構造化データおよび半構造化データを効率的にクエリして取得可能。

・EMRおよびGlueベースのETLジョブは、Redshiftでデータをクエリする必要があるたびにジョブを呼び出す必要があるため、実用的ではない。
※ クエリが完了したら、コストを節約するためにそのデータを再度削除する必要がある。

・DynamoDBではSQLクエリを使用できない。

・ハイパーパラメータは検証セットに対して調整する必要がある。

・価格がサイズによって異なる場合等は、カテゴリカルエンコーディングを実行する必要がある。

・分散が低い特徴は、モデルがターゲットラベルを予測することを学習するのに寄与しないため、削除する。

# 参考
https://www.udemy.com/course/aws-certified-machine-learning-specialty-full-practice-exams
NeurIPS2022の枝刈り論文 (4)

# 概要

この記事では、[NeurIPS2022](https://nips.cc/)の枝刈り論文を紹介します。[^1]
[その1](https://qiita.com/kyad/items/35e72f05c9423e8f1b08) [その2](https://qiita.com/kyad/items/c5d4f53cdac674a909c0) [その3](https://qiita.com/kyad/items/039b2f46863f418d077a)

[^1]: 画像や数式は論文から引用しています。

# Data-Efficient Structured Pruning via Submodular Optimization

https://openreview.net/forum?id=K2QGzyLwpYG

- 概要：Unstructured枝刈りの手法
- 新規性：理論的に少ないデータでも適用できることを説明できる手法
- キモ：あるレイヤを刈った時次のレイヤに与える影響が最小になるようにする((1)式)。この最適化問題をsubmodular problemとして解く。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/6b8c6113-6110-cf0a-725b-f86e204d10c8.png)
- 評価：ResNet, VGGで実験した。

# Controlled Sparsity via Constrained Optimization or: How I Learned to Stop Tuning Penalties and Love Constraints

https://openreview.net/forum?id=XUvSYc6TqDF

- 概要：Sparsityを上げる学習
- 新規性：Sparsity条件を正則化項としてロスに加えて最適化するのではなく、制約条件に入れて解く方法
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/4b001b88-27f5-1eb5-9d37-5452f7ae25d4.png)
- キモ：Lagrangeの未定乗数法で解く。Dual Restart. 未定乗数の決め方
- 評価：ResNet等で実験した。


# Robust Binary Models by Pruning Randomly-initialized Networks

https://openreview.net/forum?id=5g-h_DILemH

- 概要：敵対的攻撃にロバストなバイナリモデル
- 新規性：ランダム重みから刈ってロバストなバイナリDNNを生成する。
- キモ：(1)Adaptive pruning. 枝刈り率が固定になる状態とパラメータ数が固定になる状態の間の状態になるように枝刈りする。(2)初期化方法 (3)最後のBatchNormalizationの扱い
- 評価：ResNet等で実験した。


# Analyzing Lottery Ticket Hypothesis from PAC-Bayesian Theory Perspective 

https://openreview.net/forum?id=fbUybomIuE

- 概要：当たりくじの分析
- 新規性：当たりくじは小さいLRによる探索なので局所的最適解に陥りやすく汎化性能が低いことを実験的に示した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/4bfdf508-2608-b7fb-28eb-fc95d445a14b.png)
- キモ：この考察で、当たりくじをspike-and-slab(GaussianとDiracのデルタ)で表現した。(当たりくじがDiracのデルタで、Gaussianは刈る気持ち)


# Recall Distortion in Neural Network Pruning and the Undecayed Pruning Algorithm

https://openreview.net/forum?id=5hgYi4r5MDp

- 概要：枝刈りにおけるクラス不均衡
- 新規性：枝刈りにおけるRecallの不均衡(平均よりRecallが低いクラスは枝刈りでより低く、高いクラスはより高くなる)は拡大することを実証した。また、改善する方法を示した(Undecayed Pruning)
- キモ：RecallとAccuracyのバランスを表現する関数$\bar{B}_t^c(m)$を導入する。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/4bece4d6-df08-5fd0-9fea-4e5b30b70209.png)
- 評価：ResNet等で実験して確かめた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/200f8908-b640-5d5b-337f-a77aaf480b75.png)
【Java】Mac に Homebrew で Java をインストールする

## 概要
Mac に Homebrew を使って Java をインストールした時の備忘録

### 前提
Homebrew がインストール済みであること。
（導入手順は [こちら](https://qiita.com/to3izo/items/3171220733d0e2d18bfb)）

## 手順

Homebrew でインストール
```bash
# Java インストール
brew install java
```

シェル設定ファイル（.zshrc/.bash_profile など）に追記
```bash
# シェル設定ファイルに追記 (Zsh の場合)
echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc
echo 'export CPPFLAGS="-I/usr/local/opt/openjdk/include"' >> ~/.zshrc
```

設定を反映させる
```bash
# シェル設定を反映
source ~/.zshrc
```

インストール確認
```bash
# バージョン確認コマンド
java --version

# 結果
openjdk 20.0.1 2023-04-18
OpenJDK Runtime Environment Homebrew (build 20.0.1)
OpenJDK 64-Bit Server VM Homebrew (build 20.0.1, mixed mode, sharing)
```

これで Java のインストールは完了
xformersを使用するときのエラー対処法

xFormersを使用するときに発生したエラーと対処法をメモします。

以下、発生したエラー。
```
NotImplementedError: No operator found for `memory_efficient_attention_forward` with inputs:
     query       : shape=(2, 4096, 8, 40) (torch.float16)
     key         : shape=(2, 4096, 8, 40) (torch.float16)
     value       : shape=(2, 4096, 8, 40) (torch.float16)
     attn_bias   : <class 'NoneType'>
     p           : 0.0
`cutlassF` is not supported because:
    xFormers wasn't build with CUDA support
`flshattF` is not supported because:
    xFormers wasn't build with CUDA support
`tritonflashattF` is not supported because:
    xFormers wasn't build with CUDA support
    requires A100 GPU
`smallkF` is not supported because:
    xFormers wasn't build with CUDA support
    dtype=torch.float16 (supported: {torch.float32})
    max(query.shape[-1] != value.shape[-1]) > 32
    unsupported embed per head: 40
```
  
どうやらインストールされている`xformers`のバージョンが合わなかったらしく、バージョンを変えてインストールし直すと対処できました。
```
$ pip uninstall xformers
$ pip install xformers==0.0.16
```
【Git】認証情報の保存方法を設定する

## 認証情報を保存する方法
### 一定時間メモリーに記憶する
一定時間メモリーに記憶させるためには以下のコマンドを実行します。

```zsh:ターミナル
git config --global credential.helper cache --timeout 任意の秒数

```

デフォルトでは15分間記憶されます。

### テキストファイルとして保存する
テキストファイルとして保存するには以下のコマンドを実行します。

```zsh:ターミナル
git config --global credential.helper store --file 任意のファイルパス
```

デフォルトでは`~/.git-credentials`に保存されます。

### OSのキーチェーンに保存する
OSのキーチェーンに保存するには以下のコマンドを実行します。

- Macの場合
```zsh:ターミナル
git config --global credential.helper osxkeychain
```

- Windowsの場合
```zsh:ターミナル
git config --global credential.helper wincred
```
【Flet】画面の最前面固定をSwitchで切り替える

タイトルの通り、FletでSwitchを使って画面の最前面固定を切り替える方法について書きます。画面固定以外にもフルスクリーンとの切り替えなどに応用できると思います。

Fletについてはこちらの記事がわかりやすいです。

https://qiita.com/NasuPanda/items/48849d7f925784d6b6a0

画面を最前面に固定する公式リファレンスはこちら

https://flet.dev/docs/controls/page#window_always_on_top

この記事は自分用の備忘録に近いのでご容赦ください。

# コード
```py
import flet as ft

def main(page: ft.Page):
    def position_fixation(e): #画面を最前面に固定する関数
        page.window_always_on_top = (
            False
            if page.window_always_on_top == True
            else True
        )
        page.update()
    
    page.window_always_on_top = True #最初の状態
    c = ft.Switch(label="画面を固定", on_change=position_fixation,value=True) #Switchの作成
    page.add(c) #ページに追加

ft.app(target=main) #ページに表示
```
このコードでは、
・表示したときは最前面に固定、スイッチオン
・スイッチがオフだと最前面に固定しない、オンだと最前面に固定
となっています。
最初の状態を`False`にするとスイッチオンで非固定、オフで固定となります。
【JavaScript】変数のスコープ

## はじめに
JavaScript勉強中の👶です。
理解を深めるために日々の学びを記事にしています。
初心者の記事なので言い回しや記載に誤りがあるかも知れませんが、暖かく見守っていただけると幸いです。
<font color="gray">(よろしければ間違いをコメントいただけると学び、励みになります！)</font>

## 学んだこと
・JavaScriptにおける変数のスコープについて
（本記事では、varによる変数宣言については割愛しています）

## スコープとは
スコープとは、変数を使用できる有効範囲のこと。

## グローバルスコープ
プログラムのどこからでも参照できる変数。ブラウザでは`windowオブジェクト`がグローバルオブジェクトです。
関数に全く囲まれていない最上位の領域で変数を宣言する場合も、グローバルスコープになります。


## ローカルスコープ
### 関数スコープ
関数内で定義した変数は、関数外から参照できません。
```js
function func(){
	const greeting = "hello";
	console.log(greeting);
}
// 関数内でgreetingを呼び出し
func(); // [LOG]: "hello"

// 関数外からgreetingを呼び出し
console.log(greeting); // エラー
```

### レキシカルスコープ
レキシカルスコープ変数とは、関数を定義した地点から参照できる、関数の外の変数を言います。実行中のコードから見た外部スコープのこと。

```js
const x = 111;
function func(){
    console.log(x);
}
func(); // [LOG]: 111
```

## ブロックスコープ
ブロック内で定義された変数は、ブロック内でのみ有効です。
```js
const age = 10;
if (age >= 18) {
	const range = "adult"
}else{
	const range = "child"
}
console.log(`あなたは、${range}です`); // =>エラー
```
上記は、 `range`変数を2回定義しています。通常、同じ変数名で２回定義することはできません。しかし今回の場合は、変数の有効範囲がブロックスコープ内に収まっているため2回定義したこととならず、エラーにはならないのです。

上記のブロックスコープによる参照エラーを解消するには、下記のように書き換える必要があります。
```js
const age = 10;
let range;
	if (age >= 18) {
	range = "adult"
}else{
	range = "child"
}
console.log(`あなたは、${range}です`); //[LOG]: "あなたは、childです"
```


## 参考
下記を参考に勉強させていただきました🌱
[TypeScript入門『サバイバルTypeScript』〜実務で使うなら最低限ここだけはおさえておきたいこと〜](https://typescriptbook.jp/)
APIから日本のCOVID-19のデータを取得

# はじめに
この記事では、Pythonを使用してAPIからデータを取得する方法について学びます。具体的には、COVID-19のデータを提供する　[COVID19 Japan Web API ](https://covid19-japan-web-api.vercel.app/apidocs/#/default))からデータを取得し、そのデータを分析する方法を学んでいきます。この記事は、Python初学者が独学で勉強をする際に見るものとして作成しています。
**※実装環境:Jupyter notebook**

# APIからのデータ取得方法
## モジュールとは？
モジュールとは、Pythonの機能をまとめたものです。今回は、APIからデータを取得するための`requests`モジュールと、取得したデータを扱うための`pandas`モジュールを使用します
```python
import requests
import pandas as pd
```
## APIとは？
APIとは、Application Programming Interfaceの略で、プログラムが他のプログラムと情報をやり取りするためのインターフェースのことを指します。

## APIからデータを取得する
APIからデータを取得するためには、`requests`モジュールの`get`関数を使用します。この関数はURLを引数として取り、そのURLのウェブページからデータを取得します。
```python
response = requests.get('https://covid19-japan-web-api.now.sh/api/v1/total?history=true&predict=true')

```
このコードは、指定したURLからデータを取得し、その結果を`response`という変数に格納します。データの形式はJSON形式となっています。

## 取得したデータを確認する
```python
data = response.json()
```
このコードは、`response`変数に格納されたデータをJSON形式からPythonの辞書形式に変換し、`data`という変数に格納します。

## データをDataFrameに変換する
`pandas`モジュールの`DataFrame`関数を使用して、取得したデータを扱いやすい形式に変換します。
```python
df = pd.DataFrame(data)
```

# 法的な注意点
本記事で扱うAPIから取得できるデータは公開されているものであり、法的に問題はありませんが、一般的にAPIを使用する際には、各APIの利用規約を確認し、適切に使用することが重要です。

# 情報漏洩に関する注意点
本記事で取り扱うデータはすべて公開データであり、個人情報を含んでいません。しかし、実務でデータ分析を行う際には、プライバシーに配慮したデータ取扱いが必要となります。個人情報を含むデータを扱う場合は、情報管理に最善の注意を払い、適切なセキュリティ対策を講じることが重要です。

# まとめ
この記事では、Pythonを用いてAPIからデータを取得し、そのデータを分析する方法を学びました。具体的には、`requests`モジュールを使用してAPIからデータを取得し、取得したデータを`pandas`のDataFrame形式に変換する方法を学びました。また、APIの利用規約の確認や情報管理についての重要性についても触れました。

# 最後に
APIからデータを取得し、それを分析するスキルは、データ分析や機械学習の分野で非常に重要です。このスキルをさらに深めていきたい方は、以下のリンクから機械学習システム構築のスキルと学習手法について学ぶことができます。続けて学んでいきましょう！
[機械学習システム構築のスキルと学習手法ガイド](https://qiita.com/yutut/items/143cfd496a8eef299699)
[データ分析プロジェクトのスキルと学習手法ガイド](https://qiita.com/yutut/items/57d0ce28327d591186c6)
[データ可視化・BI構築のスキルと学習手法ガイド](https://qiita.com/yutut/items/7bb84f2b641106535436)
忘れた分を取り返す回

水星の魔女でも「まだ間に合う！水星の魔女ダイジェスト」やってるからまだ間に合うんだよ！！

昨日はProgateのPythonコース３までやったから４からやっていくぞい。



◎復習とメモ◎
戻り値・・・return
インデントの位置←結構間違えてる
引数は「,」、メソッドは「.」
定義・・・def　メソッド（self）:
インスタンス変数


-------------------------------------------------------------------------

コース５まで終了。
やっぱりこの辺りはケアレスミスが目立った回だった。

でも後半自分でも不思議なくらいめっちゃできた。ずっとPythonを触ってなかったのが信じられないくらい。（何やってんだミカァ！！！！！）

鉄血ェ…な状況はともかくProgateで一通り復習できた。
明日もう一回１からやろうと思ったけど時間がねぇから１００問パックに手つけていこうと思う。
ああ、最短で行く…！！！（オルガァ…）

PS.鉄血はいいぞ👍👍👍
Java オブジェクトの作成

# はじめに
Javaで初めてオブジェクトを作成したので備忘録のため記録します。


# 商品オブジェクトの作成

```java:ItemBean.java
public class ItemBean implements Serializable {

    //属性の作成
    private String itemID; //商品ID
    private String itemName; //商品名
    private int itemPrice //商品価格
    private int itemStock; //商品在庫

}
```
private修飾子 型　変数;

これらの属性は、クラス内でのみアクセス可能なプライベートフィールドとして宣言されています。

アクセス制御をプライベートにすることで、直接的な外部からのアクセスを制限し、カプセル化の原則に従っています。

つまり、ItemBeanクラス内でのみ使用可能。

# getter setterメソッドの作成
```java:ItemBean.java
public class ItemBean implements Serializable {

    //属性の作成
    private String itemID; //商品ID
    private String itemName; //商品名
    private int itemPrice //商品価格
    private int itemStock; //商品在庫

    public String getItemID() {
		return itemID;
	}
	public void setItemID(String itemID) {
		this.itemID = itemID;
	}
	public String getItemName() {
		return itemName;
	}
	public void setItemName(String itemName) {
		this.itemName = itemName;
	}
	public int getItemPrice() {
		return itemPrice;
	}
	public void setItemPrice(int itemPrice) {
		this.itemPrice = itemPrice;
	}
	public int getItemStock() {
		return itemStock;
	}
	public void setItemStock(int itemStock) {
		this.itemStock = itemStock;
	}

}
```
private修飾子で作成した全ての属性に対するメソッドを作成。（エクリプスの機能で簡単に作成できました。）
上記でも説明しましたが、private修飾子は外部から直接呼び出すことができないです。

なので、外部からアクセスできるメソッドを作成しました。
setは属性値に値をセットし、getでセットした値を呼び出す役割があります。

# 商品オブジェクトを呼び出すクラスの作成
```java:Item.java
public class Item {

	public static void main(String[] args) {
	
    	//商品の作成
    	//ItemBean:クラス名, itemBean:変数名 new ItemBeanが引数なしで作ったメソッド
    	ItemBean itemBean = new ItemBean();
    	itemBean.setItemID("001");
    	itemBean.setItemName("商品１");
    	itemBean.setItemPrice(1000);
    	itemBean.setItemStock(10);
    }

}
```

クラス型　変数名 = new クラス名();
ItemBean型の変数itemBeanはItemBeanクラスのメソッドや属性値にアクセスすることが可能になります。
new ItemBeanでItemBeanクラスのインスタンスを作成します。

上記のコードでは、itemBean.setItemID("001")という文は、itemBeanが参照しているItemBeanのインスタンスのsetItemIDメソッドを呼び出し、引数として"001"を渡しています。

同様に、itemBean.getItemName()やitemBean.setItemStock(10)など、itemBeanを介してItemBeanクラスの属性値の取得や設定、メソッドの呼び出しが行えます。

つまり、ItemBean itemBean = new ItemBean()によって、ItemBeanクラスのインスタンスを生成し、そのインスタンスを変数itemBeanに割り当てることで、itemBeanを通じてItemBeanクラスの属性やメソッドを使用できるようになります。

# 商品オブジェクトから商品情報を表示する方法

```java:Item.java
public class Item {

	public static void main(String[] args) {
	
    	//商品の作成
    	ItemBean itemBean = new ItemBean();
    	itemBean.setItemID("001");
    	itemBean.setItemName("商品１");
    	itemBean.setItemPrice(1000);
    	itemBean.setItemStock(10);

        //商品情報を表示
        System.out.print(itemBean1.getItemID()); //001
        System.out.print(itemBean1.getItemName()); //商品1
        System.out.print(itemBean1.getItemPrice());　//1000
        System.out.println(itemBean1.getItemStock()); //10

    }

}
```
ItemBeanクラスに存在するget◯◯メソッドを実行することで、商品オブジェクトを表示することが可能になります。

# まとめ
今回は初歩的なオブジェクトを作成しました。

コードをコンパクトにするのであれば、コンストラクタをItemBean.javaで設定することでインスタンスと商品オブジェクトが１行で作成できるかなと思いました。

この辺りは次回記事にしようかと思います。
STM32F767でKnight Rider(ナイトライダー)で遊ぶ(その2)

x 過去ログを見よ



D8からD13まで

![o_cop527.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/d12ff30e-d881-20fe-a653-344f1e6e5e43.jpeg)



```c++



//GPIO_Knight_Rider2_test_767_1


void GPIO_D13(int s)
{

  digitalWrite(13,s);

} //GPIO_D13

void GPIO_D12(int s)
{

  digitalWrite(12,s);

} //GPIO_D12


void GPIO_D11(int s)
{

  digitalWrite(11,s);

} //GPIO_D11


void GPIO_D10(int s)
{

  digitalWrite(10,s);

} //GPIO_D10


void GPIO_D9(int s)
{

  digitalWrite(9,s);

} //GPIO_D9


void GPIO_D8(int s)
{

  digitalWrite(8,s);

} //GPIO_D8


void GPIO_D8_D13_cls()
{

  digitalWrite(13,0);
  digitalWrite(12,0);
  digitalWrite(11,0);

  digitalWrite(10,0);
  digitalWrite(9,0);
  digitalWrite(8,0);

} //GPIO_D8_D13_cls()

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PB7, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);

} //setup


void loop() {

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D13(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D12(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D11(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D10(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, HIGH);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D9(1);

  delay(1000);                       // wait for a second

  digitalWrite(PB7, LOW);   // turn the LED on (HIGH is the voltage level)
  
  GPIO_D8_D13_cls();
  GPIO_D8(1);

  delay(1000);                       // wait for a second

} //loop





```
非同期にデータの表示を変える

**watchを使って非同期にデータを変更**


#

**watchを使う利点**
①リアルタイムなデータの更新: watchを使用すると、データの変更をリアルタイムに監視できる。
②非同期な処理: watchコールバック関数内で非同期な処理を実行することができる。
③複数のデータの監視: watchオプションを使用すると、複数のデータを監視することができます。コード内の他のデータが変更された場合にも、対応するwatchコールバック関数が実行できる。
#


以下コード例


```HTML
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script src="https://cdn.jsdelivr.net/npm/vue@2.7.11/dist/vue.js"></script>

  <!--テンプレート構文-->
  <div id="app1">
    <p>{{counter}}</p>
    <button @click="counter += 1" >+1</button>
    <p>{{lessThanThree}}</p>
  </div>

  <script>
    new Vue({
      el:'#app1',
      data:{
        counter:0,
      },
      computed:{
        lessThanThree:function(){
          return this.counter > 3 ? '3より上' : '３以下'
        }
      },
      watch:{
        counter:function(){
          var vm = this;
          setTimeout(function(){
            vm.counter = 0;
          },3000);
        }
      }
    })
  </script>
</body>

</html>
```
機能更新(FU)プログラムについて

⚫︎機能更新とは何か
　Windowsオペレーティングシステムに大きな変更を加える更新プログラムです。

⚫︎どんなプログラムなのか
　新しいオペレーティングシステム機能、セキュリティパッチ、バグ修正が含まれています。

⚫︎なぜ必要か
　１．セキュリティリスクへの対策のため
　２．ソフトウェアの互換性のため
　３．機能の欠如にならないため
　４．サポートの欠如にならないため

　　○どんな改修がされた
　　　　タスクバーの改善、スタートメニューの更新、新しいセキュリティツールの追加、
　　　　システムのスタビリティを向上させる修正、新たなウェブブラウザーの導入などが行われました。

⚫︎リリース頻度
　機能更新は通常、半年ごとにリリースされます。
　大抵が、春と秋にリリースされています。

●リリースノート
　バージョン 1507 2015 年 07 月
　バージョン 1511 2015 年 11 月
　バージョン 1607 2016 年 08 月
　バージョン 1703 2017 年 03 月
　バージョン 1709 2017 年 10 月
　バージョン 1803 2018 年 04 月
　バージョン 1809 2018 年 10 月
　バージョン 1903 2019 年 05 月
　バージョン 1909 2019 年 11 月
　バージョン 2004 2020 年 05 月
　バージョン 20H2 2020 年 10 月
　バージョン 21H1 2021 年 05 月
　バージョン 21H2 2021 年 11 月
　バージョン 22H2 2022 年 10 月
[python]  == と isの違い 

pythonのif文を記述するときに、
「==」と「is」といった似たような演算子があることに気づくと思う。
今回は、それぞれの違いを具体例をまじえながら記述する。

## == と isの違い
### == 演算子
→2つのオブジェクトの**値**を比較する演算子。

記載の通り、値を比較する演算子。
いくつかの組み込みの数値型 (数値型 int, float, complex) など異なる型同士を比較できる

>6.10.1. 値の比較
演算子 <, >, ==, >=, <=, および != は2つのオブジェクトの値を比較します。 オブジェクトが同じ型を持つ必要はりません。
>


[公式Python リファレンス:値の比較](https://docs.python.org/ja/3/reference/expressions.html#value-comparisons)

### is 演算子
→2つのオブジェクトの**同一性**を比較する演算子。

- 同一性とは
メモリ上に作成されたオブジェクトに対して、ユニークなアドレスのようなものが割り当てられる性質のこと。
なので、上記の同一性の比較とは、オブジェクト作成時に割り当てられたIDが同じかどうかを調べるということになる。同じオブジェクトを指していれば同じIDになる。

>6.10.3. 同一性の比較
演算子 is および is not は、オブジェクトの同一性に対するテストを行います: x is y は、 x と y が同じオブジェクトを指すとき、かつそのときに限り真になります。 オブジェクトの同一性は id() 関数を使って判定されます。 x is not y は is の真値を反転したものになります。
>
[公式Python リファレンス:同一性の比較](https://docs.python.org/ja/3/reference/expressions.html#is-not)


## 具体例

#### ==演算子
==はオブジェクト同士が等価であるかを判定する演算子なので、
以下のように値が同じかを調べたいときに使用する。

(例1):　同一の型同士(整数型)

```python
num_1 = 1
num_2 = 1

# 値が等しいかをチェックする
if num_1 == num_2:
  print('num_1とnum_2は同じ値です')
```

実行結果
```
num_1とnum_2は同じ値です
```


(例2): 違う型を持つオブジェクト同士の比較

```python
# int型
num_1 = 1
# float型
num_2 = 1.0

# 値が等しいかをチェックする
if num_1 == num_2:
  print('num_1とnum_2は同じ値です')
```

実行結果
```
num_1とnum_2は同じ値です
```
前述した通り、数値型 (数値型 int, float, complex)などという条件付きで
型が同じではなくても、値が同じであれば条件式はTrueを返す。


(例3): 違う型（整数型と文字列型）持つオブジェクト同士の比較

```python
# int型
num_1 = 1
# string型
num_2 = '1'

# 値が等しいかをチェックする
if num_1 == num_2:
  print('num_1とnum_2は同じ値です')
```

実行結果
```
# 何も表示されない(つまりFalse)
```
数値型と文字列型は比較してもFalseと判定されるため注意が必要。


#### is演算子
isはオブジェクト同士が同じオブジェクトであるか（同一）を判定するときに使う。

(例1):　同じ値を持つリスト

```python
list_1 = [1, 2, 3]
list_2 = [1, 2, 3]

# オブジェクトが等しいかをチェックする
if list_1 is list_2:
  print('list_1とlist_2は同じオブジェクトです')
else:
  print('list_1とlist_2は同じオブジェクトじゃない')

```

実行結果
```
list_1とlist_2は同じオブジェクトじゃない
```

値は同じでも、オブジェクトは同じではない(=メモリ上では同じIDで管理されていない)ため、Falseとなる。


(例2):　オブジェクトがNoneか否か

```python
list_1 = None

# オブジェクトがNoneかをチェックする
if list_1 is None:
  print('list_1はNoneです')
else:
  print('list_1はNoneじゃない')
```

実行結果
```
list_1はNoneです
```

(例3):　再代入されたオブジェクト

```python
list_1 = [1, 2, 3]
list_2 = list_1

# オブジェクトが等しいかをチェックする
if list_1 is list_2:
  print('list_1とlist_2は同じオブジェクトです')
else:
  print('list_1とlist_2は同じオブジェクトじゃない')

```

実行結果

```
list_1とlist_2は同じオブジェクトです
```

pythonでは、リストや辞書はオブジェクトの参照渡しのため、
メモリ上list_1　と　list_2は同じオブジェクトとして扱われるため。
Javaでテキストファイルに文字を追加する方法

# FileWriterの第二引数にtrueを入れよう
結論はこれだけです

## 普通に書くと上書きされる

まず、try.txtを作成してみます。
以下のコードを一度実行します。

```Java:Test.java
public static void todoWrite() {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter("try.txt"));) {
        writer.write("Test");
        writer.newLine();
        writer.write("おためし");
        writer.newLine();
    } catch (IOException e) {
        System.out.println("ファイルの書き込みエラー");
    }
}
```

すると、中身は
```:try.txt
Test
おためし
```
となりますね。
では再度Test.javaを実行すると？

```:try.txt
Test
おためし
```
中身は変わりません。
なぜなら、もともとあった文章を上書きしてしまうからです。
では次はFileWriterの第二引数にtrueを入れてみましょう。

## 元の文章に追加で書き込む方法
先程のコードのFileWriterの第二引数にtrueを入れてみました。
これで一度実行してみましょう。

```Java:Test.java
public static void todoWrite() {
    try (BufferedWriter writer = new BufferedWriter(new FileWriter("try.txt", true));) {
        writer.write("Test");
        writer.newLine();
        writer.write("おためし");
        writer.newLine();
    } catch (IOException e) {
        System.out.println("ファイルの書き込みエラー");
    }
}
```

一度目の実行で中身は
```:try.txt
Test
おためし
```
となりますね。
では再度Test.javaを実行すると？

```:try.txt
Test
おためし
Test
おためし
```
このように、末尾に文章が足されていきます。
こうすることでファイルの追加記入ができるようになりましたね。

## まとめ
java.io.FileWriterのインスタンス生成時、第二引数を入れないと、上書きする。
java.io.FileWriterのインスタンス生成時、第二引数にtrueを入れると、追記する。
No18_ググったこと投稿(5分)_環境構築時に調べた言葉

## UbuntuとLinux違い
### そもそもLinux/Ubuntu
- Linux
    - mac/windowsと同じ
- Ubuntu
    - Linux系のOSの一つ
- wsl(Windows Subsystem for Linux)はWindowsを使いながらLinuxを使えるツール

## Powershellとコマンドプロンプトの違い
- Powershell
    - コマンドプロンプトよりもさらに強力で，スクリプトを書くための言語
    - パイプ処理が使える
    - 954種類のコマンドが用意されている
- コマンドプロンプト
    - 軽量で起動が早い

## git config コマンド
- git config -l
    - 有効な設定情報の一覧を表示する
- git config --global user.name taro
    - globalに、Gitユーザ「taro」を設定する
- configの設定レベル

|レベル	| 説明 |
| ---- | ---- |
| Systemレベル	| 全てのユーザに有効な設定レベル |
| Globalレベル	| Windowsにログインした時のユーザのみ有効な設定レベル |
| Localレベル|	特定のリポジトリ（クローンしたフォルダ）のみ有効な設定レベル |
参考)
https://codelikes.com/git-config/

## グローバルIPが変わる理由
- インターネットに接続したい端末(PC、スマホ、ゲーム機等)の数に対して、IPアドレス(IPv4)の数が不足しているから
### 変わるタイミングについて
- グローバルIPアドレスは、ISPによって自動的に割り当ており、ルーターの電源を切って5分間ほど放置すると、ISPによってはグローバルIPアドレスが切り替わることがある

## pemファイルとは
- 電子メールを暗号化して送受信する「PEM」（Privacy-Enchanced Mail）規格から派生したファイル形式。 
- 証明書または鍵のbase64保存形式です。証明書または鍵を単独もしくはまとめて保存可能。
### pemとcrt/cerの違い
- 証明書のことを指し、Linuxはcrt、Windowsはcer。保存形式はpemまたはderでもできます。
LinuxのIntel x86のIntrinsic関数をRISC-VやARM用にポートする（7）

この記事では、IntelのIntrinsic関数をRISC-Vにポートするためのテストフレームワークにおいて、入力値を決めるとき、ランダムに入力値を決めるのが最良であるということを論ずる。

```c
extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__,__artificial__))
_mm_add_pd (__m128d __A, __m128d __B)
{
   return (__m128d) ((__v2df)__A + (__v2df)__B);
}
```

上のようなラップ構造を取るポートにおいて、IntelとRISC-Vをネットワーク接続し、IntelのIntrinsic関数と、それをRISC-Vにポートしたものに、同じ__Aの値と、__Bの値を入力し、帰ってくる値がIntelとRISC-Vで変わらないことを確認するのがテストフレームワークの骨子となる。

様々な戦略が考えられるが、ランダムに値を生成し、テストするのが最良であると考えられる。理由はいくつかある。

* テスト状態の保存と読み取りの必要がない
　ランダムでなく、「計算された値」を投げる場合、今までテストした値を保存して、管理する必要がある。それは場合によっては膨大になり、また、同じ値をテストしないための仕組みも必要となる。それは多くの場合複雑な機構となる。
　ランダムな値なら、エラーを起こした値だけ保存しておき、他のデータは廃棄できる。

*  ランダムのほうが巨大な組み合わせの場合に網羅性が高い
　入力値は2**256の組み合わせがあるため、同じ値をチェックすることは非常に少なく、また、ランダムにチェックすれば網羅性も最良となる。


*  別スレッドで同じテストを行っている場合、テスト済みデータの共有と同期が必要となる。
　同じテストが別スレッドで行われる可能性もあり、また、地球上の別の地点で、お互いの存在を知らずに行われる可能性がある。その場合、テスト済みデータの共有と同期は非常に複雑となり、場合によっては不可能である。
　ランダムに入力値を決める場合は、それらの機構は必要なくなる。

takahashi_akariさんにご協力いただきました。ありがとうございます。
error: You have not concluded your mergeの対処法

現在のブランチを最新にしようとpullした時に起きたエラーです。

# エラー内容
```
$ git pull
error: You have not concluded your merge (MERGE_HEAD exists).
hint: Please, commit your changes before merging.
fatal: Exiting because of unfinished merge.
```

# 原因

**コミットしていないマージがあるから。**

メッセージの和訳↓
```
エラー:マージが完了していません(MERGE_HEADが存在します)。
ヒント:マージする前に変更をコミットしてください。
```

# 解決
**マージをリセットすれば大体なんとかなります笑**

①マージをリセット↓
```
$ git reset --merge
```

②プルからやり直す
```
# プルする
$ git pull
hint: Waiting for your editor to close the file... error: There was a problem with the editor '"C:\apps\Sublime Text 3\sublime_text.exe" -w'.
Not committing merge; use 'git commit' to complete the merge.

# コミットする（コミットが必要だと書いてあるため）
$ git commit
On branch feature/braname
Your branch is ahead of 'origin/feature/braname' by 2 commits.

# プッシュする
$ git push
Enumerating objects: 18, done.
Counting objects: 100% (14/14), done.
```

参考：

https://hachimaki37.hatenablog.com/entry/2020/08/19/183445

https://qiita.com/ponsuke0531/items/23be5ab56bba331323de
暗黙的型変換

**変数を調べるときの調べる方法**

console.log(typeof val)

function printTypeAndValue(val){
  console.log(typeof val,val);
}

#
**文字列と数値の暗黙的結合**
 let a = 0;
 let b = '1' + a;
printTypeAndValue(b);
 コンソール結果　string,10 文字列が優先される
#
**数値と文字列の暗黙的結合**
let c = 15 - b;
コンソール結果　number,5　数値が優先される
#
**数値とNULLの暗黙的結合**
let d = c - null;
コンソール結果　number,5 nullが数値の０に暗黙的に変換される

#
**数値とTrueの暗黙的結合**
let e = d - true;
コンソール結果　number,4 trueが数値の1に暗黙的に変換される
#
ubuntuを動かすための自作PC構成

# はじめに
linuxの自習や自社製品の勉強のために、今まではAWS(Amazon Web Services)を使っていましたが、オンプレでサーバを立てることにしました。

主な理由は以下の通りです。
- クラウド環境だと毎月の費用が多かれ少なかれ発生すること
- オンプレ環境で長く仕事してきたので、クラウド環境の操作時のタイムラグがじれったい
- コマンドラインが好き
- いろいろ無茶したい

自作PCでubuntu（linux）が動いた実績のあるPC構成を見つけることが、なかなかできませんでした。そのため、私と同じように自作PCでlinuxを動かそうとする方へのメモとして残しておきます。

# 結果
ubuntuやdockerの導入は問題ありませんでした。
マニュアルやWebで、十分な情報が入手できました。
PC組み立て開始からubuntu導入完了まで、4時間程度です。

# 費用
PC本体のみで5万円～6万円に収まりました。
なお、無線アダプターやケースは家の余品を利用しました。

# 今回の構成
## 導入完了後のOSバージョン（2023/05/16執筆時点）
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy
$

## CPU
Core i3 12100 BOX
（2022/12/11　ドスパラで購入、21,980円）

## マザーボード
PRO B660M-G DDR4 (B660 1700 MicroATX) ドスパラ限定モデル
（2022/12/11　ドスパラで購入、12,980円）
※　このマザーボードはドスパラ限定モデルですが、類似したマザーボードであれば問題ないと思います。なお購入時には、店員さんからサポートしているかは分からない、と言われました。

## メモリ
CT2K8G4DFRA32A (DDR4 PC4-25600 8GB 2枚組)
（2022/12/11　ドスパラで購入、5,880円）

## SSD
EXCERIA G2 SSD-CK500N3G2/J (M.2 2280 500GB)
（2022/12/11　ドスパラで購入、5,480円）

## 電源
EMB550AWT (550W)
（2022/12/11　ドスパラで購入、4,980円）

## ケース
家で余っていたものを利用

## 無線アダプター
家で余っていたものを利用

# ubuntuの導入
PCをくみ上げてからのubuntu導入は、インストールUSBメディアを使って行いました。
JavaでHelloWorldプログラムを実装してみた

# 概要
JavaでHelloWorldプログラムを実装してみました。

# ソースコード実装
以下のコードを作成しました。
```Hello.java
public class Hello {
    public static void main(String[] arg){
	System.out.println("Hello World!");
    }
}
```

# コンパイル実行
以下のコマンドを実行しました。
```
$ javac Hello.java
```

# プログラム実行
以下のコマンドを実行しました。
```
$ java Hello 
Hello World!
```

# まとめ
HelloWorldプログラムを書くと新鮮な気持ちになります。
何かの役に立てばと。
[Git] 動作を試す 実行例28：guiコマンドによりGit GUIを起動する

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/574993a4919e02236dbd) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/fa4662ba8a336e2f0e19) |
|:-:|:-:|:-:|

# 実行例

```
※Git GUIを起動する
git gui
↓
結果: 
(ウィンドウが表示される)

※Git repository browserのGUIを起動する
gitk
↓
結果: 
(ウィンドウが表示される)

※「git gui」で起動して、メニューのRepository→Visualize branch～を選択しても「gitk」が起動する
```

※Git GUI:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/42d569f2-2879-e133-8ccb-918019ced962.png)

※Git repository browser:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606924/e408d9c8-f3f8-588a-ab5a-cbd9a01b9e57.png)


# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。
[Git] 動作を試す 実行例27：tagでタグ作成

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/259cd1fa418d366124dc) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/19e04b394ca33aa8e497) |
|:-:|:-:|:-:|

# 実行例

```
(※始めにコミット履歴を調べる)
git log --oneline
↓
結果: 
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1

-----

※注釈付きのタグを作成
git tag -a v1.4 -m "version 1.4"
git show v1.4 --oneline -s
↓
結果: 
tag v1.4

version 1.4
94996a0 (HEAD -> master, tag: v1.4) message4

※-s: 差分出力を抑制します。

-----

※軽量版のタグを作成(-a、-sあるいは-mオプションをつけずにコマンドを実行)
git tag v1.4-Lite
git show v1.4-Lite --oneline -s
↓
結果: 
94996a0 (HEAD -> master, tag: v1.4-Lite, tag: v1.4) message4

git tag v1.2-Lite 00cad71
git show v1.2-Lite --oneline -s
↓
結果: 
00cad71 (tag: v1.2-Lite, tag: v1.2) message2

-----

※既存のタグの一覧を表示する
git tag -n
↓
結果: 
v1.2-Lite       message2
v1.4            version 1.4
v1.4-Lite       message4

※パターンを指定してタグを検索する
git tag -l "v*Lite"
↓
結果: 
v1.2-Lite
v1.4-Lite

-----

※特定のタグと紐付けたブランチを作成する
git checkout -b v1_2_L v1.2-Lite
git log --oneline
↓
結果: 
00cad71 (HEAD -> v1_2_L, tag: v1.2-Lite) message2
4ace194 message1

git checkout master
git branch -D v1_2_L
↓
結果: 
Deleted branch v1_2_L (was 00cad71).

-----

git log --oneline
↓
結果: 
94996a0 (HEAD -> master, tag: v1.4-Lite, tag: v1.4) message4
20bbab7 message3
00cad71 (tag: v1.2-Lite) message2
4ace194 message1

(※削除して元に戻す)
git tag -d v1.2-Lite
git tag -d v1.4
git tag -d v1.4-Lite
git log --oneline
↓
結果: 
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1

-----

※Pro Git本 引用: デフォルトでは、git pushコマンドはタグ情報をリモートに送りません。
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。
Git コマンドにエイリアスをつける

コマンドにエイリアスをつけることで、良く使うコマンドを短縮できる。以下のようにエイリアスを設定する。
```terminal
$ git config --global alias.<エイリアス> <文>
```
なお、`--global`オプションを付けないと、ある特定のプロジェクトでのみ使えるエイリアスとなる。

以下はおすすめの例
```terminal
$ git config --global alias.ci 'commit'
$ git config --global alias.st 'status'
$ git config --global alias.br 'branch'
$ git config --global alias.co 'checkout'
```

複数の単語を組み合わせることもできる。
```terminal
$ git config --global alias.unstage 'reset HEAD --'
```

これで、下の二つの入力は同じ意味になる。
```terminal
$ git unstage file
$ git reset HEAD -- file
```
\
より詳しくは[こちら](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-Git-%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9)。
Gradleキャッシュ削除でビルドエラーが解消した件

## 環境
 * 言語 Kotlin
 * 開発環境 IntelliJ

## 事象
いつも通りgradleのビルドコマンド実行して動作確認していたところ、
突然ビルド失敗となり、以下エラーが出力された。
```:エラーログ
FAILURE: Build failed with an exception.
* What went wrong:
Task 'detekt▒@' not found in root project 'プロジェクト名'. Some candidates are: 'detekt'.
```
## 解決策

***Gradleのキャッシュを一旦削除する。***

<ol>
<li>InteliJのファイルタブ→「キャッシュの破棄」を選択</li>
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/16c625bf-3067-f762-67fd-a69fbeeae5b9.png" />

<li>該当項目を選択して、「破棄して再起動」を押下。</li>

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1202056/7e7a4826-0d8e-d36b-3054-38565fbf5b4b.png">

<li>Intelij再起動後、再度ビルド。<br>→ 無事ビルド成功</li>

```
BUILD SUCCESSFUL in 1m 7s
```
</ol>

※これでも直らなければPC再起動してみましょう。
VScodeにてmatplotlibrcを編集しても反映されず、４時間つぶした話

## 1.困ったこと
WindowsでVSCodeを使用しており、matplotlibrcファイルを編集しても全く反映されない。

## 2.解決方法
VSCodeのこれが原因でした。設定から"thema"と打つと一番上に出てきます。
![スクリーンショット 2023-05-16 211437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2183108/6a0c7e79-9d0e-f4e0-bc0d-251f61c312f0.png)
勝手にVSCodeの配色と出力画像の配色が同じにされてしまいます。この設定はmatplotlibrcファイルよりも優先されるため、どれだけmatplotlibrcファイルを編集しても反映されませんでした。
[Git] 動作を試す 実行例25：cleanで管理していないファイルを削除する

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/7e824b3498dd8d69ccc0) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/259cd1fa418d366124dc) |
|:-:|:-:|:-:|

# 実行例

untracked fileを削除するためにはgit cleanを使う - Qiita
https://qiita.com/tmyn470/items/c8359e4ec92d1f462bdf
↓
引用: 
削除する前に、削除の対象となるファイルを確認
git clean -n
git clean -dn
untracked fileを削除(ディレクトリを削除する場合はd)
git clean -f
git clean -df

```
(※ひとまず適当にファイルを作成)
echo Sample-Added-11 > test101.txt
mkdir test102
echo Sample-Added-11 > test102/test102.txt
dir /b
↓
結果: 
test1.txt
test101.txt
test102
test2.txt
test4.txt

-----

git clean -n
↓
結果: 
Would remove test101.txt

git clean -dn
↓
結果: 
Would remove test101.txt
Would remove test102/

dir /b
↓
結果: 
test1.txt
test101.txt
test102
test2.txt
test4.txt

-----

git clean -f
↓
結果: 
Removing test101.txt

dir /b
↓
結果: 
test1.txt
test102
test2.txt
test4.txt

git clean -df
↓
結果: 
Removing test102/

dir /b
↓
結果: 
test1.txt
test2.txt
test4.txt
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。
[Git] 動作を試す 実行例24：gcでガベージコレクション(履歴を完全に削除する)

Gitの動作を理解するために、Gitのコマンドを実際に試して、結果を見てみました。

1つの記事内で一連のGitコマンドが完結しているので、これら一連のコマンドを順に実行させて結果を見ることで、一連のGitの動作を実際に体感でき、一通り独習することが可能です。

※前回記事のリポジトリ状態からの続きになっています。
| [前回記事へ](https://qiita.com/dl_from_scratch/items/4046dd791d0beed50680) | [目次へ：Git関連記事のまとめページ](https://qiita.com/dl_from_scratch/items/597bc28a4787a7901d21) | [次回記事へ](https://qiita.com/dl_from_scratch/items/6eaaf83d51060ee87054) |
|:-:|:-:|:-:|

# 実行例

```
(※ひとまず適当に変更の操作)
echo Sample-Added-15(for-gc) >> test1.txt
git commit -a -m "message5(for-gc)"
git log --oneline
↓
結果: 
0bf814e (HEAD -> master) message5(for-gc)
94996a0 message4
20bbab7 message3
00cad71 message2
4ace194 message1

(※強制的に位置を戻して、コミットをアクセスできない状態にする)
git reset --hard 94996a0
git log --oneline
↓
結果: 
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1

※アクセスできないコミットはまだ存在する
git show 0bf814e --oneline -s
↓
結果: 
0bf814e message5(for-gc)

-----

※アクセスできないと見なされたGitオブジェクト(コミット)を削除する
git gc
↓
結果: 
Enumerating objects: 107, done.
Counting objects: 100% (107/107), done.
Delta compression using up to 8 threads
Compressing objects: 100% (93/93), done.
Writing objects: 100% (107/107), done.
Total 107 (delta 35), reused 0 (delta 0), pack-reused 0

※アクセスできないコミットはまだ存在する(予想に反して回収されない)
git show 0bf814e --oneline -s
↓
結果: 
0bf814e message5(for-gc)

※アクセスできないコミットにまだ戻れる(予想に反して回収されない)
git reset --hard 0bf814e
git log --oneline
↓
結果: 
0bf814e (HEAD -> master) message5(for-gc)
94996a0 message4
20bbab7 message3
00cad71 message2
4ace194 message1
```

参考: 

Git ファイルの履歴を完全に削除する
https://gist.github.com/ktx2207/3167fa69531bdd6b44f1

```
(※強制的に位置を戻して、コミットをアクセスできない状態にする)
git reset --hard 94996a0
git log --oneline
↓
結果: 
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1

※まずこれまでの操作履歴が入ったreflogを削除
git reflog expire --expire=now --all

※リポジトリから全てのアクセスできないコミットを削除
git gc --aggressive --prune=now
↓
結果: 
Enumerating objects: 65, done.
Counting objects: 100% (65/65), done.
Delta compression using up to 8 threads
Compressing objects: 100% (53/53), done.
Writing objects: 100% (65/65), done.
Total 65 (delta 17), reused 47 (delta 0), pack-reused 0

※reflogに残った作業履歴分を削除する必要がある(参照が残っているとアクセス可能となる為)
※--prune=<date> 日付より古いオブジェクトを削除(デフォルトは2週間前)

※アクセスできないコミットが参照出来なくなっている
git show 0bf814e --oneline -s
↓
結果: 
fatal: ambiguous argument '0bf814e': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

※アクセスできないコミットに戻れなくなる
git reset --hard 0bf814e
↓
結果: 
fatal: ambiguous argument '0bf814e': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

(※削除OK)

-----

※注意: tagが付いていると、参照されているのでアクセス可能となり、git gcではコミットが削除されない。tagを削除してから、git gcを実施する必要がある。
※注意: stashからの参照履歴があると(ref/stash等)、参照されているのでアクセス可能となり、git gcではコミットが削除されない。stashを削除してから、git gcを実施する必要がある。

-----

(※始めの状態に戻す)
git reset --hard 94996a0
git log --oneline
↓
結果: 
94996a0 (HEAD -> master) message4
20bbab7 message3
00cad71 message2
4ace194 message1
```

# 環境

Windows 10、PortableGit-2.40.0-64-bitを使用、全てローカルPC上で実施、GitHub等は不使用。