OmniAICreator/Qiita-1.07M huggingface dataset:
【備忘録】Rails Formオブジェクトパターン使用時のエラーメッセージ日本語化

# 概要
- RailsのFormオブジェクトパターン使用時の入力フォームについてのバリデーションで弾かれたエラー内容を日本語として表示させる事を行ったので備忘録としてまとめておきます。

# 前提
- RailsのアプリケーションにてFormオブジェクトパターンを用いている。

# Formオブジェクトパターンについて簡単に
- Railsを利用する開発における実装パターンのひとつ。
- 主に1つのフォーム送信時に複数のモデルを操作したい場合やテーブルに情報を保存しない情報に対するバリデーションを行いたい場合に使用します。


# Formオブジェクト使用時のバリデーションについて
- まず、1つのフォームから複数のテーブルにデータを保存する場合、Formオブジェクトを使用していないと、フォームから送られてきた値を処理(createやupdate)する際に複数テーブルに関連したモデル内記述のバリデーションで入力値が弾かれてしまうと処理を継続できなくなります。
- その点を補う為にFormオブジェクトパターンを用います。
- Formオブジェクトのインスタンス内にバリデーションの記述を行う事で、フォームからの入力値がバリデーションに引っかかった場合は、入力情報と共にエラーメッセージをフォームに返す事が出来ます。
　　 

# エラーメッセージの日本語化について
1.作成中アプリケーションのconfigフォルダ内のapplication.rbに
```  config.i18n.default_locale = :ja　←この一文を追加します。
```

```terminal:cnofig>application.rb
module (作成アプリケーション名)
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # 日本語の言語設定
    config.i18n.default_locale = :ja  #←この一文をconfig内のapplication.rbに追加。

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end
```

2.日本語に対応する"rails-i18n"というGemを導入します。
・このGemの導入によりrails-i18nで翻訳されている英文が日本語として使用出来るようになります。
※Gemについての詳細は下記のサイトで確認して下さい。
https://github.com/svenfuchs/rails-i18n
Gemfileにrails-i18nを記述しターミナルにて「bundle install」を行います。

```terminal:Gemfil
~ 中略 ~
gem 'rails-i18n'
```
```terminal:ターミナル
bundle install
```

3.rails-i18nのGemで対応出来なかった単語に関して日本語翻訳する為のlocaleファイルを作成します。
・localeファイル・・・様々な言語に対応できる言語ファイルの事です。
・まずlocalesフォルダはをconfigフォルダ内に作成します。
・そしてconfig/localesディレクトリに「ja.yml」というファイルを作成します。
![スクリーンショット 2021-01-13 16.36.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/899423/02b1f5ee-d627-fbdc-1a79-318a4a58dedc.png)

4.ja.ymlのファイルを作成したら、ファイル内に日本語化したい英文・英単語と日本語訳を記述していきます。
・ja.ymlファイル内の記述に関しては下記のコードを参照して頂ければと思います。
※この時に注意点です!
・Formオブジェクトパターンを使用していないモデルに関しては、ActiveRecordを継承していますが、Formオブジェクトパターンを用いて作成したモデルは、ActiveModelを継承して作成しています。
ですので、Formオブジェクトパターンを用いたモデルに対しての翻訳の部分の記述の際は気をつけて下さい。

```terminal:ja.yml
ja:
  activerecord:  #← ActiveRecordを継承しているモデルに対しての翻訳部分
    attributes:
      user:　　　　　　　　　　　　　　 #←モデルファイル名
        nickname: ニックネーム　　　　　#←rails-i18nにて翻訳されなかった単語名
        gender: 性別　　　　　　 　#←rails-i18nにて翻訳されなかった単語名
        age: 年齢　　　　       　#←rails-i18nにて翻訳されなかった単語名

  activemodel:  #← ActiveModelを継承して作成したFormオブジェクトパターンのモデルに対しての翻訳
    attributes:
      book_data:                   #←Formオブジェクトパターン使用のモデルファイル名
        title: タイトル　　　　　　　 　#←rails-i18nにて翻訳されなかった単語名
        publisher: 出版社           #←rails-i18nにて翻訳されなかった単語名
        author: 著者                #←rails-i18nにて翻訳されなかった単語名
        isbn: ISBN                 #←rails-i18nにて翻訳されなかった単語名
```

5.サーバー再起動後にブラウザで確認して下さい。
・再起動後に、フォームのバリデーションのエラーメッセージが問題なく翻訳されているか確認して下さい。
Oculus Integration/Unity2020


# 環境
Unity 2020.2.0f1
VS2019 free
OS windows10 pro

# ビルド
[Unity]
Vulkanの削除
Android6.0

Swich Platform (10分くらいかかる）


#Oculus Integrationのインストール
→リップシンクとAvatorは不要で重いのでチェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/25250fe7-a0ef-ce3f-2717-06bee855a8eb.png)


# ビルド2

XR Plugin Management
→　コンフリクトが発生する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/8a2ff7b4-7542-21b8-b993-41977022788c.png)
けど、無視してAndroidのapkを作る事はできる。


# Unity2019との違い
Oculus XRとOculus Android　は明示的にインストールしなくてもよい



# XRインタラクションツールキット/XR Interaction Toolkit
https://note.com/npaka/n/n7b99fac6b5fa

Unity2019.4
パッケージマネージャ横のpreview版を表示するにチェックを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/3c89fadd-ad90-55de-9131-badf4a0ba6e8.png)

Unity2020.2.0f1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/de22684b-430d-97f1-aa1d-d22786cd6ea7.png)

# ご参考
この記事群はわりと役に立つ
https://note.com/npaka/n/nc18d61e25c85

Oculus Developer Hub/Android Logcat/Controler/Locamotionなどの解説がある。

「Oculus Developer Hub」と「Android Logcat」同時には使えません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/067b84bf-3ceb-0ef7-bafa-8f5ec6579769.png)

★「Not starting debugger since process cannot load the jdwp agent.」
がでるんやが...
あとコントローラー認識できない。OculusIntegration必要？
↓
OculusIntegrationインストールの後に、「Build And Run」の後に本体を頭にかぶるとOK

# Unity + Oculus Quest 2 開発メモ（framesynthesis

https://framesynthesis.jp/tech/unity/oculusquest/
<自分メモ>PHP　投稿画面でリロードすると再度登録されてしまう

環境
MySQL 5.7.30
PHP 7.3.21

現状
投稿画面で投稿後、リロードすると投稿した内容が再度登録されてしまう。

#ヒントになった事

``` var_dump(); ```を投稿画面のファイルに記入
↓
GETが表示される

なので、POSTした時に何か対処することに。


#解決
投稿画面(board.php)で読み込んでいる、PHPファイル(create.php)に、送信したとき、POSTだったら投稿画面(board.php)を読み込むとすれば完了！

```
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $board = [
        'nickname' => $_POST['nickname'],
        'message' => $_POST['message'],
    ];
    header('Location: board.php');
}
```


参考記事
【PHP】PHPでリロード対策をして二重投稿を防止しよう
https://the-zombis.sakura.ne.jp/wp/blog/2014/07/11/post-2139/

後、数えきれないぐらい関連記事を参考にしました笑
そして、他のやり方もあります！

課題は入力値が残らなくなってしまったのでどこかのタイミングで直します！

何かご指摘いただけたらありがたいです！
dict in dict(辞書 in 辞書)を特定のkeyでsortする


dict in dictのsortメモ

