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

2015/11/07(土)タグを整理しました

  • このブログのタグを整理しました。
  • 一部の古い記事を削除しました。

adiary3になって1つの記事に複数のタグを付けられるようになったのですが、adiaryには昔から階層化タグ機能がありますので、この2つの機能をどう使うのが一番スマートなのかと悩みまくりです。そして「adiary::お知らせ」タグを残しておく意味があるのかまだ考えてます(苦笑)

そういえば、adiaryユーザ会のえらい人によるとC89うかったらしいです。

2015/07/22(水)adiary Version3.0 RC1公開情報

リリース候補版です。ダウンロードはこちらから

Ver3.0 RC1の主な変更点

  • テーマが12種類に増えました。
  • テーマ開発マニュアルをまとめました。
  • Facebook OGP/Twitter Cardsに対応しました。
  • はてなブックマーク等のソーシャルボタンの表示を高速化しました。

他はバグ修正および全体的な詰め修正という感じです。だいぶ洗練されてきましたが、もっと煮詰めてからリリースということにしたいと思います。

リリース前にどんどんテストしていただけると助かります。要望もどしどしお寄せください。

RC1の変更点

  • テーマが12種類に増えました。*1
  • テーマ開発マニュアルをまとめました。
  • Facebook OGP/Twitter Cardsに対応しました。*2
  • アップグレード処理が必要な時、自動的にメンテナンスモードに変更するようにしました。
  • ログイン時のIP/HOST制限機能が付きました。
  • コメント欄のロボットSPAM対策を強化しました。*3
  • コメント欄でタブや空白が有効になりました。&等の実体参照が無効になりました。
  • コメント本文の加工処理をJavaScript側に変更しました。
  • コンテンツタイプで検索できるようになりました。
  • タグなし記事を検索できるようになりました。
  • タグや記事タイトル中の&をエスケープするようにしました。
  • 検索のデフォルトを「全文」に変更しました。
  • 記事一覧とコメント一覧画面でソートできるようになりました。
  • 記事一覧画面に記事種類を出力するようにしました。(Thanks to 手石
  • 最近の記事一覧と過去ログに、コンテンツを含めない設定を追加しました。(Thanks to 手石)
  • 印刷用リンクを別ページで開く設定ができるようにしました。(Thanks to 手石)
  • コメント欄に>等の実体参照文字列を書き込んだ時、そのまま表示されるように変更しました。(Thanks to 手石)
  • respond.jsからcss3-mediaqueries.jsに変更しました。
  • シンタックスハイライトのテーマを変更しました。またhighlight.jsのロード方法も変更しました。
  • 記法タグでの「google」や「wikipedia」のリンク先をhttpsに変更しました。GoogleのリンクQueryも少し変更しました。
  • はてなブックマーク等のソーシャルボタンの表示を高速化しました。
  • 【テーマ】配色カスタマイズ画面で、色を濃くしたり明るくしたりできるようにしました。*4
  • 【テーマ】オプションによる配置変更などが実現可能な機能をつけました。*5
  • 【テーマ】あらゆる出力から<input type="submit">, <input type="button">を廃止しました。
  • 【テーマ】satsuki2系テーマで、サイドバーサイズを固定にしました。
  • 【テーマ】CSSでの #hatena-body の高さ自動設定機能に min-height が効くようになりました。
  • 【テーマ】テーマの表示テスト画面を作りました。
  • 【テーマ】テーマの配色可変対応をより作りやすくしました。
  • 【テーマ】色々と問題の多い「JavaScriptによるBox高さの自動調整」をやめました。
  • 【fix】テーマ配色のリセット後、HSVバーを動かすと色基準が「現在のテーマ設定値」になっていた。
  • 【fix】adiary形式でexportするとき、入力テキストに「<」などの実体参照が正しくエスケープされていなかった。*6
  • 【fix】Version2からの移行ツール使用時、コンテンツのツリー構造がうまく引き継げない。
  • 【fix】pkey保存インポートをすると、コンテンツツリーを復元できない。
  • 【fix】その他の設定に、謎のデザインモジュール再インストールボタンがあった。
  • 【fix】行連結記法が使えない。*7
  • 【fix】たまにタグ一覧やコンテンツ一覧でキャッシュされた情報を読み込んでしまう。
  • 【fix】Markdown記法でインラインのソースコード記述で、<, >, &がうまくエスケープされない。(Thanks to 手石])
  • 【fix】Perl 5.20でMySQL, PostgreSQL運用時、データベースに格納される文字列が通常のUTF8文字列にならない。(問題の詳細
  • 【fix】コメントが許可されていない FrontPage がある状態でデザイン編集を保存すると、コメント投稿フォームが消える。
  • 【fix】コメントメール通知プラグインが動かなくなっていた。
  • 【fix】ブラウザ上で「横320px」のスマートフォン(iPhone 5等)でスマホメニューの表示が崩れる。(Thanks to 阿部
  • 【fix】コメント番号が書き込み順にならないことがある。β初期からあるバグでした……。
  • 【fix】プライベートモード切替時、テーマのカスタマイズが無効になっていた。
  • 【fix】スマホ表示でブログ設定などのフォームがはみ出していた。
  • 【fix】さつき記法で、2行以上の「th(thead)」に対応していなかった。
  • 【fix】さつき記法で、Ver2形式の image タグを記述したとき、alt属性がうまく設定されていなかった。
  • 【fix】タグエスケープ機能で「alt=""」や「alt=xxx」といった空の値やクオートされていない値の処理が誤っていた。
  • 【fix】Twitterウィジットプラグインで幅調整ができなかった。
  • 他多数

*1 : 今回の更新で大半の時間を要しました。協力者求むだったのですが、結局一人作業になりましてとても疲れました(苦笑)。なんかいいテーマできたらどんどん公開してください。

*2 : デバッグが十分ではないので他の方にお任せ。なお通常ブラウザアクセス時はOGP等を出力しないようになっています。

*3 : JavaScriptを解釈するロボットSPAMが出たとしても大丈夫だと思います。不可能ではないものの、かなり投稿しにくくなっています。

*4 : 色を薄くまたは暗くしかできなかったという(苦笑)

*5 : satsuki-multisideといったフォルダ(テーマ)を作らなくて済むようになりました。

*6 : Version2時代からあったバグのようですのでたぶんずっと最初から……。

*7 : β3直後に完全にエンバグしてました。必要処理をなぜか1行削除するというコピペ操作ミスだと思われます、恥ずかしい(汗)

既知の不具合

  • nature-darkテーマを選択時エラーが出る(使用には問題なし)。
  • Twitterウィジェットで表示設定が反映されないことがある(Twitter側の仕様変更によるものでしたが、現在は治まっています)。
  • trust_mode時、スマホメニューが設定できない。
  • info/textparser_site_tags.txt を設置しても読み込まない。
  • 11/20以降、ツイート数が取得できない(Twitter社の仕様変更です)

2015/05/22(金)Version 2.28dリリース情報

Version2系のダウンロードはこちらから

Ver2.28c→Ver2.28dの変更点

  • コメントのロボットSPAM避けルーチンが、Perl 5.20で完全に死んでたいたので修正しました。
  • adiary形式/はてな形式でexportするとき、&lt;等の実体参照があると正しくエスケープされない不具合を修正しました。

過去の変更点

Version2.00(β含む)以降からの乗り換え

  • Ver2.11以前の場合、uploader.conf.cgi をサンプルから再生成してください。

アップデート方法の参考情報。

2015/05/20(水)Perl DBI と UTF8フラグ と 文字化け問題

Perl 5.20にしたら、DBIが何やら不可解な動作をするようになりました。

問題の原因

どうやら UTF8 を扱う機能が増えたみたいです。DBIの接続時のパラメーターにこんなものが増えています。

pg_enable_utf8 => 1 , # 結果をUTF8フラグ付きにする(PostgreSQL)

mysql_enable_utf8 => 1 , # 結果をUTF8フラグ付きにする(MySQL)

PerlのDBIモジュールで自動的にUTF8フラグを付ける

この影響で、PostgreSQL運用のシステムを Perl 5.14 から 5.20 にアップグレードしたところ文字化け発生。また厄介なことをしてくれたものです(汗)

保存されいてる文字コードがおかしい

普通に使っているのに「Wide character in print at」の警告がなぜか出まくります。日本語UTF-8として保存した文字列が文字化けしまくるのですが、そのデータだけ単独に取り出して表示しても化けない。

色々調べてみると以下のことがわかりました。

  • 新DBD は(utf8フラグのついていない)文字列を DB に保存するとき「ASCII文字列に特殊な文字が混ざってる」と解釈してエスケープ処理を行う。
  • この文字列は、通常の utf8 文字列ではないので、データベースの中身を直接覗くと、保存した文字列ではなく特殊なエスケープ文字列として表示される。

PostgreSQLではこんな感じです。

  • 文字列「あいう」を保存。バイナリ列で「E3 83 86 E3 82 B9 E3 83 88」
  • psqlコンソールで表示される文字列「a\u0083\u0086a\u00821a\u0083\u0088」
  • DBI経由で取り出し、utf8フラグを取り除いた文字列「C3 A3 C2 83 C2 86 C3 A3 C2 82 C2 B9 C3 A3 C2 83 C2 88」

同じUTF8文字列でありながら、違う内部表現になっています。当然、元の「あいう」と文字列比較を行うと異なると判定されます。

MySQLではこんな感じです。

  • mysqlコンソールで出力される文字列「C3 A3 C2 81 E2 80 9A C3 A3 C2 81 E2 80 9E C3 A3 C2 81 E2 80 A0」
  • DBI経由で取り出した文字列は utf8フラグ がついていない元の文字列。

問題を整理すると2つに集約できます。

  • DBにきちんとしたUTF8文字列として保存されない。
  • DBに一回保存することで、内部表現の異なる UTF-8 文字列が生成されてしまう(PostgreSQL)。

後者も問題と言えば問題ですが、前者はとても気持ち悪い問題です。

解決策

utf8フラグはうまく使えば「Perlによきに計らってもらい」文字コードの問題が楽になるものですが、utf8文字列をutf8として「そのまま扱いたい」時には問題が多すぎる仕組みです。入出力の都度にencode、decodeが発生し処理を重くする原因にもなります。

またutf8フラグありとフラグなしのUTF8文字列が混在すると、それらを連結したときに文字化けする危険があります。

そうなるとutf8フラグなしで扱いたいのですが、そうするためにはどうしたらいいのでしょうか。

DBD::Pg編

  • utf8フラグを付けた文字列を保存すれば、そのままutf8文字列としてDBに保存される。
  • utf8フラグのない文字列は、必要に応じて特殊エンコードされてDBに保存される。
  • 「pg_enable_utf8」を設定しないとき。
    • 非ASCII文字列や、特殊エンコードされた文字列は utf8 フラグが付いて取り出される。
  • 「pg_enable_utf8 => 1」のとき。
    • 「pg_enable_utf8」を設定しないときと同様。
  • 「pg_enable_utf8 => 0」のとき。
    • いかなる場合も utf8 フラグは付けなくなる。
    • 特殊エンコードされた文字列は文字化けする。

取り出す時用に「pg_enable_utf8 => 0」を設定して、保存時や「検索時」にutf8フラグを付けるのがよさそうです。

DBD::MySQL

  • DB保存時はutf8フラグの有無はすべて無視する(動作は変化しない)。
  • 「mysql_enable_utf8」を設定しないとき。
    • いかなる場合もutf8フラグは付かない。
    • 非ASCII文字列は特殊エンコードされたDBに保存される。
    • 特殊エンコード文字列は、通常の utf8 文字列で取り出される。
    • DBに格納されている通常の utf8 文字列は、エンコード失敗の「?」に置換されDBから取り出される。
  • 「mysql_enable_utf8 => 0」のとき。
    • 「mysql_enable_utf8」を設定しないときと同様。
  • 「mysql_enable_utf8 => 1」のとき。
    • utf8文字列は、通常の utf8 文字列としてDBに保存される。
    • 非ASCII文字列は utf8 フラグが付いて取り出される。
    • 特殊エンコードされた文字列は文字化けする。

DBD::Pgとは実装がまるで違う事がわかります。

ドキュメントを読んだところ「SET NAMES utf8;」というSQL文を発行することで、同じ効果を得て、かつutf8フラグに影響がでないことがわかりました。ただこの状態では、特殊エンコードされた文字列を読み込むときに文字化けするので注意が必要です。

比べると

DBD::Pgの実装のほうが謎かもしれない。DBD::Pgはトランザクション処理がおかしいという素敵な実績があるからなあ……。「pg_enable_utf8 => 0」のとき保存データのutf8フラグも無視しないと矛盾するのはすぐに分かりそうなもんなんだけど。

DBIの仕様

Perl supports two kinds of strings: Unicode (utf8 internally) and non-Unicode (defaults to iso-8859-1 if forced to assume an encoding). Drivers should accept both kinds of strings and, if required, convert them to the character set of the database being used. Similarly, when fetching from the database character data that isn't iso-8859-1 the driver should convert it into utf8.

http://search.cpan.org/~timb/DBI-1.633/DBI.pm

Perl は Unicode(内部表現utf8)と 非Unicode(iso-8859-1)の2つの文字コードをサポートします。DBDドライバはこの2つの文字コードを受け付けるべきで、必要に応じて database で使用可能な文字列に変換する必要があります。

同様に、iso-8859-1ではない文字列は database から取り出す段階でutf8に変換すべきです。

まとめ

  • 今どき文字コード問題、しかも UTF8 で悩むとは思わなかった。
  • 1byte文字圏の UTF8 実装は相変わらずクソ。

2015/05/16(土)adiary Version3.0β6公開情報

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

Ver3.0β6の主な変更点

  • スマホ表示を改善し、投稿や管理も十分行えるようにしました。
  • 記事編集画面を洗練させました。
  • Markdown記法をGFM準拠で拡張し、また非互換動作を改善しました。
  • テーマが少し増えました。

本当はRC1の予定だったのですが、ゴールデウィークにがんばった影響か、あまりにも変更点が積み重なってきたのでひっそりβ公開しておきます。もう仕様変更することはないと思いたい……。

β6.1の変更点

「PostgreSQL/MySQL + Perl 5.20」での運用時にDBに保存される文字列がUTF8にならない(サイズが増える)という問題が見つかったため対応しました。

β6以前で該当環境で運用していてる方は、ブログのデータを一度エクスポートした上で、アップグレード後に再度インポートしなおしてください。

Ver3.0β6の更新情報

  • フッターの出力位置を変更しました
  • 記事編集画面から直接画像をアップロードできるようになりました。
  • 記事編集画面の入力部分にドラッグ&ドロップしてファイルをアップロードできるようになりました。
  • 記事編集画面を洗練させました。
  • FrontPage(固定トップページ)の時、記事タイトルをヘッダ出力しないように変更しました。
  • システムモード非対応テーマを管理画面で使用しようとする時、警告を表示するようにした。
  • 表示パスワード機能やメンテナンスモードでの画面に、適切なHTTPステータスコードを設定した。
  • スマホ判別に、BlackBerry と Windows Phone を加えました。
  • コメント表示数の設定項目がなかったので修正。
  • FrontPageのタイトル設定機能を追加。
  • テーマを書きやすくするため、HTMLの出力構造を微修正しました。
  • タグの編集、コンテンツ一覧の編集画面を少し使いやすくしました。
  • HTML全体から「&nsbp;」を除去しました。
  • 検索結果画面の印刷表示ができるようになりました。(Thanks to 手石
  • 【テーマ】base.cssを import させる仕様をやめました。*1
  • 【スマホ】記事編集を使いやすくしました。
  • 【スマホ】画像アルバムを使いやすくしました。
  • 【スマホ】システム画面の各所でスマホ用に表示を改善しました。
  • 【スマホ】ドラッグ&ドロップエミュレーションを付けました(詳細
  • 【スマホ】ヘッダに選択したメニューを出力できるようにしました。
  • 【スマホ】ヘッダに検索ボックスを出力するようにしました。
  • 【Markdown】GitHub Flavored Markdownのテーブル記法等に対応しました。
  • 【Markdown】自動リンクをonにした場合、自動リンクするように変更しました。
  • 【Markdown】本家では、コードブロックの開始条件として手前が空行である必要があったので、その仕様に準拠しました。
  • 【Markdown】本家では、コードブロックの途中に空行を挟んでもokだったので、その仕様に準拠しました。
  • 【Markdown】【fix】HTMLブロック開始条件が間違っていた(行頭スペースを許可していた)。
  • 【Markdown】【fix】HTMLブロックの後ろに余計な空行が付いてしまう。
  • 【Markdown】【fix】文中に>等の記号があったときのエスケープ処理が正しくなかった。
  • 【Markdown】【fix】Satsuki.pmの目次記法の内部仕様変更に追従していなかった。
  • 【parser】見出し記法で、アンカーが存在しないときは<span class="sanchor">を出力しないようにしました。*2
  • 【design】全体の背景画像を設定できるように変更。
  • 【design】ヘッダ用の「ブログの説明」プラグインを追加。
  • 【design】ブログ情報で参照するRSSアイコンを作り直しました。またRSSにリンクするよう変更しました。
  • 【記法】HTML5準拠のためtable記法のsummary指定を無効にしました。
  • 【fix】デフォルトブログ設定時のサイドバーなどURLが正しく書き換わってなかった。(Thanks to 手石
  • 【fix】ヘッダ部のmargin/padding設定が有効ではなかった。
  • 【fix】ヘッダのタイトル文字位置がブログ表示時とデザイン編集時で異なる。
  • 【fix】コンテンツリスト(ドロップダウンメニュー)で1段目の項目が1つしかない時、メニューを左に開いてしまう。
  • 【fix】コンテンツリスト等の多重配置可能なモジュールがあったとき、プラグイン再インストールでエラーが起きることがある。
  • 【fix】ドロップダウンメニューの項目幅を増やした直後、編集画面で項目が2行に表示されてしまう。
  • 【fix】スマホからデザインモジュールの再インストールを行うとヘッダのHTMLが壊れる。
  • 【fix】des_system-info のコメントの文字コードが間違っていた。
  • 【fix】印刷用表示で FrontPage 機能が動作していなかった。
  • 【fix】印刷用テーマ satsuki2/_print においてデザイン編集の設定を解除していなかった。
  • 【fix】Version1からデータ移行時に、サムネイルディレクトリがうまく移行されない。
  • 【fix】多重編集ロック機能で、編集キャンセル時にもロックしてしまう。
  • 【fix】trust_modeで複数行を含むscript(タグ)の抽出ができていなかった。
  • 【fix】静的HTML出力(エクスポート)が更新から取り残されて完全に腐ってたので修正。*3
  • 【fix】Version2からの移行ツールでトラックバックが取り込めなかった。
  • 【fix】MySQLで動作しなくなっていた。
  • 【fix】【Compiler】begin_array/string等で最終行が空の時、除去するようにしました。
  • テーマが少し増えました。
  • 他多数

*1 : ファイルの場所も移動しました。importはCSS読み込み速度の面からも不利だと思われます。

*2 : テーマのCSS書いてて邪魔でしょうがなかった(苦笑)

*3 : おそらく自分以外誰も使ってませんが(苦笑)

OK キャンセル 確認 その他