【新月実装】需【Clojure・ClojureScript】

8d11b5a3 anonymous 2016-01-15 05:23
@markdown
ああ、こうしなきゃいけないのか。もうちょっと調べてみよう。

```
>>> apollo.sign(util.md5digest("body:test"), "DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9VhApcrYy94XhMBKONo5H14c8STrriPJnCcVA", "BAcp0SUgUOSY+TrLhy/MEszzq0Obadi3EhXDEUUD9FmOkv7vhPiNrgg2HR8DmuFiPcXNHdqu44wyGRX5bmdcQA")
'DmjCwvX8DMpsEr30bGB8XIXMgTO6Iwz8Yb5Q0CjACoqZK1kvkYluXjiW3n24QMzZ5qPb3Z49JLPV4ek
LL0yRJA'
```
8e6b0c2b anonymous 2016-01-15 09:39
ははあわかったぞ。署名対象ハッシュ文字列を数値化するのに失敗してるんだな。長さが120文字になるようにパッディングすればいいのかな。紛らわしいなあ。
b31e90a7 anonymous 2016-01-15 15:29
原因はパッディングじゃなくてmd5ダイジェストからmへの変換の仕方でした。

[[新月の開発/2f239e11]]

今度こそ大丈夫なはずだけど、えらく時間がかかったな…
af4e5fd5 anonymous 2016-01-15 15:40
@markdown
とりあえず今日の成果。次の書き込みのsignを生成できました。あとは署名機能に関しては面倒くさいことはなにもないはず…

http://saku.nakayuki.net:8000/server.cgi/get/thread_E38386E382B9E38388/1452747955

```clojure
(let [record-body "body:test"
      target (digest/md5 record-body)
      md5-to-bigint (fn [s]
                      (apply +
                             (map
                               (fn [c n] (* (bigint (int c)) (clojure.math.numeric-tower/expt 256 n)))
                               s
                               (range (count s)))))
      expt-mod (fn [b e n] (bigint (.modPow (biginteger b) (biginteger e) (biginteger n))))
      base64-table
      {0  "A" 16 "Q" 32 "g" 48 "w"
       1  "B" 17 "R" 33 "h" 49 "x"
       2  "C" 18 "S" 34 "i" 50 "y"
       3  "D" 19 "T" 35 "j" 51 "z"
       4  "E" 20 "U" 36 "k" 52 "0"
       5  "F" 21 "V" 37 "l" 53 "1"
       6  "G" 22 "W" 38 "m" 54 "2"
       7  "H" 23 "X" 39 "n" 55 "3"
       8  "I" 24 "Y" 40 "o" 56 "4"
       9  "J" 25 "Z" 41 "p" 57 "5"
       10 "K" 26 "a" 42 "q" 58 "6"
       11 "L" 27 "b" 43 "r" 59 "7"
       12 "M" 28 "c" 44 "s" 60 "8"
       13 "N" 29 "d" 45 "t" 61 "9"
       14 "O" 30 "e" 46 "u" 62 "+"
       15 "P" 31 "f" 47 "v" 63 "/"}
      bigint-to-base64 (fn bigint-to-base64
                         [n]
                         (if (>= n 64)
                           (concat (list (get base64-table (rem n 64))) (bigint-to-base64 (quot n 64)))
                           (list (get base64-table n))))
      add-padding (fn [s] (str s (apply str (repeat (- 86 (count s)) "A"))))
      public-key 1122806372610712283641764701710834148204234645585040684037170652091590554067499953763526724213941221496764286040865822589763248156452468642704658988427843N
      secret-key 861280222834211635003719961005341323199464182108597666477205899292436716184420718855991902898025496028982723694319590089136399532658790932223389304471553N]
  [
   (count target)
   target
   (md5-to-bigint target)
   (expt-mod (md5-to-bigint target) secret-key public-key)
   (add-padding (apply str (bigint-to-base64 (expt-mod (md5-to-bigint target) secret-key public-key))))
   ])
```
92d1c88c anonymous 2016-01-15 17:05
署名の確認をこのスレで試してみよう

[[【コテハン】新月黙示録更新報告【大辞典】]]
3b326be9 anonymous 2016-01-15 18:03
@markdown
署名の検証も試してみました。公開鍵とシグニチャから本文のmd5ダイジェスト
(44419214286006158861137771899985306382062246609227984941284330775348791043381N)が
再構築できたのでこれで問題ないはずです。