```python
# 球場ごとのチームのホームラン本数
homerun_dict = {
    'tokyo_dome': {'home_team': 10, 'hanshin': 8, 'hiroshima': 20},
    'koshien': {'home_team': 20, 'kyojin': 18, 'hiroshima': 12},
    'zoomzoom': {'home_team': 30, 'kyojin': 6, 'hanshin': 30},
}

homerun_dict_sorted = sorted(homerun_dict.items(), key=lambda x:x[1]['home_team'], reverse=True)

print(homerun_dict_sorted)
# [
#   ('zoomzoom', {'home_team': 30, 'kyojin': 6, 'hanshin': 30}),
#   ('koshien', {'home_team': 20, 'kyojin': 18, 'hiroshima': 12}),
#   ('tokyo_dome', {'home_team': 10, 'hiroshima': 20, 'hanshin': 8})
# ]
```
## 参考
* [Pythonの辞書のリストを並び替える](https://qiita.com/yousuke_yamaguchi/items/23014a3c8d8beb8ba073)
* [Python: sort this dictionary (dict in dict) -stack overflow](https://stackoverflow.com/questions/4331892/python-sort-this-dictionary-dict-in-dict)
Latex における箇条書の途中に文章を入れる方法

## 背景
Latex において箇条書をする際に箇条書の item ごとに文章を入れたくて調べて自分のメモのために残しておく。

## 今回やりたいことの例
- A  
これはAです。
- B  
これはBです。  

## Latex でこのように記載する方法

```
\begin{itemize}
   \item A \mbox{}\\
   これは A です。
   \item B \mbox{}\\
   これは B です。 
  \end{itemize}
```
このようにitem の後ろに\mbox{}\\を入れることによって↑のような箇条書の途中で文章を入れることが出来ました。

## 参考資料
http://www.yamamo10.jp/yamamoto/comp/latex/make_doc/item/item.php

## 感想
markdownの場合は半角スペースで書けたけど, Latexの場合半角スペースでうまくいかなくて困ったからメモ代わりに投稿
bootstrap-datepickerをimportして使う

importが理解できてないんのもあって、npmインストールした後どう使うのかなと思ったら以下で動いたのでメモしておきます。

```JS
import 'bootstrap-datepicker';
import 'bootstrap-datepicker/dist/locales/bootstrap-datepicker.ja.min.js'
```

Typescriptで使うため以下もインストール。

```JS
@types/bootstrap-datepicker 
```

下記でdateタイプのテキストボックスに適用しました。

```TYPESCRIPT
$('input[type="date"]').datepicker({
        format:'yyyy-mm-dd',
        language:'ja',
        beforeShowDay: (date)=>{

            const custumdate = {classes:''}

            switch(date.getDay()){
                case 0: //Sun
                    custumdate.classes = 'sunday';
                    break;
                case 6: //Sat
                    custumdate.classes = 'saturday';
                    break;
            }
            
            return custumdate;
        }
    });
```

HTML5のカレンダーアイコンを以下のCSSで非表示に

```css
input[type="date"]::-webkit-calendar-picker-indicator { 
  display: none; 
}
```
対応ブラウザをIEからChromeに変更する時の注意点その２(size 属性)

# 対応ブラウザをIEからChromeに変更する時の注意点その２(size 属性)

対応ブラウザをIEからChromeに変更する時の注意点について備忘録的に記載します。

# 発生問題点
input type text を size 属性でサイズを指定した場合、IEとChromeで違いが発生する(ブラウザにより size 属性の解釈が異なる)


# 環境
* <font color="Green">__OSはWindows10__</font>
	* バージョン：1909(OS ビルド 18363,1256)

* <font color="Green">__Microsoft Internet Explorer__</font>
	* バージョン：11.1198.18362.0

* <font color="Green">__Google Chrome__</font>
	* バージョン：87.0.4280.141(Official Build) (64ビット)

# 解決方法
size 属性の値を調整する。
又は、size 属性は使用せずに

```
<input type="text" style="width:300px;">
```

のようにwidthをピクセル指定する。

# size 属性で指定した場合とwidthをピクセル指定にした場合の画面イメージ
* <font color="Green">__IEでの表示__</font>
![IE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701538/6b6d2f03-bd42-cbeb-55c5-2aefe9827f43.png)

* <font color="Green">__Chromeでの表示__</font>
![chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701538/c14fed5c-c972-516b-aaaf-1f0dac2a1dab.png)

※size 属性で指定するとIEとChromeでtextの幅が異なるが、widthをピクセル指定するとIEでもChromeでも同様の表示となる。

# 使用ソース
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>inputタグのsize属性とwidth</title>
</head>
<style>
body {
  margin: 0;
  padding: 0;
}
th {
  width: 150px;
}
input {
  background:#CCCCCC;
}
</style>
<body>
<form action="#" method="post" id="customerIpt">
<table>
<tr><th>size属性：50</th><td><input type="text" name="txt1" size="50" value="１２３４５６７８９０１２３４５６７８９０１２３"></td></tr>
<tr><th>width：300px</th><td><input type="text" name="txt1" style="width: 300px;" value="１２３４５６７８９０１２３４５６７８９０１２"></td></tr>
</table>
</form>
</body>
</html>
```
【Docker】コマンド一覧

※`[]` 内は省略可能

- コンテナを作成し起動 [バックグラウンドで実行]

```
docker-compose up [-d]
```

- コンテナ起動（既にコンテナがある状態で）

```
docker start <コンテナ名>
```

- コンテナ停止

```
docker stop <コンテナ名>
```

- 全てのコンテナ停止

```
docker stop $(docker ps -q)
```

- コンテナ起動状況確認 [停止しているコンテナも取得]

```
docker ps [-a]
```

- イメージ実行

```
docker run <イメージ>
```

- イメージ一覧表示

```
docker images
```

- サービスのビルドを実行

```
docker-compose build
```

- 実行中コンテナ内で、新しいコマンドを実行

```
docker exec [オプション] <コンテナ> <コマンド> [引数]
```
MailCatcher 1080ポート以外で開く

# 目的

- MailCatcherのhttpポートをデフォルトから変更する方法をまとめる

# 方法

1. 下記コマンドを実行してポートを指定してMailCatcerを起動する。

    ```
    $ mailcatcher --http-port ポート番号
    ```

1. 例えば`http://127.0.0.1:1081/`でMailCatcherをブラウザ表示したいなら下記を実行する。

    ```
    $ mailcatcher --http-port 1081
    ```
OSS で Linux/macOS でペーパークラフトを作るメモ

## 背景

* なぜか無性に, 優秀な若人さまに大人気であろうペーパークラフトを制作したくなった.
* Blender で 3D モデルから作りたい
* ペパクラデザイナー https://tamasoft.co.jp/pepakura/ があるが, Windows でしか動かない

## 手順

https://www.instructables.com/Open-Source-Papercraft/

ありがとうございます.

* Blender とかでモデル作る.
* .obj でエクスポート
* MeshLab で `.obj` -> `DXF` へ変換
* `dxf2papercraft` で変換(展開 + 糊代をつける)
  * DXF! 懐かしいファイルフォーマットですね! 
* LibreOffice Writer で DXF 読んで SVG にしてエクスポート

になります!
 
### dxf2papercraft

自前でビルドが必要です.
DXF ライブラリである dime が必要になります.

あとは必要であれば dime へのパスを設定して特に問題なく make すればいけます(M1 macOS) でもいけました)

## 結果

cube, icosphere ではまあまあうまくいきますが...
(のりしろがすこしかぶっている)

![Screenshot from 2021-01-13 15-20-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/e82f9625-a5f1-b66e-7d92-334b2ea908b3.png)


![Screenshot from 2021-01-13 15-11-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/6423f793-2cf4-e2a1-d5c2-d6ea24e667c7.png)

torus とかは, face ごとになってしまいなんかだめでした

![Screenshot from 2021-01-13 15-10-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/4859bf28-972b-6a13-dd35-cc29e8cd3146.png)

## まとめ

dxf2papercraft なかなかうまくいかない.
Manifold かつローポリで作る必要がありそう.

### 代用案

Blender の UV 展開 + 手動のりしろつけがいいかもです!

https://www.instructables.com/Papercraft-With-Blender/

## TODO

* [ ] xatlas とかで .obj から直接 UV 展開して自前でのりしろ追加してみたい
* [ ] SIGGRAPH ペーパークラフト関連論文とか実装して, 優秀な若人さまのハートをがっちりキャッチしたい.
  * ちょっと毛色は違うが, Shape Representation by Zippables とか https://igl.ethz.ch/projects/zippables/
Raspberry Pi を L2TP VPN に接続する

在宅勤務などのオンライン化のために Raspberry Pi を L2TP VPN で接続したいと思ったのだがなかなか難しかったので参考になればということで記録を残します。
Linuxでの L2TP VPN への接続は strongswan などを用いて IPSec接続するような接続設定をすることもできるようだが、これだと単なるクライアント接続なのに Windows などと比べてあまりにも難しい接続方法になってしまう。そのため、試行錯誤の結果ネットワーク接続設定管理を Network Manager に変更して、Network Manager の L2TP VPN クライアントで接続することにした。

# 前提
1. Windows や macOS で接続できる L2TP VPN への接続性
1. Raspberry Pi (RaspbianOS Buster)

# 設定
1. Network Manager のインストール
<code>
sudo apt-get update; sudo apt-get upgrade;
sudo apt-get install network-manager network-manager-gnome network-manager-l2tp network-manager-l2tp-gnome libreswan 
</code>
2. Network Manager の設定
    - /etc/NetworkManager/NetworkManager.conf managed=true
3. dhcpcd の設定解除
    - /etc/network/interfaces にある Network Manager が管理するインターフェースの記述を削除 (en0,wlan0 などを削除する.削除することでdhclientによる設定がされなくなる.)
1. 再起動
4. Network Manager で接続設定
    - sudo nmtui でVPNの接続設定をする
    - メニューにシステムトレイ（nm-applet）を追加する

# 利用

1. 　VPN接続のアクティベーション
    -  sudo nmtui してVPN接続をアクティベーション 

# 残課題

1. tui からしか接続できないのはなんとかならないのか。
Laravelでサイトマップを分割する

# Laravelium/laravel-sitemapを使う

インストール方法は以下
https://github.com/Laravelium/laravel-sitemap

# サイトマップを分割する

サイトマップに関する設定は`config/sitemap.php`でもできる。
今回は個別に設定するのでコンフィグファイルはいじらない。

※`use_limit_size`はfalseのままにする。trueにするとURLが全件出力されないし、ファイル分割もされない。

```php
public static function toXml($data){
  $sitemap = \App::make('sitemap');
  $sitemap->model->setMaxSize(1000); // 1xmlあたりのURL数
  foreach ($data as $d) {
    $sitemap->add(
      $d->url,
      $d->last_modified
      $d->priority,
      $d->frequency,
    );
  }
  $sitemap->store('xml', 'sample_sitemap', '/tmp');
  //** 出力結果例 **//
  // sample_sitemap.xml <= サイトマップインデックス
  // sample_sitemap_0.xml
  // sample_sitemap_1.xml
}
```

設定するだけで分割されるので便利。
しかもサイトマップ(子)をまとめるサイトマップインデックス(親)も作成してくれるので、ファイル数が多くなってもサイトマップインデックス(親)だけSearch Consoleに登録すれば良い。便利。
シェルスクリプトでtestコマンドの代わりに簡単に数値

# testコマンド
bashで数値を比較するとき、普通は`test`コマンドを使います。  
しかしこのコマンドの比較オプションは全く直感的ではなくとてもわかりにくいです。  

|オプション|説明|補足|
|:-----------:|:------------:|:------------:|
|-eq | 等しければ真     | equal                |
|-ne | 等しくなければ真 | not equal            |
|-lt | より小なら真     | less than            |
|-le | 以下なら真       | less than or equal   |
|-gt | より大なら真     | greater than         |
|-ge | 以上なら真       | greater than or equal|

※引用: [Bash の if 文（test文）のオプションを整理してみた](https://qiita.com/wakayama-y/items/a9b7380263da77e51711)

これを覚えるのははっきり言って面倒です。  
他の言語のように`<=`や`>`を使えないのでしょうか？  

# 二重カッコを使う
[Archiso](https://gitlab.archlinux.org/archlinux/archiso)のソースコードを読んでいて偶然見つけました。

```bash
a=1000
if (( a <= 1000 )); then
    echo "aは1000以下です。"
fi
```

こんな書き方ができるんです（）
Bashで`$(( a + 10 ))`とするように変数に`$`は必要無いようです。


~~算術展開の一種なのかBashの独自構文なのか詳細はわからないです...~~
~~なので誰か詳しく知ってる方いたら教えてください。~~

# 追記
コメントで教えてもらいましたが、POSIXには無いBashやZshなどの独自機能なようです。
シェバンで`#!/usr/bin/env bash`を指定していれば問題ないと思いますが、組み込み環境などの特殊な場合は使わないほうが良さそうです。

```bash
hoge=200
if (( hoge == 200)); then
    echo "hogeは200です"
else
    echo "hogeは200ではありません"
fi
```
Dash上で実行するとエラーが出ました、正常な比較はできていませんね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234470/5efddd0d-dfe2-c357-4929-e1bc6b3f0c6f.png)
Databricks コメント機能 　～レビューが簡単、ソース開発共同しやすい～

## 																																																																																																																																					 コメント記入

ここでは、Notebook内のコメント記入について、まとめていきます。

Notebook内で他の人と作業をしていく中で、どのような作業・変更したかをコメント記入する機能が

あります。

![image-20201117114824840.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/1e721b7c-3d43-e484-aaa6-60871002bca0.png)

複数人でアクセスしていると、上記画面のようにアカウントがそれぞれ、表示されます。

ここで、コメントタブをクリックすると、コメントが記入できるスペースが表示されます。

![image-20201117115328836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/3e4dc06c-20e8-17c7-c6c5-4f7ac8f9297f.png)

コメントをするには、コメントしたいコマンドの中のソースを選択します。

選択すると、![image-20201117115415292.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/7c8e6daa-bedb-99f4-7c89-e4d9666c5eae.png)吹き出しマークが表示されますので、そちらをクリックすると、該当コマンドの右側ににコメント記入できるスレッドが表示されます。

![image-20201117115610722.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/a8e4bf73-a160-1312-cd23-5e3a733ba53e.png)

どこのことに対してのコメントかもわかりやすくなっています。

コメントの編集や削除も簡単で、アイコンをクリックして、編集可能です。

![image-20201117115822386.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/1d5a24bb-d0a4-722a-c26d-a43c5c123f85.png)

![image-20201117120026425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/9e2bc476-c11f-f46e-fbdd-60b19fac1e31.png)
編集ボタン

![image-20201117120042287.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/d54522a5-5b08-8d51-1b6d-7d951628dd80.png)
削除ボタン



以上がコメント記入についてでした。

見ていただき、ありがとうございました。

株式会社メソドロジック

川名智士
ReactiveProperty<>からの一つの判定をかませてReactiveCommandを作る覚え書き

# Listとかで選択されるとCommandが有効になるとか

**今更とか言わないで。**

例えば、

```xml
<DataGrid
    SelectedItem="{Binding SelectedData.Value, Mode=TwoWay}"
    />
<Button
    Command="{Binding ItemSelectedCommand}"
    Content="Execute"
    />
```

みたいな。
すると、

```csharp
public ReactiveProperty<ItemData> SelectedData { get; } = new ReactiveProperty<ItemData>();
public ReactiveCommand ItemSelectedCommand { get; private set; }
```

として、

```csharp
ItemSelectedCommand = SelectedData
    .Any(data => data != null)
    .ToReactiveCommand();
```

とすればよいようだ。
なるほど。
Databricks モデル 比較

## モデルタブ モデル比較

ここでは、モデルタブのモデル比較について、まとめていきます。



実行されたモデルを比較していきます。

実行された実験結果の一覧画面を表示させます。

![image-20201119172125351.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/2924c051-f32a-a553-03c1-9cb72e50ac7b.png)

ExperimentUIボタンをクリックすると、下記の実験結果一覧画面が表示されます。

![Inkedimage-20201119172242750_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/c527b696-61cc-5893-8513-01a3557bbf0b.jpeg)



ここで、比較したいモデルを選択します。

選択すると、Compareボタンがクリックできるようになります。

![image-20201119172404752.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/722b22e7-808b-d9c8-93cb-20ae90f7a015.png)

そこで、Compareボタンをクリックすると、モデルの比較画面が表示されます。

![image-20201119172534447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/5e054fa4-df67-40da-835b-0bd9c6afa04e.png)

それぞれのRunIDや実行時間、パラメータなどが横並びに表示されます。

下の方にいくと、散布図が表示されていて、それぞれ、軸の変更なども行えるようになっています。

![image-20201119172821642.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/081cbe14-7300-06c7-7bce-2a7a13b83fc7.png)

また、カーソルをグラフ上の丸に当てると、中身が表示されます。

![image-20201119172939413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/84975152-0a53-a75a-04fc-5a03b3aefb63.png)

違う比較の画面も表示されます。

![image-20201119173026527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/9ae46a03-476d-9727-0df5-b80bd695c0b1.png)

このように、モデルの比較を可視化することができます。



以上がモデル比較についてです。

見ていただき、ありがとうございました。

株式会社メソドロジック

川名智士
QiskitでHHLアルゴリズム(aquaライブラリの回路を見る)

# qiskit aqua のHHLライブラリ
qiskit のHHLチュートリアルには、qiskit aquaのライブラリも紹介されています。
https://qiskit.org/textbook/ch-applications/hhl_tutorial.html
この回路を見てみます。

# 回路図
実は回路を抜き出すメソッドが用意されています。

```python
circ_HHL = algo.construct_circuit()
circ_HHL.draw('mpl', scale=0.5, fold=50)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/5ed52520-7a4f-0012-f2f2-d38fe8fa0274.png)

**よくわかりません。**
ブロックを読み取ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/daa839dd-0457-ecd1-8ef1-cbea51420824.png)


HHLはQPE→固有値逆回転→QPE†→射影測定　です。
固有値逆回転の実装がきついと考えられますが、この回路を見ても青色部分のゲートが非常に長くなっています。


# 結論
HHLのゲート部分の課題は固有値逆回転
（QPEが楽だとはいっていない。）
Databricks　Notebook複数人コラボレーション

## Databricks Notebook 複数人でアクセス

ここでは、Notebook内のコラボレーション機能について、まとめていきます。



自分が作業しているNotebookを他の方に連携することで、複数人でアクセスすることができ、同時に編集などを行う

ことができます。

NotebookのURLもしくはファイルを他の人に連携して、その人が該当Notebookをimportすると、同時に見れたりします。

![image-20201116184624859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/7ffd5f38-c9f6-76c0-a3a6-3bac7133d6a1.png)


①4人のアカウントが表示されています。

②コマンドには、それぞれ、どこを編集しているのかなどが見れるようになっています。

③コメントが自由に記載できるようになっています。

​	

**コラボレーション機能**

まず、ホーム画面上で、右の方にある人マークをクリックします。

プルダウンでいろいろ表示された中にある管理コンソールをクリックして、遷移します。

![image-20201117105352134.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/4aaa04e0-5b3a-5746-fed5-d3ec08263b73.png)


画面遷移して、管理コンソールの画面が表示されます。

![Inkedimage-20201117105651120_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/1b70aec8-96f4-fa50-5f5b-d2efdc3efd74.jpeg)




ユーザーの追加ボタンをクリックします。

![Inkedimage-20201117105744133_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/9ad8ed2e-99f3-21a0-351e-2282f3dd8d1c.jpeg)




追加したい、ユーザーのメールアドレスを入力して、招待を送るボタンをクリックすると、記入したメールアドレス宛に招待メールが

送信されます。

**※Community Edition版ですと、自分含めて3人がユーザーになれます。**

​	**ただし、Databricksアカウントは必須。**



招待メールを送信すると、下の画面が表示されます。

![Inkedimage-20201117110243005_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/248fd696-448e-69d3-9ab2-64928718ca09.jpeg)




追加されると、管理コンソール画面にユーザーが追加されて表示されます。

![Inkedimage-20201117113817869_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/67b9ab8d-39de-4fe9-f5bb-10ae254fe87e.jpeg)




招待されると、招待されたWorkspaceが表示されます。

![image-20201117113941715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/817530/ac8c27c0-9526-f292-0657-277c0fe9c105.png)

ここで、Workspaceの切り替えができ、自分のWorkspaceと招待されたWorkspaceで編集や実行が可能になります。



以上が複数人でのアクセスするコラボレーション機能でした。

見ていただき、ありがとうございました。

株式会社メソドロジック

川名智士
WindowsからMacOSをSSH経由でシャットダウンさせる

リモートで作業中に切断され、復旧できなかったときに（仕方なく）再起動する方法を残す。

環境
・Windows10(接続元)
・Mojave10.14.6（接続先）

## 前提
MacOSは「リモートログイン」の設定（システム環境設定→共有）を行っていること。

## 作業
・Windows10から下記コマンドを実行する

```powershell
c:¥>ssh -l (Login名) (IPAddress)
```

途中Yes/Noとパスワードを聞かれる。

```powershell
・・・
Are you sure you want to continue connecting (yes/no)? yes
Password:(パスワード入力)
```

ログインしたら、続けて下記のコマンドを実行することでシャットダウン（再起動）する

```powershell
(host名):~ (Login名)$ sudo shutdown -r now
Password:(パスワード入力)
```

成功したら下記メッセージが出る

```powershell
Shutdown NOW!!
```
belongs_to, has_many 関連付けの :foreign_keyオプションのデフォルト設定

- belongs_toの:foreign_keyオプション

Railsのデフォルトでは、このモデルの外部キーを保持するカラム名は、***関連付け名に_idを付けたもの***と想定している。
![belongs_to.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282477/23ff8aec-9550-fa02-c4f0-746a387b716c.png)

- has_manyの:foreign_keyオプション

Railsのデフォルトでは、（関連の）相手方モデルの外部キーを保持するカラム名は、***こちらのモデル名に_idを付けたもの***と想定している。
![has_many.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282477/90cb2461-92a3-04b7-6eeb-5b5740dc2f69.png)

参考：[Rails Guides Active Record Association](https://guides.rubyonrails.org/association_basics.htm)
ubutuをダウンロードするときにISOファイルとTorrentファイルがあったので。


以下がインストールサイト
https://www.ubuntulinux.jp/download

日本語・・・の方を選択

ネットで聞きたいことの答えになりそうなのがあったので以下に記憶

---
BitTorrentですね。いわゆるP2Pの手法の一つです。でもビビるようなものではないですよ。
ただ、BitTorrentを使う場合は、最初にソフトをインストールする必要がありますので、
回線が高速であればisoファイルを直接ダウンロードした方が簡単でしょう。

BitTorrentの使い方は、まず
http://www.bittorrent.com/download
ここからWindows用インストーラーを入手してインストールします。最新はv5.0.8のようです。

次に、ubuntuのtorrentファイル（小さいファイルです）をダウンロードして
そのファイルをクリックすると、自動的にBitTorrentが起動して本来のisoファイルのダウンロードが始まります。

要はダウンロード方法の違いです。P2Pを利用すると大本のサーバーの負担は減りますが、回線を流れる
データ量が増えすぎるということで、制限をかけているプロバイダもありますのでご注意ください。

----
カスタムデータ属性について

#カスタムデータ属性とは？
HTML5で新しく導入された、html要素に、カスタムデータと呼ばれる、独自の属性を指定する属性。
オリジナルの属性も作成できる。
カスタムデータ属性の名前は常に**data**から始まる。
各種スクリプトで動的に使用可能であり、主にJavaScriptやjQueryで値を取得するときに使用されることが多い。

```
<div class="tweet" data-genre="movie">
属性名：data-id
属性値：tweet.id
```

本来的に、HTMLのclass属性の目的は、データを格納するためではなく、開発時にCSS等のスタイル情報を割り当てるため。
しかし、要素への情報が増えるたびに、その都度新しいクラスを追加する必要が出てきてしまう。
そうなると、JavaScriptで実際に必要な情報を取り出すことが難しくなる。
そのような背景のもと、HTML5で新たに導入された。

#カスタムデータ属性のルール
HTMLでカスタムデータ属性を設定するルールは次のようなものがあります。

- [x] **data**以降に属性名を指定する
- [x] 属性名に使用できるのは、文字、数字、-(ハイフン)、.(ドット)、_(アンダースコア)のみで、大文字は使用できない
- [x] 属性値は数字も文字列も使用できるが、慣例的に小文字の使用が大半
- [x] class名を属性名として格納することはできない(データ属性を扱うのは、他に適切なHTML要素や属性がない場合だけに限るべきだから)

#JavaScriptでの使い方
##データ属性の取得

```
<div id="tweet" data-genre="movie"></div>
<script>
    var result = document.getElementById("tweet");
    var dataset = result.dataset;
    console.log(result);
</script>
```

実行結果

```
movie
```

##データ属性の変更

```
<div id="tweet" data-genre="movie"></div>
<script>
    var result = document.getElementById("tweet");
    result.dataset.genre = 'movie';
    console.log(result);
</script>
```

実行結果

```
movie
```

#jQueryでの使い方
##データ属性の取得
`対象要素.data( 属性名 )`のように、引数へdata属性名を指定する。

```
<div class="tweet" data-genre="movie"></div>
<script>
    const result = $(".tweet").data('genre');
    console.log(result);
</script>
```

実行結果

```
movie
```

##データ属性の変更

```
<div class="tweet" data-genre="movie"></div>
<script>
    const result = $(".tweet").data('genre', 'movie');
    console.log(result);
    const result = $(".tweet").data('genre', 'music');
    console.log(result);
</script>
```

実行結果

```
movie
music
```
【Laravel AdminLTE】URLが前方一致する場合、left sidebarがactiveになるようにする

# 手順
1. ViewComposerを導入する
2. 「adminlte::partials.sidebar.menu-item」で使用するviewcomposer「SidebarMenuItemComposer」を作成する
3. $item['class']に「active」が追加されるようにする
4. 「SidebarMenuItemComposer」を「adminlte::partials.sidebar.menu-item」に関連付ける

# 以下コード

``` /app/Http/ViewComposers/SidebarMenuItemComposer.php
<?php

namespace App\Http\ViewComposers\User\Worker;

use Auth;
use Illuminate\View\View;

/**
 * Class ModalSearchCemeteryComposer
 * @package App\Http\ViewComposers\User\Worker
 */
class SidebarMenuItemComposer
{
    /**
     * @param View $view
     */
    public function compose(View $view)
    {
        // 現在のページに応じて左メニューをactiveにする
        $path = request()->path();
        $host = request()->getHttpHost();
        $http = $this->isSsl() ? 'https' : 'http';

        $item = $view->getData('item'); 
        $pattern = str_replace($http.'://'.$host.'/', '', $item['item']['href']);
        if (!$item['item']['active'] && ($pattern === $path || strpos($path, $pattern.'/') === 0)) {
            $item['item']['class'] .= ' active ';
        }
        $view->with(['item' => $item['item']]);
    }

    //Webサーバー毎にキーと値で判別
    private function isSsl()
    {
        if (isset($_SERVER['HTTPS']) === true ) // Apache
        {
            return ($_SERVER['HTTPS'] === 'on' or $_SERVER['HTTPS'] === '1' );
        }
        elseif (isset($_SERVER['SSL']) === true ) // IIS
        {
            return ($_SERVER['SSL'] === 'on' );
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) === true ) // Reverse proxy
        {
            return (strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https' );
        }
        elseif (isset($_SERVER['HTTP_X_FORWARDED_PORT']) === true ) // Reverse proxy
        {
            return ($_SERVER['HTTP_X_FORWARDED_PORT'] === '443' );
        }
        elseif (isset($_SERVER['SERVER_PORT']) === true )
        {
            return ($_SERVER['SERVER_PORT'] === '443' );
        }

        return false;
    }
}
```

``` /app/Providers/ViewComposerServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;

class ViewComposerServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        View::composers([
            \App\Http\ViewComposers\User\Worker\SidebarMenuItemComposer::class => 'adminlte::partials.sidebar.menu-item',
        ]);
    }
}

