OmniAICreator/Qiita-1.07M huggingface dataset:
一年で3つのハッカソンに参加してみての感想と反省

こんにちは、atomicです。この記事は「[学生Androider Advent Calendar 2022](https://qiita.com/advent-calendar/2022/androider_student)」の18日目の記事です。
今日12/18で、Android開発に触れてからちょうど1年ほど経過しました。
絶賛ハッカソン参加中で2徹目の状態の私が、これを機にこの1年を振り返ってみて感想と反省を書こうと思います。

この記事を通して、ハッカソンに参加してみたいけど迷ってる人や、ハッカソンって意味あるの？って思っている人たちにハッカソンの魅力を伝えられたらと思います。

また、ハッカソン経験者の方にも私の反省で何か参考にできるものがあれば嬉しいなと思っております。


# 目次
- ハッカソンとは
- 私が参加したハッカソンについて
- 反省点・やってよかったことなど


# ハッカソンとは
本題に入る前に、ハッカソンという単語を初めて聞いた人もいるかもしれないので、簡単に説明しておきたいと思います。

ハッカソンとはハック（Hack）とマラソン（Marathon）を組み合わせた造語です。決められた期間内にチームで、テーマに沿って開発を行いその成果を競い合うイベントです。

# 私が参加したハッカソンについて
ここからは私がこの一年で参加したハッカソンを振り返り、ハッカソンの魅力について語っていけたらなと思います。

私が参加したハッカソンはすべて学内で行われたハッカソンで、期間は1~2週間程度のものでした。これらに参加して感じたハッカソンの魅力は以下の4つです。
1. 新しい技術に触れるきっかけになる。
実際に、私はハッカソンで初めてkotlinを触りました。ハッカソンでは基本的にメンターさんがいるので、初めての言語でも安心して挑戦できます。また、協賛企業様がいらっしゃる場合、ハッカソンで興味を持った領域にインターンやバイトを行ける可能性があります。
1. 就活に使えるプロダクトが短期で作れる
就活のときに実際に作ったものを見せることができる。実際に作ったプロダクトがあると、自分の技術レベルを示すことができるので、とても助かります。
実際に、私も就活のときはハッカソンで作ったプロダクトがあるので、自分の技術レベルを示すのに苦労しませんでした。

1. 同じ領域に興味のある人と繋がれる
私の周りの人間は学部の影響もあり、pythonを書いている人たちばかりで、Androidを触っている人はあまり見かけませんでした。
こういうイベントがあると同年代のAndroiderに出会うきっかけになります。

1. 短期間で終わる
短期集中型のイベントなので継続力のない人間でも成果が出ます。
私のような継続が苦手な人間でも、短期間で終わるものなら気軽に参加できます。

# 反省点・やってよかったことなど
ここからはハッカソンに出る上で反省点とやってよかったことを話したいと思います。

反省点
1. 事前にチームメンバーと目標のすり合わせをしない
本気で優勝を目指すのか、楽しくチーム開発がやりたいのか、各々がハッカソンに対する目的が違うため、この方向性を最初に擦り合わせておかないと衝突が起こります。

1. 事前にお互いの技術領域を把握しておく
そんなの当たり前だろと思われるかもしれないが、「フロントできます」「バックできます」だけだと、どの程度のレベルかわかりません。別の領域の人間ならまだしも（代わりにできない分むしろよくないかも？）、同じ領域だった場合、タスク分散をしたのに、リファクタで余計時間を食ってしまうということがあります。
なので、事前に技術レベルを把握して、自分が思っている最低限の知識がないと感じたら、その部分について事前学習をしてもらう必要があります。

1. それっきりで終わってしまう
ハッカソンのメリットで短期集中ということを挙げたが、それはデメリットにもなり得ます。
たいていの場合、ハッカソンが終わったらそれっきりで、それ以降開発をしません。しかし、それではせっかく短期的に成長してもそれが無駄になってしまいます。
もし、ハッカソンでその領域に興味を持ったら、ハッカソンをきっかけとして、開発を続けていくことが重要だと感じました。


やってよかったこと
1. チートシートを作る
どのアプリでも使うような、よく使うコードたちはあらかじめチートシートを作っておく。これを作っておくだけで、調べ作業にかかる時間が大幅に減るので、絶対にあった方がいい。
同じような機能の実装を何度もすることになるので、私のように何度もハッカソンに参加する人は、とくに作っておくべきだと思います。
チートシートを作る過程で、その機能についてより詳しく理解できるので、つくっておい

1. issueドリブン開発
githubの使い方の話。issueごとにブランチ切って開発していく感じです。
これをやるとissueやcommitが大きくなり過ぎないので、一つのissueに何日もかかるみたいなことがなくなりました。また、各自の進捗がわかりやすくなりました。
1. 朝会
べつに朝である必要はないが、一日に一回は必ず進捗報告をして今後の方針を話しあう時間を設けていました。
私のチームは1日2回昼と夜に行っていました。進捗報告と問題点などを定期的に話し合うことで、大きな問題になる前にすぐに対処できました。
また、作りたてのチームだとコミュニケーション不足に陥りがちなので、半強制的に会話する場を作る役割も担えるかなと思います。

基本的にはチームでコミュニケーションをちゃんと取ること、事前・事後も学習をすることが重要なことだと感じました。

# まとめ
以上、私的ハッカソンに参加するメリット、反省点、やってよかったことでした。

やっぱり、ハッカソンは短期集中で成長できて、就活にも使えるし、継続力のない人間にとってはうってつけのイベントだなと思います。

この記事を読んで少しでもハッカソンに興味が出た人はぜひ参加してみてほしいです！
仕様が決まる前にQAができる品質向上、費用効率化を考えてみた

### はじめに
***
みなさま、こんにちは。

どの仕事にも言えることですが、高品質高効率は求められます。
この記事をご覧いただいている方はモバイルゲームの開発に携わっている方、QA業務に携わっている方が多いと思います。QA業務も **「障害削減」** **「費用削減」** は逃げることができないKPIです。みなさま上司に「費用下げてね」、「障害出さないでね」と毎回言われていると思います。
今回はそんなみなさまの手助けとなる記事になるかもしれません。

### QAが直面するシチュエーション
***
費用削減、障害削減と言われても簡単ではないです。
 
**なぜか**。

私の経験を踏まえて新規リリースタイトルと運用タイトルで考えてみました。

- 新規リリース
まず予定がびっくりするほどずれます。ずれるんです。
それは内部要因、外部要因いろいろありますが、一番はバランス調整であったり、お客さまが求める要望を満たすための仕様変更が多いです。QAに関わっている人は経験した人が多いのではないでしょうか。

その結果　**再テスト**　になります。

マスター、機能に変更が入る→テスト→マスター、機能に変更が入る→テストのループにより、もはや高効率なんて言葉を発する余裕がありません。

- 運用タイトル
初期はお客さまの要望の声、（本当は出したくないけど）本番不具合の対応、施策運用など開発チームはてんてこまいです。多くのお客さまに遊んでいただけるタイトルは開発規模も大きくなり、開発チームの成熟度以上に関わる人が急増し、大所帯になります。
そんな中、QAの費用削減、障害削減まで手が回らず、目の前のことに精一杯になるんです。

### 費用削減、障害削減がなかなか進捗しない理由を整理すると
***


- 新規タイトル
```
 - 予定通りに進捗することがまれなので、費用削減、障害削減の効果が薄い
 - 「いいものを出す」が優先度高く、その次に「なるべく早く出す」
 - お客さまの要望の声、（本当は出したくないけど）本番不具合の対応が予想の倍以上
```

- 運用タイトル
```
  - 運用タイトルは長期になればなるほど運用コストの削減が重要視される
  - QAだけでコストがさげられる領域は限られている
  - マスター構造、仕様書の記載でコスト削減対象の施策に制限がある
  - そうなると開発チームと連携してコストを下げる必要があるが
  - 運用中は売上確保するために常に施策を考える必要があるし、改善、障害対応もやる必要あるし、
  - コスト削減の優先度が低い
```

### 解決策
***
であれば、アプリが出る前に削減できる仕組みを導入できたらいいんじゃない。と思ったんです。モバイルゲームの制作段階を表す表現として、企画、設計、実装、テスト、という言葉があります。
QAの方はテストの段階から参画していると思われます。
企画、設計段階からQA参画し、費用削減、障害削減の仕込むことができれば解決しそうです。

### 具体的にやることは3つ
***
**1.新規タイトルのスケジュールと開発チームのメンバーとの良い関係性を獲得しましょう**
- 企画、設計、実装、テストの各フェーズがいつから開始するのか。
- 開発チームのメンバーと気軽に話せる関係性を作り、一緒に良いものを作りたい気持ちを表しましょう。

**2.ENと連携しましょう**
- 過去の実績から工数がかかっているテストの内容を共有。その機能に対して自動化テストが導入しやすい設計にしてもらいましょう
- クライアント自動テストを基盤に仕込み、リグレッションテストの自動化を導入してもらいましょう

**3.PLと連携しましょう**
- 仕様の記載方法のルールを決めましょう。QAは仕様からテスト設計を行います。情報が分散しているとテスト設計の漏れにつながります。
- マスターの設計方法を見直してもらいましょう。マスターは手動入力が多ければ多いほど運用時の漏れに繋がります。過去の障害状況を共有して手動で入力する箇所を減らしてもらいましょう。


### まとめ
***
```
- 障害が増加したから要因を調査し打ち手を考える
- 売上が減少して利益をだすために効率化を考えるが、
- 実際は売上取りに行くため施策数は減らない、関わる人は減るという負の連鎖
```

という、事象が発生してから対応すると後手に回ります。

設計フェーズから開発チームと連携を開始して、障害削減、効率化を行うための準備をすすめてしまいましょう。
各種ファイルのゲノムの座標を変換するCrossMap.py

## リファレンスゲノム間で座標を変更したい

hg18 (NCBI36) <=> hg19 (GRCh37) でゲノム座標を変換したいということが、しばしばあると思います。このようなとき、LiftOverというツールがよく使われます。しかし、CrossMap というツールもあって、非常に便利であることを知りました。このツールについて、日本語の記事がほとんどないようなので、ググラビリティの改善のためにQiita記事にします。

## CrossMap

### 概要

> CrossMap is a program for genome coordinates conversion between different assemblies (such as hg18 (NCBI36) <=> hg19 (GRCh37)). It supports commonly used file formats including BAM, CRAM, SAM, Wiggle, BigWig, BED, GFF, GTF, MAF VCF, and gVCF.

CrossMapは、異なるアセンブリ間（hg18 (NCBI36) <=> hg19 (GRCh37)など）のゲノム座標変換を行うプログラムです。BAM, CRAM, SAM, Wiggle, BigWig, BED, GFF, GTF, MAF VCF, gVCF などの一般的なファイル形式をサポートしています。

https://crossmap.readthedocs.io/en/latest/

↓Github もあるが ↑公式サイトの方が情報量が多い

https://github.com/liguowang/CrossMap

### インストール

pipを使ってインストール・アップグレードできます。

```sh
pip3 install CrossMap
pip3 install CrossMap --upgrade
```

Python2の場合：

```sh
pip2 install CrossMap
pip2 install CrossMap --upgrade
```

## 使い方

サブコマンドとして、変更したいファイルのファイル形式を指定します。
`bed`, `bam`, `gff`, `wig`, `bigwig`, `vcf`, `gvcf`, `maf`, `region`, `viewchain`

例：bedファイルの変換

```sh
CrossMap.py bed hg18ToHg19.over.chain.gz test.hg18.bed3 test.hg19.bed3
```

VCFファイルの変換では、変換先のリファレンスゲノムが第三引数で必要になるなど、サブコマンドによって微妙に引数が異なるところがあるので、実行する前に自分が変換したいファイルのためのサブコマンドの使い方を確認しておきましょう。

```sh
CrossMap.py vcf --help
```



## 入力ファイル

次のようなファイルが必要になります。

|ファイル|説明|
|------|----|
| chain | ゲノムの座標変換に必要になる[Chainフォーマット](https://genome.ucsc.edu/goldenPath/help/chain.html)のファイルです。事前にダウンロードして用意します。|
| input | 変換するファイルの名前 |
| ref.fa | ターゲットのリファレンスゲノム（VCF, GVCF, MAFの変換で必要）|
| build_name | ターゲットアセンブリの名前（例 "GRCh38" ）（MAFで必要）|
| output | 出力するファイルの名前（省略すると標準出力）|

## viewchainサブコマンド

Chainファイルをわかりやすく表示することができます。

```sh
CrossMap.py viewchain hoge.chain
```

## 評

このツールの素晴らしいところは、2014年に[論文](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3967108/)化されているにもかかわらず、その後も継続的なメンテナンスが行われていることです。直近では2022年7月12 日リリース バージョン 0.6.4 が出ており、メンテナンスが継続されていることです。リファレンスでは[LiftOverと同じ結果が出ることも検証](https://crossmap.readthedocs.io/en/latest/#compare-to-ucsc-liftover-tool)されているとかかれています。非常に使いやすく、かつ信頼できるツールではないかと思います。
jsで表示切替


```
<p><input type="checkbox" name="chk1" onclick="setDisplay()">表示切替</p>


<div id="iupd" style="display:none"><!--表示切替用-->
test
</div>


<script type="text/javascript">
function setDisplay(){ 
    document.getElementById("iupd").style.display = "block";
} 
</script>
【AXT-bgSlide】思い立ったからHTMLに背景スライドショーを挿入するJavaScript作った

ほしいなぁと思ったので作りました。
本職じゃないのでそのくらいゆるいし、それでいいと思ってます。

配布名『AXT-bgSlide』

## 使用例

[index.html](https://ayaexptech.github.io/AXT-bgSlide/)も参照してください。

```html
<script src="script.min.js"></script>
```

```js
window.onload = function() {
    bgSlide(["1.jpg", "2.jpg", "3.jpg", "4.jpg"], 3, 0.3, -1, `filter: brightness(0.5);`)
}
```

## 配布場所

https://github.com/AyaExpTech/AXT-bgSlide

## 技術詳細

基本方針

- `div#bgSlide > div*n`(nは枚数)を作る
- bodyの先頭にぶちこむ
- フェードのanimationをCSSで書く(%の値は枚数とフェード秒数から計算する)
- `:nth-child()`を使って`background-image`を指定するCSSをforループで作ってkeyframesの指定と一緒にstyleタグとしてheadに挿入

細かい部分はzennで書きました。

- [テンプレートリテラルのいいところ@JavaScript](https://zenn.dev/ayaexptech/articles/fed0421338037e)
- [CSSのanimationでスライドショーを作る](https://zenn.dev/ayaexptech/articles/8d86707dede1bc)

## 規約

Author : 綾急技研(AyaExpTech)
Licensed by "AeTOS(Type-**06**)"

[AeTOSの規約文はこちら。](https://axtech.dev/license/)

![AeTOS(Type-06) AyaExpTech](https://axtech.dev/license/AeTOS-06.png)
Ionicでformの外側にあるion-buttonでsubmitする方法

今まで、Formをsubmitするためのion-buttonはform内に置く必要がありました。こんな感じですね。

```html
<form #f="ngForm">
  <ion-button type='submit' [disabled]="!f.form.valid">フォーム送信</ion-button>
</form>
```

なのですが、モバイルデザインの現実問題として、headerにbuttonを置き、Formをcontentに置くことは多々あります。そういった場合、今まではclickイベントでフォーム送信を行っていました。

```html
<ion-header>
    <ion-buttons slot="end">
      <ion-button (click)="submit()" [disabled]="!f.form.valid">
        フォーム送信
      </ion-button>
    </ion-buttons>
</ion-header>
<ion-content>
    <form #f="ngForm">
      // 様々なInput要素
    </form>
</ion-content>
```

AngularのForm APIを使ってdisabledを機能させてるとはいえ、FormイベントをClickで代用するのは違和感ありますよね。

しかし、Ionic v6.3からFormの外側にあるbuttonでsubmitイベントを実行できるようになりました！🎉利用方法はFormにidを設定して、`ion-button` にform属性でそのidを指定するだけ。

```html
<form id="exampleForm">
  <!-- Form controls -->
</form>
<ion-button type="submit" form="exampleForm">Submit</ion-button>
```

ちなみにバイブ処理的には、Formを見つけて、そのForm内にJavaScriptでbuttonを作成して、submitしたあとで、そのbuttonをremoveしてるようですね。

https://github.com/ionic-team/ionic-framework/blob/main/core/src/components/button/button.tsx#L225-L234

これによってより気持ちよくコーディングできるようになりますね！！

それではまた。
はじめてのOSSコントリビュート

# はじめに

なんとなくOSSに貢献は難しい、英語のやり取りだからハードルが高そう、私にはできないと思っていましたが、意外とやってみたらプルリクが受理されてコントリビュートできましたので、その時やったことをまとめたいと思います。
OSSやってみたいけどなんかハードルがあるという方の参考になればと思います。

# やったこと

## ①[GitHubのOSSコントリビュートのガイドライン](https://opensource.guide/ja/how-to-contribute/)を読む
やり方がよくわからなかったので、とりあえずGitHub公式のガイドラインを読みました。
ソースコードの修正がOSSコントリビュートだと思っていましたが、ガイドラインによると以下などもコントリビュートであると知りました。
- プロジェクトのドキュメント修正
- プロジェクトのドキュメントの翻訳
- 重複したIssueの紐づけ
- 古いIssueのクローズ
- Issueの質問に回答
- Stack Overflowでプロジェクトの質問に回答

また、経験が浅いならドキュメントの修正がおすすめとも書いてありました。

その他にも、重複したIssueを立てない、修正完了前に早めにプルリクエストを開く等の一般的な注意点が記載されていましたので、一度ガイドラインを読むことをおすすめします。

## ②練習用のリポジトリにプルリクを出してみる
ガイドライン中に初めての人に[おすすめのコントリビュート先一覧](https://opensource.guide/ja/how-to-contribute/#:~:text=%E3%81%BE%E3%81%9F%E3%80%81%E6%96%B0%E3%81%97%E3%81%84%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%81%A6%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E6%89%8B%E5%8A%A9%E3%81%91%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%E6%AC%A1%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE%E3%81%86%E3%81%A1%E3%81%AE%E4%B8%80%E3%81%A4%E3%82%92%E4%BD%BF%E3%81%86%E3%81%93%E3%81%A8%E3%82%82%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%3A)がありました。
そのうちの[First Contribusions](https://github.com/firstcontributions/first-contributions)というリポジトリで、実際にリポジトリをフォークして、ドキュメントを変更して、プルリクを出す操作を練習できました。
私はフォークの操作もやったことが無かったので、お試しできたのは良かったです。

## ③コントリビュート先のリポジトリのガイドラインを読む
私は[Octokit.net](https://github.com/octokit/octokit.net)というOSSをよく使用しており、その使用中に不具合を見つけたので、その不具合のIssueを立てて修正しようと思いました。
（すごく小さな修正で済みそうだったので、自分でもできそうと思えるものがたまたま見つかりました。）
OSSにはコントリビュートのガイドラインがあるはずなので、見ておくといいと思います。
Octokit.netの場合は特別細かいルールは見当たりませんでしたが、OSSによっては命名規則など細かいルールが存在するみたいです。
Octokit.netのガイドラインは[こちら](https://github.com/octokit/octokit.net/blob/main/CONTRIBUTING.md)。

## ④Issueを立て、リポジトリをフォークして修正する
Issueを立てる際には他に同様のIssueが無いかを調べてから立てました。
また、ガイドラインと他の人のIssueを参考にして内容を記載しました。英語で記載するためそこだけ非常に困りましたが、[DeepL](https://www.deepl.com/ja/translator)等のサービスを使って何とか書きました。
Issue上で修正方針の確認を取った後、リポジトリをフォークして修正しました。
修正に関してはとにかく他のコードと一貫するように修正することを気を付けました。
立てたIssueは[こちら](https://github.com/octokit/octokit.net/pull/2608)。

## ⑤プルリクを送る
コードを変更したらすぐにプルリクを送りました。
途中の状態でもプルリクのタイトルの先頭に[WIP]など接頭辞を付けて早く出して早めにレビューや方針の誤りが無いか確認してもらうのが良いと思います。
何度かやり取りをしてコードを修正した結果、プルリクが受理され、修正がmainブランチにマージされました。
送ったプルリクは[こちら](https://github.com/octokit/octokit.net/issues/2587)。

# さいごに
一通りやってみて、一番難しいのはコントリビュート先を見つけることかもと思いました。
今回はたまたまよく使っているOSSの小さな修正だったので初めてでもやりやすかったです。
普段使っているOSSであれば、割とコントリビュートにチャレンジしやすいかも！？と思います。

知らない相手に対してしかも英語のやり取りでというところがとても怖かったのですが、なんとか初めてのコントリビュートができて、とても達成感がありました。
また、以下のように自分の変更が入ったバージョンがリリースされたのは嬉しかったです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/da898f65-35a7-bcc5-e11a-598c1a22ae27.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562946/914058fd-9b66-5dde-505b-217078f95ced.png)

私はビビりながら進めましたが、意外と歓迎してくれますし、意外とプルリクが通るかもなので、まずは手を動かしてやってみてもいいかもしれません！
MySQLのポートをSQLで確認

# やり方

```sql
SHOW VARIABLES LIKE 'port'
```

# 参考サイトさん

https://mebee.info/2022/04/07/post-50910/

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
MySQL 8.0.31
MySQL 5.7.38-log
Power Automateでプロセスマイニング - そもそもプロセスマイニングって何？

こんにちわ。Microsoftの稲冨です。

今日はPower Automateでプロセスマイニングができるようになりましたよというお話をします。
2022年3月、MicrosoftはプロセスマイニングのMinitを買収しました。

https://japan.zdnet.com/article/35185719/#:~:text=Microsoft%E3%81%AF%E7%B1%B3%E5%9B%BD%E6%99%82%E9%96%933%E6%9C%8831%E6%97%A5%E3%80%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%99%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AEMinit%E3%82%92,%E8%B2%B7%E5%8F%8E%20%E3%81%97%E3%81%9F%E3%81%A8%E7%99%BA%E8%A1%A8%E3%81%97%E3%81%9F%E3%80%82

以前からPower AutomateのProcess Advisorという機能でプロセスマイニングがPreview機能として提供されていましたが、この度のUpdateで、Process Advisorの中身が旧Minitに変わっています。
※個人的にはものすごくテンションが上がったのですが、Power Platform 2022 リリースサイクル2で全然目立ってなくて、あ、あれ？って感じでした。

【プロセスマイニング業界概況】

旧Minit社はプロセスマイニングの企業でもLeadersの1社に名を連ねています。
プロセスマイニングの世界ではCelonis社が業界を引っ張っており、そこに対して大手ベンダーが買収し、自社の既存製品と組み合わせることで価値を持たせるという状況になっております。
※UiPath社は2019年にProcessGold社を、SAP社は2021年にSignavio社を、IBM社は2021年にmyInvenio社を買収しています

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513758/72afee78-b07c-7eeb-2c1e-58be544fdeb6.png)

【そもそもプロセスマイニングって何？】

CelonisだーMinitだーと言ってきましたが、そもそもプロセスマイニングとは何でしょうか？

プロセスマイニングの衝撃（編著ラース・ラインケマイヤー）によれば、
「プロセスマイニングは、イベントログに基づいてビジネスプロセスを分析することを可能にするプロセス管理手法である」
と定義されています。

企業におけるイベントログとしては、ERPやCRMの様なシステムで登録される営業案件や販売伝票などに対しての活動が挙げられます。

例として販売伝票を挙げれば、
①顧客からの注文→②価格・数量の変更→③出荷・出庫の登録→④請求→⑤売掛金回収
などが考えられるわけですが、これら①～⑤の活動を実行時間なども加味して、プロセスマイニングでは分析を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513758/cfb0759f-3000-4687-7866-86919880aab1.png)

ここまでだとまだイメージがわかないと思いますので、Process Advisorの画面を見て見ましょう。
下記サンプルは売掛金について請求から各種終了までのプロセスの画面です。

このような画面で、売掛金に関するプロセスについて、
・どのような活動があるのか
・各活動間でどの程度時間がかかっているのか
・プロセスにはどのようなパターンがあるのか
が分かります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513758/bc746cb0-93c3-a917-8014-179587e17322.png)

【プロセスマイニングすると何が嬉しいのか】

プロセスに関するアプローチとして、BPR(ビジネスプロセス・リエンジニアリング)というものがあります。
BPRではプロセスの観点から業務フローや組織構造、情報システムなどを再構築し、業務改革することを目指します。
このBPRはERP導入と非常に親和性が高く、ERPでの標準プロセスをTo Beプロセスとして、そこを目指して導入し、ビジネスを進めていくというのが、定番のERP導入プロセスでした。

しかし、この方法だと、
・To Beプロセスと実際の業務プロセスでどの程度乖離があるのか？
・プロセスのどこにボトルネックがあるのか？
などを拾うことができません。

対して、前段にも記載しましたが、プロセスマイニングでは、今実際に行われているプロセスデータをつまびらかにし、それを分析することが主眼に置かれます。
これによって、
・プロセスで何のステップがボトルネックになっているのかの把握
・逸脱しているプロセスのパターンの把握と、それの業務標準化の推進
を可能にすることができます。

そして、このプロセスマイニングはRPAやローコード・ノーコードツールと非常に相性が良いです。

例えば、Complete the Customer Memo→Approve Invoiceのステップ間で平均15.5時間を要していることが分かりますが、例えばPower AutomateでTeamsに承認フローを飛ばすような施作を打てば、この数字は改善するはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513758/d794ae0d-0893-c0a5-df0c-bcf0a58e6792.png)


また、その他にもプロセスが遅延している原因には、ERPのプロセスでカバーされていない業務があり、そのためのデータをExcelにてメールでやり取りしているなんてことも考えられるかもしれません。
それであれば、そこをPower Appsでアプリ化して業務改善するということも考えられるでしょう。

さて、いかがだったでしょうか。
本日の記事はプロセスマイニングのそもそもについての記事でしたが、私もまだ環境を触り始めたばかりなので、進捗がありましたら、またこちらで共有できればと思います。

それでは次回の記事でお会いしましょう。

あ、これ本当にPower Automateで動いているの？と言われそうなので、最後に全体の画面キャプチャを貼っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513758/edba3189-2047-1edb-ecc4-3dae5ffeb15a.png)
vimでコピペの際にE850: Invalid register nameが出た場合

`:%y+`でコピペしようとして`E850: Invalid register name`が出た場合

Ubuntu 19.10より前の場合

```
$ sudo apt-get install vim-gnome -y
```

あとの場合

```
$ sudo apt-get install vim-gtk3 -y
```

参考

https://askubuntu.com/questions/1208159/how-do-i-install-vim-gnome-on-ubuntu-19-10

https://stackoverflow.com/questions/30838436/how-to-copy-all-the-text-from-vim-editor-using-vim-command-line
gradlew.batが見つからないときの対応

VSCodeでflutterを使った開発をしようと立ち上げるとgradleのエラー。
gradleは便利なんだろうけど、いつも初っ端にエラーを発生しやる気を削いでくれる。
gradleのパス等は設定したけど
`C:\\xxxxx\\xxxxx\\android/gradlew.bat`に対して`指定されたファイルが見つかりません。`と言われるときの対応

確かに該当ファイルは存在しない。　なので作成する必要がある。
コマンドプロンプトを立ち上げ、上記のフォルダに移動して以下のコマンドを入力する。
そうすると`gradlew.bat`が作成される。

```
gradle wrapper
```
新入社員とTeamGeek

## 初めに

入社して四ヶ月が経った。
私の部はチーム形成にかなり気を使っているように思えた。
おかげで、チーム全体の雰囲気が良いし議論も遠慮をせずに活発に行われているように思える。
そんな私のチームだが、どうやらTeamGeekという本がチームのあり方の考え方の一つになっているらしい。
そこで、TeamGeekを読んでみて実際に感じたことや私のチームが行っている行動を併せて書いていこうと思う。

## チーム開発を行う意義
TeamGeekで初めに書かれていたことはチームで開発することの意義についてだ。
まず、元来プログラマは1人で開発したがるということを次のように述べている。

> プログラマは人にバカだと思われたくないからコードを隠したがる。

研修当初の自分はまさにこの考えだった。
完璧なコードが書けていないことを自覚しているものの解決方法が分からない。
しかし、こんな単純なことで質問したら失望されるのではないかという思いから手が止まってしまい、無駄に時間を使ってしまってそれを指摘されていた。
ただ、私のチームの心理的安全性の高さに気づいてからは質問をためらうことが減ったと思っている。
心理的安全性とは、組織の中で自分の考えや気持ちを誰に対してでも安心して発言できる状態を指す。
私のチームが心理的安全性を保つためにどのような施策を取っているのかについては後述していく。

ではなぜ、対人的リスクを負ってでもチームで開発する必要があるのかということを、この本では1人で開発することの問題点を挙げて次のように述べている。

> 1人でコードを書いていると失敗に気づけないためリスクを孕む。そのためにチームを組む必要がある。

至極当然であるが大切なことだ。
1人ですべてのミスに気づき、その解決策を完璧に考えられる人間はそうそういない。だから私たちはチームを組む。
私のチームではこのリスクを避けるためにコードレビューを毎回行っている。レビューされていないコードは現場では使われない。
また、このコードレビューはミスの防止だけでなくコードの書き方の改善にも役立っている。よりシンプルな書き方を知っている人からはその知識を吸収できるし、レビューしている側も他の人のコードを読み解くことで新たな知見を得られる。

このように、失敗のリスクを避けたりより良いものを作っていくためには多角的な視点を持つ必要がある。
そして、そのためにはチーム開発というものは避けて通れない関門なのである。

## チーム開発で気をつけること
チーム開発のメリットは判明したが一方で、対人関係が付きまとうというデメリットも抱えている。1人での開発ではなかった新たな悩みの種だ。
TeamGeekではその悩みの原因を以下のように述べている。

> あらゆる人間関係の衝突は、**謙虚、尊敬、信頼**の欠如によるものだ。

チーム開発の一番の問題点はこの3つの欠落に起因するというのだ。
というのも、より良いものを作ろうとする中で批判というものは避けられないが批判をする側もされる側も「謙虚、尊敬、信頼」を持って接することでチームの和を保てるとのことだ。

具体的な例として次のような言葉を述べている。

> 君は君の書いたコードではない

この言葉の意味するところは、自分の書いたコードが批判されたからと言って自分の人間性を攻撃されたと誤認してはいけないということだ。
レビュワーのコードへの批判はより良いものにするための提案であるので、レビューをされた側はレビュワーを信頼して批判を受け止めなければいけないし、レビュワーは謙虚に指摘をすることでチーム内の軋轢をなくすことができる。
私はいまだにレビューで指摘を受けると身構えてしまうが、レビュワーへの信頼を深めることで批判に対し真摯に対応していきたいと思う。

また、チーム内でのコミュニケーションのあり方については以下のように述べている。

> コミュニケーションの原則は同期コミュニケーション(MTG等)を減らし非同期コミュニケーション(チャット等)を増やすことである

この理由は、非同期コミュニケーションはログが残るため以前なされた議論を無駄に再度行ってしまうことがないためである。
私のチームではTeamsなどでの非同期なツールのやりとりが活発であり、口頭などのやりとりで決まったことなどは非同期なものに上げておくことが推奨されている。

## おわりに

現代においてチーム開発というものは必要不可欠なものである。
そして、よりよいチームを作るためにはチームリーダーだけでなくメンバー1人1人が意識をする必要がある。
それは小難しい原理などではなく、メンバーと接する際に"謙虚、尊敬、信頼"を忘れないという単純な試みで達成できることだ。
この単純だが簡単ではない課題を胸に留めておくことで、これからもチームを形成する一員として働きたいと思う。
java 二次元配列で成績表を作るメモ

まったくの初心者がJavaプログラミング学習を始めたので
アウトプットのため投稿します。
使っている教材の課題です。

Javaで一覧表を作成して表示させましょう。
また、各教科の合計点と、平均点をそれぞれ算出して表示しましょう。

```java
package jp.win.java.chapter7;
public class sample7_05 {

	public static void main(String[] args) {
		int test [][] ={
				{64,60,73},
				{72,55,70},
				{48,58,83},
				{58,63,60},
				{79,83,62},
		};
		int goukei[] = {0,0,0};
		
		System.out.println("\t"+ "\t英語"+ "\t数学"+ "\t国語");
	
		for(int i = 0;i < test.length; i++){
			System.out.print("\n"+(i+1)+"人目");
			
			for(int j =0; j< test[i].length; j++){
				System.out.print("\t" + test[i][j]+"点");

				goukei[j] += test[i][j];
				
				}
			}
		System.out.println();
		System.out.println("----------------------------");
		System.out.print("合計\t"+ goukei[0]+"点");
		System.out.print("\t"+ goukei[1]+"点");
		System.out.print("\t"+ goukei[2] +"点");
		System.out.println();
		 
		System.out.print("平均\t"+ (goukei[0]/test.length)
				+"点");
		System.out.print("\t"+ (goukei[1]/test.length)+"点");
		System.out.print("\t"+ (goukei[2]/test.length)+"点");
	}

}
```

これを実行すると

```
		英語	数学	国語

1人目	64点	60点	73点
2人目	72点	55点	70点
3人目	48点	58点	83点
4人目	58点	63点	60点
5人目	79点	83点	62点
----------------------------
合計	321点	319点	348点
平均	64点	63点	69点
```

という結果になりました。

【反省点】
・合計の出し方がわからなかった。
`int goukei[] = {0,0,0};`
で合計を入れる配列を作るとのこと
また内側のfor文の中で
`goukei[j] += test[i][j];`　の計算式をいれる

【改善点】
合計と平均を出力しているあたり
`system.out`の表記が多い気がする
もう少し簡略できそう。


つたない投稿でごめんなさい。。
Qiitの使い方ってこれであってますかね？？
【Microsoft】PowerPagesのDBの設定方法

Power Pagesとは、2022年10月12日にローコード・ノーコードでビジネス向けWebサイトが作成できるツールとしてMicrosoftからリリースされたアプリです。今回は、このサービスを利用するにあたって、DBの設定方法についてまとめました。

# 設定方法
データベースの設定は主にメニューの**データ**という箇所から行います。
下の画像では、テンプレートの「放課後プログラムへの登録」のプロジェクトを使っています。
初期表示では、今回のサイト（プロジェクト）で使用されているテーブルが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/60233678-48d7-4196-5c1b-e8dceb57c446.png)

今回は、新しいテーブルを作成したいため「**＋表**」というボタンをクリックして新しい表を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/8fbbab54-011a-d269-2360-c0937d028f94.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/740d183f-38ba-19d5-6501-c531b31b20ae.png)

作成すると、下記のような画面になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/22187ff6-9e8f-f8a7-189b-6cfbf886896a.png)

ここからテーブル定義を行なっていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/7d510620-914e-9de0-9035-5d1e6cbf4855.png)

以下、各項目について説明します。
### データの種類
テキストや数値などのデータの**型**を設定することが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/0ef14877-5614-5272-0353-46e273e65333.png)


### 書式
**データの種類**で設定した型からさらに細かいデータの形式を設定します。
画像は種類を「1行テキスト」に設定した場合の例です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/ff439f0c-f9fd-92ba-93a0-2da323e3838d.png)


### 動作
値をどのように入力するかを設定します。
デフォルトで**シンプル**が選択されており、**計算**にした場合は様々な条件分岐で値を入れることが出来ます。
こちらの記事参照([PowerPagesでif文を用いたデータ列の作り方](https://qiita.com/ryoryo66/items/3b85f9c7b94f63a8bf7d))
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/9ea02cd8-334f-8e01-cbd4-a9e068c296c6.png)


### 必須
その列が**必須かどうか**を設定することが出来ます。デフォルトでは**任意**が選択されております。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/1042a5a2-f18a-e60a-5af0-a8bf168c030f.png)


# 問題点
最後に、PowerPagesのデータベースを使用した際に私自身が感じた問題点についていくつか紹介しようと思います。
## スキーマ名が勝手に決められてしまう。
これは、DB定義をする際にデフォルトでスキーマ名の接頭辞が固定されてしまっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/afac4c2d-e019-6dae-e4dc-228e7055fe8f.png)

## チェックマークの設定が複雑
画像のようなチェックマークを付ける系の設定の説明があいまいで具体的に何の設定かが公式ドキュメントを見てもわかりづらい(もしくはわからない)という点です。下のキャプチャに写しているのは一部分なのですが、他にもこのような設定をする箇所があり、とりあえずチェック無しで進めていると後からDB系でうまく動かないと思った時に、ここのチェックが原因だったということが多々ありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/6da93e0e-8310-37e9-09dd-0339ffe2c3b7.png)

