OmniAICreator/Qiita-1.07M huggingface dataset:
ABC141参戦記(A問題~D問題+E問題)

先日行われたABC141に参加したのでコンテスト中のあれこれをメモしておこうかと思います。使用言語はpython3、結果はABCD4完で1295位(順位表情報)でした。コンテストへのリンクはこちら→https://atcoder.jp/contests/abc141

#A - Weather Prediction
入力がSunnyならCloudyを、CloudyならRainyを、RainyならSunnyを出力すれば良いですね。

```python:ABC141_A.py
S = str(input())
if S == "Sunny":
    print("Cloudy")
elif S == "Cloudy":
    print("Rainy")
else:
    print("Sunny")
```

#B - Tap Dance
２つの文字列RUDとLUDを作っておいて偶数奇数のそれぞれについてこの文字列内の文字が含まれているか調べる...とやったのですが制約的にR,Lについてだけ考えれば十分でしたね...

```python:ABC141_B.py
S = str(input())
odd = "RUD"
even = "LUD"
frag = True
for i in range(len(S)):
    if i%2 == 0 and S[i] not in odd:
        frag = False
        break
    elif i%2 != 0 and S[i] not in even:
        frag = False
if frag:
    print("Yes")
else:
    print("No")
```

#C - Attack Survival
各参加者について何問正解したか数えておけば、最終的なポイントは$N-Q+正解数$で表せるので、これと0との大小を比較していけば良さそうです

 ```python:ABC141_C.py
N, K, Q = map(int, input().split())
l = [0 for i in range(N)]
for i in range(Q):
    A = int(input()) - 1
    l[A] += 1
for i in range(N):
    if K - (Q - l[i]) > 0:
        print("Yes")
    else:
        print("No")
```

#D - Powerful Discount Tickets
一番高いものを取り出して半額にして戻すをチケットの枚数だけ繰り返します。pythonだとheapqを使って実装するのが簡単かなと思いました。ABC137-Dの復習をしっかりしておいて良かった...heapqは最小値を取り出すので入れるときに$-1$を掛けてから入れます。また、割り算して切り捨てるという操作のところで誤差が出るので$2$で割る前に$-1$を掛けて元の値に戻してから計算し、その後また$-1$を掛けてからheapqに戻します。
![A8E3EE6F-8E9A-4CE2-93F9-F89878E6F898.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478399/7ff62dc6-9560-7341-dd6f-79d4183cd7b8.jpeg)



```python:ABC141_D.py
import heapq
N, M = map(int, input().split())
A = list(map(int, input().split()))
B = []
for i in range(N):
    heapq.heappush(B,-A[i])

for i in range(M):
    x = -heapq.heappop(B)
    if x == 0:
      break
    x = x//2
    heapq.heappush(B,-x)

print(-sum(B))
```

#E - Who Says a Pun?
本番では全く計算量の落とし方が分からず、TLEしてしまいました。[解説動画](https://youtu.be/fHZhDUzhzN0)を見てDP解法で書いてみたところ通りました（どうやらpythonだと通らずpypyなら通るようです）。

```python:ABC141_E.py
N = int(input())
S = str(input())
dp = [[0 for i in range(N+1)] for i in range(N+1)]

for i in reversed(range(N)):
    for j in reversed(range(N)):
        if S[i] == S[j]:
            dp[i][j] = dp[i+1][j+1] + 1
ans = 0
for i in range(N):
    for j in range(N):
        if j > i:
            tmp = min(j-i,dp[i][j])
            ans = max(tmp,ans)
print(ans)
```

#反省
今回はD問題まで通すことができました。時間配分は大体A-2分半、B-4分、C-6分、D-17分という感じでした。DPに気付ければE解けたのかなぁと思うとDPの経験をもっと積まなくちゃなとなります。
Qiita記事更新していきます！

アウトプットの量を増やすために、意識的に記事を投稿していきます！
宣言したので、記事投稿スタートです（笑）
誰かのつまづきの助けになれる記事が書けるように頑張ります:muscle_tone1:

# 記事の投稿内容
1. 自分のつまづきポイントを、とにかく発信していきます。
2. まずは、今月のContribution 100 を目指します！

![641f7af57248b355c4d2581662fa528f-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233118/227ea24c-dad7-338b-601a-80b1cb2847f5.jpeg)


# これから意識すること
1. 外部登壇を意識
2. 外部の勉強会に参加
3. githubの草を生やす〜

# 早速宣伝
明日サポータズさんで登壇します！
iOS周りの話をします！
https://supporterzcolab.com/event/943/

# スケジュール
2019/09/19：https://supporterzcolab.com/event/943/
2019/09/20：https://www.facebook.com/events/684294802071829/

# 一言
これからよろしくお願いします:wave_tone1:
コードを書いて出会ったエラー達

スキマ時間に書いた基本的なオブジェクト指向の構文。書いてる途中でエラーが出てきて、以前からエラーをまとめておきたいと思っていたのでこの機会に投稿する。
今回出てきたエラーは２箇所。


前提として
・一つ一つの単語をググって、自分なりにエラーの原因の予想を立てて答えを見ました。
・ググっても分からなかったら自分なりに答えを出しました。



①syntax error, unexpected

```
<?php 

class Human {

  public name; //エラー発生
  
}
 ?>
```
予想
・syntaxを訳すと"構文"、unexpectedは予想外なので、予想外の命令(構文)が来たので動作ができなかったよというログ。

回答
文法エラーです。入力ミスをチェックしてくださいとの報告
上記のコードのプロパディ名に$nameとされなかった為に発生した。これを見てプロパディ名を書き換えたらエラーが無くなった。 


②Fatal error: Uncaught Error: Class 'Hahakigi' not found in 

```
  public function __construct($name,$age,$gender,$hobby){
    $this->name = $name;
    $this->age = $age;
    $this->gender = $gender;
    $this->hobby = $hobby;
  }
}

$hahakigi = new Hahakigi('帚木日向子','24','女性','B級グルメ巡り');//エラー
発生
```

予想
・Fatal errorは処理を停止させるぐらい深刻なエラー、uncaughtは捕まえられない、このエラーはインスタンスの定義でクラス名が特定出来ませんでした。

・又はインスタンス生成に不明なエラーが出て処理を停止しました。



回答
調べても腑に落ちる答えが見つからなかったのでインスタンスの定義を見直してみた。以前自分が纏めたノートを参考に、newの後にメインクラスのHumanに書き換えたらエラーが収まった。
これも予想になるがインスタンスの生成でメインクラス(設計図)が特定できなかったから起きたエラーだと思う。


最後に
自分の解釈に自信が全くないので今度メンターさんに質問しようと思った。今回投稿してみてエラーの備忘録を残すことがそのままアウトプットに繋がることを意識させられたのでこれからもエラーを見つけてはまとめて投稿したいと思う。
既存のAmazon ECS クラスタのContainer Insightsを有効にする


Amazon ECSのAccount Setting で CloudWatch Container Insights のチェックを入れても、既存のクラスタではContainer Insightsが有効にならないので、Clusterを更新する必要がある。

チェックを入れた後、新規で作成したクラスタでは有効になる。


# AWSCLI
```sh
aws ecs update-cluster-settings --cluster <cluster name> --settings name=containerInsights,value=enabled
```
Maixduinoであそぶ (直線要素抽出など)

公式に動画が上がっていて
https://maixpy.sipeed.com/en/others/what_maix_do.html

その中でこの動画をみました
https://www.youtube.com/watch?time_continue=124&v=fpJZIisYKao

ここの動画で紹介されているプログラムはここにありました
https://github.com/AIWintermuteAI/maixpy-openmv-demos


画像はカメラに映った直線を判別するモードを実行した時のものです
![スクリーンショット 2019-09-18 14.47.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/c454d46a-fec5-cf57-3736-9f40a2fca611.png)

注意点としては、変数Vにメモリーカードを使用するものが書かれているのでメモリーカードを入れずに実行するとエラーが吐かれます
変数Vに関して全てコメントアウト or 削除するとメモリーカードなしに使用ができました

それと、30秒でプログラムが停止されるようになっています。

find_linesというライブラリ(?)を使用して判別させることができるようで、thresholdで直線かどうかを判別する閾値を調節できるよう。
theta_marginとかはいまいちわからなかったですが、周りの線と直交するようになっている感じなような




いろんな判別モードが用意されているようで、表示されているものの画面上の位置とかわかると面白そうかと思いました
EC2インスタンス起動のトラブルシュート

EC2インスタンス起動のトラブルシュート、メモ


##1.インスタンス制限の超過(InstanceLimitExceeded)##

**説明**
InstanceLimitExceeded

**原因**
リージョンで起動できるインスタンス数の制限に達しています。

**理由**
EC2ダッシュボードの「制限」から確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/e8f56570-6d3e-a4ce-8789-ec041c234485.png)


##2.インスタンス容量の不足(InsufficientInstanceCapacit)##

**説明**
InsufficientInstanceCapacit

**原因**
現在 AWS にはリクエストに対応するために必要とされる十分なオンデマンドキャパシティーがありません。

##3.インスタンスがすぐに削除される##

