明日の自分のために

主に自分用のメモなど

最近調べたこと

最近調べたことについて概要をメモしておく。詳細はいずれ追記するかも。

Reed Solomon符号

長距離、低速通信の環境で大容量のファイルを転送することを考えた。 セッションを張ったり再送制御をするのはコストが高いので、誤り訂正符号をつけたパケット通信とすることで品質を保つ方針とした。QRコードにも使われているようだ。計算量は多め。

Reed–Solomon codes for coders - Wikiversity

Google Map、Direction、GeoCode

Google Map、Directions、GeoCodeを使うアプリを作ってみた。

Google Mapのapiキーと、Directionsなどの有料サービスのAPIキー設定は別であることに注意が必要。 DirectionsはAndroidアプリからのアクセスではなく、HTTP経由でのアクセスという扱いになる。 そのためAPIキーの制限にAndroidアプリを指定するとアクセスできなくなる。

https://github.com/googlemaps/google-maps-services-java https://stackoverflow.com/questions/14654758/google-places-api-request-denied-for-android-autocomplete-even-with-the-right-a

アニメーションのサンプル https://ddewaele.github.io/GoogleMapsV2WithActionBarSherlock/part3

参考になるサンプルコード https://github.com/ddewaele/GoogleMapsV2WithActionBarSherlock

Androidのフォント指定について

AndroidのフォントはデフォルトでRobotoを使っている。 /system/etc/fonts.xmlでフォントをしているが、コメントでは"first font is default"って書いてあるけどならない…。

http://androidxref.com/9.0.0_r3/xref/frameworks/base/data/fonts/fonts.xml

OpenVPN用サーバの引っ越し

住んでいる賃貸物件がインターネット無料でいいのだが、割り当てられるのがローカルIPでPS4とかでうまくネット対戦できないのでConoHaのVPSVPNサーバを立ててそこから外に出るようにしている。 立ててからしばらく経ったのでもっと安くならないかと探してみた。 いまはConoHaの一番安い512MBのプランで630円/月(税抜)。 AWS t3.nanoがvCPU 2, メモリ 0.5GiBで0.0068USD/時間なので、0.0068USD/h x 720h x 110円/USD = 540円/月になる。AWSが少し安いようだ。そのうち引っ越すか。

シリアル通信のシミュレート方法

Raspberry Piでシリアル通信を行うプログラムを作成しているときに、socatを使ってお手軽に動作確認をする方法のメモ。

Socat

Manからの引用。シリアルだけじゃなくてソケットなどいろいろ使える。

Socat is a command line based utility that establishes two bidirectional byte streams and transfers data between them. Because the streams can be constructed from a large set of different types of data sinks and sources (see address types), and because lots of address options may be applied to the streams, socat can be used for many different purposes.

使ってみる

/tmp/ttyV0と/tmp/ttyV1という仮想のシリアルデバイスを作成してこの2つでシリアル通信を行う。コマンドは以下の通り。 もし権限がないと怒られる場合はchmod 666 /tmp/ttyV0などしてあげればいい。

pi@raspberrypi:~ $ socat -d -d pty,raw,echo=0,link=/tmp/ttyV0, pty,raw,echo=0,link=/tmp/ttyV1
2018/08/13 07:55:26 socat[519] N PTY is /dev/pts/2
2018/08/13 07:55:26 socat[519] N PTY is /dev/pts/3
2018/08/13 07:55:26 socat[519] N starting data transfer loop with FDs [5,5] and [7,7]

RaspberryPi上のプログラムから利用したり、echo "hello" > /tmp/ttyV1などとしてみればそのままシリアルでメッセージのやり取りができる。

参考

https://ubuntuforums.org/showthread.php?t=2258621

IntelliJ IDEA / PyCharm + RaspberryPiでリモート開発・デバッグ

Raspberry Pi上で動作させるPythonプログラムを作る際に、PC上のIntelliJ IDEA or PyCharmで開発しているが、実行・動作確認はRaspberryPi上で行いたい場合があったのでその方法のメモ。このメモはWindows上で設定したが、先にLinuxでも試してうまく行った。

PC上で開発し、そのまま実行すればRaspberryPi上で実行されるし、ブレークポイントも張れるし超便利。

