OmniAICreator/Qiita-1.07M huggingface dataset:
「Cannot connect to the Docker daemon . Is the docker daemon running?」　解消

Dockerの立ち上げで何度もつまづくのは面倒なので、今回出たエラーの解消法を記載しました。


[1. 解決策](#1-解決策)
[2. まとめ　](#2-まとめ)
 [3. 参考文献　](#3-参考文献)

全てはこのIs the docker daemon running?というエラーから。

```
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
```
こちらの方の記事を参考にして書きコードを打ってもcommand not found祭り。
https://qiita.com/raySSK/items/655e63f12755012a28db

```
＄　systemctl start docker
bash: systemctl: command not found

$ service start docker
bash: service: command not found

$ systemctl start docker
bash: systemctl: command not found

$ systemctl enable docker
bash: systemctl: command not found
```

```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

何やってもCommand not foundと出る。

```
docker -v
Docker version 20.10.6, build 370c289
```
Dockerはインストールされてるみたい。一旦Ubuntuを再起動してみた。
https://eng-entrance.com/linux-ubuntu-reboot



```
$ sudo reboot
```

```
$ docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```
まだ解決しない。

#1-解決策
--
LaunchpadにあるDockerアプリを確認。No containers runnning（どのコンテナも起動されていません）とあるので、このコードをターミナルにコピペ。

![2021-06-12 7.57のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1466226/c95f1a85-8d6b-4f3f-763d-99108018fd46.jpeg)


```
 ＄docker run -d -p 80:80 docker/getting-started
Unable to find image 'docker/getting-started:latest' locally
latest: Pulling from docker/getting-started
540db60ca938: Already exists 
0ae30075c5da: Pull complete 
9da81141e74e: Pull complete 
b2e41dd2ded0: Pull complete 
7f40e809fb2d: Pull complete 
758848c48411: Pull complete 
23ded5c3e3fe: Pull complete 
38a847d4d941: Pull complete 
Digest: sha256:10555bb0c50e13fc4dd965ddb5f00e948ffa53c13ff15dcdc85b7ab65e1f240b
Status: Downloaded newer image for docker/getting-started:latest
5b05fdc4d6e0cf375cb88034b8c2eca23467d802bc83f84cc1ddcf055eed3c46
```
やっと解決できました！

```
＄　docker ps
CONTAINER ID   IMAGE                    COMMAND                  CREATED         STATUS         PORTS                               NAMES
5b05fdc4d6e0   docker/getting-started   "/docker-entrypoint.…"   7 seconds ago   Up 5 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   brave_colden
```

#2-まとめ

Is the docker daemon running?が出たら、Launchpad→Dockerapp→コードをコピペすればDockerが起動される。

はあ、俺の貴重な朝の1時間が、、
まあ、切り替えていきましょ！

#3-参考文献
https://www.konosumi.net/entry/2018/01/21/125523

https://qiita.com/kumagi/items/720d4f6daefc789ca346

https://eng-entrance.com/linux-ubuntu-reboot
【Rails】AWSのSESを使って本番環境でメールを送信する(aws-sdk-rails)

# 前提条件
macOS: Big Sur Ver11.2.3
Rails: 6.1.1
Ruby: 2.6.5
AWS: EC2(デプロイ),Route53(ドメイン取得),ACM(証明書取得)

# 前提条件に至るまで
固定IPアドレスに紐付いたドメインを取得し、取得したドメインにアクセスするとページが表示されるまで持っていくには、以下の記事のとおりでOK!
[【初心者向け】AWSのサービスを使ってWebサーバーをHTTPS化する](https://dev.classmethod.jp/articles/aws-web-server-https-for-beginner/#toc-2)

# やりたいこと
EC2上にデプロイしたRailsアプリケーションの本番環境で自由にメールを送信できるようにすること(Deviseのパスワード設定とか etc...)。
そのためにAWSのサービスのうち、SESを利用することにします。

# 手順（概要）
①AWS SESの設定
②AWSのCSに制限解除のメールを送る（sandboxによる送信制限の解除）
③IAMユーザーの設定
④Railsの設定

そして、上記の③までの設定については以下の方の記事が大変参考になりました。ありがとうございます！
[【AWS】Amazon SESを用いてRuby on Railsのdeviseでメールを送信する](https://qiita.com/KOHEI183/items/26e3298f62cab84f7269#%E7%9B%AE%E6%AC%A1)

※なお、自分はすでにIAMユーザーを作成していたため、既存のIAMユーザーに「AmazonSESFullAccess」というインラインポリシーを後から追加する、といった方法で実装しました。まだIAMユーザーを作成していない方は上記のQiita記事の通りで良いのかと思います。

④以降については、今回はAmazonが提供する正式なGemを使用したため、上記記事とは方法が少し異なります。
それでは、手順④以降について以下で具体的に見ていきます。

# 手順（詳細：Railsの設定）
### ①Gemのインストール
Gemfileに以下を記述

```ruby
# AWSのSESを使ってメールを送信するためにインストール
gem 'aws-sdk-rails', '~> 3.6', '>= 3.6.1'
```

そして、ターミナルで「bundle install」します。

### ②AWSの初期設定ファイルを作成
以下のディレクトリにファイルを新規に作成します。
「aws.rb」としておきます。

```ruby:config/initializers/aws.rb
creds = Aws::Credentials.new(
  ENV['AWS_ACCESS_KEY_ID'],
  ENV['AWS_SECRET_ACCESS_KEY']
)
Aws::Rails.add_action_mailer_delivery_method(:aws_sdk, credentials: creds, region: 'ap-northeast-1')

config.action_mailer.delivery_method = :aws_sdk
```

２〜３行目は環境変数になっているので、ターミナル上で設定されているか確認しておくこと。
（私の場合はS3に画像を保存していたため、すでに設定済みでした。）
**ちなみに、後でEC2上でも別途設定する必要があるので、忘れないよう注意！**

### ③環境設定用ファイルを編集
開発環境と本番環境の設定を変更します。

```ruby:config/environments/development.rb
（中略）
  config.action_mailer.default_url_options = { host: '取得したドメインのフルURL' }
  config.action_mailer.delivery_method = :aws_sdk
（中略）
```

```ruby:config/environments/production.rb
  config.action_mailer.default_url_options = { host: 'https://www.takeoutgohan.net/' }
  config.action_mailer.delivery_method = :aws_sdk
```

### ④Deviseの初期設定ファイルを編集(導入していなければとばしてOK)
```ruby:config/initializers/devise.rb
(中略)
 # Configure the e-mail address which will be shown in Devise::Mailer,
  # note that it will be overwritten if you use your own mailer class
  # with default "from" parameter.
  config.mailer_sender = 'noreply@あなたのドメイン(hoge.netなど)'
（中略）
```

### ⑤メールの送信元ドメインの変更
Deviseの設定に合わせ、送信元アドレスのドメインを書き換えます。

```ruby:app/mailer/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: 'noreply@あなたのドメイン(hoge.netなど)'
  layout 'mailer'
end
```

### ⑥AWSのSESコンソール上の設定を行う
⑤までを行ったところ、メールは送れているものの受信ボックスに届いていないという状態になりました。
調べたところ、メールの信頼性を確保するため追加の設定をすれば良さそう！
ということでSESコンソール上で以下の設定を行いました。
##### DKIMの設定
AWSにルートユーザーでログインし、SESのコンソールに移動。
左メニューの「Domains」から該当のドメインを選び、DKIMの設定を行う。

##### MAIL FROM Domainの設定
AWSにルートユーザーでログインし、SESのコンソールに移動。
左メニューの「Domains」から該当のドメインを選び、一番下の「MAIL FROM Domain」の設定を行う。
今回は、「mail」とだけ入力して作成しました。

# 最後に
以上で設定は完了になります。お疲れさまでした。開発環境でメールが実際に届くか確認しましょう（私は自分のGmailアドレスに送りました）。
また、本番環境にデプロイしたあとはEC2上でAWSの環境変数が設定されているか確認し、Webサーバー（Unicorn）を再起動してからサイトに再度アクセスすると良いと思います。
ArduinoUNOで温度,S-5851Aをシリアル出力 (Arduino)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

いろいろ改良後　


```c++


#include <Wire.h> //I2C library

#define S5851A 0x48

void setup()
{  

  //i2cの初期化
  Wire.begin(); //uno

  //シリアルの速度設定
  Serial.begin(9600);

} //end setup

void loop()
{

  //0番目のレジスター
  Wire.beginTransmission(S5851A);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);

  //温度の読み込み
  int tempval = 99; //温度
  Wire.requestFrom(S5851A, 1);
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    tempval = (int)Wire.read(); // 1バイトを受信
  }//while

  //表示
  Serial.println( tempval );

  delay(1000); //1秒待つ

}//loop



```



改良前

```c++


#include <Wire.h> //I2C library

#define S5851A 0x48

int     tempval;                //温度
char    data_read[3];           //バッファー

void setup()
{  

  //i2cの初期化
  Wire.begin(); //uno

  //シリアルの速度設定
  Serial.begin(9600);
  
} //end setup

void loop()
{

  //0番目のレジスター
  Wire.beginTransmission(S5851A);
  Wire.write(0);
  Wire.endTransmission();
  delay(1);

  //温度の読み込み
  tempval = 99;
  Wire.requestFrom(S5851A, 1);
  while(Wire.available())  {    // 要求より短いデータが来る可能性あり
    tempval = (int)Wire.read(); // 1バイトを受信
  }//while
  delay(1);

  //表示
  data_read[0] = '0' + (tempval / 10);
  data_read[1] = '0' + (tempval % 10);
  data_read[2] = 0;
  Serial.println( data_read );

  delay(1000); //1秒待つ

}//loop



```
Bubble.ioでHTMLタグを利用する

Bubble.ioでHTMLタグを利用したときの個人メモ

---

# API Connectorの準備
- チャートに表示するデータをAPIを利用して取得する  

## インストール
- API Connectorのインストールは[Bubble.ioでAPI Connectorを利用する](https://qiita.com/nkmk1215/items/7b2a5aba763a973fa4bb)と同様

## 設定
- 設定は[Bubble.ioでChart Elementを利用する](https://qiita.com/nkmk1215/items/d32b23b2358fe719ce71)と同様

# HTMLの準備
- [ApexCharts.js](https://apexcharts.com/docs/creating-first-javascript-chart/)を利用する
- 「Edit on CodePen」を押下
- 今回利用するHTMLとJSは以下
![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/6e0203bd-a704-e994-35f5-aabaf56ab607.jpeg)

# 画面実装
- 完成イメージ  
![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/f9fc11fd-0f83-64d7-94e7-640bd86e3f63.jpeg)

## Group
- APIを紐づけるGroupを作成   
  ![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/8815867d-6264-9c84-a7f2-31b5de63f007.jpeg)

## HTML
- Group上にHTMLを記述できるようにする
![011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/647c2f2b-5a5b-b5ba-c84d-38713195d596.jpeg)

- HTMLを転記
![012.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/275380d3-1b3d-ffc0-235d-e69e1105cc8b.jpeg)

- scriptタグ内にJSを転記
![013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/25f9f5e0-b5d4-aa1b-10cb-c44d611a8a68.jpeg)

- データを固定値から変数に置き換える
![014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/2ac67b7b-827e-ef93-f1a6-f98b12cc05cf.jpeg)

# 動作確認
- 画面描画時にAPIを実行し、チャートを表示する
![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/f9fc11fd-0f83-64d7-94e7-640bd86e3f63.jpeg)

# 補足
- ApexCharts.jsであれば、JSだけ置き換えれば他グラフも利用可能

## Mixed Charts 
- [Line Column](https://apexcharts.com/javascript-chart-demos/mixed-charts/line-column/)を利用する
- 固定値を変数に置き換える
    - X軸はdatetimeからtextに変更

![016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/2450cabb-41c9-3288-a7e1-a9d819d005eb.jpeg)


### 動作確認
- 画面描画時にAPIを実行し、チャートを表示する
![017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242897/0d1342c0-7a3a-2b00-762f-9e9cc86de788.jpeg)

# 感想
- 描画はできたが、X軸が日付にならなかった
- HTMLを利用することで表現の幅は広がるものの開発スピードは落ちそう
- サイズなど、Bubble or HTMLのどちらで定義するかがあいまいでわかりづらい（どちらでも定義できる）
【Unity】モバイルアプリのビルド番号を実行時に取得するライブラリを公開しました

# はじめに

モバイル向けアプリを作っている時、現在実機にインストールされているバージョンを起動画面や設定画面に表示することがあると思います。バージョンの場合は`Application.version`で取得できるので簡単に実装できるのですが、ビルド番号を実機で取得する方法は用意されていません。

そこで、実機でのビルド番号取得を簡単に実現するライブラリを作成したので紹介したいと思います。

https://github.com/nkjzm/UniBuildNumber

ちなみにEditorの場合は下記のように取得できるのですが、もちろん実機では動作しません。

```.cs
// バージョン
PlayerSettings.bundleVersion;
// ビルド番号
PlayerSettings.iOS.buildNumber;
PlayerSettings.Android.bundleVersionCode;
```

## 想定している用途

よくあるパターンとして、CIでビルドするたびに[セマンティクスバージョニング](https://semver.org/lang/ja/)のバッチバージョンへビルド番号に反映させることあります(e.g. `v1.0.[ビルド番号]`) 。この方法ですとバージョン表記だけでどこまでの変更が反映されているか判断できるのでビルド番号は必要ないのですが、アプリバージョンを頻繁に変えたくない場合もあると思います。

バージョン表記を綺麗に保ちたい場合などが多いと思うのですが、今回僕が必要だと思ったきっかけはTest Flightの関係です。Test Flightでは外部テスターにアプリを配布する際に簡易的な審査（1日程度）が挟まるのですが、同一バージョンは審査されない仕様を利用すると即時配布することが可能になります。この仕組みを使うためにバージョンを変えなくなかったのですが、実機にインストールされているバージョンが分からなくなってしまうためビルド番号を併記したいという状況になりました。

https://qiita.com/mironal/items/8580a7fe1be2048c51d7


## 免責事項

プラットフォーム毎に呼び方が違いますが、この記事では下記のような使い分けをしています。

- バージョン (Version)
    - iOS: `CFBundleShortVersionString`
    - Android: `versionName`
- ビルド番号 (Build Number)
    - iOS: `CFBundleVersion`
    - Android: `versionName`


# 導入方法と使い方

READMEに書いてある通りですが、簡単に日本語でも紹介します。

https://github.com/nkjzm/UniBuildNumber

## 導入方法

Unity 2019.3.4f1, Unity 2020.1a21以降で使えるPackage Managerの機能を使って配布しています。

1. Unityプロジェクトを開く
1. Window -> Package Managerを開く
1. 左上の"+"ボタンから"Add package from git URL..."をクリック
1. `https://github.com/nkjzm/UniBuildNumber.git?path=Assets/UniBuildNumber`を入力し、"Add"をクリック

## 使い方

下記の3つのstaticなメソッドを用意してあります。iOS/Androidで型が違うので注意してください。

```.cs
// Get build number in iOS
string buildNumber_ios = nkjzm.UniBuildNumber.GetIOSBuildNumber();

// Get build number in Android
int buildNumber_android = nkjzm.UniBuildNumber.GetAndroidVersionCode();

// Get build number in current platform (iOS or Android)
string buildNumber = nkjzm.UniBuildNumber.GetCurrentBuildNumber();
```

僕の場合は下記のように使用しています。

```.cs
private void Start()
{
    versionLabel.text = $"{Application.version} ({UniBuildNumber.GetCurrentBuildNumber()})";
}
```

# 参考

今回のライブラリは下記の記事を参考にライブラリを作成・公開させていただきました。ありがとうございます。

http://nobollel-tech.hatenablog.com/entry/unity-app-version

# 最後に

普段はTwitterでUnityやxR技術の情報発信をしているので、良かったらフォローしていただけると嬉しいです。

https://twitter.com/nkjzm/status/1403016738623524865
GPIOエクスパンダー

# GPIOエクスパンダーを使ってみる
GPIOポートが足りなくなったときに用いられるGPIOエクスパンダーの動作を確認する（Arduino環境で）。

## 利用したGPIOエクスパンダー
秋月電子で売られている[PCF8574](https://akizukidenshi.com/catalog/g/gI-13522/)を利用。このエクスパンダーはI2Cで制御するが、SPI制御のものもあるようだ。

## PCF8574
[ここ](https://www.ti.com/lit/ds/symlink/pcf8574.pdf?ts=1617950347593&ref_url=https%253A%252F%252Fwww.google.com%252F)にデータシートが見つかる。Arduinoで必要なライブラリは、[ここ](https://www.arduino.cc/reference/en/libraries/pcf8574/)からたどれる。

## 内容
### PCF8574ピンアサインメント
上記[データシート](https://www.ti.com/lit/ds/symlink/pcf8574.pdf?ts=1617950347593&ref_url=https%253A%252F%252Fwww.google.com%252F)引用。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/5a9e4114-9dd6-c84b-4f68-5c998147dfbc.png", width=30%>

### 実験内容
PCF8574のあるピンに接続されたボタンを押すと、PCF8574の別のピンに接続されたLEDが点灯するもの。配線状況は写真のとおり。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/6cabe14c-64c6-68fe-82df-7d8a2efafbe9.png", width=80%>

### I2Cアドレス
[I2C scanner](https://playground.arduino.cc/Main/I2cScanner/)を用いていて調べると、I2Cアドレスは「0x20」であった。[秋月電子のPC8574ページ](https://akizukidenshi.com/catalog/g/gI-13522/)には、「0x20 - 0x27」との記載あり。[PCF8574データシート](https://www.ti.com/lit/ds/symlink/pcf8574.pdf?ts=1617950347593&ref_url=https%253A%252F%252Fwww.google.com%252F)をよく見ると、
![データシート一部.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/8a150a54-3522-b910-4d9e-ec82f16e15d4.png)
とあった。どこかで見つけた回路を参照して、ピンA0-A2をたまたまGNDに接続していたので、「0x20」（I2Cアドレスは7ビット表記）で正しいことがわかる。
- Read : (0x20 << 1 | 0x1) = 0x41
- Write: (0x20 << 1 | 0x0) = 0x40

## ソースコード
[ライブラリ](https://www.arduino.cc/reference/en/libraries/pcf8574/)インストール時のサンプルプログラムを利用。

```c++:PCF8574_RW_Test.ino
#include "PCF8574.h"  // ①

// ②
#define BTN0  7
#define LED0  6
#define BTN1  2
#define LED1  3
#define CHATTERING    200 //times

uint8_t btn[] = {BTN0, BTN1};
uint32_t chat[2];
uint8_t led[] = {LED0, LED1};

PCF8574 PCF(0x20);  // ③

void setup()
{
  Serial.begin(115200);

  if (!PCF.begin() {  // ④
    Serial.println("could not initialize...");
  }
  if (!PCF.isConnected()) {  // ⑤
    Serial.println("=> not connected");
  } else {
    Serial.println("=> connected!!");
  }

  for (int i = 0; i < 2; i++) {  // ⑥
    chat[i] = 0;
    PCF.write(led[i], LOW);  // ⑦
  }
}

void loop()
{
  for (int i=0; i<2; i++) {
    while (!PCF.read(btn[i])) {  // ⑧
      chat[i]++;
    }
    if (chat[i] > CHATTERING) {  // ⑨
      Serial.print("BTN"); Serial.print(i); Serial.println(" Pushed");
      PCF.write(led[i], HIGH);  // ⑦
      delay(200);
      PCF.write(led[i], LOW);  // ⑦
    }
    chat[i] = 0;
  }
  delay(10);
}

```

- ①：PCF8574ライブラリインクルード
- ②：PCF8574ピン(P0-P7)につなげるボタンやLEDの定義
- ③：クラスおよびI2Cアドレス(0x20)の宣言
- ④：PCF8574初期化
- ⑤：PCF8574への接続
- ⑥：ボタンチャタリング除去用変数初期化
- ⑦：write()メソッドでピンへの書き込み
- ⑧：read()メソッドでピンからの読み込み
- ⑨：ボタンチャタリング無視

## 実験
成功。
【Rails】CSVの中身を整形してDBにデータを保存しよう

業務でCSVの整形処理を扱いました。
今後も割と扱うこと多いらしいので扱い方をざっくりまとめておきます。
実装手順に沿ってまとめたので以下に従って実装すればCSVを整形してDBにデータを保存できるようになるはずです。

## 前提
- ruby 2.3.1
- Rails4.2.3
- hamlからCSVを送信する

## ①CSVをビューから受け取る
Railsのビューファイルからフォームを送るとActionDispatch::UploadedFileオブジェクトとして送信されます。
CSVを整形するためにはこれをFileオブジェクトに変換する必要があります。

```ruby
file = params[:file].tempfile
```

ActionDispatch::UploadedFileオブジェクトには tempfile というキーでFileオブジェクトが格納されており
`params[:file].tempfile` とすることでFileオブジェクトに変換できます。

## ②CSV.forEachでCSVを1行ずつに分解

rubyのCSVクラスの持つ便利なメソッドに `CSV.foreEach` というのがあります。
これを使うとCSVのデータを1行ずつに分解できます。

```ruby
file = params[:file].tempfile

# ここから追記
CSV.forEach(file, header_row: true) do |row|
  row
end
```

こんな感じで `CSV.forEach` の中で各行に対して処理を行います。このとき、第一引数はFilleオブジェクトである必要があります。
①でFileオブジェクトに変換したのはこのためです。

ここでポイントになるのが `header_row: true` というオプションで、これを使うとheader(列名)の値とrow(列に対応する値)
の部分をキーバリューの組として取り出せます。例えば

| 日付       | 気温 |
| ---------- | ---- |
| 2021/06/11 | 30℃  |

こんな感じのCSVがあれば以下のようなオブジェクトがブロック変数rowに代入されます。

```
<CSV::ROW '日付':'2021/06/11', '気温':'30℃' >
```

このオブジェクトの便利なところとして、キーを指定して値を取り出せます。

```ruby
row = <CSV::ROW '日付':'2021/06/11', '気温':'30℃' >
row['日付'] 
=> '2021/06/11'
row['日付']  = '2021/06/10'
row['日付'] 
=> '2021/06/10'
```

次のステップでこれを利用します。

## ③各行のデータをハッシュに変換

各行のデータを取り出す各行のデータをハッシュに変換する。このとき上記で確認したCSV::ROWオブジェクトが活躍します。

キーを指定して値を取り出せるので全体的なイメージとして以下のようなメソッドを組みます。

```ruby
def convert_csv_to_hash(row)
  params = {
    date: row['日付']
    temperature: row['気音']
  }
  return params
end

# ここまで追記

file = params[:file].tempfile
CSV.forEach(file, header_row: true) do |row|
  params = convert_csv_to_hash(row)
end
```

こうすることでCSV.forEachの各行をrailsで扱えるハッシュに変換できます。

## ④変換したハッシュを元にDBにデータを保存

ハッシュに変換できたらDBにデータを保存します。

```ruby
def convert_csv_to_hash(row)
  params = {
    date: row['日付']
    temperature: row['気音']
  }
  return params
end

file = params[:file].tempfile
CSV.forEach(file, header_row: true) do |row|
  params = convert_csv_to_hash(row)

# 追加。Hogeは保存したいモデル名
 Hoge.create(params)
end
```

## ⑤この処理を何かしらのクラスで行う

ここまでで処理自体は記述できたのでこれをコントローラーなりに記述しましょう。
僕が今回実装したものだとCSVを扱う専用のService層を作ってそこに記述しました。

## ⑥プラスアルファ…例外処理について

CSVからデータを保存する際は複数データを纏めて保存する仕様のため、保存に失敗した際に具体的に
どのデータの保存に失敗したのかを検知する仕組みがあったほうがいいと思います。
例えば今回僕は以下のような例外処理を組みました。

```ruby
class ImportCSV
    def convert_csv_to_hash(row)
      params = {
        date: row['日付']
        temperature: row['気音']
      }
      return params
    end

    file = params[:file].tempfile
    CSV.forEach(file, header_row: true).with_index(1) do |row, line_num|
    params = convert_csv_to_hash(row)

    # ここから追記
      begin
        Hoge.create(params)
      rescue e
        return "#{line_num}行目が不正です。エラー内容：#{e.message}"
      end
    end
end
```

あとはエラーメッセージをコントローラーで受け取ってビューに表示する、Slackやメールで通知するなどすればOK。

## 感想
CSVの組み込みメソッドだけでほとんど処理できたので思ったよりかんたんでした。
まだまだ使えるメソッドはたくさんあると思うので今後もっと深堀りしていきたいです。
ffmpegをインストールする（Windows10）

# はじめに
Windows10でffmpegコマンドを使うまでのメモです

# 開発環境
- Windows10 PC
- ffmpeg 2021-06-09


# 導入

1．[ここ](https://github.com/GyanD/codexffmpeg/releases)からffmpeg-2021-06-09-git-e01bf559df-full_build.zipをダウンロードします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/571d46e3-a2bf-63fb-2b27-3eeb4b73c615.png)

2．解凍してCドライブ直下に置きました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/4905d6de-a57f-003f-c547-048e26b78f11.png)

3．システム環境変数にC:\ffmpeg-2021-06-09-git-e01bf559df-full_build\bin を追加します

4．コマンドラインからffmpegコマンドが使えるようになっていたらOK

~~~console
ffmpeg
~~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/9e3d4e67-db4e-2ecc-8681-77126892afa9.png)


# コマンドの例 
### mp4からwavへ変換

~~~
ffmpeg -i filename.mp4 filename.wav 
~~~
PHP入門メモ

PHPで色々と触ったので使ったもののメモを

#基本
```php:php
<?php
//<?php> <?>で囲む
//行末に;
------------------------------------------
//変数は頭に$をつけて宣言する
$num = 15;
$str = "apple";
------------------------------------------
//echoとつけるとhtmlとして出力される
echo "<b>Hello, World!</b>";
------------------------------------------
//POSTされたものを受け取る
$number = @$_POST["number"]; //numberでPOSTされてる時
------------------------------------------
//変数の中身の長さが0or有るかを見る
//上記の応用でフォームを受け取れるかに使う
if (!strlen($number)) {

}
------------------------------------------
//配列の宣言
//辞書みたいにも出来る
$list = [];
$dict = ["country" => "japan", "city" => "tokyo"]; //$dict["country"]で"japan"と出力される
------------------------------------------
//乱数作成
$rand_num = mt_rand(1,99); //1~99までの乱数が作成される
------------------------------------------
//for文
//javascriptと同じ
$n = 10
for($i = 0; $i < n; $i++){

}
------------------------------------------
//配列をシリアライズ、アンシリアライズ
//どこかにpostする時は一旦シリアライズしてから送り先で戻す
$seri_li = serialize($list);
$un_seri_li = unserialize($seri_li);
------------------------------------------
//配列の長さを取得
$count = count($list);
------------------------------------------
//配列にappend
array_push($追加する配列名,何かしらの値);
------------------------------------------
//csvを取得し配列に格納
$csv_file = file_get_contents('txt/test.csv');
//変数を改行毎に配列に変換
$aryHoge = explode("\n", $csv_file);
$aryCsv = [];
foreach($aryHoge as $key => $value){
 if(!$value) continue; //空白を除外する
 $aryCsv[] = explode(",", $value);
    }
------------------------------------------
//pythonみたいなfor文
$li = [1,2,3]
foreach ($li as $i){
   echo($i)
}
//1
//2
//3
------------------------------------------
```

#受け取った配列をcsv出力
重要なのは`htmlタグ`前に書く

```php:php
<?php
//csvと言う名のPOSTを受け取っていた時
function export($file_name, $data)
{
    $fp = fopen('php://output', 'w');

    foreach ($data as $row) {
        fputcsv($fp, $row, ',', '"');
    }
    fclose($fp);
    header('Content-Type: application/octet-stream');
    header("Content-Disposition: attachment; filename={$file_name}");
    header('Content-Transfer-Encoding: binary');
    exit;
}
?>
<?php
if (isset($_POST['csv'])) {
    $get_csv = $_POST['csv'];
    $csv_list = unserialize($get_csv);
    //var_dump($csv_list);
    export('test.csv',$csv_list);
}
header("location:javascript://history.go(-1)");
?>

<html>
<!--以下html-->
```

#前のページにリダイレクト
```php:php
header("location:javascript://history.go(-1)");
```

#`<?=  ?>`は`<?php echo(???) ?>`を代替する
そのままの意味

```php:
<?=
   "hello world"
?>

//hello world
```
ある程度スクロールするとじわっと表示させる

#やる事
スクロールをしていって、要素がスクリーンのある程度に来るとじわっと表示させる。

#方法
```html:html
<section class="fadein">
 <!--何かしらの要素を入れる-->
</section>
```

```javascript:javascript
$(function(){
  $(window).scroll(function (){
    $(".fadein").each(function(){
      let imgPos = $(this).offset().top;
      let scroll = $(window).scrollTop();
      let windowHeight = $(window).height();
      if (scroll > imgPos - windowHeight + 250){ //ここの数値を変えて表示させる箇所を変更する
        $(this).addClass("fadein_scroll");
      } else {
        $(this).removeClass("fadein_scroll");
      }
    });
  });
});
```

```css:css
.fadein {
	opacity: 0;
    -webkit-transition: all 1s;
    -moz-transition: all 1s;
    -o-transition: all 1s;
    -ms-transition: all 1s;
    transition: all 1s;
	}

.fadein_scroll {
	opacity : 1;
	}
```
【初心者】パソコンを立ち上げたとき自動でお気に入りのアプリを開く方法

# 前提条件
* Windows10

# やりたいこと
「パソコンを立ち上げたら、自動でこれが開いてたらいいのになぁ」
そんな願いを叶えるために、**パソコンを立ち上げた時、自動でお気に入りのアプリを開く方法**を紹介します。

今回は「メモ帳」を例に設定していきます！


# やり方

#### 1. スタートアップを開く
`Windows` + `R`を押して、「ファイル名を指定して実行」を開きましょう。
　↓ こんな感じ
![スクリーンショット (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/2127ee70-a156-91b0-3912-fb1dad9d086c.png)
（この画面の名前がなんなのか調べてみたのですが、「ファイル名を指定して実行」というらしいです…）

**「shell:startup」**と打って、**OKボタン**を押します。
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/e8734b7f-0ccb-3bde-6a06-dd5c1f51852c.png)

すると、「スタートアップ」ウィンドウが開きます。

![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/b5d9b240-9c6a-628d-321a-9608e9f935e8.png)

ここには、**パソコンを立ち上げた時に自動的に開いていてほしいアプリのショートカット**を入れます。
今回はメモ帳を使いたいので、ここにメモ帳のショートカットを入れていきます。

#### 2. お気に入りのアプリのショートカットを探す
スタートアップは一旦置いておいて、メモ帳のショートカットを探しにいきます。

左下の`スタート`ボタン(白い四角が4つ固まってるやつ)を押して、そのまま「メモ帳」と打ちましょう。
![スクリーンショット (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/6339bac3-d79e-b1e7-7c13-b428bd651a01.png)

でかでかとメモ帳の大きなアイコンが出ましたね。
![スクリーンショット (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/a3051631-3fe4-9e97-108d-bb87b246fd02.png)

#### 3. ショートカットがある場所を開く
大きなアイコンの下の **V を押して「ファイルの場所を開く」を押します**。
![スクリーンショット (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/3442bf1d-2d91-20df-267f-fb971e5dace9.png)

　↓ こんな画面がでるので、**「メモ帳」を押して`Ctrl`+`C`でコピーしましょう**
　　(この「メモ帳」はショートカットなので、これをコピーしてスタートアップにはっつけていきます)
![スクリーンショット (19).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/ede86f42-7674-2dbe-8f9b-febb3a79fda0.png)


#### 5. コピーしたショートカットをスタートアップに貼り付ける

ほったらかしにしておいたスタートアップを開きます。
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/502c14a6-2120-551f-1f8e-78d83c471dab.png)

消えてしまった！という人は、
タスクバー(画面の一番下にあってアプリのアイコンが並んでいるところ)の
エクスプローラーのアイコン(黄色っぽい四角)を押してみましょう。
![スクリーンショット (21).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/e3f5ab2a-1ea2-15c0-421f-495f5387ace8.png)

スタートアップが開けたら、さきほどコピーしたショートカットを`Ctrl`+`V`で貼り付けます。
　↓ 貼り付けた後はこんな感じ
![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/03a7bd73-26a1-973e-9c80-6d715236b5f9.png)


#### 6. パソコンを閉じて、立ち上げて確認してみよう
さて、1～5の設定だけでパソコンを立ち上げるだけで自動的にメモ帳が開くようになっているのでしょうか？

すぐに確認したい人は、一回パソコンをシャットダウンしましょう。
そして立ち上げてみてください。

白紙のメモ帳が開かれていれば成功です！

私もやってみますね。

(・・・パソコンを一旦閉じて、立ち上げています・・・)

お、パソコンを立ち上げただけで、自動的にメモ帳が出てきました！
![スクリーンショット (24).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1636925/2953f60e-b0ca-4db5-fb66-09024aad0de0.png)

メモ帳が出てくることを確認できたら、今回のやりたいことは達成です:v:
お疲れ様でした！

# さいごに
今回は「メモ帳」を例に**パソコンを立ち上げたときに自動的でお気に入りのアプリを開く方法**を紹介しましたが、
スタートアップにショートカットを作成すれば、今回のメモ帳のようにパソコンを立ち上げ時に自動的に開くことができます。

例えば、Google Chrome。
ショートカットを設定すれば、パソコンを立ち上げてからすぐ調べものができそうですね。

自分のお気に入りのアプリをスタートアップに設定して、立ち上げた時からわくわくしましょう！
サーバーエンジニアにオススメしたいWindows用ツール

# はじめに
PhpStormのプラグイン紹介の記事が反響あったので、本日はサーバーエンジニアにオススメしたいWindows用ツール集と題して、私が普段よく使っているツールの中でも特に人にオススメしたいツールを10つ厳選して紹介記事にしたいと思います。
一部Macでも使えるツールも存在していますので、この記事が新しいツールの発見につながれば幸いです。

# 対象者
- Windows 10

# オススメツール集（2021年度版）
## Notion

まだ日本語対応はしていませんが、個人的に今年一番の推しツールです（今年日本語対応予定）。
一言でいうと、軽量のオールインワンツールです。BoostnoteやEvernoteの上位互換といったところでしょうか。
このツール一つでドキュメント整理、ガントチャート、カンバン（ダッシュボード）、データベース、などすべてが揃っていて、かつ無料で使えます。
ページ整理もしやすく他人とのページ共有も簡単にできます。
Markdown形式の記述にも対応しているため、エンジニアの情報整理にはもってこいのツールです。

https://www.notion.so/

https://hikopro.com/notion-manual/

## Windowsターミナル

Macにかなり遅れをとった印象ではありますが、Windowsにもついに（？）標準のターミナルが正式リリースされました。
カスタマイズ性も高く、複数タブにも対応しているため、今後Windowsの標準的なターミナルとして普及していくのではないかと注目しています。
私の場合は、文字をドラッグしただけでクリップボードにコピーしたいため、下記のような設定にしています。

```
// If enabled, selections are automatically copied to your clipboard.
"copyOnSelect": true,
```

https://qiita.com/whim0321/items/6a6b11dea54642bd6724

https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701

https://www.atmarkit.co.jp/ait/articles/2005/28/news018.html


## RLogin

Windowsターミナルソフトです。AWSへのSSH接続の際などはこちらを使用しています。
画面分割、接続先の保存、sfptなど、とにかく機能が豊富で軽く、TeraTermなどの上位互換のようなツールです。
いまも積極的にバージョンアップが重ねられているのも特徴です。

https://qiita.com/murachi1208/items/d6e4ce7ba75f1625fe51

https://kmiya-culti.github.io/RLogin/

## EmEditor

かれこれ10年以上愛用しているもっとも愛用歴の長いツールです。
メモツールであるため、軽量であることはもちろんのことですが、そのうえ多数の機能を携えています。
多数ある機能の中で、指定フォルダ内にあるファイルの中から指定キーワードが書かれているファイルだけを抽出する機能が特にお気に入りです。
そのほか、メモリが許す限り、16TBまたは1.09兆行までのファイルを開けるため大量データを扱えるのも特徴です。

https://jp.emeditor.com/

## clibor

クリップボードの管理ツールです。あらかじめ設定しておいたショートカットキーを押すことで、クリップボードにコピーされたテキストの履歴一覧が表示され、履歴の内容を貼り付けることが可能です。
定型文をいくつか登録しておくことも可能なため、私の場合はよく使うスニペットを登録しておくようにしています。

https://forest.watch.impress.co.jp/library/software/clibor/

## Postman

このツール1つで記事が書けるくらいプライベートでも仕事でも大活用しているツールです。
API開発、テストに必要な機能が一通り揃っているうえに無料で利用可能です。

https://www.postman.com/

https://qiita.com/zaburo/items/16ac4189d0d1c35e26d1

## HeidiSQL

無料のDBクライアントです。MacでいうところのSequel ProのWindows版のようなツールです。
PhpStormに付いているDBクライアントの性能が良くなるにつれて最近は出番が少なくなりつつありますが、ずっと使っているツールです。

https://www.heidisql.com/

https://qiita.com/aky100200/items/e4b412fe24be4b478200

## JetBrainsのIDE

JetBrainsのIDEかVisualStudioProfessionalがないとコードは書けない身体です。
高機能なプラグインが豊富ですし、コード補完機能がとても優れています。
学生さんであれば無料で使うことも可能です。

https://www.jetbrains.com/ja-jp/

https://www.jetbrains.com/community/education/#students

https://qiita.com/nagareboshi/items/69dc6d5b6a0b7cc4cf27


## 1password

AWS、Google、Twitter、Discode、github、Qiitaなどなど…。
今や様々なサービスが乱立しているので、それらのパスワードを管理するためのツールとして是非ともオススメしたいツールです。

https://1password.com/jp/

## Screenpresso

PCのデスクトップのキャプチャをするためのツールです（※MacでいうところのSkitchのようなツール）。
キャプチャだけであれば、[Window ロゴ] キー + [Shift]キー + [S]キーで可能ですが、Screenpressoの特徴として、キャプチャを取ったその場で簡単に文字入れすることなどが可能です。
キャプチャした画像にコメントや赤丸などを入れたりするのにはうってつけのツールです。

https://www.screenpresso.com/ja/

# おまけ
https://jp.navicat.com/products/navicat-for-mysql

私の知る限り一番高額なDBクライアントツールです。その分性能がとても高かったのですが、操作が重く感じて徐々に使わなくなりました。
SQLを知らない状態であってもGUIで画面操作していくだけで自動的にクエリーを生成してくれる機能は複雑なSQLを考えないといけない時には便利でした。
Power BI Desktopの「スマート説明」を試す。スマート文章追加も可能

##新型コロナウイルス推移で試す

https://docs.microsoft.com/ja-jp/power-bi/visuals/power-bi-visualization-smart-narrative

[NHKが公開しているオープンデータ](https://www3.nhk.or.jp/news/special/coronavirus/data-widget/)を利用しました。
Power BI Desktopに取り込み、「（感染者数）曜日別円グラフ」「（同）地方別折れ線グラフ」「（同）都道府県別棒グラフ」「（死亡者数）折れ線グラフ」を作成しました。
集計期間は「最近1カ月」（5/12～6/11）です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/8d220f91-ca78-7c3f-6bf8-3e58bcae6da5.png)

右パネルから「スマート説明」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/4e9258d2-f2d6-f357-cbcb-ba556b793dc3.png)

自動でグラフの概要説明の文章が生成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/ac536f15-2501-2e0d-19da-1298c9977d91.png)

##スマート文章を見てみる

生成された文章を取り出しました。
不自然なところはありますが、特徴となる傾向や数字を取り出すようなロジックのようです。
（なお、「水曜日, 5月 12, 2021」は2001年5月12日という意味です）

>近畿地方 の 各地の感染者数_1日ごとの発表数 は、水曜日, 5月 12, 2021 から 日曜日, 5月 23, 2021 の間で 1,574 から 517 へ最も急激に下降しました。

>各地の感染者数_1日ごとの発表数 には 3 つの異常があり、木曜日, 6月 10, 2021 (55) にて 中国地方 の低い値、木曜日, 6月 10, 2021 (182) にて 北海道地方 の低い値、水曜日, 5月 12, 2021 (1,096) にて 中部地方 の高い値です。

>水曜日 は 各地の感染者数_1日ごとの発表数 の 19.34% を占めていました。

>各地の死者数_1日ごとの発表数 は、日曜日, 5月 16, 2021 から 月曜日, 5月 17, 2021 の間の最も急な傾斜において 47 から 122 に跳ね上がりました。

>17,071 では、東京都 は最高の 各地の感染者数_1日ごとの発表数 であり、鳥取県 より 27,885.25% 高く、61 で最低の 各地の感染者数_1日ごとの発表数 でした。

>すべての 47 都道府県 について、各地の感染者数_1日ごとの発表数 の範囲は 61 から 17,071 です。

青色のアンダーラインが動的に生成された値（文章）のようで、例えば「近畿地方」クリックすると

>地方 with steepest negative trend of 各地の感染者数_1日ごとの発表数
>>（steepest negative trend of：ネガティブな傾向が最も激しい）

とその値の意味が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/2d679b4d-994e-9483-c09b-bcffc628bb2f.png)

##スマート文章を追加

文章を追加することができます。
追加したい箇所（ここでは文章末尾の空欄）をクリックします。
「+値」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/dfe06f6a-70a6-52d0-c838-dca1f80f71b6.png)

設定欄（「この値の計算方法」）が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/e6a1bf96-b456-a442-e199-1a5651f05451.png)

計算方法を文章で書きます。
（うまくいくまで何度もトライ&エラーを繰り返しました）

>地方 with the highest value of nhk news covid 19 prefectures daily data 各地の感染者数_1日ごとの発表数

と入力するとその下の「結果」に

>関東地方

と表示されます。
保存します。
スマート文章欄に「関東地方」と追加されます。
その後に「がもっともか感染者数合計が多く、その数は」という文章を打ち、同様に以下の値を追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/c38c5ba6-0bc9-d28d-fe17-407ba6bb9fb4.png)

そうすると、

>﻿関東地方﻿ がもっともか感染者数合計が多く、その数は、﻿35,713﻿　です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/a43e6ef6-d8ae-58a0-d6ee-10e7caeea428.png)