ちなみに、注釈のようなマークがあるのでそこに詳しい説明があると思ってクリックしてもそこもやはり曖昧な説明でした。ツール自体新しく、まだ情報もあまり出回っていないので、このあたりの設定は初見ではかなり苦戦しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984251/137c2376-0b71-b2a4-2298-85eeddd21f4e.png)

# まとめ
PowerPagesはUIもわかりやすいので扱うデータが簡単なものであればすぐに作成出来ると思います。ただ、少し複雑になるとかなりややこしい設定方法を行う必要があるため、やはり、PowerPagesでDBを扱う系のサイト制作は難しいと感じました。
【pytest】pytestでfreezegunを使わずにdatetimeをモックしてみよう

# はじめに
パッケージに制約がある中で`datetime`を含むテストを書くときに困ったのでメモがてら書いておきます

# 環境
```
Python：3.9.7
pytest:2.7.0
pytest.mock:3.10.0
```

# テスト対象のメソッド
```datetime_wrapper.py
import datetime


def return_now():
    return datetime.now()

``` 

## `freezegun`なしでテストを書いてみよう
「おりゃ」
```test_datetime_wrapper.py
import datetime

class Test_return_now:
    def test_return_now(self, mocker):
        mocker.patch.object(datetime, "now", return_value=datetime.datetime(1111, 12, 31, 12, 34, 56))
        assert datetime_wrapper.GetFormattedCurrentTime() == "1111-12-31 12:34:56"

```
（そもそもこのテストをやる意義は一旦置いといて下さい...）

