北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

標準入力の一行の上限は4,096バイト

標準入力の一行に大量の文字を食わせると、4,096バイトしか有効にならない。

$ perl -e 'print "x" x 5000, "\n" for 1 .. 2' | clip.exe
$ perl -e 'print length <>, "\n" for 1 .. 3'
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4096
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4096

Why is there a 4096 character limit on text input in the Linux shell を見つけて初めて知ったんだけど、これは canonical mode の振る舞いらしい。 stty -icanon stty icanon で切り替えられるが、切り替えると ctrl-d が効かなくなる。

詳解UNIXプログラミング にも書いてあるようだ(積んであるけど読んでない)。

rustでdiscordのbotを作ってみたくて下調べ(3)

前回からだいぶ時間が空いたが、下調べの続き。

discord-rs というのを最初に見つけて古いと嘆いていたのだが、現在使われているクレートは serenity の方だったようだ。これを検索で見つけるのは至難の業。 discord で検索すると、他の関係ないクレートがガンガン引っかかってしまうので(恐らく、いろいろなクレートでサポート用の discord チャネルがあるため)。

serenity は非常に重厚なクレートで、 discord.py に設計思想が近い。 #[command] マクロを使うことで、簡単に bot コマンドを作ることができる。これは framework feature で提供される機能。

このクレートは tungstenite を使っているが、 tokio ベースではない。つまり、 Future トレイトを使った非同期処理にはなっていない。 reqwest も同期的に使っており、 API にリクエストを送るとブロックする。 issueは上がっている が対応の目処は立っていないようだ。

ところで、 tokio-tungstenite は新しいバージョンが無事にリリースされ、 async await を使って処理を書けるようになっている。 discord-rs を参考に bot を実装してみているが、今のところうまく動かすことができている。 APIの量が多くて これらの JSON を定義するのに手間取っているが、もう少し機能が充実したら discord-rs の代替の軽量なクレートとしてリリースできたらいいなと思いながら実装を進めている。諸事情( rust の練習も兼ねているので実験用のゴミが多い、など)でまだしばらくは github には上げないつもりである。

rustでdiscordのbotを作ってみたくて下調べ(2)

discord の bot を作るのなら websocket が必須なので下調べ。

というか、調べなくても discord-rs が使っていた websocket がそのまま使えるはずと思っていたのだが、開発が sluggish なので tokio-tungstenite を勧めている。良い名前空間を使っているだけに悲しい。

tokio-tungstenite の方は、 async/await への対応がまだであり、 鋭意作業中 のようだ。近日中にリリースされそうな勢い。

一方で、 crates.io で改めて検索すると、 ws なんてやつがいる。利用数は多いようだが、こいつは async/await とは別のエコシステムで実装されているように見える。 async/await の issue では tungsteniteが勧められている

ということで、 tokio-tungstenite の async/await 対応が終わるのを待つのが、一番幸せになれる道のような気がしている。

rustでdiscordのbotを作ってみたくて下調べ

結論から書くとまだ何もしてない。

discord-rs というのがあるのだけど、だいぶ古い。特に嫌なのが issue にも上がっている通り openssl 1.0 系への依存。 昨年末にEOLを迎えている ので避けておきたい。

という事で手元でバージョンを上げようと試みたのだが、これがかなり厳しい。特に hyper 周りがバージョンが上がって大きくインタフェースが変わっており、変更量が多すぎて諦めた。ついでに edition も Rust 2018 にしようと試みたのだが、 try! の廃止があまりにもきつかったので断念。 cargo fix --edition を使えと書いてあったが、 try! は警告を出すだけで何も直してくれず、おい、その量は無理だろって量の warning が出ただけの結果となった。

という事で、手で bot を書いてみようかなと。 discord bot の基本は Haskell ではあるが fumivalさんのエントリ がとてもわかりやすかった。後は discord-rs を参考に手を動かすだけ。

Rust 1.39 より await / async syntax が入り、 runtime も tokio 以外も使えるのでやってみたかったのだが、 hyperはtokioに依存しているぽい ので、無理せず tokio を使うべきかなあという結論。あと、 discord-rs は hyper に依存しているが、当時の hyper が持っていた機能は reqwest に移っていそうだったので、こっちを使うほうが良さげ。

という事で、結局調べていただけでまだ何もしていない。

2019年のまとめ

