OmniAICreator/Qiita-1.07M huggingface dataset:
[RHEL8] MariaDB10.4インストール途中に競合エラーが発生してインストールできない

#環境
- RHEL8(AWS EC2)

#内容
RHEL8(AWS EC2)でMariaDBをyumインストールすると現状MariaDB10.3がインストールされる。

これにMariaDB10.4のバージョンをインストールしたいと思い、[MariaDBリポジトリ生成ページ](https://downloads.mariadb.org/mariadb/repositories/)より生成したリポジトリを用いてインストールしようとしたところ、以下のような競合エラーが発生してインストールできない。

```console
エラー: トランザクションの確認時にエラー:
  ファイル /usr/bin/msql2mysql は mariadb-3:10.3.11-2.module+el8+2885+7b8bb354.x86_64 と MariaDB-client-10.4.7-1.el8.x86_64 のインストールで競合しています。
  ファイル /usr/bin/mysql は mariadb-3:10.3.11-2.module+el8+2885+7b8bb354.x86_64 と MariaDB-client-10.4.7-1.el8.x86_64 のインストールで競合しています。
  :
  :
```

#原因
MariaDB10.3をインストールするときに使用するrhel-8-appstream-rhui-rpmsリポジトリと競合していたため発生。これを無効化することでMariaDB10.4をインストールできた。

#インストール作業の流れ
はじめに、MariaDB10.3がインストールされている場合はアンインストールしておく。

##リポジトリ生成
リポジトリ生成手順は以下のとおり（画像参照）
1. Choose a Distro → RedHat
2. Choose a Release → Red Hat EL 8(x86_64)
3. Choose a Version → 10.4[Stable]
![screencapture-downloads-mariadb-org-mariadb-repositories.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483889/fe6229dd-cd2c-f025-a3c4-005584e9255b.jpeg)

##MariaDB.repo作成
リポジトリ生成ページに表示されたテキストをコピペして**/etc/yum.repos.d/MariaDB.repo**を作成。

##インストール
リポジトリ生成ページの記述通りにMariaDBをインストールしようとすると「一致するリポジトリーがありません: rhel-8-for-x86_64-appstream-beta-rpms」と表示されて、件のエラーが発生するので注意。
ここで競合を起こしているリポジトリは**rhel-8-appstream-rhui-rpms**なのでこちらを無効化する。[^1]

[^1]: 今回RHEL8環境の作業のため、無効化するリポジトリを本題の通り指定しましたが、環境によってMariaDBインストール時に使用するリポジトリは異なるようです。補足参考。

```console
$ sudo dnf install boost-program-options
$ sudo yum --disablerepo=rhel-8-appstream-rhui-rpms install MariaDB-server MariaDB-client
```

##インストール確認
無事にインストールできたか確認。

```console
$ mysql -V
mysql  Ver 15.1 Distrib 10.4.7-MariaDB, for Linux (x86_64) using readline 5.1
```

#参考
- [MariaDB - Setting up MariaDB Repositories - MariaDB](https://downloads.mariadb.org/mariadb/repositories/)

#補足（19.08.30追記）
自身の環境でMariaDBに使用されるリポジトリを調べる際は

```console
$ sudo yum info mariadb
```
として、競合しそうなリポジトリ名を調べる。
なお、現在有効になっているリポジトリ一覧を表示する際は

```console
$ sudo yum repolist
```
とする。
今更ながらLinuxのsystemctlコマンドで使うやつをまとめ

今更ながらserviceコマンドとの違いも含めてまとめ

## サービスの一覧
3種類ある。ふだん使うのはlist-unit-filesか。

| コマンド | 用途 |
|:-----------------|------------------:|
| `systemctl list-units` | 管理しているサービスユニットの状態一覧。 |
| `systemctl list-sockets` | 管理しているサービスのソケット一覧　|
| `systemctl list-unit-files` | 管理しているサービスのファイル一覧　|

## 開始・停止の基本

| コマンド | 用途 |
|:-----------------|------------------:|
| `systemctl start [target]` | サービス開始 |
| `systemctl stop [target]` | サービス停止　|
| `systemctl reload [target]` | サービス設定リロード |
| `systemctl restart [target]` | サービス再起動 |

## 開始・停止の拡張

| コマンド | 用途 |
|:-----------------|------------------:|
| `systemctl try-restart [target]` | サービスの再起動を試みる。 |
| `systemctl reload-or-restart [target]` | サービスの設定リロードを試みてうまくいかなかったら再起動する。　|
| `systemctl reload-or-try-restart [target]` | サービスの設定リロードを試みてうまくいかなかったら再起動する。 |
| `systemctl kill [target]` | サービスkill |

## サービスに追加・削除・確認

| コマンド | 用途 |
|:-----------------|------------------:|
| `systemctl enable [target]` | サービス有効化。 |
| `systemctl disable [target]` | サービス無効化。　|
統計初心者のつまずいた用語集

### Rにおける　偏差　分散　標本分散　不偏分散
var()は分散を求めるための関数
これはRにおいて標本分散を求めるためではなく不偏分散を求めるためのものである

#### 標本分散
標本分散とはs^2であらわされる
howto 平均値とここのデータの差の2乗の平均を求めることによって表される
つまり　偏差の二乗和をデータ数で割ったもの
＊varp()とおくと
varp <- function(x){
	標本分散 <- var(x)*(length(x)-1)/length(x)
	標本分散
}

#### 不偏分散

howto 偏差の二乗和を（データ数-1)で割ったもの
＊var()であらわす

#### 標準偏差
howto 分散の平方根で求められる
散布度の指標として最も多く用いられる
論文などでは平均とともに標準偏差が示される
＊sd()であらわされるがこれは不偏分散を用いた標準偏差であるため標本分散を用いた値とは異なることに注意しなくてはならない


#### 共分散
howto 2変数x,yを設定すると
{(x1-x平均)(y1-y平均)+(x2-x平均)(y2-y平均)+・・・・・・・・・・+(xn-x平均)(yn-y平均)}/ｎ

＊cov()であらわされるが、不偏共分散であることに注意する。つまり割るときに(データ数-1)を用いている

＊Rにおける式
例１　共分散1と2 <- sum ((変数x-mean(変数ｘ))*(変数y-mean(変数y)))/length(変数x)
例２　共分散1と2 <- mean((変数x-mean(変数x))*(変数y-mean(変数y)))
例3　共分散1と2 <- cov(変数x,変数y)*(length(変数x)-1)/length(変数x)

共分散は単位に依存することに注意する。そこで標準化を行うことにより単位の影響を受けない相関の指標、すなわち相関係数を用いる。

#### 相関係数
howto

cov(変数x,変数y)/(sd(変数x)*sd(変数y))
cor(変数x,変数y)

であらわされる。ここまでは標本分散か不偏分散のどちらを使うかによって値が変わったが、分母と分子で標準偏差の分母が相殺されるので気にしなくて大丈夫。


#### 標本分布

標本分布とは標本統計量(標本平均、標本分散など)に関する確率分布のことである。
無作為抽出標本に含まれるここのデータは確率変数であるので、どうように標本統計量も確率変数である。

標本分布は標本統計量がどのような値をとりやすいか、どの値をとりにくいかを確率を用いて表したもの。

標本分布は母集団分布、標本統計量の種類、サンプルサイズが決まると理論的に導かれる値である。

#### 標準誤差

標準誤差は推定量の標本分布の標準偏差として定義する。
【Shopify】productのループ処理で個数制限を突破する方法

# はじめに
Liquidのfor文で全商品を処理したいのにループが途中で終わる…なんてことがあり、
調べても英語ばかりで分かりにくかったので備忘録も兼ねて解決方法を書いていきます。

# 普通にループを回してみる
Liquidタグで全商品を取得して処理するコードは以下のようになるかと思います。

```liquid
{% for product in collections.all.products %}
・・・
{% endfor %}
```

開発用サイトでテスト用にちょこっと商品を入れているだけだと気づきにくいのですが、
これだけだと `product` は最大で50個しか取れません。

全商品数が500個だとしてもループは50回しか回りません。
加えて厄介なのが、検証のために

```javascript
<script>
  console.log("{{ collections.all.products.size }}");
</script>
```
と書いて実行してもコンソールには`500`と表示されるため、デバッグすると余計に訳が分からなくなります。


# 原因
実はShopifyはデフォルトで「layout内で取得するproductは1ページ50個まで」という制限があり、
Layout内の全ての商品ループにその制限が効いてしまっているのです。

上で書いたfor文は実際には以下のような動きになっています。

```liquid
{% paginate collections.all.products by 50 %} <!-- Shopifyデフォルトの個数制限 -->
  {% for product in collections.all.products %}
  ・・・
  {% endfor %}
{% endpaginate %}
```

# 制限を突破する
`{%- paginate -%}`タグで1ページの商品数を上書きしてやります。

```Liquid
{% paginate collections.all.products by 1000 %}
  {% for product in collections.all.products %}
   ・・・
  {% endfor %}
{% endpaginate %}
```
ページネーションしない場合でも、for文で50個以上の商品を処理するときには`{%- paginate -%}`タグで1ページあたりの商品数を書き変える必要があります。
ややこしいですね。


# 参考
https://community.shopify.com/c/Shopify-Design/50-Product-limit-on-collections/td-p/204693
https://community.shopify.com/c/Shopify-Design/Liquid-loop-stops-at-50-even-though-there-are-114-items-in-the/m-p/50573
iPhoneの電源が入らなくてストアに行ったけど修理不可で無駄足に終わった話

https://qiita.com/a-nishimura/items/b1a00deb8c04d0b05b2f
こちらの記事の続きです。
iPhoneの電源がつかなくなって自分でできることは試した結果
Apple Storeの店舗に予約して持ち込みました。

すると、
基本的にはストアの店員さんも強制再起動の手順でやってみるだけでこちらでできることと大差はありませんでした。

ただ一つ違ったのは、
店舗のPCで端末をケーブルでつなぎ、

- 電圧チェッカーのようなものをかませて通電チェック
- 内製の動作テストツールのようなアプリを起動して端末検証
ということを行っていただきました

### テストの結果

「デバイスの電源が入りません」

・・
・

「不合格」

と表示されました。


不合格って…！！！


※端末落下も水没もさせていないのです。
普通にyoutube見ている時にブツッとアプリが落ちて電源も落ちたのです。

と、この状況になったらストアの店員さん曰く

- 基盤がやられている可能性
- 充電のコネクタ部分の接触周りがやられている可能性
などが考えられるがこれ以上は調査できないとのこと。

そしてApple側では修理することもできないそうです。

### 端末交換は
端末交換をするしかないと。

ひとまず見積もりだけ聞いた

「Apple Careは加入されておりませんので62,400円になります」

・・
・

６万って…！！！

新型iphone出るまで１ヶ月くらいなのに今の時期にiPhoneXの交換で６万円を出す気にはなれません。

ということで完全に諦めました。
そそくさと退店しましたとさ。（Google Pixel3にでもしようかな…と心に思いつつ）


### 気をつけたいこと
ということで、サポートに加入していなかった私が悪いですし今後の糧とするには

- あくまでハードウェアなので端末の使用環境・状況により急に壊れる可能性がゼロではないことは意識しておく
- 壊れた時のリスクヘッジとしてApple Careは必要なら加入しておく（それでも私は加入しないが）
- バックアップはしっかりとっておきましょう！

高い勉強代になりました。
まあ新型iPhone買わないといけなくなったので後押しになったので良しとしましょう。


PS：どなたか一時的に使える中古の安いiPhone買える良いお店のおすすめあったら教えてください
scaffoldの使い方

# scaffoldとは
モデルやコントローラー、ビューを作っていき、さらに必要なルーティングを作成していく必要があるがrailsには簡単にアプリケーションの雛形を作ってくれる機能があり、それがscaffoldです。scaffoldを使うことで素早くrailsアプリケーションを作ることができる。

# 作成手順

```
rails new sample
```
作成後、該当ディレクトリへ移動する

```
cd sample
```
移動後に下記コマンドを実行

```
rails generate scaffold モデル名 カラム名1:データ型1 カラム名2:データ型 2 …
```

```ruby:example

rails g scaffold user name:string age:integer
```
####指定できる型一覧
- string : 文字列
- text : 長い文字列
- integer : 整数
- float : 浮動小数
- decimal : 精度の高い小数
- datetime : 日時
- timestamp : タイムスタンプ
- time : 時間
- date : 日付
- binary : バイナリデータ
- boolean : Boolean

#### 作成されるもの
- マイグレーションファイル 
    - db/migrate/xxxxxxxxx_create_users.rb
- モデル
    - app/models/user.rb
- コントローラー
    - app/controllers/users_controller.rb
- ルーティング
    - config/routes.rb
- ビュー
    - app/views/users/index.html.erb
    - app/views/users/edit.html.erb
    - app/views/users/show.html.erb
    - app/views/users/new.html.erb
    - app/views/users/_form.html.erb
     
routes.rbでは7つのアクションが自動的に定義される。

####rake db:migrate
テーブルの作成

# 以上
【VSCode】言語ごとにインデント幅、タブとスペースどちらを使うか設定する

# 動作確認環境

- Windows 10 Version 1903
- Visual Studio Code 1.37.1

# 参考文献

[[VisualStudio Code] 言語によってインデント幅を変更する](https://blog.katsubemakito.net/vscode/change-indent-width-by-language#VSCode)

# やること

Java, Ruby, C#, Python, JavaScriptのインデント幅をそれぞれ設定する。

# 手順

今回はWindowsなので、```Ctrl+Shift+P```でコマンドパレットを開きます。
```Preferences: Configure Language Specific Settings```を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/6e38eab2-65b9-57d7-3280-7f751bde9a5b.png)
そして、設定したい言語を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233011/9cac696e-bff4-20c5-a042-cabc34731c98.png)