```
VNC Viewerを修復

# はじめに
有線接続やら無線接続やらの設定をいじってたら、なんだかVNC Viewerの調子が悪くなってしまったので、
直せないかと考えた。

# 直し方
<ol>
<li> VCN Viewerの[公式サイト](https://www.realvnc.com/en/connect/download/viewer/)から再インストール（このとき元々あったViewerは消していない）
<li> .exeファイルを実行
<li> 3つの項目のどれにするか聞いてくるので、`repair`を選択
<li> 終了
</ol>

# まとめ
案外あっけなかった。
調子がもとに戻りました。よし。
openURLを使って指定されたWebページを開く方法

#目次
1. はじめに
2. 実装方法
3. まとめ

#はじめに
Konyで開発したアプリから、
アプリをアップデートするためにAppStoreに飛ばしたり、
場所を表示するためにマップを開かせるような機能を実装することがあるかと思います。

今回は、iOS、Androidで指定されたWebページを開く方法についてご紹介したいと思います！

#実装方法
####**①画面の作成**
今回は、サンプルとしてアプリ上で場所が表示されており、
地図アイコンをタップするとその場所がマップで表示されるようなアプリを作成したいと思います。

このような画面を作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/f51d71e8-6478-04c9-6594-6b242c526f81.png)

右にある黄緑色の地図アイコンボタンをタップすると、マップアプリに移動し、**東京駅**の場所を表示します。

####**②コーディング**
Form1Controllerのコーディングを行います。

```Form1Controller.js
define({ 
 //iPhoneの場合
 openMapsApp: function(){
    var mapURL = "http://maps.apple.com/";
    var lat = "35.6809591";
    var long = "139.7673068";
    if (lat && long) {
      mapURL = mapURL + "?q=" + lat + "," + long;
    }
    kony.application.openURL(mapURL);
  },

  //Androidの場合
  openGoogoleMapsApp: function() {
    var mapURL = "https://www.google.com/maps/search/?api=1";
    var lat = "35.6809591";
    var long = "139.7673068";
    if (lat && long) {
      mapURL = mapURL + "&query=" + lat + "," + long;
    }
    kony.application.openURL(mapURL);
  }, 
  
  // iPhoneかAndroidか判断
  openMap: function(){
    //#ifdef iphone
    this.openMapsApp();
    //#else
    this.openGoogoleMapsApp();
    //#endif
  }
 });
