OmniAICreator/Qiita-1.07M huggingface dataset:
【Publisher】Spreadsheet with Chart

# Introduction #
This time, I will convert an Excel report with charts into a web-based spreadsheet. Here is how the converted spreadsheet looks:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/3f18482e-b500-96b1-c87f-ddc433f4b893.png)
Now, let's review the steps.
[Related Article](https://qiita.com/Miki_Yokohata/items/51c6d0c48e3ff172a3ac)
# Excel Worksheet #
I created three tables using Sharperlight table formulas with SAP Business One. The first table is defined in Cell B5 and pulls sales information.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/22ae69d8-7d6d-f3c7-b85b-653a78ef0b63.png)
The second formula is in Cell M5 and pulls purchase information, while the third formula is in Cell D22 to retrieve sales items data.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9abf916c-dcb3-c70b-a414-50f2efacd961.png)
Each table is accompanied by its own chart. The queries and the extracted data in the tables are managed using the Sharperlight Excel Add-in, and the charts are created using Excel's standard chart options.

# Converting to Web Spreadsheet #
I convert it to a web spreadsheet as a published report, making it accessible over the intranet or other networks where the Sharperlight Service is configured.

Select **Publish Workbook** icon from the Sharperlight ribbon.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/9fd93c02-9431-baff-9100-ea35f9edaaa0.png)
A new published report dialog is open, give appropriate **Code**, **Group** and **Title**, and click `OK` to save it as a published report. 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/76b730c3-4d88-672d-87d2-0eda97a17315.png)
The published report will be saved in the local Sharperlight if you are using a local connection, or in the remote Sharperlight if you are using a remote connection. Start the Sharperlight service you are using and navigate to the URL of the recently published report, as shown below.
```
http(s)://{server name}/{Sharperlight Service Code is here}Rest/Report/?query={Group}.{Code}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/5be9d31c-8339-e2fc-0d47-bcf345cd243b.png)

# Conclusion #
It can be utilized in various ways, such as sharing useful reports stored on individual employees' computers within the company, or centrally managing multiple similar reports. Give it a try.
【Nerves】i2cのクロックを400KHzに変更する方法

# はじめに

Nervesではデフォルトでi2cが使えるようになっていますが、このクロックは100KHzでした。
Raspberry Piのデフォルトでもあるようです。

このクロックを変更する方法を記述しておきます。

# Raspberry pi　OSの場合

config.txtに次のような記述をすればよいらしい。
```
dtparam=i2c_arm=on,i2c_arm_baudrate=400000
```

# Nervesの場合

次の記述をconfig.exsに追加する

```config.exs
config :nerves, :firmware,
  fwup_conf: "config/fwup.conf"

```

ターゲットに合った、fwup.confをconfigディレクトリにコピーする。
rpi0の場合、次のファイル。

```bash
cp deps/nerves_system_rpi0/fwup.conf config
```

fwup.confのconfig.txtに関する部分を次のように書き換える
```fwup.conf
file-resource config.txt {
    host-path = "${NERVES_APP}/config/config.txt"
}
```

ターゲットに合った、config.txtをconfigディレクトリにコピーする。
```bash
cp deps/nerves_system_rpi0/config.txt config
```

config.txtのi2c_arm=onの行に、,i2c_arm_baudrate=400000を追加する

```config.txt
dtparam=i2c_arm=on,i2c_arm_baudrate=400000
```

ファームウエアをビルドして起動すれば設定したクロックが反映されるはずです。

うまく行かなかった場合は、起動したNervesでcat "/boot/config.txt"を実行して設定が反映されてるか確認してみるとよいと思います。
反映されてない場合は、上記の何処かが抜けている可能性があるかとおもいます。

device treeを理解して特別な記述がいるのかもとヒヤヒヤしたんですが、config.txtの変更で対応できました。

i2cの規格では400KHzが上限だったと思うのですが、1MHzにしてみても設定できて動作しました。
プルアップ抵抗なので、これくらいが限界かも。


![DS1Z_QuickPrint1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/17962041-b81c-56b1-d3df-cec0b370e4aa.png)

# 参考

https://hexdocs.pm/nerves/advanced-configuration.html#target-specific-configuration
ubuntu 24.04 LTSで自宅サーバー構築（バーチャルホストの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/sites-available/virtual.host.conf
#新規作成
#バーチャルホストのドメインの設定
<VirtualHost *:80>
    DocumentRoot /var/www/virtual.host
    ServerName www.virtual.host
    ServerAdmin webmaster@virtual.host
    ErrorLog /var/log/apache2/virtual.host.error.log
    CustomLog /var/log/apache2/virtual.host.access.log combined
</VirtualHost>
taisuke@ubuntuserver:~$ sudo a2ensite virtual.host
Enabling site virtual.host.
To activate the new configuration, you need to run:
テストページを作成して動作確認をします。任意のクライアントコンピューターで Web ブラウザーを起動し、作成したテストページにアクセスできれば OK です。
taisuke@ubuntuserver:~$ sudo mkdir /var/www/virtual.host
taisuke@ubuntuserver:~$ sudo vi /var/www/virtual.host/index.html
<html>
<body>
<p style="width: 100%; font-size: 40px; font-weight: bold; text-align: center;">
Virtual Host Test Page
</p>
</body>
</html>

![virtualHost.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/7aa9227e-9f4a-8c39-5908-172d0a657dce.jpeg)
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
ubuntu 24.04 LTSで自宅サーバー構築（日本語環境の設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install language-pack-ja-base language-pack-ja

taisuke@ubuntuserver:~$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"

taisuke@ubuntuserver:~$ sudo source /etc/default/locale

taisuke@ubuntuserver:~$ sudo echo $LANG
#変更された

ja_JP.UTF-8 
#任意のコマンド実行
taisuke@ubuntuserver:~$ sudo passwd   
新しいパスワード:
#日本語になっている
新しいパスワードを再入力してください:   
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
Homebrewを使用してMySQL/MariaDBをインストールした際発生したエラーへの対処メモ

# はじめに
M1 MacでMySQLを使用するためにHomebrewでインストールを試みたところ、起動・設定時に何やらエラーが発生したのでメモ。
最初にMySQLをインストールし、MariaDBに変更を試みましたが、こちらもエラーで進まず。
エラー解決後はMySQLではなくMariaDBを使用しています。
# 環境
+ MacBook Air (M1, 2020)
+ Sonoma 14.2.1
+ Homebrew 4.3.14
# エラー内容
+ MySQLで`mysql_secure_installation`を実行
```
Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
```
+ MariaDBで`mariadb-secure-installation`を実行
```
/opt/homebrew/bin/mariadb-secure-installation: line 255: .my.cnf.49470: Read-only file system
```
おそらくsocketが見つからない、my.confファイルを作成できないという状況でしょうか。
# 対処
Homebrewの再インストール
# おわりに
あっけない…
かなりDB周りの設定を調べましたがどうやら的外れで、最終的にはあまりに基本的な対応で解決しました。
原因はOSのアップグレードか、Homebrew初回インストール時になにか起きたのかと推測していますが、本当のところはわかりません。
どこにも対処方法を見つけられなかったので、いつか誰かの役に立てば幸いです。
# 参考 
### Homebrew再インストール、MariaDBインストール時お世話になった記事
+ Homebrewの再インストール
[【簡単】MacでHomebrewをインストール、アンインストールする方法](https://ralacode.com/blog/post/install-uninstall-homebrew)
+ MariaDBのインストールと初期設定
[macOSでMariaDB](https://qiita.com/ynack/items/4709b77d42847823cdb3)
【GitHub】Quick setup のスクリプトは表示されなくなりました? - Xcode と GitHub の連携設定


新規にリポジトリ作成したときに、

こういうの表示されてませんでした?

![1655335809985.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588914/3ab9d347-13a0-f8f0-d2d6-d1b8627345e9.png)

```shell
// ... or create a new repository on the command line

echo "# sample" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/your-account/sample.git
pit push -u origin main
```

```shell
// ... or push an existing repository from the command line

