OmniAICreator/Qiita-1.07M huggingface dataset:
初投稿~自己紹介~

# はじめに
記事の書き方は[この方の記事](https://qiita.com/U-MA/items/996ae933ae94c5711883)を参考にさせていただきました。

とてもわかりやすい内容で非常に助かりましたありがとうございます！

# 簡単な自己紹介
現在名古屋大学に通う、春から学部4年の大学生です。（専攻は機械航空宇宙系です）

インターン生としてエンジニア業務を経験させていただいています。

情報発信の大事さを実感したため、これから少しずつ自身が学んだ記事を投稿していこうと思います！
Glue Jobのバージョン履歴とサポート期間をまとめた

AWSのGlue Jobはバージョンが毎年のように上がっています。古いバージョンはサポートが終了します。サポートが終了してもJobを実行することはできますが、セキュリティパッチなどAWSが面倒見てくれるはずの部分が放置になります。AWSサポートの対象からも外れます。したがってサポートが終了するまでに稼働しているJobのバージョンを上げるべきです。

そこで、これまでのバージョンのリリース日とサポート期間を整理しました。Glue 3.0と4.0はサポート終了がまた予告されていません。

| バージョン | リリース | サポート終了 |
| ---- |  ---- | ---- |
| Glue 1.0 | 2019/07/25 | 2022/09/30 |
| Glue 2.0 | 2020/08/10 | 2024/01/31 |
| Glue 3.0 | 2021/08/19 | |
| Glue 4.0 | 2022/11/28 | |

これまでの傾向としては毎年のようにバージョンがあがり、各バージョンは3年ほどでサポート終了しているようです。

最近のバージョンアップの内容はここに書いてあります。

[AWS Glue のバージョン - AWS Glue](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/release-notes.html)

古いバージョンのサポート終了スケジュールはここに書いてあります。

[AWS Glue バージョンサポートポリシー - AWS Glue](https://docs.aws.amazon.com/ja_jp/glue/latest/dg/glue-version-support-policy.html)

リリース日の出典は以下です。

- Glue 1.0
    - [AWS Glue now supports the ability to run ETL jobs on Apache Spark 2.4.3 (with Python 3)](https://aws.amazon.com/about-aws/whats-new/2019/07/aws-glue-now-supports-ability-to-run-etl-jobs-apache-spark-243-with-python-3/)
- Glue 2.0
    - [AWS Glue version 2.0 featuring 10x faster job start times and 1-minute minimum billing duration | AWS News Blog](https://aws.amazon.com/blogs/aws/aws-glue-version-2-0-featuring-10x-faster-job-start-times-and-1-minute-minimum-billing-duration/)
- Glue 3.0
    - [­­­­­­Introducing AWS Glue 3.0 with optimized Apache Spark 3.1 runtime for faster data integration | AWS Big Data Blog](https://aws.amazon.com/blogs/big-data/introducing-aws-glue-3-0-with-optimized-apache-spark-3-1-runtime-for-faster-data-integration/)
- Glue 4.0
    - [Introducing AWS Glue 4.0](https://aws.amazon.com/about-aws/whats-new/2022/11/introducing-aws-glue-4-0/)
[Go]事前条件,事後条件,不変条件

IDDD本で契約プログラミングという言葉が出てきて、ちょっとよくわからなかったので調べつつ、Goのコードに落とし込んだらこうなるのかな、というまとめ

# 契約プログラミング
「不変条件」、「事前条件」、「事後条件」で構成される「契約」を考慮してクラスを設計することで安全性を高めようというもの。

**不変条件(precondition)**
クラスが持つ公開された全てのメソッドの開始・終了時点でクリアすべき条件。ざっくりいうと「クラスのメンバに対する条件」。なお、Wikipediaによると、
> ただしコンストラクタ[注 7]の呼び出しに関しては、事後条件としてのみ適用され事前条件として保証する必要はない[13]。

**事前条件(postcondition)**
メソッド開始時にクリアすべき条件。ざっくりいうと、「メソッドの引数に対する条件」 + 「不変条件」

**事後条件(invariant)**
メソッド正常終了時にクリアすべき条件。ざっくりいうと「メソッドの返り値に対する条件」 + 「不変条件」。

# Goでの実装
Goの構造体に対して契約プログラミングしようとすると、それぞれの関数・メソッドに対しては以下のチェック処理の実装が必要になるのかなーと思う。

- コンストラクタ(関数)
    - 事前条件チェック: 引数チェック ※1
    - 事後条件チェック: 戻り値チェック + フィールド値チェック(不変条件)
- フィールド値の変更を伴わないメソッド
    - 事前条件チェック: 引数チェック + フィールド値チェック(不変条件)
    - 事後条件チェック: 戻り値チェック ※2
- フィールド値の変更を伴うメソッド
    - 事前条件チェック: 引数チェック + フィールド値チェック(不変条件)
    - 事後条件チェック: 戻り値チェック + フィールド値チェック(不変条件)


※1: 不変条件チェックがないのはそもそもまだインスタンス化してないわけで、そもそもできないし。
※2: 不変条件チェックがないのはフィールド値の変更を伴わないならやってもしゃーないし(とはいえ本当に変更してないよね？という意味も込めてチェックするのはありなのかもしれないけど)


これを踏まえて、以下の状況を例として[実装してみた](https://go.dev/play/p/pY_rG2MqxOd)。
- 「得点」フィールドのみを持つ「学校のテスト」構造体
- 得点は0〜100の間
- コンストラクタ定義する
- 加算メソッドを定義する


# 参考
https://ja.wikipedia.org/wiki/%E5%A5%91%E7%B4%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0

https://neos21.net/blog/2019/10/05-01.html
ポケモンsvのポケモンを簡単にレベル100にする方法

レベル上げの効率的なやり方
①クリア後は星5・6レイド上げが最高効率
ストーリークリア後はマップの各地に星5レイドバトルが解放される。星5や星6のテラレイドでは、「けいけんちアメL」や「けいけんちアメXL」を入手できるため、1匹のポケモンを育成する際は最も効率が良いレベル上げとなる。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
けいけんアメL	使うと経験値「10,000」
けいけんアメXL	使うと経験値「30,000」
②レベル100までの必要経験値の例
Lv100までに必要な経験値は、大きく分けると4パターンに分かれる。パターンAのポケモンであれば、星6レイドに十数回参加すれば100レベルに到達できる見込み。
パターンA	パターンB	パターンC	パターンD
約80万	約100万	約105万	
私がやってみて、経験値飴をレイドでゲットし、それでレベル上げが一番いいかと思いました。
自分より賢い部下を導く5つの指導法



## 賢い部下は「重たい」


賢い部下がいることは一見すると素晴らしいことのように感じられます。

ですが、実際にはいくつかの問題点も存在します...。

まずはいくつかの例を挙げてみます。

### 上司の負担が増加する

賢い部下がいる場合、上司は彼らの能力やアイデアを活かすために、彼らを適切に指導したり、評価したり、フィードバックを行ったりする必要があります。これにより、上司の負担が増加することがあります。

通常の部下よりも仕事のスピードが早く、逆にプレッシャーを感じる場面も多いでしょう。
**賢い部下を抱えるとは、自分の家の家事をこなさなければならないのにそのうえメンテナンス費用のかかるフェラーリを抱えているようなものです。**




### チーム内のバランスが崩れる

賢い部下は、他の部下と比較して、能力やスキルが高いことが多いため、彼らが中心となってチームが動いてしまうことがあります。これにより、他の部下の貢献が薄れたり、モチベーションが下がったりすることがあります。

- 賢い部下を評価しない→「能力主義ではなく年功序列であるという組織の評価につながる」
- 賢い部下を評価する→「部下の間で能力の差が激しく、平等ではない」

どちらをとっても地獄...。


### 部下の自立心が失われる

賢い部下に適切な指導やフィードバックを行わないと、彼らが自立心を失ってしまう可能性があります。上司が彼らの考えやアイデアをすべて採用し、彼らに適切なチャレンジや成長の機会を提供しない場合、彼らは自己肯定感を失い、モチベーションが低下する可能性があります。

しかも、**賢い部下であればあるほど、他社への転職のリスクが高く、ハイリスクハイリターンな存在でもあります...**

> 現に私の前職の上位3人は3年絶たないうちに転職していしまいました。


### 上司との対立が生じる

賢い部下は、自分のアイデアや意見を持っていることが多いため、上司と対立することがあります。これは、上司が彼らのアイデアを採用しなかったり、彼らに適切なフィードバックを行わなかったりする場合に起こります。

「なぜ部下のアイデアを採用しなかったのか」「どの点をクリアすれば採用されたのか」を明確に提示しなければなりません。



## 以下詳細


主に7つ

1. 目標やビジョンを共有する
2. 指示するだけでなく、相談や意見交換を行う
3. 評価やフィードバックを適時に行う
4. チャレンジングな仕事やプロジェクトを与える
5. 尊重し、信頼を築く
6. 社会人としてのマナーや社内ルールは教える
7. いろいろな立場の人間がいることを教える（異文化コミュニケーション）




https://minegishirei.hatenablog.com/entry/2023/02/24/185303
Microsoft Teamsで「チャネル会議」を使うメリット・具体的な活用法

# はじめに
Teams会議には、大きく2種類ある。(「チャネル会議」と「非チャネル会議」)
※厳密にはもう少し細かく分類できるが、本記事では不要なため省略する。


# チャネル会議とは
本記事では、「特定の『チーム』内の『チャネル』と関連づけられているTeams会議」と定義する。


# チャネル会議・非チャネル会議の見分け方
会議のチャットがどの画面に表示されるかどうかで見分けられる。
- チャネル会議＝「チーム」画面の「チャネル」にチャットが表示される
- 非チャネル会議=「チャット」画面にチャットが表示される


# チャネル会議を使うメリット
## チーム内の「誰が」「いつ」「誰と」「どれぐらい」「どんな」議論をしているのかを可視化できる
非チャネル会議が主流になっていると、自分が招集されていない会議の情報がほとんど把握できない。
チャネル会議が主流になっていれば、自分が招集されていない会議の情報も把握可能である。
これにより、チーム全体の暗黙知を減らしたり、先輩社員同士の議論を視聴することによる後輩の成長を助けたり、会議の非効率を発見しやすくしたり、様々なメリットを享受できる。
※リモートワーク比率が高い職場では、このメリットは特に大きいと考えられる


## オフラインで可能な「議論への飛び込み参加」が可能になる
非チャネル会議では、会議招集されていない人が自ら議論に参加することはできない。
チャネル会議では、会議招集されていなくても、自ら必要と判断した会議にいつでも自由に参加できる。


## ファイルの保存場所が個人のOneDriveではなくSharePointになる
非チャネル会議では、会議中にアップロードしたファイルや、会議の録画ファイルの保存先は、アップロードした人のOneDriveになる。
一方で、チャネル会議では、OneDriveではなくSharePointに保存される。
これにより、例えば以下のような恩恵を受けることができる。
- アクセス権限の追加設定が不要になる
- アップロードした人が退職しても心配ない


## (管理者の設定次第では)チャットの保存期間が延長される
「チャット」画面のチャットよりも「チーム」画面のチャットのほうが保存期間が長く設定されている場合、チャネル会議を利用することでチャットの保存期間を延ばすことができる。


# チャネル会議の具体的な活用法
## 会議専用のチャネルを用意する
通常のチャットを行うチャネルと区別することで、会議情報を１つのチャネルに集約できる。


## 「原則チャネル会議」をチーム內部で周知徹底する
複雑性の高いルールは機能しにくい。
また、チャネル会議利用における懸念は後述のもののみである。
以上より、「原則チャネル会議」を周知徹底することが効果的である。


# 「チャネル会議」を推進する際に懸念されることとその対応策
## 機密性の高い情報を扱う会議に利用可能かどうか
人事評価や1on1等、組織の方針からチーム全体で共有することが不適切と判断した議論について、チャネル会議を使ってもいいのだろうか。
個人的見解として、以下運用が適切ではないかと考える。
- 人事評価に関する議論：チームメンバーを制限した人事評価専用の「チーム」を作成し、そのチーム内でチャネル会議を実施する
- 一般的な1on1：チャネル会議を利用するが、議事録へのアクセス権限は1on1参加者のみに限定する
- 特殊な1on1(例：ハラスメントや退職の相談)：チャネル会議は利用しない

## 会議招集のメールがチームメンバー全員に送信されてしまうのではないか
チームの作り方によっては、会議招集が全員に送信されてしまうことがある。
対処法は以下参照。

https://shunsukekawai.hatenablog.com/entry/2021/06/04/100356

# 参考文献
https://www.amazon.co.jp/gp/product/4295011762
AWS環境でのIBM Turbonomic

本日は少々古い記事（昨年11月）になりますが、AWSさんのブログとしてTurbonomicをご紹介頂いているページがありますので、そちらを少しご紹介させて頂きたいと思います。（ブログでブログのご紹介っていう。。）

## IBM TurbonomicとAWSによる弾力性で持続可能なITを実現する (2022年11月記事)
https://aws.amazon.com/jp/blogs/apn/achieving-sustainable-it-through-elasticity-with-ibm-turbonomic-and-aws/

英語のブログになりますので、ブラウザの翻訳機能などで変換すると読み易いかもしれません。


こちらでは、まず大きな話として、AWSとIBMはどちらも[欧州気候中立データセンター協定](https://www.climateneutraldatacentre.net/signatories/)に参加するなど、サステナブルなIT運用を目指している点、また、その実現の為には、AWS自体がクラウド基盤（データセンター・サーバなどのHW）の効率的な運用を行う一方で、**クラウドの中**のサステナブルな運用はお客様が行う必要があり、そのためのツールとしてTurbonomicの有用性をコメント頂いています。

要約すると以下の3点をご紹介頂いているかと思います。


#### 1) AWS環境上でのリソースの関連性の可視化
* アプリケーションからクラウドリージョンまでの可視化。
* 最上位のアプリケーションから始まり、アプリが存在するコンテナ、仮想マシン、ストレージボリューム、さらにリージョンの配置など、アプリケーションをサポートする基盤となるインフラストラクチャ全体の可視化が可能。

#### 2) リソース消費の最適化アクション
* そんな各種リソースの中で、どこが逼迫しているのか？逆にどこが余っているか？また、そういったリソースがあったとして、アプリケーションに影響を与えずに、且つコストメリットを最大化するには、どういったアクションが必要か？
* Turbonomicに継続して提案させることで、アプリケーションの実行に必要なものだけを無駄なく消費することを継続的に保証。

#### 3) クラウドの移行計画からクラウド移行後も最適な構成を
* 既存の（無駄を抱えたままの）構成でのクラウドへの移行ではなく、最適化し無駄を省いた構成での移行をサポート。
* 実際にクラウドへ移行した後にも継続して最適なリソース管理を継続し、コストメリットを最大化させる。

など。その結果、**「Creating a truly sustainable elastic cloud」**という事で、本当の意味での**持続可能**な**弾力性ある**クラウドが実現できる、とされています。


## 個人的？な感想（ブログ）
実際、この**弾力性**と**持続可能**というキーワードは非常に重要ですよね。
もともとAWSの各種サービスにはEC2を始めとして、**Elastic**（弾力性）という単語が多用されている通り、弾力性があるからこそ柔軟な運用が可能で、それによってパフォーマンス・コストメリットの最大化が可能になる、という点がクラウドの一番美味しい部分かと思います。

ただ、現実的には以下の様なケース、結構あるかと思います。
* IT環境のモダナイズを目指していたが、結局クラウドへの移行が目的となってしまい、当初予定していた程コストメリットが出ない（Liftだけで終わってしまった。むしろコストオーバー）
* たまに（年1回とか）構成の見直しは行うが、継続的に出来ていないため機会損失しているケース（半年前にやっていれば累積でxx百万円はトクしていた…）
* パフォーマンスリスクの放置（ある日、閾値超えてやっと気が付いた）
など。。

**持続可能**な**弾力性**があれば、この辺りの問題は解決できるわけで、AWSさんのブログ、イイこと書いて頂ているなぁ、と勝手に嬉しく思った次第です。
（とはいえ、思いっきり弊社のUS側のエンジニアの名前も書いてあるので、まぁ、そこはそりゃそうですね、というところはありますが（笑

以上、今回はAWSさんのサイトのブログを取り上げさせて頂きました。

なお、Turbonomic自体は、今月になって[8.8.0という四半期に一度リリースレベルのバージョンが公開](https://community.ibm.com/community/user/aiops/viewdocument/turbonomicurl-2023?CommunityKey=1507c7fa-70f3-451c-a5f6-eed79a229022&tab=librarydocuments)されており、v8.7.xで追加された各種機能強化を含む最新の安定バージョンとなっておりますので、この辺りの内容についても追って改めてご紹介できればと思います。

引き続きどうぞ宜しくお願いいたします！



<br><br><br><br>


#### おまけ：個人利用のクラウド環境での発見
なお、実際、私自身も個人用途でAWS/Azureを利用させてもらっており、それなりにリソースの無駄遣いは無いようにしていたつもりだったのですが、先日、試しにTurbonomicの管理対象に追加した事で以下の様な発見がありました。（お恥ずかしくも…）

* 全く使っていないボリューム（どこでどう残っていたの、今となっては分かりませんが、明らかに消したはずのインスタンスのディスクが。）
* なぜかUSリージョンに残っていた仮想マシン（これもそういえば作った覚えはあるのですが、すっかり忘却の彼方に。普段Tokyoリージョンの画面しか見ていないので。。）
* t3よりもt3aの方が安い
知ってる人は当たり前かもですが、t3**a**の方が少し（10%くらい）安いんですね。あまりちゃんと意識した事なかったです。。これを機会に全部t3aに変更しました。
* バックアップサーバとして利用していたインスタンスが実はほぼCPU使い切っていた。（ただ、これはバックアップ時間が少し伸びるだけで、個人的には実影響ないので、そのまま放置。）

そうえいば最近月々の請求が10,000円を超えていたので、ちゃんと確認しないとなぁ、と思っていたのですが、、、来月は半額以下になりそうです（笑
NCMBのプロキシサーバーを使ってノーコードと連携する

ニフクラ mobile backendでは認証やデータストア（クラウドデータベース）、ファイルストア（ファイルストレージ）、プッシュ通知など様々な機能があります。そして、サーバーレスで拡張できるスクリプト機能もあります。

しかし、実際のアプリ要件は多彩で、場合によっては他にも様々な機能が望まれます。すべての需要を満たすのは困難な場合もあります。そこで、NCMBのフロントとして動作するプロキシソフトウェアを開発中です。

以前スクリプトを署名なしで実行できる機能を追加したのですが、今回はこれを使ってノーコードサービスであるIFTTTと連携してみました。

## 追加する機能（予定）

現状は透過的なプロキシ + リアルタイム通知くらいしかありませんが、以下のような機能を実装する予定です。

- 認証をJSON Web Tokenに
- GitHub認証
- ソーシャル認証（標準ではサーバー認証が必要ですが、プロキシだけで認証できるように）
- Webhooks
- 署名なしでデータストア操作
- 全リクエストログ記録

他にもデータストアの集計機能、GraphQL機能なども追加できると便利そうです。なお、Webhooksなどの機能はプロキシ経由でしか実現できませんので注意してください（管理画面で操作しても実行されません）。

## IFTTTの設定

今回は新しいツイートがあると、それをNCMBのデータストアに保存する設定をしました。Twitterが更新されたら、Webhookで `(プロキシのURL)/script/ifttt.js` をPOSTで呼び出します。

呼び出す際のJSONオブジェクトとして、以下を設定します。Content-Typeは `application/json` です。

```json
{
  "text": "<<<{{Text}}>>>",
  "created":  "<<<{{CreatedAt}}>>>" 
}
```

![0813 ifttt.com - 0224182713.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/fe99c601-6217-deed-fb96-66db674f25a8.jpeg)


## インストール

[NCMBMania/ncmb-proxy](https://github.com/NCMBMania/ncmb-proxy)のリポジトリをクローンします。

```
git clone git@github.com:NCMBMania/ncmb-proxy.git
```

ライブラリをインストールします。

```
npm i
```

## 設定の編集

`setting.example.yml` をコピーして `setting.yml` を作成します。そして、ファイル内にあるアプリケーションキー、クライアントキーをそれぞれお持ちのものに書き換えてください。

no_signatureキーのところに書かれたファイル名は、署名なしで実行できるスクリプトのファイル名になります。今回は `ifttt.js` というファイルは署名処理なしで呼び出せます。

```yaml
ncmb:
	applicationKey: YOUR_APPLICATION_KEY
	clientKey: YOUR_CLIENT_KEY
	script:
	    domain: script.mbaas.api.nifcloud.com
	    version: 2015-09-01
	    no_signature:
	      - ifttt.js
```

## サーバーを起動

サーバーを起動する際には、以下のコマンドを実行します（まだ開発中なので、開発用サーバーが立ち上がります）。

```
npm run dev
```

例えばローカルの場合、 `http://localhost:3000` にてサーバーが立ち上がります。

## NCMBのスクリプト

今回は受け取った内容をそのままIFTTTクラスにデータ保存します。このスクリプトはifttt.jsとして、POSTメソッドで登録します。

```jsx
const NCMB = require('ncmb');
const APPLICATION_KEY = 'NCMBのアプリケーションキー';
const CLIENT_KEY = 'NCMBのクライアントキー';

const ncmb = new NCMB(APPLICATION_KEY, CLIENT_KEY);

module.exports = async (req, res) => {
	const IFTTT = ncmb.DataStore('IFTTT');
	const ifttt = new IFTTT();
	for (let key in req.body) {
		ifttt.set(key, req.body[key]);
	}
	await ifttt.save();
	res.send({});
}
```

![0812 console.mbaas.nifcloud.com - 0224172307.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/94284531-d4dd-ec5e-48e5-73741142f1d9.jpeg)


## テストする

実際にツイートして、IFTTTを呼び出します。以下のようなJSONがIFTTTのログに残っています。 `<<<` と `>>>` はエンコードを行う指定です。

```json
{
  "text": "<<<これはテストメッセージです>>>",
  "created": "<<<February 24, 2023 at 06:36PM>>>"
}
```

![0814 ifttt.com - 0224183646.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a2c976e9-dd80-8e19-e27f-cc226a38d12f.jpeg)


管理画面でIFTTTクラスが作成されていて、データが登録されていれば完成です。

![0815 console.mbaas.nifcloud.com - 0224183655.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/83727b8a-29a4-cab2-422b-adb1aa31bf2e.jpeg)


## まとめ

通常のNCMBのスクリプト機能では署名なしの実行ができませんが、プロキシサーバーを使うことで制約を乗り越えられます。

プロキシサーバーを使えばノーコードツールと連携したり、LINEボットなども作成できます。ぜひ試してください。
【バグ？】ビジネスルールで複数選択肢が使えない【PowerApps】




## バグなのか？
結論バグではなくPowerAppsの仕様です。ご安心(？)ください.

## 説明
ビジネスルールではほとんどの列をアクションやトリガーにすることができます。
しかしなぜか複数選択の選択肢列を使うことができません。
しかも複数行だけ

## いつできるようになる？
これはどうにもわかりません。
ですが以前まで参照列もビジネスルールに使えなかったのですがこの2023年2月で改善されたようで、アクションにもトリガーにもできるようになっていました。
この流れで行けば使えるようになりそうな気もしますが、時期は未定です。。。

## 対応策
・Javascriptで実装
・テーブル化する
・単一選択肢で我慢する

目的にもよりますがこのあたりを駆使して対応する歯科さそうです。



## 過去にやりたかった具体例
### テーブル
A列（単一選択肢）
B列（複数選択肢）
### 顧客
できるだけローコードで運用しやすく設計してほしい
### 要望
A列に従ってB列で選べる選択肢を制御したいとの要望でした。

### 当時の対応策
A列の選択肢が5つほどしかなかったのでB列を5パターン作りました。
フォームに5つのB列が出っぱなしもだめなので、ビジネスルールでA列をトリガーとしてB列の表示/非表示を制御しました。

## 結論
できないので代替案で解決する。
マイナーアップデートで改善される可能性もあるので最新のDocsをチェケラーしてください。
↓↓
https://learn.microsoft.com/ja-jp/power-apps/maker/data-platform/data-platform-create-business-rule
自己紹介

# 初めまして

Qiita初投稿です。
東京都在住Syuto_BottiEngineerです


現職はAWSを使用して自社のクラウドエンジニア育成のコンテンツを作成しています。

（まだ２年目なのに…）

今回AWS SAP取得のためアウトプットのためにはじめてみることにしました。

よろしくお願いします。
エンジニアインターン17日目

今日は管理画面に商品の情報を再更新ボタンを設置し、そのボタンを押したらapiを呼び、DBにupdateされる仕組みを作った。awaitを使って非同期処理を利用した。vue.jsで複数のapiを並行したかったので、promise.allを使って複数のlambdaのapiを並列して実行することができた。作業はこのくらいかな？
インターンが終わってエンジニア交流会に参加した。自分はエンジニアで働いてらっしゃる方々の話が聞けるのでなるべく参加をしている。交流会には大学生や新卒などの同年代は少なく、ほとんどが年上の方たちである。社内にもエンジニアはいるが、もっといろんなエンジニアさんの意見や話をきけるので交流会や勉強会などはとても良いと毎回思う。今年で大学2年になる自分はほぼ毎回参加している人たちに驚かれ、インターンやアルバイトをうちの会社でぜひ一緒にやらないか？と誘っていただく。やはり、エンジニアの需要はまだまだあるし、自分の将来性を見越しての提案だと思う。早い段階から始めてよかったと思うし、これからもがんばろってなった。とりあえず同年代のエンジニアかエンジニアを目指してる方たちと仲良くなりたい。
【MotionBoard】日時情報から最新のレコードを取ってきたい！

# やりたいこと
こんなデータがあったときに、最新の時刻（23:00:00）の不良件数を表示したい場合があります。
集計方法を「先頭値」にするとデータの先頭を参照可能ですが、この場合14:00:00のデータが該当し、不良件数20が表示されてしまいます。
![2023-02-24_17h40_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/74564535-05fc-c0e3-e762-e90b2dbb7b29.png)

![画像3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/6e9239ec-d16d-adb9-e097-41fbad91aaa7.png)


今回は、日時の情報から最新レコード（日時の新しいもの）のデータを表示する方法を紹介します。

# 方法
大まかな流れは以下
1. 最新の日時を取得するデータソース（最新日時取得用DS）を作成する。
1. 最新日時取得用DSの日時を検索条件に利用して、最新の日時で絞込む。

### 最新の日時を取得するデータソース（最新日時取得用DS）を作成

以下のように、行項目に「時刻」を置きます。集計項目は何でもOK！
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/162ec21c-d996-a123-c29c-8d3cda7802ae.png)

### 日時を検索条件に利用して、最新の日時で絞込
最新のデータを表示したいチャートに検索条件をつけていきます。行・列・集計項目は何でもOK。
※ 「最新日時取得用DS」とは別のデータソース
データソース編集画面の右上[検索]をクリックします。

![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/26b2d0d7-7f0d-a708-a699-48be1b4fac12.png)

次のように指定します。

* 「時刻」を検索項目へ
* [検索値の指定方法]：「コンボボックス」
* 比較条件：「等しい」
* [検索候補値]：「他データソース定義項目の値」
* [他のデータソース定義に設定された検索を実行した結果を利用する]にチェック
* [項目名]：「時刻」
* [初期値]：「!bottom」と入力
設定完了後、「OK」を押します。

![2023-02-24_18h02_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/5e4d4dd1-2213-481f-e657-93568fb88971.png)


### 結果確認
では結果を確認してみます。
今回、シングルデジタルで不良件数を表示しています。
チャートにはしっかり「23:00:00」のデータ、つまり「0」が表示されていますね。

![2023-02-24_18h07_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2254022/6c05387f-fa1d-243a-2080-b87323a23fb5.png)
フィクションなどから拾う情報処理用語 その37 データ圧縮 (科学戦隊ダイナマン)

実を言うと科学戦隊ダイナマンは(まさに)大人の事情もあって本放送を観ておらず、隙を突いて夏休みの再放送をたまに観ていたのでさほど知識はない。ただ、最初の放送時間は毎週土曜18:00 - 18:30（JST）で1983年4月9日放送分（第10話）から18:00 - 18:25（JST）に変更された。つまり大人の事情でデータ圧縮を余儀なくされてしまったのだ。その苦労は壮絶なものだっただろうと思う。それについて、鈴木武幸プロデューサーが自著で語っているので引用しよう。

鈴木武幸. 夢を追い続ける男 (Japanese Edition) (pp.141). Kindle 版. から 

実はこの『ダイナマン』は４月から放送時間が短縮されて25分枠になったことにも苦労させられました。オープニング、エンディング、予告を除くと本編は正味18分くらいなのです。これは厳しいと、メインライターの曽田博久さんに、物語に極力影響がないような脚本にしようと相談したのですが、どうやっても影響が出るに決まっています。曽田さんもこんなに短い脚本は書いたことがないと困っていました。そこで起承転結の「承」の部分を減らして、名乗りのシーンを短くして乗り切ろうという話になったのですが、なにしろ突然の枠変更だったのでお互いに大変な思いをしました。でもこの逆境から、よりスピーディーなアクション演出が確立したのも事実です。たとえばジャンプするにしてもきちんとひとりずつ、１、２、３、４、５人と続けてジャンプさせて各キャラクターを見せるわけです。名乗りのシーンやアクション、特撮シーンもある部分ではテンポを上げて見せることによって一気に畳み込むスーパー戦隊シリーズ独自の演出手法というのが出来上がったのがこの『ダイナマン』だったといえます。５分短いのをプラス思考に変えたことでスーパー戦隊の演出パターンが確立できたのだと思います。この25分枠は以降、14年くらい続くことになりましたが、時間枠が30分に戻ったときには逆になんだか間延びがしたような気がしてしまったものです。

鈴木武幸. 夢を追い続ける男 (Japanese Edition) (p.142). Kindle 版.  まで

でこないだ映画版のダイナマンをたまたま東映チャンネルで放送し、観たのと元々鈴木武幸プロデューサーの自著「夢を追い続ける男」を読んでいたことから思いついたネタもとい記事である。具体的なデータ圧縮のアルゴリズム(我ながら大仰な表現)は上記が全てを物語っているのだと思う。そう言う目で番組を観ると確かにそう言う作りになっているのが面白い。ただ私は未だ科学戦隊ダイナマンを全話観ているわけではないので所々つまみ食いして感じた感想に過ぎないので実際にどうなのかは映像で確認してほしい。
[!] CocoaPods could not find compatible versions for pod の解消法

1.対処方法1.「pod repo update」
2.対処方法2.「pod repo remove master」

```
pod repo remove master
pod setup
pod install
```

3.対処方法3.「リポジトリを更新しなおす」

```
cd ~/.cocoapods/repos
git clone https://github.com/CocoaPods/Specs.git master

pod setup
pod install
```

4.解決方法4. Podfileを修正する

> iOSとWatchOSは「pod 'AFNetworking', '~> 4.0'」と指定していたのですが、ユニットテストは「pod 'AFNetworking', '~> 3.0'」と別バージョンを指定してしまっていました。

- 以上、[CocoaPodsが正常にアップデートできない時の対処方法](https://program-life.com/1741)より引用

今回、私の場合、podfile上に


```
source 'https://cocoapods-cdn.netlify.app/'
```

[というのを追加していた](https://github.com/CocoaPods/CocoaPods/issues/10356#issuecomment-908896957)が、このようにカスタムsourceを指定する場合は、Cocoapodsマスターソースを明示的に指定する必要があったのに、それをしていなかったためこのエラーが起きていた。以下のように修正したところ、解消した。

```
source 'https://cocoapods-cdn.netlify.app/'
source 'https://github.com/CocoaPods/Specs.git'
```

参照: [Podfile Syntax Reference ](https://guides.cocoapods.org/syntax/podfile.html#source)
PHP：無名関数：無名関数ではuseキーワードを使うと親スコープの変数が使えてしまう

奇妙な無名関数の中の一つのオプション。
無名関数だけでは親のスコープの変数を取得することはできない。
そこでuseキーワードのオプションを使うと使えてしまうので便利。
無名関数やアロー関数は奇妙だが便利。便利だが奇妙。

useキーワードで奇妙なのが以下。
* function() に use(変数名)　と繋げて書く仕様なこと

書いても慣れない奇妙さ。

## 例
```php
$times = 3;
$numbers = [1, 2, 3];
// useキーワードによって親スコープの値が使える
array_map(function($num) use ($times) {
	return $num * $times;
}, $numbers);
```
Next.jsのインストールから、Cypressでテスト（e2e only）まで

## 参照
今回では、[Create a Next.js App](https://nextjs.org/learn/basics/create-nextjs-app)ではなく、Documentationの[Get Start](https://nextjs.org/docs)を参考して、構築しに行く
※[こちら](https://zenn.dev/devb/articles/7542dcbf309a0e)も掲示しています。

## Next.jsのインストール..
### requirements
node (>= 14.6)
yarn (1.22)：npm npxもよい、お好みで
MacOS, Windowsm Linux

### 自動か、手動でsetup & run nextjs
- [自動](https://nextjs.org/docs/getting-started#automatic-setup) `yarn create next-app`
↑　今回はこちらにしました、コマンドプロンプトからいろいろきかれますが、今回は全部yes
- [手動](https://nextjs.org/docs/getting-started#manual-setup) `yarn add next react react-dom`
- run `yarn dev`
![](https://storage.googleapis.com/zenn-user-upload/d2073f6e4473-20230222.png)
### [optional for vscode launcher: set up vscode launch.json](https://nextjs.org/docs/advanced-features/debugging)
- in {work space}/.vscode/launch.json copy following source
``` json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Next.js: debug server-side",
      "type": "node-terminal",
      "request": "launch",
      "command": "npm run dev"
    },
    {
      "name": "Next.js: debug client-side",
      "type": "chrome",
      "request": "launch",
      "url": "http://localhost:3000"
    },
    {
      "name": "Next.js: debug full stack",
      "type": "node-terminal",
      "request": "launch",
      "command": "yarn dev",
      "serverReadyAction": {
        "pattern": "started server on .+, url: (https?://.+)",
        "uriFormat": "%s",
        "action": "debugWithChrome"
      }
    }
  ]
}
```

DIRは、下記図の通り。
![](https://storage.googleapis.com/zenn-user-upload/09b27aac131a-20230222.png)

## Cypressでテスト（e2e only）

#### [cypress](https://nextjs.org/docs/testing)
- End-to-End (E2E) ：今回はこちらのみ
- Component Testing
- [yarn add & run](https://docs.cypress.io/guides/getting-started/opening-the-app)

1. run cypress: `yarn run cypress`
![](https://storage.googleapis.com/zenn-user-upload/edeafdc9b254-20230222.png)
2. choose left one
![](https://storage.googleapis.com/zenn-user-upload/85b8bbb07fef-20230222.png)
3. choose Chrome and commit with the green bottom below
 ![](https://storage.googleapis.com/zenn-user-upload/d36c7cff0c3b-20230222.png)
4. choose the source just added which was app.cy.js
![](https://storage.googleapis.com/zenn-user-upload/e0a3167f3d14-20230222.png)
5. run the test
![](https://storage.googleapis.com/zenn-user-upload/7fa29507b6da-20230222.png)
Node.js: MariaDB のバージョンを表示

## プログラム

フォルダー構造

```text
$ tree -a
.
├── .env
├── config_mariadb.js
├── go_version.sh
└── server_version.js
```

```js:server_version.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	server_version.js
//
//					Feb/24/2023
//
// ---------------------------------------------------------------
'use strict'

var mysql = require('mysql2/promise')
var config_mariadb = require('./config_mariadb')
// ---------------------------------------------------------------
async function main()
{
	const [host, user, password, data_base] = config_mariadb.config_mariadb_proc()
	var conn = await mysql.createConnection ({
		host: host,
		user: user,
		password: password,
		database: data_base
		})


	const sql_str = 'SELECT VERSION ()'
	const rows = await conn.query(sql_str)
	conn.end()
	console.log(rows[0][0])
	console.log(rows[0][0]['VERSION ()'])
	console.error ("*** 終了 ***")
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")
main()
// ---------------------------------------------------------------
```

```js:config_mariadb.js
// ---------------------------------------------------------------
//	config_mariadb.js
//
//					Feb/24/2023
//
// ---------------------------------------------------------------
'use strict'


// ---------------------------------------------------------------
exports.config_mariadb_proc = function ()
{
	const dotenv = require('dotenv')
	dotenv.config()
	const host = `${process.env.host}`
	const user = `${process.env.user}`
	const password = `${process.env.password}`
	const data_base = `${process.env.data_base}`

	return [host, user, password, data_base]
}

// ---------------------------------------------------------------
```

```text:.env
host = 'localhost'
user = 'scott'
password = 'tiger123'
data_base = 'city'
```

実行スクリプト

```bash:go_version.sh
export NODE_PATH=/usr/lib/node_modules
./server_version.js
```

## 実行結果

```text
$ ./go_version.sh 
*** 開始 ***
{ 'VERSION ()': '10.11.2-MariaDB' }
10.11.2-MariaDB
*** 終了 ***
```
PHP：無名関数は奇妙だが便利だから使うところだが、使うならアロー関数を使ってしまいがち

アロー関数もだが、無名関数も奇妙すぎる。それに、便利だから使うがアロー関数を使ってしまいがち。無名関数は関数名が無名なだけで量的にはほぼ減らせておらず、どうしても冗長になってしまい、数行に渡ってしまってコードが汚い。
それとも、奇妙なのはarray_mapなのか？

この点が奇妙。
* 配列の要素の変数名を宣言してもいないうちに、使用時にいきなり使えてしまう（foreachは宣言をするのでわかるが、無宣言というのは奇妙すぎる） 

## 例
```php
function funcname(string ...$cards): array {
    return array_map(function ($card) {
        return substr($card, 1);
    }, $cards);
}
```
SLA,SLO,SLAについて

# はじめに
今回は、SLI,SLO,SLAについて学んだことをまとめる。

### 目次
　・サービスレベルとは
　・サービスレベル指標『SLI』とは
　・サービスレベル目標『SLO』とは
　・サービスレベルアグリーメント『SLA』とは

### サービスレベルとは
　サービスを適切に管理するには、サービスの中で特に重要な
　振る舞いがどれか、またその振る舞いの計測・評価を定義する必要がある。
　サービスレベルに関する用語として、『SLA』という用語がある。
　一般的に複数の意味で使われており、文脈に応じて様々な意味に取られることから、
　SLI (指標)、SLO (目標)、SLA (アグリーメント)と用語を分けて意味が明確に定義す
　る。

### サービスレベル指標『SLI』とは
SLI(Service level indicators)はサービスレベル指標の略。
SLIは、提供されているサービスの特性に合わせて定義された計測値。
指標としては、以下の４点が挙げられる。
<font color="red">
　-可用性
　-エラー率
　-システムスループット
　-リクエストのレイテンシ
</font>
　※可用性：システムが継続して稼働できる度合いや能力のこと
　※スループット：コンピュータやネットワーク機器が単位時間あたりに処理できる
　　　　　　　　　データ量のこと
　※レイテンシ：データ転送における指標のひとつで、転送要求を出してから実際にデータが
　　　　　　　　送られてくるまでに生じる通信の遅延時間のこと
　※リクエスト：コンピュータシステム上で一方から他方へ送信される、何らかの要求
　　　　　　　　あるいは、メッセージのこと

### サービスレベル目標『SLO』とは
SLO(Service level objectives)はサービスレベル目標の略。
- SLIで計測されるサービスレベルのターゲット値、あるいはターゲット値の範囲。
- 各SLIに対しての目標数値
- SLI → SLOの順番で決める。

### サービスレベルアグリーメント『SLA』とは
SLA(Service level agreements)はサービスレベルアグリーメントの略。
※アグリーメント：合意・承諾などの意味
- SLIは、ユーザーとの間で結ぶ、明示的、あるいは暗黙の契約、SLOが満たさない
場合は、返金等など何らかの効果が発生する。

### 最後に
SLI/SLOを検討する際は、自分たち（開発側）が計測できることではなく、ユーザーの視点に立ってサービスを利用する上で気にすることを考えて、測定する指標を検討する。サービスを提供するため、サービスレベルを定義することは重要だと感じた。（単純にではなくしっかり)
PHP：関数：アロー関数は奇妙すぎるがコード短縮になるので積極的に使う

アロー関数や無名関数は本当に奇妙すぎる。こういうタイプはそういう仕様だと覚えるのみ。
コード短縮になるので積極的に使い倒す。

無名関数もだが、アロー関数が奇妙なのは、
1. 配列の各要素の変数名が、使用時に初登場させればそれで使えてしまう（foreachのように定義をしていないというのに）。
1. 無名関数は function と書くのに、なぜか fn と省略している

便利だから使い倒すが奇妙さは続く。。

## 例
```php
function funcname(string ...$cards): array {
    return array_map(fn ($card) => substr($card, 1), $cards);
}
```
情報系学部の授業内容【早稲田大学】

# 目的

情報が閉鎖的で、調べてもあまり出てこないので。

# 授業紹介
## 学部1年（基幹理工学部 学系Ⅲ）
1年生の頃はプログラミングや情報科学がメインではなかったので、プログラミングのモチベは低かったです。授業でC言語、趣味でPythonを触ってました。
- 基礎の数学（必修）
数学基礎論。数学の記号に対する嫌悪感が消えました。他の先生の授業は全然違うことをやっていたみたいなので、内容は教員次第。
- 線形代数（必修）
前期は行列計算しかやっていなかったと思います。おかげで、行列に関する計算力は身についたと思いますが、後期の理論の方が面白かったです。
- 微分積分（必修）
大学1年で一番勉強した科目。といっても特段難しいわけではないです。線形と微積は単位数が多く、一年の成績はこれで決まるといっても過言ではないので手を抜かないことです。
- 基礎物理学A / B（必修）
物理は微積分を使います。鉄緑で叩き込まれていたので簡単でした。力学から電磁気まで一通りやります。
- 化学（必修）
先生が生化学好きなようで、専らその話ばかりだった気がします。
- 理工学基礎実験1A / 1B（必修）
早稲田大学の理工3学部には、理工学基礎実験（通称: きそじ）という科目があります。レポートが激重で、採点も教員ガチャと言われています。1年や2年前期のきそじは、化学や生物といった他分野の実験もあるため、興味が無いと非常に面倒です。
- Cプログラミング入門（必修）
この授業は先生が優しくて、些細なことで褒めてくれるので非常に楽しかったです。if文、for文、関数、ポインタといった基礎的な事項を学習します。
- Cプログラミング（必修）
Cプログラミング入門の後期版です。前期の貯金で特に苦労もなかったです。
- 情報通信基礎 / メディア表現技術の基礎（必修）
通信の歴史やさまざまなトピックに触れました。
- データ科学入門α / β / γ / δ / 回帰と分類のデータ科学 / データ科学実践（選択）
データ分析の基礎です。機械学習などに興味があれば取ると良いと思います。NumPyやPandas, Matplotlibに触ったことがあると楽です。成績は取りやすいです。



## 学部2年（情報理工学科）
早稲田基幹理工学部にも進振があります。無事志望していた情報理工学科に所属できました。
進振難易度は人気順で、学系Ⅲですと情報理工＞表現工学＞情報通信だったような気がします。（2024/02/13追記: 現在学系Ⅲからは情報理工、情報通信、応用数理に進学できるらしいです。）1年のGPAで行ける学科が決まります。真面目にやってれば大丈夫。
- プログラミングA（必修）
JavaとPython。Javaは非同期わからんという声が多かったです。Pythonはずっと使っているので簡単でした。
- 確率統計概論（必修）
授業は半期だったのですが、1年かけてしっかり勉強したいくらいの内容でした。
- 情報数学A / B（必修）
難しいです。レポートで課される内容が難しく、フィードバックがないので、自分が正しい理解をできているのか確認できません。
- 回路理論 / 電子回路（必修）
物理的な回路の話。コンデンサとか抵抗とか。大学入試で死ぬほどやると思うのですが、新たな知見もありました。
- 論理回路（必修）
バイナリに対する嫌悪感が無くなりました。相当レベルアップした気がします。

- コンピュータアーキテクチャA（必修）
PCの構成を学びます。
- 理工学基礎実験2A（必修）
2年前期で再登場します。
- 情報理工学実験A（必修）
実質きそじと変わらないですが、実験の内容が情報系に限定されたので、まだ有意義でした。
- アルゴリズムとデータ構造A / B（必修）
競プロ経験があるので余裕かと思いきや、そうでもありませんでした。テストのために比較的勉強した科目です。
- 信号処理（必修） / 情報理論A（必修） / 通信理論（選択）
スライド単体での理解は難しいと思います。レポート課題は量が膨大です。FBや解答例もありません。
- 情報系の生命学（選択）
生物について情報系の側面から考えてみようというコンセプトの授業です。DNAの配列などに興味がある方には魅力的かと思います。
- 微分方程式（選択）
授業はわかりやすいです。
- 続線形代数（選択）
一応1年の線形の続きらしいです。授業は分かりにくいと思います。
- オープン・ソース・ソフトウェア概論（選択）
OSSについて学びます。

## 学部3年（情報理工学科）

### 前期
- 情報通信ネットワークA（必修）
物理層からアプリケーション層までしっかり知識が身につきます。スライドも非常にわかりやすいです。
- オペレーティングシステムA（必修）
OSの基礎を学びます。知らないことが多かったです。
- ソフトウェア工学A（必修）
ソフトウェア開発の基礎が学べます。UMLをやります。
- 情報理工学実験B（必修）
自由課題で犬の自動餌やり機を作ったり、マッチングアプリを作ったりしました。2年までの実験よりは面白いです。
- 言語処理系（必修）
C言語のサブセットのコンパイラをいじる。アセンブリに抵抗があるときつそうです。
- プログラミングB（必修）
OCamlとPythonをやりました。Pythonパートは簡単ですが、OCamlは関数型言語なので初見だと覚えることが多いです。
- プロジェクト研究A（選択）
研究室に仮配属されます。

### 夏季休暇
- システム開発プロジェクト基礎（選択）
5日間でSIerの業務（クライアントワーク、要件定義、詳細設計、ERDの設計、画面設計・・・）を体感しようという講座です。私はPMのロールをさせていただきました。NECさんから講師の方がいらっしゃいます。

### 後期
- データベース（必修）
理論的な学習がメインになります。毎週簡単な課題が出るのですが、満点を取り続ければ確実にA+が来ます。
- プログラミング言語（必修）
ラムダ計算など。
- コンピュータアーキテクチャB（必修）
成績に納得できませんでした。後ほど友人に聞いた話では、大問1つを採点し忘れていたようで全体的に低かったようです。余談ですが、成績に納得できない際、抗議を入れると再評価で上がったという話を割と聞くのでやってみるといいかもしれません。
- 情報社会論（選択）
XRに関する最新のネタや起業関連の話題。
- エクシオグループ株式会社寄附講座（選択）
インフラ関連の業界話。
- プロジェクト研究B（選択）
研究室に仮配属されます。前期とテーマを変えました。


## 学部4年（情報理工学科）
GPAによっては筆記試験免除で大学院進学が可能であり、4年前期から大学院の科目を先取り履修できます。
### 前期
- ゼミ
各々の研究室に依ります。
- 先端プロセッサ技術（大学院）
パイプラインやキャッシュについて。
- ネットワークサービスとビジネスモデル（大学院）
テクノロジーを活用したビジネスモデルに関して。

### 後期
- ゼミ
- ワイヤレスアクセス特論（大学院）
英語での発表が最後にあります。（日本語も可）受講者はほとんど外国の方でした。
- 情報セキュリティ基礎（大学院）
基本的な暗号理論の話からweb3の話題まで広く扱います。
- 移動通信技術（大学院）
現代の移動通信がどのように実現されているのか外部講師の方々に授業していただきます。

ご質問があれば回答いたします。
Macでchromeが起動しない時の最終手段（ファイル削除します）

https://qiita.com/Monji_24/items/0c4a3fd1f1a961b3ea21

上の記事を参考にさせていただきましたが、自分は解決できなかったので、 「Application Support」フォルダ内のユーザーファイルを削除することで問題を解決しました。

homebrewでchromeを再インストールしたり、本家googleのchrome配布サイトから直接再ダウンロードしても起動しなかった場合に役立つと思います。

今回の方法ではファイルを削除しますが、万が一のために削除する前にはファイルのバックアップを取っておいてください。


---
### 環境

MacBook Air 2020 (M1)

macOS Ventura (version 13.2.1)


---
### 方法

1,Finder起動

2,ディスプレイ上部のメニューバーから移動を選択

3,下から2番目の「フォルダへ移動」を選択

4,「 ~/Library/Application Support 」 と入力

5,「Google」フォルダを選択

6,「Profile 7」フォルダを選択して削除

7,「Profile 7」フォルダ以外にも「Profile 6」、「Profile 8」などがあれば削除(フォルダ内にプロフィール画像があるので、適宜選んでください)

---
### 追記

自分の場合、キャッシュが1.7GBたまっており、それが原因かと思ってキャッシュを削除した状態の「Profile 7」フォルダで起動を試しましたが、起動することはできませんでした。

その後、「Profile 7」フォルダを削除して新たに「Profile ?」(新たに作成したユーザー)フォルダを作成した際、また一から拡張機能の設定をするのが面倒くさかったため、「Profile 7」フォルダ内のExtention関係のフォルダを「Profile X」フォルダに移動して起動を試しましたが、結局うまくいきませんでした。

今まで使っていたアカウントでログインすれば使っていた拡張機能は自動でダウンロードできるので、横着せずに各種設定を行ったほうが二度手間にならずいいと思います。

---
### 追記2

「Extensions」と「Local Extension Settings」のファイルを古い方から新しい方に移行すると、今まで使っていた拡張機能のデータを引き継ぐことができるとわかりました。

ただし、データの保存方法が変わったのか、新しいプロファイルでは「Profile ？」のデータがなくなり、「Default」フォルダの中に上記2ファイルが配置されているので、ご注意ください。

未検証ですが、ユーザーの数によって「Default」フォルダや「Prifile ?」フォルダなど、表記揺れが生じるのかもしれません。
python maya unlock attributes

```python
import maya.cmds as cmds

def GetAllCurveJoint():
    objs = []
    curves = cmds.ls(type="nurbsCurve", ni=True, o=True, r=True, l=True)
    joints = cmds.ls(type="joint", ni=True, o=True, r=True, l=True)
    for i in curves:
        objs.append(i)
    for i in joints:
        objs.append(i)
    transforms = cmds.listRelatives(objs, p=True, type="transform")
    return transforms

def UnlockAll():
    locked = []
    objs = GetAllCurveJoint()
    for obj in objs:
        attrs = cmds.listAttr(obj)
        for attr in attrs:
            try:
                attrObj = "{0}.{1}".format(obj, attr)
                if cmds.getAttr(attrObj, lock=True) == True:
                    cmds.setAttr(attrObj, lock=0)
                    locked.append(attrObj)
            except ValueError:
                continue
    print(locked)

UnlockAll()
```
chatGPTで作ったソースはだれのものか？

chatGPTにプログラムを作ってもらった場合、そのプログラムの著作権は誰のものになるのか？

とりあえず本人に聞いてみたらOpenAIのものになるとのこと。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592705/b5fc3b37-889d-1350-9c3f-ec44b85143e5.png)
agoraを使ってみた

# agoraとは？
通話・配信機能を提供しているサービス。
SDKになっているので、実装が容易。

https://jp.vcube.com/sdk

# 無料トライアル試してみた（音声のみ）


#### サインアップ
こちらのページからアカウントを作成

https://jp.vcube.com/sdk/trial

#### 通話・配信SDKをダウンロード/インポート
クイックスタートガイドがあるので、参照しながらUnityプロジェクトに組み込みます

https://jp.vcube.com/sdk/quickstart/webcast/unity

### Unityでサンプルプロジェクトの開発
Agoraの開発者向けDocsが公開されていますので、こちらに沿って開発を進めていきます。

https://docs.agora.io/en/voice-calling/get-started/get-started-sdk?platform=unity

### 接続情報の取得
接続情報としてAppID、Channnel Name、Tokenが必要になります。
・AppID・・アカウント作成時に取得。
・Name,Token・・アカウントコンソール画面の「Temp token for audio/video/call」から取得。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/4b3d7eb1-13df-69ac-33f0-0e9d49f2bf7f.png)
取得後のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/c006770f-f9b6-6757-9ac6-bff6d84c662f.png)


### 完成
AppIDとChannel Nameは固定値なのでスクリプト内にベタ書きしましたが、
Tokenは都度生成するので、接続時に入力するようにUIを変更しました。
ビルドをして複数のデバイスから音声接続ができたことを確認済。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2844463/c2b11ac3-edb3-7e43-f3e8-4f1e092d35a4.png)

### 振り返り
- 開発者向けドキュメントが手順レベルで整備されていたので、サンプルは容易に作成できた
- サンプル通り進めるとwebGL版や、iOS版としてビルドするとコンパイルエラーとなってしまった（デバッグは時間の都合上諦め）
TypeScript の「共変」「反変」を理解するためのメモ書き

```ts
interface Animal {
    animalStuff: any;
}

interface Dog extends Animal {
    dogStuff: any;
}

// ...

type Getter<T> = () => T;

type Setter<T> = (value: T) => void;
```

こんな感じのコードがあるとする。

この例において `Getter<Dog> → Getter<Animal>` の割り当てが有効であるには `Dog → Animal` 割り当てが有効である必要がある。
これを**共変**という。
一方で `Setter<Dog>` を `Setter<Animal>` に代入可能であるには `Animal` を `Dog` に割当可能である必要がある。これを**反変**という。

```ts
// Getter<Dog> は Getter<Animal> に割当可能
const getDog1: Getter<Dog> = () => ({ animalStuff: true, dogStuff: true })
const getAnimal1: Getter<Animal> = getDog1

// TypeScript は Getter<T> の T が共変であることを知っているため
// Dog は Animal に割当可能であることだけを検査している
const dog: Dog = { animalStuff: true, dogStuff: true }
const animal: Animal = dog

// Setter<Animal> に Setter<Dog> は割当不可能
const setDog1: Setter<Dog> = (dog: { animalStuff: any, dogStuff: any }) => {}
const setAnimal1: Setter<Animal> = setDog // エラー

// TypeScript は Setter<T> の T が反変であることを知っているため
// Animal は Dog に割当不可能であることだけを検査している
const dog2: Dog = animal // エラー

// しかし、Setter<Dog> に Setter<Animal> は割当可能
// TypeScript は Setter<T> の T が反変であることを知っているため
// Dog は Animal に割当可能であることだけを検査している
const setAnimal2: Setter<Animal> = (animal: { animalStuff: any}) => {}
const setDog2: Setter<Dog> = setAnimal2 
```
【Github】コンフリクトの対処法について

## はじめに
共同で作業をしているとどこかしらで必ず起きてしまうのがコンフリクト。

コンフリクト(conflict)とは、そもそも「衝突」を意味しています。
そしてGitコンフリクトとは、前述したGitマージしたときに発生する衝突のことで、マージ対象のブランチで同じファイルの同じ箇所で修正を行った時に発生します。

よく起こる事象のようですが、
慣れないうちは結構テンパってしまうと思うのでその不安を少しでも解消すべく記事にまとめていきます。
あと備忘録。

## 進め方
```
// mainブランチへ移動する
$ git checkout main
```

```
// 最新のmainをPullする
$ git pull origin main
```
```
// 作業しているブランチへ移動する
$ git checkout 39-be-webtest-usercourseapi
```

```
// マージする
$ git merge main
```

おそらくこのマージのタイミングでコンフリクトが起こることが多いかと思います。
IDEに戻ってあげるとコンフリクトしているファイル、箇所がわかると思うので移動しましょう。

### コンフリクトしているファイルに移動する
片方だけを残したり、上書きしたりとやり方はいくつかあるようですが、
今回やったのは、上書きベースでの修正でした。

mainにあがっているコードに自身の修正を加えていく形ですね。

### 黄色がかった膜を消してあげる
Gitではコンフリクトしている箇所にかけて、黄色がかった膜のようなものがかかっています。
HEADやmainなどと対象部分をわかりやすく指定してくれているので、
該当の部分を把握しながら黄色がかった膜を消していきます。(HEADとかを消せば消えていく)

### 修正していく
どの部位に差分があるのか理解した上で、コードをどうしていきたいのか修正していきます。

### pintを実行する
これは皆やることではないと思うが、現在のプロジェクトではコードを整形してくれるpintを導入して作業をしている。
コミット前に実装しているのでここでやってあげる。
```
docker-compose exec app bash
./vendor/bin/pint -v
```

### ステージングにあげる
`git add .`をして対象ファイルをステージングにあげる。

```
$ git add .
```

ステータスも確認してあげて、上がっているか確認する
```
$ git status
```

### 動作確認をする
Seederでデータ投入だったり、テスト実装など実際に作業している内容に沿って動作確認をしてあげる。

### コミットする
コミットメッセージなどプロジェクト毎にルールがあればそれに従う
```
git commit -m "Merge main"
```

### Pushしてあげる
最後にPushしてOK。
```
$ git push origin 39-be-webtest-usercourseapi
```

以上。
WindowsとLinuxでqsort関数の結果が異なる場合がある

qsort関数は、クイックソート機能を提供している標準ライブラリー関数です。(stdlib.hで定義)
qsort関数は、比較結果が等値となるデータが複数含まれる集合に対して実行すると、Windows(VC)とLinux(gcc)でソート結果が異なる可能性があります。

# 環境
* Windows10 + VisualStudio2017
* Ubuntu 20.04.5LTS + gcc9.4.0

# 再現コード
```c:main.c
#include <stdio.h>
#include <stdlib.h>

typedef struct
{
	int age;
	int id;
} PERSON;

int compare(const void* x, const void* y)
{
	if (((PERSON*)x)->age > ((PERSON*)y)->age) {
		return 1;
	}
	else if(((PERSON*)x)->age < ((PERSON*)y)->age) {
		return -1;
	}
	else {
		return 0;
	}
}

int main()
{
	PERSON array[] = {
		{4, 100},
		{3, 200},
		{2, 1000},
		{1, 1100},
		{3, 300},
		{3, 400},
		{3, 800},
		{3, 600},
		{3, 500},
		{3, 700},
		{3, 900},
	};
	int num = sizeof(array) / sizeof(array[0]);
	qsort(array, num, sizeof(PERSON), compare);

	printf("age id\n");
	for (int i = 0; i < num; i++) {
		printf("%d %d\n", array[i].age, array[i].id);
	}
    return 0;
}
```
# 実行結果
```
[Windows] [Ubuntu]
age id    age id
1 1100    1 1100
2 1000    2 1000
3 200     3 200
3 400     3 300
3 300     3 400
3 900     3 800
3 800     3 600
3 600     3 500
3 500     3 700
3 700     3 900
4 100     4 100
```

# 対策案
1. 比較関数で、比較する項目を増やす
1. 自力でクイックソートを実装する
参考）[C言語でクイックソート](https://qiita.com/omu58n/items/7794f097b2c569a469bc)
KDEの翻訳について-Wiki系

## この文章を読んでできるようになること
- KDE [UserBase] Wikiの翻訳
- KDEの翻訳についてのルールを知れる

## KDEとは
>KDEは、あなたに最高のソフトウェアを無料で提供する世界的なプロジェクトです。
(中略)
**KDE**はデスクトップ環境として始まりましたが、その活動が発展し、今や**フリーかつオープンなソフトウェアを製作する国際的なチーム**となりました。

([KDEとは - KDE UserBase Wiki](https://userbase.kde.org/What_is_KDE/ja)より一部引用)

引用した通り、もともとはLinuxとかUnix向けのデスクトップ環境を作っていたOSS組織ですが、現在ではデスクトップ環境だけでなく、OSに必要な周辺アプリケーションなどの作成しています。

## 翻訳について
>KDEは世界中のたくさんの貢献者なしには存在できません。そして、あなたもその一人になることができます！そこには誰にでもできる仕事もあります。私達は、あなたがどのようにKDEを改善していくのかを楽しみにしています。

([KDEとは - KDE UserBase Wiki](https://userbase.kde.org/What_is_KDE/ja)より一部引用)

先述の通り、KDEは企業ではなくOSS団体なので、ソフトウェアや文章(Wiki)などの翻訳は私たちの貢献によって進めていく必要があります。
翻訳についてはWikiかソフトウェアかによって翻訳方法が大きく異なるため、文章は二つに分けます。
本文章はWikiの翻訳方法について、[続編](https://qiita.com/Lemon73/items/ad93e1ab5bad0cd1b44a
)ではソフトウェアについてまとめます。

::: note warn
注意点:本文章は、**KDE本部や日本KDEユーザ会とは関係のない文章です。**
そのため、この文章について質問や間違えの訂正に関してはこちらのコメント欄以外の利用はお控えください。
:::

## KDEが運営する3つのWiki

KDE本部は主に[3つのWiki](https://wiki.kde.org)の運営を行っています。
・[UserBase]
KDEのソフトウェアの説明や使い方に関しての情報が多く載っています。
初心者から上級者まで役に立つ文章が多くそろっています。
・[TechBase]
KDEのソフトウェアの開発に関しての情報が多く載っています。
開発者にとって役に立つ文章が多くそろっています。
一部は[Developer](https://develop.kde.org/docs/)に移っているようです。
・[Community]
イベントなどについて文章が載っています。

ぶっちゃけ[UserBase]以外はあんまり見ることはないです。

先に言ってしまうと、この文章を読んでも[UserBase]しか翻訳できません。
理由は後述します。

## 翻訳権限の入手
・[UserBase]にアクセスします。
・サイト左上のログインをクリック。
・KDE専用のアカウントでログイン(アカウント作成)
↑(KDE Identityのアカウントが必要)
・左のバーの「[翻訳者アカウントの取得](https://userbase.kde.org/Translator_Account)」をクリック
([Community] Wikiが翻訳できないのはこのボタンがないからです。
Wikiの翻訳システムがなぜかありません。(謎))
・Translator Accountの右の「編集」ボタンをクリック
・一番下に次の文章を追加
```
User Name: ここに名前を入れる

Language(s): 言語(英語で入力|日本語だったらJapanese)

(Optional) Do you expect to work off-line?: (オフラインで作業できるかYesかNo)
```
オフラインで作業できるかはよくわからなかったらNoにしておけばいいと思います。
(自分もよくわからなかったのでそうしました)

数日経過すると、これの下に
```Welcome to the Translator group (承認してくれた人の名前) (talk) (日付/時間)```
のように書かれます。
これで認証されたということになります。

([TechBase] Wikiではいつまでたってもこれが承認されません。
履歴を見てみると2021年以降1人も承認されていませんね…)
これで翻訳権限が手に入りましたので、以降は([UserBase] Wiki内では)翻訳が自由にできます。
(ログインがちょくちょく切れるので翻訳できなくなった時はログインを確認してみてください。)

## 翻訳作業

・翻訳したいページのページ名(一番大きい文字)の下あたりの「このページを翻訳」をクリック
・左の英訳を見ながら日本語訳をする
・「翻訳を公開」ボタンをクリック
以上です。

### 翻訳で参考になる文章

##### KDEの翻訳に関してのルール
・[UserBase Wiki 翻訳について](https://userbase.kde.org/Tasks_and_Tools/ja#Working_with_Languages)(Wiki系)
ぜひ読んでください。

## 最後に

#### [TechBase]と[Community]の翻訳ができない問題
[TechBase]は2021年以前に翻訳権限を入手した人(日本人だと2人?)は翻訳できるので一部翻訳されていますが、[Community]は翻訳システムがないので、全く日本語翻訳されていません。

#### 【解決済み】「サポートしている言語」欄が見れないバグ
~~なぜかはわかりませんが、[UserBase]の左バーの「サポートしている言語」の欄が見れません。~~
~~翻訳している他の人が一覧で見れたのですが、今は見れないので誰が現役で翻訳を行っているかがわかりずらくなってしまいましたね…~~

追記:[バグ報告](https://bugs.kde.org/show_bug.cgi?id=465268)を見てくれた有志によってバグが解決しました。感謝!!

KDEのソフトウェアなどの翻訳に関しては[こちら](https://qiita.com/Lemon73/items/ad93e1ab5bad0cd1b44a)をご覧ください。
少し長い文章になってしまいましたが、以上です。

[UserBase]: https://userbase.kde.org/Welcome_to_KDE_UserBase/ja
[TechBase]: https://techbase.kde.org/Welcome_to_KDE_TechBase/ja
[Community]: https://community.kde.org
ソースコードを生成する

# 要件

Unityのエディタ拡張として、定義ファイルを元に以下のようなEnumやClassを生成したい
※ なるべくUnity単体で完結したい。Visual StudioやRiderのようなIDEが入っていないエンジニア以外のメンバーでも生成が行えるのが理想

```C#
public enum SceneType
{
    None,
    Splash,
    Title,
    Home,
    // 以下略
}

public class AddressDefine
{
    public class LocalGroup
    {
        public const string TitlePrefab = "titleprefab";
    }
    public class MasterData
    {
        public const string CharacterMaster = "charactermaster";
    }
}
```

## 文字列操作で作る

`StringBuilder`などを使ってインデントなども含めたソースコードの表現した文字列を生成しファイルに書き込む方式。
**#CLASS_NAME#** のような置換用文字列を含んだ独自のテンプレートファイルを処理する形だと、インデントなどのコードフォーマットを実装と分離できるけれど、定義ファイル次第でフィールドの数が可変になるケースに対応できない。

参考1: [CodeStorage/ScriptBuilder.cs at main · yamara-mh/CodeStorage · GitHub](https://github.com/yamara-mh/CodeStorage/blob/main/Codes/Editor/ScriptBuilder.cs)
参考2: [enumを作成するエディタ拡張【Unity】【エディタ拡張】 - (:3[kanのメモ帳]](https://kan-kikuchi.hatenablog.com/entry/EnumCreator)
参考3: [【Unity】【エディタ拡張】スクリプトからスクリプトファイル(.cs)を生成する](https://light11.hatenadiary.com/entry/2018/03/22/191516)

## CodeDOMで作る

イメージとしてはリフレクションの逆。ネームスペースオブジェクト、型オブジェクト、メンバオブジェクトなどソースコードの各要素を表現するオブジェクトを生成し、`CSharpCodeProvider`を使ってソースコードを生成する方式。
インデントなどのコードフォーマットは`CodeGeneratorOptions`で指定できる。`CodeGenerator.ValidateIdentifiers()`を使うことで各オブジェクトのバリデーションも可能。

参考2: [System.CodeDom 名前空間 \| Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/api/system.codedom?view=dotnet-plat-ext-7.0)
参考3: [CodeDomによる実行時コード生成術](https://codezine.jp/article/detail/605)
参考4: [DBのカラム名からClassを生成する - Qiita](https://qiita.com/KeisukeKudo/items/7922b22a675c869d46ce)

## テンプレートエンジンを使う

[文字列操作で作る](#文字列操作で作る)で書いた独自テンプレートではなく、著名なテンプレートエンジンを使う方式。

- [Scriban](https://github.com/scriban/scriban)
- [Text Template Transformation Toolkit (T4)](https://ja.wikipedia.org/wiki/Text_Template_Transformation_Toolkit)

T4はVisual StudioやRiderなどのIDEからコードを生成する。
デザイン時テンプレートはテンプレートから目的の文字列を生成する。ランタイム時テンプレートはテンプレートから中間csファイルを生成し、それに定義されたクラスを使って目的の文字列を生成する。
Unityでソースコードを生成するには事前にIDEでランタイム時テンプレートを生成しておく必要があるけれど、[GitHub - deniszykov/t4-templates-unity3d](https://github.com/deniszykov/t4-templates-unity3d) というUnity上でT4テンプレートを処理するエディタ拡張も存在している。

参考1: [C#で利用できるテンプレートエンジンscribanについて \| Yucchiy's Note](https://blog.yucchiy.com/2021/03/scriban-csharp-template-engine/)
参考2: [【Visual Studio】【.NET】T4テキストテンプレートで文字列（ソースコード）を自動生成する方法まとめ - LIGHT11](https://light11.hatenadiary.com/entry/2021/03/01/204148)

## [調査中] SourceGeneratorを使う

C# 9.0で追加された、C#公式のコード生成のためのコンポーネントでUnityでは2021.2以降で利用可能。
⚠ コンパイル時生成なので「エディタ拡張」という目的にはそぐわない。

調べた限りでは、既存のpartialクラスに対してプロパティやメソッドを自動実装する使い方が多い。
完全新規のクラスを生成できるのかは調査中。

参考1: [ソース ジェネレーター \| Microsoft Learn](https://learn.microsoft.com/ja-jp/dotnet/csharp/roslyn-sdk/source-generators-overview)
参考2: [Unity 2022におけるC＃ランタイムスクリプトについて – Unity for Pro](https://forpro.unity3d.jp/unity_pro_tips/2022/12/19/4225/)
参考3: [SourceGeneratorでらくらく(でもない)ソースコード自動生成 - Qiita](https://qiita.com/ry18847/items/15c979b67e0372c22f1d)
rails cでFactoryBotを流す

## 環境
Rails5.2

## はじめに
test環境にテスト用データを整備したい場合、FactoryBotがよく使われるようです。FactoryBotを使って、rails cからテストデータを作ってみました。

## 内容
test環境のDBにログインするには、次のようにします。オプションを指定せずに、rails cをすれば、デフォルトで、develop環境にログインします。
```console
$rails c -e test
```

ググると、次のコマンドが紹介されている記事も見かけますが、旧バージョンのRailsでの使い方になります。Rails5.2の環境ではエラーになります。
```console
$ rails c test --sandbox
Running via Spring preloader in process 5472
DEPRECATION WARNING: Passing the environment's name as a regular argument is deprecated and will be removed in the next Rails version. 
Please, use the -e option instead. (called from <main> at /vagrant/raku_renkei/bin/rails:9)
Loading test environment in sandbox (Rails 5.2.8.1)
Any modifications you make will be rolled back on exit
```

> エラーメッセージをGoogle翻訳してみると・・・
非推奨の警告: 環境の名前を通常の引数として渡すことは非推奨であり、Rails の次のバージョンでは削除される予定です。代わりに -e オプションを使用してください。 (/vagrant/raku_renkei/bin/rails:9 の <main> から呼び出されます) サンドボックスにテスト環境をロードしています (Rails 5.2.8.1) 行った変更は終了時にロールバックされます

Userテーブルにデータを１件更新するためのFactoryBotのファイルです。名前空間を利用しているため、クラス名を明示的に指定しています。
```spec/factories/users.rb
FactoryBot.define do
    factory :user, class: Master::User do
        name     {'テストユーザー'}
        name_id {'testuser'}
        password              { 'password' }
        password_confirmation { 'password' }
        admin { 'true' }
    end
end
```

コンソールでコマンドを流すと、Userテーブルにテストデータが１件更新されます。
```console
>require 'factory_bot_rails'
>FactoryBot.create(:user)
```

確かに、テストデータが更新されたことを確認します。
```console
>Master::User.find(1)
```

確認ができたら削除しておきます。
```console
>Master::User.find(1).destroy
```
Oracle 21c の PACKAGEを確認しておく

## 環境
OS：Windows 11 Home 64 ビット オペレーティング システム
CPU：11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz   3.00 GHz
RAM：32.0 GB
DB：Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

```
https://localhost:5500/em/shell
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225878/5324fd95-c698-1915-3c8a-830a080273ae.png)


## 操作

```
SQL> select distinct NAME from ALL_DEPENDENCIES where TYPE='PACKAGE' order by NAME;
```

## 結果
```
NAME
--------------------------------------------------------------------------------
AMGT$DATAPUMP
AS_REPLAY
BSLN
BSLN_INTERNAL
CARTRIDGE
CDBVIEW
CDBVIEW_INTERNAL
CONFIGURE_DV_INTERNAL
CTX_ADM
CTX_ANL
CTX_CATSEARCH

NAME
--------------------------------------------------------------------------------
CTX_CLS
CTX_CONTAINS
CTX_DDL
CTX_DOC
CTX_ENTITY
CTX_MATCHES
CTX_OUTPUT
CTX_QUERY
CTX_REPORT
CTX_THES
CTX_TREE

（中略）

NAME
--------------------------------------------------------------------------------
XS_ADMIN_UTIL_INT
XS_DATA_SECURITY
XS_DATA_SECURITY_INT
XS_DATA_SECURITY_UTIL
XS_DATA_SECURITY_UTIL_INT
XS_DIAG
XS_DIAG_INT
XS_MTCACHE_INT
XS_NAMESPACE
XS_NAMESPACE_INT
XS_PRINCIPAL

NAME
--------------------------------------------------------------------------------
XS_PRINCIPAL_INT
XS_ROLESET
XS_ROLESET_INT
XS_SECURITY_CLASS
XS_SECURITY_CLASS_INT

1083行が選択されました。
```

## 応用
パッケージ間の依存関係を取得するSQL

```
select NAME, REFERENCED_NAME from ALL_DEPENDENCIES where TYPE='PACKAGE BODY' and REFERENCED_TYPE='PACKAGE';
```
BetterDiscordを使うべからず

[BetterDiscord](https://github.com/BetterDiscord/BetterDiscord)というソフトウェアは、その性質上Discordの公式クライアントの一部に対して変更を加えるようなソフトウェアです。そのため、BetterDiscordはDiscordの[利用規約](https://discord.com/terms)に違反している可能性が非常に高いです：

> 〔前略〕
> 当社のソフトウェアに対するライセンス。当社のサービスの一部は、お客様がクライアント・ソフトウェアをダウンロードすることを可能とします。お客様が本規約を遵守する限り、当社は、当社のサービスにアクセスする目的のみにおいて、当該ソフトウェアをダウンロード、インストール、および実行する、世界規模、非限定的、個人的、かつ譲渡不能なライセンスをお客様に付与します。
> 
> お客様は、当社のソフトウェアやサービスを配布、販売、リース、またはサブライセンスすることに基づいて、コピーしたり、変更したり、その派生物を作成したりすることはできません。また、当社の書面の同意がない場合、または適用される法律により許可されていない限り、当社のソフトウェアやサービスをリバースエンジニアリングまたは逆コンパイルする、それを試みる、または誰かにそれを行う支援をすることはできません。
> 
> 当社は、お客様にこのライセンスを付与しますが、当社のソフトウェアやサービスに対し保有するあらゆる知的財産権を保持します。
> 〔後略〕
> -- [利用規約](https://discord.com/terms)

アカウントを消されたくなければ今すぐアンインストールして、輝かしくも黒に近いDiscord生活へ別れを告げましょう。
【データ基盤構築/dbt】WHERE句に前日分データを差分追加するための述語を記述する

# 今回の課題
**前日分のデータ**をテーブルに増分更新で追加するためのクエリを作成したかったのだが、
```
Compilation Error in model [モデル名]
```
というエラーが発生してつまずいてしまった。

## エラーが発生したコード

```sql
select
    *
from
    `ソーステーブル名`
{% if is_incremental() %}
where
    {%- set target_date = var('target_date', '') %}
    {%- if target_date != '' %}
    {{ dbt.date_trunc('day', 'date') }} = {{ dbt.date_trunc('day', "'"~target_date~"'") }}
    {%- else %}
    {{ dbt.date_trunc('day', 'date') }} = {{ dbt.date_trunc('day', date_sub(dbt.current_timestamp(), interval 1 day)) }}
    {%- endif %}
{% endif %}   
```
エラーが発生した原因は、
**{{}}の中に、date_sub関数を記述してしまっていたこと**だった。


## エラーを解決したクエリ
```sql
select
    *
from
    `ソーステーブル名`
{% if is_incremental() %}
where
    {%- set target_date = var('target_date', '') %}
    {%- if target_date != '' %}
    {{ dbt.date_trunc('day', 'date') }} = {{ dbt.date_trunc('day', "'"~target_date~"'") }}
    {%- else %}
    {{ dbt.date_trunc('day', 'date') }} = date_sub({{ dbt.date_trunc('day', dbt.current_timestamp()) }}, interval 1 day)
    {%- endif %}
{% endif %}   
```
このように、`{{}}`の外側にdate_sub()関数を使用することで、前日分データをテーブルに追加するクエリを作成することができた。


## おまけ：`{{}}`について調べてみた。

[`{{ ... }}`](https://jinja.palletsprojects.com/en/3.1.x/templates/#expressions)・・・式。式の結果を文字列として出力する。
[`{% ... %}`](https://jinja.palletsprojects.com/en/3.1.x/templates/#list-of-control-structures)・・・制御構文。 for や if などのように処理の流れを制御する。
[`{# ... #}`](https://jinja.palletsprojects.com/en/3.1.x/templates/#comments)・・・コメント。 人がプログラムを読みやすくなるようにコメントを機医術可能。最終的なSQLに出力されない。

※参考：[Jinjaの基礎](https://zenn.dev/foursue/books/31456a86de5bb4/viewer/3da80d#jinja-%E3%81%AE%E5%9F%BA%E7%A4%8E)
Cの基本11 ~条件付きコンパイル・その他の前処理指令~　備忘録

### はじめに
私は初心者である。この備忘録を参考にされようとしている他の初心者の方は、ここに書かれていることを鵜呑みになさらぬようお願いしたい。何か間違いを見つけた方はコメント欄でご報告頂きたい。

___

### 条件付きコンパイル

条件付きコンパイルは、条件によってソースファイルの一部をコンパイルをしたり、コンパイルの対象から外したりする機能らしい。

条件付きコンパイルは **`#if`指令,`#else`指令、`#endif`指令がある**。
形としてこんな感じらしい。
```
Program A
#if condition C
    Program X
#else
    Program Y
#endif
    Program B
```
Condition Cの真偽によって前処理の結果が変わるという具合だ。条件には**整数の定数式**を書く。`0`なら偽、`1`なら真となる。その条件式の値は前処理の時点で決まらなくてはならない。でないと全処理において真偽が判断できない。そりゃそうだ。

##### `defined`演算子と`#ifdef`、`#ifndef`
条件式には普通の演算子の他に、単項演算子`defined`が使える。
`defined(マクロ名)`とした時、そのマクロが定義されてれば１、定義されてなければ0を与えるそうだ。
以前[ここ](https://qiita.com/yuto1009/items/2234d2bd890ee9e9de13#comment-4066a770cb5166a069fd)で対面した。

```
# if defined (マクロ名)

これは #ifdef指令を用いて

#ifdef　マクロ名とも書ける。
________________________

#if !defined (マクロ名)

は#ifndef指令を使って

#ifndef マクロ名　とも書けるそうだ。
```

例題がこんな感じ
```c
#include <stdio.h>

int main(void){
    #ifdef __STDC__
        printf("Standard C\n");
        # ifdef __STDC_VERSION__
            printf("Version %ld\n", __STDC_VERSION__);
        #else
            printf("Version Unknown");
        #endif
    #else 
        prinf("Not a standard C\n");
    #endif      
        return 0;
        
}
```
出力が
```
Standard C
Version 201710
```

演習にあった問題
*マクロ`IsMorning`が真なら`Good Morning`、
偽なら`Good Night`と表示するプログラムを作る*

私がやったミスは以下。
```c
#include <stdio.h>
// #define IsMorning 0

int main(void){
    #ifdef IsMorning
        printf("Good Morning\n");
    #else
        printf("Good Night\n");
    #endif
    return 0;
}    // 出力はGood Morning
```
私はここで、IsMorningの値が偽なのになぜ`Morning`なのかと思ったが、それは`defined`演算子を使っているからだった。
`defined`演算子はマクロが定義されているかどうかを見る。中の値は関係ない。
正しくは以下か。
```c
#include <stdio.h>
#define IsMorning 0

int main(void){
    #if IsMorning == 1
        printf("Good Morning\n");
    #else
        printf("Good Night\n");
    #endif
    return 0;
}    // 出力はNightのほう
```

___

##### その他の前処理指令

他の前処理指令を列挙する。
* `#error`指令 わざとエラーを起こす
* `#line`指令　現在の行番号とファイル名を設定する
* `#pragma`指令 処理系特有の動作を指定する

P370　必要になったら調べよう。

____

次はやっと配列とポインタだ

> 今回の内容は富永和人氏の[新しいC言語の教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84C%E8%A8%80%E8%AA%9E%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E5%86%A8%E6%B0%B8%E5%92%8C%E4%BA%BA-ebook/dp/B07P1TC98P)を参考に書き留めてます。