OmniAICreator/Qiita-1.07M huggingface dataset:
Raspberry Piの固定IP化

Raspberry PiにSSHやNVCで接続するのに、動的IPだと何かと不便なので固定IP化したときの備忘録。

LXTerminalで/etc/dhcpcd.confを編集。

```
pi@raspberrypi:~ $ nano /etc/dhcpcd.conf
```

以下を追記。

```/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.3.100/24
static routers=192.168.3.1
static domain_name_servers=192.168.3.1
```

追記したら、Ctrl+Xでnanoエディタを終了。
「変更されたバッファを保存しますか？」と表示されたら、「Y」キーを押す。
「書き込むファイル～」と表示されたら、「Enter」キーを押す。

その後、Raspberry PiをReboot。

Reboot後、「ifconfig」で反映されているか確認。

```
pi@raspberrypi:~ $ ifconfig
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.100  netmask 255.255.255.0  broadcast 192.168.3.255
        inet6 2400:2412:1122:3e00:ebbc:7a28:93ce:af03  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::5c14:91fc:74f3:116d  prefixlen 64  scopeid 0x20<link>
        ether b8:27:eb:2b:71:13  txqueuelen 1000  (イーサネット)
        RX packets 24  bytes 4603 (4.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 44  bytes 7171 (7.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

以上。
Qiita-dockerお宝鑑定団(2)haskell 収集中 docker(99)

haskellを使う知人は多い。
実用的に全く使ったことがないだけでなく、実際に動かすこともなかった。

Qiita-dockerお宝鑑定団を始めた目的は、こういう自分が使ったことがない言語のソースの動作を確かめるために、いつでも簡単に呼び出して保存しておける場所を作ること。

第２弾ではhaskellを取り上げる。

順次、自分の興味があるプログラムを一覧にしていく予定。

なお、プログラムを自分で少し直した場合は、
プログラムちょい替え（0）一覧
https://qiita.com/kaizen_nagoya/items/296d87ef4bfd516bc394
の方に掲載予定。こちらは、Qiitaのプログラムだけでなく、Wikiに掲載されているプログラムや、オープンソースのプログラムを含みます。

# docker hub からの呼び出し手順（ネット接続処理しない場合）

```
$ docker run -it kaizenjapan/haskell /bin/bash
```

###2. 1 今年の素数日を求める
https://qiita.com/little_Haskeller/items/dd9207c3a85c0acd2ad4

```shell-session
# runghc primeDaysIn.hs 2016
2016-03-19
2016-04-01
2016-04-03
2016-05-29
2016-06-01
2016-06-07
2016-06-11
2016-07-09
2016-07-27
2016-08-09
2016-08-17
2016-08-21
2016-09-23
2016-10-07
2016-10-13
2016-10-19
2016-10-21
2016-10-27
2016-11-03
# runghc primeDaysIn.hs 2017
2017-01-21
2017-02-19
2017-02-23
2017-03-01
2017-03-03
2017-03-31
2017-04-21
2017-05-11
2017-05-19
2017-06-07
2017-06-27
2017-08-07
2017-08-31
2017-09-01
2017-09-03
2017-10-17
2017-11-01
2017-12-01
2017-12-19
c# runghc primeDaysIn.hs 2018
2018-01-23
2018-02-13
2018-02-21
2018-03-11
2018-03-27
2018-05-09
2018-06-09
2018-06-21
2018-06-27
2018-07-07
2018-07-31
2018-08-01
2018-08-07
2018-10-19
2018-11-21
2018-12-09
2018-12-23
2018-12-29
c# runghc primeDaysIn.hs 2019
2019-02-21
2019-02-27
2019-03-01
2019-03-19
2019-03-23
2019-04-21
2019-05-23
2019-05-29
2019-06-01
2019-06-13
2019-07-19
2019-08-11
2019-08-23
2019-09-13
2019-10-09
2019-10-27
2019-11-09
2019-11-17
2019-12-31
# runghc primeDaysIn.hs 2020
2020-01-09
2020-01-11
2020-01-21
2020-01-23
2020-02-23
2020-03-09
2020-04-29
2020-05-11
2020-05-29
2020-06-13
2020-06-19
2020-07-03
2020-07-11
2020-07-21
2020-07-23
2020-07-29
2020-08-01
2020-08-13
2020-09-03
2020-10-21
2020-10-29
2020-11-01
2020-11-13
2020-12-27
2020-12-31
```

# docker作成手順

```shell-session:macOS
docker run -it ubuntu /bin/bash
```
dockerでは

```shell-session:docker
# apt update
# apt upgrade -y
# apt install ghc
# apt install -y vim sudo wget 
```

この後、上記

# docker hub 登録手順

```shell-session:macOS
$ docker ps 
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
085623b6e352        ubuntu              "/bin/bash"         18 minutes ago      Up 18 minutes                                determined_rosalind
$ docker commit 085623b6e352 kaizenjapan/haskell
$ docker push kaizenjapan/haskell
```


# 参考資料(reference)
haskell 入門の入門https://qiita.com/kaizen_nagoya/items/a305b12393bf7cdd55d7


# 文書履歴(document history)
ver. 0.01 初稿 20190525 朝
ver. 0.02 参考資料 20190525 午前
ver. 0.03 標題追記 20191231
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
APIを用いたベット分析

#APIを用いたベット分析
今回の研究の動機は知人にPinnacle Sportsのデータの分析を依頼されたことです。
公式にAPIが提供されているので、それを用いてデータの取得と分析を行います。

###Rパッケージ
おそらく最も容易な方法はPinnacleのRパッケージを使うことです。

パッケージ名：*Pinnacle.API*
https://github.com/marcoblume/pinnacle.API#README

###導入手順
まずはRStudioでパッケージをインストールします。

![RStudio 2019_05_25 8_10_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393886/1a53a014-7d6b-09a6-3db0-509807fe208d.png)

RStudioで以下のコードを書くことでAPIが使えるようになります。

```R:
library(pinnacle.API)

username <- "ユーザー名"
userpass <- "パスワード"

SetCredentials(username, userpass)
AcceptTermsAndConditions(accepted = TRUE)
```

ユーザー名、パスワードにはそれぞれPinnacle Sportsで使っているusername, userpassをそれぞれ入力します。

###データの取得
実際にデータを取得してみます。

```R:
currentDate <- as.POSIXlt(Sys.Date(), tz = "UTC")

dfSum <- NULL

for (i in 1:2) {
  df <- GetBetsList(fromDate = currentDate - i * 30 * 24 * 60 * 60,
                    toDate = currentDate - (i-1) * 30 * 24 * 60 * 60)
  dfSum <- rbind(df, dfSum)
}

dfSum <- dfSum[order(dfSum$bets.betId),]
```

データを一回に取得できる日時の範囲が上限30日に制限されています。
ループで区切って30日ごとのデータを取得し、`rbind`で縦につなげています。
今回は4月1日からの2ヶ月間のデータを取得する目的なので、ループは2回しか回していません。
過去1年分など取得したければループの回数を増やせばよいです。
最後に`order`を使って、日時の順番(正確にはbetIdの順)に並び替えています。

###データの保存
保存したいディレクトリやファイル名を指定して、データフレームをCSVに保存します。

```R:
file <- "pin.csv"
write.csv(dfSum, file)
```

###データの解析
データは取得できたので、Rでもpythonでも好きな言語でいろいろ分析できます。
Rでそのままヒストグラムを描いてみます。

```R:
score <- c(dfSum$bets.ftTeam1Score, dfSum$bets.ftTeam2Score)
hist(score, breaks = seq(-0.5,15.5,1), col="green")
```

![Rplot.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/393886/fb787f7f-8399-5206-6d0b-890c8d329aa3.jpeg)

###まとめ
今回はAPIを使ってRでデータ分析を行う方法を紹介しました。
ご意見などあればコメントお願いします。
lsでディレクトリ名のみを取得する

調べたら

```bash
ls -l | grep ^d
```

とかって出るけど、これだと

```bash
drwxr-xr-x  4 XXX  1990765396   128  5 25 07:46 bookmark
drwxr-xr-x  4 XXX  1990765396   128  5 24 00:21 category
drwxr-xr-x  7 XXX  1990765396   224  5 25 07:52 category_group
drwxr-xr-x  7 XXX  1990765396   224  5 25 07:52 contract
```

とか出力されて使い勝手いくない。

```bash
ls -l | grep ^d | awk '{print $9}'
```

だと

```bash
bookmark
category
category_group
contract
```
でいいかんじ。
（$9の部分って環境によって違うのかな？？）

これでfor文とかに入れてチョメチョメ出来る。

```bash
for file in `ls -l | grep ^d | awk '{print $9}'`; do
    echo "${file}"