git remote add origin https://github.com/your-account/sample.git
git branch -M main
git push -u orign main
```

どうしたらいいのか困りましたので探しておきました。

Xcode から上記コマンド同様の処理もGUIのみでできる雰囲気です。

詳細は以下から。

https://android.benigumo.com/20240813/connect-xcode-github/

https://x.com/maochanz/status/1823233292168298559
大手パブリッククラウドの資格取得その１

## はじめに
会社の方針でAWSおよびAzureの資格取得が必要になったので勉強法やスケジュール感などを記載していきます。

## 取得予定の資格
AWS Certified Cloud Practitioner
AWS Certified Solutions Architect - Associate 
Microsoft Certified Azure Fundamentals

## 筆者のスペック
インフラ経験：設計、インフラ構築、試験、運用を10年以上経験
クラウドの経験：パブリッククラウド未経験
取得している資格：基本情報処理、応用情報処理

## 受講計画
ひとまず筆者が興味をもっていたAWSの最も下位の資格のAWS Certified Cloud Practitionerから取得することにしました。
[AWSのＨＰ](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/?ch=sec&sec=rmg&d=1)を確認するとCloud Practitionerは
>AWS Certified Cloud Practitioner は、AWS プラットフォームの基本的な知識をお持ちの方を対象としています。この試験を受ける前に、以下のことをお勧めします。
・AWS クラウドに 6 ヶ月間触れている
・IT サービスのベーシックな知識と、AWS クラウドプラットフォームにおけるそれらのサービスの使用に関するベーシックな知識がある
・AWS のコアサービスとユースケース、課金、料金モデル、セキュリティコンセプト、クラウドがビジネスに与える影響についての知識がある
>
となっている。
当然AWSなんて触ったことがないのでハンズオン等の勉強も必要かと覚悟しましたが実際はオンプレの知識をベースに座学のみで資格の取得は可能でした。

## 勉強方法
まずは公式が用意している学習サイトで勉強しました。
[AWS Cloud Practitioner Essentials (Second Edition) (Japanese)](https://www.aws.training/Details/Curriculum?id=34408&redirect=false)

このサイトからクラウドを自分が持ってるオンプレの知識に変換して勉強するところの優先順位を決めました。
ざっくり、「クラウドの概念、AWS のサービス、セキュリティ、アーキテクチャ、料金、サポート」から構成されてますが、クラウドの概念とかセキュリティ、アーキテクチャはオンプレベースで理解できた一方、AWS のサービスとか料金は全然しらなかったのでここでポイントを絞って勉強していきました。

次にUdemyで自分の知識を確認していきました。全6回すべて合格するまでひたすら繰り返して勉強しました。
[【CLF-C02版】この問題だけで合格可能！AWS 認定クラウドプラクティショナー模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-4260/)

大体３週間勉強して試験に臨みました。試験会場はピアソンVUEで受講しました。

## 結果
まあまあギリギリな感じですが合格しました。というかもう２年前だ…。
所感としてはUdemyを６回分合格できれば何とかなる！って感じでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693852/53f25838-b9ad-77e0-6d4a-d041907af8ad.png)

## まとめ
オンプレの知識をベースに知らないことを補強することで全然いけた印象。まあ、Practitionerなんでそんな感じでリラックスして受ければいいかと思います。
このノリで次にAzure設けてみようと思ってAZ-900にトライしました。その話はその２で。
Nextjs14のServerActionsの返り値がundefinedになる。

# 現象

nextjs14のserver actionsを利用して、データをやり取りする際に、サーバーからの返り値が`undefined`となってしまう。

# 原因

middlewareの中でrequestを書き換えていたためにリクエストヘッダーの形式が変化していた。当たり前といえば当たり前ですが、server actionsを呼ぶ際にもmiddlewareを通過しますので、注意が必要です。

# 解決策

middlewareにおいて、POSTメソッドが呼ばれる際にはそのままのリクエスト情報を流すようにしました。
server actionsは、POST methodで扱われるようです。

``` js:middleware.ts

export async function middleware(request: NextRequest) {
    const response = NextResponse.next();
    console.log('middleware.ts called', request.method);

    // server component用のpathnameセット
    const headers = new Headers(request.headers);
    headers.set('pathname', request.nextUrl.pathname);

    // 認証情報CK
    const authenticated = true;

    // 認証されている場合
    if (authenticated) {
        if (request.method === 'POST') return NextResponse.next();
        else if (request.method === 'GET') return NextResponse.next({ headers });
    }

    // 認証されていない場合リダイレクト
    return NextResponse.redirect(new URL('/login', request.url));
}

```

# まとめ

server actionsは、とても便利な機能ですが、内部でどのように処理されているのかが不透明なので、トラブル時の解析がしづらかったです。
servera actionsではまった人は一度middlewareが悪さしていないか確認してみてください。
「Perplexity AIの業務活用完全制覇：初心者から専門家まですべての人のためのヒント！」

【Perplexity AI 業務活用 完全ガイド：最強の情報収集・分析ツールを使いこなす】

本書は、革新的な AI 検索プラットフォーム「Perplexity AI」の 業務活用法を詳細に解説した実用書です。従来の検索エンジンや他の生成型 AI サービスとは一線を画す Perplexity AI の特徴を理解し、ビジネスや学習、日常生活での効果的な活用方法を学ぶことができます。

Perplexity AI は、AI による情報生成と実時間のウェブ検索を組み合わせた革新的なプラットフォームです。本書では、その多様な検索オプション（全て、学術、数学、作成、ビデオ、ソーシャル）や高度な AI モデル（Claude 3.5 Sonnet、Sonar Large、GPT-4o, Llama 3.1 405B）の特徴と使い分け方を詳しく解説します。

Perplexity AI の強みは、単なる検索結果の羅列ではなく、ユーザーの質問に対して直接的で包括的な回答を提供する点にあります。本書では、この特徴を活かした効果的な質問の仕方や、得られた情報の活用法についても具体的に説明しています。

特に注目すべきは、Perplexity Pro の「Pro Search」機能です。本書では、この有料サービスが他の生成型 AI の有料サービスを利用する必要がないほどの高い性能を持つことを詳しく解説しています。マルチステップ推論、高度な数学・プログラミング能力、より深い検索と分析、リアルタイムデータアクセス、多言語サポートなど、Pro Search の優れた機能を最大限に活用する方法を学べます。

■ こんな方におすすめ

ビジネスパーソン：市場調査、競合分析、戦略立案に活用したい方
研究者・学生：学術情報の効率的な収集と分析に興味がある方
語学学習者：AI を活用した効果的な学習方法を知りたい方
IT プロフェッショナル：最新の AI 技術とその応用に関心がある方
一般ユーザー：日常生活での情報収集や問題解決に AI を活用したい方

https://bit.ly/4dF1Tvb
ubuntu 24.04 LTSで自宅サーバー構築（NetDataの設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
taisuke@ubuntuserver:~$ sudo apt -y install netdata
taisuke@ubuntuserver:~$ sudo vi /etc/netdata/netdata.conf
#19行目 : 自身の内部 IP アドレスに変更 (内部の他ホストからも参照可能にする)
bind socket to IP = 192.168.3.0/24
#HTTPS を有効にする場合は以下を追記
[web]
        ssl key = /etc/netdata/privkey.pem
        ssl certificate = /etc/netdata/fullchain.pem
        tls version = 1.3
taisuke@ubuntuserver:~$ sudo cp /etc/letsencrypt/live/ご自身のサーバーのドメイン名/{privkey.pem,fullchain.pem} /etc/netdata/
taisuke@ubuntuserver:~$ sudo chown netdata /etc/netdata/*.pem
taisuke@ubuntuserver:~$ sudo systemctl restart netdata
設定した IP アドレスにアクセス可能な任意のクライアントコンピューターで Web ブラウザーを起動し [(サーバーのホスト名 または IP アドレス):19999/] にアクセスします。すると NetData のサイトが表示され、システムリソースをリアルタイムで閲覧できます。
![netdata.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/17470b65-27bc-36c3-91dd-34079444107f.jpeg)
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
IT企業でマーケターが構築すべきエンジニアとの関係性とは

## マーケティングの役割とエンジニアの役割の関係性
**はじめに**
IT業界のマーケティングを考えていく上で顧客以外に意識しなければいけない存在があります。それがエンジニアです。IT企業でのマーケターとエンジニアには共通点があります。その共通点を理解してお互いに協業していくことでより良いサービスや製品の実現につながります。まずはそれぞれの役割を理解した上で、目指すべき共通のゴールについて考えていきましょう。

# IT業界におけるマーケターとエンジニアの役割

**マーケティングの役割**
IT業界におけるマーケティングの役割とは、「製品やサービスの価値を顧客に届ける」ことです。マーケティングの役割は宣伝やイベントを行うことだけではありません。顧客に製品やサービスの価値を理解してもらい、それを届け、実際に価値を感じてもらうところまでがマーケティングの役割です。
IT業界と一言で言っても、扱っている製品やサービスは様々です。しかし、どのような製品やサービスであったとしても、マーケティングはその製品やサービスの価値を顧客に届けることが役割であるという点に変わりはありません。

**エンジニアの役割**
IT業界におけるエンジニアの役割とは、単に「技術を使って製品やサービスを開発する」ことではありません。製品やサービスに顧客が求める価値を作り込むのがエンジニアの役割です。
本当に優秀なエンジニアは単に技術に詳しいだけでなく、顧客が求める価値をしっかりととらえ、どのように製品やサービスとして実装できるかを設計できます。


製品やサービスに価値を作り込んでいくのがエンジニアの役割で、顧客にその価値を伝え、価値を手に入れる動機付けをし、実際に価値を顧客に届けるのがマーケティングの役割です。方向は違うだけで、顧客と製品やサービスの間の価値のやり取りを行っているのが、マーケターとエンジニアです。

マーケターとエンジニアが一緒になって顧客に価値を届けるための関係性を作り上げていくことが重要になってくるでしょう。

## マーケター、エンジニア間のコミュニケーション

皆さんは日常的にコミュニケーションをとって情報交換を十分にしていますでしょうか。

製品のコンセプトや機能をまとめられた資料からのみ情報を得ているケースあります。そのような状況では、エンジニアがどのような意図で製品やサービスの機能を作っているかを見落としてしまう可能性があります。

お互いに顧客への価値を届けるために、お互いの「意図」を理解する必要があります。

マーケターとエンジニアでは関心事に違いがあります。その違いを理解した上でお互いの理解に繋げていきましょう。

## お互いの関心事の違い

一般的にマーケターの関心事は「売上」にあり、エンジニアの関心事は製品やサービスの「質」とそれを作るための「効率」にあります。表面的な視点からお互いの役割を見れば、お互い「関心のないことをやっている人たち」という認識を持ってしまうかもしれません。

しかし、この関心事について一歩踏み込んで考えれば、マーケターが考える「売上」は顧客に製品やサービスの価値を届けたことに対する対価であり、エンジニアの考える「質」は顧客が求める価値を製品やサービスとしてどれくらい実現できているかであり、「効率」は価値を提供するためのコストを抑える努力です。つまり、別のものを見ているようで、お互い顧客にとっての価値に関心を持っているのです。

そこに気づかず誤解してしまうと、お互い「興味ないことをしている人」という結果になってしまうのです。逆にいえば、お互いの役割を理解し興味を持つことができれば、マーケターとエンジニアの距離感は縮めることができます。

マーケターとエンジニアが「顧客が求める価値」という同じ関心事を持っていることを理解してもらえれば、相互理解も深まります。

## 参考文献
新村剛史(2022) . 『現場の事例で学ぶ！IT企業のためのBtoBマーケティング 技術・製品・サービスの魅力を確実に伝える方法』 . 翔泳社
便利なrailsのTips

# はじめに
業務の中でためになったことを雑にまとめたものです。

# コンテンツ

### whereの条件を反転
`invert_where`でスコープの条件の反転ができる。
注意点があるので複雑な条件の時は発行されるSQLを確認したほうがいい。

https://pocke.hatenablog.com/entry/2021/04/28/233930

```ruby:sample.rb
class User
  scope :enabled, -> { where(enabled: true) }
