OmniAICreator/Qiita-1.07M huggingface dataset:
いまさら始めるJava8 ～日付時刻API～

前回：[続・いまさら始めるJava8 ～StreamAPI～](https://qiita.com/uchi_y/items/dfe227612269dccf611c)
前々回：[いまさら始めるJava8 ～forEachとラムダ式～](https://qiita.com/uchi_y/items/b292e231b0fe3c6032ee)

## Java8で追加された日付時刻API
Java7で日付時刻を扱う場合、値の保持はDateクラス, 操作はCalendarクラスと分かれていましたが、Java8でまとめて扱える API群が追加されました

### 代表的なクラス
- [LocalDateTime](http://docs.oracle.com/javase/jp/8/docs/api/java/time/LocalDateTime.html)
タイムゾーンのない日付時刻

- [OffsetDateTime](https://docs.oracle.com/javase/jp/8/docs/api/java/time/OffsetDateTime.html)
UTC/グリニッジからのオフセット付きの日時

- [ZonedDateTime](https://docs.oracle.com/javase/jp/8/docs/api/java/time/ZonedDateTime.html)
タイムゾーン付きの日付/時間

- [Instant](https://docs.oracle.com/javase/jp/8/docs/api/java/time/Instant.html)
ある時刻を表す値
1970-01-01T00:00:00Zからのエポック秒を表すlongと、ナノ秒を表すintを持ちます

### 特徴
- 日付時刻の値の保持と操作の両方ができる
- 時刻をナノ秒までの精度で表せる
- 不変(Immutable)

## 使い方
LocalDateTime、OffsetDateTime、ZonedDateTimeの使い方はほぼ一緒なのでLocalDateTimeで説明します

### 現在時刻の取得
```
LocalDateTime current = LocalDateTime.now();  // -> 2018-03-03T12:09:50.875
```
### 日付時刻を指定して生成
```
LocalDateTime atMin = LocalDateTime.of(2018,3,3,12,1);                  // -> 2018-03-03T12:01
LocalDateTime atSec = LocalDateTime.of(2018,3,3,12,1,23);               // -> 2018-03-03T12:01:23
LocalDateTime atNanoSec = LocalDateTime.of(2018,3,3,12,1,23,123456789); // -> 2018-03-03T12:01:23.123456789
```
年月日時分まで、秒まで、ナノ秒まで指定して生成するstaticメソッドが用意されています
指定しなかったフィールドはゼロになります
月はCalendarクラスと異なり1~12で指定できます

### Date/Calendarからの変換
Date/CalendarからLocalDateTimeに変換するには新しく追加された`.toInstant()`メソッドを使いInstantを経由します
ZoneIdの指定が必要なのでシステムデフォルトを取得します

```
Calendar now = Calendar.getInstance();
Instant nowInstant = now.toInstant();
LocalDateTime fromCalendar = LocalDateTime.ofInstant(nowInstant, ZoneId.systemDefault());
```

### 日付時刻の取得
年月日時分秒ナノ秒それぞれを取得するメソッドがあります

```
LocalDateTime current = LocalDateTime.now(); // -> 2018-03-03T12:09:50.875

System.out.println(current.Hour());          // -> 12
System.out.println(current.getMonth());      // -> MARCH
System.out.println(current.getMonthValue()); // -> 3
```
`getMonth()`メソッドは月を表す列挙型[Month](https://docs.oracle.com/javase/jp/8/docs/api/java/time/Month.html)を返します

### 日付時刻の操作
Java7まではCalendarクラスが担当していた操作はLocalDateTimeで直接扱えます
年月日時分秒ナノ秒それぞれに加算(plus)、減算(minus)したLocalDateTimeを返すメソッドが用意されています
**元のインスタンスの値は変化しません**

```
LocalDateTime current = LocalDateTime.now();     // -> 2018-03-03T12:09:50.875

LocalDateTime plusMin = current.plusMinutes(10); // -> 2018-03-03T12:19:50.875
LocalDateTime plusMonth = current.plusMonths(2); // -> 2018-05-03T12:09:50.875
LocalDateTime minusYear = current.minusYears(1); // -> 2017-03-03T12:09:50.875
```

### フォーマッタ
日付時刻のフォーマットには`DateTimeFormatter`クラスの`ofPattern`メソッドを使います

```
LocalDateTime current = LocalDateTime.now();
System.out.println(current.format(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS"))); // -> 2018/03/03 12:09:50.875
```

ISOフォーマットで定義された定数を使用することもできます

```
LocalDateTime current = LocalDateTime.now();
System.out.println(current.format(DateTimeFormatter.ISO_DATE));       // -> 2018-03-03
System.out.println(current.format(DateTimeFormatter.ISO_LOCAL_TIME)); // -> 12:09:50.875
```
WindowsでもGitLab Community Edition 10.5.3を運用したい！

<a href="https://qiita.com/nomurasan/items/a4291f5a18f3b6cc1525">WindowsでもGitlabを使いたい！</a>という記事を書いたんですが、結局使えなかったのでより欲望に忠実なタイトルに変えて書き直します。
事実上、やり直しです。

# Windows(10 pro)でGitlabを運用したいのでHyper-Vで環境を作って運用している話
**今まさに運用している話**です。
出来そうな話は卒業しました。

# Hyper-Vで環境を作る
<a href="https://qiita.com/nomurasan/items/3c58b964943a24751802">Hyper-Vで構築した環境でインターネット接続が出来るようにする</a>方法を記事に書いていますので、この辺りのをサクッとやっちゃってください。

# gitlabをインストールする
私はUbuntuでやってますので、Ubuntuで説明しますが、CentOSでもできると思います。
https://about.gitlab.com/installation/#ubuntu

この手順でやると、他でイメージをもらった時の最新版(7.9など）ではなく、きちんと最新版[^1]でした。
ただ、以下は気を付けてください。

``` Install.sh
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo EXTERNAL_URL="http://（ブラウザでアクセスするためのURL。IPでも可）" apt-get install gitlab-ce
```
変更点は、gitlab-**ee**ではなくgitlab-**ce**です。
気付かずにうっかりやらかしました。

# gitlabを起動する
インストールしただけでは起動できてないかもしれません。

```
sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
```

を実施しておくといいかもしれません。

# gitlabにログインする
7.9とは画面が異なります。
パスワードを設定するところから始めるみたいです。
ここで設定するユーザーは「root」です。
パッと見分からないので気を付けて。

# gitlab10を日本語化する
ログイン後、画面右上のアバターからSetting、
画面を開いたらPreferred languageのプルダウンを「日本語」とします。
ほとんど英語のままですが、メインで使うプロジェクトの画面では日本語になっています。

## ちょっとぐっちーな
こんな形で日本語になる前はもっと大変でした。
詳しくはgitlab 日本語あたりで眺めてほしいんですが、こういう裏側があって今のような形に落ち着いているんだなぁ、というのが見えると現状の翻訳だけでもだいぶ使いやすくなっている方です。

# gitlabからgit cloneしてみる
gitlabの使い方は省略します。githubと似たようなものなので、日本語にもなってるし何となくフィーリングで。

私はTortoiseGitで実施していますが、Git for Windowsとかでもできます。
git clone時にユーザーアカウントとパスワードを求められますが、gitlabの設定をしたものを使うとcloneできます。
URLは各プロジェクトに依存します。その辺りはgithubと同じです。
TortoiseGitユーザーはhttpを使います。

# git pushしてみる
cloneしたらpushしましょう。
そこまで確認できれば大丈夫です。

# Windowsを再起動して使えるか確認してみる
同じことをやってみます。
ここまで確認できたら運用できるレベルではないでしょうか。

# 注釈
[^1]: 執筆時点では10.5.3です。タイトルの通り。

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
仮想通貨開発にジョインしたいので調査中

色々と追加修正していきます

仮想通貨に対しては　多少斜め上から見ていますが
世界のオープンソースを助けるために作りたいプロダクトが出来たので
仮想通貨の勉強を始めたいと思います
仮想通貨の開発にもジョインしたい

そのために　色々な調査メモをここに記す
（個人的に気になってるコインしか調査しませんおすし）
トークンも入ってます


#BTC (BitCoin)
2009年1月　サトシ ナカモトの論文をもとにブロックチェーン技術を使った仮想通貨の誕生
全てがここから始まった
一時期　200万円という価格を超えたことで有名
コンセンサスアルゴリズムは PoW。ハッシュ（マシンパワー）によるコンセンサス
暗号はSHA256で、単純な暗号のためASICがすぐに作られた
ブロックサイズは1MBと小さく　ブロック生成10分のため、トランザクションが詰まる
さすがに今から開発に参加するのは難しそう
ウォレットは色々あるが　JAXX等が手軽

#LTC（LiteCoin）
2011年10月誕生
Scriptというアルゴリズムを採用
ブロックサイズ１MB、ブロック生成2.5分
Bitcoinの4倍の決済速度をもつ
JAXX等のウォレットが便利
SegWit、AtmicSwap、LightningNetwork　等、色々な機能追加が検討されている
https://litecoincore.org/

#BCH(Bitcoin Cash)
2017年8月ビットコインからハードフォークした通貨
あの時は、初のハードフォークでこのままビットコインは死ぬか？とか不安に思った
だいたいビットコインと同じだが、ブロックサイズが8MB（Max32MB）になり
トランザクションが詰まらなくなった
今後もさらなるブロックサイズ拡張のハードフォークも検討されている

#XEM(NEM)
コンセンサスアルゴリズムにPoIを搭載
これはマイニングによるマシンパワーではなく、コインの保有量や取引額、使用期間に応じて
ポイントがつき、ポイント数で決定する
また　報酬のもらえるスーパーノードになるには　大量のXEMを保有する必要がある
PoWの弱点だった電力消費を解決する
サーバクライアントの方式だったり、色々と新しい試みがなされており
勉強不足でこれ以上語れません　すみません
サーバの開発はJava
カタパルトというアップデートではC++で開発している
JavaScriptのWalletがあるので、それを利用すれば簡単にクライアントを作れる
また　日本の銀行なども、このNEMの仕組みを使って開発しているとか
投げ銭もしやすい
ともかく　将来有望と思います

#ETH(Ethream)
イーサリアム。時価総額がBitcoinに次ぐ2位
暗号化アルゴリズムは　Ethash
現在はPoWだが、のちにPoS　（コインの保有量でコンセンサスをとる）に変わる
スマートコントラクトが有名

#XSH(Shield)
Shield。
量子耐性（量子コンピュータの攻撃に耐える）をもった通貨
PoSだが、複数のマイニングアルゴリズムを使うため量子コンピュータやASICの攻撃に強い
また匿名性ももった通貨である
ブロック生成は45秒と高速
個人的に一押し通貨
XVGからハードフォークしたが、Dashに近い印象
スマートコントラクトも可能とか

#BTCP(Bitcoin Private)
2018年3月に BTCとZCLからフォークした　新しい通貨
コンセンサスアルゴリズムにPoWを採用
匿名性を重視したコイン

#MONA
国産のコイン
コンセンサスアルゴリズムはPoW
投げ銭しやすい

#VIPS(VIP Star)
⊂二二二( ^ω^)二⊃　I wanna be a VIP Star
VIP Starコイン。ETHのトークン？
調査中だお
http://seesaawiki.jp/vipstar/

#NANJ
なんJコイン。ETHのトークン？
調査中
https://nanjcoin.com/


#何を開発するか？
今のところ　MONAの開発にジョインしてみようと思ってます
ライトニングネットワークに興味を持ったので
ライトニングネットワークの動かし方やプロダクトの比較を次は調査しようと思います


MONA:  MPpuEnmqDYBCxSZyG5cBDt6UWtXczmRmkn
BTC:  13JpgsF3n6K2WhjEeUuUUqS7V71gWdFx56
BCH:  18q6rfi9ynyTgynrB8tJ2eSDLPQM32RZk5
ETH:  0x00afa2f16a062450ebedb7e3cabe79cc7801a231
NEM:   NAJOM3CD26UI3CF4LUCWLN2QJEHGFFJZ7AHLRAOQ
XSH:  SbrJFMavwAx2y6S7kLnxZLDgqrgjBYMVU4
Amazon Kinesis Data Stream用語

Amazon Kinesis Data Streamsについて

#アーキテクチャ
Producers > Amazon Kinesis Stream > Consumers > AWSサービス
https://docs.aws.amazon.com/ja_jp/streams/latest/dev/key-concepts.html

##用語
###Kinesis Data Stream

- データレコードの順序付けられたシーケンス
- ストリーム内の各レコードにはシーケンス番号が割り当てられる
- データレコードはシャードに分配される

###データレコード

- Kinesis data　streamに保存されるデータの単位
- シーケンス番号、パーティションキー、データBLOB（変更不可のバイトシーケンス）から構成
- データBLOBは最大１MB

###保存期間
- データレコードにアクセス可能な期間
- デフォルト（最短）：２４時間
- 最大：１６８時間（7日）
    - だたし追加料金がかかる
    - https://aws.amazon.com/jp/kinesis/pricing/

###プロデューサー
- レコードをAmazon Kinesis Data Streamに入れる存在
    - 例：ストリームにログを送信するWEBサーバ

###コンシューマ
- レコードをAmazon Kinesis Data Streamから取り出して処理する存在
- Amazon Kinesis Data Streams Applicationsと呼ばれる

###Amazon Kinesis Data Streams Applications
- ストリームのコンシューマで一般的には複数のEC2で実行される
    - Kinesis Client LibraryかKinesis Data Streams API を使用して開発可能
    - さまざまなAWSサービスに出力可能
        - S3
        - DynamoDB
        - Redshift
        - EMR
        - Amazon Kinesis Firehose
    - ストリームは１つでOK
- 複数のAmazon Kinesis Data Streams Applicationが同時かつ独立してストリームからデータをつかえる

###Amazon Kinesis Data Streams application 名
- アプリケーションを識別
- AWSアカウントとリージョンで一意の名前が必要
- DynamoDBでは制御テーブル名として使われる
- CloudWatchでは名前空間メトリックとして使われる

###Shard（シャード）
- ストリームは複数のシャードで構成される
- データレコードのグループ
- 各シャードが容量の１単位
    - 各シャードの読み取りについて
        - 最大 ５トランザクション/秒
        - 最大 2MB/秒
    - 各シャードの書き込みについて
        - 最大 1000レコード/秒
        - 最大 1MB/秒
- シャードの増減は可能

###パーティションキー
- データをシャード単位でグループ化するために使用される
- データレコードを複数のシャードに配分するときパーディションキーを使用する
- パーディションキーは最大256バイト超のUnicode
- MD5ハッシュ関数を使用してパーディションキーを128バイトの整数値にマッピング
- 関連づけられたデータレコードをシャードにマッピングする
- ストリームにデータを入力するアプリによって指定される

###シーケンス番号
- 各データレコードはシャード内で一意のシーケンス番号を持つ
- シーケンス番号はデータのインデックスとしては使用できない
- 一連のデータを区別するにはパーティションキーを使用するかデータセットごとに個別のストリームを作る。

###サーバサイド暗号化
- プロデューサーがストリームに入力するとき、自動的に暗号化可能
- KMSを使用する
- https://docs.aws.amazon.com/ja_jp/streams/latest/dev/server-side-encryption.html
- プロデューサー、コンシューマーアプリが暗号化されたストリームへの読み書きを行うとき
- マスターキーへのアクセス許可が必要
よく使うgitコマンド

Gitで管理を行う際によく用いるコマンドのまとめ
===

状態の管理
---

- 前回のcommitに戻す

```
$ git reset --hard
```

- 現在のstage, commit状態の確認

```
$ git status
```

branch
---

- branchの確認

```
$ git branch
```

- ブランチ構造の確認

```
$ git log --graph
```

add, commit
---

- 変更があった全てのファイルをstageに追加

```
$ git add -A
```

- コミットメッセージをつけてcommit

```
git commit -m "コミットメッセージ"
```
RaspberryPiのキーボード入力の日本語化

##環境
- Raspberry Pi 3 Model B
- raspbian_lite-2017-01-11


##RaspberryPiはデフォルトではキーボードがUS配列になっているのでJIS配列にしていきます。
###<font color=red>ネットワークに接続している必要があります。WifiかLANケーブルかでraspberry piをネットワークに接続してあげてください


####raspi-configを使っていきます。
```bash
pi@raspberrypi:~ $ sudo raspi-config
```
![raspiconfig1.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/0488de73-64f3-2f29-f998-5c5203c5411f.png)

######このような画面が出てくるはずです。
####**4 Internationalisation Options**を選択(移動はキーボードの↑↓)
####[Enter]を押して次の画面に行きます。
---
![raspiconfig2.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/21168111-d44b-8fbd-987b-8c045dda7477.png)
####先程と同じように **I3 Change Keyboard Layout**を選択し、[Enter]
---
![raspiconfig3.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/4d05b5bc-9992-af04-1a22-c41db02542e1.png)
####**Generic　105-key(Intl) PC**を選択し[Enter]
---
![raspiconfig4.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/93abefda-022a-4d28-fbfc-138656e906b0.png)
####**Other**を選択し[Enter]
---
![raspiconfig5.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/82d584bb-3d50-88a4-0d86-6a761aedca4f.png)
####**Japanese**を選択し[Enter]
---
![raspiconfig6.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/67dcb966-eaaf-d814-4b53-5d658423468a.png)
######こうなっていればOK
####**Japanese - Japanese(OADG 109A)**を選択し[Enter]
---
![raspiconfig7.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/167f8b5a-4115-edfa-d32a-3aecad3851e1.png)
####**The default for the keyboard layout**を選択し[Enter]
---
![raspiconfig8.PNG](https://qiita-image-store.s3.amazonaws.com/0/242498/c6c81653-da69-1d69-c38c-a571740ff602.png)
####**No compose key**を選択し[Enter]
---
####最初の画面に戻ってくると思うので**\<Finish\>**を選択し終了[Enter]で終了(キーボードの←→で可能)

####コマンドラインに戻ってきたらパッケージのアップデートを行います。

```bash
pi@raspberrypi:~ $ sudo apt-get update
```
######少しかかるので待ってください
####またコマンドが打てるようになったらキーボードの日本語入力をインストールします。

```bash
pi@raspberrypi:~ $ sudo apt-get install -y uim uim-anthy
```
######<font color=red>結構かかります。15分くらいかかるかも
####終わったら、1度再起動します。
```bash
pi@raspberrypi:~ $ sudo reboot
```
####再起動したらキーボードがJIS配列で打てるようになっているはずです。
RDGatewayの応答速度を早くする。

RDGatewayを使用していてリモデする際に、初回接続まで約1分半程度かかってしまう事象が発生。
※NW的には問題ないのに。

答えから書くと、「ローカルIPにはRDゲートウェイサーバを使用しない」のチェックを外すと爆速になった。
![RDGatewayセッティング.png](https://qiita-image-store.s3.amazonaws.com/0/36284/ba0b3558-4383-e66e-1720-4ea05a14cd50.png)

どうもIPから逆引きできない状況で「ローカルIPにはRDゲートウェイサーバを使用しない」
のチェックを入れていると、逆引きできずタイムアウトするまで待たされているっぽい。

誰かの参考になれば。

* RDGatwayについてとても分かりやすい記事。

https://orebibou.com/2015/02/windows%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E3%81%AE%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E6%A9%9F%E8%83%BD%E3%80%8Erd-%E3%82%B2/
C++ Builder XE4 > String > 共通するPostfix文字列を取得する > getCommonPostfixString()

```txt:動作環境
C++ Builder XE4
```

### 処理概要

- 1 倍速, 2倍速
    - >> "倍速"を返す
- 30 小人, 25 小人
    - >> "小人"を返す
- 1024 バイト, 20M バイト
    - >> "バイト"を返す

### code

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static String getCommonPostfixString(String strA, String strB)
{
	for (int idx=0; idx < strA.Length(); idx++) {
		String wrkStr = strA.SubString(idx, MAXINT); // MAXINT: 最後まで
		if (strB.Pos(wrkStr) > 0) {
			return wrkStr;
		}
	}

	return L"";
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	ShowMessage( getCommonPostfixString(L"1 倍速", L"2 倍速") );

	ShowMessage( getCommonPostfixString(L"30 小人", L"25 小人") );

	ShowMessage( getCommonPostfixString(L"1024 バイト", L"20M バイト") );
}
//---------------------------------------------------------------------------
```

### 実行例

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d99b2caf-e98b-b80e-7cb6-c550a3787739.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/04723bbc-4d42-a387-360f-e4a5f298535c.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/19d70ce4-61b7-d4b0-4405-fcaad9c5f3fb.png)

### 用途

TComboBoxのItemsで定義した文字列のうち、単位だけを取り除きたい。

単位はgetCommonPostfixString()で取得する。

このようなソフト実装にしておくと、フォーム上のデザイン(TComboBoxのItemsの定義)を変更した後でもソフトが壊れない。

デザインの変更とコードの変更、両方を行わないといけない状況の回避案。
(修正箇所が増えると失敗し、デバッグ時間が長くなる）。

### まじめな実装 (共通文字列の取得)

共通文字列の取得のまじめな実装をするとしたら、下記のリンクのリンク先にあるDelphiコードをC++ Builder用に実装しなおせばよいだろう。

- [link > algorithm > string difference > Longest common subsequence (LCS) problem > Delphi実装](https://qiita.com/7of9/items/055e0fb0967b04d78afc)

やる気がでない7of9。
Hyper-Vで構築した環境でインターネット接続が出来るようにする

ここまでネットワーク設定で苦労するとは思いませんでした、本当に（ごあいさつ）

# Hyper-Vで構築した環境にインターネット接続を試みる
試行錯誤の備忘録を残しておきます。

## 結論
仮想スイッチを外部にする

# 手順
## OSイメージをダウンロードする。
この後やりたい事があるので、Ubuntu16.04 LTSかCentOS7にしました。
Ubuntuはいいんですが、CentOS7はダウンロード先によってはものすごく時間が掛かるので、ダウンロードリンクを見極めることをおすすめします。

<a href="https://www.centos.org/download/">CentOS</a>
<a href="https://www.ubuntu.com">Ubuntu</a>

慣れるまではかなり困惑するのでGUI使えるUbuntuがいいかもしれません。
ネットワークドライバがあればとりあえずは出来るので、どれでも大丈夫です。

## Hyper-Vをインストールする。
コントロールパネルから「プログラムの追加と削除」でHyper-Vがあるので、これにチェックを入れます。
再起動を求められるかも知れませんが、先の作業でダウンロードが完了していなければ待ちましょう。

## Hyper-Vの仮想スイッチマネージャーを設定する
Hyper-V マネージャーを起動します。
画面を起動したら[操作]→[仮想スイッチマネージャー]を実行します。
ポップアップウィザードが起動したら、「外部」を選択して仮想スイッチを作成します。
外部ネットワークをホストで使っている物理ネットワークに設定して「管理オペレーティングシステムにこのネットワークアダプターの共有を許可する」に**チェックを入れます**。
これをやらないとホスト側が弾かれます。
他はさわらなくていいので、これでOKします。

### ちょっと解説
ホスト側のネットワークアダプターを右クリック→プロパティでポップアップを出した後、共有タブを開くと似たような項目がありますが、ここで設定しているものが↑項目です。
競合しているので奪い合いになるのかな？　細かいのは分からないのですが、設定の意味というか意図はこれです。

## 仮想マシンを作る
普通に設定します。
ネットワークの構成は先ほど作成した外部ネットワーク用の仮想スイッチに接続するようにします。

# 失敗談
色々なところを参考にさせてもらったんですが、私の環境ではうまくい
きませんでした…

## 事象
仮想スイッチを内部にしてブリッジにすると、ホスト(Windows10)で接続できず、Hyper-V側(Ubuntu16)でつなげるようになる

## 手順
上記「Hyper-Vの仮想スイッチマネージャーを設定する」項目で外部ではなく内部にするのと、
ホスト側のネットワークアダプターの設定で、ホスト側で使っているネットワークアダプターと作成した内部仮想スイッチをブリッジ接続します。

そうすると、ネットワークブリッジ接続という項目が作成されるのですが、これではなぜか事象のような状態になり、ホストから外につなげなくなりました。

色々なページを見ていると、こちらの手順を書いているのでおや？となりました。
なので、私のケースのような事もあるかも知れないので、記事に書き残してます。

# 参考
本当に多くのサイトが内部での手順が書いてありましたが、以下が非常に分かりやすかったです。
https://www.gmo.jp/report/single/?art_id=212

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
vmstatやらiostatに時刻を付与する

サーバの負荷分析にはsarがよく使われる。
sarはCPU、I/O、NW、スワップ状況など色々確認できる便利ツールだが、
最短で1分おきにしかデータがとれない。
秒単位で細かく負荷分析したい場合は、vmstat、iostatがオススメ。

ただし、vmstat、iostatは実行時刻が表示されないので、
そのままだとログとして保存しておいても全く役に立たない。

* デフォルト

```
math [root@kouno koizumi_ta]# vmstat 1 10 > vmstat.log
 [root@kouno koizumi_ta]# cat vmstat.log
 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0 250864 143816  32008 173740    1    1    10    45    7    1  4  2 91  2  0
 0  0 250864 143808  32008 173744    0    0     4     8  323  649  1  1 99  0  0
 0  0 250864 143808  32008 173744    0    0     0     0  283  628  1  1 99  0  0
 0  0 250864 143808  32008 173744    0    0     0     4  302  696  1  1 99  0  0
 0  0 250864 143808  32016 173740    0    0     0    28  307  706  1  0 99  0  0
 0  0 250864 143808  32016 173744    0    0     0     0  269  601  1  1 99  0  0
 0  0 250864 143808  32016 173744    0    0     0     0  261  601  0  1 99  0  0
 0  0 250864 143808  32016 173744    0    0     0     0  285  630  1  1 99  0  0
 0  0 250864 143816  32024 173744    0    0     0   500  388  785  1  1 89 10  0
 0  0 250864 143816  32024 173744    0    0     0     0  254  580  1  1 99  0  0
[root@kouno koizumi_ta]#
```


リアルタイムで調査する場合はこれでいいけど、後追い調査には全く向かない。

そこで、awk使用して時刻を付与する。

``` 
vmstat <実行間隔> <実行回数> |awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' > vmstat.log
```


するとこんな感じに。

* awkで時刻を付与した場合

```
[root@kouno koizumi_ta]# vmstat 1 10 |awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' > vmstat.log
[root@kouno koizumi_ta]# cat vmstat.log
2014-02-20 20:50:13 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
2014-02-20 20:50:13  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2014-02-20 20:50:13  2  0 253676 144564  33124 174396    1    1    10    45    7    1  4  2 91  2  0
2014-02-20 20:50:14  0  0 253676 144520  33124 174396    0    0     0     0  329  702  1  1 98  0  0
2014-02-20 20:50:15  0  0 253676 144520  33124 174396    0    0     0     0  279  634  1  0 99  0  0
2014-02-20 20:50:16  0  0 253676 144520  33124 174396    0    0     0     4  328  729  1  1 99  0  0
2014-02-20 20:50:17  0  0 253676 144520  33124 174396    0    0     0     0  280  643  1  1 99  0  0
2014-02-20 20:50:18  0  0 253676 144520  33132 174388    0    0     0   464  362  707  1  1 74 25  0
2014-02-20 20:50:19  0  0 253676 144492  33132 174396    0    0     0     0  358  701  1  1 98  0  0
2014-02-20 20:50:20  0  0 253676 144468  33132 174396    0    0     0     0  295  624  1  1 99  0  0
2014-02-20 20:50:21  0  0 253676 144468  33132 174396    0    0     4     8  313  652  1  1 99  0  0
2014-02-20 20:50:22  0  0 253676 144468  33132 174400    0    0     0     0  299  644  1  0 99  0  0
[root@kouno koizumi_ta]# 
```

これをcronで仕込んでおくと、後追い調査でも負荷状況が詳細に確認できる。

```
0 0 * * * /usr/bin/vmstat 1 86340 |awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}' >> vmstat.log_$(date '+%Y%m%d')
```
こんな感じで。
Rails Js 発火しない

#あれ...... qestion.jsというファイルが発火しない.....
謎な点
application.jsではaleart();など発火するにも関わらずquestion.jsだと発火しない


 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/236412/9c84b6a1-9d71-fc99-0ba4-bef2b957586b.png)


#原因
question.coffeeというcoffeescriptがcontrollerを作った時に作られており、おそらくquestion.coffeeeがquestion.jsとしてコンパイルされquestion.jsが２つあることになり、エラーが起きたのだと思う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/236412/f17817b7-b1ff-c465-6d47-8dfef3d3867b.png)
アプリ開発用に必要サイズの画像を生成するウェブサービスを作ってみた

#はじめに
iOS/macOSのアプリ開発中、アイコンの設定をするときに様々なサイズごとの画像ファイルが必要となり、これを用意するのが毎回面倒でした。そこで、オリジナルの画像ファイルを投げるだけで必要サイズの画像ファイルを生成してパッケージングしてくれるものを作ろうと思い至りました。
macOS向けのネイティブアプリにしてもよかったのですが、OSに関わらず使えた方が便利だろうということで、ウェブアプリを作ることにしました。結果的に自分が今まで逃げてきたサーバーサイドの勉強も一緒にできました。

#使った言語/技術/環境
- Javascript
- shell script
- ImageMagick
- node.js
- forever.js
- AWS EC2

#成果物
できたウェブサービスがこちら->[ImageConverter](http://imageconverter.pictures)

<img width="365" alt="トップ画像.png" src="https://qiita-image-store.s3.amazonaws.com/0/67153/85c945cf-9fc8-749d-8578-8b4363f6c0d3.png">

##使い方
- プルダウンメニューで画像ファイルを選択するか、画像ファイルをそのまま破線の内部にドラッグ&ドロップして元ファイルを指定
- プルダウンメニューで出力形式を選択
- 変換を押して待つとZIPファイルがダウンロードされる
- ZIPファイルを解凍すると必要な画像ファイルが入手できる

##仕様
- 対応している入力画像ファイル形式はPNGかJPEG（出力されるのはPNG）
- AWSの無料枠なのでどのくらい負荷に耐えられるのかは不明

##出力形式
- iOS: icon -> iPhoneとiPadアプリのアイコンに必要な画像ファイルセット
- iOS: icon corner radius -> 1024px×1024pxの角丸画像
- iOS: universal -> iOSプラットフォームに関わらない1倍、2倍、3倍サイズの画像ファイルセット（ベースになるのは3倍）
- watchOS: icon -> Apple Watchアプリのアイコンに必要な画像ファイルセット
- macOS: icon -> Macアプリのアイコンに必要な画像ファイルセット
- Android: icon -> Androidアプリのアイコンに必要な画像ファイルセット

#終わりに
真剣にリリースを考える場合は、ただ縮小しただけの画像をアイコンにするのはよくないと思われるので、とりあえず一式画像を揃えたいという場合に使えると思います。
ウェブサービス開発の勉強作品といった感じなので、お手柔らかな評価と利用をお願いしたいです。
zk-snarkについて

##概要
zk-snarksがethreumに実装された。zk-snarksはゼロ知識証明という暗号理論を利用しており計算の正当性をその計算を実行することなしに検証することができる。またその計算についてそれが正しく実行されたということ以外何も知ることはできない。
以下の4つの点がzk-snarksを理解するために重要である。

##多項式問題として定式化

検査されるプログラムはt(x) h(x) = w(x) v(x)にコンパイルされる。プログラムが正しく計算される場合にのみ等価となる。

##ランダムサンプリングによる簡潔さ

検証者は問題を多項式の乗算と多項式関数の等価性から単純な乗算と等価性のチェックに削減するために秘密の評価点ｓを選択する。
 つまりt(s)h(s) = w(s)v(s)の等価性をチェックする。

##同型符号化、暗号化

準同型の性質を有する符号化・暗号化関数Eを使用する。これによって証明者がsを知ることなくE(t(s)), E(h(s)), E(w(s)), E(v(s)) を計算できるようになる(E(s)のみ知っている)。

##ゼロ知識

検証者が実際の符号化された値を知ることなく正しさを確認できるように証明者はE(t(s)), E(h(s)), E(w(s)), E(v(s))に数をかけることで変更する。 t(s)h(s) = w(s)v(s)を検証するのと t(s)h(s)k = w(s)v(s)kを検証するのは等価である。

##参考
https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/
Bluetooth の勉強

勉強しながらのメモ代わり

# Bluetoothとは
[Google検索: Bluetooth](https://www.google.co.jp/search?q=bluetooth)

近距離無線通信規格の1つ。従来の有線接続(USBやLANケーブルなど)を無線化することを目的として始まった規格。v4.0以降2つの無線方式(BR/EDR, LE)が存在する。

# BR/EDRとLE
どちらも2.4GHzを使うが、変調方式やチャネル数など異なるため、物理的な互換性はない。

* Basic Rate/Enhanced Data Rate (BR/EDR)
    * Basic Rate (BR): v1.0からの無線方式。2.4GHzの帯域を1MHz間隔、79のチャネルに分割し、0.625msec毎に周波数を変更して通信する。変調方式はGFSK。転送速度は約1Mbps。
    * Enhanced Data Rate (EDR): v2.0+EDRで追加された無線方式。基本的にはBRと同じ周波数チャネルを使用するが、変調方式をπ/4DQPSK、8DPSに変更して高速化を実現。転送速度は約3Mbps。
* Low Energy (LE)
    * v4.0で追加された無線方式。その名の通り、省電力を意識している。BR/EDRと異なり、2.4GHzの帯域を2MHz間隔に分割して使用する。変調方式はGFSK。転送速度は1MBps。v5.0で2Mbpsと、1Mbps転送に誤り訂正を加えることで125Kbpsと500Kbpsのモードが追加。


# Bluetoothスペック
[Bluetooth スペック (v4.2対応版)](https://qiita.com/n_note/items/c54344a78c4c2863ace2)


# Bluetoothのセキュリティ
[Bluetoothのセキュリティ](https://qiita.com/n_note/items/3b3089ac1c368f9ea0d3)に移動

# 用語集
| 用語 | 説明 |
|---|---|
| Basic Rate/Enchanced Data Rate (BR/EDR) | v4.0より前から存在する方式のBluetooth無線。通称はBluetooth Classic。|
| Low Energy (LE) | v4.0に追加された省電力方式のBluetooth無線のこと。 |
| ACL | Bluetooth無線通信のうち、通常のデータ転送に使用するリンク。 |
| SCO | Bluetooth無線通信のうち、主にHFPの音声転送に使用するリンク。 |
| Master (Device) | 基本的にはACLを**接続した側**のBTデバイス。BR/EDRの場合はACL接続後、ロールチェンジによってMasterとSlaveが逆転する場合がある。LEの場合はロールチェンジは発生しない。 |
| Slave (Device) | 基本的にはACLを**接続される側**のBTデバイス。 |

# メモ
* Basic Rate (BR)
    * 1.0から存在するBluetooth無線
    * 転送速度は1Mbps
* Enhanced Data Rate (EDR)
    * 2.0+EDRから登場
    * 転送速度は3Mbps
    * スペック上、BRとEDRをまとめてBR/EDRという
    * 一般的にはBluetooth Classicなどとも
    * 4.0以降のバージョンでもBR/EDRは存在する
    * BT5以降、BR/EDRはなかったことになりかけてる
* Low Energy (LE)
    * 4.0から登場したBluetooh無線
    * 転送速度は1Mbps
    * 5.0では2Mbpsモードが追加
    * BR/EDRとの物理的な互換性はない

> note
> Bluetooth 4.0 以降の場合、BR/EDR のみ対応している機器、LE のみに対応している機器、
> BR/EDR と LE の両方に対応している機器が存在する。 

> note 2
> BT5 では「転送速度2倍！」を売りにしているが、実際に早くなったのは LE のみ。
> BR/EDR が早くなったわけじゃないので、例えば BT5 対応の BTオーディオ 機器が
> BR/EDR の A2DP を使っている場合、4.x 以前の帯域より広くなってより高音質に
> なっているわけじゃない。
gitおぼえがき

まだちょっとしか使ったことがない初心者です

## 既にサーバにあるものをそのまま新しいGitリポジトリに入れる

リモートリポジトリにBitbucketを使っている。
既にリポジトリはBitbucket側で作った直後で空っぽの状態。
ssh接続に必要な鍵ペアなどの設定が済んでいる前提。

```bash
$ git init
$ git add .
$ git commit -m "first commit" # 適当にコメントつけておく
$ git remote add 短い別名 git@bitbucket.org:ユーザー名/リポジトリ名.git
$ git push -u 短い別名 master:master
```
-uをつけると今後のpush先デフォルトになるっぽい。
リポジトリに入れたくない余計なファイルがある場合は、commit前に

``` bash
$ git status
```

で確認しておいて、リポジトリには入れたくないファイルを

``` bash
$ git rm --cached ファイル名 …
```

でアンステージしておく。再度git statusで確認してからcommitする。
予め、今後ずっといれたくないファイル名を.gitignore に記述しておく方法もある。
あとから.gitignoreした場合でもステージに残っているので、消さないといけない。
誤って--cachedをつけ忘れると作業中のファイル実体も削除されてしまうので要注意！

## リモートリポジトリからサーバに展開する

設置予定の親ディレクトリで作業開始する

```bash
$ git clone git@bitbucket.org:ユーザー名/リポジトリ名.git
$ cd リポジトリ名
$ git remote rename origin 短い別名
$ cd ..
$ mv リポジトリ名 ディレクトリ名
```
cloneしたての状態だと、デフォルトではリポジトリ名と同名のディレクトリを新規作成して放り込まれ、短い別名には一律「origin」がついてしまうっぽい。
短い別名についてはclone実行の際に-oオプションで指定しても良いらしい。
ディレクトリ名を変えたい場合は上記のように後からリネームするか、予め任意の名称でディレクトリを作っておいて、clone実行の際にリポジトリ名.gitの後ろにそのディレクトリ名を指定することでその中にcloneされる。

## 今いる場所のgitリポジトリの短い別名を調べる

```bash
$ git remote -vv
```
サブディレクトリが違うgitリポジトリに属している場合やユーザーごとにリモートリポジトリへのアクセスURLが違う場合など、これで確認しておく。

## リポジトリと異なるファイルを炙り出す

```bash
$ git fetch
$ git status
```
リポジトリにない、リポジトリにはあるがこちらにない、両方にあるが内容が異なる、といったファイルはこれで調べられる。
具体的にどう違うか？はローカルリポジトリとの比較になってしまうがgit diffで調べられる。

まだまだわけがわかりません、もっと使っていかなくては。
AndroidタブレットPCをVNCクライアントにして遊ぶ


# はじめに

AndroidタブレットPCで、LinuxのVNCサーバーに接続する方法についてです。

・タブレットPC -> KPD7BV4-NB
 (アキバで7,000円くらいで買ったKEIANさんのタブレット, Android6.0)
・VNCサーバー -> お名前.comさんで借りているものを利用。
(ArchLinux, IPアドレス123.456.789.101, port 590X)にて待機。
(!!今回はSSH経由でVNC接続するので、SSHのポートが空いていれば良い。サーバー側のポート590Xはオープンしなくてもよい方法です。)

![image1.JPG](https://qiita-image-store.s3.amazonaws.com/0/171582/f164b86f-a20e-4b08-1656-59ad8e30d371.jpeg)
bluetoothキーボードで操作。

## I. 準備
タブレットPCにアプリ(termux, vncviewer)を入れる。
VNCサーバーをポート590Xで立ち上げておく。

## II. termuxを起動する。

テキストエディタとopensshを入れておく。

```
$ pkg install vim openssh
```

~/.ssh/configに以下を記述。

```
Host onamae # お好きな名前
Hostname 123.456.789.101 # サーバーのIPアドレス
User onamae-user # サーバーのユーザー
Port 12345 # SSH接続のポート(Default: 22)
#IdentityFile ~/.ssh/id_rsa_onamae # 鍵必要な場合は、設定してコメント外す。
```

ポートフォーワーディングしてSSH接続する。

```
ssh -L YYYY:localhost:590X onamae
```

接続できたらtermuxをバックグラウンドに置いておく。

## III. vncviewerを起動する。

僕がインストールしたアプリはこちら。
![app_vnc.png](https://qiita-image-store.s3.amazonaws.com/0/171582/34a3b7f3-2a65-7c62-bb10-a5247a5d060d.png)

localhostのYYYYポートに設定。
![Screenshot_20180308-190333.png](https://qiita-image-store.s3.amazonaws.com/0/171582/018b0550-78d1-5392-97b0-28fe242f1e7c.png)


## IV. できあがり
背景が灰色なのは、おそらくサーバー側の設定の問題です。
![Screenshot_20180308-190525.png](https://qiita-image-store.s3.amazonaws.com/0/171582/b0ac3f89-7565-77c5-f3e6-ce47e87e024f.png)


### 最後に
Linuxサーバーで急に止む無くグラフィカルな作業したくなった際に便利です。
これから学ぶ言語についてのまとめ

#はじめに
これからプログラミングの勉強を始めるにあたり、まず学ぶ言語の大枠を知るために調べたことを下記にまとめました。
（間違いがありましたらご指摘頂けますと幸いです。）

##HTML
*エイチ・ティー・エム・エル、Hyper Text Markup Language*

- WEBページを作成するために開発されたマークアップ言語のひとつ（プログラミング言語ではない）
- 現在インターネット上で公開されているWEBページのほとんどがこの言語で作成されている
- Hyper Text＝ハイパーリンク（他の文書への参照情報）や画像などのマルチメディアを埋め込むことができる高機能なテキスト
- Markup ＝見出しや段落など、文書の各部分がどのような役割を持っているのかを示すということ
- この言語によって書かれた文章をブラウザが解釈し、WEBページを表示させている
- 「HTML」「XHTML」「HTML5」などいくつかバージョンが存在し、各バージョンによって使用できるタグが異なる

##CSS
*カスケーディング・スタイル・シート、Cascading Style Sheets*

- WEBページのスタイルを指定するためのスタイルシート言語（プログラミング言語ではない）
- 基本的には前述のHTMLのようなマークアップ言語と組み合わせて使用する
- HTMLが文書の役割や構造を定義（＝マークアップ）するのに対して、CSSはそれらをどのように装飾するのか（＝スタイル）を指定する
- スタイルはデザインやレイアウトなどの見た目に関するものから、音声による読み上げや印刷時の設定など様々である
- バージョンは「CSS1～3」まで存在するが、各バージョンの後ろの番号がレベルを表しており、レベルが上がるごとに表現できるスタイルが増える

##javascript（JS）
*ジャバスクリプト*

- WEBサイトやWEBアプリ・サービスなどを開発するために広く使用されているプログラミング言語
- スクリプト言語なため、ソースコードをコンピュータの理解出来る言葉に変換する作業であるコンパイルが必要なく、そのまま実行できる簡便な性質をもっている
- 主に動的なWEBサイトの構築やリッチインターネットアプリケーションの開発に用いられる
- WEBブラウザ上（＝クライアントサイド）で動作するのでサーバーに負担をかけることなくスクリプトが実行できる
- なお、名前は似ているがプログラミング言語のJAVAとは異なるものである

##Ruby
*ルビー*

- 1993年にまつもとゆきひろ氏（通称 Matz）によって開発されたプログラミング言語
- すべてのデータがオブジェクトとして表現されているオブジェクト指向のスクリプト言語である
- 主にWEBアプリ開発、スマホアプリ（API）開発などに使われている
- 他の言語と比べてコードを短く簡潔に書くことが出来るので、読みやすく開発スピードも速い
- 柔軟な言語であり、ユーザーが自由に言語の一部分を変更することが出来る
- 高い可搬性で多くのOSで動作する
- フリーソフトウェアであり無料で使え、かつコピー・変更・再配布が自由である

##Ruby on Rails
*ルビーオンレイルズ*

- Ruby言語を使ったWebアプリケーション開発のためのフレームワーク（※）
  - ※開発において、雛形を予め備え効率化するための仕組みのこと
- 「同じことを繰り返さない」、「設定より規約」といった思想のもとに開発されたフレームワーク
- MVCアーキテクチャという設計法に基づいて、Model・View・Controllerに分けて開発を行うことで、効率良く生産性の高い開発が出来る
- フレームワーク＝枠組み、なのでRuby on Rails単体でアプリケーションの開発は出来ない。HTML、CSS、Rubyなどの言語と組み合わせて使用する

##おまけ
言語について調べている時に気になった違いがあったのでついでにまとめました
###1.スクリプト言語とコンパイラ言語

- 前提として
  - プログラムは人間が書いた命令文をコンピュータが解釈して実行することで動いている
  - 解釈させるには命令文を機械語に翻訳する必要がある
  - 翻訳の方法は2種類あり、その方法によって「スクリプト言語」と「コンパイラ言語」に分かれる

####スクリプト言語
ソースコードを逐一翻訳しながら実行する（JavaScript、Ruby、PHP、Python、Perlなど）

- 実行速度はコンパイラ言語に劣るが、ソースコードを書き換えればすぐに結果が反映されるので手軽に扱える

####コンパイラ言語
ソースコードを事前にコンパイルして翻訳しておく（Java、C、C++、C#など）

- 事前に効率よく処理できる機械語に翻訳することによって、高速で動く
- コンパイルの際にエラーチェックも出来る

###2.フレームワークとライブラリ

- 全体を制御するコード（プログラムの流れの主動）がどちらなのかで分かれる
  - フレームワーク＝フレームワーク側が全体をを制御するコードで、そこから個別に機能を呼び出して使う（仕組みを提供）
  - ライブラリ＝開発者側が全体を制御するコードを記述し、ライブラリの提供する個別の機能を呼び出して使う（機能を提供）

####フレームワーク
（Ruby on Rails、CakePHP、Bootstrap、Angular.jsなど）

- Ruby on Railsの項目で前述したが、開発において、雛形を予め備え効率化するための仕組みのことを指す
- 良く必要とされる汎用的な機能をまとめてルール化し、そのルール（枠組み）に沿って機能を追加したり拡張したりすることが出来る

コードの書き方がルールによって統一されているので、複数人で作業する場合でもコードに個人差が出にくい
カスタマイズに限界があり、枠組みから外れたことをしようとするとかえって不便となる場合がある


####ライブラリ
（jQuery、React、標準Cライブラリなど）

- 様々な機能を他のプログラムから呼び出して利用できるようにパッケージ化した部品のようなもの
- ライブラリ単体では起動せず、他の実行ファイルに連結し必要な部品を組み合わせて利用する

自分で作ってまとめたものもライブラリであるし、他人（個人）や企業などが作成して配布しているものもある
新社会人に向けての、VBA管理

# 概要
EXCELでマクロ書いてもGit使えなくて困るね。そんな時は、コード出力するしかない。


# 必要なもの
- src/vbac.wsf ※[DL](https://github.com/vbaidiot/Ariawase/releases)
- src/src.bat ※下参照

```src.bat
cscript //nologo vbac.wsf decombine /binary:"%~dp0\.." /source:"%~dp0"
echo off
for /r %%i in (*.frm) do type "%%i" > "%%i.txt"
for /r %%i in (*.frm) do type "%%i.txt" > "%%i"
for /r %%i in (*.frm) do del "%%i.txt"
for /d %%i in (*) do rmdir "%%i"
```

# 使い方
1. `なんとか.xlsm`があるフォルダに`src/`をコピーする。
2. `src/src.bat`を実行する。
3. ソースが出力される。

# ちょっとした解説
`*.frm`だと、バイナリ形式に認識される為、`sjis`に変換しています。`utf-8`にしたかったけれどできなかったので、あきらめます。
インポートはしません。ついでに空フォルダも削除する。

設定を楽にするため、`src`を貼り付けるだけでできるようにしました。

# 参考
vbac.wsfの作者の説明ページ
http://igeta-diary.blogspot.jp/2014/03/what-is-vbac.html

vbacを使ってExcel VBAのソースコードを保守しやすくしよう
https://qiita.com/matarillo/items/db205a8781ff530a48c8
のんびりはじめるWordPress_概要 :0日目

#はじめに
この記事は、久しぶりにWordPressを使ってきちんと自分のサイトを作りたくなった、先日phpの研修を受けたばかりの新人Webプログラマが書く、備忘録的なアレソレです。

この記事のタイトル決めるのに30分くらい要しました。
"ゆる～く"色々書いていこうと思っているので、どうか"ゆる～く"お付き合いください。

##自己紹介
小学校のときにオタクを拗らせ、高校くらいまで個人サイトを運営していた事もあり、大学は情報系のところに進学。
詳細は省きますが、途中で恋愛に突っ走ったため、培った知識はほとんどゼロに。
ただ、パソコンを使ったものづくりが好きというところだけは変わらなかったため、そのままIT系の企業に就職したものの、色々あって一旦退職。
しばらくのんびりしてましたが、やっぱりIT好きだなーとなったので、改めて転職して現在に至ります。

学生時代はDTP関係のアルバイトをしていました。
なので、Photoshop、Illustratorなんかのこともちょこっとだけわかります。
ここら辺のスキルを忘れない程度に使いつつ、お仕事にも役立ちそうなあたりで、「息抜き程度になんかものづくりしたり、発信したりしたいよね」という友人との話から、WordPressを使ってみようと思いました。なんかえらそうに書きましたが、仕事に役立つ云々は後付けの理由です。

友人は全くIT系に弱いので、友人に教えるために考えをまとめるのが、このシリーズ？？？の大きな目的かもしれません。

#目標
そもそも論で、WEBって何？インターネットって？PCって？ってところがようわかっとらん気がするので、そこら辺も学びつつ（纏めるとは言っていない）、HTML5やCSS3なども勉強しながら、WordPressのカスタムテーマを作成していきます。
もう作っちゃったけど、ロゴ作るときに考えたり使ったアレソレもざっくりまとめようとは思ってます。

#環境
+OS: Windows 10 Home 64bit
（基本的にこいつで操作するつもり）
+エディタ: 例の恋に落ちるエディタ
+白いぬこ

#おわりに
腰が痛いです。
正規表現と組み合わせて使うと便利なメソッド

・備忘録として。
・RubyのStringクラスのインスタンスメソッド。
・いずれのメソッドも引数に文字列、または正規表現オブジェクトを受け取ることができる。
## scan(pattern)
  
・引数に正規表現を渡して、マッチした部分を「配列」にして返す
### Example
```rb
text = "my name is toshiki"
p text.scan(/t.+/)
=> ["toshiki"]
```
・正規表現にマッチした部分を、Rubyのコンソールなどでサクッと確認したい時に利用するといいと思う。
・ちゃんと確認したい時は、http://rubular.com などのサイトを利用するのが良い。

## slice(pattern)

・引数に正規表現を渡して、マッチした部分を「文字列」にして返す

### Example
```rb
text = "my name is toshiki"
p text.slice(/t.+/)
=> "toshiki"
```  
・scanとの違いは、返り値が「文字列」なのか、「配列」なのかの違い。

## gsub(pattern,replacemant)

・第一引数に正規表現を渡す。
・正規表現にマッチした文字列を、第二引数の文字列に置換する。
・返り値は「文字列」

### Example
```rb
text = "my name is toshiki"
p text.gsub(/t.+/,"kikuchi")
=> "my name is kikuchi"
```
 
・キャプチャ機能`()`を使用すると、`\1\2`の連番で参照可能。
・第二引数に`\1\2`などを渡すことで、第一引数でキャプチャした文字列を参照することができる。

### Example
```rb
text = "my name is toshiki"
p text.gsub(/(t.+)/,'\1 kikuchi')
=> "my name is toshiki kikuchi"
```
  
・ちなみに`gsub`は`global substitute`の略。
オフラインリアルタイムどう書く F10 の問題

問題はこちら->http://nabetani.sakura.ne.jp/hena/ordf10updown/
偶数ｎの二乗数が上辺に、奇数ｎの二乗数が左辺に並び、その反対側がn^2-2(n-1),
対角線上がn^2-n+1となることを利用して計算しました。

```prolog
ntop(N,X,Y):-
    sqrt(N,T),floor(T,T0),(T0^2=:=N->T1=T0;T1 is T0+1),
    (T1 mod 2 =:=0->even(N,T1,X,Y);odd(N,T1,X,Y)).

even(N,B,X,Y):-N=:=B^2-B+1,!,X=B,Y=B,!.
even(N,B,X,Y):-!,N<B^2-B+1->(X is B*2+N-B^2-1,Y=B);(X=B,Y is B^2-N+1).
odd(N,B,X,Y):-even(N,B,Y,X).

pton(X,Y,N):-X>Y,!,(X mod 2=:=0->N is X^2-Y+1;N is Y-2*X+X^2+1).
pton(X,Y,N):-Y mod 2=:=0->N is X-2*Y+Y^2+1;N is Y^2-X+1.

calc(_,_,[],[]).
calc(X,Y,[[X1,Y1]|T],L):-
    calc(X,Y,T,L1),X2 is X+X1,Y2 is Y+Y1,((X2>0,Y2>0)->pton(X2,Y2,N);N=0),L=[N|L1].

conv([],[]).
conv([H|T],[X|R]):-conv(T,R),(H='0'->X='-';X=H).

myatomic_number(X,Y):-atom_number(Y,X).
myatomic_chars(X,Y):-atomic_chars(Y,X).

solve(N,RL):-CL=[[0,-1],[0,1],[-1,0],[1,0]],ntop(N,X,Y),calc(X,Y,CL,RL).

start:-str(S),split_string(S,"\s,\n","\s",L),pre(L),!.

pre([]):-!.
pre([A,B,C,D,E,F|T]):-atom_number(B,B1),solve(B1,L),maplist(myatomic_number,L,L1),
    conv(L1,R1),maplist(atom_chars,R1,R), maplist(atom_chars,[C,D,E,F],K),
    (R==K->Str=" pass";Str=" fail"),write(Str),write(" "),writeln(R1),pre(T).

%start.


str("0  10      9,25,-,11
1       1       -,2,-,4
2       2       1,9,-,3
3       4       -,3,1,5
4       26      25,49,-,27
5       43      42,56,44,58
6       72      71,73,57,93
7       82      81,121,-,83
8       91      92,112,90,110
9       100     -,99,65,101
10      122     121,169,-,123
11      141     142,140,104,148
12      145     -,146,144,196
13      320     321,319,261,329
14      504     503,505,465,557
15      563     564,562,498,590
16      906     905,907,895,1019
17      1047    1046,1048,1002,1134
18      1111    1068,1204,1110,1112
19      1338    1257,1401,1339,1337
20      1613    1612,1614,1588,1752
21      1845    1686,1854,1846,1844
22      1921    1922,1920,1780,1952
23      2517    2516,2518,2484,2688
24      2670    2671,2669,2535,2739
25      2798    2613,2821,2799,2797
26      2841    2778,2994,2840,2842
27      2896    2897,2895,2725,2937
28      3050    3001,3225,3049,3051
29      3354    3355,3353,3147,3375
30      3563    3564,3562,3402,3638
31      4454    4261,4525,4455,4453
32      5397    5262,5558,5396,5398
33      5592    5363,5659,5593,5591
34      6122    6121,6123,6047,6363
35      6772    6771,6773,6677,7009").
```
Selenium WebdriverでBasic認証なサイトにアクセスする方法

http://elementalselenium.com/tips/13-work-with-basic-auth
に書いてあった。


```
@driver.get 'http://admin:admin@the-internet.herokuapp.com/basic_auth'
```
の様にドメインの前に**[ID]:[Password]@**をつければいい。
大学生が作ったAlexaのスキルがAmazon様に受け入れるまでの過程（申請第１回目）

# この記事の背景
意外と、ポリシーなどに厳しいAmazon様。
以前、「コール君」というアレクサがコールをしてくれるスキルを作って申請したところ、「お酒を助長しているからダメだ」と、コンセプトから否定され諦めた経験があります。
そんな、僕が送る、第２回目のスキル申請ドキュメントをお送りします。
どんな申請方法をとり、なんて指摘されたかを書いていきます。

# どんなスキル？
いたって、シンプルでアレクサでSNSに投稿できるようにしたもの。
その、SNS自体は自作しておりweb上で見ることができます。
(http://smaspi-world-sns.online/)

# 申請内容

## スキル情報

* スキル名：スマスピの世界
* 呼び出し名：すますぴのせかい

## インテントスキーマ

```json
{
  "intents": [
    {
      "slots": [
        {
          "name": "tweet",
          "type": "tweet"
        }
      ],
      "intent": "TweetIntent"
    },
    {
      "intent": "AMAZON.HelpIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    },
    {
      "intent": "AMAZON.CancelIntent"
    }
  ]
}
```

## カスタムスロットタイプ

<img width="809" alt="スクリーンショット 2018-03-08 0.41.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/195882/be8ae192-8dbd-053e-779b-2eb2ad32e334.png">

## サンプル発話
```
TweetIntent {tweet}
```

## エンドポイント
lambda
コードはgithubにあげています。
node.jsとかシーらんぺったんゴリラなのであんまり参考にしないでね。
[GitHub - imajoriri/Smaspi_SNS_record: スマートスピーカーで投稿できるSNSをAmazon様に申請してみた記録。](https://github.com/imajoriri/Smaspi_SNS_record)

## 公開情報

* カテゴリー：Social
* サブカテゴリー：Social Networking
* テストの手順

```
「アレクサ、スマスピの世界を開いて」と言われたらツイートの発話を促されるので、適当な言葉を発話する。
例えば、「今日の晩御飯美味しかった」などというと「今日の晩御飯美味しかった。ですね。投稿しました。」と帰ってくる
その後、公式ホームページで投稿した内容確認できる
```
* スキルの簡単な説明

```
スマートスピーカーの世界に参加することができます。
```
* スキルの詳細の説明

```
このスキルを使うことで、スマートスピーカーの代わりに呟くことができます。

みんなで、協力してスマートスピーカーのネット世界を完成させてください。

投稿した内容は以下のURLで確認できます。

http://smaspi-world-sns.online/
```
* サンプルフレーズ

```
アレクサ、スマスピの世界を開いて、今日の夜飯美味しかった。

アレクサ、スマスピの世界を開いて、明日晴れるといいな。

アレクサ、スマスピの世界を開いて、スマートスピーカー大好き。
```

* キワード

```
SNS,バーチャル世界
```

* 画像

![smaspi_108.jpg](https://qiita-image-store.s3.amazonaws.com/0/195882/94adcaea-8bfa-9967-a651-747f8eee434a.jpeg)


# Amazon様からのお言葉

Amazon様から修正依頼がやってきました。
結構あったので（笑）省略して書きます。

## スキルのアイコンがAlexaデバイスの画像または類似するものを使ってるからだめだよー

がっつり使ってた。。。
ほんとごめんなさい。

## スキルの詳細ページに表示されている説明が足りないよー

ツイートした内容が消せないってのをちゃんと書いとかないといけないみたい。

## ユーザーが「ストップ」または、「キャンセル」って言った時にエラーがでるよー

わすれてた。
ストップインテントとか考えてなかった。

## 「終了して」って言った時もエラーが出るよー

またまた忘れてた。
早く出そう早く出そうと考えていると、こういうこと忘れる。
VUIって難しいんだなあ。

# 終わりに

コンセプトから否定されるとかじゃなくてよかった。。。
投稿系はだめですよ。とかいわれたらぽしゃんだったな。。。

また、申請して結果はブログにするよー
cakeで定数を設定

```/app/config/const.php
define("HOGE","/var/www/hoge/");
```

で、ブートストラップで読み込みます

```/app/config/bootstrap.php
中略
require_once __DIR__ . "/const.php";
```

んで、これでコントローラ内で呼ぶとき

```/app/contoroller/hogeController.php
中略
$hoge = HOGE;
```

とすることで、定数呼べます。
python:ローカルファイルをtimestampでソートしてscpで転送

#概要
・ローカルファイルをtimestampでsortする。
・ついでに、先日書いた[paramiko+scpで共有サーバにファイル転送する](https://qiita.com/R_K/items/d361ed94db8f680e3d6d)とマージしてみる

#経緯
先日、[paramiko+scpで共有サーバにファイル転送する](https://qiita.com/R_K/items/d361ed94db8f680e3d6d)でローカルファイルをscpで転送するプログラムを書いたのですが、Pythonの勉強もかねてローカルファイルをtimestampでsortするプログラムを書いたのでこれとマージしてみようと思います。

#やってみた
1.sorted()関数を定義してlambda式を使う

<ソート前>

```shell-session
['test1.txt', 'test10.txt', 'test2.txt', 'test3.txt', 'test4.txt', 'test5.txt', 'test6.txt', 'test7.txt', 'test8.txt', 'test9.txt']
```

<コード>

```python:local.py
import os 

localpath = r"C:\test

def sorted_ls(localpath):
    mtime = lambda m: os.stat(os.path.join(localpath, m)).st_mtime
    return list(sorted(os.listdir(localpath), key=mtime))

print(sorted_ls(localpath))
```
<ソート後>

```shell-session:
['test1.txt', 'test10.txt', 'test2.txt', 'test3.txt', 'test4.txt', 'test5.txt', 'test6.txt', 'test8.txt', 'test9.txt', 'test7.txt']
```

lambda式の理解は今後するとして、今回はkeyにmtime(最終更新日時)を使ってsortしてみました。
※ctimeでも良いかもですが、mtimeのほうがソースとして多かったのでこちらを採用。

２．マージ

```python:ssh.py
#-*- coding:utf-8 -*-
import paramiko
import scp
import os

localpath = 'localpath'
remotepath = 'remotepath'

def sorted_ls(localpath):
    mtime = lambda x: os.stat(os.path.join(localpath, x)).st_mtime
    return list(sorted(os.listdir(localpath), key=mtime))

files = sorted_ls(localpath)

with paramiko.SSHClient() as ssh:
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=hostname, port=22, username=username, password=password)
    
    with scp.SCPClient(ssh.get_transport()) as scp:
        for f in files:
            scp.put(localpath + f,remotepath)
            os.remove(localpath + f)
```

これで処理は完了です。withをネストすることでsshをログインしたままでscpの処理をループで行うことができます。

#参照文献
・[Pythonのリスト(配列)で、文字列の日付(日時)を基準にソートしようとしたときの、備忘録](https://cre8cre8.com/python/sort_string_date.html)
・[ソート HOW TO](https://docs.python.jp/3/howto/sorting.html)
・[ythonでファイルの一覧を取得して作成日時でソートする方法](http://tt-house.com/2013/05/python-file-list-sort.html)
・[pythonのsorted関数で使われるlambdaとは何なのか](https://qiita.com/n10432/items/e0315979286ea9121d57)
vue メモ -- フォームの次へボタンで次のフォームが出る感じにする


パネルで次へボタンを押したらフォーム部分だけが遷移する用な感じにする


## VueJS 側

```

window.Vue = require('vue');
const registerVue = new Vue({
  el: '#registerForm',
  data: {
    docState: 1
  }

});

```

## HTML 側

<html> とかは省いて必要部分だけ。

```
<style>

.in-out-translate-demo-wrapper {
    position: relative;
    /*height: 18px;*/
}

.in-out-translate-fade-enter-active, .in-out-translate-fade-leave-active {
    transition: all .5s;
}

.in-out-translate-fade-enter, .in-out-translate-fade-leave-active {
    opacity: 0;
}

.in-out-translate-fade-enter {
    transform: translateX(31px);
}

.in-out-translate-fade-leave-active {
    transform: translateX(-31px);
}

</style>

<form class="form-horizontal" method="POST" action="#">
    <div id="registerForm">
        <div class="in-out-translate-demo-wrapper">

            <transition name="in-out-translate-fade" mode="out-in">
                <div v-if="docState === 1" key="on">
                    <div class="form-group{{ $errors->has('email') ? ' has-error' : '' }}">
                        <label for="email" class="col-md-4 control-label">E-Mail Address</label>
                        <div class="col-md-6">
                            <input id="email" type="email" class="form-control" name="email" value="{{ old('email') }}" required>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-md-6 col-md-offset-4">
                            <button type="button" class="btn btn-primary" @click="docState = 2">Next</button>
                        </div>
                    </div>
                </div>

                <div v-else-if="docState === 2" key="second">
                    <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">
                        <label for="password" class="col-md-4 control-label">Password</label>
                        <div class="col-md-6">
                            <input id="password" type="password" class="form-control" name="password" required>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="password-confirm" class="col-md-4 control-label">Confirm Password</label>
                        <div class="col-md-6">
                            <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>
                        </div>
                    </div>

                    <div class="form-group">
                        <div class="col-md-6 col-md-offset-4">
                            <button type="button" class="btn btn-default" @click="docState = 1">Back</button>
                            <button type="submit" class="btn btn-primary">Register</button>
                        </div>
                    </div>
                </div>
            </transition>
        </div>
    </div>

</form>
```

## 参考

[トランジションモード vuejs](https://jp.vuejs.org/v2/guide/transitions.html#%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B8%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%A2%E3%83%BC%E3%83%89)
初心者向け｜Microsoft Flowを使ってみる（2）毎日定時にURLからファイルをダウンロードする

#はじめに
Microsoft Flowを使ったシンプルなフローの作り方をまとめていきます。
これからFlowにチャレンジしてみようと考えている初心者向けです。
私自身、Microsoftの情報だけだと分かり辛かったので、とりあえず作ってみよう！の精神で事例を紹介していきます。

#設計

##このフローの利用シーン
毎日朝10時に、WEB上からCSVファイルをダウンロードしている。

サンプルとして、Spotifyのチャートデータをダウンロードする。
https://spotifycharts.com/regional/jp/daily/latest

##このフローの目的
ルーチン業務を自動化し、データ分析に専念できるようにする。

#フローの作り方

##作業時間
5～10分

##（1）Flowの上部メニューで「マイフロー」→「一から作成」を選ぶ
![flow3.png](https://qiita-image-store.s3.amazonaws.com/0/242229/c488781c-4aa5-c273-d85c-03c37eb97f94.png)


##（2）「多数のコネクタやトリガーを検索する」を選ぶ
![flow4.png](https://qiita-image-store.s3.amazonaws.com/0/242229/b4c8e098-1d11-49f8-2f9e-d537ea73f608.png)

##（3）フロー名を設定。トリガーを選ぶ

![flowB1.png](https://qiita-image-store.s3.amazonaws.com/0/242229/0993a014-013e-ebe2-63ca-33f131a6e494.png)

**フロー名**
分かりやすい名前を付けてください。

**トリガー**
行動の起点を設定します。

- (a)毎日朝10時に
- (b)WEB上からCSVファイルをダウンロードしている。

(a)が起点です。トリガーとしては「スケジュール」を選びます。


##（4）「スケジュール - 繰り返し」を選ぶ

![flowB2.png](https://qiita-image-store.s3.amazonaws.com/0/242229/28048792-2d5c-f8a5-7885-dfc7cae5326a.png)

コネクタ「スケジュール」のアクションは1種類だけしかありません。（※執筆時点）
「スケジュール - 繰り返し」を選びます。

##（5）スケジュール -繰り返し」の詳細

![flowB3.png](https://qiita-image-store.s3.amazonaws.com/0/242229/2a8f479f-9c67-389b-4cbe-b50707fbb165.png)

頻度は月、週、日、時、分、秒と細かく選べます。
今回は「毎日朝10時」なので

- 間隔：1
- 頻度：日
- タイムゾーン：（UTC+09:00）大阪、札幌、東京
- 設定時刻（時間）：10
- 設定時刻（分）：0

と設定します。

**新しいステップ**
設定が完了しましたら、次のステップに移ります。


##（5）「アクションの追加」を選ぶ

![flow9.png](https://qiita-image-store.s3.amazonaws.com/0/242229/8c6cde5d-e8d3-3674-2a43-82cec826d08b.png)

##（6）URLからファイルをダウンロードします。

![flowB5.png](https://qiita-image-store.s3.amazonaws.com/0/242229/caf957f4-9f5c-a34c-5bcd-9c78a24d08e9.png)

Spotifyは以下のURLを開くと、最新のCSVファイルがダウンロードされます。
https://spotifycharts.com/regional/jp/daily/latest/download
※ChromeでDOWNLOAD TO CSVボタンを右クリック → リンクのアドレスをコピー で取得。

今回はダウンロードしたCSVファイルを、Microsoftが提供するOneDriveにダウンロードします。（Google ドライブやDropBoxでも良いです。）
コネクタから「OneDrive for Business」を選びます。

##（7）アクション「OneDrive for Business - URLからのファイルのアップロード」を選ぶ

![flowB6.png](https://qiita-image-store.s3.amazonaws.com/0/242229/4b26f922-3823-a4ce-5064-a50c390db4bb.png)

やや日本語が不自由な気がしますが、
URLからダウンロードしたファイルを、OneDrive上にアップロードするためのアクションです。

##（8）「OneDrive for Business - URLからのファイルのアップロード」の詳細

![flowB7.png](https://qiita-image-store.s3.amazonaws.com/0/242229/0cfddc50-b0b0-b54b-f31e-16cd7cb996f1.png)

- ソース URL：ダウンロードURLを貼り付けます。
- 対象ファイルのパス：OneDrive上のパスと保存時のファイル名を指定します。
- 上書きする：はい or いいえ

「対象ファイルのパス」が少し厄介な存在です。
上記のように/daily.csvとすると、毎日同じ名前で上書きしてしまいます。


##（9）日付を使って、ファイル名を毎日変更する。

![flowB8.png](https://qiita-image-store.s3.amazonaws.com/0/242229/2469d89b-9a8a-2a91-5bbc-63e252768b6a.png)

**式**
ここで式を使って日付をファイル名に組み込みます。
使い方はExcelの関数とほとんど一緒です。

**日付を盛り込む**
```utcnow()```

これだけです。
ただ、時間がUTCになっているため、日本とは9時間の差が生まれます。
ファイル名をユニークにすることは実現できているので、このままでもいいのですが、
時差を調整したものがこちらです↓

**時差を調整する**
```formatDateTime(addhours(utcnow(),9),'yyyy-MM-dd')```

9時間ズラしたうえで、表示形式をyyyy-MM-ddに変換しました。

**日付を調整する**
これは参考までに。
Sptifyの場合、ダウンロードできるデータは2日前のデータです。（例 4/10にダウンロードしたデータは4/8の分）
日付を-2します。
```formatDateTime(adddays(addhours(utcnow(),9),-2),'yyyy-MM-dd')```


##（10）「フローの保存」を選んで完成
以上です。

#注意事項
CSVダウンロードする対象のサイトの利用規約は必ず確認してください。
宜しくお願いします。
本当の初心者が、手っ取り早くMarkdownでメモを書いてPDFで出力する方法

Markdownで書いたメモ書きをとにかく印刷したい場合のやりかた。
これだけやればよいという一番簡単な方法です。

### とりあえずこれだけやる
先頭行に```<meta charset="utf-8"/>```を入れるのを忘れなければよし。

```
<meta charset="utf-8"/>

# 文書のタイトル

### 最初の項目

ほげほげ。

### 2番めの項目

ふがふが
```

### htmlに出力

```
pandoc input.md -o output.html
```

### output.htmlをブラウザで開いて印刷

ブラウザから印刷して出力先を「ファイルに出力する」を選択する。

![印刷画面.png](https://qiita-image-store.s3.amazonaws.com/0/60438/d39d8ae4-b907-4c3b-8bc3-cebf787524bc.png)

### PDFが生成された

シンプル極まりない出力ですが、メモ書きとしては必要十分なPDFが生成されます。

 ![出力PDF.png](https://qiita-image-store.s3.amazonaws.com/0/60438/2b3a7c5a-ee41-0674-3d74-7f7c91615770.png)
archLinuxでwifiの初期設定

# archLinuxでサクッとwifi環境を構築する方法

### @7つの手順でwifi接続！

I. ```lspci -v | less```
Network controllerの行にある<i>kernel module</i> を探す。
II. ```dmesg | grep  your-kernel-module ``` 
でインターフェイス名 wlsXとか、wlpXsXとかをメモる。
※I,II は ```ip addr show```や、```ifconfig```使えるなら、インターフェイス名をすぐに調べられる。(なお、公式は前者推奨。)
今回は、とりあえずインターフェイス名が```wlp3s0```だったとして進める。

III. wifi

IV. wifiのSSIDとPASSを準備しておく。接続圏内のSSIDは以下のコマンドで調べられる。

```
sudo iw dev wlp3s0 scan | grep your-SSID | less
```

V. 雛形のwifi.confを/etc/wpa_supplicant/等の場所に作っておく。

```
ctrl_interface=/run/wpa_supplicant
ctrl_interface group=wheel
update_config=1
ap_scan=1
```

ちなみに丁寧な原本は/usr/share/doc/wpa_supplicant/wpa_supplicant.conf に存在する。
VI. 先ほど作った雛形にnetwork情報を追加。

```
sudo wpa_passphrase your-SSID your-SSID-PASS | tee -a /etc/wpa_supplicant/wifi.conf
```

VII. 接続用のシェルスクリプトを作成。

```
#!/bin/sh 
 killall wpa_supplicant
 wpa_supplicant -B -i wlp3s0 -c /etc/wpa_supplicant/wifi.conf 
 dhcpcd wlp3s0
```

あとはシェルスクリプトを実行すればwifiに接続できる。

### 最後に
多分もうちょっとスマートな方法あるかと思いますが、とりあえず投稿します^^;
[ Android ] コピペでListViewの高さを動的に設定 (初学者向け)

[ListView](https://developer.android.com/reference/android/widget/ListView.html)の高さを設定する方法って、意外と複雑です。

`wrap_contents`だと一つになっちゃったり、デバイスによって要素が溢れてはみ出してしまったり...。

調べてもたくさん出てくるのですが、参照が深くなったり、ライフサイクルを意識しないと崩れたり、意外とまどろっこしいものが多く、スパッと簡単に出来ないものかなと思ってました。

そこで、後述する関数を使うと楽に実装できます。

Adapterをあてがい、表示したいデータをセット済みのListviewに、この関数を用意して引数にそのListviewを渡してあげるだけです。

一部の高さを動的に変えたりしたい場合は、for文の中で制御構文等々、追加してあげるときれいになるかと思います。

## Java

```java:ListViewUtil.java


public static void setListViewHeightBasedOnChildren(ListView listView) {
    
    //ListAdapterを取得
    ListAdapter listAdapter = listView.getAdapter();

    if (listAdapter == null) {
        // nullチェック
        return;
    }

    //初期化
    int totalHeight = 0;

    //個々のアイテムの高さを測り、加算していく
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    //LayoutParamsを取得
    ViewGroup.LayoutParams params = listView.getLayoutParams();

    //(区切り線の高さ * 要素数の数)だけ足してあげる
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));

    //LayoutParamsにheightをセットしてあげる
    listView.setLayoutParams(params);
}

```

## Kotlin

```kotlin:ListViewUtil.kt
fun setListViewHeightBasedOnChildren(listView:ListView) {

  //ListAdapterを取得
  val listAdapter = listView.getAdapter()
  if (listAdapter == null)
  {
    // nullチェック
    return
  }

  //初期化
  val totalHeight = 0

  //個々のアイテムの高さを測り、加算していく
  for (i in 0 until listAdapter.getCount())
  {
    val listItem = listAdapter.getView(i, null, listView)
    listItem.measure(0, 0)
    totalHeight += listItem.getMeasuredHeight()
  }

  //LayoutParamsを取得
  val params = listView.getLayoutParams()

  //(区切り線の高さ * 要素数の数)だけ足してあげる
  params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1))

  //LayoutParamsにheightをセットしてあげる
  listView.setLayoutParams(params)
}
```

もし、もっと素敵な実装方法あれば、ご教授頂きたいです。

参考記事 : [Android Listview Measure Height
](https://stackoverflow.com/questions/21620764/android-listview-measure-height)