OmniAICreator/Qiita-1.07M huggingface dataset:
pyenvでpythonをインストールしてFlaskを使おう【Linux】

## proxyの環境変数の設定
Proxy環境下でLinuxを使うための設定をします。

```bash:.bashrc
$ vi .bashrc  #.bashrcを開いて末尾に以下を記載
export HTTP_PROXY=http://$PROXY
export HTTPS_PROXY=http://$PROXY

$ source .bashrc  #追記した記述を反映
```

## pyenvのインストール

```bash:curl
$ curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash
```

```bash:.profile
$ vi .profile  #pyenvのパスを通すために.profileを編集(インストールした時の末尾の部分をコピペ)

export PATH="$PATH:bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

$ source ~/.profile  #追記した記述を反映

$ which pyenv  #パスが通っているか確認
```

## pyenvのアップデート

```bash:pyenv
$ pyenv update
```

## pythonのインストール

```bash:pyenv
$ pyenv install 3.6.6

$ pyenv install --list  #インストールできるバージョンの一覧を確認
$ python --version  #現在のバージョン確認
```

## pythonの環境構築

```bash:pythonのバージョンを適用したいディレクトリを作成
$ cd /home/pyenv-python/
$ mkdir ディレクトリ名
$ pwd
/home/pyenv-python/ディレクトリ名  #pythonのバージョンを適用したいディレクトリに入る

$ pyenv local 3.6.6
$ python --version
Python 3.6.6  #バージョンがあっているか確認

$ pip install pipenv
$ pipenv --python 3.6.6  #バージョンを厳密に固定

$ pipenv install  #カレントディレクトリに配置しているPipfileに記載されているパッケージをインストール
```

## pythonアプリケーションの実行

```bash:pipenv
$pipenv run python app.py

 * Serving Flask app "app" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5432/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 111-222-333
```
上手く起動できると↑のように表示され http://localhost(IP):5432/ でブラウザに接続できる

```bash:pipenv
※エラー
$ pipenv run python app.py

 * ModuleNotFoundError: No module named 'flask'
　#これ↑が表示されたら

$ pipenv install flask
$ pipenv run python app.py
を実行すると上手くいくはず
#必要なものがきちんとinstallできていないとエラーになっちゃう
```

## アプリケーションサーバの実行
gunicornでwebapp.pyを実行する場合

```bash:pipenv
$ pipenv run pipenv run gunicorn webapp:app --bind=0.0.0.0:5432

[2018-09-27 22:00:32 +0900] [13740] [INFO] Starting gunicorn 19.9.0
[2018-09-27 22:00:32 +0900] [13740] [INFO] Listening at: http://0.0.0.0:5432 (13740)
[2018-09-27 22:00:32 +0900] [13740] [INFO] Using worker: sync
[2018-09-27 22:00:32 +0900] [13790] [INFO] Booting worker with pid: 13790
```
上手く起動できると↑と表示され http://localhost(IP):5432/ でブラウザに接続できる
※バックグラウンドで動かす場合は -D を末尾に追加すればOK


## gunicornの起動停止
gunicornを停止したいときは、`ps -ef|grep gunicorn`を実行して停止したいプロセスの番号をkillします。

```bash:kill
$ kill 1234
```

## gunicornの再起動
```bash:pipenv
$ pipenv run gunicorn --bind=0.0.0.0:5432 --pid=gunicorn.pig --workers=2 --reload --access-logfile /home/pyenv-python/logs/access.log --error-logfile /home/pyenv-python/logs/error.log -D -t 30 --chdir /home/pyenv-python --log-level debug webapp:app
# 適宜自分の環境に合わせて変更して下さい
```

## おまけ☆
作成した環境に対して、パッケージをインストールする。
パッケージのバージョンを指定しても省略してもOK。
（省略した場合は、最新のバージョンがインストールされます）

```bash:pipenv
# mojimojiをのパッケージをインストールしてみる
# ※pythonを入れたディレクトリに入ってからインストールしてください
$ pipenv install mojimoji
```
DataFrameで相関係数を算出する方法

# DataFrameで相関係数を算出する方法
## この記事を読むと・・・
- 相関係数がざっくりわかる
- DataFrameでの相関係数の算出方法がわかる

## 相関係数とは
- 二つのデータの関係性の強さを-1~1の間で表す
 - 1に近いほど`正の相関`が強い
 - -1に近いほど`負の相関`が強い

## `df.corr()`を使用して相関係数を算出

```python
import pandas as pd

import pandas as pd

df = pd.DataFrame({
    'A':[0.9, 1, 3, 5, 6], 
    'B':[1, 10, 20, 30, 40]
})
df.corr()
``` 

- 出力結果

```shell
       A      B
A      1 0.9779
B 0.9779      1

```
Lightning コンポーネントと iframe 内の Visualforce ページで相互通信する

今回は Lightning コンポーネントによって iframe で読み込まれた Visualforce ページと、呼び出し元の Lightning コンポーネントでメッセージのやり取りをする方法です。

##Web Messaging API を使う
iframe を使って読み込まれた Visualforce ページとの通信には JavaScript の `Web Messaging API` が使えます。
(Web Messaging API の詳細については省きます)

基本的な方針は、まず Lightning コンポーネントで MessageChannel を作成し window オブジェクトの postMessage() を介して Visualforce ページに片方の MessagePort を渡します。それ以降は、それぞれの MessagePort の postMessage() を利用し通信する事で 1 対 1 のコミュニケーションを確立します。

## window.postMessage() の問題点
Lightning コンポーネントと Visualforce ページ間のコミュニケーションは window.postMessage() だけでも実現できます。
しかし、これは window オブジェクトに対してメッセージを送信してしまうので、同じ window オブジェクトを共有している全員がメッセージを受け取れてしまうという点で注意が必要です。
Visualforce ページは、それぞれのフレーム内で異なる window オブジェクトを持ちますが、 Lightning コンポーネントは同じ window オブジェクトを共有しています。
つまり、 Visualforce ページから送信されたメッセージが予期せぬ Lightning コンポーネントによって読み取られる可能性があります。

