OmniAICreator/Qiita-1.07M huggingface dataset:
cssでオンオフtoggleボタン

## 完成物
これです。

<img width="124" alt="スクリーンショット 2020-02-22 22.29.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177043/60cc27ba-898a-5399-e470-217ccb5851a2.png">
<img width="133" alt="スクリーンショット 2020-02-22 22.29.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177043/07f58105-4930-4f90-66ff-423ab9de79f6.png">


## html

```index.html
<!DOCTYPE html>
<html lang ="ja">
<head>
    <link rel="stylesheet" href="../css/toggle.css">
</head>
<body>
    <div class="toggle-switch">
        <input id="toggle" class="toggle-input" type='checkbox' />
        <label for="toggle" class="toggle-label"/>
    </div>
</body>
</html>
```

## css

```toggle.css
.toggle-input {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  z-index: 5;
  opacity: 0;
  cursor: pointer;
}

.toggle-label {
  width: 75px;
  height: 42px;
  background: #ccc;
  position: relative;
  display: inline-block;
  border-radius: 46px;
  transition: 0.4s;
  box-sizing: border-box;
}
.toggle-label:after {
  content: "";
  position: absolute;
  width: 42px;
  height: 42px;
  border-radius: 100%;
  left: 0;
  top: 0;
  z-index: 2;
  background: #fff;
  box-shadow: 0 0 5px rgba(0, 0, 0, 0.2);
  transition: 0.4s;
}

.toggle-input:checked + .toggle-label {
  background-color: #4BD865;
}
.toggle-input:checked + .toggle-label:after {
  left: 40px;
}

.toggle-switch {
  position: relative;
  width: 75px;
  height: 42px;
  margin: auto;
}
```


## ちょっと説明
よくあるやり方ですがcheckboxにデザインをあてて実現してます。
上に乗っている丸いボタンはlabelタグです。

checkedの時に背景色を変え、labelタグを動かし、この時の変化をアニメーションにするためにtransitionを付与します。
あとはデザインの話なのでお好きにどうぞで。
【Docker】docker-compose up -d 時のエラー No container found for ○○ の対処法


コマンド```docker-compose up -d```の際に、次のエラーが表示されました。


```
ERROR: No container found for コンテナ名
```

## 原因

起動後すぐにコンテナが落ちてしまっている


## 解決法

```docker-compose up -d```だとバックグラウンドでの起動になりエラーログがでないので、
原因を知るために```docker-compose up```でコンテナを起動する。そうすればエラーログをみることができるので何かしらの進展が期待されると思います。


こちらに移動しました。

 http://code-aim.work/?p=95
VFX Graph初動のススメ

## VFX Graphを扱うときの注意点

- Unityのバージョンに関する注意

  バージョン：2019.3.0f6以降のもの

- プロジェクト開始時にテンプレートシーンを選ぶとセッティングをしなくていいのでそちらをオススメする（そちらじゃないと自分はわからないとも言う）

  - こちらを選び、新しいシーンを生成する際には、Asset→Create→HD Template Sceneを選択し生成する。(このシーンは初期からHDRPで構築されているシーン)

  





## VFX Graph（Visual Effect Graph）とは

- そもそも、この技術（VFX）はCG側で使われていたものであり、当時は処理が重くゲーム側で使えるような物ではなかったが、グラフィックボードの進化、Unity側の努力によりノードベースで簡単にパーティクルが作れるというものである。





## 実際の作成方法

1. まず前提としてHD Template Sceneでやろうとしているものとする。

2. Asset → Create → Visual Effect → Visual Effect Graph を作成

3. 作成したVisual Effect Graph をダブルクリック

4. 四大処理のノードが表示されるのでそこをいじって自分の作りたいパーティクルを作成していく

   実際に表示されるものがこちら ↓ 

   ![スクリーンショット (50).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414957/0c114fe3-c5e2-1a15-50b7-1ee94c861cad.png)



## できること・メリット・デメリット

- **できること**
  - そもそもVFX Graphとはパーティクルシステムの一種なのでパーティクルを作成することができます。
- **メリット**
  - ノードシステムでできるのでかなり手軽に作成することができる。
  - パーティクルシステムとの比較になるが、CPUで行われていた処理がGPUで行われているので、パーティクルシステムよりかなり軽い。
- **デメリット**
  - 比較的最近正式リリースされたものなので、サンプル数が他と比べると少なめ。





## 参考にした方がいいもの

- ブログ等で作成されているものだと、実際に作成できなかったり、HDRPのセッティングから行っていたりするので、**Asset(作成されたものからの学習)やUnity Japanが出している動画**を参照することを**強く**オススメする。（おすすめの物は引用のところに貼っておく）






## 引用

参考動画１：https://www.youtube.com/watch?v=Xwmdl4sbsjY

参考アセット１：https://assetstore.unity.com/packages/vfx/particles/cool-visual-effects-161342?locale=ja-JP
【JavaScript】this

下記のようなクラスがあるとします。

```javascript
class Person {
    constructor(name,age) {
      this.name = name
      this.age = age
    }
    hello() {
      console.log(`my name is = ${this.name}. ${this.age} years old.`)
    }
```

関数内でthisを呼び出す場合、下記のような書き方だとTypeError: this.hello is not a functionとなりエラーになります。

```javascript
    remember(){
      setTimeout(function() { 
          this.hello(); 
      }, 1000);
    }
```
JavaScriptでは、関数内のthisは関数自体を指すため、hello()なんてないですよと怒られている状態です。
そのため、一度別の定数に退避させる必要があります。

```javascript
    remember(){
      const self = this 
      setTimeout(function() { 
          self.hello(); 
      }, 1000);
    }
```
一度退避することで、呼びたいthisを正しく呼び出すことができます。


thisを退避させずに呼び出すには、bindメソッドを使います。

```javascript
    remember2(){
      // self = thisが不要
      setTimeout(function() { 
          this.hello(); 
      }.bind(this), 1000);
    }
```

bindは束縛という意味です。

また、アロー関数にしてしまうとさらに短縮できます。

```javascript
remember3() {
    // self=thisが不要
    setTimeout(()=>{ 
      this.hello();
    }, 1000);
  }
```
プログラミング講座2

##講座内容
・新規処理を作る

##新規処理を作る
ってなったとき、まず何から始めましょう？

答えは一つ、要件を理解しましょう
何がしたいのかを把握してから詳細設計書を読みます

次にクラスを作っていくわけですが、
個人的なおすすめはこうです

```サンプル.java
package course;

public class Course1 {

	public void execute() {
		
		// レコード抽出
		
		// ビジネスロジック呼び出し
	}
	
	private void logic() {
		
		// ロジック
		
		// なんかをする
		
		// なんかをする
		
		// 結果を返却
	}
}
```

日本語でメモしていきましょう
多分これが一番イメージを持ちやすい進め方だと思います

最初は処理速度とか意識しないで、メソッド分けとかも意識しないで
とりあえずガンガン書いちゃって
キリの良いところで、似てる処理を共通化してメソッド分けしていく感じですね

```こういうのを.java
	private String logic1(String str) {
		
		String asd = str + "asd";
		
		return asd + "asd";
	}
	
	private void logic2(String str) {
		
		String asd = str + "asd";
		
		System.out.println(asd);;
	}
```

```こうする.java
	private String logic1(String str) {
		
		String asd = common(str);
		
		return asd + "asd";
	}
	
	private void logic2(String str) {
		
		String asd = common(str);
		
		System.out.println(asd);
	}
	
	private String common(String str) {
		return str + "asd";
	}
```

```でこう.java
	private String logic1(String str) {
		return common(str) + "asd";
	}
	
	private void logic2(String str) {
		System.out.println(common(str));
	}
	
	private String common(String str) {
		return str + "asd";
	}
```

もちろんまとめすぎもよくないですが、基本的な進め方はこんな感じなんじゃないでしょうか

たとえが簡単すぎると感じたらこちらをやってみましょう

```目的
小文字のアルファベット文字列「a, b, c...」すべてに対して
「a, s, d, f, g, h, j, k」の場合は文字列「3」を後ろに加え
「q, w, e, r, t」の場合は文字列「QWE」を後ろに加え
コンソールに出力する
```

個人的な答えも載せておきます

```答え.java
package course;

import java.util.Arrays;
import java.util.List;
import java.util.function.UnaryOperator;

/**
 * サンプルの答え
 * 
 * @author 自分
 *
 */
public class Course2 {
	
	/** 小文字アルファベット */
	List<String> alphabet = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
	/** 後ろに3を付ける文字群 */
	List<String> add3 = Arrays.asList("a", "s", "d", "f", "g", "h", "j", "k");
	/** 後ろにQWEを付ける文字群 */
	List<String> addQWE = Arrays.asList("q", "w", "e", "r", "t");

	/**
	 * 編集後のアルファベットをコンソールに出力
	 */
	public void execute() {
		alphabet.stream().map(editText).forEach(System.out::println);
	}
	
	/**
	 * 引数の文字列を編集する<pre>
	 * 「a, s, d, f, g, h, j, k」の場合は「3」
	 * 「q, w, e, r, t」の場合は「QWE」</pre>
	 * を後ろに加える
	 * その他の文字列の場合は何もしない
	 * 
	 * @param str アルファベット
	 * @return 編集後の文字
	 */
	private UnaryOperator<String> editText = str -> {

		if (add3.contains(str)) {
			return str + "3";
		}

		if (addQWE.contains(str)) {
			return str + "QWE";
		}

		return str;
	};
}
```
Windows FormsアプリからWindows 設定を開く