done
```
mac のターミナルで Finderを開く

## mac のターミナルで Finder を開く
  
ターミナルを開いて作業をしてて、そのディレクトリを Finder で開きたいと思ったら...  
```
$ open .
```
  
で OK だった  
例えば、root ディレクトリを開きたかったら...  
```
$ open ~
```
  
知ってる人は知ってるんだろうけど、自分は最近知った...  
結構便利
パワポマクロ　クリップボードの文字列を取得(参照設定しない)

パワポでクリップボードの値を取得する方法を記載します。
あまり用途はないけど、たまたま作ったので記録。

通常、クリップボードの値を取得するには参照設定が必要だが、いろいろ制約があったので迂回した。

##ロジック
- クリップボードの値を、新規のShapeに値貼り付け
- 作成したShapeから文字列を取得
- 作成したShapeを削除

```visualbasic
Public Sub Test() As Slide
    Dim ActiveSlide As Powerpoint.Slide

    Dim sText As String 


    Set ActiveSlide =  ActivePresentation.Slides.FindBySlideID(ActivePresentation.Windows(1).Selection.SlideRange.SlideID)
    On Error GoTo err_
    
    With ActiveSlide.Shapes.PasteSpecial(ppPasteText)
        sText = .TextFrame.TextRange.Text
        .Visible = False
        Call .Delete
    End With

    On Error GoTo 0

    Set ActiveSlide = Nothing

    MsgBox sText 
err_:
End Function

```
パワポマクロ ActiveSlide関数を作成

# パワポにはアクティブなスライドを取得するプロパティがない。

ExcelでいうActiveSheet、ActiveWorkbookみたいなのがあると楽なのですが、パワポにはありません。
ActivePresentationというプロパティはあるので、そこから自作関数を作成。

```visualbasic
Public Function ActiveSlide() As Slide
  Dim silideAt As Slide
   
  Set ActiveSlide = ActivePresentation.Slides.FindBySlideID(ActivePresentation.Windows(1).Selection.SlideRange.SlideID)
End Function
```

いまのところ問題なく利用できている。
GoでMySQLのJSON型を扱う

## はじめに

最近GoとMySQLのJSON型と戯れたのでその足跡を残します。
近頃ののMySQLやPostgreSQL（MySQL5.7やPostgreSQL9.4以降）はJSON型をサポートしています。
https://dev.mysql.com/doc/refman/5.7/en/json.html

上手に使えばRDBの利点を活かしながらNoSQLの利点も享受することができます。
もちろん単純にMongoDB等やPaaSやDaaSなどと比較するのは早計なのでユースケースや要件をよく確認しましょう。

## JSON型の利点

ここでは例として多言語対応フィールドについて考えてみます。
JSON型を利用しない場合は多言語フィールドを別テーブルに保存することもあるでしょう。

```sql
CREATE TABLE IF NOT EXISTS `user` (
  id         VARCHAR(36) PRIMARY KEY,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL
);

CREATE TABLE IF NOT EXISTS `i18n_user_name` (
  user_id VARCHAR(36) NOT NULL,
  locale  VARCHAR(15) NOT NULL,
  name    VARCHAR(50) NOT NULL,
  FOREIGN KEY (user_id) REFERENCES `user`(id) ON DELETE CASCADE,
  CONSTRAINT `i18n_user_name_pk` PRIMARY KEY (`user_id`, `locale`)
);
```

もし仮に名前だけでなく別のリソース（例えば自己紹介文とか？）が存在したとしてそれらも多言語対応しようとすると、さらにテーブルを増やさなくてななりません。

しかしJSON型を使うとこのように次のように表現可能です。

```sql
CREATE TABLE IF NOT EXISTS `user` (
  user_id    VARCHAR(36) PRIMARY KEY,
  name       JSON NOT NULL,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL
);
```

以下のように多言語リソースを保持すればJSONのままでゆるくデータを保存できます。

```json
{
  "ja": "日本語",
  "en": "English"
}
```

またプレーンテキストではなくリッチテキストかもしれません。
[Draft.js](https://github.com/facebook/draft-js)などもReactプロジェクトでよく使われています。
JSON型であればこのようなデータもHTMLに変換することなく構造保ったまま保存できます。

ここではJSON型の詳しい扱いかたには触れません。
様々なJSON型用の関数があるのでクエリに組み込むことも可能ですし、生成カラムを使って特定のキーにインデックスを作成したりもできます。
参考 https://dev.mysql.com/doc/refman/8.0/en/json-function-reference.html

## ScannerとValuer

`database/sql`の`Scanner`インターフェースと`database/sql/driver`の`Valuer`インターフェースを使うとスッキリかけます。

まずこんな感じの型を用意しておきます。

```go
type JsonObject map[string]interface{}

func (j *JsonObject) Scan(src interface{}) error {
	var _src []byte
	switch src.(type) {
	case []byte:
		_src = src.([]byte)
	default:
		return errors.New("failed to scan JsonObject")
	}
	if err := json.NewDecoder(bytes.NewReader(_src)).Decode(j); err != nil {
		return err
	}
	return nil
}

func (j JsonObject) Value() (driver.Value, error) {
	b := make([]byte, 0)
	buf := bytes.NewBuffer(b)
	if err := json.NewEncoder(buf).Encode(j); err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}
```
Jetson NanoでCuPy

# はじめに

Chainerを使う前にCuPyをGPUで動かすことが必要なのでその為の実験。

# 事前準備

環境を分けることを考えて`pipenv`を用いる。

```bash
yamamo-to@jetson-nano:~$ sudo apt install python3-pip
yamamo-to@jetson-nano:~$ pip3 install pipenv --user
```
`pipenv`が`$HOME/.local/bin`にインストールされるが既にPATHは通っていた。~/.profileに同パスを読み込むようになっていた。.bash_profileを使う場合はPATHが通らないので、その場合は下記のコマンドで通す必要がある。

```bash
yamamo-to@jetson-nano:~$ export PATH=$HOME/.local/bin:$PATH
```

またインストール前に周波数を上げる。

```bash
yamamo-to@jetson-nano:~$ sudo jetson_clocks
```

さらにメモリが不足したとき用にスワップを用意する。

```bash
yamamo-to@jetson-nano:~$ sudo fallocate -l 4G /swapfile
yamamo-to@jetson-nano:~$ sudo chmod 600 /swapfile
yamamo-to@jetson-nano:~$ sudo mkswap /swapfile
yamamo-to@jetson-nano:~$ sudo swapon /swapfile
```

# インストール

1時間近く時間がかかったがインストールはできたようだ。

```bash
yamamo-to@jetson-nano:~$ mkdir ~/Documents/Chainer
yamamo-to@jetson-nano:~$ cd ~/Documents/Chainer
yamamo-to@jetson-nano:~/Documents/Chainer$ pipenv --three
yamamo-to@jetson-nano:~/Documents/Chainer$ pipenv install cupy
```
![cupy_src.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/d494a523-006d-99f2-9832-596373452ee9.png)


# 動作確認

とりあえずpython3でCuPyが動く。

```bash
yamamo-to@jetson-nano:~/Documents/Chainer$ pipenv run python3 -c 'import cupy as cp; print(cp.__version__)'
6.0.0
```

サンプル[^1]を参考に下記のようなcupy_test.pyを作成し動作確認を行う。

```python:cupy_test.py
import cupy as cp

cp.cuda.Device(0).use()
x_gpu = cp.array([1, 2, 3])
l2_gpu = cp.linalg.norm(x_gpu)
print(l2_gpu)
```
[^1]: https://docs-cupy.chainer.org/en/stable/tutorial/basic.html

このプログラムを実行すると

```bash
yamamo-to@jetson-nano:~/Documents/Chainer$ pipenv run python3 cupy_test.py
3.7416573867739413
```

なお存在しないGPUを指定すると確かにエラーとなる。

```bash
yamamo-to@jetson-nano:~/Documents/Chainer$ pipenv run python3
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cupy as cp
>>> cp.cuda.Device(1).use()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "cupy/cuda/device.pyx", line 135, in cupy.cuda.device.Device.use
  File "cupy/cuda/device.pyx", line 141, in cupy.cuda.device.Device.use
  File "cupy/cuda/runtime.pyx", line 193, in cupy.cuda.runtime.setDevice
  File "cupy/cuda/runtime.pyx", line 145, in cupy.cuda.runtime.check_status
