OmniAICreator/Qiita-1.07M huggingface dataset:
branchをherokuにデプロイする方法

#できるようになること
branch(develop)をmasterにmergeする前にherokuでの挙動を確認したい時にbranch(develop)をherokuにデプロイする。
(railsチュートリアルでは全てmergeしてからデプロイしていた気がする。)

#準備
[railsチュートリアル１章](https://railstutorial.jp/chapters/beginning?version=5.1#cha-beginning)をやっておく。

##解説
maseterで表示されるのを
```hello,world```
developで表示されるのを
```hello,japan```

とする。

早速やってみる。

まずmasterの現状確認
![スクリーンショット 2020-04-15 12.06.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/2296f6fd-973b-165e-5bdd-3511e0f15802.png)


```rails s```で確認
![スクリーンショット 2020-04-15 12.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/ead729c3-98a7-a2ee-6b54-d78e41d3edc6.png)

masterブランチをherokuにデプロイする。

```rb:console
git add -A
git commit -m "world"
git push
git push heroku master
```

ここで自分のherokuを開いてみる
(https://〜〜〜〜〜〜〜.herokuapp.com/)
当然、先ほどと変わらないが以下のようになる。
![スクリーンショット 2020-04-15 12.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/cc16c31d-dbcb-f9ad-51e7-02ac3d393389.png)


続いて、```develop```ブランチを作成

```rb:console
git checkout -b develop
```

以下のように、表示内容変更後、一応```rails s```で確認
![スクリーンショット 2020-04-15 12.03.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/1da0c09f-0909-a8b2-1254-fb0a8e02c670.png)
![スクリーンショット 2020-04-15 12.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/f5f89d03-b387-599f-e3ea-7b3f5bbdf97a.png)

developブランチをherokuにデプロイする。

```rb:console
git add -A
git commit -m "japan"
git push origin develop
git push heroku develop:master
```
よって同様に、自分のherokuを開いてみる
(https://〜〜〜〜〜〜〜.herokuapp.com/)
きちんとできていることを確認。
![スクリーンショット 2020-04-15 12.12.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/590181/7278d304-1dc8-8070-d2b7-eec2346f8799.png)

以上！！

#筆者コメント
大したことでは無いが、ふとどうするのだろ〜？と思い調べて見た。
備忘録のためにまとめてみた。
誤り等あれば、ご指摘いただけると幸いです。
Laravel pagenationリンクのhttps化

## Laravelでpagenationを使用したときの２ページ目以降のリンクがhttpからhttpsへ変更する方法について明記します

Laravelでページ内URLをhttps〜で生成するにはAppServiceProvider.phpの boot()を以下のように記せば良いですが、paginateメソッドを使用した場合は不十分です。

```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        \URL::forceScheme('https');
    }
```

データを複数ページに分割して表示させる事ができるpaginateメソッドを利用したときに、このままだと１ページ目はhttpsになるが、2ページ目以降はhttpのままになり、エラーとなるケースがあります。

その場合には、
`$this->app['request']->server->set('HTTPS','on');`
をboot()の末尾に追記すればオッケーです。

```php:app/Providers/AppServiceProvider.php
    public function boot()
    {
        \URL::forceScheme('https');
        $this->app['request']->server->set('HTTPS','on');
    }
```

私の知る限り、これが一番シンプルな気がします。
他にもっとシンプルな方法が会ったら教えてください。

参考ページ
[PHP: Generate Laravel Paginator Secure(HTTPS) Links](https://stackoverflow.com/questions/28797590/php-generate-laravel-paginator-securehttps-links)
データベースの削除方法(＋カラムの追加と修正)

新しいアプリを作ろうと思ったら昔作成した同じ名前のデータベースが残っていたときなど。

### 既にあるよ
```
% rails db:create
Database 'drill_app_development' already exists
Database 'drill_app_test' already exists
```
### db:drop を使う
```
% bundle exec rake db:drop
Dropped database 'drill_app_development'
Dropped database 'drill_app_test'
```

### カラム追加
マイグレーションファイルにカラム追記後

```
% rails db:migrate
```

### カラム修正
```
% rails db:migrate:status
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200415025602  Create posts
```
上記コマンドでステータスを確認し

```
% rails db:rollback
```
`up` → `down`にすればマイグレーションファイルを修正可能となる
Node.js + ibm_db + Db2 で、プレースホルダを用いたSQLを実行する

プレースホルダを用いたSQLを使って、Db2にアクセスします。

SQLの条件指定を固定値(リテラル)で記述すると、指定される条件が変わるごとに新しいSQLとしてコンパイルされることになり、where条件だけが異なる同じSQLでパッケージ・キャッシュがあふれてしまいます。コンパイルにかかる時間ももったいない。
そうならないよう、可変となる値の部分だけ(場合によっては列名なども)、疑問符「？」で表したSQLで記述することができます。JDBCなどではパラメーターマーカーと呼ばれますが、Node.jsではプレースホルダと表現されるようです。

ここから先は、Db2を使う場合に、プレースホルダにどうやって値を渡すかのメモです。


## プレースホルダーを用いたSQL実行例
ibm_dbのqueryでは、値を配列として渡します。

上(settings.js)は接続情報を渡すための外部ファイルの位置づけ。
下(test2.js) がテストプログラム本体です。

```javascript:settings.js
exports.host = 'localhost';
exports.port = 50000;
exports.dbname = 'TESTDB';
exports.username = 'db2inst1';
exports.password = 'xxxxxxxx';
```

```javascript:test2.js
var ibm_db = require( 'ibm_db' );
var settings = require( './settings' );

var db_con_str =
"DRIVER={DB2}"
  + ";DATABASE=" + settings.dbname
  + ";HOSTNAME=" + settings.host
  + ";PORT=" + settings.port
  + ";PROTOCOL=TCPIP"
  + ";UID=" + settings.username
  + ";PWD=" + settings.password
;

var sql_str = "select C1, C2 from db2inst1.T3 where C1=?";
var param1 = [1];　　← ココで、「C1=?」の「?」に与える値を記述

ibm_db.open( db_con_str, function( err, conn ){
  if( err ) return console.log( err );

  conn.query( sql_str, param1, function( err, data ){
    if( err ) console.log( err );

    console.log( data );

    conn.close( function(){
      console.log( 'done' );
    });
  });
});
```
### 実行結果

```
$ node test2.js
[ { C1: 1, C2: 'a       ' } ]
done
```

なお、今回指定した値1は、データベース上は数値列(Integer)ですが、配列には文字列として記述してもちゃんと動きます。

```
var sql_str = "select C1, C2 from db2inst1.T3 where C1=?";
var param1 = ["1"];
```

## 失敗ケース その1(数値として渡した場合)
他のDBで検証されている例を見ていると、ただの数値でも問題なさそうなのですが
ibm_db では失敗します。



```javascript:抜粋(SQL/プレースホルダ)
var sql_str = "select C1, C2 from T3 where C1=?";
var param1 = 1;
```

実行結果：

```
$ node test2.js
[Error: [IBM][CLI Driver] CLI0100E  Wrong number of parameters. SQLSTATE=07001] {
  error: '[node-ibm_db] SQL_ERROR',
  sqlcode: -99999,
  message: '[IBM][CLI Driver] CLI0100E  Wrong number of parameters. SQLSTATE=07001',
  state: '07001'
}
[]
done
```

## 失敗ケース その2(文字列として渡した場合)
文字列としてダブルクオートで囲むパターンも試しましたがうまくいかず。
 ※ "1" ではなく ["1"] と記述し、文字列配列として指定すれば成功します

```javascript:抜粋(SQL/プレースホルダ)
var sql_str = "select C1, C2 from T3 where C1=?";
var param1 = "1";
```

実行結果：

```
node test2.js
/database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:600
        self.conn.query(query, params, cbQuery);
                  ^

TypeError: Argument 1 must be an Array.
    at /database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:600:19
    at SimpleQueue.next (/database/config/db2inst1/node_modules/ibm_db/lib/simple-queue.js:34:5)
    at SimpleQueue.maybeNext (/database/config/db2inst1/node_modules/ibm_db/lib/simple-queue.js:22:10)
    at SimpleQueue.push (/database/config/db2inst1/node_modules/ibm_db/lib/simple-queue.js:15:8)
    at Database.query (/database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:470:14)
    at /database/config/db2inst1/work/node/test2.js:19:8
    at /database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:111:11
    at /database/config/db2inst1/node_modules/ibm_db/lib/odbc.js:333:11
```
5分で理解する「BTCネットワークへの接続」



#1.ネットワーク
1.ネットワーク接続概要
1.Bitcoin Coreを起動
2.他のノードのIPを求め、DNSシードに接続する  DNSシードはBitcoinノードのIPアドレスリストを提供するDNSサーバです。mainnet/testnet用に複数のシードが存在する
3.DNSシードは新しい接続を受け入れられるフルノードのIPアドレスを返信する
4.ノードはそのアドレスを使ってネットワーク上の他のノードと接続する。
5.この時、Bitcoin Coreはそのノード情報をディスクのDBに保存する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387365/3bc1e33d-7ddf-3deb-26c3-acd0d180e165.png)

図1:ネットワーク接続概要
・以降はDB上のノード情報を用いて接続する
・11秒以内にコネクションが確立できなければ再びDNSシードに問合せる
・障害などによってDNSシードにすらアクセスできない場合を考慮しIPアドレスと ポート番号のリストもハードコードされており、DNSシードに60秒以内に応答がない場合はこのIPアドレスへの接続を試みる。

#2.ハンドシェイク

ローカルノードとリモートノードがお互いのversionメッセージを取得。
その後のメッセージの送信は両者のバージョンのうち小さい方のバージョンに合わせて行われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387365/2bd73f91-3d11-31f0-8065-f4d327ba566e.png)
図2:ハンドシェイク
ハンドシェイクが終了すると他のメッセージを送信できるようになる。
(ex:edderメッセージでネットワーク上のノード情報を取得)

#3.Initaial Block Downroad(IBD)
ネットワークに接続後に最新のブロックまでブロックチェーンのデータのダウンロードを開始する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387365/2d2e7f0c-6a98-c69a-1707-55732905e1bd.png)
図3:初期ブロックダウンロード

getheaderメッセージではそのペイロードにどの時点から(Header Hashes)どの時点までのブロックを要求するか(Stopping Hash)セットしますがIBDではHeader Hashesにローカルノードが保持する最新ブロック(この場合はジェネシスブロック)のハッシュをStopping Hashに0x00...00をセットして送信する。

getheaderによるブロックヘッダの取得とgetaddによるブロックデータの取得は並行して行われる。

#4.ブロックのブロードキャスト
マイナーによるブロードキャストは二種類の方法に分けられる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387365/30f7bd2f-389d-8e51-294e-3fba6bf23911.png)

