kuroの覚え書き

96の個人的覚え書き

連番で同じ処理をさせるためのリストを作る

ファイルを連番を付けて作成していてそれに同じ操作を全部やるとき、excelで編集してコマンドリストを作っていたが、shellでやるほうが簡単なので、その覚え書き

seq -w 0 42 | xargs -i echo "python3 seq.py TAIR10_cdna_20101214_updated.fa.split/TAIR10_cdna_20101214_updated.part_0{}.fasta > TAIR10_{}.txt" > com.txt

たとえばこのように42分割したfastaファイルにそれぞれある処理を実行する。

塩基配列(文字列)からコンセンサス配列を抽出するプログラム

要するに文章からよく出てくる単語をピックアップしてカウントし、リストを作れれば良い。
辞書型を使って単語を数えるプログラムはpythonのプログラム例としてよく上がっているが、単語の区切りが明確でない遺伝子配列のような文字列から指定文字数の連続した文字列が指定反復以上出現していたらピックアップしてカウントするというプログラムは落ちていなかったので、作ってみた。多分日本語みたいに単語ごとに明確に区切りを入れずに書く文章から抽出したりするのにも使えると思う。その場合いわゆるキーワード抽出というのとは違い、文字を単純に検索しているだけなので、日本語としておかしな部分が切り取られる可能性も大いにあるが。

text = """ここに検索したい文字列(遺伝子配列など)を入れる。複数の文字列から共通する文字列を検索したいときはスペースで区切って複数並べておく"""
low = 4 #ここで指定した文字数以上の連続したコンセンサスを探す
time = 3 #最低反復数

list = text.split()
counter = {}
for w in list:
    l = len(w)
    l1 = l - low + 1
    for i in range(0,l1):
        for n in range(0,l1-i):
            ws = w[i:i+low+n]
            if ws in counter:
                counter[ws] += 1
            else:
                counter[ws] = 1
for k,v in sorted(counter.items()):
    if v >= time:
        p = text.find(k) #最初に出現する位置
        print(k,v,p)

ウェブインターフェースとか使いやすくする事はできるが、面倒臭いので生スクリプトで済ます。

homebrewにエラー

いつの頃からか

$ brew update
fatal: unable to access 'https://github.com/brewsci/homebrew-bio/': error setting certificate verify locations:
  CAfile: /home/linuxbrew/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/linuxbrew/.linuxbrew/etc/openssl/certs
fatal: unable to access 'https://github.com/Linuxbrew/homebrew-core/': error setting certificate verify locations:
  CAfile: /home/linuxbrew/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/linuxbrew/.linuxbrew/etc/openssl/certs
fatal: unable to access 'https://github.com/Linuxbrew/brew/': error setting certificate verify locations:
  CAfile: /home/linuxbrew/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/linuxbrew/.linuxbrew/etc/openssl/certs
fatal: unable to access 'https://github.com/brewsci/homebrew-science/': error setting certificate verify locations:
  CAfile: /home/linuxbrew/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/linuxbrew/.linuxbrew/etc/openssl/certs
fatal: unable to access 'https://github.com/Linuxbrew/homebrew-extra/': error setting certificate verify locations:
  CAfile: /home/linuxbrew/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/linuxbrew/.linuxbrew/etc/openssl/certs
fatal: unable to access 'https://github.com/Linuxbrew/homebrew-xorg/': error setting certificate verify locations:
  CAfile: /home/linuxbrew/.linuxbrew/etc/openssl/cert.pem
  CApath: /home/linuxbrew/.linuxbrew/etc/openssl/certs
Error: Fetching /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/brewsci/homebrew-bio failed!
Fetching /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core failed!
Fetching /home/linuxbrew/.linuxbrew/Homebrew failed!
Fetching /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/brewsci/homebrew-science failed!
Fetching /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/linuxbrew/homebrew-extra failed!
Fetching /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/linuxbrew/homebrew-xorg failed!

というようなエラーが出るようになった。brewで入れたアプリの挙動も若干おかしいような感じもあった。

続きを読む

motion.confの改変内容メモ

############################################################
# Daemon
############################################################

# Start in daemon (background) mode and release terminal (default: off)
daemon on

###########################################################
# Capture device options
############################################################

# Image width (pixels). Valid range: Camera dependent, default: 352
width 640

# Image height (pixels). Valid range: Camera dependent, default: 288
height 480

############################################################
# Image File Output
############################################################

# Output 'normal' pictures when motion is detected (default: on)
# Valid values: on, off, first, best, center
# When set to 'first', only the first picture of an event is saved.
# Picture with most motion of an event is saved when set to 'best'.
# Picture with motion nearest center of picture is saved when set to 'center'.
# Can be used as preview shot for the corresponding movie.
output_pictures off

############################################################
# Live Stream Server
############################################################