という文章が追加されます。
数字が正しいかを確認するために、地方別の感染者数合計の表を追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1143963/59b63066-4f55-b5b6-816a-98ce61678837.png)

**了**
遅いPythonを手を加えることなく一瞬で早くする方法あります

# 遅いPythonを手を加えることなく一瞬で早くする方法あります
先に言うと、すみません、完全にタイトル詐欺です。でも手間を全くかけずに早くなるのはホントです。VScodeユーザ限定で、シーンも限定されますけどね:smirk:。

## やり方
VScodeではなく、シェルで実行する。
はい、たったこれだけです。
これで10倍くらいは早くなります。というかPython本来の性能になる、と言うのが正しいですね。
VScode使ってない方、タネに気づいている方、いやそもそもシェルで動かしてるしという方、ほんとごめんなさい。でも意外にこの思わぬ落とし穴に嵌った方もいるんじゃないでしょうか。私もその一人です。ではタネ明かししますね。

## タネ明かし。犯人はあいつ
VScodeでPythonプログラムを動作させるとデバッグ機能が有効になるんですが、これがとてつもなく性能を阻害するんです。
VScodeで実行すると、ターミナルログをよく見ると作成したプログラムの他にdebugpy.pyというものが呼び出されているのが分かります。これがデバッグI/Fを実現しているんだと思うんですが、おそらくデバッグ対象のプログラムを読み込んで、一行ずつ解釈実行し、ブレイクの判定などしているのではないでしょうか。なのでVScodeで実行するととてつもなくPythonの性能が遅くなるというわけです。
そもそもデバッグ＝性能問題を意識しろという指摘もあるかもしれませんが、TypeScriptの場合VScode上でもPythonより遥かに早いので、デバッガの影響になかなか思い至りませんでした。Python歴2ヶ月ほどですが、どうもPythonは大量のテキスト情報の処理に使っていてそもそも遅いという感じがしていました。