# 機内モードのステータスに応じて設定画面出したくて困ったメモ

URIスキームを指定してLaunchUriAsyncで呼び出せば良さそう。
[Windows 設定アプリの起動](https://docs.microsoft.com/ja-jp/windows/uwp/launch-resume/launch-settings-app)

だけども、これはWindowsFormsアプリでは使えない。
LaunchUriAsyncがUWPアプリ用。
こまった(´・ω・`)


[What package is Windows.System.Launcher in?](https://stackoverflow.com/questions/17768507/what-package-is-windows-system-launcher-in)

```
Process.Start("ms-settings:network-airplanemode")
```

これで良いみたい(o・ω・o)
Chrome81に向けて対応すること

#Chrome 81で何が変わるのか
2020年3月17日にGoogle Chrome 81のリリースが予定されています。
参考URL)
https://www.chromestatus.com/features/schedule

このバージョンの主な変更点はこちらです。
　* 混在コンテンツの画像を自動的にhttpsに読み替えて、読み込めない場合はブロックする。
　* TLS 1.0 と 1.1 をブロックする

#１．混在コンテンツの画像を自動的にhttpsに読み替えて、読み込めない場合はブロックする。
※自サイトがSSL化されていることは前提として、記述します。

https://ドメイン名/xxxxx  で表示したページ内に
http://ドメイン名/xxx.png　とhttpで記載された画像が存在していた場合、
Chromeが自動的に
http **s**://ドメイン名/xxx.png　とhttpsのパスに読み替えてリクエストしてくれます。


|       対象       |　　　　事象　　　　|
|:----------------:|:-----------------------:|
| JavaScript       |既にブロック済|
| iframe           |既にブロック済|
| 動画             |既にhttpsに読替済|
| オーディオ       |既にhttpsに読替済|
| **画像**             |**Chrome81で対応**|
##対応しない場合の影響
画像を有するサイトがhttpsに対応していなかった場合には画像が取得できません。
HTML、CSSにて、画像が読み込めない場合の考慮ができていない場合、画面体裁が崩れます。



##開発者の対応内容
1. ソースファイルなどを「http://」で検索する。


　※もちろん、相対パス、ルート相対パスの場合には影響はありません。
　　絶対パスで記載されている箇所を探しましょう。

　※自動で読み替えてくれるとはいえ、
　　ブラウザに依存するのではなく、この機に明示的に修正しておいたほうがよいでしょう。

2.画面を回遊し、警告が表示されているページを探索する。 
混合コンテンツが含まれているページの場合、Chromeでは以下のように表示されます。
![保護されていない通信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427251/28fb828f-eaac-02b1-c305-e2d57e9c459c.png)

3.今回の影響範囲に該当する場合は「https://」に修正する。
・個別の切り分けを行わないまま、一括で置換することはおすすめしません。
ブラウザを経由しないサーバ間通信のようにSSL化されておらず、「http://」でなければ接続できないケースもあるためです。

参考URL）
https://security.googleblog.com/2019/10/no-more-mixed-messages-about-https_3.html
https://developers-jp.googleblog.com/2019/11/https.html

#２．TLS 1.0 と 1.1 がブロックされる

Chrome 81 以降では、TLS 1.0 または 1.1 を使っているサイトにアクセスしようとすると、
ページ全体を覆うインタースティシャル警告が表示されて接続がブロックされます。
※問題があるのは全体の0.5% 程度とのことなので、対応が必要なサイトは少ないでしょう。


##開発者の対応内容
1. Chrome 79 以降を利用して、「Not Secure」インジケーターを表示されないことを確認する。

2. TLS 1.0 または 1.1 で接続していた場合には、TLS 1.2 以降を有効にする。

参考URL）
https://developers-jp.googleblog.com/2019/10/tls-chrome-ui.html

以上になります。
CentOS/Red Hat7/8でのFirewalld設定修正方法

１）Firewalldで事前に定義されているZoneについて

Firewalld にはOSをインストールした段階で、以下のZoneが定義済みです。

block : 全ての inbound 通信を拒否
drop : 全ての inbound 通信を拒否(ICMP返さない)
dmz : DMZ配置インタフェース用Zone
external : 外部接続インタフェース用Zone。NAPT(masquerade)有効に。
home : 内部インタフェース用Zone
internal : 内部インタフェース用Zone
public : 標準Zone。
trusted : 全ての通信を許可するZone。
work : 作業エリアインタフェース用Zone。

２）２NICありNAT Routerのような用途にする場合、インターフェイスのZoneの変更をする

＃firewall-cmd --change-interface ens10 --zone=internal --permanent
＃firewall-cmd --change-interface ens3 --zone=external --permanent

３）確認
＃firewall-cmd --get-active-zones
(以下結果表示)
internal
  interfaces: ens10
external
  interfaces: ens3

※インストール直後はpublicになっている

４）現在のポート確認と追加

確認
＃firewall-cmd --list-ports --zone=external

８０８０/TCPを追加
＃firewall-cmd --add-port=8080/tcp --zone=external --permanent

追加設定を反映
＃firewall-cmd --reload

５）サービスを追加(DHCP)
＃firewall-cmd --add-service=dhcp --zone=internal --permanent

追加設定を反映
＃firewall-cmd --reload

６）IPMASQUARADEの設定

＃firewall-cmd --zone=external --add-masquerade --permanent

追加設定を反映
＃firewall-cmd --reload

反映の確認
＃firewall-cmd --list-all-zones
ユーザーのプライマリグループを変更する・差し替える（超シンプル）



ユーザーのプライマリグループを変更して、元々のプライマリグループをサブグループに追加する作業がごくたまに発生して、絶妙に忘れてしまっていつもググっているのでメモ。

Amazon Linux (CentOS 6), Amazon Linuz 2 (CentOS 7) で動作確認済み。

## 1.ユーザーグループの確認

```
$ groups [ユーザー名]
```


## 2. プライマリグループを変更する

```
$ sudo su -
$ usermod -g [変更先のプライマリグループ] [ユーザー]
# example
$ usermod -g nginx sshuser
```

## 3. サブグループを変更する

```
$ sudo su -
$ usermod -aG [追加するサブグループ] [ユーザー]
# e.g
$ usermod -aG sshuser sshuser
```

## 4. ユーザーグループの確認

```
$ groups [ユーザー名]
```

参考
https://www.atmarkit.co.jp/ait/articles/1612/14/news022.html
ShellScript 【 while read 】 ファイルを１行ずつ読み込む

### 2024/02/29 追記

内容を更新して自社のテックブログに転記しました。
https://eight-hundred-800-dev.hatenablog.com/entry/2024/02/29/180000

### 書式
```shell
while read 【変数名】
do
  【実行されるコマンド等】
done < 【ファイル名】

# while ～ do を１行に書く場合は do の前に ; が必要
while read 【変数名】; do
  【実行されるコマンド等】
done < 【ファイル名】
```
docker-machineのデフォルトOS,shellを確認してみました

# 結果
ディストリビューション：Core linux
シェル：bash
ディストリビューションはコアリナックスというミニマムなものでした。
[core linux](https://ja.wikipedia.org/wiki/Tiny_Core_Linux)

シェルは有名なbashでした。

# 状況
docker-machineで立ち上げた時linuxっぽいものが
動いているけどディストリビューションは何だろう？
という疑問が出てきたので確認してみました。

以下docker、docker-machineが動く前提です。

# 確認した手順｜コマンド

```Verification.sh

#verificationという名前の仮想マシンを作る
$ docker-machine create verification

#verificationにsshで入る
$ docker-machine ssh verification

#ここからはverification内でのコマンド実行
#ディストリビューションを確認するコマンド実行
$ cat /etc/issue
Core Linux

#シェルを確認
$ echo $SHELL
/bin/bash

```

# 備考
ディストリビューション（正確にはlinuxの系列）や
シェルの違いでコマンドが違ってくるので自分用備忘録として書きました。
Flutterで複数pushした画面やダイアログをまとめて閉じて戻る方法

こんにちは！最近はFlutterで個人開発を行なっている、iOSアプリ開発者の[村松龍之介](https://twitter.com/Riscait)です。

## やりたいこと
ホーム画面からpushした画面上でダイアログを開き、ダイアログのボタンを押すとホーム画面へ戻りたかったのですが、すぐに分からなかったので今回調べました。

## 課題
ダイアログを閉じるのに `Navigator.of(context).pop()`が必要なので2回popしなければなりません。

```dart
Navigator.of(context).pop(); // ダイアログを閉じる
Navigator.of(context).pop(); // pushした画面に戻る
```

上記のように書けば実現はできるのですが、２度同じことを書かなくても実現する方法を調べました。

## 解決方法
```dart
Navigator.of(context).popUntil((route) => route.isFirst);
```
`popUntil`メソッドの使い方が最初わからなかったのですが、文脈的にも「ルートの最初まで戻る」ということで、この使い方で良さそうですね。

## 参考
[Navigator.popUntilを使用して、固定名なしでルーティングする - dart - Dev4App's Blog](https://dev4app.com/archives/51535621-using-navigator-popuntil-and-route-without-fixed-name.html)
[やってみた][TELLO]Scratch2にTELLOコマンドを追加

## 環境

```
$ uname -a
Linux c069544-Surface-Go 5.3.0-40-generic #32~18.04.1-Ubuntu SMP Mon Feb 3 14:05:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 18.04.4 LTS \n \l
```



## 参考サイト

[【ドローン】TelloでScratchプログラミングにチャレンジ！](https://sakayasu.net/tello-programming/)



## 手順

1. TELLO用プログラミングファイルをダウンロード

   ```
   $ cd ~/Scratch2
   $ wget https://dl-cdn.ryzerobotics.com/downloads/tello/20180222/Scratch.zip
   $ unzip Scratch.zip
   ```

2. Scratch2を起動

3. Shiftキーを押しながらメニューバーの「ファイル」をクリック

4. 「実験的なHTTP拡張を読み込み」をクリック

5. 「Tello.s2e」を選択

6. スクリプトの「その他」にTELLO用コマンドが追加される
みんなでしりとり　Ruby編

エンジニア目指して一生懸命勉強中です。
ランクBは難しい！調べながらじゃないとクリアできなくて悔しい！
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
みんなでしりとり（Bランク練習問題 Ruby）
https://paiza.jp/works/mondai/skillcheck_archive/word_chain?language_uid=ruby&t=5849f929b8390356d4da2de5cc89575f
参考にした動画(Python3)
https://www.youtube.com/watch?v=ihItHDx9sX0

※練習問題はブログやSNS等に掲載することはOKとのことです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

line = gets.split.map(&:to_i)
n = line[0]    #人数
k = line[1]    #単語数
m = line[2]    #発言数
word_list = [] #使用可能な単語
siri = []      #入力された単語全部
used_siri = [] #使用した単語

#単語の格納
k.times do
    word_list.push(gets.chomp.to_s)
end

m.times do
    siri.push(gets.chomp.to_s)
end

#生きてる人数
alive = Array.new(n,true)

#４つのルール
def ruleO(w,s)
    return w.include?(s)
end

def ruleT(b,a,ruleT_pass) 
    return b[-1,1] == a[0,1] ||
    ruleT_pass == true
end

def ruleTh(a,b)
    return a.include?(b) != true
end

def ruleF(a)
    return a[-1,1] != "z"
end

#次に発言する人の番号を求める
def next_number(alive,now_number)
    now_number += 1
    until alive[now_number] == true 
        if now_number >= alive.size
            now_number = 0
        else
            now_number += 1
        end
    end
    return now_number
end

#初期値
now_number = 0
#一番最初の人はルール２免除
ruleT_pass = true

#しりとり開始
(1..m).each do |num|
    if ruleO(word_list,siri[num - 1]) &&
    ruleT(siri[num - 2],siri[num - 1],ruleT_pass) &&
    ruleTh(used_siri,siri[num - 1]) && ruleF(siri[num - 1])
    used_siri.push(siri[num - 1])
        ruleT_pass = false
    else
        alive[now_number] = false
        ruleT_pass = true
    end
    now_number = next_number(alive,now_number)
    if word_list.sort == used_siri.sort
        used_siri = []
    end
end

#output
p alive.count(true)

alive.size.times do
    if alive.find_index(true) 
    f = alive.find_index(true) 
    puts (f.to_i + 1)
    alive[f] = false
    end
end
Java添加excelデータ検証

Excelでは、データ検証を利用してデータの入力に一定の制限条件を加えることができます。たとえば、データ検証の基本設定によって、セルは整数、小数、時間、日付などしか入力できなくなります。プルダウンメニューのオプションも作成できます。この文ではSpire.XLS for Javaを使用したデータ検証を紹介します。

```java

import com.spire.xls.*;

public class ShapeAsImage {
    public static void main(String[] args) {
        // Workbookオブジェクトを作成
        Workbook workbook = new Workbook();

        //最初のシートを取得
        Worksheet sheet = workbook.getWorksheets().get(0);

        //セルB2にデジタル認証を設定します。3-6までの数だけ入力できます
        sheet.getCellRange("B1").setText("Input Number(3-6):");
        CellRange rangeNumber = sheet.getCellRange("B2");
        rangeNumber.getDataValidation().setCompareOperator(ValidationComparisonOperator.Between);
        rangeNumber.getDataValidation().setFormula1("3");
        rangeNumber.getDataValidation().setFormula2("6");
        rangeNumber.getDataValidation().setAllowType(CellDataType.Decimal);
        rangeNumber.getDataValidation().setErrorMessage("Please input correct number!");
        rangeNumber.getDataValidation().setShowError(true);
        rangeNumber.getCellStyle().setKnownColor(ExcelColors.Gray25Percent);

        //セルB 5に日付認証を設定します。1/1/2020から3/1/2020までの間の日付を入力するだけです
        sheet.getCellRange("B4").setText("Input Date:(1/1/2020 to 3/1/2020)");
        CellRange rangeDate = sheet.getCellRange("B5");
        rangeDate.getDataValidation().setAllowType(CellDataType.Date);
        rangeDate.getDataValidation().setCompareOperator(ValidationComparisonOperator.Between);
        rangeDate.getDataValidation().setFormula1("1/1/2020");
        rangeDate.getDataValidation().setFormula2("3/1/2020");
        rangeDate.getDataValidation().setErrorMessage("Please input correct date!");
        rangeDate.getDataValidation().setShowError(true);
        rangeDate.getDataValidation().setAlertStyle(AlertStyleType.Warning);
        rangeDate.getCellStyle().setKnownColor(ExcelColors.Gray25Percent);

        //セルB 8で文字長検証を設定します。5文字以内のテキストのみ入力できます
        sheet.getCellRange("B7").setText("Input Text:");
        CellRange rangeTextLength = sheet.getCellRange("B8");
        rangeTextLength.getDataValidation().setAllowType(CellDataType.TextLength);        rangeTextLength.getDataValidation().setCompareOperator(ValidationComparisonOperator.LessOrEqual);
        rangeTextLength.getDataValidation().setFormula1("5");
        rangeTextLength.getDataValidation().setErrorMessage("Enter a Valid String!");
        rangeTextLength.getDataValidation().setShowError(true);
        rangeTextLength.getDataValidation().setAlertStyle(AlertStyleType.Stop);
        rangeTextLength.getCellStyle().setKnownColor(ExcelColors.Gray25Percent);

        sheet.autoFitColumn(2);

        workbook.saveToFile("output/DataValidation.xlsx", ExcelVersion.Version2010);
    }
}
```

効果図：
![DataValidation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/d11fa865-8297-ba38-c315-b2a83e960dcd.png)
Raspberry Pi Zero W をWPA2-EAPのWi-Fiにつなげてみた

#はじめに
Raspberry Pi３など、メジャーなラズパイデバイスのWi-Fi接続方法は様々な記事がありましたが、
「Raspberry Pi Zero W」 についての記事は無かった？（2020/02/25現在）ため備忘録を兼ねてこの記事を投稿します。
既出でしたらすみません。

#環境
・デバイス：Raspberry Pi Zero W
・OS：Raspbian stretch

#接続方法(設定ファイルの編集)
Raspberry PiのGUI上からSSIDは見えているのにグレーアウトしており選択できない事象に対処する方法となります。

最初に
sudo nano(またはvi) /etc/wpa_supplicant/wpa_supplicant.conf
で設定ファイルを編集します。
以下の様に設定内容を追記してください。

```ruby:wpa_supplicant.conf追記後

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
	ssid="【接続したいSSID名】"
    priority=1
	proto=RSN
	key_mgmt=WPA-EAP
	pairwise=CCMP
	auth_alg=OPEN
	eap=PEAP
	identity="【ユーザー名】"
	password="【パスワード】"
	phase1="peaplabe=0"
	phase2="auth=MSCHAPV2"
}
```

password=""の行について、
セキュリティ面で不安な場合は、設定ファイル内に記述するパスワードをハッシュ化するなどしてください。

最後に端末を再起動させると
設定したSSIDにつながるようになります。


#参考にさせていただいた記事
Raspberry Pi3でWPA2-EAP(PEAP)なWi-Fiに接続する
https://qiita.com/YasuhiroABE/items/1c8ac9e5636b28565c4b
とても参考になりました。ありがとうございます。
[TELLO]Ubuntu18.04にScratch2をインストール

## 環境

```
$ uname -a
Linux c069544-Surface-Go 5.3.0-40-generic #32~18.04.1-Ubuntu SMP Mon Feb 3 14:05:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/issue
Ubuntu 18.04.4 LTS \n \l
```



## 参考サイト

[How to install scratch 2 in ubuntu 18.04](https://askubuntu.com/questions/1042608/how-to-install-scratch-2-in-ubuntu-18-04)



## 手順

1. install necesary i386 libraries

   ```
   $ sudo apt-get install libgtk2.0-0:i386 libstdc++6:i386 libxml2:i386 libxslt1.1:i386 libcanberra-gtk-module:i386 gtk2-engines-murrine:i386 libqt4-qt3support:i386 libgnome-keyring0:i386 libnss-mdns:i386 libnss3:i386
   ```

   

2. make keyring visible for Adobe Air

   ```
   $ sudo ln -s /usr/lib/i386-linux-gnu/libgnome-keyring.so.0 /usr/lib/libgnome-keyring.so.0
   $ sudo ln -s /usr/lib/i386-linux-gnu/libgnome-keyring.so.0.2.0 /usr/lib/libgnome-keyring.so.0.2.0
   ```

   

3. Download Adobe Air

   ```
   $ cd ~/Scratch2
   $ wget http://airdownload.adobe.com/air/lin/download/2.6/AdobeAIRSDK.tbz2
   $ sudo mkdir /opt/adobe-air-sdk
   $ sudo tar jxf AdobeAIRSDK.tbz2 -C /opt/adobe-air-sdk
   ```

   

4. Download Air runtime/SDK from Archlinux

   ```
   $ wget https://aur.archlinux.org/cgit/aur.git/snapshot/adobe-air.tar.gz
   $ sudo tar xvf adobe-air.tar.gz -C /opt/adobe-air-sdk
   $ sudo chmod +x /opt/adobe-air-sdk/adobe-air/adobe-air
   ```

   

5. Get actual scratch file URL from https://scratch.mit.edu/scratch2download/

   ```
   $ sudo mkdir /opt/adobe-air-sdk/scratch
   $ wget https://scratch.mit.edu/scratchr2/static/sa/Scratch-456.0.1.air
   $ sudo cp Scratch-456.0.1.air /opt/adobe-air-sdk/scratch/
   $ cp Scratch-456.0.1.air /tmp/
   $ cd /tmp/
   $ unzip /tmp/Scratch-456.0.1.air
   $ sudo cp /tmp/icons/AppIcon128.png /opt/adobe-air-sdk/scratch/scratch.png
   ```

   

6. Create Desktop Shortcut

   ```
   $ sudo -i
   
   # sudo cat << _EOF_ > /usr/share/applications/Scratch2.desktop
   [Desktop Entry]
   Encoding=UTF-8
   Version=1.0
   Type=Application
   Exec=/opt/adobe-air-sdk/adobe-air/adobe-air /opt/adobe-air-sdk/scratch/Scratch-456.0.1.air
   Icon=/opt/adobe-air-sdk/scratch/scratch.png
   Terminal=false
   Name=Scratch 2
   Comment=Programming system and content development tool
   Categories=Application;Education;Development;ComputerScience;
   MimeType=application/x-scratch-project
   _EOF_
   
   # sudo chmod +x /usr/share/applications/Scratch2.desktop
   
   # exit
   ```
Java 基数の変換方法

# 10進数からn進数へ変換

```java
int x = 11;
int baseNumber = 2;
String result = Integer.toString(x, baseNumber);
System.out.println(result); // 1011
```

# n進数から10進数へ変換
```java
String x = "1e"; // 1e = 16進数
int baseNumber = 10;
int result = Integer.parseInt(x, baseNumber);
System.out.println(result); // 30
```
Fish shellアップデート時のエラー対応

# UbuntuのパッケージをアップデートしたらFish shellがエラーを吐くようになった

最近（2020/02/25）、Ubuntuのアップデートリクエストに従ってアップデートを行ったところ、Fish shellの起動時に次のようなエラーが発生するようになった。aptの履歴によるとfish shellが更新されている。

発生しているエラー

```shell
~/.config/fish/functions/fish_prompt.fish (line 162): Expected a string, but instead found a '&'
      git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1
                                                       ^
from sourcing file ~/.config/fish/functions/fish_prompt.fish
in command substitution
source: Error while reading file '/home/dev-user/.config/fish/functions/fish_prompt.fish'
Welcome to fish, the friendly interactive shell
```

また、エラーだけでなく、プロンプトも次のようにいつもと違う表示になっている。

```shell
dev-user@thinkpad /home/dev-user >
```

自分の環境の場合、$HOMEにいるときは「 > 」のようにシンプルに表示されるのが正しい。

# 環境

Ubuntu 18.04.4 LTS
fish-common:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)
fish:amd64 (3.0.2-1~bionic, 3.1.0-1~bionic)

ThinkPad X1C 2017にUbuntuをデスクトップOSとしてネイティブインストールしています。
ターミナルソフトはterminator 1.91を使っています。

# 応急処置

原因と思われる
~/.config/fish/functions/fish_prompt.fish
の162行目は次のようになっている。

```shell
      git rev-parse --quiet --verify HEAD > /dev/null ^&1; or set empty 1
```

「^&1」の部分が問題の様子。
fishで「^」はエラー出力を表しているようなので（[参照](http://fish.rubikitch.com/tutorial/)）、ディスクリプタの合成をやろうとしてミスしているのだろうと想像して次のように変更。

```shell
      git rev-parse --quiet --verify HEAD > /dev/null 2>&1; or set empty 1
```

とりあいず、エラーは消えている。

# 解釈

今回はエラー出力を標準出力に合成し、その結果をnullに渡すことによってすべての出力を非表示にして対応した。試しに標準出力を消さないパターンに変更したところ、フォルダを移動するたびにgit rev-parse ~~のコマンドが実行され、HEADと差分があるgit管理下のディレクトリではリビジョンなのかハッシュ文字列のようなものが表示されるようになった。プロンプトにそんな表示が現れるのはおかしな状況のため、エラー出力も含めて非表示にするのが実装者の意図だったのだと想像して上記対応を行ったけれど、あくまでご利用は自己責任で。
今更ながらgoaccessでnginxのログ解析をしてみたのでメモ

# やりたかったこと

- alpでnginxのアクセスログを解析したかった・・・がltsvになってなくてできなかった

# やったこと

- [goaccess](https://goaccess.io/) でログ解析して、レポートとかもきれいに出せた

# やりかた

## インストール

簡単かつ一撃。

```bash
brew install goaccess
```

## rcファイルを作る

当該nginxサーバーは自分が立ち上げたものではないのだが、おそらくログ設定とかデフォルトと思われる。
それに合わせる場合のgoaccessのrcファイルの一例は以下。

```bash
% cat ~/.goaccessrc
time-format %T
date-format %F
log-format %h - %^ [ %dT%t+00:00 ] "%r" %s %b "%^" "%T" "%^"
```

このtime-format, data-formatに何が書けるかは、 `man strftime` とかすれば出てくる。
goaccessとしての変数補完は、 [このあたり](https://goaccess.io/man#configuration) に書いてある。

## 実行

イメージはこんな感じ。

```
% cat *access.log* > report.html
% open report.html
```

htmlへの標準入力に、実際にaccess.logのどの部分を食わせるかは前段のコマンドとかで制御しちゃえば良いような気がする。
一応staticアクセスとか、404なアクセスはレポート内部で分類してくれるっぽかった。

こんな感じでgoaccessのページに有るようなレポートがきれいに表示されたので目的達成。

ということで備忘録でした。
備忘録 Sharepointのリストフォームの保存ボタンのリネーム

新しいアイテムを作成し、ページの編集を選択。
Webパーツの挿入で「スクリプトエディタ」を追加
スニペットの編集で以下を貼り付け

```
<script language="javascript" type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.js"></script> 

<script language="javascript" type="text/javascript"> 
$(document).ready(function()  
{  
$("input[value$='保存']").attr('value', "いいね！");  
});  
</script>
```  

<img width="512" alt="20200225_sharepoint_001.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/511848/e2374663-ed06-a236-6172-cfae89e7c374.jpeg">
Rails5でINSERT IGNOREする

色々あるみたいです。

## インサートしたidは不要!パターン
インサート後、id(オートインクリメントされるプライマリーキー)は不要の場合。

### 1. create! rescue
対象が数件のときには簡単便利。

```rb
param = {
  id: 6,                # プライマリーキー
  name: 'ポール・ポグバ',
  position: 'MF'
}
Pogba.create!(param) rescue ActiveRecord::RecordNotUnique
```

idやユニークインデックスをparamに指定しておけば、重複時に発生する例外をrescueですっ飛ばせる。
参考：https://stackoverflow.com/questions/31396310/insert-ignore-into-table-statement-in-rails-active-records


### 2.gem`activerecord-import`を利用
対象が大量にある場合に便利。

```rb
ksk.push(Honda.new(id: 10, name: '本田圭佑', position: 'いい意味でプレッシャー'))
ksk.push(Honda.new(id: 33, name: '本田圭佑', position: 'ケイスケ・ホンダ'))
...

Honda.import ksk on_duplicate_key_ignore: true
```

ちなみにPostgreSQLだけにはなるが、インサートしたあとにidが取得できるらしい。
参考：https://github.com/zdennis/activerecord-import#duplicate-key-ignore


## インサートしたidが欲しい!パターン

### 1. find_or_initialize_by

```
param = {id: 45, name: 'マリオ・バロテッリ', position: 'FW'}
milano = Intel.find_or_initialize_by(param)

milano.update(param) if milano.new_record?
```

`update(param)`で「INSERT INTO〜」が実行されるのはキモチワルイ。
参考：https://qiita.com/taimuzu/items/0a21738d018f475d63ae

find_or_create_byもあるけどブロック内でわざわざINSERTする値を作り直さなきゃいけないので面倒。(なんか他にいい方法あるのかな)
参考：https://qiita.com/yusabana/items/1b566f61ca556a482f52
京都大学　Pythonによるプログラミング演習教材を無料公開

#概要
2018年度に京都大学の全学共通科目として実施された授業を元に構成されたテキストが無料で公開されています．
到達目標としては以下の3つとのこと

- Pythonによるプログラムの実行についての基本操作ができるようになる。
- Pythonプログラムを構成する基本的要素の機能と書式について説明し、例題を用いて実行例を構成できるようになる。
- Pythonを用いて簡単なプログラムを自ら設計、実装、テストできるようになる。

著者は国際高等教育院 教授の喜多一氏。

オブジェクト指向を教えるときには，活用できそう．
情報の科目を担当して，言語教育が必要なときは，大いに参考にさせていただこうと思います．

#元ネタ

- [京都大学、Pythonによるプログラミング演習教材を無料公開](https://codezine.jp/article/detail/11999)
- [京都大学学術リポジトリ：テキスト](https://repository.kulib.kyoto-u.ac.jp/dspace/handle/2433/245698)
Javaのデフォルトエンコード設定をUTF-8にするための覚書

テキストエディタを変えたらデフォルト設定がS-JISからUTF-8に変わりました。
世間では（おそらく）UTF-8の方が標準ではないかと思ったので、これを機にJavaをUTF-8に合わせようと思い調べたことの備忘録です

# 方法
環境変数 _JAVA_OPTIONSにエンコードしたい文字種別を設定する。

例
-Dfile.encoding=MS932
-Dfile.encoding=UTF-8

Windowsならsetコマンドでこの設定が可能です。

例
set _JAVA_OPTIONS=-Dfile.encoding=MS932
set _JAVA_OPTIONS=-Dfile.encoding=UTF-8

ただしこのsetコマンドは再起動すると消えてしまうので、半永久的に設定するなら環境変数に手動設定しておくのがよさそう。
MacBook Air 2012 HighSierra からCatalinaにバージョンアップを行う

# 目的

- MacBook Air 2012のOSバージョンアップを実施した時の方法をまとめる

# すいません

- バックアップを必要とするデータが存在しないため今回は省略する。

# 条件確認

- 下記のWebサイトを確認して自分のMacがOSのバージョンアップ対象なのか確認する。
    - [macOS Catalina にアップグレードする方法](https://support.apple.com/ja-jp/HT201475)
- 下記に簡単にバージョンアップ条件を記載する。
    1. OS X Mavericks 以降を搭載していること
    1. 記憶領域の空き容量が18.5 GB以上存在すること
    1. 下記に記載されたモデルより新しいこと
        1. 2015年 MacBook
        1. 2012年 MacBook Air
        1. 2012年 MacBook Pro
        1. 2012年 Mac mini
        1. 2012年 iMac 
        1. iMac Pro
        1. 2013年 Mac Pro
    1. ACアダプターで給電できる環境にあること
    1. 安定したネットワークの回線があること
    1. Apple IDでApp Storeにログイン済みであること

# 実施手順

1. ネットワークへの接続とACアダプターでの給電を確認する。
1. Catalinaの取得
    1. 下記のリンクを開く
        - [https://apps.apple.com/jp/app/macos-catalina/id1466841314?ls=1&mt=12](https://apps.apple.com/jp/app/macos-catalina/id1466841314?ls=1&mt=12)
    1. 「App Storeを開く」をクリックする。
        ![スクリーンショット 2020-02-25 9.09.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3a78c6d2-7d47-df07-32c7-b6f0b0753e6a.png)
    1. 「ダウンロード」をクリックする。
        ![スクリーンショット 2020-02-25 9.10.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fceb3dcc-229f-6135-c944-b8678fcfa588.png)
    1. ダウンロードが開始されるので待つ。
        ![スクリーンショット 2020-02-25 9.11.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/4a89a983-7842-bd62-146e-d66e5ad24cfc.png)
    1. ダウンロード完了後、自動でインストーラが起動する。
        ![スクリーンショット 2020-02-25 9.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/2b6266e6-e640-ee2a-b252-faa2fa67c1c0.png)
    1. インストーラの「続ける」をクリックする。
    1. 利用規約に目を通し、「同意する」をクリックする。
        ![スクリーンショット 2020-02-25 9.18.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/5fe35a24-0c9e-734f-f594-c8b3aee6a841.png)
    1. インストール先の指定は特に特殊な設定をしていなければ、いじらずに「インストール」をクリックする。
        ![スクリーンショット 2020-02-25 9.19.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/19055d72-4274-c788-5468-65f0eaaad04e.png)
    1. ログイン情報の入力を迫られた時は必要情報を入力する。
    1. インストールが開始されるので終了するまで待つ。
        ![スクリーンショット 2020-02-25 9.21.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/67f445f6-2135-1610-1b0f-6e0458709233.png)
1. インストールが完了すると端末が自動で再起動する。
1. 下記の画面がでたら「続ける」をクリックする。
    ![LWScreenShot 2020-02-25 at 10.32.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/cdc0246e-64b6-ae54-c17c-6ea9dcfbe4c3.png)
1. 下記の画面がでたら「続ける」をクリックする。
    ![LWScreenShot 2020-02-25 at 10.32.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/f57421b6-e357-fbf9-1bb6-5f3b2d6e3fc2.png)
1. 下記の画面がでたらお好みのものにチェックを入れて「続ける」をクリックする。
    ![LWScreenShot 2020-02-25 at 10.32.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8842cc51-2195-6908-fcdb-44982fc4caf2.png)

1. 下記の画面がでたらお好みの物を選択して「続ける」をクリックする。
    ![LWScreenShot 2020-02-25 at 10.32.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/ec634409-7d81-1ec5-8343-10cb292912a2.png)
igataをPWA化する４

# はじめに
結局今回もアプリの中身には入らずに**プッシュ通知**の実装をしました。

# 参照
以下のサイトを参考に進めました。

- [Get Started With Workbox For Webpack](https://developers.google.com/web/tools/workbox/guides/codelabs/webpack)

# 内容
プッシュ通知は[GoogleChromeのDevTools](https://developers.google.com/web/tools/chrome-devtools)を使って試しました。
<img width="939" alt="スクリーンショット 2020-02-25 10.23.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/dd7169ff-d546-fd0b-be9e-14d5317960de.png">
写真の`Push`というボタンを押したら
<img width="460" alt="スクリーンショット 2020-02-25 10.27.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209689/3a3118b8-69fd-7bbe-4426-6242d657ec59.png">
こんな感じでメッセージを受信できるようにします。

# template.htmlを拡張
`template.html`の`<script>`を拡張してpushメッセージを受信できるようにします。

```html:src/assets/html/template.html
<script>
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker
      .register('sw.js')
      .then(function(registration) {
      console.log('ServiceWorker registration successful with scope: ', registration.scope)
        registration.pushManager.subscribe({userVisibleOnly: true})
      })
      .catch(function(err) {
        console.log('ServiceWorker registration failed: ', err)
      })
  }
