OmniAICreator/Qiita-1.07M huggingface dataset:
macOS: APFSボリュームを作るコマンド

この投稿ではコマンドラインでAPFSボリュームを作る方法を説明します。


# APFS、コンテナ、ボリューム

APFS(Apple File System)はmacOS High Sierraで導入されたファイルシステムです。従来のファイルシステムは、物理ディスクとそれをいくつかの領域に分割する「パーティション」の概念からなるものでした。APFSは物理ディスク、コンテナ、ボリュームの概念からなり、従来のものと異なります。

APFSコンテナはざっくりいうと、パーティションに当たります。APFSでは、このコンテナの中にボリュームがいくつか作れます。ボリュームはコンテナ内でディスク容量を共有できます。

# CLIでAPFSを操作する

APFSは`diskutil`コマンドを使うとCLIで操作できます。

## APFSコンテナの状態を表示する

```
diskutil ap list
```

## APFSボリュームを追加する

```zsh
diskutil ap addVolume ${コンテナ名} APFS ${ボリューム名}
```

### 例: disk1コンテナにMyDataボリュームを追加する

```zsh
diskutil ap addVolume disk1 APFS MyData
```

/Volumes/MyDataが作られます。

## マウントするパスを指定しながらAPFSボリュームを追加する

ディスクユーティリティのアプリのほうからは、APFSボリュームをマウントするパスを指定できず、/Volumesにできあがってしまいますが、`diskutil`を使うと任意のパスにAPFSボリュームをマウントできます。

マウント先は`-mountpoint`オプションで指定します。マウント先指定は実行にroot権限が必要なので`sudo`で実行してください。

```zsh
sudo diskutil ap addVolume ${コンテナ名} APFS ${ボリューム名} -mountpoint ${マウント先のパス}
```

### 例: disk1コンテナにMyDataボリュームを追加する

マウント先となるディレクトリは予め作っておきます:

```zsh
mkdir ~/MyData
```

`-mountpoint`オプションに上で作ったディレクトリのパスを指定しながら実行します:

```zsh
sudo diskutil ap addVolume disk1 APFS test -mountpoint ${HOME}/MyData
```

## 大文字小文字区別のAPFSボリュームを追加する

デフォルトで作られるAPFSボリュームは、ファイル名の大文字小文字を区別しません(case-insensitive)。大文字小文字区別する(case-sensitive)ボリュームを作るには、"Case-sensitive APFS"の指定をします。

```zsh
diskutil ap addVolume ${コンテナ名} "Case-sensitive APFS" ${ボリューム名}
```

### 例: disk1コンテナに大文字小文字区別のボリュームを追加する

```zsh
diskutil ap addVolume disk1 "Case-sensitive APFS" CaseSenstiveVolume

cd /Volumes/CaseSenstiveVolume/
touch a A
ls
# a Aと出力されます
```

## 暗号化されたAPFSボリュームを追加する

暗号化された状態のAPFSボリュームを作るには、`-passprompt`オプションをつけて実行します。

```zsh
diskutil ap addVolume ${コンテナ名} APFS ${ボリューム名} -passprompt
```

実行すると、プロンプトでボリュームのパスワードを何にするか聞いてくるので、設定したいパスワードを入力します。

### 例: disk1コンテナに暗号化されたMyEncryptedDataボリュームを追加する

```zsh
diskutil ap addVolume disk1 APFS MyEncryptedData -passprompt
```
heroku Precompiling assets failed. を解決した方法

#環境について
Rails 6.0.3.4
ruby 2.6.3p62 
heroku/7.47.7
になります

#注意
初心者の記事なのでもっと良い方法があるかもしれません。
もしあればコメントください

#起きた問題
herouにデプロイができなくなった。
git push heroku masterを実行したところ、「Precompiling assets failed.」というエラー、、

```ruby:qiita.rb
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile'
```
#原因探し
Precompileのエラーが出ていると言うのがエラー文で判明した。

####厄介な事が、、、
実はこのherokuのエラーが出ていたのはかなり前。
「また今度やればいいやー」って考えていたツケが回ってきました。
いつ、何をいじった時に現れたエラーなのかわからない。
そのため、修正方法も不明だった。

#解決した方法

###手順1
 git log でコミットハッシュを調べ、そこにgit checkoutで飛ぶ

参考にしたのは以下のサイト
>https://tmytokai.github.io/open-ed/activity/git/text02/page09.html
>https://qiita.com/zetamatta/items/ab1eb6c954b197e53752

###手順2
過去のコミットへ遡ったあと、

`rails assets:precompile `

を使用し、コンパイルができるか確認する。
コンパイルできた場合、手順4へ
コンパイルできなかった場合、手順3へ

###手順3
コンパイルできなかった場合、その時点のコミットより以前でPrecompileエラーが出てるのでさらに過去に戻る。
ある程度時間に幅を持たせて遡った方が時間短縮になるだろう

###手順4
その時点ではprecompileできているので、そのコミットの一つ前のコミットに遡り、そこでprecompileエラーが出ればビンゴです。
そこでエラーが出たと考えられます。

###手順5

`git show`コマンドを使って怪しいやつを見つけてください。
僕の場合、かなり数が多かったので
`git show --name-only`を使用しました。
その結果、package.jsonが怪しかったので、
`git show package.json`を使いました。

すると

``` package.json
-    "@rails/webpacker": "^5.1.1",
+    "@rails/webpacker": "^6.0.0-pre.1",

```
この変更履歴があったため、
`@rails/webpacker": "^5.1.1",`
にダウングレードし、yarn installすると、rails assets:precompileが動作し、
git push heroku masterも動作しました。

#まとめ
herokuにデプロイ時にPrecompiling assets failedエラーが出る
↓
git log でコミットハッシュを調べ、そこにgit checkoutで飛ぶ
↓
遡った時点でrails assets:precompileを行う　（どの時点で起きたエラーか調べ続ける）
↓
git showで怪しい箇所を見つける
↓
（私の場合）
-    "@rails/webpacker": "^5.1.1",にダウングレードで解決

#反省
結局herokuのエラーが出ていたのは2ヶ月前からでした、、、
エラーが出たらその場で解決しないと、後々とんでもないことになると学びました。
Macのホスト名から.localサフィックスを取り除く

## ホスト名を設定すると `.local` が勝手につく現象

シェル変数の `$HOST` などで、そのコンピュータのホスト名を参照できる。
初期設定では `hoge-no-Macbook-Pro.local` といったふうになっているものである。

Macでそのホスト名を変更するには、

```sh
$ sudo hostname hoge
```

とする。

しかしこの方法では、しばらく経つと勝手に `hoge.local` になってしまう。[^1]
代わりに以下のコマンドを利用することで、この現象を防ぐことができた。今のところ `.local` が復活するといったことは確認されていない。

```sh

sudo scutil --set ComputerName hoge
sudo scutil --set HostName hoge
sudo scutil --set LocalHostName hoge
```

## 参考
https://discussions.apple.com/thread/4895017

[^1]: 原因は未調査。
PowershellでIEの表示拡大率を変更する方法


×この方法では変わらない（エラーも出ない）

```powershell
((($objIE.document).body).runtimeStyle).Zoom = "50%"
```

〇この方法で変更できた（三つ目の引数に倍率の数字。一つ目、二つ目は定数）

```powershell
$objIE.ExecWB(63,0,50)
```

ネタ元
・IEの拡大率指定 - shikaku's blog
https://blog.systemjp.net/entry/2014/04/15/140125
【Laravel】フォーム送信時デフォルト値で設定した空文字がnullになってしまう問題

#はじめに
元々Railsメインで開発をしていましたが、最近業務でLaravelを触る機会が増え為、その中で学んだことや気づいたことの備忘録となります！


### やりたかったこと：
ユーザーオブジェクトのカラムは全てnull:falseに指定するが、もしユーザーがニックネームのフォームを入力せずにフォーム送信した場合はデフォルトで空文字を挿入させたい

```php:/database/migrations
$table->string('nick_name')->nullable(false)->default('');
```
そのためのマイグレーションをこうやって書いて、このカラムを指定したフィールドは未入力の状態でからデータを送信！すると、、

### エラー：SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'nick_name' cannot be null (SQL: insert into***
nullはゆるしませんエラー、、、デフォルトで空文字指定したじゃん！なんでnull？