```
上を説明します。
**let**：緯度
**long**：経度
ここでは東京駅の緯度経度を表しています。
緯度と経度の調べ方は[こちら](https://www.geocoding.jp/)を参考にしてください。

**kony.application.openURL（URL）**：このAPIは指定されたURLでWebページを開きます。
今回はマップアプリのURLと緯度と経度を組み合わせたURLでWebページを開いています。

**#ifdef iphone**：デバイスごとの条件分けを行うことができます。
今回はiPhoneの場合、`this.openMapsApp();`を実行し、
それ以外の場合は、`this.openGoogoleMapsApp();`を実行します。

####**③Actionの紐付け**
関数の準備ができたらActionと紐づけていきます。
btnSearchを選択し、ActionタブからonClickのEditをクリックしてActionの紐づけを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/21c076ad-95a2-f344-226f-e92d12cd2030.png)

ここまでで、マップ（iOS）/Google Maps（Android）を開くための実装が完了しました。
実際にどうなるかみていきましょう！

####**④実装の確認**
**iPhone**
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/UQhrtlXCjP">pic.twitter.com/UQhrtlXCjP</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1349228637287976964?ref_src=twsrc%5Etfw">January 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
**Android**
<blockquote class="twitter-tweet"><p lang="und" dir="ltr"><a href="https://t.co/CJsELy80SX">pic.twitter.com/CJsELy80SX</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1349236154646765569?ref_src=twsrc%5Etfw">January 13, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

マップアプリに移動して、東京駅の位置を表示していることが分かりますね！

#まとめ
今回は、openURLを使って指定されたWebページを開く方法について説明しました。
みなさんもぜひ活用してみてくださいね:wave:

#参考
kony.application.openURL（URL）：
https://docs.kony.com/konylibrary/visualizer/viz_api_dev_guide/content/kony.application_functions.htm#kony.app4

緯度と経度の出し方：
https://www.geocoding.jp/
Bitnami Mantis のDBリストアについて



##DBのリストア
テーブルがすでに存在するということで、怒られる

```
>mysql -u root -p bitnami_mantis < bitnami_mantis.sql
Enter password: ********
ERROR 1050 (42S01) at line 30: Table 'mantis_api_token_table' already exists
```

##DB再作成
DBへ接続、DROP、確認

```
>mysql -u root -pパスワード
mysql> drop database bitnami_mantis;
Query OK, 32 rows affected (0.36 sec)
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)
mysql> quit
Bye
```
##DB作成
```
mysql> create database bitnami_mantis;
Query OK, 1 row affected (0.01 sec)

