OmniAICreator/Qiita-1.07M huggingface dataset:
sklearnのlogistic regression CVとは？特徴量の出力についてなど

# はじめに

こんにちは、keygoroです。
今回は、sklearnのlogistic regressionCVについてのメモです。よく使いそうなパラメータ設定やアトリビュートについて書きます。

# logistic regression CV とは？

logistic regression CVは、sklearnの線形回帰モジュールの1つで、ロジスティック回帰におけるハイパーパラメータをクロスバリデーションによって探索した上でモデルを作成してくれるものです。
通常のlogistic regression では、正則化パラメータを自力で探索したうえで設定する必要がありますが、logistic regression CVは自動でやってくれるので楽です。

# logistic regression CV
logistic regression CVでは以下のようにパラメータを設定できます。

```python
clf = LogisticRegressionCV(Cs=10, 
                        fit_intercept=True,
                        cv=None,
                        dual=False, 
                        penalty='l2', 
                        scoring=None, 
                        solver='lbfgs', 
                        tol=0.0001, 
                        max_iter=100, 
                        class_weight=None, 
                        n_jobs=None, 
                        verbose=0, 
                        refit=True, 
                        intercept_scaling=1.0, 
                        multi_class='auto', 
                        random_state=None, 
                        l1_ratios=None)
```
今回は以下のように設定した場合について説明します。
```python
clf = LogisticRegressionCV(Cs=10, 
                        cv=10,
                        penalty='l2', 
                        scoring='roc_auc')
```

上のように設定した場合、以下のような過程でモデルが作成されます。
1. Cs×CV の数だけモデルが作成される。今回の場合は100個作成される。
    モデル数：100
2. Cの値ごとにモデルのスコアの平均をとる。
    モデル数：100 -> 10
3. スコアが最も良いパラメータを最適なパラメータとして採用する。 
    モデル数：10 -> 1

## パラメータとアトリビュートについて
パラメータとよく使いそうなアトリビュートの仕様についてまとめます。
### パラメータ

* Cs
    * 正則化の強さCの候補を設定するパラメータです。数字またはリストを渡します。
    * 数字を渡した場合、 \$1\times10^{-4}\$ から$1\times10^{4}$の間を対数スケールで分割し、最適なCの値を探索します。
    * ロジスティック回帰なので、値が小さいほど正則化が強くなります。
* cv
    * クロスバリデーションの数を設定します。
    * Cs×cvの数だけモデルが作成されます。
* penalty
    * 正則化の種類を{‘l1’, ‘l2’, ‘elasticnet’}の中から設定します。
* scoring
    * 最適なパラメータを選択するための評価指標を指定します。
    * 何も設定しない場合、'accuracy'が評価指標となります。
    * 設定可能な評価指標は以下のコードを実行することで確認できます。
        ```
        sklearn.metrics.get_scorer_names()
        ```

### アトリビュート
* coefs_paths_
    * Cs×cv の数だけモデルの回帰係数を出力します。
* coef_
    * 最適なパラメータのモデルの回帰係数を出力します。    
* Cs_
    * パラメータCの候補の値を出力します。
* C_
    * 選ばれた最適なCの値を出力します。
* scores_
    * Cs×cv の数だけモデルのスコアを出力します。

# 終わりに

今回は、sklearnのlogistic regression CVについて一部まとめました。アトリビュートで何が出力されているのかわからなくて調べた経験があったので、同じ境遇になった方に役に立つと嬉しいです。今後なにかあれば追記・修正します。

# 参考リンク
[sklearnドキュメントのlogisticregressionCVのページ](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegressionCV.html#sklearn.linear_model.LogisticRegressionCV)
【Intellij IDEA(Ultimate)】New UIでBuild ProjectボタンをOld UI同様の位置に表示する

`Intellij`ファミリーエディタのNew UIで、ビルドボタン（ハンマーアイコン）が非表示になっていたため、これをOld UI同様にカスタマイズします。
やった後の表示は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/dcec78a8-225a-9691-3544-0619b97f0f0b.png)

## やり方
まず、`File` -> `Settings` -> `Appearance & Behavior` -> `Menus and Toolbars`を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/29092e6a-dda0-5fad-6784-93565f9e973f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/489cb388-7af6-5127-7b45-a03e9ed10c6e.png)

次に、`Main Toolbar Right` -> `ExecutionTargetsToolbarGroup`を選択し、その状態で`+`マークから`Add Action`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/d52ac859-baaf-8b61-ba25-cb758a5debe0.png)

その中から`Build Project`を検索し、`OK`で追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/66e1906d-3980-6a42-f9bb-49054d79832c.png)

変更を適用した後の表示は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/dcec78a8-225a-9691-3544-0619b97f0f0b.png)


## 補足
この手順は、以下のコメントで提示されていた内容を一部修正したものです。

https://youtrack.jetbrains.com/issue/IDEA-308135/New-UI-No-build-button#focus=Comments-27-6721921.0-0
ChatGPT時代のnpmパッケージ！！ノーコードで生成したユーティリティ関数を詰め合わせたnpmパッケージを作成する方法

今回、OpenAIのAPIを使ってノーコードでユーティリティ関数を大量に生成して、npmパッケージとして公開してみました。

npmパッケージはこちら

https://www.npmjs.com/package/no-code-utils

このパッケージは下記のようなユーティリティ関数が100個詰め合わせたものになっています。
下記は「文字列の先頭文字を大文字に変換する関数」です。

```javascript:capitalize.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.capitalize = void 0;
function capitalize(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
}
exports.capitalize = capitalize;
```

TypeScript全盛期の今、型がついていないと使いたくないので、もちろん型も付けています！！

```typescript:capitalize.d.ts
export declare function capitalize(str: string): string;
```

# 仕組み

npmパッケージの基になっているコードは下記のGitHubリポジトリで管理しています。

https://github.com/ham0215/no-code-utils

リポジトリを見ていただけるとわかると思いますが、ユーティリティ関数のコードは管理していません。
docsディレクトリ配下に下記のような関数の仕様が書いてあるtxtだけを管理しています。

```text:docs/capitalize.js
文字列の先頭文字を大文字に変換する関数
```

txtを作るだけで関数が生成できるようになるので、仕様さえ言語化できればものの数秒で実装は完了します！！！
また、生成される関数が微妙な場合はtxtの文言を工夫して期待する関数が返却されるようにします。
ちなみに、仕様を詰める時もChatGPTに聞きながら調整すると良いです！

