OmniAICreator/Qiita-1.07M huggingface dataset:
スタートアップにこそ知ってほしい。ITILで始める開発プロセスの構築

### ITILってなに？

皆さんの会社は開発プロセスをしっかり作られてますか？
歴史が長い大手企業やメガベンチャーであれば様々なプロセスが確立しているとは思いますが、スタートアップのような会社では決まったプロセスがなくてチームごとにバラバラだったりしますよね。またある程度プロセスを作っていても本当に十分なのか不安に思っている方も多いのではないでしょうか。

弊社も開発プロセスに自信を持っているわけではないです。最初の頃はGitの運用フローを決めてCI/CDを用意したからOKみたいな感じで開発してたんですが、提供サービスの数が増え、エンジニアが増え、開発チームが増えてくると、共通した開発プロセスが必要になってきます。特にユーザーが増え始めてくると作るだけではなく運用のプロセスも重要です。

そこで、開発・運用プロセスの見直しの参考にしたのが**ITIL**です。

> Information Technology Infrastructure Library（ITIL）とは、ITサービスマネジメントにおけるベストプラクティス（成功事例）をまとめた書籍群。1989年にイギリス政府のCCTA[によって公表された。ITILの読み方は「アイティル」、「アイティーアイエル」などがある。ITサービス全体においてデファクトスタンダードとなりつつあり、重要な位置付けとなっている。

引用元：[ITIL - Wikipedia](https://ja.wikipedia.org/wiki/Information_Technology_Infrastructure_Library)

簡単にいうとサービスの開発・運用に必要なプロセス集でありフレームワークです。フレームワークというとエンジニアには取っ付きやすいはず。
このフレームワークに乗っかることで網羅的にプロセスを把握することができるので、自分達に何が足りないのか、何をやれば良いのかという指針になります。

ITILはITIL 4が最新のバージョンとなり、サービスの開発・運用に必要なプロセスを34個のプラクティスとして定義しています。

![ITIL 4 プラクティスガイド](https://peoplecert.jp/img/products/ITIL4Practice.jpg)
引用元：[ITIL®4 | PeopleCert](https://peoplecert.jp/ITIL4.html)

### ITILをどう使ったの？

弊社では下記の手順で開発プロセスをITILをベースに見直してみました。

1. ITILのプラクティスをリストアップ
2. プラクティスに該当する既存のプロセスを紐付け
3. 現時点で自分たちの課題にどのプラクティスが必要か優先度づけ
4. 優先度が高いプラクティスから実践していく（既存プロセスがある場合はブラッシュアップ、ない場合はゼロから作る）

実際に実践したプラクティス＝プロセスをいくつかご紹介します。

#### リリース管理
リリース管理は開発した機能を利用できるようにするためのプロセスです。
リリース判定・リリース周知・リリース作業のプロセスを作成し、リリースに必要なテスト・リリース手順・切り戻し手順などのチェックシートを用意して、Slackのリリースチャンネルでチェックシートを共有したり、Googleカレンダーにリリースカレンダーを作ってリリース計画を共有したりしています。

#### インシデント管理

サービスに障害が発生した時の対応プロセスです。
障害対応時に誰が何をするかというフローを作成しました。Slackの障害共有用のチャンネルを作ったりインシデントをJiraでチケット管理したりしています。インシデント管理についてはJiraやConfluenceを提供しているAtlassianが具体的なプロセスを紹介しているのでこちらを参考にしました。

https://www.atlassian.com/ja/incident-management

#### モニタリング・イベント管理

サービスの状態監視です。死活監視や性能監視、ログの管理などになります。
弊社では、監視基盤をGrafanaとPrometheusで構築、SLI/SLO監視をSlothとPromitorで構築しました。またログの管理ルールを決めたりもしています。
最近ではログ管理にSentryを導入することにもしました。
この辺りはこちらの記事が詳しいです。

https://qiita.com/adachin0817/items/c960cf9dbb3a04b551b1

#### 可用性管理・サービスレベル管理

サービスの可用性や品質を定義するプロセスです。
まずSLOの整理から始めました。経済産業省が提供するSaaS向けSLAガイドラインをベースにSLOを作成しました。

https://www.meti.go.jp/policy/netsecurity/secdoc/contents/seccontents_000078.html

ただ、サービスの稼働時間などは計測していなかったため、前述したインシデント管理で障害発生時間を記録するようにし、この情報をもとに可用性目標を見直せるようにしています。

#### サービスデスク

ユーザーからの問い合わせなどのコミュニケーションの窓口になります。
元々問い合わせの管理にHubSpotを導入していたので、HubSpotでユーザー向けのFAQを作ったりメール配信の仕組みを作ったりしています。

#### ナレッジ管理

社内のナレッジ管理ですね。
弊社はナレッジ管理にConfluenceを使っていて、Confluenceに埋もれている社内のナレッジにアクセスしやすいようにポータルページを作りました。

#### その他取り組み

この他にも取り組み中のプロセスがあったり、ITILが挙げていないプロセスも追加して作ったりしています。また弊社はISMSも運用しているので、情報セキュリティ管理やサービス継続性管理はISMS委員会と連携して実施ています。

### まとめ

ここで紹介したプロセスはサービス管理プロジェクトとして会社横断のプロジェクトを立ち上げて各プロセスを管理・運用しています。ITILのプラクティスはサービスの開発と運用に関わる全ての部署や職種が対象になるため、会社全体で取り組んでいます。

ITILは一見複雑で重厚そうなフレームワークに見えるのでスタートアップには不向きな雰囲気があるのですが、自分たちに必要な物をピックアップしてカジュアルに実践していくという使い方がスタートアップに向いていると思います。
開発プロセスが未熟なスタートアップはITILのフレームワークに乗っかる事で何が必要か考える時間をショートカットできるので、ぜひ参考にしてみてください。
スマホロックアプリで企業賞をいただいた話(技育CAMPアドバンス)

# 自己紹介
初めまして、Nissiと申します。今回がQiita初投稿です！！

現在大学2年生で、プログラミング歴は1年弱です。web開発(go, typescript)とモバイル開発を勉強してます。
# 初ハッカソン参加の経緯
今年の3月に学内のエンジニアサークルでプログラミングを学び始め、しばらくweb開発界隈にいました。夏休みを通して自分がスマホ依存気味であり、iPhoneのスクリーンタイム機能でアプリを制限していたのですが、「制限を無視」ボタンがあり全く意味がありませんでした。そこで、スマホの利用を強めに制限できるモバイルアプリを作ろう！！と思い立ち、個人で11月の**技育CAMP**に申し込みました。(運良く？)企業賞をいただけて決勝大会に進めました。

# 作ったもの
アプリとwebサイトの利用を制限できるiOSアプリ「**Limitly**」を開発しました。

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637081/a5ef72e7-ddcf-9a15-4487-5e1a2dbcf6ab.png">
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637081/7ac9c3aa-3df6-00e1-40a9-ade81ec62a08.png">

Limitlyには2つの制限モードがあります。
- Limitモード
    制限の開始時刻と終了時刻を指定してその間でアプリやwebサイトの使用時間の上限を設定できます。上限時間を超えるとアプリがブロックされます。現時点ではその当日のみ制限が適用されるようになっているので、曜日などを指定して自動で動くようにする予定です。
- Focusモード
    タイマーを設定でき、タイマーの起動中はコンテンツをブロックします。僕自身ほぼ毎日使っていて、この記事を書いている今も使用しています。

[現在AppStoreにリリースしているバージョン]("https://apps.apple.com/us/app/limitly/id6467689467")ではこれらの制限機能のみですが、ハッカソンではコミュニティ作成機能や分析機能を追加したバージョンを発表しました。将来的にはこちらにアップデートしたいと思っています！！

# 技育アドバンスの感想
さすが決勝大会、どのチームのプロダクトも高クオリティで見応えがありました。VRやハードウェアなど自分にとって未知な開発領域の作品もあり、こんなこともできるんだなあと刺激を受けました。今後のアイデアのネタにしたいです。
発表自体も面白かったですが、終了後の懇親会も良かったです。学生かつプロダクトを開発している人は少ないと思うので、そのような方々と話せるのは貴重な機会でした。もっとたくさんの人と話せば良かったと後悔しています！

# 自己分析
結果としてLimitlyはCyberAgentさんから**企業賞**をいただけました。受賞の理由として以下のポイントがあるのかなと思います。
- スマホ依存に対する共感が高いのではないか
- リリースしていてユーザーがいる

それぞれについて詳しく説明していきます。
### スマホ依存に対する共感が高いのではないか
MMD研究所の2022年の調査では、スマホに「やや依存している」「かなり依存している」と答えた人の割合は70%にも昇り、その半数が依存から抜け出す必要があると思っているそうです。この記事を読んでいる方もスマホをコントロールできなくて悩みを抱えている方は多いのではないでしょうか。Limitlyはそのような人々に直接的に解決策を提供できる点が評価されたのかなと思います。

### リリースしていてユーザーがいる
今回のアドバンスでは、リリースして実際にユーザーがいる作品はそれほど多くないという印象でした。Limitlyは現在AppStoreにリリースしています。アプリの機能として言語依存がないので言語を英語にした結果、日本だけでなく、アメリカ・オーストラリア・ケニア・モンゴルからのインストールがあります(2023/12/19現在)。グローバルに価値を提供できているのは嬉しいです。

# 最後に宣伝
**勉強中や仕事中についついスマホを触ってしまう皆さん、ぜひLimitlyをインストールして使ってみてください！！** デフォルトのスクリーンタイム機能とは違って強い制限をかけられます。また、スマホ依存に陥りがちであろう小中高生にも使っていただきたいという思いから**広告なし・全て無料**でリリースしており、今後もその予定です。Limitlyでスマホを封印して効率を爆上げしましょう！

LP：[https://limitly-lp.studio.site/]("https://limitly-lp.studio.site/")
AppStore：[https://apps.apple.com/us/app/limitly/id6467689467]("https://apps.apple.com/us/app/limitly/id6467689467")
僕のX(フォローしていただけると嬉しいです)：[https://twitter.com/nissi__dev]("https://twitter.com/nissi__dev")
産休・育休から復帰後2年経って振り返る仕事と家事・育児の両立

# はじめに
この記事は「[LITALICO Engneers Advent Calender 2023](https://qiita.com/advent-calendar/2023/litalico)」の20日目の記事です。

はじめてまして、@abekyoです。
LITALICOには2018年に入社し、QAエンジニアとして働くワーママです。

この記事は、仕事と育児・家事を両立するためにやったこと（やっていること）の振り返りです。
基本的にはこれから産休育休を取得する人向けの記事ですが、仕事と何か（家族看病や介護など）の両立は、誰しも起きる可能性があると思いますので誰かに少しでも参考になれば幸いです。

# 産休育休前の働き方や過ごし方
### 産休育休前）
　・繁忙期は残業あり
　・家事は夫婦で分担、夜ごはんは気が乗らなかったら作らなかったり外食したり

### 産休育休後）
　・産休育休は1年取得、子ども1歳で復帰
　・ワンオペの日が多め
　・家事は夫婦で分担、夜ごはんはなるべくお家で食べるようにしたい

# 働き出して分かったこと
子供が産まれたので当たり前なのですが「とにかく時間が足りない！！」ということでした。
平日の夜は、保育園にお迎え、食事の準備、見守りつつ食べさせたり、その後はお風呂に入れて寝かしつけまでほぼノンストップ。
その間に掃除洗濯などの細々した家事をやったり、子の寝る時間まで毎日タイムアタックのようにこなしていきます。
復帰前は、業務後でもなんとなく仕事の事をぼんやり考えてみたり、お風呂に入っているときに新しいテスト観点を突然パッと思いついたりしていましたが、ゆっくり思考できる時間が少なくなりました。

# 両立のためにやったこと（やっていること）
仕事と家事・育児を両立するために、主に家事の効率化をやっています。

### ＜家事と育児＞
#### ・民間の病児保育、シッターの契約
子どもの病気で保育園にいけないときのために、病児保育サービスを申込みしました。
復帰1年目は子供が熱を出して病児保育を数回利用しましたが、今は休みや勤務時間を調整できるようになったので使っていません。

#### ・ネットサービスの利用
子供を連れての買い物は時間がかかるので、食品や日用品はネットで買うようになりました。
ネットスーパーは注文するタイミングによって配達日時が次の日以降になるものもあるので、2種類を使い分けています。

- 西友、ライフなどのネットスーパー：日々の買い物はこちら。配達までに1日～2日程度空くこともあり。
- onigo、uber、Coupang（日本撤退）：買い忘れやすぐ使いたいものはこちら。注文から30分前後で届く。

これ以外にも、調剤薬局のアプリや、洋服のクリーニングなど時短につながるサービスをよく利用しています。
直接店舗に行ったほうが価格が安いものもありますが、お金で時間を買っていると割り切っています。

#### ・ミールキット
宅配ミールキットを使い、「献立を考える」「買い物に行く」という時間を減らすことができました。
献立を考えることが苦手なので、ここの時間を短縮できるのはとても大きかったです。
サービスによっては食材がカット済になっているものもあり、調理の時間も短縮できるのもありがたい。

#### ・家電の買い足しや買い替え
冷蔵庫、乾燥機付き洗濯機、ホットクック、食洗器などを買い足しや買い替えをして時間を効率的に使えるようになりました。
ホットクックは時短にはなりませんが、火加減などを気にせずほったらかしにできるので煮込み系やスープ作りにとても役立っています。
あといっぱいしゃべるのでかわいい。（有料ですが声も変えられます。参考：[SHARP_COCORO VOICE](https://cocorostore.jp.sharp/cocoro/voice)）

#### ・夫との情報共有
LINEで子の体調だけを共有するトークを作成して、体調の変化を記録しています。
口頭だと共有忘れたり症状を上手く説明できないので、体温の経過や肌の症状などを写真とったりして病院受診する際に使います。
それ以外にもスケジュールやTodoなどもアプリで夫と共有して、ひとりに情報が偏らないようにしています。

### ＜仕事＞
#### ・情報は自分で止めない、共有を心がける
いま自分がやっている作業や様々な情報は常に共有するように心がけています。
口頭の共有だけではなく、マニュアルやwikiを作成しドキュメント化することでもし自分が急に休みになっても他のメンバーが困ったり作業が止まらないようにしています。

#### ・誰かにお願いできること、自分にしかできないことを切り分ける
日々様々な業務が発生するなか、以前は誰かにお願いするなら自分でやった方が早いからやっちゃおう。ということが良くありましたが、「誰かにお願いできること」と「自分にしかできないこと」を切り分け、属人化を防ぐようにしています。

#### ・相談先を見つける
1年のブランクとテレワークということで、自分の仕事の方向性などが合っているかが不安になることが多くありましたが、上司とはこまめに1on1をすることで、業務内容の確認や相談をしたり業務量の調整をしていました。
また、社内slackのチャンネルで「子育て部」に参加し、育児の困りごとを相談したり情報共有しています。
情報はInstagramやXでも手に入れることができますが、同じ社内に仲間がいるというのはまた別の心強さがあります。

# 復帰から２年を振り返って
なぜこのタイミングにこの記事を書いているかというと、毎日の仕事と家事と子育てをこなすのが精一杯で余裕がありませんでした（笑）
特に1年目は振り返ってみてもどう過ごしていたのか記憶にありません、、、本当はもっと早く書きたかった、、、

私がLITALICOで感じているのは　**”働き方に選択肢がある”** ということでした。
弊社ではテレワークや裁量労働など様々な勤務体系に関する制度があり、自分で選択し働き方を決めることができます。
この選択肢があるという状態が、私にとっては精神的にすごく良い影響を与えてくれているなと感じています。

復帰した時は子供は1歳、2年経って3歳になり楽になったこともありますが、大変になったこともあります。
子供の年齢などや人数やまわりの環境によっても必要なモノや情報働き方は変わりますが、これからもその時々に合わせて柔軟に働いていきたいなと思っています。

最後までお付き合いいただきありがとうございました！
MySQL や関連ツールのバージョンを固定してインストールする

# 背景

MySQL Shell をインストールした Docker イメージを作りたかった。
要件として Debian 10 を使った古いベースイメージを利用しなくてはならず、以下のような公式インストラクションで見られるリポジトリを使ったインストールは古い OS に対応しておらず、うまくいかなかった。

https://dev.mysql.com/downloads/repo/apt/

# 対応

Product Archives から各ツールの過去バージョンを個別にダウンロードできる。

https://downloads.mysql.com/archives/

MySQL Shell なら以下。

https://downloads.mysql.com/archives/shell/

2023/12 時点では、画面上から Product Version や OS を選ぶと、対応したパッケージをダウンロードできる。

```Dockerfile
RUN << EOR
  set -e
  curl -L "https://downloads.mysql.com/archives/get/p/43/file/mysql-shell_8.0.32-1debian10_amd64.deb" > /var/tmp/mysqlsh.deb
  apt install -y /var/tmp/mysqlsh.deb
  apt clean && rm -rf /var/lib/apt/lists/*
EOR
```

こんな具合に、Dockerfile 上からでもシンプルに個別のツールをインストールできる。

# 注意点

バージョンを固定することで、当然ながらパッケージのアップデートに追従できなくなるため、脆弱性には注意。
【seleniumクラス】WebElement



## はじめに
【seleniumクラス】Web Elementに関しての備忘録です。
初心者です😅
間違えてる部分が多々あると思います。
もし見つけた場合、ツッコミいただけると助かります🙇
<br>
## 🦁<INS>**結論**</INS>🦁

:::note info
押さえておくべき点
* WebElementはSeleniumでWebページの要素を表す。
* ID、クラス名、タグ名、CSSセレクタ、XPathなどで特定できる。
* クリック、テキスト入力、ドラッグ＆ドロップなどの操作が可能。
* is_displayed()メソッドで要素が表示されているかどうかを確認できる。
* is_enabled()メソッドで要素が有効かどうか（例えば、ボタンが押せるか）を確認できる。
* locationプロパティでページ内の要素の位置（X座標とY座標）を取得できる。
* sizeプロパティを使用して、要素のサイズ（幅と高さ）を取得できる。
* 要素のスクリーンショットを取得できる。
:::  
***

:::note warn
利用シーン
* .send_keysメソッドを使って指定部分のユーザー情報の入力をしたい時。
* スクレイピング操作したいとき
:::  
***


:::note alert
注意点
* ハンバーガーメニューなどで非表示要素は操作できないので注意が必要。
* 異なるブラウザでは動作が異なる場合がある。
:::  
***


## メソッド一覧
### **<INS>click()**
要素をクリック。
```
element.click()
```
***

### **<INS>send_keys(value)**
テキストボックスなどの要素にテキストを入力。
```
element.send_keys("テキスト")
```
***

### **<INS>get_attribute(name)**
要素の特定の属性の値を取得。
```
attribute_value = element.get_attribute("attribute_name")
```
***

### **<INS>text**
要素のテキストを取得。
```
text = element.text
```
***

### **<INS>is_displayed()**
要素が画面上に表示されているかどうかを確認。
この要素が画面上に表示されてから実行するときなどに使える。
```
is_visible = element.is_displayed()
```
***

### **<INS>is_enabled()**
要素が有効化されている（クリック可能など）かどうかを確認。有効化を確認できた後に次の動作を、行う。
```
is_enabled = element.is_enabled()
```
***

### **<INS>is_selected()**
チェックボックスやラジオボタンなどが選択されているかどうかを確認。
```
is_selected = element.is_selected()
```
***

### **<INS>clear()**
テキストフィールドの内容をクリアする。
あくまでもテキストボックスのみ。
ラジオボタンなどはNG
```
element.clear()
```
***

### **<INS>find_element_by_…()**
指定されたセレクタに一致する子要素を見つける。find_element_by_id, find_element_by_nameなどがあります。
```
child_element = element.find_element_by_id("child_id")
```
***

### **<INS>screenshot(filename)**
要素のスクリーンショットを取得し、指定されたファイル名で保存する。
```
element.screenshot("screenshot.png")
```
***
Wordpressで思わずやってしまった、つまづきやすかった、投稿ステータスに関しての過去の気付き

図々しくも、12月19日、投稿させていただきました。
もしよろしければ、私の過去の後悔を最後まで読んでお付き合いただけますと幸いです。

## 前書き
WordPressでサイトを数おおく作るようになって、オリジナルテーマの開発を行う最初の時に、つまづきやすかった事。
そして、解決したことで、WordPressの理解が深まった、過去のことを書きます。

## 直面していた問題
オリジナルテーマにカスタム投稿タイプを、更にカスタム投稿タイプにカスタムフィールドを使ったことで、クイック編集でステータスやカテゴリーなど変更を加えると、カスタムフィールドの中身が全て消えてしまう現象に悩まされました。

## 解決したきっかけ
セーブ時にやり取りされる、$_POST['action'] で判別できる、クイック編集の保存タイプに"inline-save"、通常の編集は"editpost"とタイプが用意されていた事で解決できました。

## 解決したコード記述
function.php
```

function customfield_save($post_id){ 
 if (isset( $_POST['action'] ) && $_POST['action'] == 'editpost') {
 // 編集の場合のみ保存
 update_post_meta($post_id, $value, $_POST[$value] );
 }else{
 // 編集以外は何もしない
 return $post_id;
 }
}

add_action('save_post', 'customfield_save');

```
## 解決したが問題点
もし、投稿一覧のクイック編集で自分で用意したカスタム投稿タイプのカスタムフィールドを編集できるようにした場合は、"inline-save"での処理が必要になります。
この現象を解決するまで気が付かなかったのですが、"save_post"は自分でカスタムフィールドを作った場合（function.phpで編集画面にフォームを追加している状態）、投稿一覧のリストのページからの「クイック編集」では画面に見えていないのに、自分で作ったカスタムフィールドも編集の操作の対象になってしまっていました。

## まとめ
function.phpでカスタムフィールドを追加するのは、スタイルも調整できますし、投稿タイプごとに編集画面を使いやすくできるメリットもあるので良いと思います。
色々なサイトやドキュメントを見ると、WordPressは色々なカスタマイズがしやすいように作られているのでついつい、使いやすく考えてしまうけど、今は、そもそものWordPressの主旨からズレてきてしまうので、管理画面をいかにシンプルに使うかで考えて構築しています。
統計検定1級に受かりたければこれをやれ

2023年11月19日に統計検定1級を受験し，統計数理，統計応用(社会科学)にダブル合格しました。
勉強期間半年(半分ダラダラ)で一発合格できた経験をもとに主観込み込みで綴っていきたいと思います。

## 結論
結論からいいます。統計検定1級に受かりたければやることはただひとつ。
[**現代数理統計学の基礎**](https://www.kyoritsu-pub.co.jp/book/b10003681.html)を完璧にする。
現代数理統計学？統計検定準1級ワークブック？過去問？~~いりません~~。
現代数理統計学の基礎，この本を仕上げ切るまでは手をつけなくていいです。

なぜこう言い切れるのか軽くですが説明していきたいと思います。

## 簡単な自己紹介
大学3年生。大学の授業で線形代数，微積，確率統計の基礎を履修。受験期は理系で数3も勉強していたためそこまで数学に対する抵抗はない。というか数学に抵抗のある方は統計検定1級に向いてないと思う。

## なぜ現代数理統計学の基礎だけでいいのか
統計応用の勉強はどうするの？そう思いますよね。
**統計応用は数理統計のちからがあればゴリ通せる**
いくら統計応用の専門知識があれど，数理統計ができなければ受かりません。
要するに統計応用合格のためには数理統計の力が必要条件なんです。
とにかくまずは現代数理統計学の基礎をひたすら完璧にするしかありません。

事実私は受験一週間前まで現代数理統計学の基礎の教科書しかやってません。
この教科書を**完璧**にしました。

## 具体的にどうやったの？
端的に述べます。
やるべき章は2章から7章。教科書の内容はもちろん，演習問題も全て（アスタリスク*のついてる問題は飛ばす）完璧にする以上。

1章と8章以降は自分は一通り読んで問題(8章以降はないので1章だけ)も解きましたけど統計検定1級の問題を見るならほぼ必要ありません。ここやって2~7章おろそかにするならやらないほうがいいです。
# １周目
1章目から教科書の内容を完璧に理解できるようにじっくり時間をかけながら読む。
ここが一番時間を使いましたが，やっておいてよかったと思います。今後問題を解くにあたってもきちんとした理解につながると思います。
各章ごとに読み終えたら演習問題を解く。
**解けません**
そんなもんです。1周目は写経でいいです。[『現代数理統計学の基礎』章末演習問題解答 (答案)](https://qiita.com/toukei/items/f9c19bf506b9894ba04e)を見ながら解答のプロセスを理解してください。ただ写すのではなく，なぜそう解いたら解けるのかを丁寧に理解しながらすすめました。どうしても理解できなかったら飛ばしていいです。いずれわかります。

# 2周目以降
ここで1周目に丁寧に教科書を読み込み，演習問題を写経した意味が段々と実感できるようになります。1周目はわけも分からなかった問題が少しずつ手が進むようになります。不思議ですね。
3周解く頃にはあらびっくり，解答とは別の解法でも解けているようになります。

## 現代数理統計学の基礎だけは流石にウソ
ウソといっても受験一週間前に公式の1級テキストと過去問を買って，一通り眺めました。でもこの程度です。

実際勉強の期間の9割9分をこの教科書に捧げていたので，だけといっても過言ではないですね。

追記
過去問を一通り眺めて覚えなくてはいけない項目に関しては一通り直前に暗記しました。（経済指数とか）

## おわりに
統計数理の受験の際は試験時間残り30分の頃には全ての問題が解き終えてました。
統計応用に関しても，対策を全くしなかったにしてはそこそこ戦えました。
これらは現代数理統計学の基礎を完璧にしたからだと言い切れます。統計数理なんてこの教科書の演習問題に比べればへっちゃらです。
ラズパイ+ubuntuでsudoなしでRPi.GPIOを使う方法

# はじめに
お疲れ様です。秋並です。<br>
ラズパイ+ubuntuで`RPi.GPIO`を使用してpythonコードを実行しようとすると、`RuntimeError: No access to /dev/mem.  Try running as root!` と表示されるため、
```shell
sudo python3 ****.py
```
と `sudo` をつけないと実行できません。<br>
わざわざ `sudo` を付けなくてはいけないのは面倒なので、`sudo`なしで`RPi.GPIO`を使用する方法を紹介します。<br>
以下の環境で動作確認しました。
- デバイス：Raspberry Pi4 ModelB 4GB
- OS : ubuntu Desktop 22.04.3 LTS (64bit)

# `RPi.GPIO`パッケージのインストール
最初に、`RPi.GPIO`パッケージをインストールしていない方は以下コマンドでインストールしてください。
```shell
sudo apt update -y && sudo apt install -y \
python3-rpi.gpio
```

# グループの追加
次に、gpioグループに[username]（[username]はご自身のユーザー名に置き換えてください）を追加します。

なお、私の環境ではgpioグループ自体が存在しなかったのでgpioグループを作成したのちに、ユーザーを追加しています。
```shell
sudo groupadd gpio
```
```shell
sudo usermod -a -G gpio [username] 
```

# ファイルの所有者の変更
ubuntuで`RPi.GPIO`を使用すると、`dev/mem` というところにアクセスしようとする[^1]のですが、`dev/mem`は管理者権限がないとアクセスできない（=`sudo`を付けないといけいない）ようになっています。

そこで、管理者権限がなくてもアクセスできる`dev/gpiomem`に所有者を変更します。
```shell
sudo chown root.gpio /dev/gpiomem
```

# /dev/gpiomemの権限を変更
デフォルトの`/dev/gpiomem`の権限では、`sudo`なしで実行できないので権限を変更します。
```
sudo chmod a+rw /dev/gpiomem
```

# udevルールの追加
上記の方法で、`sudo`なしで`RPi.GPIO`を使用することが出来るのですが、この場合、毎回「ファイルの所有者の変更」「/dev/gpiomemの権限を変更」のコマンドを入力する必要がでてくるため、少し面倒です。<br>
そこで、udevルールファイルと呼ばれるファイルに上記2種類のコマンドに相当するルールを記述することで、毎回コマンドを打たなくてもよいようにします。<br>
ルールファイルを作成します。
``` shell
sudo nano /etc/udev/rules.d/99-gpiomem.rules
```
以下の内容をファイルに記述し、保存します。
```
KERNEL=="gpiomem", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /dev/gpiomem'"
KERNEL=="gpiomem", GROUP="gpio", MODE="0666"
```
<br>

ルールを反映させます。
```shell
sudo udevadm control --reload-rules
```
```shell
sudo udevadm trigger
```
ルールを反映させたら、ラズパイを再起動します。
<br>

これで、sudoなしでも`RPi.GPIO`を使用したpythonファイルが実行できるようになっているはずです。

# 最後に
今回は、ubuntu+ラズパイでsudoなしでGPIOを使う方法を紹介しました。

私は、ROSを使うのでラズパイでubuntuが使用できるのは非常に便利なのですが、RaspberryPi OSと比較すると追加で必要な設定が結構多く、設定周りで詰まることが多いです。

個人的には、環境構築で時間が取られるのはもったいないと思っているので、この記事が少しでも皆さんの参考になれば幸いです。

[^1]: RaspberryPi OSは何もしなくても`dev/gpiomem`にアクセスされるっぽいのですが、ubuntuはデフォルトでは`dev/mem`にアクセスされてしまいます。
はじめてのGist

# はじめに
きっかけはこの記事。

https://qiita.com/ke_sukesakuma/items/0685d3dfef1a9af6561a

開発効率がいかほど上がるのか気になったので試してみることにしました

# Github gistって何？
「GitHub Gist」は、開発プラットフォームである「GitHub」が提供する、断片的にソースコードや文章を公開できるサービスになります。だそうです。

お仕事ではインフラ運用やってるので「あ～～・・・あのとき使ったコマンド、わすれたー」ってことがよくあるので
そんときは自前で収集してきた小ネタをOneNoteに詰め込んで検索、をしてたんですが
それの代わりになってくるかな？と思いました。

# Github gistを使ってみる
Githubアカウントがあれば普通に使えるっぽい。

## gistに登録する
https://gist.github.com/

へ行くといきなり登録画面になる。

こんな感じで～…軽くタイトルになりそうな説明と、スクリプトを入力。
検証でよく出番のある、apache+php環境をさくっと作る手順を書く。
で、右下の Create secret gist クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/37c13c02-3a08-4a7d-226f-993d8b0579d0.png)

登録完了。アッサリ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/e7a1e500-6017-401a-7c59-35cc0308db17.png)

ちなみに無理して英語にしなくても日本語も使えるのでご安心を。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/3c242851-59ea-f1b7-12b2-a48139766fcb.png)


## 登録したgistを確認する
TOP画面の右上より～ Your gists クリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/6185cff1-2711-6e72-67e6-d17a1f7d6c81.png)

すると、、一覧見える。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/8b35a760-46f7-8f93-69db-66db3e492b8c.png)

## gistに登録したコードをQiitaに張り付ける
share を選択して。。。表示されるURLをコピー。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/fd97ef47-e877-f1db-7a21-1f1061d435a5.png)

で、はりつけますよ。と。これでOK。ナイス。

https://gist.github.com/watyanabe164/f8dc7b7d7c2955d83bb65faa6ffd3991

実際に張り付けた様子がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416263/92893685-7aef-5a6b-b2bb-5a62d3be0499.png)

# おわりに
仕事柄小ネタの収集とそのブラッシュアップをする場所を探していたこともあり、
Github gistはその悩みにスポッとハマってくれたかも。
しばらく使ってみようかなと。
[kotlin][Android]WebViewの「target=blank」が正常に動作しない時の対応

Webviewを使用していると必ず当たる壁「target=blank」問題
これはHTMLでは別タブで開く時に使われるタグなんですがAndroidのWebviewではデフォルト設定では動作しないように設計されています。
どうもセキュリティとかを鑑みてのことのようですが実行しなければ始まりませんよね？
その際の設定方法とかをメモ書きいたします

まずは動作するコードを貼ります

```
// target=blank時の処理
webView.settings.setSupportMultipleWindows(true)
webView.webChromeClient = object : WebChromeClient() {
  override fun onCreateWindow(
    view: WebView?,
    isDialog: Boolean,
    isUserGesture: Boolean,
    resultMsg: Message?
  ): Boolean {
    // target=blank時は別ブラウザで実行
    val href = view!!.handler.obtainMessage()
    view!!.requestFocusNodeHref(href)
    val url = href.data.getString("url")
    val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(url))

    context!!.startActivity(browserIntent)
    return false
  }
}
webView.webViewClient = WebViewClient()
webView.loadUrl("表示するURL")
```

です。
さっくり説明すると
```
setSupportMultipleWindows(true)
```
で複数ページの表示をONにして
```
onCreateWindow
```
をoverrideして別ブラウザで表示
です。

個人的にハマったのはblankのリンクに画像が使用されていた場合にリンクしたいURLが取得できずに困りました。
```
val href = view!!.handler.obtainMessage()
    view!!.requestFocusNodeHref(href)
    val url = href.data.getString("url")
```
の処理で取得できるようになりました。

以上です！
VS Codeの静的分析でリアルタイムのコード フィードバックを取得

# はじめに
本投稿は、[Datadog アドベントカレンダー 2023](https://qiita.com/advent-calendar/2023/datadog)の12/11の記事になります。

すでにお使いの方もいらっしゃるかもしれませんが、VS CodeにはDatadogのエクステンションがあります。まだご存知ない、使ったことない、という方はこれを機に試してみてくださいね。
インストールは簡単で、普通にVS Codeのエクステンションメニューから検索でDatadogで見つかります。そのままインストールすれば数秒で終わります。

![Screenshot 2023-12-19 at 20.05.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/c5874880-69ce-3970-4daf-2a2ce7c11281.png)

Datadogエクステンションを使うと、ざっくり以下のことが可能になります。
１．Code Insightsで以下の情報を表示
- エラートラッキング上の問題
- アプリケーション脆弱性管理によるレポート
- CI Visibilityによって検出されたフレーキーテスト
- Watchdog Insightsからのプロファイリング分析情報

２．シンセティックテスト
- ローカル サーバーに対して既存のシンセティックテストを実行できるようにし、開発中の品質保証を提供

３．ファイルアクセス
- VS Codeで表示することで、Datadogプラットフォーム上のファイル参照からソースファイルに直接移動可能

４．ログ ナビゲーション
- コードからログを簡単に検索

５．Code Delta
- オブザーバビリティデータを、VS Codeのファイルに正確にマッピング

６．静的分析
- 変更をコミットする前でも問題を検出して修正可能

Datadogエクステンションの詳細については、[Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=Datadog.datadog-vscode)をご覧ください。

# 静的分析スキャンがサポートに
Datadog Static Analysis for VS Codeを使用してコードを作成すると、リアルタイムのフィードバックが得られます。 
Datadog for VS Codeエクステンションをインストールすることで、コードをスキャンして品質の問題やセキュリティの脆弱性を確認できるようになります。
検出された問題は、重大度に応じて、問題リストで赤、黄、または青で強調表示されます。特定の問題では、ワンクリックでコードに適用できる修正案も提供されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81226/87385f92-01b2-896a-631e-849fb00ca417.png)

# 使い方の流れ
VS Codeインテグレーションは現在、Python、JavaScript/TypeScript、Java コード、または Dockerfile のスキャンをサポートしています。

Datadog for VS Code エクステンションのバージョン1.4.1以上をインストールします。

スキャンするプロジェクトが、ルート ディレクトリに static-analysis.datadog.yml ファイルが定義されている初期化されたGitリポジトリである必要があります。
このYAMLファイルがまだ定義されていない場合、インテグレーションにより、プロジェクトで検出された言語のデフォルトのルールセットを使用してYAMLファイルを作成するよう、自動で提案されます。 

静的解析が現在、パブリックルールセットでサポートしているコードファイルを開きます。 

静的解析により検出された問題は、その重大度に応じてエディターで赤、黄色、または青で強調表示されます。対象の問題の上にマウスを置くと、問題の説明が表示されます。 

特定の問題には、ツールヒントの「クイック修正」オプションをクリックすることで、コードに直接適用できる修正が提案されます。
 
# さいごに
いかがでしたでしょうか？Ops要素の強いイメージがあるDatadogですが、このようにDev領域で活用できる機能もたくさんあります。
今回ご紹介した機能の詳細は[こちらから](https://docs.datadoghq.com/developers/ide_integrations/vscode/#static-analysis)ご確認いただけます。ぜひ、使ってみてくださいね 👋
RealmSwift マイグレーションで古いObjectの存在しないプロパティを参照しないようにする

RealmSwiftのマイグレーション処理の中で
古いObjectに存在しないプロパティを参照しようとすると
nilで取得できるとかじゃなく`invalid property name`エラーでクラッシュします。

```
migration.enumerateObjects(ofType: Sample.className(), { old, new in
    guard let old = old,
          let new = new else { return }

    // ここでクラッシュする
    guard let hoge = old["hoge"] as? String else { return } 
    
})
```

guard letを使っても、nilで返ってくるとかじゃないので意味がないです。

これを回避するためには以下のように
取得したいプロパティが古いObjectに存在するかチェックをしてから
取り出す必要があります。

```
migration.enumerateObjects(ofType: Sample.className(), { old, new in
    guard let old = old,
          let new = new else { return }
    
    if old.objectSchema.properties.contains(where: { $0.name == "hoge" }) == false {
        // 古いObjectにプロパティがない場合の処理を書く
        return
    }
    
    guard let hoge = old["hoge"] as? Bool else { return }

    // 後続処理
    
})
```

※ただし再現しているRealmSwiftのバージョンが4.4.1のため、
最新のバージョンでも同じ仕様かどうかは不明。
Contentfulから取得する画像の次世代画像フォーマット化

# はじめに
本記事はHRBrain Advent Calendar 2023の24日目の記事です。

https://qiita.com/advent-calendar/2023/hrbrain
# Contentfulとは
Headless CMSサービスであり、弊社では非エンジニアのチームからのデータの入稿において活用しています。
本記事は、既にContentfulを使用している人向けの記事になりますので、Cotentfulのデータの取得手順等は割愛させていただきます。

# Contentfulからの画像取得について
弊社では主に、[弊社サービスサイト](https://www.hrbrain.jp/)でContentfulを使用しています。
バナー画像等の画像は大きくCVRに関わるため、様々な画像をエンジニアのリソースを割かずに、反映できるためとても重宝しています。


# 次世代画像フォーマット化
以下調査では、表示速度が1秒改善されると20%CVRが改善されることが見込めるとあります。

https://repro.io/contents/site-page-speed/#section_0

light houseの計測でも画像を次世代フォーマット化することで改善するとの警告もでていました。
そこで、画像の次世代フォーマット化をし、表示速度を改善することでCVRの向上を目指すことにしました。

幸いにもContentfulでは、画像取得の際にフォーマットを選べる様にクエリを用意してくれています。

https://www.contentful.com/blog/load-avif-webp-using-html/

今回はavifとwebpでの取得を目指します。
以下utilsを作成し、画像を取得します。

```js
export function getImageUrl({ item, width, height, quality, type }) {
  try {
    let query = `?fit=fill&w=${width}`
    if (height) query += `&h=${height}`
    if (quality) query += `&q=${quality}`
    if (type) query += `&fm=${type}`
    const imageUrl = item.fields.file.url
    return `https:${imageUrl}${query}`
  } catch (e) {
    console.error(e)
  }
}
```
上記utilsを使い、画面側では以下の様に呼び出します。
itemはContentfulから取得した画像オブジェクトになります
```html
 <picture>
    <source
     :srcset="
       getImageUrl({
         item: item,
         width: 500,
         height: 500,
         type: 'avif',
       })
     "
     type="image/avif"
   />
   <source
     :srcset="
       getImageUrl({
         item: item,
         width: 500,
         height: 500,
         type: 'webp',
       })
     "
     type="image/webp"
   />
   <img
     :src="
       getImageUrl({
         item: item,
         width: 500,
         height: 500,
       })
     "
     :alt="hoge"
     :width="500"
     :height="500"
   />
</picture>
```
上記sourceの分岐で、avif→webp→imgの順で評価されるため、各フォーマットが対応していないブラウザでも問題なく表示することができます。

# 実際に次世代フォーマット化した結果
弊社サービスサイトでの対応箇所は合計で46箇所。
light houseで計測し、平均 2.99 sec表示速度が改善され、体感でも少しわかるくらいに速くなりました。
light houseのスコアも大きく改善し、`Serve Images In Next-Gen Formats`の警告はほとんど消えました。
# おわりに

株式会社HRBrainではHRBrainで一緒に働いてくれる仲間を募集しています。
エントリーお待ちしています！

https://www.hrbrain.co.jp/recruit
Feedlyで情報収集の効率化を図る

## あいさつ
はじめまして。今回は変化が早い時代に置いていかれないよう、私が普段の情報を収集する手段のひとつとして使用している、<b>「[Feedly](https://feedly.com/i/welcome)」</b>について紹介します。

## Feedlyとは？
Feedlyとは、オンラインのニュースやブログ投稿を収集して管理するためのアプリです。ユーザーは自分の興味やニーズに合わせて情報を収集し、最新の記事を一カ所で読むことができます。

## Feedlyの特徴
1\. カスタマイズ性
好きなトピックや特定のウェブサイトのフィードを購読できるため、ユーザーの興味に合わせてニュースをカスタマイズすることができます。

2\. グルーピング性
最新の記事を整理し、関連するトピックやキーワードに基づいてグループ分けすることができ、情報の整理が容易にできます。

3\. シンプルで使いやすいデザイン
シンプルで直感的なUIを提供し、ユーザーがストレスなく利用できるよう設計されています。

## Feedlyを使用するメリット
1\. 時間と労力の節約
複数のウェブサイトを個別に訪問する必要がなくなり、時間と労力を節約することができます。

2\. 最新の情報を取得 
好きなトピックの最新の情報を迅速に入手することができ、常に最新の情報にアクセスできます。

3\. 自分の関心に合わせたカスタマイズ
自分の興味や関心に基づいてフィードを編集し、カスタマイズできます。

## Feedlyの使い方
スマホ（iPhone & Android）でもアプリをリリースしていますが、今回はweb版での使用方法についてご紹介させていただきます。（＊2023/12/20 時点でのUIを参考の画像として使用しています。ご観覧されている時期によっては、一部見た目が異なる場合もあります。あらかじめご了承ください。）
手順は下記となっております。


### 目次
1\. アカウント作成
2\. フィードの登録

### 1. アカウント登録 
まず、[Feedlyのwebサイト](https://feedly.com/i/welcome)にアクセスします。
次に、<b>「GET STARTED FOR FREE」</b> のボタンをクリックします。

![a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/5de0133a-d53d-696b-64ac-e924f1e4fc2a.jpeg)


 アカウント登録には2つの方法を提供しています。今回はGoogleアカウントを利用した登録をご紹介します。
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/2a3f914a-92ef-9f11-dabb-eb0306c7dfba.png)

「Googleで登録」のボタンをクリックすると、ポップアップが出現するので、普段ご利用いただいているGoogleアカウントのID・Passwordを入力し先に進んでいきます。
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/3d7bb140-5e5f-9b20-a773-b73ae300b9d0.png)

### 2. フィードの登録方法
ログインした状態で画面の左側に電波に+がついたようなアイコンがあるので、そちらをクリックします。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/c3457428-8eef-285c-3502-73bcb3f139e1.png)

次に、右側の検索エリアに入力します。
入力するものとしては、フィードしたいサイトのURLまたは、キーワードを入力します。
今回は弊社のコーポレートサイトを例題として使用します。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/e3572e82-e2cc-5ab1-6739-b3747cbb2bae.png)

フィードしたいコンテンツがヒットしたら、<b>「FOLLOW」</b>のボタンをクリックします。
![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/860875d1-da8d-a5f8-d4bb-77afd7de7491.png)

<b>「FOLLOW」</b>をクリックするとフォルダ分けのポップアップバナーが表示されるので、<b>「+NEW FOLDER」</b>のボタンをクリックして新規フォルダを作成します。
(参考画像にあるDesignとTechフォルダは私が使用しているフォルダになります。初期の表示では存在しないものになります。)
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/d4eb6c68-aa54-d6f0-bdc1-499aca98a355.png)

入力エリアに新規で作成するフォルダ名を入力し、<b>「CREATE」</b>ボタンをクリックします。
今回は「Company」というフォルダを作成します。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/5ec9d83b-0fc0-9f06-933c-471ed7025294.png)

「CREATE」ボタンをクリックすると画面左側に先ほど作成したフォルダが生成され、そこに登録したコンテンツが格納されます。以上の手順で登録したコンテンツに更新された時に自動でRSSフィードしてくれます。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2557738/88e292c2-dd10-1c67-ae18-07c9f1f938d5.png)

## おわりに
情報の収集の手段の一つとして普段利用している、Feedlyのご紹介をさせていただきました。
英語のサイトのみのため初見では操作が難しいように感じてしまいます。しかし、記事でご紹介した通り使い方はとてもかんたんなので、情報の収集の手段のひとつとしてをご検討いかがでしょうか。
最後までお読みいただき、ありがとうございました。

## 参考文献
https://docs.feedly.com/
https://ferret-plus.com/1942
https://kusumin.com/post-2387/
Laravel: メールの送信

こちらと同様のことを行いました。
[【Laravel】Mailableを使ってメールを送信する方法。データや画像を添付する方法や入力データをメール本文に渡す方法](https://qiita.com/shizen-shin/items/77543199f1150d71e2bf)

<ol>

<li>プロジェクトの作成</li>

```bash
laravel new mailable
```

<li>.env の設定</li>

次はただのサンプルです。実際に動作するものと書き換えて下さい。

```text:.env
（省略）
MAIL_MAILER=smtp
MAIL_HOST="hi-ho.mose-mail.jp"
MAIL_PORT=587
MAIL_USERNAME="user@hi-ho.ne.jp"
MAIL_PASSWORD="password"
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS="user@hi-ho.ne.jp"
MAIL_FROM_NAME="${APP_NAME}"
（省略）
```

<li>routes/web.php の編集</li>

```php:routes/web.php
（省略）
（最後に加える）
Route::get('contact2', 'App\Http\Controllers\MailableController@index');
Route::post('contact2', 'App\Http\Controllers\MailableController@send');
```

<li>Controller の作成</li>

```bash
php artisan make:mail ContactReply
php artisan make:controller MailableController
```

```php:app/Mail/ContactReply.php
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class ContactReply extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        //以下追記
        return $this->view('emails.text')
                    ->subject('メールの標題');
    }
}
```

```php:app/Http/Controllers/MailableController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Mail;                   //追記
use App\Mail\ContactReply; //追記

class MailableController extends Controller
{
    //以下追記
    public function index() //コンタクトフォームの表示
    {
        return view('contact.index');
    }

    public function send(Request $request)  //メールの自動送信設定
    {
	    $to_address = $request['to_address'];
	error_log($to_address);

        Mail::to($to_address)
              ->send(new ContactReply());

        return back()->withInput($request->only(['name']))
                     ->with('sent', '送信完了しました。');    //送信完了を表示
    }
}
```

<li>View の作成</li>

```bash
mkdir resources/views/contact
mkdir resources/views/emails
```

```php:resources/views/contact/index.blade.php
@if ( Session::has('sent'))
<div>
    <p>{{old('name')}}さん、{{ session('sent') }}</p>
</div>
@endif

<form action="{{ url('contact2') }}" method="POST">
    @csrf

    <p>名前：<input type="text" name="name"></p>
    <p>to_address：<input type="text" name="to_address"></p>

    <input type="submit" value="送信">
</form>
```

```php:resources/views/emails/text.blade.php
emailsディレクトリのtext.blade.phpの内容です。

2023年12月19日

PM 19:53

以上。
```

<li>サーバーの起動</li>

```bash
php artisan serve
```

<li>ブラウザーで　http://127.0.0.1:8000/contact2 にアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/494fc678-4cc2-fec4-5420-4eecefffa2d3.png)

</ol>

## 確認したバージョン

```text
$ php artisan --version
Laravel Framework 10.37.3
```
【Git】push前にsquashで複数のcommitをまとめる

# はじめに
`push`する前に、`commit`分けすぎてまとめてから`push`したいときによく使う`git rebase`を使った`squash(スカッシュ)`について手順をまとめます。

ちなみに`squash(スカッシュ)` は「押しつぶす」とか「ぺちゃんこにする」という意味だそうです。
# スカッシュの手順

現状このようなコミットがあったとします。
今回は`[add]fuga`、`[add]hoge`、`[add]foobar`のコミットをまとめます。

```terminal
user1@user1noMacBook-Pro rabase-test % git log --oneline -5
04183ba (HEAD -> develop) [add]fuga
c55e5e9 [add]hoge
1e57b68 [add]foobar
af7104c Third
e0b30cc Second
```

`git rebase -i`コマンドを実行すると`vim`に切り替わり、下記のような画面をインタラクティブモードで開けるようになります。

コミットが古い順で表示されています。

まとめるには、まとめたいコミットの1番古いコミット以外を`pick`から`i`に変更します。

今回では、`[add]foobar`が**まとめたい中で1番古いコミット**なので、それ以外の`[add]hoge`、`[add]fuga`を`pick`から`s`に修正します。

```terminal:修正前
% git rebase -i HEAD~5
pick e0b30cc Second
pick af7104c Third
pick 1e57b68 [add]foobar
pick c55e5e9 [add]hoge
pick 04183ba [add]fuga

# 省略
```


```terminal:修正後
pick e0b30cc Second
pick af7104c Third
pick 1e57b68 [add]foobar
s c55e5e9 [add]hoge
s 04183ba [add]fuga

# 省略
```


保存するとコミットメッセージの画面に切り替わります。

ここではまとめた、3つのコミットメッセージが表示されています。

このままでも保存できますが、**まとめたという内容のコミットメッセージで保存すると、新たなハッシュ値で新しいコミットが作られます。**

```terminal:修正前
# This is a combination of 3 commits.
# This is the 1st commit message:

[add]foobar

# This is the commit message #2:

[add]hoge

# This is the commit message #3:

[add]fuga

# 省略
```

```terminal:修正後
# This is a combination of 3 commits.
# This is the 1st commit message:

[add]foobar+hoge+fuga

# This is the commit message #2:


# This is the commit message #3:


# 省略
```

新しいコミットメッセージで新しいコミットが作られた事が確認できます。

```ruby
% git log --oneline -5
342db33 (HEAD -> develop) [add]foobar+hoge+fuga
af7104c Third
e0b30cc Second
d4fa0b5 (master) First
```
Reactを勉強するのにタイピングゲームがお題としてちょうど良かった件

# 作ったもの

https://tech-touch-typing.vercel.app/

エンジニアが(特に記号系の)タッチタイピング練習に集中して取り組むことができるアプリがあったらいいな〜というモチベーションで作ってみました。(私がrubyネイティブなので、rubyのタイピング練習だけ実装してます)

[リポジトリ](https://github.com/terao-takumi-personal/tech-touch-typing)

# なぜタイピングゲームがちょうどいいのか
### 1)数日でできるちょうど良さ

タイピングゲームのコア機能は、ごくごく単純な機能群から成り立っています。

1. タイプした文字と画面に出ている文字が正しいか判定する機能
1. 文章を入力し終わったら、次の文章を表示させる機能
1. 入力文字数やミスった文字など、スコア関連の情報を保持し、終了時に結果を表示させる機能
2. タイマー機能
3. ゲームの流れ(開始前、ゲーム中、リザルト)を管理する機能

そして、これらを実現するのに必要なstateは全部でたかだか5,6個。このコア機能に絞ったことで、仕事終わりの時間を使って4日でリリースすることができました。(うち1日半くらいUIデザイン凝ってました^^;)

「アプリを作ろう!!」と意気込んでみたはいいものの、完成に至らずゴミ箱と化しているリポジトリに心当たりはありますか? 私はあります。

そして、そんなゴミを見るたびに完成させられなかった自分に対する若干の失望を感じ、「あまり実にならなかったなぁ」というもやもやがだけ残る...。

せっかく意欲的に勉強しているのに、こうでは勿体無いですよね。

逆に、短期間でサクッと完成させることができれば「動くプロダクトを作れた」という大きな達成感が得られますし、次に何を勉強するのかの計画も立てやすい。

そこで、今回はサクッと作ることを最優先にし、タイピングゲームをお題に個人開発を行いましたが、**MVP(Minimum Viable Product)というのは個人開発においてもモチベーション面で大いに効果を発揮する**ことを学びました。

つい要件をモリモリ足してしまって結局完成しないことが多い...という方は、グッとこらえてMVPリリースを目指してみると、気持ち良い個人開発体験ができるんじゃないかと思います^^

## 2)フロントエンドだけで完結するちょうど良さ
コア機能だけのタイピングゲームにバックエンドは必要ないので、コンポーネント化、hooksやjsx、css moduleなど、Reactの主要な機能だけに集中して学習することができます。

階層構造の設計やpropsの受け渡しなど、ごくごく基本的なところに脳みそを使ってもがき苦しむことができます。これを一足とびにバックエンドまで手を伸ばしてしまうと、結構キツいんじゃないかなと思います。**まずは一歩一歩、自分が理解して使いこなせる道具を増やしていくのが大事**ですね。

## 3)ぽつぽつ課題が出てくるちょうど良さ
私個人は、今回の個人開発で主に設計部分に課題意識というか、もやもや感が出てきました。

- cssって結局どうやって管理するのがいいんだろう...css moduleはグローバル汚染が起こらなくていいけど、さすがにcssファイル多すぎてめんどくさくなってきたな...
- state操作のための関数を孫までpropsで渡すの分かりづらくね...? まだ単純だからいいけど、複雑な構造になってきたとき「どこのstateいじってんねん!」ってなりそう...
- これまでオブジェクト指向プログラミングばかりやってきたけれど、そもそも関数型プログラミングっていうパラダイム自体よくわかってないな...

などなど。。。次に勉強するネタがほどよく集まって、そのまま新しい機能を追加するのか、課題を解消するための勉強をするのか、色々選択肢が見えてきたのがちょうどいいですね。

短期間でサクッと作るので、PDCAサイクルが速く、すぐに次のアクションを計画できるのがよいです。

# ただ、全員におすすめできるわけではない...
Reactを実際に触ってみて、結構ハードルの高さを感じました。個人の技術力によっては、シンプルなタイピングゲームでも重たい可能性があります。

## javascriptの基礎知識は必須
よく初学者がReactに手を出すなと言われていますが、私も同感で、jqueryで手続き的にDOMを操作するコードを書いたことがある程度のレベルではReactは早すぎる気がします。

『独習 JavaScript』くらいの内容は頭に入れておかないと、Reactの良さやシンプルさに感動できず、ただただハードモード版javascriptに感じてしまう可能性があるので、基礎に不安を感じる人にはReactのタイピングゲーム開発をおすすめはできないです。

## いきなり触る前にオンライン講座をやっておくのが吉
jsライブラリに触れるのが初めてなのであればなおのこと、事前に基本的な機能の学習をしておくと良いです。慣れている人だとドキュメントを読んで「ふ〜ん」となった次の瞬間から実装できると思いますが、そうでないのならマストで基本の勉強はやっておくべきでしょう。

私は以下の2つのオンライン講座で勉強しました。

1)react本家のチュートリアル(日本語版もあります)
https://react.dev/learn

2)codecademyのreactコース(無料)
https://www.codecademy.com/enrolled/courses/react-101

1については、~~クラス記法で記述されているため若干の古さを感じます。functional componentが基本になってきているので~~...。[編集]いつのまにかfunctional componentで書き直されていました。なので、チュートリアルとしては良さげです。

2については、英語ではありますが非常に分かりやすく良いコースでした。まあ英語でなくてもゴロゴロ無料の講座は転がっているので無理にやる必要は全く無いです。

あとは、next.jsを使ってvercelにサクッと(無料で!!)デプロイするために、next.jsの公式ドキュメントをさらーっと流し読みしています。

# まとめ
1. 学習のための個人開発はサクッとできるものを作るのが正義
1. 達成感が得られるし、次の学習プランも立てやすい
1. 事前学習はやったほうが無難

以上、勉強熱心なあなたの参考になれば幸いです; )
ECビジネスでD2Cがトレンドになっているワケ

