OmniAICreator/Qiita-1.07M huggingface dataset:
BigQueryで行を列に変換したい（Pivot）

クエリを書いていると、ExcelのPivotでやるように列の値で整形したい時があります。

| service | user_type   | user_count | 
| ------- | ------ | ---------- | 
| App1    | member | 1251       | 
| App1    | temporary | 419        | 
| App2    | member | 320        | 
| App2    | temporary | 118        | 
| App3    | member | 720        | 
| App3    | temporary | 330        | 

例えば上表はmember（本会員）とtemporary（仮会員）の人数表ですが、これを..

| service | member | provisional | 
| ------- | ------ | ----------- | 
| App1    | 1251   | 419         | 
| App2    | 320    | 118         | 
| App3    | 720    | 330         | 

このように、user_typeを右に列名とし並べてて出したい訳です。
そんな時はクエリでCASE文を使ってこう書いていました。

```
WITH Kaiin AS (
  SELECT 'App1' as service, 'member' as user_type, 1251 as user_count UNION ALL
  SELECT 'App1', 'provisional', 419 UNION ALL
  SELECT 'App2', 'member', 320 UNION ALL
  SELECT 'App2', 'provisional', 118 UNION ALL
  SELECT 'App3', 'member', 720 UNION ALL
  SELECT 'App3', 'provisional', 330)
SELECT 
  service,
  sum(CASE WHEN user_type="member" THEN user_count ELSE 0 END) as member,
  sum(CASE WHEN user_type="provisional" THEN user_count ELSE 0 END) as provisional,
FROM Kaiin
GROUP BY service
```

これ、列値が多いとCASE文がどんどん増えていくので嫌だったのですが、つい最近の2021年7月にBigQueryがPivotオプションをサポートしてくれていました。

https://cloud.google.com/bigquery/docs/release-notes#July_19_2021
https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#pivot_operator

その結果、さっきのCASE文だらけになりそうなクエリが..

```
WITH Kaiin AS (
  SELECT 'App1' as service, 'member' as user_type, 1251 as user_count UNION ALL
  SELECT 'App1', 'provisional', 419 UNION ALL
  SELECT 'App2', 'member', 320 UNION ALL
  SELECT 'App2', 'provisional', 118 UNION ALL
  SELECT 'App3', 'member', 720 UNION ALL
  SELECT 'App3', 'provisional', 330)
SELECT * FROM Kaiin
  PIVOT(SUM(user_count) FOR user_type in ("member", "provisional"))
```

こうIN句で書けるようになって、スッキリと集計できるようになりました！
このPIVOTの構文は見慣れない印象でしたが、集計項目と列値を記載すれば残りでグルーピングしてくれるので楽ですね。個人的には有難いアップデートでした。

ちなみに集計機能を作っているときにはプロセスが反対になるのであまり使わないと思いますが、逆向きのUNPIVOTも用意されています。

ランチェスターでは1年ちょっと前にAWSに加えてGCPも使い始めたので、GCPにはまだ知らないサービスが数多くあります。そんな中でBigQueryだけ見てもこうして手堅く機能が追加されているので、最適な分析インフラを作るための探究はまだまだ続きそうです。

ランチェスターではデータエンジニアを募集中です。ご興味のある方はお気軽にお問い合わせください。
https://herp.careers/v1/lanchester
https://www.wantedly.com/companies/lanchester/projects
【javascript】ループ文と演算子

#  繰り返し処理の基本

## for

```js

/*
for(初期化; 演算子; 評価式;){
  処理
 }
*/

for(let i = 0; i < 10; i++){
    console.log(i)
}

```
## while

```js

let i = 0; //初期化
while(i < 10){ //演算子
    console.log(i); //処理
    i++; //評価式
}

```

# 演算子
値を元に処理を行い値を返す記号

## 演算子の優先順位


以下の表は優先順位の最も高いもの (21) から最も低いもの (1) の順に並べられています。
[全文は公式リファレンスへ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)
![スクリーンショット 2021-11-22 19.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378066/6d9b427b-1bcd-9d0f-8392-0e898daca132.png)

### case
例えば優先順位20のメンバーへのアクセスは左から右に処理をしていく。
`a + b || c + d` ＝＞a + bを処理してから c + dという流れ。

### case2
![スクリーンショット 2021-11-22 19.16.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378066/1a346daf-ab1e-6cfe-b102-4f80a330151e.png)

* 加算より乗算が優先順位が高いため乗算が先に計算される。

```js
let a = 1 + 2 * 3;
console.log(a)

>>> 7
```

### case3

![スクリーンショット 2021-11-22 19.18.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378066/1f5e422e-1ce0-4a9d-7d6e-457af11b5112.png)

* グループ化は最高優先順いとなるため、加算が先に処理される。

```js
let a = (1 + 2) * 3;
console.log(a)
>>> 9
```

### case4 インクリメント
![スクリーンショット 2021-11-22 19.40.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378066/9abb79a2-7079-f909-e096-6113516f9480.png)



```js

let a = 0;
console.log(a)

//後方につけた場合
let b = a++
console.log(b, a)
>>> 0 1
//a（0）がbに代入されたあとに+1されているので
//bは0 aは1となる。


//式を分解すると
let b;
a = (b = a) + 1

//グループ化したものが優先順位が高いため、a(0)がbに代入され
// その後aに+1されるのでa = 1となる。

//前方の場合
let b = ++a
console.log(b, a)
>>> 1 1

//式の分解
let a = 0;
let b;
a = b = a + 1
//すなわち
a = b = 1
//代入の優先順位は右から左のため、
// b = 1, b = aとなるため、a と　b 両方1となる。

console.log(a, b)
>>> 1 1

```
古いバージョンのmacOSでKeynoteをアップデートする方法

# はじめに
Keynoteの最新版11.2は、macOS 11.0が必要となっていて、それ以前の古いバージョンのmacOSにはインストールできない。今回、古いバージョンの
macOS Catalina 10.15.7でKeynote　9.02をアップデートしようとしたが、App Storeのアップデートからでは「macOS 11.0以降が必要です」と表示されできなかった。２０２１/11/22現在

# Update手順
1. App Storeのアカウント(自分の名前が表示されているタブ)を開き、Keynoteの・・・を押して「Appを削除...」を選択し、アンインストールする。
2. その後、ダウンロードボタンを押すと、Keynoteの旧バージョンをダウンロードしますか？と出るので、「ダウンロード」を選択する。これで古いバージョンのmacOSで使用できる範囲でもっとも最新版のKeynote 11.1がインストールされる。

# その他
pagesやnumbersも同様。任意のバージョンのKeynoteをインストールする方法は不明。
新しいバージョンで作成したKeynoteが古いバージョンで開けないから、アップデートくらい簡単にできるようにして欲しいですね
iOSやAirpodsのFirmwareやこういった純正アプリなどを、ユーザーがバージョン管理できないのがAppleのよくない所
【rails】AWS EC2ボリューム 増量による「No space left on device @ io_write」エラー解消


#1.状況

・AWS EC2
・Nginx
・rails  5.2.6

容量不足が原因で発生する「No space left on device @ io_write」エラーが発生
以下コマンドをターミナルに打ち込む。

```
[ec2-user ~] $ df -h
```

Use100%となっているファイルシステム「/dev/xvda1」の容量が不足してたためにエラーが発生したと思われる。

```
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        475M     0  475M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M   26M  467M   6% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       10G   10G     0  100% /
tmpfs            99M     0   99M   0% /run/user/1000
```

#2. 対応

①不要ファイルの削除による容量確保
②ボリューム容量増加

→今回は②を採用し、「/dev/xvda1」のボリューム増量により対応。

AWS EC2の「(Elastic Block Store項目)ボリューム」から確認
→該当ボリュームidを選択
→「変更」を選択
→サイズ(Gib)を変更し「変更」ボタン押下
 ※自分の場合 10→12に変更

変更後は以下のようになり、サイズが更新されたことを確認できる

![変更後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2294345/3ccb8aa6-be90-a88a-d974-94bbad2c8658.png)



# 3.変更後確認

ターミナルに戻り以下コマンド実行

```
[ec2-user ~] $ df -h
```

以下が結果

```
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        475M     0  475M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M   26M  467M   6% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1       12G   10G  2.0G  84% /
tmpfs            99M     0   99M   0% /run/user/1000
```

「/dev/xvda1 」の使用割合が100%→84%になっていた。

