まだ重たいCMSをお使いですか?
毎秒1000リクエスト を捌く超高速CMS「adiary

2019/02/11(月)Linux/Windowsで動く本格的なWebServerをPerlで作る

2019/02/02(土)adiary Version3.21 / Ver3.22 リリース情報

ダウンロードはこちらから

Ver3.22の変更点

  • 【Fix】sitemapプラグインが動かない。
  • 【Fix】AMPプラグインにCSSが適用されない。
  • 【Fix】mod_perl2環境で動作が不安定。
  • 【Fix】インポート等のセッション画面表示がおかしい。
  • 【httpd/EXE】コードを若干変更。

Ver3.21a/bの変更点

  • 【Ver3.21a】Ver3.21で変更した「figure caption」の仕様を元に戻しました。*1
  • 【Ver3.21b】【Fix】テキストエリアでTABが入力できない。

*1 : 問題しかありませんでした……

Ver3.21の変更点

  • 内部処理を見直し、2%-5%程度処理を高速化しました。
  • 起動時のパス解析を更新しました。
  • 静的出力(エクスポート)機能を更新しました。
  • テーマ選択画面を少し見やすくしました。
  • 【記法】Markdown式の「```~```」等のブロック記法に対応しました。*2
  • 【記法】ブロック記法を若干改良しました。
  • 【記法】同じ内容の注釈でもセクションが異なれば別々に出力するようにしました。
  • 【記法】フィルター記法をはてなブログURLに対応させました。
  • 【Markdown】注釈記法を追加しました。
  • 【Markdown】Qiitaのmathブロック記法を追加しました。
  • 【httpd/EXE】max_request設定を追加し、デーモンの自動再起動を内蔵しました。*3
  • 【httpd/EXE】引数を若干変更しました。
  • 【httpd/EXE】adiary.conf.cgiが存在しない時、自動生成するようにしました。
  • 【plugin】JavaScriptプラグインを更新。
  • 【plugin】フリー入力プラグイン(メイン部)に表示条件を選択する機能が付きました。
  • 【plugin】メール通知プラグイン。sendmailコマンドを止め、SMTPで送信するようになりました。
  • 【Fix】JavaScript強制更新用queryが一部正しくない。
  • 【Fix】Perl5.8で動かない。(Thanks to 漁
  • 【Fix/デザイン編集】単一記事表示の編集リンクが移動できてしまう。
  • 【Fix/記法】gist/githubのソース貼り付けが動作していない。
  • 【Fix/Markdown】コメントのみの行を、行処理してしまう。

*2 : シンタックスハイライトや数式記法は人によってはよく使うにもかかわらず記述方法がややこしいので、覚えやすい記法をMarkdownより輸入しました。

*3 : 長期運用したときメモリリークしないための措置です

2019/01/20(日)Net::SMTPでSMTP AUTHのDIGEST-MD5に失敗する問題

さくらインターネットのメールサービスを使用して、SMTP AUTHのDIGEST-MD5認証を使うと送信に失敗する問題を調べてみました。

問題の詳細

PerlのNet::SMTPモジュール等を使用して、さくらインターネットのメールサービスを使い、SMTP Authでメールを送信する失敗します。

ネットで検索するとPerlのNet::SMTPの問題と書かれていたりもしますが、実際にはさくらインターネット側の問題のようです

SMTPのログを取ってみるとこんな感じになります。

> 220 www1234.sakura.ne.jp ESMTP Sendmail 8.15.2/8.15.2; Sun, 20 Jan 2019 21:25:22 +0900 (JST)
EHLO localhost.localdomain
> 250-www1234.sakura.ne.jp Hello xxxx [192.168.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE 209715200
250-DSN
250-AUTH CRAM-MD5 DIGEST-MD5 LOGIN PLAIN
250-STARTTLS
250-DELIVERBY
250 HELP
> AUTH DIGEST-MD5
(decoded) nonce="UOM8WDtDO5/ZOCm+tpQaxjRbHOCM5Y5CKekiBEVlmU8=",
		realm="www1234.sakura.ne.jp",
		qop="auth,auth-int,auth-conf",
		cipher="c4-40,rc4-56,rc4,des,3des",
		maxbuf=8192,charset=utf-8,algorithm=md5-sess
>(decoded) authzid="smtp@example.jp",charset=utf-8,cipher=rc4,
>		cnonce="eedacf2b08dc6c60a2a799ee59188455",
>		digest-uri="smtp/XXXXXXXX.sakra.ne.jp",
>		nc=00000001,nonce="UOM8WDtDO5/ZOCm+tpQaxjRbHOCM5Y5CKekiBEVlmU8=",
>		qop=auth-conf,realm="www1236.sakura.ne.jp",
>		response=c54d120c415a6e3d5cd5469b36faa7e1
>		username="smtp@example.jp"
(decoded) rspauth=fc45f7aa080db4dfb73d1b65a1f48d50
>
235 2.0.0 OK Authenticated
> MAIL FROM:<test@example.jp>
Net::SMTP: Net::Cmd::getline(): unexpected EOF on command channel:

ソースに手を入れていろいろ調べてみたところ、

235 2.0.0 OK Authenticated

を受け取ったあと、どんなコマンドを送っても切断されているようです。コマンドを送るまでソケットは生きているのですが、改行してコマンドを確定した瞬間にソケットの強制切断を喰らいます。これを回避するために、なにか特殊な暗号をしゃべるべきなのかもしれませんが皆目検討が付きません。

問題の切り分け

問題を切り分けるために、自前でSMTP AUTH / DIGEST-MD5認証対応のpostfixサーバを構築して実験してみたところ、問題なく送信できました。これにより、さくらインターネット側の不具合の可能性がかなり濃厚になってきました。

なぜ問題が放置されているのか?

ほとんどのメーラー(メールクライアント)は、SMTP AUTHの認証方法を細かく指定することができません。内部で良きにはからってくれるので、仮にDIGEST-MD5認証に挑戦して失敗しても、CRAM-MD5等の他の認証方法を試します。

PerlのNet::SMTPモジュールではなぜ問題が起こるのか?

Net::SMTPモジュールは「EHLO」で返された「AUTH」の中で、最初に対応しているものを認証手段として選択します。失敗しても次の認証方法を試したりはしません。結果として、さくらインターネットのメールサービスと組み合わせて使用すると、SMTP Authに失敗します。

ひとこと

さくらインターネットちゃんとしてください(笑)*1

2018/12/27(木)adiary Version3.20 リリース情報

ダウンロードはこちらから

Ver3.20の主な変更点

  • スタンドアローンHTTPサーバ機能を持った adiary.httpd.pl が開発されました。
  • Windows用実行ファイル adiary.exe が開発されました。
  • IE9, IE10のサポートを終了しました(対策コードを削除しました)。
  • 数字のみのコンテンツkeyを許可しました。
  • 各種高速化対策を行いました。

大きめの変更が多くなっています。

追加修正

  • 【28日00時】webpushプラグインに致命的なバグがあったためファイルを差し替えました。
  • 【28日23時】Windows版の adiary.exe を差し替えました。adiary.conf.cgi自動生成付き。

Ver3.20の変更点(詳細)

  • 数字のみのコンテンツkeyを許可しました。
    • 数字のみのコンテンツkeyを指定できるよう[link:XXX]記法を作成しました(詳細)。
    • 日付指定を path_info からqueryに変更しました。
    • 時刻による記事指定の仕様を変更し、[tm:XXX]記法を作成しました。
  • 高速化対策を行いました。(Google PageSpeed Insights
    • <script defer>を使用し、ページのロードを高速化しました。
    • 一部のCSSを遅延読み込みするよう変更しました。
    • CGI動作以外でのライブラリの自動更新チェックを1秒1回だけ実施するよう変更しました。
    • ブログ表示時に不要なjQuery UIをロードしなくなりました。
  • 【記法】「空行で段落処理(改行処理なし)」の時、行末スペース2つ以上を改行に置換するよう変更。
  • 【記法】Amazon紹介リンク作成機能(asinタグ、or URLフィルター機能)のリンク先を変更。
  • 【記法】URLの自動リンク機能を削除。*1
  • 【Markdown】リスト中のブランク行の後に先頭スペースを含む行があったとき、リストが続いているとみなすように変更。(本家準拠)
  • 【Markdown】途中空行を挟むリストがあった場合、リスト記号が異なれば違うリストと扱うように変更。*2
  • 【Markdown】リストの入れ子処理を変更し、本家の動作に近づけました。
  • 【アルバム】delキーでファイルやフォルダを削除できるようになりました。
  • 【plugin】webpushプラグインをRFC準拠で更新しました。EdgeHTML 17以降に対応しました。
  • 【plugin】twitterモジュールを更新しました。
  • 【plugin】360度写真用ビューアプラグインを更新しました。
  • 【fix】AmaoznのアフィリエイトIDに「.(ドット)」を含む場合、正しく保存されない。
  • 【fix】同時編集ロック機能での誤検出がまだ発生していた。
  • 【fix】ブログのコピーを作成した際、設定を保存しないとブログタイトルなどがブログ一覧に反映されない。
  • 【fix】検索プラグインのradioボタンが文字で選べない。
  • 【fix】DirectoryIndexに設定されたときの検出に失敗する。
  • 【fix】サブドメインモードかつ https の時、Canonical URL等がおかしい。
  • 【fix】アルバムで、101個以上のファイルを一度にアップロードできない。
  • 【fix】blogid に"te-st"のように不正文字が含まれても正しく表示されてしまう。
  • 【fix】画像がセンタリングや右揃えされない。(Thanks to あさリがいっぱい
  • 【fix】システムinfoモジュールの時間表示が不正確。
  • 【fix/入力記法】calc記法の変数領域が、CGIキャッシュ環境において分離されてしまう。(Thanks to nomura
  • 【fix/Markdown】リストブロックの処理に問題があった。(Thanks to epg
  • 【fix/Markdown】<p>で段落ブロックを切り出す際、余計なブランク行を挿入していた。
  • 【fix/Markdown】フィルター記法などのさつきタグが、正しく動作しない。(Thanks to nomura
  • 【fix/mod_perl】adiary.mod.cgi が起動できない。
  • 【fix/アルバム】フォルダを3個連続で作ると動作がおかしくなる。
  • 【fix/TagEscpae.pm】すべての属性で「xxx:」といった文字列が書けなくなっていた。*3
  • 他多数

*1 : ほぼ使われてないようですし、実装にややこしい問題があるので削除しました。

*2 : 本家非準拠の動作ですが、この方が使いやすいと思うので影響の少ない範囲で変更しました。問題がある場合は skel/parser/markdown.html を skel.local/parser/markdown.html にコピーして編集してください。

*3 : これによりstyle属性にCSSを書くことが困難になっていた。