OmniAICreator/Qiita-1.07M huggingface dataset:
CPUの実行手順

CPUの実効の手順は```命令の取り出し```、```命令の解読```、```対象データの読み出し```、```命令実行```がある。

## 命令の取り出し(フェッチ)
この手順は```プログラムカウンタ```と```命令レジスタ```を使う。
命令の解読までには```命令を把握しなければならない。```
まず```プログラムカウンタ(把握する係)```がメモリアドレスを元に命令を認識する。
そして```命令レジスタ(取り出す係)```が```プログラムカウンタが記憶するメモリアドレス```を基に取り出す。

命令レジスタが命令を取り出し終わったらプログラムカウンタが一つ値を増加させる。

## 命令の解読
命令レジスタに記憶される命令は```命令部```と```オペランド部```に分けられる。
### 命令部
命令の種類を示すコード番号が入っている。

### オペランド部
* ```処理対象となるデータを収めたメモリアドレスなどが入っている。```
* オペランドとは```オペレート（操作)する対象という意味```
* ```命令の種類によってはオペランドがない場合がある。```


## 命令デコーダ
命令レジスタの命令部の中身が命令デコーダへ送られる。
命令部のコードを解読し、```必要な装置に制御信号を飛ばす```。

### 気づき
* 命令部のコードによって動かされる装置が違うのか。他にどのようなものがあるのかな?
* 命令の解読と対象データの読み出しの意味がなんだか似たように見える。

## 対象データ（オペランド）の読み出し
対象データを読み込んで、```汎用レジスタへ記憶```させる。
オペランド部に直接```「メモリのアドレス」そのものが記載されているとは限らない。```
命令レジスタの```オペランド部が指す対象データを汎用レジスタ```をに記憶させる。

### 気づき
* 命令の解読は命令はどんな処理をする命令をかを判断する
（外側）
* 対象データの読み込みはオペランドの中身を読み込む
（内側)
* これで理解しているのか心配だが次に進もう。

## 命令実行
汎用レジスタの対象データを取り出しALU（算術論理演算装置)が演算する。
演算結果を汎用レジスタレジスタ書き戻す。

# 問題の気づき
## フラグレジスタ
* 条件付き分岐命令を実行するために、演算結果の状態を保持する。
* CPUの演算状態を示す値であるステータスレジスタの一種で、特に16ビット単位で扱われるステータスレジスタのことである。
フラグレジスタは、CPUが特定の命令を実行した後に自動的に付与される。 主なフラグレジスタの値としては、```桁あふれの発生に対して付けられる「OF」（オーバーフロー）```や、```演算結果がゼロになった場合に付けられる「ZF」（ゼロ）```、同じく```演算結果が負の値になった場合に付けられる「SF」（サイン）```などがある。
出典 https://japan.zdnet.com/glossary/exp/%E3%83%95%E3%83%A9%E3%82%B0%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF/?s=4#:~:text=%E3%83%95%E3%83%A9%E3%82%B0%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%81%A8%E3%81%AF%E3%80%81CPU,%E7%9A%84%E3%81%AB%E4%BB%98%E4%B8%8E%E3%81%95%E3%82%8C%E3%82%8B%E3%80%82

## 命令語
０と１で構成されたもの。

## 命令語長
命令語長が長いコンピュータほど命令の種類も多くなるとは言えない。

## プロセッサ
  * ITの分野では、一定の手順に基づいてデータを変換・演算・加工する機能を持った装置やソフトウェア、システムなどのことをプロセッサという。
  * コンピュータ全体の制御を司る「CPU」（Central Processing Unit：中央処理装置）や、その機能を小さなICチップに集積した「MPU」（Micro-Processing Unit）あるいは「マイクロプロセッサ」（microprocessor）のことをプロセッサと呼ぶことが多い。
出典 https://e-words.jp/w/%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5.html

## 割り込み処理
* 通常のプログラムの動作中，```緊急に処理しなければならなかったり```，```ある時間までに処理を終えなければならなかったり```することがある
* 割り込み処理は，CPUのハードウェア機能として実現され，通常の```プログラムの実行を強制的に中断```し，別のプログラム処理を割り込ませることができる． 割り込みした処理が終了した後は，何もなかったかのように元のプログラムをそのまま続行する。
* ソフトウェア割込みは，特定の機械語命令を実行したときに，```番号で指定された割込み```を発生させる．
* ハードウェア割込みの場合には，タイマーや，外部信号などハードウェアとして用意されている```外部要因```によって，特定の割込み処理 が発生する．

### 気づき
プロセッサは割り込み発生時に、主記憶装置上のアドレスを保存しなければなりません。
そのために```プログラムカウンタ```にアドレスを保存させる。
WSL2：「実行しようとした操作は、参照したオブジェクトの種類ではサポートされていません。」と表示されてUbuntuが立ち上がらない場合の対応方法

WSL2でUbuntu（バージョン問わず）を起動すると、次のようなメッセージが表示され、起動しない場合があります。

```
実行しようとした操作は、参照したオブジェクトの種類ではサポートされていません。
```
または

```
The attempted operation is not supported for the type of object referenced.
```


# 対応方法
以下の内容をテキストエディタへコピー＆ペースト後、拡張子regのファイルとして保存し、実行します。

```
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\AppId_Catalog\0408F7A3]
"AppFullPath"="C:\\Windows\\System32\\wsl.exe"
"PermittedLspCategories"=dword:80000000
```

上記実行後、WSL2でUbuntuを立ち上げ、動作することを確認します。

なお、Ubuntuでネットワークが利用できない（疎通しない）場合は、次のコマンドをPowerShellまたはコマンドプロンプト上で、管理者権限で実行します。

```
wsl --shutdown
netsh winsock reset
```

# 参考

https://github.com/MicrosoftDocs/WSL/issues/547

https://jon.sprig.gs/blog/post/2140
reCAPTCHAがタイムアウトした場合の対応

今回、自身で設置しておらず、タイトルの問題の解決のみお手伝いしたので、そこだけ書きます。

## 結論

```html
<div class="g-recaptcha" data-sitekey="サイトキー" data-callback="recaptcha_callback" data-expired-callback="recaptcha_expired_callback"></div>
<input type="submit" id="form_submit" disabled>

<script>
    function recaptcha_callback() {
      $('#form_submit').removeAttr('disabled');
       };    
    function recaptcha_expired_callback() {
      $('#form_submit').attr('disabled', true);
    }
</script>
```

## 参考サイト
https://www.webdesignleaves.com/pr/plugins/google_recaptcha.php

## 簡単に解説
reCAPTCHAの設置をしたことがなかったので、どういうものなのか、どうすべきものなのかはよくわかっていないです。
フォームの送信ボタンをdisabledにしておいて、reCAPTCHAをクリックしたらdisabledを外す、というやり方らしい。
（今回頼まれたものがそうなっていたし、調べたらすぐそのやり方が出てきた）

そして、チェックしたあと、2分でタイムアウトしてもう一度チェックしないといけなくなるが、このままだと送信ボタンは押下でき、エラーメッセージなどは画面に表示されないとのこと。

その、タイムアウトした場合の対応方法が書いている記事は見つけられなかった。
（タイムアウトをなかったことにするというのはあった）

上記の参考サイトを見たら、以下の内容が書いてあった。

> data-expired-callback
> ユーザーがウィジェットにチェックを入れた後に一定の期間（2分間）が過ぎてユーザが再度チェックする必要がある場合に呼び出されるコールバック関数の名前。

これで対応できるのでは？とやってみたらできました。

結構シンプルな方法なのに、シンプルだからか、そういう記事に出会わなかったので、ここにメモしておきます。
VS Buildtools 2022で " ERROR:team_explorer.bat "になるときの対処法

buildtoolsによるC++ビルドツールのインストール先がProgram Files (x86)になってるため起こるエラーらしい。**IDEバージョン**(visual studio community 2022の場合)はProgram Filesにインストールされるためエラーは起こらない。
ANRのやりかた

## ANRを発生させたい！
結論
```.kt
//onClickイベントでタイマー仕込んで、画面上のクリックイベントのオブジェクトを連打する
TimeUnit.SECONDS.sleep(10)

// runOnUiThread { while (true) }
//無限ループはいい感じにANRにならない？？
```

## どうしたの？
androidエンジニア的には何言ってるんだという内容ですが、悪意はありません。
公式見る限り、起こさせないようにしたり、確認する方法はあるのですが、意図的に発生させる方法がパッと見当たらなかったのでメモに残します。
参考記事を見てもらえればわかるように、ANRの発生条件は以下の2つです。

* 入力イベント（キーの押下や画面タッチなどのイベント）に対する応答が 5 秒以内にない
* BroadcastReceiverの実行が 10 秒以内に終了しない

個人的にUIスレッドで止まればいいんでしょくらいの認識でいたため、
いざANR起こすぞってなったら、どうやるの？状態でした・・・

これでfirebase CrashlyticsでANRが見れるようになることを確認できるね！！（これがやりたかった）

https://firebase.google.com/support/release-notes/android#crashlytics_v18-2-4



## 参考
公式↓

https://developer.android.com/topic/performance/vitals/anr?hl=ja

https://developer.android.com/training/articles/perf-anr.html


ありがたい記事↓

https://qiita.com/aiko_han/items/514ef7a7583183bae39d
docker buildコマンドで引数をファイルから指定したい

## 前置き：Dockerイメージ作成時の引数指定

以下のように``--build-arg``オプションを使うことで指定可能。

```
$ docker build . -t [イメージ名] \
  --build-arg KEY1=value1 --build-arg KEY2=value2
```

上記コマンドの指定は、Dockerfile内で``ARG KEY1=value1``のように指定するのと同じ意味になる。用途によっては、KEYのみ指定でvalueはなくてもOK。

## 課題

引数が大量にある場合に``docker build``のコマンドが長くなってしまうので、別途ファイルで管理したくなってくる。そこで例えば、``--build-arg``を以下のようにファイルで指定する方法はないだろうか。

