OmniAICreator/Qiita-1.07M huggingface dataset:
Macでさまざまな方法でファイルを抽出する方法

Macでファイルを抽出しようとするユーザーには、たくさんのオプションがあります。 組み込みおよびサードパーティ。 Finderから始めて、専門のファイル抽出ソフトウェアに移るなど、さまざまな方法でMacでファイルを抽出する方法を見てみましょう。

Finderが基本的すぎると感じていますか？ Commander One –Mac用の最高のファイルエクストラクターをダウンロードしてください。
Finderを介してMacでファイルを抽出する方法–ステップバイステップガイド
-
圧縮ファイルはより少ないディスクスペースを使用します。これは、バックアップやインターネット経由でのファイルの送信に役立ちます。 圧縮されたフォルダは、一度に多数のファイルを保持できるため、転送と保存が簡単になります。 ただし、Macでファイルを解凍する方法は、使用する圧縮の種類によって異なります。

macOSに組み込まれているアーカイブユーティリティは、簡単なアクションをうまく実行します。Finderで.zipフォルダを抽出するのは、ダブルクリックするのと同じくらい簡単です。
1.FinderでZIPアーカイブを見つけます。
![789.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740997/9b35e736-81a3-ef32-a5af-04140aba45c7.png)
2.ZIPアーカイブをダブルクリックします。
3.親フォルダに自動的に抽出されます。
![987.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740997/7e504362-b8e7-fb8a-8707-d7d683acd74c.png)
ファイルやフォルダをZIP形式で直接Finderで圧縮するのも簡単です。

1.圧縮するファイルを選択します。
2. Ctrlキーを押しながらクリックするか、右クリックするか、2本の指でタップしてショートカットメニューを開きます。
3。「（選択した数の）アイテムを圧縮する」をクリックします。
新しい圧縮ZIPフォルダーが親フォルダーに作成されます。
しかし、.zipファイルとは異なるアーカイブ拡張子（ipa、.apk、.jar、.ear、.warファイルなど）を受け取った場合はどうなりますか？そして、RAR、TBZ、TGZ、7zなどの他のフォーマットはどうですか？

一部のプロおよびパワーユーザーは、受信者の希望する形式でアーカイブをクライアントまたは同僚に送信する必要がある場合があります。または、複数のアーカイブフォルダーを一度に抽出するなど、より複雑な圧縮タスクが必要になる場合があります。

残念ながら、それはFinderとアーカイブユーティリティの機能が不足しているところです。これらのmacOSネイティブのアプリは、基本的な圧縮と抽出のみが可能で、ZIPファイルに対してのみ可能です。さまざまなアーカイブ形式を解凍するには、専門のMacファイルエクストラクタが必要です。

幸いなことに、さまざまな圧縮ファイル拡張子を処理でき、Macでファイルをアーカイブ、圧縮、抽出するときに追加機能を提供できるサードパーティのアプリがあります。
Macでファイルを抽出するためにサードパーティのアプリを使用する方がよい理由
-
複数のフォルダからファイルを抽出する機能により、プロフェッショナルおよびスペシャリストの役割を持つMacユーザーは、Mac用のサードパーティの抽出ソフトウェアをさらに活用できます。 これらは、.rarファイルのように.zipファイル拡張子のないファイルを抽出して圧縮する必要がある人にとって特に便利です。

しかし、なぜZIPの代わりにRARまたはその他の圧縮形式を使用するのでしょうか。 さて、RARファイルはより小さくてより効率的です。 7zファイルはさらに小さく、ZIPよりも最大17％のディスクスペース節約を提供します。 これは、大量のデータが保存されるデータセンターやプライベートクラウドにとって大きな違いです。