こんにちは！
DX Solution部でITコンサルタントを担当しているザキです。
今回は「ECビジネスでD2Cがトレンドになっているワケ」についてご案内します。
D2CとはDirect to Consumerの略語であり、EC事業者を介さずにメーカが企画立案、生産した製品(ブランド)を消費者に直接販売する販売モデルを意味します。
そしてこの販売モデルの市場規模は2015年に13,300億円、2019年に20,000億円を超え2025年には30,000億円という予測がされております。
一般的なECサイト、B2B2CやB2Cの販売モデルとなりますが何故D2Cが台頭してきたのでしょうか？
それは単純にメーカ直販だからコストメリットがある？それも一面はありますが購入に対する消費者の変化が大きな要因となります。
消費行動は時間の経過で世代や生活スタイルの変化で行動パターンが変わってきております。勿論これらの行動パターンはすたれたわけではなくハイブリッドなケースもあります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3621490/3ec4d129-55aa-f98c-5ae9-1f12b7de0590.png)

D2Cの販売デモルに紐付く部分は「トキ消費」から「ヒト消費」になります。
いまここでしか体験できない、自分が体験したことを同世代や同じ趣味の方々に共有体験、商品やサービスのストーリに共感して消費するという行動、これらがCX(顧客行動体験)になるわけです。こうした行動変化はZ世代にも大きな影響があり「さとり世代」による欲求を求め続けておりSNSによるコミュニケーション依存も少なからず要因にも思われます。