mysql> quit
Bye
```

##DUMPをリストア
```
>mysql -u root -pパスワード -D bitnami_mantis < bitnami_mantis.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
```


#＃参考）
データのみバックアップ

`>mysqldump -u root -pパスワード -t bitnami_mantis > hogehoge.dump`

リストア（なんかエラーが出る）

```
>mysql -u root -p bitnami_mantis < hogehoge.dump
Enter password: ********
ERROR 1062 (23000) at line 33: Duplicate entry '1' for key 'mantis_bug_file_table.PRIMARY'
```
iostat

I/Oの状況を確認できる。

```
# iostat
Linux 3.10.0-862.3.3.el7.x86_64 (testserver)      2021年01月13日  _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.06    0.00    0.08   99.82

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
xvda              0.37         0.01         2.19     265225   55131237
dm-0              0.00         0.00         0.01       9237     209248
dm-1              0.00         0.00         0.00       2252          0
dm-2              0.16         0.01         1.10     132542   27609766
dm-3              0.00         0.00         0.00       5201       2068
dm-4              0.18         0.00         1.08      85340   27148675
dm-5              0.00         0.00         0.01       3450     159390
```
細かく確認するには -x をつけると良いらしい。

```
# iostat -x
Linux 3.10.0-862.3.3.el7.x86_64 (testserver)      2021年01月13日  _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.04    0.00    0.06    0.00    0.08   99.82

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.00     0.03    0.00    0.37     0.01     2.19    11.93     0.01   14.71    8.00   14.72   4.91   0.18
dm-0              0.00     0.00    0.00    0.00     0.00     0.01     9.94     0.00   12.08    7.10   12.15   9.57   0.00
dm-1              0.00     0.00    0.00    0.00     0.00     0.00    36.32     0.00    0.44    0.44    0.00   0.31   0.00
dm-2              0.00     0.00    0.00    0.16     0.01     1.10    13.82     0.00   19.91    6.51   19.93   5.49   0.09
dm-3              0.00     0.00    0.00    0.00     0.00     0.00    52.30     0.00   19.06   10.32   56.13   4.08   0.00
dm-4              0.00     0.00    0.00    0.18     0.00     1.08    11.82     0.00   16.28   11.61   16.28   4.96   0.09
dm-5              0.00     0.00    0.00    0.00     0.00     0.01     7.02     0.00    9.83   21.69    9.78   9.45   0.00
```
過去にディスクのI/O性能が原因で問題が発生した時、
%iowait の値が尋常ではなかった気がする。

## 参考
[IOSTATの見方](http://wktm.jp/archives/901)

＜抜粋＞
%util はディスクのビジー率を表していて100%が上限。
ディスクの性能がボトルネックになっているか確認したいときに使える。

ディスクがボトルネックになっているような場合は下記のような状態になる時です。
下記になっていないかをチェックするにはiostatコマンドを使用します。
・CPU 使用率の %iowait が %user よりも高くなる。
・avgqu-sz（平均I/Oキュー数）が高い。
・%utilが 100%に近づいている。
　この値はI/Oオペレーション数と平均レスポンスタイムをかけて、秒数で割ったもの。
vueのrouterの設定

# vue-router
vue-routerを使ってみよう！備忘録

## ファイル構成

![スクリーンショット 2021-01-13 13.26.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321986/806116a4-bfea-a459-fe7e-35a9c78dcae5.png)

今回関係あるファイル

- route.js
- main.js
- App.vue
- pages
    - A.vue
    - B.vue
- components
    - PageContent.vue

## App.js

template内にrouter-linkを設置

```vuejs

