OmniAICreator/Qiita-1.07M huggingface dataset:
Dart x Flutter で HelloWorld

https://flutter.io/ にも、チュートリアルがあるのですが。
最初に目撃するコードが、少し長いです。

そこで、 "Hello, World" を書いて見ました。

https://github.com/kyorohiro/memo_flutter/tree/master/hello

```:main.dart
import 'package:flutter/widgets.dart'as sky;

void main() {
  sky.runApp( new sky.Directionality(
    textDirection: sky.TextDirection.ltr,
    child: new sky.Center (
        child: new sky.Text("Hello World",
          style: new sky.TextStyle(color:new sky.Color.fromARGB(0xff,0xff,0xff,0xff)))
    )
  ));
}
```

![s_Screenshot_20180105-032912.png](https://qiita-image-store.s3.amazonaws.com/0/54192/8621b268-407a-4c80-ff80-86b79fe7fa55.png)

どうでしょうか。 短くて、Helo World　っぽい!!



# Flutter 関連の 私のメモ

試したことをカキカキしています。
[Dart x Flutter Memo (0) [2018,]](https://medium.com/@kyorohiro_72753/dart-x-flutter-memo-0-7ab0f2e8877a)
KotlinでHMAC

![kotlin_800x320.png](https://qiita-image-store.s3.amazonaws.com/0/107575/a5f2da26-816a-76d6-3446-c4c384063e20.png)

Kotlin で HMAC を使った暗号化をする方法をメモ. その他 Kotlin での各種暗号化は [phxql/kotin-crypto-example](https://github.com/phxql/kotlin-crypto-example/blob/master/src/main/kotlin/de/mkammerer/Crypto.kt) にサンプルがあります.

```Kotlin
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import kotlin.experimental.and

/**
 * Hmac by Kotlin
 */
fun main(args: Array<String>) {

    // Change algorithm as you like. ex. "HmacSHA1", "HmacMD5", etc
    val algorithm = "HmacSHA256"
    val key = "Secret Key"
    val text = "Encryption Target"

    // Encryption
    val keySpec = SecretKeySpec(key.toByteArray(), algorithm)
    val mac = Mac.getInstance(algorithm)
    mac.init(keySpec)
    val sign = mac.doFinal(text.toByteArray())
            .joinToString("") { String.format("%02x", it and 255.toByte()) }

    // 6bad2e332a94882be27d946b5fab39acd6be6fd64c6a52a27d77422daf36a6fd
    println(sign)
}
```
アルファベットを大文字化または小文字化するテクニック

TwitterのTLを眺めていたら、論理演算を使ったテクニックが流れて来た。
「なるほど」と思ったので、忘れないためにやってみた。

どのようなテクニックかというと、

- 大文字のアルファベット AND '_' -> 小文字化
- 小文字のアルファベット OR ' '  -> 大文字化
- 任意のアルファベット XOR ' '   -> 大文字なら小文字化, 小文字なら大文字化

といったもの。

``` c:lower_upper.c
#include <stdio.h>

#define LOWER_TO_UPPER(c) (c & '_')
#define UPPER_TO_LOWER(c) (c | ' ')
#define SWITCH_UPPER_LOWER(c) (c ^ ' ')

int main(void) {
    
    // 大文字から小文字
    printf("UPPER_TO_LOWER: %c\n", UPPER_TO_LOWER('A'));
    printf("SWITCH_UPPER_LOWER: %c\n", SWITCH_UPPER_LOWER('Q'));

    puts("");

    // 小文字から大文字
    printf("LOWER_TO_UPPER: %c\n", LOWER_TO_UPPER('a'));
    printf("SWITCH_UPPER_LOWER: %c\n", SWITCH_UPPER_LOWER('q'));

    return 0;
}
```

```c:実行結果
UPPER_TO_LOWER: a
SWITCH_UPPER_LOWER: q

LOWER_TO_UPPER: A
SWITCH_UPPER_LOWER: Q
```

なるほど:thinking:


(以下 2018/01/07 0:25追記)

+ 注意点
    - わかりやすく書くためには、'_'や' 'を使わず、2進数や16進数で書く方が良い。
    - 文字数を少なくしたければ10進数を使うと良い。
    - 標準ライブラリにtolower(), toupper()があること。
Visual Operator メモ / Vim

### Visual Operator 開始キー

・v
選択

・c
書き換え

・d
削除

### Visual Operator

・iw
inner word
1単語

・iW
inner Word
次の空白まで

・is
inner sentence
1文

・ip
inner paragraph
1段落

・it
inner `<tag>.*</tag>`
1タグの中身

・i`<記号>`
inner `<記号>`
`<記号>`で囲まれた中身

先頭のiをaに変えると、全体になる。
（例）"hoge" -> viw: hoge, vaw: "hoge"
vagrant vbguestのプラグインインストールが失敗する

# vagrant-vbguest のインストールに失敗した時の対処　覚書き

### 各種バージョン
- VirtualBox 5.2.4
- Vagrant 2.0.1
- vagrant-vbguest 0.15.0

### 失敗したログ
```
$ VBoxManage -v
5.2.4r119785

$ Vagrant -v
Vagrant 2.0.1

$ vagrant plugin install vagrant-vbguest

Ignoring ffi-1.9.10 because its extensions are not built.  Try: gem pristine ffi --version 1.9.10
Ignoring nokogiri-1.6.3.1 because its extensions are not built.  Try: gem pristine nokogiri --version 1.6.3.1
Ignoring unf_ext-0.0.7.1 because its extensions are not built.  Try: gem pristine unf_ext --version 0.0.7.1
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:
conflicting dependencies ffi (= 1.9.18) and ffi (= 1.9.10)
  Activated ffi-1.9.10
  which does not match conflicting dependency (= 1.9.18)
  Conflicting dependency chains:
    ffi (= 1.9.10), 1.9.10 activated
  versus:
    ffi (= 1.9.18)
  Gems matching ffi (= 1.9.18):
    ffi-1.9.18
$ 
```

### 回避方法
`VAGRANT_DISABLE_STRICT_DEPENDENCY_ENFORCEMENT=1 vagrant plugin install vagrant-vbguest
`

### 成功したログ
```
$ VAGRANT_DISABLE_STRICT_DEPENDENCY_ENFORCEMENT=1 vagrant plugin install vagrant-vbguest

Ignoring ffi-1.9.10 because its extensions are not built.  Try: gem pristine ffi --version 1.9.10
Ignoring nokogiri-1.6.3.1 because its extensions are not built.  Try: gem pristine nokogiri --version 1.6.3.1
Ignoring unf_ext-0.0.7.1 because its extensions are not built.  Try: gem pristine unf_ext --version 0.0.7.1
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Fetching: vagrant-share-1.1.9.gem (100%)
Fetching: micromachine-2.0.0.gem (100%)
Fetching: vagrant-vbguest-0.15.0.gem (100%)
Installed the plugin 'vagrant-vbguest (0.15.0)'!
$ 
```
C#:Chartコントロールでローソク足を表示させる

#Chartコントロールでローソク足を表示させる
ただでさえ情報が少ない、C#のChartコントロールに関する情報。
ましてやChartコントロールを使ってローソク足を表示するための情報は皆無に等しいのが現状です。
そこで、断片的な情報を集めて試行錯誤した結果をまとめます。

本記事のコードは以下の環境で確認しています

+ Microsoft Visual Studio Community 2017
+ .NET Framework 4.7

私がつまづいたのは以下の二点です
・X軸を日付にするには？DateTimeを代入したいのにdouble型でしか値を指定できない
　また、X軸の最大値最小値はどうやって設定すればいいの？
　→OLEオートメーション日付に変換する必要がある
・四本値（高値、安値、始値、終値）のDataPointインスタンスの作成方法？
　→System.Windows.Forms.DataVisualization.Charting.DataPoint
　　(double xValue, double[] yValues)メソッドを用いる

##横軸を日付にするには？
ChartArea.AxisX.IntervalTypeをDateTimeIntervalType.Daysにする。
また、横軸の最大値最小値を設定する場合はDateTime.ToOADate()メソッドで
OLEオートメーション日付に変換

```CSharp
// グラフ領域の設定
ChartArea area = new ChartArea();
// 横軸を日付に設定
area.AxisX.IntervalType = DateTimeIntervalType.Days;
// 横軸の最大・最小値を設定　DateTimeをToOADateメソッドを用いてdoubleに変換
area.AxisX.Minimum = new DateTime(2010, 1, 1).ToOADate();
area.AxisX.Maximum = new DateTime(2010, 1, 10).ToOADate();
```
##4本値データのDataPointインスタンスの作成方法

```CSharp
// 日付を格納する
DateTime date = new DateTime(2010, 1, 4);
// High Low Open Closeの順番で配列を作成
double[] values = new double[4] { 1010, 990, 1000, 1005 };
// 日付、四本値の配列からDataPointのインスタンスを作成
DataPoint dp = new DataPoint(date.ToOADate(), values);
```

## サンプルコード
以上の事を踏まえたうえでChartコントロールにローソク足を表示させるソースコード（全体）
フォームアプリケーションにChartントロール(chart1)を追加した後、以下のコードをコピペして実行してみてください。

```CSharp:Form1.cs
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // グラフ領域の設定
        ChartArea area = new ChartArea();

        // 横軸（日付軸）の設定 
        // DateTimeのままでは使えないので
        //ToOADateメソッドでOLEオートメーション日付に変換
        area.AxisX.Title = "日付";
        area.AxisX.IntervalType = DateTimeIntervalType.Days;
        area.AxisX.Minimum = new DateTime(2010, 1, 1).ToOADate();
        area.AxisX.Maximum = new DateTime(2010, 1, 10).ToOADate();

        // 縦軸（株価軸）の設定
        area.AxisY.Title = "株価";
        area.AxisY.Minimum = 950;
        area.AxisY.Maximum = 1050;

        // 既定のグラフ領域の設定をクリアした後、設定する
        chart1.ChartAreas.Clear();
        chart1.ChartAreas.Add(area);

        // データ系列を作成する
        Series series = new Series();
        series.ChartType = SeriesChartType.Candlestick;
        series.Color = Color.Red;

        for (int i = 0; i < 5; i++)
        {
            // 日付(2010/1/4から5本)
            DateTime date = new DateTime(2010, 1, 4).AddDays(i);

            // High Low Open Closeの順番で配列を作成
            double[] values = new double[4] 
            {
                1010 + i, 990 + i, 1000 + i, 1005 + i
            };

            // 日付、四本値の配列からDataPointのインスタンスを作成
            DataPoint dp = new DataPoint(date.ToOADate(), values);
            series.Points.Add(dp);
        }

        chart1.Series.Clear();
        chart1.Series.Add(series);
    }
}
```
Raspberry Pi ✕ Google Cloud Pub/Sub = 呼び鈴

Raspberry Pi Zero Wを入手したので、それを使ってリモート呼び鈴を作ってみました。
# システム構成
今回は、Google Cloud Platform(GCP)を利用することにしました。

![呼び鈴.png](https://qiita-image-store.s3.amazonaws.com/0/87230/8a282637-9f6c-8b81-b30f-15037534cd36.png)

:one:  Webブラウザ
:two:  Publisher
:three:  [Google Cloud Pub/Sub](https://cloud.google.com/pubsub/overview?hl=ja)
:four:  Subscriber
:five:  呼び鈴

# Subcriber（Raspberry Pi）
## Raspberry Pi の設定
### Google Cloud SDK インストール
始める前に、Raspberry Piに[Google Cloud SDK をインストール](https://cloud.google.com/sdk/docs/?hl=ja#linux)します。

|ダウンロードするパッケージ    |
|:------------------:|
|Linux（x86）|

### PYTHON用のクライアント ライブラリインストール
本家ドキュメントのコマンドを実行すると、「grpcio (1.8.2)がない:warning:」ってエラーが出てしまったので、１つバージョンを下げたパッケージをインストールすることにしました。

```bash
$ pip install --upgrade google-cloud-pubsub==0.30.0 --ignore-installed
```

※インストール環境まで結構時間かかりました（２０分位）。気長に待ちましょう…:expressionless:

## ついでにトピックとサブスクリプションの作成
せっかくGoogle Cloud SDKもインストールしたし、本家のドキュメントにもあるように、gvloudコマンドからトピックとサブスクリプションを作ってしまいましょう。

```bash
$ gcloud beta pubsub topics create my-topic
$ gcloud beta pubsub subscriptions create my-sub --topic my-topic
```

## メッセージ受信
Raspberry Piは受信側にするので、メッセージ受信のサンプルコードを参考に実装します。
> [GoogleCloudPlatform/python-docs-samples](https://github.com/GoogleCloudPlatform/python-docs-samples/blob/master/pubsub/cloud-client/subscriber.py)

*※メッセージ受信の様子*
<img width="808" alt="スクリーンショット 2018-01-06 0.11.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/87230/e0167017-970a-3698-bdc0-0494440424d7.png">
メッセージは、[Pub/Sub](https://console.cloud.google.com/cloudpubsub/topicList)から、Topicを選択し、「メッセージを公開」ボタンから送信することが出来ます。

**メッセージの受信することができるようになりました。**
次は、受けた後に呼び鈴を鳴らす仕組みを作ります。

### 部品

- [Raspberry Pi Zero W](https://www.raspberrypi.org/products/raspberry-pi-zero-w/)
- [TD62083AP](http://akizukidenshi.com/download/TD62083AP.pdf)
- ソレノイド
- LED
- 抵抗(10kΩ)
- 電源プラブ(12V 2A)


### ブレッドボード
![呼び鈴_raspi.png](https://qiita-image-store.s3.amazonaws.com/0/87230/748d0ab8-1f94-4096-4bce-d19a713ad9fb.png)


# Publisher（バックエンド）
こっちはあまり楽しくないですが。
## Google Cloud Platform
:two: のパブリッシャー アプリケーションに[GOOGLE APP ENGINE](https://cloud.google.com/appengine/?hl=ja)を利用します。ここには、スマホ（Web）から（今回は呼び鈴を鳴らす）メッセージを送信するための簡単なボタンUIと、ボタンのクリックイベントで発生させるAPIのエンドポイントを作ります。

1. ブラウザから、https://\<project-id>.appspot.com/ にアクセスする
2. ボタンのページを表示する
<img width="128" alt="呼び鈴ボタン" src="https://qiita-image-store.s3.amazonaws.com/0/87230/30d4479e-0f95-5ebf-4b09-94c094530844.png">

3. ボタンを押す
4. PublishするAPIを呼ぶ
5. 成功ステータスを返す

![呼び鈴_Web.png](https://qiita-image-store.s3.amazonaws.com/0/87230/0a4a7e4e-8bda-129b-5af8-2eb20b59da03.png)

### 言語、フレームワークなど
1. [Java on Google App Engine](https://cloud.google.com/appengine/docs/java/?hl=ja)
2. [Spring Boot](https://projects.spring.io/spring-boot/)
3. [Thymeleaf](http://www.thymeleaf.org/index.html)

#完成品
![IMG_0096.jpg](https://qiita-image-store.s3.amazonaws.com/0/87230/a91beec6-abe9-f34e-b6d6-9e7f007b1792.jpeg)
でっかいByte量の単位をざっくりKとかMとかGとかに変換するシェルスクリプト



# やったこと

5423987431ByteとかいわれてもそれつまりどれくらいがパっとわからなかったのでザックリでいいのでKとかMとかの接頭語を付けてくれるシェルをぱぱっと書いた

# モチベーション
業務で使ってるオブジェクトストレージの使用量をざっくりでよいので把握しておきたかった
オブジェクトストレージの使用量は

```bash
$ s3cmd du
```
で返ってくるんだけど、こんな感じ。

```
$ s3cmd du
5423987431 700 Objects s3://test-bucket
-------
Total 5423987431
```
なるほどわからん（笑）、いやわかるけどｗ

※ちなみにs3cmdを使ってるけどAWSではない、国内クラウドベンダの提供するオブジェクトストレージサービスがそのまんまs3cmd使えるよ＾＾って案内してる
[ここ](https://www.faq.idcf.jp/app/answers/detail/a_id/360/~/s3cmd%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E4%B8%80%E8%A6%A7%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E4%B8%8B%E3%81%95%E3%81%84%E3%80%82)とか[ここ](http://blog.pfs.nifcloud.com/use_object_storage_with_s3_tool_setting)とか[ここ](https://academy.gmocloud.com/advance/20160112/3224)とか。

こういうのに対して、日々使用状況をチェックして1日1回通知してくれるようにしたかったんだけど、s3cmd duは結果をbyteで返してくるので、そのまんま数値みてもぱっとわかんねぇなってことで

# 調べた
シェルスクリプトでパッとやりたかったので、そもそも先人の知恵がないかぐぐった。
[容量の単位を変換するシェル](https://open-groove.net/shell/unit-conversion/)
求めてるのとはちょっと違ったけど、近くてヒットしたのはこのページぐらい。たぶん、あんまりみんな困ってないんだろうな。
そもそもbashとかでLinuxサーバの情報（ディスク使用量とかメモリ容量とかとか）を見たい場合はdf/duもfreeも自前で単位いいカンジにしてくれるオプションあるし。

なので自分で書いて、せっかくなのでこの記事に残しておきます。

# 書いたコード

```check-objectstorage-usage.sh
#!/bin/bash

function report(){
  #メールとかslackとかに通知する処理
}

function unitconversion(){
  #$1で渡された数値をキリがいい単位の〇byte表示に置き換える
  value=$1
  conversion_count=0

  while [ $value -gt 1024 ]
  do
    value=$(echo "scale=0; $value/1024" | bc)
    conversion_count=$((conversion_count + 1))
  done

  case $conversion_count in
    1)
       unit="Kbyte"
       ;;
    2)
       unit="MByte"
       ;;
    3)
       unit="GByte"
       ;;
    4)
       unit="TByte"
       ;;
    5)
       unit="PByte"
       ;;
       #まぁ今回の用途でPはないと思うけど
    *)
       echo "conversion_count err" 1>&2
       exit 1
       ;;
    esac
        echo "${value}${unit}"
        return 0
}

os_du=$(s3cmd du)
total=$(echo "${OS_DU}" | grep "Total" | awk '{print $1'})
total_conversion=$(unitconversion $total)
echo -e "${os_du} \n-> ${total_conversion}" | report

exit 0
```

シンプルに1024で割り算して、結果が1024より小さくなったらおわり
割った回数を数えておいてあとで単位をくっつけるだけ
※1024で割るとキロとかメガじゃなくてキビとかメビだろっていうのはその通りです、ざっくりなのでそこまでは今回割愛


なんか、もっといいやり方とかツールみたいなのあったら教えてください
Metabaseを自分でビルドしてみる

#Metabaseをソースからビルドしてみたい
巷で話題のMetabaseについて、[OSSのデータ可視化ツール「Metabase」が超使いやすい](https://qiita.com/acro5piano/items/0920550d297651b04387)を読んでみたら面白そうだったので、ソースから自分でビルドして動かすまでの手順を確認してみます。
確認した環境は、Windows Subsystem for Linuxを有効化し、Microsoft StoreからUbuntuを有効化します。

#ビルドに必要な環境を整える
UbuntuをWindowsのスタートメニューから起動し、下記コマンドを実行、ビルドに必要な環境を整えます。

```
$ sudo su
# apt-get update && apt-get upgrade
# apt-get install make git
# add-apt-repository ppa:webupd8team/java
# apt-get update
# apt-get install oracle-java8-installer
# apt-get install oracle-java8-set-default
# curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
# apt-get install -y nodejs
# curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
# echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
# apt-get update && apt-get install yarn
# cd /usr/local/bin
# wget https://raw.github.com/technomancy/leiningen/stable/bin/lein
# chmod +x lein
# ./lein
```

# Githubからソースを取得し、ビルドし動かす。
Githubからソースを取得し、ビルドします。

```
# cd /usr/local/src/
# git clone https://github.com/metabase/metabase.git
# cd metabase/
# ./bin/build
```

./bin/buildを実行後、最後に、metabase.jarファイルがどこに生成されてたか表示されますので、metabase.jar を適当なディレクトリにコピーし、java -jar を実行します。
ここでは、/usr/local/src/下にmetabase.jarに複製し、java -jar /usr/local/src/metabase.jar を実行しています。

実行後、Windows上でWebブラウザを開き、http://localhost:3000/ にアクセスするとMetabaseの初期セットアップ画面が表示され、最初のユーザーとして管理者を登録しますと、ビルドしたMetabaseを使用することができます。

#ちらっと見てみる
管理画面で「Authentication」を見ますと、「Sign in with Goolge」がありました。
Google Developers consoleで、client IDを取得する必要がありますが、G Suite(旧Google Apps)アカウントでログインできるのはけっこう便利です。
![metabase_認証_Google.PNG](https://qiita-image-store.s3.amazonaws.com/0/41414/11a339c8-4c60-1ef7-26b5-b12366f495ae.png)

「Authentication」には、他に「LDAP」もあります。

#その他
自分で日本語の言語ファイルを作ってみたのですが、言語を変える画面が見当たらず、どこなんだろう？...と。今後の課題ですね。

G Suite(旧Google Apps)アカウントできるダッシュボードツールには、Re:dashや公式のGoogle Data Studioがあります。ざくっと比較してみました。Oracle DBを使っていないのであれば、Metabaseは良い選択肢かと思います。

| 比較      | Metabase | Re:dash    |Google Data Studio | 
|:----------|:---------|:-----------|:------------------|
| G Suiteアカウント認証        |◯   | ◯    |◯    |
| BigQuery 対応                |◯   | ◯    |◯    |
| Google スプレッドシート 対応 |X    | ◯    |◯    |
| Google Analytics 対応        |X   | ◯     |◯    |
| AdWords 対応                 |X    | X     |◯    |
| MySQL 対応             　    |◯   | ◯    |◯    |
| PostgresSQL 対応             |◯   | ◯    |◯    |
| Oracle 対応                  |X    | ◯    |Google Apps Script経由    |
| 動作場所                |好きな環境で動作可   | 好きな環境で動作可   |Google Cloud    |
| インストール            |java -jar だけでとても簡単。数分で終わる。   | Dockerなどを使用可能。ソースからは、NginxやRedis等が必要なので少々面倒。   | SaaSなのでG SuiteアカウントやGmailアカウントがあればOK。    |
オラクルがJAVAとMYSQL買収

2000年代趣味で自宅サーバーをMYSQL＆PHPで運営してたのですが、さすがに自宅サーバーにしていたパソコンのハードディスクがつぶれ復活を試みるも情熱失せ、そにままに。 
一作年から一念発起、まずはWEBプログラムから復活し、今も勉強中です。 
永遠の初心者ですが経歴だけは長いです。(-_-)

復活して、驚いたのがフリーのJAVAとMYSQLがORACLE社所有になっていたことです。オラクル社ホームページでも今後もJAVAはフリーで使ってもらうと明言してますが、どうでしょう。さすがに企業で世代が変わり、近い将来ある程度まできたら有償なんて時代がくるのでわはないでしょうか？いや、いまもあるかもしれません。 
一方のMYSQLも勿論、フリーでの配布は続いてますが、一作年あたりからアメリカですが、ネット環境込みで月額での有償契約ができたようです。日本での対応はまだのようですが。 
ある意味こちらは、選択肢が広がってよかったかも？

一方、MYSQLの創業者はORACLEとは決別し、MARIADBと言う新しいデータベースも立ち上げることになる。 
PHPやデータベース等がセットでインストールできるXAMPPもPHP5.6から知らぬまにデータベースはMARIADBに差し変わっていてコマンドが違っていて往生しました。 
そんなこんなで、フリーの象徴であった２つのソフトが大企業に飲まれてしまったのは残念です。 
まあ、でも時代の流れでしかないことかも知れません。。
http://www.freestyle-life.site:3000/posts/43
MongoDBでmongod.lockが何度も生成されて困った上に/data/dbってどこよだった話


mongod.lockがあって、それを消してもrestartするとmongod.lockがまたできてるって方に

mongod.lockですが、mongoのサービスを一回止めないとmongod.confとかをいじってる間にmongod.lockが何度も生成されます。（おそらく）
mongod.lockはエラーが起こると生成されるっぽい？
とりあえず自分はmongoのサービスを止めたらうまく行きました。
以下のURLがおすすめです。

https://solaimurugan.blogspot.jp/2013/06/changing-defalult-dbpath-in-mongodb-use.html

あとなんかThe name org.freedesktop.PolicyKit1 was not provided by any .service files
が出た人には以下も。
http://m77.hatenablog.com/entry/2015/03/05/111930

あとmongod.confの権限をread and writeできるようにいじっておいた方がいいかと思われます。

それと上のsolaimuruganのページには任意のディレクトリにmongoのパスを繋げる、みたいなことが書いてあって、前使っていたデータを繋げられるように見えるのですが、自分の場合pathを/data/db以外にするとダメでした。
mongod.confの内容を
パスを/var/lib/mongodb/としてから、
mongoとやって起動してもmongoがfail to...という風に出ます。
PythonのOpenCVで画像の貼り付け

# はじめに
OpenCVではある画像に他の画像を貼り付けるのが少し面倒みたい。単純に画像の配列をコピペすれば貼り付けることができるが，回転させて貼り付けるには工夫が必要そうである。
https://qiita.com/kinojp/items/d2d9a68a962b34b62888
上記の記事ではcv::warpAffineを使うのが便利と紹介されているが，Python版のOpenCVでは引数に背景画像の指定が出来ないようで使えなさそうだった。（もしかしたらできる？）

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_core/py_image_arithmetics/py_image_arithmetics.html#image-arithmetics
OpenCV-Pythonチュートリアル画像の算術演算ではビット演算を用いたロゴ画像の貼り付け方法が紹介されている。

# マスク処理を用いた画像の貼り付け
貼り付け位置の指定と回転・スケーリングができるように関数にしてみた。

まず背景画像と同じ大きさの配列の真ん中に，貼り付けたい画像をコピーする。その後，cv.warpAffineを用いて回転・拡大縮小を行い，並進により貼付け位置を指定する。この関数では貼り付け位置は背景画像の真ん中からのピクセル数で指定している。x,yが0の場合，背景画像の真ん中と貼り付け画像の真ん中が一致するようになっている。また，回転は度数単位，スケーリングは1で等倍，0.5で半分の大きさになる。

```python3
import cv2
import numpy as np

def cvpaste(img, imgback, x, y, angle, scale):  
    # x and y are the distance from the center of the background image 
    
    r = img.shape[0]
    c = img.shape[1]
    rb = imgback.shape[0]
    cb = imgback.shape[1]
    hrb=round(rb/2)
    hcb=round(cb/2)
    hr=round(r/2)
    hc=round(c/2)
    
    # Copy the forward image and move to the center of the background image
    imgrot = np.zeros((rb,cb,3),np.uint8)
    imgrot[hrb-hr:hrb+hr,hcb-hc:hcb+hc,:] = img[:hr*2,:hc*2,:]
    
    # Rotation and scaling
    M = cv2.getRotationMatrix2D((hcb,hrb),angle,scale)
    imgrot = cv2.warpAffine(imgrot,M,(cb,rb))
    # Translation
    M = np.float32([[1,0,x],[0,1,y]])
    imgrot = cv2.warpAffine(imgrot,M,(cb,rb))
    
    # Makeing mask
    imggray = cv2.cvtColor(imgrot,cv2.COLOR_BGR2GRAY)
    ret, mask = cv2.threshold(imggray, 10, 255, cv2.THRESH_BINARY)
    mask_inv = cv2.bitwise_not(mask)
    
    # Now black-out the area of the forward image in the background image
    img1_bg = cv2.bitwise_and(imgback,imgback,mask = mask_inv)
    
    # Take only region of the forward image.
    img2_fg = cv2.bitwise_and(imgrot,imgrot,mask = mask)
    
    # Paste the forward image on the background image
    imgpaste = cv2.add(img1_bg,img2_fg)
    
    return imgpaste

imgback = cv2.imread('back.jpg')
cv2.imshow('imgback',imgback)

img = cv2.imread('inu.jpg')
cv2.imshow('img',img)

x=-60
y=70
angle=20
scale=0.7

imgpaste = cvpaste(img, imgback, x, y, angle, scale)

cv2.imshow('imgpaste',imgpaste)

cv2.waitKey(0)
cv2.destroyAllWindows()

```

拾い物の画像を用いて，実行してみると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201397/ae9bec19-ea01-69b1-9e13-887a80fc6e4e.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201397/0adcd192-33e7-1925-b417-ff0cb821aad9.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/201397/2dd84752-e84a-9633-8773-f1a877d3187a.png)

このように自由に回転，スケーリングして好きな位置に貼り付けられる。

もしかするともっと簡単な関数がすでに用意されているのかもしれないけど。
face2face動かしてみた(mac & ubuntu)

## やったこと
[face2face-demo](https://github.com/datitran/face2face-demo)をpre-trainedモデルを使って動かしてみました。
自分で学習はさせていないので、とりあえずサクッと動かしてみたい人用です。

## face2faceとは
[face2face](https://github.com/datitran/face2face-demo)は、[pix2pix](https://github.com/phillipi/pix2pix)を顔の表情に応用したもの。
![](https://cdn-images-1.medium.com/max/1600/1*qtHE9Ru0k4TorxqShyKNmw.gif)

学習データは以下のようにしている。と思われる。
- 入力: 元の画像から顔の特徴を抜き出した画像
- 出力: 元の画像
![](https://cdn-images-1.medium.com/max/1600/1*vl_qYBBIpEVbAvP4b9_Knw.gif)
ここでいう画像とは、動画をフレームごとに区切ったもののこと。

参照: 
https://towardsdatascience.com/face2face-a-pix2pix-demo-that-mimics-the-facial-expression-of-the-german-chancellor-b6771d65bf66

## 実際に動かす
[このページ](https://github.com/datitran/face2face-demo)のデモを動かす部分だけ見ていく。
#### 事前準備
今回はcondaコマンドで環境を整えるので、[Anaconda](https://www.anaconda.com/download/#macos)をインストールしておく。
#### 1. リポジトリをclone
```sh
git clone git@github.com:datitran/face2face-demo.git
```
~~次の2でopencv3のインストールに失敗するので、[修正したほうのリポジトリ](https://github.com/RyoheiKomiyama/face2face-demo)(issue9ブランチ)を使う。~~
mergeしてもらえました。
#### 2. condaで環境を作る
```sh
cd face2face-demo
conda env create -f environment.yml
source activate face2face-demo
```
#### 3. pre-trainedモデルをダウンロード・解凍
[facial landmarkのpre-trainedモデル](http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2)と[face2faceのpre-trainedモデル](https://dl.dropboxusercontent.com/s/rzfaoeb3e2ta343/face2face_model_epoch_200.zip)をダウンロード・解凍して現在いるリポジトリ直下に配置。
face2faceのpre-trainedモデルはface2face-reduced-modelというディレクトリをつくってそこに移す。

```sh
mkdir face2face-reduced-model
mv frozen_model.pb face2face-reduced-model
```
#### 4. 実行
```sh
python run_webcam.py --source 0 --show 0 --landmark-model shape_predictor_68_face_landmarks.dat --tf-model face2face-reduced-model/frozen_model.pb
```
ubuntuの場合はusbカメラをつけておく。

動いた！
![face2face_trimmed.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/141797/915ce678-bdcc-30ac-290f-f4dc41c13db8.gif)

## 課題
- ubuntuを使ってもgpuで動いてくれない。  
tensorflowをtensorflow-gpuにしたり、自分でdlibをbuildしたり、cudnnのバージョンを5にしたり、すぐ思いつく部分は一通り試してみたがgpuが動いてくれない。  
多分仕様的には動くはず？なので、動いた方は教えていただけると助かります。
n進法九九を自動的に出してくれるExcel表

#はじめに
　n進法虫食い算を作ることに挑戦しているため、n進法の九九を自動で出してくれる仕組みが必須だったのですが、簡単なプログラミングしかできないのでExcelで作ることにしました。
#設計思想
　以下のような順番で以下のようなものが出力されればいいな～と考えていました

- 任意の自然数を既定の位置に入力する
- その下にもともと用意されている表に掛け算結果を出力する
- なるべく出力する数が少なくなるようにしてほしい

#結果
　こうなりました。
　ただし、入力欄は図のようになっています
<img width="1278" alt="キャプチャ.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/222743/41cdf173-62e8-ab98-b3fd-1e47d9e639a4.jpeg">

　この時、$1\times 1$の欄に相当するB4では

~~~
=IF(B3<$B$1,IF($A4<$B$1,QUOTIENT(B3*$A4,$B$1)&-MOD(B3*$A4,$B$1),""),"")
~~~
のように入力されています。
　まず、出力する数をなるべく減らし、結果を見やすくするために、掛ける数と掛けられる数の両方ともが入力値より小さくなるようにします。これがIF()とです。
　重要になる九九表ですが、まず2つの数を掛けます。しかし、これでは10進法と変わりがないのでその値を入力した数で割り、その商を、そしてそのあまりを出させてつなげるだけです。簡単です。
　個人的な趣味で2桁目と1桁目を半角ダッシュでつなげています。
#配布
　下のリンク先で配布しています。
　ダウンロードしてお好きに使用してください。改変とか再配布とか自由ですが、自分が作ったと嘘を言って再配布することだけはやめてください。
　そして、重さが気になるのと面倒な事が理由でnに入れられる数は今のところ最大101までになっています。それ以上拡張したい人は自由にやってください。

https://www.dropbox.com/s/t0vbf3rsxnrdknv/n%E9%80%B2%E6%B3%95.xlsx?dl=0
Wio LTEに複数のI2CなGroveモジュールを繋げる

Wio LTEにはI2CのGroveコネクタが一つありますが、複数のI2CのGroveモジュールを繋げたいことがあると思います。
I2Cの通信規格はバスのため、複数のデバイスを一つのI2Cマスタに接続することができます。
ちなみにI2CはInter-Integrated Circuitの略でIICです。なので2は2乗です。
アイツーシーと読んでもだいたい通じますが、正確にはアイ・スクエアド・シーです。
（テンションが上がったときは[ｱｲｽｷｬｼｨｨｨｨｲ！](https://twitter.com/tedd_okano/status/507422934105747456)と読んでください。

#I2Cハブ
I2CのGroveモジュール用に複数のモジュールを繋げられるI2Cハブというものがあります。

https://www.switch-science.com/catalog/796/

これを使えば３つまでI2CなGroveモジュールを繋げられます。

#注意点
どのモジュールも複数繋げられるわけではありません。
以下の注意点を確認する必要があります。

- 電圧が一緒 
  - 電源や信号レベルの電圧は統一しないといけません。
- アドレスが異なる
  - Wio LTE（I2Cマスタ）はアドレスで通信する対称のモジュールを決めるので、同じアドレスを持っているモジュールは使えません。
- プルアップ抵抗値
  - I2Cのプルアップ抵抗はだいたい2.2～10KΩの範囲で使用しないとうまく動きません。そのため、モジュール側でプルアップ抵抗が取り付けられているものは合計の抵抗値を気を付ける必要があります。

#動作確認
[以前の記事](https://qiita.com/jksoft/items/58cdd899212ef2d5a1aa)で紹介したGrove化した紫外線センサ VEML6070と同じくGrove化したBME680をI2Cハブ経由で接続します。（BME680は有名なBME280の上位のセンサで、気温、湿度、気圧に加え空気の汚染度が計測できるセンサです。）
両方ともアドレスが異なり、電圧は一緒です。プルアップ抵抗はもともと複数のデバイスが繋げられるように決めているので問題ありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/6efabd12-76d2-06ff-75fe-fd34c2190643.png)

シリアルモニタを確認するとUV light levelがUV紫外線センサの値で、そのほかがBME680のセンサ値です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/109992/01dfcfc7-de14-af5f-a9f7-728899d9aeef.png)

#スケッチ
スケッチはただ両方の動作確認したプログラムを合わせただけです。

```Arduino
#include <WioLTEforArduino.h>
#include <Wire.h>
#include "Adafruit_VEML6070.h"
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME680 bme; // I2C
Adafruit_VEML6070 uv = Adafruit_VEML6070();
WioLTE Wio;

void setup() {
  Wio.Init();
  Wio.PowerSupplyGrove(true);
  delay(3000);
  SerialUSB.println(F("BME680 test"));

  if (!bme.begin()) {
    SerialUSB.println("Could not find a valid BME680 sensor, check wiring!");
    while (1);
  }
  // Set up oversampling and filter initialization
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150); // 320*C for 150 ms
  
  SerialUSB.println("VEML6070 Test");
  uv.begin(VEML6070_1_T);  // pass in the integration time constant
}


void loop() {
  SerialUSB.print("UV light level: "); SerialUSB.println(uv.readUV());
  
  if (! bme.performReading()) {
    SerialUSB.println("Failed to perform reading :(");
    return;
  }
  SerialUSB.print("Temperature = ");
  SerialUSB.print(bme.temperature);
  SerialUSB.println(" *C");

  SerialUSB.print("Pressure = ");
  SerialUSB.print(bme.pressure / 100.0);
  SerialUSB.println(" hPa");

  SerialUSB.print("Humidity = ");
  SerialUSB.print(bme.humidity);
  SerialUSB.println(" %");

  SerialUSB.print("Gas = ");
  SerialUSB.print(bme.gas_resistance / 1000.0);
  SerialUSB.println(" KOhms");

  SerialUSB.print("Approx. Altitude = ");
  SerialUSB.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  SerialUSB.println(" m");

  SerialUSB.println();
  delay(2000);
}

```

#最後に
今回はオフィシャルのGroveモジュールは使用しませんでしたが、さまざまなモジュールが出ているので試してみたいと思います。
ただ意外とアドレスが同じ場合があるので注意が必要です。
Visual Studio Code の CSS を見やすくカスタマイズしてみました

### はじめに

Visual Studio Code のアップデートにより、本記事の情報が有効ではなくなってしまったようですので、あらためて色々調べて使ってみまして、[Visual Studio Code の CSS を見やすくカスタマイズしてみました (2)](https://qiita.com/08thse/items/a4d5da6cc60a0ebee615) にて公開しました。

### 以下、Obsolete ですが残しておきます。

普段、Visual Studio Code を Markdown エディタとして利用していますが、見出し (特に、h2 と h3) がちょっと判別しにくいのが気になっていました。

基本的には CSS をいじれば良い、ということで、自分好みにカスタマイズしてみました。

## Markdown Preview

プレビュー画面の CSS は、ユーザー設定の `markdown.styles` で、読み込ませる CSS を指定ができます。

```
"markdown.styles": ["C:\\Users\\<ユーザー名>\\.vscode\\md_preview.css"]
```

のように指定しておいて、`md_preview.css` には下記のように記述しました。

```.css
h1 {
	padding-bottom: 0.3em;
	line-height: 1.2;
	border-bottom-width: 1px;
	border-bottom-style: solid;
	border-bottom-color: whitesmoke;
}

h2 {
	padding-bottom: 0.3em;
	line-height: 1.2;
	border-bottom-width: 1px;
	border-bottom-style: solid;
	border-bottom-color: whitesmoke;
}

h3 {
	text-decoration: underline;
}
```

そうすると下記のようなプレビューになります。好みは分かれるかもしれませんが、個人的にはかなり見やすくなりました。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/218221/cff2dece-8c9e-7035-d8a5-11b8b0af7974.png)

## Markdown PDF

拡張機能である `Markdown PDF` もカスタマイズしてみました。

こちらは、下記のファイルで変更ができます。別にファイルを指定できるっぽいですが、生ファイルを変更しちゃいました。

`C:\Users\<ユーザー名>\.vscode\extensions\yzane.markdown-pdf-0.1.7\styles\markdown.css`

こちらも同様に、下記のように記述。

```.css
h1 {
	padding-bottom: 0.3em;
	line-height: 1.2;
	border-bottom-width: 1px;
	border-bottom-style: solid;
	border-bottom-color: whitesmoke;
}

h2 {
	padding-bottom: 0.3em;
	line-height: 1.2;
	border-bottom-width: 1px;
	border-bottom-style: solid;
	border-bottom-color: whitesmoke;
}

h3 {
	text-decoration: underline;
}
```

スクリーンショットは割愛しますが、プレビューと同じような感じで大分見やすくなりました。

### 参考にさせていただいたサイト

https://latele.co.jp/blog/tools/2017/0227_16
RealmObjectのpublicフィールドをデータバインディングで使っていると、androidTestビルドできない

## ハマった

ここ最近は、Realmもデータバインディングもそこそこよく使われているので、

```java
class Message extends RealmObject {
  @PrimaryKey public long id;
  public String title;
  public String body;
}
```

みたいなモデルがあって

```xml
  <TextView
    id="@+id/message_title"
    text="@{message.title}"
```

みたいな感じでデータバインディングするケースはよくあると思います。

これに、最近あんまり使われてない気がしてるInstrumented Unit Test（androidTestビルド）が組み合わさると

```
:app:mergeDebugAndroidTestAssets
:app:transformClassesWithRealmTransformerForDebugAndroidTest FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformClassesWithRealmTransformerForDebugAndroidTest'.
> javassist.CannotCompileException: [source error] realmGet$title() not found in xx.yy.zz.Message

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 2 mins 43.678 secs

```

みたいなコンパイルエラーになります。

## 調べてもなぜかそれっぽい情報は出てこない？

https://github.com/realm/realm-java/issues/2936 が全く同じエラーっぽいなー
でも違うな―

よくわからん。

って感じでした。

## getter/setterなら大丈夫！

```java
class Message extends RealmObject {
  @PrimaryKey public long id;
  private String title;

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String body;
}
```

みたいなモデルにして

```xml
  <TextView
    id="@+id/message_title"
    text="@{message.getTitle()}"
```

ならコンパイル通った。なんで？？
Google認定プロフェッショナル データエンジニア試験

前回の記事 : [Google認定プロフェッショナル クラウドアーキテクト試験](https://qiita.com/onooooo/items/86659d3f15b9ab25c0fe)

##データエンジニア試験に合格しました
今年度の本命、[Google認定プロフェッショナル データエンジニア試験](https://cloud.google.com/certification/data-engineer?hl=ja)に合格しました。
先月受けたクラウドアーキテクトとくらべてもさらに~~マニアックで~~情報が少なく、難易度も高い試験。
はじめてこの試験の存在を知った時は合格なんて不可能、高嶺の花と思っていましたが、努力の甲斐があって合格までこぎつけることができました。
あいかわらず結果は合否のみで点数や正解率が分からないので、どの程度できたのかは不明。。

#自分のスペック
- AWS認定 アソシエイト３つ、プロフェッショナル２つ
- AWSの経験 一年ちょっと。
- GCP認定 クラウドアーキテクト
- GCPの業務経験なし。試験勉強のため触る程度。
- 純粋なインフラ屋なのでビッグデータや機械学習の業務経験なし。
- TensorFlowは全く経験なし。今回初めて勉強した。
- 機械学習(ディープラーニング含む)については本を読むなどして以前から独学中。
- [日本ディープラーニング協会 G検定](http://www.jdla.org/business/certificate/#education)（先日合格しました）

#試験概要
- 120分
- 50問
- 200ドル

#勉強方法

##[Data Engineering on Google Cloud Platform Specialization](http://www.zkai.co.jp/home/coursera/course/gcd.html)
Google公式の、データエンジニア試験に対応しているCourseraのコース。
ストレートすぎるコンテンツです。自分の場合はこれに尽きる、と言って良いでしょう。

難点は、、、

- 高い！（4万円ほど）
- 英語！

###コスト
学習開始時の受験者のスキルによるところですが、自分の場合はほとんど何もないところからのスタートだったので、覚悟を決めてこの講座に賭けることにしました。

Z会経由での購入とCourseraからの直接購入の2つの方法がありますが、私の場合はZ会経由での購入にしました。
理由は

- 何らかの問題が発生したときに日本語が通じる相手がいい
- Z会経由のほうが高そうに思えるが、実際にはほとんど負担額がかわらない。
- [こちら](http://www.zkai.co.jp/home/coursera/index.html)の中盤に説明がありますが、Z会経由で購入したほうが長期間に渡って受講できるっぽいことが書かれています。この講座にも当てはまるのかはよくわかりません。。

バラで購入しても全コース一括購入でも支払総額が変わらないので、1つずつ購入しました。
途中で挫折したときの被害が小さくなるように・・・。←覚悟を決めてない。

###英語
自分は英語のスキルはあまりありません。
Googleスプレッドシートに英語の字幕をはりつけて、Google翻訳（GoogleTranslate関数）を駆使しながら少しずつ学習しました。
あとは「お金を払ったのだからモトはとらないと…」という貧乏根性で乗り切りました。

##[海外の試験レポート](http://priocept.com/2017/01/23/google-cloud-certified-data-engineer-beta-exam-report/)
ベータ版の試験のレビューっぽいですが、すごく参考になります。
ここまで書いていいのか・・・？というくらい。

##[ユースケース](https://cloud.google.com/certification/guides/data-engineer/?hl=ja#sample-case-study)
クラウドアーキテクト試験と同様に、ユースケースは前もって目を通しておきます。

#まとめ
Google Cloud Platform が一般に受け入れられて、資格の価値が高まることを期待します。
あとはGoogleがこれらの資格をコロコロ変更しないことを祈る・・・
好きなカップは？

# は?
これを質問された時、一瞬困惑しました。
意味を理解するのに30秒程掛かりました。

# 回答
結論は、

```bash:回答
echo $(echo A B C D E F G H | sed 's/ /\n/g' | sort -R | head -n1)カップ
```

としました。

ではこれを解剖し、意図を示しながら解説していきましょう。

# 解説
## サブシェル
`$(...)`はサブシェルと言われ、`...`内のコマンドの結果を展開する構文です。
`...`に相当する文は、`echo A B C D E F G H | sed 's/ /\n/g' | sort -R | head -n1`ですね。

## リダイレクト
全てのコマンドは`|`(パイプ)で連結されています。
これは、リダイレクトと言われ、パイプの前のコマンドの出力を、パイプの後の入力として渡す構文です。

## 初期データ
何かを表示、使用するには、それの元となるデータが必要なので、それを与えます。
初期データは、`A~H`にしたかったのですが、`seq`のアルファベット版が無いような気がしたので、`echo`と`sed`で生成します。あったら教えて下さい。

まず、`echo A B C D E F G H`でスペース区切りの`A~H`を出力します。
次に、`sed`(文字列を置き換えるコマンド)でスペースを改行に変換します。
今回の変換(引数)は`s/ /\n/g`ですね。
最初の`s/`はおまじないのようなものなので解説はしません。
次に、スペース一文字が続きますが、これは置き換え元を表します。`ABC`にすると、`ABC`を置き換えてね、となります。
次には`/`(スラッシュ)が来ます。これは、置き換え元と置き換え後の文字列の区切りとなります。
この後に続く`\n`は、改行を表します。改行は、これ以降のコマンドの区切りとして使われます。
最後の`/g`もまたおまじないのようなものです。`/`だけにすると最初のスペースになります。

## データをいじる
ここまでで、改行区切りの`A~H`が得られました。
これを、いじります。
`sed`の出力の送り先は`sort -R`ですね。
`sort`と聞くと、並び替えと思われますが、`sort -R`は違います。[^1]
**順番をランダムにします。**

つまり、`sort -R`によって、何がどこにあるか分からなくなりました。

`sort -R`の結果は、`head -n1`に渡されます。
`head`は入力からN行だけ持ってくる、という事ができます[^2]。
`-n1`によって行数が指定されており、スペースを省いているので分かりにくいですが、最初の1行を持ってきてね、と指示しています。

ここで、サブシェルの内容は終わりです。

## 出力
先程のサブシェルと`echo`で簡潔に。
ただし、`カップ`を足すのを忘れずに。[^3]

最終的にこのコマンドは、`Aカップ`...`Hカップ`のいずれかをランダムで出力するものである事が分かります。

# 使用例

<blockquote class="twitter-tweet"><p lang="cs" dir="ltr">echo $(echo A B C D E F G H | sed &#39;s/ /\n/g&#39; | sort -R | head -n1)カップ<a href="https://twitter.com/hashtag/%E3%82%B7%E3%82%A7%E3%83%AB%E8%8A%B8?src=hash&amp;ref_src=twsrc%5Etfw">#シェル芸</a></p>&mdash; Inverted nao20010128nao (@2ndLesmi) <a href="https://twitter.com/2ndLesmi/status/949193418562879489?ref_src=twsrc%5Etfw">January 5, 2018</a></blockquote>


-----

[^1]: `sort`そのままでは確かに昇順に並び替えてくれます。
[^2]: `head`の逆は`tail`であり、これは末尾N行だけ持ってくることができます。
[^3]: 引用符を付け、`echo "$(...)カップ"`としても良いと思います。
IPv6アドレスよりもIPv4アドレスを優先して名前解決したい

# 背景
自宅のWindows 10で検証環境サーバの名前解決をしようとすると、IPv6アドレスで名前解決しようとしている状態になった。
検証環境サーバはIPv4オンリーのため結果的に名前解決ができずアクセスできない。

>***nslookup（DNSサーバ指定なし）***
>C:\>nslookup rhel7.mylab.local
>サーバー:  UnKnown
>Address:  2404:1a8:7f01:d::3
>
>*** UnKnown が rhel7.mylab.local を見つけられません: Non-existent domain
>
>***nslookup（DNSサーバ指定あり）***
>C:\>nslookup rhel7.mylab.local 192.168.10.251
>サーバー:  rhel7.mylab.local
>Address:  192.168.10.251
>
>名前:    rhel7.mylab.local
>Address:  192.168.10.251
>
>***ping***
>C:\>ping rhel7.mylab.local
>ping 要求ではホスト rhel7.mylab.local が見つかりませんでした。ホスト名を確認してもう一度実行してください。

# 対処方法
クライアント（Windows 10）側でIPv6を無効にすると名前解決できるようになるんだけど、IPv6無効化以外に
何かないかなと思って探したら、WindowsのIPv6のプロパティでDNSサーバを『ffff::＜DNSサーバのIPv4アドレス＞』のように
指定するとnslookupは失敗するけど、pingでは疎通が確認できるようになった。

>***nslookup（DNSサーバ指定なし）***
>C:\>nslookup rhel7.mylab.local
>DNS request timed out.
>    timeout was 2 seconds.
>サーバー:  UnKnown
>Address:  ffff::c0a8:a01
>
>DNS request timed out.
>    timeout was 2 seconds.
>DNS request timed out.
>    timeout was 2 seconds.
>DNS request timed out.
>    timeout was 2 seconds.
>DNS request timed out.
>    timeout was 2 seconds.
>*** UnKnown への要求がタイムアウトしました
>
>***ping***
>C:\>ping rhel7.mylab.local
>
>rhel7.mylab.local [192.168.10.251]に ping を送信しています 32 バイトのデータ:
>192.168.10.251 からの応答: バイト数 =32 時間 =2ms TTL=64
>192.168.10.251 からの応答: バイト数 =32 時間 =3ms TTL=64
>192.168.10.251 からの応答: バイト数 =32 時間 =2ms TTL=64
>192.168.10.251 からの応答: バイト数 =32 時間 =4ms TTL=64
>
>192.168.10.251 の ping 統計:
>    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
>ラウンド トリップの概算時間 (ミリ秒):
>    最小 = 2ms、最大 = 4ms、平均 = 2ms

nslookupが失敗する理由がわからないけど、ブラウザで http(s)接続もできたのでとりあえずはこれで。
Jestで一部のReactコンポーネントだけテストする方法

#重要度の高いコンポーネントのみテストを書きたい！

開発しているうちに、いつの間にかReactコンポーネントがたくさんになっていた。
react-boilerplateを使っていたら、testファイルもコンポーネント生成コマンドで一緒に生成されるので、デフォルトでjestコマンドを走らせたら、すべてのコンポーネントがテスト対象となります。

https://github.com/react-boilerplate/react-boilerplate

#かといって、すべてのテスト書くのきついっす
コンポーネントの中にもこれだけは挙動を確認したい！というものあるはず！
一旦、一部だけのコンポーネントをテストしていって、後々、そんなに優先度の高くないコンポーネントのテストを
書いていけばええやないか！

#package.json
scriptを用意する。`--config`オプションをつけてjsonファイルでコンフィグを設定できます。（そもそもpackage.json内にdefaultのconfigがあるので、今回は別configファイルを読み込んでいます）

```json:package.json

  "scripts": {
    "test": "jest  --config ./test-config/jest-ui.config.json"
  }

```
#configの中身
-`testPathDir`でどのコンポーネントをテストしたいかを決めます（複数あれば、配列内に複数）。
-`moduleDirectories`でどこにモジュールがあるかを教えてあげる。

```json:./test-config/jest-ui.config.json
{
  "testPathDirs": ["app/components/GreetButton"],
  "moduleDirectories": ["node_modules", "app" ]
}
```
「ラズパイマガジン2016年8月号の差すだけで手軽に使える格安LCD 温湿度と天気予報を表示しよう」をやってみた

タイトルの通りやってみた
まずはLCDが動くかどうかサンプルファイルを実行し表示させてみる
本の通りにLCDをraspberrypi3に差しソフトをダウンロードしサンプルファイルを実行してみた
![NOKIA 5110.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/63e45757-f924-5a43-0d2b-61322c2781c4.jpeg)
左の一枚は本に紹介されているやつだが右の二枚はsampleフォルダにあったpythonを実行してみた
もちろんソースコードはnokia用に改造してある
改造する内容は本に書いてある通りだ
ハマりどころは無かった
素直に動いてくれた

・どうでもいい小言
秋葉原のaitendo直営店は綺麗でとても良い
スタッフは全て中国人だがとても親切に対応してくれる
これからもaitendoのような店舗が増える良いと思う
小言ここまで

天気予報のWEBサイトから得た天気予報と最高最低温度かつセンサーの値とLCDに表示させる
センサーを手配しようとしたらAM2321が入手不可能であった。そのためいちかばちか後継機種のAM2322を購入した。購入先は秋月である。接続図は本の通りにした
そしてpythonを実行したら本の通りになった
後継機種のAM2322でも動くことが分かった
めでたしめでたし
![天気.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/57be4ebd-b209-7f8d-2ab8-89b065ebed94.jpeg)

どうでもいい小言2
記事で紹介されているセンサーは記事にもある通り中国のメーカ品である
中国はモノづくり大国だ。日本は落ちぶれたものだ
ちなみに日本で入手不可のAM2321は「阿里巴巴」に売られている
画像はアリババのサイトをキャプチャしたものである。日本からも買うことは出来る
価格は￥表記になっているが日本円ではなく中国元である。現在のレートは1元が約17円である。よって日本円では約350円程だ
画像に深圳市と書かれてあるが深圳は世界最大の電気街である
秋葉原はゴミカスぐらいの存在価値になってしまう
電子工作マニアは是非行ってみると良い
また、ハマったときは中国のサイトにヒントがあることがある
日本で欲しいパーツが入手できないときは中国のサイトを見てみよう
日本はカスなので情報も物も手に入らないのだ
![am2321.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/19bd4f6f-cdb2-a6da-158f-8db5ea4413a9.jpeg)
VirtualBoxでBerry Linuxを入れてみようとしたが挫折した

# やりたいこと
- VirtualBoxでBerry LinuxをVDIにインストールし動かしてみたかった

# 環境
- ホストOS : Windows10
- VirtualBox 5.2.6
- Berry Linux 1.26

# 設定
- タイプ: Linux, バージョン: Fedora(64-bit)
- メインメモリー: 4096MB
- ストレージ
    - コントローラー: SATA
    - Berry Linux.vdi (可変サイズ, 16GB)
    - berry-1.26.iso
- それ以外はデフォルト

# 試したこと
- Berry OS (CDROM)を選択しライブ起動
- 左下のアイコンを選択しても「実行」「ログアウト」しか出ないが、デスクトップを右クリックし、「デスクトップの設定」から「高度な設定」タブの「デスクトップをクリックしたときウィンドウマネージャのメニューを表示する」にチェックを入れると、デスクトップを右クリックでメニューが表示されるようになるので、そこから「Berryのインストール」を選択
- インストール情報の作成でパーティションがないと怒られるので、fdiskで基本パーティションの作成
- フォーマットはext3を選択する
- インストールを開始し、フォーマットの途中で以下のようなエラーが。
![Berry1.PNG](https://qiita-image-store.s3.amazonaws.com/0/85081/38bf8255-0b09-3ff5-60e6-195a7fc05e82.png)
だが、内容を見てもエラーっぽくない気が、と思ったら、
![Berry2.PNG](https://qiita-image-store.s3.amazonaws.com/0/85081/dd78775d-bddf-8f1e-c099-9aa4576f08cf.png)
- mkfs.ext3でフォーマットしたときの文言と完全に一致した。
mkfs.ext3単体では成功するので、なぜここで止まってしまうかわからず手詰まりに。

- とりあえずちょっと触ってみたいだけなのだが、これではちょっとも触れないので、どうにかできないか知りたい。仮想環境ではダメなのだろうか・・・
npm install --save-devでパッケージがインストールできない

Node.jsに入門してハマった備忘録です。

# 環境
Windows10
npm 5.6.0
Node.js 8.9.4

# 事象：devDependenciesのパッケージがインストールされない
様々な初心者向けページの情報によると、`package.json`内の`devDependencies`の部分に列挙されるパッケージは、**「npmプロジェクトで作成したアプリケーションを ライブラリとしてインストールする場合には一緒にインストールされない（依存関係を解決しない）」**とある。

そのため、アプリケーション作成時においては`dependencies`も`devDependencies`も変わらず、

```
npm install --save hogehoge
```

でも

```
npm install --save-dev hugahuga
```

でも、ライブラリhogehogeとhugahugaがインストールされる。

されるはずなのだが、自分の環境では後者のhugahua、つまり**`--save-dev`オプションを付けるとパッケージがインストールされない。**一方で`package.json`は正しく更新されている。

```json:package.json
  "dependencies": {
    "hogehoge": "^4.16.2"
  },
  "devDependencies": {
    "hugahuge": "^6.26.0"
  }
```

# 原因は環境変数 NODE_ENV
色々調べたところ、環境変数`NODE_ENV`に`production`が設定されていることが原因だった。

```bat
>echo %NODE_ENV%
production
```

[公式マニュアル](https://docs.npmjs.com/cli/install)によれば、

>
With the --production flag (or when the NODE_ENV environment variable is set to production), npm will not install modules listed in devDependencies.


とのこと。つまり**`NODE_ENV=production`が設定されていると`npm install`時にdevDependenciesのパッケージはインストールされない。**


この状態で`devDepenencies`のパッケージもインストールする場合は、

```
npm install --save-dev hugahuga --dev
```

というように、`--dev`オプションを付ける。（正確には`--dev`はオプションではなくnpmの設定）

https://docs.npmjs.com/misc/config

# そもそもなんでNODE_ENV=productionになっているの？
これはよくわからなかった。

Atomエディタに**[atom-terminal](https://atom.io/packages/atom-terminal)**というプラグインを入れていて、`Alt+Shift+T`でプロジェクトRootからターミナルを開くことができる。このコマンドで開いた時だけ`NODE_ENV=production`となっていたのでAtomかプラグインの設定なんだろうけれど、突き止められなかった。
Markdownをインタラクティブにしてみた


## はじめに

- Google Chromeで動作確認しています。
- 他のWebブラウザでは動作確認していませんが、おそらく動きます。
- IEではおそらく動きません。

## モチベーション

脱ExcelのためにMarkdownを使うという話はよく聞きますが、
自分は、Excelの代わりとしてMarkdownを使うには力不足だなと感じていました。
なぜなら、Excelの一番の利点である数式が使えません。

なので、Excelの数式と同じくらい簡単に、
Markdownで簡単な数式が使えるようにならないかなと思って作ってみました。

## ソースコード

以下で公開しています(READMEもないですが。。。)

https://github.com/ikemo3/interactive-markdown

## 使い方

試すのがめんどくさい人は[GIF動画][]を見れば雰囲気はわかると思います。

### ブックマークレット

以下のJavaScriptを[ブックマークレット作成スクリプト][]などを使って、
ブックマークレットとして保存してください。

```
javascript:(function(){var script = document.createElement('script');script.type = 'text/javascript';script.src = 'https://dist.ikemo3.com/interactive-markdown/bundle.js?' + new Date().getTime();document.getElementsByTagName('head')[0].appendChild(script);})();
```

### デモ

このページに対して、ブックマークレットを使ってください。

- x: {{< variable name="x" >}}
- y: {{< variable name="y" >}}
- x \* y = `{{ xy }}`

```yaml:params
variables:
    x:
        value: 3
        type: number
    y:
        value: 4
        type: number
computed:
    xy:
        value: return this.x * this.y;
```

## 何をやっているか

- [Vue.js][]を使っています。
- code fence `params`をYAMLとして解釈して、variablesをデータ、computedを算出プロパティとして定義しています。
  - `{{``<`と `>``}}`で囲むことで、入力フォームが定義できます[^1]。
  - computedには、JavaScript式が書けます。
- evalを使うのはどうかと思ったので、Vue.jsは[CSP版][]、自前でevalしている箇所は[notevil][]に置き換えました。

## 何ができるか

原理的にはどのサービスでも動作可能可能です。
このスクリプトは[esa.io][]にも対応しています。

[Hugo][]で作った個人サイトにも組み込んでいます。
Hugoでは、code fenceの代わりにYAML Front Matterを使って、
テンプレートでVue.jsに渡す変数を定義しています。

デモでは触れていませんが、[Moment.js][]と、[sprintf.js][]を組み込んでいます。

## おわりに

個人でちまちまと作っているものですが、
スクリプトにするほど定型化されていない、手順書を書くのにちょうどよいです。

[^1]: Hugoのshortcodeと同じ書式です。

[esa.io]: https://esa.io/
[GIF動画]: https://gyazo.com/c603c0e7fdc930bfeb33a64653ca4dc5
[Hugo]: https://gohugo.io/
[Moment.js]: https://momentjs.com/
[notevil]: https://github.com/mmckegg/notevil
[sprintf.js]: https://github.com/alexei/sprintf.js
[CSP版]: https://github.com/vuejs/vue/tree/csp
[Vue.js]: https://jp.vuejs.org/index.html
[ブックマークレット作成スクリプト]: http://www.eonet.ne.jp/~wdf/software/bookmarklet_creator.html
[JavaScript][Node.js] eval を クロージャ で置き換えるサンプル

[eval](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval) は文字列をコードとして評価して実行する強力な仕組みです。
特にプログラムを動的に書いてそれを実行するプログラム（コードジェネレータの一種）を記述する際に重宝していました。

``` eval-sample.js
var fs = require('fs');
for (let i=0; i<10; i++) {
    /* プログラムを動的に生成 */
    var sub_program  = "function printValue() {¥n";
    sub_program     += "    console.log('value is " + i + "');¥n";
    sub_program     += "}¥n";
    sub_program     += "module.exports.exec = printValue;¥n";

    /* ファイルに保存 */
    var js_path = "./" + i + "_subpg.js"; // ./i_subpg.js
    fs.writeFile(js_path, sub_program, function(err) {
        if (err) { throw err; }
    });

    /* ファイルに記述したプログラムを eval で実行 */
    eva("var exec_program = require(" + js_path + "); exec_progmram.exec();");
    // value is 0
    // value is 1
    // value is 2
    // ...
    // value is 9
}
```

しかし、eval には呼び出し元の権限でコードが実行されるセキュリティ上のリスク、及びパフォーマンスが悪い（処理が遅い）という欠点があります。

そこで、 eval ではなく、クロージャでプログラムの動的生成と実行を置き換えます。

``` closure-sample.js
var fs = require('fs');
for (let i=0; i<10; i++) {
    /* プログラムを動的に生成 */
    var sub_program  = "function printValue() {¥n";
    sub_program     += "    console.log('value is " + i + "');¥n";
    sub_program     += "}¥n";
    sub_program     += "module.exports.exec = printValue;¥n";

    /* ファイルに保存 */
    var js_path = "./" + i + "_subpg.js"; // ./i_subpg.js
    fs.writeFile(js_path, sub_program, function(err) {
        if (err) { throw err; }
    });

    /* ファイルに記述したプログラムをクロージャで実行 */
    let execProgram = execProgramCreator(js_path);
    execProgram();
    // value is 0
    // value is 1
    // value is 2
    // ...
    // value is 9
}

function execProgramCreator(js_path) {
    return function execProgram() {
        var exec_program = require(js_path);
        exec_program.exec();
    };
}
```

クロージャを使うと、クロージャ生成時の変数の状態（上記のサンプルでは js_path ）をクロージャ実行時まで保持することができますので、グローバルを汚染することなく状態の保持を行うことができるメリットもあります。
Dialogflowのプロジェクトを引っ越しした

#Dialogflowのプロジェクトを引っ越しした
Dialogflowのプロジェクトを引っ越ししました。理由はActions on Googleとなぜかうまく繋がらなかったからです。Dialogflow > Actions on Google > Dialogflow のコンソールをいったりきたりしてました。こんなことを繰り返すくらいなら、プロジェクト作り直した方が早いと感じました。まぁ随分前に作ったプロジェクトだし、大きいアップデートもあったので、謎のエラーが起きても仕方が無いのかなと思っています。

##状況
既に以下のプラットフォームに対応しているけど「OK Google」したかった。

- 対応しているプラットフォーム
    - Facebook
    - LINE
    - Slack
- Fulfillment
    - 有り


##引越し作業

1.ZIPをエクスポートする
これでIntentとかの情報をごっそり出力できます

<img width="500" alt="Screen Shot 0030-01-25 at 22.25.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/7c47ef4e-d8e0-827d-d664-333ab986dd3d.png">

2.[Actions on Google](https://console.actions.google.com/u/0/)の画面でアプリを作る
今回の目的が確実にActions on Googleを使いたいのでActions on Googleの画面から作る。

3.ActionsでDialogflowを選択しBuild!!

4.するとDialogflowのAgent作成画面が出てくるのでいつも通りに作成

5.先ほど出力したファイルをRESTOREし、FulfillmentのURLも指定したら引っ越し完了♪

<img width="500" alt="Screen Shot 0030-01-25 at 23.04.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/114922/18b962d7-426b-2a6a-f20c-db3d5866cc6d.png">

##引越し後
引っ越ししたら、あっさりActions on Googleと繋がりました♪
Laravel5.5でマイグレーション手順

Laravelを使ってマイグレーション。テーブル更新時とかどうするんだっけ？とわからなくなるので、メモ。

* create table
* add column

## テーブル作成
　1. マイグレーションファイル作成

まずは、

```
$ php artisan make:migration create_posts_table
```
とコマンドに入力してマイグレーションファイル作成。
※テーブル名は複数形を使った方が良さそう。

すると、`database/migrations/`に、`{Y_m_d}_create_posts_table.php`が作成される。
この中のupメソッドに、作りたいテーブルの定義を書いていく。

　2. マイグレーション実行
マイグレーションファイルができたら、実行する

```
$ php artisan migrate
```
すると、データベースにテーブルができている。

## カラム追加
1. マイグレーションファイル作成

まずは、

```
$ php artisan make:migration add_column_comment --table=posts
```
とコマンドに入力してマイグレーションファイル作成。
すると、```database/migrations/```に、`{Y_m_d}_add_column_comment.php`が作成される。
この中のupメソッドに、追加したいカラムの定義を書いていく。

　2. マイグレーション実行
マイグレーションファイルができたら、実行する

```
$ php artisan migrate
```
すると、テーブルにカラムが追加されている。
某CTF(2018)のWriteUp 後半

[前半](https://qiita.com/todaemon/items/7dae7fcbd9832fcf259b) に続いて後半のWriteUpになります。
あいかわらず2018年新卒向けページが公開中なので、後半もパスワード文字列はぼかした感じにしときます。

# mondai6

![mondai6.png](https://qiita-image-store.s3.amazonaws.com/0/38926/7db32763-ea66-7f61-c0a5-1d5922a033aa.png)

mondai6.zipを回答すると上のようなpngファイルが得られます。
どこかで見た気がするのですが、コレダ！というのになかなかたどり着けなくて苦労しました。

このバーコードは、日本郵政が使用しているカスタマバーコードでした。※なぜか海外のバーコードの方に先にたどり着いてデコードできなくて苦労しました。
http://www.post.japanpost.jp/zipcode/zipmanual/p11.html

バーコードをデコードすると下記のような文字が得られます。
```
12125115459155211271
8313610
```
残念ながらこの数字の羅列はパスワードではありませんでした。
この数字をよく見てると、先頭から偶数番目が1-5の範囲にとどまっているのに気付き、2つの数字単位でひらがな変換してみると下記の文字列がえられます。

```
12 12 51 15 45 91 55 21 12 71 83 13 61
い い な お と ら の か い ま よ う は
```

なんか微妙なところがありますが、井伊直虎の戒名を聞かれております。
[Wikipedia:井伊直虎](https://ja.wikipedia.org/wiki/%E4%BA%95%E4%BC%8A%E7%9B%B4%E8%99%8E)で調べると、目的のパスワード文字列に出会うことができました。

# mondai7
mondai7.zipを解凍してできる mondai7.pcap をWiresharkに取り込んで、パケットをみてみると firestorage.jp に対してファイルをアップロードしているのが確認できます。

秘密資料20170127.docx というファイル名のバイナリデータを切り出して、ワードでひらくとグラフが見れますが、その横に白文字で下記の文字が埋め込まれており、その文字列がそのままパスワードになります。

# mondai8
今回、この問題が一番苦労しました。
mondai8.zipを開くとmondai8_pass_12345678というバイナリファイルとヒントファイルがあります。
ヒントファイルの中身は `get tag 42016` というのが確認できます。

バイナリファイルはLinux環境にて下記のコマンドでマウントします。

```bash
sudo losetup /dev/loop0 mondai8_pass_12345678
sudo cryptsetup --type tcrypt open /dev/loop0 hoge ### この後、対話式で、12345678 を入力します
sudo mount -r /dev/mapper/hoge /mnt

ls -l /mnt ### 15個のjpgファイルとかが確認できます。
```

ディスクの中身をダンプして、umountします。

```bash
sudo dd if=/dev/mapper/hoge of=/tmp/hoge

sudo umount /mnt
sudo cryptsetup --type tcrypt close hoge
sudo losetup -d /dev/loop0
```

さて本題のmondai9.zipを解凍するためのパスワード探しです。
タグで42016というと、EXIFタグの0xA420のImageUniqueIDが検索でかなりHitします。
このタグの値はASCIIで33文字なので、下記コマンドのようにPrintableな長めの文字列を探せばでてくると思ったのですが、それらしい値が取れません。。。

```bash
strings -n 30 /tmp/hoge
```

0xA4 0x20 が連続している箇所やエンディアンで逆になっている場合も調べてみましたが、この探索も不発でした。

testdiskコマンドで削除済みのjpgファイルを加えて、jpgのタグを探索しても0xA420のタグは見つかりません。

```bash
find /tmp/ -name "*.jpg" | xargs -i identify -verbose {} | grep -i unique
```

かなり時間を食ってしまったのですが、Canon独自のMakerNoteにImageUniqueIDというものがあるのを知り、下記のコマンドで検索したところHitしました。

```bash
find /tmp/ -name "*.jpg" | xargs -i metadata-extractor2 {} | grep -i unique

[Canon Makernote] Image Unique ID = 220 239 227 139 113 218 152 121 174 59 197 148 ??? ??? ??? ???
```
上記の数字列をHEX文字列化したものがパスワードになります。

# mondai9

```
n
39 238 58 181 46 259 14 127 28
40 181 41 235 226 15 16 40 131 181 259 29
```

mondai9.zip を回答すると、上記のようなテキストが書かれた mondai9.txt が得られます。
なんらかの暗号の様です。

特徴的な数字として8bitの最大値を超えた 259 が含まれているので、それを手がかりにしてみたのと、小松左京の小説で似たような暗号を知っていたこともあり、なんとなくひらめきました。

最後の問題なのでヒント程度にしておきます。
2行目の数字列は

```
くにたちのにし
```

と読みます。数字の数と文字数が一致しないのがこの暗号の面白いところですね。

# mondai10
kanto3 だけ画像じゃなくてURLが記載されたテキストでしたが、無事にSDカードの隠し場所画像を見ることができました。

![mondai10_pics.png](https://qiita-image-store.s3.amazonaws.com/0/38926/3293caa5-067d-6500-4be8-93833726edeb.png)

SDカードの中には本当のmondai10が入ってるらしいです。一度見てみたいものです。