OmniAICreator/Qiita-1.07M huggingface dataset:
GitHub - ローカルのXcodeProjectをgithubにあげます

iOSのプロジェクトをgithubで管理したい時、まずgithubにあげるでしょう。これで自分のやり方を共有いたします。
#Step1：githubで新しいレポジトリを作成する
まずgithubのこのNewを押して
![截圖 2021-10-24 20.13.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/e40b878f-f363-d93d-a136-7adae582e6fc.png)
Repository nameは普通プロジェクト名と同じでいいです。
![截圖 2021-10-24 21.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/63d56550-50c7-fae3-4eec-11de682d91c0.png)
#Step2：ProjectにGit Repositoryあるかどうかを確認する
タミナールを開いて、Projectのフォルダーに行って **git remote -v**を入力してみましょう。もし以下のようなエラーメッセージが出たら、Git Repositoryを追加する必要があります。

```
MacBook-Pro:viewPop XXXX$ git remote -v
fatal: not a git repository (or any of the parent directories): .git
```
#Step3：Git Repositoryを追加する
Projectを新しく立てる時に以下のチェックを入れたら追加できます。
![截圖 2021-10-24 23.18.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/014a9aab-61d6-1710-6501-608e6b07c31f.png)
チェックを忘れた場合、後から追加してもいいです。↓の「New Git Repositories...」から追加できます。
![截圖 2021-10-24 23.19.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/a14fe17d-fbc3-3bf5-a1f6-2e05c646c1d3.png)
#Step4：ブランチ作成、レポジトリ連結、プッシュ
まず、Git Repositoryを確認してみましょう。
エラーメッセージが出てないですね、よし、これで大丈夫です。（まだリモートと連結していないので、何もないはず）

```
MacBook-Pro:viewPop XXXX$ git remote -v
MacBook-Pro:viewPop XXXX$
```
準備できたから、あとはコマンドを入力すれば大丈夫なはずです！
まず、「master」というブランチを作成します

```
MacBook-Pro:viewPop XXXX$ git branch master
MacBook-Pro:viewPop XXXX$ 
```
次は、リモートと連結します。

```
MacBook-Pro:viewPop XXXX$ git remote add origin https://github.com/Wesley-chu/viewPop.git
MacBook-Pro:viewPop XXXX$
```

再度確認します。

```
MacBook-Pro:viewPop XXXX$ git remote -v
origin	https://github.com/Wesley-chu/viewPop.git (fetch)
origin	https://github.com/Wesley-chu/viewPop.git (push)
MacBook-Pro:viewPop XXXX$
```
よし、これで連結済みです。
最後は、ローカルのソースをリモートにプッシュすればいいです。

```
MacBook-Pro:viewPop chuwl$ git push -u origin master
Enumerating objects: 38, done.
Counting objects: 100% (38/38), done.
Delta compression using up to 4 threads
Compressing objects: 100% (34/34), done.
Writing objects: 100% (38/38), 12.91 KiB | 2.15 MiB/s, done.
Total 38 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/Wesley-chu/viewPop.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
```
↑成功！！
#最後に
GitHubで確認してみましょう！、、、
うまくあげたようですね！めてだしめてだし！
![截圖 2021-10-25 00.31.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326861/de900536-7334-6feb-a4ff-b78d2d608dad.png)
備忘録~ラジオボタンで入力値を残すには~

###ラジオボタンで入力値を残すには
```
<div>
  <input class="form-check-input" type="radio" name="status" id="status1" value="未読"
  <?php echo ($review['status'] === '未読')?'checked':'';?>>
  <label for="status1">未読</label>
</div>
```
valueの後にcheckedを入れることによって初期状態でチェックをいれておくことができる。
それと三項演算子を組み合わせる。

・三項演算子
(比較条件)?'TRUEの場合に返す値':'FALSEの場合に返す値'

```
 ($review['status'] === '未読')?'checked':''
```
入力された値が未読ならばchecked、そうでなければnull
↓　　　　　　　　　　↓　　　　　　　　　　　↓
これで未読のラジオボタンにチェックを入れると、次遷移しても初期状態でチェックが入るようになる。
未読のラジオボタンにチェックがはいっていなければnullを返すのでチェックは入っていない状態になる。
RaspberryPi4に最新（2021/10/25現在）のOpenCV、TensorFlow、JupyterLabをインストールする

インストール直後のRaspberryPiOSにOpenCV4、TensorFlow2、JupyterLabをインストールするための手順です。

