OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubのリポジトリをあれこれ

# はじめに
Githubのリポジトリ設定画面を見ていて、「<font color="Red">Danger Zone</font>」をちゃんと使ったことなかったので、調べてみました。

↓これのこと
![Github Danger Zone](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408638/3ef38edf-4831-bf99-a997-281fc9cab2b3.png)

ちなみにどこにあるかというと、
![Github Repository Menu](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408638/ba560954-67fa-9981-0123-1f5ae9593036.png)
リポジトリのページにあるメニューの右端にあるSettingsの一番下にあります。

# 1. Make This Repository
現在のリポジトリの公開設定を変更します。
現在設定中の状態から、Public（公開）またはPrivate（非公開）に設定できます。
![Make This Repository](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408638/bf82ff8e-2a19-63de-753b-87b0a911d0d5.png)
例えば、現在のリポジトリが公開設定になっている場合Private（非公開）にできます。
自分はGithubのフリーアカウントでもPrivateリポジトリが利用できるようになったので、元々仕方なく公開していたリポジトリを変更するのに使いました。

# 2. Transfer ownership
現在のリポジトリを別のオーナーへ譲渡できます。
![Transfer ownership](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408638/13e17e4e-ab5b-17d7-995c-b6931e6502c4.png)
リポジトリ名と譲渡先のユーザー名を入力することで現在のリポジトリの権限を譲渡できます。

# 3. Archive This Repository
現在のリポジトリをアーカイブ登録します。
![Archive This Repository](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408638/06a48ade-a78e-9e72-2143-b97afe2f6fe3.png)
要はリポジトリ自体をリードオンリーに変更できます。
不要になったリポジトリは削除するのも手ですが、残しておく必要がある場合（リンク先にしている、公開していて不特定多数が見ている）に有効です。

# 4. Delete This Repository
現在のリポジトリを削除します。
![Delete This Repository](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408638/d4fcb986-cc8e-a238-7970-76982bf781ea.png)
説明不要だとは思いますが、現在のリポジトリを削除します。

# 最後に
個人でリポジトリ管理している場合、リポジトリの公開設定の変更かリポジトリの削除しか使わないと思いますが、他の項目も知っていると何かで使える場合もあるかと思います！
※蛇足ではありますが、モーダル内の入力欄は現在のリポジトリ名を入力することでボタンが有効になります。（最初別のリポジトリ指定しててボタン押せなくて右往左往しました）
ぱっとタイムアウトテスト用 Web サーバを立てる

# ぱっとタイムアウトテスト用 Web サーバを立てる

タイムアウトテスト用 Web サーバを irb で.

```ruby
require 'webrick'
s = WEBrick::HTTPServer.new(:Port => 8000)
s.mount_proc('/') {|req, res|
  sleep 300
  res['Content-Type'] = 'text/plain'
  res.body = '300 secs passed'
}
trap(:INT){s.shutdown}
s.start
```

irb に流し込んだ後は http://localhost:8000/ にアクセスすれば OK.
Raspberry Pi Zero Wを、超簡単に構築する（外付けキーボード・マウス・ディスプレイ不要）

# 用意するもの
- Raspberry Pi Zero W（Raspberry Pi Zero WHでも可）
- microSDカード 16GB以上
- microSDカードリーダー
- microUSBケーブル
- USB ACアダプター（スマホ充電用ので良いです）
- 無線LAN環境

外付けキーボード、外付けマウス、外付けディスプレイは無しで環境構築が可能です。
Mac,Windowsどちらも同じ手順で構築可能です。

# 構築手順
## 準備
お持ちのPCにmicroSDカードリーダーを用いて、microSDカードを接続してください。

## OSダウンロード
お手持ちのPCを使い、公式サイトからラズパイ用のOSをダウンロードします。
3種類ありますが **Raspbian Stretch with desktop** の **Download ZIP** を選ぶのが無難です。

https://www.raspberrypi.org/downloads/raspbian/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/6a929773-0fbe-21ea-3a37-bce80e2bfe9a.png)

## microSDカードへの書き込み用ソフトウェアのダウンロードとインストール
ダウンロードしたOSをただmicroSDカードにコピーしただけではラズパイでは認識しません。そのため以下の手順でmicroSDカードに書き込む必要があります。
以下から **Download for macOS** を選択し、ダウンロードしたファイルをインストールしてください。
https://www.balena.io/etcher/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/48119138-bf13-ad21-6e56-7a22b3326445.png)

## microSDカードにOSの書き込み
前の手順でインストールしたetcherを起動し、以下の手順を実施してください。
1. **Select image** を選択し、ダウンロードしたOSを選択する。zip形式のままで構いません。
2. **Select Drive** を選択し、microSDカードのドライブを選択してください。
3. **Flash!** を選択してください。
4. **Flash Complete** と表示されたら完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/f8204345-ac71-d2f8-1f0a-68efbc6fb34d.png)

## 設定ファイルの変更
microSDカードを一度PCから外して、再度接続してください。こうすることでmicroSDカードを`boot`という名前で認識します。
認識したらmicroSDカードのフォルダを開いてください。

### wpa_supplicant.confファイルの作成
`wpa_supplicant.conf`というファイルを作成して以下の内容を記入し、microSDカードのフォルダに保存してください。

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSIDを記入してください"
    psk="パスワードを記入してください"
}
```

### sshファイルの作成
`ssh`という空のファイルを作成して、microSDカードのフォルダに保存してください。
ここまででmicroSDカードの準備は完了です。

## microSDカードをラズパイに挿入
ラズパイの横に挿入口があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/56e46bf5-7208-313e-a083-0714f5f82bc3.png)

## ラズパイを電源に接続
micro USBケーブルとUSB ACアダプタを用いて、ラズパイのmicro USBポートと電源を接続してください。
ラズパイのMicro USBポートは2箇所ありますが、外側のポートに挿してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/9a1eb3d2-fc4b-c024-3608-cd6a28f85fc2.png)

## しばらく待つ
Micro USBケーブルを接続すると緑のLEDが点滅します。点滅から点灯し続ける状態にかわるまで約1,2分待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402872/8e392be1-3cd8-1dea-0f8f-4743a0ce1a80.png)

## ラズパイへ接続
Macの場合は **Finder -> アプリケーション -> ユーティリティ -> ターミナル.app** を起動してください。
Windowsの場合は **powershell** を起動してください。

そして以下のコマンドを入力してください。

```
ssh pi@raspberrypi.local
```

初回だけ`Are you sure you want to continue connecting (yes/no)?`と表示されますので、`yes`と入力しエンターを押してください。

その後、パスワードを聞かれますので`raspberry`と入力してください。
これで環境構築が完了です。

# 関連記事
Raspberry Pi Zeroの環境を1,814円で構築する（外付けキーボード・マウス・ディスプレイ不要）
https://qiita.com/hanzawak/items/eb488a826cf9dff6a1f8
How to Develop a travel app like Airbnb?

Everyone loves to explore new places. We always look for an excuse to escape from our routine lives and travel to adventurous and unexplored destinations for some rejuvenating experiences. Travelling creates some beautiful memories that we can cherish for a lifetime. And, when the world is our oyster, we have so much to explore, isn’t it?

We believe that the ever-booming travel industry is proof of our passion for travelling. Here are some facts and figures that confirm our belief.

As per the report from the World Travel & Tourism Council, the travel and tourism industry has contributed to a total of 10.4% of the global GDP.
As per the report by the US Travel Association, $1,036 billion was spent on travel in 2017.
On average, Americans usually spend $1,978 on summer vacations by Allianz Travel Insurance.
Talking about vacations… What is the first thing that crosses our mind when we think about traveling? Yes, you’ve guessed it right! It definitely has to be quality lodging and boarding facilities at reasonable prices. We all know that unkempt Inns and lousy food are capable enough to ruin our trip. Hence, you need to ensure to book the best hotel or rented accommodation that not only serve quality food but also offers a good package deal.

Airbnb is one of the most promising online booking portals where you can find the best deal for rentals that too within your preferred budget. It is a benchmark of superior deals in the travel industry and is known for its excellent customer service.

Read More: https://www.prismetric.com/cost-of-developing-an-app-like-airbnb/
React Native: The Framework that makes your Business Ideas more Feasible

Let’s face it: Be it the old kid on the block or the slew of new entrants, they are making the headway into mobile space, and with so many platforms emerging in quick succession, sticking with a platform is not a prudent strategy. Is it tingling your techie sense? If so, you get it right.

The mobile development at “CROSS” roads has become all-important.

Amidst the fierce competition, engineering the separate native iOS and native Android app is a daunting, complex, and an expensive affair, but cross-platform development has an answer to this problem with code reusability, compatibility with diverse platforms, native-like UI designs, third-party tools, and reduced app development time and cost.

For the cross-platform development pros, the plethora of cross-development frameworks available that have witnessed staggering growth in the last decade, but REACT NATIVE framework today rules the development landscape with its convincing benefits and bundle of features.

From the business perspective, it has turned out as the next-gen framework that yields great performance, saves huge bucks with diminished development time and cost, and provides more possibilities to stay dynamic.

Facebook, Bloomberg, Instagram, SoundCloud Pulse, Townske, Wix, Gyroscope, Salesforce, and Pinterest are some of the leading businesses that have relied on React Native framework to develop brilliant applications that work on every platform flawlessly and gained immense success.
Read More: https://www.prismetric.com/react-native-the-framework-that-makes-your-business-ideas-more-feasible/
CloudBuildのビルド結果をCloudFounctionsを利用してSlackへ通知

前回GitLabへのPushをトリガーにして、CloudBuildを実行して、GAEへデプロイする流れは作ったので、これを少し拡張して
CloudBuildの結果をSlackへ通知する仕組みを実装して見ました。
[前回の記事](https://qiita.com/hidetzu/items/e33d1542300afc7f0908)

## Cloud Functionsの実装
Cloud Founctionsの利用方法で環境変数を利用する方法も一緒に調べたので、SLACK_WEBHOOK_URL、CHANNEL、USERNAME
は環境変数で外からDIするような仕組みで対応。
CloudBuildを生成する際に対象となるPub/Subのトピックも作成されているようでした!

```golang
package slack

