OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftのProperty Wrappers 機能を使って自作の @-prefixed attributes.を作ってみた

#  概要

表題の通りであります。

## 引用

NSHiper

https://nshipster.com/propertywrapper/

## Sample code

入力文字列値から空白と改行を削除する次のprefixed attributesのサンプルが下記になります。

`@propertyWrapper` を利用して、定義します。

```swift

import Foundation

@propertyWrapper
struct Trimmed {
    private(set) var value: String = ""

    var wrappedValue: String {
        get { value }
        set { value = newValue.trimmingCharacters(in: .whitespacesAndNewlines) }
    }

    init(wrappedValue initialValue: String) {
        self.wrappedValue = initialValue
    }
}

```

使ってみる。

```swift
struct Post {
    @Trimmed var title: String
    @Trimmed var body: String
}

var quine = Post(title: "  Swift Property Wrappers  ", body: "…")

print(quine.title)// Swift Property Wrappers 
```

こんな感じでいけます。

airbnbがよしなにやっていたので、勉強してみました。

airbnb github
https://github.com/airbnb/ResilientDecoding

コードと解説はNSHiperをそのまま引用しました、詳しい情報は[NSHiper](https://nshipster.com/propertywrapper/)や[Apple (github)](https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md)を参考にして下さい。
アプリを再審査に提出する際にYour package contains a file ..と出た


1度目の審査の時には出なかったエラーでした。おそらく1度目の提出の時のDisplayNameは英語、2度目の提出はDisPlayName日本語としたことが原因だと思います。[参考]
(https://blog.csdn.net/sz_vcp2007/article/details/50583389)
##対処法
<img width="1106" alt="スクリーンショット 2020-07-03 16.32.48.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/549093/d86e3ecf-cd9c-8c35-aecc-b8007fd587e1.jpeg">

画像のDebug Releaseに入力されている文字列の前に半角スペースが追加されていました。消去することでエラーは消えました。
【Rails 5.x】フリーフォントの導入方法

##フリーフォントをRailsに導入する方法
自作のポートフォリオにフリーフォントを導入したいと思い、Qiita記事を参考に導入しました。
今更感はありますが・・・備忘録かつ、
初学者の参考になればと思い、記事を作成しました。

筆者の環境
・Ruby　 2.5.3
・Rails　5.2.2

#####1　フリーフォントのファイルをダウンロード

#####2　フォントファイルを app/assets/fonts 配下に置く

```
(app名)/app/assets/fonts
```
hogehoge.ttf ( または hoge.otf ) のようなフォントファイルを、fonts ディレクトリ内に入れます。
自分の場合はfontsディレクトリがなかったのでassets配下にmkdirで作成しました。

#####3　SCSSファイルに記述
SCSSに、

```ruby:custom.scss
@font-face {
  font-family: 'hoge'; # font-family名は適宜決定
  src: font-url('hogehoge.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
}
```
このように記述します。
ファイル内のどこに記述してもよいです。
そして、

```ruby:custom.scss
body {  
  font-family: hoge;
}
```
先ほどのfont-family名を
bodyに記述し、全体に適用させます。

#####4　完成！
この手順でフリーフォントを適用できているかと思います。
意外に簡単でしたね。
反映されない場合は、適宜サーバーをrestartなどしてみてください！

######5　参考記事
[【初学者向け】Railsアプリケーションにカスタムフォントを追加する方法](https://qiita.com/ryotakazawa/items/ca77290f2a14a7155cbd)
Excelで年度別比較用グラフを作成

## 目的・目標
自分は2019年から株をやっていて以下画像のように配当金のデータをexcelに記入している。
いつ取得して、その積立は何円になってるのかもグラフにまとめている。
![スクリーンショット (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102676/0b801ea8-c05b-284e-953e-7a20cb84e912.png)
この段階で配当金が徐々に増加していることが視覚的に把握でき満足していたのだが、年度をまたいだことで年度の月毎の差も把握しておきたいという願望が湧いてきた。
株以外でも同じような需要があると思ったし、意外と目的達成までに関数調べたりと手間がかかったためメモとして残しておく。
## 完成図
以下の画像が完成したもの。
2019年と2020年の月毎の配当金取得額が年度別のグラフで一目で把握できるようになった。
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102676/7c005ae8-05b3-cd66-93bc-c0eaf09b91eb.png)
## excel
F列 : グラフ横軸用の月
G列 : 2019年の月
 月の加算はEDATE関数を使用している。
 `=EDATE("前月のセル", 1)`
H列 : 月毎の合計金額の算出
 一番時間がかかったポイント
`=SUMPRODUCT("条件1:A列からG列の各セルと年が一致するかどうか判定")*("条件2:A列からG列の各セルと月が一致するかどうか判定"), "条件1・2を満たしたセルの合計金額を算出する範囲")`
G2の数式は以下になる。この数式で2019年1月の合計金額が算出される。
 `=SUMPRODUCT((YEAR(sheet!$A$2:$A$23)=YEAR(G2))*(MONTH(sheet!$A$2:$A$23)=MONTH(G2)),sheet!$B$2:$B$23)`
I・J列 : G・H列の2020年用の列
あとはF・H・J列のデータをグラフ化すれば完成。
![スクリーンショット (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102676/c3cc2ea2-b4eb-8220-5596-e087b23a2d50.png)
MS Learnおすすめラーニングパス 6月号 【コンテナー編】

## MS Learnのおすすめラーニングパス第5弾！【コンテナー編】

開発と運用の効率を高め、アプリをよりすばやくリリースするために、コンテナーと呼ばれるテクノロジーが注目されるようになってはや数年経ちました。開発環境あるいはすでに多くの本番環境で導入が進んできていると思います。今月は改めてAzure上でのコンテナー技術に関するラーニングパスを紹介します！

  - [Azure でコンテナーを管理する【約5時間】](https://aka.ms/pathsjp-containers)：Azure Container Instances は、Azure でコンテナーを実行する方法として最も簡単で迅速な方法です。 このラーニング パスでは、コンテナーを作成して管理する方法、ACI を利用して Kubernetes に柔軟なスケールを与える方法を紹介します。

  - [Azure での Kubernetes 入門【約1時間半】](https://aka.ms/pathsjp-intro-to-k8s)：Docker コンテナーの基本、Kubernetes を使用したコンテナー オーケストレーション、Azure Kubernetes Service の管理対象クラスターについて説明します。

  - [Azure での最新のアプリケーションの設計【約6時間】](https://aka.ms/pathsjp-modern-apps)：Azure でのアプリケーション、キャッシュ、コンテナー、Kubernetes のための PaaS サービスを使用して最新のアプリケーションを構築する方法について説明します。

※ [MS Learn](https://aka.ms/MSLearn-Japan)はマイクロソフトのラーニングプラットフォームです
【Rails】タイマー機能

## はじめに
Railsでタイマー機能を実装したくて、調べてもなかなか欲しい情報が見つからず:expressionless:

友人から「javascriptで実装できるよ！」と教えてもらったら、あるわ♪あるわ♪情報が:sparkles:

無知過ぎる自分の戒め＆【Rails　タイマー】で検索した際、ヒットするよう記事に残します:bow_tone1:

## どんな機能？
**時間を指定し、時間になったらアラートがでる**という機能になります。

例えば、３秒と入力し、3秒後にアラートがでる。

こんな感じです(Gyazoなのでタイミングによっては見れなくなります:bow_tone1:)
↓↓↓↓
https://gyazo.com/89773746aac0c2a1640d48e6a536190b

## 実装
```HTML:view.html.haml
.timer__input
    %form{name: "timer"}
      %input{type: "text", value: ""}>/
      分
      %input{type: "text", value: ""}>/
      秒
      %br/
      %input{onclick: "cntStart()", type: "button", value: "スタート"}/
      %input{onclick: "cntStop()", type: "button", value: "ストップ"}/
```

```javascript:javascript.js
//タイマー処理
var timer1;

//カウントダウン関数を1000ミリ秒ごとに呼び出す関数
function cntStart() {
  document.timer.elements[2].disabled=true;
  timer1 = setInterval("countDown()",1000);
}

// タイマー停止関数
function cntStop() {
  document.timer.elements[2].disabled=false;
  crearInterval(timer1);
}

// カウントダウン関数
function countDown() {
  var min=document.timer.elements[0].value;
  var sec=document.timer.elements[1].value;

  if((min=="")&&(sec=="")) {
    alert("時間を設定してください！");
    reSet();
  }
  else {
    if(min=="")min=0;
    min=parseInt(min);

    if(sec=="")sec=0;
    sec=parseInt(sec);

    tmWrite(min*60+sec-1);
  }
}

// 残り時間を書き出す関数
function tmWrite(int) {
  int=parseInt(int);

  if(int <= 0) {
    reSet();
    alert("時間です！");
  }
  else {
    //残り分すうはintを60で割って切り捨てる
    document.timer.elements[0].value=Math.floor(int/60);
    //残り秒数はintを60で割った余り
    document.timer.elements[1].value=int % 60;
  }
}

// フォームを初期状態に戻す(リセット)関数
function reSet() {
  document.timer.elements[0].value="0";
  document.timer.elements[1].value="0";
  document.timer.elements[2].disabled=false;
  clearInterval(timer1);
}
```

※上記はCSSはございません:bow_tone1:
（CSSを実装する前に記事にしてしまったためです:sweat_smile:）
皆様のデザイン力で素敵なビューを作成してください:sparkles:

## 感想
javascriptは偉大なり:sun_with_face:
というのが正直な感想です 笑
まだまだ勉強中の身ではありますが、少しずつ知識をつけていきたいですね:relieved:

## 参考
[JavaScript入門　カウントダウンタイマー](https://www.pazru.net/js/timer/6.html)
(学習メモ）Java2級対策：問１要点（知識）


Java 
自己学習用メモ

### 問１要点整理　　
- Oya　
－ 継承 ー＞　Ko（Oyaのサブクラス）　
－ 継承 ー＞　Mago（Oyaのサブクラス）


- this はスーパークラスでもサブクラスでも使用OK

- java.io.FileOutpuStreamクラスは
	java.lang.Objectクラスのサブクラス

- Javaは「多重継承」NG！！
サブクラスはスーパークラスの属性・操作を引き継ぐことができる
スーパークラスの参照変数には、
サブクラスのオブジェクトを代入OK！

--------- TBE -------------
JavaはExcelドキュメントプロパティを設定します

Excelドキュメントプロパティは説明的な情報であり、作成者、タイトル、件名、キーワード、カテゴリなどのアイテムが含まれます。Excelドキュメントのプロパティを設定することで、ユーザーがExcelドキュメントをより便利かつ迅速に管理できるようになります。この記事では、Free Spire.XLS for Javaを使用して、Excel文書に組み込みのドキュメントプロパティとカスタムドキュメントプロパティを設定する方法を紹介します。

**環境構成：**
**方法1:** [Free Spire.XLS for Java](https://www.e-iceblue.com/Download/xls-for-java-free.html)パッケージをダウンロードして解凍し、libフォルダーのSpire.Xls.jarパッケージを依存関係としてJavaアプリケーションにインポートします。

**方法2:** Mavenリポジトリから直接JARパッケージをインストールすることもできますpom.xmlファイルを構成するコードは次のとおりです。

```java
<repositories>
        <repository>
            <id>com.e-iceblue</id>
            <name>e-iceblue</name>
            <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>
        </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>e-iceblue</groupId>
        <artifactId>spire.xls.free</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>
```

**組み込みのドキュメントプロパティを設定します:**

```java
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;

public class BuiltinProperties {
    public static void main(String[] args){
        //Excelドキュメントを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("test.xlsx");

        //ドキュメントのタイトル、件名、作成者、およびその他の組み込みドキュメント属性を設定する
        workbook.getDocumentProperties().setTitle("ドキュメントプロパティを設定する");
        workbook.getDocumentProperties().setSubject("注文書");
        workbook.getDocumentProperties().setAuthor("AAA");
        workbook.getDocumentProperties().setManager("BBB");
        workbook.getDocumentProperties().setCompany("C社");
        workbook.getDocumentProperties().setCategory("支出");
        workbook.getDocumentProperties().setKeywords("Excelドキュメントのプロパティ");

        //結果ファイルを保存
        workbook.saveToFile("BuiltinDocumentProperties.xlsx", ExcelVersion.Version2013);
    }
}
```

![in.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/84596998-1c7a-b6fc-6dd2-aed716c110ab.jpeg)



**カスタムドキュメントプロパティを設定します:**

```java
import com.spire.xls.ExcelVersion;
import com.spire.xls.Workbook;

import java.util.Date;

public class CustomProperties {
    public static void main(String[] args){
        //Excelドキュメントを読み込む
        Workbook workbook = new Workbook();
        workbook.loadFromFile("Input.xlsx");

        //ドキュメントにカスタムドキュメントプロパティを追加する
        workbook.getCustomDocumentProperties().add("_MarkAsFinal", true);
        workbook.getCustomDocumentProperties().add("編集する", "AAA");
        workbook.getCustomDocumentProperties().add("連絡先番号", 81705109);
        workbook.getCustomDocumentProperties().add("日付", new Date());

        //結果ファイルを保存
        workbook.saveToFile("CustomDocumentProperties.xlsx", ExcelVersion.Version2013);
    }
}
```

![cu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/293a06ae-6a65-ef74-4973-24eb9e3a0c2e.png)
Railsチュートリアル 14.2.6 Ajaxの動作の確認テストについて

## 演習1 で、 `format.js` をコメントアウトしてもGreenになってしまう。

チュートリアルのテストが十分でない。

* ユーザのフォロー数 `@user.following.count`  は、確認できている
* format.js の効果を確認するには、レスポンスのJavascriptを確認する必要がある。
  * follow のテスト:  `Unfollow` がある, `followers` の値が 1 であること
  * unfollow のテスト: `Follow`がある, `followers` の値が 0 であること

ついでに、Ajaxでない場合も、レスポンスのフォロー数の統計数値を評価するようにした。

変更したテストのdiffを下記に示します。

```diff
diff --git a/test/integration/following_test.rb b/test/integration/following_test.rb
index fdde034..3fb3e5d 100644
--- a/test/integration/following_test.rb
+++ b/test/integration/following_test.rb
@@ -29,12 +29,16 @@ class FollowingTest < ActionDispatch::IntegrationTest
     assert_difference '@user.following.count', 1 do
       post relationships_path, params: { followed_id: @other.id }
     end
+    follow_redirect!
+    assert_select 'strong#followers', text: @other.followers.count.to_s
   end

   test "should follow a user with Ajax" do
     assert_difference '@user.following.count', 1 do
       post relationships_path, xhr: true, params: { followed_id: @other.id }
     end
+    assert_match "Unfollow", response.body
+    assert_match /#followers.*'1'/, response.body
   end

   test "should unfollow a user the standarfd way" do
@@ -43,6 +47,8 @@ class FollowingTest < ActionDispatch::IntegrationTest
     assert_difference '@user.following.count', -1 do
       delete relationship_path(relationship)
     end
+    follow_redirect!
+    assert_select 'strong#followers', text: @other.followers.count.to_s
   end

   test "should unfollow a user with Ajax" do
@@ -51,5 +57,7 @@ class FollowingTest < ActionDispatch::IntegrationTest
     assert_difference '@user.following.count', -1 do
       delete relationship_path(relationship), xhr: true
     end
+    assert_match "Follow", response.body
+    assert_match /#followers.*'0'/, response.body
   end
 end
```
小ネタ: ubuntu で ping 192.168.5 とtypoすると、ping 192.168.0.5 ができる

小ネタ: ubuntu で ping 192.168.05 とtypoすると、ping 192.168.0.5 ができる。

```sh:例1)192.168.0.5
$ ping 192.168.05
PING 192.168.05 (192.168.0.5) 56(84) バイトのデータ
```

```sh:例2)192.168.0.105
$ ping 192.168.105
PING 192.168.105 (192.168.0.105) 56(84) バイトのデータ
```
C++での擬似的な名前付き引数(c++20版)

#はじめに
関数の引数が増えるとデフォルト値が指定してあっても、途中の引数だけでデフォルト値を指定することはできない。そのため、結局デフォルト値を調べながら指定する必要ある。kotlinなど名前付き引数がある言語なら、個別にパラメータを指定できてうらやましいところだが、c++20で指示付き初期化子(designated initialization)が規格され、これを使うと擬似的に名前付き引数が使える。c++17以前版は記事にまとめたので、改めてc++20版としてまとめなおした。
なお、c++17以前の機能を使ったものに関しては以下を参照
https://qiita.com/luftfararen/items/0a0c81ae2418a896691f

# 実装例と使い方

```C++:main.cpp

#include <string>
#include <iostream>
#include <iomanip>
#include <sstream>
#include "named_args.h"

//引数のリストは構造体として定義し、デフォルト値を指定
struct to_str_args
{
	int base = 10;
	int w=0;
	int precision = 5;
	char fill = ' ';
	bool fixed = false;
};

template<class T>
std::string to_str(T v, const to_str_args& a = to_str_args())
{
	std::stringstream ss;
	ss << std::setfill(a.fill);
	ss << std::setbase(a.base);
	ss << std::setw(a.w);
	if (a.fixed) ss << std::fixed;
	ss << std::setprecision(a.precision);
	ss << v;
	return ss.str();
}


int main()
{
	std::cout << to_str(12.345) << std::endl;　//(1)
	std::cout << to_str(12.345, {.w = 6 }) << std::endl;//(2)
	std::cout << to_str(12.345, {.w = 7, .precision = 3,.fill = '0' }) << std::endl;//(3)

	to_str_args a{.w = 7, .precision = 3,.fill = '0' };
	std::cout << to_str(12.345, a) << std::endl;//(4)
	std::cout << to_str(23.456, a) << std::endl;//(5)
}
```

#結果
12.345
012.345
00012.3
00012.3
00023.5

#解説
(1)のように構造体変数[(2)と違い{}そのもの]を省略すれば構造体のデフォルト値が使われる。これはto_str関数の引数の構造体変数に、構造体のコンストラクタをデフォルト値として指定しているため。
(2)(3)では、指示付き初期化子を使うことで擬似的に名前付き引数を実現。designated initializationは{}のなかで、"."+メンバ変数=値で初期化する。各メンバの初期化はカンマで区切る。メンバ変数の順番は構造体の定義順でなくてはいけないが省略は可能。
(4)(5)では、構造体変数をそのものを渡している。定義した関数をconst参照で受けているのは、このケースで効率化を図るため。同じパラメータセットを使いまわすときに便利。

#さいごに
「構造体を定義するなら、名前付きに引数にする必要ない」じゃんというツッコミは、許して下さい。呼び出し側の記述量はかなり減らせるはず。あと文字列の書式を整えるなら、c++20からは、std::formatがあるので今回の例はあくまで例ということで。
SpringBootでlombokを使う

pomに追加しないと使えません（知りませんでした)。

pomファイルに以下を追加。

```pom.xml
<dependencies>
　　<dependency>
　　　　<groupId>org.projectlombok</groupId>
	　<artifactId>lombok</artifactId>
	　<optional>true</optional>
　　</dependency>
</dependencies>
```

以上。
【Unity/C#】シェーカーソートとは(コード付き)

#シェーカーソートとは？
バブルソートを、効率がよくなるように改良したもの。別名は、双方向バブルソート。
場合によっては普通のバブルソートより遅くなります。

#アルゴリズム
バブルソートで1回スキャンを行うと、最後の要素1個がスキャン範囲中最大であることが分かり次回のスキャン範囲を1狭めることができる。さらに、このスキャンの最後で連続してm個の要素の交換が行われていなければ、そのm個についてはソート済みであることが分かるので、次回のスキャン範囲をm狭めることができる。この工夫で、後半が殆ど整列済みのデータに対してバブルソートが高速に行えるようになる。**by.wiki**

#実行結果
![しぇーかーそーと１.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211130/858cff68-e8bb-a261-491a-8450e8497361.gif)


#サンプルコード

```C#
bool swapFlag = false;
int[] ShakerSort(int[] _array)
{
	while (true)
	{
		swapFlag = false;
		//配列の回数分回す
		for (int i = 0; i < _array.Length-1; i++)
		{
			//比較元より大きければ入れ替え
			if (_array[i] > _array[i + 1])
			{
				int x = _array[i];
				_array[i] = _array[i + 1];
				_array[i + 1] = x;
				swapFlag = true;
			}
		}
		for (int i = _array.Length - 1; i > 0; i--)
		{
			//比較元より大きければ入れ替え
			if (_array[i] < _array[i - 1])
			{
				int x = _array[i];
				_array[i] = _array[i - 1];
				_array[i - 1] = x;
				swapFlag = true;
			}
		}
			//一度も入れ替え処理が通らなければ
		if (swapFlag==false)
		{
			break;
		}
	}
		//Sortした結果を返す
	return _array;
}
```


#まとめ
まだまだ早くなりますがとりあえずこれがシェーカーソートとなります。
時間があり次第これを改善したシェーカーソートを載せます。
VScodeでファイルのプレビューを OFFにする方法(ダブルクリックしなくても新しいエディタで開く)

## はじめに
VScodeの場合ファイルのクリックだけだとプレビューモードなので、ファイルを固定することができません。
新しいエディタで開き、ファイルを固定するにはダブルクリックをする必要があります。
![設定前.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/9abd2002-16cb-7828-3b09-3195c10b60d6.gif)

## 設定
`Command + P`で設定を開き、右上にある`設定(JSON)を開く`のアイコンを押して settings.jsonを開きます。
settings.jsonに下記を記載します。

```:settings.json
"workbench.editor.enablePreview": false, //ファイルのプレビューをOFFにする
```
![設定後.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497683/eaabbeb7-6455-8e2d-dde6-eabc07c93d65.gif)
SalesforceへREST APIを使ってレコード追加するときにinvalid record typeになったら

小一時間ハマったので共有します。

# エラー内容

```
[
    {
        "message": "invalid record type",
        "errorCode": "INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY",
        "fields": []
    }
]
```

# 対象方法

## RecordTypeIDが正しいか確認する
RecordTypeIDを確認するには、
[設定>オブジェクトマネージャ> (対象のオブジェクト)> レコードタイプ > （対象のレコードタイプ）]と進みます。
URLにある１８桁の文字列がIDです。

## 権限があるか確認する

[レコードタイプの設定]に 対象のオブジェクトの項目があるので、
そこに挿入したいレコードのレコードタイプがあるか確認します。
なければ、そのレコードタイプを使用する権限がないので、追加します。



以上、参考になりましたら幸いです。
（学習メモ）Java2級対策：問4要点（例外処理）

Java 
自己学習用メモ



### 問4 要点整理

#### 例外処理についての知識をつけておく
プログラムの設計をする際は、
実行時に想定外のエラーがおこる可能性を考慮に入れて備えておくことが必要:writing_hand:

① try（例外が発生する可能性のある処理）
② catchブロック（処理したい例外を捕まえる）
③ finallyブロック（例外が発生したかどうかに関わらず行う処理）
- catch、finallyそれぞれどちらかがあれば片方は省略できる。
 
- finallyブロック内でtry～catchブロックを記述することはできない。
- 複数のfinallyブロックを記述することはできない。

- 自分で処理せず、例外処理を呼び出し元のクラスに丸投げしたいときは
　メソッドのシグニチャに**thows 例外 クラス名**と記述すればOK（便利）

```java
try{
　エラーがなければ実行される文
}catch（　例外クラス　変数名　）{
　例外処理（例外時に実行される文）
}
```

例外クラスにはどのようなものがあるのか
■　Error系例外：　try-catchでキャッチ不要
■　Exception系例外：　try-catchでキャッチしないとコンパイルエラーになるよ
■　RuntimeException系例外：　try-catchでキャッチしてもしなくてもOK！

```java
try{
エラーがなければ実行される文
}catch（　例外クラス　変数名　）{
例外処理（例外時に実行される文）
}finally{
例外があるかどうかに関わらず必ず実行する処理
}
```



--------- TBE -------------
OpenCVのビルドインストール（CUDA対応環境用）

OpenCVをCUDA対応版でインストールしようとするといろいろエラーで躓いたので、とりあえずうまくいった方法をメモっておきます

##実施環境、バージョン
OS    : Ubuntu16.04 
GPU   : GeForce GTX 1660Ti
CUDA  : 10.1
cuDNN : 7.6.5

##事前準備
- Python3のヘッダーとライブラリをインストール
- JPEG, PNG, TIFFなどの画像処理に対応
- ムービー処理に対応
- GUI操作のためのGTKライブラリに対応
- 様々なOpenCVの関数の最適化に対応

・・・など（以下を順次実行）

```
sudo apt-get install build-essential cmake git pkg-config
sudo apt-get install python-dev python3-dev python-numpy libtbb2
sudo apt-get install qtbase5-dev
sudo apt-get install qtdeclarative5-dev
sudo apt-get install freeglut3 freeglut3-dev libtbb-dev
sudo apt-get install libjpeg8-dev libpng-dev libtiff5-dev libdc1394-22-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libgtk-3-dev
sudo apt-get install libatlas-base-dev gfortran
```
##OpenCVインストール- OpenCVのダウンロード
　※特定のバージョンにする場合はバージョンを指定してclone

```
git clone https://github.com/itseez/opencv.git
git clone https://github.com/itseez/opencv_contrib.git
cd opencv
mkdir build
cd build
```

- cmakeの実行(CUDA使用有無に合わせて下記どちらかのコマンドを実行)  

```
--- CUDA対応有りビルド用 ---
cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
 -D INSTALL_C_EXAMPLES=ON \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D INSTALL_TESTS=ON \
 -D WITH_PYTHON=ON \
 -D BUILD_opencv_python2=OFF \
 -D BUILD_opencv_python3=ON \
 -D PYTHON_DEFAULT_EXECUTABLE=python3 \
 -D WITH_MKL=ON \
 -D WITH_CUDA=ON \
 -D CUDA_FAST_MATH=ON \
 -D WITH_CUBLAS=ON \
 -D WITH_CUDNN=ON \
 -D WITH_NVCUVID=OFF \
 -D OPENCV_DNN_CUDA=OFF \
 -D BUILD_opencv_cudaimgproc=OFF \
 -D BUILD_EXAMPLES=ON \
 -D WITH_TBB=ON \
 -D WITH_V4L=ON \
 -D WITH_QT=ON \
 -D WITH_OPENGL=ON ..

--- CUDA対応無しビルド用 ---
cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local \
 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
 -D INSTALL_C_EXAMPLES=ON \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D INSTALL_TESTS=ON \
 -D WITH_PYTHON=ON \
 -D BUILD_opencv_python2=OFF \
 -D BUILD_opencv_python3=ON \
 -D PYTHON_DEFAULT_EXECUTABLE=python3 \
 -D BUILD_EXAMPLES=ON \
 -D WITH_TBB=ON \
 -D WITH_V4L=ON \
 -D WITH_QT=ON \
 -D WITH_OPENGL=ON ..
```

## ビルド＆インストール  

```
make -j$(nproc)
sudo make install
sudo /bin/bash -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'
sudo ldconfig
```

##インストール確認
以下のコードを実行してバージョンが表示されればOK
`python3 -c "import cv2; print( cv2.__version__ )"`
スプレッドシートでテキストのフォントサイズを変更してテキスト全体をセルの幅に合わせたい

# 背景

Microsoft Excel ではセルの幅に合わせてテキストのフォントを変更する機能がありますが、Google Spreadsheet では残念ながらマニュアル操作でもできないだけでなく、スクリプトを使っても[Wrap strategy](https://developers.google.com/apps-script/reference/spreadsheet/wrap-strategy)の中にこのような機能はありません。そこで、回避策を使ってフォントサイズを変更してテキストをセル幅にフィットさせるようなスクリプトを作ってみました。

# デモ

![20200703a-fig2a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133383/7e123182-8784-0e48-73c8-3fcc12c43474.gif)


これはデモンストレーションの様子です。スクリプトを実行することで、スプレッドシート上のセル A1:A6 にあるテキストのフォントサイズが変更されてセル幅にフィットしていることがわかります。完全にフィットできない理由は、`setFontSize(size)`では整数のサイズしかつかえないことが原因です。このため、フォントサイズが小さくなるほど完全なフィットは難しいです。これがボトルネックと思われます。

# 原理

残念ながら、セル内のテキストのフォントサイズとテキストの文字数から計算したピクセル値は、セル幅のピクセル値とはどうやら異なるようです。（原因不明）このため、別の方法として、最初に現状のセル幅と、`autoResizeColumn`を使ってセル幅をテキストの幅にオートフィットさせた際のセル幅の比を取得します。この比を使ってフォントサイズを変更することで、auto resize を実現しています。

# サンプルスクリプト

```javascript
function myFunction() {
  const autoResizeFont = (range, toLarge) => {
    const sheet = range.getSheet();
    const ss = sheet.getParent();
    const startColumn = range.getColumn();
    const endColumn = range.getColumn() + range.getNumColumns();
    const startRow = range.getRow();
    const endRow = range.getRow() + range.getNumRows();
    const columnObj = [];
    for (let c = startColumn; c < endColumn; c++) {
      columnObj.push({
        column: c,
        width: sheet.getColumnWidth(c),
      });
    }
    const tempSheet = ss.insertSheet("tempForAutoresizeFont");
    sheet.activate();
    const tempRange = tempSheet.getRange("A1");
    for (let r = startRow; r < endRow; r++) {
      for (let c = 0; c < columnObj.length; c++) {
        const srcRange = sheet.getRange(r, columnObj[c].column);
        tempSheet.setColumnWidth(1, columnObj[c].width);
        srcRange.copyTo(tempRange);
        tempSheet.autoResizeColumn(1);
        const resizedWidth = tempSheet.getColumnWidth(1);
        tempSheet.setColumnWidth(1, columnObj[c].width);
        const ratio = columnObj[c].width / resizedWidth;
        if (ratio > 1 && !toLarge) continue;
        const fontSize = srcRange.getFontSize();
        srcRange.setFontSize(Math.ceil(fontSize * ratio));
      }
    }
    ss.deleteSheet(tempSheet);
  };

  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Sheet1");
  const targetRange = "A1:A6";
  const toLarge = true;
  autoResizeFont(sheet.getRange(targetRange), toLarge);
}
```

- この場合、アクティブスプレッドシートの Sheet1 にあるセル A2:A6 のテキストのフォントサイズが変更されます。
- `toLarge = true`の場合、テキストの長さがセル幅よりも小さい場合、テキストのフォントを大きくして調整します。
- `toLarge = false`の場合、テキストの長さがセル幅よりも小さい場合、テキストのフォントは変更されません。

# ライブラリへの実装

上記の方法は、GAS ライブラリの[RichTextApp](https://github.com/tanaikech/RichTextApp#autoresizefontforspreadsheet)へ新たなメソッドとして追加しました。

# 参考

- [autoResizeColumn(columnPosition)](https://developers.google.com/apps-script/reference/spreadsheet/sheet#autoresizecolumncolumnposition)
- [etFontSize(size)](https://developers.google.com/apps-script/reference/spreadsheet/range#setfontsizesize)
- [英語版はこちら](https://gist.github.com/tanaikech/784bae8c41b7d9bcba5b581920dda3f4)
Z80にLCD

Z80に手持ちのLCDを接続してみました。

物はHardOffで手にいれたROHMのRCM2010Rです。

![写真（2020-06-30 16.25）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/52a68d11-1afb-6810-b30b-1d1741ed9e0a.jpeg)

インターフェースはHD44780の互換のようです。

LCDにコネクタを付けようかとも考えたのですが、フラットケーブルのパターンがあったので、直にハンダ付けしました。反対側はコネクタにしました。

![写真（2020-06-30 17.41）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8e45a4c8-7482-c25d-ea86-351c43e417b2.jpeg)

最初にバスに直接ぶら下げてみたのですがうまくいきません。RCM2010Rで使われているコントローラは東芝のT7934でデーターシートを読んでみると4種類ありRCM2010Rに使われているT7934は0000で68系のインターフェースでした。

68系のチップイネーブルはEで書かれていて、80系はCSと書かれていることが多いようです。

HD44780やその互換チップは68系のインターフェースがほとんどのようです。

思案して8255のPortAに4Bitインターフェースで接続することにしました。書き込みしか必要ないので、R/WはGNDに落としてRSとEだけを制御します。計6本の制御になります。

|8255ピン|接続|
|:--|:--|
|PA0|LED|
|PA1|空き|
|PA2|LCD RS|
|PA3|LCD E|
|PA4|LCD D4|
|PA5|LCD D5|
|PA6|LCD D6|
|PA7|LCD D7|

配線を勘違いしてちょっと手こずりましたが、表示できるようになりました。

![IMGP0029.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b7054eff-1268-c43f-dead-1379e2686874.jpeg)

テストプログラムは以下になります。

```
;
;
;

PORTA	EQU	0E0H
PORTB	EQU	0E1H
PORTC	EQU	0E2H
CTL	EQU	0E3H

; on EfexMon 
	ORG	8000H
	LD	A, 80H
	OUT	CTL

	LD	B, 0FFH
	CALL	LWAIT

	LD	A, 030H
	CALL	LCDW4
	LD	B, 080H
	CALL	LWAIT
	LD	A, 030H
	CALL	LCDW4
	LD	B, 080H
	CALL	LWAIT
	LD	A, 030H
	CALL	LCDW4
	LD	B, 080H
	CALL	LWAIT

; Set Function
	LD	A, 020H
	CALL	LCDW4
	LD	B, 010H
	CALL	SWAIT
; Set Function
	LD	A, 020H
	CALL	LCDW4
	LD	A, 080H
	CALL	LCDW4
	LD	B, 010H
	CALL	SWAIT
; Dispay ON
	LD	A, 000H
	CALL	LCDW4
	LD	A, 0C0H
	CALL	LCDW4
	LD	B, 010H
	CALL	SWAIT
; Display Clear
	LD	A, 000H
	CALL	LCDW4
	LD	A, 010H
	CALL	LCDW4
	LD	B, 010H
	CALL	LWAIT
; Set Entory Mode
	LD	A, 000H
	CALL	LCDW4
	LD	A, 060H
	CALL	LCDW4
	LD	B, 010H
	CALL	SWAIT

	LXI	H, HELLO
	CALL	PRINT
LOOP1
	LD	A, 01H
	OUT	PORTA
	LD	B, 0FFH
	CALL	LWAIT

	LD	A, 00H
	OUT	PORTA
	LD	B, 0FFH
	CALL	LWAIT
	
	JMP	LOOP1

LCDW4	ANI	0F0H
	OUT	PORTA
	NOP
	NOP
	NOP
	ORI	08H
	OUT	PORTA
	NOP
	NOP
	NOP
	ANI	0F0H
	OUT	PORTA
	RET

PUTC	MOV	B, A
	ANI	0F0H
	ORI	0CH
	OUT	PORTA
	NOP
	NOP
	NOP
	ANI	0F4H
	OUT	PORTA
	MOV	A, B
	RLCA
	RLCA
	RLCA
	RLCA
	ANI	0F0H
	ORI	0CH
	OUT	PORTA
	NOP
	NOP
	NOP
	ANI	0F4H
	OUT	PORTA
	RET

PRINT	MOV	A, M
	CP	0
	RET	Z
	CALL	PUTC
	LD	B, 10H
	CALL	SWAIT
	INC	HL
	JMP	PRINT

SWAIT	DCR	B
	JP	NZ, SWAIT
	RET

LWAIT
	LD	A, 0FFH
WLOOP
	NOP
	NOP
	NOP
	DEC	A
	JP	NZ, WLOOP
	DEC	B
	JP	NZ, LWAIT
	RET

HELLO	DB	'Hello Z80'
	DB	00H
```

昔の本を見ていたら、80系のCSを68系のEにする回路がありました。140nsの遅延回路のようです。

![CS-E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/1f29051b-4987-20ad-e4f3-0349f6081144.png)
【Folio LSP】チュートリアル③VMを触ってみる

この記事では、Library Service PlatformのOpen Sourceプロジェクトである、Folioのチュートリアルを解説します。

前記事：[チュートリアル②VM概要](https://qiita.com/ayungn/items/8db10b01c2561008a1b7)

- 参考URL：https://dev.folio.org/tutorials/folio-vm/03-interact/

##前提
[チュートリアル①ワークスペースを作ってVMを立ち上げる](https://qiita.com/ayungn/items/45c3f8bbe419308106a6)を参考に、Vagrantが立ち上がった状態にする。

##ブラウザから
1. ブラウザから、Folioを開きます。`http://localhost:3000`
2. ユーザ/PWにdiku_admin/adminを入力し、ログインします。
3. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342082/136d5c37-910d-4188-90e1-73b74d18a895.png)をクリックすると、システム情報やソフトウェアバージョンなどが確認できます。
4. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342082/b3f83579-151c-041d-b908-072507b1eded.png)や![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342082/2dd5f2a5-f7e0-3214-e7ee-767125b421e0.png)
を見てみてください。


##開発用の設定情報
1. `http://localhost:3000/settings/developer/`にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342082/0aeff120-0677-96ad-1be9-29eda11318a1.png)

##curlを利用する

```
C:\vm-snapshot-core>vagrant ssh
```
デフォルトパスワードはvagrant。
run-basic.shを実行する⇒"Finished"が表示されたらおしまい。

```
vagrant@vagrant:~$ touch run-basic.sh
vagrant@vagrant:~$ vim run-basic.sh
vagrant@vagrant:~$ chmod +x run-basic.sh
vagrant@vagrant:~$ ./run-basic.sh
```
run-basic.shの内容は以下をコピペしてください。
（curlで9130ポートのOkapiと通信します。）

```run-basic.sh
#!/usr/bin/env bash

OKAPIURL="http://localhost:9130"
CURL="curl -w\n -D - "
PATH_TMP="/tmp/folio-tutorial"

H_TENANT="-HX-Okapi-Tenant:diku"
H_JSON="-HContent-type:application/json"

echo "Ensure that Okapi can be reached ..."
STATUS=$(curl -s -S -w "%{http_code}" $OKAPIURL/_/proxy/tenants -o /dev/null)
if [ "$STATUS" != "200" ]; then
  echo "Cannot contact okapi: $STATUS"
  exit
fi
VERSION_OKAPI=$(curl -s -S "$OKAPIURL/_/version")
echo "Using version ${VERSION_OKAPI}"
echo

echo "Do login and obtain our token ..."
cat >$PATH_TMP-login-credentials.json << END
{
  "username": "diku_admin",
  "password": "admin"
}
END

$CURL $H_TENANT $H_JSON --progress-bar \
  -X POST \
  -d@$PATH_TMP-login-credentials.json \
  $OKAPIURL/authn/login > $PATH_TMP-login-response.json

echo "Extract the token header from the response ..."
H_TOKEN=-H$(grep -i x-okapi-token "$PATH_TMP-login-response.json" | sed 's/ //')
echo
#echo Received a token: $H_TOKEN

echo "Test 1: Find some users"
$CURL $H_TENANT $H_TOKEN \
  "$OKAPIURL/users?query=personal.lastName==a*+sortBy+username"
echo

echo "Finished."

```
##Stripes-CLIを利用する
これは別の記事にします。

##補足
:sparkles:curlのオプション

| オプション    |名称         |説明                               |
|:-------------|:------------|:---------------------------------|
| -s           |--show-error | エラーを表示する。-sと一緒に使う。  |
| -S           |--silent     | サイレントモード（何も出力しない）  |
| -w           |--write-out  | フォーマット                      |

##変更履歴
2020年7月3日　新規作成
Ubuntu20.04がinitramfsで止まって起動できない

表題の事象を解決できていませんが、記録として残します。

PCの電源を入れてからやけに時間がかかると思ったらこの画面でした。
![DSC_0548.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649936/4f98eb8a-7bfe-25a6-f389-ec8b93b9cf75.jpeg)

英語はあまりわかりませんが、UUIDが存在しないよ！！と言ってることはわかりました。
UUIDでディスクを見つけられず止まった　といったところでしょうか・・・？

initramfsでググったところこれらが原因として考えられるとのこと
・強制終了などが起因で必要なファイルが破損してブート時のエラー
・アップデートによるエラー

検索結果からとりあえず実施した対応方法
・rebootを入力
　⇒何も起こらず
・exitを入力
　⇒エラー内容が再表示される
・fsckでディスクパーティションの修復をして直った方が多いので真似る
　⇒そもそも/dev/配下にsdaもsdbもsdcもsda1もsda2もそれらしいものも無いのでエラーとなる

rebootコマンドは何も起こりませんでしたが、ctrl+alt+delでは再起動できました。
再起動後のバージョン選択画面です。
![DSC_0552.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649936/97a3d839-7cec-9977-1666-db3b27da2821.jpeg)

Linux 5.4.0-37で起動できなかったので同バージョンのリカバリモードを試しましたが結局同じ画面になり、5.4.0-33と5.4.0-29は正常に起動することができました。

前回PCを閉じる前にアップデートを走らせて失敗していたので、そのせいなのでしょうか・・・よくわからんとです。
[C#]Visual Studio 2019 のコードメトリクス分析機能を使ってみよう

日曜日に腹痛で病院にいったら、入院になり、翌日盲腸と診断されてそのまま手術して先日退院してきました。
まだ、おなかの傷が痛むので今週は養生しようと思うので手を動かすのではなくツールを使ってみた！って感じの記事を書いてみたいと思います。

Visual Studio 2019 にはコードメトリクスの分析機能があります。

[コードメトリックスの値](https://docs.microsoft.com/ja-jp/visualstudio/code-quality/code-metrics-values?view=vs-2019)

こんな感じで分析メニューからいけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/f91f8485-1b65-455d-4cad-64e322277a43.png)

丁度、先日リリースされた Covid-19 Radar のプロジェクトが手元にあったので分析にかけてみました。
実行すると以下のような結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/6f6ebef1-319d-8d94-d370-c31797dde93c.png)

このウィンドウ上部にあるエクセル風のアイコンをクリックするとみんな大好き Excel で結果が開かれます。あとは好きなようにソートしたりフィルターしたりできます。

このプロジェクトの全体のコードを見たわけではないですが、メソッドだけに絞ってサイクロマティック複雑度でソートしたら以下のような雰囲気になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/9de34726-81c4-4284-5d06-a9c487ac0f0d.png)

これはサーバーサイドのコードですがメソッド単位でのサイクロマティック複雑度の最大値が 13 というのは、私が昔仕事などでコードの分析する際に提出されてきたコードでは出会ったことがありませんでした。
50 超えなんて珍しくもなく数百になるものも中にはあったりすることもあるので、このコードはサイクロマティック複雑度的にはかなり綺麗に整理されたコードなんだなぁというのがわかります。

クライアント側のコードのサイクロマティック複雑度も同じようにメソッドのみに絞り込んで表示してみたら最大のもので 18 でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70288/9a06dc1a-4e75-e38a-a07c-818b917ae83a.png)

Exposure Notification の API をスマホで有効化するという処理と通知などの処理が主で複雑な Bluetooth LE の電波強度から接触したかどうかという処理がアプリ内に不要なので、割とさっくりと作られているように感じます。

実際に数コミットくらいは私の名前もコミットログにあるのですが、触ってみるときにメソッドが短いので読みやすいコードだなぁと思いました。なので、 C# をやったことがある人には巨大なメソッドがないメソッド単位で見た限りだと綺麗に分割されていそうなプロジェクトを読みたいというのであれば Covid-19 Radar のコードの Azure Functions と Xamarin のコードをクローンしてみてみてみるというのは、もしかしたらアリなのではと思いました。

## サイクロマティック複雑度

ここまで散々言ってきたサイクロマティック複雑度ですが、[循環的複雑度](https://ja.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%9A%84%E8%A4%87%E9%9B%91%E5%BA%A6)という名前でも使われていて（私のまわりはサイクロマティック複雑度でした、まぁ英語をそのままカタカナにするか漢字にするかの違いです）

端的に言うとソースコード内の処理の経路の数。つまりこのメソッドの全てのパターンをテストしようとすると最低でも、この数字と同じ数だけのテストケースを実施しないと出来ないというものです。

個人的な所感では、これが 20 を超えてくると危険です。まぁでもエンタープライズアプリケーション開発の現場では数百とかいうのがざらにいるので感覚麻痺しちゃうけど麻痺したら危険信号なので気を付けましょう。

こういったソースコードの各種メトリクスは、CI/CD パイプラインで継続的に計測しておくとソースコードを俯瞰する立場の人からしたらありがたいです。
有名どころだと [SonarQube](https://www.sonarqube.org/) を使ってるところが多いんじゃないかと思います。Qiita にもいくつか記事があるので気になったら見てみるといいと思います。

昨日に比べてなんか複雑度の多いコードがバカみたいに増えてるんだけど！？っていうのに気づいたときに対処できるので個人的には好きです。

## まとめ

Covid-19 Radar のコードはメソッド単位（クラス間の依存関係とかは今回は見てないのでそこは知らない）の複雑度で見ると凄く整理されてメソッド分割されているように見えました。実際に私も個人的にコードを見たり少しコミットするために見たときには「何だこのメソッド！？複雑でよくわからないから近づかんとこ…」というのはありませんでした。

サーバーサイドのほうについてはユニットテストもあってユニットテストのコードカバレッジを見ると 70% もユニットテストでカバーしているので、本当にお手本みたいな書き方がされているので興味のある人は見てみるといいと思います。

ではでは。

[GitHub | Covid-19 Radar](https://github.com/Covid-19Radar/Covid19Radar)
.NET Core/WPF/windows desktopでOpenCVを使う

# 環境
- Visual Studio Community 2019 version 16.6.3
- .NET Core 3.1
- WPF/Windows desktop app
- OpenCvSharp4　version 4.3.0.20200524

# インストール
## OpenCvSharp4をインストール
既存プロジェクトに右クリックでNuGetパッケージの管理　でOpenCvSharp4.Windowsをインストールする。
![2020-07-03 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/5aa5fb53-d0e0-54df-35b8-e0f5784875e2.png)

↓こんな確認画面が出るのでOK押下
![2020-07-03 (2)_LI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/11605506-4bbb-c841-b43e-1c47f00ee232.png)

#コーディング
```c#:hogehoge.xaml
色々略
<Image Name="ImageOpenCvTest"/>
色々略
```
```c#:hogehoge.cs
色々略
using OpenCvSharp;
using OpenCvSharp.Extensions;

(中略)
using (var img = new Mat(@"D:\xxx.bmp"))
{
    // 読み込んだ画像をImageコントロールのSourceに設定
    ImageOpenCvTest.Source = img.ToWriteableBitmap();
}
色々略
```

#ビルドして実行
ローカルファイルのbmpが表示されました。
Illustrator 長方形の書き方

[![Image from Gyazo](https://i.gyazo.com/7347fd002475a00fa7d85f6c7d6f36da.png)](https://gyazo.com/7347fd002475a00fa7d85f6c7d6f36da)
右のメニューの長方形選択つーるをおします

[![Image from Gyazo](https://i.gyazo.com/3a9310e02e5df0401bc60b68cc6b9b38.png)](https://gyazo.com/3a9310e02e5df0401bc60b68cc6b9b38)
任意の場所にドラッグして長方形を書くことができます。
Heroku(デプロイ２回目)


```ruby:qiita.rb
 Warning: heroku update available from 7.35.0 to 7.42.2.
```

解決方法

```qiita.rb
 $  heroku update
```

##Error: Missing required flag

[参考記事](https://qiita.com/hirokik-0076/items/71c104158fa8b963ba85)


```
 $  git remote -v
 origin	https://github.com/xxx/vue.js.git (fetch)
 origin	https://github.com/xxx/vue.js.git (push)
```


以下のherokuに紐付けるコマンドを実行

```
 $  heroku git:remote -a アプリ名
```

また、以下のコマンドでアプリが紐ずいているか確認できる。


```
 $  heroku config | grep HEROKU_APP_NAME
    HEROKU_APP_NAME: アプリ名
```

```
 $  git remote -v
 heroku	https://git.heroku.com/postapp9.git (fetch)
 heroku	https://git.heroku.com/postapp9.git (push)
 origin	https://github.com/xxx/vue.js.git (fetch)
 origin	https://github.com/xxx/vue.js.git (push)
```


```
 $ git push heroku master
```




##HerokuからHPでアプリ作成、GitHubと紐付け


[![Image from Gyazo](https://i.gyazo.com/62de61ed46a406b9ae14dcfc718531ba.png)](https://gyazo.com/62de61ed46a406b9ae14dcfc718531ba)


[![Image from Gyazo](https://i.gyazo.com/0efab5b231b5dfb43e56f767436b20aa.png)](https://gyazo.com/0efab5b231b5dfb43e56f767436b20aa)

直接デプロイしたが、エラー！！

アプリを開いても下の画面から何も変わらず。

[![Image from Gyazo](https://i.gyazo.com/d1fe29d9308440fe9112677f91a25997.png)](https://gyazo.com/d1fe29d9308440fe9112677f91a25997)
[内部結合]とある男性の女性遍歴から多目的トイレで落ち合った女性だけをリスト化してみた

SQLの内部結合、外部結合の使い所をちょっと考えてみました。

## 結合条件

２つのテーブルのカラムにに朱キーと外部キーが含まれていること

## テーブル
どの男性がどの女性とどこで落ち合うかを
中間テーブルを挟んだ多対多の関係図で表します。

[![Image from Gyazo](https://i.gyazo.com/44fb8ee7303634c2a7e6b3aea1c58f00.png)](https://gyazo.com/44fb8ee7303634c2a7e6b3aea1c58f00)


## 抽出したい情報

- 男性の氏名、年齢、職業
- 女性の氏名、年齢、職業
- 呼び出し場所の名前

## コード

未検証です。すみません。

```SQL
select 　
    M.id as male_id,
    M.name as 氏名,
    M.age as 年齢,
    M.job as 職業,
    F.name as 氏名,
    F.age as 年齢,
    F.job as 職業,
    P.name as 呼び出し場所
from 
    male M
inner join 
    place P
on 
    M.place_id = P.id
inner join 
    female F
on
    F.place_id = P.id
where
    M.name = '渡部 建' and P.name = '多目的トイレ';
```

こんな感じでしょうか。
だいぶ冗長な感かんじもしますがご容赦ください
grepコマンド

ついに昨日で途切れてしまった連続記録。。
続けることが大事だけど、それで止めるのはよくないので気を取り直して再スタート。

###grepコマンドとは
・ファイルの中で「文字列（パターン）」が含まれている行を表示するコマンド
・検索対象には、複数のファイルやディレクトリを指定できる
・ファイルを指定しなかった場合は、標準入力から読み込む
※パイプ（｜）と組み合わせて、他のコマンドの出力結果から必要な箇所だけを絞り込んで表示する際によく使われる

###代表的なオプション
・-c：マッチした行数のみ表示
・-v：マッチしなかった行数のみ表示
・-n：先頭に行番号をつけてマッチした行を表示
・-f：検索パターンからファイルを読み込む
・-i：大文字と小文字を区別しない
・-E：egrepと同様（拡張正規表現）
・-F:fgrepと同様（検索パターンエオ固定文字列）

以上。
fullcalendarを使ってイベント管理できるものを作ろう。①準備

#fullcalendarを使ってイベント管理できるものを作成しようと思っています。
これは、RubyonRailsの勉強を兼ねてのものです。何か間違っている、こう改善した方がいい、など指摘があれば教えていただけたらと思っています。
参考書は、「現場で使えるRuby on Rails 5速習実践ガイド」です。
さあ、頑張っていこう。
##環境
OS：MacOS Catalina10.15.5
Ruby：2.6.3
Rails：5.2.4

##アプリの作成
`$ rails new Mark -d postgresql`

##モデルの作成
`$ rails g model Event`
Railsのモデルは、主に2つの要素から構成
・モデルに対応するRubyのクラス
・モデルに対応するデータベースのテーブル

クラス名とテーブル名には以下の命名規約がある。
・データベースのテーブル名は、モデルのクラス名を複数形にしたもの
・モデルのクラス名はキャメルケース、テーブル名はスネークケース

##Eventモデルの属性を設定
|属性の意味|属性名・カラム名|データ型|
|:------|:------|:------|
|タイトル|title|string|
|始まり|start|datetime|
|終わり|end|datetime|
|終日|allday|boolean|
|カレンダー色|color|string|
とりあえず、こんな感じで。

```db/migrate/*******_create_events.rb
class CreateEvents < ActiveRecord::Migration[6.0]
  def change
    create_table :events do |t|
      t.string :title, null: false
      t.datetime :start, null: false
      t.datetime :end, null: false,
      t.boolean :allday, null: false, default: false
      t.string :color, null: false

      t.timestamps
    end
  end
end

```

`$ rails db:migrate`
マイグレーションをデータベースに適用。

##コントローラーとビューの作成
`$bin/rails g controller events index show new edit`
コントローラ名は、モデルの複数形。その後ろに必要なアクション名を追記。

##ルーティングの設定

```config/routes.rb
Rails.application.routes.draw do
  root to: 'events#index'
  resources :events
end
```
##fullcalendarの実装
Gemfileに追加。

```
gem 'fullcalendar-rails'
gem 'momentjs-rails'
```
`$ bundle install`

application.jsとapplication.cssに追加

```assets/javascripts/application.js
//= require jquery
//= require moment
//= require fullcalendar
//= require_tree .
```

```assets/stylesheets/application.css
*= require fullcalendar
*/
```

application.jsにコードを記述。

```assets/javascripts/application.js
$(document).ready(function() {
    $('#calendar').fullCalendar({
        events: '/events.json'
    });
  });
```

viewに表示できるように追加。

```app/view/events/index.html.erb
<div id="calendar"></div>
```

rails s　で起動させてみる。
<img width="880" alt="スクリーンショット 2020-07-03 14.24.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542247/92e27f5b-5085-ff55-f2b4-2f1c17b980b9.png">

お、出来ました。まだ、表示させただけなので、これから中身を作っていこう。。

##参考
https://qiita.com/sasasoni/items/fb0bc1644ece888ae1d4
https://qiita.com/ShoutaWATANABE/items/3d0cddafadb4f275991e
https://fullcalendar.io/
DBのデータ独立性とは

## データ独立性とは？
簡単に言うと、データベースの問い合わせなどがスキーマなどの構成方法から独立していることを表現する概念です。
適切にデータ独立性をもつように設計されたアーキテクチャにおいてはSQL文を発行する際に内部構造の変化を意識しなくても良い、などの利点が生じます。
これらについて、勉強する必要性が出てきたので、調べた結果をまとめておきます。

## 3層アーキテクチャ
データベースではデータの独立性を実現するため、3つの層を用意してそこで諸々の変更を吸収させようとする設計が用いられています。
これを3層アーキテクチャと呼び、外部スキーマ、概念スキーマ、内部スキーマの3つに分けて呼んでいます。

- 外部スキーマ
論理的データ独立性を実現するために用いられる。実際のデータベース上では view に相当する概念。

- 概念スキーマ
外部スキーマと区別したい場合に用いられる。データベース上では通常のテーブルに相当する。

- 内部スキーマ
データのストレージへの格納のされ方や、ファイル編成法などを定めた概念。

## 論理的データ独立性
3層アーキテクチャにおいて、外部スキーマと概念スキーマ間での独立性を実現する概念です。こちらはデータベースの設計に関わり、適切に設計されていないとあとで痛い目をみるところなので、より重要だと思います。
以下に、論理的データ独立性を持つ場合と持たない場合を比較した図を用意しました。論理的データ独立性を持てば、テーブルの修正に際してSQLの修正が必要ないためわざわざ既存の問い合わせ文を書き直す手間を省くことができることがわかると思います。

![non-logic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369450/dd8b018b-bd70-9476-d9eb-65f4b4125ebf.png)

![logic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369450/063e48af-d884-fe45-8c25-a6fe483b9cd4.png)



## 物理的データ独立性
3層アーキテクチャにおいて、概念スキーマと内部スキーマ間での独立性を実現する概念です。通常、ここはDBMSによって管理されているはずなので、DBを使用する側が意識する必要はないかと思いますが、以下に図にて物理的独立性がある場合と無い場合における比較をしておきます。

![non-physic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369450/e92afc16-2f03-acca-f77e-dc1b18728f7d.png)

![physic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369450/6a4b59b8-3cbb-9f43-69b5-61f800442536.png)


## 参考
[データベースの3層抽象化について](https://qiita.com/terakoya76/items/3485550d4539833da6dd)
[データベースで使われるデータ独立性とは](https://program-shoshinsya.hatenablog.com/entry/2019/10/30/200944)
データベースの基礎 [吉川正俊著, オーム社]
【初心者】Pythonの関数


###Pythonで関数を使ってみる
######引数のデフォルトを指定する

```
def hello(name="A", age=10):
	result = "Hello I'm " + name + ", I'm " + str(age)
	print(result)

>>> hello()
Hello I'm A, I'm 10
>>> hello("Bob", 20)
Hello I'm Bob, I'm 20
```

######文字列の引数を逆にする


```
>>> def reverse(s):
	cnt = len(s)
	result=""

	if cnt < 1:
		result = s
	else:		
		i = cnt-1
		while i > -1:
			result = result + s[i]
			i = i - 1
	print(result)

	
>>> reverse("abcde")
edcba
>>> reverse("a")
a
```

#####3で割り切れるか、5で割り切れるか、両方で割り切れるか
```
>>> def fb(n):
	mod3 = n % 3
	mod5 = n % 5
	result = ""
	if mod3 == 0:
		result += "Fizz"
	if mod5 == 0:
		result += "Buzz"
	return result

>>> i = 1
>>> while i <= 20:
	print(i, fb(i))
	i = i + 1

1 
2 
3 Fizz
4 
5 Buzz
6 Fizz
7 
8 
9 Fizz
10 Buzz
11 
12 Fizz
13 
14 
15 FizzBuzz
16 
17 
18 Fizz
19 
20 Buzz
```
[oneWEX] 類似文書検索をAPIで実行する

oneWEXの類似文書検索をAPIで実行する方法です。

#1 oneWEXの類似文書検索
oneWEXのマイナー画面で指定した文書の「類似文書」ボタンをクリックすると、類似文書を検索することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/f6db195c-c318-aaa2-efd4-15b95a844b7e.png)


#2 APIの実行方法
類似文書検索をAPIで実行します。
###① 文書IDの確認
文書IDは、マイナー画面で指定した文書の「すべてのフィールドを表示」ボタンをクリックすると確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/0f5f1cca-2a9d-8593-4f4c-cd15c3e78ecd.png)
###② コレクションIDの確認
コレクションIDは、管理画面でコレクションを選択し、コレクションのプロパティで確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/91509643-374f-a0ec-4dc0-5387ab09ef56.png)
###③ API 画面へアクセス
https://(サーバのホスト名またはIPアドレス)/docs/ にアクセスします。この画面からREST APIを試すことができます。
 「Authorize」をクリックしてサインイン資格情報を入力し「Done」をクリックします。 
###④ APIの実行
「Exploration」 > 「GET /api/v1/explore/{collectionId}/query Searches for documents」を開きます。
「Parameters」に以下を入力し、「Execute」をクリックします。

| パラメータ | 入力値 |
|:-----------|:------------|
| collecionId | コレクションIDを指定します |
| q | *を指定します | 
| rq | {!sss}を指定します |
| qdocid | 文書IDを指定します | 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/b9c76d97-7bfd-1231-f3c3-afa775bc8b81.png)
###⑤ 発行されたAPIと結果の確認
「Responses」 でAPIと実行結果が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248948/a17e2bba-88b0-5002-e7bb-017e5235aa34.png)

以上です。
alpineでpip3: not foundになったら

### pip3 not found エラーがでました

JenkinsでDocker Imageを作成する際に件のエラーが出た。
エラー詳細は下記のような感じ。

#### 変更前のDockerfile

```
FROM alpine

RUN apk --update-cache add \
    python3 \
    python3-dev \
    gcc \
    g++ \
    curl \
    bash

RUN curl -sSL https://sdk.cloud.google.com | bash
ENV PATH $PATH:/root/google-cloud-sdk/bin

RUN apk update  \
    && apk upgrade  \
    && gcloud components install kubectl

COPY ./requirements.txt /tmp/requirements.txt
RUN pip3 install --upgrade pip
RUN pip3 install -r /tmp/requirements.txt
```
- コンソールログ   
`pip3: not found`エラー

```
[0m ---> 1532f5abc8b7
Removing intermediate container 43dd3deb5a2a
Step 6/18 : COPY ./requirements.txt /tmp/requirements.txt
 ---> f670b2c8d83b
Step 7/18 : RUN pip3 install --upgrade pip
 ---> Running in eb003063baef
[91m/bin/sh: pip3: not found
[0mThe command '/bin/sh -c pip3 install --upgrade pip' returned a non-zero code: 127
Build step 'Execute shell' marked build as failure
Finished: FAILURE
```

### 解決策
`py3-pip`を入れましょう

#### 変更後のDockerfile

```
FROM alpine

RUN apk --update-cache add \
    python3 \
    python3-dev \
    py3-pip \
    gcc \
    g++ \
    curl \
    bash

RUN curl -sSL https://sdk.cloud.google.com | bash
ENV PATH $PATH:/root/google-cloud-sdk/bin

RUN apk update  \
    && apk upgrade  \
    && gcloud components install kubectl

COPY ./requirements.txt /tmp/requirements.txt
RUN pip3 install --upgrade pip
RUN pip3 install -r /tmp/requirements.txt
```

- コンソールログ  
これで問題なく動く

```
[0m ---> eac6c5580f52
Removing intermediate container bb0aed0b3399
Step 6/18 : COPY ./requirements.txt /tmp/requirements.txt
 ---> 6950ee7fd4a5
Step 7/18 : RUN pip install --upgrade pip
 ---> Running in d21dcaf4353c
Requirement already up-to-date: pip in /usr/lib/python3.8/site-packages (20.1.1)
 ---> c5ac41af673c
Removing intermediate container d21dcaf4353c
Step 8/18 : RUN pip install -r /tmp/requirements.txt
 ---> Running in 327efdaa6d2a
Collecting google-cloud-bigquery
  Downloading google_cloud_bigquery-1.25.0-py2.py3-none-any.whl (169 kB)
Collecting pandas
```
Ubuntu20 on RasPi 3B を使って内部向けDNSを用意した

# Ubuntu 20.04 LTSをインストールしたRasPi 3Bを使って内部向けDNSを用意した．
自分用の備忘録として，簡単に記述します．

## 実現したいこと
以下の内部向けDNS環境を構築する．
### ドメイン
|Domain name     |Network address  |
|:---------------:|:----------------:|
|home.rkarsnk.jp |192.168.100.0/24 |

### DNSサーバ
|Name server            |IP address    |
|:----------------------:|:-------------:|
|raspi3.home.rkarsnk.jp |192.168.100.3 |

### 名前解決したいホスト
|Host name              |IP address    |
|:----------------------:|:-------------:|
|router.home.rkarsnk.jp |192.168.100.1 |
|raspi3.home.rkarnsk.jp |192.168.100.3 |

### CNAMEレコード
|Canonical name |Host name|
|:-------:|:-----:|
|www\.home.rkarsnk.jp |raspi3.home.rkarsnk.jp |


## dnsmasqの導入
aptを使ってdnsmasqをインストールする．

```bash
sudo apt install dnsmasq
```

## 設定ファイル
```/etc/dnsmasq.conf
port=53
domain-needed
# プライベートIPの逆引きを上位DNSに転送しない
bogus-priv

# ①上位の名前解決をするネームサーバを指定する(resolv.dnsmasq.conf)．
resolv-file=/etc/dnsmasq.d/resolvconf/resolv.dnsmasq.conf

strict-order

# ゾーン設定
server=/home.rkarsnk.jp/192.168.100.3
server=/100.168.192.in-addr.arpa/192.168.100.3

#ローカルドメイン設定
local=/home.rkarsnk.jp/

# ②名前解決をするホストを指定する(hosts.dnsmasq)．
addn-hosts=/etc/dnsmasq.d/data/hosts.dnsmasq

# ホスト名で問い合わせたとき，指定されたドメインで補完
expand-hosts
domain=home.rkarsnk.jp

# CNAMEレコードの設定
cname=www.home.rkarsnk.jp,raspi3.home.rkarsnk.jp
```
①，②を指定しない場合，システムの`/etc/{resolv.conf,hosts}`が参照される．

```/etc/dnsmasq.d/resolvconf/resolv.dnsmasq.conf
8.8.8.8
8.8.4.4
```
ここでは，上位の名前解決にはGoogle Public DNSを利用する．

```/etc/dnsmasq.d/data/hosts.dnsmasq
router.home.rkarsnk.jp        192.168.100.1
raspi3.home.rkarsnk.jp        192.168.100.3
```

## サービスの起動
```bash
% sudo systemctl start dnsmasq.service
```

## 確認
```
# digで確認
% dig raspi3 @192.168.100.3
; <<>> DiG 9.10.6 <<>> raspi3 @192.168.100.3
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38381
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;raspi3.				IN	A

;; ANSWER SECTION:
raspi3.			0	IN	A	192.168.100.3

;; Query time: 1 msec
;; SERVER: 192.168.100.3#53(192.168.100.3)
;; WHEN: Fri Jul 03 13:37:50 JST 2020
;; MSG SIZE  rcvd: 51

# hostで確認
% host raspi3
raspi3.home.rkarsnk.jp has address 192.168.100.3

# CNAME設定の確認
% host www
www.home.rkarsnk.jp is an alias for raspi3.home.rkarsnk.jp.
raspi3.home.rkarsnk.jp has address 192.168.100.3

# 上位の名前解決が正常に動作するか確認
% host www.yahoo.co.jp
host www.yahoo.co.jp
www.yahoo.co.jp is an alias for edge12.g.yimg.jp.
edge12.g.yimg.jp has address 183.79.250.251
```
TypeScript の型の一部を変更する

### 結論

こんな感じのを作ると良さそう（多分、組み込みには無いはず）。

```typescript
type Replace<T, U> = {
  [P in keyof T]: P extends keyof U ? U[P] : T[P]
}
```

### 実例

リリース版の Nuxt Axios Module の retry の定義がおかしいので変更したかった（現在の dev ブランチでは修正済み）。

```typescript
AxiosOptions {
  // これを boolean | IAxiosRetryConfig にしたい
  retry?: boolean
}
```

こんな感じでやろうとしたけどダメだった。

```typescript
// こっちは OK
type CustomAxiosOptions = Omit<AxiosOptions, 'retry'> & { retry?: boolean | IAxiosRetryConfig }

// Configuration が extends Record<string, any> しているので、Omit が期待した結果にならない
type CustomConfiguration = Omit<Configuration, 'axios'> & { axios?: CustomAxiosOptions }
```

こんな感じにしたら期待通りの結果になった。

```typescript
type Replace<T, U> = {
  [P in keyof T]: P extends keyof U ? U[P] : T[P]
}

type CustomAxiosOptions = Replace<AxiosOptions, { retry?: boolean | IAxiosRetryConfig }>
type CustomConfiguration = Replace<Configuration, { axios?: CustomAxiosOptions }>
```
PythonCGIでラズパイのGPIOを操作しよう

# 前提
- `python -m http.server 8080 --cgi`でCGIが実行可能
- Apache2をインストール済み

# Apache2の設定
- [過去の記事](https://qiita.com/Disk_MJM/items/7e334169180d24a330a3)を参考にして設定してください。

# GPIOを使うための設定
- `sudo usermod -aG gpio www-data`をしておく

## 解説
　先ほどのコマンドを入力せずに実行するとエラーは表示されないが、ラズパイに反応が現れない。そこでエラーログを確認してみる。
　`less /var/log/apache2/error.log`として確認すると、`RuntimeError: No access to /dev/mem.  Try running as root!`とエラーが表示されている。「ルートとして実行してみてください。」と書かれているので先ほどの設定でルート権限を与えた。`www-data`というのはApache2のユーザ名である。
【Laravel】エラーページ のカスタマイズ

# 内容
laravelでは、エラーが発生したときに表示させるページがあらかじめ用意されています
例えば、404 Not Foundや500 Server Errorなどです
しかし、そのページをそのまま利用することは一般的にありません
そこでエラーページのカスタマイズを説明したいと思います
内容は少ないですが、備忘録として記録しておきます

# 方法
resources/views/errors/以下にビューを配置すればOKです
ただし、ファイル名はエラーコードと同じにしなければなりません
例えば、404.blade.phpや500.blade.phpのようにです

手作業でファイルを作っていってもいいですが、あらかじめ用意されているエラーページがわからなかったり、ページもれがあるといけないので、以下のコマンドを実行することをおすすめします

```zsh
php artisan vendor:publish --tag=laravel-errors
```

これによって、resources/views/errors/以下に用意されているビューが生成されます（厳密にはコピーされます）

HTTP例外を発生させるのにabortヘルパーが便利です
引数にエラーコードを指定するだけでエラーを故意的に発生させることができます
第二引数にメッセージを指定して、$exception->getMessage()で呼び出すことができます

```php
abort(404, 'Not Found');
```

# おわり
Laravelでは例外処理があらかじめ組み込ませているので、エラー周辺はページのカスタマイズだけで、簡単なアプリは作れます