/ 最近 .rdf 追記 設定 本棚

脳log[2013-05-14~]



2013年05月14日 (火) enchantMOON発売延期。誕生日ごろに出荷できる見通しだって(誕生日は年に一回しかないから再延期されるともう慰めが見つからないよ)。


2013年05月13日 (月) ソニーが3週間バッテリーがもつA4サイズ「デジタルペーパー」端末を開発、2013年度内に商品化を目指すことに - GIGAZINE」■でも読書端末ではない。PDFが読めるからそういう用途にも使えるだろうが未読管理が面倒。解像度4倍で一冊あたりのファイルサイズが4倍(※スキャン画像(JPEG)を束ねたPDFの話。テキストベースのファイルは別)。40GBの4倍で160GBは現時点で確実に必要。未読の PDFだけ放り込んで読み終えしだい削除する使い方になるだろうな。ありかもしれない。PRS-650向けと合わせて2種類の最適化 PDFを作成する手間は……1200×1600の解像度があれば最適化は不要かもしれない。であれば、zipで固めた jpegを読む機能が欲しい。35000円まででどうかな? 20000円だととりあえず保護しておくレベル。■業務用?じゃあ値段は期待できないか。


2013年05月12日 (日) [SakuraEditor]「Sakura Editor / PatchUnicode / #480 strlen系と0の比較をやめる」■少なくとも二人の目をすりぬけたミスの、もともとの記述(ifの条件の一部分)はこういうもの。「!_tcslen(macrorec.m_szName)」■まず、intと boolを同一視してるのが古い。しかも否定! 21世紀にこれはない。空であるかを調べるのに文字列を末尾のターミネータまでたどるのも耐え難い(これがパッチの目的)。Rubyの文字列には empty?メソッドがあって、なんで? 0==string.lengthでいいやん?と最初は思ってたんだけど、Cのように原始的な文字配列しかサポートしてない言語にこそ empty述語が必要なのだった。ということに気付いたのは Rubyが emptyという語彙を与えてくれていたおかげ。■C#には途中から IsNullOrEmptyメソッドが追加されてるし、Rails方面では blank?メソッドが追加される。blank = nil or empty. ■ tcsisempty関数を作るというのは?szisemptyという名前で char*版 wchar_t*版のオーバーロード関数を用意するのは?


2013年05月11日 (土) 電書の単行本価格ほどあほらしいものはない。再販制度のない電書でそれを利用して再販制度に制約された販売形態の再現をするとか、考え方が逆行してる。ハードカバーみたいな物質的はったりの効かない電書で単行本価格はありえないだろう。■これが無意識に小説にしか当てはまらないと考えている理由は何かと考えてみれば、文庫本が出るかどうかだった。単行本価格っていうのは文庫本価格と比較されて初めて現れる。■単行本と文庫本を同時に発売できない出版社には無理な要求であった。勝手にやってればいいよ。


2013年05月10日 (金) 陣痛促進剤の過剰投与73%…脳性まひ児調査で : 社会 : YOMIURI ONLINE(読売新聞)」■陣痛促進剤とは劇薬なのか風邪薬なのか。■陣痛促進剤が使われて健康に生まれてきた子供のうち、過剰投与が行われていた割合は?■スーパードクターKにオキシトシンとか出てきた。■緊急時に何を優先するかという問題もこの数字の中には含まれてるんでないかな。子供の命。母親の命。指針に絶対服従というのは目の前の現実を見ずに医師生命を最優先にした選択かもしれない。帝王切開も選択肢にあると思うけど。■■■「アルツハイマー患者の脳内、糖尿病と同じ状態に  :日本経済新聞」■遺伝子が変化とか、遺伝子が激減とか、ちょっと意味がわからないです。ヒストンがむにゅむにゅとか発現状態の変化なら自分の乏しい知識に照らして納得する。


2013年05月09日 (木) [SakuraEditor]「https://sourceforge.net/p/sakura-editor/patchunicode/490/#6bce」コメント「(a - b) * alpha /256 + b」■この、片方だけ(この場合b)に立脚した比例計算が苦手だった。バランスが悪いし扱う数字が小さくなるし。今になって祟られるとはね。■それはそうと COLORREF単位で演算したいし、できても良さそうなものだけど、本当にできないんだろうか。ビット演算だけ?