こうしたなかでD2Cは結果から言うとコンテンツマーケティングがマッチしていることです。メーカとしての情報発信からリアル体験に近い形でイメージを提供して自分自身から共感による関連するユーザへの派生により市場規模を上げているのです。
商材の強化からコンテンツの強化への流れがこれまでのECよりも情報力を持っている強みからD2Cのポジションが飛躍的に大きくなってきているわけです。
メーカから製品やサービスの情報よりもモノ作りのストーリを通じてサステナビリティを感じてもらうことや、クチコミを超えたバーチャル体験的な情報を発信するという感じです。
こうしたファーストイメージからD2Cサイトへの醸成を進める形になります。
次はターゲティングです。
コンテンツマーケティングはこれまでEC事業者側がユーザをセグメントでまとめてプッシュマーケティング、あるいは恣意的に購入行為に対してプルマーケティングを進めてきました。
ユーザ属性は提供したコンテンツへのアクセス情報を軸にすることが重要です。
実際のCX情報からセグメントを計画するわけです。
ファーストパーティやセカンドパーティ、サードパーティに依存するマーケティングから早く脱却してCX情報を取得して計画(PDCA)する姿が次のD2Cへの挑戦になると思われます。
最後にD2Bでも同様です、実際の販売は代理店になると思いますのでD2B2Bというモデルになると思いますが製品やサービスに対してシミュレーションや代替製品、CAD情報といった情報を強化して購買担当よりも企画や設計部門の方々を視点に進めることが成功に導くストーリが台頭してくるでしょう。
pythonでBLAST検索