```
(let [record-body "body:test"
      target (digest/md5 record-body)
      md5-to-bigint (fn [s]
                      (apply +
                             (map
                               (fn [c n] (* (bigint (int c)) (clojure.math.numeric-tower/expt 256 n)))
                               s
                               (range (count s)))))
      expt-mod (fn [b e n] (bigint (.modPow (biginteger b) (biginteger e) (biginteger n))))
      public-key 1122806372610712283641764701710834148204234645585040684037170652091590554067499953763526724213941221496764286040865822589763248156452468642704658988427843N
      secret-key 861280222834211635003719961005341323199464182108597666477205899292436716184420718855991902898025496028982723694319590089136399532658790932223389304471553N
      test-signature 485929915806472765213575522933223159394941576528520956259553264248457078912341366480238285348741046848091733570511927351801272738791576365987870892767619N]
  [(md5-to-bigint target)
   (expt-mod test-signature 65537 public-key)])
```
20e85408 anonymous 2016-01-15 18:28
忘れないうちにコードの整理をしないと…
c4ea9eee anonymous 2016-01-16 01:17
なんか無駄にめんどくさそうなことになってたみたいでかわいそう
a87b0b31 anonymous 2016-01-16 02:32
>>c4ea9eee
プロトコルの仕様書を読んだときから嫌な予感はしてたんですけどね~
まあ新月プロコトルの実装が増えればノウハウも自然に集まるでしょう。
d93b708e anonymous 2016-01-16 03:00 1452880853.jpg (80KB)
このスレが読みにくかったのでMarkdownに対応させました。
需もだいぶ形になってきた感じです。
39887f91 anonymous 2016-01-16 07:56
そういえば素数テストを朔と完全互換にしなきゃいけないんだっけ。
忘れないようにしないと。
5b438af8 anonymous 2016-01-16 08:48
素数階段
そすーんさー
4760e415 anonymous 2016-01-16 09:04
なぜか需のAJAXのリクエストとFirefoxの相性が悪くて、特定の条件でFFが落ちるようです。とほほ…
590980e0 anonymous 2016-01-16 09:06
React/reagentの問題だとかなりめんどくさいな。
84dee8b2 anonymous 2016-01-16 10:17
Firefoxをアップデートしたら落ちなくなりました。
気になるけどまあ良しとします。
ffe7d06a anonymous 2016-01-16 12:03
@markdown
apollo.pyのClojure版が一応出来ました。

```clojure
(def int-to-base64-char-table
  {0 "A" 16 "Q" 32 "g" 48 "w"
   1 "B" 17 "R" 33 "h" 49 "x"
   2 "C" 18 "S" 34 "i" 50 "y"
   3 "D" 19 "T" 35 "j" 51 "z"
   4 "E" 20 "U" 36 "k" 52 "0"
   5 "F" 21 "V" 37 "l" 53 "1"
   6 "G" 22 "W" 38 "m" 54 "2"
   7 "H" 23 "X" 39 "n" 55 "3"
   8 "I" 24 "Y" 40 "o" 56 "4"
   9 "J" 25 "Z" 41 "p" 57 "5"
   10 "K" 26 "a" 42 "q" 58 "6"
   11 "L" 27 "b" 43 "r" 59 "7"
   12 "M" 28 "c" 44 "s" 60 "8"
   13 "N" 29 "d" 45 "t" 61 "9"
   14 "O" 30 "e" 46 "u" 62 "+"
   15 "P" 31 "f" 47 "v" 63 "/" })

(def base64-char-to-int-table (clojure.set/map-invert int-to-base64-char-table))

(defn- expt-mod [b e n] (bigint (.modPow (biginteger b) (biginteger e) (biginteger n))))

(defn- hex-string-to-bigint
  [s]
  (apply +
         (map
           (fn [[x y] n] (* (bigint (Integer/parseInt (str x y) 16)) (expt 256 n)))
           (partition 2 s)
           (range (/ (count s) 2)))))

(defn- is-nth-bit-on? [num n] (pos? (rem (quot num (expt 2 (dec n))) 2)))

(defn- bigint-to-base64-
  [n]
  (if (>= n 64)
    (concat (list (get int-to-base64-char-table (rem n 64))) (bigint-to-base64- (quot n 64)))
    (list (get int-to-base64-char-table n))))

(defn- add-padding [s] (str s (apply str (repeat (- 86 (count s)) "A"))))

(defn- bigint-to-base64
  [n]
  (add-padding (apply str (bigint-to-base64- n))))

(defn- base64-to-bigint
  [s]
  (apply +
         (map (fn [c n] (* (bigint (get base64-char-to-int-table (str c))) (expt 64 n)))
              s
              (range (count s)))))

(defn get-prime-numbers-for-signature
  [password]
  (let [hashs (str (digest/md5 password)
                   (digest/md5 (str password "pad1"))
                   (digest/md5 (str password "pad2"))
                   (digest/md5 (str password "pad3")))
        match (re-find #"^(.{56})(.{72})$" hashs)
        p (hex-string-to-bigint (nth match 1))
        q (hex-string-to-bigint (nth match 2))
        p (if (is-nth-bit-on? p 216) p (+ p (expt 2 215)))
        q (if (is-nth-bit-on? p 280) q (+ q (expt 2 279)))
        p (bigint (.nextProbablePrime (biginteger p)))
        q (bigint (.nextProbablePrime (biginteger q)))
        t 30531
        e 65537]
    (loop [p p
           q q]
      (let [n (* p q)
            d (bigint (.modInverse (biginteger e) (biginteger (* (dec p) (dec q)))))]
        (if (= (expt-mod t (* e d) n) t)
          [n d]
          (recur (+ p 2) (+ q 2)))))))

(defn- md5-string-to-bigint
  [s]
  (apply +
         (map
           (fn [c n] (* (bigint (int c)) (expt 256 n)))
           s
           (range (count s)))))

(defn sign-post
  [target password]
  (let [[n d] (get-prime-numbers-for-signature password)
        public-key (bigint-to-base64 n)
        secret-key (bigint-to-base64 d)
        target-bigint (md5-string-to-bigint (digest/md5 target))
        c (expt-mod target-bigint d n)
        signature (add-padding (apply str (bigint-to-base64 c)))]
    {:public-key public-key :signature signature}))

(defn verify-signature
  [target public-key signature]
  (= (md5-string-to-bigint (digest/md5 target))
     (expt-mod (base64-to-bigint signature) 65537 (base64-to-bigint public-key))))
```