end

User.enabled
# enabled = falseを抽出できる
User.enabled.invert_where
```

### Hash値およびキーワード引数の省略記法
Ruby 3.1から。
下記のように、同じ名前で変数名を定義すれば省略ができる。

```ruby:sample.rb
dataA = "test"
dataB = "test2"
Model.where(dataA:, dataB:)
```

### 複数のデータを大量に保存する処理の時
`activerecord-import`というgemを入れてあれば、下記のように`import`を使ってパフォーマンスよく書ける。

```ruby:sample.rb
tests = []
10.times do |i|
  tests << Test.new(name: "name_#{i}")
end

Test.import tests
```


### あるテーブルのレコードのなかから最大値を取得

```ruby:sample.rb
Model.maximum(:created_at)
```

条件を加えることもできる。

```ruby:sample.rb
Model.where(flg: false).maximum(:created_at)
```

### 指定したテーブルに関連がないレコードのみを取得

relationが設定されていること前提です。
下記ではrelation_tableに登録のないModelのレコードを全て取得する。

```ruby:sample.rb
Model.where.missing(:relation_table)
```

反対に関連があるものだけ取得したいときはjoinを使えば良い。

```ruby:sample.rb
Model.join(:relation_table)
```

### 主キーのカラムデータを配列として取得

特定の条件に当てはまるレコード全てに対して何か処理を行う時などにパフォーマンスを考慮して使ったりする。

```ruby:sample.rb
Model.ids
```

### 条件に応じてどちらかの値を返したい時

```ruby:sample.rb
ret = (i > 0) ? i : 0
ret = [i, 0].max
```

### カラム名でfind_by検索

下記の２パターンの書き方ができる。

```ruby:sample.rb
find_by_name("テスト")
find_by(name: "テスト")
```

### ハッシュから値を取り出す方法
下記のように書くことで、キーが存在しない場合のデフォルトの返却値を設定することができ、エラーを回避できる。

```ruby:sample.rb
hash = {1 => 'a', 2 => 'b', 3 => 'c'}

# キーが存在するのでbがかえる
value = hash.fetch(2, 0)
# キーが存在しないので0がかえる
value = hash.fetch(4, 0)
```

### ハッシュを合体する方法

下記のように書くことで、キーが重複する場合の処理を指定できる。

もし、keyが重複していた場合は、A_val（sampleAのvalue）　+ B_val（sampleBのvalue）の値を返すようにする。

```ruby:sample.rb
sampleA = { a: 1, b: 2, c: 3 }
sampleB = { b: 3, c: 4, d: 5 }

result = sampleA.merge(sampleB) { |key, A_val, B_val| A_val + B_val }

```

### 自由にページを増やせる
コントローラーのアクションを増やさなくても、下記のように書けば、showアクションひとつのみで複数ページを設定できる。（静的ページを表示するだけのviewだけ増やしたい時に有効）

```ruby:sample.rb
class TestController < AplicationController
  def index
  end

  def show
    render template: "test/#{params[:keyword]}"
  end
end

```

```ruby:route.rb
namespace :test do
  get "/", action: "index"
  get "/:keyword", action: "show"
end

```

### flattenを使う
配列を取得したいとき、取得結果が多次元配列の時、eachなどを使って配列にする操作をしなくても、flattenを使えば良い。

```ruby:sample.rb
arr = [1, 2, 3, [6,8], 9]
arr.flatten
=> [1, 2, 3, 6, 8, 9]
```

### 読み込みをして、エラーのないものだけを抽出したい時
eachブロック内でエラーのチェックをして、エラー時はfalseをかえすようにする。
そうすれば、下記のように`select`で取得できる。

```ruby:sample.rb
# 2で割り切れるものを抽出する
[1, 2, 3, 4, 5, 6].select { |n| n % 2 == 0 }
# => [2, 4, 6]
```

### 既存を検索。なければ作る。すでにある場合を判定する。
find_or_initializeでOK。
重複を避けるためにすでに存在している場合を判定したい時は`persisted?`を使う。

```ruby:sample.rb
user = User.new(name: "ichiro", age: "20")

user.persisted?
# false

user.save

user.persisted?
# true

