mieki256's diary



2014/12/05(金) [n年前の日記]

#1 [dxruby] DXRubyと絵文字

気づいたら _DXRuby Advent Calendar 2014 の予定が全部埋まってたので、なんだか一安心。埋まってくれて良かったです。

…実は、万が一全部埋まらなかったら、こういうしょーもない記事でも押し込んでしまおうかしら、空いてるよりはマシだろう、などと思ってチビリチビリと書いてたのでした。せっかく書いたことだし、ちょっともったいないから、こうして一応公開。と言っても、内容は _2014/03/29の日記 の焼き直しなので(´・ω・`)なのですけど。

DXRubyと絵文字 :

DXRubyを使ってサンプルスクリプトを書く時、こんな感じで書くわけですけど。

_sample1.rb
require 'dxruby'

img0 = Image.new(96,96, C_RED)
img1 = Image.new(96,96, C_CYAN)

Window.loop do
  break if Input.keyPush?(K_ESCAPE)
  Window.draw(160, 120, img0)
  Window.draw(320, 160, img1)
end
emoji_ss1.png

「なんだかちょっと寂しいなあ…」と思うわけですよ。それに、画像の向きも分からないから、回転させてもどっち向いてるかよく分からなくて、動作確認用としても少し困るし。

そこで、最初のあたりをちょっと書き換えてみたりして。

_sample2.rb.txt
img0 = Image.new(96,96, C_RED)
img1 = Image.new(96,96, C_CYAN)

# ↓

img0 = Image.new(96, 96).drawFontEx(0, 0, "\u017d", Font.new(96, "Webdings"), :color => C_RED)
img1 = Image.new(96, 96).drawFontEx(0, 0, "\u004d", Font.new(96, "Wingdings"), :color => C_CYAN)

emoji_ss2.png

ちょっとは楽しそうな見た目になったかな? え? 相変わらず寂しい? いやいや、四角だけよりはマシでしょう…と思うんだけど。

てなわけで、この記事は終わりです。以上!

補足情報。 :

ダラダラ続けます。

上のソレ、やってることは、Image.new() で画像を作った直後に、.drawFontEx() で「絵文字」を描いてるだけです。
img0 = Image.new(96, 96).drawFontEx(0, 0, "\u017d", Font.new(96, "Webdings"), :color => C_RED)
「"\u017d"」てのは、「Unicodeで何番目の文字か」を指定してます。ここを変えれば違う絵文字を選べるわけですな。Ruby 1.9 以降ならこの書き方ができるそうです。

また、Windows には最初から、以下の絵文字フォントが入ってますので、これらのフォント名を指定すれば絵文字が使えます。
  • "Wingdings"
  • "Wingdings 2"
  • "Wingdings 3"
  • "Webdings"
  • "MS ゴシック"
「MS ゴシック」も、ところどころに絵文字がある(U+2500あたりに並んでる)ので書いておきました。

どんな絵文字があるかは、 _IMEパッド を開いて確認することができます。

しかしですね。仕組みを説明するサンプルスクリプトの類なら、ソースをパッと見で何をやってるか分かりやすくしないといけないので、こういう余計(?)な小技を使うのもどうかと思うわけですよ。なので、こういうソレは実際には使わんだろうなと。

でもまあ、それでも、「見た目をもうちょっとどうにかしたいよなあ」「だけど画像を添付するのもアレだなあ」「ドット絵を描くのも面倒だなあ」てなときには使えるかもしれません。

補足情報その2。 :

「〜なときには使えるかもしれません」と書いてみたものの。「ホントに使えるのかよ?」と不安になってきたのでした。

そこで試しに、絵文字だけでミニゲームっぽいものも書いてみました。

  • プレイヤーキャラをカーソルキーの左右で動かして、ドクロマーク以外を取るミニゲームです。
  • ドクロに当たると点数が0点になってしまいます。
  • クソゲーです。クソゲーです。大事なことなので2回言いました。
_sample3_game.rb.txt
emoji_game_ss.gif

うむ。見た目は悪くないんじゃないかな。

ちなみに、これが四角になると…。

emoji_game_ss2.png

…アレ? これはこれでアリなんじゃ…。アレレ? まあ、判断は読者に委ねます。と、お茶を濁したりして。

DXRubyとLigature Symbols :

絵文字を出す時、指定が分かりづらいですね。「"\u017d" とか書かれても、何が出てくるのかわかんねえよ!」と言われそうです。

もしかすると、Ligature Symbols フォントを使えば、そのあたり少しは解決するかもしれません。

_Ligature Symbols
_【レビュー】キーワードをタイプすることで印字可能な絵文字フォント「Ligature Symbols」 - 窓の杜

どういうフォントかというと、「mail」と書けばメールの絵文字が出てくる不思議な(?)フォントです。

DXRubyでも使えるか実験してみました。

_sample4_ligaturesymbols.rb.txt
# LigatureSymbolsフォントをDXRubyで表示できるかテスト

require 'dxruby'

# カレントフォルダに置いたttfを一時的にインストール
Font.install("./LigatureSymbols-2.11.ttf")

fnt = Font.new(72, "LigatureSymbols")
sz = 72 + 4

Window.loop do
  break if Input.keyPush?(K_ESCAPE)

  chrlist = [
    "mail", "delete", "clear", "camera", "image", "playmedia", "bell",
    "color", "light", "dark", "keyboard", "time", "car", "bus",
    "grab", "setting", "wink", "smile", "trouble", "surprise",
    "man", "woman", "game", "home", "heart", "heartempty",
    "gift", "umbrella", "android", "apple", "github",
    "aim", "chrome"
  ]

  x, y = 4, 4
  chrlist.each do |s|
    Window.drawFont(x, y, s, fnt)
    x += sz
    if x > Window.width - sz
      x = 4
      y += sz
    end
  end
end

emoji_ss5.png

単語をずらずらと drawFont() に渡してますが、表示されているのは絵文字ですね。うむ。表示できるようですよ。

ただ、Ligature Symbols フォントの ttf ファイルを、スクリプトに同梱しないといけないのがアレですね。「画像を同梱したほうが確実だし早いだろ…」と言われそうですなあ…。

でもまあ、ファイルサイズについてはメリットがありそうです。Ligature Symbols フォントの ttfファイルは、たったの 81.4KByte。これっぽっちのファイルサイズで、色んな画像が出せるわけで。

あくまで夢想レベルですが…DXRubyに標準で画像を内包させる、なんて話になった時は、こういう方法でデータを持っておくのも手かもしれないよなあ、てなことをチラリと思ったりもします。元がベクターデータだから、得られる画像サイズは自由自在だし。データファイルサイズも少なくて済むし。利用時は、意味が分かる単語を指定できるので、ソースも分かりやすくなるし。

多色化できないのが難点ですけど(木亥火暴)

今回使ったスクリプト・フォントファイル :

今回使ったスクリプトやフォントファイルの一式を以下に置いておきます。

_font_disp_unicode_20141205.zip

スクリプトは Public Domain。フォントファイルは各フォントのライセンスに従う、ということで。common_icons.ttf、LigatureSymbols-2.11.ttf、どちらもOFL(SIL Open Font License)のはずです。

2014/12/06追記。 :

DXRubyの作者様が、このお遊び(?)について興味深いお話をされてましたので、せっかくですから引用させていただきます。

Image#draw_exで描画してるから1.4.1でも動いてるけど、これがWindow.draw_fontで描画してたら"\u017d"が描画エラーになるという困った問題がある。

mirichiさんはTwitterを使っています より

Window.draw_fontでエラーになるのはSJISに存在しないコードだからであり、基本的には内部SJISなので色々と問題がある。1.5devではIME対応のついでに内部UNICODE化したのでこれが動くようになっている。はず。

mirichiさんはTwitterを使っています より

じゃあなんでImage#draw_exは動くのかというと、1文字ずつフォントのグリフを取得する処理を簡単にするためにここだけUNICODEに変換してるからなのだな。Window.draw_font以外はこの処理が入ってるので動く。

mirichiさんはTwitterを使っています より


マジすか。手元でも早速試してみたところ…。
require 'dxruby'

fntwebdings = Font.new(96, "Webdings")

Window.loop do
  Window.drawFont(10, 10, "\u017d", fntwebdings)
end
> ruby sample2_b.rb
sample2_b.rb:8:in `encode': U+017D from UTF-8 to Windows-31J (Encoding::UndefinedConversionError)
        from sample2_b.rb:8:in `drawFont'
        from sample2_b.rb:8:in `block in <main>'
        from sample2_b.rb:7:in `loop'
        from sample2_b.rb:7:in `<main>'
ホントだ。Window.drawFont() でコレをすると、エラーになるのか…。自分、「毎フレーム文字書いてたら遅くなるやろ。ここは画像にしておくべし」的に何も考えずやってたけど、エラーを回避するルートを偶然選んでいたのですな。

そして、驚愕の事実が。
UNICODEの合字に対応した覚えは無いのでLigature Symbolsが使えるとは思えないのだが、はて、なんでWindow.draw_fontで描画できてるんだろう。

mirichiさんはTwitterを使っています より

( ゚д゚) エエー

何故動いてるんだ、コレ…。まあ、DXRubyの七不思議の一つ、てことにしちゃ…ダメですかね…。

ちなみに、Windows7 x64 上で、GIMP、メモ帳、Paint.NET は Ligature Symbols が使えてますが、LibreOffice、Inkscape、Word 2003、Word 2007 では使えないので、たしかにアプリによって、合字フォントへの対応・未対応が違うようです。OSが全てイイ感じにやってくれるわけではない、ってことなのかしら。

DXRuby の場合、DirectX がイイ感じにそのへんやってくれてるとか? と思って「directx 合字」「directx ligature」でググってみたけど何が何やら。うむ。七不思議です。

#2 [pc][web] @wikiからGoogle Sitesへ引っ越し

やはりどう考えても、@wikiの、コンテンツの上に広告が表示されてしまうこの状態はマズいよなあと思えてきて。別サービスにコンテンツを引っ越すことに。

そういえば Google も Wikiっぽいサービスをやってなかったっけ…。と思ってググってみたら、 _Googleサイト(Google Sites) なるサービスがあるそうで。入門サイトを眺めながら少し触ってみたら、これでもイケそうな気がしてきたので、引っ越し作業開始。

ということで、 _https://sites.google.com/site/mieki256wiki/ にコンテンツを移動しておきました。

ページ数が少ないからどうにかなったけど、山のようにページがあったら諦めてたかも。

Googleサイトの気に入らないところ。 :

ことあるごと本名を表示しようとしてくる。困った。ファイルをアップロードすると誰がアップしたのか本名を表示。更新履歴も本名を表示。世界中の誰でも見れる場所で本名表示。これは酷い。

いやまあ、どうせ自分の本名なんて、大昔に関わったアレコレで出ちゃってるので今更なところもあるのですけど。にしても、自分自身が本名出そうかなあと思って出すのと、他人から「本名を出せ! 何が何でも出せ!」と強制されるのでは、後者はどうも気に障るというか。自分、学生時代からこのPN・HNを使ってるので思い入れあるんですよ。PN・HNを使わせてくれてもいいじゃんよ。

このあたり、Google+を普及させるべく無茶してた頃の仕様がそのまま残ってるのかしら。あるいは、本来は企業向けのサービスで…てのもおかしいか。外部に対して社内の人達の本名をなんでかんで公開するってのも変な話だよなあ。公開範囲を設定できなきゃおかしいだろう、てな気もする。

さておき。@wikiに比べると機能が少なくて。例えばソースコードの色付け表示機能が無いあたりもちょっと。

もっとも、「ソースコードを公開したいなら GitHub 使えや」と言われそうな気もするし。あるいは、「そういうのは Qiita でいいじゃん」てな気もするし。Googleサイト上でソースコードを貼っておきたい、という自分の要望はちとおかしいかも。

@wikiの気に入らないところ。 :

引っ越し作業をしてみて、@wikiは操作が面倒だなと。

例えば、ページにアップロードした画像ファイルを削除しようとしたとき、1つ1つ手作業で削除していかないといけない。しかも、毎回「削除しますか?」と尋ねてくる。まとめてチェックを入れて、問い合わせもせずに一気に削除してくれる機能は無いのかな。削除を押す → 問い合わせページ → 削除終了表示 → リストに戻ってまた削除を押す、を繰り返すのはゲンナリ。

これが Googleサイトだと、ファイルリストの横の×ボタンを押していくだけで削除予約が入ってじわじわと削除されていく。技術力の違いなのか、それとも、一々お伺いを立てて念押しして責任回避する日本文化と、指示された途端に実行すべきだろうと考える欧米文化の違いなのか。どうなんだろう。

また、画像ファイルをDLしようとしても、ファイル名が全て同じになってしまうあたりも気になった。倉庫として使われることを防止する目的でもあったのだろうか。この仕様だと、バックアップを取るのが大変なんだけどなあ。

Googleサイト上でソースコードの色分け表示。 :

ググってみたら手はあるようで。
  1. Googleサイト上でテキストボックスを挿入。
  2. HTML編集モードに切り替え。
  3. ソースコードを色分け表示するhtmlを、その手のツールで生成してコピー。
  4. 貼り付け。
ソースコードを色分け表示したhtmlを生成するあたりは、 _Highlight を使ってみたり。ありがたや。

_こんな感じ になった。なんとかなったっぽい。

_黒点観測記: google sitesにソースコードを貼る が参考になりました。ありがたや。

Googleサイトの更新履歴を非表示に。 :

デフォルト設定だと、更新履歴ページを一般の方も閲覧できるので、つまりはそこで、誰が更新したかを本名で見れてしまうのだけど。

「サイトを管理」のページで、「アクセスの設定」→ 「更新履歴にアクセスできるユーザー」「変更履歴にアクセスできるユーザー」を「共同編集者のみ」にすれば、一般には更新履歴が表示されない状態になるようで。これで誤魔化すしかないか…。

以上、1 日分です。

過去ログ表示

Prev - 2014/12 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project