`datetime`の`now`メソッドがモックされ、`return_value`が固定された為一見問題なさそうに見えます。
が、通りません。

`datetime`モジュールとモジュール内で定義された`datetime`の名称領域を両方モックしてしまうため`return_value`の`datetime`もモックされてしまい`AttributeError`が出ます。

これは、`datetime_wrapper.py(test対象のモジュール)`内の`datetime`のみをモックすることで回避可能です。
例を以下に示します。

- 良いパターン
```test_datetime_wrapper.py
import datetime

class Test_return_now:
    def test_return_now(self, mocker):
        mock_now = mocker.patch.object(datetime_wrapper, "datetime").datetime.now
        mock_now.return_value = datetime.datetime(1111, 12, 31, 12, 34, 56)
        assert datetime_wrapper.return_now() == "1111-12-31 12:34:56"

```

以上のようにすることでピンポイントに`datetime_wrapper`内の`datetime`のみをモックすることができるためエラーを吐かずにテストを実行できます。


この例はオブジェクト単位でモックができる`mocker.object`を使う上で汎用性のある考え方で、その仕組みの理解にもつながるので覚えといて損はないと思います。
Gormのモデルで外部キーにポインターを利用すると、想定外のデータが取得された

# 最初に
Gormを利用していて、テストの最中にバグにぶつかってしまい、苦労しました。
そのため、今回の記事を共有のために、記事として残そうと思いました。