# インストール
```terminal
conda install biopython
pip install biopython
```

# インポート 
```python
from Bio.Blast import NCBIXML
from Bio.Blast import NCBIWWW
from Bio import SeqIO
from Bio import SearchIO
```
# 配列の読み込み
```python
filename = './protein.faa'

seq = list(SeqIO.parse(filename, "fasta"))[0].seq
```
# 実行
配列数が少ないときにはパラメーターを自動で変更する。
```python
if len(seq) < 31:
    expect = 1000
    word_size = 7
    nucl_reward = 1
    filter = None
    lcase_mask = None
    warnings.warn(
        '"SHORT_QUERY_ADJUST" is incorrectly implemented (by NCBI) for blastn.'
        " We bypass the problem by manually adjusting the search parameters."
        " Thus, results may slightly differ from web page searches.",
        BiopythonWarning)
else:
    expect = 10
    word_size = None
    nucl_reward = None

result = NCBIWWW.qblast("blastp",
                        "refseq_protein",
                        seq,
                        format_type='XML',
                        hitlist_size=50,
                        expect=expect,
                        word_size=word_size,
                        nucl_reward=nucl_reward)
```
<br>
※このままではXMLになっておらずパース出来ないため、一度XMLファイルで保存してからXMLとして読み込む。

# 結果の表示
```python
with open('result_raw.xml', 'w', encoding='UTF-8') as f:
  f.write(result.getvalue())

result_view = SearchIO.read("./result_raw.xml","blast-xml")

list(result_view)[0:5]
print(result_view[0])
print(result_view[0][0])
print(result_view[0][0][0])
```
アプリで広告収入