2013年05月08日 (水) Q.なぜスマホにしないの? → ガラケー継続者「お金の問題」「自宅にパソコンあるから不要」」■9こ当てはまりましたー。ホント、スマホいらない。■俺のガラケーは、最低ランクのプラン(+誰でも割で半額)のくせに、無期限くりこしの無料通話がしょっちゅうどっかに消える状態のくせに、毎月2200円ちかくかかるから一概に安いとは言えへんけどな。>20100705p01


2013年05月07日 (火) 思い立ってドンドコドンをやってみた。プレイしていた当時は覚えられなかったコンティニュー倍増コマンドも指先をくるくる動かして覚えられた。いきなり44面到達(全50面。2回目は3X面まで)。コンティニュー6回では35面の分裂なすびまでが限界だったのを思い出した。1面にあった謎のキラキラが裏ステージの入り口だということを初めて知った。思い出補正か知らんけど面白い。そろそろあのアイテムが出るなっていうのが今でもわかる。■■■4回目にしてクリアした。ただし49面で死にすぎたので1回だけステートロードした。■なんか51面始まった。クリボーがメットになるくらいの変化かと思ったらほとんど違うし容赦がなくなってる。76面でゲームオーバー。■■■裏ステージ2回目。86面でゲームオーバー。


2013年05月06日 (月) 昔の榮倉奈々ってぐうかわいかったんやな:キニ速」■PurePure 22の弓持ってるえいくらさんのことな。見下ろされたい。これ>「榮倉 弓道


2013年05月05日 (日) 殻ノ少女2。「虚ノ少女」が発売されていた。■「1st original single “IGNITION” 通販予約5月4日開始!(電気式華憐音楽集団 Official Web Site)」


2013年05月04日 (土) 私の愛するFor文たち (27/42)」■27ページのツッコミどころwww。おいおい -asses-じゃなくて -ecess-だよーと思ってたらすぐ後で -ases-になっていた。ぼろぼろですやん。予測辞書と英和辞典を入れた ATOKを使おうぜ。(内容にも) 関数ポインタ渡しで C++を極めたとか……。無効化されるイテレータ対策は具体的だったのに……。■34ページ。Array.lengthは一番大きい添字+1を返すと思う。この場合 7。(豆知識)添字は文字列化されてArray(連想配列)のキーになるよ。■35ページ。documents.get~。なんで複数形にしたし。


2013年05月02日 (木) 年間10万円浮かす! 食費を節約するためのお買い物ベーシックガイド : ライフハッカー[日本版]」■全部知ってた。ひとつ付け加えるなら、レシートを見返して総額の 3割以上(※具体例として)を単独で占めてたりする品目を見つけ出して意識すること(必要か?代替は?優先順位を他にまわさなくて良いか?)。もうひとつ。空腹の時に食べ物を買わない。■昔はこうだった(20070406p02)けど今は商品を手に取るのと同時に10円単位で加算していってる。■だいたい年寄りの方がきっちりしてるもので、切り捨てによって生じた 1円単位の誤差を指摘してくれたり、手書きのメモで自分でも計算してくれてたりするのは例外なく年寄り(注:スーパーでの話ではない)。■お金の勘定を人任せにせず自分でもやってると「(俺がその人のことを)信用してない」とか言われたりしたけど、信用云々ではなくミスが混じる確率の問題。それに、あなたが封をするところまでやってくれてたら、こんな面倒なことはしていない。途中で引き渡されたから、関わってしまったから、全体を一から自分で確かめる必要が生じるのだ。■やっぱり信用してないのかもね。連帯して責任を負う(=信用する?)ことができないって言ってるんだから。■でもなんで「信用してない」と言われてそれを否定してしまうのかもわかっていて、信用できない主要な要因がその人とは関係のないところ(自分自身)にあって、誰に対しても同じことをするからだ。「(あなたを)信用してないわけではない、誰も信用してないだけだ(そしてそれがお金に関して正しい態度だと思ってる)。」というわけ。


2013年05月01日 (水) spamにこんな URL >http://keisok.sakura.ne.jp/moodle/user/view.php?id=2351■.sakura.ne.jpだから目にとまったんだけど、keisok.sakura.ne.jp自体はたぶん真っ当なサイト。moodleを狙って書き込みを行い、その一見無害な URLをスパムとしてまき散らしてるみたい。他にも /moodle/を含む URLを内容とするスパムが大量にあった。■こういうのは SaaSを利用する圧力になるんかな。自分で管理するより管理されてる方が楽だもんね。それが面白くない。