例として、今回はjavaを選択します。
すると、```setting.json```に下記の内容が設定されます。

```json
    "[java]": {
        
    }
```

ここに、インデント幅と、タブとスペースどちらを使うかを設定します。
例はJavaなので、インデント幅はスペース4個、タブをスペースに変換します。

```json
    "[java]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true
    },
```

上の手順を繰り返して、他の言語も設定していきます。

```json
    "[ruby]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[java]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true
    },
    "[csharp]": {
        "editor.tabSize": 4,
        "editor.insertSpaces": true
    },
    "[python]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    },
    "[javascript]": {
        "editor.tabSize": 2,
        "editor.insertSpaces": true
    }
```

# 最後に（雑談）

MacでVSCode + Google日本語入力のサジェストが入力文字列とかぶる問題。
どうにかしてほしい。
Laradock のPHP バージョンアップしてみる。


LaradockでのデフォルトのPHP バージョンは、7.2
なので、7.3へアップしてみる。


```text:.env
PHP_VERSION=7.3
```


ビルドしてみる。

```
$ docker-compose build php-fpm
$ docker-compose build workspace
```

停止してからの起動

```
$ docker-compose down
$ docker-compose up -d nginx mysql workspace
```

PHP バージョン確認

```
$ docker-compose exec --user=laradock workspace bash

laradock@12d8642175cc:/var/www$ php -v
PHP 7.3.8-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Aug  7 2019 09:51:47) ( NTS )
Copyright (c) 1997-2018 The PHP Group

```
Githubで共同研究の方（他人）のリポジトリを触ってみる