#環境
RaspberryPi4 4GB
RaspberryPiOS Full 32bit (2021/05/07版）　※事前にapt update & upgradeを済ませておきましょう。

OpenCV 4.5.3.56
TensorFlow 2.5.0
JupiterLab 3.2.1

#前準備

```console
$ sudo apt update
$ sudo pip3 install pip --upgrade
$ sudo pip3 install numpy --upgrade
$ sudo apt purge python3-wrapt
```
ソースリストのアップデートと以降のモジュールインストールで必要なアップデートと削除を行います。

#OpenCVのインストール
```console
$ sudo apt install libaom0 libatk-bridge2.0-0 libatk1.0-0 libatlas3-base libatspi2.0-0 libavcodec58 libavformat58 libavutil56 libbluray2 libcairo-gobject2 libcairo2 libchromaprint1 libcodec2-0.8.1 libcroco3 libdatrie1 libdrm2 libepoxy0 libfontconfig1 libgdk-pixbuf2.0-0 libgfortran5 libgme0 libgraphite2-3 libgsm1 libgtk-3-0 libharfbuzz0b libilmbase23 libjbig0 libmp3lame0 libmpg123-0 libogg0 libopenexr23 libopenjp2-7 libopenmpt0 libopus0 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpixman-1-0 librsvg2-2 libshine3 libsnappy1v5 libsoxr0 libspeex1 libssh-gcrypt-4 libswresample3 libswscale5 libthai0 libtheora0 libtiff5 libtwolame0 libva-drm2 libva-x11-2 libva2 libvdpau1 libvorbis0a libvorbisenc2 libvorbisfile3 libvpx5 libwavpack1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwebp6 libwebpmux3 libx264-155 libx265-165 libxcb-render0 libxcb-shm0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxi6 libxinerama1 libxkbcommon0 libxrandr2 libxrender1 libxvidcore4 libzvbi0
$ sudo pip3 install opencv-python==4.5.3.56
```
[piwheels](https://www.piwheels.org/project/opencv-python/#install)を参照しました。
事前のモジュールインストールはFull版だとそれほど必要はなさそうです。
python3-wraptを削除（aptでインストールされている場合）しないとOpenCVのインストールに失敗します。

#TensorFlowのインストール
```console
$ sudo apt-get install -y libhdf5-dev libc-ares-dev libeigen3-dev gcc gfortran libgfortran5 libatlas3-base libatlas-base-dev libopenblas-dev libopenblas-base libblas-dev liblapack-dev cython3 libatlas-base-dev openmpi-bin libopenmpi-dev python3-dev
$ sudo pip3 install keras_applications==1.0.8 --no-deps
$ sudo pip3 install keras_preprocessing==1.1.0 --no-deps
$ sudo pip3 install numpy==1.20.3
$ sudo pip3 install h5py==3.1.0
$ sudo pip3 install pybind11
$ pip3 install -U --user six wheel mock
$ wget "https://raw.githubusercontent.com/PINTO0309/Tensorflow-bin/master/tensorflow-2.5.0-cp37-none-linux_armv7l_numpy1200_download.sh"
$ bash tensorflow-2.5.0-cp37-none-linux_armv7l_numpy1200_download.sh
$ sudo -H pip3 install tensorflow-2.5.0-cp37-none-linux_armv7l.whl
```
PINTO0309氏が作成したバイナリをインストールします。[こちら](https://github.com/PINTO0309/Tensorflow-bin)のインストール手順を参考にしました。

#JupyterLabのインストール
```console
$ sudo pip3 install jupyterlab==3.2.1
$ jupyter notebook --generate-config
```
上記のコマンドでインストールと初期設定を行います。

```console
$ jupyter lab password
```
上記コマンドで起動時のパスワードを設定します。

```console
$ jupyter lab
```
上記コマンドでJupyterLabが起動して、ブラウザが開きます。先ほど設定したパスワードを入力するとJupterLabが使用できます。

#最後に
最小限のインストールなのでもしかすると足りないモジュールがあるかもしれません。
それとインストールを順番通り（OpenCV>TensorFlow>JupyterLab）に行ってください。なぜかJupyterLabを最初にインストールしたら中途半端な状態でインストールされてしまって起動しませんでした。追加モジュールの関係なのでしょうか・・・・
順番通りにインストールすると問題なく起動します。
gitで修正が消えてしまって原因がわからないときに過去のcommitとマージする方法

# 初めに
原因がわかってないのでもしかすると間違っているかも知れません。
間違いが合った場合指摘していただけると幸いです。
# 結論
```
$ git cherry-pick <commit-id>
```
で任意のcommitとマージが出来る。
このcommitの前後は完全に無視してマージされるので、例えばこのcommitの後にdeleteされたファイルでもそのdeleteを無視してマージしてくれる。
なのでとりあえず原因がわかってなくてももとに戻すことができた。
(cherry-pickの意味はつまみ食い）
# 状況
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573723/c8bc5779-2a50-7c1e-8da6-a6a69ab6c454.png)

commit(8752bdd9)のときにcommitしたファイルがcommit(52f9240e)のときには消えてしまっていた。（おそらくどこかでdeleteされた）
直しようがなかったので `git cherry-pick 8752bdd9`したら治った。
pillow 3次元配列のグレースケール画像削除


グレースケールの画像を削除しようとして、2次元配列のものだけ削除すればいいかと思い、 shapeが２のもの削除してもグレースケールの画像は、削除されない場合がある。
なぜなら、３次元(RGB)のグレースケール画像があるから。（隠れグレースケール）
しかし、グレースケール画像の配列の中身は、同じなので、同じものを削除すれば大丈夫。

※ np.all(R == G == B) はエラーが出る。


```
def delete_gray(root):
    path_list = glob.glob(root+'*')
    for i in path_list:
        image = Image.open(i)
        image = np.array(image)
        R = image[:,:,0]
        G = image[:,:,1]
        B = image[:,:,2]
        if (np.all(R==G)) and (np.all(G==B)):
            os.remove(i)
            print('Delete {}'.format(i))

if __name__ == '__main__':
    delete_gray(root='/Users/name/DATASETS/path/')
```
CloudWatchのアラートをSNS経由でLambdaを実行し、Slack通知

# はじめに
今回はメモ書き程度になります。
題名の通り、構築していきます。

`Webhook URL`をKMSで暗号化する場合は、下記の記事通りにできます。
[【AWS】CloudWatchアラーム通知をLambdaでSlack投稿する](https://www.geekfeed.co.jp/geekblog/aws_cloudwatch_to_slack/)

ただ、KMSはお金がかかりますし、それほどセキュリティー対策が必要なければ、Lambdaの環境変数に、`Webhook URL`を設定します。

その場合のコードのみ参考記事とは異なりますので、コードを記載しておきます。
また、参考記事の①KMSを作成、②IAMを作成は不要です。


# コード
環境変数
`ProjectName`:`HOGE`
`hookUrl `:`Webhook URL`

```python
import boto3
import json
import logging
import os

from base64 import b64decode
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError

HOOK_URL = os.environ['WebhookURL']
PROJECT_NAME = os.environ['ProjectName']

logger = logging.getLogger()
logger.setLevel(logging.INFO)


def lambda_handler(event, context):
    logger.info("Event: " + str(event))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    logger.info("Message: " + str(message))

    reason = message['NewStateReason']
    alarm_description = message['AlarmDescription']

    slack_message = {
        'text': "<!channel>:exclamation: *%s* \nアラーム: *%s*\n\nアラーム詳細: %s\n確認中は:eyes:、完了後は:white_check_mark:をお願いします" % (PROJECT_NAME, alarm_description, reason )
    }

    req = Request(HOOK_URL, json.dumps(slack_message).encode('utf-8'))
    try:
        response = urlopen(req)
        response.read()
    except HTTPError as e:
        logger.error("Request failed: %d %s", e.code, e.reason)
    except URLError as e:
        logger.error("Server connection failed: %s", e.reason)
```

以下のようにSlack通知されます。

```
@channel! HOGE 
アラーム: dev環境、EC2のCPUが80%を超えました。
アラーム詳細: Threshold Crossed: 1 out of the last 1 datapoints [4.687429399225447 (28/10/21 01:57:00)] was less than the threshold (80.0) (minimum 1 datapoint for OK -> ALARM transition).
確認中は:両目:、完了後は:チェックマーク_緑:をお願いします
```
あなたの知っているJavaScriptはもう古い(書き方編 -その3- )

## おさらい
その１，その２で新しいJavaScriptの書き方について学んできました。
今回は最終回となるその３です。

https://qiita.com/k-tetsuhiro/items/9900665f200f0ca77e96

https://qiita.com/k-tetsuhiro/items/4e9e299f4f18f87ff8dc

## オブジェクトの省略方法
**オブジェクトのプロパティ名と設定する変数が同じ**場合、省略することができます。

```sample.js

const name = "タロウ";
const age = 20;

// userオブジェクト
const userObject = {
    name: name.
    age: age,
}

userObject // { name: "タロウ", age: 20 }のようなオブジェクトになる

// こんな感じでかけばプロパティ名を省略できる
// userオブジェクト
const userObject = {
    name,
    age,
}

userObject // { name: "タロウ", age: 20 }のようなオブジェクトになる
```


## map, filter
Ruby on Railsではお馴染みですが、これらもJavaScriptで使えます。
昔は配列に対して、for文でまわしてこんな感じで処理を書いていたかとおもいます。

```sample.js

var animal = ["トラ", "ねこ", "いぬ"]

for (var index = 0; index < animal.length; index++) {
    animal[index]; // とら、ねこ、いぬが順番にとりだせる
}
```
いちいちindexで要素の何番目というかたちで処理をしていったかと思います。

そこで、**mapをつかうことで簡単に配列に対して処理**ができます。
**mapは配列を順番に処理していって、処理した結果を返します**
配列.map()といった形で使用して、中身はアロー演算子で処理します。

```sample.js
const animal = ["トラ", "ねこ", "いぬ"]

// mapでの処理
const animal_copy = animal.map( (name) => {
    return name;
});

animal_copy; // ["トラ", "ねこ", "いぬ"]



const numbers = [10, 20, 30];

// mapでの処理で二倍すれば二倍したものが返さえる
const double_numbers = numbers.map( (number) => {
    return number * 2;
});

double_numbers; // [20, 40, 60]
```

mapではすべての要素に対して処理をしましたが、**fileterで条件に合うものだけが処理されて返却**されます。

```sample.js
const numbers = [1, 2, 3, 4, 5];

// 偶数のみを取り出す
const even_numbers = numbers.filter( (number) => {
    // 偶数は2で割り切れる
    return number % 2 === 0;
});

even_numbers; // [2, 4]
```


## まとめ
全３回でモダンなJavaScriptの書き方を学んできましたが、圧倒的に便利にかけるようになっている、、、！！（歓喜）
昔はこんな書き方でめんどくさかったなー（特に私はの場合はfor文とか、、、）っていう印象が強かったんですが、これはES2015を使うしかない！！どんどんJavaScriptを書くしかない！！ってことでこれからはReact書いていきます！
issueを作成できるようなスプレッドシートを作成した

## はじめに
GitHubにissueという機能があると思いますが、そのissueは一つずつ作成することしかできません。まとめて作成したいと思い調べてみたところ、GitHub　APIとGoogleスプレッドシートを使うことでできるようなので、今回そちらを作成してみました。

## 作ったもの
今回作成したスプレッドシートの概要は以下です。

- GitHub APIを使うための情報を記載するシートがある(今回はシート名を`settings`とした)
- 作成したいissueの概要を一覧で記載するシートがある(今回はシート名を`issues`とした)

#### `settings`シート
作った項目はこのような感じです。
![スクリーンショット 2021-10-24 23.00.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/1e245192-867b-c668-bf9b-6125b784699a.png)

#### `issues`シート
作った項目はこのような感じです。
![スクリーンショット 2021-10-24 23.00.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/46c46968-1f0e-9b47-021c-d850b731c032.png)

### スクリプト
実際にissueを作成するために書いたコードは以下です。
こちらのページに書いてある内容を参考に作成しました。
https://dev.classmethod.jp/articles/spreadsheet-to-github-issue/

```js
// github issue 作成エンドポイント
const githuburl = (owner_name, repository_name) => `https://api.github.com/repos/${owner_name}/${repository_name}/issues`;

// request 作成関数
const create_request = (url, access_token) => {
  return (payload) => 
    ({
      url: url,
      method: "post",
      headers: {
      Authorization : `token ${access_token}`
    },
      payload: payload
    });
};

const create_issue = () => {
  // シート情報取得
  const setting_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("settings");
  const owner_name = setting_sheet.getRange(2,1).getValue();
  const repository_name = setting_sheet.getRange(2,2).getValue();
  const access_token = setting_sheet.getRange(2,3).getValue();

  const issue_sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("issues");
  const lastRow = issue_sheet.getLastRow();
  const issueCount = lastRow - 1;
  const range = issue_sheet.getRange(2,1,issueCount,4); // A2 - C[issueCount]の範囲
  const issueRows = range.getValues();

  // issue 情報
  const issues = issueRows.map(row => ({title: row[0], body: row[1], assignee:row[2], labels: row[3] ? row[3].split(',') : []})); 

  // url
  const url = githuburl(owner_name, repository_name);

  // リクエスト作成用の関数作成
  const request = create_request(url, access_token);

  // リクエスト作成
  const requests = issues.map(issue => request(JSON.stringify(issue)));
  Logger.log(requests);

  // issue 作成リクエスト送信
  UrlFetchApp.fetchAll(requests);
}; 

// 確認
const confirmation = () => {
  const confirmed = Browser.msgBox("github issue を作成しますか？", Browser.Buttons.OK_CANCEL);
  if(confirmed == 'ok') {
    create_issue()
  }
};

// ファイルを開いたときにメニューを追加する
const onOpen = () => {
  const myMenu = [
    {name: "Issue作成", functionName: "confirmation"}
  ];
  SpreadsheetApp.getActiveSpreadsheet().addMenu("スクリプト",myMenu); //メニューを追加
};
```

## さいごに
今回はissueをまとめて作成できるスプレッドシートを作成してみました。一気にissueを作成することができるようになって色々と楽になりました。
Udemy「ネットワークエンジニアを目指す初心者はここから始めよう！「ゼロから学ぶネットワーク基礎」1024

ルータの基本機能
・異なるデータリンクを相互に接続する（同じデータリンクも可）。
・異なるネットワーク（サブネットワーク）を相互に接続する。
・ブロードキャストドメインを分割する。
・IPパケットの宛先となるネットワーク情報を収集して管理する。
・宛先に向かうための最適な経路を選択する。


データリンクの接続（1)
・異なるデータリンクプロトコルを相互に接続する。

データリンクの接続（2)
・メーカーや機種により使えるデータリンクプロトコルは異なる。

ネットワークの接続
・異なるネットワークを相互に接続する。


ブロードキャストドメインの分割
・ブロードキャストドメインはルータを超えることはできない。


経路情報の管理
・直接接続していないネットワークについても知る必要がある。
　・End-to-End 通信のためには、目的地（B、C）と誰に転送すれば良いか（R2、R3）を知る必要がある。
・経路（経路情報）…目的地となるネットワークへ到達方法のこと。
・ルーティング…経路を学習し、管理表にまとめること。

経路情報の学習
・学習方法はStaticルーティングとDynamicルーティングの2種類がある。
　・Staticルーティング…管理者が手動でルータに登録する。
　・Dynamicルーティング…各ルータ上でルーティングプロトコルと呼ぶ専用のソフトを使う。


Staticルーティング
・Nexthop:次にパケットを転送する先

Static vs　Dynamic
　・Staticは経路の変更は手動、管理上の負担は大きい、機種スペックは低い（Staticは管理者が全て決めるので計算の必要はない）。
　
　・Dynamicは経路変更は自動、管理上負担は小さい、機種スペックは高い（Dynamicは複数候補から、ルータ自身が計算する）。
railsチュートリアル第9章 ［Remember me］チェックボックス

##［Remember me］チェックボックス
［remember me］チェックボックスでログインを保持する方法を解説

####［remember me］チェックボックスをログインフォームに追加する
app/views/sessions/new.html.erb

```html
<% provide(:title, "Log in") %>
<h1>Log in</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(url: login_path, scope: :session, local: true) do |f| %>
    <!--セッションの場合はリソースのスコープとそれに対応するURLを具体的に指定する必要-->
      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :remember_me, class: "checkbox inline" do %>
      <!--remember_meチェックボックスを追加 うまく動作するために ラベルの内側に配置-->
        <%= f.check_box :remember_me %>
        <span>Remember me on this computer</span>
      <% end %>
      
      <%= f.submit "Log in", class: "btn btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>
```

####［remember me］チェックボックスのCSS
app/assets/stylesheets/custom.scss

```scss
/* forms */
.
.
.
.checkbox {
  margin-top: -10px;
  margin-bottom: 10px;
  span {
    margin-left: 20px;
    font-weight: normal;
  }
}

#session_remember_me {
  width: auto;
  margin-left: 0;
}
```
####remember me］チェックボックスの送信結果を処理する
app/controllers/sessions_controller.rb

```rb
class SessionsController < ApplicationController
・
.
.
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    # 送信されたメアドを使ってデータベースから取り出す。
    #emailを小文字にする
    if user &.authenticate(params[:session][:password])
    # user  取得したユーザーが有効かどうか？
    # その後にデータベース上にパスワードがあるか？
    # ユーザーログイン後にユーザー情報のページにリダイレクトする
    # &.は省略型
      log_in user
      # ユーザーのブラウザ内の一時cookiesに暗号化済みのユーザーIDが自動で作成
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      # ログイン中のremember_meハッシュをオン、オフにする
      # １がオン remember(user)を行う　
      # ０がオフ forget(user)を行う
      # 三項演算子
      remember user
      # ダイジェストをデータベースに記憶させる
      redirect_to user
      # 名前付きルート/userのビューを表示する
    else
      flash.now[:danger] = 'Invalid email/password combination'
      # flash.nowでリクエストが発生後メッセージを消滅する
      # エラーメッセージを作成する
        render 'new'
        # newアクションのビューを表示
    end
  end
.
.
.
```

###演習
1.
ブラウザでcookies情報を調べ、［remember me］をチェックしたときに意図した結果になっているかどうかを確認してみましょう。

remember_token、user_idが削除されていた。
2.
コンソールを開き、三項演算子を使った実例を考えてみてください（コラム 9.2）。

思いつかない　できない
目黒区のラーメン店をグラフデータベースneo4jで地図表示させてみた

# 概要
目黒区のラーメン店をneo4jで地図表示させてみます。
地図にラーメン店の位置を表示させるだけであれば、グラフデータベース使う必要ないですが、neo4jでの地図表示の一例として表示させてみます。

ブログ
https://ten-hope.com/113/

# 目黒ラーメン店データ
ラーメン店データファイルは、以下に格納する必要があります。
/Users/ユーザ名/Library/Application Support/Neo4j Desktop/Application/relate-data/dbmss/dbms-******データベース毎に異なる/import

目黒区のラーメン店データファイル（ここでは、place1.csv）は、
位置ID、店名、店舗タイプ（ラーメン）、緯度、経度
データが80件のデータとします。


# neo4jへの取り込み
それでは、まずはインデックスを作成します。
```ruby:cypher
create index on :Place(id);
create index on :Place(location);
create index on :Place(name);
```

続いて、ラーメン店データファイルを読み込みます。
```ruby:cypher
load csv with headers from
"file:///place1.csv" as csv
create (p:Place {id: csv.PlaceId, name:csv.PlaceName, type:csv.PlaceType, location:point({x: toFloat(csv.Lat), y: toFloat(csv.Long)})});
```
# 地図表示用のNeomapのインストール
ここでは地図表示用のNeomapをインストールします。
Neo4j Desktopの「Graph Apps」の「Install」に「https://registry.npmjs.org/neomap」と入力してインストールします。（下はインストール後）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684662/6d224e04-70f5-e2d6-bf7e-54ee3f2bca64.png)

インストール後、上記のNeoMapをクリックして、Neomapアプリを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684662/3ec5e7e2-1b53-f58f-051e-0b13687b347f.png)

# 地図表示
New layerをクリックして、
　・Nmae　：　ramen
　・Layer type ：　Advanced(cypher query)
　・Query :
MATCH (n:Place)
RETURN n.location.x as latitude, n.location.y as longitude
LIMIT 100
・Rendering　：　Markers

上記設定をして、「Update map」ボタンをクリックします。目黒区のラーメン店が青点で表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684662/02bd52aa-7d63-3d58-2b40-05ecd2daa0c6.png)

続いて、「New Layer」をクリックして、
　・Nmae　：　ramen heatmap
　・Layer type ：　Advanced(cypher query)
　・Query :
MATCH (n:Place)
RETURN n.location.x as latitude, n.location.y as longitude
LIMIT 100
・Rendering　：　Heatmap
上記設定をして、「Update map」ボタンをクリックします。新しいレイヤーに目黒区のラーメン店のヒートマップが重ねて表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684662/33c68b4c-3bbc-4fc8-03ed-5ce2f1ae1944.png)

簡単に地図表示できましたね。
幹事をランダムに設定する


#前回投稿した記事の応用編

https://qiita.com/tkht2401/items/63406354e17566e3ae11

sampleメソッドを使って、より応用したBooleanの「true, false」を切り替えたいと思います。

**この記事が少しでも良かったと思ったらLGTMを押していただけたら嬉しいです！！**

##前提条件

group：memberrをたくさん持つ
member ：たくさんのgroupに所属する
group_member : 中間テーブル 

**グループとメンバーは多対多の関係です！**
そして、グループに加入したメンバーの中からランダムに幹事を設定できること。

流れとしては、
自動設定するを押すとグループに参加のメンバーの中から、
Role（役割）が、organizer(幹事)かregularにランダムに変わります。

今回はsampleメソッドを使うので、少し制限もつけます。
①幹事は一グループにつき一人まで
②メンバーは二回連続で幹事にならない

#イメージ図
![qiita_boolean.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061608/f979428f-7cb5-1137-2c81-53afe7115272.png)

#やること

中間テーブルに幹事を設定するカラムを追加

```rb
rails g migration AddOrganizerToGroupMembers organizer:boolean
```

**booleanのステータス**
falseの場合　⇒　regular
trueの場合　⇒　organizer

マイグレーションファイルの設定は、defaultをfalseに設定する

```rb
class AddOrganizerToGroupMembers < ActiveRecord::Migration[6.1]
  def change
    add_column :group_members, :organizer, :boolean, default: false
  end
end
```

#ルーティングの設定

```rb
 resources :groups, only: %i[show new edit create update destroy] do
    resources :group_members, only: %i[create destroy]
    post 'random_organizer' => 'group_members#organizer'
  end
```

#コントローラーの設定

```rb
def organizer
    
    # グループidを取得
    group = Group.find(params[:group_id])

    # organizerメンバーを１つ取得
    organizer = group.group_members.find_by(organizer: true)

    # regularメンバーを取得
    regular_members = group.group_members.where(organizer: false)

    # グループメンバーのregularが存在していれば、ランダムにtrueに変更
    regular_members.sample.update(organizer: true) if regular_members.present?

    # グループメンバーのorganizerが存在していればorganizerをfalseに変更
    organizer.update(organizer: false) if organizer

    redirect_to request.referer

  end
```

###解説

①regular_membersでregularメンバーの中から、
sample.updateでランダムに一つだけtrueに切り替える。（regular　⇒　organizer）

②organizer.update(organizer: false) if organizerで幹事を必ずfalseにするので、
絶対に二回連続で幹事にはならない。（organizer　⇒　regular）


#ビュー画面

```erb
<%= link_to "自動設定する", group_random_organizer_path(@group), method: :post %>
```
これでランダムに幹事を設定できると思います！

#最後に
イメージ図の感じだと、まさかこんなに苦労するとは思いませんでした、、（笑）
もっとステップアップしていきたいと思います！！
Laravelでマイグレーションファイル実行時にGeneral error: 1824 Failed to open the referenced table

# 事象
マイグレーション実行時に外部キー制約に関するエラーメッセージが表示される

```console
General error: 1824 Failed to open the referenced table
```

# マイグレーションファイルの作成順序が不正

参照されるテーブルを先に作成する必要がある。
外部キーを持つテーブルはそのあとに作成する。

# 対策
マイグレーションファイルのファイル名の日時の部分の数字をいじって、順序を正しく並べ替える。

先頭からの数字は年月日時刻を表していて、その数字が若い順番にマイグレーションは実行されるので、大小関係に気をつけて数字をいじる！

# 教訓

中間テーブルは最後に作らないといけないね！
HTML初心者のためのマークダウン記法

## 執筆の背景

|マークダウンについて|
|:---|
|　僕はHTML初心者です。業務でHTMLは読むことは多いですが、直接書く業務をしたことがなくあやふやな知識という状態です。<br>　そんな僕でもHTMLの簡略版みたいなマークダウンはとても書きやすく重宝しており、書類作成などの業務でもよく使っています。ただ、マークダウンはあくまでもHTMLの簡略版なので細かい指定をしようとするとどうしてもHTMLの知識が必要な感触があります。<br>　本記事では僕と同じようにHTMLの知識は乏しいけどマークダウンは使いたいという方のために、マークダウン記法での文章作成で使えそうなHTMLの知識について気づいたことを書こうと思います。|

## ■1. ```<br>```

改行要素です。

通常マークダウンで改行をしたいときは半角スペースを二つ書くと改行してくれます。しかし表の中の文章で改行をしたいと思ったときに半角スペースを二つ書いても三つ書いても改行してくれません。。。
そんなときは```<br>```を入れて改行をしています。上の執筆の背景を記載するときも改行するときは```<br>```を入れて書きました。

```
|マークダウンについて|
|:---|
|　僕はHTML初心者です。業務でHTMLは読むことは多いですが、直接書く業務をしたことがなくあやふやな知識という状態です。<br>　そんな僕でもHTMLの簡略版みたいなマークダウンはとても書きやすく重宝しており、書類作成などの業務でもよく使っています。ただ、マークダウンはあくまでもHTMLの簡略版なので細かい指定をしようとするとどうしてもHTMLの知識が必要な感触があります。<br>　本記事では僕と同じようにHTMLの知識は乏しいけどマークダウンは使いたいという方のために、マークダウン記法での文章作成で使えそうなHTMLの知識について気づいたことを書こうと思います。|
```

## ■2. 挿入写真について

マークダウン記法で写真を挿入するときは通常次のように書くと思います。

```markdown
!['テキスト']('画像のurl')
```

しかし通常のマークダウンの書き方ではサイズとか位置とかの指定はできません。。たぶん

### ・ 2-1_サイズ

次のように書くとサイズの指定ができます。

```
<img src="画像のurl" width="サイズ">
```

サイズの書き方は2通り。
- ピクセル指定：width="320px"
- 割合指定：：width="80%"

ちなみにvscodeの拡張機能でマークダウンをPDFによくしたりするのですが、画像のサイズがでかくてページの区切りが悪いときに使ったりします。

## おわり

今後も何か便利な書き方に気づいたら追記しようかなとおもいます。また背景にも書きましたが僕はHTMLは半端な知識しかないので、間違っていたり、こんないい方法もあるよみたいなことを指摘していただけたら泣いて喜びます。。。！
SwiftUI List 復習

#今回の内容
<img width="150" alt="91AF132C-C871-4075-B980-07D1D28B36B6_4_5005_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466343/37a4f240-38be-5d71-192a-2dd0239098c5.jpeg">


#コードと簡単解説

* `List{}`内で表示したい`Text`や`Image`などを設定していきます。
* `Section`で`header`や`footer`の表示ができます。
* `header`や`footer`の見た目も変更ができます。
* 今回は、作成しておいた`listContents`内の値を`ForEach`で全て表示する様にしています。
* `.listStyle()`で好きな`List`の見た目に変更ができます。

```Swift:
import SwiftUI

struct ContentView: View {
    
    let listContents = ["Swift","Kotlin","Dart","Python","Ruby","Java","PHP","Go","JavaScript","TypeScript","C#","C++",]
    
    var body: some View {
            
        List{
            Section(header: Text("Header").foregroundColor(.green).font(.title), footer: Text("Footer").foregroundColor(.red).font(.title)){
                
                ForEach(0..<listContents.count){ number in
                 
                    HStack{
                        
                        Text(String(number)).padding(.trailing, 70)
                        Text(listContents[number])   
                    }                  
                }
            }          
            Section(header: Text("Header"), footer: Text("Footer")){
                
                ForEach(0..<listContents.count){ number in
                 
                    HStack{
                        
                        Text(String(number)).padding(.trailing, 130)
                        Text(listContents[number]) 
                        
                    }
                    
                }
            }        
        }.listStyle(InsetGroupedListStyle())      
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```


# 終わり
ご指摘、ご質問などありましたら、コメントまでお願い致します。
windows11の特徴について

#初めに
新たにwindows11がリリースされ、興味がありましたので下記にまとめて見ました
なお、本記事については、下記の書籍を参考にしました。
・日経PC21 2021年12月号 (日経BPマーケティング)

#windows10との違いは？
個人的に興味を持った部分を抜粋

###●タスクバーが中央揃えに変更
　デフォルトの設定で中央揃えで表示される
　アイコンのデザインも変更されていた
　設定の変更により左揃え、右揃えに変更する事も可能
　しかし、画面の左右及び上にタスクバーの配置が不可となり、画面下に固定される仕様となった

###●エクスプローラのリボンUIが廃止
　エクスプローラのリボンUIが廃止
　代わりに、メニューバーが追加され、そのメニューよりフォルダの共有化や並び替え等の操作は可能
　※表示がシンプルになった印象
		
###●コンパクトビュー機能が追加
　エクスプローラにて表示設定を「コンパクトビュー」に変更する事で、検索項目間の余白を狭める事が可能
　検索結果として表示される項目数を増やす事が出来る
	
###●クリーンアップ機能に「ゴミかもしれいない」項目が追加
　Cドライブのクリーンアップ機能で、「一時ファイル」だけでなく、ユーザ操作により作成されたファイルも対象として、列挙される
　画面上で操作し、削除対象から除外する事も可能
		
###●CPU機能が上昇
　オフィスアプリの処理性能を比較すると、1.5倍程上昇し、アプリ内での操作がよりスムーズになるとの事
		
#いつから使えるの？
　2021年10月5日にリリースされている為、対応PCを購入する事で使える
　また無料のwindows Updateを経由する事でも使用する事が可能
　無料アップグレードの期間は無期限ではないが、1年間(2022年10月まで)は終了しない予定との事
　但し、下記の条件に該当するPCでないとアップグレードが出来ない

###アップグレード可能PC条件
　・CPU:1GHz以上で2コア以上
　・メモリ:4GB以上
　・ストレージ:64GB以上
　・グラフィックス:DirectX 12以上
　・システムファームウェア:UEFI、セキュアブート対応
　・TPM:TPM2.0以上
　　　※かなりスペックの高いPCが必要

#すぐに購入orアップグレードするべきか、否か？
　windows10のサポートは継続されるので、すぐに購入(orアップグレード)する必要はないといえます。
　windows10のサポートは2025年10月14日(4年後)に終了する予定の為、それまでに対応を進めれば問題はない

#まとめ
　windows10と比較すると、デザイン面で大きく変化があり、既存のwindowsに慣れていると、かなり違和感がある印象です。
　スペック自体は高くなっている印象もありますが、実際に使用してみないと不明です。
　実際し使用してみた感触を記事に起こしてみたいです。
　すぐに適用する必要もないので、3年前後はwindows10でも問題はないかと考えられます。
　ただwindows10のサポート停止予定日も明記されていますので、それまでに備える必要はあります。
Autoware.Auto をインストール

# 概要

前回 [第３回自動運転AIチャレンジ まずは環境構築](https://qiita.com/Wurly/items/b53fc8eced95c1517cf7) の続き。

Autoware.Auto からソースを持ってきて、ゴリゴリつくるしかないと思われるので、次は本物の Autoware.Auto を持ってきてインストールしてみる。

# 作業内容

https://document.wurlyhub.com/html/Autoware_auto.html

ここから何らかのデモ(AVPなど)を動かしたいのだが、立ち上げ方がわからない。

GitLabのissueを眺めてみる。

[Test AVP Demo with SVL Simulator 2021.3 Release](https://gitlab.com/autowarefoundation/autoware.auto/AutowareAuto/-/issues/1358) とか
[Autoware.Auto with SVL Simulator](https://www.svlsimulator.com/docs/system-under-test/autoware-auto-instructions/) が参考になりそうか？


続く。
Flutterを使うためにやったこと

## はじめに
Flutterを使うために色々とインストールを行う必要があったのですが、思いのほか大変だったので備忘として残します。

## Flutterを使うためにやったこと
### Flutterの公式サイトに訪れてみた
はじめにとりあえず[Flutter](https://flutter.dev/)の公式サイトに訪れてみました。訪れてみると「Get started」があったのでそちらを確認してみました。

### インストール
「Get started」を進んでいくと、Flutterをインストールする画面が出てきます。自分のOSにあったものをインストールしてください。

インストールのやり方の例は記載されているので、確認しながらやってみてください。

### `flutter doctor`
パスを通した後は、コマンドライン上で`flutter doctor`を実行をします。ここで何もなければ完了ですが、自分の場合は色々とエラーが出ました。

#### ①`Flutter requires a minimum Xcode version of 12.0.1.`
Xcodeが必要と言われているので、App Storeからインストールしました。

#### ②`Xcode requires additional components to be installed in order to run.`
こちらのエラーに関しては、以下のコマンドを叩くことで完了します。

```zsh
$ sudo xcodebuild -runFirstLaunch
```

#### ③`CocoaPods not installed.`
CocoaPodsがそもそもわからなかったので、[公式ページ](https://cocoapods.org/)を確認してみたところ、以下の記述がありました。

```
CocoaPods is a dependency manager for Swift and Objective-C Cocoa projects. 
```
つまり、CocoaPodsはSwiftやObjective-Cの依存管理システムということでした。

CocoaPodsのインストールの仕方は、[エラー文に記載されているページ](https://guides.cocoapods.org/using/getting-started.html#installation)にコマンドがあるので、それを実行してください。

```zsh
$ sudo gem install cocoapods
```

#### ④`cmdline-tools component is missing`
こちらのエラーに関してはAndroid Studioを使います。まず、Android StudioのPreferencesを開きます。

Preferences > System Settings > SDK Tools > Android SDK Command-line Tools(latest)の順でボタンをクリックしていき、コマンドラインツールを適用して完了です。

エラー文に書いてあることをやってみましたができなかったので、以下の記事を参考にしたらできました。
https://milkybear.hatenablog.com/entry/2021/08/08/125751

#### ⑤`Android license status unknown.`
指定のコマンドを実行と出てくるので、そのコマンドを実行します。

```zsh
$ flutter doctor --android-licenses
```

## さいごに
以上で諸々のエラーが無くなりました。思いの外大変だったので、記録に残しておきたいと思います。
[TypeScript] Typed Redux Sagaで型安全なsagaを書く

## Redux-Sagaのcallで型推論が効かない

例えばこのようにユーザーを取得するようなsagaを作ることを考えます。

(例では前提としてRedux Toolkitを使っています)

```typescript
import { call, put, takeEvery } from 'redux-saga/effects'
import { createAction } from "@reduxjs/toolkit";
import { UserApiClient } from '@api/user'
import { usersActions } from '@redux/modules/users'

const actions = {
  fetchUser: "users/fetchUser",
} as const;

const actionCreators = {
  fetchUser: createAction<{ userId: string }>(
    actions.fetchUser
  ),
}

function* fetchUser(action: ReturnType<typeof actionCreators.fetchUser>) {
   try {
      const user = yield call(UserApiClient.fetchUser, action.payload);
      // user has type "any"
      yield put(usersActions.success(user));
   } catch (e) {
      yield put(usersActions.failure(e.message));
   }
}

function* usersSagas() {
  yield takeEvery(usersActions.fetchUser, fetchUser);
}

```

`UserApiClient.fetchUser`が `Promise<User>` 型を返す関数の場合、call関数で非同期実行するとuserに代入されるのは `User` 型の値となりますが、TypeScriptではyield式の左辺はany型になってしまいます。

そのためこの場合、型アサーションで `const user: User = yield call(UserApiClient.fetchUser, action.payload)` としてやる必要があります。

また同様に、並行して複数のEffectを実行するall関数もany型で返ってきます。

## Typed Redux Sagaを使う

Typed Redux SagaというRedux-SagaのWrapperがあります。

https://github.com/agiledigital/typed-redux-saga

これを使うと先ほどの例はこう書けます。

```diff_typescript
- import { call, put, takeEvery } from 'redux-saga/effects'
+ import { call, put, takeEvery } from "typed-redux-saga";

function* fetchUser(action: ReturnType<typeof actionCreators.fetchUser>) {
   try {
      const user = yield* call(UserApiClient.fetchUser, action.payload);
      // user has type "User"!
      yield* put(usersActions.success(user));
   } catch (e) {
      yield* put(usersActions.failure(e.message));
   }
}

function* usersSagas() {
  yield* takeEvery(usersActions.fetchUser, fetchUser);
}
```

`redux-saga/effects` の代わりに `typed-redux-saga` が提供している関数を使います。
また、 `yield call()` ではなく `yield* call()` と書きます。

こうすることで型をアサーションしなくても返り値を推論してくれるようになります。

## なぜ型推論ができるようになるのか

`yield` はanyを返すのに対し、 `yield*` は指定したジェネレータの返り値を推論してくれます。

```typescript
function* getCount() {
  const count: number = yield 1;
  return count;
}

function* testGenerator() {
  // 'yield' expression implicitly results in an 'any' type because its containing generator lacks a return-type annotation.
  // countAny is any
  const countAny = yield 1;
  // countNumber is number
  const countNumber = yield* getCount();
}
```

`typed-redux-saga` のcallはジェネレータで、`redux-saga/effects` のcallをwrapしているだけです。

```typescript
import { call as rawCall } from "redux-saga/effects";

export function* call(...args) {
  return yield rawCall(...args);
}
```

## [Typed Redux Saga](https://github.com/agiledigital/typed-redux-saga)に置き換える

Redux-SagaのEffectsで書いていた部分をTyped Redux Sagaに置き換えたい場合、こちらのESLint Pluginを使うと便利です。

https://github.com/jambit/eslint-plugin-typed-redux-saga

READMEにある通りルールを追加することで、 `redux-saga/effects` を使っていると警告してくれます。
さらにautofixで自動的に `typed-redux-saga` からimportするように置き換えてくれます。

## 参考

- [Redux-Saga の CallEffect の返り値が常に any なのを typed-redux-saga は使わないでなんとかする](https://o296.com/2020/09/28/redux-saga-call-type.html)
Linuxのバックアップ手段

今回はLinuxのバックアップ方法をいくつか掲載していきます。
以前、バックアップに使用される`rsync`コマンドについて紹介しましたが、今回はLinuC Level2の試験対策と個人用サーバーのバックアップ方法を検討する目的で様々なバックアップ方法を掲載します。

#バックアップの種類
##フルバックアップ
バックアップ対象を全てバックアップする方法です。
毎回全てをバックアップに含めるので2回目以降に実施したバックアップの内容はオリジナルと完全一致します。
ただし、2回目以降のバックアップも最初のバックアップと同じくらい時間がかかります。

##差分バックアップ
前回のバックアップ以降で新たに作成、または更新されたファイルやディレクトリのみバックアップ対象となります。
そのため、フルバックアップに比べて2回目以降のバックアップの時間は少なく済みます。
当然リストアの際には最後のフルバックアップ分と最新の差分バックアップ分のバックアップが必要になります。

##増分バックアップ
フルバックアップ、差分バックアップ含めて最後に実施したバックアップに対して新たに作成、または更新されたファイルやディレクトリのみバックアップ対象とします。
差分バックアップよりもさらにバックアップの時間が少なくなりやすいですが、その代わりリストア時には最後に実施したフルバックアップとそれ以降の差分、増分バックアップのファイル全てが必要となります。

#バックアップに使われるコマンド
各コマンドの全てのオプションについてはコマンドで検索すれば出てくるはずですので、本ページでは主にバックアップ・リストア向けのオプションを掲載しています。
##tarコマンド
`tar`コマンドは指定したファイルやディレクトリからアーカイブを作成するコマンドですが、バックアップの手段として使われる事もあります。
tarコマンドのオプションは`-`を省略できます。

```ruby:バックアップ一例
基本(無圧縮)：
tar cvf <アーカイブ作成先> <バックアップ対象ディレクトリ> #vオプションを抜くと詳細情報を表示しない
圧縮する場合：
tar czvf <アーカイブ作成先> <バックアップ対象ディレクトリ> #gzipで圧縮する　bzip2ならzをjに、xzならzをJに変える
差分バックアップを行う：
tar czuvf <アーカイブ作成先> <バックアップ対象ディレクトリ> #アーカイブ作成先にある同名のアーカイブファイル内よりも新しいファイルのみアーカイブファイルへ追加
リストアする：
tar xavf <バックアップアーカイブファイル> -C <展開先ディレクトリパス> #aオプションでアーカイブファイルの拡張子から自動でアーカイブの圧縮形式を判別する
```

##ddコマンド
`dd`コマンドは指定したファイルをブロック単位で読み込みし、指定した形式でファイル出力します。
デバイス全体のバックアップも可能なので、とても簡単です。
`dd`コマンドは`if=`で処理対象ファイルを指定し、`of=`で書き込むファイルを指定します。
書式は`dd if=<対象ファイル> of=<出力ファイル>`が基本となり、ifとofの順番はこの通りでなくてはなりません。
また、ifとofで指定する内容が逆になってしまうと、バックアップ対象の内容が破損してしまうので、注意が必要です。
オプションはifの前でもofの後でも通ります。

```ruby:バックアップ一例
デバイス全体バックアップ：
dd if=/dev/sdX of=/dev/sdY #sdXはバックアップ対象デバイスで、sdYはバックアップ先のデバイス
isoファイルにまとめる場合：
dd if=/dev/sdX of=/dev/sdY/sdX.iso #sdXはバックアップ対象デバイスで、sdYはバックアップ先のデバイス
isoファイルからリストアする場合：
dd if=/dev/sdY/sdX.iso of=/dev/sdX #上記コマンドのifとofの対象を入れ替えるだけ
一度に読み書きするサイズを指定する場合：
dd if=/dev/sdX of=/dev/sdY bs=1024 #単位はバイト
```

##dumpコマンド
`dump`コマンドはext2,ext3,ext4のファイルシステムをバックアップするためのコマンドです。
リストアする場合はそのまんま、`restore`コマンドが該当します。
主にテープデバイスでバックアップするために使われるコマンドの様なので、他のバックアップコマンドと比べてあまり使う機会は無いかもしれませんが、LinuC Level2出題範囲のようなので。

```ruby:バックアップ一例
基本(フルバックアップ)：
dump -f <バックアップファイル名> <バックアップ対象ディレクトリ> #
圧縮する場合：
dump -zf <バックアップファイル名> <バックアップ対象ディレクトリ> #zはgzip形式、jはbzip2形式で圧縮を行う
増分バックアップを行う：
dump -uzf <バックアップファイル名> <バックアップ対象デバイス> #2回目以降は-1uzfという具合に差分レベル<1～9>を指定する
#2回目以降もバックアップレベルを常に1に指定すると差分バックアップとなるが、以降差分レベルを1ずつ増やしていくと増分バックアップになる
```

リストアする場合は、以下の通りです。

```ruby:リストア一例
restore rf <バックアップ格納先ディレクトリパス> #バックアップファイルが格納されているディレクトリ内の全てのバックアップを対象とする
```

ローカル上でバックアップを実施する場合のコマンドの一例は以上です。
ネットワーク越しにバックアップするための方法は[こちら](https://qiita.com/fy406/items/64821f497ce7778bb589)に掲載しています。
技育展というイベントに登壇した話．

<!-- Markdownのテンプレート -->
こんにちは．
[REAL12E soft.](https://twitter.com/REAL12E_soft) です．
REAL12E soft. はOclusQuest2をかぶってるALIKAと白塗りのSadmachineの2人から構成されています．
技育展登壇時にはHaveN（ヘイブン）というサークル名でしたのでそっちの方がなじみがあるかもしれません．
が，名前変わったので以後お見知りおきを！

今回は技育展参加レポートを書きます．
やったことなんかを備忘録的に書いていきます！

## 目次
<!-- @import "[TOC]" {cmd="toc" depthFrom=2 depthTo=3 orderedList=false} -->
<!-- code_chunk_output -->
- [技育展とは](#技育展とは)
  - [概要](#概要)
  - [申し込みとか](#申し込みとか)
- [技育展でやったこと](#技育展でやったこと)
  - [開発前にあったこと](#開発前にあったこと)
  - [実際に開発](#実際に開発)
  - [リリース](#リリース)
  - [9月25日 はじめてのアウトプット③ プレゼン本番](#9月25日 はじめてのアウトプット③ プレゼン本番)
  - [結果発表](#結果発表)
- [まとめ](#まとめ)

<!-- /code_chunk_output -->
## 技育展とは

### 概要

技育展とは，[株式会社サポーターズ](https://talent.supporterz.jp/)が主催している__学生エンジニアのアウトプットを展示するイベント__です．
今年は2回目の開催で最終的な賞金総額はなんと550万円でした．
公式の開催に際しての説明としては

__技育展は、アウトプットの促進を目的としたエンジニアを目指す学生のためのピッチコンテストです。
自らのアウトプット（作品）を展示（プレゼン）し、もの創りの楽しさ、厳しさ、可能性を知ることができます。__

となっています．
とりあえず，主催しているサポーターズが出している[この記事](https://note.com/geek_pjt/n/n3d0a81c3b149)を読むともっと理解が深まるかもしれません．

登壇テーマは9つあり，我々Rea12E soft.は__はじめてのアウトプット③__に登壇しました．

### 申し込みとか
募集期間も意外と短いので早めに必要書類をそろえて応募しましょう．
そして当たり前ですが，発表したい内容などについて書く必要があります．
しっかりと__明確にどんなアプリケーションを作っていて，なぜ発表したいのか__を書ければOKだと思います．
任意ですがデモ動画を提出する欄があります．
個人的に任意と言われると出さずにいられない性格なので，開発途中でしたがYouTubeにアップロードして送りました．
動画があると雰囲気なんかも伝えやすいので，おすすめです．

### 我々が持ち込んだ企画について
ここで少し私たちREAL12E soft.（旧HaveN）がどんなものを作りたい！ と言って応募したかについて触れておきます．

私たちが応募した企画は Oculus Quest向け[__VR迷路ゲーム「αMaze」__](https://sidequestvr.com/app/5394/maze) というものです．
簡単に言うと
__迷路ゲームって解けないとむっちゃイライラするやん？
じゃ，イライラしたら迷路を爆破しちゃおう！__
というゲーム内で感じたストレスをゲーム内で解消することまでできるゲームです．
以前から少しずつ作っていましたが，締め切りがなかったのでだらだら続けていたのでいい機会だからちゃんと完成させようという気持ちもあり応募しました．
応募時はまだまだだった作品でしたが，開発期間中に本気で取り組んで何とか完成させました．

## 技育展でやったこと
しつこいですが，我々が登壇したのは__はじめてのアウトプット__です．

### 開発前にあったこと
本開発開始前の9月上旬にサポートしてくださる企業さんたちとの顔合わせがあります．
その後1週間程度の期間でサポート企業さんたちとマッチングの上，面談することもできます．
~~私たちは一切なかった．~~
たまにフリーで相手をしてもらえる時間なんかを作っていただける企業などもありました．
そこでは開発のことだったり，就活のことだったりを質問できたりして楽しかったです．
とても個人的な感想ですが，人と話しながら思いつくアイデアはたいてい面白い感じになるのでお勧めです．

### 実際に開発
9月上旬の開発前の顔合わせから本格的に開発を開始しました．
開発期間はおよそ3週間程度．
目標としては

- ちゃんと動くこと
- Oculus Quest向けなのでSideQuestで配信するところまでやる

の2点を設定し死ぬ気で開発しました．

ここでは書ききれないほど色々ありましたが，主な事故を説明すると

- GitHubでコンフリクト起こしまくった
- 入れるべきUnityPackageをミスって死にかけた

あたりでしょうか．
本当に肝を冷やしました．
特にコンフリクトが本当にしんどくて途中でPlasticSCMに逃げたりしましたが，結局GitHubに戻って迷走したり……
挑戦にはいろいろな困難が付き物かと思いますが，マジで心臓に悪い．
あと，バックアップ大事です．
ちなみにですが9月23日にゲーム自体は完成させました．

### リリース 
ゲーム完成は発表2日前に完了と順調に思いますが，SideQuestでのリリース作業があります．
申請は発表前日である9月24日夜ごろに行い，速攻で承認されたので無事公開されました．
やったね！
以下，アップロードした作品URL
https://sidequestvr.com/app/5394/maze

### 9月25日 はじめてのアウトプット③ プレゼン本番
誰よりもエンタメを意識したプレゼン行うことにしました．
正直お叱りを受けると思っていましたが，受け入れてもらえたようでとても嬉しかったです．
開発したゲームについては，いかにこだわって作ったかを伝えられるようなプレゼンができ良かったです．

### 結果発表
ドキドキの結果発表の10月5日……
はじめてのアウトプット部門にて優秀賞を受賞できました！
本当にありがとうございました．

そして，ちょまどさんMatsさんの前でプレゼン．
勢いよくプレゼンしたら以下のような反応をいただけました．

https://twitter.com/chomado/status/1446721710531637254

本当にありがとうございました．
## まとめ
以上、我々REAL12E soft.がはじめて技育展というイベントに参加し，はじめてのアウトプットという部門で優秀賞を受賞するまでの物語でした．
はじめてづくしで色々苦労することもありましたが，こうして記事を書くまでに至りました．
この経験を活かし，今後もVRでの開発を頑張っていこうと思います！

最後に，ここまで読んでいただきありがとうございました！

~~(来年は無駄開発なんかで登壇できたらいいな……)~~
go get時にpackage embed: unrecognized import path "embed" (import path does not begin with hostname)が表示される



## go getでpackage embed〜が出る

```
$ go get -u github.com/****/****
package embed: unrecognized import path "embed": import path does not begin with hostname
```

ちなみに、遊ぶ目的でojichatをインストールしようとしていた感じでした :joy: 笑
参考）　https://github.com/greymd/ojichat

## embed packageとはなんぞや

リリースノート見てみると、go 1.16から追加された様子
https://go.dev/blog/go1.16

## バージョンを確認してみる

```
$ go version
go version go1.15.14 linux/amd64
```

ありゃ。
ということで、goのバージョンをあげます。
https://golang.org/dl/go1.16.linux-amd64.tar.gz
↑
こちらからwgetでダウンロードしてきてインストールし、パスを通します。

```
$ go version
go version go1.16 linux/amd64
```

go 1.16にあげたらgo getで問題なくダウンロードが開始されました。めでたし。
ABC224 チャレンジ結果

ABC224結果：AB2完
Cが終了後数分でACに持っていけたため非常に悔しい思い...
図形問題苦手です.

A：文字列の末尾で場合分け

```python:Tires.py
S = input()
if S[-1] == "r":
    print("er")
if S[-1] == "t":
    print("ist")
```

B：for文の途中終了の仕方イケてない, 冗長やし他にやり方ないものか.

```python:Mongeness.py
H, W = list(map(int, input().split()))
A_list = []
for i in range(H):
    X = list(map(int, input().split()))
    A_list.append(X)

flag = True
for i1 in range(H):
    X = 0
    for i2 in range(i1+1, H):
        Y = 0
        for j1 in range(W):
            Z = 0
            for j2 in range(j1+1, W):
                if A_list[i1][j1] + A_list[i2][j2] > A_list[i2][j1] + A_list[i1][j2]:
                    flag = False
                    print("No")
                    X += 1
                    Y += 1
                    Z += 1
                    break
            if Z == 1:
                break
        if Y == 1:
            break
    if X == 1:
        break

if flag == True:
    print("Yes")
```

C：三角形にならない三点とは？→三点が一直線上にある→傾きが一致するか判定すればいい！
ここまではよかったが, 精度の関係上非常に直線に近い三角形を直線判定してしまい時間内にACできず. 傾きではなく比で比較するとACできた.
なお傾き比較でもlong double型を使えばできるようです(未確認).

```python:Triangle?.py
import math

N = int(input())
ten = []
for i in range(N):
    Z = tuple(map(int, input().split()))
    ten.append(Z)

num = 0
for i in range(N-1):
    A = []
    b = 0
    for j in range(i+1, N):
        x = ten[i][0] - ten[j][0]
        y = ten[i][1] - ten[j][1]
        if x != 0:
            k = math.gcd(x, y)
            x1 = x // k
            y1 = y // k
            if x1 < 0:
                x1 = -x1
                y1 = -y1
            A.append((x1, y1))
        else:
            b +=1
    B = set(A)
    for m in B:
        if A.count(m) >= 2:
            c = A.count(m)
            n =  c * (c-1) / 2
            num += n

    if b >= 2:
        n = b * (b-1)  / 2
        num += n

sum = N * (N-1) * (N-2) / 6
ans = sum - num
print(int(ans))
```

3完できずレートがちょい下がりしたの悔やまれる. 次回挽回！！！
STM32L010で節電の為に4MHzにする。(内部電圧1.5V) MCO出力 HAL


目的
クロックのテスト
節電化


![o_con70.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b181d9fa-08c9-86bc-749d-47fb86963fa2.jpeg)



```c++


#include "mbed.h"

DigitalOut myled(PA_4);
//DigitalOut myled(PA_9);

int main()
{

    //クロックの初期化
    HAL_RCC_DeInit();

    //電圧を下げる
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);//4Mhz 1.5 560uA

    /* 4MHz */
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_DIV4;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
    HAL_RCC_OscConfig(&RCC_OscInitStruct);

    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);

    //__HAL_RCC_SYSCFG_CLK_ENABLE();
    //__HAL_RCC_PWR_CLK_ENABLE();

    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO1SOURCE_LSI, RCC_MCODIV_1);
    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);

    __HAL_RCC_GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);

    while(1) {

        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);

    }

}