EAR、JAR、およびWARファイルは、DevOpsワークフローを強化するためにJavaアプリケーション開発者によって一般的に使用されます。 簡単に言えば、さまざまな圧縮形式がさまざまな目的を果たします。最高の圧縮率を得るには、基本的なZIP標準を超えて検討する必要があります。
なぜコマンダーワン？
-
[Commander One](https://mac.eltima.com/archiver-mac.html)は、Mac用の強力なファイルエクストラクタを必要とするプロに最適なソリューションです。 無料でも、.jar、.ear、および.warフォルダーを通常の非圧縮フォルダーと同じようにナビゲートできます。これにより、ディスクスペース、読み取り/書き込みサイクル、および時間が節約されます。 Proバージョンは、RAR抽出、TBZ、TGZ、7zの抽出と圧縮のロックを解除し、すべてのタイプの圧縮フォルダーの詳細な検索統合を実現します。
![123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740997/3ed24fd1-33de-61f3-0d74-2c3e203dc0a6.png)
CommanderOneも本格的なファイル管理システムです。 Finderと同じように機能しますが、オーバードライブで動作します。 ユーザーは、デュアルパネル（分割画面）ビュー、無制限のタブに加えて、強化された選択およびブラウジングツールを利用できます。 つまり、複数のフォルダやファイルを、選択した形式で一度に圧縮する前に、それらのフォルダ内を閲覧しているときでも簡単に選択できます。

完全にカスタマイズ可能であるため、目の疲れを和らげたり、焦点を合わせたり、デスクトップのテーマに合わせたりすることができます。
railsチュートリアル第１２章 新しいパスワードの設定 createアクションでパスワード再設定

###新しいパスワードの設定
攻撃者からアカウントを盗まれないようにするため
マイグレーションに図 12.5の属性を追加します

```
ubuntu:~/environment/sample_app (password-reset) $ rails generate migration add_reset_to_users reset_digest:string reset_sent_at:datetime
Running via Spring preloader in process 7187
      invoke  active_record
      create    db/migrate/20211019130931_add_reset_to_users.rb
```                                                   
                                                                                                                                                                                          
####新しいパスワード再設定画面ビュー
app/views/password_resets/new.html.erb

```html
<% provide(:title, "Forgot password") %>
<h1>Forgot password</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_with(url: password_resets_path, scope: :password_reset,
                    local: true) do |f| %>
    <!--form_withとは、railsで情報を送信するためのヘルパーメソッド-->
    <!--簡単に入力フォームに必要なHTMLを作成することができます-->
      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>

      <%= f.submit "Submit", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
```

###演習
1.
リスト 12.4のform_withメソッドで、@password_resetではなく:password_resetを使っている理由を考えてみましょう。
わからなかった。

調べてみると
シンボルを使うとよりシンプルなformタグが生成され、オブジェクトを渡すとそのオブジェクトに寄って良しなに出し分けてくれる。
と書いてあった。
何がシンプルなのかわからない。

###createアクションでパスワード再設定
パスワード再設定用トークンと送信時のタイムスタンプでデータベースの属性を更新する必要があります。


####パスワード再設定用のcreateアクション
app/controllers/password_resets_controller.rb

```rb
class PasswordResetsController < ApplicationController

  def new
  end

  def create
    @user = User.find_by(email: params[:password_reset][:email].downcase)
    # メールアドレスをキーとしてユーザーをデータベースから見つける
    if @user
      @user.create_reset_digest
      # パスワード再設定用トークンを更新
      @user.send_password_reset_email
      # 送信時のタイムスタンプでデータベースの属性を更新
      flash[:info] = "Email sent with password reset instructions"
      redirect_to root_url
    else
      flash.now[:danger] = "Email address not found"
      render 'new'
    end
  end

  def edit
  end
end
```

####Userモデルにパスワード再設定用メソッドを追加する
app/models/user.rb

```rb
class User < ApplicationRecord
.
.
.
   # パスワード再設定の属性を設定する
  def create_reset_digest
    self.reset_token = User.new_token
    update_attribute(:reset_digest,  User.digest(reset_token))
    update_attribute(:reset_sent_at, Time.zone.now)
  end
  
  # パスワード再設定のメールを送信する
  def send_password_reset_email
    UserMailer.password_reset(self).deliver_now
  end

  private
.
.
.
end
```
###メイラー
 メールは、メールサーバーを介して送受信される仕組みで、データをサーバーに出し入れする仲介役がメーラーです。

###演習
1.
試しに有効なメールアドレスをフォームから送信してみましょう（図 12.6）。どんなエラーメッセージが表示されたでしょうか?

```
ArgumentError in PasswordResetsController#create
wrong number of arguments (given 1, expected 0)
```
引数が一個来ている　来ない方がいいらしい。

2.
コンソールに移り、先ほどの演習課題で送信した結果、（エラーと表示されてはいるものの）該当するuserオブジェクトにはreset_digestとreset_sent_atがあることを確認してみましょう。また、それぞれの値はどのようになっていますか?

```
["reset_digest", "$2a$12$******************e"]
"reset_sent_at", "2021-10-20 02:39:36.478649"]
```
と書かれてあった。
【DOM操作(前編)】JavaScriptのaddEventListenerについて、「・・したら」をまとめてみた

今回はJavaScriptのDOM操作の
「addEventListener」
についてまとめてみました。
DOM操作初心者の方のご参考になれば嬉しいです。

###基本的なDOM操作(addEventListener)の流れ

①まずは要素の取得。
②取得した要素に**addEventListener**で処理を追加する
**→ このaddEventListenerの<font color="blue">第一引数</font>と<font color="orange">第二引数</font>が重要です**


**③処理の"きっかけ(<font color="blue">第一引数</font>)"を記述**
**→<font color="red">⭐️今回のメインはこの③になります。</font>**

④"処理を関数内(<font color="orange">第二引数</font>)"に記述
→→<font color="red">**※こちらは次回(後編)で紹介します...</font>**

※慣れている方は①②は飛ばしてOK

##①要素を取得する
DOM操作をする上でまずはHTMLに記述している要素を取得する必要があります。
まずはHTML上でbuttonを用意。

```html
<button class="addButton">Add</button>
```
![スクリーンショット 2021-11-07 15.18.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1029408/95d15be5-0669-a42e-12dc-674e3383113c.png)
ブラウザ上にこのようなbuttonができていたらOKです。
このbuttonの要素を取得していきます。

```javascript
const btn = document.querySelector('.addButton');
// "btn"と定義しました。このbtnに処理をしていくという感じです。
```
※その他タグやidから取得する方法もあります。

##②イベントを追加する("クリックしたら・・・")

イベントを追加する方法も数種類ありますが、
今回は"addEventListener"で。

```javascript
// 先ほど定義したbtnにaddEvenListnerでイベント処理を追加
btn.addEventListener('③きっかけ', () => {
   ④何かしらの処理 
})
```
ざっくりですがこのカタチで記述します。
**まだ慣れていない方はこの形をまる覚えで大丈夫です。**

具体的に１つ例を見せます。

```javascript
// まずはbuttonの要素を取得
const btn = document.querySelector('.addButton');

// btnに対してaddEventListenerで’click’したら・・・を追加
btn.addEventListener('click', () => {
// コンソールにaddを表示
　　console.log('add')
});
// 結果的に”ボタンをクリック"したら"コンソールに"add"が表示される
```
こういったカタチで使用します。
次の章からは色んな例を紹介していきます

##③“きっかけとなるアクション”(第一引数)について
前編のメインである第一引数のレパートリーを一部紹介していきます。

###・クリックしたら → 'click'
```javascript
btn.addEventListener('click', () => {
  console.log("クリックできてるよ");
});
```
###・ホバーしたら → 'mouseover'

```javascript
btn.addEventListener('mouseover', () => {
  console.log("hoverじゃないでmouseoverやで");
});
```
###・ダブルクリックしたら → 'dblclick'

```javascript
btn.addEventListener('dblclick', () => {
  console.log("ダブルクリックできてるよ");
});
```


###・【入力欄】入力したら(更新したら) → 'input'
ここからはbuttonではなくinput要素で解説していきます。


```javascript
const inputArea = document.querySelector("input");

input.addEventListener('input', () => {
  console.log("入力中");
});
```
こちらはリアルタイムで更新されてる状態。
次のchangeとの違いに注意

###・【入力欄】値が変化(確定)したら → 'change'
ここれは主にinputタグやselect要素と一緒に使用されます。
入力してenterで確定したら

```javascript
input.addEventListener('change', () => {
  console.log("値が変わりました");
});
```
###・【入力欄】フォーカスしたら → 'focus'

```javascript
input.addEventListener('focus', () => {
  console.log("focusされてます");
});
```

###・【入力欄】フォーカスが外れたら(他の箇所をクリックしたら) → 'blur'

```javascript
input.addEventListener('blur', () => {
  console.log("外れた");
});
```

###・【入力フォーム】フォーム入力して送信(確定)されたら → 'submit'

<font color="red">☆重要:</font>**"form"にaddEventListenerすること( buttonやinputではない！！)**

```javascript
//formの要素取得
const formArea = document.querySelector('form');

formArea.addEventListener('submit', (e) => {
//  本来ならsubmitすることでページ遷移してしまう。
//  それを回避するためにpreventDefault(遷移してしまったら入力したものも消えてしまいます)
e.preventDefault
console.log("提出済")
});
```

##まとめ
今回はaddEventListnerの第一引数についてのご紹介になりました。
次回(後編)では、関数内でよく使う処理についてご紹介して行こうと思います

最後までお読みいただきありがとうございました。
Pandasの基礎の基礎

#Pandas基礎の基礎
##記事の目的
pandasは、テーブルデータの処理に特化したpythonのモジュールです。ここでは、pandasの基本的な使い方を、備忘録として整理しました。

###1. データの取り込み
試しに、以下のようなcsvファイルを読み込んでみます。

```test.csv
テスト
番号,名前,年齢,身長,性別
1,タカシ,65,178.2,男
2,ヨシミ,33,165.1,女
3,ジロウ,18,180.2,男
4,サブロウ,15,160.3,男
```

データの取り込みには、pandas.read_csv( ) もしくは、pandas.read_table( )を使います。この二つの関数、デフォルトの区切り文字が異なるだけで、その他の中身は同じのようです。

```python:read_data.py
import pandas as pd
#
data=pd.read_table( "test.csv",
 skiprows=1,#スキップ行数の指定
 delimiter=",",#区切り文字の指定
 header=0,#ヘッダー行数の指定
 index_col=0,#見出し列数の指定
)
print(data)
```

read_table関数の引数は49個あるようですが、よく使いそうな引数は以下の4つくらいかなと思っています。

|skiprows|delimiter|header|index_col|
|---|---|---|---|
|スキップする行数を指定|区切り文字を指定|ヘッダの行番号を指定(スキップ分は除く)|見出しの列番号を指定|

実行結果は、以下のような感じです。csvのテーブルがそのまま読み込まれています。

```:実行結果
      名前  年齢     身長 性別
番号
1    タカシ  65  178.2  男
2    ヨシミ  33  165.1  女
3    ジロウ  18  180.2  男
4   サブロウ  15  160.3  男
```
###2. データの切り出し

任意の列のデータの切り出しは、切り出したい列のヘッダ名のリストを指定するだけです。

```python
test=data[["名前","年齢"]]
print(test)
```

```:実行結果
      名前  年齢
番号
1    タカシ  65
2    ヨシミ  33
3    ジロウ  18
4   サブロウ  15
```
また、ilocを用いて、切り出したい範囲を指定することもできます。

```python
test=data.iloc[1:3,0:2] #1行目～2行目、0列目～1列目を切り出し
print(test)
```

```:実行結果
     名前  年齢
番号
2   ヨシミ  33
3   ジロウ  18
```

特定の条件を満たすデータを抽出することもできます。

```python
test=data[data["性別"]=="男"] 
print(test)
```

```:実行結果
      名前  年齢     身長 性別
番号
1    タカシ  65  178.2  男
3    ジロウ  18  180.2  男
4   サブロウ  15  160.3  男
```

###3.データの可視化
pandasのデータフレームは、matplotlibによる可視化も簡単にできます。

```python
import matplotlib.pyplot as plt
import japanize_matplotlib
data.plot(kind="hist")
plt.show()
``` 
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698369/0af0604e-a892-1251-68d7-df451cfed9a7.png)

かなり便利です！！
公開鍵・秘密鍵生成してさくらサーバーにSSH接続する

