tag:crieit.net,2005:https://crieit.net/tags/BBS/feed 「BBS」の記事 - Crieit Crieitでタグ「BBS」に投稿された最近の記事 2022-10-13T13:41:39+09:00 https://crieit.net/tags/BBS/feed tag:crieit.net,2005:PublicArticle/18297 2022-09-26T22:01:37+09:00 2022-10-13T13:41:39+09:00 https://crieit.net/posts/BBS アノニマス BBS プログラムの系譜をまとめていく <p>BBS プログラムについて調べていると日本でのインターネット掲示板のプログラムが時代背景の理解なしには、なぜそうなっているのかまったくわからない点があるので、掘り下げて1995年辺りから系譜をおって概要を調べてまとめていきたい。</p> <p>よく知られている匿名のインターネット掲示板である 4chan、そのクローンのような komica (Taiwan) 、8kun 等へ影響を与えているようなので、その元になったと思われるプログラムのことについてよく知りたい。つまり、2 ch てよく知らないけど、まだあるということを最近知って、その直接的ではないが 2ch から影響をうけた 4chan 、8chan 等で事件がよく起こっていることに関心がある。</p> <hr /> <p>komica<br /> <a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/Komica">https://ja.m.wikipedia.org/wiki/Komica</a></p> <p>8chan / 8kun<br /> <a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/8chan">https://ja.m.wikipedia.org/wiki/8chan</a></p> <p>歴史参考資料:<br /> あめぞうの歴史<br /> <a target="_blank" rel="nofollow noopener" href="http://history.amebbs.com/">http://history.amebbs.com/</a></p> <p>『あやしいわーるどの歴史』(2006/09/28 現在)<br /> <a target="_blank" rel="nofollow noopener" href="http://f16.aaacafe.ne.jp/~stwalker/">http://f16.aaacafe.ne.jp/~stwalker/</a></p> <p>スレッドフロート型掲示板<br /> <a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/スレッドフロート型掲示板">https://ja.m.wikipedia.org/wiki/スレッドフロート型掲示板</a></p> <p>Everything shii knows<br /> 'Anonymous'<br /> <a target="_blank" rel="nofollow noopener" href="https://shii.bibanon.org/shii.org/knows/Anonymous.html">https://shii.bibanon.org/shii.org/knows/Anonymous.html</a><br /> '4chan'<br /> <a target="_blank" rel="nofollow noopener" href="https://shii.bibanon.org/shii.org/knows/4chan.html">https://shii.bibanon.org/shii.org/knows/4chan.html</a></p> <p>「Qアノン」はなぜ日本でも浸透しているのか? 黒幕の実像に迫ったルポ/藤原学思『Qを追う 陰謀論集団の正体』<br /> <a target="_blank" rel="nofollow noopener" href="https://note.com/asahi_books/n/n30f689b063bf">https://note.com/asahi_books/n/n30f689b063bf</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://archive.ph/bjmj1">https://archive.ph/bjmj1</a><br /> 個人情報3万件流出か<br /> <a target="_blank" rel="nofollow noopener" href="https://archive.ph/5vPgR">https://archive.ph/5vPgR</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://archive.ph/jsZdB">https://archive.ph/jsZdB</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://crieit.now.sh/upload_images/1bc8646e5abd82bb79be14705c53c99763413ffe8b67c.png">image</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://crieit.now.sh/upload_images/26c0b56a78d0f45842551ef97242f58663427b260a61b.jpg">image</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://atmarkit.itmedia.co.jp/ait/articles/1309/12/news012.html">https://atmarkit.itmedia.co.jp/ait/articles/1309/12/news012.html</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://crieit.now.sh/upload_images/c253b04ab039a1a90209ef72ec32c1b163427bc13fef7.jpg">image</a></p> <p>Onionちゃんねるで発生した「さっしーえっち ◆MwKdCUj7XWlQ」による情報漏えいをまとめてみた。<br /> <a target="_blank" rel="nofollow noopener" href="https://piyolog.hatenadiary.jp/entry/20130901/1378006827">https://piyolog.hatenadiary.jp/entry/20130901/1378006827</a></p> <p>「昔から、「2chのコードをひろゆきは書いてない」というデマを流す人がいたけど、あめぞうが潰れたのはあめぞうウイルスの影響です。」@hirox246<br /> <a target="_blank" rel="nofollow noopener" href="https://togetter.com/li/1957179?page=3">https://togetter.com/li/1957179?page=3</a></p> <p>なぜ沖縄はデマ情報の悪意にさらされるのか|ひろゆき氏のツイートに端を発し注目を集める沖縄・辺野古の抗議運動。繰り返されるデマと悪意にさらされる構造とは|ゲスト:伊藤昌亮・モバイルプリンス(10/12)<br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/k92y1O9jAwk?t=3389">https://youtu.be/k92y1O9jAwk?t=3389</a></p> <h2 id="[ PHP 4 ] ksphp-en (kuz-sysadmin committed on 6 Aug 2021)"><a href="#%5B+PHP+4+%5D+ksphp-en+%28kuz-sysadmin+committed+on+6+Aug+2021%29">[ PHP 4 ] ksphp-en (kuz-sysadmin committed on 6 Aug 2021)</a></h2> <p>A similar script to the one used on ayashii's world, an ancient japanese textboard that is considered the precursor to 2ch.<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/kuz-sysadmin/ksphp-en/">https://github.com/kuz-sysadmin/ksphp-en/</a></p> <p>kuzuha script (perl) => PHP 4</p> <p><strong>group: ayashii world</strong><br /> <strong>group: kuzuha script</strong></p> <h2 id="[ Perl ] くずはすくりぷと (2000.9.3-)"><a href="#%5B+Perl+%5D+%E3%81%8F%E3%81%9A%E3%81%AF%E3%81%99%E3%81%8F%E3%82%8A%E3%81%B7%E3%81%A8+%282000.9.3-%29">[ Perl ] くずはすくりぷと (2000.9.3-)</a></h2> <p><strong>[origin]</strong> くずはすくりぷと Rev.0.1 Preview 9 (2000.9.3) (掲示板本体)<br /> あやしいわーるど@暫定版 Rev. 0.22 (2012.10.19現在)<br /> w.atwiki.jp/swsw/pages/12.html</p> <p><strong>group: ayashii world</strong><br /> <strong>group: kuzuha script</strong></p> <h2 id="[ Perl ] 靴スミ掲示板 (2000.1.21)"><a href="#%5B+Perl+%5D+%E9%9D%B4%E3%82%B9%E3%83%9F%E6%8E%B2%E7%A4%BA%E6%9D%BF+%282000.1.21%29">[ Perl ] 靴スミ掲示板 (2000.1.21)</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.csmith.jp/contents/csbbs/">https://www.csmith.jp/contents/csbbs/</a></p> <p><strong>group: amezou</strong></p> <h2 id="[ Perl ] あめぞう型掲示板 スクリプト一覧 (2006/07/23 初版)"><a href="#%5B+Perl+%5D+%E3%81%82%E3%82%81%E3%81%9E%E3%81%86%E5%9E%8B%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%80%80%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E4%B8%80%E8%A6%A7+%282006%2F07%2F23+%E5%88%9D%E7%89%88%29">[ Perl ] あめぞう型掲示板 スクリプト一覧 (2006/07/23 初版)</a></h2> <p>2007/03/04 更新<br /> あめぞう型掲示板 スクリプト一覧<br /> <a target="_blank" rel="nofollow noopener" href="http://www.amebbs.com/doc/bbs.html">http://www.amebbs.com/doc/bbs.html</a></p> <p><strong>group: amezou</strong></p> <h2 id="[ Perl ] スレッドフロート式、マルチ 某ch風板 (2007/04/28)"><a href="#%5B+Perl+%5D+%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%95%E3%83%AD%E3%83%BC%E3%83%88%E5%BC%8F%E3%80%81%E3%83%9E%E3%83%AB%E3%83%81+++%E6%9F%90ch%E9%A2%A8%E6%9D%BF+%282007%2F04%2F28%29">[ Perl ] スレッドフロート式、マルチ 某ch風板 (2007/04/28)</a></h2> <p>フリースレッドボード<br /> (FreeThreadBoard)<br /> スレッドフロート式、マルチ 某ch風板<br /> <a target="_blank" rel="nofollow noopener" href="http://usa.rgr.jp/cgilab.html">http://usa.rgr.jp/cgilab.html</a></p> <p><strong>group: 2 chan</strong></p> <h2 id="[ PHP 5 ] スレッドフロート型掲示板スクリプト(PHP・UTF-8・スマホ対応) (2021年10月18日 12時00分 正午の月齢:12.0 月名:十三夜 潮汐:中潮 月齢:12.0[十三夜] 潮汐:中潮)"><a href="#%5B+PHP+5+%5D+%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E3%83%95%E3%83%AD%E3%83%BC%E3%83%88%E5%9E%8B%E6%8E%B2%E7%A4%BA%E6%9D%BF%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%28PHP%E3%83%BBUTF-8%E3%83%BB%E3%82%B9%E3%83%9E%E3%83%9B%E5%AF%BE%E5%BF%9C%29+%282021%E5%B9%B410%E6%9C%8818%E6%97%A5+12%E6%99%8200%E5%88%86+%E6%AD%A3%E5%8D%88%E3%81%AE%E6%9C%88%E9%BD%A2%3A12.0++%E6%9C%88%E5%90%8D%3A%E5%8D%81%E4%B8%89%E5%A4%9C++%E6%BD%AE%E6%B1%90%3A%E4%B8%AD%E6%BD%AE+%E6%9C%88%E9%BD%A2%3A12.0%5B%E5%8D%81%E4%B8%89%E5%A4%9C%5D+%E6%BD%AE%E6%B1%90%3A%E4%B8%AD%E6%BD%AE%29">[ PHP 5 ] スレッドフロート型掲示板スクリプト(PHP・UTF-8・スマホ対応) (2021年10月18日 12時00分 正午の月齢:12.0 月名:十三夜 潮汐:中潮 月齢:12.0[十三夜] 潮汐:中潮)</a></h2> <p>ThreadFloatBbs・煤式<br /> <a target="_blank" rel="nofollow noopener" href="https://susu.cc/2021/10/threadfloat.html">https://susu.cc/2021/10/threadfloat.html</a></p> <p><strong>group: 2 chan</strong></p> <h2 id="[ Perl ] MiniBBS"><a href="#%5B+Perl+%5D+MiniBBS">[ Perl ] MiniBBS</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www.rescue.ne.jp/cgi/minibbs1/">https://www.rescue.ne.jp/cgi/minibbs1/</a></p> <h2 id="[ PHP 4 ? ] futaba chan script (02/12/23-)"><a href="#%5B+PHP+4+%3F+%5D+futaba+chan+script+%2802%2F12%2F23-%29">[ PHP 4 ? ] futaba chan script (02/12/23-)</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://news.ycombinator.com/item?id=7639435">https://news.ycombinator.com/item?id=7639435</a><br /> <strong>group: futaba chan</strong><br /> <strong>group: 4 chan</strong></p> <hr /> <h2 id="[ Perl ] , [ PHP ] , [ node.js ] , [ go ] , [ rust ] , [ Scheme ] , [ ur ] , [ elixir ] , [ haskell ] 108 catalouge"><a href="#%5B+Perl+%5D+%2C+%5B+PHP+%5D+%2C+%5B+node.js+%5D+%2C+%5B+go+%5D+%2C+%5B+rust+%5D+%2C+%5B+Scheme+%5D+%2C+%5B+ur+%5D+%2C+%5B+elixir+%5D+%2C+%5B+haskell+%5D+108+catalouge">[ Perl ] , [ PHP ] , [ node.js ] , [ go ] , [ rust ] , [ Scheme ] , [ ur ] , [ elixir ] , [ haskell ] 108 catalouge</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://overscript.net/">https://overscript.net/</a></p> <blockquote> <p>Overscript<br /> a little list of bbs scripts<br /> This is overscript, a comprehensive overview of all known anonymous futaba-style bulletin board scripts.<br /> if you have any scripts you know about that aren't listed here, please email [email protected] with details about it</p> </blockquote> <p><strong>group: futaba chan</strong><br /> <strong>group: 4 chan</strong></p> <h2 id="[ PHP ] Shiichan Anonymous BBS (2004)"><a href="#%5B+PHP+%5D+Shiichan+Anonymous+BBS+%282004%29">[ PHP ] Shiichan Anonymous BBS (2004)</a></h2> <p>Shiichan 3960 - The PHP script that was used at world4ch<br /> <a target="_blank" rel="nofollow noopener" href="https://wakaba-c3-cx.translate.goog/shii/shiichan?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=en&_x_tr_pto=wapp">https://wakaba.c3.cx/shii/shiichan</a></p> <p><strong>group: futaba chan</strong><br /> <strong>group: 4 chan</strong></p> <h2 id="[ PHP ] futallaby"><a href="#%5B+PHP+%5D+futallaby">[ PHP ] futallaby</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://www-1chan-net.translate.goog/futallaby/index_old.html?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=en&_x_tr_pto=wapp">http://www.1chan.net/futallaby/</a></p> <p><strong>group: futaba chan</strong><br /> <strong>group: 4 chan</strong></p> <h2 id="[ PHP ] Wakaba and [ Perl ] Kareha"><a href="#%5B+PHP+%5D+Wakaba+and+%5B+Perl+%5D+Kareha">[ PHP ] Wakaba and [ Perl ] Kareha</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://wakaba.c3.cx/s/web/wakaba_kareha">https://wakaba.c3.cx/s/web/wakaba_kareha</a></p> <p>WakabaScript - An image board script.<br /> KarehaScript - A database-less message and image board script.</p> <p>Rf. Shiichan Anonymous BBS (<a target="_blank" rel="nofollow noopener" href="https://wakaba-c3-cx.translate.goog/shii/shiichan?_x_tr_sl=en&_x_tr_tl=ja&_x_tr_hl=en&_x_tr_pto=wapp">https://wakaba.c3.cx/shii/shiichan</a>)<br /> Rf. https://shii.bibanon.org/shii.org/knows/Anonymous.html</p> <p><strong>group: futaba chan</strong><br /> <strong>group: 4 chan</strong></p> <h2 id="[ Perl ] 2ch bbs.cgi (2011/1 )"><a href="#%5B+Perl+%5D+2ch+bbs.cgi+%282011%2F1+%29">[ Perl ] 2ch bbs.cgi (2011/1 )</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/j416dy/2ch/blob/master/bbs-main.cgi">https://github.com/j416dy/2ch/blob/master/bbs-main.cgi</a></p> <p><strong>group: 4 chan</strong></p> <h2 id="[ Python2 ] weabot"><a href="#%5B+Python2+%5D+weabot">[ Python2 ] weabot</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/z411/weabot">https://github.com/z411/weabot</a><br /> Rf. https://bienvenidoainternet.org/bai/<br /> <strong>group: PyIB</strong><br /> <strong>group: Bienvenido a Internet BBS/IB</strong></p> <h2 id="[ PHP ] Tinyboard"><a href="#%5B+PHP+%5D+Tinyboard">[ PHP ] Tinyboard</a></h2> <p>Tinyboard is a free light-weight, fast, highly configurable and user-friendly imageboard software package. It is written in PHP and has few dependencies.</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/savetheinternet/Tinyboard">https://github.com/savetheinternet/Tinyboard</a></p> <p><strong>group: Tinyboard</strong></p> <h2 id="[ PHP 5.4- ] vichan"><a href="#%5B+PHP+5.4-+%5D+vichan">[ PHP 5.4- ] vichan</a></h2> <p>vichan is a free light-weight, fast, highly configurable and user-friendly imageboard software package. It is written in PHP and has few dependencies.</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/vichan-devel/vichan">https://github.com/vichan-devel/vichan</a></p> <p><strong>group: <a target="_blank" rel="nofollow noopener" href="https://github.com/savetheinternet/Tinyboard">Tinyboard</a></strong><br /> <strong>group: 8 chan</strong></p> <p>つづく。</p> tomato tag:crieit.net,2005:PublicArticle/18294 2022-09-18T16:37:31+09:00 2022-09-25T11:27:24+09:00 https://crieit.net/posts/PHP-6326cabb4a630 なにも知らない PHP スクレイピング。マンガ カウンティング <h2 id="preface"><a href="#preface">preface</a></h2> <p>うっかり <a target="_blank" rel="nofollow noopener" href="https://github.com/kuz-sysadmin/ksphp-en/">1995 -2002 くらいまで</a>の<a href="https://crieit.net/posts/BBS-programming">掲示板</a> / <a target="_blank" rel="nofollow noopener" href="http://f16.aaacafe.ne.jp/~stwalker/">文化</a>に興味をもってしまった(スレッドフロート型掲示板という言葉が英語なのか日本語なのかという疑問がきっかけだった。)ことから Perl という古語を自習していて、並列して <a target="_blank" rel="nofollow noopener" href="https://gihyo.jp/news/report/2015/12/1401">PHP</a> についてのことも知りたいとおもい( 2001 以降、perl + c 言語製 2 ちゃんねる から、PHP 5 製ふたばちゃんねるの<a target="_blank" rel="nofollow noopener" href="https://github.com/futoase/futaba-ng">ソースコード</a>からのフォークで <a target="_blank" rel="nofollow noopener" href="https://news.ycombinator.com/item?id=7639238">4 chan</a> 、<a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/2019_El_Paso_shooting">8 chan</a> と推移するため)、まずベーシックなスクレイピングするプログラムを書いてみる。</p> <p>Rf. <a target="_blank" rel="nofollow noopener" href="https://scrapbox.io/004040/はじめてのあやしいわーるど:システム">はじめてのあやしいわーるど:システム</a><br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/VVuPIOWj--s">【ゆっくりネット史解説】4スレ目~あやしいわーるど~</a><br /> くずはすくりぷと Rev.0.1 Preview 9 (2000.9.3)<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/7m3tu">https://rentry.co/7m3tu</a><br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/ukw3f/">https://rentry.co/ukw3f/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/ssno4">https://rentry.co/ssno4</a></p> <p>あめぞう歴史<br /> <a target="_blank" rel="nofollow noopener" href="http://history.amebbs.com/">http://history.amebbs.com/</a></p> <hr /> <p>PHP は、バージョンが違うとまるで別物のように思えるので、バージョンは 8 系とする。apache などの web サーバーは必要ない。</p> <p>要約すると、<br /> PHP scraping<br /> で検索すると表示されたページ。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.utakata.work/entry/php/webscraping-with-php-html-parser">https://www.utakata.work/entry/php/webscraping-with-php-html-parser</a><br /> ここに掲載しているコードをコピペで実行してみたら、理解できました。PHP 全く知らなかったですが。</p> <p>以下は、実は <a href="https://crieit.net/posts/Bank-6249a7b59dfd9">漫画Bank / La « mangabank.org » a disparu.</a> という記事(ない)からの続きになっています。</p> <h2 id="PHP 8 インストール for debian"><a href="#PHP+8+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB+for+debian">PHP 8 インストール for debian</a></h2> <pre><code>sudo apt install -y gnupg2 ca-certificates apt-transport-https software-properties-common lsb-release </code></pre> <pre><code>echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/sury-php.list </code></pre> <pre><code>wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add - </code></pre> <pre><code>sudo apt update </code></pre> <pre><code>sudo apt-get --no-install-recommends install php8 </code></pre> <p>とすることで、<a target="_blank" rel="nofollow noopener" href="https://ja.getdocs.org/how-to-install-php-8-1-and-set-up-a-local-development-environment-on-ubuntu-22-4?amp=1">apache 抜きで PHP8 がインストールされる</a>かもしれない。<br /> されないかもしれない。そこは追求する必要があって、まだこれで完璧というとこまで到達できない。バージョン管理の phpenv があるらしいのでいずれはそれで。</p> <p>パッケージマネージャーは、<a target="_blank" rel="nofollow noopener" href="https://ja.m.wikipedia.org/wiki/Composer">composer</a> というものがあるので、バージョン 2 系のものを使う。なぜなら、php-html-parser というモジュールを使いたいからで、composer2 では無事にインストールできたから。</p> <p>スクレイピングについては、色々と常識と非常識があって、それらは考慮したいが、知らない、知る前にやってしまう、やってしまった方がいいこともある。というスタンスで、できるだけ非常識にならないように、<a href="https://crieit.net/posts/4daedd75f0cec1b328d4e661d9337bd3">非常識のキョクホクのサイト</a>をスクレイピングしてみる。</p> <p>さて。</p> <p>composer 2 自体のインストールは、省略。これもまた、どうするのがベストかわからない。簡単な方法でできればよし。できなければ深掘りしていくことになるが、インストールはできないということはないはず。</p> <p>php-html-parser のインストール。https://github.com/paquettg/php-html-parser</p> <pre><code class="terminal">~$ composer require paquettg/php-html-parser </code></pre> <p>php-html-parser とは jQuery のような感じで、html を扱うものだと思う。<br /> そういうものは、いろんな言語であって、go だと <a target="_blank" rel="nofollow noopener" href="https://pkg.go.dev/github.com/PuerkitoBio/goquery">goquery</a>、Lua だと <a target="_blank" rel="nofollow noopener" href="https://craigbarnes.gitlab.io/lua-gumbo/#examples">lua-gumbo</a>、Nim だと <a target="_blank" rel="nofollow noopener" href="https://github.com/GULPF/nimquery">nimquery</a>、julia だと <a target="_blank" rel="nofollow noopener" href="https://github.com/JuliaWeb/Gumbo.jl">Gumbo</a> とかで、それぞれ自分自身を解説するとき jQuery みたいなやつだからーとだけかいてあることが多いために使い方を調べるのには苦労する。<br /> だけれども、一度どこかでその無限に時間を浪費するかのような道通ると、どこかで別のに出会っても、多少違うがほとんど同じという経験をする。おそらくそのために解説が省かれるのだと思う。だいたいおなじなので、どれかで分かりやすい解説が見つかれば一通りやってみるのがいい。</p> <p>つまりは、html のタグとかタグ内の要素だとかで検索してずるずるっと引っ張ってきて、タグで挟まれたテキストを抽出したり、タグを付け足したりということをするためのものだ。<br /> 全然わからなければ、正規表現のようなもので代用することもある程度可能なので、正規表現に無限に時間をかける道も通っておいたらいいのかもしれない。</p> <p>たとえば、ながいながい html ドキュメントに、</p> <pre><code class="html"><a href="http://example.com/">リンク</a> </code></pre> <p>みたいな箇所がたくさんあって、これらをずるっと全部抜き出して、配列に入れて吟味したい場合に<code>find("a")</code>みたいにして a タグのものすべてを簡単にひっぱってこれるといいね、ということを満たすもので、タグの中の attribute <code>href</code> で判別して、それが含まれるもの全部をひっぱってくるとかの用途に使う。</p> <pre><code class="php">$url_1 = "https://search.brave.com/search?q=kadokawa+川上"; $dom = new Dom(); $dom->loadFromUrl($url_1, $options); $element_a = $dom->find('a'); // a tag のリンクのエレメント全部を配列 $element_a に集める foreach($element_a as $index=>$link){ echo $index . ' ' . $link->{'href'} . "\n\n"; } </code></pre> <hr /> <p>だいたい用途が同じものの場合はドキュメントが省略されるので、だいたい同じもののドキュメントがあれば参考にする。<br /> <a target="_blank" rel="nofollow noopener" href="https://simplehtmldom.sourceforge.io/docs/1.9/manual/creating-dom-objects/">Simple HTML DOM documentation</a></p> <h2 id="scraping.php"><a href="#scraping.php">scraping.php</a></h2> <pre><code class="php"><?php require_once __DIR__ . '/vendor/autoload.php'; use PHPHtmlParser\Dom; use PHPHtmlParser\Options; $options = new Options(); $options->setEnforceEncoding('utf8'); $url1 = 'https://13dl.me/list/popular/'; function scrape($counter,$options,&$element_a){ $titles = array(); $next = ""; foreach($element_a as $line){ if(preg_match('/title/',"$line")) { $div = $line->find('div'); if(preg_match('/div/',"$div")) { $titles[] = $div->text; }else{ if(preg_match('/Next/',"$line")){ $attr = 'href'; $next = $line->$attr; } } }else{ ; } } unset($element_a); foreach($titles as $xxxx){ $counter ++; echo $counter . " title :" . $xxxx . "\n"; } unset($titles); return array("$next",$counter); } $counter = 0; while($url1 != ''){ if(preg_match('/http/',"$url1")) { try { $dom = new Dom(); $dom->loadFromUrl($url1, $options); $element_a = $dom->find('a'); list($url1,$counter) = scrape($counter,$options,$element_a); unset($element_a); unset($dom); } catch (Exception $e) { $e->getMessage(); } } else { die('stop:' . $url1); } } die('End.'); ?> </code></pre> tomato tag:crieit.net,2005:PublicArticle/18292 2022-09-06T02:40:41+09:00 2022-09-20T14:35:24+09:00 https://crieit.net/posts/BBS-programming たよりない BBS programming <p><a target="_blank" rel="nofollow noopener" href="https://crieit-net.translate.goog/posts/BBS-programming?_x_tr_sl=ja&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp">transrate to</a></p> <h2 id="掲示板 : Bulletin board system をプログラムする。"><a href="#%E6%8E%B2%E7%A4%BA%E6%9D%BF+%3A+Bulletin+board+system+%E3%82%92%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%99%E3%82%8B%E3%80%82">掲示板 : Bulletin board system をプログラムする。</a></h2> <p><strong>Bulletin board system</strong><br /> <a target="_blank" rel="nofollow noopener" href="https://en.wikipedia.org/wiki/Bulletin_board_system">https://en.wikipedia.org/wiki/Bulletin_board_system</a></p> <p><strong>youtube 資料</strong><br /> 古いの<br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/Dddbe9OuJLU">https://youtu.be/Dddbe9OuJLU</a></p> <p>わりと最近 ( 温故知新 )<br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/wqqhSz2fLVw">https://youtu.be/wqqhSz2fLVw</a></p> <p>いろんな言語で書いてみたいが、web framework を使って プログラムする方法を知るために、まず、Ruby と web framework を sinatra にして、どうやって掲示板をプログラミングするかを並べていく。</p> <p><strong>sinatra</strong><br /> <a target="_blank" rel="nofollow noopener" href="https://sinatrarb.com/">https://sinatrarb.com/</a></p> <p>Ruby と Sinatra での Hello World までは、</p> <p><a href="https://crieit.net/posts/Ruby-Sinatra-web">できるだけわかりやすい Ruby + Sinatra で web アプリ</a></p> <p>Hello World までのことが理解できたら、手順はわかるので、BBS って何だっけ?ということを浅く、ふかーく掘ってみると拡張するアイデアがでる基礎がならされてくる。<br /> まず、なんだっけ?というとこから、これを見てコピペで実行した。</p> <blockquote> <p><strong>100行未満かつGo標準ライブラリだけで作る掲示板</strong><br /> 著者:クジラ飛行机<br /> <a target="_blank" rel="nofollow noopener" href="https://news.mynavi.jp/techplus/article/gogogo-9/">https://news.mynavi.jp/techplus/article/gogogo-9/</a></p> </blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://www.tohoho-web.com/ex/golang.html">Go 言語でのコンパイルまでの手順</a>を知っていれば、全くくじけず掲示板プログラムのミニマムな仕様が感じられるいい記事だと思った。</p> <p>その後、二週間か三週間くらい、<a target="_blank" rel="nofollow noopener" href="https://www.reddit.com/r/programming/comments/23umjd/4chan_source_code_leak/">4chan</a> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/8chan">8chan</a> の事件、なぜ <a target="_blank" rel="nofollow noopener" href="https://www.google.com/search?q=京都市バス事件 あめぞう&newwindow=1&sxsrf=ALiCzsYiYV3nSBQM_kQ3X7lkeKCmTWrcYA:1662551080471&ei=KIQYY_m7HNDZhwOh8rD4Dg&ved=0ahUKEwj578m0zYL6AhXQ7GEKHSE5DO8Q4dUDCA4&uact=5&oq=京都市バス事件 あめぞう&gs_lcp=Cgdnd3Mtd2l6EAMyBQgAEIAEOgoIABBHENYEELADOgcIABCABBAESgQIQRgASgQIRhgAUMoHWKcTYJwcaAFwAXgAgAFfiAH4BJIBATeYAQCgAQHIAQrAAQE&sclient=gws-wiz">2 チャンネルが開始</a>されたのか、<a target="_blank" rel="nofollow noopener" href="https://ja.wikipedia.org/wiki/西鉄バスジャック事件">関連事件</a>など記事や映像を掘って読み続けた。</p> <p>The case for anonymity online<br /> <a target="_blank" rel="nofollow noopener" href="https://www.ted.com/talks/christopher_moot_poole_the_case_for_anonymity_online?language=en">https://www.ted.com/talks/christopher_moot_poole_the_case_for_anonymity_online?language=en</a></p> <blockquote> <p><a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/Fredrick_Brennan">Fredrick Brennan</a> @[email protected]</p> <p>https://twitter.com/fr_brennan/status/1197461945307131905?s=20&t=od7Bucc3KHDWPnixxI1Bcg</p> <p>https://mobile.twitter.com/fr_brennan/status/1566445269771755523<br /> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/infinitechan/status/848139757758562304?s=20&t=XDUEGtuxavkH4t-m8kYI6A">https://twitter.com/infinitechan/status/848139757758562304?s=20&t=XDUEGtuxavkH4t-m8kYI6A</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/hcfrm">Leaked voting machine BIOS passwords may implicate Q-friendly county clerk | Ars Technica</a></p> <p>Who Owns 4chan?<br /> <a target="_blank" rel="nofollow noopener" href="https://www.wired.com/story/who-owns-4chan/">https://www.wired.com/story/who-owns-4chan/</a></p> </blockquote> <p>掲示板を、使えるレベルにするには、どうやってコメントを掃除するかという点が重要なことだ、きっと。<br /> 古典的な chat のルールや機能をよく確認するべき。minecraft や、<a target="_blank" rel="nofollow noopener" href="https://wiki.minetest.net/Privileges/ja">minetest の privileges</a> などが参考にがなるかもしれない。<br /> 管理者ではなく、ユーザー側でブロックしたい書き込みを非表示にする <a target="_blank" rel="nofollow noopener" href="https://help.twitter.com/ja/using-twitter/blocking-and-unblocking-accounts">twitter のようなブロック機能</a>は、オールドスクールな BBS にはなかったが今後あったほうがいい。</p> <blockquote> <p>華原朋美さん「ヤフコメさん達には傷つけられてきた」法的処置明かす 投稿者はどうやって特定する?<br /> <a target="_blank" rel="nofollow noopener" href="https://archive.ph/z1o2c">https://archive.ph/z1o2c</a><br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/s0o3rlwsjOk">https://youtu.be/s0o3rlwsjOk</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://news.yahoo.co.jp/newshack/inside/nonfiction_award_2021.html">今日この賞が発表されて、明日からYahoo!ニュースのコメント欄は荒れるでしょう。</a><br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/F-TI3UONAHY">https://youtu.be/F-TI3UONAHY</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/judo_gonoi/status/1568055692023705602?s=20&t=Fvazn5DcjEiwBx89yng2eA">「もうYahooのコメントも怖いです。」</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/narita_yusuke/status/1567714001294921728?s=20&t=cO0-6ole4g71HLPZBtParw">「来世ではヤフコメとTwitterで不眠不休で人に文句つけつづける生活を送ってみたい」</a></p> </blockquote> <p>hashtag #dropkiwifarms<br /> <a target="_blank" rel="nofollow noopener" href="https://en.m.wikipedia.org/wiki/Kiwi_Farms">https://en.m.wikipedia.org/wiki/Kiwi_Farms</a><br /> 速報: CloudflareによるKiwi Farmsのブロック https://web.gnusocial.jp/post/2022/09/20/</p> <p>reddit:Aaron Swartz<br /> <a target="_blank" rel="nofollow noopener" href="https://www.troddit.com/r/aaronswartz">https://www.troddit.com/r/aaronswartz</a></p> <p>さらに、日本の掲示板文化(主に perl で作られる BBS 1995 - 2006 )について<br /> 『あやしいわーるどの歴史』(2006/09/28 現在)<br /> <a target="_blank" rel="nofollow noopener" href="http://f16.aaacafe.ne.jp/~stwalker/">http://f16.aaacafe.ne.jp/~stwalker/</a></p> <hr /> <p>広告表示なし</p> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/m953n">https://rentry.co/m953n</a></p> <hr /> <h1 id="たよりない BBS programming"><a href="#%E3%81%9F%E3%82%88%E3%82%8A%E3%81%AA%E3%81%84+BBS+programming">たよりない BBS programming</a></h1> <p>とりあえず、<a target="_blank" rel="nofollow noopener" href="https://matz.rubyist.net/20050420.html#p02">ローカルホストで戰います</a>。</p> <p>アドレス <code>http://127.0.0.1</code> のポートナンバー 4567<br /> <code>localhost:4567</code></p> <p>詳細は、<br /> できるだけわかりやすい Ruby + Sinatra で web アプリ<br /> <a href="https://crieit.net/posts/Ruby-Sinatra-web">https://crieit.net/posts/Ruby-Sinatra-web</a><br /> をクリアするとわかります。</p> <p><a href="https://crieit.now.sh/upload_images/2862c8dd49e72077e4c96240d41a05bd631d807e6d151.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2862c8dd49e72077e4c96240d41a05bd631d807e6d151.png?mw=700" alt="image" /></a></p> <p>色は違いますが、掲示板の感じはこうなります。</p> <h2 id="Files &amp; Directories"><a href="#Files+%26amp%3B+Directories">Files & Directories</a></h2> <pre><code>BBS ├── bbs.rb ├── bbsdata.db ├── lockfile ├── views │ ├── badrequest.erb │ ├── board.erb │ ├── ca.erb │ ├── created.erb │ ├── layout.erb │ ├── login.erb │ ├── loginfail.erb │ └── logout.erb │ ├── public │ └── css │ └── style.css │ │ #[ bundle init ] ├── Gemfile │ #[ bundle install ] ├── nender #auto generated └── Gemfile.lock #auto generated </code></pre> <hr /> <h2 id="BBS directories"><a href="#BBS+directories">BBS directories</a></h2> <h3 id="BBS/Gemfile"><a href="#BBS%2FGemfile">BBS/Gemfile</a></h3> <pre><code class="bundler">#frozen_string_literal: true source "https://rubygems.org" gem "activerecord" gem "sqlite3" gem "sinatra" gem "webrick" </code></pre> <hr /> <h2 id="All in one piece"><a href="#All+in+one+piece">All in one piece</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://rentry.co/n7v9x">https://rentry.co/n7v9x</a></p> <h2 id="BBS/views Directory"><a href="#BBS%2Fviews+Directory">BBS/views Directory</a></h2> <p>どれも数行だけのコード。</p> <h3 id="BBS/views/layout.erb"><a href="#BBS%2Fviews%2Flayout.erb">BBS/views/layout.erb</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/ngg3s">https://rentry.co/ngg3s</a></p> <h3 id="BBS/views/login.erb"><a href="#BBS%2Fviews%2Flogin.erb">BBS/views/login.erb</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/gyd6v">https://rentry.co/gyd6v</a></p> <h3 id="BBS/views/logout.erb"><a href="#BBS%2Fviews%2Flogout.erb">BBS/views/logout.erb</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/t92tk">https://rentry.co/t92tk</a></p> <h3 id="BBS/views/loginfail.erb"><a href="#BBS%2Fviews%2Floginfail.erb">BBS/views/loginfail.erb</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/2fnu9">https://rentry.co/2fnu9</a></p> <h3 id="BBS/views/badrequest.erb"><a href="#BBS%2Fviews%2Fbadrequest.erb">BBS/views/badrequest.erb</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/og7h7">https://rentry.co/og7h7</a></p> <h3 id="BBS/views/ca.erb"><a href="#BBS%2Fviews%2Fca.erb">BBS/views/ca.erb</a></h3> <p>コードへのリンクコードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/nh37f">https://rentry.co/nh37f</a></p> <h3 id="BBSviews/created.erb"><a href="#BBSviews%2Fcreated.erb">BBSviews/created.erb</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/x6ofg">https://rentry.co/x6ofg</a></p> <h3 id="BBS/views/board.erb"><a href="#BBS%2Fviews%2Fboard.erb">BBS/views/board.erb</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/tab3d">https://rentry.co/tab3d</a></p> <hr /> <h2 id="BBS/public Directory"><a href="#BBS%2Fpublic+Directory">BBS/public Directory</a></h2> <h3 id="BBS/public/css/style.css"><a href="#BBS%2Fpublic%2Fcss%2Fstyle.css">BBS/public/css/style.css</a></h3> <p>コードへのリンク<br /> <a target="_blank" rel="nofollow noopener" href="https://rentry.co/wbw99">https://rentry.co/wbw99</a></p> <hr /> <h2 id="BBS Directory"><a href="#BBS+Directory">BBS Directory</a></h2> <h3 id="BBS/bbs.rb"><a href="#BBS%2Fbbs.rb">BBS/bbs.rb</a></h3> <pre><code class="ruby">require 'digest/sha2' require 'active_record' require 'sinatra' set :environment, :production set :sessions, exprre_after: 70000, secret: 'assdffgfhjjkklaslllg' ActiveRecord::Base.establish_connection(:adapter=>'sqlite3',:database=>'bbsdata.db') class BBSdata < ActiveRecord::Base self.table_name = 'bbsdata' end class Account < ActiveRecord::Base self.table_name = 'accounts' end # keepers able to delete scum comments. class Keeper < ActiveRecord::Base self.table_name = 'keepers' end class Kickaccount < ActiveRecord::Base self.table_name = 'kickaccounts' end # html sanitizer helpers do def h(text) Rack::Utils.escape_html(text) end end get '/' do redirect '/login' # create account end get '/ca' do # create account erb :ca end get '/ca2' do # create account @message = "Change username.The username is already in use." erb :ca end post '/create' do @username = h(params[:username]) @username.gsub!("\"|\\","") @username.gsub!(/;/,"") rawpassword = h(params[:passwd]) rawpassword.gsub!("\"|\\","") rawpassword.gsub!(/;/,"") begin f = Account.find(@username) if f.id == @username puts "Change username.The username is already in use." redirect '/ca2' end rescue =>e puts "OK.Username has accepted." end lock = File.open("lockfile","r+") lock.flock(File::LOCK_EX) algorithm = "100" rand = Random.new spice = Digest::SHA256.hexdigest(rand.bytes(20)) hashed = Digest::SHA256.hexdigest(rawpassword + spice) ca = Account.new # create account ca.id = @username ca.salt = spice ca.hashed = hashed ca.algorithm = algorithm ca.save lock.close erb :created end get '/login' do erb :login end get '/created' do session[:username] = @username erb :created end get '/board' do @u_name = session[:username] if @u_name == nil redirect '/badrequest' end begin kicked_account = Kickaccount.all kicked_account.each do |kv| if kv.userid == @u_name puts "kick out: #{kv.userid}" redirect '/logout' end end rescue => e puts "error" end @admin = "" puts "you are #{@u_name}." begin roomkeeper = Keeper.find(@u_name) @admin = roomkeeper.id puts "you are roomleeper." rescue => e puts "you are not roomkeeper." end all_data = BBSdata.all if all_data.count == 0 @table = "<tr><td>This BBS is Empty.</td></tr>" else @table = "" kicked = [] all_data.reverse_each do |one| if one.k == 1 kicked << one.userid kicked.uniq! end n1 = one.userid.size n2 = one.entry.size str1 = "" str2 = "" n1.times do str1 += "■" end n2.times do str2 += "■" end @table = @table + "<tr>" @table = @table + "<td style=\"witdh: 5%\">#{one.id}</td>" if one.v == 0 @table = @table + "<td>[#{one.userid}]</td>" else @table = @table + "<td>[#{str1}]</td>" end @table = @table + "<td><font size=\"-2\">#{Time.at(one.writedata)}</font></td>" if (one.userid == @u_name && one.v == 0) || (@admin != "" && one.v == 0) @table = @table + "<td><form action=\"/delete\" method=\"post\">" @table = @table + "<input type=\"hidden\" name=\"id\" value=\"#{one.id}\">" @table = @table + "<input type=\"hidden\" name=\"_method\" value=\"delete\">" @table = @table + "<input type=\"submit\" value=\"Delete\"></form></td>" else @table = @table + "<td></td>" end @table = @table + "</tr>" if one.v == 0 @table = @table + "<tr><td style=\"word-break: break-word\" colspan=\"4\">#{one.entry}</td></tr>\n" else @table = @table + "<tr><td style=\"word-break: break-word\" colspan=\"4\">#{str2}</td></tr>\n" end if @admin != "" && @admin != one.userid && !kicked.include?(one.userid) @table = @table + "<tr><td><font size=\"-2\">#{one.addr}</font></td>" @table = @table + "<td><form action=\"/kick\" method=\"post\">" @table = @table + "<input type=\"hidden\" name=\"bbsdataid\" value=\"#{one.id}\">" @table = @table + "<input type=\"hidden\" name=\"_method\" value=\"delete\">" @table = @table + "<input type=\"submit\" value=\"Kick\"></form></td></tr>\n" elsif @admin != "" && @admin != one.userid && kicked.include?(one.userid) @table = @table + "<tr><td><font size=\"-2\">#{one.addr}</font></td>" @table = @table + "<td><form action=\"/kickback\" method=\"post\">" @table = @table + "<input type=\"hidden\" name=\"bbsdataid\" value=\"#{one.id}\">" @table = @table + "<input type=\"hidden\" name=\"_method\" value=\"delete\">" @table = @table + "<input type=\"submit\" value=\"Kickback\"></form></td></tr>\n" end @table = @table + "<tr><td colspan=\"4\">_____________________________________________________________________________</td></tr>" end end erb :board end post '/new' do lock = File.open("lockfile","r+") lock.flock(File::LOCK_EX) maxid = 0 begin last = BBSdata.last if last.id > maxid maxid = last.id end rescue =>e puts maxid end new_comment = BBSdata.new new_comment.id = maxid + 1 new_comment.userid = h(session[:username]) new_comment.entry = h(params[:entry]) new_comment.writedata = Time.now.to_i new_comment.v = 0 # invisible : 1 new_comment.addr = @env['REMOTE_ADDR'] new_comment.k = 0 # kicked : 1 new_comment.save lock.close redirect '/board' # return to BBS end delete '/kick' do lock = File.open("lockfile","r+") lock.flock(File::LOCK_EX) maxid = 0 begin last = Kickaccount.last if last.id > maxid maxid = last.id end rescue => e puts "maxid: #{maxid}" end kicked = Kickaccount.new kicked.id = maxid + 1 username = "" begin f1 = BBSdata.find(h(params[:bbsdataid])) kicked.userid = f1.userid username = f1.userid kicked.addr = f1.addr kicked.save rescue => e puts "f1 Error" end begin f2 = BBSdata.where(userid: "#{username}") f2.each do |matched_one| puts matched_one.id matched_one.k = 1 matched_one.save end rescue => e puts "f2 Error" end lock.close redirect '/board' end delete '/kickback' do lock = File.open("lockfile","r+") lock.flock(File::LOCK_EX) puts (h(params[:bbsdataid])) username = "" begin f1 = BBSdata.find(h(params[:bbsdataid])) username = f1.userid begin f2 = Kickaccount.all f2.each do |matched_one| if matched_one.userid == f1.userid matched_one.destroy end end rescue => e puts "f2 Error" end rescue => e puts "f1 Error" end begin f3 = BBSdata.where(userid: "#{username}") f3.each do |m| puts m.id m.k = 0 m.save end rescue => e puts "f3 Error" end lock.close redirect '/board' end delete '/delete' do lock = File.open("lockfile","r+") lock.flock(File::LOCK_EX) begin s = BBSdata.find(h(params[:id])) # s.destroy s.v = 1 # invisible s.save rescue => e puts "Delete Error" end lock.close redirect '/board' end get '/logout' do session.clear erb :logout end get '/loginfail' do session.clear erb :loginfail end ################################# get '/*' do redirect '/' end ################################# #-------------------------------- post '/auth' do user = h(params[:uname]) user.gsub!("\"","") user.gsub!(/;/,"") pass = h(params[:pass]) pass.gsub!("\"","") pass.gsub!(/;/,"") redirect_flag = checkFlag(user, pass) if redirect_flag == "true" session[:username] = user redirect '/board' end redirect '/loginfail' end def checkFlag(check_username,check_password) redirect_flag = "fail" # go to "/loginfail" begin cf = Account.find(check_username) db_username = cf.id db_spice = cf.salt db_hashed = cf.hashed check_hashed = Digest::SHA256.hexdigest(check_password + db_spice) if check_hashed == db_hashed redirect_flag = "true" puts "go to \"/board\"" end rescue => e redirect_flag = "error" puts "go to \"/loginfail\"" end return(redirect_flag) end </code></pre> <h3 id="BBS/bbsdata.db"><a href="#BBS%2Fbbsdata.db">BBS/bbsdata.db</a></h3> <h4 id="initdb scripts"><a href="#initdb+scripts">initdb scripts</a></h4> <pre><code>create table bbsdata ( id integer primary key, userid varchar(20), entry varchar(150), writedata integer, v integer, addr varchar(20), k integer ); create table accounts ( id char(20) primary key, salt varchar(40), hashed varchar(70), algorithm char(5) ); create table keepers ( id char(20) primary key, salt varchar(40), hashed varchar(70), algorithm char(5) ); create table kickaccounts ( id integer primary key, userid char(20), addr varchar(20) ); </code></pre> <p>データベースのテーブル雛型をつくる。</p> <pre><code>~/BBS$ sqliter3 bbsdata.db < initdb </code></pre> tomato