rails s　実行後、「No space left on device @ io_write」エラーが解消されていたのを確認
ECSタスク定義に\tが入っていたせいでredashでNoneType object has no attribute test_connectionが出た話

# はじめに
当社ではBIツールとしてredashを利用しており、つい先日v10へのアップデートを行いました。その際の記事は[こちら](https://qiita.com/t_odash/items/35e98975bc0f8017d3e4)。
今回はそんなアップデートにてECSタスク定義を変更した際、定義内に`\t`が紛れ込んだことでredashが不具合を起こした話をまとめます。

# 0. 事の起こり
アップデートの喜びも束の間、`Pythonが利用できない`といった報告が入り、その解決に奔走することとなりました。確認の為にデータソースpythonにて`Test Connection`を発行するも`NoneType object has no attribute test_connection`と弾かれてしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/f4af6f2e-85e7-cfe1-0fe2-b67cbb8f81d3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/9f1fa3f2-6f89-e3fa-b2a1-c6c62d17a6c5.png)

当社ではv8以前の頃からredashにてPythonを利用しております。その為アップデートに際しても、検証環境にてPythonが利用できることを確認した上で同様の設定を本番環境に施しており、これは不可解な症状でした。

# 1. 結論
タイトルに記載の通りタスク定義の環境変数欄に`\t`が混入しており、環境変数として機能していなかったのが原因でした。当該タスク定義のJSONが以下の部分ですが、環境変数REDASH_ADDITIONAL_QUERY_RUNNERSの末尾に`\t`が入っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/4f0dfbdf-f9cc-85a8-2149-319302c2c280.png)

厄介なことにこれは見かけ上は判別が困難でした。
以下はクラスターのタスク画面とリビジョン作成画面のスクリーンショットですが、それぞれ`\t`が混入していた際のものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/6764f64d-e344-df21-8c27-7cd331c1525b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570763/26d2f403-c90a-af6a-4c25-356e2e5653b9.png)


細かい定義の見直しを行うべく`JSONによる設定`画面を開いたことで発覚しました。
REDASH_ADDITIONAL_QUERY_RUNNERSが認識されず、冒頭のエラーになっていたようです。

また、別のコンテナでは`could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?`といったエラーログを吐いていたのですが、これも同様にREDASH_DATABASE_URLの値の方の末尾に`\t`が混入していた為にPostgreSQLに接続できなかったようです。

# まとめ
実の所、どのタイミングで`\t`が紛れ込んだのかは分かっていません。検証環境のJSONを移し替えるためにコピペ行った際にでも紛れ込んだのか・・・？といった具合です。手作業での設定の悪い側面が出てしまったかなという印象ですね。こうした人為的ミス、及び修正にかかる工数を考えれば、Infrastructure as Codeで自動化することを本格的に考えねばならないなと思いました。
【SAP S/4HANA】Project Management ワークストリームで利用できるアクセラレーター

## Project Management ワークストリームで利用できるアクセラレーター

### プロジェクト計画テンプレート
- https://support.sap.com/content/dam/SAAP/SAP_Activate/S4H_209%20EM%20Project%20Plan.zip

### SAP Activate/ SAP S/4HANA プロジェクトステータスレポート
- https://support.sap.com/content/dam/SAAP/SAP_Activate/PM_41.pptx

### SAP Activate クオリティゲート・コンセプト
- https://support.sap.com/content/dam/SAAP/SAP_Activate/PM_210.pptx

### リスク管理簿サンプル
- https://support.sap.com/content/dam/SAAP/SAP_Activate/PM_97_Sample%20Risk%20Register.xlsx

### ステークホルダー管理計画サンプル
- https://support.sap.com/dam/SAAP/SAP_Activate/PM_98_Sample%20Stakeholder%20Management%20Plan.xlsx

### Blog - SAP Activate コンテンツ更新
- https://blogs.sap.com/2016/12/09/implementation-roadmap-viewer-content-updated-for-s4hana-cloud/

### 四半期リリース/アップグレードスケジュール
- https://www.sap.com/documents/2017/01/867629d8-a27c-0010-82c7-eda71af511fa.html

### SAPトレーニング
- https://training.sap.com/

### SAPバリューアシュアランスサービスパッケージ
- http://sapsupport.info/offerings/s4hana-service-packages/

---
[EOD]
Docker for Windows (WSL2) PhpStormでFailed to parse validation script outputエラーが出た時の対処

PhpStormでコンテナ内のphpをCLI Interpreterとして設定する際に発生したエラーの暫定的な対処方法です。

## 環境

- Docker Desktop 4.2.0
- PhpStorm 2021.2.3
- PHP 7.4.13
- XDebug 2.9.3

## エラー

![screenshot_20211122_184621.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/cf291288-f609-5c63-ab59-e665dd1d0deb.png)

Failed to parse validation script output

## 対策

![screenshot_20211122_184730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/2e8836a1-7fe8-fabc-33a8-ff364505ee53.png)

Docker for Windows の `Use Docker Compose V2` のチェックを外す

## 解決

![screenshot_20211122_184924.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52879/29a43d9b-8832-8d32-9be3-aa22e88719d1.png)

Docker Compose V2のバグかな...？
暫定対応ですが、無効化することで仮対応する。早く直ることを祈る。
【初心者向け】翻訳ファイル（YML）編集後から「InvalidLocaleData」のエラーになる

###■環境
・Windows10(64bit)
・Ruby 2.7.4
・Rails 5.2.6
###■翻訳ファイル編集後から「InvalidLocaleData」のエラーになる
####状況
Railsアプリケーションを国際化対応（i18n）するために、翻訳ファイルである「ja.yml」と「en.yml」を編集した。
しかし、その後から全ビューが以下のエラーで表示不可になった。

　I18n::InvalidLocaleData in 【コントローラ名】#【アクション名】
　Showing 【ビュー名】 where line #【行番号】 raised:
　can not load translations from 【アプリケーションの絶対パス】/config/locales/en.yml: 
　#<Psych::SyntaxError: (<unknown>): did not find expected key while parsing a block mapping at line 【行番号】 column 【列番号】>

####原因
ダブルクォーテーション（"）で囲んだ文章内にダブルクォーテーションが入っていた
####対処
ダブルクォーテーションをバックスラッシュでエスケープ

```yml:config/locales/en.yml
	verify_text: "If you want to delete your account, please type "delete"."
	↓
	verify_text: "If you want to delete your account, please type \"delete\"."
```

####補足
エラー行番号は必ずその行に問題があるという意味ではなく、その行と同じインデント内のどこかに問題があることを意味している。
エラーメッセージだけで問題個所を特定できない場合は、以下のWebサイトを利用し、問題と思われる個所を1行ずつ削除し検証するのが有効である。

http://www.yamllint.com/

また、本事例の他にエラーのよくある原因は以下。
１）インデントを誤っている
本来ならば偶数の半角スペースでインデントするが、奇数になっていたり、数が多すぎたりしている。

```yml:例
en:
 activerecord:　←インデントが半角スペース2個ではなく1個になっている
    attributes:
        user:　←インデントが半角スペース2個ではなく4個になっている
          confirmation_sent_at: 'confirmation_sent_at'
          confirmation_token: 'confirmation_token'
          confirmed_at: 'confirmed_at'
          created_at: 'created_at'
```

２）シングルクォーテーション（'）で囲んだ文章内にシングルクォーテーションが入っている
　（特にDeepLなどで日本語文を英文に翻訳→コピペしていると、don'tやcan'tが頻繁に含まれる）
Unable to find either executable 'empy' or Python module 'em' ... try installing the package 'python3-empy'の解決方法

ros初心者です．

Unable to find either executable 'empy' or Python module 'em' ... try installing the package 'python3-empy'
は単にempyをインストールすれば解決します．

```
sudo apt install python3-empy
```

これでも解決しない場合はpathが通っていないことが多いです．

```
export PYTHONPATH=$PYTHONPATH:/usr/lib/python3/dist-packages
```