もし自分自身ででアプリを開発・運営する場合、
収益方法は色々ありますがその中でも広告収入についてのお話です。


```
アプリの主な収益モデル

・有料アプリ
・アプリ内課金
・サブスクリプション
・EC
★広告収入【今回はこちらのお話】
```
<br>
まずアプリ内広告で収益を上げるまでの流れですが、<br>
大まかに以下となります。


<br>

（開発・運営できるアプリが既に公開されている前提）
- 広告配信プラットフォームのアカウント開設
- 広告配信プラットフォームからSDKを取得しアプリに実装
- アプリ内に広告を貼るスペースを用意
- アプリ内で広告配信開始
- 収益を獲得（1〜3ヶ月後くらいに入金）


# 広告配信プラットフォームとは？
アプリ等に掲載できる広告の広告配信元でありその広告効果を分析できるサービスのこと。
（いわゆるインターネット上の広告代理店）
色々な種類がありますがメジャーな２種類紹介。

### 「Google AdMob」　と　「Unity Ads」　です。
```
- Google AdMob
    解説書や解説サイトも多いので初心者におすすめ。掲載できる広告が豊富。
- Unity Ads
    ゲームアプリとの親和性が高い。
```

初めての方は<b>「Google AdMob」</b>おすすめ。
効果計測・ユーザー行動分析ツールが多機能、またGoogleブランドの安心感。