```
ubuntu 24.04 LTSで自宅サーバー構築（SSL/TLS の設定）

<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
SSL/TLSの設定の前に
https://qiita.com/sqoot610/items/e2a7b3ba8fa30df42d6f
を設定してください。
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/sites-available/default-ssl.conf
#2行目 : 管理者アドレス変更
ServerAdmin ご自身のサーバーの管理者メールアドレス
#31,32行目 : [1] で取得した証明書に変更
SSLCertificateFile      /etc/letsencrypt/live/ご自身のサーバーのドメイン名/cert.pem
SSLCertificateKeyFile   /etc/letsencrypt/live/ご自身のサーバーのドメイン名/privkey.pem
#41行目 : コメント解除して [1] で取得したチェインファイルに変更
SSLCertificateChainFile /etc/letsencrypt/live/ご自身のサーバーのドメイン名/chain.pem
taisuke@ubuntuserver:~$ sudo a2ensite default-ssl
Enabling site default-ssl.
To activate the new configuration, you need to run:
  systemctl reload apache2
taisuke@ubuntuserver:~$ sudo a2enmod ssl
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
  systemctl restart apache2
taisuke@ubuntuserver:~$ sudo systemctl restart apache2
taisuke@ubuntuserver:~$ sudo vi /etc/apache2/sites-available/virtual.host.conf
<VirtualHost *:80>
    DocumentRoot /var/www/virtual.host
    ServerName www.virtual.host
    ServerAdmin webmaster@virtual.host
    ErrorLog /var/log/apache2/virtual.host.error.log
    CustomLog /var/log/apache2/virtual.host.access.log combined
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
taisuke@ubuntuserver:~$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl restart apache2
taisuke@ubuntuserver:~$ sudo systemctl restart apache2
任意のクライアントコンピューターから Web ブラウザーでテストページに HTTPS でアクセスして、正常にページが表示されれば OK です。
![https.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3858002/dfb48e65-b1ea-fc3a-cb58-ed078dd43ff4.jpeg)
<a href="https://px.a8.net/svt/ejp?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" rel="nofollow">初期費用無料、月額990円から、高速・多機能・高安定レンタルサーバー『エックスサーバー』</a>
<amp-pixel src="https://www19.a8.net/0.gif?a8mat=3ZDGSF+2SMFEY+CO4+60OXE" layout="nodisplay"></amp-pixel>
IBM i 同士のtelnet

昔々（SNA時代）はパス・スルーという方法でIBM i 間、IBM i - ホスト3270間で端末セッションを移動できました。今もパス・スルー出来ます（と思います、やった事ないけど）が、SNAベースの通信記述を作成しないといけないので今はあまり使われないと思います。

代わりに利用できるのがIBM i 同士でのTELNETです。
※TELNETなので別なOS（Linux、etc.）にもtelnetできますか？は NG です。理由はIBM i のTELNET は正確にはTELNET5250という端末画面の制御がほかのTELNET VT100とかと異なるからです。

## IBM i OS間のTELNET

コマンドは、5250端末でサイン・オンして、

```
TELNET RMTSYS(IBMI75)
```

のようにターゲットのシステム名（TCP/IP）を指定すればOKです。

IPアドレス指定したい場合は、IBM i はちょっと特殊な指定が必要でして、

```
TELNET RMTSYS(*INTNETADR) INTNETADR('192.168.1.1') 
```

のように指定します。

上記のように実行すると、ターゲットのIBM i 上で任意の（未使用の）5250 ディスプレイの*DEVDが割当され（左記と同じジョブ名が割当され）ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b2501726-d194-0ddd-8d86-bfeb139d82e7.png)


困る、という場合は **5250 ディスプレイID（ジョブの端末名）を指定できます。**

```
TELNET RMTSYS(IBMI75) RMTVRTDSP(GOMADDSP1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/5aa35d5d-8424-5bcd-4616-9cfa3e1ef3c5.png)


## 元のシステムに戻るときは SIGNOFF コマンドだけど、ちょっとだけ注意

**元のシステムに戻るときはSIGNOFF コマンドで戻りますが、ENDCNNパラメーターを追加指定します。

```
 SIGNOFF ENDCNN(*YES) 
```

上記ようになります。もし、ENDCNN(*YES)を指定しないと、TELNET先の（例ではIBMI75のサインオン画面が表示されます。（TELNET元のIBMI74に戻りません。）

全体を図示するとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011394/b650f387-e976-154e-08f2-55511d8d926a.png)

お盆期間なので本日は軽めでした～。
Enum.slice、String.split

## slice

``Enum.slice([1, 2, 3, 4, 5], 1..3)``
>[2, 3, 4]

左から添え字を0として一致した添え字の番号から番号までを取得する

`Enum.slice([1, 2, 3, 4, 5], 1, 3)`
>[2, 3, 4]

slice/2, slice/3とあるが範囲指定の書き方が違うだけ

## split

``Enum.split([1, 2, 3, 4, 5], 2)``
> {[1, 2], [3, 4, 5]}


左からカウントした要素数をタプルで分ける

最後に
公式ドキュメントは以下

https://hexdocs.pm/elixir/1.12/Enum.html
自分の予定を教えて　初心者がスケジュール管理をLINEBotで作ってみたよ

# スケージュール管理の時間を効率化

小売業で戦略担当をしています。
自己紹介はこちら　→　https://note.com/like_briony1747/n/n3a56daba48b8

今回、機会があってLINEBotを使ってみたました。
スケージュール管理に時間をとられているため少しでも短縮したいと考え取組みました。

# 今回のゴール
せめて上司と自分のスケジュールを教えてもらえるようにしよう。

### 経緯
上司と仕事をしていく中で、よくこんな会話をします。
あれ、○月○日会議あったけ？

そういえば、取引先からアポイントがきたけど×月×日って空いていたっけ？

このようなやりとりが頻繁に交わされるたびに、紙のスケジュール表や手帳だったりパソコンのファイルで確認したりしています。

そんな動作を簡略化できないかと思い作ってみました。

# 完成品初号機
### Mekeシナリオ
![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/15a42901-4849-7dca-0061-b565823cbe76.jpeg)


LINEに日付を打ち込んでスプレッドシート内の日付列で検索し、合致した内容を返答する、合致しなかったら既定の文章を返答するように設定してあります。
日付を入れるとその日のスケジュールがわかる。



スケジュールがない場合は、『今日は休みましょう』というメッセージが返信される。
もしくは、打ち間違いたりしたときは、疲れている証拠。『今日は休みましょう』が返信されます。
つかの間の休息だー、嬉しいな。

https://x.com/6PepWVdwKJ61291/status/1822991883066630217

本当はここで癒しの言葉と画像を入れたいのに、今の自分にはそんな技術はないのでここで吐き出させて下さいな。

悔しい〜

脱線して、すみません。

スケジュールは毎週、頻繁な時は3日おきに変更案内がきます。
そのため、最新の情報にする必要があります。
その都度、手帳のスケジュールを消して書き換えたりしています。
ちょっと消す力をいれると、<font color="#00FFFF">**"ビリッ"**</font>　あっ、うわぁ！
こんなこととも、おさらばできるかな。


上司と共有してお互いのスケジュール確認もできるようにしていこうと考えております。

# 普段使用しているスケジュール管理表

ExcelファイルをGoogle　Spread　Sheetに変更してシナリオに使用
普段は、紙で使用したり、手帳に転記しています。
![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/0e9c9b8f-fc65-10e2-a18b-69a9e98c8e10.jpeg)


# 失敗例
途中でとまってしまったり
スケジュールを答えてくれないかわりに、『今日は休みましょう』と返してくれた。
失敗だけど優しいモジュール君達、ありがとう。でも、完成させるまで休めないよ〜。
![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/057b60e2-d33a-6003-f5a6-82e4a4e74358.jpeg)
接続部分で起こったエラーです。
某元エリアMGRに相談して夜な夜な解決できました。
本当にありがとうございます。:grinning:

![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/94199864-bd17-3ff2-8b1f-1b2d0e095f32.jpeg)

# 今後の目標

下記項目を段階的に導入することで、使いやすくしていく。

・日付を入力すると関係者の勤務計画をわかるようにする。
色々な部署との協力が必要なため、出勤状況がわかると便利です。
例えば日付の前にアルファベットを入れると特定の部署の出勤状況がわかるようにしたい。

・疲れたと入力した時に癒し画像を表示する。
　
・個人の名前を入力すると勤務状況もわかるようにする。
誰が、いつ出勤なのか把握でき、直接話せる機会をスケージュールに組み込む。

・会議名を入力すると日付をかえす。
何の会議がいつなのか、会議名を入れると分かるようにする。
会議体は半年先まで決まっていいるため名前が重複している場合でも複数の日付を伝える。

・スケジュールに合わせて自分の計画を自動で組む。
会議があって休めない日は決まっています。セミオートで立案してくれる機能が欲しい。

・スケジュールと数値計画を連動させる。
暦スケージュールを連動させ、予算計画を立案させる
立案に1日中費やす時があります。


そんな業務効率化を目指していきたい••

皆さま助けてくれてありがとうございました。
今後もよろしくお願いいたします。

# 追記

### LINEBotで画像を表示することに成功したシナリオ
気を取り直して、0からやり直ししました。
作成したシナリオがこちらです。

![014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/22a12df4-59fd-ca2d-9b7b-ab9c53e9b2ed.jpeg)

### 成功動画
日付を入れるとスケジュール、勤務計画を教えてくれます。
それ以外は、疲れているだろうと（個人的に判断して）、癒し画像を返してきます。
癒し画像がでてきたときは、本当に嬉しかったです。

https://x.com/i/status/1824722534555590741

### 苦労した点

とにかく、モジュールの分岐で躓きました。なかなか上手く返してくれませんでした。
最終的には下記のような単純な分岐で動くようになりました。

![015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/21a63690-84c8-c0a2-d04d-f59bcd321e74.jpeg)

## 失敗作のシナリオ

なかなか動いてくれないため、やり直した方がいいと判断したシナリオです。
![013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3831144/97950d36-5e45-d80a-f1b5-e82c4cf9c12e.jpeg)

多くの方の記事を読ませていただき、何とか完成できました。
ありがとうございます。
Enum.filter／reject／sort／uniq／drop

## filter
``f = fn x -> rem(x, 2) == 0 end``
``Enum.filter([1, 2, 3, 4, 5], f)``
>[2, 4]