cupy.cuda.runtime.CUDARuntimeError: cudaErrorInvalidDevice: invalid device ordinal
```

# おまけ
wheel版をインストールしようとしたら見事に失敗した。
![cupy_wheel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/5b2e748b-6e2d-7adf-8622-97603aa9e2cd.png)
[Mac] HomebrewとVSCodeで快適LaTeX環境構築 (2019)

## はじめに

この記事では，HomebrewとVSCodeでLaTeXの環境構築を行います．
この手順を踏むことによって，最終的にVSCodeを使ってLaTeXファイルを自動コンパイルすることができます．
この環境が一番快適かつシンプルで、構築も楽だと思っています．

Mac向けのLaTeXディストリビューションは[MacTeX](http://www.tug.org/mactex/)が有名ですが，GUIアプリ(恐らく使わない)などが入っているため容量が3.9GB程度と，かなり大きいです．
そのため，ここでは最小構成であるBasicTeXを使います．これなら容量が100MB程度と，かなりコンパクトです:+1:

## Install

HomebrewでBasicTeXとGhostscriptをインストールします．

```shell
brew cask install basictex
brew install ghostscript
``````

## Setup

1\. BasicTeXの設定

```shell
sudo tlmgr update --self --all
sudo tlmgr paper a4
sudo tlmgr install collection-langjapanese
```

2\. ヒラギノフォント適用

ヒラギノフォントにしたい方はどうぞ．

```shell
sudo tlmgr repository add http://contrib.texlive.info/current tlcontrib
sudo tlmgr pinning add tlcontrib '*'
sudo tlmgr install japanese-otf-nonfree japanese-otf-uptex-nonfree ptex-fontmaps-macos cjk-gs-integrate-macos
sudo cjk-gs-integrate --link-texmf --cleanup
sudo cjk-gs-integrate-macos --link-texmf
sudo mktexlsr
sudo kanji-config-updmap-sys --jis2004 hiragino-highsierra-pron
```

3\. Latexmkのインストール

自動コンパイルしてくれるやつです．

```shell
sudo tlmgr install latexmk
```

## VSCode

1\. [LaTeX Workshop](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)をインストール

2\. VSCodeの`settings.json`に以下を追記

```json:settings.json
{
    "latex-workshop.latex.tools": [
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-e",
                "$latex=q/uplatex %O -synctex=1 -interaction=nonstopmode -file-line-error %S/",
                "-e",
                "$bibtex=q/upbibtex %O %B/",
                "-e",
                "$biber=q/biber %O --bblencoding=utf8 -u -U --output_safechars %B/",
                "-e",
                "$makeindex=q/upmendex %O -o %D %S/",
                "-e",
                "$dvipdf=q/dvipdfmx %O -o %D %S/",
                "-norc",
                "-pdfdvi",
                "%DOC%"
            ]
        }
    ]
}
```

## LaTeXのテスト

1\. LaTeXが使えることを確かめるために，以下のファイルを作成してください．

```latex:test.tex
\documentclass[a4j,11pt,uplatex]{jsarticle}
\begin{document}

吾輩は猫である。名前はまだ無い。

どこで生れたかとんと見当がつかぬ。
何でも薄暗いじめじめした所で
ニャーニャー泣いていた事だけは記憶している。
吾輩はここで始めて人間というものを見た。

\end{document}
```

2\. このファイルを保存すると自動コンパイルされ，同ディレクトリにPDFファイルが生成されているはずです．

3\. 良きTeXライフを:+1:

## 参考リンク

- https://texwiki.texjp.org/?BasicTeX
ローカルリポジトリAをリモートリポジトリとして利用する

[github] <--> [PC-A] <--> [PC-B]
みたいな環境で開発はPC-Bで行いたいが、Bからgithubに直通できない状況を想定。
（※A-BはSSHで接続可能）

```bash
> ssh user@pc-a
password: *****
> cd ~/ProjectName
> git config --bool core.bare true # これがFalseだとpushを受け付けない
> exit

> git clone ssh://user@pc-a/~/ProjectName
password: *****

> cd ProjectName
> touch hoge < echo "Makimaki is very cute!"
> git add hoge
> git commit -m "Add file"
> git push
```

pushしたものはPC-A上でもコミットが積み上げられる。最終的にPC-Aでpushすればgithubにも反される。


PS
bare=trueにすると、PC-A上でコミット等ができなくなる。
PC-Bでの作業が終わったらPC-Aでbare=falseに戻すことでPC-AでGit作業が出来るように戻った。
HTTPを理解する② リクエストとレスポンス

## HTTPメッセージ
webブラウザとサーバーがデータをやりとりするさいに利用するデータ形式をHTTPメッセージといいます。このHTTPメッセージはwebブラウザからのHTTPリクエスト、サーバーからのHTTPレスポンスの二つに分けることができます。またHTTPは一つのリクエストに対して一つのレスポンスを返します。

## HTTPリクエスト
HTTPリクエストはwebサーバーに対して「この情報がほしい」、「情報を送信したい」といったことを伝えます。このHTTPリクエストはリクエストライン、リクエストヘッダー、空白行、メッセージボディの四つに分けることができます。

### リクエストライン
この行ではwebサーバーに対してどのような処理をしてほしいのかを伝える情報が入っています。下記がリクエストラインの例です。
GET/sample.html HTTP/1.1

GET = リクエストメソッド。webサーバーに対する要求を示す。GETだと取得を意味する。
/sample.html = URI。webサーバーにリクエストしたデータを示す。
HTTP/1.1 = HTTPのバージョン

### リクエストヘッダー
webブラウザの種類や対応しているデータのタイプ、データの圧縮方法、言語などの情報を伝える。

### 空白行
1行空けメッセージヘッダーが終了したことを伝える。

### メッセージボディ
webサーバーにデータを送るために使われる。空の場合もある

## HTTPレスポンス
webブラウザから受け取ったHTTPリクエストをwebサーバーは処理の結果をHTTPレスポンスとして返します。HTTPレスポンスはステータスライン、レスポンスヘッダー、空白行、メッセージボディの四つに分けられます。

### ステータスライン
webブラウザに処理結果をかえす
HTTP/1.1 200 OK
HTTP/1.1 = HTTPのバージョン。
200 = ステータスコード。リクエストに対するwebサーバーの処理の結果を数字で表したもの。
OK = ステータスコードに付随するテキスト

### レスポンスヘッダー
webサーバーのソフトウェア情報や、返信するデータのタイプ、データの圧縮方法などの情報を伝える

### 空白行
1行空けメッセージヘッダーが終了したことを伝える。

### メッセージボディ
HTMLや画像などのデータを格納する場所
Google Apps Script プロジェクトの再公開でハマったこと

# 現象

既に公開されていたプロジェクトにアクセスできなくなり、再度公開しようとしても認証プロセスに進まず、以下のようなエラーになって公開できなくなりました。
`Untitled project needs your permission to access your data on Google.`
`The OAuth client was deleted.`

# 解決方法

プロジェクトをバックアップした上で、新規に作り直して公開操作をしたところ、認証プロセスが進行して元通り公開できました。(URLは変更になります)

# 原因

そもそもは、Google API Consoleで何か壊してしまったことが原因なのですが…。
AngularJSでDIを必要とする状態を持つオブジェクトを生成する

`Angular` ではなく、未だに `AngularJS` と戦う同志に捧ぐ。


以下のような `service` で実装された `ServiceA` `ServiceB` に依存し、かつ状態を持つオブジェクトをAngularJSで実装するためのテクニックの共有です。

```js
class ModelA {
  constructor(ServiceA, ServiceB, state) {
    this.ServiceA = ServiceA;
    this.ServiceB = ServiceB;

    this.state = state;
  }
}
```

AngularJSの提供する `service` `factory` はシングルトンオブジェクトを返す仕組なので状態を持つオブジェクトの生成には利用できません。
仕方なくコントローラーに該当オブジェクトの生成に必要な依存オブジェクトをDIしてコントローラー内で生成するという方法しかできません。
画面数、component数が多いとコントローラーに膨大な依存オブジェクトのDIの記述が並び、重複したコードが至るところに出現してメンテナンス性を下げます。

以下のような `service` を導入することでこの問題を解決することができます。
上記の `ModelA` を必要なコントローラーは `FactoryService` をDIして `createModelA` 関数を実行すれば `ModelA` のインスタンスを生成して利用できます。

```js
class FactoryService {
  constructor(ServiceA, ServiceB) {
    'ngInject';
    this.ServiceA = ServiceA;
    this.ServiceB = ServiceB;
  }

  createModelA(state) {
    return new ModelA(this.ServiceA, this.ServiceB, state);
  }
}

app.service('FactoryService', FactoryService);
```

この実装パターンの利点は文脈に応じたインスタンス生成が実現できることです。
インスタンス生成の関数に文脈を表現する引数を追加することで生成するインスタンスを複数の候補から選択することができるよになります。
Flutter で"Error connecting to the service protocol:HttpException"が発生したら[忘備録]

# 発生状況、環境
OS: Windows10 Home バージョン1809
Flutter: Flutter 1.5.4-hotfix.2 Dart 2.3.0
IDE: Android Studio 3.4.1
AVD: Pixel 3 OS: Q 