```
Netlifyのデプロイ時のエラーの解決方法【Treating warnings as errors because process.env.CI = true.】

自分で作ったサイトをデプロイしようとした時に以下のエラーが発生し、解決できたので自分へのメモを込めて記事にします。
![スクリーンショット 2021-10-24 20.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381701/24caeecf-d854-4629-9819-8d3aa9b9d298.png)

最初は赤字の文に注目し、エラー対策を調べたものの効果のあるものが見つからず、赤枠で囲った部分に着目しました。
その結果、このenv.CI = trueという部分をfalseにすれば解決できるという記事を見て、修正しました。

修正方法はNetlifyの該当のアプリのページに行き、右上にある設定画面をクリック
![スクリーンショット 2021-10-24 20.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381701/c0d3722b-680c-d4ec-03b8-9b8de1145ede.png)

次に左のサイドバーにあるビルド＆デプロイのボタンをクリック
![スクリーンショット 2021-10-24 20.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381701/7d953121-9574-0e9f-2bc8-b16e6b1bec05.png)

最後にページ下部にある環境変数の編集ページでこのように記入します
![スクリーンショット 2021-10-24 20.33.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381701/180c0cd1-8b8d-d99b-079f-70bee17ae8ff.png)

そしてもう一度デプロイすれば問題なく反映されているはずです
8-bit最適化アルゴリズム公開した

今月、FaceBookは新しい最適化アルゴリズム公開した、GPUの利用をせっすれると述べる。

* インストール

`conda list | grep cudatoolkit`か`nvcc -V`
例えば、君のcudaのバージョンは11.1、
`pip install bitsandbytes-cuda111`

* 使用

```python
import bitsandbytes as bnb