最終更新: 2013-06-11T17:42+0900

[SakuraEditor] DirectWriteパッチ(by novice123)

https://sourceforge.net/p/sakura-editor/patchunicode/482/

これは期待せざるをえない。でもこれは、何がいけなかったんだろう。

trunk2>svn revert -R .
trunk2>svn up -r 2954
(サクラエディタで trunk2_directwrite.patchを、改行をCRLFに統一して、保存し直し)
trunk2>patch -p0 < trunk2_directwrite.patch
(VS2008EEで sakura/sakura.slnを開く。Release_Unicodeでリビルド)

1.起動してファイルを開いた直後。[EOF]マークが残ってる。日本語文字に半角サイズしか割り当てられてないのはウチの環境のせい(Consolas+Meiryoで GDIが全角文字を半角で描画するせいで全角半角判定(GDI依存)と DirectWriteによる描画が食い違ってる)。

2.スクロールしてまた先頭に戻ってきた。ゴミが残ってる。

3.最小化して復元した。ゴミしかない。

自分でもやってるけど目に見えて遅くなるから@2013-05-26常用はしてない。関連(古い順)>2011042320120201(参考画像豊富)、201202052012070720121018。DirectWriteをハンコにして得られるメリットは縦方向のアンチエイリアスがかけられることかなあ。GDI+ClearTypeでも横方向のサブピクセルレンダリングはやってるから、フォントと OS次第ではそれ以外に差が出ない。サクラエディタではサブピクセル単位での字間調整に意味がないという個別の事情もあるし。


 @2013-05-02 背景画像を指定してみた。


 @2013-05-03 更新パッチ:trunk2_directwrite_a.patch

フォントは相変わらず Consolas+Meiryoなんだけど、日本語にきちんと全角幅が割り当てられてるのが不思議。

曲線を観察するに縦方向のアンチエイリアスがかかってない気がする。それでは Consolas+Meiryo+ClearTypeに比して DirectWriteのアドバンテージがない。

 Postボタンを押す直前に臆病風に吹かれてここに書きますよ。モチベーション大事。

早々に気にすることではないかも知れませんが、この二つの適切な呼び分けは難しくないですか?

HRESULT DWriteContext::SetLOGFONT(const LOGFONTW &logFont, float fontSize);
void    DWriteContext::SetFont   (const LOGFONTW &logFont);

ひょっとして上の2つと下の1つは副作用を伴う一連の不可分な処理を3分割したもので、入れ替えたり飛ばしたりできないものだったりするのでしょうか?

void DWriteContext::SetFont(HFONT hFont, bool bold, bool underline)

それから、DWriteContext::SetFont(HFONT hFont, bool bold, bool underline) の hFontにも太字・下線情報が含まれますが、CEditView_Paint.cppでこのように

HFONT hFont = GetFontset().ChooseFontHandle(false, false);
DWriteContext_SetFont(s_dwc, hFont, info.m_bFatFont, info.m_bUnderLine);

あえて無視する(無視させる)理由についても、想像がつかないもので、知っておきたいと思うのですが、教えてもらえますか?

 @2013-05-13 vim-jpのログを読んでる。

デジャヴを感じるコメントの流れだ。

>DirectWriteで描画したい · Issue #262 · vim-jp/issues · GitHub

そんで、すぐ上の疑問に関して。たぶん novice123さんはここまで読んでいない(手が回っていない)。

koron commented 4 months ago

最新版ではGetObject()を使ってHFONTからLOGFONTを取得することで、必要なときに DWriteContext_SetFont() するように変更しました。合わせて太字と斜体の有無は、DrawTextの引数ではなくフォントの情報を利用するように変更しました。

しっかし、個別問題に対処するパッチがいくつか見られるだけでさっぱりコードの全貌が追いかけられん。リンク切れも多すぎる。


 @2013-05-04 trunk2_directwrite_c.patch

ピクセルジオメトリはダイアログで設定するものでも、できるものでもないと思う。マルチモニタ。デバッグモード?


 @2013-05-13 下線