import (
    "context"
    "encoding/json"
    "log"
    "net/http"
    "fmt"
    "bytes"
    "os"
)
type PubSubMessage struct {
    Data []byte `json:"data"`
}

func sendMsgForSlack(data *map[string]interface{}) {
    log.Printf("%v", data)

    slack_webhook_url := os.Getenv("SLACK_WEBHOOK_URL")
    channel  := os.Getenv("CHANNEL")
    username := os.Getenv("USERNAME")
    log.Printf("%v, %v, %v", slack_webhook_url, channel, username)

    dat    := *data
    ignore_status := []string { "QUEUED", "WORKING" }
    status := dat["status"].(string)

    for _, value := range ignore_status {
        if status == value {
            return
        }
    }

    text := "ビルド結果\n"
    text += "プロジェクトID:" + dat["projectId"].(string) + "\n"
    text += "ID:" + dat["id"].(string) + "\n"
    text += "結果:" + status + "\n"
    text += "ログ出力先:<" + dat["logUrl"].(string) + "|Click here>"

    jsonStr := `{"channel":"` + channel + `","username":"` + username + `","text":"` + text + `"}`

    req, err := http.NewRequest(
        "POST",
        slack_webhook_url,
        bytes.NewBuffer([]byte(jsonStr)),
    )

    if err != nil {
        fmt.Print(err)
    }

    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        fmt.Print(err)
    }

    fmt.Print(resp)
    defer resp.Body.Close()
}

func ReciveFromPubSub(ctx context.Context, m PubSubMessage) error {
    var dat map[string]interface{}
    json.Unmarshal([]byte(m.Data), &dat)
    sendMsgForSlack(&dat)
    return nil
}
                                                                                                                                                                                              
```

## Cloud Functionsから環境変数を利用する
yamlファイルを指定してデプロイが出来るので下記ファイルを作成する。

```yaml:.env.yaml
SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/hogehoge"
CHANNEL: "hogehoge"
USERNAME: "CloudBuild"  
```

## デプロイする。
下記コマンドでデプロイを実行します。
--trigger-resourceは、今回、cloudbuildからの通知を受けるので、cloud-buildsを指定。

```sh
gcloud beta functions deploy CloudBuildReport --runtime go111 --trigger-resource cloud-builds --trigger-event google.pubsub.topic.publish --entry-point ReciveFromPubSub --env-vars-file .env.yaml
```
## 動作確認
実際に動かして見ると、ビルドが完了したタイミング以外にも、"QUEUED", "WORKING"等の状態でもSlackへ通知が発生していたので、
goの実装の中でstatusを見て、途中の場合は、無視するようにした。

## まとめ
GOがCloudFounctionsでサポートされたことを知ってようやく触ってみましたが、色々細かい部分の設定などで悩まむことが多かったです^^;
最近、あまりサーバーサイド書いてないので少し鈍っているなー。。
OracleMasterBronzeの勉強で新しく知った関数とか知識

# この記事の概要
- OracleMasterBronzeを勉強していくにあたり、初めて目にする関数や知識が何個かあったので、メモとして残しておこうと思い
- SQL関係はdualを使ってできる範囲でSQLと結果を載せますー

# SQLの種類
## DML（Data Manipulation Language）
- データ操作言語
- select, insert, delete, update, merge

## DDL(Data Definition language)
- データ定義言語
- create, alter, drop, rename, truncate, comment

## DCL(Data Control Language)
- データ制御言語
- grant, revoke
    - revoke: ユーザやロールから権限を剥奪する

## トランザクション制御
- commit, rollback, savepoint

# 汎用関数

## nullif
- 第一引数と第二引数が等しい場合にNullを返す単一関数

```
SQL> select nullif(1000, 1000) from dual;

NULLIF(1000,1000)
-----------------


SQL> select nullif(1000, 1001) from dual;

NULLIF(1000,1001)
-----------------
	     1000
```
## nvl
- 第一引数がNullだった場合に第二引数の値を返す関数

```
SQL> select nvl(null, 123) from dual;

NVL(NULL,123)
-------------
	  123

SQL> select nvl(1, 123) from dual;

NVL(1,123)
----------
	 1
```

## nvl2
- 第一引数がnullじゃなかったら第二引数を、
- 第一引数がnullだったら第三引数を返す

```
SQL> select nvl2(null, 123, 456) from dual;

NVL2(NULL,123,456)
------------------
	       456

SQL> select nvl2(1, 123, 456) from dual;

NVL2(1,123,456)
---------------
	    123
```

## coalesce
- 可変引数をとり、はじめにnullでない値を返す
- 引数はすべて同じデータ型である必要あり
- （読み方がわからん。。。）

```
SQL> select coalesce(null, 2, 3) from dual;

COALESCE(NULL,2,3)
------------------
		 2

SQL> select coalesce(null, null, null) from dual;

C
-

```

# 条件式
## case文
- そういえばあまり使ってこなかったなぁ
- 最後のendを忘れない
- `CASE var WHEN val1 THEN ret1 ELSE ret2 END`みたいな書き方もできる
- decodeも条件で出し分けができるけど、範囲指定でやりたいときはこっちかな

```
SQL> select case when 90 > 80 then 'good' else 'soso' end from dual;