## Pythonは遅い？
AIやデータマイニングの世界でPythonはよく使用されていると聞くので、勝手なイメージでよもや性能とか問題になるとは思ってもみなかったんですが、ググってみるとどうやらPythonってスクリプト言語の中ではとても遅いと評判のようです。実際とある記述を処理するパーサーをPythonとTypescriptコードで出力して動作比較したところ、処理にかかる時間がTypescriptに対し２〜６倍程度遅くなる傾向がありました。
そもそも素の状態でこれだけの性能差があるのでVScodeのデバッガ上で動かした時の遅さときたらとんでもなかったわけです。

## 本当にPythonを早くする方法
ほぼ手間をかけずに性能改善をするにはPyPyが良いようです。公式サイトによると４倍早いとありますが、実際先程のパーサーをPyPyで動作させたところ２〜６倍程度改善が見られました。
ただしPyPyを使用するにあたりいくつか注意点があります。
PyPy最新版v7.3.5はPython3.7準拠であるため、元々の作成したプログラムがPython3.7以降の機能を使用している場合は修正が必要になります。
また詳細は読んでいませんが、CPython（Pythonのリファレンス実装でいわゆるいつものPython）と動作差分があるようなのでPyPy.orgのPython Compatibilityを確認しておいた方が良いでしょう。
私が使った範囲で気づいたのはC言語で記述されたモジュールは使用できないようです。例えばujsonがそうですね。使用するとWindowsErrorの例外が発生しました。どうやらABIの互換性の問題のようですが、先ほどのPython CompatibilityのページによるとPyPy向けにリコンパイルすれば使えるようです。しかし、外部パッケージや外部パッケージの依存パッケージにC言語で実装されたモジュールが存在する場合は問題となります。この辺りパッケージマネージャなどで外部パッケージの依存パッケージを細かくインストール制御できないでしょうか？

