OmniAICreator/Qiita-1.07M huggingface dataset:
ブロックチェーン技術の未来予想！エンジニアが知っておくべき新たな可能性

ブロックチェーン技術は、暗号通貨だけでなく、多岐にわたる分野での活用が期待されています。

この記事では、ブロックチェーン技術の最新の未来予想を紹介し、エンジニアが知っておくべき新たな可能性について解説します。
具体的には、ブロックチェーン技術を活用したデータ管理、スマートコントラクト、ID認証、供給チェーン管理などの応用事例を紹介し、エンジニアがブロックチェーン技術を活用する際のポイントや課題についても詳細に解説します。
ブロックチェーン技術の未来に興味のあるエンジニアにとって興味深い記事です。

# 1. イントロダクション

ブロックチェーン技術は、初めてビットコインという形で世界に紹介されたときから、その革新的な概念が世界中のエンジニアや研究者から大きな関心を集めてきました。セキュリティが強化され、中央集権的な管理が必要なく、信頼性と透明性が保証されるこの技術は、今後の社会インフラにおける重要な要素となるでしょう。

# 2. ブロックチェーンとは？

ブロックチェーンは分散型データベースの一種で、情報の改竄が困難であり、取引記録を誰でも確認することが可能です。各取引は「ブロック」と呼ばれるデータのまとまりに記録され、それぞれが鎖のように連なって一つの大きな「チェーン」を形成します。

# 3. ブロックチェーン技術の具体的応用とエンジニアが注目すべきポイント

## 1. ブロックチェーンとデータ管理

ブロックチェーンは改竄が困難なデータ管理を実現します。これは、医療、研究、ビジネスなどの分野でのデータ共有を安全かつ信頼性高く行えることを意味します。例えば、病院は患者の医療記録をブロックチェーンに保存し、患者や医療チームが情報を適切にアクセスできるようにすることが可能です。エンジニアがブロックチェーンをデータ管理に活用する際には、プライバシーの保護やデータセキュリティの確保が重要な課題となります。

## 2. スマートコントラクト

スマートコントラクトは、ブロックチェーン上で契約を自動実行するためのプログラムです。例えば、不動産取引では、購入者が資金を提供し、売り手が所有権を移転するという取引が自動的に行われます。エンジニアがスマートコントラクトを設計する際には、コントラクトが正確かつ公正に実行されるよう、細心の注意を払う必要があります。

## 3. ID認証

ブロックチェーン技術を活用したデジタルIDシステムは、個人を一意に識別し、セキュアなアクセスを提供するための有効な手段となります。これは、オンラインバンキングや政府のサービス、医療サービスなどで特に役立ちます。エンジニアがブロックチェーンをID認証に活用する際には、個人情報の保護という重要な課題があります。

## 4. 供給チェーン管理

ブロックチェーンを供給チェーン管理に活用すると、商品の製造元から消費者までの全過程をトラックし、その透明性を確保することができます。これにより、偽造品の排除や、製品の安全性と品質の確認が可能になります。エンジニアがブロックチェーンを供給チェーン管理に活用する際には、大量のデータを効率的に処理することが重要な課題となります。

# 特にエンジニアが注目すべき点はスマートコントラクト

スマートコントラクトはブロックチェーン技術の最も革新的な応用例の一つで、特定の条件が満たされたときに自動的に契約を実行するプログラムです。これは取引の速度と効率性を大幅に向上させ、仲介者の必要性を排除します。エンジニアがスマートコントラクトに取り組む際に注目すべきいくつかの重要な点があります。

## 1. プログラミングスキルと法律知識

スマートコントラクトはプログラムであるため、エンジニアはプログラミングスキルを必要とします。また、これらの契約は法的な意味合いを持つため、基本的な法律知識も必要となることがあります。特に、スマートコントラクトは条件が満たされたときに自動的に実行されるため、そのプログラムが正確であることは絶対に必要です。

## 2. セキュリティ

セキュリティはスマートコントラクトで非常に重要な要素です。スマートコントラクトのバグや脆弱性は攻撃者に悪用される可能性があり、大きな損失を引き起こすことがあります。したがって、エンジニアはスマートコントラクトの設計と実装の際にセキュリティを常に考慮に入れる必要があります。

## 3. 不変性

一度ブロックチェーンにデプロイされると、スマートコントラクトは変更することができません。これは、スマートコントラクトが意図したとおりに動作することの重要性を強調しています。バグの修正や機能の改善を行うためには新たなスマートコントラクトをデプロイする必要があります。

## 4. ユーザビリティと透明性

スマートコントラクトのユーザビリティと透明性も重要な考慮事項です。スマートコントラクトの動作は透明で理解しやすくなければなりません。また、スマートコントラクトが複雑すぎると、ユーザーはそれを使うことを避けるかもしれません。そのため、エンジニアは、ユーザーがスマートコントラクトの目的と機能を理解し、それを信頼できるようにすることが重要です。

これらの点を考慮に入れつつ、エンジニアはスマートコントラクトの開発に取り組むことで、ブロックチェーン技術の可能性を最大限に引き出すことができます。

# 4. まとめ

ブロックチェーン技術は、セキュリティ、信頼性、透明性を重視する現代社会にとって必要不可欠な道具となっています。未来に向けて、エンジニアはこの革新的な技術の可能性を探求し続け、社会のさまざまな領域でその応用を実現することが求められます。ブロックチェーンの新たな可能性を探り、技術の進歩と共に、より良い未来を築きましょう。

# 最後に
エンジニアの皆さん、エンジニア未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
Azure Logic AppsのIaC化にはBicepがおススメです

船井総研デジタルのよもぎたです。

Azure Logic Appsは多彩なInput/OutputやフローをAzure PortalのWebUIから実現できるとても強力なサービスです。その反動といいましょうか、IaC化するとき、Terraformではとても苦戦してしまいました。しかし、Bicepに切り替えたらとてもラクでした。そのアレコレを共有いたします。

# ロジックアプリのIaC化のどこに苦戦したか
Azure Portalからロジックアプリを作成したときと同様の、空（から）の、何の処理も定義されていないロジックアプリをTerraformで作成するのは難しくありませんでした。でも、ロジックアプリの処理まで含めて、IaC化したいですよね。そこに踏み込もうとすると、冒頭に書いたロジックアプリの多機能さ故、リソースの定義がとても難しくなってしまうと感じました。

# なぜBicepがよいのか
ARMテンプレートのJSONファイルをAzure Portalからエクスポート出来るのはご存知かと思います。それをBicepにデコンパイルでき、それをもとに、同様の処理を実行するロジックアプリをパラメータを変えつつデプロイできるからです。