アカウント登録だけでは広告掲載はできないので、
アプリへのSDKの実装が必要となります。
（一般的な広告プラットフォームはアカウント開設時に公序良俗に反してないかアプリの審査あり）
SDKについては、各サイトに導入マニュアルが用意されています。



# 広告の種類やその収益タイプ

### 主な広告配信方法

	・バナー広告
        一般的なバナー掲載

	・インタースティシャル広告
        全画面広告とも呼ばれる。アプリ内での画面遷移時に全画面表示で出る広告。

	・動画リワード　※アフィリエイト
		宣伝動画を視聴することでアプリ内で使えるポイントやアイテムを獲得できる。

	・オファーウォール広告　※アフィリエイト
		アプリで指定された別アプリをインストールやサービスの会員登録をすることでアプリ内のポイントやアイテムを獲得できる。

	・ネイティブ広告（インフィード広告）
		記事リストに紛れて出る広告（記事リスト内で題名に「AD」がついているものとか）


### 広告収益タイプ
	・成果報酬型（アフィリエイト型。掲載広告のインストールや会員登録、ECだと商品購入などで報酬）
	・クリック型広告（クリックされた回数分の報酬）
	・インプレッション型広告（表示数分の報酬）
	・純広告（広告主との直接契約。主に期間掲載など）


