OmniAICreator/Qiita-1.07M huggingface dataset:
10MB越えのBigQuery出力をGoogleスプレッドシートに出力するには

BigQueryの出力結果をGSSにして渡さないといけないことがあります。  
アドホックに実行するときはコンソールでSQLを流して、【結果を保存】からGoogleスプレッドシートを選べばいいのですが⋯⋯  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/e60a4be9-40fc-bbd4-bcd0-5fa75979b7f8.png" width=406>

最大10MBという制限があり、これより大きいデータは先頭から10MBに切り詰められた出力になってしまいます。困りましたね。どうしましょう。

-----
メニューの一番上のCSV保存を見てください。  
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2852/86672042-1c05-5ea4-c058-be2151d69b39.png" width=406>

最大1GBまでGoogleドライブに保存できますね。  
これで保存してからそのCSVファイルをGoogleスプレッドシートで開けばあっけなく目的の形式になります。

Googleスプレッドシートの本来のサイズ制限は「[1,000 万セルまたは 1 万 8,278 列（列 ZZZ）まで](https://support.google.com/drive/answer/37603)」と、10MBよりずっと大きいのです。
function`xxxx` は、タグ付きテンプレートリテラルという名前らしい

私が今まで見かけたものだと、

```
gql`xxx`; //graphQL
```
や
```
escape`xxx`; //mysql
```
など、
テンプレートリテラル（``で囲う書き方）の先頭に何かが付いている記法を、たまに見かける事がありました。
 
ずっと何なんだろうと思っていましたが、やっとこの記法は、
**タグ付きテンプレートリテラル** という名前のものだと知れました！

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals#%E3%82%BF%E3%82%B0%E4%BB%98%E3%81%8D%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88


どうやら、実態は関数で、テンプレートリテラルを修飾する役割みたいです。
知れてスッキリしました💡
Your current quota does not allow you to purchase the required number of Reserved Instance

AWSでは、セキュリティとリソースの管理を目的として、各アカウントに対して様々なサービスの使用量に上限（クォータ）を設定しています。これらのクォータは、一部はAWSによって初期設定され、一部はユーザーが管理することができます。

例えば、月毎に最大購入越えエラー

```
Error: Your current quota does not allow you to purchase the required number of Reserved Instances. (Status Code: 400; Error Code: ReservedInstancesLimitExceeded; Request ID: xxxxxxx-e0ed-43e5-a918-xxxxxxxxx)
Instance ID(s): 20240408 
Timestamp (YYYY-MM-DD HH:MM:SS UTC): 20240408-1542
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/c1bda336-7cbd-617a-f5f9-b3e53a31ceec.png)


### 利用状況確認

最初のステップは、AWSマネジメントコンソールで現在のクォータの使用状況を確認することです。Service Quotas（サービスクォータ）ダッシュボードを利用して、EC2サービスに関連するクォータの使用量を確認し、どのクォータに達したかを特定します。

- https://ap-northeast-1.console.aws.amazon.com/servicequotas/home/services/ec2/quotas

### 解消方法

もし必要なリソースが現在のクォータを超えている場合、AWSマネジメントコンソールからクォータの増加をリクエストすることが可能です。Service Quotasダッシュボードから、増加を希望するクォータを選択し、「クォータの増加リクエスト」を提出します。このリクエストはAWSによってレビューされ、承認される必要があります。

- https://ap-northeast-1.console.aws.amazon.com/servicequotas/home/dashboard


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155256/64bc877b-4e82-f7f0-21a1-f19ab2e97d55.png)

最後に、弊社の採用情報にご興味をお持ちの場合は、ぜひカジュアルな面談をお申し込みください。

- [【バックエンドエンジニア】3万人以上の理系学生が利用する就活サービスの開発担当](https://hrmos.co/pages/techocean/jobs/1827530328848072705)
- [【インフラエンジニア】3万人以上の理系学生が利用する就活サービスのインフラ担当](https://hrmos.co/pages/techocean/jobs/1827530328848072707)
Salesforce Connectのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [「Salesforce Connect Adapter for SQL」で Salesforce 外部データ ソースを使用して Snowflake を認証すると、エラーが発生します。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ZACJj)


:::note alert
The error "java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $".
:::

:::note
As I understand it, the SQL API used by Salesforce Connect supports OAuth or JWT. The [instructions in Help & Training](https://help.salesforce.com/s/articleView?id=sf.snowflake_named_credentials_external_credentials.htm&type=5) detail the steps needed to use OAuth.


私の理解では、Salesforce Connect で使用される SQL API は OAuth または JWT をサポートしています。ヘルプとトレーニングの手順には、 OAuthを使用するために必要な手順が詳しく説明されています。
:::
Trailmixの不具合

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)


+ [Trailmix をフォローしたりフォローを解除したりすると、完了率がすべて失われてしまいました。](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007aib9u)


:::note
Also kindly note that the reason for this kind of issues could be that the new Units might be added by us in any of those badges in the Trailmix recently. So, the badge will be shown as completed but Trailmix status will not be 100%. We request you to please open each badge and see all units are completed or not. Also, please unfollow the trailmix and follow it back.

また、この種の問題の原因は、最近 Trailmix のバッジに新しいユニットが追加された可能性があることにも注意してください。そのため、バッジは完了と表示されますが、Trailmix のステータスは 100% にはなりません。各バッジを開いて、すべてのユニットが完了したかどうかを確認してください。また、Trailmix のフォローを解除し、フォローバックしてください。


:::

:::note
There is a known bug that can cause it to not show 100%. When this happens, you need to unfollow the trail mix. This will uncheck all of the "links" that you manually mark as complete. However, all modules and quizzes will remain completed. Then you need to refollow the trail mix. 

Once you refollow the trail mix, you can click complete on all links, and it will show as 100% complete. Once again, sorry about this bug; Salesforce is working on fixing it, but it may be a while before it's fully fixed.

100% が表示されない可能性がある既知のバグがあります。この問題が発生した場合は、トレイル ミックスのフォローを解除する必要があります。これにより、手動で完了としてマークしたすべての「リンク」のチェックが外されます。ただし、すべてのモジュールとクイズは完了したままになります。次に、トレイルミックスを再度フォローする必要があります。 

トレイル ミックスを再度フォローしたら、すべてのリンクで [完了] をクリックすると、[ 100% 完了]と表示されます。もう一度、このバグについて申し訳ありません。 Salesforce はこの問題の修正に取り組んでいますが、完全に修正されるまでにはしばらく時間がかかる可能性があります。

:::
WSLにFlameMasterをインストールする

# FlameMasterとは

0次元の化学反応と1次元の層流火炎の計算のためのオープンソースのC++プログラムパッケージ．
Google Scholarで調べると乱流燃焼のLESのためのFlamelet Libraryを作成するためによく用いられている．

[公式サイト](https://www.itv.rwth-aachen.de/downloads/flamemaster/)


# ダウンロード

[ダウンロード先](https://itv.rwth-aachen.de/index.php?id=13)

You can request a login here. のリンクを押すと，ログインのリクエストができるので適宜情報を入力する．
一定期間後にメールが届くので，メールに従ってダウンロード画面でidとパスワードを入力すると，ダウンロードできる．
ダウンロードできたzipファイルを解凍すると，`FlameMaster/Repository`というフォルダ構成になっており，任意の場所に保存して作業する

## インストール

ダウンロードしたフォルダのREADME.mdを参考にするが，その前に必要なパッケージをインストールしておく．
`doc\LINUX_Prerequisites.md`に記載されている以下のコマンドを実行しておく．

```bash
sudo apt-get install git cmake flex bison libsundials-dev g++ gfortran 
```

これでcmakeなどの必要なパッケージがそろったのでインストールしていく．
先ほどダウンロードした`Flamemaster`のフォルダにcdで移動し，以下を実行する

```bash
mkdir -p Build && cd Build
cmake ../Repository -DCMAKE_BUILD_TYPE=Release
cmake --build . --parallel --target install --config Release
```

ここでエラーが出なければ，以下を実行するとビルドとインストールができる．

```
make
```

## エラー処理

自分の環境ではcmakeの実行時に以下のエラーが出た．

```bash
CMake Error at CMakeLists.txt:74 (message):
  In-source builds are not allowed.
```

一度間違った場所でcmakeを実行したときのキャッシュが残っていたことが原因らしく，[この記事](https://stackoverflow.com/questions/45518317/in-source-builds-are-not-allowed-in-cmake)を参考に，以下のコマンドを実行してキャッシュを削除することで解消できた．

```bash
rm ../Repository/CMakeCache.txt
```

# サンプルの実行

以下のスクリプトを実行することで，環境の設定をできる．シェルの種類によって実行するスクリプトが異なるが，bashならば以下を実行する．

```bash
source Bin/bin/Source.bash
```

`fmagain`というコマンドで環境変数とaliasを表示させることができる．

```bash
/mnt/d/FlameMaster$ fmagain

>> 実行結果
#########################################################################
Setting up environment for FlameMaster, version 4.2.1
#########################################################################

'fmagain' can be used to run this script again in verbose mode

Setting up locations...
export FM_PATH=/mnt/d/FlameMaster/Bin/bin/../..
export FM_DATA=/mnt/d/FlameMaster/Build/../Data
export myData=/mnt/d/FlameMaster/Build/../Data
export FM_RUN=/mnt/d/FlameMaster/Bin/bin/../../Run
export FM_RUN_FM=/mnt/d/FlameMaster/Bin/bin/../../Run/FlameMan
export FM_RUN_SM=/mnt/d/FlameMaster/Bin/bin/../../Run/ScanMan
export FM_BIN=/mnt/d/FlameMaster/Bin/bin/../../Bin/bin
export FM_LIB=/mnt/d/FlameMaster/Bin/bin/../../Bin/lib

Creating alias commands...
alias FlameMan=/mnt/d/FlameMaster/Bin/bin/../../Bin/bin/FlameMan
alias FlameMaster=/mnt/d/FlameMaster/Bin/bin/../../Bin/bin/FlameMan
alias ScanMan=/mnt/d/FlameMaster/Bin/bin/../../Bin/bin/ScanMan
alias CreateBinFile=/mnt/d/FlameMaster/Bin/bin/../../Bin/bin/CreateBinFile
alias ListTool=/mnt/d/FlameMaster/Bin/bin/../../Bin/bin/ListTool -M
alias LT=/mnt/d/FlameMaster/Bin/bin/../../Bin/bin/ListTool -M
```

インストール時に自動で作成されるRunというフォルダに計算のサンプルがある．
Runのフォルダをたどっていくと，サンプルを実行するbashのスクリプトが存在するので実行し，インストールが出来ていることを確認した．

```bash
/mnt/d/FlameMaster/Run/FlameMan/Diff/Steady$ bash RunSteadyDiff.bash >log.RUnSteadyDiff.bash 2>&1
```
僕なりの Basic認証 備忘録

## 普通の掛け方

`.htaccess`

```htaccess
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile フルパス/.htpasswd
require valid-user
```



`.htpasswd`
basic認証作成サイトで作成する。
こんな感じになる
```
hoge:fsdfasb23dfas%#"#FD
```



#### 参考：こんなのもある

```.htaccess
# 絶対パスで設定
AuthUserFile /usr/home/hoge/html/app/.htpasswd

# アクセスできるユーザーをグループ分けする時に指定。特になければ↓のように
AuthGroupFile /dev/null

# 表示するメッセージ
AuthName "Protected Area"

AuthType Basic

# GET POST しか受け付けない。→ IDPW が正しいかつ GET POST のどちらか でないとNG
<Limit GET POST>
# htpasswdに複数記述がある場合でさらに制限したい場合に使う。特にない場合は↓のように書く。
require valid-user
</Limit>
```

## 特定のディレクトリだけかける

```htaccess
<Directory "D:/pg/Apache/Apache24/htdocs/private"> # かけたいディレクトリ
  AuthType Basic
  AuthName "Input ID and Password."
  AuthBasicProvider file
  AuthUserFile D:/pg/Apache/Apache24/password/passwords
</Directory>
```

↑これではできない。
`<Directory>`が.htaccessでは使えないことが多い。
Apacheの設定ファイルで記述するなら行ける。

↓これが正解。

```htaccess
Satisfy Any

AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /var/www/.htpasswd
require valid-user

SetEnvIf Request_URI "/member/" secure_dir
Order Allow,Deny
Allow from all
Deny from env=secure_dir
```





## 特定のファイルを除外する

```htaccess
<FilesMatch "(cominsoon\.php)$"> # ここをファイル名にする
Satisfy Any
Order allow,deny
Allow from all
Deny from none
</FilesMatch>
```



## ブラウザから対象ファイルにアクセスできないようにする

```htaccess
<Files ~ "^.(htpasswd|htaccess)$">
  deny from all
</Files>
```

## ハマった事例

### 複数の異なるディレクトリに対してそれぞれ異なるIDPWでかけたい

以下のどちらかで統一しないと期待通り動かない。

- ドキュメントルート直下で上記のSetEnvIfを使った方法で複数の異なるディレクトリにかけるように設定する。（※Apache2.4以上でないとできない。）

or

- 各ディレクトリの中にhtaccessとhtpasswdのセットを置いて設定する（htpasswdは本来ドキュメントルート以外に配置するが一旦はこういう認識で）

### 異なるディレクトリに異なる認証がかかっている時に、どちらかの認証を通るともう片方も認証が通ってしまう

異なる認証領域名を使用してないことが原因。

AuthName で指定する認証領域名（realm）を異なるものにすることで、ブラウザに異なる認証セッションとして認識させることができる。これにより、一方の認証が他方に影響を与えることを防げる（場合もある）みたい。

## 参考にさせて頂いた記事。

[.htaccess の書き方（アクセス制御編）](https://qiita.com/shotets/items/17bed9029140a6d925d2)
【Flutter】初心者が陥るBoxDecorationのエラー

こんにちは。
今回は、flutter初心者の私がよく出していたErrorの解決方法を書きます。

* エラー内容
` _AssertionError ('package:flutter/src/widgets/container.dart': Failed assertion: line 269 pos 15: 'color == null || decoration == null': Cannot provide both a color and a decoration
To provide both, use "decoration: BoxDecoration(color: color)".)`

これは、colorのプロパティがBoxDecorationの中に入っていない時に出ます。



# 方法
![スクリーンショット 2023-08-13 20.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/ce57fee2-1687-ea40-8538-b4c8b9db94e0.png)
colorプロパティはBoxDecorationの中に入れましょう



# 使用例
```dart
class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text(widget.title),
        ),
        body: Center(
          child: Container(
            width: 100,
            height: 70,
          //  color: Colors.pink, //これがダメ！！
            decoration: BoxDecoration(
            color:Colors.pink, //BoxDecorationの中に入れる
              border: Border.all(color: Colors.yellow),
            ),
          ),
        ));
  }
}

