OmniAICreator/Qiita-1.07M huggingface dataset:
Symbolブロックチェーンで不正な署名要求を検知し、注意喚起のメッセージを送る方法


現在Symbolブロックチェーン上で、全額振り込みのトランザクションに署名させる詐欺が確認されています。今回はそういった詐欺行為を検知し、注意喚起のメッセージをトランザクションに載せて自動で送信する方法を紹介します。

いつもはBrowser上のJavascriptで紹介していますが、今回は常駐させる必要があるのでNodeJS上で動かします。もちろんブラウザ上で起動させて、イベント期間中だけ入金したアカウントにチケットを配布させるローコードでデプロイレスなスマートコントラクトとして利用するなども可能です。ソースコードについては以下の記事を参考にさせていただきました。

https://qiita.com/VistielArch/items/9d9046d4a21f22debd8e


```js

const sym  = require("symbol-sdk");
const nodeURL = 'https://node.xembook.net';

//詐欺アカウント
const scamAddress = sym.Address.createFromRawAddress('NA3H3EXNWIARYBYGIMOQFKWPD2KSV2DFLGCO***');

//リポジトリ関連の設定
const repositoryFactory = new sym.RepositoryFactoryHttp(nodeURL);
const listener = repositoryFactory.createListener();
const accountHttp = repositoryFactory.createAccountRepository();
const transactionHttp = repositoryFactory.createTransactionRepository();
const receiptHttp = repositoryFactory.createReceiptRepository();
const transactionService = new sym.TransactionService(transactionHttp, receiptHttp);

// メイン処理
(async () => {

    //ネットワーク設定値
	const networkType = await repositoryFactory.getNetworkType().toPromise();
	const networkCurrency = (await repositoryFactory.getCurrencies().toPromise()).currency;
	const epochAdjustment = await repositoryFactory.getEpochAdjustment().toPromise();
	const generationHash = await repositoryFactory.getGenerationHash().toPromise();

    //注意喚起アカウント
	const alertAccount =  sym.Account.createFromPrivateKey("***********",networkType);

    //リスナー起動、アグリゲートボンデッドトランザクションの発出を検知
	await listener.open();
	listener.newBlock().subscribe();
	listener.aggregateBondedAdded(scamAddress).subscribe(

		async (partialTx) => {
            //詐欺トランザクションの詳細を取得
			const txs = await transactionHttp.search({
				address:partialTx.innerTransactions[1].signer.address,
				group:sym.TransactionGroup.Confirmed,
				embedded:true,
			}).toPromise();

            //条件を満たした場合に注意喚起			
			if(true){

                //注意喚起のトランザクション生成
				const tx = sym.TransferTransaction.create(
					sym.Deadline.create(epochAdjustment),
					partialTx.innerTransactions[1].signer.address, 
					[],
					sym.PlainMessage.create('【注意喚起】'),
					networkType
				);

                //署名
				const signedTx = alertAccount.sign(tx, generationHash);

                //ネットワークへアナウンス
				try {
					await transactionService.announce(signedHashLockTx, listener).toPromise();
				} catch(err) {
				  console.log(err);
				} finally {
				}
			}
		}
	);
})();

```

ブロックチェーン上の状態変化を検知し、新たなトランザクションを発生せる定番のパターンですので、ぜひマスターしていろいろな場面で活用してみてください。
カラム型の種類

| 型 | 意味 |
|:-:|:-:|
| string  | 文字列(1〜255文字)  |
| text  |  長い文字列(1〜4294967296文字) |
|  integer |	整数（4バイト）    |
| bigint	|整数(8バイト)
|float|	浮動小数|
|decimal	|精度の高い小数|
|numeric	|数値|
|datetime	|日時|
|timestamp	|タイムスタンプ|
|time	|時間|
|date	|日付|
|binary	|バイナリデータ|
|boolean|	真偽値型|
Lambdaでrds自動起動停止

#自動起動
#iam role作成
AWSコンソールへログイン
https://console.aws.amazon.com/iamv2
左ペインロール押下
ロールを作成押下
一般的なユースケース：lambda
ポリシー：AmazonRDSFullAccess
ロール名：control-rds
作成

#lambda関数作成
https://console.aws.amazon.com/lambda
関数の作成押下
関数名：start-rds
ランタイム：python3.9
デフォルトの実行ロールの変更
既存のロールを使用する：control-rds
関数の作成
以下コード入れる

```
import boto3

rds = boto3.client('rds')

def get_tags_for_db(db):
    """
    get instance list
    """
    instance_arn = db['DBInstanceArn']
    instance_tags = rds.list_tags_for_resource(ResourceName=instance_arn)
    return instance_tags['TagList']

def start_db_instances(target_tag):
    """
    start instances
    """
    try:
        dbs = rds.describe_db_instances()
    except Exception as e:
        print(e)
        return { 'status': 2 }

    for db in dbs['DBInstances']:
        db_tags = get_tags_for_db(db)
        tag = next(iter(filter(lambda tag: tag['Key'] == target_tag and tag['Value'] == 'true', db_tags)), None)

        if tag and db['DBInstanceStatus'] == 'stopped':
            response = rds.start_db_instance(DBInstanceIdentifier=db["DBInstanceIdentifier"])
            print(db['DBInstanceIdentifier'])

def lambda_handler(event, context):
    target_tag = "autostart"
    start_db_instances(target_tag)
    return { 'status': 0 }
```

#rdsへのタグ付け
対象のrdsへ以下タグ付ける
kye:autostart
value:true
起動したくないときはvalueをfalseへ変更

#lambdaのテスト
test押下
新しいテストイベントの作成
イベントテンプレート：そのまま
イベント名：適当に
作成
test押下
ちゃんと動くか確認

#EventBridge
＋トリガーの追加
トリガーの選択
EventBridge
新規ルールの作成
ルール名：auto-start-rds

ルールタイプ
スケジュール式
cron(0 23 ? * SUN-THU *)　#平日の朝8時起動

#自動停止
#lambda関数作成
https://console.aws.amazon.com/lambda
関数の作成押下
関数名：stop-rds
ランタイム：python3.9
デフォルトの実行ロールの変更
既存のロールを使用する：control-rds
関数の作成
以下コード入れる

```
import boto3
rds = boto3.client('rds')
def get_tags_for_db(db):
    """
    get instance list
    """
    instance_arn = db['DBInstanceArn']
    instance_tags = rds.list_tags_for_resource(ResourceName=instance_arn)
    return instance_tags['TagList']

def stop_db_instances(target_tag):
    """
    stop instances
    """
    try:
        dbs = rds.describe_db_instances()
    except Exception as e:
        print(e)
        return { 'status': 2 }
    for db in dbs['DBInstances']:
        db_tags = get_tags_for_db(db)
        tag = next(iter(filter(lambda tag: tag['Key'] == target_tag and tag['Value'] == 'true', db_tags)), None)
        if tag and db['DBInstanceStatus'] == 'available':
            response = rds.stop_db_instance(DBInstanceIdentifier=db["DBInstanceIdentifier"])
            print(db['DBInstanceIdentifier'])
def lambda_handler(event, context):
    target_tag = "autostop"
    stop_db_instances(target_tag)
    return { 'status': 0 }
```

#rdsへのタグ付け
対象のrdsへ以下タグ付ける
kye:autostop
value:true
停止したくないときはvalueをfalseへ変更

#lambdaのテスト
test押下
新しいテストイベントの作成
イベントテンプレート：そのまま
イベント名：適当に
作成
test押下
ちゃんと動くか確認

#EventBridge
＋トリガーの追加
トリガーの選択
EventBridge
新規ルールの作成
ルール名：auto-stop-rds

ルールタイプ
スケジュール式
cron(0 13 ? * MON-FRI *)　#平日の22時停止
GND とは

## 勉強前イメージ

電源とGNDって感じでマイナスと同等のものだと思ってる。

## 調査

### GND とは

Raspberry Pi だとGNDは8個程度あり、電源のマイナス極になります。
グランドと読み、基準電位(0V) を指します。

電流はプラス(3.3V) から マイナス(GND) に向かって電流が流れます。

### その他にも・・・・

回路的な話ですが、Rapsberry PiではGPIOの出力電圧は3.3Vで、
電圧を出力している状態 → high
電圧を出力していない状態 → low となります。

例えばLEDを光らすためには以下のような違いがあります。
`Raspberry Pi → GPIO → 抵抗 → LED → GND` では、接続するとGPIOをhighにしたらLEDが点く(電流が流れる)
`Raspberry Pi → 3V3 → 抵抗 → LED → GPIO` では、接続するとlowにしたGPIOでLEDが点く(電流が流れる)

## 勉強後イメージ