#  1.Githubとは
ここを参照
[超新人プログラマー(見習)が参考にしたWEBサイト〜Git・Github編〜](https://qiita.com/petadimensionlab/items/14af9ef7c3260e02c103)

# 2.リポジトリ共有
共同研究、共同作業に。

いろいろググってみたので、備忘録として記載します。

# 3.HowTo
###1.背景
自分
・すでにGithubのアカウントがあり、使い方もまあまあわかる。

相手
・Githubで共同研究のデータやファイルを管理・共有をお願いしたいとの事。


###2.ブランチを作成する（相手側）
ブランチについてはこちらを参照
[【Git入門】ブランチ(branch)とは？メリットや使い方を解説！](https://www.sejuku.net/blog/71071)

```terminal:command
$ cd (ローカルのgithubのリポジトリ)
$ git branch (ブランチ名) #ブランチ作成
$ git checkout (ブランチ名) #ブランチへ移動
$ git add .
$ git commit -m "add new branch　とかなんとか記入"
$ git push origin (ブランチ名) #pushする
```

※Github（ブラウザ）ではこんな感じで作れます。
ブランチを作りたいリポジトリ画面へ
①「Branch:master」をクリック
②お好みの名前を入力
③「Create branch:◯◯◯」をクリックして作成
<img width="1136" alt="スクリーンショット 2019-08-22 14.04.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241094/8e721d66-35d9-26b1-bd26-6c0487e81bcc.png">

###3.フォークしたいリポジトリをフォークする（自分側）
Github（ブラウザ）から相手側のリポジトリ画面へ行き、「Fork」をクリックする。
<img width="1169" alt="スクリーンショット 2019-08-27 14.15.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241094/31d0a6ff-3569-4da0-043e-14adf7b658ae.png">

###4.Forkしてできたリポジトリをクローンする（自分側）
自分のGithubにForkしたリポジトリができてます。
それをクローンします。

`$ git clone -b (ブランチ名) https://github.com/（自分側のリポジトリ名）`

###5.自由に触る（自分側）
クローンしたリポジトリ内を変更・追加したり、自由に進めていく・・・

```terminal:command
$ cd （githubのリポジトリ）
$ nano test.txt （いろいろ変更・・・）
```

###5.pushする（自分側）
納得できるものが完成したら、pushしよう。

```terminal:command
$ git add .
$ git commit -m "change new branch　とかなんとか記入"
$ git push origin (ブランチ名)
```

###6.pull リクエストをする（自分側から相手側へ）
Github（ブラウザ）より。

pushしたリポジトリの「ブランチ」へ移動
（※リポジトリの”ブランチ”の内容が変更されているのを確認してから・・・）
→「New pull request」をクリック。

<img width="1100" alt="スクリーンショット 2019-08-27 16.40.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241094/d2166ea2-2e6a-c5fb-1eeb-3d029d52759f.png">

コメントを適当に記入して「Create pull request」をクリック。
あとは相手側の反応を待つのみ・・・

<img width="1060" alt="スクリーンショット 2019-08-27 16.54.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241094/00b1757a-c2d5-7011-7c0b-2965577ac8c0.png">

###7.pull request　をマージする（相手側）
特に問題なければマージしてくれます。

相手側は・・・
Githubリポジトリへ移動し、「pull requests①」を確認する。
※”6.pull リクエストをする（自分側から相手側へ）”の例によれば「testブランチにプッシュ」というNew pull request を確認することができます。
詳細を確認し、問題なければ、「Merge pull request」をクリックして完了！

# おわり
参考URL:https://git-manual.net/github-flow-common-share/
【ReactNative】native_modules.gradle line 191でハマった話

# 概要
新任者の端末内に研修用の簡単なReactNativeのプロジェクトを作った時にハマった話。

# 発生経緯
デスクトップに「新任研修」というフォルダを作り、既に他端末で動作確認済みのReactNativeプロジェクトをまるっとコピー。
念のため動作確認のためrun-androidさせてみる

```terminal
react-native run-android
```

すると下記のエラーが発生

```terminal
/Users/lukaskurucz/Git/app-name/node_modules/@react-native-community/cli-platform-android/native_modules.gradle' line: 191
```

なんじゃこりゃ。native_modules.gradleなんて見たこともないモジュールがエラーを吐いている。

ゴミが残ってるのかもと、一度クリーンしてみる。

```terminal
cd android && gradlew clean
```

が、そもそもcleanが同じエラーで通らない。

# 原因
仕方がないのでnative_modules.gradleとやらを見てみることにする。
どうやら下記の行あたりでエラーが出ているようだ。

```native_modules.gradle
def json = new JsonSlurper().parseText(reactNativeConfigOutput)
this.packageName = json["project"]["android"]["packageName"]
```

これだけ見ていても訳が分からないので、とりあえずJSONにパースする前のreactNativeConfigOutputをログに吐かせてみる。

```native_modules.gradle
// reactNativeConfigOutputをログに書き出し
this.logger.info(reactNativeConfigOutput)
def json = new JsonSlurper().parseText(reactNativeConfigOutput)
this.packageName = json["project"]["android"]["packageName"]
```

するとreactNativeConfigOutputが見事に文字化けしているではないか！！
しかも化けているのはプロジェクトのパス部分。

あ、そういえばさっき・・・
>
デスクトップに「新任研修」というフォルダを作り...

絶対それが原因だ！！
と思い、試しに「新任研修」を「work」にリネームしてみると問題なく動作するようになった。

パスに日本語を含めるという初歩的なミスでしたとさ。
Vimで改行コードとインデントを無視して差分を拾う



# diffoptを設定する

```vim
// 現在のdiffoptを確認
:set diffopt
diffopt=internal,filler

// 改行コードとインデントを無視する設定を追加
:set diffopt+=iwhiteall

// 追加できたか確認
:set diffopt
diffopt=internal,filler,iwhiteall
```
その他のオプションは```:help 'diffopt'```から確認できます。
pandasで爆発

pandasがバージョンアップして0.25になってました。新機能は何かしらんと思って調べると利便性が高そうな機能が[explode](https://pandas.pydata.org/pandas-docs/version/0.25/reference/api/pandas.DataFrame.explode.html)。

使う場面としてはセルの中にカンマやパイプ区切りでデータが入っている場合。

df = 下記のdataframeでC列を値毎に分けたいもの。

| A | B | C |
|:-----------|:------------|:------------|
| a1 | b1 | c11,c12,c13,c14 |
| a2 | b2 | c21,c22,c23 |
| a3 | b3 | c31,c32,c34,c387 |


のような形。

    !pip install pandas==0.25
    df = pd.DataFrame([{'A':'a1','B':'b1','C':'c11,c12,c13,c14'},
                      {'A':'a2','B':'b2','C':'c21,c22,c23'},
                      {'A':'a3','B':'b3','C':'c31,c32,c34,c387'}])


0.24だと

    df_temp = pd.DataFrame(df['C'].str.split(',',expand=True).stack())
    pd.merge(df.reset_index(),df_temp.reset_index(),left_on='index', right_on='level_0').set_index('index').drop(columns=['C','level_0','level_1'])

としないといけなかったけど、

0.25なら

    df.assign(C=df['C'].str.split(',')).explode('C')

とやればＯＫ。便利！！
0.24でもっといい方法あるかもですが(^^;)
次はdplyrなどでの実現方法を検討しないと。

2021/6/14　なんか動作がおかしい場面に出くわしたので注意喚起。

2021/9/14追記：
参考で、R(dplyr)で同じような処理をする場合の書き方。こっちもわかりやすくていい。

```R
explode_df <- df %>%
    mutate(C = strsplit(as.character(C), ",")) %>% 
    unnest(C)
  

```
go mod tidy で不要なpackageを削除する

## 概要
vgoでモジュール管理している際に`go get`したものの「やっぱり使わない！」から削除したいというケースだったり、「未使用のパッケージを削除したい」というケースだったりあると思います。

はい。`go mod tidy`でできます。(片仮名で発音を表すと`タイディ`)

## go modコマンドを見てみる

```bash
$ go mod

Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

	go mod <command> [arguments]

The commands are:

	download    download modules to local cache
	edit        edit go.mod from tools or scripts
	graph       print module requirement graph
	init        initialize new module in current directory
	tidy        add missing and remove unused modules
	vendor      make vendored copy of dependencies
	verify      verify dependencies have expected content
	why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.
```

`go mod tidy`の説明に`add missing and remove unused modules`と書いてますね。
不要なパッケージの削除だけではなく、不足しているパッケージがあれば追加もしてくれるようです。

## go help mod tidyしてみる
```bash
$ go help mod tidy
usage: go mod tidy [-v]

Tidy makes sure go.mod matches the source code in the module.
It adds any missing modules necessary to build the current module's
packages and dependencies, and it removes unused modules that
don't provide any relevant packages. It also adds any missing entries
to go.sum and removes any unnecessary ones.

The -v flag causes tidy to print information about removed modules
to standard error.
```

`-v`オプションをつけて削除されたパッケージ情報を出力するのがわかりやすい。

```bash
$ go mod tidy -v

unused github.com/ascarter/requestid
unused github.com/google/uuid
```
【XamarinForms】 XAML上で親ビューのコードビハインドのプロパティを参照する方法

カスタムコントロールの作成時など、XAML上でコードビハインドのプロパティを参照したい場面に使えます。
## 完成品　

・親＝ContentPage
・子＝Label
・表現：「親」の機嫌が良いと察知したら、即座におこづかいをねだる世渡り上手な「子」
##### MainPage.xaml

```xml
<?xml version="1.0" encoding="utf-8"?>
<ContentPage
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    x:Name="Oya"
    x:Class="DemoApp.MainPage">
    <Grid VerticalOptions="Center" HorizontalOptions="Center">
        <Label x:Name="Kodomo" Text="今日も勉強がんばるよ！" >
            <Label.Triggers>
                <DataTrigger TargetType="Label" Binding="{Binding Source={x:Reference Oya},Path=IsHappy}" Value="true">
                    <Setter Property="Text" Value="おこづかいくれるとうれしいなぁ！" />
                </DataTrigger>
            </Label.Triggers>
        </Label>
    </Grid>
</ContentPage>
```



##### MainPage.xaml.cs
※例として「IsHappy」プロパティを定義

```C#
using System.ComponentModel;
using Xamarin.Forms;

namespace DemoApp
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
            IsHappy = false;
        }

        public bool _isHappy;
        public bool IsHappy
        {
            get
            {
                return _isHappy;
            }
            set
            {
                _isHappy = value;
                OnPropertyChanged();
            }
        }
    }
}
```




#### 親のIsHappy=falseの場合
![image-20190828095230034.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118819/20fc6966-8af1-ecf6-8b89-47da5c8054fd.png)



#### 親のIsHappy=trueの場合
![image-20190828095113700.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118819/6b424155-de27-590e-7352-ecac479adff8.png)








## 実現する手順

##### 手順 1/2

XAML上: 親Viewに名前をつける

```xml
x:Name="Oya"
```



##### 手順 2/2

XAML上: 子から親Viewのプロパティを参照

```xml
Binding="{Binding Source={x:Reference Oya},Path=IsHappy}"
```



以上です





| メモ：環境                      |
| ------------------------------- |
| .NET Standard 2.0               |
| Xamarin.Forms 4.2               |
| IDE: VisualStudio For Mac 8.2.4 |
pythonの少し複雑なループ

初心者です。どのようにループを掛ければいいかわかりません。
アドバイスをいただければ幸いです。


データ a = [250, 300 , 500]
データ b = [[100,150,300],[50,60,80],[400,500,300]]

やりたいこと
250*100 + 300*50 + 500*400 　合計24000
250*50 + 300*60 + 500*80 合計70500
250*400 + 300*500 + 500*300 合計400000

以上の計算式をループ等を使ってやりたいのですが
いろいろ試したのですが、どうまわしていいか
わかりません。
分かる方よろしくお願いいたします。
ubuntu18.04でapp window透過

###やりたいこと
[アニメ見ながらプログラミングするために透過ウィンドウを実装する方法](https://paiza.hatenablog.com/entry/2019/07/12/%E3%82%A2%E3%83%8B%E3%83%A1%E8%A6%8B%E3%81%AA%E3%81%8C%E3%82%89%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB%E9%80%8F%E9%81%8E%E3%82%A6)
僕もアニメが見たかった。

###成果物

```bash
alias opacity50="sh -c 'xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY $(printf 0x%x $((0xffffffff * 50 / 100)))'"
alias opacity50all="xprop -root | grep ^_NET_CLIENT_LIST | grep -o '\0x[0-9a-f]\+' | xargs -I {} sh -c 'xprop -f -id {} _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY $(printf 0x%x $((0xffffffff * 50 / 100)))'"
alias opacity100="sh -c 'xprop -f _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY $(printf 0x%x $((0xffffffff * 100 / 100)))'"
alias opacity100all="xprop -root | grep ^_NET_CLIENT_LIST | grep -o '\0x[0-9a-f]\+' | xargs -I {} sh -c 'xprop -f -id {} _NET_WM_WINDOW_OPACITY 32c -set _NET_WM_WINDOW_OPACITY $(printf 0x%x $((0xffffffff * 100 / 100)))'"
```

.bashrcに上記のaliasを書いて終わり。
opacity50allを使えば開いてる全てが50で透過される。
opacity100を使えばクリックで選択し、透過度100にできる。
終わり。

一応結果画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443834/380ba060-0b7e-baaa-9e20-433aa99a74d3.png)
Visual Studio Codeを日本語化する方法[Windows 64bit]

VSCodeをインストール直後は英語になっているので、日本語化する方法を記載します。
　※同様の記事がいくつかありましたが、ヴァージョンの違いか手順が違ったので載せます。

![WS000000.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274023/008f3400-efdf-74bc-26c0-5677427cf67f.jpeg)

## １．Visual Studio Codeを開く
## ２．メニューバーのviewを開く
## ３．comanndo palette を選択する
![WS000001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274023/506ba503-cf0f-104f-6520-140450336f53.jpeg)

## ４．configと打ち込み、configure display languageを選択する

## ５．通常はenしかインストールされていないので、japaneseをインストールします。
　※jaが表示されている場合は、日本語がインストールされているので、jaを選択する。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274023/2bc07df6-d53b-b088-be1a-987a8c8c1aeb.jpeg)

## ６．インストールが終わると再起動をします。
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274023/c0a28002-e3dc-c240-4f6a-5a9a7175873c.jpeg)

すると、日本語化されています。
![WS000004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274023/36a65778-594c-5f69-30d8-2ee4012e5f44.jpeg)
[C#] 2つのIDisposableをusingしたときのコード分析の指摘CA2202の対応

**もくじ**
→https://qiita.com/tera1707/items/4fda73d86eded283ec4f

# やりたいこと
ファイルの読み書きをするときによく書いている下記のようなコードで、コード分析をかけたときにいつも`CA2202`という警告が出てきてたが、「実績あるコード」ということで修正せずに今まで来ていた。
が、新規ソフトでも同じ警告が出たので、この際直し方をはっきりさせておきたい。

```CA2202でるコード.cs
byte[] data = { 0, 1, 2, 3 };

using (var fs = new FileStream(@"C:\work\file1.data", FileMode.Create))
using (var bw = new BinaryWriter(fs))
{
    bw.Write(data);
}
```

出る警告
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352601/4e9e126c-cfa9-f597-6a07-5aca7003c392.png)

# なおしかた
下記のようなコードに直す。

```CA2202でないコード.cs
byte[] data = { 0, 1, 2, 3 };
FileStream fs = null;

try
{
    fs = new FileStream(@"C:\work\file1.data", FileMode.Create);

    using (var bw = new BinaryWriter(fs))
    {
        fs = null;
        bw.Write(data);
    }
}
finally
{
    fs?.Dispose();
}
```
# ポイント
`using (var bw = new BinaryWriter(fs))`の中で、使い終わったfsを、冒頭で`fs = null;`すること。
この一文を書かないと、やはりCA2202が出てしまう。

# 備考
usingで、使い終わったFileStreamのオブジェクトfsが、
- BinaryWriterのオブジェクトbwが破棄Dispose)されるとき
- 自分のusingで、自動でDisposeされるとき
の2回、破棄される可能性がある、作りによっては二回目の破棄の際にアプリ落ちますよ、という警告。

