OmniAICreator/Qiita-1.07M huggingface dataset:
評判の良いcourseraの機械学習コースはどんな人に向いてるか

GWになんの予定もなくまとまった時間が取れそうだったので、評判の良いcourseraのMachine Learningコースを受講しました。
当初は、GW10日間で終わらせるぞ～と意気込んでいましたが、さすがに難しく、GW中に半分程度終わらせ、あとは会社に行きながら、平日の夜と移動時間にちょこっと動画を見て、休日に課題をこなすスタイルで、ちょうど1カ月で終えることができました。


世の中の「AIでちゃちゃっとなんとかできないの」おじさんを撲滅するため、この講義を少しでも多くの人に知ってもらいたいと思います。

これから、ちょっとやってみようかな～と思っている人の助けになれば、幸いです。

#学べること
講義の細かな内容は、
・[数学の苦手なバイオの学生がCourseraの機械学習コースを修了して気づいたこと](https://qiita.com/katsu1110/items/423fc9ac567710a1bd9b)
が詳しいのでそちらに譲ります。

この講義では、
・教師あり学習
　回帰分析、ニューラルネットワーク、サポートベクトルマシン
・教師なし学習
　K-Means、PCA、アノマリー検出

などの**有用な機械学習フレームワークの仕組み**はもちろんのこと、
・**実装する際に必要なフィッティングのために必要な知識**
　過学習、正規化、交差検証、シーリング分析、アルゴリズムの評価、誤差分析など
　
　**こういう結果のときはこういう問題があるから、こうしたらいいよーみたいなのをめちゃめちゃ丁寧に教えてくれます。**精度がでないとき、無駄な時間を使わないために、どこに時間をかけるべきかを非常に重視しています。
理論的な解説が濃い教科書では扱いが難しい実践的な内容になっていると思います。

他のレビューでも絶賛されていますが、この講義の先生である**Andrew先生**はめちゃくちゃやさしくて、難しいことを簡単に説明してくれる天才です。なおかつ、英語が非常に聞き取りやすい。

この講義ではDeep Learnigを扱っていないので、同じくAndrew先生がやっている[Neural Networks and Deep Learning](https://www.coursera.org/learn/neural-networks-deep-learning)も日本語字幕があるので、こちらもやってみようかと思います。

#どういう人に向いているか
 ・これから機械学習を本格的に勉強したい人
 ・細かい数学の証明はいらないからとにかく実装方法を勉強したい人
 ・専門分野ではないけど機械学習にも興味あるからやってみたい大学生

逆に、実装したいわけじゃなくて、ビジネスの教養として知っておきたい程度の人には向いてないと思います。
また、数学的な証明はほぼ全部すっとばすので、そこらへんが気になる人、専門にしたい人は別途、本を購入するなりネットで調べるなりする必要があります。

#前提知識
##英語
・動画は日本語字幕がついており、訳も不自然ではありませんので問題ありませんが、3~5weekあたりはところどころ、字幕がずれており、ずれた分の日本語字幕が見れなくなっています。(2018年5月現在)
字幕がないところは、英語の字幕などにして見る必要がありますので、ちょっとつらいかも。わからなければ、英語字幕を**google翻訳に詰め込めばOK**。

・クイズはすべて英語で、この中であってるやつ選べ系は、正解がいくつあるかわからんので、英語のニュアンスがわからないと結構間違えます。
　5問中4問正解でクリアですが、3回連続で間違うと8時間待ってからでないと、再テストを受けられません。問題はその都度変わるので、まあまあつらい。英語ができない人はたぶんここが一番ネックとなりますが、英文自体は平易なので、**google翻訳に詰め込めばOK**。

・プログラミング課題はPDF15ページぐらいすべて英語です。ものすごく読みやすいので、あまり問題は感じませんでしたが、負荷がかかるようなら、全部コピペして**google翻訳に詰め込めばok**。

**英語が読めるようになることが目標ではない**ので、ガンガン翻訳していきましょう。

##数学
数学的な知識は高校レベルで多分いけます。
 かくいう私も、線形代数・微分積分は大学時代に独学でやったっきりでほぼ全部忘れていましたが、特に問題ありませんでした。

Σアレルギーの人や、微分が接線の傾きになることがわからないレベルの人はちょっと厳しいと思うので、[文系エンジニアが機械学習に入門するために小学校の算数から高校数学までを一気に復習してみました。](https://qiita.com/poly_soft/items/8ea0fc85577f0726f098)
あたりを参考に、行列・微分を覚えてからやったほうが挫折しないと思います。

##プログラミング
このコースには、週の最後に3hぐらいかかるプログラミングの課題があります。課題はoctaveという言語を使いますが、チュートリアルがありますし、課題が穴埋めなので、octaveの深い知識は必要ありません。
octaveというマイナー言語がこの講座のネックになって躊躇するかたがいるようですが、正直どの言語でもこの講座の質は特に変わりません。
同じ課題がpythonだったとしてもpythonのプログラミングがうまくなるわけではありません。

#時間
　最初のほうと、最後のほうは課題もなくあっても軽いものなので、GWがなかったとしても1カ月半から2カ月あれば終えられると思います。

1week 2時間
2week 4時間
3week 4時間
4week 7時間
5week 8時間
6week 6時間
7week 6時間
8week 5時間
9week 6時間
10week 2時間
11week 2時間

動画は5分～15分程度の細切れになっており、スマホに動画をダウンロードして、電車の中で見たりすることもできるので、そういった時間を活用すれば、結構サクッと終わっちゃいます。

#修了証
2018年5月現在は、$79(約8400円)で修了証がもらえます。私は達成感と良質な講義への感謝の意味を込めて、もう終えられるなーと思ったころに購入しました。

##身分証明方法
修了証を取得するには以下の用意が必要です。

・顔写真の載った身分証明書(免許書やパスポート)の画像
・自分の顔を映した画像

上記２つが一致していることを確認して修了証を発行しているようです。
これらを送るのが嫌な人は避けたほうがいいでしょう。

#とにかくやってみよう
11週もあって、最初は終えられるか心配でしたが、はじめてみると講義内容が面白いので、どんどん進めたくなりました。修了証を購入しない限り無料なので、とにかくやってみることをおすすめします。
python print たぶん必要ないオレオレコード


# たぶん必要ないオレオレクソコード

不勉強なせいで多分必要だと思って書いてしまったシリーズ．

# print

```python

print('x=',x)
```

これをどうにかしたい．IDEとかでなくて（例えばjupyterとか）で，上記のように書くのが面倒でスニペットが使えないとき．

## print1

今の所，これが一番いい．他の手法は，`x`を全部文字列としてタイプしているけど，これは，変数名を取得しているのでその文楽になる．

```python
def print1(x,non_break=True):

    import inspect
    import re
    
    # この関数の呼び出し元のフレームオブジェクトを取得
    bac_frame = inspect.currentframe().f_back
    
    # 呼び出し元のソースコードのリストからstring.whitespace(' \t\n\r\v\f')を削除して1行を取得
    bac_code = inspect.getframeinfo(bac_frame).code_context[0].replace(" ", "")
    
    # コメントの開始位置を取得
    pos = bac_code.find("#")  
    if pos != -1:
        bac_code = bac_code[:pos]  # コメントがあるとき削除
    name = re.search(r"\((.+)\)", bac_code).group(1)  # 呼び出し元関数の引数の変数名を取得
    
    if non_break == True: print(name + " = {}".format(x))
    else: print(name + " = {}\n".format(x))

x = np.arange(10)
print1(x)
print1(x.shape)
print1(np.arange(10))

# 出力
# x = [0 1 2 3 4 5 6 7 8 9]
# x.shape = (10,)
# np.arange(10) = [0 1 2 3 4 5 6 7 8 9]
```


## print2

print2内で文字列が定義されていないから，呼び出しされた名前空間内の変数をグローバルとして取得する．

```python
# def print2(s): exec('print(\'{0} = {{}}\'.format({0}))'.format(s)) #修正
def print2(s): print('{} == {}'.format(s, eval(s)))
def print2(s): print(f'{s} == {eval(s)}') # python3.6以降

x = np.arange(10)
print2('x')
print2('x.shape')

# 出力
# x = [0 1 2 3 4 5 6 7 8 9]
# x.shape = (10,)
```


## python3.6以降

[フォーマット済み文字列リテラル（ formatted string literal ）](https://docs.python.jp/3.6/reference/lexical_analysis.html#f-strings)というらしい


```python
x = np.arange(10)
print('x == {x}')
print(f'x == {x}')

# 出力
# x == {x}
# x == [0 1 2 3 4 5 6 7 8 9]
```


## locals()を使う場合

できてないけど，．

```python
x = np.arange(10)
print('x = {x}'.format(**locals()))

# 出力
# x = [0 1 2 3 4 5 6 7 8 9]
```

```python
x = np.arange(10)
s="x"
s2 = ('print(\'{0} = {{0}}\'.format(locals()))'.format(s))
print('x = {0}'.format(locals()))
exec(s2)

#出力
print('x = {0}'.format(locals()))
exec(s2)はエラーが出る
```
python3で電子書籍サイトの検索結果を簡単に表示させる(selenium)

# 電子書籍ってやっぱいい！
エンジニアは技術書をいっぱい保持したり、参照することが社内外問わず多いと思います。
初心者エンジニアの自分でも紙や電子書籍でいろいろ調べます。
ただ、いちいちリュックにいれてたらつらいので電子書籍で持ち運びたい。
できれば、kindleとかkoboとか特定の形式でなくepub/pdf形式で欲しい...
ただ、いちいち検索ボックスに入力するのたるいなーってなったわけです

## そこでselenium
ブラウザの自動操作を可能にしてくれます　htmlのタグの要素を出力するとか、クリックするとか
これ使えばいいんじゃないかと考えたわけです
ただ、今回は難しいことは使わず、電子書籍の検索結果のURLはほとんど定型なので、それを一部利用してquery部分のみ変更＋seleniumでその検索結果をばんばん出してやります

## セットアップ
python3は入っている前提

## seleniumインストール
```shell
pip install selenium
```
## webdriverのダウンロード
https://sites.google.com/a/chromium.org/chromedriver/downloads
上記サイトから自分の環境に合わせてダウンロード

## pythonコード
```python:crawl.py
# -*- coding: utf-8 -*-

import os
from selenium import webdriver
import sys

# fetch abs path
dir_path = os.path.dirname(os.path.realpath(__file__))

try:
    book_title = sys.argv[1]
except IndexError:
    with open("title.txt") as f:
        book_title = f.read()

# fetch book titles you want
with open("crawl_urls.txt") as f:
    urls = [v.rstrip() for v in f.readlines()]

driver = webdriver.Chrome(executable_path=dir_path + '/chromedriver')

for index, url in enumerate(urls):
    if index == 0:
        driver.get(url.format(book_title))
    else:
        driver.execute_script("window.open('');")
        driver.switch_to_window(driver.window_handles[index])
        driver.get(url.format(book_title))
```
### ざっくり解説

1. crawl_urls.txtデータにpdf/epub対応のサイトのURLを一行ずつ記載しておきます（今回は翔泳社、gihyo, 達人出版会、マイナビブックスにしました）
2. python実行時、引数に欲しい本のキーワードを指定(e.g. python)
3. クロームタブが記載したurl分立ち上がりその検索結果が表示される

## 実行例
```python
python3 crawl.py python
```

##結果
![スクリーンショット 2018-05-31 8.40.20.png](https://qiita-image-store.s3.amazonaws.com/0/260353/48105446-ec80-f197-1cff-4f512f6d9ce0.png)

こんな感じでpythonの本を探してくれました
今後はseleniumをもっとうまくつかいこなして複雑な操作をおまかせしたいですね

### レポジトリはこちら
https://github.com/sudo5in5k/book_crawl
rubyのバージョンをあげたが、railsのgemを忘れていた

railsのgemをインストールするのを忘れていた。故に下記。

```
$ rails s
rbenv: rails: command not found
```

対応は下記。rails gemのインストール。

```
gem install rails
```

無事、railsのコマンドを使用できるようになった。
プログラマ脳を鍛える数学パズル Q.5「いまだに現金払い？」

引き続き問題を解いていきます。
問題は[プログラマ脳を鍛える数学パズル](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E8%84%B3%E3%82%92%E9%8D%9B%E3%81%88%E3%82%8B%E6%95%B0%E5%AD%A6%E3%83%91%E3%82%BA%E3%83%AB-%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E9%AB%98%E9%80%9F%E3%81%AA%E3%82%B3%E3%83%BC%E3%83%89%E3%81%8C%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8B70%E5%95%8F-%E5%A2%97%E4%BA%95-%E6%95%8F%E5%85%8B/dp/479814245X/ref=asap_bc?ie=UTF8)より。
# 今回の問題
>最近は電車もバスも電子マネーが当たり前。でも、いまだに現金で払う人も多いもの。今回はバスに設置されている両替機を考えます。
この機械では、10円玉、50円玉、100円玉、500円玉の組み合わせに両替することができ、いずれの硬貨も十分な枚数がセットされています（中略）。
両替する際に、使われない硬貨はあっても構いませんが、バスの中でたくさんの小銭が出ると困るため、最大で15枚になるように両替します。例えば、1000円を両替するときに、「10円玉を100枚」という両替はできません。
**問題**
1000円札を入れたときに出てくる硬貨の組み合わせは何通りあるかを求めてください。なお、硬貨の順番は区別しないものとします。

# 実装手順
①各硬貨が取りうる枚数をループで網羅する
②硬貨ごとに1回のループが完了するたびに合計額が1000円か否かを判定する

# 書いたPHPコードと出力結果

```php:q05.php
<?php

$sum = 0;
$count = 0;

// 各硬貨が取りうる枚数をループ文で網羅する
// 500円硬貨は最大2枚
for ($count_500 = 0; $count_500 <= 2; $count_500++) {
  // 100円硬貨は最大10枚
  for ($count_100 = 0; $count_100 <= 10; $count_100++) {
    // 50円硬貨は最大15枚（問題の制約）
    for ($count_50 = 0; $count_50 <= 15; $count_50++) {
      // 10円硬貨は最大10枚（問題の制約）
      for ($count_10 = 0; $count_10 <= 15; $count_10++) {
        // 金額を合計する
        $sum = 500*$count_500 + 100*$count_100 + 50*$count_50 + 10*$count_10;
        // 枚数を合計する
        $number = $count_500 + $count_100 + $count_50 + $count_10;
        // 枚数が15枚以下、かつ、金額1000円の場合を数え上げる
        if ($number <= 15) {
          if ($sum === 1000) {
            $count = $count + 1;
            echo '解答'.$count.'<br/>';
            echo '500円玉は'.$count_500.'枚<br/>';
            echo '100円玉は'.$count_100.'枚<br/>';
            echo '50円玉は'.$count_50.'枚<br/>';
            echo '10円玉は'.$count_10.'枚<br/>';
            echo '<br/>';
          }
        }

      }
    }
  }
}

// 結果を出力する
echo $count.'通り';

// 解答
20通り

解答1
500円玉は0枚
100円玉は5枚
50円玉は10枚
10円玉は0枚

解答2
500円玉は0枚
100円玉は6枚
50円玉は8枚
10円玉は0枚

解答3
500円玉は0枚
100円玉は7枚
50円玉は6枚
10円玉は0枚

解答4
500円玉は0枚
100円玉は8枚
50円玉は4枚
10円玉は0枚

解答5
500円玉は0枚
100円玉は9枚
50円玉は1枚
10円玉は5枚

解答6
500円玉は0枚
100円玉は9枚
50円玉は2枚
10円玉は0枚

解答7
500円玉は0枚
100円玉は10枚
50円玉は0枚
10円玉は0枚

解答8
500円玉は1枚
100円玉は0枚
50円玉は9枚
10円玉は5枚

解答9
500円玉は1枚
100円玉は0枚
50円玉は10枚
10円玉は0枚

解答10
500円玉は1枚
100円玉は1枚
50円玉は7枚
10円玉は5枚

解答11
500円玉は1枚
100円玉は1枚
50円玉は8枚
10円玉は0枚

解答12
500円玉は1枚
100円玉は2枚
50円玉は5枚
10円玉は5枚

解答13
500円玉は1枚
100円玉は2枚
50円玉は6枚
10円玉は0枚

解答14
500円玉は1枚
100円玉は3枚
50円玉は3枚
10円玉は5枚

解答15
500円玉は1枚
100円玉は3枚
50円玉は4枚
10円玉は0枚

解答16
500円玉は1枚
100円玉は4枚
50円玉は0枚
10円玉は10枚

解答17
500円玉は1枚
100円玉は4枚
50円玉は1枚
10円玉は5枚

解答18
500円玉は1枚
100円玉は4枚
50円玉は2枚
10円玉は0枚

解答19
500円玉は1枚
100円玉は5枚
50円玉は0枚
10円玉は0枚

解答20
500円玉は2枚
100円玉は0枚
50円玉は0枚
10円玉は0枚
```
# 今回の学び
- 解く問題の制約をコードに組み込むと計算量が減りループ処理が早くなる
- 10円玉ではなく500円玉からループ処理を始めたことによって計算量をへらす工夫ができた
- 汎用的に使えるコードになっていないので、再帰処理で書き直したコードを別途あげる
rbenvでrubyをインストールできなかった。

rbenvでrubyをインストールできなかった。

```
rbenv install 2.4.1
```

下記のような記載が見られた。

```
The Ruby openssl extension was not compiled.
ERROR: Ruby install aborted due to missing extensions
```

ググるとこの記事に出会う。

https://qiita.com/t0w4/items/88e50d9f33ed1a69ca6d

そこで、

```
CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl`" rbenv install 2.4.1
```

としたところ、無事インストールできた。
powershell binary viewer

```powershell:binViewer.ps1
$enc = [System.Text.Encoding]::UTF8
#$enc = [System.Text.Encoding]::default

$list = Get-ChildItem "C:\Program Files\7-Zip" -Filter "*.txt"

$list | %{
   $file = $_
   $file.FullName
   $content = ( Get-Content $file.FullName -Encoding Byte -ReadCount 30)
   $content | %{
        $bytes = $_
        $tempx ="" 
        $bytes|%{
            $byte = $_
            $tempx += ( $byte.ToString("X").PadLeft(2,'0')+" ")
        }
        $temps = $enc.GetString($bytes).Replace("`r","").Replace("`n","").Replace("`f","").Replace("`v","")
        $tempx.PadRight(90,' ') +"`t"+ $temps
        #+"`r`n"
   } 
   #| Out-GridView
}
#pause
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/261086/19ebb292-c672-671d-5214-cd95a9700889.png)
Node.js on Herokuの環境でgrpc@1.10.1 install error

Herokuで動かしているNode.jsのサーバにdeployした際、謎のエラーでBuild Failedした件。

```
Installing node modules (package.json)

> grpc@1.10.1 install /tmp/build_6361fb4d8a2fa1b8703d71219349dfb2/node_modules/grpc
> node-pre-gyp install --fallback-to-build --library=static_library

node-pre-gyp ERR! Tried to download(403): https://storage.googleapis.com/grpc-precompiled-binaries/node/grpc/v1.10.1/node-v64-linux-x64-glibc.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for grpc@1.10.1 and node@10.3.0 (node-v64 ABI, glibc) (falling back to source compile with node-gyp)
node-pre-gyp ERR! Pre-built binaries not installable for grpc@1.10.1 and node@10.3.0 (node-v64 ABI, glibc) (falling back to source compile with node-gyp)
node-pre-gyp ERR! Hit error Connection closed while downloading tarball file
```

`grpc@1.10.1`がインストールできていないっぽい。

## Node.jsのバージョン指定をダウングレード
`package.json`を書き換えます。

### Before
```package.json
"engines": {
    "node": ">=6.0.0",
    "npm": ">= 3.0.0"
  }
```

### After
```package.json
"engines": {
    "node": "8.9.4",
    "npm": ">= 3.0.0"
  }
```

`"node": ">=6.0.0"`にしていたせいで、`node --version`が最新の`v10.0.0`になっていました。Node v10と`grpc@1.10.1`の相性が悪いみたい。
参考: https://github.com/firebase/firebase-js-sdk/issues/780#issuecomment-390650868

v8.xだと問題ないらしいので試してみたところ、正常にdeployできました。:tada:
ここ数日起きている現象のようなので早めに解消されると思いますが、取り急ぎ。
iTunesにiPhoneを接続したら "iPhoneの内容を読めません" "出荷時の設定に復元してください"

## iTunesにiPhoneを接続したら

次のエラーが出ました。

```
iPhoneの内容を読めません
```

```
出荷時の設定に復元してください
```

## 対処法

iFunBoxで

Rawファイルシステム/iTunes_Control/iTunes/iTunesCDB
Rawファイルシステム/iTunes_Control/iTunes/iTunesCntrol
を削除

## 参考

http://100hiace.blog.fc2.com/blog-entry-36.html
GrowiでYoutubeの動画を埋め込む

##はじめに

最近，Growiと呼ばれるサーバサイドのWikiアプリケーションをさくらVPS上に乗っけて使用するようになった．

しかし，youtubeとかの動画の埋め込み方が不明だったので，当エントリを投稿した．

初めての投稿ドキドキワクワクである．

## 問題

[Growi](https://growi.org/)は[Crowi](http://site.crowi.wiki/)のフォークで**MarkdownのHTMLレンダリングにMarkedを使用している**．

```html
<iframe width="560" height="315" src="https://www.youtube.com/embed/RQWejyx0gi8" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
```

これは，youtubeの共有から自動生成される動画埋め込み用のHTMLタグで，HTMLタグのパースをサポートしているMarkedなら読み込めると信じていた．

無理だった．

## 解決

結論から言えば，下記のissueeeeeで解決した．

[Github: iframe is not parsed #861](https://github.com/markedjs/marked/issues/861)

上記のissueでもわかる通り`iframe`はパースせずに無視する様なので`<div>`要素に属性指定を行いjavascript上で定義することで回避する．

幸いにもGrowiにはカスタムスクリプトを追加できるので，管理→カスタマイズ→カスタムスクリプトに以下のiframe用のコードを記述する．

```javascript
window.onload = function() {
  var iframes = [].slice.call(document.getElementsByClassName('iframe'));
  for (var i = 0; i < iframes.length; i++) {
    var node = iframes[i];

    var realIframe = document.createElement('iframe');
    realIframe.width = 768;
    realIframe.height = 432;
    realIframe.setAttribute('src', node.getAttribute('src'));
    realIframe.setAttribute('allowfullscreen', true);
    realIframe.setAttribute('frameborder', '0');

    node.appendChild(realIframe);
  }
};
```

あとは埋め込みたいページで

```html
<div class="iframe" src="https://www.youtube.com/watch?v=RQWejyx0gi8"></div>
```

を追加することで動画の埋め込みができる筈．

## 余談

iframeはHTML4で[非推奨](http://thom.hateblo.jp/entry/2015/07/31/031824)だったことがMarkedのパース無視に大きく関係しているんじゃないかと思う．

しかし，よくよく調べてみるとHTML5ではiframeの非推奨は解除されているらしく，例のごとく[w3c](https://validator.w3.org)でチェックしてもエラーを出すことは無い．

その為か，愛用しているMarkdownエディタである[Boostnote](https://boostnote.io/)では，`iframe`無視されなかった．

しかし，Youtubeが吐き出す自動生成の共有用埋め込みタグには平気で`allow`や`frameborder`といった**HTML5で廃止**になった引数が含まれているので要注意．
OpenCVをcontrib付きでビルドする (iOS)

# 背景
- 環境：macOS 10.13.4 (High Sierra), Xcode 9.4

[OpenCV](https://github.com/opencv/opencv) 3.4.1を[contrib](https://github.com/opencv/opencv_contrib)（追加モジュール）と一緒にビルドしようといろいろググってみたが、どれ一つとして成功しなかった。
何をやっても変なエラーが取れない、エラーに付き合ってる暇がない人用のハック。

# 解決法
天才がいた↓
https://medium.com/the-swift-blog/opencv-with-contrib-for-ios-e867c2e30e53

1. opencv_contrib/modules/ からお目当てのフォルダをコピー（例えば /dnn_objdetect）
2. opencv-3.4.1/modules/ 以下にペースト
3. 通常通りビルド python opencv-3.4.1/platforms/ios/build_framework.py ios

# この手法のメリット
- シンプル：必要なmoduleを本体側のフォルダにコピーするだけ
- 軽量：不要なモジュールをビルドしなくてよい
- ユニバーサル（多分）：今後OpenCVのバージョンが上がっても、contribのバージョンさえ同じなら問題なさそう。多分iOS以外でもイケる？

# まとめ
エラーに付き合ってる隙がない忙しいエンジニアのためのOpenCV + contribのビルド方法を紹介しました。
BPMS 学ぶ事はデータ構造の概念

#全てに通じるのは

最後にはデータにいれる　その仕組みはあまり変わらない
http://wiki.processmaker.com/index.php/ProcessMaker_Database_Model_ER_2.0

いろいろな技術が出来ても　データに登録という部分は全てに共通している

#業務で作業の方が一番使う物との連携
　
 exel spreadsheet
⇒どんなに便利な物が出来ても　人が使えて共通認識があるもの

#spread sheet に業務フロー申請をいれる
 https://www.mindmeister.com/1089445922/bpmboxes-google-processmaker-bpms-system?fullscreen=1

#方法
 GOOGLESPREAD SHEET ADDON でデータ登録
 ⇒GASは業務上　技術と業務との橋渡しにもなる
 ⇒重要なことは　業務　技術が話し合える　中間になる物（Spread sheet)
　　⇒それ以上の便利な物は　専門の方が多々いる
　　　⇒だが　業務を話せるという面ではスプレッドシートベースでないと話せない

#業務チャットとの連携
 登録した際に　チャットワークなどでお知らせをする

#実際どうするか
 次回　それはQIITAでいろいろな技術があり　それと合わさっていく事になる
 あまり　BPMSは理解されないが　あわさると　技術でなく　業務的な目線でも物をみれるのようになるので
 おもしろいとは思う　⇒全ての技術が必要で難しい
スキルアップ目的：「等速直線運動(移動距離を計算)」

所要時間、１時間10分ぐらい。予想所要時間30分。

前に作ったものと似ていたため、幾分、作り易かった。
htmlから先に作ったほうが、変数名の決めやすさが向上しそう。
htmlで型枠をどれだけ早く組めるかがスピードに直結しそう。

今まで算数で何気なく行っていた
時間から分への変換、kmからmへの変換など
プログラムで書き起こしてみると再確認できて、面白かった。

よし、次いくぞ次。

参考
https://keisan.casio.jp/exec/system/1163739786
作成物
https://jsfiddle.net/ghost7492/9x1759op/

Time required, about 1 hour and 10 minutes. Estimated required time is 30 minutes.

It was somewhat easier to make because it was similar to what we made before.
The easier it is to decide the variable name, the more you make it from html.
It seems that it is directly linked to speed how fast you can form form with html.

I had been casually by arithmetic
Hour to minute conversion, km to m conversion, etc.
I could reconfirm by transcribing it with a program and it was fun.

OK, let's go over next.
【Crystal】Crystal概要とHello WorldからHTTPサーバー

# Crystalについて
![image.png](https://qiita-image-store.s3.amazonaws.com/0/154845/a57b3f19-7d6f-17f7-d9c1-e8722a25fc5d.png)
Ruby のように書きやすく C のように速いプログラミング言語
[DMM INSIDEの記事](https://inside.dmm.com/entry/2018/05/30/crystal-lang)

## 設計思想
- Ruby 風な文法
- 型推論による変数・メソッドの静的型付け
- 容易に記述可能な C 言語バインディング
- マクロとジェネリクスによるコンパイル時のコード生成
- 高速なネイティブコードを出力

[Crystal-JP](http://ja.crystal-lang.org/)

すごい
C言語の数十倍から数百倍遅くなると言われまくってるRubyに対して、ほぼ同じような書き方でCやC++,Rustに匹敵する高いパフォーマンス！！らしい！！

少し使って見た
## CrystalによるHello World!
- Crystal : 0.24.2 (2018-03-10)で実行した

Crystalはプログラム自体がメインルーチンなので

```helloworld.cr
puts "Hello world"
```
これだけで動く！しかも、`class` `def` `module` `include`などRubyのシンタックスと同様の書き方らしい！！マジでRubyじゃん！！GOD！！

実行コマンド

```
$ crystal helloworld.cr
```

実行ファイルの作成

```
$ crystal build helloworld.cr
$ ./helloworld
```

続けてHTTPサーバーを作成してみる
## CrystalによるHTTPサーバー
HTTPサーバーを作成する。

```http_server.cr
require "http/server"

server = HTTP::Server.new(8080) do |context|
  context.response.content_type = "text/plain"
  context.response.print "Hello world! The time is #{Time.now}"
end

puts "Listening on http://0.0.0.0:8080"
server.listen
```

これを実行すると以下のErrorが

```
Package libssl was not found in the pkg-config search path.
Perhaps you should add the directory containing `libssl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libssl' found
Package libcrypto was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcrypto.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcrypto' found
```

### 解決策
[Crystal-langのIssue](https://github.com/crystal-lang/crystal/issues/4745)に解決策がありました。

```
$ brew intsall openssl
```

`.zshrc`または、`.bashrc`に以下を記述

```
export PKG_CONFIG_PATH=/usr/local/opt/openssl/lib/pkgconfig
```

http://0.0.0.0:8080/ にアクセスして以下のような表示がでればLGTM
![スクリーンショット 2018-05-31 2.53.21.png](https://qiita-image-store.s3.amazonaws.com/0/154845/b569f5d5-c3de-87c3-6e08-761be78346d3.png)

## 思ったこと
- Rubyを利用したことがある人はすぐに使えそう
- Rubyが速度でディスられてるから、それに代わる言語になる？？
- 記事が少ない（Errorとか発生したら、IssueやPR読むほうが早く解決できるかも)
- これからも勉強しようと思いました！

## 引用・参考
[プログラミング言語 Crystal](http://ja.crystal-lang.org/docs/)
[DMM INSIDEの記事](https://inside.dmm.com/entry/2018/05/30/crystal-lang)
[Crystal-JP](http://ja.crystal-lang.org/)
スキルアップ目的：「等速直線運動(速度を計算)」

https://keisan.casio.jp/exec/system/1163740120
上のサイトを参考にして、ほぼそのまま真似させて頂きました。

下部にある答えのイコールをcssで揃えるのに苦労した。
jsがまだまだ汚い気がする。class利用すればいいのか。
cssは、ポンコツですな。まぁ気にしないで次いこう。

https://jsfiddle.net/ghost7492/m3hvxctf/
ライブラリとフレームワークについて

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


<p>つまづいたところ:runner_tone3:(May 31 days)</p>
<ul>
<li>jQueryはライブラリ？フレームワーク？</li>
</ul>

<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i></a>ライブラリって何？
</h2>
<p><strong>ラ</strong>イブラリとはプログラムを集めたファイルのこと。なぜこの疑問を持ったかというと、Rubyでいう"Rails"のようにjsでいう"jQuery"と考えたからだ。しかし、Railsはフレームワークである:fearful:。「jQueryをざっくりと説明すると「JavaScript」と呼ばれるプログラムをより扱いやすくしたファイルのことです。（通称：ライブラリ）」 source:「https://webkikaku.co.jp/blog/webdesign/jquery_start/」と記述がありました。
</p>

<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i></a>フレームワークって何？
</h2>
<p><strong>フ</strong>レームワークとは<strong>開発をスムーズに行うための道具</strong>と書いてある。source:「https://qiita.com/azuki8/items/ad7710fdefaedc63e3f7」　Qiitaなど違いを調べれば幾らでも記事は出てくると思いますが、「フレームワークは全体の処理があり、その中の一部の具体的な処理を自分で実装して、はめ込めるようになっているシステム」が一番しっくりときました。
</p>



<h2>
<span id="code---コードの挿入" class="fragment"></span><a href="#code---%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%8C%BF%E5%85%A5"><i class="fa fa-link"></i></a>さいごに</h2>
<li id="fn2">
<p>Rails のようなフレームワークは確かにここにview,コントローラを作る。。。みたいなのが決まっていて、そこに自分が実装したいものを追加して行っているので確かにjQueryはいわば「jsの便利な記述方法」と言ったイメージです。:pensive:個人的にはこの解釈で納得させました。自分を。
</b><a href="#fnref2"></a></p>
</li>
松尾研のDeep Learning基礎講座演習コンテンツをやってみた(Chap.2-総合)

個人的に、何かをするとき、説明書を読んでる時間というのが一番の苦痛です。chap2はそんな章だったような気もします。しかし、なんとかそこを歩き抜けました。　
　さぁ、こっからはやっと実際的なことができるはずです！
オレはようやくのぼりはじめたばかりだからな このはてしなく遠いデータサイエンス坂をよ…


で、今回は解答だけなので折りたたまないよ。
汚解答ではあるけどいわゆるネタバレなので気を付けてね。

#総合問題

```
#(1)
import math

random.seed(0)
#生成
x=np.random.uniform(0.0,1.0,10000)
y=np.random.uniform(0.0,1.0,10000)
```

```
#(2)
#math.hypotでの判別
in_circle_index=[i for i in range(0,len(x)) if math.hypot(x[i],y[i])<1]
out_circle_index=[i for i in range(0,len(y)) if math.hypot(x[i],y[i])>=1]
#indexからx,yをとる
in_circle_x=[x[in_circle_index]]
in_circle_y=[y[in_circle_index]]

out_circle_x=[x[out_circle_index]]
out_circle_y=[y[out_circle_index]]
#視覚化
plt.plot(in_circle_x,in_circle_y,'o',color='Blue')
plt.plot(out_circle_x,out_circle_y,'x',color='Cyan')
xlim=(0,1)
ylim=(0,1)
plt.legend
#数えるのは配列の長さでいい
in_point_number=len(in_circle_index)
print('Number:{}',format(in_point_number))
out_point_number=len(out_circle_index)


```

![松尾研のDeep Learning基礎講座演習コンテンツをやってみた(chap2-総合).png](https://qiita-image-store.s3.amazonaws.com/0/260015/9e3c80f5-2d86-15a9-848c-3e283c0db3e4.png)



```
#(3)
#点の数の比もin:all=π/4:1になるはず。比をとって4倍してみよう
print('π={}',format(4*in_point_number/len(x)))
```

以上！また会おう！！！
CodePen最初の一歩　〜みんなどうやってVueとかES6とかTypescriptとか使ってるの？〜


# まえがき

最近Qiitaにも貼れるようになり、ますます良く見かけるようになったCodePen。
自分でも小さなVueアプリのサンプル書いてみるかーと踏み出し、2歩目でコケてタイトルの疑問。
程なく解決しましたが、同じところで躓いた人のために念の為共有です。
(こんな初歩で躓く人が他にいるのかは分かりませんが)

# Codeペンの使い方 初歩の初歩

## 1. 作る！
Penを作成するためにアカウント作ったあと、とりあえず
プレーンな状態で始めるために右上の Create→ New Penを選択
![Screen Shot 2018-05-31 at 1.49.06.png](https://qiita-image-store.s3.amazonaws.com/0/128115/2fdf2d63-efef-035f-03f6-26241233a00a.png)  
  
## 2. 書く！

CSS, JSフレームに書いた内容は明示的にHTMLフレームでロードしなくても呼び出せる
![Screen Shot 2018-05-31 at 2.01.49.png](https://qiita-image-store.s3.amazonaws.com/0/128115/ad9b9dc4-67b7-f655-614c-eb00b3df62df.png)

## 3. Vue！(失敗)

他の人がやっている要領で、とりあえずVueインスタンスの作成とHTMLのテンプレートを書いてみると…

![Screen Shot 2018-05-31 at 1.51.01.png](https://qiita-image-store.s3.amazonaws.com/0/128115/d7bc52fc-8752-21db-9821-799360e28cd9.png)

＿人人人人人人人人人人人人人人人人人人人人人人人＿
＞　Uncaught ReferenceError: Vue is not defined　　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

おーん🍤

## 4. 使いたいライブラリをロード！

結局の所、Vue使いたいならVueをロードしろよっていう話です。

これを開いて
![Screen Shot 2018-05-31 at 1.51.01 copy.png](https://qiita-image-store.s3.amazonaws.com/0/128115/fa63e4a6-799b-cfb9-0b6b-5070361c01db.png)

左側のAdd External Scripts/Pensの検索窓にVueを入れて選択。
![Screen Shot 2018-05-31 at 2.14.30.png](https://qiita-image-store.s3.amazonaws.com/0/128115/b30f5434-b7d0-7bee-8837-c25be8359fba.png)

Vueはじめ、有名所のライブラリは一番下のQuick Add
というプルダウンメニューにもまとまっているので、
そこからから選択してポチポチ追加していってもOK。

## 5. Vue！(成功)

エラー出なくなった！ログインボタンでlogin()が発火した！
![Screen Shot 2018-05-31 at 2.22.02.png](https://qiita-image-store.s3.amazonaws.com/0/128115/c5abf625-9575-a015-03d7-fb11d9f95484.png)


## 6. ES6とかTypeScriptとか使う

上記と同じメニュー内にある JavaScript Preprocessorから
いろいろ選べる！Babelを選択すればES6シンタックスが使用できる！
![Screen Shot 2018-05-31 at 2.19.05.png](https://qiita-image-store.s3.amazonaws.com/0/128115/bff6cbc9-3933-41dc-33e3-fcdc13c33673.png)

# おわり！

Qiitaへの貼り方やその他踏み込んだ内容はcodepenタグたどれば出てくるので割愛！
BPMSの流れ

個人的なBPMSについての流れを纏めていっている
BPMSといっても　正直　必要性もわかってもらえるのに長い時間がかかる
プログラムというより　PDCAに何が必要なのか？などともなり

業務でもなく　技術でもなく　総合した考えが必要となるので難しい物もある

#MINDMAP
https://www.mindmeister.com/1089445922/bpmboxes-google-processmaker-bpms-system?fullscreen=1

#1,サービスとは

　お客様があり　仕事とはサービスで
　物を買う　売る　の流れかなと思う

#2,ビジネスとは
　
　有限のお客様に以下にアピールして何かを売るかだと思う

#3,会社とは

　それに対して一人では　出来ない事を分担してやる事

#4,部署とは

　それぞれの役割を分割して仕事をすること

#5,役職とは

　それを管理する人が重要

#6,BPMSとは？

　それを実際にシステム化して　作業分析して管理すること

#7,システムとか

　それをそれぞれ管理　自働化するもの

#8,プログラムとか

　それを作るもの
railsのconcernの使える例 (モデルが作成されたときなどにhipchatに通知を飛ばす)

# 背景

RailsのConcernという機能が、なんかぴんとこないという人のために、一つ例をあげて見る。（ほんとにこの使い方が例として正しいかはわからんが。）


# 実装した機能

まず、すでにRailsのプロジェクトがあり、複数のモデルがあることを考える。例えば、Feedback送信やUserの新規登録など複数ののNotificationがほしい場合に、Concernを使ってNotificationをhipchatに飛ばす実装をしてみる。

Hipchatでなくても、メールやSlackに飛ばすのも同様にできる。

# コード

0. hipchat関係の準備(emailやslackに飛ばす場合などはそれぞれの設定をする)


```rb:Gemfile
gem 'hipchat'
```

```bash
bundle
```

```yaml:config/hipchat.yml
token: "token"
room: ["room name"]
user: "Notifier"
notify: false
api_version: "v1"
color: "gray"
```

```rb:config/initializers/hipchat.rb
HC_OPTIONS = YAML.load_file('config/hipchat.yml').symbolize_keys
```



1. モデルのconcernを作成

```rb:app/models/concerns/notification.rb
module Notification
  extend ActiveSupport::Concern
  included do
    def send_hipchat_notification
      return if %w[development test].include? Rails.env
      hipchat = HipChat::Client.new HC_OPTIONS[:token], HC_OPTIONS
      HC_OPTIONS[:room].each do |room|
        hipchat[room].send 'Rails', message, HC_OPTIONS
      end
    end
  end

  def message
    "#{self.class} has been created"
  end
end
```

以下のように、モデルにcreateされたときにsend_hipchat_notificationが呼ばれるように設定すれば出来上がる。

```app/models/feedback.rb
class Feedback < ApplicationRecord
  include Notification
  after_create :send_hipchat_notification
  ...(もともとのコード)
end
```

```app/models/user.rb
class User < ApplicationRecord
  include Notification
  after_create :send_hipchat_notification
  ...(もともとのコード)
end
```

これで、新規ユーザ作成や、feedbackが来たときに、すぐに通知を受ける事ができる。

# 結論

今回は、複数モデルで同じような機能をつけたいときにConcernを利用して、コードをまとめることができた。他にも複数のモデルの検索機能とかでも使えそう？
松尾研のDeep Learning基礎講座演習コンテンツをやってみた(chap2-Matplotlib)

前回最後にちょっと書いたんですが、とりあえずこのコンテンツについての写経は少しずつ減らしていくよう頑張ります。

----------------------------------------------

では、さいきんとにかく名前を聞くMatplotlibさんの出番です。が、なにやらseabornというのも一緒に使うようです。

#準備

お約束

```
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
```

と、timeitなんかもそうだったけどJupyterがあらかじめ用意してくれてる便利機能のマジックコマンド~~(ー!デーン!!)~~ 

```
%%matplotlib inline
```

<font color='BlueViolet '>これでJupyterで図表を表示できるはずです！！</font>

#plot&scatter-散布図
plt.plot() or plt.scatter() で図表が表示できます。

```
plt.plot(x_axis,y_axis,"marker")
or
plt.scatter(x_axis,y_axis)
```

scatterは基本プロットはo？
plotはmarkerに入れるものでいろいろ選べます

```
o:丸
v:下三角
.:点
,:四角形
1:Y字　　   
 etc.
```

これでグラフはできますが、タイトルや軸はありません。(でも目盛りはつけてくれる。賢い)

```
#グラフタイトル
plt.title("titleName")
#軸名
plt.xlabel("xlabel")
plt.ylabel("ylabel")
#グリッド線
plt.glid(True)
```

これでグラフがまずはグラフっぽく成ります(意味不明)


#連続グラフ

```
plt.plot(xaxis,yaxis,label="Label")
plt.legend()
```

Labelの有無(あとはlegend)で連続か離散か判別してるのかな？plotの第3引数がmarkerかlabelかでかわるみたい。
そしてlegendはRみを感じる。まぁグラフの一般的な～ってやつですからそんなもんでしょうな。

#subplot

```
plt.subplot(行,列,number)
plt.plot(x,y)
```

グラフを行列の要素のように複数に分けて作成する。
あと、初登場のmethod

```
np.linspace(-10,10,100)
```

-10から10までを100分割した数字リストを取り出す…………。
???np.arangeはどうした？
とおもってarangeで試すもグラフは真っ白。調べてみる。
<font color='Blue'>~~すると衝撃の事実が！！~~</font>
ええ、**結果的にここで重要なのは**

```
・np.arangeはint型の要素をもったarrayを返す
・np.linspaceはfloat型
```

そりゃグラフは真っ白だ。小数が必要な時np.arangeはうまくいかないんですね。

#ヒストグラム

```
plt.hist(array,bins=__,range=(__,__))
```

第一引数は配列を渡しとけばそれを勝手に集計してくれる。
binsっていうのはヒストグラムの棒の数。
rangeはその名の通りどの範囲を表示するのか。

だから例えば

```
plt.hist(np.arange(0,101), bins=100,range=(0,80))
plt.grid(True)
```

とすると不連続で高さ一様な棒が大量に出現します。

```
plt.hist(np.arange(0,101), bins=*1000*,range=(0,80))
plt.grid(True)
```

だと、棒は細すぎてもはや線です


#練習問題
~~編集が~~長かったchap２の節別練習問題もこれで最後。がんばりましょー！

<details><summary>問題1</summary>
```
x=np.arange(-10,10,10)
np.linspaceでもかまわない
y=np.array(5*x+3)
plt.plot(x,y,label='Label')
plt.legend()
plt.title('title')
plt.xlabel('X')
plt.ylabel('Y')
```
</details>

<details><summary>問題2</summary>
```
plt.subplot(1,2,1)
x=np.linspace(-10,10,100)
plt.plot(x,np.sin(x))
plt.title('sin')
plt.subplot(1,2,2)
plt.plot(x,np.cos(x))
plt.title('cos')
```
</details>

<details><summary>問題3</summary>
```
import numpy.random as random
random.seed(0)
plt.subplot(1,2,1)
x=np.random.uniform(0,1,1000)
plt.hist(x,bins=100,range=(0,1))
plt.title('1000-1')
plt.subplot(1,2,2)
x=np.random.uniform(0,1,1000)
plt.hist(x,bins=100,range=(0,1))
plt.title('1000-2')
続きは別窓に入力して
plt.subplot(1,2,1)
x=np.random.uniform(0,1,10000)
plt.hist(x,bins=100,range=(0,1))
plt.title('10000')
plt.subplot(1,2,2)
x=np.random.uniform(0,1,100)
plt.hist(x,bins=100,range=(0,1))
plt.title('100')
```
けっこう1000個の２ヒストグラムで形が違いますね。
でも10000までいくとだいぶ長方形っぽくなります。試行回数を増やすことで確率が平均化されてくるということでしょう。
</details>

#最後に
・**グラフってやっぱかっこいい！！**
・けっこうnumpy使いが手馴れてきた感がある。**うれしい。**
以上！！

続く総合問題についてを次回掲載します。
それが終わったらいったん溜まってるRの小ネタ・Javaのjarアプリ系、加えて暇があればAndroidアプリについて書きたいと思います。
今更VagrantとVirtualBoxでMacにCentOS7の環境を作る

#基本概念
VirtualBoxは仮想マシンで、それ単体で仮想環境を築くことができます。
ただし、各種設定やOSのインストールなどが面倒なので、
Vagrantというツールを導入し、VagrantからVirtualBoxを操作します。

#VirtualBoxをインストール
今回入れたバージョンは5.1.8 r111374 (Qt5.5.1)でした。
ダウンロードはこちらからどうぞ。https://www.virtualbox.org/

#Vagrantをインストール
今回入れたバージョンはVagrant 2.0.1でした。
ダウンロードはこちらからどうぞ。https://www.vagrantup.com/

#Vagrantのコマンドでいろいろと実行する
### 1. 仮想ファイルを入れるディレクトリを作成する
今回はhome直下にMyVagrantというディレクトリを作り、そこにCentOS7というディレクトリを作りました。

```
$ cd
$ mkdir MyVagrant
$ cd MyVagrant
$ mkdir CentOS7
$ cd CentOS7
```

### 2. CentOS7のBoxをダウンロードする
BoxとはOSのディスクイメージファイル等が含まれたファイルのことで、このBoxを元に環境を構築していきます。今回はCentOS7のBoxをダウンロードします。
ダウンロードの仕方は下記になります

```
$ vagrant box add [好きなBOX名] [BoxのURL]
```
BoxのURLは下記サイトから対応するものを探してきます
http://www.vagrantbox.es/
今回はcentos7というBox名にしてインストールします(ちなみに結構時間かかります）

```
$ vagrant box add centos7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
```
なんかエラーが発生しました。載せておきます。

```
An error occurred while downloading the remote file. The error
message, if any, is reproduced below. Please fix this error and try
again.
OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 60
```
調べたところ、回線の問題でタイムアウトしてしまうことがあるとのことで、再度実行したら今度はうまくいきました。なんやねん。

```
==> box: Successfully added box 'centos7' (v0) for 'virtualbox'!
```

一応ちゃんとBoxが入ったか以下のコマンドで確認しておきます。
以前入れていたcentos6.8の下に新たにcentos7が作られているのでOKですね。

```
$ vagrant box list
bento/centos-6.8 (virtualbox, 2.3.0)
centos7          (virtualbox, 0)
```

### 3. 先ほどのBoxを指定して初期化する
```
$ vagrant init centos7
```
実行結果は以下。VagrantFileが新しくできてvagrant upする準備が整ったと書いてありますね。

```
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```
### 4. vagrantfileを変更する
192.168.33.10でアクセス可能になるようにvagrantfileを変更します。
ちなみにドットインストールでは以下のコマンドを実行しています。

```
sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile
```

これは要するにprivate_networkのipアドレス指定しているところのコメントを外しているだけです。
vimで直接コメントを外しにいっても変わらないです。参考までにsedの使い方載せておきます。

```
sed s/置換前/置換後 ファイル名
```
### 5. Vagrantを立ち上げる(仮想マシンの起動)
準備は整ったので、仮想マシンを立ち上げます。

```
$ vagrant up
```

少し時間がかかりましたが、うまくいったようなのでアクセスしてみます

```
$ vagrant ssh
Welcome to your Vagrant-built virtual machine.
[vagrant@localhost ~]$ 
```

アクセスできました！
これでCentOS7の仮想環境を作成できました。
[OSの設定は別の記事](https://qiita.com/pipiox/items/fdfe1a223b77ef26db22)で書こうと思います。
AV1 Codec Library を Windows10 でビルドする

「aom が Windows 環境でビルドできないよー」と知人から言われたので、その answer としてのまとめです。
Windows 10 でビルドできた手順です。

# 本家の情報

AV1 Codec Library

 * https://aomedia.googlesource.com/aom/+/master/README.md

Building the lib and applications にビルド手順が書いてありますが、その通りに実行してもうまくいかない場合があるようです。

# 必要なライブラリのインストール

* CMake version 3.5 or higher.
    * 現在の最新版 CMake 3.11.2 を使いました。
    * https://cmake.org/download/
* git
    * あたらしめのやつで
* perl
    * ActiveState Perl 5.24.3.2404 を使いました。
    * https://www.activestate.com/activeperl/downloads
    * バージョン 5.10.10 未満の場合 cmake が成功したかのように見えますが、よく見るとエラーが出ています。
        * `aom_version.h` が生成されずビルドが失敗してしまう・・・
* nasm
    * yasmでも良いらしいですが、インストーラー形式で配布されている nasm を選択しました。
    * インストーラは「管理者で実行」しないと `c:\Program Files\NASM` にインストールできないので注意。
    * https://www.nasm.us/pub/nasm/releasebuilds/2.13.03/win64/
    * 環境変数 PATH に、インストール作ディレクトリ `C:\Program Files\NASM` を追加します。
* Visual Studio 2015 Community (Express)
    * 2015 は過去のバージョンのため、MSDNサブスクリプションか、無料の Dev Essentials の登録が必要です。
        * https://www.visualstudio.com/ja/dev-essentials/
    * Visual Studio Community (Express) 2015 の日本語版をダウンロードし、インストールします。
        * https://www.visualstudio.com/ja/vs/older-downloads/
        * インストール時のオプションで C++ を選択すること。
    * Visual Studio 2017 では cl.exe の使用方法が変わっているらしく、うまくいきませんでした。

# ビルド手順

適当な作業ディレクトリでソースコードを取得します。

```bash
$ git clone https://aomedia.googlesource.com/aom
```

`aom\` にソースコードが取得できました。
`aom\work` をビルド用のディレクトリとし `cmake` します。

```bash
$ cd aom
$ mkdir work
$ cd work
$ cmake .. -DCONFIG_UNIT_TESTS=0
```
`cmake` の実行でエラーが出た場合、そのエラーメッセージに応じて以下のようなオプションを追加するとうまくいったりします。
一度エラーが発生した場合には `aom\work` の内容を全削除してから `cmake` の再実行をしてください。

```bash
-DAOM_TARGET_CPU=generic
-DCMAKE_CXX_COMPILER="C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exe"
```

`CMAKE_CXX_COMPILER`で指定するコンパイラが存在しない場合には、以下のページが参考になると思います。

* Visual Studio 2015をインストールしたのにcl.exeがないとき
    * http://tiwawan.hatenablog.com/entry/2017/08/30/152239


`cmake` が成功すると、`aom\work` にソリューションファイル `AOM.sln` と、プロジェクトファイルが多数生成されます。
`AOM.sln` を Visual Studio で開き、ビルドすることができます。

デバッグする場合には「スタートアッププロジェクト」を変更します。

* エンコーダ
    * aomenc
* デコーダ
    * aomdec

# 謎

Win32 - Release でビルドするとコンパイラが落ちますが、謎。
値型、参照型、値渡し、参照渡し

# 「値」と「参照」、「型」と「渡し」

「値型」「参照型」「値渡し」「参照渡し」、ついでにC++の言語規格で定義されている「参照」という言葉は、その字面からごっちゃになりがちなので、ここに簡単にまとめておく。

## 値型、参照型

値型（value type）、参照型（reference type）というのはプログラミングにおけるデータ型（data type）の分類の一種である。
値型のオブジェクトは「実体としてのデータ」を持ち、参照型のオブジェクトは「実体を参照するためのデータ（アドレスとか）」を持つ。
C++では「ポインタ」「スマートポインタ」がプログラミング一般における「参照型」に当たる。

| 型 | 値型か参照型か |
| --- | --- |
| `int` | 値型 |
| `int*` | 参照型 |
| `shared_ptr<int>` | 参照型 |

## 値渡し、参照渡し

値渡し（pass by value）、参照渡し（pass by reference）というのは評価戦略（evaluation strategy）の用語で、関数の仮引数（formal parameter）と実引数（actual argument）の関係を表す。

値渡しでは仮引数は実引数のコピーとなり、関数の中で仮引数に対して行った操作は実引数に影響を及ぼさない。

![val.png](https://qiita-image-store.s3.amazonaws.com/0/183757/42a7d859-b262-2c07-c6a6-d53b9cd01ac6.png)

参照渡しでは仮引数は実引数のエイリアスとなり、仮引数に対して操作を行うことは実引数に対して操作を行うことと同じになる。

![ref.png](https://qiita-image-store.s3.amazonaws.com/0/183757/4108baf5-9122-c074-1def-e17c471f8d71.png)

C++における仮引数のデータ型と評価戦略の組み合わせは以下の通り。
C++では仮引数にそのものずばり「参照」を使った場合に参照渡しとなる。

| 関数宣言 | 仮引数の型 | 評価戦略 | 自分が使う呼び方 |
| --- | --- | --- | --- |
| ```void f(int a)``` | 値型 | 値渡し | 値渡し |
| ```void f(int* a)``` | 参照型 | 値渡し | （生）ポインタ渡し |
| ```void f(shared_ptr<int> a)``` | 参照型 | 値渡し | - |
| ```void f(int& a)``` | 値型 | 参照渡し | 参照渡し |
| ```void f(const int& a)``` | 値型 | 参照渡し | const参照渡し |
| ```void f(const shared_ptr<int>& a)``` | 参照型 | 参照渡し | （スマート）ポインタ（のconst参照）渡し |

以上の組み合わせのうち、比較的ややこしい「参照型の値渡し」と「参照型の参照渡し」について以下に補足する。

### 参照型の値渡し

参照型の値渡しでは、関数の中から実引数が参照していた実体を仮引数を通じて操作できるが、実引数そのものは操作できない。

![refval.png](https://qiita-image-store.s3.amazonaws.com/0/183757/495a6687-9ef3-87b7-0ae2-6f587473158e.png)

C++のポインタ渡しについては、たとえば ```int a; f(&a);``` などは「関数 ```f()``` の中で実引数 ```a``` を操作できるから値型の参照渡しでは？」と思われるかもしれないが、この場合の実引数は ```&a``` の結果であるポインタ型の一時オブジェクトであってその一時オブジェクトを仮引数を通じて操作することはできないので、「参照型の値渡し」になる。

ちなみに「参照渡し」という言葉については、時に「参照型の値渡し」という言葉が「参照（型の値）渡し」→「参照渡し」のように略して使われている場合があるので、適宜正しく読み解く必要がある。

### 参照型の参照渡し

参照型の参照渡しでは、関数の中から実引数が参照している実体を仮引数を通じて操作できるし、実引数そのものも操作できる。

![refref.png](https://qiita-image-store.s3.amazonaws.com/0/183757/97388b54-7f58-4f20-5c2b-63e3ab90c06e.png)

C++の場合、「関数が実引数に副作用を起こさないことを明確にする上では『値型の値渡し』の形式がベストなのだけれどもコピーコストが無視できないので値渡しは避けたい」というときに使う「const参照渡し」が、参照渡しのもっともメジャーな使い方だと思われる。
[swift] カメラロールの写真を選択して新しい画面で表示する

##サンプル
カメラロール開く → 新規画面に選択した写真表示 → 閉じる　という流れ。

![showalbum2](https://user-images.githubusercontent.com/5738481/40732217-caedd1d2-646d-11e8-8552-bef54d5b2da4.gif)

##コード
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func toAlbum(){
        if UIImagePickerController.isSourceTypeAvailable(.savedPhotosAlbum) {
            let picker = UIImagePickerController()
            picker.sourceType = .photoLibrary
            picker.delegate = self
            self.present(picker, animated: true, completion: nil)
        }
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        let image = info[UIImagePickerControllerOriginalImage] as! UIImage
        
        let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
        let nextView = storyboard.instantiateViewController(withIdentifier: "Photo") as! PhotoViewController
        nextView.image = image
        
        self.dismiss(animated: false)
        present(nextView, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
```

```swift:PhotoViewController.swift
import UIKit

class PhotoViewController: UIViewController {
    
    var image: UIImage?

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        
        imageView.image = image
        imageView.contentMode = UIViewContentMode.scaleAspectFit
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    @IBAction func closeModal() {
        imageView.image = nil
        self.dismiss(animated: true, completion: nil)
    }

}
```

Storyboardで各ViewControllerのidentifierに`Main`と`Photo`を設定するのを忘れないように。

##ダウンロード
[github](https://github.com/lulu34/ShowAlbum)に置いてあります。
phantomjsでscroll後の画像がrenderできない

## 問題
表題の通り。
会社のメンバーから質問きたので、解決方法を調査して答えました。
そのときの知見として残しておきます。

## phantomjsの準備
ここで書くことじゃないけども、一応こんな感じ

```sh:setup
echo '{"scripts": {"start": "phantomjs script.js"}}' >> package.json
echo 'console.log("Hello, World!"); phantom.exit()' >> script.js
npm install --save-dev phantom phantomjs
npm start
```

楽ちんですね

## やろうとしたこと

* webページを開いて
* jsで `window.scrollTo(0, 1000)` して
* スクロール後の画像を保存

```javascript:script.js
var page = require('webpage').create();

page.viewportSize = { width: 320, height: 480 };
page.clipRect = { top: 0, left: 0, width: 320, height: 480 };

page.open('https://qiita.com/nabepon/items/cd6086bb4ecd6d8ce812', function() {
  var position = page.evaluate(function() {
    window.scrollTo(0, 1000);
    return window.scrollY;
  });
  console.log(position);
  page.render('screenshot.png');
  phantom.exit();
});
```

## 失敗結果

どうなったかというと、

```
console.log(position);
```

の出力は問題なく `1000` と出ている。
にも関わらず、撮れたスクショはスクロールしていない。
？？？

![screenshot.1.png](https://qiita-image-store.s3.amazonaws.com/0/68087/c1387efa-201a-a21b-b474-50547d880f6c.png)

## 解決方法

以下のように、pageオブジェクトにscroll位置を設定しないといけないらしい

```javascript
page.scrollPosition = {top: 1000, left: 0}
```

なるほど、というわけでこういうコードを書いて解決した

```javascript:script.js
page.open('https://qiita.com/nabepon/items/cd6086bb4ecd6d8ce812', function() {
  var position = page.evaluate(function() {
    window.scrollTo(0, 1000);
    return JSON.stringify({
      top: window.scrollY,
      left: window.scrollX,
    });
  });
  page.scrollPosition = JSON.parse(position);

  console.log(position);
  page.render('screenshot.png');
  phantom.exit();
});
```

## 成功結果

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/68087/9a327a34-dfe6-2408-f71a-db05bce16b49.png)

無事scrollした画像が撮れました。
それにしてもphantomjsを使うとES5で書かないといけず非常につらい。babel入れるのも少し面倒でした。
なぜ今phantomjsを使っているのだろう。
PLC (シーケンサー)の初心者向けの参考サイト

http://seigyochikarazoe.blog.fc2.com/?tag=Melsec&page=5
http://www.takach.net/pc/melsec_socket.html
https://qiita.com/hidehito108/items/e8eca75a46ee7d59feed

https://www.keyence.co.jp/ss/products/controls/network/basics/standard.jsp
GeneticSharp使い始めまとめ

C#で遺伝的アルゴリズムを使いたい機会があったので、GeneticSharpを使ってみようと思ったところあまり日本語の情報が様子なのでメモ程度に書き残しておきます。

ソースコードやサンプルコードは以下から入手
https://github.com/giacomelli/GeneticSharp

Visual Studioで使う場合はNuGetで取得できるのでわざわざ自前でコンパイルする必要はなさそう。

#必ず指定するもの
GeneticAlgorithmクラスのコンストラクタには以下の5つをわたす必要がある

- Population
- Fitness
- Selection
- Crossovers
- Mutations

このうちPopulationのコンストラクタに以下を渡す必要がある

- Chromosomes

## Chromosomes
直訳すると「遺伝子」。

解こうとしている問題に応じてIChromosome / IBinaryChromosome インタフェースの実装、もしくはChromosomeBase / BinaryChromosomeBase クラスの継承を行う。

## Populations
集団
Chromosomesを格納するためのListのようなもの。

## Fitness
適合度の算出方法を定義する。

IFitness インタフェースを実装することで、問題に応じた適合度を算出する。
IFitness インタフェースで実装すべきメソッドはEvaluateのみで、先のChromosomesを受け取って適合度を返す必要がある。



## Selections
適合度に応じてどのChromosomesを残すかを決める部分。

単純に適合度が高いN個を残すのであれば、Eliteを使う。
適合度が高いものほど選ばれやすくなるような確率を決めて、Chromosomesを選択するのであればRoulette Wheelを使う。

## Crossovers
N世代目で残ったChromosomesから、N+1世代目のChromosomesを生成する際の交叉のアルゴリズムを決める。
解こうとしている問題によっては不適切なものもあるので慎重に選ぶ必要がある。



## Mutations
突然変異を指定するクラス

#必要に応じて指定するもの
## Reinsertions
N世代目からN+1世代目で用いるChromosomesを決めた後、N世代目のChromosomesから一部をN+1世代目に残すようにするアルゴリズム

GeneticAlgorithmクラスのコンストラクタ内でElitistReinsertionを使うようになっているので、こだわりがなければ指定する必要はない。

## Terminations
終了条件を決める部分

指定しない場合、GenerationNumberによって1世代のみの計算が行われるのであまり意味がないと思われる。


# 今後
今後は簡単なナップザック問題でも作りながら、それぞれについてもう少し掘り下げてみたい。
rsyslog参考サイトまとめ

* https://www.rsyslog.com/doc/v8-stable/configuration/property_replacer.html

* /usr/share/doc/rsyslog-doc/html/rsyslog_conf.html

* https://www.server-world.info/query?os=CentOS_6&p=rsyslog&f=3

* https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/ch-viewing_and_managing_log_files
* http://oxynotes.com/?p=6469
【CSS】ブラウザを狭めた時に、画像の中心を固定したまま両側から非表示にしていく実装

このぬこを縮めた時に、
![kjbj-min-min.png](https://qiita-image-store.s3.amazonaws.com/0/255971/b368c148-295c-e635-be8a-970a9f4bedd3.png)

ぬこを中心にキープしたい。
![スクリーンショット 2018-05-30 23.48-min.png](https://qiita-image-store.s3.amazonaws.com/0/255971/1f28a6ed-215e-e9a6-61c5-5d95db3523e0.png)


普通にCSSを指定してブラウザを狭めると以下のようになります。
![スクリーンショット 2018-05-30 23 (1)-min.png](https://qiita-image-store.s3.amazonaws.com/0/255971/3922c3c5-f124-749d-0441-39f0d7d1bd05.png)



これは画像の基点が画像の左端（下の画像の赤線）!
にあるからです。基点は常に固定されたまま画像が非表示になっていくので、右端だけが消えてゆきます。
![JJJJ-min-min.png](https://qiita-image-store.s3.amazonaws.com/0/255971/7e785d29-3c9e-7c19-f03c-a2fabd5f13e4.png)

基点が左端なら、基点を中央に動かせばいいじゃない。
![スクリーンショット 2018-05-30 23-min-1.png](https://qiita-image-store.s3.amazonaws.com/0/255971/53ebbebe-62fa-bfe4-d4d1-ab53345448c1.png)

基点は固定されるため、基点に対して両側から非表示になってくれるはず、
ということで、position:absoluteと、left:50% で画像の位置を右に、画像の幅の５０％だけずらします。

こうすると当然画像の右半分はブラウザの外側に追いやられてしまうので、ここでネガティブマージンを使って、”画像の実体は右にずらしたまま” 表示されるイメージのみ５０％左に戻してあげます。
<img width="621" alt="スクリーンショット 2018-05-31 1.09.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/255971/ea10f902-21e4-a04e-f020-33c4dfe10230.png">


これで完成。
以下、コードです。

```html
<head>
  <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
  <div class="cat-image">
    <img src="/Users/yu/nuko.jpg" alt="">
</body>
```
```css
.cat-image {
  position:relative;
  width: 100%;
  height:670px;
}
.cat-image img {
  position:absolute;
/*　▼画像幅の半分、右に動かす*/
  left:50%;
  height:670px;
  width: 1200px;
/*　▼画像の幅の半分だけ、ネガティブマージンを設定*/
  margin-left:-600px;
}
```

筆者は、サイト内で地図を画像で表示する時に使いました。ブラウザ幅を狭めても画像の縦横両方が縮んでいくのではなく、画像のサイドのみが非表示になるため、ある地点を中央に固定して表示するのにぴったりです。

参考サイト（悩んでいたので非常に助かりました）
http://www.coolwebwindow.com/csstips/csstechnic/templatelayout/000347.php
Chef::Util::FileEdit でファイルが存在しなかった場合への対応

```rb:

file '/tmp/text' do
  content lazy {

    # ファイルが無ければ単に/dev/nullを指定
    f = Chef::Util::FileEdit.new( File.file?(path) ? path : '/dev/null' )

    f.insert_line_if_no_match(/^ABC\s/, "ABC \n")
    f.search_file_replace_line(/^ABC\s/, "ABC DEF\n")
    f.send(:editor).lines.join
  }
end
```

Chef::Util::FileEdit.new は対象ファイルが無いとエラーとなってしまうので対応。
ファイルがなければ/dev/nullを指定するだけ。
lazy指定によりリソースの実行時にファイルが存在するかどうかが確認される。
React開発メモ: Component間のデータ管理

# Component
Reactのアプリケーションは複数の*Component*と呼ばれるJavascriptのクラスによって出来上がっている。データをこのComponent間で管理することはReactにおいて非常に重要だが少々複雑なので解説していきます。
## 親Componentから子Componentへのデータ渡し
親から子Componentへデータを渡すときは*Props*を使う。例えばApp（親）というComponentからHeader（子）というComponentにアプリケーションのタイトルを渡す場合はこんな感じ：

```jsx:App.js
import React, {Component} from 'react';
import Header from './Header';

class App extends Component {

    constructor() {
        super();
        this.name = 'MyApp';
    }

    render() {
        return (
            <div>
                <Header title={this.name} />
            </div>
        )
    }
}
export default App;
```

```jsx:Header.js
import React, {Component} from 'react';

class Header extends Component {

    render() {
        return (
            <div>
                <h1>Welcome to {this.props.title}</h1>
            </div>
        )
    }
}
export default Header;
```
親から子へデータをプロパティーとして渡すことによって子は`this.props`でそのデータを拾えるというわけだ。

## 子Componentから親Componentへのデータ渡し
先ほどの親から子へのデータ渡しはいたってシンプルだったがその逆は少々ややこしい。やり方はいくつかあるみたいですが今回はCallbackを使います。先ほどのAppとHeaderを使って今度はHeaderの情報をAppに流す処理を追加します。

```jsx:Header.js
import React, {Component} from 'react';

class Header extends Component {

    componentDidMount() {
        let message = 'Header mounted successfully';
        this.props.childStatus(message);
    }

    render() {
        return (
            <div>
                <h1>Welcome to {this.props.title}</h1>
            </div>
        )
    }
}
export default Header;
```

```jsx:App.js
import React, {Component} from 'react';
import Header from './Header';

class App extends Component {

    constructor() {
        super();
        this.name = 'MyApp';
    }

    logChildStatus(message) {
        console.log(message);
    }

    render() {
        return (
            <div>
                <Header childStatus={this.logChildStatus} title={this.name} />
            </div>
        )
    }
}
export default App;
```

まずHeaderがマウントに成功した場合、成功したというステータスを`this.props.childStatus`の引数として渡す。Appでは`childStatus`に対して`logChildStatus`というCallback関数を用意しておく。`logChildStatus`の引数として先ほどのステータスが入るのでそれをアウトプット。
VBAでWindowsAPIを使って、Base64文字列を バイト配列に復号

Base64の変換アルゴリズムは割とシンプルでオウンコーディングできる程度のものですが、実はWindows APIが　その機能を提供しています。
VBAで、これを使って、Base64文字列を バイト配列に復号する方法を記します。

```vb:主となる関数
Private Declare PtrSafe Function CryptStringToBinary Lib "Crypt32.dll" Alias "CryptStringToBinaryW" ( _
    ByVal pszString As LongPtr, _
    ByVal cchString As Long, _
    ByVal dwFlags As Long, _
    ByVal pbBinary As LongPtr, _
    ByVal pcbBinary As LongPtr, _
    ByVal pdwSkip As LongPtr, _
    ByVal pdwFlags As LongPtr _
    ) As Long

Private Const CRYPT_STRING_BASE64 As Long = &H1&

'バイト配列をBASE64でエンコードしたUnicode文字列にする関数
Public Function CryptStringToByte(ByRef sData As String) As Byte()
    CryptStringToByte = ""
    If Len(sData) = 0 Then
        Exit Function
    End If
    
    Dim pszString As LongPtr
    Dim cchString As Long
    pszString = StrPtr(sData)
    cchString = Len(sData)
    
    Dim nBufferSize As Long
    Dim bBuffer() As Byte
    
    '変換後文字列の長さを取得し、変換後文字列を格納するだけのバッファを用意
    If CryptStringToBinary(pszString, cchString, CRYPT_STRING_BASE64, 0, VarPtr(nBufferSize), 0, 0) Then
        If nBufferSize Then
            ReDim bBuffer(0 To nBufferSize - 1)
            If CryptStringToBinary(pszString, cchString, CRYPT_STRING_BASE64, VarPtr(bBuffer(0)), VarPtr(nBufferSize), 0, 0) Then
                 CryptStringToByte = bBuffer
            End If
        End If
    End If
    
End Function

```
以下がテストコードです。
wikipediaのBase64の項目に載っている"ABCDEFG"のBase64変換結果を逆変換してみます。
wikipediaの変換結果は、ASCII文字列あるいはSJISとしてみた場合の"ABCDEFG"の変換結果です。
今回のテストでは、これに合わせるために復号して得られたバイト配列に対して、 SJIS->Unicodeの変換を行っています。

```vb:テストコード
'上のコードの下に続けて、以下のコードを書いてください。
'Base64の文字列を Byte配列に復号し、そのByte配列を SJIS文字列とみなして、Unicode文字列に変換する関数
Public Function Base64_String_To_SJISString(ByVal sValue As String) As String
    Dim bBytes() As Byte
    bBytes = CryptStringToByte(sValue)
    If UBound(bBytes) = -1 Then
        Exit Function
    End If
    
    Base64_String_To_SJISString = StrConv(bBytes, vbUnicode)
    
End Function

Sub Main()
    Debug.Print Base64_String_To_SJISString("gqA=")
    Debug.Print Base64_String_To_SJISString("QUJDREVGRw==")

End Sub
```

```実行結果
あ
ABCDEFG
```
Windows + 矢印（← or ↑ or → or ↓）のショートカットが効かない場合の対処法

[スタート] > [Windows システムツール] > [コントロール パネル] > [コンピューターの簡単操作] > [マウス動作の変更] > [ウィンドウの管理を簡単にします]

において、「ウィンドウが画面の恥に移動されたとき自動的に整列されないようにします」のチェックを外します。

これで Windows + 矢印 による画面の整列が可能となります。