```

# 実行例
![スクリーンショット 2024-04-11 9.47.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524120/68193734-0afd-9106-1c06-7b3468179042.png)

# 最後に
ここまで読んでいただき、ありがとうございました！
いいねしてくれたら、スキップして喜びます:heartpulse:
SPFのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめN～Z](https://qiita.com/Keiji_otsubo/items/92f92bb9f668ca9688be)

+ [Salesforceからのメール送信が迷惑メール扱いになる](https://qiita.com/Keiji_otsubo/items/c44167f32e4a694d882d)


# Pardot

+ [リストのハードバウンスステータスを一括変更するにはどうすればよいですか？](https://qiita.com/Keiji_otsubo/items/a3ccd1370697dd914723#%E3%83%AA%E3%82%B9%E3%83%88%E3%81%AE%E3%83%8F%E3%83%BC%E3%83%89%E3%83%90%E3%82%A6%E3%83%B3%E3%82%B9%E3%82%B9%E3%83%86%E3%83%BC%E3%82%BF%E3%82%B9%E3%82%92%E4%B8%80%E6%8B%AC%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B)

# 承認プロセス

+ [①のメールが届き、②のメールが届かないというこの①と②の同じ発生源のメールの間で何故、このような差異が発生してしまうのか原因をご存じでしょうか?](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ahzhd)

:::note
DKIM、SPF周りの封筒とヘッダの名称の差異による不都合のようでした。
:::

# 設定に関するもの

+ [Salesforce のSPF設定のやり方を教えてください！](https://trailhead.salesforce.com/trailblazer-community/feed/0D5KX000000V9Nl)
ModelerFlowでSJISのデータを読み込む

CP4DaaS上のModelerFlowでデータを読み込む場合デフォルトはUTF-8になっていますが、Shift-JISのデータを読み込みたいことがあります。

その場合、「データ資産」ノードのエンコードを「cp932」にすれば、読み込むことが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/141e020e-9d67-e11b-8b95-8e4a858b9b04.png)

# 参考
#### 本当は怖くないCP932 #文字コード - Qiita 

https://qiita.com/kasei-san/items/cfb993786153231e5413
日報用にgoogleカレンダの予定を取得する

# 日報用にgoogleカレンダの予定を取得する
日報にMTGの時間や内容を記載する必要があり複数予定があると面倒だった為、一覧で取得できるようにしました。
実際は作業内容とマージして日報のフォーマットに合わせていますが、
今回はgoogleカレンダーの情報を取得する箇所を抜き出しています

# gas側
#### スクリプト画面を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/0b95e64f-4543-bc59-798b-b54b60169e12.png)


#### タイムゾーンの設定
googleカレンダーのタイムゾーンを設定する。gasの画面の歯車の「設定」ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/f60f8d39-e1d1-c29d-dcbc-29f88e0eb4b7.png)


#### コード作成
・スクリプトの画面の<>のボタンをクリックし、+ボタンをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/67121477-d6de-598d-104d-d890f7437db9.png)


カレンダーIDの箇所は、基本はメールアドレスです。
確認したい場合は、カレンダーの設定画面の「マイカレンダーの設定」の「カレンダー統合」をクリックしてカレンダー IDを確認してください
```gas
// 今日と明日の予定を取得する
function getGoogleCalendarTodayNext() {
  var mySheet = SpreadsheetApp.getActiveSheet();
  getGoogleCalendar(new Date(mySheet.getRange('A2').getValues()), 'B2');
  getGoogleCalendar(new Date(mySheet.getRange('A3').getValues()), 'B3');
}