# Restrict stream connections to localhost only (default: on)
stream_localhost off

ラズパイでタイムラプスカメラの続き

さて、fswebcamで定期的に写真を撮っていくということで動作も軽く、問題なくどんどん画像が溜まっていくということは確認できた。
しかしやはりカメラとしてはファインダーがないのはちょっとつらい。写真撮ってビューワーで見てカメラ動かして・・・というのは操作性が悪すぎる。

ということでフレーミングを決めるためにguvcviewというGUIな写真・ムービー撮影ツールを試してみた。
Raspberry Pi 3 とウェブカメラ(ロジクール C270) - 今日も微速転進

それ自体撮影や映像の調節などができるアプリなわけだけど、どうもラズパイには荷が重いのか安定しない。
3度に1回は起動に失敗する感じだ。

そこでやはりmotionに戻ってきた。
これは動くものを感知して自動で撮影する監視カメラ的なツールなのだけれど、単純に映像をストリーミングすることもできる汎用性の高いアプリである。使用例もかなりたくさん紹介されているので、困ったときにもいろいろ参考にできる。
Raspberry Piでmotionを動かして、カメラの画像をストリーミング配信する方法 : 試行錯誤な日々

Motion の導入手順 ~ 指定した内容、パラメータの意味について

Raspberry Piセットアップ(motion編)Stretch版 | MacFeeling Blog

キモとしては画像、動画を保存しないように/etc/motion/motion.confに設定するということだろう。

で、せっかくなのでpython+flaskのwebアプリを作ってVNCsshなしで使えるようにしてやろうととりかかったのだが・・・

motionを起動しているとfswebcamが写真を撮る事ができないので、フレーミングが終わったら終了してしまいたいのだが、どうもmotionの起動、終了に癖があるようで意図したとおりに動いてくれない。

かなり悩んでたどり着いた解は
/etc/motion/motion.conf
daemon on

/etc/default/motion
start_motion_daemon=yes

/etc/init.d/motion
デフォルトのまま

起動
sudo service motion start

終了
sudo service motion stop

これをflaskに仕込む。

ただし、この設定ではシステム起動時にmotionも起動してしまう。今回はwebから制御したいので
sudo service motion stopを/etc/rc.localに追加して、一旦起動はするが、すぐに終了しておく。


flaskのアプリをserviceとして起動する設定は
/etc/sysconfig/kcam

FLASK_APP="./cam/views/home.py"
LC_CTYPE="en_US.UTF-8"
_EOF_

を用意し、
/etc/systemd/system/kcam.service

[Unit]
Description=python instance to serve kcam
After=network.target

[Service]
User=pi
Group=pi
EnvironmentFile=/etc/sysconfig/kcam
WorkingDirectory=/home/pi/kcam
ExecStart=/usr/local/bin/flask run --host=192.168.0.10

[Install]
WantedBy=multi-user.target

という感じのファイルを作成。
ユーザpiのホームディレクトリにアプリ本体をおいたとして
ExecStart=/usr/local/bin/flask run --host=192.168.0.10
の部分は自分の環境に合わせるように。

f:id:k-kuro:20190128190801p:plain

ラズパイでタイムラプスカメラ

研究絡みで植物のタイムラプスムービーをつくりたいという話があったので、それならWEBカメラとラズパイでちょちょいでしょ、ということになってやってみた。

まずは参考にしたサイトから
RaspberryPiとUSBWebカメラでタイムラプス | Foolean – 備忘録風雑記ブログ
ラズパイでタイムラプス撮影 - Qiita
このへん。

カメラは手持ちにあったUSBカメラを使用。
https://www.amazon.co.jp/gp/product/B008AO4KXG/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1
3年ほど前に買ったカメラ。

Raspberry Piは3+を使用。
OSはraspbian

使用ソフトは

$ sudo apt-get install fswebcam libav-tools -y

でインストール。

USBカメラを差したら

$ fswebcam -F 10 ./tmp.jpg

これで画像が撮れることを確認。
ちなみにfswebcamのオプションは

-r 1920x1080 解像度
-d 5 ディレイ(カメラに露出やフォーカスの調節を自動でさせるための時間を与える)
-F 10
--jpeg 85 (JPEGで85%画質で撮るとき)
--line-colour '#FF000000' --banner-colour '#FF000000'  タイムスタンプなどの文字色など

ほかにもあると思う。

今回は

#!/bin/bash
FILENAME=`date +%Y%m%d%H%M%S`
fswebcam -r 1280x720 --line-colour '#FF000000' --banner-colour '#FF000000' -F 1$

こんな感じのスクリプトを書いてcamera.shとした。

これをcronで定時実行もしくは間隔を決めて実行すれば画像がどんどん溜まっていく。

$ crontab -e
00 * * * * * /home/pi/camera.sh

