[
板情報
|
カテゴリランキング
]
したらばTOP
■掲示板に戻る■
全部
1-100
最新50
| |
コンソールの2chブラウザを作るスレッド
55
:
(-_-)さん
:2017/03/23(木) 00:22:43 ID:???0
ダウンロード別スレッドの場合
ダウンロードしたデータを処理して反映させるときの同期処理(ロック)をするために
>>54
のどこかで割り込み処理をする必要がでてくる
56
:
(-_-)さん
:2017/03/23(木) 00:26:38 ID:???0
入力待ちが無限ループなのかイベント駆動なのかで色々と変わってきそう
termboxは無限ループで入力の有無を判定するのかな?
57
:
(-_-)さん
:2017/03/23(木) 00:31:56 ID:???0
イベント駆動の場合はコールバック関数内でのブロックは一般には御法度だったっけか
58
:
(-_-)さん
:2017/03/23(木) 00:33:49 ID:???0
マルチスレッドはマジで難易度高すぎ、しかしGo言語の軽量スレッドという特徴を使わないで、何秒もUIが固まるなんてアプリは使いたいとは思わないかもしれない
59
:
(-_-)さん
:2017/03/23(木) 00:37:15 ID:???0
マルチスレッドとはすなわちバックグラウンド処理でありユーザビリティのためにあるようなもの
60
:
(-_-)さん
:2017/03/23(木) 00:44:41 ID:???0
http://jbbs.shitaraba.net/bbs/read.cgi/computer/44607/1488300885/23-25
を見た感じだとデータ追加がキャパシティを超えない場合は元のデータに書き足されるが
newThread.Res = append(oldThread.Res, newResponseData)
とすることで、表示処理中はoldThread.Resのスライスを参照してるため追加データが増えてもスライスの範囲外で見えない
そしてバックグラウンド処理で取得した新しいレスのnewThread.Resは追加分の範囲までのスライスを持つ
スライスというのはスレッド安全性を高める設計なのか
61
:
(-_-)さん
:2017/03/23(木) 00:48:39 ID:???0
ロックは oldThread = newThread という上書きのタイミングのときだけでよく
Thread型自体が直接保有する値は現在設計では大したことないのでコピーもすぐ終わる
oldThread等をThread型じゃなく*Thread型(ポインタ)の参照にすれば参照のコピーだけで終わるからもっと早くすぐ終わるな
62
:
(-_-)さん
:2017/03/23(木) 00:55:20 ID:???0
そういえばチャネルとスイッチ構文を使った無限ループっぽいサンプルコードがあった気がしたなGo言語
それをうまく使えばロックの代わりにもなるのかな
チャネルはキューなわけだし
63
:
(-_-)さん
:2017/03/23(木) 00:57:49 ID:???0
単純にチャネル待ちのを入れちゃうと
data := <-ch
チャネルが空だとロックがかかってしまうから
スイッチ構文のだと回避できるのだったかな
64
:
ひきぷろ
◆SVQfrniSJY
:2017/03/23(木) 08:19:06 ID:???0
ダウンロードの処理についてのお話だけど、IOはプログラミング一般のお話としては
・ブロッキングIO
・ノンブロッキングIO
っていう種類分けができる。
Go言語の実装がどうなってるのか分からないけど、
JavaScriptの場合は、おおよそIOの処理がノンブロッキングIOになってることが多いみたいで、
ノンブロッキングIOだと、UIスレッド1本でIOを処理できる。
CPUの状態がブロッキングにならないから、コード的にいうと次の処理がウエイトなしで実行される。
古典的な方法では、処理の終了通知は、コールバック関数を引数で渡して通知してもらう構造になる。
(JavaScriptの場合はsetTimeout関数とか、そういう処理のイメージ)
ブロッキングIOを使う場合は、
・IOの処理を別スレッドで実行する
・UIと同じスレッドで実行して、UIのレスポンスを待ち状態にする
の、いずれかの状態になる。
IOの処理を別スレッドで実行する場合は、
・スレッド終了時に通知する
・スレッドの処理の途中で(終了を待たずに)、通知するタイミングを何度か設ける
っていう風に分類できると思う。
通知の処理は、デザインパターンでいうと、オブザーバーパターンで実装すると分かりやすそう。
別スレッドからUIスレッドに通知する時に、スレッドをまたいだことで発生する問題は、C#でいうと、
別スレッドから呼び出された関数を、UIスレッドで呼びなおす
っていう処理が実行できる。
上に書いたようなことを考慮すれば、ロック機構なしでうまく実装できると思う。
マルチスレッドプログラミングの経験はそんなにないけど、
ロックを使ったコードがあると、その周辺は容易に変更できないコードになるような気がする。
65
:
(-_-)さん
:2017/03/23(木) 09:21:14 ID:???0
ありがとう
知らない知識ばかりなのでちょっと調べてみる
66
:
(-_-)さん
:2017/03/24(金) 17:27:00 ID:???0
閲覧に関するの基本的な機能は大雑把に
◆画面出力系
板一覧の表示
板(スレ一覧)の表示
スレ(レス)の表示
◆通信系
板一覧のダウンロード
スレ一覧のダウンロード
スレ(新着レス)のダウンロード
◆データ処理
板一覧のhtmlから板名とURLの抽出
スレ一覧のhtmlからスレ名とレス数とURLとスレの順番の抽出
スレのhtmlからレス(レス番号、名前、メ欄、日付、ID、本文)の抽出
◆保存系
板一覧から抽出したデータをファイルに保存
スレ一覧から抽出したデータをファイルに保存
スレから抽出したデータをファイルに保存
◆読込系
保存したファイルから板一覧データの読み出し
保存したファイルからスレ一覧データの読み出し
保存したファイルからスレデータの読み出し
◆ユーザ入力系
板一覧の表示要求
板一覧の更新要求
板(スレ一覧)の表示要求(板の選択)
板(スレ一覧)の取得要求
板(スレ一覧)の更新要求
スレの表示要求(スレの選択)
スレ(全レス)の取得要求
スレ(新着レス)の取得要求(スレの更新要求)
67
:
(-_-)さん
:2017/03/24(金) 17:31:02 ID:???0
レスの書き込みはクッキー操作やフォームの解析も必要になるから難易度あがりそう
68
:
(-_-)さん
:2017/03/24(金) 17:33:07 ID:???0
レスの書き込みはゴミ箱にJava製のがあるけどこれはまだ使えるのかな?
http://ux.getuploader.com/hikkyp/download/2/write2ch.zip
69
:
(-_-)さん
:2017/03/24(金) 18:40:57 ID:???0
>>68
まだ使えた、これのコード参考にすれば何とかなるのかな
http://i.imgur.com/inRK2UM.png
http://tamae.2ch.net/test/read.cgi/dame/1439747269/260
70
:
(-_-)さん
:2017/03/25(土) 23:14:13 ID:???0
暫定的に定義
◆画面出力系
板一覧の表示 ... func ShowBoardList()
板(スレ一覧)の表示 ... func ShowThreadList(Board)
スレ(レス)の表示 ... func ShowResponse(Thread)
◆通信系
板一覧のダウンロード ... func DownloadBoardList()
スレ一覧のダウンロード ... func DownloadTheadList(Board)
スレ(新着レス)のダウンロード ... func DownloadResponse(Thread)
◆データ処理
板一覧のhtmlから板名とURLの抽出 ... func TakeBoardList(io.Reader) []Board
スレ一覧のhtmlからスレ名とレス数とURLとスレの順番の抽出 ... func TakeThreadList(io.Reader) []Thread
スレ一覧の抽出で抽出したデータと現在のデータの統合(マージ)... func MergeTreadList(Board,[]Thread) Board
スレのhtmlからレス(レス番号、名前、メ欄、日付、ID、本文)の抽出 ... func TakeResponse(io.Reader) []Response
レスの抽出で抽出したデータと現在のデータの統合(マージ)... func MergeResponse(Thread,[]Response) Thread
◆保存系
板一覧から抽出したデータをファイルに保存 ... func SaveBoardList([]Board)
スレ一覧から抽出したデータをファイルに保存 ... func SaveThreadList(Board)
スレから抽出したデータをファイルに保存 ... func SaveResponse(Thread)
◆読込系
保存したファイルから板一覧データの読み出し ... func LoadBoardList() []Board
保存したファイルからスレ一覧データの読み出し ... func LoadTheadList(Board) Board
保存したファイルからスレデータの読み出し ... func LoadResponse(Thread) Thread
◆ユーザ入力系
板一覧の表示要求 ... func InvokeShowBoardList()
板一覧の更新要求 ... func InvokeUpdateBoardList()
板(スレ一覧)の表示要求(板の選択)... func InvokeShowThreadList(Board)
板(スレ一覧)の取得要求 ... func InvokeGetThreadList(Board)
板(スレ一覧)の更新要求 ... func InvokeUpdateThreadList(Board)
スレの表示要求(スレの選択)... func InvokeShowResponse(Thread)
スレ(全レス)の取得要求 ... func InvokeGetAllResponse(Thread)
スレ(新着レス)の取得要求(スレの更新要求)... InvokeGetNewerResponse(Thread)
ブラウザの終了 ... func InvokeExit()
71
:
(-_-)さん
:2017/03/25(土) 23:17:44 ID:???0
>>70
あくまで暫定
データをどう保持するか、とか、全体の処理の流れが十分に決まってないから
決まっていくたびに再定義したほうがよさそう
72
:
(-_-)さん
:2017/03/26(日) 04:13:15 ID:???0
ま、ここまでのほとんどのが暫定ではあるけど
73
:
(-_-)さん
:2017/03/26(日) 04:18:50 ID:???0
スライスのappendで自動拡張されるときで新しいメモリが確保されたときシャローコピーが発生するわけで
[]Threadや[]Responseのシャローコピーが発生するのは高コストだから
[]*Threadや[]*Responseに書き換える必要があるのかもな
74
:
(-_-)さん
:2017/03/26(日) 04:21:37 ID:???0
>>70
は関数で定義してしまっているけどメソッドという形での定義でもよさそうだな
func SaveThreadList(Board) は func (*Board)Save() とか
func MergeTreadList(Board,[]Thread) Boardは func (*Board)Merge([]*Tread) Board とか
75
:
(-_-)さん
:2017/03/26(日) 04:25:13 ID:???0
一応説明捕捉するとMerge系のはBoardやThreadをイミュータブルな型としてみなして更新データを返却するというイメージね
ミュータブルで直接更新でもいいのかもしれないけど
76
:
ひきぷろ
◆SVQfrniSJY
:2017/03/27(月) 17:08:31 ID:???0
projecthikky @ ウィキ - ヒッキー共同開発に関するページ/2chブラウザ
https://www54.atwiki.jp/projecthikky/pages/104.html
ちょっとだけ追記してみた
77
:
(-_-)さん
:2017/03/27(月) 22:40:13 ID:???0
>>76
乙です
78
:
(-_-)さん
:2017/03/28(火) 16:31:13 ID:???0
アプリ起動
↓
前回終了時の状態の読込(保存してあるデータの読込)
↓
画面に表示
↓
ユーザからの入力待ち
↓
ユーザの入力
↓
処理
79
:
(-_-)さん
:2017/03/29(水) 23:06:01 ID:???0
[アプリ起動]
↓
[前処理]
↓
[画面表示] ←┐ループ
↓ │
[入力待ち] │
↓ │
[要求された処理]┘
80
:
(-_-)さん
:2017/03/30(木) 07:02:35 ID:???0
[前処理]は
初回起動時は板一覧の取得とか
次回以降は保存されてる板一覧とかの読み込みとか
81
:
(-_-)さん
:2017/03/30(木) 19:23:59 ID:???0
マルチスレッドにするなら
{{メインスレッド}}
[アプリ起動]
↓
[前処理]
↓
[各スレッド起動]
↓
[画面表示スレッドに表示リクエスト]
↓
[入力待ち]←───┐
↓ │
[要求に応じた処理]┘(アプリ終了以外の処理)
↓(アプリ終了の要求なら)
[後処理]
↓
[アプリ終了]
{{画面表示スレッド}}
[リクエスト待ち]←┐
↓ │
[画面表示]────┘
{{ダウンロードスレッド}}
[リクエスト待ち]←──────────────────┐ 無限ループ
↓ │
[指定ファイルをダウンロード] │
↓ │
[1つのダウンロードが終わったことを表示するよう │
画面表示スレッドにリクエスト] │
↓ │
[ファイルを処理する関数を実行する新規スレッドを立てる]┘
{{各ファイルを処理する関数のスレッド}}
[ファイルからデータ抽出]
↓
[現在のデータと新規のデータを統合(マージ)]
↓
[ファイルへの保存]
↓
[更新したデータを表示可能だと画面表示スレッドにリクエスト]
↓
[このスレッドの終了]
82
:
(-_-)さん
:2017/03/30(木) 19:28:42 ID:???0
[前処理]は
>>80
と同じ
[後処理]は
起動中のスレッドの終了とか
アプリの状態の保存とか
[要求に応じた処理]は
・板一覧の表示を要求
・板を選択してスレ一覧を表示の要求(ダウンロードやファイルからの読み込み)
・開いてるスレ一覧の更新の要求
・スレを選択してレスを表示の要求(ダウンロードやファイルからの読み込み)
・開いてるスレの更新の要求(新着レスのダウンロード)
そして
・アプリの終了
83
:
(-_-)さん
:2017/04/01(土) 03:51:12 ID:???0
2chのスレのhtmlのフォーマット変わった?
前はdl,dt,ddあたりのタグでレスが列挙されてた気がしたけど
今見たらdivでレスが括られてた
84
:
(-_-)さん
:2017/04/01(土) 03:57:49 ID:???0
古い2chまんまの仕様だと言われる2ch.scはdl,dt,ddの構成
http://ikura.2ch.sc/test/read.cgi/hikky/1489179773/l50
同じく2ch型を謳うしたらばもdl,dt,ddの構成(ただし文字コードがEUC-JP)
http://jbbs.shitaraba.net/bbs/read.cgi/computer/44607/1489736608/l50
しかし肝心の2ch.netがdivになってる(しかも改行とかが詰められて圧縮されてる)
http://hanabi.2ch.net/test/read.cgi/hikky/1489179773/l50
85
:
(-_-)さん
:2017/04/01(土) 03:59:29 ID:???0
まぁもともとscへのコピー対策でクローリング対策やスクレイピング対策をされてるだろうから
html文書の構成がちょくちょく変わる可能性あるね(APIじゃないと厳しいところあるのかも)
86
:
(-_-)さん
:2017/04/04(火) 17:45:17 ID:???0
> ダウンロードについては、HTTPのIf-Modified-Sinceヘッダをうまく扱えれば
> 本文のダウンロード処理を減らすことができそう
これって静的コンテンツ以外でも使えたんだっけ?
スレってサーバ側のスクリプト(read.cgi)で動的生成だろうから
read.cgiがそのヘッダをどう取り扱っているか調べないといけないね
87
:
(-_-)さん
:2017/04/04(火) 17:48:23 ID:???0
以前のdat形式は静的コンテンツだったからそのヘッダを使うことが推奨されていたのだけれど
88
:
(-_-)さん
:2017/04/04(火) 21:36:23 ID:???0
板一覧とスレ一覧は静的か
過疎板でなけりゃスレ一覧は更新頻度高いから確認する意味なさそうだけど
89
:
ひきぷろ
◆SVQfrniSJY
:2017/04/05(水) 02:00:46 ID:???0
もう調べ終わった後かもしれないけど、
動的生成のページは、If-Modified-Since対応をあえて書いてる場合しか
HTTPステータスで304とか返してくれなさそうだよね。
転送容量を減らすという機能でいうと、
2chはURLのスレIDの後に "/100-" とか書くと、途中のレスから読める機能があったよね。
90
:
(-_-)さん
:2017/08/18(金) 19:09:04 ID:RqcRcy1I0
itestのAPIを使ったらどう?
認証ないから不正アクセスじゃないし、スクレイピングでもない
91
:
(-_-)さん
:2017/10/02(月) 14:31:15 ID:xWRj2EwM0
2chは5chに変わったそうですよ
92
:
(-_-)さん
:2020/01/14(火) 19:42:45 ID:QlE6dbBA0
少し挙動が怪しいですがこうなりました
https://ux.getuploader.com/hikkyp/download/41
新着レスの表示
名前:
E-mail
(省略可)
:
※書き込む際の注意事項は
こちら
※画像アップローダーは
こちら
(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板