OmniAICreator/Qiita-1.07M huggingface dataset:
UnityのRigidbody2Dのsimulatedを切ったらOnMouseDragできなくなった

# 経緯
ある日、落ち物ゲームを開発していました

落とすオブジェクトを始めは画面上部に固定しておいて、「落とす」ボタンを押した時に落下を始める様にしました。この固定/落とす仕組みは`Rigidbody2D.simulated`を切り替えることによって実装していました。

その後、落とすオブジェクトをマウスドラッグ操作で移動させられるように`OnMouseDrag`関数内に移動スクリプトを書きました。

すると、落とすオブジェクトが画面上部に固定されている最中はドラッグ移動が出来ず、「落とす」ボタンを押して以降、物理演算が有効になっている最中のみドラッグ移動が出来るようになりました

# 結論
物理演算を切った状態でドラッグしたい時は`Rigidbody2D.isKinematic = true`を使いましょう

# なぜ
`Rigidbody2D.simulated`の[公式リファレンス](https://docs.unity3d.com/ja/2018.4/ScriptReference/Rigidbody2D-simulated.html)には以下の様に書かれています

>シミュレーションしない場合、アタッチされているすべての Collider2D や Joint2D は物理シミュレーションに組み込まれません。

また`Monobehaviour.OnMouseDrag`関数の[公式リファレンス](https://docs.unity3d.com/ja/2019.2/ScriptReference/MonoBehaviour.OnMouseDrag.html)には以下の様に書かれています

>OnMouseDrag はユーザーが GUIElement または Collider をマウスでクリックし、ドラッグしている間呼び出されます。

すなわち、`Rigidbody2D.simulated = false`の時はコライダーが反応しなくなっているので`OnMouseDrag`関数が呼ばれないと推測できます
永世名人が考える「運」とはっ！

##前書き

著名なアスリート、経営者など多くの偉大な先人が「運」について語っている。
今日読んだ致知出版社[『1日1話、読めば心が熱くなる365人の仕事の教科書』][1]。将棋棋士、谷川浩司さんの記事も「運」について語っていた。

『「運」という不確実なものについて、世の先人たちが語る「運」には、ある種の共通項があるのではないか？』
これまでも「運」について語る先人たちの記事を読んできた私は、そう思い始めている。

毎日続けている読書感想文、１日１話の記事の読書も「７月３０日」目だ。エンジニアのみんなにも有益だと思う記事はQiitaにもいくつかアップしてきた。
今７か月目を終えるところだが、これからもきっと「運」について語る記事と出会うだろう。
ということで、「運」について語る記事について「運シリーズ」というタグを振ることにし、先人たちが語る「共通項」について今後も考察してみよう、という話です。

[1]:https://www.amazon.co.jp/1%E6%97%A51%E8%A9%B1%E3%80%81%E8%AA%AD%E3%82%81%E3%81%B0%E5%BF%83%E3%81%8C%E7%86%B1%E3%81%8F%E3%81%AA%E3%82%8B365%E4%BA%BA%E3%81%AE%E4%BB%95%E4%BA%8B%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E8%97%A4%E5%B0%BE%E7%A7%80%E6%98%AD/dp/4800912474




##本題　【7月30日】 運を無駄使いする人、味方につける人 <br>　　　 谷川浩司 日本将棋連盟棋士九段　

谷川浩司。棋士。十七世名人の資格を保持する超一流の将棋棋士である。
今、将棋界は藤井聡太棋士が史上最年少記録の四冠目制覇でセンセーションを起こしているが、谷川もかつて天才少年としてデビューし、史上最年少名人を勝ちとった。
そして、四冠王となっている。谷川は引退後に「十七世名人」としての栄誉の称号を得ることが約束された棋士である。
後に、天才羽生善治が現れ、羽生との闘いはゴールデンカードと呼ばれ世間の注目を浴びた。
今、一世代離れた藤井聡太が、棋士界のスター少年として注目を浴びている時期に、谷川の記事に出会ったのは興味深い。
1962年生まれ。御年59歳。

谷川が語るのは「運」。
ほう、これまでもこの本で数々の先人が「運」について語ってきたが、永世名人が語る「運」とはどんな話だろう。

>『私は、一人ひとりが持っている運の量っていうのは平等だと思うんです。そして、運が悪い人というのは、つまらないところで使っているんじゃないかと思うんです。
　将棋の棋士を見ていると、例えばトップクラスの棋士がやっぱり一番将棋に対する愛情、敬意をもって接していますね。対局前の一例にしても、羽生善治さんをはじめとするトップの人ほど深々と礼をするんです。その姿勢は相手が先輩でも後輩でも変わらない。そして対局後に「負けました」と言うのは一番辛いですけれども、それでもやっぱり強い人ほどハッキリ言うんですね。
　それから、棋士の中には対局開始前ギリギリにやってくる人もいます。さすがにトップ棋士は対局の十分、十五分前にはちゃんと対局室に入るけれども、そういう心掛けのできていない人は、電車が遅れたりしたら大変です。なんとか対局に間に合ったとしても、その人はそこで運を使い果たしていると思うんです。
　将棋も囲碁も先を読みますが、どんなに頑張ってもどこか読み切れない部分があります。そういう最後の最後、一番大事なところで運が残っているかどうかというのが非常に大事だと思うんです。
　ですからどんな対局であっても、与えられた条件で最善を尽くして運を味方につけることが大事です。
　対局の持ち時間を残して勝負をあっさり諦めるような人は、やっぱり成績も振るわないし、最後の最後の大事な場面で勝ちを逃すことが多いような気がします。』

なるほど。永世名人・谷川が語る「運」。それは

**『どんなに頑張ってもどこかに読み切れない部分』、『そういう最後の最後、一番大事なところ』で【頼るもの】**

と理解した。

そして、谷川が【頼る】その「運」は、ほかの先人が語るように、

**やはり「自分自身で掴み取るもの」であった。**

**日ごろから、気を抜いてはいけない。横柄にやってはいけない。与えられた条件で常に最善を尽くせ、**と。

そして、
**「運」とは皆平等にあるものだから、自分が「ここぞ」と頼りたいときに「使え」**　と。
「使え」というのは語弊があるかも。自分で使える類のものではないからな。**「くだらないところで使っちまうようなことはするな」**かな。

谷川は続ける。
>『よく天才とか才能とかいう言葉を使うんですけれども、それは決して一瞬の閃きではなくて、毎日の積み重ねが自然にできることがやっぱり才能だと思いますね。
　どんなに酷い負け方をしても、翌朝には盤の前に自然と座れることが大事で、やけ酒を飲んで次の日を無駄にしてしまうような人は、やっぱりだんだん差をつけられていくんでしょうね。
　私は最近「心想事成（しんそうじせい）」とうう言葉が好きでよく揮毫させていただくんです。心に想うことは成るという意味ですが、そのためには平素からどれだけ本気で勝負に打ち込んできたかということが大切だと思います。
　真剣に、本気で打ち込んできた時間が長く、思いが強い人ほどよい結果を得ることができるし、そのための運も呼び寄せられるのではないでしょうか。
　勝負の神様はそういうところをきちんと見ておられるし、それはその対局の時だけでなく、普段の生活すべてを見ておられると思うんです。
　もちろん人間ですから一日中将棋のことを考えているわけにはいきませんが、体の中心に将棋というものが軸としてあるか、そこが問われると思います。』

ふむ。『心想事成（しんそうじせい）』か。この本の【5月19日】の記事、[**植松努さんのTED動画、『思うは招く』**][2]に通じるコトバだ。いや、同じ意味のコトバだ。
**「心に想ったことは叶うのだ。」** そういう、ポジティブで勇気を与える意味のコトバだ。
逆にいうと、
**心に想わないことは叶わないのだ。**自分が思いもしなかったことが訪れるはずもない。
思うからこそ、行動し、成功へと近づき、それは訪れるのだ。


私の尊敬する、荒木飛呂彦先生の作品「ジョジョの奇妙な冒険」の第5部主人公、ジョルノ・ジョバーナを彷彿とさせる。
未来への希望、そして、覚悟。
永世名人、谷川浩司さんは、私の中では、ジョルノ・ジョバーナという結論になった。


[2]:https://qiita.com/takeC74/items/fcc22c9a0e27bc8b0f46

（参考）

https://ja.wikipedia.org/wiki/%E8%B0%B7%E5%B7%9D%E6%B5%A9%E5%8F%B8

http://jojotheworld.com/giorno-meigen9-547.html


##後書き


なお、関連する以下の２つの過去執筆記事にも「運シリーズ」のタグを付けました。
こちらもよろしければ是非読んでください。

https://qiita.com/takeC74/items/fcc22c9a0e27bc8b0f46

https://qiita.com/takeC74/items/c496778447ea86ce8769
WAS設計その2 DMとNAの同期設定

備忘のような勉強メモのような

安全のためか、DMとNAの同期を停止する。

まぁお客様要望に合わせて設定するのが望ましい。



![eee1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291303/4d65dbeb-24e7-0569-7fd6-b330143519f8.png)
WAS設計その1 WASの仮想ホスト復習（ポート＆MIME設定）

備忘のような勉強メモのような

仮想ホスト設定について

IHS側のリッスンポートが80の場合はほぼ考慮不要だけど
対応①
81番とか82番みたいなポートで接続を受ける場合、仮想ホストに設定を追加するが必要ある。

対応②※必要に応じて
アプリケーションをインストールする際に、仮想ホストを「default_host」以外で構成している場合は
この部分も修正が必要です。

![eee.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291303/6fce6381-fef8-ff2c-a8eb-125727a917d4.png)


あと特別なMIMEをアプリケーションサーバ側に認識させたい場合は、それも仮想ホストに
追加しましょう。
JetBrainsのTypeScriptのコードスタイル設定（随時更新）

### 新しく追加するimport文の読み込みでシングルクォーテーションを使う
以下の順番で設定を修正する

1. Preferences
1. Editor
1. Code Style
1. TypeScript
1. Punctuation
1. Use `single` quotes `in new code`


### prettierでフォーマットする
1. プラグイン`Prettier`をインストールする
1. Preferences
1. Languages & Frameworks
1. Prettier
1. Prettier packageを選択（npmでインストールした`nodemodules/prettier`）
1. On `Reformat Code` action や On Saveにチェックを入れる
AWS CloudFormation nest stacks

### VPC,SecurityGroup別々のtemplateで作る
1. VPCのtemplate network/network.yaml

```
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  # a) Create a VPC
  myVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: "true"
      EnableDnsHostnames: "true"

Outputs:
  myVPC:
    Value: !Ref myVPC
```
2.  SecurityGroup template monitor/monitor.yaml

```
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  myVPC:
    Type: AWS::EC2::VPC::Id
Resources:
  SecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "My security group"
      VpcId: !Ref myVPC
      SecurityGroupIngress:
        - CidrIp: "0.0.0.0/0"
          FromPort: 22
          IpProtocol: tcp
          ToPort: 22
        - CidrIp: "0.0.0.0/0"
          FromPort: 80
          IpProtocol: tcp
          ToPort: 80

```
注意：TypeはAWS::EC2::VPC::Idです。 
3. root template root_template.yaml他のtemplateを取り込む。

```
AWSTemplateFormatVersion: "2010-09-09"
Resources:
  myNetwork:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: network/network.yaml
  myMonitor:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: monitor/monitor.yaml
      Parameters:
        myVPC: !GetAtt myNetwork.Outputs.myVPC
```
AtCoder Beginner Contest 228の[B - Takahashi's Secret]をSwiftで

SwiftでAtCoder Beginner Contest 228の「B - Takahashi's Secret」を解きました。

## 問題内容

>問題文
高橋君には N 人の友達がいます。N 人の友達はそれぞれ、友達 1 、友達 2 、… 、友達 N というあだ名で呼ばれています。
ある日、高橋君はある恥ずかしい秘密を、友達の一人である友達 X に知られてしまいました。
i=1,2,…,N について、友達 i が高橋君の秘密を知ったとき、友達 A iがまだ高橋君の秘密を知らなければ、友達 i は高橋君の秘密を友達A iにも教えてしまいます。
高橋君の秘密は最終的に何人の友達に知られることになるでしょうか？

https://atcoder.jp/contests/abc228/tasks/abc228_b

## 解答コード

```swift
func abc228B(){
    let array = readLine()!.split(separator:" ").map{Int($0)!}
    var n = array[0]
    let x = array[1]
    let friendArray = readLine()!.split(separator:" ").map{Int($0)!}
    
    var result : [Int] = [x]
    
    func secret(_ num: Int) -> Int {
        n -= 1
        if n != 0 {
            let an = friendArray[num - 1]
            result.append(an)
            return secret(an)
        } else {
            return Set(result).count
        }
    }
    print(secret(x))
}
abc228B()
```
再帰関数を使って秘密を話した人の番号を配列に格納し、最後に配列の重複を除いた個数を出力しています。

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
Couchbase Mobile 開発：データ同期パターン〜ユーザーエクスペリエンス向上

## はじめに

Couchbase Mobileは、オフラインファーストアプリケーションの幅広いユースケースに対応することが可能です。

ここでは、Couchbase LiteとSync Gatewayとのデータ同期に関して、ユーザーエクスペリエンスを向上するための設計パターン（ベストプラクティス）について説明します。

## アプリがバックグラウンドにある間に、データを最新の状態に保つ


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/9f0b462b-9ad9-8dd2-48a1-d7a0c49d14e9.png)



### ユースケース
アプリは、アクティブに（またはフォアグラウンドで）使用されていないときにデータを最新の状態に保つことで、その後の起動時の起動時間を短縮し、ユーザーエクスペリエンスを向上させることができます。

### アプローチ

アプリがバックグラウンドにプッシュされると、Couchbase Liteの連続レプリケーションはオフラインモードに移行します。

モバイルアプリのバックグラウンドサポートは、プラットフォームによって大幅に異なります。したがって、アプリがバックグラウンドにあるときにデータを同期する方法は、プラットフォームに依存します。


#### Android
Androidで、バックグラウンドでタスクを実行する必要がある場合、いくつかのオプションがあります。
バックグラウンドで長時間実行されるレプリケーションにはフォアグラウンドサービスを使用します。
または、Work Managerを使用して、ワンショットレプリケーションをスケジュールし、バックグラウンドで非同期に実行するか、Remote Firebase Cloud Messaging（FCM）を使用して、ワンショットレプリケーションを実行するためのリクエストを実行することも考えられます。

#### iOS

Apple Push Notification Sevice（APNS）を使用してサイレント通知を送信し、バックグラウンドでアプリをウェイクアップするか、バックグラウンドアプリリフレッシュを使用してシステムがアプリを適切にウェイクアップできるようにします。
アプリがバックグラウンドでウェイクアップされたら、ワンショットレプリケーションを実行してデータを同期します。

以下のブログで、iOSのバックグラウンドサポートの詳細が説明されています。

https://blog.couchbase.com/background-sync-couchbase-mobile-ios/



## ドキュメントを同期する優先順位を制御する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/9e20ae59-e4b9-95d2-59e4-8d30ec5e4bfe.png)


Sync Gatewayでは、チャネルを使用して、ドキュメントを分類することができます。これを利用して、優先度に基づいてデータを分類し、チャネルによって同期の方法を変えることによって、ドキュメントを同期する優先順位を制御することができます。

### ユースケース
クライアントが受信したドキュメントに優先順位を付けることにより、クライアントは、残りのドキュメントが同期するのを待たずに、ドキュメントをプルするとすぐに、最も関連性の高いドキュメントの変更に取り掛かることができます。残りの優先度の低いドキュメントの変更は後でプルダウンします。これにより、最初の起動時のアプリの応答時間が短縮されます。

### アプローチ
優先度に基づいてドキュメントを異なるチャネルに割り当てます。たとえば、ドキュメントを「低」、「中」、または「高」の優先度を表す異なるチャネルに割り当てることができます。
クライアント側では、最初の起動時に、チャネルフィルタを指定して、優先度の高いチャネルのワンショットプルレプリケーションを実行します。チャネル内のドキュメントの同期が完了した後に、アプリは残りのチャネルの別のレプリケーションを開始します。
また、優先度の高いチャネルに継続レプリケーションを設定しリアルタイムで最新の状態に保ちながら、残りのチャネルについては、ワンショットレプリケーションを使用してオンデマンドでプルすることも考えられます。

## プレビルドデータベースを利用する

Couchbase Liteは、アプリケーションに、あらかじめデータが登録されたデータベース（プレビルドデータベース）をバンドルする機能があります。
モバイルデータベースには、このような機能を持たないものもあります。特にそのようなデータベースでは必要になりますが、アプリケーションを初めて利用する際に、サーバーからデータをダウンロードすることも考えられます。プレビルドデータベースを使うことによって、このような初期データロードプロセスをオミットあるいは、あらかじめアプリに同梱することが難しい最新のデータにのみ限定することが考えられます。

## デルタ同期を利用する

Couchbase Mobileには、ドキュメント中の変更があった部分のみ送信して、データ同期を実現することのできるデルタ同期機能があります。このような機能を適材適所で利用することによってもユーザーエクスペリエンス向上を計ることができるでしょう。

## 参考情報

https://blog.couchbase.com/best-practices-couchbase-mobile-database-sync-part2/


https://docs.couchbase.com/userprofile-couchbase-mobile/current/userprofile/userprofile_sync.html
AWSの障害でアカウント新規作成時にカードが通らなかった話(2021/11/15発生～2021/11/22解消)

#概要#
2021/11/15にAWSのアカウントを作ろうとしたら、カードの認証が通らなかった。
2021/11/22にAWS側から連絡があって、障害があって通ってなかったとのことだった。
本日、無事に登録ができた。

#詳細#
![本人確認失敗.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286510/30e5e724-eae2-ac7b-aadc-6d6290a87ae3.png)
AWSのアカウントを作ろうとしたら、本人認証のSMSのPINを送る段階で上記の様な表示が出る。
カードほかのところでは普通に使えるのになんで～？と思いながら、色々調べてみた。
ちなみに、VISA,MASTERどちらも試したけどだめだった。（JCBはもってなかった。）

#銀行に確認#
https://compass-note.hatenablog.com/entry/aws-credit-card-validation-error

上記の記事を参考に、カードは楽天銀行ではなかったけど、もしかして支払いがブロックされてるの？と思って銀行に確認。
銀行からは、「そもそも(確認用の1ドルの)支払いがきていないですよ。」と言われてしまった。
ブロック以前の問題だった。

#AWSのサポートに問い合わせ#
こちらで出来そうなことはもうなさそうだったので、AWSのサポートに問い合わせをした。

AWSのサポートからは問い合わせの一日後に、

・認証が通らないのはなぜか調べてみます
・ほかのカードがあるなら試してみてください。

と返信がきた。(2021/11/16)

#それから一週間後#
一週間後(2021/11/22)、下記のように追加の返信がきた。

＞一部の地域においてサインアップ時または支払いのためにアカウントに新しいカードを追加する際に VISA クレジットカードを使用できない問題が発生いたしておりました。
＞この問題につきましては、11 月 20 日午前 6 時 19 分 (太平洋時間) 時点で解決され、現在はご登録のクレジットカードを正常にご利用いただけるようになっております。

そうだったんだ！

#解決#
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2286510/b5019d8a-ebf6-7a5e-e602-96a8246268d6.png)

同じカードのまま、無事にサインアップできました。よかった～。

以上です。
ReDocを用いたAPI仕様書の作成手順

# ReDocとは
[ReDoc](https://github.com/Redocly/redoc)とは、OpenAPI/Swagger仕様で記述されたyamlファイルからhtmlファイルを生成し、静的なドキュメント作成をするツール。

# API仕様書の作成手順
## 動作環境
MacOS Catalina 
## Step1: nodebrewのインストール 
```
brew install nodebrew
nodebrew -v
nodebrew ls-remote
nodebrew setup
echo 'export PATH="$HOME/.nodebrew/current/bin:$PATH"' >> ~/.bash_profile
```
## Step2: nodeのインストール
```
nodebrew install-binary stable
nodebrew ls
nodebrew use stable
nodebrew ls
node -v
```
## Step3: yarnのインストール 
```
brew install yarn
yarn -v
```

## Step4: yarnを用いたReDocのインストール
```
mkdir redoc_sample
cd redoc_sample
yarn add redoc
yarn add redoc-cli
yarn list redoc
```

## Step5: swagger.ymlの作成 
```
vim swagger.yml
```
[swagger.ymlの作成例](https://github.com/swagger-api/swagger-codegen/blob/master/modules/swagger-codegen/src/test/resources/2_0/petstore.yaml)等を参考にOpenAPI/Swaggerフォーマットに則りyamlファイルを作成

## Step6: ymlからhtmlへの変換(API仕様書ページの作成) 
```
npx redoc-cli bundle swagger.yml -o index.html
open index.html
```
AtCoder Beginner Contest 228の[C - Final Day]をSwiftで

SwiftでAtCoder Beginner Contest 228の「C - Final Day」を解きました。

## 問題内容

>問題文
N 人の生徒が 4 日間にわたる試験を受けています。
それぞれの日に行われる試験は 300 点満点です。すなわち、4 日間を通した試験の満点は 1200 点です。
現在 3 日目までの試験が終わり、これから 4 日目の試験が行われようとしています。i(1≤i≤N) 番目の生徒は j(1≤j≤3) 日目の試験で P i,j点獲得しました。
それぞれの生徒について、4 日目の試験後に上位 K 位以内に入っていることがあり得るかどうか判定してください。
ただし、4 日目の試験後の生徒の順位は、その生徒よりも 4 日間の合計点が高い生徒の人数に 1 を加えた値として定めます。

https://atcoder.jp/contests/abc228/tasks/abc228_c

## 解答コード

```swift
func abc228C(){
    let array = readLine()!.split(separator:" ").map{Int($0)!}
    let n = array[0]
    let k = array[1]
    
    var result : [Int] = []
    
    for _ in 0..<n{
        result.append(readLine()!.split(separator:" ").map{Int($0)!}.reduce(0, +))
    }
    var result_ = result
    
    result_ = result_.sorted(by: >)
    let limit = result_[k - 1] - 300
    
    for i in result{
        if i >= limit{
            print("Yes")
        }
        else{
            print("No")
        }
    }
}
abc228C()
```
現時点での全員の点数を配列にして高い順に並び替え、K位（配列のK番目）の人の点数 - 300点未満の人には`NO`、それ以外の人には`Yes`を出力しています。

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
PowerVC 2.0.2 設定 ~ Network 定義 ~ 

##### はじめに

PowerVC のネットワーク定義設定のログです。


参考：

https://www.ibm.com/docs/ja/powervc/2.0.2?topic=powervc-planning-networks


---

##### 環境

・PowerVC 2.0.2 (RHEL 8.4(ppc64le) on Power)

・HW: Power Systems S824 (8286-42A)
・Hardware Management Console(HMC) V10.1.1010
・VIOS(Virtual I/O Server) : v3.1.2.10
　　- VLAN、SEA 等は定義済みです。



---
##### 設定

1) GUIでログインし、Networks を選択

![NW1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/5ecd7c00-1a92-016e-9e5c-a33fe32f677e.png)

2) Add network で設定値を入力

![NW2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/6c3fdf9e-6ed1-8f98-2f49-633a5f1bbee8.png)

VLAN ID は、VIOS で定義しているネットワークを設定します。

3) SEA タブ確認