今年を箇条書きでまとめておく。歳のせいか意識の高い話は何もなく、ああ、良くないなあとは思うのだが、まあそれとは別の話として、将来の自分用にメモを残して置くことはいいことだろう。

plain-old jarで JUnit5 を試す

https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher に書いてあるんだけど、分かりにく過ぎたので。

$ curl -O https://repo1.maven.org/maven2/org/junit/platform/junit-platform-console-standalone/1.5.2/junit-platform-console-standalone-1.5.2.jar
$ cat SampleTest.java
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;

public class SampleTest {
    @Test
    public void testOneEqualsOne() {
        assertEquals(1, 1);
    }
}
$ javac -cp junit-platform-console-standalone-1.5.2.jar:. *.java
$ java -jar junit-platform-console-standalone-1.5.2.jar -cp . --scan-classpath

Thanks for using JUnit! Support its development at https://junit.org/sponsoring

╷
├─ JUnit Jupiter ✔
│  └─ SampleTest ✔
│     └─ testOneEqualsOne() ✔
└─ JUnit Vintage ✔

Test run finished after 169 ms
[         3 containers found      ]
[         0 containers skipped    ]
[         3 containers started    ]
[         0 containers aborted    ]
[         3 containers successful ]
[         0 containers failed     ]
[         1 tests found           ]
[         0 tests skipped         ]
[         1 tests started         ]
[         0 tests aborted         ]
[         1 tests successful      ]
[         0 tests failed          ]

今日は 吉祥寺.pm20 の日です

弊社での開催でしたので、自分用のメモを残しておきます。

本当は難しいPSL / hiratara

自分のセッションでした。

speakerdeck.com

Windowsデスクトップでweb開発 / setoazusaさん

  • Windowsで開発している人は少ない
  • TypeScriptやJavaScriptならなんとかなる?
  • ネイティブコード、symlink、permission、ビルドスクリプトでのUNIXコマンド
  • 大型アップデートの繰り返し。Win7とは違う
  • VSCode のリモート WSL のデモ
  • wsl.exe を起動
  • Dancer(Perl)でのデモ
  • サーバを起動
  • VSCode から編集して、反映
  • Live Reload が効かない。WSLの問題なのでWSL2に期待
  • Windows 開発で楽しく Perl 開発

EMはじめまして 10年努めたSIerから転職して3週間 / tenten0213さん

  • エンジニアリングマネージャー
  • 1on1やった
  • オープンなカルチャー
  • やることがない ... 20%ルールなどやる
  • タイトルと給料がオープン
  • 給料はみんなで決めている
  • リクルートに力を入れている

オープニング

  • 20回目です
  • 6周年です
  • 生まれ故郷: YAPC::Asia のリジェクトコンの与太話で生まれた

ソフトウェアラジオとC++ / jj1bdxさん

  • 昔のラジオ
  • FMエアチェック
    • ラジオをカセットに録音?
  • 現代のラジオ
    • USBデバイスで得た信号をソフトウェア処理
    • コードが書ければラジオをかけれる
  • 負の周波数とは?
  • std::atan2 はすごく時間がかかるので、 gnu の実装を使う
  • AM放送なら振幅が必要
  • FM放送なら位相を微分し、復調する
  • 位相が歪むとFM放送で不快な音がする
  • 時間だけを見ると、反射波の遅延の波が加算される
  • マルチパスフィルタ: 逆方向のフィルタをかける
  • FIRフィルタ 複素数でやったフィルタ
  • Vector Optimized Library of Kernels (volk ... x86 と ARM だけすごく早くなる)
  • 世界初のOSSで実装したマルチパスフィルタ
    • airspy-fmradion
  • Rasberry Pi でも動く
  • Windows 対応も予定している
  • 冬の夜に 雷を伝える 電離層

触ってみよう Micronaut Framework / shimamchanさん

  • コールドスタート時の性能が重要視
  • JVM は不利
  • Sprint boot からインスパイア
    • 依存はしていない
  • 昔のフレームワークはモノリシック前提だった
  • Netty ベース
  • @Singleton アノテーション。独自実装アノテーションもある
  • Kotlin、Groovy も対応
    • Groovy はイメージ化できない
    • ScalaClojureにも対応する予定らしい
  • DI対象がない場合は実行時エラー
  • コンパイルしたあとはデコンパイル(して、何をやっているか調べる)
    • リフレクションを使ってないことがわかる
  • フィールドインジェクションすると、リフレクションが使われる
    • むやみに使うとテストでもDIコンテナが必要にある
    • コンストラクタインジェクションのほうが、よい。 final にできる