# 事象
Gorm (v1.23.8) で、モデルの外部キーにポインターを利用してNULLを許可した際に、Joinを用いてデータを取得すると、参照先のデータが想定と異なる場合がありました。

以下のデータを例に説明します。

Userテーブル
| ID | Name | CorporateID |
|:-:|:-:|:-:|
| 1  | Aさん  | 1  |
| 2  | Bさん  | NULL  |
| 3  | Cさん  | NULL  |
| 4  | Dさん  | 2  |

Corporateテーブル
| ID | Name |
|:-:|:-:|
| 1  | A社  |
| 2  | B社  |

下記のプログラムは単純にユーザーと企業テーブルをJoinして、ユーザーに企業が紐付いていれば企業名を表示するプログラムです。
ただ、実行すると想定した挙動と異なってしまいました。

```go
type Corporate struct {
	ID   uuid.UUID `gorm:"primaryKey;type:char(36);comment:企業ID"`
	Name string    `gorm:"type:varchar(32);not null;comment:企業名"`
}

type User struct {
	ID          uuid.UUID  `gorm:"primaryKey;type:char(36);comment:ユーザーID"`
	Name        string     `gorm:"type:varchar(32);not null;comment:ユーザー名"`
	CorporateID *uuid.UUID `gorm:"type:char(36);comment:企業ID"`
	Corporate   *Corporate `gorm:"references:ID"`
}

users := make([]User, 0)
db.Model(&User).Joins("Corporate").Find(&users)

for _, user := range users {
    if user.Corporate != nil {
        fmt.Println(user.Corporate.Name)
    }
}

// 実行結果
A社
A社
A社
B社
```