# adam = torch.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.995)) # comment out old optimizer
adam = bnb.optim.Adam8bit(model.parameters(), lr=0.001, betas=(0.9, 0.995)) # add bnb optimizer
adam = bnb.optim.Adam(model.parameters(), lr=0.001, betas=(0.9, 0.995), optim_bits=8) # equivalent


torch.nn.Embedding(...) ->  bnb.nn.StableEmbedding(...) # recommended for NLP models
```
リンク：https://github.com/facebookresearch/bitsandbytes
【Git初心者】Git 最低限のコマンド集

Gitを使い始めて間もないため、どのコマンドを使うのか混乱しがち...
と言うことで、最低限必要なコマンドをまとめました。

## リポジトリセットアップ（初回のみ） `init`
Git管理を始めたいディレクトリで、`init`コマンドを実行。

```
git init
```

## コミット対象に追加 `add`
ファイルをコミット対象に追加する場合は、`add`コマンドを使用する。

```
git add [オプション]
```

`add`コマンドにはいくつかパターンがある。
いずれのパターンでも`-n`オプションをつけることで、実際の処理は行わずに処理内容だけを表示することができる。慣れないうちは、このオプションを有効活用していきたい。

### ①ファイル名を指定して追加

```
例1）
git add sample.rb
例2）
git add *.rb
```
上記のようにファイル名を指定する。ワイルドカード（`*`）による指定も可能。

### ②バージョン管理されており、変更があった全てのファイルを追加 `-u`

```
git add -u
```
「変更されたファイル」「削除されたファイル」が追加される。
「新しく作られたファイル」等、**バージョン管理されていないファイルは追加されない**。
レポジトリ内のどこで実行しても、レポジトリ全体を処理する。


### ③変更があった全てのファイルを追加 `-A`

```
git add -A
```
「変更されたファイル」「削除されたファイル」「新しく作られたファイル」全てが追加される。
レポジトリ内のどこで実行しても、レポジトリ全体を処理する。

### ④カレントディレクトリ以下の、変更があった全てのファイルを追加

```
git add .
```
カレントディレクトリ以下の「変更されたファイル」「削除されたファイル」「新しく作られたファイル」全てが追加される。
カレントディレクトリ以下のみを処理する。


## コミットする `commit`

```
git commit
```
`add`で追加されたファイルをコミットする。
また`-m`オプションをつけることで、エディターを起動することなく、コミットメッセージも指定してコミットすることが可能。

```
git commit -m "Commit test"
```

## ブランチ作成と切り替え `checkout -b`

```
git checkout -b 【ブランチ名】
例）
git checkout -b new-branch
 → new-branchブランチが作成され、自動的にnew-branchブランチに切り替わる
