OmniAICreator/Qiita-1.07M huggingface dataset:
JavaGold SE11 黒本 13章 選択肢を選ぶための重要ポイント

現在対策中のJavaGold SE11の黒本の13章で、回答を選ぶ上で重要と感じたポイントをまとめた。

記事というよりかは隙間時間に見る単語帳のようなノリで作成している。
今後も項目は増える予定。
頭の数字は設問の番号

★は13章を解くうえで何度も判断基準にした特に大事なもの



## 2.ava.util.file.FilesクラスのlinesメソッドはStreamを戻す。readAllLinesメソッドはListとして戻す。

## 5.中間処理filterはfilterメソッドは Predicate<T> を引数に取る★

## 5.CollectorsクラスのgroupingByはMap型を戻す。

## 6.Comparatorインタフェースは2つのオブジェクトを受け取って比較するcompareメソッドを実装している★

## 6.Comparatorインタフェースはintを戻す★

## 6.Comparatorインタフェースのcompareメソッドの引数の型は、ジェネリクスの型パラメータとして受け取った型★

## 17.Stream型は、ストリームで扱う要素の型を型パラメータとして受け取るが、型パラメータを指定しなければObject型のストリームで扱われる。ラムダ式の中でObject型でないものが登場していないか注意する。★

## 21.ifPresentメソッドは結果が存在すれば渡されたConsumer型の処理を実行するが、結果が存在しなければ何もしない。

## 32.StreamとIntStreamは互換性がないため、IntStream型の変数をStream型の変数に変換することはできない。

## 36.ListのcopyOfメソッドは変更不可なListを戻す

## 37.valuesメソッドは、列挙子が持っている列挙子(定数)の配列を戻す。

## 37.valuesOfメソッドはStringクラスのメソッドで、参照の持つtoStringメソッドを呼び出す。

## 37.toStringメソッドはObjectクラスに定義されたオーバライド前提のクラス

## 43.collectは終端処理なのでこの後にメソッドがあったら×

## 44.ListインタフェースのreplaceAllメソッドは引数にUnaryOperator型のラムダ式を受け取る

## 44.ジェネリクスを利用するときはボクシングは行われない。ジェネリクスの型パラメータがInteger型ならInteger型しか取り扱えないし、
型パラメータを指定しないならObject型しか扱えない★

## 45.RandomクラスのnextIntメソッドはクラスメソッドなのでnewしないといけない。メソッド参照はできない

## 46.IntStreamインタフェースのaverageメソッドはOptionalDouble型を戻す。

## 46.コレクションのparallelStreamメソッドはStream型を戻す。

## 46.ストリームのparallelメソッドはStream型を戻す。

## 46.Streamにはaverageメソッドはない。

## 46.OptionalDoubleにparallelメソッドはない。

## 47.StreamインタフェースのanyMatchメソッドはboolean型を戻す。

## 47.Streamインタフェースのfilterメソッドはstream型を戻す。

## 47.StreamインタフェースのfindAnyメソッドはOptional型を戻す。

## 48.Comparatorインタフェースのcomparingメソッドは並び替えで利用するキーを受け取り、そのキーを使って並び替えるComparator型オブジェクトを戻すメソッド

## 48.ComparatorインタフェースのthenComparingメソッドは、直前のcomparingメソッドが比較対象の二つが等しいと判断した場合、追加の条件で並び替えるComparator型オブジェクトを戻すメソッド

## 50.Streamインタフェース、IntStreamインタフェースなどのiterateメソッドは第一引数に初期値、第二引数に初期値に対して何らかの演算を行うUnaryOperator型のラムダ式を渡すことでラムダ式を実行しながら初期値から始まる無限に続くストリームを構築する。
wc代替rubyスクリプト

### サンプルソース

対象ディレクトリのファイルの行数を合計します。

```wcl.rb
files = Dir.glob("target/*.csv")
count = 0
files.each do |file|
  File.foreach(file) {}
  count += $.
end
puts count
```

### 【背景】`wc -l` は、最終行の改行有無を吸収してくれない

ファイルの行数をみるのに`wc -l`を使うことが多いのですが、残念ながら最終行に改行がないと１行扱いしてくれません。

不満はあれどファイルの最後に改行がつくかどうかはケースバイケースです。なんなら標準入力の最後に改行がつくかどうかも怪しいです。

CSVファイルなどは最終行に改行がなくともその後の処理系では問題なく処理されるので、なおさらファイル最後の改行の有無は混在します。

ということで、`wc -l` ではどうにもならないので、別スクリプトを書くしかないということです。

### ソースの解説

```
files = Dir.glob("target/*.csv")
```
汎用コマンドにするほどのことでもないので対象ディレクトリはハードコーディングです

```
  File.foreach(file) {}
　count += $.
```
一気にメモリに読み込むと大きなファイルがあったときにメモリ溢れとなりますので、foreachで行単位で読み込みます。行数を数えるだけなのでループ回すだけです。

そしてファイルが読み終わったら「読み終わった行数」を`$.` というグローバル変数からもらいます。Perl文化ですね。

### どういうシーンで使われるか

業務系システムって何かと「ファイルの納品ができたかどうか」が問われます。行数のチェックがやたらと多い。そんなわけで最終行の改行の有無が混在した状態での行数報告ってのは割と多いですよというお話でした。
IntelliJ IDEAで背景色などはコピーしたくない

## 文字色や背景色は要らない

テキストをIntelliJ IDEAからコピーして他に貼り付けたら、文字色や背景色までコピーされてしまっていてイラッとした、そんな場合の対処法。

なお`IntelliJ IDEA`と書いてますが多分JetBrains系のIDEで共通の話だと思います。
今回、検証で使っているのは`IntelliJ IDEA 2024.3 Beta(Community Edition)`で、環境はmacOSです。

### 右クリックメニュー

シンプルな方法としては、右クリックメニューから`Copy / Paste Special` > `Copy as Plain Text`でプレーンテキストとしてコピーする、という手があります。

### 設定を変える

そもそも色などの情報は基本的に不要という人も多いと思います。その場合、設定を変えればいいです。

設定画面で `Editor` > `General` を開き、その中の`Rich-Text Copy`という箇所に`Copy（⌘C） as rich text`という設定項目があるので、このチェックを外してあげればいいです。


![スクリーンショット 2024-11-03 11.36.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/463b3de8-8c09-2d36-eb8c-f5cd31023cfc.png)


## ちなみに欲しくなった時は

普段は要らないんだけど、リッチテキストとしてコピーしたい時もある、という場合は、右クリックメニューから`Copy as Rich Text`を選択すれば良いです。

また、Keymapにも`Copy as Rich Text`が用意されているので、使いやすいショートカットを設定しておいても良いかもしれないですね。

![スクリーンショット 2024-11-03 11.45.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/81343702-ec84-8978-899f-794a49f681c0.png)
CSSを学びたい！Step14 (特定の行数でテキストを省略する)

## はじめに
CSSを学びたいStep14です。特定の行数でテキストを省略する**line-clamp**をご紹介します！！

## 成果物
![line.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/3c82b64f-a27a-19d9-cdc3-d9264ebc4102.gif)

## ソースコード
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>複数行テキスト省略の例</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="multiline-ellipsis">
        これは非常に長いテキストで、複数行にわたって表示されますが、指定された行数を超えると省略されます。これは非常に長いテキストで、複数行にわたって表示されますが、指定された行数を超えると省略されます。これは非常に長いテキストで、複数行にわたって表示されますが、指定された行数を超えると省略されます。
    </div>
</body>
</html>
```

```css:styles.css
.multiline-ellipsis {
    display: -webkit-box; /* Flexboxの代わりにWebkit Boxを使用 */
    -webkit-box-orient: vertical; /* ボックスの方向を縦に設定 */
    overflow: hidden; /* はみ出した部分を隠す */
    text-overflow: ellipsis; /* はみ出した部分を「...」で表示 */
    -webkit-line-clamp: 3; /* 表示する行数を設定 */
    line-clamp: 3; /* 非標準プロパティ（互換性のため） */
    line-height: 1.5em; /* 行の高さを設定 */
    max-height: 4.5em; /* 行数に応じた最大高さを設定 (1.5em * 3行) */
}
```
→実務でも利用する機会は多そうなので、知っておくと良さそうですね！！
【AWS】EC2を触りつつ踏み台サーバー環境を構築する

# はじめに
<!-- 発端や概要を記載 -->
本記事ではインフラ初学者がVPCを触りつつ、ネットワークを学んでいく内容になります。

既存の環境として、以下のような構成があります。
![sampe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/5e9b4c7f-0c87-ab45-e161-fb09cb79e4cf.png)

上記構成を元に、色々リソースを付け加えていく形で勉強を進めていけたらと思います。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. プライベートサブネットを追加してみる
1. プライベートサブネットにDBサーバー（仮）を構築する
1. 踏み台サーバーを経由してDBサーバーにSSH接続する
1. まとめ

<!-- 各チャプター -->
## プライベートサブネットを追加してみる

以下の構成を作るために、プライベートサブネットを作成していきます。
![sampe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/b66c147a-10f2-6b43-1cd1-4da43c1654ea.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/4154a25b-165e-76e3-33e9-f647d97ab586.png)

:::note warn
注意
別々のAZにサブネットを作成するとAZ間の通信費用が発生するので、ハンズオン学習では同一AZに作成すること
:::

## プライベートサブネットにDBサーバーを構築する

![sampe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/e3ca427f-5041-3856-8eb1-cc5e02de4930.png)

では、プライベートサブネットにDBサーバー（仮）を作成していきたいと思います。
DBのインストール作業は別の記事で実施します汗

OS、インスタンスタイプ等はパブリックサブネットに作成してあるEC2（踏み台サーバー）と同様にします。


#### キーペア
新規で発行します。
バブリックサブネットにあるEC2に秘密鍵を持たせて、SSH接続を実現させます。

:::note info
キーペアについて
キーペア作成時にダウンロードされるpemファイルが**秘密鍵**、
EC2が保持している鍵は**公開鍵**になります。
:::

#### ネットワーク設定
先程作成したプライベートサブネットを選択して、パブリックIPの自動割り当ては無効化にします。
プライベートIPに関しては「高度なネットワーク設定から」＞「プライマリIP」で指定します。

#### セキュリティグループ
インバウンドルールに「3306」を追加します。
ソースタイプは「任意の場所」にしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/bacf14e0-02df-7650-4b5f-5977d928b2f7.png)

:::note info
疎通確認について
インバウンドルールにICMPも許可しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/74fd335e-70a5-bc5d-3170-ded10a95806f.png)
:::

## 踏み台サーバーを経由してDBサーバーにSSH接続する
![sampe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/665f0c27-0df1-f71e-e6f3-f202168a83e2.png)

ローカルにダウンロードされたDBサーバーの秘密鍵を踏み台サーバーにコピーします。
```terminal:ローカル
% scp -i <認証させる秘密鍵ファイル> <コピー元ファイル> <コピー先>
```
:::note info
scpについて
認証させる秘密鍵ファイル：コピー先ホストの秘密鍵
コピー元ファイル：コピーさせたいファイル
:::

コピーが完了したら安全性を高めるために、秘密鍵のパーミッションを変更します。
```terminal:踏み台サーバー
% chmod 400 <コピーした秘密鍵>
```
上記の手順が完了したら、踏み台サーバーからDBサーバーへ
ssh接続してみます。

```terminal:踏み台サーバー
% ssh -i <認証させる秘密鍵ファイル> ec2-user@<DBサーバーのプライベートIP>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3857754/8e71e3b8-42dc-2f14-17f9-cb8fc68f4cb3.png)