</script>
```

加えたのは`registration.pushManager.subscribe({userVisibleOnly: true})`だけです。

# webpack.common.jsを改造
`WorkboxWebpackPlugin.generateSW`をやめて`WorkboxWebpackPlugin.InjectManifest`を使うようにします。プッシュ通知のロジックを`sw.js（自動生成されるServiceWorkerのスクリプト）`に付け足す必要があるからです。`plugins`をこんな感じで書き換えます。

```javascript:webpack.common.js
const plugins = [
  new HtmlWebpackPlugin({
    favicon: param.faviconPath,
    templateParameters: { title: param.title },
    template: param.templatePath,
  }),
  new MiniCssExtractPlugin({
    filename: '[name].css',
    chunkFilename: '[id].css',
  }),
  new WorkboxWebpackPlugin.InjectManifest({
    swSrc: param.swSrcPath,
    swDest: 'sw.js',
  }),
  new CopyWebpackPlugin(['src/assets/manifest/manifest.webmanifest']),
]
```

この`swSrc`のパスで指定したスクリプトを土台に`sw.js`を自動生成します。土台となるスクリプトをこんな感じで実装します。

```js:src/assets/javascript/sw.js
importScripts('https://storage.googleapis.com/workbox-cdn/releases/5.0.0/workbox-sw.js')