![NW3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/e4bff2ed-7247-c658-722d-d5d6ced1700a.png)

SEA タブ画面では、登録筐体から取得し情報から対象VLAN のネットワーク情報が取得されています。
VLAN 1 は VIOS1 および VIOS2 の ent3、vSwitch Ethernet0 に紐づいています。


Add  を押して設定します。

4) 確認

VLAN1 が PowerVC で設定されたことを確認。

![NW4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/32648f8c-8267-0d10-12cc-0a833a0b990e.png)



---

これで PowerVC が定義する Network 構成の設定が1つできました。
複数のネットワークを使用する場合は、同じ手順で設定します。



以上です。
M1 MacBookでMediaPipe(C++, Python)を。

M1 MacBook Airは所有しているのですが、MacBook Pro欲しいですよねーと思い、そーだ、[Mediapipe](https://google.github.io/mediapipe/)が動いたら買おう！ と。自分への言い訳をしつつこれを書くに至りました。


## MediaPipe(C++, Python) on Ubuntu20.04, VNC, aarch64 (M1 MacBook, Docker)

はじめ Native M1でビルドしようと頑張ってみたのですが、どうにもならなかったのでDockerにしました。※1
macOSではカメラデバイスが /dev/video0 ではないので MJPEG over httpにしています。
（Windows Docker or WSLでもこの方法使えるんじゃないですかね）

以下の図のような構成、環境となってます。意図は一目瞭然ですかね。

![structure-chart.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154910/aa946e36-fda2-b2ec-afbc-60dc9e3417a1.png)

※1 コメントで教えてもらった情報にしたがったらM1 Nativeでも動いちゃいました。
あとは[play_with_tflite](https://github.com/iwatake2222/play_with_tflite)がビルドできればなぁ・・・
（来週MacBook Proが届いたら書く気になるかも）

## 環境構築

Dockerfileは以下に置いてあります。記載に従ってくださいませ。

- https://github.com/kose/dockerfiles/tree/main/mediapipe
URLとURIは同じ？違う？

WebAPIの勉強をしているときにURIという名前が出てきて、「あれ、URLと何が違うんだろう？」と思っていろいろ調べてみました。その時に分かったことをまとめました。

# 結論

**URLとURIは違うっちゃ違う。** あいまいな結論ですが、URIとURLはほぼ似たようなものでURIの中にURLがあり、URI＝URL+URN で構成されています。同じものをURLとURIの両方で呼べたりするので全く違うと言い切るのは怖いです。

いつも皆さんがURLと呼んでいるであろう「`https://www.....`」はURIと呼ぶこともできます。
そのため、これってURI？URL？と迷ったらとりあえずURIと言っとけば大丈夫です（）。

以降はURI、URL、URNについて説明していきます。

# URIとは

**Uniform Resource Identifier** の略。日本語に言い換えると、**統一資源識別子** で、インターネット上に数多く存在するファイルを識別する総称のことを指します。

インターネット上のファイルを識別するために必要なのが、ファイルの名前（URI）とファイルの場所（URL）になります。
よって、先ほど述べたように **URI(ファイルの識別子) = URL(ファイルの場所) + URN(ファイルの名前)** で構成されています。

# URLとは

**Uniform Resource Locator** の略。日本語に言い換えると、**統一資源位置指定子** で、インターネット上に数多く存在するファイルの住所・場所を指します。

具体的には、皆さんがURLと聞いて頭に浮かぶであろうこんなやつです。
https://qiita.com/Ryu_2000
これをURIと呼んでも大丈夫です。

# URNとは

**Uniform Resource Name**の略。日本語に言い換えると、**統一資源名** で、インターネット上に数多く存在するファイルの名前を指します。

このURNという名前を皆さんはあまり聞いたことがないのではないでしょうか。それもそのはず、一般のユーザの目に触れることはあまりなく、Web側で認識されている名前なのです。具体的には `urn:****:****` という形式で表現されます。

はっきり言ってあまり触れる機会はないと思うので、頭の片隅に置いておく程度でよいかと思います。

# さいごに

以上がURLとURIが同じかどうかについてでした。ただ、なぜWebAPIの話になるとURLではなくURIという名前がよく使われるのかはわかりませんでした。そういうものなんですかね？知っている方は教えていただけると幸いです。

それではよい1日を！
イベントハンドラにイベントオブジェクトと引数を同時に渡すとき

##この記事の背景
ReactNativeを使っていたのですが、onPressを使用するときにイベントバブリングを解消する必要がありました。
そのため、イベントオブジェクトとイベントリスナの引数を渡そうとしたのですが、、


イベントオブジェクトと引数を同時に渡すにはどう記述したら良いのかわからない　...業務上TypeScriptで書く必要がある...


という状態になり、何となく日本語の記事が少ないと感じたため少しだけメモします。。

###eについて少しだけメモ

イベントハンドラに`e`や`event`といった引数を渡しているところを見たことがあると思います。
この`e`や`event`のことをイベントオブジェクトといいます。このeには関数が含まれており、イベントの追加機能や情報を提供する目的でイベントハンドラーに自動的に渡されます。

つまり何かしらのユーザーの動作(クリックするとかタップするとか)でどのような動作を起こすのかがデフォルトで決まっているんです。それを抑制したり指定したりすることができます。

##イベントオブジェクトと普通の引数を同時に渡す

結論、二つの書き方があり、ES6では下のような書き方もできるそうです。

```javascript
EventHandler = (e: EventType, variable :string) => {
   e.preventDefault();  
   console.log(variable)
}
.
.
.
<div onClick={(e) => EventHandler(variable)}>pass variable and event object</div>
```

```javascript
EventHandler =  (variable: string) = (e: EventType)=> {
   e.preventDefault();  
   console.log(variable)
}
.
.
.
<div onClick={EventHandler(variable)}>pass variable and event object(ES6)</div>
```


EventTypeには`onClick`や`onPress`などどのイベントリスナを使うかで変わってきてしまうのでそのイベントリスナに合った型を入れてください！


何か違う点などありましたら遠慮なくコメントで教えていただけると幸いです！
SELinux の設定確認ができない

#環境

Centos(Dockerにて起動)


#問題

getenforce にて現在のSELinuxの動作モードを確認できませんでした。

```
getenforce

bash: getenforce: command not found
```

Docker のCentos にはデフォルトではSELinux はインストールされていないようです。



#対処法

SELinux のインストールすれば解決です。
以下の手順でインストールできます。

```
yum -y install selinux-policy-targeted setools

getenforce
Disabled
```

これでSELinuxの動作モードが確認できました。
なお、DisabledなのでSELinuxが無効になっています。
wsadminで設定し、設定できたことを確認する(ServerIOTimeout編)

```jvminfo.txt
yyd1Node01,server1
yyd1Node01,server2
yyd2Node01,server1
```
設定コマンド実行

/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh -username wasadmin -password wasadmin -f WebserverPluginSettings_set.py

設定値を変数渡しをしたい場合はこちらのコードを参照してください。
※いつか直します。。。
https://qiita.com/XKYUXSOX/items/7f33c1ee19827030f0a7

```WebserverPluginSettings_set.py
import csv

with open('jvminfo.txt') as f:
    csvreader = csv.reader(f)
    for row in csvreader:
      nodename=row[0]
      servername=row[1]
      id=AdminConfig.getid('/Node:'+nodename+'/Server:'+servername+'/')
      ProcessID = AdminConfig.list('WebserverPluginSettings',id)
      print nodename + servername
      AdminConfig.modify(ProcessID,'[[ConnectTimeout "-1"]]')
      AdminConfig.modify(ProcessID,'[[ServerIOTimeout "901"]]')
      AdminConfig.modify(ProcessID,'[[MaxConnections "-1"]]')

AdminConfig.save()
```

設定されたことを確認コマンド実行

/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/bin/wsadmin.sh -username wasadmin -password wasadmin -f WebserverPluginSettings_get.py

```WebserverPluginSettings_get.py
import csv

with open('jvminfo.txt') as f:
    csvreader = csv.reader(f)
    for row in csvreader:
      nodename=row[0]
      servername=row[1]
      id=AdminConfig.getid('/Node:'+nodename+'/Server:'+servername+'/')
      ProcessID = AdminConfig.list('WebserverPluginSettings',id)
      print nodename + servername
      print AdminConfig.showAttribute(ProcessID,'ConnectTimeout')
      print AdminConfig.showAttribute(ProcessID,'ServerIOTimeout')
      print AdminConfig.showAttribute(ProcessID,'MaxConnections')

```
SAP Data Provisioning AgentをLinux(RHEL7.7)にインストールする

# はじめに

社内のオンプレSAPシステムとクラウドを仲介する**Data Provisioning Agent(以下、DPAgent)**をLinuxにインストールする手順を記します。
こちらが[公式ドキュメント](https://help.sap.com/viewer/7952ef28a6914997abc01745fef1b607/2.0_SPS05/en-US/dd8aaa71a6d4490485b8eb5123f46149.html)となります。

# 環境の確認

コマンドを叩いてOSバージョンを確認しておきます。

```shell
cat /etc/redhat-release
# Red Hat Enterprise Linux Server release 7.7 (Maipo)
```

# インストーラを入手する。

SAPのサイトからインストーラを入手します。
https://tools.hana.ondemand.com/#cloudintegration

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533960/9c62e37a-a63d-0936-92d9-2bdc4a442acf.png)

# DPAgentインストーラを解凍する。

※バージョンが上がっている可能性があるので、zipファイル名は適宜修正します。

```shell
# zipファイルの保存先にディレクトリ移動
# homeのユーザディレクトリ配下にzipを配置した想定
# ???はユーザ名
cd /home/???/
# 解凍コマンド実行
unzip installer.DPAgent-2.5.5-rc11-linuxx86_64.zip
```

# DPAgentをインストールする

agent_listener_portは、通常5050を指定するみたいです。
agent_admin_portは、通常5051を指定するみたいです。

```shell
# インストール先のディレクトリを作成
# ???はユーザ名
mkdir /home/???/sap/dataprovagent
# インストールコマンドを実行
HANA_DP_AGENT_20_LIN_X86_64/hdbinst --silent --batch --path="/home/???/sap/dataprovagent" --agent_listener_port=5050 --agent_admin_port=5051

```


# DPAgentのアンインストールする

[公式ドキュメント]
(https://help.sap.com/viewer/7952ef28a6914997abc01745fef1b607/2.0_SPS05/en-US/f57aaed4101640d2a1f6effcbeb63e9a.html)を参考にしてください。

```shell
# インストールディレクトリに移動
cd /home/???/sap/dataprovagent
# アンインストール
HANA_DP_AGENT_20_LIN_X86_64/hdbuninst --path "/home/???/sap/dataprovagent"
```

# まとめ

SAPホームページからzipダウンロードして、公式ドキュメントの記載通り、コマンドを実行していきます。
英語ドキュメントに慣れていない方に向けて、日本語で手順をまとめました。


以上です。
Laravelで、「laravel new [アプリ名]」の実行が失敗する場合の対策

Laravelでアプリケーションをnewしようとしたとき、メモリ不足などのエラーが出てスムーズにいかなかった。
結果として、以下の「３つの対策」で通ったので、備忘録としてメモ。(2021/11/22)

## 対策１：composerのバージョンを１から２へアップグレード
下記をコマンドラインで実行すればOK
```
$ composer self-update --2
```

## 対策２：php.iniで、phpのメモリ制限を「無制限」に変更
```
php.iniのlimit_memoryを-1（無制限）に変更する
```

## 対策３：php.iniに、php_fileinfo.dllを追加
php.iniに以下を追加
```
「extension=php_fileinfo.dll」
```

## まとめ
上記３つの対策後、再度
```
$ laravel new test
```
などとすることで、無事成功しました。
【Python】クラス内にデコレーターを定義して、子クラスで使用する

```python
class Parents(object):
    # classmethodにしないと、インスタンス化しなければならないため
    @classmethod
    def deco(cls, func):
        def wrapper(self, *args, **kwargs):
            print('start')
            params = func(self)
            print(params)
            print('stop')
        return wrapper


class Children(Parents):
    self.C = 'C'

    @Parents.deco
    def build(self):
        print('A')
        print('B')
        return self.C
```
CSSのまとめ

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


+ [標準画面をcssの上書きでハックする](https://qiita.com/Keiji_otsubo/items/195dacaeb7bd4760fbf4)
+ [cssを使って非表示にするテクニック](https://qiita.com/Keiji_otsubo/items/5d62e4e022e6b0a9cca2)

# Auraでの書き方

全ての要素で反映される

```
.THIS {
	font-size: 12pt;
}
```

<H1></H1> で反映される
ただし、意図せぬところでH1が使われている（デフォルトで使われている）場合にも反映されるので注意

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/a20b4c9d-def1-93b4-3bdb-07bc2a8b90d4.png)


```
.THIS H1 {
    font-size: 18pt;
    color: red;
}
```

<H1 class="H1"></H1> 
classを使用した方が副作用はないかもしれない

```
.THIS .H1 {
    font-size: 18pt;
    color: red;
}
```
【Ruby のまずいコード】Pathname で与えられたディレクトリーでの glob

# お題

Pathname オブジェクトでディレクトリーパスを与えると，そのディレクトリー（サブディレクトリーも含む）内の HTML ファイルのパスの一覧を表示するメソッドを定義してください。
表示されるパスは，与えられたディレクトリーパスからの相対パスとします。
HTML ファイルの拡張子は `.html` のみとします。

# コード

```rb
require "pathname"

def show_htmls(dir)
  Pathname.glob(dir + "**/*.html") do |path|
    puts path.relative_path_from(dir)
  end
end
```

# 改善

[Pathname](https://docs.ruby-lang.org/ja/3.0.0/class/Pathname.html) クラスの `glob` はクラスメソッド版 [Pathname.glob](https://docs.ruby-lang.org/ja/3.0.0/method/Pathname/s/glob.html) のほかにインスタンスメソッド版 [Pathname#glob](https://docs.ruby-lang.org/ja/3.0.0/method/Pathname/i/glob.html) があります。
後者を使うと

```rb
require "pathname"

def show_htmls(dir)
  dir.glob("**/*.html") do |path|
    puts path.relative_path_from(dir)
  end
end
```

と書けます。
#PowerApps コントロール初期化をする2つの方法

Form コントロールを利用しない画面を作っているシーンを眺めてて。コントロールの初期化で戸惑う方を連続して観測したので簡単にまとめておく次第です。この記事の期待する主な用途としては「ここ見て試して」（URL ぽーい）です。

# 初期化とは？
コントロールの値を初期状態に戻すコトですね。改めて書く必要はないだろう、と思いつつも念のために記載しておきます。TextInput コントロール等であれば Default プロパティの値へ戻す、ってコトです。

例えば、編集画面を提供してて「全部、元の状態へ一気に戻したい」みたいなシーンを想像してください。

# 動作イメージ
百聞は一見に如かず、ということで。左側が後述の方法1、右側が方法2になります。

<blockquote class="twitter-tweet"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> Reset property &amp; Reset function <a href="https://t.co/6amgOVsLwD">pic.twitter.com/6amgOVsLwD</a></p>&mdash; やま (Yama)📢書籍『Power Apps入門』10/20発売 (@yamad365) <a href="https://twitter.com/yamad365/status/1462562680498102275?ref_src=twsrc%5Etfw">November 21, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


繰り返しますが「Form コントロールを利用しない」場合です。
※Form コントロールの場合は [ResetForm 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-form?WT.mc_id=BA-MVP-5004053#resetform) をご利用ください。

2つの手段で初期化しています。

# 方法1：Reset プロパティを利用する
TextInput やドロップダウンコントロールなど入力を求めるモノには [Reset] プロパティがあります。こいつを True にしてやると初期値に戻ります。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/3a93a128-b0dc-7a64-9b0e-5fa5276bc96d.png)
動作イメージでは、ボタンコントロールの [Pressed] プロパティを参照して初期化を実現しています。[Pressed] プロパティはコントロールが押されている間は true 、それ以外の場合は false になるので、リセットしたい対象と簡単に連動できます。もちろん、変数を経由して Reset プロパティを発動させるコトも可能です。（過去、Pressed プロパティがなかった時代は変数でやるしかなかったなぁ・・・）

# 方法2：Reset 関数を利用する
前述の Reset プロパティを持つコントロールに対して、初期化しろ！という命令が出せる関数です。

■Docs
 [Power Apps の Reset 関数](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/functions/function-reset?WT.mc_id=BA-MVP-5004053)
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/8aa5fc49-808b-681c-573d-90d4726cd9f4.png)

 この関数 [リアクティブ](https://qiita.com/yamad365/items/feed918f9934ee6a2f07#%E3%83%AA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96) じゃないんですよねｗ 
正確なタイミングは不明ですが、2年ほど前は存在しなかった関数です。ホント、イツ登場したんだろう・・・。

# どっちを使ったほうが良いの？
 どっちが良いのか気になりますよね？

 個人的には「好きなほうでインじゃね」です。

 結局、得られる効果は同じなので実装しやすい方法で対応ください、ですね。悩むより、手を動かして対応しちゃったほうが早い場面が多いと思います。きっと、ね。

例えば、コントロールをコピペして増やしていくような画面を作っているのであれば、方法１：Reset プロパティを１番初めにコピーするコントロールへ仕込んでおくと楽かもしれません。ペーストしたタイミングで、既に Reset プロパティへ処理が設定された状態で複製されますからね。

コントロール数がさほど多くなく、命名もちゃんとなってる画面に対して後追いで初期化ボタンを追加する、などであれば Reset 関数で書いたほうが早いかもしれませんよね。

つまり、状況次第です。

# まとめ
なにはともあれ「選択肢を持っている」というのは１つの強みです。

かなり初歩的なネタになってしまいましたが、結構知らない方が多そうだったので記事にしておく次第です。なお、途中でも案内していますが、Form コントロールは別の手段で初期化になります。まずは、手を動かして、試してみて期待される結果が得られるか確認してくださいね。

それでは、皆さま。素晴らしい Power Platform Life を！
A Hard Day's Night イントロ、ライブ演奏のフーリエ変換

The Beatles, A Hard Day's Nightのイントロをフーリエ解析するシリーズ

今回はYoutubeで見つかる２つのライブ動画のイントロ音を解析していきます。ライブでは、ジョージ・マーティンは参加していませんので、ピアノの音がないバージョンを聞く事ができます。

###TV番組の動画のイントロ部分のフーリエ解析

https://www.youtube.com/watch?v=Yjyj8qnqkYI

![hdn_live_tv.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2117456/80995e1e-ae56-7b32-aacc-442ed309d959.png)

D2とD3のベースの音は、ハーモニクスしているような形です。D3の音が150Hzが中心なので、ポールがD2弦のチューニングを1/3ほどD2#に、ズラしている可能性が高いです。
アルバム版にはあった、謎の周波数成分(366Hz, 490Hz, 513Hz)は計測されていません。この成分はレコーディングの際のノイズの可能性があります。
F2,A2の音がありません。リードギター、リズムギターでも、この低い音を出すのは指が難しいので、省いたのかもしれません。Fmajorの中心となる、F3,A3,C4の音はきちんと計測されています。

例にによってD5以上の音は省略します。


###Live at Hollywood Bowl 1964 のフーリエ解析

https://www.youtube.com/watch?v=vn0BUrrkr0A

![hdn_live_hw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2117456/6d3d1c0d-161d-0712-163d-32c70e641c4e.png)


ベースの音量が大きい。150Hzへのズレがない。別の曲も連続して演奏する必要から、ポールがベースのD2弦のチューニングをズラすのをやめたのではないかと推測する。
アルバム版にはあった、謎の周波数成分(366Hz, 490Hz, 513Hz)は計測されていません。
F2,A2の音がありません。省略されたのでしょう。

###150Hzの音の謎
２つの動画を聴き比べる事で、D3と150Hzの音の影響を比較きます。
TV版のはD3からズレた150Hzの音、Hollywood BowlのはD3の音。
ほとんど同じ音に聴こえますが、D3の方が機械的な音に聞こえる。個人的には150Hzの音が好きです。
ジョージ・マーティンと、ポール・マッカートニーは、何回も聴き比べた末に150Hzの音を採用したのかなぁ。
Express app.use 呼び出しタイミング

# ソースコード
```javascript
const express = require('express')
const app = express()
const port = 3000

var count = 0;

app.use(function(req,res,next){
    count++;    
    console.log(count);
    next();
})

app.use(function(req,res,next){
    count++;    
    console.log(count);
    next();
})

app.use(function(req,res,next){
    count++;    
    console.log(count);
    next();
})

app.get('/', (req, res) => {
  res.send(`Hello World! ${count}`)
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})
```

# 結果
```
C:\workspace\01_Project\20_appusetest>node app.js
Example app listening at http://localhost:3000
1
2
3
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2087075/f278a49a-a16d-064e-eeab-a668cb87281f.png)
【Ruby のまずいコード】ハッシュのキーのシンボル化

# お題

キーが文字列であるハッシュが与えられたとき，各キーをシンボルにするメソッドを書いてください。

Ruby on Rails には（より詳しく言えば Active Support には）そのためのメソッド `Hash#symbolize_keys` があるのですが，これを使わず自分で実装することとします。

# コード

## コード 1

```rb
def hash_symbolize_keys(hash)
  result = {}
  hash.each do |key, value|
    result[key.to_sym] = value
  end
  result
end
```

## コード 2

```rb
def hash_synbolize_keys(hash)
  hash.map{ |key, value| [key.to_sym, value] }.to_h
end
```

## コード 3

```rb
def hash_symbolize_keys(hash)
  hash.to_h{ |key, value| [key.to_sym, value] }
end
```

# 改善

コード 1 は初心者が書きがちなコードですね。とても素直な発想で，[Enumerable#to_h](https://docs.ruby-lang.org/ja/3.0.0/method/Enumerable/i/to_h.html) や [Hash#to_h](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/to_h.html) を知らなければ誰でもこのような書き方をするのではないでしょうか。

[Enumerable#to_h](https://docs.ruby-lang.org/ja/3.0.0/method/Enumerable/i/to_h.html) を知っていれば，コード 2 のように簡潔な書き方ができます。
このメソッドは，Enumerable なオブジェクト（つまり大雑把に言えば `each` メソッドを持つオブジェクト）からハッシュを作るさまざまな場面で役に立ちます。

しかし，ハッシュも Enumerable であることと，`to_h` にはブロックを与える用法もある，ということに気づけば，`map` で変換してから `to_h` しなくても，ハッシュに直接 `to_h` すればよい，と分かります。
それがコード 3。
実は Hash クラスには独自に `to_h` メソッドが実装されていて，コード 3 の `to_h` は Enumerable の `to_h` ではなく Hash の `to_h` なのですが，今の場合 Enumerable の `to_h` のつもりで理解しようとしてもさしつかえありません。

しかし，もっと簡潔に書けます。
Hash には，キーを変換する専用メソッド [Hash#transform_keys](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/transform_keys.html) が用意されているからです。
これを使えば

```rb
def hash_symbolize_keys(hash)
  hash.transform_keys{ |key| key.to_sym }
end
```

と書けます。
これはもちろん

```rb
def hash_symbolize_keys(hash)
  hash.transform_keys(&:to_sym)
end
```

とか（Ruby 2.7 以降なら）

```rb
def hash_symbolize_keys(hash)
  hash.transform_keys{ _1.to_sym }
end
```

とも書けます。あとの二者のほうが簡素で瞬間的に把握しやすいと私は思います。

速度面でも，`transform_keys` を用いたほうがコード 3 よりも何割か速いようなので，多数回実行するような場合や競技プログラミングでは身につけておきたいところです。

なお，ハッシュの要素のキーではなく値のほうを変換する [Hash#transform_values](https://docs.ruby-lang.org/ja/3.0.0/method/Hash/i/transform_values.html) というメソッドもあり，こちらもいろんな場面で使います。
STM32L010で「HELLO」と液晶表示 (VSCのCubeIDE)(AQM0802A) HAL



1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

x PlatformIOと言うらしいが超ムズ(以下省略)(誰かに手伝ってもらいましょう?)


目的
I2Cのテスト

LCD_HELLO_010_1内をいろいろ適当にコピー


https://os.mbed.com/users/caa45040/code/f303_h_p1/




![11F86AE5-F3DB-4AC9-89E2-C54DEB464805.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1ebd79da-daaa-06e9-4a9e-c9120a246383.jpeg)



主なソース




```c++




int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

#define ADDR_LCD    (0x7C)      //  address

uint8_t INIT_com[]={
0x0,0x38,
0x0,0x39,
0x0,0x4,
0x0,0x14,
0x0,0x70,
0x0,0x56,
0x0,0x6C,
0x0,0x38,
0x0,0xC,
0x0,0x1,
0x40,0x41};

uint8_t INIT_cls[]={0x0,0x1};



    //液晶の初期化
    HAL_Delay(200);
    for(int ii=0;ii<11;ii++){
        HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, &INIT_com[ii*2], 2, 3000);
        HAL_Delay(3);
    } //for




  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */



        //液晶のクリア
        HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, INIT_cls, 2, 3000);
        HAL_Delay(3);

        //液晶に出力 xなぜか連続送信するとバグる為に個別送信
        uint8_t a[]="HELLO",b[]="@A";
        for(int ii=0;ii< sizeof(a) ;ii++){
            b[1]=a[ii];
            HAL_I2C_Master_Transmit(&hi2c1, ADDR_LCD, b ,  2  , 3000);
            HAL_Delay(1);
        }//for

        //1秒待つ
        HAL_Delay(1000);



    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}




```
🔰 Node.jsのバージョン管理ツールとは

Node.jsとはパソコンの中でJavascriptを動かすためのソフトウェアです。
本稿では、そんなNode.jsのバージョン管理・切り替えを行うツールとは何かをご紹介します。

https://nodejs.org/ja/

1つのプロジェクトだけで作業しているなら、1つのバージョンで問題ありませんが、
複数のプロジェクトにかかわっていくと、そのうち異なるバージョンのNode.jsが必要になってきます。

## バージョンを切り替えなければならないシーン

一般的には、古いバージョンで動かせたJavascriptファイルは新しいNode.jsでも動作させられますが、
新しいバージョンを想定して書かれたJavascriptファイルは、古いバージョンでは動きません。

これは、依存パッケージが古いバージョンに対応していなかったり、新しい構文の登場などが原因です。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/10504045-370c-aa1c-6a00-3dc8f1d6aece.jpeg)

純粋にNode.jsをインストールする場合、1つの環境に乗せられるのは1つのバージョンのみです。
別のバージョンを使うには、特別な作業をしない限り切り替えのたびにNode.jsをインストールしなおさなければなりません。

## バージョン管理ツールがいるとどうなるか

`n`や`fnm`のようなバージョン管理ツールがあると、実行したいJavascriptファイルに応じて使用するNode.jsのバージョンを簡単に切り替えられるようになります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142709/cad6f2ed-092d-c430-5e5d-e8a2e1964915.jpeg)

必要なNode.jsをダウンロードしておいて必要になったときに渡してくれるので、入れ直しよりも格段にバージョンの切り替えが楽になるでしょう。

また、バージョン管理ツールの多くは特に意識することもなく**自動的に適切なバージョンに切り替えてくれます**。
そうしたところも、ありがたいポイントですね。

## :warning: 諸注意

なお、Node.jsのバージョン管理ツールを導入するうえで重要なルールの1つに、**Node.js本体を直接インストールしてはならない**というものがあります。

Node.js本体がインストールされていると、バージョン管理ツールとぶつかって正しく動作しなくなる可能性があります。

バージョン管理ツールをインストール前には、必ずNode.js本体をアンインストールしてください。
もちろん同様の理由で、バージョン管理ツールも共存させないようにしましょう。

## バージョン管理ツールの選び方はこちら…

https://qiita.com/heppokofrontend/items/5c4cc738c5239f4afe02?0
huggingface/transformers覚書

[huggingface/transformers](https://github.com/huggingface/transformers)に関してつまづいた点をまとめた自分用のメモです。
大体は[公式ドキュメント](https://huggingface.co/transformers/)や[公式フォーラム](https://discuss.huggingface.co)で解決することが多いです。

#TensorFlowで学習したモデルをpytorch形式にして読み込みたい
参考記事：[公式ドキュメント](https://huggingface.co/transformers/converting_tensorflow_models.html)
`transformers-cli convert`で一発。

#EarlyStoppingさせたい
参考記事：[公式ドキュメント](https://huggingface.co/transformers/main_classes/callback.html)
EarlyStopping以外のCallbackも実装されている。

#BertJapaneseTokenizerでNEologdなどの辞書を使いたい
参考記事：[BertJapaneseTokenizerで辞書を指定・変更する](https://self-development.info/bertjapanesetokenizer%E3%81%A7%E8%BE%9E%E6%9B%B8%E3%82%92%E6%8C%87%E5%AE%9A%E3%83%BB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/)
`tokenizer_config.json`に下記を加えれば良い。

```json
"mecab_kwargs":{
    "mecab_dic": null,
    "mecab_option": "-d 使用したい辞書のpath"
}
```
`mecab_dic`は`null`にしておくこと。
現在のバージョンでは、デフォルト値の場合`mecab_dic`+`mecab_option`で設定を読み込んでしまう。
MeCab本体のインストールや`mecabrc`の保存場所に注意。

#学習済みのSentencePieceを使いたい
参考記事1：[huggingface / transformersを使って日本語BERTの事前学習を実施してオリジナルな言語モデルを作ってみる](https://qiita.com/m__k/items/6f71ab3eca64d98ec4fc#2-tokenizer%E3%82%92%E5%AD%A6%E7%BF%92%E3%81%99%E3%82%8B)
参考記事2：[SentencePieceでの日本語分かち書きをTransformersのパイプラインに組み込む](https://radiology-nlp.hatenablog.com/entry/2021/06/08/013549)
自作記事：[huggingface/transformersのAutoTokenizerから学習済みSentencePiece Tokenizerを呼び出す](https://qiita.com/shoe/items/5c1befa09c7942bc1b99)
`AlbertTokenizer`で読み込めばOK。special tokenやunknown token idの設定に注意。

#PipelineでTokenizerの`max_length`を設定したい
preprocessやpostprocessなどのパラメータは、Pipelineの`__init__`や`__call__`時に引数として渡すことで設定可能

```python
classifier = TextClassificationPipeline(model=model, tokenizer=tokenizer, device=device, truncation=True, max_length=512)
```

そもそもTokenizerの`__init__`時に`model_max_length`で設定できるっぽいが、`truncation`などの設定の仕方がわからない。

#Pipelineの出力にtokenized textとattention weightを加えたい
自作記事：[huggingface/transformersでpipelineの出力にtokenized textとattention weightを加える](https://qiita.com/shoe/items/5185887d1bb9261c3f90)
既存のPipelineを継承し、`forward`と`postprocess`に変更を加えた自作Pipelineを作成する。詳細は上記記事を参照。
p5.js Web Editor上で Tone.js を使って音を鳴らす【その1】

タイトル通りの内容です。
[Tone.js](https://tonejs.github.io/) のページに書いてある以下の内容を、p5.js Web Editor上でまとめて試せるものを作ってみました。

- Hello Tone
- Tone.Synth
- triggerAttackRelease
- Instruments
- Samples

### ライブラリの読み込み

まず、index.html の中で以下を指定し、CDN上のライブラリを読み込ませました。

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/tone/14.8.32/Tone.min.js"></script>
```

### JavaScript のプログラム

そして、sketch.js の内容は、以下のようにしてみました。

```javascript
let player,
  synth = [];

function preload() {
  player = new Tone.Player(
    "https://tonejs.github.io/audio/berklee/gong_1.mp3"
  ).toDestination();
}

function setup() {
  createCanvas(400, 400);
  background(220);

  synth.push(new Tone.AMSynth().toDestination());
  synth.push(new Tone.Synth().toDestination());
  synth.push(new Tone.FMSynth().toDestination());
  synth.push(new Tone.PolySynth(Tone.Synth).toDestination());
}

function draw() {}

function keyPressed() {
  let synthTemp;
  const now = Tone.now();
  switch (key) {
    case "a":
      synthTemp = synth[0];
      synthTemp.triggerAttackRelease("C4", "8n");
      break;
    case "s":
      synthTemp = synth[1];
      synthTemp.triggerAttack("C4", now);
      synthTemp.triggerRelease(now + 1);
      break;
    case "d":
      synthTemp = synth[2];
      synthTemp.triggerAttackRelease("C4", "8n", now);
      synthTemp.triggerAttackRelease("E4", "8n", now + 0.5);
      synthTemp.triggerAttackRelease("G4", "8n", now + 1);
      break;
    case "f":
      synthTemp = synth[3];
      synthTemp.triggerAttack("D4", now);
      synthTemp.triggerAttack("F4", now + 0.5);
      synthTemp.triggerAttack("A4", now + 1);
      synthTemp.triggerAttack("C5", now + 1.5);
      synthTemp.triggerAttack("E5", now + 2);
      synthTemp.triggerRelease(["D4", "F4", "A4", "C5", "E5"], now + 4);
      break;
    case "g":
      player.start();
      break;
  }
}
```

あとはプログラムを実行し、「a/s/d/f/g」の 5つのキーのうちのどれかを押下すると、それぞれ異なる音を鳴らすことができます。
DBファイルのエクスポート

```vb
Option Explicit
Enum DelimiterType
    CSV = 1
    TSV
End Enum
Enum FileNameType
    TimeNow = 1
    Sheet_Name
    Free_Name
End Enum
Function START_OutputDBFile()
  Call outputDBFile(TSV)
End Function
Function outputDBFile(delimiter As DelimiterType, Optional startRow As Long = 1, Optional startCol As Long = 1, Optional FileNameType As FileNameType = Sheet_Name)
'■DB用のデータファイルをエクスポートする
'【参照設定】Microsoft ActiveX Data Objects 2.8 Library
'MySQLへはUTF-8で吐き出す
  Dim endRow As Long, adjustRow As Long
  Dim endCol As Long, adjustCol As Long
  Dim adoSt  As ADODB.Stream
  Dim strList As String, StrFile As String
  Dim i As Long, j As Long
  Dim outputText As String, delimiterKey As String, extension As String
  Dim extensionType As String
  '開始行から終了行を調整する
  adjustRow = startRow - 1
  endRow = Cells(rowS.Count, startCol).End(xlUp).row - adjustRow
  '開始列から終了列を調整する
  adjustCol = startCol - 1
  endCol = Cells(startRow, Columns.Count).End(xlToLeft).Column - adjustCol
  '区切り設定
  Select Case delimiter
    Case CSV
      delimiterKey = ","
      extension = ".csv"
    Case TSV
      delimiterKey = vbTab
      extension = ".tsv"
  End Select
  'ファイル名
  Select Case FileNameType
    Case TimeNow
      StrFile = M_Utirity.rMyDesktop & "\" & Format(Now, "yyyymmdd_HHMMSS") & extension
    Case Sheet_Name
      StrFile = M_Utirity.rMyDesktop & "\" & ActiveSheet.Name & extension
    Case Free_Name
      StrFile = InputBox("シート名を入力して下さい。", "入力フォーム")
      StrFile = M_Utirity.rMyDesktop & "\" & StrFile & extension
  End Select
  If StrFile = "" Then
    MsgBox "シート名無し", , "【エラー】"
    Exit Function
  End If
  '書き出し
  Set adoSt = New ADODB.Stream
  With adoSt
    .Type = adTypeText
    .Charset = "UTF-8"
    .Open
  End With
  For i = startRow To endRow
    strList = ""
    For j = startCol To endCol
      If j > startCol Then
        strList = strList & delimiterKey
      End If
       strList = strList & Cells(i, j)
    Next
    adoSt.WriteText strList, adWriteLine
  Next
  adoSt.SaveToFile StrFile, adSaveCreateOverWrite
  adoSt.Close
  Set adoSt = Nothing
  MsgBox "Done"
End Function
vuejsでbootstrap5のmodalを使う


# 概要
vueのコンポーネントで「bootstrap5のmodalを使う場合、どうやってmodalをshowさせるか」です。
テーブルの一覧表示で、マウスオーバーで編集ボタンを表示、クリック時にモーダルで編集を想定。
コンポーネントのプロパティでidとnameの配列を渡してください。

:::note info
ポイントは、importと$refsです。
:::

## 注意事項
* vue2のコンポーネント。
* Bootstarp5。
* Bootstrap Iconsを使ってます。

```ProjectComponent.vue
<template>
  <div>
    <table class="table table-sm table-hover">
      <thead>
        <tr>
          <th width="80px">ID</th>
          <th>名前</th>
          <th width="80px"></th>
        </tr>
      </thead>
      <tbody>
        <tr v-for="(project, index) in projects" @mouseover="hoverIndex = index" @mouseout="hoverIndex = -1">
          <td>{{ project.id }}</td>
          <td>{{ project.name }}</td>
          <td class="text-end">
            <i class="bi bi-pencil-square" v-show="index == hoverIndex" @click="edit(project.id)"></i>
          </td>
        </tr>
      </tbody>
    </table>

    <button class="btn btn-primary" @click="create()">追加</button>
    <div class="modal fade" tabindex="-1" ref="modal1">
      <div class="modal-dialog">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title">プロジェクト</h5>
            <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
          </div>
          <div class="modal-body">
            <input type="text" class="form-control" v-model="targetProject.name">
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-danger btn-del" data-bs-dismiss="modal" v-if="isEidt" @click="del()">削除</button>
            <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">閉じる</button>
            <button type="button" class="btn btn-primary" @click="save()">保存</button>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import { Modal } from 'bootstrap';

export default {
  data() {
    return {
      isEidt: false,
      hoverIndex: -1,
      targetProject: {name: ''},
      myModal1: null,
    };
  },
  mounted() {
    this.myModal1 = new Modal(this.$refs.modal1, {keyboard: true});
  },
  props: {
    projects: null,
  },
  methods: {
    create: function () {
      this.isEidt = false;
      this.myModal1.show();
    },
    edit: function (id) {
      this.isEidt = true;
      this.targetProject = {...this.projects.find((v) => v.id === id)};
      this.myModal1.show();
    },
    save: function () {
      const self = this;
      axios.post('/api/project/set', {project: self.targetProject}).then(function (res) {
        if (res.status == 200) {
          let p = self.projects.find((v) => v.id === self.targetProject.id);
          p.name = self.targetProject.name;
        } else {
        }
      }).catch(function (err) {
      });
      this.myModal1.hide();
    },
    del: function () {
      this.myModal1.hide();
    },
  }
}
</script>

<style scoped>
.btn-del {
  position: absolute;
  left: .75rem;
}
</style>
```
[Azure] Portal ログイン時のMFA (2段階認証) を無効化する



# Azure portalでの設定方法
[AzureActive Directory] > [プロパティ] > [セキュリティの既定値群の管理] > [セキュリティの既定値既定値群の有効化]
で[いいえ]を選択して[保存]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64293/5d0611cd-0b60-7264-b6ec-bf11e08c5f34.png)


# 参考
* https://docs.microsoft.com/ja-jp/azure/active-directory/fundamentals/concept-fundamentals-security-defaults
*
VMware Fusionではまったときの対処(mac, ROS)

# VMware Fusionにお世話になっております

私が使っているMacBook ProがBootcampでUbuntuをインストールできないので、他のOSを使用したいときは仮想環境を利用するしかありません。さまざまな仮想環境から選ぶうえで、

* 無料
* 他の仮想環境に比べて描画が早い

という点でVMware Fusionを選んでいます(なお、私は無料になる前に課金していました)。

前提として、仮想環境で処理を行う場合、その性能はマシンが持つ処理能力よりもかなり劣ってしまいます。例えば、定番である仮想環境VirtualboxでROSのGazeboを動かすと遅すぎて使えないレベルであります。それゆえに、描画の速さはGazeboのようなシミュレータを使用する際には大切なポイントになります。

私はVMware Fusionにお世話になりっ放しなのですが、UbuntuでROSを動かす際にはまったことがありましたので、対処方法をメモ代わりに書いておきます。

# 環境

* PC：MacBook Pro (2020, Intel CPU)
* OS：OSX Big Sur
* 仮想環境：VMware Fusion 12.2.1
* 仮想環境で動かしているOS：Ubuntu 18や20

# Ubuntuのディスク容量がなぜか減る

ドラッグ＆ドロップでファイルを母艦のOSから受け渡ししていませんか？ この便利な機能を使ってる方は `~/.cashe/vmware/drag_and_drop` の下にフォルダが生成されているかどうか確認しましょう。そして全て削除しましょう。

# Gazeboが起動しない。

こちらの srsさんの神記事 [ROS講座54 VMWare上でROSを使う - Qiita - ](https://qiita.com/srs/items/25efd45641c274bb8415) を参照しましょう。

> VMwareはどうやらOpenGL3系に対応していないらしくて、VMware上でgazeboを起動しようとすると失敗します。export SVGA_VGPU10=0の環境変数を付けるとOpenGL2系を使うようになり、正常に立ち上がります。bashrcに書いておきましょう。

ただ、VMware Fusion 12はOpenGL3に対応しているようです。これが↓の問題に関係します。。

# Gazebo内のRGBDカメラが変なDepthイメージを出す

RealsenseやKinectなどDepthイメージをセンシングできるRGBDカメラをGazeboで使用するとき、はまりポイントがありました。

上記の通り、VMwareでGazeboを表示させるためには、描画系のOpenGLのバージョンをを3から2に下げることになります。その状態でRGBDカメラをGazeboでシミュレートすると、このような現象が発生します。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Gazeboでdepth cameraのシミュレーションがおかしい件の続き。<br><br>この記事の通りやっても、変な壁が現れる…。<br>もう無理…。環境を捨てて再構築しよう…。<a href="https://t.co/t0wxEHlBRP">https://t.co/t0wxEHlBRP</a> <a href="https://t.co/Vnb5dhZ6mR">pic.twitter.com/Vnb5dhZ6mR</a></p>&mdash; nisshan_ にっしゃん (@nisshan_) <a href="https://twitter.com/nisshan_/status/1456882228097552384?ref_src=twsrc%5Etfw">November 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Depth情報を生成するときにレイトレーシングしているのですが、RGBカメラ画像の位置と整合性を取るために描画されたバッファが見えてしまっている気がします。ポイントクラウドを見ると、カメラの前に常に四角い板があるように見え続けるのです。このような状態だと何もできません…。

試行錯誤の結果、OpenGLのバージョンを3に上げると問題が発生しないことが分かりました。ゆえに「Gazeboでdepth cameraのシミュレーションを、VMwareで構築したUbuntu上で実行したいときは、 **Ubuntu20のROS Noetic** を使いましょう」。もちろん、 `export SVGA_VGPU10=0` の環境変数をbashrcから削除しましょう。

結果、このように正しく深度データを取得できるようになりました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おー、ROS Noeticでは発生しない！<br>(Melodicで問題発生)<br>Noeticで環境構築を進めよう。 <a href="https://t.co/lwVsy1pJzb">pic.twitter.com/lwVsy1pJzb</a></p>&mdash; nisshan_ にっしゃん (@nisshan_) <a href="https://twitter.com/nisshan_/status/1456991174632214528?ref_src=twsrc%5Etfw">November 6, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
[競プロ] 単調スタック(Monotonic Stack)の説明

## 単調スタック(Monotonic Stack)とは

単調スタックという単語は勝手に作りました。
英語ではMonotonic Stackというらしいのですがそれに相当する日本語がなさそうだったのでそれっぽいものを勝手に使用。
定義は下記になります。

```
単調スタック:= スタックのある値がその下にある値よりも大きい
例：[5 4 3 2 1]
   top        bottom
```

実はこれは蟻本の「4-4 頻出テクニック２」の「スタックの利用」というセクションに説明されています。

## なぜこれが便利なのか

これは主に配列Aにおいて**ある要素A[i]の値よりも前(j<i)にあるより小さい最初の値(A[j])を効率的に見つける**ときに使われる

例えば、下記配列Aの4よりも前にある小さい値は3。
このようにある要素よりも前にあるより小さい要素のインデクスの配列をPとするとPは下記のようになる。（存在しない場合は-1とする）

```
配列A: [2  3 5 4  1]
配列P: [-1 0 1 1 -1]
```

この配列Pは下記の要領で単調スタックを利用して作成が可能。計算量はO(n)
説明が難しいのでコードを載せてコメントを記載
同じ要領である要素よりも**後に**ある最初の小さい値も見つけることも可能

```c++
int n = A.size();
vector<int> P(n, 0);
stack<int> st; // 単調スタック。スタックには要素の値ではなくインデクスを格納する。
for (int i=0; i<n; i++) {
    // スタックの一番上の要素が今の要素よりも大きい限りpopして取り除く
    while (!st.empty() && A[st.top()] > A[i]) st.pop();
    // スタックが空の場合は今の要素より小さい要素が前にない
    if (st.empty()) P[i] = -1;
    // スタックの一番上の数は今の要素より小さい最初の前にある値
    else P[i] = st.top();
    st.push(i);
}
```

## 練習問題

[907. Sum of Subarray Minimums](https://leetcode.com/problems/sum-of-subarray-minimums/)
[84. Largest Rectangle in Histogram](https://leetcode.com/problems/largest-rectangle-in-histogram/)
[2281. Sum of Total Strength of Wizards](https://leetcode.com/problems/sum-of-total-strength-of-wizards/)