if文と同義
fileterの第二引数に条件式を記述することで一致した情報を取得できる

## reject
``f = fn x -> rem(x, 2) == 0 end``
``Enum.reject([1, 2, 3, 4, 5], f)``
>[1, 3, 5]

if文のelseと同義
第二引数の条件に不一致の物を取得できる

## sort
``Enum.sort([2, 3, 1, 5, 4])``
>[1, 2, 3, 4, 5]

ソートを行う
第二引数に:descを追加することで降順に変更できる

## uniq
``Enum.uniq([1, 1, 2, 2, 3])``
>[1, 2, 3]

重複削除を行う

## drop
``Enum.drop([1, 2, 3], 1)``
>[2, 3]

指定したn番目までのデータを欠落させる


## 最後に
正確な表現については公式ドキュメントを参考にされてください

https://hexdocs.pm/elixir/1.12/Enum.html
paizaラーニングレベルアップ問題集の「Eメールアドレス」を色々な言語でやってみた

paiza×Qiita記事投稿キャンペーンということで、paizaラーニングレベルアップ問題集の[Eメールアドレス](https://paiza.jp/works/mondai/d_rank_skillcheck_archive/email_address)を色々な言語でやってみました。対象は[コードモンスター大図鑑](https://paiza.jp/code_monster)で対応している9言語です。

2024/08/24追記
Perl, Scala, Go, Swiftの4言語を追加いたしました。
- - -
###### 方針
- ローカル部$s$を受け取る。
- ドメイン$t$を受け取る。
- ローカル部とドメインから以下の構文に沿った文字列を出力する。
`s(ローカル部)@t(ドメイン)`
- - -
###### PHP
```php
<?php
	$s = trim(fgets(STDIN));
	$t = trim(fgets(STDIN));
	echo "$s@$t\n";
?>
```
- - -
###### Ruby
```rb
s = gets.chomp
t = gets.chomp
print "#{s}@#{t}\n"
```
- - -
###### Java	
```java
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.nextLine();
		String t = sc.nextLine();
  		sc.close();
		System.out.println(s + "@" + t);
	}
}
```
- - -
###### Python
```py
s = input()
t = input()
print(s + "@" + t)
```
- - -
###### C言語
```c
#include <stdio.h>
int main(void){
	char s[65];
	scanf("%s", s);
	char t[65];
	scanf("%s", t);
	printf("%s@%s\n", s, t);
	return 0;
}
```
- - -
###### C#
```cs
using System;

class Program
{
	static void Main()
	{
		string s = Console.ReadLine();
		string t = Console.ReadLine();
		Console.WriteLine(s + "@" + t);
	}
}
```
- - -
###### Javascript
```js
const lines = require("fs").readFileSync("/dev/stdin", "utf8").split("\n");
const s = lines[0];
const t = lines[1];
console.log(s + "@" + t);
```
- - -
###### C++
```cpp
#include <iostream>
using namespace std;

int main(void){
	string s;
	cin >> s;
	string t;
	cin >> t;
	cout << s << "@" << t << endl;
	return 0;
}
```
- - -
###### Kotlin
```kotlin
fun main() {
	val s = readLine()
	val t = readLine()
	println(s + "@" + t)
}
```
- - -
###### Perl
```pl
chomp(my $s = <STDIN>);
chomp(my $t = <STDIN>);
print $s , "@" , $t , "\n";
```
- - -
###### Scala
```scala
import scala.io.StdIn._

object Main extends App{
    val s = readLine()
    val t = readLine()
	println(s + "@" + t)
}
```
- - -
###### Go
```go
package main
import "fmt"
func main() {
	var s string
	fmt.Scan(&s)
	var t string
	fmt.Scan(&t)
    fmt.Println(s + "@" + t)
}
```
- - -
###### Swift
```swift
import Foundation

let s = readLine()!
let t = readLine()!
print(s + "@" + t)
```
Javaで「正規表現グループを設定してパターンの一部にマッチした文字列を取得する」の動作を確認してみた

# 概要

Javaで「正規表現グループを設定してパターンの一部にマッチした文字列を取得する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/regex/index13.html

# 実装

以下のファイルを作成しました。
```JSample13_1.java
import java.util.regex.*;

class JSample13_1{
  public static void main(String[] args){
    String regex = "(\\d{3})-(\\d{4})";
    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher("〒123-4567");
    if (m.find()){
      System.out.println(m.group());   // 123-4567
      System.out.println(m.group(0));  // 123-4567
      System.out.println(m.group(1));  // 123
      System.out.println(m.group(2));  // 4567
    }
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample13_1.java 
$ java JSample13_1 
123-4567
123-4567
123
4567
```

# まとめ

何かの役に立てばと。
職場の先輩を癒すワンコBotに取り組んでみた（未完成）

初めまして！小売業で採用担当をしているミハタといいます
採用経験は職場内でわたしがいちばん浅く、いつも仕事で困ったことがあると先輩に相談させてもらっています
先輩の名前はシエンといいます。先輩との出会いは2019年です。同年に入社したのですが、名刺交換の研修で応援に来ていた先輩と名刺を交換させてもらいました。先輩は6年前のわたしの名刺を今も取っておいてくださり、ときどき「懐かしいですね」と思い出話をしています。

シエン先輩とは一緒に出張することが多く、4時間ほどの移動中にプライベートの相談にも乗っていただくなどかなり良くしていただいています。
最近あるプロジェクトが始まって忙しい中、お世話になっている先輩のためにわたしができることはないだろうか…！と考え、デジタルツールを使って先輩のアシストをしようと思います

ちなみに、わたしはデジタルツール超初心者です。普段の仕事はExcelで関数を使うことくらい。そんなわたしの奮闘記を、備忘録としてここに残します

記念すべき1回目は、Make を使って先輩を癒すワンコBotをつくる話です
先輩は大の犬好きで、以前は一緒に暮らしていました
いまは出張が多く一緒に暮らすことはできないため日々tiktokで動画を見ているそうです


結論、完成しませんでした(´;ω;｀)
もし心優しい方がいましたら、アドバイスなどいただけたら嬉しいです


# 使用するツール
* Make
* LINE公式アカウント
* LINE Messaging API



# 実際の画面
作成したLINEBotの画面がこちらです↓

![実際画面.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/4562c26b-978c-865e-3f76-1daae57177ab.gif)

( ,,`･ω･´)ﾝﾝﾝ？　先輩を癒すワンコが一向に現れないぞ？
Make の画面を見てみるとシナリオがエラーになってました
が、なぜエラーになっているのかがわからず…
以下、作成した手順を記します

# 作成手順
Makeのシナリオ画面です

1\. LINE Messaging APIを連携する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/b18231fd-98ec-bb75-42d4-c9bfe08f3c40.png)

　モジュールの設定はこちら↓

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/dfbfdd88-3006-f593-3e7d-02bae23b900b.png)

 
 左のモジュールが公式アカウントに届くメッセージを感知し、右のモジュールがオウム返しでメッセージを送ってくれます
 すごい！自動でメッセージを送れるなんて、ちょっと様になったんじゃない？（ぬか喜び）



2\. 画像APIの連携
 今回使用したAPIはこちら
 Stanford Dogs　(URL"https://dog.ceo/dog-api/")
ランダムでワンコの画像を送ってくれます。わたしの推しはコーギーです
この記事で紹介されていました(URL"https://zenn.dev/protoout/books/public-apis-api-get/viewer/03-abcdefg#randomdog")

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/a259c514-2413-38e4-5c9a-bcbd51940988.png)

モジュールはこのように設定しました↓

![HTTP.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/2985bb96-f1f0-8daa-976b-4ec348e3d145.jpeg)


3\. LINEでワンコの画像を返信する
　いよいよ最終段階！
 
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/4e0d5a52-f1e3-8eab-7037-04128ff43b10.png)

すべてのモジュールをつないでみました
よし！LINEでメッセージを送ってみよう！（ワクワク）

…冒頭の実際の画面になりました(´;ω;｀)

Makeのシナリオをみてみると、画像を返信するLINEでエラーがでているようです
![つまづき３.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/e6f40400-78a0-5904-6b36-941db8721a0a.jpeg)

![LINEモジュールエラー.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3842443/bea1a593-eb50-1a21-a1f7-8a6cee5a9550.jpeg)

完成しませんでした(´;ω;｀)


# 学んだこと
今回の取り組みから学んだことは
* Makeを使うことでノーコードでツールを連携できて便利
* Makeの仕組みを理解しないと未完のままで終わってしまう

今回初めてMakeを使うため、いくつか記事を読ませてもらったのですが
たくさんのツールを掛け合わせることができるので、無限の使い道があると思いました。

せっかく便利なMakeを知ることができたのに、仕組みを理解できないと便利なツールは作れない。
まずは実際に手を動かして単純な動作からやってみることがいちばん大事。
完成させるために、もう一度取り組んで後日談として報告しますね！
個人的初対面、リモートでのハッカソンを乗り切る3つのTips

# この記事を書いた経緯
こんにちは、初心者学生エンジニアのyuhcanです。
6月の初ハッカソンから何回かハッカソンに出場しその際、こうしてよかったな〜と思ったり、逆にこうしておけばもっと楽だったな〜と思うことがあったのでまとめていこうと思います。
技育ハッカソンなどに一人で参加で、かつリモートで参加するような同じ学生の参考になったら嬉しいです！


# エンドポイントは決める！
ハッカソンに出場し、何を作るかを決め、いざ実装！となったときにおそらく初対面チームの場合はフロント、バックエンドを完全に分けるのではないでしょうか？（コンフリクトを避けるためなどで）

その際、このapiを叩いたときにこの処理をする、ということが決まっていないとかなりギリギリまでふんわりと進んでしまい、後からかなりめんどくさいことになります、、、(体験済み)
例えば、/api/about でGETして一覧を取得するということをフロント側の人がなんとなくであまり決めずに作成していた時、同時にバックエンドは/api/aboutで他の処理を書いていた
ということが起こってしまい後からの修正が結構めんどくさくなってしまう可能性があります。
そのようなことを避けるためにも初めから大体の設計を決めたり、また思っているだけにとどめず相談することも大事だと思います。(自分もそうだけど)

# ブランチ名などGitHubの使い方は統一する！
これ、めっちゃ大事です。
特に初めてのチーム開発の場合、今まではコミットは全部mainでそのままpushというのが大体だと思います。
しかしチーム開発でこれをすると最悪数時間の努力を全て消し去る可能性があります、、、。
なので、とりあえずの簡単な考え方としてmainにはpushしない。
mainは全てのpushの集合体で、自分はmainからブランチを切ってpushしたものを後からmainに追加する。
という考え方で進めると最悪の事故は避けられるかなと思います！
ブランチ名としては、
自分の名前/自分のやること
と統一するとブランチ名でチーム全員が何をしているかがわかるのでおすすめです！
また、以下にとりあえずこれのようなコマンドで進めれば大丈夫かなというコマンド例を書くので参考にしていただきたいです！
```
git clone リポジトリ
git pull origin main
git checkout -b 自分の名前/自分のすること
//開発する
git add .
git commit -m "開発内容"
git push origin 自分の名前/自分のすること
//プルリクエストを作ってマージする、そして次の開発
git checkout main
git pull origin main
git checkout -b 自分の名前/自分のすること
....
```
このような流れでとりあえず大丈夫かなと思います。
またこの流れはチームによって違うかもしれないので相談しながら進めてください！

# discordとgithubのリポジトリを繋げる！
おそらくチーム開発をする場合、discordで開発することが一番多いと思います。
そのときにgithub用のチャンネルを作成してチーム全員のcommitを通知で確認できるようになるとかなり便利だと思います！
なので以下からはその導入方法を解説していきます！
また、これはチャンネルの管理者権限でないと設定できないのでそこは注意してください。

まずディスコードのチャンネルからチャンネル編集
![スクリーンショット 2024-08-13 5.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/d7b3c42c-2eba-88a9-39bc-466a9e39c008.png)

次にそのまま連携サービス→ウェブフック
![スクリーンショット 2024-08-13 5.29.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/d0fe727a-f7df-932b-f952-6dd2ab4709b9.png)

ウェブフックを作成からウェブフックのURLをコピー
![スクリーンショット 2024-08-13 5.29.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/9960cb84-9b33-11f2-7347-109087d91898.png)


次にgithubの設定です。
githubの選択したいリモートリポジトリ→setting→webhook→add webhook
![スクリーンショット 2024-08-13 5.30.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/7e0672d0-55cc-0b27-2de9-48fb4f58e4cf.png)

最後にwebhookの設定で先ほどのURLをペーストして、URLの末尾に/githubを追加
→connect typeをapplication/jsonに変更
![スクリーンショット 2024-08-13 5.33.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3787859/97af5bbf-b0a8-6e5a-fceb-205e21c7df4d.png)

この設定でgithubのpush内容がチャンネルに作成されて確認することができます！


# 最後に
かなり当たり前だろ！みたいな内容ですがかなり大事なことだと思ってます。
また分からないままずっと止まっていると一日の進捗0みたいなことも起こりうるので、とりあえず聞く、相談する、単純だけどめっちゃ大事だと思ってます。

自分ももっとハッカソンに出たいと思っているので日々キャッチアップし続けて行きます！
何か間違っていることがありましたら教えてください！
【GDevelop】数字をカンマ区切り（の文字列？）にする

# はじめに
絶対に公式関数でありそうな気がする、数字のカンマ区切り。

調べても調べても自作拡張機能とかの話ばかりで、なんかスッキリしないのでJavaScriptでの記述を探しました。

ChatGPTのある時代で良かった。


# 答え

右クリック「追加」「JavaScript」から。

条件の無いとこで大丈夫でした。

（画像）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71795/e201ebf5-5ff1-686b-32f6-7cf2f1c0b89a.png)

「JavaScriptに渡すオブジェクトを選択して下さい」は無視して良いっぽいですね。

（ソースコード）
```javascript
// カンマ区切りにする関数
function formatNumberWithCommas(x) {
    if (x < 10000) {
        // 10000未満なら小数点以下1位まで表示
        return x.toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    } else {
        // 10000以上なら小数点以下を表示しない
        return Math.floor(x).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }
}

// グローバル変数`Count`の値を取得
var countValue = runtimeScene.getGame().getVariables().get("Count").getAsNumber();

// カンマ区切りに変換
var formattedCount = formatNumberWithCommas(countValue);

// 'CountText'という名前のテキストオブジェクトを取得
var countTextObject = runtimeScene.getObjects("CountText")[0];

// テキストをカンマ区切りにした値に設定
countTextObject.setString(formattedCount);

```



# 拡張（10000未満なら小数点以下1位も表示する）

関数部分を変更

```javascript
// カンマ区切りにする関数
function formatNumberWithCommas(x) {
    if (x < 10000) {
        // 10000未満なら小数点以下1位まで表示
        return x.toFixed(1).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    } else {
        // 10000以上なら小数点以下を表示しない
        return Math.floor(x).toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }
}
```


終わり
Mac のポインタの加速度が好きじゃないからターミナルでオフにする

FF14をやっていてマウスの加速度つくのが嫌なのでオフにすると
マウスがちゃんと動かした通りの速度で動いてくれます

環境設定から変えられないのでターミナルを使います

ターミナルで以下を打ちます

~~~
defaults write .GlobalPreferences com.apple.mouse.scaling -1
~~~

戻したい時
~~~
defaults delete .GlobalPreferences com.apple.mouse.scaling
~~~

いまが加速度ついてるかどうか知りたい
~~~
defaults read .GlobalPreferences com.apple.mouse.scaling
~~~

-1 が表示された場合、マウスの加速が無効
正の数が表示された場合（例: 1, 2, など）、マウスの加速が有効

以上です。
2024/8/13主にITとかセキュリティの記事

CROWDSTRIKE ファルコンのトラブルの根本原因分析報告書 (2024.08.06)(8/11)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/08/post-6e3656.html

サイバー攻撃の最新手法と対策がわかる！『先読み！サイバー セキュリティ』【総合3.8】(8/11)
https://hon-hikidashi.jp/book-person/43601/

日本がサイバーテロに狙われやすい理由。大企業も個人も続々と標的に！(8/11)
https://news.nicovideo.jp/watch/nw16233368

イラン、ハッカーと偽情報を使い米大統領選挙に干渉か　マイクロソフト報告(8/11)
https://forbesjapan.com/articles/detail/73061

家庭用ルーターにセキュリティ対策は必要？最新の脅威と防御策を徹底解説
https://cybersecurity-park.com/2523/

オランダ AI影響アセスメント (2023.03.02)(8/11)
http://maruyama-mitsuhiko.cocolog-nifty.com/security/2024/08/post-9a50ed.html

サイバー防御、自治体に死角　責任者に専門家起用0.6%(8/11)
https://www.nikkei.com/article/DGXZQOUF25B710V20C24A7000000/

世界初 AI駆動の全自動ロボット歯科医による虫歯治療が成功ーーボストンのPerceptive社(8/11)
https://ledge.ai/articles/perceptive_automated_robotic_dentist

「能動的サイバー防御 (ACD)」導入の動きでサイバーセキュリティに注目 ―― 朝エクスプレス（コメンテーター解説）(8/11)
https://zuuonline.com/archives/291104

劇的に進化する“偽広告詐欺”に引っかからないためにはどうすればいいか(8/11)
https://www.sankei.com/article/20240811-O2P4QUCXOBPTLORVRRUWLOFQUY/

誰も使ってないのに「マイナ保険証」が「強制導入」へ…国がゴリ押しする「医療DX」がもたらす最悪の事態(8/11)
https://gendai.media/articles/-/135222

「チャット」の意味とは？ビジネスシーンでの活用方法を解説(8/11)
https://forbesjapan.com/articles/detail/72923

サイバー戦略本部トップを首相に　司令塔強化、有識者組織も設置(8/11)
https://373news.com/_news/compactnews.php?newsitemid=2024081101001216

トランプ氏、陣営へのハッキングの背後にイラン－マイクロソフト報告(8/11)
https://www.bloomberg.co.jp/news/articles/2024-08-11/SI1JVDDWLU6800

トランプ陣営がハッキング被害に　共和党の副大統領候補バンス氏の調査資料など内部のやりとりが流出(8/11)
https://news.livedoor.com/article/detail/26970009/

トランプ陣営にハッキング　イラン関与の見方―米大統領選(8/11)
https://www.jiji.com/jc/article?k=2024081100322&g=int

トランプ陣営がハッキング被害、副大統領候補にかかわる「弱点」流出(8/11)
https://news.yahoo.co.jp/articles/f58c4bce5310a4f0e7bf7718a5ad236c0a6d00c5

「ウィキリークス」の創業者アサンジ、自由の身になったが謎の解明残る(8/11)
https://agora-web.jp/archives/240809210333.html

トランプの暗号資産をめぐる公約は、ビットコインに危機をもたらすかもしれない(8/11)
https://wired.jp/article/donald-trump-bitcoin-reserve-promises/
Goの簡易文付きif文について

# Goの簡易文付きif文についての個人的な考察

Goでは、簡易文付きif文を使用することで、エラーハンドリングをより簡潔に書くことができる
しかし、個人的には早期リターンを用いた従来の書き方の方が可読性が高まると考える

## 書き方
ReadAlbumTitle関数からの戻り値（album構造体とerror）を処理する例

```golang:簡易文付きif文
    if album, err := ReadAlbumTitle(file); err != nil {
        return err
    } else {
        albumList = append(albumList, album)
    }
```

```golang:従来の書き方(早期リターン)
    album, err := ReadAlbumTitle(file)
    if err != nil {
        return err
    }
    albumList = append(albumList, album)
```
## 可読性
・簡易文付きif文ではコードの簡潔さやスコープの範囲が狭まるなどの利点はあるが、以下の理由から可読性は低くなる
1. if文の直後に、条件判定ではなく後続の処理に関わる変数宣言が来ることで、文の構造が直感に反する
2. else があることにより、思考が混濁しやすい(処理の流れが二手に分かるため、わかりにくい）
3. err != nilの条件が行の右端に位置し、if文の本質的な条件が把握しにくい

## 選び方
コードに幾つかのパターンがある場合は、理由を明確にして選ぶのが良い
・言語の文化
・チームの技量
・コード量
・ゴードの寿命
勤務計画確認＆みんなが欲しかったツール作成

# 超初心者の試み
みなさま、はじめまして。プログラミング超初心者が１週間で挑戦してみました。
小売業スタッフとして勤務しており、身近な課題についてアクションできないか
奮闘した記事になります。

# 使用ツール
・LINE
・make
・Google スプレッドシート

# 作成したのはLINEbotの「ろぼっとくん:robot:」
自分の直近月度の勤務計画を確認する時、わざわざPCを立ち上げたり、全て手帳に記入しておいたり、印刷して冷蔵庫に貼ったり（うちの妻がよくやる）…
#### <font color="red">**「なんだかアナログな確認方法だなぁ」**</font>と思っていました。

そこで「簡易秘書＝ろぼっとくん」に日付入力に対して、勤務計画を返信してもらおうと考えました。
様々な記録媒体を確認するのが手間で、自分の記憶に頼る⇒勤務計画を勘違いして
勤怠エラーなんて事が過去にも何度もありました…(笑)

加えて、部署内の皆さんにどんな機能が欲しいかヒアリングしたところ
「【店舗名】入力で【店舗コード】と【店舗Mgr電話番号】がすぐに確認できるようにして欲しい」と意見を頂きました。長年勤めていて、60店舗以上の店舗コードを
全て暗記している人もいますが、私含め経験の浅い方々は、出先で確認したい時に
意外と困るもの…。
電話番号もアドレス帳に全て登録しておけば…？と思われるかもしれませんが、
こちらも出先や社用スマホ外からの連絡時には確認が難しいです。

#### 今回の「ろぼっとくん」は、サクッと確認できるのが一番の利点です！

# makeシナリオ作成
【手順①】makeシナリオを以下のように配置する。
![シナリオ①.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844566/9f6bbfaf-3d0b-33a2-1e88-d3df7e2317b2.png)

## 各モジュール作成
【手順②】Googleスプレッドシートを設定する。
「キーワード」＝LINE入力テキストと
「返却」＝返信内容を事前に作成しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844566/15e54950-e2cc-6074-5a61-53da5c73cbc0.png)

店舗情報についても同じシートに列挙しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844566/78d4f911-6a62-efd2-ef1a-fdcdd8942e91.png)

【手順③】返信内容の分岐を設定する。
★Router分岐①　返信内容が「ある」場合（Set up a filter）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844566/1da651bd-c06e-fadc-d17c-14fd1cabb144.png)
こんな感じでフィルター内を設定します。
ポイントは
・「<font color="red">**Exists**</font>」を選択すること
・「Add <font color="red">**AND**</font> rule」を選択して「返却」を設定すること
「OK」を押して完了。

「ある」場合の返信設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844566/8933846b-5bbd-4c88-65b0-1feeb9b9c89e.png)
こんな感じでTextに「返却」を選択します。
「OK」を押して完了。

★★Router分岐②　返信内容が「ない」場合（Set up a filter）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844566/0b7becb3-1921-9c71-854e-a18f401e2c43.png)
こんな感じでフィルター内を設定します。
ポイントは
・「<font color="red">**Does not exist**</font>」を選択すること
・「Add <font color="red">**OR**</font> rule」を選択して「返却」を設定すること
「OK」を押して完了。

## 実際の動作状況
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="zxx" dir="ltr"><a href="https://t.co/in9X0TQO67">pic.twitter.com/in9X0TQO67</a></p>&mdash; minaharu (@mina_haru_32527) <a href="https://twitter.com/mina_haru_32527/status/1822539242561794282?ref_src=twsrc%5Etfw">August 11, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こんな感じで自身の勤務計画と、店舗情報を返信してくれる「簡易秘書」完成！
実際にこの画面を部署内の皆さんに見せたところ感動していました(笑)
今後は皆さんの勤務計画を追加で登録して、「ろぼっとくん」アカウントを
部署内の皆さんに共有して使えるようにしたら、完了です！

## 最後に
超初心者でも簡単に設定できました！
まだまだ追加したい機能はありますが、ひとまず満足のいく出来栄えです(笑)
拙い文章と、ちっぽけな制作ですが、記事に残させて頂きます。
ある病気かどうかを80%の精度で判定するアプリで陽性だったとき、本当にその病気である確率


## きっかけの記事

https://megalodon.jp/2024-0805-2241-31/https://qiita.com:443/YUUUUUUUUUNA/items/278397b273860806cc46

## 前提

ある病気は100人に1人の割合で発生するとする。

## 解く

求める確率は

```math
\begin{eqnarray}
\frac{P(\text{陽性判定} \cap \text{病気})}{P(\text{陽性判定} \cap \text{病気}) + P(\text{陽性判定} \cap \text{病気でない})} &=& \frac{P(\text{正しい判定} \cap \text{病気})}{P(\text{正しい判定} \cap \text{病気}) + P(\text{誤った判定} \cap \text{病気でない})} \\
&=& \frac{\frac{8}{10} \times \frac{1}{100}}{\frac{8}{10} \times \frac{1}{100} + \frac{2}{10} \times \frac{99}{100}} \\
&=& \frac{4}{103} \\
&\approx& 0.0388
\end{eqnarray}
```

よって「ある病気かどうかを80%の精度で判定するアプリで陽性だったとき、本当にその病気である確率」は約3.88%

## これが意味すること

このアプリで陽性が出たとしても、誤診である確率（約96.12%）が圧倒的に高い。

## 直感的におかしいと思う人へ

1000人いるとして
病気でないが誤って判定された人
病気であり正しく判定された人
の人数を考えてください。

病気でなく正しく判定された人
病気であるが誤って判定された人
は考えなくていいの？と思った方はタイトルをもう一回読んでください。

## それでもおかしいと思う人へ

これ読んで

https://bellcurve.jp/statistics/course/6448.html
(UNO)ビットサーチ　1ビットだけ立っているビットを探すらしい、遊びらいし


目的
ビット列から1ビットを探す。

いろいろ
例題の中の例題らしい、基本中の基本らしい
いままで、ファミコンで遊んだりプログラムを書いたり
してきたが、存在は、知っていたが、初めてプログラムしてみた
いままで、1度もつかった事は、ない
だいたい、1の値しか示さないのにシフト操作なんかする?たぶんしない。
ビットの概念の勉強用


結果

![o_coq312.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4347728b-c36b-5e72-5cdb-ec9d2b125d7f.jpeg)



プログラム

```c++


//bit_search_UNO_1
//ビットサーチ
//ビットの立った、1ビットを探す


//初期化
void setup() {

  Serial.begin(9600);
  Serial.println("START");

  //unsigned char a = 0b10000000;
  //unsigned char a = 0b01000000;
  unsigned char a = 0b00100000;
  //unsigned char a = 0b00010000;

  //unsigned char a = 0b00001000;
  //unsigned char a = 0b00000100;
  //unsigned char a = 0b00000010;
  //unsigned char a = 0b00000001;

  int b = 0;

  if ((a & 0b11110000) != 0) {
    Serial.println("11110000");//debug
    b = b + 4;
  }//endif

  if ((a & 0b11001100) != 0) {
    Serial.println("11001100");//debug
    b = b + 2;
  }//endif

  if ((a & 0b10101010) != 0) {
    Serial.println("10101010");//debug
    b = b + 1;
  }//endif

  Serial.println(b);

}//setup


//メインループ
void loop() {
}//loop


```
「Azure初心者向け」AZ-900 Microsoft Azure Fundamentals受験メモ

# 目次
[1.はじめに](#1-はじめに)
[2.教材](#2-教材)
[3.学習方法](#3-学習方法)
[4.最後に](#4-最後に)


# 1 はじめに
AZ-900 Microsoft Azure Fundamentals(以下、AZ-900)に合格しました。
学習をするうえで使用させていただいた教材や学習方法についてのメモを記載します。

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-fundamentals/?practice-assessment-type=certification


# 2 教材
## Udemy

https://www.udemy.com/course/microsoft-azure-az900-video/?couponCode=KEEPLEARNING

インプット用に使用させていただきました。AZ-900の試験範囲を網羅的に学習できます。図解が多く丁寧な講義のため、試験対策だけでなくAzureの基礎知識を学ぶことにも役立ちます。


https://www.udemy.com/course/microsoft-azure-az900-exam/?couponCode=KEEPLEARNING

アウトプット用に使用させていただきました。演習問題をたくさん解くことで知識を定着することができます。また、各問題に対して丁寧な解説が付いているため、解説を熟読することで理解が深まります。


## 書籍

https://www.amazon.co.jp/%E6%A8%A1%E6%93%AC%E5%95%8F%E9%A1%8C%E4%BB%98%E3%81%8D-%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Microsoft-Azure-Fundamentals%E6%95%99%E7%A7%91%E6%9B%B8%EF%BC%BBAZ-900%EF%BC%BD%E5%AF%BE%E5%BF%9C/dp/4295018996/ref=asc_df_4295018996/?tag=jpgo-22&linkCode=df0&hvadid=701704389757&hvpos=&hvnetw=g&hvrand=287156545499179301&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009263&hvtargid=pla-2309848366966&psc=1&mcid=3857316a46423cfe84239124e85aba7c&th=1&psc=1&gad_source=1

インプット用、アウトプット用に使用させていただきました。試験範囲を網羅しており解説が丁寧で詳しいため、合格に向けて力を付けることができます。また、各章の章末問題を解くことで各章の内容を理解できているか確認することができます。読者特典として1回分の模擬試験がダウンロードできます。


## Microsoft Learn

https://learn.microsoft.com/ja-jp/credentials/certifications/azure-fundamentals/practice/assessment?assessment-type=practice&assessmentId=23&practice-assessment-type=certification

アウトプット用に使用させていただきました。Microsoft Learnが用意している資格取得に向けた無料の試験問題です。試験問題を解くことで、本番の試験で問われる可能性のある質問スタイル、表現、難易度を学習することができます。また、各問題に対して解説と根拠(Microsoft Learnのページへのリンク)が付いているため、知識の確認に役立てることができます。


# 3 学習方法
以下の順番で学習を進めました。
1. 「合格への近道！Azure Fundamentals AZ-900 試験対策講座」を視聴し演習テストをすべて解きました
2.  「最短で合格！Azure Fundamentals AZ-900 試験対策問題集」を解きました(時間の関係ですべての演習問題を解くことはできませんでした)
3. 「(模擬問題付き)徹底攻略 Microsoft Azure Fundamentals教科書［AZ-900］対応 第2版」を読みすべての演習問題と読者特典の模擬試験を解きました
4. 「プラクティス評価」を解きました(試験当日テストセンターへ向かう直前に解いたのですが、もう少し早く解いておけば良かったと思いました)

:::note info
**学習方法についての感想**
* どの教材の問題についても、**解説を熟読することで正解/不正解になる理由を理解するようにしたこと**は良かったと思いました
* **理解できていない点を曖昧にしなかったこと**は良かったと思いました(理解できていないことを見つけるためにもアウトプットは大切だと感じました)
* **「プラクティス評価」を解いて試験の質問スタイル、表現、難易度に慣れておくこと**は必要だと思いました
:::

参考までに学習時間を記載します。
Azure portalで数回操作をしたことがある程度の初心者の状態から学習を開始しました。学習時間の合計は30.0時間でした。各教材の学習時間は以下の表をご参照ください。

|教材 |学習時間  |
|---|---|
|合格への近道！Azure Fundamentals AZ-900 試験対策講座 |3.5時間  |
|最短で合格！Azure Fundamentals AZ-900 試験対策問題集  |6.0時間  |
|(模擬問題付き)徹底攻略 Microsoft Azure Fundamentals教科書［AZ-900］対応 第2版 |20.0時間  |
|プラクティス評価  |0.5時間  |


# 4 最後に
今回AZ-900を受験するにあたって、Microsoft Learnはインプット用教材として使用していなかったので、今回の試験の復習や今後の学習ではMicrosoft Learnをインプット用教材として活用してみたいと思います。本記事が次に受験される方のお役に少しでもなれば幸いです。最後までお読みいただきありがとうございました。
ubuntuでkindleを見る方法

# はじめに
ubuntuでkindleがみたい。wineを使う方法はうまく行かなかった。genymotionというAndroidエミュレーターをつかってAndroid版kindleをubuntu上で見る。

# genymoitonのインストール

公式サイトからgenymotion desktopをダウンロード
https://www.genymotion.com/product-desktop/

以下のコマンドを実行してインストール

```bash
$ chmod 755 genymotion-3.7.1-linux_x64.bin
$ sudo ./genymotion-3.7.1-linux_x64.bin
```
genymotionの実行
```bash
$ /opt/genymobile/genymotion/genymotion
```
# genymotionのイメージ作成
イメージの作成はこの設定で行った。後でインストールするARM−TranslationがAndroid9までにしか対応していないので、ここで作成するイメージも9以下にする。
![Screenshot from 2024-08-13 01-04-37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/e65e7b89-81d4-41f9-344e-2ae0dde43cf7.png)

# Open GAppsのインストール
初期状態ではPlay Storeがインストールされていないので、インストールする。
Androidのエミュレーターが立ち上がるとOpen GAppsをインストールするボタンが現れる。（画像右端の◁の上のボタン）自己責任でなんとかかんとかという文章が出るが、OKを押す。　これでPlay Storeが使えるようになる。この時点でkindleをPlay Storeからインストールしようとすると、「あなたのデバイスには対応してません」とか言う文句が出る。
![Screenshot from 2024-08-13 01-06-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233578/15199c00-4c67-95a3-5bf2-1bfe6d402e6f.png)

# Genymotion ARM Translation(GAT)のインストール
このままではARM対応のアプリがインストールできない。下記のサイトからAndroidのバージョンに対応するGATをダウンロードする。zipをダウンロードしたら、Androidの画面におもむろにドラッグアンドドロップする。（ここがわからなかった。。。）
https://github.com/m9rco/Genymotion_ARM_Translation

# kidleのインストール
Play Storeに行くと無事kindleがダウンロードできるようになっている。