図4:ブロックのブロードキャスト
フルノードに対するブロックリレーとSPVノードに対するブロックリレーは方法が異なる。
新しいブロックを受信したフルノードはブロックの検証を行い問題がなければ上記の方法でブロックをリレーする。

#参照
[ブロックチェーンプログラミング]
(https://www.amazon.co.jp/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E4%BB%AE%E6%83%B3%E9%80%9A%E8%B2%A8%E5%85%A5%E9%96%80-%EF%BC%AB%EF%BC%B3%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%B1%B1%E5%B4%8E%E9%87%8D%E4%B8%80%E9%83%8E-ebook/dp/B078G94JNT/ref=dp_kinw_strp_1)
Androidでreact-native-webviewを呼び出せない問題の対応方法

# 何が起こった？
react-native-webviewを利用しようとした時、以下のようなエラーが発生してWebViewを利用できませんでした。
少し調べたところreact-native-webviewのバグのようです。

```
Error: crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues -not-supported
```

<img width="385" alt="スクリーンショット 2020-04-15 10.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617175/4057dc2b-3516-828e-378b-5759ff708de9.png">

# 環境
react-native: 0.60.5
react-native-webview: ^9.2.1

# 解決策
`react-native-get-random-values`を利用することで解決しました。

インストール

```text
$ yarn add react-native-get-random-values
$ cd ios && pod install
```

WebViewを利用するところの一行目に以下を追加。

```typescript

import 'react-native-get-random-values'
```

これで解決するはずです。

# 最後に
誰かの参考になれば嬉しいです。
Twitterもやってます。
もしよければフォローよろしくお願いします！ -> [@kasssssy0000](https://twitter.com/kasssssy0000)



# 参考
https://stackoverflow.com/questions/61135378/react-native-webview-crashes-application-when-invoked
https://github.com/react-native-community/react-native-webview/issues/1312
https://github.com/LinusU/react-native-get-random-values
Eagle CADのライセンス形態が変わりました。

#1.はじめに

　電子回路の基板を作るとき、専用のCADを使うと部品のライブラリー管理は、複雑は配線を整理してくれてとても便利です。
世間的には、Eagle CADとKiCADのシェアが高いです。個人的には長く使ってきただけの理由で、これまでEagle CADのライセンスを購入して使っています。
　しかし、今年1月よりEagle CADのライセンスの形態が大きく変わったため、その内容を整理したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/2ef2c037-754b-ccef-e71b-dbe38d5a24f9.png)

#2.変更の背景
 Eagle CADを提供しているAutodesk社は、**Fusion360**という3D CADも手掛けています。
3D CAD市場は、Solidworks社のシェアが圧倒的に高いです。Solidworsのライセンスは購入＋更新モデルで、購入は、1本3995ドルです。毎年の更新料は1295ドルです。
 そこで、Autodesk社は、Solidworksが買えない個人ユーザー、大学研究機関、スタートアップを対象に、Fusion 360を比較的に安い価格で提供してきました。Fusion360のライセンスは、サブスクリプションモデルで、毎年 495ドルがかかります。

 去年の12月までは、Eagle CADとFusion 360は別々の製品となっており、お互い連携ができるものの、購入は別々になっていました。
 それを今年の1月より、Fusion 360にEagle CADを統合することにしました。正確には、**Fusion 360にEagle CADを取り入れる形で、Fusion 360のライセンスを購入すると、Eagle CADも使える**ようにしました。その反面、単体のEagle CADライセンスを購入することはできなくなり、結果的にFusion 360を買わざるを得ない状況にもなったわけです。

Autodesk社にとって、Eagle CADのユーザー層を取り入れてFusion 360のシェアを拡充したい思惑が見られる措置だと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208980/d571045e-ba0b-fa62-302e-a6ad3d74f836.png)


#3.変更内容

　上記のAutodesk社のライセンス政策変更により、ライセンス価格も大きく変わりました。

　Eagle CADユーザーの観点からすると、下記の表になります。

|     |       Until 2019/12 |    Until 2019/12 |   After 2020/01    |
|:----------------:|:-----------------:|:-----------------:|:------------------:|
| ライセンスタイトル    |       Eagle Standard        | Eagle Premium                |     Fusion360 + Eagle Premium           |
|    機能        | レイヤ数４、基板領域160cm^2   | レイヤ数16、基板領域 ∞               |  レイヤ数16、基板領域 ∞  + 3D　CAD            |
| 年間ライセンス費用        |    16,500円        |    86,900円          |     61,000円           | 

　2019年12月までは、Eagle StandardとEagle Premiumという二つのライセンスを提供してきました。1年間のライセンス費用は、それぞれ16,500円と86,900円でした。Hobby向けの個人ユーザーの場合、ほとんどEagle Standardを利用していたと思います。

　2020年１月より、Eagle StandardとEagle Premiumという区別を取りやめて、Fusion 360に従属するEagle Premiumのみにしました。
　年間ライセンス費用は、61,000円です。
　既存のEagle Premiumユーザーにとっては約25,000円も安くなりましたが、既存のEagle Standardユーザーにとっては、約45,000円が高くなり、使う予定が未定の3D CADが付いてくることになります。

#まとめ
1. 2020年1月よりEagle CADのライセンスが大きく変更されました。
2. 既存のEagle Premiumユーザーにはお得な内容です。
3. 既存のEagle Standardユーザーには不利な内容です。

* この記事をお読みになった方の中に、Fusion 360のユーザーが入らっしゃったら、Fusion 360のすゝめのコメントを頂けないでしょうか？Fusion 360に入るために、一押しがあればと思います。

#参考資料

1.[Autodesk EagleCAD + Fusion360 License Price]<https://www.autodesk.co.jp/products/fusion-360/subscribe?plc=F360&term=1-YEAR&support=ADVANCED&quantity=1>