本来であれば、以下のように表示されてほしいところでした。

``` go
// 想定結果
A社
B社
```

# 原因
GitHubで調べてみると、Gormv1.23.6以降のバグであることが判明しました。
プルリク: https://github.com/go-gorm/gorm/pull/5388
コミット: https://github.com/Bexanderthebex/gorm/commit/90cceca6e7eb72216bf5d20e8808ae648721315b

上記のプルリクエストで、`Scan()`関数の最適化により、変数を毎回作成するのではなく、再利用するように修正されています。外部キーがNullの場合、初期化されずに前回の値を引き継いでしまうため、外部キーがNullにも関わらず、一つ前のレコードの内容が取得できてしまう場合があるみたいです。

先程の例を用いて原因を説明します。

Userテーブル
| ID | Name | CorporateID |
|:-:|:-:|:-:|
| 1  | Aさん  | 1  |
| 2  | Bさん  | NULL  |
| 3  | Cさん  | NULL  |
| 4  | Dさん  | 2  |

Corporateテーブル
| ID | Name |
|:-:|:-:|
| 1  | A社  |
| 2  | B社  |

SQLで上記のデータをLeft Joinすると以下のデータになるかと思います。

| User.ID | User.Name | Corporate.ID | Corporate.Name |
|:-:|:-:|:-:|:-:|
| 1  | Aさん  | 1  | A社  |
| 2  | Bさん  | NULL  | NULL  |
| 3  | Cさん  | NULL  | NULL  |
| 4  | Dさん  | 2  | B社  |

ただ、Gorm の機能を利用してデータを取得すると、変数を再利用する影響で、以下のようになってしまいました。

| User.ID | User.Name | User.CorporateID | Corporate.Name |
|:-:|:-:|:-:|:-:|
| 1  | Aさん  | 1  | A社  |
| 2  | Bさん  | NULL  | A社  |
| 3  | Cさん  | NULL  | A社  |
| 4  | Dさん  | 2  | B社  |

外部キーである CorporateID が Nullの場合、前回のデータを引き継ぐので、上記の例だとBさんおよびCさんの会社名はNullが正しいにも関わらず、A社となってしまいます。
そのため、以下のような出力となってしまいました。

```go
// 実行結果
A社
A社
A社
B社
```


# 対処法
２点ほど思いつく対処方法を記載します。

1. Gormのバージョンを1.35以下に変更する。
バージョンを下げることになるので、最適化がされていない場合などのデメリットがあります
1. 参照先ではなく、外部キーでnil判定する
今回の例ですと、Corporateではなく、CorporateIDがnil判定するようにします
```
users := make([]User, 0)
db.Model(&User).Joins("Corporate").Find(&users)
for _, user := range users {
    if user.CorporateID != nil {
        fmt.Println(user.Corporate.Name)
    }
}

// 実行結果
A社
B社
```

処理をする上で特に問題がないのであれば、今回の対処としても2は採用しました。

# まとめ
今回紹介した内容は Gorm 1.23.8 で発見した内容になります。最新のコードを確認した限り、改善されていないのかなと思います。どなたかの役に立てれば幸いです。
numpy bit積取得

# logical_andではなぜか初期配列値が意図せず0になるので自作

## bit積を取得(両方マッチしたものを返却)
```
def logicalAnd(arrayA,arrayB):
    logicalRes = arrayA ^ arrayB
    return np.logical_not(logicalRes).astype(np.int)
```

## テストコード
```
    def test_logicalAnd(self):
        testArray = np.array([0, 0, 1, 1, 1])  
        testArray2 = np.array([0, 0, 1, 1, 1])
    
        res = logicalAnd(testArray,testArray2)
        result = np.array([0, 0, 1, 1, 1])
        np.testing.assert_array_almost_equal(res, result)
```
GithubPackagesでパッケージを公開する時に発生した問題

# 書こうと思った動機
Github Packageに登録しようとした時に、この問題に遭遇しました。
この問題を解決するのに、ちょっとだけ時間がかかったので、自分の備忘録として何か書いておこうと思いました。

# 背景
最近ではGithub Actionsは無料枠があり、CI/CD環境として知名度が上がってきました。
私自身も興味があったのですが、公開したいライブラリを作るみたいな案が私自身にあまりなく、触る機会がありませんでした。
この度は参加している案件で、Github Actions/Github Packagesに触れる機会があり触ってみた所、この問題に遭遇しました。
私が0から作ったわけではなく、既に環境整備が終わっている状態で、Packagesに追加で登録するというタスクでした。
なので基本コピペしたら動くだろうと考えていました。
公開するPackageはJavaのLibraryで、Mavenを使ってBuildしています。

# 本記事では触れないこと
- github actionsの定義ファイルの書き方

# 本題
実際どういう問題が発生したかというと、**ビルドが通らない** という問題でした。
私が追加したものを動作確認しようと、Github Actionsは実行履歴を見ていると、ステータスがREDになりました。
当初は触ったことない所なので、何かミスをしたかなと思い、実行履歴の詳細を見てみると、Mavenが次エラーを出力していました。

```
[INFO] -------------------------------------------------------------
Error:  COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
Error: hogehoge could not create parent directories
・
・
・
```

私はこのエラーを初めて見たのですが、ググってもそれだ!!という記事にたどり着かなく難儀しました。


# 原因
上記のエラーメッセージで重要なのは、**could not create parent directories**でした。

Github ActionsはJavaが勝手に作ったディレクトリに対して、権限を持っていない為このような例外が出力されたようです。

※このIssueのコメントで気づきました。
https://github.com/EbonJaeger/PerWorldInventory/issues/209#issuecomment-332715359

# 解決策
Buildする前に作業ディレクトリを**Github Actions**のタスクで作成することにより、無事Buildが通りました。
めでたしめでたし。


※最初はCOMPILATION ERRORでググったりしたのですが、JavaのVersion違いじゃね?みたいな記事が多く見つかりました。
※BuildエラーならLocalでも再現するはず!と思い、LocalでBuildしてみたのですが問題なく動作したので、頭を抱えました。
データを統合するということの意味

みなさん、こんにちは！
今日は「データ統合」という言葉について少し掘り下げてみたいと思います。

この記事のタイトル「データを統合するということの意味」には実は2つのことが隠れています。1つ目は「データを統合する」という言葉の定義はどういったものなのか？ということ、2つ目は「データを統合するとどんないいことがあるの？」という結果に関する意味になります。

それではまず言葉の定義からお話ししましょう。

# 「データを統合する」とは？

「データを統合する」という言葉を聞いてみなさんはどのようなことを連想するでしょうか？
データが発生する場所は実に様々です。社内にある業務用のシステムであったり、IoTによって発生するセンサーデータであったり、SaaSシステムによって作られるデータなど、社内外のありとあらゆる場所でデータは生まれます。データの利用者がそれらを利用したいと思ったときどうすればいいでしょう？

#### 対象のデータを集める

もっとも原始的な方法は、データ利用者自身が様々なシステムからせっせとデータを集めることです。それぞれのシステムの管理者にメールを書きデータを抽出してもらう、あるいは利用者自身でたくさんの種類のシステムにアクセスし抽出することもあるでしょう。このようにデータを利用者のローカル環境に集め分析に使用するということができます。でもこれはデータ利用者に大変な労力を要求します。データが集まったころにはもうそのデータを分析する気力もなくなるほどに…

#### データレイクを作ってみよう

それではそのようなデータを1か所に集めたレイクを作ってみましょう。
データ利用者はデータをせっせと集めてくる必要はなくなりました。レイクにアクセスすることで必要なあらゆるデータを得ることができるようになったようです。
これでデータ利用者が抱えていた問題はすべて解決、喜んでいるはずですね！
っと、おやっ？データ利用者はまだ頭を抱えて必死に作業をしています。どういうことでしょう？データ利用者は何をしているのでしょうか？

#### データを集めるだけでは足りないこと

そう、利用者は集められたデータから必要なデータを抜き出したあと、様々な発生源から得たデータを正しくコラボレーションするためにデータの調整・加工をしていたのです。単純にはシステムごとに異なるマスターの調整を行ったり、データの粒度をそろえたり、行うべきことはとてもたくさんあります。これらの作業をデータ利用者に強いるのは大変酷なことです。データ利用者はそれぞれのマスターの仕様なんて知らないのですから。
これが統合されたようで統合されていないデータの落とし穴です。システム部門は「データが1か所に集まったのだからあとはデータ利用者が利用するだけ」になったと思っていますが、データ利用者からは利用するためには大変な作業が必要な「実は使えないデータの集まり」がそこにあるだけという使われないデータ環境ができただけということになります。

#### 本当の意味でのデータ統合