こんなふうに使えます。

```
(ju.routes.shingetsu/sign-post "body:test" "test")
=>
{:public-key "DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9VhApcrYy94XhMBKONo5H14c8STrriPJnCcVA",
 :signature "DmjCwvX8DMpsEr30bGB8XIXMgTO6Iwz8Yb5Q0CjACoqZK1kvkYluXjiW3n24QMzZ5qPb3Z49JLPV4ekLL0yRJA"}
(ju.routes.shingetsu/verify-signature "body:test" "DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9VhApcrYy94XhMBKONo5H14c8STrriPJnCcVA" "DmjCwvX8DMpsEr30bGB8XIXMgTO6Iwz8Yb5Q0CjACoqZK1kvkYluXjiW3n24QMzZ5qPb3Z49JLPV4ekLL0yRJA")
=> true
```

調べてみたら朔の素数判定の誤り率が1/4^10=1/1048576、
Clojure (Java)のは1/2^100=1/1267650600228229401496703205376だったので
とりあえず素数判定の問題は後回しにすることにします。
6521c5fb anonymous 2016-01-16 19:19
気分転換にデータベースをMySQLに変更してみました。
インデックスを幾つか追加したらかなり快適に動作するようになりました。
「ゆぐちゃんねる」にはMySQLを使うので、これで一安心です。
435c76f6 anonymous 2016-01-16 21:01
このページを表示するには広告のブロックを解除してください。


お疲れ様でした。さようなら
d87f3237 anonymous 2016-01-16 21:25
TRANSACTION ISOLATION LEVELの設定を間違えてたので慌てて修正。
危ない危ない。
885f1945 anonymous 2016-01-16 21:39
おかしいなあ、やっぱりデフォルトの設定でいいはずだけど…
とりあえずREPEATABLE READを明示的に設定しておこう。

> In terms of the SQL:1992 transaction isolation levels, the default InnoDB level is REPEATABLE READ.
http://dev.mysql.com/doc/refman/5.7/en/innodb-transaction-model.html
ee8f113a anonymous 2016-01-16 23:46
サイズの大きなスレでクエリにOFFSETを使うとMySQLではかなり遅くなるので、クエリを書き直し。やっぱりそれぞれのデータベースエンジンにかなり癖がありますね。
09753dc9 anonymous MGlbrmj//PR 2016-01-17 07:06
署名機能の実装がようやく終わりました。
署名の確認はサーバーで行って、失敗したらpubkey等をクライアントに渡さないようにしました。
いずれ全部クライアント側で行いたいですね。あとは素数判定だけど、これは暇があるときにします。
9a45ba8f anonymous 2016-01-17 17:28
気が向いたので2ch互換インターフェースの実装を開始。
表示の方は直ぐにできました。問題は書き込みだけど、これは後でやろうっと。
a87ac3a6 anonymous MGlbrmj//PR 2016-01-18 06:51
需のWindows用の実行ファイルをlaunch4jで作成したらちゃんと動いてしまいました。
JREもバンドルできるみたいなので配布するときにはWindows用のパッケージも用意しようっと。
b004def0 anonymous MGlbrmj//PR 2016-01-18 21:52 1453121550.jpg (107KB)
「新着レスまとめ読み」機能を実装。既読スレッドの未読レスをまとめて表示してくれます。「新月@ゆぐちゃんねる」の同じ機能に比べて性能が段違いに良くなったので、非常に満足ですw
66628597 anonymous 2016-01-19 10:29
UPnP対応のためのメモ。ポート開放が必要なくなるのは大きいですね。

Cling - Java/Android UPnP library and tools
http://4thline.org/projects/cling/

Router port forwarding using cling
http://stackoverflow.com/questions/15324689
33706b4b anonymous 2016-01-20 11:37
スパムフィルタの実装を開始。とりあえずほとんどは名前とメールのチェックで弾くことが出来ました。

ファイルの数: 1110
レコードの数: 302384
有効なレコードの数: 119203
削除されたレコードの数: 183181
キャッシュサイズ: 5257MB

問題は2013-05-11のTwitterコピペ荒らしですが、これを綺麗に削除するのはちょっと手間ですね。
0f12e665 anonymous 2016-01-20 15:36
Twitterコピペ荒らしを削除してさらにすっきり。

ファイルの数: 1110
レコードの数: 302385
有効なレコードの数: 102421
削除されたレコードの数: 199964
キャッシュサイズ: 5257MB
e5f674cc anonymous 2016-01-20 16:01
@markdown
下はスパムの削除に使用したコードです。コピペ荒らしは期間とスレが限定されていたので割と楽に削除できました。