### 参考単価<br>
```
	・インプレッション課金型　0.1〜2円/imp
	・クリック課金型　5〜50円/click
	・アフィリエイト型課金　10円〜数万円/1件
```
※単価は配信プラットフォームや広告代理店、また配信する広告の種類でかなり差があります

## 配信する広告を考える
自分自身が開発するアプリの下記情報をもとに
どのような広告配信スタイルで行くかを決めます。

<ul>
    <li>ジャンル（ゲーム系？漫画系？ツール系？情報系？）</li>
    <li>想定ユーザー数（DL数）</li>
    <li>ターゲット層</li>
</ul>

例えば、
```
・ユーザー数やDL数が比較的多めに見込めるなら、
    →  バナー広告orインタースティシャル広告　で　インプレッション型orクリック型

・ユーザー数は少ないがコアユーザーが多いなら、
    → バナー広告orインタースティシャル広告　で　アフィリエイト型

・ゲームや漫画ジャンルのアプリなら、
    → 動画リワードやオファーウォール広告
```
など。


# まとめ
アプリ販売やアイテム課金以外でもアプリの収益化はできます。
もしご自身でアプリが開発できるのであれば、
広告収益を念頭にアプリを作ってみるのもアリではないでしょうか。
stm8のadc1で遊ぶ


目的
ADCのテスト

もとネタ

https://github.com/tenbaht/sduino/blob/development/test/adc1/adc1.c


http://stm8sdatasheet.web.fc2.com/STVD-project31-ADC/STVD-project31-ADC.html


![o_cop869.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f3dad054-dafb-13d9-9e27-28bcdab1cf8a.jpeg)



```c++


#include "Arduino.h"
#include "Serial.h"


void setup(void)
{
  Serial_begin(9600);
  Serial_println_s("ADC test");

  // configure analog pins for input
  pinMode(PB0, INPUT);

}


void loop (void)
{
  uint16_t val;

  val = analogRead(PB0);
  Serial_print_u(val);
  Serial_println();

  delay(200);
}


```
「General error: Field doesn't have a default value」は$fillableをチェック

## はじめに
MySQLでテストレコードを作るためにモデルをインスタンス化しました。

そして値を代入しようとしたところでタイトルにもあるGeneral errorエラーが出ました。

自分はモデルの$fillableプロパティを設定しなおすことで、エラーを解決することができました。

## 環境
Laravel Framework 9.52.16
MySQL 8.0.35 

## 問題
```terminal: ターミナル
> $user->messages()->create(['message' => 'エウルアたん3150', 'message_room_id' => 1]);
```

MySQLに接続して次のようにmessagesテーブルにテストレコードを作ろうとしていたところ…

```sql
> Illuminate\Database\QueryException  SQLSTATE[HY000]: General error: 1364 Field 'message_room_id' doesn't have a default value (SQL: insert into messages (message, user_id, updated_at, created_at) values (エウルアたん3150, 3, 2023-12-19 00:00:00, 2023-12-19 00:00:00)).
```

このようなエラーが出ました。

「message_room_idはデフォルトの値を持ちません」という意味だと思いましたが、

「いや今しっかり代入したやんけ！（笑）」となっていました。

## 解決法
色々調べてみた所、Messageモデルに問題があったようです。

```php: App/Models/Message.php（修正前）
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    use HasFactory;

    protected $fillable = ['message'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
```

**一括代入（mass assignment）を可能にする$fillableプロパティに漏れがあったようです。**

```php: App/Models/Message.php（修正後）
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Message extends Model
{
    use HasFactory;

    protected $fillable = ['message', 'message_room_id'];

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
```

$fillableプロパティにmessage_room_idを追加してあげることで、messageとの一括代入が可能となり、

無事にエラーが解決されました。


## $fillableで悪意ある代入を防ぐ
https://laravel.com/docs/4.2/eloquent#mass-assignment

Laravelの公式ドキュメントによれば、モデルに属性（'message'など）を制限なしに一括代入できてしまう状態は、

悪意ある一括代入を招く危険性があるとされています。

具体例については、@monji586さんが丁寧に解説されている記事をご覧ください。

https://qiita.com/monji586/items/58d91891caa51b514166