データを統合するということはデータ利用者が気持ちよくデータを利用できるようにしてあげることが必要です。企業が完成された製品をお客様に提供するのと同じようにデータ利用者が利用しやすいデータ製品を提供する必要があるのです。それが「データを統合する」ということなのです。

# 統合されたデータの価値

めでたく正しくデータが統合され、データ製品が提供される環境ができたときそれはどのような価値を生むのでしょうか？

#### サイロ化されたデータ

1つのシステムから生み出されてデータだけを利用してその分析を行ってみます。例えば航空会社の予約・発券システムのデータを利用するとしましょう。
そのお客様がよく自社の飛行機を利用してくれているのかがわかります。どの路線が予約が多い路線なのかもわかります。今年の年末年始時期が現在どのくらい混雑しているかもわかります。なんだかいろいろなことがわかりますね。
じゃあこのシステムのデータを分析するだけで十分じゃない？そう思わせてしまうのがサイロ化されたデータの罠です。複数のシステムのデータを組み合わせることでもっといろいろなことが分かるのにそれを行う必要がないと錯覚させてしまうのです。

#### 統合されたデータが生み出す価値

それでは先ほどの予約・発券システムのデータに座席管理とフライトスケジュールのデータを組み合わせてみましょう。さらにどんなことができるでしょうか？

ある便の予約はそこそこに埋まってきていますが、事前に特別費用が必要な「足元の広い席」の指定状況が芳しくないようです。このままではいつもは得られている特別費用の分の収入を得ることはできません。それではここにキャンペーンを行ってみましょう。「足元の広い席」を事前指定されたお客様にマイルのプレゼントなどいかがでしょうか？
そのキャンペーンが功を奏し、無事、特別費用が必要な座席の指定は完売となりました。さらに！普段はそのような座席の事前指定が少ない近距離の便でも事前指定が増えました！

このような施策の実施は予約・発券システムのデータだけではわからないことでした。このように様々なデータを組み合わせることで新たなビジネス価値が生まれること、これが「データを統合することで生まれるいいこと」の真の姿です。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/4cae0f5a-45d6-2288-5ac7-60b0f1ce82ac.png)

より多くのデータを統合し利用しうるすべてのデータの統合が完了すると、実施しうるすべての施策につながるデータ分析が可能になりデータの価値が最大になるのです。

# おわりに
データ統合という言葉の持つ本当の意味いかがでしたでしょうか？
データ利用者が本当に必要とするデータ製品の提供にぜひトライしてみてください。その先にデータによって意思決定が行われるDXの真の価値があります。

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
データレイク？データウェアハウス？

みなさん、こんにちは！

みなさんは「データ分析基盤」という言葉を聞いて連想される言葉はどういったものですか？
今、世の中には、
　データレイク
　レイクハウス
　データマート
　データウェアハウス
このようなデータ分析基盤を表す言葉が複数存在しています。
私たちテラデータがそれらの言葉をどのように考え、それがお客様、特に米国のお客様にで受け入れられているのかお話したいと思います。

# データ分析基盤を表す言葉について考えてみる

さきほど挙げた４つの言葉について私たちが同定義しているかお話しましょう。

#### データマート
データマートはユーザーが持っているデータ分析のニーズを満たすことを目的に、そのために必要なデータのみを集めたシステムです。ここでいうデータ分析のニーズというのはその企業のビジネスの中の一つの業務の中に閉じたものをいいます。
例えば管理会計システムであるとか顧客分析システムというったものです。
したがいましてデータマートは物理的にそういった業務ごとの単機能のシステムとなりがちで別の業務に関する分析ニーズを満たすためには別のシステムを新たに構築するということがほとんどです。そのため様々なデータマートが林立することとなり、それらを管理するために膨大なコストや人的リソースが必要となってくるという構造的な問題を内包しています。
実は日本ではデータウェアハウスと呼ばれるシステムがこのようなデータマートであることがとても多いです。

データマートは
　・データのバリエーションは少ない
　・課題解決のためにある程度データがわかりやすくまとめられている
　・対象業務によってユーザー数が変わり比較的大きなユーザー数となることもある
　・ダッシュボートや帳票から、ある程度深い分析にも利用されることがある
そんなシステムです。

#### データレイク
データレイクはIoTによって発生するデータのようなボリュームの大きなデータをコストを抑えて保存したり、短時間でデータ処理を行うことを目的に発展したシステムです。その目的のためにデータレイクでは当初からHadoopシステムが利用されることが多くありました。もともとオープンシステムであったHadoopは商用製品を利用した場合でもソフトウェアライセンス費用を安く抑えることができるため、商用データベース製品を利用するよりも単位サイズ（例えば1テラバイト）あたりの保存コストを安く抑えることができました。またHadoopは複数の物理的なハードウェアを使用してデータ処理を行うシステムのためノードを増やせば非常にボリュームの大きないわゆるビッグデータを扱いやすいこともありました。
現在はデータを蓄えるという点に特化しクラウド上に低コストで用意されるオブジェクトストアを利用することも多くなりました。

データレイクは
　・様々なデータを一次的に蓄えるため様々なデータが存在する
　・データを利用しやすい形に加工しない生データで保持することがほとんど
　・データとして利用しにくいままのため直接アクセスするユーザーは少ない
　・データ利用のバリエーションも限られる
そういったシステムとなります。

#### レイクハウス
レイクハウスはデータレイクに蓄えられているデータを少し複雑な分析ができるようにしたシステムになります。「少し複雑な」という言葉にはAIや機械学習も含まれます。
AIや機械学習で利用されるデータはIoTによって得られたセンサーデータのようなビッグデータを利用することも少なくありませんし、もともとデータレイクを構築するために使われていたHadoopもSparkと連携してPythonやRといった言語の処理を行うことが可能であるためこのような構成が派生的に生まれてきました。

レイクハウスは
　・様々なデータを一次的に蓄えるため様々なデータが存在する
　・生データを都度ユーザーが利用したい形に加工して利用する
　・データ・サイエンティストが利用することが多いためユーザー数は少ない
　・データ利用のバリエーションも限られる
といったシステムになります。

#### データウェアハウス
データウェアハウスは企業内のあらゆるユーザーがあらゆるデータを使用することができあらゆる処理を行うことができる、いわば究極のデータ分析環境です。成り立ちとして複数のデータマートを統合して構築されるデータマート・コンソリデーションや小さく、はじめは単機能のデータマートから始めたとしても、段階的にデータが追加され分析できる業務的な範囲を広げていくことでデータウェアハウスへと成長するグローイング・アップの場合とがあります。
企業内から様々なデータを集めてそれらを横串で通して分析を行うためには、マスターの統合をはじめ、複数のデータソースから得られた同じ意味を持つデータの選択など単一視点（シングル・オブ・ビュー）となるようなデータ統合をおこなってデータを利用するユーザーに迷いが生じないようにすることが肝要です。
このようなデータウェアハウスを構築することで新たな分析ニーズが生まれた際に、新たな分析システムを構築することなくすぐにそのニーズにこたえることができるようになります。

データウェアハウスは
　・企業内のすべてのデータを保持するためデータのバリエーションが非常に多い
　・様々なソースから得られたデータが統合されているべきである
　・全社で利用するためユーザー数が非常に多い
　・あらゆるニーズにこたえるためデータ利用のバリエーションも多い
といったシステムになります。

![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2742714/b692be5c-12e1-2118-e91a-f9b157c0ebeb.png)

4つのシステムをその特性に応じて並べたものが上の図になります。データを蓄えておくほぼ器に近いデータレイクから高度に統合されあらゆるニーズにこたえられるデータウェアハウスまで、それぞれの特長を考慮したシステム構築を行うべきでしょう。

私たちテラデータは企業が持つべきデータ分析環境は私たちの言うデータウェアハウスであると考えています。
その理由については別の記事で紹介したいと思います。

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
NetBSDでZRouterが出来ないわけ

ZRouter.orgはFreeBSDで構築されているのですが、NetBSDもいろいろ調べてみて、NetBSDでZRouterが実現不可能なことがだんだん分かってきたので、まとめておきます。

ZRouterはビルド環境と実行環境という側面があります。ビルド環境は考えればどうにかなるかもしれませんが、実行環境は致命的です。

* geomがない

ZRouterではflashにread onlyな圧縮iso9660なfsを置いてますが、これはgeomの拡張で実現しています。現在NetBSDにはgeomのような仕組みはないので同じようなfsが作れません。

* etherswitchのコードがない

etherswitchを初期化しないとifがあっても外部と通信できません。最低限の初期化コードをifコードなどにハードコードするしかないようです。

* cfi,spi flashのサポートが貧弱

cfi,spi flashのサポートが共通化されてなくてSOC個別になっているので、使えないケースが多いようです。

全般的にNetBSDでは個別実装が多くFreeBSDのように簡単にいじれないのも難しいところです。

カーネルソースが汚いのも問題です。

ターゲットもたくさん手元にあるので、わざわざNetBSDでZRouterと同じことをする必要はなくて、別のアプローチを考えたほうが良いようです。

ビルド環境の話ですがFreeBSDには標準のディストリビューションからファイルを減らしてビルドする機能があります。同等のものはNetBSDには無さそうです。
複数のElasticsearchの辞書をWSL+Dockerで管理する

# はじめに
**前提**
- Windows 21H2
- WSL2
- Ubuntu 22.04.1 LTS
- Docker Engine v20.10.21

**現状**
- 研究でElasticsearchを使ったシステムを構築している
- 比較実験のためシステムのバージョンが複数存在する
- バージョンごとにElasticsearchに使用するDocumentも異なる
- indexによるバージョン間の分離はしたくない

**問題**
- RDBにおけるテーブルのような役割をElasticsearchで再現したい

**解決案**
1. Elasticsearch内でうまくドキュメントが被らないような設定をする
2. Dockerでバージョンごとのコンテナを管理する

１について調べたものの、答えを得られなかったため、２で解決する。
具体的な１の方法ご存知の方いらっしゃったら教えてください。