参考までに
[Ubuntu20.04 install the ROS noetic version in catkin_Problems in make compilation | ProgrammerAH](https://programmerah.com/ubuntu20-04-install-the-ros-noetic-version-in-catkin_problems-in-make-compilation-31828/)
Firebase Version8とversion9のコードの違い

#対象者
・これからFirebaseを始めるすべての人
・2021年8月25日（firebase v9.0.0リリース）より前に作られた参考書等を使っている人
※この記事は2021年11月22日に書いたものです

#この記事を書いた経緯
さっそく余談ですが、この記事を書いた経緯を簡単に紹介します。

先月、プログラミング初心者としてVueを学習するにあたり、出来るだけ新しく出版された参考書がいいと思い、2020年12月出版の参考書を購入しました。

しかし、Firebaseの章において手順通りインストール等しても、コードが全く異なっていました。
調べてもほとんど情報が無かったのですが、結果的にはドキュメントを読めば即解決。業界的に技術のサイクルが早いのはわかっていましたが、ここまでとは驚きました（笑）

ということで、私のような初心者の方が、余計な学習時間を使わなくて済むよう今回記事にしました。

#Version8とVersion9の違い

今回のバージョンアップによる新旧の違いは、超ざっくり言うと以下です。
   v8⇒Firebaseの機能をまとめて使用可能にする
   v9⇒Firebaseの機能を必要な部分だけインポートして使う

つまりメリットはコードが最小限になることで**”読み込みが速くなる”**ということ

#互換性について
機能やオプションは非常に似ています**完全な互換性はありません**。そのため**バージョンアップにはコードの修正が必要**になります。

しかし、**v8とv9のコードを共存させることは可能**です。
※今回はコードの共存については触れてないため、これについては公式ドキュメント等ご参照ください。

#コードの違い
記事の最後に公式ドキュメントのリンクを記載しますが、v8とv9のコードは、引用すると以下のような違いになっています。

まずは、v8です。

    //v8
    var config = {
      apiKey: "apiKey",
      authDomain: "projectId.firebaseapp.com",
      databaseURL: "https://databaseName.firebaseio.com",
     storageBucket: "bucket.appspot.com"
      };
    firebase.initializeApp(config);
    var database = firebase.database();
続いてv9です。

    //v9
    import { initializeApp } from 'firebase/app';
    import { getDatabase } from "firebase/database";

    const firebaseConfig = {
      apiKey: "apiKey",
      authDomain: "projectId.firebaseapp.com",
      databaseURL: "https://databaseName.firebaseio.com",
      storageBucket: "bucket.appspot.com"
    };

    const app = initializeApp(firebaseConfig);

    const database = getDatabase(app);

データの読み書きする場合のコード例は以下です。

まずは、v8です。

    //v8
    function writeUserData(userId, name, email, imageUrl) {
      firebase.database().ref('users/' + userId).set({
        username: name,
        email: email,
        profile_picture : imageUrl
      });
    }
続いてv9です。

    //v9
    import { getDatabase, ref, set } from "firebase/database";

    function writeUserData(userId, name, email, imageUrl) {
      const db = getDatabase();
      set(ref(db, 'users/' + userId), {
        username: name,
        email: email,
        profile_picture : imageUrl
      });
    }

コードの違いについては以上です。


#参考したサイトなど
[Firebase Documentation-スタートガイド](https://firebase.google.com/docs/database/web/start)
[Firebase Documentation-データの読み取りと書き込み](https://firebase.google.com/docs/database/web/read-and-write#web-version-9_1)
[これからFirebaseでプロジェクトを始めようとする全ての人が知っておくべきこと v8→v9リリース](https://zenn.dev/hiro__dev/articles/605161cd5a7875)
AWS CloudTrailのeventNameとAWS CURのlineItem/Operation

最近AWS Cost & Usage Reportsを使っていくつの項目の分析をやっていました。

Googleでいろんな資料を調べたけど、CURで各AWSサービスは`lineItem/Operation`カラムに具体的にどうな値を出力できるのが見つけられませんでした。
例えば、S3はPutObject、GetObjectなど。

後日にAWS CloudTrailで分析をやっていたところ、もしかしたら、AWS CloudTrailの`eventName`カラムの値はCURの`lineItem/Operation`と同じかなと疑っていました。

もちろん全部同じではないと思いますが、例えば、S3の`StandardUsage`などはCloudTrailにありません、でも同じなものは多いかもしれませんね。

CloudTrailの`eventName`カラム値はほとんどサービスドキュメント→ユーザーガイド→XXXモニタリング→CloudTrail によるログ記録にあります。
たまに、セキュリティなどの下にも記載されています。（例えAmazon QuickSight）

でもやはり、オフィシャルのAWS CURのOperation値リストがあればいいかなと思っていますね。
【SAP S/4HANA】Project Management ワークストリームで利用するツール

## Project Management ワークストリームで利用するツール

### SAP Solution Manager 7.2
- https://support.sap.com/ja/alm/solution-manager.html

### SAP Cloud Appliance Library
- https://cal.sap.com/

### Roadmap Viewer
- https://go.support.sap.com/roadmapviewer/#/groupDetail/

### SAP Best Practices Explorer
- https://rapid.sap.com/bp/#/browse/a2z

### SAP Cloud ALM
- https://support.sap.com/ja/alm/sap-cloud-alm.html

### Implementation portal for SAP S/4HANA Cloud
- https://www.youtube.com/watch?v=WAKnqCbsFWg

### SAP Jam
- https://jam4.sapjam.com/auth/login

### SAP Portfolio and Project Management
- https://www.sap.com/products/project-portfolio-management.html

----

[EOD]
Lambda プロキシ統合の使用チェック時のInternal server error（502）

#はじめに#
AWSのAPI Gatewayを使ってkintoneから指定のレコードを取得しようとした時に、「Lambda プロキシ統合の使用」にチェックを入れたらエラーになってしまったので書置きします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225708/00c4abe7-fa64-638b-c7c9-e788e424c1c9.png)


こんなエラー
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225708/cc0931fd-9095-74ea-442d-285becf9e244.png)


#対応内容#
チェック箇所1




```index.js
exports.handler = (event, context, callback) => {

    var responseBody = {
        "key3": "value3",
        "key2": "value2",
        "key1": "value1"
    };

    // ↓ 要チェック
    var response = {
        "statusCode": 200,
        "headers": {
            "my_header": "my_value"
        },
        "body": JSON.stringify(responseBody),
        "isBase64Encoded": false
    };
    callback(null, response);
};
```

チェック箇所2
メソッドレスポンスのヘッダーや本文のチェック
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2225708/cc0efcd2-628e-22bb-0da3-810230050028.png)

#参考#
https://aws.amazon.com/jp/premiumsupport/knowledge-center/malformed-502-api-gateway/

参考にさせていただき、ありがとうございます。
【Java】アノテーション

# @&#xFFF0;JsonProperty
- Javaインスタンスのシリアライズ時のプロパティ名を指定する

# @&#xFFF0;JsonIgnore
- Jsonに含めたくないプロパティを指定する

# サンプルコード
### Javaクラス
```User.java
package annotations.naming;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
  private Long id;

  @JsonProperty("firstName")
  private String name;

  @JsonIgnore
  private String password;

  public Long getId() {
    return this.id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return this.name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getPassword() {
    return this.password;
  }

  public void setPassword(String password) {
    this.password = password;
  }
}
```

### Json
```.json
{
  "id" : 1,
  "firstName" : "Tom"
}
```
pyside6-uicで.uiファイルを.pyに変換して実行するとエラーになる件

WINDOWS上で、Qtdesignerで作られたuiファイルをpythonのpyファイルに変換したとき
pyside6-uic form.ui > form.py
とやると、import時に
"ValueError: source code string cannot contain null bytes"
になり
form.pyのみを実行すると、
"SyntaxError: unknown parsing error"
になった。

これの解決策はここに載ってた
https://stackoverflow.com/questions/53035340/pyside2-uic-null-bytes-in-output

> pyside6-uic form.ui -o form.py

で実行すると解決。
seedとfakerでランダムなユーザーデータを作成し、RailsでUser-APIを実装する。

## 手順
1\.　APIモードで作成

2\.　モデル・コントローラの作成

3\.　ルーティングの設定

4\.　コントローラの設定

5\.　seedとFakerでランダムなサンプルデータを作成

6\.　test.httpファイルを作成して、HTTP要求の種類別に要求をしてみる


## APIモードで作成
```
console
$ rails new user-api --api
```

## モデル・コントローラの作成
今回はtitleというstringを持ったpostというテーブルを作成します。

```
$ rails g model post first_name:string last_name:string gender:integer

$ rails g controller users

$ rails db:create

$ rake db:migrate
```

## ルーティングの設定
```
config/routes.rb

 Rails.application.routes.draw do
   resources :users
 end
```
<br />

## コントローラの設定
コントローラの中身を外部からajaxリクエスト等で情報の作成・取得・削除・編集が可能になるよう設定します。

```
users.controller.rb

class UsersController < ApplicationController
  before_action :set_user, only: %i[show update destroy]

  def index
    users = User.order(created_at: :desc)
    render json: { status: 'SUCCESS', message: 'Loaded users', data: users }
  end

  def show
    render json: { status: 'SUCCESS', message: 'Loaded the user', data: @user }
  end

  def create
    user = User.new(user_params)
    if user.save
      render json: { status: 'SUCCESS', data: user }
    else
      render json: { status: 'ERROR', data: user.errors }
    end
  end

  def destroy
    @user.destroy
    render json: { status: 'SUCCESS', message: 'Deleted the user', data: @user }
  end

  def update
    if @user.update(user_params)
      render json: { status: 'SUCCESS', message: 'Updated the user', data: @user }
    else
      render json: { status: 'SUCCESS', message: 'Not updated', data: @user.errors }
    end
  end

  private

  def set_user
    @user = User.find(params[:id])
  end

  def user_params
    params.require(:user).permit(:first_name, :last_name, :gender)
  end
end
```

## seedとFakerでランダムなサンプルデータを作成
1\.　fakerをインストールする

```
Gemfile

gem 'faker'
gem 'gimei'
```
gimeiは、日本人の名前や、日本の住所をランダムに返すGemです。

* ひらがなの場合、Gimei.hiragana
* カタカナの場合、Gimei.katakana
* 漢字の場合、Gimei.kanji

```
bundle install
```

### usersデーブルに50件のダミーデータを追加する。
```
seeds.rb

require 'faker'

50.times do |n|
  first_name = Gimei.first.kanji
  last_name = Gimei.last.kanji
  User.create!(
    first_name: first_name,
    last_name:  last_name,
    gender: rand(1..2)
  )
end
```

```
rails db:seed
```

## APIを実行する
```
$ rails s
```

## test.httpファイルを作成して、HTTP要求の種類別に要求をしてみる
### GET(http://localhost:3000/users/:id) or (http://localhost:3000/users)
<img width="1080" alt="スクリーンショット 2021-11-22 15 11 48" src="https://user-images.githubusercontent.com/83254076/142811035-9cbe1014-fbf6-4499-a593-b1411bd71baf.png">

### POST(http://localhost:3000/users)
<img width="1080" alt="スクリーンショット 2021-11-22 15 14 19" src="https://user-images.githubusercontent.com/83254076/142815142-ca9be358-5a5a-4275-8962-1683e342f700.png">

### PUT(http://localhost:3000/users/:id)
<img width="1080" alt="スクリーンショット 2021-11-22 15 13 50" src="https://user-images.githubusercontent.com/83254076/142815721-38aa4402-8389-4dc9-a5c2-5ab8bbc95d3c.png">

### DELETE(http://localhost:3000/users/:id)
<img width="1080" alt="スクリーンショット 2021-11-22 15 14 51" src="https://user-images.githubusercontent.com/83254076/142815638-3a7c8893-e0a1-48a0-bb52-169f09e7c30d.png">
ラズパイの電源スイッチ

ちょっと悩んだので備忘録。

ラズパイには、電源スイッチがないのでこんなのをヨドバシで購入しました。

NO BRAND CHUZ18-USB-C [USB-C中間スイッチ付きコード]

https://www.yodobashi.com/product-detail/100000001006004247/

使用したところ、電源が入るACアダプタと電源が入らないACアダプタがありました。
色々と悩んだところ違いは、電源がはいらないACアダプタの口はUSB Type-Cで、普通に使えるのはUSB Type-Aのものでした。

ヨドバシの商品ページの方の詳細説明をみたところ

> ●定格：不明※USB Power Delivery（PD）や各社急速充電規格には対応していません。USB PD非対応の電源を使用してください。USB PD対応電源の接続時は、給電されない場合があります。

の記載がありました…。
商品説明はよく読まないと無駄な時間をとってしまうって事ですね。
WAS設計その7 IHSでHTTPSの処理について（UseInsecure）

https://www.ibm.com/support/pages/%E3%80%90%E9%87%8D%E8%A6%81%E6%83%85%E5%A0%B1%E3%80%91wasv855%EF%BC%9Aweb%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%8C%E9%9D%9E%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%BB%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%8B%95%E4%BD%9C%E5%A4%89%E6%9B%B4was-13-016

https://www.ibm.com/docs/ja/was-nd/8.5.5?topic=ins-web-server-plug-in-custom-properties#rwsv_plugin_customprop__UseInsecure


考慮する場合のケース

IHS側でHTTPSで受ける場合、アプリケーションサーバに対してもデフォルトでは、HTTPSの通信になる。この場合、アプリケーションサーバとihs側で鍵交換を行っていない場合、エラーとなる。

IHSとWAS間をHTTPS通信にしたい場合は、鍵交換を行う。
※手順が面倒。

必要がない場合は、以下に設定を入れる。
※要は、IHS（HTTPS）→WAS（HTTP）の通信にしたい場合は
名前：UseInsecure
値：true

snoopアプリでHTTPSでアクセスしてみて問題ないことを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291303/1b6fd0af-5daf-d74c-181a-c15a02b2a1f3.png)
FileMakerでプログレスバー