// googleカレンダー取得
function getGoogleCalendar(targetDate, sellNm) {
  const calendarId = 'xxxx@gmail.com';// カレンダーID(基本はメールアドレス「マイカレンダーの設定」の「カレンダー統合」をクリックして確認してください)
  var mySheet = SpreadsheetApp.getActiveSheet();
  let calendar = CalendarApp.getCalendarById(calendarId);
  var events = calendar.getEventsForDay(targetDate);

  if (events == null){
    Browser.msgBox("カレンダー情報はありません");
  } else {
    var message = '';
    for (key in events) {
      event = events[key];
      message = message + '　・' + event.getTitle() + '（' + 
      Utilities.formatDate( event.getStartTime(), 'Asia/Tokyo', 'HH:mm') + '～' + 
      Utilities.formatDate( event.getEndTime(), 'Asia/Tokyo', 'HH:mm') + ')\n';
    }
    mySheet.getRange(sellNm).setValue(message);
  }
}
```

## スブレットシート側
・B2のセルに「=today()」と入力
・B3のセルに「=WORKDAY(A2,1」と入力(祝日を設定したい場合、第三引数に範囲を設定する)
・[挿入][図形描画]でカレンダ取得のボタンを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/63f81900-c080-9510-25a9-cfeb286476f7.png)

・先ほど作成した関数の「getGoogleCalendarTodayNext」を割り当てる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/44274b59-e8aa-b2f6-ec1b-7033a746d5e0.png)

googleカレンダーの値を取得できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771936/cd54a3ca-954e-23c0-22b6-a6fccfb5a2c2.png)


以上、簡単ですが、googleカレンダーの情報取得でした。
[cybozu]kintoneカスタマイズチュートリアルの詰まったところ

# Cybozu学習：kintoneカスタマイズチュートリアルの補足

Cybozuは、ビジネスソフトウェアの開発と提供を行っている企業であり、彼らの提供するサービスは多くの企業で利用されています。
この記事では、Cybozuの学習プロセスの一環の「[kintoneカスタマイズチュートリアル](https://cybozu.dev/ja/tutorials/getting-started/)」を実施した中で、私が補足すべきと感じた内容を紹介します！


# [step1(始めようJavaScript)](https://cybozu.dev/ja/tutorials/hello-js/)の補足

## 1. 開発ツールの開き方

受講するにあたり、示されたコードを試していくと思います。
以下の手順で開発ツールを開き、実施してください。

1. 以下のような**index.html**ファイルを作成し、開きます。
2. ブラウザのメニューから「その他のツール」→「デベロッパーツール」を選択します。

![スクリーンショット_20240402_085512.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570986/392dd74e-c3c3-065c-28a6-3c93a6a25355.png)

![スクリーンショット_20240402_085642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3570986/14e4d3af-a3d0-4cca-d10c-2c3ce0bde0f5.png)

## 2. ライブラリの試し方

### Day.jsの試し方

Day.jsは日付処理用のライブラリです。以下の手順で試すことができます。

1. headタグに以下のコードを追加してDay.jsをインポートします。
```html
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.10.4/dayjs.min.js"></script>
```
2. サイトに記載されているコードを試す
### SweetAlertの試し方

SweetAlertは、美しいアラートを表示するためのライブラリです。以下の手順で試すことができます。

1. headタグに以下のコードを追加してSweetAlertをインポートします。
```html
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
```
2. 開発ツール上で以下のコードを実行して、SweetAlertを表示します。
```javascript
Swal.fire('Oops', 'Something went wrong!', 'error');
```

# [step2(始めようkintone API)](https://cybozu.dev/ja/tutorials/hello-kinapi/)の補足
## 3. コマンドプロンプト上のkintone REST APIの試し方

最後に、コマンドプロンプト上でCybozuのAPIを使用してレコード情報を取得する方法を紹介します。

1.以下のコマンドをコマンドプロンプト上で実行してください

```bash
curl -X GET "https://[アドレス].cybozu.com/k/v1/record.json?app=[アプリID]&id=[レコードID]" -H "X-Cybozu-API-Token: [APIトークン]"
```

これにより、CybozuのAPIを使用して、特定のアプリおよびIDのレコード情報を取得できます。

# おわりに

今回は「[kintoneカスタマイズチュートリアル](https://cybozu.dev/ja/tutorials/getting-started/)」を実施した中でうまく行かず、補足すべきと感じた内容を紹介しました。
今後も気づいた点があった場合は、順次記事を更新していきます！
ITパスポート サイバー攻撃

・サイバー攻撃（クラッキング）
悪意をもってコンピュータに不正侵入し、情報の盗聴や窃取、データの改ざんや破壊などを行う行為

・標的型攻撃
官公庁や企業などの特定の組織を標的に、電子メールにウイルスを仕込む攻撃
・水飲み場攻撃
対象の組織内の人がよく訪れるWebサイトにウイルスを仕込む攻撃
・ビジネスメール詐欺
金銭の窃取を目的とするもの
・フィッシング詐欺
電子メールを発信して受信者を誘導し、実在する会社などを装った偽のWebサイトにアクセスさせ、個人情報をだまし取る攻撃
・サイバーキルチェーン
標的型攻撃を７段階にモデル化したもの
・不正侵入
辞書攻撃、総当たり攻撃、パスワードリスト攻撃
・パスワードの解析に対する対策
パスワードの入力試行回数の制限を設ける
・Dos攻撃、DDos攻撃
特定のサーバなどに大量のパケットを送りつけ想定以上の負荷を与えることで、処理不能の状態に陥らせる攻撃
・IDS
不正を検知すれば管理者に通報するシステム
・IPS
遮断まで行うシステム
・SIEM
複数のセキュリティ機器から情報を一ヶ所に集約し、総合的に分析する仕組み

・SQLインジェクション
データベースと連携している、脆弱なWebサイトの入力欄に、攻撃者が悪意のあるSQLの命令を入力することで、データベースを不正に操作する攻撃
・クロスサイトスクリプティング
攻撃者が仕掛けた悪意のあるスクリプトを、利用者のWebブラウザを介して脆弱なWebサイトに送り込み、利用者のWebブラウザで実行させることで、利用者のcookieなどの個人情報を盗む攻撃
・サニタイジング
悪意が働かないように別の文字に置き換える処理
・クロスサイトリクエストフォージェリ
悪意のあるスクリプトを仕掛けたWebサイトを利用者に閲覧させて、ログイン中の別のWebサイトで、その利用者が意図しない操作を行わせる攻撃
・クリックジャッキング
Webサイトのコンテンツ上に透明化した標的サイトのコンテンツを配置し、利用者を視覚的に騙してクリックさせる攻撃
・ドライブバイダウンロード
Webサイトを閲覧しただけで、利用者が気づかない間にWebブラウザなどの脆弱性を突いて、マルウェアをダウンロードさせて感染させる攻撃
・セッションハイジャック、MITB、DNSキャッシュポイズニング、IPスプーフィング、クリプトジャッキング
・APT攻撃
特定の組織や企業に対して、長期に渡り継続的に行うサイバー攻撃
・ポートスキャン
サーバに対して接続できる通信サービス（ポート番号）を調べる行為
・ルートキット
サーバへの不正侵入が成功した後に、侵入の痕跡を隠蔽したり、継続的に遠隔地から再侵入できる裏口（バックドア）を設置したりするための攻撃ツール
・デジタルフォレンジクス
コンピュータ犯罪の証拠となる電子データを集め、解析すること
@testing-library/jest-dom v5 から v6 へのアップデートによる自動テストエラーの解決方法

# はじめに
Vitest と React Testing Library を利用した自動テストで @testing-library/jest-dom を v5 から v6 にアップデートしたら自動テストでエラーが発生したので、その解決方法を記載します。

# エラー内容
エラー内容は以下の通りです。
テスト設定ファイル（```setup.ts```）の6行目でエラーが発生していることがわかります。

```powershell
TypeError: Cannot convert undefined or null to object
 ❯ src/__tests__/setup.ts:6:8
      4| 
      5| // extends Vitest's expect method with methods from react-testing-libr…
      6| expect.extend(matchers);
       |        ^
      7| 
      8| // runs a cleanup after each test case (e.g. clearing jsdom)