※**[注意]下記コマンドは筆者の「妄想」なので、実行するとエラーになります**

```
$ docker build . -t [イメージ名] \
  --build-arg-file "docker.env"
```

調べてみたが、残念ながら本稿執筆時点では上のようなオプションは用意されていないみたい。

## 解決法

StackOverflowの以下記事
https://stackoverflow.com/questions/57091385/how-to-pass-argument-to-dockerfile-from-a-file
にあるように、現状はLinuxのコマンドを駆使してパイプでつないで実現する。

```
$ docker build . -t [イメージ名] \
  $(cat docker.env | sed 's/^/--build-arg /g' | paste -s -d " ")
```

``docker.env``の中身は以下のような感じ

```ini
KEY1=value1
KEY2=value2
KEY3=value3
```

今回のメインコマンド

```
$ cat docker.env | sed 's/^/--build-arg /g' | paste -s -d " "
(出力結果)
--build-arg KEY1=value1 --build-arg KEY2=value2 --build-arg KEY3=value3
```

について、ご参考に説明。

* sed
    * ``docker.env``の各行の先頭に``--build-arg  ``を足す。
* paste
    * ``-s``(--serial)オプションで１行の文字列にする。
    * ``-d " "``で入力文字列をスペースで区切る指定をしている。指定しないと余計な空白ができたりするので、一応指定した方がよさそう。

## 補足

``docker run``でコンテナ起動する場合は、``--env-file``オプションで環境変数をファイルで指定可能。コンテナ起動と比較して、イメージビルド時に引数を大量に指定するケースはあまり無いから用意されていないのかもしれない。
ルーターでI2S

PC Audioは以下の様なパターンがあります。

![PC-AUDIO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5d5ad4f5-b40d-4a86-e613-444f2847a4f4.png)

これまでやったことがなかった一番下のタイプを、[AtherosのPCMドライバー](https://qiita.com/yamori813/items/2299a81ed21775752a1d)で試してみました。

ターゲットはハードオフで324円で購入したAtherosのAR9341を使ったルーターです。

I2Sは機器内での配線の為の規格で、あまり長く引き伸ばすこはできません。しかしクロックが信号線に含まれるためにより正確な処理が可能です。

SOCでI2Sのサポートがあってもマスタークロックのない3本の信号線のものがありますがAR9341は4本の正式なI2Sのサポートです。

I2Sは4本必要なのですが、ちょうどルーターのLANのLEDが4つありそれを使うことにします。LEDはGPIO1,2,3,4に接続されていました。

![写真（2022-06-19 7.57）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/ec300b2b-05a3-cbb1-d204-477920ee12d1.jpeg)

LEDではなくI2Sで使うためC394,C398,C397,C396を外します。プルアップやダンパー抵抗はあっても動くことが多いので、そのままにしておきます。

GPIOのPIN MUXでGPIOからI2Sに変更します。hintsはこの様にしました。

```
# pcm
hint.pcm.0.at="apb0"
hint.pcm.0.maddr=0x180b0000
hint.pcm.0.msize=0x1000
hint.pcm.0.irq=7

# I2S
hint.gpio.0.func.1.gpiofunc=15
hint.gpio.0.func.1.gpiomode=1
hint.gpio.0.func.2.gpiofunc=14
hint.gpio.0.func.2.gpiomode=1
hint.gpio.0.func.3.gpiofunc=13
hint.gpio.0.func.3.gpiomode=1
hint.gpio.0.func.4.gpiofunc=12
hint.gpio.0.func.4.gpiomode=1
```

gpiofuncはデーターシートを参考にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/9714085a-3d68-962d-d61e-26dc98d533dc.png)

LEDを付けたままアノード側から信号を拾い出します。LEDを付けたままの方がパターンの強度が保たれます。

48Kのマスタークロックは256fsです。

pcmドライバーのコードはここにあります。

https://github.com/ZRouter/freebsd-src/tree/yamori813_modify

新潟精密のDACにつないでWBGOを聞いてみました。自分が作ったと言うだけどいい音に聞こえますし、オカルトUSBケーブルも必要ありません。

![IMGP0026.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/bc63cb67-92fc-5b50-78ff-f4de0cf43a52.jpeg)

シルバーの箱はぺるけさんのFET式差動ヘッドフォンアンプです。

コネクタはUSB DAI同じにしました。

|Pin|Function|
|:--|:--|
|1|5V|
|2|GND|
|3|MCLK|
|4|BCLK|
|5|LRCLK|
|6|SDATA|

FN1242,PCM5102はOKでしたがTDA1543,AK4382AはNGでした。まだ調整が必要なようです。

STEREO_CONFIGのI2S_DELAYが現在0なのですが1で試してもだめでした。1にするとちゃんと鳴ってるFN1242にもノイズが出ます。

このルーターはブートローダーを[u-boot_mod](https://github.com/pepe2k/u-boot_mod)で焼きなおしてあります。

そのままつないだらノイズまみれだったFN1241がバッファに74HC125を入れたところちゃんと鳴るようになったのですが、74LVC125に変えたらまったく鳴らなくなりました。FN1242は鳴ります。LVCの方がいいというページもあったのですが。
ElasticBeanstalkのRuby環境で軽微な修正を反映させるためにPuma再起動する方法

## 概要

マネージドサービスの場合、通常のデプロイ手順だとEC2自体が別のものに切り替わったりして反映までに時間がかかるため、そこまでの手順を踏まずに軽微な修正を反映したい場合の手順を記載します。

### ElasticBeanstalk環境

Ruby 3.0 AL2 バージョン 3.4.8

## ソースコード修正

ElasticBeanstalk（Ruby環境）で稼働しているEC2にsshキーペアでsshログインし、修正対象のファイルを修正しておきます。

```sh
sudo su - webapp
cd /var/app/current
# rubyファイルを修正

# もしRailsアプリケーションでassetsを変更した場合は以下が必要（環境変数読み込みとassets:precompile)
export $(/opt/elasticbeanstalk/bin/get-config --output YAML environment | sed -r 's/: /=/' | xargs)
bin/rails assets:precompile
```

## Puma再起動方法

### PumaプロセスIDの取得

ElasticBeanstalkで稼働しているEC2にsshキーペアでsshログインし、以下コマンドを実行します。

```sh
sudo su - webapp
ps aux | grep "/var/run/puma/my_app" | grep -v "grep"
```

稼働しているpumaのプロセスIDが取得できます。

```
webapp   13591  0.0  2.8 262392 27696 ?        Ss   Jul19   0:03 puma 5.6.4 (unix:///var/run/puma/my_app.sock) [current]
```

### Puma再起動

上記のプロセスIDから以下のようなpumactlコマンドでアプリケーションサーバpumaの状況取得および再起動が実施できます。

:::note warn
`/var/app/current` 配下でpumactlを実行するとconfig/puma.rbが存在する場合に上書きで設定を読み込んでしまうので、別のディレクトリで実行します
:::


```sh
cd ~
pumactl -p 13591 status
pumactl -p 13591 restart
```

ワンライナーで実行したい場合は以下コマンドで実施できます。

```sh
cd ~
pumactl -p `ps aux | grep "/var/run/puma/my_app" | grep -v "grep" | awk '{print $2}'` status
pumactl -p `ps aux | grep "/var/run/puma/my_app" | grep -v "grep" | awk '{print $2}'` restart
```
GAS：値のみでスプレッドシートのバックアップ

# GASで値のみでシートバックアップを取る方法
*　値のみコピーだけで、バックアップ対象シートが新規だと、書式設定されていないセルが日付が数字で表示されてしまうので、書式のみコピーも同時に行った。
* シート名.Clear()だと書式もクリアされてしまうので、シート名.ClearContents()を使う

```javascript
// バックアップ
function backup(baseID,baseName,backupID,backupName,format) {
  var baseSheet = SpreadsheetApp.openById(baseID);
  var baseSheetName = baseSheet.getSheetByName(baseName);
  
  var backupSheet = SpreadsheetApp.openById(backupID); 
  var backupSheetName = backupSheet.getSheetByName(backupName);
  
  backupSheetName.clearContents(); // 値のみクリア
  var lastRow = baseSheetName.getLastRow();
  var lastColumn = baseSheetName.getLastColumn();
　
　var baseRange = baseSheetName.getRange(1, 1, lastRow, lastColumn);
  var backupRange =  backupSheetName.getRange(1, 1);

  baseRange.copyTo(backupRange,{contentsOnly:true}); // 値のみコピー
  if(format){
    baseRange.copyTo(backupRange,{formatOnly:true}); // 書式のみコピー
  }

  // baseSheetName.getRange(1, 1, lastRow, lastColumn).copyTo(backupSheetName.getRange(1, 1), {contentsOnly:true});
  // baseSheetName.getRange(1, 1, lastRow, lastColumn).copyTo(backupSheetName.getRange(1, 1), {formatOnly:true});
}
```

## 使い方
```javascript
  baseID = 'シートID';
  baseName = 'シート名'
  backupID = 'バックアップシートID';
  backupName = 'バックアップシート名'
  backup(baseID,baseName,backupID,backupName,true);
```

https://teratail.com/questions/297875

https://zenn.dev/lee/articles/06530f4d3fd4a4

https://excel-ubara.com/apps_script1/GAS026.html

https://blog-and-destroy.com/33158

https://www.yukibnb.com/entry/gas_sheet_clear
Linuxについて（自分用メモ

LinuxはOSの一種。
厳密にはWindowsなどのOSに相当するものではなく、OSの中核部分であるプログラムをカーネルといい、Linuxはカーネルに付けられた名前である。
ただ、近年ではLinuxをOSの意味で使われることが多く、カーネル部分を指すときはLinuxカーネル、OSを指すときはLinux OSを言うことが多い。

Linuxカーネルにライブラリやツール、インストーラが組み込まれた製品として提供され、これをディストリビューションという。
ディストリビューションを構成するソフトウェアはほとんどオープンソースソフトウェア。

・ディストリビューションの種類
１、Red Hat系ディストリビューション
レッドハット社によって開発されたRed Hat Linux（現在はRed Hat Enterprise Linux）をベースに開発されたもの。現在では独自の進化をとげている。
●Fedora　無償
●Red Hat Enterprise Linux　有償だがサポートがある
●CentOS　無償。PHELクローンOS（ソースコードをもとに作られた無償ディストリビュージョン）の中でもっとも知られている。


２、Debian系ディストリビューション
フリーソフトウェアだけを採用するDebianProjectというコミュニティが開発しているDebian GNU/Linuxをベースにさまざまなディストリビューションが作られている。
●Ubuntu 無償　使いやすさ重視・人気
●Linux Mint Ubuntuから派生
●Raspbian 超小型のワンボードコンピュータとして人気なのがRaspberry Pi。RaspbianはRaspberry Pi向けのディストリビューションでDebian GNU/Linuxをベースに作られている


３、その他のディストリビューション
●Slackware 
●openSUSE Slackwareから派生した無償ディストリビューション。


・Linuxの特徴
１、UNIXライクなOS
２、多彩なディストリビューション
３、多彩なプラットフォーム（OSが動作するハードウェア）
４、無償で利用可
５、最適なシステム構成が可能

・Linuxを利用できる領域
１、ネットワークサーバー
２、組み込み機器
３、パソコン
４、大規模システム

・WindowsやMacOSとLinuxの大きな違いの１つは、Linuｘがオープンソース（ソースコードを公開）で開発されているということ。
オープンソースを推進しているOSIではオープンソースの定義として１０項目定めている。

代表的的なオープンソースソフトウェア
１、OS
２、サーバソフトウェア
３、データベースソフトウェア
４、デスクトップソフトウェア
５、ソフトウェア開発
６、オンラインストレージ

代表的なオープンライセンス
・ライセンス
１。GNU GPL
２、BSD License
３、Artistic License
４、Apache License
Qiita Conferenceの一連のデザインを作成した話

こんにちは、Qiita株式会社でデザイナーをしているかべちよです。

この度Qiitaが主催するエンジニア向けカンファレンスの「Qiita Conference 2022」のクリエイティブを作成しました。
この記事ではこれらの制作を振り返りつつご紹介します！

## ロゴの作成とトンマナの策定

Qiita Conferenceは今年初開催のイベントのため、ロゴの作成とトンマナの策定から始めました。

ロゴとトンマナを策定するときにまず考えたのは以下の3点です。

1. テーマを体現していること
1. すでにあるイベントとぱっと見で違いがわかること
1. 多様なクリエイティブに展開しやすいこと

まず1つ目は **「テーマを体現していること」**

Qiita Conferenceのテーマは「ソフトウェア開発に関わる人々の、新たなきっかけを創出する」
「きっかけ」や「つながり」が感じられるデザインを目指しました。

2つ目は **「テーマを体現していること」**

Qiitaには夏の記事投稿イベント「Qiita Engineer Festa」と冬の記事投稿イベント「Qiita Advent Calendar」という大きなイベントがあります。

特に「Qiita Engineer Festa 2022」とは開催時期が被っていたため、ぱっと見で「違うイベントだ」ということがわかるようにしたいと思っていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/ac2129a1-4232-1420-3fa7-9a1be5d5c767.png)