**説明**
インスタンスの状態が、再起動直後に pending から terminated に変わる。

**原因**

- EBS ボリューム制限に達した。
- EBS スナップショットが破損している。
- ルート EBS ボリュームは暗号化されていて、復号用の KMS キーにアクセスする権限がない。
- インスタンスを起動するために使用した Instance Store-Backed AMI で、必要な部分 (image.part.xx ファイル)。

**理由**
「説明」の「状態遷移の理由」から確認することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a839f879-8a4f-4c4a-6c7b-64d30a30d7ca.png)


---
[インスタンスの起動に関する問題のトラブルシューティング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/troubleshooting-launch.html)
Ubuntu 18.04 (LTS)のemacs26でuim.elをつかう

# 注意書き
emacs26でuim.elを使うと``C-x``が無効になるバグがある。uimのgithub (https://github.com/uim/uim/tree/master/emacs) では対応済みだが、Ubuntu 18.04のレポジトリにあるuim-elでは対応されていない。
# 環境
Ubuntu 18.04
Emacs 26 (PPAからインストール)
uim-el (Ubuntu提供)
straight.el

# 解1
uim.elをローカルの``~/.emacs.d``にclone(正確にはpull)することにした。

しかし、そのまま``git clone``すると``github.com/uim/uim.git``のディレクトリやファイル全てがcloneされるので不要なファイルがたくさん入ってしまう。そこで、特定のディレクトリだけpullすることにした。

## 特定のディレクトリのみgitでpullする
[git sparse checkout で clone せずに一部のサブディレクトリだけを pull/checkout する](https://mseeeen.msen.jp/git-sparse-checkout/)を参考にした。emacsのパッケージ管理にstraight.elを使っているので、straightでローカルリポジトリを参照することもしている。

```bash:
cd ~/.emacs.d/straight/repo
mkdir uim
cd uim
git init
git config core.sparsecheckout true
git remote add origin https://github.com/uim/uim.git
echo /emacs > .git/info/sparse-checkout
git pull origin master
```

これで``uim/emacs``以下にuim.el関連のファイルがpullされる。

## init.elの記述
straightをつかってこのレポジトリを参照してほしいので、``init.el``を書く

```lisp:init.el
(straight-use-package '(uim :local-repo "uim/emacs"))
```

これ以下にuimの設定を書いていく。これでstraightがバイトコンパイルもしてくれるので嬉しい。
なお、``uim-lang-code-alist``でエラーを吐くので、以下をコメントアウト

```lisp:init.el
;;以下をコメントアウト
(setq uim-lang-code-alist
     (cons '("Japanese" "Japanese" utf-8 "UTF-8")
           (delete (assoc "Japanese" uim-lang-code-alist) 
                    uim-lang-code-alist)))
```
uim.elの解説を読んでいればわかるが、uimの文字コードをデフォルトの``euc-jp``から``UTF-8``にするlispである。これで不具合がでるかどうかはまだわからない。

## 注意
Ubuntuの``uim-el``はアンインストールしない。そうしないとemacs起動時に``uim-version``がないと怒られる。なんだか中途半端だが、とりあえずこれで問題は解決した。

これでいいのだろうか？もっと賢い方法があるような気がする。

---
追記: 2019.09.25
これはgithubのuim.elまわりのファイルををちゃんとコンパイルしてないからとても中途半端になり、uim-elを消せない。``~/.emacs.d/``以下に置いたlispファイルを無理矢理読ませて必要なところだけ解決する悪いやり方。uim.elのバグを解決したバージョンはuim-1.8.7だが、Ubuntu 18.04で提供しているバージョンが1.8.6なのが問題。

対応は以下。

# 解2
githubの更新履歴を見ていると、キーバインドのバグは``uim-keymap.el``の改善で解決されている。なので、このファイルだけ更新する手がある。Ubuntuでuim-elをインストールしていると、``/usr/share/emacs26/site-lisp/uim-el/``にバイトコンパイルされたファイル、``usr/share/emacs/site-lisp/uim-el/``に元のelispがある。

```bash:
wget https://raw.githubusercontent.com/uim/uim/master/emacs/uim-keymap.el
```
でホームにuim-keymap.elを取得する。


```bash:
cd /usr/share/emacs/site-lisp/uim-el
sudo mv uim-keymap.el uim-keymap-o.el
sudo mv ~/uim-keymap.el ./
sudo chown root:root uim-keymap.el
```

一応元のファイルを``uim-keymap-o.el``としてバックアップしてある。また、ファイルの所有者と所有グループをrootにしておいた。パーミッションも変えたほうがいいかもしれないが、とりあえずは大丈夫そう。

## 参照
[uim/uim - github](https://github.com/uim/uim)
[git sparse checkout で clone せずに一部のサブディレクトリだけを pull/checkout する](https://mseeeen.msen.jp/git-sparse-checkout/)
[raxod502/straight.el - github](https://github.com/raxod502/straight.el)
[How to generate and activate autoloads for local packages?](https://emacs.stackexchange.com/questions/33627/how-to-generate-and-activate-autoloads-for-local-packages)
k3osでのネットワーク設定

# k3osのネットワーク設定
利用時に少し躓いたのでメモ

## 概要
- 軽量k8sであるk3sが予めインストールされているk3os
  - 手元のノートPCやラズパイで動かすのに便利
- 特に設定を行わないと、DHCPでIPアドレスを取得する作りになっている
  - クラスタを組む際に簡易にstaticなIPを降って構築したいので、ネットワークの設定を変更したい
- k3osはベースOSがAlpine Linuxであり、ネットワーク設定はconnmanで行う
  - ただし、そのまま通常のconnmannの設定ファイルに記載しても、再起動契機で上書きされてしまうので、以下の章の通り設定する

## 設定方法
- `/var/lib/rancher/k3os/config.d/*`配下に以下のようにyamlを作成して配置する
  - ちなみにconnman以外の他のOSの設定についても、
    同様のディレクトリにて設定を書くことで反映可能

```
write_files:
- content: |
    [service_eth0]
    Type = ethernet
    IPv4 = 10.0.2.100/255.255.255.0/10.0.2.1
    IPv6 = off
    MAC = 08:00:27:cc:87:0f
    Nameservers = 8.8.8.8
  owner: root:root
  path: /var/lib/connman/eth0.config
  permissions: '0600'
```
Raspbian Stretchからifdown,ifupが使えなくなった話

#概要

RaspbianOSがアップデートされてから、ネットワークの再設定がifdown及びifupコマンドでできなくなっている。
ifconfig デバイス名 down及びupとすることで再設定できる。

#旧方法
ifdownコマンドを走らしますと、以下のようになってしまいます。
`[pi:~] sudo ifdown wlan0
ifdown: unknown interface wlan0`

要は、wlan0を見つけられません。
個人的見解では、
[/etc/network/interfaces]の中の記述に

```[/etc/network/interfaces]
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```
がありましたので、wlan0を見つけることができました。
しかし、おそらくstreachあたりからIPアドレス設定がdhcpcd.confに移行したことにより、wlan0の記述が消えたのでunknown interface wlan0となるのだと思われます。

#新方法
`sudo ifconfig wlan0 down`
`sudo ifconfig wlan0 up`

---

service restart networkでネットワーク再設定を行うという情報もあったのですが、どの時代のラズビアンでもできないのではないかな？と思います。



## 参考
Restart network without reboot
https://www.raspberrypi.org/forums/viewtopic.php?p=537802
Node.jsで任意の画像からよさ気な部分を自動で切り取る


[任意の画像からよさ気な部分を自動で切り取るスクリプト・「smartcrop.js」
](http://kachibito.net/useful-resource/smartcrop-js)の記事にあるsmartcropのNode.js版を試してみました。

[smartcrop-sharp](https://github.com/jwagner/smartcrop-sharp)というライブラリを使います。

## 環境

* Node.js 12.10.0

```bash
$ npm i sharp smartcrop-sharp
```

## コード

コードもシンプルです。

```app.js
'use strict';

const fs = require('fs');
const sharp = require('sharp');
const smartcrop = require('smartcrop-sharp');

const main = (input, output, width=500, height=500) => {
    const body = fs.readFileSync(input);
    return smartcrop.crop(body, { width: width, height: height })
    .then(result => {
        const crop = result.topCrop;
        return sharp(body)
        .extract({ width: crop.width, height: crop.height, left: crop.x, top: crop.y })
        .resize(width, height)
        .toFile(output);
    });
}

//実行
main('./input.png', './output.png').then();
```

## 結果

こんな感じになりました。画像は[twilio](https://twilio.kddi-web.com/)のロゴを真似て書いたやつです。

> 元画像
> <img src="https://i.gyazo.com/7ce7838cdbda201e6c6d9e998cbe4b09.jpg" width="300px">

↓

> 返還後画像
> <img src="https://i.gyazo.com/765fb63389e52479b4df39f73a761fc1.png" width="200px">


余白をいい感じにクロップしてくれていて、結構よさげな印象です。

Node.jsだけで画像処理をやれるのはいいですね。中のアルゴリズムは全然把握してないけど使う分には楽しそうです。
redis使って、リアルタイムでメッセージ取得

##環境
docker 19.03.1
redis_version:5.0.5
ioredis:1.0.0
phpredis:5.0.2

## redisとは
キーバリューのデータベース。
データの一つ一つがテーブルみたいな感じになる

##流れ
php側からredis使って、値を登録して、nodeサーバー側で値をリアルタイムで受け取る。
なお、php側ではphpredis。node側ではioredisを使う。

ちなみに、redis系のどのライブラリも、大体メソッドの名前は同じ(たまにローキャメルケースになってるライブラリもあるがそこはノリでいける)

## プログラム
```php:index.php
//エンドポイント取得
$path = $_SERVER['REQUEST_URI'];
$redis = new Redis();
$redis->connect('ホスト',ポート);

if ($path === '/send-redis') {
   //「test_hoge」チャンネルに向かってパブリッシュ
   $redis->publish('hoge_test','Hello world');
}
```

```javascript:hoge.js

const Redis = require('ioredis');

(async () => {
  console.log('redis起動しました');
  const redis = new Redis(ポート, 'ホスト');
  redis.subscribe(["hoge_test"]); 
  redis.on('message', function(channel, message) {
    console.log('channel: ' + channel + ', message: ' + message); //channel:hoge_test,message:Hello world
});

  redis.disconnect();
})();

```

## 結果
PHP側で、API感覚で「send-redis」にアクセスしたら、
node側でリアルタイムにメッセージが取得できた。

ちなみに、strams型のデータ使いたかったら、xadd()使えばいける。(xaddが使えない古いライブラリもあるので注意)その場合直接メッセージを取得する感じではなくなるので、パブリッシュはstreamを取得するタイミングを知らせるための存在となる。
root権限なくてもパッケージ管理！

root権限与えられていないし、あんまり好き放題できないサーバーってありますよね。
「まあ、gitで落としてmakeローカルインストールすればいいか...」と思っても、
流石に毎回毎回依存関係解決して、prefix設定して、make、make installはつらすぎる。

こんなの人間の仕事じゃない
apt,yumが恋しい
もうつかれたよ、パトラッシュ...
そんなあなたにminiconda

###概要
sudo apt intallが使えない状況では、ローカルインストールのコストが高く付きます。
ダウンロードしてmakeではなくcondaを使うと一行で終わるので、ぜひcondaを使いましょう。
ここではminicondaのインストール方法と、condaの使い方をzsh、git、vim、gccのローカルインストールを例にとって紹介します。


#condaの紹介

condaといえば、pythonのイメージが強いです。
pipと比べられることも多いですが、全く機能が違います。pipはPythonのパッケージマネージャですが、condaはaptやyumのようなパッケージマネージャです。
しかも、たいていの(Windows、macOS、Linux)で環境を構築できます。
また独立した仮想環境を作るので環境を切り替えることができます。つまり失敗しても大丈夫。


#minicondaのインストール
linux用、流石にwgetは入っていると想定。
入ってなかったらMinicondaをインストールしてscpでホームディレクトリに送ってください。

```bash:miniconda_install
cd ~&&
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh&&
bash Miniconda3-latest-Linux-x86_64.sh
```
Enter押しまくって、lisence見ます。
licenseを聞かれますので同意する場合はyes

```bash:
Do you accept the license terms? [yes|no]
[no] 
Please answer 'yes' or 'no':'
>>> 
Please answer 'yes' or 'no':'
>>> yes
```
インストール場所を聞いてくる。Enter

```bash:
Miniconda3 will now be installed into this location:
/home/i_am_an_unko/miniconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/home/i_am_an_unko/miniconda3] >>> 
PREFIX=/home/i_am_an_unko/miniconda3

```
initializeする。ひとまずbashを使うので yes Enter

```
Do you wish the installer to initialize Miniconda3
by running conda init? [yes|no]
```

これでminicondaがインストールされた。bashを再起動する。

```bash:
bash
```
厳密には再起動ではないが、.bash_profileではなく.bashrcを読み込んでくれればいいのでこれでok。プロンプトが次のようになる。

```bash:
(base) i_am_an_unko@gehogeho:~$ 
```

#仮想環境を作って入る
仮想環境を作る。

```bash:
conda create -n sukina_namae
```
仮想環境に入る

```bash:
conda activate sukina_namae
#毎回 conda activateやるのがめんどくさかったら
#echo conda activate sukina_namae >> .bashrc
```

#Zsh, Vim, Gitのインストール

```bash:
#Zsh
conda install -c lightsource2-tag zsh
#Zshでcondaを使うためにはinitする
conda init zsh
#Vim
conda install -c conda-forge vim
#git
conda install -c conda-forge git
#gcc
conda install -c conda-forge gcc_impl_linux-64

```
これでzsh, vim , gitは既存のものと同じように普通に使えます。
つまり/home/i_am_an_unko/miniconda3/envs/sukina_namae/binにその名前でパスが通っています。

```bash:
 which vim
#/home/i_am_an_unko/miniconda3/envs/sukina_namae/bin
```

コンパイラgcc、gcp、gfortranは名前が少し特殊で、例えばgccはgccという名前ではなくx86_64-conda_cos6-linux-gnu-gccなので注意です。
[参考:Anaconda compiler tools](https://docs.conda.io/projects/conda-build/en/latest/resources/compiler-tools.html)

```bash:
x86_64-conda_cos6-linux-gnu-gcc unko.c
```
のようにします。めんどかったら、.bashrc or .zshrc にgcc2とか適当にエイリアスを通してください。

```bash:
# bash gcc2としてaliasを通す。
echo "alias gcc2='x86_64-conda_cos6-linux-gnu-gcc'" >>.bashrc
# zsh gccとしてaliasを通す。
echo "alias gcc2='x86_64-conda_cos6-linux-gnu-gcc'" >>.zshrc 
```

#他にもいろいろ入れたい
[anaconda](https://anaconda.org/)
で検索すれば好きなもの取ってこれます。
#更新
大変参考になりました
[Anacondaのアップデート方法](
https://qiita.com/i_jp/items/7f1bc432b262b11ff8fc)
#pipと混ぜるな
バグる
agora.io SDKと管理システムの連携について

構築するビデオ通話システムによっては管理システム側で保持している名前などの情報を画面に出力するケースがあります。

**agora.ioは基本的に個人情報等をPaaS上に保存しない仕組みになっています。**

では、どのように保持している情報を連動させるかを解説します。

### 想定されるUIと実装方法
#### 想定UI
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/d160d590-0037-a4e0-3308-336b45fb030d.png)

#### 実装方法
具体的なAPIは以下のようになります。（WebSDKの場合。NativeSDKでも同様の事が可能です。）

join methodの第２引数にuser_idを指定します。

```javascript
client.join(<token>, user_id, null, function(uid) {
    console.log("client" + uid + "joined channel");
}, function(err) {
    console.error("client join failed ", err);
    // Error handling
});

```

他拠点が入室したイベントは以下で取得可能です。
user_idが取得できるので、独自の管理システムに問い合わせる事で名前などの情報が取得できます。

```javascript
client.on('peer-online', function(evt) {
  console.log('peer-online', evt.uid);
  //Get user information from original system
});

```


#### シーケンス
![Sequence Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/25a56cab-5cd1-bd21-3493-38328caa81b1.png)

### その他ユーザーID活用例
#### ユーザーの利用制限
・特定量以上の利用があったユーザーを制限したい
・違反のあったユーザーをチャネルから追い出したい
このようなケースでは以下の記事にあるようにユーザーIDを利用して制限をかけたり、追い出したりする事が可能です。
[ユーザーの入室制限](https://qiita.com/v-cube/items/ff945c246cfcec489948#%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E5%85%A5%E5%AE%A4%E5%88%B6%E9%99%90)

#### 接続状況の調査
ビデオ通話やライブ配信のサービスを提供していると、事後に不調などの問い合わせがくる場合があります。
その際はこのユーザーIDから接続の品質調査を実施する事が可能です。
[Call Searchについて](https://vcube-support.zendesk.com/hc/ja/articles/900000553886-Call-Search%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)


### 最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=d73803d2e9f2d1d7a8d2)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=d73803d2e9f2d1d7a8d2)
Google Earth Proとsimplekmlを使って，マッピングしてみる

※Google Colaboratoryを使用しています．なので，Googleアカウントとパソコンがあれば，誰でも作業できます．
#simple kmlを使って，実際にマッピング！
simple kml
https://simplekml.readthedocs.io/en/latest/

simplekmlをインストール

```
pip install simplekml
```

simplekmlをインポート

```
import simplekml
```

ちゃんと動くか確認するため，東京タワーを表示させてみる．

```
kml = simplekml.Kml()
kml.newpoint(name="Tokyo_tower", coords=[(139.745433, 35.658581, )])  # 経度，緯度
kml.save("tokyo_tower.kml")
```

作成したkmlファイルをダウンロード．

```
from google.colab import files
files.download('tokyo_tower.kml')
```

Google Earth proを起動させ，ドラッグすると...
![東京タワー.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431266/11c72668-3c6d-dd52-5b2e-91956b1f46a7.jpeg)

黄色いピンが見えたらOK！
PsychoPyで事前に画像を読み込んで呈示の負荷を減らす

画像ファイルを画面に呈示するとき、心理学の実験では一般的に、事前に画像ファイルの読み込みを行って、画像を呈示するときの負荷を減らします。以下に説明する方法でそれを達成できているのではないかと思っていますが、実際に計測などを行って比較したわけではないのでご了承ください。

また、Pythonのリスト型、辞書型についての知識を深めることも目的としています。

# リスト型について
PsychoPyのBuilderにCodeコンポーネントを配置します。Begin Experiment に次のコードを書いてみましょう。

```python:BeginExperiment
import random

myList = [1, 2, 3, 4]
print('CHECK1:')
print(myList)
random.shuffle(myList)
print('CHECK2:')
print(myList)
```

これを実行すると、PsychoPy outputに次のような内容が表示されるはずです。

CHECK1:
[1, 2, 3, 4]
CHECK2:
[1, 4, 2, 3]

CHECK1のあとの[1, 2, 3, 4]はmyListの内容です。順番は必ず1,2,3,4になります。CHECK2のあともmyListの内容を表示しているのですが、`random.shuffle`によってmyList内の数字の順番がランダムになっている点に注意してください。上の例では1,4,2,3ですが、偶然、1,2,3,4となることもあります。

myListの１番目の要素にアクセスする（１番目のデータを使う）場合には、`myList[0]`とします。
同様に２番目の要素にアクセスするには`myList[1]`とします。

詳しくは、[リスト | Python入門 - Let'sプログラミング](https://www.javadrive.jp/python/list/)をご覧ください。

# 辞書型について

辞書型は、keyとvalueがペアになるようなデータを扱うときに便利です。例えば次のようなデータです。

| 果物 | 値段 |
|:-----------|:------------|
| リンゴ | 120円| 
| バナナ| 90円| 
| オレンジ|180円|

記述済みのCodeコンポーネント（Begin Experiment）に次のコードを加えてみましょう。


```python:BeginExperiment
myDict = {'apple': 120, 'banana': 90, 'orange': 180}
print('CHECK3:')
print(myDict)
print('CHECK4:')
print(myDict["banana"])
```
これを実行すると、PsychoPy outputに次のような内容が表示されるはずです。

CHECK3:
{'apple': 120, 'banana': 90, 'orange': 180}
CHECK4:
90

CEHCK３のあとに、myDictの内容をすべて表示しています。コロン:をはさんで、keyとvalueが並んでいる点に注目してください。
CHECK4のあとでは、`myDict["banana"]`の内容、つまりバナナの金額（90円）を表示させています。

詳しくは、[とっても便利なPythonの辞書型について覚え書き](https://qiita.com/E_Schaf/items/9ef26c0c514325d69e80)をご覧ください。

# 特定のフォルダに保存している画像ファイルの一覧を取得
いよいよ本題です。特定のフォルダに保存している画像ファイルの、ファイル名の一覧を取得してリストとして保持するには次のようにします。ここでは実験プログラムが保存されているフォルダ内に、imagesというフォルダが存在し、そこにjpgの拡張子を持つ複数の画像ファイルが保存されているとします。

```python:BeginExperiment
import os
import glob

cwd = os.getcwd() # current working directory
imageLists = glob.glob(cwd + "/images/*.jpg")
print('CHECK5:')
print(imageLists)
```

CHECK5のあとに、imageListsの内容を表示しています。例えば次のようになります。

['/Users/xxx/Documents/PsychoPy3/practice/images/image1.jpg', '/Users/xxx/Documents/PsychoPy3/practice/images/image2.jpg', '/Users/xxx/Documents/PsychoPy3/practice/images/image3.jpg']

imageListsの内容は [] でくくられていて、リストになっていますね。
この例では要素数は3で、imageLists[1]は、'/Users/xxx/Documents/PsychoPy3/practice/images/image2.jpg' です。

imageListsのすべての画像を読み込むには次のようにします。

```python:BeginExperiment
imageData = {}
for i in imageLists:
    imageData[i] = visual.ImageStim(win, image=i)
    
print('CHECK6:')
print(imageData)
```

imageDataは辞書型で、次のような内容になっています。

|ファイル名|画像データ|
|:---|:---|
|画像1のファイル名|画像1のデータ|
|画像2のファイル名|画像2のデータ|
|画像3のファイル名|画像3のデータ|

# 画像を呈示する
Codeコンポーネントに次のコードを加えます。

```python:BeginExperiment
for i in imageLists:
    imageData[i].draw()
    win.flip()
    core.wait(1)
```

imagesフォルダ内のすべての画像が、１枚ずつ、１秒間呈示されてプログラムが終了します。

さて、このままでは、毎回同じ順番で画像が呈示されることにお気づきでしょうか？
`random.shuffle(imageLists)`
をどこかに加えると呈示される画像が毎回変わります。つまりリストの内容をランダムな順番にするということですね。お試しください。
git diffの出力を整形する

#全て出力

```
$ git diff
diff --git a/file b/file
index edd13ee..d0f4198 100644
--- a/file
+++ b/file
@@ -1,3 +1,3 @@
 aaaa
 bbbb
-cccc
+dddd
```

#+/-の差分情報だけ欲しい
そんなオプションはなかった。ゴリ押しで実現

```
$ git diff --unified=0 --exit-code | grep -E "^[-\+]" | grep -vE "\-\-\-|\+\+\+"
-cccc
+dddd
```
VMwareでWindows7が立ち上がらない

# 背景
## 破壊されかけた環境

- (host)windows10 professional
- VMware Workstation 14 Player(14.1.2 build-8497320)
- (guest)windows7 professional

## どうしてこうなった

なにもしてないのにこわれました。

…前日、諸事情によりPCを立ち上げたまま（ロック状態）で退社。
急いで帰らなければならない用事があり面倒なのでVMwareも立ち上げたまま。
朝来たらどう見ても再起動されている（放置した理由からして当たり前田のクラッカー）

その時、ふと仮想のことが心配になった。

# 現象

VMware WorkstationからWindows7をいつもの如く立ち上げると、最初の黒い画面のまま動かなくなったしまった。
OMG・・・。

# 原因

色々調べると `.lck` というロックフォルダが残っているためロックに失敗するのではないかとのこと。
（https://qiita.com/chiyoyo/items/c093087267fc16a40f59）
これは試したがダメだった。

今回の原因はこいつだった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356485/0ace9eb1-5724-37d5-bd72-823cd5f776a2.png)
`vmware-vmx-0.dmp` というファイルが存在していたのが原因だったっぽい。

消して再度起動したら起動した。
モニター無しでもIPアドレスを知りたい。[ラズパイ]

# 概要
 
- ラズパイにssh接続したいけどIPアドレスわかんなーいっていうそんなあなたに。


# 本題に入る前に...

普段ラズパイを運用する場合にSSHやVNCでリモート接続している人でも、セットアップ時はモニター、キーボードマウスといった入出力機器をラズパイに繋いで、直接操作している人も多いのではないでしょうか。

![s-ファイル 2019-09-24 8 32 59.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447807/32000f3c-df53-b328-45c5-95ba05178950.jpeg)

マウスもキーボードも1つあれば良いし、
モニターをラズパイに一台占有されることで、作業領域減りますし、
なんならRPi3からはWi-Fiが標準で付いていますから、LANケーブルさえ必要ないですよね？

<img width="597" alt="s-IMG_1257.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447807/797ef377-0628-d276-7cd9-a1c686fb5318.jpeg">

ディスプレイやキーボード、マウスなどの入出力機器を接続しない状態でコンピュータを運用することをヘッドレスといいます。
必要ないものは省いてヘッドレス化していきましょう。スッキリします。

電源さえあればラズパイは開発環境を整えられるのです。
以下ではその方法を紹介します。

# ヘッドレス RPI初期セットアップ
Raspberry Piではセキュリティの観点からSSHはデフォルトで無効となっており、SSH接続を有効にするために、ボリュームの```/```直下に```ssh```（拡張子なし）というファイルを置く必要があります。

また、無線LANに接続する必要があるので、SSIDとパスワードを設定しなければなりません。
これもボリュームの```/```直下に```wpa_supplicant.conf```というファイルを作成し、中身に必要な情報を書き込めば、```/etc/wpa_supplicant/wpa_supplicant.conf```に自動的に書き込まれます。

```wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="test"
    psk="abcd1234"
}
```

windowsの場合

![tekitou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447807/bbdbef8f-d148-a47b-9c0f-bf4f87bdff64.png)

以上で、ヘッドレス時のセットアップは完了です。

# IPアドレス取得

ssh接続にはIPアドレスとユーザ名、パスワードが必要です。
ラズパイはデフォルトのユーザ名が`pi`
パスワードが`raspberry`です。
よって、ユーザ名とパスワードは調べる必要がありませんが、IPアドレスを知る必要があります。
IPアドレスを調べるシェルスクリプトを作成しました。


```your_IP.sh
echo 192.168.1.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl | sort -n -k 4 -t "." | cut -f 4 -d " " > a.txt
read -p "Ready??(press Enter): "
echo 192.168.1.{1..254} | xargs -P256 -n1 ping -s1 -c1 -W1 | grep ttl | sort -n -k 4 -t "." | cut -f 4 -d " " > b.txt
diff b.txt a.txt > /dev/null 2>&1
if [ $? -eq 1 ]; then
 diff --old-line-format='%L' --new-line-format='%L' --unchanged-line-format='' a.txt b.txt
fi 
rm a.txt
rm b.txt
```
***説明***
使用しているIPアドレスを調べる
->エンターキー押されるまで待つ（その間にラズパイ付ける）
->もう一度使用しているIPアドレスを調べる
->差分とる．終わり．

---
また、Fingというネットワークスキャナアプリでも、同様にIPアドレスを簡単に調べることができます。大変便利です。

[Google Play](https://play.google.com/store/apps/details?id=com.overlook.android.fing&hl=ja)
[Apple Store](https://apps.apple.com/jp/app/fing-%E3%83%95%E3%82%A3%E3%83%B3%E3%82%B0-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%84%E3%83%BC%E3%83%AB/id430921107)
HTML5/CSS3　２カラム　良く使うbase.html。

別に深い考察はありません。良く使いそうな２カラムのHTML5ソースコードですので、個人的にファイリングしてみました。忙しいときに楽したいですから…。
☆Webクリエイター能力認定試験HTML対応エキスパート公式テキスト　参照☆

```HTML5:base-2column.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
<link rel="stylesheet" href="css/2column.css">
</head>
<body>
<header id="top">
<h1><a href="index.html"><img src="" alt=""></a></h1>	
</header>
	<nav>
		<ul>
		<li id="nav_concept"><a href="concept.html">1</a></li>
		<li id="nav_plan"><a href="plan.html">2</a></li>
		<li id="nav_fair"><a href="fair.html">3</a></li>
		<li id="nav_contact"><a href="contact.html">4</a></li>
		</ul>
	</nav>
	<div id="breadcrumb">
		<ul>
			<li><a href="index.html">ホーム</a></li>
			<li>5</li>
		</ul>
	</div>
	<div id="contents">
		<div id="main">
			<article>
				<h1>２カラムの作り方</h1>
			</article>
		</div>
		<div id="sub">
			<aside>
				<div class="bnr_inner">
					<a href="plan.html">
					<dl>
						<dt><img src="images/bnr_plan.jpg" alt="プランのご案内"></dt>
						<dd>標準のプランをご紹介いたします。</dd>
					</dl>
					</a>
				</div>
				<div class="bnr_inner">
					<a href="contact.html">
					<p><img src="images/bnr_plan.png" alt="お問い合せ"></p>
					</a>
				</div>
			</aside>
		</div>
	</div>
	<footer>
		<p id="pagetop"><a href="#top">ページ先頭へ戻る</a></p>
		<address>北海道　電話　営業時間</address>
		<p id="copyright"><small>Copyright &copy;2019 ２カラムの作り方 All rights reserved</small></p>
	</footer>
</body>
</html>
```

```CSS3:2column.css
@charset "utf-8";

/* 基本レイアウト ここから↓*/
body {
	background-color: #f3f2e9;
	color: #5f5039;
}
header, nav, #breadcrumb, #contents, footer {
	margin: 0 auto 0 auto;
	width: 840px;
}
header h1 {
	margin: 0 0 26px 0;
	padding-top: 28px;
	text-align: center;
}
nav ul {
	overflow: hidden;
	margin: 0 0 20px 0;
	padding-left: 0;
	list-style-type: none;
}
nav ul li {
	float: left;
	width: 210px;
}
nav ul li a {
	overflow: hidden;
	display: block;
	padding-top: 44px;
	height: 0;
}
nav ul li#nav_concept a {
	background-image: url(../images/nav-sanyuukaku-1-1.png);
}
nav ul li#nav_plan a {
	background-image: url(../images/nav-sanyuukaku-1-2.png);
}
nav ul li#nav_fair a {
	background-image: url(../images/nav-sanyuukaku-1-3.png);
}
nav ul li#nav_contact a {
	background-image: url(../images/nav-sanyuukaku-1-4.png);
}
#contents {
	overflow: hidden;
}
#main {
	float: left;
	width: 570px;
}
#sub {
	float: right;
	width: 230px;
}
footer {
	padding-top: 70px;
}
#main h1 {
	margin: 0 0 30px 0;
	padding: 35px 0 35px 65px;
	font-size: 156.25%;
	background-image: url(../images/bg_h1_head.png), url(../images/bg_h1_bottom.png);
	background-repeat: no-repeat, no-repeat;
	background-position: left top, left bottom;
}
#concept #nav_concept a,
#plan #nav_plan a,
#fair #nav_fair a,
#contact #nav_contact a,
nav ul li a:hover {
	background-position: 0 -45px;
}
.bnr_inner a p img:hover {
	opacity: 0.8;
}

/* 基本レイアウト ここまで↑*/
```
PlantUML svg を git 管理する

成果物 https://github.com/nokamoto/poc-markdown-puml

## 動機
Git で図を管理したいという気持ちになった時に puml を svg 変換して git 管理する仕組みがあれば便利そうだと思ったため作成。

puml と svg を両方 git に入れて puml が変更された時に svg が更新されている状態に保てば目的は大体達成できた。

## 実装
[plantuml.jar](http://plantuml.com/ja/download) と java が入った[イメージを作成](https://github.com/nokamoto/poc-markdown-puml/blob/master/Dockerfile)して、

```bash
$ java -jar plantuml.jar -nometadata -tsvg ${path/to/puml/files}
```

のように[実行する形](https://github.com/nokamoto/poc-markdown-puml/blob/master/Makefile)にする。

`-nometadata` を付けないと svg に実行環境などの情報が入ってしまうので git 管理に向かなくなる。

実行して出来た svg ファイルは、

```markdown
![example.svg](example.svg)
```

のように参照すれば [README](https://github.com/nokamoto/poc-markdown-puml/blob/master/README.md) のようになるのでプルリクエストで図を変更した時など、変更後の図がそのまま表示されるようになる。

## おわり
puml で表現できる図であれば git 管理できるようになる。
puml で表現できない図をいい感じに git 管理する方法はまだ悩ましいが。
google speech apiの音声変換するときに403deniedになったら

エラー:
https://qiita.com/knyrc/items/7aab521edfc9bfb06625#8-%E5%AE%9F%E8%A1%8C%E7%B5%90%E6%9E%9C
https://teratail.com/questions/130651
https://cloud.google.com/speech-to-text/docs/

解決:
https://cloud.google.com/docs/authentication/getting-started
サービスアカウントを作り直して、役割リストから[プロジェクト] > [オーナー] を選択し、jsonパスを設定したら、エラーが解決できました。
Xcodeの影響でMacのストレージがやばい時の対策

# これは何？
MacBook Pro 256Gを使ってるのですが、
iOSの開発をXcodeでしているとストレージが圧迫されまくってたので解消手順を書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180679/9cf55b27-c65f-e37d-3d30-e3d79ed1da79.png)
ちなみにこんな感じで、「システム」というジャンルがほとんどの領域を締めてました。

改善後は下記のようになりました！60GBくらい解放できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180679/192b3d71-b1b3-4bce-f007-6f042fd30256.png)

# 手順
まずは、全体の状況をより詳細に見るために、時間かかりますが下記のコマンドを。

`sudo du -sh /*`

これで、最も容量を使っている箇所を特定します。


僕の場合は、 `/Users` のディレクトリが160GBくらい占めていたので今度はそこをさらに深ぼっていきます。

`sudo du -sh /Users/*`


というような要領でどんどんどこが最もストレージ容量を消費しているのかを特定してください。

今回はiPhoneアプリ開発者なら多分Xcodeの要領が多いであろうという前提でどのファイルは消して平気なのかを共有します。

# Xcode配下で消して平気なのはどれ？
Xcodeが容量の影響として大きい場合、最終的には下記のコマンド箇所が大半を占めていると思います。僕はここだけで90GBくらいありましたw

`sudo du -sh /Users/jo/Library/Developer/Xcode/*`

ということで、このファイル配下で消していいものを消します。

`sudo du -sh /Users/jo/Library/Developer/Xcode/Archives/*`
とやると、過去にアーカイブしたものがタイムスタンプで保存されているので、最新のもの以外を削除。

`sudo du -sh /Users/jo/Library/Developer/Xcode/DerivedData/*`
とやると、よくわからないものがたくさん出てくるが、これはXcodeを立ち上げれば自動生成されるもののようなので全て削除。

`sudo du -sh /Users/jo/Library/Developer/Xcode/"iOS DeviceSupport"/*`
とやると、シミュレーターの過去のバージョンのものなどがたくさん列挙されるので不要なものを指定して削除。

# 結論
ここまでの手順をやるだけでも僕の場合60GB程度確保することに成功したのでストレージ容量に困っている方はぜひ試してみてください。
Vue.jsの基本的な使い方(初心者向け)

# はじめに
最近Vue.jsを使い始めたので、このページは自分の備忘録的なものです。

# 下準備
## Vue.js
まずはVue.jsを適用させる方法ですが、自分はVue.js自体をダウンロードしてきました。
CDNを使用すれば早いんだけど、実ファイルを手元に置いておきたいという思いから。

## axios
Vue.jsでAPI通信をしたい場合にこれを使用するのがベスト(と自分では思ってます)。
これは実ファイルが見当たらなかったのでCDNを使用。

```
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
```

# 実際に使ってみよう
## JavaScriptの記述方法
基本的な書き方はこんな感じ。

```
var app = new Vue({
　el: '#main-content',
　data: {
　　hoge: "",
    fuga: ""
　},
　methods: {
　　hogehoge: function() {
      ...
    }
　}
})
```
まずJavaScriptファイル内で以下の宣言を行います。
>var app = new Vue({})

これでVue.jsのオブジェクトを作るみたい。
で、次に

>el: '#main-content',

この「el」でVue.jsの適用範囲を指定します。
基本はエレメントのidとかを指定。
画面全体を指定したい場合はbodyを指定してもいいんじゃないかな、自分はやったことないけど。

>data: {
>　　hoge: "",
>　　fuga: ""
>　},

「data」ではvueオブジェクトで使用する変数なんかの宣言をします。
ちなみにここで宣言したフィールドに格納された値はページを閉じるまで保持されます。

>methods: {
　　hogehoge: function() {
　　　...
　　}
　}

ここからが本番
「method」ではhtmlから直接呼び出せる関数を記述できます。
ここに記述しておくとHTMLから直接呼び出す事ができます。
呼び出し方は後に記載。

## axiosの記述方法

axiosの記述方法は以下のような感じです。

```
axios.post(URL, パラメータ)
.then(function(res) {
　・・・
}).catch(function(res) {
　・・・
});

GETの場合は
axios.get(url, option)
※optionはaxiosのオプション

```

$.ajax的な使い方で簡単に使えます。
then～catchはfetchと同じ使い方ですね。
GitHubに詳しい使い方があるので見てみたらもっと詳しく分かるかも。
[Axios本家](https://github.com/axios/axios#instance-methods)

POST時に渡すパラメータは以下の感じで記述。

```
let params = new URLSearchParams();
params.append('param', パラメータ);
dataブロックの値を渡したい場合は以下の感じでセット
params.append('data', this.hoge);
配列なんかを格納したい場合は以下のような感じ
params.append('data', JSON.stringify(this.配列名));
```

## HTMLの記述方法
JavaScript側の準備ができたら今度はHTML側との連結を記述します。

```
<input type="text" value="" v-model="labelId">
```

この「v-model」というのはJavaScript側で記述した「data」ブロックと紐づけます。
上の例でいくとdataブロックにlabelIdというフィールドを作成しておけば、HTML側で入力した内容が自動的にJavaScript側に格納されます。

```
<button class="btn" type="button" v-on:click="searchData">
```

次に「v-on」というのはJavaScript側で指定したmethodやらの呼出ができるようになる記述です。
ここでは「v-on:click」としていることでクリック時に呼出となっています。
要はJQueryでいう

>$('.btn').on('click', function(){})

っていうのと同じこと。

```
<td v-text="data.classification"></td>
```

次はラベル的にdataブロックの値を表示する方法。
「v-text」としておくとdataブロック内のフィールドに格納されている値を表示させます。
よくサンプルである入力すると同時に入力箇所の下に文字が表示されるというものが簡単に作れます。


# 最後に
ひとまず自分の中での最低限のvue.jsの使用方法は記載したつもり。
本当はまだまだできることがいっぱいあってvue.jsはかなり面白い。
引き続きvue.jsの使い方をまとめていきたいと思っています。
apacheを実行できるユーザの作成方法

今回はec-cube２を使った事例。
ディレクトリ内の権限がカオスだったので整理した。

## 問題点

- ec-cube内の管理画面で更新しようとしても書き込み権限がない。
    - 更新できない（CMSなのに
- プラグインインストールできない
    - ※ 解凍に失敗しました。と出る

ディレクトリをapache権限を持ったユーザに設定する必要があるとのこと。


## 設定

apacheにユーザを追加

```
usermod -aG GROUPS USER
```

ユーザが対象にディレクトリに書き込めるようにする。

```
chown -R [ユーザ名]:[グループ名] [ディレクトリ名]

chown -R user:apache shop
```

デフォルトパーミッションを設定する。
この設定をしていないとpullしたファイルの初期権限が644になってしまう。

```
chmod 2775 -R shop
```
千葉で営業しているガソリンスタンドの一覧をGOGO APIで作った話

#なぜ作ったか
今回の台風の影響で千葉県が多大な被害を受けた。
Twitterと地元民からの情報をもとに、営業しているガソリンスタンドの情報ニーズが高いことがわかったので作った。
東日本大震災の時にGoogleが色々作って被災地支援してたのに憧れてたってのもある。
あと、地元が千葉なのだが手助けに行く余裕がなかったので、せめてもの贖罪の気持ちもこもっている。

#URL
https://docs.google.com/spreadsheets/d/1VwMHuqmKwiMf7jfFEYVnFgIEcRVKJl6KbTiE5zBsaFM/edit?usp=sharing

#内容
現在提供停止しているGOGO.GSのAPIだが、もともとAPIを解説していたであろうページに問い合わせフォームがあった。
こちらに問い合わせしたところ快く提供いただいたので使っている。

既に停止しているAPIなので、GASのコード等は公開しない。
(あまりに汚すぎて公開できないコードってのもある)

基本的にGETでXMLを出力してくれるAPIを叩いてGoogleスプレッドシートに出力しているだけなので、新規性ゼロだし公開するほどのもんでもないし。

#作ってみてどうだったか。
・GOGO.GSの投稿情報が情報源なので、現地はそれどころじゃないからデータがない。
・自分のバズ力(ぢから）が足りなくて、求める人まで届けることはできなかった。

#あとがき
この記事は作ってみたけど微妙だったという内容で締めることとなる。
いかがだったでしょうか？

#参考url

[ガソリン価格API powerdByGOGO.GS](http://api.gogo.gs/old/index.html)
DarkTheme対応

#はじめに
Android10よりDarkThemeを適用することで、バッテリーの消費を抑えるなどの効果が得られるようになりました。
本稿ではDarkThemeへの対応方法を説明します。

#DarkTheme対応
DarkTheme対応方法を下記に示します。

###style
```xml:styles.xml
<!--AppCompat-->
<style name="AppTheme" parent="Theme.AppCompat.DayNight">

<!--MaterialComponent-->
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">
```
AppCompatのスタイルを使う時はres/values/styles.xmlにDayNightテーマを記述して使います。
また、MaterialComponentのスタイルを使うこともできます(com.google.android.material:material:1.1.0-alpha1から)

以上でシステムの設定によりDarkまたはLightのスタイルがアプリに適用されます。

###強制的にDarkThemeを設定する
```Kotlin:sample.kt
//DarkTheme適用
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)

//LightTheme適用
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)



```
AppCompatDelegate.setDefaultNightMode()を呼ぶことで意図的にThemeを設定することができます。
また、この設定を変えたイベントはconfigChangesで受け取ることができます。

```xml:AndroidManifest.xml
<activity
  android:name=".MyActivity"
  android:configChanges="uiMode" />
```

```Kotlin:sampleActivity.kt
override fun onConfigurationChanged(newConfig: Configuration) {
  super.onConfigurationChanged(newConfig)
  //現在のThemeを取得
  val currentNightMode = configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
  when (currentNightMode) {
    Configuration.UI_MODE_NIGHT_NO -> {
      //LightThemeの場合
    }
    Configuration.UI_MODE_NIGHT_YES -> {
      //DarkThemeの場合
    }
  }
}
```

###resourceフォルダの使いわけ
通常とは別にDarkTheme用のリソースを定義したい場合はvresフォルダにalues-nightのように-nightを付けた名前のフォルダを定義して、リソースを設定しておくことでDarkThemeが適用された時にそのリソースが使われます。

#参考
[Android Developers](https://developer.android.com/guide/topics/ui/look-and-feel/darktheme)
MiniMagick Carrierwave 画像にウォーターマークを追加する

Carrierwaveを使用した画像アップロードの際に、ロゴなどを右下に配置する実装


```ruby
#image_uploader.rb

  process :store_watermark

  ~省略~

private

  def store_watermark
    ## ウォーターマーク用のロゴ
    wartermark_logo = MiniMagick::Image.open("#{Rails.root}/app/assets/images/common/logo.png")

    manipulate! do |img|
      img.composite(wartermark_logo) do |c|
        c.compose "Screen"  ##タイプ "Over"でもいいかな
        c.gravity "Southeast"  ##位置
        c.geometry "+15+15"  ## 右下を基準に ?px 空けるか
        c.dissolve "30%" ## 透過率
      end
    end
  end
```
PhoneGap + Vue + TypeScript で開発環境を構築してみた

# PhoneGap とは？

ネイティブアプリを JavaScript だけで実装できる `Apache Cordova` をラップしたプラットフォームです。
ビルドされたアプリはネイティブアプリの WebView 上で実行されますが、プラグインを通してネイティブ機能とやりとりができます。

PhoneGap と Cordova の違いはあまり詳しくないので触れませんが、PhoneGap は Cordova + α みたいな感覚で問題ないと思います。開発用の便利ツールやビルド環境、テスト環境などのエコシステムがついてきます。

Cordova のいいところは、開発時にはブラウザでほぼすべての挙動が確認できることです。
JavaScript の膨大なエコシステムの恩恵を受けられるため、例えば `jest` を使ったテスト、`dayjs`, `axios` といったライブラリや Web Font, Icon Font、CSS によるスタイリングなど Web で培った技術がそのまま使えます。

# 手順概要

1. Vue の新規プロジェクトを作成 (`vue`コマンドで普通に作成)。
1. PhoneGap の新規プロジェクトを作成 (`phonegap` コマンドで普通に作成)。
1. Vue プロジェクトと PhoneGap プロジェクトをマージ。
1. Vue の設定を PhoneGap 用に修正。
1. ブラウザとエミュレータでの動作確認。
1. vue-cordova の導入と plugins のテスト。

# 手順詳細

Github にボイラープレートリポジトリを作成したのでそちらを参照してください。

* [Github リポジトリ](https://github.com/QLife-Inc/phonegap-vue-examples)
* [構築手順](https://github.com/QLife-Inc/phonegap-vue-examples/blob/master/docs/CONSTRUCT.md)
Windowsでpython 3.xを普段使いしているけどcocosコマンドを使いたい場合のメモ

# ダウンロードとインストール
https://cocos2d-x.org/download
から、cocos2d-xを落としてきます。
これを書いている時点の最新は3.17.2
私は、d:\cocos2d-x-3.17.2 に展開しました。
下記、それを前提に。

https://www.python.org/downloads/release/python-2716/
から「Windows x86-64 MSI installer」を落としてきて、python 2.7をインストールします。
普段使いがpython 3.xということは、大体3.3以降でしょうから、pyがインストールされているはず。

```
cd /d d:\cocos2d-x-3.17.2
py -2.7 ./setup.py
```

を実行します。

# PATHの修正
環境変数PATHを見ると、

```
cocos2d-x-3.17.2\tools\cocos2d-console\bin
```

というのが追加されていますが、ドライブ名がないとパス探索がうまくいかないので

```
D:\cocos2d-x-3.17.2\tools\cocos2d-console\bin
```

に変更します。

# バッチファイルの修正
さらに、D:\cocos2d-x-3.17.2\tools\cocos2d-console\bin\cocos.bat
の２行目の「python」を「py -2.7」に書き換えます。

# 確認
試しに適当なディレクトリで

```
cocos --version
```

を実行してバージョンが表示されれば出来上がり。

なお、パス中に日本語や空白を含む場合、ちゃんと扱えないケースがままあるのでハマらないようにしましょう。あとはサンプル読んでいろいろ遊びましょう。

以上。
ビットマップインデックスの仕組み

ビットマップインデックスの仕組みについて調査してまとめたメモです。

## そもそもインデックスとは

ビットマップインデックスの前にそもそもインデックスとは何かについて簡単に説明。
インデックスはざっくりいえばテーブルに対してのSQL（SELECT文）の処理速度を高速化するための仕組み。
日本語でいうと索引。専門書や辞書で後ろの方についている索引と同じイメージ。
辞書の場合、調べたい用語があるときに、1ページから順番に探していくよりも、先に索引で該当の用語が何ページにあるかを確認し、そのページを調べにいくほうが確実に時短。
その仕組みをDBMSで実現しているのがインデックス。

## インデックスの種類

インデックスにはいくつかの種類がある。

・Bツリーインデックス
・ビットマップインデックス
・ハッシュインデックス

などなど。
DBMSにおいて単にインデックスというと、大抵の場合Bツリーインデックスのことを指す。
本の索引のイメージに近いのがBツリーインデックス。
名前の通り木構造になっていて、検索値を元に該当レコードが格納されているブロックのアドレスを取得する仕組み。
Bツリーインデックスについては詳しくは解説しているサイトや記事がたくさんあるので他を参照ください。

## ビットマップインデックスとは

ビットマップインデックスは、検索に用いられるカラムに対して、その値とレコードとのビットマップを使ってレコードを検索するインデックス。
このインデックスが有効なのは検索するカラムのカーディナリティが低い（取りうる値の種類が少ない）場合。

例えば、「名前」「性別」「血液型」という情報を持つユーザーテーブルがあって、10万件のレコードがあったとする。
この場合、名前はほとんどの場合被らないので、レコード毎にほぼ違った値になる。
つまりカーディナリティが高い。
一方、性別は男と女の2種類の値しか取らないし、血液型はA、B、O、ABの4種類しかない。
つまりカーディナリティが低い。

この場合、名前で検索を行った際にはBツリーインデックスによる検索の方が明らかに効率が良いが、
性別や血液型で検索を行う場合、ビットマップインデックスの方が効率が良くなる可能性が高い。


## サンプル
言葉だけの説明だと分かりにくいのでサンプルで。

名前、血液型、性別というカラムを持ったユーザーテーブルを考える。
以下の6件のレコードが登録されているとする。

ユーザー

| ID | 名前 | 血液型 | 性別 |
|------------------:|:-----------------|------------------:|:------------------:|
| 1 | 佐藤 | A | 男 |
| 2 | 鈴木 | B | 女 |
| 3 | 田中 | O | 男 |
| 4 | 高橋 | A | 女 |
| 5 | 伊藤 | O | 男 |
| 6 | 山本 | AB | 女 |

この時、血液型と性別に対するビットマップインデックスは以下のようになる。

血液型のビットマップ

|レコード番号|1|2|3|4|5|6|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|A|1|0|0|1|0|0|
|B|0|1|0|0|0|0|
|O|0|0|1|0|1|0|
|AB|0|0|0|0|0|1|

性別のビットマップ

|レコード番号|1|2|3|4|5|6|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|男|1|0|1|0|1|0|
|女|0|1|0|1|0|1|

レコード番号というのは、レコードを特定するための値だと思ってください。
Oracleでいうrowid、PostgreSQLでいうTIDみたいなもの。
ここではわかりやすくするためIDと一致するようにしています。


ここで例えば

```sql
select * from ユーザー where 血液型 = 'A';
```

というSQLを実行したとする。
ビットマップインデックスが使用される場合、血液型のビットマップのAのビット列を見る。
「100100」
ビット列はこうなっているので、1つ目のレコードと4つ目のレコードが該当する。
結果的に佐藤、高橋のレコードがヒットする。

このように、条件に合致するビット列を見て、値が1になっているレコードを取得するのが
ビットマップインデクスの仕組み。

## ビットマップインデックスのもう一つのメリット
ビットマップインデックスにはもう一つ、OR検索でもインデックスが使用されるという特徴がある。
Bツリーインデックスの場合、性質上OR演算子があるとほとんどの場合インデックスは使用されないので、
その点がBツリーインデックスと異なる点。

例えば

```sql
select * from ユーザー where 血液型 = 'O' or 性別 = '女';
```

というSQLを実行したとする。

血液型Oに該当するビット列は
「001010」
性別が女に該当するビット列は
「010101」

それぞれのビット列の論理和を取ると
「011111」となる。
この結果、鈴木さんから山本さんまでの5レコードがヒットする。

同じ理屈でAND条件(論理積)も使えるが、AND条件の場合はBツリーインデックス有効なのでメリットというほどでもないかと。

## DBMS毎のビットマップインデックスの仕様

### Oracle
Oracleの場合、create index するときに「bitmap」のオプションを付けるとビットマップインデックスになる。

### PostgreSQL
インデックス作成時には指定することはできないが、実行計画では「Bitmap Scan」が確認できる。
どうやらSQL実行時にワーキングメモリ内にビットマップを作成して検索速度を上げているらしい。

### SQL Server
私が調べた限りサポートしてないっぽい。

### 他のDBMS製品
すみませんが未調査です。知る機会があれば、もしくは情報いただければ更新します。
JetsonNanoのSDカードの内容を削除

#JetsonNanoのSDカード内容を削除
SDカードにJetsonインスト後に調子が悪いので再インストしたいとき
Windowsのエクスプローラーからフォーマットできなかったのでコマンドから初期化する方法のメモ

##コマンドラインでSDカード内容を削除
diskpartなる機能で記憶媒体を初期化できるようです

###コマンドラインで「diskpart」を実行
```
diskpart
```

###別ウィンドウが表示
```
Microsoft DiskPart バージョン 10.0.18362.1

Copyright (C) Microsoft Corporation.
コンピューター: PC

DISKPART>
```

###「list disk」接続されている記憶媒体リスト表示
```
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           447 GB      0 B        *
  ディスク 1    オンライン           931 GB      0 B        *
  ディスク 2    オンライン           298 GB      0 B
  ディスク 3    メディアなし             0 B      0 B
  ディスク 4    オンライン            29 GB    29 GB
  ディスク 5    メディアなし             0 B      0 B
  ディスク 6    メディアなし             0 B      0 B
```

###「select disk 4」で選択状態へ

SDカードと思われるディスク番号を指定します、今回はディスク４なので

```
DISKPART> select disk 4

ディスク 4 が選択されました。
```

###「list disk」で記憶媒体リスト表示して選択状態（*）を確認
```
DISKPART> list disk

  ディスク      状態           サイズ   空き   ダイナ GPT
  ###                                          ミック
  ------------  -------------  -------  -------  ---  ---
  ディスク 0    オンライン           447 GB      0 B        *
  ディスク 1    オンライン           931 GB      0 B        *
  ディスク 2    オンライン           298 GB      0 B
  ディスク 3    メディアなし             0 B      0 B
* ディスク 4    オンライン            29 GB    29 GB
  ディスク 5    メディアなし             0 B      0 B
  ディスク 6    メディアなし             0 B      0 B
```

###「list partition」で記憶媒体リスト表示確認
なんかいっぱいある、Jetsonインスト後

```
DISKPART> list partition
  Partition ###  Type                Size     Offset
  -------------  ------------------  -------  -------
  Partition 2    不明                 128 KB  1024 KB
  Partition 3    不明                 448 KB  2048 KB
  Partition 4    不明                 576 KB  3072 KB
  Partition 5    不明                  64 KB  4096 KB
  Partition 6    不明                 192 KB  5120 KB
  Partition 7    不明                 576 KB  6144 KB
  Partition 8    不明                  64 KB  7168 KB
  Partition 9    不明                 640 KB     8 MB
  Partition 10   不明                 448 KB     9 MB
  Partition 11   不明                 128 KB    10 MB
  Partition 12   不明                  80 KB    11 MB
  Partition 1    不明                  11 GB    12 MB
```

###「clean」で削除して初期化が完了
```
DISKPART> clean

```

###SDカードのフォーマットは推奨ソフトで実行
https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write

##参考サイト
- Format your microSD card using SD Memory Card Formatter from the SD Association.<br>https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit#write
プログラミング初心者のエンジニアがやったほうがいいこと

# 目的

- プログラミング初心者のエンジニアが実施したほうが良いことをまとめる  
※筆者の主観がほとんどです。

# 実施すべきこと(優先度:高)

- エンジニア系のPodcastを聞こう
- Progateで技術をつけよう
- 疑問に思ったことはためらわずに調べよう
- 本やサイトで得た情報はアウトプットしよう
- たくさんの言語に手を出さず勉強しよう
- 毎日1ステップでもいいのでコードを書こう

# 実施すべきこと(優先度:中)

- 勉強会やイベントに参加しよう(開催情報はtwitterやPodcastで掴もう)
- 技術書典に行ってみよう
- 興味のある分野の社外コミュニティに参加してみよう
- 個人で目標を決めてサービスを作ってみよう

# 実施すべきこと(優先度:低)

- meet up で登壇をしてみよう
- 自分の経歴や強み、出来ることを棚卸しして整理しよう
- 参加した勉強会やイベントのまとめ記事をアウトプットしよう
ec2インスタンスでk3sを使う

# k3sとは
- プチKubernetes
- 超軽い 40MBくらい
- k8sから5機能が削がれている
- mac,windowsでは使用できず、Linuxだけ


## 環境
- AWS EC2
- Amazon Linux 2

## k3sのインストール

```
yum -y install wget
cd /usr/local/bin/
wget https://github.com/rancher/k3s/releases/download/v0.2.0/k3s
chmod 755 ./k3s
```

## 起動

```bash
k3s server &
```

## 起動確認

```
# k3s kubectl get node
NAME                                               STATUS   ROLES    AGE   VERSION
ip-172-31-37-113.ap-northeast-1.compute.internal   Ready    <none>   99s   v1.13.4-k3s.1
```

# nginxを起動してみるテスト

## テンプレート作成

```nginx-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.5
        ports:
        - containerPort: 80
```


## 起動

```
k3s kubectl apply -f nginx-deployment.yaml
```

## サービスを定義

```
k3s kubectl expose deployment/nginx --type="NodePort" --port 80
```

## ポートを確認

```
[root@ip-172-31-37-113 bin]# k3s kubectl get service
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.43.0.1      <none>        443/TCP        12m
nginx        NodePort    10.43.18.161   <none>        80:30845/TCP   47s
```

## ローカルからアクセス

```
[root@ip-172-31-37-113 bin]# curl -i http://localhost:30845
HTTP/1.1 200 OK
Server: nginx/1.7.5
Date: Wed, 18 Sep 2019 02:25:19 GMT
Content-Type: text/html
```

## リモートからアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/7331b708-616f-d6c4-8829-3bf86376c634.png)


## 参考
https://tech-lab.sios.jp/archives/13564
https://qiita.com/lughshot/items/5f7165c1fc5b55779746
pythonで直線検出するアルゴリズム

# 直線検知のアルゴリズム
 Pythonで画像内の直線検知を行うアルゴリズムを書く。(2019年)

## 直線検知の主なアルゴリズム
- Hough変換
- LSD(Line Segment Detector)
    - Pylsd
    - OpenCV

※OpenCV3.4.4ではLSDはあるが、4.1.0からは削除されている。
代わりに*FastLineDetector*というものがあるが、まだ試していない。(2019年9月18日現在)

## 各アルゴリズムの中身

### ハフ変換
簡単に言うと多数決で直線を検出する方法
画像上のすべての点に対してその点を通る直線を検出し、直線を表すパラメータ群を輝度値で重み付けしていく。
重み付けされた直線を画像に書いていくと、直線が多く通る部分が濃くなり、直線だとわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422261/ebb10e00-91d1-5ffa-4af2-f53c91cf6089.png)
[画像引用 amos storkey](http://homepages.inf.ed.ac.uk/amos/hough.html)

## LSD
輝度勾配とLevel Lineの角度を計算する。
輝度勾配は明るさに勾配を表し、LevelLineは異なる領域と分けられる線分を示す。
LevelLineのと勾配によって以下のような図を作成し、領域の推定を行う。
その後、領域を矩形に近似することで直線を検出する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/422261/83d33a5f-c2a5-a12f-a8f3-2b5bb5f8d929.png)
[画像引用](https://rest-term.com/archives/3393/)


## メリット、デメリット
* Hough変換
    - メリット
        - 固定の形式であればパラメータにより最適化できる。
    - デメリット
        - パラメータ探索をグリッドサーチしないと行けないので時間がかかる。
        - 探索精度は高いが演算不可が高い。(低いHoughLinePというものもあるが精度が下がる。)

* LSD(LineSegmentDetetor)
    - メリット
        - パラメータの設定が不要
    - デメリット
        - パラメータの設定が出来ない分、入力画像の前処理を行ったりして精度を上げないといけない(?) ※検証中

## 所感
Hough変換よりもLSDでの直線検知の方が使いやすくて、精度も高い気がする。
LSDはOpenCVで実装されていたが権利周りで違反していたようで削除された。
代わりに`FastLineDetector`が実装されている。(OpenCV==4.1.0)
`Pylsd`というものもあるので検証を行ってみて精度の高い方を使用したほうがいい気がした。

## 使い方

``` Hough_transform.py
import cv2

src = 'hoge.png' #入力画像のパス
img = cv2.imread(src)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_bitwise = cv2.bitwise_not(gray)
lines = cv2.HoughLinesP(gray2, rho=1, theta=np.pi/360, threshold=80, minLineLength=80, maxLineGap=5) #全探索
# lines = cv2.HoughLinesP(gray2, rho=1, theta=np.pi/360, threshold=80, minLineLength=80, maxLineGap=5) #確率的探索
for line in lines:
    x1, y1, x2, y2 = line[0]
    # draw line
    lines_img = cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 1)
cv2.imwrite('lined_hoge.png', lines_img) 
```
[パラメータ説明はここ参照](https://docs.opencv.org/3.0-beta/modules/imgproc/doc/feature_detection.html?highlight=cv2.houghlines#cv2.HoughLines)


```Opencv_lsd.py
import cv2

src = 'hoge.png' #入力画像のパス
img = cv2.imread(src)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
mono, th2 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)

LSD = cv2.createLineSegmentDetector()
lines, width, prec, nfa = LSD.detect(src)
lines = lines.tolist()
for idx,l in enumerate(lines):
    x1,y1,x2,y2 = l[0][0],l[0][1],l[0][2],l[0][3]
    # draw line
    lines_img = cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 1)
cv2.imwrite('lined_hoge.png', lines_img)
```

Pylsdを使用する際はインストールに注意が必要そう。
python3に対応させるには以下の方法でインストール
```pip install 'ocrd-fork-pylsd == 0.0.3'```
[参考:pythonの直線検出は間違いなくOpenCVではなくPylsdが優れている](https://qiita.com/daikiclimate/items/29ad639e7b8e8a1a5263)


```Pylsd.py
from pylsd.lsd import lsd

src = 'hoge.png' #入力画像のパス
img = cv2.imread(src)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# gray = cv2.GaussianBlur(gray,(5,5),5) # ガウシアンフィルタを使用した方が良いらしい
linesL = lsd(gray)
for line in linesL:
    x1, y1, x2, y2 = map(int,line[:4])
    lines_img = cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 1)
cv2.imwrite('lined_hoge.png', lines_img)
```