```

# 解決方法
以下2点を実施することで解決できました。
1. ```expect.extend(matchers);``` の削除
1. ```import "@testing-library/jest-dom/vitest";``` の追加

```setup.ts
import "@testing-library/jest-dom/vitest";
import { cleanup } from "@testing-library/react";
import { afterEach } from "vitest";

// runs a cleanup after each test case (e.g. clearing jsdom)
afterEach(() => {
  cleanup();
});

```

# 参考
- [@testing-library/jest-domをv5からv6にしたらテストが全て落ちたので調査する](https://zenn.dev/hbsnow/scraps/1127a21f30395e)
RDS 延長サポートの料金

# 延長サポートとは
RDS にて使用するエンジンにおいて、定期的にバージョンが更新されていき、古いバージョンの標準サポートは使えなくなるため、バージョンアップを実施する必要があります。
ただ、企業等の要件によっては、古いバージョンを使い続けることが必要になることもあると思います。
そこで AWS は、延長サポート料金を追加で支払うことで、旧バージョンを使用できるようにしています。

[Amazon RDS での MySQL のバージョン](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/MySQL.Concepts.VersionMgmt.html#MySQL.Concepts.VersionMgmt.ReleaseCalendar)

|MySQL メジャーバージョン  |RDS 標準サポート終了日  |RDS 延長サポート開始 1 年目の価格設定日  |RDS 延長サポート開始 3 年目の価格設定日　|RDS 延長サポートの終了日　|
|---|---|---|---|---|
|MySQL 8.0 |2026 年7月6日  |2026 年 8 月 1 日  |2028 年 8 月 1 日　|2029 年 7 月 31 日　|
|MySQL 5.7  |2024 年 2 月 29 日  |2024 年 3 月 1 日  |2026 年 3 月 1 日　|2027 年 2 月 28 日　|


上記記載の公式ドキュメントにて、RDS for MySQL において 5.7 の標準サポートが 2024 年 2 月 29 日に終了し、2024 年 3 月 1 日より延長サポートが開始していることが表示されています。

その他エンジンにおいてもバージョンの標準サポート終了日を確認しつつ RDS を使用することが必要のようですね。

# 延長サポート料金について
本題である延長サポート料金について触れていきます。

[Amazon RDS for MySQL の料金](https://aws.amazon.com/jp/rds/mysql/pricing/)


AWS 公式の料金ページにてリージョンごとの延長サポート料金が確認可能です。
利用している RDS の使用しているリージョンによって単価が異なるため、環境に合わせて確認してみてください。
なお、東京リージョンでは単価は以下となっていました。

ーー
※2014年4月10日時点
アジアパシフィック (東京)	
1 年目と 2 年目の料金(vCPU 時間あたり)：0.120 USD
3 年目の料金(vCPU 時間あたり)：0.240 USD
ーー

延長サポート料金は (vCPU 時間あたり) となっています。
現在使用している RDS DB インスタンスのインスタンスタイプを調べると vCPU の値がわかりますので、まずはコンソール上にてインスタンスタイプを確認することが必要です。

インスタンスタイプが判明すると以下公式ドキュメントにて、 vCPU の値が参照可能です。
[Amazon RDS インスタンスタイプ](https://aws.amazon.com/jp/rds/instance-types/)

それでは、延長サポート料金 (vCPU 時間あたり) の試算をしてみます。
ーー
＜条件＞
・東京リージョン
・単価は 1 年目と 2 年目の料金
・db.t2.medium を使用
・1ヶ月 ＝ 31日

＜計算＞
0.120 USD（1 年目と 2 年目の料金単価）×　2 (db.t2.medium の vCPU) ×　24 (時間) ×　31 (1ヶ月)
＝ 178.56 USD
ーー

マルチAZでの利用の場合、両方のインスタンスへ延長サポート料金が発生するため、２台分の計算となりシングルAZで発生する料金の倍の金額が発生します。


# まとめ
今回は、RDS の延長サポートについて触れてみました。
改めて試算してみて、安くない金額が発生しますね...
料金発生を回避するため、バージョンアップも検討してみてください。

[Amazon RDS 延長サポートの使用](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/extended-support.html)
>RDS 延長サポートに対するこの追加料金は、RDS 標準サポート終了日を過ぎたメジャーバージョンを実行しているデータベースを削除するか、標準サポートの対象となるエンジンバージョンにアップグレードするとすぐに終了します。
【GoogleCloud】ストレージ移行大量課金を理解する

GoogleCloudのComputeEngineにてディスクにデータを配置していたのですがvast.aiとの連携のためにGoogleDriveに配置したいお気持ちになりました。その際に調べて実行した内容をまとめようとしてましたが作業中に1.5万オーバーのやらかしをしました。

https://x.com/eikichi838/status/1768779939375898987?s=46&t=UO6iuuW8bzamDCQYz2e4sw

Cloudに少し慣れたと勘違いし、楽天的に作業をしていたのが悪い。
噛み砕けてない部分もありますがまとめて同じ轍を踏まないようにしたいと思います。

## やったこと

Compute Engineのディスクに約500GBのデータが存在。データをGoogleDriveに移すためにディスク>スナップショット>カスタムイメージへ変換をコンソールで実行しました（以下図の③・④の流れ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/1cf76aa3-0dc4-8fa5-63e7-37bbcb67a07a.png)
参考: https://cloud.google.com/compute/docs/images/export-image?hl=ja#gcloud

カスタムイメージをCloud Storageのバケットに移動するにはCloud Buildが使用されるそうです。
Cloud Buildの使用はリージョンで制限があるとのことで、利用できるリージョンにバケットを作成(今回はasia-east1)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/8a065b15-8842-2d9a-05cd-1739bfe744dd.png)
参考: https://cloud.google.com/build/docs/locations?hl=ja

あとはCloud Shellにて以下のコマンドを実行。上記の全体の作業の合間で1.5万が飛んでいきました。

```bash
gcloud compute images export \
    --destination-uri gs://my-bucket/my-image.tar.gz \
    --image my-image \
    --project my-project