CASE
----
good
```

# グループ関数
## 注意点メモ
- null値は集計対象にならない
- 集計対象にしたければnvlとかを使う
- ネストは２レベルまでOK。それ以上はエラー

# 複数の表の結合
- すべての列名に表接頭辞を付与するとoracleが列名の重複チェックをしなくなりわずかにパフォーマンスアップ！
- 表別名を短いものに設定するとSQLが短くなってパフォーマンスアップ！

# 集合演算子
- 集合演算子に優先順位はない
- 上から順に結合される

## UNION
- 重複した行を排除して結合
- **select句の先頭の列でソートされる**
- 最後の問い合わせの後に`ORDER BY`句を記述することでソート順を制御できる

## UNION ALL
- 重複行も含めて結合
- ソートはされない

## INTERSECT
- 共通する行だけを返す

## MINUS
- １つ目の問い合わせ結果 - ２つ目の問い合わせ結果
- 問い合わせ順を変えると結果が変わるよ

# トランザクション制御
## FOR UPDATE
- select句使用時には通常ロックはかからないが、 `FOR UPDATE`文を使用することで**行単位で**ロックをかけることができる

# 表の作成と管理
## TABLE
- DROPで削除できるが、ゴミ箱には残っている
- ゴミ箱からも削除したい場合は`PURGE`句を指定する
- ゴミ箱から復元するためには`FLASHBACK TABLE`文を使用する

## INDEX
- 一意性制約のチェックはインデックスを利用して行われる
- だからprimary_keyやunique制約をつけるとデフォルトでインデックスが作成されるのか

## FOREIGN KEY制約
- 参照する列は同じ表でも異なる表でもOK
- ただし**PRIMARY_KEY制約かUNIQUE制約**が定義されている必要がある
BitBucketからGitHubへpush先を変更したい

###前置き
半年前にちょっと手をつけたものの、1章も完走できないまま他の教材に目移りしてしまったRailsチュートリアルを再開ました。

半年間の間に無料でもGitHubにプライベートリポジトリが作れるようになりました（2019年1月7日）。なので、チュートリアルどおりBitBucketにしていたGitのホスティングを、使い慣れ始めたGitHubに変更したいと思います。

変更前はどういう状況かというと

開発環境はAWSのCloud9
rails new、bundle installしてアプリ雛形できてる。
~/.gitconfigに名前とメールアドレス登録できてる。
ssh-keygenしてSSHの鍵ペアが生成済。
git initしてアプリのルートディレクトリに.gitできてる。
BitbucketにSSH公開鍵が登録済でリポジトリできてる。

という感じでした。完全に1章の途中です...BitBucketにリポジトリ作ってローカル(Cloud9）のリポジトリがpushできましたね。というところ。

確認が終わったのでここから。

###GitHubにremoteリポジトリつくる
まずGitHubにSSH公開鍵を保存します。

GitHubの画面右上アカウントのアイコン ＞ settings ＞ 左メニューの SSH and GPG keys ＞ New SSH key ＞ Titleに適当な名前 ＞ Keyに公開鍵を貼り付ける

公開鍵はCloud9のターミナルで
`$ cat ~/.ssh/id_rsa.pub` と入力して参照。

リポジトリ作ります。
GitHubの右上「＋」 ＞ New repository

Repository nameに「hello_app」（チュートリアルのアプリの名前） ＞ Privateを選択 ＞ 「Create repository」

これで、
`https://github.com/<ユーザー名>/hello_app.git`というURLのリポジトリができました。

###remoteの変更

現在のremote（push先）を確認します。
`$ git remote -v`

```
origin  git@bitbucket.org:<ユーザー名>/hello_app.git (fetch)
origin  git@bitbucket.org:<ユーザー名>/hello_app.git (push)
```
remoteを変えます。
`$ git remote set-url origin https://github.com/<ユーザー名>/hello_app.git`

変わってるか確認。
`$ git remote -v`

```
origin  https://github.com/<ユーザー名>/hello_app.git (fetch)
origin  https://github.com/<ユーザー名>/hello_app.git (push)
```
変更されました。

pushしてみます。
`$ git push -u origin --all`

できました。よかった。

###追記　Herokuのpush先も変更したい場合
Herokuの画面で、リモートURLを確認。

アプリ名 ＞ Setting ＞ Info ＞ Heroku Git URL

Cloud9のターミナル（アプリのルートディレクトリ）で

`$ git remote set-url heroku https://git.heroku.com/<アプリ名>.git`

こうすると、Herokuのpush先も変更できる。

変わってるか確認。
`$ git remote -v`

```
heroku  https://git.heroku.com/<アプリ名>.git (fetch)
heroku  https://git.heroku.com/<アプリ名>.git (push)
origin  https://github.com/<ユーザー名>/hello_app.git (fetch)
origin  https://github.com/<ユーザー名>/hello_app.git (push)
```

変わりました。
これで、
`$ git push heroku master`
すれば、目的のherokuにデプロイできます。

よかった。
Rails Spec chromedriver  エラー

現場で使える Ruby on Rails5 速習実践ガイドの学習を進めている初心者です。

OS: Ubuntu
Rails 5.2.3

204ページにあるSpecの実行を行うと下記のようなエラーが起きます。



`code`

     Failures:

     1) タスク管理機能 一覧表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される
        Got 0 failures and 2 other errors:

     1.1) Failure/Error: visit login_path

          Selenium::WebDriver::Error::WebDriverError:
            unable to connect to chromedriver 127.0.0.1:9515



          # ./spec/system/tasks_spec.rb:14:in `block (4 levels) in <top (required)>'

     1.2) Failure/Error: raise Error::WebDriverError, cannot_connect_error_text

          Selenium::WebDriver::Error::WebDriverError:
            unable to connect to chromedriver 127.0.0.1:9515

解決策を享受していただきたいです。

自分で調べたところ
https://github.com/SeleniumHQ/selenium/issues/5248
上記のリンクに解決策っぽいのが記載されているみたいなのですが、具体的にどのような手順を踏めばいいのかさっぱりです。
【Rails】ダウンロードした画像をActiveStorageのModelに紐づける方法

# 開発環境
Rails: 5.2.1
Ruby: 2.5.0

# 実装
Modelの例として下記のようなuserのModelがあったとする。

``` user.rb
class User < ApplicationRecord
  # ファイルをダウンロードするために必要なライブラリ
  require 'open-uri'
  has_one_attached :icon
end
```

画像をダウンロードして、userに紐づける方法はこうだ。

```
# 画像url
imageUrl = "..."
# 画像のファイルオブジェクト
imageFile = open(imageUrl)
# userに画像を紐づける
user.icon.attach(io: imageFile, filename: "filename", content_type: 'image/jpg')
```
【はじめてのUipath】さくっとOCR処理をしてみる！

今回はUipathでさくっとOCR処理をしてみます。

かんたんに言えば、画像の中の文字を認識してくれるやつですね！

早速まいりましょう！

# 1. OCR処理をしたい画像を用意する

とりあえずOCR処理が簡単そうな背景白の文字しかない画像を用意しました。

<img width="397" alt="ocr_test.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/6be11e96-841a-fea2-6cd7-9f233d0b8881.png">


# 2. 新しいプロジェクトを作成する

この辺はやりたい人だけどうぞ！

![新しい空のプロセス 2019_05_01 14_28_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/ad218726-7b1a-34ac-dc23-1b7bf0a64d1a.png)


# 3. OCR処理をしたい画像を開いた状態で「画面スクレイピング」をクリックする

1. OCR処理をした画像を開いておきます。
2. 「デザイン」タブの「画面スクレイピング」をクリックします

![スクリーンショット (32).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/e869617b-55db-5f67-25b7-83b10aab6ed8.png)

3. OCR処理したい画像をクリックします

![スクリーンショット (33).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/3392934f-73fe-8965-363b-06a669bf04cc.png)

# 4. OCR処理の設定をします

OCRエンジンは`Microsoft OCR`にしました
拡大・縮小は数字が大きいほうが解像度がよくなるらしいです！

が、この場合は7以上は拡大できませんでした。。。

![画面スクレイピングウィザード 2019_05_01 14_49_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/642bb12a-10a0-c47b-f1a5-398dc79e79a5.png)


うーん、ちょっとおしい！！笑


# 右下の「終了」を押して、処理を続ける

先程の画面の右下に「終了」という文字があるので、それをおしたらこんな画面になります。

![UiPath Studio - ocr_test 2019_05_01 14_54_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/af71634c-0b25-fa95-4583-3b3ece368b6d.png)

次に、アクティビティパネルから、「テキストファイルを書き込む」をドラッグアンドドロップでもってきて、

- 上段は書き込むファイルのパスと名前
- 下段は、ファイルの中身（ここでいう、OCRで取り出したテキスト）

を入力します。

![UiPath Studio - ocr_test 2019_05_01 14_58_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/17bc7c36-ead0-a600-c04c-ad0426e59670.png)


上段はみなさんお好きなようにしてください。

下段は私は`ApplicationframehostEx`にしていますが、ちゃんと意味があります！


## OCRで抽出されたテキストに変数がわりあてられている