PHP で AST 解析して Java の中間コードを生成する / memoryさん

  • PHP そのものを JVM 言語にする話
  • Abstract Syntax Tree 抽象構文木
    • 意味のある情報のみをツリーに
    • インデントなどを消す
  • 言語に合わせたシンタックスを理解してトークンに分解
  • AST解析の方法
    • PHPのライブラリを使うか
    • 自作するか
  • nikic/PHP-Parser を利用
  • Javaのオペコードとは
    • javap で吐き出せる
    • iconst_1, iconst_2, iadd, iconst_3 (1 + 2 + 3)
  • echo を System.out.println に直すのはすごく大変
  • PHPJava にするデモ
  • javap するとコンパイル元が HelloWorld.php になっている
  • php-java / コントリビュート募集中
    • 作っている理由: 刺激が欲しいから
    • 辛いところ: 型

詳解 Class::Accessor::Typed / papixさん

  • Kichijoji Poem Meeting : 句会
  • お前の型は間違っている、という話は勘弁
  • Go、Scalaとは違う
  • Perlの型: スカラ、配列、ハッシュ
  • 文字列を期待するところにリファレンスを渡すと
    • 期待する動作をしない
    • 死なない
  • モジュールで動的に型を定義する。実行時に検証
    • エラーにならないよりはマシ
  • Smart::Args 型チェック
    • 型の定義は Mouse::Util::TypeConstraints
    • Type::Tiny というのもある
  • bless 後付で作られたPMP
    • 祝福するとオブジェクトができる
    • クラスビルダーを使って、書きやすくする
  • フルスペック(バリデーションやMixin)なものとシンプルなもの
  • フルスペック
  • シンプル
    • Class::Accessor, Class::Accessor::Fast
    • Class::Accessor::Lite, Class::Accessor::Lite::Lazy
  • Class::Accessor::Lite::Lazy : ro_lazy など
  • フルスペックは重厚。複雑。型の恩恵がある
  • Class::Accessor::Typed
    • Class::Accessor::Lite::Lazy + SmartArgs
  • ベンチマーク
    • Moose, Moo(ISA) よりは速い
    • Mouse よりは遅い
  • 始めよう 型の力で 良いPerl

スポンサートーク / hirose30さん

  • FOについて
  • RTBを作った会社。マーケティングテクノロ
  • モバイル、WEBの広告。位置情報の広告。タクシー
  • TV ✕ AdTech
  • Give People Work That Requires A Person
  • Roppongi PRODUCT MANAGER Meetup やってます
    • 決意表明: 1年以内に開催したい

IR Reading 2019 秋に行ってきました / sakuraさん

  • モンハンとマリオメーカーとプログラミングから変更
  • IR(情報検索)の論文読み
  • 5時間で22人のスピーカー、26本
  • Health Cards for Consumer Health Search
    • ナレッジグラフ。健康のクエリにも有効?
    • 右側に出るやつ
  • Teach Machine How to Read: REading Behavior Inspired Relevance Estimation
    • 検索結果のユーザがどう目を動かすか
    • アルゴリズムを提案
    • 順次読み、垂直減衰、クエリ志向、文脈依存、選択読み、早期終了
    • クエリ志向を考慮したアルゴリズムが多い
    • これらすべてを考慮したアルゴリズムを考える論文
  • 決意表明: 検索を諦めない

自分の仕様の伝え方は間違っていた! / i47_rozaryさん

  • ストーリーテリングで仕様を伝える
  • よくある伝え方
    • 機能のリストが書いてある
    • なぜ必要なのか書いてない
  • ストーリーテリング
    • 物語を通じて、情報を印象づける
  • 病院に行かない理由にも色々ある
    • 定期検診がめんどい、忘れる
    • 急病だが病院が遠い、行けない
  • タスクに簡単に書くと、開発者は作り始めてしまう
    • 利用状況の説明が足りない
  • ユーザの環境情報を元に仕様を考える
    • チーム全員でプロダクトに向き合うことができる
  • 決意表明: 40歳になったら宇宙旅行