このように、踏み台サーバーからDBサーバーにアクセスできました！

## まとめ
今回は踏み台サーバー環境を構築してみました。
座学では理解していても、実際に手を動かしてみるとわからない箇所が多いことに気づきました💦

今後も座学で培った知識をブログ形式でアウトプットしていきたいと思います！

# 参考文献
- [Amazon Web Services基礎からのネットワーク＆サーバー構築改訂４版](https://amzn.asia/d/5QleEvq)
SQLServerのbcpコマンド実行時に976エラーが発生した際の対処

# 挨拶
初めまして、日本システム開発株式会社の鈴木です。
技術者として更なる向上を目指すためQiitaアウトプットをする取り組みを行っています。
技術者としては経験が浅く発信内容はとにかく試したものの覚書になります。
今回はSQLServerのbcpコマンドでバックアップを取得する際にエラー976が発生し、その対処を行ったため対処法を記載します。

# エラー内容
SQLServerのエラー976は以下のものになります。
~~~ERROR 976
ターゲット データベース '%.*ls' は可用性グループに参加しているため、現在クエリでアクセスできません。
データ移動が中断されているか、可用性レプリカの読み取りアクセスが有効になっていません。
このデータベースや可用性グループの他のデータベースへの読み取り専用アクセスを許可するには、
グループの 1 つ以上のセカンダリ可用性レプリカへの読み取りアクセスを有効にします。 
詳細については、SQL Server オンライン ブックの ALTER AVAILABILITY GROUP ステートメントを
参照してください。
~~~
bcpコマンド使用時にこのエラーが発生するのは、可用性グループ（DBダウン時にフェールセーフまたはフェールオーバーのために常時同期される予備のDB群）でセカンダリ（≒予備）に設定されているDBはデフォルトではデータの読み取りができないためクエリやコマンドによるデータの取得はできないのに、bcpでデータを取得しようとしたためエラーに落ちるという流れです。
# 対応
私の場合はそれまで使用していたbcpコマンドを使用したところ、突然このエラーが発生しバックアップの取得ができなくなったという事象になります。原因は前回実行時にDBでトラブルが発生しプライマリDBとセカンダリDBを入れ替えたことで、コマンド実行時にセカンダリへアクセスしてしまいエラーが発生という流れになります。
このエラーは接続先のDBがセカンダリであることが原因ですので、解消のためには接続先を変える必要があります。データのエクスポートを行うbcpコマンドは以下のようになっていると思います。
`bcp [データベース名].[スキーマ名].[テーブル名] out [出力ファイルパス] /S [サーバー名] /c ...(その他認証関連など別オプション)`
ここで問題になっているのは/Sで指定される接続先サーバーです。こちらの接続先がセカンダリになっているはずなので、プライマリに変えることで問題を解消することができます。また、デフォルト接続先のインスタンスに接続する際には/Sオプションを省略することが可能です。その場合は既定接続先をプライマリにするか明示的に/Sオプションを追加してプライマリに接続してください。
CSSを学びたい！Step13 (長い文字を省略する)

## はじめに
CSSを学びたいStep13です！長い文字を省略する**ellipsis**を紹介します！

## 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/62b5e0c3-5fd6-3ef7-0c64-9cc0765d5ddb.png)

## ソースコード
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>テキスト省略の例</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="ellipsis">これは非常に長いテキストで、幅を超えると省略されます。</div>
</body>
</html>
```
```css:styles.css
.ellipsis {
    white-space: nowrap; /* テキストを折り返さない */
    overflow: hidden; /* はみ出した部分を隠す */
    text-overflow: ellipsis; /* はみ出した部分を「...」で表示 */
    width: 200px; /* 必要に応じて幅を設定 */
}
```
CSSを学びたい！Step12 (キータイピングを実現する)

## はじめに
CSSを学びたい！Step12です！今回はキータイピングを実現していきます！！

## 成果物
![keytyping.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/80cbf549-e81f-57c4-b47c-d39d6f56f14a.gif)

## ソースコード
```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>タイピングエフェクトの例</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="typing-effect">これはタイピングエフェクトのテキストです。</div>
</body>
</html>
```

```css:styles.css
@keyframes typing {
    from { width: 0; } /* アニメーションの開始時点で幅を0に設定 */
    to { width: 100%; } /* アニメーションの終了時点で幅を100%に設定 */
}

@keyframes blink-caret {
    from, to { border-color: transparent; } /* アニメーションの開始と終了時点でカーソルを透明に設定 */
    50% { border-color: black; } /* アニメーションの中間点でカーソルを黒に設定 */
}

.typing-effect {
    font-family: monospace; /* 等幅フォントを使用 */
    white-space: nowrap; /* テキストを折り返さない */
    overflow: hidden; /* 要素の内容がはみ出さないように隠す */
    border-right: 0.15em solid black; /* 右側にカーソルを表示 */
    width: 0; /* 初期幅を0に設定 */
    animation: typing 3.5s steps(40, end) forwards, blink-caret 0.75s step-end infinite; /* タイピングとカーソルの点滅アニメーションを設定 */
}
```

→CSSだけでこんなにできると面白いですね！！
GraphQL×Java入門 基礎編

## はじめに

以下のような方達を対象に記事書いてます。

・GraphQLを初めて触る方

・とりあえずGraphQLで作成されたAPIを動かして動作させてみたい方

## 環境

仕事でGraphQLを検討することになったので、サンプルを作成しつつ、気になったところを検証してみようと思います。


・SpringBoot:3.3.2
・Java:17
・GraphQL:22.1

## ソースコード

[GraphQL Sample](https://github.com/kehuka11/graphql_sample)

GraphQLの検証のためのサンプルなので、動作するためだけに書いてあるところが多いので、悪しからず

## GraphQLとは

めっちゃざっくりいうと、
APIを開発するためのクエリ言語であり、REST APIより、データ取得効率を上げたり、柔軟性が上がることでクライアント側とコミュニケーションコストも減るなどを特徴に持ったFacebookによって開発されたクエリ言語とサーバーサイドのランタイム。
スキーマという構造を定義してQueryでデータを取得できたり、Mutationでデータの登録・更新・削除の操作ができる。

詳しく知りたい方は他の方の記事でGraphQLについてや仕組みについて解説されているので、そちらを読むと解像度上がると思います。
最低限のリクエストで必要なデータだけ返せるが、複雑になりがちってとこがみそっぽい。

## 基礎知識

まず最低限の基礎を紹介して、今回採用を検討するにあたって気になったところを紹介します。

### スキーマ

APIのリクエストやレスポンスの構造を定義したり、定義したデータにアクセスするためのQueryやMutation、subscriptionを定義できる。

役割としては、

・データの構造の定義
・操作の定義
・バリデーション

~~~sql
type Book {
    id: ID!
    title: String!
    author: Author!
}

type Author {
    id: ID!
    firstName: String!
    lastName: String!
}

~~~

■Bookは以下の構造になってます。

・id: ID型を扱い必須項目
・title: String型を扱い必須項目
・author: Author型を扱い必須項目

■Authorは以下の構造になってます。

・id: ID型を扱い必須項目
・firstName: String型を扱い必須項目
・lastName: String型を扱い必須項目

`ID`型はIntもしくは、String型を定義する。
`!`は必須であることを定義する。

このように、GraphQLが定義しているデフォルトの型とカスタムの型を定義して、データ構造を定義できる。

### Query

スキーマの中で定義できる操作の一つであり、データ取得操作を定義する。

~~~sql
type Query {
    searchBookById(id: ID!): Book
}

type Book {
    id: ID!
    title: String!
    author: Author!
}

type Author {
    id: ID!
    firstName: String!
    lastName: String!
}

~~~

上記で定義している操作は、`ID`型のidを指定し、`Book`型でデータを返却すること（データが空であることを許容）を定義している。

ちなみに、リスト型を扱うには以下のようにQueryを修正すればOK。

~~~sql
type Query {
    searchBooksByIds(ids: [ID!]!): [Book]
}
~~~

`[]`で囲むとリスト型であることを定義する。
上記なら、リクエストは非NullのIDのリストでリストも非Nullであり、返却されるデータはBookのリストでNull許容であることを定義している。

### Mutation

スキーマの中で定義できる操作の一つであり、データ登録・更新・削除操作を定義する。

~~~sql
type Mutation {
    registerBook(title: String!, firstName String!, lastName String!): Book!
}

type Book {
    id: ID!
    title: String!
    author: Author
}

type Author {
    id: ID!
    firstName: String!
    lastName: String!
}
~~~

Mutationを定義するときは、`type Mutation`ブロックで定義すればOK。

## Subscription

Subscriptionはリアルタイム通信をするための定義で、サーバ側で特定のイベントが発生したり、データの変更を検知して、通知を送れる。
GraphQLサーバーでWebSocket通信をサポートする必要がある。

~~~sql
type Subscription {
    newMessage: Message
}

type Message {
    id: ID!
    content: String!
    sender: String!
}
~~~

`Subscription`ブロックで定義できる。

## 次回

だらだらと書いてたら、長くなったので、記事分けますmm


## 参考文献

https://spring.pleiades.io/spring-graphql/reference

https://graphql.org/learn/schema/#union-types
NeurIPS著者がGithub Actionsでタスク管理の効率化を測ってみた話

## はじめに
この記事は「[ただただアウトプットを癖付けるための Advent Calendar 2024](https://qiita.com/advent-calendar/2024/newbie2024)」に投稿した記事です。

[最初の記事](https://qiita.com/yotabouya/items/e63c53c5e18b3cf6a454#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果が[NeurIPSに採択されました](https://neurips.cc/virtual/2024/poster/93465)。

[前の記事](https://qiita.com/yotabouya/private/5d4b67949b15ea621805)では、今更ながらGithub Skillsのチュートリアルをやってみました。
そこで得られた知識をアウトプットする意味も込めて、今回はGithub Actionsを使ってタスク管理の効率化を測ってみました。

## 関連記事

#### 前の記事 「[NeurIPS著者がGithub Skillsのチュートリアルをやってみた話](https://qiita.com/yotabouya/private/5d4b67949b15ea621805)」

#### 次の記事「[NeurIPS著者がGithub Pagesでウェブページを整備してみた話](https://qiita.com/yotabouya/private/d0df5ee5c08e86e35839)」


## これまでのタスク管理
管理の対象は、家事、書類仕事、各種研究プロジェクトにまたがっています。

Todoistを1年ほど使っていました。
使い勝手は良かったのですが、気になる点もいくつか(無料版での話です)。
- 作成できるプロジェクトの数が3つに制限されている
- タスクの開始時間は登録できるものの、所要時間の見積もりや、実行時間の記録ができない
- ポモドーロなどのOn-goingでの時間管理用アプリとの接続を行う場合、そのアプリ側での料金が発生する
- 記録の保存先が指定できないので、拡張性に難がある

そこで、最近話題のSuper Productivityに鞍替えしました。
こちらは無料版でも上記が解決されていて、しかもポモドーロは標準装備です。
(なんで無料なんだろう？と気になっています)

Super Productivityは、ポモドーロタイマーによる時間管理をおこなうことができます。
ただし、各タスクの実行時間をまとめて解析したり、見積もり時間と実際の時間の差を見ることはできません。

また、タスクの重要度などを設定することもできません（こちらはTodoistでは可能でした）。

個人的な希望として、いわゆる優先度と重要度のマトリクスを使って、タスクの優先順位を決めることができるといいなと思っています。
また、その記録をもとに、タスクの実行時間の見積もり精度を向上させることができるといいなと思っています。
もっと言えば、優先順位をベースに、週間のスケジュールをある程度自動で組んでくれるといいなというのが野望です。

## なぜGithub Actionsか

まずGithubでのタスク管理ですが、これはカンバンチャートに似たものである、プロジェクトボードを使用するのが一般的だと思います。
プロジェクトボードは、タスクをカードとして表現し、それをカラムに分けて管理するものです。

一方で、Github Actionsは、Github上で自動的に動作するワークフローを設定するものです。
これを使うことで、例えば、リポジトリにプッシュがあったら、自動的にテストを実行する、といったことができます。
これはpythonやjavaのコードを走らせることができるので、タスク管理にも使えるのではないかと考えました。

## 参考にしていく記事等
- ### Githubによるタスク管理
    - [GitHub Projects を利用したタスク管理](https://user-first.ikyu.co.jp/entry/2023/11/09/175121)
    - [情シスのタスクをGitHubのissueで管理するようにしたら捗った](https://qiita.com/itkr/items/1ae5578c1ca761dacf88)
    - [プロジェクト管理ツールとしてGitHubを"普通に"使う](https://qiita.com/itkr/items/0d4c0015da28827b2bb7)
    - [【GitHub】とても便利！GitHub Projectsを使ったタスク管理](https://www.uncovertruth.co.jp/dx-accelerator/blog/articles/github/056/)
- ### Github Actionsによる自動化
    - [GitHub Issuesを個人用のTodo管理アプリとして使っている](https://efcl.info/2020/12/25/missue/)
    - [GitHub Issues と GitHub Actions でいい感じにタスク管理できるツールを作った](https://hxrxchang.dev/blog/getting-things-done-in-github)
    - [GitHub Actions をプロジェクト管理に使用する](https://docs.github.com/ja/actions/use-cases-and-examples/project-management/using-github-actions-for-project-management)

## まずはGithub Projectsを使ってみる

kanbanボードを作成することで、タスクの進捗を可視化することができます。
projectを作成してRepositoryに紐づけ、カードを作成していきます。
このカードにIssueを紐づけることもできます。
作成後のカードを別の列に移動することで、そのタスクがどの段階にあるかを把握することができます。

## Github Actionsでタスク管理の効率化を測ってみる

上の参考記事のうち、[GitHub Issues と GitHub Actions でいい感じにタスク管理できるツールを作った](https://hxrxchang.dev/blog/getting-things-done-in-github)の[リポジトリ](https://github.com/hxrxchang/gtd-manager)を使ってみました。

ReadMEの最後に利用方法があったので、なぞってみます。

手動で実行して効果を見たいところでしたが、このままだと自動でのみ実行されるようになっているようです。
CSSを学びたい Step11 (属性値の取得)

## はじめに
CSSを学びたいStep11です。今回は属性値を取得できるattrに関して学んでいきます！

## 成果物
![attr.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/69732609-8c06-978a-6172-bc9655fb7768.gif)

## ソースコード

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CSS attr Example</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="tooltip" data-tooltip="これはツールチップのテキストです。">ホバーしてください</div>
</body>
</html>
```

```css:styles.css
.tooltip {
    margin: 32px;
    position: relative;
    display: inline-block;
    cursor: pointer;
}

.tooltip::after {
    margin-left: 32px;
    content: attr(data-tooltip); /* data-tooltip属性の値を表示 */
    position: absolute; /* 絶対位置指定 */
    bottom: 100%;
    left: 50%;
    transform: translateX(-50%);
    background-color: #333;
    color: #fff;
    padding: 5px;
    border-radius: 3px;
    white-space: nowrap;
    opacity: 0; /* 透明度を0に設定 */
    visibility: hidden;
    transition: opacity 0.3s;
}

.tooltip:hover::after {
    opacity: 1;
    visibility: visible;
}
```

こんな便利に使えるといいですね！！
iOSエミュレータの時間を変更する方法

時間経過の処理をおこなった際に実装確認するため時間を変更する必要があると思います。

今回はエミュレータの時間を変更します。

Mac自体の時間を変更することでエミュレータの時間も変わります。

システム設定　→ 一般　→　日付と時間　こちらの設定を変えると時間も変わります。

時間を変更したままだと、GoogleMeetがエラーになった為忘れず戻しましょう！
統計の基礎知識！標準偏差とは

## はじめに

HI Engineer Collegeでは、実務未経験のエンジニアの方や、エンジニアに興味がある方を募集したおります、まずはお気軽にお問い合わせください。

※ (株)G&T（【内々定まで最短2週間】ゼロからしっかりじっくり研修☆20代活躍中！）

https://gat-company.com/

※ HI Engineer Collegeに興味あがある方はこちら（プログラミングを学習したい方）

https://hiengineer.jp/



---

### エンジニア向けチャットルーム「TechTalk」参加者募集中！

プログラミングやITの話題を気軽に共有し、学び合えるエンジニアのためのチャットルーム「TechTalk」では、新たな参加者を募集中です！

**こんな方にオススメです**
- 最新技術の動向やトレンドを追いかけたい
- 日々の開発で生じる疑問を他のエンジニアに相談したい
- コードレビューの方法やデバッグのコツを知りたい
- 他のエンジニアと共に成長できる場を探している

**チャットルームで扱う主なトピック**
- **プログラミング**: JavaScript、Python、Javaなど、言語やフレームワークについて
- **開発ツール**: Git、Docker、CI/CD の自動化など
- **キャリア**: 転職やキャリアパス、業界動向
- **AI/機械学習**: モデルの開発やトレンド
- **Webセキュリティ**: セキュリティ対策や最新の脅威情報

**チャットルームの特徴**
- 他のエンジニアからリアルタイムでフィードバックがもらえます
- 勉強会やハンズオンセッションも定期開催
- 初心者から上級者まで、幅広いレベルのエンジニアが在籍
- リモートワーク時のちょっとした相談や雑談も大歓迎

**参加方法**
下記リンクから「TechTalk」へぜひご参加ください。

https://line.me/ti/g2/xRolADFbfopNo4vdgA9hmAlAlMgxvaIUSNDx8A?utm_source=invitation&utm_medium=link_copy&utm_campaign=default

---

## 標準偏差ってなに？

**標準偏差**は、データのばらつき具合を示す統計指標です。具体的には、データセット内の各データが平均値からどれくらい離れているかを数値で表します。標準偏差が小さいほど、データは平均値の近くに集中しており、大きいほどデータは広く散らばっていることを意味します。

---

## どうして標準偏差が大事なの？

標準偏差は、データのばらつきを理解するために非常に重要です。例えば、テストの点数や身長などのデータを分析する際に、単に平均値を見るだけではデータの全体像を把握できません。標準偏差を使うことで、データがどれくらい散らばっているかを具体的に知ることができます。

---

## 例え話で考えてみよう

### 1. みんなの身長

クラスのみんなの身長を例にとってみましょう。

- **グループA**: みんな同じ身長だとします。
  - 140cm, 140cm, 140cm, 140cm, 140cm
  - この場合、標準偏差は **0** に近くなります。つまり、データにばらつきがないことを示しています。

- **グループB**: みんなの身長が異なる場合。
  - 130cm, 140cm, 150cm, 160cm, 170cm
  - この場合、標準偏差は **大きく**なります。データに大きなばらつきがあることを示しています。

### 2. テストの点数

次に、クラスのみんなのテストの点数を見てみましょう。

- **グループC**: みんなほぼ同じ点数。
  - 85点, 86点, 85点, 84点, 85点
  - 標準偏差は **小さい**です。データが平均値に近いことを示しています。

- **グループD**: 点数が大きく異なる場合。
  - 60点, 70点, 80点, 90点, 100点
  - 標準偏差は **大きい**です。データに大きなばらつきがあることを示しています。

---

## 標準偏差を使うとき

### データのばらつきを比較する

異なるデータセットの標準偏差を比較することで、どちらのデータがよりばらついているかを判断できます。例えば、2つのクラスのテスト点数を比較して、どちらのクラスがより成績にばらつきがあるかを知ることができます。
つまりそのクラスの成績はみんながある程度理解できているのか、数名が変数をひきあげているのか？など


---
並列処理・並行処理まとめ

## はじめに
並列処理と並行処理、スレッドとプロセス、それに関連する語句やらがややこしいのでまとめました。メモです。

## 目次
- [並列処理と並行処理](https://qiita.com/esnir74/items/7f4f302c4546a999350e#%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86%E3%81%A8%E4%B8%A6%E8%A1%8C%E5%87%A6%E7%90%86)
- [プロセスとスレッド](https://qiita.com/esnir74/items/7f4f302c4546a999350e#%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%A8%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89)
- [マルチプロセス](https://qiita.com/esnir74/items/7f4f302c4546a999350e#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9)
- [マルチスレッド](https://qiita.com/esnir74/items/7f4f302c4546a999350e#%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89)
- [CPUコア](https://qiita.com/esnir74/items/7f4f302c4546a999350e#cpu%E3%82%B3%E3%82%A2)
- [参考にさせていただいたサイト](https://qiita.com/esnir74/items/7f4f302c4546a999350e#%E5%8F%82%E8%80%83%E3%82%B5%E3%82%A4%E3%83%88)

## 並列処理と並行処理
２つ以上の処理をどのように行うかという話
### 並列処理
- 複数の処理を同時に行うこと
- ３つのタスクを３人同時で行うイメージ
- ある時間の**点**において複数のタスクを扱うこと


### 並行処理
- 高速で処理の切り替えを行うことで、複数の処理を同時にやってるように見せかける仕組み
- ３つのタスクを高速で切り替えながら１人で行うイメージ
- ある時間の**範囲**において複数のタスクを扱うこと

それぞれ３つ目の説明は、「時間軸」という観点からの説明だが、ある範囲において複数のタスクを扱うことは、ある点において複数のタスクを扱うことの上位であるとして、並行処理は並列処理の上位概念であるとしているサイトもいくつか見られた。有識者からコメントを頂きたい。

https://zenn.dev/hsaki/books/golang-concurrency/viewer/term#%E3%80%8C%E4%B8%A6%E8%A1%8C%E3%80%8D%E3%81%A8%E3%80%8C%E4%B8%A6%E5%88%97%E3%80%8D%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%AE%E9%81%95%E3%81%84

## プロセスとスレッド
### プロセス
- コンピュータにおけるプログラムの実行単位のこと
- OSからメモリ空間が割り当てられる
- １つのプロセス専用のメモリ空間が必要
- プロセスの最大の目的はプログラムごとのメモリ領域の独立性、不可侵性を保つこと
>プロセスは実態を伴った処理ではなく、メモリ上で複数または単独の処理をまとめて管理しているものだと考えることができます。（プロセスの最大の目的はプログラムごとのメモリ領域の独立性、不可侵性を保つことです）


### スレッド
- プロセスの中の実行単位
- プロセスは１つ以上のスレッドを持つ

## マルチプロセス
- 複数のプロセスを同時に行うこと
- １つのプログラムを複数の実行環境に分けて同時に処理を進める
- 基本的に各プロセスはメモリ空間を共有しないため、データの共有にはプロセス間通信が必要
- コア数を超えたスケールはできない
- Pythonでは後述のマルチスレッドが実行できないので、並列処理にはマルチプロセスを使用する

## マルチスレッド
- １つのプロセス内に複数のスレッドがある状態
- それぞれのスレッドを別のCPUコアに分けて処理させることで並列処理が可能
- それぞれのスレッドは同じプロセス内にあって、メモリ空間を共有するので、何も対策をしないと、意図せずデータが書き替えられたり。お互いがお互いのロック開放待ち状態になり処理が停止してしまう状態（デッドロック）が発生してしまったりする


## CPUコア
CPUの中核部分。CPUがコアを複数持っていることをマルチコアもしくはマルチコアプロセッサという。
基本的にコア数が多いほど性能が良くなる



## 参考サイト
https://qiita.com/yukiyamamuro/items/de06878d6772ee2a1e76

https://zenn.dev/hsaki/books/golang-concurrency/viewer/term#%E3%80%8C%E4%B8%A6%E8%A1%8C%E3%80%8D%E3%81%A8%E3%80%8C%E4%B8%A6%E5%88%97%E3%80%8D%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%AE%E9%81%95%E3%81%84

https://selfs-ryo.com/detail/python_concurrent_and_parallel#concurrent
AWS: AWS入門(EC2編4) - パブリックIPアドレスの利用状況を管理する

###### 実施環境

 Microsoft Edge 124.0.2478.67 (64bit)

### 0. 概要

世界的な IPv4 資源の枯渇を受け、 AWS は 2024 年 2 月 1 日より、パブリック IPv4 アドレスに対する料金体系を変更しました。
これまではパブリック IPv4 アドレスを 1 つのインスタンスにつき 1 つまでは無料で利用できましたが、今後はすべてのパブリック IPv4 アドレスに対し一律課金されるようになります。
その代わり、 EC2 の無料枠として、アカウント作成から 12 か月の間、月 750 時間までパブリック IPv4 アドレスを利用できるようになりました。

https://aws.amazon.com/jp/blogs/news/new-aws-public-ipv4-address-charge-public-ip-insights/

上記のようにパブリック IPv4 アドレスの料金体系が変更された今、利用しているパブリック IPv4 アドレスの管理はより重要度を増しています。
そのようなパブリック IPv4 アドレスの管理に役立つ AWS の機能が「 Amazon VPC IP Address Manager ( IPAM ) 」です。
今回は IPAM を利用できる状態にして、「パブリック IP に関するインサイト」画面を確認してみます。

なお、最新の手順は以下を参照してください。

https://docs.aws.amazon.com/ja_jp/vpc/latest/ipam/create-ipam.html

### 1. IPAM 作成

デフォルトの状態では IPAM を利用できないので、まずは IPAM を利用できるようにしましょう。
 AWS マネジメントコンソールの画面左上、検索フォームに「 ipam 」と入力します。
すると、検索結果に「 Amazon VPC IP Address Manager 」が出てくるので、それをクリックします。

![WS000510.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/dc31049e-c05a-5fcb-7528-4d324c5a7a75.jpeg "1_01")

「 IPAM を作成」をクリックします。

![WS000511.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/0e8c4128-24e2-777e-4152-4b4057a714a9.jpeg "1_02")

「データレプリケーションを許可」の項目があるので、チェックを入れます。

![WS000512.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/700a5ae0-4c56-f216-fd06-23bf67ec83a5.jpeg "1_03")

今回は無料利用枠の範囲で利用するため、「無料利用枠」にチェックを入れます。

![WS000514.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/81e632d8-ac98-cfb3-16e4-e221d85fe1ba.jpeg "1_04")

全てのリージョンから情報を取得したいので、「すべてのリージョンを追加」をクリックします。

![WS000515.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/548641fb-35c1-ad81-8528-f2d14bd588d5.jpeg "1_05")

:::note info
ただし、無料利用枠で複数リージョンを選択しても、現在のリージョン以外のリージョンの情報を取得できるのは今回利用する「パブリック IP に関するインサイト」画面だけです。
その他の画面や機能で現在のリージョン以外のリージョンを利用したい場合は、有料の「アドバンストティア」を選択する必要があります。
:::

「 IPAM を作成」をクリックします。

![WS000516.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/96ba82df-9c8a-ad4b-cd3b-d26dbdbe0ce3.jpeg "1_06")

正常に処理できれば、以下のようなメッセージが表示されます。

![WS000518.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/a124112b-cf51-d067-dbf0-d7342a86af67.jpeg "1_07")

なお、設定から情報の取得までには少し時間がかかります。

![WS000520.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/f9ad7c8d-67d5-3b22-46d0-f9282e38a8d4.jpeg "1_08")

### 2. 管理画面

では早速画面を見てみましょう。
左側のメニューで「モニタリング」⇒「パブリック IP に関するインサイト」を選択します。

![WS000519.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/053e78b1-f03b-aab1-041a-6129e8002cdf.jpeg "2_01")

これが「パブリック IP に関するインサイト」画面です。
不要な IP アドレスが残っていないか、 IP アドレスを使いすぎていないかなどをこまめに確認して、無駄な支出を極力減らすようにしましょう。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6341ef6e-c821-388e-84ac-d20f42632f2c.png "2_02")

[戻る](https://qiita.com/frozencatpisces/items/75bf3e19f6328786e336)
【正式リリース！】Windows Server 2025【やっと来た！】

**皆様！
ついにこの日が来ました！**
事前アナウンスも無かったっぽいんで事後報告ですが、タイトルの通り<font color="red">**Windows Server 2025が正式リリースされました！**</font>
米国日付で11月1日、JSTで11月2日っぽいですね。

https://learn.microsoft.com/ja-jp/windows-server/get-started/whats-new-windows-server-2025
こちらでも注意書きのパブリックプレビューという文言も消えていますし、
https://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-2025
こちらの評価センターでもプレビューの文言はありませんね。

これから早速以前の記事でも書いたAzure ARCで評価版から正式版に移行できるのか試してみます！
実は今CCNPの更新試験勉強の真っ最中だったんですが、試験範囲が広くて辟易してたんですよね。
~~サボる口実ができた~~もとい、検証する必要が出てきたのでしばらく試験勉強はお休みですね！

では検証結果はまた別の記事で上げようと思います！

# なんで正式版にこだわるの？
はい。
検証の前に一つだけ記載しておきます。
Active DirectoryでセカンダリのDCを構築する際、プレビュー版だとセカンダリDCの構築ができないんですよね。
なのでセカンダリのDCを用いた検証、とくにアップグレード系の検証ができなかった(実際にはAzureとVPN張ってAzure上のマシンで検証できてましたが)のがインターネット環境があるだけでオンプレ環境に完結して検証できるとなるとまぁ便利かな、というのが理由です。

本日は取り急ぎの記事なのでここまで。
【基本情報】ブロードキャストとは

## ブロードキャストとは
* 特定の相手を指定せず、同一ネットワーク内に参加するすべての機器に向けて一斉にデータを送信する
* 「ブロードキャストアドレス」などを宛先に指定し送信すると、受信可能な範囲にある機器すべてが、自分宛てとみなして受信する

## DHCPサーバーとのやりとり
* 起動したばかりのPCはDHCPサーバーのIPアドレス/MACアドレスがわからない
    * 自身のIPアドレスをもわからない状態
* 自身が繋がっているネットワークにブロードキャストし、DHCPサーバーとやりとりを行う

https://qiita.com/miyapie_ikki/items/0c8ff6478d3f426d183d

## ブロードキャストに使用する2種類のIPアドレス
### リミテッドブロードキャストアドレス
* ルータを介して接続されている他のセグメントへは送信されない
    * インターネット層(第2層)に接続されているすべてのPCに対するブロードキャスト
* ローカル上のネットワークセグメント上のコンピュータだけが送信対象
    * 複数のネットワークアドレスが存在している場合、それらすべてが対象
### ディレクティッドブロードキャストアドレス
* ネットワークアドレス部はそのままにして、ホストアドレス部だけをオール1にしたアドレス
:::note info
ex) IPアドレス：`192.168.1.0/24`
* このホストアドレス部をすべて1にした`192.168.1.255`というIPアドレスがディレクティッドブロードキャストアドレス
* ディレクティッドブロードキャストアドレスでブロードキャストすると`192.168.1.0/24`ネットワークアドレスを持つ全てのPCが通信対象
:::
* トランスポート層(第3層)レベルで同じネットワークアドレスをもつコンピューター全体にブロードキャスト
* ローカルネットワークセグメント上に複数のネットワークアドレスが存在している場合、指定されたネットワークアドレスを持つPCのみが対象

## まとめ
* リミテッドブロードキャスト
    * ローカルのネットワークセグメントのみがブロードキャスト対象
* ディレクティッドブロードキャストアドレス
    * 指定されたネットワークアドレスのみがブロードキャスト対象
皆１度は思った「プログラミングが楽しくない」問題を解決したい

# はじめに
みなさま日々の学習お疲れ様です。
あなたがこの記事に辿り着いたということは、プログラミング学習に行き詰まりを感じているのではないでしょうか。
私はRails学習をし始めて2年目で、学習をする中で「自分にはプログラミングは向いていないのかもしれない」と何度も挫折しかけたことがあるのですが、そんな時に前を向くことができるようになったポイントを6つにまとめてみましたので、初学者ならではの言葉で、今苦しんでいる方の手助けになれば幸いでございます。
それではいきましょう！


# 1.小さな目標を設定する
プログラミングをしているとよくわからないタスクを、よくわからないまま進めてしまい、エラーが起きて調べて試してみても、うまくいかず余計に訳わからないということがよくあるかと思います。そんな時は、小さな目標を設定して**成功体験の積み重ねること**が重要です。
たとえば、「ボタンをクリックすると色が変わる」「APIからデータを取得して表示する」など、短時間で達成できる小さな目標を立ててみてください。こうした小さな成功が積み重なると、自然とプログラミングが楽しくなります。
また、**目標は本当に小さなものでも構いません。**「コードを1行書いたらOK」「PCを開いたらOK」これぐらいの小さな目標を毎日設定して達成していくことで、プログラミングに触れる時間を増やすことができるので成長速度もグンと上がります。

# 2.問題の切り分けをしてみる
プログラムのエラーや意図通りに動かない部分があると、どこから手をつけて良いかわからなくなってしまいますよね。こういう時は、**問題を細かく切り分けること**が大切です。一度に全てを解決しようとせず、問題を部分ごとに分解し、一つひとつに取り組んでみましょう。
具体的には、エラーログを見た時に、データは「元となるデータ → データの入口 → データの加工 → データの出口」という順番で加工されていくので、どのステップにあるのかを切り分けていけばエラーの原因を特定しやすくなります。一度エラーの特定ができたらそこだけを見て改善をしてみてダメなら、消去法でエラーの原因を特定していくと見つかりやすいです。

# 3.デバッグの過程を楽しむ
長文のエラーが出た時に、「うわっなんだこれ？」と拒絶反応をすることがあるかと思います。プログラムがエラーなく動くこと自体は気持ちいいですが、実はエラーを解決することがプログラミングの醍醐味の一つでもあります。**「エラー＝失敗した」というわけではなく、エラーはただの結果**です。エラーが出た時には、「どうしてこうなるのだろう？」と謎解きをする気持ちで取り組んでみてください。私は謎解きゲームのレイトン教授をやっていたことがあり、そのゲームのように楽しんで解決するようにしていったら楽しさに変わっていきました。

# 4.人・ものに頼る
プログラミングは孤独な作業だと感じるかもしれませんが、実際には多くの人が似たような問題に直面しています。行き詰まった時には、友人やオンラインコミュニティ、フォーラムなどで質問してみると良いでしょう。同じ問題に挑戦した経験のある人からのアドバイスはとても貴重です。また、他人の視点から問題を見ることで新たな発見があるかもしれません。自分で解決しようとする姿勢は大切ですが、人に頼ることも同じくらい重要です。
また、人だけではなく、今ではAIに頼ることもできます。ChatGPTやClaudeなど、質問できる環境は山のようにあるので、人に頼る前にまずはググったりAIを活用してみたりして、それでもわからなかったらメンターなどの有識者に質問するというステップを踏めば、自走力が身につきつつ、メンターへの負担も減るので一石二鳥になるかと思います。

# 5.時には諦める
試行錯誤を繰り返してもうまくいかないことはよくあります。「もうだめだ→もう一回やってみよう→ダメだった→もう一回やってみよう」を繰り返していくと、疲弊していきプログラミングが嫌いになってしまいます。**プログラミングが本当に嫌になる前に、時には止めることも肝心**です。限界が来たと思ったら、一度だけ挑戦してみて、それでも無理だと感じたら潔くパソコンを閉じましょう。パソコンを閉じた後に取るべきアクションは、**頭の中の思考を紙に書き出す、コーヒーを淹れる、掃除をする、仮眠をとる、人とコミュニケーションをとる、瞑想をする**など、短時間でリフレッシュする方法はいくらでもあります。ただここでの注意点は、動画を見ることです。「無理になったから一旦動画をみよう」と少しだけ休憩をしようとしたら数時間も時間を奪ってしまったという経験をしたことがあるのではないでしょうか。動画サービスは時間泥棒だと胸に刻んで、短時間のリフレッシュ方法を試してみてください。

# 6.「本当に頑張ったのか？」を自問自答する
プログラミングで難しい問題に直面していると、「自分には向いていない」「もう無理かもしれない」と感じることもあります。しかし、そう感じたときこそ、**「本当にやれることは全て試したのか？」と自問**してみてください。意外と視野が狭くなって基本的な確認を見落としていたり、別の方法を試さずに諦めてしまっていたりすることがあります。
例えば、「違う検索文でググってみる」「ドキュメントをもう一度見直す」「似た問題を解決した例を探してみる」「メンターに質問する」など、まだできることがあるかもしれません。このように少し立ち止まって考えるだけで、新しい視点が見つかることも多いです。そして、「ここまで試して無理なら仕方がない」と思えるくらいまで全力を出してみると、自然と自信がついてきます。最後の一歩を踏み出す勇気が、次の成長へのステップになるかもしれません。

# まとめ
プログラミングの学習は、目の前の問題に何度も挫折しそうになりながらも、少しずつ進んでいく忍耐の連続です。特に、はじめのうちは思い通りにいかないことが多く、楽しさよりも苦しさを感じるかもしれません。しかし、この記事で紹介したような工夫を取り入れることで、その道のりが少しずつ楽しく、意味のあるものに変わっていくはずです。

1.小さな目標を設定する
2.問題の切り分けをしてみる
3.デバッグの過程を楽しむ
4.人・ものに頼る
5.時には諦める
6.「本当に頑張ったのか？」を自問自答する

これらを全て試してみて、少しでもプログラミングの楽しさを感じられる人が増えてくれたら嬉しいです。プログラミングの道は決して楽なものではありませんが、だからこそ乗り越えた先には深い達成感と、自信がついてきます。どうか焦らずに、楽しみながら、自分のペースで進んでいってください。
新しいバージョンのアプリ公開する時の注意点まとめ

①バーション変更
→pubspec.yamlでバージョンを変更（&xcodeで，runner>targets>runner>general>indentity>versionでバージョンを変更）し，flutter pub get からのflutter build ios --target lib/〇〇/〇〇/〇〇/main.dartを実行．

②flutter run --debug --dart-define-from-file=scripts/flavors/prd.jsonしてprdの状態でアーカイブする！
Polarsの学習教材の紹介

## はじめに

「データサイエンティスト協会スキル定義委員」の「**データサイエンス100本ノック（構造化データ加工編）**」というのがあります。

この問題に追加／削除／アレンジした（学習ドリル的な）**学習教材**を作成したので紹介します。

この教材は知識の確認用なので、この教材だけではPolarsを学べません。出題範囲もPolarsの一部の機能だけです。実施にあたっては、必要に応じてドキュメントなどを読むことをおすすめします。

https://polars-ja.github.io/docs-ja/

### 対象者

* Polarsの知識を試してみたい人

### 教材の特徴

* 学習内容に応じて分類しました
* 模範解答を確認できます
* 正解かどうかをチェックできます

## 準備

`uv`を使います。次からインストールしてください。

https://docs.astral.sh/uv/getting-started/installation/

ターミナルで次を実行してください。`curl`が使えない場合は、この「[Download ZIP](https://github.com/SaitoTsutomu/study-polars/archive/refs/heads/master.zip)」をクリックしてください。また、`unzip`が使えない場合は、適宜解凍してください。

```
curl -L -o study-polars.zip https://github.com/SaitoTsutomu/study-polars/archive/refs/heads/master.zip
unzip study-polars.zip
cd study-polars-master
```

## 学習開始

教材は、`nbs/study_polars.ipynb`です。
次のコマンドを実行すると、教材を`work/study_polars.ipynb`にコピーし、Jupyterが起動します。

```
uv run study-polars
```

:::note info
**ノート**
`work/study_polars.ipynb`が存在する場合はコピーしません。2回目以降は続きから学習できます。もし、新規に始めたい場合は、`uv run study-polars --new`としてください。
:::

`study_polars.ipynb`を開いて学習を始めてください。

### 手順

* 青いセルの説明を読む
* 白いセルに問題の解答を書く
* 黄色いセルを実行して正解かどうかを確認する

### 問題例

![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/8388c185-77d6-2fa7-b910-890c621b5e2a.png)

## さいごに

Polarsは、はじめたばかりで、実務ではまだ使っていません。しかし、次のようなところが気にいっています。

* 高速！
* エクスプレッションがいい
  * 列ごとにメソッドチェーンを書けて柔軟
* 型などに厳しいので間違いに早く気づける
  * データが厳格でないとき、pandasは勝手に解釈するので探索的データ分析（EDA）に向いているが、実アプリケーションでリスクになる

基本的な処理を組み合わせて複雑な処理を書けるので、書きやすくわかりやすいと感じています。
（pandasだと、複雑な処理を短く書けることも多いですが、いざ書こうとしたときに、どう書くのか悩みやすい）

さいごに、本記事で紹介した学習教材一式は、次にあります。

https://github.com/SaitoTsutomu/study-polars

以上
Gitのコミットメッセージ作成をChatGPTで自動化してみた

## はじめに

ソフトウェア開発の現場では、Gitのコミットメッセージをきちんと書くことが推奨されていますが、内容を反映した適切なメッセージを考えるのは意外と難しい作業です。今回は、ChatGPTのAPIを活用して、Gitのコミットメッセージを自動生成するスクリプトを作成したので、紹介します。

## スクリプトの概要

このスクリプトは、OpenAIのAPIを使って、ステージングされたファイルの変更内容に基づいたコミットメッセージを自動で生成します。特に、大規模な変更や複数ファイルにわたる修正がある場合には、変更点を理解しやすく、簡潔なコミットメッセージが生成されるため、手作業の時間を大幅に削減できます。

https://github.com/takurot/autoCommitMsg

### 事前準備

このスクリプトを実行するには、OpenAIのAPIキーを取得し、環境変数として設定する必要があります。APIキーがない場合、スクリプトはエラーを返します。

### コードの詳細

では、実際のコードについて見ていきましょう。以下のコードは、変更内容をChatGPTに送信し、その結果をコミットメッセージとして使用する仕組みです。

```python
import subprocess
import os
from openai import OpenAI

client = OpenAI()

# OpenAI APIキーを環境変数から取得
client.api_key = os.getenv('OPENAI_API_KEY')

if not client.api_key:
    raise ValueError("環境変数 'OPENAI_API_KEY' が設定されていません。")

# ステージングされたファイルの一覧を取得
result = subprocess.run(['git', 'diff', '--cached', '--name-only'], capture_output=True, text=True)
files = result.stdout.strip().split('\n')

if not files or files == ['']:
    print("ステージングされた変更がありません。")
    exit(1)

# 各ファイルの変更前後の内容を取得
file_diffs = {}

for file in files:
    try:
        # 変更前の内容を取得
        old_version = subprocess.run(['git', 'show', f'HEAD:{file}'], capture_output=True, text=True)
        old_content = old_version.stdout

        # 変更後の内容を取得
        with open(file, 'r') as f:
            new_content = f.read()

        file_diffs[file] = {'old': old_content, 'new': new_content}
    except Exception as e:
        print(f"ファイル '{file}' の処理中にエラーが発生しました: {e}")

# プロンプトの作成
prompt = "以下は、各ファイルの変更前と変更後の内容です。これらの変更に基づいて、適切なコミットメッセージを日本語で生成してください。先頭行は全体像が見えるような簡潔な内容にして、詳細は段落を分けて説明してください。\n"

for file, contents in file_diffs.items():
    prompt += f"\nファイル名: {file}\n変更前:\n{contents['old']}\n変更後:\n{contents['new']}\n"

# OpenAI APIを呼び出し
try:
    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "あなたは優秀なソフトウェアエンジニアです。"},
            {"role": "user", "content": prompt}
        ],
        max_tokens=100,
        temperature=0.5
    )

    # コミットメッセージとして使用
    commit_message = response.choices[0].message.content.strip()

    # コミットの実行
    subprocess.run(['git', 'commit', '-m', commit_message])
    print("コミットが正常に作成されました。")
except Exception as e:
    print(f"OpenAI APIの呼び出し中にエラーが発生しました: {e}")
```

### スクリプトの仕組み

1. **ステージングされたファイルの検出**  
   `git diff --cached --name-only` を実行して、ステージングされたファイルの一覧を取得します。変更がなければスクリプトを終了します。

2. **ファイルごとの変更内容の取得**  
   変更前と変更後の内容を `git show` やファイル読み込みで取得し、ファイルごとの差分を生成します。

3. **ChatGPT APIの呼び出し**  
   取得した差分をプロンプトとして組み立て、ChatGPT APIに送信します。ChatGPTは差分を分析し、適切なコミットメッセージを生成して返します。

4. **コミットの実行**  
   生成されたメッセージを `git commit` コマンドで実行し、自動的にコミットを作成します。

### 実際に使ってみた感想

このスクリプトを使うことで、開発中のコミット作成が非常にスムーズになり、変更内容を的確に反映したメッセージを手軽に生成できるようになりました。ChatGPTの出力はコンテキストに沿った内容になりやすく、レビュー時にもメッセージの理解がしやすいと感じます。

### 注意点
- 自動化されているとはいえ、生成されたコミットメッセージが常に正しいとは限らないため、注意が必要です
- OpenAI APIのコストも考慮する必要があります。適切な使用頻度を見極めることが大切です
- 企業でOpenAI APIを使う場合には、所属する企業のポリシーに従ってください
iOS18でタブを押した際に画面がチラつく現象への対応

# どうした
iOS18でUITabBarControllerで実装したタブをタップしたら、遷移時に画面が一瞬チラつくようになった。
NavigationBarの色も反転して見栄えが悪いので何とかしたい

# 発生している環境
- Swift
- Xcode 16.0
- iOS18端末

# 対応
UITabBarControllerDelegateを実装して、遷移時のアニメーションを無効化する

```Swift
func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
    // アニメーションだめー
    UIView.setAnimationsEnabled(false)
    return true
}
    
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
    // アニメーションどうぞ
    UIView.setAnimationsEnabled(true)
}
```

# 参考
- https://stackoverflow.com/questions/79006130/ios-18-tab-switch-flashes-screen
【Ruby】putsメソッドは内部的にto_sメソッドを呼び出している!?

どうもこんにちは。

今回は、**`puts`メソッドは内部的に`to_s`メソッドを呼び出している**ということに疑問を覚えたので、勉強しました。

# to_sメソッドとは

`to_s`メソッドは、数値などのオブジェクトを文字列に変換するメソッドです。

```rb
num = 123
puts num.to_s     #=> "123"
```

# putsメソッドがto_sメソッドを呼び出す仕組み

`puts`メソッドは、引数として渡されたオブジェクトを出力する際に、そのオブジェクトの`to_s`メソッドを自動的に呼び出して文字列に変換します。

これは、Rubyのメソッド呼び出しの内部動作によるもので、ユーザーが明示的に`to_s`を呼び出さなくても、`puts`が自動的に処理してくれます。

[Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/Kernel/m/puts.html)には、以下のように記載されています。

```txt
引数と改行を順番に 標準出力 $stdout に出力します。引数がなければ改行のみを出力します。

引数が配列の場合、その要素と改行を順に出力します。配列や文字列以外のオブジェクトが引数として与えられた場合には、当該オブジェクトを最初に to_ary により配列へ、次に to_s メソッドにより文字列へ変換を試みます。末尾が改行で終っている引数や配列の要素に対しては puts 自身は改行を出力しません。
```

ということは、`puts`はこんな感じで定義されてそう？

```rb:putsの予想定義コード
def puts(*args)
  args.each do |arg|
    if arg.nil?
      print "\n"
    else
      print "#{arg.to_s}\n"
    end
  end
end
```

多分こんな感じだと思うです...！

# to_sが自動的に呼び出すメソッド例

- print
- 文字列補間 #{}
- Loggerクラスのメソッド
    - info
    - error
    - debug

# to_sメソッドをオーバーライドすれば自分の見やすい形で文字列出力できそう！

```rb
class Book
  def initialize(title, author)
    @title = title
    @author = author
  end

  def to_s
    "「#{@title}」 by #{author}"
  end
end

book = Book.new("吾輩は猫である", "夏目漱石")
puts book
# => 「吾輩は猫である」 by 夏目漱石
```

できたー！
【初心者向け】find と find_by の使い分け

# はじめに
find と find_by は、どちらもRailsでレコードを取得するためのメソッドで似ていますが、少々動作や使い方に違いがあります。
それぞれ解説していきます！

# find
### 概要
プライマリキー（通常は id カラム）を指定して、1つのレコードを取得します。

### エラーハンドリング
指定した id に該当するレコードが見つからない場合は、ActiveRecord::RecordNotFound 例外が発生します。

### 使い方
```
user = User.find(1)
```
User.find(1) は、 id が 1 のユーザーを取得します。
idが1のユーザーが存在しない場合、ActiveRecord::RecordNotFound例外エラーが発生します。


# find_by
### 概要
任意のカラムに基づいて条件を指定し、最初に一致するレコードを取得します。

### エラーハンドリング
指定した条件に一致するレコードが見つからない場合は、nil を返します（例外は発生しません）。

### 使い方
```
user = User.find_by(name: "Alice")
```
User.find_by(name: "Alice") は、name が "Alice" の最初のユーザーを取得します。
一致するユーザーが存在しない場合、userはnilになります。


# 違いのまとめ
### find
**使用目的**：　主キーで1件のレコードを取得
**レコードが見つからない場合**：　ActiveRecord::RecordNotFound の例外発生
**戻り値**：　1件のレコード	
**使い分け**：　必ず存在する id を使ってレコードを取得したいときに便利です。レコードが存在しないとエラーが発生するため、エラーハンドリングも明確に行いたい場合に適しています。

### find_by
**使用目的**：　任意のカラムに基づいてレコードを取得
**レコードが見つからない場合**：　nil を返す
**戻り値**：　最初に一致した1件のレコード
**使い分け**：　特定の条件に合致する最初のレコードを取得したいときや、レコードが存在しない場合に nil が返されても問題ない場合に便利です。
【Ruby】Objectクラスのdupメソッドとcloneメソッドについて勉強しました。

どうもこんにちは。

Objectクラスのdupメソッドとcloneメソッドについて勉強したので、備忘録として残します。

# dupメソッドとcloneメソッド

これらはどちらもオブジェクトのコピーを作成するためのメソッドです。
しかし、動作自体には微妙な違いがあります。実際、Ruby Goldの試験では違いを問う問題が出題されます。

ちなみに、Rubyに`copy`メソッドは存在しません。

# dupメソッド

オブジェクトの浅いコピー（シャローコピー）を作成します。
主にオブジェクトの状態（インスタンス変数など）をコピーしますが、特定の属性（例えばフリーズ状態やシングルトンメソッドなど）はコピーされません。

# cloneメソッド

`dup`と同様にオブジェクトの浅いコピーを作成しますが、追加で以下の要素もコピーします。

- フリーズ状態（`frozen?`）
- テインティング状態（`tainted?`）
    - テインティングについては、Ruby2.7以降では廃止されているようですので、ここでの解説は省きます
- シングルトンメソッドや特異メソッド

| 特徴                        | dupメソッド         | cloneメソッド        |
|-----------------------------|---------------------|-----------------------|
| フリーズ状態のコピー         | コピーされない      | コピーされる          |
| テインティング状態のコピー   | コピーされない      | コピーされる          |
| シングルトンメソッドのコピー | コピーされない      | コピーされる          |
| コンスタントのコピー         | 対応していない（クラス定数など） | 対応している場合がある（主にシングルトンクラス） |
| 基本的な用途                | オブジェクトの単純な複製 | オブジェクトの完全な複製 |

# 違いについて解説

ここから、違いについての詳細を解説します。

## 1. フリーズ状態のコピー

`dup`メソッドでは、元のオブジェクトがフリーズされていても、コピーされたオブジェクトはフリーズされていません。

一方、cloneメソッドでは、元のオブジェクトがフリーズされている場合、コピーされたオブジェクトもフリーズされています。

```rb
# dupの例
original = "Hello".freeze
copy = original.dup

puts original.frozen?  # => true
puts copy.frozen?      # => false

# cloneの例
original = "Hello".freeze
copy = original.clone

puts original.frozen?  # => true
puts copy.frozen?      # => true  こっちはフリーズ状態もコピーされている！
```

## 2. シングルトンメソッドのコピー

シングルトンメソッドとは、特定のオブジェクトにのみ定義されたメソッドのことです。

dupメソッドでは、これらのメソッドはコピーされませんが、cloneメソッドではコピーされます。

```rb
# dupの例
original = "Hello"
def original.greet
  "こんにちは"
end

copy = original.dup
puts original.greet   # => こんにちは
puts copy.respond_to?(:greet)  # => false

# cloneの例
original = "Hello"
def original.greet
  "こんにちは"
end

copy = original.clone
puts original.greet   # => こんにちは
puts copy.greet       # => こんにちは
```

# まとめ

どちらも浅いコピーを行うメソッドですが、複製を行える範囲が異なることを理解できたと思います。

Ruby Goldの試験で出てくるので、覚えておきましょう。
ReEarthハンズオンセミナー

## 本日のセミナー・イベント
https://reearth.connpass.com/event/330166/

## ReEarthとは？
https://reearth.io/ja/

正直、この記事を書き終わって改めて書いている今の私にもわからんのです…
デジタルツインに対応できるよ！位の浅い知識で参加したが、どうやって？の疑問は抱えたままである。
そのため、本稿では「デジタルツインの事例や活用方法は分からないが、とりあえずReEarthを触ってみた」という観点でまとめている。

## ハンズオン・セミナーパート
### アカウントを作ろう
公式ページからサインイン・サインアップ。メールで認証するいつものやつなので略。
なお、言語設定は自動・日本語・英語から選択可。
無料で作れる・使える。

### プロジェクトを作ろう
デフォルトでアカウント名と同じワークスペースが作られており、特に理由がなければそのままでよし。
もちろん、新しくワークスペースを作ってもよし。

なんしか、ワークスペース以下にプロジェクトが作成できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/af431841-905e-845e-2184-7fd692552540.png)

こんな感じの画面が開けていればOK（レイヤーについて、後述のマーカーまでやってしまった図）

### マーカーを置こう
ここでは、スカイツリーを置く。

マーカーアイコンを地球儀っぽいウィンドウに適当にドラッグし、マーカーが地球儀ウィンドウ上にとりあえず置かれればOK
先ほど置いたマーカーを選択し、右枠レイヤータブ内のマーカーの各項目から緯度・経度を編集すればきちんと意図通りに反映できる
（もちろん、自分で探して置いても良い）

- 緯度　35.7100069
- 経度　139.8108103

画像は任意で持ってこよう

#### 補足・テキストラベルを設定しよう
画像を貼るとなんかそれっぽい感じになるが、やっぱりテキスト情報もほしいよね！というのでラベルを追加できる
先ほど設定した右枠から探すと見つかるので、それぞれいい感じにやってみよう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122800/d67abb1c-c70c-8093-35e6-ca0a50103de2.png)

一番ハマったのが、マーカーのドラッグアンドドロップ。なんかうまいこと行かなかったんだけど、何回か落ち着いてやれば置けた。

### インフォボックスでレイヤーの情報を補足しよう
リッチなテキストラベルかな？

マーカーを置く手順までは同じ。緯度経度も設定しておく（必須ではないが、やっておくと地球儀上に反映されるので探すのが楽）
なお、緯度経度はGoogleMapで特定しても良いし、観光地などであれば名前＋緯度経度で検索orAIに聞く方法が早い。

右枠のレイヤータブをインフォボックスタブに切り替える。吹き出しっぽいアイコンがそれだ。
これを使うと、吹き出しが出てくる。どうやらブロックエディタらしいので、入れたい要素を指定して設定していく。一番手軽なのはテキストボックス。
以下、画面を見ていけばなるほど納得なUXになってる。Qiitaを見ている層なら説明不要で使えるだろう。
マークダウンも使えて便利！

なお、画像を使う場合はサイズの変更もできるよ！
テキストボックスも同様かな。

### 各要素のプロパティ設定変更
やり方は一緒。
左枠のアウトラインタブ内にシーン・レイヤー・クラスターが選択できるので、ここでシーンを選択
そうすると、右枠がシーンの設定に切り替わる。

特に共有機能が優秀。Googleのサービスを使い慣れていたら違和感を持たないかなと。
サクッとやってるけど、大体のSaaSはこんなに便利に共有できないんよね。

### ハンズオン課題
- 雷門を作る
- 東京タワーを作る

やること

- 緯度経度ググる
- それっぽい画像探す
- GPTに紹介文を3行ぐらいで書かせる

操作に慣れれば3分ぐらいでサクッと作れた。

## 所感
めちゃくちゃ丁寧に説明してくれるので、途中から本稿にまとめ始めたがそれでも余裕があるぐらい。
そもそもエンジニア向けではないので、ツールの使い方の説明も入念だったのかな。
操作説明→デモ→ハンズオン→再度デモの流れ。
何気に資料も初学者向けを想定されている丁寧な作りで助かる。用語集はいいね！

基本的にUnityのもっと簡単版と考えて良さそう。目的がそもそも違うので説明として適切かどうかは微妙だが、UIイメージはしやすいのではないだろうか。
3Dで細かい内容を制御したりしないので入力項目がシンプルだからということもありそうだ。

本セミナーを通じてReEarthの使い方はわかったが、どうやって個人・ビジネス利用するんだろう？
ReEarthの活用セミナーやデジタルツインの事例があると助かる。
無線受信を0.3秒ためて出力(M5NanoC6)(ESP_NOW_Serial_Class)


無線受信を0.3秒ためて出力(M5NanoC6)(ESP_NOW_Serial_Class)

目的
前後するが画面表示のちらつき防止の為に
ある程度、文字を貯めて出力する

無線で画面表示を参照の事



```c++


//ESP_NOW_Serial_SSD1306_M5NanoC6_1


//インクルド
#include "ESP32_NOW_Serial.h"
#include "MacAddress.h"
#include "WiFi.h"
#include "esp_wifi.h"


//定義
// Channel to be used by the ESP-NOW protocol
#define ESPNOW_WIFI_CHANNEL 1
#define ESPNOW_WIFI_MODE WIFI_STA     // WiFi Mode
#define ESPNOW_WIFI_IF   WIFI_IF_STA  // WiFi Interface

//ここは、相手先のMACアドレスを記述する。
// Set the MAC address of the device that will receive the data
// For example: XX:XX:XX:XX:XX:XX
const MacAddress peer_mac({0x48, 0x27, 0xE2, 0xE3, 0xBD, 0x50});
//const MacAddress peer_mac({0x40, 0x4C, 0xCA, 0x5A, 0xE3, 0x1C});

//無線のシリアル
ESP_NOW_Serial_Class NowSerial(peer_mac, ESPNOW_WIFI_CHANNEL, ESPNOW_WIFI_IF);


//MACを16進に変換
char *mac_add_conv(const uint8_t *a) {

  char h[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
  static char b[16 + 1];

  for(int i=0;i<6;i++){
    b[i*2+0] = h[a[i] >> 4];
    b[i*2+1] = h[a[i] & 0x0f];
  }
  b[12] = 0;

  return ( b );
  
}//mac_add_conv


//1文字の送信
void now_ch(char ch) {

  while ( !(NowSerial.availableForWrite()) ) {
    delay(5);//連続送信防止
    Serial.println(".");
  }

  if (NowSerial.write(ch) <= 0) {
    Serial.println("Failed to send data");
  }

}//now_ch


//文字列の送信
void now_print(char *str1)
{
  //文字の中身がゼロか
  while (*str1) {now_ch(*str1 ++); /*一文字出力*/}
}//now_print


//初期化
void setup() {

  //WiFiモードとWifiチャンネルの設定
  WiFi.mode(ESPNOW_WIFI_MODE);
  WiFi.setChannel(ESPNOW_WIFI_CHANNEL, WIFI_SECOND_CHAN_NONE);

  //シリアルポートの初期化
  Serial.begin(115200);

  //WiFiの起動待ち
  for (int i = 0; i < (6+3); i++) {
    Serial.print(".");
    delay(500); //接続待ち
  }
  while (!(WiFi.STA.started())) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  //WiFiメッセージの表示
  Serial.print("to  MAC Address: " );
  Serial.println( mac_add_conv( peer_mac  ) );
  Serial.print("WiFi Mode: ");
  Serial.println("Station");
  Serial.print("Channel: ");
  Serial.println(ESPNOW_WIFI_CHANNEL);
  Serial.print("MAC Address: ");
  Serial.println(WiFi.macAddress());

  //ESP_NOW_Serialの起動
  // Start the ESP-NOW communication
  Serial.println("ESP-NOW communication starting...");
  NowSerial.begin(115200); //無線シリアル
  Serial.println("You can now send data to the peer device using the Serial Monitor.\n");

}//setup


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

  static char data[4096+1];
  int str_num = 0;

  str_num = 0;data[0]=0;
  while (NowSerial.available()) {
    //Serial.print("[");
    data[str_num] = NowSerial.read();
    str_num++;
    if( str_num > 4095 ){str_num = 4095;}
    data[str_num] = 0;
    //Serial.print("]");
  }
  //Serial.print("(");
  //Serial.print("(");
  //Serial.print(str_num);
  //Serial.print(")");

  if( str_num != 0 ){
    //Serial.print("-");
    Serial.print(data);
  }
  
  //Serial.print(")");

  delay(300);

}//loop


```
paizaラーニング問題集「地下アイドルの夢」を解いてみた

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/choco_sniper_easy_99

▼考え方

この問題を解くために私が考えた内容1.～2.を以下に示します。

1. ライブイベントを実施しない場合は損益が確定しているため、forループを実施する前に処理します。

2. ライブイベントのうち損益が正になるものの損益額をすべて足すことで、利益の最大値を求めることができます。変数ptotalを出力します。また、ptotalには損益が負になるものは足されません。（損益が負になるものは）どう足しても負です。そのため、題意の通り損益0で処理すればよいので、ptotal=0の初期値のまま出力します。

▼コード
```py
########## 処理0(準備) インプット,リストや変数定義 ###########

N,M = map(int,input().split())

# ptotal: ライブイベントのうち損益が正になるものの損益額を格納する変数
ptotal = 0

# livepl: 各ライブイベントの損益額を格納する変数
livepl = 0

########## 処理1 利益の最大値を計算する処理 ###########

# 考え方1.
if N == 0 or M == 0:
    print(0)
    exit()

for _ in range(M):
    
    livepl = sum(list(map(int,input().split())))

    # 考え方2.
    if livepl > 0:
        ptotal += livepl

print(ptotal)
```
paizaラーニング問題集「値の計算」を解いてみた

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/resistor_ohm_calc_99

▼考え方

問題文にある抵抗値の計算法則に沿って、回路全体の抵抗値を計算します。

▼コード
```py
########## 処理0(準備) モジュールインポート,インプット,リストや変数定義 ###########

# math: 小数点以下の処理のためのモジュール
import math

N = int(input())

# sw: keyが抵抗のアルファベット、valueが抵抗値を示す辞書
sw = dict(input().split() for _ in range(N))
sw = {k:int(v) for k,v in sw.items()}

M = int(input())

t = list(input().split(" "))

# total: 回路全体の抵抗値を格納する変数
total = 0

# tmp: 抵抗値の計算をするための変数
tmp = 0

########## 処理1 回路全体の抵抗値を計算する処理 ###########

for i in range(M):

    # tc: 入力された抵抗の文字数を格納する変数
    tc = len(t[i])
    
    if tc == 1:
        total += sw[t[i]]
        
    else:
        for j in range(tc):
            tmp += 1/sw[t[i][j]]
        total += 1/tmp
        tmp = 0

print(math.floor(total))
```
ガルちゃんのテキスト内容を読み込んで順に出力していくPGM

<h3>ガルちゃんのテキスト内容を読み込んで順に出力していくPGM</h3>
<a href="https://qiita.com/shizuoka_miyako_19911118/items/1f1d6995f15d397fc49d">以前作った</a>ガルちゃんのテキスト内容ファイルを読み込んで、ガルちゃんのテキスト内容を読み込んで順に出力していくPGMをJavaScritで作りました。
<hr>
サンプルページURL: <a href="https://nanjomiyako2.github.io/GaruChanOutput1/">https://nanjomiyako2.github.io/GaruChanOutput1/</a>

githubURL:https://github.com/NanjoMiyako2/GaruChanOutput1

<hr>
ビット演算を利用すると 1 つの整数値で複数の属性を表現できる

## 内容

ビット演算を利用すると 1 つの整数値で複数の属性を表現できて便利です :wink: 

```rb
# 整数を 2 進数の文字列に変換するメソッドを定義する。
using (Module.new do
  refine Integer do
    def to_binary_string(digits = 4)
      to_s(2).then { "%0#{digits}d" % _1 }
    end
  end
end)

高血圧 = 1
高血糖 = 2
高コレステロール = 4
高尿酸 = 8

高血圧.to_binary_string
#=> "0001"
高血糖.to_binary_string
#=> "0010"
高コレステロール.to_binary_string
#=> "0100"
高尿酸.to_binary_string
#=> "1000"

太郎 = 2
太郎.to_binary_string
#=> "0010"
太郎.anybits?(高血圧)
#=> false
太郎.anybits?(高血糖)
#=> true
太郎.anybits?(高コレステロール)
#=> false
太郎.anybits?(高尿酸)
#=> false

二郎 = 11
二郎.to_binary_string
#=> "1011"
二郎.anybits?(高血圧)
#=> true
二郎.anybits?(高血糖)
#=> true
二郎.anybits?(高コレステロール)
#=> false
二郎.anybits?(高尿酸)
#=> true
```

## 参考

- [Integer#anybits? (Ruby 3.3 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/Integer/i/anybits=3f.html)