「OCRでテキストを取得」をクリックすると、変数のところに「ApplicationframehostEx」というのがあります。

そして、プロパティパネルをみると`出力`の`テキスト`部分にも`ApplicationframehostEx`と書かれてあります。

つまり、OCRで抽出されたテキストは自動で変数「ApplicationframehostEx」に入っているのです！


![UiPath Studio - ocr_test 2019_05_01 15_02_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/a5a536f8-a19d-9f00-cfaf-84d9a4f6f171.png)


# 実行する

F5キーを押すと、実行されます！

実際にやってみてください！

僕は実際に実行できました。

今回はこれでおわりです！！
Phoenix 1.4 で、React を動作させる


年号も平成から令和に変わり、久しぶりに`Phoenix` でアプリを作成予定なので、`React` を使ってみる。
いつの間にか、`Phoenix 1.4` においてJSのビルドツールは `brunch`から`webpack`に変わっていたようだ。

### 開発環境
Phoenix : 1.4.3
Elixir : 1.8.1
node : 10.15.3
npm : 6.9.0
react : 16.8.6
react-dom : 16.8.6


### Phoenix プロジェクト作成
Phoenix プロジェクトを作成し、依存ライブラリをインストールする。

```
$ cd $workdir
$ mix phx.new ReactPhoenix --app react_phoenix --no-ecto

Fetch and install dependencies? [Yn] Y

```


### React ライブラリインストール
`npm` によって、`react`と`react-dom` をインストールする。

```
$ cd $ cd ReactPhoenix/assets/node_modules/
$ npm install react react-dom --save
```

### .babelrc ファイル編集
`react`がプリコンパイルされるように`.babelrc`を設定する。

```assets/babelrc
{
    "presets": [
        "@babel/preset-env",
        "@babel/react"
    ]
}

```


### Webページテンプレート編集
index.html.eex を簡単シンプルに編集する。

```lib/react_phoenix_web/templates/page/index.html.eex
<section class="row">
  <article class="column">
    <div id="root"></div>
  </article>
</section>
```

### app.jsにReactのJSXコンポネントを記述
```assets/js/app.js
import React from 'react'
import ReactDOM from 'react-dom'

const MyReactComponent = () => <div>こんにちは。React Component!!!</div>
ReactDOM.render(<MyReactComponent />, document.getElementById('root'))
```

### Serverの起動
プロジェクトのホームディレクトリへ移動して、サーバを起動する。

```
$ cd ../..
$ mix phx.server
```

### ホーム画面
`index.html.eex`に記述した`<div id="root"></div>`タグが、`app.js`で作成したコンポネントに置き換わって表示されている。

![スクリーンショット 2019-05-01 14.59.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3184/81035e99-1285-ffda-70d3-baea3c9b5330.png "スクリーンショット 2019-05-01 14.59.25.png")

とりあえず、最低限の準備が整った。
CentOS yum環境の整備

CentOS上で``Git``や``Python3``試す度に「あれ、yumでパッケージ見つからない。あ、リポジトリか」ってなって過去記事漁ってるんで一度ここで整理しておきたい。

## yumリポジトリってなんじゃい

直訳すると「貯蔵庫」。

最初から知っている貯蔵庫は大変小さいものである。多くの種類の資材は入っていないが、公式が「これは安全よ」と認めたものだけが入っている。この貯蔵庫の中の物だけを食べて生きる分には"安全"なのだろう。

ただ世の中にはもっと素敵な資材がたくさんあり、是非ともそれを利用したいものである。

そのためには外にあるもっと大きな貯蔵庫の住所と、その貯蔵庫が管理している資材のリストを手に入れる必要がある。これが「リポジトリ」である。

直訳は「貯蔵庫」ではあるが、``yum``を扱う上では「貯蔵庫の場所と含まれている資材のリスト」の方が正確だ。

## IUS Community リポジトリの追加

