OmniAICreator/Qiita-1.07M huggingface dataset:
Power Apps コマンドバーが新しくなる？

Power Apps Studio のコマンドバーがプレビュー状態になるパターンが増えてきたようなので、歴史の断片として簡単に記事にしておきます。

# メニューバー？コマンドバー？
Excel 等は画面上部に表示される機能群は「メニューバー」という呼称ですが、Power Apps Studio では画面上部の機能群は「コマンドバー」が正式名称みたいですね。

https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/power-apps-studio?WT.mc_id=BA-MVP-5004053

勉強会のセッション中にやってるデモ等で「メニューバーから〇〇をクリックして追加でー」とか言ってる気がする自分...。気を付けます（汗

# モダンコマンドバー
前述の公式ドキュメントに記載ありますが Power Apps Studio を新規作成で開くと、記事投稿時点（2022/09/24）でプレビューのコマンドバーで表示される環境が増えてきました。

・モダンコマンドバーイメージ
![モダンコマンドバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/bc8e3664-f3d3-d7c8-d6f9-ca475959d9cd.png)


細かい説明は公式サイトを参照いただくとして、［ホーム］や［挿入］などの項目が無くなって、シュッとした感じになってます。保存が右端に移動していたり、大幅な変更になっています。突然、新しい画面になるとビックリしますよね。

# 以前のコマンドバーに戻す方法
コマンドバーで［設定］→ ［近日公開の機能］から「モダン コマンド バーを有効にする」のトグルを”オフ”にすると以前の状態に変更できます。

・以前のコマンドバーに戻す手順（2022/09/25 時点
![ON-OFF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/a1c6a45b-a154-6d78-4aed-2f480e6876f0.png)

・以前のコマンドバー画面
![旧コマンドバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215892/b069b1d6-1f06-e6d9-6127-857761b4986c.png)

見慣れた画面に戻ります。このコマンドバーで作成していたアプリは、記事投稿時点ではコチラのコマンドバーで表示されています。今後はどうなるか？不明ですが、現状は以前のアプリは以前の編集画面、って感じですね。

# 結び
記事投稿時点の 2022/09/24 時点の断片として記事にしてみました。繰り返しになっちゃいますが、突然新しい画面になるとビックリしますよねー。


モダンコマンドバーはプレビューなので、今後も変更が発生する可能性があります。GA（一般公開）されたタイミングで、以前のコマンドバーが利用できるのか？も明記されていません。おそらく、今後はモダンコマンドバーが基本になっていくと想定されますので、そちらに慣れていくのが良いのでしょうねぇ。自分も早く慣れるようにしなきゃです。

それでは、皆さま。素晴らしい Power Platform Life を！
Dockerfile基礎

## 事前知識
https://qiita.com/ryome/items/240f36923f5cb989da27

https://qiita.com/ryome/items/4b6b934b1b2021acfa26

https://qiita.com/ryome/items/6e59dcbe4735d45d58a3