### 原因：Laravel 5.4 で導入されたConvertEmptyStringsToNullミドルウェアの動作
このLaravelのミドルウェア[TrimStrings]と[ConvertEmptyStringsToNull]により、空の文字列フィールドは自動でnullに変換されるのでエラーになる

### 対策：$middlewareプロパティから該当のミドルウェアをコメントアウトする

```php:/app/Http/Kernel.php
protected $middleware = [
        \App\Http\Middleware\TrustHosts::class,
        \App\Http\Middleware\TrustProxies::class,
        \Fruitcake\Cors\HandleCors::class,
        \App\Http\Middleware\PreventRequestsDuringMaintenance::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        //\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    ];
```

以上です！

参考：[https://readouble.com/laravel/5.4/ja/requests.html](https://readouble.com/laravel/5.4/ja/requests.html)
[python] maxから二番目の数字を取得したい

#質問したものが自分で解決できた記念に
https://qiita.com/tokki7127/questions/81c85d541db193105176

### 解決したいこと

相関係数行列の中で（対角線上の値(=1)は除いて）
相関係数の絶対値が最も大きいものを検出したい。　

![スクリーンショット 2021-03-10 21.01.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/3cbf00bb-003d-0988-db90-18ae54dd8f63.png)

期待した結果
mpg             0.579267
cylinders       0.950721
displacement    0.95072
horsepower      0.897257
weight          0.932824
acceleration    0.420289
model_year      0.579267
origin          0.420289
dtype: float64

### 該当するソースコード


```x.py
# ライブラリをインポートする
import pandas as pd
import numpy as np

# 可視化のためのモジュール
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

## URLからファイルのパスを読み取る
path = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'

## URLを渡し変数にデータを格納し、カラム名を指定する
mpg_data = pd.read_csv(path, delim_whitespace=True, header=None,
names = ['mpg', 'cylinders', 'displacement','horsepower','weight', 'acceleration', 'model_year', 'origin', 'name'],
na_values='?')

corr = mpg_data.corr()

```

### 発生している問題・エラー

各行ごとに１.0000の次のデータを抜き出したい

データの形はDF

### 自分で試したこと

```x.py
# ライブラリをインポートする
import pandas as pd
import numpy as np

# 可視化のためのモジュール
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

## URLからファイルのパスを読み取る
path = 'http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data'

## URLを渡し変数にデータを格納し、カラム名を指定する
mpg_data = pd.read_csv(path, delim_whitespace=True, header=None,
names = ['mpg', 'cylinders', 'displacement','horsepower','weight', 'acceleration', 'model_year', 'origin', 'name'],
na_values='?')

corr = mpg_data.corr()

#解決策
corr = corr[corr < corr.max()
corr.max()

```
#解決策
これで相関行列以外も対応できる

```x.py
corr = corr[corr < corr.max()
corr.max()

#結果
mpg             0.580541
cylinders       0.950823
displacement    0.950823
horsepower      0.897257
weight          0.932994
acceleration    0.423329
model_year      0.580541
origin          0.565209
dtype: float64
```

データの形
![スクリーンショット 2021-03-12 12.25.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/373045/66b0cbc2-820e-d542-dae3-97d78c222e0d.png)
Azure 命名規則を設計する

# Azureの各リソースの命名規則を設計する
割と大規模なシステム設計、グランドデザインとかする際に命名規則設計するかと思いますが、これってめんどくさいですよね。ちょっとミスったらあとで詰むし、後々変えずらいし。いろいろ調査してましたが、以下になんと各システムリソース毎にMicrosoft側がベストプラクティスとして命名規則のベストプラクティスを提示している資料がありました。

https://docs.microsoft.com/ja-jp/azure/cloud-adoption-framework/ready/azure-best-practices/resource-naming

いやあマジでMicrosoft側の情報でこういうの増やしてほしいですね。

## Microsoft側の推奨事項
以下の情報はリソース作成時の名前に付与したほうがいいと記載されていました。

・リソースの種類
・事業単位
・アプリケーションまたはサービス名
・サブスクリプションの種類
・デプロイ環境
・リージョン

全部つけると長ったらしくなるからちょっと考えものな気がしますがたとえば、サーバに名前つけるのであれば
vmwin-HRwebapp-pro-001
vmlin-GAMBAdb-dev-002
とかでリソースがvmであることとHRシステムなのかGAMBAというシステムのサーバなのかと本番か開発かわかるような感じにすればいいってことですね。

## 設計例PIP（Microsoft記事にある）
pip-sharepoint-prod-westus-001

pipはリソース名
sharepointはアプリケーション
prodは環境
westusは地域
001はインスタンス

## 実例と所感
実際にサーバ300台以上使っているかなり大規模システムも同じような命名規則で運用している事例知ってます。この命名規則はおすすめです。この設計して詰んだという話は聞かないですしMicrosoftのベストプラクティスに従うのが良いと思います。
【JavaScript学習記録】sortの落とし穴

　JavaScirptでコードを書いている時に、思った通りの挙動をしてくれないことがあります。
　今回は、JavaScriptで注意したいポイントの１つ、"sort"について取り上げます。

　__・.sort( ) ・・・配列の要素を in place でソートします。既定のソート順は昇順で、要素を文字列に変換してから、UTF-16 コード単位の値の並びとして比較します。(MDNより)__
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

　ここで注目したいのは、__”要素を文字列に変換してから・・・”__という表記。
　__"文字列に変換してから並べ替えること"__で、次のような問題が起こります。

```
// 数値の並べ替えをする場合
const data = [3, 10, 1, 20, 22, 2, 15]
console.log(data.sort());
// => [ 1, 10, 15, 2, 20, 22, 3 ]
```
　先頭の１文字目を基準に並べ替えられてしまっています。
　これを解決するには、以下のように比較関数を指定する必要があります。


```

// 比較関数は a > b ならプラス値、a < b ならマイナス値を返す
data.sort((a, b) => a - b)
// => [ 1, 2, 3, 10, 15, 20, 22 ]
```

　今回は、以下の記事を参考にさせて頂きました:relaxed::tulip:
https://secret-garden.hatenablog.com/entry/2017/10/24/191414

　また一つ勉強になりました:sparkles:
【備忘録】Property WrapperとRxSwift

```
@propertyWrapper
struct BehaviorRelayWrapper<T> {
    private let relay: BehaviorRelay<T>
    private let observable: Observable<T>
    init(value: T) {
        relay = BehaviorRelay(value: value)
        observable = relay.asObservable()
    }
    var wrappedValue: Observable<T> {
        observable
    }
    var projectedValue: BehaviorRelay<T> {
        relay
    }
}
```

```
@propertyWrapper
struct PublishRelayWrapper<T> {
    private let relay: PublishRelay<T>
    private let observable: Observable<T>
    init() {
        relay = PublishRelay<T>()
        observable = relay.asObservable()
    }
    var wrappedValue: Observable<T> {
        observable
    }
    var projectedValue: PublishRelay<T> {
        relay
    }
}
```

```
@propertyWrapper
struct AnyObserverWrapper<T> {
    private let relay = PublishRelay<T>()
    private let observer: AnyObserver<T>
    private let observable: Observable<T>
    init() {
        observer = .create(relay)
        observable = relay.asObservable()
    }
    var wrappedValue: AnyObserver<T> {
        observer
    }
    var projectedValue: Observable<T> {
        observable
    }
}
```

RxSwiftでのViewModelの記述をシンプルにすることができる。
参考にさせていただきました。
https://gist.github.com/sgr-ksmt/2cc92d8c7d517e08767fbe296b6da720

※AnyObserverはリンク先のextensionが必要になります
Twistを送るPanel pluginを作る

【[rviz2プラグインの作り方 トップページへ](https://qiita.com/Kotakku/items/d3510c1ca505b4c0aa1e)】

マウス操作でTwistを送るプラグインを作ります
# 実行例
![Screenshot from 2021-03-12 11-41-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207366/87639061-bd5a-a378-4eb9-cc65e42266b6.png)

# ROS1版
こちらのコードをrviz2用に書き直します
[ROS講座74 twistを送るrviz panel pluginを作る](https://qiita.com/srs/items/da3b65ca365644783068)

# 主な変更点
## twist_panel.hpp

https://github.com/Kotakku/sample_rviz_plugins/blob/main/src/twist_panel.hpp


```onInitialize()``` を追加

```.hpp
public:
    TwistPanel(QWidget *parent = nullptr);

    virtual void onInitialize(); // 追加
    virtual void load(const rviz_common::Config &config);
    virtual void save(rviz_common::Config config) const;
```

```NodeHanlde``` が存在しないので```Node```に書き換えます
```Publisher```はtemplateを持たせ得る必要があるので2つ宣言します

```.hpp
protected:
    // The ROS node handle.
    // ros::NodeHandle nh_;
    rclcpp::Node::SharedPtr nh_;

    // The ROS publisher for the command velocity.
    // ros::Publisher twist_publisher_;
    rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr twist_publisher_;
    rclcpp::Publisher<geometry_msgs::msg::TwistStamped>::SharedPtr twist_stamped_publisher_;
```



## twist_panel.cpp

https://github.com/Kotakku/sample_rviz_plugins/blob/main/src/twist_panel.cpp

```Node``` を作成するためにおまじないのようなものを書いています。
今回はコメントアウトしてるコードでもいいんですが、コメントアウトしてるコードを使うと```Publisher```は動作するんですけど```Subscription```と```Service```が動作しなかったのでおまじないを使います。（詳しい方いたら教えていただけるとありがたいです）

```.cpp
void TwistPanel::onInitialize()
{
    nh_ = this->getDisplayContext()->getRosNodeAbstraction().lock()->get_raw_node();
    // nh_ = std::make_shared<rclcpp::Node>("twist_panel", "sample_rviz_plugin");
}
```



```.cpp
        if (twist_publisher_ || twist_stamped_publisher_) //
        {
            float vel_max1 = max1_edit_->text().toFloat();
            float vel_max2 = max2_edit_->text().toFloat();
            float vel_max3 = max3_edit_->text().toFloat();

            auto msg = std::make_shared<geometry_msgs::msg::TwistStamped>(); // 
            msg->header.frame_id = pub_frame_;
            // msg->header.stamp = ros::Time::now();
            msg->header.stamp = nh_->now(); //
```

```.cpp
    // twist_publisher_ = nh_.advertise<geometry_msgs::TwistStamped>(topic_name, 10);
    twist_stamped_publisher_ = nh_->create_publisher<geometry_msgs::msg::TwistStamped>(topic_name, rclcpp::QoS(10));
```
忘れやすいSQL関連のメモ

# Oracle
### 全角又は半角に統一する
```
select
  , 項目名
  , UTL_I18N.TRANSLITERATE(to_single_byte(項目名), 'fwkatakana_hwkatakana') as 半角
  , UTL_I18N.TRANSLITERATE(to_multi_byte(項目名), 'hwkatakana_fwkatakana') as 全角 
from
  テーブル名
```
### 表示件数指定
```
select * from テーブル名 fetch first 100 rows only
```

### 当日日付を8桁の文字列で表示する
```
select TO_CHAR(SYSDATE, 'YYYYMMDD') as today from dual
```

# SQLserver
### 当日日付を8桁の文字列で表示する
```
select SUBSTRING(CONVERT(VARCHAR, GETDATE(), 112),1,8) as today
```

### テーブルを丸ごとコピー
```
select * into コピー先テーブル名 from 参照元テーブル名
```
### データを別テーブルに挿入
```
insert into 挿入先テーブル名 select * from 参照元テーブル名
```

### ピボット
```
CREATE TABLE 成績
(
     名前   varchar(50)
    ,科目   varchar(20)
    ,得点   int
);

INSERT INTO 成績 VALUES ('1号', '英語', 100 ) ;
INSERT INTO 成績 VALUES ('1号', '国語',  90 ) ;
INSERT INTO 成績 VALUES ('1号', '数学',  80 ) ;
INSERT INTO 成績 VALUES ('1号', '理科',  70 ) ;
INSERT INTO 成績 VALUES ('1号', '社会',  60 ) ;
INSERT INTO 成績 VALUES ('2号', '英語',  50 ) ;
INSERT INTO 成績 VALUES ('2号', '国語',  40 ) ;
INSERT INTO 成績 VALUES ('2号', '数学',  30 ) ;
INSERT INTO 成績 VALUES ('2号', '理科',  20 ) ;
INSERT INTO 成績 VALUES ('2号', '社会',  10 ) ;
INSERT INTO 成績 VALUES ('3号', '英語',  20 ) ;
INSERT INTO 成績 VALUES ('3号', '国語',  30 ) ;
INSERT INTO 成績 VALUES ('3号', '数学',  40 ) ;
INSERT INTO 成績 VALUES ('3号', '理科',  50 ) ;
INSERT INTO 成績 VALUES ('3号', '社会',  60 ) ;

SELECT
     名前
    ,英語
    ,国語
    ,数学
    ,理科
    ,社会
FROM
    成績
PIVOT ( SUM( 得点 ) FOR 科目 IN ( 英語, 国語, 数学, 理科,社会)) AS ピボットテーブル
ORDER BY 名前;
```
酔った勢いで、酔ってそうなプログラムを書いた

![スクリーンショット 2021-03-12 11.42.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/217551/d6b65302-43af-4666-928e-7ea02ce3ef42.png)
**これは酔ってる（確信）**


## これは何？
飲み会で「プログラムで感情を表現できるか？」と討論になったので、とりあえず生で酔わせてみました。
そのうち「プログラムで感情を表現できる」気がしてきたぞ。
**オラなんだかワクワクしてきたぞ！！**


## 使ったプログラムのソース

```python
import random


def get_drunk_status():
    drunk = [
        {
            "酔い方": "ほろ酔い",
            "正解率": 0.8,
            "口癖": ["たーのしー！", "あっはっはっははは。"],
            "口癖率": 0.9,
        },
        {
            "酔い方": "酩酊期",
            "正解率": 0.4,
            "口癖": ["えーっと。", "んーと。"],
            "口癖率": 0.8,
        },
        {
            "酔い方": "昏睡期",
            "正解率": 0.05,
            "口癖": [".....", "んー。"],
            "口癖率": 0.95,
        }
    ]
    return drunk[random.choice(drunk)]


def get_ans(accuracy_rate):
    ans_acc = "2！"
    ans_fal = ["田んぼの田！", "...zzzzzz", "古！", "1！", "3！", "10！", "100！"]

    if random.random() < accuracy_rate:
        return ans_acc
    else:
        return random.choice(ans_fal)


def say_sometime_fav_phrase(fav_phrase, say_rate):
    if random.random() < say_rate:
        print(random.choice(fav_phrase), end='')


def drunk_add():
    print("Q. 1+1は？")

    drunk_status = get_drunk_status()
    say_sometime_fav_phrase(drunk_status['口癖'], drunk_status['口癖率'])
    print(get_ans(drunk_status['正解率']))


if __name__=="__main__":
    drunk_add()
```
GitとGithubの連携

#環境

- VirtualBox v6.1.14
- Vagrant v2.2.14
- Ubuntu v12.04.5

macOS Catalina 10.15.7のMacbook Airに仮想環境を用意して、Ubuntuを動かしているという状況です。

#GitとGithubの連携

毎回どうやるのか忘れてしまうので、自分用のメモのためにも書いておこうと思います。

###公開鍵と秘密鍵を作成する

Gitがインストールされたのを確認したら、まずSSHの公開鍵と秘密鍵を作成します。

```
ssh-keygen
```

をUbuntuのコンソールに入力すると、以下が得られます。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa): 
```

作成するファイル名を聞かれていますが、デフォルトで良いのでそのままEnterキーを押します。
すると、

```
Enter passphrase (empty for no passphrase): 
```

と出て、鍵を利用するためのパスワード設定を求められるので、入力してEnterキーを押します。この際、入力しても画面に出ないのでちゃんとできてるか不安になりますが、できてます。

```
Enter same passphrase again: 
```

もう一度同じパスワードを入力します。これらがうまくいけば

```
The key fingerprint is:
The key's randomart image is:
```

に続いて、フィンガープリント（鍵を簡略化したもの）と鍵を表すアスキーアートで表現された画像情報が表示され、公開鍵と秘密鍵が完成します。

鍵は「~/.ssh」の中に保存されています。下記コマンドで確認しましょう。

```
ls ~/.ssh
```

その結果、次のように表示されます。

```
authorized_keys  id_rsa  id_rsa.pub  known_hosts
```

これと多少違うものが表示されても大した問題ではないと思います。（多分、id_rsa.pubが大事です）

###公開鍵をGithubに登録する

では、いよいよ作成した鍵をGithubに登録しましょう。次のようにコマンドを入力して公開鍵情報をコンソールに表示させます。

```
cat ~/.ssh/id_rsa.pub
```

すると、ssh-rsaから始まる、大量のアルファベットの列（以下、公開鍵情報列、と呼びます。僕が呼んでいるだけで正式名称ではないです。）が表示されると思います。これが公開鍵情報です。

では、Githubを開いてログインします。ページの右上の自分のアイコンをクリックしてメニューを開き、Settingsを選択します。

左側の[SSH and GPG keys]という項目を選択し、[New SSH keys]ボタンをクリックします。

[Title]のテキストフィールドには公開鍵情報列の末尾の「~~@~~~」を入力します。僕の場合は「vagrant@precise32」でした。

[Key]のテキストフィールドには、先ほど表示した公開鍵情報列をコピペで入力します。

ここまで入力したら[Add SSH key]を入力して完了です。

これで、GithubとマシンがSSHを利用した暗号化通信をできるようになりました。Githubアカウントにメールアドレスを登録してると、それ宛てにメールが来ると思います。

#最後に

最後まで呼んでいただいてありがとうございます。

はじめて書く記事なので書式に問題があったり、記述がわかりにくいところがあるかもしれません。コメントなどで教えていただけると助かります。

また、初心者なので内容に間違いがあるかもしれません。それも教えていただけると嬉しいです。
python初心者の自分のためのメモ

プログラミングにおいて今のところよく使うワードは算術演算子だと気づいたので
ここにまとめてメモがわりにします。
``x + y : 加算 　 (5 + 2 #7)
x – y : 差算 　(5 - 2 #3)
x * y : 乗算 　(5 * 2 #10)
x / y : 除算 　(5 / 2 #2.5)
x % y : xをyで割った余り（剰余算) 　(5 % 2 #1)
x ** y : xのy乗　　(5 ** 2 #25)
x // y : 切り捨て除算 　(5 // 2 #2)
``

またメモが必要になったら記事を書いていきます。
初学者のみなさん、一緒に勉強がんばりましょう。
[Rails] ヘルパーメソッドって素敵

#書くこと
Railsのhelperディレクトリって、何のためにあるの？と言う疑問に答えます。

##環境
Ruby 6.0.3.4
Ruby on Rails 2.6.5

#結論
Ruby on Railsには、ヘルパーメソッドなるものが存在します。
そのヘルパーメソッドを、自作してerbファイルで用いることができるようにするためのディレクトリです。

##ヘルパーメソッドとは？
まずは、ヘルパーメソッドとは何かということを先に述べていきたいと思います。

[こちら](https://www.sejuku.net/blog/28563)の記事からの引用を用いて説明します。

>ある動作を処理する場合にメソッド化して扱えるようにRailsにあらかじめ組み込まれた機能です。

Railsに標準搭載されているヘルパーメソッドには、

- form_with
- link_to
- image_tag

などがあります。これらは以下の例のように、htmlの文法の中でrubyの文法が用いられる`erb拡張子`の中で利用されます。

```index.html.erb
<%= form_with url: root_path do |f| %>
  <% f.label :name %>
  <% f.text_area :name %>
<% end %>

<%= link_to "トップページへ", root_path %>
```

このように、ヘルパーメソッドを用いる時は、`<%%>`のなかに記述することで、ヘルパーメソッドが利用できるようになります。

以上のコードは、以下のような形で、rubyのpost機能を持った状態で、以下のように表示されます。

![スクリーンショット 2021-03-12 午前10.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948673/22537c13-8493-bdb2-9a06-b5d85ae41a11.png)

ここまでで、ヘルパーメソッドが何かということは何となく理解してもらえたでしょうか。
それでは次に、本題であるRailsのディレクトリに存在する`helpers`は何のためにあるのかということを、見ていきます。

##ヘルパーメソッドは自作できる！
このタイトル通り、今まで見てきたヘルパーメソッドは自作することが可能です。
その**自作したヘルパーメソッドを保存するファイルをまとめている**のが、helpersディレクトリということになります。

ここからは、実際にソースコードを見ながら確認していきましょう。

###下準備

まず、helpersの中のファイルは、コントローラー生成時に自動生成されます。

今回は、記事管理を担当するarticlesコントローラーを元に話を進めます。

```
rails g controller articles
```

こうすると、生成されるファイルの中に

```
create    app/helpers/articles_helper.rb
```

があるのを確認できると思います。

このファイルを、コードエディターで見てみると、

```articles_helper.rb
module ArticlesHelper
end
```

と、moduleだけがあるファイルを確認できるかと思います。

また、何でもいいので一つerbファイルを作成しましょう。
今回は、`views/articles/index.html.erb`という風にファイルを生成し、話を進めていきます。

###ヘルパーメソッドを作成
それでは、結論で述べたように、ヘルパーメソッドを作成してみます。


```articles_helper.rb
module ArticlesHelper
  def title_name(author, title)
    "#{title} by #{author}"
  end
end
```

こんな風に、記事のタイトルと作者をまとめて表示するメソッドを作成します。

ここで作成したメソッドを、実際に表示してみます。

```views/articles/index.html.erb
<%= title_name("齋藤", "ヘルパーメソッドとは")%>
```

結果は以下の通りです。

![スクリーンショット 2021-03-12 午前10.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/948673/c5ae9459-3d8d-afd6-cc0d-213747a12dd1.png)

このように、引数に代入した文字通りに出力されました。

以上のことから、二つのことがわかります。

- ヘルパーメソッドと言ってもrubyのメソッド作成文法がわかっていれば、難なく作成できる
- ヘルパーメソッドは、railsのビューに影響を与えるもの。具体的には、rubyの文法を用いて機能を追加できる。

##入力された文字列をURL判定させる。（おまけ）
今回のヘルパーメソッドを用いると、入力させたurlの要素が入った文字列を表示するときに、urlであると認識させることが可能になります。

```application_helper.rb
module ApplicationHelper
  require 'uri'

  def text_url_to_link(text)
    URI.extract(text, %w[http https]).uniq.each do |url|
      sub_text = ''
      sub_text << '<a href=' << url << ' target="_blank">' << url << '</a>'

      text.gsub!(url, sub_text)
    end

    text
  end
end

```

このソースコードは、[こちら](https://freesworder.net/rails-link-a/)の記事から転用となりますが、簡単にまとめると「httpとhttpsが文字列の中にあったら、aタグつけてリンク化するわ！」という機能を持つメソッドです。

やはり、ビューでメソッドを利用できることは、可能性がいろいろ広がりますね。

##最後に
最後まで読んでいただき、ありがとうございます。
ソースコード、記事の書き方について「もっとこうしたほうがいいよ！」というご意見、「そこどうなっているの？」というご質問など、お待ちしております。



##参考文献
- [【Rails入門】helperの使い方まとめ](https://www.sejuku.net/blog/28563)
- [【Rails開発メモ】URLテキストにaタグリンクを自動でつける方法](https://freesworder.net/rails-link-a/)
VueでGoogleマップを使用しているコンポーネントを分離し、子コンポーネントでマップオブジェクトをpromiseで受け取る

## 記事について

Vueでgoogleマップを使用していると、コンポーネントがどんどん大きくなってくるので分けてみた。

* 参考ページの[Qiita - Vue.jsでライブラリ使わずにgoogle mapを利用する](https://qiita.com/terrierscript/items/9a9dda5a5ca5b3293d48)を見ると、provide,injectを使用して綺麗にコンポーネントを分けているが、元々の実装都合でうまく導入できなかった。これから実装を開始する場合などは上記参考ページを確認して欲しい
* Vue.jsが公式で出しているコードを利用するも、コールバックでの実装で使い勝手がイマイチだった。

なので、ここではpromiseを利用してマップオブジェクトを受け取る実装を説明する

## 親コンポーネント



```parent.js

Vue.component ('google-map-parent', {
    data: function() {
        return {
            map: null
        };
    },
    mounted: function() {
        this.map = new google.maps.Map(this.$el, {
            center: { lat: 0, lng: 0 },
            zoom: 1
        });
    },
    methods: {
        getMap: function() {
            var vm = this;
            return new Promise(function(resolve, reject) {
                function checkForMap() {
                    if (vm.map) {
                        resolve(vm.map);
                    } else {
                        setTimeout(checkForMap, 50);
                    }
                }
                checkForMap();
            });
        },
    }
    provide : function (){
        return {
            getMap: this.getMap
        }
    },
```

## 子コンポーネント

``` child.js
Vue.component('google-map-child', {
    data: function() {
        return {
            map: null
        };
    },
    inject: ["getMap"],
    created: function() {
        this.getMap().then((res_map) =>{
            this.map = res_map;
        });
    }
```

## 参考

* [公式:親コンポーネントインスタンスへのアクセス](https://jp.vuejs.org/v2/guide/components-edge-cases.html#%E8%A6%AA%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%82%A4%E3%83%B3%E3%82%B9%E3%82%BF%E3%83%B3%E3%82%B9%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9)
* [公式からのリンク：コードによる説明](https://codesandbox.io/s/github/vuejs/vuejs.org/tree/master/src/v2/examples/vue-20-accessing-parent-component-instance?file=/index.html:1310-1581)
* [公式・依存性の注入](https://jp.vuejs.org/v2/guide/components-edge-cases.html#%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5)
* [Qiita - Vue.jsでライブラリ使わずにgoogle mapを利用する](https://qiita.com/terrierscript/items/9a9dda5a5ca5b3293d48)
【Rails】SQLやメソッドの実行結果やモデルの中身を確認する方法（Docokerで起動しているプロジェクト）

Dockerコンテナ上のRailsプロジェクトで、モデルの中身やメソッドの実行結果を確認する方法について。

Ruby on Railsでコードを記述したり、デバッグするときに必須の処理。

##1. dockerコンテナに入る

```
$ docker exec -it <サービス名> bash
root@a953a1f61822:/app#
```

Dockerではなくローカルで直接起動しているプロジェクトであれば、次のコマンドから実施。

##2. railsコンソール（irb）を起動する

```
# rails c

`Redis#exists(key)` will return an Integer by default in redis-rb 4.3. The option to explicitly disable this behaviour via `Redis.exists_returns_integer` will be removed in 5.0. You should use `exists?` instead.
Loading development environment (Rails 6.0.3.2)
irb(main):001:0> 
```


##3. モデルの確認
モデル名を入力すれば、そのモデルが存在するか確認できる。

```
irb(main):007:0> Article
=> Article (call 'Article.connection' to establish a connection)
```

##4. メソッド実行結果の確認
実行したい処理を入力すると、実行したSQLと実行結果が表示される。

```
#id=11の記事データを取得
irb(main):016:0> Article.find(11)

D, [2021-03-12T01:49:40.433380 #764] DEBUG -- :   Article Load (0.8ms)  SELECT "articles".* FROM "articles" WHERE "articles"."id" = 11 LIMIT 1
=> #<Article id: 11, medium_id: 26, active: true, published_at: "2019-12-12 07:06:23", refreshed_at: "2019-12-12 07:06:23", created_at: "2019-12-12 07:06:09", updated_at: "2020-03-30 09:03:59", article_draft_id: 7, name: "サンプル記事", article_layout_id: nil, article_route_id: nil, tag_slugs: ["technology"], refreshed_user_id: nil, resource_uids: nil, article_drafts_count: 1, category_tag_slugs: nil>
```

<br>
改行がなくわかりにくいが、findメソッドで実行されたSQLと実行結果の２つのパートに分けられる。

```:SQL
SELECT "articles".* FROM "articles" WHERE "articles"."id" = 11 LIMIT 1
```

```:実行結果
#<Article id: 11, medium_id: 26, active: true, published_at: "2019-12-12 07:06:23", refreshed_at: "2019-12-12 07:06:23", created_at: "2019-12-12 07:06:09", updated_at: "2020-03-30 09:03:59", article_draft_id: 7, name: "サンプル記事", article_layout_id: nil, article_route_id: nil, tag_slugs: ["technology"], refreshed_user_id: nil, resource_uids: nil, article_drafts_count: 1, category_tag_slugs: nil>
```


<br>
###個別データの取得
コンソール上で、変数に代入してプロパティ名を指定して値を取得することもできる。

```
#代入（処理結果は省略）
irb(main):019:0> article = Article.find(11)

#値を取得
irb(main):020:0> article.name
=> "サンプル記事"
```


<br>
##5. railsコンソールから抜ける
これまでのコンソール上の処理内容をすべてクリアしたい場合や、コンソールを終了したい場合は、`exit`

```
irb(main):021:0> exit
root@a953a1f61822:/app#
```

##6. Dockerコンテナから抜ける
こちらも同じく`exit`

```
root@a953a1f61822:/app# exit
exit

$
```



<br>
##（補足）デバッグ時のコード記述
コンソールではなくブラウザで実行結果を確認する場合は、リクエストで受け取る処理はコメントアウトして、デバッグ用の変数と値を用意しておくと便利。

```rb:  
# id = params[:id]
# name = params[:name]

#デバッグ用
id = 3
name = 'サンプル名'
```
UE4のレプリケーション設定のNet Cull Distance SquaredとAlways Relevantの効果を確認してみる


ActorのReplicationの設定にあるNet Cull Distance SquaredとAlways Relevantの効果を実際に確認してみたので内容を記録しておきます。
UE4.26.1で試しています。

![capRepDistance.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/d003d9de-a4bd-6571-b145-9ac2946b946f.png)

# 試してみたこと

## プロジェクト作成からプレイまで

* Blankプロジェクトを作成する
* Config/DefaultEngine.iniに以下のような設定をいれる
 * この設定をいれないとNet Cull Distance Squaredは効果がなかった
 * [アクタの関連性とプライオリティ
](https://docs.unrealengine.com/ja/InteractiveExperiences/Networking/Actors/Relevancy/index.html)にある「AGameNetworkManager が距離に基いた関連性を使用するように設定されている場合」にあたると思う

```
[/Script/Engine.GameNetworkManager]
bUseDistanceBasedRelevancy=true
```

* Actorを作成してReplicationの設定を以下のようにする
 * Net Load on Client：チェック
 * Replicates：チェック
 * Net Cull Distance Squared：10000.0
 * ※ 100.0の2乗の値で100.0 UU(Unreal Units、デフォルト1UU=1cm)
* 上記のActorをLevelにSpawnするようにする
* Editor上で以下の設定でPlayする
 * New Editor Window(PIE)
 * Number Of Players：2
 * Net Mode：Play As Listen Server

## プレイ結果

![cldqx-vu3m9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/3c35ccff-a07a-2dbf-0ba1-fb35e10bd5c0.gif)

* サーバーでは常にActorは存在
* クライアントではNet Cull Distance Squaredで指定した距離離れて時間がたつとActorはDestroyされる
* クライアントで再びNet Cull Distance Squaredの範囲内に入るとActorが生成される
* Always Relevantにチェックをいれるとクライアントでも常にActorは存在
* レベルに配置したActorはクライアントでも常に存在する、動的にSpawnしたActorのみ生成、破棄が行われる
デプロイしていたRailsアプリケーションでThe change you wanted was rejected.が出た

ご覧いただきありがとうございます。
この記事は[こちら](https://hnnsk.hatenablog.com/entry/2021/06/26/114334)へ移動致しました。
お手数おかけしますが、よろしくお願いいたします。
Lazyloadの影響でmatchHeight.jsがうまく機能しない時

##やりたいこと
画像遅延の「Lazy Load」を使いつつ、
jQueryプラグイン「matchHeight.js」で横並びにした要素の高さを揃えたい。

##問題点
「Lazy Load」の影響で、揃えたい要素（画像を内包）の高さが0と判定される。

##解決策
画像の読み込みが完了してから、matchHeight.jsで高さを揃えるようにする。

```js:
$(window).on('load resize',function(){
  var target_img = $('.target img');
  target_img.on('load', function() {
    $('.target').matchHeight();
  });
});
```
EC2起動時にdockerを起動する

# やりたいこと
EC2起動時にjupyter notebookが入っているdocker-composeを起動したい！

# 自動起動シェルの作成
docker-composeを起動したいディレクトリに移動してから`docker-compose -d`を実行するshellを書く。
`dirname $0`を書いておくと、cdして実行場所を変更できる。

```/opt/dockerrun.sh
#!/bin/bash
cd `dirname $0`
cd /home/ubuntu/dockerrun
docker-compose up -d
```

自動起動するために、`rc.local`を編集

```
ubuntu@ip-172-31-37-7:~$ cat /etc/rc.local 
#!/bin/bash
# Additional configuration for Amazon EFA
/opt/amazon/efa/bin/efa_hugepages.sh
/opt/dockerrun.sh
exit 0
```
RTP traffic trouble shooting ideas 

# RTP: Capturing Ideas

#### ngrep
ngrepはtcpdumpのように動作するコマンドで、各種プロトコルの通信をモニタリングしてキーワードに該当するデータだけを表示するといったことができる。

- タイムスタンプを付加したファイルで保存する
- 600秒のみでキャプチャを停止する
- NICを指定する・あるいはしない
- SIP(port 5060 or 5061)をキャプチャする

```
NIC=
FILTER=
FILENAME=/var/tmp/$(hostname)_sipdump_$(date +%Y%m%d_%H%M).pcap
timeout 600 ngrep -qtWbyline -d ${NIC:-any} -O ${FILENAME} "${FILTER:-.}" "port 5060||5061"
```
## RTP header だけをキャプチャする：

```
NIC=
FILTER=
FILENAME=/var/tmp/$(hostname)_RTPdump_$(date +%Y%m%d_%H%M).pcap
tcpdump -s 68 -i ${NIC:-any} -W 1000 -C 10 -w "${FILENAME}" "(port 5060) or (udp[1] & 1 != 1 && udp[3] & 1 != 1 && udp[8] & 0x80 == 0x80 && length < 250)" &
```

options:

-W 

## RTP stream 全体をキャプチャする：
#### tcpdump
- port 22 を除外する

```
NIC=
FILENAME=/var/tmp/$(hostname)_alldump_$(date +%Y%m%d_%H%M).pcap
tcpdump -nvi ${NIC:-any} -w ${FILENAME} "not port 22"
```

## Analizing
PHP try{}catch, throw, Exceptionの考え方（基本）

#例外処理についての基本

例）

```php

function d($x,$y){
    if($y ==0){
        throw new Exception('０では割れない');
    }
    return $x/$y;
}

try{
    echo d(8,3)."\n";
    echo d(5,0)."\n";
    echo d(4,2)."\n";
}catch(Exception $e){
    echo $e->getMessage();
}

結果
/*
2.6666666666667
０では割れない
*/

```

上記の通り```echo d(4,2)```の処理は2番目の```echo d(5,0)```にて第二引数に0があり関数内の例外処理に引っ掛かる為
throwで定義される例外処理が働きtry文の処理がcatch(){}へ移動する。

**個人的に最初echo(4,2)の処理も行われると思っていたが、どうやら違う様子。**
この部分を覚える為の備忘録。
fish v3.2.0 で空エンター入力で fish_preexec / fish_postexec が反応しなくなってしまったのをどうにかする

### この投稿で使用しているOS、fishのバージョン

* macOS Big Sur 11.1 / macOS Catalina 10.15 / Ubuntu 20.04
* fish shell v3.2.0

### 困ったこと

fish 3.1.xで以下のように、空エンターを入力するとカレントディレクトリがgitリポジトリである場合は `git status` を実行するような設定をしていて快適に動作していました。

```shell:.config.fish
# コマンド実行前のイベントにフックする
function done_enter --on-event fish_postexec
    # コマンドに入力された文字数が 0文字=空エンター なら
    if test -z "$argv"
        # カレントディレクトリがgitリポジトリなら git status を実行する
        if git rev-parse --is-inside-work-tree > /dev/null 2>&1
            echo
            echo (set_color yellow)"--- git status ---"(set_color normal)
            git status -sb
        end
    end
end
```

ですが、fish 3.2.0 から `fish_preexec`/`fish_postexec` が 空エンターでは実行されなくなってしまいました。

https://github.com/fish-shell/fish-shell/pull/7085#issuecomment-640135842

実際にヘルプでも説明しています。

```shell
$ function -h
· fish_preexec, which is emitted right before executing an interactive command. The commandline is passed as the first parameter. Not emitted if command is empty.
· fish_postexec, which is emitted right after executing an interactive command. The commandline is passed as the first parameter. Not emitted if command is empty.
```

**Not emitted if command is empty.**

v3.2.0でも、空エンター時に処理を実行する方法がないか調べました。


### 対処

`Ctrl+m`に処理をキーバインドするとエンター押下時にも実行されるため、これでどうにかします。

(なぜ `Ctrl+m` がエンターとして扱われるのかよくわかっていない・・・)

```shell:.config.fish
function fish_user_key_bindings
    bind \cm done_enter # Ctrl+m にキーバインドするとエンターにも反応する
end

function done_enter
    # 現在の入力文字数が0文字なら
    if test -z (commandline)
        echo
        # カレントディレクトリがgitリポジトリなら git status を実行する
        if git rev-parse --is-inside-work-tree > /dev/null 2>&1
            echo
            echo (set_color yellow)"--- git status ---"(set_color normal)
            git status -sb
        end
    else
        # 何か入力されているなら現在の入力を実行する
        # eval (commandline) だとヒストリーに残らない
        commandline -f execute
    end
    # 入力をクリアする
    commandline -f repaint
end
```

とりあえずこれで今まで通り動作しています！
Vueでローカルストレージをwatchする

## Vueでローカルストレージのwatchはできない

結論を先に述べると、ローカルストレージはリアクティブでないので、Vueのwatchですることはできない。
この記事では代替案を記載する

## 代替案：storageのチェンジイベントをaddEventListenerに登録する

```
    mounted: function() {
        this.ls_event_handle = window.addEventListener('storage', this.eventMethod);
    },
    methods: {
        eventMethod: function(event) {
            let new_val = event.newValue;
            let old_val = event.oldValue;
            switch (event.key) {
                case LOCALSTORAGEKEY1 :
                    console.log(new_val);
                    break;

                case LOCALSTORAGEKEY2 :
                    console.log(old_val);
                    break;

                default:
                    console.log(event.key):
                    break;
                default :
                    break;
            }
        }
    },
    destroyed: function() {
        window.removeEventListener(this.ls_event_handle);
    },
```

## 代替案：vue-lsを使用する

※ 未検討であるため、リンクのみ記載

[vue-ls](https://www.npmjs.com/package/vue-ls)


## 参考

* [stackcoverflow: Is there any way to 'watch' for localstorage in Vuejs?](https://stackoverflow.com/questions/42974170/is-there-any-way-to-watch-for-localstorage-in-vuejs)
Elasticsearchの設定色々メモ



## Elasticsearch設定などのリクエスト

```sh
# my_indexはindex

# 全件検索
curl  -H 'Content-Type:application/json' -XPOST 'localhost:9200/my_index/_search'

# 全件削除
curl  -H 'Content-Type:application/json' -XPOST 'localhost:9200/my_index/_delete_by_query' -d '{"query":{"match_all":{}}}'

# ESの状態表示
curl 'localhost:9200/_cat/indices?v'

# indexの削除
curl  -H 'Content-Type:application/json' -XPUT 'localhost:9200/my_index/_mapping' -d @tests/local_es/mapping.json

# index作成
curl  -H 'Content-Type:application/json' -XPUT 'localhost:9200/my_index'

# analyzerを登録 (indexを作成と同じことをやるので、すでに存在しているインデックスがあるとプットできない)
curl -H "Content-type:application/json" -XPUT 'localhost:9200/my_index' -d @tests/local_es/analyzer/my_kuromoji_analyzer.json

# mapping(スキーマ)の確認
curl -H 'Content-Type:application/json' -XGET 'localhost:9200/my_index_mapping'
## memo 実際のcasesの方はcontentなどにanalyzerキーで my_kuromoji_analyzerというのがついていたがローカルでは使えなかったので、mapping.jsonからは消してある

# mapping(スキーマの流し込み)
curl -H 'Content-Type:application/json' -XPUT 'localhost:9200/my_index/_mapping' -d @tests/local_es/mapping.json

# エイリアスの設定方法
curl -H 'Content-Type:application/json' -XPOST 'localhost:9200/_aliases' -d '{"actions":[{"add":{"index":"my_index", "alias":"my_alias"}}]}

# 複数流し込む(prettyは応答を改行して表示)
curl -H 'Content-Type:application/json' -XPUT 'localhost:9200/_bulk' --data-binary '@tests/local_es/test_input.json' -o /dev/null

```

## 参考


[エイリアスの設定](https://medium.com/hello-elasticsearch/elasticsearch-c8c9c711f40)
[Elasticsearch 日本語で全文検索 その２](https://medium.com/hello-elasticsearch/elasticsearch-833a0704e44b)
[Analyzerの設定](https://tech-blog.rakus.co.jp/entry/20191002/elasticsearch)
[Elasticsearchへの日本語データ投入と検索の方法（初級）](https://qiita.com/kenichiro-yamato/items/44df960a4b179d0ec17b)
[Elasticsearchの確認系コマンド６つ](https://blog.kozakana.net/2019/10/elasticsearch-confirmation-commands/)
Lambdaの実行結果をS3にアップロードする

## 記事について

* 基本的なLambdaの設定などについては省略し、S3にアップロードする点についてのみ説明

## 環境
* AWS Lambda
* Serverless Framework standalone (
    * Framework Core: 2.11.1 (standalone)
    * Plugin: 4.1.2
    * SDK: 2.3.2
    * Components: 3.3.0

## Serverless.ymlにS3アクセスの設定を追加する

```
provider:
  iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:PutObject
      Resource: "arn:aws:s3:::<your-bucket>/*"
  environment:
    S3_BUCKET: <your-bucket>
```

## 実行ハンドラ

```
import boto3
import os
import json


def handler(event, context):
    s3 = boto3.resource('s3')

    key = 'test.json'
    obj = s3.Object(os.environ['S3_BUCKET'], key)
    json_dict = {'test': 'test'}
    r = obj.put(Body=json.dumps(json_dict))
```
秘密鍵の権限をミスると@マークの群れに襲われる

### ssh接続しようとしたら怒られた

* 今日も元気にぬるりとssh接続するーと思った矢先……

```zsh
$ ssh hoge

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0755 for '/Users/hikaru/.ssh/keys/hoge.key' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/hikaru/.ssh/keys/hoge.key": bad permissions
ec2-user@13.231.153.118: Permission denied (publickey).
```
### @マークが多すぎる
* 群衆恐怖症の自分にとっては二度と見たくない表示
* 内容を読んで見ると要するに

> 君のprivate key は権限が弱すぎるよ！　まったく馬鹿げてる！

とのこと。権限を確認してみる。

```zsh
$ ls -l
.rw-r--r-- 1.7k hikaru staff 2021-03-11 11:12 hoge.key
```

* なるほど……秘密鍵というのはその重要性・秘匿性から権限を限定し、安全性を担保しないといけないらしい。
* スマホにロックを掛けておかないとあなたの伴侶に覗かれてしまうのと同じか（たぶん違う）

### 権限を限定してみる

* 上記の例だと、権限的にユーザー以外の人間にも読まれてしまう可能性がある（書き込み・実行は元々不可)
* ユーザーのみ、読み込みができるようにする。

```zsh
$ chmod 400 hoge.key
```

### いざssh接続

```zsh
Last login: Thu Mar 11 11:09:22 2021 from

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

```
* うまくいった！


### 実を言うと他の箇所でもハマっていた

* あたかも上記の対処法で万事解決したという風になっていますが、それでもエラーが出てしまいました
 
```zsh
Connection closed by XXX
```
* 接続を試みてくれたはいいものの、なぜか弾かれているようでした……
* いろいろ調べてみると、`userの指定を間違えているのではないか？`という結論に至りました
* いつもはAWSのインスタンスに`ec2-user`としてssh接続していたのですが、今回接続したいインスタンスはAmazon LinuxではなくUbuntuだったので、デフォルトのユーザー名が違ったのでした

config (修正前)

```
 Host hoge
 HostName  X.XXX.XXX.XXX
 Port 22
 User ec2-user
 IdentityFile ~/.ssh/keys/hoge.key
```

config (修正後)

```
 Host hoge
 HostName  X.XXX.XXX.XXX
 Port 22
 User ubuntu
 IdentityFile ~/.ssh/keys/hoge.key
```

* これで無事、接続できるようになりました！　やったね！
ノートパソコンで現在使用中のアプリをボタン一つで把握する【C#】

# 動機

これまで同様、今回も C# で Windows10 用の便利ボタンを作成していきます。

今度はノートパソコンで現在起動中のアプリをボタン一つで把握する機能を作成していきたいと思います。

ちなみに、今回も作成に関しては WpfApp で作成をしました。

> 参考 1：[ノートパソコンの画面の明るさをボタン一つで変更する【C#】](https://qiita.com/kewpie134134/items/d81461aab1ab1b9a26af)
> 参考 2：[ノートパソコンの画面の音量をボタン一つで変更する【C#】](https://qiita.com/kewpie134134/items/22acfa606071fbc22018#mainwindowxamlcs)
> 参考 3：[ノートパソコンの画面のバッテリー状況をボタン一つで取得する【C#】](https://qiita.com/kewpie134134/items/744d52aea14662732c6c)
> 参考 4：[ノートパソコンの画面の通信料状況をボタン一つで取得する【C#】](https://qiita.com/kewpie134134/items/8b1f7e709a1483b84cf0)

# イメージ画像

もはやそっけない UI とは呼べません。。。単にボタンを配置しただけです。

![アプリ情報.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/058df334-d507-fbe7-3112-d98894cc0c57.png)

ただ、こちらを選択すると現在起動中のアプリが表示されるようになります。

![アプリ表示結果.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407150/f54ac92d-34f8-f986-b59b-b4f0a4c2362c.png)

# ソース

## MainWindow.xaml

```MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="270,149,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>

    </Grid>
</Window>
```

## MainWindow.xaml

```MainWindow.xaml.cs
using System.Diagnostics;
using System.Windows;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(showAppTitleList());
        }

        public string showAppTitleList()
        {
            string lists = "";
            foreach (Process p in Process.GetProcesses())
            {
                // プロセス名(string)
                //p.ProcessName
                if (p.MainWindowTitle != "")
                {
                    // タイトル名(string)
                    lists += p.MainWindowTitle + "\n";
                }
            }
            return lists;
        }
    }
}
```

# おわりに

起動中のアプリを、ボタン一つで表示できるようになりました。

これでまた一つ Windows10 便利化計画に一歩近づいた（？）気がします。
Pandas で作ったSeries データにメソッドを使ってみる no.3

![見出しを追加 (17).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/d07f0d0f-adfa-4130-6f18-b71a0821627e.png)

こんにちは、まゆみです。

今回の記事では、Pandas のSeries に加工したデータに対してmethod (メソッド)をどのようにして使うのか？という疑問にお答えします。

よく使いそうなmethod を例に取りながら解説していきますね。


こちらの記事はPandasライブラリーについて書いた<font color="Red">第3回目の記事</font>ですので、

>Pandas のSeries ってなんだ？っていう人や

>Method (メソッド) とAttribute (アトリビュート)ってどう違うのか？

って感じる人は第1回・第2回目の記事を参考にしてみてください。

>[PandasのSeriesについて](https://qiita.com/Mayumi_Pythonista/items/a252edf67ac6ab517f15)
>[method とattribute の説明](https://qiita.com/Mayumi_Pythonista/items/7095aaf962c5eff07a86)

上記の記事になります。

#Method (メソッド) とは？

Method (メソッド) とは、計算などによってオブジェクトの中身を変えたり、手を加えたりすることができるものです。

##よく使いそうなmethod 

例えば、気温のデータに対しては

>最高気温　max()

>最低気温　min()

>平均気温　mean()

などを用いることが多いでしょう

max() , min() はピンとくると思いますが、<font color="Red">mean() は平均を表す</font>ことがピンとこない人も多いと思います。(averageが平均っていうのは分かりやすいけど)

正確には、mean と　average は意味が違うようですが。。。

とにかくpandas ライブラリ―で使うmean() メソッドは

<font color="Red">全要素を足して要素数で割った値を返してくれます</font>ので、そのような意味で使いたい人はmean() を使ってください。(そもそもPandas ライブラリーには　average() メソッドはありません。)

ではさっそく、使い方を見ていきましょう


##Method()を実際に使う
![スクリーンショット 2021-03-12 090531.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/620edde4-889a-09f1-b762-398b63cc41cd.jpeg)


>①Pandas ライブラリーをインポートする

>②1週間分の気温のデータをリストに入れPandas のSeries データにして、temp　という変数に代入(データは私が勝手につくりました<(_ _)>)

>③最高気温を取り出す

>④最低気温を取り出す

>⑤平均気温を計算する

![スクリーンショット 2021-03-12 090531.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/98d0d3a2-a41b-b3a9-873a-43c3b7c8951c.jpeg)

##辞書型データで作ったSeries データにmethod()を使ってみる

上記の気温のデータに関しては、『0　12 , 1  15』と数字のインデックスを付けるのではなく、

```
"sun" :12,
"mon" :15,
```

と辞書型データにして、

<font color="Red">key を曜日</font>
<font color="Red">value をその曜日の気温</font>

にした方が良いかも知れませんね。

リスト型データでも辞書型データからもSeries を作ることはできるので、辞書型データで同じことをやってみました



![スクリーンショット 2021-03-12 092632.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7c82e411-c3a7-3808-71e7-b12286976994.jpeg)

#まとめ

今回の記事はこれくらいで終わりにしますね。

Pandasライブラリーを使ってSeries にしたデータに

```
(Seriesのデータ).method()
```
としてコードを書けば、色んな種類のmethodを使うことができます

今回解説したmethod は3つだけですが、数えきれないくらいのmethodがPandas ライブラリーにはありますので、是非色々と試してみてください。

Pandas ライブラリーのドキュメントは[こちらから](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.html)どうぞ

※下にスクロールしていくと　Method と書いた項目があります。
そこから下がPandas ライブラリーで使えるmethod になります


![スクリーンショット 2021-03-12 094010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/c179fa48-d508-f84c-fc4d-a72834c89518.jpeg)
form_with内にbutton_toを入れるとmethodが変わる

####【ページ内リンク】
[０．環境](#０環境)
[１．事象](#１事象)
[２．解決策](#２解決策)
&emsp;[①button_toをform_withの外に出す](#button_toをform_withの外に出す)
&emsp;[②button_toをlink_toに変える](#button_toをlink_toに変える)

#０．環境
・AWS
・Rails 5.2.4.5
・ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
・MySQL 5.7.31

#１．事象
下記において、**更新**ボタンを押したら`@team`が**削除**された！
**削除**ボタンを押しても勿論**削除**される

```erb:solution1.html.erb
<%= form_with model: @team do |f| %>            
  <%= f.text_field :name %>
  <%= f.submit "更新" %>
  <%= button_to "削除", team_path(key: @team.id), method: :delete %>
<% end %>
```

[ページ内リンクへ戻る](#ページ内リンク)

#２．解決策
##①button_toをform_withの外に出す
```erb:solution2.html.erb
<%= form_with model: @team do |f| %>            
  <%= f.text_field :name %>
  <%= f.submit "更新" %>
<% end %>
<%= button_to "削除", team_path(key: @team.id), method: :delete %>
```

[ページ内リンクへ戻る](#ページ内リンク)

##②button_toをlink_toに変える
```erb:example.html.erb
<%= form_with model: @team do |f| %>            
  <%= f.text_field :name %>
  <%= f.submit "更新" %>
  <%= link_to "削除", team_path(key: @team.id), method: :delete %>
<% end %>
```

[ページ内リンクへ戻る](#ページ内リンク)
Laravelでバリデーションチェックのテストを行う

個人的な備忘録です


バリデーションチェックの条件を記入するためのファイルを作成する

```
$ php artisan make:request ファイル名
```

テストファイルを作成する

```
$ php artisan make:test ファイル名
```

## requestファイルにバリデーション項目を記載する

```php

public function rules()
    {
        return [
            'name' => 'required|string|max:255',
            'email' => 'required|email|max:255',
            'password' => 'required|string|max:255'
        ];
    }
```

## テストを記述する

```php:バリデーションテスト

/**
 * @dataProvider formDataExample
*/

public function testValidation($items, $data, $expect)
    {
        // バリデーションチェックが正常に行われているかどうかのテスト
        $dataList = array_combine($items, $data);

        $request = new PostUserRequest();

        $validator = Validator::make($dataList, $request->rules());
        $result = $validator->passes();

        $this->assertEquals($expect, $result);
    }

public function formDataExample()
    {
        return [
            'OK' => [
                ['name', 'email', 'password'],
                ['hoge', 'hoge@example.com', 'hogehoge'], 
                true
            ],
            'メールアドレスの形式出ない場合NG' => [
                ['name', 'email', 'password'],
                ['hoge', 'aaa', 'hogehoge'],
                false
            ],
            '文字数制限NG' => [
                ['name', 'email', 'password'],
                [str_repeat('a', 256), 'aaa', 'hogehoge'],
                false
            ]
        ];
    }
```

### 上記のテストの解説
- `array_combine`は２つの配列から連想配列を出力するPHPが用意している関数、これをValidatorに渡し、`request`で記述した`rule()`と照らし合わせている
- `$validator->passes();`でテストの結果をbooleanで取得
- `$this->assertEquals($expect, $result)`で期待している結果と実際の結果を比較している
WSL2 Kali Linuxインストール


備忘録

Microsoft StoreからKali Linuxをインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/ddd5ab5e-13be-a267-6120-ef36d093fc7a.png)


wslを実行する。ユーザー名パスワードは任意のものを設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/e79634ca-d63f-480e-0afc-10163d6ae893.png)



初回実行コマンド

```
sudo apt update
sudo apt upgrade
sudo apt -y install build-essential
sudo apt install -y kali-linux-default
```

NWはvEthernet(WSL)内

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/019097a6-787d-d61c-a507-8a1fd7ad486d.png)


KaliとVirtualBox（metasploitable2)との接続
※metasploitableでルーティングを設定しても上手く通信できなかったので

VirtualBox側のNW設定をブリッジアダプターにして
vEthenetを選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/7c15c224-aef1-a656-2d26-20deaafeaa88.png)


metasploitable2側のNW設定を書き換え
/etc/network/interface

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/578c1c75-fbb1-56ec-4569-4312e1a39010.png)


kaliからmetasploitにてexploit成功　※なぜかvsftpのexploitでは、payloadsが選択できない・・・

使用したexploitは

```
use exploit/unix/misc/distcc_exec
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184018/ad9f6b82-84ae-16de-3955-9b3b0b04370f.png)
Herokuデプロイ時のメンテナンスモードの設定と設定解除方法

Herokuにデプロイ時に、Heroku上でマイグレーションを実行するまでの間は一時的にアクセスできない状態（エラーページ）になるので、あらかじめHerokuのメンテナンスモードをONにするのが一般的だそうです<a href="https://railstutorial.jp/chapters/advanced_login?version=6.0#sec-advanced_login_conclusion">(Railsチュートリアル9章参照)</a>

<h2>Herokuのメンテナンスモード設定方法</h2>
下記のコードでHeroku上でメンテナンスモードを設定できます。

```
heroku maintenance:on
```

Heroku上のアプリにアクセスするとメンテナンス画面が表示されるようになりました。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/4f447027-f8f3-d92e-0966-b68443251cab.jpeg)


<h2>Herokuのメンテナンスモード設定解除方法</h2>
下記コードでメンテナンスモードの設定を解除ができます。

```
heroku maintenance:off
```

Heroku上のアプリにアクセスするとアプリケーションが表示されるようになりました。
![キャプチャ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/942cccab-b424-b810-6528-af48da90e368.jpeg)

<h2>参考</h2>
<a href="https://railstutorial.jp/chapters/advanced_login?version=6.0#sec-advanced_login_conclusion">Railsチュートリアル9章</a>
PHP strcmp()使い方

#第一引数の文字が第二引数の文字と比べどの位置にあるか

ドキュメントには
https://www.php.net/manual/ja/function.strcmp.php
```strcmp — バイナリセーフな文字列比較```
```この比較は大文字小文字を区別することに注意してください。```
```返り値 
str1 が str2 よりも小さければ < 0 を、str1が str2よりも大きければ > 0 を、 等しければ 0 を返します。```

とある

例）

```php

echo strcmp("a", "b"); //-1
echo strcmp("a", "c"); //-2
echo strcmp("c", "a"); //2
echo strcmp("あ", "a"); //130
echo strcmp("x51", "x52"); //-1
```


上記の結果を得られる。