OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】Tinder風UIのライブラリをつくったよ

## TL;DR
カードを左右にスワイプすることで好き/嫌いを判定していくUIは、TinderUIとして親しまれていて、数多くのマッチングサービスに取り入れられています。
Unityでも左右にスワイプしたくなったのでライブラリとして実装してみました。
Tinderを知らない人は[こちら](https://tinder.com/)。

![screenshot1.gif](https://qiita-image-store.s3.amazonaws.com/0/58846/6179c22b-630b-63be-beb5-eacd212c4e1a.gif)
![screenshot2.gif](https://qiita-image-store.s3.amazonaws.com/0/58846/76521804-2f0c-6360-f3cc-cfba08b22133.gif)


データ件数に関わらず生成されるカードオブジェクトは常に2つなので、メモリに優しい作りになっています。

# ソースコード
[【Github】Unity-SwipeableView](https://github.com/m4tcha/Unity-SwipeableView)

## 使い方
### 1. カードに表示させたいデータをもたせたオブジェクトをつくる
```c#
using UnityEngine;

public class DemoCardData
{
    public Color color;
}
```

### 2. UISwipeableViewを継承してスワイプビューをつくる
```c#
using System.Collections.Generic;

public class UISwipeableViewDemo : UISwipeableView<DemoCardData>
{
    public void UpdateData(List<DemoCardData> data)
    {
        base.Initialize(data);
    }
}
```

### 3. UISwipeableCardを継承してカードオブジェクトをつくる
```c#
using UnityEngine;
using UnityEngine.UI;

public class UISwipeableCardDemo : UISwipeableCard<DemoCardData>
{
    [SerializeField]
    private Image bg;

    public override void UpdateContent(DemoCardData data)
    {
        bg.color = data.color;
    }
}
```

### 4. ビューにデータを渡す
```c#
using UnityEngine;
using System.Linq;

public class DemoScene : MonoBehaviour
{
    [SerializeField]
    private UISwipeableViewDemo swipeableView;

    void Start()
    {
        var data = Enumerable.Range(0, 20)
            .Select(i => new DemoCardData
            {
                color = new Color(Random.value, Random.value, Random.value, 1.0f)
            })
            .ToList();

        swipeableView.UpdateData(data);
    }
}
```

## 今後
現状ではUIの動きに関するカスタマイズ性が低いため、需要があれば改善していこうと思っています。
ご意見・ご要望などいただけると嬉しいです。
AWSのリージョン、AZ、VPC、サブネットの話

# はじめに
しばしば忘れて混乱してしまうので、まとめておきます。

# 各用語の意味
## リージョン
AWSにログインすると右上に出る、「東京」や「バージニア北部」といった区分です。地理的に大きく離れたデータセンターの集合体をリージョンと呼びます。

## アベイラビリティーゾーン（AZ）
リージョンをさらに小さく分割した区分で、1つまたは複数のデータセンターの集合体です[^1]。AZを跨いだ障害が起こらないように設計されているらしいです。

例えば東京リージョンには現在、下記の通り3つのAZがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/be25bb6a-9291-099a-f6dd-05ad82f7a866.png)
ap-northeast-1が東京を表し[^2]、a/c/dが3つの異なるAZを表しています。

## VPC
リージョン/AZが物理的な区分であるのに対し、VPCとサブネットは論理的な区分になります。VPCは一言で言うとプライベートIPアドレスの範囲から切り出したアドレス空間で、この中でサブネットを切ってインスタンスを立てることができます。異なるVPC間は論理的に切り離されてます。
1つのVPCの範囲は最大で/16のアドレス空間です。また、VPCはリージョンの中に作成します。複数のリージョンを跨るようなVPCを作ることはできません。

今回VPCを作っていて気付いたのですが、各VPCは論理的に独立しているため、以下のようにIPアドレスが重なるようなVPCの作り方もできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126284/31cfceed-dbae-ae18-3fac-3d50f56450d9.png)
VPC PentaとVPC Totoroはそもそも通信ができないため、アドレスが重複しても問題ないということです。ただし、AmazonはIPアドレス範囲を重複させないことをお勧めしています。[^3]

## サブネット
サブネットはVPCをさらに分割したアドレス空間です。サブネットを必ず1つのAZの中に作られ、複数のAZに跨るようなサブネットを作ることはできません。

# 脚注
[^1]: [AWSのデータセンターの中身を、設計総責任者が話した (1/2)](http://www.atmarkit.co.jp/ait/articles/1411/20/news106.html)
[^2]: [AWSのリージョンとエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html)
[^3]: [よくある質問 - Amazon VPC](https://aws.amazon.com/jp/vpc/faqs/)
多次元配列について

<h2 id="Rubyの開発者を目指し基礎を学んでいる:relaxed:">Rubyの開発者を目指し基礎を学んでいる:relaxed:初心者の私が知識をまとめてみました。</h2>

<h2><strong>目的:</strong><p>
<ul>
<li>自己理解</li>
<li>情報共有:sweat:</li>
<li>情報整理</li>
</ul>


<h3><strong>トピックス：</strong></p>
<ul>
<li>多次元配列</li>
</ul>

<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i>
多次元配列
</a>
</h2>
<p><strong>多</strong>次元配列の問題を解いたので簡単ですがまとめてみます。
</p>
<p>果物の名前と金額の二つの配列から要素を取り出す問題です。</p>
```bash:fruit.rb
fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]]

fruits_price.each do |fruit|
  sum = 0
  fruit[1].each do |price|
    sum += price
  end
  puts "#{fruit[0]}の合計金額は#{sum}円です"
end

>>出力結果は 「appleの合計金額は670円です」 ...全ての果物の名前と合計金額が出力されます。省略します。
```
<p><strong>わからないポイント:</strong><p>
<ul>
<li>最初の配列 |fruit| は何を取り出しているのか。</li>
<li>２番目の配列 |price| は何を取り出しているのか</li>
<li>fruit[1]とはなんなのか😾</li>
</ul>

<h2>
最初の配列 |fruit| とはなにか？</a>
</h2>
<p><strong>変</strong>数fruits_priceには例によって果物の名前と配列「金額」のが入っていますので、そのまま代入されています。イメージとしては
</p>
```bash:fruit.rb
fruits_price = [["apple", [200, 250, 220]]　#以下省略
→ fruits_price =　apple,配列
```

<p>次にeach文で|fruit|変数から要素を取り出しています。each do は配列の中身を全て取り出す処理を行います。現状のイメージとしては</p>

```bash:fruit.rb
fruit　= [["apple", [200, 250, 220]]　#以下省略
→ fruit = apple,配列
→ fruit = fruit[0],fruit[1]　#配列で中身の要素が表現されます。
```
<p>
fruitに配列0,1として要素が代入されています。
<p>


<h2>
２番目の配列 |price| とはなにか？</a>
</h2>
<p><strong>変</strong>数price(|price|)には例によって果物の名前と配列「金額」が入っている<strong>fruitの配列が入っています</strong>。イメージとしては
</p>
```bash:fruit.rb
price = [200, 250, 220]　#以下省略
→ price =　配列(fruit[1])
```

<h2>
fruit[1]とはなんなのか😾(まとめ)</a>
</h2>
<p><strong>ま</strong>とめます。</p>
```bash:fruit.rb
fruits_price = [["apple", [200, 250, 220]]　
→ fruit = apple,配列

→ fruit = fruit[0],fruit[1]
price = [200, 250, 220]　#以下省略

→ price =　配列(fruit[1])

fruit[1] = price = [200,250,220](金額の配列)
```

<p>
fruit[1].each.do |price|ではprice変数に配列の要素（金額）を全て取り出しているということですね。
</p>

<p>
<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i>
to be continued...
</h2>
</a></h2>
<li id="fn2">
<p>
<p>
Railsでは配列はparamsあたりで使っていたはず。直接は結びつかないかもしれませんが大事な要素なので覚えておきたいですね。☺️自分で実装できるようになりたいです。
</p>
<p>
現状ですが、haml,scssではまっています。。HTMLを蔑ろにしていたからですね。勉強することだらけです。😭</a></p>
</p>
</li>
プログラミング学習１ヶ月目

#プログラミングを始めたキッカケ
- そもそもプログラミングを始めたキッカケは転職してそこがIT関係の会社だったからである。というか、自分も次転職する際はWeb関係の知識だけでなく、本格的なプログラミング言語を学びたいなー、と思ったからである。←超甘い考え
- 会社で学んでいる（というか使わないといけない）のはJavaである。あとはSQL、C#なのだが、まあ難しい（＾＾；）
  - 特に難しいなと思ったのは最初は、x=0がx=x+1で値を変えるという使い方に理解が苦しんだこと、中盤はJavaでのメソッドの呼び出し、戻り値の理解等、オブジェクト指向？なにそれ美味しいの？。
     -  まあ、未だにあやふやで理解ができていないのが現状である。試しにpythonを触ってみたのだがこれはインデントで区切るので文書構成がわかりやすいが、strとintがわりとJavaより厳密（出力する際）なことと、細かいルールが何だかんだあるのでやっぱり難しい（）     

##学習方法
- プロゲート。基本的なことは書いてるので理解するまでしっかりやる
- Qiita。~~同様な悩みをもつ子羊さんを探すため。~~自分のわからない時の小六法
- 会社の参考書。基本的なことは書かれてるけど足りないところが結構あり、足りない部分はプロゲートや他の参考書で対応
- ~~GitHub。ソースだけ探す。でも使い方が意味不明で前まであったグーグルさんのソース検索の方が便利~~

次の更新は７月頃予定。その頃にはJavaかpythonのサンプルソース載せれたら嬉しいﾆｯｺﾘ

p.s.

**コマンドラインって偉大だわ！ATOMはさらに偉大だわ！！**
scikit-learnのMLPClassifierで生の出力値を見たいとき

## やりたいこと

scikit-learnで
`clf.predict(X)`をすると、ラベルが返ってきて便利ですが、出力層の出力のそのままがほしいときもあります。そういうときに使えるメソッドの紹介です。

## 生の出力値をみる - `_predict()`

`clf._predict(X)`で出来ました[^is_this_true]。

[^is_this_true]: これが本当に出力層の生のなのか、ドキュメントに書いてあったわけではないので100%保証はできません。

```py
import numpy as np

from sklearn import neural_network
from sklearn.datasets import load_iris

X, y = load_iris(return_X_y=True)

clf = neural_network.MLPClassifier()
clf.fit(X, y)
_pred      = clf._predict(X)

# _predを出力
print(_pred)
```

```:_predの出力
[[0.96 0.04 0.00]
 [0.93 0.07 0.00]
 [0.95 0.05 0.00]
 [0.93 0.07 0.00]
 [0.97 0.03 0.00]
 [0.96 0.04 0.00]
 [0.96 0.04 0.00]
 [0.95 0.05 0.00]
 [0.92 0.08 0.00]
 [0.93 0.07 0.00]
 [0.97 0.03 0.00]
 [0.95 0.05 0.00]
 [0.93 0.07 0.00]
 [0.96 0.04 0.00]
 [0.98 0.02 0.00]
 [0.99 0.01 0.00]
 [0.98 0.02 0.00]
 [0.96 0.04 0.00]
 [0.96 0.04 0.00]
 [0.97 0.03 0.00]
 [0.94 0.06 0.00]
 [0.96 0.04 0.00]
 [0.98 0.02 0.00]
...
```

`predict()`の結果は`np.argmax(_pred, axis=1)`をしたような感じだと思います[^predict_output]。

[^predict_output]: 実際はラベルが文字列なときは、文字列にしてくれるので、厳密には違うとは思いますが。

## `predict_proba`というのもありました

```py
pred_proba = clf.predict_proba(X)
```

結果は`_predict()`のときと同じになりました。`MLPClassifier`のパラメータなどを変えたりすれば変わるかもしれません。

## 追記

`predict_proba()`はドキュメントにありますが、`_predict`はドキュメントになく、呼び出すべきものじゃないかもしれません。
エラー 1920.サービス'windows font cache service'を開始できませんでした。

■office 2013がインストールできない
以下のエラーが出る事象がありました。
「エラー 1920.サービス'windows font cache service'を開始できませんでした。
システムサービスを開始する権限があるかどうかを確認してください。」

コントロールパネル→管理ツール→サービス→windows font cache service
起動も停止もできない状態となっていることを確認ができます。

以下のやり方で正常にインストールできました。
①windows font cache serviceのプロパティを開く
②ログオンタブのアカウントのラジオボタンをクリック
③アカウントにlocalと入力し参照をクリック
④選択するオブジェクト名を～にlocalと入力してOK
⑤パスワード欄とパスワードの入力確認欄を空白に
⑥適用→OK　(※適応押下したあたりで、起動できますみたいな表示がでました)
⑦サービス再起動
⑧PC再起動
ArducopterのFlightmodeを追加する(MissionPlannerにも)

#はじめに
Arducopterにオリジナルのフライトモードを追加する方法。メモ程度。
また、GCSとしてMissionPlannerでそのフライトモードを選択できるようにする。

#フライトモード追加
基本的にはArdupilot公式ドキュメント通りにやればおっけい。
http://ardupilot.org/dev/docs/apmcopter-adding-a-new-flight-mode.html

しかし、これだけではコンパイルできない。config.h内に他のmodeと同じように以下を追加する。


```c++:config.h
//////////////////////////////////////////////////////////////////////////////
// New Mode
#ifndef MODE_NEW_ENABLED
# define MODE_NEW_ENABLED !HAL_MINIMIZE_FEATURES
#endif
```

ここだけ罠なので注意。

#MissonPlannerにフライトモード追加
MissonPlannerのルートフォルダ内のParameterMetaDataBackup.xmlを変更する。

```xml:ParameterMetaDataBackup.xml
    <FLTMODE1>
      <DisplayName>Flight Mode 1</DisplayName>
      <Description>Flight mode when Channel 5 pwm is &lt;= 1230</Description>
      <Values>0:Stabilize,1:Acro,2:AltHold,3:Auto,4:Guided,5:Loiter,6:RTL,7:Circle,9:Land,11:Drift,13:Sport,14:Flip,15:AutoTune,16:PosHold,17:Brake,18:Throw,19:Avoid_ADSB,20:Guided_NoGPS,21:Smart_RTL,24:NEW_MODE</Values>
      <User>Standard</User>
    </FLTMODE1>
```

こんな感じで,<Values>に新しいモードを追加する。これでMissonPlannerを起動すればNEW_MODEが選べるはず。
という感じでArducopterを使ってどんどん新しい制御を実装したりしよう。
ubuntuの画面明るさ調整

# Ubuntuの画面明るさ調整

プライベートではubuntuで開発しているのですが、
寝る前に暗い寝室でPCやると明るさを最小にしても画面が明るすぎるんですよね。

以下のコマンドで明るさ調整すると微調整効きそうなのでメモ

まずrootに切り替え
`# sudo su -`

次に以下のコマンドを実行。数値が明るさです。
`# echo 200 > /sys/class/backlight/intel_backlight/brightness`
browser extension の設定ページ

#はじめに
Firefoxのaddon用設定ページ作成して javascript で値を使えるようにします。

#設定ページと値の取得コード
メモ
* 値を取得したあとにjavascript中で使うのにはグローバル変数でないといけない。
* Javaとは変数のスコープが違う。
* 1回目の実行時には値が取れていなかったので、グローバルスコープで browser.storage.local.get を実行した。

以下のファイルを options とかのディレクトリに配置してつかいます。

```html:options.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
  </head>
  <body>
    <form>
        <label>name<input type="text" id="name" ></label>
        <button type="submit">Save</button>
    </form>
    <script src="options.js"></script>
  </body>
</html>
```
```javascript:options.js
function saveOptions(e) {
  e.preventDefault();
  browser.storage.local.set({
    name: document.querySelector("#name").value
  });
}

function restoreOptions() {

  function setCurrentChoice(result) {
    document.querySelector("#name").value = result.name || "blue";
  }

  function onError(error) {
    console.log("Error: ${error}");
  }

  var getting = browser.storage.local.get("name");
  getting.then(setCurrentChoice, onError);
}

document.addEventListener("DOMContentLoaded", restoreOptions);
document.querySelector("form").addEventListener("submit", saveOptions);
```
```javascript:background.js
browser.contextMenus.create({
    id: "name",
    title: "get name",
    contexts: ["selection"]
});

var name = "blue";
browser.contextMenus.onShown.addListener(info => {
	getting = browser.storage.local.get("name", function (value) {
	    name = value.name;
	    console.log("getting " + name);
	});
});

browser.contextMenus.onClicked.addListener((info, tab) => {
    if (info.menuItemId === "name" ){
        console.log(name);
    }
});
```
```json:manifest.json
{
	"manifest_version": 2,
	"name": "Sample Tool",
	"description": "Sample Tool for Firefox",
	"version": "1.0",
	"homepage_url": "https://sample.com",
	"icons": {
		"48": "icons/sample.png"
	},
	"applications": {
		"gecko": {
			"id": "sample@sample.com",
			"strict_min_version": "42.0", 
			"update_url":"https://sample.com/"
		}
	},
	"background": {
		"scripts": [
			"background.js"
		]
	},
	"options_ui": {
    	"page": "options.html"
    },
	"permissions": [
		"contextMenus",
		"storage"
	],
	"content_scripts": [
		{
			"matches": [
				"https://qiita.com/keniooi/*"
			],
			"js": [
				"sample.js"
			]
		}
	]
}
```
icon/sample.png
sample.js << 空ファイルでよい
が他に必要になります。

#参考
https://developer.mozilla.org/ja/Add-ons/WebExtensions/Implement_a_settings_page
https://msdn.microsoft.com/ja-jp/library/bzt2dkta(v=vs.94).aspx
https://github.com/mdn/webextensions-examples/blob/master/menu-labelled-open/background.js
digdag 環境を docker で 構築したときにハマった問題

メモ程度に。

## 現象
脳死して centos 上の java8 環境を作るときに `webdizz/centos-java8` 既存イメージを利用した際にコケた。こういうのサボらないほうがいいね。理解していないものを使っちゃだめだなーと。
以下は詳細なJavaのバージョン

```bash
# java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
```

`digdag push` とかするときにタイムスタンプ付きのログが出るんだが、そのときに Javaの 時間関係のライブラリのAPIがうまく動かないことが原因だったぽい。

`Unable to obtain Instant` なんちゃら、、、っていうエラーが発生していた。

## 解決法

ちなみに以下のバージョンでは問題なく動いた。

```bash
# java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
```

Dockerfile での install は 以下のような感じ

```Dockerfile
FROM centos:latest

RUN \
    yum update -y && yum install -y \
      java-1.8.9-openjdk \
      java-1.8.0-openjdk-devel
```

Java には問題がなくて、 `JAVA_HOME` の設定が間違っているのかと思って再度設定し直して試してみたが結局再現したのでやっぱりjavaのバージョンがよくなかったぽい。

他の解決策もあるかもなので こうだよってのあったら教えてほしいです。

### 追記

コメント欄で教えていただいた公式ドキュメントの記述によると、digdagの実行にはJava8 u72以降が必要とのこと。

問題が発生していたときの Java の バージョンは 調べるとたしかに u72 よりも古いものでした。

http://docs.digdag.io/getting_started.html#got-error
docker コマンド 備忘録

Version 18.03.1-ce-mac65 (24312)

##docker イメージ一覧を表示する
```
docker images
```

##docker コンテナ一覧を表示する
```
docker ps -a
```

##DockerfileからImageを作成
```
cd [Dockerfileがある場所]
docker build .
```

##DockerfileからImageを作成し、作成したImageに名前をつける
```
cd [Dockerfileがある場所]
docker build . -t [イメージ名]
```

##docker イメージからコンテナを起動してコンテナ内で操作する
```
docker run -it [ImageID or Imageの名前]
```

##docker イメージからコンテナを起動して、起動したコンテナに名前をつける
```
docker run --name [コンテナにつける名前] [ImageID or Imageの名前]
```

##docker イメージからコンテナを起動して、ローカルマシンとコンテナのポートを対応付ける
```
docker run -p [ローカルマシンのポート]:[コンテナのポート]
```

## 停止しているコンテナを起動させる
```
docker restart [Contena ID]
```

##起動しているコンテナ内にログインする
```
docker exec -it [Contena ID] /bin/bash
```

##docker イメージをすべて削除する
```
docker rmi -f $(docker images)
```

##docker コンテナをすべて削除する
```
docker rm -f $(docker ps -a -q)
```
MacOS に elmo + やねうら王 + 将棋ぶらうざQ をインストールしてみます

こんばんは。
ノーマル四間飛車が好きなヘボ将棋ファンです（ウォーズ2級）。

# はじめに
家族と共用の Windows マシンには激指 13 がインストールされているのですが、OS の起動が遅すぎて使う気にならず、たまに勉強で使おうとするとアップデートがなんちゃらとひたすら待たされるので、普段使いの Mac に将棋ソフトをインストールしてみました。

# 環境
* MacBook Air (11-inch, Mid 2011)
* macOS Sierra
* CPU Core i5 1.6GHz
* RAM 4GB

# 導入手順
[【最新版】Macに「elmo」をインストールする方法](http://www.ringocatnote.com/entry/mac-elmo) を参考にさせていただきました。
ほぼ、手順通りだったのですが、少しだけ私の環境向けに変更が必要な箇所がありました。

## gcc
はるか昔にインストール済みだったコマンドラインツールが残っていました。

```
$ gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

## やねうら王のビルド
巷で噂の **設計図共有サイト** からソースコードをクローンしてビルド。
Makefile のコンパイラを clang++ から g++ に変更。

```:Makefile
# clangでコンパイルしたほうがgccより数%速いっぽい。
COMPILER = g++
#COMPILER = clang++
```

`make avx2` だとその後の手順で `Illegal Instruction` となったので、 `make sse42` としました。

```:extra/config.h
//#define USE_AVX512
//#define USE_AVX2
#define USE_SSE42
//#define USE_SSE41
//#define USE_SSE2
//#define NO_SSE
```

## elmo のインストール
参考資料の通りに、ダウンロードしたファイルを配置しました。
ディレクトリ構成は以下の通り。

```
$ tree YaneuraOu/exe/
YaneuraOu/exe/
└── 2017Early
    ├── YaneuraOu-by-gcc
    ├── book
    │   └── standard_book.db
    └── eval
        ├── KKP_synthesized.bin
        ├── KK_synthesized.bin
        └── KPP_synthesized.bin
```

## 将棋ぶらうざQ のインストール
[将棋ぶらうざQ](http://park.geocities.jp/sbrowser_q/) のウェブサイトからダウンロードした **将棋ぶらうざＱ V3.4 for Mac**（SbrowserQ_V3.4_mac.dmg）を解凍し、SbrowserQ.app ファイルを `~/Applications` ディレクトリにコピー。

将棋エンジン設定のエンジンファイルパスに、先の手順で配置した **YaneuraOu-by-gcc** を指定。

# 使ってみる
さっそく、対局してみました。
早くも1筋をつめられてピンチです（笑）

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/83323/019083a6-2919-fc2c-dcb8-7dd0f2e12333.png)


# 参考資料
大変参考になりました。
ありがとうございます。

* http://www.ringocatnote.com/entry/mac-elmo
* https://qiita.com/TAKEDA-Takashi/items/4963b1ca00af41066903
jQueryのkeyupイベントにinput="date"を使用するとエンターキー押下でないと処理されない件

入力した日付けから年齢を取得して、HTMLに出力する処理を描こうとした時に色々試してみました。
HTML5の機能、type属性のdateを使用して、作ろうとしていました。

以下のソースでは日付けを選択するまではいいのですが、エンターキーを押さないと、値がHTMLに出力されませんでした。

```index.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
        $(function () {
            $("#date-output").keyup(function () {
                var price = $("#date-output").val();
                $("#output").html(price);
            }
            )});
    </script>
</head>

<body>
    <input type="date" id="date-output"/>    
    <div id="output"></div>
</body>

</html>
```
実行結果
![スクリーンショット 2018-06-06 22.56.31.png](https://qiita-image-store.s3.amazonaws.com/0/127391/e001e2c6-2618-bf20-b516-f7b3eec92654.png)

そもそもjQueryの日本語リファレンス上では以下の通りに記載されています。
>各要素のkeyupイベントに関数をbindします。

>keyupイベントは通常、キーボードのキーが押され、上がった際に呼び出されます。 

>jQueryのイベントは、コールバック関数の最初の引数でjQuery.Eventオブジェクトを受け取ることができます。このオブジェクトを使って、規定のイベント動作のキャンセルや、バブリングの抑制などを行います。

[jQuery日本語リファレンス]http://semooh.jp/jquery/api/events/keyup/fn/

選択するイベントを間違えたということ。じゃあ自動的に入力した文字列を出力したい場合は、どのイベントで処理を書くべきかですが、changeイベントを使用すると期待通り出力されました。

```index.html
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="style.css">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <script>
        // ここからコメント
        // $(function () {
        //     $("#date-output").keyup(function () {
        //         var price = $("#date-output").val();
        //         $("#output").html(price);
        //     }
        //     )});
        // ここまでコメント

        // 以下の通りに書き換える。
        $(function(){
            $("#date-output").change(function(){
                var str = "";
                str = $(this).val();
                $("#output").html(str);
            }).change();
        });
    </script>
</head>

<body>
    <input type="date" id="date-output"/>    
    <div id="output"></div>

    </body>

</html>
```

changeイベントは対象のエリアからフォーカスが外れたら、中の処理をしてくれるようです。
ビューから選択した文書のカテゴリを一括で変更する

# ビューから選択した文書のカテゴリを一括で変更する


## 概要
　ディスカッションなどのDBのカテゴリを一括で変更したいときに、ビューのボタンに埋め込んで使うスクリプト。特徴は以下の通り。

- 1文書の場合、![image.png](https://qiita-image-store.s3.amazonaws.com/0/151198/c9915ebc-5c2c-836f-4908-d4e42c1490e4.png)印をつけずともカテゴリを変更可能
    - NotesUIViewクラスのCaretNoteIDプロパティを使うことで、現在ビューでハイライトされている文書のオブジェクトを取れる
- 返答文書のカテゴリ変更は行わない
    - $Refフィールドの有無で判定




## サンプルコード

```
Sub Click(Source As Button)
' 初期設定
	Dim ss As New NotesSession
	Dim ws As New NotesUIWorkspace
	Dim thisUIView As NotesUIView
	Dim selectedDocCol As NotesDocumentCollection
	Dim targetDoc As NotesDocument
	Dim category As String
	
	Set thisUIView = ws.CurrentView					' 現在ユーザーに見せているビューのオブジェクトを取得
	Set selectedDocCol = thisUIView.Documents				' 現在選択されている文書の一覧を取得
	
	
' 変更したい値をインプット
	category = ws.Prompt(3, "カテゴリ入力", "変更後のカテゴリを入力してください")
	
	
' 選択した文書がない場合は、ビューで現在ハイライトされている (カレットの場所にある) 文書を変更（＠式と同じ挙動をする）
	If selectedDocCol.Count = 0 Then
		Set targetDoc = ss.CurrentDatabase.GetDocumentByID(thisUIView.CaretNoteID)	' ビューでハイライトされている (カレットの場所にある) 文書
		
		If targetDoc Is Nothing Then
			Exit Sub
		End If
		
		If targetDoc.HasItem("$Ref") Then	' 返答文書であれば、カテゴリ変更を行わない
		Else
			Call targetDoc.ReplaceItemValue("Categories", category)
			' 複数のフィールドの値を変えたければここにそのコードを追加
			Call targetDoc.Save(True, True)
		End If
	Else
		
' 選択した文書がある場合は、selectedDocColから一文書ずつ取り出して、順番にカテゴリ変更を実施
		Set targetDoc = selectedDocCol.GetFirstDocument
		Do While Not targetDoc Is Nothing
			If targetDoc.HasItem("$Ref") Then	' 返答文書であれば、カテゴリ変更を行わない
			Else
				Call targetDoc.ReplaceItemValue("Categories", category)
				' 複数のフィールドの値を変えたければここにそのコードを追加
				Call targetDoc.Save(True, True)
			End If
			
			Set targetDoc = selectedDocCol.GetNextDocument(targetDoc)
		Loop
	End If
	
	Call ws.ViewRefresh
End Sub
```
Rails アプリを初めて Heroku にデプロイしてエラーとなったとき

Railsアプリを何も変更せずにそのままHerokuにデプロイすると、

![fbc59e74e14d9d16dcec306415606f88.png](https://qiita-image-store.s3.amazonaws.com/0/225997/0f75ce56-0845-4845-392d-3388300ebfff.png)

こんなエラーが来ます。

---

原因は主に2つ。

1. データベースをSQLite3からPostgreSQLに変えていない。
2. デプロイ後、`heroku run rake db:migrate` を実行していない。
3. 他の原因。(Gemなど)

ここでは1.の場合の対処法を書いていきます。

---

RailsアプリはそのままHerokuにデプロイしても動きません。

- Railsの標準データベースは SQLite
- Herokuのデータベースは PostgreSQL

以下の手順で、先に本番環境のデータベースをSQLiteをPostgreSQLに変えないといけないのです。

## 1. /Gemfile を書き換える

変更前

```ruby:/Gemfile
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
```

変更後

```ruby:/Gemfile
# 開発環境(ローカル)ではSQLite3を使用
gem 'sqlite3', group: :development

# 本番環境(heroku)ではPostgreSQLを使用
gem 'pg', group: :production
```

変更後、以下のコマンドをたたいて、gemをインストール

```shell
$ bundle install
```

これで、本番環境(Heroku)でPostgreSQLが使えるようになります。

## 2. /config/database.yml を書き換える

productionの項目を下記のように変更する

```ruby:/config/database.yml
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5

# インデントは必ず半角スペース２つ
```

これで、本番環境(Heroku)で使用するデータベースをPostgreSQLに設定しました。

## 3. デプロイ

#### 前提
- Heroku アカウント取得済み
- [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) インストール済み
- [Git](https://git-scm.com/) インストール済み

```shell
# アプリのディレクトリに移動
$ cd your_project_path

# Heroku CLI にログイン （初回のみ）
$ heroku login

# 新規Herokuアプリの作成 (作成済みの場合は省略)
$ heroku create your-app-name
```
```shell
# 変更のコミット
$ git add .
$ git commit -m "Add pg gem for Heroku"

# リポジトリのプッシュ (アプリのデプロイ)
$ git push heroku master
```
```shell
# データベースのマイクレーションを行う （Heroku上のデータベースを起動）
$ heroku run rake db:migrate

# ブラウザーでHerokuアプリを開く
$ heroku open
```

これでアプリは `http://your-app-name.herokuapp.com`　で動いているはず。
動いていたら乾杯！:beers:
Confluenceユーザープロファイル簡易版（ユーザーマクロ）

# 概要
Confluenceのマクロで、ユーザープロファイルの簡易版の紹介記事。
具体的には、以下のように表示されるマクロ。
![macro.png](https://qiita-image-store.s3.amazonaws.com/0/214587/b5240c23-3be6-70df-fbc0-37cbd5ce4c8b.png)

# マクロの作り方
細かい手順は以下をご参考にして下さい。
[公式ドキュメン：ユーザーマクロを書く](https://ja.confluence.atlassian.com/conf64/writing-user-macros-936511400.html)
[Qiita記事：Confluenceのユーザーマクロ作成の基本](https://qiita.com/ymd_aaa/items/fd9c6ca15fc5bed22ab2)・・・公式ドキュメントより丁寧。

## コード

```html:ユーザーマクロ
## @param user:title=Username|type=username|required=true|desc=Select username to display
<a href="/wiki/display/~$paramuser&#10;" class="url fn confluence-userlink userlink" data-username="$paramuser" title="" data-user-hover-bound="true">
<p><img class="userLogo logo" src="$userAccessor.getUserProfilePicture( $userAccessor.getUserByName( $paramuser )).getUriReference()" alt="ユーザー アイコン: $paramuser" title=""></p>
<p>$paramuser</p>
</a>
```

## その他設定
![マクロ設定.png](https://qiita-image-store.s3.amazonaws.com/0/214587/09fe5391-ccbf-b6ea-258d-2297dac6751b.png)


# マクロの使い方
## マクロ利用時の設定画面
以下のような感じで、Usenameを指定します。
![編集画面での設定画面.png](https://qiita-image-store.s3.amazonaws.com/0/214587/5091c9b2-bac8-63ed-0f6f-2755f64d0d48.png)

# 作った背景
**標準のユーザープロファイルマクロ**
Usernameだけ指定すれば良いのは便利。
でも、ちょっとデカイ。メールアドレスとか表示されなくて良い。
<img alt="User+profile+macro.png" src="https://qiita-image-store.s3.amazonaws.com/0/214587/1b654827-4a6c-6697-68fb-16db34aa873e.png">

**プロジェクトページ？チームページ？みたいなのを作るときに、メンバー指定すると自動で生成されるやつ**
大きさは良い感じ。
でも、画像は画像で用意して、とUsernameはUsernameで用意が必要で、メンテがとても手間。
![default.png](https://qiita-image-store.s3.amazonaws.com/0/214587/a59de6c3-47d2-e15d-a522-2d5d8e3b81b8.png)

**ということで**
Usernameだけを指定できて、大きさ良い感じのやつが欲しくて作った。という話。
![macro.png](https://qiita-image-store.s3.amazonaws.com/0/214587/b5240c23-3be6-70df-fbc0-37cbd5ce4c8b.png)


以上。
Railsによるメンテコストの低いオープンAPI開発

## 概要

RailsでオープンAPIを開発をするときに使うライブラリ選定メモです

## オープンAPIとは？

http://garapon.hatenablog.com/entry/2016/10/25/_%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3API%E3%81%A8Open_API%E3%81%A8%E3%81%A8Web_API%E3%81%A8REST_API%E3%81%AE%E9%81%95%E3%81%84%E3%80%82
の定義によります。

サービスを低コストに拡大するポイントになります

## メンテコストを下げるためのポイントと実現手段

|ポイント|実現手段|
|:-:|:-:|
|1. APIクライアントを自動生成|swagger-codegen|
|2. ドキュメントを自動生成|swagger-codegen, Swagger UI|

## ぼくのかんがえた最強の構成

- swagger-blocks
- swagger-codegen
- Swagger UI
- commitee

## モジュール一覧

### swagger-blocks

https://github.com/fotinakis/swagger-blocks
star 425

### swagger-codegen

Open API Specification -> APIクライアント
Open API Specification -> ドキュメント(HTML, confluence wiki)

https://github.com/swagger-api/swagger-codegen

### Swagger UI

Open API Specification -> ドキュメント

https://swagger.io/tools/swagger-ui/
Web上でドキュメントを見られる。

### grape

grape -> implementation

https://github.com/ruby-grape/grape

### grape-swagger

grape -> Open API Specification

https://github.com/ruby-grape/grape-swagger
star 894

### apivore

implementation + Open API Specification -> validity

テスト用
https://github.com/westfieldlabs/apivore

star 148

### commitee

implementation + Open API Specification -> validity

rackミドルウェア用。動いているときに使えるっぽい
https://github.com/interagent/committee

star 286

## 議論

### Grapeを使うべきか？

https://blog.onk.ninja/2017/09/21/history_of_json_api_with_ruby

これを読んだ結果、grapeはやめたほうが良い気がした。
直感。

### Grape-Swaggerを使うべきか？

grapeはやめたほうが良い。
Open API Specificationを記述したいなら、
それだけにフォーカスしたほうが良い。
実装とかと癒着しはじめると、変化に弱くなる。

- https://inside.pixiv.blog/edvakf/2473
  - Grape-Swagger、Swagger::Blocksの比較で参考にした

### Oepn API Specificationを何で記述するべきか？

ymlか？swagger-blocksか？
選べないから、直感でswagger-blocksにする

https://qiita.com/kymmt90/items/439868c21abe077642fa
https://inside.pixiv.blog/edvakf/2473
http://tech.starttoday-tech.com/entry/swagger_yaml

## 追記

その後、Open API Specificationの記述を実際にやってみて、swagger-blocksよりも、Swagger Editorで手書きのほうがよさそうなことに気付く。
open api specification 3は対応していないライブラリが多いから、2を使う。

## ぼくのかんがえた最強の構成v2

- open api specification 2
- 手書き Open API Specification yaml
 - Swagger Editor
- swagger-codegen
- Swagger UI
- commitee

## 追記 (2019/05/18)

GraphQLもおすすめです。
かなり雑ですが、以下の記事はGraphQLを使った場合のライブラリ選定メモです。

[Rails + Nuxt + GraphQLでSSR対応のSPAを作る場合の俺的ベストプラクティス](https://qiita.com/engineer/items/f3f07bd1c58ecbf556e3)
play2.6でコンパイルDIするとエラーハンドラが動かなかったときのメモ

playframework2.6でコンパイル時DIしてるとエラーハンドラが動作しなかった。
色々調べた結果、以下のようにApplicationLoaderでオーバーライドすると動いた。

``` MyAppllicationLoader.scala
package com.exsample

import _root_.controllers.AssetsComponents
import play.api.ApplicationLoader.Context
import play.api._
import play.filters.HttpFiltersComponents
import router.Routes
import com.exsample.controllers._

class MyApplicationLoader extends ApplicationLoader {
  def load(context: Context) = {
    LoggerConfigurator(context.environment.classLoader).foreach {
      _.configure(context.environment, context.initialConfiguration, Map.empty)
    }
    new MyApplicationComponents(context).application
  }
}

class MyApplicationComponents(context: Context)
    extends BuiltInComponentsFromContext(context) with AssetsComponents
      with HttpFiltersComponents {

  // httpErrorHandlerをoverrideする
  override lazy val httpErrorHandler = new ErrorHandler()

  lazy val sampleController = new SampleController(controllerComponents)

  // router
  lazy val router = new Routes(httpErrorHandler, sampleController, assets)
}
```

参考
https://groups.google.com/forum/#!topic/lagom-framework/R-K0H2RdYnw
Pythonのインタラクティブシェル(ipython)で変数の定義を削除する

pythonに疎いせいでipythonを利用中にstrという変数を宣言して変なものを入れてしまった。
そんなことを忘れて、int型をstring型に変換して行おうとstr()を使おうとしたら、

```python
print str(4)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-137-6f54e899169d> in <module>()
----> 1 print str(4)

TypeError: 'csr_matrix' object is not callable
```

というエラーに。
これは変数strをそのようには呼び出せないよというような意味合いらしい。アホだった…

ここで素直にstrの宣言を消せばいいのだがインタラクティブシェル(ipython)で実行しているためそう簡単にはできない。
ipythonではシェルであるようなclearというようなコマンドを利用することができなかった。
そこで発見したのがマジックコマンドの


```python
%reset
```

ただこれはすべてのユーザの定義、入力履歴、出力履歴等が消えてしまうらしい。
これは困る。
そこで選択的に消せるコマンドが

```python

%reset_selective hogehoge
```
ただこれは対象は**正規表現**で指定されるため上記の場合ではhogeを含む定義すべてを消去してしまう。

そこでhogehoge という文字列を選択して定義をクリアーする場合は完全一致を示す`^hogehoge$`と書かなければいけない。
正規表現の意味は以下の通り。

| 書き方       |       例　|    意味   |
|:------------|------------:|:------------------:|
| ^           |        ^hoge |        hogeで始まる        |
| $           |     hoge$ |       hogeで終わる       |

したがって定義hogehogeのみを消す場合は以下のように記述する。

```python

%reset_selective ^hogehoge$
```

#まとめ

ipythonで宣言の定義を消去するときは正規表現に気をつけて`%reset_selective`を使う。
【A Tour of Go】 Basics/More types: structs, slices, and maps. /Exercise: Slices (18/27)

A Tour of Go の Exercise を実施したときのメモ。

C言語的には `malloc(sizeof(uint8) * dx, dy)` みたいにやってしまいそうになるが、ヒント
> ヒント:( [][]uint8 に、各 []uint8 を割り当てるためにループを使用する必要があります)

にあるように、ポインタ配列にuint8の配列を定義するようなイメージでコーディングする。

```exercise-slices.go
package main

import "golang.org/x/tour/pic"

func Pic(dx, dy int) [][]uint8 {
	var ret [][]uint8
	for x := 0; x < dx; x++ {
		ret = append(ret, make([]uint8, dy))
		for y := 0; y < dx; y++ {
			ret[x][y] = uint8((x + y) / 2)
			//ret[x][y] = uint8(x * y)
			//ret[x][y] = uint8(x ^ y + y)
		}
	}
	return ret
}

func main() {
	pic.Show(Pic)
}

```
VHDブートでブートドライブをSSDに

自宅ＰＣのブートドライブをケチってＨＤＤにしたせいで起動の遅さに苛立っていました。後日Hyper-Vの仮想マシン用に増設した、ＳＳＤからブートできないかなーと思いたつものの、BIOSの設定とか、ISOをDVDに焼いたりとかは億劫なので、ホストOSで作成したVHDXからなんとかブートできないか考え始めたのがキッカケ。

## 環境
ホストOS:Windows 10(1803)
VHDブートするOS:Windows 10(1703)

## 参照
[このＵＲＬ](https://blogs.msdn.microsoft.com/cesardelatorre/2017/01/21/booting-natively-windows-10-from-a-vhdx-drive-file/)の手順を流したらＳＳＤからブートできるようになりました。英語なので一応やったことをメモ程度に書きます。

## 手順
### １.ISOイメージを用意
- ブートしたいWindows OSが入ってるISOのご用意を。

### ２.PowerShellのスクリプトをインストール
- [このサイト](https://gallery.technet.microsoft.com/scriptcenter/Convert-WindowsImageps1-0fe23a8f)からConvert-WindowsImage.ps1をインストール。

### 3.スクリプトを実行！
- PowerShellを管理者として立ち上げる。
- ExecutionPolicyをRemoteSignedにする。
- 流すスクリプトは以下の通り

```powershell:Convert-WindowsImage.ps1
Convert-WindowsImage.ps1 -SourcePath　"ISOが格納されているパス"　-VHDFormat VHDX　-SizeBytes 50GB　-VHDPath "VHDXを格納したいファイルパス"
```

引数：VHDFormatには「VHD」と入力してもおkです。
引数：SizeBytesは適宜作りたいファイルのサイズを指定してあげてください。固定サイズになります。
引数：VHDPathには"G:¥BootWindows¥BootWindows.vhdx"のような値を渡しました。もちろんGドライブはSSDです。

### ４.作成したVHDXをマウントする。
- 作成したVHDXを右クリックし、マウントを選択します。
- 適当なドライブにVHDXがマウントされます。ここではFドライブにマウントされたとします。

### ５.VHDXファイル内にブートファイルを作成する。
- コマンドプロンプトを管理者として起動。
- 以下のコマンドを打ち込む（ドライブ名は適宜読み替えてください）。

```
bcdboot F:\Windows
```

### 6.再起動すると作成したVHDXがブートの候補としてあがってきます。

## 見つかった問題点
#### ドライバの再適用が必要
起動してみると、キーボードが英字配列になっていました。また、ドライバの設定を確認するとエラーを出力していました。

#### Windows Updateをかけることができない
Windows 10 (Version 1803)のアップデートをかけようとしたところ、**「仮想ドライブ上にはWindowsをインストールできません」**というエラーメッセージが。。。VHDXからブートすると、大型アップデートをあてることができないらしい（KBはおkでした）。そこで、元ホストOSから作成したVHDXをHyper-Vに食わせて仮想マシンを作成し大型アップデートができました。

#### VHDXのサイズを元ホストOSからしか変更できない
こちらも、先ほど作成した仮想マシンからHyper-V Management Systemのディスクの編集からディスクの拡張を行い、サイズの変更ができました。Windows PEのブートディスクからdiskpart使って直接拡張でも良いと思います。

#### SSDの読み書きが遅くなる（らしい） 
ググッた感じ読み書きが遅くなるらしいです。ただ、ブート目的なら遅くなった感覚を感じませんでした。

## 感想
意外にお手軽です。勇気はいりますが、起動速度が段違いだしやってよかった！

## 最後に
常套句ですが、**自己責任でお願いします!!**
JavaのDateクラスのコンストラクタを使うと、日付が1900年進む現象


すごく今更感があることですが、地味にハマってしまいました…。

# はじめに
日付を文字列にフォーマットするプログラムを書いていたところ、なぜか年数が1900年進んてしまう現象に遭遇しました。そもそも`Date`クラスの「年、月、日」をとるコンストラクタは非推奨なので、確かに使わなければ済む話ではあります。しかし、それを知らずにうっかり使うとこうなる、という失敗の一例です。

#現象
```DateTest.java
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTest {
  public static void main(String[] args) {
    int year = 2018;
    int month = 5;
    int dayOfMonth = 6;
    Date todayDate = new Date(year, month, dayOfMonth);
    DateFormat dateFormat = SimpleDateFormat.getDateInstance();
    System.out.println(dateFormat.format(todayDate));
  }
}

```
この例のように、`int`型で与えられた年月日を元に`Date`インスタンスを生成し、それを`DateFormat`で`Format`すると、

```
3918/06/06
```
今年は2018年なのに、3918年となっています。ちょうど1900年進んでいます。

#理由
これは、`java.util.Date`クラスの仕様です。
[Date (Java Platform SE 8)](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Date.html#Date-int-int-int-) にも書いてあるのですが、このコンストラクタで受け取る`year`の値は、西暦年から1900を引いた値をとる、という実装になっています。


#そもそも…
詳しい方にとっては周知の事実なのですが、`java.util.Date`の年月日を取るコンストラクタは、JDK1.1から非推奨となっています(`Date`で検索すると出てくるので、つい使いそうになりますが)。代わりに、`java.util.Calendar`でインスタンス化したのち、`Calendar#getDate`で`Date`インスタンスを得たほうがよいでしょう。

```DateTest.java
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class DateTest {
  public static void main(String[] args) {
    int year = 2018;
    int month = 5;
    int dayOfMonth = 6;
    Calendar todayDate = Calendar.getInstance();
    todayDate.set(year, month, dayOfMonth);
    DateFormat dateFormat = SimpleDateFormat.getDateInstance();
    System.out.println(dateFormat.format(todayDate.getTime()));
  }
}

```

```
2018/07/06
```
これで、正常に日付が出力されるようになりました。
earthを叩く　その２

#概要
google earthのcom apiを調べてみた。

#com api


```
GetCamera(int)
GetFeatureByHref(string)
GetFeatureByName(string)
GetHighlightedFeature()
GetLayersDatabases()
GetMainHwnd()
GetMyPlaces()
GetPointOnTerrainFromScreenCoords(double, double)
GetRenderHwnd()
GetTemporaryPlaces()
HideDescriptionBalloons()
IsInitialized()
IsOnline()
LoadKmlData(ref string)
Login()
Logout()
OpenKmlFile(string, int)
SaveScreenShot(string, int)
SetCamera(camerainfo, double)
SetCameraParams(double, double, double, aititudemode, double, double, double, double)
SetFeatureView(feature, double)
ShowDescriptionBalloon(feature)


AnimationController
	Pause()
	Play()
	CurrentTimeInterval
	SliderTimeInterval

AutoPilotSpeed
ElevationExaggeration
SearchController
	ClearResults()
	GetResults()
	IsSearchInProgress()
	Search(string)

StreamingProgressPercentage
TourController
	PlayOrPause()
	Stop()
	Cycles
	PauseDely
	speed

VersionAppType
VersionBuild
VersionMajor
VersionMinor
ViewExtents
	East
	North
	South
	West
```

以上。
プログラミングの授業を受けている大学生に調べておいて欲しいキーワード

#はじめに
大学でTAをしていると普段自分が当然のようにやっていることが、実は常識じゃないのかな？　あれ？ と思わされることが多々あります。本記事では、そんな経験からぜひプログラミングの授業を受けている大学生に調べてもらって、知って置いて欲しいこと・キーワードを並べたいと思います。

#第０章 ググれカスって放置してごめんねパトラッシュ
ググれカス(ggrks)とはよくいうものですが、そもそも迷える子羊たちはググり方（検索の仕方）を知らないようですね。まずはググり方を知ってください。
私がとりあえず心がけてほしいことは「助詞は入れずに**単語のみ**をスペースで区切って並べる」ということですね。
それ以上のことは、下記の記事を参照してください。
[誰も教えてくれないググり方](https://qiita.com/hcl/items/da9367d76ff103fcb181)

#第1章 知っておいてほしいこと

- インデント、${\boldsymbol インデント}$、**インデント**、${\large インデント}$、${\rm\Large インデント!!!!!}$
- デバッグ
- リファクタリング
- コメントアウト
- キャメルケース、アッパーケース
- 括弧があれば閉じ括弧がなければならないという常識
- プログラムが動かないときは、絶対に自分のコードや所業に原因があるという事実

#本章 質問する前に一旦調べてみてほしいキーワード

- メソッド、関数
- メンバ、フィールド、プロパティ
- クラス、インスタンス
- オブジェクト指向
- カプセル化
- アクセッサ、ゲッタ、セッタ
- スコープ、ブロック
- イベントハンドラ

調べてみて、わからなかったら質問をしましょう( ◠‿◠ )
Laravel5.5 の 'email' バリデーションについて （ unique 指定且つ自身を除外する ）

よくでてくるところとして、以下のものがあります。ドキュメントもこれですが、自分の環境では動かなかったです...
uniqueの部分は動いてくれるんですが、プロフィールなんかを更新するときに、自身もはじいちゃうんですよね...

```

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

```


https://blog.capilano-fw.com/?p=341#unique
を参考にしつつ、以下で試してみました。一応動いています。


```

use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Auth;

public function rules()
    {
        $user_id = Auth::user()->id;
        return [
            //バリデーションルール
            'email' => Rule::unique('users')->ignore($user_id),
        ];
    }

```
Docker for Windows コマンド豆知識

# お掃除

Docker for Windowsをインストールしてから色々と試行錯誤を繰り返していると、
いつの間にかDockerコンテナや、Dockerイメージがたまってきます。
Dockerイメージはディスク容量も大きいため、消したくなります。
１個ずつイメージを削除するのも、面倒なので下記のコマンドで一括削除します。

## コンテナの一括削除

「docker ps -a」で一覧表示されるDockerコンテナを一括で削除します。

```
>for /f %T IN ('docker ps -a') DO docker rm %T
```

## イメージの一括削除

「docker images」で一覧表示されるDockerイメージを一括削除します。

```
for /f %T IN ('docker images --format "{{.ID}}"') DO docker rmi %T
```

ただし、依存関係のあるイメージは先に依存先のイメージを削除しないと消えない場合があります。。
その場合は上記のコマンドを何度か実行すれば、いずれは全て削除されます。

## REPOSITORY名でフィルターをかけてイメージを削除する。

下記はDockerイメージのREPOSITORY名に「name」を含むイメージのみを削除するコマンドです。

```
for /f %T IN ('docker images --format "{{.ID}} {{.Repository}}" ^| find "name"') DO docker rmi %T
```

削除を実際に実行するまえに、下記のコマンドにより対象イメージの確認ができます。

```
for /f %T IN ('docker images --format "{{.ID}}:{{.Repository}}" ^| find "name"') DO echo %T
```

なお、２つのコマンドで{{.ID}}と{{.Repositry}}の間の区切り文字が「 」（半角空白）と「:」で差異があるので注意が必要です。
「name」の部分は削除したいREPOSITORY名の一部を入力することで、指定した名前のイメージが削除できます。

IN ('コマンド')の実行結果を変数%Tに設定して、DO以降のコマンドを繰り返し実行しますが、%TにはIN ('コマンド')の実行結果の1行ずつの最初の半角空白文字まで設定されます。

# IDの指定について

DockerではコンテナIDやイメージIDはコマンド実行時に前方一致で検索されるので注意が必要です。

つまり、

```
>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
sukkyxp/vsftp03     latest              ae274714d3f8        16 seconds ago       272MB
sukkyxp/vsftp01     latest              2d706aef6824        About a minute ago   272MB
sukkyxp/vsftp02     latest              2d706aef6824        About a minute ago   272MB
centos              latest              49f7960eb7e4        39 hours ago         200MB
```

の場合に

```
>docker rmi 2
```
を実行するとIMAGE IDの先頭が「2」のイメージが全て削除されます。
Spring Sessionでデータベースにセッション情報を格納する

#Spring Sessionとは
HttpSessionの機能を上書きして、RedisやRDBMSなどでセッション情報を管理することができます。
通常はアプリケーションサーバでセッション情報を管理していますが、複数台のサーバを用意してロードバランスしながら運用している場合、複数サーバ間でセッション情報を同期する（セッションレプリケーション）、もしくはユーザとサーバが1対1となるようにロードバランスする（スティッキーセッション）といった必要があり、何かと面倒です。

そこで、セッション情報をアプリケーションサーバ以外の場所に切り出してしまおう、というときにSpring Sessionはいい感じに使えます。

# Spring Sessionを使う
## プロジェクトの作成
Spring InitializrでSpring Bootプロジェクトを作成します。
https://start.spring.io/

今回はDependenciesとして以下を追加しました。

* Web
* Thymeleaf
* Session
* JDBC
* PostgreSQL
* Lombok

セッション情報を格納するRDBMSはPostgreSQLにしています。

## application.properties

```properties:application.properties
spring.session.store-type=jdbc
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
```

spring.session.store-typeをjdbcにしておけば、SpringSession関連の設定が勝手に行われる感じです。
いやーSpringBootって便利ですね。
（datasourceの設定は環境に合わせて指定してください。）

## データベースのセットアップ
自動的にセットアップする方法もありそうな気がしますが、やり方がよくわからないので、セッション情報を格納するためのテーブルを作成します。
SpringSessionJdbc内にsqlファイルが存在するのでそれを実行すればOKです。
https://github.com/spring-projects/spring-session/tree/master/spring-session-jdbc/src/main/resources/org/springframework/session/jdbc

※上記はGitHubのmasterなので、バージョンによってはSQLが異なる可能性があります。

## セッションを操作してみる
以下のようなControllerクラスを作成してセッション情報を操作してみました。

```java:HelloController.java
@Controller
public class HelloController {

	@Autowired
	SessionData sessionData;

	@GetMapping(value = "/")
	public String index() {
		return "index";
	}

	@GetMapping(value="/set")
	public String set(){
		sessionData.setStr1("hogehoge");
		sessionData.setStr2("fugafuga");
		sessionData.setStr3("piyopiyo");
		return "redirect:/";
	}
}
```
```java:SessionData.java
@Data
@Component
@Scope(value="session", proxyMode=ScopedProxyMode.TARGET_CLASS)
public class SessionData implements Serializable{
    private static final long serialVersionUID = 1L;
    String str1;
    String str2;
    String str3;
}
```
```html:index.html
<!doctype html>
<html xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="UTF-8" />
    <title>Hello Thymeleaf</title>
</head>

<body>
    <div>
        str1:
        <span th:text="${@sessionData.str1}">aaa</span>
    </div>
    <div>
        str2:
        <span th:text="${@sessionData.str2}">aaa</span>
    </div>
    <div>
        str3:
        <span th:text="${@sessionData.str3}">aaa</span>
    </div>
    <form th:action="@{/set}" method="get">
        <button>set</button>
    </form>
</body>

</html>
```
実装についてはいつも通りセッションを操作すればOKです。
データベースを確認すると、そこにセッション情報が保持されていることがわかります。

なお、データはSerializeして格納するため、セッション情報はSerializableを実装する必要があります。

-----
以上のように、簡単にセッション情報をRDBMSに格納することが出来ます。
個人的には情報をJSONにして格納してしてくれたほうが色々取り回しやすいかなーと思いました。
データ変換部分をカスタマイズできるらしいのですが、データ型を変更するとなると大変そうなので諦めました。
（DBのスキーマも変わるので、ほぼ作り変えないといけない。）

なお、Redisを利用する実装にはJSONでデータを格納する方法が提供されているようです。
floatの解除にclearfixを使って、思い通りのレイアウトに！

いい感じにHTMLのコードが書けた！CSSで文字や背景の装飾などは順調に進み…
最後にページ全体のレイアウトにとりかかってから全くうまくいかず😭
手を加えれば加えるほどぐちゃぐちゃになっていき焦燥感マックス。

あまりにもわからなさすぎて、教えていただいたところ、
基本的にHPはいくつかの箱で出来ている、という考え方から教えていただきました。

floatの解除方法はいくつかありますが、
clearfixを使う方法が１番わかりやすかったので記載していきます。

# 1.まずは図を書いてみる

![blog1-1.png](https://qiita-image-store.s3.amazonaws.com/0/244183/4c5e3321-9271-f9ff-75d5-30fa6c6af077.png)



大きな箱 box-A(box-aクラス)の中に
小さな箱　box-b(box-bクラス)を左側、
小さな箱 box-c(box-cクラス)を右側に配置。
さらに
box-Aの下にbox-Dを配置したい。


このようにざっくり設計図を描く

# 2.HTMLをコーディング
※body部分のみ記載とします

```html
<div class=box-a>
　　　　<div class="box-b"></div>
  　　　　<div class="box-c"></div>
  </div>
<div class="box-d"></div>
```

# 3.CSSをコーディング

```css
.box-a {
  width: 500px;
}

.box-b {
  width: 2８0px;
  height: 180px;
  float: left; /* ←左に配置 */
}

.box-c {
  width: 200px;
  height: 180px;
  float: right; /* ←右に配置 */
}

box-d {
  width: 500px;
  height: ８0px;
}
```

プレビュー
![blog1-2.png](https://qiita-image-store.s3.amazonaws.com/0/244183/0dde721c-8e0a-f457-9605-cfa49d95d802.png)


box-Aが消えた！？
そしてbox-Dがおかしな場所に😭

floatを直訳すると**”浮く”**という意味です。

**box-Bをfloatしてleftに配置＝box-Bを浮かせて左に配置
box-Cをfloatしてrightに配置＝box-Cを浮かせて右に配置**

高さ(height)を指定していなかったbox-Aの中には、
180pxの高さを持つbox-Bとbox-Cが入っており高さを保っていましたが、
そのBとCが浮遊したため、Aの中に要素がなくなってしまい高さが消失。

box-Aの下に配置していたbox-DがBCの下に入りこみ、このような配置となってしまいました。
floatは次の要素にも影響を与えます。

そこで…

# 4.clearfixを使う
ここでの場合、とても簡単に言うと、
①HTML：floatさせる要素を持つ親要素のクラスにclearfixを追加
②CSS:clearfix:afterのセレクタを追記
です。

先ほどのHTMLにclearfixクラスを追加
《HTML》

```html
<div class=box-a　`**clearfix**`> <!-- ←ここです。 -->
　　　　<div class="box-b"></div>
  　　　　<div class="box-c"></div>
  </div>
<div class="box-d"></div>
```

《CSS》
これは丸々追記

```css
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}
```

どういう事かというと
**.clearfix::after**
clearfixというクラス名を付けた要素の直後(::after)に、
**content: "";**
contentプロパティで任意の文字などを挿入。
**display: block;**
それをブロック要素にして、
表示はされないがclearfixを付けた要素の直後に要素を作った
**clear: both;**
ここでfloatを解除

すると回り込みが解除され、思い通りのレイアウトになります！

clearfixを使う時のCSSは形式的に暗記していましたが、
意味がわかると何を行なっているのかが理解することができました〜！

参考：https://www.tam-tam.co.jp/tipsnote/html_css/post192.html
参考：http://creator.aainc.co.jp/archives/4721
GitLabへ公開鍵を登録したい

# はじめに

GitLabを使えるようにするときの環境構築。

環境

- Windows 10
- Git Bash

# Readme(公式)

今から書くこと、全部公式に書いてあることです。
Readme · Ssh · Help · GitLab
https://gitlab.com/help/ssh/README

## SSH鍵の生成 CUI Ver.

公式のとおり、Git Bashを起動して次のコマンドを実行する。対話形式で、保存先のパスとパスフレーズが聞かれる。保存先は空のままEnterを押すとデフォルトのパスとなる。（~/.ssh/id_rsa）

なお、コマンドの、`your.email@example.com`部分は、GitLabへ登録している自分のメールアドレスである必要がある。


```shell_session
$ ssh-keygen -t rsa -C "your.email@example.com" -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/username/.ssh/id_rsa.
Your public key has been saved in /c/Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your.email@example.com
The key's randomart image is:
+---[RSA 4096]----+
|   oo=+&X=o. E.  |
|  . ..Oo*+ oo .oo|
|     +=oo o..o.oO|
|     .+= . ...+oB|
|        S   .  =.|
|                o|
|                .|
|                 |
|                 |
+----[SHA256]-----+
```

GUIでやる場合(Puttygen利用)。TortoiseGitをインストールしていれば、インストールフォルダに`.\bin\puttygen.exe`が入っているので、鍵を生成してそれぞれ保存する。puttygen.exeがない場合はダウンロードする。

コマンドの時と同じく、`Key Comment`欄にはGitLabへ登録しているメールアドレスを入力しておく。普通に、`Save private key`ボタンで、秘密鍵を保存すると、Putty形式の鍵なので、OpenSSH用の鍵も保存しておいたほうがいいかも。

メニューバーの`Conversions-> Export OpenSSH key`から、ファイルへ保存できる。保存しない場合は、生成結果の画面の、`Public key for pasting in to OpenSSH authorized_keys file:`の下の箇所をコピペしておく。

## GitLabへ公開鍵を登録する
GitLabの`Settings -> SSH Keys`メニューから、公開鍵の登録する。

## 接続テスト
デフォルトの保存先パスの場合は何も無しに次のコマンドでテスト。

```shell
$ ssh -T git@gitlab.com
Enter passphrase for key '/c/Users/UserName/.ssh/id_rsa':
Welcome to GitLab, UserName!
```

デフォルトパス以外（~/.ssh/id_rsa）へ鍵を作成していると、接続できないので、いちいちパスを指定しないとだめ。

```shell
$ ssh -T git@gitlab.com -i /path/to/private.key
```

## デフォルトのパス以外の鍵を使用する場合

デフォルト以外のパスへ鍵と作成し、その鍵を利用したい場合、次のエラーが発生するので、ssh-addで鍵を登録する必要がある。

```shell
git@gitlab.com: Permission denied (publickey).
```

### ほかの鍵を登録する

ssh-agentを起動して、ssh-addコマンドで登録する。

```shell
$ eval $(ssh-agent -s)
$ ssh-add ~/.ssh/other_id_rsa
Enter passphrase for /c/Users/UserName/.ssh/other_id_rsa:
Identity added: /c/Users/UserName/.ssh/other_id_rsa (/c/Users/UserName/.ssh/other_id_rsa)
```

`ssh-add -l`で鍵の登録状況を確認できます。

```shell
$ ssh-add -l
2048 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx /c/Users/UserName/.ssh/other_id_rsa (RSA)
```
Git Bashを終了すると元に戻るため、.bash_profileを作成して、上記コマンドを書いておくと起動時に実行されるので楽です。

```bash:.bash_profile
eval $(ssh-agent -s)
ssh-add ~/.ssh/other_id_rsa
```

### ~/.ssh/configの編集

.ssh/configの設定も編集が必要。

```
Host gitlab
 User git
 HostName gitlab.com
 IdentityFile ~/.ssh/other_id_rsa
```

ここまでできれば、pushとかcloneとかできるはず。
DynamoDBのデータ型を取り除く（Python3版）

# はじめに

DynamoDBから値を取得するときに、[batch_get_item](https://boto3.readthedocs.io/en/latest/reference/services/dynamodb.html#DynamoDB.Client.batch_get_item)の戻り値やDynamoDB Streamのイベントに格納されるデータの形式が、次のようにデータ型を含んだ形になっていて、そのままでは扱いづらくなっています。

```python
{
    'userId': {
        'N': '12345'
    },
    'userName': {
        'S': 'ユーザ1'
    },
    'mailAddresses': {
        'L': [
            {
                'S': 'hoge@example.com'
            },
            {
                'S': 'fuga@example.com'
            }
        ]
    }
}
```

数値も文字列になってしまっています。
この形式のデータを

```python
{
    'userId': 12345,
    'userName': 'ユーザ1',
    'mailAddresses': [
        'hoge@example.com',
        'fuga@example.com'
    ]
}
```

に直すコードが欲しかったので、書いてみました。

# コード

`remove_data_type` の引数に、データ型を含むdictを渡すと、データ型に従って変換されたdictが返ります。
データ型毎に処理を書いているだけです。
一部、再帰が入っています。

```python
import base64

def remove_data_type(record):
    return {k: remove_one_data_type(record[k]) for k in record}

def remove_one_data_type(data_type_and_value_dict):
    data_type, value = list(data_type_and_value_dict.items())[0]

    if data_type == 'S' or data_type == 'BOOL':
        return value

    if data_type == 'N':
        return float(value) if '.' in value else int(value)

    if data_type == 'B':
        return base64.b64decode(value)

    if data_type == 'NS':
        return set([float(v) if '.' in v else int(v) for v in value])

    if data_type == 'SS':
        return set(value)

    if data_type == 'BS':
        return set([base64.b64decode(v) for v in value])

    if data_type == 'M':
        return remove_data_type(value)

    if data_type == 'L':
        return [remove_one_data_type(v) for v in value]

    if data_type == 'NULL':
        return None

    raise Exception('Invalid data type: ' + data_type)
```

次のように呼び出します。

```python
dynamodb_record = {
    'userId': {
        'N': '12345'
    },
    'userName': {
        'S': 'ユーザ1'
    },
    'mailAddresses': {
        'L': [
            {
                'S': 'hoge@example.com'
            },
            {
                'S': 'fuga@example.com'
            }
        ]
    }
}

converted_record = remove_data_type(dynamodb_record)
print(converted_record)
```

```python:出力
{
    'userId': 12345,
    'userName': 'ユーザ1',
    'mailAddresses': [
        'hoge@example.com',
        'fuga@example.com'
    ]
}
```