あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

Live Dwango Readerが終わってしまったのでFastladderを自分用に再び整備した話

以前Livedoorがサービスを終了するとなった時にFastladderを動かし始めて、Dwangoが引き継いでからも適当に動かしつつDwangoの方をメインに使用していたのですが、Dwangoもいよいよ終了してしまったので再びFastladderをいじることにしました。

akkiesoft.hatenablog.jp

当時と比べると、mikutterのクソプラグイン作成で多少の経験値が積まれたと思われるので、諸々の問題が解決できたような気がします。おもにクローラー周りに取得できない問題が色々あって、そこを集中的に直しました。成果物はForkしたリポジトリのcrawlerブランチに置きました。

github.com

プルリクまでできれば良いのですが、修正よりもコミット文の英語のほうが怪しくて気が引けたので、していません。もしアレでしたらなんかいい感じになりますように。

インストール環境はざっくりUbuntu16.04+MySQL+Apacheです。Dockerのことはよくわからないのでそのままインストールしています。

また、このブログを書くもとにしたメモ書きはこちら。

fastladderをいじるやつ · GitHub

絵文字(4bytes UTF-8)対応

気がついたらいまどきの絵文字は4バイトで表現されているそうで、MySQLではutf8を使うと絵文字でやられるようです。代わりにutf8mb4を使うと良いみたいです。

create database fastladder charset=utf8mb4;

あとから変更するならこう

ALTER TABLE <<テーブル名>> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

URLが長すぎるフィードの取得対応

URL 長いフィードクロールできない · Issue #188 · fastladder/fastladder · GitHub」に相当する問題ですが、linkの型をvarchar(255)からtextに変更して対応してみました。

alter table items modify link text;

fastladder/lib/fastladder/crawler.rbの改良

以下の通り改良しました。

  • カテゴリーがないフィードの考慮漏れに対応。Engadget JapaneseのRSSで見られた
  • cut_off()メソッドの引数にfeedが足りないので足した
  • リンクタグの加工時にリンクではない文字(typoとかで不正になってるリンク)が混じるとフィードのクロールに失敗する問題を解消
  • delete_old_items_if_new_items_are_many()をコメントアウト
    • そもそもcut_off()と同様feedが足りない、Items.where(feed_id: feed.id).delete_all →Item.whereのtypoがある
    • が、そもそもこの処理がない方が挙動としてはいい感じになった
  • systemdで動かすように、SIGTERMを受け取ったらTerminateするように書きくわえた

systemdで動かす

いまどき的にはSystemdでサービスを上げ下げできたほうがうれしいので適当に書きました。

[Unit]
Description=Fastladder crawler
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/bin/ruby2.3 script/crawler -e production -l /var/log/fastladder/crawler.log
WorkingDirectory=/var/www/fastladder
KillMode=process
Restart=always
User=***
Group=***

[Install]
WantedBy=multi-user.target
[Unit]
Description=Fastladder web frontend
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/rails server -b 127.0.0.1 -e production
WorkingDirectory=/var/www/fastladder
KillMode=process
Restart=always
User=***
Group=***

[Install]
WantedBy=multi-user.target

新規ユーザー登録を潰す

お一人システムなので知らん人がたくさん入ってくるとまずいです。ので、新規ユーザー登録を潰しました。ブランチを分けてあります。

github.com

ロゴ

せっかくなのでロゴでも差し替えようかなと思ったんですが、いい感じのミク絵がないですね……。

f:id:Akkiesoft:20171009142210p:plain

OSC2017 Fukuokaについて

先週末はOSC2017 Fukuokaに行ってきました。

しかし、前夜祭で酔いつぶれてしまい、嘔吐とめまいで終日ブースに立つことができず、私の展示物を楽しみにしていた方(自分ではいないって信じているのですが…)には大変申し訳ありませんでした。会場でも終日感情を失った感じにしていたかと思いますが、喋ると吐きそうな感じの具合の悪さでした。すみません。

今後は当面の間、前夜祭での飲酒はやめて、懇親会で程々に飲むように対策してまいります。。

ブースについてはレイアウトは概ね前日にセット済みでしたが、いくつかの展示が満足にできない状況になってしまいました。また、Ejectブースはおかのさん(がわりと勝手)に、ラズパイブースはつぼさん、おおたさんに任せっぱなしとなってしまいました。本当に助かりました。向かいのブースでコスプレしながらラズパイオーディオブースをしていたれちくん、まってんくん、ざぶとんくんもありがとう。会うごとに心配してくれた皆様、たいへんご迷惑をおかけしました。

懇親会の後半までには申し訳程度のLTをできる程度には回復できましたが、二日酔いでここまで引きずるのもなかなかないな……と言う感じでした。資料はないですが、ブログでも読めるやつでしたので割愛します。

来週はOSC島根です。私の大好きな美味しい日本酒が多々あるかと思いますが、ぐっとこらえて本来の訪問目的を忘れずに行ってきます。

(もしかして、二日酔いもだけど、二次会のモツ鍋でなんか当てちゃったのかなあ……)

金魚の餌やり装置2

そういえば書こうと思って忘れてたのですが、先日の実家帰省に合わせて金魚の餌やり装置をリニューアルしました。残念ながら(なにが?)エアコンリモート操作に続くEject卒業作品2つめです。

そもそも金魚の餌がフレークから粒に変わったため、Ejectの方法は使えなくなってしまいました。方法はなんとなく思いついていたので、買ったまま放置していたサーボーモーターを取り出して、あり物でザッザッと組み立てました。

f:id:Akkiesoft:20171005005721j:plain

シンプルですね。動画で動作の様子も見られます。