<template>
  <div id="app">
    <router-link to="/a">go to A</router-link>
    <span>｜</span>
    <router-link to="/b">go to B</router-link>
    <router-view></router-view>
  </div>
</template>
```

## PageContent.vue
```vuejs

<template>
  <div class="hello">
    <h1>{{ msg }}</h1>
    <p>ページの内容をそれぞれ表示するためのコンポーネント</p>
  </div>
</template>

<script>
export default {
  name: "PageContent",
  props: {
    msg: String
  }
};
</script>
```

## A.vue
```vuejs

<template>
  <div id="app">
    <PageContent msg="A" />
  </div>
</template>

<script>
import PageContent from "@/components/PageContent";

export default {
  name: "A",
  components: {
    PageContent
  }
};
</script>
```

## B.vue
```vuejs

<template>
  <div id="app">
    <PageContent msg="B" />
  </div>
</template>

<script>
import PageContent from "@/components/PageContent";

export default {
  name: "B",
  components: {
    PageContent
  }
};
</script>
```

## route.js

```js

import Vue from "vue";
import VueRouter from "vue-router";
import A from "@/pages/A";
import B from "@/pages/B";

Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    component: A,
  },
  {
    path: "/a",
    component: A,
  },
  {
    path: "/b",
    component: B,
  },
];

const router = new VueRouter({
  routes: routes,
});

export default router;

```

## main.js
```js

import Vue from "vue";
import App from "./App.vue";
import router from "./route.js";

Vue.config.productionTip = false;

new Vue({
  router,
  render: (h) => h(App),
}).$mount("#app");
```

参考🙏：
Vue Routerの書き方、使い方について解説
https://www.e-loop.jp/knowledges/14/
ビット操作メソッド三題（Ruby）



正統的なビット操作の話ではありません。

Ruby を使っているとビット操作はあまり必要なのだが、競技プログラミングをやっていたりすると時にはビット操作したくなることもある。で、Ruby をあらためて見てみると（当り前だが）ビット操作も一通り揃っているわけだ。競プロで便利だなと思うのは例えば「ビットの立っている」ものを数える、つまり整数を二進数表現に直して "1" の数を数えるというもので、Ruby では

```ruby
to_s(2).chars.count { _1 == "1" }
```

と簡潔に書ける。
　また、いわゆる「ビット全探索」は、Ruby ではビットを使わなくても簡単に書ける。「ビット全探索」でよく使われるのが部分集合の列挙で、例えば、`[0, 1, 2, 3, 4]`のすべての部分集合を列挙する場合は、

```ruby
ary = [0, 1, 2, 3, 4]
co = 0
(0..ary.size).each do |i|
  ary.combination(i) do |sub_set|
    p [co, sub_set]
    co += 1
  end
end
```

などと書ける。結果は

```
[0, []]
[1, [0]]
[2, [1]]
[3, [2]]
[4, [3]]
[5, [4]]
[6, [0, 1]]
[7, [0, 2]]
[8, [0, 3]]
[9, [0, 4]]
[10, [1, 2]]
[11, [1, 3]]
[12, [1, 4]]
[13, [2, 3]]
[14, [2, 4]]
[15, [3, 4]]
[16, [0, 1, 2]]
[17, [0, 1, 3]]
[18, [0, 1, 4]]
[19, [0, 2, 3]]
[20, [0, 2, 4]]
[21, [0, 3, 4]]
[22, [1, 2, 3]]
[23, [1, 2, 4]]
[24, [1, 3, 4]]
[25, [2, 3, 4]]
[26, [0, 1, 2, 3]]
[27, [0, 1, 2, 4]]
[28, [0, 1, 3, 4]]
[29, [0, 2, 3, 4]]
[30, [1, 2, 3, 4]]
[31, [0, 1, 2, 3, 4]]
```

となって、確かにすべての部分集合が列挙されている（空集合を含む場合）。Ruby の組み込みメソッドにないのが不思議なくらいだが、これはだから

```ruby
class Array
  def each_subset(empty_set=true)
    if block_given?
      n = empty_set ? 0 : 1
      (n..size).each do |i|
        combination(i) { yield _1 }
      end
    else
      to_enum(__method__, empty_set)
    end
  end