必要なもの

  • IntelliJ IDEA / PyCharmの有料版 Deployment機能を使うことにしたため有料版が必要になる。ちょうど半額セールのときに買ったので活用してみることにした。
  • 開発環境が構築され、SSH接続ができるように設定されたRaspberry Pi

設定

Deploymentの設定

メニューのTool -> Deployment -> Configurationを選択する。
左上の+ボタンを押してリモート環境(ここではRaspberryPi)を追加する。とりあえずNameはRaspberryPi、TypeはSFTPに指定しておく。

リモート環境が追加されるので各設定項目を埋めていく。必要であればMappingでローカルとリモートのディレクトリ対応を定義しておく。 f:id:gan0803:20180815150635p:plain

リモートのPython環境の指定

File -> ProjectStructureを開き、Platform Settings -> SDKを選択する。 左上の+ボタンを押してPython SDKを追加する。ここでリモートの環境を指定するためにSSH Interpreterを選択する。 Existing server configurationで先ほど作成したRaspberryPiの環境をDeployment configurationに指定する。(そのままだとできないのでMove this server to IDE settingを選択した) f:id:gan0803:20180815151350p:plain

次の画面でPython Interpreterを指定する。virtualenvのPython環境を指定してもうまく行った。他の設定項目1はそのまま。 これでリモートのPython環境が追加できた。 File -> ProectStructureを開き、ProjectSettings -> ProjectのProject SDKで今作成したRemote Python環境を指定すれば、IDEA / PyCharmでプログラムを実行したときにRaspberry Pi上で実行される。AutoSyncも有効になっていれば(デフォルトで有効)作業内容が自動的にRaspberry Piにアップロードされる。

試しにプログラムを実行(IDEA / PyCharmの再生ボタン押下)してみるとRaspberryPi上でプログラムが実行されていることがわかる。

PC画面上のエラーの解決

Raspberry Pi上での環境構築が正しくされていれば上記実行はうまくいくはずだが、PC上のIntelliJ IDEA / PyCharmではUnresolved Referenceのエラーが出ている。
ちゃんとした解決方法はよくわからないが、File -> ProjectStructureのPlatform Settings -> SDKsを開いて、とりあえずローカルのinterpreterの設定のclasspathを持ってきてリモートのinterpreterclasspathにそのまま設定してやる。

参考までに、コピーしたのは以下の項目

参考

以下を参考にしました。

pythonでimportしたときにCannot find referenceと言われる

IntelliJpythonのソースを書いていてよく忘れて引っかかる上に解決方法もよく忘れるのでメモ…orz
pythonでimportしたときにCannot find referenceと言われる。
作成したディレクトリがSource Rootになっているか確認する。
なっていなければMark Directory As -> Source Rootで設定する。
解決!

Repoの使い方確認&メモ

Androidの開発で利用されている複数リポジトリを管理するためのツールであるRepoの使い方について確認する。 ここではGitLabにリポジトリを作成して動作を確認した。 ~/.ssh配下の設定などは適切にしておく。

構成

複数のリポジトリを束ねて以下のようなディレクトリ構成を構成したい場合を考える

.
├── dir_a
│   └── dir_c
└── dir_b

github、gitlab、bitbucketにあるリポジトリにアクセスするイメージで、以下の4つのリポジトリを作成してみんなで作業したいとする。

  • repo-test-manifest Repoのmanifest管理用
  • repo-test-a dir_a配下のプロジェクトのリポジトリを想定
  • repo-test-b dir_b配下のプロジェクトのリポジトリを想定
  • repo-test-c dira/dir_c配下のプロジェクトのリポジトリを想定

manifestの作成

manifest管理用のリポジトリを例えば以下のような場所に作成する。

git@gitlab.com:[User or Group]/repo-test-manifest.git

望む構成になるようにmanifest(default.xml)を以下の通り作成する。

  • remoteのnameにリモートリポジトリの名前を記述し、fetchに取得先サーバの情報を記載する。
  • defaultのrevisionにmasterブランチを指定して、remoteは定義済みのoriginを指定する。
  • projectのpathに当該リポジトリの配置ディレクトリを記載し、nameにリポジトリを記載する。ここでremoteなどを記述しない場合はdefaultが使用される。
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

  <remote  name="origin"
           fetch="ssh://git@gitlab.com"/> 

  <default revision="master"
           remote="origin" />

  <project path="dir_a"
           name="[User or Group]/repo-test-a"/>
  <project path="dir_b"
           name="[User or Group]/repo-test-b"/>
  <project path="dir_b/dir_c"
           name="[User or Group]/repo-test-c"/>