実際はこのコードではアプリが落ちたりはしない(おそらく、FileStreamとかBinaryWriterが、すでに破棄済みのものは二重に破棄しないようにつくってくれてるから)が、IDisposableを実装したなにかのライブラリとか、自前のクラスを使うときにusingでこういうことを書くと、Disposeの実装の仕方によっては落ちてしまうものと思われる。

# 参考
CA2202: Do not dispose objects multiple times
公式の？対処方法がここに書かれている。
https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca2202-do-not-dispose-objects-multiple-times?view=vs-2019

入れ子の using に対する CA2202 違反の解決策について
https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/eb99475a-e97c-48f5-90fc-029331025e6f/20837124282337612398-using-12395235501237712427-ca2202?forum=netfxgeneralja
【XamarinForms】16進数文字列からColor 、Colorから16進数文字列に変換する方法

【ゴール】 
→16進数文字列からColor 、 Colorから16進数文字列に変換する



【読者対象】
→XamarinFormsのコードビハインドで、色を操作する方。



#### 方法：16進数文字列→Color

```C#
var myColor = Color.FromHex("#ff6600");
```

※Xamarin.Forms.Colorであることに注意。



#### 方法: Color→16進数文字列

```C#
var color = Color.Orange;
var red = (int)(color.R * 255);
var green = (int)(color.G * 255);
var blue = (int)(color.B * 255);
var alpha = (int)(color.A * 255);
var colorHex = $"#{red:X2}{green:X2}{blue:X2}";

```

※Xamarinだとまさかのこんなガチな方法しかない。。。



お読み頂きありがとうです!

| あたいの環境                    |
| ------------------------------- |
| .NET Standard 2.0               |
| Xamarin.Forms 4.2               |
| IDE: VisualStudio For Mac 8.2.4 |
Wagtailチュートリアル 12 DB Browserを使おう