# 1. Docker Desktop をインストール
[Docker Desktop](https://www.docker.com/products/docker-desktop/)をインストールする。設定は以下の画像の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519632/d44180fd-686e-a473-c5f5-4d1e9c88c1a6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519632/3a047304-9142-0c23-1428-eb269ef011f0.png)
**参考**: [WSL 2 での Docker リモート コンテナーの概要](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-containers)

# 2. Docker Desktop に Elasticsearch 環境を構築
Docker Desktopを連携したディストリビューションのbashで以下のコマンドを実行する。
- インポートするElasticsearchのバージョンは任意のものを選ぶ
- `--name`でコンテナ名を指定できる
```bash
(sudo) docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.7
(sudo) docker run --name "sample-es" -p 127.0.0.1:9200:9200 -p 127.0.0.1:9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.17.7
```
**参考**: [Install Elasticsearch with Docker](https://www.elastic.co/guide/en/elasticsearch/reference/7.17/docker.html)

# 3. コンテナの追加
2の2つ目のコマンドを繰り返すことで、コンテナを追加できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519632/ed0432d5-d219-de9f-33aa-c64c1b17c04c.png)


# まとめ
- 複数バージョンの辞書をDockerのGUIで管理できて楽
【Swift】初心者のランダム通話アプリ開発奮闘記 #3

# 今日の積み上げ
Show SwiftUI Inspector 機能を使って、テキストをタイトル化、バックグラウンドカラーを変えてみました。
プレビュー側で、Command + Click を押しても、一生Actionが出てこないのはなぜ？？？
![2022:11:30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997222/8ab2c134-6a7e-c025-b445-c0a63bf74bf1.png)
人柱Windows10に最新のWindowsUpdateを適用させる為に作ったbat（コマンド）

# 概要

人柱Windows10 = 常に最新のWindowsUpdateを適用させとく検証機的なやつ 。

WindowsUpdate画面開いてマウスをポチポチしてUpdate適用するのが面倒くさいのでbat作りました。

# bat

下記のようなコマンドのbatを作って、タスクスケジューラで夜間に実行してまーす。

```bat
usoclient StartScan
usoclient StartDownload
usoclient StartInstall
usoclient StartInteractiveScan
start ms-settings:windowsupdate-action
```

bat起動すると ↓ こんな画面開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/af4d56d1-9b71-59b6-289f-ab1cf0fdccf7.png)

# オプションの更新プログラムは適用されない…

この記事のbatを実行しても下記のように『オプションの更新プログラム』は適用されずに残る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/bda76bc3-1c88-60d6-a770-c87bdf691bee.png)

オプションの更新プログラムをコマンドで適用する方法分からなかった。

なので、あきらめてbatの最後で
```start ms-settings:windowsupdate-action``` 
をして、WindowsUpdateの画面を表示させてる。
（オプションの更新プログラム適用は手処理）

# 蛇足

本当はWSUSの環境があるといいんだけど…。
無いから仕方なく…。

# 参考サイトさん

https://news.mynavi.jp/article/win10tips-528/

https://atmarkit.itmedia.co.jp/ait/articles/1707/11/news009.html

https://blog.treedown.net/entry/2021/02/25/010000

https://forgetmenots.doorblog.jp/archives/55586467.html

https://qiita.com/okomme/items/330377ccc0cc1a935e25

https://aprico-media.com/posts/8450#:~:text=%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8C,%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%82%88%E3%80%82

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
AWS の分散負荷テストツール(DLT) で負荷試験を行う際のノウハウについて

## はじめに

