OmniAICreator/Qiita-1.07M huggingface dataset:
LINEで送った画像をS3に保存する(LINE Messaging API x AWS )

LINEで送った画像をS3に保存したい。
# 動機
・AWS rekognitionでいろいろ遊べたら良いなあ
・そのためにはまず画像を用意せねばなあ
・一番使いやすいプラットフォーム(⊃LINE)でできたら良いなあ

# LINE公式アカウントとAWSの連携
LINE公式アカウントの登録、およびLINEとAWSとの紐付けに関しては以下の記事を参考にさせていただきました。
[API GatewayとLambda(Python)でLINE BOT(Messaging API)開発 [前編]](https://qiita.com/w2or3w/items/1b80bfbae59fe19e2015)

構成は下記の通りです。
![line_to_s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1989761/5b3ff3c6-edd3-19a7-39d9-a67ba8d16bea.png)

# S3に画像を保存するLambda
実際に、S3に画像を保存するためのコード(python)をAWS Lambdaに書いていきます。

```python:lambda_function.py
import requests
import os
import json
import boto3
from io import BytesIO

#-- Lambdaの環境変数でLINE_CHANNEL_ACCESS_TOKENを登録しておく
LINE_CHANNEL_ACCESS_TOKEN = os.environ["LINE_CHANNEL_ACCESS_TOKEN"]

#-- Headerの生成
HEADER = {
    'Content-type':
    'application/json',
    'Authorization':
    'Bearer ' + LINE_CHANNEL_ACCESS_TOKEN,
}
BUCKET_NAME='xxxxxxxx'

s3 = boto3.resource('s3')
def lambda_handler(event, context):
    body = json.loads(event['body'])
    for event in body['events']:
        #-- LINEからimage（画像)が届いた時
        if event['message']['type'] == 'image':
            #-- 1. 画像を読み出し
            MessageId = event['message']['id']  # メッセージID
            ImageFile = requests.get('https://api-data.line.me/v2/bot/message/'+ MessageId +'/content',headers=HEADER) #Imagecontent取得
            Image_bin = BytesIO(ImageFile.content)
            Image = Image_bin.getvalue()  # 画像取得

            #--2. xxxx.jpgに保存
            filename='xxxx.jpg'
            obj = s3.Object(BUCKET_NAME,filename)
            obj.put( Body=Image )
            print('file %s saved at %s!' %(filename,BUCKET_NAME))
            msg='画像が保存されました!'
        else:
            msg='画像が送信されていません!'

        #-- LINEに返す情報
        REQUEST_MESSAGE = [
        {
        'type': 'text',
        'text': msg,
        }
        ]
        payload = {'replyToken': event['replyToken'], 'messages': REQUEST_MESSAGE}
        
        #-- HEADERとmessages(payload)を付加してpost
        if len(payload['messages']) > 0:
                response = requests.post(
                'https://api.line.me/v2/bot/message/reply',
                headers=HEADER,
                data=json.dumps(payload)
                )
    return 0
```

上記のコードにより、「LINEで送った画像がS3バケット(BUCKET_NAME)に保存される」ことを確認できました。
LINEから画像が送信されれば、LINEに「画像が保存されました！」と返ってきます。
画像以外が送信されていた場合、「画像が送信されていません!」と返ってきます。
このあたりは変数msgに格納しています。
# 補足
ちなみに、S3に保存するとき、下記のようにkeyをスラッシュで区切ると、階層構造で保存できます。

```python:lambda_function.py
obj = s3.Object(BUCKET_NAME,'foo/bar/hoge.jpg')
```

今後は、S3に保存された画像を別の場所で読み出したり(JSなどWeb系で使うとか)、
送られてきた画像をAWS rekognitionに食わせたりしてみようと思います！
STM32L010でLチカ(VSCのCubeIDE)2(★★★★★「動きました。」)


x cubeideは、初心者ころしである。
x MXは、動ないと思っていた　初心者にトラブルの自己解決は、不可能?
x CubeMXでnecleo-l011を選択
x VSCでnecleo-l011を選択(visual studio code)
x 動けば正義、細かい事を気にするな(創造主は神)
x STM32L010F4P6との違い、ピン数、内部温度センサー、コンパレータ
x PlatformIOと言うらしいが超ムズ(以下省略)(誰かに手伝ってもらいましょう?)

目的
stm32l010でPB1を光らせる
改造 PB3->PB1 , PA15 -> PA3
下記をインサートした



```c++


        HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET);

        HAL_Delay(1000);

        HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);

        HAL_Delay(1000);


```

nu_l010_pb1_1内をいろいろ適当にコピー



https://os.mbed.com/users/caa45040/code/f303_h_p1/


ハード


https://akizukidenshi.com/catalog/g/gI-15689/



STM8/STM32ライタ


https://www.aitendo.com/product/16082



![o_con103.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/5d5ce8e2-9def-d1bb-fe09-add4a3ee575c.jpeg)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/9f341b04-c700-0437-5980-8844b6742c17.png)







![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ee7e0564-c9cc-4576-31a6-ab374803074d.png)




![o_con134.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2cb314d7-b569-c1b4-e3d5-8aafbc5e6d57.jpeg)
NAG Fortran 7.0 で NetCDF-3.6.3のインストール