Android Studioをインストール後、
Flutterプラグインをインストール、
New Flutter Projectでプロジェクト作成直後にRun
エミュレータ上ではアプリは立ち上がったものの、コンソールに以下のような表示
HotReloadが効かなくなってしまいました(Flutterの良いとこが・・・)

```
Launching lib\main.dart on Android SDK built for x86 in debug mode...
Initializing gradle...
Resolving dependencies...
Running Gradle task 'assembleDebug'...
Built build\app\outputs\apk\debug\app-debug.apk.
Installing build\app\outputs\apk\app.apk...
Error connecting to the service protocol: HttpException: Connection closed before full header was received, uri = http://127.0.0.1:54217/mB72oudgKOI=/ws
```


エラーメッセージで検索してものの出てくるのはmac環境だったりでいまいち解決法もいまいちわからず
YouTubeで検索したらそれらしき[動画](https://www.youtube.com/watch?v=6gS0_s2K_gk)が・・・

# 解決法
原因がいまいちわかってないので解決法と言えるかわかりませんが
Android Qだと発生するよう
エミュレータをAndroid Piに変更したらエラーは表示されず
HotReloadも無事動作しました。

もし同じような状況でエラーか発生するような方がいたらお試しください
THE CULTURE CODEを読んで

この記事は私の読書感想文です。そのタイトルも「THE CULTURE CODEを読んで」。
社内公開した記事をこちらにもあげてみました。

## 本の概要
最強チームを作るために必要なスキルは3つ。
3つそれぞれに関するチームの実例を示しながら、実践方法を示してくれる本。

## 3つのスキルとは
#### 1. 安全な環境をつくる
#### 2. 弱さを共有する
#### 3. 共通の目標を持つ

## 前提、モチベ
最強のチームは最強の人たちの集まりではない
むしろ最強の人たちが集まっただけでは最強のチームにはならない
どんな人が集まっても、最強のチームになりうる
つまり私たちも最強のチームになれる
最強のチームになれば、個人はものすごい力を発揮し、1人で成し得なかったことを達成できる
なので最強のチームをつくろう、最強のチームになろう

## 3つに関して私なりの解釈
### 1. 安全な環境をつくる
#### 安全な環境とは？
「発言や行動によって自身が脅かされることがない」ことを全員が理解している状況。
発言や行動が正しかった場合、それがチームに反映される環境。
発言や行動が正しくなかった場合、人格を脅かされることなくfbを受け、より良い方向に軌道修正できる環境。
なので、発言と行動をしたいし、それができる環境。
そして、そのような環境に対する帰属意識を全員が持っている状況。

#### 安全な環境を構築するには
- 「ここは安全である」というシグナルを送る、送り続ける
※シグナルについては本を参照、直接的な言葉ではない別のものとして定義されている
- 話を聞きすぎるほど聞く
- 物理的距離の近さを保つ
※自分を脅かすことのできる距離まで近づいても脅かしてこない→安全だ
- 愛を注ぎ込む、注ぎ込み続ける
※充電し続ける。一度100%になったら終わりではない。気づいたら減っているから。
- しつこいほどに「ありがとう」を伝える
- 全員に平等に発言権を与える
- 楽しむ
※人が笑うのは、心から安心し、仲間とのつながりを信じている証拠だ

### 2. 弱さを共有する
#### 弱さを共有するとは？
分からないことを「分からないです」と言うこと
できないことを「できないです」と言うこと
なので「教えてください」と言うこと

#### 弱さを共有するには
その場所が ***1. 安全な環境*** であることを前提として...

- 「貴方の力が必要だ」ということを伝える、伝え続ける
※これも充電し続ける。一度100%になったら終わりではない。気づいたら減っているから。
-  ネガティブなfbは直接会って伝える
※文面だと誤解を招きやすい。ネガティブなことを伝える時こそ、気持ちのケアを怠らない。
-  価値のあることを言いたいという衝動を抑え、すぐアドバイスしない
※「私は貴方の知らない解決策を知っている」を披露しない。すぐ上に立とうとしない。
※アドバイスを求めている時もあるので、時と場合による。
-  代わりに「それについてもっと話して」と聞く
-  何を言うかより何を言わないかが大事
-  率直な意見交換の場を設ける(率直な意見交換は個人攻撃ではない)
-  協力関係を強調する言葉を選ぶ
※「一緒に」「お互い」「みんなで」
※上記の言葉は「私1人じゃできないから」という弱さを暗示している

### 3. 共通の目標を持つ
#### 共通の目標を持つためには
- チームの優先順位を明らかにする
- それを言葉にして伝える、伝え続ける
※伝わったと思っていても、伝わっていないことが多い
- キャッチフレーズを活用する
※キャッチフレーズが陳腐なのは欠陥ではなく仕様。安っぽい言葉は分かりやすく、人の耳に届きやすいという長所があり、それが本来の働き。
<効果的なキャッチフレーズ>
1.シンプルで分かりやすいこと
eg. AはBだ
2.行動志向であること(行動指針になること)
eg. Aをする、Bをしない

## 共感したこと、思ったこと
- チームの構築は人間関係の構築と一緒だなあ。一緒というか、まさに人間関係構築そのものなのだが、、個人の関係にも応用できるなあ。
- 「二流の仕事は精神に悪影響を与える」
← 某一流ホテルのレストランのホールをしたことがあるのだが、本当にそうだなと納得
- 「変化には時間がかかる」
←「ローマは1日にして成らず」という言葉があるが、「チームも1日にして成らず」だと思った

## link
[THE CULTURE CODE(Amazonリンク)](https://www.amazon.co.jp/CULTURE-CODE-%E2%80%95%E3%82%AB%E3%83%AB%E3%83%81%E3%83%A3%E3%83%BC%E3%82%B3%E3%83%BC%E3%83%89%E2%80%95-%E6%9C%80%E5%BC%B7%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E6%96%B9%E6%B3%95/dp/4761273828/ref=sr_1_1?qid=1555561170&refinements=p_27%3A%E3%83%80%E3%83%8B%E3%82%A8%E3%83%AB%E3%83%BB%E3%82%B3%E3%82%A4%E3%83%AB&s=books&sr=1-1&text=%E3%83%80%E3%83%8B%E3%82%A8%E3%83%AB%E3%83%BB%E3%82%B3%E3%82%A4%E3%83%AB)
WSLのデフォルトシェルが真っ白になった話(.bashrcと.bash_profile)

# rbenv を入れたらwslのデフォルトシェルが真っ白になってしまった...！

~経緯~
WSLのデフォルトシェルは最初から色付きのはずなのですが、ruby環境を構築しようとしてrbenvを入れたとたんにbashの文字が真っ白になってしまいました。結論から言うとrbenvは悪くなくて.bash_profileを作ってしまったのが原因だったようです。
![コメント 2019-05-25 014708.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260152/13d1736a-6798-9d74-0f3f-51fc9eba99ff.jpeg)
bashと打つと一応いつものbashにもどりますが毎回これでは不便です。


# 解決策
```
cat .bash_profile >> .bashrc
rm .bash_profile
```

.bash_profileを作成してそれに書いていたもの(rbenvの設定)を、.bashrcの末端に記述して
.bash_profileを消去←重要

なお、その後rbenvもきちんと動作したままでした。

# 原因
1. 　.bash_profileがあると.profileが読み込まれない
1. 　.profileが読み込まれないと.bashrcが読み込まれない
1. 　そしてbashの色付きなどの設定は.bashrcに書いてある
といった具合でした。

普段はmacも使っているので、.bash_profileに記述することになんら違和感を感じなかったのですが、wslに関しては迂闊に.bash_profileを書かない方がいいんですかね...。
正直全部.bashrcで済むような気がします。

# 発見した経緯
bashが味気なくなっただけでなく、laなどのコマンドも効かなくなっていたので、.bashrcが読まれていないんだろうな～と思いつつそこらへんのファイル漁ってたら.profileに以下のような記述が

>This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login exists.

orz

これを発見するまでは、ログインシェルが変更されてしまったものかと思い、何度も
echo $SHELLしたりchコマンドを使ってみたりしていました。というのも、起動後にbashと打つといつもの色付きターミナルになるので、起動直後のシェルがbashじゃなくなっていたように見えたからです。後から知ったのですが、起動後にbashと打ってbashに入ると.bashrcは.bash_profileがあろうとも読み込まれるらしいです。

# どっちがいいの
.bash_profileを作成しても.bashrcが読み込める方法があり、かつ.bash_profileを作成した方が良い理由をご存じの方は教えて頂けると幸いです。
SAPIの参照設定の違い

#VBAではSAPIとTTSは二種類ある
##Oncore系
フォルダ名、ファイル名にOnecoreがつくもの
Speech_Onecore\Common\sapi_oncore.dll
Speech_Onecore\engines\tts\MSTTSengi...
##非OneCore系
フォルダ名、ファイル名のいずれにもOnecoreがつかないもの
Microsoft Speech Object Library
Speech_Onecore\Common\sapi_oncore.dll

##どっちを、いやどれを使うべきか

##ヒント
Excel VBAで音声読み上げ - t-hom's diary

https://thom.hateblo.jp/entry/2018/01/03/160725

ここではレイトバインディングでGetVoicesが使えている。

##GetVoicesがカギ
実はこのGetVoicesがOnecoreのほうには含まれていない。
このためOnecoreを参照設定するとエラーになる。
###オブジェクトブラウザーでみると
Speech_Onecore\engines\tts\MSTTSengi...
Microsft Speech Object Library
Speech_Onecore\Common\sapi_oncore.dll
該当項目が見つかりません
Microsft Speech Object Library
Sys*\Speech\Common\sapi.dll
Microsoft TTS Engine 10.0 Type Library
Speech\engines\tts\MSTTSengine.dll
Function GetVoices([RequiredAttributes As String], [OptionalAttributes As String]) As ISpeechObjectTokens
SpeechLib.SpVoice のメンバー
GetVoices

#参照設定すべきなのはC:\Windows\Sys*\Speech\Common\Sapi.dll
このようにSapi_Onecore.dllとSapi.Dllの双方で、オブジェクトブラウザーを起動しGetvoicesを検索するとOnecoreは見つからず、Sapi.dllは見つかる。
これが決定的な違いでLate Binding つまり Set sp = CreateObject("Sapi.SpVoice") で呼び出すのはSapi.dllであることがわかる。
ISpTTSEngine (SAPI 5.3)
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms719558(v%3Dvs.85)

https://teratail.com/questions/124906

これもそれが原因なのかもしれない

##それではOnecore系統とは
話す方にも行き着くが、Sapi_Onecoreの変数を検索すると音声認識もしくは読み上げ認識に行き着く。
今回の検索でははっきりしなかったが、現在の状況だと、音声認識、もしくは読み上げ認識に対応しているようだ。
これに対して、上記は完全にテキストを読み上げる方に比重がある
読み上げに関与しているのは下記でもわかる
https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms719574%28v%3dvs.85%29
https://www.ka-net.org/blog/?p=297

#MSTTSEngine.dllは何なのか
これはSpvoice以上に謎だ。これを参照設定して変数を調べてもSAPIにしか行きつかない。Onecore以上に謎だ。
https://social.msdn.microsoft.com/Forums/en-US/354ae87f-abf0-4325-a432-2941f27d4aa0/tapi-amp-pbx?forum=vbinterop

Sub AddEvents(pEventArray As SPEVENT, ulCount As <サポートされていないバリアント型>)
    TTSEngineLib.ISpEventSink のメンバー
https://docs.microsoft.com/ja-jp/search/index?search=SEngineLib
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/9151c490-7e51-617a-bbae-29b04a35469a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/a1243e65-c3ad-f505-4a5f-4eb17bfad9ff.png)

TTSEngineLibもない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/126919/fb9ae9e7-dd79-bcfe-aab5-24788154e76a.png)
Spring Boot 開發的時候的方便小工具（筆記）