![Screen Shot 2019-03-19 at 17.51.02.png](https://qiita-image-store.s3.amazonaws.com/0/26378/eb2eaa1a-8d44-7fbb-0f03-e974d637102f.png)

##サンプルコード
上記の基本方針に沿ったサンプルコードです。

```html:MessageExample.cmp
<aura:component access="global" implements="flexipage:availableForAllPageTypes"  >
    <!-- User Interface -->
    <iframe aura:id="iframe" src="/apex/VFPage" onload="{!c.onLoad}" />
</aura:component>
```

```js:MessageExampleController.js
({
    onLoad: function(c, e, h) {
        
        // MessageChannel を作成する
        const channel = new MessageChannel();
        
        // Lighting コンポーネントは port1 を利用する事として、メッセージハンドラーを登録する
        // このハンドラーでは、Visualforce ページから送信されたメッセージをコンソールに出力した後、
        // 同じメッセージを Visualforce ページに送信する
        const port1 = channel.port1;
        port1.onmessage = function(event) { 
            console.log('Lighting Component received: ', event.data);
            port1.postMessage(event.data);
        }
        
        // port2 は Visualforce ページに渡す
        const contentWindow = c.find('iframe').getElement().contentWindow;
        contentWindow.postMessage('', '*', [channel.port2]);
    },
})
```

```html:VFPage.vfp
<apex:page>
    <script>
    // Lightning コンポーネントから window.postMessage() によって MessagePort が渡されるのを待つ
    window.addEventListener('message', function(event) {
       
        // MessagePort を受け取ったら、メッセージハンドラを登録し、
        // Lightning コンポーネントにメッセージを送信する
        // Lightning コンポーネントからメッセージを受け取ったら、コンソールに出力する
        const port2 = event.ports[0];
        port2.onmessage = function (e) {
            console.log('Visualforce Page received : ', e.data);
        };
        port2.postMessage('Hello!');
    }, false);
    </script>
</apex:page>
```
gitでよく使うコマンド（初心者編）

個人的gitでよく使うコマンドをまとめてみた。


* 毎度おなじみcherry pick 

```
git cherry-pick コミットid
```

* 犯人探しのblame

```
git blame パス
```

* commitのlogをファイル名で教えて

```
git log --name-status コミットid
```

* commitのlogをファイル名で、Addしたものだけ教えて

```
git log --name-status コミットid  | grep "^A"
```

* grepで複数検索かつ「〜以外」 の例（gitコマンドじゃないw）

```
find . -name "*.scss" | xargs grep "font-weight:" | grep -v "normal" | grep -v "bold"
```
concrete5 でシステム拡張をしているパッケージを入れている際、アップグレード時にエラーが出るときの回避方法 (8.4.x~8.5.)


超レアケースですが・・・。

concrete5 にエンタープライズアドオンの、マルチステップワークフローアドオンなど、システム部分で大幅な拡張を加えているパッケージを入れている場合、コマンドラインツールからのアップグレードでコケてしまう場合があります。

コマンドラインツールではパッケージのファイルを見に行かないということになっているからです。

アップグレード中に

```shell
Class Concrete\Package\MultipleStepWorkflow\Permission\Key\MultipleStepWorkflowStepKey does not exist
```

とパッケージ中のクラスが存在しないからアップグレードできないというエラーでこけてしまいます。

その場合、コアのファイルを修正して、アップグレード中はパッケージも見るようにします。

```/concrete/src/Foundation/Runtime/Boot/DefaultBooter.php
        if (!$this->app->isRunThroughCommandLineInterface()) {
            return $this->bootHttpSapi($config, $app);
        }
```

ここを

```/concrete/src/Foundation/Runtime/Boot/DefaultBooter.php
        if (!$this->app->isRunThroughCommandLineInterface()) {
            return $this->bootHttpSapi($config, $app);
        } else {
		     $this->initializePackages($app);
		 }
```

に書き換えてアップグレードを再試行してください。

最終的な解決策はどうしようか PortlandLabs には報告し、どうしようか相談中。
Ubuntu 16.04にNvidiaドライバをインストールしたらログインループになったときのメモ


##環境
- Ubuntu 16.04
- GeForce RTX 2080 Ti
- Nvidiaドライバ 418.43

##状況 
- `Ctrl`+`Alt`+`F1`でCUIは開ける。
- Nvidiaドライバを [ホームページ](https://www.nvidia.co.jp/Download/index.aspx?lang=jp)からダウンロード後，ログインループに陥った。
    - ログインループとは，Ubuntuのログイン画面でパスワードを入力してEnter押してもログイン画面がまた表示され，またパスワードを入力しEnterログイン画面パスワードEnterログイン画面……と永遠にループすること。

この画面に戻ってくる↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/f2b0f0bc-0f47-75ae-7557-c8da9c93cfbc.png)

##直し方①Nvidiaドライバを消す
いろんな記事を読んで，いろんなことをしてみたが，ダウンロードしたドライバを消したら抜け出せた。

```ruby:nvidiaドライバを消す
$ sudo apt-get purge nvidia*
```
をしてドライバを消して，

```
$ nvidia -smi
```

で消えたことの確認，

```ruby:再起動
$ sudo reboot
```

すると抜け出せた。

これでダメなら

##直し方②CUDAとドライバとのバージョンを合わせる

もしCUDAをインストールしていたら，ドライバとのバージョンがあっているか確認。
バージョンがあっていなかったら，CUIからドライバをインストールし直す。

```ruby:CUDAバージョン確認
$ dpkg -l | grep cuda
```

ずらああっといろいろ出てくる。ダウンロードしたのバージョンがわかる。
次にCUDAとあったドライバを確認する➡https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896
もし，CUDA10.0が入っていたらドライバは410.48が対応しているので
ppaレポジトリを追加してインストールする。

```ruby:nvidiaドライバのインストール
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update
$ sudo apt-get install nvidia-410
$ reboot
```
再起動してみる。これでもまだログインループなら，

##直し方③cudaやドライバの消去
```
$ sudo apt-get remove nvidia*
$ sudo apt-get remove cuda*
$ sudo apt autoremove
$ reboot
```
で再起動
Vue.jsでグローバルにスタイルを当てる [Sass]

## 課題
（１）宣言系・関数系をグローバルで呼びたい。
（２）reset.cssやcommon.cssもグローバルで呼びたい。
各vueファイルのstyleにimportするのは手間なため。

## 解決策 - (1)宣言系・関数系をグローバルで呼びたい。
以下の方法で、スタイルをグローバルに読むことが可能。

 1. プロジェクトのあるディレクトリ直下に「vue.config.js」という名前のファイルを追加
 2. 以下の記述を行う

```vue.config.js

module.exports = {
  css: {
    loaderOptions: {
      sass: {
        data: `@import "@/assets/scss/global.scss";` //グローバルで読みたいファイル名
      }
    }
  },
  productionSourceMap: true, //これはmapファイルの生成有無。作りたくない場合はfalseでOK。
};


```

## 解決策 - (2)reset.cssやcommon.cssもグローバルで呼びたい。
以下の方法で、スタイルをグローバルに読むことが可能。

 1. main.jsに以下の記述を行う

```main.js

import "./assets/scss/common.scss";

```

**最後に「npm serve」を再度行う。
↑★私よくこれ何度か忘れて、修正反映されてないなって陥ります**
過去から今まで、当時のWebサイトを閲覧、検索することができるサイト。

会社の先輩に聞いためっちゃ便利なサイトを備忘録として載せます。

#■はじめに
下記のサイトが、どういう方法でロギングしているかわかりませんが、ドメインを入力するとそのWebサイトの歴史がアーカイブとして実際に当時のサイトをみることができます。
https://web.archive.org/

#■どんな感じなん？
 ▼youtubeの場合、このサイトは2005年からのアーカイブを持っていると。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/9333a880-a006-381b-308a-0a99177776db.png)

▼2005年にさかのぼって適当にクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/2b54683f-cb92-6dcb-3281-e062c03274fa.png)

▼完品ではありませんが、2005/08/30当時はざっくりこんな感じだったらしい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/7728d7c8-0893-4e27-49fc-e37979ecd4b8.png)

▼天下のGoogleはこのサイト上でのアーカイブの最古が1998年12月とのこと。
当時はこんな感じだったという。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/b159d939-13d1-d7ed-7d6d-cd2b042230b8.png)


#■おわりに
基本的にパブリックなサイトはアーカイブがあるみたいです。
「私のコーポレートサイト昔どんなんだったんだ？」って感じで気軽に見ることもできるので、このツールは面白いです。
ただ、webサイトにも著作権は所有者、ないしは作成者に自動的に帰属されるものなので、このサービスがバズれば、サービス停止されるかと。。。
「歴史は繰り返す」という言葉があるくらいなので、昔の流行りだったデザインはともかく、今のWebサイトが未来のWebサイトのトレンドになる可能性もあります。
webサイトというのは本来は洋服と同じくらいトレンドのサイクルが早いものです。
そのため、いずれWebサイトというのは本当に簡単に作れる、所有できるコンテンツになるはずなので、あとは、**`今のトレンドとは？`に敏感になれるエンジニアやデザイナが将来的に必要な人材になっていくのかなとこのサービスを触りながら感じました。**

#■余談というよりか注意点
あくまでこのhttps://web.archive.org/ というサイトがアーカイブしているため、絶対に当時こうだったという保証はありません。
また、悪さをするスクリプト等をケアしてくれる訳でもなさそうなので、閲覧する際は十二分に気を付けたほうがよさそうです。
PHP: 時間がかかる処理を特定するのを手助けするTimerクラス

PHPプログラムで時間がかかる処理を特定するために、処理時間を計測するクラスです。xhprofなどのプロファイリングツールを入れるまでもなさそうなところで使われるのを想定しています。

## 使い方

下記のコードをプロジェクトの適当なところに置きます。

```php
class Timer
{
    /**
     * @var string|null
     */
    private static $outputFile = 'php://stdout';

    /**
     * @var float
     */
    private $startedOn;

    /**
     * @var string
     */
    private $name;

    public function __construct(?string $name = null)
    {
        $this->name = $name ?? self::getCallerPosition();
        $this->startedOn = \microtime(true);
    }

    public static function setOutputFile(string $filename): void
    {
        self::$outputFile = $filename;
    }

    public function stop(): void
    {
        $duration = \microtime(true) - $this->startedOn;
        $data = \implode(',', [$this->name, $duration]) . "\n";
        \file_put_contents(self::$outputFile, $data, \FILE_APPEND);
    }

    private static function getCallerPosition(): string
    {
        $stack = \debug_backtrace(0, 3);
        if ($stack[2]) {
            $class = $stack[2]['class'] ?? '';
            $class = $class ? $class . '::' : '';
            $function = $stack[2]['function'] ?? '';
            $line = $stack[2]['line'];
            $file = $stack[2]['file'];
            return "{$class}{$function} {$file}:{$line}";
        }

        return 'unknown';
    }
}
```

測定したい箇所の開始地点で`Timer`を`new`して、測定を終了する箇所で`$timer->stop()`します。

```php
class Main
{
    public function doSomething(): void
    {
        Timer::setOutputFile('/tmp/test.log');
        $timer = new Timer();
        \sleep(1); // 時間がかかりそうな処理
        $timer->stop();
    }
}
```

この状態でプログラムを実行すると、次のようなデータがあつまります:

```csv:/tmp/test.log
Main::doSomething /Volumes/dev/php-playground/Timer/Timer.php:75,1.0058917999268
```

検索用キーワード: `ボトルネック` `遅い処理` `パフォーマンス`
Routes match in priority from top to bottom と表示されたら

## Rails初心者の備忘録

## Routes match in priority from top to bottom と表示されたら

gemファイルを追加した後にlocalhostでチェックすると上記の表示がされた。

rails s を一度切ってから（ctrl + c）から再度、rails sですると直った。

gemファイル更新したらサーバーを再起動を頭に入れとかなとですね。
LDAP(ADSI)でパスワード認証 - PHP,VBA,PowerShell

LDAP（ADSI）でパスワードが有効かを確認してみます
言語は Excel VBA と PHP と PowerShell