[環境](#環境)
[ターミナルで接続](#ターミナルで接続)
[鍵を生成する](#鍵を生成する)
[公開鍵をauthorized_keysに変換](#公開鍵をauthorized_keysに変換)
[パーミッション設定](#パーミッション設定)
[秘密鍵をローカルに保存](#秘密鍵をローカルに保存)
[ターミナルでssh設定](#ターミナルでssh設定)
[参考記事](#参考記事)

#環境

`さくらのレンタルサーバー`
`macOS 11.6.1`

#ターミナルで接続

```
# ssh ＜FTPアカウント＞@＜ホスト名　or IPアドレス＞

＜FTPアカウント＞@＜ホスト名　or IPアドレス＞'s password: ?

＊＊＊＊＊＊

Welcome to FreeBSD!
```

#鍵を生成する

###ディレクトリ作成

```
# mkdir ~/.ssh
```

###ディレクトリが作成されたことを確認
`.ssh`は隠しコマンドのため`-a`で表示

```
# ls -a

.ssh
```

###ディレクトリに移動

```
# cd ~/.ssh
```

###鍵の生成

```
# ssh-keygen -t rsa

Enter file in which to save the key (/root/.ssh/id_rsa):＜任意の鍵ファイル名＞_rsa

Enter passphrase (empty for no passphrase):＜任意のパスフレーズ＞
Enter passphrase (empty for no passphrase):＜任意のパスフレーズ＞
```
鍵を生成すると、どんな鍵ファイル名にするかを聞かれるので入力

どんなパスフレーズにするか２回聞かれるので入力

```
Your identification has been saved in /root/.ssh/＜任意の鍵ファイル名＞_rsa.
Your public key has been saved in /root/.ssh/＜任意の鍵ファイル名＞_rsa.pub.
The key fingerprint is:
SHA256:d/gQiLpY1DivqxMElaeGeh9LkNLU8qof6l4d019qE3k root@xxx.xxx.xxx.xxx.ZZZ
The key s randomart image is:
+---[RSA 2048]----+
| ..o             |
|. + oo . .       |
| = *+ o . .      |
|o B..+.   .o     |
|.+ ooo..So+E.    |
|. +o+oo ..=+     |
| oo=o+   =  .    |
|..o.o.  . .      |
|++oo.            |
+----[SHA256]-----+
```

`＜任意の鍵ファイル名＞_rsa`が秘密鍵
`＜任意の鍵ファイル名＞_rsa.pub`が公開鍵

#公開鍵をauthorized_keysに変換

```
# scp ~/.ssh/＜任意の鍵ファイル名＞_rsa.pub ＜FTPアカウント＞@＜ホスト名　or IPアドレス＞:/home/＜FTPアカウント＞/.ssh/authorized_keys
```

#パーミッション設定

```
# chmod 600 ~/.ssh/authorized_keys
# chmod 700 ~/.ssh
```

#秘密鍵をローカルに保存

```
cat /.ssh/＜任意の鍵ファイル名＞_rsa

-----BEGIN RSA PRIVATE KEY-----
*******************************
*******************************
*******************************
-----END RSA PRIVATE KEY-----
```

データをテキストエディタでローカルに保存
ファイル名：`＜任意のファイル名＞.key`

サーバーからログアウト

```
# exit
```

#ターミナルでssh設定

```:vim&nbsp;~/.ssh/config
Host ＜任意の接続名＞
 HostName ＜ホスト名　or IPアドレス＞
 User ＜FTPアカウント＞
 Port 22
 IdentityFile /ローカル端末パス/＜任意のファイル名＞.key
```
保存する

以下でSSH接続できる

```
# ssh ＜任意の接続名＞

Enter passphrase for key: ?

＜任意のパスフレーズ＞
```



*****
#参考記事
`http://vdeep.net/sakura-ssh`
`https://qiita.com/tyaunuakkia/items/9572b9a1cf8972f1c45e`
``
``
dockerでマイグレートができない(「Laravel＋nginx＋MySQL」環境)

# 「php artisan migrate」を実行したらエラーが出た。。
dockerというのは色々なエラーが出るから初心者にはきついっすよね。。

コンテナ起動で苦労して、コンテナログインでも苦労して
ようやくマイグレートまできたら今度はこんなエラーが。。

```
SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations and table_type = 'BASE TABLE')
```

##エラーが出るまでの手順
Gitからプロジェクトをクローンして、以下の手順を踏みました。

### dockerイメージ作成
```
$ docker-compose build --no-cache
```

### dockerコンテナを起動
```
$ docker-compose up -d
```

### コンテナログイン
```
$ docker-compose exec php-fpm /bin/bash
```

### ディレクトリ移動
```
$ cd /var/www/html/
```

### Laravel7系最新インストール
```
$ composer create-project --prefer-dist laravel/laravel=7.*.* .
```

###キャッシュ作成
```
php artisan config:cache &&
php artisan key:generate &&
php artisan config:cache
```

###マイグレーション
```
$ php artisan migrate
```
ここで上記のエラーが発生。

##DB接続先を確認
「Connection refused」ということは、DBへの接続が拒否られているっぽい。。
ここで.envのDB接続についての設定を確認。

DB_HOSTを見てみるとなぜか「127.0.0.1」になっていた！
あれ？DB名の設定はこれでいいんだっけ？

ymlファイルで確認すると。。

```
DB_HOST=mysql(仮)
```
あらまあ。(笑)
というわけでymlファイルに合わせる。。

##ymlファイルの「Volumes」の設定値にも関係があるらしい
上記の対応をしても解決しない場合以下のようなエラーが出ているかもしれない。

```
$ Access denied for user 'homestead'@'172.20.0.1' (using password: YES)
```

これはVolumesを削除すると解決する場合があるようです。

```
$ docker-compose down --volumes
$ docker-compose up -d --build
```

よければ試してみてください。

##DBのユーザ名などを「root」にしてたら引っかかった
再度マイグレーションしようとしたら、以下のようなエラーが発生。

```
mysqli_connect(): php_network_getaddresses〜(以下略)
```


dbに接続できないってことらしい。。あれ？コンテナの状況は？？
以下コマンドでログを見ると以下のエラーを発見。


```
$ docker-compose logs
```

するとこんなエラーが。。

```
 [ERROR] [Entrypoint]: MYSQL_USER="root", MYSQL_USER and MYSQL_PASSWORD are for configuring a regular user and cannot be used for the root user
```

ymlに記載しているDB情報に「root」と記載しているところがあった
(私の場合は「MYSQL_USER」)

これを任意の値に変更して再度マイグレーションを実行すると。。

```
Migration table created successfully.
・・・(以下略)
```

成功！！！

##終わりに
長くなりましたが、僕の場合はこんな感じで解決できました。

経験上(浅いですが。。)「.env」や「yml」ファイルの設定値が
おかしいことがほとんどなんですよね。。

英語の文献で苦しいことも多いので、
本記事が少しでもお役に立てれば嬉しいです！

何か誤った箇所があったら教えていただけると幸いです！
Imagickで画像に透かしを追加する

# 背景
画像の無断転載を防ぐために画像に透かしを入れたいなあと思い色々調べた結果、Imagickを使ったやり方が非常に簡単だったので記載

# 前提
Imagickがインストールされていること
されていない場合は下記コマンドでインストールできるはず

```
$ yum install ImageMagick-devel
$ pecl install imagick
```

# 画像加工開始
## 画像の用意
まずはベースとなる画像と透かし用の画像を用意

base.jpg
![dog-6240043_1280.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701685/166fc80e-ca90-e500-279f-2e46b614d718.jpeg)

wartermark.jpg
![475535f42bb6850395e2c6b606e5d5fc_t.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701685/45da6e31-509c-bf47-bbd5-8085313ef22f.jpeg)


それぞれの画像のImagickオブジェクトを生成

```
<?php
$base_image = new \Imagick('base.jpg');
$wartermark = new \Imagick('wartermark.jpg');
```

## 透かし画像の大きさを指定
今回透かし画像の横幅はベース画像の横幅と同じに設定
透かし画像の高さは縮尺の関係で横幅の1/2に設定

```
<?php
$img_width = $base_image->getImageWidth();
$img_height = $img_width / 2;

// 透かし画像の倍率を変更
$wartermark->sampleImage($img_width, $img_height);
```

## ベース画像に透かし画像を合成
ImagickのcompositeImageを使ってベース画像の上に、↑で大きさを変更した透かし画像を合成
今回はベース画像の中央に透かしが来るように調整

```
<?php
$base_image->compositeImage(
　$wartermark,
　\Imagick::COMPOSITE_SOFTLIGHT,
　($base_image->getImageWidth() - $img_width) / 2,
　($base_image->getImageHeight() - $img_height) / 2
);

// ベース画像を上書き
$base_image->writeImage('base.jpg');
```

実行した結果、base.jpgにwartermark.jpgの透かしが入ったものが生成
![article_18568650.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701685/b316b360-2c60-abe4-07c3-e11a196f4ddd.jpeg)



## 全体のコードを表示
これまでのコードを合わせるとこう

```
<?php
$base_image = new \Imagick('base.jpg');
$wartermark = new \Imagick('wartermark.jpg');

$img_width = $base_image->getImageWidth();
$img_height = $img_width / 2;

$wartermark->sampleImage($img_width, $img_height);

$base_image->compositeImage(
　$wartermark,
　\Imagick::COMPOSITE_SOFTLIGHT,
　($base_image->getImageWidth() - $img_width) / 2,
　($base_image->getImageHeight() - $img_height) / 2
);

$base_image->writeImage('base.jpg');

```

# 最後に
Imagickは今回の透かしを入れるだけでなく、リサイズやボカシ入れなど色々なことに使えて面白い
PHPマニュアルにも色々書いてあるので一度見てみると良いかも
国民機がWin10で蘇る！　Neko Project 21/w でPC-98②　~使い方・各種設定編~

皆さんこんにちは。
レトロなPCを触りたくなる今日このごろ、皆様いかがお過ごしでしょうか。
初回は沢山の方々に記事を見ていただき光栄です。
というわけで(←どういうわけ？)今回は**NekoProject 21/w**の簡単な使い方とCPUやメモリ、拡張ボードなど各種設定と筆者の設定を書いていきたいと思います。
まだ前回の記事をご覧になっていない方は[コチラ](https://qiita.com/UHAsikakutou/items/93c119d289715ab8a46d)からどうぞ。
#簡単な使い方
上手くスクショ出来なかったので文字で説明します。(キーボード操作取られるのでフォーカス合わせてるとWin-shift-s使えない)
・"Emulate"
仮想マシンの基本的な操作を行います。
CPU設定やディスクイメージ作成もここ。
・"FDD1""FDD2"
その名の通りフロッピードライブです。
対応している形式のFDイメージを仮想マシンに挿入します。
・"HardDisk"
IDEとSCSIでHDイメージをアタッチします。IDEはCD-ROMドライブも。
・"Screen"
表示方法、フレームレートなどを設定できます。
・"Device"
サウンドボードやメモリー等、所謂[Cバス](https://ja.wikipedia.org/wiki/C%E3%83%90%E3%82%B9)に接続するデバイスの設定です。キーボード、マウス、ネットワーク、MIDIもここ。
・"Other"
その他設定です。
メモリチェックを早くしたりバージョン確認ができたりします。(意味不)

ちなみにウインドウをダブルクリックするとメニューなし→メニュー+タイトルバーなし→メニュー+タイトルバーありを切り替えられます。
#各種設定
##CPU設定
まずは核となるCPUから。
"Emulate"から"Configure..."を選択。
以下のような画面が出ます。
(こっちは別ウィンドウなのでスクショ取れた)
![np2-config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2097267/ff4d330c-8ac7-3f5d-adf2-b2b2f777b519.png)
"CPU"のくくりがそれです。
クロックx倍率、CPUの種類が決められます。
昔の98のような動作なら(初代9801ぐらい向けのゲームなどを21でやると早すぎてゲームにならない時があります)20286や386、東方旧作や22Windowsをヌルヌルさせたい方はPentiumなど目的に合わせてお好みでどうぞ。
余り倍率を上げすぎるとバグります。
##メモリ設定
"Device"から"Memory"を選択。
まあ多ければ多いほどいいと思いますがこちらも多すぎるとバグります。(あとメモリチェックだるい)
あとはほかのソフトを動かすために他の常駐ソフトをチマチマ止めるあの日のイライラを体感したい方は少なめがいいと思います。
筆者は120,6MBです。今じゃ8GBでも満足できないのに昔は凄いですねー
##拡張ボード
"Device"から"Sound"を選択。
サウンドボードを選びましょう。
(正味他はそんなにいじんなくていい)
筆者は安定と安心の26K+86です。
MIDIは実機でシンセサイザーをお持ちのお金持ち様は"MIDI option...から"認識させることができます。
そうでない方も[VirtualMIDISynth](https://coolsoft.altervista.org/en/virtualmidisynth)と言うフリーソフトを使えば認識させて鳴らすことができます。
##スクリーン・その他設定
"Screen"を選択。
フレームレートは基本的にAutoでいいと思いますがグラボに自信がある方はFullだとぬるぬるします。またかくかくで見ずらいという方は下げるといいと思います。
私の環境(GTX-765M)だとAutoだとかくついてFullだと処理落ち激しかったので2/1に落ちついています。
WindowとFullscreenはその名の通りです。
"No wait"にするとPCの限界の速さで動きます。
"Other"の"Fast memcheck"をオンにするとメモリチェックが早くなります。
その他はいじらなくても大丈夫です。
#終わりに
ご覧いただきありがとうございました!
一応書くことは書いたつもりですが結構主観入ってますねすみません...
あと速足で書いたので確認はしていますが誤字などお見苦しい点があったら教えて下さい。
次回の内容もいつ書くかもそんなに決まってません。
書いてほしいことがあったらコメントで教えて下さい。
LGTMしていただくと飛んで喜びます!
それではみなさん楽しい98ライフを!
趣味でUnity触り始めてプログラマーとしてゲーム業界に就職するまで

#概要
この記事では、趣味でUnityを触っていたものの、プログラムについてほとんど勉強したことがないままプログラマーとしてゲーム業界に就職することを志した私が、就活や就職後の業務を通して思ったことを書き連ねたものになります。

#経歴
　大学では機械工学科を専攻していました。機械工学というのは、文字通り機械の設計方法について学ぶ学問です。その中でプログラミングを勉強する機会は多少あるものの、物理現象のシミュレーションを行うためにプログラムを作る程度で、`アプリケーションを開発したりアニメーションを動かしたりといった経験はほとんどありませんでした。`
　大学に入ったころから趣味でUnityを触っていたものの、プログラムを本格的に勉強したことはなく、`情報系の学問を学んでいる学生や専門学校で経験を積んでいる学生には知識も経験も遠く及びませんでした`。しかし、ゲーム業界に入って自分の作りたいゲームを実現したいという夢を持って就活を続けていくことで、昨年の10月末に1つだけ内定をいただき、無事ゲーム業界に就職することができました。

#就職活動を通して
　説明会や人事の方の話などを聞くと、「プログラマーとしての能力はそれほど重視していない、本当に大事なのは人間性や相性といった部分」という話をよく聞きました。就職活動を通して思ったのは、企業によって差はあるものの、この言葉は`半分本当で半分ウソ`なのだと思います。
　エントリーシートを提出するうえで、ほとんどの企業は作品の提出を求めたり、プログラム能力を図るためのテストをします。このようなことを通して実力を測り、最低ラインに満たなかった場合はお祈りということは、ほぼすべての企業で行っていることかと思います。実際、インターンの際にこのようなテストを受けたものの、`見たことも聞いたこともない単語のオンパレードに圧倒されて問題が全然解けずに、インターンの審査に落ちてしまったこともありました。`その経験もあって独学でプログラミングを勉強し、就職活動本番では最低限の知識を身に着けることができたと思います。（具体的にどのような勉強したかは後ほど…）
　一方で、エントリーシートの書類審査に合格した後の面接では人間性や相性を図るための質問が多い印象がありました。例えば、`一人向けのゲームを多く作っている企業に対して、面接で「対戦系のゲームをよく遊んでいます」と話してしまったら、面接官にあまり良い印象を与えることは難しいでしょう。`ゲーム業界に限った話ではないですが、自分の作りたいものや実現したいことが、企業の方向性とあっているか、ということも面接では重視しているのだと思います。

#プログラムの勉強について
　プログラマーとして就職活動するうえで、プログラミングの能力を高めるのは必要不可欠でした。ここからは、その勉強をするうえで思ったことを書いていこうと思います。
##①言語はたくさんかじるより、1つに集中して勉強する
　「1つの言語を高レベルで習得すれば、他の言語は比較的容易に習得できる」とはよくいうもので、実際多くの言語を勉強してもそれらを必ずしも使うとは限らないし、勉強していない言語を業務で急に使わざるを得なくなることもあります。
　具体的には、私は大学時代、趣味のUnityゲーム制作でC#を使い、大学の授業でC言語を使い、大学の研究でPythonを使い、就職活動を続けるうえでC++を使っている企業が多いことを知り並行して勉強していました。しかし、業務上使用するのはC#とそれまで一切触ったことのなかったJavaScriptでした。
　このように、`就職してからどんな言語を使い始めるかなんて就職してからもわからないので、広く浅く学ぶよりはとにかく一つの言語に集中して勉強する`のがいいと思います。
##②「オブジェクト指向」の理解度は徹底的に高める
　趣味でUnityを用いてゲーム制作する程度では、「オブジェクト指向」という言葉は見たことも来たこともありませんでした。しかし、就職活動の際に受けた入社試験では必ずといっていいほどオブジェクト指向関連の出題がされます。`業務に携わってからもオブジェクト指向は当たり前のように使用するもの`なので、プログラマーを目指すのであれば必要最低限絶対的に学ばなければいけないことだと思います。ちなみに、オススメの勉強法としては「オブジェクト指向」に関する参考書を一つ購入して、それを最後まで続けることです。1日1時間でも参考書を続けていれば、数か月後には必ず一定以上の力はついていると思います。（最後に私が使用していた書籍を紹介させていただきます。）
##③規模の大きいアプリケーション開発を通して経験を積む
　ここで言う「規模の大きい」というのは、おおよそ6ヶ月以上の開発期間を要するくらいの規模だと思っていただければと思います。アプリケーション開発とはいったものの、ゲーム作品でもウェブアプリでもなんでもいいです。私の場合は研究のために作成したシミュレーションプログラムでしたが、これを制作した経験が就職活動でも就職後の業務でも大いに役に立ちました。というのも、上記の「オブジェクト指向」を習得するうえで規模の大きいアプリケーション開発はとても適しています。さらに、この経験を通して得られた失敗やエピソードは面接において一つの武器になります。可能であればチームで開発できるのが好ましいですが、それが難しくても`一つの作品を最後まで作ることは絶対に無駄にはならないです。`

#独学でもプログラマーとしてゲーム業界に就職できた！
　就職活動を始めた当初は「オブジェクト指向」なんて見たことも聞いたこともなかった私でしたが、現在は一人のゲーム企業の社員としてゲーム開発に携わっています。もちろんプログラマーとして就職するうえで一定以上の能力を得る必要はあります。しかし、就職活動を始めるまではプログラムをかじった程度しかなくても、そこからコツコツと勉強をすれば絶対に最低限の能力は身に着けることができると思います。
もし自分の実力に自信がなくてゲーム業界に就職するか悩んでいる方がいたら、本記事が少しでも力になれたら幸いです。

#参考資料
https://www.amazon.co.jp/%E7%8B%AC%E7%BF%92%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3C-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%83%E3%82%AF%E3%83%BB%E3%82%A2%E3%83%BC%E3%83%88/dp/479811720X
kaggle API setup scripts (メモ)

こんな感じで組めばOK
前提：
* dockerをrootで実行してる人
* docker imageにjsonを登録してない人

# ファイル

|-./setup.sh
|-kaggle.json

# setupスクリプト

```shell:setup.sh
#source ./setup.shで実行してね

pip install kaggle

export LANG=C.UTF-8
mkdir ~/.kaggle/
cp kaggle.json ~/.kaggle/

chmod 600 ~/.kaggle/kaggle.json

```
SFP+ とは？

## 勉強前イメージ

ケーブル？？

## 調査

### SFP+ とは

Small Form-Factor Pluggable Plusの略で、、
光ファイバーを通信機器に接続するための光トランシーバの規格の一つで、
SFPと形状やサイズはほぼ同じ。
SFPと違うのは、10Gでの通信を利用することができる。

### そもそも光トランシーバ とは

通信機器と光信号の相互交換を行うための装置で、機器に装着して使用します。
上記でも記載したとおり、ギガビットイーサネットで通信するSFPとほぼ同様の形状をしています。
昔は形状がバラバラだったり、大きかったりしましたが
現在はほぼ同様の形状をしているため、1GbEと10GbEを同じスイッチに混在させることができるようになりました。
また省電力化も行われました。

## 勉強後イメージ

光ファイバーはほぼ知らなかったけど、
光ケーブルと機器を相互通信させるためには光トランシーバーが必要なのね。

## 参考

- [SFP＋って？日立電線に聞いた光トランシーバの基礎](https://ascii.jp/elem/000/000/431/431957/)
- [SFP+ 【Small Form-Factor Pluggable Plus】](https://e-words.jp/w/SFP-_.html)
Unity初心者が知っておきたいTips：Serializableを使おう

# Serializableとは？？
クラスをシリアル化できることを示す属性です。
Unityで使用すると、インスペクターに **サブプロパティを埋め込むことができるようになります。** 
[Unityリファレンス](https://docs.unity3d.com/ja/2021.2/ScriptReference/Serializable.html)
[Microsoftリファレンス](https://docs.microsoft.com/ja-jp/dotnet/api/system.serializableattribute?)

# どんな風に使う？？
- 例えば、以下のような形でCharacterクラス（キャラクターのクラス）とStatusクラス（ステータスのクラス）でクラスを分けて、以下のような形で定義します。
- この際、**StatusクラスにSerializable属性** を付与します。


```Status.cs

using UnityEngine;
using System;

namespace QiitaGame
{
    [Serializable]
    public class Status
    {
        [SerializeField]
        private int _hp;
        [SerializeField]
        private int _mp;
        [SerializeField]
        private int _attackPower;
        [SerializeField]
        private int _defensePower;

        public int Hp { get => _hp; set => _hp = value; }
        public int Mp { get => _mp; set => _mp = value; }
        public int AttackPower { get => _attackPower; set => _attackPower = value; }
        public int DefensePower { get => _defensePower; set => _defensePower = value; }
    }
}

```
```Character.cs

using UnityEngine;

namespace QiitaGame
{
    public class Character : MonoBehaviour
    {
        [SerializeField]
        private Status _status;

        public Status Status { get => _status;}
    }
}

```
- Characterクラス（コンポーネント）をヒエラルキー上のオブジェクトにアタッチすると、インスペクタに以下のように表示されます。

![スクリーンショット 2021-11-11 8.32.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/367d2215-5dd9-d825-3b72-53a20dd0278e.png)

- 「Status」の▷をクリックして展開すると・・・

![スクリーンショット 2021-11-11 8.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414549/fbb3fa8b-3385-a3e5-8f88-51e605ff4c32.png)

- サププロパティが展開されましたね！
IEEE829から学ぶテストドキュメント～⑦テストインシデントレポート編～

#1．概要
IEEE829から学ぶテストドキュメントの第7回目として、テストインシデントレポートについて記載いたします。テストインシデントレポートは、**「テスト中に発見された不具合をさらに調査するために、不具合の詳細を記載した」**ドキュメントになります。

基本は不具合1件につき1枚作成し、修正担当者に渡します。現場だとレポート（報告書）という形はあまりとらず、Redmine等のチケットで管理されていることが多いです。

また、チケット管理の場合、その後の修正・修正確認まで記載し不具合のライフサイクルまで管理します。（IEEE829のテストインシデントレポートは、不具合報告までしか記載しません）

テストインシデントレポートで最も重要な点は、「不具合をさらに調査」することが目的ですので、**修正担当者が調査しやすくなる様な項目**が記載されていること、です。そのため、調査しやすくなるような項目が記載されていれば、テストインシデントレポートとして問題ありません。

#2．IEEE829のテストインシデントレポートについて

- テスト不具合レポート識別番号
- 不具合の要約
- 不具合の記述（入力項目、期待された結果、実際の結果、環境、再現性）
- 影響（他のテスト計画、テスト設計仕様、テスト手順、テストケース使用に対して与える影響）

上記がIEEE829のテストインシデントレポートに記載する項目になります。重要な部分は**「不具合の記述」**で、ここを詳しく書くことで修正担当者が修正しやすくなります。

また「不具合の要約」ですが、できる限り一目見て不具合の内容がわかるようになっているといいです。

■わかりやすい「不具合の要約」の書き方

- 発生場所（画面名、機能名、項目名など）を書く
- 重要な前提条件がある場合、必ずそれを記載する（会員でログインしている状態で、など）
- 発生条件が複雑な場合、無理して書かなくていい（特定のパターンでボタンを押すと、など）
- 発生した事象はそのまま書く（画面に○○とエラーが表示される、など）
- あいまいな言葉を使わない（画面が正しく表示されない、など）

#3．不具合の記述に記載する項目の詳細

- 入力項目

不具合が発生した際の入力方法を記載する。またその手順でもいい。
例）
1．○○画面に遷移する
2．○○ボタンを押下する
3．次の画面遷移を確認後に、△△ボタンを押下する

- 期待された結果

本体発生してほしかった事象を記載する。基本的には仕様書に書いてあることを記載する。ただ、仕様書等がない場合は、自身の経験からあるべき期待結果を記載してもいい。

- 実際の結果

発生した事象をそのまま記載する。もしエラーメッセージが表示されている場合は、そのメッセージをそのまま記載する。

- 環境

不具合が発生した際の環境を記載する。
例）
・アプリ、ソース、ブラウザ、OSのバージョン
・テストしたときに利用したツール名
・利用したテストデータ（入力項目に入れてもいい）

- 再現性

どのくらいの頻度で再現するのか、再現率を記載する。Web系だとほとんど100％になるので記載することはない項目。組み込みなどハードウェアを利用するものは、タイミングによって不具合が発生するorしないことがあるので記載する。

##3.1　そのほか記載した方がいい項目

- 修正の優先順位

不具合によってはその後のテストに影響を受けることがあるので、テストの進捗に影響を受けそうな不具合は、早めに直してもらうように依頼した方がいい。また、特に複雑にせずに3段階評価ぐらい優先順位を表す。

高：急ぎ修正してほしい
中：通常通りに修正してほしい
低：何かあれば後回しにしてもいい

- 影響範囲

記載した範囲以外にも修正することで影響を受けそうな画面、機能等があれば記載する。修正担当者によっては、記載されているところを記載されているように修正するだけで、影響範囲を見ないことがある。

- 備考

その他テスト中に気になったことがあれば記載する。例えば、特定の手順を実施すると不具合が再現しない、など。

#4．レポート記載前にやっておくべきこと

・その他のブラウザでも再現しないか（Webシステムであれば）
特にChromeは高速で動作するためにキャッシュを取りやすく、それが原因でChromeだけ発生する不具合もある。

・別のテスト環境でも再現しないか（環境が複数ある場合）
時折、自分のPCでしか再現しない不具合というものもある

・できれば動作中のエビデンスを取っておくこと

#5．まとめ

テストインシデントレポートは、**「テスト中に発見された不具合をさらに調査するために、不具合の詳細を記載した」**ドキュメントです。そのため、修正担当者が不具合を修正しやすくなる情報があれば、ドキュメントとして問題ありません。

また、修正担当者が想定通りに修正してくれないこともあるので、想定される期待結果や影響範囲等をきちんと書いておくと対応してくれる場合もあります。
Unity で create new paletteができない 

unity3D　を使って2Dゲームをつくっているとタイルパレットでオブジェクトを配置していました。
最初にタイルパレットを作るときは問題なかったのですが、
新たにタイルパレットを追加しようとしると何回やっても新しいパレットが追加できませんでした。
多分Unityの何らかのバグなんでしょうが、私が解決策としてはいろいろ試した結果
通常通りタイルパレットをcreate new paletteして（この時点ではパレットは作られていない）
そこでセーブするとなぜか新しいパレットが追加されます。
私だけの現象かもしれませんが、はまった方は一度ためしてください。
Linux環境のPythonでmsvcrt的なkbhitやgetchをつくりた～い！ ~挫折編~

# はじめに
こんにちは、麻菜結と申します。最近はPythonで外部モジュールに頼らず色々実装してみる縛りプレイのようなものをしているのですが、環境依存の少ないクロスプラットフォームなコードの中でキーボードイベントの取得をする必要が出てきたのでそれに挑戦した記録です。

# どんなものをつくるのか

先ほど`msvcrt`の`kbhit`や`getch`と言いましたが、何を作るのか具体的に示したいと思います。関数名は同じにしたいのであえてラップしたような関数として記述します。

kbhitの方はそのまんまですね。

```kbhit的なやつ.py
# 呼び出すとキーボードが入力されているかを返す関数。
import msvcrt
def keyboardHit():
    return msvcrt.kbhit()
```

getch的なやつの方は、入力されていたらそのキーを、そうでは無かったら-1を返して欲しい関数です。

```getch的なやつ.py
import msvcrt
def getKeyboardCharactor():
    if keyboardHit():
        return int.from_bytes(msvcrt.getch(), byteorder="big")
    return -1
```

# 環境

```
$ python --version
Python 3.7.3
$ cat /proc/version
Linux version 5.4.151-16906-g86cbb761e8c4 (chrome-bot@chromeos-ci-legacy-us-central1-b-x32-130-ws8g) (Chromium OS 13.0_pre428724_p20210813-r7 clang version 13.0.0 (/var/tmp/portage/sys-devel/llvm-13.0_pre428724_p20210813-r7/work/llvm-13.0_pre428724_p20210813/clang 9968896cd62a62b11ac61085534dd598c4bd3c60)) #1 SMP PREEMPT Sun Nov 7 19:34:19 PST 2021
```

お気づきでしょうか。実行環境はchromeOSのcrostini、つまりコンテナ。なのでLinux特有のデバイスファイルを見れば生の情報があるんだからそれ読めば良いじゃんが使えません。

# 方策
じゃあどうするんだよと言う話なのですが、Pythonの`termios`と`tty`と`select`とを駆使してなんとかします。と言っても実はこのstackoverflowのコードの改変なのですが。
[Non-blocking console input?](https://stackoverflow.com/questions/2408560/non-blocking-console-input)
簡単に流れを説明すると、
1. 通常の標準入力の状態を保持する
2. CBREAKモードという入力バッファを用いない（≒エンターキーを押す必要がない）モードへ変更する。
3. selectというIO処理の完了を待機する関数を用いて標準入力が読み込み可能か検証する。
4. 3の処理を待って1文字でも書き込まれたら読み出す。
5. 終了時には1で保持した通常の標準入力の状態をもとにCBREAモードKから抜け出す。

という感じですね。英語が読めないのでコードを何度も咀嚼した結果多分こうなんだろうなというものですが。

# コード
それでは方策をもとに記述したコードをお見せします。

```nonblock_test.py
import sys
import select
import tty
import termios

# 3. selectは難しいから公式のリファレンスマニュアルみて
def keyboardHit():
    return select.select([sys.stdin],[],[],0)==([sys.stdin],[],[])
# 4. -1を出力するためにkeyboardHit関数は結局必要
def getKeyboardCharctor():
    return ord(sys.stdin.read(1)) if keyboardHit() else -1

# 1. 通常状態保持
old_fn = sys.stdin.fileno()
old_tt = termios.tcgetattr(old_fn)
# 2. CBREAKモードへ変更
tty.setcbreak(old_fn)
try:
    print(getKeyboardCharctor())                              # これはちゃんと-1が出力されるかのテスト
    while True:
        if keyboardHit():
            v = getKeyboardCharctor()
            print(v)
            if(v == 27):                                      # エスケープキーで終了
                break
finally:
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_tt)   # 5.通常状態へ回復

```

動かしてみるとそれっぽく動くと思いますが、この動作にはCBREAKモードへの変更とそれからの回復がキモで、プログラムの始まりと終わりに`1`、`2`と`5`の工程が欠かせません。つまり、`kbhit`や`getch`みたいなモジュールインポートしてサクッと使うみたいなことが出来ず、標準入力の状態を変更するのでプログラム内だと多分inputとかが上手く動きません（エコーバックがなかったりする）。

# おわりに
今回は結局作りたいものは作れなかったよという記事ですが、これはこれで使いようがありそうではあります。日本語で書かれたノンブロッキング入力の情報があまりみあたらなかったような気がするので、まあそういう意味でも意義があったら嬉しいですね。~~「縛りプレイなんかせずPygame使えよ」とか言わない~~
ここまでお読みくださってありがとうございました。何かお役に立ったなら幸いです。
EC2のカスタムメトリクスを取るためのSSMオートメーション

# tl;dr
EC2でメモリやディスクのカスタムメトリクスを取るためにCloudWatch Agentを入れて設定を食わせるのは意外とめんどい。
のでSSMのオートメーション(ランブック)を作った。

# デフォルトではメモリのメトリクスが取れない
取れない。Compute Optimizerでメモリのレコメンドを受けることもできない。つらい。
![f4b69f4a-499d-45cf-b0fe-a23db4f60b69.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130232/aa5cc7b3-c39b-2b0b-0918-0ecc7d19caab.png)


# ドキュメント通りのインストール方法
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance-fleet.html

IAMロールをアタッチして、パラメータストアに設定を置いて、インストールするコマンドドキュメントと設定を食わせるコマンドドキュメントを実行すればいいだけではある。しかし、これをEC2インスタンスを作るたびにやるのはちょっとしんどい。本当はユーザーデータでインスタンス作成時に自動で行えるのが理想だが、オートメーションでやってみる。


# 準備
IAMロールのアタッチとパラメータストアに設定を置く部分は事前にやる。
CloudWatch Agentの設定はこの辺を参考に。

https://dev.classmethod.jp/articles/cloudwatchagent-nocli-install/

`measurement`は正しい名前じゃないとCompute Optimizerに認識されないので注意。

https://docs.aws.amazon.com/ja_jp/compute-optimizer/latest/ug/metrics.html


# オートメーション(ランブック)
以下のyamlでオートメーションを作成する。

- インスタンスID指定で1つのインスタンスにインストールする場合
  - https://gist.github.com/tinoji/e0d265e85d530191b2ce4f943cedcb45
- タグ指定で複数のインスタンスにインストールする場合
  - https://gist.github.com/tinoji/34b468cba43fdeb4e90f01161f2f13ef


パラメータ埋めて実行すればインストールと設定が終わる。個人的にはこれぐらいの手間なら許容できる。
![スクリーンショット 2021-11-11 22.27.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130232/234ee316-654e-2f32-44a2-0b5ca6759805.png)
言語処理100本ノック 2020 (Rev 2) を完走する（７章-67まで)

言語処理100本ノック 2020年版(https://nlp100.github.io/ja/)をPythonで解いてみています

ソースコードは[GitHub](https://github.com/marzg510/mynlp100py)にて公開してます

本日は「第７章:単語ベクトル」の67.k-meansクラスタリングまで完了しました

## 参考にした記事
- [言語処理100本ノック2020年版を解いてみた【第7章：単語ベクトル 67】](https://www.soh-devlog.tokyo/nlp100-7-67/)
- 他多数
git addでfatal: pathspec 'hogehoge' did not match any filesが出た時は

```
git add ファイル名
```

ファイルをステージングエリアに登録するコマンド、「git add」を追加した際に、

```
fatal: pathspec 'ファイル名' did not match any files
```
上記のようなエラーが出た場合は、

と出る場合は、git addコマンドで指定したパスが間違っている場合に出る。

##### ファイル名が間違って記入された時も出てくる。

##### 上記のようなエラーが出た場合は、まずファイル名が間違ってないか確認しよう。
ラビットチャレンジ AIを学ぶための本格数学講座で詰まったときに見た動画

本記事は以下のラビットチャレンジの際に講座動画のほかに見ていた
Youtubeの動画リストです。
自分のメモも兼ねており、随時更新していきます。

■ラビット★チャレンジ
　https://ai999.careers/rabbit/

## 基礎数学

高校数学に関しては下記の方の動画を中心に見ていました。
練習問題もあるので、実際に覚えた公式を使って復習することができます。

### 因数分解

<iframe width="360" height="315" src="https://www.youtube.com/embed/T57HFX1u2UU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<iframe width="360" height="315" src="https://www.youtube.com/embed/WeicaivQ7DU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 線形代数学(行列)

おおむねヨビノリ先生の動画です。
下記の動画だけでなく、線形代数入門でリストになっているので
そちらもおすすめです。

### 線形代数って？
 https://oguemon.com/study/linear-algebra/hello-world/

### 余因子展開

<iframe width="360" height="315" src="https://www.youtube.com/embed/VwZ0EtT_UiI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### 逆行列

<iframe width="360" height="315" src="https://www.youtube.com/embed/FbAKS6OY0k0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### 固有値・固有ベクトル

<iframe width="360" height="315" src="https://www.youtube.com/embed/_TgBFx0jwRQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

## 微分積分学

## 統計学

条件付確率については下記の動画で学びました。
挙げられていた例が非常にわかりやすく、一発で理解出来ました。

### 条件付確率
　
<iframe width="360" height="315" src="https://www.youtube.com/embed/8SrwqODR0a0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

### ベイズの定理

<iframe width="360" height="315" src="https://www.youtube.com/embed/oUN_GhB00fU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

###
Linux From Scratchやってるときにやらかした話

<h1>一番やってはいけないミス</h1>
この前Linux From Scratch(LinuxのOSを一からビルドして作るやつ)をやっていたら、一番やってはいけないミスを犯してしまいデータ吹き飛びました。
そのミスとは、
「chrootしてると思いこんでシステムファイル置き換えちゃった」
です。
どういうことかというと、`Linux From Scratch Ver. 10.0-systemd`では、途中で作ったOSにchrootしてから作業を続行する指示があります。
そこでchrootしてから、作ったOS内で必須ソフトウェアをビルドする、というものだったのですが、なんと、chrootするのを飛ばしてそのままビルドしちゃったんです、glibcを。
一度Linux From Scratchをやったことがある人ならわかるとおもいますが、glibcをビルドしてUbuntu(ホスト)にインストールするとOSが壊れます。理由は知りません。これはLFS Book(=手順書)に注意事項として書いてあります。
さらに、普通の権限（=一般ユーザー）ならインストールは不可能だったけど、何故かchrootするためにrootにする指示があり、「root権限でglibcをビルドしてホストにインストールしてしまった」ということが起こりました。
その結果、勿論Ubuntuは起動不能に、クリーンインストールでこれまでの手順がすべて水の泡になってしまいました。
次からは指示を見逃さないようによく見たいと思います。
<h1>余談</h1>
その後、Windows11のWSL2でもう一度最初からやっていたのですが、またまたエラーに直面。
そして、サポート用メーリングリストに質問したら、「libstdc++のインストールがおかしいんじゃない？」みたいなことを言われたので、もう一度libstdc++をインストールしようとしたとき、事件が起きました。
実はWindows11でInsider Programに参加してるのですが、なんと、インストール中にGSOD[^1]に遭遇し、壊れてしまいました。
次からはdevチャンネルからベータチャンネルにして、不安定になる可能性を少なくしようと思います。
<h2>さらに余談</h2>
この記事を書いてる途中にもGSODに出くわしました。
色んな場面で出てくるっぽいです。
前もVirtualBoxでDebian起動したら出くわしました。
~~早く修正してくれぇぇ...~~
[^1]: Windows11からはBSOD(Blue Screen Of Death)からGSOD(Green Screen Of Death)に切り替わったらしいです。何故...?
Serverless Frameworkで画像(バイナリ)をダウンロードするAPI

# まえがき

Serverless FrameworkとAPI Gatewayで画像をダウンロードするAPIを作ってみました。
ネット上の情報だとうまくいかなかったので、試行錯誤を繰り返すことになり大変でした。

# ソース

https://github.com/t-mine/qiita/tree/master/serverless-image-dl-api

# 手順
## Serverless Frameworkインストール
```
npm install -g serverless
```

## プロジェクト作成
```
serverless create --template aws-nodejs --name serverless-image-dl-api --path serverless-image-dl-api
```

## Serverless FrameworkにAWSの認証情報を設定
AdministratorAccessポリシーを付与したIAMユーザーを用意して、設定します。

```
serverless config credentials --provider aws --key YOUR_ACCESS_KEY_ID --secret YOUR_SECRET_ACCESS_KEY
```

## handler.jsを修正

S3から取得した画像をbase64に変換してリターンしています。

```handler.js
'use strict';

const S3 = require('aws-sdk/clients/s3');
const s3 = new S3({
  apiVersion: '2006-03-01',
  region: 'ap-northeast-1',
});

module.exports.getImage = async () => {
  const params = {
    Bucket: 'apigateway-test-20211111',
    Key: 'test.png',
  };
  const data = await s3.getObject(params).promise();
  return data.Body.toString('base64');
};
```

## serverless.ymlを修正

・`contentHandling: CONVERT_TO_BINARY`を設定することで、Lambdaのレスポンス(base64)がバイナリに変換されます。
・`integration: lambda`を設定することで`contentHandling: CONVERT_TO_BINARY`が有効になります。

```serverless.yml
service: serverless-image-dl-api
frameworkVersion: '2'

provider:
  name: aws
  runtime: nodejs12.x
  lambdaHashingVersion: 20201221
  region: ap-northeast-1
  stage: dev
  iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:*
      Resource: 'arn:aws:s3:::apigateway-test-20211111/*'

functions:
  getImage:
    handler: src/functions/handler.getImage
    events:
      - http:
          path: getImage
          method: get
          cors: true
          response:
            headers:
              Content-Type: "'image/png'"
            contentHandling: CONVERT_TO_BINARY
          integration: lambda

```

## S3に画像をアップロード
apigateway-test-20211111というバケットを作成。
test.pngというファイルをアップロード。

## デプロイ

```
serverless deploy
```

## 動作確認

デプロイ時に出力されるURLにブラウザからアクセス。
画像が表示されれば成功。

## リソースの削除

```
serverless remove
```
tsconfig設定ミスでstorybook起動時にJavaScript heap out of memoryを出したメモ

## 概要
表題のとおりのミスをやらかしたのでメモ。
tsconfigの設定をいじっている間におかしくなってしまったらしい。

## 解決法

`node_modules`をincludeから外したら解決した。
そもそもnode_modulesをトランスパイルしようとしているのがおかしい（[参考: tsconfigオプション](https://qiita.com/ryokkkke/items/390647a7c26933940470#include))。

```diff:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "dom",
      "dom.iterable",
      "esnext"
    ],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx",
    "paths": {
      "@/*": ["../../client/src/*"]
    }
  },
  "include": [
    ".storybook",
    "../../client/src",
    "./stories"
-    ,"./node_modules"
  ]
}
```

## エラー
[Reactでstorybook起動時にJavaScript heap out of memoryが出たけど解決した話](https://qiita.com/tyoukan__/items/2970e003c3605d616154)とは原因が別だったもよう。

```

95% emitting fork-ts-checker-webpack-plugin
<--- Last few GCs --->

[2292:00000270E5D31270]   112199 ms: Mark-sweep (reduce) 2047.6 (2083.2) -> 2047.0 (2083.7) MB, 1822.8 / 0.1 ms  (+ 66.7 ms in 17 steps since start of marking, biggest step 
8.3 ms, walltime since start of marking 1901 ms) (average mu = 0.542, current mu =

<--- JS stacktrace --->

FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
 1: 00007FF6AFC8013F v8::internal::CodeObjectRegistry::~CodeObjectRegistry+112495
 2: 00007FF6AFC0F396 DSA_meth_get_flags+65526
 3: 00007FF6AFC1024D node::OnFatalError+301
 4: 00007FF6B05419EE v8::Isolate::ReportExternalAllocationLimitReached+94
 5: 00007FF6B052BECD v8::SharedArrayBuffer::Externalize+781
 6: 00007FF6B03CF61C v8::internal::Heap::EphemeronKeyWriteBarrierFromCode+1468
 7: 00007FF6B03CC754 v8::internal::Heap::CollectGarbage+4244
 8: 00007FF6B03CA0D0 v8::internal::Heap::AllocateExternalBackingStore+2000
 9: 00007FF6B03EEA06 v8::internal::Factory::NewFillerObject+214
10: 00007FF6B0121CD5 v8::internal::DateCache::Weekday+1797
11: 00007FF6B05CF3E1 v8::internal::SetupIsolateDelegate::SetupHeap+494417
12: 00000270E7B68B25
```
Windows Search の 画像検索で、画像投稿されたコードを取得する（BingのOCR利用）

# 背景
Power Automate の投稿とかでよく画像投稿がされてることがあります。
Action 調べる程度なら良いんですが、Rest API の内容を拾いたい時とか、画面を見ながら自分で打ち込むのだるいなぁと思ってたら、もっと簡単な方法あるじゃんって気付いたので共有まで

# 概要
Bing で画像検索すると、自動的に OCR 解析した結果を出してくれるので、これを利用する。
でもって、画像を渡すのも面倒なので、Windows の標準機能を利用する。

# 方法
1. Win ＋ S で Windows Search を起動する
1. 右下の、画像検索を起動<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/8df197e3-ffba-9a5d-7686-c2bae33dfbb8.png)
1. 範囲指定で読み取りたいコード画像を指定<br>
例として、以下を利用させてもらってます。<br>[How to get started with HTTP requests in Power Automate](https://techcommunity.microsoft.com/t5/microsoft-365-pnp-blog/how-to-get-started-with-http-requests-in-power-automate/ba-p/2121908?lightbox-message-images-2121908=254237i2C928068C970F40D)
<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f81020ca-a062-fb6f-806e-b9ae2dad60b1.png)
1. Bing で解析結果表示<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/d0d6d84e-aa68-73d9-91fc-611568995812.png)
1. あとは煮るなり焼くなり

## 解析結果の確認
以下のように、英語ならいい感じです。

```json:JSON解析例
"displayName": "M365 Princess Blog".

"teamsApp@odala.bind" :
"https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/com.microsoft.tea
mspace.tab.web"

"configuration": (
"contentUrl": "https://m.365princess.com".
"websiteUrl": "https://m365princess.com"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ba403555-2cc8-dc03-7367-c1a82a62f2b0.png)

:::note warn
現時点では日本語は未対応っぽい・・。とはいえ、英語圏の情報取得が多いので良いかな、と
:::

# keyword
Retreive code from image with bing via windows search
FirebaseのHostingでdeployしたのにもかかわらず、デフォルトのページしか開かずデプロイが反映されない

# はじめに
firebase init
し、確かにビルドしたあと、
firebase deploy --only hosting
したのに、下記みたいな画像のページしか表示されない。
![firebase_not_deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2251160/780954a8-412e-2f87-95a1-29fb61b566d6.png)
画像は下記サイトから借用
https://qiita.com/fukusin/items/c5f5592b50101dfaea25#-firebase-hosting-setup-complete-%E3%81%AE%E3%81%BE%E3%81%BE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%8C%E5%8F%8D%E6%98%A0%E3%81%95%E3%82%8C%E3%81%AA%E3%81%84




<!-- 各チャプター -->
<a id="#解決策"></a>
# 解決策
クロムのキャッシュを削除してから、もう一度アクセスしたら解決！
キャッシュの消し方
①クロムブラウザの右上の︙をクリック
②その他のツール→閲覧履歴の消去
③期間を「全期間」に
④「キャッシュされた画像とファイル」をチェック
⑤「閲覧履歴データを消去する」をクリック

これのあと、もう一度、以前デプロイしたURLにアクセスすると、うまくデプロイが反映されている！



<a id="#reference"></a>
# 参考文献
- [Chromeのキャッシュを完全に削除する方法](https://www-creators.com/archives/504)
htmlとcssを完全に理解する【導入】#1

#目的
このシリーズではhtmlとcssを完全に理解するまでの道筋を大まかに書いていきます．対象は初めてウェブページを作成したいけど何をすればよいかわからない人です．このシリーズを読み終わるころには，あなたはウェブページ作成マスターだ！
各記事は以下の表から飛べます．

|       | html編                      |       | css編                              |
|:-----:|:---------------------------:|:-----:|:----------------------------------:|
| 第1回 | 導入                         | 第9回 | 文字 (coming soon)                 |
| 第2回 | [環境構築](https://qiita.com/kage1020/items/66bbdac4b26068b78146)| 第10回 | 罫線 (coming soon)                |
| 第3回 | [タグ Part1](https://qiita.com/kage1020/items/b5c833cb928934d0d1e6)| 第11回 | inlineとblock (coming soon)      |
| 第4回 | タグ Part2(coming soon)      | 第12回 | リスト (coming soon)              |
| 第5回 | 画像 (coming soon)           | 第13回 | テーブル(表) (coming soon)        |
| 第6回 | テーブル(表) (coming soon)   | 第14回 | レスポンシブデザイン (coming soon) |
| 第7回 | リンク (coming soon)         | 第15回 | 各ブラウザへの対応 (coming soon)   |
| 第8回 | レイアウト (coming soon)     |

#html is 何?

htmlとはHyperText Markup Language(ハイパーテキスト マークアップ ランゲージ)の略で．．．え？そんなのどうでもいい？
わかりました．簡単に言うと，「文字や画像を工夫して配置してなんかいい感じにしようぜ」言語です．
こんなやつ↓

```html
<html>
<body>
  <h1>タイトル<h1>
  <p>段落</p>
  <img scr="this-is-url">
</body>
</html>
```

#css is 何?

cssとはCascading Style Sheets(カスケーディング・スタイル・シート または カスケード・スタイル・シート)のりゃｋ(゜oﾟ(○=(-_-;
「文字や画像をなんかいい感じに装飾しようぜ」言語です．
こんなやつ↓

```css
body {
  margin: 0 auto;
  color: white;
}
```

***

全てのウェブページはこれら2つ(だけではない)を用いて作成されています．他にも様々な言語がウェブページ作成にかかわっていますが，本シリーズでは割愛します．

次回は実際にウェブページを作るためのの環境構築です．全15回の中で最も重要といっても過言ではないので，頑張りましょう．
次回→[htmlとcssを完全に理解する【環境構築】#2](https://qiita.com/kage1020/items/66bbdac4b26068b78146)
入社半年で「カイゼン王」になった話

## 自己紹介
未経験で21年5月に自社開発企業に入社した、新米エンジニア。
リモートワークでチーム開発をしています。
ラーメン:ramen:がとにかくスキ！！

## カイゼン王ってなんぞ
私の開発チームでは、毎日夕会後は***「KAIZENアワー」***、
2週間に一度の半日は***「KAIZENデー」***の時間を設けています。
この時間はチーム開発時間内では取り組めない何かしらの改善を、個人的に行います。

やることは、開発、課題の整理、業務改善、アウトプット…etc
チームに貢献できることなら、なんでもよいです。

[KAIZENアワー参考](https://codezine.jp/article/detail/10465)

そして、この時間の課題対応件数が多い人を***「カイゼン王」***と呼びます。

## 貢献できない自分に悩んだ
私の開発チームのみなさんは、地味にすごい動いてくれます。
「このツール作っておきました～」
「この件、調査しておきました～」
とかとか、さらっと言えちゃう。

大変そうに見せず、開発チームのために自ら動いてくださるかたばかりです。

また、チーム開発中にも私に説明してくださったり、
開発時間外でも質問すると丁寧に教えてくださいます。

未経験で入社した私にはとても恵まれた環境なのですが、
「教わってばかりで何も貢献できていない」
「チームにとってお荷物だ」
という思いがどうしても拭えず、もやもやしている時期がありました。

そして、***「とにかく成長しなくては！」***という思いから、開発に慣れるため、
私でもできそうな課題をどんどん対応していくことに決めました。

（対応した内容は、もちろんレビューをいただいてます。）

## 自分でも、ちょっと役に立ってた
そんなある日、開発チームのメンバーとお話している中で
『【私の名前】さんが課題を対応してくれるから、僕らはテストコードの作成とか、
　勉強会の準備とか、他のことを安心してできるよ』
っと言ってくださる方がいました。

このことがきっかけでもやもやした気持ちが軽くなり、
「更に課題を対応しまくってチームに貢献しよう！！」と火が付きました:fire:


## 課題をたくさん対応した結果、成長した
私が1人で対応した課題は、気づけば半年間で25件を超えていました。
12月締めで決定される「カイゼン王」の座はかたいので、一足早く記事化しましたが実際にはまだなっていません笑

最近では***「ちょっと難しいけどお客様からの要望が多い課題」***も徐々に対応し、
お客様目線も考えられる余裕も出てきました。

もちろん、チーム開発の中でも成果が出ていると感じます。

分からないことの方がおおく、チームにとってプラスにはまだなれていませんが、
くよくよせず、前のめりな気持ちで開発していきたいと思います！！

最後まで読んでいただきまして、ありがとうございました:smile:

## 追記
2021年12月までに対応した課題数は**「40件」**になり、無事改善王となりました🎉
（全社に紹介してもらえることになり、締め切りギリギリまでがんばりました笑）
perlでSQLiteから取得したレコードをJSONで出力する

# 概要
　SQLiteにperlにて問い合わせ、取得レコードをJSONに変換して返す方法についてまとめます。サーバサイドでの処理を想定しています。
　クライアントとなるwebブラウザ上でピボットテーブルを実現するpivottable.jsや一覧表示用リストのtabulator.jsをよく使用しており、JSON形式だとモジュールにそのまま渡すだけなので、とても楽なんです。

# 使うモジュール
- DBIx::Simple もしくは DBIx::Custom
- JSON::PP
  - メソッド〔encode_json〕がperlのハッシュの配列のリファレンスをJSONに変換してくれる

## DBIx::Simple, DBIx::Customモジュールについての補足
- DBIx::Simple
   - 生のSQLを書かなくて良くなり、便利機能がある
   - サンプルは英語だけれど、わかりやすい、調べれば日本語情報も充実している
- DBIx::Custom
   - 作者が日本語ドキュメント、サンプルを作成しており、敷居が低く利用しやすい
   - 高機能であり、メンテナンスが継続されている

　さらに、2つには受け取ったレコードをハッシュの配列にして一括で取得するメソッドがあるのです。
　DBIにもハッシュを取得するメソッドはありますが、1レコードずつなので、配列にpushするなどの工夫がいります。

# 使用するSQLiteのサンプルについて
- SQLiteのデータはutf8で格納
- テーブル名「SAMPLE」

| ID | ITEM |
| - | - |
| 1 | りんご |
| 2 | みかん |
| 3 | ぶどう |

# 実装
## 【DBIx::Simple】を用いた方法
```perl:dbtest1.pl
#!perl
use strict;
use warnings;
use DBIx::Simple;
use JSON::PP;
use utf8;

my $connectdb = "./sample.sqlite";

my $db = DBIx::Simple->connect(
    "dbi:SQLite:dbname=$connectdb",
    "",	# ID
    "",	# PASSWORD
    {sqlite_unicode => 1}	# ユニコード使うよ
);

my $result = $db->select(
    'SAMPLE', '*', {ID => "2"}
);


my $all = $result->hashes;  # レコードをすべて取得
my $json = encode_json($all);
print $json;
```

### 結果
```json
[{"id":"2","item":"みかん"}]
```

## 【DBIx::Custom】を用いた方法
```perl:dbtest2.pl
#!perl
use strict;
use warnings;
use DBIx::Custom;
use JSON::PP;
use utf8;

my $connectdb = "./sample.sqlite";

my $dbi = DBIx::Custom->connect(
    dsn =>  "dbi:SQLite:dbname=$connectdb",
    option => {sqlite_unicode => 1},
);

my $result = $dbi->select(
    table => 'SAMPLE',
    where => {ID => "2"}
);

my $all = $result->all; # すべて取得
my $json = encode_json($all);
print $json;
```

### 結果
```json
[{"id":"2","item":"みかん"}]
```
# おわりに
　perlで取得レコード群をJSONにして扱う方は少ないかもしれないけど、参考になれば幸いです。
【PixiJS】星型パーティクルをつくる

ゲームは見た目が命！！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">いつもより多く出しております⭐️ <a href="https://t.co/6Zp38PildQ">pic.twitter.com/6Zp38PildQ</a></p>&mdash; いんわん＠月収743円 (@inwan78) <a href="https://twitter.com/inwan78/status/1411306604046155782?ref_src=twsrc%5Etfw">July 3, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

かどうかはわかりませんが、パンチのある演出がある方が遊んでもらえる可能性は高くなると思います。

というわけでハデハデな星型パーティクルを作ってみましょう。

## 難しいところはググります

星型なんて算数ができない私にできるわけがないのでその辺はググって頭のいい人に頼ります。

今回はこちらのサイトの星型のプログラムをパクっ..参考にさせていただきました。

星型以外にもいろんな形のプログラムが公開されているので余裕のある方は違う形にも挑戦してみてください。

▷ [https://levelup.gitconnected.com/advanced-drawing-with-pixi-js-cd3fddc1d69e](https://levelup.gitconnected.com/advanced-drawing-with-pixi-js-cd3fddc1d69e)

そして出来上がったのがこちらでございます。

```javascript
function createStarTexture(points, outerRadius, innerRadius){
  if(points < 3){
    points = 3;//3未満だと勝手に3にする
  }
  let step = (Math.PI * 2) / points;//角度
  let halfStep = step / 2;
  const data = [];
  let dx, dy;
    
  for (let n = 1; n <= points; ++n) {
    dx = Math.cos(step * n - halfStep) * innerRadius;
    dy = Math.sin(step * n - halfStep) * innerRadius;
    data.push(dx, dy);
    dx = Math.cos(step * n) * outerRadius;
    dy = Math.sin(step * n) * outerRadius;
    data.push(dx, dy);
  }
  
  //グラフィックを作る
  const g = new PIXI.Graphics();
  g.beginFill(0xFFFFFF);
  g.drawPolygon(data);
  g.endFill();
  g.x = g.width * 0.5;
  g.y = g.height * 0.5;

  //グラフィックをテクスチャーに
  const texture = PIXI.RenderTexture.create({width: g.width, height: g.height});
  core.app.renderer.render(g, texture);
  
  return texture;
}
```

## 関数の使い方

この関数は星型のテクスチャーを作ってくれる関数です。できたテクスチャーはSpriteのテクスチャーに入れてすぐ使えます。

引数のpointsは頂点の数、outerRadiusは外側の半径、innerRadiusは内側の半径です。外側の半径と内側の半径に交互に頂点が作られて図形ができる感じです。ちなみにouterRadiusの方が値がinnerRadiusより小さくても問題は無いです。

## 色はtintで変更

上の関数では白色に作っています。

この関数で色を指定してもいいんですがゲームで使う場合は必要な時に毎回テクスチャーを作っていると処理の負担になるので先に必要な数だけ用意して使うときに色だけ好きに変えた方が負担が少なくなって良いです。

ということで色はtintプロパティで変えます。tintについてはこちらの記事に少し書いてます。
▷ [https://qiita.com/inwan78/items/16fe173b5a099e9d6835](https://qiita.com/inwan78/items/16fe173b5a099e9d6835)

## おまけ
★pixi.jsの基本的な使い方の記事
▷ [【PixiJS入門】基本的な使い方まとめ](https://javascript-game.com/basic-pixijs/)