それでもスクラムマスターをやっていく / KamoShinichiroさん

  • 30分のスライドを5分で
  • スクラムマスターの価値
  • PはPoemのP
  • 人間は自分たちへの甘えがある
    • 現状の自分を肯定しがち。masterへpushしたときなど
    • そこで止まってしまう
    • 長期的に見ると問題が起きていることがある
  • 悪いからサボるのではなく弱いからサボる
  • チームのトレーナー : スクラムマスター
  • スクラムマスターは第三者なので、自分しか知らない自分がいる
    • 走りながら自分のフォームを見直すことができない
    • エンジニアにも同じことを言えるだろう
  • ボトルネックになったりしがち。だが、価値がある

令和なのでメールを読む話 / tennashiさん

  • 人間は増えますね
  • PM = "P"OP I"M"AP
  • neomutt でメールを読む
    • mutt から派生。 CLI 。 hjkl で移動ができる
  • HTMLメールをちゃんと読める?
    • w3m
    • テキストベース。 hjkl で移動ができる。 mutt が勝手に開く
    • 普通、 text/plain と text/html が両方送信されている
  • IMAP 接続が遅い問題
    • mbsync (isync)
    • IMAPサーバからメールを取って Maildir 形式で保存
  • Maildir 形式
    • メールの形式: RFC5322/RFC2822/RFC822
    • ローカルの形式はない。 mbox か Maildir(++)
    • mbox は1ファイルだから怖い
  • mbsyncの定期実行は systemd やら cron
  • imapnotify : IMAPのNOTIFY 拡張をトリガに

いまさらMySQL::Dump::Parser::XSの話 / karupaneruraz さん

  • ダンプすると数十GB
  • mysqld 通して importすると時間がかかって大変
  • MySQL::Dump::Parser::XS
    • 5 年前に作った
  • 金でいいインスタンスを立てるといい
  • 突然のPR
  • 5年越しのCPANリリースした
    • メタ文字のサポート
    • charset indicator ( __latin1'abc' ) など

昔作っていたソシャゲーの裏側 / わいとんさん

  • 大井町.pm 6人くらい
  • 2007 年 facebook platform
  • 2008年 月mixiアプリ
  • 2009年 怪盗ロワイヤル
  • モバゲーAPI, GREEアプリ
  • 2011 探検ドリランド
  • 2007年12月
    • 「猿渡学園」
    • 2013年 クソアプリオブ・ザ・イヤーに選ばれる
    • すでに存在しない会社
  • 猿渡学園の裏側
  • 猿渡学園DX (iアプリスマホアプリ)
  • ヤンキー、学力は控えめ
  • モヒカン版きれいなジャイアン
  • 検索機能でタイマン (PvP)
    • 戦術は3つ
    • メールで果たし状
  • tableタグを利用した体力ゲージ
  • 10,000 回自動対戦で、差があるとエラーとなる(パワーバランス)
  • Scientific Linux 4.x
  • Perl 5.8 (よくわからない言語)
  • Catalyst (Catamoose ではない)
  • Apache2.0 + mod_perl
  • Tritonn (MySQL 5.0 + Senna)
  • memcached
  • gearman から TheSchwartz に
    • タイマン、抗争が発生しない現象が解決
  • Ultra Monkey L7, Heartbeat
  • iptables + Heartbeat

事業を横から見たエンジニアの悩み / kfly8さん

  • 組織の生産性を上げることが仕事のミッション
  • 総合格闘技。人に聞いて現状把握。仮説を立てる。PDCAを回す
  • 毎日デプロイではなく、ゆっくり、継続がキモ
  • 1on1、勉強会、カンファレンス参加支援、評価制度 うまく機能しているか
  • マネージメントが機能しているか
    • 目標設定、成果、進捗、雑談
  • フルスクラッチで頑張りすぎ

エンジニアが(きっと)知らないエンジニア採用の話 / chan_centerさん

  • 採用って恋愛に似ている?
    • 似てない。採用はできるけど彼氏はできない
  • 相手の気持ちに従う、相手のペース、何もしなかったり、3時間の面談
    • うまくいくこともうまくいかないこともある
    • 万能薬はない
    • 相手に有効な切れるカードを増やしていく
  • Facebook 送りまくり、マックでエンジニアぽい人をナンパ
    • これは引かれるので、絶対にやめたほうがいい
  • 相手のことを考えていっぱいやる
    • 活動時間が半分入って、同じ人数入る
  • 決意表明: 恋愛にノウハウを活かしたい