## まとめ
```sql
> Illuminate\Database\QueryException  SQLSTATE[HY000]: General error: 1364 Field 'message_room_id' doesn't have a default value (SQL: insert into messages (message, user_id, updated_at, created_at) values (エウルアたん3150, 3, 2023-12-19 00:00:00, 2023-12-19 00:00:00)).
```
エラー文だけでは該当箇所がどこか分かりにくい部分がありました。

しかし、今後一括代入する時はしっかりと$fillableプロパティをチェックします！！
re:invent2023で発表されたAmazon DataZone AI recommendationsについて調べてみた

# はじめに
この記事は株式会社ナレッジコミュニケーションが運営する [クラウド AI by ナレコム Advent Calendar 2023](https://qiita.com/advent-calendar/2023/knowcom-cloudai)の20日目にあたる記事になります。

この記事では、先日ラスベガスで行われた AWS re:Invent 2023 で発表されたAmazon DataZone AI recommendationsについて調べた内容を紹介します。
# その前に
#### Amazon DataZoneとは
Amazon DataZoneは、AWSが提供するデータ管理サービスの一つです。AWS、オンプレミス、およびサードパーティのソース全体に保存されているデータを迅速かつ簡単にカタログ化、発見、共有、管理ができるようになります。
2023年10月に一般公開されたサービスとなっております。12月現在は、以下のリージョンで利用ができます。

| リージョン名 |
|:-----------|
| 米国東部 (オハイオ)       |
| 米国東部 (バージニア北部)    | 
|米国西部 (オレゴン)      | 
| アジアパシフィック (シンガポール)       |
| アジアパシフィック (シドニー)      | 
| アジアパシフィック (東京)  | 
| カナダ (中部)  |
| 欧州 (フランクフルト)  |
| 欧州 (アイルランド)  |
| 欧州 (ストックホルム) |
| 南米 (サンパウロ)|

#### データのカタログ化とは
データのカタログ化は、データを整理し検索や利用が容易になるようにするプロセスです。データセットにカテゴリ毎にタグが付けられていたり、他の結びつけによりグループ化されていたり、フリーワード検索できるようになっています。これらの情報をデータに付与するのは、データノウハウを知っているデータオーナーなどが手作業で実施しています。

# Amazon DataZone AI recommendationsについて

Amazon DataZone AI recommendationsAmazonは、 Amazon DataZoneの機能の一つで、AIを用いてビジネスデータの説明とコンテキストを生成し、分析ユースケースに関する推奨事項を提供します。これにより、データオーナーは、データに情報を付与する手間を軽減でき、データの利用者は、データオーナーからの情報付与を待たずに、分析に必要なデータテーブルと列を特定することができます。現在は、以下のリージョンでプレビュー利用ができるようになっています。

| リージョン名 |
|:-----------|
| 米国東部 (バージニア北部)    | 
|米国西部 (オレゴン)      | 

# まとめ
いかがだったでしょうか。
蓄積データの説明をAIが自動で付与してくれることで、データの民主化のハードルが更に下がってきていると感じる素晴らしいアップデート機能ではないでしょうか。
現在は、特定のリージョンのみなので、東京リージョンへの対応、日本語対応が待ち遠しいですね。最後まで読んでいただきありがとうございました。

また、ナレッジコミュニケーションでは「[Musubite](https://musubite-job.com/)」というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成 AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！
 
https://recruiting.musubite-job.com/features/company/knowledge-communication
 

# 参考資料
本記事執筆に当たり、以下の記事（URL）を参考にさせていただきました。ありがとうございます。

https://aws.amazon.com/jp/about-aws/whats-new/2023/10/amazon-datazone-generally-available/

https://aws.amazon.com/jp/about-aws/whats-new/2023/11/ai-descriptions-amazon-datazone-preview/

https://www.open-governmentdata.org/whats/

https://speakerdeck.com/yamamoto7/detakatarogudao-ru-niokeruke-ti-todui-ying-shi-li?slide=26
robocopyでお手軽バックアップ

# やりたいこと
エクスプローラーでいちいちファイルをコピーするの面倒！
ワンアクションでバックアップを取りたい。

# 環境

- windows10
- windows11

# 1.batファイルを書く
windowsにはrobocopyという便利なコマンドとバッチファイルという便利な機能がありましてですね…

```shell
robocopy コピー元パス コピー先パス オプション…

<例>
robocopy C:\Users\hoge\kura D:\kura /MIR 
```
- /MIR・・・指定したパスの中身を完璧にコピーします。

とりあえずこれで動きます。
書いたら拡張子を.batにして保存しましょう。

# 2.起動

ダブルクリックで起動
動かない場合は、先ほど入力したコマンドをコマンドプロンプトにコピペしてみましょう。

# ひとこと
常にPCバックアップ用ドライブが接続されている場合は、スタートアップにこれを登録しておくと便利でしょう。
こまめにこれを起動することを忘れないように。**バックアップ忘れてた時に限ってデータ消滅イベントが発生します。**
Redux Sagaのgenerate関数をuseEffectで呼びたい

# はじめに

Reduxで使っていた関数をコンポーネント側で利用したかったのですが、時間がかかったので書いておきます

# 問題

以下のような関数があるとします

```ts:saga.ts
export function* fetchUsers() {
  console.log("Helllo")
}
```

この関数を`useEffect`の中で呼びたいと思い以下のように書きました

```ts
useEffect(() => {
  call(fetchUsers)
}
```

しかし、useEffectは動いているのに**fetchUsers**は動いていませんでした

# 解決方法

Redux Sagaではジェネレーター関数は`dispatch`で呼ぶしかなさそうでした

ということでアクションを作成して呼び出すことでうまく行きました

```ts
useEffect(() => {
  dispatch(fetchUsers())
}
```

# おわりに

Reduxは初心者にとってはなかなか複雑だなと思いました
引き続き頑張りたいです
Snowflakeで日時の増減の関数がSQLプッシュバックする

SPSS Modeler18.5の新機能のdate_add_XX および time_add_XXの [日時関数](https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=reference-date-time-functions)で、年月日時分秒の増減のSQLプッシュバックが可能になりました。

Modeler18.4以前でもDB2などでは、DB関数を使ってSQLプッシュバックさせるという回避策がありましたが、Snowflakeではその回避策が無効でした。

この記事ではdate_add_XX および time_add_XXが、SnowflakeでもSQLプッシュバックが実行可能であることを確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/7fba1e8e-3e25-9eef-4e9b-76fd059c6a50.png)
    
* テスト環境
    * Windows 11 64bit
    * Modeler 18.5
    * Snowflake ODBC ドライバー 2.25.2

# 元データ
以下のDATE型、TIMESTAMP型を持つテーブルをSnowflake上に準備しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/9830e628-8b4d-8447-3178-5e2e586a55ae.png)

# time_add_seconds
time_add_seconds(40,@FIELD)でTIMESTAMP列に40秒加算します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/e1eb6158-2251-65f7-45df-0a30a15763cd.png)

以下のように{fn TIMESTAMPADD(SECOND,40,T0.TS)}という関数に変換されました。
```sql
[2023-12-19 19:32:20] SQL をプレビュー中: 
SELECT T0."INT" AS "INT",T0."FLOAT" AS "FLOAT",T0.STR AS STR,T0."DATE" AS "DATE",T0.TS AS TS,T0."TIME" AS "TIME",
({fn TIMESTAMPADD(SECOND,40,T0.TS)}) AS "TS_Derive" 
FROM SFTESTS.TYPETEST T0
```

結果をみると、40秒分、増えていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/480fd6c1-b6b5-48c5-3e40-fd52d046a671.png)

# date_add_days
date_add_days(15, @FIELD)で、DATE列とTIMESTAMP列に15日加算します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c49159b7-257a-20d7-f479-188555b5957d.png)

以下のように、それぞれ
DATEADD(DAY,15,T0."DATE") 
({fn TIMESTAMPADD(DAY,15,T0.TS)}) 
という関数に変換されました。
```sql
2023-12-19 19:38:09] SQL をプレビュー中: 
SELECT T0."INT" AS "INT",T0."FLOAT" AS "FLOAT",T0.STR AS STR,T0."DATE" AS "DATE",T0.TS AS TS,T0."TIME" AS "TIME",
DATEADD(DAY,15,T0."DATE") AS "DATE_Derive",
({fn TIMESTAMPADD(DAY,15,T0.TS)}) AS "TS_Derive" 
FROM SFTESTS.TYPETEST T0
```

結果をみると、15日分、増えていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/480fd6c1-b6b5-48c5-3e40-fd52d046a671.png)

# 参考
#### 日付および時刻の関数 - IBM Documentation 
https://www.ibm.com/docs/ja/spss-modeler/18.5.0?topic=reference-date-time-functions

#### DATEADD | Snowflake Documentation 
https://docs.snowflake.com/ja/sql-reference/functions/dateadd

#### TIMESTAMPADD | Snowflake Documentation 
https://docs.snowflake.com/ja/sql-reference/functions/timestampadd

#### SPSS Modeler 18.5リリース #SPSS - Qiita 
https://qiita.com/kawada2017/items/b619d5e3db8bb1ff816e

#### SPSS ModelerからSnowflakeに接続する（Nativeドライバー）
https://qiita.com/kawada2017/items/74d1e6772cb2435bc179
ROS仮想ジョイスティック使用方法

ROS仮想ジョイスティックパッケージの使用方法.
手元にジョイスティックが無いときに便利?
本家のリポジトリは`noetic`バージョンのものがなかったので，PRされている`noetic`対応されているリポジトリのものを使用しました．

# 環境

```
ubuntu 20.04
ros noetic
```

# インストール

```
git clone https://github.com/mnh-jansson/rqt_virtual_joystick -b noetic-devel
cd rqt_virtual_joystick 
catkin build
```

# 実行方法

```
rosrun rqt_virtual_joy rqt_virtual_joy
```

# 実行結果

![Peek 2023-12-19 19-42.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/8bf9733c-8fc0-33fd-450f-c041c93f167f.gif)