## VScodeのPyPyサポート
VSCodeの最新版はPyPyをサポートしているようです。
PythonではなくPyPyをインタプリタとして使用する場合、VScodeの左下に表示されているPythonのインタプリタバージョンをクリックするとインタプリタを設定できるようになり、PyPy3.exeのパスを指定してあげます。これによりPyPy3でデバッグできるようになりますが、使用したところいくつか問題がありました。
一つはデバッガを起動するとデバッグプロセスが死にましたとエラー表示されました。無視してキャンセルして続行すると、特に問題なくデバッグできているようです。謎です。
最後に、ソースコードのパスに日本語が含まれているとデバッガの起動に失敗します。こちらはどうやってもデバッグできません。安全な場所にプロジェクトフォルダを移動させましょう。
【Php】PDOでdatabaseに接続する(4)

# 初めに
PDOについて学習した内容のoutput用記事です。

※内容に間違いなどがある場合はご指摘をよろしくお願いします。
※こちらの記事はあくまでも個人で学習した内容のoutputとしての記事になります。

前回の記事：
https://qiita.com/redrabbit1104/items/2668e56d4c058221388e
https://qiita.com/redrabbit1104/items/8c5bb2b364347915a0f1
https://qiita.com/redrabbit1104/items/9b5a01b81a21f266a9bb