あんまり PPDとか理解してないけど結果オーライ(※自分の環境限定)で、こんな感じでやってた。(static_cast<int>(f)って int(f)って書けるんかなあ)

  STDMETHODIMP DWGdiTextRenderer::DrawUnderline(
      __maybenull void* clientDrawingContext,
      FLOAT baselineOriginX,
      FLOAT baselineOriginY,
      __in DWRITE_UNDERLINE const* underline,
      IUnknown* clientDrawingEffect
      )
  {
      HDC hdcRT = pRenderTarget_->GetMemoryDC();
      FLOAT ppd = pRenderTarget_->GetPixelsPerDip();
      RECT rcUnderline = {static_cast<int>(baselineOriginX*ppd), static_cast<int>((baselineOriginY+underline->offset)*ppd),
                          static_cast<int>((baselineOriginX+underline->width)*ppd)+1, static_cast<int>((baselineOriginY+underline->offset+underline->thickness)*ppd)+1};
      HBRUSH hBrush = CreateSolidBrush(GetTextColor(hdcRT));

      FillRect(hdcRT, &rcUnderline, hBrush);

      DeleteObject(hBrush);
      return S_OK;
  }

なんでペンでなくブラシなんでしょうねえ。思い出せないからもう一度考えてみると、ペンの場合、線の太さが、始点と終点で示される線分に対してどう影響するのかが不明だったからだろう。線がどのように太るのかが。例えば幅2ピクセルの水平線を引く場合、線の始点・終点の Y座標に大小どちらを指定すべきだろう? その点 RECTで領域を指定して塗りつぶせるブラシは結果がピクセル単位で予想できる。

 @2013-05-16 DPI、DIP。ドットパーインチ、デバイスインディペンデントピクセル。

COMのところの2、3項目しか読んでなかったけど、常識レベルの基礎が身につく良いシリーズだったのだね。DirectWriteの APIドキュメントを読んでると出てくる DIPについても書いてあった。

 @2013-05-17 QueryInterface

DirectWriteのサンプルプログラムがそうで、自分のも同じように AddRefがなかったことに、コメントした後で気付いたんだけど、

ds14050 2013-05-01

QueryInterfaceが正常に返る前に AddRefしておかなくていいのでしょうか?

この疑問に対して同シリーズのこれは無関係ではないのではないか。

hr = pFileOpen->QueryInterface(IID_IFileDialogCustomize, 
    reinterpret_cast<void**>(&pCustom));
if (SUCCEEDED(hr))
{
    // インターフェイスを使用する  (省略)
    // ...

    pCustom->Release();
}
else
{
    // エラーを処理する
}

通常どおり、戻り値 HRESULT をチェックしてメソッドの失敗に備えます。メソッドが成功した場合、ポインターを使用し終えた時点で Release を呼び出す必要があります。詳細については、「オブジェクトの有効期間を管理する」を参照してください。

  1. QueryInterfaceが返す<インターフェイスポインタのコピー>ごとに Releaseが呼ばれる。
  2. QueryInterfaceの呼び出し元は AddRefを呼ばない。
  3. ということは……

あと、キャストせずに thisを代入して返してるけど、どういうキャストの場合に thisが変化するか熟知してない自分には不安なコード。

「QueryInterface キャスト」で検索した。そうそう、こういう懸念、

既に示したQueryInterfaceの問題点は、どのようなインターフェースが渡されてもオブジェクトのアドレスをそのまま返した点です。 このとき、適切なインターフェースでオブジェクトをキャストしていれば、 インターフェースのvptrは適切なvtblを識別するようになります。

サクラエディタで実装する、IDWriteTextRendererを継承した GdiTextRendererに真っ当な QueryInterfaceや、InterlockedIncrement/InterlockedDecrementを使った AddRef/Releaseが必要かといえばいらないんだろうけど(だから動いてる)、ざる実装でも構いはしないんだけど、一見それっぽいのはミスリーディングでよろしくない(問題があるとして、ね)。


 @2013-05-19 _d.patchをベースにしたパッチを投稿したよ。

寝る前の3時間でやっつけた!(つもりになってるだけで返り討ち……とか)。

 @2013-05-20 最初のダメージ

どういう思考をたどったのか、地震(※震源は前住んでたとこだ)に揺れる風呂場で気がついた。まだバージョン管理されていない新ファイル3つがパッチに含まれていなかった。サイズが半分になってるのは小さすぎると思ったんだ。以前指摘されたのと同じミス。

 @2013-05-25 コメントを頂戴しました。

https://sourceforge.net/p/sakura-editor/patchunicode/482/?limit=20#c9f7

 @2013-05-25 trunk2_directwrite_e.patch