```

## 何が起こったのか
レポートから内訳を確認すると以下３つのSKUが原因。SKU IDから料金を探ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/bc0ad64f-aada-6798-2517-516a01f69480.png)

### PD snapshot Data Transfer Out within Asia
スナップショットを外に出す時にかかるコスト。2023年4月1日から新しい料金とのことで800%の値上げ。結構すげえですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/e4fce833-93ba-ffc9-2228-a4cc9150d10d.png)
参考: https://cloud.google.com/compute/pricing-announce?hl=ja

### Multi-regional Snapshot upload/download within Asia
マルチリージョンへのアップロードとダウンロードでかかるコスト。各々価格も同じなので請求費用とも整合が取れてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/1fa358f0-13f1-beaf-6a30-147ca2a7f762.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3605750/ecb3101b-d154-125c-d54b-d019a244277c.png)

上記から推察。スナップショットとイメージはアジアのマルチリージョンに存在していました。
流れとしては
ディスク ①> スナップショット ② > イメージ  ③> バケット
の矢印３つ。①でお金がかかることは考えにくいので

Multi-regional Snapshot upload within Asia: ②
Multi-regional Snapshot download within Asia: ②
PD snapshot Data Transfer Out within Asia: ③

となってしまったんだろうなと考えています。これが本当なら②で２つもお金がかかるのは罠な気がする。私の場合は罠以前の問題ですが

## 腑に落ちてないこと
上記の認識が正しいとの仮定だと、イメージを出力しているつもりなところでも全て’スナップショット’に対する料金発生なのでここが腑に落ちてない。どなたかアドバイスありましたらいただけると幸いです。

## 参考文献
[Cloud Storage へのカスタム イメージのエクスポート  \|  Compute Engine ドキュメント  \|  Google Cloud](https://cloud.google.com/compute/docs/images/export-image?hl=ja&cloudshell=false#gcloud)
[gcloud compute images export  \|  Google Cloud CLI Documentation](https://cloud.google.com/sdk/gcloud/reference/compute/images/export)
[Cloud 永続ディスクのスナップショットの料金  \|  Compute Engine ドキュメント  \|  Google Cloud](https://cloud.google.com/compute/pricing-announce?hl=ja)
bat2

@echo off
rem ①ヘッダー行含めて一行ずつ新しいcsvファイルに書き出す。
set csv_file=test.csv

rem CSVファイルの存在有無を確認
if not exist %csv_file% (
    echo CSVファイルが存在しないため、処理を終了します。
    pause
    exit
) 

rem ①ヘッダー行含めて一行ずつ新しいcsvファイルに書き出す。
rem ヘッダー行を取得してheader.csvに代入
for /f "delims=" %%i in (%csv_file%) do (
  set header=%%i
  echo %%i > header.csv
  goto :jump
)
:jump
    echo %header%

rem　2行目以降をCSV出力する
setlocal enabledelayedexpansion
set /a cnt=1
for /f "skip=1 delims=" %%i in (!csv_file!) do (
  echo !header! > ./output/!cnt!.csv
  echo %%i >> ./output/!cnt!.csv
  set /a cnt+=1
)

rem ②書き出したcsvファイル名を各ファイルの中身に応じて書き換える。
for %%f in (./output/*.csv) do (
    setlocal enabledelayedexpansion
    for /F "skip=1 delims=, tokens=1,3" %%a in (./output/%%f) do (
        set file_name=%%a_%%b
        call :Trim !file_name!
        move output\%%f output\!file_name!.csv
    )
    endlocal
)
exit

:Trim 
    set file_name=%*
業務で使えそうなsnowflake機能集 備忘録

## タスク
特定のタイミングで事前に定義したクエリを定期的に実行可能
https://dev.classmethod.jp/articles/snowflake-copy-task/

## 先行タスク
先行したタスクが完了次第、次のタスクをトリガーできる。
現状タスクはCRONで時間指定をして実行している。親子関係があるタスクは子を一日遅らせたり、1時間遅らすことで対応している。この機能を使えば、親子関係が綺麗に整理できるかも。親がエラー発生した時の子の挙動は要調査。実装を検討しているタスクに対する整合性チェック機能はとりあえず親だけでも入れると安定するかも。
参考 : https://zenn.dev/daisuke_harato/articles/014d7e9b7be7b4
https://dev.classmethod.jp/articles/snowflake-execute-task-command/


## クラスタリング・マイクロパーティショニング
snowflakeではデータを小さい塊(マイクロパーティション)に分割し、保持している。そのメタ情報(最大・最小の日付とかイベント名)を中央管理し辞書的に使用することで、クエリ実行時に探索する範囲を絞っている(プルーニング)。それをさらにクラスタリングキーでデータを根本から再編成することで探索する範囲を絞ることができる(データをキーで整理整頓するイメージ)。
参考 : https://zenn.dev/ryotas_data/articles/a709dadb4717d4


## タイムトラベル
間違えてデータを削除してしまった場合や、UPDATEした場合にやり直せる。
過去のテーブルの状態を指定し、それを現在のテーブルにINSERTすることでやり直せる。
時間指定の方法とクエリIDを指定する方法がある。
```sql
insert overwrite into ${database_name}.${schema_name}.{table_name}
select * from ${database_name}.${schema_name}.{table_name} 
before (statement => '${QUERY_ID}');
```
参考 : https://zenn.dev/mnagaa/articles/2b1f3c5e07befa
      https://blog.truestar.co.jp/snowflake/20221128/52105/
Centos5でPukiwikiを建てる。

# はじめに
とりあえずCentos5で何か作りたかっただけ。
せっかくなのでインターネット老人会でなつかしさに浸ろうかなと思った。

# 前提
iptables,selinux,yum設定済みのCentos5サーバが作ってある前提。

# 必要パッケージインストール
pukiwikiはもちろんapache上で動く。
そしてphpで動くためモジュールも一緒にインストールしておく。
(Centos5のapacheはphpモジュールが標準装備されていない)

```ruby:yumインストール
yum install httpd mod_php wget
```

# apache起動
一旦インストールしたapacheを起動しておく。
```ruby:apache起動
service httpd start
```

# pukiwikiダウンロード
以下のコマンドでpukiwikiをダウンロードしておく。
置く場所は一旦きにしないほうがわかりやすい。

```ruby:pukiwikiダウンロード
wget http://jaist.dl.sourceforge.jp/pukiwiki/12957/pukiwiki-1.4.7_notb_utf8.tar.gz
```

# pukiwiki展開
ダウンロードしたpukiwikiを展開しておく。

```ruby:pukiwiki展開
tar zxvf pukiwiki-1.4.7_notb_utf8.tar.gz
```

# pukiwikiのコピーとオーナー設定

```ruby:pukiwikiのコピーとオーナー設定
cp -pR pukiwiki-1.4.7_notb_utf8 /var/www/pukiwiki
chown -R apache.apache /var/www/pukiwiki
```

# pukiwiki.ini.php編集
URLの設定必要なのでpukiwiki.ini.phpを編集する。
接続しているサーバのIPアドレスを入力する必要があるので注意。
(場所は/scriptで探すといいかも)

```ruby:pukiwiki.ini.php編集
vi /var/www/pukiwiki/pukiwiki.ini.php
//$script = 'http://example.com/pukiwiki/';
　　↓に変える
$script = 'http://[サーバのIPアドレス]/pukiwiki/';
```

# apache側設定
pukiwikiのapache側で見られるように設定する。
初期状態で/etc/httpd/conf.d/pukiwiki.confはないので新規作成となる。

```ruby:apache側設定
vi /etc/httpd/conf.d/pukiwiki.conf
Alias /pukiwiki /var/www/pukiwiki
```

# apache再起動
htmlファイルと違い設定の反映に再起動が必要となる。
apacheを再起動する。

```ruby:apache再起動
service httpd restart
```

# 画面確認
なんでもいいのでブラウザに「http://[サーバのIPアドレス]/pukiwiki/」といれて画面がでればOK
せっかくなのでページいくつかつくって遊んでみよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1092362/1d02ac60-27c9-a87f-2971-2a53c397f0ac.png)

# あとがき
むしゃくしゃしてやった。
いまは反省している。
なにか作ろうとおもってググっていたが記事自体が少なくなっていて驚いた。
いつかはCentos5自体入手方法がなくなるのだろうがいつになるだろうか。
なんだかんだ残るような気もするし。
残らない気もしている。
Qiita の功罪と正しい使い方 〜信じていいのか？

ある人が言っていました。

Qiita は読む場所ではない。
書く場所である。

Qiita はSNSである。
エンジニアが好きに書いて、たいていは読まれずに埋もれる。
バズれば見られるが、そのうち忘れられる。

悪口ではない。
Qiita が賑わっているのは、記事の質より「とにかくアウトプットすること」に重きを置いてユーザー数を伸ばしてきたからだ。

検閲なしに発表できるのは素晴らしいことである。
間違っていたら誰かが補正すればいい。
科学だってそうやって信頼性を獲得してきた。
萎縮したら権威をなぞるものしか出てこない。

困るのは、記事が多すぎて補正機能が十分に働かないことである。
Qiita の記事は検索エンジンの結果に出やすい。
だが、正確な情報が欲しいとき、検索結果に Qiita の記事が現れてもあまり期待は膨らまない。
信頼性のばらつきがあまりにも大きいからである。
もっと言うと、信用できる記事、そこにしかない情報の割合が少ないからである。

貴重な情報ももちろんある。
公式よりわかりやすい解説も多い。
エンジニアたちの頑張りは励みにもなる。
運営も一緒になって盛り上げている感がある。
いいコミュニティだ。
ただ、信頼性は「いいね」の数で担保されていない。
そこが Stack Overflow と違うところである。

エンジニアとして正しいスキルを身につけたいなら、Qiita で書くのはいい。
でも、見てはいけない。

とまでは言わない。
いちエンジニアがそう言っているにすぎない、というフィルターを通して読むのが Qiita の正しい利用法だ。
活動的な先輩の見解くらいに捉えるのがちょうどいいだろう。
たとえ界隈で名の通った人の記事であっても。

書くハードルが低い分、読むハードルは高くなる。
書いてある内容が正しいか、判断しながら読む必要がある。
あるいは、半信半疑にとっかかりを掴むつもりで目を通す。

公式サイトに原語で書いてあることは、ほぼ100%正しい。
プログラミングの情報としてこの差は大きい。

誰でも気軽に書ける。
ということは、間違った、偏った、根拠の薄い内容が書いてある可能性も多分にある。
この単純な帰結を認識しよう。

…とのことです。
この記事もですね。
【超わかる！】100MB以上のファイルをGithubにPushする方法

# GitHub Desktopで100MB超えてしまった！！
### 状況
Unityで開発中、アセット追加後、Gitに上げようとしたら
下記のように表示されて上げられなくなってしまった！！！！！

####  Files too large

The following files are over 100MB. If you commit these files, you will no longer be able to push this repository to GitHub.com.

`Assets\Editor\364\Bakery\cudnn64_7.d11` 


We recommend you avoid committing these files or use Git LFS to store large files on GitHub.

# 実行環境
開発: Unity 2022.3.22f1
ツール: Github Desktop、Git LFS

# 結論。Git LFSを使って仮想的に実現させる。
様々な容量の大きいデータでも応用できます。
黒い壁に呪文入力するのが苦手な人にもオススメ！！！！！！(俺)

### 仕組み 【従来】

Git hub <100MB超えてるから受け取れないよ！！
↑
↑ 100MB File
↑
Client < 送るよ～
## アップロード時【Git LFS】
Git hub < 軽いから受け取れる！！(データそのものは持っていないが存在自体は在る)
↑
↑ 存在を証明するバイナリファイルを送る
↑
Git LFS < 預かるよ！！【バイナリファイルに変換】
↑
↑ 100MB File
↑
Client < 送るよ～

## データ受け取り時【Git LFS】
Git hub
↓
↓ 
↓
他Client <普段のデータは受け取れるけど、例のファイルは受け取れない！
Git Hubには存在しているのに、直でRawでダウンロードしても壊れてる！

## ご安心ください。
プロジェクトのgit内でコマンドを入力すると...

Git LFS < 【預かっている全ての大きなデータを渡すよ！】
↓
↓
↓
他Client < `git lfs pull`、`git lfs checkout`

...といった感じです。

# なのでイメージとしては ↓

　【Git hub】　　　　【Git LFS】
 　　　↑　　　　　　　　　↑ 
普段通り使える　　　デカいデータだけ受け取り、必要な時だけにデータを落とす。
　　　　　　　　↑
　　　　　　　　↑
　　　　　　　　↑
　　　　　　【Client】< Upload !
      
# まずインストールする。
Git LFS ↓

https://git-lfs.com/

# Githubで.gitattributesを編集

```.gitattributes
データが重いファイル.拡張子 filter=lfs diff=lfs merge=lfs -text
```

# いつも通りPushするだけ！
簡単すぎる。インストールして書くだけ。 俺何年悩んでたんだ。

# Git LFSのデータを落とす時
プロジェクトのエクスプローラーで右クリック➡「Git Bash Here」
下記のコマンドをひとつずつ実行。

```git lfs pull```
```git lfs checkout```

これだけです。

(Git Bashは処理中、固まるので気長に待ちましょう。入力が出来る状態はコマンドを打ち込む前の色のついたユーザー名が表示されている時です。これが表示されてから次のコマンドを実行しましょう。)

# 例: 冒頭紹介した状況の場合

The following files are over 100MB. If you commit these files, you will no longer be able to push this repository to GitHub.com.

`Assets\Editor\364\Bakery\cudnn64_7.d11` ※1


We recommend you avoid committing these files or use Git LFS to store large files on GitHub.

```.gitattributes
Assets/Editor/x64/Bakery/cudnn64_7.dll filter=lfs diff=lfs merge=lfs -text
```
※1 の部分を.gitattributesに書き込む。

# 気を付けること
パス入力は`\`ではなく`/`です。
ファイルのパス取得では`\`だったのでここで僕は躓きました...；；
拡張子もちゃんとつけてね！

編集をするファイルは.gitignore(ギット イグノア)じゃないよ！！
.gitattributes(ギット アトリビュート)の方だよ！！


# あとがき
SNSとかフォローしてくれたら記事いっぱい書きます。おねがいします；；

https://twitter.com/Arg0rithm_Ace

# Log
2024/0411 投稿
2024/0412 修正

# 参考様
コマンド: https://qiita.com/MasaKoha/items/96d11730d06695470944
コマンド: https://qiita.com/takish/items/4b397caa5549a39a8194
ファイル設定: https://qiita.com/Sase/items/885f42bb13f8a4cc75d1
Minecraft Fabric APIの備忘録


Mod作成を始めたばかりなので
まだまだ知識は得ていない

記事を書いた理由は "クリエイティブタブのグループ作成" で物凄く沼ったから。

今後いろいろと作るうえで覚えたことを追記する予定



## 開発環境
- minecraft - 1.20.4
- fabric - 0.96.11+1.20.4
- VSCode
- Java (Kotlinは理解不足なので使わない)

バージョン等は今後変わる可能性あり

## プロジェクトの作成

- [テンプレートの作成](https://fabricmc.net/develop/template/ "fabricmc template")
- grableの読み込みが終わった後コンソールで
    `gradlew vscode` の実行

gitからzipでダウンロードする方だとクラス名やディレクトリ構成の変更が面倒だったので、上記テンプレートからダウンロードする方が楽

## アイテムの追加
```java:ModName.java
public static final Item CUSTOM_ITEM = Registry.register(
    Registries.ITEM,
	new Identifier("mod-id", "item-id"),
    new Item(new FabricItemSettings()) // コマンドでしか取り出せない
    // new Item.Settings().group(ItemGroup.MISC) で既存グループへ登録
);
```
```json:item-id.json
{
  "parent": "item/generated",
  "textures": {
    "layer0": "mod-id:item/item-id"
  }
}
```
アイテム表示名
```json:ja_jp.json
{
    "item.mod-id.item-id": "カスタムアイテム"
}
```
```console:階層
main/java/[package-name]/
    ModName.java
    resources/assets/[mod-id]
        models/item/item-id.json
        textures/item/item-id.png
        lang/ja_jp.json
             en_us.json
