OmniAICreator/Qiita-1.07M huggingface dataset:
WHERE句のサブクエリは大抵の場合テーブルJOINで代替できる 

WHERE句にあるサブクエリ時々見かけるんですが、対象のデータ件数が増えるにつれ速度低下のボトルネックになったり、後から追加された仕様に対応するため複雑な相関サブクエリが使われていて一見してなにをしているSQLなのかわからなくなったりしていることが経験上多い気がしています。

できる限りサブクエリをJOIN句に入れておくことで世の中が少し平和になったりしないかなと思いました。

# 対象条件の抽出

```sql
SELECT hoge 
FROM tblA
WHERE id IN (SELECT id FROM tblB WHERE piyo=1)
```

↓
 
```sql
SELECT tblA.hoge
FROM tblA
INNER JOIN tblB USING( id )
WHERE tblB.piyo=1
```

# 重複した行をとりたくない場合

```sql
SELECT tblA.hoge
 FROM tblA
WHERE id IN (SELECT DISTINCT a_id FROM tblB WHERE piyo=1)
```
 
↓

```sql
SELECT (DISTINCT tblA.a_id), tblA.hoge 
 FROM table
INNER JOIN tblB ON ( tblA.a_id = tblB.a_id)
WHERE tblB.piyo=1
```

※tblAのidに対するDISTINCTでSELECTの結果からは重複は除外されます。
※DISTINCTを後まわしにすることで性能面で問題が出るのではという心配もありますが、tblAとtblBのデータ件数や取得するフィールド数にもよりますが意外と重くはなりません。idに対してだけDISTINCTをかけるのがポイントだと思われます。


# INNER JOINではフォローできないケースはOUTER JOINでなんとかなる

```sql
SELECT tblA.hoge
FROM tblA
WHERE id IN (SELECT DISTINCT id from tblB where status=1)
   OR status=2
```

↓

```sql
SELECT DISTINCT tblA.*
FROM tblA
LEFT OUTER JOIN tblB ON (tblA.x_id=tblB.x_id)
WHERE tblB.status=1
   OR tblA.status=2
```

もしくはこれでも

```sql
SELECT DISTINCT tblA.*
FROM tblA
LEFT OUTER JOIN tblB ON (tblA.x_id=tblB.x_id AND status=1)
WHERE tblB.id IS NOT NULL
   OR tblA.status=2
```


# サブクエリで集計した結果からの条件指定

```sql
SELECT hoge, 
       piyo, 
       fuga, 
       (SELECT AVG(piyo) as avg_piyo
                   FROM tbl as tbl2
                  WHERE tbl1.fuga = tbl2.fuga)
  FROM tbl as tbl1
 WHERE tbl.piyo < (SELECT AVG(piyo) as avg_piyo
                   FROM tbl as tbl2
                  WHERE tbl1.fuga = tbl2.fuga);
```

↓

```sql
SELECT tbl1.hoge, 
       tbl1.piyo, 
       tbl1.fuga, 
       tbl2.avgPiyo
 FROM tbl
 INNER JOIN ( 
      SELECT fuga, AVG(piyo) avgPiyo FROM tbl GROUP BY fuga
 ) avg USING ( fuga )
WHERE piyo >= avg.avgPiyo
```

JOIN句に入れておいた喜びを最も感じるケース。

以上、ご参考になりましたら嬉しいです。
「deb」と「deb-src」の違いについて

サーバーエンジニア超初心者です。

Ubuntuに最新のnginxをインストールする方法の1つとして、以下のように公式nginxをリポジトリに追加する方法があります。

(1) nginxサイトが配布するPGPキーを追加
curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

(2) リポジトリを一覧に追加
VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"

VCNAME=`cat /etc/lsb-release | grep DISTRIB_CODENAME | cut -d= -f2` && sudo -E sh -c "echo \"deb-src http://nginx.org/packages/ubuntu/ $VCNAME nginx\" >> /etc/apt/sources.list"

(3) アップデート後、nginxをインストール
sudo apt-get update

sudo apt-get install nginx


その中で、(2) リポジトリを一覧に追加で、なぜ2回追加するのかがわかりません。
違いは、URL前の「deb」と「deb-src」なのですでが、わかりやすく教えていただければ助かります。

※nginx社が用意しているインストール用のURLには、OSのバージョンが含まれており、OSごとにURLが違うなんて面倒！なので、VCNAMEという名前でOSのバージョンを無理やりとって、それでURLの文字列をつくってsources.listに追加していると認識しています。
developmentでアプリの起動時にキャッシュの値がnilになる

development環境でアプリケーション起動時に実行されるinitializerの中でキャッシュを取得しようとすると、値があろうとなかろうと必ずnilになります。

```rb
# どのinitializerでもOKです。config/application.rbでもOK
# initializer/application_controller_renderer.rb

# Be sure to restart your server when you modify this file.
binding.pry
```

```shell-session
    284: def load(file, wrap = false)
    285:   result = false
    286:   load_dependency(file) { result = super }
 => 287:   result
    288: end

[1] pry(#<RecruitSystem::Application>)> Rails.cache.write(:foobar, "foobar")
=> true
[2] pry(#<RecruitSystem::Application>)> Rails.cache.exist?(:foobar)
=> false
[3] pry(#<RecruitSystem::Application>)> Rails.cache.read(:foobar)
=> nil
```

これはdevelopmentのconfig.cache_storeが:null_storeになっているからです。


```rb
# config/environments/development.rb
# 一部省略

  if Rails.root.join('tmp', 'caching-dev.txt').exist?
    config.cache_store = :memory_store
  else
    config.cache_store = :null_store
  end
```

ただ、起動時じゃなくてコントローラーで使うとnilになりません。値が取得可能です。:null_storeはexist?が毎回falseを返すストアの様です。

http://api.rubyonrails.org/v5.1.4/classes/ActiveSupport/Cache/NullStore.html

なぜこの様な挙動になるかと言うと、ドキュメントにもある通り`ActiveSupport::Cache::Strategy::LocalCache`を利用していて、LocalCacheがRackのmiddlewareをとして実装されているからです。

https://github.com/rails/rails/blob/04b6e71d8f45a5436da8206a9e09ea0017091111/activesupport/lib/active_support/cache/strategy/local_cache_middleware.rb#L26

ミドルウェアについて
https://railsguides.jp/rails_on_rack.html

私もまだミドルウェアについてはざっくりとした雰囲気しかわかってませんが、上記挙動を見る限り:null_storeはリクエストの処理が入った時のみ想定した挙動になる様です。

ちなみに、先ほどのconfig/environments/development.rbを参考にconfig.cache_storeを:memory_storeに変更すると、initializerでもキャッシュの内容を取得できる様になります。

```shell-session
touch tmp/caching-dev.txt
```

initializerはアプリケーションの起動時に一回だけ実行されるので、通常キャッシュしたデータを使う必要はないのですが、今回は値の取得を全て同じインターフェース（メソッド）で行いたいと思いこの問題に遭遇しました。

リクエストがトリガーになるので、`rails console`を起動した中でも同じ状況になります。？？？と思うこともあると思いますので共有致しました。
PHPのコマンドライン引数処理ライブラリ集

雑に GitHub プロジェクトへのリンクだけ集めました

## 単体利用できる CLI フレームワーク