#Wagtailチュートリアル 12
<=[11 トップページに表示させよう](https://qiita.com/tagawahirotaka/items/16c299681569032614fc)
=>[13 Orderableなページを作ろう](https://qiita.com/tagawahirotaka/items/546510f2734cb9552c6f)
## DB Browserを使おう

<img width="1440" alt="スクリーンショット 2019-08-28 08.18.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402245/b65d5320-759c-85de-bf78-9395f898396e.png">


```json

[
  {
    "type": "title_and_text",
    "value": {
      "title": "Welcome to Pokeapi",
      "text": "This website provides a RESTful API interface to highly detailed objects built from thousands of lines of data related to Pok\u00e9mon. We specifically cover the video game franchise. Using this website, you can consume information on Pok\u00e9mon, their moves, abilities, types, egg groups and much, much more."
    },
    "id": "7573ea75-54b1-40a1-af32-dd1c9546b96e"
  },
  {
    "type": "simple_richtext",
    "value": "<p>This website provides <b>a RESTful API</b> interface to highly detailed objects built from thousands of lines of data related to Pok\u00e9mon.</p><p><i>We specifically cover the video game franchise.</i></p><p>Using this website, you can consume information on <a id=\"3\" linktype=\"page\">Pok\u00e9mon</a>, their moves, abilities, types, egg groups and much, much more.</p>",
    "id": "48748d3a-0c33-4627-8ee2-4495a5aef987"
  },
  {
    "type": "cards",
    "value": {
      "title": "Poke Cards",
      "cards": [
        {
          "image": 2,
          "title": "Pikachu",
          "text": "025",
          "button_page": 3,
          "button_url": ""
        },
        {
          "image": 3,
          "title": "Eevee",
          "text": "133",
          "button_page": null,
          "button_url": "https://www.pokemon.jp/zukan/detail/133.html"
        },
        {
          "image": 4,
          "title": "Snorlax",
          "text": "143",
          "button_page": 4,
          "button_url": ""
        }
      ]
    },
    "id": "ef216d7b-a67a-45a2-a3bd-a1c562b607a3"
  },
  {
    "type": "cta",
    "value": {
      "title": "Call to Action Title",
      "text": "<p>PokeApi PokeApi PokeApi PokeApi PokeApi PokeApi PokeApi PokeApi <b>PokeApi PokeApi PokeApi PokeApi</b> PokeApi PokeApi PokeApi PokeApi PokeApi PokeApi PokeApi PokeApi <i>PokeApi PokeApi PokeApi</i></p>",
      "button_page": 3,
      "button_url": "https://qiita.com/tagawahirotaka",
      "button_text": "Learn More"
    },
    "id": "5facccbe-05e1-4279-b42e-3d54d2efff79"
  }
]
```
Homebrew でChecksumエラー

## Homebrew のエラーについて

今回、Homebrew で emacsというエディタをインストールしようとしたところ、エラーが発生した。
おそらく gnutls を必要とするパッケージをインストールしようとした場合、同じことが起きるだろう。

```
$ brew install emacs
==> Installing dependencies for emacs: gnutls
==> Installing emacs dependency: gnutls
==> Downloading https://www.gnupg.org/ftp/gcrypt/gnutls/v3.6/gnutls-3.6.9.tar.xz
Already downloaded: /Users/username/Library/Caches/Homebrew/downloads/10375e457c78424d079bc03dc50b19e2d8f153be4087edde62a035a2627d8c6f--gnutls-3.6.9.tar.xz
==> Downloading https://gitlab.com/gnutls/gnutls/commit/ef80617d1e17e0878a909baad62a75ba265c0e00.patch
Already downloaded: /Users/username/Library/Caches/Homebrew/downloads/0c113ab0098bc4c3f2e8f410741b6104f2928fe63eb38cf98f8dcc3362f02ac4--ef80617d1e17e0878a909baad62a75ba265c0e00.patch
Error: An exception occurred within a child process:
 ChecksumMismatchError: SHA256 mismatch
Expected: 3b1634fa348c0f0064e43f3fb673e30a5e46f2b51cd6cd0d4a0cbf326e71c90e
 Actual: 34480b13120e2167060795060b6738c26622c341498cf6303b17b143642b14cd
Archive: /Users/username/Library/Caches/Homebrew/downloads/0c113ab0098bc4c3f2e8f410741b6104f2928fe63eb38cf98f8dcc3362f02ac4--ef80617d1e17e0878a909baad62a75ba265c0e00.patch
To retry an incomplete download, remove the file above.
```

Checksumが異なっているようなので、キャッシュに残っていたファイルが悪さをしたのかと思い、キャッシュを削除してみたが、同じエラーになった。


## 対策

調べてみると下記のHomebrewのGitHubにたどり着いた。

https://github.com/Homebrew/homebrew-core/issues/43156

ここによると、パッチファイルの末尾にあるGitバージョンが正しくないようで、パッチファイルのバージョンを変更すればいいらしい。


私の環境ではパッチはログから見るとこちらにあるようなので、このパッチファイルを書き換えました。

```
/Users/username/Library/Caches/Homebrew/downloads/0c113ab0098bc4c3f2e8f410741b6104f2928fe63eb38cf98f8dcc3362f02ac4--ef80617d1e17e0878a909baad62a75ba265c0e00.patch

--- 上記ファイルの末尾のバージョンをこのように書き換える
2.22.0 → 2.21.0
```

再度 brew install してみるとうまくいきました。
おそらくいつか修正されると思う。
とりあえず、Checksumエラーの原因とかパッチ書き換えなどを自力でやることもあるんだなぁ、ということを覚えておけばいいかな。
#importディレクティブでCOMライブラリを使用した際、エラー:E0102が発生する場合の解消方法

Visual Studio 2017/2019で新しいプロジェクトを作成し、下記のように#importディレクティブでCOMライブラリを使用した際、intellisenseで
> E0102	列挙型の事前宣言は非標準です

というエラーが発生します。ビルドではエラーが起きません。

```cpp
#include <iostream>

#import <shdocvw.dll> auto_rename

int main()
{
	CoInitialize(nullptr);
}
```

## 解消方法
Visual Studio 2017/2019で新しいプロジェクトを作成すると、デフォルトでプロジェクトのプロパティで
[言語] > [準拠モード]が「はい(/permissive-)」になっています。
「いいえ」に変更すると、エラー:E0102は発生しなくなります。
OpenLDAP のトランザクションログ

# OpenDAP のトランザクションログ
OpenLDAP でバックエンドを BDB にしていると以下のようなファイルができている。これは、OpenLDAP のトランザクションログのファイルである。

```sh
# ls /var/lib/ldap/log.000000*
/var/lib/ldap/log.0000006973  /var/lib/ldap/log.0000007021
/var/lib/ldap/log.0000006974  /var/lib/ldap/log.0000007022
/var/lib/ldap/log.0000006975  /var/lib/ldap/log.0000007023
/var/lib/ldap/log.0000006976  /var/lib/ldap/log.0000007024
/var/lib/ldap/log.0000006977  /var/lib/ldap/log.0000007025
/var/lib/ldap/log.0000006978  /var/lib/ldap/log.0000007026
/var/lib/ldap/log.0000006979  /var/lib/ldap/log.0000007027
```

OpenLDAP のトランザクションログの役割は、更新（追加／削除）結果をクライアントに返すまでに、ファイルのログとして各更新（追加／削除）の操作をコミットして、データの整合性を確保することである。

また、更新（追加／削除）操作を処理する前に、操作のログメッセージのトランザクションログをファイルに保存する。もし、システムがクラッシュした場合、トランザクションログを使用してデータベースをリカバリすることでもある。

# トランザクションログファイルがたまり続ける
このトランザクションログファイル、放置しているとたまり続けてディスクを圧迫することになる。

手っ取り早いのは slapd を再起動すれば消えてくれるのだが、運用中はおいそれとデーモンを停止できない。

# トランザクションログファイルの削除

トランザクションログファイルは以下の条件がそろっていれば削除ができる

- 実行中のトランザクションに関連していない状態
- 新しいトランザクションログファイルが作成されて、チェックポイントが実行された状態
- 唯一のトランザクションログファイルでない状態

上記の状態にするため以下のコマンドを実行する

```sh
# cd /var/lib/ldap
# db_checkpoint -h . -1 
# db_archive -h . -d 
```

db_checkpoint の「-1」(えるじゃなくいち）を指定し強制的にチェックポイントを作成する。
db_archive でチェックポイントまでのトランザクションファイルを削除する

これで、すっきりトランザクションログファイルが削除される

# 自動で削除させる
OpenLDAP の DB設定ファイル「DB_CONFIG」に以下を設定し、slapd を再起動する
RPMでインストールすると「/usr/share/openldap-servers/DB_CONFIG.example」にあるので、コピーして編集すればよい。

```sh
set_flags DB_LOG_AUTOREMOVE  
```
これを設定すると BDB への更新が発生し、トランザクションログファイルへの書き込みをした時点で、削除可能なファイルがあるかチェックする。
elixir で ユークリッドの互除法

ユークリッドの互除法：剰余算の結果を用いて剰余算のループをすることで最大公約数を求められるアルゴリズム

## Input
```
x y
```

## OutPut
```
GCD(x, y)
```

## Info
- x > y であれば GCD(x, y) = GCD(x - y, y)
- x = y であれば GCD(x, y) = x

を使って計算量をさげてます

## Code

```elixir
defmodule GCD do
  def gcd(x, 0), do: x
  def gcd(0, y), do: y
  def gcd(x, y) do
    cond do
      x > y -> gcd(x - y, y)
      x == y -> x
      true -> gcd(x, rem(y, x))
    end
  end
end

[a, b] = IO.gets("") |> String.split(" ")
  |> Enum.map(&(String.trim(&1) |> String.to_integer))

IO.puts(Gcd.gcd(a, b))
```

## 所感
一部冗長な気もしますがやっぱりコードが見やすいのでElixir好きです
Androidアプリ配信に関してまとめ(TWAアプリ)

# Androidアプリリリースに必要な作業

## 署名済APKファイルの作成
### 1. リリース用の設定を行う

[こちら](https://developer.android.com/studio/publish/preparing?hl=ja#publishing-configure)を参考にリリースに必要な準備を行う
- ログ記録とデバッグをオフにする
- プロジェクト ディレクトリをクリーンアップする
- マニフェストおよび Gradle ビルド設定を確認およびアップデート
など

### 2. アプリの署名鍵とアップロード鍵の生成を行う

AndroidStudioで[鍵とキーストアの生成](https://developer.android.com/studio/publish/app-signing#generate-key)を行う

鍵の管理に関しては[App Signing](https://developer.android.com/studio/publish/app-signing#google-play-app-signing)がよい


### 3. サーバーに配置する関連付け用jsonを生成する
以下のコマンドでSHA-256フィンガープリントを抽出

```bash
keytool -list -v -keystore  エイリアス  -storepass  キーストアのパス 
```

実効例サンプル

```bash
$keytool -list -v -keystore ./mykeystore.ks -alias test -storepass password -keypass password

Alias name: key0
Creation date: 28 Jan 2019
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Test Test, OU=Test, O=Test, L=London, ST=London, C=GB
Issuer: CN=Test Test, OU=Test, O=Test, L=London, ST=London, C=GB
Serial number: ea67d3d
Valid from: Mon Jan 28 14:58:00 GMT 2019 until: Fri Jan 22 14:58:00 GMT 2044
Certificate fingerprints:
   SHA1: 38:03:D6:95:91:7C:9C:EE:4A:A0:58:43:A7:43:A5:D2:76:52:EF:9B
   SHA256: F5:08:9F:8A:D4:C8:4A:15:6D:0A:B1:3F:61:96:BE:C7:87:8C:DE:05:59:92:B2:A3:2D:05:05:A5:62:A5:2F:34
Signature algorithm name: SHA256withRSA
Subject Public Key Algorithm: 2048-bit RSA key
Version: 3
```

表示された情報をもとに[こちら](https://developers.google.com/digital-asset-links/tools/generator)でステートメントを生成する

実効例サンプル

```json
[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target" : { "namespace": "android_app", "package_name": "com.example",
               "sha256_cert_fingerprints": ["aaaa"] }
}]
```

作成されたステートメントをwebアプリケーション側の `/.well-known/assetlinks.json` に配置する

### 4. アプリの署名を行う

App Signing方式でアップロード鍵を使用して[リリース用としてアプリに署名](https://developer.android.com/studio/publish/app-signing#sign-apk)をする

## Google Playで配信

最初に[Google Play Console](https://play.google.com/apps/publish/signup/)でデベロッパーズアカウントを作成する必要があります

※ アカウント作成には$25必要です

※ ストアに掲載するにあたってスクショやヘッダー画像が必要になるため準備が必要です
[ストア配信にあたって必要素材や情報](https://support.google.com/googleplay/android-developer/answer/113469#store_listing)

登録後の手順についてはこちらの記事がわかりやすい
[Google Play での Android アプリの配信方法(インストールとアップデート)を試してみる - Qiita](https://qiita.com/kusokamayarou/items/e3a1319e827bbaa78fc2)


[公式手順](https://support.google.com/googleplay/android-developer/answer/113469?hl=ja&ref_topic=7072031)
Windows10を Git サーバとするとき、git clone ssh:// 時リポジトリが見つからない

## TL;DR

サーバ側 Windows の ssh ログインシェルを Git bash に変更し、フルパスの前に `/mnt`を付けて clone する。

```sh:URLの具体例
git clone ssh://hidao@192.168.0.254/mnt/c/users/hidao/repo/app.git
```  

## 検証環境

サーバOS: Windows10 Pro 64bit ver. 1903
Git: 2.18.0.windows.1
sshd: OpenSSH_7.7p1, OpenSSL 1.0.2o  27 Mar 2018（アプリと機能のオプション機能で追加したもの）

クライアントOS: Windows10 Home 64bit ver. 1903
Git: 2.19.0.windows.1 
ssh: OpenSSH_7.7p1, OpenSSL 1.0.2p  14 Aug 2018（アプリと機能のオプション機能で追加したもの）

## 特殊な事情

Windows10 のアプリと機能からインストールできる sshd では、デフォルトシェルが cmd.exe です。

ただし、cmd では `git clone ssh://` 時に UNIX 形式のパス指定ではリポジトリに到達できないため（原因不明）、ログインシェルを Git bash に変更する回避策を取ります。

また、Git bash はドライブを `/mnt` の下にマウントしているため、リモートから URL を指定する場合に `/mnt ` の追加が必要になります。

## ハマりポイント

1. ssh のログインシェルがデフォルトの cmd.exe では、一般的な URL 表記法ではリポジトリに到達できない。
2. ssh のログインシェルを Git bash に変更すると、**Git bash をローカルで使っているときと異なり**、フルパスの先頭に `/mnt` を追加する必要がある。

## 付録：ssh のログインシェルを Git bash に変更する PowerShell コマンド

下記コマンドを実行し、bash のパスを調べます。

```powershell:入力
Get-Command bash | Format-Table -AutoSize -Wrap
```

```:出力
CommandType Name     Version        Source
----------- ----     -------        ------
Application bash.exe 10.0.18362.239 C:\WINDOWS\system32\bash.exe
```

次に、出力で得られた `Source` のパスを含むコマンドを管理者権限で下記要領にて実行します。

```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\WINDOWS\system32\bash.exe" -PropertyType String -Force
```

以下のような出力が得られれば、ログインシェルの変更に成功しています。

```
DefaultShell : C:\WINDOWS\system32\bash.exe
PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE
PSChildName  : OpenSSH
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry
```
Win上でRails+Bootstrapを構築の時に出てくるExecJS エラーを解決したい(解決する)

#はじめに
WindowsでRailsアプリケーションを作成し、
Bootstrapを導入したところ、ExecJSエラーが出て、起動しない。
- Windows 10 proもしくはhomeで確認
- Railsのバージョンは5.2.3
- Rubyのバージョンは2.6.3

最近Rails6にアップデートされたので、この記事は今後使えなくなる可能性があります。

#詳細
こんなエラーがターミナル上で出てるのではないでしょうか。

```bash
ExecJS::ProgramError in Home#index
Showing C:/Source/Repos/graph-tutorials/ruby-test/app/views/layouts/application.html.erb where line #8 raised:

identifier '(function(opts, pluginOpts) {return eval(process' undefined
Rails.root: C:/Source/Repos/graph-tutorials/ruby-test
```

#解決策
僕はこのissueをみて使えるようになりました。
https://github.com/twbs/bootstrap-rubygem/issues/157

#やり方

##1.Gemfileの修正

`duktape`のgemを探してコメントアウト、もしくは削除します。

##2.Node.jsのインストール(Node.jsがインストールされていない場合のみ)
Node.jsの公式ページからダウンロードします。
https://nodejs.org/ja/download/
推奨版と最新版があって、最新版をダウンロードしたくはなりますが、
ここはその気持ちを押し殺して推奨版をダウンロードします。その後インストールをしてください。
![nodejs.org_ja_download_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387875/de79e60b-a299-1984-b2f8-b3f7abb8798d.png)

その後Windowsで環境変数の設定を開き、PATHを通してください。
PATHの通し方はこちらを参考にするといいです。
いろんな方法がありますね。
https://qiita.com/yuki12/items/9723f60907508b11504b

最後にコマンドプロンプト or Gitbash or PowerShellを開いて
下記のコマンドを入力し、バージョンが表示されるか確認してください。

```
$ node -v
```

##`config/boot.rb`に追記する。
下記のコードを貼り付けてください。
runtime時にnodeを使うように指示します。

```ruby:config/boot.rb
ENV['EXECJS_RUNTIME'] = 'Node'
```

##サーバーを再起動
サーバーを再起動して、エラーが出ないか確認してください。
pyspark.mlで、CrossValidatonで得られた最適モデルのハイパーパラメータを取り出す

# はじめに
apache spark mlのCrossValidatorでハイパーパラメータを決める時、最適モデルのハイパーパラメータの取り出し方がすぐに分からず、少し時間を要したのでメモします。
ただ、いきなり取り出し方を書いても良く分からないメモになるので、クロスバリデーションの設定から記載します。
なお、これは[stackoverflowのこのページ](https://stackoverflow.com/questions/36697304/how-to-extract-model-hyper-parameters-from-spark-ml-in-pyspark/48769559)のコードをほぼそのまま転記していますが、自分の環境でも試した内容です。

# 経緯：グリッドサーチでクロスバリデーションを行う
pyspark.ml.tuningのParamGridBuilderとCrossValidatorを使ってクロスバリデーションを実行します。
##グリッドサーチの設定
まず、検証したいハイパーパラメータをParamGridBuilderで定義します。
今回は線形回帰モデルでregParamとelasticNetParamをそれぞれ試します。

```python
from pyspark.ml.tuning import ParamGridBuilder, CrossValidator
from pyspark.ml.regression import LinearRegression

evaluator = RegressionEvaluator()
regParam_list = [0.1, 0.01, 0.001]
elasticNetParam_list = [0, 0.5, 1]
lr = LinearRegression()
grid = ParamGridBuilder().addGrid(lr.maxIter, [100]) \
                                .addGrid(lr.regParam, regParam_list) \
                                .addGrid(lr.elasticNetParam, elasticNetParam_list)
                                .build()
```
##クロスバリデーションの実行
CrossValidatorを使います。機械学習手法、先に設定したグリッドサーチの設定、評価方法、交差検証の分割数を指定して、学習させ最適モデルを取り出します。

```python
lr_cv = CrossValidator(estimator=lr, estimatorParamMaps=grid, \
                       evaluator=evaluator, numFolds=10)
lrModel = lr_cv.fit(train_df)
bestModel = lrModel.bestModel
```

と、このようにクロスバリデーションを行なった最適モデルを取り出すことができるのですが、その時のパラメータの取り出し方に詰まったという経緯（今回の場合、regParamとelasticNetParam）。

# 主題の解決方法
取り出したモデルのハイパーパラメータは、次のように**_java_obj.**getRegParam()というように記載する必要があった。

```python
bestModel._java_obj.getRegParam()
bestModel._java_obj.getElasticNetParam()
```

良く見ると[pyspark.ml.tuning](https://spark.apache.org/docs/2.3.3/api/python/_modules/pyspark/ml/tuning.html)を見ればわかるのですが、初見では分からず[stackover flowのこの記事](https://stackoverflow.com/questions/36697304/how-to-extract-model-hyper-parameters-from-spark-ml-in-pyspark/48769559)で対応策発見に至りました。

ちなみに、係数とは次のように取り出せるので、上記の方法に考えが至らなかったのもあります。

```python
bestModel.coefficients
```

#最後に
sparkやpysparkについては日本語の情報があまり無いように思うので、少しでも誰かの助けになれば幸いです。（特にpyspark.ml）

#環境
- Spark 2.3.3
【Vue初心者向け】超シンプルなお買い物リストアプリを作る

Vue.jsで作ったシンプルなサンプルコードです。

対象者は、Vue.jsを始めたところで、色々サンプルコードをいじってみたい人です。

商品名、個数を入力して登録すると買い物リストが表示されます。重要な機能のコードが分かるよう、エラー処理はしていません。

実際に動作はこちらで確認できます。
[お買い物リストアプリ](https://code.ameneko.com/shopping)

```
<template>
    <div class="shopping_component">
        <section>
            <div class="input_data">
                <p>買うもの：<input v-model="name" type="text" placeholder="買うもの"></p>
                <p>個数：<input v-model="number" type="text" placeholder="個数"></p>
            </div>
            <button @click="input">登録する</button>
        </section>
        <section>
            <div class="shopping_list">
                <li v-for="(item, index) in shoppingList" :key="index">
                    {{item.name}}{{item.number}}個
                    <button @click="deleteItem(index)">削除</button>
                </li>
            </div>
        </section>
    </div>
  
</template>

<script>
export default {
    data(){
        return{
            name: '',
            number: 1,
            shoppingList: []
        }
    },
    methods:{
        input(){
            var item = {name:this.name, number: this.number}
            this.shoppingList.push(item)
            this.name = ''
        },
        deleteItem(index){
            this.shoppingList.splice(index, 1)
        }
    }
}
</script>

<style scoped>

</style>
```
ポイントは、配列をv-forで表示する時にindexにつけることです。indexをつけておけば、削除ボダンにこのindexを渡すことで簡単に該当する項目を削除できます。
splice(index,1)は「index番目から始める要素を1つ削除してね」という意味です。

宣伝：ブログやっています→ [ブログ](https://www.katonobo.com/)
Amazon Linux 2でpip3 をupdateするとpipが消失する

#現象
Amazon Linux 2で```yum -y install Python3```すると標準でPython3.7とpip3のpip 9.0.3が入る (2019/8時点)

この状態rootのshellからpip3をそのままupdateすると死ぬ

```shell-session
# pip3 --version
pip 9.0.3 from /usr/lib/python3.7/site-packages (python 3.7)
# which pip3
/bin/pip3
# pip3 install -U pip
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting pip
  Downloading https://files.pythonhosted.org/packages/30/db/9e38760b32e3e7f40cce46dd5fb107b8c73840df38f0046d8e6514e675a1/pip-19.2.3-py2.py3-none-any.whl (1.4MB)
    100% |????????????????????????????????| 1.4MB 905kB/s
Installing collected packages: pip
  Found existing installation: pip 9.0.3
    Uninstalling pip-9.0.3:
      Successfully uninstalled pip-9.0.3
Successfully installed pip-19.2.3
# pip
bash: pip: command not found
# pip3
bash: /bin/pip3: No such file or directory
# which pip3
/usr/bin/which: no pip3 in (/sbin:/bin:/usr/sbin:/usr/bin)
# which pip
/usr/bin/which: no pip in (/sbin:/bin:/usr/sbin:/usr/bin)
```
成功したと言われるがpipもpip3も存在しないと言われる。詰んだように見える

#原因
根本的な原因は pip3 本体が```/usr/local/bin/```に移動したため

```shell-session
# ls /usr/local/bin/ -la
total 12
drwxr-xr-x  2 root root  43 Aug 27 19:47 .
drwxr-xr-x 12 root root 131 Jun 18 22:23 ..
-rwxr-xr-x  1 root root 216 Aug 27 19:47 pip
-rwxr-xr-x  1 root root 216 Aug 27 19:47 pip3
-rwxr-xr-x  1 root root 216 Aug 27 19:47 pip3.7
```

そして、Amazon Linux 2 でsudo su等でrootになった場合、rootのPATHに```/usr/local/bin```は含まれてない
(上のwhichにも書いてるけど```/sbin:/bin:/usr/sbin:/usr/bin```しかない)
なお、ec2-userには含まれているのでrootになってなければ影響ない。```sudo su```したら見えなくなるけど。

```shell-session
$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/ec2-user/.local/bin:/home/ec2-user/bin
```

#解決法
1. ```sudo su``` とかせず常に```sudo pip3```でやる。pip3のupdate時にもrootで動かすなって書いてるし。
2. ```/usr/local/bin```をPATHに追加する。とりあえずは解決する。
【git】Time machineに乗って過去にどこでも go back! 

## はじめに

`git`を使う最大の利点は、バージョン（履歴のようなもの）管理することによって、（コミットした）過去のどこへでも戻ることができることではないでしょうか？
この仕組みがあることで、安心して開発を進めることができますよね。

そこで、タイムマシーンに乗って、過去にタイムトラベルするスーパー安全な方法をスーパーシンプルにまとめます。

注：この記事は、MacのTime machine とは一切関係ありません。

## ３ステップ

`git`で過去の状態に戻りたい場面には主に次の二つがあると思います。

1. プログラムに不具合が出たため、過去のある状態に戻ってリスタートしたい
2. ただ単に過去のある状態を確認するためだけに戻りたい（確認後、現在の状態に戻ってくる）

1 の場合は、`git reset --hard`で乱暴に戻っても問題ないですが、2 の場合は、それでは少々乱暴（危険）なので、違うコマンドを使うことでかなり安全に作業できます。この記事では、2 の、単に確認のために過去に戻りたい場合の対処法を示します。


前提として、過去へ戻る前は、masterブランチにいるとします。

### 1. コミット履歴を確認する

`git reflog`を使うと、`HEAD`の移動履歴を確認できます。`git log`では、commit履歴のみ表示しますが、`git flog`では、commitに加えて、checkout、pull、reset、rebaseなどの履歴（つまりは、**HEADの移動履歴**）も表示することができます。

```zsh
❯ git reflog
.
.
8827928 (origin/develop) HEAD@{43}: pull origin master: Fast-forward
8281683 HEAD@{44}: checkout: moving from master to develop
306e3db HEAD@{45}: pull origin master: Fast-forward
3369a69 HEAD@{46}: commit: fix typo
f00081c HEAD@{47}: commit: create README.md
9c898f1 HEAD@{48}: commit: third commit
d2fafdb HEAD@{49}: commit: second commit
eddfbf5 HEAD@{50}: commit: fist commit
```

### 2. 目的の移動ポイントを指定してgo back!

では、移動したい箇所（ハッシュ値）を指定して、過去に戻りましょう。
下記のように`git checkout ハッシュ値`、あるいは、`git checkout HEAD@{46}`のようにHEADを指定すると、過去にgo back! することができます。

```zsh
❯ git checkout 3369a69
```

### 3. 確認が済んだら現在にgo back!

masterプランチに戻りましょう。
 
```
❯ git checkout master
```

おわり。
phpで自然順ソートをする

仕事で画面に表示するデータの表示順がおかしいと報告を受け調査したところ、
下記のような感じの処理が問題だったと判明。

```php
// 実際には外部から取得してきたデータの配列
// 末尾がシーケンス番号になっている文字列がバラバラの順番で配列に入ってる
$datas = [
    'aaa_7',
    'aaa_1',
    'aaa_8',
    'aaa_5',
    'aaa_2',
    'aaa_6',
    'aaa_11',
    'aaa_9',
    'aaa_10',
    'aaa_3',
    'aaa_4',
];

usort($datas, function (string $a, string $b) {
    return strcmp($a, $b);
});
```

上記の処理で実現したかったのは下記のように「配列内の値を末尾のシーケンス順に並び替える」

```
array(11) {
  [0]=>
  string(9) "aaa_1"
  [1]=>
  string(9) "aaa_2"
  [2]=>
  string(9) "aaa_3"
  [3]=>
  string(9) "aaa_4"
  [4]=>
  string(9) "aaa_5"
  [5]=>
  string(9) "aaa_6"
  [6]=>
  string(9) "aaa_7"
  [7]=>
  string(9) "aaa_8"
  [8]=>
  string(9) "aaa_9"
  [9]=>
  string(10) "aaa_10"
  [10]=>
  string(10) "aaa_11"
}
```

だったのですが実際には下記のような結果に

```
array(11) {
  [0]=>
  string(9) "aaa_1"
  [1]=>
  string(10) "aaa_10"
  [2]=>
  string(10) "aaa_11"
  [3]=>
  string(9) "aaa_2"
  [4]=>
  string(9) "aaa_3"
  [5]=>
  string(9) "aaa_4"
  [6]=>
  string(9) "aaa_5"
  [7]=>
  string(9) "aaa_6"
  [8]=>
  string(9) "aaa_7"
  [9]=>
  string(9) "aaa_8"
  [10]=>
  string(9) "aaa_9"
}
```

早速ですが上記のコードをどのように修正したかの結果だけ先に書いておきます

```php
usort($datas, function (string $a, string $b) {
    // strcmp()→strnatcmp()
    return strnatcmp($a, $b);
});
```

`strcmp()`を`strnatcmp()`に置き換えただけですね。
これで先ほどの配列内のデータを末尾のシーケンス順に並び替えることができました。

ではまず元々の処理がどのようなものだったかを解説していきますが、メインの処理はたった数行なので、ほぼ使用されている関数の説明です。

`usort()`は配列の値をユーザー定義の関数でソートする関数です。
そしてその`usort()`のコールバック関数内で使用されている`strcmp()`は文字列を先頭から一文字ずつ比較していき、
同一ではないと判断された時点でその差を返す関数です。
文字列の比較はバイト列にて行い、同一ではないとわかった場合に返却する差はそのバイト列の差となっています。

上記の通り先頭から1文字ずつ比較していくため、`aaa_10`と`aaa_2`の比較時に1と2で比較されてしまい、`aaa_10`が前でソートされてしまうという結果になりました。
そのため、比較部分の関数を自然順比較が可能な`strnatcmp()`に変更しています。

また、自然順という言葉があまり聞きなれない言葉だったためそちらも調べてみたのですが、[wikipedia](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E9%A0%86)に寄ると「アルファベット順を基本とする，複数桁の数字が単一の文字として順序付けられるような照合規則」とのこと。
複数桁の数字が単一の文字として順序づけられたため、`aaa_10`と`aaa_2`の比較は10と2の比較になり、期待通りのソート結果となったということですね。
Ubuntuで全角/半角の切替をMac風にする

# 概要
Ubuntuでは全角/半角の切替がWindows風になっています。これをMac風にしていきます。具体的には、無変換キーで半角英数入力に、変換キーでひらがな入力に切り替えます。

# 結論
変換キーでひらがな入力にするために、**xmodmap**を使用します。変換キーをひらがなキーにしてしまいます。

> 追記 2019/9/3
> xmodmapを使わなくてもできました。

無変換キーで半角英数入力にするために、Mozcの設定をいじります。**IMEを無効化**することで半角英数入力にすることができます。

# 環境

Ubuntu 18.04.3
xmodmap 1.0.9

# 方法

## 変換キーでひらがな入力

`~/.Xmodmap`に以下を記述します。

```:~/.Xmodmap
keycode 100 = Hiragana NoSymbol Hiragana
```

次のコマンドを実行します。

```
xmodmap ~/.Xmodmap
```

> 追記 2019/9/3
>
> xmodmapを使わない方法では、以上の操作は必要ありません。

## 無変換キーで半角英数入力

右上のメニューから、**日本語(Mozc) -> ツール -> プロパティ**をクリックします。
![Screenshot from 2019-08-28 02-45-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427284/6aaa4bd3-90d8-ad1a-5800-6a071b695b6a.png)

すると下のような画面が出てくると思います。
![Screenshot from 2019-08-28 02-56-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427284/44bda23e-0a43-207a-e511-06e18e153cef.png)

キー設定の選択で「**ことえり**」を選択します。

その横にある「編集...」をクリックします。**編集 -> エントリーを追加**から、以下のように指定します。「IMEを無効化」によって半角英数に切り替えます。

![Screenshot from 2019-08-28 03-00-21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427284/1a113e03-6055-2a59-7562-9d5804954569.png)


> 追記 2019/9/3
>
> xmodmapを使わない方法では、「Hiraganaキー」の部分を「Henkanキー」に読み替えてください。
> 
> また、「ひらがなに入力切替」の部分を「IMEを有効化」に変えてください。


最後に「OK」をクリックすれば完了です。

# おわりに
変換キーと無変換キーの設定方法が異なるのは気に食わないですが、どちらか片方の方法だけでは実現できませんでした。もっといい方法があるかもしれません。


Fcitxを使った方法は以下にありました。
[Ubuntuの入力モード切り替えのキーバインドを変更してMac風にする](https://qiita.com/yas-nyan/items/55e764304c67736ff9ba)


# 関連リンク

[Ubuntuでキーボードのマッピングをxmodmapで変更する(Ubuntu18.04対応)](https://www.komee.org/entry/2018/10/24/150000)

[起動時にxmodmapの設定を反映させる](http://secret-garden.hatenablog.com/entry/2016/10/15/000000)
Sympyでオイラーラグランジュ方程式を解く

自分用のメモのために、記事を書いてみました。

#はじめに
運動方程式を導出するために、オイラーラグランジュ方程式を解くことがあると思います。しかしながら多変数のオイラーラグランジュ方程式を解くとき、計算量が多く面倒のなので無料で利用できるPythonの数式処理ライブラリであるSympyを使ってオイラーラグランジュ方程式を解いてみることにしました。

# 今回説明すること
一般的な運動である[１質点とばねによる振動系](https://ja.wikipedia.org/wiki/%E5%9B%BA%E6%9C%89%E6%8C%AF%E5%8B%95#%E3%81%B0%E3%81%AD%E2%80%90%E8%B3%AA%E9%87%8F%E7%B3%BB%E3%81%AE%E5%9B%BA%E6%9C%89%E6%8C%AF%E5%8B%95)のラグランジアンからオイラーラグランジュ方程式の解くプログラムを用いて説明をします。 

# コード

```Python:Euler–Lagrange.py
#Sympyをインポート
import sympy as sp
#JupyterNotebookを使っている場合数式を自然数表示
sp.init_printing()

#時間の変数を設定
t = sp.symbols('t')
#質点の位置の変数を設定
#（xはｔの関数に設定するためにオプションにcls=sp.Functionを追加）
x = sp.symbols('x ', cls=sp.Function)
#質量とばね定数の設定
m, k = sp.symbols('m k')

#ラグランジアンLを設定
L =sp.Function("L")
L = (m*(x(t).diff(t))**2)/2 -(k*x(t)**2)/2

#変数の座標と座標の時間微分に配列を作成
#多変数に拡張する場合ここに変数を追加
pos = [x(t)]
vel =[x(t).diff(t)]

#オイラーラグランジュ方程式解く関数を定義
def EulerLagrange(L,pos,vel):
    
    EQ_list =[]

    for i in range(len(pos)):
        EQ_list.append(sp.simplify(sp.Eq(L.diff(vel[i]).diff(t) - L.diff(pos[i]),0)))
    return EQ_list

#運動方程式
f =EulerLagrange(L,pos,vel)[0]
print(f)

```

上のように計算を行わせると、運動方程式$f$は、

```math

k x{\left (t \right )} + m \frac{d^{2}}{d t^{2}} x{\left (t \right )} = 0

```
となり、[１質点とばねによる振動系](https://ja.wikipedia.org/wiki/%E5%9B%BA%E6%9C%89%E6%8C%AF%E5%8B%95#%E3%81%B0%E3%81%AD%E2%80%90%E8%B3%AA%E9%87%8F%E7%B3%BB%E3%81%AE%E5%9B%BA%E6%9C%89%E6%8C%AF%E5%8B%95)と同様の形になりました。

これで、自宅でも簡単に運動方程式が導出できます。

#終わりに
運動方程式の導出ができました。実際に欲しいの運動方程式を数値計算した結果が欲しかったのですが、この求めた運動方程式をPythonのライブラリ（Sympy、Numpy、SciPyなど）を用いて数値計算する方法がわかりませんせんでした。もしご存じの方がいらっしゃいましたら、教えていたただけると幸いです。