OmniAICreator/Qiita-1.07M huggingface dataset:
What is the Difference Between Augmented Reality and Virtual Reality App Development?

These two terms are often confused, in spite of the differences between augmented reality and virtual reality app development.

![augmented reality app development and virtual reality app development](https://d32myzxfxyl12w.cloudfront.net/assets/images/article_images/246569db0e4ad5f8ca3e320634e5fa6d8bb10300.png?1560508989)

AR applications let 2D or 3D graphics elements be put into a real-world environment and interact with it based on the position and orientation of the camera. VR technology provides an interactive artificial world for a user acting within a simulated environment.

AR works with special algorithms and needs sensors to determine the position and orientation of the camera. In such a way it is possible to render any 3D graphics at any location and see the content on a device’s screen. Besides, devices can locate graphic elements with high accuracy, as a result, it is possible to interact with life-size models in real time, walk around them, come up to, move away from, or even go through them.

VR also needs much work with math algorithms and sensors. Virtual reality is a simulated environment where users are immersed and can see everything with their own eyes. Graphics move together with the users so they can see a totally realistic environment.

These technologies have many application areas where they can be useful.

Augmented reality expands the borders of the real-world environment and creates new opportunities for business. AR could reach $70-75 billion in revenue by 2023, but the revenue for VR could be around $10-15 billion according to research by Digi-Capital. 

Its popularity and forecasts of further growth must motivate entrepreneurs to consider AR app development to create a digital business. If you have ever considered this possibility, then you’ve thought about augmented reality app development cost.

Follow this [article](https://mlsdev.com/blog/89-how-much-does-an-augmented-reality-app-cost) to find out more about the basics of AR development, how to create augmented reality apps, and their cost.
Laravelの環境変数で改行する

環境変数に公開鍵を登録しようとした際に、改行ができないものか調べたのでそのまとめです。

# 先に結論から
## Laravel5.8以上の場合
念の為プロジェクトを作成して確認

```zsh
$ composer create-project "laravel/laravel=5.8.*" laravel5.8
```

このように.envの中で改行をして記載することが可能です。

```
PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
hogehoghoge
-----END PUBLIC KEY-----"
```

tinkerで確認をしてみても、下記のように取得ができています。

```php
$ php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.14 — cli) by Justin Hileman
>>> env('PUBLIC_KEY');
=> """
   -----BEGIN PUBLIC KEY-----\n
   hogehoghoge\n
   -----END PUBLIC KEY-----
   """
```

## Laravel5.7以下の場合
同じく

```
$ composer create-project "laravel/laravel=5.7.*" laravel5.7
```

改行をしてみても取得ができていないです。

```
PUBLIC_KEY="-----BEGIN PUBLIC KEY-----
hogehoghoge
-----END PUBLIC KEY-----"
```

```php
>>> env('PUBLIC_KEY');
=> "-----BEGIN PUBLIC KEY-----"
```

`\n` をenvのkeyに含めている記事もありましたが、そのままですね。
`\n` が通常の文字列の`\n`として扱われているため、envからkeyを取得した上で改行を含めるようにする必要がありそうです。

```
>>> env('PUBLIC_KEY2');
=> "-----BEGIN PUBLIC KEY-----\nhogehoghoge\n-----END PUBLIC KEY-----"
>>> env('PUBLIC_KEY3');
=> "-----BEGIN PUBLIC KEY-----\nhogehoghoge\n-----END PUBLIC KEY-----"
```

```php
PUBLIC_KEY2="-----BEGIN PUBLIC KEY-----\nhogehoghoge\n-----END PUBLIC KEY-----"
PUBLIC_KEY3="-----BEGIN PUBLIC KEY-----\\nhogehoghoge\\n-----END PUBLIC KEY-----"
```

改行前後に含まれる文字がわかっているので、envには改行文字を含めず、phpの正規表現を使って改行文字を含めるようにすれば良さそうです。

```
PUBLIC_KEY="-----BEGIN PUBLIC KEY-----hogehoghoge-----END PUBLIC KEY-----"
```

```php
>>> $begin = '-----BEGIN PUBLIC KEY-----';
=> "-----BEGIN PUBLIC KEY-----"
>>> $end = '-----END PUBLIC KEY-----';
=> "-----END PUBLIC KEY-----"
>>>
>>> preg_match("/^$begin(.+)$end$/", env('PUBLIC_KEY'), $match);
=> 1
>>> $publicKey = implode(PHP_EOL, [$begin, $match[1], $end]);
=> """
   -----BEGIN PUBLIC KEY-----\n
   hogehoghoge\n
   -----END PUBLIC KEY-----
   """
```

## phpdotenvを使用している
laravelでは[phpdotenv](https://github.com/vlucas/phpdotenv)というライブラリを使用しています。
こちらのライブラリで、環境変数の改行がサポートされたので、v3からのようです。
[[3.0] First-class multiline string support](https://github.com/vlucas/phpdotenv/pull/301)

laravel5.8のプロジェクト作成時にインストールされるphpdotenvのバージョンがv3.4.0

```
- Installing vlucas/phpdotenv (v3.4.0): Downloading (100%)
```

laravel5.7のプロジェクト作成時にインストールphpdotenvのバージョンがv2.6.1

```
- Installing vlucas/phpdotenv (v2.6.1): Loading from cache
```

そのためlaravel5.8ではenv内で改行ができて、5.7ではできなかったようです。
SSHのポート番号の変更

SSHのポート番号を指定して接続するときに手間取ったところがあったのでメモを残しておきます。

## やりたいこと
- SSHのポート番号を22から56789に変更して接続する
- firewallもポート番号を56789に設定する

## ポート番号の指定
まず、ターミナルでsshd_configを編集するので、以下を入力します。

```
$ sudo vim /etc/ssh/sshd_config
```
開いたファイルのなかで

```
Port 22
```
と記述されている箇所を

```
Port 56789
```
に変更します。
ターミナルで

```
$ sudo sshd -t
$ sudo systemctl restart sshd
```

とすると設定が反映されます。
次にfirewallの設定をしますが、ここでログアウトするとログインできなくなってしまうので注意しましょう。

## firewallの設定
firewallで56789番ポートを許可します。
まずはfirewallについての設定が書かれているssh.xmlをコピーし、コピーしたものを編集していきます。以下のコマンドを打ちましょう。

```
$ sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-56789.xml
sudo vim /etc/firewalld/services/ssh-56789.xml
```
これによりssh.xmlをssh-56789.xmlという名前でコピーして編集できます。
以下のように記述されているものを

```xml
 <port protocol="tcp" port="22"/>
```
次のように変更します。

```xml
 <port protocol="tcp" port="56789"/>
```

これで設定ができたので以下のコマンドで設定を反映させます。

```
$ sudo firewalld-cmd --reload
$ sudo firewalld-cmd --permanent --add-services=ssh-56789
```
以下のように入力して設定が反映されているか確認しましょう

```
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh dhcpv6-client ssh-56789 http https
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
servicesの項目にssh-56789が追加されているか確認しましょう。

## 動作確認
rLoginで56789番ポートに接続できるか確認します。
接続設定でTCPポートの設定がsshになっていると思いますが、そこを56789に変更して接続してください。
なにもエラーが出ずに接続できれば成功です。

## つまづいたところ
私の場合、動作確認をした際に以下のようなエラーが出て接続できませんでした。

```
centos7 ssh2 user auth failure publickey status=0004 send disconnect message
```
公開鍵の認証に失敗しているようです。
Rloginを開いて編集→プロトコル→認証キー→作成を選び、新しく認証キーを作成します。
新たに作成されたものを選択して公開鍵を押すと、鍵となる文字列が表示されると思うので、それをコピーしておきます。
これを/.ssh/authorized_keysというファイルに貼り付けます。（このファイルは自分で作成する）
これで新しく鍵の設定が出来たので、エラーがなくなり接続できると思います。

## 参考にしたサイト
- Udemy　はじめてのLinuxサーバー構築運用入門
- [【CentOS7】ssh接続，秘密・公開鍵でのアクセスができない](https://teratail.com/questions/16932)
購入情報の格納

ECサイトで商品が購入された際に、何がどのくらい購入されたかなどを格納しておく必要があります。その際の処理を記録しておきます。

## 作りたいもの
- 購入完了画面
- ordersテーブルとorder_detailテーブルに購入情報を入れる
- ordersテーブルにはid,ユーザ名、住所、購入金額、クレジットカード番号、配送状況を格納
- order_detailテーブルには注文id,商品名、購入量を格納

## ordersテーブルへの接続
まずはordersテーブルに情報を入れます。こちらはシンプルなデータベース接続なのでそれほど難しくありません。

```php
<?php
session_start();
$name=$_POST['name'];
$adress=$_POST['adress'];
$total=$_POST['total'];
$creditNum=$_POST['creditNum'];
$status=1;
$count=count($_SESSION['cart']);
if(isset($name) && isset($adress) && isset($total) && isset($creditNum) ){

  $hostname = "localhost";    //ホスト名
  $userid = "iimori";    //データベースユーザ名
  $passwd = "A8h3avau";    //接続パスワード
  $dbname = "ecdatabase";    //データベース名
  $con=mysqli_connect($hostname,$userid,$passwd,$dbname);   //db接続に必要な情報を変数に入れる

          // 接続状況をチェックします
  if (mysqli_connect_errno()) {
      die("データベースに接続できません:" . mysqli_connect_error() . "\n");
  } else {
      echo "データベースの接続に成功しました。\n";
  }

  $con->set_charset('utf8');



  /* プリペアドステートメントを作成します */
  if ($stmt = mysqli_prepare($con, "INSERT INTO orders (name, adress, totalprice, creditNum, status) VALUES (?,?,?,?,?)")) {

      /* マーカにパラメータをバインドします */
      mysqli_stmt_bind_param($stmt, "ssssi", $name,$adress,$total,$creditNum,$status);

      /* クエリを実行します */
      mysqli_stmt_execute($stmt);


      /* 値を取得します */
      mysqli_stmt_fetch($stmt);

      /* ステートメントを閉じます */
      mysqli_stmt_close($stmt);
  }
```
`status`は配送状況を表す変数ですが、今はすべて1として格納しています。

## order_detailテーブルへの接続
次はorder_detailテーブルへ接続します。ここで格納する注文idとは、orderテーブルに格納されているオートインクリメントのidです。
以下のような処理を行います。

```php
<?php
$query = 'SELECT id FROM orders WHERE id=(SELECT MAX(id) FROM orders)';
  $result = $con->query($query);
  // クエリを実行します。
  if (!$result) {
      echo $con->error;
      exit();
  }
  $row=$result->fetch_array(MYSQLI_ASSOC);

  for($i=0; $i<$count; $i++){
  /* プリペアドステートメントを作成します */
    if ($stmt = mysqli_prepare($con, "INSERT INTO order_detail (order_id, productName, boughtQuantity) VALUES (?,?,?)")) {

        /* マーカにパラメータをバインドします */
        mysqli_stmt_bind_param($stmt, "sss", $row['id'],$_POST['productName'][$i],$_SESSION['quantity'][$i]);

        /* クエリを実行します */
        mysqli_stmt_execute($stmt);


        /* 値を取得します */
        mysqli_stmt_fetch($stmt);

        /* ステートメントを閉じます */
        mysqli_stmt_close($stmt);
    }
  }
  // 接続を閉じます
  mysqli_close($con);
```
最大のidの注文が一番新しい注文ということになるので、SELECT文を用いて最大のidを最初に取り出しています。
次にそのidなどの情報をorder_detailテーブルにINSERTしています。
このような構造にすることで、ordersテーブルを見ると配送情報の確認ができ、order_detailテーブルを見るとどの商品がどれだけ売れたかの確認をすることが出来ます。
Tableau Desktop(twbファイル)のDB接続情報をPythonで書き換える方法

TableauをSSH接続などによってローカルからDB環境に接続している場合、Tableau ServerにPublish後にデータソースの接続情報を書き換える必要があります。
Publish後にいちいち手作業でデータソースの接続設定を書き換えるのは手間なので、Pythonを使って自動でDB接続情報を書き換える方法を紹介します。
Tableau Desktop(twbファイル)の実態はXMLファイルなので、Pythonのライブラリを使えば簡単にパース、書き換えもできてしまいます。
(以下、twbファイルの実態)
<img width="1231" alt="スクリーンショット 2019-07-05 21.45.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/337794/0d1c7a9a-424f-9a92-0f63-563725304b36.png">

# 環境

- mac High Sierra 10.13.6
- Tableau 2019.2.1
- Python 3.6.6

# ディレクトリ構成
`config`配下に設定ファイル、`src`配下にpyファイルをおきます。

```
root/
　├ config/
　├ src/
```

# 設定ファイル
`config`配下に以下を作成します。

```conf.ini
[file]
# 書き換え対象のtwbファイル
TWB_FILE_PATH =
[parser]
# db接続情報を属性にもつタグ
DB_CONF_PATH = datasources/datasource/connection/named-connections/named-connection/connection
[db]
# 書き換え後のdb接続情報
PORT = 
SERVER = 
DBNAME = 
USERNAME = 
PASSWORD = 
```

# スクリプトファイル
以下のスクリプトを実行することで、twbファイルが書き換えられます。
XMLパースし、attributeを書き換えるだけの処理です。

```main.py
import ConfigParser
import os
import sys

import xml.etree.ElementTree as ET

# 設定ファイルの読み込み
conf = ConfigParser()
# iniファイルの絶対パスを指定
conf.read(os.path.dirname(os.path.abspath('__file__')) + '/../config/conf.ini')

try:
    # XMLを解析 
    tree = ET.parse(conf.get('file', 'TWB_FILE_PATH')) 
    # XMLを取得 
    root = tree.getroot()
# twbファイルのXMLパースに失敗した場合
except Exception as e:
    print(f'{e}')
    sys.exit(1)
    
# DB接続情報が記載されている属性を書き換え
for result in root.findall(conf.get('db', 'DB_CONF_PATH')):
    # 属性の書き換え
    result.set('port', conf.get('db', 'PORT'))
    result.set('username', conf.get('db', 'USERNAME'))
    result.set('dbname', conf.get('db', 'DBNAME'))
    result.set('server', conf.get('db', 'SERVER'))
    result.set('password', conf.get('db', 'PASSWORD'))
    
# 書き換えたXMLファイルを反映
tree.write(file_path, xml_declaration=True)
print('rewrote db_connection info.')
```
Mockery with()  でメソッドがObjectを渡す検証でNoMatchingExpectationException

## with()  にObjectを渡す検証でNoMatchingExpectationExceptionが出る
mockしたRepositoryクラスのメソッドの呼び出しの検証をするServiceTest.phpを作りました。

```php
    public function test_reset_case1_Entityのインスタンスでfail_countが0のデータがrepositoryのresetCountの処理に渡される()
    {
        $test_id = 1;
        $expected = new Entity([
            'fail_count'=>0,
        ]);
        $mock_Repository = \Mockery::mock(Repository::class);
        
        $mock_Repository->shouldReceive('resetCount')
                           ->once()
                           ->with($test_id, $expected);
        $Service = new Service($mock_Repository);
        $Service ->reset($test_id);
    }
```
Service の resetでRepository のメソッドresetCountを呼ぶ検証でMockeryのwith()を使って引数の検証をしています。このテストが下記のようなテスト結果となりました。

```
1) Tests\Unit\ServiceTest::test_reset_case1_Entityのインスタンスでfail_countが0のデータがrepositoryのresetCountの処理に渡される
Mockery\Exception\NoMatchingExpectationException: No matching handler found for Mockery_0_App_Repository::resetCount(1, object(App\Entity)). Either the method was unexpected or its arguments matched no expected argument list for this method

Objects: ( array (
  'App\\Entity' =>
  array (
    'class' => 'App\\Entity,
    'properties' =>
    array (
    ),
  ),
))
```
（最初はExceptionのメッセージからmockオブジェクトをLaravelのコンストラクタインジェクションできないのかと思ってしまったのですが、原因は違いました。）
## 原因: with()の引数にオブジェクトがそのまま渡せない
原因はwith()での検証にobjectをそのまま渡していたことが原因でした。
https://github.com/mockery/mockery/issues/328

## 代わりにMockery::onで引数の検証を行うクロージャを渡す
https://laradevtips.com/2018/12/01/unit-tests-complex-argument-matching-with-mockeryon-the-right-way/
オブジェクトをwithに渡す場合はMockery::onでtrueを返すclosureを渡し、その中で引数の検証ができるようでした。

```php
    public function test_reset_case1_Entityのインスタンスでfail_countが0のデータがrepositoryのresetCountの処理に渡される()
    {
        $test_id = 1;       
        $expected = new Entity([
            'fail_count'=>0,
        ]);
        $mock_Repository = \Mockery::mock(Repository::class);
        
        $mock_Repository->shouldReceive('resetCount')
                            ->once()
                            ->with($test_id, \Mockery::on(function($actual) use ($expected) {
                                $this->assertInstanceOf(Entity::class, $actual);
                                $this->assertEquals($expected, $actual);
                                return true;
                            }));
        $Service = new Service($mock_Repository);
        $Service ->reset($test_id);
    }
```
これでテストが通りました。

```
...                                                                 1 / 1 (100%)

Time: 1.05 seconds, Memory: 16.00 MB

OK (1 tests, 3 assertions)
```
同期ストリーム！！

# はじめに
同期ストリームとは、スレッドセーフに使えるストリームのことです。C++20 で追加されます。（2019/07/05 現在 gcc, clang 未実装です。）これを使うと、`std::cout`などのストリームに、アトミックに出力することができます。また、ここでは入力はサポートされていません。

# 使い方
これを使うためのヘッダは`<syncstream>`です。例を次に示します。

```cpp
#include <iostream>
#include <syncstream>
#include <thread>

void thread1()
{
  {
    std::osyncstream bout{std::cout};
    bout << "Hello, ";
    bout << "World!";
    bout << std::endl; // フラッシュがノートされます
    bout << "and more!\n";
  }   // 文字が転送され、cout はフラッシュします
}

void thread2()
{
  // 同じバッファに行われる出力は、異なる std::basic_osyncstream(std::basic_syncbuf) の
  // インスタンスからでも、アトミックに出力されることが保証されます
  std::osyncstream(std::cout) << "Goodbye, " << "Planet!" << '\n';
}

int main()
{
  std::thread th1(thread1);
  std::thread th2(thread2);
  th1.join();
  th2.join();
}

// 出力 :
// Hello, World!
// and more!
// Goodbye, Planet!

```

上記のように、`std::osyncstream`のオブジェクトを、出力したいストリームで初期化するだけで OK です。また、同じストリームへの出力は、どの`std::osyncstream`オブジェクトからでもアトミックに出力できます。そのため、この実装はラップされたストリームのアドレスをキーとする `static` なハッシュマップとしてロックを保持するようなものになるようです。

注意しなければならないことは、`std::osyncstream`が文字をストリームへ転送するのは、メンバ関数`emit()`が呼ばれたときだということです。メンバ関数`emit()`は明示的に呼ぶこともできますが、`std::osyncstream`オブジェクトのデストラクタが呼ばれる際に自動的に呼ばれるので、デストラクタに任せることもできます。上の例では、後者のデストラクタによる`emit()`の呼び出しによって、文字を転送しています。

# 挙動のカスタマイズ

上記のような理由で、通常は、同期ストリームのオブジェクトに`std::endl`などを使用しても、直ちに文字が転送され表示されることはありません。ただし、`std::endl`などによって`std::flush`が呼ばれる際に、自動的に`emit()`を呼び出すようにすることができます。この例を、次に示します。

```cpp
#include <iostream>
#include <syncstream>

int main()
{
  std::osyncstream bout{std::cout};
  bout << "Hello, World!";

  bout << std::emit_on_flush; // ☆

  bout << std::flush; // 通常はここで保留中の文字は転送されませんが、
                      // emit_on_flush を呼び出し、同期時排出ポリシーが true となっているため、
                      // ここで文字が転送されます。
}
```

☆の部分で、`flush()`が呼ばれたときに、`emit()`を呼び出すかどうかを表す内部フラグを`true`にしています。同期時排出ポリシーとは、このフラグのことだと思われます。`std::emit_on_flush`と対になるマニピュレータに、`std::noemit_on_flush`があります。こちらは、同期時排出ポリシーを`false`に設定します。（デフォルトでは、`false`になっています。）

また、同期時排出ポリシーを変更しなくても、`std::flush_emit`を上記の例のように使用することで、その時点で文字を転送し、ストリームをフラシュさせることができます。

# まとめ
`std::osyncstream`を使うことで、ストリームへアトミックに出力できます。ただし、文字はメンバ関数`emit()`が呼ばれた際に転送されます。
Electronで設定ファイルを導入



# Electronに設定ファイル機能を導入する

Electronで設定値を保存するためのライブラリは以下の２つがある。

`electron-store`(旧 electron-config)
　シンプルで使いやすい。

`electron-json-storage`
　コールバック方式で使いにくい。

`electron-store`を使いたかったが自分の環境だとなぜかelectron-builderでアプリをパッケージ化するとSyntaxエラーになって動かないため`electron-json-storage`を使用した。解決出来た人がいたら教えて欲しい。

## electron-store
[GitHubはコチラ](https://github.com/sindresorhus/electron-store)

### インストール方法
```
npm install electron-store
```

### デフォルトの保存場所
デフォルトでは`app.getPath('userData')`の下にconfig.jsonファイルが作成される。
#### Windowsの場合のパス

```
C:\Users\【ユーザー名】\AppData\Roaming\【パッケージ名】\config.json
```

### 使用例

``` javascript
    const Store = require('electron-store');
    const store = new Store({
        cwd: __dirname,  // 保存ディレクトリを指定　※省略可。推奨されていない
        name: 'config'  // 設定ファイル名を指定　※省略可。拡張子は.jsonになる
    });

    //設定ファイルにデータを保存する。（programsというキーでJSONデータを保存する）
    store.set("programs", { index: 1, name: 'TEST', path: 'c/' });

    //設定ファイルからデータを読み込む。（programsというキーを取得する。取得出来ない場合は、第二引数で指定しているJSONデータを読み込む）
    const programs = store.get("programs", 
      { index: 0, name: 'TEST', path: 'c/' }
    );
```

エンジニアに役立つ情報をTwitterでも発信していますので宜しければTwitterの方もフォローをよろしくお願いします！
[Twitterへのリンクはコチラ](https://twitter.com/mr_t_free)
謎の数字の出力について

以下のようなプログラムを書き、
iがint型であることは承知の上で"hshs"と適当な文字列入力すると
253481014
210624566
8767083
などのよくわからない数字の羅列が出力されました。
毎回出力するたびに違う結果がランダムに出るような気がするのですがこの数字の羅列はどこからきたものなのか教えていただきたいです。


#include<stdio.h>
　　int main(void){
　　　　int i;

　　　　scanf("%d",&i);
　　　　printf("%d\n",i);

　　　　return(0);
　　}
AWS-SDKをJestでSimpleにMockしてみよう。Simplify Mocking AWS-SDK with Jest to be simple

# 背景
AWS-SDKをMockする記事はたくさん見つかるが、どれもとてもめんどくさく感じていた。もっと簡単に、できれば余分なパッケージとか使わないで、できるだけ簡単にMockしたい。

# 方針
- AWS-SDKは結局WebAPIへのラッパーで、内部構造は、services というオブジェクトの中に各メソッドが入っている。
- 汎用性を高めるために、servicesは日付でバージョニングされている。
- 各サービスオブジェクトをnewすると、最新のservicesが呼ばれる仕様。（古いAPIを各サービスのコンストラクタで指定することもできる）

これらの構造を逆手にとって、servicesの特定のメソッドを直接指定してMockingすれば他のメソッドに影響なく、ピンポイントでMockingすることができる。

#コード例
AWS-SDKをシンプルにMockする。(例はLambda invoke)
APIバージョンは適当に切り替わるようにしとくとよいよね。

**example.test.ts**

```
import * as AWS from 'aws-sdk'
jest.spyOn(AWS.Lambda.services ["2015-03-31"].prototype, 'invoke').mockImplementation( (request) => {
    return {promise: () => 'debug'}
})
```

- 多くの場合、promise()を呼んでると思うので、promise()メソッドを内包したオブジェクトを返してあげよう。

- spyOnを使っているのは、jest.restoreAllMocksメソッドで簡単にMockをキャンセルできるようにするため。

これくらい簡単にMockできたら、テスタブルにするために、AWS-SDKをラップするクラスを作って、DI(Dependency Injection) する構造にしなくてもよい。使いたいときに使えばよくなる。
「LINE AI Talk #02」に参加してきた

# はじめに
[LINE AI Talk #02](https://line.connpass.com/event/135072/)に参加してきたのでそのことについてまとめます。ここでは音声・信号処理に関する研究にフォーカスされているようでした。セッションの数は２つです。場所は新宿駅のミライナタワーでした。ここにくるのももう何回目かわかりませんw

# Making sense of data on networks: a graph signal processing approach（Antonio先生）

タイトルの通り英語のセッションでした。私の英語力はksなのであまり正確にはまとめられてないのでそこはご容赦ください。一応翻訳ありでしたが、やはり日本語の講演よりは聞き取れる情報量がかなり少なかったです。。。このセッションのメインのワードになっているのは[グラフ信号処理](https://www.jstage.jst.go.jp/article/essfr/8/1/8_15/_pdf)です。</br>
センサーネットワークやソーシャルワークネットワークを理解するためにはグラフ間の値の変化を処理する必要がありここに機械学習が適用されます。しかしグラフを機械学習に適用させるためには様々な課題がありそのためにグラフという表現を用います。ここから先は固有ベクトルやら固有値やフーリエ変換の細かい話があったので省略します。要はグラフ間（学習データ）の値のバラツキ・変化を周波数として表現するということみたいです（だと解釈しました）。このグラフという表現を使うことで半教師あり学習（SSL）という技術が実現することができます。この技術は既知の教師ラベルから未知のラベルを予測することができます。</br>
最新の研究事例としてNon Negative Kernel Regressionというメソッドを紹介されました。またDeepleaningに対するアプローチとしてもGraph Signal Variation（GSV）がデータセットのラベルを多様化させることに対して効果的であるいうお話をされました。</br>
正直専門外のお話だったので日本語で聞いても理解できたかどうかわかりませんでした。とりあえず今回はグラフ信号処理というものが機械学習の効果的なアプローチの一つとして存在することがわかりました。。。一応関係しそうな論文は[ここ](http://www.pcsj-imps.org/archive/2014plenary1Ortega_Intro.pdf)でおちていたっぽいです。

# 深層学習を用いた複数マイクロホンの音源分離 / Multi-channel speech source separation with deep learning（戸上先生）

日本語のセッションだったので聞き取れました(笑)。音源分離だと独立成分分析というイメージしかありませんでしたが、ここでは深層学習を使っての音源分離を紹介されました。深層学習でも信号処理を用いることはモデルを最適化させることにとても重要であり、両方の技術を組み合わせることが重要とのことです。</br>
音源分離で取りたい音だけをとることはとても難しく、マイクから音として入ってくる情報にはノイズの混じったものとなってしまいます。この信号を分離させるには音源モデル（音声としての周波数特性）と空間モデル（マイクに声が届く時間差や位相差）を考慮します。こういったモデルベースのアプローチにはICA/LGM/IVA/ILRMAなどの様々な技術があります。またそれにDNNを組み合わせた技術も存在します。</br>
しかしこれらの音源分離は分離した後の音質を保証するものであはありませんでした。そこでこのセッションではLINEとしてのアプローチとして音源分離した後の音のクリーンさを保証するシステムについてお話をされました。</br>

# さいごに

今回の勉強はかなり学術的な話だったのでまとめることが難しく、技術的な詳細までは理解できませんでした。。
VuexFireのAction dispatchが動かない

詳細は、[Dispatching enhanced action not working]
(https://github.com/vuejs/vuefire/issues/242)ですって。


それも[この時代のREADME](https://github.com/posva/vuexfire/tree/b42e825e55c2f47298f280e7c7da3e4215339d30)が間違っているのが悪い。(この記事書いている時点で最新なのに)

```
const setTodosRef = firebaseAction(({ bindFirebaseRef, unbindFirebaseRef }, { ref }) => {
  // this will unbind any previously bound ref to 'todos'
  bindFirebaseRef('todos', ref)
  // you can unbind any ref easily
  unbindFirebaseRef('user')
})
```

というのをActionsに追加するのであれば、呼び出し側は

```
    this.$store.dispatch('setTodosRef', db.collection('todos'))
```

ではなく

```
    this.$store.dispatch('setTodosRef', { ref: db.collection('todos') })
```

が正しい。
Python 組み合わせ(combination)

# はじめに

異なるn個のものの中からr個を選ぶ場合の数を組み合わせと呼ぶことにし、以下のようにあらわす。

```math
{}_n C _r = \frac{n!}{r!(n-r)!}
```

pythonで${}_n C _r$を求める方法をいくつか取り上げる。

# mathモジュールから自作
mathモジュールには組み合わせを直接求める関数がないため、上にあげた定義に基づき関数を作成する。

```python:combination_1.py
import math
def comb(n, r):
    return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
base = comb(5,3)
print(base) # 10
```

# scipyの組み込み関数
組み合わせの数を最も簡単に求められる方法。
scipy.special.comb — SciPy v1.3.0 Reference Guide
https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.comb.html

```python:combination_2.py
from scipy.special import comb
base = comb(5, 3, exact=True)
print(base) # 10
```

# itertoolsの組み込み関数
組み合わせをそのものを具体的に用意し、組み合わせの数を調べ${}_n C _r$を得る。組み合わせの数のみを求める場合はやや非効率。

```python:combination_3.py
from itertools import combinations
base = list(combinations("abcde",3))
print(base)        #[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'b', 'e'), ('a', 'c', 'd'), ('a', 'c', 'e'), ('a', 'd', 'e'), ('b', 'c', 'd'), ('b', 'c', 'e'), ('b', 'd', 'e'), ('c', 'd', 'e')]
print(len(base))   # 10
```

# nを固定してrの変化を求める場合
nを固定し$(0\leq\ r \leq\ n)$でrを変化させ複数の${}_n C _r$を求めるとき、連続する${}_n C _r$、${}_n C _{r+1}$$(0\leq\ r \leq\ n-1)$の二項間漸化式としてそれぞれを求める方法を考える。

```math
{}_n C _r = \frac{n!}{r!(n-r)!}\\
{}_n C _{r+1} = \frac{n!}{(r+1)!(n-r-1)!}\\
\frac{{}_n C _{r+1}}{{}_n C _r} = \frac{n!}{(r+1)!(n-r-1)!} \frac{r!(n-r)!}{n!} = \frac{n-r}{r+1}\\
{}_n C _{r+1} = {}_n C _r \frac{n-r}{r+1}
```

```python:combination_4.py
n = 5
nCr = 1
print(nCr)
for r in range(n):
    nCr_1 = nCr * (n - r) // (r + 1)
    nCr = nCr_1
    print(nCr_1)
# 1 5 10 10 5 1
```

これは${}_n C _r$$(0\leq\ r \leq\ n)$を個別に計算するよりも軽快に求まる。


#参考記事
https://www.haya-programming.com/entry/2018/04/14/185828
DockerとDocker ComposeのTerminal UI「lazydocker」のご紹介

## lazydocker

<img width="1138" alt="スクリーンショット 2019-07-05 21.03.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/ad156039-4be5-78a4-4d5f-a2b68032f0e4.png">

## 概要

LazyDockerは、DockerおよびDocker ComposeをTUIで操作できるツールです。
docker、docker-composeコンテナ環境の状態の表示、ログの表示、コンテナまたはサービスの再起動/削除/再構築などが1つのウインドゥで実行できます。
Githubでソースは公開されておりGoで実装されているようです。

[jesseduffield/lazydocker](https://github.com/jesseduffield/lazydocker)

公開されたばかりですがスター数の伸びがとてもすごいです(7/5現在で7000ほど)

##　実行環境

* macOS Mojave

``` console
$ docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     false

$ docker-compose version
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.6
OpenSSL version: OpenSSL 1.1.0h  27 Mar 2018
```

## インストール

macの場合はリポジトリを追加してbrew installだけで完了です。

``` bash
$ brew tap jesseduffield/lazydocker
$ brew install lazydocker
```

Linuxの場合もインストール方法などはREADMEをご参照ください。
[README.md](https://github.com/jesseduffield/lazydocker/blob/master/README.md)

``` console
$ lazydocker -h
lazydocker - The lazier way to manage everything docker
https://github.com/jesseduffield/lazydocker

  Flags:
       --version  Displays the program version string.
    -h --help  Displays help with available flag, subcommand, and positional value parameters.
    -c --config  Print the current default config
    -d --debug  a boolean
    -f --file  Specify alternate compose files
```

## できること

* コンテナの状態の表示
* コンテナのログの確認
* メトリクスの視覚化
* コンテナの再起動/削除/リビルド
* イメージの詳細の確認

imageのdockerfileなんかも同一画面から確認できます。

## 使い方

![名称未設定.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/ee3906d3-2dd3-8665-ef18-6536d1006676.gif)

インストール後は``` lazydocker ```で起動します。
キーボードでの操作に加えマウスでの操作も可能です。
キーバインドについては下記をご参照ください。

https://github.com/jesseduffield/lazydocker/blob/master/docs/keybindings/Keybindings_en.md

「r」で再起動や「s」で停止などなど簡単にコンテナ操作ができます。

動画でも使い方説明されているのでこちらも
https://www.youtube.com/watch?v=NICqQPxwJWw&feature=youtu.be

Configを書き換えるだけで見れるデータなども簡単に変えることができます。

<img width="631" alt="スクリーンショット 2019-07-06 14.44.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/98f48e34-e0bb-6327-d223-8952656e974b.png">


## 参考リンク

* [jesseduffield/lazydocker](https://github.com/jesseduffield/lazydocker)

## 終わり

CPU/メモリの使用量がグラフィカルに見れるのはとても便利で、コンテナ再起動なんかも同一のウィンドウでできるのも強いです。
カスタムキーバインドの話なんかも出てたり機能強化のissueなんかみても今後がとても楽しみですね(https://github.com/jesseduffield/lazydocker/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement)
Vuex@3.0.0-alpha6以上あたりで、firebaseMutationsがないだの collection.on is not a functionだのでて動かない

## 原因

バージョンアップで使い方が変わった(この記事を書いている時点でvuexfire 3.0.0-alpha.18)

> vuexfire：firebaseMutationsの名前をvuexfireMutationsに変更しました。 RTDBの使用も許可したいのでfirebaseActionをfirestoreActionに変更し、その名前をfirebaseActionにも使用します。
> 原文: vuexfire: Rename firebaseMutations into vuexfireMutations. Rename firebaseAction into firestoreAction since we want to allow using RTDB as well and that name will be used for the firebaseAction as well
[引用](https://github.com/vuejs/vuefire/blob/master/CHANGELOG.md#breaking-changes-1)

しかも https://github.com/posva/vuexfire は途中から https://github.com/vuejs/vuefire/tree/master/packages/vuexfire に写ったため、[古い方のREADME](https://github.com/posva/vuexfire/blob/master/README.md)を参考にして使おうとすると駄目。ちゃんと[新しい方のREADME](https://github.com/vuejs/vuefire/blob/master/packages/vuexfire/README.md)を参考にしよう。


## 対処法

Firestoreを使っているとして、importするモジュールを下記に変更

```
- import { firebaseAction, firebaseMutations } from 'vuexfire'
+ import { firestoreAction, vuexfireMutations } from 'vuexfire'

```
vscode↔XAMPP-VM for OS X のPHPリモートデバッグにドハマりした話

## TL;DR
vscode で XAMPP-VM for OS X + XDebug 使って PHPリモートデバッグするときは
PHP.ini の xdebug.remote_host に
Mac のプライベートIPアドレス を指定してやればいい
プライベートIPアドレスは `ifconfig` や システム環境設定 > ネットワーク から確認

## なんで XAMPP-VM for OS X なんか使ってるの？
なんで Mac で XAMPP しかも VM 版なんか使ってるの？
Mac なら PHP 入ってるしビルトインサーバもあるでしょ。
Docker 使うのもいいよね。
わかる。誰だってそうする。私だってそうする。

でも今回は XAMPP-VM for OS X 使ってる環境で
デバッグしないとだったので戦ってみました。
ちなみに調べてる最中で stackoverflow など含めてネット上に一番多かった情報は
「VM 版じゃないほう使ったら解決しました！！」でした。わかる。

## なんでハマったの
- Virtual Box だとゲストOSからホストOSにアクセスするときは(デフォルトで)ホストOS側に 10.0.2.2 が割りあてられてるよなーみたいな知識にひっぱられた
  - Virtual Box は仮想ネットワークがあるもんね。。。
- Docker だと host.docker.internal ってのも使えるよねっていう知識にひっぱられた
  - Docker の ネットワーク略
- おめーが XDebug のことちゃんとわかってなかっただけだろ
    - はい。。。。2時間半ぐらい戦いました猛省します

## 参考にしたサイトなど
- [PHP Debug - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug)
- [vscode↔Docker内PHPでリモートデバッグしたときにハマったこと - Qiita](https://qiita.com/TakamiChie/items/9e53e1a3e180c5c8c88f)
- [DockerでXDebug使ってPHPデバッグする際はremote_connect_backが使えない - Qiita](https://qiita.com/saken649/items/2a0c4e4c9c7a845b17ea)
    - XAMPP-VM for Mac OS X でも xdebug.remote_connect_back ではだめだった
- [PhpStormを使う。VirtualBoxのPHPでXdebug設定 - TECH Pjin](https://tech.pjin.jp/blog/2016/06/30/phpstorm-virtualbox-xdebug-setting/)
- [[PHP] Xdebug のリモートデバッグ、理解していますか？ - Qiita](https://qiita.com/castaneai/items/d5fdf577a348012ed8af)
- [Macで自分のIPアドレスを調べる方法 - minto.tech](http://minto.tech/mac-ipaddress/)
StreamingAssetsに置いた圧縮済みテキストをロードする (unity)

# 前提
- unity 2018.4.3f1

# やりたいこと
- StreamingAssetsにgzip圧縮したテキストファイル(.txt.gz)を入れておき、ランタイムに読み出して使いたい。

# コード
```cs:
using System.IO;
using System.IO.Compression;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;

public class SampleMain : MonoBehaviour {

	void Start () {
		Debug.Log ("sample.txt.gz".LoadStremingText () ?? "Error");
	}

}

public static class Sample {

	public static string LoadStremingText (this string filename) {
		string sourcePath = Path.Combine (Application.streamingAssetsPath, filename);
		var gz = filename.EndsWith (".gz");
		if (sourcePath.Contains ("://")) { // Android
			using (var www = UnityWebRequest.Get (gz ? sourcePath.Substring (0, sourcePath.Length - 3) : sourcePath)) {
				www.SendWebRequest ();
				while (!www.isDone && !www.isNetworkError && !www.isHttpError) { }
				if (!www.isNetworkError && !www.isHttpError) {
					return www.downloadHandler.text;
				}
			}
		} else if (File.Exists (sourcePath)) { // Mac, Windows, iPhone
			if (gz) {
				using (var data = File.OpenRead (sourcePath))
				using (var compresed = new GZipStream (data, CompressionMode.Decompress))
				using (var text = new MemoryStream ()) {
					compresed.CopyTo (text);
					return Encoding.UTF8.GetString (text.ToArray ());
				}
			} else {
				return File.ReadAllText (sourcePath);
			}
		}
		return null;
	}

}
```

# 留意点
- Androidでは、StreamingAssetsがアーカイブされたままで、かつ、[.gzファイルがビルド時に展開されてしまう](https://qiita.com/tetr4lab/items/44f0afd417080d290390)ので、別に処理しています。

# 修正
- 2020/04/04
    - iOSでアクセス権違反が生じるため、`new FileStream (sourcePath, FileMode.Open)`を`File.OpenRead (sourcePath)`に置き換えました。
        - [参考情報](https://forum.unity.com/threads/accessing-files-in-streamingassets-on-ios-access-denied.261994/)
[初心者向け]　rails日付けの扱い time.nowとtime.zone.now

日付けを扱う際、どのように記述していますか？
日付けの扱い、書き方については、以下の記事がとても参考になりました。
https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c

ここでは、time.nowとtime.zone.nowの違いについて書いていきます。

###time.nowとtime.zone.nowの違い
１番の違いは、環境変数に依存するかどうかです。

time.nowを使った場合、もちろん日時はこれでも取得できるのですが、環境変数に依存してしまいます。しかし、time.zone.nowを使うと、環境変数に依存せず、config/applictation.rbの方を参照します。

おそらくconfig/applictation.rbを見ていくとこのような記述を見つける事が出来ると思います。
`config.time_zone = 'Tokyo'`

time.zone.nowを使うと、このconfig.time_zone = 'Tokyo'の部分を参照して、設定した地域の時間を出してくれます。

私自身、time.nowを使っていたのですが、エンジニアの方に、「railsを使うなら、config/applictation.rbの設定に従うように書いたほうがいいよ」と指摘され、特に理由がないなら、time.zone.nowを使うようになりました！

他にも違いや色々な書き方があるので調べてみると面白いですよ！

ーーーーー参照ーーーーーーーーーー
https://qiita.com/mmmm/items/efda48f1ac0267c95c29

https://doruby.jp/users/takeshita/entries/Rails-%E6%99%82%E5%88%BB%E5%87%A6%E7%90%86%E3%81%A7%E3%81%AF%E3%80%81Time-current--Time-zone-local-%3CTimeWithZone%E3%82%AF%E3%83%A9%E3%82%B9%3E-%E3%82%92%E4%BD%BF%E3%81%86

https://qiita.com/aosho235/items/a31b895ce46ee5d3b444
[インフラ]サーバに繋がらずタイムアウトしてしまう現象に、プロセスをkillしてサーバを再起動して復旧した話

# はじめに
WEB開発中に、突如サーバからのレスポンスが返って来なくなりました。
結論から言うと、**謎のプロセスがいくつか立ち上がっていて、killして再起動すると無事復旧しました。**
備忘録的にまとめておきます。
# エラーメッセージ
エラーメッセージは以下の通りです。

```
504 Gateway Time-out
```
これは、ただのタイムアウトエラー。解決の糸口になってくれそうにはありません。


```terminal
WARN  Address 0.0.0.0:3005 is already in use. 
```
あとあと気が付いたのですが、このエラーメッセージに、思いっきり答えが書いてました。
3005ポートはすでに使ってますよ的な感じかな。
# 解決した方法／プロセスkill→サーバ再起動
手順としては、
1. プロセスの確認
2. 何か動いている
3. PID確認
4. プロセスをkill

という流れです。
## プロセスの確認

```bash:プロセス確認のコマンド
$ lsof -i:3005 # 3005はポート番号
```
3005番は僕の環境のポート番号です。
みなさんの環境ごとに適当な数字に変えてください。

```terminal:プロセス確認の結果
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
node    14475 ec2-user   21u  IPv4 26460768      0t0  TCP *:geniuslm (LISTEN)
node    14475 ec2-user   23u  IPv4 26464688      0t0  TCP localhost:geniuslm->localhost:46510 (CLOSE_WAIT)
node    14475 ec2-user   24u  IPv4 26461490      0t0  TCP localhost:geniuslm->localhost:45830 (CLOSE_WAIT)
node    14475 ec2-user   29u  IPv4 26461496      0t0  TCP localhost:geniuslm->localhost:45840 (CLOSE_WAIT)
```
開発環境がAWSのEC2のため、USERはec2-userになっています。

そして…3005番ポートには、なにやら色々出てます。
`(CLOSE_WAIT)`というのがたくさん出ているので、Nuxt.jsのdevelopmentモードで立ち上げていたサーバが、うまく終了できていなかったのか…
この辺は、残念ながらよくわかりませんが、とりあえず意図していないものが動いているのが判明したので、これをkillします。
## PID確認
killするには、PIDを確認しておく必要があります。
そのまま、さっきの画面で確認できます。

```terminal:プロセス確認の結果
COMMAND   PID     USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
node    14475 ec2-user   21u  IPv4 26460768      0t0  TCP *:geniuslm (LISTEN)
node    14475 ec2-user   23u  IPv4 26464688      0t0  TCP localhost:geniuslm->localhost:46510 (CLOSE_WAIT)
node    14475 ec2-user   24u  IPv4 26461490      0t0  TCP localhost:geniuslm->localhost:45830 (CLOSE_WAIT)
node    14475 ec2-user   29u  IPv4 26461496      0t0  TCP localhost:geniuslm->localhost:45840 (CLOSE_WAIT)
```
この結果から、PIDが`14475`だと分かります。
## kill作業
コマンドは

```terminal:killコマンド
$ kill -9 14475
```
`-9`は強制的にkillするためのパラメータだそうです。
ちなみに、一度`-9`なしで実行してみたのですが、プロセスがkillできていませんでした。
再度、確認のために、

```bash:プロセス確認のコマンド
$ lsof -i:3005 # 3005はポート番号
```
を打ってみるも、結果は何も出ず。
うまく、killできたようです。
# サーバの再起動
あとは安心して、サーバを起動させます。
ちなみに僕は、

```
$ yarn dev --port 3005
```
で、Nuxt.jsのdevelopmentモードでサーバを立ち上げています。
今回はこれで、無事ブラウザにアプリが描画されました。
# まとめ

 - サーバからのレスポンスがめっちゃ遅い場合、ポートを他のプロセスで使ってしまっている可能性がある
 - プロセスの確認は`$ lsof -i:{ポート番号}`
 - PIDを確認して、不要であればプロセスをkill
 - killするには`$ kill -9 {PIDを入力}`

# さいごに
ろくに解説もできておらず、申し訳ないですが、せめてうまくいったことだけでも、共有させて頂いております。
最後までありがとうございました。
仮定ではなく、正しい予測の大切さ

##はじめに

自己紹介
株式会社リコーテクノロジー13年勤め、現在はヘテロマルチコア向けのソースコード解析、最適化を行うSilexicaでField Application Engineer として勤めています。

記事内容
現在でもスプレッドシート(Excel)が、プログラミングの主流ツールとして使われています。ですがプログラミングの複雑さは増加の一途を辿っており、組込みエンジニアは、設計の際に経験に基づいた推測からコードのカット＆エラーを繰り返しています。SLXを始めとする最新のソフトウェアプログラミングツールを使用し、プログラムデザインを効率化する重要性についてお話をします。


##次世代プロセッサ

需要に先駆けて次世代プロセッサやSoCに様々な機能や特徴が追加されていたことはあまり昔のことではないように感じます。新しいプロセッサがリリースされた際には、組み込みソフトウェアデベロッパ達が、製品の差別化を目的として、新しい機能を活用する画期的な方法を常に考えていたことも思い出しますね。

さて、昨今全くもって状況は変わりました。ソフトウェアエンジニア達は、日に日に増えるコンピューティングパワーへの需要を満たすためのソリューションを探し、日々奮闘しています。半導体パッケージにいくつのコアを詰め込むことが出来るのか？と考える日々です。自動運転、AI、および5Gなどは、ソフトウェア開発者がセミプロバイダーに対して、更なるコンピューティングパワー持った製品を提供するよう求めている例の一部です。

自動運転やAIといったバーティカル市場を考えた時に、将来の事まですべてきちんとした計画を持って物事が動いているように感じます。現代のマルチコアSoCの容量だけでなく、将来的なメモリー容量ですら既にどう消費していくかが決まってる、といった具合に。

しかし現実組込みプログラムデベロッパーには、次世代機能向けのコードを生成しつつ、半導体とコードリファクタリングを通じた既存システムの最適化が求められています。つまり、未来のプログラミングだけに集中することは出来ず、現在のシステム最適化も同時に進めることも求められており手一杯な状態です。もちろん既存のシステム最適化は複雑な作業の為むしろ仕事の多くが未来ではなく現在に向いてしまっていることも多くあります。例えば、自動車において分散型コンピューターが中央演算処理装置に取って代わられた AUTOSAR ClassicからAUTOSAR Adaptiveへの移行。これは、単純に半導体サプライヤーに対して、新たな組み込みコンピューターの提供を強制するだけに終わってしまいました。

##膨大な時間の消費と作業

より多くのコアがSoCに追加され、より多くのソフトウェアが統合されるにつれて、ソフトウェアデベロッパはシステムの最適化に多くの時間を費やすことになります。たくさんのコアがあるということは、プロセス、タスク、スレッドを分散するためにより多くのオプションを生み出します。下の順列の式を思い出すことで、どれほどの選択肢を考えなくてはならなくなるのかを考えていただけると思います。

nCr = n！ / r！（n-r）！

つまり、利用可能なコア数とマッピングされるソフトウェアタスクの数に応じてさまざまな組み合わせがあり、その選択肢は簡単に数千に到達します。

 

また、その際に課題になるのはマッピングではなく、テストマッピングが問題になります。タスクをコアに正しく配置し、システムをテストするには複雑なツールが必要になります。タスクの依存関係、メモリアクセスの負担、チャネルのオーバーヘッド、ソフトウェアの依存関係などを複合的に解析が出来るツールであり、ゼロサムゲームではないため非常に複雑です。

 

あるコアから別のコアにタスクを移すことで、メモリオーバヘッド、チャネル負荷、可変アクセスなど、その他の多くの依存関係性から遅延時間が発生する可能性があります。これにより、パフォーマンスに問題が生まれたり、タスクが放置されてしまったり、といった状況が生まれることがあります。EDAツールがハードウェアエンジニアの大きな助けになったのに対し、ソフトウェア開発者には開発ツールが多くないことからハードウェア開発者に比べてやや難しい状況に置かれているでしょう。

EDAツールは、設計の複雑化にも対応しハードウェア開発者の生産性を向上させました。その一方で、ソフトウェア開発ツールの発展は全く進んでいません。

いまだに、スプレッドシートを使用してタスクマッピングとスケジューリングを導き出していることからもわかると思います。シンプルな問題を解決するのに、スプレッドシートはおそらく完璧なツールでしょう。しかし、問題はもはや一次元的な問題ではなく、多次元的です。ルービックキューブによく似ています。それでも、今日利用可能なツールは、過去に使用されたものと同じ直線的な考え方しか出来ないツールです。![Cube_Blog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425340/9289499c-1fd3-435b-65a8-56f42f6447a3.png)

つまり誰かが新しく何かを始める際には、仮説を作り検証しなければならない、ということです。

##「what-if」分析を行うツール

仮説が証明されることにより物事は学問的になり、普遍化します。証明されていない仮定は依然として仮定です。現状、ソフトウェアデベロッパーには、メモリアクセス、通信チャネルなどのオーバーヘッド負担を伴うタスクマッピングやスケジューリングをテストするための「what-if」分析を行うツールがないので、仮定を検証することは困難です。

仮に、比較的簡単な質問であっても経験則から答えるのは難しいでしょう：例えばプログラムには4つのコアが最適なのか、8つのコアが最適なのか。また、パフォーマンス、パケット処理、および処理を改善するために、タスクをどのように配置すべきだろうか。といった質問です。

組み込みソフトウェアデベロッパーにとって、使用される可能性のあるツールは、コストがかかりすぎるか、遅いか、スケーラビリティがないか、または利用できないかのいずれかでしょう。

そのような現状を踏まえて、仮説(ソフトウェアにおける新たな試み、様々な「What-if」)に対し検証が行える数少ないツールであるSLXを導入するというのは、単純に現在の開発環境を改善するというメリットに加え、仮設の普遍化が期待できます。
他の環境でVBAが動かない話

自分は今派遣で働いていて、勤怠入力がすんごいめんどい。
派遣元と派遣先で時間が異なってると更にめんどくさい。

両方ともWEBからアクセスできるから、
VBAでらくしちゃおうぜって組んだわけ。

でも他環境で型が一致しませんとかエラー吐く。意味わからん。

#コード概要
###宣言
Dim objIE As InternetExplorer
Dim htmlDoc As HTMLDocument

###動作
htmlDoc = objIE.document

ITリテラシー低めな人に「デバッグ」ボタン押してもらって、スクショ撮ってもらった。
ここで「型が一致しません」とか言われるの。

#とった対策と結果
###（上には書いてないけど）Declare文をPtrsafeにした。
x64環境だと問題あるのか？ということで。
結果はだめ。

###htmlDoc を Variantで宣言した。
結果はだめ。謎すぎ。

###IEを待たせる処理を厳しくした。

```VBA:VBA
'IEの準備が整うまで待つ
Sub WaitTillReady(ByVal ie As InternetExplorer)
    'IE自体の準備が整うまで待つ
    Do While ie.Busy = True Or ie.readyState <> 4
        DoEvents
    Loop
    'HTMLの読み込みが整うまで待つ
    Do Until ie.document.readyState = "complete"
        DoEvents
    Loop
    'フレームがあれば、フレームごとのHTML読み込みが整うまで待つ
    'FramesCollection使わないと一部サイトでうまく動作しない
    Dim objFrm As FrameCollection
    Set objFrm = ie.document.frames
    'For Each文だとなぜかうまくいかなかったのでこれ
    If objFrm.Length > 0 Then
        For itmp = 0 To objFrm.Length - 1
            Do Until objFrm(itmp).document.readyState = "complete"
                DoEvents
            Loop
        Next itmp
    End If
End Sub
```

結果はだめだったけど、まぁ誤動作の可能性減ったし良いよね。

#これからやりたいこと
その人のPCでデバッグ作業やりたい。
でもそこまでやるのは向こうが面倒と思うかなーと思って行動できてない。

だれか助けて！
GoでClosure

##  Function closures

A Tour of GoやってたらClosureという壁に当たったためメモ

[行き詰まったところ](https://go-tour-jp.appspot.com/moretypes/25)





## 参考

クロージャって何?というのはこのサイトを見てなんとなく理解できた気がする。

[猿でもわかるクロージャ超入門](http://dqn.sakusakutto.jp/2009/01/javascript_5.html)



## Goで実装

上のサイトの問題を解いてみる

**問題：　呼び出すたびに、1,2,3,...を返すような関数 f(　)を定義せよ。**

```
f();  //  1 
f();  //  2
f();  //  3
```

できたもの
https://github.com/depretiger/LearningClosure

```go:LearningClosure.go
package main

import "fmt"

func adder() func() {
  a := 1
  return func() {
    fmt.Println(a)
    a++
  }
}

func main() {
  f := adder()
  f()
  f()
  f()
}
```

adder()がクロージャを作っている関数。戻り値を無名関数funcとしている。adder()の中でaを初期化していて、adder()が返す無名関数がaをインクリメントしている。

mainでは変数f をadder()で初期化している。これでf()を呼び出すたびにaが保持されたままになるので、1ずつ増えていく。

## 結局何に使うか
参考のサイトではjqueryで使ってたけど他にはどんな使い方するんだろう。
手段だけを知りたい人向けのブランチを切りPull requestを送る流れ

インターンでgitを使うことになり、ブランチを切ってからPull requestを送るまでの作業がが分からなかった時、調べても余計なことが多くて何やればいいのか分からん！ってなったので、備忘録もかねて記します。

#この記事でやること

リモートリポジトリ`develop`からブランチを切り、ローカルリポジトリで編集した後、リモートリポジトリに`push`してGitHubでPull requestを送る。

#流れ
```
作業前のコマンド
git checkout -b "作成するブランチ名" origin/develop

作業後のコマンド
git add .
git commit -m "メッセージ"
git push origin "作成したブランチ名"

上記のコマンド入力が終わったらGitHubでPull requestのボタンを押す。
```

#終わりに
多分多くの間違い等があると思いますが、現在の僕の作業では全く支障がなかったのでこのやり方でやっています。
もし問題点等ありましたらご指摘をお願いします。
パスワード認証　

#安全なパスワードを作るには
Web アプリケーションをどのように作れば安全になるかという情報が手に入りやすくなりました。
パスワードの変更、パスワードのリセットといった処理について様々な観点で見ていく。

#パスワード自体の安全性は高められないのか
パスワード認証を安全にするためパスワードを強力にする手段が講じられていますが
利用者の知識に影響し、どの対策も本質的な解決には繋がりません。

#パスワードの強度制限が危険な運用になる
「安全性の向上」の理由で、パスワードの必要強度を高めるケースがあります。
例えば「8文字以上」、「大文字小文字必須」、「記号・数字必須」です。
一見いいアプローチのように思えますが利用者に覚えにくいパスワードを推奨することになり
パスワードのリセット、再設定に繋がる理由となります。

#SMS認証
ログイン時に携帯電話宛にSMSで1回限りのランダムな認証コードを送り
認証コードを入力して完了させる仕組みです。

メリット
・パスワードを覚える必要がない
・認証コードはログインのたびに変わるので、紙に書き留められない
・使用済みの認証コードで不正にログインすることができない
・認証コードはランダムで、他サイトが攻撃されてパスワードが漏れても影響しない
・常に手元にある端末で認証するので、知らぬ間に第三者にログインされることがない

デメリット
・携帯電話端末が必要（SMSを受信する必要があるのでデータSIMなどは不可）
・端末が壊れた・紛失したときにログインできなくなる
・利用するSMS送信ゲートウェイサービスによっては送信料金がかかる


#メール認証
登録されたメールアドレスに1回限りのログイン用の認証リンクを送り
リンクをクリックすることで認証を完了する仕組み。
サービスによっては「パスワードを忘れたとき」のリセット手段で
「パスワードのリセット用リンクをメール送信」しているものもあります。
このログイン方式は「メールサービスもまたユーザー名・パスワード認証であることが多い」
という欠点があります。

#外部の認証サービス
「Googleでログイン」「Facebookでログイン」というSNSログインボタンですが
これも解決策のひとつになりえます。
SNSログイン機能は利用者にとっても会員登録の手間削減に繋がりますし、利点は大きいです。

#ワンタイムパスワード
一定時間ごとに発行され、文字通り一度きりしか使えないパスワード
およびそれを採用した認証の仕組みのことです。
ワンタイムパスワードは一度きりしか使用できません。仮にワンタイムパスワードを窃取されたとしても
すでに使ったワンタイムパスワードを再度使うことはできないので安全性が向上します。
オンラインゲームやポータルサイトなどワンタイムパスワードの利用は確実に広がっています。

#ユーザ認証とアクセス認可対策
1.アカウントのロックアウト
ユーザ認証時に、一定時間内のログイン失敗回数が基準値を超えた場合には
そのアカウントを使用禁止にするべきである。
ロックアウトは、同じユーザIDや同じパスワードでのログイン試行に対して反応する方がよい。
またロックアウトは、そのアカウントが実在することの証明にもなってしまうので
「ロックアウトした」旨のエラーメッセージは表示すべきではない。

2.パスワードフィルタ
パスワードフィルタとは、あらかじめ決めた規則(最低文字数、最低使用文字種等)に従って
パスワードの検証を行うものであり、安易なパスワード(ユーザIDと同じもの、生年月日、一般名詞等)を
設定しようとした場合に、そのパスワードを拒否するものである。
・8文字以上で英字と数字と記号がそれぞれ1文字以上含まれるものを許可する
・ユーザIDが含まれるものは許可しない
・生年月日が含まれるものは許可しない
・以前4回と同じパスワードは許可しない
・初期パスワード等を含むよくあるパスワードが登録されたパスワード辞書にあるものは許可しない

3.パスワードの変更
有効期限を定めてパスワードを長期間が変更していないユーザに変更を促すべきである。
変更されていないパスワードの長期使用は、長期になるほど攻撃者にパスワードが
盗まれている可能性は高くなる。
変更があったことをユーザがあらかじめ登録している電子メールアドレス宛へ
通知する等を行うことが望ましい。

4.ランダム化桁とチェック桁
パスワードのみならず、ユーザIDも、ランダム桁やチェック桁を含ませる等を行い
推測が困難なものとすべきであり、シーケンシャルな数値を含むものや
他人に知られている可能性のあるもの(電子メールアドレス、口座番号、社員番号、会員番号等)を
使用すべきではない。

5.ログインエラーメッセージ
具体的な内容をエラーメッセージに含めることは、攻撃の手がかりを与えてしまうことになり
避けるべきである。「ユーザIDまたはパスワードが正しくありません」等とした方がよい。

6.パスワードリマインダの慎重な設置
パスワードリマインダとは、ユーザがパスワードを忘れた際の救済措置である。
本人しか知らない秘密情報(合言葉)をユーザに登録してもらい
パスワード忘れの際には、その情報をユーザ認証の代用とすることでパスワードを再発行する仕組みである。
パスワードリマインダのリスクをユーザに説明するとともに、「合言葉」として本人しか知らないような情報を選ぶようユーザを指導する。
・パスワードリマインダを使う・使わないをユーザが選べるようにする
・パスワードリマインダの「合言葉」をWebページ上に表示しない
・パスワードリマインダの「合言葉」を平文メールでユーザに通知しない
・一定回数試行に失敗したらパスワードリマインダをロックする（ロックアウト機能）

7.管理者権限の制限
・パスワードファイルを暗号化する。
・データベースへのアクセスを制御する。
・ひとりの管理者が多くの情報へアクセスできないよう権限の分割を行う。
・不正なアクセスがないか、管理者以外の人間が定期的に監査する。

#まとめ
各サービスの個人情報等の重要性に合わせ、セキュリティーレベルを考慮し
用途別に対策を講じる必要がある。
SCSSの設定方法 メモ

# SCSSをセットアップする方法

普段フロントエンドライブラリはReactを使っているので、``npm i node-sass``し、``touch something.styles.scss``などのファイルを作成するだけで問題なくSassを利用できていました。

が、Reactを使わない時もあると思うので、SCSSを使えるようにするまでの手順をメモします。

※ Node.jsが必須

### まず``package.json``を作成。

```terminal
npm init
```

### 次にSassをインストール

```terminal
npm i sass
```

### HTMLファイルと``styles.scss``を作成する。

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <!-- styles.cssを追加する。scssではない！ -->
    <link rel="stylesheet" href="styles.css" />
    <title>SASS</title>
  </head>
  <body>
    <h1>Hello SASS!</h1>
  </body>
</html>
```

### SCSSを書く

```scss:styles.scss
$bgColor: orangered;


body {
  background: $bgColor;
}

```

### scssをcssへコンパイルする

```terminal
sass styles.scss:styles.css
```

そして、``sass --watch styles.scss:styles.css``とすると、自動的にコンパイルしてくれます。
【RDS for Oracle】PSU／RU確認

[Oracle データベースエンジンリリースノート](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.PatchComposition.html)から各バージョンに適用されている`PSU`と`RU`を確認できます。

- 2019年7月5日 現在（一部抜粋）
 
| Oracle バージョン| RU／PSU |
|:-----------------|------------------|
| 12.2.0.1            | 12.2.0.1.190416(2019年4月リリース)|
| 12.1.0.2.v16   |12.1.0.2.190416(2019年4月リリース) |
| 11.2.0.4.v20    |11.2.0.4.190416(2019年4月リリース) |
[Application Insights] プロジェクトに追加する

ウェブ開発では必須のApplication Insightsの導入方法をおさらい。サービスの解析、問題解明などなどに日々使っています。

こちらを参照：
https://docs.microsoft.com/en-us/azure/azure-monitor/learn/dotnetcore-quick-start

#1. Azure上でApplication Insightsを作成

新しいリソース追加→からのApplication Insightsを選択、必要な項目を埋めます。Application Insightsを消費するサービスと同じリージョンを選択します。（そうじゃないとネットワーク料金がかかってしまいます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/fcacb6bd-4cd3-d8d9-e606-a98591bfc332.png)

#2. Application Insight SDKをプロジェクトに追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/da144a4a-e478-85a7-6a62-f31fc5e0fdb2.png)

作業の開始をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241909/5fefb5bf-e1f4-0b6e-0cce-ec0c0890b749.png)

次のページで1で作成したApplication Insightsを選択します。簡単！

#3. ILogger経由で自分のログを記録する

ASP.NET Core 2.xにてILoggerというインターフェイスが用意されています。

こちらを参照：
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/logging/?view=aspnetcore-2.2

# おしまい
これで設定は終わりです。

次はApplication Insightsを使ってログを記録してみます。 <a href="https://qiita.com/syantien/items/5a2e0533e0655d2c0294">[AZURE] Application Insightsで指定した情報を確認する</a>
画面横にFixされるボタン

```javascript:common.js
<script src="https://code.jquery.com/jquery-3.4.1.min.js" integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo=" crossorigin="anonymous"></script>
<script type="text/javascript">
jQuery(function($){
 var retb = $('#return');
 $(retb).hide();
 $(window).scroll(function(){
  if ($(this).scrollTop() > 100) {
      $(retb).fadeIn();
  }
  else {
      $(retb).fadeOut();
  }
 });
 
$(retb).click(function(){
 $('html,body').animate({
    scrollTop: 0
  }, 300);
  return false;
 });
});
</script>
```
```html:index.html
<div id="return">
 <a href="#wrapper"><img src="パス"></a>
</div>
```
```css:common.css
#return{
position: fixed;
bottom: 76%;
right: 51%;
z-index: 999;
width: 55px;
    background: #2d8dd0;
    box-shadow: 0px 2px 0px 0px rgba(0, 53, 119, 0.25);
    border-radius: 4px;
    text-align: center;
}
#return a{
  font-size: 1.8rem;
  line-height: 1.1;
  padding: 20px 18px 20px;
  color: #FFF;
}
```
ラムダ式でstd::sort

# はじめに
C++初心者です。いつも使おうとして忘れてしまうのでラムダ式を使ったソート方法を書きこのしておきます。間違いがありましたらコメントを残していただけると幸いです。

# std::sort
sortは引数に2つイテレータ[^1]を取り、イテレータで指定された範囲をソートする標準関数です。

```cpp:例
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
  vector<int> arr = {2, 4, 1, 3, 5};
  sort(arr.begin(), arr.end());
  for_each(arr.begin(), arr.end(), [](int const& ele){
    cout << ele << endl;
  });
}
```

std::sortはイントロソート[^2]を用いてコンテナをソートします。計算量は`O(NlogN)`になります。
std::sortはデフォルトで要素を昇順に並べ替えますが、比較関数を自分で用意することも可能です。

# ラムダ式
`C++11`から追加された関数オブジェクトをその場で定義するための機能です[^3]。次に簡単なラムダ式の例を示します。

```cpp:lambda
// 引数を2つ取りその和を返すラムダ式
auto func = [](int p, int q) -> int { return p + q; }
cout << func(2,3) << endl; // 5
```
`JavaScript`の関数リテラルのように書けますね。
`C++14`からは引数を推論させることもできます。

```cpp:引数の推論
auto plus = [](auto a, auto b)->int { return a + b; };
```

ラムダ式は関数オブジェクトを引数に取る関数に渡すことができます。最初の例では`for_each`にラムダ式を渡してコンテナを標準出力しています。

```cpp:for_each
for_each(arr.begin(), arr.end(), [](int const& ele){
  cout << ele << endl;
});
```

同様にstd:sortにラムダ式を渡し、比較方法を指定することが可能です。

# ラムダ式を用いたsortの例
###コンテナを降順に並び替える
sortに要素を比較してboolを返すラムダ式を渡して降順に並び替えます。

```cpp
#include <iostream>
#include <algorithm>
#include <array>
#include <numeric>
using namespace std;

int main() {
  array<int, 5> arr;
  iota(arr.begin(), arr.end(), 1);
  sort(arr.begin(), arr.end(), [](auto const& lhs, auto const& rhs) {
    return lhs > rhs; // 左の方が大きい...というイメージ。
  });
  for_each(arr.begin(), arr.end(), [](auto const& ele){
    cout << ele << endl; // 5,4,3,2,1
  });
}

```

### 比較演算子を持たない構造体のソート
比較演算子を持たない場合のソートの例です。

```cpp
// MyStructのfirstを基準に昇順に並べる。
// もしfirstが等しい場合secondを降順に並べる。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct MyStruct {
  int first, second;
};

int main() {
  vector<MyStruct> vec{{1, 2}, {1, 3}, {3, 1}, {3, 2}};
  sort(vec.begin(), vec.end(), [](auto const& lhs, auto const& rhs) {
    if (lhs.first != rhs.first) return lhs.first < rhs.first;
    else if (lhs.second != rhs.second) return lhs.second > rhs.second;
    return true;
  });
  for_each(vec.begin(), vec.end(), [](auto const& lhs){
    cout << lhs.first << " " << lhs.second << endl;
  });
}
// 出力
// 1 3
// 1 2
// 3 2
// 3 1

```

# まとめ
* 関数オブジェクトはラムダ式で渡せる。
* ラムダ式の引数はC++14からautoで推論できる。

# 参考文献
[cpprefjp](https://cpprefjp.github.io/)
[cppreference.com](https://ja.cppreference.com/w/)
[wandbox](https://wandbox.org/)

[^1]: 厳密には`RandomAccessIterator`である必要があります。そのため`BidirectionalIterator`を持つ`set`などは使えません。
[^2]: https://ja.wikipedia.org/wiki/イントロソート
[^3]: https://cpprefjp.github.io/lang/cpp11/lambda_expressions.html