こうすれば毎時0分に定時撮影となる。

*/10 * * * * /home/pi/camera.sh

こうしておけば10分間隔で撮れる。

ある程度画像が溜まったらパラパラ漫画の要領でムービーに仕立てる。
今回は

#!/bin/sh

find ./img/ -name '*.jpg' | sort -n | awk 'BEGIN{ a=0 }{ printf "mv \"%s\" ./img/%05d.jpg\n", $0,a++}' | bash
avconv -y -f image2 -r 10 -i ./img/%05d.jpg -aspect 16:9 -s '1280x720' ./img/output.mp4

こういうスクリプトを作ってみた。
名前が連番でないといかんらしいので、名前を変更し、それをoutput.mp4という名前のムービーにする。

特に困ったこともなくあっけなく完成。


しいていうなら、このままではフレーミングを決めるために何度もスクリプトを実行して撮ってみて、画像確認してまた撮って・・・と繰り返さなければならない点かな。

これはmotionもインストールしておいてストリーミングで画像を見れるようにしておくのが良いかもしれない。
k-kuro.hatenadiary.jp


RaspberryPiでWebカメラを使ってストリーミング動画を配信させてみた - 水菜巻のメモ的ななにか。
こっちのほうがお手軽かな。

最後にこのタイムラプスカメラシステムをいくつもクローンで作りたいので
SDカードの複製(for Mac) | Make.
SDカードのまるごとコピー

ラズパイをネット環境の無いところでiphoneから直接接続して操作

というのをやりたいので調査。

karaage.hatenadiary.jp
これかな。

要するにアクセスポイントとして動くようにしてついでにdhcpdを入れておくということね。

Pythonの環境を一旦リセットする

どうもややこしくていけないのだが、systemに入っているpython は2.6とかなりふるい目。なので自前でpython3を入れて使いたいわけだが
バージョンの使い分けにpyenvというものがある。更にはvirtualenvというものもある。
しかしよく考えると、バージョンを細かく使い分けるようなことはしていないので、単純にbrewで最新のpython3を入れてしまって、それだけ使うようにしても何ら困ることはないということに今更ながら気づく。

どうやらpyenvで入れたpython3.6.1とbrewで入れた3.7.1がうまく折り合いをつけてくれずにトラブっていたらしく、一旦全部クリアしてbrewだけにしたらすんなりとinternal server errorは解決した。

うん、pyenvやめよ。

あとはflaskのmanage.pyをきちんとcgi経由で動くようにしないとな。

value serverでレンタルサーバー

某大学内でサーバを建ててあれこれやっているが、外部からアクセスできるようには、なかなかさせてもらえないので、学外にサーバを建てることにした。
といっても、物理サーバを管理することもできないので、レンタルサーバお茶を濁す
とにかく料金が安く、sshでそこそこ自由度の高いvalue serverに白羽の矢を立て、早速お試し開始。

とにかくpython3が走らないとお話にならないのだが、一応いんすとーるされてはいるようだ。
でもpip3が使えなくてライブラリが入れられないので、pyenv-virtualenvを入れよう・・・なんかドツボにハマっていきそうな予感。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
Initialized empty Git repository in /virtual/hoge/.pyenv/.git/
remote: Enumerating objects: 63, done.
remote: Counting objects: 100% (63/63), done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 16547 (delta 25), reused 46 (delta 20), pack-reused 16484
Receiving objects: 100% (16547/16547), 3.21 MiB | 2.81 MiB/s, done.
Resolving deltas: 100% (11217/11217), done.
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source .bashrc
$ pyenv --version
pyenv 1.2.8-5-gec9fb54
$ pyenv install 3.6.1
Downloading Python-3.6.1.tar.xz...
-> https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tar.xz
Installing Python-3.6.1...
Installed Python-3.6.1 to /virtual/hoge/.pyenv/versions/3.6.1

$ pyenv global 3.6.1
$ pyenv rehash
$ python
Python 3.6.1 (default, Nov 26 2018, 19:58:29) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-18)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

ここまではまあなんとか。

続きを読む

redmineのインストールでつまづく

redmineをインストールしようとして
Redmineが依存するgemパッケージをインストールのため
# bundle install --without development test --path vendor/bundle
としようとすると、途中で
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
というエラーが出て、最終的に

An error occurred while installing rmagick (2.16.0), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.16.0' --source 'https://rubygems.org/'` succeeds
before bundling.
というエラーで止まってしまう。
この原因はrmagick(2.16.0)がimagemagick (version7)に対応していないためで、imagemagickをversion6にダウンしなければならない模様。

rmagickのインストールにハマった - Qiita
ここで対処法が書かれているがMacのHomebrewでの話。
Linuxbrewだと
$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
の部分を
$ cd /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
と読み替えないとならない。

とまあ、うまくインストールできず今の所頓挫中・・・