tag:crieit.net,2005:https://crieit.net/tags/Perl/feed 「Perl」の記事 - Crieit Crieitでタグ「Perl」に投稿された最近の記事 2022-10-13T13:41:39+09:00 https://crieit.net/tags/Perl/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/18267 2022-07-30T15:43:22+09:00 2022-07-30T15:57:47+09:00 https://crieit.net/posts/PC-Modbus-2 サーバやPC上のプログラムでModbus機器からデータを取得 (2) <p>サーバやPC上のプログラムでModbus機器からデータを取得、その第二回です。<br /> 第一回では、Android上のModbusシミュレータからデータを取得するための、Perlスクリプトのサンプルを紹介しました。Perlでは問題があるという方は、他の言語で記述しても原理は変わらないはずなので、他の言語で実装してみてください。</p> <p><a href="https://crieit.net/posts/PC-Modbus-1">サーバやPC上のプログラムでModbus機器からデータを取得 (1)</a></p> <p>今回は、取得したデータをデータベースに保存します。</p> <h2 id="データベース"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9">データベース</a></h2> <p>以前の記事で使用した、MySQLとテーブル"from_plc"<br /> を使います。</p> <p><a href="https://crieit.net/posts/PLC-JSON-4">PLCからゲートウェイでデータを取得しデータベースにJSONで保存 (4)</a></p> <pre><code>C:\Users\hoge\Downloads>mysql -u hoge -p Enter password: ******* Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 60 Server version: 8.0.29 MySQL Community Server - GPL Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use hoge Database changed mysql> desc from_plc; +-------------+-----------+------+-----+-------------------+-------------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-----------+------+-----+-------------------+-------------------+ | body | json | YES | | NULL | | | time_insert | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED | +-------------+-----------+------+-----+-------------------+-------------------+ 2 rows in set (0.02 sec) mysql> </code></pre> <h2 id="Perlスクリプト"><a href="#Perl%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88">Perlスクリプト</a></h2> <p>前回は、Perlスクリプトを僕のセルフォンTermux上で動作させましたが、今回はPCのWindows上で開発し動作させます。何故?</p> <blockquote> <p>僕のセルフォンのTurmuxのcpanになんらかの問題があるらしく、DBIのビルドができないんです。いろいろトライしたけど僕には解決は無理と判断し、Turmax上のPerlスクリプトを放棄しました。<br /> DBIは必須ではないですが、データベースをアクセスするPerlなら、DBIを使うのが一般的ですよね。<br /> DBIのない環境で、これ以上Perlを書く気にはなれませんよね。まあ、僕のせいなんですけどね。</p> </blockquote> <p>「サーバやPC上のプログラムでModbus機器からデータを取得 (1)」で作成したスクリプトに手を加えました。これで、Modbus機器からModbus/TCPにより取得したデータをデータベースに保存します。</p> <pre><code class="perl">#!/usr/bin/perl use IO::Socket; use DBI; use Time::HiRes "gettimeofday"; use utf8; use Encode; use JSON; { my $Server = 'localhost'; my $Port = 502; my $TransactionID = 0x0200; my $ProtocolID = 0x0000; my $Length = 0x0006; my $UnitID = 0x01; my $FunctionCode = 0x03; my $StartAddress = 0x0000; my $CountRegister = 0x0001; my $req = pack("n3C2n2", $TransactionID, $ProtocolID, $Length, $UnitID, $FunctionCode, $StartAddress, $CountRegister); my $old = -1; while (1) { my $socket = new IO::Socket::INET( PeerAddr=>$Server, PeerPort=>$Port, Proto=>'tcp'); die "IO::Socket : $!" unless $socket; my $size = $socket->send($req); shutdown($socket, 1); my $response = ""; $socket->recv($response, 1024); my @data = unpack("n3C3n", $response); my $Register = $data[6]; if ($old != $Register) { print "sent data:\n"; BinaryDump($req); print "received response:\n"; BinaryDump($response); my $now = getCurrentTimeStr(); my $output_data = { 'ts' => $now, 'value' => $Register }; my $json_text = decode('utf-8', encode_json( $output_data )); print $json_text . "\n"; my @values = ($json_text); $user = 'hoge'; $passwd = 'hoge001'; $db = DBI->connect('DBI:mysql:hoge:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO from_plc (body) values (?)"); $sth->execute(@values); $sth->finish; $db->disconnect; } $old = $Register; $socket->close(); sleep 1; } } # 利用させていただきました # https://netlog.jpn.org/r271-635/2018/11/perl-bynary-dumper.html sub BinaryDump { my ($buf) = @_; my $len; my $i; $len = length($buf); printf ("length = %d\n", $len); for ($i = 0; $i < $len; $i++) { printf("%02X ", ord(substr($buf, $i, 1))); # 16文字目で画面上の改行 if (($i % 16) == 15) { print "\n"; } } if (($i % 16) != 15) { print "\n"; } } # 利用させていただきました # https://akrad.hatenablog.com/entry/2018/10/20/234528 sub getCurrentTimeStr { my ($epochSec, $microSec) = gettimeofday(); my ($sec, $min, $hour, $day, $mon, $year) = localtime($epochSec); $year += 1900; $mon++; return "$year" . '-' . sprintf("%02d", $mon) . '-' . sprintf("%02d", $day) . 'T' . sprintf("%02d", $hour) . ':' . sprintf("%02d", $min) . ':' . sprintf("%02d", $sec) . '.' . "$microSec"; } </code></pre> <p>Perlの自由さと気楽さが良いですね。</p> <h2 id="テスト"><a href="#%E3%83%86%E3%82%B9%E3%83%88">テスト</a></h2> <p>Windows上ということで、再び MOD-RSsim に登場いただきます。MOD-RSsimを起動しておきます。<br /> <a href="https://crieit.now.sh/upload_images/ce54d89db6542b8d42e049dac808c83862e4cf06c02a0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ce54d89db6542b8d42e049dac808c83862e4cf06c02a0.png?mw=700" alt="image" /></a><br /> Perlスクリプトを実行します。</p> <pre><code>C:\Users\hoge\Downloads>perl sample.pl sent data: length = 12 02 00 00 00 00 06 01 03 00 00 00 01 received response: length = 11 02 00 00 00 00 05 01 03 02 00 00 {"ts":"2022-07-30T15:05:59.916895","value":0} </code></pre> <p>Holding Register 40001 の0を取得しデータベースに保存されます。</p> <p>MOD-RSsim で 40001 に任意の数値を入力します。<br /> <a href="https://crieit.now.sh/upload_images/365c981a39ba1de3af4b05aa11b1bcf162e4cfae8fe0a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/365c981a39ba1de3af4b05aa11b1bcf162e4cfae8fe0a.png?mw=700" alt="image" /></a></p> <p>40001 のデータが変わる都度、データベースに値が保存されます。</p> <pre><code>C:\Users\hoge\Downloads>perl sample.pl sent data: length = 12 02 00 00 00 00 06 01 03 00 00 00 01 received response: length = 11 02 00 00 00 00 05 01 03 02 00 00 {"ts":"2022-07-30T15:05:59.916895","value":0} sent data: length = 12 02 00 00 00 00 06 01 03 00 00 00 01 received response: length = 11 02 00 00 00 00 05 01 03 02 00 01 {"ts":"2022-07-30T15:06:04.10446","value":1} sent data: length = 12 02 00 00 00 00 06 01 03 00 00 00 01 received response: length = 11 02 00 00 00 00 05 01 03 02 00 02 {"ts":"2022-07-30T15:06:07.41537","value":2} sent data: length = 12 02 00 00 00 00 06 01 03 00 00 00 01 received response: length = 11 02 00 00 00 00 05 01 03 02 00 03 {"value":3,"ts":"2022-07-30T15:06:10.72655"} sent data: length = 12 02 00 00 00 00 06 01 03 00 00 00 01 received response: length = 11 02 00 00 00 00 05 01 03 02 00 04 {"value":4,"ts":"2022-07-30T15:06:12.150828"} sent data: length = 12 02 00 00 00 00 06 01 03 00 00 00 01 received response: length = 11 02 00 00 00 00 05 01 03 02 00 05 {"ts":"2022-07-30T15:06:14.213053","value":5} Terminating on signal SIGINT(2) C:\Users\hoge\Downloads> </code></pre> <p>データベースのテーブル"from_plc"を確認してみます。</p> <pre><code>C:\Users\hoge\Downloads>mysql -u hoge -p Enter password: ******* Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 75 Server version: 8.0.29 MySQL Community Server - GPL Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use hoge Database changed mysql> select * from from_plc; +----------------------------------------------------+---------------------+ | body | time_insert | +----------------------------------------------------+---------------------+ | {"ts": "2022-07-30T15:05:59.916895", "value": 0} | 2022-07-30 15:05:59 | | {"ts": "2022-07-30T15:06:04.10446", "value": 1} | 2022-07-30 15:06:04 | | {"ts": "2022-07-30T15:06:07.41537", "value": 2} | 2022-07-30 15:06:07 | | {"ts": "2022-07-30T15:06:10.72655", "value": 3} | 2022-07-30 15:06:10 | | {"ts": "2022-07-30T15:06:12.150828", "value": 4} | 2022-07-30 15:06:12 | | {"ts": "2022-07-30T15:06:14.213053", "value": 5} | 2022-07-30 15:06:14 | +----------------------------------------------------+---------------------+ 6 rows in set (0.00 sec) mysql> </code></pre> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>このように、Modbus機器からのデータ取得は、専用の機器や商用のソフトウェアがなくても可能です。今回はModbus/TCPでしたが、RTUでも原理は同じです。<br /> データ取得だけではなく、Modbus機器にデータを書き込むことも難しくはありません。Modbusの仕様を理解すれば、データの取得も書き込みも簡単です。<br /> Modbusに限らず、各メーカのPLCの仕様もほとんどがオープンになっているので、それぞれの仕様を理解しさえすれば、Modbusと同じように自分で書いたプログラムでの読み書きが可能です。<br /> 様々な種類のPLCやリモートIOなどをアクセスする場合には、ゲートウェイなどを利用したほうが良いかもしれません。一方で、限られた種類のPLCやリモートIOをアクセスする場合は、自分で書いたプログラムを使用するという選択もあると思います。</p> <p>「作らない」のではなく「作れない」んです。なぜ「作れない」のか?「作らない」からです。</p> <p><a href="https://crieit.net/posts/PC-Modbus-1">サーバやPC上のプログラムでModbus機器からデータを取得 (1)</a></p> COOL MAGIC PRODUCTS tag:crieit.net,2005:PublicArticle/18262 2022-07-26T17:14:42+09:00 2022-07-30T18:42:44+09:00 https://crieit.net/posts/PC-Modbus-1 サーバやPC上のプログラムでModbus機器からデータを取得 (1) <p>サーバやPC上のプログラムでModbus機器からデータを取得、なんて場面があります。例えば、接点やセンサーがつながったリモートIOからデータを取得したい場合などです。</p> <p>この記事では、Modbus/TCPでリモートIOなどからデータを取得するサンプル・プログラムを紹介します。</p> <p>この記事で紹介するサンプルはModbus/TCPを前提としていますが、Modbus/RTUでも原理は同じです<br /> 。Socketがシリアル・インタフェースに変わり、やりとりするデータのフォーマットがTCPからRTUに変わるだけです。<br /> ※RTUの場合、送受するデータにCRCを組み込む必要があり、少々やっかいですけどね。</p> <blockquote> <p>リモートIOのメーカーのサイトでは、PLCがリモートIOからデータを取得するように書かれていたりします。リモートIOからのデータを使って機械を制御する場合はそんな構成なのかもしれませんが、そのデータをサーバやPCで処理したい場合には、リモートIOのデータをサーバやPCが直接取得するのが合理的です。リモートIOとPLCは必ずしもセットではないのです。<br /> 「そんなことは、ここであらためて書かなくてもあたりまえだろ」と思われる方も多いでしょうが、固定観念と先入観が、迷わず(本来は不要であるはずの)PLCを登場させてしまいます。</p> </blockquote> <h2 id="Modbus/TCP"><a href="#Modbus%2FTCP">Modbus/TCP</a></h2> <p>Modbusについては、エム・システム技研さまのこのドキュメントがおすすめです。</p> <p><a target="_blank" rel="nofollow noopener" href="http://www.m-system.co.jp/mssjapanese/kaisetsu/nmmodbus.pdf">Modbus プロトコル概説書</a></p> <h2 id="サンプル・プログラム"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%BB%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">サンプル・プログラム</a></h2> <p>今回はPerlを使いました。Perlである必要性はありませんが、Perlではだめだという理由もありません。なぜPerlを選択したか?僕のセルフォンでPerlが使えたからです。</p> <p>サンプルでは、ファンクション0x03: Read Holding Register を使っています。</p> <p>データをコンソールに16進表記で表示するために、公開されていたコレを遠慮なく拝借いたしました。<br /> <a target="_blank" rel="nofollow noopener" href="https://netlog.jpn.org/r271-635/2018/11/perl-bynary-dumper.html">(Perl) バイナリ変数の16進ダンプ表示</a></p> <pre><code class="perl">#!/usr/bin/perl use IO::Socket; { my $Server = 'localhost'; my $Port = 5502; my $socket = new IO::Socket::INET( PeerAddr=>$Server, PeerPort=>$Port, Proto=>'tcp'); die "IO::Socket : $!" unless $socket; print "connected to the server\n"; my $TransactionID = 0x0200; my $ProtocolID = 0x0000; my $Length = 0x0006; my $UnitID = 0x01; my $FunctionCode = 0x03; my $StartAddress = 0x0000; my $CountRegister = 0x0001; my $req = pack("n3C2n2", $TransactionID, $ProtocolID, $Length, $UnitID, $FunctionCode, $StartAddress, $CountRegister); my $size = $socket->send($req); print "sent data:\n"; BinaryDump($req); shutdown($socket, 1); my $response = ""; $socket->recv($response, 1024); print "received response:\n"; BinaryDump($response); $socket->close(); } # 利用させていただきました # https://netlog.jpn.org/r271-635/2018/11/perl-bynary-dumper.html sub BinaryDump { my ($buf) = @_; my $len; my $i; $len = length($buf); printf ("length = %d\n", $len); for ($i = 0; $i < $len; $i++) { printf("%02X ", ord(substr($buf, $i, 1))); # 16文字目で画面上の改行 if (($i % 16) == 15) { print "\n"; } } if (($i % 16) != 15) { print "\n"; } } </code></pre> <h2 id="テスト"><a href="#%E3%83%86%E3%82%B9%E3%83%88">テスト</a></h2> <p>テストにも僕のセルフォンを使いました。<br /> Modbusスレーブとして、Androidアプリケーション"ModTCPSimX"に活躍いただきました。<br /> <a href="https://crieit.now.sh/upload_images/672850389bd205ccd2287edea4b6eea462df857ac0e06.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/672850389bd205ccd2287edea4b6eea462df857ac0e06.png?mw=700" alt="image" /></a><br /> ModTCPSimX のポート番号のデフォルトは5502です。僕のプログラム側も5502にしてあります。<br /> ※一般的なModbus/TCPは502です。<br /> Holding Register 40001 に任意の数値を設定しておきます。<br /> ※ModTCPSimX では値の背景が黄色の場合は更新がコミットされていません。鉛筆アイコンでコミットするのを忘れずに<br /> <a href="https://crieit.now.sh/upload_images/e0e934f699c14d7e14657cced9848d5c62df8d8718344.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e0e934f699c14d7e14657cced9848d5c62df8d8718344.png?mw=700" alt="image" /></a><br /> Termuxでプログラムを動かすと、最後のバイトに値が置かれたTXが返ります。<br /> <a href="https://crieit.now.sh/upload_images/a486c6b8599b14f88005f174460cdbd662df8dad794c7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a486c6b8599b14f88005f174460cdbd662df8dad794c7.png?mw=700" alt="image" /></a></p> <h2 id="次回"><a href="#%E6%AC%A1%E5%9B%9E">次回</a></h2> <p>せっかくなので、次回は取得したデータをデータベースに保存します。どうってことないんですけどね。</p> <p><a href="https://crieit.net/posts/PC-Modbus-2">サーバやPC上のプログラムでModbus機器からデータを取得 (2)</a></p> COOL MAGIC PRODUCTS tag:crieit.net,2005:PublicArticle/17672 2021-09-14T07:28:41+09:00 2021-09-14T20:06:20+09:00 https://crieit.net/posts/simple-compiler-perl Perlでかんたんな自作言語のコンパイラを書いた <p><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/08/053329">ブログに書いていたもの</a>を引っ越してきました。元の記事公開日は 2020-09-08 です。</p> <hr /> <p>20年ぶりくらいに Perl のコードを書きました。やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-perl">https://github.com/sonota88/vm2gol-v2-perl</a></p> <hr /> <h1 id="移植元"><a href="#%E7%A7%BB%E6%A4%8D%E5%85%83">移植元</a></h1> <p><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/05/04/155425">Rubyで素朴な自作言語のコンパイラを作った</a><br /> (自作言語の概要などについてはこちらを参照してください)</p> <p>ベースになっているバージョン: <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2/tree/49">tag:49</a> のあたり<br /> (追記 2021-09-11: ステップ60の修正まで適用しました)</p> <p>作り方はここに全部書いています(Ruby 版のものですが): <a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2019/05/04/234516">vm2gol v2 製作メモ</a></p> <p>ただ、Ruby 版よりは主に <a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/06/043607">C言語版</a> を見ながら書き写していました。クラスを使わなかったのもあり、C言語版に近いところも多いです。</p> <h1 id="メモ"><a href="#%E3%83%A1%E3%83%A2">メモ</a></h1> <ul> <li>20年ぶりくらいといっても、当時はちょっと入門した程度だったしもうほとんど忘れてるので<br /> ほぼゼロから再入門といった感じ</li> <li>でも 2日(日曜+月曜)でなんとか完成した。殴り書きです。</li> <li>配列・ハッシュとリファレンスが絡むあたりが最初よく分からなかった <ul> <li>まず配列の要素数の取り方が分からないとか、<code>for my $x (@$xs) { ... }</code> の <code>@</code> がなくて動かないとか、たぶん初心者あるある</li> </ul></li> <li>数と文字列の区別がない(シェルスクリプトっぽい)のをどうするかちょっと悩んだ。データの型を見て処理を分岐しているところがあるので。 <ul> <li>ハッシュでラッパーオブジェクトみたいなものを作ってどうにかした( <code>lib/Val.pm</code> )。</li> <li>最初は C言語版のときの NodeList, NodeItem 構造体を使う書き方にすれば何も考えずに機械的に移植できそうと思ったけど、あれはあれでリストの処理が煩雑・大げさで、配列で済むならその方がシンプルなので、最低限文字列と数だけ判別できるようにした。</li> </ul></li> <li>クラスの使い方もちょっと調べてみたけど、 もうちょっと Perl 力が上がった状態で使わないと逆に回り道っぽくなりそうな気がして、 C言語版の「構造体+関数群のセット」方式でやってしまった</li> </ul> <hr /> <p><code>my $foo = ...</code> をいっぱい書かないといけなくてさすがに面倒だったので途中で次のような Emacs Lisp を書いて <code>Ctrl + Alt + M</code> で入力できるようにしたり。yasnippet でも良かったかも。</p> <pre><code class="lisp">(add-hook 'perl-mode-hook '(lambda () (local-set-key (kbd "C-M-m") (lambda () (interactive) (insert "my $ = ;") (backward-char 4))))) </code></pre> <hr /> <p><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/22/162201">Dart版</a>で <code>call</code>、<a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/30/121437">Java版</a>で <code>set</code> を不要にした流れで、今回は <code>call_set</code> キーワードを不要にしてみました。同じ要領でできますね、ということが分かりました。</p> <p>(追記 2021-04-09: この修正はいったん revert しましたが、一応 <a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-perl/tree/trial">trial ブランチ</a>に残してあります。)</p> <pre><code class="perl">sub parse_stmt { my $t = peek(0); if (Token::is($t, "sym", "}")) { return -1; } if (Token::str_eq($t, "func" )) { return parse_func(); } elsif (Token::str_eq($t, "var" )) { return parse_var(); } elsif (Token::str_eq($t, "set" )) { return parse_set(); } elsif (Token::str_eq($t, "call" )) { return parse_call(); } # elsif (Token::str_eq($t, "call_set")) { return parse_call_set(); } elsif (Token::str_eq($t, "return" )) { return parse_return(); } elsif (Token::str_eq($t, "while" )) { return parse_while(); } elsif (Token::str_eq($t, "case" )) { return parse_case(); } elsif (Token::str_eq($t, "_cmt" )) { return parse_vm_comment(); } else { if (Token::kind_eq($t, "ident")) { return parse_call_set(); } else { p_e("parse_stmt", $t); die "not_yet_impl"; } } } </code></pre> <hr /> <p>(追記 2021-08-30: その後の修正により、下記の部分はなくなりました)</p> <p>それと、今回はコード生成処理のアレ、何度も似たようなのが出てきて鬱陶しかった部分をためしにサブルーチンに抽出して共通化してみました。うーん。どうでしょう。どうしようかな。とりあえず名前が微妙。</p> <p>名前が微妙な上に上手い抽象でもない気がする……となるとこれはメソッド抽出すべきではないパターンのように思えます。いい解決法が見つかるまで本家の Ruby版には取り込めなさそう。とはいえコーディングの手間・退屈さは減らせるので、移植版では気軽に使っていこうかなと。</p> <pre><code class="perl">sub to_asm_str { my $fn_arg_names = shift; my $lvar_names = shift; my $val = shift; if (Utils::is_arr($val)) { return undef; } elsif (Val::kind_eq($val, "int")) { return $val->{"val"}; } elsif (Val::kind_eq($val, "str")) { my $str = $val->{"val"}; if (0 <= str_arr_index($fn_arg_names, $str)) { return to_fn_arg_ref($fn_arg_names, $str); } elsif (0 <= str_arr_index($lvar_names, $str)) { return to_lvar_ref($lvar_names, $str); } else { return undef; } } else { return undef; } } </code></pre> <p>呼び出し箇所は6箇所。それなりに使いまわせているようではあります。</p> <pre><code>vgcg.pl:132: $push_arg = to_asm_str($fn_arg_names, $lvar_names, $val); vgcg.pl:240: $push_arg = to_asm_str($fn_arg_names, $lvar_names, $fn_arg); vgcg.pl:304: $src_val = to_asm_str($fn_arg_names, $lvar_names, $expr); vgcg.pl:316: my $vram_ref = to_asm_str($fn_arg_names, $lvar_names, sval($vram_arg)); vgcg.pl:342: my $vram_ref = to_asm_str($fn_arg_names, $lvar_names, sval($vram_arg)); vgcg.pl:375: my $vram_ref = to_asm_str([], $lvar_names, sval($vram_arg)); </code></pre> <h1 id="他の言語への移植"><a href="#%E4%BB%96%E3%81%AE%E8%A8%80%E8%AA%9E%E3%81%B8%E3%81%AE%E7%A7%BB%E6%A4%8D">他の言語への移植</a></h1> <div class="table-responsive"><table> <thead> <tr> <th>記事</th> <th>リポジトリ</th> <th>日付</th> </tr> </thead> <tbody> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/20210628_vm2gol_v2_haskell">Haskell</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-haskell">github</a></td> <td>2021-06-28</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/06/26/054540">OCaml</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-ocaml">github</a></td> <td>2021-06-26</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/4d446b778ffbbaab267c">Pascal</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-pascal">github</a></td> <td>2021-05-22</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/b80696f23a08c3c2fc5d">Julia</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-julia">github</a></td> <td>2021-05-03</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/20210407_vm2gol_v2_rust">Rust</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-rust">github</a></td> <td>2021-04-07</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/275c2b5407986b100cc8">Crystal</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-crystal">github</a></td> <td>2021-03-27</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/1e683276541cf1b87b76">Pric(セルフホスト)</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/pric">github</a></td> <td>2021-02-21</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/01/14/032813">Kotlin</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-kotlin">github</a></td> <td>2021-01-14</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2021/01/07/235019">Zig</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-zig">github</a></td> <td>2021-01-07</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/31c127c42a9722892aa8">LibreOffice Basic</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-libreoffice-basic">github</a></td> <td>2020-12-14</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/25/073200">Go</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-go">github</a></td> <td>2020-09-25</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/18/193844">PHP</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-php">github</a></td> <td>2020-09-18</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/13/133735">C♭</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-cflat">github</a></td> <td>2020-09-13</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/09/06/043607">C</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-c">github</a></td> <td>2020-09-06</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/30/121437">Java</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-java">github</a></td> <td>2020-08-30</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/22/162201">Dart</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-dart">github</a></td> <td>2020-08-22</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sonota88/items/5267dcd4750235680c8f">Python</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-python">github</a></td> <td>2020-08-19</td> </tr> <tr> <td><a target="_blank" rel="nofollow noopener" href="https://memo88.hatenablog.com/entry/2020/08/15/114754">TypeScript (Deno)</a></td> <td><a target="_blank" rel="nofollow noopener" href="https://github.com/sonota88/vm2gol-v2-typescript/tree/20200815">github</a></td> <td>2020-08-15</td> </tr> </tbody> </table></div> sonota486 tag:crieit.net,2005:PublicArticle/16713 2021-03-03T22:12:17+09:00 2021-03-03T22:12:17+09:00 https://crieit.net/posts/perl-enable-by-htaccess-20210303 .htaccess で Perl を有効にする <p><a target="_blank" rel="nofollow noopener" href="https://labor.ewigleere.net/2020/02/03/perl-operation/">Apache の設定を編集</a>した方が早そうですが、 <code>.htaccess</code> で Perl を有効にしたい場合のメモです。</p> <pre><code class="htaccess">Options +ExecCGI AddHandler cgi-script cgi AddType application/x-httpd-cgi .cgi .pl </code></pre> <p>Apache の conf と代わり映えしないですが、一応メモしておきます。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/shotets/items/cf0783530a1f2809c4d5">.htaccess の書き方(設定変更編) - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16094 2020-10-04T23:04:44+09:00 2020-10-04T23:04:44+09:00 https://crieit.net/posts/YAPC-Tokyo-2019 YAPC::Tokyo 2019の感想 <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/JG2FTJ8VRE6amV3T">YAPC::Tokyo 2019の感想 - 雑木林</a></p> <h1 id="YAPC::Tokyo 2019に参加しました"><a href="#YAPC%3A%3ATokyo+2019%E3%81%AB%E5%8F%82%E5%8A%A0%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F">YAPC::Tokyo 2019に参加しました</a></h1> <p>2019/01/26の某日、<a target="_blank" rel="nofollow noopener" href="https://yapcjapan.org/2019tokyo/">YAPC::Tokyo 2019</a>に参加しました。</p> <p>私は1/28に修論提出締切であるにも関わらず、わざわざ東京に行って参加しました。<br /> 理由はただ1つ、学生支援として、学生チケットと交通費宿泊費が無料だったからです。<br /> (正確には、交通費宿泊費は抽選だったのですが、見事当選しました)</p> <p>そこで得た知見、並びに感想を書いておきます(無料になる条件でもあったりする)。</p> <p>なお、発表内容などについては、皆さん書かれていらっしゃるので、ここでは詳しく述べません。<br /> 「yapc tokyo 感想」などで期間指定検索すればたくさん出てくると思います(期間指定しないと過去のYAPC::Tokyoの感想が出てきます)。</p> <h1 id="全体的な感想"><a href="#%E5%85%A8%E4%BD%93%E7%9A%84%E3%81%AA%E6%84%9F%E6%83%B3">全体的な感想</a></h1> <p>カンファレンスでした。</p> <p>勝手なイメージですが、私はどちらかというと、東京モーターショーのような、ブース多めのイベントを想像していました。<br /> しかし、実際には講演(いわゆるプレゼン)が主軸のカンファレンスなんだな、という雰囲気でした。</p> <p>もちろん、ブースがないわけではなく、幾つか出し物がありました。<br /> 余談ですが、DRECOMさんのブースでプランニングポーカーのカードを頂きました。<br /> 昨年、<a target="_blank" rel="nofollow noopener" href="https://www.amazon.co.jp/dp/4839924023/ref=cm_sw_r_tw_dp_U_x_aSbvCbW8MQDSB">アジャイルな見積りと計画づくり</a>を読んだばっかりなので、欲しいなぁと思っていたものが手に入って嬉しいです。<br /> 大学院を卒業しなければ使えるところも多かっただろうに......</p> <p>しかもYAPC終盤で、修論内容に問題が発見されたため、急遽戻ることになってしまい、私の心理的矛先はYAPCから修論の修正方法に移ってしまいました。<br /> それさえなければもっと楽しめただろうに......<br /> 結局最後の懇親会も途中で抜出す羽目になってしまったのは残念です。</p> <p>なんかYAPCの感想ではなくなってしまったかもしれません。<br /> でも、私が感じた通りです。</p> <h1 id="講演内容について"><a href="#%E8%AC%9B%E6%BC%94%E5%86%85%E5%AE%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">講演内容について</a></h1> <p>私が見てきた講演の感想をつらつら書いておきます。</p> <h2 id="YAPCスポンサー様とのランチ"><a href="#YAPC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B5%E3%83%BC%E6%A7%98%E3%81%A8%E3%81%AE%E3%83%A9%E3%83%B3%E3%83%81">YAPCスポンサー様とのランチ</a></h2> <p>いきなり講演とは違いますね......</p> <p>学生支援として交通費宿泊費を無料にする条件の1つに、YAPCスポンサー様とのランチがありまして、そこに参加しました。</p> <p>そこで、YAPCスポンサー様のプレゼンがありました。<br /> いくつかの企業は、完全に就活向けのプレゼンをされていて、世の就活ってこんなところにまであるんだなぁと思いました。<br /> 既に就活を終えているからこそ出てきた余裕だったかもしれませんね。</p> <p>1つ面白いなと思ったのは、<a target="_blank" rel="nofollow noopener" href="https://www.kodamari.com/">こだまリサーチ株式会社</a>さんです。<br /> 北海道に本社を構えており、従業員5名ほどで開発しているそうです。<br /> 事業内容は、大学の授業で利用する動画に翻訳字幕を付けるシステムの販売だそうで、既に北海道大学をはじめ、5大学と連携しているそうです。<br /> YAPCのスポンサーをしているのは、学生に還元するためと話しており、また様々な大学に行けば、そこで美味しいものが食べられるので嬉しいと語っており、面白い人だなぁという印象を受けました。<br /> また事業内容についても、自動翻訳だから機械学習なのかな、Perlで作ってるとしたら、機械学習ってどうやってやったんだろうか、など興味が出てきました。</p> <h2 id="Perl5の静的解析入門 機械と人間双方の歩み寄りによる平和編"><a href="#Perl5%E3%81%AE%E9%9D%99%E7%9A%84%E8%A7%A3%E6%9E%90%E5%85%A5%E9%96%80%E3%80%80%E6%A9%9F%E6%A2%B0%E3%81%A8%E4%BA%BA%E9%96%93%E5%8F%8C%E6%96%B9%E3%81%AE%E6%AD%A9%E3%81%BF%E5%AF%84%E3%82%8A%E3%81%AB%E3%82%88%E3%82%8B%E5%B9%B3%E5%92%8C%E7%B7%A8">Perl5の静的解析入門 機械と人間双方の歩み寄りによる平和編</a></h2> <p>こちら、<a target="_blank" rel="nofollow noopener" href="https://mackee.hatenablog.com/">mackee</a>さんの<a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/mackee/the-static-analysis-of-perl5">講演</a>です。</p> <p>研究内容の1つに構文解析があるため、構文解析および静的解析には興味があり、Perlの静的解析はどういう手法があるのかと気になっていました。</p> <p>構文解析に使えるモジュールは、以下の通りです。</p> <ul> <li>PPI</li> <li>Compiler::Lexer</li> <li>Perl::Lexer</li> <li>PPR</li> </ul> <p>PPIは、Pure Perl(Perlのみで実装しているモジュール)ですが、遅いという欠点があります。<br /> Compiler::Lexerは、言語で実装していますが、ところどころ構文解析できないようです。<br /> Perl::Lexerは、Perlの実行で利用する機能を利用しているそうです。<br /> PPRは、Perlのコードの正規表現を生成してくれるそうです。<br /> 現在はPPRを使うのがいい、とのことでした。</p> <p><del>構文解析は手段ですから、目的として何がしたいのかを考えると、既に実装済みのモジュールがいくつか存在します。<br /> 例えば、引数の型定義を全サブルーチンで判定しているかチェックしたいのであれば、Perl::CriticやPerl::Lintを使えばいいです。<br /> 他にも、目的のものがあるかどうか、CPANを探してみると見つかるかもしれません。</del></p> <p>訂正: mackeeさんより、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/mackee_w/status/1091332706997219329">Perl::CriticやPerl::Lintに上記の仕組みは無い</a>とのことでした。</p> <p>また、どんな構文でも書けてしまうPerlですが、時には静的解析の妨げとなってしまいます。<br /> 例えば動的なサブルーチンの生成をしてしまうと、構文解析だけでは簡単にできません。<br /> そのため、プログラマは構文解析を見据えたプログラムの記述が必要です。<br /> これについて、私も同感です。<br /> もっと静的解析者に優しいコードを書いてください。</p> <h2 id="レガシーPerlビルド 〜現代に蘇るPerl[1..5].0とPerl6〜"><a href="#%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BCPerl%E3%83%93%E3%83%AB%E3%83%89+%E3%80%9C%E7%8F%BE%E4%BB%A3%E3%81%AB%E8%98%87%E3%82%8BPerl%5B1..5%5D.0%E3%81%A8Perl6%E3%80%9C">レガシーPerlビルド 〜現代に蘇るPerl[1..5].0とPerl6〜</a></h2> <p>こちら、<a target="_blank" rel="nofollow noopener" href="https://anatofuz.hatenablog.com/">八雲アナグラ</a>さんの<a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/anatofuz/regasiperlbirudo-xian-dai-nisu-ruperl-1-2-dot-0toperl6">講演</a>です。</p> <p>そもそも私はPerl5以外に興味が全くなかったうえに、そもそも現代で動かせるとは考えてもいなかったため、Perl1を動かそうと思った行動力には感銘を受けました。<br /> 同時に、バージョンが古いほうが動かしやすいという話には非常に興味を持ちました。<br /> 発表内容だけでなく、発表方法も面白く、聞かせる講演だなぁと思って聞いていました。</p> <h2 id="Lightning Talks"><a href="#Lightning+Talks">Lightning Talks</a></h2> <p>5分おきに発表者が変わり、5分で内容を語りつくすというものでした。<br /> スピードが速く、如何にスムーズに語りつくせるかを見ていました。</p> <h3 id="npmという次世代CPANパッケージマネージャー"><a href="#npm%E3%81%A8%E3%81%84%E3%81%86%E6%AC%A1%E4%B8%96%E4%BB%A3CPAN%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC">npmという次世代CPANパッケージマネージャー</a></h3> <p>こちら、<a target="_blank" rel="nofollow noopener" href="https://aereal.org/">aereal</a>さんの<a target="_blank" rel="nofollow noopener" href="https://t.co/s9T7SkgSoT">LT</a>です。</p> <p>発想が面白いし、5分の中でプログラムを実行して成功してみせるその精神と結果も、聞いていて楽しめました。<br /> なるほど、npmはNode.jsだけのものだと勝手に思って敬遠していましたが、これは触ってみる価値がありそうです。</p> <h3 id="自走するプログラミング入門者の探し方"><a href="#%E8%87%AA%E8%B5%B0%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80%E8%80%85%E3%81%AE%E6%8E%A2%E3%81%97%E6%96%B9">自走するプログラミング入門者の探し方</a></h3> <p>こちら、<a target="_blank" rel="nofollow noopener" href="http://note103.hatenablog.com/">門松宏明 / note103</a>さんの<a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/note103/zi-zou-surupuroguraminguru-men-zhe-falsetan-sifang?slide=48">LT</a>です。</p> <p>自走するプログラミング入門者、という名前はすごく分かりやすく、確かに私もそのような時期があったなぁと考えさせられました。<br /> モチベーションというものは、理解できるかどうかで大きくかわると思っているため、理解できるように教えていかないと伸ばすことは難しいのかなというのが個人的感想です。</p> <h3 id="Perl meets AWS Lambda"><a href="#Perl+meets+AWS+Lambda">Perl meets AWS Lambda</a></h3> <p>こちら、<a target="_blank" rel="nofollow noopener" href="https://moznion.hatenadiary.com/">moznion</a>さんの<a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/moznion/perl-meets-aws-lambda">LT</a>です。</p> <p>無ければ作ればいい、という発想はよくありますが、実際に作るとなると話は別で、よく作られたなと思いました。<br /> Lambdaに限らず、多くのプラットフォームでPerlは未対応だったりするため、こういう動きがもっと増えてほしいです。</p> <p>そして話し方がうまいです。<br /> あれだけ語れるような情熱を持ちたいものです。</p> <h2 id="Keynote: 松野 徳大"><a href="#Keynote%3A+%E6%9D%BE%E9%87%8E+%E5%BE%B3%E5%A4%A7">Keynote: 松野 徳大</a></h2> <p>こちら、<a target="_blank" rel="nofollow noopener" href="https://64p.org/">松野 徳大</a>さんの講演です。</p> <p>YAPCは楽しかったというお話と、これまでの振返りでした。</p> <p>個人的に気になったのは、「<a target="_blank" rel="nofollow noopener" href="https://cruel.org/freeware/hacker.html">How to become a hacker</a>世代」という言葉でした。</p> <p>皆さんご存知ですか?<br /> 多分ですが、私がプログラミングを行うきっかけとなり、またPerlを勉強しようと思ったきっかけのサイトがここだと思うのです。<br /> 今までいろいろな方に「なぜPerl?」と聞かれて、「ハッカーになるためにはPerlを勉強しろって書いてるサイトを見たから」と答えていたのですが、私もすっかり忘れてしまい、どこのサイトだったかとんと見当がつかず、次第に忘れていました。<br /> タイトルを聞いて「もしや」と思ったのですが、調べてみたら見たことあるようなサイトでしたので、懐かしさを感じました。<br /> ここまで有名なサイトであれば、タイトルを覚えておきたいですね。</p> <p>もう1つ、YAPCに参加した旨をサイトやツイッターで情報発信してほしい、ということでした。</p> <p>なるほど確かに、発表者にとっては話題に上げてもらえるのは嬉しいことですし、それによって次回のYAPCとつなげるきっかけにもなります。<br /> なにより、知らない人がYAPC楽しそうだと思わせることで、参加者を増やし盛り上げるのは大事なことです。</p> <p>この記事は、確かに学生支援の交通費宿泊費無料の条件のために書いているかもしれませんが、松野さんの言葉を聞いていたことを考えてみると、もしかしたら条件が無くても書いていたかもしれません。<br /> それは神のみぞ知ることでしょう。</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>学生最後に参加してみよう、と思って参加したものですが、楽しめた部分と、もう少し準備しておけばよかったなと反省する部分がありました。<br /> 次回、参加することがあれば、受動的な参加ではなく、能動的な参加をしたいと思います。<br /> YAPC::Tokyo、お疲れさまでした。</p> Morichan tag:crieit.net,2005:PublicArticle/14786 2019-02-07T23:59:11+09:00 2019-02-07T23:59:11+09:00 https://crieit.net/posts/YAPC-Tokyo-2019-Perl6-Perl-CPAN YAPC::Tokyo 2019の感想 - Perl6、レガシーPerl、綱渡りバッチ、CPANとエンジニアの成長物語 <p>「YAPC::Tokyo 2019」に参加してきました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://yapcjapan.org/2019tokyo/" target="_blank" rel="noopener">YAPC::Tokyo 2019</a></p> <p>最近はPerlを書けてないのですが、言語としての自由度の高さはとても好きで、久々にたくさんのPerl成分をもらった気がします。</p> <p>そして何より楽しかったです。<strong>「ブログを書くまでがYAPC!」</strong>ということで、感想記事をつらつらと書きます。</p> <h2 id="イベント会場の写真"><a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E4%BC%9A%E5%A0%B4%E3%81%AE%E5%86%99%E7%9C%9F">イベント会場の写真</a></h2> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/konosumi/20190128/20190128013036.jpg" alt="image" /></p> <h2 id="2019年冬のPerl"><a href="#2019%E5%B9%B4%E5%86%AC%E3%81%AEPerl">2019年冬のPerl</a></h2> <p>最初に聞いたのは、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/charsbar">@charsbar</a>さんの2019年冬のPerlです。主にPerl6のことが知りたかったので参加しました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/charsbar/perl-2019-winter" target="_blank" rel="noopener">perl_2019_winter - Speaker Deck</a></p> <p>Perl6は言語仕様のみが定義されているため、その処理系は別のプロジェクトとして色々あるのですが。処理系としては<strong>Rakudoを使うのが良さそう</strong>です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://rakudo.org/">https://rakudo.org/</a></p> <p>RakudoにはRakudo.jsというJavaScriptがあって、なんと<strong>6Padを使うとブラウザ上でPerl6を実行できます。</strong>とりあえずPerl6を触ってみたいというだけであれば、ブラウザで実行してみるのが最もお手軽そうです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://perl6.github.io/6pad/">https://perl6.github.io/6pad/</a></p> <h2 id="綱渡りバッチ脱出大作戦"><a href="#%E7%B6%B1%E6%B8%A1%E3%82%8A%E3%83%90%E3%83%83%E3%83%81%E8%84%B1%E5%87%BA%E5%A4%A7%E4%BD%9C%E6%88%A6">綱渡りバッチ脱出大作戦</a></h2> <p>午後イチで聞いたのが<a target="_blank" rel="nofollow noopener" href="https://twitter.com/shinpei0213">@shinpei0213</a>さんの「綱渡りバッチ脱出大作戦」です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/shinpeim/gang-du-ribatutituo-chu-da-zuo-zhan" target="_blank" rel="noopener">綱渡りバッチ脱出大作戦 - Speaker Deck</a></p> <p>感想を一言でいいますと、綱渡りのように動いてる危機的状況のバッチサーバーを、<strong>入社してから試用期間の間に解消してしまうのがすごすぎ</strong>です。</p> <p>・・・とは言え簡単に問題を解決することができたわけではなく、乱立する問題をひとつずつ整理していって、地道にこなせるレベルのタスクへと落とし込んでいく過程がとても勉強になりました。</p> <p>フォントのライセンス問題の影響で、安易にサーバーを増設して冗長化できないなど、<strong>社内事情も加味して最適解を考えていく過程</strong>が共有されてます。かなり心に刺さる発表でして、こういう風に問題解決できたら優秀になれるだろうなー。</p> <h2 id="レガシーPerlビルド ~現代に蘇るPerl[1-2].0とPerl6~"><a href="#%E3%83%AC%E3%82%AC%E3%82%B7%E3%83%BCPerl%E3%83%93%E3%83%AB%E3%83%89+%7E%E7%8F%BE%E4%BB%A3%E3%81%AB%E8%98%87%E3%82%8BPerl%5B1-2%5D.0%E3%81%A8Perl6%7E">レガシーPerlビルド ~現代に蘇るPerl[1-2].0とPerl6~</a></h2> <p>続いては、八雲アナグラさん ( <a target="_blank" rel="nofollow noopener" href="https://twitter.com/AnaTofuZ">@AnaTofuZ</a> ) によるレガシーPerlビルドです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://speakerdeck.com/anatofuz/regasiperlbirudo-xian-dai-nisu-ruperl-1-2-dot-0toperl6" target="_blank" rel="noopener">レガシーPerlビルド ~現代に蘇るPerl[1-2].0とPerl6~ - Speaker Deck</a></p> <p>初代のPerl1.0が、今でもGitHubにありメンテナンスされていて動作するのも驚きですが。<strong>昔のPerlを現代に蘇らせようとするあくなく探究心が、ギークっぽくてむっちゃ良い</strong>です。</p> <p>技術というのは、こうやって楽しむんだという好例と言いますか。私の技術書典向けの同人活動も、技術そのものを楽しみたいというノリでやっているのですが、すごく楽しかったのでPerl3.0〜5.0へと続編を期待したいです。</p> <h2 id="多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと"><a href="#%E5%A4%9A%E3%81%8F%E3%81%AECPAN+Author%E3%81%AB%E8%82%B2%E3%81%A6%E3%82%89%E3%82%8C%E3%80%81%E6%81%AF%E3%82%92%E3%81%99%E3%82%8B%E3%82%88%E3%81%86%E3%81%ABCPAN%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E6%9B%B8%E3%81%91%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%82%8A%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと</a></h2> <p>続いては、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/songmu">@songmu</a>さんの「多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと」です。</p> <p><a target="_blank" rel="nofollow noopener" href="http://songmu.github.io/slides/yapc-tokyo-2019/#0" target="_blank" rel="noopener">多くのCPAN Authorに育てられ、息をするようにCPANモジュールを書けるようになり、そして分かったこと</a></p> <p>今回のYAPC::Tokyoは「報恩謝徳」がテーマだったのですが、まさにテーマにずばりの内容でした。</p> <p>技術系の勉強会に行くと、レベルの高い人が多すぎて「自分の技術力で大丈夫なのか?」と不安に駆られることも多いのですが。<strong>地道にプログラム・OSS・ライブラリを書き続けたり、ブログを使って発信していくことの大切さ</strong>を教わった気がします。</p> <p>「車輪の再発明を恐れない」は名言だと思いますし、努力と知見にあふれた感動のスライドですので、すごくオススメです。ベストトーク賞に選ばれるのも納得です。</p> <p>あと、めるくんさんの感想がとても良いので、スライドと併せて見るのを推奨します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://blog.3qe.us/entry/2019/01/27/175027" target="_blank" rel="noopener">プログラマ大航海時代、YAPC::Tokyo 2019に行って希望をもらってきた - Lambdaカクテル</a></p> <h2 id="LT &amp; Keynote &amp; Ending"><a href="#LT+%26amp%3B+Keynote+%26amp%3B+Ending">LT & Keynote & Ending</a></h2> <p><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/k/konosumi/20190128/20190128022457.jpg" alt="image" /></p> <p>最後はメインホールにてLTがあり、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/tokuhirom">@tokuhirom</a>さんによるキーノート、その後にエンディングとなりました。</p> <p>@songmuさんがベストトーク賞に選ばれたときに感極まってましたが、そういう意味でも感動のエンディングで、参加して良かったです。</p> <h2 id="さいごに"><a href="#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB">さいごに</a></h2> <p>最近はコードを書くモチベーションが少し下がっていたのですが。なんだかんだYAPCに参加したら、とても楽しかったです。</p> <p>YAPCはもちろんですが、Perlには「◯◯.pm」というコミュニティ文化があって、Perlの良いところはコミュニティだと再認識しました。2014年のYAPC::Asia以来のYAPCでしたが、やっぱりYAPCは良いです!</p> このすみ