workbox.core.skipWaiting()
workbox.core.clientsClaim()

self.addEventListener('push', event => {
  const title = 'Get Started With Workbox'
  const options = {
    body: event.data.text(),
  }
  event.waitUntil(self.registration.showNotification(title, options))
})

workbox.precaching.precacheAndRoute(self.__WB_MANIFEST)
```

# さいごに
また今回もアプリ開発をしませんでしたが、気楽に進めて行きたいと思います。
初心者から始めるJavaーTeraPadで書いたコードがエラーで動かない

#はじめに
**TeraPad**で書いたコードを、コマンドプロンプトでコンパイルしたらエラーだらけになった。
他のテキストエディタで書いたらちゃんと動いたので、そのまま放置している。
備忘録としてここに残しておこうと思い、記事にする。

##実行環境

・**Java11**
　JDK(Java Development Kit)のみ、eclipseは導入していない
・**TeraPad**
　有名な無料テキストエディタ。
　Windows10のメモ帳でも同様の現象が起きていた。
・**Windows10**
　コマンドプロンプトでコードがちゃんと動くことを確認。

#起きていた問題
　TeraPadで作ったjavaファイルをコンパイルするとき、エラーを吐いてclassファイルが生成されない。
　**出力ファイル形式の指定ではUTF-8に設定していたはず**だが、うまくいかない。

```Java:helloWorldのコンパイルから実行まで,Terapad版
C:Users>cd C:JavaSample
C:JavaSample>javac helloWorld.java