end
```

とでもして Array クラスに追加してやったらよい。で、上のと同じ結果を得ようと思えば

```ruby
[0, 1, 2, 3, 4].each_subset.with_index do |ary, i|
  p [i, ary]
end
```

とでもすればよいのである。これがあったら競プロに便利だろうね。組み込みに追加されないかね。

#本題っぽいもの
で、以下が本題というほどでもないのだが、Ruby にビット操作メソッドを三つ追加してみた。いずれも実用性はないものと考えられ、たんなる遊び。
こんな感じである。

```ruby
class Integer
  def each_bit
    if block_given?
      to_s(2).chars.reverse.map { _1 == "1" }.each { yield _1 }
    else
      to_enum(__method__)
    end
  end
  
  def bit_reverse
    to_s(2).chars.reverse.join.to_i(2)
  end
end

class Array
  def to_i
    map { _1 ? "1" : "0" }.reverse.join.to_i(2)
  end
end
```

まず、`Integer#each_bit`はビットごとにブロックを実行し、ブロック変数にはビットが 1 なら`true`、0 なら`false`が入るというもの。

```ruby
0b10101101.each_bit { p _1 }
```

を実行すると

```
true
false
true
true
false
true
false
true
```

が出力となる。下位ビットから実行されていくのに注意。だから最後は必ず`true`になる。

```ruby
173.each_bit.map(&:itself)    #=>[true, false, true, true, false, true, false, true]
0.each_bit.map(&:itself)      #=>[false]

173.to_s(2)    #=>"10101101"
```

など。
　

`Array#to_i`はこれの反対。配列の中身で真のものを 1、偽のものを 0 として二進表現と見做し、Integer に変換する。これも配列の左から下位ビットに詰められていくのに注意。

```ruby
[true, false, true, true, false, true, false, true].to_i    #=>173
[:a, nil, 1, -1, 1 == 0, 1.integer?, 0.1 < 0, true].to_i    #=>173
173.each_bit.map(&:itself).to_i    #=>173
```
　

`Integer#bit_reverse`はテキトーに思いついたもの。Integer のビットを左右反転させた Integer を作る。まぎらわしいが、ビット反転（否定、`Integer#~`）とは全然ちがうのです。

```ruby
173.bit_reverse    #=>181
173.to_s(2)    #=>"10101101"
181.to_s(2)    #=>"10110101"
```

なお、`bit_reverse.bit_reverse`は必ずしも元に戻らないので注意（わかりますね？）。
　

おそまつ様でした。
AndroidでSIMの電話番号を取得する方法

##AndroidでSIMの電話番号を取得する方法
作成しているAndroidアプリで、SIMの電話番号を取得する必要性があり調べましたので、ここに備忘録としてまとめたいと思います。

##利用するクラス：TelephonyManagerクラス
TelephonyManagerクラスを用いることで、Androidの電話番号やSIMのシリアルナンバーなどの情報を取得することができます。

##利用するメソッド

TelephonyManagerクラスでは主に以下のクラスで各情報を取得することができます

| メソッド | 取得できる情報 |
|:-:|:-:|
|  getLine1Number | 電話番号  |
|  getDeviceId |  デバイスID |
|  getSimSerialNumber | SIMのシリアル番号 |
|  getSimState	 | SIMの状態(通信可能か、PINロックされているかなど)  |

※他にもあるようですので、必要に応じて調べてみてください。

##STEP1: パーミッション
端末の情報を取得するにはマニフェストで「READ_PHONE_STATE」のパーミッションが必要です。

```java:AndroidManifest.xml
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
```

##STEP2: TelephonyManagerクラスをインスタンス化

```java:MainActivity
private void checkPhoneState{
  //STEP1
  TelephonyManager mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
}
```

##STEP3: 取得したい情報のメソッドを利用

```java:MainActivity
private void checkPhoneState{
  //STEP1
  TelephonyManager mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);

　//STEP2
 System.out.println("電話番号:" + mTelephonyManager.getLine1Number());
 
}
```

##まとめ
・取得したい情報とそのメソッドを見つけましょう
・「READ_PHONE_STATE」をパーミッションしましょう
・TelephonyManagerクラスをインスタンス化しましょう
・TelephonyManagerのメソッドを利用して、取得したい情報を取得しましょう
belongs_to関連付けのforeign_keyオプション（Rails Guide自分用訳）