あまり電子回路は詳しくないから難しいんだが、
とりあえずGNDは0Vになってる。雰囲気あってたくらい。
highとlowはなんとなくわかったけど、電子回路これで組めって言われたら多分無理(わかってない)

## 参考

- [オームの法則覚えてますか？ 電子工作の基礎を身につけ、Raspberry PiでLEDを光らせよう](https://codezine.jp/article/detail/9128)
- [Raspberry Pi のGPIOと3V3のGNDの違いについて](https://teratail.com/questions/352058)
rdtsc関数によるクロックサイクル数計測



はじめに
----
C言語でプログラムを作った際にクロックサイクル数で時間の計測をしなければならない状況になりました。
が、秒単位で計測時間を出すやり方は溢れているのにクロックサイクル数で出すやり方はあまり出てこなかったので、今後の備忘録とするために作りました。

読んで欲しい人
------

- C言語でクロックサイクル数の計測をしたい人

環境
---
- Ubuntu 18.04.2 LTS (GNU/Linux 5.4.0-91-generic x86_64)
- Windows10 Visual Studio

使い方1. Ubuntu
---

~~アセンブリに埋め込むコードを記述します。~~
環境によって違うと思われますが、今回はx86_64環境なのでヘッダファイルx86intrin.hをインストールします。(1/24修正)

```
extern uint64_t cycle;
void func()
{
  // 計測したい処理
}
void main()
{
  uint64_t ts0,ts1;
  ts0 = __rdtsc();
  func();
  ts1 = __rdtsc();
  cycle = ts1 - ts0;
}
```
func()の部分を計測できます。

使い方2. Visual Studio
---
ヘッダファイルintrin.hをインクルードします。

```
#include <intrin.h>

unsigned long long cycle;
void func()
{
  // 計測したい処理
}

void main()
{
  unsigned long long ts0,ts1;
  ts0 = __rdtsc();
  func();
  ts1 = __rdtsc();
  cycle = ts1 - ts0;
}
```
func()の部分を計測できます。

おわりに
---
間違い等ありましたらコメントいただけると助かります。
(1/24: Ubuntuの方など修正)
参考文献
---
[1][__rdtsc | Microsoft Docs]
<https://docs.microsoft.com/ja-jp/cpp/intrinsics/rdtsc?view=msvc-170>
[2][CPUクロックに基づく相対時刻の計測]
<http://www.02.246.ne.jp/~torutk/cxx/clock/cpucounter.html>
[3][高性能プログラミング（Ⅱ）上級編]
<https://www.cc.u-tokyo.ac.jp/public/VOL10/No5/200809tuning.pdf>
サクラエディタで1行目をファイル名としさらに日付もつけて保存する


仕事でもプライベートでも、簡単にメモを取りたいときはやっぱりサクラエディタですよね。

でもいろんなメモを素早く保存したいとき、ファイル名をつけるのはいちいちめんどくないですか？
かといって保存せず(無題)のままPCがフリーズでもしたら、、、あー恐ろしい。

というわけで、Ctrl+S で新規ファイルの保存時に、以下をできるようにしました。

・「日付＋1行目の文字列.txt」をファイル名として保存　　

※ファイル名は保存時に変更可能です。
※1行目に文字列がない場合は「日付＋Notitle.txt」に設定します。

上記実現のためにサクラエディタで使う機能は以下です。
マクロはどなたか（ありがとうございます）のネットの情報を参考にして加筆しました。
・マクロ
・キー割り当て

例えば、
サクラエディタで以下の内容でファイルを新規作成して、Ctrl + S を押すと、

```
タイトルてすとほげほげ

以下は本文だよ
aaa
bbb
```

以下のファイル名として保存できます。
新規ファイルの「名前を付けて保存」と同じ動作なので、保存前にファイル名は確認できます。

```
20220213_タイトルてすとほげほげ.txt
```




# 1. マクロファイル作成

auto_name.jsという名前（なんでもいい）でファイル名を作成
さくらのデフォルトのマクロ保存場所「C:\Users\%USERNAME%\Appdata\Roaming\sakura\」に保存する
任意の場所に保存でもよい

```js
// var pattern = /[\\\/:\*\?""&lt;&gt;\|\r\n]/g;
var pattern = /[\r\n]/g;
var pattern2 = /./g;
var EXT = '.txt';

Main();

function Main() {
  var WshShell = new ActiveXObject("WScript.Shell");
  var sLine    = GetLineStr(1).replace(pattern, "").replace(/\./g, '-');
  
  // 1行目に文字列がない場合はNoTitleを付ける
  if (sLine == "")
    var sLine = "NoTitle"

  if (Editor.GetFilename() != ''){
    FileSaveAs(Editor.GetFilename());
    return;
  }

  var sFileName = WshShell.CurrentDirectory
      + '\\'
      + getNow()
      + '_'
      + sLine
      + EXT;

  FileSaveAsDialog(sFileName);
}

function getNow(){
  var now=new Date();
  var y = now.getFullYear();
  var m = ("0"+(now.getMonth()+1)).slice(-2);
  var d =("0"+( now.getDate())).slice(-2);
  return y+m+d;
}
```



# 2. マクロの登録
「1行目をファイル名として保存」という名前でマクロとして登録する
（マクロの名前も何でもいい）

1. メニュー > 設定 > 共通設定を開き、マクロを選択
1. マクロ一覧で0番または空のマクロを選択（キャプチャは設定後の画面です）
1. 作成した「auto_name.js」をFileで選択
1. 「1行目をファイル名として保存」という名前で設定
1. キャンセル確認待ち時間を0秒に設定する
1. 設定ボタン押す
1. OK押す
![サクラエディタマクロ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164081/878dd7a8-a09e-e3c9-8afe-b1912c43b094.png)




# 3. キー割り当て
上記で作成したマクロを、上書き保存の「Ctrl + S」に割り当てる
1. メニュー > 設定 > 共通設定を開き、キー割り当てを選択
1. 種別に外部マクロを選択
1. 「1行目をファイル名として保存」のマクロ選択
1. Ctrlにチェック
1. Ctrl＋Sを選択
1. 割付でキーに割り当てる
1. すでに割付があれば解除する
1. OK押す

![サクラエディタマクロ2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164081/828be563-03a2-87fb-6c08-d468fcf8f1df.png)


# ファイル保存時にCtrl＋Sを実行で確認
ファイル名の欄に自動で入力される
これでよければあとは保存を押すだけ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164081/d57970b6-7804-4df2-43c9-83cf022191c2.png)
【重要】.envファイルをgitignoreでgitの管理対象から外したい

# 目的
AWSのアクセスキーなどをenvファイルなどに直接書き込んでいると簡単にそのキーを利用してS3を不正利用され、高額請求されるというケースがよくある。

作成していたdjangorestframeworkのAPIをデプロイするにあたって、この問題を避けるためにenvファイルをgitignoreを使ってgitの管理対象から外そうと思う。

# 問題発生
調べた通りにgitignoreに.envを無視するように記述するも、githubのGUIをみると.envが残っている！！！！！

gitignoreファイル↓

```
/.env
```

envファイル↓

```.env
# SECRET_KEY=xxxxxxxxxxxxxxx
# AWS Settings
# DJANGO_AWS_S3_BUCKET_NAME=huga-storage
# DJANGO_AWS_ACCESS_KEY=xxxxxxxxxxxxxxxxxx
# DJANGO_AWS_SECRET_KEY=xxxxxxxxxxxxxxxxxx
```
# 解決策
実はこれまでに.envをすでにpushしていたためキャッシュが残っていたことが問題だった。

そのため```$ git rm -r --cached .env```を使って、キャッシュに残っているインデックスを削除する必要がある。

```terminal
$ git rm -r --cached .env
$ git commit -m"ignore .env file"
$ git push ~~~
```

githubのGUIからも.envがなくなった。

万事解決。
# 参考
https://qiita.com/fuwamaki/items/3ed021163e50beab7154
VisualStudioCode の CodeSpellCheckerの導入方法個人メモ

# 概要

- VisualStudioCode（以降VScode）に拡張機能CodeSpellCheckerを導入する方法をまとめる

# ご注意

- こちらの記事は[Daisuke Kondo](https://qiita.com/diescake)様の[VSCode に Code Spell Checker を導入して typo と戦う](https://qiita.com/diescake/items/98c5a099e85775cd917d)の記事を参考に導入と設定のみを抜粋して記載したものです。

# 方法

1. VScodeを起動して拡張機能のサイドバーをクリック

    ![Visual_Studio_Code.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/380f9ce6-f492-32e4-7533-3924e9386802.png)

1. 検索ウインドウに「code spell checker」と入力してヒットした最も上のもの（英語用）のインストールを行う。

    ![拡張機能__Code_Spell_Checker.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/39449597-08af-ddd0-c14a-cf3afdb8a1fe.png)

1. VScodeのsetting.jsonに下記の内容を記載する。（どうやらこれを設定しないと一部の日本語を誤って検知するらしい。）

    ```settings.json
    "cSpell.ignoreRegExpList": ["[０-９Ａ-Ｚａ-ｚぁ-んァ-ヶ亜-熙纊-黑]+"],
    ```

# 参考文献

- [VSCode に Code Spell Checker を導入して typo と戦う](https://qiita.com/diescake/items/98c5a099e85775cd917d)
【MySQL】MySQLを完全にアンインストールする方法

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##MySQLを完全にアンインストールする方法

###環境
OS: MacOS Big Sur 11.6.1（M1 mac）
Ruby: 2.7.5
MySQL: 5.7（8.0でも確認しました。）

###手順
以下の手順でMySQL関連のデータを全て削除することができます。

```
sudo rm -rf /usr/local/Cellar/mysql*
sudo rm -rf /usr/local/bin/mysql*
sudo rm -rf /usr/local/var/mysql*
sudo rm -rf /usr/local/etc/my.cnf
sudo rm -rf /usr/local/share/mysql*
sudo rm -rf /usr/local/opt/mysql*
sudo rm -rf /etc/my.cnf
sudo rm -rf /opt/homebrew/var/mysql 

rm -rf ~/Library/PreferencePanes/My*
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /private/var/db/receipts/*mysql*
sudo rm /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist

brew uninstall mysql

```
2022/1/14主にITとかセキュリティの記事

ランサム攻撃を受けたらどうする？　JPCERT/CCが初動対応FAQを公開
https://www.security-next.com/133205

ドコモ、スミッシングを拒否設定 - 申込不要で自動設定
https://www.security-next.com/133243

「Citrix Workspace App for Linux」に権限昇格の脆弱性
https://www.security-next.com/133191

キングジムのパスワード管理端末に脆弱性 -利用中止を
https://www.security-next.com/133225

サーバにSQLi攻撃、会員メアドが流出か - イシバシ楽器
https://www.security-next.com/133215

消費者金融「プロミス」の利用者を狙ったフィッシングに注意
https://www.security-next.com/133247

みずほ銀行またシステム障害　1年で10回目…“合併による複雑さ”指摘(1/12)
https://news.yahoo.co.jp/articles/c997e11177f0d659107559e53e4e1a3c62d2b4bd

(解決済み)AppleのiCloud DriveやiCloudキーチェーンなどiCloudサービスでシステム障害が発生中。(1/11)
https://applech2.com/archives/20220111-apple-icloud-system-failure.html

2022年はイーサリアムの年になる【オピニオン】(1/12)
https://www.coindeskjapan.com/135861/

ブロックチェーンエコシステムの開発者数は順調に増加、スマートコントラクトプラットフォームが多くの開発者を集める(1/11)
https://hedge.guide/news/blockchain-developers-tends-to-increase-bc202201.html

NEC、データを暗号化したまま計算できる秘密計算ソリューション(1/12)
https://news.mynavi.jp/techplus/article/20220112-2247826/

Slackで生産性を最大限に。知らなかった4つのカスタマイズ機能(1/12)
https://www.lifehacker.jp/article/2483924-productivity-tips-for-working-in-slack/

Windows 11環境でInternet Explorer 11を起動するショートカットを錬成してみる(1/11)
https://news.yahoo.co.jp/articles/a7a3f4075b150b954c52e9297bdea27a650fba92

「Log4j」の脆弱性に関連する「深刻な侵入」見られずも要警戒--CISA長官ら(1/11)
https://japan.zdnet.com/article/35181876/

TerraMasterのNASでランサムウェア被害報告。最新アップデートの適用を呼びかけ(1/12)
https://pc.watch.impress.co.jp/docs/news/1379713.html

2021年は前年比較でサイバー攻撃が50％増加　Log4Shellの影響は？(1/12)
https://www.itmedia.co.jp/enterprise/spv/2201/12/news049.html

ランサムDDoS攻撃が前年比29%増――クラウドフレア、DDoS攻撃に関する調査(1/11)
https://enterprisezine.jp/news/detail/15434

“フィッシング詐欺”で男を逮捕　クレジットカード情報盗まれ「身に覚えのない決済が」 愛知県警(1/11)
https://news.yahoo.co.jp/articles/784103d4b25782e2b98c1cf548549e859671b30c

スポーツNFTミンティングLympoがホットウォレへのハッキングで1,800万ドルを失う(1/12)
https://nextmoney.jp/?p=47422

Linuxカーネルの"依存関係地獄"解消目指す「Fast Kernel Headers」(1/12)
https://japan.zdnet.com/article/35181877/

ポーランドのモバイルスパイウェア事件で2019年の選挙に疑念が浮上(1/12)
https://jp.techcrunch.com/2022/01/12/2022-01-11-poland-nso-pegasus-election/

世界中の配電機器に使用されている安全装置で「ハッキングされて電力を遮断される脆弱性」が見つかる(1/12)
https://article.auone.jp/detail/1/3/7/48_7_r_20220112_1641950552846975

カスペルスキー、年次レポート「Kaspersky Security Bulletin 2021. Statistics」を発行　〜新たに検知した悪意のあるファイルは、5.7％増の1日あたり38万件に(1/12)
https://securityinsight.jp/news/13-inbrief/4881-220112-1

ボランティア開発者が「反乱」。もっとオープンソースに還元されるべき？(1/11)
https://news.yahoo.co.jp/byline/yamaguchikenta/20220111-00276813

大企業1社あたりのサイバー攻撃は平均270件、前年から3割増加｜@DIME アットダイム(1/11)
https://newstopics.jp/url/19024728

【キーワード・30秒解説】SaaS(1/12)
https://newswitch.jp/p/30043

フィッシングやハッキング被害が急増…「スマホやインターネット詐欺」の対策方法を米専門家が説明(1/12)
https://news.yahoo.co.jp/articles/89626b2e45d7c9a92809632be11df7055e666f74

「Firefoxでネットにつながらない」、SNSでユーザーの報告が続々(1/13)
https://xtech.nikkei.com/atcl/nxt/news/18/12005/

リモートアクセスの新常識、「脱VPN」で静岡ガスが採用した渋滞知らずの手段とは(1/13)
https://xtech.nikkei.com/atcl/nxt/column/18/01897/122200004/
【JavaScript】ある音楽ゲームのボーダー許容を計算する

某音ゲーでは、**1,010,000**点を上限に判定の善し悪しによってスコアが減少していく。
具体的にはすべてのノーツで最高評価をとれば1,010,000点となるが、それ以下の評価を取るとそのたびにスコアが減少する。

100万/総ノーツ数でそれぞれのノーツの基礎点が決まったのち、
評価によって以下のようにスコアへ影響する。

+ **JUSTICE CRITICAL**：基礎点×101%
+ **JUSTICE**：基礎点×100%
+ **ATTACK**：基礎点×50%
+ **MISS**：基礎点×0%


計算式さえわかってしまえば、総ノーツ数とスコアから何個JUSTICEを出したかを計算することができる。
> あくまでJUSTICEの数のみを計算するが、**ATTACK** は **JUSTICE** 51個分、**MISS** は **JUSTICE** 101個分となるので読み変えは可能。

以上を加味するとJUSTICE以下の数を算出する計算式は以下となる。
floor(総ノーツ数 * ((1010000 - スコア) / 10000))
> floorは切り捨てを意味する。

```sample.js
//計算を行う関数
function Calc(notes, score) { //総ノーツ数とスコアを参照する
  const lost = Math.floor(notes * ((1010000 - score) / 10000));
  return lost; //JUSTICEの数
};
//例 ノーツ数1311、スコア1009923点の場合、1311 * 0.0077(101 - 100.9923)を切り捨てして10という値が得られる。


//楽曲データを定義する
const music = {
  notes: 1311, //総ノーツ数を設定
  score: 1009923 //スコアを設定
};
const justice = Calc(music.notes, music.score); //総ノーツ数とスコアを渡す

console.log("JUSTICEの数", justice); //例　JUSTICEの数　10
```

また、スコアの部分を1007500などにすると**SSS**ボーダーなどを計算することもできる。
【JavaScript】現在時刻を取得する

割と使うけど忘れやすいので、JavaScriptで現在時刻を取得する方法を備忘録としてメモしておく。

```sample.js
const date = new Date(); //現在時刻を取得
const y = date.getFullYear(), //西暦年
      m = date.getMonth() + 1, //月　
      d = date.getDate(), //日
      H = date.getHours(), //時
      M = date.getMinutes(), //分
      S = date.getSeconds(); //秒

console.log(y,m,d,H,M,S); //例 2022 1 14 3 10 30
```
他にも[ミリ秒を取得する](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/getMilliseconds)などもある。


あとは使う形式に応じて色々と整形する。

```sample.js
`${y}/${m}/${d}`; //例　2022/1/14
`${H}:${M}:${S}`; //例　3:10:30
```


0paddingなどと組み合わせると 2022/01/14 03:10:30などの表記もできる。

```sample.js
const m_pad = ( '00' + m ).slice( -2 ); //'00'とsliceの中身は桁数に応じて増減させる。今は2桁表示にさせたいので0は二つ、sliceの中は-2。
console.log(m_pad); //例　01
```
Go製 markdown driven な code generator 作った

https://github.com/igtm/manaita

markdownで生成テンプレを記述すると、Github上などで見れるので、どのようなコードが生成されるのかが直感的にわかりやすくなります

Go製のライブラリは探しても見つからなかったのでさくっと作ってみました。

# 使い方

`SCAFFOLD.md` に以下のようなテンプレを書く

    ---
    Params:
    - name
    ---

    # foo.go

    ```
    package foo

    import "fmt"

    func Foo() {
    	// 引数で渡したパラメタが使える '-p name=George'
    	fmt.Println("name", "{{.Params.name}}")
    	// 環境変数も使える
    	fmt.Println("BAR", "{{.Env.BAR}}")
    }
    ```

`SCAFFOLD.md` と同じディレクトリでコマンド実行

```shell
manaita -p name=taro
```

`foo.go` ファイルが生成される

# インストール方法

```shell
brew install igtm/tap/manaita
または
go install github.com/igtm/manaita@latest
```
Elixirで3桁以上の数を3桁カンマ区切りで表示する

Elixirに数を3桁カンマ区切りで表示する関数ないかなぁ、ありそうな気がするんだけどなぁ。
と思いつつ探しても見つからないかったので正規表現で無理やりやってみました。

# やりたい事
3桁以上の数を3桁カンマ区切りで表示する。
例：1234567 -> 1,234,567

# 作成したコード

```elixir
input = "1234567"
Regex.replace(~r/(\d)(?=(\d\d\d)+(?!\d))/, input, "\\g{1},")

```
```elixir
iex(1)> input = "1234567"
"1234567"
iex(2)> Regex.replace(~r/(\d)(?=(\d\d\d)+(?!\d))/, input, "\\g{1},")
"1,234,567"
```

JavaScriptだとtoLocaleString()とか言うのがあるらしいんだけどなぁ。

#ちなみに
numberというライブラリをインストールすると
[Number.Delimit.number_to_delimited/2](https://hexdocs.pm/number/Number.Delimit.html#number_to_delimited/2)という関数を使用して変換できるみたいです。
(試してはいない。)

https://elixircasts.io/formatting-numbers

https://hexdocs.pm/number/Number.Delimit.html

#参考
https://www.yoheim.net/blog.php?q=20190702
https://hexdocs.pm/elixir/1.13/Regex.html#replace/4
https://elixircasts.io/formatting-numbers
https://hexdocs.pm/number/Number.Delimit.html
現在のディレクトリ以下にあるシンボリックリンク一覧を取得する。


現在のディレクトリ以下にあるシンボリックリンク一覧を取得する。

```bash
find . -type l
```

ただしこれだとサブディレクトリも含む。カレントディレクトリに限定したい場合は以下にする。

```bash
find . -type l -maxdepth 1
```

`DIRECTORYNAME`以下のファイルを対象にしたい場合は以下の通り。

```bash
find ./DIRECTORYNAME -type l -maxdepth 1
```

カレントディレクトリのファイル一覧取得は以下のようにすればOK

```bash
find . -type f -maxdepth 1
```

# 参考
[find コマンドで対象ディレクトリ直下のファイルのみを絞り込みたい](https://neos21.net/blog/2019/08/16-02.html)
[シンボリックリンクやディレクトリを探すには](https://atmarkit.itmedia.co.jp/flinux/rensai/linuxtips/365findsymlnk.html)
【Vue】vue-sfc-rollup でセットアップしたプロジェクトで「export default class クラス名」を使う

## vue-sfc-rolluとは
vue-cliのように、とても簡単にVueライブラリを作成する環境（プロジェクト）を自動生成してくれる、とても便利なリポジトリです。

具体的な使い方については、以下サイト様が詳しく解説してくださってます。
https://zenn.dev/hiratake/articles/publish-vue-sfc-rollup

## 問題
デフォルトの状態では、例えば"entry.esm.js"内などに「export default class クラス名」を記述して、実際にbuildして"npm link"などでテストしても、以下のようなエラーを出力して処理が停止します。

```console
 ERROR  Failed to compile with 1 error                                                                                                                                                                                   1:02:55
 error  in ../sample-project/dist/sample-project.esm.js

Module parse failed: Unexpected token (204:17)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
|
| class SampleClass{
>   static install = install$1;
|
|   constructor() {
```


## 対処
「babel-plugin-transform-class-properties」をインストールします。

```console
npm install --save-dev babel-plugin-transform-class-properties
```
また、インストール後、プロジェクトのルートディレクトリにある"babel.config.js"を編集します。

```js:babel.config.js
const devPresets = ['@vue/babel-preset-app'];
const buildPresets = [
  [
    '@babel/preset-env',
    // Config for @babel/preset-env
    {
      // Example: Always transpile optional chaining/nullish coalescing
      // include: [
      //   /(optional-chaining|nullish-coalescing)/
      // ],
    },
  ],
];
module.exports = {
  presets: (process.env.NODE_ENV === 'development' ? devPresets : buildPresets),
  plugins: ["transform-class-properties"]  <-- 追加！
};
```

以上です。

#### 2022/06/07 追記

パッケージ整理のついでに色々調べていたら、`@babel/plugin-proposal-class-properties`パッケージのドキュメントに、以下の記載を発見。

:::note warn
This plugin is included in @babel/preset-env, in ES2022
:::

このパッケージは、`@babel/preset-env`に含まれているとのこと。

というわけで、`babe.config.js`を修正したものが以下になります。
※`babel-plugin-transform-class-properties`はもう使わないので、アンインストールしておきます。

```js:babel.config.js
const devPresets = ['@vue/babel-preset-app']
const buildPresets = [
  [
    '@babel/preset-env',
    // Config for @babel/preset-env
    {
      // Example: Always transpile optional chaining/nullish coalescing
      include: [
        // /(optional-chaining|nullish-coalescing)/
        '@babel/plugin-proposal-class-properties'
      ],
    },
  ],
];
module.exports = {
  presets: (process.env.NODE_ENV === 'development' ? devPresets : buildPresets)
}
```
unityでScriptableObjectからインベントリをかんたんに作る#1

![スクリーンショット 2022-01-14 1.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2442087/5b9401f6-f1f1-9fde-8ac1-62859e82a999.png)
#ScriptableObjectを使ってみる
##ScriptableObjectとは

ScriptableObject は、クラスインスタンスとは無関係に、大量のデータを保存するために使用できるデータコンテナです。(Unityリファレンス)

と、言われてもむずかしいですね。スクリプタブルオブジェクト、と読みます。

ゲームを作る時でいえば、例えばたくさんアイテムのデータを作りたい時に使います。
***たくさん作ったアイテムを一斉に管理する方法の一つ***、と覚えてください。

今まで作ってきたゲームでは、プログラムは何かしらにくっつけて使うものでした。
例えば、Playerを動かすmove.csは、Player役のCubeとかにつけてたと思います。

しかし、ScriptableObjectはオブジェクトくっつけて使いません。というか、何にもくっつけません。


今回は実際に
緑のCube
青のCube
赤のCube
を拾って画面にアイテムとして表示できるようにします。
↓こんな感じ![スクリーンショット 2022-01-14 1.01.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2442087/cddbf2fe-5f8b-5072-61dd-20cfc549f196.png)

##Itemを作る
###プログラムを書く
アイテムをたくさん管理するためのもの、と言いました。
アイテムのデータをたくさん作ることができるようになるプログラムを書きます。
いつものように、`project`->`c#Script`からプログラムを作って以下を書きましょう。名前はItemです。

```php
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[Serializable]
[CreateAssetMenu(fileName ="Item",menuName="CreateItem")]
public class Item : ScriptableObject
{

    [SerializeField]
    private string itemName;

    public string GetItemName()
    {
        return itemName;
    }

}
```
まずはここに注目してください

```php
public class Item : ScriptableObject
```

いつもと何かが違います。どこでしょうか？
いつもは`ScriptableObject`のところが`MonoBehavior`となっていました。
ここで、このプログラムはScriptableObjectだよ〜とUnityに教えてあげていると思ってください。
つまりどこのオブジェクトにもくっつけなくてよくなります。

###unityでアイテムを作れるようになる
このプログラムを書くと、unityでアイテムがかんたんに作れるようになっています。
unityで`project`の＋ボタンを押してみてください。一番上に`CreateItem`というボタンが出現したはずです。
押してみましょう。

![スクリーンショット 2022-01-14 1.21.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2442087/dcaecdec-b406-4400-3b7b-5cbd787e2ba2.png)

これを押すと次のようなものが現れます。

![スクリーンショット 2022-01-14 1.22.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2442087/791c72a9-1a30-d84a-f5f5-c4284511a619.png)


これで大量にアイテムの情報を作ることができるようになりました。
試しにItem Nameに`greencube`と名前を入れてみましょう。
これで名前が「greencube」っていうアイテムがありますよ、というデータがunityに誕生しました。

ただこれだけではデータは名前だけでちょっと寂しいです。
画像のデータも持てるようにしましょう。

```php
[SerializeField]
 private Sprite icon;

public Sprite GetIcon()
 {
     return icon;
 }
```

これを追加してみましょう。
そうすると、さっきのアイテムデータのところに画像を追加する項目が出現します。

![スクリーンショット 2022-01-14 1.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2442087/29c3209d-20bb-961f-e214-c616a10dc2ee.png)

このIconに好きな画像を入れてみましょう。（後で使います。）

できたら、自分で複数アイテムを作ってみましょう。


今回はアイテムを大量に作れるようにしました。
次回はアイテムを管理するデータベースを作ります。


![スクリーンショット 2022-01-14 1.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2442087/a412e00d-464e-1331-c83c-d3b9ba6f06af.png)
Figma APIで特定File内の任意のFrame名を全てクリップボードにコピーする


https://qiita.com/xrxoxcxox/items/146676bd5019ef5ba988

@xrxoxcxox さんのcurlでやる方法ではなく、JavaScriptでやる方法です。

## やりたいこと

下記のようなことを想定しています。

- FigmaのFrame名を画面名やIDにしており、それをスプレッドシート等で管理（一覧化）するために、Figmaから対象のFrame名一覧を取得したい

## どうやるか

- DevToolsのConsoleを利用し、JavaScriptで取得する

## 手順

下記のような手順で実行します。

1. Figmaの該当ファイルを開く
2. `⌘ + Option + I` or `Ctrl + Shift + I` でDevToolsを開き、Consoleタブを開く
3. 抽出したいFigmaのFrameを選択する
4. 後述するコードをConsoleに貼り付けて実行する
5. クリップボードに選択したFrame名がコピーされるので、それをスプレッドシートなどに貼り付ける


```
let selection = figma.currentPage.selection;

let frameNames = selection.map(n =>  n.name).join("\n");

copy(frameNames);
```

![Figma内に４つのダミーのFrameがあり、それを選択した状態の画面のキャプチャ。画面下部にはDevToolsのConsoleタブのページが開いている](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21225/1cd7be21-87b8-ee5f-6344-24c7f2751b73.png)

![スプレッドシートに改行されたテキストを貼り付けたキャプチャ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21225/d394bced-a501-edbf-bcc4-e05f35eb836c.png)


### ポイント

[過去の記事でも書きました](https://qiita.com/hiloki@github/items/8f97c7705d0768c9462d)が、FigmaではDevToolsを使えば、Figma APIをJavaScriptで扱って色々できます。

- `figma.currentPage.selection` は「現在のページ」の「選択中」のレイヤーを意味します。
- `selection.map()` では、上記で取得したレイヤーの配列に対し処理を行い、新しい配列として `frameNames` に格納します。
- `join(""）` は、配列に対し、その引数の文字列で区切った文字列を返してくれます。この場合は、`\n` という改行コードで区切るようにします。

```
console.log(selection.map(n =>  n.name))
// ["01. トップページ", "02. 会社概要", "03. お問い合わせ", "04. プライバシーポリシー"]

console.log(selection.map(n =>  n.name).join("\n"))
// .join("\n")で下記に変わる
// 01. トップページ
// 02. 会社概要
// 03. お問い合わせ
// 04. プライバシーポリシー
```

最後の`copy()`はDevToolsに用意されている関数で、これだけでクリップボードにコピーされます。
※普通のWebページなどで実行しても使えません。

# さらに応用

ひと手間加えて、対象のFrameのURLも取得してしまいましょう。
先にサンプルコードを載せます。

```
// FileのURLからファイル名までを手動でコピーする
// ※下記はダミーのURL
let fileURL = "figma://file/vkVHI0JG0CpE2cULt13eh7/Sample"

let selection = figma.currentPage.selection;

let frameNames = selection.map(n => {
	// Frameの名前
	const name = n.name;
	// 前述したFileのURLと、FrameのNodeIDをくっつけるとこのFrameへのURLになる
	const url = `${fileURL}?node-id=${n.id}`;

  // 名前とURLをタブ区切り（`\t`）した文字列にする
	return `${name}\t${url}`
});

// 名前とURLのセットを改行区切り（`\n`)にする
let result = frameNames.join('\n');

// クリップボードにコピー
copy(result);
```

## ポイント

- APIからFileのURLを直接取得できないので（たぶん）、Figmaでの `Copy URL` などでFileのURLを取得して文字列として格納する
- スプレッドシートのセルを列で分けて貼り付けるために、タブ区切りをする。そのために先程の改行コードのようにタブ区切りの `\t` を挟んだ文字列にする

![Frameの名前とURLを行列で貼り付けた画面のキャプチャ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21225/e2fa88e3-5b13-6c2c-af33-e4c3ddce0fea.png)

# まとめ

こんな感じでレイヤー（コードでいじる上ではNodeと呼びます）をどうこうできるので、また興味があればコードをカスタマイズして色々試してみてください！
（例えば、選択したレイヤーではなく、第一階層のFrameにしたければ...など。）

https://www.figma.com/plugin-docs/api/properties/nodes-findchildren/#docsNav
【超効率】スマホだけでAZ-900:Azure Fundamentalsに合格した勉強法

Microsoft Azureの基礎中の基礎、AZ-900:Azure Fundamentalsを受験し、合格しました。
**テキストは買っていません！**

色々やれば無料で受験できる資格なので、できたらテキストにもお金を払いたくないですよね。

無事にノーコストで資格をゲットしたので、その超効率な勉強法を書き留めておきます。
必要なものは**スマホだけ**です。

#はじめに
勉強は簡単！2ステップで超効率に行きましょう。

1.スマホでMicrosoft Learnを読む！
2.スマホで無料のWeb問題集を解く！

簡単ですね。
#1.スマホでMicrosoft Learnを読む！
6つのラーニングパスを読みます。
###読み方のポイントは3つ！
・スマホで読む（電車でもトイレでも読める）
・サービス/リソースの「役割」と「得意」を探す
・2周したら、知識チェックだけもう一周
キャラ紹介だと思って読みます。まずはこれでキャラクターを覚えていきました。

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-cloud-concepts/

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-core-azure-services/

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-core-solutions-management-tools-azure/

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-general-security-network-security-features/

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-identity-governance-privacy-compliance-features/

https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-azure-cost-management-service-level-agreements/


#2.スマホで無料のWeb問題集を解く！
お手持ちのスマホでGoogle先生を開きます。
「**AZ-900 問題集 無料**」とか入れて検索してみましょう。
4択問題を沢山並べたサイトが見つかります。
ラーニングパスで覚えた知識（キャラ）の振り返りと、問題傾向を掴むのが目的です。
こちらも最低2周くらいしたほうがよいです。
スマホなので、好きな時間にちょっとずつ。

※別に違法や著作権侵害ではないとは思うんですが、もしそうだったら嫌なので間接的に紹介します。

#試験本番
試験を受けた所感です。受ける際の指針になるかと。（参考までにね）
 ・ひねくれた問題が少ない（ない？）
 ・知らない問題でも、言い回しの違和感でハズレが視えてくる
・システム開発の経験があれば、「普通に考えたらこうだよね？」がちゃんとアタリになる。

#まとめ
以上！
**一番大事なのは、スマホで勉強すること！**
スマホなら場所と時間を選ばないから、勉強時間の捻出がラクチンです。
NavigationBarの色を固定する方法

今回はNavigationBarの色について記述します。

Xcodeを13.1にアップデートしてから画面をスクロールするとNavigationBarの色が変化してしまうなってずっと悩んでいたものがやっと解決されとてもうれしいです。。

|NavigationBarの色を固定していない  |NavigationBarの色を固定  |
|---|---|
|  ![notkotei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/6b491e33-0aeb-8b87-6610-6dfd2f5c121c.gif)|![kotei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/14f52b11-edbf-d6b0-6e8c-2dd665e05eda.gif)|

##解決方法！！

以下gif画像のように動作する。

1. 色の設定をしたい**StoryBoard**にて**NavigationBar**を選択
2. **[ユーティリティエリア]>>[NavigationBar]**の**[Appearances]の[Standard]と[Scroll Edge]**にチェックをいれる
    2. →→すると**[Standard Appearance]と[Scroll Edge Appearance]**を設定できるようになる
3. それぞれの**BackGround**を好みの色に設定する

完了！！


![setti.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/c07877e9-ce6f-41a5-f9a5-7fc4af8505c9.gif)
( 画質悪くてすいません、m(_ _)m )



##役割解説
|Appearance |Standard |Scroll Edge|
|---|---|---|
|状態 |画面がスクロールされてるとき |画面がスクロールされてないとき|
|イメージ|<img width="200" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/4bcede0f-dcf3-59e9-9bef-716ee5330dc0.jpeg">|<img width="200" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/5a461aa1-c860-5b47-d870-1655ffd7fa43.jpeg">|


##おまけ
いじっていたらグラデーションができたのでおまけでつけておきます

1. 色の設定をしたい**StoryBoard**にて**NavigationBar**を選択
2. **[ユーティリティエリア]>>[NavigationBar]**の**[Appearances]の[Scroll Edge]**にチェックをいれる
3. [Scroll Edge Appearances]の**[BackGround]**を**[default]**に設定する
![スクリーンショット 2022-01-14 午前0.38.16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/dc4fdfa5-307a-ab1b-30bc-ca51196270af.jpeg)

4. [NavigationBar]自体の**[BackGround]**を好みの色に設定する
![スクリーンショット 2022-01-14 午前0.38.22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/8c6f4c8f-2274-c394-f9e2-0024dfde0b16.jpeg)

[実行結果]
<img width="250" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/583218/97293392-7c38-3e52-5b90-64bd492fb3d2.jpeg">
LogicoolOptionが開かない時の対処法

#問題
 LogicoolOptionsを開いたが起動しない。

#記事のターゲット
- LogicoolOptionが以前は使えていたのに、使えなくなっている。
- uninstallして再度installをしたが、起動しない。
- installの際に「いいえ、共有しません」を選択したがうまくいかない。

#結論
不要な関連ファイルが削除しきれていない為、起動しなかった。

#トラブルシューティングの手順(以下macOSでの手順)
1.アプリケーションからLogicoolOptionsをuninstallする。
　⌘+spaceで「logi」と調べればuninstallerが出てくるのでuninstall。
　もしくは、Finder>アプリケーション>LogicoolOptionsをゴミ箱にドラッグ。


2.ターミナルから以下のコマンドを順に打っていく。
（zsh: no matches foundと返された場合はuninstallerできちんと削除されているので、気にせず次のコマンドを実行。コマンドではなく直接フォルダへ移動し削除したら、最後に必ずゴミ箱を空にする）


```
% cd ~/library
% rm -rf ApplicationSupport/Logitech
% rm -rf Preferences/com.Logitech*
% rm -rf Caches/com.Logitech*
% rm -rf LaunchAgents
% rm -rf LaunchDaemons
% rm -rf PreferencePanes
% rm -rf StartupItems
```


3.PCを再起動

4.macOSが最新バージョンであることを確認し、[LogicoolOptionsの最新版](https://support.logi.com/hc/ja/articles/360025297893)をダウンロード。

5.インストールする際、「いいえ、共有しません」を選択。
![](https://camo.qiitausercontent.com/5966a9e91b2ac21a018d4a438138cf59c8e5d289/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3330363431372f62353963323464612d376339342d393062312d653532382d3738326363303964666431372e706e67 "インストール")

6.システム環境設定>セキュリティとプライバシー>アクセシビリティで、「Logi Options」と「Logi Options Demon」のコンピュータ制御が許可になっていることを確認。

7.システム環境設定>セキュリティとプライバシー>入力監視のプライバシーで、「Logi Options」と「Logi Options Demon」のコンピュータ制御が許可になっていることを確認。
LAMP+Composer環境をスクリプトで一撃構築

ちょっとしたことで自由に使えるLAMP環境が欲しくなることがたまにあります。
毎度ググったり、メモしているインストール方法を引っ張ってきて構築するのは割と面倒になったので、Composerを含めたLAMP環境の構築をシェルスクリプトで実行してしまおうというのが本記事の内容です。

###実行環境

* Amazon Linux2

###インストールするソフト

* apache 2.4
* php 7.4
* mysql 5.7
* composer 最新

##スクリプト実行方法
<ol><li> AWSでインスタンスを立て、SSHで接続します。
![open - TeraTerm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/47b6db39-00fc-8b91-3e86-d4fef489147e.png)
</li>
<li>接続が完了したらスクリプト用のファイルを開きます。

```sh
sudo vi script.sh
```
</li>
<li>「i」キーを押下してインサートモードに切り替え、下記のスクリプト本文をペーストします。
![paste - script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/af595f11-9249-b729-5534-9d103e6fabad.png)

</li>
<li>ペーストしたら「esc」を押下し、「:wq」と入力して「Enter」キーをクリックします。
![save - script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/f19fabab-e6ec-a2b6-4ed7-d2d6e1642289.png)

</li>
<li>ファイルに実行権限を付与し、実行します。
![exec - script.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606316/9a82bfaa-fd05-1a55-2acd-f0bec60993b3.png)
</li>

実行方法は以上になります。
__ご意見いただけますと大変嬉しく思います。__

##スクリプトの本文
```sh
#!/bin/bash

sudo yum update -y

## installするapacheなどのバージョンを追記するファイルを作成
touch scriptExecutionResult

## apache install & 自動起動設定
sudo yum install httpd -y
sudo systemctl start httpd.service
sudo systemctl enable httpd.service

## php install
sudo amazon-linux-extras install -y php7.4
# よく使うcakephpのinstall用にモジュール追加
sudo yum install -y php php-mbstring php-intl php-xml

## mysql
# mariaDB uninstall 削除しなくてもいいけど不要なので
sudo yum remove -y mariadb-libs
# MySQL公式のyumリポジトリを追加
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
# インストールするバージョンの有効化を行う。デフォルトは8.0
sudo yum-config-manager --disable mysql80-community
sudo yum-config-manager --enable mysql57-community
# mysql install
sudo yum install -y mysql-community-server


## composer install
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

## バージョン諸々をリダイレクトで追記
httpd -v | head -n 1 >> scriptExecutionResult
mysqld --version >> scriptExecutionResult
composer -v | grep 'version' | head -n 1 >> scriptExecutionResult
php -v >> scriptExecutionResult
php -m >> scriptExecutionResult

cat scriptExecutionResult
```

##引用
[Composer 公式サイト](https://getcomposer.org/download/)
Laravel・ヘルパー関数Optionalについて


とあるテーブルのカラムに値が入っていないと

**Trying to get property of non-object**

このようなエラー文言が画面に現れます。


optionalヘルパー関数を使う事でこのエラーを解消する事ができます。
例としてとあるテーブルを元に解説していきます。
###データベース
例）
・itemsテーブル
・stocksテーブル
![My First Board (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2188773/c39e8ca6-0ebd-e60d-d362-5f18324ff154.jpeg)

itemsテーブルとstocksテーブルは1対1の関係性です。
stockの中身は空だとします。（nullの場合）

```php:item.blade.php
{{ $item->stock->stock }}
```

itemテーブルに紐づいたstockテーブルのstockカラムを取得したいのですが、stockカラムがnullの為、上記コードでは画面に『**Trying to get property of non-object**』　このようなエラー文言が出てしまいます。


###解決策

```php:item.blade.php
{{ optional($item->stock)->stock }}
```

このようにoptionalヘルパー関数を付ける事により、stockカラムの中がnullだとしてもエラーにはならずviewが表示されます。
ArduinoUNOでモーターを制御する　軽くオリジナルのモータードライバーを作ってみた　100円以下



まだ完全に試していない

目的
モーターのテスト
モーターコントローラを燃やす壊す高いと
いうから軽く100円以下でモーターコントローラを作ってみた。(どや)







![o_con188.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/06249a21-c30d-11eb-925e-fbe87376ab30.jpeg)



参考


STM32L010でモーターを制御する　軽くオリジナルのモータードライバーを作ってみた　100円以下



https://qiita.com/caa45040/items/bd859b88ed64ec891581







```c++



//MC_UNO_1

#include <Arduino.h>

#define M_STOP    0
#define L_ROTATE  1
#define R_ROTATE  2

#define L_SIDE    2
#define R_SIDE    3
#define myled   13

int MD_1[3][2] = {  { 0 , 0 } , { 1 , 0 } , { 0 , 1 }  }; 

int motor_1( int control_1 )
{

    if( control_1 < 0 || control_1 > 2 ) return( -1 );

    digitalWrite(L_SIDE , MD_1[control_1][0] );    
    digitalWrite(R_SIDE , MD_1[control_1][1] );

    return (0);//正常終了

}//motor_1

//初期化
void setup() {

        //GPIOの初期化
  pinMode(L_SIDE, OUTPUT);
  pinMode(R_SIDE, OUTPUT);
  pinMode(myled,  OUTPUT);
  digitalWrite(L_SIDE, LOW);
  digitalWrite(R_SIDE, LOW);

}//setup


//メインループ
void loop() {

        motor_1( M_STOP );
        delay(1000);

        //正面から見て反時計周り
        motor_1( L_ROTATE );
        delay(1000);

        motor_1( M_STOP );
        delay(1000);

        //正面から見て時計周り
        motor_1( R_ROTATE );
        delay(1000);

}//loop








```
FlutterのプラグインアップデートをGitHubActionsで自動化する



Flutterのリポジトリでdepandabotがうまく動かなかったので、自分でactionを組みました。
そのyamlになります。

> うまく動かなかったので

https://github.com/dependabot/dependabot-core/issues/2166

こちらのissueが原因みたいです。

月曜の11時にPRを作成するようにしています。ブランチ名などをあとから識別できるようにしたかったのもあり、日付を変数に出力してそれを利用するようにしています。

```yaml
on:
  workflow_dispatch:
  schedule:
    - cron: '0 2 * * MON'

jobs:
  test:
    name: Flutter Package Updater
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: subosito/flutter-action@v2
        with:
          channel: 'stable'
      - run: flutter pub upgrade
      - name: Set current date as env variable
        env:
          TZ: 'Asia/Tokyo'
        run: echo "CURRENT_DATE=$(date +'%Y-%m-%dT%H-%M-%S')" >> $GITHUB_ENV
      - name: create PR
        uses: peter-evans/create-pull-request@v3
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          commit-message: '[Scheduled] `flutter pub upgrade`'
          title: "Package Update ${{ env.CURRENT_DATE }}"
          body: |
            :crown: *An automated PR*
          delete-branch: true
          labels: |
            auto-pr
            package-update
          branch: "actions/package-update-${{ env.CURRENT_DATE }}"
          base: develop
```

対応したあとに気づいたのですが、こちらの記事とやっていることはほぼ同じでした。
https://qiita.com/sensuikan1973/items/899c0f06c5cf0874546b
【AWS】AutoScalingの起動設定でAMIを変更しただけのはずがAWS利用料が倍になっていた話

# はじめに
あ…ありのまま 今　起こった事を話すぜ！

「おれは　起動設定でAMIを変更したと思ったら　いつのまにかAWS利用料が倍になっていた」

な…　何を言っているのか　わからねーと思うが　
おれも　何をされたのか　わからなかった… 
頭がどうにかなりそうだった…　催眠術だとか超スピードだとか
そんなチャチなもんじゃあ　断じてねえ
もっと恐ろしいものの片鱗を　味わったぜ…

***

おふざけはさておき、タイトルのとおり起動設定でAMIを変更しただけだったはずが、AWS利用料が倍になってしまったため、自分への戒め及びAWSを利用している方へ共有するためにも記事として残します。

# やったこと
新しくAMIを作成したため、既存の起動設定をコピーして新しい起動設定を作成した。
※この時、変更したのはタイトルとAMIのみ変更し、他の設定は変更していない。

# 起きた事象
毎日EBSボリュームを作成しており、１か月後にAWS利用料が倍になっていた。
※起動設定を入れ替える前はEBSボリュームを作成することはなかった

# 原因
この環境ではAutoScalingでEC2の台数を毎日増減しており、EC2を削除した際にEBSボリュームが自動で削除されなくなっていた。
ここでピンときて、EBSを自動削除する「終了時に削除」を確認する。

* 既存の起動設定では「終了時に削除」の設定は有効だった。
* 新しい起動設定では「終了時に削除」の設定は<font color="Red">無効</font>となっていた。

※「やったこと」にも記載しているとおり、筆者は既存の起動設定をコピーして新しい起動設定を作成していた。
「終了時に削除」は変更していなかったはずが、いつの間にか変更されている点に注意してほしい。

# なぜ発生したか
新しい起動設定を作成する際にAMIを変更したが、このAMIに問題があった。
AMIを作成するときに「終了時に削除」が無効のまま作成していた。

その結果、新しい起動設定でAMIを変更したときにAMIの情報で起動設定が上書きされてしまい、元々有効だったはずの「終了時に削除」が無効になってしまっていた。

# 対策
起動設定を再作成し、「終了時に削除」を有効にすれば今後は発生しなくなる。
しかし、起動設定の「終了時に削除」はスクロールしないと見えない位置にあり、起動設定を頻繁に更新する場合は毎回目視でチェックするのは難しく、現実的ではない。

そのため、AMI作成元のEC2の「終了時に削除」設定を変更し、「終了時に削除」を有効にすることで今後作成するAMIの「終了時に削除」を有効にすることができる。
やり方は以下の記事を参照。

[【AWS/EC2】EBS自動削除をオフ→オンに切り替える方法](https://zenn.dev/supersatton/articles/348c03639376ba)

また、EC2自体を新しく構築しなおした際に「終了時に削除」が無効になると同様の事象が発生してしまうため、lambdaとCloudWatchで定期的にチェックしても良い。

[EC2(インスタンス)が削除されて残ってしまったボリュームの削除](https://qiita.com/mkawanee/items/4f06ee9a8409974f43ee)

後はCloudFormation等の構成管理ツールを使うのもありかと思いますので、状況に応じた対策をとっていただければと思います。

# 最後に
AMIの設定に応じて起動設定の内容が変わるなんて盲点でした。。。
また１つ勉強になりました。
Ansible Moleculeにてmolecule-vagrantを使用せずにVirtualBox上のVMを利用する例2


Ansible Moleculeにてmolecule-vagrantを使用せずにVirtualBox上のVMを利用する例
https://qiita.com/hiroyuki_onodera/items/32815d10cd609334353c

にてmoleculeからvagrant upなどを実行させる例を記載した。
しかし、VMのパラメーターはmolecule.ymlではなくVagrantfileに記載されているので、変更時には両方を整合性を保って編集する必要があった。
その不便を解消するため、VMのパラメーターをmolecule.ymlに設定し、Vagrantfileから参照させる例を示す。

```yaml:molecule/default/molecule.yml
---
dependency:
  name: galaxy
driver:
  name: delegated

platforms:
  - &platform
    name: node1
    box:  'generic/rhel8'
    box_version: '3.5.2' # Red Hat Enterprise Linux 8.4 (Ootpa)
    memory: 2048
    networks:
    - name: private_network
      ip: "192.168.10.14"
  - <<: *platform
    name: node2
    networks:
    - name: private_network
      ip: "192.168.10.15"

provisioner:
  name: ansible
verifier:
  name: ansible
```
platforms:下にVMのパラメーターを定義。
アンカーとエイリアスを使用して、box名、boxバージョン、メモリーサイズなどは共通化している。

Vagrantfileにおいてmolecule.ymlを読み込んで使用させる。

```ruby:molecule/default/Vagrantfile
# frozen_string_literal: true

# -*- mode: ruby -*-
# vi: set ft=ruby :

require 'yaml'

molecule = YAML.unsafe_load_file('molecule.yml', symbolize_names: true)

Vagrant.configure('2') do |config|

  molecule[:platforms].each do |platform|

    config.vm.define platform[:name] do |ins| # molecule.yml における platforms 要素の name と一致させる

      ins.vm.box = platform[:box] if platform[:box]
      ins.vm.box_version = platform[:box_version] if platform[:box_version]

      ins.vm.hostname = (platform[:hostname] || platform[:name])

      platform[:networks].each do |network|
        ins.vm.network network[:network_name], ip: network[:ip] if network[:ip]
      end

      ins.vm.provider 'virtualbox' do |vb|
        vb.memory = platform[:memory] if platform[:memory]
      end

    end
  end
end
```

Rubyなので普通にYAMLファイルの読み込みが可能。

unsafe_load_fileを使用するのは、読み込みYAMLにてエイリアス、アンカーを使用しているため。(Ruby 3.1対応)

- molecule/default/create.yml
- molecule/default/destroy.yml

などは、以下を参照

Ansible Moleculeにてmolecule-vagrantを使用せずにVirtualBox上のVMを利用する例
https://qiita.com/hiroyuki_onodera/items/32815d10cd609334353c
シェルスクリプト (bash等) で if - then - else の中身をコメントアウトした時のエラーの回避方法

## TL;DR

シェルスクリプト（POSIX 準拠）では `if` - `then` - `else` の中をコメントだけ、または空にしてはいけません。以下のシェルスクリプトを POSIX シェル（dash, bash, ksh 等）や Bourne シェルで実行すると[エラー](#エラーメッセージ)になります。

```sh
if true; then
  # echo "この行をコメントアウト"
fi

# 何も書かない場合も同様
if true; then
fi
```

このエラーは `:` （何もしないコマンド）を入れると回避できます。

```sh
if true; then
  : # echo "この行をコメントアウト"
fi

if true; then
  : echo "この行をコメントアウト" # このような書き方でも良い
fi
```

何かしらの実行可能なコードを入れれば良いので `:` だけではなく任意のコマンドや変数代入や関数定義などでも構いません。

## 解説

[POSIX シェルの文法](https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10)では if 文の `if` - `then` - `elif` - `else` - `fi`、for 文や while 文の `for`, `while` - `do` - `done` や `{ }` といった複合コマンドの中身を空にすることはできません。そのため bash 含む POSIX に準拠しているシェルや Bourne シェルではエラーになります。ただし例外的にエラーにならないシェル（zsh, yash, FreeBSD sh 等）もあります。

なお通常は中身を空にする必要はありません。開発中やデバッグなどで一時的に空だったりコメントアウトしたい時ぐらいでしょう。

```sh
# 例

if true; then
  # 何もしない
else
  echo "false"
fi

# ↓ このように書けば良い

if ! true; then
  echo "false"
fi
```

### エラーメッセージ

ちなみにエラー（文法エラー）の内容はこのようなものです。本来コマンドが来るべき所で予期せぬ `fi` （予約語）が来ているためこのようなエラーとなります。

#### dash

```sh
$ dash script.sh
script.sh: 5: script.sh: Syntax error: "fi" unexpected
```

#### bash

```sh
$ bash script.sh
script.sh: 行 5: 予期しないトークン `fi' 周辺に構文エラーがあります
script.sh: 行 5: `fi'

$ LANG=C bash script.sh # 英語の場合
script.sh: line 5: syntax error near unexpected token `fi'
script.sh: line 5: `fi'
```

#### ksh93

```sh
$ ksh script.sh
script.sh: syntax error at line 5: `fi' unexpected
```

#### mksh

```sh
$ mksh script.sh
script.sh[5]: syntax error: unexpected 'fi'
```

#### ksh88 (Solaris 10）

```sh
$ /usr/bin/ksh script.sh
script.sh[3]: syntax error at line 6 : `fi' unexpected
```

#### Bourne shell (Solaris 10）

```sh
$ /bin/sh script.sh
script.sh: syntax error at line 6: `fi' unexpected
```

**注意** Bourne shell 自身は POSIX に準拠していませんが、POSIX シェルに類するシェル（bash 等）の元となったシェルです。主に商用 UNIX で使われていたシェルですが、現在は ksh に取って代わられており Bourne shell が使われることはほぼありません。昔からのシェルの仕様であることを示すためにこの記事では参考として記載しています。
Step Functions チュートリアル

# 背景

Step Functions の書き方を勉強するため、AWS 公式のチュートリアルをやってみる。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorials.html

(公式の日本語は変なので、意味が分からない場合は英語を参照するといいかも)

# Lambda を使った Step Functions ステートマシンの作成

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorial-creating-lambda-state-machine.html

AWS Lambda 関数を使って、 `Task` ステートを実装する Step Functions ステートマシンを作成する。

## ステップ 1: Lambda 用の IAM ロールを作成する

## ステップ 2: Lambda 関数を作成する

ランタイムは Node.js 14.x を選択し、下記コードをコードソースにペースト。

```
exports.handler = (event, context, callback) => {
    callback(null, "Hello, " + event.who + "!");
};
```

## ステップ 3: Lambda 関数をテストする

テストイベントに下記データをペーストする。

```
{
    "who": "AWS Step Functions"
}
```

## ステップ 4: ステートマシンの作成

ステートマシン定義ペインで、下記のステートマシン定義をペーストする。

```
{
  "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function",
  "StartAt": "HelloWorld",
  "States": {
    "HelloWorld": {
      "Type": "Task",
      "Resource": arn:aws:lambda:ap-northeast-1:xxx:function:HelloFunction,
      "End": true
    }
  }
}
```

## ステップ 5: 新しい実行の開始

# Step Functions を使用したアクティビティステートマシンの作成

Java と AWS Step Functions を使用して、アクティビティベースのステートマシンを作成する。
アクティビティにより、ステートマシンの別の場所で実行されるワーカーコードを制御できる。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorial-creating-activity-state-machine.html

## ステップ 1: アクティビティの作成

## ステップ 2: ステートマシンの作成

## ステップ 3: ワーカーの実装

## ステップ 4: 実行の開始

Java の知識が必要だったので、アクティビティは実行できず。
(ビルドが必要だが、知識不足でビルドまで到達できず)

雰囲気としては、

- ローカルで実行したスクリプトを、Step Functions の一部に取り込める

ってことはなんとなく分かった。

# Step Functions ステートマシンを使用してエラー条件を処理する

`Catch` フィールドを使用する ステートマシンを作成する。

https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorial-handling-error-conditions.html

## ステップ 1: Lambda 用の IAM ロールを作成する

## ステップ 2: 失敗する Lambda 関数を作成する

## ステップ 3: Lambda 関数をテストする

## ステップ 4: Catch フィールドを使用するステートマシンを作成する

## ステップ 5: 新しい実行の開始

# CloudWatch イベントを使用して定期的にステートマシンの実行を開始する

## ステップ 1: ステートマシンの作成

## ステップ 2: CloudWatch イベントルールの作成
引用符以外を検索するperl

## 引用符以外の部分を検索するperl

　ある仕事で、引用符以外を検索・置換する必要があり、自宅でプロトタイプとして作成した、perlスクリプト

[source.gist] (https://gist.github.com/harasakih/0f2a95e7945856d1c68e531c31684156)
Figma APIで特定File内のFrame名を全てcsvに出力する

## この記事の概要

「Figmaで特定のFileのFrame名を一気にCSVに書き出すことはできないか？」という質問をもらいました。
この要望を叶えるための記事です。

そして、@hiloki@githubさんがJavaScriptで取得するバージョンの記事を書いていたので、こちらもどうぞ。

https://qiita.com/hiloki@github/items/d6f51c0fc65449ea1fad

## 方針

- Figma APIを使う
- 1つのFile内の全てのPageのルートにあるFrame名を全て取得する
- csvファイルとして保存する

## 準備

### Figmaのアクセストークンを取得する

`Settings > Account > Personal access tokens`

より、名前をつけてトークンを発行します。
忘れないようにメモしておいてください。

### `jq`のインストール

この後ターミナルでコマンドを叩くのですが、整形する用に`jq`を使います。

```shell
brew install jq
```

## コマンド

以下のコマンドを叩けば取得できます。

```shell
curl -H 'X-FIGMA-TOKEN: YOUR_FIGMA_TOKEN' 'https://api.figma.com/v1/files/YOUR_FILE_KEY?depth=2' \
| jq -r '.document.children[] | [.name, .children[].name] | @csv' \
| > /path/to/directory/any-name.csv
```

## コマンド内のあれこれを解説

### YOUR_FIGMA_TOKEN

`Figmaのアクセストークンを取得する`で取得したトークンです。

### https://api.figma.com/v1/files

Fileの情報を取得するためのエンドポイントです。

https://www.figma.com/developers/api#get-files-endpoint

### YOUR_FILE_KEY

各Fileの共有URLをコピーすると、以下のような書式になっています。

`https://www.figma.com/file/:key/:title`

この`key`をコマンドの中に適用します。

### depth=2

もう一度先ほどのURLを貼っておきます。

https://www.figma.com/developers/api#get-files-endpoint

この中の`depth`の項目を引用。

> Positive integer representing how deep into the document tree to traverse. For example, setting this to 1 returns only Pages, setting it to 2 returns Pages and all top level objects on each page. Not setting this parameter returns all nodes

書いてあるように`2`を指定すると、ページと各ページのすべてのトップレベルオブジェクトが返されます。
`1`だとPage名までしか取れないので、`2`を指定しました。

### .document.children[]

返ってくる結果のうち、トップレベルに`thumbnailUrl`や`role`など今回は不要な情報が混ざっています。
実際のデザインデータの情報だけを取得したいため、こちらを指定します。

### [.name, .children[].name]

最初の`.name`がPageの名前で、`.children[].name`が全てのトップレベルの要素の名前です。

`.children[].name`だけだとどのPageのFrameだったかが分かりづらくなってしまうかなと思い、先頭にPage名を入れておきました。

### @ csv

jsonをcsvに変換します。

### > /path/to/directory/any-name.csv

出力結果を任意のディレクトリに保存しているだけです。