サーボモーター以外の材料は適当にその場の思いつきでトイレットペーパーの芯を採用しましたが、いい感じでした。写真をあまり取っていなかったのでざっと文字で解説していきます。

トイレットペーパーの芯は2つ用意して、1つは縦に割るように切ります。もうひとつは土台ように半分くらいで横に切って、斜めに切り込みをいれておきます。

f:id:Akkiesoft:20171005005813j:plain

トイレットペーパーの芯と同じ直径の厚紙を用意して半分に切ります。それぞれ、弧の中央部分にパックマンの口みたいな切り込みを小さめに入れます。1つはトイレットペーパーの芯につけ、もう一つはサーボモーターにつけます。

サーボモーターを、半円の厚紙が少しくっつく程度に位置合わせしてセロハンテープとかで芯に止めます。

最後に、芯を土台に固定して完成。と言う感じです。ウン、もっと写真が必要だね。

プログラムは適当に作って(ググった)、パックマンの口みたいなのが一瞬だけ重なるようにしてやればOKです。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)

p = GPIO.PWM(18, 50)
p.start(0)
p.ChangeDutyCycle(9)
time.sleep(0.5)
p.ChangeDutyCycle(12)
time.sleep(0.5)
GPIO.cleanup()

あとは餌をセットして、餌の出ぐあいを確認しながらプログラムもしくは切込みの大きさを調整して終わり。

crontabで1日3回やるようにして4泊ほど帰省しましたが、問題なしでした。

今週末はOSC福岡、来週末はOSC島根と、鬼のようなスケジュールになりますが、これが活躍することになるでしょうー。

あと、OSCでもその場で組み立てて展示する予定です。会場でそんな時間があればね!!

100円ショップのメッシュパネルを切って使う

Maker Faireで100円ショップのメッシュパネルを使ってみたらいい感じだったんですが、Ejectコンテナーにはいるサイズではなかったので各地のOSCでは使いにくい状態でした。あと、1枚のパネルを別売りの足で立てるよりも、2枚を組み合わせてL字にして立てるつぼさんのやり方はなかなか良さそうでした。

というわけで、いい感じのメッシュパネルを探しに近隣のダイソーを見て回ったんですが、いい感じのサイズが無く、工作に走ってしまいました。33cmx33cmのメッシュパネルを1列犠牲にして切り落とし、33cmx15cmくらい?×2にしました。完成例ドーン。

f:id:Akkiesoft:20171005004539j:plain

MacBook Air 13インチと比較するとだいたい似たサイズです。

f:id:Akkiesoft:20171005004601j:plain

切断はニッパー…と思ったら、どうも中の細いやつでギリギリらしく、外側は別途工具が必要そうでしたが、金切り鋸で行けそうとの情報もあったので、持ってた気がしたけど使いやすそうなのがあったので同じくダイソーで調達。

f:id:Akkiesoft:20171005004634j:plain

数分ギコギコしたら切れました。内側のはニッパーで気合で切りました。

f:id:Akkiesoft:20171005004840j:plain

切断面は油性ペンか修正液で塗っとくと錆びないというアドバイスTwitterでいただいたので、油性ペンで塗り塗りしてから、ビニールテープを貼っておきました。あとは園芸用針金で数ヶ所止めて完成です。

サイズが小さいのでどのくらいかけられるか謎ですけど、圧縮陳列もとい立てて見せられる展示方法が手軽にできるようになると見栄えするかなーと思っています。

Raspberry Pi 2 v1.2でもPi3と同じPXE/USBブートができるかやってみた

去年、Raspberry Pi 3を対象にベータ的に利用できていたPXE/USBマスストレージ(以下USB)ブート機能ですが、これをRaspberry Pi 2 v1.2で実験してみたという話です。前に書いた記事は下記の2つ。

akkiesoft.hatenablog.jp

www.raspi.jp

Raspberry Pi 2 v1.2は、BCM2836からPi3と同じBCM2837にSoCが変更になりつつも、スペックと消費電力はもとのPi2と同じになっているものです。PXE/USBブートはBCM2837を積んでいるPi3のみの機能でしたが、Raspberry Pi 2 v1.2ではどうでしょうね、というのがこの記事でのネタです。

PXE/USBブート機能ですが、気がついたら正式版になっていたようで、2017/4/10リリースのRaspbianからはrpi-updateせずにそのままの環境で有効化できるようになったとのこと。また、USBデバイスブートする場合、SDカードと同じように書き込んでやればいいようになりました。簡単です。SDカードにddコマンドするときにオプションが必要になったのは多分このあたりの影響でしょうね。

www.raspberrypi.org

USBブートできるメモリかHDDを探して(意外と相性が出て3個目でようやく認識しました)Raspbianを書き込み、まずはPi3で起動を確認しました。

続けてRaspberry Pi 2 v1.2で実験するのですが、手持ちのやつがカスタムPiトライアルキットでして、USBポートを1つしか付けていない状態です。これじゃ起動しても動作確認できない。。

f:id:Akkiesoft:20170924031425j:plain

ので、USBハブを投入。動かせたUSBメモリが電車メモリでポートを潰してしまうので中間車延長ケーブルも出動(向きが合ってない!)。これでネットワークにも繋げられます。

f:id:Akkiesoft:20170924031205j:plain

電源を投入すると、ACTランプが点灯しますが、5秒ほどで消灯してブートが開始しました。USBハブ経由してるのにイケている!しばらく待ったらSSH接続もできるようになり、起動が確認できました。

Pi2 v1.2リリース以降ずっと気になっていたので、ようやく確認ができて非常にスッキリしました。まあ、だからといって常用する用事があるわけでもないんですけどね。PXE/USBブートが正式になっていたのも自分の中の情報をアップデートできて良かったです。満足、寝る。