無意味な(そう見える@2013-05-27)関数分割(20130501p01.02.01)によって

  1. トラップのようなエントリポイントが生じていること
  2. 分割した関数に同じ名前(オーバーロード)や似た名前を与えていることによって名が体を表していない(似た関数を区別するのに十分な名前を与えていない)こと。
  3. その必要がないのにメンバ関数にすると、関数全体を見渡して thisが大量にもたらす入力パラメータ(※非constメンバ関数の場合は出力パラメータを兼ねる)を見つけ出すのが面倒くさい

という問題に対処した点は汲んでもらえなかったようだ。Cインターフェイスという名の、DWriteContextの opaqueポインタ読み方(ハンドル)を操作する限られた関数群をとっぱらって、DWriteContextクラス自体をモジュールの外へエクスポートしたことで事態はさらに悪化した。

クラスっていうのは内にも外にも過度の依存性/コンテクスト/癒着をもたらすのだなあ。どれだけ良い点、Cからの改善点を並べようと一部のクソのために C++を忌避するという選択は理解できる。

 @2013-05-26 補記。ペンディング。

あ、エクスポートにあたって private化はされてました。トラップは対外的には隠されていたし、呼び出し階層が明確になっていた。でも DirectWrite/DirectX系の定数をモジュールの外から隠せてない。レンダリングパラメータを int, floatと変換関数のセットで再定義してる意味がない。


チケットが pendingされてしまいました。遅いのは vim-jpが DirectWriteをオプション扱いにする理由として挙げていてわかっていたことだし、描画方法と描画先を両方とも GDIから Direct2Dに完全移行できれば改善が期待できるし、遅くても試したい人はいっぱいいたと思うのになあ。


 @2013-05-28 いまさらだけど

互換インターフェイスを C++で定義するならヘッダに書く内容は DWriteContextそのままではなくこんなんになると思う。

class DirectWrite
{
public:
  static DirectWrite* Init();

  DrawText();
  SetFont();
  SetRenderingParam();
  ...
  //< Initと対になる後片付け関数。
private:
  DirectWrite(); // 呼ばせない。代わりに Init().
  //< たぶんコピーコンストラクタも禁止しないといけない。
  //< ポインタメンバがあるので代入演算子も禁止しないといけない。

  struct DataMember;
  DataMember* m;
};

ポリモーフィズムが必要なわけでないしファクトリメソッドの代わりにコンストラクタでもいいのかも。それでもこっそりメンバの追加はできるだろうし。


 @2013-06-11 DirectWrite採用への布石。待望のパッチ

Sakura Editor / PatchUnicode / #588 文字列を一度にExtTextOutで描画する

ただ口を開けて待ってたわけではなかったんだよ(いいわけ)。「ところで、DispTextって文字の数だけ呼ばれるんだけど、こんなんを仮想関数にしても良いものだろうか。9か月前の自分はできるだけ長い GLYPH_RUNを対象にすることで回数を減らそうとしてたみたいだけど(20120201)」と書いていた自分はというと、CEditView_Paint.cppの似たような所をいじるまではやっていて、そこから、どいつにどうやって一挙に文字を書き出させるのが(どこでどこまで決めるのが)いいんだろう?というところで停止していた。

@2013-05-26 もしかしたら違う理由かも。過去の日記を読む限りでは、べらぼうに遅い→まあまあ遅い→まともな速度、と2段の変化があったようで、2段階で改善したことは記憶してなかったから。表示品質があまり変わらなかったのと細かい詰めを放り投げた結果として常用してないのかも。

@2013-05-27 SetFontと SetFontに関しては同じ機能を提供しつつ、LOGFONT版でなく HFONT版を呼んだときには、前回の HFONTとの比較結果次第で以降の処理を省略する意図がありそう。みみっちい。ポインタ/ハンドルを比較してその先の値が同じかどうかわかるかいな。そんな目的のためだけにメンバ変数を増やしますか。しかし、効くのだろうか。自分のパッチでは std::basic_string<TCHAR>を毎回作って lfFaceNameの比較をしていた。手を抜きすぎだとは思う。

読み方 オゥペイクだってさ。オパックだと思ってたよ。思い込みは恐いよ。

本日のツッコミ(全2件) ツッコミを入れる

もかスクリーンショット拝見しました。ExtTextOutのETO_OPAQUEようするに"背景を塗りつぶす"に相当する処..

ds14050背景画像を指定したスクリーンショットもとってみました。確かに仰るとおりでした。(novice123さんが背景画像を指..