# はじめに
FM-1グランプリでの予選第3回レビューで、[FM-SC](#サンプルファイル)のプログレスバー機能について「[ここだけのモジュールとかあると](https://www.fm-1gp.com/post/no-34-fm-sc-script-chronograph)」と、ご示唆をいただいたので、プログレスバーの部分のみ残したファイル（モジュールと言えるのか？）を作成してみました。

# 実際の動き
![20211121_ProgressBar.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2283446/cbfa118f-49c7-e3cf-5dab-da4af0d43e77.gif)


# 解説
サンプルファイルを見れば分かると思いますが、簡単な解説。

- 0から100までの自然数でプログレスを表すグローバル変数（\$\$PROGRESS）を用意。
- 100個の繰り返しを持つ計算値のグローバル繰り返しフィールドを作成。
  - 計算値は「Get ( 計算式繰り返し位置番号 )」。
- 条件付き書式を設定。Selfが\$\$HEAD.OF.PROGRESS.BARと\$\$TAIL.OF.PROGRESS.BAR変数の間の値を取る際には、背景色を変える。

あとは、\$\$HEAD.OF.PROGRESS.BARと\$\$TAIL.OF.PROGRESS.BAR変数を適宜設定するようにすれば、プログレスバーっぽくなる。単純にプログレスをゼロから増加させるだけなら、\$\$TAIL.OF.PROGRESS.BARをゼロに固定して、\$\$HEAD.OF.PROGRESS.BARだけ100までカウントさせればよい。

上記3つを含めたすべてのグローバル変数の管理方法については[こちらの記事](https://qiita.com/siebenunddreissig/items/144fa0e2abdbf1519719)を参照してください。

# 導入の仕方
1. サンプルファイルから"f_ProgressBar.number"フィールドを、コピーし、導入先のテーブルにペースト。
2. サンプルファイルから、\~~AppSpecificFunctions\~~にある、Set、Get関数をインポートする（全部で10個）。
3. サンプルファイルのレイアウトから、該当オブジェクト（繰り返しフィールド）をコピーし、導入先のレイアウトへペーストする。

実際には、導入先システムに合わせてプログレスを評価する必要があるので、思い通りに動かすには、もう少し手間がかかる。サンプルファイルでの設定を参考にして欲しい。サンプルファイルではループ処理で繰り返し評価させているが、OnTimerスクリプトでもよいかも知れない。

# サンプルファイル
GitHubからダウンロードできます。  
<a href="https://github.com/siebenunddreissig/ProgressBar"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/siebenunddreissig/ProgressBar.png" width="460px"></a>  
アカウントはadmin、user、fm1の3つが用意されており、いずれのパスワードもアカウントと同じです。
いずれのアカウントも完全アクセスにしてあります。
ファイルオプションでuserでログインするようにしてあります。

FM-SCの最新版はこちらから。  
<a href="https://github.com/siebenunddreissig/FM-SC"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/siebenunddreissig/FM-SC.png" width="460px"></a>

# 謝辞
FM-1グランプリでいただいたレビューを理由に、当サンプルファイルを作りましたが、プログレスバーはFM-SCで試しながら作っていたので、FM-SCではそこまで待ち時間ができないこともあり、プログレスバー自体をゆっくり眺めることがありませんでした。このサンプルファイルを作って、その点はとても満足しました。FM-1グランプリに感謝。  
出来ているレベルが段違いに高いけど、[これ](https://twitter.com/OnTheRocks_plz/status/1393943842664062977)を見て、繰り返しフィールドでプログレスバーいけんじゃない？　と思いました。先人達の投稿に感謝。
#Javaを独学するにはどうすればいいですか？


###<font color="red">あらすじ：</font>
よくJavaの初心者から、Javaをマスターするにはどうすればいいですか？Javaを独学するのは難しいですか？Javaを独学するのは難しくないと思います。他の言語に対してJavaは95年に出てきた比較的に新しい言語であるため，古い言語では不適切なものがJavaでは既に修正されているようだ。

もちろんJavaは非常に豊富な言語であり、多くの成分が含まれているが、初心者の観点から見ると、Javaが理解と習得すべきものはあまり多くないと思う。

どの人間でもプログラミングを学ぶには，まず変数の表現文，文中の条件,判断，ループを把握し，これらの基本概念を把握した後，残りはいくつかの言語に特殊に関連しているもののではないかと思う。

TIOBE2016年6月トップ10位のプログラミング言語長期動向図から見てみると、JAVAは常に優位に立っている。
######私の考えでは、JAVAは非常に学ぶ価値のある言語である。

<font color="blue">1.データによると，最もシェアを占めているのはバックエンドであり，その大部分はJAVAで作成されている。</font>
<font color="blue">2.次には企業レベルのアプリケーションであり，ほとんどのアプリケーションはWebページに基づいており，それは全てJavaで書かれている。</font>
<font color="blue">3.モバイルアプリケーションクライアントであり，Androidシステムであればjavaで書かれており，iOSシステムでもその後端はjavaである。</font>
######私たちがどのような言語でプログラムを書くかを選択する際には、通常、2つの要素が重要な影響を与えると思う。
<font color="blue">1. この言語は既存のライブラリを持っているが，このライブラリはちょうどこの問題を解決できる。</font>
<font color="blue">2. 身近なすべてのプログラマさんはある一つの言語しかできない。</font>

今の現状では，プログラマさんはJAVAが使いやすいし、自分が利用できるライブラリが開発出来るため，他の人がアプリケーションを開発しようとした場合，JAVAが併用しているライブラリがあることを発見することによって、JAVAを選択した.これは順方向のループとフィードバックになるからですJAVAは様々な新しい動的な言語と比べてよりも明らかに大型システムに適していると思う。
![uploading...0](https://i.computer-bild.de/imgs/1/0/5/4/2/3/7/7/129b225a74ca555e.jpg)
【javascript】コールバック関数とthis

# case
クラスで定義されたメソッドをsetTimeoutから呼び出したときのthisの取り扱いについて。

* Personクラスにhelloメソッドが定義されている。
* Personクラスをインスタンス化してbob変数に代入している。
* 変数bobをsetTimeoutで1秒後に実行するようになる。
* 期待値としては、hello Bobと出力したいがhelloだけ出力されてしまう。

```js

class Person {
  constructor(name, age) {
      this.name = name;
      this.age = age;
  }
  hello() {
     console.log('hello ' + this.name);
  }
}

const bob = new Person('Bob', 23);
setTimeout(bob.hello, 1000);

//実行結果
>>> hello
```

# 結論

bob.helloはPersonオブジェクトのhello()関数だけを実行していて、hello()メソッドにはPersonオブジェクトが渡されていないため、Bobにあたるthis.nameが
実行されない。

##### なぜか？
前提：javascriptの仕様なので受け入れるしかない。

* 関数として実行されるthisはwindowオブジェクトを参照先となる。
* 例としてwindowオブジェクトにnameプロパティを追加して"stan"を代入してみる。
* するとhello stanと表示された。すなわちthisはwindowオブジェクトを参照している。

```js

//例としてwindowオブジェクトにnameプロパティを追加して"stan"を代入してみる。
window.name = "stan"

class Person {
  constructor(name, age) {
      this.name = name;
      this.age = age;
  }
  hello() {
     console.log('hello ' + this.name);
  }
}

const bob = new Person('Bob', 23);
setTimeout(bob.hello, 1000);

//hello stanと表示された。すなわちthisはwindowオブジェクトを参照している。
>>> hello stan
```

* これはsetTimeoutでbob.helloと実行した時にPersonオブジェクトのhelloを参照しているわけではない。
* javascriptは、メモリ空間でPersonのhello()関数を<del>コピーして、コピーをしたhello（）関数を</del>参照しているため、Personオブジェクトのプロパティを受け取れていないために起こる。
* メモリ消費効率を考えた上の仕様なのでしょう。
* そのため、Personオブジェクトを格納しているbob変数を束縛する必要がある。

##### どのように？

* bind関数を使用する。
* bind関数にbobオブジェクトを渡すとPersonオブジェクトを束縛することができる。

```js

window.name = "stan"
class Person {
  constructor(name, age) {
      this.name = name;
      this.age = age;
  }
  hello() {
     console.log('hello ' + this.name);
  }
}

const bob = new Person('Bob', 23);
setTimeout(bob.hello.bind(bob), 1000);

>>> hello bob

```

ややこしいが、こういうものだと、受け入れる。
Linuxにpyenvをインストールしてpythonの開発環境を作る最短手順


## pyenvとpyenv updateをインストール

```
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
$ git clone git://github.com/yyuu/pyenv-update.git ~/.pyenv/plugins/pyenv-update
$ pyenv update
```

  - 参考リンク
    - [pyenv自身のバージョンを上げる](https://qiita.com/hatt0519/items/1c029659de4f169cd09a)

## ~/.bashrcに下記を記述

```
# pyenv script
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"

eval "$(pyenv init -)"
```

  - .bashrcの変更を反映

```
$source ~/.bashrc
```

  - 参考リンク
    - [pyenvで指定したPythonが動かない(解決!)](https://ameblo.jp/l-yotarou/entry-12686640439.html)
   
## 所望のバージョンのpythonをインストールして切り替える

```
$ pyenv install 3.9.6 
$ pyenv versions
* system
  3.9.6 (set by $HOME/.pyenv/version)

$ pyenv global 3.9.6
  system
* 3.9.6 (set by $HOME/.pyenv/version)
```
EmacsでPHP（php-mode＋lsp-mode）

Emacsにphp-modeとlsp-modeを導入したい、ということで。

こちらを使ってみます。

https://emacs-lsp.github.io/lsp-mode/page/lsp-intelephense/

利用にあたっては、PHP自体とNode.jsがローカルにインストールされている必要があるみたいです。

php-modeは、MELPAからインストール。

https://github.com/emacs-php/php-mode

lsp-modeそのものは、設定済みとします。

あとは、php-modeのhookにlsp-modeを設定して

```elisp
(use-package lsp-mode
  :ensure t
  :commands (lsp lsp-deferred)
  :hook (php-mode . lsp-deferred))
```

PHPのソースコードを開くと、Language Serverをダウンロードするか聞かれます。

補完候補は一択で、`iph`とするとPHPのLanguage Serverがダウンロードされます。

emacs-lspのページからリンクされている、こちらのLanguage Serverです。

https://github.com/bmewburn/vscode-intelephense

これで補完などが有効になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309669/2765a29b-033f-df9e-7979-13b86d1fbfe0.png)
SpacemacsでRustの開発環境を設定する

# はじめに
SpacemacsでRustの開発環境を構築したのですが、若干手間取りました。
そのためメモとして、構築方法を記載します。

# 注意点
エディタはSpacemacsを使用します。
単に最近使っているからという理由です。


# 手順
手順は大きく分けて、2つです。

1. Rustの環境設定
1. SpacemacsのRust layerの設定

## Rustの環境設定
手順は下記の通りとなります。

1. rustupのインストール
1. racerのインストール
1. cargo-editのインストール
1. cargo-auditのインストール
1. cargo-outdatedのインストール

### rustup
下記を実行してください

```
curl https://sh.rustup.rs -sSf | sh
echo 'source $HOME/.cargo/env' >> 設定ファイルの場所(zshなら.zshrcなど)
```

### racerのインストール
rustの最新をインストールしないと、コンパイルできないという罠があります。
下記を実行してください。

```
rustup install nightly
cargo +nightly install racer
rustup component add rust-src

racer complete std::io::B
```

Pathを設定ファイルに追加してください。(zshなら./zshrc等)

```
export "RUST_SRC_PATH=Rustのパス"
```

Rustのパスは大体下記となります。

```
ホームディレクトリ/.rustup/toolchains/rustのバージョン/lib/rustlib/src/rust/library/
```

### cargo-editのインストール
cargo-editをインストールするには、open-sslとlibssl-devをインストールする必要があります。

#### open-sslのインストール
下記のコマンドを実行してください。

```
sudo dpkg -l | grep openssl
```
もしopensslの情報が表示されていなければ、下記でインストールしてください。

```
sudo apt install openssl
```

#### libssl-devのインストール
下記コマンドを実行してください。

```
sudo dpkg -l | grep libssl-dev
```

もしlibssl-devの情報が表示されなければ、下記でインストールしてください。

```
sudo apt install libssl-dev
```

#### cargo-editのインストール
下記コマンドを実行してください。

```
cargo install cargo-edit
```

### cargo-auditのインストール
下記コマンドを実行してください。

```
cargo install cargo-audito
```

### cargo-outdatedのインストール
下記コマンドを実行してください。

```
cargo install cargo-outdated
```

## SpacemacsのRust layerの設定
dotspacemacs-configuration-layersに、rustと変数を記載してください。

```
dotspacemacs-configuration-layers
(
	省略
	rust
	(rust :variables rust-backend 'racer)
```

## 動作確認
下記コマンドを実行し、プロジェクトを作成してください。

```
cargo new --bin hello
```

Spacemacsでmainファイルを開けば、Rust layerで定義しているコマンドが実行できるはずです。

```
emacs -nw ./hello/src/main.rs
```

# 最後に
単純にSpacemacsを立ち上げるだけだと、Rust layerのコマンドを実行できないみたいです。
ここで一番時間がかかりました。
またJavaや.NET系と比べて意外と時間かかるな~と思いました。
(Javaや.NET系は統合開発環境をインストールすれば、よしなにしてくれるのですごい楽)

# 参考
- [stack overflowのcargoエラーについての質問](https://stackoverflow.com/questions/53136717/errore0554-feature-may-not-be-used-on-the-stable-release-channel-couldnt)
- [SpacemacsでRust開発環境をあげる](https://qiita.com/knjname/items/8ff2323e7c4ec6263f12)
- [Rustでコード補完](https://codom.hatenablog.com/entry/2017/07/29/203348)
- [libssl-devのインストール](https://ubuntu.perlzemi.com/blog/20200412174004.html)
JavaScriptで配列を比較する方法

#1.ソース

```array.js
/**
 * 配列の比較
 * @param array1 配列1
 * @param array2 配列2
 * @returns 同じの場合：True、その他の場合：False
 */
export const arraysEqual = (array1, array2) => {
    if (!array1 || !array2) {
        return false;
    }

    if (array1.length !== array2.length) {
        return false;
    }

    for (let index = 0; index < array1.length; index++) {
        if (array1[index] instanceof Array && array2[index] instanceof Array) {
            if (!arraysEqual(array1[index], array2[index])) {
                return false;
            }
        } else if (array1[index] !== array2[index]) {
            return false;
        }
    }

    return true;
}
```
【Macでcmake】エラー'Failed to find "gl.h" in "/System/Library/Frameworks/OpenGL.framework/Headers;/System/Library/Frameworks/AGL.framework/Headers"'の直し方

MacOS Monterey version 12.0.1でcmakeを用いてpcl(Point Cloud Library)のプロジェクトをビルドする際、以下のエラーに遭遇したため備忘録がてら記録しておくことにしました。

```
CMake Error at /usr/local/opt/qt@5/lib/cmake/Qt5Gui/Qt5GuiConfigExtras.cmake:9 (message):
  Failed to find "gl.h" in
  "/System/Library/Frameworks/OpenGL.framework/Headers;/System/Library/Frameworks/AGL.framework/Headers".
```

# 対処法

エラーログに則って `/usr/local/opt/qt@5/lib/cmake/Qt5Gui/Qt5GuiConfigExtras.cmake`を確認してみます。

```
vim /usr/local/opt/qt@5/lib/cmake/Qt5Gui/Qt5GuiConfigExtras.cmake
```

すると、最上部に以下のような記述があります。

```
set(_GL_INCDIRS "/System/Library/Frameworks/OpenGL.framework/Headers" "/System/Library/Frameworks/AGL.framework/Headers" 
```

ここで、一度`/System/Library/Frameworks/OpenGL.framework`の中身を確認してみましょう。

```
%ls /System/Library/Frameworks/OpenGL.framework
Libraries	Resources	Versions
```

指定されていたHeadersが無いのが確認できたかと思います。エラーの原因はここです。  
では、代わりのHeadersに何を指定すれば良いのかというと、以下の二つを設定する必要があります。

```
"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/Library/Frameworks/AGL.framework/Headers"
 "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/Library/Frameworks/OpenGL.framework/Headers"
```

では、`/usr/local/opt/qt@5/lib/cmake/Qt5Gui/Qt5GuiConfigExtras.cmake`を書き換えていきましょう。chmodなどで書き込みを許可してからエディタで開いて

```
set(_GL_INCDIRS "/System/Library/Frameworks/OpenGL.framework/Headers" "/System/Library/Frameworks/AGL.framework/Headers"
```

を

```
set(_GL_INCDIRS "/System/Library/Frameworks/OpenGL.framework/Headers" "/System/Library/Frameworks/AGL.framework/Headers" "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/Library/Frameworks/AGL.framework/Headers" "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/Library/Frameworks/OpenGL.framework/Headers")
```

に書き換えます。
以上です。
Watson Studio on CP4Dでプロジェクトのアセットをダウンロードする

テスト環境
・CP4D 4.0.1

CP4D上のWatson Studioからアセットをダウンロードします。

#1 データ資産のダウンロード
データ資産であれば、「・・・」のケバブメニューからダウンロードを選択するとダウンロードすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/4ee461aa-acc5-34c3-1c52-079ed19fc65c.png)

これはプロジェクト内に実体のあるデータ資産のみが対象です。DBのテーブルやICOS上のCSVは対象外です。

それらのファイルをダウンロードしたい場合はいったん以下のような方法でプロジェクト内のデータ資産としてCSVなどに保存する必要があります。

https://dataplatform.cloud.ibm.com/docs/content/wsj/analyze-data/project-lib-python.html#save-data


#2 プロジェクトエクスポートによるダウンロード
プロジェクト内のNotebookなどもダウンロードしたい場合はプロジェクトの上部にある、「デスクトップにエクスポート」のアイコンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5afd8322-2c13-28eb-e43b-5dd863e6a1e7.png)

エクスポートしたいオブジェクトを選択してエクスポートします。
ここにはCSV、Excelなどのデータ資産やNotebook、ModeleFlowのstrファイルなどがあります。
プロジェクト内に実体のないデータ資産はチェックはできますが、やはり、データ本体はエクスポートの対象外です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e0db9920-7b2c-49b0-1895-7514e59a8ce1.png)


Exporting an analytics project (Watson Studio) - IBM Documentation

https://www.ibm.com/docs/en/cloud-paks/cp-data/4.0?topic=projects-exporting-project#export-desktop

以下の警告がでますので、確認をして問題なければ「エクスポートの続行」をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5ab6137e-e72c-6ed0-60e5-b1ba05a2c211.png)

実体のあるアセットとしてdata_asset,machine-learning-stream,notebookがダウンロードされました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a6682faf-8402-6025-8e78-5717475262c5.png)

data_assetには以下がダウンロードされていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/45ec8b3d-83c5-28d4-a4b2-c359845cd110.png)

machine-learning-streamには以下がダウンロードされていました。ModelerFlowのストリームファイルです。ユーザーがつけたオブジェクト名の後ろに内部的な識別子もついています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/f52c3e10-f2f0-81cf-708b-f1490543d500.png)

Notebookには以下がダウンロードされていました。ipynbのファイルです。ユーザーがつけたオブジェクト名の後ろに内部的な識別子もついています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/01316868-24ff-91f1-9324-ab45705a4a99.png)
TypeScriptの再帰テクニック

今回、あるTypeScriptの型問題で躓いてしまったので
備忘録としてまとめます。


[type-challenges](https://github.com/type-challenges/type-challenges/blob/master/README.ja.md)というGitHubにあげられている問題集の[Deep Readonly](https://github.com/type-challenges/type-challenges/blob/master/questions/9-medium-deep-readonly/README.ja.md)という問題になります。

内容はシンプルで、渡されたオブジェクトのそれぞれのプロパティを再帰的にreadonlyにする`DeepReadonly<T>`を実装せよ、という問題です。

## 期待する挙動

```typescript
  type X = { 
    x: { 
      a: 1
      b: 'hi'
    }
    y: 'hey'
  }
  
  type Expected = { 
    readonly x: { 
      readonly a: 1
      readonly b: 'hi'
    }
    readonly y: 'hey' 
  }
```

## tl;dr（要約）
Homomorphic Mapped Typesは型引数にプリミティブを渡すとそのままプリミティブ型となるので、再帰処理のエスケープとして使うと以下のように記述を短くできます。

```typescript
type Builtin = Function | Date | Error | RegExp;

type DeepReadonly<T> =  T extends Builtin 
 ? T
 : { readonly [key in keyof T]: DeepReadonly<T[key]>}
```
## 正攻法
順当にいくなら、プリミティブ型をあらかじめ定義しておき、プリミティブかそうでないかで再帰呼び出しを行う型を定義すればいけそうですね。

```typescript
type Primitive = number | string | boolean | bigint | symbol | undefined | null;
type Builtin = Primitive | Function | Date | Error | RegExp;

type DeepReadonly<T> =   T extends Builtin
  ? T
  : { readonly [ key in keyof T]: DeepReadonly<T[key]>}

```

## 別解
しかし、別回答を覗いていると、こんな回答がありました。

```typescript
type Builtin = Function | Date | Error | RegExp;

type DeepReadonly<T> =  T extends Builtin 
 ? T
 : { readonly [key in keyof T]: DeepReadonly<T[key]>}
```

もはやプリミティブの定義すらされていません。
私はここで頭を長い時間捻ることになりました。

## Homomorphic Mapped Typesの特徴
実は、 Homomorphic Mapped Types[^1]は**`keyof T`のTの型引数にプリミティブが突っ込まれたらプリミティブが返ってくる**という仕様になっているようです。
私はこれを知らず悩む羽目になりました。

```typescript
type Mapped<T> = { [key in keyof T]: any}
type Foo = Mapped<string> // これはstring型になる
type Bar = Mapped<number> // これはnumber型になる
```
[^1]:  `{[key in keyof T]:K}` といった形で表されるmapped typeのことを指す



つまり、上記の例の

```typescript
type DeepReadonly<T> = { readonly [key in keyof T]: DeepReadonly<T[key]>}
```
の部分は、プリミティブ型がTに渡されれば右辺はイコールそのプリミティブ型になり再帰処理が走らず、プリミティブ型以外がTに渡された場合は再帰処理を含む右辺が走るようになるというわけです。

ちなみにConditional Typeとして書かれていた条件分岐は、プリミティブではないがそのまま出力して欲しい型が別途定義されています。

## 感想
そんな使い方もあるのか〜と感心した反面、わかりやすさという面では微妙な気がするので、自身で使うことはないかなと思いました。
ですがまた出てきた際に理解できるようになったはずなので、良い勉強になりました。
【Tableau】 ダッシュボードのコンテンツ配置を使いこなす

# はじめに
こんにちは。
本記事がQiita初投稿になります。株式会社ジールの[@ys_zdh](https://qiita.com/ys_zdh)と申します。
Tableauをメインに、備忘録も兼ねてナレッジの共有をしたいと思います。
※ver2021.3を使用

# コンテンツ配置、うまくできない
今回はTableau Desktopの「水平方向」と「垂直方向」の設定のコツをお伝えします。
皆さんはTableauのダッシュボードを作成するとき、
コンテンツの配置がうまくできなくて困ったことはありませんか？

例えば、以下のように縦2×横2のコンテンツ配置をするとき…
![スクリーンショット 2021-11-22 151122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/e9e33663-67ae-8ff3-a131-58233160b9b3.png)
※
階層の構造としては、「水平方向」の中に「垂直方向」を2つ配置したい
![スクリーンショット 2021-11-22 151819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/048b958a-c56d-b2bf-fed6-7c41043075fd.png)
のですが、ドロップしても狙った配置にならないことが多いです。
例えば…
![スクリーンショット 2021-11-22 151938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/2302961d-2611-ca27-babe-e8a4be380824.png)
こうなったり…
![スクリーンショット 2021-11-22 152033.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/7af897d4-d21c-2eac-6672-d30ac94a59d3.png)
下の階層に入ってしまったり…。

私が修行不足なだけかと思っていたのですが、Googleで調べてみると
「tableau コンテナ 入らない」
というキーワードが出てくるので、どうやら私だけではないようです。

# 解決策
上の階層のコンテナに**先にオブジェクトを追加しておく**とうまくいきます。

上記の例では、「水平方向」に「垂直方向」を2つ配置する前に
「水平方向」の中にテキストや空白のオブジェクトを配置しておきます。
![スクリーンショット 2021-11-22 152800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/a3d37b2f-c369-edbc-665d-9b9f7e9ef5c9.png)
※わかりやすいように枠線とバックグラウンドに色を付けています。

そのあと、「垂直方向」を2つドラッグ&ドロップしていきます。
コツは2つ目の「垂直方向」をドロップするときに…
![スクリーンショット 2021-11-22 155253.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/549d7c0c-2b7b-8d21-fc5c-fb6ae47a909c.png)
**青い点線にグレーの網掛け**(画像内赤枠部分)が表示されたタイミングでドロップする！
ことです。
![スクリーンショット 2021-11-22 154731.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2192521/196824fd-7fb3-3557-9de2-5ec891f9ab10.png)
はい、いい感じに配置できました！
レイアウトペインの項目の階層を見ても、問題なさそうですね。
あとは、はじめに追加したテキストや空白のオブジェクトを削除すればOKです。

# おわりに
「水平方向」や「垂直方向」を使用すると複雑な配置を簡単に表現できるので、
今回ご紹介したTipsをぜひ活用してみてくださいね！
MQの単体テスト

備忘録。記載している内容をまったく理解していない。
ただ、今後MQ担当になった場合の自分用。

1.
MQの導入バージョン確認

```
dspmqver
```
2.rpmパッケージ確認

```
rpm -qa | grep MQ
```

3.インストール時の確認

````
cat /etc/opt/mqm/mqinst.ini
````

4.MQ構成ファイル確認（mqs.ini）
ノード上のすべてのキュー・マネージャーに関連する情報が入っています。これは、インストール時に自動的に作成されます。
https://www.ibm.com/docs/ja/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-con-doc-q018700--htm

※事前作成して、置き換えOKみたい。。

```
cat /var/mqm/mqs.ini
```

5.キューマネージャー構成ファイル
※事前作成して、置き換えOKみたい。。

```
cat  /var/mqm/qmgrs/キューマネージャー名/qm.ini
※クラスタ構成だと、共有ディスクに配置するもの
```

6.MQオブジェクト定義確認

```
/opt/mqm/bin/dmpmqcfg -m キューマネージャー名 -a > /tmp/aaa.txt
```

7.キューマネージャーの起動

```
strmq キューマネージャー名
dspmq
※STATUS(Running)であること
ps -ef | grep mqm
```

8.キューマネージャーの停止

```
endmq キューマネージャー名
dspmq
※STATUS(Running)でないこと
ps -ef | grep mqm
```

9.dspmqinstコマンド

```
-bash-4.2$ /opt/mqm/bin/dspmqinst
InstName:      Installation1
InstDesc:
Identifier:    1
InstPath:      /opt/mqm
Version:       9.1.0.0
Primary:       No
State:         Available
-bash-4.2$
```
MS試験の答えのディスカッションサイト

ネット上の問題集の回答が正しくない場合が良くあります、上記のサイトでは答えの検討が多いので、より正確な答えを見つけることが出来るかと思います。
https://www.examtopics.com/exams/microsoft/pl-200/
![MicrosoftTeams-image (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2307534/6707dcd6-2778-c3de-00e1-07209e77b226.png)

PL試験以外にMBシリーズの試験もあります。
【Python】データ分析 （個人的メモ）

データ分析の勉強を進めるにあたってのメモです.
随時加筆します. qiitaの記法の練習も兼ねてます. 簡略してかいてます.

.sum()のところは様々な関数が入ります.


#初日
### データの結合
+ 縦結合（行方向に増やす）
  + データ件数は増える
  + つまり項目は増えない
  + `pd.concat([データ1, データ2], ignore_index="True")`

+ 横方向（列方向に増やす）
  + データの項目を増やす
  + 項目が二重にならないようにする
  + `pd.merge(データ1, データ2["列",..., "列"], on="列", how="left")`
     + on="共通するデータ列"
     + how="left/right", どの方向から結合するか, 基本左？  

###統計量表示
`.describe()`で統計量表示

###データ確認
 `.dtypes`でデータ確認

###集計
`.groupby("集計したい列").sum()["表示させたい列"]`で集計

###表作成
`pd.pivot_table(データ, index="列", columns="列", values="列", aggfunc="sum")` で表作成

###プロット
`plt.plot(横軸, 縦軸, label="ラベル名")`
 
+ `import matplotlib.pyplot as plt` のもと
+  横軸は`list`型にして渡す

見にくい→ちょっとみやすくした　

#2日目
###ソートして表示
`.sort_values(by="列", ascending=True)`

+ Trueで降順, falseで昇順

###任意の要素（複数）を参照
`データ名.loc["条件が付与された行", "表示したい列"]`

+ ex) `.isnull()` などをして欠損値があった行(=True)における列を参照
+ `list()` すると表示したい列の配列になっている

###重複を無視
`.unique()`

###型変換
`.astype("変換したい型")`

+ 重複を無視した要素の配列が返ってくる

###数値→日付に変換
`pd.to_timedelta("float型の数値", unit="D")`

+ `datetime型になる`

###列の削除
`.drop("列名", axis=1)`

###その他
+ `pd.pivot_table("データ名", index="列", ...)` と `データ名.pivot_table(index="列", ...)` はどちらでも良い
+ `.isnull()`は欠損値の有無を確認→`True か False`が出力

#3日目

###その他
+ `.isna()` = `.isnull()`
+ `.where()` で フラグをつくる

#4日目
特になし, どのデータが必要かまだわかっていない

#5,6日目
特になし, 5章までの内容が基本的な部分.

# 資料
秀和システム社の [「Python 実践データ分析 100本ノック」](https://www.shuwasystem.co.jp/book/9784798058757.html)で勉強してます.
WAS設計 画面の操作の豆知識

大した内容ではないですが
この部分の設定はwsadminではできません。
※俺が知らないだけの可能性大。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2291303/c043d329-8531-f74c-a25f-058c1f84aeab.png)


ファイルから変更する部分はどうも
/opt/IBM/WebSphere/AppServer/profiles/Dmgr01/consolepreferences/xxxxxxx以下の

```preferences.xmlというファイルみたい。

            <entry key="auto-refresh" value="true"/>
            <entry key="descriptionsShow" value="true"/>
            <entry key="noDiscardConfirm" value="false"/>
            <entry key="syncWithNodes" value="true"/>
   
````

![Something went wrong]()
【SAP S/4HANA】Project Management ワークストリーム内の役割

## Project Management ワークストリーム内の役割

### プロジェクト・スポンサーとは
- ステアリング・コミッティーのTOP
- プロジェクト・マネージャーを任命する
- プロジェクト目的を設定する
- 戦略と方針を決定する
- プロジェクト憲章を承認する
- プロジェクトのすべての側面において決定権を持つ

### プロジェクト・マネージャーとは
- ステークホルダーやチームにプロジェクト目的を詳しく説明する
- PMBOKのプロセスや知識エリアの内容に従ってプロジェクトをステアリングする

### プロジェクト・アドミニストレーターとは
- プロジェクト・マネージャーを支援する
- プロジェクト内ステータスの収集、KPI計算を実施する
- プロジェクト用の調達を担当

### 品質マネージャーとは
- 納品物の品質が受入条件を満たしていることを保証する
- チームがクオリティゲートを完了することを保証する
- 品質標準を設定する
- 受入条件が設定されていることを保証する
- DoR(Readyの定義)、DoD(DONEの定義）が設定されていることを保証する
- クオリティゲートのプロセスにおいてユーザ側プロジェクト・マネージャーを補佐する

### ITマネージャーとは
- プロジェクトの目的が組織の目的にあっていることを保証する

### エグゼクティブ・コミッティーとは
- ビジネスゴールを設定する
- プロジェクトビジョンを承認する
- プロジェクト予算を確保する
- ステアリングコミッティに一部の責任を委任する

### ステアリング・コミッティーとは
- プロジェクトのゴール、結果、変更を承認する
- オペレーティングコミッティに一部の責任を委任する
- 課題についてエグゼクティブコミッティーにエスカレートする

### オペレーティング・コミッティーとは
- すべてのワークストリームの監視と調整を行う
- 未解決課題をステアリングコミッティーにエスカレーションする
- インテグレーションコミッティに一部の責任を委任する

### インテグレーション・コミッティーとは
- 結合作業、マスターデータ、リリース戦略をプロジェクトを通して管理する

----

[EOD]
Flutter でジャンケンアプリを作ってみる

## 概要
Flutterについての調査をお願いされたので
試しにじゃんけんアプリを作ってみる


## ソースコード
```dart:main.dart
import 'package:flutter/material.dart';
import 'dart:math' as math;

void main() {runApp(const JankenApp());}

class JankenApp extends StatelessWidget {
  const JankenApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'じゃんけん',
      theme: ThemeData(primarySwatch: Colors.yellow,),
      home: const JankanPage(title: 'じゃんけんアプリ'),
    );
  }
}

class JankanPage extends StatefulWidget {
  const JankanPage({Key? key, required this.title}) : super(key: key);
  final String title;

  @override
  State<JankanPage> createState() => _JankanPageState();
}

class _JankanPageState extends State<JankanPage> {
  final List<String> _janken = ['✊', '✌️','🖐'];
  final math.Random _rand = math.Random();
  String _handForm = '👐';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar( title: Text(widget.title),),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(_handForm, style: Theme.of(context).textTheme.headline1,),
            ElevatedButton(
              child: const Text('じゃんけんぽん'),
              onPressed: (){ 
                setState(() {
                  _handForm = _janken[_rand.nextInt(_janken.length)];
                });
              },
            ),
          ],
        ),
      ),
    );
  }
}