主要有兩個：

1. 自動編譯 Java 檔
2. 瀏覽器自動重新載入


## 自動編譯 Java 檔 - spring-boot-devtools

只要在 `pom.xml` 裡面加上這一段
就可以在開發期間不用重新手動編譯，就可以自動幫你重新處理已經有變更過的檔案了

```xml
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
</dependency>
```

加入之後不要先忘記重新編譯，才能夠真正起作用。

## 瀏覽器自動載入 - LiveReload

安裝位址： https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei

可以自動判斷檔案是否已經被改變而自動重新載入頁面。

裝好之後需要點一下才會開始偵測，這一步也不要忘記。
VS CodeのLive Serverでワークスペースごとにルートディレクトリを変更する方法

## やりたいこと
- VS CodeのLive Serverでリアルタイムプレビューを使用しながらコーディングを行いたい
- `/ワークスペースのルートディレクトリ/public`にアップロード用のコードが出力されるため、そのフォルダをルートディレクトリに設定したい（Firebase Hostingを使用するため）
- ワークスペースごとに設定できるようにしたい

## 設定する方法
とても簡単で、「**ワークスペースの設定からルートディレクトリを設定するだけ**」です。

Preference＞Settingsを開くと↓のような画面が開かれます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415171/2a1071d0-2ec3-868e-aa9c-a831a6030f40.png)

次に、Workspaceをクリックして、右上の「｛｝」のようなアイコンをクリックして設定をJSONで設定する画面を開きます。

例えば、「sub」というフォルダをルートディレクトリとして使用したい場合は下記のように記述します。

`"liveServer.settings.root": "/sub"`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415171/fb7623ef-cad5-ba05-6d61-a7af9a08faf1.png)

これでワークスペースごとにLive Serverでルートディレクトリとして使用するフォルダを変更することができます。

もっとLive Serverの便利な使い方があればコメントなどで教えてください！
IntelliJ IDEAにて "Cmd+Shift+A" でFind Actionしようとすると黄色いTerminalが出てイラッとするアレをなんとかした話