このリポジトリにリリースタグを作ったときに[GitHub Actions](https://github.com/ham0215/no-code-utils/blob/main/.github/workflows/npm-publish.yml)が動き、関数を生成してnpmパッケージを公開しています。
次からGitHub Actionsで行なっていることを説明します。

## OpenAIに関数を生成してもらう

docs配下にあるファイルごとにOpenAIにリクエストを送ってTypescriptの関数を生成してもらいます。

OpenAIには下記のcontextを送っています。
docsのファイル名を関数名にするので`${funcName}`にはファイル名、`${design}`にはtxtの内容を埋め込みます。

```javascript
const content = `
    次の要件を満たすTypescriptの関数を返却してください。
    コードの説明や前置きは不要です。コードだけ返却してください。
    関数にはexportをつけてください。
    関数名は${funcName}。
    ${design}
`;
```

想定通りにいくとOpenAIが関数を返却してくれるので、それを`${funcName}.ts`というファイル名で保存します。

### 困った点

#### Rate Limit
OpenAIのAPIは連続アクセスするとRate Limitに引っ掛かります。
フリープランでは1分で20回です。

Rate Limitを回避するために1回りクエストするごとに3秒Sleepしています。

#### APIが502を返す

原因はわかりませんが、数回に1回APIが502を返すことがありました。
最初はリトライするようにしたりしていたのですが、安定しないので502など200以外のレスポンスコードの場合は割り切ってSKIPすることにしました。

## 関数が妥当かチェック

OpenAIが返却したものをそのまま関数として保存していますが、中途半端なシンタックスエラーになる関数が返却されたり、全く関係ない文言が返されるなどがあります。
これらをそのまま残しておくとエラーになってしまうので`tsc`コマンドを使ってエラーになるものを削除します。

```sh
npx tsc --noEmit --listFiles | grep ': error TS' | awk -F'(' '{print $1}' | xargs rm -f
```

## index.tsを生成

作った関数を使いやすいように、各関数をexportするindex.tsを生成します。
こちらは機械的に生成できるので`tools/createIndex.js`で生成しています。

## build

tsファイルからjsファイル&型を生成します。
当初は事前にtscコマンドでチェックしていなかったので安定しなかったですが、今は事前にタイプチェックしているので安定してbuildできるようになりました。

```sh
tsc --project tsconfig.json
```

## npm pack & npm publish

ここからは通常のnpmパッケージを生成する手順を実行します。

`npm pack`でtgzを生成し、生成したファイルを指定して`npm publish`を実行して公開します。

# おまけ
## 料金について

現状ではdocs配下に100ファイル用意しているので、1回実行するとOpenAIに100リクエスト送ります。
今の件数と料金体系で実行すると1回ごとに$0.02くらいかかりました。

## docs配下の100個のtxtファイルを生成した方法

100個の関数を考えてtxtファイルを生成するは大変なので、こちらもChatGPTで聞きましたw

![スクリーンショット 2023-04-02 23.58.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/67b8d685-a3cd-73df-cd34-94209d77bfb2.png)

ChatGPTのアウトプットを使ってtxtファイル100個を自動生成しました。

## toolsの実装

今までnpmパッケージを公開したはなかったので、やり方などをChatGPTに聞きまくりました。
ChatGPTはサンプルコード含めてよって教えてくれるので、初めてと思えないくらいスムーズに実装することができました。
for 文での range() 関数の使い方

for 文を使うときによく一緒に使う
`range()`関数の使い方について、以下の3パターンに分けて説明します。

1. 引数が1つの場合
1. 引数が2つの場合
1. 引数が3つの場合

　


**1. 引数が1つの場合**
引数が1つの場合、引数で指定された回数繰り返しを行う。

内部処理としては以下の条件で繰り返している。
・初期値「0」から
・指定された値より小さい値の間
・「1」ずつ増加させながら


具体的なコードを使って説明します。

```Python
# range()関数で引数が1つ指定された
for i in range(3):
    print("i=", i)
```
これを実行すると、以下の実行結果になる。
```python
i= 0
i= 1
i= 2
```
改めて見ると、以下の条件で繰り返しています。
・初期値「0」から
・指定された「3」より小さい値の間
・「1」ずつ増加させながら

　

**2. 引数が2つの場合**
引数が2つの場合、
・第一引数で指定された初期値から、
・第二引数で指定された値より小さい値の間、
・1ずつ増やしながら繰り返しを行う。


具体的なコードを使って説明します。

```Python
# range()関数で引数が2つ指定された
for i in range(1, 3):
    print("i=", i)
```
これを実行すると、以下の実行結果になる。
```Python
i= 1
i= 2
```
改めて見ると、以下の条件で繰り返しています。
・初期値「1」から
・指定された「3」より小さい値の間
・「1」ずつ増加させながら

　

**3. 引数が3つの場合**
引数が3つの場合、
・第一引数で指定された初期値から、
・第二引数で指定された値より小さい値の間、
・第三引数で指定された値ずつ増やしながら繰り返しを行う。

:::note warn
第三引数に負の値が指定された場合は、
第二引数で指定された値より**大きい**値の間繰り返される。
:::

具体的なコードを使って説明します。

```Python
# range()関数で3つ引数が指定された
for i in range(0, 10, 3):
    print("i=", i)
```
これを実行すると、以下の実行結果になる。
```
i= 0
i= 3
i= 6
i= 9
```
改めて見ると、以下の条件で繰り返しています。
・初期値「0」から
・指定された「10」より小さい値の間
・「3」ずつ増加させながら
【Shell】特殊変数


## 特殊変数一覧

| 変数 | |
| :-----: | :------ |
| $# | 引数の数。 |
| \$0 |  起動中シェルスクリプト名を取得。 |
| `$1` ~ `$n` | シェル引数の値。 e.g. `$1`は第1引数, `$3`は第3引数 |
| $* | 引数すべてを1つに連結して参照。  |
| $@ | シェルスクリプトやシェル関数の引数すべてを個別に参照 |
| $? | 最後に実行したコマンドの終了ステータスを取得。|
| $$ | 実行中のシェルのプロセスID。 |
| $- | シェルの起動時のフラグや`set`コマンドを使って設定したフラグの一覧。 |
| $! | `&`で複数コマンドを実行した際のプロセスID。|
jQuery-Validation-Engine で任意のチェック関数を利用する


## はじめに

jQuery-Validation-Engineは、class名の指定だけで入力チェックができる便利なライブラリです。

事前に用意されているチェックではできないような、動的なチェック、エラーメッセージを使いたい場合、`funcCall`を使うことで、任意の処理を呼び出してチェックさせることができます。

(本家[posabsolute/jQuery-Validation-Engine](https://github.com/posabsolute/jQuery-Validation-Engine#funccallmethodname)には記載があるのですが、ググっても日本語では見つからないので備忘録として残します)
 
### 使い方

詳しい使い方は[jQuery：リアルタイムなフォーム入力チェックを簡単に実装！「validationEngine」の使い方](https://www.omakase.net/blog/2020/10/validationengine.html)がとても分かりやすいです。

#### ①[[jQuery-Validation-Engine](https://github.com/posabsolute/jQuery-Validation-Engine#funccallmethodname)]を読み込みます

```html
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jQuery-Validation-Engine/2.6.4/validationEngine.jquery.min.css">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="https://cdn.jsdelivr.net/gh/posabsolute/jQuery-Validation-Engine@3.1.0/js/jquery.validationEngine.min.js"></script>
  <script src="https://cdn.jsdelivr.net/gh/posabsolute/jQuery-Validation-Engine@3.1.0/js/languages/jquery.validationEngine-ja.js"></script>
```
  * `jquery.validationEngine-ja.js`は、チェックを追加する場合が多いので、cdnから読み込まない方が良いです（が、今回は変更しないのでcdnから読み込み)


#### ②入力フォームを作成します

* 独自チェック(checkComment()関数でチェック)を呼び出すため`class="validate[funcCall[checkComment]]"`を追加

```html
  <form id="input_form">
    <div class="input-area">
      <label for="comment-name">お名前必須：</label><br>
      <input type="text" name="comment-name" id="comment-name" class="validate[required]">
    </div>
    <div class="input-area">
      <label for="comment-input">コメント(独自チェック(funcCall))：</label><br>
      <input type="text" name="comment-input" id="comment-input" class="validate[funcCall[checkComment]]" value="">
    </div>
    <div class="input-area">
      <button>送信</button>
    </div>
  </form>
```

#### ③独自チェック関数を作成

* グローバル関数で作成します
  * チェックを行い、エラーメッセージを返す関数を作成する

```javascript
    // 入力チェック関数
    function checkComment(field, rules, i, options){
      const h = (new Date()).getHours();
      if (field.val().length > h) {
        return `${h}文字以下にしてください`;
      }
    }
```
#### ④jQuery-Validation-Engineを初期化
```javascript
    // jQuery-Validation-Engine初期化
    $(function () {
      $("#input_form").validationEngine('attach');
    });
```

### 動作確認

* 時間に応じて、入力チェック内容とメッセージが変わる処理ができました
![img10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/8e59884f-9d79-39f1-4c8d-3ebf0ed98b55.png)


## 参考ページ

https://www.omakase.net/blog/2020/10/validationengine.html
【PCブラウザ（IEモード含む）】ブックマークレットでページのタイトルとURLをセットをクリップボードに貼り付け（ユニコードの文字も利用）

## はじめに
以下の環境で、以下に書いたような処理をするブックマークレットを作った際のメモです。

### 環境について（ざっくりなもの）

   - OS： Windows
   - ブラウザ
      - Chrome
      - Edge
      - Edge での「Internet Explorerモード」

諸事情により、IEモードも含むという条件に...

### やりたいこと
「Webサイトのタイトル・URLを、以下のような、記号・改行・全角スペースを含む形で、クリップボードにコピーする」という処理

```text:クリップボードに貼り付けたい内容
●[ページタイトル]
　[URL]
```

## 最終結果
最終的に、ブックマークレットの内容は以下にしました。
（※追記： コメントをいただき少し修正しました）

```javascript
javascript:(function(t){t="\u25CF"+document.title+"\n\u3000"+location.href+"\n";navigator.clipboard?navigator.clipboard.writeText(t):window.clipboardData.setData("Text",t)})()
```

整形すると、こんな感じです。

```javascript
javascript: (function (t) {
  t = "\u25CF" + document.title + "\n\u3000" + location.href + "\n";
  navigator.clipboard
    ? navigator.clipboard.writeText(t)
    : window.clipboardData.setData("Text", t);
})();
```

### 補足
#### おおまかな流れ
作った内容の補足を、少し書いておきます。

まず、IEモードにも対応するという条件が前提に含まれているので、基本的に　IEモードで動く処理で書いています（※ `navigator.clipboard` は除いて）。

やっていることは単純で、以下の流れの通りです。

1. クリップボードに貼り付けたい文字列を変数に格納
1. navigator.clipboard を用いた三項演算子で、[クリップボードAPI](https://developer.mozilla.org/ja/docs/Web/API/Clipboard_API) の利用可否を判断
   1. クリップボードAPI が使える場合は、 [navigator.clipboard.writeText()](https://developer.mozilla.org/ja/docs/Web/API/Clipboard/writeText) で、クリップボードへの文字列コピーを実行
   1. クリップボードAPI が使えない場合（IEモードの場合）は、 `window.clipboardData.setData()` で、クリップボードへの文字列コピーを実行

#### 特定の文字列の扱い
また、上記の流れの最初の「クリップボードに貼り付けたい文字列を変数に格納」という部分では、文字列を `"\u25CF" + document.title + "\n\u3000" + location.href + "\n"` という内容にしていました。

その部分では「●」という記号を「\u25CF」で、「（全角スペース）」を「\u3000」にしています。

#### 利用時の注意
以下の記事のよると、Webサイトの `Document` 以外にフォーカスがあたっている状態で使うとエラーになるようです。

●【Javascript】Markdown形式のウェブページのリンクを、ブックマークレットで取得する - Qiita
　https://qiita.com/eyuta/items/859d1e8952eef4d8f061
![注意点](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/15c475f8-762f-b5bd-9a8b-39cb15447e92.png)

#### その他： IEモード対応がない場合
上記について、IEモード対応という条件がありましたが、それがなければこんな感じで書けるかと思います。
IEモードを考慮しなくて良いなら、文字列を指定する部分で[テンプレートリテラル](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals)も使えたり。

```javascript
javascript: (function () {navigator.clipboard.writeText(`\u25CF${document.title}\n\u3000${location.href}\n`)})()
```

## ブックマークレット関連の記事の話
Qiita でブックマークレットの記事を書いたのは、以下の記事を書いて以来でした。

●ブックマークレット・コンソールを使って Webページ内の複数の指定要素のテキストをファイルに保存 - Qiita
　https://qiita.com/youtoy/items/7aaef1c44e0c77e0ced8

上記の記事を書いてた時に、以下の記事などを見てたのですが、またあらためて見直してみて活用できそうなことを考えてみたくなったりもしました。

- [Bookmarkletを作ろう(準備編） - Qiita](https://qiita.com/kanaxx/items/63debe502aacd73c3cb8)
- [Bookmarkletを作ろう（ウェブページのハック手順編） - Qiita](https://qiita.com/kanaxx/items/ead7d7b12619a578b7fe)

## 余談： 文字コードやスペースの話
本文の内容を書くのにあれこれ調べていて、気になった記事があったので、メモとして残す意味で載せてみます。

●Word で文字コードを調べる / 活用する｜クリエアナブキのちょこテク
　https://www.crie.co.jp/chokotech/detail/445/

●スペースの使い分け | 技術情報 | InDesign（インデザイン）専門の質の高いDTP制作会社―株式会社インフォルム
　https://www.informe.co.jp/useful/character/character27/
WindowsでCondaのPathを通す

```
conda : 用語 'conda' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ conda
+ ~~~~~
    + CategoryInfo          : ObjectNotFound: (conda:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```

エラーメッセージ長いねん。

```
condaって何？ Path確認した？
```

くらいにしてくれ。

<h2>本編</h2>

自分はminiconda派なのでminiconda windows 64bitを[ここから](https://docs.conda.io/en/latest/miniconda.html)インストール。

インストールは全部設定変えずにポチポチ連打。

一番重要なのは**インストール先フォルダ**。
![スクリーンショット 2023-04-02 230112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496596/9c9b02bb-196c-d7a2-711d-39fccf94d27b.png)

後で探せるようにだいたいの場所を把握しておく。

<h2>パスを通す</h2>

で、このままターミナルで```conda```と打つと冒頭のエラー。

これはパスが通ってないから。

<h3>パスとは</h3>
パスとは

```
C:hoge/hogehoge/unko.exe
```
みたいに実行できるコマンドを

```
unko
```

だけで実行できるようにするもの。

要は実行ファイルまでの長ーい長ーい道のりをいちいち書かなくて良くなる。

言い換えると、システムに「**お前ここのコマンドも自由に使って良いよ**」とあらかじめ教えておくようなもの(つまりPathとはシステムが自由に使えるコマンドディレクトリの集合)

ここまで分かれば後は簡単。

システム環境変数のPathに```インストール先ディレクトリ/Scripts```を追記すれば良い(ここにcondaの本体がある)

今回は便宜上```C:/Users/hoge/miniconda3```がインストール先だとするとPathに追記するのは```C:/Users/hoge/miniconda3/Scripts```である。Pathはエクスプローラーで該当フォルダを見つけた後、右クリックでコピーができる。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496596/e1d6f033-e70c-2552-f8a9-3fd0928c5a8b.png)

Windows11左下の検索窓に「環境変数」と入れると環境変数の設定が出てきやがるので

![スクリーンショット 2023-04-02 231525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496596/6a3ad8b8-e35d-3f30-333b-739f9e86c774.png)

そこからさらに右下の環境変数をクリック

![スクリーンショット 2023-04-02 231639.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496596/bdb18344-062d-3860-965a-281d0788fc7e.png)

上下にいっぱい変数が並ぶが、今回は「システム環境変数」の「Path」にしか興味がないのでこれを見つけ出し、編集を押す。
![スクリーンショット 2023-04-02 232002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496596/70c16cb6-5de1-3394-64c6-4934f7e4f86c.png)

あとは右上の新規から先ほどコピーした```インストール先/Scripts```を追加

<h2>おわり</h2>

もう一度condaと打ち込み、クソ長ヘルプが出てきたら終了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496596/0ba3d564-078f-cce4-3de3-7f961d1daba5.png)

<h2>無責任なトラブルシューティング</h2>

もし上記でできなかった場合、考えられる理由は

1. 環境変数の更新がターミナルに反映されていない
2. minicondaのバージョンが変わり、本体がScriptsの中にない
2. コマンドプロンプトには反映されているPathがVScodeやその他ソフトでは反映されてない

永遠に```conda init```をしろと言われ、ターミナルを再帰しても「スクリプトの実行は許可されてない」的なエラーが出る場合は下の記事。```.bashrc```に該当するものがWindowsにないことが原因なのかな？

https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f
ChatGPT CLIツールで開発効率を最大化しよう！コードレビュー、翻訳、自動生成されたGitコミットメッセージもサポート！

# はじめに

本記事では、エンジニアにとって非常に便利なChatGPTを活用したCLIツールについてご紹介します。このツールにより、ターミナル環境で簡単にChatGPTを使うことができます。さらに、コードレビュー機能、翻訳機能、AIによる自動生成されたGitコミットメッセージ機能も提供しており、開発効率を向上させることが可能です。

https://github.com/yufeikang/ai-cli/blob/main/README_ja.md
## 必要条件

* OPENAI\_API\_BASE (オプション)

GFWの問題で `https://api.openai.com` にアクセスできない場合は、 `OPENAI_API_BASE` 環境変数で他のAPIアドレスを指定できます。 
これを使用することをお勧めします。この方法は、プロキシを使用するよりも安定しています。Cloudflareのworkersを使用してプロキシを構築する方法については、次の記事を参照してください: [使用Cloudflare 
Workers搭建OpenAI API代理](https://github.com/noobnooc/noobnooc/discussions/9)

* OPENAI\_API\_KEY

環境変数 `OPENAI_API_KEY` または `--api-key` パラメーターを使用して指定するか、`ai setting`命令を使用して指定できます。

* Bing Cookie

Bing Botを使用する場合は、Bing Cookieを設定する必要があります。`ai setting`命令を使用して設定できます。

```bash
ai setting --edit bing_cookie="BING_COOKIE.JSON"
```

Cookie取得方法については、[Bing Bot Cookie获取](https://github.com/acheong08/EdgeGPT#checking-access-required) を参照してください。

## インストール

```bash
pip install py-ai-cli
```

または最新バージョンをインストールします

```bash
pip install git+https://github.com/yufeikang/ai-cli.git    
```

## 設定

現在、APIキーとAPIベースを設定するには、 `ai setting` コマンドを使用できます。これに加えて、環境変数とCLIパラメータも引き続き有効です。

```bash
# 設定を確認する
ai setting
# 設定値を編集する
ai setting --edit
```

# 主な機能
 `ai -h` コマンドでサポートされているすべてのコマンドを確認できます。

ターミナルでの手軽なChatGPT利用
ChatGPT CLIツールを使えば、ターミナル環境で手軽にChatGPTと対話ができます。プログラミング中にAIアシスタントが欲しいときに便利です。



Markdown形式の出力サポート
ChatGPT CLIツールでは、出力結果をMarkdown形式で表示することもできます。ドキュメント作成時に非常に便利です。

この記事を読んで、ChatGPT CLIツールの魅力を感じたら、ぜひ試してみてください！開発効率を向上させるだけでなく、よりクリエイティブな開発をサポートすることができるでしょう。今すぐ、ChatGPTの力を引き出しましょう！

* コミットメッセージ自動生成

AI自動生成Gitコミットメッセージ
Gitコミットメッセージを考えるのに時間がかかる場合、この機能が役立ちます。ChatGPTは、あなたの変更点を理解し、適切なコミットメッセージを生成してくれます。

```bash
ai commit
```

* 質問する

```bash
ai ask "こんにちは"
# ストリームモードを使用しない場合
ai --no-stream ask "こんにちは"
# ヘルプを表示する
ai ask --help
# プレプロンプトを使用する
curl -s https://raw.githubusercontent.com/yufeikang/ai-cli/main/README.md | ai ask --prompt "summary this, how to install"
```

* 翻訳する

多言語対応のプロジェクトでは、翻訳機能が重要です。ChatGPT CLIツールの翻訳機能を使えば、簡単に文章を他の言語に翻訳できます。

```bash
ai translate "こんにちは"
ai translate "こんにちは" -t japanese
ai translate -t english -f "file.txt"
echo "こんにちは" | ai translate -t english
cat "file.txt" | ai translate -t english
```

* チャット

```bash
ai chat
```

* コードレビュー

```bash
ai review
ai review -t develop
ai review -t HEAD~1

```
Qiita記事作成用テンプレート

## 初めに
作業効率化のためにQiita記事作成用のテンプレートを作成しました。

## テンプレート

```
## 初めに

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __-----__ | ---------- |
| __-----__ | ---------- |

## 環境構築
// ```
    // 環境構築の内容
// ```

## 手順

## 実装
// ```vuejs:vueConponent.vue
    // 実装内容
// ```

## 最後に
最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。

```

## 最後に
最後まで閲覧いただきありがとうございました。
もっとこうしたらいいよとか、ありましたらどしどしご意見お願いいたします。
Intuneでウイルススキャンをスケジュールする

# Microsoft Defenderウイルス対策
Intuneの構成プロファイルを利用したウイルススキャンのスケジュール方法について解説していきます。

今回使うテンプレートは以下2つです。
・デバイスの制限
・管理用テンプレート
ではテンプレートごとに説明していきます。

## スキャンの種類や時間を指定する
まずはデバイスの制限を選択し、ポリシーを作成します。
Microsoftの公開情報も貼っておくので、設定値の説明などはこちらで確認してみてください。
https://learn.microsoft.com/ja-jp/mem/intune/protect/antivirus-microsoft-defender-settings-windows

ここではスキャンの種類・実行時刻・実行する曜日を指定します。
他にもスキャンに関する設定値がたくさんありますが、指定した曜日と時刻にスキャンを実行したいだけならこの3項目のみで大丈夫です。
・実行するシステムスキャンの種類
・スケジュール日
・スケジュールされた時刻
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3262345/fd0c0516-9021-f0f9-b734-f78833d0e1e6.png)

さて、これで設定完了…とならないところがIntuneウイルス対策の落とし穴です。
Windows 10は規定で
「デバイスが起動している＆アクティブではないときにスキャンを実行する」
「スケジュールされたタスクはその時刻から30分前後でランダムに実行する」
という2つの設定が有効になっています。

こいつらを無効化してあげないと、何度やってもこちらの想定する動作にはなりません。
(公開情報で明記してくれと切実に思います)

## 余計な機能は無効化
構成プロファイルから管理用テンプレートを選択し、以下の2つを無効に設定します。
・コンピューターが起動しているが使用中でないときにのみスケジュールされたスキャンを開始する
・スケジュールされたタスクの時間をランダム化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3262345/a3a4af4b-c5b3-c244-8a1a-f5b54ff3a1ce.png)


:::note info 
補足：管理用テンプレートは「設定の種類」によってデバイスグループかユーザーグループ
どちらを利用するか変わるので気を付けてくださいね。
今回はデバイスグループです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3262345/1afa6997-605c-9acd-057b-740422a93958.png)
:::

ここまでくればあとはクライアントPCで動作を確認するのみです。
レジストリが書き換わっていることを確認し、スキャンの時刻になったらイベントビューアーを見てみましょう。

レジストリは以下から確認できます。
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Policy Manager 
HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Scan 
![GetImage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3262345/b6a75be9-fcc9-bf4d-b2ba-c30a391dd125.png)
きちんとポリシーが割り当たると↑のようになるはずです。


イベントビューアーは以下から確認します。
Microsoft-Windows-Windows Defender/Operational
イベントID1000(開始)、1001(終了)が指定の時刻に確認できればＯＫです。


## あとがき
まず初めに、初投稿なので読みにくかったらすみません。
改善点やご意見いただければ次回から直していきます。

私自身ウイルススキャンには何度も振り回されてきたので、この記事が少しでも参考になれば幸いです。
最後までお読みいただきありがとうございました。
[AWS Q&A 365][CloudFront]AWSのよくある問題の毎日5選 #21

# 1. Amazon CloudFrontとは何ですか、そしてどのように機能しますか？
回答：Amazon CloudFrontは、低レイテンシーで高速な転送速度でデータ、ビデオ、アプリケーション、APIをグローバルに提供するセキュアなコンテンツ配信ネットワーク（CDN）です。CloudFrontは、世界中のエッジロケーションでコンテンツをキャッシュすることで、ユーザーがコンテンツを要求するときに最も近いエッジロケーションから提供されるため、レイテンシーが低くパフォーマンスが向上します。

# 2. Amazon CloudFrontのユースケースは何ですか？
回答：Amazon CloudFrontの一般的なユースケースには、静的なウェブサイトのコンテンツ配信の加速、ビデオオンデマンドやライブストリーミングのビデオ配信、システム処理全体で特定のフィールドを暗号化すること、エッジでのカスタマイズ、Lambda@Edgeカスタマイズを使用してプライベートコンテンツを提供することなどがあります。

# 3. Amazon CloudFrontをコンテンツ配信に設定するにはどうすればよいですか？
回答：Amazon CloudFrontをコンテンツ配信に設定するには、配信と呼ばれる構成を作成する必要があります。配信には、コンテンツの場所、そのコンテンツに対するリクエストのルーティング方法、およびエッジロケーションでのコンテンツのキャッシュ期間が設定されます。配信は、CloudFrontコンソール、API、またはSDKを使用して作成できます。

# 4. Amazon CloudFrontはどのように価格設定と請求を処理しますか？
回答：Amazon CloudFrontの価格は、転送されたデータ量とリクエスト数に基づいています。HTTPS、フィールドレベルの暗号化、無効化リクエストなどの機能には追加料金がかかります。CloudFrontは、1年間の最低使用量にコミットする顧客向けに節約バンドルを提供しています。CloudFrontの請求は、AWSの他のサービスと統合されており、顧客はAWSマネジメントコンソールで使用量と費用を確認できます。

# 5. Amazon CloudFrontでキャッシュと可用性を最適化するにはどうすればよいですか？
回答：Amazon CloudFrontでキャッシュと可用性を最適化するには、エッジロケーションでのキャッシュ、キャッシュヒット率の向上、オブジェクトのキャッシュ期間の指定、Origin Shieldの使用、クエリ文字列パラメータに基づくキャッシュ、フィールドレベルの暗号化を使用するなどの機能を活用することができます。また、CloudFrontの地理的制限を使用して、コンテンツを特定の地域や国に制限し、AWS WAFを使用してコンテンツへのアクセスを制御することもできます。
[AWS Q&A 365][CloudFront]Daily Five Common Questions #21

# 1. What is Amazon CloudFront and how does it work? 
Answer: Amazon CloudFront is a content delivery network (CDN) that securely delivers data, videos, applications, and APIs to customers globally with low latency and high transfer speeds. CloudFront works by caching content at edge locations around the world, so when a user requests content, it is served from the nearest edge location, reducing latency and improving performance. 

# 2. What are the use cases for Amazon CloudFront? 
Answer: Some common use cases for Amazon CloudFront include accelerating static website content delivery, serving video on demand or live streaming video, encrypting specific fields throughout system processing, customizing at the edge, and serving private content by using Lambda@Edge customizations. 

# 3. How do I set up Amazon CloudFront to deliver content? 
Answer: To set up Amazon CloudFront to deliver content, you need to create a distribution, which is a configuration that tells CloudFront where to find the content to be delivered, how to route requests for that content, and how long to cache the content at the edge locations. You can create a distribution using the CloudFront console, API, or SDKs. 

# 4. How does Amazon CloudFront handle pricing and billing? 
Answer: Amazon CloudFront pricing is based on the amount of data transferred and the number of requests made. There are also additional charges for features like HTTPS, field-level encryption, and invalidation requests. CloudFront offers a savings bundle for customers who commit to a minimum usage level for one year. Billing for CloudFront is integrated with the rest of AWS, and customers can view their usage and costs in the AWS Management Console. 

# 5. How can I optimize caching and availability with Amazon CloudFront? 
Answer: To optimize caching and availability with Amazon CloudFront, you can use features like caching with edge locations, improving your cache hit ratio, specifying how long CloudFront caches your objects, using Origin Shield, caching based on query string parameters, and using field-level encryption. Additionally, you can use CloudFront geographic restrictions to restrict content to specific regions or countries, and use AWS WAF to control access to your content.
【Android】加速度センサー【Kotlin】

# 加速度センサーとは
スマホには様々なセンサーがありますが、その中でも
スマホが**縦向きか横向きかを判断し　画面を回転させるため**や
**万歩計などに使われているセンサー**です

# 実装
kotlinでアプリ内に加速度センサーを使って端末の向きを取得しようと思います

```
　class MainActivity : AppCompatActivity(), SensorEventListener {

    private var sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
    private val textView: TextView = findViewById(R.id.text_view)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onSensorChanged(event: SensorEvent) {
        val x = event.values[0].toInt()
        val y = event.values[1].toInt()
        val z = event.values[2].toInt()

        textView.text = " X= $x　Y= $y　Z= $z"
    }

    override fun onAccuracyChanged(p0: Sensor?, p1: Int) {
        TODO("Not yet implemented")
    }

```

SensorManagerという機能を使って取得できます。
使いやすくするためにあらかじめインスタンス化しておきます。

SensorEventListenerを継承しているのでセンサーが切り替わったタイミングでonSensorChangedメソッドで値が取得できます。
xが横軸　yが縦軸　zが方位角度でそれぞれ取得されます。

また、onAccuracyChangedメソッドはセンサーの精度が変化した時に呼ばれます。

# 参考
https://developer.android.com/guide/topics/sensors/sensors_position?hl=ja

# おわりに
センサー系の実装は体感的で触っていて面白いので今後も記事にできたらいいなと思います。
vue.jsで時刻選択できるライブラリ使ってみた

## はじめに
フォームを作成する際にvue.jsのライブラリを用いて時刻選択項目を追加しました。
2つのライブラリを使ってみましたので、備忘録として残します。

１つ目、「VueDatePicker」　
　　　　　　※時間間隔を設定できなかった（できた方教えてください）
２つ目、「VueCtkDateTimePicker」

どちらも細かいところをカスタマイズできるので楽しいです！

## 環境
| 開発環境    |バージョン |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __PHP__     | 8.2.3  |
| __vue.js__     | 3.2.47 |

## 「 VueDatePicker 」
公式ドキュメント

https://vue3datepicker.com/

ライブラリをインストール
```
npm install @vuepic/vue-datepicker
```

実装
```javascript:app.js
import VueDatePicker from '@vuepic/vue-datepicker';
import '@vuepic/vue-datepicker/dist/main.css'
app.component('VueDatePicker', VueDatePicker);
```

```vuejs:timeSetComponent.vue
<template>
    <VueDatePicker v-model="time" time-picker></VueDatePicker>
</template>
```

## 「 VueCtkDateTimePicker 」
公式ドキュメント

https://github.com/chronotruck/vue-ctk-date-time-picker?ref=kabanoki.net

ライブラリをインストール
```
npm i --save vue-ctk-date-time-picker
```

実装
```javascript:app.js
import VueCtkDateTimePicker from 'vue-ctk-date-time-picker';
import 'vue-ctk-date-time-picker/dist/vue-ctk-date-time-picker.css';
app.component('vue-ctk-date-time-picker', VueCtkDateTimePicker);
```

```vuejs:timeSetComponent.vue
<vue-ctk-date-time-picker label="時刻を選択" v-model="value" format="hh:mm a" formatted="hh:mm a" only-time minute-interval="15" input-size="sm"></vue-ctk-date-time-picker>
```


## 終わりに
最後まで閲覧ありがとうございました。
ご指摘、ご意見ありましたらご意見よろしお願いします。
React.jsのforwardRefの使い方

## そもそも「Ref」って？
どんな時に使うかというとReact.jsでの開発時、DOMに直接アクセスしたい時に使用します。
React.jsでは原則的に仮想DOMを通してのDOMを書き換えていくので、Refというのはいわば邪道です。
Reactの標準ライブラリである**useRef()** を使うことでrefを使用することができます。

DOMに直接アクセスして何かしたいというケースは少ないですが、例えば
* ボタンを押した時、特定のコンポーネントの位置まで自動でスクロールしたい時
* 画面に訪れたタイミングで、特定のInputフォームにfocusを当てたい時
* videoタグのplay・pauseメソッドを使いたい

などなど...


## forwardRefとは
例えば、親コンポーネントで定義してるRefをpropsで子コンポーネントに渡して、そっち側で利用したい時があったとします。
しかし通常、コンポーネントでは親からRefを引数として受け取ることができません。
そこでforwardRefを使用することで、親から子にRefを渡すことができるようになります。

forwardRefとはコンポーネントが別のコンポーネントのDOMにアクセスしたい時に使うためのものです。

## 実際の使い方
#### こう書くとエラーになる
以下のように書くと一見、子コンポーネントのSubmitButtonにrefが渡ったかのように見えますが、実際はエラーになります。

```
// 親コンポーネント
const Home = () => {
  const newRef = useRef()
  return (
    <div>
      <SubmitButton ref={newRef}/>
    </div>
  )
}

// 子コンポーネント
const SubmitButton = ({ref}) => {
  return (
    <button onClick={() => console.log({ref})}></button>
  )
}
```
![スクリーンショット 2023-04-02 21.35.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/d41e8335-ccc1-ff63-69fa-b040fb17edab.png)
「refはpropsではないです。もしアクセスしたいのであれば別の方法でアクセスしてください」
「React.forwardRef()を使うつもりでしたか？」
とwarnningが出てきました。

#### forwardRefを使っての正しい方法
```
// 親コンポーネント
const Home = () => {
  const newRef = useRef()
  return (
    <div>
      <SubmitButton ref={newRef}/>
    </div>
  )
}

// 子コンポーネント
const SubmitButton = forwardRef(function SubmitButton(props, ref) {
  return (
	<div>
        <button onClick={() => console.log(ref)}>送信</button>
	</div>
   )
})
```
![スクリーンショット 2023-04-02 22.07.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/b08d0e5c-09be-024a-0e52-801e4ed639f6.png)
無事、親コンポーネントからrefの値を受け取ることができました。
これを流用することで、さらに下のコンポーネントにバケツリレーでrefを渡すことも可能です。

## 最後に
基本的にReactの開発でRefの多用は推奨されてないため、極力使わない方法での実装が好ましいです。
というより大体のことはRefを使用しなくても実装できます。

以下公式ドキュメント

https://react.dev/reference/react/forwardRef
ChatGPTで始めるJavaScript入門⑧～プロトタイプ～

# 概要
　今回は3.JavaScriptの文法と構文について、の
　プロトタイプについて確認していきます。

　プロトタイプという言葉から、ひな形機能的なものを想定していますが、
　どんな機能なのでしょうか。

　**※無料版なので、誤っている情報もあると思いますが、アウトプットできれば良しとします。**


# オブジェクト生成
　JavaScriptにおけるプロトタイプの概要や使用方法を聞いてみます。

　【質問】
　JavaScriptの文法と構文について、プロトタイプについて、概要や使用方法、注意点を教えてください。

　【回答】
　JavaScriptは、オブジェクト指向プログラミング言語であり、プロトタイプベースのオブジェクト指向プログラミングを採用しています。
　ここでは、JavaScriptのプロトタイプについて、概要や使用方法、注意点について説明します。

**プロトタイプとは**

JavaScriptのオブジェクトは、他のオブジェクトを継承することができます。
継承元のオブジェクトをプロトタイプと呼びます。
プロトタイプを指定することで、継承元のオブジェクトのプロパティやメソッドを継承した新しいオブジェクトを作成することができます。

**プロトタイプの使用方法**
プロトタイプを指定するには、prototypeプロパティを使用します。
prototypeプロパティには、プロトタイプオブジェクトが格納されます。
プロトタイプオブジェクトには、継承元オブジェクトのプロパティやメソッドを定義することができます。

例えば、以下のようにPersonオブジェクトを定義し、prototypeプロパティにsayHelloメソッドを定義することができます。

```javascript:prototype.js
function Person(name) {
  this.name = name;
}

Person.prototype.sayHello = function() {
  console.log('Hello, my name is ' + this.name);
};
```

Personオブジェクトを継承したStudentオブジェクトを定義する場合は、StudentオブジェクトのプロトタイプにPersonオブジェクトを指定します。

```javascript:prototype.js
function Student(name, grade) {
  this.name = name;
  this.grade = grade;
}

Student.prototype = new Person();

Student.prototype.sayGrade = function() {
  console.log('My grade is ' + this.grade);
};
```

Studentオブジェクトは、Personオブジェクトを継承しており、
PersonオブジェクトのsayHelloメソッドを呼び出すことができます。

```javascript:prototype.js
var student = new Student('Alice', 3);
student.sayHello(); // "Hello, my name is Alice"
```

**注意点**

プロトタイプを使用する際には、以下のような注意点があります。

プロトタイプオブジェクトで定義したプロパティやメソッドは、継承先オブジェクトのプロパティやメソッドとしてアクセスできます。
ただし、継承先オブジェクトで同じ名前のプロパティやメソッドが定義されている場合は、
継承先オブジェクトのプロパティやメソッドが優先されます。

Object.create()メソッドを使用することで、任意のオブジェクトをプロトタイプとして指定することができます。

プロトタイプを使用することで、継承関係を作成することができますが、
継承の階層が深くなりすぎると、パフォーマンスやメンテナンス性の問題が生じる場合があります。
適切な継承の階層を設計することが重要です。

ES6からは、クラス構文が導入され、クラスを使用することで、プロトタイプを継承することができます。
クラスを使用することで、より直感的に継承関係を定義することができます。
ただし、クラスは、実際にはJavaScriptのプロトタイプベースのオブジェクト指向プログラミングをラッピングしたものであるため、
内部的にはプロトタイプが使用されています。


プロトタイプベースのオブジェクト指向は他のオブジェクトを継承し、
継承元のオブジェクトが持つプロパティやメソッドを使用できるということですね。

一方、クラスベースのオブジェクト指向は、クラスからオブジェクトを生成して、
クラス内で定義されたプロパティやメソッドを使用できます。
GitHub Pagesが更新されないと思ったらエラー出てたので暫定対処

# 注意
私は知識はほぼ皆無です。もっといいやり方があると思います。
# はじめに
私は自分のノートPCと学校のタブレットのvscodeでGitHub Pagesのやつを作ってます。先日学校のタブレットで普段通り作って同期したところ、なかなかGitHub Pagesが更新されなかったのでレポジトリページを確認したところ、Actionsのタブで「**pages build and deployment**」でエラーが発生しているという表示がありました。詳しく見てみると、buildのCheckoutでエラーが発生していました。(2か月前のものも失敗していたようです。[ここ](https://github.com/Ichihai1415/Ichihai1415.github.io-backup20230402/actions)にリトライしていたものがあります。)
↓は2か月前のもの
```
Run actions/checkout@v3
Syncing repository: Ichihai1415/Ichihai1415.github.io
Getting Git version info
Temporarily overriding HOME='/home/runner/work/_temp/e814f3e3-e933-4065-b132-7b0be83c047c' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
/usr/bin/git config --global --add safe.directory /home/runner/work/Ichihai1415.github.io/Ichihai1415.github.io
Deleting the contents of '/home/runner/work/Ichihai1415.github.io/Ichihai1415.github.io'
Initializing the repository
Disabling automatic garbage collection
Setting up auth
Fetching the repository
Determining the checkout info
Checking out the ref
Setting up auth for fetching submodules
Fetching submodules
  /usr/bin/git submodule sync --recursive
  /usr/bin/git -c protocol.version=2 submodule update --init --force --depth=1 --recursive
  Error: fatal: No url found for submodule path 'Ichihai1415.github.io' in .gitmodules
  Error: The process '/usr/bin/git' failed with exit code 128
```
エラー読んでも.gitmodulesなんてないし(？)調べてもよくわからないしBingAIに聞いてもよく分からなかったのでgitの初期化をしたところできました。

**※[こちらの方法](https://qiita.com/mktshhr/items/578cc5b5aea5b3ed9303)でもできると思います。**
# 手順
コマンドはGit Bashの操作を想定しています。
## 1. GitHubにあるレポジトリの名前変える
バックアップしないなら削除でもok
## 2. 元の名前でレポジトリを新規作成

## 3. `$ cd "[ローカルレポジトリのパス]"`でパス設定
↓用
## 4. ローカルの.gitディレクトリを削除(コマンドなら`$ rm -rf .git`)
やらなくてもいいかも
## 5. `$ git init`でgit初期化

## 6. 以降通常通りvscodeからコミット・プッシュ
Andoroid用ライブラリをC++ & CMakeで作る

# 概要
Android用ライブラリをC++とCMakeを使ってビルドする方法を説明します。

# ビルド方法
## C++ファイルを追加する
ライブラリ用C++コードファイルを追加します。
今回は簡単な加算するだけの関数を追加します。
``` cpp:ndk_library.h
#ifndef NDK_LIB_NDK_LIBRARY_H
#define NDK_LIB_NDK_LIBRARY_H

int ndk_lib_add(int a, int b);

#endif //NDK_LIB_NDK_LIBRARY_H
```
``` cpp:ndk_library.cpp
#include "ndk_library.h"

int ndk_lib_add(int a, int b)
{
    return a + b;
}
```

## CMakeLists.txtを追加する
`CMakeLists.txt`を追加します。staticライブラリで作成します。

``` CMake:CMakeLists.txt
cmake_minimum_required(VERSION 3.24)
project(ndk_lib)

set(CMAKE_CXX_STANDARD 17)

add_library(ndk_lib STATIC ndk_library.cpp)
```

## ビルド
`build`ディレクトリを作成してそこへ移動します。
makefile作成時にAndroid SDKに含まれているcmakeファイルを指定してビルドします。
``` sh
mkdir build
cd build

ANDROID_NDK_HOME=$HOME/Library/Android/sdk/ndk/23.1.7779620

cmake \
-DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_HOME/build/cmake/android.toolchain.cmake \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-24 \
-DANDROID_STL=c++_static \
..

cmake --build .

```

# 出力
buildディレクトリ以下に`libndk_lib.a`ファイルが出力されていると思います。
llvm-objdumpでAndroid用にビルドされているか確認できます。

``` shell-session
$ ~/Library/Android/sdk/ndk/23.1.7779620/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -f libndk_lib.a

libndk_lib.a(ndk_library.cpp.o):	file format elf64-littleaarch64

architecture: aarch64
start address: 0x0000000000000000
```

# 参考
https://qiita.com/terukazu/items/5a59b2b2805931b874ed


https://qiita.com/syoyo/items/a9ba2a11147e64138294
Kindle PaperのSilkブラウザでdisplay:flexが使えない

最近Kindleのブラウザから自前webサーバにアクセスさせてごにょごにょさせているのですが、cssでタイトルの通りはまったので残しておきます。

kindle paperにはsilkというamazonが開発するchromumeのブラウザが搭載されています。しかしながら需要がないためかブラウザのバージョンが古く、最近のブラウザから比べて使えない機能が多数あります。その中でもcssの```display:flex```。

```
.example
{
    display:flex;
}
```

<img width ='300' alt='80FCA15F-3D60-4186-B12F-92C1325E94DB.jpeg' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/97f71851-67dd-b985-c432-f47e636f86dd.jpeg'>



## 代替コード
調べてみてもsilkブラウザは需要が無さすぎて、コードの対応表にすら乗せてもらっていません。結論を書くといろいろ試してみて、代替できたコードは以下の通りでした。
```
.example{
  display:-webkit-box;
  /* display:flex; */
}
```

## 結果
<img width ='300' alt='455ED18C-1287-4546-811F-6C95BA9A0581.jpeg' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/832106/6b102cb2-f26f-a902-40fd-f43609ae324b.jpeg'>

いい感じですね。

ではまた。


## 参考

https://www.flapism.jp/html/278/
大規模点群を表示する作戦を考えてみる（点群表示機能を自作してみる その４）

[「点群表示機能を自作してみる」](https://qiita.com/yumimatoba14/items/a89b01145b3af4ce9451)のその４です。
今回は10億点を表示するための方策を検討します。
コードの変更はありませんが、ここからが本番です。

# 検討
1度に描画することができない規模の点群を描画するためには、点数を減らすことが必要になります。その手段を検討していきます。

## 案１ 見えない点の描画を省略する（点数削減方法その１）

![image4-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124939/0567d5de-0c0b-736f-8906-00009362c461.png)

上図は透視投影の模式図です。(A～Cは点群ないし物体と思ってください。)この図において、Bの描画をしないことを案１とします。直観的で分かりやすいかと思います。この方法は次に述べる点の間引きと違い描画結果を変えません。

見えない点というと A の陰にあるCも同様に見えない点と言うこともできます。(見えないと思ってください。）ですが、ここでは省略の対象としません。この判定をCPUで高速に行うのが容易ではなく、GPUで処理することが合理的と思うためです。一方Bが視野外か否かを判定するのは、Bounding volume を用いると容易に判定できます。

視野外の点の描画を省略することは実現できるとして、それだけでは点数の削減が十分でない場合があります。具体的には上図のAやCが高密度点群がある場合「見える点群」が大規模になるでしょう。そのため、次の「点の間引き」が必要になります。

## 案２ 点を間引く（点数削減方法その２）

次に考えるのは点の間引きでしょう。これも分かりやすいのですが、間引いた点群の描画結果は当然ながら元の点群の描画結果とは一致するとは限りません。「間引いても問題ない」という前提が成り立つことを仮定することになります。 この前提は成り立つ場合もありますが、特定の狭い領域のみ表示する場合は多く成り立たないでしょう。

この前提が成り立つケースとして、正確な描画が必要ない場合があります。典型的なケースとしてビューを動かしている時にはFPSを重視して描画データを軽くすることがあります。

このアイデアをおし進めるとプログレッシブ表示というアイデアになります。描画に使える時間が短い場合は疎なデータを、時間が長い場合はより多いデータを表示するという方法です。粗密の2段階ではLOD (Level of detail)表示と呼ばれるかもしれません。多段にするとプログレッシブ表示と呼ばれる機能になります。 点群の場合は時間と共に追加の点群を描画していくことで、自然にプログレッシブ表示を実現できます。
プログレッシブ表示の可否は描画の目的によるかもしれません。今回はマシンスペックを補う方法として可とします。

## 案３ 高速に描画する

点を削減するのとは逆に高速により多くの点を描画する方向の工夫も考えられます。これは描画データ(バーテックスバッファ)の事前構築と、その使いまわし一択と考えます。 案とか言ってますが GPU を用いて描画する場合の普通の実装でしょう。
但しハードウェアの過信は禁物で、この方法だけでは描画時間が十分に早くならないことも考えられます。 実際今回のハードウェアでは100万点を超えてくると必要なFPSが得られないというのが[前回](https://qiita.com/yumimatoba14/items/f49ea3be322f2865efff)の結果です。何点まで効果があるかはハードウェアに依存するでしょう。 (さすがに NVIDIA のGPUなどで100万点までしか扱えないことはないはず。)

バーテックスバッファにデータを入れるとGPUのメモリを圧迫します。GPU に乗る量の点群にしかこの方法は使えないということです。 ハードウェアによってはRAMをGPUメモリのように扱える場合もあるかもしれませんが、いずれにしてもメモリ使用量が扱える点数の上限となります。

## 案４ メモリに乗りきらない点群を扱えるようにする

それでは逆にメモリに乗らない規模の点数を扱うにはどうしたらよいか。これも一択で、一言で言えば Out of core 実装を採用するということになります。ここでは描画データをそのイメージのままファイルに保存しておき、ファイルから読んだイメージをそのままバーテックスバッファにコピーして描画することを指します。
実装方法はいくつかあるかもしれませんが、Windows の場合メモリマップドファイルを使うのがよいと考えます。ページファイルのIOと同様の機能であり、最大のパフォーマンスが得られるはずと考えるためです。

ファイルに情報を保存することから、ディスクIOのパフォーマンスが重要になります。そのためHDDではなくSSDを要求することになる可能性が高くなります。(SSDの使用もメジャーになってきたとはいえ、この点はもう少し工夫したい。)

物理メモリ量が多いPCにおいては使用していないメモリは最近の Windows ではファイルキャッシュとして利用されます。 そのため Out of core を採用する場合、ファイルの内容がキャッシュされることで実際上メモリに乗っているデータにアクセスするだけになる場合も考えられます。この場合、2回目以降のアクセスでは HDD/SSD を問わず十分速い速度で点を描画できるでしょう。（大規模な点群ファイルのうち実際に描画される一部だけがメモリに乗るイメージです。）

## 試作方針まとめ
以上を踏まえ、以下の方針で試作することにします。

* プログレッシブ表示を行う。（案２）
    * 点群に対し前処理で LOD のデータ構造の構築を行う。
    * この中で Out of core 実装も採用する。（案４）
* 点群データを位置で分割する。（案１）
    * 見える、見えないの判定の他、遠くの点は詳細を表示しない、といった処理も加えます。（上記のLOD構造のうち、粗い部分だけを描く。）
    * 分割数が多くなる場合は、分割したサブ点群は木構造で管理し、O(log) で描画すべきデータを絞る。

今回はチープなハードウェアを前提にするため、案３のハードウェアを活用するバーテックスバッファを事前構築する手段は実装保留します。
Androidスマホで「KindleでTSSが無効の本を自動読み上げページ送りする」マクロを作りました

タイトルの通りです。
MacroDroidというアプリでタイトルの「」内のマクロを検索すれば見つかるのではないかと思います。
既にあるネットの記事で、Kindle本のスクショを自動で撮って文字列認識させて音声化するというのをPCやMacやクラウド？で実施するというものがあり、自分にはハードルが高そうだったのと、時間がかかりそうだったので、記事をヒントに題記の方法でやってみました。
参考URL:
https://qiita.com/shuheilocale/items/38051c96ea1414733d52
https://zenn.dev/daimatz/articles/6723653fc73aca

具体的にやっていることは、MacroDroidのマクロを見ていただければ分かると思いますが、アプリ切り替え画面で「選択」を押して文字認識させ、TalkBackで読み上げさせ終わって画面がオフになったら、また画面をオンにしてページ送りを自動でやっている感じです。
自分の様な、家事育児で時間がないけど技術書を読まなければならないような人などに使っていただけるとありがたいです。
(あまり技術的な記事でなくすいません。)
チーズはどこへ消えた？

# はじめに
最近忙しいことを理由に全然積んでいる本が減らないので、暫く読書週間としてqiitaの記事を読んだ本のアウトプットの場としたいと思います。
今回読んだ本は以下になります。

https://www.amazon.co.jp/%E3%83%81%E3%83%BC%E3%82%BA%E3%81%AF%E3%81%A9%E3%81%93%E3%81%B8%E6%B6%88%E3%81%88%E3%81%9F-%E3%82%B9%E3%83%9A%E3%83%B3%E3%82%B5%E3%83%BC-%E3%82%B8%E3%83%A7%E3%83%B3%E3%82%BD%E3%83%B3/dp/459403019X

この本は決してボリュームのある本ではありませんが、400万部を超える大ヒットを記録している本です。


# 変化に備えよ
まず、この本を読むことで、日常的な変化に対しどう行動すべきか？、という問いに対して明確な答えをくれる本だと断言できます。

作中では、主にネズミの「スニッフ」と「スカリー」、小人の「ヘム」と「ホー」の２匹と2人が広がる迷路からチーズを探す話になります。
上記のチーズを【私たちが人生で求めているもの】、迷路を【チーズを追い求める場所】すなわち地域社会や会社、家族などを指しています。

キャラクターたちにはそれぞれ特徴がありますが、迷路の中で最初にチーズを大量に見つけたところから物語は進行していきます。
最初は多くあったチーズもいずれなくなっていくわけですが、なくなった時点ですぐに次を探し始めるネズミと、なくなってしまった理由などをいつまでも考え、次の行動に移せない小人。

暫くしてから小人の片方はもう一方の小人に対し、次のチーズを探しにいくことを説得してみるも、今の生活を変化させることを恐れ、踏み出すことができません。
そんな中で片方の小人は【人生は進んでいく。ぼくらも進まなくてはならない】と残し、もう片方の小人を置いて新たなチーズを探しに出てしまいます。

変化に気づいた時点で行動したネズミ、中々行動できずにいたが前へ進むことができた小人A、変化を恐れ前に進むことを拒否した小人B。
みなさんはどのキャラクターが当てはまりますでしょうか？

新たな一歩を踏み出すときには時に今までの自分を捨てる必要が出てくることもあるかと思います。
時に恐怖で足がすくみながらも変化を受け入れなければならない場合に、間違いなく力になってくれる良書です。
是非、変化に備え一度読んでみることをお勧めします。

# さいごに
やはり読書は重要ですね、苦しい時こそ読書をすべしということをしっかりと自分自身にすり込んでいこうと思います。
ストワで始めるLua 第一回 のコード

『ストワで始めるLua 第一回第一回変数と入出力』で使われたコードです。
動画はこちら
https://www.nicovideo.jp/watch/sm42026411
https://www.nicovideo.jp/watch/sm42026442

ストワのスクリーンに円を表示して入力の数値で動かすサンプルコード。

```lua:lua1
--initialize
positionX=0
positionY=0

function onTick()
	--input
	positionX=input.getNumber(1)
	positionY=input.getNumber(2)

	--output
	output.setNumber(1,positionX)
	output.setNumber(2,positionY)
end

function onDraw()
	--display
	local w=screen.getWidth()
	local h=screen.getHeight()
	
	local x=positionx*(w/2)
	local y=positionY*(h/2)
	
	screen.setColor(0, 255, 0)
	screen.drawCircleF(w/2+x,h/2-y,20)
end

```
ITパスポートに合格してみた

# 概要

ITパスポートに合格したので、体験記を記述しておきます。
・本は買わなかった。YouTubeやウェブに問題と解答はころがっているので、それを参考にした。お金はかからない方がいいので。
・特に利用したのはウェブ上の道場。問題も解説も充実しているのでこれで十分。
・YouTubeの合格体験記の動画をいくつか見た。直前に確認したので少し焦った。

# CBT方式

CBT（Computer Based Testing）方式なので、慣れてないと結構きついかも。
私の場合はコンピュータに囲まれて生活しているので特に苦にはならなかった。

# 出題範囲

ストラテジ系、マネジメント系、テクノロジ系からなる。私の得意分野はストラテジ＜マネジメント＜テクノロジの順になる。

# ストラテジ

ストラテジはよくわからん。エンジニアなので、テクノロジはわかるのだが、ストラテジはよく分からなかった。
レポートもお恥ずかしいですが、500点台だった。試験中に、「これは何回受けても合格できないかも」と思ったがなんとかなった。

# レポート

レポートは以下の通り。ウェブ上で受け取れる。ストラテジの穴をテクノロジが埋めてくれた感じ。

![ITパスポート試験結果レポート(伏せ字).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/7c5c3e2a-0144-06b3-099a-4759a0d0975e.jpeg)

# 合格証書

合格証書は以下の通り。郵送されてくる。経済産業大臣のハンコとサインがある。

![ITパスポートの合格証書(伏せ字).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3192024/28e7d4f0-c438-cc6e-97b3-f1a26cd563e5.jpeg)

以上です。何かの役に立てばと。
Flutterの開発でngrokを利用する方法

## 概要

Flutterアプリを開発する際、外部のAPIと通信する必要がある場合、そのAPIをローカル開発環境でテストすることができます。しかし、APIが外部に公開されていない場合、ローカル開発環境からアクセスできません。そこで、ngrokを使ってAPIを外部に公開し、Flutterアプリからアクセスする方法を紹介します。

## 手順

1. ngrokのインストール

    ngrokの公式サイト[[1](https://ngrok.com/)]から、インストールに必要なファイルをダウンロードします。ダウンロードが完了したら、ファイルを適当なディレクトリに解凍します。

2. ローカルサーバの起動

    ngrokを使ってAPIを公開する前に、ローカルでAPIを起動します。以下は、ローカルサーバを8000ポートで起動する例です。

    ```python
    # manage.py

    from django.core.management import execute_from_command_line
    import os
    import sys

    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_project.settings")
        execute_from_command_line(sys.argv)
    ```

    以下は、ローカルサーバを8000ポートで起動するコマンド例です。

    ```
    $ python manage.py runserver 8000
    ```

3. ngrokの起動

    ngrokを起動します。以下のコマンドを実行します。

    ```
    $ ./ngrok http 8000
    ```

    ngrokが起動したら、以下のように表示されます。

    ```
    ngrok by @inconshreveable

    Session Status                online
    Account                       John Smith (Plan: Free)
    Version                       2.3.35
    Region                        United States (us)
    Web Interface                 http://127.0.0.1:4040
    Forwarding                    http://a1b2c3d4.ngrok.io -> http://localhost:8000
    Forwarding                    https://a1b2c3d4.ngrok.io -> http://localhost:8000
    ```

    `http://a1b2c3d4.ngrok.io`と`https://a1b2c3d4.ngrok.io`がAPIにアクセスするためのURLになります。これらのURLをFlutterアプリから使用します。

4. FlutterアプリからAPIにアクセスする

    Flutterアプリから、先程取得したngrokのURLを使用してAPIにアクセスします。以下は、httpパッケージを使ってAPIにGETリクエストを送信する例です。

```dart
import 'package:http/http.dart' as http;

final response = await http.get(Uri.parse('http://a1b2c3d4.ngrok.io/api'));

if (response.statusCode == 200) {
  // リクエストが成功した場合の処理
} else {
  // エラーが発生した場合の処理
}
```

# リンク
1: https://ngrok.com/
chrome extensionsで現在表示ページへの操作

# manifest.json
```manifest.json
  "content_scripts": [
    {
      "matches": ["https://target_host.jp/*"],
      "js": ["process_1.js"]
    }
  ]
```
# process_1.js（稼働させるJS)
```process_1.js
window.onload = () => {
    console.log("start process_1.js")
}
```
【Android】エミュレーターで移動する位置情報の設定方法

今回は、エミュレーターで移動する位置情報の設定方法を紹介しようと思います。

まずは、一番右の縦に点が３つあるアイコンをクリックして設定を開きます。
![スクリーンショット 2023-04-02 21.08.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/20570592-ff74-0350-1a23-8a072e8a9684.png)


デフォルトで一番上がLocationだと思うのでこのままで大丈夫です。

上部にSingle points　と　Routesがあるので、　Routesをクリックします。

![スクリーンショット 2023-04-02 21.12.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/cd4a7da5-46c5-235c-d8f1-744a62b407bc.png)



地図上に目的地にしたい位置をクリックすると、この様になります。
右下の赤矢印が差している場所をクリックします。
![スクリーンショット 2023-04-02 21.15.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/6f0abb9e-f4dc-3e4a-4958-77335a21d706.png)


同じようにスタート位置をクリックすると画像の様になります。
右下にPLAY　ROUTEのボタンがあるのでクリックすれば完了です。
![スクリーンショット 2023-04-02 21.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/e89cc762-f770-9b9a-3f12-432fd451591e.png)
ReactNativeでのアプリ開発、ExpoSDKがいい感じになってきたようなので試してみた：その２

# 次は・・・の、その前に
[その１](https://qiita.com/sakai-y/items/6f1243f3bcbb435186b9)で書いた流れだと次はExpo Module作成なんですが、その前にWorkflowについて書いてみようと思います。

# Workflowについて
## 以前
以前は、
- Managed workflow
  →　純Expo、カスタムネイティブ拡張不可
- Bare workflow
  →　Managedから"eject"した状態、ネイティブ側も自力で面倒を見る必要あり
- ReactNative
  →　Expoなし、純ReactNative

という区分だったように思います（違ったらスミマセン）。

Managedで開発している途中でejectするのは崖から飛び降りるような感覚だったのかも知れないです。

https://www.aruse.net/entry/2019/09/01/122540

## 最近
最近では、
- Managed workflow
  → ネイティブビルドをexpoに任せている状態
- Bare workflow
  →　ネイティブビルドを自力で頑張る状態

素のReactNativeはBare workflowだ、という扱いのようです。

https://docs.expo.dev/introduction/managed-vs-bare/

Managed workflowは、基本的にJS/TSで開発することになります。メタデータはJSONあるいはJSで記述します。
ネイティブコードを編集することはないです。そもそも`ios`ディレクトリも`android`ディレクトリも存在しない。

ネイティブ機能を利用するには、Expoが公式に用意しているライブラリを利用するか、または、Expo Moduleを作成・利用することになります。
後者の場合、Expo Goには該当のネイティブ機能はないので利用できないですが、Development Buildを作成することで対応可能となります（次かその次ぐらいで書く予定）。
逆に言うと、これで対応できる範囲であれば、Managed workflowを利用することが可能です。
XcodeやGradleと格闘したくない人にとってはありがたい。

ManagedからBare workflowへ移行するには、`expo prebuild`コマンドを実行します。
これにより、Managedではexpoによって隠されている`ios`および`android`ディレクトリが生成され、JSONで管理できていたメタデータもそれぞれのネイティブの作法での設定に変わります。
元（Managed）に戻すコマンドはないのですが、`ios`および`android`ディレクトリ以下を変更していなければ戻すのは簡単です。

[ここの表](https://docs.expo.dev/introduction/managed-vs-bare/#workflow-comparison)にあるように、以前よりManaged workflowで出来ないことが大幅に減っています。

よほどのことがなければManaged workflowで乗り切れるのではないでしょうか。

つづく
ローカルからEC2へSCPコマンドを実行したら"Permission denied" というエラーメッセージが表示された場合の対処法

# 概要
* SCP (Secure Copy) コマンドを使用して、ローカルマシンの指定したディレクトリをEC2インスタンスにコピーするコマンドを実行したら`"Permission denied"`と返ってきてしまったので、その解決方法を記します。
    * 前提：OSはUbuntu 18.04.3 LTSです。

## 解決手順
* 以下のコマンドを実行することで、ローカルマシンの`/Users/hogehoge/foofoo/wpsample_homepage`ディレクトリを、EC2インスタンスの`/var/www/html`ディレクトリにコピーすることができます。

```bash
$ scp -i /path/to/sample_homepage_key.pem -r /Users/hogehoge/foofoo/wpsample_homepage ubuntu@11.222.333.444:/var/www/html/
```

* これでいけるはず...と思ったら、以下のように出てきた。

```bash
scp: /var/www/html//wpsample_homepage: Permission denied
```

* エラーメッセージ`"Permission denied"`は、EC2インスタンスに対してコピー先のディレクトリに書き込み権限がないことを示しているよう。これは、コピー先のディレクトリに対するアクセス権が不足していることが原因と思われますので、以下のコマンドを使用して、コピー先のディレクトリに対して適切な権限を付与してみます（755=EC2インスタンス上でのファイルの書き込みが可能になる）。

```bash
$ sudo chmod -R 755 /var/www/html
```

* 権限を変更して、再度scpコマンドを実行したら...また以下のように表示された。

```
scp: /var/www/html//wpsample_homepage: Permission denied
```

* `sudo su`を実行して、rootユーザーに切り替え、777にしてみる。
    * 777=全てのユーザーに書き込み権限を付与

```bash
$ sudo su
$ chmod 777 /var/www/html
```

* 再度、scpコマンドを実行して、ファイルをコピーします。

```bash
$ scp -i sample_homepage_key.pem -r /Users/hogehoge/foofoo/wpsample_homepage  ubuntu@11.222.333.444:/var/www/html/
```

* これでファイルがコピーされました。
* ただし、セキュリティ上の理由から、全てのユーザーに書き込み権限を与えることは推奨されないとのこと。ファイルのパーミッションを適切に設定するこが推奨されています。

### 各オプションの説明

* `-i sample_homepage_key.pem`: リモートホストにログインするために使用する秘密鍵ファイルを指定します。-i オプションは、identity file の略称で、秘密鍵を指定するために使用されます。
* `-r`: ディレクトリを再帰的にコピーするためのオプションです。このオプションを使用しない場合、ファイルのみがコピーされます。
* `/Users/hogehoge/foofoo/wpsample_homepage`: コピーするローカルマシンのディレクトリパスを指定します。
* `ubuntu@11.222.333.444:/var/www/html/`: リモートマシンにコピー先のパスを指定します。ubuntu は、リモートマシンにログインするためのユーザ名で、11.222.333.444は、リモートマシンのIPアドレスです。`:/var/www/html/`は、リモートマシンにコピー先のディレクトリパスを指定します。
【Git】既にリモートにあるファイルをGitの管理下から外す

# はじめに
Xcodeを触るたびに変化が加わってしまう、厄介なファイルがあったので管理下から外して今後コミットしないようにしました。記録しておきます

# やりかた
`git rm --cached`で管理下から外す
```:ターミナル
git rm --cached /Users/miyamototaishin/Desktop/G-Search/TwitterSearch.xcodeproj/xcuserdata/miyamototaishin.xcuserdatad/xcschemes/xcschememanagement.plist
```

.gitignoreにファイル名を追加して今後コミットしないようにする
```:.gitignore
xcschememanagement.plist
```

.gitignoreをコミット&プッシュする
```:ターミナル
git add .gitignore
git commit -m 'add: .gitignore'
git push origin main
```

# おわり
gitはむずいですね