3つ目は **「多様なクリエイティブに展開しやすいこと」**

この時点でLPを作ることとそこにアニメーションを入れたいことを考えていました。また、広告バナーやZoom背景などの画像の制作も必要になります。
こうした複数の用途に展開しやすいよう「LPにするときはこの要素をこんな感じに入れよう」などと考えながら作成しました。


**最終的に作成したロゴはこちらです。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/2069a4bd-aa46-2ab3-312c-94bace2eb856.png)

「Qiita Conference」の頭文字である「Q」と「C」をモチーフにしており、2つを組み合わせることで「つながり」を、Qの動き出しそうな形状に「きっかけ」を表現しています。

また、Qは吹き出しにも見える形状にすることで「カンファレンス -> トーク -> 吹き出し」というメッセージも込めています。

ロゴが完成したらトンマナも策定しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/6dd05ad7-b91a-7d53-abc9-408263f2ab1a.png)

明るいグレーを背景にして、円を基調にしたモチーフを配置しています。
それぞれのモチーフはキーワードの「きっかけ」や「つながり」を感じられるよう円をつなげたり動かしたりして作成しています。
また、複数のオブジェクトを配置することで賑やかな感じや人の集まる感じを表現しています


## LP・アニメーションの作成

次に作成したロゴとトンマナを元に、LPのデザインとコーディングを行いました。

Qiita Conference 2022 は2days開催の規模の大きいイベントのため、情報量が多くなってしまいがちでした。
そこでタイムテーブルはあえてシンプル目のデザインにし、モーダルで詳しい情報が見れるようにして「イベント全体を見通せること」と「1つ1つのセッションをじっくり見れること」を両立できるようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/e9cc8bf0-9d89-2279-338b-1d1c8b6ae114.png)

そして、サイトには全体に作成したモチーフを散りばめています。

また、LPのファーストビューに使用するアニメーションも作成しました。
できるだけ巻き戻しを発生させないよう小まめにデザイナーメンバーとすり合わせをしながら作成していきました。

動画自体は「Adobe After Effects」で作成していますが、動きの検討や絵コンテの作成はFigmaで行いました。
Figmaは感覚的かつ簡単にモーションを作ることができるので、すり合わせにとても役立ちました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/fe8a16b5-b73e-82e3-f960-e8f02a0d3efd.png)

移動前と移動後のFrameを作成し、「Smart animate」でインタラクションをつけると、間を補完してアニメーションを付けてくれrので、パターン出しをするときにサクサク作れて便利です。


最終的に作成したアニメーションはこちらです。

![4rizp-ojdnn.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/8a4f4b61-f5a9-0542-023e-cc6c48f232ed.gif)

特にロゴの「Q」と「C」の動きはペアデザインや最後まで細かなレビューと調整を繰り返して作っています。