```clojure
(defn remove-spam
  []
  (dorun (map (fn [record]
                 (let [record (ju.db.core/get-record-by-id (:id record))
                       body (String. (:body record) "UTF-8")
                       elements (->> (clojure.string/split body #"<>")
                                     (map #(re-find #"^([a-zA-Z0-9]+):(.*)$" %))
                                     (map #(do {(keyword (nth % 1)) (nth % 2)}))
                                     (apply merge))
                       thread-title (unhexify (second (re-find #"^thread_(.*)$" (:file-name (ju.db.core/get-file-by-id (:file-id record))) )))]
                   (when (or (and (:name elements) (pos? (count (:name elements)))
                                  (:mail elements) (pos? (count (:mail elements)))
                                  (:body elements)
                                  (or (re-find #"^[^ぁ-ゞァ-ヶ]+$" (:body elements))
                                      (re-find #"http://|href=" (:body elements))))
                             (and (<= 1368259441 (:stamp record)) (<= (:stamp record) 1368334184)
                                  (some #{thread-title}
                                        #{"新月を広める方法を考えよう~♪"
                                          "\"2ちゃんねるに代わる新たな新天地\"\"新月\"\"\""
                                          "【2ch】難民キャンプ【書き込み規制】"
                                          "SPAM"
                                          "雑談しながらリンクを貼るスレ"
                                          "新月の開発"
                                          "【ただひたすら書き込むスレ】"
                                          "雑談"
                                          "初心者用質問スレッド"
                                          "Twitterの真似事"
                                          "ここが新月かぁ~"
                                          "今日の天気を報告するスレ"
                                          "メニュー"
                                          "朔の「状態」を晒す"})
                                  (not (some #{[(:stamp record) thread-title]}
                                             #{[1368269164 "朔の「状態」を晒す"]
                                               [1368288797 "朔の「状態」を晒す"]
                                               [1368322356 "朔の「状態」を晒す"]
                                               [1368291561 "新月の開発"]
                                               [1368292773 "新月の開発"]
                                               [1368324146 "新月の開発"]
                                               [1368287598 "新月を広める方法を考えよう~♪"]
                                               [1368321534 "新月を広める方法を考えよう~♪"]
                                               [1368321715 "新月を広める方法を考えよう~♪"]
                                               [1368323070 "【2ch】難民キャンプ【書き込み規制】"]
                                               [1368289606 "ここが新月かぁ~"]
                                               [1368289928 "ここが新月かぁ~"]
                                               [1368287843 "初心者用質問スレッド"]
                                               [1368294225 "初心者用質問スレッド"]}))))
                     (ju.db.core/mark-record-as-deleted (:id record))
                     (taoensso.timbre/info (:id record)
                                           (:stamp record)
                                           thread-title
                                           (:body elements)))
                   (if (zero? (mod (:id record) 100))
                     (comment taoensso.timbre/info "Processed" (:id record) "records."))))
               (sort #(< (:id %1) (:id %2)) (ju.db.core/get-all-records-with-ids-only))))
  (ju.db.core/update-all-files))
```
fe589d48 anonymous 2016-01-21 13:42
勉強の合間に書き込みのプレビュー機能とレスのコンテキストメニューを実装。
「新月@ゆぐちゃんねる」の機能をほとんどそのまま移植したので結構すんなり出来ました。
とりあえず新しい公開ゲートウェイの試験稼働を早く始めたいので、そのための作業を優先させようっと。
3857eec2 anonymous 2016-01-21 13:57
あ、でも適当なサーバーを借りてテストも兼ねて公開すればいいのか。
eac2a786 anonymous 2016-01-21 18:03
暇そうだったサーバーに需を入れて動かしてみたんですが、やっぱりメモリが足りないw
とりあえずサーバーをアップグレードしてみたけど、本番までに最適化しておかないと…
b0842de0 anonymous 2016-01-21 18:10
その代わりといってはなんですが、レスポンスは想像していたよりずっといいです。
しばらく様子を見て問題がなかったらアドレスを公開しようっと。
10e688af anonymous 2016-01-21 18:35
大丈夫そうですね。アドレスはこれです。
感想や要望があったら是非どうぞ。

http://45.56.121.29:48888/
c1fe7ad2 anonymous 2016-01-21 19:32
確かに軽く感じますね。

普段使ってるスマホ(SH-02D android2.3.5とSH-13C android2.3.4)の標準ブラウザで見ると、最初の矢印の円の画面から進まないのだけど、まあこれは単純に古いから必要な機能の一部が対応してないのかな…と。実際シェア自体減少傾向というか少ないらしいですしね。
同じ端末に入れてるFirefoxのandroid版では何の問題も無く使えてますし。

