OmniAICreator/Qiita-1.07M huggingface dataset:
ipywidgets の Image に TIFF 画像を表示する



# PNG画像の場合

PNGやJPEG画像は普通にopenしてreadしたオブジェクトを表示することができます。

```python:PNG画像を表示
png_path = '/your/png/path.png'
png = open(png_path, mode='rb').read()
ipywidgets.Image(value=png)
```

# TIFF画像の場合

上記の方法を使用すると、エラーとなります。

```python:エラー
tiff_path = '/your/tiff/path.tif'
tiff = open(tiff_path, mode='rb').read()
ipywidgets.Image(value=tiff)

#=> リンク切れのアイコンになる
```

この場合、いったんメモリ上にPNG形式で保存し、これを読み出すことで表示できます。
なお、読み出しに Pillow を使います。（インストール： `pip install Pillow`）

```python:TIFF画像を表示
from PIL import Image

def open_tiff(file):
    data = Image.open(file, mode='r')
    membuf = io.BytesIO()
    Image.fromarray(np.array(data)).save(membuf, format="png")

    return membuf.getvalue()

tiff_path = '/your/tiff/path.tif'
tiff = open_tiff(tiff_path)
ipywidgets.Image(value=tiff)
```

# 参考

* 解決の参考になった記事：[Displaying tif files in jupyter notebook vie ipywidgets - StackOverflow](https://stackoverflow.com/questions/67054987/displaying-tif-files-in-jupyter-notebook-vie-ipywidgets)
* ipywidgets のドキュメント：https://ipywidgets.readthedocs.io/en/stable/examples/Widget%20List.html#Image
Apresia NPシリーズ　ユーザー(WEB)認証について

**はじめに**
---
前回に続きまして、Apresia製品のNPシリーズの認証機能であるWEB認証について書いていきますので、
参考にしていただけたら幸いです。

***目次***
---
・ユーザー(WEB)認証とは
・WEB認証の手順

***WEB認証とは***
---
ユーザー認証は、未認証状態のユーザーが内部ネットワークに接続する前に、ユーザー名およびパスワードを入力して、正規のユーザーだけに内部ネットワークへのアクセスを許可する仕組みです。
装置は、未認証状態のユーザーからアクセスされると、ユーザー名およびパスワードの入力を要求し、ユーザー名およびパスワードを基に、ユーザーに内部ネットワークへのアクセスを許可してよいかどうかを決定します。


***WEB認証機能有効化の手順***
---
Web認証は、ユーザー認証を利用する認証方法です。未認証状態のユーザーが内部ネットワークに接続する前に、ユーザー名およびパスワードを入力して、正規のユーザーだけに内部ネットワークへのアクセスを許可します。

ApresiaNPシリーズではWEB認証機能を装置全体で有効にした後、インターフェースごとに有効にしていく必要があります。

Web認証用のWebサーバーはIPv4アドレス／IPv6アドレスで設定することが可能です。また、Web認証用のWebサーバーのポート番号を設定することやWeb認証用のWebサーバーとして外部Webサーバーを利用することもできます。


はじめに装置のMAC認証時と同様に認証機能を有効にします。

<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# aaa new-model
</code></pre></div></div>

RADIUSサーバを指定し、共有鍵(今回は仮で【apresia】)も設定します。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# radius-server host 192.168.1.100 key apresia
</code></pre></div></div>

次にRADIUSサーバの所属するグループを指定します。

<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# aaa group server radius radius-group
ApresiaNP(config)#  server 192.168.1.100
</code></pre></div></div>

WEB認証で使用する認証方式リストを、RADIUSサーバーグループ「radius-group」に指定します。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# aaa authentication web-auth default radius-group
</code></pre></div></div>


AccessDefender設定モードに遷移し、認証クライアントの数を設定します。最大は256となってます。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# access-defender
Apresia(config-a-def)# total-client 256
</code></pre></div></div>

そのまま、AccessDefender設定モードにてWEB認証を設定したいポートのWEB認証機能を有効にし、認証用WebサーバーのIPアドレスを設定します。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config-a-def)# authentication interface port 1/0/1-5 web
ApresiaNP(config-a-def)# web-authentication http-ip ipv4 1.1.1.1
</code></pre></div></div>

次に装置の認証用Webサーバー用のポート番号を設定についてですが、HTTPプロトコル（TCPポート番号80）とHTTPSプロトコル（TCPポート番号443）はデフォルトで有効になっていますので設定は特に不要です。

認証機能を有効にした場合、そのポートではアドレス解決のためのARP/NDP以外は許可されないためDHCPによるIPアドレス取得のため、認証バイパス設定の、拡張IPアクセスリストを作成します。
また、DNSの解決パケットを許可する場合はTCPとUDPにてポート番号53のアクセスリストを作成してください。

<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# ip access-list extended IP-EX-ACL
ApresiaNP(config-ip-ext-acl)# 10 permit authentication-bypass udp any any eq 67
</code></pre></div></div>

作成したアクセスリストを認証ポート（ポート1/0/1からポート1/0/5）に適用します。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# interface range port 1/0/1-5
ApresiaNP(config-if-port-range)# ip access-group IP-EX-ACL in
</code></pre></div></div>


最後に装置でのWEB認証の有効化をします。
<div class="code-frame" data-lang="text"><div class="highlight"><pre><code>ApresiaNP(config)# web-authentication enable
</code></pre></div></div>

以上が、WEB認証時の認証機能関連の設定手順になります。




***参考URL***
---
https://www.apresia.jp/products/ent/np/usersguide/accessdefender/top.html

***最後に***
---
今回はApresiaNPシリーズ製品のweb認証について記事にしました。
参考にしていただけたら幸いです。
gerritでエラーが出る（com.google.gerrit.server.git.MultiProgressMonitor : MultiProgressMonitor worker killed after 120107ms(timeout 107ms, cancelled)のようなもの）

gerritでエラーが出る（com.google.gerrit.server.git.MultiProgressMonitor : MultiProgressMonitor worker killed after 120107ms(timeout 107ms, cancelled)のようなもの）
https://groups.google.com/g/repo-discuss/c/lC-NP3-5Fq4/m/SHI-b7KsUp0J

エラー内容

> 2014-05-09 10:00:35,390] WARN  com.google.gerrit.server.git.MultiProgressMonitor : MultiProgressMonitor worker killed after 120107ms(timeout 107ms, cancelled)
> [2014-05-09 10:00:35,390] WARN  com.google.gerrit.server.git.AsyncReceiveCommits : Error in ReceiveCommits
java.util.concurrent.ExecutionException: (timeout 107ms, cancelled)

質問

> On Fri, May 9, 2014 at 4:34 AM, Makson Lee <cdle...@gmail.com> wrote:
We were pushing changes to gerrit, but got timeout error, can you help point out where i can change the timeout setting?

対策
> Increase the value of the receive.timeout , see [1]
[1] https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#receive
ゼロデイ攻撃について調べてみた

## ゼロデイ攻撃とは

#### そもそもゼロデイとは
修正パッチが公開された日を1日目とすると、**修正プログラムがまだ適用されていない状態**をゼロデイ（0日目）と言います。
おわかりの通りゼロデイ攻撃とは**修正プログラムが提供されていない脆弱性を悪用した攻撃**です。


## 具体的に
発見された未修正の脆弱性に対する攻撃で、特に**情報公開や更新プログラムが公開された当日にゼロデイ攻撃が増加する傾向**があります。
一般に認知されるまでは、狙ったターゲットに的を絞って攻撃し、認知された時点で一気に攻撃の手を拡大するなどの手法があります。これらの攻撃を防ぐためには、公開された更新プログラムをできるだけ速く適用することしかないので**最も大きな脅威であるとの指摘もある**そうです。


## 実例
2021年7月:カセヤ社製Kaseya VSAへのゼロデイ攻撃
2021年3月:「Microsoft Exchange」のゼロデイ脆弱性
2020年1月:三菱電機、約8000人の個人情報流出

2021年には**前年比２倍**の８０件のゼロデイ攻撃が発生するなど年々増加傾向にあります。
→　ゼロデイ攻撃の報告率の上昇に寄与する要因の一つとして、ハッキングツールが世界的に急速に普及
　　ゼロデイ・エクスプロイトの売買、悪用の増加によって探す人も増加傾向にあり発見数が増えているという見方もできる