ARMテンプレートをBicepにデコンパイルする方法は、同僚の [@fsdg-takada](https://qiita.com/fsdg-takada) の[ポータルで作成したAzure Logic Appsをインフラのコード化（IaC）で再現（ARMテンプレートからBicepに変換する裏技付き）](https://qiita.com/fsdg-takada/items/5c2c104afa04110f22c7) で知りました。感謝。

# 実際にどうやるか

## 全体像

1. Azure Portalからロジックアプリを作成する。
1. 作成したロジックアプリのARMテンプレートをエクスポートする。
1. ARMテンプレートをBicepにデコンパイルする。
1. Bicepをデプロイ先によって変えたい部分と変わらない部分に分割する。
1. ロジックアプリを修正しながらデプロイ先によって変えたい部分の具体的な値を取得する。
1. 必要なパラメータを集めて、デプロイ先ごとのファイルを作成する。
1. いざ、デプロイする。

大まかなイメージは掴んで頂けるのではないかと思います。

## 環境構築
必要に応じて実施してください。Azure CLIでBicepを扱えるようにします。

```bash
$ az bicep install
$ az bicep upgrade
```

## ARMテンプレートのエクスポートとBicepへのデコンパイル
簡単に書いてしまうと次の1行ですが、詳しくは上記の [@fsdg-takada の記事](https://qiita.com/fsdg-takada/items/5c2c104afa04110f22c7)をご覧ください。

```bash
$ az bicep decompile --file armtemplate.json
```

## Bicepファイルの分割
ここでは、仮に開発環境（dev）と本番環境（prod）の２つの環境にパラメータを変えてデプロイしたいとします。ファイル名は次の通りとします。

- 共通部分を記述したファイル： ```logicapp_common.bicep```
- dev環境固有のパラメーターを記述したファイル： ```logicapp_dev_env.bicep```
- prod環境固有のパラメーターを記述したファイル： ```logicapp_prod_env.bicep```

まず、 ```logicapp_common.bicep``` から変数として切り出したい部分の記述を修正します。ここでは、例としてロジックアプリの名前を変更します。ロジックアプリの名前は、 ```logicapp_common.bicep``` では次のように定義されています。

```
param workflows_logicapp_..._name string = '<logicapp-name>'
---<snip>---
resource workflows... {
---<snip>---
    name: workflows_logicapp_..._name
---<snip>---
}
```

ここで、それぞれの環境にファイルを用意してやります。```workflows_logicapp_..._name``` は長いので、 ```logicappName``` に変更します。

dev環境のファイル ```logicapp_dev_env.bicep``` は下記のようになります。

```
module devModule 'logicapp_common.bicep' = { # 後続で読み込みたいファイル名を指定する
  name: 'logicapp_deploy_for_dev_env'
  params: {
    logicappName : 'logicapp-bicep-dev'
  }
}
```

共通ファイルの ```logicapp_common.bicep``` は次のように変更します。

```
param logicappName string # 変数の型だけ宣言して、値は代入しない。これを記述しないと、モジュールファイルから変数を継承できない。
---<snip>---
resource workflows... {
---<snip>---
    name: logicappName # 変更後の変数名にする
---<snip>---
}
```

```logicapp_prod_env.bicep``` も同様で、下記のようになります。

```
module devModule 'logicapp_common.bicep' = {
  name: 'logicapp_deploy_for_prod_env'
  params: {
    logicappName : 'logicapp-bicep-prod'
  }
}
```

## 環境ごとにデプロイする
Bicepファイルが作成出来たら、デプロイしましょう。環境ごとのBicepファイルをデプロイすることで、あわせて共通部分のBicepファイルも読み込まれてデプロイされます。

dev環境のデプロイ

```
$ az deployment group create --resource-group rg-<resource group name> --template-file logicapp_dev_env.bicep
```

prod環境のデプロイ
```
az deployment group create --resource-group rg-<resource group name> --template-file logicapp_prod_env.bicep
```

# まとめ
簡単な例しかご紹介していませんが、パラメータを変えつつ同じ処理をするロジックアプリを複数デプロイする方法は掴んで頂けたと思います。

これからもAzure推しでいきたいと思います。

最後までお読みいただきありがとうございました。
初めて作ったウェブアプリを公開しました。（React＋Supabase）

# 私について
ウェブ開発を学んでいます。
昨年からフロントエンド開発者として、
とあるウェブサービスの開発のお手伝いをさせていただいております。

今回は、学んだReactを使って、世に公開できるウェブサービスを作成してみたいと思い、
[Motive Diary](https://www.motive-diary.com/)というウェブアプリを作成しました。

<img width="800px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2848520/9799aacb-6118-1411-36cb-424e6619c356.png"/>

# 背景
まず、最初のきっかけは、
「他の人はどういう感じで勉強を進めているのか気になるな」
でした。
そこで、勉強の記録を共有できるサイトを作成しようと思いました。

そして、よくエンジニアの皆さんがTwitterで#100daysofcodeというハッシュタグを使ったり、
「勉強○日目、〇〇を勉強」みたいなツイートをしているのを見ますが、
いざ、自分が今までどういう進捗具合で勉強をしてきたかを見返そうとしても、
他のツイートや記録に邪魔されて、一気に見返すことができませんでした。

そこで、日々の記録を簡単に見返せて、
他人と共有できる日記SNSアプリみたいなものにしようと決めました。

# アプリ概要
「[Motive Diary](https://www.motive-diary.com/)」は 
1. 達成したい目標と達成までの日数を設定する
1. 日々の記録を行う
1. 過去の進捗を簡単に見返すことができる
1. 他人の勉強の記録を閲覧し、参考にすることができる

アプリです。

# 使用技術
フロントエンド：React
バックエンド：Supabase
デザイン：Material-UI
デプロイ：Vercel

# 大変だったこと、改善したいこと

### モチベーションの維持
一人でやっているので、作業しなかった週があったりもしました。

### Supabaseの情報の少なさ
まだ日本語解説記事も少なく、Supabaseのドキュメントを読み込むのが大変でした。特にテーブルの制約周りなどは、いまいち理解できない部分があったので、たくさんの英語記事やStackOverflowを活用しました。

### ウェブデザインへの理解度が低い
デザインも悩みまくって何度も作り直しました。
最初に見た目をある程度決めておかないで作成し始めてしまったので、一度大幅に作り変える必要が発生し、苦労しました。
今後も見た目についてはアップデートしていきたいと思っています。

### きれいなコードを書くこと
できるだけ不要部分の削除と、共通化を進めながら、きれいなコードと言えるのか？
と疑問に思いながら作業していました。今後も改善していきます。

# 挑戦したこと
ドメインを取得して、設定してみました。
Vercelを使用することで簡単できてしまい、感動しました。


# 今後
随時気が向いたらアップデートしていきたいです。
全体的な使いやすさの向上、新規機能として通知機能やリアルタイムでやり取りできる機能など、いくつかやってみたいことがあります。

# 最後に
ぜひサイトを閲覧していただき、よければ会員登録と実際に使用してみてほしいです。
比較的シンプルな日記帳アプリではありますが、自分で考えてゼロから構築した初めての作品です。
ぜひフィードバックいただければと思います。

お読みいただき、ありがとうございました。

[Motive Diary](https://www.motive-diary.com/)
無償ハンズオントレーニング AWS セキュリティ　クリニック　参戦記

## 前書き
AWSの研修に参加してきました。その備忘録です。
3日分あるので、ちょっと長くなるかもしれません。本当に一部の一部だけを抜粋します。

# Day1
・IAM Roles Anywhere
公開鍵基盤 (PKI) によって発⾏された X.509 証明書を使⽤して、AWS 外のワークロードで⼀時的な AWSクレデンシャル を使⽤するサービス。オンプレでもIAMロールが使えるってことらしい。

・VPCのアドレス拡張
マネコンからポチポチで簡単に拡張が可能。あと、EC2のインスタンスタイプもポチポチで簡単に変更できる。クラウド凄い

・サブネット
AZに紐づいているサービス。だからAZをまたいでサブネットを作ることはできない。絶対に勉強してるはずなのに、忘れてしまっていた。実践を伴わない知識はなかなか定着しませんね。

・NACL
講師の方が「ナックル」と呼んでいました。自分も今後ナックルと呼びます。こういう略語って人によって呼び方違いますよね。
今のPJで先輩が「キューブコントロール」と何度もおっしゃっていて、何を指しているのか初めはわからなかったのですが、何回か聞いているうちに「kubectl」を指しているのだと気づきました。自分は心の中で「クーベシーティーエル」と呼んでいたので、全く紐づいていませんでした。
こちらに関しては、kubernetesを「クーベ」と呼ぶのが好きなので、我を通そうと思います。

・GuardDuty
ログを分析して、悪意のあるアクティビティを特定してくれるサービス。
不正アクセスされた EC2 インスタンスがマルウェアを提供したり、ビットコインをマイニングしたりすることを検出してくれる

・GWLB
IPS, IDSサービスをうまく動かすためのサービス。
EC2のオートスケーリングじゃダメですか？と聞いたところ、
> ・　パケットの検査はインバウンドとアウトバウンドで同じインスタンスを通らないといけない
・ライセンスが必要なサードパーティのサービスは立てた台数分余分に費用が掛かるから、あまりインスタンスを立てたくない
・5tuple云々（ちゃんと理解できませんでした）

等の理由でL3層でバランシングできるのが嬉しいらしいです。
この日一番勉強になりました。

・インスタンスメタデータ
v2では、セッショントークンを用いたアクセスを採用しており、セキュリティが向上しているとのこと

## ハンズオン

[AWS ID およびアクセス管理 (IAM) Immersion Day](https://catalog.us-east-1.prod.workshops.aws/workshops/18b3622c-5d4c-45c9-9834-6a7091109072/ja-JP )

初日なので易しめだった＆PJで最近近いことをしたので、順調に進みました。


# Day2
・Security Hub
WAFやGuardDutyなど、危険を察知するサービスの通知をまとめて引き受ける場所。

 Amazon Security Findings Format（ASFF）
 →AWS Security Hubによって定義された共通のスキーマ。このスキーマは、さまざまなAWSサービスやサードパーティのソリューションからのセキュリティの警告や異常を統一的に表現するために使用される。

・Shield Advanced
DDoS対策のサービス。最低でも3000$~/monthらしい。
ただ、AWSに委任すれば勝手にリソースの改修をしてくれたり、追加でかかるリソースの費用がものによっては無料になったりするらしい。

・ VPC Flow Logs
ENI, サブネット、VPCごとに有効化できる。

## ハンズオン
[Amazon GuardDuty と Amazon Detective を使用した脅威検知と対応](https://catalog.workshops.aws/guardduty/ja-JP )

・Tor（The Onion Router）ネットワーク
インターネット上の匿名性とプライバシーを保つために設計された無料のオープンソースソフトウェア

Q.
ブロックチェーンと何が違うの？
A.
    1. Torネットワークは、ユーザーのオンライン活動を匿名化しプライバシーを保護することを目的としています。Torはインターネットトラフィックを多数のリレー（サーバー）を通じてルーティングすることで、ユーザーの行動を追跡することを困難にします。このようなシステムにより、インターネット接続の監視やセンシップから逃れることが可能になります。
    2. ブロックチェーンは、情報を分散化し、不変性と透明性を提供するデータ構造です。ブロックチェーンは主にデジタル通貨（ビットコインなど）のトランザクションの追跡に使用されますが、その他の用途（スマートコントラクト、分散型アプリケーションなど）も存在します。ブロックチェーンは情報をネットワーク全体に分散し、全てのトランザクションが各ブロックに永続的に記録されるため、データの改ざんが非常に困難です。

by GPT先生

本ハンズオンでは攻撃する側も守備する側も行ったのですが、攻撃する側がハッカーを疑似体験したみたいで楽しかったです。インスタンスメタデータ見ただけなんですけどね。

# Day3
・KMS
S3のオブジェクトやEBSには、それぞれ固有のデータキーが存在する。
複数リージョンにレプリケートできる。HSMでは不可能。


・inspector
対象のサービスはEC2, ECR, Lambda
Lambdaのコードレビューができるようになった。
AMIとコンテナもチェックできるようになった。
EC2のディープインスペクションができるようになった。

## ハンズオン
[Startup Security :迅速な構築の中でセキュリティを確保するためのテクニック](https://catalog.workshops.aws/startup-security-stay-secure-while-building-quickly/ja-JP )
こちらもDay2と同様に、攻撃側と守備側を行いました。
今回は、ハンズオン用のECサイトのログイン画面からSQLインジェクションを行いました。ハッカー度合いが増して、やはり楽しかったです。


## 感想・まとめ
セキュリティ関連のサービスは資格勉強でたびたび名前は目にするものの、具体的なサービスの中身はあまり知らなかったので勉強になりました。
【Vue】Google Places API でインクリメンタルサーチの実装【JS】

## 概要
今回は、地点を検索するフォームに文字が入力されたとき、一文字打つごとに候補がサジェストされるインクリメンタルサーチを作ります。

![画面収録-2023-06-02-15.09.09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/918e9488-7dd0-927a-5aac-c88b091917dc.gif)

## 実装
### Google APIの準備 
Google Maps APIのPlaces API を使用するので、あらかじめAPIキーを取得しておきましょう。

https://developers.google.com/maps/documentation/places/web-service?hl=ja


### 検索フォームにイベントを追加
フォームの`@input`に関数をセットします。
フォームの内容が変わる度にAPIが呼び出され、suggestが更新されます。

``` vue
<input 
     v-model="keyword" 
     type="text" 
     placeholder="行きたい場所" 
     @input="Search" 
/>

<div
    v-for="suggest in suggests"
    :key="suggest"
>
    {{ suggest }}
</div>
```

### 現在地の情報を取得する
Places APIを使うために現在地情報が必要になります。
onBeforeMountでVueGeolocationを使い、取得しておきます。

```js
import { ref, onBeforeMount } from 'vue'
import VueGeolocation from 'vue3-geolocation'


//現在地情報の取得
const current = ref({
        lat: undefined,
        lng: undefined,
        getLocation: () => {
            VueGeolocation.getLocation()
                .then((coordinates) => {
                    current.value.lat = coordinates.lat //現在地の緯度
                    current.value.lng = coordinates.lng //現在地の経度
                })
                .catch((error) => {
                    console.log(error)
                })
        },
    })

onBeforeMount(() => {
    current.value.getLocation()
})
```



### Places APIを呼び出す
```js
import axios from 'axios'


const keyword = ref()

//検索フォームの内容が変わるたび、place apiを呼び出す
const Search = async () => {  
        await axios
            .get(https://maps.googleapis.com/maps/api/place/textsearch/json, {
                params: {
                    query: keyword.value,
                    location: current.value.lat + ',' + current.value.lng, 
                    radius: '50000',
                    language: 'ja',
                    key: 'google APIのキー',
                },
            })
            .then((res) => {
                suggests = res.data.ResultSet.Point
            })
    }
``` 


以上になります。ぜひご参考いただけますと幸いです。

![画面収録-2023-06-02-15.09.09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1175390/918e9488-7dd0-927a-5aac-c88b091917dc.gif)
【CSS】印刷プレビューになった途端に消える文字色、スタイル

# はじめに

起きた現象はこんな感じです。

Webブラウザ上では正しく表示されていたものが、印刷プレビューになった途端に白黒になりました。

もちろん印刷しても白黒でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71795/e1807f16-9181-6f12-d97d-7da8a8440f83.png)
（↑ブラウザ上）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71795/78c0210a-674b-a5cf-047c-e00d83763193.png)
（↑印刷プレビュー）


# 結論

HTMLでのclass属性の付与、子要素への継承（カスケード）

これが印刷プレビュー時に消滅するという謎の仕様でした。


# ソース、CSS部分
ただ文字色変えてるだけです。
ちなみにここで!import!追加しても駄目でした。

```css
.sunday {
    color: red;
}
.saturday {
    color: blue;
}
.holiday {
    color: red;
}
```


# 駄目だった時のソース（Before）

```html
<table id='print-area'>
<thead>
<tr>
<th colspan='7'>
<h1 class='center ymb'>2023-06 June</h1>
</th>
</tr>
<tr>
<th class='sunday'>Sun</th>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
<th class='saturday'>Sat</th>
</tr>
</thead>
<tbody>
<tr>
<td class='num_masu'>
</td>
<td class='num_masu'>
</td>
<td class='num_masu'>
</td>
<td class='num_masu'>
</td>
<td class='num_masu thursday'>
<div>1</div>
</td>
<td class='num_masu friday'>
<div>2</div>
</td>
<td class='num_masu saturday'>
<div>3</div>
</td>
</tr>
<tr>
<td class='num_masu sunday'>
<div>4</div>
</td>
<td class='num_masu monday'>
<div>5</div>
</td>
```


# 改良後のソース（After）

見るべきは「sunday」「saturday」のclass指定を、tdからdivそれぞれに変えた事です。

```html
<table id='print-area'>
<thead>
<tr>
<th colspan='7'>
<h1 class='center ymb'>2023-06 June</h1>
</th>
</tr>
<tr>
<th class='sunday'>Sun</th>
<th>Mon</th>
<th>Tue</th>
<th>Wed</th>
<th>Thu</th>
<th>Fri</th>
<th class='saturday'>Sat</th>
</tr>
</thead>
<tbody>
<tr>
<td class='num_masu'>
</td>
<td class='num_masu'>
</td>
<td class='num_masu'>
</td>
<td class='num_masu'>
</td>
<td class='num_masu'>
<div class='thursday'>1</div>
</td>
<td class='num_masu'>
<div class='friday'>2</div>
</td>
<td class='num_masu'>
<div class='saturday'>3</div>
</td>
</tr>
<tr>
<td class='num_masu'>
<div class='sunday'>4</div>
</td>
<td class='num_masu'>
<div class='monday'>5</div>
</td>
```


# 途中で確認したもの

## 別のカラフルページを印刷プレビュー
色々とソースコードを触ってから確認してましたが、まず確認するべきだったのここですね。

プリンターの設定など機器の問題という可能性も低くはないはずなので。

## ブラウザを変更しても同じか？
Chrome環境でしたが、Edge, Brave, Firefoxと同じ現象でした。

調べておいてなんですけど、可能性そんな高くなかったかも……ｗ


## 全てに強制適用のCSS

これがヒントになった部分も大きかったかもです。

「あっ、全部白黒じゃないんだ」みたいな。

```css
* {
    color: red;
}
```

## CSSの読み込み順

後に書かれたものが優先される、っていう忘れがちな仕様。

何度か確認しました。


# まとめ

印刷時だけ変わるのなんで……？

聞いた事も無いし、調べてもそれっぽいものヒットしない現象でした。

@media printみたいなCSSもやりましたけど、印刷時も白黒なっちゃったし。

めちゃ簡単に解決出来る現象でしたけど、chatGPTに聞いても解決しなかったものなので、一応記録しておきます。



終わり
【学習】Ruby on Rails チュートリアル 第7版 - 第9章 高度なログイン機構

6/5 8:30 開始

・パスワードとトークンとの一般的な違い
パスワード：ユーザーが作成・管理する情報
トークン：コンピューターが作成・管理する情報

9.1.1まで終了

6/5 9:00 終了

6/6 8:15 開始


encryptedとpermanentをメソッドチェーンでつなぐと、
ユーザーIDと記憶トークンは永続化でき、ペアで扱うことができる。

    cookies.permanent.encrypted[:user_id] = user.id


cookiesを設定すると、以後のページのビューで↓のようにcookiesからユーザーを取り出せる。

    User.find_by(id: cookies.encrypted[:user_id])


9.1.2まで終了

6/6 8:50 終了

6/7 8:15　開始

・早期脱出
処理を途中で終了する場合によく使われる

    return false if remember_digest.nil?

同じ意味↕︎

    if remember_digest.nil?
      false
    else


9.1まで終了

6/7 8:40 終了


6/8 7:50 開始

・三項演算子
3つの部分から構成される↓
論理値? ? 何かをする : 別のことをする

    (例)
      if boolean?
        var = foo
      else
        var = bar
      end

三項演算子を使うと、上のコードは↓になる。

      var = boolean? ? foo : bar


9.3.1まで終了

6/8 8:40 終了

6/13 8:20 開始

*assert_equal
expected == actualがtrueであることを確認します。
引数は「期待する値、実際の値」の順序で書く点に注意


    assert_equal( expected, actual, [msg] )
    

その他、便利なメソッドは[こちら](https://ruby.studio-kingdom.com/rails/guides/testing#2 "アサーション")


9章 終了!

6/13 9:10 終了
Arxiv論文の自動収集ツール作ってみた

## はじめに
以前論文検索アプリケーションの開発と[解説記事](https://qiita.com/nomnomnonono/items/71fe14f5493a42f9b15d)を作成したのですが、そこでArxiv APIそのものがとても有用であることに気付きました。そこでArxiv APIを用いた、論文自動収集アプリケーション（CUI）の開発について簡単にまとめます。

github：https://github.com/nomnomnonono/Arxiv-Downloader

## 方針
- Arxiv APIを用いることで論文情報を簡単に取得できるが、Arxivには数え切れない量の論文が投稿されているため、その全てを取得しようとするのは非効率
  - そこで検索クエリを工夫して、論文タイトルに含まれるキーワードやカテゴリを指定することで、自身が欲しい論文に絞って収集することを考える
- 前回収集時の時刻を保存しておくことで、次回実行時に前回実行時からの差分のみを取得する
- configファイルで検索クエリ等の各種設定を用意することで、論文カテゴリ（Segmentation, GAN, etc.）ごとの収集を別で実行できる

## 実装
後で書きます。

## 使い方
まずconfigファイルの例を以下に記載します。

```bash
base_dir: data  # データ保存先のベースとなるディレクトリ名
before: '20230525215921'  # 前回収集時刻
download_pdf: false  # pdfの保存をするか否か（とても時間がかかる）
max_results: 1000  # 最大取得件数（基本的にはかなり大きくする）
query: 'ti: fairness AND (cat:cs.LG OR cat:cs.AI OR cat:cs.CV)'  # 検索クエリ
tag: fairness  # configファイルを識別する一意なタグ
```
実行結果は以下のようなディレクトリ構造で保存されます。
```bash
base_dir
  ├ {tag}.csv
  └ tag
     ├ a.pdf
     ├ b.pdf
     ...
```
プログラム実行後にはconfigファイルの```before　（前回収集時刻）　```が自動で更新されるようになっています。

ユーザが実際に任意に変更する```query　（検索クエリ） ```について簡単に説明します。（詳細な情報は[こちら](https://info.arxiv.org/help/api/index.html)をご覧ください）
例のconfigファイルでは、タイトルに```fairnesss```が含まれている
```
ti: fairness
```
かつ
Arxivで定義されているカテゴリが```cs.LG, cs.AI, cd.CV```のいずれか
```
cat:cs.LG OR cat:cs.AI OR cat:cs.CV
```
であるような論文を取得するように設定しています。

他にも著者や投稿日時等を用いて検索を行えるので、自身にあった使い方をしていただければと思います。


## おわりに
ここまで読んでいただきありがとうございます！
簡単なアプリケーションのため解説も丁寧ではないのですが、是非ご活用していただければと思います:bow:
ネットワーク (1) : Windows -> Kali(Linux) -> Target (VPN接続)

# Windows -> Kali -> Target (VPN接続)
ネットワークシリーズの第一弾です。

HTB, TryHackMe,Offsec PGを実施していると、幾度となくKaliとWindowsを同時にターゲットサーバーにVPN接続したい場合があります。しかし、これらのサービスは、一つの端末からの接続に制限されています。またKaliとWindowsのVPNを毎時切り替えるのもつらいものがあります。今回は、VPN接続されたターゲットに、KaliをGWにして、Windowsから接続できる設定を解説します。

参考

https://www.youtube.com/watch?v=rfAmMQV_wss&t=2805s
https://www.youtube.com/watch?v=lxjAZELJ96Q&t=3430s


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/ecee6f80-03eb-0d4d-39be-3ce00f41f7db.png)
ネットワーク概要
Target (eth0):10.129.XX.XX/16 
Kali (tun0): 10.10.14.XX/23               
Kali (eth0): 10.0.0.108/24
Windows (eth0): 10.0.0.XX/24 


## Kali
#### 1. IPフォワード設定の確認。
```bash
cat /proc/sys/net/ipv4/ip_forward
```
１が有効。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/d95e4317-41e4-04e3-7e0c-1421b00e1249.png)
0であれば、以下を実行して下さい。
```bash
sudo su
echo 1 > /proc/sys/net/ipv4/ip_forward
```

#### 2. IPテーブルの作成 (tun0からeth0へのフォワード及びeth0からtun0へ)
Kali上でtun0からeth0とeth0からtun0のフォワードルールを作成。

```bash
sudo iptables -A FORWARD -i tun0  -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i eth0  -o tun0  -j ACCEPT
```
#### 3. IPテーブルの作成 (IPアドレスの変換- マスカレード)
Kaliに接続が来た時に10.0.0.0/24のIPアドレスをtun0のIPアドレスを変換。
```bash
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o tun0 -j MASQUERADE
```
説明によるとNATなので、接続が返ってきた時にもtun0から10.0.0.0/24に変換されます。

## Windows
アドミン権限でコマンドプロンプトを起動します。
#### Routing Tableへの追加
10.129.0.0/16をルートに追加し、サブネットマスクとGWを設定します。GWはKaliのeth0のIPアドレスになります。
```bash
route add 10.129.0.0 mask 255.255.0.0 10.0.0.181
```
この時のIPアドレスは以下になります。

- VPN先 eth0 のIP address: 10.129.26.212/16 
- Kali eth0のIP address: 10.0.0.181 

この設定は、VPN先のサーバのIPアドレスによって変わります。
さて設定を確認しましょう。
```bash
route print
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/2724050b-2e19-3a2d-faae-4425f555517a.png)
#### 接続の確認
```bash
ping 10.129.26.212
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/a729b02f-65e8-869c-fc54-84ea76577548.png)
接続できました。

#### ブラウザでの接続
HostsファイルやDNSを設定しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/b971e23d-70e2-30e6-0fa4-5e0f72d7fe9b.png)
DNSではネットワークアダプターのプロパティを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/4d866c4a-3448-3c6e-fe38-5f9295de003a.png)
DNSはVPN接続側のDNSサーバとグーグルのDNSサーバを設定しました。

#### VPN先へブラウザでの接続
うまく接続できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/9410395f-44d0-8115-bf1b-9770be89ee16.png)

今回はこれで終わりです。

次回は、この反対のTarget (VPN接続) -> Kali(Linux) -> www.exploit-data.comの設定です。

ハッピーハッキング！
orgファイルを更新すると出力ファイルも自動更新されるようにする

# はじめに

https://orgmode.org/ja/

Emacsのorg-modeで文章を書くと, `C-c C-e`([`org-export-dipatch`](https://orgmode.org/manual/The-Export-Dispatcher.html)) で,
[様々なファイル形式 (Markdown, HTML, PDF, LaTeXなど) に出力できます](https://orgmode.org/manual/Exporting.html).
しかし, orgファイルを更新するたびに, 手動で出力を更新するのは面倒です.

# 設定
そこで以下のように設定すると, orgファイル保存時に自動で出力ファイルも更新されるようにできます.
ただし, すでに出力ファイルが存在する場合にのみ自動出力するようにしています.
(例として, HTMLやMarkdownの設定のみ書いてますが, 必要に応じて他ファイル形式も追加したり, 削除したりしてください.)

```emacs-lisp:~/.emacs.d/init.el
(add-hook 'org-mode-hook
          (lambda ()
            (add-hook 'after-save-hook
                      (lambda ()
                        (when (file-exists-p (concat (file-name-sans-extension (buffer-file-name)) ".html"))
                          (org-html-export-to-html)
                          )
                        (when (file-exists-p (concat (file-name-sans-extension (buffer-file-name)) ".md"))
                          (org-md-export-to-markdown)
                          )
                        )
                      nil t))
          )
```

この設定により, 1度HTMLやMarkdownファイルを手動で出力すると, 以降はorgファイル更新時に自動でHTMLやMarkdownファイルも更新されるようになります.

# バージョン情報
- Emacs 28.2
- org-mode 9.6

# 関連記事
https://qiita.com/skkzsh/items/6328d2ec36c003be3713
markdown-modeでファイルを更新するとHTMLファイルも自動更新されるようにする

# はじめに

https://jblevins.org/projects/markdown-mode/

Emacsのmarkdown-modeでは, `C-c C-c e` (`markdown-export`) で, HTMLファイルを出力できる.
しかし, Markdownファイルを更新するたびに, 手動でHTMLファイルを再出力するのは面倒.

# 設定
そこで以下のように設定すると, Markdownファイル保存時に自動でHTMLファイルも更新されるようにできる.
ただし, `markdown-command` が存在かつ、すでにHTMLファイルが存在する場合にのみ自動出力するようにしている.

```emacs-lisp:~/.emacs.d/init.el
(add-hook 'markdown-mode-hook
          (lambda ()
            (when (executable-find markdown-command)
              (add-hook 'after-save-hook
                        (lambda ()
                          (when (file-exists-p (concat (file-name-sans-extension (buffer-file-name)) ".html"))
                            (markdown-export)
                            ))
                        nil t)
              ))
          )
```

この設定により, 1度HTMLファイルを手動で出力すると, 以降はMarkdownファイル更新時に自動でHTMLファイルも更新されるようになる.

# バージョン情報
- Emacs 28.2
- markdown-mode 2.6-alpha

# 関連記事
https://qiita.com/skkzsh/items/9bbcb8bcf02e32fe51d8
AdMobにiOSデバイスをテストデバイスを登録したいがadjust Insights動かない

# 概要
AdMobにテストデバイスを登録しようと思って
IDFAを取得しようとadjust Insightsを使用しましたが

![IMG_0299.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3352230/71b3aece-d21a-aab6-1166-443b97f532e4.jpeg)

画像の通り、適切に取得できていませんでした。
また詰まりそうなので備忘録的に残しておきます。

# AdMobのテスト実装について
AdMobをアプリに実装した際、開発中のデバイスで誤って広告をクリックすると、これが不正クリックと判断される可能性があり、最悪の場合、アカウントがBANされることがあります。そのため、テスト中の実機はAdMobに登録しておくことが重要です。

# IDFAとは
IDFAはIdentifier for Advertisersの略で、Appleが提供する広告対象者を識別するためのIDです。これは、ユーザーのプライバシーを守るために作られたもので、ユーザーが追跡を許可しない限り、アプリはユーザーを追跡することはできません。

# IDFAの取得方法
Androidでは端末情報からIDFAが取得できますが、iOSでは直接取得することはできません。そのため、iOSではadjust Insightsというアプリを使ってIDFAを取得することが一般的です。

# adjust InsightsでIDFAが適切に表示されない場合の解決策

1. アプリの設定を開き、「プライバシー」を選択します。
2. 「追跡」を選択し、「アプリによる追跡を許可する」をオンにします。
3. 再度adjust Insightsを開き、IDFAを取得します。



# まとめ

誤クリックでAdMob側から制限をくらい、アカウント永久追放になったら笑えないのでテストデバイスの設定は早めに行いましょう。


いいね、ブックマーク、フォローしていただけると勉強の励みになりますので是非お願いします。😉

追伸　--
Twitterで日々の学習風景を投稿してます。

@Ren_yello

# 参考にさせていただいたサイト様
[Admobにテストデバイスを登録して誤タップを防ぐ](https://sunny10side.com/register-test-devices-in-admob-to-prevent-accidental-taps/)

[【 Admob 】テストデバイスに登録して 広告誤タップ によるポリシー違反を防止する【テスト広告】
](https://hirokuma.blog/?p=4263)
cscの作法 その336

# 概要
cscの作法、調べてみた。
練習問題、やってみた。

# 練習問題
sqliteでcomboboxに流し込め。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/74d5a203-0f91-51c9-2727-b1ed7e6b3998.png)

# サンプルコード

```
using System;
using System.Text;
using System.IO;
using System.Drawing;
using System.Windows.Forms;
using System.Data;
using System.Data.Common;
using System.Transactions;
using System.Data.SQLite;

namespace App
{
	public partial class Form1: Form {
		private Label label;
		ComboBox comboBox1;
		public Form1() {
			Text = "combo test";
			ClientSize = new Size(300, 200);
			label = new Label();
			label.Text = "koko";
			label.Font = new Font("Geneva", 12, FontStyle.Regular);
			label.Height = 30;
			label.Width = 190;
			label.Left = 50;
			label.Top = 130;
			this.Controls.Add(label);
			comboBox1 = new ComboBox();
			comboBox1.Width = 100;
			comboBox1.Height = 25;
			comboBox1.Left = 50;
			comboBox1.Top = 50;
			this.Controls.Add(comboBox1);
			SQLiteConnection conn = new SQLiteConnection("Data Source=db0.sqlite;");
			conn.Open();
			SQLiteCommand command = conn.CreateCommand();
			command.CommandText = "SELECT * FROM fruit ORDER BY id ASC";
			SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(command);
			DataTable dt = new DataTable();
			dataAdapter.Fill(dt);
			comboBox1.ValueMember = "id";
			comboBox1.DisplayMember = "name";
			comboBox1.DataSource = dt;
			comboBox1.SelectedIndex = -1;
			comboBox1.SelectedValueChanged += comboBox1_TextChanged;
			comboBox1.TextChanged += comboBox1_TextChanged;
			conn.Close();
		}
		private void comboBox1_TextChanged(object sender, EventArgs e) {
			int n = comboBox1.SelectedIndex;
			string str = comboBox1.Text;
			string str1 = comboBox1.SelectedValue.ToString();
			label.Text = "selected: " + n + " (" + str + ": " + str1 + ")";
		}
		[STAThread]
		public static void Main() {
			Application.Run(new Form1());
		}
	}
}





```

以上。
Leetcode 217. Contains Duplicate

# Problem
配列に重複要素があるのかどうかを判定するシンプルな問題です。

> Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.


InputとOutputの例は次になります。
```
Input: nums = [1,2,3,1]
Output: true
```

https://leetcode.com/problems/contains-duplicate/

## Key Idea
一番シンプルなアイデアとしては、二重でループして各要素を比較するという方法が考えられます。ただし、その場合は計算量がかかってTLEになってしまうため、別の方法を検討する必要があります。
ここでは、Sortを使う方法、Hashtableを使う方法 x 2を紹介します。

## Approach #1 : Brute-force
最もシンプルに、それぞれの要素を比較していきます。
```python
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        for i in range(len(nums)):
            for j in range(i+1, len(nums)):
                if nums[i] == nums[j]:
                    return True
        return False
```

ただし、上述の通り、この解法では、計算量が大きく、TLE(Time Limit Exceeded)となってしまいます。

- Time complexity: O(N^2)

- Space complexity: O(1)

## Approach #2 : Sorting
ソートを使ってこの問題を解く方法もあります。具体的には、リストをソートした後、隣り合う要素が同じかどうかをチェックすることで重複を検出します。例えば、[1,2,3,1]を[1,1,2,3]にすると、隣同士の要素の比較するだけで重複判定をすることができます。

```Python
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        nums.sort()
        for i in range(len(nums)-1):
            if nums[i] == nums[i+1]:
                return True
        return False
```
まずリストnumsをソートします。そして、ソートされたリストの要素を順番に見ていき、ある要素が前の要素と同じだった場合はTrueを返します。全ての要素を見終わっても重複がなければFalseを返します。
計算量は、下記の様になります。
- Time complexity: O(n log n)。リストをソートするために必要な時間が主となります。Pythonの組み込みソート関数は通常O(n log n)の時間がかかります。
- Space complexity: O(1)。リストのソートはインプレース（元のリスト内で）行われ、隣接する要素の比較もインプレースで行いますので、追加の空間を必要としません。

Approach #1よりは効率が良くなったことがわかります。ただし、sort処理が時間的にはボトルネックとなっています。Trade offではありますが、Space complexityを犠牲にすると、更にTime complexityを改善させることができます。

## Approach #3 : HashSet
Hashsetを使うと、要素の検索と追加を使って重複の検出ができます。
```python
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        hashset = set()
        for num in nums:
            if num in hashset:
                return True
            else:
                hashset.add(num)
        return False
```

- Time complexity: O(n)。Setへの要素の検索と追加はO(1)で、n回繰り返すため、全体としてはO(n)になります。
- Space complexity: O(n)。リストの全ての要素を保持する新たなSetを作成しますので、リストのサイズに比例します。

## Approach #4 : HashSet'
HashSetを使うと、もし重複があったときには要素数が減ることに着目することもできます。
```python
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        hashset = set()
        if len(set(nums)) == len(nums):
            return False
        else:
            return True

```
計算量はApproach #3と変わりません。

## Reference
https://www.youtube.com/watch?v=3OamzN90kPg
【ChatGPT】おじさん構文を学ばせて「絶対に飲み会に来てほしい上司」vs「絶対に飲み会に行きたくない女性新入社員」の戦いをしてもらった

## おじさん構文について
ヤッホー😄❗😄❗
いつも、記事📑を、見てくれて、ありがとうネ😍❤️
仕事中、カナ❓❓サボりすぎ、は良くないですヨ😅😅
いいね👍、ストック💘も、お願いネ(^_-)-☆❤️❗

以上が**おじさん構文**である
今回はChatGPTにおじさん構文を学ばせて「絶対に飲みに来てほしい上司」vs「絶対飲みに行きたくない女性新入社員」の戦いを作りたいと思う

## ChatGPTにおじさん構文を学ばせる
とりあえずおじさん構文の特徴と例文を食わせました
![5-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/34392619-cabf-926d-e323-4505718e53e2.png)
もういい感じですね
調整も必要なさそうなのでこのままいこうと思います

## さっそく会話してもらう
チャットツールでのやり取りという体で対話してもらいましょう
世のオジサマ達には多少つらい設定ですが、まあいいでしょう
![5-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/f5799ea4-6a4d-c232-6993-745def2a38e2.png)
**気持ち悪さは100点ですね**
新人の呼び方と句読点が足りないことが気に食わないので設定を追加します
![5-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/dbf20052-9f2e-3340-b90a-a581bb9f95c1.png)
「オハヨウッッ！」って**ジョジョ**みたいな挨拶ですね
絵文字はなぜか増えないですが、他はちゃんと反映されているのでいいでしょう

## 最終形
形式的なところは調整できたので更に特徴を追加して**上司にキレてもらいます**
![5-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/9d395b93-ec5b-2f01-f209-01423ec9cec2.png)
ほぼ完璧ですね。会話の続きが気になるので出力してもらいます
![5-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124426/14234cdf-7d63-34de-ae1b-6b4d8ee49600.png)
**結構ヤバメな上司の完成です**

## 最後に
イイネ👍、ストック📄、してくれると、嬉しいですネ😍✨
理屈っぽいと言われて困ったあなたがすべきこと

## はじめに

ITエンジニアには理屈っぽいと言われる人が多いです。自分も10代後半〜20代中盤は理屈っぽいと言われることが多かったですが、後半は少し改善してきました。言われている頃は理屈っぽいなんてむしろ褒め言葉で、理屈っぽくないお前らが悪いとさえ思っていました。
ただ、誰に対しても常に理屈っぽいコミュニケーションしかできないと私生活もうまくいかず、実は仕事もうまくいかない印象があります。理屈っぽいとは何か、ITエンジニアが理屈っぽくなりやすい理由と対策を考えて実践し、ある程度うまく機能したと思うので、過去の自分が読みたかったような内容を上から目線で書いてみたいと思います。

## 理屈っぽいとは何か

経験則ですが、理屈っぽいと言われるのは理屈っぽくない人とプロトコルが違うことが原因です。脳の作りが違うとかそこまで大きな違いはありません。理屈っぽいと言われる人と、そうでない人の間には同じ日本語であってもコミュニケーションプロトコルに違いがあるんだと思ってます。最近はもう外国語と思うようになりました。
理屈っぽい人同士では互いを理屈っぽいと表現することは少ないです。逆も然りで、理屈っぽいと人を揶揄するような人同士では理屈っぽいということは少ないです。プロトコルっぽいですね。

### 理屈っぽいと言われる人のコミュニケーションの特徴(=理屈っぽい人のプロトコル)

前提と考える項目
* 自分に対する批判と意見に対する批判が区別できる

重視する項目
* 論理が破綻していないか

軽視する項目
* 自分に対する批判と意見に対する批判が区別できる人かの確認
* 声の大きさ、話す速度
* 会話のテンポ
* 目線、姿勢、笑顔、顔つき
* 身なり(服装、髪型)
* 滑舌
* ユーモア

### 理屈っぽいと言われない人のコミュニケーションの特徴(=理屈っぽくない人のプロトコル)

理屈っぽいの反対です。

前提と考える項目
* 明示しないと、自分に対する批判と意見に対する批判が区別できない

重視する項目
* 声の大きさ、話す速度
* 会話のテンポ
* 目線、姿勢、笑顔、顔つき
* 身なり(服装、髪型)
* 滑舌
* ユーモア

軽視する項目
* 論理が破綻していないか

## ITエンジニアが理屈っぽくなりやすい理由

* プログラミング(=ものづくり=理系全般)の、論理性の重要度の高さ
    * 特に、プログラミングは作るのに対人コミュニケーションが少なくて済む
* ITエンジニア以外の人間に対するリスペクトの低さ
* 業界にコミュニケーション能力のある人の少なさ

## 対策

### プロトコルの違いを意識

プロトコルが違うことを理解し、プロトコルを合わせることを意識すればいいです。
ITなど理屈っぽい仕事においては理屈っぽくて基本的に構わないと思いますが、一歩他の業界の方、特に文系の方と話すときは意識すると良いと思いますし、いざ訓練をはじめてからコミュニケーションがうまい他業界の人を見ると感動します。

* 声の大きさ、話す速度
=> ゆっくり大きく話しましょう。自信がなく聞こえ、不安が伝染します。
* 会話のテンポ
=> 細かなツッコミは3回に1回に減らしましょう。話を先に進めましょう。相手が要求しているのは、細かな論理破綻のツッコミではなく、楽しいコミュニケーションとたまのちょっとした気づきです。
* 目線、姿勢、笑顔、顔つき、笑い声
=> 目を見て、背筋を伸ばして、笑顔で、かといってボケッとしない顔で話しましょう。特に笑顔は筋肉が必要で、そうでないと気持ち悪くなるので筋トレしましょう。笑い声も、練習しましょう。
* 身なり(服装、髪型)
=> インスタ見て勉強しましょう。服にお金をかけましょう。
* 滑舌
=> voatにボイトレに行きましょう。
* ユーモア
=> パターンがあります。エピソードトーク、ボケ（の繰り返し）、ツッコミ、比喩、など。DJフォイとか見るとユーモアトーク学べます。

### モチベーションの維持

これが一番難しいかもしれませんが、次のようなことを知れば維持できるかも知れません。

理屈っぽいプロトコルを使わない人口の方がずっと多数派（9割くらい）です。それら全員はあなたにとって言葉が通じない外国人ですが、コミュニケーションを取れるようになってみたいと思いませんか？ITエンジニアも、ITエンジニア以外の人がサービスをたくさん利用してくれるからお金がもらえると思うわけです。もっと彼らに敬意を持って彼らの言語を学ぶのも良いのではないでしょうか。残念ながらあなたが少数派です。あなたが複数言語話者になればいいだけの話なのです。言語学習はお好きでしょう？

## さいごに

自分もまだ道半ばなので、一緒に頑張っていきましょう。
備忘録:ECDSAのトリビア

# Y 座標が真偽値?

[CBOR](https://www.rfc-editor.org/rfc/rfc8949) / [COSE](https://www.rfc-editor.org/rfc/rfc9052.html) / [CWT](https://www.rfc-editor.org/rfc/rfc8392.html) 用の Java ライブラリ (authlete/[cbor](https://github.com/authlete/cbor)) に、ES256 / ES384 / ES512 アルゴリズムでの署名処理を実装していたとき、[IANA COSE Key Type Parameters](https://www.iana.org/assignments/cose/cose.xhtml#key-type-parameters) が「EC2 鍵の Y 座標は数値ではなく真偽値になることがある」と述べていることに気が付きました。

ネット検索の結果、『[SEC 1: Elliptic Curve Cryptography](https://www.secg.org/sec1-v2.pdf)』という文書の『2.3.3 Elliptic-Curve-Point-to-Octet-String Conversion』に下記の文を見つけました。

> _Derive from yP a single bit ỹP as follows (**this allows the y-coordinate to be represented compactly using a single bit**)_

Y 座標が単一ビットで表現されているとき (つまり真偽値で表現可能ということ)、Y 座標の実際の値は、X 座標や楕円曲線のパラメーターといった他のパラメーターを用いて計算する必要があります。

位数が素数の有限体の場合、これは ES256 / ES384 / ES512 が使用する P-256 / P-384 / P-521 楕円曲線にあてはまりますが、Y 座標の値は『2.3.4 Octet-String-to-Elliptic-Curve-Point Conversion』で説明されている下記の手順で計算します。


1. $ \alpha \equiv {x^3} $ $ _P + {ax} $ $ _P + b $ (mod _p_) を計算します。
2. $ \alpha $ modulo _p_ の平方根を計算します。
3. 平方根が得られなければ無効として処理をやめます。
4. $ \beta \equiv $ ỹP (mod 2) であれば $ \beta $ を Y 座標の値とします。そうでなければ _p_ - $ \beta $ を Y 座標の値とします。

Stack Overflow で見つけた[回答](https://stackoverflow.com/a/46289709/1174054)を元にこの計算処理を実装してみました ([ECDSA.java](https://github.com/authlete/cbor/blob/main/src/main/java/com/authlete/cose/ECDSA.java) の `uncompressY()`)。しかし、正直に言うとテストをしていないので、正しい実装になっているかどうか自信はありません。

# DER または P1363?

アルゴリズムの結果、整数の組 (R, S) が生成されます。この二つの整数をバイト配列にエンコードする主要な方法が二つあります。一つは DER で、もう一つは P1363 です。

`java.security.Signature` クラスの `getInstance(String)` メソッドに `"SHA256withECDSA"` を渡すと、返される `Signature` インスタンスは署名のフォーマットが DER だと想定します。

COSE ECDSA ([RFC 9053](https://www.rfc-editor.org/rfc/rfc9053.html), [2.1. ECDSA](https://www.rfc-editor.org/rfc/rfc9053.html#section-2.1)) で採用されている P1363 フォーマット用に `Signature` インスタンスを作成するためには、代わりに `"SHA256withECDSAinP1363Format"` を渡します。
Pythonのリストと組み込み関数を使用したリストの操作やソート

# 前提条件
* Python

# 目的
Pythonのリストの組み込み関数を使用して、並べ替えや簡単な検索をやってみる

# サンプル
```list.py
names = ['ゆうと', 'ひな', 'さくら', 'ゆい', 'あん', 'りく', 'あい', 'れん', 'ひろと', 'あおい', 'つばさ', 'だいき', 'ななみ', 'まお', 'かいと', 'みう', 'そら', 'みさき', 'しょうた', 'ゆう']

print(names)

sorted_names = sorted(names)
print(sorted_names)

sorted_names_r = sorted(names,reverse=True)
print(sorted_names_r)

print('たろう' in names)
print('ひな' in names)

print(names.index('ひな'))
print(sorted_names.index('ひな'))

names.append('たろう')
print(names)

sorted_names.insert(8,'たろう')
print(sorted_names)

names.remove('ひな')
print(names)

print(names.pop(1))
print(names)
```

## 実行結果
```
['ゆうと', 'ひな', 'さくら', 'ゆい', 'あん', 'りく', 'あい', 'れん', 'ひろと', 'あおい', 'つばさ', 'だいき', 'ななみ', 'まお', 'かいと', 'みう', 'そら', 'みさき', 'しょうた', 'ゆう']
['あい', 'あおい', 'あん', 'かいと', 'さくら', 'しょうた', 'そら', 'だいき', 'つばさ', 'ななみ', 'ひな', 'ひろと', 'まお', 'みう', 'みさき', 'ゆい', 'ゆう', 'ゆうと', 'りく', 'れん']
['れん', 'りく', 'ゆうと', 'ゆう', 'ゆい', 'みさき', 'みう', 'まお', 'ひろと', 'ひな', 'ななみ', 'つばさ', 'だいき', 'そら', 'しょうた', 'さくら', 'かいと', 'あん', 'あおい', 'あい']
False
True
1
10
['ゆうと', 'ひな', 'さくら', 'ゆい', 'あん', 'りく', 'あい', 'れん', 'ひろと', 'あおい', 'つばさ', 'だいき', 'ななみ', 'まお', 'かいと', 'みう', 'そら', 'みさき', 'しょうた', 'ゆう', 'たろう']
['あい', 'あおい', 'あん', 'かいと', 'さくら', 'しょうた', 'そら', 'だいき', 'たろう', 'つばさ', 'ななみ', 'ひな', 'ひろと', 'まお', 'みう', 'みさき', 'ゆい', 'ゆう', 'ゆうと', 'りく', 'れん']
['ゆうと', 'さくら', 'ゆい', 'あん', 'りく', 'あい', 'れん', 'ひろと', 'あおい', 'つばさ', 'だいき', 'ななみ', 'まお', 'かいと', 'みう', 'そら', 'みさき', 'しょうた', 'ゆう', 'たろう']
さくら
['ゆうと', 'ゆい', 'あん', 'りく', 'あい', 'れん', 'ひろと', 'あおい', 'つばさ', 'だいき', 'ななみ', 'まお', 'かいと', 'みう', 'そら', 'みさき', 'しょうた', 'ゆう', 'たろう']
```

# 参考資料
https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3Python%E3%81%A7%E5%AD%A6%E3%81%B6%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B-ebook/dp/B0834JWWZG?keywords=python+%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E6%A7%8B%E9%80%A0&qid=1686011263&sprefix=python+%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%2Caps%2C632&sr=8-1&linkCode=ll1&tag=qiitajinbei23-22&linkId=44cf9c11307bbfd98ffd54fcde902e21&language=ja_JP&ref_=as_li_ss_tl

https://youtu.be/vo4dxDzPMCk

https://colab.research.google.com/drive/108BqyMSO-NvF7lD7WEARG58U7EWq3-5H#scrollTo=FOINDyPfakDQ

# 編集後記 
本日(2023/06/05)より、情報処理学会のアルゴリズムについて学んでいこうと思う。
特殊文字をレンタルサーバーのデータベースへ保存し表示する方法

## はじめに
例えば、掲示板のウェブアプリケーションを作成し、ユーザーがJavaScriptのコードを投稿できる機能を追加したいと考えたとします。しかし、特殊文字の扱いやクロスサイトスクリプティング（XSS）の問題について懸念があり、適切な処理が必要となります。
ここでは、特殊文字を正しくデータベースに保存し、表示する方法を以下のように検討したので解説していきます。

## 特殊文字とは？
特殊文字は、プログラムやデータベースにおいて特別な意味を持つ文字のことです。例えば、< や > はHTMLタグの開始や終了を示すために使用されます。しかし、これらの文字をそのまま表示すると、意図しない結果が生じる可能性があります。他にも改行文字や引用符などが特殊文字に含まれます。

## クロスサイトスクリプティング（XSS）とは？
クロスサイトスクリプティング（XSS）は、悪意のあるユーザーがウェブアプリケーションに特殊な文字列やスクリプトを挿入する攻撃手法のことです。攻撃者はユーザーのブラウザ上で任意のJavaScriptコードを実行させ、セッションハイジャックや個人情報の盗み出しなどの被害を引き起こすことができます。XSS攻撃を防ぐためには、特殊文字の適切な処理が必要です。

## 特殊文字を保存し表示するまでの流れ
特殊文字をレンタルサーバーのデータベースに保存し、安全に表示するためには以下の手順を踏む必要があります。

#### 1. データのエンコード処理
特殊文字を含むデータを送信する前に、それらを適切にエンコードする必要があります。一般的な方法は、URLエンコーディングまたはまたはHTMLエンティティエンコーディングを使用することです。これにより、エスケープ文字が特殊な形式で送信され、正しく処理されるようになります。

フォームデータをURLエンコードするには、次のような方法を使用します。

・JavaScriptを使用する場合
```javascript:JavaScript
/* URLエンコーディング */
var encodedData = encodeURIComponent(formData);

/* HTMLエンティティエンコーディング */
var encodedData = document.createElement('textarea');
encodedData.innerHTML = formData;
var encodedValue = encodedData.innerHTML;
```

・PHPを使用する場合
```PHP:PHP
# URLエンコーディング
$encodedData = urlencode($formData);

# HTMLエンティティエンコーディング
$encodedData = htmlentities($formData);
```


#### 2. サーバーサイドの処理
サーバー側の処理スクリプト（PHP、Python、Rubyなど）を使用して、フォームデータを受け取ります。このスクリプトは、送信されたデータを適切に処理するためにエスケープ文字をデコードする必要があります。具体的な方法は使用しているプログラミング言語によって異なりますが、一般的なPHPの例を以下に示します。


・PHPを使用する場合
```PHP:PHP
$decodedData = urldecode($_POST['formData']);

```




#### 3. 表示データのエスケープ処理
データベースから取得した特殊文字をウェブページに表示する際は、適切なエスケープ処理を行うことが重要です。これにより、XSS攻撃を防ぎながら、特殊文字が正しく表示されます。

特殊文字を含むデータのエスケープするには、次のような方法を使用します。


・JavaScriptを使用する場合
```javascript:JavaScript
var text = '<script>alert("XSS");</script>';
var escapedText = text.replace(/[&<>"']/g, function(match) {
  return {
    '&': '&amp;',
    '<': '&lt;',
    '>': '&gt;',
    '"': '&quot;',
    "'": '&#39;'
  }[match];
});
console.log(escapedText);

/*
出力
&lt;script&gt;alert(&quot;XSS&quot;);&lt;/script&gt;
*/
```

・PHPを使用する場合
```PHP:PHP
$text = '<script>alert("XSS");</script>';
$escapedText = htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
echo $escapedText;

/*
出力
&lt;script&gt;alert(&quot;XSS&quot;);&lt;/script&gt;
*/
```

・Laravelを使用する場合
Laravelでは、Bladeテンプレートエンジンが組み込まれており、自動的にHTMLエスケープを行ってくれます。{{ }} タグ内に変数や出力を記述すると、自動的にHTMLエスケープ処理が適用されます。
```ｂlade:ExampleController.php
<!--エスケープ処理-->
<div>　{{ $text }}</div>

<!--エスケープ処理したくないとき-->
<div>　{！！ $text ！！}</div>
```

これらの手法を組み合わせて、特殊文字の保存と表示を安全に行うことができます。掲示板のウェブアプリケーションにおいては、ユーザーが投稿したJavaScriptコードを特に注意深く扱う必要があります。適切なエスケープと入力検証を行い、XSS攻撃からアプリケーションを保護しましょう。

## まとめ
以上が特殊文字をレンタルサーバーのデータベースに保存し、表示する方法に関する説明です。特殊文字の適切な処理とXSS攻撃の予防は、ウェブアプリケーションのセキュリティにおいて非常に重要な要素です。ユーザーの利便性を高めつつ、セキュリティーに心がけて開発を進めていきましょう。
【Power Apps】クイズアプリを作って長女にテストプレイさせてみた

## 概要

趣味と学習を兼ねて、Microsoft Power PlatformのPower Appsでクイズアプリを作成しています。長女にテストプレイをさせてみて、気づいたことを共有します。

## 画面例

### スタート画面
★★は拗音、★★★は濁音が出題される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/e0f2d081-c494-8f95-0b3b-4f1784cdd863.png)

### 問題画面
正解のボタンの位置は毎回ランダム
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/3f913b76-8c65-25ba-8351-0b0a073a2ef1.png)

### 結果表示画面
赤文字のメッセージは、全問正解とそうでない場合で、各3種類
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/dc5e458b-9ff0-a949-624d-84e4bd8577c3.png)

## 気づき

### ① 長押し対策が必要
3歳の長女には、ボタンを押してすぐ離す動作(タップ)がまだ難しいようです。ボタンを押し続けてから離す動作(長押し)と判定されてしまい、ボタンが動作しない事象が多発しました。

自分でテストプレイしたときには気づけない問題でした。リアルなユーザにテストしてもらう必要性を痛感。

Power Appsでの処理としては、OnSelectではなく、PressedがTrueになったら処理を開始させる形にすればいいのかも。

### ② お題の用意が大変
解答が一意になるようなお題を自分で用意する必要があります。これが意外と大変でした。馬のお題に「おうま。オはどれ？」とか、ケーキのお題に「ハッピーバースデー！」とか。予想外の反応が返ってくるのはおもしろいんですが、クイズとして成立しないのは残念です。

特にお題探しに苦戦しているのは、拗音・濁音。ヒャヒュヒョとかは、子どもがわかる単語自体が少ないです。ヒャは、唯一知っていそうな100円玉をお題にしてみたところ、「灰色？お金？」と言われてしまいました。

そんなわけで、日々お題になるネタ探しをしています。長女は最近パウ・パトロールがお気に入りなようで、私も一緒にアニメを見てみたところ、「チェイス！チェがあったぞ！」とお父さん興奮。

### ③ 失敗を過剰に恐れる
これはアプリへの気づきではなく、長女への気づき。

わからない・自信がない問題があると、長女は「どれ？」と聞いてきます。間違ってもいいから押してみて、と伝えるのですが、正解を確信するまでボタンを押したがりません。失敗したくない感情が強すぎるのかも、と感じています。自分で意思決定して、失敗する経験もしてほしいところです。

対策としては、ヒントボタンを実装することを検討しています。問題リストは一意な識別子としてのTitle列を持たせており、ウマとかケーキとか入力してあります。これを平仮名にして表示させることで、長女へのヒントにできるはず。

https://note.com/anpanda_44075/n/nd940574321c6
Vue 3: ダミー　API


# 依頼
ダミーのAPIを作りたいです。
今やっているのはVueのプロジェクトなんで
それと親和性が高いものをお願いします。


json-serverのインストール
ターミナルまたはコマンドプロンプトを開き、以下のコマンドを実行してjson-serverをグローバルにインストールします。


npm install -g json-server
ダミーデータの作成
Vueプロジェクトのルートディレクトリに「db.json」という名前のファイルを作成し、以下のようなダミーデータを記述します。
```javascript
json
{
  "users": [
    { "id": 1, "name": "John Doe" },
    { "id": 2, "name": "Jane Smith" }
  ],
  "posts": [
    { "id": 1, "title": "First Post", "content": "Lorem ipsum dolor sit amet." },
    { "id": 2, "title": "Second Post", "content": "Praesent vel neque in ligula feugiat fringilla." }
  ]
}
json-serverの起動
ターミナルまたはコマンドプロンプトで、Vueプロジェクトのルートディレクトリに移動し、以下のコマンドを実行します。


json-server --watch db.json
これにより、json-serverが起動し、http://localhost:3000でAPIが利用可能になります。

APIの利用
VueプロジェクトのコンポーネントやサービスからAPIを呼び出すことができます。たとえば、以下のようなコードでusersエンドポイントのデータを取得することができます。

javascript
Copy code
import axios from 'axios';

axios.get('http://localhost:3000/users')
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });
```
これで、Vueプロジェクトで簡単なダミーのAPIを作成して利用することができます。json-serverは他にも機能がありますので、公式ドキュメントを参照するとさらに詳細な設定や利用方法を知ることができます。
# 要望
putもお願いします。

json-serverでは、PUTリクエストを使用してデータを更新することができます。以下にPUTリクエストの例を示します。

```javascript
import axios from 'axios';

const userId = 1;
const updatedUserData = { name: 'Updated Name' };

axios.put(`http://localhost:3000/users/${userId}`, updatedUserData)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });
```
上記の例では、userId変数に更新するユーザーのIDを設定し、updatedUserData変数に更新後のユーザーデータを設定しています。そして、axios.putメソッドを使用してPUTリクエストを送信しています。

URLの末尾に/${userId}を追加することで、該当のユーザーのデータを更新します。また、更新したいデータをオブジェクトとして第二引数に渡します。

これにより、指定したIDのユーザーデータが更新されます。json-serverでは、更新したデータがレスポンスとして返されますので、レスポンスデータを利用することができます。

注意点として、json-serverではデータはメモリ内に保持されるため、サーバーを再起動するとデータが初期化されます。また、json-serverでは実際のデータベースのような永続性は提供されないため、本番環境で使用する場合には適切なデータベースシステムを検討してください。

＃要望
delete と　postもお願いします、
```javascript
DELETEリクエストの例:
javascript
Copy code
import axios from 'axios';

const userId = 1;

axios.delete(`http://localhost:3000/users/${userId}`)
  .then(response => {
    console.log('削除が成功しました');
  })
  .catch(error => {
    console.error(error);
  });
```
上記の例では、userId変数に削除するユーザーのIDを設定し、axios.deleteメソッドを使用してDELETEリクエストを送信しています。URLの末尾に/${userId}を追加することで、該当のユーザーを削除します。

成功した場合、削除が成功したことを示すメッセージがコンソールに表示されます。

```javascript
POSTリクエストの例:
javascript
Copy code
import axios from 'axios';

const newUserData = { name: 'New User', email: 'newuser@example.com' };

axios.post('http://localhost:3000/users', newUserData)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });
```
上記の例では、newUserData変数に新しいユーザーのデータを設定し、axios.postメソッドを使用してPOSTリクエストを送信しています。URLに/usersを指定することで、新しいユーザーを作成します。

成功した場合、新しいユーザーのデータがレスポンスとして返されます。

これらの例を使用することで、json-serverを介してVueプロジェクトからDELETEリクエストとPOSTリクエストを送信し、データの削除や新規作成が可能になります。

なお、データの削除や新規作成は、サーバーサイドのデータファイル (db.jsonなど) に対して行われます。したがって、APIの操作結果はリロードなどを行うとリセットされることに注意してください。
【Rye】コマンドで簡単にアップデートする方法【Python】

## 最近話題のRye
TwitterやSNSで注目されているRyeのアップデート方法を説明します。

## 方法
```bash
rye self update
```

上記コマンドを実行するだけで、Ryeを簡単にアップデートできます。

![スクリーンショット 2023-06-05 6.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646932/aeb44c67-081b-a966-d7d9-4e7bc984253f.png)


## 参考
[公式ドキュメント](https://rye-up.com/guide/installation/#updating-rye)
2023/6/5主にITとかセキュリティの記事

Kaspersky、iOSデバイスを標的とした新たなモバイルAPT攻撃活動を発見(6/2)
https://news.nicovideo.jp/watch/nw12683202

人気メールゲートウェイにゼロデイ脆弱性、最低7カ月間潜伏 - 確認を(6/3)
https://news.mynavi.jp/techplus/article/20230603-2693143/

「史上類を見ないレベル」のDDoS攻撃を実行可能と評されるマルウェア「Mirai」を10代の少年3人が構築した経緯とは？(6/3)
https://gigazine.net/news/20230603-mirai-bot-net/

OpenAI、100万ドル規模のセキュリティ助成プログラムを開始(6/3)
https://news.yahoo.co.jp/articles/907f1bdadd0a6171e22ead963c34701de179ee46?source=rss

Amazon Ring従業員が数千の顧客の映像に不正アクセス、米国連邦取引委員会が提訴(6/3)
https://news.mynavi.jp/techplus/article/20230603-2694428/

アプリストア開放、サイバー攻撃懸念する声も…安全性確保へ「アップルによる審査」政府検討(6/3)
https://www.yomiuri.co.jp/economy/20230602-OYT1T50317/

北朝鮮ハッカー集団「キムスキー」韓国が独自制裁対象に指定　兵器・人工衛星の先端技術を盗み取る(6/2)
https://www.fnn.jp/articles/-/537121

韓国、北朝鮮ハッカー組織に独自制裁(6/3)
https://www.nikkei.com/article/DGKKZO71592490S3A600C2EA3000/

生成AIで教育現場の働き方改革なるか(6/3)
https://news.yahoo.co.jp/articles/4b10036853f3a0de4ec9a6d8401e64054ccac389?source=rss

16歳の高校生がIT企業のエンジニアになった話(6/3)
https://qiita.com/Raio14f/items/ef0fb67685b36298bcb0

あの手この手でマイナンバーカードの取得を強制すればするほど政府の信用は落ちていく／清水勉氏（弁護士）(6/3)
https://news.yahoo.co.jp/articles/6a6032e971cab39bbfaf6e22c03e2d4adb2e9d0a?source=rss
【Unity】RectTransform内にカーソルが入ったことを検知する

SortingLayerなどのせいでEventTriggerが使えなくなったとき、地道にマウスポインタがRectTransform内に入っているのか検出するには、次の関数をご使用あれ。

```C#
private bool CheckPointerIn()
{
    if (Input.mousePresent)
    {
        RectTransform rectTransform = GetComponent<RectTransform>();

        Vector3 worldPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        Vector2 localMousePosition = rectTransform.InverseTransformPoint(worldPosition);
        bool isMouseInRectTransform = rectTransform.rect.Contains(localMousePosition);

        if (isMouseInRectTransform)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    else
    {
        //マウスデバイスがない
        return false;
    }
}
```
【GitHub】ローカルファイルをGitHubにアップロードする

# 目次
1. 事前準備
2. リモートリポジトリの作成
3. ローカルリポジトリの作成
4. ローカルからリモートへのアップロード

# 1. 事前準備
GitHubのアカウントを持っていない場合は作成します。
GitHub：https://github.com/

Gitをインストールしていない場合はインストールします。
Gitダウンロード(Windows)：https://git-scm.com/download/win
Gitダウンロード(Mac):https://git-scm.com/download/mac

# 2. リモートリポジトリの作成
リモートリポジトリは、本記事では、GitHub側のリポジトリとなります。
GitHubにログインしたら、右上の「+」をクリックし、「New repository」を選択します。
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/8c451965-aba8-824e-4b75-ce63cb73ad51.png)

以下の画面が表示されます。
![Screenshot 2023-06-05 013906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/1d0ec6b0-a588-eb6e-c6d3-89378b119ebb.png)
「Repository name」にリモートリポジトリの名前を付けます。
「Description」（説明文）は空でも構いません。後で編集可能です。
「Public」（公開）か「Private」（非公開）を選択します。
「Initialize this repository with:」内の項目はそのままで構いません。後で追加可能です。
「Create repository」をクリックしリモートリポジトリを作成します。

# 3. ローカルリポジトリの作成
コマンドライン（ターミナル）を使いローカルリポジトリを作成し、そこにデータをアップロードしていきます。

### アップロードするフォルダに移動
まずはアップロードするフォルダに移動します。
（画像では「cd」コマンドを使って「test」フォルダに移動しています。）
![Screenshot 2023-06-05 020557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/9fa88437-b526-1352-2113-a2a3aa5b68ce.png)

### 「git init」コマンドでローカルリポジトリを作成
「git init」コマンドでローカルリポジトリを作成します。「Initialized empty Git repository in (フォルダのパス)」と表示されれば成功です。
![Screenshot 2023-06-05 020222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/7773cd92-0639-af06-6aad-27e72594668b.png)

### 「git add .」コマンドでステージング
「git add .」コマンドで、選択しているフォルダ内の全データをステージング（ローカルリポジトリにアップロードする対象）状態にします。特にエラーメッセージが表示されなければ成功です。
![Screenshot 2023-06-05 021152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/73bcced4-9f47-10ed-80ce-ddd1b9a0a872.png)

### 「git commit -m "（コミットの説明コメント）"」コマンドでローカルリポジトリに保存
「git commit -m "（コミットの説明コメント）"」コマンドで先ほどステージング状態にしたデータをローカルリポジトリに保存します。コミットの説明コメントは後で変更内容を確認する際にわかりやすい内容にしましょう。
![Screenshot 2023-06-05 022020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/c306fc98-1e45-6425-6491-80570c91ee62.png)

# 4. ローカルからリモートへのアップロード
最後に、ローカルリポジトリとリモートリポジトリを紐付けして、データをアップロードしていきます。

### 「git remote add origin （リモートurl）」コマンドで紐付け
「git remote add origin （リモートurl）」コマンドでローカルリポジトリとリモートリポジトリを紐付けします。（リモートurl）には、GitHubで新規リポジトリ作成時に表示されるurlを使います。「HTTPS」選択時に現れるurlを使いましょう。
![Screenshot 2023-06-05 022960.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/f03baf5d-2bfb-c836-2b0a-f64b47407a68.png)
特にエラーメッセージが表示されなければ成功です。
![Screenshot 2023-06-05 023244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/c33b99e5-11c3-03d3-e332-f7951e8e8664.png)

### 「git push origin master」コマンドでアップロード
「git push origin master」コマンドで、ローカルリポジトリをリモートリポジトリへアップロードします。
![Screenshot 2023-06-05 023925.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072383/8657a98e-6af8-1d8e-1000-a0640e871188.png)
これにてアップロード完了です。