helloWorld.java:1: エラー: この文字(0xEF)は、エンコーディングwindows-31jにマップできません
?ｻｿclass helloWorld
^
helloWorld.java:1: エラー: class、interfaceまたはenumがありません
?ｻｿclass helloWorld
         ^
helloWorld.java:3: エラー: class、interfaceまたはenumがありません
        public static void main(String[] args)
                      ^
helloWorld.java:6: エラー: class、interfaceまたはenumがありません
        }
        ^
エラー4個
```

　ネットで検索をかけたところ、**エンコード設定をUTF-8と記述すれば**コンパイルできるとあったが、結果は以下の通り。

```Java:helloWorldのコンパイルから実行まで,Terapad2回目

C:Users>cd C:JavaSample
C:JavaSample>javac -encoding UTF-8 helloWorld.java
helloWorld.java:1: エラー: '\ufeff'は不正な文字です
?class helloWorld
^
helloWorld.java:1: エラー: class、interfaceまたはenumがありません
?class helloWorld
       ^
helloWorld.java:3: エラー: class、interfaceまたはenumがありません
        public static void main(String[] args)
                      ^
helloWorld.java:6: エラー: class、interfaceまたはenumがありません
        }
        ^
エラー4個
```

##現在（2020/2/25）
　テキストエディタを*Brackets*と*SublimeText3*の両方入れて、それぞれでファイルを作ってみた。
結果、改善されて上手くコンパイルしてくれるようになった。
また、メモ帳で書いたコードでもちゃんと動くことを確認した。

```Java:helloWorldのコンパイルから実行まで,別テキストエディタの場合