# VBA バージョン

```vb
Option Explicit

Const ADS_SECURE_AUTHENTICATION = &H1
Const ADS_SERVER_BIND = &H200

Sub MAIN()
    Debug.Print LDAP_LOGIN("ldap.domain.com", "uid=userid,o=logon", "password")
End Sub


Function LDAP_LOGIN(server As String, rdn As String, pass As String) As Integer
    Dim objDs
    Dim objDsEntry
    On Error Resume Next
    
    '// LDAP LOGIN
    Err.Clear
    Set objDs = GetObject("LDAP:")
    Set objDsEntry = objDs.OpenDsobject("LDAP://" & server, rdn, pass, ADS_SERVER_BIND)

    '// RESULT
    LDAP_LOGIN = Err.Number
    Debug.Print Err.Description

    '// CLEANUP
    Set objDs = Nothing
    Set objDsEntry = Nothing
End Function
```

第二引数で受け取っているRDNについてはこちら　[RDNとは](http://software.fujitsu.com/jp/manual/manualfiles/M050002/J2UZ6460/01/idsdk02/idsdk018.htm)


# PHP バージョン

```php
<?php

$server = "ldap.domain.com";
$rdn = "uid=userid,o=logon";
$pass = "password";

if (user_ldap_login($server, $rdn, $pass)) {
    echo "TRUE";
} else {
    echo "FALSE";
}


function user_ldap_login($server, $rdn, $pass)
{
    // INIT
    $ret = false;

    // LDAP connect
    $ld_con = ldap_connect($server);
    if ($ld_con) {
        if (ldap_bind($ld_con, $rdn, $pass)) {
            $ret = true;
        }
    }

    // LDAP close
    ldap_close($ld_con);
    return $ret;
}

```

パスワード認証が取れた後に情報が欲しい場合は ldap_search をこんな感じで

```php

$base_dn = "ou=people,o=address";
$fllter = "(cn=tanaka*)";

function user_ldap_search($ld_con, $base_dn, $fillter)
{
    $sr = ldap_search($ld_con, $base_dn, $fillter);
    $info = ldap_get_entries($ld_con, $sr);
    print_r( $info );
}

```

# PowerShell バージョン

```powershell
$user = "USER-ID"
$pass = "PASSWORD"
$domain = "LDAP://ldap.domain.com:389/ou=people,o=address"

$auth = [System.DirectoryServices.AuthenticationTypes]::FastBind
$rdn = "uid=" + $user + ",o=login"
$root = New-Object System.DirectoryServices.DirectoryEntry($domain, $rdn, $pass, $auth)
$query = New-Object System.DirectoryServices.DirectorySearcher($root)
$query.filter = "(cn=tanaka*)"
$entries = $query.FindAll()
$entries | %{$_.Properties}

```



一部のみ欲しい場合はこんな感じとか

```powershell

$query.PropertiesToLoad.Add("cn")                > $null
$query.PropertiesToLoad.Add("mail")              > $null
$entries = $query.FindAll()


```

あるいはこんな感じとか

```powershell

$entries = $query.FindAll()
$entries | %{$_.Properties.cn,$_.Properties.mail}

```





---

ActiveDirectory、ADSIの認証系についてあまり情報がなかったので書いてみた
Rustのconst fnの制限が緩和された(Rust 1.33.0)

# Rustのconst fnの制限が緩和された
Rust 1.33.0で`const fn`の制限が少しだけ緩和されました。

## `const fn`の引数にtupleを受け取れるようになった
```rust
const fn foo((x, y): (u8, u8)) { ... }
```
ということができるようになった。
そもそもできないことを知らなかったです。

1.32.0でコンパイルしてみたところ
`local variables in const fn are unstable`
というエラーが出たのでローカル変数と同じ扱いだったんだと思います。

## ローカル変数を使えるようになった
関数内で変数を宣言できるようになりました。

```rust
fn foo() {
    let a = 0;
}
```
最高

### `mut`変数も使用できるようになった
当然代入もできる。

```rust
fn  foo() {
    let mut a = 0;
    a = 1;
}
```
その他
`x += y`, `x[3] = 42`のような変数に変更を加える演算子も使用可能になりました。

## `const fn`の中で`const unsafe fn`の呼び出しが可能になった
下記のようなことが可能になりました。

```rust
const unsafe fn foo() -> i32 { 5 }
const fn bar() -> i32 {
    unsafe { foo() }
}
```

# 感想
だいぶ使いやすくなりました。
~~次は条件分岐とかループとか対応してほしい。~~
`for`以外使えるようになりました。
[Rustのconst fnの制限がさらに緩和された(Rust 1.46.0)](https://qiita.com/block/items/de9ecbb4d102eaa35ac8)

---
これらの変更によって標準ライブラリの多くの関数が`const fn`になったようです。　
元の文や標準ライブラリの変更が気になる方は下記を見てください。
https://github.com/rust-lang/rust/blob/stable/RELEASES.md#version-1330-2019-02-28

---
[1.31.0の時の話](https://qiita.com/block/items/38f9d41aa9b655fdc093)
python 文字列変換【カタカナ⇔ひらがな】



#jaconvを使った変換
jaconv (Japanese Converter) はひらがな・カタカナ・全角・半角の文字種変換ができます
※全角⇔半角の変換に関しては"[mojimoji](https://pypi.org/project/mojimoji/0.0.5/)"の方が高速処理できます
###カタカナ⇔ひらがな
```change.py
import jaconv

word1 = "リンゴ"
change_word1 = jaconv.kata2hira(word1)
# ⇒りんご

word2 = "ぷりん"
change_word2 = jaconv.hira2kata(word2)
# ⇒プリン
```
python 正規表現を使った文字列チェック【ひらがな・カタカナ・ローマ字・漢字】

#reを使った文字列判定
正規表現を使うために事前に検索するパターンをコンパイルしておくと良いです。
同じパターンで何度も検索する際、高速に検索することが出来るようになります。
あと、パターンの最初にrを付けることによって文字列中のバックスラッシュ文字をそのままバックスラッシュとして扱えるので、書き方がわかりやすくてお勧めです。
###ひらがなの判定
```check.py
import re

word = "りんご"
re_hiragana = re.compile(r'^[あ-ん]+$')
status_hira = re_hiragana.fullmatch(word) #fullmatch:完全一致
# Trueが返却される
# <_sre.SRE_Match object; span=(0, 3), match='りんご'>
```

###カタカナの判定
```check.py
import re

word = "リンゴ"
re_katakana = re.compile(r'[\u30A1-\u30F4]+')
status_kata = re_katakana.fullmatch(word)
# Trueが返却される
# <_sre.SRE_Match object; span=(0, 3), match='リンゴ'>
```

###ローマ字の判定
```check.py
import re

word = "apple"
re_roman = re.compile(r'^[a-zA-Z]+$') #a-z:小文字、A-Z:大文字
status_kata = re_katakana.fullmatch(word)
# Trueが返却される
#  <_sre.SRE_Match object; span=(0, 5), match='apple'>
```

###漢字の判定
```check.py
import re

word = "林檎"
re_kanji = re.compile(r'^[\u4E00-\u9FD0]+$')
status_kanji = re_kanji.fullmatch(word)
# Trueが返却される
#  <_sre.SRE_Match object; span=(0, 2), match='林檎'>
```
論文の間違い発見→著者に連絡→論文の訂正・更新　をしてもらった話

#本記事について

・**論文の内容が間違っていることもある**

・論文の内容や著者の方への批判のような記事にはしたくないため、論文名と著者の名前については公開しない

・スペルミスのようなものではなく、目的関数の式を訂正した



#論文訂正・更新までの流れ
①間違いを見つける→②著者に連絡→③訂正・更新

##①間違いを見つける

ある論文を読んでいたときに「これだと成り立たない」と思うところを発見
↓
しかし、論文を提出する前にはいろんな人がチェックしているはずだから自分が何かを見落としているか知識不足によるものだと思う
↓
他の論文を読んでみてもやっぱり違うように感じる
↓
何が正しいのかを確認したかったためメールすることにする

##②著者に連絡

arxivに登録すれば、第一著者に限りメールアドレスを知ることができる(論文にメールアドレスが記載されている場合もある)

論文には「○○○」という式になっていますが、「△△△」だと思います。　といった内容のメールを送る（金曜の夜）
↓
論文を再確認したところ「△△△」が正しい式です。arxivの論文を訂正・更新します。明日には更新したものを見ることができると思います。　という返信が来る（月曜の昼）

##③訂正・更新
翌日（火曜日）にarxivをチェックしたところ、メールで訂正した通りの内容に論文が更新されていた


#まとめ
・**論文は間違っているところがあるかもしれない**

・**ちゃんと調べても「違う」と思ったら著者に連絡してみる**

・**必ず返信が来る保障はないが、自分の知識の整理をするためにも連絡するのは良いことのはず**
NvidiaドライバとCUDAとcuDNNとTensorflow-gpuとPythonのバージョンの対応

Nvidiaドライバ，CUDA，cuDNN，tensorflow-gpu，Pythonのバージョンの対応はとても重要らしい。
**NvidiaドライバはCUDAのバージョンに合わせて，CUDAとcuDNNとPythonはtensorflowのバージョンに合わせる。**
合っていないと，[ログインループに陥った](https://qiita.com/konzo_/items/ca9303d5d515dbf5b66e)り，The system is running in low-graphics modeになったりした。
とにかく最新をダウンロードするのではなく，バージョンの対応を事前に確認する必要があったもよう。

###例：確認環境
- Ubuntu 16.04
- GeForce RTX 2080 ti

#確認①Nvidiaドライバ
自分のGPUに対応するドライバのチェック➡https://www.nvidia.co.jp/Download/index.aspx?lang=jp
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/1ac43668-2f9c-7e03-6a4f-b9c033536b9e.png)
検索を押すと，
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/461db5c8-8acb-b428-5654-8e70599f6a73.png)
こんな感じで出てくる。
なるほどおー，418なのね！と思っておく。

#確認②ドライバとCUDA
ドライバとCUDAの対応を確認➡https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/9e6f5741-d1e0-4594-40e6-3ac7097a1692.png)
上の表を見ると，ドライバは418で最新が入れられるし，なんでもOKか！と思っておく。
もし自分のGPUに対応するバージョンが384.81なら，CUDAは9.0以下しか入れられない。

#確認③CUDAとcuDNNとtensorflow-gpu
CUDAとcuDNNとtensorflow-gpuのバージョンの対応➡https://www.tensorflow.org/install/source#common_installation_problems
(サイト内ではcpu版tensorflowの対応表もあります。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315412/93634a88-36b5-7677-0d23-c3bce7593cb3.png)
ここで，**最新のtensorflow-gpuは1.13.0** で対応しているCUDAは10.0なのね，10.1は対応してないのね，と分かる

ということで，**Nvidiaのドライバは410.48，CUDAは10.0，cudNNは7.4，tensorflow-gpuは1.13.0**です。
tensorflow-gpuを`pip install`する環境は**Pythonの2.7か3.3～3.6**でないとダメみたいです。

で，インストールにうつる。
インストールの手順はここに書いた➡https://qiita.com/konzo_/items/3e2d1d7480f7ef632603
railsのキホンvol.9(投稿とユーザーの紐付け)

##投稿とユーザーの紐付け

まず、各投稿が誰がしたのかを判別するためにpostsテーブル（投稿系のテーブル）に、user_idというカラムをたす。

```
$ rails g migration add_user_id_to_posts
```
↑コマンドにより、マイグレーションファイルを作り、changeメソッドを書いて、データベースを更新する。

```add_user_id_to_posts.rb
def change
  add_column :posts,:user_id,:integer
end
````
```
$ rails db:migrate
```
###投稿したユーザーのidを保存
投稿を保存する際に、先ほど追加したuser_idカラムにも情報を入れる。
@current_user.idは投稿しようとしているユーザーのidを表すので、

```posts_controller.rb
def create
    @post = Post.new(
      content: params[:content],
      #今回追加する操作
      user_id: @current_user.id
    )
end
```
とすればいい。

###投稿詳細ページでユーザー画像とユーザー名を表示する

投稿とユーザーの紐付けは完了したから、次はその紐付けを使ってユーザー情報を表示する。

```posts_controller.rb
def show
    @post = Post.find_by(id: params[:id])
    @user = User.find_by(id: @post.user_id)
end
```
```show.html.erb
<img src="<%= "/user_images/#{@user.image_name}" %>">
<%= link_to(@user.name,"users/#{@user.id}") %>
```
このようにすれば表示できる。

###インスタンスメソッド

投稿に紐づくユーザーの情報はよく使うのでインスタンスメソッドとしておく。
railsではモデル内にインスタンスを定義することができるので
今回はPostモデル内に定義しておく。

```models/post.rb
def user
  #インスタンスメソッドないで、selfはインスタンス自身を表す
  return User.find_by(id: self.user_id)
end
```
showアクション内の@userを削除し、ビューファイルの方は@userをuserとしておく。

###投稿一覧でユーザーと投稿を紐付ける（whereメソッド）

投稿一覧のようなユーザーに紐づく投稿が複数ある場合、find_byメソッドは一件しか取得できないので、whereメソッドを用いる。

投稿を複数取得する処理もよく使うのでモデル内でインスタンスを定義しておく。

```models/user.rb
def posts
  return Post.where(user_id: self.id)
end
```
###ユーザー詳細ページにユーザーの投稿を表示する。
定義したpostsインスタンスを使って、投稿を取得し、ユーザー詳細ページに表示する。

```users/show.html.erb
  <% @user.posts.each do |post| %>
    #画像、ユーザネーム、投稿をそれぞれ表示
  <% end %>
end
```
###投稿者のみに編集・削除リンクを表示させる。
ログインしているユーザーが、その投稿の作成者である場合は、編集・削除をできるようにする。

```posts/show.html.erb
<% if @post.user_id == @current_user.id %>
  <%= link_to("編集","users/#{@post.id}/edit") %>
  <%= link_to("削除","users/#{@post.id}/destroy",{method:"post"}) %>
<% end %>
```

このままだと、直接アクセスした場合は編集、削除ができてしまうから、投稿に紐づくユーザーとログインしているユーザーが違う場合は編集・削除をできないようにする。

postsコントローラ内に ensure_correct_user　メソッドを作り、 before_action で対応するアクションに対してメソッドを適用させる。

```posts_controller.rb
before_action :ensure_correct_user,{only: [:edit,:update,:destroy]}
#...
def ensure_correct_user
  @post = Post.find_by(id: params[:id])
  if @post.user_id != @current_user.id
  flash[:notice] = "権限がありません"
  redirect_to("/posts/index")
end
```
続き
https://qiita.com/jonnyjonnyj1397/items/e0266dadbd63d9bdec10
64bit CPUに固有なこと

32bit CPUに固有なことは、メモリ空間、int 32bit であることなどがある。
32bit CPUに固有な言語、OSなどもある。

64bit CPUに固有なことは、メモリ空間以外に何があるのだろうか。

【今更聞けない！】32bitと64bitの違いとは？ まとめ
https://eng-entrance.com/32bit-64bit

プログラミング言語ごとの 64bit 整数対応状況
https://clown.hatenablog.jp/entry/20131023/long_and_int64

64ビットになると何が変わる？――64ビットプログラミングのデータモデル (1/2)
https://www.itmedia.co.jp/enterprise/articles/0506/13/news006.html

64ビットプログラミングのポイント (1/3)
https://www.itmedia.co.jp/enterprise/articles/0506/14/news003.html

64 ビット アプリケーション　microsoft
https://docs.microsoft.com/ja-jp/dotnet/framework/64-bit-apps

Javaは64bit、32bitどちらで使うべき？(JREとJDKの場合で解説)
https://www.sejuku.net/blog/62177


Linuxアプリケーションの64ビット・システムへの移植
https://www.ibm.com/developerworks/jp/linux/library/l-port64/index.html

x64 アセンブリ言語プログラミング
http://herumi.in.coocan.jp/prog/x64.html

D言語：32bitコードの64bitへの移植
http://www.kmonos.net/alang/d/32-64-portability.html

企業の収益に対する　64-bit アプリケーションの影響　エンバカデロ・テクノロジーズ
https://www.embarcadero.com/images/jp/dm/technical-papers/64bit_development_wp_jp.pdf?elqTrackId=5bd3ffb52aff4536b307bcf0f97234cf

Solaris 64 ビット 開発ガイド
https://docs.oracle.com/cd/E19455-01/806-2729/6jbu63l2q/index.html

UEFI

# 文書履歴(document history)
ver. 0.01 初稿 20190319 午後
ver. 0.02 ３項目追記 20190319 夕
ver. 0.03 URL追記　20230308
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
mysql2 (0.5.2)インストール時のエラー対処法

##エラー内容

```console:ターミナル
Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
：
：
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`
succeeds before bundling.
In Gemfile:
  mysql2

```

##原因
メンターの方に聞くと「これはパスが通っていないね〜」とのこと

自分は昨年にRubyをインストールしていたはずなのに間違えてRubyをまたインストールしてしまった。
バージョンを調べるだけのつもりだったのに...


##解決法
これで解決しました。

```console:ターミナル
$ gem install mysql2 -v ‘0.5.2' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
```
もそ、プログラミングを学ぶ【Ruby on Rails】〜コントローラ継承と２つのhtml.erbファイル〜

プログラミングの学習をはじめて10日あまり...
もそは とうとうRailsのカリキュラムを終わらせることができました！嬉しい〜！

初代ポ◯モンで言うところの、ジムリーダーを全員倒してバッジをコンプしたといったところですね。
でもそれでいくとどう考えても四天王バトルできるほどレベル積めていないし、何ならリーグにたどり着くこともできない気が...
とにかく復習しつつ、エラー問題などをコツコツ頑張ろうと思います。

今日はコントローラとhtml.erbファイルの関係について書いていきます。

##layoutフォルダにhtml.erbが２つあるのはなぜ？
今回私が学んだカリキュラムでは、layoutフォルダに

application.html.erb
review.site.html.erb

という２つのerbファイルがありました。
そもそも、**なぜファイルを２つに分ける必要があるのか？**
layoutフォルダに入っているので言うまでもないかもしれませんが、こちらはビューで表示する見た目のレイアウトをhtmlで記述したファイルです。

application.html.erbでは、トップページやマイページ画面に共通で表示されるパーツ（グローバルナビゲーションなど）や、ここには直接表示はされていないCSSやJSも記述されています。
一方review_site.html.erbでは、マイページ内でのランキング表示などの記述が書かれています。

ファイルを一つにまとめるとコードが長くなりすぎるのもありますが、もうひとつ理由があります。
これは、昨日述べた**コントローラの継承が関係しています。**
（コントローラについては[こちら](https://qiita.com/moso/private/19921fbac91202bacff4)）

##コントローラの継承

こちらのコードを見てください。

```
class RankingController < ApplicationController
  layout 'review_site'
```

これはApplicationControllerをRankingControllerが継承しています。
さらにlayoutは'review_site'、つまり**review_site.html.erbファイルの記述を参照するように指定**しています。
そしてこちらは、

```
class ReviewsController < RankingController
```

RankingControlerをReviewControllerが継承しています。
図にするとこんな感じ。

![無題1149.jpeg](https://qiita-image-store.s3.amazonaws.com/0/372174/87cc4435-f30a-4847-f138-7667b3cce557.jpeg)


ReviewsControllerとProductsControllerはRankingControllerを継承しているので、この２つも**review_site.html.erbを参照しています**。

--
いかがでしょうか。
絵のクオリティの上達とプログラミングスキルの上達がまったく比例しませんが、もその修行はまだまだ続く...
OSXでメモリークリアアプリをAutomaterでさくっと作る

#起
自分は色々なアプリケーションを開きながら（主にadobe製品であるが）仕事をするため、32GBのiMac 2017でもすぐにメモリがアップアップになってしまう。あまりにアップアップとなった場合には再起動するのだが、1日何度もやってると時間が勿体ないし、第一気持ちが切れてしまう。ちょっと前まではOSX用のサードパーティ製のメモリ解放アプリを使っていたのだが、たまにハングったりするので、わりと使い勝手が悪いし、最近のOSXではサードパーティのメモリクリアアプリがApp Storeから削除されているので使用できない（Webにアップしてあるものもあるが、そういうものを使うのはちょっと怖いので基本的には使わない）。
しかし、OSXのコマンドラインでは**メモリーパージコマンド**があり、メモリー解放アプリを**Automater**でさくっと作ってみようじゃねえかということでやってみることにした。

<font color="red">注意
ここに書かれている事は対価も貰ってない代わりに義務も負いませんので、質問などは軽くシカトします。
ついでにいえば、以下の作業をして不具合が出ても自己責任ということで、書いた人間は全くもって責任は負いませんので、あしからず。</font>

#メモリ解放コマンド
まずはコマンドラインでのメモリー解放方法をここに記する。
とりあえず、どこくらいメモリーを使用しているかを次のコマンドで確認する。

```
$ top -l 1 -s 0 | grep PhysMem
PhysMem: 17G used (2694M wired), 15G unused.
```

次にOSXでの解放コマンドは`purge`となっているので、使用してみる。
ただし、次のように`sudo`コマンドと併用しないと使えない。

```
$ sudo purge
```

ちょっとラグがあると思うが、無事解放されたかどうか、先ほどの使用メモリの確認コマンドを入れてみる。

```
$ top -l 1 -s 0 | grep PhysMem
PhysMem: 11G used (2727M wired), 21G unused.
```

大体、使用メモリを6Gぐらい開放出来たわけだ。
まぁコマンドラインを日常使っている人なら、これはこれでいいだろうと思うが、いちいちTerminalを開いて、メモリ解放コマンドを入れていくのもわりと面倒ではある。また、shellスクリプトを常駐させて、マークした以上にメモリを使用したらpurgeコマンドを実行するっていうのもできるにはできるが、常駐分CPUを占領させるので、あまりよろしくはない気もする。

#Automaterを使ってメモリ解放アプリを作成する
いよいよAutomaterを使ってメモリ解放アプリを作成してみることにする。

### Automaterでsudoコマンドを使用するためのおまじない
前処理としてAutomaterでsudoコマンドを使用するために、若干コマンドライン操作が必要となる。
これは、通常Automaterでsudoコマンドを実行できないようにApple側がフィルターをしているためで、このフィルターを取っ払う必要があるためだ。

まずは次のようなコマンドを入力する

```
sudo vi /etc/sudoers
```

`vi`コマンドで`/etc/sudoers`に書きこむわけであるが、`vi`コマンドが使えない人は・・・・まぁ、無理なのでこの時点であきらめて欲しい、ちなみに通常のテキストエディタで開く方法もあるが、あまりお奨めはしない。

次に一番最後の行に次の一文を書きこむ

```
Defaults visiblepw
```

この時、`Defaults`と`visiblepw`の間はタブ1つ離すようにする（必ずタブを使うこと）。

最後にセーブするのだが、通常のセーブ＆クローズコマンドである`wq`は受け付けないので、`wq!`として終了する。


###Automaterの設定
Automaterで新規で作成するのだが、その場合アプリケーションとして作成する。

<img width="1201" alt="Automator001.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/cd7f15ea-4a8b-d7bf-bfee-ddb5d5a2b0a2.png">

作成したら、次のように作成するのだが、まずはテキスト＞指定されたテキストを取得を選び、テキストエリアに自分のパスワードを入れ、次にユーティリティ＞シェルスクリプを実行を選び、`sudo purge`と入れる。

<img width="1201" alt="Automator002.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/530252b4-583c-db39-d9cf-7a98d8053238.png">

後はファイルメニューから書き出しをすればメモリ解放アプリケーションのできあがりである。
割と簡単にでき、ただで使えるので、費用対効果（？）も抜群だ。
また、アプリケーション形式で書き出しても、後からAutomaterで開くことができるので、万が一エラーが出た場合も検証できるだろう。

#結
以上でメモリ解放アプリを作成したが、本来は上のメニューバーに登録して使えたらもっと利便性が上がる。しかし、現状Automaterではできない様だ。また、そこまでやろうとすると今度はXcodeを使わなければならないので、ちょっと敷居が高いというか、そんなアプリ作ったらシェアウェアにしたいところだけど、この手のアプリはApp Storeに登録できないので大して儲からんし、やるだけ無駄ではある。
とりま、現状はこれぐらいで充分ということでここにまとめたわけだが、これを見て役立つ人がいるなら、書いた本人としてはこの上ない喜びである。
Djangoでyesを入力せずにcollectstaticする方法

# やりたいこと
Djangoで構築しているシステムのデプロイをシェルスクリプトで行おうとしたときに、collectstaticでyes/noを入力せずに実行させたい

# 解決方法：「--noinput」オプションを付加する
collectstaticに「--noinput」オプションを付けます。

## サンプルコードはこちら
https://tamcom.jp/contents/execute-django-collectstatic-command-without-yes-input
Sprocketsを2から3に上げたらRails.application.assetsがnilになった

### 現象
[Rails4/5/6に関する重大なSecurityFix / 2019年3月13日 01:49 \- Qiita](https://qiita.com/moriwm77/items/b727eb41d95509535538)
を読んでRailsのバージョンを上げることにした

bundle update railsしたら依存関係にあるgemもバージョンが上がった。
その際に出たバグの中に、**Sprocketsを3系にあげると、Production環境でRails.application.assetsが使えなくなる**というのがあった

実際に出たエラー

```
undefined method '[]' for nil:NilClass
```
なお、Rails.application.assets["file_name"]はRails.application.assets.find_asset("file_name")のエイリアス

同様の現象についてのIssueは結構あるのだが、結局何をすればいいのかを調べるのに時間がかかったのでメモしておく
[sprockets/UPGRADING\.md at 3\.x · rails/sprockets](https://github.com/rails/sprockets/blob/3.x/UPGRADING.md)
[Rails.application.assets is nil in production #237](https://github.com/rails/sprockets-rails/issues/237)
[Rails\.application\.assets returns nil on version 3\.5\.2 · Issue \#294 · rails/sprockets\-rails](https://github.com/rails/sprockets-rails/issues/294)


### 解決策
以下の2つの方法があると思う

1. ``Rails.application.assets``のかわりに``Sprockets::Railtie.build_environment(Rails.application, true)``を使う
2. ``assets.compile = true``を指定する

今回は1を採用した
2はrailsの公式サイトにパフォーマンスが悪くなるからやめろと書いてあったので見送った
[アセットパイプライン \- Rails ガイド](https://railsguides.jp/asset_pipeline.html#%E5%8B%95%E7%9A%84%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB)

> このモードはデフォルトよりもメモリを余分に消費し、パフォーマンスも落ちるためお勧めできません。

#### Sprockets::Railtie.build_environment(Rails.application, true)を使う
``Rails.application.assets["top.css"]``を``Sprockets::Railtie.build_environment(Rails.application)["top.css"]``とかって書きかえればよいのだが、文字が多いのは嫌なので

```
class ApplicationController < ActionController::Base
  before_action :set_assets

  private

  def set_assets
    @assets = Rails.application.assets || ::Sprockets::Railtie.build_environment(Rails.application)
  end
end
```
と書いてビューでは``@assets["top.css"]``のような形で使うことにした。

参考:
[Rails\.application\.assets is nil in production · Issue \#237 · rails/sprockets\-rails](https://github.com/rails/sprockets-rails/issues/237#issuecomment-308666272)
VisualStudio2017でQtでアプリを開発してappxbundle形式のイントーラでインストールするまで

知っている人が多いのかどうかわからないが、Qtでアプリを作る方法として通常のQtCreatorを使う方法の他に、VisualStudioを使う方法がある。
VisualStudioをつかうやり方でなにかメリットがあるのか？ってことだけどとりあえずappxbundleとかのwindows10標準のインストーラーが楽に作れるってのがあります。だからMicrosoftStore
にも楽にアップできる。
これをQtCreatorでやるとCUIでコマンドを打ち続ける必要があり結構面倒。
そういうUWPでないAPPでストア用のパッケージを作るのをMSの用語でデスクトップブリッジというらしい。
https://docs.microsoft.com/ja-jp/windows/uwp/porting/desktop-to-uwp-root
字が多すぎて頭が痛くなる。

でVisualStudioで楽にQtAPPをインストーラーパッケージにしよう。ってのが言いたいのです。

1.QtSDKとVisualStudio2017を両方用意。どちらも無償のやつで構わない、
一応VisualStudioでVCでビルドできるのを確認。
QtCreatorでVisualStudio環境（MINGWでなく）でビルドできるのを確認。

2.VSの"ツールー＞拡張機能と更新プログラム"から"Qt Visual Studio tools"をインストール
なかったらこれ
https://download.qt.io/development_releases/vsaddin/

3.２のあとVSにQtを認識させる
それには　"Qt VS Tools->Qt Options"からQtのパスを設定
![p1.png](https://qiita-image-store.s3.amazonaws.com/0/8886/fbe2e7bd-a29d-1146-ce99-fa98335c74f4.png)

4.次に.Proを読み込むかQtのソリューションを新規作成する。
よみこむときは空のソリューションを作ってから
"Qt VS Tools->Open Qt project file"
新規作成時は
![p2.png](https://qiita-image-store.s3.amazonaws.com/0/8886/968b6f42-76a0-5964-1e57-65027549aa94.png)
これでビルドしてアプリを作成、
最後にパッケージ作成の前にリリースでビルドすること

5.このままでは開発環境でなく、EXEをクリックするとDLLがないので起動できないといわれるのでDEPLOYの準備
WINDOWSメニューから”開発者用コマンドプロンプト”起動
RELEASEの場所に移動
C:\Users\XXXXX\source\repos\QtGuiApplication1\Win32\Release
みたいな場所にCDで移動
ここで
C:\Qt\5.12.2\msvc2017\bin\windeployqt.exe　QtGuiApplication1.exe
※念のために言うけど上のパス、EXE名は自分の環境をチェックして書き換えること
コピペはたぶんだめ
できたらもう一度EXEをクリックして起動。できなかったらさらにDLLとかあつめて起動できるまでやること（OpenCVとかカスタムのDLLは自動では集まらない）

![p3.png](https://qiita-image-store.s3.amazonaws.com/0/8886/2a75b422-a272-efa5-6fba-12d2c3f71c59.png)

6.出来たら次にパッケージ用のプロジェクトを作成
そのプロジェクトはWINDOWS　アプリケーションパッケージプロジェクトという。
プロジェクトテンプレートの中にある
![p4.png](https://qiita-image-store.s3.amazonaws.com/0/8886/74b1e70c-23ed-06a1-713e-b163c35d1f1b.png)
C#の中にあるのがちょっと気になるが深く考える必要なし。
できたらこんな感じ
![p5.png](https://qiita-image-store.s3.amazonaws.com/0/8886/ab9edf41-6c05-52d7-a0e3-a69917a8bdfd.png)
このdemo saplが今回新規に作ったプロジェクト
プロパティとか変えたいときはPackage.appxmanifestをクリック

7.installerのセットアップ
　”アプリケーション”の右クリックの”参照の追加”で起動するアプリの選択、
　さらにDLLの一式（5でつくったものからEXEを抜く）をエクスプローラーからドラッグして載せる。
　うまくいくとこうなる。
![p6.png](https://qiita-image-store.s3.amazonaws.com/0/8886/79f40a9c-cd3e-28da-32b0-2a5a05e261ff.png)
なおDLL一式のフォルダ名はAPPと一致しないといけない
違うと(SYSとか)
QtGuiApplication/QtGuiAplicaation.exe
SYS/*.dll
みたいになる。

8.イントーラappxbundleを作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8886/f26a73ee-a571-3c92-dea9-6ec046cae69a.png)
こんな感じでインストーラの右クリックー＞ストアー＞アプリパッケージの作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8886/feb521b9-ce0f-6ce3-3910-dd76b743cfdd.png)

とりあえずサイドロード用を作って自分のPCにインストールしてください。
※インストールの前にライセンスを入れること
やりかたは上のcerに対して”証明書のインストールー＞ローカルコンピューター＞証明書をすべて次のストアに配置ー＞信頼されたルート証明機関”
https://qiita.com/nakashima_bike/items/0fe974cd6991b5f81f89
macでgitとgithubを連携させる

#はじめに
　今回はAndroidアプリをgithubで共同開発しようと思ったのでmac自体にgitをインストールして連携させようと思います。Android Studio自体にもgitをインストールできると思うけどこれからのこととかも考えてmac自体にいれとこうと思う。
　事前にgithub登録はしておいてください。

# 開発環境
* MacBook


#Gitのインストール

Gitのインストールは主に二つあります。

1.公式サイトからのダウンロード
2.homebrewを使ってインストール

今回は公式サイトからのダウンロード方法を紹介していきます。

###公式サイトからのダウンロード
 [Gitの公式サイト](https://git-scm.com/download/mac)へアクセスして、 `click here to download manually`をクリックします。そうするとダウンロードされます。
<img width="628" alt="スクリーンショット 2019-03-19 15.42.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/346938/52c8843f-a7f2-ba83-ef5f-1404378c3487.png">

`git-2.21.0-intel-universal-mavericks.pkg`をクリックし、ダウンロードします。
<img width="612" alt="スクリーンショット 2019-03-19 15.54.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/346938/2c461ce9-0eaf-d8f0-16b6-adb32fe29a4d.png">

多分インストールが完了してます。ターミナルを開いて

```
$ git --version
git version 2.17.2 (Apple Git-113)
```

このように出ればインストールできてます。でもxcode-selectがインストールされていなければ

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```
このようにエラーが出ます。

### xcode-selectをインストール

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

これでxcode-selectがインストールされているはずです。

```
$ git --version
git version 2.17.2 (Apple Git-113)
```
#GithubとGitとの連携
　Githubの連携は開発環境とかでやったことと一緒です。

###SSH Keysのチェックと作成
 まず自分のパソコンがSSH Keysを持っているか確認します。

```
$ ls -al ~/.ssh
```
SSH Keysがなければ以下のようなメッセージが返ってきます。

```
ls: /Users/maeda/.ssh: No such file or directory
```
もし上のメッセージがあれば

```
$ ssh-keygen -t rsa
```
このコマンドを実行してください。途中で色々聞かれますがだいたい`Enter`で大丈夫です。

###SSH Keysの確認とコピー
　catコマンドでid_rsa.pubファイルを開き、中身をコピーしておきます。長い文字列が表示されるのでコピーしておきましょう。`ssh-rsa`もしっかりコピーしておいてください。

```
$ cat ~/.ssh/id_rsa.pub

ssh-rsa AAAAB3NzaC1y〜〜〜〜〜〜〜〜 ユーザー名.local

```

###GitHubにSSH Keysを登録
　Githubにログインして`settings`→`SSH and GPG keys`を開いてください。
<img width="271" alt="スクリーンショット 2019-03-19 16.30.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/346938/64c61d13-7553-8d9c-df2e-a7fabeb1aedc.png">

　その後`New SSH Key`を押してtitleとkeyを入力します。`title`は適当にわかりやすい名前をつけてください。keyはさっきコピーした`ssh-rsa ~~.local`を貼り付けてください。

<img width="788" alt="スクリーンショット 2019-03-19 16.41.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/346938/c372cdd6-e2c5-4213-2fce-6db97d1384bf.png">
 `Add key`を押せばgitとgithubの連携ができます。



#参考
* [Mac OS Sierraにしたらgitコマンド、ターミナル上にエラーが出てしまった。](https://qiita.com/ARTS_papa/items/60ba305b23dc967bba87)
* [購入直後のMacでGitコマンドを使えるようになるまで](https://qiita.com/furusin_oriver/items/974a7b7fb8c56ad88d6e)
* [MacでGitHubを使う手順 – SSH Keysの登録 / リポジトリの作成 / 基本コマンド](https://mae.chab.in/archives/2306)
深層強化学習ライブラリ machina

##  深層強化学習ライブラリ machina
https://machina-rl.org/
https://github.com/DeepX-inc/machina

A Library for Real‑World
Deep Reinforcement Learning

新しい深層強化学習ライブラリがリリースされたようなので概要を訳してみました。
## コンセプト

machina（mάkɪnə）は、実世界のタスクに深層強化学習 (DRL）を適用するために設計されたライブラリです。

DRL において、利用可能なアルゴリズムと方策の数が大幅に増加しています。実社会のタスクの開発は、(1)試行錯誤アプローチと、(2)環境、アルゴリズム、および方策が変わってしまう可能性のせいで困難です。そのため、DRLシステムの個々の構成要素を変更する機能は、開発者によって強く望まれています。

他のベンチマークライブラリと違って、machinaはDRLシステムの各構成要素の依存関係を分解することによってこのComposabilityの問題を解決します。

## 特徴
・強化学習のために設計されたComposability

Composabilityはコンピュータプログラミングにおける重要な特性であり、実行中にプログラムの構成要素を動的に切り替えることを可能にします。 machinaはこの原則を念頭に置いて構築・設計されており、システムおよびプログラム開発における高い柔軟性を持っています。

具体的には、RLポリシーは生成された軌跡を介して環境に働きかけ、一方の構成要素の交換を簡単にします。たとえば、machinaを使用すると、トレーニング段階でシミュレート環境と実際の環境を切り替えることができます。

#### 混在環境の簡単な実装
エージェントは、異なる環境が混在する中で同時にまたは順次学習することが可能です。

#### 複数のアルゴリズムを組み合わせるのに便利
エージェントは、さまざまな最先端のアルゴリズムを組み合わせて学習することができます。

#### ハイパーパラメータを動的に変更できる
ユーザーは、ハイパーパラメーターの自動チューニングのためのメタ最適化手法を容易に実装できます。

## まとめると
環境、アルゴリズム、方策といった構成要素の分解やカスタマイズに優れているようです。
どうしてもゲームプログラマになりたい人へ基礎知識編＃B02_English

##記述する動機
私、とある専門学校でPGを教えています。はや10年。
いまだにSEもやってます。
学生さんたち向けですが、息子さん、娘さんがゲームプログラマになるなんぞと言い出したらご一読ください。学校名は秘密！！

##基礎知識編（2019）
この記事を読んで「心折れる」という人はさっさと折って差し上げます。
サクサク行きます。いいですか？
今回はEnglishの勉強

##Englishの勉強
学ぶ必要性は前回述べています。省略
なぜ我々は６年もの期間学んでいるのに英語が使えないのか？
中学、高校で教わる英語はEnglishじゃない。これでわかりやすいと思います。
今時シェイクスピア読まされて嬉しいか？それこそ　Not to be.笑うぜ全く

そもそもフォニックス
学校教育でフォニックスを教えないのはなぜかしら？
読み方の基本ルールを教えてないからダメだと思う。
愚民教育説に一票投じたくなりますな。
北欧出身、米国出身の友人が「なぜだろう」と不思議がっていた。
https://aiueophonics.com/
ここはすごく良いので、子供と一緒にパパ、ママも楽しく学ぶと良いです。
https://www.oxfordowl.co.uk/
ここも良いところ、一緒にやると楽しいと思います。
youtubeにリストがあったのでこちらも
https://www.youtube.com/watch?v=saF3-f0XWAY&start_radio=1&list=RDsaF3-f0XWAY
本当は子供の頃にやるべきなんだけど、どうせゼロに近いんだし、やりましょう。
本当に楽しい。

言語は使うもの
一番良いのは友人と会話。でもこれはなかなか難しいかも。
NEWS、海外ドラマ、洋画を観て、聴いて、読んで、わかる。このセットが必要。
楽しいし、使える会話文を学べる。少々訛っても良いです。ネィティブだって結構訛ってる。笑

コンパイルエラー、その他エラーメッセージをそのまま理解する。
プログラム言語はなんでも良いです。メッセージをそのまま読みましょう。何故か？
正しい翻訳は得難いです。そもそもコンピュータ用語は...以下略
この程度がそのまま読めないなら、プログラミングは苦しすぎます。
何故にそんなに嫌なことやるわけ？論理矛盾も甚だしい。
只でさえスピード勝負なのに、プログラムを日本語で考えるのは曖昧かつ低速化でしかないと思います。
「プログラムのロジックは英語で考えろ」私は当たり前のことだと思うんだけど、おかしいでしょうか？

##大したことはない
フランス語、イタリア語、ロシア語、その他の言語を学ぶのと比べりゃ大したことはない筈。
一応知らんわけではない。苦手意識をさっさと捨てて、全力で取り組みましょう。一日２時間も聴いたり、観たり、読んだり。大した時間でもない。むしろ楽しい時間のはず
Englishぐらいで死にそうなこと言わないように。今の所大丈夫？
大丈夫じゃない人は他のこと...To Be Continued
Lightning コンポーネントから Visualforce ページを iframe で表示する

今回は Lightning コンポーネントから iframe で Visualforce ページを呼び出す方法です。
LEX 上では以下の様に簡単に実装出来るため、特に難しく感じることは無いと思います。

```html
<iframe src="/apex/[ページ名]" />
```

しかし、コミュニティでは少し挙動が変わるの注意が必要です。


## 環境毎に src 属性の指定方法が変わる
具体的には、環境に合わせて以下のように src 属性の値を変更しなければいけません。

| 環境                    | src 属性値|
|:-----------------------|:---------------------------------|
| LEX                    | /apex/[ページ名]                  |
| コミュニティ          | /[プレフィックス]/apex/[ページ名][^1] |
| コミュニティビルダー、もしくはコミュニティのライブプレビュー | /sfsites/c/apex/[ページ名]        |



## 実行環境の判定方法
実行環境の判定には、 location オブジェクトを見るのがてっとり早いです(Spring 19 現在)

```js
// コミュニティビルダー、もしくはコミュニティのライブプレビュー
const isCommunityBuilderOrPreview = document.location.hostname.indexOf('.salesforce-communities.com') >= 0;

// 公開されたコミュニティ
const isPublishedCommunity = document.location.pathname.indexOf('/s/') >= 0;
```


##サンプル
上記を踏まえて、動的に環境をに合わせて src 属性を変更するサンプルコードを書いてみました。

```html:IFrameExample.cmp
<aura:component access="global" implements="flexipage:availableForAllPageTypes,forceCommunity:availableForAllPageTypes"  >
    <!-- Private Attribute -->
    <aura:attribute access="private" type="String" name="url"/>
    
    <!-- Event Handlers -->
    <aura:handler name="init" value="{!this}" action="{!c.onInit}" />
    
    <!-- User Interface -->
    <iframe src="{!v.url}" />
    
</aura:component>
```

```js:IFrameExampleController.js
({
    onInit : function(c, e, h) {
        const pathToVFPage = '/apex/VFPage';

        // コミュニティビルダー、もしくはコミュニティのライブプレビューの場合
        if (document.location.hostname.indexOf('.salesforce-communities.com') >= 0) {
            c.set('v.url', '/sfsites/c' + pathToVFPage);

        // 公開されたコミュニティ、かつ prefix が設定されている場合
        } else if (document.location.pathname.indexOf('/s/') >= 0) {
            const pathComponents = document.location.pathname.split('/');
            if (pathComponents.length > 0 && pathComponents[1] !== 's') { 
                c.set('v.url', '/' + pathComponents[1] + pathToVFPage);
            }

        // LEX の場合
        } else {
            c.set('v.url', pathToVFPage);
        }
    }
})
```

```html:VFPage.vfp
<apex:page showHeader="false" standardStylesheets="false">
    Hello Iframe
</apex:page>
```



[^1]: コミュニティでゲストユーザー向けにも表示したい場合は、ゲストユーザーのプロファイルに Visualforce ページを追加する必要があります。
Can we convert a depth-map to a 3D-model?[Part2]

## Completing 3D Object Shape from One Depth Image
https://www.cv-foundation.org/openaccess/content_cvpr_2015/papers/Rock_Completing_3D_Object_2015_CVPR_paper.pdf

>Abstract
Our goal is to recover a complete 3D model from a depth
image of an object. Existing approaches rely on user interaction
or apply to a limited class of objects, such as chairs.
We aim to fully automatically reconstruct a 3D model from
any category. We take an exemplar-based approach: retrieve
similar objects in a database of 3D models using
view-based matching and transfer the symmetries and surfaces
from retrieved models. We investigate completion of
3D models in three cases: novel view (model in database);
novel model (models for other objects of the same category
in database); and novel category (no models from the category
in database).

私たちの目的は完全な3Dモデルを深度画像から復元することです。既存の方法では(結果が)ユーザーに依拠したり限られたクラスのオブジェクトにのみ適用することができました。私たちの狙いは、どんなカテゴリーからでも完全に自動的に3Dモデルを復元することです。私たちは、ビューベースのマッチングを使用して3Dモデルのデータベース内の同様のオブジェクトを検索し、検索されたモデルから対称性および外観を転送するという、典型的な方法をとります。また以下の3つの場合で3Dモデルの完成を調べます。
novel view:データベースのモデル
novel model:データベース内の同様なカテゴリー内の他のオブジェクトモデル
novel category:データベースのカテゴリーにはないモデル

*plane-netで得られた深度マップはkinectなどで得られたものと比較してどうなんだろう...*
*オブジェクトに限っていそう前景の再現性は...?*
Can we convert a depth-map to a 3D-model?[Part1]

[planenet](https://arxiv.org/abs/1804.06278)によって作成できた深度マップから3Dモデルは生成できるのだろうか。結論を出すにはかなり時間を要しそうなのでブログ的にリサーチ内容をまとめる。
## 深度マップ(depth-map)とは
深度マップは、視点から撮影したオブジェクトの表面の距離に関する情報を含む画像のことである。
## 本日の収穫
* まず、”3D model” → ”depth map”は用意だが**可逆性はなさそう**だということ(3次元→2次元は簡単でも2次元→3次元が難しいのは想像に難くない)
* 生成できても、正確なモデルは得られないということ
* やった例はあるが今回求めているものではなさそう(?)
https://www.youtube.com/watch?v=-4vgn148Pxc

## コメント
デバイスに依らない単一RGB画像で深度マップが生成できるようになって論文が発表されたのが先月である。~~冷静に考えてそこでできた深度マップから欲しているクオリティの3Dモデルが現時点でできるような気がしない...~~
SLAMを支えたPTAM

## はじめに
SLAMについてはここから↓
[RGBから3Dへ-SLAM，そしてディープラーニング-](https://qiita.com/hiroqik/items/a602f9c1f8704893595c)


## PTAMについて
Parallel Tracking and Mapping for Small AR Workspaces
論文は[こちら](http://www.robots.ox.ac.uk/ActiveVision/Publications/klein_murray_ismar2007/klein_murray_ismar2007.pdf)

ABSTRACT
>This paper presents a method of estimating camera pose in an unknown
scene. While this has previously been attempted by adapting
SLAM algorithms developed for robotic exploration, we propose a
system specifically designed to track a hand-held camera in a small
AR workspace. We propose to split tracking and mapping into two
separate tasks, processed in parallel threads on a dual-core computer:
one thread deals with the task of robustly tracking erratic
hand-held motion, while the other produces a 3D map of point features
from previously observed video frames. This allows the use of
computationally expensive batch optimisation techniques not usually
associated with real-time operation: The result is a system that
produces detailed maps with thousands of landmarks which can be
tracked at frame-rate, with an accuracy and robustness rivalling that
of state-of-the-art model-based systems.

本論文では(新しく撮影する)フレームにおけるカメラの姿勢推定の方法について方法を提案します。これは、以前はロボティクス分野のために開発されたSLAMアルゴリズムを用いることによって行われていたが、本論文では小さなAR作業空間での携帯カメラを追跡するために特別に設計されたシステムを提案します。追跡(トラッキング)とマッピングを2つの別々のタスクに分割し、デュアルコアコンピュータ上の並列スレッドで処理することを提案します。一つのスレッドでは携帯モーションカメラの汎化性の高いトラッキングを行い、もう一方のスレッドでは過去の(すでに撮影されている)ビデオフレームから特徴点の3Dマップの作成を行います。ここでは通常のリアルタイム操作では行わないようなコンピューターにとって負荷の重いバッジ処理技術を行うことになります。結果、数千の特徴点を持った詳細なマップを生成し、それを、最先端のシステムでの精度と汎化性に匹敵するような性能で、フレームごとにトラックすることができるようになります。
## 目的
3D空間の認識が難しいマーカーレスなARシステムにおいて現実3D空間上で特徴点を利用しそれをトラッキング(追跡)すると同時にマッピングも(parallel threadsにおいて)行うことで、精度とロバスト性とスピードをあげること。
ロバストとは？

勉強しているときによく出会う語句について。その2。
### ロバストって？
論文を読んでると**robustly**・**robustness**といった単語がよく出てくる。そもそも**robust**とはどういう意味だろうか？英和辞典weblioにはこう書いてある。
>形容詞
(robust・er; robust・est)
1a〈人・体格など〉強健な，たくましい，がっしりした 《★【類語】 ⇒strong》.
a robust physique [frame] たくましい体つき.
b〈信念・精神など〉強い，強固な.
a robust appetite 旺盛な食欲.
2a〈経済など〉健全な.
b〈仕事など〉力のいる.
3a〈演説など〉力強い.
a robust rebuttal 強烈な反駁(はんばく).
b〈会話・冗談など〉粗野な，荒っぽい.
4〈ぶどう酒など〉こくのある.
robustly 副詞
robustness 名詞

### 統計アルゴリズムにおける**ロバスト**とは？
例えばあるデータセットに対して回帰分析を行ったとします。ここで、データの中には外れ値といったノイズが存在していて、外れ値を取り除いて回帰分析を行ったときの回帰直線と外れ値を含めた時の回帰直線の結果が別で存在するとします。この状況において二つの回帰直線の結果の誤差が小さい時、外れ値を含めた時の回帰直線が外れ値から受ける影響が小さく**ロバスト**であると言えます。最小二乗法などは外れ値の影響を受けやすいので、外れ値を取り除くとこなく受ける影響を小さくして**頑丈な**モデルを推定することがあります。これをロバスト推定といいます。
Pop-up SLAM: Semantic Monocular Plane SLAM for Low-texture Environments

SLAMのお話。低テクスチャ環境における単一画像による３Dレイアウトモデルの生成の改善について見かけたので残しておく。(そもそもplane-netによるdepth-mapによる精度の高い3Dモデルの生成は難しいし時間がかかる（depth-map生成のタイミングで時間がかかる）)

## Pop-up SLAM: Semantic Monocular Plane SLAM for Low-texture Environments
>Abstract
Existing simultaneous localization and mapping (SLAM) algorithms are not robust in challenging low-texture environments because there are only few salient features. The resulting sparse or semi-dense map also conveys little information for motion planning. Though some work utilize plane or scene layout for dense map regularization, they require decent state estimation from other sources. In this paper, we propose real-time monocular plane SLAM to demonstrate that scene understanding could improve both state estimation and dense mapping especially in low-texture environments. The plane measurements come from a pop-up 3D plane model applied to each single image. We also combine planes with point based SLAM to improve robustness. On a public TUM dataset, our algorithm generates a dense semantic 3D model with pixel depth error of 6.2 cm while existing SLAM algorithms fail. On a 60 m long dataset with loops, our method creates a much better 3D model with state estimation error of 0.67%.

既存のSLAMアルゴリズムは目立った特徴がないため、低テクスチャ環境ではロバスト性はありません。結果として生じるスパースまたは純密度マップもまたモーションプランニングのための情報もほとんど伝達しません。いくつかの作業では密度マップの正則化のために平面またはシーンレイアウトを利用していますが、他の情報源による正確な状態推定が必要です。本論文では、低テクスチャ環境における状態推定と高密度マッピングの両方を改善できることを実証するために、単眼平面SLAMを提案します。平面測定は各単一画像に適用される3Dポップアップから来ます。またロバスト性を向上させるために、平面とポイントに基づいたSLAMを組み合わせています。公開されているTUMデータセットで、本アルゴリズムは既存のSLAMアルゴリズムが失敗するのに対して6.2cmのピクセル深度誤差を有する高密度セマンティック3Dモデルを生成します。ループを用いた佐賀さ60mのデータセットでは、私たちの方法は0.67％の状態推定誤差を有するより良い3Dモデルを作成します。

>https://www.youtube.com/watch?v=TOSOWdxmtkw

>http://www.frc.ri.cmu.edu/~syang/corridor_plane_slam.html
深度マップの生成について

## 深度マップの生成について
既に何度か記事で取り挙げられているが本年(執筆時2018年)4月17日に公開された論文[PlaneNet: Piece-wise Planar Reconstruction from a Single RGB Image](https://arxiv.org/abs/1804.06278)によって、単一のRGB画像から深度マップを生成しそれに対応するセグメンテーション推定を行うことが可能にされた。これはデバイスに依拠せず普遍性という点で評価されるものだと思う。
## iPhoneというデバイス
ここで読者の多くが使っているだろう撮影デバイスとして**iPhone**はどうだろうか。
実はiOS11から写真の深度マップを扱うAPIが追加されてたらしい。現在はデュアルカメラ搭載してる**iPhone X**、**iPhone 8 Plus**、**iPhone 7 plus**のみに限って対応しているそう。世界中のみんながこの三種類を使っていたら『planenetとはなんだったのか』となってしまうところである。

結局我々はAppleの手のひらの上で転がされているだけなのだろうか。Appleすごい...(Apple信者が生まれた瞬間であった)
### 参考
>https://qiita.com/imk2o/items/82d265e51ee6bc85144f
>https://developer.apple.com/videos/play/wwdc2017/507/
>https://developer.apple.com/videos/play/wwdc2017/510/
>https://developer.apple.com/videos/play/wwdc2017/508/