```

## 動かしてみる

###Webアプリ
![スクリーンショット 0003-11-22 15.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/b6c09249-244a-c486-d24c-028df1fed9b6.png "Web アプリ 起動時")
![スクリーンショット 0003-11-22 15.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/12025b63-d98c-2460-44bc-42e9a2c4a192.png "Web アプリ じゃんけん")

###iPhoneアプリ
![スクリーンショット 0003-11-22 19.42.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/ef84ac11-bb38-4f07-b722-f6d0a24a5c19.png)

![スクリーンショット 0003-11-22 19.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481708/a681c884-4d26-a27b-2e29-91080fb124b2.png)

同じコードでどちらでも動作しました。

## 解説

一番大元のクラスが `JankenApp`クラスで `StatelessWidget`
`JankenApp`内に `JankenPage`を表示
`JankenPage` クラスは動的に変化するので `StatefulWidget`
`JankenPage` クラス内で `State<JankenPage> createState()` を
`_JankanPageState` インスタンスを返す形に上書きする。

`_JankanPageState` 内に`Scaffold` をベースとした画面部品を記述している。
状態の変更がある部分を 'setState(){}' で記述する。

## 感想

###### Dart
Swiftと同じ感じ
###### Flutter フレームワーク
SwiftUIと同じ感じ

Webアプリとモバイルアプリ(iOS/Android)同時に作れるのは便利そう。
宣言型フレームワーク、モダン言語はこれからの主流になるんでしょうね。

まぁ慣れていくしかないなぁ...
railsのトップページを表示するまで

　毎回railsのトップページを表示させるまで、必ずどこかでエラーが発生するので記録しておきます。
　※動作はCloud9、DBはMySQLで実施しています。

#1.railsの新規作成
```
$ rails new アプリケーション名 -d mysql
```
ここでDBを指定しない場合は

```
$ rails new アプリケーション名
```

#2.database.ymlのパスワード入力
confingディレクトリのdatabase.ymlのpasswordを入力

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: パスワード
  socket: /var/lib/mysql/mysql.sock
```
パスワードは直接入力するとセキュリティ上問題が発生するおそれがあるため、環境変数を推奨。

#3.データベースの新規作成
```
$ cd アプリケーション名
```
でディレクトリを変更した後に

```
$ rails db:create
```
を実行。

#4. サーバーの起動
新たにターミナルを立ち上げてから

```
$ cd アプリケーション名
```

でディレクトリを変更、

```
rails server
```

を実行。

#5.プレビュー
Cloud9の場合は
![Inked2021-11-18 (3)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2222596/c4fd773a-8b93-a6e8-5d94-fbda32d47c2b.jpeg)
このボタンを押して、ブラウザで開くと・・・
![2021-11-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2222596/f041ceea-98e8-1527-73e3-9a329c2563ab.png)
railsのトップページが開きました！