</manifest>

Repoの入手

インストール方法の詳細は公式を参照。 https://source.android.com/setup/build/downloading

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

ソースコードの取得

repo syncの途中で秘密鍵のパスワードを聞かれると止まってしまうため予めssh-addしておく。パスフレーズなしの鍵でもよい。

ssh-add ~/.ssh/id_rsa

まずはマニフェストを指定してrepo initする。(manifestを取得してディレクトリをrepo用に初期化する)

$ mkdir ~/repo-test
$ cd ~/repo-test
$ repo init -u git@gitlab.com:[User or Group]/repo-test-manifest.git

そのあとにrepo syncを実行するとmanifestに記載されたリポジトリの内容を取得して、指定されたディレクトリに展開する。

$ repo sync

確認すると以下のように展開されているはず。

~/repo-test
├── dir_a
│   ├── [files]
│   └── dir_c
│       └── [files]
└── dir_b
    └── [files]

Raspberry Pi Zero WHにDockerをインストールしてみる

インストール

Raspberry Pi Zero WHにDockerをインストールしてみる。こんな非力なマシンにDocker入れるの?とかはさておき。

いろいろ調べていたが、結局はDockerの公式ブログに書いてある通り1行叩いたらインストールされてしまった。素晴らしい。 https://www.raspberrypi.org/blog/docker-comes-to-raspberry-pi/

curl -sSL https://get.docker.com | sh

Dockerグループに追加

sudoしなくてもいいようにDockerグループにpiユーザを追加する。

sudo usermod -aG docker pi

docker-compose

docker-composeはないのでソースからビルドする必要がある。 すでにやっている人がいたのでそのまま参考にしてできるといいのだが、今は時間がないのでちょっと後回し。 https://qiita.com/katsusuke/items/beec05e1afcd67ebd3dc

Raspberry Pi Zero WHにUSB経由でSSHする

Raspberry Pi Zero WHをセットアップしようとしたが、ディスプレイやキーボードをつなぐのが面倒くさく、Ethernet over USBでセットアップしたくなったので調べてみた。やり方をメモしておく。

事前準備としてRaspbianを焼く。今回はRASPBIAN STRETCH LITEをダウンロードして使用した。 gpartedでSDカードをフォーマットして、dmesgでデバイスファイルを確認、ddで焼きこむ。

起動前の設定

その後、USB経由でのEther接続設定を行う。

config.txtの末尾に以下の1行を追加。

dtoverlay=dwc2

cmdline.txtにmodules-load=dwc2,g_etherを以下のとおり追加。

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=c7cb7e34-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init=/usr/lib/raspi-config/init_resize.sh

/bootにsshというファイルを追加する。(拡張子なし) ファイルの中身は関係なく、/boot/sshというファイルが存在することでSSH接続が起動時にワンタイムで許可される。

Raspberry Pi Zero WHの内側のmicro USB端子とPCを接続する。 初回起動時にパーティションの拡張が走るためしばし待つ。(数分くらい?)

PC側の準備

初回起動を待つ間に、Raspberry PiIPアドレスがわからないので(手動で探してみても良いが)ホスト名でアクセスするためにavahi-daemonをインストールしておく。

sudo apt-get install avahi-daemon

SSHログインとSSH設定

その後、SSHで普通にログインする。(user: pi / pass: raspberry)

 $ ssh pi@raspberrypi.local

今後もSSHに接続できるようにするためraspi-configを起動する。

$ sudo raspi-config

メニューから5 Interfacing Options -> P2 SSHを選択してSSHを有効にする。

これで再起動後もSSHログインできるようになる。

ノートPC経由のインターネット接続

ネットワークの設定画面からUSB Ethernetを選択してプロファイルを追加/編集し、IPv4の設定項目のAddressesで[Shared to Other Computers]を選択する。 これでRaspberry Pi Zero WHからノートPC経由でインターネットアクセスできるはず。aptとかパッケージ入れたりとか。