[自分のブログから転載](http://tacke.hateblo.jp/entry/2019/05/25/011118)

みなさん。こんにちは。tackeです。

IntelliJ IDEA、使ってますか？
"Cmd+Shift+A" のFind Action機能はもちろんご活用されていますよね？

そんな皆さん向けのTipsです。

まあ表題の通りなんですが、IntelliJ IDEAにて "Cmd+Shift+A" でFind Actionしようとすると黄色いTerminalが出てイラッとすること、ありませんか？
なんかちょっと前からちょくちょく起きててイラッとしてたんですが、原因と対処方法が分かったのでメモしておく次第です。

## 発生してる問題を再確認

IntelliJ IDEAを起動して、"Cmd+Shift+A" でFind ActionでIntelliJの機能をインクリメンタルサーチで呼び出すぞ〜！
「hoge」...っと入力して、Enter！

![Screen Shot 2019-05-25 at 0.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10703/ec5ea24e-9780-22fe-4b89-cf6f2125cc1a.png)

すると...

えっ！？黄色いTerminalが開いたぞ！？なんで！？なんもわからん！！イライラッ！！

![Screen Shot 2019-05-25 at 0.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10703/1a3e917e-f05b-1e1a-4dbb-321c46d1b0ae.png)

という感じです。
Find Actionはよく使うのでこれは困りましたね。

## 原因

下記のとおり、JetBrainsのIssueに上がっていました。

[When invoking CMD-Shift-A (Find Actions) for a second time, the Terminal search opens : IDEA-209726](https://youtrack.jetbrains.com/issue/IDEA-209726)

> MacOs 10.14.4 update enables system shortcut Shift-Cmd-A

というわけで MacOS 10.14.4のアップデートで "Cmd+Shift+A" のショートカットがデフォルトで「Search man Page Index in Terminal」というオプションに割り当てられるようになったため、IntelliJ IDEAのFind Action機能とキーバインドが衝突してしまったのが原因でした。

下記のように、JetBrainsのブログにも取り上げられていますね。

["Apropos" terminal pops up when typing cmd+shift+A to get actions bar – IDEs Support (IntelliJ Platform) | JetBrains](https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003430700--Apropos-terminal-pops-up-when-typing-cmd-shift-A-to-get-actions-bar)

## 対策

というわけで話は簡単、キーバインドが重ならないようにしてあげればOKです。
今回はOS側の「Search man Page Index in Terminal」オプションを無効にしてしまおうと思います。

まずは現状確認です。
↓こちらがIntelliJ IDEA側のFind Actionのキーバインドです。"Cmd+Shift+A" が割り当てられていますね。

![Screen Shot 2019-05-25 at 0.38.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10703/7c8dfbee-a36d-cf32-a596-a2b13e95b68d.png)

次にOS側で新しく割り当てられたオプションを確認します。
`System Preferences | Keyboard | Shortcuts | Services` の順に開くと下記のように「Search man Page Index in Terminal」に "Cmd+Shift+A" が割り当てられていることがわかります。

![Screen Shot 2019-05-25 at 0.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10703/6c073afe-cf2d-7613-2c73-f188d72aaf1e.png)

↓「Search man Page Index in Terminal」のチェックボックスを外してあげればOKです！

![Screen Shot 2019-05-25 at 0.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10703/8f42089e-2184-f5c8-88a8-dd57044864b0.png)

はい、これで対策はもう終わりです。

ではみなさん、IntelliJ IDEAで引き続き快適開発ライフを！
とあるRailsエンジニアのリモートワークトライアル 2019-05-24 on Twitter

# とあるRailsエンジニアのリモートワークトライアル 2019-05-23 on Twitter
 [*](https://twitter.com/YumaInaura/status/1131577608917921794")
<https://github.com/YumaInaura/YumaInaura/issues/1984>
# とあるRailsエンジニアのリモートワークトライアル 2019-05-23 on Twitter [ポエム] on @Qiita
 [*](https://twitter.com/YumaInaura/status/1131592529655189505")
<https://qiita.com/YumaInaura/items/801b11a4bf9bae48f58c>
# Slack に使う「文字」絵文字をシェルから「絵文字ジェネレーター」でダウンロードしたい雛形 on @Qiita
 [*](https://twitter.com/YumaInaura/status/1131752876756234240")
<https://qiita.com/YumaInaura/items/1c45b3f5be9e88a25f8c>



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1993








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
web業界のノウハウ

#まず始めに
私は今年社会人としてデビューしました。
web業界に足を踏み入れたのは、2年くらい前です。
webについての知識やwebに関しての技術等々はまだまだペーペーですが、
この2年間で身につけた知識を皆さんに共有できれば良いなと思いました。
宜しければご覧ください。
##web業界で大切なこと
###情報収集能力
「web業界は流れが早い」とよく言います。
実際そうです。
最近で言えば、LINEが300億円無料で配布してますよね。
どんどんQRコード決済が広まりつつあるこの業界。
色々な情報が増え続けて来ています。
その莫大な情報の中でどれほどインプットしアウトプットできるかが肝です。

下記にオススメのサイトを掲載しておきます。
- googleアラート（https://www.google.co.jp/alerts/ ）
- web design trendさん(https://webdesign-trends.net/)
- 株式会社LIGさん(https://webdesign-trends.net/)

###自己解決能力
デザイナーやコーダー志望の人は特に必須スキルです。
プロのデザイナー、コーダーは何も全てを頭の中に入れている訳ではありません(言い切れはしませんけどw)
「こういうことをしたいなら、googleでこう調べると出てくるよ」と学生時代できる先輩や先生は言ってくれました。
実際、人に教わるより自分で調べて解決したことは頭に残ります。
「そういやこう調べるとこういう記事出てくるよな」
「これもっと簡単にできる方法あったな」というように大体ではありますが思い出すものです。
それは自分が興味を持ち自らの手で調べ実行したから。
このスキルは実践あるのみ。
気になったことは理解できるまでとことん調べ尽くしましょう！！！

###人に教えられるスキル
人に教えるということは、自分が十分に理解していなければなりません。
中途半端な情報を流すのはweb業界では御法度。
情報でお金のやりとりが行えるこの御時世。情報がどれほど大事なものか知っているはずです。
人に教えようとすると、自分の理解度も上がるし、信頼関係も上がります。
学校や会社では後輩なるものが出来ます。教え上手な先輩はとても頼り甲斐がありますよね？
そんな先輩を目指しましょう！！

###カンファレンスやイベントの参加
何度も言うようにwebの流れは早いです。
コーダーで言えば、HTML5カンファレンスやDeveloper Summit、PHPカンファレンス等があります。
自分たちよりも実力が上なweb業界の先輩方が無料で！！技術を教えてくれます！！
こんな機会逃す方が勿体無い！！
企業様方のステッカーも参加すると貰えるので、技術者のようなパソコンにしたい方にもオススメです。
そう言った情報はconnpass(https://connpass.com/login/?next=/dashboard/ )が一番良いです。

##最後に
web業界はwebが好きな人じゃないとやっていけない職業です。
web業界の仕事(企画から運用まで)全部やりたい！！くらいの勢いじゃないと多分きついと思います。
ただ逆にそこまでwebの世界にめり込むことが出来るなら、きっと楽しく仕事が出来ると思います。
企業によりますが、自由なところも多いですし、環境的にも素晴らしいと思っています。
どうかこの記事を読んで行動していただき、webのオタクになってくれることを願いますw
Magic Leap MagicScript Landscape Application. LightNode

Prepare
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills

3d model file
https://poly.google.com/view/esWz3QtmDCX

**Create Project**

```sh
magic-script init my-light org.magicscript.light "Light"
cd my-light
mkdir res
```
place 3d model file in res folder.

**Code**

Change app.package

```sh
DATAS = "digest.sha512.signed" : "." \
        "bin/" : "bin/" \
        "res/" : "res/"
OPTIONS = package/minApiLevel/2
```
Change app.js

```jsx
import { LandscapeApp, ui, utils } from 'lumin';
const { UiLinearLayout, UiToggle, Alignment } = ui;
const { LightType } = utils;

export class App extends LandscapeApp {
  onAppStart () {
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    const topLayout = UiLinearLayout.Create(prism);
    const light = prism.createLightNode();
    light.setType(LightType.Point);
    light.setLocalPosition([0, 0.2, 0]);
    light.setColor([0.0, 1.0, 0.0]);
    light.setVisible(false);
    prism.getRootNode().addChild(light);
    
    const resource = 
            prism.createModelResourceId("res/ar-poop-vroom.glb", 0.2);
    const model = prism.createModelNode(resource);
    const toggle = UiToggle.Create(prism, 'ON');
    toggle.onActivateSub((event) => {
      if (toggle.getOn()) {
        light.setVisible(true);
        toggle.setText('OFF');
      } else {
        light.setVisible(false);
        toggle.setText('ON');
      }
    });
    topLayout.addItem(model, [0, 0, 0.02, 0]
      , Alignment.BOTTOM_CENTER);
    topLayout.addItem(toggle, [0, 0, 0.02, 0]
      , Alignment.BOTTOM_CENTER);
    prism.getRootNode().addChild(topLayout);
  }
}
```

**Build**

```sh
magic-script build -i
```

**Run**

```sh
magic-script run --port=10000
```

**Reference**
LightNode(Magic Script API Doc)
https://docs.magicscript.org/lumin.LightNode.html

Light Nodes (LightNode)(Guide C++)
https://creator.magicleap.com/learn/guides/lrt-lightnode

magicscript
https://www.magicscript.org/

Thanks!
connected-react-routerを使ってhandlerでルーティングをしよう！


Reactjsでの開発では、
reactとreduxを一緒に使うことが多いと思います。

routingは、react-router-domというライブラリを使うのが簡単ですが、一緒に
```connected-react-router```で、routingも一緒にstoreで管理するのがいいと思います。
react-router-reduxは、公式でdeprecatedになっているのでこちらを使うのが良いでしょう。

`redux-thunk`も必要みたいです。

link以外の画面推移方法が英語しかなかったので、記録のために

pushを使って、onClickなどのhandlerでroutingをできるようにします。


```bash
#shell
yarn add react-router-dom react-redux redux connected-react-router
```

action等はとりあえず省略します。
##index.jsx

```jsx

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore, applyMiddleware } from "redux"
import { Provider } from "react-redux"
import thunk from "redux-thunk"
import { createBrowserHistory } from "history"
import { routerMiddleware, ConnectedRouter } from 'connected-react-router'
import { Switch } from "react-router-dom"
import rootReducers from "./reducers"

const history = createBrowserHistory()

const store = createStore(
  rootReducers(history),
  applyMiddleware(
    thunk,
    routerMiddleware(history),
  )
)

ReactDOM.render(
  <Provider store={store}>
    <ConnectedRouter history={history}>
      <Switch>
        <App />
      </Switch>
    </ConnectedRouter>
  </Provider>,
  document.getElementById('root')
);

```

##reducer.js

```javascript
import { combineReducers } from "redux"
import { connectRouter } from 'connected-react-router'

export default history => combineReducers({
  router: connectRouter(history),
  //.....ここに他のreducerを
})
```

##App.jsx

`connected-react-router`の`push`をdispatchしてルーティングするのが良いと思います

```jsx


import React from 'react';
import { Route } from "react-router-dom"
import { connect } from "react-redux"
import { push } from "connected-react-router"

const App = () => {
  return(
  <React.Fragment>
    <Route path='/top' component={TopContainer} />
    <Route path='/second' component={Second} />
  </React.Fragment>
)}

const Top = props => (
  <button onClick={props.pushClicked}>button</button>
)
const Second = () => (
  <p>second page</p>
)

const mapDispatchToProps = {
  pushClicked: () => dispatch(push("/second")),
}
const TopContainer = connect(null, mapDispatchToProps)(Top)
```


動作確認をしていないので間違っていたら教えてください！
あと、わかんなかったら言ってください！
mbed.1)  mbed【NUCLEO-F303K8】を使用したLチカ

mbed【NUCLEO-F303K8】を使って、Lチカを行いました。

- mbedの仕様
  - [NUCLEO-F303K8](https://os.mbed.com/platforms/ST-Nucleo-F303K8/)
  - micro USBを使用する必要があります。
  - 始める前に、mbedにアカウントを作る必要があります。
     - アカウントを作成すると、右上に黄色の`Compiler`のボタンが出ます。
     - Deviceの登録などが可能になります。

mbedは、web上のeditorでコードをコンパイルして、コンパイルしたファイルを、
mbedに書き込むことで動作させることが出来ます。
(もちろんオフラインコンパイルも出来るみたいです。)

1. mbedをmicro USB経由でPCに接続します。
  - mbedがLD1が赤く点滅します。
  - 本来であればLD2(赤,店頭),LD3(黄緑,点滅)になり、PCにUSBを認識したことが表示されるが表示されない。
1. ファームウェアの更新が必要であるので、更新する。
  - [NUCLEO-F303K8](https://os.mbed.com/platforms/ST-Nucleo-F303K8/)に"Nucleo ST-LINK/V2 driver installation and firmware upgrade"とあるので、リンクに従ってダウンロードし、実行する。(2つあります。)
      1. "Install the ST-LINK/V2 driver before connecting the Nucleo board to your PC the first time. Follow this LINK for all details."
         - 64bit PCの場合には、dpinst_amd64.exeを実行します。
         - アカウント登録を要求されます。
      1. "For optimum performances, ensure that the Nucleo ST-LINK/V2 firmware is upgraded to the latest version. Follow this LINK for all details."
  - 参考:http://weekendproject9.hatenablog.com/entry/2017/08/20/013850
1. micros USBを刺しなおすと、LEDが正常にLD2(赤,店頭),LD3(黄緑,点滅)点灯しました。mbedはUSBとして認識されました。
1. `Compiler`ボタンを押して、左にある`新規`を押します。
1. 新規プログラムの作成を以下の様に設定します。
    - プラットフォーム -> NUCLEO-F303K8
    - テンプレート -> Blinky...
    - プログラム名 -> Nucleo_blink_led 
1. `コンパイル`を押すと、.binファイルがダウンロードされるので、ファイルをUSBと認識されたフォルダに移動(書き込み)します。
    - LED1とサンプルコードにありましたが、LD3が点滅します。

- コメント
    - 点滅の仕方に変化がないので、コードのsleep時間を変更するのが、良いかと思います。

- 今後の方針
    - 9軸センサーを使用した"sensor fusion"(自己姿勢、自己位置推定)を行う。
    - GPSセンサーを用いて、sensor fusionの精度を上げる。
    - wifiを搭載しソケット通信を行い、クラウドとの連携を行う。

mbedで標準で使うことが出来るLEDのサンプルコードです。

``` c++:main.cpp
#include "mbed.h"

DigitalOut myled(LED1);

int main() {
    while(1) {
        myled = 1; // LED is ON
        wait(0.2); // 200 ms
        myled = 0; // LED is OFF
        wait(1.0); // 1 sec
    }
}
```
Rails Tutorial（2週目）-5-

#クラスとid
ともにラベルで、CSSのスタイルを指定するときに役立つ。
クラスは一つのページ内で何度も使えるのに対し、idはページ内では一度しか使えない一意のものでなくてはならない。

クラスにCSSをあてるには.class名idは#id名

#link_to、image_tag
link_toはrailsのヘルパー。
第１引数はテキスト、第２引数はURL
image_tagもrailsのヘルパー
第１引数に画像ファイルのパス、と任意のオプションを取る。（alt属性は画像が表示されないときに表示されるテキスト）

#Bootstrap
Boostrapとは、HTML/CSS/JSで構成されるWEBフレームワーク。
bootstrap-sassというgemを追加すると、このgemがSassをLESS　CSS言語に変換する。

#パーシャル

```app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= csrf_meta_tags %>
    <%= stylesheet_link_tag    'application', media: 'all',
                               'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application',
                               'data-turbolinks-track': 'reload' %>
    <%= render 'layouts/shim' %>
  </head>
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <%= yield %>
    </div>
  </body>
</html>
```
`render 'layouts/shim'`の部分は　_shimファイルを表示する。
パーシャルのファイルは、_ファイル名とすると、railsが自動的に読み込んでくれる。

#アセットパイプライン
>アセットパイプラインとは、JavaScriptやCSSのアセットを最小化 (minify: スペースや改行を詰めるなど) または圧縮して連結するためのフレームワークです。アセットパイプラインでは、CoffeeScriptやSass、ERBなど他の言語で記述されたアセットを作成する機能を追加することもできます。 アセットパイプラインはアプリケーションのアセットを自動的に他のgemのアセットと結合できます。たとえば、jquery-railsにはRailsでAJAXを使えるようにするjquery.jsが含まれています。

>アセットパイプラインはsprockets-rails gemによって実装され、デフォルトで有効になっています。アプリケーションの新規作成中にアセットパイプラインを無効にするには、--skip-sprocketsオプションを渡します。

つまり、アセットパイプライン処理を早くするために、同じファイル形式のものを連結したり、アセットの最小化をを行ったりする。

#Sass
SassはCSSを拡張した言語。CSSをより効率的かつ美しく書くことを可能にする。
>SCSSはCSSに新しい機能を追加しただけで、全く新しい構文を定義したようなものではないということです15。このため、有効なCSSファイルは、すべてSCSSファイルとしても扱うことができ、既存の記法ルールを使っているプロジェクトにとっても互換性のある便利なフォーマットになっています。

##要素のネスト
共通のパターンは要素をネスト（入れ子）する事ができる。

```
.center {
   text-align: center;
}

.center h1 {
  margin-bottom: 10px;
}
```
は次のようにできる

```
.center {
  text-align: center;
  h1 {
    margin-bottom: 10px;
  }
}
```

別のパターンとして

```
#logo {
  float: left;
  margin-right: 10px;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  letter-spacing: -1px;
  padding-top: 9px;
  font-weight: bold;
}

#logo:hover {
  color: #fff;
  text-decoration: none;
}
```
は次のようにできる

```
#logo {
  float: left;
  margin-right: 10px;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  letter-spacing: -1px;
  padding-top: 9px;
  font-weight: bold;
  &:hover {
    color: #fff;
    text-decoration: none;
  }
}
```
&が#logoに変換されている。


##変数の定義
何度も使うカラーなどは、色の名前で変数として定義しておくと便利
$変数名：　#カラー

#ルートURL
root_pathはルートURL以下の文字列を返し、
root_urlは完全なURLを返す

使い分けとしては、基本的には_pathを使い、リダイレクトの場合のみ、_urlを使う（リダイレクト時には、完全なURLが要求されるため）

`get  '/help', to: 'static_pages#help'`とルーティングを定義することで、名前付きルートが使えるようになる。
「Railsチュートリアル」タグについて(タグシノニム: 「RailsTutorial」「RubyOnRailsTutorial」「#railsチュートリアル」)

# 対象

https://qiita.com/tags/Railsチュートリアル

# 説明

> Railsチュートリアルとは、Webアプリケーションの開発から公開までを、実際に手を動かしながら学んでいく大型チュートリアルです

https://railstutorial.jp/

# タグシノニム

https://qiita.com/tags/RailsTutorial
[https://qiita.com/tags/#railsチュートリアル](https://qiita.com/tags/%23railsチュートリアル)
https://qiita.com/tags/RubyOnRailsTutorial
なぜシューティングゲームでラグが気にならないのか？にこたえる

## なぜシューティングゲームでラグが気にならないのか？にこたえる
オンラインゲームにはラグがつきものです。開発で苦労した経験をお持ちの方もいらっしゃるかと思います。

荒野行動やPUBGなどのシューティングゲームをプレーしているとラグは気になりません。
体感的にラグを感じないように設計されているのです。

分かりやすくいうと、"攻撃が当たりやすく"なっているのです。当てたはずの弾が当たっていない判定をされるとストレスがたまります。そのため、「攻撃側のプレーヤーが見た画面で敵に当たっていれば、攻撃を有効にする」という処理が取られているのです。

さて、さらに都合が良いことに、攻撃される側は、相手の照準がどこにあるのかは正確には判断できません。そのため被弾した時に、「うまくエイムされたんだ」と考えられます。「こっちを向いていなかったではないか」とはならないのです。

オンラインゲーム開発の参考になれば幸いです。

(あくまで一般論ですので、例としてあげたゲームがそのような設計になっているとは限りません。)
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
claspがTypeError: dotf is not a functionで詰まった話

## はじめに
**claspの環境構築については今回は省略させていただきます**

- 使用PC：mac
- claspのバージョン（2019年5月23日現在）

```
$ clasp -v
2.1.0
```

## 詰まった部分
[claspのGitHub](https://github.com/google/clasp)に書かれている通りにnpm installした

```
$ npm i @google/clasp -g
```
その後 clasp を実行すると

```
$ clasp
/usr/local/lib/node_modules/@google/clasp/src/dotfile.js:89
    RC: dotf(exports.DOT.RC.DIR, exports.DOT.RC.NAME),
        ^

TypeError: dotf is not a function
    at Object.<anonymous> (/usr/local/lib/node_modules/@google/clasp/src/dotfile.js:89:9)
    at Module._compile (internal/modules/cjs/loader.js:759:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
    at Module.load (internal/modules/cjs/loader.js:628:32)
    at Function.Module._load (internal/modules/cjs/loader.js:555:12)
    at Module.require (internal/modules/cjs/loader.js:666:19)
    at require (internal/modules/cjs/helpers.js:16:16)
    at Object.<anonymous> (/usr/local/lib/node_modules/@google/clasp/src/auth.js:57:17)
    at Module._compile (internal/modules/cjs/loader.js:759:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
```

どうやら**dotf**に問題があるらしい
## 解決策
エラーメッセージにもあるように
**/usr/local/lib/node_modules/@google/clasp/src/dotfile.js**を編集する
最終的にdotfを以下のように編集することで解決した

```
dotf()
  ↓
dotf.default()
```

編集後のソースコード(79行目から)

```
    /**
     * Gets the closest DOT.PROJECT.NAME in the parent directory of the directory
     * that the command was run in.
     * @return {dotf} A dotf with that dotfile. Null if there is no file
     */
    PROJECT: function () {
        var projectDirectory = findParentDir.sync(process.cwd(), exports.DOT.PROJECT.PATH) || exports.DOT.PROJECT.DIR;
        return dotf.default(projectDirectory, exports.DOT.PROJECT.NAME);
    },
    // Stores {ClaspCredentials}
    RC: dotf.default(exports.DOT.RC.DIR, exports.DOT.RC.NAME),
    // Stores {ClaspCredentials}
    RC_LOCAL: function () {
        var localDirectory = findParentDir.sync(process.cwd(), exports.DOT.PROJECT.PATH) || exports.DOT.RC.LOCAL_DIR;
        return dotf.default(localDirectory, exports.DOT.RC.NAME);
    },
};
```

## 終わりに
自分のclaspの環境構築のやり方が悪かった可能性の方が高いと思ってるので原因わかる人教えてください
AWS SSOを使ってCodeCommitを利用する

##はじめに
メモとして残しておきます。

##参考
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/temporary-access.html

##前提
SSOでログインするときに使用するIAMロールが、CodeCommitへの操作権限を持っていること
AWS CLIとgitコマンドをインストールされていること

##手順
認証情報ヘルパーを設定する
Git 認証情報ヘルパーがAWS 認証情報を使用するように設定する

```
git config --global credential.helper '!aws codecommit credential-helper $@'
git config --global credential.UseHttpPath true
```

アクセスキー、シークレットアクセスキー、トークンを設定する
SSOの画面で「Commandline or Programatic access」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/1bf30ca6-de6b-b2df-8b40-c28c3c28ae39.png)

Option1をコピーしてTerminalにペースト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/78516a7e-1dfc-6e99-f5bf-424a0ce2bacd.png)

git cloneしてみる

```
$ git clone https://git-codecommit.us-west-2.amazonaws.com/v1/repos/my-repo
Cloning into 'my-repo'...
$ 
```

完了

###おまけ

Macの場合、しばら作業しててgit pushしようとしたときに「fatal: unable to access 'https://git-codecommit.us-west-2.amazonaws.com/v1/repos/my-repo/': The requested URL returned error: 403」のようなエラーが発生することがあります。
これは、CodeCommitが発行する認証情報が15分で無効になるが、gitコマンドが使用するkeychainユーティリティが無効になった認証情報を使ってアクセスを試行するために発生します。
AWSマニュアルに対応方法の記載があります。

対策1 gitコマンドがKeychainユーティリティを使わないようにする
1 Keychainユーティリティを開いて、CodeCommitの認証情報を検索する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/fcd73d49-a09b-3415-0236-c52a27544a1e.png)

2 対象の認証情報をダブルクリックする
3 git-credential-osxkeychainを削除する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/af563f80-f67a-b6ad-3051-1e3079a840b5.png)

4 gitコマンドを実行すると、keychainを使用するかのダイアログがでるのでDenyをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78184/553e8020-bec8-0789-7d84-34d77eb85db5.png)
5 gitコマンドが使える

上記だと毎回ダイアログでDenyをクリックしないといけない

対策2 osxkeychainを使わないようにする or 使用する対象をしぼる

```
sudo emacs /Library/Developer/CommandLineTools/usr/share/git-core/gitconfig
```

使わないようにする。以下のテキストの行をコメントアウトします。

```
# helper = osxkeychain
```

対象をしぼる。この例は、github.comに制限している。

```
[credential "https://github.com"]
   helper = osxkeychain
```

参考
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-https-unixes.html
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/troubleshooting-ch.html
Mac で Google 日本語入力を使ってるといつの間にかカタカナ入力になる件

# 問題

Mac で Google 日本語入力を使っているが、コーディング中、いつの間にかカタカナ入力に切り替わる問題が度々発生してストレスだった。

# 原因

どのタイミングで切り替わるかわからずに困っていたが、あるとき原因がわかった。

![スクリーンショット 2019-05-24 23.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155820/bbba0361-2203-477f-bad1-6793e42e1ae2.png)

おまえか！

そう、使っているエディタで行削除するときのショートカット `control + shift + k` とかぶっていたのだ。
これによって行削除するたびにカタカナに切り替わっていたのだった。

# 解決

原因はわかったが、Google 日本語翻訳のショートカットを変更する方法はわからなかった。

私は「カタカナ」は使わないので、「カタカナ」入力ソースごと葬り去ることにした。
システム環境設定のキーボード設定から削除できる（画像参照）。

![スクリーンショット 2019-05-24 23.12.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/155820/ff1a26fe-ea94-66cc-a4d1-46e213c61fda.png)

これで解決。お疲れ様でした。
Docker で Laravel開発環境


Nginxのconfを作成する

```conf
server {
    listen  80;
    root /usr/share/nginx/laravel/public;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    location ~ ^/.+\.php(/|$) {
        fastcgi_pass laravel-container:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}
```

DockerでPHP-FPMを作成する

```docker
FROM php:7.3-fpm-alpine
RUN apk add libzip-dev
RUN docker-php-ext-configure zip --with-libzip
RUN docker-php-ext-install pdo_mysql zip
```

docker-composeを作成する

```docker

version: "3.7"

services:

  laravel:
    build: .
    container_name: laravel-container
    working_dir: /usr/share/nginx/laravel
    networks:
      - laravel-docker
    volumes:
        - ./laravel:/usr/share/nginx/laravel

  nginx:
    image: nginx:1.16-alpine
    container_name: reverse-proxy
    working_dir: /usr/share/nginx/laravel
    networks:
      - laravel-docker
    ports:
        - "8080:80"
    volumes:
        - ./default.conf:/etc/nginx/conf.d/default.conf
        - ./laravel:/usr/share/nginx/laravel

  mysql:
    image: mysql:8.0
    container_name: mysql-server
    networks:
      - laravel-docker
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=homestead
      - MYSQL_USER=homestead
      - MYSQL_PASSWORD=secret
    ports:
      - 3306:3306

  redis:
    image: redis:5.0-alpine
    container_name: redis-server
    networks:
      - laravel-docker
    ports:
      - 6379:6379

networks:
  laravel-docker:
    driver: bridge

```

# 詳細は下記（ハンズオン）
https://github.com/hexaforce/laravel-docker
HIDデバイスをconda環境で実行

#
http://akizukidenshi.com/catalog/g/gM-05131/
http://km2net.com/usb-io2.0/index.shtml
こちらのデバイスを使うと、様々なセンサやアクチュエータをパソコンから直接制御できて便利。
pythonで制御する場合、`import hid`（`pip install hidapi`でインストール。https://github.com/trezor/cython-hidapi）
でインポートし、プログラムを書く。

# 問題点
そのファイルを実行する際に、devへの権限がrootでないと得られないので
`sudo python xxx.py`
で実行しなければならない。
しかし、`bear`という仮想環境上で動かしたい。
`sudo python`と`(bear) python`で参照する先のpythonが違い、困った。


```
(bear) username@username:~$ which python
/home/username/PythonVirtualEnvironments/DefaultEnv3.7/bin/python

(bear) username@username:~$ sudo which python
/usr/bin/python
```

# 解決法
`bear`仮想環境上で`which python`と打ち
出てきた先のパスをコピペ。

上記のように出たので、

```
(bear) username@username:~$ sudo /home/username/PythonVirtualEnvironments/DefaultEnv3.7/bin/python xxx.py
```
で問題なく実行できた。
今は、devへのアクセス権限のあるグループを変更することを検討中。