OmniAICreator/Qiita-1.07M huggingface dataset:
A Tour of Go memo basics_2 (制御文)

# 目次
[basics_1 (パッケージ, 変数, 関数)] (https://qiita.com/A_zara/private/a0874f99573b11538baf)
[ basics_2 (制御文)](https://qiita.com/A_zara/private/8426b9469c336507ad3f)
[basics_3 (構造体/配列/map/slices)](https://qiita.com/A_zara/private/9990f1faa4e38d0dd880)
# 制御文
制御文といえば何を思い浮かべますか？
今回ここでまとめるのは```for```や```if/else/elseif```、また```seitch```や```defer```といった制御文についてやっていこうと思っています。
# for
GoでForループを書く際はセミコロンで3つの区域に分けます。

```sample.go
//~~~前略~~~
func main () {
    sum := 0 //型推論でint
    for i := 0; i < 10; i++ {
        sum += i
    }
    fmt.println(sum)
}
```
この書き方に少し違和感はありますがPHPやJavaScriptの```()```なしと考えればいいかなと考えました。
このFor構文はいつもの```初期値;条件;増加値```となります。

## For continued (forのWhile化)
実はGoの初期化と後処理は任意記述であり下記のような記述をすることによってForのWhile化ができます。

```sample.go
//~~~前略~~~
func main () {
    sum := 1
    for ; sum < 1000; {//なんだったら ; もいらない
        sum += sum
        fmt.Println(sum)
    }
}
```
Goのforでは内部の条件を抜いた場合無限ループ扱いとなります。

# if 
If文についてですが、For同様に内部の条件には```()```が必要なく記述することができます。
例えば 

``` sample.go
package main 

import "fmt"

func strCompName (name1, name2 string) bool {
     if name1 == name2 {
          return true
     }
     return false
} 

func main () {
    if strCompName ("hoge","huga") {
         fmt.Println("一致しとるで")
    } else {
         fmt.Println("一致しとらんで")
    }
}
```
## If with a short statement (if内での宣言)
IF内でstatementを記述することができこれはIF内のみでのスコープ変数として扱われます。

```sample.go
//累乗計算
package main

import (
	"fmt"
	"math"
)

func pow(x, n, lim float64) float64 {
	if v := math.Pow(x, n); v < lim {
		return v
	}
	return lim
}

func main() {
	fmt.Println(
		pow(3, 2, 10),
		pow(3, 3, 30),
	)
}
```
ここではshort statementのみではなくIfの複数条件も例として挙げている。

# Switch
ifをさらに短くするためにGoでは存在します。
私の知っているPHPやJavaSprictなどとは違いGoではcaseで一致しても停止した後に後続のcaseを行うのではなく自動的にbreakを行います。

```sample.go
package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Print("Go runs on ")
	switch os := runtime.GOOS; os {
	case "darwin":
		fmt.Println("OS X.")
	case "linux":
		fmt.Println("Linux.")
	default:
		// freebsd, openbsd,
		// plan9, windows...
		fmt.Printf("%s.", os)
	}
}
```
ついでにSwitchの条件は省いてcase文に内包できます。

# Defer(後処理)
関数の最後の処理として実行できる遅延処理。
defer へ渡した関数の引数は、すぐに評価されますが、その関数自体は呼び出し元の関数がreturnするまで実行されません。

```sample.go
package main

import "fmt"

func main() {
	defer fmt.Println("1")
	defer fmt.Println("2")

	fmt.Println("3")
}
```
結果

```
3
2
1
```
なぜこのようになるかといいますと、defersはLIFOつまるところのStackで保存され関数のreturn時に呼び戻されるのです。
Angular導入

[Angularデベロッパーズガイド 高速かつ堅牢に動作するフロントエンドフレームワーク](https://book.impress.co.jp/books/1116101012)
を基にまとめます

#Angularとは
- Webアプリケーション開発向けにGoogleが開発しているJavaScriptフレームワーク
- 言語はTypeScriptが使用されている
    - TypeScriptとはMicrosoftが開発しているJavaScriptのスーパーセット
    - コンパイルすることでJavaScriptに変換される
- メジャーアップデートは半年に1回(3月、9月)、マイナーバージョンアップは毎月行われる
- メジャーアップデートではかなり大きな変更を伴うことがある

#開発環境構築
- 実行環境
    - Windows10 Pro(64bi) 
    - Google Chrome 67.0.3396.99
## Node.jsのインストール
サーバーサイドJavaScript環境であるNode.jsをインストール

- [公式サイト](https://nodejs.org/ja/)からインストール
- 推奨版である8.11.3版(2018/7/28現在)を選択する
<img width="766" alt="NodeJs.png" src="https://qiita-image-store.s3.amazonaws.com/0/269592/88257d9d-15c2-63ca-e16f-638e06c3e1e6.png">
- Node.jsをインストールすることで、npmと呼ばれるJavaScriptのパッケージ管理ツールも併せてインストールされる
    - npmを使用してツールがインストールできる
   
## Angular CLIのインストール
Angularから公式に提供されているコマンドラインインターフェースであるAngular CLIをインストール
プロジェクトの雛形、テストの実行、ビルド等がサポートされている

- 先ほどインストールしたNode.jsのnpmコマンドを使用してインストール
 
```
$ npm install -g @angular/cli
```
- バージョン確認を行う

```
$ ng version
```
以下のように表示されればOK
<img width="411" alt="Angular.png" src="https://qiita-image-store.s3.amazonaws.com/0/269592/da8d4bc1-d5c7-ae77-0f7d-d09853c9a506.png">

上記のような「ng XXX」というコマンドがAngular CLIが提供しているコマンド 

# アプリケーション作成
まずはアプリケーションの雛形を作成

- 適当な場所に移動し、以下のコマンドで「my Project」という名前でプロジェクトを作成

```
$ ng new myProject
```
雛形としてテストの設定ファイルやTypeScriptをコンパイルする設定ファイル等が作成される

- 下記のコマンドでサーバーを起動

```
$ cd myProject
$ ng serve
```
「｢wdm｣: Compiled successfully.」と表示されれば起動完了
ブラウザからlocalhost:4200にアクセスして以下のページが表示されえればOK
<img width="1128" alt="myProject.png" src="https://qiita-image-store.s3.amazonaws.com/0/269592/ef522134-f783-2691-4122-730c13aa867d.png">

ちなみにopenオプションを加えて以下のように起動すれば自動的にブラウザが表示される

```
$ ng serve --open
```

## スクリプトエラーの確認

- Google Chromeのメニューから、その他のツール > デベロッパーツールを開くとログを確認できる
- Elementsタブからhtmlの内容、Consoleタグからログが確認できる
    - 何かしらのエラーがあるとここに表示される
<img width="1128" alt="Console.png" src="https://qiita-image-store.s3.amazonaws.com/0/269592/80cc5a18-e638-3d1d-f1e3-ad0ebc816d14.png">


#Visual Stduio Code導入
ここは参考文献には記載されていない内容
Visual Stduio CodeがあればTypeScriptの編集が楽、更にデバッグが容易にできる

## インストール

- [公式サイト](https://code.visualstudio.com/docs/?dv=win)から最新版1.25(2018年7月28日現在)をインストール

## ファイル追加
- ファイル > ワークスペースにフォルダを追加 から先ほど作成したmyProjectを指定すれば、Visual Studio Code内でファイルの表示・編集が可能

## サーバーの起動
- 表示 > 統合ターミナル を選択
- 先ほどと同様に「ng serve」でサーバーを起動
- これまた同様にブラウザからlocalhost:4200にアクセスして起動を確認できる
- サーバーを起動した状態でhtml、tsを変更・保存すれば自動的にビルドが実行される
<img width="1128" alt="VSCode.png" src="https://qiita-image-store.s3.amazonaws.com/0/269592/c5835a87-9509-c026-2fb1-72d8b3551075.png">
ディスプレイいっぱいに伸ばすウィンドウ

Twitter APIを用いるGUIアプリを作る際にてこずったことシリーズ第2弾．今回，縦だけ画面いっぱいに伸ばしたいと思って実装したら意外とてこずったのでそのお話を．
（前回は[PINコードの手入力がいらない認証について](https://qiita.com/HexagramNM/items/6cd192cabcb666dafe0b)，次回は[タスクスケジューラによるアプリ起動の自動化](https://qiita.com/HexagramNM/items/4bdfb75ea3746f0388d8)）

# 画面の解像度の取得
縦に伸ばす以上，縦のウィンドウのサイズを決定するために，画面の解像度の情報が必要になります．どうやらWPFのクラスにその情報を取得できるメソッドがないらしく，Window.Formsのメソッドを利用するようです． 
（参考：[C#で画面の解像度を取得する](https://araramistudio.jimdo.com/2016/11/10/c-%E3%81%A7%E7%94%BB%E9%9D%A2%E3%81%AE%E8%A7%A3%E5%83%8F%E5%BA%A6%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B/)） 

```C#
//自身のウィンドウを囲む長方形を定義，thisはGUIアプリのクラス
System.Drawing.Rectangle rect = new System.Drawing.Rectangle((int)this.Left, (int)this.Top, (int)this.Width, (int)this.Height);
//長方形のある（ウィンドウのある）ディスプレイのスクリーン情報を取得
System.Windows.Forms.Screen screenData = System.Windows.Forms.Screen.FromRectangle(rect);
//縦と横の解像度を取得
int screenHeight = screenData.WorkingArea.Height;
int screenWidth = screenData.WorkingArea.Width;
```

最後の2行に`WorkingArea`とありますが，この場合はタスクバーなどを除いた作業領域のサイズを取り出すことができ，`Bounds`にすると画面全体のサイズが出せるようです（参考：[ディスプレイの大きさ（画面の領域、解像度）を取得する](https://dobon.net/vb/dotnet/system/displaysize.html)）．

# DPIによる調整
上で取得したデータをウィンドウサイズに適用しても画面のDPI設定（1インチに何ドット入れるか）によっては下にはみ出してしまう可能性があります．下図の設定が100%でないと上の情報だけではうまくいきません．自分も普段は150%にしていたのではみ出しました．<img width="715" alt="DPI設定.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/152791/cb6fec4d-b6d1-d864-1a30-b5b046f9dc76.png">
これに対処するためにはスケールファクタを経由してDPIの係数を取得する必要があるようです．例えば，上のように150%設定の場合は1.5倍の大きさで表示されてしまうので，サイズを1.5で割ればよいようです．
（参考：[WPFでの高DPI対応](http://grabacr.net/archives/1105)）

```C#
PresentationSource source = PresentationSource.FromVisual(this);
double scaleX = 1.0;
double scaleY = 1.0;
if (source != null)
{
    //ここでDPIの係数を取得
    scaleX = source.CompositionTarget.TransformToDevice.M11;
    scaleY = source.CompositionTarget.TransformToDevice.M22;
}
//サイズを画面の縦サイズと同じにする
this.Height = (double)screenHeight / scaleY;
```

# まとめ
今回，ウィンドウのサイズをいじってみて，DPIのことも考えないといけないなど，面倒な部分もやらないといけないということはわかりました．
【c#】ジェネリック制約まとめ

#概要

ジェネリック制約について使う機会が多くなったのでこの機会に調べたことを自分なりにまとめようと思います。

#ジェネリック制約とは

ジェネリックを使う際に宣言の後ろに

[where ジェネリックで使う型 : 制限したい型]

をつけることで使える型を制限出来ることです。こうすることによってこのクラスでしか使えないようにしたいとか、このクラスでは使ってほしくないなどの使い方が出来るようになります。

・例　ジェネリックの対象をクラスのみにしたい場合

```c#
public class MyClass<T> where T : class
{

}
```

#一覧

簡単にどんなのがあるのかまとめました。

詳しい説明は公式ドキュメントに載ってます。
>型パラメーターの制約
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters


|ジェネリック制約|説明|
|:---|:---|
|where T : class|class(参照型)のみ制約|
|where T : struct|Nullableを除く全ての値型のみ制約|
|where T : <クラス名> |指定したクラスのみで制約|
|where T : <インターフェース名>|指定したインターフェースのみで制約|
|where T : new()|引数なしのパブリックコンストラクタがある型のみで制約|
|where T : U|Uに基づいた型で制約される|

#ルール
ジェネリック制約にはいくつかルールがあります

・ジェネリックの制限
・アクセスレベルの統一

#ジェネリックの制限

全ての型でジェネリック制約が使えるわけではなく、
一定の型はジェネリック制約で指定できません。
C#のバージョンによっては使えたり使えなかったりするので注意です。

公式ドキュメントからの引用
[where (ジェネリック型制約) (C# リファレンス)](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/where-generic-type-constraint)
>
 一部の型は、基底クラスの制約として許可されません (Object、Array、ValueType)。 C# 7.3 より前は、Enum、Delegate、MulticastDelegate も基底クラスの制約として許可されていません。 次の例では、この型は基底クラスとして指定できるようになったことを示しています。


参考
>ジェネリックの利点と制限事項
https://msdn.microsoft.com/ja-jp/library/ms172194(v=vs.110).aspx

>コンパイラ エラー CS0702
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs0702

#アクセスレベルの統一

ジェネリック制約を使おうとしてるクラスとジェネリック制約の対象のクラスのアクセスレベルを統一する必要があります。

例えば、ジェネリック制約を利用しようとしてるクラスのアクセスレベルがpublicで、ジェネリック制約の対象のクラスのアクセスレベルがprivateだったらコンパイルエラーを起こします。

```c#

private class MyPrivateClass
{

}
public class MyClass<T> where T : MyPrivateClass
{

}
```


```
アクセシビリティに一貫性がありません。制約型'MyPrivateClass'のアクセシビリティは'MyClass<T>'よりも低く設定されています。
```

コンパイラ エラー CS0703
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-messages/cs0703

#最後に
全ての型で使えるわけではない点など、細かい点を押さえれば結構便利な機能だと思いました。
このクラスのみで使用したい、このインターフェースを実装してるクラスのみに使用したいなど
利用するケースは結構あると思っていますので、積極的に使っていきたいですね。
よく耳にするポート番号をまとめてみた

# ポート番号についてまとめてみた
ITエンジニアたるもの、下記くらいは理解して行いと生きていけないと思い、自分用にまとめてみた。

## ポート番号とは
コンピュータネットワークにおいて、ポート（port）とは、オペレーティングシステムがデータ通信を行うためのエンドポイントである。「ポート」という言葉はハードウェア（入出力ポート）についても用いるが、ソフトウェアにおける「ポート」は、特定のプロセスやサービスの種類によって特定される論理的な構成概念である。（wikipediaより）
簡単に言えば「ネットワークでデータを通信するための扉のようなもの」


## ポート番号の種類
ポート番号は下記に分類される。

| 種類 | 範囲 | 内容 |
|:--|:--|:--|
| ウェルノウンポート番号 | 0番 - 1023番 | 一般的なポート番号 |
| レジスタードポート番号 | 1024番 - 49151番 | 登録済みポート番号 |
| その他のポート番号 | 49152番 - 65535番 | 自由に使用できるポート番号 |0~1023

## よく耳にするポート番号
本題。よく耳にするポート番号

| 番号   | 役割　　　　　　 |    説明   |
|---------|--------|-----------------------------|
| TCP 20    |FTP   |ファイルを送受信する通信。実際にデータのやり取りを行う。 |
| TCP 21    |FTP   |ファイルを送受信する通信。TCP20に指示を出す。|
| TCP 22    |SSH |リモートコンピュータとの通信操作。通信を暗号化。 |
| TCP 23    |Telnet |リモートコンピュータとの通信操作。通信は暗号していない。|
| TCP 25    |SMTP |メールを相手のメールサーバーまで届ける。|
| TCP 53    |DNS |IPアドレスとドメイン名の対応を管理する|
| TCP 67    |DHCP |サーバにIPアドレスを自動割り当てする。|
| TCP 68    |DHCP |クライアントにIPアドレスを自動割り当てする。|
| TCP 80    |HTTP |WEBページを呼び出すための通信形式|
| TCP 110   |POP3|メールサーバーにアクセスしてメールをダウンロード|
| TCP 123   |NTP|時刻同期に用いられる|
| TCP 443   |HTTPS |WEBページを呼び出すための通信形式にセキュリティを追加|
| TCP 993   |INAP |メールサーバにメールを残しつつメールをダウンロード|

## 参考
[【3分で把握】ポート番号とは？と代表的なポート番号まとめ](https://eng-entrance.com/network-port)
Ionic > Rating Star実装する ( 星をつけるやつ )

iOSアプリの評価などに使用される Rating Star (下図のやつ） を実装しかったのですが、Ionic標準のコンポーネントにそれっぽいものがなかったので、無理やり実装してみました。参考になれば。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
<img width="351" alt="スクリーンショット 2018-07-28 23.00.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/194978/4b205229-2adb-2884-5c82-ba56c5307a42.png">


使用するのは ionic-range + CSS

```html:html
<ion-range min="1" max="5" step="1" snaps="true" class="rate-starts" margin-right [(ngModel)]="rate">
</ion-range>
```

```css:css
ion-range.rate-starts {
  font-family: "Ionicons"
}

ion-range.rate-starts .range-tick {
  background: transparent;
}

ion-range.rate-starts .range-tick:before {
  content: '\f4b2';
  color: #eed755;
  font-size: 4rem;
  position: absolute;
  left: -17px;
  top: -21px;
}

ion-range.rate-starts .range-tick.range-tick-active:before {
  content: '\f4b3';
}

ion-range .range-knob-handle {
  display: none;
}


ion-range.rate-starts .range-bar {
  background: transparent;
}
```

CSSはassetsにファイルを追加してindex.htmlで読み込みました。 ( host: /deep/, >>> の代替が見つからないので )。
アイコンはIonicのフォントを流用しています。ここは少しアイディアです。
Raspberry Pi とNFCタグリーダを使い勤怠管理。出退勤打刻装置を作成（第3回：オーディオアンプ+スピーカを含め筐体内に実装）

# はじめに

前回の、「[第2回：NG処理とwav音源再生処理の追加](https://qiita.com/shigeru-yokochi/items/791b6836746668b6689a)」を改良したので、その変更点をまとめました。


![20180727_225727.jpg](https://qiita-image-store.s3.amazonaws.com/0/146154/5f092f99-9a5b-8b6e-fff2-3c373a5be6dd.jpeg)

# 改良箇所

## ①　「[第1回：まずは完成させる](https://qiita.com/shigeru-yokochi/items/a91c0a3cb1fbb7cafafe)」で作成したRaspberry Pi Zero Wをベースとした。

## ②　100均(キャンドゥ)で購入したディスプレイケースを筐体として利用

## ③　USBスピーカ(サンワサプライMM-SPU8BK)のアンプを取り出して実装

![20180724_230101.jpg](https://qiita-image-store.s3.amazonaws.com/0/146154/a4953e56-ad92-f008-10ff-39ea14136928.jpeg)

### 音を鳴らす設定
USBを挿したあと「aplay -l」コマンドを入力する

```
root@raspberrypi-206:~#  aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: ALSA [bcm2835 ALSA], device 0: bcm2835 ALSA [bcm2835 ALSA]
  Subdevices: 8/8
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
  Subdevice #4: subdevice #4
  Subdevice #5: subdevice #5
  Subdevice #6: subdevice #6
  Subdevice #7: subdevice #7
card 0: ALSA [bcm2835 ALSA], device 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
card 1: MicroII [Audio Advantage MicroII], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
root@raspberrypi-206:~#

```

card 1: MicroII [Audio Advantage MicroII], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
というのが追加されているので、

aplay -q ok2.wav
を
aplay -q -D hw:1,0 ok2.wav
と変更する。

# ④　その他
筐体内に収めるため、ケーブルやスピーカに手を加えました。
毎日3時に「出勤」、15時に「退勤」に自動で切り替えるプログラムも追加しました。

# コード(GitHub)
https://github.com/shigeru-yokochi/Attendance-Management


# おわりに
今回プログラミングとはあまり関係ありませんでしたが、装置として一旦完成としたので投稿させていただきました。

100均のケースがナイスでケースから出ているものは電源用のUSBケーブル１本と「出勤」「退勤」「休憩入り」「休憩戻り」を切り替えるタクトスイッチだけの美しい外装となりました。
いままで基板や配線がむき出しだったので、利用者からすると壊してしまうのではという気持ちがあったはずですのでそこは払拭できたと思っています。
明日から利用者が増えてくれることを期待しています。

今後も何か思いついたら改良を継続していきますので投稿を楽しみにしていてください。
質問等ありましたら、できるだけ対応いたしますのでお気軽にどうそ。
R で CSV のデータをグラフにするまで

Julia で CSV のデータをグラフにするまで( https://qiita.com/Nabetani/items/ab8601f02176d63bc9e2 )の結果が芳しくなかったので、R でやることにした。

まずは R と R Studio をインストール。
R Studio は使わない感じだけど。

そして CSV を用意する。

こんな

```csv
foo,bar,baz
0.301159526431945,0.313898454910858,1.17473791223684
0.325130268171028,0.560497185694232,1.11750475177855
0.372315907398201,0.611611162175372,0.97738803760451
0.547662216748869,0.623214687217486,0.916423163300621
0.935238506542586,0.816615537373106,0.658791349303661
1.18550683453858,0.94334310373166,0.397721258358077
1.76558291386366,1.06395657347973,-0.122663466326476
1.98231779465134,0.91729852516118,-0.318439265035155
2.13064106463242,0.867904655344771,-0.525066684500675
```

感じ。
ちなみに上記データは味付けした乱数。

時刻 foo に bar と baz という値が計測されたと思うことにして、これを PDF 形式でグラフにする。

ソースコードはこんな

```R:foobarbaz.r
pdf("foobarbaz.pdf", width=8, height=5) # 8×5 inch
dt<-read.csv("foobarbaz.csv")
plot(
  dt$foo,dt$bar,
  col="red",
  type="o",
  pch=20,
  xlab="foo",ylab="hoge",
  xlim=c(0.2,1.2), ylim=c(0,1))
lines(dt$foo,dt$baz,col="blue",type="o",pch=20,xlab="foo",ylab="hoge")
abline(h=(0:5)*0.2, v=(0:5)*0.2, lty=2, col="light gray") 
legend("bottomleft", legend=c("bar", "baz"),pch=20,col=c("red","blue"),lwd=1,lty=1)

dev.off()
```

感じ。

実行するためのコマンドは

```
Rscript hoge.r
```

というもの。`r` ではない。

出来上がるグラフはこんな
![image.png](https://qiita-image-store.s3.amazonaws.com/0/6854/7666d20c-f36f-fbf4-e807-2429aa8aafb8.png)


感じ。

実行時間は 0.3秒ぐらい。素晴らしい。

ところで。R言語のファイルの拡張子。".r" と ".R" 。どっちが主流なの？
Debian Package 操作メモ

`$` は入力する必要はないです。 root ユーザーで実行した時は sudo は要りません

# インストール済みパッケージのパッケージを見る

## 一覧

```bash
$ dpkg -l
```

特定の package が入っているかを知りたいとき

```bash
$ dpkg -l libssl-dev
```

バージョンとかも分かる。

必要な行だけほしければ grep

```bash
$ dpkg -l | grep libssl-dev
iU  libssl-dev:armhf                1.0.2l-1~bpo8+1              armhf        Secure Sockets Layer toolkit - development files
```

## インストールされたファイル

```bash
$ dpkg -L パッケージ名
```

ちなみにここで表示されるファイルの更新日は、インストールした時間とは限らない、なはずです（事前に他のパッケージのファイルとしてインストールされている場合？）

# パッケージに関する公開情報を知る

web だとこちらから観られます。便利 https://packages.debian.org/ja/

## 一覧を更新する
何も考えずに叩いておくとよいやつ。

```bash
$ sudo apt-get update
```

## 一覧から検索する

```bash
$ apt-cache search パッケージ名の一部
```

## 詳細を見る

```bash
$ apt-cache policy パッケージ名
```

# インストール

## 最新を入れたい
先に `apt-get update` して一覧を更新しておきましょう

```bash
$ sudo apt-get install パッケージ名
```

## バージョンを指定してインストールしたい
```bash
$ sudo apt-get install パッケージ名=バージョン
```

## 手元にある deb ファイルからインストールしたい

```bash
$ sudo dpkg -i ファイルパス
```

# 更新
先に `apt-get update` して一覧を更新しておきましょう

```bash
$ sudo apt-get upgrade
```
Go PostgreSQLにつないでみる

# PostgreSQLを用意する

- [Dockerでpostgres構築 初期データも流します](https://qiita.com/kashimura0001/items/8d8f9055cbc3ef719127) を参考にさせて頂きました
  - ありがとうございます

- 基本的には上記の記事通りでもOKだが、`docker-compose.yml`を以下のように変更

```yml:docker-compose.yml
version: "3"
services:
  postgres:
    image: postgres
    container_name: postgres
    ports:
      - 5555:5432
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
    tty: true
    restart: always
    user: root
    volumes:
      - ./init:/docker-entrypoint-initdb.d
      - /etc/localtime:/etc/localtime:ro
  pgweb:
    image: sosedoff/pgweb
    container_name: pgweb
    ports: 
      - "8081:8081"
    environment:
      - DATABASE_URL=postgres://root:password@postgres:5432/testdb?sslmode=disable
    links: 
      - postgres:postgres
    restart: always
    depends_on:
      - postgres
```
- `docker-compose up -d`後に、`http://localhost:8081` で [pgweb](http://sosedoff.github.io/pgweb/)に接続可能 

![capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/268273/e21b8457-9689-6040-7c57-8166d2268136.png)


# PostgreSQLにつないでみる

- ソースコード

```go:main.go
package main

import (
	"database/sql"
	"fmt"

	_ "github.com/lib/pq"
)

type EMPLOYEE struct {
	ID     string
	NUMBER string
}

func main() {
	db, err := sql.Open("postgres", "host=127.0.0.1 port=5555 user=root password=password dbname=testdb sslmode=disable")
	defer db.Close()

	if err != nil {
		fmt.Println(err)
	}

	// INSERT
	var empID string
	id := 3
	number := 4444
	err = db.QueryRow("INSERT INTO employee(emp_id, emp_number) VALUES($1,$2) RETURNING emp_id", id, number).Scan(&empID)

	if err != nil {
		fmt.Println(err)
	}

	fmt.Println(empID)

	// SELECT
	rows, err := db.Query("SELECT * FROM employee")

	if err != nil {
		fmt.Println(err)
	}

	var es []EMPLOYEE
	for rows.Next() {
		var e EMPLOYEE
		rows.Scan(&e.ID, &e.NUMBER)
		es = append(es, e)
	}
	fmt.Printf("%v", es)
}
```

- PostgreSQL用のドライバをインストール
  - `go get github.com/lib/pq`
- 実行
  - `go run main.go`
  - 連続実行する場合は、`INSERT`を適宜見直す
- 確認
  - コンソール出力とpgweb

# 参考

- [pq](https://github.com/lib/pq)
- [pgweb/wiki/Docker](https://github.com/sosedoff/pgweb/wiki/Docker)
- [Dockerでpostgres構築 初期データも流します](https://qiita.com/kashimura0001/items/8d8f9055cbc3ef719127)
ディレクトリ下の複数gitレポジトリに対してまとめてコマンド実行(zsh)

GitHubやBitbucketを使ってるとレポジトリが増えすぎてローカルの変更でpushできていないものはどれか等を調べるのが大変なのでシェルスクリプトにしました。
（OSの再インストールしようとした時にpushし忘れがあったら悲しい）
数分で作った適当なやつなのでメモ程度。。。

## zshコード
以下のコードは現在のディレクトリ以下のgitレポジトリに対して同じ操作をします。

```zsh
#!/usr/bin/zsh

# reference
#   - zsh の配列操作の基本から応用まで - Qiita
#       - https://qiita.com/mollifier/items/f897b3fddd2d10369333


local CWD=$(pwd)
# ローカル配列宣言
local -a GIT_REPOS
for repos in $(find ${CWD} -name ".git"); do
    ## remove ".git"
    repos=${repos[1,-5]}
    print ${repos};
    cd ${repos}
    # push  (ref: https://qiita.com/mollifier/items/f897b3fddd2d10369333 )
    GIT_REPOS=(${GIT_REPOS} ${repos})

    #----------------------------------------
    # git command
    #----------------------------------------
    git fetch
done



# 確認用
#print "GIT_REPOS"
#print ${GIT_REPOS}
#
#print "CWD"
#print ${CWD}
```
【メモ】docker未学習でdocker hubから任意のアプリイメージをMacにDLし使えるようにする

dockerやばいわこれ...ほんとなんで乗り遅れているんだ私...となった

動機
--------
プライベートでカンバンでタスク管理したくなった。
https://kanboard.org/

以前にvirtual boxにcentos入れて、上のkanboardを落としてきてNW設定して〜と手動で
たてたものの、NW周りで疎通がうまくいかなかったりで苦労した経験がある。
そのときはそれも勉強というのでやっていたけど今回やりたいのはタスク管理がしたいためにツールをすぐに使える状態にしたい、だったので、簡単導入できそうなdockerを使ってみることにした。


dockerの前提知識
--------
ほぼない。

 - OS以上のレイヤのものがまるっとひっくるめてイメージとして固まっている
 - dockerイメージを起動させたら環境構築なんていらずにdockerがよしなに動かしてくれる
 - 各アプリはdockerイメージを配布している

これぐらい。あとは己のググラビリティに期待を寄せてひとまずdocker理解は後回しにして作業を行う

環境
--------
 - Mac
    - homebrew
    - virtualbox


やったこと
---------
#### 1. [dockerを導入する](https://qiita.com/hironeko/items/3d1921a2092a0584978e)

- Macの部分を行う
    - `docker-machine stop dev`は打たない

#### 2. [MacでDockerをインストールした後に必要な作業](https://qiita.com/butada/items/4044c5efd03341c8afef)
 - 環境変数の設定
 - hello-world(起動確認用にdockerhub?に用意されているイメージ)で起動確認

#### 3. 目当てのアプリ(kanboard)のイメージを取得/起動させる
 - https://docs.kanboard.org/en/latest/admin_guide/docker.html

```bash
docker pull kanboard/kanboard:v1.1.1
docker run -d --name kanboard -p 80:80 -t kanboard/kanboard:v1.1.1
```
#### 4. IP確認/ポート確認
 - IP

```bash
echo $DOCKER_HOST
```
コンテナが動いているホストのIPと同じ

 - ポート

```bash
soachr:~ soachr$docker-machine ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
ae7f86a7ad0d        kanboard/kanboard   "/usr/local/bin/entr…"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp, 443/tcp   kanboard
```
`PORTS`のアローの左側

#### 5. アクセスできた！

躓いたところ
---------
1. 別のシェルではホストが動いていない？
   - 別シェルで`docker ps`を打っても「デーモン動いてない」と怒られた

2. アクセスする場所がわからない
   - localhostだと思っていたが違った. 公式サイトのチュートリアルもlocalhostと書いていたからそのままだと思っていた...


感想
---------
所要時間:2h弱(多少の学習時間込)
最後IPがわからないところ以外はさくっといった。

dockerの入門ページをみてもイメージがつかなくて敷居が高く感じていて、ずっとそっとじしていたため
とりあえず自分のググラビリティ信じろ！精神で動作させるまでできた。
事前学習なしでアプリ立ち上げまでできるdockerすごいな...という印象。

多少学びながらやったので時間はかかったが、ひとまず手を動かしたことでざっくりdockerがどういうものかを
体感できたので、以降入門編を読んで”答え合わせ”をしたい。
改めて学習し直したらまた知識整理のため別記事に書こう。

なんにせよ、カンバン立ち上げられて満足。
Ubuntu派生のディストリビューションにGoogle Cloud SDKをインストールする方法

LinuxMintを愛用しているのですが、
gcloudのコマンドを利用するために、Google Cloud SDKをインストールして
Ubuntuのリファレンスに沿っておこなったらうまく行かなかったのでまとめました。

# 公式リファレンスじゃだめ？？？


公式ファレンスを見るとUbuntu用のインストール方法が載っていたので、従って操作を行ってみると

https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=ja

```
# Create environment variable for correct distribution
export CLOUD_SDK_REPO="cloud-sdk-$(lsb_release -c -s)"

# Add the Cloud SDK distribution URI as a package source
echo "deb http://packages.cloud.google.com/apt $CLOUD_SDK_REPO main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

# Import the Google Cloud Platform public key
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

# Update the package list and install the Cloud SDK
sudo apt-get update && sudo apt-get install google-cloud-sdk

```

インストール途中でパッケージが見つかりません！
パケージがおいてあるURLを辿っていくと、そこにはUbuntuの開発コードネームが書かれたリポジトリが見つかります。

## それからどしたの

こちらのLinuxMintのリリースバージョン表を見ると
https://linuxmint.com/download_all.php

CODENAME → ミントのコードネーム
PACKAGE BASE → Ubuntuのコードネーム

が記載されています。

公式リファレンスのコマンドだと
`lsb_release -c -s`
ミント用のコードネームが取得されるので対象のパッケージが見つからない状態でした。
なので対応するUbuntuのパッケージをダウンロードしてみます！

下記のコマンドでバージョン確認すると対応表にもあったUbuntuのバージョンは
cat /etc/os-release

UBUNTU_CODENAMEとして記載されているのでこれを利用します！

記載時点ではLinux Mint 18を利用していて、コードネームは「Sylvia」
対応するUbuntuのコードネームは「xenial」


`export CLOUD_SDK_REPO="cloud-sdk-$(sed -n -r 's/UBUNTU_CODENAME=//p' /etc/os-release)"`

※正規表現苦手なので、もっと良いのあるかも

確認

```
echo $CLOUD_SDK_REPO
-> cloud-sdk-xenial
```

※ちなみにこちらへの書き込みは追記なので、一回削除しておいたほうがよいかもです。
```
/etc/apt/sources.list.d/google-cloud-sdk.list
```

公式リファレンスの手順で環境変数「CLOUD_SDK_REPO」を設定する箇所を今回の方法で置き換えて実施しましょう！


コマンドがインストールできたか確認
```
gcloud --version
```
できましたね！！
自宅に置いたラズパイに外出先からログインする

自宅に置いたラズパイ(つまり、NATの内側にあるのでインターネット側からは直接は見えないところにある。）を外からsshでログインできるようにしてみました。いろいろと応用できそうなので、ここに記録を残します。

# 概要

外からsshでログインできるクラウドの仮想マシンを用意して、それを経由してラズパイにアクセスできるようにします。
ラズパイが起動したら、そのクラウドの仮想マシンにSSHのトンネルを作るようにしておきます。
これで、いつでもクラウドの仮想マシンからラズパイにsshでログインできるようになります。

(気が向いたら図を描く)

# 準備

今回はクラウドの仮想マシンとしてAWSを使いました。
pemファイルでログインできるようにしておき、そのpemファイルをラズパイに置きます。
また、その仮想マシンのパブリックのIPアドレスは固定になるように設定しました。

ここではその仮想マシンを`aws001`と呼ぶことにします。
アクセスに使用するpemファイルを `aws001.pem` とします。
IPアドレスは`18.217.14.xx`とします。
ユーザーIDは `ubuntu` とします。
その仮想マシンには以下のようにすればログインできます。

```
ssh -i aws001.pem ubuntu@18.217.14.xx
```


ラズパイ側ではユーザー pi のパスワードを`passwd`コマンドを使用してデフォルトのものから変更しておきます。
aws001.pem はパーミッションが適切でないとsshコマンドがエラーになるので、以下を実行しておきます。

```
chmod 400 aws001.pem
```

# ラズパイ側に置くスクリプト

```sh:/root/ssh_tunnel/ssh_tunnel
#!/bin/sh

KEYFILE=aws001.pem
USER=ubuntu
HOST=18.217.14.xx
REMOTE_PORT=2022

[ -r $KEYFILE ] || exit 1

SSH_CONFIG="\
 -o ServerAliveInterval=20 \
 -o ServerAliveCountMax=2 \
 -o ConnectTimeout=10 \
 -o ExitOnForwardFailure=yes \
 -o StrictHostKeyChecking=no \
 -o UserKnownHostsFile=/dev/null \
"

while :; do
    sleep 10
    echo "Make ssh tunnel" |logger -t ssh_tunnel
    ssh -i $KEYFILE $USER@$HOST -R $REMOTE_PORT:127.0.0.1:22 -N $SSH_CONFIG
    echo "Disconnected ssh tunnel. Exit code:" $? |logger -t ssh_tunnel
done
```

logger はsyslogにメッセージを出すコマンドです。
sshのタイムアウトの時間などは必要に応じて調整してください。
このスクリプトを起動時に実行するために、/etc/rc.local に以下を追加します。

```sh
[ -x /root/ssh_tunnel/ssh_tunnel ] && (cd /root/ssh_tunnel; ./ssh_tunnel )&
```

# AWSのVMからラズパイにログインする

```
ssh -p 2022 pi@localhost
```
# 多段ssh


```~/.ssh/config
Host         aws001
User         ubuntu
IdentityFile ~/.ssh/aws001.pem

Host         rpi
HostName     localhost
Port         2022
User         pi
ProxyCommand ssh -W %h:%p aws001
```

このように `~/.ssh/config` に書いておけば、AWSを経由してラズパイにログインするのがコマンド一発でできます。

```
ssh rpi
```

同様にしてsftpやscpも使えるのでファイルのコピーも楽になります。

# 補足

最初はautosshコマンドでできるかと思ったのですが、うまくいかないケースがありました。

sshでログインしている最中に、ラズパイの電源を落として再起動させたときに、まだsshのコネクションが切れていない状態で新たにsshトンネルを作ろうとするとautosshコマンドが終了してしまうようでした。そのためautosshコマンドを繰り返し実行するようにしたのですが、それなら単純にsshコマンドを繰り返すのとたいして変わらないということになり、今のかたちになりました。
郵便番号検索APIをSpring Bootで叩いてみる

## 郵便番号検索APIとは
[日本郵便が公開しているAPI](http://zipcloud.ibsnet.co.jp/doc/api)です。
RESTを利用し、郵便番号を取得できます。

## 開発環境
今回は下記の環境で実行しています。

 * IDE:Spring Tool Suite 3.8.4Release
 * 言語:Java 1.8
 * FW:Spring Boot 1.5.6
 * テンプレートエンジン:Thymeleaf 2.1.5

## 今回の主役：Rest Template

* Spring Frameworkの機能です。
* REST APIを呼び出すメソッドを提供
* たった一行で呼べる！！
（HttpConnectionをOpenして、そこからBufferedWriterで書き出して、ResponseをBufferedReaderで読み込んで、みたいなこと要らない）

## 実装

### Service Class
```Java:ZipCodeService.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

@Service
public class ZipCodeService {
	@Autowired
	@Qualifier("zipCodeSearchRestTemplate")
	RestTemplate restTemplate;

	/** 郵便番号検索API リクエストURL */
	private static final String URL = "http://zipcloud.ibsnet.co.jp/api/search?zipcode={zipcode}";

	public ZipCodeDto service(String zipcode) {
		return restTemplate.getForObject(URL, ZipCodeDto.class, zipcode);
	}
}
```

実際にAPIを叩いているのは、

```
restTemplate.getForObject
```
の部分です。

### Dto
RestTemplateで叩いて取得したデータを、Javaオブジェクトで受け取ります。

```Java:ZipCodeDto.java
package com.taku.springboot;

import java.util.ArrayList;
import java.util.List;

public class ZipCodeDto {
	/** ステータス */
	int status;

	/** メッセージ */
	String message;

	/** 郵便番号情報リスト */
	List<ZipCodeDataDto> results = new ArrayList<>();
```

## 実際に動かしてみる
こうして…
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167339/a5ed3f79-b4b8-56e1-6c89-2d6841a5be1d.png)

こう！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/167339/dfe50f7c-e300-c995-4699-9bdbf0ab4782.png)
JavaおじさんがPythonを使えるようになるまでの全記録（その6）

#はじめに
土曜日だし台風来てるし今日は手短にすまそうｗ

#範囲型
既に散々出てきてるrangeってのも構造型の一種なわけね。

``range(start, stop, step）``の書式で記述可能
startとstepは省略可能でデフォルト値はstart=0, step=1

基本的に結合(+)と反復(*)ができないだけであとの~~演算子は使えます~~使い方はタプルと同じですよと。
気を付けないといけないのは以下の2点か。

1. 数列の構成要素と順序が同じなら等値判定される
2. 使用するメモリは数列の長さには関係しない。start,stop,stepの値がわかれば数列の内容が決まるので~~（おそらく）4要素以上の要素のある~~等差数列もしくは公差数列ならこっちの方がメモリ量は少ないってことになるわけね。詳しくはコメント参照。いつも詳しく解説していただいてありがたい限りです。

1については
``range(0, 7, 2)==range(0, 8, 2)``は``True``...両方とも[0, 2, 4. 6]だから
``range(0, 7, 2)==range(6, -1, -2)``は``False``...左辺は[0, 2, 4. 6]、右辺は[6, 4, 2, 0]で順序が違う
ってことみたいね。
なるほど。

とりあえず今日はこれで終了。
Watch Who is Latest Top 10 Products

Latest Top 10 Products Update See & Buy https://latesttop10products.blogspot.com/
http://latesttop10products.blogspot.com/2018/07/health-household-baby-carebest-cushy.html
http://latesttop10products.blogspot.com/2018/07/best-baby-products.html
http://latesttop10products.blogspot.com/2018/07/latest-top-10-camera-in-worldhere-also.html
http://latesttop10products.blogspot.com/2018/07/health-personal-care.html
http://latesttop10products.blogspot.com/2018/07/best-top-10-led-usb-lightbuy-from-here.html
http://latesttop10products.blogspot.com/2018/07/best-top-10-latest-coffee-makerssee-buy.html
http://latesttop10products.blogspot.com/2018/07/best-top-10-ceiling-fans-2018buy-now.html
http://latesttop10products.blogspot.com/2018/07/top-10-latest-air-conditionerac-in.html
http://latesttop10products.blogspot.com/2018/07/top-10-latest-modem-2018.html
http://latesttop10products.blogspot.com/2018/07/top-10-latest-tv-in-world.html
http://latesttop10products.blogspot.com/2018/07/top-10-latest-mobail-in-2018.html
http://latesttop10products.blogspot.com/2018/05/top10-latest-computers.html
math.MaxInt64 の代入に注意 (Go)

# math.MaxInt64 の代入に注意 (Go)

`math.MaxInt64` は当然 `int32` には入り切らないわけですが

```golang
x := math.MaxInt64
```

と記述すると、`x` の型は `int` となってしまいます.
(`math.MaxInt64` は `const MaxInt64  = 1<<63 - 1` と型を設定せずに定義されているので)

64bit 環境では何も問題ありませんが、32bit 環境では `constant 9223372036854775807 overflows int` でコンパイルエラーになります.

64bit/32bit どちらでも動作するようにするのであれば `math.MaxInt32` に変更するか、

```golang
x := int64(math.MaxInt64)
```

と記述しましょう.

追記: Go 1.17 で `math.MaxInt` が追加されたので、64bit/32bit どちらでも動作するようにするのであれば、これがお勧めになりました.
Web Hosting Coupon Code,Deals & Promo

Web Hosting Coupon Code,Deals & Promo
https://webhostingcouponcodes365.blogspot.com/
http://webhostingcouponcodes365.blogspot.com/2018/07/domain-registration-and-hosting-coupon.html
http://webhostingcouponcodes365.blogspot.com/2018/07/watch-web-hosting-coupon-promo.html
http://webhostingcouponcodes365.blogspot.com/2018/07/web-hosting-and-domain-registration.html
http://webhostingcouponcodes365.blogspot.com/2018/07/domain-registration-hosting-website.html
http://webhostingcouponcodes365.blogspot.com/2018/07/web-hosting-domain-registration-trusted.html
Postgresqlでバルクインサートする方法

# PostgresqlでINSERTする方法
1000行ずつINSERTするのを10回実行するコード

```python
import psycopg2
from psycopg2  import extras
import datetime

dsn="dbname=xxxx host=xxxx port=5432 user=xxxx password=xxxx"
con = psycopg2.connect(dsn)

for i in range(10):

    cur = con.cursor()
    insert_list = []    
    target_list = 何か処理した結果をリストに入れる

    for row in target_list:
        #ここではrowに3つのカラムのデータが入っているとする。
        #この場合、これらのデータを以下のようにタプルにする
        t = (row[0],row[1],row[2])
        insert_list.append(t)

    extras.execute_values(cur, "INSERT INTO table values %s", insert_list)
    con.commit()
    
con.close()
```

psycopg2にはexecutemanyという関数があるが、これはバルクインサートではなく遅い。
具体的には上のコードのextras.execute_valuesのところを以下のようにするとexecutemanyでINSERTできる。

```python
cur.executemany("INSERT INTO table values(%s,%s,%s)",insert_list)
```

最初は遅いの知らなくてこれでやってたが、遅すぎて高速化を調べてたらここに書いてました。
https://datumstudio.jp/blog/postgresql%E3%81%A7insert%E9%80%9F%E5%BA%A6%E6%AF%94%E8%BC%83
http://initd.org/psycopg/docs/extras.html#fast-exec

自分の環境では、1000行INSERTするのに30秒かかってたのが、3秒くらいに短縮されました。
ただ、上にリンク書いたDatumさんの記事によるとCOPY文の方がもっと高速にできるらしいです。
【Laravel5.6】whereColumnで2つのカラムの日付比較をする

Laravel EloquentクエリービルダーのwhereColumn()メソッドを使用して、
2つのカラムにある日付を比較して、最終的な結果をgetで取得します。

#テーブル構造例
下記のようなテーブルがあるとする。

| id |     name    |      action_at|      login_at|
|:---:|:------------:|:-------------------:|:------------------:|
| 1  |          A  |2018-07-27 12:00:00 |2018-07-27 11:00:00 |
| 2  |          B  |2018-07-27 11:00:00 |2018-07-27 12:00:00 |
| 3  |          C  |2018-07-27 12:00:00 | null               |
| 4  |          D  |        null        |2018-07-27 12:00:00 |

#やりたい事
日付日時が`login_at`よりも`action_at`の方が遅いデータを取得したい。
この場合、取得したい期待値データは、`id`が`1`のデータになる。

#実現方法
`whereColumn()メソッド` は、同値判定だけでなく、比較演算子も使えます。
今回は下記の様な形でコードを記述します。

```php5
$users = DB::table('users')
                ->whereColumn('action_at', '>', 'login_at')
                ->get();
```
すると

```
Collection {#293 ▼
  #items: array:1 [▼
    0 => User {#289 ▼
      #fillable: array:2 [▶]
      #connection: "mysql"
      #table: null
      #primaryKey: "id"
      .
      .
      .  
      #original: array:3 [▼
        "id" => 1
        "action_at" => "2018-07-27 12:00:00"
        "login_at" => "2018-07-27 11:00:00"
      ]
      .
      .
      .     
    }
  ]
}
```

`id`が`1`のレコードを取得できます。

#SQL
ここで、Laravelで実行されたSQLを確認してみると、

```php5
.
.
.

use DB;

.
.
.
// 確認したいSQLの前に追記
DB::enableQueryLog();
$users = DB::table('users')
                ->whereColumn('action_at', '>' 'login_at')
                ->get();
// dumpする
dd(DB::getQueryLog());
```
すると

```
array:1 [▼
  0 => array:3 [▼
    "query" => "select * from `matchings` where `action_at` > `login_at`"
    "bindings" => []
    "time" => 2.81
  ]
]
```
という出力結果になります。

#whereColumn()メソッドの使い方

２つのカラムが同値である確認をする。

```php5

$users = DB::table('users')
                ->whereColumn('first_name', 'last_name')
                ->get();
```

比較演算子を指定する。

```php5

$users = DB::table('users')
                ->whereColumn('updated_at', '>', 'created_at')
                ->get();
```


配列により複数の条件を渡すことができ、条件はandで繋ぐ事が可能。

```php5

$users = DB::table('users')
                ->whereColumn([
                    ['first_name', '=', 'last_name'],
                    ['updated_at', '>', 'created_at']
                ])->get();
```

#参考
Laravel 5.6 データベース：クエリビルダ
https://readouble.com/laravel/5.3/ja/queries.html
コントローラーの作成

モデルの作成のあと実行。
routingも行うこと。

例：
  # 対象となるディレクトリに移動(例：tweet)
  $ cd ~/projects/tweet
  # tweetディレクトリにいることを確認
  $ pwd
  => /Users/ユーザー名/projects/tweet
  # コントローラを作成
  $ rails g controller tweets

※コントローラー名は、複数形

# コントローラの削除
rails d controller tweets
routing（ルーティング）　DB・モデル作成の後に実行

DB・モデル作成の後に実行

例：
Rails.application.routes.draw do
  root 'jobs#index'
  devise_for :users
  resources :jobs do
    resources :entries, only: [:new, :create, :show]
  end
  resources :users, only: [:show, :edit, :update]
  resources :chats
Golangのテンプレート(Template)を使ってみる

Golang標準で使えるTemplateを使ってみます。
Templateを使用するとプログラムとデザインを分離することができます。

では、実際にやってみましょう。
下記のようにプログラム(server.go)とテンプレート(clock.tpl)を用意します。

```go:server.go
package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"
    "time"
)

func main() {
    // /now にアクセスした際に処理するハンドラーを登録
    http.HandleFunc("/now", handleClockTpl)

    // サーバーをポート8080で起動
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleClockTpl(w http.ResponseWriter, r *http.Request) {
    // テンプレートをパース
    tpl := template.Must(template.ParseFiles("clock.tpl"))

    m := map[string]string{
        "Date": time.Now().Format("2006-01-02"),
        "Time": time.Now().Format("15:04:05"),
    }

    // テンプレートを描画
    tpl.Execute(w, m)
}
```

```html:clock.tpl
<!DOCTYPE html>
<html><body>
    <p>Date={{.Date}}</p>
    <p>Time={{.Time}}</p>
</body></html>
```

そして実行して、アクセスするとこんな感じです。

![テンプレートテスト.png](https://qiita-image-store.s3.amazonaws.com/0/272546/19002a4f-32ec-abc2-1592-df86c24cd09b.png)

`{{.date}}` と `{{.time}}` がmapの要素に置き換わっているのが分かると思います。
ちなみに下記のようにmapではなく、構造体も使えます。

```go:server.go(構造体の例
package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"
    "time"
)

func main() {
    // /now にアクセスした際に処理するハンドラーを登録
    http.HandleFunc("/now", handleClockTpl)

    // サーバーをポート8080で起動
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleClockTpl(w http.ResponseWriter, r *http.Request) {
    // テンプレートをパース
    tpl := template.Must(template.ParseFiles("clock.tpl"))

    type DateTime struct {
        Date string
        Time string
    }

    now := DateTime{Date: time.Now().Format("2006-01-02"), Time: time.Now().Format("15:04:05")}

    // テンプレートを描画
    tpl.Execute(w, now)
}
```

やはりデザイン部分は別ファイルにしたほうが、プログラムが見やすく、管理もしやすくなります。
数行のプログラムだとピンとこないかもしれませんが(笑)

それと、標準のTemplateでは対応していない、テンプレートファイルから別のテンプレートファイルをインクルードするような使い方をしたかったので、ちょっと独自にテンプレートエンジンを作ってみました。
興味のある方は下記からどうぞ。
[Golangのインクルード(include)対応テンプレート(goingtpl)を作ってみた](https://qiita.com/kamina/items/64a1f2e238d072273fd8)
Golangのインクルード(include)対応テンプレート(goingtpl)を作ってみた

Golang標準の `html/template` がインクルード記述に対応していなかったので、独自に作ってみました。
作ったといっても `html/template` をラップして少し拡張した程度ですが。(笑

続きもあるので、良ければどうぞ。
[Golangの継承(extends)対応テンプレート(goingtpl)を作ってみた](https://qiita.com/kamina/items/031a138b3ba30fb67afa)

# goingtpl

- テンプレートファイルから別テンプレートファイルのインクルード記述に対応
- ついでにテンプレートのキャッシュ機能

下記GitHubで公開中です。
[https://github.com/playree/goingtpl](https://github.com/playree/goingtpl)
使い方などの詳細は下記
[https://github.com/playree/goingtpl/blob/master/README.JP.md](https://github.com/playree/goingtpl/blob/master/README.JP.md)

簡単に機能を紹介します。

## テンプレートのインクルード機能
テンプレートファイルに別のテンプレートファイルをパースすることができます。
テンプレートファイルに `{{include "xxx.html"}}` のように記述します。

```html:parent.html
<!DOCTYPE html>
<html><body>
    <h1>Test code</h1>
{{template "footer"}}{{include "footer.html"}}
</body></html>
```

```html:footer.html
{{define "footer"}}
    <p>Footer</p>
{{end}}
```

あとは下記のように専用のパースメソッドを使用して、親となるテンプレートファイルをパースするだけで、include指定したファイルも一緒にパースされます。

```go:パースメソッド
tpl := template.Must(goingtpl.ParseFile("parent.html"))
```

`html/template` 互換というか、テンプレートファイルをパースした結果は `template.Template` となっています。

```go:サンプル
package main

import (
	"fmt"
	"html/template"
	"log"
	"net/http"
	"time"

	"github.com/playree/goingtpl"
)

func main() {
	// テンプレートのディレクトリを設定
	goingtpl.SetBaseDir("./templates")

	http.HandleFunc("/test", handleTest)
	log.Fatal(http.ListenAndServe(":8088", nil))
}

func handleTest(w http.ResponseWriter, r *http.Request) {
	start := time.Now().UnixNano()

	// parent.htmlをパース
	tpl := template.Must(goingtpl.ParseFile("parent.html"))
	tpl.Execute(w, nil)

	fmt.Printf("ExecTime=%d MicroSec\n",
		(time.Now().UnixNano()-start)/int64(time.Microsecond))
}
```

実行結果はこんな感じ。
footer.htmlの内容もパースされているのが分かると思います。

![パース結果.png](https://qiita-image-store.s3.amazonaws.com/0/272546/54690262-2e50-a90b-134b-88bd41e8c91c.png)


## テンプレートのキャッシュ機能

使い方は簡単で、事前に下記のようにして機能をONにしておくだけです。
これにより、一度パースしたテンプレートファイルはメモリ上にキャッシュされ、次回からはメモリ上からロードされるようになります。
ディスクアクセスを減らすことができるので、パフォーマンスの向上に期待できます。
逆にキャッシュ中はテンプレートファイルを変更しても反映されない為、開発中はOFFにしておくほうが効率的かもしれません。

```go:キャッシュ機能ON
goingtpl.EnableCache(true)
```

さきほどのパースのサンプルコードで試してみます。
下記は元のソースのまま(キャッシュ機能OFFで)数回アクセスした際のログです。

```
API server listening at: 127.0.0.1:36704
ExecTime=568 MicroSec
ExecTime=495 MicroSec
ExecTime=496 MicroSec
```

では、キャッシュ機能をONにしてみます。
下記のように修正します。

```go:キャッシュ機能をONにする
func main() {
	// テンプレートのディレクトリを設定
	goingtpl.SetBaseDir("./templates")
	goingtpl.EnableCache(true)
```

これで数回アクセスしてみます。

```
API server listening at: 127.0.0.1:41719
ExecTime=597 MicroSec
ExecTime=0 MicroSec
ExecTime=0 MicroSec
```

初回アクセス以降の処理時間が短縮されているのが分かると思います。

キャッシュ機能をONにした場合、プログラムが稼働している間は実際のテンプレートファイルを編集しても反映されません。(メモリにキャッシュしたものを参照する為)
その為、キャッシュを一度クリアするメソッドも用意しています。

```go:キャッシュクリアメソッド
goingtpl.ClearCache()
```
アテンション機構についてのメモ

アテンション機構についてのメモ。

## シンプルに試す
シンプルに試すには、softmaxによりアテンション層を計算して、入力層と要素積をとって、

```
merge([inputs, a_probs], name='attention_mul', mode='mul')
```

Denseにより活性化関数を掛けて、1として教師信号と比較、
という形で学習をする。

![model_dense.png](https://qiita-image-store.s3.amazonaws.com/0/44938/8d4c9bcd-2cc0-7af7-f067-b19b72543bcf.png)

## アテンション層の出力は
```
outputs = [layer.output for layer in model.layers if layer.name == layer_name]
```
という形で、層の名前で取れる。

## kerasの作法
### Denseについて
例）

```
model.add(Dense(20, input_dim=5))
```

> 次は活性化関数を入れてみよう。20個のノードそれぞれに対して5つの数値が入ってくるが、
> その5つの数値の重み付け和（＋バイアス）を適当にとって最後に関数をかける。そのときの関数が活性化関数である。

参考：https://qiita.com/Ishotihadus/items/c2f864c0cde3d17b7efb

### Permuteについて
keras.layers.Permute(dims)
与えられたパターンにより入力の次元を入れ替える．

# 参考
▼参考：Keras : Luong Attentionは実装できたのか？(Teacher Forcingの話も少し)
https://qiita.com/HotAllure/items/50cf80cb1caf9c4d11fa

▼参考：【 self attention 】簡単に予測理由を可視化できる文書分類モデルを実装する
https://qiita.com/itok_msi/items/ad95425b6773985ef959
https://github.com/nn116003/self-attention-classification

▼【テキスト分類】Convolutional Neural NetworksにAttention機構を使ってみた。
https://qiita.com/omr001/items/bda375fa1938ff7c2596
https://github.com/omr001/cnn-sentiment-classification/tree/master
我が家でもGoogle Homeで子供への呼びかけをお試しで実行してみる

# はじめに
初めての投稿になります。
@hideo-works さんの記事をみて我が家でもと考えた2児の父です。
https://qiita.com/hideo-works/items/db25a748889d47d5eff2
Google-Home-Miniは持っていたのですが、ラズパイは持っていなかったので、
Node.jsをPCで稼働させることにしました。

# 処理フロー
処理フローは、Googleスプレッドシート→Firebase→PC(windows10)→Google Home Miniとしました。

# どうやったか
まずは、PC(windows10)にNode.jsを導入しました。
下記の記事などを参考に設定しました。
https://qiita.com/tomatosum/items/046200efe9acd9fb00be

それから、PC(windows10)上のNode.jsで動作させるスクリプトを少し修正しました。
Google Homeで読み上げを実施する別プロジェクトを呼び出す箇所を、シェルスクリプトの代わりにバッチファイルに置き換えました。

```js:firebase/index.js

      ...
      //読み上げ
      "announce": () => {
        const command = "C:/GoogleHome/announce/index.bat "; //この行だけ変更した
        const content = words.slice(1, words.length).join(" ");
        return command + content.replace(/'/g,"\\'");
      },
      ...
```
追加したバッチファイル

```bat:announce/index.bat
@echo off
cd /d %~dp0
node index.js %1
exit 0
```

# おわりに
上の子が小学校に行く時間の前に３回ほど呼びかけしているのですが聞き流してしまうようで、結局支度をするのはいつもぎりぎりなのは変わらずでした。下の子は関係ないのですが呼びかけを聞いて反応しているようです。

PCでNode.jsを稼働しているため、PCがスリープしていると動作してくれません。スリープから復旧したタイミングで呼びかけされてしまうことがあります(夜中にアップデート確認で勝手にスリープ復旧し呼びかけするなど)。近いうちにラズパイを入手してそちらで運用するようにしたいです。
Azure 仮想マシンのOSディスクをスワップする方法（管理ディスク・非管理ディスク）


##はじめに
ちょっと前、2018年5月頃にAzure 仮想マシンでOSディスクのスワップ（交換）の機能がリリースされた。
OSディスクのスワップ（交換）とは、その名の通り、仮想マシンに接続されているディスクを仮想マシンのリソースを削除せずに別のディスクに差し替えることを意味する。
Azure 仮想マシンでは、管理ディスク（Manage Disk）と非管理ディスク（Non Managed disk）の２種類のディスク構成が存在するがどちらもスワップをすることができる。しかしながら、公開情報やwebをいくら調べても非管理ディスクの実行サンプルが見当たらなかったので、いい機会と思い動作検証と手順を整理する。

##手順
意外と簡単に次の３ステップで交換ができる。

1. 仮想マシンを停止（割り当て解除）する
2. OSディスクのスワップする
3. 仮想マシンを起動する

1と3は、AzureポータルやPowershellの Stop-AzureRmVM や Start-AzureRmVM で実施できる。
2は、管理ディスクと非管理ディスクで交換したいディスクのリソースの指定方法がことなるため、少し操作が異なる。

■非管理ディスクの場合

```powershell
$vm = Get-AzureRmVM -ResourceGroupName <リソースグループ名> -Name <VM名>
$Vm.StorageProfile.OsDisk.Vhd.Uri = "https://xxx.blob.core.windows.net/xx/xx.vhd"　＃交換用ディスクのパス
Update-AzureRmVM -ResourceGroupName <リソースグループ名> -VM $Vm
```

■管理ディスクの場合

```powershell
$vm = Get-AzureRmVM -ResourceGroupName <リソースグループ名> -Name <VM名>
$disk = Get-AzureRmDisk -ResourceGroupName <リソースグループ名> -Name <交換用ディスク名>
Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $disk.Id -Name $disk.Name
Update-AzureRmVM -ResourceGroupName <リソースグループ名> -VM $vm
```

ポイントは、非管理ディスクは、仮想マシンの構成情報のStorageProfile.OsDisk.Vhd.Uriを交換したいディスク（vhdファイル）のストレージアカウント上のパスで更新する。管理ディスクの場合はSet-AzureRmVMOSDiskコマンドが用意されており、このコマンドで交換用の管理ディスクのリソースIDを更新する。

##注意点
このOSディスクのスワップは、OSの種類に関わらず手順は同じだが、交換するディスクに含まれるOSの種類（Windows/Linux）は変更できない。例えば、Windows仮想マシンのディスクをLinux OSが入ったディスクには交換できないので、そのような作業をする場合は、一度、仮想マシンを削除して、交換したいディスクから仮想マシンを再構築する必要がある。

##参考
1. [Managed Virtual Machines で OS ディスク スワップの一般提供を開始](https://blogs.technet.microsoft.com/jpitpro/2018/05/11/os-disk-swap-managed-disks/)

2. [Azure Linux VM 用のディスク ストレージについて](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/about-disks-and-vhds)

3. [Azure Windows VM 用のディスク ストレージについて](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/about-disks-and-vhds)
IBM Cloud IaaS の仮想サーバーのイメージビルド間隔


# やり方
ここのメニューから確認できます。

https://cloud.ibm.com/gen1/infrastructure/image-templates
![Kobito.QGM9IE.png](https://qiita-image-store.s3.amazonaws.com/0/101361/948d8457-0ae0-68b6-466e-3af1b32e9f72.png "Kobito.QGM9IE.png")


# Windows Server

約1ヶ月ごとにイメージが更新されていることがわかります。
なるべく最新のパッチが適用された形で提供されるということでしょう。

## Windows 2016

![Kobito.HKKmce.png](https://qiita-image-store.s3.amazonaws.com/0/101361/9f85306e-cadc-425a-69a3-28ca11f7aac9.png "Kobito.HKKmce.png")

## Windows 2012 R2

![Kobito.YuhTpG.png](https://qiita-image-store.s3.amazonaws.com/0/101361/82d7acfe-29a0-04a2-782b-c203766b15c2.png "Kobito.YuhTpG.png")

# RHEL

OS の選択で、7.x なら 7.5、6.x なら　6.10 でプロビジョニングされることがわかります。
古いバージョンを注文したい場合は個別にダウングレードするか、古いイメージから注文することが可能です。

## RHEL 7

![Kobito.heHFmy.png](https://qiita-image-store.s3.amazonaws.com/0/101361/d21cd912-0280-8e8f-1c79-b43c19660c87.png "Kobito.heHFmy.png")

## RHEL 6

![Kobito.avvLsb.png](https://qiita-image-store.s3.amazonaws.com/0/101361/86af1c7c-c568-b926-6de6-d431b05dc900.png "Kobito.avvLsb.png")

# CentOS

OS の選択で、7.x なら 7.5、6.x なら　6.9 でプロビジョニングされることがわかります。
古いバージョンを注文したい場合は個別にダウングレードするか、古いイメージから注文することが可能です。

## CentOS 7

![Kobito.Kr9czj.png](https://qiita-image-store.s3.amazonaws.com/0/101361/e350a282-d994-458c-cb78-0879453de8af.png "Kobito.Kr9czj.png")

## CentOS 6

![Kobito.2Gvfub.png](https://qiita-image-store.s3.amazonaws.com/0/101361/726a79da-2289-f065-8375-6a9eded5887c.png "Kobito.2Gvfub.png")

# Ubuntu

## Ubuntu 16.04

![Kobito.FTXC2A.png](https://qiita-image-store.s3.amazonaws.com/0/101361/bda0efc2-d6bb-993a-f22f-fa7d77669396.png "Kobito.FTXC2A.png")
Elixirのdecoratorを使って関数に機能を追加する

この記事では、Elixirの関数に付加的な機能を追加するライブラリである [decorator](https://github.com/arjan/decorator) について紹介します。
decoratorは、あらかじめ定義された処理を任意の関数へと追加するライブラリです。これにより、デバッグ用途の情報取得処理や何らかのチェック処理を簡単に追加することが可能になります。

# 使い方
それでは、decorator の使用方法を見てみましょう。

## インストール
`mix.exs` の `deps` に `decorator` を追加して `mix deps.get` を実行します。

```elixir
defp deps do
 [
   {:decorator, "~> 1.2"}
 ]
end
```

## 基本的な使い方
decorator は、次のように `Decorator.Define` マクロを使用して定義します。この例では、関数の情報やパラメータを出力する `print_func_info` という decorator を定義しています。

```elixir:print_decorator.ex
defmodule PrintDecorator do
  use Decorator.Define, print_func_info: 0

  def print_func_info(body, context) do
    quote do
      # moduleや関数名などの情報を取り出す
      module = Atom.to_string(unquote(context.module))
      name = Atom.to_string(unquote(context.name))
      arity = unquote(context.arity)
      args = unquote(context.args)

      # 取得した情報を表示する
      IO.puts("[DEV] #{module}.#{name}/#{arity} is called.")
      IO.write("[DEV] args: ")
      IO.inspect(args)

      unquote(body)
    end
  end
end
```

定義した `print_func_info` は、次のコードのように `@decorate` と共に使用します。ここでは `Greeting.say_goodbye/2` という関数に、情報出力機能を追加しています。

```elixir:greeting.ex
defmodule Greeting do
  use PrintDecorator

  @decorate print_func_info()
  def say_goodbye(name, time) do
    IO.puts("It's #{time}. Goodbye #{name}.")
  end
end
```

iexで `Greeting.say_goodbye/2` を実行すると、次のように出力されます。

```
iex(1)> Greeting.say_goodbye("Taro", "18:00")
[DEV] Elixir.Greeting.say_goodbye/2 is called.
[DEV] args: ["Taro", "18:00"]
It's 18:00. Goodbye Taro.
:ok
```

## パラメータチェックの例
他の使用例として、関数へと渡されるパラメータの値をチェックさせる例を見てみましょう。

ここでは、パラメータの値に `nil` が含まれていれば `:error` を返す decorator を考えてみます。そのような動作をさせるため、次のように `check_param_not_nil` という decorator を定義します。

```elixir:parameter_check.ex
defmodule ParameterDecorator do
  use Decorator.Define, check_param_not_nil: 0

  def check_param_not_nil(body, context) do
    quote do
      # パラメータにnilが含まれるかチェック
      args = unquote(context.args)
      has_nil = args |> Enum.any?(fn x -> x == nil end)

      if(has_nil) do
        # nilがあれば :error を返す
        {:error, :nil_param, args}
      else
        unquote(body)
      end
    end
  end
end

```

それでは、 `check_param_not_nil` を使ってみましょう。次のように、パラメータの値を加算するだけの関数 `Foo.plus/3` に `check_param_not_nil` をセットします。

```elixir:foo.ex
defmodule Foo do
  use ParameterDecorator

  @decorate check_param_not_nil()
  def plus(x, y, z) do
    result = x + y + z

    {:ok, result}
  end
end

```

iexで `Foo.plus/3` を実行すると、次のように出力されます。

```
iex(1)> Foo.plus(1, 2, 3)
{:ok, 6}

iex(2)> Foo.plus(1, nil, 3)
{:error, :nil_param, [1, nil, 3]}
```
# まとめ
この記事では、 decorator を使うことで任意の関数に簡単に新たな機能を追加できることを紹介しました。ただし、 [Elixirの公式サイト](https://elixir-lang.org/getting-started/meta/macros.html#foreword) でも述べられているように、マクロの濫用はコードの可読性低下や保守性の低下を招く恐れがあります。私見ではありますが、 decorator も必要な箇所だけで適切に用いるのが良いと思います。

# 参考
[decorator](https://github.com/arjan/decorator)
[Elixir function decorator example](https://gist.github.com/arjan/e439cac1289cbb2ea6667641f4a965f0)
[#matlab] 1行でタイムスタンプを打つ

赴くままに書いたら案外通ったのでメモ。Matlabのコードです。

```matlab
>> timestampRegular = replace(join(split(datestr(now), ' '), '-'), ':', '-'); timestampRegular{1}

ans =

    '28-Jul-2018-19-35-05'
```

`now`, `datestr`とかが時間に関する関数で、それ以外はpythonとかでもよく見る関数と一緒なのですぐ分かると思います。

`replace`するとcellが返ってくるのが難点かな。cellは、{1}とか指定すると要素が取り出せます。


##　2019/03/27追記

......

```matlab
>> datestr(now,'yyyy-mm-dd-HH-MM-SS') 
```