cre-ne-jp / log-archiver Goto Github PK
View Code? Open in Web Editor NEWIRC ログ記録・閲覧システム
Home Page: https://www.cre.ne.jp/services/irc
License: MIT License
IRC ログ記録・閲覧システム
Home Page: https://www.cre.ne.jp/services/irc
License: MIT License
IRC コマンドを定義するテーブルを用意するかどうかの議論をここに残しておきたいです。
複数チャンネル指定時に、結果表示画面とそのURLがどのような形になればよいか自信がなかったので立ててみました。
該当メッセージ一覧で表示する項目に、以下のようにチャンネルを追加する?
検索結果:こんにちは
2017-03-25
時刻 チャンネル メッセージ 12:34:56 #cre (ocha)
こんにちは11:23:34 #もの書き (koi-chan)
こんにちは2017-03-24
時刻 チャンネル メッセージ 12:23:34 #cre (ocha)
こんにちは...
新規にデータベースを設定しようとマイグレーションを行なうと、次の位置でエラー終了する。
db/migrate/20170617130524_recreate_conversation_messages_irc_user_id.rb:13
Mysql2::Error: Cannot drop column 'irc_user_id': needed in a foreign key constraint 'fk_rails_de9941562b': ALTER TABLE conversation_messages
DROP irc_user_id
発言(PRIVMSG・NOTICE)は特別に集計する場合があったり全文検索の対象としたりするので、テーブルを分けておくと扱いが楽そう。モデル名としては「Remark」あたりが適当?
他のメッセージと同じように「type」カラムを設けて、Privmsg・Noticeに継承させると扱いやすくなると思われる。
発言数のグラフ表示で使っているchart-js-railsについて、以下のコミットより読み込むJavaScriptファイルの名前が変更された。
coderbydesign/chart-js-rails@c37267b
# 私見:広い意味でAPIの変更と見なせるので、パッチバージョンでなくメジャーバージョン、せめてマイナーバージョンを上げてほしい😢
対策としては、app/assets/javascripts/application.jsの
//= require Chart
を
//= require Chart.min
に変更する。
IRCログより。
23:35:13 <koi-chan> QUITしたときのメッセージなんですが、「クライアントが終了しました」より「切断されました」の方がすっきりするように思うのですがいかがでしょうか
04:48:16 <OTE> QUIT時メッセージは確かに「切断されました」の方が適切だと感じます。
現在の実装では、ログの本文はある1日分しか表示することが出来ない。
データベースに保存しているため本来は「1日」という縛りはないはずなので、特定の日時のログを全て表示できるようにしたい。
例:「#もの書き の昨日の22時から今日1時にかけて、日付をまたいで行なわれた会話のログをつなげて(一つの画面で)見たい」
検索を使うと複数チャンネル・範囲指定の日時で抽出が可能だが、出力されるのが(前後のログを含む)本文ではなく、マッチしたその発言しか出てこない。
1日分のページにおいて、メッセージ一覧の上と下に「前日」「翌日」のリンクを追加する。隣り合う日を閲覧しやすくなる。
条件分岐の間違いにより「.log url」だけのときにエラーが出るようです。
log-archiver/lib/ircs/plugins/user_interface.rb
Lines 44 to 59 in 641291f
# (?: | ) の左側にマッチし、$1はnilになる
match(/url(?:$| (today|yesterday|list))/, method: :url)
date = case(day)
when 'list'
send_and_record(m, result)
return
when 'today'
Date.today
when 'yesterday'
Date.today.prev_day
else
# day == nil なのでここに来る
begin
# Date.parse(nil) はTypeErrorを起こす
Date.parse(day)
rescue ArgumentError => e
send_and_record(m, "#{header}日付指定が間違っています")
return
end
# TypeErrorはrescueされないので例外発生
end
ある特定の日のログを検索しようと開始・終了を同じ日付にすると、検索結果が0件になる。
これは、検索条件の終了日の00:00:00までのログを検索しようとしているためだと思われる。
より直感的な操作をできるようにするため、これを終了日の23:59:59までを検索出来るようにしたい。
現在は通常表示・生ログ(風)表示の2パターンの表示が出来るようになっている。
他アプリケーションから読みやすくするために JSON 形式での出力と、LimeChat2 形式での出力に対応したい。
ログをコピペすると、1行が複数行に分かれる。
2017-04-14 #cre ログより
14:54:28 (asahiya) 発言行をコピペすると、2行になるんですけど。これだとログのチャットへの引用が見にくくなるんじゃないかなーと
14:54:46 (asahiya) #Nickと発言本文で、2行。
14:55:10 (asahiya) 1行になるならそーしていただけるとたすかりまする
14:56:04 (koi-chan) http://gyazo.cre.jp/data/340a4814b6f27340792f09de3e4c31f1.png なるほど、確かに。ありがとうございます
14:56:04 (Toybox) FetchTitle: (image/png; 7.24 KB)
14:56:04 (Role) FetchTitle: (image/png; 7.24 KB)
14:56:41 (asahiya) あ。発言時間込みだと4行ってことになるんですかね。
14:56:50 (koi-chan) みたいです
14:57:24 (asahiya) ……それだと正直ログの引用が全く使え無くなるレベルって感覚です。手間が増えすぎるなと
14:57:45 (koi-chan) 了解です、検討してみます
14:57:50 (asahiya) 2,3行の複数行なら一括で出したい時があるので。
14:57:57 (asahiya) すみませんがよろしくお願いします
14:58:30 (asahiya) #コピペ時に発言時間を別にする、とかできるならそれでもいいと思います。
14:58:48 (asahiya) #引用したいのは発言本文なので。
Ruby 2.4以降でxmlrpcライブラリがgemとして切り出されたため、xmlrpcをgemとしてインストールしないとLoginNickservプラグイン等を読み込めない。Gemfileにxmlrpcを追加してこの問題を解消する。
ログの表示スタイル(通常か生ログか)等をCookieに保存するという案が以前出ましたが、Cookieを更新するタイミングをどうするか考えています。現在考えているのは
style=raw
が入っていたら、 ページ読み込み時に message_list_style=raw
という値でCookieを更新する。通常表示(style=normal
または style
指定なし)でも同様に message_list_style=normal
という値でCookieを更新する。の2案です。どちらが使いやすそうでしょうか?
同じチャンネルを複数の LogArchiver で取得・公開すると、同じ内容のウェブサイトとして SEO の問題がある。
ログの取得・公開は行なうが、そのチャンネルのページに meta タグの noindex を指定できるようにしたい。
もしくは、link タグの canonical で任意のウェブページを指定できるようにしたい。
Rack サーバを追加する。
想定として、nginx + unicorn 環境とする。
JavaScriptを使い、入力された正規URLの形式が正しいかを入力中に確認できるようにする。:year, :month, :day
が置換される例を見られると分かりやすい。
いくつかの機能は NickServ に依存している。
そのため、NickServ のないIRCネットワークに接続しても使えるよう、設定で NickServ を使うかどうかを選択できるようにする。
チャンネルの月・日の選択画面でも「前へ」「次へ」のリンクを設置し、隣の項目を閲覧しやすくする。
テンプレートからの正規URL生成が正しく行えることを確認するテストを追加する。
issue: #114
まずは Rails 5.0 系列にアップデートします。
IRCボットに、NickServ にログインするプラグインを実装する
ログインした後の、見出しに「管理」があるページ (/admin) に、稼働中のバージョンを表示させる。
Ruby 2.4.0 で実行できるようにする。
ruby24 ブランチで、Travis-CIでのチェックは開始した。 -> b791ecc
json 1.8.3 を使い続けているのが原因で、どうやら(このバージョンが?) ruby2.4.0 でビルドできないのが原因である。
ただ、ほかの gem と依存関係にあるためと思われるのだが、bundle update の対象にならない。
rails ごとアップデートしてしまったものだろうか(現在は v4.2.6)。
ページタイトル(ページ上部と title タグの中身)にある「IRC ログアーカイブ」の文字列を、設定ファイル(もしくはデータベース内に保存する設定)で変えられるようにしたい。
ベータ版として公開するときにはそれを示しておきたいが、現在はソースを直接書き換えなくてはいけない、ですよね?
バージョンはできるだけこまめにあげた方が良いそうなのですが、すでに何世代か遅れてしまっています。
srv5 のOS再インストールを行なう際に古い環境を減らしたいため、それまでに 5.2 系列までアップデートしたいです。
できるだけこまめに(少なくともマイナーバージョンは飛ばさずに)、アップデートしていった方が良いようです。
Railsのバリデーション機能を使い、正しい形式でURLが入力されたか検証する。
バージョンを返すコマンドしか現在は実装されていないが、この出力がログの保存対象になっていない。
他のユーザーの発言と同じく、データベースに記録したい。
検索の条件にエラーがあった際、例外が発生する。
Messages::SearchesController#createやshowからWelcomeControllerに対応するビューを呼び出すため、app/views/welcome/index.html.erbにおいてパーシャルを描画するときに明示的にwelcomeのパスを指定する必要がある。
メッセージを何らかの理由(例えばIRCサーバ規約違反など)で非表示にする際、ログデータ自体を削除するのではなく、非表示にする事を設定するカラムを追加したい。
そのカラムに設定する値を、例えば
などの理由をつけて非表示にしたい。
似たシステムとしてwhitequark/ircloggerというのがあります。
こちらでは参加・退出のメッセージ(JOINとかQUITとか)が最初は表示されず、チェックボックスで表示するモードに変えられます。最初はログを簡潔に表示して、必要ならばすべてのメッセージを表示することも可能、という方針のようです。
最初の表示が見やすい印象があったのですが、log-archiverにも取り入れた方がよいでしょうか?
Ruby 2.5.0でTravis CIのテストが通っていないので、対応させる。
一般利用者向けのユーザーインターフェースを実装する。
この issue では、特にIRC側の各機能の管理を行なう。
「Rails のルーティング | Rails ガイド」を見てルーティングを改善する。特にメンバールーティングやコレクションルーティングを適用できる部分がありそう。
チャンネル一覧のページで表示する項目を現在の半分デバッグ用の表示から変える。
IRCログより。
23:35:50 <koi-chan> あと、ユーザーの接続元の表示なんですが、
23:36:23 <koi-chan> nick (nick!user@host) という書式になっていますが、nick (user@host) で良いと思います。
04:49:03 <OTE> 接続元表示についても鯉さんの提案のモノで良いと思います。
以下の5つ、全て rails4.2 では通っていた。
FAIL["test_検索結果が正しく表示される", #<Minitest::Reporters::Suite:0x00000009cf3d30 @name="MessagesSearchTest">, 14.670947776990943]
test_検索結果が正しく表示される#MessagesSearchTest (14.67s)
日付の見出しが存在する.
Expected 0 to be >= 1.
test/integration/messages_search_test.rb:24:in `block in <class:MessagesSearchTest>'
FAIL["test_ニックネームを指定した場合の検索結果が正しい", #<Minitest::Reporters::Suite:0x0000000a363d50 @name="MessageSearchTest">, 21.57572074700147]
test_ニックネームを指定した場合の検索結果が正しい#MessageSearchTest (21.58s)
Expected: 5
Actual: 0
test/models/message_search_test.rb:165:in `block in <class:MessageSearchTest>'
FAIL["test_検索文字列とニックネームと日付を指定した場合の検索結果が正しい", #<Minitest::Reporters::Suite:0x0000000994d848 @name="MessageSearchTest">, 21.809181190037634]
test_検索文字列とニックネームと日付を指定した場合の検索結果が正しい#MessageSearchTest (21.81s)
Expected: 2
Actual: 0
test/models/message_search_test.rb:203:in `block in <class:MessageSearchTest>'
FAIL["test_検索文字列とニックネームを指定した場合の検索結果が正しい", #<Minitest::Reporters::Suite:0x0000000b708950 @name="MessageSearchTest">, 22.11692432599375]
test_検索文字列とニックネームを指定した場合の検索結果が正しい#MessageSearchTest (22.12s)
Expected: 3
Actual: 0
test/models/message_search_test.rb:185:in `block in <class:MessageSearchTest>'
FAIL["test_検索文字列を指定した場合の検索結果が正しい", #<Minitest::Reporters::Suite:0x0000000a7639a0 @name="MessageSearchTest">, 22.309156202012673]
test_検索文字列を指定した場合の検索結果が正しい#MessageSearchTest (22.31s)
Expected: 4
Actual: 0
test/models/message_search_test.rb:146:in `block in <class:MessageSearchTest>'
特にチャンネルについて、テスト実行時にデータベースがうまくクリアされない問題があるようなので、それを解消する。
rails db:migrate
の後、db/schema.rb が変更される。変更後、データベース更新時にエラーが発生するためテストが通らなくなる。
Rails 4.2ではこの問題は発生せず、Rails 5から発生するようである。
diff --git a/db/schema.rb b/db/schema.rb
index 19db4de..2631b6f 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20170704121029) do
+ActiveRecord::Schema.define(version: 20170617130524) do
create_table "channel_last_speeches", force: :cascade, options: "ENGINE=Mroonga DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" do |t|
t.integer "channel_id"
@@ -108,5 +108,7 @@ ActiveRecord::Schema.define(version: 20170704121029) do
t.index ["username"], name: "index_users_on_username", unique: true, using: :btree
end
+ add_foreign_key "channel_last_speeches", "channels", name: "channel_id"
add_foreign_key "channel_last_speeches", "conversation_messages", name: "conversation_message_id"
+ add_foreign_key "conversation_messages", "channels", name: "channel_id"
rails new するとできる bin ディレクトリまとめ によると、開発・管理コストを下げることが出来るらしい。
データベースに保存されたデータをバックアップするための rake タスクが欲しい。
また、バックアップデータから自動的にデータを書き戻すタスクがあればなお良い。
どのような項目があったら使いやすいか考えながら決める。
IRCボットのプラグインの基底クラスLogArchiver::Plugin::Baseのコンストラクタに @ircserv = IrcServ.new
という部分があります。これが実行されるため、すべてのプラグインにおいて読み込み時にAtheme Servicesにログインしようとします。
しかし、LoginNickservを除いてAtheme Servicesを利用しているようには見えません。また、LoginNickservはローカル変数でXMLRPCクライアントを作るので、結局 @ircserv
は使いません。
したがって、この部分は少なくとも現在の時点では不要ではないでしょうか?
テストで使っているFactoryGirlがFactoryBotに改名され、以前の名前での使用は非推奨になったため、FactoryBotを使うようにする。
参照: https://github.com/thoughtbot/factory_bot/blob/4-9-0-stable/UPGRADE_FROM_FACTORY_GIRL.md
ログ検索結果ページのチャンネルに設定されているリンクのURLが間違っている。
誤:hostname/channels.chname
正:hostname/channels/chname
現在は YAML 形式のテキストファイルで行なっている IRC ボットの設定を、サイト名などと同様にデータベースに保存し、リアルタイムに書き換えられるようにする。
特に横幅が広いときのレイアウトを修正する。
現在の問題点は
そこで、以下のようにする。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.