[Qiita ConferenceのLPはこちら](https://qiita.com/official-campaigns/conference/2022)です！

## 最後に

ここまでお読みいただきありがとうございます！
Qiita ConferenceのアーカイブはYoutubeで公開されていますので、こちらも是非ご覧ください！

https://www.youtube.com/watch?v=rzm5xfd71-Q

https://www.youtube.com/watch?v=E_8WMVY4JUc
each文で出力するデータの数を指定したり順番をランダムにしたりする方法【Rails】

# 目的
テーブルからデータを取り出す方法としてeach文を使用するのは一般的ですが、大量のデータから指定したデータ数だけ取り出したいときや、データをランダムで出力したいというときに使用する方法についてまとめます。

本記事は

+ 出力する数を指定する
+ ランダムに出力する
+ 上記2つを組み合わせる

という構成で紹介します。

# 数を指定する
hogesテーブルから10個だけデータを取り出したいという場合は、コントローラとビューファイルで下記の設定をします。

```ruby:hoges_controller.rb
# 対象のアクション内で
@hoges = Hoge.all
```

```ruby:viewファイル
<% @hoges.limit(10).each do |hoge| %>
# ~~~~~
<% end %>
```
@変数に対して`.limit`メソッドをしてからeach処理をする。というシンプルな流れです。

`.limit`メソッド以外にも、新しいデータや古いデータから任意の数を取り出す方法もあります。
詳細は下記を参照してください。
[【ruby】配列を指定回数だけループ（each）で処理する (Yohoe Isokawa)](https://blog.yuhiisk.com/archive/2018/05/02/ruby-each-specify-the-times.html)

# ランダムに出力する

```ruby:hoges_controller.rb
# 対象のアクション内で
@hoges = Hoge.order("RANDOM()").all
```
ランダムに出力する場合は、コントローラで@変数を設定する時点でモデルに対して`.order("RANDOM()")`のメソッドをおこないます。
ビューファイルは下記のように設定することでHogeモデルに格納されたデータをランダムに出力することができます。

```ruby:ビューファイル
<% @hoges.each do |hoge| %>
# ~~~~~
<% end %>
```
アクション内で`@hoges`を定義しているので、ビューファイルはいつも通りの記載方法ですね。

# 2つを組み合わせる
上で紹介した2つを組み合わせることも可能です。
例えばhogesテーブル内からランダムに2つのデータを出力したいとき
```ruby:hoges_controller.rb
# 対象のアクション内で
@hoge = Hoge.order("RANDOM()").all
```

```ruby:viewファイル
<% @hoges.limit(2).each do |hoge| %>
# ~~~~~
<% end %>
```
とすることで機能を実装することができます。


# まとめ
今回は、each文で出力するデータの数を指定したりランダムにしたりする方法を紹介しました。
ページを更新する度に出力されるデータが変わる様子は見ていて面白いですし、アイデア次第で色々なものが作成できそうです。
たとえばおみくじサイトや、Twitterで見かける「〇〇メーカー」なんかも似たような方法で作成していると予想できます。

# 参考サイト

[limit (Railsドキュメント)](https://railsdoc.com/page/limit)

[Railsでのランダム表示を実装してみた　簡単！[初心者向け] (Qiita)](https://qiita.com/mailok1212/items/360d15eeab3bf9465f42)
CPUの命令実行手順とレジスタ

# お使いメモ　レジスタ
お使いを頼まれた時はメモまたは伝言が用意される。
Aと言う店でBと言う商品を買ってこいと言われる。
このように単純なお使いでも暗黙の条件があることを意識しなければならない。

これをコンピュータに命令するときは
Aと言う命令をした場合、それを行う前に準備をする必要がある。
つまりAと言う命令には手順がB,C,D...があり、それらをしてAを行う。
それら手順を覚えておくために```レジスタ```というCPUの中にある記憶装置がある。

このレジスタで手順や実行を記憶しておく。
お使いの時のメモの役割がレジスタだ。
# レジスタとは(記憶するもの/記憶された情報)
取り出した命令の情報」や「次はどの命令を取り出せばよいかの情報」を覚えておく必要があります。

# レジスタの種類とそれぞれの役割
## 気づき
アドレス指定方法の違いだろうか？

## プログラムカウンタ
実行するべき命令が入っているアドレスを記憶する

## 命令レジスタ
取り出した命令を一時的に記憶する

## インデックス（指標)レジスタ
アドレス修飾に用いるためのレジスタで、連続したデータの取り出しに使うための増幅値を保持する。

### 気づき
* 等間隔のデータを取り出すために保持するのか。
* 配列は等間隔にすることによって配列であることを示しているのかもしれない。
どうせならメモリの中で連続にすればいいのかもしれないと思ったが、それはコンピュータの性格上何かあるのだろう。
簡単な命令でいろいろ手順があるのだからそれと関係していそうだ。
今回は足を踏み入れすぎた。

### 疑問 連続したデータとは？
連続したデータの取り出しに使う増分値を記憶しておくものであり、配列など等間隔で連続して置かれた複数のデータに順番にアクセスする際に使用します。
出典 https://medium-company.com/%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF/

### 疑問　アドレス修飾(実行アドレスを決定する）
機械語命令の演算数（オペランド）にあるアドレス情報を利用して、実行するべき命令の対象となる```データアドレスを決定する```ことである。
ちなみに、アドレス修飾の際、対象となる```アドレスを計算する方式のことが、アドレス修飾方式```と呼ばれる。
出典 https://japan.zdnet.com/glossary/exp/%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E4%BF%AE%E9%A3%BE/?s=4#:~:text=%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E4%BF%AE%E9%A3%BE%E3%81%A8%E3%81%AF%E3%80%81%E6%A9%9F%E6%A2%B0,%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E4%BF%AE%E9%A3%BE%E6%96%B9%E5%BC%8F%E3%81%A8%E5%91%BC%E3%81%B0%E3%82%8C%E3%82%8B%E3%80%82
#### 気づき
説明の言葉の意味がわからない。
今後も出てくると思われるのでしっかり理解することが重要だと思う。
インデックスレジスタに関して説明があった。

### インデックスレジスタ
```アドレス指定方式```の一種である```インデックスアドレス指定方式（指標アドレス指定方式）```で使用するレジスタです。

#### アドレス指定方式
CPUが命令を実行する際、```対象となるデータの在りかを指定```する方法
CPUが実行する命令は下記の図のように```「命令部」```と```「オペランド部」```に分かれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/0ef9e222-bd43-f71a-9e6c-1cf1253a2cce.png)
```対象データの在りかを示すオペランド部```には```さまざまな指定方法```があります。
#### インデックスアドレス指定方式（指標アドレス指定方式）
オペランド部にインデックスレジスタと値が入り、```オペランド部の値にインデックスレジスタの値を加算する```ことで、実効アドレスを求める方式です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968738/58667256-1bff-ce43-d339-51812b4861c3.png)
#### 実行アドレス
処理の対象となるアドレス
出典 https://masudahp.web.fc2.com/casl2/casl2030.html#:~:text=%E5%AE%9F%E5%8A%B9%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%A8%E3%81%AF%E3%80%81%E5%87%A6%E7%90%86,%E3%82%88%E3%81%86%E3%81%AB%E6%9B%B8%E3%81%84%E3%81%9F%E3%81%A8%E3%81%99%E3%82%8B%E3%80%82&text=ADDA%E3%81%AF%E7%AE%97%E8%A1%93%E5%8A%A0%E7%AE%97%E5%91%BD%E4%BB%A4,%E3%81%93%E3%81%A8%E3%82%92%E8%A1%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82

等間隔で実行アドレスを取得するためのものなのか。
## ベースレジスタ
プログラムの```先頭アドレスを保持```する。

## アキュムレータ
```演算の対象となる数```や、```演算結果```を記憶する

## 汎用レジスタ
特に機能を限定していないレジスタ。
一時的な値の保持や、アキュムレータなどの代用に使ったりする。

# CPUの中身
## 演算装置
* 汎用トランジスタ
* ALU(算術論理演算装置)

## 制御装置
* 命令レジスタ
* プログラムカウンタ
* 命令デコーダ

## 気づき
CPUの中はいろいろな装置が付けられてるんだな。

出典 キタミ式イラストIT塾　基本情報技術者　令和03年
Laravel 圧縮した画像をS3にアップロード

パッケージインストール
`$ composer require intervention/image`

フォームから画像を送信
```php
use Illuminate\Http\UploadedFile;

public static function s3UploadResize ($file, $width=null, $height=null)
{
    if (!file_exists($tmp_file_dir = storage_path('app/tmp/'))) {
        mkdir($tmp_file_dir, 0777, true);
    }

    $filename = date('YmdHis').$file->getClientOriginalName();
    $path = '/user';

    // 圧縮した画像を一時フォルダに保存
    $tmpPath = storage_path('app/tmp/') . $filename;
    $image = \Image::make($file)
                    ->resize($width, $height, function ($constraint) {
                        $constraint->aspectRatio();
                    })
                    ->save($tmpPath);
    $file = new UploadedFile($tmpPath, $filename);
    $path = $file->storeAs($path, $filename, 's3');
    \Storage::delete('tmp/'.$filename);
    return $path;
}
```
Formオブジェクトで保存したデータを表示させるには

formオブジェクトで複数テーブルに保存したデータをページ上に表示させるのに苦労したので、忘備録として記録する。

## formオブジェクトのデータを取得したい
itemテーブルとmaterialテーブルがあったとする。
二つのテーブルを組み合わせて、`Item_material`クラスを定義した。

詳細ページにて、materialテーブルに保存したデータを表示するためにitemコントローラーに下記を記述した。
```ruby
def show
  @item = Item.find(params[:id])
  @material = Material.find(params[:id])
end
```
これではダメたった。material.idが@itemと同じidを取得してしまう。
例えばitem.idが4ならmaterial.idも同じ4になる。

## 成功したコード
```ruby
def show
  @item = Item.find(params[:id])
  @material = @item.material
end
```
これでいけた。この記述なら@itemが持ったmaterial情報を取得できる。

ビューへの記述は@material.カラム名でOK
wingetが使えなくなったとき


# 概要
windows10環境下にインストール済み、利用実績ありのwingetですが、
ある日、powershellを管理者権限で起動してwingetコマンドを叩いても、
そんなコマンドはないと言われるようになっていた。
表示されるメッセージ：「wingetは（略）認識されません」

# 原因
最近の出来事で思い当たったのが、
先日誤ってユーザ環境変数PATHを飛ばしてしまったことです。
このときwinget動作に必要なPATH情報が失われたのかもしれません。

# 対応
wingetの再インストールや再起動をしても改善しませんでした。
ユーザ環境変数PATHを直接編集してみます。
以下をユーザ環境変数PATHに追加します。※追加です※
```
C:\Users\USERNAME\AppData\Local\Microsoft\WindowsApps
```
- USERNAMEはそれぞれのユーザ名です。
- 上記パスはwingetをwindows上で検索して特定しました。

# 結果
その後powershellを再立ち上げしたら無事wingetが動きました！
【2022】openSUSE マルチメディア コーデックまわりとPackmanのおはなし

# openSUSE Leap 環境における マルチメディア コーデック のおはなし
### 筆者の環境
openSUSE Leap 15.4 @ Thinkpad X250

## 概要
openSUSE Leap において、初期状態のrepoたちにはいくつかのマルチメディアのコーデック(x264とか)が含まれていません。(法的な問題で)
[制限されている規格 - openSUSE Wiki](https://ja.opensuse.org/%E5%88%B6%E9%99%90%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E8%A6%8F%E6%A0%BC)

>次のようなソフトウェアは、openSUSEで配布することができません:
>- プロプライエタリ・ソフトウェア
>- 特許により保護されているソフトウェア
>- Novellが事業を行っている区域におけるソフトウェア配布に関する法を犯すソフトウェア

つまるところ、初期状態ではさまざまな形式のマルチメディアが再生できません。
なので今回は`packman`リポジトリを追加し、必要なパッケージをインストールして、openSUSE Leapでマルチメディアを楽しめるようにしましょう。

## 実践
### Packman Repository の追加
追加する必要のあるリポジトリのURLは下記の通りです。
http://ftp.gwdg.de/pub/linux/misc/packman/suse/openSUSE_Leap_15.4/
バージョンは適宜書きかえてください。

これを追加するにはターミナルで下記のコマンドを実行します。
```terminal
$ sudo zypper addrepo --refresh http://ftp.gwdg.de/pub/linux/misc/packman/suse/openSUSE_Leap_15.4/ Packman
```
上記のコマンドはPackmanの本家repoを"Packman"として追加します。(日本のミラーが存在しない)

### 必要なパッケージのインストール
- gstreamer-plugins
	- good
	- bad
	- bad-codecs
	- ugly
	- ugly-codecs
	- libav
- libgstreamer-1_0-0
- vlc
	- vlc-codec-gstreamer

上記のパッケージをインストールします。
(いくつかのパッケージは自動でインストールされる場合があります)

## トラブルシュート
なにかしらの原因で、Packmanからインストールしたパッケージのベンダが変更されてしまい、コーデックが正しく動作しなくなる場合があります。
その場合は下記のコマンドを実行することでベンダをPackmanに一括で戻すことができます。(Packmanに存在するパッケージすべてに適用されることを留意してください。)
```terminal
$ sudo zypper dup --from "Packman" --allow-vendor-change
```
【Android Studio】GitHub に Push すると Invocation failed Unexpected end of file from server とエラーが出る

- [表示されたエラー](#表示されたエラー)
- [どんな状況だったか？](#どんな状況だったか)
- [試したけどダメだったこと](#試したけどダメだったこと)
- [改善策](#改善策)
- [参考 URL](#参考-url)

# 表示されたエラー

> Invocation failed Unexpected end of file from server

や

> push failed github

や

> error: unable to read askpass response

といったもの。  

# どんな状況だったか？

Android Studio で新規プロジェクトを GitHub に作成する。  
すると、リポジトリの作成はするのだが、コードは上がっていない状態で Android Studio ではエラーが出る。  

# 試したけどダメだったこと

Android Studio と GitHub の再認証。  

# 改善策

File → Invalidate Caches.. を選択する。  
すると出てくるダイアログの Optional に元からチェックが入っていた Clear VCS Log caches and indexes はそのままにしました。  
ちなみにこの英文の意味は、IntelliJ によると、  

>Clear VCS Log caches and indexes: remove the cache and indexes of the VCS Log.
> 
> Enable this option if you are certain that your VCS Log indexes are broken, for example, if the Log search doesn't work correctly.

とのこと。  

https://www.jetbrains.com/help/idea/invalidate-caches.html  

Invalidate and Restart を選択し、GitHub に push をすれば改善できました。  

# 参考 URL

https://stackoverflow.com/questions/71456719/git-checkout-error-unable-to-read-askpass-response-in-windows-10
(aws) EFSのFileSystemId取得方法

# EFSのFileSystemIdを取得方法について
BatchやプログラムでEFSのFileSystemIdを取得し、マウント作業を自動化したい時に役立つ方法。
AWS CLIを利用する。（もちろんAWS SDKも利用可能）

基本的には下記コマンドで全てのEFSの全ての詳細情報を取ることが可能。
```shell
$ aws efs describe-file-systems
```

上記コマンドを使って "--query" オプションを追加することで特定の情報だけをフィルタリングすることが可能。

※AWSのAPIは大体 **"--filter"** というサーバ側のフィルタリングオプションと **"--query"** というクライアント側のフィルタリングオプションが存在する。しかし、EFSの場合だと、**"--filter"** 機能は特に実装されてない(2022年7月時点)らしいので、**"--query"** オプションでフィルタリングをかけるしかない。
**"--query"** のフィルタリング方法は[JMESPath構文](https://jmespath.org/tutorial.html)を使用する。

```shell
$ aws efs describe-file-systems --query FileSystems[?Name==\`efs-test-001\`].FileSystemId
```
みたいに特定NameでFileSystemIdを取得することが可能。
さらにoutputのタイプを設定することで文字列のみを取得することも可能。
```shell
$ aws efs describe-file-systems --query FileSystems[?Name==\`efs-test-001\`].FileSystemId --output text
```

# 参考情報
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-filter.html#cli-usage-filter-client-side

https://jmespath.org/
Yum のアップデートで GPG が正しくないとエラーが出る場合の対処

MySQL Yum Repository を利用しているマシンで `yum update` を実行するとエラーで止まってしまう場合の対処方法。
MySQL 8.0.28 でパッケージの署名に使用される GPG が更新された影響。 `rpm` コマンドで新しいものをインポートすれば解消する。

## エラーメッセージ
```
warning: /var/cache/yum/x86_64/7/mysql-tools-community/packages/mysql-shell-8.0.29-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3a79bd29: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql


The GPG keys listed for the "MySQL Tools Community" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.


 Failing package is: mysql-shell-8.0.29-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
```

## 対処方法
```bash
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
```

## 原因
https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/#idm46440417871424
> MySQL ダウンロードパッケージの署名に使用される GnuPG ビルドキーは、MySQL 8.0.28 リリースで更新されました。MySQL 8.0.28 以降へのアップグレード時にキー検証エラーを回避するために、新しい GnuPG キーをインポートしてください。
> ```bash
> rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
> ```

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-28.html#mysqld-8-0-28-packaging
> MySQL ダウンロードパッケージの署名に使用される GnuPG ビルドキーが更新されました。以前のGnuPGビルドキーは、2022-02-16に期限切れになるように設定されています。GnuPG 署名チェックを使用した MySQL ダウンロードパッケージの整合性と信頼性の検証、または公開 GnuPG ビルドキーの取得については、「[GnuPG を使用した署名チェック](https://dev.mysql.com/doc/refman/8.0/en/checking-gpg-signature.html)」を参照してください。
意識低い系インフラエンジニアでもAWS SAA(C02)合格する方法

# 意識低い系インフラエンジニアでも合格できました

前回のクラウドプラクティショナー受験から4か月ほど経ち、
2022年6月にソリューションアーキテクトアソシエイトに合格しました。

スコアはこんな感じ。割とギリ。

`受験者スコア: 760 結果: 合格`

## 前提_環境

2022年2月頃にクラウドプラクティショナーに合格しています。

18年頃に一度SAAは受験していましたが、落ちています。
その時は500点程度だったと記憶しています。

試験官が海外の方だと時差の関係で深夜帯にも受験できるので
日本語受験、試験官は英語としました。

SIerとして派遣勤務しており、現場でも取得を求められているため
クビにならないように受験しました。

## 勉強方法

Qiitaの合格体験記を参考にやってたので、似たり寄ったりです。変わったことはしていません。
逆に言えばこれやっときゃ受かるのかも。
乱雑ですがした事は以下の通りです。

とりあえず黒本を読み、ざっくりと内容を理解しました。

他にも読んだものはあるのですが、結局これが自分に一番合っている気がします。

https://www.amazon.co.jp/改訂新版-AWS認定-ソリューションアーキテクト-アソシエイト教科書［SAA-C02］対応-徹底攻略シリーズ-ebook/dp/B08SGSD479/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1658282035&sr=8-14

一通り黒本を読んだら
ひたすらUdemyの模擬試験6回分のものを繰り返し、解き続けました。
全問正解するまでその模擬試験はクリアとせず、ひたすら繰り返しました。

https://www.udemy.com/course/aws-knan/

あとは試験当日にCloudtechも無料分の200問だけですが解きました。
(急に不安になったため。これが案外良かったかも。)

## 困ったこと
試験が始まる前に試験官と通話させられ、以下を確認してもらいました。
・免許証
・試験スペースの確認

試験スペースの確認がややこしく、
指示が英語で何言ってるか分からんタイミングがあり苦戦しました。
おそらく席に座れと言ってたんだと思うのですが、
ひたすら椅子を映し続けたのはいい思い出。

できるだけチャットで送ってくれ！とこちらからお願いしたので
なんとかなった、って感じでした。
英語勉強しよ。

## 合格できてよかったね
次はDVAにしようかなあどうしようかなあ。アソシエイト3冠いいなあ。
Qiitaを羨ましいと思った話

## 自己紹介
Qiitaで記事を書くのは2度目になります。
当方、建設業を生業としています。専門は地盤工学です。地盤工学ってなんぞやって話ですが、建物の基礎の設計や災害（地震や豪雨）対策の設計等を主にやっています。
プログラミングの経験はありますが情報系は全くの分野外となります。

## Qiitaを知ったきっかけ
私は学生時代の研究から現在の仕事にかけて、数値解析に携わってきています。人が作ったプログラムをただ実行するだけではつまらないので自分でもプログラムを作ったりしてます。そういった中で数値解析のことを調べているなかでQiitaを知りました。
現在、企業で機械学習の研究開発に少し関わっており、機械学習の勉強でかなりお世話になりました。

## Qiitaを羨ましいと思った話
建設業というのは経験工学と言われており、なかなか若い人が情報を発信することが少ないように感じています。建設業関連で何か調べたいなと思っても偉い人の本か論文くらいしか出てこないのが現状です。
もちろん若手も個別に勉強しているでしょうが、共有する場がないなというのが不満に感じています。
プログラミングの技術交流をする場はこのQiitaを筆頭にいくつかあるのを知り、羨ましくなりました。
私は現在学会で若手のパワーアップを図ろうという委員会に所属しています。その活動は建設系の大学生や中高生
に興味を持ってもらうというところが主ですが、学生からベテランまで技術交流ができる場を作れたらなと思っています。
「laravel」レスポンスで返したくないカラムを設定する $hidden


jsonなどでレスポンスを返す際、
テーブルの値が入ったオブジェクトを指定したら表示したくないカラムのデータがあるって場面がたまにあります。
そういうときはモデルに$hiddenを指定するだけで解決します

```
class User extends Model
{
    protected $table = 'user';
    
    protected $hidden = [
        'id',
        'user_id',
        'created_at',
        'updated_at'
    ];
} 
```



```
//$hidden設定前のレスポンス
 "user": {
        "id": 4,
        "user_id": 8,
        "login_at": "2022-07-20 11:32:33",
        "created_at": "2022-07-14 17:50:03",
        "updated_at": "2022-07-20 11:32:33"
    },

//$hiddnen設定後のレスポンス
   "user": {
        "login_at": "2022-07-20 11:32:55"
    }
```

laravelはコードが単純で機能が実装できるので初心者に優しいですね
cscriptでOracleDB 19cのODBCを使い接続したところエラー

OracleDBのバージョンアップ対応中に、新しいOracleDBに対してODBC接続を行うVBScript（*.wsf）をcsrciptコマンドで起動したときに発生した問題です。

# Problem

 `cscript`でOracleDB 19cのODBCを使い接続したところエラーになる。

前提：
* OSは、Windows Server 2016。64bit OSです。
* OracleDBのバージョンは、19cです。
* ODBCドライバーのバージョンは、同じく。ただし32bit版です。
* ワークフローを管理するツールから実行すると正常終了するが、あえて手実行すると異常終了する。


コマンドのイメージ：

```bat
cscript path\to\script.wsf 
```

スクリプトのロジックのイメージ：

```vb:path\to\script.wsf
Set conn = CreateObject("ADODB.Connection")
conn.Open "Driver={Microsoft ODBC for Oracle};" & _
		"CONNECTSTRING=<tns_name>;UID=<user_schema>;PWD=<password>"
```

エラーメッセージ：

```bat
[Microsoft][ODBC Driver Manager] データ ソース名および指定された既定のドライバーが見つかりません。
```

# Solution

理由はいくつもありえますが、今回は手動実行時に使用した `cscript` コマンドが64bit版だったのが原因でした。
ワークフロー管理ツールがこのスクリプトを実行するときは、きちんと32bit版のコマンドを利用しているようです。

正しいコマンドのイメージ：

```bat
C:\Windows\SysWOW64\cscript path\to\script.wsf 
```

他にもODBCドライバー名として指定する文字列が誤っているとか、（今回とは逆に）64bit版のドライバーをインストールしてしまっているとか、そもそもODBCドライバーのインストールをしくじっているとか、そういうケースでも同じようなエラーメッセージが出力されることでしょう。
==は「同値性」を、.equal?は「同一性」を判定しているらしい（Ruby）

## はじめに

今回はRubyにおける比較演算子`==` と`.equal`の違いについて簡単にまとめてみました。

タイトルを読んでもピンと来ない方には、ある程度意味のある記事になっていると思うので読んでもらえると嬉しいです。

## 対象読者

- `==`と`.equal?`の違いを理解せずに使っている人
- 「同一性」「同値性」と言われてもピンと来ない人
## 結論

いきなりですが結論です。

`==`と`.equal?`の違いは「**同値性を判定している**」か、「**同一性を判定している**」かです。

...タイトルのままですね。

あまりにも説明になっていないので、以下から詳しく解説していきます。

そもそも「同一性」「同値性」とは

- 同一性：参照値が同じオブジェクトを指していること(*1)
- 同値性：オブジェクトが同じ値を持っていること(*1)

（*1 『[独習Ruby](https://www.amazon.co.jp/dp/479816884X)』から引用）

を意味しています。

具体例を使って説明します。

```ruby
array1 = ['a', 'b', 'c']
array2 = ['a', 'b', 'c']

array1 == array2 #=> true
array1.equal?(array2) #=> false
```

上記の変数、array1, array2はどちらも値として['a', 'b', 'c']が格納されています。

これらを`==`で比較すると両者の値は等しいので`true`が返却されます。

しかし、`.equal?`で比較すると`false`が返却されます。

なぜなら、array1, array2の中身は同じでも、メモリ上は別の場所に作成された異なるオブジェクトだからです。つまり`.equal?`は、両者の参照先のメモリが同じかどうかを判定しているのです。

別の言い方をすれば、同じobject_idかどうかを判定しているとも言えます。

## 補足

今回の`==`と`.equal?`はイミュータブルなオブジェクト（TrueClass, FalseClass, Integerなど）に対して使う場合、注意が必要です。

```ruby
int1 = 1
int2 = 1

int1 == int2 #=> true
int1.equal?(int2) #=> true
```

上記のように、別々に生成されたオブジェクトである`int1`と`int2`が同一のオブジェクトとして判定されています。

これはイミュータブルなオブジェクトの場合、複数の場所から参照されても破壊的操作が行われないため、同値のオブジェクトは同じobject_idが割り当てられる(同値のインスタンスが複数生成されない)という内部的な挙動によるものです。

ただあくまでも例外的な挙動なので、同一性を比較するか同値性を比較するかで`==`と`.equal?`を使い分けるのがいいと思います。
SnowflakeのPythonコネクタを使用する

# Snowflake Python用コネクタの接続方法

<作業手順>
1. インストールする予定のPython用Snowflakeコネクタのバージョンを確認
2. 使用しているPythonのバージョンとPython用Snowflakeコネクタのバージョンを確認し、コネクタの依存ライブラリをインストール(詳細はドキュメント参照(修正箇所は数字の箇所))
```
pip install -r https://raw.githubusercontent.com/snowflakedb/snowflake-connector-python/v2.7.6/tested_requirements/requirements_36.reqs
```
3. コネクタをインストールするには、次のコマンドを実行します
```
pip install snowflake-connector-python==2.7.6
```
4. 識別のためのおまじないと実行
```python
#!/usr/bin/env python
import snowflake.connector

# Gets the version
ctx = snowflake.connector.connect(
    user='<user_name>',
    password='<password>',
    account='<account_identifier>'
    )
cs = ctx.cursor()
try:
    cs.execute("SELECT current_version()") --クエリの内容
    one_row = cs.fetchone()
    print(one_row[0])
finally:
    cs.close()
ctx.close()
```
5.接続出来たら完了

### 参考ドキュメント
・チュートリアル
1. document
https://quickstarts.snowflake.com/guide/getting_started_with_snowpark_python/index.html?index=..%2F..index&_ga=2.224288541.703868965.1658195148-1647345815.1641543128#0
2. demo video
https://resources.snowflake.com/webinars-thought-leadership/live-demo-building-the-future-of-data-science-with-snowpark-for-python-2?_ga=2.229007002.703868965.1658195148-1647345815.1641543128
3. google colabとの接続
https://qiita.com/foursue/items/51920be756f1a0ab0bb7

・pythonコネクタ
1. SQLAlchemyツールキット
https://docs.snowflake.com/ja/user-guide/sqlalchemy.html

2. Python用Snowflakeコネクタ
https://docs.snowflake.com/ja/user-guide/python-connector.html

※SQLAlchemyとORM について
https://docs.pyq.jp/column/sqlalchemy_orm.html

SQLAlchemy
データベースにはMySQLやPostgreSQLなどいくつかの種類があり、コマンドなどに違いがあります。
※ORMは自動で使用するデータベースに合わせたSQLを生成して実行してくれます。
→ORMはSQLを多用する複雑なアプリケーションを実装するときに力を発揮します

※課題
PythonコネクタとSQLAlchemyの使い分け
shellで変数参照のfallbackを設定する

シェルで`$ set -u`を叩くとそれ以降変数参照に失敗すると`unbound variable`エラーが発生する。

https://explainshell.com/explain?cmd=set+-euo+pipefail


この設定下でもし変数が見つからない場合に、エラーを発生させるのではなく、フォールバックとしてある値を設定する方法は以下。


```sh
set -u

x=${UNDEFINED_VARIABLE_NAME:-unknown}
```


これでx=`unknown`が代入される。
Arduino UNOのADCとPort入出力を同時に測定するWindowsアプリ

## アナログ波形(5V)をとPORT IN/OUT(5V)を同時に操作可能なWindows GUI
Arduino UNOを使った簡易のADCを使ったオシロスコープとPort入出力を使ったポートアナライザー
(5Vの汎用出力も可能)なツールを作りましたので、使い方含めて下記に記します。
比較的安価で購入できるArduino UNOで簡易測定できて、教育用途などにも使えると思います。

### 概要
下記2つのツールをまとめたGUIツールとなります。
それぞれのツールでは、Arduino UNO 1台につき、1個しかSerial Portを共有できないため
併用するには、2台のArduino UNOが必要でした。Serial Portを共用で使用するため、タブ切り替えで両方の機能を使うことができます。

Arduino UNOのADCポート(Port A0～5)をGUIでグラフ表示します
https://qiita.com/Nomisugi/items/0c46fea9f80a5673285a

Arduino UNOでInput / Output をGUIでコントロールする
https://qiita.com/Nomisugi/items/c7f404af476ec399e3e9

下記Arduino UNOのAnalog IN専用ポートと PORT IN/OUT専用を両方使うソフトです。
![ArduinoUNO.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/96f814a1-3a15-7632-f41f-eb90c11d80ae.png)

### 使い方
1  Arduino UNOに Ardipy.inoを書き込む(PortControlerのプログラムと同一)
https://github.com/Nomisugi/Ardipy/blob/master/Ardipy01.ino

2  Ardipy_Combi_AD_PT.exeをダウンロード
https://github.com/Nomisugi/Ardipy/raw/master/bin/Ardipy_Combi_AD_PT.exe

3  Ardipy_Combi_AD_PT.exeを実行
![AD1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/fac276b2-43f2-591f-915c-3b245e8d3cd8.png)

4 ConnectボタンでArduino UNOと接続する
![ADPT2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/1b7268d4-022f-2858-62e9-ad230458d49f.png)
![ADPT3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/a3b65a30-cdeb-5fae-3d3a-22390d19ab7c.png)

接続成功すると、タブ切り替えで、ADCとPORTの波形が出力されます。

5 Arduino UNOのPort2出力と、ADC0入力を接続して出力波形を測定。
青い線のようにジャンパを接続して測定テスト
(ポート出力がコンフリクトする可能性もありますので注意、ボードが再起動される可能性があります)
![ArduinoUNO2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/5540c338-0bd8-e7f0-07e4-2efb9f57284b.png)


ポートを出力に設定して、HIGH/LOWを繰り返し出力
![ADPT7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/94f2e3f8-3c32-da28-3bcf-6a6fa9d1fca7.png)
ADC0の測定結果がポートの HIGH/LOWによって切り替わる事が確認できます。
![ADPT8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506495/61804167-39d6-c843-9a56-eb55bb0c5442.png)


このようにADCとポートを同時に使うことができるようになります。
どこかでスイッチをON/OFFにしてADC測定をするなどの用途に使えるかもしれません。
cscの作法 その247

# 概要
cscの作法、調べてみた。
ソースを実行ファイルに埋め込んでみた。

# 参考にしたページ

https://qiita.com/ymko/items/7cf9a19e03ba9dcebfaa

# 実行結果

```
>extract /e
ソース展開
infile : extract.cs
otfile : w_extract.cs
infile : README.txt
otfile : w_README.txt

>
```

以上。
cscの作法 その246

# 概要
cscの作法、調べてみた。
ドライブの使用量を算出してみた。

# 参考にしたページ

https://qiita.com/ymd65536-microsoft/items/739912113147941cfab8

# 実行結果

```
>dr0
呼び出し側が利用できるバイト数: 3GB
ドライブ全体のバイト数: 28GB
ドライブ全体の空きバイト数: 3GB
ドライブ全体の使用容量: 25GB

```

以上。
通信内容をlog catに出したい

# 初めに
今回は、`retrofit2`と`OkHttp`を使った通信処理の内容をlog catに出す方法を紹介していこうと思います。
すごく単純ではありますが大事な設定なので備忘録として残しておきます。
### 本文
まず、下記の内容をimportします。
最新のバージョンはこちらのリンクから確認してください。
https://github.com/square/okhttp/tree/master/okhttp-logging-interceptor
```kotlin
implementation("com.squareup.okhttp3:logging-interceptor:4.10.0")
```
あとはコードで実装するだけです。
```kotlin
.addInterceptor(
    HttpLoggingInterceptor().apply {
        level = HttpLoggingInterceptor.Level.BODY
    }
)
```
`OkHttpClient.Builder`を作成時に下記のコードを挿入するだけです。

### 最後に
実際によく使われてる機能なので、勉強中の方などのお役に立てれば光栄です。
今回は、log catに出す部分のみを紹介しましたが、下記の自分の記事で全体像を紹介したので、もしわかりづらい人は下記のリンクを参考にしてみてください。
https://qiita.com/ryuji_sato/items/bc7b4daeb30487c4d11e
rails new で発生したエラーについて

### __bundlerによる不具合__
今回、railsの環境構築の際にハマりかけたエラーについて備忘録としてまとめておきたいと思います。

### __概要__
railsのインストール等が完了し、新規プロジェクト作成の際にrails newを行ったところエラーが発生。

主なエラー表記は下記の通りとなります。
```
(defined?(@source) && @source) || Gem::Source::Installed.new
```

調べてみると、bundleそのものの不具合のようでこの時に使用していたバージョンはBundler version 2.3.7でした。

なので、以下の手順でbundlerのバージョンアップを行い、再度新規プロジェクト作成したところ問題なく完了しました。


```
#現在のbundleのバージョンを確認
$ bundle --version
Bundler version 2.3.7

#最新バージョンへアップグレード
$ gem install bundler
Fetching bundler-2.3.18.gem
Successfully installed bundler-2.3.18
Parsing documentation for bundler-2.3.18
Installing ri documentation for bundler-2.3.18
Done installing documentation for bundler after 0 seconds
1 gem installed

#完了後、bundleのバージョン確認
$ bundle --version
Bundler version 2.3.18

$ rails new hello -force -database=mysql

```

>また、この他にも私はMacBook購入当初にXcode必要ないだろうということで削除したのですが、それによってハマってしまったうっかりミスがありましたので、それについてはまた後日記述しようと思います。
Saelsforceのメールの宛先でデフォルトでCCを複数設定する方法

Salesforceからメールの送信方法はいくつかあり、例としてレコードページからメール送信が可能です
![宛先CC1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/75a75c5a-030e-a7b8-f06a-6d58e2c3c1b7.png)


上記画像について右部からメール送信が可能です。


こちらのメール送信設定について、デフォルトで複数のCCを設定できるのでお伝えします


まずは設定方法です
「グローバルアクション」から「メール」を選択。「定義済み項目値」から「新規」ボタンをクリックします
![宛先CC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/d7e7ec8d-3772-12cb-7249-c9b88b18be79.png)


数式の値にデフォルト設定したいCCを記載します。

例えば
・AA@gmail.com
・BB@gmail.com
の２つのメールアドレスをデフォルトで設定したい場合、記載する数式は
"AA@gmail.com,BB@gmail.com" 
です

![CC3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/567e0839-901f-de23-c2d9-9fe4af9d3f16.png)

以上で完了です。この設定をすればデフォルトで複数のCCを設定してメール送信が可能になります
![CC4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/99649563-41f5-a922-b49e-c6fb105da3c1.png)
【Python】文字列差分検出

# 概要
ある文字列を別の文字列に変換したい時がある。
何文字目を削除し、何文字目に何を追加すればよいかを表示する処理を以下に示す。

# 処理
`difflib`モジュールの`ndiff`メソッドで実現できる。
https://docs.python.org/ja/3/library/difflib.html

```Python
import difflib

def diff(a,b):
    print('{} => {}'.format(a,b))  
    for i,s in enumerate(difflib.ndiff(a, b)):
        if s[0]==' ': continue
        elif s[0]=='-':
            print(u'Delete "{}" from position {}'.format(s[-1],i))
        elif s[0]=='+':
            print(u'Add "{}" to position {}'.format(s[-1],i))    

cases=[('afrykanerskojęzyczny', 'afrykanerskojęzycznym'),
       ('afrykanerskojęzyczni', 'nieafrykanerskojęzyczni'),
       ('afrykanerskojęzycznym', 'afrykanerskojęzyczny'),
       ('nieafrykanerskojęzyczni', 'afrykanerskojęzyczni'),
       ('nieafrynerskojęzyczni', 'afrykanerskojzyczni'),
       ('abcdefg','xac')] 

for a,b in cases:     
    diff(a,b)
    print()
```

# 実行結果
```Python
afrykanerskojęzyczny => afrykanerskojęzycznym
Add "m" to position 20

afrykanerskojęzyczni => nieafrykanerskojęzyczni
Add "n" to position 0
Add "i" to position 1
Add "e" to position 2

afrykanerskojęzycznym => afrykanerskojęzyczny
Delete "m" from position 20

nieafrykanerskojęzyczni => afrykanerskojęzyczni
Delete "n" from position 0
Delete "i" from position 1
Delete "e" from position 2

nieafrynerskojęzyczni => afrykanerskojzyczni
Delete "n" from position 0
Delete "i" from position 1
Delete "e" from position 2
Add "k" to position 7
Add "a" to position 8
Delete "ę" from position 16

abcdefg => xac
Add "x" to position 0
Delete "b" from position 2
Delete "d" from position 4
Delete "e" from position 5
Delete "f" from position 6
Delete "g" from position 7
```
ブラウザからLambdaを実行


### IDプールの作成
Cognito > IDプール管理 > 新しいIDプールの作成
認証時のロール、未認証時のロールがcognitoによって作成される

### IAM権限設定
用途に合わせて認証時のロールまたは、未認証時のロールにInvokeFunction権限を付与する

### javascript(ES6)
```javascript
const { CognitoIdentityClient }   = require("@aws-sdk/client-cognito-identity");
const { fromCognitoIdentityPool } = require("@aws-sdk/credential-provider-cognito-identity");
const client_lambda               = require("@aws-sdk/client-lambda");
const REGION = "ap-northeast-1";
const lambda = new client_lambda.Lambda({
    region:      REGION,
    credentials: fromCognitoIdentityPool({
                     client:         new CognitoIdentityClient({ region: REGION }),
                     identityPoolId: "(cognito_pool_id)",
                 })
});

let param = {
    FunctionName:   '(lambda_function_name)',
    Payload:        JSON.stringify({ aaa: 'aaa', bbb: 'bbb' }),
    InvocationType: 'RequestResponse'
};

lambda.invoke(param, (err, data) => {
    if (err) {
        console.log(err, err.stack);
    }
    let resp = JSON.parse((new TextDecoder).decode(new Uint8Array(data.Payload)));
    console.log(resp);
})
```

あとはwebpackとかでいい感じにしてからブラウザで実行
ハードはそのまま技適を通ってないWi-Fi、BLEボードを合法的に使う

# はじめに
私は過去、同じ[テーマで執筆して](https://qiita.com/maclineto/items/0a1e7e56a002aeb858f9)いますが、この度別所で私が聴いたのと別の解釈が総務省より示されていることを聞きました。
総務省相談課の木上さまは2018/03/28 「ダミーロードを掛けても電波はでる。微弱無線局の基準を満たしていなければダミーロードを付けてもだめ。」
という解釈を示したのですが、別の方が、
「ダミーロードさえつけれればOK」
と言っているというのです。

# まずは
電話しました。2022/07/20 09:05am 電波利用環境課の洞様のお世話になりました。
技適を通ってないBLE、Wi-Fi機器の電源を入れると電波を出さなくても違法だというのは本当ですか？
はい、無線局の開設になるので違法です。
ダミーロードを付けた場合はどうでしょうダミーの性能や、出力によっては電波出ますでしょう？
それはケースバイケースですね。
電波が出せない状態とおっしゃるのなら、Wi-Fiを禁止すれば電波は出ませんよねえ。

# 【新解釈】ソフトで止めていい
いえ、電源初期化した時など、デフォルトに戻って、電波が出ることがあるのでダメです。
いいえ、Device Driverを削除してしまえば、自動的にロードされることはないですね。これだとイニシャライズしても電波は出ません。

それはOKです。送信ソフトが一切ないのなら無線局ではありません。
# えええええええええええええええええええええええええええええ

確かに、聞いたぞ！
機内モードはダメだけど、デバドラ取っちゃえばいいってことだよね。
では、具体的にどうすればデバドラを取って、総務省が指定する要件を満たすか？
[別稿で操作例を書きました。](https://qiita.com/maclineto/items/a6706156186ba2f4b71b)

# 公式見解を聞く
別紙様式１
総務省法令適用事前確認手続（照会書）

令和　　4年　　7月　　21日

　総　務　大　臣　殿

照会者名 合同会社アグリハイテック　代表社員　牧野繁　　 
住所（法人等にあっては主たる事務所等の所在地）
〒350-1101 埼玉県川越市xxxx　　　　　　　　　　　　　　　　　　　　　　
連絡先
電話番号：049-233-xxxx FAX番号：　　　　　　　  
電子メールアドレス：xxx@agri-hitech.com　　　　　　 　　　　　　　 


　総務省法令適用事前確認手続規則（平成13年８月29日総務省訓令第197号）第３条第２項の規定に基づき、下記のとおり照会します。
　なお、照会及び回答内容が公表されることに同意します。

記

１　法令の名称及び条項
	電波法第二条４ 、電波法第四条

２　将来自らが行おうとする行為に係る個別具体的な事実
	技適未認可の無線LAN電子回路を含むCPUボードにおいて、該電子回路がいかなる場合も機能せず電波を発射しないよう作成されたソフトウエアを搭載し運用する。

３　当該事実が照会法令の適用対象となる（ならない）ことに関する照会者の見解及び根拠
		見解：電波法第四条の「無線局の開設」に該当しないので適法である。
		根拠：電波を発射しない機器は電波法第二条４の無線設備に該当しない。

# 電話があった
2022年07/25 09:12am 総務省から電話がありました。
役所がそんなに早く動くわけないと思いながら話すと「添付だけで本文がないメールが届いたので連絡した」旨だった。
でもちょっと不思議。
- 電話番号は添付のワードに書いてある。
- 「セキュリティー上」の問い合わせなら「開けちゃったら手遅れ」じゃないか？
- メールで送ったのに、電話で問い合わせ。
- 本文があるのは「セキュア」か？

本文を付けて送り直しました。
# 問い合わせ
2022年8月12日総務省より問い合わせがありました。
----
弊省政策評価広報課あてに提出のあった、
7月21日付け標記手続きの照会書につきまして、不明な事項など、
ご対応いただきたい点がございましたため、ご連絡いたしました。

１.　対象法令の名称及び条項に、電波法第二条４を挙げられていますが、
　電波法第二条は本制度の対象外となりますため、削除いただけますでしょうか。

２.　将来自らが行おうとする行為に係る個別具体的な事実について、
　「該電子回路（当該でしょうか？）がいかなる場合も機能せず電波を
　発射しないよう作成されたソフトウェアを搭載」とありますが、
　具体的にどのようなハードウェアとソフトウェアになりますでしょうか。
　照会にあたり明確に記載いただく必要があるかと考えております。

３.　根拠について、
　無線設備に該当しないと判断する理由、見解と根拠との関係性が現記載では読み取れません。
　照会者様の見解及び根拠について、もう少し詳しくご記入いただけないでしょうか。
　また、本制度では、当該行為が総務省所管法令の対象となるかどうかを確認する制度
　となっておりますところ、「適法である。」という見解の記載については、
　「当該条項の適用対象とならない。」という理解でお間違いないでしょうか。

４.　２の項に関連して、具体的な事実について確認させて下さい。
　当該電子回路については、そのソフトウェアを搭載した後、
　不要な電波の発射を含めて、実際に電波が出ていないこと等は、
　照会者様が（電波暗室等で）測定して確認していらっしゃるのでしょうか。

どうぞよろしくお願い申し上げます。
初めてのSpringBootでのアプリケーション作成(環境構築編)

# 概要
本記事では、プログラミング初学者が初めてWebアプリを作成してみて詰まったことや困ったことなどをまとめました。今回は環境構築編です。

基本的には以下の記事で作成しているポモドーロタイマーと同じものを作成しています。
設計やコードなどはほぼほぼ一緒ですので詳細はそちらをご参照ください。

https://qiita.com/Shiho_anyplus/items/59a93b1fcb09b6ef8e81


## 作成したアプリ画面
参考元の記事と少し違いますがcssの変更によるものだけで機能は同じです。
![スクリーンショット (520).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629104/020fed79-26af-7958-ffef-6b7040c5701a.png)


### 環境
- Windows10
- Eclipse 2021
- Java 11
- PostgreSQL14


# 作業してみて詰まったこと・困ったこと
Eclipseは使える！記事も読んだ！けどどこから手を付けたらいいんだろう…
と困ってしまったので参考元の記事で当たり前のように使っているデータベースやライブラリの準備からコードを書いて実装するまで、調べながらどうにかしたことを書いていきます。

## 環境構築編
データベースやライブラリを使っているみたいだけどそれってどう使うの？インストールとか必要なの？何から手を付けたらいいの？といった具合でコードを書くより先にわからないことだらけだったのでまずはそこから頑張りました。


### データベース作成
データベースはPCにダウンロードして使うみたいです。
ということでPostgreSQLをダウンロードしデータベースを作成します。
それぞれの手順で参考にしたサイトは以下の通りです。

 - インストール
　　> https://shimapuku.com/programming/java-basic/postgresql-pgadmin4-eclipse-part2)
基本デフォルトのまま進めました。

 - コマンドプロンプトでログイン
　　> https://qiita.com/wb773/items/c2fd0e1e0349a41b5844
デフォルトでインストールした場合はログインに使うパラメーターは以下の通りです。
```
ホスト　　　　：localhost
ポート番号　　：5432
ユーザー名　　：postgres
データベース名：postgres
```

 - データベースの作成
　　> https://www.javadrive.jp/postgresql/database/index2.html
以下のデータベースを作成します。

```
データベース名：timerdb
```

 - テーブルの作成
　　> https://www.javadrive.jp/postgresql/table/index1.html#section3
作成したテーブルは元記事と全く同じものです。

>今回私はコマンド操作の練習も兼ねてコマンドプロンプトでデータベースとテーブルの作成を行いましたが、インストールで参考にしている記事ではpgAdmmin4を使用してGUIでテーブル作成まで丁寧に解説してくださっていますので、CUIでもGUIでもやりたい方で進めたらいいと思います。


### 必要なライブラリのインストール
ライブラリもPCにインストールしてから、使うファイルをEclipseにインポートしたらいいみたいです。
それぞれ以下のリンクのサイトを参考にしました。
 - jQuery3.6.0
　　> https://www.tairaengineer-note.com/jquery-download/
 - countdownTimer(GitHubからのダウンロード方法)
　　> https://web-camp.io/magazine/archives/85850 
 - Bootstrap5.0.2
　　> https://udemy.benesse.co.jp/development/system/bootstrap-usage.html
<br>

 - Eclipseへのインポート方法
 



` プロジェクト上で右クリック ` → ` インポート ` → ` ファイル・システム ` → ` 参照(R)... `
→ 任意のファイルを選択し ` 完了 `

<img width="350" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629104/9cc1ee34-ac5a-f1c5-b0fe-fea0252c9c0c.png>
<br>
<img width="430" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629104/afa78fe2-2066-c0f1-65cb-30e71576ec79.png>
<br>
<img width="430" alt="image.png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629104/86110694-655f-c34d-e116-b8c05f9d9a9f.png>
<br>
<img width="300" alt="cutスクリーンショット (251).png" src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2629104/d9602cf3-7574-8727-f04f-a7ee5ba80f6e.png>


無事にインポートできたら、アプリの作成に必要な準備は終わりです。


# まとめ
以上、初めてのSpringBootでのアプリケーション作成(環境構築編)でした。
Webアプリを作るというとコーディングに不安を覚えてしまいますが実際には環境構築の段階から難しいんですね。初学者の私にとってはそれすら新しい発見でした。
というわけで環境構築が出来たら次はいよいよ実装編です。
実装でもたくさん困ったことや上手くできなかったことがありますので、そちらの記事も見ていただけたら幸いです。
長期インターンの振り返り〜半年終えて〜

# はじめに

実際に長期インターンって何するの？と疑問を持っている人向けに、自分自身が長期インターンの中でおこなっている業務内容、インターンを通して得たものを中心にまとめようと思います！

# 自己紹介

自分は現在、東京大学非情報系学部３年の学生です。インターンに参加する前は、プログラミング自体は授業で触ったことはあるけど、、、というレベルでありましたが、2022年1月からインターンに参加させていただいています。インターンに参加させていただいて半年が経ってこの記事を書いています。

# インターンに参加するまで

プログラミング経験はあまりなかったものの、将来幅広い分野（研究、就職）において、プログラミングは必要になってくるのかなと素人なりに感じていました。そんな時、先にこのインターンに参加していた友人から体験談を聞いて、このインターン魅力的に感じ、応募しました。  
その後、面接して、採用していただきました。面接では、聞かれることに従って、自分自身の自己紹介、どのくらいの期間インターンに参加できそうか、参加動機などをカジュアルに話しました。

# 業務内容

勤務時間としては、週2回10時間を目安に勤務しています。   
  
## 一ヶ月半程
最初三週間ほどは、環境設定していきながら、gitやコマンドライン等、業務に必要不可欠なものを学びました。環境設定に関しては社員の方に詳しく教えていただきながら進め、必要なツールの学習は基本自分で調べ学び、わからないことが出てきたら質問させていただいてました。    
その後三週間ほどは、実際のプロジェクトのソースコードをみながらプログラムがどう動いているか確認していきました。理解の補助として、キーワードとなってくる用語を教えていただき調べ、webアプリケーションの仕組みや、コンピュータの基礎知識、awsの仕組みなども学んでいきました。  
この一ヶ月半ほどは基本的なことがわからないことだらけで、早く仕事できるようになりたくて、家でも特に学ぶ時間をとるようにしてました。
## 一ヶ月半〜現在
一ヶ月半ほど経った辺りから実際にプログラムを修正することをするようになりました。とは言ってもいきなり難しいことをやるわけではなく、ちょっと頑張ればできそうなことをやらせていただいてました。どのような手順を踏めばよいかも教えていただいてました。その中でわからないことが出てきたらその都度調べ、学んでいき、少しずつ業務の幅が増えていきました。

基本的な流れはこんな感じです。（業務指示をいただく→それを元にコードを書く→わからないことがあったら調べる→それでもわからなければ聞く）

その後今に至るまで、より難度の高いタスクに挑戦しながら、幅広いことをやらせていただいてます。




# インターンを通して得たもの
- プログラミング技術  
これは当たり前なのかもしれませんが、初期と比較して、技術がついたと感じております。  

- 情報を正確に伝える力  
タスクが今どういう状態にあるかを正確に伝えることで、全体として効率よく業務したり、直面している課題に対して正確にフィードバックしていただいたりできるため、業務する上で意識しています。  
  
- 課題解決能力  
ひとつの課題があったときに、細分化して考えたり、図としてイメージし、ステップに分けて課題に取り組むことを意識しています。
  

# まとめ
社員の方、インターン生の方ともに和気藹々とした雰囲気でありつつも、メリハリを持って業務に真面目に取り組んでいるため、非常に刺激を得られます。
業務を通じてプログラミング技術を本気で学びたい人にとっては非常におすすめです！