OmniAICreator/Qiita-1.07M huggingface dataset:
bootstrap導入

**はじめに**
bootstrapの導入方法について２通りの導入方法を見つけたのでメリット、デメリットをまとめました。
______________
### webpackを使用した導入方法
:tropical_fish:**メリット**:

統一性: Rails 6以降、WebpackerはデフォルトでJavaScriptを管理するために使われています。これにより、すべてのJavaScript関連のアセットが一箇所で管理されることになります。
最新のフロントエンドツールとの互換性: Webpackerを使用することで、最新のフロントエンドライブラリやフレームワークの導入が簡単になります。

:fish:**デメリット**:

複雑さ: 初めてWebpackerを使用する場合、設定やトラブルシューティングが複雑に感じることがあります。

:cherry_blossom:**Webpackerを使用して、jquery、bootstrap、およびpopper.jsを導入する手順**

:star:必要なパッケージのインストール
```
yarn add jquery bootstrap@4.6.2 popper.js
```
:star:Webpackerの設定の変更
config/webpack/environment.js を編集して、以下の内容を追加します。
```diff_javascript
const webpack = require('webpack');

environment.plugins.prepend(
  'Provide',
  new webpack.ProvidePlugin({
    $: 'jquery/src/jquery',
    jQuery: 'jquery/src/jquery',
    Popper: ['popper.js', 'default']
  })
);
```
:star:SCSSとJSの設定
:point_up:app/javascript/stylesheets ディレクトリを作成します。

その中に application.scss ファイルを作成し、次の内容を追加します
```
@use '~bootstrap/scss/bootstrap';
```
:star:app/javascript/packs/application.js を編集して、以下の内容を追加します
```diff_javascript
import "jquery";
import "popper.js";
import "bootstrap";
import "../stylesheets/application";
```
:star:レイアウトの変更
app/views/layouts/application.html.erb を編集して、以下のように変更します。
```erb
<!-- 変更前 -->
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>

<!-- 変更後 -->
<%= stylesheet_pack_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
```
これで、Bootstrapとそれに関連するJavaScriptライブラリがWebpackerを通じてプロジェクトに導入されました。これでBootstrapのスタイルやJavaScriptの機能をRailsアプリケーションで使用できるようになります。
_________
### :shamrock:Asset Pipelineを使用した導入方法
:tropical_fish:**メリット**

**シンプル**: Rails 5までのデフォルトの方法で、Railsの長い歴史の中でよく知られています。簡単にセットアップでき、トラブルシューティングも簡単に行えます。

:fish:**デメリット**

**古い**: 新しいフロントエンドライブラリやツールの導入が難しくなる可能性があります。
非効率: モダンなJavaScriptのビルドツールや最適化の恩恵を受けるのが難しくなります。

:::note warn
Webpackerの設定の変更までは先ほどと同じです
:::
:star:JavaScriptからBootstrapを利用できるように、app/javascript/packs/application.js に以下を追加します
```diff_javascript
import 'bootstrap'
```
:star:スタイルシートとしてBootstrapを利用するため、app/assets/stylesheets/application.css の名前を application.scss に変更し（もしまだ変更していなければ）、その中に以下を追加します。
```diff_javascript
@import "bootstrap/scss/bootstrap";
```
これで、BootstrapをRailsプロジェクトに導入し、JavaScriptとスタイルシートの両方で利用できるようになります。
________
### :cherry_blossom:結論
新しいRailsプロジェクトで、最新のフロントエンド技術を取り入れる予定の場合: Webpackerを使用する方法 (提供された手順) がよい。

シンプルなアプリケーションや、既存のアプリケーションでAsset Pipelineを使用している場合: Asset Pipelineを継続して使用することを考慮できます。
最終的には、プロジェクトの要件、既存のインフラストラクチャ、そして開発チームの経験や好みによって最適な選択が異なります。
Azureサブスクリプション内のリソースを全消しするPowerShell (Azure PowerShell)

こんにちは駆け出しアーキテクトのやまぱんです。
 Azure を触る人は定期的にむしゃくしゃして？ Azure の検証環境を壊したくなることがあると思います。
そうした時になるべく楽したいと思います。


:::note
改良版を作りました。 多分こっちの方がいいです。削除ロックがかかってるものはスキップしたり依存関係をある程度考慮した作りになっています。
https://github.com/aktsmm/Scripts/blob/main/ps/DeleteAllAzureResources2/DeleteAllAzureResources2.ps1

https://github.com/aktsmm/Scripts/blob/main/ps/DeleteAllAzureResources2/ReadMe_DeleteAllAzureResources2.md
:::

## 一番の注意
まず、操作対象のSubscriptionであることを確認してください


+ ```Get-AzContext```を用いて現在のSubscription IDが正しいか確認しましょう。
![2023-08-07_22h34_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982508/0381ddc7-b736-4c9f-17a2-b5e16ad06ba2.png)

or

+ ログイン時  ```Connect-AzAccount```  を利用する際にオプション ```-Subscription <your-subscription-id>```や``` -Tenant <your-tenant-id>``` を利用して 正しい Subscription / テナント にログインしましょう!!

```PowerShell:Subscription や テナントを指定してログイン
Connect-AzAccount -Subscription <your-subscription-id> -Tenant <your-tenant-id>
```