[**NAG Fortran 7.0**](https://www.nag-j.co.jp/nagfor/index.htm) は初期化漏れの検出をはじめ，コンパイラのチェック機能が秀逸と感じています．しかし，情報が少ないのが難点です．本記事は海洋流動モデル [**FVCOM 4**](http://fvcom.smast.umassd.edu/) で必要となる [**NetCDF-3.6.3**](https://www.unidata.ucar.edu/software/netcdf/release-notes-3.6.3.html) （リンク切れのようですが，[**こちら**](https://www.gfd-dennou.org/library/netcdf/unidata-mirror/) からダウンロードできました）のインストールの備忘録です．[**NetCDF-3.6.3**](https://www.unidata.ucar.edu/software/netcdf/release-notes-3.6.3.html) と古いバージョンにしたのは 最新版の **FVCOM 4.4.2** でも標準に採用されており，インストールの敷居が低いと思われるためです．
環境は Windows 10 Pro (64bit) の WSL2 の Ubuntu 20.04LTS とし，NAG Fortran Compiler 7.0 と GNUコンパイラ がインストールされていることを前提としています．また，[**netcdf-3.6.3.tar.gz**](https://www.gfd-dennou.org/library/netcdf/unidata-mirror/netcdf-3.6.3.tar.gz) を適当なディレクトリにダウンロード済みとします．以降の作業はこのディレクトリで行います．また，システムではなく，ホームディレクトリ（`/home/teem/` とします）以下の `/home/teem/local/netcdf-3.6.3-nag/` にインストールします．

## ビルドスクリプトの作成と実行
ビルドスクリプト build_netcdf363_nag.sh を作成し，`chmod a+x build_netcdf363_nag.sh` で実行権限を付与します．NAG Fortran 7.0 のコンパイラオプション情報は [**こちら**](https://www.nag.com/nagware/np/r70_doc/nagfor.html) です．

```bash
#!/bin/bash
# build_netcdf363_nag.sh
export CC=gcc
#export CXX=g++
export CFLAGS=-O3
#export CXXFLAGS=-O3
export F77=nagfor
export FC=nagfor
export F90=nagfor
export FFLAGS="-O3 -mismatch_all"
export CPP=cpp
export CPPFLAGS=-Df2cFortran
#export CXXCPP=cpp
tar xf netcdf-3.6.3.tar.gz
cd netcdf-3.6.3
./configure --prefix=/home/teem/local/netcdf-3.6.3-nag --disable-shared
make
make check
make install
```

このスクリプトを実行し，無事インストールに成功しました．

```bash
./build_netcdf363_nag.sh
```
chromebookのLinux（Debian)のバージョンを11に上げてみる

chromebookのLinux(Debian)のバージョンは10.11でした。
どうやら11に上げることができるようなので、やってみました。

基本的に以下のサイトを参考にやっていくだけです。

https://www.bchari.com/2021/09/cloudready-linux-upgrade.html

##確認作業
まずはバージョンの確認から。

```
$ cat /etc/debian_version
10.11
```

パッケージマネージャーの確認。

```
$ cat /etc/apt/sources.list
# Generated by distrobuilder
deb https://deb.debian.org/debian buster main
deb https://deb.debian.org/debian-security buster/updates main
```

##アップデート作業開始

まずはaptitudeをインストール

```
$ sudo apt-get update
$ sudo apt install aptitude
```

etc/apt/sources.listを編集します
busterをstableに、contribを追加します

```
$ sudo vi /etc/apt/sources.list
deb https://deb.debian.org/debian stable main contrib
deb https://deb.debian.org/debian-security stable/updates main contrib
```

では、Debianをアップデート！！

```
$ sudo aptitude update
$ sudo aptitude full-upgrade
```

いろいろ警告的なのも表示されてましたが、とりあえずエラーで止まることもなく終了。これでいいのかな？
ってことでバージョン確認。11.1になっていました。

```
$ cat /etc/debian_version 
11.1
```

で、InkscapeってLinux版あったのですね。
入れてみたところ1.0.2が動作しました。
とりあえず成功かな。
Power Automate: paiza のキャンペーン Tweet を楽に

# 背景
Paiza の [【第2回】学習積み上げ報告キャンペーン](https://paizasupport.zendesk.com/hc/ja/articles/4408062818073) が始まってます。
これへの参加が、Tweet回数ってことだったので・・毎日するの面倒だなって思ったので対処

# 概要
1. Twitter API Key/Secret 取得
1. [Post a tweet](https://docs.microsoft.com/ja-jp/connectors/twitter/#post-a-tweet) を利用
1. 定期動作で動かすだけ

最終的には、こんな感じのを毎日定期的に Tweet
勿論、まじめに手作業投稿も 
あとは、1000円当たらないかなと祈るだけ:yum: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/be1710b5-e205-f240-1932-f0ea761f7854.png)


## Twitter API Key/Secret 取得
[Developper Portal](https://developer.twitter.com/en/portal) で 取得
初回は、登録の為の同意とかがあるけど、言われたまま進めればOK
以下から取得出来る筈
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/a55bd541-c028-cdc7-3b3f-9b4d48aee7f4.png)

デフォルトの接続を選択すれば、以下のような画面でログインしてアプリ承認するだけでしたが・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/55d245b0-014b-22ba-dd6b-9c47fdfde55f.png)


## [Post a tweet](https://docs.microsoft.com/ja-jp/connectors/twitter/#post-a-tweet) を利用
キャンペーン文章は以下なので、ハッシュタグを三点コピペしておく
> 実施期間内に、paizaラーニングを活用した日々のプログラミング学習について、指定のハッシュタグ3つ「#paizaラーニング」「#今日の積み上げ」「#プログラミング」をつけてTwitterに投稿する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/35eb0038-3650-2307-5f51-5856a4f027b5.png)

## 定期動作で動かすだけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/eb7d52cb-ee66-4d94-e571-84f7b547c65d.png)
Laravel 外部制約キーのカラムを削除する

# はじめに
外部制約キーを設定しているカラムを削除する際のマイグレーションファイルの記述方法について記します。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [カラムの削除](#カラムの削除)

<!-- 各チャプター -->
# カラムの削除
以下のコマンドでカラム削除用のマイグレーションファイルを作成します。
ファイル名は基本的に任意ですがプロジェクト全体で統一感があり、分かりやすいものにしましょう。

```
$ php artisan make:migration drop_user_id_to_posts_table --table=posts
```
<br>

__概要__
postテーブルのuser_idカラムを削除する前に外部制約キーを削除する。
外部制約キーを解除せずに、マイグレーションを行うと整合性違反でエラーが起きてしまう為、カラム削除処理(dropColumn)を行う前にdropForeignで外部制約キーを外す。

__dropForeignの引数__
「postsテーブル」の「foreignキー（外部制約キー）」である「user_id」　→'posts_user_id_foreign'

```
public function up()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->dropForeign('posts_user_id_foreign');
            $table->dropColumn('user_id');
        });
        
    }
```
<br>

__constrained__
この外部制約キーが引数に指定したテーブルのものである事を指定しています。
この場合、user_idはpostsテーブルの外部制約キーである事を指定しています。

```
public function down()
    {
        Schema::table('posts', function (Blueprint $table) {
            $table->foreignId('user_id')->nullable()->constrained('posts');
        });
    }
```
【Rails/carrierwave】画像データをsubmitしたらバリデーションエラーになった話

##やりたかったこと##
ユーザが画像を投稿する際に、投稿確認画面で内容確認後、画像投稿を完了させる。

##実行環境##
ruby 3.0.1
Rails 6.0.4.1

**使用gem:**
carrierwave
pry-rails （デバッグで使用のため）

##問題##
①確認画面(confirm view)から投稿ボタン(form_submit)を押すと、バリデーションエラーが発生する
②モデルに設定したバリデーションを解除し、再投稿したらNil location provided. Can’t build URI.が発生する
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259269/5f93d55f-bbb4-a6a4-ac49-582f527ab862.png)

##問題の発生理由##
**new viewからconfirm viewにページが移る際に画像のデータが渡されずに消えてしまう。**
①は確認画面に移る際にユーザーから渡された画像データがロストしてるため、画像データを挿入したフォームデータはNilとなり、モデルに設定したバリデーションに基づいてバリデーションエラーとなった。
②は画像データの入る(※)カラムはNilの状態でsaveされたため、実際の画像データがあるURLを取得出来なかった。
※ 実際にDBに登録されてるのは画像データそのものではなく、画像データの場所を記したURLが格納されている。

##解決手段##
Carrierwaveのキャッシュ機能(※)を使用する
※キャッシュ機能とは、"public/uploads/"フォルダ内にアップロードされたファイルを"public/uploads/tmp/"へコピーして再利用出来るようにする仕組みです。

**Carrierwaveのキャッシュ機能を使うためには以下の2点を行う必要があります。**
１．Viewに「form.hidden_field :<カラム名>_cache」を追記する。
※form.hidden_fieldとは、View上に入力フォームを生成せずに受け取った値を保持するためのフィールド

```Ruby
# 例)confirm.html.erb
# 省略
 <%= form.hidden_field :image_cache %>
# 省略
```

２．上記１のhidden_fieldで値を保持したデータを受け取るために、ControllerのStrong Parametersに "<カラム名>_cache" を追記する。
実際のモデルやテーブルはキャッシュを格納する属性やカラムを持っていないため、イメージしづらいので注意。

```Ruby
# 例) controller
  private
  def picture_params
    params.require(:picture).permit(:image, :text, :image_cache)
  end
```


##補足という名のメモ##
問題②が発生してしまった場合は対象レコードを削除しないと、対象レコードの情報をViewで表示する際に毎度エラーが発生してしまうため、レコードを削除する必要があります。

```Ruby
# 例)
Picture.all
#=> 結果省略

@picture = Picture.find(x) #.all等で確認した際にimage等のカラムがnilになっていたIDを指定する
@picture.destroy
```

検証のためにモデルのバリデーションを解除している場合は元に戻す


久しぶりにガッツリ沼ってしまったので、解決出来てよかった～

##参考文献##
[carrierwave github](https://github.com/carrierwaveuploader/carrierwave#making-uploads-work-across-form-redisplays)
[[Rails6]CarrierWaveを基本に忠実に使ってみる~キャッシュ・S3編~](https://techtechmedia.com/cache-carrierwave-rails/)
[【Rails】CarrierwaveのCache機能を使用し、バリデーション後の画像データを保持する方法](https://techtechmedia.com/cache-carrierwave-rails/)
[Railsガイド 4.5 Strong Parameters](https://railsguides.jp/action_controller_overview.html#strong-parameters)
【C#】.NET6でBlazor WebAssemblyのAOTを試してパフォーマンスを測定してみた

初投稿です。
## 導入
ついにきましたね、.NET 6。
この記事( https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-6/#blazor-and-mono )によると
Blazor WebAssemblyにAOTコンパイルが実装され16倍早くなったらしいのですが、実際どれくらい早くなったか試してみました。

## 測定内容
10^6以下の素数を列挙するのにかかる時間を測定してみました。n=10^6として以下の関数の実行にかかる時間の測定を10回行い、平均と最大をとりました。
Blazor WebAssemblyは.NET6でReleaseビルド、AOTあり/なしを測定しました。
比較用に.NET6でのConsoleアプリケーションでの結果もとりました。
AOTを有効にするには公開(Publish)を実行する必要があります、普通に実行するだけではうまくいきません。
ちなみに、AOTなしに関しては.NET5/.NET6で差がみられなかったので.NET5は省略しています。

```cs
private IEnumerable<int> FindPrimes(int n)
{
    if (n < 0)
    {
        return Array.Empty<int>();
    }

    var isPrime = new bool[n + 1];
    Array.Fill(isPrime, true);
    isPrime[0] = false;
    isPrime[1] = false;

    for (int i = 2; i < isPrime.Length; i++)
    {
        if (!isPrime[i])
        {
            continue;
        }
        for (int j = i << 1; j < isPrime.Length; j += i)
        {
            isPrime[j] = false;
        }
    }

    return isPrime.Select((x, i) => (x, i)).Where(tuple => tuple.x).Select(tuple => tuple.i);
}
```

## 環境
+ OS Windows10 64bit(21H2)
+ CPU Ryzen7 1700 (＠3.7Ghz)
+ RAM DDR4-3000 16GB (十分な空きあり)

## 結果
|環境|平均値|最大値|
|:-:|:-:|:-:|
|Blazor AOTなし|1986ms|1995ms|
|Blazor AOTあり|574ms|579ms|
|Console|50.8ms|124ms|

## 考察
純粋な計算での比較でしたが3.4倍以上は高速化されており、効果は大きいようです。
しかし依然としてコンソールアプリケーションよりは10倍以上遅い
もう少し早くなってくれるといいんですがね、今後に期待しましょう。
デフォルト引数は意図がわかるように使いたい

コードレビューをしていて、使わないのにデフォルト引数を実装しているのを指摘することが多いです。
今後引数に渡し忘れてもいいように実装しているのかもしれないが、渡し忘れても動作するのはリスクが高いと思っています。
デフォルト設定を採用する場合、どうして採用したかがわかるような使い方がいいと感じたため、例を残しておきます。
（Rubyに関わらず当てはまると思うが、Rubyだと意識している人が少ないのかもしれないです。）

## 悪い例

この例では、arg2を引数に渡さないパターンが存在せず、今後の実装でarg2を渡し忘れた場合もエラーにならないため、
意図しない挙動をしても検知しにくくなってしまっています。

```ruby
def do_something(arg1, arg2 = 0)
  arg1 + arg2
end

# arg2が未設定で使用するパターンが存在しない
do_something(1, 2)
do_something(2, 3)
```

## 良い例

この例では、arg2を使用しないパターンが存在しているため、
基本的にはarg1だけを渡す形で使用し、arg2は必要な時だけ渡す必要があることが自明になっている。
こうなっていれば、arg2を渡さないことに意味が生まれるため、実装や仕様が把握しやすくなる。

```ruby
def do_something(arg1, arg2 = 0)
  arg1 + arg2
end

do_something(1)
do_something(2)
do_something(1, 3)
```

仕様をどのようにコードに内包させるか、という点に焦点を当てた話なので、例が難しく伝わりづらいかもしれないです。
MySQL 備忘録


MySQL に入る

## ログイン

```
mysql -u [user_name] -p

mysql -u root -p
```

## ログアウト

```
mysql > exit
mysql > quit
```

## データベース操作

SQLコマンドはセミコロンが必要。

データベース一覧を確認

```
mysql > show databases;
```

指定したデータベースを使用

```
mysql > use [database_name];
```

データベース内のテーブル一覧を確認

```
mysql > show tables;
```

テーブルのカラムを確認するときに使用。

```
mysql > select * from [table_name] limit 1;
```
Git Hub LFSを使ってみた


gitを使って、デザインで使うファイルをバージョン管理してみようとした時、gitには100MB以上のファイルはupできないことが判明しました。
どうにか、バージョン管理できないか調べているとGit LFSを見つけました。

環境:Mac OS monteray

### Git LFS(Git Large File Storage)
大容量のファイルをバージョンする際に、使用する拡張機能。
その名の通りですね。
イラストレーターなどのファイルは大きく管理できないために使用しました。

```common_lisp
git lfs track "*.psd"
git lfs track "*.ai"

# Git LFS に関連付けたいファイルタイプはすべて git lfs trackで追加する必要があるみたい。
 このコマンドは、リポジトリの .gitattributes ファイルを修正し、大容量ファイルを Git LFS に関連付けます。とのこと

trackで拡張子を追加すると、.gitattributesが追加されるのでcommitしておきます。
# ローカルの .gitattributes ファイルをリポジトリにコミットするよう強くおすすめします。
Git LFS に関連付けられているグローバルな .gitattributes ファイルを利用すると、他の Git プロジェクトにコントリビュートする際にコンフリクトを起こすことがあります。とのこと
```

```common_lisp
git add path/to/file.psd
# 自分はめんどくさかったので、git add . を使って、追加しました。
```

その後は、コミット、プッシュすれば重たいファイルでもgitで管理できます。
※ただ、重たいファイルのため、100MBほどのファイルはpushすると5分かかりました。


### git LFSの仕組み？
そこまでわかっていませんが、どうやら
smudge/clean filterを介して管理している。
clearn filterを介することで、remoteにはポインタファイルが存在し
localにはコンテンツそのものが存在するとのこと。
cleanフィルターはファイルがステージングされるときに実行されます。


参考：
https://docs.github.com/ja/repositories/working-with-files/managing-large-files/configuring-git-large-file-storage

https://qiita.com/shibukk/items/e9af45a6009646c7e14f
https://docs.github.com/ja/repositories/working-with-files/managing-large-files/about-git-large-file-storage
C言語で配列の中の単語の数を数えるプログラム

#はじめに
はじめまして。情報系の専門学校に通っているプログラミング初心者です。今回C言語を使って配列の中の特定の単語の数を数えろ的な課題が学校で出て「JavaやPythonならクソ簡単にできるじゃん」とか言いながら作ったクソコードです。
基本情報の擬似言語に出てきそうなプログラムですがよければ見ていってください。

#課題の内容
今回の課題は配列と繰り返し処理を活用し特定の文字列に特定の単語がいくつ含まれているのかを数えるプログラムを作れというものでした。
「abcdhelloefghihellojk」という文字列の中から「hello」を探すと2つあるので「2」と出力すればOKです。いつもはネットでググりながら良さそうなコードをコピペして編集しているのですが、今回のパターンはなかなか見つからずプログラミング初心者の私は中々苦戦しました...

#やったこと
配列の先頭から1文字づつ見ていって探したい文字列があったら数えていくといった流れでいけるのかなと思い以下のコードを書いてみました。
コードを書きながらループの内容が追えなくなったり自分でもどうして動いたのかがイマイチ分からない部分もあるのですが一応動いています。
もっといい書き方とかもあると思うのですが、私の現在の力だとこれくらいが限界でした...別のやり方知ってるよ！という方がいらっしゃいましたら是非教えて下さい！

```C
#include <stdio.h>
int main(void){
    //変数宣言
    char str[100];
    char word[100];
    int cnt = 0;
    int w_cnt = 0;
    int temp = 1;

    //入力
    printf("文字列を入力してください。\n");
    scanf("%s",str);
    printf("探したい単語を入力してください。\n");
    scanf("%s",word);
    
    //探したい単語の文字数をw_cntへ入れる
    int i = 0;
    while(word[i] != '\0')
    {
        w_cnt += 1;
        i++;
    }
    
    //str[]とword[]を比較して単語を探す
    for(i = 0; i < str[i] != '\0'; i++)                 //str[]の文字数だけループを回す
    {
        if(str[i] == word[0])                           //str[i]番目とword[]の1番目の文字を比較
        {
            int j = 1;
            for(j = 1; j < word[j] != '\0'; j++)        //word[]の文字数だけループを回す
            {
                if(str[i+j] == word[j])                 //i+j番目の文字を比較
                {
                    temp += 1;                          //文字が同じならtempに+1する
                }
                else
                {
                    break;                              //途中で違ったらループを抜ける
                }
            }
            if(temp == w_cnt)                           //tempと上で数えたw_cntの数が等しければ単語が見つかった事になる
            {
                cnt += 1;
            }
            temp = 1;                                   //tempを初期化
        }
    }
    
    //出力
    printf("単語\"%s\"の数は%d個でした。\n",word,cnt);
    return 0;
}
```
【Next.js】階層構造(path)について

#はじめに
こんにちは！
今回は【Nuxt.js】階層構造(path)についてについてアウトプットしていきます！


opgesディレクトリが以下のような構造だったとします。

```:pages

users/
---:index.vue
---:other.vue
-:index.vue

```

・pagesディレクトリ内に直下したindex.vue。
・pagesディレクトリ内にusersディレクトリがあり、その中にindex.vueファイル、other.vueファイルの二つがある。

というような構造だとします。

このような構造だと`path`いわゆる`URL部分`は以下のように設定されます。

```:pages

users/.        
---:index.vue 　　　・・・　/users/
---:other.vue　　　　　・・・/users/other
-:index.vue.   　・・・/

```

わかりやすく例で言うと

```:表示されるURL部分

users/.            ⏬本来ならちゃんとしたつ
---:index.vue 　　　・・・　localhost:3000/users/
---:other.vue　　　　　・・・localhost:3000/users/other
-:index.vue.   　・・・localhost:3000/

```

といったような`path(URL部分)`になります。

#最後に
今回は階層構造(path)についてについてアウトプットしました。
今回の記事を読んで質問、間違い等あればコメント等頂けると幸いです。

今後ともQiitaにてアウトプットしていきます！

最後までご愛読ありがとうございました！
惹かれたネーミングをタイプ分けしてみる

## はじめに

　[ネーミングセンスに惹かれた言葉](https://qiita.com/rawHam/items/dbe934a0299dc5518261) を書いたあと、これもいいなが止まらなくなっていたのでいっそ洗い出してタイプ分けしてしまおうと思った次第です。そして惹かれた順に勝手にランク付けもしました。

## A-rank

　センスと教養がなければ思いつかなそう。惹かれた順に。

### Fairytale-like Type

　童話が由来のもの。幻想的なセンスを感じたためこんなタイプ名に。

```
　パンくずリスト
　エンディアン
```

### Jedi Type

　特徴の類似性から連想したもの。ヨーダが筆頭のものということで。

```
　ヨーダ記法
　tee(コマンド)
```

### Taxonomic Type

　概念的関係から連想されたもの。これも他に例が見つけられず存続の危機。

```
　Anaconda(∈ Python)
```

### AnimalCase Type

　形が動物に似ていることが由来のもの。動物好きゆえあえてHieroglyphと分けてみた。

```
　camelCase / snake_case / ...
　セイウチ演算子
```

### Antonym Type

　既存のものの反対という関係に由来するもの。

```
　WET (↔︎ DRY原則)
　DWARF (↔︎ ELF)
　tac (↔︎ cat)
　less (↔︎ more)
　Markdown (↔︎ Markup)
　Unix (↔︎ Multics)
```

## B-rank

　広い視野とおおらかな心がないと思いつかなそう。

### Follower Type

　既存のものに対して概念的に次・隣といったもの。

```
　C言語 (← B言語)
　C++/C# (← C言語)
　Ruby (← Perl)
```


### Hieroglyph Type

　その形から連想されたもの。

```
　Hamburger menu / Bento menu / ...
　マスタッシュ構文
　エルビス構文
```

### Googol Type

　子供が生み出した言葉を採用したもの。
　"Google"の名のもとになった"googol"という言葉は子供が生み出したらしいのでこの名前に。

```
　Hadoop
　Nutch（Apache）
```

### Perl Type

　既存の単語を事情があって少し変えたもの。Perlが一番有名ということで。

```
　Perl (← Pearl)
　Clojure (← Closure)
```

### Recursive Acronym Type

　いわゆる再帰的頭字語。

```
　GNU (GNU's Not UNIX)
　YAML (YAML Ain't Markup Language)
　pip (pip install python)
　LAME (LAME Ain't an MP3 Encoder)
　Nagios (Nagios Ain't Gonna Insist On Sainthood)
```

### Grep Type

　ただの略語とも言えますがこれは特別扱いしたいところ。
　とはいえgrep以外見当たらず存続の危機。

```
　grep (g/RE/p)
```

### Decorated Type

　既存の名前にプラスアルファしたもの。

```
　bash
　Javascript
```

### Family-Oriented Type

　身近な人、特に家族の名前を使ったもの。家族思いということで。

```
　MariaDB
　Debian
　Lucene
```


## C-rank

　いい感じの名前をつけようという気持ちは垣間見えるもの。

### Numeronym Type

　スペルを文字数に置き換えたもの。

```
　i18n
　s11n
　l10n
```

※ k8sは他に入れたので除外しました。

### A2 Type

　同じ頭文字を個数でまとめたもの。_Alphabet Aggregation_ からA2と命名。

```
　EC2
　S3
　W3C
```

### Inventors Type

　考案者の名前や属性情報をそのまま採用したもの。

```
　ハンガリアン記法
　ポーランド記法
　awk
```

### Unicorn Type

　空想上の生き物の名前そのまま採用したもの。有名なUnicornをタイプ名に。

```
　Daemon
　Phoenix
```


### Ubuntu Type

　〇〇語で××系。

```
　Ubuntu
　Kubernetes
　Wiki
```


## ランク外

　タイプ分けするほどでもないがせっかくなのでまとめておく。

### Proper Noun Type

　既存の固有名詞（人名含む）をそのまま流用したもの。

```
　Ansible
　Delphi
　Django
　Haskell
　Kotlin
　Pascal
```

### Emotional Type

　既存の固有名詞だけど一応考案者の思いが込められてるもの。

```
　Java (よく通ってた)
　Mecab (好物)
　Python（よく観てた）
```


### Common Noun Type

　普通名詞をただ流用しただけのもの。

```
　Eclipse（日食）
　Git（ばかもの）
　Maven（専門家）
　Vagrant（放浪者）
```


# おわりに

　極力有名なワードに絞ったつもりです。タイプ名は気に入らなくなったりもっといいのが登場したらチェンジすると思います。仲間たちも順次追加するかもしれません。以上です。
【GMT】NetCDF形式の気温データを描画

## 概要

GMTを使って**NetCDF**ファイルに格納されたデータを描画。
**grdimage**コマンドを使用して、グラデーション図にします。
こんなグラフが出来上がります。

![image](https://user-images.githubusercontent.com/93382642/142415541-64c07110-5573-4cd7-bc49-2a51ea359e23.png)

## ソースコード

**bash**で作成します。bashなのでターミナル直書きでも作成可能。
データは[こちらの記事](https://atchicken.com/netcdf4/)で作成した擬似気温データを使用しました。
今回の話から逸れますが、**pscoast**で海岸線、**psscale**で凡例をつけてます。
ちなみにtxtやcsvファイルからNetCDFファイルを作りたい場合は、**xyz2grd**コマンドで作成可能です（今回説明はしませんが）。

```bash:grdimage.sh
#!/bin/bash
 
ncFile=./netcdf4.nc
psFile=./grdimage.ps
cptFile=./color.cpt
 
gmt makecpt -Crainbow -Z -D -T-5/40/1 > $cptFile
gmt grdimage $ncFile -JM15c -Ba30f10g20/a20f10g10:."Global Temperature":WSne -R0/360/-60/60 -C$cptFile -P -K  > $psFile
gmt pscoast -J -B -R -W -P -K -O >> $psFile
gmt psscale -C$cptFile -Dx16/3/6/0.5 -Ba10f5::/:"deg C": -O >> $psFile
```

grdimageはデータである`NetCDFファイル`と描画色を示す`カラーパレットファイル`を事前に用意しておく必要があります。
grdimageではオプションなしでNetCDFファイル、Cオプションでカラーパレットファイルを指定します。
カラーパレットファイルは**makecpt**コマンドで作成可能です。
**R, B, J, P, K, O**オプションあたりはいつも通りです。






## その他

今回使用したソースコード及び結果をGitHubに載せています。

https://github.com/khfkd/grdimage
【VRChat】空間の広がり・指向性・定位感を余さず伝える音響環境の構築

## 概要
- 「広い空間で」「中央から聞こえるように」「定位感を失わずに」音を届けたい
    - これらは得てしてトレードオフの関係にある（疑似モノラル・3D vs 2D）
- Head のボーンに追従しワールド中央を向く複数の音源を用いることでこれらの問題を解決した

## はじめに
私の作成したVRCWorld「[Music Stellar Lake](https://vrchat.com/home/launch?worldId=wrld_c330cf97-4ffb-40a9-b872-79a36905134d)」の公開に際して
ワールド作成で得られた知見のうち
特に汎用的（？）かどうかはともかく面白いものをピックアップしていくつか紹介しています

もし「役に立ったー！」となったらワールドに遊びに行ってもらえると
（ついでに #musicstellarlake のハッシュタグでツイートしてもらえると）
嬉しいです！

今回は読み物的な要素が多いです

## 環境
- VRCSDK 3.0 2021.08.04.15.07
- Unity 2019.4.29f1
- Usharp v0.20.2

## 解決したい課題
「広い湖で音楽を聴く」というシチュエーションを解決するにあたり、
音楽を以下の条件で聴きたいというモチベーションが生まれました

1. 広い空間で聴いている感覚（空間的広がり）
1. 中央のモニュメント方向から音がなっている感覚（指向性）
1. 音楽の左右のパンは失いたくない（定位感）

## それぞれの条件に対する当初のアプローチ
以下のように各課題にアプローチしましたが、
それぞれの課題の対策が別の課題に対して悪影響を及ぼしていました

#### 空間的広がり
- ワールドの外周に沿って3D音源を配置する
    - 定位感・指向性が失われる（外周に沿って聞こえる）
- リバーブ空間をつける
    - 「好きな音楽を流して交流したい」という目的にそぐわない（過度な装飾感がある）

#### 指向性
- 中央のモニュメントに3D極振りの音源を配置し、減衰距離を大きくする
    - 空間的広がり、定位感が失われる（疑似モノラル）

#### 定位感
- 頭に沿って動く2D音源を配置する
    - 空間的広がり、指向性が失われる（頭の中で常に音が鳴る）

## 解決方法

#### 空間的広がり
- 頭から15mほど離れた左右の位置にLR各チャンネルの音を出す音源を左右に配置する
- この際、High が聴きやすい音源（3D音源）を上部に、Low が聴きやすい音源（2D音源）を下部に配置する
    - 完全に 3D / 2D にせず Audio Source Component のカーブで適当に混ぜるのがコツです
- **合計4音源を Head のボーンに対して動くように追加**
- 2D / 3D 音源の聞こえ方の違いについてはこちらをご参考にしてください
    - [【VRChat】2D/3D音源の設定方法と Low / High の聞こえ方の違い](https://qiita.com/m1chie/items/45d9fbf2c4659043e84f)

#### 指向性
- **上記の音源をモニュメントの中央に向けて動くように `Aim Constraint` で制御**
    - モニュメントの上部に Aim At の transform を置くことで、近くまで行った際に「上から音が降ってくる」ような感覚を得られます
- `AimConstraint` の具体的な設定方法はこちらをご参考にしてください
    - [【VRChat】AimConstraintを用いて羅針盤を作成する](https://qiita.com/m1chie/items/92c46320a0e16ebd268c)

#### 定位感
- 上記音源だけでも良かったのですが、**頭に追従する2D音源を小さく入れています**
    - 音源のステレオ感が増幅されて聴きやすくなります
        - 半面モニュメントから背を向けると若干聞こえが悪くなりますが、指向性を持たせるのに一役買っているとも言えます


実際のワールドではこれらに加えてモニュメント内部を包むように音源を4つ配置しています
→ **モニュメント内部に入る特別感を音響的に演出しています**

**音源の配置**

![speakeriti.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1169868/63732387-7e5e-3509-ed95-b106609a2620.png)

**Head のボーンについてくる音響のU#コード**

```c#:HeadTrackingAudioSource.cs
public class HeadTrackingAudioSource: UdonSharpBehaviour
{
    private VRCPlayerApi _localPlayer;

    void Start()
    {

        _localPlayer = Networking.LocalPlayer;
    }

    private void Update()
    {

        if (_localPlayer != null)
        {

            var trackingData = _localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head);

            this.gameObject.transform.position = trackingData.position;
            this.gameObject.transform.rotation = trackingData.rotation;
        }
    }
}
```

## まとめ
上記のように音源の配置を工夫することで

- 広い空間で聴いている
- 中央から聞こえる
- ステレオ感が失われない

というワールドに最適な音響空間を生み出すことができました

## 参考
- [【VRChat】AimConstraintを用いて羅針盤を作成する](https://qiita.com/m1chie/items/92c46320a0e16ebd268c)
- [【VRChat】2D/3D音源の設定方法と Low / High の聞こえ方の違い](https://qiita.com/m1chie/items/45d9fbf2c4659043e84f)

## 謝辞
2D音源と3D音源の High / Low の聞こえ方の違い、および High / Low の音源の置き方については Mazzn1987 さん（Twitter: @Mazzn1987_TRPG）に
頭に追従する2D音源によるステレオ感のブーストに関してはだいふくさん（Twitter: @Daifuku_VRC）にご教授いただきました
また、頭に追随する3D音源のアイディアはお二人とのディスカッションにより生まれたものです
ここに深くお礼申し上げます
デジタル時計アプリを作りました

## 作ったアプリ
https://sleepy-thompson-b6f44c.netlify.app/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681683/9a569ae6-efbf-3011-7204-dd60a5e4b01b.png)
ただのデジタル時計です。
ライブラリやフレームワークは使わずに作成しました（リセットCSSだけ使用）。
[こちら](https://dev.to/codefoxx/25-beginner-javascript-project-ideas-3m9h)のProject No.7を元ネタにさせてもらいました。

## 今回学んだこと
### 背景のグラデーション
背景の左上から日が差している感じのグラデーションは`background`プロパティに`conic-gradient`関数を設定することによって実現しました。

```css
body {
    background: conic-gradient(at 25% 0%, #FE920D 90deg, #FCF52B 180deg, #1EFE52 270deg);
}
```

conic(=円錐。MDNでは扇形と訳されているようです)の中心を「at X座標 Y座標」で指定し、色とその位置を指定します。

### 背景は半透明にしたいけど、文字は不透明にしたいとき
時計部分の背景を黒の半透明にしたかったときのこと。opacityでいいだろーと思ったらダメでした。背景と一緒に文字も半透明になって薄く見えます。

```css
.clock {
    color: #ffffff;
    background: #000000;
    opacity: 0.1;
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681683/797f6873-79e1-7b5a-776d-122ad6c58ff3.png)

これについては記事がたくさんあって、`opacity`ではなく、`background-color`に`rgba`関数を設定すれば出来るようです。

```css
.clock {
    color: #ffffff;
    background-color: rgba(0, 0, 0, 0.1);
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681683/f37e997b-9488-c194-d5e5-91cf19faeb4c.png)

### Dateオブジェクトをインスタンス化する場所
`setInterval`で1秒ごとに現在時刻を取得するように設定しましたが、繰り返し実行するコードは少ないほうがいいだろうと思い、最初はコールバック関数外でDateオブジェクトのインスタンス化を行っていました。

```javascript
const date = new Date() // 最初に１回だけDateオブジェクトをインスタンス化
const dayList = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
const clock = document.querySelector('.clock')

const checkTime = () => {  
  const day = date.getDay()
  let hour = date.getHours()
  let minute = date.getMinutes()
  let amOrPm = 'AM'
  
  if (hour > 12) {
    hour = hour % 12
    amOrPm = 'PM'
  }
  
  if (hour < 10) {hour = '0' + String(hour)}
  if (minute < 10) {minute = '0' + String(minute)}
  
  clock.textContent = `${dayList[day]} ${hour} : ${minute} : ${amOrPm}`
}

checkTime()
setInterval(checkTime, 1000)
```

が、この方法ではダメでした。

>引数が与えられなかった場合は、新しく生成された Date オブジェクトはインスタンス化された時点で現在の日付と時刻を表します。
[Date()コンストラクター - MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/Date)

ということで、コールバック関数内で1秒ごとに実行するようにしています。

```javascript
const dayList = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']
const clock = document.querySelector('.clock')

const checkTime = () => {
  const date = new Date()
  // 省略
}

checkTime()
setInterval(checkTime, 1000)
```

## 参考文献・記事
[conic-gradient() - MDN](https://developer.mozilla.org/ja/docs/Web/CSS/gradient/conic-gradient())
[Date()コンストラクター - MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date/Date)
[背景色(background-color)を透過させて文字色は不透明にする方法とhtml,slim,css,scssでの記述方法](https://qiita.com/mikuhonda/items/99a7a8acdb2921860ce0)
Ubuntu 20.04にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してUbuntu20.04にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/debian#install-from-azul-apt-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# apt-get -q update
# apt-get -yq install gnupg curl
# apt-key adv \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 0xB1998361219BD9C9
# curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# apt-get install ./zulu-repo_1.0.0-3_all.deb
# apt-get update
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

# apt-get install zulu17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.30+15-CA (build 17.0.1+12-LTS, mixed mode, sharing)
```
Ubuntu 18.04にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してUbuntu18.04にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/debian#install-from-azul-apt-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# apt-get -q update
# apt-get -yq install gnupg curl
# apt-key adv \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 0xB1998361219BD9C9
# curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# apt-get install ./zulu-repo_1.0.0-3_all.deb
# apt-get update
```

### インストール

```shell-session
# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.6 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.6 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

# apt-get install zulu17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.30+15-CA (build 17.0.1+12-LTS, mixed mode, sharing)
```
Debian 11にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してDebian11にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/debian#install-from-azul-apt-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# apt-get -q update
# apt-get -yq install gnupg curl
# apt-key adv \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 0xB1998361219BD9C9
# curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# apt-get install ./zulu-repo_1.0.0-3_all.deb
# apt-get update
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt-get install zulu17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.30+15-CA (build 17.0.1+12-LTS, mixed mode, sharing)
```
Debian 11にOpenJDK 11をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してDebian11にOpenJDK11をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/debian#install-from-azul-apt-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# apt-get -q update
# apt-get -yq install gnupg curl
# apt-key adv \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 0xB1998361219BD9C9
# curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# apt-get install ./zulu-repo_1.0.0-3_all.deb
# apt-get update
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt-get install zulu11-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "11.0.13" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu11.52+13-CA (build 11.0.13+8-LTS)
OpenJDK 64-Bit Server VM Zulu11.52+13-CA (build 11.0.13+8-LTS, mixed mode)
```
Debian 11にOpenJDK 8をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してDebian11にOpenJDK8をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/debian#install-from-azul-apt-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# apt-get -q update
# apt-get -yq install gnupg curl
# apt-key adv \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 0xB1998361219BD9C9
# curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# apt-get install ./zulu-repo_1.0.0-3_all.deb
# apt-get update
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt-get install zulu8-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "1.8.0_312"
OpenJDK Runtime Environment (Zulu 8.58.0.13-CA-linux64) (build 1.8.0_312-b07)
OpenJDK 64-Bit Server VM (Zulu 8.58.0.13-CA-linux64) (build 25.312-b07, mixed mode)
```
[小報告]BiopythonのTm値計算結果がバージョンによって少し違う

Biopython 1.78だと

```
>>>mt.Tm_NN('ACAGAAA', nn_table=mt.R_DNA_NN1)
-14.276977758735995
```

でしたが、Biopython 1.79だと

```
>>>mt.Tm_NN('ACAGAAA', nn_table=mt.R_DNA_NN1)
-12.70991442070084
```

になります。リリースノートには該当する記述はなさそうだったので共有します。
https://github.com/biopython/biopython/blob/master/NEWS.rst

機械学習用の特徴量計算などをしている場合は、ちょっとの違いでも出力値の再現ができなくなるのでヒヤヒヤしますね。
環境変数を使い、API KEYをアプリケーション内に隠す

## 概要
　youtube APIを使いgithubにpushした際、不正利用させると怒られたので
　アプリケーション内に隠す方法の備忘録です

## 初めに
　youtube API の取得方法完了してるものとします。
　取得方法については先輩方の記事を参考になさってください。
　[YouTube API APIキーの取得方法](https://qiita.com/chieeeeno/items/ba0d2fb0a45db786746f)

## 手順
#### 1. gemをインストール

```ruby:terminal
gem 'dotenv-rails'

bundle install
```

#### 2. アプリケーション内に「.env」ファイルを作成

アプリケーションに直接作成でも問題ありません。

コマンド作成なら

```ruby:terminal
touch .env
```

![スクリーンショット 2021-11-18 20.10.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2201291/7d1037f2-e895-4978-2543-bfed311ffbee.png)

#### 3. 「.env」ファイルにAPI KEYを記載
　

```ruby:.env
API_KEY =*******************
```



#### 4. コントローラーのapikeyを埋め込む箇所に環境変数を記述

```ruby:youtube.controller
GOOGLE_API_KEY = ENV["API_KEY"]
```

今回はyoutube apiを使用しているので youtube.controller の GOOGLE_API_KEY となっております。
.envファイルの環境変数を呼ぶ際は、ENV["*******"]と記述が必要です。

#### 5. .envファイルをgithubに公開しないようgitignoreに追加

```ruby:gitignore
/.env
```

以上です！


## まとめ

似た記事はたくさんありましたが自分でもまとめてみたく記事にしました。
何かアドバイス頂けますとありがたいです。
Debian 10にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してDebian10にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/debian#install-from-azul-apt-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# apt-get -q update
# apt-get -yq install gnupg curl
# apt-key adv \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 0xB1998361219BD9C9
# curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# apt-get install ./zulu-repo_1.0.0-3_all.deb
# apt-get update
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt-get install zulu17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.30+15-CA (build 17.0.1+12-LTS, mixed mode, sharing)
```
XMLHttpRequestでAPIを叩きCSVをローカルにダウンロード

ブラウザからURLにアクセスしたらファイルをダウンロードできる感じで
HTML+javascriptでCSVをレスポンスするAPIをコールしてCSVファイルをローカルにダウンロードしたい

#結論
1. レスポンスタイプをblobにする
2. aタグをオブジェクトを生成してurlとdowndo属性を付与する

```javascript:javascript
// APIのレスポンスが"Content-Type": 'text/csv'の想定
var request = new XMLHttpRequest();
request.open('GET', URL, true);
// 1. レスポンスタイプをBlobにする
request.responseType = "blob";
request.onload = function () {
  var data = this.response;
  // 2. aタグを作成してURLにBLOBをセット
  const a = document.createElement("a");
  document.body.appendChild(a);
  //csvファイル名を指定
  a.download = 'foo.csv';
  a.href = window.URL.createObjectURL(data)
  a.click();
}
request.send();
```
おしまい
「簡単」のレベルは人によって違うよねという話

##はじめに
やりたいこととかコードをググるとこんなコメントを見ることがある。

「この内容は基礎だから簡単だよ！」― 強々エンジニア
「わりと楽にできました」― どこかの偉い人

**・・・自分にとっては簡単じゃないよ！苦労しているよ！**
なんてことをよく思います。

よく学会である
 <偉い教授>「素人でわからないのですが～」
みたいな周りにプレッシャーかけていくスタイルかな？

それはさておき、誰にとって簡単かというのは案外わかりにくいなと思った。
迷惑にならない程度に、下で考えていることを叫んでいこうと思う。

##叫び

###① 実施者のバックグラウンドは？
コードを公開している方は簡単な自己紹介を付けてくれることが多い。
(例えばWebエンジニアとして数年勤務など)

でも同じWebエンジニアとして数年働いている人でも、細かなバックグランドって絶対違うよね。この人には簡単だけど別の人には難しいということもあるはず。

じゃあ書いている本人はどうなのか。ざっとまとめてみた。

| 項目 | 回答 |
|:-----------:|:------------:|
| 大学は理系       | Yes     |
| 情報系の専攻だった     | No      |
| 学生時代のプログラミング経験       | Yes[^1]       |
| プログラミングが仕事で必要        | Yes          |
|   強々エンジニアになりたい    | No[^2]      |
| 3度のメシよりプログラムが大好き    | No     |

学生時代は理系で、プログラムを少しだけかじったぐらい。会社に入って必要になったので~~「君やって(もちろん独学でね♪)」と脅されたので~~、泣きながらpythonを学習している(今もつらい)。

一方学生時代は情報系専攻でKaggleはMasterクラス、仕事もデータ解析バンバンやってますみたいな人もいるわけだ。バックグランドが違い過ぎる。
そりゃあ「簡単」の定義がずれてもおかしくない。

###② その時の心理状態違うよね
モチベーションの違いって、パフォーマンスに大きく影響しませんか？
テストでも練習ではできていたけど、本番では緊張して解けなかった経験をしたことある人は結構いると思う。

コードも同様で、最初に見た時は気分が沈んでいたからあまりわからなかったけど、後で落ち着いた時に見たらすぐ理解できることもあるのではと。
どういう時にパフォーマンスがプラス/マイナスになりそうか、独断と偏見でまとめてみた。

| ＋になる要素 | －になる要素   |人によって変わる要素|
|:----------:|:-----------:|:------------:|
| 給料・ボーナスが入った | お金を持ち逃げされた |2日酔いでフラフラ|
| 誰かに褒められた | ~~くそ~~上司に怒られた|〆切がタイト|
| 恋人ができた | 振られた |自分の評価を知った|
| 睡眠が十分 | 寝不足|エナ○リ飲みまくり|

・・・ちなみに2日酔いでパフォーマンス上がるのかな？気になる。

##まとめ
これだけは言えると思う。
**強々エンジニアの皆さんが「簡単」というのは簡単じゃない(真顔)。**






[^1]: 経験といってもMatlabを少しだけ。無茶ぶり受けて全く知らないのに、簡単なスクリプト作成することになったのは思い出。
[^2]: そもそもエンジニアですらない。
Debian 9にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してDebian9にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/debian#install-from-azul-apt-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# apt-get -q update
# apt-get -yq install gnupg curl
# apt-key adv \
  --keyserver hkp://keyserver.ubuntu.com:80 \
  --recv-keys 0xB1998361219BD9C9
# curl -O https://cdn.azul.com/zulu/bin/zulu-repo_1.0.0-3_all.deb
# apt-get install ./zulu-repo_1.0.0-3_all.deb
# apt-get install apt-transport-https
# apt-get update
```

### インストール

```shell-session
# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
VERSION_CODENAME=stretch
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

# apt-get install zulu17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.30+15-CA (build 17.0.1+12-LTS, mixed mode, sharing)
```
Arduinoの勉強　第5弾：デジタル通信方式 (1) - I2C通信方式

# #I2C通信方式
##はじめに
ハードウェアの勉強のためにArduinoを復習も兼ねて参考教材に沿って，勉強する．細かな部分の理解までして，自在に扱えるようになることが目的である．その第5弾として，「I$^2$C通信方式」を扱う．

## センサなどのデバイスを利用するには？
![slide1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/15fe9eb4-3577-40d0-ddb7-9400072ba04d.png)
## I2Cの大きな特徴
![slide2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/063e13dd-cef5-0992-8b8d-3bf1482754f3.png)
![slide3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/8fa0e83e-c3a1-5eab-eebf-9ac4a6ea1129.png)
![slide4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/712b8ea4-01c5-9e7e-1052-f4a96a56fed3.png)
![slide5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/a27fae2f-9808-0d0f-90ee-5a830cee45f9.png)
![slide6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/b5e686f3-5651-2be9-2148-3d984e529aaf.png)
## その他
![slide7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/dc4bccca-4a1b-c61e-6169-9fc3a5b10bba.png)

## 感想
今までは，なんとなくセンサなどのデバイスを使っていた．ここまで丁寧に通信について学んだのは初めてである．しかしながら，通信方式を学ぶことで，どのようなデバイスには，どのような通信方式をとるべきかという選択ができることになり，開発においては，割と重要な知識であるようにも感じられた．次回とその次も別の通信方式を学び，最後に少し比較でも出来たらと思う．

## 参考文献
- 電子部品ごとの制御を学べる！Arduino電子工作実践講座 改訂第2版 福田和宏 著 ソーテック社
M1 Mac (M1 Pro/Max)での開発環境セットアップ

# はじめに

あえてMBP"14 2021をtime machineを使わずにclean setupしたので、備忘録です.


# まずはxcodeのinstall

```
$ xcode-select --install
```

App storeでxcodeもinstallし、


```
$ sudo xcodebuild -license
```

# homebrewのinstall

すでにM1対応済みです.

https://brew.sh/index_ja をブラウザで開いて、install用のshell scriptを
コピペ

以下は2021/11/17時点でのinstall script

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

```
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
    echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/あなたのユーザー名/.zprofile
    eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
```

# homebrewを使ったinstall

```
$ brew install --cask visual-studio-code
$ brew install sublime-text --cask
```

# 基本folderの作成

```
$ cd ~
$ mkdir work
$ mkdir bin
$ mkdir .ssh
$ chmod 0700 .ssh
```

# 基本pathの設定

```
$ vim ~/.zprofile
```

```~/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
export PATH=$PATH:~/bin
```

# C/C++ development

## ccache

```
$ brew install ccache
```

## gtestのinstall

```
$ brew install cmake
$ git clone https://github.com/google/googletest.git
$ cd googletest
$ mkdir build
$ cd build
$ cmake -DCMAKE_CXX_COMPILER="c++" -DCMAKE_CXX_FLAGS="-std=c++11 -stdlib=libc++" ../
$ make
$ sudo make install
```

## arduino

* [USB UART driver (M1対応済)](https://jp.silabs.com/developers/usb-to-uart-bridge-vcp-drivers)
* [arduino IDE](https://www.arduino.cc/en/Main/Software)
* PySerial
```
$ sudo python2 -m easy_install pyserial
```
* 

# Android development

## repoのinstall

```
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod +x ~/bin/repo
```

## android studioのinstall

https://developer.android.com/studio#downloads

Pixel3のarm emulatorのスピードが感動するレベルでサクサク.

# 引っ越し系

## 設定系

* .gitconfig
* .ssh以下のファイル (sshや、github.comなどでも必要)
* .netrc (github.comでも必要なので忘れずに)
* .bash_profileから、.zprofileへ (環境変数などで必要なもの)


## 必要なアプリの引っ越し

例: Sublime Text 2 (最新のarm対応版を使う方がよいですよ. 単なる例です)

移行元で

```
$ cd /Applications
$ tar zcvf subl.tgz "Sublime Text 2"
$ cd ~
$ cd "Library/Application Support"
$ tar zcvf subl-conf.tgz "Sublime Text 2"
```

移行先で逆(tar zxvf等展開)をする

```
$ ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /Users/xxxx/bin
```

# Machine learning

## Tensor flow for Macのinstall

https://developer.apple.com/metal/tensorflow-plugin/

```
$ wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh
$ chmod +x ./Miniforge3-MacOSX-arm64.sh
$ sh ./Miniforge3-MacOSX-arm64.sh
$ source ~/miniforge3/bin/activate
$ conda install -c apple tensorflow-deps
$ python -m pip install tensorflow-macos
$ python -m pip install tensorflow-metal
```

# optional: Windows app環境構築

https://qiita.com/hidenorly/items/32de74f6d4db6c1af0a2
CentOS 8にOpenJDK 17をインストール（Azul Zulu Builds of OpenJDK）

# はじめに

Azul Zulu Builds of OpenJDKを利用してCentOS8にOpenJDK17をインストール
親記事：[OpenJDKの各種インストール方法とEOLまとめ](https://qiita.com/witchcraze/items/b179202216aab50b7090)
参考：[Azul Platform Core](https://docs.azul.com/core/zulu-openjdk/install/rpm-based-linux#install-from-azul-rpm-repository)

## サポート

有償版のみサポート期間が明記されている。[Azul Support Roadmap \- Azul \| Better Java Performance, Superior Java Support](https://www.azul.com/products/azul-support-roadmap/)
Zulu Community時代より、無償版のサポート期間は不明。

## LOG

### レポジトリ登録

```shell-session
# yum install -y https://cdn.azul.com/zulu/bin/zulu-repo-1.0.0-1.noarch.rpm
```

### インストール

```shell-session
# cat /etc/redhat-release
CentOS Linux release 8.5.2111

# yum install zulu17-jdk
... 略
```

### 各種確認

```shell-session
# which java
/usr/bin/java

# java -version
openjdk version "17.0.1" 2021-10-19 LTS
OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)
OpenJDK 64-Bit Server VM Zulu17.30+15-CA (build 17.0.1+12-LTS, mixed mode, sharing)
```