[IUS Community Project](https://ius.io/)

とりあえずこのリポジトリ入れておけば大丈夫ってぐらい有名なやつ。自分のディストリビューションに合わせたものをインストールする必要があるが、ググるとみんな自分のディストリビューション向けの方法しか書いてないが、以下のURLにcurlでアクセスするとそこら辺を自動でやってくれる``bashスクリプト``が手に入る。

```
$ sudo curl -s https://setup.ius.io/
#!/bin/bash
#
# Script to setup the IUS public repository on your EL server.
# Tested on CentOS/RHEL 6/7.
:
:(省略)
:
```

ファイルに吐き出して実行でもいいけど、カッコいいのは標準出力をパイプで``sh``に渡してしまうこと。

```
$ curl -s https://setup.ius.io/ | sudo sh
```

``IUS Community``を入れることで依存元の``EPEL``もインストールされるはず。
この2つさえあればとりあえず問題ない。
Raspberry PI zero の設定

# Raspberry Pi Zero の設定

正確にはまだ終わっていないのだけれど、メモ。とにかくストレスフルだった。
何がいけないのか反省しなければいけないけれど、備忘録として。髪の毛が抜ける。哀しい。

- 以前に購入したまま放置していたので、復活させようとした。

## remote でログインできるようにしたい

作戦として、LANケーブルを有線で接続してIPアドレスを調べて ssh で入ればよいや、と思っていた。しかし、結論からいうとこれができなかった。

- IP アドレスの調べ方：いろいろ方法はあり、ping と arp コマンドで総当たりして調べることもできるらしいが、便利なwindows GUI ソフトを利用。
  - [SoftPerfect Network scanner](https://www.softperfect.com/download/) をダウンロードして素直にインストール
  - "Start Scanning"ボタンを押す。 IPv4 Form で 192.168.?.1 から 192.168.?.254まで指定しました。?は使っているルータの設定されているもの。
  - 結果が出てくるが、HostNameに（ルータが設定したものと思うが）マシンとOSの情報がついたhostname が振られている。結果の表を、IP address, MAC address, Response Time, Host Name をそのままコピーペーストできるので便利。

- WiFiでネットに繋がらなくなった。--> WiFiルータを取り換え、PPPoEの設定をし直したらつながった。
 - 自宅では光回線がきていて、アダプタにLANケーブルを接続するようになっている。以前はこれにWiFiルータを接続していたが、WiFiルータが頻繁に切れ、ついには再接続してもWiFiアクセスポイントにはなっても外のネットと繋がらなくなった。
 - [elecom WRC-1750GSV](https://www.elecom.co.jp/products/WRC-1750GSV.html)　をビックカメラで購入。ひと世代前のものだが、性能は良い、という店員さんのおすすめで購入。新しいものだとセキュリティの設定があるそうだが、今回はいらないだろうと思い。LANケーブル挿して 192.168.2.1 で設定。

以上から、LANケーブルのIPアドレスは分かるのだが、ssh ではラズパイ様にログインできない。

- 古いRasPi (Model A)に同じUSB-LANアダプタを挿して、LANケーブルを挿した場合、普通にできた。
- RasPi zero ではssh をしても timeout になる。仕方なく、TVにHDMIでつなぐと、なんと NOOBSでOSのインストールが促される。raspbian を選択し、かなり待たされるが、何とかインストール終了。再起動。GUIの画面が立ち上がったところで、フリーズ。キーボード、マウスは反応せず。終了。
- RasPi Model A のSDカードをRasPi zero の挿入したところ、HDMIにも出力なく。
- 新しいPCでSDカード/micro SDを読むことができないので、新しくFWを用意できない。ここで終了。2019/05/01 15:00

私はどうしたら良かったのだろう。そんなに悪いことをしたのか。
コマンドプロンプトの使い方　備忘録

#はじめに
2019年5月1日更新

#背景
職業訓練校に学んだことの復習と自分の備忘録を兼ねてまとめました。

-----------------------------------------------------
###コマンドプロンプトとは
win+R→cmdで出てくる黒い画面.......
ファイルの作成/削除/移動
ディレクトリの作成/削除/移動
をマウス操作ではなくコマンドラインですることができる。

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

以下
コマンド例：

```
C:\Users\Desktop\cmdsample>copy a.txt c.txt　
```
"a.txt"を"c.txt"というファイル名でコピー


```
C:\Users\Desktop\cmdsample>mkdir subd　
```
"subd"というディレクトリ名でディレクトリを作成

```
C:\Users\Desktop\cmdsample>move c.txt subd　
```
"c.txt"ファイルをsubdへ移動

```
C:\Users\Desktop\cmdsample>move a.txt a2.txt　
```

"a.txt"ファイルを"a2.txt"ファイルに名前変更

```
C:\Users\Desktop\cmdsample>del a2.txt　
```

ファイルの削除

```
C:\Users\Desktop\cmdsample>rmdir subd2　
```

ディレクトリの削除

```
C:\Users\Desktop\cmdsample>rmdir /s subd　
subd、よろしいですか (Y/N)? y
```

ディレクトリの再帰的削除(確認あり)

```
C:\Users\Desktop\cmdsample>rmdir /s /q subd
```
　ディレクトリの再帰的削除　(yes/no　確認なし)

-----------------------------------------------------
###バッチファイルとは

・コマンドをまとめて実行
・テキストファイル(文字で書かれたファイル)
・テキストエディタであれば何でもOK※但しshift-jisに限る
・コマンドプロンプトで出来ることは全て実行可能
・拡張子は、　.bat | .cmd

-----------------------------------------------------
**バッチファイル作成例：**

```
@echo off
rem ファイルを作成します。
echo this is file > a.txt
echo this is file > b.txt
echo this is file > c.txt
echo this is file > d.txt
echo this is file > e.txt
echo ファイルを作成しました。
pause
exit
```
中身に"this is file"と書かれた[a,b,c,d,e].txtを作成する。
※@ echo off(コマンドの実行内容を表示しない)
※pause(一時停止)
※exit(バッチファイルの終了)

```
@echo off
rem ファイルを削除するバッチファイルです。←コメント
del a.txt
del b.txt
del c.txt
del d.txt
del e.txt
echo ファイルを削除しました。
pause
exit /b
```
[a,b,c,d,e].txtを削除する。
※@ echo off(コマンドの実行内容を表示しない)
※pause(一時停止)
※exit /b(バッチファイルは、終了するがコマンドプロンプトの画面は消えない)

```
@echo off

set base=C:\Users\aaa\Desktop\test　←バックアップ元のファイルパス
set backup=D:\test　　　　　　　     ←バックアップ先のファイルパス

if exist %backup% goto DO           ←%backup%は%変数名%
#もしUSBにtestディレクトリ(backup=D:\test)が存在したら:DO以下の処理へ

if not exist %backup% goto DONOT    
#もしUSBにtestディレクトリ(backup=D:\test)が存在しなかったら:DONOT以下の処理へ

:DO　　　　　　　　　　　　　　　　　　　　　
rem USBがあった時
	echo USBが見つかりました。
	echo バックアップを開始します。
	robocopy %base% %backup% /mir
:goto END                            ←ENDへ

:DONOT
	rem USBがなかった時
	echo USBが見つかりません。
	echo バックアップを中止します。
:goto END                            ←ENDへ

:END
pause
exit /b
```
USBが接続されている時に、PCの指定ディレクトリ内(バックアップ元)からUSBの指定ディレクトリ(バックアップ先)へバックアップをする。

※@ echo off(コマンドの実行内容を表示しない)
※pause(一時停止)
※exit /b(バッチファイルは、終了するがコマンドプロンプトの画面は消えない)
プルダウンメニューの項目をDBのカラムから作成する方法

###やりたいこと
今回はUser TBLから、カラムdepが「sales」であるユーザーの名前を、
プルダウンメニューに追加する処理を実装する。

User TBL

|    id    |    name    |   dep    |
|:------------------:|:------------------:|:------------------:|
|        1        |        takanosuke        |        sales        |
|        2        |       kounosuke       |       sales       |
|        3        |        seinosuke        |        hr        |


###collection_selectを利用

```
<%= form_for @user do |f| %>
  <%= f.label :name %>
  <%= f.collection_select :name, User.where(dep: "sales"), :name, :name %>
<% end %>
```

###collection_selectの文法は以下の通り

```
<%= f.collection_select <属性名>, <プルダウンメニュー表示用の配列データ>, <valueとして扱うカラム名>,  <表示用のカラム名>, <オプション> %>
```
###viewでの表示は以下の通り
1.通常時
<img width="153" alt="スクリーンショット 2019-05-01 16.36.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324184/4e2c8624-556e-bdfc-5fd6-dd20603228eb.png">

2.プルダウンメニュークリック時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/324184/4cadc6ca-636a-cc11-3726-5e91c06a3ec5.png)


オプションについてはまだ今度で・・・


参照先：
https://qiita.com/colorrabbit/items/b58888506e41d1370fd1
openframeworks 0.10.1で、error: unable to attach DB 〜 がでた

私のメモです。

#環境
Xcode 10.1
openFrameworks 0.10.1

#出たエラー
error: unable to attach DB: error: accessing build database "/Applications/of_v0.10.1_osx_release/libs/openFrameworksCompiled/project/osx/../../lib/osx/build/debug/XCBuildData/build.db": database is locked Possibly there are two concurrent builds running in the same filesystem location.

1つのアプリケーションをビルドしたあと、もう1つのアプリケーションのビルドでこのエラーがでた。

#対処
Possibly there are two concurrent builds running in the same filesystem location.なので、どちらも起動しながらビルドできないっぽい。
開いてるやつを閉じて、開いてるのは1つのXcodeのプロジェクトファイルだけにする。
私はこれでなんとかなりました。
Qiime2 メタデータファイルの#q2:typesについて

# Qiime2 のメタデータで数値のみの列があるとき
Qiime2 でメタデータとして数値のみの列があるときにそのままdiverity analysis を実行するとエラーが出る．
qiime2019.1 バージョンで実行．

`Metadata column 'hogehoge' is numeric. Option --m-metadata-column expects the column to be categorical.`

"Moving Pictures" tutorial からメタデータをとってくると，

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222325/ef6b7572-7f5b-6e04-2c0b-263fdc0ffe3b.png)

のように`#q2:types`という行があった．
どうやら，これを自分のメタデータに追加すればいいっぽい．

この`#q2:types`のカテゴリをサンプルが文字のときは`categorical`に，数値のみのときは`numeric`にする．
Workers_of_the_world_unite.rb

```text:万国の労働者よ団結せよ
______________________________
________________Wo____________
__________rker__sOfT__________
________heWorl____dUni________
______te!Work______ersO______
____fTheWorl________dUnite____
__!WorkersOfT________heWo____
____rldU__nite!______Worker__
____________sOfThe______Worl__
______________dUnite__!Work__
________er______sOfTheWorl____
______dUnite______!Work______
__ersOfT__heWorldUnite!Wo____
__rker______sOfThe____Worl____
______________________________
```


```ruby:unite.rb
class Array
	def msg_fill(str)
		message = ""
		data = self.join("\n").split("")
		for i in 1..self.join("").length
			if message.length == 0
				message.concat(str.chomp)
			end
			if data[i-1] == "0"
				data[i-1] = message.slice!(0,2)
			end
		end
		return data.join("").gsub("1", "__")
	end
end

hammer_and_sickle = "1FFFFFDFFC9FF19FC39F0F1C0F3C8E3F8E7F88FB83E38F100E719FFFF".hex.to_s(2).scan(/.{15}/)
the_manifest = "WorkersOfTheWorldUnite!"
#the_manifest = "ПролетарииВсехСтран,Соединяйтесь!"

puts hammer_and_sickle.msg_fill(the_manifest)
```

## 解説
以前投稿した[Пролетарии всех стран, соединяйтесь!](https://qiita.com/YuukiToriyama/items/12a77934406385e76a5d)の応用です。`Array#msg_fill()`というメソッドを定義して鎌と鎚(☭)のAAのなかに文字列を埋め込めるようにしました。

### AAはどのように作ってあるの？
```ruby
"1FFFFFDFFC9FF19FC39F0F1C0F3C8E3F8E7F88FB83E38F100E719FFFF".hex.to_s(2).scan(/.{15}/)
```
最終行付近にあるこのコードを実行してみると、次のような結果が得られます。

```text
111111111111111
111111110111111
111110010011111
111100011001111
111000011100111
110000111100011
100000011110011
110010001110001
111111000111001
111111100010001
111101110000011
111000111000111
100010000000011
100111000110011
111111111111111
```

0,1で絵を描いたものをソースコードにそのまま書いてもいいんですが、それではおもしろくないので、0,1の絵から改行を取って一行にして、二進数とみなし、更にそれを16進数に変換したものを保存してあります。

### msg_fill()の使い方
上で述べたような0,1で描いた絵の各行を格納した配列に、`msg_fill()`メソッドをあてると、引数で指定したメッセージをAAの0の部分に埋め込むことができます。好きなメッセージを埋め込んでみてください！
Windows10 Pro Hyper-V で Ubuntu18.04 + CUDA10.1 をインストールしたけどGPUが認識しない話。

# 背景
ついに Sandy Bridge おじさんを卒業しました。
PC を一新したので、とりあえず CUDA 環境作りたいな？と思いました。

旧 PC では GeForce GTX560Ti とかいう化石 GPU で CUDA を触っていましたが、新 PC は GeForce RTX2070 なので、色々とどれくらい早くなるのか試してみたい。

旧 PC では Windows7 と Ubuntu14.04 LTS のデュアルブートで、CUDA は Ubuntu 上で使用していました。
ただ、資料作成とかは Windows 側でするので、開発と資料作成でブート切り替えるのは非常に面倒でした。

というわけで、今回は Ubuntu の仮想環境上に CUDA 環境を構築しようと思いました。
あと、個人的な印象ですが CUDA 環境インストールって失敗しやすくて面倒なイメージが強いんですよね。
何かと失敗するだろうなと言う意味でも、仮想環境が良いかなって思った次第です。

ところで、仮想環境で GPU って認識するんですか？って話ですが、結果的に認識しませんでした。
詰みです。

# 実験
Windows10 Pro を買ったので標準で搭載されている Hyper-V 使いました。

- Ubuntu 18.04 LTS 
    - Hyper-V のクイックインストールで入るやつ
- CUDA 10.1 
    - 公式のインストール方法をそのまま

これだけです。

# 結果・考察
正直、lspci コマンドで確認したときから気づいてましたが、Hyper-V では GPU 認識しないっぽいです。
詰みです。
Hyper-V が無理っていうより、DDA ( Discreate Device Assignment ) っていう機能が Hyper-V にはあって、DDA が使えれば GPU を仮想環境から認識できるみたいですが、現状それが使えるのは Windows Server 2016 (今は 2019 も？) くらいみたいです。

以下、参考ページです。
[Hyper-V上のUbuntuでCUDAを導入する Windows 10ではだめでした。。。]
(https://qiita.com/Masutani/items/4309e6f9ca0141a08471)
["Which graphics virtualization technology is right for you?"]
(https://docs.microsoft.com/en-us/windows-server/remote/remote-desktop-services/rds-graphics-virtualization)

ちなみに今流行りの docker とかならいけるか？と思って調べましたが、ホストOSが Windows だと駄目っぽい。
[【TensorFlow】Docker for Windowsで動かす機械学習！](https://www.sejuku.net/blog/55941)

# その他・知見
CUDA のインストール自体はすんなり行きました。
機械学習で GPGPU が一般的になってパッケージも整理されたのでしょうか。助かります。
HDD 割当容量が足りなくて一回インストール中にディスクフルになったのは内緒です。

直接は関係無いですが、CUDA の主な使用目的として python で tensorflow を使おうと思っていました。
ただ、tensorflow(>=1.13.0)は、CUDA10.0しか対応してないみたいです。
import しようとしたら CUDA のライブラリが無いぞ！！ってキレられました。
何かやりようはありそうですが、そもそも GPU 認識してないのでここで終了です。

# 今後の予定
仮想環境は詰み、またデュアルブートは嫌ということで、今回の PC では Windows 環境で CUDA 開発環境を整えようと思います。

Windows10 だと WSL (Windows Subsystem for Linux) なんていう機能が標準であるみたい。
Windows で ubuntu のコマンドが使えたり（というかほぼ ubuntu ）と、mingw や sygwin, msys が不要な環境を作れるかも？
[【WSL入門】第1回　Windows 10標準Linux環境WSLを始めよう](https://www.atmarkit.co.jp/ait/articles/1903/18/news031.html)

WSLでも、GPU などの ハードウェアはやはり認識しないようですが、WSLはwindows バイナリも動かせるということで、CUDA 対応した python コードを動かせるそうです。
[えるしってるか WSLではwindowsのバイナリを実行できる](https://sekailab.com/wp/2019/03/10/execute-windows-binary-on-wsl/)

というわけで、次は windows10 に CUDA をインストールからの WSL 環境構築かなぁ…
WSL+LxRunOfflineでシステムドライブ外に環境構築

WSLの環境を壊してしまったときに実施するけど、よく忘れるのでメモ

前提として、

* Windows 10(Homeでも可)
* WSLは有効化済みとする

# 何がしたいか

WSLは便利だけど、システムドライブにインストールされるので、容量が肥大化したとき辛い。  
外部ドライブに独自のWSLボリュームを作って有効化させたい。

# [LxRunOffline](https://github.com/DDoSolitary/LxRunOffline)

独自のWSLボリュームを生成することができる。

## インストール

Chocolateyがインストールされていれば、
`$ choco install lxrunoffline`
なければ[Releaseページ](https://github.com/DDoSolitary/LxRunOffline/releases)からダウンロードする。

## Linuxイメージのダウンロード

`https://lxrunoffline.apphb.com/download/{distro}/{version}`にアクセスし、Linuxイメージをダウンロードする。
種類としては、[Wikiページ](https://github.com/DDoSolitary/LxRunOffline/wiki)にリストされているので、{distro}、{version}を選ぶ。  
Ubuntu 18.04の場合、`distro⁼Ubuntu`、`version=bionic`としてダウンロードできる。

## 独自ボリューム生成

`$ LxRunOffline i -n Ubuntu -d D:\wsl -f ubuntu-bionic-core-cloudimg-amd64-root.tar.gz`

とする。

* nオプション(Ubuntu)は作成するボリューム名
* dオプション(D:\wsl)はボリュームの生成先
* fオプション(ubuntu-bionic-core-cloudimg-amd64-root.tar.gz)はダウンロードしたLinuxイメージファイル

である。

## 作成したWSLボリュームの有効化

WSLでは、UbuntuやFedora等、複数の環境をインストールできるようにするため、既定のボリュームを変更できるようになっている。
`wslconfig /list`でWSLボリュームの一覧を見ることができる。  
`wslconfig /setdefault <ボリューム名>`とすると、既定のボリュームを変更することができる。

## 作成したWSLボリュームの起動

既定のボリュームに指定した後は、`wsl`コマンドで起動することが可能。

# 初期起動時にやること

## ユーザ作成

作成した直後は、ユーザはrootのみで、このまま使うのは危険なので、下記コマンドを実行してユーザを作成する。

```
$ apt update
$ apt upgrade
$ apt install sudo vim-tiny
$ adduser <ユーザ名>
$ gpasswd -a <ユーザ名> sudo
```

ユーザ追加以外に、`sudo`をインストールし追加したユーザにsudo権限を付けるところまでやっている。

## ログインユーザの設定

WSLを起動したとき、デフォルトだと`root`で入ってしまうので、ログインユーザを変更する。

WSL上で、

```
$ login <ユーザ名>
$ id
```

を実行し、作成したユーザのuidを覚えておく。

続いて、いったんWSLを終了しコマンドプロンプト上で、

```
> LxRunOffline su -n Ubuntu -v <UID>
```

を実行することで、ログイン時のuidを指定できる。

## Hyperの設定

[Hyper](https://hyper.is/)はターミナルエミュレータで、Windows上でもそれっぽい操作ができる。
chocolateyでも`choco install hyper`でインストールできる。

インストール後はコマンドプロンプトが綺麗になるだけなので、デフォルトでWSLが開くように設定する。  
Hyper起動中に`Ctrl+,`を押すと、.hyper.jsという設定ファイルが開くので、`shell`に関する項目を以下のように書き換える。

```
shell: 'C:\Windows\System32\\wsl.exe',
shellArgs: ['~'],
```

これで、Hyperを起動するだけでWSLが立ち上がる。

# ボリュームを削除する

やらかして環境を壊してしまったときは、
`LxRunOffline ui -n Ubuntu`でボリュームを削除することができる。  
同じように作り直せばOK。
Clang x VSCode を Docker 上に構築 (1)

C/C++ の開発環境も Docker で整えてしまうと楽です。今回の記事では、VSCodeもDockerに含めてみました。開発環境をまるごとDockerで管理できるので、管理がしやすいのでオススメです。

サーバーサイド向けや学習用の環境を作る場合など、差異が無くなるのが良いですね。


# 登場人物
### Dockerとは
Linux上でコンテナーでアプリを動作させる環境です。アプリケーションとライブラリーを同一のコンテナーで固めて、使い回すことができます。
https://ja.wikipedia.org/wiki/Docker

### VSCode
https://ja.wikipedia.org/wiki/Visual_Studio_Code
Microsoft製のEditorです。Dart Pluginを入れると、補間機能などが使えて便利です。

### Code-Server
VSCodeをWebサービスとして動作させることができる凄いやつです。
https://github.com/cdr/code-server


# 環境を作ってみる

https://github.com/kyorohiro/clang-code-server

### (1) dockerfile を書く

```dockerfile
FROM ubuntu:18.04

RUN apt-get update
RUN apt-get install -y curl wget gnupg less lsof net-tools git apt-utils -y

# WORKDIR
RUN mkdir /works
WORKDIR /works

# C
RUN apt-get install build-essential -y
RUN apt-get install libboost-all-dev -y

#
# CODE-SERVER
RUN wget https://github.com/cdr/code-server/releases/download/1.939-vsc1.33.1/code-server1.939-vsc1.33.1-linux-x64.tar.gz
RUN tar xzf code-server1.939-vsc1.33.1-linux-x64.tar.gz -C ./ --strip-components 1



```

### (2) docker image を走らせる
 
```
docker build -t clang_vscode .
docker run -p 8443:8443 -p 8080:8080 -it clang_vscode bash

# docker の中で
mkdir /works/w
/works/code-server /works/w --allow-http --no-auth
```

### (3) and 'http://127.0.0.1:8443/' を ブラウザーで開く

![root_page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/8aefed41-e82e-ef99-6fa6-70ce03dc957e.jpeg)

# c/c++ plugin をインストール

https://code.visualstudio.com/docs/languages/cpp


# 試しに何か作ってみる

### (0) Write Code

```hello.cpp
#include<stdio.h>

int main(int argc, char** argv) {
    printf("Hello, World!!");
    return 0;
}
```

### (1) Terminal -> New Terminal on VSCODE

### (2) Terminal 上で以下を入力

```
root@59757234cc79:/works/w# g++ hello.cpp
root@59757234cc79:/works/w# ./a.out 
Hello, World!!root@59757234cc79:/works/w# 
```


![run_page.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54192/5c79217f-0cc0-a80d-062d-65206be2838d.jpeg)



以上です。

Code-Serverがとても便利でしたね。
https://github.com/cdr/code-server

終わり。

今回のコードは以下にまとめました。
https://github.com/kyorohiro/clang-code-server


# PS

[a] 再開したい場合

```
$ docker ps -a
check id and
$ docker start < id > 
$ docker exec -it < id > bash
```

[b] 設定を変更したい場合
$ docker commit < id > clang_vscode_xxx
$ docker run -p 8443:8443 -p 8080:8080 -it clang_vscode_xxx bash

[c] マウント
$ docker run -p 8443:8443 -p 8080:8080 -v /Users/kyorohiro/w/dart/xxx:/works/w -it clang_vscode bash
今年の言語はRust その４５

# 今年の言語はRust その４５

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 15 スマートポインタ

### 15.4 Rcは参照カウント方式のスマートポインタ


複数の参照を持つ実装について学びます

__Rc<T>__ (reference counting)


まずはRcを使わず、これまで習った知識だけでやってみます。（もちろんエラーです)

```rust
enum List {
    Cons(i32, Box<List>),
    Nil,
}

use List::{Cons, Nil};

fn main() {
    let a = Cons(5, Box::new(
                        Cons(
                            10,
                            Box::new(Nil)
                            )
                        )
    );

    let b = Cons(3, Box::new(a));
    let c = Cons(4, Box::new(a));
}
```

```bash
error[E0382]: use of moved value: `a`
  --> src/main.rs:13:30
   |
12 |     let b = Cons(3, Box::new(a));
   |                              - value moved here
13 |     let c = Cons(4, Box::new(a));
   |                              ^ value used here after move
   |
   = note: move occurs because `a` has type `List`, which does not implement
   the `Copy` trait
```

そのために__Rc__があるのです

```rust
enum List {
    Cons(i32, Rc<List>),
    Nil,
}

use List::{Cons, Nil};
use std::rc::Rc;

fn main() {
    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));

    let b = Cons(3, Rc::clone(&a));
    let c = Cons(4, Rc::clone(&a));
}
```

#### Rc<T>をクローンすると、参照カウントが増える


```rust
fn main() {

    let a = Rc::new(Cons(5, Rc::new(Cons(10, Rc::new(Nil)))));

    println!("count after creating a={:?}", Rc::strong_count(&a));

    let b = Cons(3, Rc::clone(&a));

    println!("count after creating a={:?}", Rc::strong_count(&a));

    {
        let c = Cons(4, Rc::clone(&a));
        println!("count after creating a={:?}", Rc::strong_count(&a));
    }

    // println!("count after creating a={:?}", Rc::strong_count(&a));
    println!("count after c goes out of scope = {}", Rc::strong_count(&a));

}

```

```bash
count after creating a=1
count after creating a=2
count after creating a=3
count after c goes out of scope = 2
```

複数の参照を実装できているのがわかります。



イエス！
railsでmeta-tagsを使ってSEOフレンドリーなサイトを目指す

# 概要

SEO目的でmetatagsを使う。下記が目的。

* SEO的にはmetatag関連（特にtitle）がユニークであることが重要なのでページごとの管理をしやすくしたい
* SEOに関連するタグを管理、更新しやすくしたい

# meta-tagsの導入

```ruby:gemfile
gem 'meta-tags'
```

```
bundle install
```

# helperにdefaultを設定

```ruby:app/helpers/application_helper.rb
module ApplicationHelper
  def default_meta_tags
    {
      title: "title",
      description: "description",
      keywords: "",
      noindex: ! Rails.env.production?,
      canonical: request.original_url,
      charset: "UTF-8",
      og: {
        title: :title, 
        description: "description",
        type: "website",
        url: request.original_url,
        image: "",
        site_name: "",
        locale: "ja_JP"
      },
      twitter: {
        site: '@ツイッターのアカウント名',
        card: 'summary',
        image: ""
    },
      fb: {
        app_id: ''
      }
    }
  end
end
```
# viewへの設定

```ruby:app/views/layouts/application.html.rb
<%= display_meta_tags(default_meta_tags) %>
```

# 設定ファイルの作成

```
bundle exec rails generate meta_tags:install
```

上記コマンドで設定ファイルを作成し、rails sで読込し直す。

# 各ページで出し分けをしたい場合

```ruby:view
<% set_meta_tags title: "#{@post.title}" %>
```
Android StudioのエミュレータでCapacitorアプリが立ち上がらないときの対処法

## 概要

CapacitorでビルドしたアプリをAndroid Studioのエミュレータで起動させようとしたときに、以下エラーに遭遇

> /dev/kvm device permission denied

## 環境

Ubuntu 18.04.2 LTS
Android Studio 3.4

以下手順で解決

```bash
> cd /dev
> sudo chmod -R 777 kvm 
```

## 参考リンク
- https://stackoverflow.com/questions/37300811/android-studio-dev-kvm-device-permission-denied
- https://www.youtube.com/watch?v=-ZKNmJFTOAk
WordPressで実行するクエリ(SQL)に手を加えたい場合の手法について

# やりたいこと
have_posts() ループの中で the_post() で投稿を取得する際のSQLで LIMIT を指定しないようにしたい

# 実現方法
have_posts() ループを実行する前に、query_posts() 関数を呼び出してクエリを改変する。

# サンプルコード
```php
<?php
	// 投稿数の制限を解除する
	$args = array(
		'post_type' => 'products',
		'fields' => 'ids',
		'posts_per_page' => -1
	);
	query_posts( $args );
	// 実行するSQLを確認しながらパラメータを調整する
	// global $wp_query;
	// var_dump( $wp_query );
	if (have_posts()) :
		while (have_posts()) : the_post();
			echo '<li>';
			the_title();
			echo '</li>';
		endwhile; 
	else:
		// 何も取得されなかった
	endif;
 ?>
```

# 参考URL
[テンプレートタグ/query posts](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts)
[posts_per_pageで全件表示](http://shinimae.hatenablog.com/entry/2015/12/10/152702)
[関数リファレンス/WP Query](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#.E3.82.BD.E3.83.BC.E3.82.B9.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB)
[wp-includes/query.php](https://core.trac.wordpress.org/browser/tags/5.0.3/src/wp-includes/query.php)
自分用のpocketアクセストークンを発行する

この記事では一切コードを書いていません！

いろんな記事を見ながら、pocketのアクセストークンを発行したので、そのメモです。

結果的に僕がやりたかったのは、コードをゴリゴリ書く必要があったのですが、
コードいらずでアクセストークンを取得したい方は参考になると思います。

# 1. pocketに会員登録！

僕はすでに会員登録していますが、万が一会員登録してない人はしてください！

# 2. アプリケーションの登録

こちらから、アプリケーションを登録してください。

[pocketのアプリケーション登録ページ](http://getpocket.com/developer/apps/)

`Application Name`には自分で作っているアプリ名
`Application Description`には、自分で作っているアプリの概要
`Permissions`は`Add`は「ポケットへの記事の追加権限」、Modifyは「ストックしている記事の情報を変更する権限」、Retrieveは「ストックしている記事の読み取り権限」を表します。
`Platform`は、自分のサービスを公開するプラットフォームを選択してください。


全部完了したら、`Comsumer Key`がゲットできます！！

# 3. リクエストトークンの取得

コンシューマーキーをゲットしたら、次はリクエストトークンをゲットします（カタカナ多い...）

POSTリクエストを簡単に行うために、google chromeの拡張機能を入れましょうーーー！！

[Advanced REST client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo?hl=ja)をインストールしてください！

そして、必要な情報を入れていきます！

1. Methodを「POST」にする
2. Request URLを「https://getpocket.com/v3/oauth/request」にする
3. Headersを、「Content-Type」の「application/x-www-form-urlencoded」にする

(既に200OKが出ているのは無視してください。)
![スクリーンショット 2019-05-01 10.22.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/6e55b200-20cc-9bc5-5d5f-9a833ef409a7.png)

4. Bodyに「consumer_key」と「redirect_uri」をそれぞれ入れてください
5. 右上のSENDボタンを押してください

![スクリーンショット 2019-05-01 10.22.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/9fafcffc-4ff7-8e8d-210a-66e4d4d6495b.png)

すると、下のオレンジで線をしている部分に、`リクエストトークン`が出現します！メモしてくださいね！！

リクエストトークンは`code=******************`という形になっているはずです。


# 認証する

`https://getpocket.com/auth/authorize?request_token=先ほど取得したリクエストトークン&redirect_uri=リダイレクトURL`

このURLにアクセスしてください！

そしたら、認証ができます。

# アクセストークンをゲットする

もう一度POSTリクエストを行うので、`Advanced REST client`を開いてください！

1. Requrst URLを「https://getpocket.com/v3/oauth/authorize」にする
2. Bodyに`consumer_key`と`code`をそれぞれ入れる（codeは先ほどのリクエストトークンです。）
3. 右上の「SEND」ボタンを押す
4. 下のオレンジの線のところに、アクセストークンとユーザー名が表示されます！



![スクリーンショット 2019-05-01 10.31.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/b7382361-e309-64e6-6214-e1b5a69501be.png)
【CraftCMS】金額のFormatで半角の「¥」を出力したい

数値フィールドを半角の¥でフォーマットしたいけどなぜだか全角の￥が表示されてしまう。

```twig
{{entry.money|currency("JPY")}} {# コレ全角→￥100 #}
```

currencyを定義しているソースをホジホジしてみると
currencySymbolsの定義が全角になってた。

```php:craft/vendor/craftcms/cms/src/config/locales/ja.php
    'currencySymbols' => [
        ・・・
        'JPY' => '￥', //74行目くらい
        ・・・
    ];
```
ここはコアモジュールなのでイジったところでCMSアップデートが走ると元に戻ってしまうので
どうしたもんかなーと中の人にたずねてみたら

> 一番ラクなのはreplaceのFilterを使うことだぜ！

という返事を貰ったので
こうしたらまぁ解決したけどちょっと見づらいからtranslationsとかで設定出来たらなぁ…なんて。

```twig
{{entry.money|currency("JPY")|replace({"￥":"¥"})}}
```
今年の言語はRust その４４

# 今年の言語はRust その４４

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 15 スマートポインタ

### 15.3 Dropトレイトにより、片付け時にコードを走らせる

なんとく流れがつかめてきたぞ。おそらくC#でいうところのDisposeインターフェイスのことか？

```rust
struct CustomSmartPointer {
    data: String,
}

impl Drop for CustomSmartPointer {
    fn drop(&mut self){
        println!("Dropping CustomSmartPointer with data '{}'!", self.data);
    }
}

fn main() {
    let c = CustomSmartPointer{data: String::from("my stuff")};
    let d = CustomSmartPointer{data: String::from("other stuff")};

    println!("CustomSmartPointers Created.");

}
```

実行結果は

```bash
$ cargo run
  
CustomSmartPointers Created.
Dropping CustomSmartPointer with data 'other stuff'!
Dropping CustomSmartPointer with data 'my stuff'!
```

変数の生成順序と__逆__の順番でdropされているのがわかりますね。


#### std::mem::dropで早期に値をドロップする

__drop関数__ を使用することで、意図的にDropすることができます

```rust
fn main() {
    let c = CustomSmartPointer{data: String::from("some data")};

    println!("CustomSmartPointer created");

    // c.drop(); <= デストラクタは自分では呼び出せない
    drop(c);

    println!("CustomSmartPointer dropped before the end of main.");
}

--
CustomSmartPointer created
Dropping CustomSmartPointer with data 'some data'!
CustomSmartPointer dropped before the end of main.
```

メモリ解放!

イエス！
[Rails] [devise] ActiveStorage使用時にupdateで「ActiveRecord::RecordNotSaved - Failed to save the new associated preference」が発生するとき

# 問題
ログイン機能に`devise`を使用しており、`User`にActiveRecordで画像を添付して新規登録・編集できるような実装を行いました。
すると、`registrations#update（編集）`の際に

`ActiveRecord::RecordNotSaved - Failed to save the new associated preference`

が発生してしまいました。

以下そのときの対処を書きます。


# 対処
まずdeviseの`registrations#update`は以下となります。

```ruby:devise/registrations_controller
  def update
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

    resource_updated = update_resource(resource, account_update_params)
    yield resource if block_given?

    （以下略）

  end
```


`Railsガイド`によると、既存のUserに画像を添付する際は`user.image.attachをしなければいけない`とのことなので、
その操作を以下のようにはさみました。（users/registrations_controllerでオーバライドしてます）
以下のコメント部分です。

```ruby:users/registrations_controller
  def update
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

    resource_updated = update_resource(resource, account_update_params)
#   resource.image.attach(account_update_params[:image])
    yield resource if block_given?

    （以下略）

  end
```


すると、`ActiveRecord::RecordNotSaved - Failed to save the new associated preference`が発生してしまいました。


# 解決方法

理由は単純で、`resource_updated`でupdateした後に`attach`していたので、
`resource_updated`と`attach`の順番を変えたらエラーが出なくなりました。

```ruby:devise/registrations_controller
  def update
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key)
    prev_unconfirmed_email = resource.unconfirmed_email if resource.respond_to?(:unconfirmed_email)

#   順番を変えた
    resource.image.attach(account_update_params[:image])
    resource_updated = update_resource(resource, account_update_params)

    yield resource if block_given?

    （以下略）

  end
```


<br>

おわり