2.[Eagle CAD no longer stand alone program, Autodesk now includes Eagle with Fusion 360]<https://www.reddit.com/r/PrintedCircuitBoard/comments/eo23rk/eagle_cad_no_longer_stand_alone_program_autodesk/>
VirtualBoxの共有フォルダの設定：ホスト-windows10：ゲスト-Linux Mint

Windows10のノートPC上でlinuxを動かすためにvisualboxを使ってみたが
今回はwin-linux間の共有フォルダの設定について行った手順をメモする。

PC環境は
ホスト：Windows10
ゲスト：Linux Mint
である。

行った手順は以下のとおりである。

ホスト
①任意のディレクトリにて共有にしたいフォルダを新規作成
②VirtualBox上で共有したいゲストPCを選択して 設定/共有フォルダー の順に選択
③右にあるフォルダの追加のようなボタンをクリックして①で作成したフォルダのパスのとフォルダ名を入力

※このフォルダ名がゲストにおける共有フォルダ名になる(正確にはsf_フォルダ名)

④自動マウントと永続化するという項目にチェックがあることを確認してOK

ゲスト
①下図の「Guest Additions CD イメージの挿入」をクリック
<img width="528" alt="スクリーンショット (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619397/e48d3754-c936-fb46-1bfc-ef3994516f45.png">
(これを見つけるのに結構時間がかかりました笑)

②色々なウィンドウが出るけど全部OK
③再起動するとデスクトップ上にアイコンが表示される

これで共有されていなければ
④ゲストの端末に以下を入力
$ sudo  gpasswd -a ユーザ名 vboxsf
おそらくVirtualBoxのシェアフォルダに追加するユーザに常にアクセス権限を持ってデータを出し入れしますよという意味

何となく再起動してると確かにホスト-ゲスト間のデータ共有が確認できた。
laravel sendgrid 宛先が二重になる

追記
IP Access Management　を設定してIP制限をした。
モデムを変更するときやネット環境を変更するときはログインできなくなるので注意する。

なんかわからんけど、宛先が二重になってしまう。

https://qiita.com/ma7ma7pipipi/items/664a116b0a85439c3c66

```app/Mail/SendMail.php

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

use Sichikawa\LaravelSendgridDriver\SendGrid;
use Log;


class SendMail extends Mailable
{
    use Queueable, SerializesModels;
    use SendGrid;//これ大事
    protected $data;//これ大事

    public function __construct($data)
    {
        $this->data = $data;
    }

    public function build()
    {

        return $this->text($this->data['layout'])
            ->from($this->data['from']['email'],$this->data['from']['name'])
            ->replyTo($this->data['to']['email'],$this->data['to']['name'])
            ->subject($this->data['subject'])
            ->with(['data' => $this->data]);


    }

}

```

```HogeController.php

<?php


use Illuminate\Support\Facades\Mail;
use App\Mail\SendMail;

use Illuminate\Support\Facades\Cache;



class HogeController extends Controller
{

    public static function test()
    {


        $data = [
            'layout' => 'email.contact',
            'subject' => 'ここにタイトル',

            'from' => [
                'email' => 'info@fromblog.net',
                'name' => 'ひでぶろぐ'
            ],
            'to' => [
                'email' => 'info@to.com'
            ],
            'id' => '100',
            'name' => 'はなこ',
            'body' => 'ここに内容がはいります\nどうなりますかね'
        ];

        Mail::to('info@to.com')->send(new SendMail($data));

    }

}

```




```resources/views/email/contact.blade.php

ユーザーID: <?=$data['id'];?> :  <?=$data['name'];?> 様よりお問い合わせ

改行いけるかな
<?=nl2br($data['body']);?>



```

こんな感じですね。
あとはセキュリティ上 htmlspecialchars をやったりしましょう。
Python リストから順番を維持したまま重複を取り除く方法。

**Python3.7以降から使える方法です。**
---
Python3.7からは**辞書の順番が維持**されるらしい。
##fromkeys()
以下のようにして辞書が生成できる。

入力 `print(dict.fromkeys(["キー1", "キー2", "キー3"], "値"))`
出力 `{"キー１": "値", "キー2": "値", "キー3": "値"}`

第二引数を指定しなければ値がNoneとなる。
print(dict.fromkeys(l))
 {3: None, 2: None, 1: None, 5: None, 4: None}```

##list()
辞書を引数に渡すとkeyからリストを作る。

**Keyは重複しない**
##本題
入力

```
l = [3, 3, 2, 1, 5, 1, 4, 2, 3]
print(dict.fromkeys(l))
print(list(dict.fromkeys(l)))
```
出力

 ```
{3: None, 2: None, 1: None, 5: None, 4: None}`

[3, 2, 1, 5, 4]
```
UEFI+GPTな環境におけるssdの増設のためのパーティションのclone

# 目的

UEFI + GPTなPCに載っているNVMeなSSDのパーティション(/dev/nvme0n1p5 128GiB)を，SATAなSSDのパーティション(960GiB)に移し替える
- ただし，efi boot領域は/dev/nvme0n1p2に残す

個人の備忘録に近い

## 元の環境 (windows10とubuntu 19.10のデュアルブート)
ubuntuにおけるlsblkコマンドの抜粋

```
nvme0n1     477G   disk 
├─nvme0n1p1 499M   part 
├─nvme0n1p2 100M   part /boot/efi
├─nvme0n1p3 16M    part 
├─nvme0n1p4 348.3G part /windows
└─nvme0n1p5 128.0G part /
```

## 現環境
ubuntuにおけるlsblkコマンドの抜粋

```
nvme0n1     477G   disk 
├─nvme0n1p1 499M   part 
├─nvme0n1p2 100M   part /boot/efi
├─nvme0n1p3 16M    part 
└─nvme0n1p4 348.3G part /windows
sda         931.5G  disk 
└─sda1      931.5G  part /
```

# 踏んだ手順
以下の作業には全くwindowsを使っていない
## ssdの購入，接続
nvmeは高かったのでsataにした
samsungの960GBのやつを信頼して買った
普通にsata接続をした

## ssdのフォーマット，クローン
```bash
$ sudo mkfs.ext4 /dev/sda
$ sudo ddrescue -r1 -f -v /dev/nvme0n1p5  /dev/sda1  ddrescue1.log # ddより少し安全
$ sudo fsck -n /dev/sda1 # なんとなく実行
$ sudo e2fsck /dev/sda1 # たしか実行しろという指示がどっかで出た
$ sudo resize2fs /dev/sda1 # これをしないとdf -hでの容量が128GBのままになる
$ sudo blkid # /dev/sda1のUUIDを控える(PARTUUIDは特に控えなかった)
$ sudo vi /etc/fstab # /をマウントしている部分のUUIDを変更
```
## grubの修復 (boot-repair)
ubuntuのライブUSB(18.04, 日本語環境)を作成
18.04のライブUSBの日本語環境だとboot-repairのためのadd-apt-repositoryがうまくいかないため，

```bash
$ sudo mv /etc/apt/sources.list.d/ubuntu-ja.list /etc/apt-sources.list.d/ubuntu-ja.list.my-save
$ sudo add-apt-repository ppa:yannubuntu/boot-repair
$ sudo apt update
$ sudo apt install boot-repair
$ boot-repair # ここでgrubを更新
$ sudo mv /etc/apt/sources.list.d/ubuntu-ja.list.my-save /etc/apt-sources.list.d/ubuntu-ja.list
$ reboot
```

## bootを確認
grubからubuntuを起動してubuntuが動作することを確認

## 元の領域を削除

```bash
$ sudo cgdisk /dev/nvme0n1 # ここでncursesの操作インターフェースからnvme0np5を削除
```
AWS VPCについて理解する

# はじめに

- Amazon VPC (Virtual Private Cloud)は、Amazon EC2 のネットワーキングレイヤーです。

# デフォルトVPC

- デフォルトVPCを作成すると、以下の内容が自動で作成され、VPC内のEC2から簡単にインターネットへアクセス出来る。
 - ３つのサブネット
 - ルートテーブル
 - インターネットゲートウェイ
 - DHCPオプション
 - ネットワークACL
 - セキュリティグループ

## デフォルトVPCを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/adef685b-56ef-8705-dec4-2ba7b21c18a3.png)

## デフォルトVPCが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/2e54c2c9-bf4e-5bdc-f06f-e47a8e7932af.png)


## デフォルトVPCを削除した、まっさらな状態
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/639f6e79-1318-f819-bc83-9b019f224b1b.png)