## Dockerfileとは
- Dockerfileとは、コンテナイメージを作成するためのファイル。
- コンテナを作成する際にベースになる環境や実行するコマンド、配置するファイル等が記載されている。
- Dockerfileで作成したDockerイメージを[Docker Hub](https://hub.docker.com)に投稿することなども可能。

![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/83243f24-d817-42c6-ec7e-8ef1b78e41a6.png)

## Dockerfile作成
- `FROM`：ベースとなるイメージ
- `USER`：ユーザ名を変更
- `RUN`：実行するコマンド
- `ENTRYPOINT`：shの実行
- `ENV`:環境変数を設定
- `WORKDIR`：作業ディレクトリを追加
- `COPY`：コンテナにファイルをコピー（リモートも不可、圧縮が解凍されない）
- `ADD`：コンテナにファイルを追加する（リモートも可能、圧縮が解凍される）
- `コメント`：「#」以降の文章はコメントアウトされる

**テンプレート**
```
FROM [コンテナイメージ名]:[タグ名]
USER [ユーザ名]
RUN [コマンド] && [コマンド]...
ENTRYPOINT ["[実行ファイル]", "[パラメータ1]", "[パラメータ2]"... ]
ENV [環境変数名]=[環境変数値]
WORKDIR [作業ディレクトリパス]
COPY [コピー元ファイルパス] [コンテナ上のコピー先ファイルパス]
ADD [コピー元ファイルパス] [コンテナ上のコピー先ファイルパス]
```

**サンプル（書き方例）**
```Dockerfile
# ベースイメージをUbuntuにする
FROM ubuntu
# ユーザをrootにする
USER root
# インストール可能なパッケージを更新する
RUN apt-get update
# vimをインストール
RUN apt-get install -y vim
```

## Dockerfileからコンテナ作成
サンプルのDockerfileを作成し、以下のコマンドを実行する。

- コマンド
```
docker build -t [コンテナイメージ名]:[タグ名] .
docker images
docker run --name [コンテナ名（任意）] -p ローカルポート番号:コンテナポート番号 -e [環境変数の設定] -d [コンテナイメージ名]:[タグ名]
docker ps
docker exec -it [コンテナ名] bash
```

- 実行例
```
$ docker build -t ubuntu-ryome-test:1.0 .
Sending build context to Docker daemon  20.99kB
Step 1/5 : FROM ubuntu
 ---> df5de72bdb3b
Step 2/5 : USER root
 ---> Using cache
 ---> ebf1c14ce73a
Step 3/5 : RUN apt-get update
 ---> Using cache
 ---> 249a45a0e06f
Step 4/5 : RUN apt-get install -y vim
 ---> Using cache
 ---> 9f5a1b628f90
Step 5/5 : COPY test.txt /
 ---> 29416a0ce55d
Successfully built 29416a0ce55d
Successfully tagged ubuntu-ryome-test:1.0
$ docker images
REPOSITORY          TAG       IMAGE ID       CREATED         SIZE
ubuntu-ryome-test   1.0       29416a0ce55d   6 seconds ago   173MB
ubuntu              latest    df5de72bdb3b   2 weeks ago     77.8MB
$ docker run --name ubuntu-test -it -d ubuntu-ryome-test:1.0
3b6536d4ac20be2b89d202e57a277ab7357ca31533e23de8218f29c80558042f
$ docker ps
CONTAINER ID   IMAGE                   COMMAND   CREATED          STATUS          PORTS     NAMES
3b6536d4ac20   ubuntu-ryome-test:1.0   "bash"    12 minutes ago   Up 12 minutes             ubuntu-test
$ docker exec -it ubuntu-test bash
root@3b6536d4ac20:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  test.txt  tmp  usr  var
root@3b6536d4ac20:/# vi test.txt
root@3b6536d4ac20:/#
```

## GitHub

GitHubにソースコードを公開しています。

https://github.com/ryomeblog/qiita/tree/master/Dockerfile基礎

## 関連
https://qiita.com/ryome/items/54d23052babda2d88bf6

https://qiita.com/ryome/items/12d8fb5f64acfbdd22e9

https://qiita.com/ryome/items/873938ca6734adec1c11

https://qiita.com/ryome/items/c9fded9da60bce0f0b94
AWS EC2でEC-CUBEを超簡単に構築

# 前提
AWS EC2の1台のみで構築
1台だけなのでネットワーク系の設定は説明を省略します
EC-CUBEは「eccube-4.1.2.zip」を使用、予め/home/ec2-user/配下に保管

## 1. EC2の初期設定
```bin/bash
sudo su -
echo (hostname) > /etc/hostname
timedatectl set-timezone Asia/Tokyo
yum update -y
shutdown -r now
```

## 2. Appacheインストール
```bin/bash
sudo su -
yum install httpd -y
amazon-linux-extras list
amazon-linux-extras install php7.4
php -v
systemctl status httpd
systemctl start httpd
systemctl status httpd
#ブラウザでテストページが表示されることを確認
```
## 3. MariaDBインストール
```bin/bash
###パスワード、ユーザ名などは任意のものを使用すること
yum install -y mariadb mariadb-server
systemctl status mariadb
systemctl start mariadb
systemctl status mariadb
mysql_secure_installation
#パスワード設定など
mysql -uroot -p
>show databases;
>show tables from mysql;
>select host,user,password from mysql.user;
>create database eccube;
>show databases;
>grant all privileges on eccube.* to eccube_user@localhost identified by 'password';
>select host,user,password from mysql.user;
>exit
mysql -ueccube_user -ppassowrd
>show databases;
>show tables from eccube;
exit
```

## 4. EC-CUBEコンテンツファイル準備
```bin/bash
cd /var/www/
cp -a /home/ec2-user/eccube-4.1.2.zip ./
ls -l
unzip eccube-4.1.2.zip 
```

## 5. httpd.conf編集
```diff_shell
cd /etc/httpd/conf/
cp httpd.conf httpd.conf-org
vi httpd.conf
diff httpd.conf-org httpd.conf

- DocumentRoot "/var/www/html"
+ DocumentRoot "/var/www/ec-cube"

-  <Directory "/var/www">
-      AllowOverride None
+  <Directory "/var/www/ec-cube">
+      AllowOverride All

systemctl restart httpd
yum install -y php-pgsql php-pdo php-phar php-mbstring php-zlib php-ctype php-session php-json php-xml php-libxml openssl php-zip curl php-fileinfo php-intl
systemctl restart httpd
```
## 6. ブラウザで表示確認、GUI設定へ
GUI設定が完了すれば使用可能

#### 6.1 「mod_rewriteが有効になっているか不明です」と表示される場合
念の為確認
mod_rewriteはhttpd.confがec-cube/.htaccessで設定するもの。

```bash
cat httpd.conf | grep mod_rewrite
# 表示結果なし

cat ec-cube/.htaccess | grep mod_rewrite
 <IfModule mod_rewrite.c>

less ec-cube/.htaccess 
 RewriteEngine On
```

有効になっていることが確認できたので画面のメッセージは無視して大丈夫でした。
SHARP Brain に Linux を入れて遊ぶ(2) - フレームバッファ

[目次](https://qiita.com/nekopro2/items/7eff2eb5e1c4480d3b30)
# 概要
[その1](https://qiita.com/nekopro2/items/1a2b84e9b66d19a6c633) で Linux が動いたので、画面周りを見ていこう。

# 画面周り
## /dev/fb0
/dev/fb0 が存在するので、これを取得してみる。
~~~ 
user@brain:~$ cat /dev/fb0 > fb0.dat
user@brain:~$ ls -ls
total 756
752 -rw-r--r-- 1 user user 768000 Aug  7 19:44 fb0.dat
  4 drwxrwxr-x 2 user user   4096 Aug  7 19:03 lxterminal
user@brain:~$
~~~
768,000 バイトなので 800x480x16bpp ですね、はい。
頭にテキトーな 16bpp BMP ヘッダを付けて確認。
~~~fb.bmp
+00: 42 4D 42 B8 0B 00 00 00 00 00 42 00 00 00 28 00
+10: 00 00 20 03 00 00 20 FE FF FF 01 00 10 00 03 00
+20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
+30: 00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
+40: 00 00
~~~
フレームバッファの内容
![fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/c3948328-8729-e2a4-77c7-fa74ec9066e5.png)

## フレームバッファの情報を取得
ちょちょいとコードを書いて確認する。
~~~cpp:fb.c
#include <linux/fb.h>
#include <stdio.h>
#include <sys/fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main()
{
  const int fd = open("/dev/fb0", O_RDWR);
  if (fd != -1)
  {
    struct fb_var_screeninfo si;
    ioctl(fd, FBIOGET_VSCREENINFO, &si);
    printf("%d x %d x %dbpp\n", si.xres_virtual, si.yres_virtual, si.bits_per_pixel);
    close(fd);
  }
  return 0;
}
~~~

結果
~~~
user@brain:~/work$ gcc fb.c
user@brain:~/work$ ./a.out
800 x 480 x 16bpp
user@brain:~/work$
~~~

## フレームバッファに書き込む
マップトファイルで画面をクリアしてみる。
~~~cpp:fb2.c
#include <memory.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <linux/fb.h>
#include <linux/omapfb.h>

int main()
{
  const int fd = open("/dev/fb0", O_RDWR);
  if (fd != -1)
  {
    uint16_t* p = (uint16_t*)mmap(NULL, 800 * 480 * 2, PROT_WRITE, MAP_SHARED, fd, 0);
    if (p)
    {
      memset(p, 0, 800 * 480 * 2);
    }
    close(fd);
  }
  return 0;
}
~~~
動作OK。これで色々遊べそうだ。
SHARP Brain に Linux を入れて遊ぶ

# 概要
[KINGJIM pomera](https://www.kingjim.co.jp/pomera/) は お高くて買えない。
ならば 古い [SHARP Brain](https://jp.sharp/edictionary/) を[ヤフオク](https://auctions.yahoo.co.jp/category/list/2084062311/)で落として [Linux brainux](https://brainux.org/) を入れてみよう。

# 目次
1. [SHARP Brain に Linux を入れて遊ぶ(1)](https://qiita.com/nekopro2/items/1a2b84e9b66d19a6c633)
   - とりあえず Brainux をインストールしてみる
1. [SHARP Brain に Linux を入れて遊ぶ(2)](https://qiita.com/nekopro2/items/379b2894cf9b1ea5d26f)
   - フレームバッファを操作する
   - [Windowsでもフレームバッファ(をシミュレート)したい](https://qiita.com/nekopro2/items/5722a2a79f7851cf052c)
1. [SHARP Brain に Linux を入れて遊ぶ(3)](https://qiita.com/nekopro2/items/b30403b5e1e53e58349d)
   - フレームバッファの内容をBMPで保存する
1. [SHARP Brain に Linux を入れて遊ぶ(4)](https://qiita.com/nekopro2/items/25febdb8cb6d079876c2)
   - ログ メッセージとカーソルの抑制
1. [SHARP Brain に Linux を入れて遊ぶ(5)](https://qiita.com/nekopro2/items/41bda2d6ce30fa594707)
   - FTDI D2xx でのシリアル通信
1. [SHARP Brain に Linux を入れて遊ぶ(6)](https://qiita.com/nekopro2/items/36c2589242fb1e4ca069)
   - キーボード/タッチパネル
1. [SHARP Brain に Linux を入れて遊ぶ(7)](https://qiita.com/nekopro2/items/d13b61de47f9f5f0a290)
   - アセンブラ
MacにデフォルトでPHPがインストールされなくなったのでdockerを使ってサクッとPHPを実行できるようにしてみた。

# その時PHPerに電流走る・・・!!

```
zsh: command not found: php
```
昨日まで使えていたPHP・・・俺たちのPHPが・・・

なんて少し前からMacOSにデフォルトで入っていたPHPが使えなくなることは界隈では
ちょくちょく耳にしていたのでさほど驚きはしませんでしたが、Montereyアップデート後からぬるりとなくなっていたので笑いました。

直接PHPをインストールしてもいいですが、母艦の環境を汚したくない民として今回はdockerとzshのエイリアスでサクッとPHPを実行できるようにしてみました。
よければ参考にしてください。
下記のような形でPHPが実行できるようになります。

```
$ dphp xxxx.php
```

## dockerイメージをpull

docker hubから最新のPHPのイメージをpullします。
```
$ docker pull php
$ docker image ls
php                                   latest    7c7914343522   11 days ago      446MB
```

## 関数を追加

下記を.zshrcに追記します。
commandをつけないと自らを再帰的に実行してしまうみたいなので忘れずに付けましょう。
関数名がそのままコマンド名になります。
docker + php でdphpにしています。

```zsh:~/.zshrc
function dphp() {
  command docker run  --rm  -v ${PWD}:/src/ php bash -c "cd /src && php $1"
}
```

## 帰ってこい！俺たちのPHP!!!

zshをリスタートしてコマンドが通るか試してみます。

```
$ zsh
$ dphp -v
PHP 8.1.10 (cli) (built: Sep 13 2022 10:30:01) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.10, Copyright (c) Zend Technologies
```
おおお！ちゃんとそれっぽく実行できています。

## phpファイルの実行

ちょうどいいいところにサンプルのPHPがあったので下記を実行してみます。

```php:test.php
<?php
echo "いいねください！！！";
```

```
$ dphp test.php
> いいねください！！！
```

以上です。
dockerやphpやシェルに詳しい方ならもっといい方法とかご存じだと思いますのでよかったらコメントで教えてください！
開発中にファイル名を変更した際にはgit mvコマンドを使う

はじめに
--
gitを使って開発している時にファイル名を変更する必要が出てきました。
そういえば、途中でファイル名を変更したらgitの履歴とかどうなっちゃうの？という疑問が生まれたので調べました。
備忘録として残そうと思います。

ローカルで名前を変えただけだとどうなるのか
--
現在開発中のUserDeleteのファイルを試しにUserDeletに変更し、git statusで確認したところ、
UserDelete.tsxは削除され、UserDelet.tsxがgitで追跡できていません、という扱いになっていました。

~~~
~ % git status                                            
On branch <ブランチ名>
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
	deleted:    frontend/app/src/components/pages/UserDelete.tsx

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	frontend/app/src/components/pages/UserDelet.tsx
~~~

ファイル名で判別していると考えるとそりゃそうなるか、と思いました。

"git mv"コマンドでファイル名を変える
--
それならどうするかというと、ファイル名を変えたことを"git mv"コマンドでgitに教えてあげる必要があるみたいです。

~~~
git mv 変更前のファイル名 変更後のファイル名
~~~

何も知らずにファイル名を変えて、git statusで削除された扱いになっていたらビビりますがこれでもう大丈夫ですね！

参考
--
https://tenyo-ten.hatenablog.com/entry/2016/09/30/095213
ABC 270 回答メモ

0.はじめに
　全体的に難易度が高く感じました。
　苦手問題を避けても、他の問題ができるわけでもなく
　勝手にノルマと定めている3問クリアも達成できませんでした。

1.A - 1-2-4 Test
　パッとみ、なにか簡単な解法がありそうな気がするも
　愚直に場合分けしたコーディングし、クリア。
　50行の大作になったけど、解説見たら2行で終わってて
　悲しくなりました。

　https://atcoder.jp/contests/abc270/submissions/35096458

2.B - Hammer
　大変てこずりました。
　初めに、愚直に場合分けすればいけるやろと、場合分けして
　提出したのですが、数例**WA**に。
　仕切り直して、まず、ゴールが正負で場合分けしていたのを
　最初にゴールが負の場合X,Y,Zにー1をかけてゴールは正に寄せました。

　結局、あーだこーだやっててダメなポイントに気づきました。
```python:
if(Y>X and Y<0):
```
　ゴール(X)の前に壁がない事の判定で、
　上記のように書いていたのですが、Y<0がすべて含まれるので
　動作がおかしくなってました・・・。
```python:
if(Y>X):
    print(X)
elif(Y<0):
    print(X)
```
　分かりやすくしっかり分けて、合格になりました。

　https://atcoder.jp/contests/abc270/submissions/35116421

3.C - Simple path
　深さ優先探索的なことをしないといけないのかなと思ってとりあえず放置。
　後日復習を誓う。


4.D - Stones
　単純に一番多く取れるようなロジックで試したらWA。
　おそらく
　N=27 K=3
　A＝1 9 10
　みたいな時に、初手１０だと、14しかとれないけど
　初手9にすれば、18行ける。
　みたいにDPしないといけないんじゃないかな。
　
5.E - Apple Baskets on Circle
　TLE覚悟で単純にループして1個ずつ取っていこうとしたら
　例題すらTLE.
　平均値を引いて行って・・・とか試行錯誤するも
　時間切れ。

余裕があったらC問題以降も解きたいと思った次第です。
【Houdini】四角形の各ポイントのノーマルをエッジ毎に指定方向へ向ける

モジュールタイプのモデルを組み立てるとき。

Copy To PointsノードとFileノードを組み合わせて、アセットを指定の場所に配置します。
そのとき、ポイントのノーマル方向をエッジ毎に外側に向けたいのですが、意外とそのようなノードがなく、AttributeWranglerで操作しています。

少なくとも自分はよく書くコードなので、メモとして残しておこうと思いました。


```.js
v@max_size = getbbox_max(0);
v@min_size = getbbox_min(0);
if(@P.x == @max_size.x)
{
    @N.x = 1;
}
if(@P.z == @max_size.z)
{
    @N.z = 1;    
}
if(@P.x == @min_size.x)
{
    @N.x = -1;
}
if(@P.z == @min_size.z)
{
    @N.z = -1;
}
@N.y = 0;
```

|||
|---|---|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256717/9add8691-0552-9f4f-becd-b9aeb62ddc23.png)|このような四角形があります。|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256717/f7dbaa54-c41f-ba26-b48e-1bc029d1e006.png)|何もせずCopyToPointsノードを使うと、向きがバラバラです。|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256717/2c2f9157-56ab-94e3-5aec-7ea40e175372.png)|Attribute Wranglerノードで上述のスクリプトを実行。ノーマルが四角の外側を向くように。|
|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256717/2642cb90-ba24-4e13-48f2-ae5607903479.png)|これで綺麗に並びます！|
Oracle RAC とは

## 勉強前イメージ

oracleのなにかのやつ？？
RACがわからん・・・

## 調査

### Oracle RAC とは

Oracle Real Application Clusters の略で、ラックとも呼ばれています。
ロードバランスのクラスタをoracleデータベースで実現する拡張方式のことを指します。
すべてのノードがアクティブでノードが常に同一のデータベースにアクセスすることが出来ます。

### Oracle RAC の特徴

- 可用性

複数サーバで一つのデータベースとして稼働しています。
その為、サーバが1台故障したとしても他のサーバに処理を引き継ぐため、サービスを継続させることが出来ます。

- 負荷分散

クラスタ構成のため、複数のサーバでデータベースは稼働してます。
来たアクセスを複数のサーバに振り分けるため負荷分散ができ
アクセスが増えた場合でも分散することでシステムのダウンを防ぐことができます。

- 拡張性

最初はスモールスタートで始めたとしても
データ容量や接続状況を確認しながらサーバを停止することなく増減したりすることが出来ます。

## 勉強後イメージ

oracleもクラスタ構成組むことできるんだ・・・
どこのDBでも似たような構成でくめるのね

## 参考

- [Oracle RACを理解する！初心者でも分かる特徴、登場時期、評価などを簡単に解説！](https://anken-hyouban.com/blog/2021/01/11/oracle-rac/)
- [Oracle Real Applications Clusters（RAC）とは？特徴や基本構造をわかりやすく解説！](https://solutions.system-exe.co.jp/oracle-cloud/blog/what-is-oracle-real-applications-clusters)
Amazon Comprehend とは

## 勉強前イメージ

Comprehendって理解するって感じ？だから・・・
理解して概要とか議事録とか作ってくれるのかな

## 調査

### Amazon Comprehend とは

機械学習を使用してテキスト内のインサイトや関係性を検出できる自然言語処理(NLP)のサービスになります。
キーフレーズ抽出、実態認識など利用できます。
他のアプリケーションと連携させることも出来ます。

### Amazon Comprehend の機能

- キーフレーズ抽出

文章の中のキーフレーズやポイントを表します。
検索キーワードとしても使えるかもしれません。

- 感情抽出

文章全体的な感情を表します。
肯定的な文章か、または否定的な文章化ほかにも混在しているのか見ることが出来ます。
レビューの書いた人の感情の数値化をしてくれます。

- 構文分析

文章の単語の境目を定義して、関連する品詞にラベル付をします。
難しい文章でも読み解きやすくなります。

- エンティティ認識

テキスト内にある場所や位置、人などカウントをして信頼スコアを返します。
この文章内でどれだけその単語が使われたかなど正確にカウントすることが出来ます。

- 言語検索

テキストを解析して主要言語とスコアを表示します。

## 勉強後イメージ

機械学習あまり知らないけど
Amazon Translate と連携して
Comprehend → 言語を認識
Translate → 言語を翻訳
みたいなことができるらしい。。。

## 参考

- [Amazon Comprehendとは](https://www.acrovision.jp/service/aws/?p=1082)
Python3エンジニア認定基礎試験に出てきそうな関数とメソッド

Python3エンジニア認定基礎試験に出てきそうな関数をまとめました。
# range()
* 引数に指定した数の一つ前まで、0から連番で要素が入る。
* ○〜○までの整数を取得することもできる。
```
3~29までの数字
>>> x = list(range(3,30))
>>> print(x)
[3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
```
# count()
* リストの中に指定の要素が何回登場したかを数える。
# len()
* リストの全要素数をカウントする。
# round()
* 小数点を四捨五入する（厳密には四捨五入ではない）。roundだから、小数点を丸める的なニュアンス。
```Python
>>> round(123.5)
124
>>> round(124.5)
124
```
# zip()
* 2つ以上あるリスト、辞書、タプルをまとめることができる。
```Python
>>> a = [1,2,3]
>>> b = ['a', 'b', 'c']
>>> for a0, b0 in zip(a, b):
...   print(a0, b0)
... 
1 a
2 b
3 c
```
# list()
* リストを作成する。
```Python
>>> list('abc')
['a', 'b', 'c']
```
# format()
* ()に引数を入れて、それをprint内で波カッコを記述することで引数を呼び出せる。
```Python
>>> print('Hello!{}'.format('World!'))
Hello!World!
```
# remove()
* 値を指定して要素を削除する。同じ値を持つ要素が複数ある場合は最初の1個が削除される。
```Python
>>> a = [1, 2, 3, 4, 3, 5]
>>> a.remove(3)
>>> print(a)
[1, 2, 4, 3, 5]
```
# keys()
* 辞書に含まれる全てのキーを取得する
# values()
* 辞書に含まれる全ての値を取得する
# items()
* 辞書に含まれる全てのキーと値の組み合わせを取得する
[Git] いいかげん理解したいgit reset ~ addの取り消し、commitの取り消し

人間はaddやcommitした直後に間違い発見能力が爆上がりするため、しばしばそれを取り消したくなります。いつもコマンドを打つたびにググっている気がするので、いいかげん覚えるためによく使うコマンドをきちんと調べ、理解し、まとめようと思います。
間違いがあったら教えていただけると嬉しいです。

## 前提知識
- ワークツリー  ... git管理下で実際に作業しているディレクトリのこと。`git add`する前はここにあるイメージ。
- インデックス ... リポジトリにコミットする準備をするための場所のこと。`git add`したらここに移るイメージ。
- リポジトリ　   ... ファイルやディレクトリの状態を記録する場所。`git commit`したらここに移るイメージ。

最低限これらをざっくり理解しておいた方が良いです。qiitaにもまとめている記事がたくさんあると思うので詳しくはググってください。

## addを取り消す
```
$ git reset HEAD
```
> git-reset - Reset current HEAD to the specified state

https://git-scm.com/docs/git-reset

#### そもそもHEADとは何なのか。
HEADとは`今自分が作業している場所を示すポインタ`を表します。

> Usually the HEAD file is a symbolic reference to the branch you’re currently on. 

> However in some rare cases the HEAD file may contain the SHA-1 value of a git object. This happens when you checkout a tag, commit, or remote branch, which puts your repository in "detached HEAD" state.

[10.3 Git Internals - Git References](https://git-scm.com/book/en/v2/Git-Internals-Git-References)

簡単に意訳すると、`大抵の場合HEADとは現在いるブランチの参照である。たまにタグやコミットなんかをチェックアウトして'detached HEAD'となっているときは最新のコミットは指してないけど。`

ブランチ... それぞれ枝分かれしたコミット連の最新コミットを指すポインタ

つまり`git reset HEAD`とは、**`git add`してインデックスに移ったファイルをHEADの状態（=現在の作業ツリーの状態）にリセットする（=戻す、上書きする）こと**。

[こちらの方の記事](https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa)を見ながらだと理解が捗ると思います。

## commitを取り消す
```
$ git reset --soft HEAD^
```
softもあればhardもある。おまけにmixedもある。
- --soft  ... HEADの位置だけ戻す。
- --mixed ... HEADの位置とインデックスを戻す。もしくはオプションなしの場合はこれ（=addの取り消しはこれを使っている）。
- --hard  ... HEADの位置とインデックスとワーキングツリーを戻す。要は変更を全くなかったことにする。

つまり上のコマンドは`HEADの位置をHEAD^に戻す`ということになる。commitするとHEADの位置が最新のcommitに移るので、それを元に戻すということになる。ということは`HEAD^`はひとつ前のcommitを指す。状態としては`add`までした時点に戻ることになります。

ちなみに^(キャレット)と似たように~(チルダ)がHEADにくっつく(HEAD~)こともありますが、それに関しては[こちらの方の記事](https://qiita.com/chihiro/items/d551c14cb9764454e0b9)が参考になります。今回commitを取り消すのは、ローカル作業中で親コミットが1つしかない場合を想定しているので、`HEAD^`も`HEAD~`も同じ意味になります。

## おまけ git add する前の変更を取り消す
`git add`もしていない変更をワーキングツリーから削除するには
```
$ git restore ファイル名
```
以前は`$ git checkout -- ファイル名`を使っていましたが、新しく`restore`ができたのでそちらを使う方が操作間違いが起こりにくいと思います。
Tweepy(v4.8.0)でユーザのプロフィール欄の取得方法がわからなかったのでTwitterAPIを直接叩いて取得する

# はじめに
ほぼ備忘録的なものですが、他に困ってる方がいるかもしれないので、一応残しておきます。

当方の手元の環境の`tweepy`のバージョンは`4.8.0`です。

```sh
!pip list | grep tweepy
# tweepy                     4.8.0
```

私のTwitterのプロフィール欄「自然言語処理を主に...」って文章を取ることを目指します。

![スクリーンショット 2022-09-24 23.06.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240999/7ff4f97f-d434-5cbf-45b2-1a12c16f67d5.png)


# `tweepy`の`get_user`を使って`user id`を取得する

TwitterAPIを叩くときにユーザIDがいるのですが、ユーザIDは`tweepy`で`get_user`を使って取得します。
`get_user`の引数に必要な`username`はTwitterアカウントの@以降の文字列を指定します。

- [client.get_userのリファレンスはこちら](https://docs.tweepy.org/en/stable/client.html#tweepy.Client.get_user)

```python
import tweepy

# 認証に必要なキーとトークン
# 環境変数として設定してます。
BEARER_TOKEN = os.getenv('TW_BEARER_TOKEN')
API_KEY = os.getenv('TW_API_KEY')
API_SECRET = os.getenv('TW_API_SECRET')
ACCESS_TOKEN = os.getenv('TW_ACCESS_TOKEN')
ACCESS_TOKEN_SECRET = os.getenv('TW_ACCESS_TOKEN_SECRET')

client = tweepy.Client(bearer_token=BEARER_TOKEN,
                       consumer_key=API_KEY,
                       consumer_secret=API_SECRET,
                       access_token=ACCESS_TOKEN,
                       access_token_secret=ACCESS_TOKEN_SECRET
                      )

user_result = client.get_user(username='m_k_696')
user_result.data
# <User id=947117893757448197 name=m__k username=m_k_696>
```

私のユーザIDは`947117893757448197`であることがわかりました。

この`get_user`にも引数として`user_fields`が指定できるのですが、こちらで`description`を指定してもプロフィール欄が取得できないんですよねぇ。どっかが間違ってるのだろうか。。。

- [`user_fields`で指定できるパラメータ一覧](https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/user)

```python
user_result = client.get_user(username='m_k_696', user_fields='description')
user_result
# Response(data=<User id=947117893757448197 name=m__k username=m_k_696>, includes={}, errors=[], meta={})
# ↑ プロフィール欄の情報が取得できてない
```

# TwitterAPIを直接叩いてプロフィール欄を取得する

せっかくなのでpythonからTwitterAPIを叩こうと思います。`subprocess`を使って以下のようにTwitterAPIを実行すれば簡単にプロフィール欄を取得できました。

```python
import subprocess

user_result = subprocess.run([
    'curl',
    f'https://api.twitter.com/2/users?ids=947117893757448197&user.fields=description',
    '-H',
    f'Authorization: Bearer {BEARER_TOKEN}'
], capture_output=True, text=True).stdout
user_result = eval(user_result)
user_result
# {'data': [{'name': 'm__k',
#  'description': '自然言語処理を主に勉強しており、Qiitaに実装重視で初学者にもわかりやすくをモットーに記事を投稿しています。Twitterでも読んだ論文や実装における細かなTipsとかをつぶやいたりしています。',
#  'id': '947117893757448197',
#  'username': 'm_k_696'}]}
```

無事にプロフィール欄の情報が取れました。

おわり
Redshift Serverlessの使用制限を使ってみた

Redshift Serverlessの使いすぎを防ぐべく、使用制限を使って利用料の監視をしました。
1日あたり$2以上使った場合はSNSトピックに通知するという設定をして、動作確認をしてみました。

## 使用制限の設定
マネジメントコンソールで設定する場合、Amazon Redshift サーバーレス→ワークグループの設定→ワークグループ名→制限→使用制限を管理→Redshift 処理ユニット (RPU) の最大数→制限を追加から設定します。
設定画面で入力するのは以下4点です。

* 頻度：どのスパンで利用料を計算するか指定します。[毎日/ 毎週 / 毎月]から選択します。
* 使用制限 (時間)：RPU hourの閾値を入力します。計算方法は後ほど記載します。
* アクション：閾値を超えた場合のアクションを指定します。[アラート / システムテーブルへのログ / ユーザークエリを無効にする]のいずれかから選択します。
* SNSトピック：アクションで[アラート / ユーザークエリを無効にする]のどちらかを選択した場合、通知先を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/606379d3-d518-24e5-01c4-7c7ee7abd5a6.png)

設定を保存するとこのように制限IDが発行され、裏ではCloudWatchアラームが作成されていました。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/3f1a11d7-7c97-889f-ef4a-6d4d2bf5e307.png)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/185e5794-cf8f-b121-ae05-5f1066bc85ba.png)


## 閾値の計算方法
### 前提条件
* 今回検証に利用するRedshift ServerlessのベースRPU容量は128
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/2a362255-4648-ea3e-4853-1b3c1e42267f.png)
* Redshift Serverlessの東京リージョンの利用料は$0.494(RPU hour)
* $2以上使ったらアラートを飛ばしたい

### 60秒以内のクエリ1回あたりの料金
* Serverlessの1秒あたりの料金： 0.494(RPU hour) / 60 / 60 * 128 = $0.01756444
* **クエリは60秒未満は切り上げ**のため、1回あたり60秒とする。
* 0.01756444 * 60 = $1.05386667

### 金額から閾値(使用制限 (時間))を計算する
x (RPU hour) * 0.494 (USD/RPU hour) = 2 (USD)
x = 4.048584(RPU hour)

ただし、**使用制限 (時間)には整数しか指定できない**ので、4と設定します。

## 通知が来るか確認する
Redshift Serverlessで`select 1`を2回実行してみます。
`select 1`はシンプルなクエリで60秒以内に実行できるので1回あたり約$1です。2回実行すれば通知が来るはずです。

1回目を実行して5分ほど待ったらCloudWatchアラームのグラフがこのようになっていました。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/6405ad70-4340-72a9-3e50-b8dca7351b11.png)

1回目のクエリから5分ほど間をあけて2回目実行したところ、UsageLimitAvailableが0になり、無事SNSトピックのサブスクリプションに含まれるメールアドレスに通知が来ました！
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/335d71ba-5aaa-1348-724d-99bad209b463.png)
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/ef076467-5bea-686c-0901-ccf4bb9a9268.png)

## おまけ
クエリを実行した時間帯のリソースのモニタリングがどうなっているかも確認しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/737471fe-d19b-7640-59ee-fcd943123ae9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398131/a0738a5b-9c0a-cf26-de36-5bb607430302.png)
【IIS】aspnet_filter.dllのLoadLibraryExの呼び出しに失敗しましたエラー対応

# はじめに
自社開発ASP.NETアプリケーションの社外レビューの準備をしようとしたら、下記エラーで動かなくなりました。

HTTP エラー 500.0 - Internal Server Error
ISAPI フィルター "C:\Windows\Microsoft.NET\Framework\v4.0.30319\\aspnet_filter.dll" での LoadLibraryEx の呼び出しに失敗しました。

最近まで問題なく動作していたはずなのに何があったんだろう、そういえば同僚がWindowsパッチの検証をしていたことを思い出しました。

https://qiita.com/yaju/items/4247d12fed7167be9d21

なんとかしないことには社外レビューが出来ません。

# 調査
同じIISを使用している他サイトのアプリケーションではエラーがなくて動作しています。
サイト上のASP.NETが悪さしているのかと思い、単純なHTMLページを作成してみたのですが同じエラーになります。

エラー名で検索すると下記サイトが見つかりました。

>IISマネージャーの「アプリケーションプールの既定値」にある「32bitアプリケーションの有効化」を
「True」に変更したところ、エラーが消え、ページが表示されるようになりました。
* [IIS7.5のエラー Microsoft.NET Framework v4.0.30319 aspnet_filter.dll](https://answers.microsoft.com/ja-jp/windows/forum/all/iis75%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC/6dd942e1-762b-460a-adc3-5652b6d2547c)
* [Calling LoadLibraryEx on ISAPI filter failed (v4.0.30319)](https://serverfault.com/questions/337683/calling-loadlibraryex-on-isapi-filter-failed-v4-0-30319)

この通りに「アプリケーションプールの既定値」にある「32bitアプリケーションの有効化」を「True」に変更したら、確かにエラーなく動作するようになりました。確かに他サイトのアプリケーションではClassic ASPを動かす仕組み上「32bitアプリケーションの有効化」を「True」にしていました。

しかし、今回のASP.NETアプリケーションは64bitのまま動作させたいので、もう少し原因を追求することにしました。

## ISAPI フィルター
IISの機能を追加する際に「ISAPI フィルター」にチェックを付けたものの、今回調査するまで何に使うのか理解していませんでした。

>ISAPI フィルタは IIS の内部処理を横取りしてIISをカスタマイズすることを可能とするための API です。
>HTTP 圧縮 ・ SSL 等の機能は ISAPI フィルタで実装されている

https://www.keicode.com/iis/iis-isapi-filter-overview.php

現在のIISの「ISAPI フィルター」は下記のようになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/a5b4c5f8-33f1-a04e-f796-19468cf5fd1d.png)
同じ構成の別サーバーのIISの「ISAPI フィルター」は下記のようになっていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14053/7fa21604-d46f-69aa-4af1-58d7ca2b5eb7.png)
おやおや、登録数が違いますね。

# 原因
なぜ、aspnet_filter.dllのLoadLibraryExの呼び出しに失敗したのか、「32bitアプリケーションの有効化」を「True」に変更したら動作するようになったのか理由が分かりました。

Windowsパッチを当てたのが原因かが不明ですが、「ISAPI フィルター」の登録内容が書き変わってしまったことだけは確かです。ASP.NET 4の32bit版のISAPI フィルターのみが登録されていたので32bitを有効化すれば動作し、64bit版は未登録なのでLoadLibraryExの呼び出しに失敗するわけです。

後日、別サーバーに対象のWindowsパッチを幾つか当ててみたのですが「ISAPI フィルター」の登録内容は書き変わらなかったです。ただ今回のサーバーは、Windowsパッチを当てる上で色々なことを試してみたりしたようなので何かが悪さしたんでしょうね。

# 対応
理論的に64bit版のISAPI フィルターを登録すれば動作するはずです。それではと登録してIIS再起動してみると、残念ながら同じエラーになります。なんでやねん。

困ったと思いながら、ISAPI フィルターを一旦全部削除してみたら動作しました。
それではと64bit版のISAPI フィルターを登録し直すと動作しました。さらに32bit版のISAPI フィルターを登録し直すと動作しました。

きっと中途半端に「ISAPI フィルター」の登録内容が書き変わってしまったんでしょう。全部削除して作り直したことで正常な状態に戻ったようです。

# 最後に
以前に導入作業で休日出勤していた際、IISのWebサイトがエラーで何も表示されなくなってしまい、設定を何度見直して何もおかしくないしログを見ても分からず、時間ばかりが経っていく状態で退社時間も迫ってきて困りはてて当時の上長に電話で相談したところ、「仮想ディレクトリを削除して作り直してみて」とのアドバイスをもらい、試したところ正常に表示されるようになりました。

## 教訓
:::note info
IISがおかしくなったら、設定が正しくても削除して作り直すといいでしょう。
:::
入出力装置

# RFIDとは？
RFIDとは、```電波を用いてRFタグのデータを非接触で読み書きするシステム```です。バーコードでの運用では、レーザなどでタグを1枚1枚スキャンするのに対し、RFIDの運用では、電波でタグを複数一気にスキャンすることができます。電波が届く範囲であれば、タグが遠くにあっても読み取りが可能です。
出典 https://www.denso-wave.com/ja/adcd/fundamental/rfid/rfid/index.html

RFIDとは、このICタグだけでなくRFIDリーダー等の機器を含めた総称のため、「RFIDタグ」はICタグと同義で使われています。

最近では「RFタグ」と呼ばれることが一般的になってきているようですが、```呼び方が違うだけで全て同じものを指しています```。
出典 https://rfid.tss21.co.jp/knowledge/whatsrfid/basic_tag.html

## ICタグ・RFタグの基本構造
ICタグおよびRFタグは、```ICチップとそれに接続したアンテナで構成```されています。これをインレットと呼びます。

ICタグ・RFタグはインレットのみで使用されることはほとんどなく、用途に応じてさまざまな保護素材で加工することで、ICカードやラベルタグとして利用されます。
出典 https://rfid.tss21.co.jp/knowledge/whatsrfid/basic_tag.html

# タッチパネルとは？
画面に直接触れることにより、コンピュータの操作が行える装置のこと。

# タッチパネルの検出方式
### 抵抗膜方式
　2010年現在、タッチパネル市場で最も多く採用されている検出方式が```「抵抗膜方式」```だ。「感圧式」や「アナログ抵抗膜方式」と呼ばれることも多い。単体の液晶ディスプレイ以外では、スマートフォンや携帯電話、PDA、カーナビ、ニンテンドーDSなど、小型から中型の機器で幅広く採用されている。

### 静電容量方式
抵抗膜方式の次に採用例が多い検出方式が「静電容量方式」だ。前述のアナログ抵抗膜方式に対して、「アナログ容量結合方式」とも呼ばれる。単体の液晶ディスプレイ以外では抵抗膜方式と同様、スマートフォンや携帯電話などに使われることが多い。
この方式では、画面に指で触れると発生する```微弱な電流、つまり静電容量（電荷）の変化をセンサーで感知```し、タッチした位置を把握する。指を画面に近づけると、人体の静電容量にセンサーが反応するため、画面に接触する寸前でポインターを動かすような操作も可能だ。
## 上記以外の検出方式

* 表面型静電容量方式
* 投影型静電容量方式
* 超音波表面弾性波（SAW）方式
* 光学方式（赤外線光学イメージング方式）
* 電磁誘導方式

出典 https://www.eizo.co.jp/eizolibrary/other/itmedia02_08/

# ３Dプリンタとは？
樹脂などを積み上げることで、３次元のオブジェクトを出力する。

## その他の特徴
切削ではなく、熱溶解積層法による造形方式などがあり、方式により素材はさまざま

# 計算問題を解くときに使うもの
1024＝2＾10
これは使える。知らなかった。

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

https://qiita.com/masatom86650860/items/17eef86138ea4d1df82c
KVM ゲスト仮想マシンの肥大化したディスクイメージを最適化する 備忘録

# KVM ゲスト仮想マシンの肥大化したディスクイメージを最適化する 備忘録

【環境】Ubuntu Server 22.04 LTS

ゲスト仮想マシンをシャットダウンします。

```
sudo virsh list --all
 Id   Name     State
-------------------------
 1    vm0      running
 -    vm1      shut off
sudo virsh shutdown vm0
```

ディスクイメージのあるフォルダに移動します。

```
cd /var/lib/libvirt/images/
```

`virt-sparsify`コマンドで肥大化したディスクイメージを最適化します。

```
sudo virt-sparsify vm0.img vm0_new.img
```

新しいディスクイメージのサイズが小さくなりました。

```
-rw------- 1 libvirt-qemu kvm   33G Sep 24 23:32 vm0.qcow2
-rw-r--r-- 1 root         root 8.9G Sep 24 23:43 vm0_new.qcow2
```

新しいディスクイメージのオーナーとパーミッションが、古いディスクイメージと違うので、修正します。

```
sudo chown libvirt-qemu:kvm vm0_new.qcow2
sudo chmod 600 vm0_new.qcow2
```

変更後のオーナーとパーミッション

```
-rw------- 1 libvirt-qemu kvm   33G Sep 24 23:32 vm0.qcow2
-rw------- 1 libvirt-qemu kvm  8.9G Sep 24 23:43 vm0_new.qcow2
```

古いディスクイメージと新しいディスクイメージを入れ替えます。

```
sudo mv vm0.img vm0_old.img
sudo mv vm0_new.img vm0.img
```


ゲスト仮想マシンを起動し、正常に動作すること確認したら、古いディスクイメージを削除します。

```
sudo virsh start vm0
sudo rm vm0_old.img
```

一時ファイルを作成せずに、ディスクイメージを最適化するには、以下のコマンド実行します。

```
sudo virt-sparsify --in-place vm0.img
```
ESP32-CAM開発検証用ボード（動画）

回路についてはまた後日、別の記事にて公開します。

twitterに動画をあげたので参考までにどうぞ

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ESP32-CAMの開発検証用ボード<br>やはり見てもらったほうがいいと思うので<br>回路は後日Qiitaに上げます<a href="https://twitter.com/hashtag/ESP32?src=hash&amp;ref_src=twsrc%5Etfw">#ESP32</a><a href="https://twitter.com/hashtag/ESP32_CAM?src=hash&amp;ref_src=twsrc%5Etfw">#ESP32_CAM</a> <a href="https://t.co/z1Q342Lv7Q">pic.twitter.com/z1Q342Lv7Q</a></p>&mdash; 亀吉 (@by2aE1WOPoBdfLo) <a href="https://twitter.com/by2aE1WOPoBdfLo/status/1573669520744456192?ref_src=twsrc%5Etfw">September 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Androidでの推論実行方法 Python編 【PyTorch】

# 概要

既存のJava製AndroidネイティブアプリにPyTorchベースの推論処理を実装する必要があったので、備忘として調べた結果をまとめます。

1. [PyTorch Java APIで推論処理を記述する](https://qiita.com/ta-sr/items/e9b83743d182dc2a8ed4)
2. Python（Chaquopy）で記述した推論処理を呼び出す（本記事）

# 環境

ハードウェア: SHARP SH-T01
プロセッサ: Snapdragon 665 (2GHz & 1.8GHz - Octa)
メモリ: 4GB
OS: Android 12

# 推論実行方法

推論処理をJavaやC++で書き直すのは大変なので、Pythonで書いた処理をそのまま使いたいという場合、ライブラリ（[Chaquopy](https://chaquo.com/chaquopy/)）を使ってJavaからPythonスクリプトを呼び出すことができます。

※[Kivy](https://kivy.org/#home)などAndroidアプリ全体をPythonで開発するためのライブラリはいくつかありますが、一部の処理のみをPythonで記述するライブラリは執筆時点（2022/09）でおそらくChaquopyだけかと思います。

雑ではありますが、本記事では[matplotlibを呼び出す公式のデモ](https://github.com/chaquo/chaquopy-matplotlib)を元に推論処理を呼び出します。

### 前準備

- AndroidManifest.xmlの更新
学習済みのmodelのダウンロードにインターネットへのアクセスが必要になるため、下記を追加します。パーミッションが足りていないと、`URLError: <urlopen error [Errno 7] No address associated with hostname>`のエラーが発生します。
```XML:AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```


- 依存関係の追加
```gradle:build.gradle(:app)
        python {
            pip {
                install "torch==1.8.1"
                install "torchvision==0.9.1"
            }
        }
```

### 推論処理
`chaquopy-matplotlib/app/src/main/python`配下に以下のスクリプトを追加します。適当なinputに対するforwardの結果を出力します。
```python:inference.py
import torch
import torchvision

def forward():
    model = torchvision.models.mobilenet_v3_small(pretrained=True)
    model.eval()
    value = model.forward(torch.rand(1, 3, 224, 224))
    print(value)
```

### 推論呼び出し
`MainActivity.kt`を下記の通り書き換えます。アプリを起動し、plotボタンを押下すると推論の結果がLogcatに表示されます。

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        if (! Python.isStarted()) {
            Python.start(AndroidPlatform(this))
        }
        val py = Python.getInstance()

        // 以下書き換え
        val module = py.getModule("inference") // スクリプト名

        findViewById<Button>(R.id.button).setOnClickListener {
            try {
                module.callAttr("forward") // 関数名
            } catch (e: PyException) {
                Toast.makeText(this, e.message, Toast.LENGTH_LONG).show()
            }
        }
    }
}
```

# 備考

Chaquopyを使う場合、下記の事項に留意する必要があります。
- 対応しているPythonやライブラリのバージョンが最新ではない
    - [執筆時点（2022/09）でPython 3.8.13に対応](https://chaquo.com/chaquopy/chaquopy-version-12-0-0/)
- 主要なライブラリはカバーされているものの、対応していないライブラリがある
>[In our most recent tests, Chaquopy could install over 90% of the top 1000 packages on PyPI.](https://chaquo.com/chaquopy/doc/current/android.html#android-requirements)

Java製Androidネイティブアプリへの追加という制約を考えなければ、Androidアプリ自体をPythonで開発し、そのままPythonで推論を記述することが可能かもしれません。
Androidでの推論実行方法 Java編 【PyTorch】

# 概要

既存のJava製AndroidネイティブアプリにPyTorchベースの推論処理を実装する必要があったので、備忘として調べた結果をまとめます。

1. PyTorch Java APIで推論処理を記述する（本記事）
2. [Python（Chaquopy）で記述した推論処理を呼び出す](https://qiita.com/ta-sr/items/984779da293432f58ee1)

# 環境

ハードウェア: SHARP SH-T01
プロセッサ: Snapdragon 665 (2GHz & 1.8GHz - Octa)
メモリ: 4GB
OS: Android 12

# 推論実行方法

PyTorch Java APIを使うと、Javaクラスにそのまま推論を記述することができます。

```Java:https://github.com/pytorch/android-demo-app/blob/master/HelloWorldApp/app/src/main/java/org/pytorch/helloworld/MainActivity.java
// input image読み込み
Bitmap bitmap = BitmapFactory.decodeStream(getAssets().open("image.jpg"));
final Tensor inputTensor = TensorImageUtils.bitmapToFloat32Tensor(bitmap,
        TensorImageUtils.TORCHVISION_NORM_MEAN_RGB, TensorImageUtils.TORCHVISION_NORM_STD_RGB, MemoryFormat.CHANNELS_LAST);

// モデル読み込み・推論
Module module = LiteModuleLoader.load(assetFilePath(this, "model.pt"));
final Tensor outputTensor = module.forward(IValue.from(inputTensor)).toTensor();
```

モデルの利用にあたり、[TorchScript](https://pytorch.org/docs/stable/jit.html)への変換が必要です。
TorchScriptについては[公式の説明](https://pytorch.org/tutorials/beginner/Intro_to_TorchScript_tutorial.html)がわかりやすいので割愛しますが、PyTorchで記述したモデルを、C++など他の言語からでも呼び出すことのできる中間表現（Intermediate Representation）と理解しています。

Python版PyTorchで学習したモデルをTorchScriptに変換するには、`torch.jit.trace`を使います。（推論処理中に含まれるcontrol flowも変換後のモデルに反映する`torch.jit.script`も存在しますが、ここでは割愛します）

適当なinputを与えて推論させることで元の処理の動作をトレースし、TorchScriptに変換します。

```python:https://github.com/pytorch/android-demo-app/blob/master/HelloWorldApp/trace_model.py
model = torchvision.models.mobilenet_v3_small(pretrained=True)
model.eval()
example = torch.rand(1, 3, 224, 224)
traced_script_module = torch.jit.trace(model, example)
```

また、traceしたモデルは`optimize_for_mobile`を使って最適化することができます。
>[Torch mobile_optimizer package does several optimizations with the scripted model, which will help to conv2d and linear operations. It pre-packs model weights in an optimized format and fuses ops above with relu if it is the next operation.](https://pytorch.org/tutorials/recipes/mobile_perf.html#use-torch-utils-mobile-optimizer)

高速化については、公式に[PYTORCH MOBILE PERFORMANCE RECIPES](https://pytorch.org/tutorials/recipes/mobile_perf.html)というドキュメントが存在し、チューニング方法やベンチマーキングツールの使い方が紹介されています。
```python:https://github.com/pytorch/android-demo-app/blob/master/HelloWorldApp/trace_model.py
optimized_traced_model = optimize_for_mobile(traced_script_module)
```

# 備考

AndroidでPyTorchを使うにあたり、[公式のデモ集](https://github.com/pytorch/android-demo-app)がとても充実しているので、試してみる上での障壁はかなり低いと思います。画像認識、NLP、C++スクリプトの組み込みなど、様々なデモが用意されています。

上記でコードを一部紹介しましたが、PyTorch Java APIを使った推論の最も簡単な例としては、HelloWorldAppを参照するのが良さそうです。

https://github.com/pytorch/android-demo-app/tree/master/HelloWorldApp

実運用まで考えると、現時点では安定性からPyTorch Java API一択かなという印象で、趣味等で軽く試す場合は[別記事](https://qiita.com/ta-sr/items/984779da293432f58ee1)で触れたChaquopyが候補となるように感じました。
VSCode + Typescript ts1149エラー の解決策

# 環境

VSCode + typescript


# 現象

ソースコードのファイル名や、ソースコードが格納されるディレクトリ名の大文字を小文字に、もしくはその逆に変更する

```diff:例
-filename.ts
+Filename.ts
```

以下のようなエラーが表示される 

```:エラー内容
module "(パス)/filename"
ファイル名 '(パス)/filename.ts' は、既に含まれているファイル名 '/(パス)/Filename.ts' と大文字と小文字の指定だけが異なります。
...(中略)... ts(1149)
```
# 解決策

VSCodeを再起動する

# PS

キャッシュがあるのではないか, どうやって削除するのか, とか小一時間悩みました。。。。


# 参考

https://stackoverflow.com/questions/51197940/file-name-differs-from-already-included-file-name-only-in-casing-on-relative-p
Ubuntu Server 22.04 LTS アップグレード 備忘録

# Ubuntu Server 22.04 LTS アップグレード 備忘録

Ubuntu Server 22.04 LTS の最初のポイントリリースが公開されたので、Ubuntu Server 22.04.1 LTS にアップグレードしました。

OSを最新の状態にします。

```
sudo apt update
sudo apt dist-upgrade -y
sudo apt autoremove -y
sudo snap refresh
```

OSのアップグレードを実施します。

```
sudo do-release-upgrade
```

指示に従って、最後に再起動したら終わりです。
リーンスタートアップの読書メモ

# 一言まとめ
仮説立てと検証のサイクルを早くしよう！！

# 調べたことを深堀り
専門の分野ごとに部署を分けてそれぞれで成績を上げさせるよりも、機能横断的な小チームを複数つくって、それぞれのチームで細かい単位で学びの中間目標をたてさせる。このサイクルを作ると、今全体としてうまくいってるのか、そうでないのかの検証が高頻度でできるようになり会社全体としての学びが大きくなるらしい！

# 自分の考え
仮説と検証のサイクルを早くする仕組みづくりをすることが重要。１部門に閉じた検証ではなく、一つの機能横断的なチームで検証をするからこそより正確な目線で検証ができるのではないか？？

# 参考文献
https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%B3%E3%83%BB%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97-%E3%82%A8%E3%83%AA%E3%83%83%E3%82%AF%E3%83%BB%E3%83%AA%E3%83%BC%E3%82%B9/dp/4822248976/ref=sr_1_1?adgrpid=53019674093&gclid=Cj0KCQjw1bqZBhDXARIsANTjCPJtIkM-6Qtp12aLhq0i7cur653Uw_umH1GhYmX8FdY2rpK02TDIhtcaAmMaEALw_wcB&hvadid=611330039995&hvdev=c&hvlocphy=1009303&hvnetw=g&hvqmt=e&hvrand=11770582450867282670&hvtargid=kwd-333127745249&hydadcr=4073_13255636&jp-ad-ap=0&keywords=%E3%83%AA%E3%83%BC%E3%83%B3+%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%88%E3%82%A2%E3%83%83%E3%83%97&qid=1664025416&qu=eyJxc2MiOiIxLjY3IiwicXNhIjoiMS4zNyIsInFzcCI6IjEuNDAifQ%3D%3D&sr=8-1

`Posted via Coopemo.`
Windows11でWordPress環境を構築する（WSL2, Docker）

# はじめに

Windows11でWordPress環境を構築したいと思った方向け。備忘録も兼ねています。

# WSL2のインストール

PowerShellを管理者で立ち上げて、以下のように入力

```powershell:PowerShell(管理者)
wsl --install
```

その後PCを再起動する。そうすると、勝手にUbuntuが起動するので、名前とパスワードを求められるので適当に決めて入力する。

その後、パッケージなどをアップデートし（定期的に行うことを公式では推奨されている）、日本語にも対応させておく。

```bash:Ubuntu(bash)
# ライブラリを最新化
$ sudo apt update && sudo apt upgrade

# 日本語に対応
$ sudo apt -y install language-pack-ja
$ sudo update-locale LANG=ja_JP.UTF8
$ sudo apt -y install manpages-ja manpages-ja-dev
```

# Dockerのインストール

なんでもwingetでインストールするようにしているのでwingetでインストール。

```powershell:PowerShell
winget install -e --id Docker.DockerDesktop
```

その後はDockerを起動して、

Use the WSL 2 based engineがオンになっていることを確認し、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2359398/c1a5a7a0-4a9a-2583-a578-9b99e38552bd.png)

Settings > Resources > WSL Integration に移動して、Ubuntuをオンにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2359398/a9c23426-6fec-2591-bb90-2074585928b8.png)

# VSCodeでDockerを使えるようにする

wget と ca-certificates を追加（標準で入っていたが）。
```bash:Ubuntu(bash)
sudo apt-get install wget ca-certificates
```

VSCode上で拡張機能をインストールする（以下の二つ）

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack

https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker

# WordPress環境を構築する


ディレクトリを作成し、VSCodeをコマンドで起動
```bash:Ubuntu(bash)
mkdir my_wordpress
cd my_wordpress
code .
```

VSCodeでdocker-compose.ymlを以下のように作成し、保存

```yml:docker-compose.yml
version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root_pass
      MYSQL_DATABASE: wp_db
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: user_pass

  wordpress:
    image: wordpress:latest
    volumes:
      - wordpress:/var/www/html
    restart: always
    depends_on:
      - db
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_NAME: wp_db
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: user_pass
      WORDPRESS_DEBUG: 1

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    restart: always
    depends_on:
      - db
    ports:
      - '3000:80'

volumes:
  wordpress:
  db:
```

保存したら、以下のコマンドでコンテナを起動する
```bash:Ubuntu(bash)
docker compose up -d
```

# 起動確認

### WordPress
<http://localhost:8080/> で起動する。ユーザー名やパスワードは適当に決めればOK。

### phpMyAdmin
<http://localhost:3000/> で起動する。
ユーザー名とパスワードを求められるが、MYSQL_USER（wp_user）と MYSQL_PASSWORD（user_pass）を入力すればよい。

### 参考文献
- WSL を使用して Windows に Linux をインストールする（公式ドキュメント）
  <https://learn.microsoft.com/ja-jp/windows/wsl/install>
- WSL 2 での Docker リモート コンテナーの概要（公式ドキュメント）
  <https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-containers>
- クィックスタート: Compose と WordPress（Docker-docs-ja）
  <https://docs.docker.jp/compose/wordpress.html>
- wordpress（Docker Hub）
  <https://hub.docker.com/_/wordpress>
- 初心者｜Docker-ComposeでWordPressとMySQLとphpMyAdminのローカル環境の構築
  <https://qiita.com/tomokei5634/items/75d2501cfb968d0cfab5>
- WSL2のUbuntu 20.04を日本語化する
  <https://qiita.com/myalpine/items/fb45b222924b2e61ea9f>
駆け出し情シスのMOS Excel Expert受験記

## はじめに
2022年6月18日にMOS Excel 365&2019 Expertを受験し、合格しました。
これから受ける方々の参考になれば幸いです。

## 受験理由
- 業務の効率化のため
- Excelに対する苦手意識を克服するため
- 会社の制度で評価の対象となっていたから

## 勉強開始前のスキル
フィルタ機能もVLOOKUPもCOUNTIFも知らず、先輩にドン引きされました。（2022年2月時点）
今思えばドン引きで済んで良かったです。
業務引継ぎの過程で少しずつできることは増えていきましたが、知識は限定的なものにとどまりました。

## 使用した教材
[富士通エフ・オー・エム株式会社 MOS Excel 365&2019 Expert対策テキスト&問題集 (よくわかるマスター)](https://www.amazon.co.jp/MOS-Excel-2019-Expert%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC/dp/486510447X)
いい書籍だとは思うのですが、やや大きいので何も考えず持ち歩ける感じではないです。

## 学習方法
1. 上記の本を、練習問題を解きつつ頭から順に読む
1. 付属CD-ROMに付属している模擬試験を解く
模擬試験を解く際、関数を入力するとき見やすくするためにスペースを挿入すると不正解と看做されることに注意。
5年分*5周が目標でしたが、微妙に時間が足りず4周しかできませんでした。
問題の再現度は高く、ほぼ同じか本番の方がほんの少し簡単程度でした。

## 学習期間
1日平均1時間、30日程度

## 結果
945点/1000点（700点で合格）

## 受けてみた感想
学習時間はまあ妥当だったかなと思います。
Excelのスキルはどこに行っても最低限の働きはできるものなので、受けてよかったです。

## 最後に
勉強を通じて、かなりExcelのスキルが高まったように感じます。2月末に引き継いだ仕事にかかる時間が当初と比べて1/8程度になりました。
浮いた時間を他の仕事や自分のやりたいことに割けるようになったことで精神的ストレスも緩和されいいことづくめです。
書籍の値段とそれなりの時間を投資した価値はあったと思います。
社会人1~2年目の方には特におすすめの資格です。
ネットワークスペシャリスト試験に合格しました。

令和4年春に受験したネットワークスペシャリストに合格したので、試験に向けて使った教材やサイトについてまとめていきたいと思います。

# ネットワークスペシャリストとは
求める対象者像として[IPAのサイト](https://www.jitec.ipa.go.jp/1_11seido/nw.html)では以下のように記されています。
> 高度IT人材として確立した専門分野をもち、ネットワークに関係する固有技術を活用し、最適な情報システム基盤の企画・要件定義・開発・運用・保守において中心的な役割を果たすとともに、固有技術の専門家として、情報セキュリティを含む情報システムの企画・要件定義・開発・運用・保守への技術支援を行う者

試験制度のスキルレベル4に指定されているネットワーク分野における高度情報処理技術者試験になります。
合格率は10%台で推移しています。

# 試験形式
試験は大きく4つに分かれます。

| | 午前Ⅰ | 午前Ⅱ | 午後Ⅰ | 午後Ⅱ |
|:-:|:-:|:-:|:-:|:-:|
| 試験時間  | 50分  | 40分  | 90分  | 120分  |
| 出題形式 | 多肢選択  | 多肢選択  | 記述  | 記述  |
| 問題数  | 30問  | 25問   | 3問中2問を解答 | 2問中1問を解答  |

基準点は100点満点中60点です。合格するためにはすべての試験で基準点に達する必要があります。
# 筆者について
・20代
・文系地方国立大卒
・基本情報・応用情報・情報処理安全確保支援士取得済み
・IT企業勤務
・企業の基幹システムを開発しています。

# 試験に向けた勉強
## 午前Ⅱ対策
応用情報に合格していたので、1次試験は免除になりました。
そのため、午前Ⅱから対策を始めます。

勉強のために使ったサイト・本は以下の2点になります。

#### ネットワークスペシャリストALL IN ONEパーフェクトマスター

https://shuppan.tac-school.co.jp/koukou/books/joho-nw/

ネットワークに関わる知識を網羅的に得られるので、まずは上述の参考書を使って知識を習得していきました。

#### ネットワークスペシャリストドットコム
https://www.nw-siken.com/

こちらのサイトでは午前問題の過去問と解説をまとめているサイトです。
このサイトで模擬試験を何度も繰り返していきました。

**参考書でインプットして、模擬試験でアウトプットを行うという対策を繰り返していきました。**

## 午後Ⅰと午後Ⅱ対策
午後問題はひたすら過去問を解いていくことでした。
**過去4年分**くらいの過去問を繰り返し解いていきました。
参考書をいくつか紹介します。

#### ネスペR3－ 本物のネットワークスペシャリストになるための最も詳しい過去問解説

https://gihyo.jp/book/2021/978-4-297-12465-6

ネットワークスペシャリスト試験を詳細に解説している参考書になります。
試験に合格するために必要な知識や問題の読み方などを丁寧に記述されています。
こちらの参考書は各年度ごとに出版されているので、4年分の参考書を買って勉強することが理想かな...と今となっては思っています...(当時の自分は2年分しか持っていませんでしたが...)

#### 情報処理教科書 ネットワークスペシャリスト 2022年版

https://www.shoeisha.co.jp/book/detail/9784798172491

こちらの参考書は**午後問題で出題された知識を中心にまとめられている参考書だと思います。**
午後問を解いていると、自分が知識習得で使っていた参考書に載っていないものが多々出てくることを感じました。
こちらの参考書はそういった内容も全てまとめられているので、午後問で分からない内容が多い...と感じた方におすすめです。
また、こちらの参考書は**14年分の過去問題と解説**も見ることができるので、**「過去問をたくさん解きたい！！」** といった方にもおすすめできると思います。

# 最後に
ネットワークスペシャリストは内容が広範囲で難しく、試験勉強も大変でした。
本試験も分からない問題が多く受かっているかどうか不安でしたが合格することができてほっとしています。
次は秋のデータベーススペシャリスト合格を目指して研鑽を積んでいきたいと思います。

以上となります。
ありがとうございました！！

# 参考文献
https://www.jitec.ipa.go.jp/1_11seido/nw.html

https://www.nw-siken.com/
ターミナルでGitが快適になるツール「tig」

<br>
現場で便利なツールを教えていただいたので記事にしてみました。


## 導入
※ 私の作業環境がmacしかないのでWindowsは割愛します

以下のコマンドをターミナルで叩くだけ。
```$ brew install tig```

Homebrew入れてない人は入れておきましょう
[Homebrewインストール](https://brew.sh/index_ja)

## 使い方

ターミナルで指定ファイルの編集ログを表示　
```
　tig WeatherApp/TopView.swift 
```
すると以下のように表示されるので

![部分的.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566823/a204c848-b6c1-02fd-c73c-96cb84d49b89.png)

この中のどれかを選んでEnterを押すと
![全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/566823/1b75396e-c85e-0251-a210-14620221d541.png)
こんな感じで編集内容が開きます

## 基本操作

k　・・・　上に1行進む
j, Enter　・・・　下に1行進む

Ctrl + U　・・・　複数行上にスクロール
Ctrl + D　・・・　複数行下にスクロール

Enter　・・・　（表示していない時）サブビューを表示
q　・・・　サブビューを閉じる
　　　　　　tigを終了（サブビューが表示されていない時）
Q　・・・　tigを終了（サブビューの有無は関係なし）

##
<font color="red">赤枠</font>のところで commitのSHA-1ハッシュ も取れるので
コミット全体を確認したい場合はそのハッシュ値を
各々のGitHub等で検索すればOKです

コミット履歴の閲覧以外にもできることがいくつかあるので
気になる方は調べてみてください
【数学】log（対数）の復習

## 背景
- 機械学習をしていると対数変換を行いデータの特徴を見やすくすることがある。
- 学生時代に勉強はしたが、なんとなく、「でかい数字が取り扱いやすくなる。」みたいな適当なイメージで理解している自分がいる。
- 対数の基本を復習する。

## お願い
- 数学科出身とかいうわけではないので、解釈違いや間違いがあれば是非優しくご指摘ください。

## 目標
- 対数の基本を自分なりに復習する。

## 対数の定義
> ■対数の定義
a > 0, a ≠ 1 のとき, N > 0 に対して
$m = log_aN$ ⇄ $a^m = N$
【引用】　高慮　節夫 他, 新基礎数学, 大日本図書株式会社, 2011.　p.111

- 対数の定義は、上記の通りである。
- ただ、個人的にはピンとこない。
- 以下の見方が自分的にはスッと理解できる。

## 個人的に理解しやすい対数の見方
![logについて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/97468d1f-4f54-3ac8-b2b6-46d69521df5f.png)

- 対数の本質は指数関数だと思っている。
- log表記は便利なものの、本質の指数にあたる部分がどこなのかでいつも迷子になっている。
- そうした時に上記の数式を見れば、本質の理解がスッと進む感触がある。

## 参考資料
- 高慮　節夫 他, 新基礎数学, 大日本図書株式会社, 2011.

https://www.dainippon-tosho.co.jp/books/product/02579/

https://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E9%96%A2%E6%95%B0

## 個人ブログ

https://takuma-tech.com/2023/01/14/370/
SHARP Brain に Linux を入れて遊ぶ(1) - Brainux導入

[目次](https://qiita.com/nekopro2/items/7eff2eb5e1c4480d3b30)

# 概要
SHARP Brain に Linux brainux を入れてみる。

## 必要な機材
- SHARP Brain [第三世代](https://brain.fandom.com/ja/wiki/%E7%AC%AC3%E4%B8%96%E4%BB%A3)
  - WVGA(800x480) あるので、このあたりが一番取り回しが良いと思う
  - 具体的には PW-Sx1～3 / PW-SH4～6
- MicroSDHC (4～32GB)

## ほぼ必須なもの
- **給電可能な** OTG アダプタ 
  - Brain から 5V は出ていないので給電必須です
- USB LAN
- USB キーボードなど

# リンク
https://wiki.brainux.org/

# やりかた
## 使用機材
- SHARP Brain [PW-SH2-P](https://jp.sharp/edictionary/lineup/pw-sh2/pw-sh2.html)
- MicroSDHC KIOXIA [KTHN-MW016G](https://www.kioxia.com/ja-jp/personal/micro-sd/exceria-basic.html)
- OTGアダプタ ルートアール [RUH-OTG4+C](https://route-r.co.jp/?p=2376)
- USB2.0 LAN アダプタ BUFFALO [LUA3-U2-ATX](https://www.buffalo.jp/product/detail/lua3-u2-atx.html)

## 操作
### Windows での操作
1. [brainux](https://github.com/brain-hackers/buildbrain/releases) から sdimage-2022-08-07-183650.zip をダウンロード
1. [balenaEtcher](https://www.balena.io/etcher/) をダウンロード、インストール
1. MicroSD をカードリーダに挿入して PC に接続
1. balenaEtcher を起動
1. ダウンロードした sdimage.zip を指定
1. MicroSD ドライブを指定
1. [Flash!] を押下して Compelete! になるまで待機
![balenaEtcher.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/3d4718f6-ed91-e701-2b6a-313a77740d57.png)

### Brain での操作
1. Brain に MicroSD を挿入する
1. [ツール]ボタン押下 → [追加コンテンツ]タップ → [追加アプリ・動画]タップ → [Launch Linux]決定
1. Shell / ID:user / Password:brain を入力

## SSH
1. OTG RUH-OTG4+C つなげる
1. USBLAN LUA3-U2-ATX つなげる
1. LAN ケーブルをPCに繋げる
1. SSH でアクセスする
![putty.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2821068/767b50c0-7653-4c89-9ac7-795b8afbdbf9.png)

## 失敗点
- ubootをダウンロードして途方に暮れた (sdimage をダウンロードすべし)
- MicroSD がすべて使われてた (Amazonで16GBを新たに購入)
- OTG アダプタは 5V出てないので給電できるやつが必要 (RUH-OTG4+C を購入)
完全未経験からIT業界に転職する件について

01.初めに
---

初めまして。駆け出しエンジニアのNoobと言います。

2022年10月より某大手企業の完全子会社で、自社開発をされている都内の会社に転職することが決まり、日々勉強を頑張っています。

▼僕のスペック
🌱2021年に関東の中堅四年制大学卒の社会人2年生
🧑‍🍳前職　：飲食業/興行団体運営/イベント業/その他接客業を行っている4つの事業部署に在籍
🔰IT業界完全未経験
💻PCはブラインドタッチである程度タイピングできるレベル
📚資格：ITパスポート(2022/09取得)　/　Oracle Java Silver SE11(2022/07取得)
LITパスポートは入社期間までの間に取ろうと思い取得。
LJava Silverはとある理由により取得。
この辺りの勉強法などは興味のある方がもしいれば記事にしてみようと思います。。


02.Qiita投稿の目的
---
Qiitaでは、基本的に自分が学習をした内容のアウトプットを目的として、辞書のような使い方ができればいいなと思っています。
また、その結果として新卒や未経験からIT業界で戦おうとされている他の駆け出しエンジニアの方や、異業種だけれど、技術などの知識が必要になった方達などの助けになれれば嬉しいです。


⚠️個人的に学習をした内容となっていますので、もし知識として間違い等がありましたら、お手数ですがご指摘いただけますと幸いです🙇


03.最後に
---

簡単ですが、上記のようなITを齧り始めたての人間が一人前のエンジニアになるまでの軌跡がこのQiitaではご覧になれるかもしれません。笑

Qiitaでのアウトプットはもちろん、技術変遷のはやいIT業界でしっかりとアンテナを張って頑張って行こうと思いますので、諸先輩方、どうぞよろしくお願いいたします。


では、また


Noob
セルの表示形式をyyyy-mm-dd hh:mm:ss.SSSにしたい

通算10000回以上はググっている(大げさ)ので、自分用のメモとして残しておきます。

Excelで時刻を扱う際、`yyyy-mm-dd hh:mm:ss.SSS`形式で表示したい場合は、以下の順でセルの表示形式を設定します。

①表示形式を変更したいセルにフォーカスを当てた状態で、[ホーム]タブ→[数値]のプルダウンから[その他の表示形式]を選択し、押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/79068b47-ac31-570e-e7ff-39f7210bdf8a.png)

②[セルの書式設定]ウィンドウが表示されます。[表示形式]タブの[分類]にある[ユーザ定義]を選択。[種類]に`yyyy-mm-dd hh:mm:ss.000`と入力し、[OK]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105859/99a7b2e6-32b6-c417-c60e-23ca3b681e4a.png)