この記事は[エムスリーキャリア FY22 AdventCalendar](https://qiita.com/advent-calendar/2022/m3c)の5日目の記事です。

## 2023/10/03追記: DLTの日本語ワークショップの情報など

[こちらのページ](https://kakakakakku.hatenablog.com/entry/2023/10/02/090852) に2023/10時点の最新の情報が紹介されています。

[日本語のワークショップ](https://catalog.us-east-1.prod.workshops.aws/workshops/401f5147-738e-45d9-be9f-fed9c42a60b0/ja-JP)も紹介もされています。

## 使用するAWSソリューション

https://aws.amazon.com/jp/solutions/implementations/distributed-load-testing-on-aws/

## 前提：分散負荷試験ツールにおける負荷試験の流れ

上記ツールを用いた負荷試験の基本的な流れは、下記のDeveloperIOの記事が良いです。負荷状況によっては、AWSへの事前申請も必要なのをお忘れなく。

https://dev.classmethod.jp/articles/distributed-load-testing-on-aws/

## v2.0.0現在の追加の設定項目

現在の最新版ではありませんが、上述のDeveloperIOの記事より新しいv2.0.0が出たので、設定項目変わっていると思います。

注意事項は下記の２点です。

- subnetは ALBにアクセスできる　private subnet を用意し、指定してください。（負荷をかけるコンテナが起動するsubnetです）
- CloudFormation用に新しくIAM Roleを作る必要があります。
    - 信頼できるエンティティ： cloudformation.amazonaws.com を指定し、AdministratorAccessのポリシーをアタッチしたIAM Roleを用意しておけば良いです。

## 負荷試験の設計、パラメータの計算

### 適切な負荷をかけるまでの手順

（前提）私たちの場合、テスト対象のシステムはRuby on Rails（RackサーバはUnicorn)のものでした。また、リバースプロキシにnginxを使用しています。この構成以外でも同じ手順が使えるとは思いますが、何か変えた方が良いかもしれない場合がある点、ご留意ください。

既にシステムが稼働しているなら、ピーク時間帯の１分あたりのリクエスト数から秒間スループットを推定し、同時接続数（Concurrency * Taskの値）を推定します。

その後、パラメータを仮に指定してみて、短時間（マニュアルによればRAMP UP 最低５分くらい。でも実際には１〜２分くらいでやってた。HOLD ONは５〜１５分くらい）の負荷試験を実行します。そして、意図通りの負荷がかかっているかどうか、リクエスト数やレスポンスタイム、スループットなどから確認します。

その際、負荷試験用のECSクラスターについて、「Container Insight＞パフォーマンスのモニタリング」から確認し、CPU使用率が最大75% 以下、メモリ使用率が最大85%以下であることを確認してください。それ以上になっていたら負荷がかけきれていません。また、リアルタイムの負荷状況は、負荷試験ツールのテスト詳細画面からCloudWatchのリンクがあるので、そこからレスポンスタイムやVirtualUser数などが確認できます。

私は、1 taskに10以上のconcurrencyを設定すると、負荷をかける側のコンテナのスペックが足りなくて、負荷がかけきれずエラーになるケースがありました。経験則ですが、1 taskには4Concurrencyくらいは少なくとも指定して問題なさそうです（標準では2vCPUなのでハイパースレッディング加味すると論理コア数が4つなので。）。

上記の確認をしながらパラメータを調整し、短期間動かすということを繰り返し、負荷試験の調整を行ってください。

短期間で調整し終わったら、５０〜６０分の試験をやってみてください。改めて、CPUやメモリの使用率を確認してみてください。

#### 参考資料

同時接続数などのパラメータの決め方については、下記のドキュメントも参照してください。

https://docs.aws.amazon.com/ja_jp/solutions/latest/distributed-load-testing-on-aws/determine-number-of-users.html

このAWSのドキュメントは、下記のドキュメントを抜粋したものなので、より詳細な手順を知りたい場合は下記のドキュメントを参照してください。

https://guide.blazemeter.com/hc/en-us/articles/360000864389-Calibrating-a-Taurus-Test-Calibrating-a-Taurus-Test#engine

## 複数の負荷試験シナリオを実行する

負荷試験ツールで複数のTestを作成し、それを手動で同時に実行させてください。

JMeterでテストシナリオを記述する場合、Test Planもそれぞれファイルを分けて作成しアップロードしてください。

負荷試験ツールの1つのTestでは、JMeterの1つのThreadGroupの試験しか実行されません。



## JMeterでテストシナリオを作る

### JMeterをbrewでインストールした場合の注意

起動したら初めに「Options > Look&Feel」をSystemなど、Darklaf 系以外の適当なものに変更してください。でないとファイルが保存できないなど、機能が使えません。（クラスが不足している模様）

https://yumanoblog.com/jmeter-error/

### 上記AWSソリューションでJMeterのJDBCの負荷試験を行う場合


JMeterのTestPlanの設定で、JDBC Driverのパスを `/bzt-configs/foobar.jar` のように設定する。合わせて、ホスト名、DB名、ユーザ名、パスワードも正しく設定する。

そして、JMeterのjmx ファイルとJDBCドライバをまとめてzipファイルする。

その後、分散負荷ツールの画面から、テストを作成してJMeterのテストを実行するように設定してからzipをアップロードし、テストを実行します。
AIQVE ONEに入社して感じたこと


みなさま、はじめまして！
AIQVE ONE Advent Calender7日目を担当する@H_K_SSです。
ラッキーセブンですね..何か楽しい話題をご提供できれば幸いです:star:

私の記事からは、AIQVE ONEに入社してから感じたことについてお話しできればと思います。
##
__入社してから感じること__

ズバリ、学びの場が多い！ということです。

入社前は、機械に強い人や専門用語が飛び交っている社内を想像していたのですが、
実際は私と同じ未経験から入社した方が多く驚きました。

さらに驚いたことは、同じ未経験でも皆さん着実にソフトウェアの知識を身につけていて、
入社数か月の方でもわからないことを的確に教えてくださったことです。

社内でも勉強会を定期的に実施していて、
なんかここ学校みたいやな～、と思ったのを覚えています（笑）

勉強内容は、JSTQBについてやゲームデバッグの攻略方法であったり、
他にもIT関連やコアな情報など幅広く先輩や上司陣が教えてくれます。
未経験だった先輩方が登壇することもあり、新人の私にも分かりやすい内容が多いです。

こうした場も設けてくださり、日々新しい知識や情報を吸収しています。
（頭パンク状態で帰りの電車でボーっとする率高め...:innocent:）
##
__各拠点のメンバーと携わって気づいたこと__

私たちAIQVE ONEは、東京・福岡・大阪・京都の大きく4つのエリアに分かれてお仕事をしています。

各拠点、それぞれ特色があり何より社員みんなゲームが大好きです！

私は、大阪ラボに着任し一年が経とうとしています。
この一年で5件以上の案件に携わらせていただきました。
私がラッキーだったなと思うことは、この一年で全拠点の方と関わりを持てたことです。

案件の稼働メンバーは、常に同拠点メンバーだけで動くわけではなく
他拠点の方たちと協力して稼働することも多々あります。

作業は同じでも拠点が離れていると、
さっと聞けることも躊躇ってしまったり連携が上手くいかなかったり
地味なストレスが積み重なることもありました。

しかし、どの拠点のメンバーも本当に皆さん気さく且つ話が早い方たちばかりで
困った時はいつでも助けてくれました。
何より、離れているからこそレスポンスは迅速に応えてくれたり（これほんとに大事）
上手く伝えられない時でも汲み取ってくれる理解力や読解力に長けている方が多いのです。

そんな環境に身を置いて、学びのある日々を過ごせていることに
皆さんと関わることで気づくことができました。
##
__最後に__

弊社のプラス面に偏りましたが、、笑
もちろん、甘いことだけでなく厳しいこともあります！
ただ、知識や経験がなくても学ぼうという姿勢があれば
手を差し伸べてくれる人たちがたくさんいます。

あとは、自分次第です。

まだまだ未熟者ではありますが、私もこれから経験を積みさらに成長していきたいと思います。

最後まで読んでくださり、ありがとうございました！
AlmaLinux9.0でcron設定

ジョブスケジューリングデーモンであるcronで、スクリプトを日々の決められた時間に自動実行されるよう設定した時のメモ。

cronがインストールされていることを確認。
```
# dnf search crontabs
メタデータの期限切れの最終確認: hh:mm:ss 時間前の yyyy年mm月dd日 hh時mm分ss秒 に実施しました。
========================================== 名前 完全一致: crontabs ==========================================
crontabs.noarch : Root crontab files used to schedule the execution of programs
```
<br>

crontab設定。(毎日AM2:00にスクリプト実行設定)
```
# crontab -e
0 2 * * * hogehoge.sh
```
<br>

cronサービスの再起動
```
systemctl restart crond
```
<br>

サーバ起動の度にcron実行するよう設定。
```
systemctl enable crond
```
<br>

cronの実行状況確認、「active (running)」となっているのでOK。
```
# systemctl status crond
● crond.service - Command Scheduler
     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2022-11-30 14:22:21 JST; 12s ago
   Main PID: 12909 (crond)
      Tasks: 1 (limit: 203240)
     Memory: 952.0K
        CPU: 6ms
     CGroup: /system.slice/crond.service
             mq12909 /usr/sbin/crond -n
```
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo for DB_HOST failed: nodename nor servname provided, or not known (SQL: select * from `sessions` where `id` = xxxxxxxxxxxxxxxxx limit 1)  の解決例

## 何が起こった？
さっきまでまでつながっていたmysqlとlaravelのローカルアプリがつながらないことになった。

## 解決法
stopしているdocker containerを`docker-compose down`(docker-networkの削除)を打ち込むことで削除することで解決した。
上記の後はローカルが問題なく動作した。

## 原因
~~docker-networkがあるとローカルだけで立ち上げてもdockerのDB接続情報(.envの環境変数)を引き継いでしまうことがあると思われる。~~

~~詳細に関しては筆者もわかってはいない。~~

#### 20230207追記
環境ごとの.envの命名によるのが原因のようでした。（.で区切ると.以降はないものと見なされるようです）

```
.env
.env.local
.env.testing
```
上記が今回エラーが起きたフォルダに入っているのですが、.envより先に.env.local（pc目線では.env）を読みに行ってしまうのが原因でした。
多分フォルダの下から読み込むので.emv.testingの次に下にあるファイル名の.envを一番先に読みにいったと思われます。
なので.env.zzzとかがあったらそちらが読まれるのではと予想されます。

※絶対の確信までは持てていないので、間違っていたらお許しください
Databricksにおける不正レコード、不正ファイルの取り扱い

[Handling bad records and files \| Databricks on AWS](https://docs.databricks.com/spark/latest/spark-sql/handling-bad-records.html) [2022/5/16時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

ファイルベースのデータソースからデータを読み込む際、Apache Spark SQLは2つの典型的なエラーに遭遇します。第一にファイルを読み込めない場合(例えば、ファイルが存在しない、アクセスできない、破損している)があります。第二に、ファイルが処理可能であったとしても、いくつかのレコードがパースできない場合(例えば、構文エラーやスキーマのミスマッチ)があります。

Databricksでは、Sparkジョブを阻害することなしに不正なレコードやファイルを取り扱うための統合インタフェースを提供しています。データソースのオプション`badRecordsPath`を指定することで、例外のログから例外レコード/ファイルや理由を取得することができます。`badRecordsPath`では、CSVやJSONソースにおける不正レコードに関する情報やすべてのファイルベースのビルトインソース(Parquetなど)の不正ファイルを記録する例外ファイルのパスを指定します。

さらに、ファイルを読み込む際、ネットワーク接続例外、IO例外などの一時的なエラーが起きる場合があります。これらのエラーは無視されますが、`badRecordsPath`で記録され、Sparkはタスクの実行を継続します。

:::note
**注意**
ファイルベースのデータソースにおける`badRecordsPath`オプションの使用においては、いくつか重要な制限が存在します。

- 非トランザクションであり、一貫性の無い結果につながる場合があります。
- 一時的なエラーは失敗として取り扱われます。
:::

# サンプル

## 入力ファイルが見つからない

```scala:Scala
val df = spark.read
  .option("badRecordsPath", "/tmp/badRecordsPath")
  .format("parquet").load("/input/parquetFile")

// Delete the input parquet file '/input/parquetFile'
dbutils.fs.rm("/input/parquetFile")

df.show()
```

上のサンプルでは、`df.show()`が入力ファイルを見つけ出せないため、Sparkはエラーを記録するためにJSONフォーマットで例外ファイルを作成します。例えば、`/tmp/badRecordsPath/20170724T101153/bad_files/xyz`が例外ファイルのパスとします。このファイルは指定された`badRecordsPath`ディレクトリに格納されます。`20170724T101153`はこの`DataFrameReader`の作成時刻です。`bad_files`は例外のタイプであり、`xyz`が不正ファイルのパスと例外の理由のメッセージを含むJSONレコードを格納するファイルとなります。

## 入力ファイルに不正レコードが含まれている

```scala:Scala
// Creates a json file containing both parsable and corrupted records
Seq("""{"a": 1, "b": 2}""", """{bad-record""").toDF().write.format("text").save("/tmp/input/jsonFile")

val df = spark.read
  .option("badRecordsPath", "/tmp/badRecordsPath")
  .schema("a int, b int")
  .format("json")
  .load("/tmp/input/jsonFile")

df.show()
```

この例では、データフレームにはパース可能な一行目(`{"a": 1, "b": 2}`)が含まれています。2行目の不正なレコード(`{bad-record`)は`/tmp/badRecordsPath/20170724T114715/bad_records/xyz`のJSON例外ファイルとして記録されます。この例外ファイルには、不正レコード、レコードを含むファイルへのパス、例外の理由に関するメッセージが含まれます。例外ファイルを特定したら、処理するためにJSONリーダーをしようすることができまs

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
JavaScriptについての基礎をおさえる②

## HTMLのclass属性で複数要素を取り出す
　HTML内にclass属性をつけて、その要素を操作することはよくある。「JavaScriptの基礎をおさえる①」でfruitというclass属性のついたliタグができているので、これを取り出して確認する。

```html:html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>step0</title>
</head>
<body>
<ul id = "arrayTest"></ul> 
<script src = "./main.js"></script>
</body>
</html>
```
これに対して
```javascript:main.js
let fruits = ["りんご","もも","みかん"];
let fruitsStr ="";
for(let i = 0; i < fruits.length; i++){
  fruitsStr += '<li class = "fruit">' + fruits[i] + '</li>';
}

let arrayElm = document.getElementById("arrayTest");
arrayElm.innerHTML = fruitsStr;

let fruitElms = document.getElementsByClassName("fruit");①
for(let i = 0;i < fruitElms.length; i++){
  let fruitElm = fruitElms[i];
  console.log(fruitElm.textContent);②
}
```
　id属性と違い、class属性は画面に複数配置することができるため、class属性の名前を条件に指定すると複数の要素が取れる可能性がある。

[id属性の複数取得について](https://zero-plus.io/media/html-id/)

document.getElementsByClassNameを使うと、指定したclass属性が適用されている要素を全て取得する。
　今回であれば、fruitクラスは、「りんご」、「もも」、「みかん」の3つなので、fruitElms.lenghは３となる。
取得してきたfruitElmsにforで順番にアクセスして、```<li>```で囲まれたテキストをtextContentプロパティを使って取得し、コンソールに出力した。以下のように出力される。
![スクリーンショット 2022-11-30 14.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/c1dad2a2-ecb3-e920-7cf1-329e4e31926a.png)
　また、class属性の指定が画面上に一つだけあって、それを取り出したいシーンもある。その場合以下のような要領で一行で書き、最初の一つの要素を取り出すことも取り出すことも多いので覚えておくと良い。

```
let fruitElm = document.getElementsByclassName("fruit")[0];
```

> 参考文献
[ステップアップJavaScript フロントエンド開発の初級から中級へ進むために](https://www.amazon.co.jp/%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97JavaScript-%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%A8%E3%83%B3%E3%83%89%E9%96%8B%E7%99%BA%E3%81%AE%E5%88%9D%E7%B4%9A%E3%81%8B%E3%82%89%E4%B8%AD%E7%B4%9A%E3%81%B8%E9%80%B2%E3%82%80%E3%81%9F%E3%82%81%E3%81%AB-%E4%BD%90%E8%97%A4-%E6%AD%A3%E5%BF%97-ebook/dp/B09MQ53Y2C/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=9G912ZQLVXY8&keywords=%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97JavaScript&qid=1669644043&qu=eyJxc2MiOiIxLjEwIiwicXNhIjoiMS4wMCIsInFzcCI6IjAuOTcifQ%3D%3D&sprefix=%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%E3%82%A2%E3%83%83%E3%83%97javascript%2Caps%2C293&sr=8-1)