```
package-nameまでの階層は各自変わる可能性がある

アイテムを使ったりするにはアイテムクラスを継承して登録するみたいだが
まだ試していない

## クリエイティブタブのグループ作成
```java:ModName.java
// グループの追加
private static final ItemGroup CUSTOM_GROUP = FabricItemGroup.builder()
    .icon(() -> new ItemStack(
        // アイコンにしたいアイテムを指定
        CUSTOM_ITEM
    ))
    .displayName(Text.translatable("タブの表示名"))
    .entries((context, entries) -> {
        // グループに登録したいアイテムを書く
        entries.add(CUSTOM_ITEM);
    })
    .build();

// ~~~~~~~~~~~~~~~~~~~
@Override
public void onInitialize() {
    // グループを登録
    Registry.register(
        Registries.ITEM_GROUP,
        // "main_group"の部分の説明は見たことがないので不明。適当に名前を付けているが動く
        new Identifier("mod-id", "main_group"),
        CUSTOM_GROUP
    );
}
```
`build();`を実行しない方法をjp wikiで見た気がするが、古いバージョンだったはずなので動くかどうかは検証していない。
バージョンの違うコードはエラー地獄になること必然なので試したくない
【Raspberry Pi 5】GPIOをDockerコンテナから制御する方法

## はじめに

GPIOをPythonで操作する時によく使われていたRPi.GPIOがRaspberryPi5から使えなくなりました。
その代わりにgpiozeroを使用するように公式からアナウンスされています。
ネイティブ環境から操作することは容易ですが、それらをDockerコンテナで一から構築する方法が無かったのでこちらに示します。

ソースコードは[こちら](https://github.com/souri-t/GPIO-Docker)。

https://github.com/souri-t/GPIO-Docker

## 全体構成

```
app
|-- code
|   `-- sample.py
|-- docker-compose.yml
`-- Dockerfile
```

### Dockerイメージ

```docker-compose.yml
version: '3.3'
services:
    gpio:
        build: .
        tty: true
        privileged: true
        volumes:
            - ./code:/code
        command: bash
```

gpiozeroの他に依存ライブラリとしてlgpio、pigpio、gpioが必要です。

```Dockerfile
FROM python:3.11-slim

RUN apt update -y && apt upgrade -y

# GPIO
RUN pip install lgpio pigpio gpio gpiozero

```

## スクリプト

LEDを接続したGPIO25ピンに接点出力するサンプルです。

```
from gpiozero import LED
from time import sleep

led = LED(25)

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)
```


## 起動方法

サンプルスクリプトはこれで動きます。

```
$ docker-compose up -d
$ docker-compose exec gpio python3.11 code/sample.py
```
言語処理学会2024論文紹介/大規模言語モデルによる少数かつ短文の文書に対するトピックモデリング

【一言で言うと】
少数かつ短文の文書集合に対するトピックモデリングにおいて、大規模言語モデル（GPT-3.5, GPT-4）は、既存のトピックモデルよりも優れた性能を発揮し、実用上の懸念点（例えばhallucination）は無視できる程度であることを示した

【タイトル/URL】
大規模言語モデルによる少数かつ短文の文書に対するトピックモデリング
https://www.anlp.jp/proceedings/annual_meeting/2024/pdf_dir/A5-3.pdf

【まとめ】
・トピックの品質評価に標準的な指標（Coherence, Diversity）だけでなく、新しい指標（Document Coverage, Factuality）を導入している
・GPT-3.5とGPT-4は既存のトピックモデルに比べて高品質なトピックを出力でき、出力安定性についても実用的に十分である

【感想】
トピックモデリングは医療カウンセリングでも有用と感じた。クライエント都の対話文からトピックを抽出するには長文の文章集合が必要か。

【画像】
![スクリーンショット 2024-04-11 2.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2106750/70637185-dc08-f7d9-7c31-b6064f67b836.png)
Pythonで「ファイルの作成と削除(pathlibモジュール)」の動作を確認してみた

# 概要

Pythonで「ファイルの作成と削除(pathlibモジュール)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/file/index10.html

# 実装
以下のファイルを作成しました。
```sample1.py
import pathlib
p = pathlib.Path('./test/client.txt')
p.touch()
```
```sample2.py
import pathlib
p = pathlib.Path('./test/client.txt')
p.unlink()
```

以下のコマンドを実行しました。
```
$ mkdir test
$ python3 sample1.py 
$ ls test
client.txt
$ python3 sample2.py 
$ ls test
```

# まとめ

何かの役に立てばと。
React×Railsの連携におけるPromiseベースのHTTPクライアント"Axios"使用法

:::note info
未経験エンジニアの備忘録です。
間違えている箇所がありましたらご教示頂けると幸いです。
:::

### Axiosとは
Axiosは、node.jsを使用してHTTPリクエストを行うHTTPクライアントになります。
PromiseAPIもサポートしており非同期処理でサーバーサイドからデータを受け取る際に有用です。
#### データやり取りの順序
①クライアントにてXMLHttpRequestを作成
②node.jsにてHTTPリクエストを行う
③Rails側からデータを受け取る

###  主な実装方法(Rails側ではgem"Rack-CORS"を使用してCORSを許可しておくこと)
##### ex)POSTモデル一覧(postsテーブルからpostscontrollerのindex)を取得したい場合
①axiosのインスタンスを作成(インスタンスメソッドが使用可能になります)
```client.js
import applyCaseMiddleware from 'axios-case-converter';
import axios from 'axios';