セキュリティホールだとか、SSL対応サイトの関係とかで、いい加減新しい端末を買わなきゃいけないとは思うんですがね……。
b191dd41 anonymous 2016-01-21 20:09
>>c1fe7ad2
なんででしょうね~ ちょっと気になりますね…
a4bc3fed anonymous 2016-01-21 20:23
>>c1fe7ad2
調べてみたらFileAPIに対応していないようです。残念…
04dc1a6c anonymous 2016-01-21 20:24
あっという間にディスクが満杯になったので現在サーバーを止めてディスクを拡張中。
最初にやっておけばよかった…
b1969bec anonymous 2016-01-21 21:06
>>a4bc3fed
でもまあ、必要であればp2だとかm2bとか経由して2chインターフェイス経由で見れば事は足りると思うので、さほど問題ないかと。
b0e29cf8 anonymous 2016-01-22 05:53
>>b1969bec
それだと便利な機能があまり使えないのでもったいない気もしますが、まあ仕方がないですね。未対応のブラウザの場合はちゃんとエラーメッセージを出すようにします。
a527142c anonymous 2016-01-22 05:58
スパムフィルタを改良して、テスト用のサーバーを仕切りなおしました。
性能はすこぶるいいのですが、いかんせんメモリを食いまくりです。
ちゃんと型指定しようっと。
1d5098bd anonymous 2016-01-23 01:18
>>10e688af
需レスポンス良いな
ストレス無くてよさげ
48908d06 anonymous 2016-01-23 01:27
ちょっと需を止めます。
ff9ed6ca anonymous 2016-01-23 02:49
うーん、名前とレスがほとんど重複してるスレが結構ある…
半角大文字が小文字に勝手に変換されているようです。
需のバグかと思って顔が青ざめたけどそうでもないみたいなのでかなり謎です。
他のノードに伝播する前に、一応需を止めておきました。
もうちょっと調べてみます。

("自作PC -> 自作pc "
 "Linux -> linux "
 "ROBOCRAFT -> robocraft "
 "TEST -> test "
 "【GOOD-BYE 2ch WORLD!】2ちゃんねるの終焉を見届けるスレ -> 【good-bye 2ch world!】2ちゃんねるの終焉を見届けるスレ "
 "Freezone -> freezone "
 "【P2P】ニュース速報【掲示板】 -> 【p2p】ニュース速報【掲示板】 "
 "恒心教綜合P2P支部 -> 恒心教綜合p2p支部 "
 "AA保管庫 -> aa保管庫 "
 "I2P -> i2p "
 "UQ Wimax -> uq wimax "
 "Freenet新月支部 -> freenet新月支部 "
 "PerfectDark新月支部 -> perfectdark新月支部 "
 "NHK総合実況 -> nhk総合実況 "
 "AKB48 -> akb48 "
 "P2P関連 -> p2p関連 "
 "SPAM -> spam "
 "AngelBeats -> angelbeats "
 "FREEZONE -> freezone "
 "えろ画像何でもUp -> えろ画像何でもup "
 "えろ画像何でもUp2 -> えろ画像何でもup2 "
 "感動FLASHを集めるスレ -> 感動flashを集めるスレ "
 "【車輪の】JavaライブラリJunkUtil【再発明】 -> 【車輪の】javaライブラリjunkutil【再発明】 "
 "【ny,share】ロリ物総合スレ 94【eMule】新月 -> 【ny,share】ロリ物総合スレ 94【emule】新月 "
 "【帯域制限】ISP総合【格安】 -> 【帯域制限】isp総合【格安】 "
 "P2Pファイル共有ソフト -> p2pファイル共有ソフト "
 "セーラー服 Part.1 -> セーラー服 part.1 "
 "SPam -> spam "
 "Spam -> spam "
 "SPAm -> spam "
 "sPam -> spam "
 "spAm -> spam "
 "spaM -> spam "
 "VIPからきますた -> vipからきますた "
 "セーラー服+Part.1 -> セーラー服+part.1 "
 "Loli -> loli "
 "Girls -> girls "
 "Kid -> kid "
 "thread_E4BD90E38085E69CA8E5B88C -> thread_e4bd90e38085e69ca8e5b88c "
 "AAA -> aaa "
 "Candydoll -> candydoll "
 "【ny,share】ロリ物総合スレ+94【eMule】新月 -> 【ny,share】ロリ物総合スレ+94【emule】新月 "
 "IDにhovenが出たら天国に行けるスレ -> idにhovenが出たら天国に行けるスレ "
 "Pantyhose -> pantyhose "
 "Teen -> teen "
 "Crescentのつづき -> crescentのつづき "
 "JC -> jc "
 "LOLI -> loli "
 "Vim -> vim "
 "TEST1 -> test1 "
 "Linux -> linux "
 "Sex -> sex "
 "Debian -> debian "
 "Ls -> ls "
 "【GOOD-BYE+2ch+WORLD!】2ちゃんねるの終焉を見届けるスレ -> 【good-bye+2ch+world!】2ちゃんねるの終焉を見届けるスレ "
 "PERVERTS -> perverts "
 "U15 -> u15 "
 "UQ+Wimax -> uq+wimax "
 "銆怭2P銆戙儖銉ャ兗銈归€熷牨銆愭幉绀烘澘銆 -> 銆怭2p銆戙儖銉ャ兗銈归€熷牨銆愭幉绀烘澘銆 "
 "DEBIAN -> debian "
 "JS -> js ")