エクスプロイトについては下記リンク参照
[エクスプロイトについて調べてみた](https://qiita.com/sauna1137/items/b08133c39852486e533a)


## 対策
**１，シグネチャで対策する方法**
過去の知識を必要とする防御手法の最たる例がシグネチャを用いたパターンマッチングで、アンチウイルスソフトの基本的な防御手法

**２，サンドボックスで対策する方法**
エンドユーザが利用する実環境から分離された環境。この環境で疑わしいプログラムを動作させることで、実環境に被害を及ぼすことなくマルウェアの解析を行う。

**3,EDRを導入する**
前述の理由からゼロデイ攻撃を防ぐのは困難です。そういった状況から攻撃の発生を防ぐアプローチではなく、攻撃が発生した後でもその影響範囲を特定し、回復に役立てるEDR（Endpoint Detection and Response）という手法。


## まとめ
残念ながらゼロデイ攻撃を防ぐことのできるセキュリティソフトは多くないようです。
万が一ゼロデイ攻撃を受けた際の被害を最小限にとどめることに努めましょう。
PHP8+MySQL入門ノート Chapter1　要約

リンク→https://www.amazon.co.jp/詳細！PHP-MySQL-入門ノート-XAMPP-MAMP対応-ebook/dp/B0986MX2JW/ref=sr_1_32?__mk_ja_JP=カタカナ&crid=LIE2RGLESSDI&keywords=PHP&qid=1661323556&sprefix=php+に%2Caps%2C303&sr=8-32

# PHPの準備

## PHPはサーバーサイドスクリプト

### Webページをブラウザで表示する

WebページのURLをアドレスバーに入力すると？

→WebサーバーからHTML/CSS/画像などが送られる。すると？

→Webブラウザが表示する。

HTMLコードで作られたWebページは、テキストや写真などのレイアウトが固定したページになる。

ログインしている人によって表示する内容が違ったり、ショッピングカートのようにユーザーの操作に応じて画面が変化したりする動的なWebページを作りたい。どうする？

→Webページにプログラミングを組み込む。要は __JavaScriptやPHPといったプログラミング言語__ をHTMLに組み込む。

### クライアントサイドスクリプトとサーバサイドスクリプト

__JavaScriptはクライアントサイドスクリプト__

JavaScriptはHTMLファイルに組み込まれるか、画像などと同じようにWebサーバからダウンロードされる。すると？

→JavascriptのプログラムはWebブラウザで実行され、画面を変化させたり、計算結果を表示したりする。

「 __JavaScriptのプログラムはWebブラウザで実行される__ 」という部分が重要です。__プログラムはクライアントサイド、つまりユーザ側の端末で実行されます。__

一方、 __PHPはサーバーサイドスクリプト__ です。 __PHPのプログラムはダウンロードされる前にWeサーバーで実行されます。__ Webブラウザに __ダウンロードされるのはプログラムの実行結果としてのHTMLコード__ です。

つまり、ダウンロードされたHTMLコードを見てもPHPのプログラムコードは書いてないです。

### クライアントサイドスクリプトとサーバサイドスクリプトの長所と短所

JavaScriptなどのクライアントサイドスクリプトの長所は、 __ブラウザ側での操作やウインドウの変化に即座に応じることができる__ 点です。これを活かしてマウスの動きを利用したインタラクティブなアニメーションを演出することができます。

もっと具体的にいうと、マウスが動きますよね？そして・・・

→JavaScriptなどのクライアントサイドスクリプトが実行されます。そして・・・

→HTML/CSSが操作されてアニメーションが演出されます。

長所
・ブラウザ側での操作に即座に対応できる。
・ウインドウの変化やマウスの座標などを利用できる。

クライアントサイドスクリプトの短所は、Webブラウザの種類やバージョンの違いによって、 __プログラム言語（JSなど）に対応してなかったり、__ ユーザの設定によっては __プログラムの実行が許可されていなかった__ りします。

また、 __プログラムコードを簡単に読まれてしまう__ ことも短所の一つです。悪意のある開発者によって、端末側で実行される不正プログラムが埋め込まれる危険性もあります。

短所
・Webブラウザによってはプログラムを実行できないことがある。
・利用しないコードやデータをダウンロードする無駄がある。
・プログラムコードを読まれてしまう。
・端末側で不正プログラムを実行できる。

サーバーサイドスクリプトの長所と短所

PHPなどのサーバーサイドスクリプトの長所は、クライアント、つまり、 __Webブラウザの違いにプログラムの処理が影響されない点__ です。サーバーサイドスクリプトのプログラムコードはダウンロードされないので、 __プログラムコードを盗み見されません。__ また、端末側では不正プログラムを実行できません。

長所
・プログラムの実行がWebブラウザの違いに影響されない。
・プログラムコードを盗み見されない。
・端末側で不正プログラムを実行できない。

一方、サーバサイドスクリプトはユーザの操作に応じてリアルタイムで画面の一部を書き換えるといった処理には向きません。プログラムコードがサーバで実行されることから、 __サーバ攻撃へのセキュリティ対策__ が欠きません。

短所
・操作に応じたリアルタイムな処理には向かない。
・サーバ攻撃への対策が必要。

### PHPが活躍する利用場面

サーバサイドスクリプトであるPHPが最も得意とする利用場面は、 __MySQLなどのデータベースとの連携です。__ データベースにデータを追加する、値を検索して表示する、値を更新するといった処理を提供します。

具体的にいうと、ブログ、SNS、ショッピングサイト、スケジュール管理、会員管理といったデータベースを組み合わせたサイト構築にPHPノプログラムガ利用されてます。ブログなら記事をDBに保存させておかないといけませんよね。

### PHPコードを編集するエディタ

PHPコードを編集するエディタは、 __UTF-8を編集できるテキストエディタ__ ならなんでも構いません。PHPコードのシンタックス（構文）を色分けしたり、自動インデントやコード補完を行ってくれる便利なエディタもあります。

例えば、AtomやCotEditorが良いです。どちらも数多くのプログラミング言語のシンタックスに対応しており、アップデートも頻繁に行われ安心して利用できます。

### PHPの公式マニュアル

リンク→https://www.php.net/manual/ja/index.php?reason=Un-Auth-SSL-Captive&url=https%3A%2F%2Fphp.net%2Fmanual%2Fja%2Findex.php

### 過去のバージョンからPHP8への移行

過去のバージョンからPHP8への変更点、追加機能をまとめたページのリンク（7.4xから8.0xへの移行）→
https://www.php.net/manual/ja/migration80.php

メジャーバージョンの変更では全体的な操作性が変わったり、まとまった数の主要機能が追加・変更されてます。
APIって何？

# はじめに
現在エンジニアとして転職活動中の0L0です。
そんな転職活動真っ只中の私ですが、とある面接でこんな事を聞かれました。

「APIの実装経験があると書かれていますが、APIについてどれくらい知見がありますか？」

その瞬間から記憶がありません。
というのも、APIというものになんとなくの認識しかなかった私は「APIは何か」を全く理解できていませんでした。
個人的な意見ですが、こういった知識というのは自ら学びにいかないと実務などではなかなか学びづらく、そのモノ自体をある程度理解していないと「これがAPIだぜ！」となる場面も訪れません。
これではいかん！という事で、勉強してみようと思ったのがきっかけです。
言葉は聞いたことはあるけど、たしかに何のことなのか分からんなという私と同じような状況の方の為になればいいなと思います。

# APIって何？
**API**とは"**A**pplication **P**rogramming **I**nterface"の頭文字を取って「API」と呼ばれています。
直訳すると「アプリケーション　プログラミング　インターフェース」となりますが、これだとナンノコッチャ分かりません。
インターフェースというものは何かと何かをつなぐものという意味があり、ここでいうと「アプリケーション」と「プログラミング」をつなぐものがAPIという風な呼ばれ方をしています。

APIはソフトウェアやアプリケーションなどの一部を外部に向けて公開して、その他のソフトウェアと機能を共有できるようにしてくれるものです。
「**APIは受付の窓口である**」と言うと少々わかりやすくなるかもしれません。
例えば区役所で住民票をもらうときに、自分の名前や本人確認できる書類を窓口の人に渡して「住民票をください」といえば、その場で住民票をもらうことが出来ます。
この窓口のおばさんがAPI子さんです。
APIの用途もほとんど同じで、例えば特定のURLに名前など必要な項目を送信するとそれに紐づいたユーザーの情報を返したりなどこういった機能を提供してくれます。

# なぜAPIを作るのか
ここで疑問に思うのが、「何故わざわざAPIを作る必要があるか」という点です。
この疑問についてはメリットを学ぶことで解消されました。
## メリット①「開発の効率化」
例えば特定の誰かのツイートを取得して表示するサービスがあると考えてください。
本来そのような事をしたいと考えた時、処理中では実際にツイッターのページをスキミングなどして、必要な値を取得したりしなければなりません（法律的にアウトだと思いますが笑）
そんな時に役に立つのがAPIの存在です。
実は有り難い事に、TwitterもAPIを公開してくれています。
実際に使うには色々申請したり、手段を踏む必要がありますが、それさえ通れば一般ユーザーでも使う事ができます。
そして、そのTwitterAPIを使えば、先程のような法律スレスレで、かつ面倒な実装をする必要もなく、APIに必要な情報を送信することで特定の誰かのツイートを簡単に取得することができます。
実際にスキミングしてなんだかんだ実装すると最低でも1日くらいかかるのではないでしょうか？
ですがAPIを使えば申請の時間を除いて1時間もあれば連携などのコードも書いて、実際に取得するところまで行けると思います。
これがAPIのメリット①、開発の効率化です。

## メリット②「セキュリティの向上」
例えば自分でなにかのWebサービスを立ち上げるとしましょう。それはログインのような認証機能がついているものとします。
最近ではフレームワーク内に認証機能の開発を手助けしてくれるものが含まれている事が多いですが、一番の懸念点はやはり「セキュリティ的に大丈夫なのか」という点です。
その点もAPIで解決されているサービスをよく見るようになりました。
例えば何かにログインする際、「Googleアカウントでログイン」だったり「Twitterアカウントでログイン」ができるサービスを使った経験は無いでしょうか？
あれも実はAPIです。
認証という機能自体を大手GoogleやTwitterで行うことでセキュリティ的にも開発者もユーザーも安心できるわけです。

## メリット③「使いやすさの向上」
メリット②にも通ずる話ではありますが、なにかのWebサービスに登録しようとした際、結構な情報を入力しないと登録出来ないようなサービスって入力が面倒じゃないですか？
「こんな入力面倒なら、とりあえずゲストでいいや」となってしまう人も少なくないと思います。
そこで、「Googleアカウントで登録」や「Twitterアカウントで登録」といった機能を使うことで既に大手サイトなどで登録している情報を参照してくれるため、登録自体は最小限で済むようになります。
開発者としては自分のサービスに登録してほしい、ユーザーは登録が面倒、この点をAPIでは解決してくれたりする場面があるのです。

# 最後に
いかがだったでしょうか？
調べてみると案外簡単なもののように思えるようになりました。
ですが、やはりこういった基本の知識は頭にあればあるほど理解しながら実装や設計ができたりするので、知っておくに越したことはないですね。
このあたりもう少し深掘りした知識も入れていきたいと考えているので、次回はAPIと共によく耳にする「REST」について自分なりに知識をつけて記事にしようと思います。

# 参考
[・今さら聞けないIT用語　やたらと耳にするけど「API」って何？](https://data.wingarc.com/what-is-api-16084/3)
[・今さら聞けない「API」とは？初心者にもわかりやすく解説](https://cloudapi.kddi-web.com/magazine/twilio-sms/what-is-api)
Java: PDFドキュメントからイメージを抽出する方法


PDFドキュメントは、イメージやテキストなどの様々な形式のコンテンツを含むことができ、非常に実用的な文書フォーマットです。PDFドキュメント内の価値のあるイメージを自分の資料に使用したい場合は、[Free Spire.Pdf for Java](https://jp.e-iceblue.com/introduce/free-spire-pdf-for-java.html)でイメージを抽出し、指定したフォルダに保存することができます。以下は具体的なチュートリアルです。

**Spire.PDF.Jarのインストール**

方法1：
mavenを使用している場合は、次のコードをプロジェクトのpom.xmlファイルに追加することで、JARファイルをアプリケーションにインポートできます。
```
<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.pdf.free</artifactId>
        <version>5.1.0</version>
</dependency>
</dependencies>
```
方法2：
mavenを使用していない場合は、[このリンク](https://jp.e-iceblue.com/download/free-spire-pdf-for-java.html)からFree Spire.Pdf for Javaをダウンロードできます。ダウンロードが完了したら、ダウンロードパッケージを解凍します。次にIDEAで新しいプロジェクトを作成し、「File」、「Project Structure」、「Modules」、「Dependencies」を順にクリックし、右側の緑の「+」の下の最初のオプション「JARs or Directories」をクリックして、前に解凍したファイルを見つけ、その中のlibフォルダの下にあるSpire.Pdf.jarファイルをプロジェクトにインポートします。

**PDFドキュメントからイメージを抽出する**
詳細な手順を以下に示す。
- PDFDocumentインスタンスを作成し、PdfDocument.loadFromFile()メソッドを使用してPDFサンプルドキュメントロードします。
- ドキュメントのすべてのページをループし、PdfPageBase.extractImages()メソッドを使用して指定されたページからイメージを抽出します。
- 出力ファイルのパスと名前を指定します。
- イメージを.png形式のファイルに保存します。


```
import com.spire.pdf.PdfDocument;
import com.spire.pdf.PdfPageBase;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ExtractImage {
    public static void main(String[] args) throws IOException {
        // PDFDocumentインスタンスを作成する
        PdfDocument doc = new PdfDocument();

        // PDFサンプルドキュメントロードする
        doc.loadFromFile("sample.pdf");

        // int変数を宣言する
        int index = 0;

        //ドキュメントのすべてのページをループする
        for (PdfPageBase page : (Iterable<PdfPageBase>) doc.getPages()) {

            //指定されたページから画像を抽出する
            for (BufferedImage image : page.extractImages()) {

                //出力ドキュメントのパスと名前を指定する
                File output = new File("C:\\Users\\Administrator\\Desktop\\ExtractedImages\\" + String.format("Image_%d.png", index++));

                //.pngファイルとして画像を保存する
                ImageIO.write(image, "PNG", output);
            }
        }
    }
}
```
![pdf提取图片.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/64804917-b4da-f081-30ee-5b9cc143aa1a.png)
【Git】直前のgit pushを取り消す方法

## はじめに
間違えたコミットをプッシュしてしまった場合などで、
それを取り消したい場合に使える方法です。

## 方法

### 履歴を残したくない場合

まずは直前のコミットをresetで取り消す
```
$ git reset --hard HEAD^
```

強制オプションの-fをつけてプッシュ
```
$ git push -f origin HEAD
```

### 履歴を残したい場合

resetではなくrevertを使用
```
$ git revert HEAD^
```

そしてプッシュ
```
$ git push origin HEAD
```

## 最後に
個人開発なら、特に理由が無ければresetでも良いかと思いますが、
チーム開発では履歴は残した方が良いかもです。

## 参考
https://tracpath.com/docs/git-reset/
ちゃんとしたエンジニアを目指すブログ

はじめました当ブログ。

ここで会社名を出してよいのかわからないので伏せますが、筆者、実は

「エンジニア」

として雇用していただいております。
にも関わらず、実務経験はほぼゼロ。
コードの理解力も無く、Unityもちょっと触ってみた程度。
現時点でとてもエンジニアを名乗る資格はありません。
年齢も40代が遠くの方から手を振っているのが見える距離に来ました。

しかし私には夢があります。
それを聞いて目を掛けてくれたウチの社長。

一日でも早く戦力になれるよう

そしてなにより自分自身の夢とこれからを切り拓けるよう

「ちゃんとした」エンジニアになるためにこのブログをはじめました。

これから学んでいくのは「Unity」です。
ブログの主旨はあくまでも学んだ事のアウトプットが目的ですが、全体のテーマはタイトルの通りです。
Unityは中途半端に触ってきた(勉強というにはネットで見ながらの独学過ぎて不完全だったり、自分の自信となるには不安定で中途半端な覚え方をし過ぎていた)ところもあったので、一から出直すつもりで、極めて初歩の部分から実践し記録していく事に決めました。
例え牛の歩みになろうと、前へ進んでいこう！という感じです💦

ではさっそく…


◎1-2
【Unityとは？】
ユニティーテクノロジーズが2004年に開発したゲームエンジン。
(ゲームエンジンとは：3Dの計算や影の表示、サウンド、シーン遷移など、ゲーム制作に必要な機能をひとつにまとめて使いやすくしたもの)

【ゲーム内のオブジェクト】
物体。ゲーム画面内の配置された"物体"。

◎1-2-2
【マルチプラットフォーム】
Unityで制作したゲームはPCだけではなく、スマホ(IOSやandroid)やゲーム機(PSやSwitch等)などのプラットフォームでも遊べる。
PC用に作ったものをスマホやゲーム機用に設定を変更することで遊ぶこともできる。

◎1-2-3
【アセット】
ゲームで使う素材のこと。
2Dや3Dのモデルやエフェクト、サウンド、スクリプト等。
これらはUnityのアセットストアで購入可能のため、これらを活用してゲーム制作もできる。

◎1-2-4
【Unityライセンス】
①無料版の場合は、スプラッシュスクリーン(起動時の画面)でUnityのロゴを表示しなければならない。
②収益化する場合、年間100,000ドルを下回る売上までなら無料版ならPersonalエディション。それ以上の収益がある場合は、Plus→Proとランクが上がるものを別途購入する必要がある。

◎1-2-5
【Unityのゲーム制作に必須な主な二項目】
①Unityエディタ
②Unity独自のメソッド(scriptによるコード記述)

◎1-3
【Unity Hub】
Unityのインストールやプロジェクト(作りたいゲーム)の新規作成や既存プロジェクトを開いたりできる。

【モジュールの追加】
様々なプラットフォーム(IOSやandroid、ゲーム機等)で動作するゲームを作成するためには、"インストールしたUnityのバージョン毎に"プラットフォームに対応したモジュールを追加する必要がある。
◇iPhone：IOS Build Support
◇android：Android Build Support、Android SDK & NDK Tools、OpenJDK

◎1-3-2
【iPhoneでゲームを動かすためには？】
MacとXcodeが必要。XcodeはMacやiPhone、iPad用のアプリを開発する時に用いる統合開発環境のこと。

◎1-5
【プロジェクトとシーン】
プロジェクトはゲーム全体を表す。
シーンは画面単位を表す。

お芝居に例えると…
プロジェクト=脚本
シーン=場面

【プロジェクトの作り方】
Unity Hubを起動後、「新しいプロジェクト」→「すべてのテンプレート」から3Dか2Dを選ぶ→プロジェクト名を入力→「プロジェクトを作成」

◎1-5-2
【オブジェクトについて】
シーンビューのオブジェクトとヒエラルキーウィンドウのオブジェクトは"一対一"で対応している。
(シーンビューオブジェクト1：ヒエラルキーウィンドウ2とういうのは無い)

【XYZ軸】
X=真横、Y=真上、Z=真正面
座標がすべて0の地点を「原点」という。


◎1-5-4
【シーンの保存】
File→Save As→ファイル名を入力し保存

◎1-5-5
【シーンビューの操作について】
シーンビューの「ViewTool(手のひらのアイコン)」以外は、操作するとゲーム実行時の見た目にも影響を与える。

【シーンビューでの視点の回転】
Altキーを押したまま画面をドラッグ。
この時シーンビュー右上のシーンギズモ(方位磁石みたいなもの)も動いているため、オブジェクトの方向が不明慮になった場合の目安になる。

◎1-5-6
【オブジェクトの拡大縮小】
カーソル中心の四角をドラッグすると一度に三方向すべての大きさ(全体の大きさを一括で)が操作できる。

◎1-5-7
【画面レイアウト】
画面全体の右上のLayoutから変更可(基本はDefault、私がよく使用するのは2by3)

【ゲームの実行サイズ】
どのプラットフォームでゲームを使用するかによって画像のアスペクト比を選択する。
ゲームビューの「Scale」から選択。

【プロファイラ】
ゲーム実行時の処理速度の重さや描画ポリゴン数、バッチ数等を確認できる。
解析で使われるとのことだが…今のところどうこれを見てどう使用するのかはピンと来ていない…💦
ゲームビューのStatsか、詳細を知りたい場合はWindow→Analysis→Profilerで見れる。
プロファイラ―というと、FBIのイメージが強い…。

☝ポイント
2Dの主な特徴は…
①3Dのシーンを真横から見ている。
②物体をカメラから遠ざけても大きさは変わらない(ここは実際に触らないとよく実感できなかった部分でした…)。
③2Dではライトは使用しないため効果が無効化される。

2Dも3Dも作り方はほとんど変わらないとのこと…
そうなのか…


今日はこのような感じ。
「いや、そこから！？」というくらい初歩の初歩からですが、着実にモノにしていくために立ち返りました。

明日からは一番難関のスクリプト…
気が重いですがなんとか身に付くようにやっていきます(多分スクリプトの章は結構な日数を費やすと思います…)
Tableau Publicでtdsxファイルを読み取る方法

# tdsxとは
Tableauで用いられるパッケージデータソースの拡張子のこと．
**Tableau Publicではtdsxファイルを扱えません．**

# Tableau Publicでtdsxファイルを読み取る方法
1. tdsxファイルの拡張子を.zipに変更する．
1. zipに変更したファイルを解凍する．
1. 解凍して作成されたフォルダの中を見ると元データとワークブック(twb)ファイルが現れるため，それをTableau Publicで開きます．

Tableau DATASaberにチャレンジすると，Ord3以降tdsx形式で配布されるデータソースを使用することになります．
Tableau Desktopが利用できず，Tableau Publicを利用している人は上記の方法をお試しください．
皆はどっち派?"ダブルクオート" vs 'シングルクオート' どっちが速いのか [Python 3.10.6][速さ比較]

https://qiita.com/official-events/6d31965c499a69377c0b

<br>
皆さんはダブルクオートとシングルクオート、どちらをよく使いますか？
私は打ちやすいダブルクオートが好きです。

ダブルクオート、シングルクオートは文字列を表すためにあります。

でも、なぜ2つ必要なんでしょうか?

# なぜ2つも必要なの?

プログラムは1つめのダブルクオートを「文字列の始まり」、2つめのダブルクオートを「文字列の終わり」と認識します。
このような文字列を表したいとき、
```
value = "123"
```
ダブルクオートを使うとこうなってしまいます。
```
"value = "123", 0"
```
なのでこのように書いてしまうとプログラムが「value = 」と「, 0」を文字列と認識し混乱してしまいます。
でも文字列を表すための物がもう一つあれば...
```
'value = "123", 0'
```
プログラムは1つめのシングルクオートを「文字列の始まり」、2つめのシングルクオートを「文字列の終わり」と認識します。
これで文字列の中で文字列を表せます。
もちろん、シングルクオートとダブルクオートを入れ替えても結果は変わりません。

では本題です。
# ダブルクオート、シングルクオートどっちを使ったら処理が速くなるか

皆さん、これは一度は気になったことがありと思います。
***「ダブルクオート、シングルクオート、どう違うの?」***
では、それを調べるためのサンプルコードを用意しました。

```py
import time

def Quotation_Mark(): # ダブルクオート
    start_time = time.process_time()
    for i in range(100000000):
        a = "aa" + "bb"
    end_time = time.process_time()
    return end_time - start_time

def Apostrophe(): # シングルクオート
    start_time = time.process_time()
    for i in range(100000000):
        a = 'aa' + 'bb'
    end_time = time.process_time()
    return end_time - start_time

if __name__ == "__main__":
    Quotation_Mark_ans = 0
    Apostrophe_ans     = 0
    for i in range(10):
        Quotation_Mark_ans += Quotation_Mark()
        Apostrophe_ans     += Apostrophe()
    print(Quotation_Mark_ans - Apostrophe_ans) # 負の数値にっていればシングルクオートのほうが速い。
```
これを何回か実行していきます。
ダブルクオートを先に計算、シングルクオートを先に計算を同じ回数ずつやっていきます。

# 実行結果
| 回目 |   ダブル(")  |  シングル(') |    結果    |
|:----:|------------:|------------:|-----------:|
| 1    | 27.953125秒 | 26.625   秒 | -1.328125秒 |
| 2    | 21.90625 秒 | 21.546875秒 |  0.359375秒 |
| 3    | 19.09375 秒 | 19.546875秒 | -0.453125秒 |
| 4    | 20.375   秒 | 20.96875 秒 | -0.59375 秒 |
| 5    | 20.125   秒 | 20.6875  秒 | -0.5625  秒 |
| 6    | 22.421875秒 | 21.53125 秒 |  0.890625秒 |
| 7    | 22.328125秒 | 21.3125  秒 |  1.015625秒 |
| 8    | 21.53125 秒 | 22.328125秒 | -0.796875秒 |
| 9    | 19.875   秒 | 21.21875 秒 | -1.34375 秒 |
| 10   | 23.96875 秒 | 23.9375  秒 | 0.03125  秒 |
| 平均 | 21.9578125秒| 21.9703125秒| 0.0125   秒 |

結果は誤差もありますがほぼ同じですね。

いい自由研究になりました。
Oracle Analytics Server Marketplace Cluster 構築手順書

Oracle public cloudにOracle Analytics Server MarketplaceのUCMバージョンがリリースされたため、２ノードのクラスターを構築し、手順書を作成しました。Oracle Analytics Server Marketplaceクラスターを利用したい方、ご参考ください。

ダウンロード：https://speakerdeck.com/feixueshu/oracle-analytics-server-marketplace-clusterfalsegou-zhu-shou-shun-shu
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/ce5bd0dc-8680-c837-99f5-78e602e08cba.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387966/fc5427e3-ed00-c317-589d-c4326b16abc1.png)
pyinstallerで作成したexeにおけるカレントディレクトリの変更

# はじめに
pyinstallerで作成したexeは、カレントディレクトリがよくわからないことになることがある気がする。
exeファイルと同階層に、設定ファイルを置いたりログファイルを出力させたいなど、どうしても当該プログラムに対する相対パスを使いたいときに、カレントディレクトリをいい感じにしたいです。
ただ、__file__とかを使ってもうまく行きませんし、他の記事みても一発ではうまく行かなかったので自分のためにメモ。

# 解決方法
## 実装例
```py
#pathlibを使う場合
import os
import sys
import pathlib
os.chdir(pathlib.Path(sys.argv[0]).resolve().parent)

#osモジュールだけで済ます場合
import os
import sys
os.chdir(os.path.dirname(os.path.abspath(sys.argv[0])))
```
## 解説
### キーとなる知識
`sys.argv[0]`に、「実行するexeファイル自身の相対パス」が文字列として代入されている

### やること
Pathlibモジュールにしてもosモジュールにしても手順は一緒
- `sys.argv[0]`に代入されている"相対パス"を"絶対パス"に変換する
    - Pathlibの場合…`exePath = pathlib.Path(sys.argv[0]).resolve()`
    - osの場合…`exePath = os.path.abspath(sys.argv[0])`
- 上述の絶対パスはexeファイル自身なので、"親ディレクトリの絶対パス"を編み出す
    - Pathlibの場合…`exeDir = exePath.parent`
    - osの場合…`exeDir = os.path.dirname(exePath)`
- カレントディレクトリを`os.chdir(dir)`で変更する

# おわりに
ちなみに、`sys.argv[1]`以降には、コンソール等からexeファイルを実行するときに引数として渡した文字列が代入されるらしい。
もしくは、exeファイルに何かしらのファイルをドラッグアンドドロップすることでexeファイルを実行した場合は、ドラッグアンドドロップしたファイルのパスが代入されるらしい。
レコードのコンストラクタ引数をチェックするには

# Question

```csharp
enum BloodType { A, B, O, AB }

record Person(
    string Name,
    int Age,
    BloodType Blood);
```

このPersonにおいて

- Nameにnullが指定されたら`ArgumentNullException`を
- Ageに0未満が指定されたら`ArgumentException`を
- Bloodに未定義の値が指定されたら`ArgumentException`を

それぞれスローするにはどうしたらよいか。

# Answer

以下のように、自動実装プロパティを同名のプロパティで上書きし、その中で自動プロパティの値にチェックをすることで実現する。

```csharp
record Person(
    string Name,
    int Age,
    BloodType Blood)
{
    public string Name { get; } = Name ?? throw new ArgumentNullException();
    public int Age { get; } = 0 <= Age ? Age : throw new ArgumentException();
    public BloodType Blood { get; } = Enum.IsDefined(Blood) ? Blood : throw new ArgumentException();
}
```

それぞれのプロパティが`get`のみ指定されているのがミソで、`init`まで追加してはいけない。

```csharp
public string Name { get; init; } = Name ?? throw new ArgumentNullException();
```

こうしてしまうと、以下の2行目で例外が発生しない。

```csharp
var person = new Person("俺男", 456, BloodType.A);
var person2 = person with { Name = null! };
```

initを指定できないので、値のチェックをおこなう場合、with式中でプロパティを指定できない。

# 参考にした情報
https://stackoverflow.com/questions/64784374/c-sharp-9-records-validation
【WordPress】アイキャッチ画像の各種情報を取得する方法

利用頻度が高いURLや代替テキストをはじめ、タイトルやキャプション、説明などWordPressのアイキャッチ画像の各種情報を取得する方法です。

アイキャチ画像自体は、WordPressのテンプレートタグ `the_post_thumbnail()` または `get_the_post_thumbnail()` を `echo` すると表示できます。
余計な記述を省いたり、任意の属性を追加したりなどカスタマイズしたい場合には、各種情報を取得することで様々なカスタマイズに対応できると思います。

```php
// URL
$thumbnail_url = get_the_post_thumbnail_url();

// ID
$thumbnail_id = get_post_thumbnail_id();

// サイズ（横）
$thumbnail_width = wp_get_attachment_image_src( $thumbnail_id, 'full' )[1];

// サイズ（縦）
$thumbnail_height = wp_get_attachment_image_src( $thumbnail_id, 'full' )[2];

// 代替テキスト
$thumbnail_alt = get_post_meta( $thumbnail_id, '_wp_attachment_image_alt', true );

// タイトル
$thumbnail_title = get_post( $thumbnail_id )->post_title;

// キャプション
$thumbnail_caption = get_post( $thumbnail_id )->post_excerpt;

// 説明
$thumbnail_description = get_post( $thumbnail_id )->post_content;
```

サイズ（横）、サイズ（縦）に関した、特定のサイズで取得したければそれぞれの引数を任意のものに変更してください。


また、URLに関しては `the_post_thumbnail_url()` を記述することで直接出力することも可能です。特に手を加える必要もないので、とりあえずアイキャッチ画像のURLを出せれば良いという場合に便利です。
保存されたオブジェクトの管理

# バージョニング
**バージョニング**とは、オブジェクトの複数バージョンを保存する機能。
バケット単位で設定し、バージョニング機能を有効にすると、誤ってファイルを変更した場合や削除も復元できる。
**バージョニング無効（デフォルト）、バージョニング有効、バージョニング停止**の3つの状態のいずれかに設定できる。

* 以前のバージョンに戻す方法
保存されている過去のバージョンを同じバケットにコピーする
* 1つ前のバージョンに戻す方法
最新バージョンを削除する
# ライフサイクルポリシー
ライフサイクルポリシーとは、
オブジェクト群に対して、定期的に行うアクションを設定できる機能。
S3では、**ライフサイクルポリシー**（ライフサイクルのルール）を設定できる。
**ライフサイクルポリシーに設定できる主なアクション**
|アクション|内容|
|-|-|
|Transition|オブジェクトを別のストレージに移行|
|Expiration|有効期限が来たオブジェクトを削除。オブジェクトがバージョニングされているときは、最新のバージョンのみが対象。バージョンが複数あり、削除マーカーがついてるときは、実行しない。|
|Noncurrent Version Transition|オブジェクトを現在のストレージクラスに残しておく時間を指定|
|Noncurrent Version Expiration|過去のオブジェクトバージョンを削除する前に、残しておく時間を指定|
|Abort Incomplete Multipart Upload|マルチパートアップロードの進行を許可する最大時間を指定|
|Expired Object Delete Marker|期限切れオブジェクト削除マーカーを削除|
# クロスリージョンレプリケーション(CRR)
**レプリケーション**とは、レプリカ（複製）を作ること。
クロスリージョンレプリケーションとは、異なるリージョンに作成したバケットに、オブジェクトを非同期でコピーすること。コピー先のバケットは、コピー元のバケットの持ち主と同じである必要はない。ただし、レプリケート作業を行うためのIAMロールは必要。
また、使用する双方のバケットはバージョニングが有効である必要がある。
同じリージョンのバケット同士はレプリケーション設定できない。
**クロスリージョンレプリケーションによって、海外にもバックアップを取ることができる**。
【初心者が】社内のGit勉強会の講師(司会)をしてみた【体験談】

# 経緯
## 入社まで
ド文系一直線だったので、
そもそもGitが何なのかも知らなかったです。
## 入社後
入社後の課題でプログラミングに触れ、面白さを知りました。
といっても、まだこの時もGitのことを知らないです。
(`` Ctrlキー＋Z ``と`` Ctrlキー＋Y ``で戦っていた)
## 研修期間
ここで初めてGitという存在を認識しました。
その時の俺の感想→「便利そうだがなんか怖い」
研修中にソースツリーというツール(GUIでの操作により内部でGitコマンドを実行をしてくれるもの)を触ってみる機会があったので、なんとなくこれを使って慣れ親しんでいくのかなぁなんて思っていました。
## 配属後
本格的に配属された部署のマネージャーから、
「ウチではコマンドでGitの操作を行ってもらいます。それ以外は許しません。もしソースツリーを使うと毎晩うなされる呪いをかけます」
との宣告があり無事死亡(実際はこんな言い方ではなく優しい物言いでしたが、初心者の自分にはこう聞こえました)

※実際はコマンド操作限定ではありません。初心者の自分にはコマンドを通じてGitの仕組みを学んでほしいという意図がマネージャーにあったようなのです。
どうか「今時のエディタなら画面上から操作できるのにこの会社(こいつが配属されたチームとそのマネージャー)ヤベェ」とは思わないでください(笑)
## そんなこんなで
ひーひー言いながらGitのキャッチアップを開始しました。
まずはじめに、Udemyの『Git:もう怖くないGit！チーム開発で必要なGitを完全マスター』には大変お世話になりました。
また、マネージャーをはじめ、私が配属されたチームの皆さんが優しく教えてくださったこともあり、なんとなくコマンド操作やGitのいろはがつかめてきました。
## そして伝説(Git勉強会の講師)へ…
嘘です。伝説なんて大したものではありません。
なんなら講師と書いてありますが、もともと用意してくださった資料に従って、ハンズオンを挟みながらGitのコマンドを説明するだけなので、講師未満・司会以上といったところでしょうか。
それでも、この役割をお願いされたときは緊張しました。
前日も当該のマネージャーSさんに壁打ちに付き合ってもらい、勉強会当日もフォローに回っていただきました。
# Git勉強会当日
## 内容
一回３０分程度の勉強会で、私が担当したのは主に`` clone ``や`` config ``のコマンドの説明でした。
(私以外にも勉強会の講師役を務める同期は数人いたので、お互いの発表の時には、手が空いてる人が画面共有でコマンド操作を見せるなどしました)
参加者の皆さんと一緒にGitLabでリモートリポジトリを作成するところから始め、gitbashを用いてコマンド操作を行いました。
## やってみた感想
シンプルにやってみてよかったです。
### よかった理由
- 私と同期で入った新卒の各位もやはりコマンドでのGit操作には抵抗感があったようで、当日は盛況だった。
- 周囲に助けられながら勉強会を進行したが、チームメンバーの皆さんからお褒めの言葉もいただけたりしてうれしかった。
- 勉強会後、「git勉強会のおかげでコマンド操作での恐怖がなくなったし、いろんなコマンドも覚えてスピードも速くなったので本当にありがたいです、、、！めちゃめちゃ活きております」なんていう感想が投稿されたりもして、誰かの役に立ってることが分かった。
- 自分自身の勉強にもなった。感覚的に理解しているところをひとつひとつ言語化することで、よりGitへの理解が深まったように感じる。
- また勉強会の最中、その後にいただいた質問に答えようとする中でも、自分の理解度も深まっていく。
→理解が深まったおかげで実際Gitのコマンドへの抵抗感が薄れ、自分自身の日常業務の時間効率があがった。

## まとめ
今後もこういう機会があれば、ぜひ手をあげたいし、また周囲にも手をあげてほしいと思います。
人に説明するって良いですね！
Ｃ言語で要素数を指定せず２次元配列を初期化する

# Ｃ言語で要素数を指定せずに２次元配列を初期化・処理する
Ｃ言語で２次元配列を作成し初期値を設定しようとすると行数・列数の両方を指定するか列数を指定する必要があり、その２次元配列は列数まで型の一部という扱いになり素直にポインタで渡す事ができなくなります

double a[][3] = ...;
と宣言した変数を
void function(double* x) {...
で素直に受けることはできない

m行ｘn列 いくつの行列でもポインタで処理したい時の解決方法です

## 変数は１次元配列で宣言し行数・列数を引数に取る参照関数を作成する
以下実装です

``` c

#include <stdio.h>

double sample1[] = {
    1.0, 2.0, 3.0,
    1.1, 2.1, 3.1,
    1.2, 2.2, 3.2,
    1.3, 2.3, 3.3
};

double sample2[2][3] = {
    {1.0, 2.0, 3.0},
    {1.1, 2.1, 3.1}
};

double vector2_reference(int row_size, int col_size, int row, int col, double* x) {
    return x[row * col_size + col];
}

int main(int argc, char **argv) {
    int i, j;
    for(i = 0; i < 4; i += 1) {
        for(j = 0; j < 3; j += 1) {
            printf("x[%d, %d] = %f\n", i, j, vector2_reference(4, 3, i, j, sample1));
        }
    }
    
    // sample2 を double* で受けようとするとwarningが出る
    //for(i = 0; i < 2; i += 1) {
    //    for(j = 0; j < 3; j += 1) {
    //        printf("x[%d, %d] = %f\n", i, j, vector2_reference(2, 3, i, j, sample2));
    //    }
    //}
    
    return 0;
}

```


## 引数５個はスマートでない
vector2_reference関数の引数が５つもあり上長に感じますね、スマートではないですが必要最低限実装でもこうなってしまうので仕方ないですね、ｎ次元配列用の構造体を作ってスマートに見せるのも良い方法だと思います
Sourcetree使い方

# 前提
・SourcetreeインストールやGitのログインが済んでいる
・初めてGit周りを触る
・ローカルリポジトリに落としてきてからの扱い方
・未経験エンジニア

プログラミングして4ヶ月、
Git周りを扱い始めて1ヶ月程度なので間違えている場合もあるかもしれません。:thinking:
最悪なことにならないような基本操作や概念のみを記載しています。
※自分の備忘録です。
変なことを書いている場合や補足事項などがございましたら教えていただけると幸いです。

# ブランチとは？
そもそもブランチとは何かというと、branch = 枝と思っていただけると話が早いです。
プログラム全体が1本の木で、いろんな枝が寄せ集まって1本の木の幹を形成するとイメージしてください:deciduous_tree:

複数人で一つのプログラム(=1本の木)を作っていく場合。
例えば全員がいきなり幹を作るとすると、一部分が腐るとどうなるでしょう？
他の枝にも影響を及ぼして幹全体が腐る(=エラーが生じる)ことになります。
そうならないように、branch(枝)を個別で作ってエラーを引き起こさないように確認した後で、
やっとこさ幹に合体、すなわちMergeされることができます。
私のような初学者は自分でも知らないうちに何するかわからないので、
とりあえず親ブランチに直接Pushすることは避けておくことだけ頭に入れておくと良いと思われます。

# ブランチの種類
大きくわけて以下二つのブランチが重要です。
・develop
・feature
developは開発で中心となるブランチのこと。いわば幹の部分です。
ということで基本的にfeatureを触っていくわけですが、ここでもいきなりfeatureを触ることはできません。
featureから派生させた自分の枝を作る必要があります。

# ブランチの作り方

まずは左側のメニューバーにある`ブランチ`から親にしたいブランチを選択します。（ダブルクリックで切り替えることができます。）
※親ブランチが見つからない時は左側メニューバーから親ブランチをダブルクリックするとリモートに引っ張ってこれます。
その後、上側のメニューバーからブランチを作成。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727780/66beb7f2-fc7c-1a8c-9717-a0667350d921.png" width=50%>

上記写真のマージの横にあるブランチアイコンです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727780/61b966cf-80e1-d0e0-9078-cd9230a7e41c.png" width=50%>

作るブランチは基本的に
`feature/自分の名前/作るプログラムの名前`です。
こんなのになっていたらヨシ！！
ブランチを作成して、そこにコミットプッシュしていけばとりあえず大事な親ブランチは守れるはずです。
最低限これをしておけば、何か間違ったことをしてもMR時に防いでくれるはずです。
他人任せは良くありませんが、自分の身を守るためにも枝先に逃げておくのです。

# 便利な機能紹介

- スタッシュ
スタッシュは便利です。本当に。変更したファイルを一時避難させておくことができます。
もはやPushすら怖いﾊｧﾊｧ…うっ、動悸が！という小心者の私たちは一旦Push前にスタッシュに内容を保存しておくと安心です。

上のメニューバーにあるスタッシュを押せばいいだけです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727780/59c08e99-8ca1-d8be-b2e4-32f655793ae3.png" width=50%>
押すとこんな表示が出てきますが、彼は味方です。
変更したファイル、いわば作業に名前をつけるだけです。

- ファイルステータス
自分が何のファイルのどこを編集したのかを見やすくしてくれます。
プラスとかマイナスとか出ている部分を選択->`選択した行を破棄`すると、
変更前のデータに戻してくれます。
ありがたい。

- フェッチ
ブランチの最新情報がないか更新してくれます。プルで引っ張ってこれます。

# 最後に
間違っていたらどうしよう。。ﾊｧﾊｧﾊｧ怖い。。
とりあえず環境破壊だけはしないように気をつけます。
ちょうどSDGsが推奨されていますしね。
持続可能なお仕事環境をこれで保てますように。☆彡
PowerShellで特定の文字列があるファイルパス一覧を作成したい。

PowerShellで特定の文字列があるファイルパス一覧を作成したい場合、
対象のフォルダでpowrshellを開き下記スクリプトを実行する。

```powershell
Get-ChildItem -Recurse -Filter "hoge"  | ForEach-Object {$_.FullName} | Out-File "output.txt" 
```

【解説】
上記のスクリプトを実行するとファイル名に"hoge"が含まれる場合に、
output.txtにフルパスが出力される。

-Recurse　指定をしているのでカレントパスから下位フォルダ全てを検索する。
Reactについて

 ReactはUI(User Interface)のwebページを作るためのJavaScriptのライブラリ
Reactの公式ページ[日本語版]

https://ja.reactjs.org/

 webページを作るためのライブラリなので、フロントエンドでのデプロイをする際に用いるライブラリです。

Reactの特徴、メリット、デメリット諸々
・Meta社が公開
・HTMLを書かずにリッチなwebページを作成できる
・データの更新があれば、逐次更新される
・ページ上の操作が高速
・SPA(Single Page Application)の操作を行うことができる
・編集中にデータ更新があったらその都度更新分を再描画する

https://qiita.com/akkii__/items/6a9c31a80ddbdfa5f6b4

https://zenn.dev/panda_program/articles/deep-dive-into-react

<B>React.FC</B>
コンポーネントを定義する関数型。FCはFunction Componentの略。
Q.)そもそも、コンポーネントとは？<<コンポーネントについてまとめてみたい>>
<<ここらへんで手ごろなソースコードを何か書く>>
//sample code
const practiceFC: React.FC= () => {
    return <div>やあやあやあ</div>
}
https://interrupt.co.jp/blog/entry/2021/03/05/133925
https://de-milestones.com/typescriptreact-fc/#toc1
※※もう少しReact.FCについて深く調べて納得できるまでアウトプットをする！


<B>JSX</B>
コンポーネントを描画するHTMLタグを記述するためのJavaScriptの拡張機能
//JSX　JavaScriptの構文の拡張
.jsx はJavaScriptの拡張子
.tsx　はTypeScriptの拡張子

https://ja.reactjs.org/docs/introducing-jsx.html

<<研修資料の24pのコードを写す>>
JSXの記述
return <div>
    <label>{content}</label>
    <input type='checkbox'
            checked={done} onChange={onCahange} ref={checkBoxRef} />
※※JSXファイルはJS入るファイルと比べてなにがよいのじっくり調べてまとめてみる

<B>Hooks API</B>
 React.FCのコンポーネントの実装で使うAPI

https://ja.reactjs.org/docs/hooks-reference.html

たくさんAPIがあるが、代表的なものは
useEffect
useState
useRef
useCallback
※※それぞれについて詳しく説明する



useState https://chaika.hatenablog.com/entry/2020/08/16/083000

useEffect
https://ja.reactjs.org/docs/hooks-effect.html

/cite
useEffect({ => {
    loadHello()
        .then()
        .
then~ catch文について
AsyncStorageを使ってデータをローカル保存する

# 概要
AsyncStorageを使って内部ストレージにデータを保存する（簡単な構造のデータを保存・取得する）
※データ量が多くソート・抽出処理が必要なら外部DBを使う方が良さそう
[参考](https://react-native-async-storage.github.io/async-storage/docs/install)

# 目次
[1. @react-native-async-storage/async-storageをインストールする](#1-react-native-async-storageasync-storageをインストールする)
[2. import](#2-import)
[3. データを保存する](#3-データを保存する)
[4. データを取得する](#4-データを取得する)
[5. データを削除する](#5-データを削除する)
[6. データを全削除する](#6-データを全削除する)
[7. keyを取得する](#7-keyを取得する)

# 1. @react-native-async-storage/async-storageをインストールする
react-nativeのAsyncStorageは非推奨みたいなので、コミュニティライブラリのAsyncStorageを使用する
```
$ npm install @react-native-async-storage/async-storage
```

# 2. import
@react-native-async-storage/async-storageからAsyncStorageをインポートして使用する
``` javascript:App.js
import AsyncStorage from '@react-native-async-storage/async-storage';
```

# 3. データを保存する
AsyncStorage.setItem(key, value);を使用してデータを保存する
AsyncStorageはstring型(文字列)しか保存できないのでJSON.stringify({})を使ってデータをString型に変換して保存する
``` javascript:App.js
  const saveStreage = async (name, value) => {

    const newSaveDatas = {
      name: name,
      value: value
    }
    const saveDatasString = JSON.stringify(newSaveDatas);
    try {
      await AsyncStorage.setItem(
        'testData',
        saveDatasString
      );
    } catch (error) {
      console.log(error);
    }
  }
```

# 4. データを取得する
AsyncStorage.getItem(key);を使用してデータを取得する
String型で保存されているデータをJSON.parse()を使って元のデータに変換して取得する
``` javascript:App.js

  const [saveDatas, setSaveDatas] = React.useState(new Map());

  const loadStreage = async () => {
    try {
      const loadDatasString = await AsyncStorage.getItem('testData');
      if(loadDatasString) {
        setSaveDatas(JSON.parse(loadDatasString));
      }
    } catch (error) {
      console.log(error);
    }
  }
```

# 5. データを削除する
AsyncStorage.removeItem(key);を使用してデータを削除する
``` javascript:App.js
  const removeStreage = async () => {
    try {
      await AsyncStorage.removeItem('testData');
    } catch (error) {
      console.log(eror);
    }
  }
```

# 6. データを全削除する
AsyncStorage.clear();を使用してデータを全削除する
``` javascript:App.js
  const clearStreage = async () => {
    try {
      await AsyncStorage.clear();
    } catch (error) {
      console.log(eror);
    }
  }
```

# 7. keyを取得する
AsyncStorage.getAllKeys();で全keyを配列で取得できる
``` javascript:App.js
  const getAllKeys = async () => {
    var keys = [];
    try {
      keys = await AsyncStorage.getAllKeys();
    } catch (error) {
      console.log(eror);
    }
    console.log(keys);
  }
```
アクセス管理と改ざん防止

# アクセスログとは
**アクセスログ**とは、サービアに対してどのようなリクエストあったのかを記録する機能のこと。
ログの内容は、
* バケットの所有者
* バケット名
* リクエスタ
* 時刻
* レスポンス時間
* アクション
* レスポンスのステータス
* エラーコード
が記録される。
S3の機能として、アクセスログの記録が提供されているので料金はかからない。
ログを書き込んだファイルは対象となるバケットと同じリージョンのバケットに保存されるので、その保存には料金がかかる。
**主なログ記録**

|項目|内容|
|-|-|
|Remote IP|リクエスト要求元のIPアドレス|
|リクエスタ|アクセスしてきたユーザー|
|リクエスト ID|識別のためにAmazon S3で生成されるID|
|オペレーション|リクエストされた操作の種類|
|キー|リクエストのあったオブジェクトキー|
|Request-URI|リクエストされたURI|
|エラーコード|エラーコード|
|Bytes Sent|送信されてレスポンスのバイト数|
|Object Size|リクエストされたオブジェクトの全サイズ|
|Total Time|サーバーがリクエストされた内容の送信にかかった時間|
|Turn-Around Time|リクエストの返信にかかった時間|
|Referrer|HTTP Referrerヘッダーの値|
|User-Agent|HTTP User-Agentヘッダーの値|
|Version Id|リクエストのバージョンID|
|ホストヘッダー|S3への接続に使用するエンドポイント|

# その他のアクセス管理方法
## ストレージクラス分析
ストレージクラス分析はオブジェクトへのアクセス頻度を分析する機能。
アクセス頻度の低いデータは低頻度アクセスのストレージに移すなどの判断材料として使える。オブジェクトは、設置された日付である程度グループ化され、それぞれのグループの平均転送バイト数が監視されている。
対象のオブジェクトはフィルタリングして監視することができる。
このフィルターごとに最大1000個設置できる。
## オブジェクトロック
オブジェクトロックはオブジェクトを保護する機能。
オブジェクトに関する変更を許さないので、オブジェクトの削除や上書き、改ざんなどを防ぐ。ロックには有効期限を設定できる。
また、リーガルホールド（訴訟などにかかわる情報を保全すること）も有効期間に関係なく行える。ロックで保護されているバケットはクロスリージョンレプリケーション(CRR)でコピーできない。
**オブジェクトロックにおける2つのモード**

|ロックのモード|内容|
|-|-|
|ガバナンスモード|特定のユーザーにのみオブジェクトに対する変更を許可するモード。|
|コンプライアンスモード|全てのユーザーがオブジェクトに対して変更できなくなるモード。AWSのルートユーザーも変更できない。また、モードや期間の変更もできなくなる。|

## S3インベントリ
インベントリはバケットに入っているオブジェクトのメタデータを毎日もしくは毎週一覧にして生成する機能。
CSVやORCなどのファイルにできる。S3インベントリはAmazon AthenaやAmazon Redshift Spectrumなどのビックデータを処理するツールを組み合わせると便利。

# 余談
## S3バッチオペレーション
Amazon S3バッチオペレーションを使用すると、オブジェクトのコピー、Amazon S3 Glacierからオブジェクトの復元など、様々なオペレーションを対象のオブジェクトに対し、実行できる。
【Android】FABのアイコンのTintについて

## 結論

FAB(FloatingActionButton)の色は、
<b>`app:tint="@null"`</b>　もしくは　<b>`app:tint="@color/xxxx"`</b>　で指定する。

`app:tint="@null"` は元のアイコンの色が表示される。
`app:tint="@color/xxxx"`では、colors.xmlで定義した色やandroidの色を使用できる。
（元のアイコンの色は無視される）

たとえば、Vectorアセットで白色でアイコンつくったけどやっぱ青にしたいなーってときは、
`app:tint="@color/xxxx"`で指定したほうが便利。

## 備忘録として書くきっかけ

Vectorアセットで作成した白のアイコンを、
FAB(FloatingActionButton)のsrcに設定すると、アイコンの色が黒くなってしまった。

`android:tint="@color/white"`　と指定しても直らなかった。

![スクリーンショット 2022-08-24 162245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/827233/a2bfef1d-af31-0e69-e483-997eb4ed75ff.png)

ハマりにハマって色々調べていたら、
[GitHubに同じ問題をかかえている人](https://github.com/material-components/material-components-android/issues/1106)がいた。

英語で、あとから見返すときにまた自動翻訳のヘンテコ日本語から読み取るのがだるいので、
自分の言葉でまとめとこうと思ったのがきっかけ。

### 環境

* Android Stuido：Chipmunk 20212.2.1
* OS：Android12
Blocksで 生成されたProject を削除したい

## 経緯

Blocksを使って簡単に可視化したいなーと思ったけど、うまく適合せず、そのｐBlocksで生成されたProject以下の資産が不要になった。

## やったこと

※ 1, 2に関しては、 Lookerの[公式ドキュメント](https://docs.looker.com/ja/data-modeling/getting-started/manage-projects#deleting_a_project)を参考

### 1. Project自体の削除

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76913/e4fa5609-e8a9-fef2-236b-30d10f08daa7.png)
※ 画像引用: Lookerの[公式ドキュメント](https://docs.looker.com/ja/data-modeling/getting-started/manage-projects#deleting_a_project)

- Develop > 指定の Project の画面を開き、 Development Modeにする。
- ①のSettings > ②のConfiguration を開く。
- ③のDelete Project は画面下部にある。
- 内容を確認して、Project名をもう一回入力して削除を実行する。


### 2. Project Configureの削除

- Develop > Project から Project一覧に移動する。
- 先にProjectを削除していたら、Pending Project に削除されたProjectが記載されている。
- 対象のProject名 の横にある、 Configure ボタンを押して、 Delete Project Configureを実施する。


### 3. MarketPlace の Manage から Uninstall

これをやんないと、左側のサイドメニューに、そのBlocksの名前が出続ける。

↓  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76913/14b4d023-32f7-eec2-7932-00aa67ade9b9.png)


### 対応方法

- marketplace の管理画面 ( **manage** を選択 ) へ移動
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76913/75e4521a-95b3-e4ee-8bc7-901a9d0b0e36.png)
- 対象のBlocksを uninstall (delete) する。


## まとめ

不要な資産は早めに消すに限るが、Lookerはいろんなところに根が張ってるので、  
正しく消さないと、変なのが残り続ける。
コードはリファクタリングするのにチャットはしないの？？？


エンジニアの皆さん、日々の業務お疲れ様です。
少しこの記事にお付き合い頂けるなら、ここ最近の業務を思い返してみて下さい。
どうでしょうか？

### VSCodeとSlackのどちらの画面に向き合っている時間が長いですか？

VSCodeもSlackも使っていない？
そんな方は普段お使いのお気に入りのエディターとチャットツールを想像して下さい。

え？VSCodeの方が長い？
もしかしたら新たな発見があるかもしれません。

Slackの方が長い方はぜひぜひ聞いてほしいです。

すみません、前置きが長くなりました。

この記事のテーマは**チャットツールの使い方改善**です。
プログラムをリファクタリングするならチャットにも実施した方が良いのでは？
という観点で書いています。

アプリケーション開発の手法をインフラにも適用するInfrastructure as Code(IaC)という概念がありますが、
似たような考え方を導入しています。
(プログラムコード改善手法をチャット文章にも応用する。どちらも同じ文字列なので。)

具体的なツールを例にしたほうが話を進めやすいため今回はSlackを使用します。

また、個人利用でもチームのような大規模利用でも効果を発揮する内容にまとめました。
むしろ大規模利用の方が効果が高いと思います。

では、始めます。

# 情報エントロピーの増大

"あれ？どっかで見た気が、、、んー、見つからん、、、"
このフレーズを心の中で呟いたことがある方も多いと思います。
もしくは実際に聞いたことがある人もいるでしょう。

このフレーズに遭遇したなら要注意です。
その空間は既に情報エントロピーが増大しています。


エントロピーの定義はここでは重要ではないので、ひとまず"無秩序さの指標"として捉えて下さい。
一見したときに"なんか汚ない、、、"と直感で思った場合、それはエントロピーが増大しているということです。

# 無秩序の弊害
無秩序だと何がいけないのでしょうか？
無秩序がもたらすコストやリスクをいくつか挙げてみます。

* 時間的コスト
関連する情報が複数箇所に散在している場合、それらの情報を全て探し出して適切な順番に結合しなければなりません。
検索時間と結合した情報を理解する時間、これらの両方で時間がかかります。
時には高度な検索機能を利用しなければ探し当てられない情報があるかもしれません。
もしそうなら、検索機能の学習時間も別途必要となります。

* 誤認リスク
検索結果に基づき結合した情報の組み立て方が不適切な場合、文脈を読み違えてしまう危険性があります。

* 見落としリスク
そもそも目的の情報の一部を検索しきれなかった場合、文脈そのものが欠落してしまう可能性もあります。

これらのコストやリスクが発生し組み合わさると、
* 同じ話をしているはずなのに噛み合わない
* リソースへの設定ミス
* システム理解の妨げになる
* システム障害の誘発

等の残念な結果をもたらします。

# エントロピー増大の兆候を探す
以下の兆候が確認できた場合は、エントロピーが増大している可能性が高いです。

* タイムラインが縦に伸びている
具体的な指標は存在しません。読みにくいなと思う直感を頼りにして下さい。

* 検索結果が複数見つかる
検索機能を利用して目的の単語やリンクを検索をすると、
類似の単語や文章が画面一杯に表示される場合は危険信号です。

# 手遅れかも？ を もう手遅れ にしないために
具体的なTIPSを紹介していきます。

* **スレッドを活用する**
この手法が最も改善効果が高いです。
スレッドをフル活用することで、タイムラインが縦に長大になることを防ぎ関連情報の集約率が高まります。
私が思う効果的な活用法を紹介します。
※例ではチケットシステムの利用を想定しています。
まずチャンネル投稿内容には`チケット番号 チケット要約 スレッド`の一行のみに限定します。
以降はスレッドに記載します。
![slack-tunnel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712116/4719fe91-056d-8775-500d-13f26808db37.png)
次にスレッドを開きチケットへのリンクを投稿します。
注意としては、チケットリンクに含まれる文字列とチャンネル投稿したチケット番号の文字列は分けることです。
![slack-thread.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712116/8c452c66-9fad-80bf-c58a-21b85cd831ad.png)

そうすることでチャンネル投稿時のチケット番号が一意になり、
検索時にノイズに惑わされず、目的の情報にアクセスできます。
![slack-search-result-unique.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/712116/b68293f9-2695-eb3b-f5d4-ba06ba1018da.png)

* **検索容易な文章を書く**
スレッドの活用でも書きましたが、チャンネルやスレッド内で一意になる可能性が高い単語を選びましょう。
また、スレッド間で情報を連携したい場合は、
互いのスレッドに同じ文字列を投稿しておくとまとめて検索結果に表示させることもできるので便利です。
要はタグ付けによるグループ化ですね。

* **関連メンバーに配慮した文章を書く**
AさんがBさんとチャットでやり取りしているとしましょう。
この２人はベテランのリードエンジニアです。
しかし、このチームには入社間もないCさん、Dさんも所属しています。
文章内容がCさん、Dさんにも関わりがあるのであれば、ある程度難解な単語は意図的に省いた文章構成にしましょう。
ただしここで大切なことは、伝えたい内容が改変されるほどに簡略化してはいけないということです。
メインはBさんとの意思疎通であることを忘れないようにして下さい。

* **省略記法の多用を控える**
過去の自分や他のメンバーが理解に苦しまない程度に控えましよう。
省略記法は当座の理解短縮には役立ちますが、不特定多数の人が後で参照する可能性が高い文章には不向きな場合が多いです。
　　--- AWSでの一例 ---
　　運用者にとって"CW"は"Cloud Watch"のことかもしれませんが、
　　データサイエンティストにとっては"Glue Crawler"のことかもしれません。

# ちょっとだけ横道
チャットに限らずドキュメントのような文章全般に言えることですが、
文章内容より以前に、**置き場所**が非常に重要だったりします。

海底に沈んだ世界中が感動する小説よりも、ドキュメント管理ツール上にある
５ヶ国語交えて書かれたアプリケージョンのデプロイ方法の方が有用なのは言うまでもないですよね。

# 明日からの実践
お読み頂き誠にありがとうございました。

この記事の内容は要約すると、**文化の改善**に尽きると思います。
文化の改善は一朝一夕ではなしえないことを心得ておく必要があります。
まずは個人の改善から。そしてチームへの波及へ。
まずは目の前の小さな改善から着手されてはいかがでしょうか。
【備忘録】ffmpeg で連番 png を x265 エンコードするときのコマンド @ Mac

こういうのがある。
ParaViewとかmatplotlibとかで出力した連番画像をコマンド一発で動画にできるので便利。


https://qiita.com/riocampos/items/2f4fe927b5cf99aff767


それはそれとして、Mac が いつの間にか x265 に対応するようになったとのことで、ファイルサイズも x264 より小さくなるらしいし移行した方が良さそう。
オプションとかは[こことか](https://life.craftz.dog/entry/save-storage-with-h265-ffmpeg)が参考になるんだが、このままだとなんか色がおかしい[^env]。

どうやらカラーフォーマットの問題らしい。`yuv420p`を指定してあげましょう。

```sh:ffmpeg x265
ffmpeg -r 10 -i <filename>.%04d.png \
    -vcodec libx265 -tag hvc1 -pix_fmt yuv420p -crf 28 \
    -r 10 -y out.mp4
```

[^env]: なお環境: MacBook Pro M1 Max (2021), macOS Monterey 12.4; Homebrew 3.5.10, ffmpeg 5.1
すべてのデザイナーが知っておくべき 10 の Web サイト

サイトはライセンスされており、商用目的を含め、素材を無料で簡単にコピー、変更、および配布できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2775810/87809536-ab36-00c0-3a4e-8e8d78d3c8ec.png)

https://www.python4dev.com/

初心者であろうとなかろうと、デザイナーがプロジェクトでの作業に役立つお気に入りのサイトのリストを常に手元に置いておくことは理にかなっています。次のサービスが提供されます。

UNSPLASH は、高品質のストック写真のデータベースにアクセスできる Web サービスです。プラットフォームは、あらゆるトピックに関する画像があるという点で異なります。
STICK PNG - 背景が透明な画像の巨大な倉庫
THE MOCKUP CLUB — モックアップのあるクールなサイト
プレビュー済みアプリ - ビデオ モックアップ
GOOGLE FONTS - シンプルなフォントと非標準のフォントの両方を見つけることができるフォント ライブラリ
FLATICON は、最大のアイコン データベースの 1 つです。アイコンの色、サイズを変更し、SVG、PNG、EPS などのすべての形式でダウンロードできる組み込みのエディターがあります。
ストーリーセット — ウェブサイト、アプリケーション、またはプレゼンテーションをパッケージ化するためのあらゆる好みに合わせて、さまざまなスタイルのイラストをストックします
HUMAAANS は、自分だけのイラストを作成できる新しい Web アプリケーションで、色、服、アクション、背景を変更できます。
ADOBE COLOR は、配色と色を調和させるのに役立つカラー パレット ジェネレーターです。
MATERIAL PALETTE - 2 色のパレットの選択
気になるサイトはブックマークしておきましょう✔️

Frank Chimero からのちょっとした励ましのアドバイス: 「良いデザインとは、他のデザイナーの頭にこのアイデアがないために、他のデザイナーをバカだと思わせることです」
プログラミング言語とは

```機械語に翻訳しやすく、かつ人間にもわかりやすい中間の言語```それがプログラミング言語

# 代表的な言語とその特徴
## C言語（シーげんご）
かなり```ハードウェアに近いレベルの記述```できてしまう、なんでもありな柔軟性を持っている。

## BASIC（ベーシック）
```初心者向けとして古くから```使われている。
書かれたその場ですぐ実行して確かめることができる```インタプリタ方式が主流```という特徴を持っている。

## COBOL（コボル）
```事務処理用に古くから```使われる言語。
古くから使われているシステムでは、過去に作ったCOBOLのシステムが今でも多く稼働している。

## Java（ジャバ）
インターネットのWebサイトや、ネットワークを利用した```大規模なシステム```などで使われる。
設計初期からオブジェクト指向やネットワーク機能が想定されていた。
```Java仮想マシン```という実行環境を用いることで、OSやコンピュータの種類といった```環境に依存することなく```、作成したプログラムを動かす。

# 言語プロセッサ
人間の手で書かれたソースコードを機械語に翻訳するときに一つずつか全てかで方式が変わる。
### インタプリタ
ソースコードにかかれた命令を、```一つずつ機械語に翻訳```しながら実行する。
その箇所まで実行させることができる。

### コンパイラ
ソースコードの内容をに```全て翻訳```して、機械語のプログラムを作成する。
ソースコード全体を解釈して、機械語化するために、```効率の良い翻訳結果```を得ることができる。
翻訳の手間はかかるが、その後の```コンピュータが直接実行できるので高速```に動きます。

### アセンブラ
* ```アセンブラ言語で書かれたプログラムを機械語へ変換```する。
* アセンブリ言語で記述されたコンピュータプログラム（ソースコード）を、コンピュータが直接解釈・実行できる機械語（マシン語）による表現（オブジェクトコード）に変換するソフトウェア。
出典 https://e-words.jp/w/%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9.html#:~:text=%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9%E3%81%A8%E3%81%AF%E3%80%81%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%AA%E8%A8%80%E8%AA%9E,%E3%82%B3%E3%83%BC%E3%83%89%EF%BC%89%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%80%82

#### 低水準言語と高水準言語
アセンブラとマシン語のことを```「低水準言語」```と呼びます。
COBOL，BASIC，Pascal，C言語，C++，Java，C#などの```プログラミング言語を「高水準言語」```と呼びます。
低水準とは，```コンピュータの生の動作に近い```という意味で，高水準とは，```人間の感覚に近い```（コンピュータの生の動作からは遠い）という意味です。高水準言語を使えば，```コンピュータのハードウエアの知識がなくてもプログラムが作れます```。
出典　https://xtech.nikkei.com/it/members/ITPro/ITBASIC/20021218/1/

### ジェネレータ
特定の問題についての```入出力の条件や処理条件などを支持するパラメタを入力することで目的プログラムを生成```する。

#### 目的プログラムとは？
```人間語で書いたプログラムの元ネタ（ソースコード）をコンピュータさんが分かる形に翻訳（コンパイル）したもの```
出典 https://wa3.i-3-i.info/word17206.html

# 問題を解いた時の気づき
### ガーベジコレクションとは?
Java言語では、ヒープ上のメモリ領域をJavaオブジェクトに割り当てたり、もしくは割り当て済みの領域を解放したりする処理を、プログラムコードに明示的に記述する必要がありません。これは、CやC++などの言語との大きな違いです。CやC++では、プログラムが使用するメモリ領域の割り当てや、使用済みの領域の解放を、プログラムコードから明示的に指示しなくてはなりません。
　Java言語では、こうした```メモリ管理がJVMによって自動的```に行われます。つまりJVMは、Javaプログラムの```どこからも参照されなくなった不要なJavaオブジェクトを見つけ出し、そのメモリ領域を自動的に解放```します。こうした```Javaオブジェクトの削除処理は「ガベージ・コレクション」```と呼ばれます。JVM内部では、このガベージ・コレクションが独立したスレッドとして定期的に動作しています。ガベージ・コレクションが動作する頻度は、JVMのヒープ・サイズやヒープに対する需要、その他のさまざまな要因によって変化します。

出典 https://atmarkit.itmedia.co.jp/ait/articles/0502/25/news123.html#:~:text=Java%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AF%E3%80%81Java%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88,%E3%83%BB%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8D%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82

### ヒープとは？
　Javaプログラムの実行中には、Javaオブジェクトが生成されます。Javaオブジェクトは、Javaプログラムの起動時に生成される場合もあれば、実行中に必要に応じて生成されることもあります。いずれの場合も、JVMの内部で新しいJavaオブジェクトが作成されると、```「ヒープ」と呼ばれるメモリ領域```に、```同オブジェクトを格納するための領域が割り当てられ```ていきます。
出典 https://atmarkit.itmedia.co.jp/ait/articles/0502/25/news123.html#:~:text=Java%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%AF%E3%80%81Java%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88,%E3%83%BB%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8D%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82

# 出典 
https://gihyo.jp/book/2022/978-4-297-12375-8

https://gihyo.jp/book/2020/978-4-297-11781-8
Renチラ裏ブックマーク集

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-8MMLTEKL70"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'G-8MMLTEKL70');
</script>


・数奇な運命を辿った愛すべき変人【中田敦彦のYouTube大学】
　　https://www.youtube.com/watch?v=wy_L2CS4aXE
・天才ニコラ・テスラの驚きの生活【まりんぬ】
　　https://www.youtube.com/watch?v=dOnwcMVtUBU
・中国が日本を追い抜いてアニメ大国になる理由がヤバい【オタキックス】
　　https://www.youtube.com/watch?v=cWHVvnOSRAI
・優秀な学生ほど●●が殆どないんです。【サイコパスおじさん】
　　https://www.youtube.com/watch?v=zm55t4WHcFw
・スマホは「持っているだけ」でバカになる！精神医学最前線『スマホ脳』【岡田斗司夫】
　　https://www.youtube.com/watch?v=yEBPWip16TM
・13歳の数学者が新定理を発見！2歳で九九を暗記…卓越した才能の素顔とは【ABEMAニュース】
　　https://www.youtube.com/watch?v=-VLN8EprtDg
・日本アニメ界は面白さよりも●●重視。アニメがつまらないのは「あなたのせい」【岡田斗司夫セミナー】
　　https://www.youtube.com/watch?v=nnDsyze1Vag
Azure Cache for Redis って何？

# プロローグ

**ほげ君**：ねえねえ、 Azure Cache for Redis って知ってる？
**ふが君**：何それ？知らない。
**ほげ君**：僕も知らないんでよね！どんなものなのか教えてよ、 Microsoft 公式ドキュメント君！
**公式ドキュメント君**：分かりました。





# Cache for Redis 概要
**公式ドキュメント君**：Azure Cache for Redis は、Redis ソフトウェアを基にしたインメモリ データ ストアを提供します。 Redis は、バックエンドでデータ ストアを酷使するアプリケーションのパフォーマンスとスケーラビリティを高めます。 高速に読み書きできるサーバーのメモリ内にアクセス頻度の高いデータを維持することで、大量のアプリケーション要求を処理することができます。 Redis によって、きわめて低遅延かつ高スループットのデータ ストレージ ソリューションがモダン アプリケーションにもたらされます。

**ほげ君**：まず、Redis ってなんだ？
**ふが君**：確か、SQLじゃないデータベースの一種だったと思う。
**ほげ君**：ふむ。で、Azure Cache for Redis は何？
**ふが君**：この説明じゃよくわかんないね。もっと詳しく教えてよ。

**公式ドキュメント君**：Azure Cache for Redis は、Redis のオープン ソース (OSS Redis) と、マネージド サービスとしての Redis Inc. (Redis Enterprise) の商用製品の両方を提供します。 安全かつ専用の Redis サーバー インスタンスを提供し、Redis API との完全な互換性を備えています。 このサービスは、Microsoft で管理されており、Azure 上でホストされ、Azure 内外の任意のアプリケーションから使用できます。

**ほげ君**：は？意味わかん。
**ふが君**：Microsoft が管理している Redis データベースってことかな。
**ほげ君**：具体的に何ができるんだ？
**ふが君**：多分Redisは特定の形式のデータを高速で処理できるデータベースなんじゃないかな。それをMicrosoftがバージョン管理とかしてくれるから、ユーザはただデータを書き込んだり、読み取ったり、機能を使うことに集中できるって感じかな。
**ほげ君**：Azure SQL Database の Redis 版ってことか。
**ふが君**：これ以上を知るにはRedis自体を知る必要がありそうだね。
**ほげ君**：そこまで深く知るのはまた今度でいいや。腹減ったし、うどん食いに行こうぜ。
**ふが君**：いいね。