const client = applyCaseMiddleware(
  axios.create({
    baseURL: 'http://localhost:3000', //Rails側のlocalURL
  })
);
```
②axiosのgetインスタンスメソッドを用いてhttp://localhost:3000/postsのデータを取得
```post.js
import client from './client';

export const getList = () => {
  return client.get('/posts');  //Rails側のroute.rbのルーティング
};
```
③取得したデータを基にList.jsxにhtmlのひな型を記載
今回はuseEffectの依存配列を空にすることでhandleGetListが実行されpost.jsのデータを取得、初回のみレンダリングされます。
```List.jsx
import React, {useEffect, useState} from 'react';
import { getList } from '../lib/api/post';

const List = () => {
  const [dataList, setDataList] = useState([]);

  useEffect(() => {
    handleGetList();
  }, [])

  const handleGetList = async () => {
    try {
      const res = await getList();
      setDataList(res.data)
      } catch (e) {
      console.log(e);
      };
    }

  return (
    <>
    <h1>投稿リスト。</h1>
    <table border='7' cellspacing='5' cellpadding='3' width='500'>
      <tr>
        <th>ID</th>
        <th>タイトル</th>
        <th>内容</th>
      </tr>
      {
        dataList.map((data, index) => (
          <tr key={index}>
            <td>{data.id}</td>
            <td>{data.title}</td>
            <td>{data.content}</td>
          </tr>
        ))
      } 
      </table>
    </>
  );
};
```
簡単な流れは以上になります。axiosのインスタンスメソッドにはもちろんget,post,patch,delete以外にも様々なメソッドがありますので、まだまだ自分も把握できていませんが気になる方はぜひ使ってみてください。
Swift UI入門手順

:::note alert
大学の研究室内の Wikiに書いた文章をそのまま持ってきてます。
すごく内容が薄いのでガチの初心者の人はもっと高品質な記事を参照してください。
:::



# はじめに
Swiftでアプリ作ってみてー
けど何やればいいんかわかんねーって人向けに参考になりそうな書籍や情報を置いとくわ。

# 注意点
- 環境構築の方法等はここでは記載しません。（ググればたくさん情報が出てくるので）
- 俺の偏った思想が混じってます


# 初学者向け
Mac持ってるから早速アプリを作りたい。。。。。が何から始めたらいいんやって人は
以下の本がおすすめ
![image.png](/attachment/65b3dbc42fb04eea4edc991a)




https://www.amazon.co.jp/SwiftUI%E5%AF%BE%E5%BF%9C-%E3%81%9F%E3%81%A3%E3%81%9F2%E6%97%A5%E3%81%A7%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E3%81%A7%E3%81%8D%E3%82%8B-iPhone%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA%E9%9B%86%E4%B8%AD%E8%AC%9B%E5%BA%A7-Xcode15-Swift5-9-ebook/dp/B0CLXV1YBG/ref=sr_1_5?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=2HMSM2JZFMKEN&keywords=Swift&qid=1706237979&sprefix=swift%2Caps%2C234&sr=8-5

初心者向けの本といえばこれ。一部解説が難しかったりするけど、とりま理解は後回しにしてなぞり打ちでもいいからこれでアプリを作ってみよう。
SwiftUIの感じが理解できるはず


![image.png](/attachment/65b3dc232fb04eea4edc99b0)
https://www.amazon.co.jp/詳細！SwiftUI-iPhoneアプリ開発-入門ノート-iOS-Xcode-14対応-ebook/dp/B0BLHC8JFT/ref=sr_1_7?__mk_ja_JP=カタカナ&crid=2HMSM2JZFMKEN&keywords=Swift&qid=1706237979&sprefix=swift%2Caps%2C234&sr=8-7
同じく初心者向けの教材。これもわかりやすいからおすすめかも。


# アプリ作るノリがわかってきたら
ノリとカンでアプリが作れるようになってきたら、Swiftの言語仕様を理解するのがいいかも。
細かくSwiftの言語仕様を書いてくれてる本はコレ。
実際に現場のエンジニアの方も使ってる。
内容は難しくて理解できずにムカつくが、ゆっくりと理解していけばおｋ

![image.png](/attachment/65b3dc412fb04eea4edc9a5e)
https://www.amazon.co.jp/増補改訂第3版-Swift実践入門-直感的な文法と安全性を兼ね備えた言語-PRESS-plusシリーズ/dp/4297112132/ref=sr_1_8?__mk_ja_JP=カタカナ&crid=2HMSM2JZFMKEN&keywords=Swift&qid=1706237979&sprefix=swift%2Caps%2C234&sr=8-8

# 番外編（参考になるサイト）
https://developer.apple.com/tutorials/app-dev-training
Apple公式が出しているチュートリアル
英語で抵抗感があるが、翻訳機能使えばOK
実際にアプリ作っているノリが分かるはず。

https://qiita.com/takoikatakotako/items/7e5fbdf6ab7749b6865d
SwiftUIの関連知識を１００個まとめた記事。
これを使いこなせたら大抵のアプリは作れるはず。
ONLYOFFICE公式コネクターの最新バージョンリリース！機能アップデートを詳しく解説

今回の記事では、先月からリリースされた4つの公式コネクタをご紹介いたします。ぜひご覧ください！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/df157de1-ac9e-f828-5ed8-d4b5184e5ad8.png)

## Confluence用コネクタ

Confluence用のONLYOFFICE公式連携アプリをバージョン5.0.0にアップデートしました。アップデートされたコネクターでは、PDFフォームへの入力やPDFファイルへの注釈、JWTヘッダーの設定、エディタでのアバターによる他のユーザーの認識ができるようになりました。このリリースの詳細については、この投稿をお読みください。

https://www.onlyoffice.com/blog/ja/2024/03/onlyoffice-connector-v5-0-0-for-confluence?utm_source=qiita&utm_medium=article+&utm_id=connectors

## WordPress用コネクタ

ONLYOFFICEの最新の連携アプリを使用することで、ONLYOFFICE DocSpaceをWordPressプラットフォームと簡単に接続することができ、訪問者がダウンロードすることなくオフィスファイルを閲覧できるように、ドキュメントやルーム全体をウェブサイトに埋め込むことが可能になります。詳細はこちらの記事をご覧ください。

https://www.onlyoffice.com/blog/ja/2024/03/onlyoffice-docspace-connector-for-wordpress?utm_source=qiita&utm_medium=article+&utm_id=connectors

## Nextcloud用コネクタ

Nextcloud用ONLYOFFICE連携アプリの最新バージョン9.1がリリースされました。高度なアクセス権、ドキュメント編集を効率化する新しいオプション、その他のアップデートなど、新機能と改善が満載されており、チームコラボレーション体験の向上をお約束します。新機能を以下の記事でご紹介します。

https://www.onlyoffice.com/blog/ja/2024/04/onlyoffice-nextcloud-connector-v-9-1?utm_source=qiita&utm_medium=article+&utm_id=connectors

## ownCloud用コネクタ

ownCloudの公式連携アプリがバージョン9.1.1にアップデートされました。このリリースでは、PDFフォームの作成と記入、PDFファイルの注釈、アバターによる他の共同作業者の認識などができるようになりました。新機能と改善点の詳細については、この記事をお読みください。

https://www.onlyoffice.com/blog/ja/2024/04/onlyoffice-connector-v9-1-1-for-owncloud?utm_source=qiita&utm_medium=article+&utm_id=connectors

## まとめ

この記事では、ONLYOFFICE公式連携アプリの新バージョンをご紹介しました。皆さまがお使いのプラットフォームがあれば、ぜひお試しください！
CORSとは-Flaskで実装してみた

## はじめに

初投稿です！CORSを理解したいと思い調べていくうちに記事にしたいと思った次第です。初学者向けに書いた記事になります。

### 同一オリジンについて
CORSの理解を深めるために同一オリジンについて意味を確認しましょう。
・オリジンとは
スキーム（httpsなどのプロトコル）、ホスト（ドメイン）、ポート番号のことです。

ある二つのページのオリジンが等しければ、両者のオリジンは等しいです。これは、セキュリティ上安全性を高めるための方法であり、同一オリジンポリシーと呼ばれます。反対に異なるオリジンであることをクロスオリジンといいます。あるページを見ているときに、そのぺージのリソースとオリジンが同じ場合は同一オリジン、見ているページと対象のリソースが異なる場合はクロスオリジンということになります。具体的な例では、あるページから他のAPIにアクセスする場合が挙げられます。

実際にFlaskでサンプルを作ってみましょう。
```python:run.py
from app import app