# beginTransaction()
PDOクラスにあるメソッドでsql文によるデータの取得、更新、削除などの処理を開始するメソッド。また、オートコミットモードをoffにしてくれます。戻り値はtrueかfalse。

```php
$pdo->beginTransaction();    //トランザクションの開始
```

# commit()
PDOクラスにあるメソッドでbeginTransaction()メソッドによって開始された処理を確定します。また、オートコミットモードをonにしてくれます。戻り値はtrueかfalse。

```php
$pdo->commit();   //処理の確定
```

# rollback()
PDOクラスにあるメソッドでsql文が何らかの問題によって実行されずに失敗した時に、sql文の処理を取り消し元通りに戻すメソッド。戻し値はtrueかfalse。

```php
$pdo->rollback();    //処理のキャンセル
```

# 使ってみる
前回のsql文にtransactionの記述を追加します。処理が成功した場合と失敗した場合に分けるため、try catch文を使います。

```php
$pdo->beginTransaction();  //トランザクションを開始

try {
    //sql処理
    $sql = 'select * from accounts where user_id = ?'; //疑問符place holder
    $stmt = $pdo->prepare($sql);     //sql文を実行する準備を行う。戻り値はPDOStatement
    $stmt->bindValue(3, 1, PDO::PARAM_INT);   //値の紐付け
    $stmt->execute(); //実行

    $pdo->commit();  //処理の確定

    $result = $stmt->fetchall();
    var_dump($result);

} catch (PDOException $e) {
    $pdo->rollback();    //処理のキャンセル
    echo $e;
}
```