## EC2インスタンスを作成しようとするとVPCが無いとエラーになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/b0f2c5da-9947-4f77-1fca-102147b12e9e.png)


# サブネット

- VPC内のネットワークを分割する機能です。
 - 3つのサブネットが自動的に作成される
 - ネットワーク ACL に明示的にサブネットを関連付けない場合、サブネットはデフォルトのネットワーク ACL に自動的に関連付けられる
 - サブネットは一度に 1 つのネットワーク ACL にのみ関連付けることができる

# ルーティング

- VPC内のサブネット(172.31.0.0/16)向けは、local
- 外部(0.0.0.0/0)向けは、IGW

# セキュリティ

## VPC構成図
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89366/0635f670-9b0f-0fbe-8459-eeec909030ea.png)

- [セキュリティグループとネットワーク ACL の比較](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Security.html#VPC_Security_Comparison)
- [ベストプラクティス](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-security-best-practices.html)

## ネットワークACL

- ネットワークACLは、サブネットのファイアウォール機能です。
 - **デフォルトのネットワーク ACL** が自動的に設定され、**すべてのInとOutを許可**
 - **各カスタムネットワーク ACL** は、ルールを追加するまで**すべてのInとOutを拒否する**
 - 低い番号から順にルールを評価し、一致したら即適用される
 - **ステートレス**

## セキュリティグループ

- セキュリティグループは、インスタンスの仮想ファイアウォール機能です。
 - インスタンスレベルで動作
 - **許可ルールのみ指定**できる
 - **ステートフル**

# おわりに

- VPCを理解するには、インフラの基本的な知識が必要。
- プライベートなサブネットを構成する際、NATゲートウェイを使うと課金されるので注意。
jestでCould not find source fileが発生したときの対処法

# 原因
テストファイル名を変更したことで、キャッシュの内容と相違が生じるため
# 対処法
キャッシュを削除すれば大丈夫

```bash
$ jest --clearCache
```

# 最後に
`ts-jest`のバージョン`25.3.2`で修正が入るみたい。

# 参考文献
- [Github - ts-jest 25.3.1 - "cannot find source file" #1506](https://github.com/kulshekhar/ts-jest/issues/1506)
JavaプロジェクトをKotlinに書き換えるための初期設定

完全にJavaで記述されたAndroidプロジェクトにKotlinのファイルを追加するための初期設定手順をまとめます。

## appのbuild.gradle

```
+ apply plugin: 'kotlin-android'
+ apply plugin: 'kotlin-android-extensions'

buildscript {
}

repositories {
    + mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

android {
}
```

### 解説
プラグインを適用します。

```
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
```

repositoriesにmavenCentralを追加

```
mavenCentral()
```

ライブラリセットにKotlinのjdkを追加しました。

```
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
```

## Projectのbuild.gradle

```
buildscript {
    + ext.kotlin_version = '1.3.71'

    repositories {
    }

    dependencies {
        + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
```

### 解説

Kotlinのバージョンを追記します。

```
 ext.kotlin_version = '1.3.71'
```

dependenciesにクラスパスを追記します。

```
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
```

以上で、Javaプロジェクト内でKotlinのビルドを行えるようになりました。
アノテーションツール「cvat」インストール備忘録【Windows10】

# 概要

opencvてかintelが作ってるアノテーションソフト。まだちょっと使ってみたかったので、環境を作ってみました。あくまで自分が上手くいった方法を以下にまとめます。

# 条件

以下のものをインストールしてください。

- Docker for Windows
- Git
- Google Choeme（cvatで唯一サポートしているそうです）

自分はGitについては「scoop」を用いてインストールしています。scoopについては以前に簡単に備忘録を作成しています。

- scoop環境構築【WIndowsでのパッケージ管理】：[https://qiita.com/StrayDog/items/69fb347cec6a003c0ff4](https://qiita.com/StrayDog/items/69fb347cec6a003c0ff4)


# 手順

## cvatのリポジトリをダウンロード

```
git clone https://github.com/opencv/cvat
cd cvat
```

## ビルド

```
docker-compose build
```

## コンテナ構築／コンテナ起動

```
docker-compose up -d
```

## cvatアカウント作成（Djangoのアカウントです）

```
docker exec -it cvat bash -ic 'python3 ~/manage.py createsuperuser'
```

## cvatにアクセス

[http://localhost:8080/](http://localhost:8080/)をWebブラウザ（Google Choeme）で開く。

# さいごに

一応環境構築まで。使い方については元気があれば。

# 参考

- Quick installation guide：[https://github.com/opencv/cvat/blob/master/cvat/apps/documentation/installation.md#windows-10](https://github.com/opencv/cvat/blob/master/cvat/apps/documentation/installation.md#windows-10)
ラズパイでファイルマネージャーを開くとすぐに消える場合の対処法メモ

# 事象
ラズパイでファイルマネージャーを開こうとすると、一瞬開いてすぐに消える。再起動しても現象は変わらない。

↓ファイルマネージャーのアイコン
![FileManager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472694/208ab545-d018-5583-6326-e12bf0122b4d.png)

# 直前までやっていたこと
ラズパイのアップデートを行っていた。

```
$ sudo apt-get update
$ sudo apt-get upgrade
```

# 原因
アップデートに失敗、保留があり全て完了していなかった。

```
$ sudo apt-get upgrade
```

を実施すると、ターミナルに下記が表示されるようになった。


パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています ... 完了
以下のパッケージは保留されます:
xxxxx xxxxx xxxxx xxxxx xxxxx
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 5 個。

# 対策
保留になっているパッケージを個別にインストールする。

```bash
$ sudo apt-get install xxxxx #xxxxxはパッケージ名
```

保留が0個になれば完了。

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています ... 完了
以下のパッケージは保留されます:
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

# 効果確認
無事にファイルマネージャーを開くことができた。


# 他に
調べると色々と対処法が出てくるが、これらを試しても今回は効果が見られなかった。

```bash
$ sudo apt-get dist-upgrade
$ sudo apt-mark unhold pcmanfm #ファイルマネージャー保留解除
```
Android端末をLinuxデスクトップの音声レシーバーとして使ってみる

# 概要
Bluetoothイヤホンとか，Bluetoothレシーバーとかありますが，充電するのがめんどいですね．
スマホなら充電は基本できてるし，ずっとスマホにイヤホンを刺しておいて，PC使うときにスマホからPCの音が聞けたら素敵ですよね？

`LinuxPCの音 -> LAN -> Android端末のイヤホンorスピーカー`
というわけです．

はい．やってみましょう．

# 方法
PulseAudioの**`module-simple-protocol-tcp`**を使います．
PulseAudioは音声入出力デバイスを管理するためのサウンドサーバーですが，音声をTCPで別ホストのPulseAudioに流すという機能もあります．

しかし今回のクライアントはAndroid端末です．
そこで，**[PulseDroid](https://github.com/dront78/PulseDroid)**というアプリを使います．
このアプリは`module-simple-protocol-tcp`でTCP越しに送られてきたデータをAndroidで再生してくれるオープンソースのAndroidアプリです．
めっちゃ古いアプリですが，**Android 10のスマホでも問題なく利用できています**．

# PC側設定
```bash
$ pactl load-module module-null-sink sink_name=TCP_output
$ pacmd update-sink-proplist TCP_output device.description=TCP_output
$ pactl load-module module-simple-protocol-tcp rate=48000 format=s16le channels=2 source=TCP_output.monitor record=true port={適当なポート番号} listen=0.0.0.0
```

その後，`pavucontrol`を起動します．

![image898.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108489/b3dd8b13-a691-946b-a548-cb21f77fadc9.png)

「再生」タブから転送したい出力の出力先を「TCP_output」に設定します．

# Android側設定
Androidアプリをダウンロードします．
https://github.com/dront78/PulseDroid/raw/master/bin/PulseDroid.apk

インストールして起動するとこのように表示されます．

ServerにPCのIPアドレス，Portに先程決めたポート番号を設定してStartボタンを押すと，音が流れ始めるはずです！！
![image877.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108489/73503bb4-7338-59d9-0388-c348e2309b06.png)


新しいAndroid端末は小電力化のために自動でバックグラウンドプロセスを一定時間で終了させる機能がついています．
なのでこの機能が採用される前のアプリをインストールすると予期せずバックグラウンドプロセスが終了することがあります．
PulseDroidも例にもれず，しばらく時間が経つと音が勝手に消えてしまいます．

それを回避するために，`設定 -> アプリ情報 -> PulseDroid -> 詳細設定-> 電池の最適化` から，「最適化しない」を選んでおきます．

これで何時間でも使えるはずです！！！！

# 注意1
`load-module`した後に，PulseDroidでStartするようにしないと聞こえません．(逆になったときは単純にPulseDroidをStartし直せばOK)




# 永続設定
PCで起動時に自動でONにしたい場合は設定ファイルに書きましょう．
`.config/pulse/default.pa`

```
.include /etc/pulse/default.pa

load-module module-null-sink sink_name=TCP_output
update-sink-proplist TCP_output device.description=TCP_output
load-module module-simple-protocol-tcp rate=48000 format=s16le channels=2 source=TCP_output.monitor record=true port={適当なポート番号} listen=0.0.0.0

```
#Rails / found unpermitted parameter / e.g ignore GET request RequestBody ( not URL parameter )

# Controller example

use `:except`
not `:permit`

```rb
class UserController < ApplicationController
  def index
    permitted_params = params.except(:foo).permit(:page)

    ...
  end
end
```

# How to test

Maybe Rspec does not support invalid Get with RequestBody method


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3074








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Dockerで実装してみた。コケた。

昨日、Dockerで環境構築を行い、ひとまずは動くところまでなんとかいった。
普通に理解してないけどうるぞーさんいわく、動けば理解しなくてもOK！とか。
今は動くことの楽しさを噛み締めて進めてみようと思う。

さて、2日目の今日になったわけだけれど、さっそく`docker-compose up`で立ち上げてみましたよ。
したら`rails db:migrate`していないと怒られました。
はて？昨日`db:migrate`したような。。
一度、`docker-compose down`したらもう一回`db:migrate`しないといけないのだろうか…。バカな！
https://qiita.com/KONTA2019/items/0444ae3b8c8936a56ee0
結果的に、`db:migrate`したら普通にいつものYay! You’re on Rails!が出てくれたので`db:migrate`忘れが原因ってことになります。
（でも、昨日`db:migrate`したやんけ…。）

さて、ひとまずは動いたし次いこ。

#追記（2020/4/19）
いやはや、docker-composeは...
>複数のコンテナで構成されるアプリケーションについて、Dockerイメージのビルドや各コンテナの起動・停止などをより簡単に行えるようにするツールです。
https://knowledge.sakura.ad.jp/16862/

はい、理解不足W

up と start がごっちゃになっているが故の誤解も発覚。
https://qiita.com/tegnike/items/bcdcee0320e11a928d46

これは恥ずか死んじゃうやつ。
Flutterコードをpushする前に静的解析チェックをする

Flutterアプリのリポジトリにflutter analyze, flutter formatをチェックするCIを設定したのでコードpushする前にチェックしておきたい。

`.git/hooks/pre-push` にこんな感じのスクリプトを置いてpush前にチェックすることにした。

```
#!/bin/sh

prePush() {
  runFlutterAnalyze
  runFlutterDartFormat
}
runFlutterAnalyze() {
  flutter analyze
  status=$?
  if [[ $status = 0 ]]; then
   echo '[info] Pass flutter analyze'
  else
   echo '[error] Not pass flutter analyze, are you sure to push? [y/N]'
   exec < /dev/tty
   read answer

   case $answer in
    'y' | 'yes') echo '[info] continue to push';;
    * ) echo '[error] stop pushing';exit 1;;
   esac
  fi
}

runFlutterDartFormat() {
  flutter format --set-exit-if-changed --dry-run .
  status=$?
  if [[ $status = 0 ]]; then
   echo '[info] Pass flutter format'
  else
   echo '[error] Not pass flutter format, are you sure to push? [y/N]'
   exec < /dev/tty
   read answer

   case $answer in
    'y' | 'yes') echo '[info] continue to push';;
    * ) echo '[error] stop pushing';exit 1;;
   esac
  fi
}

prePush
exit 0
```
Windows 10 に GNU Awk をインストール

#インストール手順

1. Chocolatey をインストール
※すでに Chocolaty をインストール済の場合は不要
>https://chocolatey.org/install#installing-chocolatey

2. Chocolatey がインストールされたことを確認
`> choco --version`
**0.10.15** のように出力されたら ok です。

3. GNU Awk をインストール
`> choco install gawk`
>https://chocolatey.org/packages/gawk

4. GNU Awk がインストールされたことを確認
`> awk --version`
次のように出力されたら ok です。awk が使えます。

```cmd
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 3.1.5, GNU MP 6.1.2)
Copyright (C) 1989, 1991-2019 Free Software Foundation.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
```
【Laravel】bladeで変数の存在確認する方法

「0」,「null」,「""」　をどうとらえるか↓↓↓

|関数 / 項目|$a = 未定義|$a = NULL|$a = ””|$a = 0|array();|
|---|---|---|---|---|---|
|$a == Null|true|true|true|true|
|$a == “”|true|true|true|true|
|$a == 0|true|true|true|true|
|$a === Null|true|true|false|false|
|$a === “”|false|false|true|false|
|$a === 0|false|false|false|true|false|
|is_null($a)|true|true|false|false|false|
|isset($a)|false|false|true|true|true|
|empty($a)|true|true|true|true|true|
|!empty($a)|false|false|false|false|false|

$textがnullの場合Helloが表示される

```php

@if(isset( $text ))
<p>$test</p>
@else
<p>Hello</p>
@endif
```
「！」をつけると存在が確認できない場合trueとなる

```php

@if(!isset( $text ))
@if(!is_null($text))
```


返り値のCollectionの配列が空かの判定にはisEmptyを使う
[ドキュメントはこちら](https://laravel.com/docs/5.6/collections#method-isempty)

```php

if($a->isEmpty()){
   //$aが空の場合の処理
}else{
   //$aが空じゃない場合の処理
}
```

ちなみに、、、<font color="Red">->first()</font>で取得したCollectionが空の場合NULLが返ってくる
curl  request GET method with RequestBody  ( --data  )( GET にリクエストボディは指定できるのか？ )( #shell )

# How

GET でリクエストを送り、なおかつ --data を指定すれば良いようだ
Specify GET request and --data both

```
curl --request GET https://example.com --data 'foo=bar'
```

```
curl -X GET https://example.com -d 'foo=bar'
```

# result

クライアントはRequestBodyを送って良いが、サーバーは無視するという仕様らしいと小耳に挟んだ


```
$ curl -X GET https://example.com -d 'foo=bar' 

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
	<head>
		<title>400 - Bad Request</title>
	</head>
	<body>
		<h1>400 - Bad Request</h1>
	</body>
</html>
```

# 参考

[cURLでbody付きのGETリクエスト - Qiita](https://qiita.com/dozo/items/5bccf146c71bfb5921ec)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/3073








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
EC2+DockerでLaravel環境構築時にブラウザに表示されたエラーを解決する

EC2インスタンス上でLaravelの開発をしたかったので、AWS EC2インスタンスにDocker及びDocker-composeをインストールした後、こちらの記事を参考にDockerでのLaravelの環境構築をおこないました。
が、最後のLaravel起動確認で２つのエラーが発生したので対処法を残します。
>[Dockerを使ってLaravel開発環境構築(Apache)](https://qiita.com/A-Kira/items/9a03d7b230741ed7b1de)

##出てきたエラー
Laravelプロジェクトを新規作成しブラウザで確認したところ以下のような画面に。
![スクリーンショット 2020-04-15 10.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/20b7efd0-223d-2555-c195-c4adeaf7e4af.png)

>UnexpectedValueException
>The stream or file "/var/www/html/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied

>Database name seems incorrect
>You're using the default database name laravel. This database does not exist.
>Edit the .env file and use the correct database name in the DB_DATABASE key.

##解決法
最初のエラーについて解決法を探ったところ、コンテナに潜ってStorageフォルダの所有者をwww-dataに変更すれば解決できそうだったので実際にやってみました。
>[linuxでweb開発 - VUEPRESS BLOGを試すBLOG](https://blog.rihariha.org/2020/02/08/_08/)



```
#コンテナ内に潜入
$ docker-compose exec web bash

#storageフォルダの所有者をwww-dataに変更
chown www-data storage/ -R     
```

上記実行後
![スクリーンショット 2020-04-15 10.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434874/4980af2b-2ceb-99f6-c4fa-01ffd204385d.png)

上のエラーと同時に下のエラーまで解決してくれてなんとか起動画面を呼び出せました。

##2020/4/17 追記
EC2+Docker+nginx+Laravelの開発環境を作りたいと思い、今度はこちらの記事を参考に実践しました。

>[Dockerを使ってLaravel開発環境構築](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)

まったく同じエラーがでたのですが、同じくstrageフォルダの権限を変える方法で解決しました。
※コンテナに潜る際は、コンテナ名を`php`に指定しました。
Ruby で解く AtCoder Judge System Update Test Contest 202004 B

# はじめに
いつもお世話になっております *[AtCoder](https://atcoder.jp/home)* で、新しいジャッジシステムの負荷テストを兼ねたコンテストが行われました。

*[こちらの記事](https://qiita.com/superrino130/items/de5b67a81cceaf8a7c10)* にて既に ***Perl*** で解いたのですが、勉強として ***Ruby*** でも解いてみたいと思います。

今回のB問題
*[AtCoder Judge System Update Test Contest 202004 B - Picking Balls](https://atcoder.jp/contests/judge-update-202004/tasks/judge_update_202004_b)*
# ２つの配列
赤ボール・青ボールそれぞれの配列を準備します。

```array.rb
n = gets.to_i
r = []
b = []
n.times do
  x = gets.split.to_a
  if x[1] == 'R'
    r.push(x[0])
  else
    b.push(x[0])
  end
end
r.sort! {|a, b| a.to_i <=> b.to_i}
puts r
b.sort! {|a, b| a.to_i <=> b.to_i}
puts b
```
# 配列のリファレンス
配列のリファレンスを使用した解法

```ref.rb
n = gets.to_i
p = []
n.times do
  x = gets.split.to_a
  p.push([x[0].to_i, x[1]])
end
p.sort! {|a, b| (b[1] <=> a[1]).nonzero? || (a[0] <=> b[0])}
p.each do |num, color|
  puts num
end
```
*Perl* では、文字のソートは **cmp** 、数値のソートは **<=>** を用います。
*Ruby* では、どちらも **<=>** でソートを行いますが、数値をソートする場合、予め整数型への変換 **to_i** を行う必要があります。

```convert.rb
  p[i] = [x[0].to_i, x[1]]
```
# ハッシュのリファレンス
ハッシュのリファレンスを使用した解法

```hash.rb
n = gets.to_i
p = {}
0.upto(n - 1) do |i|
  x = gets.split.to_a
  p[i] = {num: x[0].to_i, color: x[1]}
end
q = p.sort {|a, b| (b[1][:color] <=> a[1][:color]).nonzero? || (a[1][:num] <=> b[1][:num])}
q.each do |q|
  puts q[1][:num]
end
```
ハッシュのリファレンスを使用することにより、解読性が上がります。

```diff.rb
p.sort! {|a, b| (b[1] <=> a[1]).nonzero? || (a[0] <=> b[0])}

p.sort {|a, b| (b[1][:color] <=> a[1][:color]).nonzero? || (a[1][:num] <=> b[1][:num])}
```
ハッシュの破壊的ソートは無い様子。
# Perl のハッシュのリファレンス
```hash.pl
use v5.26; # strict say state biwise
use warnings;

chomp (my $n = <STDIN>);
my @p;
for my $i (0..$n-1) {
  chomp (my @b = split / /, <STDIN>);
  push @p, {num => $b[0], color => $b[1]};
}
my @q;
@q = sort {$b->{color} cmp $a->{color} || $a->{num} <=> $b->{num}} @p;
say $_->{num} for @q;
```
ハッシュの受け取り先を配列としています。
# まとめ
+ B - Picking Ballsを ***Ruby*** で解いた
+ Ruby に詳しくなった
+ Perl に詳しくなった

参照したサイト
*[instance method Array#sort](https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html)*
*[instance method Hash#sort](https://docs.ruby-lang.org/ja/latest/method/Hash/i/sort.html)*
*[Perlのsortの基本的なやつ](https://qiita.com/otaka/items/af69693e68052e7ca02c)*
*[Perl List::Util::pairs で解く AtCoder Judge System Update Test Contest 202004 B](https://qiita.com/superrino130/items/de5b67a81cceaf8a7c10)*
ログインシェルを変更する

ログインシェルを変更する際は、**chshコマンド**を使います。

##シェルとは
人間の入力をコンピュータに伝えるプログラムのこと。
ターミナル(黒い画面)を用いて操作します:relaxed:
同じ日本語でも地域によって方言があるように、同じシェルでも様々な種類が存在します。
代表的なものだと、Mac OSで使われているbashやzsh、Cシェル系のtcshなどがあります。

##利用できるシェルを確認する

```sh
$ chsh --list-shells
```

##bashからzshに変更

```sh
$ chsh -s /bin/ｚｓｈ
```

##zshからbashに変更
```sh
$ chsh -s /bin/bash
```
PythonでSalesforce REST APIとやりとりするときのサンプル

注：テスト投稿のため、細かな解説等はありません。

# simple-salesforce
README を読めばおおよその利用方法が書いてありますが、
より詳しく使うには、ソースコードを追っていく必要があります。
https://github.com/simple-salesforce/simple-salesforce

# 認証

あくまで一例なので、組織に応じた認証方式でログインをしてください。
https://github.com/simple-salesforce/simple-salesforce/blob/master/simple_salesforce/login.py#L24

```python

from simple_salesforce import Salesforce

def instance():
    return Salesforce(username=SALESFORCE_USERNAME, password=SALESFORCE_PASSWORD, security_token=SALESFORCE_SECURITY_TOKEN, sandbox=SALESFORCE_IS_SANDBOX)

if __name__ == "__main__":
    sf = instance()
```

# Pandasで適宜データを加工してREST APIをコールする

取引先オブジェクトがPandasのDataFrameとして作成済みで、
ヘッダー行がSalesforceのカラム名で定義済みであるならば、以下のように

```python

import pandas as pd

data = dataframe.to_dict(orient='records')
sf.bulk.Account.insert(data)
```

bulk API経由でコールしたいときは上のように書いてあげると呼び出せます。

PandasのDataFrameをそのまま一気にSalesforceへ投げ込める手軽さがメリットで、
CSV、JSON、別DB、その他ファイルにあるデータを一旦DataFrameで加工してあげるだけで、
データ移行や連携がすぐに組めます。
Mavenが使っているJavaのバージョンを確認する方法

- 環境
    - CentOS Linux release 7.6.1810 (Core)
    - Apache Maven 3.2.5

Mavenのバージョンも確認できるけど、Mavenが使っているJavaのバージョンも確認できる。
開発をしているといくつもバージョン違いのJavaを使っていたりして、MavenがどのJavaを使っているか確認したくなる。

```bash
# 「mvn --version」でもOK
$ mvn -v
...省略...
Java version: 1.6.0_41, vendor: Sun Microsystems Inc.
...省略...
```

参考 : [MavenでJavaのバージョンを設定する](https://www.codeflow.site/ja/article/maven-java-version)
docker の不要な containers と images を一括で削除する

```
 docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N] y
```

or

```
docker ps -a
docker ps -q --filter status=exited
docker ps -a | grep Exited | awk '{print $1}'
docker rm $(docker ps -q --filter status=exited)
docker rmi $(docker images | grep none | awk '{print $3}')
```
jTessBoxEditorで生成したboxファイルの文字を一行ごとにmargeする【Tesseract】

# 概要

jTessBoxEditorで生成したboxファイルにて、文字をマージするのが非常に面倒だったので、作成。
margeして精度が上がるかどうかはよく分からなかったけど、供養のため、記事にしました。

# 条件

以下のファイルを作成します。この中身をjTessBoxEditorにペーストし、tiffファイルおよびboxファイル等を生成します。

```text:text.txt
文字
テスト
プログラミング
mgs
```

# プログラム

本プログラムは、「text.txt」に定義した文字列を一行ずつboxファイル中にて、一行ずつmargeしたboxファイルを再生成する。生成したファイルはtiffファイルと一緒に生成されたboxファイルと置き換えて、jTessBoxEditorにて学習させる際に指定する。

```python:sample.py
import shutil

def read_words(input_file):
    with open(input_file, "r") as f:    
        data = [ t.replace("\n", "") for t in f.readlines()  ]  

def marge_box(input_file, words):
    with open(input_file, "r") as f:    
        data = [ t.replace("\n", "").split(" ") for t in f.readlines()  ]
        
        res = []
        start = 0
        for word in words:
            length = len(word)
            end = start + length
            tmp = data[start:end]
            print("word", word)
            print("start", start)
            print("end", end)
            print("length", length)
            
            a = [t[1] for t in tmp]
            b = [t[2] for t in tmp]
            c = [t[3] for t in tmp]
            d = [t[4] for t in tmp]
            e = [t[5] for t in tmp]
            a = a[0]
            b = min(b)
            c = max(c)
            d = max(d)
            e = e[0]
            print("abcde", [a, b, c, d, e])
            res.append([word, a, b, c, d, e])
            start += length
        
        shutil.copy(input_file, "copy_" + input_file) # 元のファイルはバックアップとしてコピーしておく
    
    with open(input_file, "w", encoding='utf-8') as f:  
        for t in res:
            print(" ".join(t), file=f)

if __name__ == "__main__":
    words = read_words("text.txt")
    marge_box("~~.box", words) # jTessBoxEditorで生成したboxファイルを指定
```
【Node.js】Webpack + Express環境下でのpug(ejsでの可？)導入

#pug導入前環境
Webpack + Express + React + Typescript

#pug導入の理由
導入前はExpressでSSRをし，クライアントからのリクエストに対しres.send(html)で単純にhtmlスクリプトを送信するだけだった．これではデータベースから取得した値をクライアント側に渡すことができない．そのため，テンプレートエンジンであるpug(or ejs)を導入したかった．

#やりたいこと
単純にルートにアクセスされた時にhtmlテンプレートに値を渡してレンダリングしたい．今回やりたいこととしては，レンダリングさえしてくれれば良いので，htmlとしてdistに出力されなくて良い(これをしようとするとWebpackでHtmlWebpackPluginが必要)

```typescript:server.ts
import express from 'express';
const postController = require('./controllers/postController');
const app = express();

app.get('/', postController.doGetPostForSsr);

//静的ファイル
app.use(express.static('dist'))

app.listen(process.env.PORT || 3000, function () {
  console.log('express app is started.');
});
```

```typescript:postController.ts
import express from 'express';
const Posts = require('../models/Posts');
const ssrController = require('./ssrController');

module.exports = {
  doGetPostForSsr: (req: express.Request, res: express.Response) => {
    Posts.getPost().then((result) => {
      const elements = ssrController.ssr(result);
      res.render("html", elements);
    }).catch((err) => {console.log(err);})
  }
}
```


#エラー地獄
ただテンプレートエンジン導入するのに1日かかりました．．．．webpack嫌いになりそうでしたけど，自分の力のなさですね，勉強になりました．
どこでどーゆーエラーが出たってのもストーリー立てて説明すると途方もないので，結論の導入方法だけ記述します．

#pug導入
pug導入にはExpress側とWebpack側それぞれに設定が必要でした．
##Express側pug導入

```typescript:server.ts
import express from 'express';
const postController = require('./controllers/postController');
const app = express();

app.engine('pug', require('pug').__express); //追加
app.set('view engine', 'pug'); //追加

app.get('/', postController.doGetPostForSsr);

//静的ファイル
app.use(express.static('dist'))

app.listen(process.env.PORT || 3000, function () {
  console.log('express app is started.');
});
```
これでExpressがpugを認識できるようになり，読み込んでくれるviewsディレクトリがルート直下に設定される？ぽいです．

##Webpack側pug導入
```
npm install webpack-node-externals --save-dev
```

```js:webpack.server.config.js
const nodeExternals = require('webpack-node-externals');

module.exports = {
  ...
  externals: [nodeExternals()],
  ...
}
```
これがないとよくわかりませんが，buildは問題なく通りますがアクセス時にCannot find module "../lib/utils.js"ってエラーが出るんですよね．これは[【webpack】Cannot find module "../lib/utils.js"](https://qiita.com/tsuuuuu_san/items/e4fda04eef3b347128f1)を参考にしました．

#おわりに
今回の目的はpugコンパイルからのhtmlの出力ではなく，単なるレンダリングでしたので，pug-loaderは使いませんでしたが，いろいろいじっていたところ，htmlの出力をする場合はhtml-webpack-plugin, pug, pug-loader使ってwebpackで設定したらできました．これは調べたらすぐ出てくるのでここに書く必要はないかと．
HTMLもわからない状態から独学を初めて1年と2ヶ月程経つのかな？最初は全てフルスクラッチで記述していたので，最近やっとフレームワークの恩恵とMVCモデルの素晴らしさを理解することができてきました．（最初はサーバーサイドでjs動くってのが衝撃的だったの覚えてますね笑）これからはちょっとはインフラの方も理解できたらなと思います〜．
【プログラミング初心者向け】コマンド一覧表

#✅touch
####ファイルを新規作成するコマンド

`touch ファイル名`
でファイルを新規作成することができる

#✅cat 
####「cat ファイル名」 で、ファイルの中身を閲覧・確認できるコマンド
catはconcatenate(連結する)の略なので、
`cat file1 file2` 
で、ファイルを連結して一覧で閲覧出力することもできる。

　あくまで出力の為、もし保存したい場合はリダイレクト「>」を用いることで、別のファイルに出力内容を記述することも可能。
`$ cat file1 > file2`
で、ファイル内容を上書きすることがすることができる。

　上書きではなく内容を追加したい場合は、リダイレクトの「>>」を用いる。
`$ cat file1 >> file2`


#✅mkdir
####フォルダ(ディレクトリ)を作成するコマンド。
「mkdir = make directory」 の略。

`mkdir フォルダ名`でフォルダを新規に作成できる

#✅pwd
####現在自分がどこのディレクトリにいるか(カレントディレクトリ)を確認できる。
Print Working Directoryの略。

#✅cd
####指定したディレクトリに移動することができる
change directoryの略。
ディレクトリは指定できるが、ファイルを指定することはできないので注意。

`cd　ディレクトリ名`
ただし、これでは子階層には移動できるが、親階層のディレクトリに戻ることはできない。

`cd ..`
で一つ前の階層に戻ることができる。

子階層の深いところまでいきすぎて、一つ一つ戻るのはメンドくさい場合もあるので、そういった場合は、
`cd`のみで実行すれば、ホームディレクトリまで戻ることができる。

#✅ls
####ディレクトリの中身を確認するコマンド
listの略


#✅mv
####指定したディレクトリにファイル(またはディレクトリ)を移動させる
`mv 移動させたいファイルまたはディレクトリ 移動先のディレクトリ`
で、ファイルを移動先ディレクトリの子階層に移動させることが可能。


####既存ファイルやディレクトリの名前変更
`mv ファイル名 新しいファイル名` で新しい名前に変更できる

#✅cp 
####ファイルやディレクトリのコピーを作成する。
ーファイルをコピーしたい場合
`cp コピーするファイル名 新しいファイル名`
で、コピーしたいファイル名と同じ内容の、別名ファイルを作成できる。

ーディレクトリのコピーを作成したい場合は、
`cp -r コピーするディレクトリ名 新しいディレクトリ名`


#✅rm
####ファイルやディレクトリを削除する
removeの略。

ーファイルを削除したい場合
`rm ファイル名`

ーディレクトリを削除したい場合
`rm -r ディレクトリ`
AWS 認定 SysOps アドミニストレーター – アソシエイト 合格しました

#はじめに
前回
https://qiita.com/fjisdahgaiuerua/items/f35a57a7b92db9aa7d70
今日は再入門編を中心に各サービスの概要だけ抑えていきたい。
#学習
##DynamoDB
ハンズオン
https://dev.classmethod.jp/articles/serverless-first-serverlessframework-code/

おさらい
https://dev.classmethod.jp/articles/amazon-dynamodb-comparison-with-rds/


## 試験結果
受かりました。
ただあやふやなサービスが多かった印象を受けましたので、以下に記載
###S3
* リージョン間amiの取り扱い
* バケットポリシーとオブジェクトポリシーの権限回り

###Cfn
* アカウント間かつリージョン間でスタックの参照をしたときの挙動理解
    * 権限やエラー対処の知識

###AWS Orgnization
* サービス制限機能について

###コスト系
* 各AWSアカウントの上に請求用アカウントがあり、子アカウントで予算超過したとき管理者に対して通知をおくる。
    * そんなことができるのか調べます。

###セキュリティ系
* WAFとShieldの違い
* KMSとCHMの違い
* 

#所感
次は課題のプロフェッショナル認定...
とりあえず明日からはプロ模擬試験受けてみてわからないところをハンズオン込みで二週間ほどじっくり復習し、5/6までに受験する流れで行きます。GWは試験場やっているのか確認します。今月の試験料の請求やばい...
[SQL Server] Bulk Insertでデータインポート（フォーマットファイルなし）

## はじめに
運用まわりで定期的に大量レコードをデータインポートしたい場合に使っているが
何気に忘れがちなので備忘録

## やりたいこと
- 大量レコードをデータインポート

## 前提条件
- テーブルの**定義通り**のデータをインポートする
- 任意のカラムのデータだけを入れたい等の場合は、ちょっと工夫が必要なのでまた後日まとめる

## 用意するもの
- インポートしたいデータをcsvで用意しておく
- この時、区切り文字はカンマ区切りでもタブ区切りでもよい
- 個人的にはタブ区切りを好んで使う　--> 住所等にカンマが入っていたりすると厄介なため
- 任意のカラムのデータ等を入れたい場合は、別途フォーマットファイルが必要だけど今回は割愛

## 構文
```sql
Bulk Insert [テーブル名]
From '[データファイルのパス]'
With ([オプション])
```

## サンプル
- ヘッダーをスキップして2レコードめからインポート
- タブ区切り
- 文字コードは```utf-8```
- 改行コードはCRCL 

```sql:サンプルコード
BULK INSERT
    tbl_test
FROM
    'C:\test\sample.tsv' 
WITH (
        FIRSTROW = 2,
        DATAFILETYPE = 'char',
        CODEPAGE = '' 65001 '',　
        FIELDTERMINATOR = '\t',    
        ROWTERMINATOR = '0x0A',
        ERRORFILE = 'C:\test\error\err.txt'
    )
```

## オプション一覧（抜粋）

- ```FIRSTROW```：　ヘッダなしのデータファイルなら```1```
- ```DATAFILETYPE ```：　普通は```CHAR```でよし
- ```CODEPAGE```：　文字コードが```shift-jis```の場合は不要
- ```FIELDTERMINATOR ```：　カンマ区切りなら```','```
- ```ERRORFILE```：　インサート時にエラーが出た場合、これを指定しておくと出力してくれる
- ```FORMATFILE```：　フォーマットファイルのパス
- ```MAXROW```：　許容されるエラーレコード数。これを超えると終了する
- ```ORDER```：　並べ替えのカラムを指定
【PowerShell】配列の要素で同じ文字列をカウントして出力する方法

PowerShellの情報がネット上にあまり落ちておらず、なかなかやりたいことができないので、マイナーなものでも今後メモっていきます。
もっと簡潔にかけるぞ！等のご指摘ありましたらどんどんコメントにお願いします。
##▼ やりたいこと
ファイルの中身で、特定の文字列が何回使われているのか、それぞれ集計して出力したい。

**配列への格納→整形→集計→必要な情報(プロパティ)のみ出力**
上記の流れを簡単に説明します。

```text:URLList.txt
URL1:https://qiita.com/test
URL2:https://qiita.com/test
URL3:https://qiita.com/test2
URL4:https://qiita.com/test2
URL5:https://qiita.com/test2
URL6:https://qiita.com/test3
<関係ない行(抽出したいくない)>
```
雑な例ですが、上記のような文字列からURLの部分だけ抽出し、集計して出力していきます。

##1.特定の文字列を検索して、マッチしていたら行ごと格納させる
```powershell:配列への格納
$URLList = Select-String "URL[0-9]:" ./URLList.txt
```
Seect-Stringの結果が複数存在する場合は自動的に配列で変数に格納されます。
正規表現を使用したい場合は、""(ダブルクォート)で囲って記述します。
##2.配列の中身にある文字列を整形する
```powershell:整形
$formattedURL = $URLList -replace "URL[0-9]:",""
```
-replaceを使用して置換します。置換した結果は変数へ。
##3.集計を行い、必要な情報だけ出力させる
```powershell:集計→出力
$formattedURL | Group-Object | Select-Object Name,Count | Out-File ./result
```
一番のミソ。
`Group-Object`は、受け取ったオブジェクトをグループ化してくれる便利なコマンドです。
要は**「集計したい情報をパイプとかで渡してあげればうまいこと集計してやるぞ！」**的なコマンド。とても便利。
ただ、このままだと出力時の情報が多すぎるため、`Select-Object`でCountとNameプロパティのみ出力させます。
これで完成。
git > アカウント切り替え後 > Permission denied と表示される




アカウント切り替え後に


```
git config user.name
git config user.email

```



1. Open "Keychain Access.app" (You can find it in Spotlight or LaunchPad)

2. Select "All items" in Category

3. Search "git"

4. Delete every old & strange item

5. Try to Push again and it just WORKED



[ssh - Git's famous "ERROR: Permission to .git denied to user" - Stack Overflow](https://stackoverflow.com/questions/5335197/gits-famous-error-permission-to-git-denied-to-user)
safariでtableを含んだ表示が崩れる問題の解消

`display: flex;`を使用時、chromeではうまく表示されたのにsafariで崩れてしまう問題がtableを絡めたときに発生したのでその解放をまとめる。

# 問題
以下のコードのviewの表示が、chromeとsafariで異なっている。
version1は両者とも予想通りの表示（外側のdivの中に、内側の3つのdivが並ぶ）だが、
viesion2のように、内側のdivの1つがtableに置き換わると、safariでtableが外側のdivを超えてしまう。

```demo.html
<!--version 1 -->
<div class="d-flex w-50">
  <div class="bg-danger" style="width: 100px; height: 50px;">
    100px
  </div>
  <div class="bg-primary" style="width: 150px; height: 50px;">
    150px
  </div>
  <div class="bg-warning" style="width: 100%; height: 50px;">
    table無し
  </div>
</div>
<hr>

<!--version 2 -->
<div class="d-flex w-50">
  <div class="bg-danger" style="width: 100px; height: 50px;">
    100px
  </div>
  <div class="bg-primary" style="width: 150px; height: 50px;">
    150px
  </div>
  <table class="bg-warning" style="width: 100%; height: 50px;">
    <tbody>
      <tr>
        <th>
          table th
        </th>
        <td>
          table td
        </td>
      </tr>
    </tbody>
  </table>
</div>
```
- chromeでの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348384/4478a348-0d57-c94d-e4a7-e78df1f632b7.png)

- safariでの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348384/af33289a-c10d-23fa-9264-633f07667331.png)

# 原因
- 描画されているHTML及び、HTMLタグから自動生成されているCSSに、両者に大きな違いは無い。
- よって`display: table;`の扱いが両ブラウザで異なり、chromeは`display: block;`と同じ扱いをされるが、safariでは異なるのだと思われる。
- 参考：tableタグから生成されているCSS（検証モードで確認）

```chrome.css
table {
    display: table;
    border-collapse: separate;
    border-spacing: 2px;
    border-color: grey;
}
```

```safari.css
table {
    display: table;
    border-collapse: separate;
    -webkit-border-horizontal-spacing: 2px;
    -webkit-border-vertical-spacing: 2px;
    border-top-color: gray;
}
```

# 解決策
tableタグをdivで囲うことで、`dispaly: flex;`が当てられたその側のdivの中に、3つのdivが並ぶようにする。

```demo.html
<div class="d-flex w-50">
  <div class="bg-danger" style="width: 100px; height: 50px;">
    100px
  </div>
  <div class="bg-primary" style="width: 150px; height: 50px;">
    150px
  </div>
  <div>
    <table class="bg-warning" style="width: 100%; height: 50px;">
      <tbody>
      <tr>
        <th>
          table th
        </th>
        <td>
          table td
        </td>
      </tr>
      </tbody>
    </table>
  </div>
</div>
```

これでsafariの表示も問題なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348384/b7225b4f-9a0b-2d28-ce73-6b49bd50b63c.png)



==============
僕が創業した株式会社Flamersでは、長期インターン口コミサイトVoilを作っています。
学生の方はぜひ御覧ください！
https://voil-intern.com/