- [Rails Guide](https://railsguides.jp/association_basics.html#belongs-to%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%81%AE%E8%A9%B3%E7%B4%B0)

Railsの慣例では、相手のモデルを指す外部キーを保持しているjoinテーブル上のカラム名については、その`モデル名にサフィックス_idを追加した関連付け名`が使われることを前提とします。:foreign_keyオプションを使えば、外部キーの名前を直接指定できます。

---
- [Rails Guide（原文）](https://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference)

By convention, Rails assumes that the column used to hold the foreign key on this model is `the name of the association with the suffix _id added`. The :foreign_key option lets you set the name of the foreign key directly:

---
- 自分用訳

Railsの慣例では、このモデルの外部キーを保持するカラム名は、`関連付け名に接尾辞の_idを付けたもの`と、想定している。:foreign_keyオプションを使えば、外部キーを保持するカラム名を指定することができる。

---

Railsが慣例で想定しているforeign_key

```
class Book < ApplicationRecord
  belongs_to :author(, foreign_key: author_id)
end
```

---

関連付け名に__idをつけたforeign_keyをRailsは想定しているので、下の例では :foreign_keyオプションが必要となる。

```
class Book < ApplicationRecord
  belongs_to :author, class_name: "Patron",
                        foreign_key: "patron_id"
end
```
Expression is missing operator (IS, IS NOT) with null value (CakePHP4)


## このエラーに悩んでいた。

```
Expression is missing operator (IS, IS NOT) with null value
```


## 原因

存在しないカラムに対して参照しようとしていた。

![ 2021-01-13 13.37.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/7be1e9ab-d35b-4e41-6fc2-35d5daf4710f.png)

こんなテーブルに対して、このようなコードを書いていた。

```
$users_shop = $this->UsersShops->find('all')->where(['user_id is NULL'])->first();
```

## 対応
ただのタイポなのに大げさなエラーが出る。

```
$users_shop = $this->UsersShops->find('all')->where(['users_id is NULL'])->first();
```
Laravel で画像サイトマップを作る

# Laravelium/laravel-sitemapを使う
インストール方法は以下
https://github.com/Laravelium/laravel-sitemap

# サンプル

add関数の第5引数が画像サイトマップ用の値。
公式には見当たらなかったのでメモ。

```php

public function toXmlFile(){
  $sitemap = \App::make('sitemap');
  $sitemap->add(
    "http://sample.com/spot/1",  // page url
    "2021-01-12T00:00:00+00:00", // last modified
    0.6,                         // priority
    "yearly",                    // frequency
    [                            // 画像サイトマップの設定
      [
       'url' => "http://sample.com/spot/1.jpg",
       'title' => "サンプルタイトル",
       'caption' => "このサンプルは日本語",
       'geo_location' => "東京都、新宿区",
       'license' => "http://sample.com"
      ]
    ]
  );
}

```
BOOO‐Postgres


【PostgreSQL の COPY コマンドを使いこなす】
http://everything-you-do-is-practice.blogspot.com/2017/10/postgresql-copy.html

【PostgreSQLのよく使うコマンドまとめ】
https://dev.classmethod.jp/articles/postgresql-organize-command/

【DBのcode】
db2 get db cfg for testdb|grep -i code
[PHP]try-catch-finallyのfinally句で、syntax errorが出る原因

PHPのtry-catch-finally文の、finally句でsyntax errorが出た。
エラー内容は以下のような感じ。

```
PHP Parse error:  syntax error, unexpected '{' （以下省略）
```

パッと見間違ってないし、finally句を除くと処理がうまくいく。

調査を続けたところ、finally句は、PHP5.5より前のバージョンだと、使えないらしい。

対象サーバのPHPのバージョンを確認してみる

```
$ php -v
PHP 5.3.3 (cli) (built: Jul  9 2015 17:39:00)
（以下省略）
```

PHPのバージョンが5.3.3・・?
5.5より古いやないかい！

PHPのバージョンが7以上のサーバで実行したところ、うまくいきましたとさ！

## 結論
PHPのtry-catch-finallyのfinally句で、syntax errorが出た場合は、バージョンが5.5より前のバージョンでないか確認 ＆ 該当の場合はfinally句は使わないようにすべし！

## 参考
* [finally exception gives an error php [closed] | stack overflow](https://stackoverflow.com/questions/13690393/finally-exception-gives-an-error-php)
[memo]innerHTML

#innerHTML について

``innerHTML``を使用すると、HTML要素の取得や書き換えを行うことができます。
例えば、以下のように指定した要素の文字列を取得・操作することができます。

```html:html
<div class="contents" id="apple">りんご</div>
```

```javascript:javascript
const apple = document.getElementById("apple")

console.log(apple)
// => <div class="contents" id="apple">りんご</div>

console.log(apple.innerHTML)
// => りんご

apple.innerHTML = "青リンゴ"
console.log(apple.innerHTML)
// => 青リンゴ
```

``apple.innerHTML = "青リンゴ"``の意味は
apple.innerHTML へ　青リンゴ　を定義するというようなもの。これにより
``console.log(apple.innerHTML)``を実行すると``青リンゴ``が出力される
Apex 予約語一覧

Apex開発で変数名に使用できない予約語一覧です。

||||||||||
|---| --- | --- | --- |--- |---|---|---|---|
|A|abstract|activate |and|any|array|asc|autonomous|
|B|begin|blob|break|bulk|by|byte| 
|C|case|cast|catch|char|class|collect|commit|
||const|continue|currency|
|D|date|datetime|default|delete|desc|do|double|
|E|else|end|enum|excecption|exit|export|extends|
|F|false|final|finaly|float|for|global|goto|group|
|H|having|hint|
|I|if|impriments|import|in|inner|insert|instanceof|int|
||integer|interface|into|
|J|join|
|L|like|limit|list|Long|loop|
|M|map|merge|
|N|new|not|null|nulls|number|
|O|object|of|on|or|outer|override|
|P|package|parallel|pragma|private|protected|public|
|R|retrieve|return|rollback|
|S|select|set|short|sObject|sort|static|string|super|
||switc|synchronize|system|
|T|testmethod|then|this|throw|time|transaction|trigger|true|
||try|
|U|undelete|update|upsert|using|
|V|virtual|void|
|W|webservice|when|where|while|

以下識別子として使用可能なキーワード。

`after
before
count
excludes
first
includes
last
order
sharing
with`
SSHでローカルファイルをアップロードの流れ

#Mac
サーバー環境によっては、セキュリティー上FTPソフトでのファイル転送ができないことがあります。
その際、ターミナルなどのCLIを使ってのファイルの転送をする流れを紹介します。
※ Mac OSを前提

##tar.gzファイル作成
**1.ターミナル.appを起動します**

**2.圧縮したいファイルやフォルダが保存されている場所に移動します**
移動する際はcdコマンドで移動していきます。

```terminal:ターミナル
$ cd ~/Desktop
```

**3.圧縮コマンドを実行します**

```terminal:ターミナル
$ tar zcvf 【圧縮後のファイル・フォルダ名.tar.gz】 【圧縮したいファイル・フォルダ名】
```

##SSHファイルアップロード
scpコマンドを使います。
`root@000.000.00.000` は `アカウント名@サーバー名`です。
`:/home/file/` はアップ先ディレクトリパス

```terminal:ターミナル
$ scp ~/Desktop/test.tar.gz root@000.000.00.000:/home/file/
```

##SSHファイルダウンロード

```terminal:ターミナル
$ scp root@000.000.00.000:/home/file/test.txt ~/Desktop/
```

##tar.gzファイル解凍
**解凍コマンドを実行します**

```terminal:ターミナル
$ tar zxvf 【圧縮したいファイル・フォルダ名.tar.gz】
```

**削除コマンドを実行します**
不要ファイル（圧縮したファイル）削除

```terminal:ターミナル
$ rm -r 【ディレクトリ名】
```
【環境構築】localからrailsのアンインストール

#はじめに
railsを誤ってlocalにインストールしてしまったので、アンインストールした時の手順を記事にしとこうと思います。

#環境
macOS Catalina バージョン 10.15.7 
Homebrew 2.7.1
rbenv 1.1.2
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
gem 3.2.4
Bundler version 2.1.4


#手順
先ず`cd`でホームディレクトリに移動します。
続いて`gem list`でgemをインストール状況を確認します。

```
gem list

*** LOCAL GEMS ***

.
.
.
rails (6.1.0, 6.0.3.4, 6.0.0)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.3.0)
rails-i18n (6.0.0)
railties (6.1.0, 6.0.3.4, 6.0.0)
rake (13.0.3, 13.0.1, 12.3.2)
.
.
.

```

`rails (6.1.0, 6.0.3.4, 6.0.0)`
rails6.0.0のみ使用するので、他の２つをアンイストールします。


#アンインストール
`gem uninstall rails`だけでいいのかと思いきや、調べると`railties`も削除する必要があるらしい。


```
gem uninstall rails -v '6.0.3.4'
gem uninstall railties -v '6.0.3.4'
```
上のコマンドを打つと、下記が表示される。

```
You have requested to uninstall the gem:
        railties-6.0.3.4

rails-6.0.3.4 depends on railties (= 6.0.3.4)
If you remove this gem, these dependencies will not be met.
Continue with Uninstall? [yN]  y
Successfully uninstalled railties-6.0.3.4
```
「railsアンインストールしてもいい？」と聞かられてるので、`y`を入力します。
[yN]は[yes or No]という意味です。

続いて`6.1.0`をアンインストールします。

```
gem uninstall rails -v '6.1.0'
gem uninstall railties -v '6.1.0'  

You have requested to uninstall the gem:
        railties-6.1.0

rails-6.1.0 depends on railties (= 6.1.0)
If you remove this gem, these dependencies will not be met.
Continue with Uninstall? [yN]  y
```

アンインストールできてるか確認します。

```
rails -v                           
Rails 6.0.0
```
できてました！！

最後、`bundle inatall`で読み込んで、変更を反映します。

```
bundle inatall
```


これで完了です。


##最後に

同じ様に悩んでる方々の助けになればと思い、記事を投稿しております。
それでは、また次回お会いしましょう〜

#参考
https://teratail.com/questions/63276
iso-2022-jpの文字列をutf-8に変換する

メールを受け取った際にiso-2022-jpで送られたために文字化けしてしまっていました。

rubyのencodeを使ってutf-8に変換します

検証するためにiso-2022-jpでエンコードされた文字列を生成します

```ruby
puts "ほげ".encode('iso-2022-jp')
# => $B$[$2(B
```

encodeを以下のように記述します

```ruby
str.encode(変換先, 変換元, 変換オプション)
```

今回はiso-2022-jpの文字列をutf-8に変換したいので次のようになります

```ruby
str = "ほげ".encode('iso-2022-jp')
puts str
# => $B$[$2(B
puts str.encode('utf-8', 'iso-2022-jp', invalid: :replace, undef: :replace, replace: '')
```

今回は変換できない文字を空文字に置き換えるオプションを指定しています

変換元がわかっている場合でないとこの方法で変換することはできませんが、
今回のようにメールが文字化けしている場合などでは有効に使えそうです

## 参考
https://docs.ruby-lang.org/ja/latest/method/String/i/encode.html