# 処理が成功した場合（commit)
sql文によるデータの処理がうまくいった場合には次のようにブラウザーに表示されます。
![スクリーンショット 2021-06-11 7.38.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/57158b28-ad83-af95-fc0c-96d89c7c56d9.png)

# 処理が失敗した場合(rollback)
sql文の実行に失敗した場合、rollbackによって元通りにします。今回はわざとデータベースに無いデータを取得するsql文で試してみました。

![スクリーンショット 2021-06-11 7.37.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966135/179edd12-76da-eb9c-d6dd-29192443d954.png)

# 参考サイト
https://www.php.net/manual/ja/pdo.begintransaction.php
https://www.php.net/manual/ja/pdo.commit.php
https://www.php.net/manual/ja/pdo.rollback.php
https://blog.tokumaru.org/2015/05/blog-post.html
yukicoder contest 299 (BANNED CONTEST) 参戦記

# yukicoder contest 299 (BANNED CONTEST) 参戦記

## [A 1543 [Cherry 2nd Tune A] これがプログラミングなのね](https://yukicoder.me/problems/no/1543)

cに従って比較をするだけ.

```python
S, T, c = input().split()

S = int(S)
T = int(T)

if c == '<':
    result = S < T
elif c == '>':
    result = S > T
elif c == '=':
    result = S == T

if result:
    print('YES')
else:
    print('NO')
```

## [B 1544 [Cherry 2nd Tune C] Synchroscope](https://yukicoder.me/problems/no/1544)

*O*(*NM*) が実行可能な範囲なので、愚直に比較すればいいだけ.

```python
N, M = map(int, input().split())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

for i in range(N * M):
    if A[i % N] != B[i % M]:
        continue
    print(i + 1)
    break
else:
    print(-1)
```
[Javaメモ]Listの中に複数の数字を一気に格納する方法

Listの中に数字を格納する。
格納する数字は1～10までとする。

※下記は、エラー出ないけど、初心者が書いたってバレるコードｗ
　ちゃんとしたのは「<font color="Red">Test2.java</font>」ね。（もしかしたらダメなのかもｗ）

```Test.java
import java.util.ArrayList;
import java.util.List;

public class Test{
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		{
			{
				for(int i=1; i<=10; i++) {
					list.add(i);
				}
			}
		};
		System.out.println(list);
	}
}

```


```実行結果.
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

```

#中括弧はいらない！？
上記コード(Test.java)のListの下に記載している中括弧は不要みたいです。

```Test2.java
import java.util.ArrayList;
import java.util.List;

public class Test2{
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<>();
		for(int i=1; i<=10; i++) {
			list.add(i);
		}
		System.out.println(list);
	}
}

```


```実行結果.
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

```

#なんで中括弧つけてた??
参考書で見たまま覚えてたみたいです（脳死）

・・・調べてみると、この中括弧は、
匿名クラスと初期化ブロックって言うらしい。
あとさっき気づいたけど、Listの最後に「;」あるから普通に中括弧いらなかったｗ
(@shiracamus さん、ご指摘ありがとうございます。。。)

```Sample.
{　//匿名(無名)クラス
	{　//初期化ブロック

　　　　　　//何らかの処理
	　　
	}　//初期化ブロック
};　//匿名(無名)クラス
```
CakePHP4 MAMP下で Migration コマンドが動いてくれない

# 環境
<!-- 環境を記載 -->
* CakePHP4.2.6
* (Cakephp3でも確認済み)  
* PHP7.4.16 
* MAMP