**誤って権限のある他人の検証環境に入った状態で実行してしまうことは避けましょう!**
![image](https://github.com/aktsmm/Scripts/assets/71251920/6b8c3197-1263-4748-957a-5ca262a972ab)

## その他
* Azure のリソースを全消しします。
* 例えば個人の検証環境をクリーンにしたくなる時に使います。
* このコードを実行する前に、Azureアカウントに管理者アクセス権限があることを確認してください。
* 大体きれいに全消しはできないです。簡単に削除できるものを削除します。
* 残ったリソースはリソースロックや、論理削除が有効になってたりします。それらの設定を確認して変更してください。
* その他バグったリソースなどは消せないことがあります。 このコマンドはそうした削除できなくなったリソースには効果がありません。
その場合は、下記の方法を確認してください。
 • Azure PowerShellで正しい値に設定しなおす
 • Resource Explorerで正しい値に設定しなおす
 • JSONテンプレートの完全デプロイを試す

* もし、特定のリソースを削除したくない場合は、適切にコードを修正してください。
* 「-Force」オプションおよび「-Confirm:$false」オプションを使用することで、確認メッセージが表示されずにリソースが削除されます。
* これにより、誤ってリソースを削除するリスクが高まるので、注意して使用してください。
* また、上記のコードは一度に全てのリソースを削除しますが、通常はそのような大規模な削除操作は避けるべきです。必要なリソースだけを選択的に削除することをお勧めします。

## 実行途中の画面：ロックがかかってるリソースは失敗している 
![image](https://github.com/aktsmm/Scripts/assets/71251920/b9c438c8-e0f0-4fde-8342-7d1428a90a58)


## ソース

```PowerShell:Azure PowerShell
# 全てのリソースグループを取得してループで処理
$resourceGroups = Get-AzResourceGroup
foreach ($resourceGroup in $resourceGroups) {
    # リソースグループ内のリソースを全て削除
    $resources = Get-AzResource -ResourceGroupName $resourceGroup.ResourceGroupName
    foreach ($resource in $resources) {
        Write-Host "Deleting resource: $($resource.Name)..."
        Remove-AzResource -ResourceId $resource.ResourceId -Force -Confirm:$false
    }
    
    # リソースグループ自体を削除
    Write-Host "Deleting resource group: $($resourceGroup.ResourceGroupName)..."
    Remove-AzResourceGroup -Name $resourceGroup.ResourceGroupName -Force -Confirm:$false
}

Write-Host "All resources have been deleted."

```


## 関連
github https://github.com/aktsmm/Scripts/tree/main/ps/DeleteAllAzureResources
SIM7080Gメモ

神文献その１
https://next-step.asia/2020/12/simcom%E7%A4%BE%E3%81%AEsim7080g%E3%81%A7%E3%81%95%E3%81%8F%E3%82%89%E3%82%BB%E3%82%AD%E3%83%A5%E3%82%A2%E3%83%A2%E3%83%90%E3%82%A4%E3%83%AB%E3%81%AE%E9%80%9A%E4%BF%A1%E3%83%86%E3%82%B9%E3%83%88/

神文献その２
https://iot.sakura.ad.jp/column/sim-catm1/

神文献その３
https://www.waveshare.com/wiki/SIM7080G_Cat-M/NB-IoT_HAT

テラタームで入力した文字が表示されないときの解決方法

解決方法
Teratermメニュー　＞　Setup　＞　Terminal　＞　Local Echoにチェック

http://bobgosso.blog13.fc2.com/blog-entry-579.html
初投稿　MYSQL

はじめまして、本日から投稿させていただく初心者です。

本日勉強したのはデータベース基礎
使用しているツールは、XAMPP
学校関連なので、伏字を使わせていただきます。

↓↓↓↓↓↓↓ あなたの記事の内容
#　問題
今回はA、B、C、D、E以外の県で、県の人口が15万人以上のデータを抽出するものになります。

~~~sql
↑↑↑↑↑↑↑ 編集リクエストの内容
SELECT
 District,SUM(Population) 
FROM
 city 
GROUP BY
 Code,District
HAVING
 District NOT LIKE '%A%'
 AND District NOT LIKE '%B%'
 AND District NOT LIKE '%C%'
 AND District NOT LIKE '%D%'
 AND District NOT LIKE '%E%'
 AND Code ='J'
 AND SUM(Population)>=150000
ORDER BY
 District DESC; 
~~~

先生の訂正

~~~sql
SELECT
 District,SUM(Population) 
FROM
 city 
GROUP BY
 Code,District
HAVING
 District NOT IN ('A', 'B', 'C', 'D', 'E') 
 AND SUM(Population)>=150000
 AND Code ='J'
ORDER BY
 District DESC;
~~~~~
学んだことは、NOT LIKEだけでなくNOT 
INで県名の除外ができたこと

今回得た気付きは、NOT INのほうがよりスマートにコードを書けるということです。


よろしければ、優しくご指導のほどお願いします。
Nx v15→v16の変更点まとめ

# はじめに
こんにちは。もっぴーです。

先日Nxv15での環境構築を備忘録として記載し、今回はv16の環境構築を記載しようと思ったのですが
`nx migrate`コマンドでアップデートできることがわかりましたので
環境構築方法ではなく、v15→v16の変更点をまとめようと思います。

英語には弱弱なので、翻訳や解釈が間違っている部分あるかと思いますが、お許しを:bow_tone1:
間違っている点ございましたら、ご指摘いただけると幸いです。

https://qiita.com/moppiiiii/items/b9d8ec5c68d55eb2a1e4

https://nx.dev/

# 既存のv15構成からv16構成への移行
Nxv15からv16へのアップデートは以下コマンドで実行できます。
```
nx migrate latest
```
これにより依存関係が最新バージョンに更新されるだけでなく
ルートの`package.json`内の依存関係も更新されるので安心！！
楽に移行ができますね。

# v15→v16の主な変更点
以下の記事から情報を抜き出しています。

https://blog.nrwl.io/nx-16-is-here-69584ec87053#68c6

## @nrwl/* から @nx/* への再スコープ
前回のv15環境構築の際に使用していたNxのプラグインで`@nrwl/react`や`@nrwl/nest`を使用していたかと思います。
それらのパッケージ名が`@nrwl/*`から`@nx/*`に変更になりました。
要は、`@nx/react`や`@nx/nest`になったということですね。

`@nrwl/*`系のパッケージはプロジェクトが破損しないように
2023年10月にリリース予定のv17までは公開されているようです。（現在非推奨）

## Denoに対応
Nxを使用して新しい単一プロジェクトのDenoワークスペースを簡単にセットアップできるようになりました。
以下コマンドの実行でワークスペースが作成でき、最速のDeno開発環境の構築方法だそうです。
```
npx create-nx-workspace --preset=@nx/deno
```

また、最近はエッジファンクションに関することが特に注目されており（もちろんサーバーレス全般）、
Node.jsを使用して開発する際には、エッジやいくつかのサーバーレス環境にデプロイしたいというニーズが一般的であると言われています。
その為、`@nx/netlify（ラボ版）`というパッケージが開発され
Netlifyファンクションの開発とデプロイのための新しいプロジェクトを
簡単にセットアップできる他、既存のプロジェクトにサーバーレスデプロイのサポートが追加されたとのことです...
```
@nx/netlify:setup-serverless
```

更に、`@nx/aws-lambda `パッケージも公開され、LambdaファンクションをAWSにデプロイすることにも対応したとのこと。

Deno DeployおよびNetlifyの両方へのサーバーレスデプロイに関しては
```
@nx/deno:setup-serverless --platform <deno-deploy or netlify>
```
で実現できるようです...

## Cypressの機能テスト
多くの機能を収集する傾向のあるアプリケーションのためにE2Eテストをセットアップする際
適切に分離するのには向いていない大規模なアトミックスイートが生成されることがあります。
Nxv16では、これらのテストを実際のテスト対象の機能に近い場所に分散しやすくして
`nx affected`コマンドを使用して、実際に必要なテストをより簡単に特定できるようになったそうです。

すごくありがたいことですが、個人的にはPlaywrightも欲しいです:sob:

https://youtu.be/y3gFRSqarEo

## パッケージマネージャーがpnpmに
内部的に、Nxリポジトリはパッケージマネージャとしてpnpmを使用するように切り替わり
以下の利点が確認できたようです。

```
・パッケージの公開が2倍速くなった
・CIの時間が短縮された
・インストール時間が短縮された
```

以上が主な変更点です。

# おわりに
最近Nxを触るようになってからゾッコンです。
私自身まだまだ使いこなせておらず、理解度も非常に浅いので、定期的に情報のキャッチアップと
技術検証等も進めていきたいです。
`v17`も楽しみです。
セキュリティグループにマイIPの指定

# この記事の目的
以前セキュリティグループ（SG）の設定について、インバウンドルールに自信のSGIDを設定しなければならないという内容で記事を書きました。

https://qiita.com/inoshun/items/849a2b8d568844b0f472

本日、SGの設定を見直してると、もう一つ意味の分からない設定をしているのを見つけたので共有します。

# 意味わからない設定とは

それは

**マイIPを指定する**

ということです。
私の認識ではマイIPは、個人でセキュリティテストを行う際に指定するIPと理解していますが違うのでしょうか？
なんにせよ、SGの設定としてはHTTPとHTPPSはもちろん、Webアプリケーションに対応したカスタムTCP、そして**設定している自身のSGIDとマイIP**を指定するということを意識しておけばよさそうです。

前回に引き続き、SGについて紹介しましたが、ロードバランサーやVPC、ECSの設定についても軽く紹介しようと思います（需要あるのか？）。
それでは！！！
【Tips】JSDocでHome画面（ファーストビュー）に情報や説明を表示・編集したい

# 概要
受託開発企業で働く@fussasyです。大規模SI開発現場でJSDocのルール作りをしていた際、分からないことはググったり、AIに尋ねて解決をしていました。ただ、各JSDocタグの解説や記載内容のベストプラクティスは検索でたくさんでてくるものの、Home画面（JSDocファーストビュー）の編集方法が出てこなくて困ったので、Tipsとして記事に残しておきます。誰かの役に立てば幸いです。

# 課題
Home画面（JSDocファーストビュー）にファイル名・最終更新日・ファイル解説といった情報を表示させたいです。「[JSDocの書き方・出力メモ](https://qiita.com/zaburo/items/c90ab1a3d7751f610d27)」の記事に書かれている通りに、README.mdファイルを作成してみても反映がされませんでした。（jsdocコマンド時にエラーが発生）

# 解決策
プログラムファイルに特定のJSDocタグを書いて対処しました。ここで紹介するタグ以外にも、Home画面に反映させられるタグはあると思います。大規模SI開発現場であれば「File」「Author」「Version」「Description」があれば、情報としては十分だと思います。また、プログラムファイル冒頭に下記のようなJSDocコメントを記載（func_1.js）しても、Home画面には反映されません。JSDocタグを記載（func_2.js）した場合と比べます。
![タグを使用した場合と使用しない場合のコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/9fdfd45a-b359-60d4-0ca1-7ea8b0ce45aa.png)
![タグを使用した場合と使用しない場合のコード2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/67154d01-7442-7960-1736-0f31421b31ec.png)
上記の結果を表示した結果。
![タグを使用した場合と使用しない場合のコード結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/7f66e3ed-9be3-6a15-36fc-be73eec8164f.png)
※JSDocタグを書いたファイルだけHome画面に表示される。

func_1.jsに、JSDocタグを追加してみます。
![タグを増やしてみたコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/db39c46e-488c-0f2f-91bc-fefea628fd2d.png)
すると、JSDocのHome画面で情報が表示されました。
![タグを増やしてみたコード結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/5f3b8466-8cf7-f937-0449-dad34dbfadb7.png)

# 補足・関連リンク
JSDocの基本のキはコチラから
https://qiita.com/zaburo/items/c90ab1a3d7751f610d27

JSDocに関する情報は公式ドキュメントを確認すると良いです。
https://jsdoc.app/

JSDocに関する記載内容のベストプラクティスは、GoogleJSスタイルガイドラインを確認すると良いです。
https://google.github.io/styleguide/jsguide.html#jsdoc

今は記事の通りにESLintプラグインを導入し、一気にルール付けしてしまうのが主流です。（TypeScriptにも対応）
https://zenn.dev/wakamsha/articles/setup-eslint-plugin-jsdoc
【VSCode】変更を自動保存させたい

# はじめに
Xcodeに慣れているとVScodeを使った時に保存をするのを忘れてしまうことがあります。
ですのでVSCodeも自動保存にさせたいです。

# やりかた
① 「ファイル」を選択します
② 「自動保存」を押します
![スクリーンショット 2023-08-07 21.53.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/98e85ed4-c05d-9dbb-612a-227ba6910437.png)

# おわり
VSCodeは快適にGitHubCopilotが使えるのでめっちゃ好きです
早くXcodeにも公式で対応してほしいです

# 参考記事
https://www.javadrive.jp/vscode/setting/index2.html
プロジェクト作成ツール「Vue CLI」と「Vite」

「Vue CLI」と「Vite」どちらが良いのか迷ったので、調査結果まとめ。

# 結論
個人的には以下２点の理由からViteを使用するのが良いと思いました。

1. 環境構築が手軽
Vue CLIはあくまでプロジェクト作成ツールであり、ビルドツールではないため、ビルドするためにwebpackとVue-Loaderのインストールも必要、かつSassを使用するにしてもsass-loaderなど開発に必要なツールを別途インストールしていく必要があるため、環境構築をより手軽にできるという点。

2. 高速なHMR
参考にした比較サイトで検証されている通りプロジェクトの起動やホットリロードが爆速。プロジェクトが巨大化すればするほどこの恩恵は大きいと思う。何よりサクサク動いてくれると単純に嬉しい。


|    |  Vue CLI + webpack  |  Vite  |
| ---- | ---- | ---- |
|  プロジェクト  |  Vue.js  |  Vue.js<br>React<br>Preact  |
|  Sass  |  プラグインで対応  |  デフォルトで対応  |
|  TypeScript  |  プロジェクト作成時に選択可能<br>同時にLintやFormatterも選択できる  |  デフォルトで対応（ただし型チェックはプラグインの導入必要）  |
|  速度  |  Viteに比べると遅  |  速い  |


# 「Vite」とは
Viteはフランス語で"速い"という意味。Vue.js開発者のEvan You氏によって作成された新しいフロントエンドビルドツール。
デフォルトでVueとReactのプロジェクトテンプレートがあり、TypeScriptとJSXのサポートもある。
高速なHMR（HMR：Hot Module Replacementの略。画面の再描画無しにファイルの更新をブラウザに適用してくれる機能。ホットリロード。）を備えている。

## 特徴１ 高速な起動・更新
従来では全体のファイルを精査してからビルドしていたが、Viteの開発サーバではpre-bundleという手法でmodulesと全体のバンドルが切り離されているため、必要最低限のバンドルだけを行うことで高速性を実現している。

## 特徴２　TypeScriptやSassが設定なしで利用できる
ViteはあらかじめTypeScriptやSassのサポートがあるためライブラリをインストールしなくてもモダンな開発環境を整備することができる。

#### 参考
[Github:vite](https://github.com/vitejs/vite#how-and-why)
[Wikipedia:Vite (software)](https://en.wikipedia.org/wiki/Vite_(software))
[最先端のビルドツール「Vite」とは？【Vue公式パートナーが分かりやすく解説】](https://jp.skilled.yashio-corp.com/media/programming/5807/)
[【Vite】 Vue3.0もReactも！ノーバンドルなビルドツール「Vite」を試してみる](https://qiita.com/ryo2132/items/c1530dd590e34e68c494)
[create-vue と vite どちらでスキャフォルドすべきか考える](https://zenn.dev/sa2knight/scraps/383dbcb2634153)
QA3年目の僕が1年目の自分に伝えたい不具合報告のマインド


## 前提
自分が仕事で携わっているのはWebアプリなので主に以下を利用しています。
・ブラウザ: Chrome
・監視ツール: DataDog
・エディタ: VSCode

---
## 不具合報告
### 起票内容
以下の記事を指針として起票する。
[完璧に理解できないバグ票について](https://qiita.com/mima_ita/items/de9531af97f318b25044)
[開発現場に根強く残る8個のバグレポートアンチパターン](https://qiita.com/kkakizaki/items/536d99f8240cc83c53fa)





### 間接原因の把握
事象だけ書いてdevに伝えると彼らも再現&ログ確認の時間を割かなければならないのでできるだけQAで間接原因、直接原因の特定を行う。何らかの操作ができないバグでコンソールにエラーが出ているとすれば、APIエラーの具体的な内容の把握に努める。
DevToolsのNetworkタブでAPIの一覧とHTTPステータスコードを眺めながら、エラーが出ているAPIを把握。API名から「おそらくこんな処理をするAPIなのかな...?」と推測する。
[networkタブでのAPIエラーチェック方法](https://help.chatwork.com/hc/ja/articles/900000548343--%E3%82%A8%E3%83%A9%E3%83%BC%E7%99%BA%E7%94%9F%E6%99%82%E3%83%AD%E3%82%B0%E3%81%AE%E5%8F%96%E5%BE%97%E6%96%B9%E6%B3%95-GoogleChrome%E3%81%AE%E5%A0%B4%E5%90%88-)
[HTTPステータスコード一覧](https://www.itmanage.co.jp/column/http-www-request-response-statuscode/)

APIを把握できたら監視ツールを使ってコンテキストを把握する。コンテキストとは、その名の通り処理が行われた文脈のこと。処理の前後で何があったのか把握し、ユーザーがどんな流れでどんな操作をした時にエラーが発生したのかを特定する。サービスを指定してAPI名と発生時間を指定するもよし。自分の手元で発生したならAPI名と自分のIPアドレスから検索をすると早い。
[DataDogからのログ検索](https://docs.datadoghq.com/ja/logs/explorer/)

### 直接原因の把握
API名が特定できたら、ソースコードから該当するAPIを検索してみる。
「Go to definition」でAPIの定義にたどり着く。ここで直接原因の把握を試みる。
[VSコードチートシート](https://qiita.com/aoi70/items/d61d5cf9030ac3ce55f0)

### 不具合報告のマインド
- プロジェクトで提供したい本質的な価値についてバランスよく考える。
    - インパクトや優先度の低いバグに固執してリリースを遅らせない。
    - 早くリリースすることのビジネスインパクトやプロダクトを通して提供したい本質的な価値についてバランスよく考える
    
- ステークホルダーへのリスペクトを欠かせない
    - 実装バグであれ、仕様バグであれ、誰もバグを生みたい人はいない。
    - 誰かを責めることは避けて労ったり、感謝を伝える。
    - 建設的な改善への議論を進める。
   
- 要求を不具合を切り分ける
    - 思い通りにならないからバグではない。
    - UXを考えるのも大事だが、不具合とリクエストは明確に分けること。
    
- ネクストアクションを考える
    - 「これは仕様ですか？」と確認だけで止まって後は放置はNG
    - 「この挙動が気になりました。優先度は○○です。次のアクションとしてxxはどうでしょう？」までいきたい。
   
- 期待値とのギャップを正確に捉える
    - 期待結果ができるだけ正確な把握に努める。
    - ギャップが正確でなければそれを埋める方向性がぶれやすい。



### 言語技術を磨く
蛇足だが、言語技術によってバグ報告の質が変わる
言語技術を磨き直してみるのもおすすめ。
[大学生・社会人のための言語技術トレーニング](https://www.amazon.co.jp/%E5%A4%A7%E5%AD%A6%E7%94%9F%E3%83%BB%E7%A4%BE%E4%BC%9A%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%A8%80%E8%AA%9E%E6%8A%80%E8%A1%93%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E4%B8%89%E6%A3%AE%E3%82%86%E3%82%8A%E3%81%8B/dp/4469213438)
XAMPPにてMySQLが起動しなくなった場合の対処法

# 目次

[1. はじめに](#1-はじめに)
[2. エラーの内容](#2-エラーの内容)
[3. エラーの原因](#3-エラーの原因)
[4. 直し方](#4-直し方)
[5. おわりに](#5-おわりに)

# 1. はじめに
XAMPPを使用している際に、急にMySQLが起動しなくなることがしばしば発生しているので忘備録として記載します。
XAMPP環境限定です。

# 2. エラーの内容
下記のメッセージがXAMPPに表示されるようになり、MySQLが起動しなくなります。再起動を行っても解決しません。Startボタンを押してもすぐにStopしますし、Stopする前にAdminボタンを押してもエラーが発生しphpMyAdminも使用できません。

```:エラーメッセージ
Error: MySQL shutdown unexpectedly.
This may be due to a blocked port, missing dependencies,
improper privileges, a crash, or a shutdown by another method.
Press the Logs button to view error logs and check
the Windows Event Viewer for more clues
If you need more help, copy and post this
entire log window on the forums
```

# 3. エラーの原因

**MySQLを停止させずにシャットダウンをした。**

MySQLが起動している状態でXAMPPを落としたりPCをシャットダウンするとこのエラーが発生することがあります。
XAMPPは起動している機能をすべてStopボタンから停止させた後にQuitボタンで終了させるようにしましょう。

# 4. 直し方

1.XAMPPを起動する。
2.ExplorerボタンをクリックしてXAMPPがインストールされているフォルダを開く（ExplorerボタンはQuitボタンの３コ上にある）
3.mysqlフォルダを開く
4.dataフォルダをコピーし別の場所（デスクトップ等）に保存する
5.dataフォルダの中身をすべて削除する
6.backupフォルダの中身を全てコピーし、dataフォルダへ貼り付ける
7.コピーしておいたdataフォルダのibdata1というファイルをコピーしてdataフォルダに貼り付ける
8.MySQLのAdminボタンからphpMyAdminを開き、データベースが復元出来ているか確認する

# 5. おわりに

本記事作成に当たり、下記のリンク先の記事を参考にしました。リンク先の記事では画像も豊富なのでわかりやすいです。
参考にしてください。

[XAMPPでMySQLが起動しないエラー](https://k-sugi.sakura.ne.jp/php/5320/)

[【XAMPP】Error: MySQL shutdown unexpectedlyで起動しない問題の対処方法](https://office54.net/iot/app/xampp-mysql-error#section1)
【Tips】SAP Business Application Studio (SAP BAS) でhtmlファイルをブラウザで開く

# 概要
現在、主にSAP BTPでのアプリケーション開発に携わっている@fussasyといいます。SAP BTPにはWeb IDEのサービスとして「[SAP Business Application Studio](https://help.sap.com/docs/bas?locale=en-US)」があり、SAP S/4HANA導入プロジェクトにおいて、[Side By Side開発](https://qiita.com/Yanagawa_Yoshihisa/items/4dd3694800576e094b0a)で広く現場で活用されています。このSAP BASでのちょっとしたTipsの記事になります。

# 課題
たまたま現場での環境上、SAP Business Application Studioしか使えない状態で、簡単なhtmlファイルを開きたい、という場面に遭遇しました。パッと考えうる様々な手段を試したのですが、htmlファイルを表示することができませんでした。

# 解決策
拡張機能を入れてファイルを表示させるしかなさそうです。「[【簡単】HTMLをリアルタイムでプレビューする2つの方法【VS Code・Code Pen】](https://rilaks.jp/blog/html-preview/)」を参考に、使えそうな拡張機能を探してみました。
![BASの拡張アプリ検索結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/83e2f7b1-79c6-cf8b-5f0e-8f962ef726c1.png)
VSCodeだと「Live Server」と「HTML Preview」はありますが、SAP BASでは「Live Server」しかありませんでした。なので、こちらを導入してさっそくhtmlファイルを開き、「Go Live」をクリックしてローカルサーバーを立ち上げて確認したところ、無事にhtmlファイルをブラウザで表示することができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1727556/2d51f58c-03ea-d384-c1a8-0ff9835cb3ad.png)
※右下のアイコンをクリックします。


# 補足
SAP Business Application Studio は基本的にVSCodeと酷似しているので、何か困ったことがあればVSCodeで検索してしまった方が解決が早く、スムーズです。（会社の後輩に教えてもろた）

# 関連リンク
https://help.sap.com/docs/bas?locale=en-US
https://qiita.com/Yanagawa_Yoshihisa/items/4dd3694800576e094b0a
https://rilaks.jp/blog/html-preview/
初めてのQiita

# 初めてのQiita
ずっと見ていたqiitaに初めて投稿してみます．
軽く自己紹介をしていきたいと思います．

## 自己紹介
某IT企業に勤めている新卒の社会人です．
今は基本的にpythonでスポーツの動作解析サービスを作ったり，新規事業という名目で地域貢献できる様に色々と取り組んでいます．
保有資格は，基本情報技術者とAWSの一番簡単なやつです．次はAWSのSAAを取りたい！８月中に取りたい！！
大学の時は，RTK測位の研究をしたり，ドローンの自動制御やったり，3D点群データで地図作ったり，色々やりました．ローバーの自動走行もやったり．広く，浅くといった感じで取り組んでいました．ただ，RTK測位はかなり力を入れていて，働き始めた今も論文を書き進めています．

## 方針
今後は週１か２で投稿できれば最高です．
pythonを中心にいろんなことを発信していければと思いますので，皆さん気軽にフォローしてください！
【ポエム】エンジニアは資格を取るべき論争に決着をつける


私自身、割と資格を取るのは好きでした。保有している資格は主にこちらです。
- 応用情報技術者試験
- エンベデッドシステムスペシャリスト試験
- 電気工事士第二種
- 危険物乙1～6

しかし、世間では「資格を持っていても使えない」、「資格なんか無駄」という意見もチラホラ。役に立たないのなら資格なんて存在が無意味なはずです。本当に資格は無駄なのでしょうか？

# はじめに
今日もどこかで繰り広げられているであろう話。
ベテランAさん「中途Bさん。＊＊＊の障害の件、直近のログから抽出しておいてください。」
中途Bさん「えっと、どうやるんですか？」
ベテランAさん「え・・・・？」
ベテランAさん「(色々資格もっているって聞いたけど。。。資格持っているのに全然使えないなぁ)」
(私はIT系ではないので完全に想像・妄想です）

# なぜエンジニアの間で「資格は必要/資格は無駄」論争が勃発するのか？
結論から言えば、「資格」という言葉には、ある業務に**必ず役に立つ**というイメージがある一方、実際の資格は**ある特定の業務遂行のために作られたわけではない**場合も多いため、それを混同しギャップが生じているためです。
後述するように、エンジニア系の仕事には**業務に必ず役に立つ**資格がほとんど無いように思えます(自分調べ)。

# 資格の種類
では、業務に必ず役に立つ資格、そうでない資格にはどんなものがあるでしょうか？

## ①業務遂行に必須の資格
主に業務独占(国家)資格が該当します。
これは、「ある特定の業務遂行に**必須の技術**や**法令**の知識を有する」ことを保証する資格であり、例として電気工事士、危険物取扱者などが挙げられるでしょう。
当然のことながら、その業務遂行を許可するために作られた資格なので、**その業務に100%役立ちます。**
なお、業界内資格や社内資格も該当する場合が多いですが、色々とややこしいことになるので後述します[^1]。

## ②業務とは紐づかない資格
漢検・英検、ITでは基本/応用情報、高度情報技術者試験などがあたるでしょう。
①の資格とは逆に、ある特定の業務遂行のために作られた資格ではないので、**業務遂行に必要・十分な知識が得られるとは限りません**。
そのため、実際の業務遂行には別途勉強が必要になりますし、逆に資格で学んだ内容のほとんどが無駄になることもあるでしょう。

# 資格を取るべき人/資格以外の手段が良い人
資格のメリットを整理した上で、資格取得すべきかどうかを考察してみます。
資格のメリットはこんなところでしょうか。
- 出題範囲が限定的かつ体系づけられており学びやすい
- 点数や合否により定量的に実力が確認できる
- ハクが付く
    - 会社によっては昇進・昇給・一時金
    - 就職・転職等で実力を定量的に証明できる

## 資格を取るべき人
ずばり、新人・学生など未経験者・初心者にオススメします。業務遂行には資格取得とは別に勉強が必須ではありますが、**資格取得を足がかり**にすることで、しっかりとした土台の上に知識・経験を積み重ねることができます。
特に、**OJTを受けていて、場当たり的だな、どこまでできるようになったかわからないな**といった新人にありがちな悩みには有効だと思います。

## 資格以外の手段が良い人
逆にある程度業務を回せている人は資格をとっても役に立たないでしょう。
（もちろん昇給・昇進のためや、趣味・知的好奇心のために取得する意義はあるとは思います）
資格取得する分の時間で、自分の業務に関連した勉強をしたほうが良いかと思います。

# 最後に
エンジニアの勉強全般についても同様に、すぐ役に立たない/すぐに役に立つ の２択で考えると方向性が迷子にならないと思います。
アーキテクチャやアルゴリズムなど、エンジニアとしての幅を広げる勉強なら、すぐに役に立たない勉強だと割り切って即効性を期待しない方が良いです。なぜなら「**すぐ役に立つことは、すぐ役に立たなくなる**[^2]」からです。
一方、エンジニアにとっては最新の技術をすぐ試す・身につける場面も多くあるでしょう。でないと最新の技術動向に置いていかれます。ただ、その「最新技術」がいつまでも通用しないのは言うまでもありません。

結局身も蓋もない話ですが、「エンジニアは勉強し続けるべき」としか言いようが無いのです。

[^1]:その場合の資格は、既存の資格を別に生じた既存の業務に**無理やり当てはめた**場合もあるので、①+②の性質を持つと考え、諦めて別途勉強しましょう。
[^2]:慶應義塾大学塾長 小泉 信三氏の言葉
【Scala/Playframework】Twirlテンプレートエンジンの活用メモ

# はじめに

Scala/Playframework の Twirl を利用する時の活用集をメモしたものになります。
踏み込んだ内容ではなく、学習初期のメモなので Scala/Playframework を利用したての方を対象としています。

https://www.playframework.com/documentation/2.8.x/ScalaTemplates

利用時のバージョン

- Scala v2.xx
- Play v2.8.x

# 活用メモ集

## 1. 半角スペースの相殺・長文の改行

規約や説明文など複数行に渡る文章を記載する際、改行した時にスペースが入り込んでしまうことがある。
そのようなケースで `.scala.html` ファイルで文字列に、余計なスペースを持たせたくない時は、下記のように記述する。

```html:index.scala.html
@(
  Seq(
    "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "xxxxxxxxxxxxxxxxxxxxxxxxxxx"
  ).mkString("")
)
```

Seq でキリのいい文字列のところで分割し、 `mkString("")` でくっつけた、余計なスペースを持たない文章を出力させることができる。

## 2. ＠のエスケープ

`＠` の記号を文字列として利用したい場合は、 `@@` とすることで文字列として HTML に表示できる。

```
入力値： <span>huga.huga@@gmail.com</span>
出力値： huga.huga@gmail.com
```

## 3. forループ ・ Index の利用

複数アイテムをもつリスト要素を for ループする際、リストアイテムの Index を取得したい場合は、 `zipWithIndex` を利用する。

```scala:index.scala
val contentSeq = Seq("いちご", "ぶどう", "たまご")

```

```html:index.scala.html
<ul class="list">
  @for((item, index) <- contentSeq.zipWithIndex){
    <li class="item" id="data-@index">
      @item
    </li>
  }
</ul>
```

```html:出力値
<ul class="list">
  <li class="item" id="data-0">
    いちご
  </li>
  <li class="item" id="data-1">
    ぶどう
  </li>
  <li class="item" id="data-2">
    たまご
  </li>
</ul>
```

index を id に含めたりすると、リストでも一意の要素として扱えるようになる。

# さいごに

Twirl のちょっとした使い方や Tips 集のような形で記載しました。
メモ程度ですが久しぶりのアウトプットも兼ねて記載しました。

少しでもScala初学者のお役に立てれば嬉しいですmm
Nerves RaspberryPi VS MangoPi Lチカ点滅速度競争 

# はじめに

RISC-V搭載のMangoPiでNerves起動に成功したので、Lチカ速度競争をしてみました。

以前測定したRaspiと速度比較をしてみます。

https://qiita.com/GeekMasahiro/items/e9526add7135db12ac60


# 結果

|プログラム|H時間|L時間|周期|
|---|----|----|---|
|RaspberryPi Zero W|6.2μS|4.8μS|11.0μS|
|MangoPi           |10.6μS|10.6μS|21.2μS|

RaspberryPiの方が速いという結果でした。
OTPやElixirのバージョンが違うのでCPUの能力以外の違いもあるかもしれませんが、コア単独の性能としては、Raspiの方が高そうですね。

#　波形（MangoPi）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532235/6ef46d90-92bf-a188-52a9-14f30682b2e0.png)


# 実行プログラム

```Elixir
defmodule LED do
  alias Circuits.GPIO

  def start() do
    {:ok, output_gpio} = GPIO.open(36, :output)
    toggle_gpio(output_gpio)
  end

  def toggle_gpio(pin) do
    GPIO.write(pin, 1)
    GPIO.write(pin, 0)
    toggle_gpio(pin)
  end
end
```
AWS S3のWeb画面で、複数ファイルを一括ダウンロードするChrome拡張機能（Chrome,Edge）

# はじめに  
AWSのマネジメントコンソールで、複数オブジェクトにチェックを入れて、まとめてダウンロードしたくなりますよね。ただ「ダウンロード」ボタンが無効になってダウンロード出来ません。とにかく何とかしてみました！

# Chrome拡張機能
Chrome拡張機能を作りました。ChromeとEdgeで使用できます。  
↓バナーをクリックしてインストール

https://chrome.google.com/webstore/detail/s3-multiple-downloader/hkfgcimbcdngoekajjianmgelbhlckch?hl=ja

![s3_multi_dl_pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155165/2dc1d1cd-c15d-c335-6b3c-054b8f434a89.png)
説明の通り、Chrome拡張機能を入れると、追加のダウンロードボタンが表示されます。複数のオブジェクトにチェックを入れてこのボタンを押すことで、連続してダウンロードすることができます。


### 制約事項  
:::note alert  
(*1) フォルダはダウンロードできません。
(*2) 最初にS3オブジェクトのページで、画面リロードが必要です。
:::


# ソースコード  
Qiitaの技術記事なので、ソースコードと解説を書きます。
```script.js
const _sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const getS3Obj = async () => {
    const dl_btn = document.getElementById("download-object-button");
    let target=[];
    let input_list = document.querySelectorAll("input[type=checkbox]:checked");

    // 対象のチェックボックスを取得する
    input_list.forEach((e, index)=>{
        if (e.className.startsWith('awsui_native-input_')){
            target.push(index);
            input_list[index].click();
        }
    });
    // 1つずつチェックして、ダウンロードする。ウェイト1S
    for (let i = 0; i < target.length; i++) {
        input_list[target[i]].click();
        dl_btn.click();
        input_list[target[i]].click();
        await _sleep(1000);
    }
    // チェックボックスを元に戻す
    target.forEach((e)=>{
        input_list[e].click();
    });
}

// 拡張ダウンロードボタンを配置する
// icon: https://css.gg/arrow-down-o
const putButton = () => {
    const append_btn = document.getElementById("append-button");
    if (append_btn == null) {
        const pos = document.getElementById("download-object-button");
        if (pos == null) return;
        const btn = document.createElement('button');
        btn.type = 'button';
        btn.id = 'append-button';
        btn.onclick = getS3Obj;
        btn.className = 'gg-arrow-down-o';
        pos.parentNode.parentNode.insertBefore(btn, pos.parentNode.nextSibling);
    } 
}

// 1秒ごとに実行する
setInterval(putButton, 1000);
```
```manifest.json
{
    "manifest_version": 3,
    "name": "S3 Multiple Downloader",
    "description": "Download checked s3 objects all at once",
    "version": "0.0.1",
    "icons": {
        "48" : "s3_48.png"
    },
    "content_scripts": [
        {
            "matches": ["https://s3.console.aws.amazon.com/s3/buckets/*"],
            "js": ["script.js"],
            "css": ["script.css"]
        }
    ]
}
```


# 解説
- 設計はシンプルです。たいしたことはしていません。
  - チェックが入ったチェックボックスを覚える
  - 1つずつチェックを入れて、ダウンロードボタンを押す
  - チェックボックスを元に戻す  
  
(*1) このような動作のため、フォルダを選択してもダウンロード出来ないです。  

- ダウンロードが連続だとうまくいかず、1秒ウエイトを入れたら解消しました。
- ページの変更監視がうまくいかず、仕方なく1秒ごとに実行するようにしました。
MutationObserverで監視などをやってみたが、うまくいきませんでした。
- 対象のページに入ったときに実行されません。
 (*2) そのため、S3オブジェクトのページで、画面リロードが必要です。

# おわりに
- そもそも、複数ダウンロードを一括で出来ないようにしているのは理由があるのでしょう。こんなChrome拡張機能はどうなんでしょうね。
- AWSのマネジメントコンソールの仕様が変わったら使えなくなります。
- Chrome拡張機能は、いろいろできて面白いです！Edgeでも使えるとは驚きでした。
- 拡張ダウンロードボタンをスマートに配置する方法を知りたいです。

# 謝辞
- ボタンにしているCSSアイコンは https://css.gg から、使わせてもらいました。
【CodeStream】RepositoryをOrganizationに移動したらPull Requestが作成できなくなった

RepositoryをOrgに移動した後に、いつものようにCodeStreamからPull Requestを新規作成しようとしたところ、エラーが出る。。。

```
GitHub: Could not resolve to a Repository with the name 'xxxx/yyy'.: {"response":{"data":{"rateLimit":{"cost":1...
```

また、Pull Requestも見えない。。

原因は、Organizationアクセスへの許可設定していなかったことによるものだったというところで、その時に解決した手順を備忘録として記載。

1. GitHubにログイン
1. Settingsを開く（画面右上のアイコンからSettings）
1. Applicationsを選択
1. Authorized OAuth Appsを開く
1. CodeStreamを開く
1. Organization accessに、「grant」ボタンが表示されているので、ボタンを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2797166/29e75afb-0fb4-b5a9-1cc7-effbdabb7c5a.png)


CodeStreamを見ると、
- Pull Requestがちゃんと見えるようになり、
- 新しいPull Requestも作成できるようになった。

[参考サイト Why aren't PRs and issues from all of my GitHub organizations listed in CodeStream?](https://docs.newrelic.com/jp/docs/codestream/troubleshooting/github-org-repos/)
PythonでRedisに保存されたJavaオブジェクトを取得する

## 初めに
`javaobj-py`でRedisに保存されたJavaオブジェクトをPythonオブジェクトに変換してみました。手順は以下です。

## 1.まずredisに接続
PythonでRedisに接続するには、`redis-py`というRedisクライアントライブラリを使用します。
```
import redis
import javaobj.v1 as javaobj

# バイト列のまま：decode_responses=False
connec = redis.Redis((host='Redishost', port=6379, db=0,decode_responses=False)

serialized_java_data = connec.get('MyKey')

#バイト列であることを確認
print(type(serialized_java_data))
```

## 2.java objectを取得
```
# バイト列を読み取る
java_object = javaobj.loads(serialized_java_data)

# java_objectのパラメータvalueをアクセスしてみる（他のパラメータでもいい）
print(java_object.value) 
```
Javaで「2つのパスを結合する(Path.resolve,Path.resolveSibling)」の動作を確認してみた

# 概要
Javaで「2つのパスを結合する(Path.resolve,Path.resolveSibling)」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/file/index16.html

# 実装
以下のファイルを作成しました。
```JSample16_1.java
import java.nio.file.Path;
import java.nio.file.Paths;

class JSample16_1{
  public static void main(String[] args){
    Path p1 = Paths.get("C:/data/image");
    Path p2 = Paths.get("photo/profile.jpg");
    Path p3 = p1.resolve(p2);

    System.out.println(p1);
    System.out.println(p2);
    System.out.println(p3);
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample16_1.java 
$ java JSample16_1 
C:/data/image
photo/profile.jpg
C:/data/image/photo/profile.jpg
```
以下のファイルを作成しました。
```JSample16_2.java 
import java.nio.file.Path;
import java.nio.file.Paths;

class JSample16_2{
  public static void main(String[] args){
    Path p1 = Paths.get("data/image/stone.jpg");
    Path p2 = Paths.get("grass.jpg");
    Path p3 = p1.resolveSibling(p2);

    System.out.println(p1);
    System.out.println(p2);
    System.out.println(p3);
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample16_2.java 
$ java JSample16_2 
data/image/stone.jpg
grass.jpg
data/image/grass.jpg
```

# まとめ
何かの役に立てばと。
【SQL】GROUP BY句、ORDER BY句を使ったSQLでのデータ取得

SQLの基礎について復習しています。<br>
今回はgroup byやorder byを使った、条件を指定したテーブルの並べ替えての取得についてです。



# 問題
- 発売年毎の楽曲を取得しなさい。
- 楽曲数は降順に並び替えなさい。
- 出力する項目はrelease_year(発売年)とsongs_num(楽曲数)とする。

# 問題のテーブル
```
# songsテーブル
+------+--------------+--------------+--------------+
| id   | name         | release_year | total_minutes|
+------+--------------+--------------+--------------+
|    1 | songs1       |2000          |3:56          |
|    2 | songs2       |2007          |4:07          |
|    3 | songs3       |1988          |5:22          |
|    4 | songs4       |1997          |4:55          |
|    5 | songs5       |2016          |4:13          |
+------+--------------+--------------+--------------+
```

# 自分で書いたコード
```sql
select release_year
count id as('songs_num')
from songs
order by at desc;
```

# 答えのコード
```sql
SELECT release_year, COUNT(*) AS songs_num
FROM songs
GROUP BY release_year
ORDER BY songs_num DESC;
```

# この問題のポイント
- 発売年の降順で、テーブルを並べ替えて出力する。
- 楽曲の一覧の数を数えるので、count(*)とすればよい。
- 出力するのは、発売年と、発売年ごとの楽曲数である。


# 自分が間違っていた、勘違いしていたポイント
- selectとcountは、１行で表現しないとダメっぽい。
- 楽曲数('songs_num')ではダメ。()はいらないっぽい。
- as句で名前を変える時は、ダブルクォーテーション`""`で囲むのはOKだが、別に無くても大丈夫っぽい。
- order by句にはatはいらないっぽい。

# 参考サイト
https://www.sejuku.net/blog/72918

https://medium-company.com/sql-group-by/

https://it-biz.online/it-skills/group-by/
VNROM バイパス APK: Android で Google アカウント ロックをバイパスする安全でシンプルなソリューション

序章

急速に変化するデジタル世界において、スマートフォンは私たちの生活に欠かせないものとなり、そこには豊富な個人情報が保存されています。 このデータを保護するために、Google は工場出荷時設定にリセットした後のデバイスへの不正アクセスを防ぐことを目的としたセキュリティ機能である Factory Reset Protection (FRP) を導入しました。 FRP はデバイスのセキュリティにとって重要ですが、リセット後に Google アカウントの認証情報を忘れるとイライラする可能性があります。 幸いなことに、VNROM Bypass APK は、Google アカウントのロックをバイパスする安全かつ簡単な方法を提供する Android アプリケーションであり、デバイスへのアクセスを取り戻すことができます。

VNROM バイパス APK とは何ですか?

VNROM Bypass APK は、VNROM.net によって開発されたサードパーティ アプリケーションで、工場出荷時設定へのリセット保護によりロックアウトされた場合に、Android ユーザーがデバイスへのアクセスを回復できるように設計されています。 VNROM Bypass APK は Google によって承認されておらず、サードパーティ ツールのカテゴリに分類されるため、セキュリティと信頼性について懸念が生じる可能性があることに注意することが重要です。 それにもかかわらず、多くのユーザーは、他の方法で Google アカウント ロックをバイパスできない場合でも、VNROM バイパス APK を使用することに成功しています。

VNROM Bypass APK の機能と利点

ユーザーフレンドリーなインターフェイス: VNROM Bypass APK には簡単で直感的なインターフェイスが付属しており、技術に精通したユーザーとそうでないユーザーの両方がアクセスできます。

ユニバーサルな互換性: このアプリケーションは、さまざまなメーカーの幅広い Android デバイスと互換性があり、FRP バイパスの多用途なソリューションになります。

安全でセキュア: サードパーティのアプリケーションであるにもかかわらず、VNROM Bypass APK は安全で、ウイルスやマルウェアなどの有害な要素が含まれていないと評判です。 ただし、潜在的なリスクを回避するには、信頼できるソースから APK をダウンロードすることが重要です。

技術的な専門知識は不要: 複雑な技術手順とは異なり、VNROM Bypass APK を使用すると、ユーザーは複雑な技術知識や専門スキルを必要とせずに FRP をバイパスできます。

VNROM バイパス APK を使用して Google アカウント ロックをバイパスする方法

VNROM Bypass APK などのサードパーティ ツールを使用して FRP をバイパスすると、デバイスのサービス利用規約に違反する可能性があり、将来的に問題が発生する可能性があることに注意してください。 この方法は自己責任で使用してください。デバイスの製造元または Google に公式サポートを求めることを常にお勧めします。

ステップ 1: VNROM バイパス APK をダウンロードする

まず、信頼できるソースから VNROM Bypass APK をダウンロードし、Android デバイスのストレージまたは SD カードに保存します。

ステップ 2: 不明なソースからのインストールを有効にする

Android デバイスの [設定] に移動し、デバイスのバージョンに応じて [セキュリティ] または [プライバシー] に移動します。 「不明なソース」オプションを探してオンにすると、Google Play ストア以外のソースからのインストールが許可されます。

ステップ 3: VNROM バイパス APK をインストールする

ファイル マネージャーを使用して、ダウンロードした VNROM Bypass APK ファイルを見つけてタップし、インストール プロセスを開始します。 画面上の指示に従ってインストールを完了します。

ステップ 4: Google アカウントのロックをバイパスする

インストールが完了したら、VNROM Bypass APK を開きます。 アプリケーションは、Google アカウントのロックを回避する手順を案内します。 バイパスを確実に成功させるために、指示に注意深く従ってください。

結論

VNROM Bypass APK は、Android デバイスで Google アカウントのロックの問題に直面しているユーザーに潜在的な解決策を提供します。 これは便利なツールですが、注意を払い、サードパーティ アプリケーションの使用に伴う潜在的なリスクを理解することが重要です。 常に信頼できるソースから VNROM バイパス APK をダウンロードするようにし、FRP をバイパスするとデバイスの保証とセキュリティに影響を及ぼす可能性があることに注意してください。 いずれの場合も、プロセスが不明な場合や問題が発生した場合は、デバイスのメーカーまたは Google に公式サポートを求めることをお勧めします。
https://frpvnrom.com/vnrom/
Viveデバイスの情報を取得する

UnityでVive Tracker・Vive ControllerのIDや接続状態、電池残量など情報をしたかった

## 接続状態を取得する

OpenVR.System.GetTrackedDeviceActivityLevelの第一引数に「接続されているデバイスの番号」を代入すると取得できる

``` ViveDevice.cs
using Valve.VR;
public class ViveDevices : MonoBehaviour
{
    void Update()
    {
        if(OpenVR.System.GetTrackedDeviceActivityLevel(0) == EDeviceActivityLevel.k_EDeviceActivityLevel_Idle)
        {
            // Idle状態(SteamVRでデバイスが点滅している状態)
        }
        else
        {    
            // Active状態
        }
}
```


## IDを取得する

OpenVR.System.GetStringTrackedDevicePropertyの第一引数に「接続されているデバイスの番号」
第二引数に「ETrackedDeviceProperty.Prop_SerialNumber_String」を代入すると取得できる

``` ViveDevice.cs
using Valve.VR;
public class ViveDevices : MonoBehaviour
{
    void Start()
    {
        string serialNumber = GetStringProperty(0, ETrackedDeviceProperty.Prop_SerialNumber_String);
    }
    
    string GetStringProperty(uint i, ETrackedDeviceProperty property)
    {
        ETrackedPropertyError error = ETrackedPropertyError.TrackedProp_Success;
        uint bufSize = OpenVR.System.GetStringTrackedDeviceProperty(i, property, null, 0, ref error);
        if (error != ETrackedPropertyError.TrackedProp_BufferTooSmall)
        {
            return null;
        }
        System.Text.StringBuilder buff = new System.Text.StringBuilder();
        buff.Length = (int)bufSize;
        OpenVR.System.GetStringTrackedDeviceProperty(i, property, buff, bufSize, ref error);
        if (error != ETrackedPropertyError.TrackedProp_Success)
        {
            return null;
        }

        return buff.ToString();
    }
}
```


## 電池残量を取得する

OpenVR.System.GetFloatTrackedDevicePropertyの第一引数に「接続されているデバイスの番号」
第二引数に「ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float」を代入すると取得できる

``` ViveDevice.cs
using Valve.VR;
public class ViveDevices : MonoBehaviour
{
    void Start()
    {
        float trackerDevicesBattery = GetFloatProperty(0, ETrackedDeviceProperty.Prop_DeviceBatteryPercentage_Float);
    }
    
    float GetFloatProperty(uint i, ETrackedDeviceProperty property)
    {
        ETrackedPropertyError error = ETrackedPropertyError.TrackedProp_Success;
        return OpenVR.System.GetFloatTrackedDeviceProperty(i, property, ref error);
    }
}
```
jQueryのプラグイン「slick」をCDNで使う際の初歩的な注意点

今回CDN[^1]を利用し、jQueryのプラグインであるslickを使ってスライドを作成したところ、スライドが動かないという問題に直面しました。
調べてみたところ非常に初歩的なミスだった為、備忘録代わりに書き残します。
[^1]: 「Contents Delivery Network」の略。コード内にURLを記載することでオンライン上のライブラリが簡単に利用できる方法。

# あれ？コードを書いたのにスライドが動かない？
html、css、js、画像を用意し、htmlファイルのbody直下に下記コードを記載しましたが、スライドが動きませんでした。
```html
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<script src="./js/slideshow.js"></script>
```
パスは合っているのになぜ・・・？
自己解決はできなかった為、早速グーグル先生に聞いてみました。

# jQuery本体を上、slickのスクリプトを下に記載すること！
原因は単純明快、**jQuery本体より上にslickのスクリプトを記載してしまっていた**ことでした。
slickに限ったことではありませんが、jQueryを使う際にはスクリプトよりも上でjQuery本体を読み込む必要があります。
この順番を厳守しないとjQueryのコードは動きません。
原因が分かったところで、下記のようにコードを書き替えました。
```html
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
<script src="./js/slideshow.js"></script>
```
これで問題なくスライドが動きました！

# まとめ
プログラミング初心者の皆さん(主に自分)、jQueryを利用する際には、
**1.ライブラリ本体のパスを記載**
**2.スクリプトのパスを記載**
この順番を厳守するように気を付けましょう！

## 参考
[slickのスライダーが動かない6つの原因【WordPressのケースも解説】](https://rilaks.jp/blog/slick-not-work/#jqueryslickjquery)
【Python】与えられた月と年を基に、築年月を求めるコードを実装

# 概要
Pythonで、与えられた月と年を基に、現在の日付との差を計算して築年月を求めるコードを実装しました。その際、細かな注意点があることも記載します。

# サンプルコード
以下に二つの関数を記載しました。
どちらも築年月を抽出するコードです。
```py
from datetime import datetime

# 関数1
def calculate_age_month_1(month, year):
    start_date = datetime(int(year), int(month), 1)
    end_date = datetime.now()
    duration = end_date - start_date
    years = duration.days // 365
    months = (duration.days % 365) // 30

    return '築' + str(years) + '年' + str(months) + 'ヶ月'

chikunengestu = calculate_age_month_1(9, 1936)
print(chikunengestu)

# 関数2
def calculate_age_month_2(month, year):
    current_date = datetime.now()
    input_date = datetime(year, month, 1)
    years = current_date.year - input_date.year
    months = current_date.month - input_date.month
    
    if months < 0:
        years -= 1
        months = 12 + months
    
    return '築' + str(years) + '年' + str(months) + 'ヶ月'

chikunengestu = calculate_age_month_2(9, 1936)
print(chikunengestu)
```

しかし、実はこのコード、結果は以下のとおりです。

```
築86年12ヶ月
築86年11ヶ月
```

なぜ1ヶ月のずれがあるのでしょうか？

それは、関数1の方では「1年を365日、1ヶ月を30日」と仮定しており、日数を30日で割ることによって月数を計算しようとしている点にあります。月数を日数で単純に割ると、30日未満やの月や31日ある月もすべて1ヶ月として計算され、計算結果がずれてしまうのです（正確な月数を考慮していない）。

ちなみに2023年8月現在から計算すると1936年9月ではズレが発生することが確認できました。1936年8月を渡してあげると、どちらの関数でも築87年0ヶ月という結果になりました。

ということで、正確に築年月を抽出する場合は関数2の方を使いましょう。

ちなみに、`datetime(year, month, 1)`の中の`1`は、指定した年と月に対して、1日目を表しています。これにより、指定された年と月の最初の日を表す`datetime`オブジェクトが生成されます。

## `TypeError: 'module' object is not callable`エラー
import文で`import datetime`とだけ書くと、以下のエラーになります。

```
TypeError: 'module' object is not callable
```

これは、`datetime`モジュールには`datetime`以外にも`date`、`time`などのオブジェクトがあり、`datetime`モジュールの`datetime`オブジェクトを指定してあげる必要があるためです。

参考：[【Python】「TypeError: ‘module’ object is not callable」の対処法](https://education.r-jc.jp/python/%E3%80%90python%E3%80%91%E3%80%8Ctypeerror-module-object-is-not-callable%E3%80%8D%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/)
Macでデフォルトのアプリをアンインストールする方法

# 0.Intro
デザイナーの方向けにMacを導入しています。それらのMacをActive DirectoryにMacを参加させて使いたいと色々調査してます。だいたい大丈夫なのですが、気になる点があり、それがデフォルトでインストールされているアプリが悪さしてそうでした(どうも濡れ衣っぽかったですが)。なので、アンインストール方法を調べました。

こちらのサイトを参考に調査しました。
https://nektony.com/how-to/uninstall-default-apple-apps-on-mac

ポイントは全てリカバリモードで作業する点でした。
以下の手順でデフォルトのアプリを削除できました

# 1.手順

1.リカバリーモードに入る
![macos-ventura-recovery-mode-options-list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66198/084e323a-1f2f-e138-82c4-1a1f2b33da41.png)

2.ターミナルを起動
![DSC010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66198/ea7af2ae-d0a9-2f2b-795a-1bd07f4d094e.png)

3.以下で、Mac全体の設定変更
```
csrutil disable
csrutil authenticated-root disable
```
4.再起動

5.ディスクユーティリティを起動
6.ストレージ全体を一旦アンマウントし、再度マウント　__※こちらでシステム領域が書き込み可になる__
![macos-monterey-recovery-mode-disk-utility-container-disc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66198/7de521fb-22e4-74e3-9e7e-008bef0844d4.png)

7.再度ターミナルを起動し以下の作業
```
cd /Volume/Macintosh HD/System/Application

rm -rf  Safari.app
rm -rf  Mail.app
rm -rf  FaceTime.app
rm -rf  TV.app
rm -rf  Podcast.app
rm -rf  Music.app
```
VenturaではSafariの場所が異なると上記のサイトに情報あり。

```
cd /Volume/Macintosh HD/user/bin
bless --folder /Volume/Macintosh HD/System/Library/CoreServices --bootefi --create-snapshot
```
リカバリーモードのターミナルはblessへのパスが通っていないので直接叩く。

__追記__
Apple Silicon Macの場合は以下でした
```
cd /Volume/Macintosh HD/user/bin
bless --mount /Volume/Macintosh HD/System/Library/CoreServices --bootefi --create-snapshot
```


8.Mac全体の設定を戻す
```
csrutil enable
csrutil authenticated-root enable
```
9.再起動


以上でデフォルトアプリが消えます。

# 2. 考察
以上で消せますが、ただシステム全体に影響しないかどうか。副作用までは調査してません。Safariなんて消して本当に無傷なのかなぁと気にはなります。。。
DASH 2023で発表されたDatadogの新機能！日本語まとめ

意外と日本語のいい記事がまだ無かったので自分用にまとめます。

https://www.dashcon.io/

　　　　↓

:::note info
2023/8/14更新：公式ページの日本語版が出ました🎉
:::

https://www.datadoghq.com/ja/blog/dash-2023-new-feature-roundup/



# LLM＆AI関連

### AI Stack Observability

LLMアプリケーションの開発、デプロイ、運用をサポートするモニタリング機能。


### LLM Observability

LLMアプリの問題をリアルタイムに検出できる。アラート確認、パフォーマンス監視、精度劣化検出など。ベータ版。


### Bits AI

自然言語でDatadogへクエリー問い合わせを行うことができる。Datadog版のコパイロット。



# ログ管理

### Flex Logs

大量のログ保管＆検索ができる。アーカイブでもインデックスでもないデータに最適。


### Live Search for Datadog Log Management

直近15分間のログをサンプリング間引きなしでライブ検索できる。プライベートベータ版。


### Reference Tables

ログ内のデータを（ログにはない）別の情報と紐づけて分析できる。



# APM＆サービス管理

### Production variable snapshots

エラー時のアプリケーション内の各変数の値をスナップショット保存してくれる。


### Service Scorecards

サービスカタログ内で各サービスのスコアを点数表示してくれる。



# セキュリティ

### Security Inbox

Cloud Security Managementの新機能。セキュリティに関する問題の通知をまとめて確認できる。


### Cloud Security Managementのエンハンス

コンテナやホストの脆弱性検出、CIEMに対応


### Cloud SIEMのエンハンス

リアルタイム検出だけでなく、過去15ヶ月間の脅威調査に対応



# おわりに

すみません、予想以上に多すぎて途中で力尽きました 😂
全量はこちらに。

https://www.datadoghq.com/ja/blog/dash-2023-new-feature-roundup/



# その他、参考文献

https://prtimes.jp/main/html/searchrlp/company_id/77474

https://japan.zdnet.com/article/35207460/
[AWS Q&A 365][ECS]AWSのよくある問題の毎日5選 #102

Here's the translation in Japanese:

# 1. コンテナエージェントエンドポイントとは何ですか？
答え: コンテナエージェントエンドポイントは、ECSコンテナエージェントがコンテナインスタンスのメタデータやタスクメタデータを送信するURLです。

# 2. コンテナエージェントエンドポイントはどのように使用されますか？
答え: コンテナエージェントエンドポイントは、ECSコンテナエージェントがコンテナインスタンスとタスクのメタデータをECSサービスに送信するために使用されます。

# 3. コンテナエージェントエンドポイントはどこで見つけることができますか？
答え: コンテナエージェントエンドポイントはECSコンソールで見つけることができ、またAWS CLIやSDKを通じて取得することができます。

# 4. コンテナエージェントエンドポイントを変更することはできますか？
答え: いいえ、コンテナエージェントエンドポイントはECSサービスによって自動生成されるため、変更することはできません。

# 5. コンテナエージェントエンドポイントに接続できない場合、どうなりますか？
答え: コンテナエージェントエンドポイントに接続できない場合、ECSコンテナエージェントはECSサービスにメタデータを送信することができず、タスクのスケジューリングや管理に問題が生じる可能性があります。
[AWS Q&A 365][ECS]Daily Five Common Questions #102

#  1. What is the Container agent endpoint? 
Answer: The Container agent endpoint is a URL to which the ECS container agent sends container instance metadata and task metadata. 

# 2. How is the Container agent endpoint used? 
Answer: The Container agent endpoint is used by the ECS container agent to send metadata about the container instance and tasks to the ECS service. 

# 3. Where can I find the Container agent endpoint? 
Answer: The Container agent endpoint can be found in the ECS console or obtained through the AWS CLI or SDK. 

# 4. Can the Container agent endpoint be modified? 
Answer: No, the Container agent endpoint cannot be modified as it is automatically generated by the ECS service. 

# 5. What happens if the Container agent endpoint is unreachable? 
Answer: If the Container agent endpoint is unreachable, the ECS container agent will not be able to send metadata to the ECS service, which may result in issues with task scheduling and management.
SwiftでRangeからn回繰り返して、異なる結果のArrayを取得する

例えば、異なるUUID10個の配列が欲しい場合
```swift
(0..<10).map { _ in UUID().uuidString }

# (10 elements) ["F4B0C448-0E10-40BF-9AAA-70FFEBB3307C", "16EC149E-7B1B-4A29-B32A-ED02B65FEC93", "398F2B91-9C9D-4526-8969-BAAD8B5A458E", "2C55C5B2-8110-410D-A8C9-34244F5BFA5B", "B0FB472D-12DB-4321-87E0-75C0E745ED39", "48A8D711-3AE8-4C76-A958-2AB02304ED63", "62B6EE3B-8EEB-47C7-A4FD-501D9CB34FE1", "71719DFB-D2D5-4005-B96E-0C8A5CDBE805", "61FB03FE-A233-4073-B72C-236D8EA5529C", "380133B2-96AB-43F6-B4D6-E6454895375C"]
```

ちなみに↓はすべて同じUUIDが返ってくる
```swift
Array(repeating: UUID().uuidString, count: 10)

# (10 elements) ["2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479", "2167A236-2797-487B-9B85-63FA3BFCC479"]
```

とりあえず思いついて動いたのでメモ。他に良い方法があれば教えてください。
Leetcode 74. Search a 2D Matrix

https://leetcode.com/problems/search-a-2d-matrix/

# アプローチ
- binary search

```java
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        for (int[] m : matrix) {
            Arrays.sort(m);

            int left = 0;
            int right = m.length - 1;

            while (left <= right) {
                int mid = (left + right) / 2;
                if (m[mid] == target) {
                    return true;
                }

                if (m[mid]  < target) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return false;
    }
}
```
Dockerコンテナ内のファイルを編集する方法

# 前提
ホストマシン(自分のPC)上にあるファイルではなく、Dockerコンテナ内のファイルを編集したいときの手順をまとめました。

## 使用環境
- M2 macbook air
- macOS Venrura13.3
- zshではなく、bash

# DockerコンテナのIDや名前を調べる
ターミナルでdocker-compose.ymlが置いてあるディレクトリへ移動して、以下のコマンドを実行します。

```terminal
docker ps
```

以下のように表示されたら、何もコンテナが動いていません。`docker-compose up -d`でコンテナを動かしてください。
```terminal
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

`CONTAINER ID`の下に書いてあるのが、コンテナIDです。
データベース等を動かしているコンテナではなく、ソースコードを動かす時に使っているコンテナのコンテナIDを使います。
docker-compose.ymlファイルと見比べてみて、見当をつけてください。

ちなみに、最近ではDocker Desktopを使用している方がほとんどだと思いますが、Docker DesktopからもコンテナIDを確認することができます。
Docker Desktopの左メニューからContainersを選択するとコンテナ一覧が出ます。コンテナ名の左側の＞を押すと、コンテナイメージの下に小さくIDが出てます。コピーもできるので、こちらも便利です。

# Dockerコンテナのシェルへ接続
あとは以下のコマンドで接続ができます。
```terminal
docker exec -it コンテナ名かID bash
```

# Dockerコンテナの接続から抜けるには
```terminal
exit
```
Linuxでファイルを上書き不可・削除不可にする

`chattr +i` しておくと削除も上書きも追記もできなくなる。
`lsattr ファイル名` で属性確認し、
`chattr -i` で属性削除。

```console
$ touch hoge
$ chattr +i hoge
$ lsattr hoge
----i---------e------- hoge
$ echo aaa > hoge
zsh: 許可されていない操作です: hoge
$ echo aaa >> hoge
zsh: 許可されていない操作です: hoge
$ rm hoge
rm: 'always' を削除できません: 許可されていない操作です
$ chattr -i hoge
```

`i` フラグの意味は：
```
       i      A  file  with the 'i' attribute cannot be modified: it cannot be deleted or renamed, no link can be created to this file, most of the file's metadata can not be modified, and the file can not be opened in write mode.
              Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE capability can set or clear this attribute.
```
スッキリわかるJava入門 第３版を読んでみて- part６ -複数クラスを用いた開発

# はじめに
こんにちは(・ω・）ﾉ
今回はクラスの分割について学びました！
## 第６章　複数クラスを用いた開発
### 1.ソースファイルを分割する
前回メソッドを複数に分けることを学んだ
だが...
メソッドの数が増えるとソースコードの全体を把握することが難しい...
⇨複数のソースファイルに分割して記述をする
　≒複数のクラスに分けて開発する

メリット
ファイルごとに開発を分担し、分業がしやすくなる

1つのプログラムを複数の部品に分けること...部品化

計算機プログラムの分割
元のプログラム
```
public class Calc {
    public static void main(String[] args){
        int a = 10; ing b = 2;
        int total = tasu(a,b);
        int delta = hiku(a,b);
        System.out.println("足すと"+total+"引くと"+delta);
    }

    public static int tasu(int a,int b){
        return(a+b);
    }

    public static int hiku(int a,int b){
        return(a-b);
    }
}
```
↓
2つに分割
計算処理のClacLogicファイル
```
public class ClacLogic {
    public static int tasu(int a,int b){
        return(a + b);
    }

    public static int hiku(int a,int b){
        return(a - b);
    }
}
```
mainメソッドのあるClacファイル
```
public class Clac  {
    public static void main(String[] args){
        int a = 10; ing b = 2;
        int total = tasu(a,b);
        int delta = hiku(a,b);
        System.out.println("足すと"+total+"引くと"+delta);
    }
}
```
しかしClacにはtasu()hiku()のメソッドがないため呼び出せない
↓
```

int total = ClacLogic.tasu(a,b);
int delta = ClacLogic.hiku(a,b);
```
のように`クラス名.メソッド名`で呼び出す必要がある
 `.`は「〜の」という意味がある
### 2.複数クラスで構成されるプログラム
:sparkles:javaプログラムの完成品
・javaプログラムの完成品は、複数のクラスファイルの集合体
・誰かに配布する場合には、すべてのクラスファイルを渡す必要がある

実行方法
`java クラス名`
mainメソッドが含まれているクラスの名前を指定する

:sparkles:複数の完成クラスファイルを渡す場合の注意点
すべてのクラスファイルを渡すだけではなく、
「mainメソッドが含まれているクラス名」も伝える必要がある
### 3.パッケージを利用する
クラス数が多くなると管理が大変に...
⇨ パッケージ...グループに所属させて分類・管理できる仕組み

:pencil2:クラスをパッケージに所属させる
`package 所属させたいパッケージ名;`
※パッケージに親子関係や階層関係はない

パッケージ名を添えたクラス名
⇨完全限定クラス名(完全修飾クラス名、FQCN)
:pencil2:完全限定クラス名(FQCN)の指定
`パッケージ名.クラス名`

:pencil2:FQCN入力の手間を省くための宣言
`import パッケージ名.クラス名;`
### 4.パッケージに属したクラスの実行方法
:pencil2:javaコマンドの正確な構文
`>java 起動したいクラスの完全限定クラス名（FQCN）`

:question:なぜクラス名を指定するのか...?
クロスローダー
完全限定名を指定されたら、その名前を持つクラスのクラスファイルをPC内から検索し、JVMに読み込んで利用可能にする
　　※JVM...起動時に指定されたクラスのmainメソッドを呼び出し、プログラムを実行する
↓
クロスローダーはクラスパスを使いながらクラスファイルを探してくる

クラスパスの指定方法
1.起動時にjavaコマンドで指定する
2.検索場所をOSに登録する
3.特に指定しない
クラスパスで指定できる対象
1.フォルダの場所
2.クラスファイルが入ったJARファイルやZIPファイル
3.複数のフォルダ、JAR/ZIPファイル、それらの組み合わせ

### 5.名前空間
パッケージを使うことのもう１つのメリット
⇨自分の作るクラスに対して自由に名前をつけることができる
　⇨パッケージが異なれば同じ名前もつけることができる
名前が同じになっても大丈夫

:question:パッケージが同じ名前のときは？
　ダメになる
そうしないために...
パッケージ名はインターネットドメインを前後逆順にしたものから始まる
パッケージ名を推奨されている

### 6.java APIについて学ぶ
Hell Worldのような１つだけのクラスも実は...
他の数百個のクラスと連携して動く、多数のクラスからなるプログラム
↓
数百個のクラスはjavaに初めから標準添付されているクラス
⇨ __API__

APIは通常「java」「Javax.」で始まるパッケージを用いている

どのようなAPIがあるかの説明書... __APIリファレンス__
## まとめ
ソースファイルの分割、複数クラスについては理解することができました
パッケージの利用もどういった使い方をするのかはなんとなく理解はしました
ただ、見てすぐパッケージを使っているか判断したり具体的な動き方がどうなっているのかというコードの中での応用という部分では多分理解しきれていないと感じたのでまた復習したです。
APIについて簡単なHellWorldを出す１つのクラスでもその裏では数百個のクラスが動いているのはすごいと感じました

今回もありがとうございました！
ではまた〜　＊˙︶˙＊)ﾉ"