C:Users>cd C:JavaSample
C:JavaSample>javac helloWorld.java
C:JavaSample>java helloWorld
Hello,World!
```

#感想
　なぜTeraPadに限ってこのような現象が起きたか分からない。
　TeraPadの設定だが、PHPに関する書籍の指示に従って各種設定をして使っていた。
　「TeraPadのUTF-8化」のページで**初期文字コード・保存文字コードをUTF-8Nに設定**した。
　何度か読み返してみてもわからなかったし、ほかのテキストエディタなら問題がないので、現在は放置している。
Juliaのスコープにまつわる変数束縛の話

Juliaの変数束縛で不思議な気持ちに包まれたので記録しておく。
Juliaは1.2を用いている。

# 問題の挙動
下記のコードは正常に動く。

```julia:例1
x = "hello"
for i in 1:1
    println(x)
end
#hello
```
しかし、下記のコードはエラーを吐く。

```julia:例2
x = "hello"
for i in 1:1
    println(x)    
    x = "huga"
end
#ERROR: UndefVarError: x not defined
```
ちなみに、下記のコードは問題なく動く。

```julia:例3
x = "hello"
for i in 1:1   
    x = "huga"
end
#hello
```
また、下記のコードも同様に問題なく動く。

```julia:例4
let
    x = "hello"
    for i in 1:1
        println(x)
        x = "huga"
    end
end
#hello
```

# 原因
これは、Juliaのグローバルスコープとローカルスコープの挙動の差に起因する。1.2のドキュメントによれば、
https://docs.julialang.org/en/v1.2/manual/variables-and-scoping/#scope-of-variables-1
ローカルスコープからグローバルスコープの変数に対しては、読みだしはすることができるが、書き込みはすることができない。そのため、ローカルスコープ内でグローバルスコープの変数と同名の変数が定義された場合、その変数には新しいメモリ領域が割り当てられ、ローカルスコープ内の別変数とみなされることになる。
この適応範囲が少し紛らわしかったポイントで、juliaでは、ローカルスコープ内のグローバル変数と同名の変数に一つでも書き込み権限を要する操作が加えられると、その名前の変数は全てローカルスコープ内の変数とみなす挙動をする。つまり、ローカルスコープ内を遡って影響が波及する。これは、スコープ内のどこで`local`キーワードを宣言しても挙動に差がでない、というドキュメントの内容に照らし合わせると素直な挙動ともいえる。
　今回の例でいうと、例2では、4行目でxへの代入が行われているため、このローカルスコープ内のxは全てグローバルスコープの変数xとは別の変数と解釈されることになる。すると、println関数は結果としてまだ定義されていないローカルスコープ内のxを見に行こうとするため、`x not defined`というエラーが発生してしまう。
　一方、例4では、コード全体が`let`で囲われることによって、ローカルスコープが入れ子構造になったプログラムになっている。つまり、はじめにxが定義されている場所はグローバルスコープではなくローカルスコープだ。ローカルスコープが入れ子になっている場合は、グローバルスコープの場合とは違い、内側のローカルスコープは外側のローカルスコープの変数への書き込み権限も同様に持っている。そのため、例4ではxは全て一番初めに定義されたxと同じものを指すことになり、エラーは発生しない。
　このことは、一番内側のローカルスコープ内でのxへの変更がその外側のxに伝搬していることかからも確認できる。

```julia
let
    x = "hello"
    for i in 1:1
        println(x)
        x = "huga"
    end
    println(x)
end
#hello
#huga
```
この挙動はjuliaのバージョンが0.6->1.0に変わった際に入った変更らしく、インターネットに転がっている0.6のマニュアルの邦訳
https://hshindo.github.io/julia-doc-ja-v0.6/manual/variables-and-scoping.html
などを見るとより混乱することになるので気をつけたい。
Rでの単回帰分析テンプレート（グラフへの出力付き）

###### tags: `rBasicLearning`
# 単回帰分析テンプレート
単回帰分析のテンプレートを, 以下に作りました！
宜しければ, 使ってください！

### テンプレート
```r
SLR <- function(X, Y){ # SimpleLinearRegression（単回帰分析）
  plot(X, Y) # 散布図を描く
  result <- lm(Y ~ X) # 回帰分析を行う
  abline(result) # 線を引く
  
  legend("topleft", # 相関係数を左上に貼り付ける
         legend= c(paste0("r : ", round(cor(X, Y), digits = 2)))) #小数点2桁で出力
}
```
### 具体例
```r
X <- c(1, 3, 5, 7) # 自分の使いたいデータを入れてください
Y <- c(2, 5, 9, 11) # 自分の使いたいデータを入れてください