3abe2d04 anonymous 2016-01-23 05:28
とりあえず対策をして需を復旧させました。
どのノードからやってくるのか調べないと…
9c652d87 anonymous 2016-01-23 08:53
>>1d5098bd
今の「新月@ゆぐちゃんねる」が遅過ぎなので、需は一から作り直しました。
HTML5の使用を前提にしてかなり積極的にウェブブラウザの新しい機能を使っています。
基本的にページの読み込みは最初の一回だけなのが大きいですね。
d0aebe3f anonymous 2016-01-23 09:42
スパム対策も兼ねて、レコードをどのノードからダウンロードしたのか記録するようにしようっと。
そうすればTwitterコピペ荒らしみたいなのは簡単に防げるし。
89f4e6d7 anonymous 2016-01-23 11:23
だいたい壊れたデータがどこからやってきたかわかったけどどうしようかな…
51bce898 anonymous 2016-01-24 08:21
壊れたデータの件が無事に解決できました。もうちょっと過去ログのデータの正当性をきちんと確認できる仕組みがあるといいんですけどね。shingetsu.infoの過去ログももうちょっと参考にさせてもらおうかな。ブロックチェーンを新月に取り込む話も興味深いです。
e144bdd8 anonymous 2016-01-24 08:32
需を本番用のデータベースでしばらく稼働させていますが、特に問題は無いようです。マスターマスターレプリケーションの冗長構成なので落ちる心配はまずないです。念のためこっちのサーバーもアップグレードしておこうかな。
ab48ee93 anonymous 2016-01-24 17:46
現在HTTPS接続のバグ取り中。「新月@ゆぐちゃんねる」よりもだいぶ快適なのでさっさと正式に公開したいところですが、まだ作業が残っているので我慢我慢…
05d53743 anonymous MGlbrmj//PR 2016-01-25 04:17
2ch互換インターフェースがメモリを食いまくりだったので、専用のコラムを追加してレコードの変換結果をキャッシュすることにしました。朔でも同じ問題が発生してたんですけど、どうやらうまく解決できそうです。
82bb218a anonymous 2016-01-25 07:57
>>05d53743の作業はうまくいって、2ch互換インターフェースの速度が大幅に改善されました。ちゃんと仕上げてからサーバーに乗っけようっと。
511e38b6 anonymous 2016-01-25 10:48
全文検索のためのメモ。
[[新月実装開発部/949e8ce6]]

すっかり忘れてたけどリンクをコピーする機能をメニューに追加しなきゃ。
bcb96ab1 anonymous 2016-01-26 11:10
レコード用のテーブルを変更したら絵文字のあるレスで問題が出たのでMySQLデータベースの文字コードを全てutf8mb4に変更しました。意外なところに落とし穴があるもんです。

How to support full Unicode in MySQL databases
https://mathiasbynens.be/notes/mysql-utf8mb4
f8b7b42c anonymous 2016-01-26 22:44
2ch互換インターフェースからの書き込みを試してみたら、案の定文字化けしましたorz
どうしようかな…
f7acf62b anonymous [sage] 2016-01-27 15:03
やれやれ、ようやくうまくいったみたいです。
2chブラウザの書き込みのエンコードが特殊だったので手こずりました。
あとはダミーの結果ページを返してやれば完成かな。
e31bf0e8 anonymous 2016-01-27 15:11
@markdown
こんな風にringのラッパーを作って対処しました。
柔軟なのはいいけど資料が殆ど無いのはちとしんどいですね。

```clojure
(defn- percent-encode-everything
  [s]
  (cond
    (zero? (count s))
    ""

    (re-find #"^(%[0-9A-F]{2})+$" s)
    s

    (re-find #"^%[0-9A-F]{2}" s)
    (let [match (re-find #"^(%[0-9A-F]{2})(.*)$" s)]
      (percent-encode-everything
        (str
          (nth match 1)
          (percent-encode-everything (nth match 2)))))

    :else
    (percent-encode-everything
      (str
        (format "%%%02X" (int (first (take 1 s))))
        (apply str (drop 1 s))))))

(defn percent-decode-for-2ch-post
  [s]
  (timbre/debug s)
  (percent-decode (percent-encode-everything s) "windows-31j"))

(defn wrap-2ch-post
  [handler]
  (fn [request]
    (if (= (:uri request) "/test/bbs.cgi")
      (handler (assoc request
                 :form-params
                 (->> (clojure.string/split (slurp (:body request)) #"&")
                             (map #(re-find #"^([^=]+)=(.*)$" %))
                             (map #(do {(keyword (nth % 1)) (percent-decode-for-2ch-post (nth % 2))}))
                             (apply merge))))
      (handler request))))
```
4316f3c0 anonymous MGlbrmj//PR 2016-01-27 15:46
書き込み要求へのレスポンスは次のページから拾ってきたのでうまくいきました。

http://meriken.ygch.net/programming/monazilla/05.html

タグへの対応とかは残っているけど、一応これで2chインターフェースの作業は終わりました。性能は申し分ないので非常に満足です。
74b28bac anonymous 2016-01-27 16:52
/headのたびにレコード全体をデータベースから読み込んでいたバグを修正。
道理でメモリをやたらと消費してたわけだ…
e6383baa anonymous 2016-01-27 17:18
需に限らずなのですが、2chインターフェイスの場合、他のスレッドへのリンクは
うんたら/test/read.cgi/……
に変換されているのですが、そのURLをそのままウエブブラウザでアクセスした
時に404を返す形になっていると思うのですが、これ「該当のスレのwebインター
フェイスへのリダイレクト」という形にする事はできないものでしょうか。