# はじめに
<!-- 発端や概要を記載 -->
MAMP で CakePHP を動かしていたら migration コマンドでエラーを吐いて詰まった。
調べてもなかなか該当するものがなかったので投稿。

# 目次
<!-- タイトルとアンカー名を編集 -->
[1.mamp下でbakeコマンドが使えない？](#1-mamp下でbakeコマンドが使えない)
[2.悪いのはmampのソケットの場所だった](#2-悪いのはmampのソケットの場所だった)
[3.参考文献](#3-参考文献)

<!-- 各チャプター -->
#1. mamp下でbakeコマンドが使えない
いつも通り`bin/cake migrations migrate`とコマンドを叩いたところ以下のようなエラーを吐いて動かない。

```
Exception: There was a problem connecting to the database: SQLSTATE[HY000] [2002] No such file or directory
In [/Applications/MAMP/htdocs/hogehoge/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php, line 96]

2021-06-11 23:56:11 Error: [InvalidArgumentException] There was a problem connecting to the database: SQLSTATE[HY000] [2002] No such file or directory in /Applications/MAMP/htdocs/hogehoge/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 96
Stack Trace:
- /Applications/MAMP/htdocs/hogehoge/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/MysqlAdapter.php:140

/*省略*/

Caused by: [PDOException] SQLSTATE[HY000] [2002] No such file or directory in /Applications/MAMP/htdocs/hogehoge/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 84
Stack Trace:
- /Applications/MAMP/htdocs/hogehoge/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php:84

/*省略*/
```
エラー文を調べたところconfig/app.php の設定値 'host' => 'localhost' を 'host' => '127.0.0.1' にしろと書いてあるので試してみるが治らず・・・。

色々調べてるうちに以下の結論に辿り着いた。

#2. 悪いのはMAMPのソケットの場所だった
シンボリックリンクを貼ってみて再び試してみるといけた！

```
$ ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
```

#3. 参考文献
- [CakePHPでマイグレーションを実行したら、DBに繋がらない](https://teratail.com/questions/167666)
- [Macでcakephp3 の環境構築 bakeコマンドでエラー(php.iniと、MAMPのMySQLのソケットの場所が原因でした。)](https://info.yama-lab.com/mac%E3%81%A7cakephp3-%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89-bake%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BCphp-ini%E3%81%A8%E3%80%81mamp%E3%81%AEmysql%E3%81%AE/)
AWS クライアントVPN 2要素認証 秘密鍵にパスワードを付加する

# 初めに

現在 AWS クライアント VPN には 3 つの認証方法があります。

- クライアント証明書による相互認証
- Active Directory によるユーザー認証
- SAML によるユーザーフェデレーション認証

今回、相互認証のみで2要素認証ができないか調べてみました。 その結果、OpenVPN によるクライアント秘密鍵のパスワードによる認証を追加可能であることがわかりました。記事の内容に間違い等ございましたらご指摘頂けると幸いです。

パスワード入力画面

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/b308309f-f3a0-6825-c09e-199c04ec924e.png)

# 証明書・秘密鍵を作成する

こちらを参考に進めます。

https://docs.aws.amazon.com/ja_jp/vpn/latest/clientvpn-admin/client-authentication.html#mutual

パスワードを付加するにあたって、手順と異なるのは以下の部分です。

> 5．クライアント証明書とキーを生成します。
クライアント証明書とクライアントプライベートキーは、クライアントを設定するときに必要になるため、必ず保存してください。

クライアント証明書と秘密鍵を作成するとき、以下のようにドキュメントにある `nopass` を消してコマンドを実行します。

```
./easyrsa build-client-full client
```

以下のようにパスワードを設定できます。Enter PEM pass phrase の部分です。

```
$ ./easyrsa build-client-full client
Using SSL: openssl OpenSSL 1.0.2k-fips  26 Jan 2017
Generating a 2048 bit RSA private key
....+++
..........+++
writing new private key to '/home/ec2-user/easy-rsa/easyrsa3/pki/easy-rsa-3613.TxeBqP/tmp.LVMVQ9'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
```

後は手順通りです。

# 参考記事

https://www.openvpn.jp/document/authentication-methods/

https://www7390uo.sakura.ne.jp/wordpress/archives/287
YouTubeチャンネルの動画を一覧表示したい

桃鈴ねねさんが大好きで勝手にファンサイトを作ってます。

要するにアーカイブを全部表示したいと思っています。
ただまぁ流石に現時点で280本近くあるアーカイブを全部表示するのも問題なので、ページネーションを使いましょう。

```Gemfile
gem "kaminari"
```

で、いつも通り、bundle install(migration済みの場合はローカルサーバーの再起動)

次はルーティング

```config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  root to: "home#index"
  resources :archive
end
```

特に意味はないですが、全部ルーティングしておきました。
後々、追加機能を作りたくなった時に便利だと思うので。

次はcontroller

```app/controllers/archive_controller.rb
class ArchiveController < ApplicationController
  def index
    @archive = Archive.all.page(params[:page]).per(15)
  end
end
```

今回はkaminariを導入しているので、Archive.allの後にオプションをつけます。
perの引数に1ページあたりに表示する件数を設定できます。
ちなみに特に設定しなくても大丈夫ですが、デフォルトは25件になってます。

```app/views/archive/index.html.erb
#詳しい構成は省略
<h2 class="major">Archives</h2>
　　<h3>オススメ動画</h3>
　　　　<div class="archive">
　　　　　　<%= render partial: "archive" , collection: @archive %>
　　　　</div>
<%= paginate @archive %>
```

renderメソッドを使用して、さらにオプションをcollectionにします。
これで先程のcontrollerで設定した@archiveに入っている要素の数だけ、繰り返してくれるので、便利です。
最後のpaginateは実際にページネイトを表示したい場所に入れてください。

```app/views/archive/_archive.html.erb
  <div class = "archive_card">
    <%= image_tag (archive.archiveimg) , class: :music_img %>
    <p><%= archive.archivetitle %></p>
  </div>
```

先程の繰り返しになりますが、collectionのおかげで、この辺の記述はシンプルに。
わざわざeachで繰り返し処理を記述する必要もないです。

```app/assets/stylesheets/main.css.erb
.archive{
  column-count: 2;
  display: inline-block;
  flex-wrap: wrap;
  justify-content: space-between;
  align-items: center;
}

.archive_card{
width:100%;
height:100%;
padding : 0;
margin: 0 ;
position: relative;
}

.archive_card p{
  font-size : 0.5rem;
  position: absolute;
  color: black;
  top: 80%;
  left: 50%;
  -ms-transform: translate(-50%,-50%);
  -webkit-transform: translate(-50%,-50%);
  transform: translate(-50%,-50%);
  background-color: rgba(255, 255, 255, 0.6);
  width:100%;
  font-weight:bold;
  text-align:center;
}
```

最後にCSSですね。
まずdisplay: inline-block;とかで横並びにしちゃってjustify-contentでspacebetweenにしてます。
あとサムネイル画像の上にタイトルを表示したいと思いました。
理由は単純で、アーカイブが多いから。
なんせ280件もあるので、いちいちサムネイルとタイトルをそれぞれ表示してたら情報量が多いし、そもそもタイトルの長さもまちまちでカラム表示しててもズレが生じてしまうので、サムネイル上にタイトルを表示すると言うことで落ち着きました。

重要なポイントだけ記述しておくと、サムネイル画像の親要素であるarchive_cardにposition:relativeを指定してその子要素のp要素にposition:abusolute;を指定しました。
これでサムネイルの画像にp要素を載せることができます。
あとはp要素にbackgroundカラーを指定して、透過もしておきます。
サムネイルは比較的上部に桃鈴ねねさんの顔がくることが多いので、下の方にタイトルを表示して可愛い顔と被らないようにします。
これがもしブログみたいな感じだったらセンターでも良いのでしょうが。

さて、長くなりましたが、完成形です。
PC表示
![スクリーンショット 2021-06-12 0.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/c98ac3dd-1fee-61dc-d3e2-4549b9b8066a.png)
スマホ表示
![スクリーンショット 2021-06-12 0.03.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1603537/4dee0683-1d28-8b09-4a89-e6627cd8e8ee.png)

必要な情報はありつつも、シンプルな構成にできたと思います。
これと似たようなことを他のモデルでも行うので、ひとまずベースがこんな感じ、と言うことで。
Amazon Linux環境でSupervisorを使ってLaravel Queueを動作させる方法

> この記事は私自身のmediumにも記載されています。
> [Laravel Queue work with supervisor on AWS EC2](https://kim-jangwook.medium.com/laravel-queue-work-with-supervisor-on-aws-ec2-92230a20c3c1)

## 1. Supervisorをインストールする

Amazon レポジトリーにはsupervisorが入っておりません。

なので`epel`レポジトリーを使ってインストールする必要があります。

```sh
sudo yum --enablerepo=epel install supervisor
```

## 2. supervisorをスタート

```sh
sudo service supervisord start
```

`Redirecting to /bin/systemctl start supervisord.service`このメッセージが表示されたらインストール成功です。

## 3. supervisor設定ファイル修正

supervisorにworkerを追加するため、設定ファイルを修正します。

```sh
sudo vi /etc/supervisord.conf
```

下記を追記しましょう。

```conf
[program:worker]
command=php /project-home/artisan queue:work
process_name=%(program_name)s_%(process_num)02d
numprocs=2
autostart=true
autorestart=true
user=root
redirect_stderr=true
stdout_logfile=/project-home/storage/logs/worker.log
```

`worker.log`ファイルをログパスに追加することを忘れないでください。

```sh
touch /project-home/storage/logs/worker.log
```

## 4. supervisor設定ファイルの読み込み

修正された設定ファイルを読み込ませるため、下記コマンドを実行します。

```sh
sudo supervisorctl reread
```

正しく入力したら、このようなメッセージが表示されます。

```sh
worker: available
```

## 5. supervisor再起動

設定を適用させるためにsupervisorを再起動しましょう。

```sh
sudo service supervisord restart
```

workerが動作されているのか確認しましょう。

```sh
sudo supervisorctl status
```

下記のようなメッセージが表示されます。pidとuptimeは私のメッセージと違うはずです。

```sh
worker:worker_00 RUNNING pid 1043936, uptime 0:00:10
worker:worker_01 RUNNING pid 1043937, uptime 0:00:10
```

## 6. supervisorをインスタート再起動時にスタートするように設定する

```sh
sudo chkconfig supervisord on
```


終わり！
scilab計算問題！その２

#まえがき
前回は伝達関数に含まれる粘性係数などのシミュレーション問題をやりました。
今回はちょっと実用的な、収束値などを～％以下にするにはなどをシミュレーションをします。
#実行環境
・windows10
・scilab(6.1.0)64bit

#問題
問題全体の前提
※時間軸は０秒～１秒まで０．０１秒刻みで設定すること。
モータを単純比例フィードバック制御で動かすことを考える。
伝達関数はG(s)=k / ( Js+(B+k) )
___
>問題d
>定常偏差を０にするために積分器　1/s　を導入する。
>モータ制御の伝達関数に積分器を加えると、伝達関数は

G(s)=k / ( Js^2 + (B*s +k) )　になる。

>Scilabを用いて以下のシミュレーションを行い、結果（波形）を記入せよ。
>イナーシャ : J=0.05
>粘性係数 : B=1
>比例ゲイン : k=5

>積分器が含まれていない伝達関数での出力波形A（黒）
>積分器が含まれている伝達関数での出力波形B(青)

```c
s =%s;
t=0:0.01:1;

J = [0.05 0.05]
B = [1 1]
Kp = [5 5]
Col = [1 2]

for i=1:1:2;
    if i==1 then
        // 積分器なし(黒)
        P = (Kp(i)/(J(i)*s + B(i) + Kp(i)));
    else
        // 積分器あり（青）
        P = ( Kp(i)/(J(i)*s^2 + B(i)*s + Kp(i)) );
    end;

    sys = syslin('c', P);
    y = csim('step', t, sys);
    plot2d(t, y, Col(i)), xgrid();   
end;
```

![kadai03_d.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/1abe8e95-8b11-ae22-69b0-5acdc178b92b.jpeg)
___
>問題e
>Scilabを用いて以下のシミュレーションを行い、結果（波形）を記入せよ。
>※ただし、時間軸を伸ばすため　t=0:0.01:5 に変更　
>積分器　あり
>イナーシャ : J=1
>粘性係数 : B=5
>比例ゲイン : k=5 → k=10 → k=20 

```c
s =%s;
t=0:0.01:5;

J = [1 1 1]
B = [5 5 5]
Kp = [5 10 20]
Col = [1 2 3]

for i=1:1:3;
    P = ( Kp(i)/(J(i)*s^2 + B(i)*s + Kp(i)) );

    sys = syslin('c', P);
    y = csim('step', t, sys);
    plot2d(t, y, Col(i)), xgrid();    
end;
```
![kadai03_e.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/5a1d2740-80f7-37c0-bc5f-ba814f7f2445.jpeg)

___
>問題f
>Scilabを用いて以下のシミュレーションを行い、結果（波形）から定常偏差の値を読み取れ。
>積分器　なし
>イナーシャ : J=0.4
>粘性係数 : B=0.9
>比例ゲイン : k=5

```c
s =%s;
t=0:0.01:1;

J = [0.4]
B = [0.9]
Kp = [5 5]
Col = [1]

for i=1:1:2;
    P = (Kp(i)/(J(i)*s + B(i) + Kp(i)));

    sys = syslin('c', P);
    y = csim('step', t, sys);
    plot2d(t, y, Col(i)), xgrid();    
end;
```

![kadai03_f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/b69a0a6c-e765-92a7-84e9-a62353b597a7.jpeg)

___
>問題g
以下の条件を満たすために必要十分な比例ゲインの値を求めよ。
>イナーシャ : J=2
>粘性係数 : B=2
>定常偏差 : 目標値１の１０％以下

```c
s =%s;
t=0:0.01:1;

J = [2 2 2]
B = [2 2 2]
Kp = [15 17 20]
Col = [1 2 3]

for i=1:1:3;
    // 積分器なし
    P = (Kp(i)/(J(i)*s + B(i) + Kp(i)));

    sys = syslin('c', P);
    y = csim('step', t, sys);
    plot2d(t, y, Col(i)), xgrid();   
        
end;
```

![kadai03_g.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855269/d4de7d24-3c77-58a0-6822-d7cf47a1446e.jpeg)






#あとがき
基礎中の基礎はこれで抑えられたと思う。
ひさびさに使うときに思い出す用です＾＾
Pagyのページネーションの件数をページごとに設定する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/97a40c54-5611-d641-44fd-74a40b4fd91e.png)

## はじめに
RailsのページネーションのGem、**`pagy`**。
ページネーションだと**`kaminari`**が有名ですが、`pagy`はメモリの負担が少なく`kaminari`よりも高速で動きます。

ページネーションの表示件数を設定すると思うのですが、紹介している記事の多くはページごとにではなく、**アプリケーション全体の設定として記述するやり方が多かった**のでコントローラーのアクションごとに設定できる（つまり、ページごとに設定できる）やり方をご紹介します。

## pagyの基本の設定方法
まずや基本的なPagyの設定方法。
`config/initializers`配下に`pagy.rb`を配置し、以下の記述を追加します。（**追加したらサーバーの再起動必要**）

```ruby:pagy.rb
Pagy::VARS[:items] = 30
```

この場合は、３０件ずつの表示になります。ちなみに**pagyのデフォルトは２０件ずつ**です。


## pagyの設定をそれぞれにする
ページネーションさせるのがひとつのページならいいのですが、ここは１０件ずつでとやりたい場合ができず、
上記の例だと３０件ずつになってしまいます。

なので、一覧ページは１０件、管理画面は３０件ずつなどと細かく設定したい場合は**`controller.rb`**にアクションごとに記述します。


```ruby:controller.rb
def index
    @pagy, @users = pagy(User.all, items: 10)
end

def admin
    @pagy,@users = pagy(User.all, items: 30)
end
```

このように**`items :表示する数`**と記述すると、ページごとにページネーションさせる数を変えることができます。

ちなみに`ransack`を使った時はこんな感じになるかと思います。

```ruby:ransackの例
def index
    @q = User.ransack(params[:q])
    @pagy,@users = pagy(@q.result, items: 30)
end
```

<br>
それでは〜。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/0a68d2ed-ba84-86e3-a58d-bfde9d6403df.png)


> 参考サイト

- [Qiita　Rails 新興のgem pagyをつかってページネーション機能を実装する](https://qiita.com/junara/items/eb85559547f87c8cb6b3)
- [TechRacho　Rails:「Pagy」gemでRailsアプリを高速ページネーション（翻訳）](https://techracho.bpsinc.jp/hachi8833/2018_06_05/57481)
git push で403が出たらユーザー名を指定してset-urlすればいいみたい

新しいgithubアカウントを作って
新しいリポジトリをリモートで作って
ローカルで開発していたソースを

```
git remote add origin <URL>
```

add して、commitして、 pushするとエラー

```
remote: Permission to hogehoge/fugafuga.git denied to hogehoge.
fatal: unable to access 'https://github.com/foofoo/fugafuga.git/': The requested URL returned error: 403
```

これまで使ってたローカルのgithubアカウントと、
新しく作ったアカウントが違うので、
権限がないんですね


下記コマンドを実行すると新しいアカウントのパスワードを聞かれて権限なくてもコミットできるようです

```
git remote set-url origin https://hogehoge@github.com/hogehoge/sample_app.git
```

hogehogeにはリモートのユーザーネームいれましょう！

まだ詳細は理解できてませんが自分用の備忘録です！


参考
https://www.codeadvisor.jp/entry/2018/04/07/234129