* [symfony/console: [READ-ONLY] Subtree split of the Symfony Console Component](https://github.com/symfony/console)
* [zendframework/zend-console: Console component from Zend Framework](https://github.com/zendframework/zend-console)
* [auraphp/Aura.Cli: Command-Line Interface tools](https://github.com/auraphp/Aura.Cli)

## optparse/argparse 系

* [getopt-php/getopt-php: A PHP library for command-line argument processing](https://github.com/getopt-php/getopt-php)
* [dnoegel/php-argparse: Phargparse: PHP argument parser](https://github.com/dnoegel/php-argparse)
* [voidpirate/php-argparse: PHP command line argument parser](https://github.com/voidpirate/php-argparse)
* [CHH/optparse: Another Command Line Argument Parser](https://github.com/CHH/optparse)
* [Console_CommandLine/ex1.php at master · pear2/Console_CommandLine](https://github.com/pear2/Console_CommandLine/blob/master/examples/ex1.php)
* [palmtreephp/argparser: Parse arguments to call matching setter methods and/or merge with some defaults](https://github.com/palmtreephp/argparser)
* [hfcorriez/php-argparser: ArgParser for PHP](https://github.com/hfcorriez/php-argparser)
* [webdevxp/argvparser: Command-line argument parser](https://github.com/webdevxp/argvparser)

## docopt

* [docopt/docopt.php: Command line argument parser](https://github.com/docopt/docopt.php)

## わからん
* [malenkiki/argile: Create, get, write arguments and help for your CLI PHP apps…](https://github.com/malenkiki/argile) 用語が独特
* [splitbrain/php-cli: PHP library to build command line tools](https://github.com/splitbrain/php-cli) DokuWikiの作者

再発明された車輪の展覧会みたいになってしまった。
C++ Builder XE4, 10.2 Tokyo > TForm > 複数のフォームのコンストラクタとOnCreate()の実行順番

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

一つのユニットの処理を、将来の保守容易性のために複数のユニットで処理するように変更している。
その作業の結果、以下のエラーが出るようになった。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ef3274fd-2df3-e539-d81d-d912ae6cc258.png)

原因を追うと、一つのユニットのコンストラクタが動く前に、別のユニットのOnCreate()が動き、変数の初期化がされる前に使用されていることが分かった。

確認のため、三つのフォームに関して、コンストラクタとOnCreate()の実行順番を見てみる。

### 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)
{
	String msg = L"Form1 ctor " + Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz");
	OutputDebugString(msg.c_str());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	String msg = L"Form1 OnCreate " + Now().FormatString(L"yyyy/mm/dd hh:nn:ss.zzz");
	OutputDebugString(msg.c_str());
}
//---------------------------------------------------------------------------
```

Unit2とUnit3も同様に実装した。

### 結果

```txt
デバッグ出力: Form1 ctor 2017/11/07 18:26:07.829 プロセス Project1.exe (4824)
デバッグ出力: Form1 OnCreate 2017/11/07 18:26:07.830 プロセス Project1.exe (4824)
デバッグ出力: Form2 ctor 2017/11/07 18:26:07.835 プロセス Project1.exe (4824)
デバッグ出力: Form2 OnCreate 2017/11/07 18:26:07.836 プロセス Project1.exe (4824)
デバッグ出力: Form3 ctor 2017/11/07 18:26:07.843 プロセス Project1.exe (4824)
デバッグ出力: Form3 OnCreate 2017/11/07 18:26:07.844 プロセス Project1.exe (4824)
```

Form1のOnCreateにおいてForm2の処理を使うような実装をした場合、Form2のコンストラクタの前に実施されて、冒頭のエラーになる。

OnCreate()の処理を見直すか、コンストラクタでなく別の初期化処理を最初にコールするなどの対応はした方が良さそう。

### 実施した対応

OnCreate()の処理を一部やめて、メイン画面のOnShow()からコールするように変更した。

隠しフォームはOnShow()が実施されないため、OnShow()が実施されるメイン画面からコールする、という方法は時々使う。
Cognos Analytics 11.0.8 新機能紹介

#概要
毎度おなじみCognos Analyticsの新リリースの新機能紹介です。
今回は、2017/11/5にリリースされた11.0.8の新機能を抜粋してご紹介します。

#新機能一覧(抜粋)
##レポートの機能
レポートを実行した際の、デフォルトの挙動を指定する事ができるようになりました。
保存済みの最新レポートの実行、最新のデータでレポート実行、編集、などです。
元々Cognos BIにあった機能ですが、Cognos Analyticsで使えるようになりました。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/59d63c58-d887-a596-f1ce-4f0d114bfb50.png)

レポート実行時の形式のオプションで、XMLタイプを選択できるようになりました。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/29f74b37-a539-d4a0-c813-65a5e40686a9.png)

画像ファイル群をZIP化して、Extensionとして登録しておく事で、レポートの「画像」のアイテムから呼び出せるようになりました。個別にサーバー上にgifやpngファイルを配置する必要が無くなったという事です。
レポートの機能だけでなく、ダッシュボード、ストーリーの機能でも使用できます。
クラウド運用を意識しての機能ですかね。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3490fd80-da41-8844-478d-b8e3a8e40de9.png)

レポートの「マップ」の機能で、緯度・経度の使用ができるようになりました。
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/322a88b6-640a-ddcb-0a80-e6b7175ea17c.png)

こちらに詳細投稿しました
**Cognos Analytics 11.0.8 新機能 - 地図で緯度・経度サポート**
https://qiita.com/shinyama/items/6e1a783470ce69f02389

##データ・モジュール
ダイアグラムの中で、カーディナリティの表示ができるようになりました。
また、選択したテーブルに対する関係のステップ数を指定でき、関係の近いテーブルのみをハイライトして表示できるようになりました。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b5d7c16b-6c67-f8ce-cb8b-44e35204e4c9.png)

##データ・セット
データ・セットを作成する際は、11.0.7まではデータアイテムをキャンバスに配置するとデータの中身が表示され、実際にクエリーが発行されていましたが、11.0.8からはデザイン・ビュー(Page Design)が導入され、実際のデータ取得をせずにデータアイテムが配置できるようになりました。データ・セット作成が、ストレス無くできるようになりました。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d64ec206-7fc7-e3b1-9425-f224af87a462.png)

##ストーリー
ストーリーの機能で、タイミングを指定して、フィルターをかける事ができるようになりました。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/df7ae77a-d0d0-d28e-6a39-e45f98a8d680.png)

ストーリーの再生の方式として、「Play all scenes」と「Loop」を指定できるようになりました。
通常ストーリーの再生は、1シートが終わると、プレゼンターが次のシートを指定しないと先に進みませんでしたが、「Play all scenes」を指定しておくと、勝手に次のシートに進みます。
「Loop」は繰り返しなので、この機能も組み合わせてONにすると、全シートのプレゼンテーションを繰り返し流しておく様なストーリーの見せ方ができます。
![009.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/66acc239-bbd2-e017-3bda-a0aa5ebaef13.png)

##管理
自分が設定しているスケジュールの一覧を確認し、管理できるようになりました。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f6febdf1-a9be-fe4f-23ba-f4beaf21f2ee.png)

#参考情報
**Introducing Cognos Analytics 11.0.8**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/introducing-cognos-analytics-11-0-8/
Outlook 2016 for MacでOffice 365の自動検出リダイレクト警告を非表示にする方法

# 解決したい事象
- Outlook 2016 for MacでOffice 365に接続する。
- [予定表]－[共有の予定表を開く]からユーザ追加した際に、以下のポップアップが表示される。
- ユーザ追加毎に表示されうっとおしいので、このポップアップを以降非表示にしたい。

<img width="420" alt="ss 2017-11-07 17.57.22.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/164652/4d09da3f-39ac-bc75-7196-99f7868e0d4f.jpeg">

# 前提条件
- Outlook 2016 for Macのバージョンが**15.29.0**以降であること。
- 15.29.0以前のバージョンであるならば、[コチラ](https://support.office.com/ja-jp/article/%E6%9B%B4%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B-bfd1e497-c24d-4754-92ab-910a4074d7c1)を参考にバージョンアップする。

# 対処
1. Outlook 2016 for Macを起動している場合は終了する。
1. 「Terminal」を起動する。
1. `defaults write com.microsoft.Outlook TrustO365AutodiscoverRedirect -bool true` と入力し、[Enter]を押下する。
1. 「Terminal」を終了する。

# 参考
[Outlook 2016 for Mac で Office 365 の自動検出リダイレクト警告を非表示にする方法](https://support.microsoft.com/ja-jp/help/3206915/how-to-suppress-the-office-365-autodiscover-redirect-warning-in-outloo)
Python のコマンドライン引数ライブラリまとめ

Python のコマンドライン引数ライブラリの主なものを表にしました。

|ライブラリ名 |Python同梱|型変換|デフォルト値|自動ヘルプ|位置引数|サブコマンド|
|---------|-------|-------|---------|--------|-------|---------|
|getopt   |1.4〜  |       |:ok:  |            |    |   |
|optparse |2.3〜  |:ok:   |:ok:  |オプションのみ |   |   |
|argparse |2.7〜 3.2〜 |:ok:   |:ok:  |:ok:        |:ok:  |:ok:  |
|docopt   |       |       |明記   |手動ヘルプ、ていうか設定が自動 |:ok: |手動 |

現在は実質、argparse か docopt の二択ですね。

元は、`python -V` とか `mysql --version` みたいな、コマンドラインオプションを `argv` から切り分けるために C の getopt を借用。その後、使いやすさを向上させる、optparse が採用されました。

が、そもそも機能的なサポートがオプション引数だけでいいのか、ということで、`mv <form> <to>` みたいに順序で指定する通常のコマンドライン引数までカバーできる argparse の導入。

ここまでは Python に同梱されるライブラリの世界。こういう感じ:

```py
import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument(
    'integers',
    metavar='N',
    type=int,
    nargs='+',
    help='an integer for the accumulator'
)
parser.add_argument(
    '--sum',
    action='store_true',
    help='sum the integers (default: find the max)'
)

args = parser.parse_args()
if args.sum:
    print(sum(args.integers))
else:
    print(max(args.integers))
```

```shell-session
$ python argparse-test.py -h
usage: argparse-test.py [-h] [--sum] N [N ...]

Process some integers.

positional arguments:
  N           an integer for the accumulator

optional arguments:
  -h, --help  show this help message and exit
  --sum       sum the integers (default: find the max)

$ python argparse-test.py 1 2
2

$ python argparse-test.py 1 2 --sum
3
```

argparse までくるとけっこう高級化していて、使いこなすのがたいへん。けど、こんな高級なのでも今の Python になら最初から同梱されてるので、ライブラリバージョン間で仕様がぶれる心配がなく、マニュアルもちゃんとある安心感はありがたいです。

この機能性向上に対して、ちょっと別角度から面白いのが [docopt](http://docopt.org/) です。

```py
"""Usage: docopt-test.py [-h] [--sum] N [N ...]

Process some integers.

Arguments:
  N           an integer for the accumulator

Options:
  -h, --help  show this help message and exit
  --sum       sum the integers (default: find the max)
"""
from docopt import docopt

args = docopt(__doc__)  # __doc__ は現在のソースに対応する doc ブロックの内容
integers = map(int, args.get('N'))
if args.get('--sum'):
    print(sum(integers))
else:
    print(max(integers))
```

ドキュメント文字列をパースして引数解釈の仕様を起こす感じ。「仕様を書くだけでコードになる」 を地でいっててかっこいいですね。

実行しなくてもヘルプが読めるので、GitHub なんかの上でも、どういうツールかがわかります。別途ドキュメントを書かなくても、というか、動きと一致した正しいドキュメントを書かないと成り立たない、ので、後から追加した隠しオプションのドキュメントがなくて忘れられていたとか、なくなりそう。

まあ、 `map(int, args.get('N'))` みたいに、型変換などの高級な機能は手動でしてやらないと、なんせ doc には書けないので。って感じで、機能の量でいけば argparse の置き換えとしては役不足ですが。 (ま、入力データは文字列、バリデーションはバリデーションのライブラリで、ってなってても、Web屋の自分にはしっくり来るけど)

自分が気に入ったのは docopt の書式が各言語間で共通だということ。

https://github.com/docopt

最初 Python で書いておくけど、後からそのままの仕様で Go や Rust で実装したり、あるいは既存 Web システムとの協調性を意識して PHP や Ruby に同じインターフェースで移植したり、ありますよね。
別ドメインのwebサイトをリバースプロキシで統合する方法

#目的・条件
- 複数の（サブ）ドメインのwebサイトを運営している。
- クライントからは一つの（サブ）ドメインのwebサイトに見えるように統合したい。
 - 例：メインのwebサイトと関連する複数のブログサイトを運営している。ブログサイトはメインサイトとは別のレンタルサーバで運用している。メインサイトにはブログはインストールされていない、インストールしたくない。
- メインサイトはapacheで運用しており、設定ファイルの変更は可能である。 

#元のサイト構成
- https&#58;//main.mydomain/　メインwebサイト、apache2.2で動作
- http&#58;//blog1.mydomain/　　ブログサイト1、webサーバは任意
- https&#58;//blog2.otherdomain/　ブログサイト2、webサーバは任意

#やりたいサイト構成
- https&#58;//main.mydomain/ メインwebサイト（従来通り）
- https&#58;//main.mydomain/blog1/ ブログサイト1がこれ以下に配置される
- https&#58;//main.mydomain/blog2/ ブログサイト2がこれ以下に配置される

#apacheの設定
- メインwebサーバのapacheの設定ファイルに以下を記述する。

```
ProxyRequests off
SSLProxyEngine on

<Location /blog1/>
  ProxyPass http://blog1.mydomain/
  ProxyPassReverse https://blog1.mydomain/
  ProxyPassReverseCookieDomain blog1.mydomain main.mydomain
  ProxyPassReverseCookiePath / /blog1/
  RequestHeader unset Accept-Encoding
  AddOutputFilterByType SUBSTITUTE text/plain text/html application/javascript text/javascript
  Substitute "s|http://blog1.mydomain/|https://main.mydomain/blog1/|q"
</Location>

<Location /blog2/>
  ProxyPass https://blog2.mydomain/
  ProxyPassReverse https://blog2.mydomain/
  ProxyPassReverseCookieDomain blog2.mydomain main.mydomain
  ProxyPassReverseCookiePath / /blog2/
  RequestHeader unset Accept-Encoding
  AddOutputFilterByType SUBSTITUTE text/plain text/html application/javascript text/javascript
  Substitute "s|http://blog2.mydomain/|https://main.mydomain/blog2/|q"
</Location>
```
- 設定はhttpd.confまたはそこからインクルードされる設定ファイル内に記述する。**.htaccessは不可**
- &lt;VirtualHost&gt;内に記述しても大丈夫

#各設定の簡単な説明
###ProxyRequests off
- フォワードプロキシではなくリバースプロキシを使うので**off**にする。
- &lt;Location&gt;内には書けない。

###SSLProxyEngine on
- プロキシのバックエンドサーバとして、httpsプロトコルのサーバがある場合、このディレクティブの値をonにする必要がある。
- バックエンドサーバが全てhttpプロトコルの場合は、このディレクティブは不要なはず。

###ProxyPass
- リバースプロキシの最もキモの設定。この設定だけでリバースプロキシ自体は動作する。

###ProxyPassReverse
- バックエンドサーバがリダイレクトの応答（301とか302）をする場合に、リダイレクト先のパスを適切に書き換えてクライアントに返答するための設定。
- リダイレクトしないことが確実ならこのディレクティブは必要ないが、通常は書いておく。

###ProxyPassReverseCookieDomain, ProxyPassREverseCookiePath
- バックエンドサーバがクッキーを出力する場合に、そのクッキーのドメインやパス情報を適切に書き換える。
- クッキーを出力しないことが確実ならこれらのディレクティブは必要ないが、通常は書いておく。

###RequestHeader unset Accept-Encoding
- バックエンドサーバに、http(s)レスポンスを圧縮せずに返してもらうための設定。
- レスポンスが圧縮されていると、後述のSubstituteが正しく動作しなくなるため、バックエンドサーバの設定によっては必要。

###AddOutputFilterByType
- 後述のSubstituteプリミティブを有効にするための設定。
- 上の設定例では、text/htmlやtext/javascriptなど、テキスト系の主なMIMEタイプで有効になるように指定しているが、バックエンドサイトの内容によっては、他のMIMEタイプも追加する必要がある。

###Substitute
- バックエンドサーバからのレスポンス（htmlやJavaScript）内のテキストの置換を行う。
- バックエンドサーバのhtmlのリンク等に含まれる元のバックエンドサーバURLをメインサイトに統合後のURLに書き換えるのが目的。
- レスポンスHTML内のサイト内リンクURLが相対パスではなくフルパスで書かれている場合にクライアントでそのリンクを踏むと、メインwebサイトから「元の」ブログサイトに遷移してしまうためである。
- バックエンドサーバのコンテンツ内容によっては、置換設定を更に追加する必要があるかもしれない。

#動作確認済みのバックエンド（動作不可を含む）
###さくらのレンタルサーバ上のwordpressサイト
- 2サイトで動作OK
- うち一つは **ReqestHeader unset Accept-Encoding**が必要。もう片方は不要だった。

###wix
- 動作しない。502 Bad Gatewayになってしまう。
- 現時点で原因は不明。
WinServ2012R2のイベントビューアー＞カスタムビュー＞管理イベントにPrintServiceエラー

お世話になっております。

件名の通りなのですが
WindowsServer2012R2の
イベントビューアー＞カスタムビュー＞管理イベント
に
イベントID　372　が溜まるようになってきたので
調査してみると
http://thinkami.hatenablog.com/entry/20110909/1315519986

とあったので再起動を今夜やる予定なので
メモ失礼します。
Floydhubでデータセットをアップロード

Floydhub、GPUの無料使用分がなくなったのは残念ですが、Nvidia Tesla K80 GPUを1時間$0.7で使うことができます。Jupyterの場合ローカルでテストしててほぼそのままFloydhubで計算させられるので、AWS GPUインスタンスよりお手軽です。

画像データなどが多く含まれる場合は

```
Directory contains too many files to upload. If you have data files in the current directory, please upload them separately using "floyd data" command and remove them from here.
```

と言われるのでデータセットを別にアップロードします。

https://www.floydhub.com/datasets/create

でデータセットを作成後

```
cd data 
floyd data init dataset-name
floyd data upload
```

でデータセットをアップロードします。


データセット名
```
user-name/datasets/dataset-name/1
```

データ名とデータパスを**--data**で指定して実行します [data-id]**:**[path] でデータのパスを指定します。
```
floyd run --gpu --env tensorflow --data user-name/datasets/dataset-name/1:data  --mode jupyter
```

Jupter notebook内で利用できます。

```
train_iter = data_iterator.BatchIteratorSimple(batch_size=batch_size,
                                               data_folder=os.path.join('/', 'data', 'train'),
                                               image_shape=image_shape,
                                               shift_aug=True)

val_iter = data_iterator.BatchIteratorSimple(batch_size=batch_size,
                                             data_folder=os.path.join('//', 'data', 'validation'),
                                             image_shape=image_shape)
```
BitZenyのMinerをUbuntuでビルドして採掘する

# はじめに
BitZenyとはBitcoinから派生した暗号通貨です．
採掘に専用機器が必要なBitcoinとは異なり，CPUでの採掘をメインで開発されたため，一般的なマシンでも比較的簡単に採掘が可能なのが特徴です．
Windows用のMinerはバイナリが公開されていますが，他のOSではソースからビルドする必要があります．

# 環境
+ Ubuntu 16.04 LTS
+ 2.4 GHz Intel Xeon® E5-2673 v3 8コア
+ git, gcc, automakeはインストール済み

## 依存関係のインストール
libcurl, janssonをインストールします．

```
# apt-get install build-essential libcurl4-openssl-dev
```

## ビルド
リポジトリをクローンしてコンパイルします．

```
$ git clone https://github.com/bitzeny/cpuminer.git
$ cd cpuminer
$ ./autogen.sh
$ ./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer"
$ make
```
成功すると，実行ファイル`minerd`が生成されます．

## マイニング
マイニングにはソロマイニングとプールマイニングがありますが，ここではプールマイニングについて説明します．

```
$ ./minerd -a yescrypt -o stratum+tcp://POOL:PORT -u user.worker -p password 
```
このようなログが出力されたら採掘できています．

```
[2017-11-07 08:21:00] thread 2: 4096 hashes, 0.62 khash/s
[2017-11-07 08:21:00] thread 5: 4096 hashes, 0.61 khash/s
[2017-11-07 08:21:00] thread 3: 4096 hashes, 0.61 khash/s
[2017-11-07 08:21:00] thread 7: 4096 hashes, 0.61 khash/s
[2017-11-07 08:21:00] thread 4: 4096 hashes, 0.61 khash/s
[2017-11-07 08:21:00] thread 6: 4096 hashes, 0.61 khash/s
[2017-11-07 08:21:00] thread 1: 4096 hashes, 0.61 khash/s
[2017-11-07 08:21:00] thread 0: 4096 hashes, 0.60 khash/s
[2017-11-07 08:21:01] thread 2: 348 hashes, 0.61 khash/s
[2017-11-07 08:21:01] accepted: 1/1 (100.00%), 4.88 khash/s (yay!!!)
```

シェルスクリプトを作ってしまえば楽です．

```
#!/bin/sh
./minerd -a yescrypt -o stratum+tcp://POOL:PORT -u user.worker -p password
```

# おわりに
BitZenyは2017年10月末にようやく1円を超えました．いつか国内の取引所に上場することを願っています．
Project Euler Q20 【各位の数字の和 2】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
$n × (n - 1) × ... × 3 × 2 × 1$ を $n!$ と表す.

例えば, $10! = 10 × 9 × ... × 3 × 2 × 1 = 3628800$ となる.
この数の各桁の合計は $3 + 6 + 2 + 8 + 8 + 0 + 0 = 27$ である.

では, $100!$ の各位の数字の和を求めよ.


## 解答

```bash
seq 100 |
awk 'BEGIN{a[1]=1} {for(i=1;i<=length(a);i++){v[i]=a[i]*$1};for(i=1;i<=158;i++){a[i]=v[i]%10;v[i+1]+=int(v[i]/10)}} END{for(i=length(a);1<=i;i--){printf a[i]}}' |
sed 's/./&\n/g' |
awk '{s+=$1} END{print s}'
648
```

`awk`だと$22!$までしか正しく計算できなかった。
$2^{1000}$は計算できたのにな。やり方が悪いのかな。
仕方ないので繰り上がりのロジックを`awk`で書いた。

2017/11/08追記
[taramさん](https://qiita.com/taram)から教えて頂いた内容
**GNU awk 4.1以上で、かつ必要なライブラリがインストールされていれば、-Mでできる！**

Windowsに入れている`git bash`の`awk`が`GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.3, GNU MP 6.0.0)`だったのでやってみました。
(`GNU MP`というものが必要らしい。)

```bash
seq 100 |
awk -M 'BEGIN{s=1} {s*=$1} END{print s}' |
sed 's/./&\n/g' |
awk '{s+=$1} END{print s}'
648

```
スッキリ！！


## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/020.html
GCPのインスタンス上でメールを送信する（SendGrid+postfix）

# はじめに
GCP Compute Engineインスタンスからは単独でメールを送信する事ができません。
メールが使えないと不便な事が多いですよね。
ここでは「[SendGrid](https://www.sendgrid.com/)」というクラウドサービスを使い、インスタンス上からメールを送信する手順を紹介します。

## SendGridとは
米SendGrid社によって2009年から提供されているクラウドベースのメール配信サービスで、月間3億通超のメール配信を行っているそうです。
このサービスには無料プランがあり、**1日あたり100通**以内のメール配信であれば無料で利用する事ができます。
詳細は「[Pricing - SendGrid](https://www.sendgrid.com/pricing/)」をご覧ください。

## SendGrid登録
以下の手順でSendGridにフリーアカウントを登録します。この時点ではクレジットカードの登録は必要ありません。

1. [トップページ](https://www.sendgrid.com/)より「Sign Up」をクリックします
2. 次のページ（価格一覧ページ）で「Try for Free」をクリックします
3. 必要項目を入力し「Create Account」をクリックします
4. プロフィールを入力し「Save」をクリックします
5. 確認メールが届くので「Confirm Email Address」をクリックします

以上で登録は完了です。
※「Settings - Account Details」メニューよりタイムゾーンを変更しておくのをおすすめします。

## APIキーの作成
サーバからSendGridを使用するため、以下の手順でAPIキーを作成します。

1. 「Settings - API Keys」をクリックします
2. 「Create API Key」をクリックします
3. APIキーの名前とアクセス権限を設定し、「Create & View」をクリックします
4. 完了画面に表示されるAPIキーを**メモ**しておきましょう（**※このキーは二度と表示されません**）
5. 「Done」をクリックします

以上でAPIキーの作成は完了です。

## アクセス元IPアドレスの制限
もしメール配信を利用するサーバが固定IPアドレスを持っている場合、こちらの設定をおすすめします。
この設定を行った場合、許可IPアドレス外からメールを配信する事が**できなくなります**。

1. 「Settings - IP Access Management」をクリックします
2. 「+ Add IP Addresses」をクリックします
3. 初回は同意画面がでますので、確認のうえチェックボックスにチェックし「Confirm and Continue」をクリックします
4. 「IP address(es) or range」の欄にIPアドレスまたはIPアドレス範囲を記入します
5. 「Save」をクリックします

# Postfixインストール
今回はメールサーバとしてPostfixを使用します。
yumを使い以下の手順でインストールします。

```
yum -y install postfix cyrus-sasl-plain cyrus-sasl-md5 mailx
```

次に、postfix設定ファイルを開き、以下の内容を追記します。
「[PASTE_YOUR_KEY]」の部分は、先ほど作成したAPIキーを設定しましょう。

```/etc/postfix/main.cf
# configure sendgrid
relayhost = [smtp.sendgrid.net]:2525
smtp_tls_security_level = encrypt
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = static:apikey:[PASTE_YOUR_KEY]
header_size_limit = 4096000
smtp_sasl_security_options = noanonymous
```

設定が完了したら、postfixの設定をリロードします。

```
postfix reload
```

これでサーバ上からメールが送信できるようになりました。
以下のコマンドにてテストメールを送ってみましょう。

```
echo 'This is test mail.' | mail -s TestMail [YOUR_MAIL_ADDRESS]
```
android からapkを取得して、AndroidManifest.xmlを見る方法

#はじめに
Androidの暗黙的インテントを使用して、他のアプリを起動しようと思いました。
起動するためには、他アプリの以下の情報が必要だとわかりました。

data android:scheme
data android:host
data android:pathPrefix

これらの情報を知るには、そのアプリのAndroidManifest.xmlを見ればよいです。
AndroidManifest.xmlを見るには、そのアプリのapkが必要です。

本ページは、android からapkを取得して、AndroidManifest.xmlを見る方法のメモです。

#参考サイト
以下のサイトを参考にしました。サイト作成者の皆様、ありがとうございました。
http://nlogic.jp/?p=284
http://blog.clock-up.jp/entry/2015/02/28/android-pull-apk
https://qiita.com/T_2/items/0236162c294ffdf17ca8

#確認環境
・Windows7のPowerShellを使用しました。
・Android_Sdkは、Android Studioインストール時にインストールしたものを使用します。
・Javaが使用できるPCであること。

#方法
※パズル＆ドラゴンのAndroidManifest.xmlを見る場合です。

1.PCのブラウザでGooglePlayのパズル＆ドラゴンのサイトに行きます。
※https://play.google.com/store/apps/details?id=jp.gungho.pad

パッケージ名は、URLの最後のほうにあります。パズル＆ドラゴンの場合、jp.gungho.padがパッケージ名です。このタイミングだと、当たりがつくくらいで大丈夫です。

2.PCのPowerShellを起動し、Android_Sdkが存在するパスに移動します。
私の場合は、C:\Users\【ユーザー名】\AppData\Local\Android\sdk\platform-tools、でした。

3.PowerShellで、.\adb shell pm list packages -f、を実行する。実行すると、パッケージ一覧が出力されます。
.\adb shell pm list packages -f > a.txt、にすると、a.txtに一覧が出力されます。

4．1.で見つけたパッケージ名で検索します。
私の場合、package:/data/app/jp.gungho.pad-1/base.apk=jp.gungho.pad、が該当しました。
私のAndroidに入っているガンボーのアプリはパズル＆ドラゴンだけなので、これが、パズル＆ドラゴンのapkになります。

5．.\adb pull [apkパス]、を実行して、androidからapkを取得します。
今回だと、.\adb pull /data/app/jp.gungho.pad-1/base.apk、です。

6.apkの拡張子をzipに変更してエクスプローラで開き、AndroidManifest.xmlを取り出します。AndroidManifest.xmlは、Android_Sdkが存在するパスに入れます。

7.AndroidManifest.xmlはバイナリ化されているので、変換操作が必要になります。変換には、AXMLPrinter2.jarを使用するので、ダウンロードしてAndroid_Sdkが存在するパスに入れます。
※jarの場所：https://code.google.com/archive/p/android4me/downloads

8.java -jar AXMLPrinter2.jar AndroidManifest.xml、を実行して、変換します。java -jar AXMLPrinter2.jar AndroidManifest.xml > a.txt、にすると、変換結果が出力されます。

結果を確認して、以下の必要な情報が確認できました。
　android:scheme="puzzleanddragons"
　android:host="jp.gungho.pad"
　android:pathPrefix="/"



#他アプリを呼び出すコード
以下のように、Intentを使用すれば起動します。
※以下の処理をButtonのandroid::onClick、で呼び出して、パズル＆ドラゴンが起動できました。

　// インテントの生成
　Intent intent = new Intent(Intent.ACTION_VIEW);
　// URI設定
　String strUri = String.format("%s://%s/", "puzzleanddragons", "jp.gungho.pad");
　Uri uri = Uri.parse(strUri);
　// URIをインテントに設定
　intent.setData(uri);
　// 次のアクティビティ起動
　startActivity(intent);

対象のアプリがないときに上記処理が実行されるとActivityNotFoundExceptionの例外で落ちます。忘れずにtry～catchをつけましょう。
Vim で delete キーを押したら ^? になる

# 起きたこと
研究室で使用しているマシン上で、vim を使うと、
ctr + H でしかデリートができなかった
(delete キーを押すと、 `^?` と出た)

# やったこと
delete キーで削除できるようにした

vimrc/bashrc どちらの方法でも問題は解決できた

## vimrc の設定を変える

`~/.vimrc` に、 

```bash:.vimrc

noremap! <C-?> <C-h>
```
を追加する

## bashrc の設定を変える
または、

`~/.bashrc` に

```bash:.bashrc

 stty erase '^?'
```
を追加する

# 終わりに
当初、bashrc の設定を変える方法で問題解決を図ったが、
「vim の問題は vim で解決するべきだろう」
と思い、 vimrc の設定を変える方法に変えた

```bash:.vimrc
set compatible "nocompatible だったのを変更"
:fixdel
set backspace=indent,eol,start
```
これも試してみたものの、自分の環境ではキーマッピングの問題だったみたい...



# 参考
[vim backspace leaves ^?](https://stackoverflow.com/questions/9701366/vim-backspace-leaves/47152541#47152541)
[Mapping control-H in insert mode doesn't work; it always works like backspace](https://vi.stackexchange.com/questions/3119/mapping-control-h-in-insert-mode-doesnt-work-it-always-works-like-backspace)
[VimTip, Todo
Backspace and delete problems](http://vim.wikia.com/wiki/Backspace_and_delete_problems)
[【図解Vim】mapとnoremap](http://cocopon.me/blog/?p=3871)
Swift で 2 つのオブジェクトの差分を表示する方法

Swift でオブジェクトのプロパティの差異を確認する方法を紹介します。

# 本編
動作確認やテストなどで、2 つのオブジェクトの内容の差分を確認したいことがあると思います。例えば、下のコードでは 2 つの struct がありますが、この 2 つの差異を確認するにはどうしたらいいでしょうか：

```swift
let a = Example(
    key1: "I'm not changed",
    key2: "I'm deleted"
)
let b = Example(
    key1: "I'm not changed",
    key2: "I'm inserted"
)
```

`dump` や `print` で :eye: diff するのが最も一般的だと思いますが、より便利な方法が存在します。まず、[MirrorDiffKit](https://github.com/Kuniwak/MirrorDiffKit) というライブラリを CocoaPods や Carthage 経由でインストールし、下のように `diff` 関数を入れるだけです:

```swift
import MirrorDiffKit

print(diff(between: a, and: b))
```

すると、コンソールに次のようなメッセージが表示されます:

```
  struct Example {
      key1: "I'm not changed"
    - key2: "I'm deleted"
    + key2: "I'm inserted"
  }
```

また、配列の内容も表示できます:

```
  [
      "i'm not changed"
    + "i'm deleted"
      "i'm not changed"
      "i'm not changed"
      "i'm not changed"
      "i'm not changed"
    - "i'm inserted"
      "i'm not changed"
  ]
```

デバッグやテストが捗りますね。
Intel HLS Compilerを使える状態にする（CentOS編）

今週リリースされたQuartus Prime 17.1からIntel HLS Compilerが付属するようになりましたが、インストールでハマるケースがありそうなので、取り急ぎメモを書きました。

とりあえずはCentOS7.3環境編です。

0, 事前準備

とりあえずyum updateはしておきます。
あとepelぐらいは入れておきます。

$ sudo yum update
$ sudo yum -y install epel-release


1, Quartus Prime Lite Editionのダウンロード

こちらから
http://dl.altera.com/?edition=lite

一括ダウンロード（Combined Filesというタブ）サイズが大きいので、Individual Filesというタブから必要なファイルだけダウンロードするほうが良いかもしれません。その際、ModelSimもダウンロードすることをお忘れなく。以下、一括ダウンロードした場合で説明します。


2, Quartusのインストール

Quartus-lite-17.1.0.590-linux.tarというファイルがダウンロードされたはずなので、解凍・インストールします。

$ tar xvf Quartus-lite-17.1.0.590-linux.tar
$ cd components
$ ./QuartusLiteSetup-17.1.0.590-linux.run

一応QuartusのGUIの起動を確認しておきましょう。


3, 環境変数設定

環境変数を設定します。.bashrcに書いても良いですし、別途環境設定用のシェルを書いても良いです。
ここでは、/home/intelというディレクトリにデフォルトのパス名でインストールした場合を想定します。

例）
export QSYS_ROOTDIR="/home/intel/intelFPGA_lite/17.1/quartus/sopc_builder/bin"

export PATH=/home/intel/intelFPGA_lite/17.1/quartus/bin:/home/intel/intelFPGA_lite/17.1/qsys/bin:/home/intel/intelFPGA_lite/17.1/quartus/sopc_builder/bin:/home/intel/intelFPGA_lite/17.1/modelsim_ase/bin:$PATH

試しにvsimと実行してみましょう。恐らくライブラリがない等怒られるはずです。


4, 諸々インストール

以下で必要なものをインストールします。

$ sudo yum -y install compat-gcc-44 compat-gcc-44-c++
$ sudo yum -y install glibc.i686 glibc-devel.i686 libX11.i686 libXext.i686 libXft.i686 ncurses-devel.i686


2018/2/8追記
OSのバージョンによっては足りないパッケージがあったようです。gcc以外は以下を入れるのが正解の模様
$ sudo yum install -y glibc.i686 glibc-devel.i686 libX11.i686 
libXext.i686 libXft.i686 libgcc.i686 libgcc.x86_64 
libstdc++.i686 libstdc++-devel.i686 ncurses-devel.i686 
qt.i686 qt-x11.i686


重要なのはgcc/g++のバージョン4.4です。現状、HLSは当該GCCのみサポートです。
再度vsimを実行してみます。ModelSimのGUIが立ち上がったら成功です。


5, 環境変数追加

上記でgccの4.4.7がインストールされたと思います。普段は4.8とかもっと新しいのを使いたいので、HLSだけで使う用に環境変数設定します。

export CPLUS_INCLUDE_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.7:/usr/include/c++/4.4.7:/usr/include/c++/4.4.7/x86_64-redhat-linux

.bashrcにこれを入れると普段からこれを使ってしまうので、やはり環境設定用のシェルを作ったほうが良いかも。


6, HLSを準備

HLSのディレクトリに移動してみます。

$ cd intelFPGA_lite/17.1/hls

そこにinit_hls.shという環境設定用のシェルがあるので、sourceします。

$ source ./init_hls.sh

これで準備OKです。早速サンプルを動かしてみましょう。


7, サンプル実行

サンプルが置いてあるところに移動します。ここでは一番簡単そうなcounterというやつを実行してみましょう。

$ cd examples/counter

Makefileがあるのでmakeしてみます。

$ make

これでtest-x86-64という実行ファイルが出来上がったはずです。これはHLSコンパイラを使ってx86環境でエミュレーションするためのものです。実行するとPASSEDと表示されるはずです。

$ ./test-x86-64

次にgccでのコンパイルを試します。こちらのほうが動作が高速です。

$ make test-gpp
$ ./test-gpp

同じようにPASSEDと表示されます。
最後に合成してみます。

$ make test-fpga

test-fpga.prjというディレクトリが出来ます。ここに色々入っていますので、適当に色々見てみてください。componentsというディレクトリが今回作ったIPになります。
test-fpgaという実行ファイルが出来ているのに気づいたでしょうか。こちらも実行してみます。

$ ./test-fpga

今までより時間がかかりませんでしたか？これはModelSimで実行されたためです。全く同じPASSEDという表示が出たと思います。つまり、diffコマンドで簡単にgcc・エミュレータ・HWシミュレーションの結果を比較できることになります。

簡単ですがこの辺で。
Unity CameraTextureの設定の仕方

参考(https://gametukurikata.com/camera/rendertexture)

-カメラを作成(hierarchy)
-RanderTexture作成(Project)
-randerTextureをカメラのTarget Textureに設定
-textureを乗っけたいものにUI-> raw Imageを乗っける
-Raw ImageにRanderTextureを搭載
手元に配列がないけどmapを使いたい時

こう書けばいいみたい。なるほどね。（for使えの突っ込みはなしで:wave:）


```js
Array.apply(null, { length: 3 }).map(function (elm, index) {
	console.log('出力', elm, index)
})

// 出力 undefined 0
// 出力 undefined 1
// 出力 undefined 2
```
Hello, World 書けます

Hello, World を Python でかけると転職先が見つかると聞いて！！ (違

``` MyHelloWorld.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3


def main():
    with sqlite3.connect(':memory:') as conn:
        strSQL = '''
SELECT 'Hello, World!'
'''
        lines = conn.execute(strSQL).fetchall()
        for line in lines:
            print(line[0])
 

if __name__ == '__main__':
    main()

```
2018/12/2 try-finally を使っていたのを with で置き換え

2019/01/25 ちょい修正。

``` MyHelloWorld.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sqlite3


def main():
    with sqlite3.connect(':memory:') as conn:
        strSQL = '''
SELECT 'Hello, World!'
'''
        print(conn.execute(strSQL).fetchall()[0][0])


if __name__ == '__main__':
    main()
```
毎日のタスクをこなすために作ったWorkflow


# Workflowでタスクを管理しよう

Workflowは[前回の記事](https://qiita.com/akashima/items/c55c27c10241c143f421)も参考いただければと思います。

完璧じゃありませんでした。
固定で30分としているところが不便だったり、時には時間が未入力だったりするケースがあるので、カバーすべく新しくレシピを作り直してみました。
あと、Trelloは辞め、純正のリマインダーを使うようになりました。
iOS使ってるんだからリマインダーも標準がいいよね…って思い、作った代物です。

ご査収くださいませ。

## 毎日忙しい皆さんのサポートをするレシピを作ってみました。

まずは、リマインダーに登録されており、完了ステータスになっているタスクをリスト取得し、カレンダーに登録するようになっているレシピです。

https://workflow.is/workflows/e94140663d274410b9b2d50e7befa71c

こちらは日時が未入力だった場合、いつ実施したか、いつ完了したかを入力するようになっています。
日時の指定がある場合は、いつ終わったかを入力すれば良いようになっています。

## 完了したタスクの削除

タスクが完了したら、このレシピを実行しましょう。

https://workflow.is/workflows/5c53751ea25b4a079840b67972276520

完了したタスクだけを削除してくれます。

## 一ヶ月のタスクを振り返ろう

これが一番やりたかったことだったんですけど、一ヶ月忙しかったなーで終わることが多いのですが、何がそんなに忙しかったんだっけ？って振り返る機会が欲しい人向けです。

https://workflow.is/workflows/8a2e9a0ab1904e1abe7f5de87a21104d

一ヶ月間のカレンダー登録されているタスクを取り出し、txtに保存してくれます。
保存先はWorkflowが対応していれば好きなところに保存できます。
(例:iCloudドライブ、Dropboxなど）

# まとめ

一ヶ月間動かしてみて、思ったんですけど、細かいタスク（突発的にきた依頼など）は登録漏れしますが、主にこれやらなきゃやべーってタスクは登録し、完了ボタンを押せばいいだけです。
リマインダーからカレンダーに移すレシピはApple Watch対応ですが、何のタスクなのかがわからないところが難点ですね…。

![calendar.png](https://qiita-image-store.s3.amazonaws.com/0/13837/4978af06-2dde-8e22-be3b-bec4d03e0a93.png "calendar.png")

10月の中旬から記録をつけ始めたのですが、タスクがみっちり詰まってます。
[Xcode9] CoreDataのsqliteファイルはどこ？

# シュミレータのディレクトリ

/Users/ユーザー名/Library/Developer/CoreSimulator/Devices

# CoreDataのsqliteファイル
/Users/ユーザー名/Library/Developer/CoreSimulator/Devices/シュミレータのIdentifer/data/Containers/Data/Application/アプリのUID/Library/Application Support

ここに、「.sqlite」「.sqlite-shm」「.sqlite-wal」がある
ちなみに、「open .」でFinderを開ける

##はやく見つけるテクニック
Identifierについては、その都度Xcodeで確認するのは面倒
なので,
「ls -lt」コマンドを叩き、**更新日時**を確認してディレクトリ移動するとはやい

##シュミレータのIdentifier
GUIで確認する方法は以下。
Xcodeのメニューバーから、「Window」→「Devices And Sumilators」と選択

## アプリのUID
これを確認する方法は見つけられなかったけど、更新日時で分かるのでセーフ...
C++ Builder XE4, 10.2 Tokyo > Form2のTButton::OnClickイベントをForm1のTButtonで使う

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

Form2でOnClickを実装しているTButtonがあるとする。
Form1のTButtonをクリックした時にそのイベント処理をする。

### code

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

#include <vcl.h>
#pragma hdrstop

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

void __fastcall TForm1::FormShow(TObject *Sender)
{
	Form1->Button1->OnClick = Form2->Button1->OnClick;
}
//---------------------------------------------------------------------------
```

```Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
	ShowMessage(L"Form2");
}
//---------------------------------------------------------------------------
```

### 備考

以下のタイミングでの`Form1->Button1->OnClick`代入は失敗する。

- Form1のコンストラクタ
- Form1のOnCreate

Form2の生成タイミングによると思われる。
Form1のOnShowであれば、Form2は生成済みだろう。

### 用途

一つのフォームで多くの処理を実装したとき、コードの可読性が悪くなる (例: 1390行のコード、40弱の関数)。
将来の機能追加、バグ修正に負担が生じる。

上記のように別ユニットでの実装にして利用すると、フォームの可読性が良くなる経験をしている。
「１つの装置」の処理を「別の装置」の処理に置換えしやすくもなる。
(処理の分離方法は他にもあるだろう。）
テキストを1文字ずつフェードインさせる方法

# デモ
![20171107150838.gif](https://qiita-image-store.s3.amazonaws.com/0/135478/60b73e55-59bc-9d2c-3779-8bee9c11082a.gif)


# コード

## HTML
```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<h1 id="title">Sample Text</h1>
```

## CSS
```css
#title {
    color: #fff;
    font-size: 48px;
}
```


## JS
```js
$(function() {
	var $allMsg = $('#title');
	var $wordList = $('#title').html().split("");
	$('#title').html("");
	$.each($wordList, function(idx, elem) {
		var newEL = $("<span/>").text(elem).css({ opacity: 0 });
		newEL.appendTo($allMsg);
		newEL.delay(idx * 70);
		newEL.animate({ opacity: 1 }, 1100);
	});
});
```

# 参考
・[Fade in letter by letter with JQuery - Stack Overflow](https://stackoverflow.com/questions/30832400/fade-in-letter-by-letter-with-jquery)
コマンド終わったら通知するための alert コマンド

build やら install が長くて放置してたらその日は忘れ去るなんてことが会ったので欲しくなりました。

要件としてはコマンド(実行が長い)を叩いてしまったあとに設定しておきたいところです。

そこで `alert` と `A` というエイリアスを設定しました。

```zsh:.zshrc
alias alert="osascript -e 'display notification \"🕐 get work!\" with title \"Command Finish!\"' -e 'beep 2'"
alias -g A="&& osascript -e 'display notification \"🕐 get work!\" with title \"Command Finish!\"' -e 'beep 2'"
```

* `alert`

コマンド実行後に `alert` (改行) と打つことで設定できます。
※ 入力を求められるコマンド実行時には気をつけて下さい。

* 'A`

コマンド実行前に行末に入力しておくとでアラートの設定できます。

# 使う時はこんな感じ

![alert-demo1.gif](https://qiita-image-store.s3.amazonaws.com/0/40717/85591218-5c73-ff4c-d252-96e2574ced17.gif)

アラートとともに beep 音が2回なります。
この notification のバルーンはクリックしないと閉じないようにしたかったのですが、 Native application でないと無理みたいです。



参考記事です。
[ターミナルからAndroidアプリをビルドしてインストールして起動するスクリプト](https://qiita.com/nshiba/items/bd2cf3cda02d5a860c5c)
UnityのUの字も知らない人達が     ゲームを作ってみた

### まえおき
今日は。この度友人の関係でUnityに興味を持ち、Unityでゲーム制作をしてみました。**Unityに触るの、Qiitaに触るのも初めて**という尻の青い者の書いた物ですが、最後まで読んで頂ければ幸いです。また改善点等教えて頂ければこれまた幸いです。

# 超絶初心者がゲーム作ってみた

 今日は、この度超絶初心者である僕がゲームを作ってみたのでその報告をさせて頂きます。
まず 作ってみたのはこちら
[Exhilaration〜宇宙空間物理破壊シミュレーター〜](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
[![IMG_2744.PNG](https://qiita-image-store.s3.amazonaws.com/0/212174/271f1b93-b114-6049-3530-1cc71dc0e303.png)](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)

いろんな惑星においてあるオブジェクトをタップで弾を飛ばして崩すゲームです。
（とりあえずApp Storeに上げるのは難しいと聞いたのでGoogleplayに上げてみました。）

なんというか…友達に試しに遊んでもらっても、9割には「クソゲー」や「よくわからない」と言われ、1割にも1分くらいで飽きられ、まあそれはわかっていたんですけど…といった感じです。

##自己分析
なぜ「クソゲー」「よくわからない」なのか、少し考えてみました
-ただ単に崩すだけでストーリー性がない
-弾が一種類しかない、視点が動かせない等操作性の問題
-そして70MBという微妙な容量

上の二つ、ストーリー性と操作性は思いついた問題点。最後の一つは友達に言われた事です
`友達「これで70MBって重くない〜」`

うーん  ストーリー性は企画の段階でアイデァ勝負だと思うのでいいとして、操作性の問題を解決したいです。とりあえず今後、普通の弾と爆発する弾の2種類を実装し、フリックで視点を動かせるようにしたいと思います。



### おわりに

ここまで読んで頂き有難う御座います。
上の弾の種類と視点移動を実装すればなんとか「ゲーム」と呼べるような形にはなるかな、と思っています。なにか遊んでみて「〇〇付け足せばゲームっぽくなるのでは？」等々アドバイスお願いします。その他の事でも構いません。

[Exhilaration〜宇宙空間物理破壊シミュレーター〜   GoogleplayStoreへ](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
[![IMG_2748.PNG](https://qiita-image-store.s3.amazonaws.com/0/212174/b4eb77d5-8e86-e33b-0c90-85e56052e9a2.png)](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)

[![IMG_2746.PNG](https://qiita-image-store.s3.amazonaws.com/0/212174/0858a34f-bd9c-fa12-f084-4f7e088a48aa.png)](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
[![IMG_2747.PNG](https://qiita-image-store.s3.amazonaws.com/0/212174/c0e6f417-facb-c378-44f9-0b46d58cd69b.png)](https://play.google.com/store/apps/details?id=jp.jollitygames.azabu.daigakuenosuugaku&hl=ja)
もしよろしければ、ダウンロード、ストアでの評価等々よろしくお願いします。最後までお付き合い頂き有難う御座いました。


続きはこちら
[UnityのUの字も知らない人達が ゲームを作ってみた　その２　](https://qiita.com/ToTheGlory2001/items/94f2925834352ef76c7b)
Project Euler Q19 【日曜日の数え上げ】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
次の情報が与えられている.

    ・1900年1月1日は月曜日である.
    ・9月, 4月, 6月, 11月は30日まであり, 2月を除く他の月は31日まである.
    ・2月は28日まであるが, うるう年のときは29日である.
    ・うるう年は西暦が4で割り切れる年に起こる. しかし, 西暦が400で割り切れず100で割り切れる年はうるう年でない.

20世紀（1901年1月1日から2000年12月31日）中に月の初めが日曜日になるのは何回あるか?

## 解答

```bash
seq 0 $((12*100)) |
awk '{print "date -d \"1901/01/01 "$1" months\" \047+%Y/%m/%d %A\047"}' |
bash |
grep "01 Sun" |
wc -l
171
```

数学的知識を使用せず`date`コマンドでズルをしてしまう方法。
ちなみに`\047`はシングルクォーテーションのこと。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/019.html
パイゼロでつくる虹彩認証ロック

Raspberry Pi ZERO を使った虹彩認証セキュリティロックシステムです。
スパイ映画に登場する様な虹彩認証（眼紋認証）により、定距離で撮影した目の画像を取得し、登録者と虹彩パターンが認識した場合に物理ロックを解除します。

![a.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/fdd8beff-e5a5-0aa0-8636-c10e6187144b.jpeg)
3 歳の息子に協力してもらいながら作成しました。

使用したパーツ：
・Raspberry Pi ZERO 
・ソニー製カメラ「IU233」モノクロVer.、USB 接続 
・Zero4U （4-Port USB Hub For Raspberry Pi Zero）（無くても作成可能） 
・赤外 LED 1 個 （ZERO の GPIO から給電） 
・デジタル・マイクロサーボ SG90（ZERO の GPIO から給電） 
・スマートホンマイクロ USB ケーブル（Raspberry Pi に給電） 

使用したプログラム：
Python　2.7

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/0be30d11-91fd-75bf-2c10-a358e334104a.jpeg)
全体図

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/3ea91d7f-8c75-32c1-09fb-40e804402d7c.jpeg)
サーボモーターを使い、小物入れのフタにロックをする機構を作成しました。
サーボモーターは Raspberry Pi zero の GPIO から wiringpi を使ったハードウェア PWMで制御しています。

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/c1fdce28-e718-1307-07e2-17da489e26a8.jpeg)
動画 URL:  https://www.youtube.com/watch?v=dcoO9wYTe-w
動画 URL:  https://www.youtube.com/watch?v=6I1cbWPPFN0

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/3157e674-a07d-083b-864f-a101c865cafa.jpeg)
虹彩認証は撮影距離により精度が変化してしまうため、洗眼液のキャップ内にカメラを取り付け、このキャップを目に当てることで毎回一定の距離での撮影が出来る工夫をしました。

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/fa4290f9-5394-38b6-c9d6-521cd090a19f.jpeg)
クリアに瞳孔を撮る必要があった為、キャップ内部に赤外 LED を取り付け、撮影の光源としています。アルミホイルを内部に貼り付け、照度を上げるのと同時にキャップ外からの環境光を防いでいます。カメラはソニーセミコンダクタソリューションズ「IU233」を使用しています。小型で焦点距離が広い為、軽く安定して撮影することが出来ます。

撮影した写真は、画像処理ライブラリの OpenCV のハフ検出で処理しました。

OpenCV の円検出の設定例： 

```
cv2.HoughCircles(hough,cv.CV_HOUGH_GRADIENT,1,100,param1=80,param2=20, minRadius=10,maxRadius=80) 
```

minDist ＝ 検出される円と円の最小距離 
param1 ＝ エッジ検出の閾値 
param2　＝ 中心検出の閾値 
minRadius ＝ 最小半径 
maxRadius ＝ 最大半径 


円の検出レベルを厳しくした状態で、ハフ変換で瞳孔(緑円)を検出し、 その円の２倍の大きさの円（青円）を虹彩検出エリアとします。
![hagh1.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/ee9813a5-e0a8-e1cc-384d-e38f0cbd0b77.jpeg)
この青色エリア内を探索領域として、再度検出レベルを甘くして円の検出（水色）を行います。

![eye4.jpg](https://qiita-image-store.s3.amazonaws.com/0/191446/74a70041-5fe4-1a95-1db1-0105315ee830.jpeg)

人によって瞳孔を含めた円の検出数、そのX,Y座標が異なりますので、この数をプログラムに登録しておき、使用者の特定に使います。

使用時には「撮影→探索エリア抽出→エリア内の円検出→円の個数分のX,Y座標の合計値±誤差値がマッチすればサーボロック解除」をループで繰り返すプログラムを起動しておきます。
キャップを目に当て、数秒待つとロックが解除されます。

以上で完成です。

当初は機械学習を行うつもりでしたが、他人の眼球画像を集めることが出来なかったため、機械学習は断念し、OpenCV の円検出みで出来る方法を取りました。 
結果として初心者にも作成が容易で認識処理も早い、オフラインで動くシステムが出来ました。
日本人の虹彩は黒いので瞳孔との差別化に苦労しましたが、モノクロカメラと赤外 LED を組み合わせると上手くいきました。

Raspberry Pi を使った視線追従にも可能性を感じましたので、目を使った関連作品を作成していきたいと思っています。https://www.youtube.com/watch?v=3r8f6kLIRWs 

追記：
この作品は日経BP社　「みんなのラズパイコンテスト2017」で優秀賞を受賞しました。
https://project.nikkeibp.co.jp/pc/atcl/column/17/062900102/080600029/
micro:bit で遊んでみた

##事の発端
@NEKOGET さんが「micro:bit 体験」した→ @NEKOGET さんが micro:bit やりたい熱に侵される→micro:bit もくもく会#0 に発展
それに参加した。面白そうだし。実際面白かった！

##micro:bit とはなんぞや？
BBC Micro:bit は 1980 年代に情報教育のために英国放送協会が開発した BBC Micro が各学校で使用されたように 11 歳と 12 歳の小学生全員に配布される低消費電力、低コストのシングルボードコンピュータ。([Wikipedia](https://ja.wikipedia.org/wiki/BBC_Micro:bit)より)


##ブツが無くとも開発できる

ブラウザがあればシミュレータ付きの[オンライン開発環境](https://makecode.microbit.org/)でプログラム体験(開発)できる。
コレだけでもプログラム体験はできるのすごい！

##でもやっぱり実物も欲しい

- [秋月電子通商](http://akizukidenshi.com/catalog/c/cmicrobit/)
- [スイッチサイエンス](https://www.switch-science.com/catalog/3380/)

などで購入できます。

自分はスイッチサイエンスさんで

- [micro:bit本体](https://www.switch-science.com/catalog/3380/)
- [USB ケーブル](https://www.switch-science.com/catalog/1035/) (USB2.0ケーブル(A-microBタイプ)50cm)
- [電池ボックス](https://www.switch-science.com/catalog/3332/)
- [アクリルケース](https://www.switch-science.com/catalog/3388/)

を買いました。

##やってみた

- まずは[クイックスタート](http://microbit.org/ja/guide/quick/)
- チュートリアルが案内されたので、チュートリアルを一通り
- サイコロっぽいのも作ってみた

また時間があったときに、もう少し手の込んだものを作ってみるつもり

##プログラム経験がほとんど無い人に触らせてみた
簡単な操作方法を教えただけで、文字の表示や、ボタンを押したときの動作などを、ひとりでもくもくやってできてた。ふーむ。


##micro:bit もくもく会あるよ！

- 2017年11月17日(金) [micro:bit もくもく触ってみよう会 #1](https://microbit.doorkeeper.jp/events/67029)
- 2017年12月1日(金) [micro:bit もくもく触ってみよう会 #2](https://microbit.doorkeeper.jp/events/67044)

micro:bit 持っていない人にも貸し出してくれるとのこと (PCは自分で持ってきてねー)
![23130847_1657365304326382_4013541622236017309_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/164551/e57490a8-a6f2-c465-7d10-bf19379c51b5.jpeg)
エクセルを編集していないのに、閉じるときに「保存しますか」と聞かれる現象

#手順と現象
0. エクセルを開いて、シートをいくつか眺める
0. エクセルを閉じる（右上の×、Ctrl+W、Alt+F4など）
1. 「保存しますか？」ダイアログが出る
2. （編集してないのに・・・めんどくさい）となる

#原因
##「データの入力規則」を適用したセルにカーソルが当たっている
参考：[[エクセルの学校さん]](http://www.excel.studio-kazu.jp/kw/20140209204715.html)
より具体的には、データの入力規則の「リスト」を利用している場合に発生する。

![dropdown.png](https://qiita-image-store.s3.amazonaws.com/0/57869/d9b4c0d7-ccd7-6a9d-6149-dff85336facb.png)
セルの右側にある、ドロップダウンを出すためのボタン。
これを、以下のような操作で表示するだけで、編集とみなされる。

* シート内でカーソルを移動して、該当セルをアクティブにする
* 他のシートに切り替えたときに、切り替え先のシートのアクティブセルに上記のボタンが表示されている

#解決策？
保存するときに、全シートで、ドロップダウンの出ないセルを選択してから保存する。
カーソルを動かさない。（ドロップダウンの出るセルをアクティブにしない）


#補足
検索すると出てくる情報のほとんどが、「揮発性関数を使用している」のではないか。というもの。
揮発性関数については、[[MKSさん エクセル関数一覧]](http://www.civil-design.net/free/data/excel/function/13.html)を参照。
* NOW 関数
* TODAY 関数
* RAND 関数
などが該当する。
自動再計算を無効にすれば解消されるが、それもどうなのかと思うので、使わないのが最善と考えている。


#環境
[Excel2010][Windows7]
Excel2002ではすでに報告されている。
仕様と思われる。が、直してほしい。
Project Euler Q18 【最大経路の和 その1】

Project Eulerをワンライナーで解いてみる。
間違っていたらコメントください。


## 問題
以下の三角形の頂点から下まで移動するとき, その数値の和の最大値は23になる.

&nbsp;&nbsp;&nbsp;<font color="red">3</font>
&nbsp;&nbsp;<font color="red">7</font> 4
&nbsp;2 <font color="red">4</font> 6
8 5 <font color="red">9</font> 3

この例では $3 + 7 + 4 + 9 = 23.$

以下の三角形を頂点から下まで移動するとき, その最大の和を求めよ.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;75
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;95 64
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17 47 82
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;18 35 87 10
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20 04 82 47 65
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;19 01 23 75 03 34
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;88 02 77 73 07 63 67
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;99 65 04 28 06 16 70 92
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;41 41 26 56 83 40 80 70 33
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;41 48 72 33 47 32 37 16 94 29
&nbsp;&nbsp;&nbsp;&nbsp;53 71 44 65 25 43 91 52 97 51 14
&nbsp;&nbsp;&nbsp;70 11 33 28 77 73 17 78 39 68 17 57
&nbsp;&nbsp;91 71 52 38 17 14 91 43 58 50 27 29 48
&nbsp;63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

注: ここではたかだか 16384 通りのルートしかないので, すべてのパターンを試すこともできる. Problem 67 は同じ問題だが100行あるので, 総当りでは解けない. もっと賢い方法が必要である.

## 解答
```bash
cat problem18.txt |
awk '{for(i=1;i<=NF;i++){if(a[NR-1][i]<a[NR-1][i-1]){a[NR][i]=$i+a[NR-1][i-1]}else{a[NR][i]=$i+a[NR-1][i]}}} END{for(i=1;i<=NF;i++){print a[NR][i]}}' |
sort -n |
tail -1
1074
```

うまい方法が思いつかなったので`awk`でゴリゴリ。。。
本当は`for`も`if`も使いたくないんですよ。

## 答え合わせ
こちらのサイト様と一致していればOKとした。
http://kingyojima.net/pje/018.html