2chインターフェイスを2chブラウザで見ている分にはタイトルも併記していますし、
現行仕様で支障がないのですが、何かの勘違いでそのURLだけ伝聞された場合
に何のことやらさっぱりなので。

3ff03c92 anonymous 2016-01-27 17:30
あ、需はそもそも、そういうURL吐いてないか……。
f1b54524 anonymous MGlbrmj//PR 2016-01-27 22:47
>>e6383baa
了解しました。
44eb65db anonymous 2016-01-28 14:02
需をbb2cから覗いてみたら二番目以降の本文が空欄になってしまっていました
datファイルの形式が間違っている事が原因のようです

http://vipprog.net/wiki/専ブラ開発への道.html
2行目以降が、
名前<>メール欄<>年/月/日(曜) 時:分:秒.下二桁(無い板もある) ID:hogehoge0<> 本文 <>
2e227306 anonymous [sage] 2016-01-28 14:48
>>e6383baa
対応しました。

>>44eb65db
指摘ありがとうございます。危ない危ない…+直しておきました。
7df5a51b anonymous 2016-01-28 16:01
>>2e227306
ありがとうございます。
あと>>511e38b6のような他のスレへのリンクが(2chインターフェイス用URLに)変換されないままdatに残ってるみたいなのですが、
古いキャッシュが残っているだけなのでしょうか。
d71f524e anonymous 2016-01-28 23:07
>>7df5a51b
これどうしようか迷ったんですよね。
まあでも一応変換するようにしておきます。
cf5a7e7e anonymous [sage] 2016-01-29 04:16
>>7df5a51b
対応しました。見た目がイマイチ好きになれないんですけど、まあでもないと不便ですよね。
0308d0da anonymous 2016-01-29 10:35
>>cf5a7e7e
ありがとうございます。

確かに見た目が変ですね……。

個人的には2chの見慣れたフォーマットで考えると括弧内を
すべて置き換える形で、

(空行)
スレッドタイトル
2chインターフェイスのスレッドURL
(空行)

となった方が「まだ」しっくりくるのかも……。
とかは思いますが。
ad8edf91 anonymous 2016-01-29 10:55
スレッド上のレスの減があった場合に、
2chインターフェイスのアンカーがそのままになってて、
話のつじつまがあわない状態になってる。

いちいち書き換えてたら折角のキャッシュの意味がなくなり
そうだから、仕様として割り切った方がいいのかな。

55c6f6de anonymous 2016-01-29 11:15
>>ad8edf91
アンカーの変換はリクエストのたびに行ってるので、専ブラのキャッシュを削除して読み込み直せば直せますよ。
875ac928 anonymous 2016-01-29 13:55
>>0308d0da
うーん、これをやるとおかしくなるリンクもあるので微妙ですね。
どうしようかな…
f3f7e913 anonymous 2016-01-29 14:45
いつの間に専用の独自ドメインが……

>>875ac928
見た目が変でも、使えるのだから当面そのままでもいいかもしれません。
気になるのであれば専ブラの方で成形してください。と。

>>55c6f6de
と私も思ったので、雑談スレのdatを直で覗いてみたんですが、ずれたまま
なんですよね…。違うサーバでも見ちゃってるんでしょうか。
fe43ad77 anonymous 2016-01-29 14:55
>>f3f7e913
orz 調べてみます。
新しいドメイン名は自分では結構気に入っていますw
b2f7dd42 anonymous 2016-01-29 19:00
>>f3f7e913
直しておきました。今度こそ大丈夫なはずです。
d47a716e anonymous 2016-01-29 19:09
>>b2f7dd42
ありがとうございます。
私が見てるスレについては直っているみたいです。

見てみるスレを増やして様子をみてみます。
355ea2e9 anonymous 2016-01-30 01:58
>>d47a716e
よろしく~
b2b0788a anonymous 2016-01-30 11:55
閲覧する2chブラウザを増やしてみたのだけど、
android用ブラウザの 2chmate version 0.8.9.3で、スレ一覧を開くと、「404が返ってきたよ」とお返事が。

朔の2chインターフェイスでは同環境下で普通に使えたので、違うURL(subject.txt以外)を参照してしまった
とは考えにくいなぁと。
あと、スレ自体は読めてるんです。

アナライザーでも通さなきゃ、どこのURLを参照して404を返してるのかよく判らないし、需のせいでない可能性も高いとは思うのだけど…。


6d1e8d0e anonymous 2016-01-30 12:07
>>b2b0788a
いろいろ調べてくださってほんとに助かります。
多分ローカルルールか板設定情報を読みに行ってるんでしょう。
追加しておきます。

----

【ローカルルール】
・ローカルルールの設置場所は次の通りです。
http://[サーバー]/[板名]/head.txt