SLR(X, Y)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565967/d2751895-10e0-a2be-b2ea-9be88afa9498.png)
![](![uploading-0]()
https://i.imgur.com/2KlZ9ZN.png)
医療経済学入門 第１章

医療データに触れる機会が増加してきたため、医療業界の方々と少しでも会話ができるように、知見を蓄えるべきかと思い、
医療経済学講義　補訂版 橋本英樹・泉田信行 著のサマリを書きながら学習することにしました。
とはいっても密度が濃い本なので、データ解析に関連しそうなテーマに絞ります。

# 第１章
## 医療サービスの特徴
「経済学」の視点から医療サービスの特徴的な点を挙げる。
(前提として、経済学上の「公共財」の定義と照らし合わせると、医療サービス・財は<b>「私的財」</b>である)
<b>1. 貯蔵できない</b>
　・　生産と消費が同時に行われる性質
<b>2. 人的資源へ依存することが多い</b>
　・　人手が必要である。さらに専門性が高いため、短期的に見たら人的労働力はとても固定的。
<b>3. 商品ラインが多い</b>
　・　コンビニのように商品の種類が多いことから、顧客情報や商品の一元/一括管理の必要性が大きい。その上、疾病ごとに要素・性質が異なる財を必要とされるといったことまで考慮すると、複雑なモデルを構築する必要があることに注意するべき。
<b>4. 質の不均質性</b>
　・　同一のサービスを提供しても同一の効用・結果が得られるとは限らない。
　・「原因」
　　*1. 医療業界の技術や知識の限界*
　　*2. 医療サービス提供側の質*
　　*3. 患者要因(年齢、生活体系、併存病)によるリスクの異質性*
<b>5. 情報の非対称性</b>
　・　患者(消費者)はサービスの質に関して、情報を十分に生かした意思決定をすることが難しい。情報のアクセス自体はインターネットのおかげで易化したが、専門知識を噛み砕くほどの知識や経験がない。　＝＞　医師の判断に従ってしまう。　<= 医師の判断は、その医師個人の経験・知識のみならず、単独orチームと行った環境にも左右される。
<b>6. 外部性の存在</b>
　・　ある人への医療サービスまたは害が、その人の周辺の福祉厚生に影響を与えるが、把握が困難なためか、効率的なサービスの価格決定ができず、この「外部性」は市場機能の働きを阻害する。


## 医療市場の特徴
外部性、情報の非対称性、制度による参入の障壁、サービスの質のばらつきなどが原因で、医療市場は不完全と言える。

## 感想
・モデルを構築する際は上記の特徴を考慮する必要性があることがわかった。市場は制度により不完全であり、また、個人の状況などによってサービスに対する効用が大きく異なりそうなため包括的なモデルを構築することはとても難しそうに感じる。

・患者の効用は、患者本人の要因だけではなく、医療サービス提供側からも影響されそう。
・「外部性の存在」から、商品の値段と「効用」の関係性の把握は難しくなりそう。


参考文献
医療経済学講義　補訂版 橋本英樹・泉田信行
node.jsインストール直後の状態でpackage.jsonをアップデートする方法　～npmグローバルインストール一切不要～

package.jsonを更新する場合、[npm-check-updates](https://www.npmjs.com/package/npm-check-updates)をグローバルインストールして```ncu -u```とやることが多いです。ただ、[nodebrew](https://github.com/hokaccha/nodebrew)などのnodeバージョン管理システムを使っている場合、node.jsの新バージョンがリリースされるたびにグローバルインストールをやり直す必要があります。この問題、何とかならないでしょうか。実はnpm-check-updatesをnpx経由で呼べば、node.jsインストール直後の状態でもpackage.jsonを更新することができます。

# package.jsonを更新する

```sh
npx npm-check-updates -u
npm install
```

# 解説
npx経由でnpm-check-updatesを呼び出しているだけです。試してみましたが、```npx ncu -u```とは出来ませんでした。

# 注意点
環境にもよりますが、上記手順は```npx npm-check-updates -u```を実行するたびにnpm-check-updatesをローカル環境のインストールします。連続してnpm-check-updatesを呼びたい場合は、npx経由で呼び出すことはお勧めしません。自分の場合は上記コマンドを呼び出すのは1週間に1回程度なので、時間ロスについてはそこまで気にしていません。
[C99]構造体と配列の初期化指定子

実際に活用していくかどうかは別として、こういう書き方ができるというのをメモ

```C:C言語(C99)
typedef struct{
    const char* name;
    int* score;
}record;

record reclist[] = {
    [0] = (record){
        .name = "foo",
        .score = (int[]){100, 57, 62, 87, 90},
    },
    [1] = (record){
        .name = "bar",
        .score = (int[]){29, 45, 82, 78, 65},
    },
};
```
cytoscape.jsにノードを追加するボタンを作ってハマった

cytospaceというライブラリがある。

トポロジーを描画できるライブラリ。

詳しくは以下のページを確認するがよろし。

https://js.cytoscape.org/#core/graph-manipulation/cy.load

さて、こいつを使って、ノードを追加するボタンを作ってみようと思いたったのが昨日。

さっそくライブラリをダウンロードし、チュートリアルのソースをコピペ。HTMLの頭にボタンを表示するように実装。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401295/e5b352ea-cc66-5d54-71d2-8ccf92d79154.png)

「AddNode」を押すと「c」が追加される。
「RemoveNode」を押すと「c」が消える。

### フォルダ構成

<dl>
  <dt>test.html</dt>
  <dt>cytoscape-3.14.0(フォルダ)</dt>
  <dd>cytoscape.min.js</dd>
  <dt>AdminLTE-3.0.2(フォルダ)</dt>
  <dd>css</dd>
  <dd>img</dd>
  <dd>js</dd>
  <dd>plugins</dd>
</dl>
※ AdminLTEはjQuery呼ぶためだけに使ってるので、jQuery単体でもOK

<details><summary>最終的には、ソースは以下のようになった。ローカルでも動くはず。(クリックするとソースが表示されます)</summary><div>

```html
<!doctype html>
<html>
<head>
    <title>Tutorial 1: Getting Started</title>
    <!-- jQuery -->
    <script src="AdminLTE-3.0.2/plugins/jquery/jquery.min.js"></script>
    <script src="cytoscape-3.14.0\cytoscape.min.js"></script>
</head>

<style>
    #cy {
        width: 100%;
        height: 95%;
        position: absolute;
        top: 5%;
        left: 0px;
        border: solid;
    }
</style>

<body>
	<button type="button" id="addNode">AddNode</button>
	<button type="button" id="removeNode">RemoveNode</button>
    <div id="cy"></div>
</body>
<script>
	var cy = cytoscape({
	  container: document.getElementById('cy'), // container to render in
	  elements: [ // list of graph elements to start with
	    { // node a
	      data: { id: 'a' }
	    },
	    { // node b
	      data: { id: 'b' }
	    },
	    { // edge ab
	      data: { id: 'ab', source: 'a', target: 'b' }
	    }
	  ],
	  style: [ // the stylesheet for the graph
	    {
	      selector: 'node',
	      style: {
	        'background-color': '#666',
	        'label': 'data(id)'
	      }
	    },
	    {
	      selector: 'edge',
	      style: {
	        'width': 3,
	        'line-color': '#ccc',
	        'target-arrow-color': '#ccc',
	        'target-arrow-shape': 'triangle'
	      }
	    }
	  ],
	  layout: {
	    name: 'grid',
	    rows: 1
	  }
	});
	
	$(function () {
		$('#addNode').on('click', function () {
			var eles = cy.add([
				{ group: 'nodes', data: { id: 'c' }, position: { x: 100, y: 100 } },
				{ group: 'edges', data: { id: 'e0', source: 'a', target: 'c' } } ]);
			cy.reset();
		});
	});
	
	$(function () {
		$('#removeNode').on('click', function () {
			var c = cy.$('#c');
			cy.remove(c);
		});
	});
</script>
</html>
```

</div></details>

##ハマったとこ
- 脳死で&lt;body&gt;にボタン実装したらクリックできなかった。
デバッグで調べてみたら、cytoscapeのcanvasがボタンの上にかぶっててクリックできなかった。
単純にHTML(canvas)の知識不足だと思うので、勉強すればすぐ解決できるレベルだと思う。
今回はcanvasを上からちょっとずらして、ボタンのためのスペースを確保した。

- ノードを追加してもグラフが再描画(reload)されなかった
ノードが見えないところに追加されていたので、一瞬「AddNode」ボタンを押しても何も起きていないのかと思った。
canvasを縮小したら出てきた。なので、再描画させるためにいろいろ調べた････
最終的にresetで落ち着いた。

これ面白い。使い方次第でいろいろできそう。
PyOCRインストール時に躓いた

# Python v3.7ではダメ(2020年2月時点)
[Anaconda Cloud](https://anaconda.org/brianjmcguirk/pyocr)ではこれすればいいよって書かれてるんだけど、

```
conda install -c brianjmcguirk pyocr
```

以下のようにお叱りを受けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/8132abd2-797b-b38a-74d8-6f42bacffc8c.png)

# Anaconda Navigatorでv3.6の仮想環境を作ればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447423/134d60bb-1713-0c57-02e8-9765ccb71ded.png)

PythonのバージョンはX.Y.Zみたいになってますが、
X:メジャーバージョン
Y:マイナーバージョン
Z:マイクロバージョン
みたいに呼ばれているらしく、マイナーバージョンレベルでの変更は機能の変更があるみたいです。
だから3.7ではダメで、3.6みたいなのもあるんですねー。
中国国内で利用できる web サービス、アプリ

本記事は、中国国内において利用可能な web サービス、アプリについて調査したものです。
以前、弊社が中国訪問中に "Gmail が使えない！" という事故があったので、調べてみました。
**中国国内でビジネスを行う際に活用できればと思います。**

## 調査環境
+ 場所：遼寧省某所
+ 利用端末：iPhone

## 留意事項
+ 調査結果はあくまで個人的な調査におけるものです
+ 現在では利用不可になっている可能性もあります
+ 但し書きが無い限り、オンライン（WiFi）接続時の調査結果です


## 中国国内で使えないサービス
* 特に記載の無いものは、URLにアクセスした時点でネットワークが切断される。
* アプリに関しては通信に失敗する。
* 括弧内は検証年。

### 検索エンジン
+ Google検索 (2017)
+ Yahoo!検索 (2017)

### ブラウザ
+ Chrome (2017)

### 地図
+ Google Map (2017)
  - 但し、GPS と事前に閲覧記録のある地図だけはオフラインで閲覧可能

### メーラー
+ Gmail (2017)

### ファイルストレージ
+ Googleドライブ (2017)
+ Dropbox (2017)
+ Amazon Drive (2017)

### 動画再生
+ YouTube (2017)
+ ニコニコ動画 (2017)
  - 一覧は出るが再生不可

### SNS
+ LINE (2017)
+ Twitter (2017)
+ Facebook (2017)
  - 日本人が頻繁に利用するサービスはほぼ全滅です；

### 情報系サービス
+ livedoor (2017)
+ FC2 (2017)
+ ニコニコ大百科 (2017)

~~~
* メモ
以前は VPN でアクセスできたのですが、
2017年9月現在、中国で VPN が禁止されたため不可能です。
変な操作は法に抵触する恐れがあるため絶対にやらないこと。
~~~


## 中国国内で使えるサービス
百度のような中国式のサービスは大体使えるので調査対象外。

### 検索エンジン
+ bing 検索 (2017)
  - ただし、地域設定が中国なので、日本のサイトはほとんど出ない

### ブラウザ
+ Safari (2017)
  - 検索エンジンは bing, baido のみ利用可能

### 地図
+ iPhone のマップアプリ (2017)
+ maps.me (2017)

### 翻訳
+ Google翻訳
  - 唯一？使うことができる Google 先生の機能
  - これで現地の人と会話ができた
  - しかし、日本語=>中国語 の変換に関しては百度翻訳の方が精度が高いと思う

### メーラー
+ Yahoo!メール (2017)
  - Slack 以外で会社と連絡が取れる貴重な手段

### チャットツール
+ Slack (2019)
  - 仕事ではほぼこれを使っていました
+ Skype (2017)

### SNS
+ GREE (2017)

### ファイルストレージ
+ OneDrive (2017)

### 情報系サービス
+ Qiita (2019)
+ iPhone の天気アプリ (2017)
+ SmartNews (2017)
  - 国内ニュースは普通に見られる
+ Wikipedia (2017)
+ pixiv (2017)

### eコマース
+ Amazon (2017)
+ 楽天 (2017)
  - ただし、どのサイトでも購入操作はしていないので、買えないかもしれない

### 開発系
+ GitHub (2019)


### 補足：アプリの通知機能について
iPhone の通知機能についてはどのアプリでも届くようです。
Gmail も通知で from, subject と 本文の見出しくらいは分かるので、
短文での確認依頼くらいは出せる、かも。。


## おまけ：現地の方との会話方法について
注：主観で書いています。また、遼寧省と北京以外は訪れたことがありません。

一般の方にはまず英語は通じません。（大きなホテルとかなら別）
中年以上の方だと “OK, Good” くらいしか分かりません。
若い方（30～40代）も普通の日本人レベルの英語しか喋れないです（単語並べるレベル）。

お勧めは、携帯 WiFi があるのであれば、百度翻訳かGoogle 翻訳を使うこと。
日本語 => 中国語の変換なら百度翻訳、逆は Google 翻訳だと精度が高いと思います。

あとは、単語とボディランゲージを混ぜ、出川氏のように積極的に話せば何とか通じます。

なお、中国の方は **小声で遠まわしな言い方** をすると嫌がるので、
**大きな声で、かつ YES, NO をはっきりと伝える** ことが重要です。
（例：ピータンはまずいから食べない。手伝いはいらない。眠いので定時に帰ります、など）


## まとめ
中国では日本のビジネスや私生活における便利ツールはほとんど利用できません。

### 検索エンジンについて
主要な検索エンジンは bing (地域中国) になるので、英語サイトですらなかなかHITしません。
よく使うサービスは予めアプリを入れるなり、
クラウドサービスのURLをブックマークしておくことをお勧めします。

### Microsoft は優遇されている？
bing、OneDrive など、Microsoft 製品については優遇されている模様。
試していませんが、office365 や edge、Azure が使えれば、作業の幅が広がりそうです。

### 開発時のコミュニケーションについて
GitHub が使えるので、ソースコードのアップや issue でのチケット交換は可能。
Slack が使えるので議論もできますし、業務指示も飛ばせるでしょう。
つまり、**開発するだけなら** あまり支障は出ないと思います。
※RedMine や heroku などについては未調査

### その他
まともな検索ができないので、SmartNews は日本のニュースを知り得る貴重な手段です。
あと、アプリの maps.me はとても便利！
事前に地図をダウンロードしておけば、オフラインの市内でも現在地が分かります。


## TODO (試してみたいこと)
中国でも開発ができるかどうか、に重きを置いて調査してみたいと思っています。

+ Office365 を使ってみる
+ GitHub でソースコードを落とせる？push できる？
+ AWS などのクラウドコンピューティングサービスは使えるのか？
GSuiteのアカウントがあればAWSのユーザーは不要だった件

表題の通り、GSuiteのアカウントがあればAWSのユーザーは不要だったことに気がつきました。

SAMLを使ったシングルサインオンを使えば、GSuiteのアカウントでAWSにログインすることができます。


設定方法は実は全てこちらのページに書いてあるのですが、いくつか分かりづらい点があったので補足します。


[G Suite アカウントを用いた AWS へのシングルサインオン \| AWS Startup ブログ](https://aws.amazon.com/jp/blogs/startup/techblog-saml-gsuite/)

1. Step2の5番の属性のマッピング設定について
SessionDurationは指示通り`https://aws.amazon.com/SAML/Attributes/SessionDuration`と入力します。他のRoleSessionNameとRoleは既定のURLで大丈夫です。

2. Step5の2番のAWSの項目の入力について
Roleの項目が一つ余分に出てきますが、指示通りカンマ区切りで1つの項目に入力すればOKです。
複数項目あるからと言ってRole ARNとIDプロバイダーのARNをそれぞれ分けて入力したところエラーとなってしまいました。

3. CLIからのアクセス（アクセスキー）について
これもこちらの記事に書かれていますが補足があります。
[saml2awsでSAML認証を用いたaws cliの利用を簡単にした \- Qiita](https://qiita.com/tarumzu/items/7a20f8b414815de02b8e)

設定時にSAML認証用のURLが必要で、パラメータに`idpid`と`spid`があります。
少し迷ったのですが、`idpid`はAWSにアップロードする際のファイルの中に書いてあります。
`spid`についてはSAMLアプリ設定画面（下記画像）のURLにある`service=`のあとに続く数字のようでした。

![スクリーンショット 2020-02-25 9.10.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27674/814794cd-220f-dd88-59e4-acbbb5d985da.png)
Cloud formationについて

Cloudformationの概要についてまとめたいと思います。
テクニカルな部分じゃなくてすみません。

#Cloudformationとは
⇨AWS CloudFormation は、クラウド環境で AWS とサードパーティ製アプリケーションリソースのモデリングおよびプロビジョニングをする際の、共通的な手法を提供します。AWS CloudFormation では、プログラミング言語またはシンプルなテキストファイルを使用して、あらゆるリージョンとアカウントでアプリケーションに必要とされるすべてのリソースを、自動化された安全な方法でモデル化し、プロビジョニングできます。これは、AWS とサードパーティ製のリソースに真に単一のソースを与えます。

https://aws.amazon.com/jp/cloudformation/

**要はコード(JSON,YAML形式)で書くことによってEC2やRDS,S3、VPCなどリソースを自動で構築できるサービス。**
[infrastructure as code]⇨インフラ環境をコード化する考え。
「インフラの自動化」という技術に繋がります。※初心者が憧れるやつです。


#なぜCloudformationを利用するのか#
**インフラ環境の再現性！！！！**
機器を導入したり、ツール、アプリケーションをポチポチとインストールしたりと、
一から環境を作り込んでいくため、かなり手間！

一度作ったテンプレートを利用してしまえば同じ環境が構築でき、管理の手間、スピードは断然と上がり、
最終的にはコスト削減へとつなります。

この流れに沿って自動化、運用ができる技術者が必要になってきているとのこと。


#Cloudformation：スタックとは#
⇨テンプレートによって作成された環境群をスタックという。
プラモデルのパーツを想像していただければと。

↓テンプレート例
```AWSTemplateFormatVersion: 2010-09-09
Resources:
  FirstVPC:
    Type: 'AWS::EC2::VPC'
    Properties: 
     CidrBlock: 10.0.0.0/16
```

テンプレートを用いることで
環境が構築されます。一度作ってしまえば次利用するときも同じテンプレートを使えば同じ環境が作れるというわけです。
少し仕様を付け足したい、変更したいという場合でもコードを書き加えるだけで実現できます。

#最後に#
ちょっとだけ概要をまとめましたが**「習うより慣れろ」**
手を動かして一度作ってしまう方が理解します。

僕は始めにこの記事を参考にしました。
https://dev.classmethod.jp/cloud/aws/cloudformation-beginner01/

Udemyの教材も試してみます！
あ〜ガシガシ行かねば！！！