```
masterブランチでずっと作業するのではなく、その都度トピックブランチを作成して作業するのが好ましい。


## ブランチを切り替える `checkout`
```
git checkout master
 → masterブランチに切り替わる
```

## マージする `merge`

```
git merge <ブランチ名>
例）
git checkout master
git merge new-branch
```

マージしたいブランチに切り替えてから、`merge`コマンドを実行する。
STM32L010のPA9にSYSCLKを出力する HAL



目的
クロックのテスト
節電化


![o_con69.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6d94ad09-4c8a-4336-1285-3458e5df2f6a.jpeg)



```c++


#include "mbed.h"

DigitalOut myled(PA_4);
//DigitalOut myled(PA_9);

int main()
{

  //__HAL_RCC_SYSCFG_CLK_ENABLE();
  //__HAL_RCC_PWR_CLK_ENABLE();



    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO1SOURCE_LSI, RCC_MCODIV_1);
    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);



      __HAL_RCC_GPIOA_CLK_ENABLE();
      GPIO_InitTypeDef GPIO_InitStruct = {0};
      GPIO_InitStruct.Pin = GPIO_PIN_9;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      GPIO_InitStruct.Alternate = GPIO_AF0_MCO;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

      HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1);


    while(1) {

        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);

    }

}



```
解決: VirtualBoxとHyperVの共存 エラーコード0x80004005

先日のVirtualBox 6.1.28でWindows11もホストになれるようになり、WSL2などとの共存も可能になりましたが、どうもこの6.1.28はwindows10で使うとHyperVと共存できない？ようなので、6.1.26にダウングレードしたところ動作。 
エラー内容は　E_fail　0x80004005　でメモリ初期化に失敗というようなものでした。

結論としてひとまずbcdeditでhypervisorlaunchtypeの項目がautoなのにVirtualBoxとWSL2やDocker DesktopなどのHyperV使用の仮想環境と共存できない場合は、ダウングレードを試しましょうという記事でした。

わざわざ調べる人に、HyperVをオフにしようという解決策が有効な場合は少ない気がしますね....苦笑
なお、このエラーコードでも別の理由で初期化に失敗しているケースもあると思うのでまずはログを見るのが一番ですね
サービス制作やり直したい時　~gitのcommitした時の状態に戻る~

$ git log //戻す対象のハッシュ値を調べる
commit ************************

そして
$ git reset --hard ハッシュ値
を実行し、
db:resetとサーバー再起動で
commit時のファイル状態にローカル環境を戻すことができる。つまり途中でやり直すことができる
【Windows】Python3.10のインストール(パス通し)

## はじめに

2021年 10 月上旬からPython3.10が使用可能になってます。
長らくPython3.9を使用していました。しかし、新しいバーションにも
対応したいということで、最新版をインストールする流れになりました。

その時のメモ書きです。

## ダウンロード＆インストール

Pythonをインストールするために適当にググります。
「Download Python」でもいいのですが、
「Windows版Pythonのインストール:Python環境構築ガイド」が分かりやすかったです。

![ググる](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/1b261c1f-bfac-bcbf-fcd0-fab3602dbdd5.png)

https://www.python.jp/install/windows/install.html

解説が画像付きで非常に分かりやすく、簡単にインストールできます。
善きかな。

ちなみに、インストールの説明で「パスを通す設定にすること」が強調されています。
設定し忘れたら再インストールが推奨されています。

確かに、慣れていない人はここをミスすると沼にはまります。

![pic4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/075603f4-324b-cbf6-b9fd-424321127e6e.png)

## パス通し

「パスを通す」とは、コンピュータに実行ファイルの在り処を教えてあげることです。 
これにより、どこからでもその実行ファイルを呼び出せます。

一応、自力でパス通しします。
そのために、Pythonがどこにインストールされるかメモしておきます。

![pic12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/049845b1-76b6-d8ca-0fd3-0bb2921e402e.png)

いよいよ、システム環境変数を編集し、パスを通します。
タスクバーの左のほうにある虫眼鏡を押します。
「環境変数」と入力し、「システム環境変数の編集」を押します。

![pic6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/404f3828-a414-5975-0349-175041d57c5d.png)

システムのプロパティが出てくるので、「環境変数」を押します。

![pic8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/33e042f6-6ef4-1041-0508-b4a008c4d0a4.png)

「システム環境変数」の「Path」を選び、「編集」を押します。

![pic10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/101326a6-98c5-ebc9-98e1-c9bdd4d63328.png)

左の「新規」を押し、Python3.10のダウンロード場所をコピペし、「OK」を押すと完了です。
以前のバージョンをインストール済みなら、環境変数を編集します。

![pic14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/e65f437e-bcfa-5a9e-3ffb-a97400c7d113.png)

## コマンドプロンプトでpythonコマンドを実行してみる

コマンドプロンプトを開き、python と入力し、バージョン名が表示されたらパスが通っています。
Pythonライフを満喫してください！

![pic16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/71474d7c-89da-277b-baee-8064b962a55f.png)

## Q＆A

#### Pythonのダウンロード先のパスをコピペしようとしたらAppDataがないんだが？

AppDataフォルダは隠しフォルダです。
エクスプローラの表示タブにある「隠しファイル」にチェックを入れてください。

![pic18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577794/ac8d793c-cbdf-82d8-0e9f-834dd0b99006.png)