【板設定情報】
・板設定情報の設置場所は次の通りです。
http://[サーバー]/[板名]/SETTING.txt
(各項目の意味はSETTING.TXT解読シヨウーヨをご覧下さい。)

【負荷率情報】
・負荷率情報の設置場所は次の通りです。
http://[サーバー]/_service/
http://meriken.ygch.net/programming/monazilla/14.html
d6cb0cbe anonymous 2016-01-30 12:16
>>b2b0788a
朔が対応しているのはローカルルールだけみたいですね。
ついでだからSETTING.txtも用意しておこうっと。

http://shingetsu.ygch.net/2ch/head.txt
http://shingetsu.ygch.net/2ch/SETTING.txt
9e4ffb8f anonymous 2016-01-30 12:20
>>d6cb0cbe
あ、こっちだったか。どのみち対応していないようだけど…

http://shingetsu.ygch.net/2ch/SETTING.TXT
4a9d6611 anonymous MGlbrmj//PR 2016-01-30 14:44
>>b2b0788a
直しておいたので是非また試してみてください。
75e61f77 anonymous [sage] 2016-01-30 15:43
>>4a9d6611
読み込めましたー!
取り急ぎご報告まで。
0987bf1b anonymous 2016-01-30 16:09
>>75e61f77
それは良かった。報告助かりました。
32bd775b anonymous 2016-01-30 16:12
2chインターフェースのブラケットリンクの変換処理が結構重かったので手を入れたらだいぶ軽くなりました。そういえば朔のは激重でしたね… 明日辺りにサーバーに上げます。
587f5795 anonymous 2016-01-31 07:02
ブラケットリンクの変換はだいぶ速くなりました。よかったよかった。

本番用のデーターベースに重複したレコードが見つかったのでよく考えてみたら、マスターマスターレプリケーションのせいでトランザクションアイソレーションが
思ったように機能していないことが判明。危なかった~
af94f25d anonymous 2016-01-31 16:44
なんか、ygg.ioが503返してるから45.56.121.29:48888でアクセスしたら応答してくれない。
報告がてら、久しぶりに朔の方のゆぐちゃんねる(の新月ゲートウエイ)から書き込み。
c8bf81c9 anonymous 2016-01-31 17:30
すいません、現在mikaちゃんのお漏らしのお掃除中です。
もう少ししたら復帰させます。
13839aff anonymous 2016-01-31 17:33
>>af94f25d
ポートを8880に変えました。そのうちygg.ioに一本化する予定です。
4f1191d3 anonymous 2016-01-31 18:01
ygg.ioの需を復帰させました。こっちに慣れると「新月@ゆぐちゃんねる」は結構ストレスがたまりますね。
f77201e0 anonymous 2016-01-31 18:08
>>4f1191d3
webインターフェイスも2chインターフェイスも需の方が早く感じるのはどうも間違いではなさそう。
9701535f anonymous 2016-01-31 18:55
>>f77201e0
あとは本番でもちゃんと動くといいんですけど、こればっかりはやってみないとなんとも言えないですね。
95c7dd06 anonymous 2016-02-02 08:30
「新月@ゆぐちゃんねる」の朔をなるべく早く需で置き換えたいので、現在一般公開のための準備を進めています。とりあえず必要な作業はこんなところです。

・スレッド情報の更新の効率化。
・タグ機能の追加。
・書き込みフォームの仕上げ。
・画像のサムネイルの作成。
・「新規スレッド作成」ページの追加。

あとはなにかあったかな…
7ffadbd1 anonymous 2016-02-02 08:42
あと追加したい機能はこんなところです。

・スレタイ検索
・全文検索
・ログイン機能
769ef7fc anonymous 2016-02-02 08:43
あ、絵文字対応を忘れてた! 書き込みフォームの作業と一緒にやっちゃおうっと。
921e58da anonymous [sage] 2016-02-02 09:07
需はfeedって吐いてたっけ。

個人的には、無くても現状支障が出てないのだけど。
a726c509 anonymous 2016-02-02 09:16
>>921e58da
そういえばそんな機能もありましたね。
自分では全く使わないんですけど、一応追加しておきます。

・RSSへの対応。
1426498a anonymous 2016-02-02 12:36
ygg.ioへの書き込みがちゃんと伝播されていなかったのでサーバーの設定をいじりました。他のノードとの通信にCloudFlareを挟んでみたんですけど、流石に無理があったみたいです。
c55e5c04 anonymous 2016-02-02 12:44
多分ノードによっては/updateの送信元のIPを隣接ノードのリストと照らし合わせてるんだろうけど、うまくいったりいかなかったりなのでちょっと良くわかりません。
4bc96da3 anonymous 2016-02-03 11:18
昨日は画像のサムネイルを作成するルーチンを実装しました。
あとAAの表示にも対応しました。AAのあるレスは自動的に「MS Pゴシック」か「IPAモナーフォント」で表示するようにしてあります。なかなか懐かしい雰囲気ですw

AA保管庫
https://ygg.io/thread/AA%E4%BF%9D%E7%AE%A1%E5%BA%AB

Top of this page. | <<last 0 1 2 old>>

limit: 15360KB

(【新月実装】需【Clojure・ClojureScript】/214/0.5MB)


Powered by shinGETsu.