if __name__ == "__main__":
    app.run()
```
```python:app.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def helloWorld():
  return "Hello, Closed World!"
```
`python run.py`で実行すると、ローカルサーバーが立ち上がり「Hello, Closed World!」と表示されると思います。続いて、次のようなhtmlファイルを作成してみましょう。
```html:malicious.html
<!DOCTYPE html>
<html>

<head>
  <title>CORS Test</title>
</head>

<body>
  <button id="fetchButton">Fetch Data</button>
  <script>
    document.getElementById('fetchButton').addEventListener('click', fetchData);

    function fetchData() {
      fetch('FlaskアプリのURLを指定') // ローカルホストの場合http://localhost:5000/
        .then(response => response.text())
        .then(data => console.log(data))
        .catch(error => console.error('Error:', error));
    }
  </script>
</body>

</html>
```
fetchする対象（リソース）とローカルホストで実行したファイルが一致していますが、malicious.htmlのドメインはflaskアプリのURLとは異なっています。これがクロスオリジンです。ローカルホストが実行しているときに、htmlファイルを開きfetchボタンを押すと、ローカルホストの方でステータスが200となっていることからリクエストが成功していることが分かります。

今度は、flask_corsを利用して、アクセス制限をかけてみましょう。
`from flask_cors import CORS`
`cors = CORS(app, resources={r'/': {'origins': 'http://127.0.0.1:5000'}})`
上記2行app.pyに追加します。

①先ほど作ったmalicious.htmlをflaskアプリの別のディレクトリに移動するなどしてディレクトリを分けましょう。
②ターミナルで移動したディレクトリを開き、
`python -m http.server 5001`と入力し、別のポートのローカルサーバーを立ち上げます。
③立ち上げたローカルホスト(5001)+malicious.htmlを開きます。
④fetchをクリック
すると、何もflask側のターミナルの方には表示されないはずです。
検証ツールを使って、htmlのコンソールを見てみましょう。
すると、
'malicious.html' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
というエラーが出ていると思います。CORSによってflaskアプリへのアクセスが制限されていることが確認できました。

flaskでCORSを実装する方法について簡単にご紹介させていただきました。
もし誤り等ございましたらコメントいただけると幸いです。

参考資料
https://developer.mozilla.org/ja/docs/Web/Security/Same-origin_policy（同一オリジンポリシー）
https://www.youtube.com/watch?v=7wmqbg1W8u0（コードマフィアさんのCORS説明）
https://flask-cors.readthedocs.io/en/latest/（Flask_Cors）
Googleスライド: 他の人は編集できない状態のままコメントをもらいたい

# 手順1
右上の「共有」を選択

![スクリーンショット 2024-04-10 23.45.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/e5344a89-35fd-0d2f-a81f-ee8116ef7b94.png)

# 手順2
「制限つき」　を選択

![スクリーンショット 2024-04-10 23.46.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/64df7aa6-010d-ba3a-1279-a945185c50ec.png)

# 手順3
「リンクを知っている全員」を選択

![スクリーンショット 2024-04-10 23.48.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/264dc7d1-31ff-4fea-885c-ceb4684c39ff.png)

# 手順4
下画像のような画面になるので「閲覧者」を選択

![スクリーンショット 2024-04-10 23.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/817d97e8-6112-39ea-c9a9-872188a278e1.png)

# 手順5
他の人にコメントをもらいたい (でも， 編集されたくはない) 場合は，　「閲覧者 (コメント可)」を選択

![スクリーンショット 2024-04-10 23.49.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/cdcbc9ac-4f76-983f-8b3a-a4c3efeaa7dc.png)

# 手順6
「完了」を押せば， 設定終了です。
なお， 「リンクをコピー」を押しておけば， ペースト (Windows: ctrl + v; Mac: ⌘ + v) でスライドのリンクを共有できます

![スクリーンショット 2024-04-10 23.52.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3046635/5d6358f0-a02d-5cf4-bc79-bbf18e2ec524.png)
シェルフ登録

シェルフ作成mel
```
{ // global化対策
    // ボタン作成Proc
    proc createShelfButton(string $labelName, string $image, string $command, string $doubleClickCommand, string $labelList[]){
        if(!stringArrayContains($labelName, $labelList)){
            shelfButton
                -label $labelName
                -annotation $labelName
                -image $image
                -command $command
                -doubleClickCommand $doubleClickCommand
                ;
        }
    }
    
    string $newShelfName = "Kohaku_DagMenu";
    if(!`shelfLayout -exists $newShelfName`){
        addNewShelfTab $newShelfName;
    }
    string $shelfButtonName[] = `shelfLayout -q -childArray $newShelfName`;
    string $labelList[], $labelName, $command;
    for($name in $shelfButtonName){
        $labelName = `shelfButton -q -label $name`;
        appendStringArray($labelList, {$labelName}, 1);
    }
    
    setParent $newShelfName;
    
    $labelName = uiRes("m_commonSelectOptionsPopup.kClearSelect");
    createShelfButton($labelName, $image = "commandButton.png", $command = "select -clear", $doubleClickCommand = "", $labelList);
    
    $labelName = uiRes("m_defaultRunTimeCommands.kDeselectLbl");
    createShelfButton($labelName, $image = "commandButton.png", $command = "SelectNone;", $doubleClickCommand = "", $labelList);
    
    $labelName = uiRes("m_defaultRunTimeCommands.kEnableSelectToolLbl");
    createShelfButton($labelName, $image = "aselect.png", $command = "SelectTool", $doubleClickCommand = "SelectTool; ToolSettingsWindow", $labelList);
    
    $labelName = uiRes("m_createModelPanelMenu.kFrameSelectionWithoutChildren");
    createShelfButton($labelName, $image = "commandButton.png", $command = "fitPanel -selectedNoChildren", $doubleClickCommand = "", $labelList);

    $labelName = uiRes("s_TtumbleContextStrings.rTumbleToolName");
    createShelfButton($labelName, $image = "tumble.png", $command = "TumbleTool", $doubleClickCommand = "TumbleTool; ToolSettingsWindow", $labelList);

    $labelName = uiRes("s_TtrackContextStrings.rTrackToolName");
    createShelfButton($labelName, $image = "track.png", $command = "TrackTool", $doubleClickCommand = "TrackTool; ToolSettingsWindow", $labelList);
    
    $labelName = uiRes("m_defaultRunTimeCommands.kMoveToolLbl");
    createShelfButton($labelName, $image = "move_M.png", $command = "MoveTool", $doubleClickCommand = "MoveToolOptions", $labelList);

    $labelName = uiRes("m_createModelPanelMenu.kIsolateSelect");
    $command
        = "// Kohaku_dagMenuCheckBoxFlg:Start\n"
        + "proc int isolateSelectFlg(){\n"
        + "    string $currentView = `getPanel -withFocus`;\n"
        + "    return `isolateSelect -q -state $currentView`;\n"
        + "}\n"
        + "isolateSelectFlg;\n"
        + "// Kohaku_dagMenuCheckBoxFlg:End\n"
        + "ToggleIsolateSelect;"
        ;

    createShelfButton($labelName, $image = "commandButton.png", $command, $doubleClickCommand = "", $labelList);
}
```
プレイヤーキャラクターのみを非表示にして手に持っている武器のみ表示させる方法

# キャラクターを非表示にして武器のみ表示する方法

## キャラクターのMeshの「Visibility Based Anim Tick OptionをAlways Tick Pose and Refresh Bones」に変更
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/879b4ee0-73da-4b24-921e-575009ad995b.png)



## PlayerControllerを継承したクラスのHiddenPrimitiveComponentsにキャラクターMeshを登録する

```
void AInGamePlayerController::AddHiddenPrimitiveComponents(UPrimitiveComponent* target)
{
	HiddenPrimitiveComponents.Add(target);
}
```

##　キャラクターのBPから設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/ad22c6e6-e705-97bf-cdf1-f870ae781117.png)


### 手に持っている武器はキャラクターMeshの子供に設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/87425cfa-d370-48c8-29f0-acf10e95d1db.png)


### Parent Socketを設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/47e88835-1c19-70e2-e788-3742aefe0f67.png)


# 非表示にする別の方法

## Actorを指定する方法
```
void AInGamePlayerController::AddHiddenActor(AActor* target)
{
	HiddenActors.Add(target);
}

```


## HiddenInGameにチェックをいれる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/249684/ab080d51-64e1-35cc-0a0a-80876c93ea77.png)