mieki256's diary



2012/09/01() [n年前の日記]

#1 [python] Pythonを勉強し直し中

どうして Python には、goto と switch - case が無いんだろう。Python のことだから、そこには何か思想があるはずだけど、検索してもそれらしい記事に遭遇せず。

2012/09/02() [n年前の日記]

#1 [python] Texture Atlas用の画像を作成するPythonスクリプトを書いた

_mieki256/texpack

Windows7 x64 + Python 2.6.6 + PIL で動作確認をした。動かすには、 _Python_PIL(Python Imaging Library) のインストールが必要。…こういうのを公開するなら、py2exe 等を使って、exe化したほうがいいんだろうか?

Python の勉強を兼ねて書いたけど、フツーは、 _TexturePacker を買ったほうが早いと思う。TexturePacker なら、 わけで。

PILってPython3.x系では用意されてないのかな? :

公式サイトでは公開されてないのでションボリしたが、検索したら非公式版(?)が一応あるっぽい。 _python3.2でPILでjpg画像を表示 - Pythonの勉強にニコ生アラートみたいの作ってみる という記事で、 _Python Extension Packages for Windows - Christoph Gohlke というページが紹介されてた。

もしや、wxPython も Python 3.x 対応版があるのでは、と期待したけど件のページには無かった。残念…。まあ、Python 3.x 系なら、PyQt のほうがメジャーっぽいけど。

#2 [python] Pythonを色々再インストール

どうも手元の環境(Windows7 x64)に入れてる Python のバージョンが古いような気がしたので、Python 2.7 と 3.2 をアンインストールしてから、インストールし直した。インストールしたのは以下。 全て 32bit版をインストール。64bit版が無いモジュール(?)があったら困りそうなので。

最後に Python 2.7系をインストール・Path も設定して、標準で使う Python を2.7系にしてみた。一応、既にインストール済みの GIMP 2.8 Portable 上で、 Python-fu が動いてるっぽい。

_Hello Absurd World!  Windows 7 64bit - Python 2.6(32bit) - py2exe という記事で、Windows7 x64 + Python x86 + py2exe は上手くいかないという話を見かけた。py2exe で exe化するなら、Windows XP x86 環境が必要なのか…。XP Mode でどうにかならんかな…。

#3 [cg_tools] blender 2.63a をインストールした

Windows7 x64 上に、blender 2.63a x64 版をインストール。

一部分だけレンダリングプレビューできる機能が昔はあったような気がしたのだけど、機能名・ショートカットキーを忘れた…。

最初は Shade でアニメの連番画像を作ろうとしたのだけど、操作がややこしくて諦めた。blneder のほうがまだ簡単な印象。

2012/09/03(月) [n年前の日記]

#1 [nitijyou] 自宅サーバ止めてました

雷が鳴ったので、14:00-15:50の間、自宅サーバを止めてました。申し訳ないです。

#2 [cg_tools] blender 2.63a でCUDAとやらを使おうとしてジタバタ

_Cycles - XZR-blender-別館 という記事で、blender現行版は Cycles なる新レンダラーが使えると知り、少し試してみたり。なんだかイイ感じ。

CPUで計算させてたけど、GPUを使ったらどうなるか気になったので色々実験。環境は Windows7 x64 + GeForce 9800GTGE。

_CUDA Downloads | NVIDIA Developer Zone から、CUDA TOOLKIT 4.2 をDLしてインストール。また、GeForce R300 Driver 301.42 WHQL なる新しいドライバも出ていたようなので、そちらもDLしてインストール。一応インストール時にクリーンインストールにチェックを入れた。

これで使えるようになるらしいのだけど、公式版のバイナリでは全然動かない。ビデオドライバを入れ替えたり、Python 3.2 32bit版を64bit版を入れ替えたり等したけど解決せず。ふと、blenderの画面上部に、「CUDA 1.3 以上が必要だよ。お前のは 1.1じゃねえか」とメッセージが出てることに気付いた。 _GPU Caps Viewer なるツールで確認したところ、9800GT は CUDA 1.1 までしか対応してないらしい。

_Windows - GraphicAll.org には、CUDA 1.0、1.1 でも動く版があるようで。8146_blender-2.63---50324---unified-contrib-add-ons---fastest---cuda.7z をDL・解凍・実行してみたり。

一応GPUで計算して表示できたっぽいが、何かしら操作をすると、すぐに Out Of Memory と言われてレンダリング結果が表示されなくなってしまう。 _Doc:2.6/Manual/Render/Cycles/GPU Rendering - BlenderWiki を見る限り、どうもビデオカード上のVRAM容量でレンダリングできる範囲が制限されるっぽい。VRAM 512MB じゃ全然足りないのだな…。2GBぐらい用意しろ、それでも足りなくなるけどね、と書いてあるようにも見える…。

そもそも古くて安いビデオチップなので、処理速度も期待できないだろうし。 _Benchmark を眺めると、現行製品より3〜6倍も時間がかかる。9800GTは、CUDAコアとやらの数が現行製品と比べると桁違いに少ないし。なかなか厳しい。

一部分だけプレビューできる機能について。 :

2.49の頃は、Shift+P でできたけど、2.5以降は無くなったらしい。残念。レンダリング設定時に border なるものにチェックを入れておけば、指定した矩形範囲だけレンダリングできるようになるからそれでどうにかせい、という話を見かけたが、それは何か違う気がしないでもない…。

2012/09/04(火) [n年前の日記]

#1 [nitijyou] 自宅サーバ止めてました

雷が鳴ったので、15:50-19:05の間、自宅サーバを止めてました。申し訳ないです。

#2 [android] Android端末の画面をサブディスプレイ化するソフトを使ってみた

なんとなく興味が湧いたので、 _Komado を導入して、Lenovo IdeaPad A1 の画面を、Windows7 x64機のサブディスプレイにしてみたり。

PC側とAndroid側の両方にインストールして、PC側を起動後、Android側でも起動。Android側で接続ボタンを押すと、ソフトを立ち上げているPCを探して接続してくれる。ちなみに、Windows7 の Aero は無効化される。解像度の変更はタスクトレイ上のアイコンからコントロールパネルを開いて行う。

反応は遅いものの、たしかにサブディスプレイになった。これは面白い。素晴らしい。

素晴らしいが、使い道が思いつかず。なんとなく、仮想デスクトップ系のツールを思い出した。自分、仮想デスクトップを試した時も、使い道が思いつかなかった人間なわけで。Linux のデスクトップ環境には必ずついている機能なのだから、便利に使ってる人が多いのだろうけど…。

#3 [android] IdeaPad A1 をroot化してみたり

なんでも、IdeaPad A1 は、GPSのログをroot権限で保存し続けるので、アプリインストール時に使う容量が無意味に減っていくと言う話を見かけたわけで。 *1

故に、/data/gps/log/ 以下にログファイルがどの程度入っているのか確認したいと思ったのだけど。su できないとファイル一覧表示すらできないわけで。root化とやらをするしかないのかなと。失敗すると文鎮化するという話も見かけたので、できればやりたくなかったのだけど。

_Lenovo ideapad a1をroot化してみる | お部屋でモバイル を参考にして作業。アプリ一覧に、SuperUser なるアイコンが追加されたので、成功したらしい。

ついでに、 _AndroidにBusyBoxを導入してみる | お部屋でモバイル を参考に、 BusyBox とやらも入れる。簡易版のコマンドしか入っていない Linux 環境でも、コマンド数や機能を一般的なレベルにまでしてくれるプログラム、という認識でいいのかな? busybox ls といった感じで打てば、一般的な ls を使える、ような感じになるらしい。これも root化しないとインストールできないっぽい。

_Android Terminal Emulator なるソフトも入れてみたり。端末コンソール、なるアイコンがアプリ一覧に追加された。見慣れた(?)端末画面が使えるようになった。
*1: ファームウェアのバージョンによって、設定が異なる可能性があるらしい。

#4 [comic][ore_xxxxx] パタリロの子供

夢の中で、パタリロの子供が出てくる漫画を読んだ。なんでそんな夢を見たのかさっぱりわからんけど。

目が覚めてから、悩んでしまった。夢で見たその漫画では、パタリロの見た目はそのままだった。つまり、パタリロは子供という設定のままだったはず。子供なのに、どうしてその子供が存在するんだ…? 色々妄想できそう。個人的には、B.が好み。おそらく、パタリロとバンコランの間で、お互いの姿形が変わらないことをネタにして貶し合ったりするのだろう。

子供が居るということは、お母さんも居るはずで。つまり、パタリロの嫁さん・王妃が存在していたはず。一体どんなキャラで、パタリロとの間にどんな馴れ初めがあったのだろうか。 パタリロのあの姿で、女性のハートを射止めるには、よほど感動的なエピソードを用意しないと…。金目当てで寄ってきたキャラが、パタリロの内面の素晴らしさに気付いて改心(?)するとか? いや、夫婦揃って金の亡者設定も面白そうだけど。

夢の中に出てきたパタリロの子供は、個人的に好みの設定で。夢に出てくるぐらいだから、好みなのは当たり前もしれんけど。 おそらく長男を使えば、正義とはなんぞや、とか、父へのコンプレックス云々等、シリアス方向での話を作れるだろうし。次男を使えば、くだらないドタバタ話を作れるだろうと。なるほどこの設定ならますます連載を長期化できそうだ。さすが魔夜先生。と夢の中で感心していたのだけど、目が覚めてからションボリ。そんなパタリロ漫画はこの世に存在してねえよ。

こういうのをこじらせると、著作権的によろしくない漫画を勝手に描き始めてしまいそう。

主役の子供が登場するメジャーな漫画って結構あるような気がしてきた。 :

世代交代する漫画は、ほとんどソレなのかもしれないけど。
  • キン肉マン。そのまま二世が登場している。
  • 聖闘士星矢。あくまでTV版だけかもしれないけど。紫龍以外は子供が居ないらしいのが、なんだか寂しい。
  • 北斗の拳。子供と言うか、世代交代かしら。…いや、一応子供も出ていたっけ?
  • ドラゴンボール。または、Drスランプ。
  • JoJoシリーズ。もう何世代目になってるのか知らないけど。
最初の世代が活躍し続けている長期連載漫画も、子供を出したら、更に長期化できるのだろうか。

例えば、こち亀で世代交代をしたらどうなるんだろう…? いや、漫画の内容からして、あまり変化は無いよな。たぶん。

仮面ライダーの子供は作れないのかな。 :

昨今、ウルトラセブンの息子が頑張ってるぐらいだから、仮面ライダーにおいても子供が登場するのは商売上おかしくなさそうだなと。

しかし、改造人間である本郷猛には、生殖機能が残っているのかどうか。仮に失われているとすれば、どうやって子供を作ればいいのやら。
  • 改造人間にされる前に、とある女性と深い関係になっていたことにする。しかし、本郷猛は結婚してなかったはずだから、相手の女性はシングルマザーとして子供を育てたことになるはずで…。
  • 本郷猛の遺伝子を元に、クローンを作る。でも、改造人間の体の中には、遺伝子を取り出せるほどの生体部分が残っているのかどうか。ショッカーが改造前にそのあたりの記録を残していればどうにかなりそう。場合によっては精子を冷凍保存していたり、とか。…仮に残してたとしたら、ショッカーはソレを何に使うつもりだったんだろう。
よく考えたら、仮面ライダーのヒーローとしての能力は、怪人バッタ男として人工的に作られた、その体のほうにあるわけで。本郷猛の遺伝子を受け継いだ子供には、さほどの価値も無いような気もしてきた。ショッカーは、あれだけやたらと怪人○○を作っているのだから、本郷猛レベルの肉体が無いと、改造人間を作れないというわけでもないだろうし。

怪人バッタ男の体のほうに価値があるならば。生体部品である脳が衰えて、代わりに誰かの脳を移植・交換した、という設定になれば、そこに仮面ライダーの子供が誕生した、という話になるのだろうか。しかし、1号ライダーより、V3以降のほうが、スペックは上なんだろうし。スペックの低い旧型の体を使い続ける意味は無いよな…。そもそも2号ライダーやV3が居るわけだから、別人を改造人間にしたほうがコスト面では安上がりなのだろう。

ということで、本郷猛の子供を登場させるには、よほど上手い理由を考え出さないといけない予感。まあ、仮面ライダーの場合は、ライダーとしての魂を継承してればそれはもう子供みたいなもんだ、という扱いにするしかないような気もしてきたり。

先天的ヒーローと後天的ヒーロー。 :

ウルトラシリーズと仮面ライダーを比較すると、先天的な能力でヒーローになるか、後天的な能力でヒーローになるか、ヒーローは2種類に分類できるなと思えてきたり。

ウルトラ戦士は血筋でなれる。仮面ライダーは血筋ではなれない。

いや、仮面ライダー牙という特例もあるのか…。今になって考えると、ベルトが意志を持って喋る設定もそうだけど、血筋でライダーになったという設定も異質。ライダー牙は、ライダーシリーズの中では異端者、だったのだな…。まあ、毎回必ず既存作とは異質な設定が盛り込まれるシリーズだけど。

何にせよ、キャラクターが先天的な能力で活躍している場合は、子供を出すという展開もできそうだけど。そうではないなら、子供を出しても全然盛り上がらないのかもしれないなと。

2012/09/05(水) [n年前の日記]

#1 [flash][starling] Starlingを再勉強中

先日、 _Texture Atlas用の画像とxmlを生成するPythonスクリプト を書いたので、ようやく本来の Starling の勉強を再開。

Starling の MovieClip を使えば、Texture Atlas の画像とxmlを使って、パラパラアニメ(?)が表示できるのだけど。どうも表示がおかしい。元画像をそのまま並べた画像と、元画像の余分な部分を削除(いわゆるtrim)して配置した画像の2種類で表示してみたら、表示結果が違っていて。前者は問題無いけれど、後者はコマによって画像が拡大されて表示されてしまう。どうも、MovieClip で表示する際に使う領域 ―― uv座標領域とでも言えばいいのかな ―― は、全て同じサイズになってないといけない模様。

Starling に渡す xml では、そのあたりも規定してるようで。 _TextureAtlas - Starling Framework Reference を見ると、frameX, frameY, frameWidth, framwHeight という要素?で指定するらしい。が、それぞれが何の値を示しているのかよく分からず。

何にせよ、先日書いたスクリプトは、--trim をつけないで使う分には問題無いけど、--trim を使うなら修正が必要だなと。

全然関係ないけど。Flash CS6 には、Texture Atlas用の画像とxmlを生成する機能が追加されているらしいので、Flash CS6 を持っている人なら、このへん全然関係ない話。

#2 [python] PILを勉強中

透明色を指定したインデックスカラーのPNG画像を、背景色が青の新規画像に貼り付け(paste)しようとしたのだけど。透明部分は、青になるはずなのに、元画像の透明色で塗り潰されてしまってハマる。

_python - Transparent PNG in PIL turns out not to be transparent - Stack Overflow を見て解決。
from PIL import Image
img = Image.open(basefile)
layer = Image.open(layerfile) # this file is the transparent one
print layer.mode # RGBA
img.paste(layer, (xoff, yoff), mask=layer)
# the transparancy layer will be used as the mask
img.save(outfile)
maskを指定すれば良かったのか…。

2012/09/06(木) [n年前の日記]

#1 [python] Ulipadなるエディタを導入しようとしてハマる

_ulipad - python editor based on wxPython - Google Project Hosting

Pythonスクリプトを書く際に、PyScripter を使っていたのだけど。どうもエディタとしての機能が弱い気がして、もっとヨサゲなエディタはないものかと。 _PythonEditors - PythonInfo Wiki を眺めてるうちに、Pythonで書かれた Ulipad なるエディタが気になったので導入しようかと。

しかし、Windows7 x64 上でインストールしたものの、起動してもうんともすんとも言わない。ウインドウすら出てこない。zip版をDLしてコマンドラインから実行したところ、comtypes なるライブラリが見つからないというエラーが出る。Python と WxPython Unicode版をインストールしてあれば動くように見えたのだけどなあ…。

とりあえず、WxPython を、2.8.12.1 から 2.9.4.0 にしてみたり。しかし改善せず。

もしかすると、別途ライブラリがあるのかもと検索したら、 _comtypes 0.6.2 : Python Package Index というページに遭遇。しかし、インストーラをDL・実行したものの、今度はインストール時に Runtime エラーが発生。

勘だけど、どうも PyGTK all-in-one installer が怪しい気がする…。Windows上のGTK関係は、アンインストーラが環境変数pathを全削除したり等、怪しい動作をしていた時期もあるし。

試しに、 PyGtk (pygtk-all-in-one-2.24.2.win32-py2.7.msi)をアンインストールしてから、comtypes のインストーラを実行したところ、エラーが出ない。やっぱり PyGtk が怪しい…。でも、コレを入れておかないと、GIMP の Python-fu が動かないし…。ひとまず、色々インストールしてから、最後に PyGtk を再インストール。

それはともかく、comtypes をインストールしても、Ulipad は動作してくれず。

色々検索したら、 _Issue 206 というやり取りに遭遇。どうやら、Windows7 x64 上では動かないっぽい。いや、動くのかもしれないが、何かの条件を満たしている必要があるのかもしれず。

勢い余って他のエディタも試したり。 :

_Komodo Edit も試してみたり。以前、少し触ったような記憶もあるのだけど。…やっぱり、何かが違う。補完が弱いような。

eclipse 4.2 に PyDev をインストールしてみたり。…やっぱり、起動が遅いのがどうにも引っ掛かる。

Python に型宣言があれば、補完機能も活用できるのだろうけど。実行してみるまで何の型か分からないのでは、難しいのだろうな…。

PyDevって有償じゃなかったかな。 :

PyDev は無料だけど、PyDev Extension は有償だった記憶が…。たしか昔はそうだった記憶があるのだけど、今はどうなってるんだろう。

_PyDev Extensions がオープンソースになっていた | Livingdeadの日記 | スラッシュドット・ジャパン

そうだったのか…。

#2 [zatta] 職場と写真

夢の中で、あるシーンを見て、起きてから考え込んでしまった。自分が昔勤めていた職場って、職場内で写真を撮ったことが全く無かったなあ、と。

まあ、そういった写真から、未発表のプロジェクト内容や開発機材の情報が外部に流出する可能性もあるわけで、故にそういった行為は厳禁だったせいもあるだろうし。そもそも当時はデジカメもケータイも無かったから、職場に銀塩カメラを持ち込むという行為だけで怪しさ大爆発、貴様はどこのスパイだ!状態になるから仕方なかったのだろうけど。

でも、せめて、プロジェクトの開始時と終了時に、参加メンバーの記念写真を撮る、なんてイベントがあっても良かったのかもしれないなと。最初の頃は少人数だったのに、終わった時は人数が随分増えてた、みたいなことが、写真で見ればすぐに分かるわけで。そういった記録は、もしかすると、後で価値が生まれたのかもしれないと。

プロジェクトXの事例を思い出したり。 :

職場内の写真と言えば。昔、NHKで放映していたプロジェクトX ―― 企業内の新製品開発エピソードを紹介する番組では、たまに、当時の写真が画面に映ったりしていたような。

今になって考えると、よくまあ写真を撮っておいたものだなあと。多少の精神的余裕がそこにないと、そういうことはできないものだろうし。

スタジオジブリの事例をぼんやり考えたり。 :

宮崎駿監督や、アニメーター大塚康生氏なども、アニメ関連の雑誌や書籍に、東映動画時代の写真が載っていた、そんな記憶もあり。当時のアニメ業界には、まだ、スタジオ内で写真を撮る場面もあった…のかもしれないなと。

そのあたりの方々は、やがて、組合活動が原因で東映動画から追い出されて、日本アニメーションやテレコムに移籍していくわけだけど。ハイジのロケをしていた際の写真は目にした記憶があるものの、その後の写真を、自分は目にした記憶が無く。もしかすると、写真どころではない厳しい制作状態に追い込まれていったのだろうか…。

しかし、鈴木Pが関係を持ち始めるあたりから、また写真が増え始めた印象もあり。鈴木Pは、アニメ雑誌の編集長をしていたぐらいの方だから、写真と言う記録も、商品の素材になり得ることを十分熟知していたのだろうか。そう考えると、今現在のスタジオジブリの広報業務等は、おそらく鈴木Pの経歴があったからこそ、気付くことができた内容なのかもしれないなと思えてきたり。

そしておそらく、後世で、当時のアニメ業界を知ろうとした際は、スタジオジブリの残した多くの写真が、第一級の豊富な資料として使われるのは間違いないのだろうと。…他のスタジオは、写真なんか撮ってる余裕は無さそうだし。

ITベンチャー企業の事例も気にしてみたり。 :

昨今のITベンチャー企業などでも、このへん傾向がありそうな。職場内の写真をほとんど公開しない企業と、ガンガン公開する企業と、ハッキリ分かれている印象が。

職場の写真を公開する際、社員が疲労困憊・暗い顔をしている写真をアップロードしてしまう、そんな企業はないわけで。大体は、笑顔の社員、真剣に仕事に取り組む社員が撮影されている。また、社員の背景には、雑然とした職場の風景も映っていることも多々あるので、かなり現実感のある光景になる。そういう写真が何枚も並んでるわけだから…。企業イメージ向上には有効かもしれないなと。

となると、逆に、職場の写真をほとんど公開しない企業は…職場はどんな状態なのか…。まあ、うっすらと、なんとなく、そういうことなんだろうなと。

飛躍した結論。 :

職場内で撮った写真の枚数と、企業の成長ぶり・社員の幸福度・参加メンバーの仕事に対する充実感・社内の健康性は、比例関係にある。という仮説はどうか。

極端な話、職場内の写真が無い企業は十中八九ブラック。…これは暴論であってほしい。

2012/09/07(金) [n年前の日記]

#1 [python] Pythonスクリプトの記述をチェックするツールを色々インストール

Python 界隈には、 _PEP 8 なる、「このように書くべし」という文書があるらしく。一応ソレに従って書いたほうがいいのかなと思えてきたので、関連ツールを探したり。

Pylintをインストール :

Pylint は、Python スクリプトが規則通りに書かれているかチェックしてくれるツール、らしい。

とりあえず、Windows7 x64 + Python 2.7.3 上にインストールしてみたり。以下の記事を参考に作業。

_メモ: PyLintインストール - 路傍のプログラマ
_構文チェッカーの導入 - nelnal@python - pythonグループ

以下の3つのファイルをDL。
  • pylint-0.25.2.tar.gz
  • logilab-common-0.58.2.tar.gz
  • logilab-astng-0.24.0.tar.gz
解凍して、各フォルダに入り、それぞれ以下を実行。
python setup.py install
なんだか Syntax Error が大量に出ている気もするけど…。Pythonインストールフォルダ\Scripts\ 以下に、pylint.bat というファイルがあるから、たぶんインストールできているのだろう…。

Windows の環境変数pathに、Pythonインストールフォルダ\Scripts も追加した。これで、以下のように打てば実行できるはず。
pylint.bat hoge.py

PyScripter でも使えるように設定してみた。ツール → ツールの設定、を選んで、Py&Lint を選択して、修正ボタンを押す。パラメータに、以下のような指定がされていた。
$[PythonDir-Short]Lib\site-packages\pylint\lint.py $[ActiveDoc-Short] -f parseable
自分の環境に合わせた記述に修正。自分の場合、以下のようになった。
$[PythonDir-Short]Lib\site-packages\pylint-0.25.2-py2.7.egg\pylint\lint.py $[ActiveDoc] -f parseable
  • lint.py の場所が違ってたので修正。
  • $[ActiveDoc-Short] のままだと長いファイル名を使った際に怒られるみたいなので、$[ActiveDoc] にしてみたり。

しかし、この Pylint、バカスカと警告が表示される。
[C, main] Invalid name ""x"" (should match [a-z_][a-z0-9_]{2,30}$)"	hoge.py 97
命名規則から外れてると言われてるのかな? 変数名等を3文字以上にすれば出なくなるみたいだけど。

エラーメッセージで検索してみたら、以下のやり取りに遭遇。

_python - How do I tell PyLint "it's a variable, not a constant" to stop message C0103? - Stack Overflow
_python code convention using pylint - Stack Overflow

「その警告を無視したいなら、スクリプトの頭のほうに呪文を書け」と言われてるのだろうか。
# pylint: disable-msg=C0103
あるいは、pylint を動かす際に、このオプションをつけろと。
python lint.py --disable-msg=C0103 ...
ただ、 _Pylint User Manual (Logilab.org) を眺める限り、
python lint.py --disable=C0103 ...
じゃないといかんようにも見える。

_Pylint Tutorial (Logilab.org) を眺めていたら、「この命名規則は Logilab の中の人の規則」「お前は、お前の命名規則を決めろ」「俺はPEP8標準に従いたいから、こんな規則は糞食らえだ。別の正規表現を指定する」と書いてあるようにも見える。であれば、気にしなくてもいいのかな。

pep8もインストール。 :

_pep8 というツールでも、規則通りに書かれているかチェックできるらしい。以下の記事で使い方が紹介されてた。

_Pythonのコーディングスタイル(PEP8)をコマンドでチェック | TRIVIAL TECHNOLOGIES @ats のイクメン日記

試しにインストールしようとしたが、pip なるツールを使わないといかんらしい。

_Python のパッケージを pip でインストール | すぐに忘れる脳みそのためのメモ に、Windows でも pip をインストールできそう、みたいなことが書いてあった。 _setuptools 0.6c11 をインストールしてから、以下を打つらしい。
easy_install pip
pip がインストールできたっぽい。

ようやく、pep8をインストール。
pip install pep8
Pythonインストールフォルダ\Scripts\ 以下に、pep8.exe が入ってくれた模様。

せっかくだから、PyScripter から pep8 を呼び出せるようにしてみたり。ツール → ツールの設定 → 追加ボタンを押して設定する。
  • 名前 → pep8
  • アプリケーション → $[PythonDir]Scripts\pep8.exe
  • パラメータ → $[ActiveDoc]
  • 作業ディレクトリ → $[ActiveDoc-Dir]
  • メッセージフォーマ → $[FileName]:$[LineNumber]:$[ColumnNumber]:
  • 出力をキャプチャ、メッセージをパース、トレースパックをパース、にチェックを入れる。
  • コンテキスト → アクティブなPythonフ
  • (お好みで)ショートカットキー → Ctrl+Shift+L
  • Windows7 上では、どうもフォント幅があり過ぎて、設定ダイアログ中のところどころで文字列が切れてる・隠れてるのが微妙に辛い。
  • アプリケーションやパラメータの入力欄では、Shift+Ctrl+P や Shift+Ctrl+M を押すと、指定に使えるアレコレがポップアップ表示されるので楽。
これで、実行すると、おかしなところを一覧で表示してくれるようになった。一覧をマウスでダブルクリックすると、スクリプト内の該当行にカーソルが移動してくれる。

おそらく、メッセージフォーマ(ット?)の欄で、ツールの出力結果にはどういう情報が並んでいるか教えてやることができるのだろうと思う。pep8の場合、「ファイル名:行番号:列:内容」となってるので、それを教えてやる、みたいな。

autopep8というツールもあるらしい。 :

いくら修正しても、pep8が「インデントが珍妙ナリ」と文句を言ってくる。E127,E128のあたりが出てくるというか。本来どう書くべきなんだろう?

検索しているうちに、 _hhatto/autopep8 というツールがあることを知る。pep8 1.3 以上が必要らしい。

試しにインストール。
pip install autopep8
実行。
autopep8 hoge.py > hoge_edit.py
WinMerge で空白の差異を見るようにして比較してみたが、たしかにインデントの仕方が違う。素晴らしい。
    parser.add_option("-i", "--infile", metavar="WILDCARD",
        help=u"入力PNGファイル名(ワイルドカード指定) [default: %default]")
↓
    parser.add_option("-i", "--infile", metavar="WILDCARD",
                      help=u"入力PNGファイル名(ワイルドカード指定) [default: %default]")
こう書かないといかんのか…。

もしかして、perltidy のように、渡したテキストを整形して返してくれるなら、xyzzy 上でも C-x # autopep8 と打つだけで、開いている PythonソースをPEP8に従った形で整形してくれるのでは? と思ったけれど試してみたらソースが消えて autopep8 のヘルプに書き換わってしまった。perltidy とは入出力の仕様が違うらしい…。

PythonTidyというツールもあった。 :

_PythonTidy - 紫藤のWiki
_PythonTidy 1.22 : Python Package Index

PEP8に従って整形するよ、と書いてあるように見える。

PythonTidy-1.22.python をDLして pythontidy.py にリネーム後、xyzzy 上で C-x # pythontidy.py と打ってみたり。おお…整形してくれた!

しかし、docstring 内の日本語文字列が全部16進数表記になってしまった。たしかに PEP8 は「全部ASCII文字で書け。ソレ以外の文字を書きたかったら16進数で表記しろ」みたいなことが書いてあるのだけど。そこまでやられちゃうと困る…。全てのコメントを英語で書けば、英語圏の人間にはコメントが読めるようになるかもしれないけれど。スクリプトを書いた自分がコメントを読めなくなる。それはそれで何かおかしい。

色々試していたら、そもそも自分のdocstringの書き方がおかしかったことに気付いた。全部 u""" 〜 """ みたいに書いていたが、""" 〜 """ と書いておけば変換されずに済む。utf8n で書いてあるソースだと最初のあたりに明記してあるのだから、u""" 〜 """ と書かなくてもいい、のかな。たぶん。u""" 〜 """ と書いておくと、「これはUnicodeです」と伝えているので、わざわざ変換しちゃうのだろうと。

それはともかく。変換後のソースを見ると、docstring が ''' 〜 ''' になっている。それって、docstring じゃなくて、複数行文字列の記述なのでは? 少なくとも PyScripter 上では、docstring じゃなくて複数行文字列として扱われてしまうのだけど。

#2 [python][neta] Pythonの記述規則は色々面倒臭いな

なんというか…。Python は、漫画やアニメに出てくるガッチガチの委員長タイプだなあ…。それも、昨今流行りのメガネっ娘委員長や、温和で頭が切れるイケメン委員長じゃなくて、ビン底メガネの男子生徒でヒョロ男でキーキー言うタイプ。24年組の昔の少女漫画に出てきそうな感じの。

しかも、コメントやドキュメントは英語で書けと言われるし。Python が人間だったら、楽天の社長さんと笑顔で酒を飲んでそう。

もちろん、書き方をガチガチにすれば、ソースの可読性は上がるし。コメント等が英語で書いてないだけで世界中の人達が使いづらくなるという主張は、なるほどと思うのだけど。

しかし、だったら Java みたいにフォーマッターなりIDEなりを積極的に用意して、早い時期からソース整形を自動化すべきだったのではと思うし。わざわざ人間様に気を使わせて、手でシコシコと打たせなくても…。お前の目の前にあるその機械は一体何だ? という話にも繋がりそうな。

それに、プログラミング言語というお互いの共通言語が既にあるし理解もできているのだからソレを使うだけじゃダメなんか、真のプログラマーならソース見れば何やってるか判るはず、何のために可読性の高い言語仕様をわざわざ決めているのか、英語でコメントを書けという要求は Python の長所を無視しているも同然、と思わないでもないです。 *1
*1: まあ、母国語以外を見た瞬間、「うっ」となる気持ちは分かってしまうあたりが…。自分もソレが理由で、英語のコメントなんて勘弁してくれ状態なわけだし。だからと言って、英語圏の人達に日本語でコメント書けとは要求できないけど、あちらは平気で「英語で書け」と要求してくる印象。

#3 [perl] PerlTidyをインストール

インストールするのを忘れてた。Windows7 x64 上で、ActivePerl 5.14.2 build 1402 を使ってるので、スタートメニューから GUI の ppm を起動。tidy で検索して、リストアップされた中から Perl-Tidy を選んでインストール。

2012/09/08() [n年前の日記]

#1 [as3][flash][actionscript][cg_tools] FlashDevelopでFXGを使う

全然知らなかったのだけど、Adobe は FXG というベクター画像フォーマットを打ち出していたらしい。Flex あたりで利用することを想定してたのだろうか。一応、Illustrator 等、Adobe各製品から出力することができるらしい。

FlashDevelop上で svg を Embed してたら、コンパイラが「svg なんかより fxg のほうがオススメだよ!」とわざわざ警告を出していて。そこでようやく、そんな画像フォーマットがあることに気付いたわけで。

試しに FXG とやらも ActionScript3 で表示してみたい。と思ったものの、svg から fxg に変換するツールが全く見つからない…。

_flex4 - FXG Editor for Flex - Stack Overflow で、Inkscape から FXG として別名保存できる拡張を見かけた。

_svg2fxg.inx_svg2fxg.xsl のページからそれぞれファイルを取得して、Inkscapeインストールフォルダ\share\extensions\ 以下にコピーしたら、別名保存時に "Flash XML Graphics (*.fxg)" という選択肢が選べるようになった。

これで FXG ファイルが出来たので、FlashDevelop を使って表示の実験。以下のページを参考に。

_FlashDevelop.org - View topic - How to embed vector images ?
_[Flex] グラフィックアセットの埋め込み | クラスメソッド開発ブログ

svg画像の場合は、ソース中でEmbedを記述して埋め込んでいたけれど。FXG の場合は、import で埋め込む(?)らしい。例えば、ソースと同じ階層に Hoge.fxg というファイルを置いたなら、import Hoge; とすればいい。package piyo.fuga 以下なら、import piyo.fuga.Hoge; になるのかな。たぶん。

呼び出す・使う時は、var spr:Sprite = new Hoge() as Sprite; みたいな感じ。

で。実際表示してみたのだけど。svgの時には表示されていたものが、fxgになったら表示されなかった。どうやら、Inkscape で無頓着に保存した FXG は、svg のコマンド?の一部しか対応していないっぽい。 _SpecFXGExport - Inkscape Wiki にも、Not supported の一覧が。

Inkscape 上で、グループ解除、オブジェクトをパスに変換、等をした上で、最適化svg として保存した後、その svgを開いた直後に fxg保存してみたり。…これなら一応それらしく表示された。

ただ、Inkscape では、保存した FXG を開き直すことができないようで。これでは一方通行、最終保存フォーマットだな…。なかなか厳しい。しかも、 _flex4 - FXG Editor for Flex - Stack Overflow では、Inkscape で保存した FXG を Flash CS 5.5 で読み込んだらクラッシュした、なんて話も。ますます厳しい。

Webサイト上でFXGを作れるサービスがあるらしい。 :

_FXG Editor Guide
_FXG Editor
_SVG Editor

FXG あるいは SVG を作成できる模様。と思ったが、FXG Editor で画像を作成して保存したら画像が真っ黒になってしまった。また、そもそもローカル保存できないような…。xml内容をウインドウに表示することができるから、それをコピペしてどうにか、という感じなのかなあ。

全然関係ないけど、ギャラリー内で上手く保存できなかったアイテムを削除できる機能が欲しいと思ったり。

#2 [as3][flash][starling] Starling を使ったAIRアプリを作るための下準備をメモ

Windows7 x64 + FlashDevelop 4.0.4 + Flex 4.6.0 + AIR 3.3 で作業。

  1. 新規プロジェクト作成。AIR AS3 Projector を選択。名前に、任意のプロジェクト名を、パッケージに、com.hogefuga みたいな感じで入力。
  2. プロジェクトフォルダ\lib\ 以下に、starling.swc をコピー。
  3. プロジェクト設定 → コンパイラー設定 → SWC Libraries の右側のボタンを押して、lib\starling.swc を入力。
  4. プロジェクト → AIRアプリケーション設定 → Initial Window → 非ウインドウ表示プラットフォーム → レンダリングモード、を Direct に。これをしないと Starling では画面が表示されない。
  5. bat\SetupSDK.bat を開いて、set FLEX_SDK=〜 の行を自分の環境に合わせて修正。
  6. bat\CreateCertificate.bat を実行。右クリックして実行を選べば実行できる。
  7. ソースを書いて、プロジェクトをビルド(F8キー)。
  8. プロジェクトをテスト(F5キー)。
これで合ってるのかどうかわからんけど…。

swcの追加は、もっと簡単な方法があったらしい。 _FlashDevelopの使い方 (15)SWC形式のライブラリをProjectパネルから簡単に指定する方法 - 独学ActionScript で説明されてた。

#3 [as3][flash][starling] Starling使用中のウインドウをリサイズする際の処理でハマる

Windows7 x64 上で Starling を勉強中なのだけど。ウインドウサイズを変更した際に、表示内容もウインドウサイズに合わせて拡大縮小させようとしたものの、何度もサイズを変更してるうちにエラーが出て Flash Player が固まってしまう不具合が出てハマってしまったり。

ウインドウサイズ変更時は、Event.RESIZE でイベント発生させられるのだけど。もしかすると前のリサイズ処理がまだ終わってないうちに、次のイベントが発生して、マズイことになってるのかなと。しかしそれなら、まだ処理中だよ的フラグを用意すれば、そこそこ改善するはずで。しかし、相変わらずエラーが出る。改善できてるように見えない…。

変更したら必ず固まるわけではないのが困る。時々何かの拍子に発生するようで。Starling.current.viewPort = viewport; のあたりがおかしいのかなあ…。よくわからん…。

色々試したけど、どうにかエラーが出ない感じになったかもしれず。とりあえず、Main.as は下のようになった。
package com.blawat2015
{
    import flash.display.Sprite;
    import flash.display.StageAlign;
    import flash.display.StageQuality;
    import flash.display.StageScaleMode;
    import flash.events.Event;
    import flash.geom.Rectangle;
    import starling.core.Starling;
    
    [SWF(width="480",height="320",frameRate="60",backgroundColor="#000000")]
    
    /**
     * Starling + ウインドウサイズ変更のテスト
     */
    public class Main extends Sprite
    {
        private var myStarling:Starling;
        private var resize_exec:Boolean = false;
        
        /**
         * コンストラクタ
         */
        public function Main():void
        {
            // stage が既に存在しているなら即座に、
            // stage が存在していないならステージ生成時に、初期化メソッドを呼ぶ。
            if (stage)
                init()
            else
                addEventListener(Event.ADDED_TO_STAGE, init);
        }
        
        /**
         * 初期化処理
         * @param   e
         */
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;
            stage.quality = StageQuality.BEST;
            
            // Starlingのインスタンスを生成
            var viewport:Rectangle = new Rectangle(0, 0, _g.STGW, _g.STGH);
            myStarling = new Starling(MySprite, stage, viewport, null, "auto", "baseline");
            
            myStarling.antiAliasing = 1; // アンチエイリアス設定
            myStarling.showStats = true; // 状態表示有効化
            myStarling.enableErrorChecking = true; // エラーチェック
            myStarling.start(); // 描画処理開始
            
            // ウインドウリサイズ時の処理を設定
            stage.addEventListener(Event.RESIZE, onResize);
        }
        
        /**
         * ウインドウリサイズ時に呼ばれる処理
         * @param   e
         */
        private function onResize(e:Event):void
        {
            // 処理中にイベントが再発生するとマズいので、フラグでチェック
            if (resize_exec)
                return;
            
            resize_exec = true;
            var v:Rectangle, sw:int, sh:int;
            myStarling.stop(); // 念のために描画を停止しておく
            do
            {
                sw = stage.stageWidth;
                sh = stage.stageHeight;
                v = new Rectangle(0, 0, sw, sh);
                
                // 縦横拡大率を求める
                _g.wdw_scaleX = sw / _g.STGW;
                _g.wdw_scaleY = sh / _g.STGH;
                
                if (_g.wdw_scaleX > _g.wdw_scaleY)
                {
                    // 横に引き延ばし過ぎ
                    var w:int = int(_g.STGW * _g.wdw_scaleY);
                    if (v.width > w)
                        v.width = w;
                    v.x = int((sw - v.width) / 2) & 0xfff8;
                    _g.wdw_scaleX = _g.wdw_scaleY;
                }
                else if (_g.wdw_scaleX < _g.wdw_scaleY)
                {
                    // 縦に引き延ばし過ぎ
                    var h:int = int(_g.STGH * _g.wdw_scaleX);
                    if (v.height > h)
                        v.height = h;
                    v.y = int((sh - v.height) / 2) & 0xfff8;
                    _g.wdw_scaleY = _g.wdw_scaleX;
                }
                
                    // 処理中にウインドウサイズが変更されてたら算出し直し
            } while (sw != stage.stageWidth || sh != stage.stageHeight);
            
            myStarling.viewPort = v;
            myStarling.stage.stageWidth = _g.STGW;
            myStarling.stage.stageHeight = _g.STGH;
            myStarling.start(); // 描画再開
            _g.wdw_w = sw;
            _g.wdw_h = sh;
            resize_exec = false;
        }
    }
}
ちなみに、main.as とは別に、MySprite.as、_g.as が用意してある。

ハマってた時のソースから変えた部分をメモ。 最初は、全てを格納するSpriteの拡大縮小率を変更して対応させてたけど。PC上であればそういうことをしなくても済む感じ。Android等ではどうなるか分からないけど。ひとまず、Starling が持ってる、viewPort、stage.stageWidth、stage.stageHeight を弄ることでどうにかできるっぽい。

以下、よくわかってないけど。 例えば。 こんな感じなのかな…。たぶん。自信無いけど。間違ってるかもしれんけど。

2012/09/09() [n年前の日記]

#1 [as3][flash] FlashDevelop上でAIRアプリのパッケージを作ろうとすると失敗する

Windows7 x64 + FlashDevelop 4.0.4 での話。PackageApp.bat を実行すればパッケージが作成されるはずなのだけど。以下のようなエラーが出る。
 Packaging starlingwdwresize.air using certificate "bat\starlingwdwresize.p12"...
 Could not generate timestamp: handshake alert:  unrecognized_name
 AIR setup creation FAILED.
 
 Troubleshooting:
 - did you build your project in FlashDevelop?
 - verify AIR SDK target version in application.xml

エラーメッセージで検索してみた。

_Flashdevelop + AIR: Could not generate timestamp: handshake alert: unrecognized_name
_FlashDevelop.org - View topic - Trying to create AIR application -PackageApplication fails

bat\Packager.bat の、11行目あたりを修正。
call adt -package %OPTIONS% %SIGNING_OPTIONS% %OUTPUT% %APP_XML% %FILE_OR_DIR%
↓
call adt -package -tsa none %OPTIONS% %SIGNING_OPTIONS% %OUTPUT% %APP_XML% %FILE_OR_DIR%
〜.air が作成できた。

下のようにすると、デスクトップ用の .exe も作れるらしい?
call adt -package -tsa none %SIGNING_OPTIONS% %OPTIONS% -target bundle %OUTPUT% %APP_XML% %FILE_OR_DIR%

#2 [web] Google翻訳で妙な変換

Google翻訳で、「320x480」を日本語に訳すと「アイフォーン」に変換される。たしかに、iPhone の画面解像度だけど…。

#3 [as3][flash][starling] Starlingとフルスクリーンモード

Starling 勉強中。フルスクリーンモードで表示しようとしているところ。Starling を使ってないなら、stage.displayState = StageDisplayState.FULL_SCREEN; でいいんだろうけど…。

Starling ではなく、旧来の表示方法 ―― flash.display.SimpleButton と flash.display.Sprite で表示して、クリックしたら StageDisplayState.FULL_SCREEN を設定、という方法で試してみたところ、一応フルスクリーンモードになってくれたっぽい。 Starling で表示している部分も、ちゃんと拡大表示されているように見える。ただ、stage.scaleMode = StageScaleMode.NO_SCALE; を設定してるので、フルスクリーンになっても旧来の表示方法で描画してるものが拡大されずに小さいままで。まあ、フルスクリーンに切り替えるボタンぐらいでしか使わないだろうから、表示位置だけ変更して済ませちゃってもいいかな…。

フルスクリーンモードにすると、キーボード情報の取得がほとんどできなくなるらしい。困ったな…。

StageDisplayState.FULL_SCREEN_INTERACTIVE ならキーボード情報も取得できるらしい。ただし、Flash Player 11.3 以降から対応だそうで。

#4 [flash] FlashDevelop等をインストールし直し

何故か知らんけど、FlashDevelop 上で作業をしてたら、置換操作等がまともにできなくなってしまった。全然関係ない単語等を置換しようとする…。

原因がよく分からないので、FlashDevelop 4.0.4 をアンインストールして、また再インストール。しかし再インストール時に「Java 1.6が必要なんだが、お前の環境は 1.7 がデフォルトになってる」と文句を言われたり。面倒臭いので Java 1.7、Java 1.6 をアンインストール後、Java 1.6 update 35 だけを再インストール。

勝手に Java 1.7 に更新されたら面倒なので、Javaコントロールパネルから更新チェックを無効にしようとしたのだけど、そのままだと設定が変更できない。

_Java アップデート設定が Java コントロールパネルで保存されていません。
Java コントロールパネルを管理者として実行するには、次の手順に従います。

1. 「スタート」をクリックし、「検索の開始」ボックスにコマンドと入力します。
2. 上に一致した候補のリストが表示されます。プログラムリストでコマンドプロンプトを右クリックします。
3. 「管理者として実行」をクリックします。
4. 「コマンドプロンプト」ウィンドウで次のコマンドを入力します。 c:\Program Files\Java\jre6\bin\javacpl.exe Java コントロールパネルが開きます。
5. Java コントロールパネルで、「アップデート」タブをクリックします。
6. アップデートの通知の設定を目的の設定に変更します。
7. 「適用」ボタンをクリックしてから、「OK」ボタンをクリックして設定を保存します。

Java アップデート設定が Java コントロールパネルで保存されていません。 より

要するに管理者権限で javacpl.exe を動かせ、ということらしい。

2012/09/10(月) [n年前の日記]

#1 [as3][flash][starling] Starlingでクリックやドラッグの勉強中

特定の領域をマウスでドラッグすると画面がスクロールするような仕様を試したいので、マウス操作のアレコレを勉強中。以下のページを参考に。

_FN1204001 - Starlingフレームワークでインスタンスをドラッグ&ドロップする - Flash : テクニカルノート
_FN1204003 - Starlingフレームワークでインスタンスをクリックする - Flash : テクニカルノート
_Starling のタッチイベントと Touch クラス - akihiro kamijo

#2 [as3][flash][starling] Google Chrome上で Starling を使うとフルスクリーンへの切り替え時にエラーが出る

Lost Context とか言われてしまう…。Firefox、IE、Opera では問題は出ないのだけど。

Starling のインスタンス生成前に Starling.handleLostContext = true; を呼べば、再生成?してくれるっぽい。メモリは余計に使うらしいけど…。

_New Feature: handling a lost device context ≪ Starling Forum
_Memo, AIR for AndroidでStarlingをつかってエラーが出た時の対処法-イナヅマTVログ

#3 [as3][flash] SWFObject.jsって何だろう

FlashDevelop でプロジェクトをビルドすると、bin/ 以下に index.html や swf ができるのだけど。index.html を開いたら、swfobject.js なるものを呼んで何か処理をしているようで。コレは何だろう。

どうやら、HTML中にFlashを埋め込む際に、すっきりした書き方ができるように作られた JavaScript っぽい。

_SWFObject - Google Project Hosting
_SWFObject 2を用いたFlash Playerのバージョン検知とSWFファイルの埋め込み
_swfobject.js がアレな話 - ほむらちゃほむほむ

swfobject_generator_1_2_html.zip をDL・解凍して index.html をブラウザで開いて入力したら、記述内容を生成できた。

_jQuery SWFObject てのもあるのか…。

2012/09/11(火) [n年前の日記]

#1 [windows] pdf関係のアレコレをインストール

Windows7 x64 上に、pdf関係のソフトをインストールした。

印刷時にpdfとして書き出せる、CubePDF を、1.0.0 RC3 にアップデート。

出力時に 300dpi に固定されてるっぽいのだけど。 _今日の戯言(2012-08-31) という記事で、レジストリを弄れば 600 dpi にできるという話を見かけて試してみたり。
[HKEY_CURRENT_USER\Software\CubeSoft\CubePDF\v2] "Resolution"=dword:00000004

今日の戯言(2012-08-31) より



PDF X-change Viewer もインストール。しばらく試用してみようかと。

pdf出力とDropbox利用で少し便利さが分かったような。 :

PC上でレシピを探して、印刷時にpdfとして出力して。Dropboxの同期フォルダに保存。Androidタブレット端末 IdeaPad A1 を台所に持っていって、Dropboxのフォルダを開いてpdfを表示して、それを見ながら料理を作ったり。

今までは、一々プリンタでレシピを印刷して台所に持ち込んでいたわけで。ソレに比べると、なんだかちょっと便利な感じ。

ただ、お袋さんが同じものを作ろうとした際に、ちょっと困るかもしれないけど。お袋さんは紙に印刷されたレシピしか見れない人なので。それと、水で濡れた手でタブレット操作はできないのはちょっとアレだなと。

2012/09/12(水) [n年前の日記]

#1 [as3][flash][starling] バーチャルパッドもどきを書いていたり

Starling 勉強中。バーチャルパッドもどきを書いていたり。Android上で動かせるようにしたいのと、PC+ブラウザ上でフルスクリーンモードにした際にキー入力がほとんどできなくなるので代替入力として必要になりそうだなと。、

バーチャルパッドの標準的な大きさや仕様って無いのかな…。少し検索してもそれらしい情報は見つからなかった。

ひとまず画面左下に円の画像を表示して、円の中心からどれだけ離れた位置をタップ・ドラッグしているかで、8方向の入力にしてみたけれど。その都度指で触れ始めた任意の座標をバーチャルパッドの基準点として扱うというやり方もあるそうで。どの仕様がいいのやら。

ただ、バーチャルパッドによる操作仕様はクソ、という評が一般的らしいので、できればタップだけで済む操作仕様に持っていくのがベターなのだろうけど。…ファミコン時代から全世界が培ってきたその手のノウハウを平気でドブに捨てさせるあたりにジョブズの傲慢さを感じないでもないが、その代りにスマートフォンやタブレット端末は何を得たのか、十字ボタンやA/Bボタンがついてたらここまでシンプルな見た目になっただろうかと考えると、仕方ないのかなという気も。

ソレとは別に。これはPC上の話だけど。未だにFlash自体が、ジョイパッド(ゲームパッド/ジョイスティック)をサポートしてないあたりが不可解。ゲーム向けも視野に入れるなら、ジョイパッド対応は必須じゃないかと思うのだけど。Adobe社内には、NESだのプレステだのでゲームをプレイした人が誰も居ないのだろうか。…そういえば HTML5 はそのあたりどうなってるんだろう。Flashより先に対応しちゃったりして。

画像を用意する段階でハマる。 :

そもそも、表示するための画像作成で手間取ってしまった。最初は GIMPで描き始めたけどカッチリした図形が描けず。Inkscape でどうにかそれらしい画像を。しかし図の輪郭線を追加しようとして、またハマる。GIMPで追加すると線が汚くなってしまうので、輪郭線も Inkscape 上でどうにかできないかと試行錯誤。

ついでに、最大化ボタンも描き直し。Windows の各ウインドウのソレを参考にしながら、グラデーションをつけてみたり等を試したり。

スマートフォン用のアレコレを眺めると、ボタンのデザインがどれも比較的スッキリしていて。ああいった見た目にするには、さてどうすれば…。

2012/09/13(木) [n年前の日記]

#1 [as3][starling][android] Android実機でStarlingを使ったAIRアプリを動かしてみたり

Lenovo IdeaPad A1 に、Starlingを使ったAIRアプリを転送して動作確認。

さっくり60FPSが出るかと期待してたけど全然ダメだった。20FPS前後をふらふら。色々試してみたけれど、そもそも何も表示してない状態ですら50FPSに達しない。これでは下手すると、Starlingを使わずに、旧来のFlashの描画の仕方でも良かったのではないか。たしか Haxe を使って動作確認した際も、このくらいのガクガク具合で動いていたような…。

最新、かつ、そこそこ強力なスペックを持つAndroid端末上で動かせば、Starling を使うことで速度が改善する可能性はあるのかもしれないけど。ヘボい中華Padモドキでは効果がよく分からないという結果になりそうな。

一応、デバッグ用にビルドした .apk を転送したら、起動時に「OpenGL」という文字列が送られてきたので、そのあたりを使って描画してるんだろうけど…。もしかすると、OpenGL を使うと30FPSで頭打ちになるハードウェアなのかしら。昔の端末はそういう仕様だったとどこかで見かけた記憶もあるし。また、Starling関係のサンプルを眺めていると、mobile用(iOS、Android)のソレは、えてして30FPSが指定されてあるものが多いし。スマートフォンなのに60FPSを要求するほうがおかしい…?

ひとまず、試したアレコレをメモ。
Starling の viewPortその他で画面拡大を任せず、root相当のSpriteを自前で計算して拡大縮小してみた。
速度はどちらも変わらなかった。もしかすると Starling 内部でも同じことをしているのかもしれない?
一番奥・画面全部を覆う背景を、グラデーションのQuad(矩形)で描画していたけど、それをImage(テクスチャ付きのQuad)に変更してみた。
微妙に速くなった。どうやら、Quad より Image のほうが速いらしい。特定色で塗り潰しをしているだけの Quad のほうが速いんじゃないかと予想してたけど、なんだか意外。ビットマップデータをひたすら転送するほうがまだ速いのだろうか。
半透明の指定(Quad.alpha や Image.alpha 等)を極力無くした。
微妙に速くなった。
基準画面サイズを、480x320から320x240にしてみた。
微妙に速くなった。

実機で動かして分かったこと。 :

実機で動かしたら、指でタップした位置と、実際に取得された座標にずれがあって悩んでしまった。例えば、左手の親指でバーチャルパッドの中心を押さえたつもりが、少し左下の位置が押されたものと判別されているようで。まあ、実際に触れているのは、親指の先・中心ではなくて、少し根元に近いほう、ということだろうけど。触ってる人間が期待しているソレと、端末が取得してる情報の間にはずれがある、ということなのかな。

何かこのあたり、細かい一工夫が必要になりそう。本来は、こういうのもキャリブレーション?する機能を入れるべきなんだろうけど。

知らない間にキャリブレーションすることもできなくはない、かもしれない。アプリ開始時から何度か各ボタンをタップさせるうちに、ボタンの中心位置からのずれを平均値にして持っておいて後で使うとか? ユーザは、ボタンをタップする際に、えてして真ん中を叩いているつもりのはず、と仮定したり。しかし、右手の人差指でタップするのと、左手の親指で押すのでは、触れる部分が違うはずで…。

#2 [as3][flash][starling] FlashDevelop 上からAndroid端末にAIRアプリを転送する手順をメモ。

AIR_Android_readme.txt を読めば書いてあるけど。一応メモ。環境は Windows7 x64 + FlashDevelop 4.0.4 + Flex 4.6.0 + AIR 3.4。
  1. 端末とPCをUSBケーブルで繋ぐ。(PC側にドライバ等はインストール済みで、端末側の開発用設定はそれぞれチェックを入れてあること。)
  2. コマンドプロンプトで、adb devices と打つ。devices が表示されたら繋がってる。
  3. FlashDevelop 上でビルド(F8キー)。構成の選択で「リリース」「デバッグ」が選べる。「リリース」は本番用ビルド。「デバッグ」は開発時用で、PCとAndroidでアプリの動作状況をやり取りできるが、アプリの動作が遅くなる。アプリの動作速度が妙に遅い時は「デバッグ」でビルドしてないか確認する。
  4. PackageApp.bat を実行して .apk を作る。「何用のバイナリを作る?」と尋ねてくるので、Android用のどれかを選ぶ。dist/ フォルダ以下に .apk が作成される。ちなみに、FlashDevelop 上で、.bat を右クリックして「実行」を選べば実行できる。
  5. Run.bat を編集して、Android実機に .apk を転送できるようにする。goto android-test か goto android-debug のどちらかを有効にして、他はコメントアウト。行頭に「::」をつければコメントアウトできる。
  6. Run.bat を実行して、Android実機に .apk を転送。転送終了すると自動的にアプリが起動する。

ついでに、Android用AIRアプリを作る際の手順もメモ。
  1. FlashDevelop 上で、新規プロジェクト作成。AIR Mobile AS3 App を選択。
  2. bat\SetupSDK.bat を修正。FLEX_SDK、ANDROID_SDK を、自分の環境に合わせたパスに変更。
  3. ソースを書く。ビルドする(F8キー)。テスト実行する(F5キー)。初期状態では、PC上で Flash Player が起動する状態になってるはず。
  4. FlashDevelop 上で、bat\CreateCertificate.bat を実行。何かの証明書ファイルを作るらしい。そのプロジェクトで1回作っておけばOK。


ついでに、Starling を使う時の手順もメモ。

#3 [as3][flash] AS3で条件付きコンパイル

ActionScript3 で条件付きコンパイルってできないのかなと思って検索。

_ActionScript 3.0 の条件付きコンパイル - akihiro kamijo
_ActionScript 3.0 の 条件付きコンパイル - Digital SeeTake
_条件付きコンパイル - FlashDevelop 用 AS 3 サンプル集
_newbie on xxx(scala,iphone,objective-c,ajax,javascript,html and more...): ActionScript3で条件付きコンパイル(Flash Develop)
メニューの「Project→Properties→Compiler Optionsタブ→Additional Compiler Options」に
-define=CONFIG::DEBUGTEST.true
 と設定する。trueの部分をfalseにすると条件付きコンパイル部分を実行しなくなる

newbie on xxx(scala,iphone,objective-c,ajax,javascript,html and more...): ActionScript3で条件付きコンパイル(Flash Develop) より



未定義だったらここを有効/無効にする、みたいな書き方が見つからず。そういうのはできないのかな…。

2012/09/14(金) [n年前の日記]

#1 [starling][flash][as3] バーチャルパッドの実装で悩み中

Android端末上で実際に動かしてみて、どうも何かが違うなと悩み中。
サイズはどの程度がいいのだろうか。
巷のスクリーンショットを眺めると結構大きいみたいだけど…。タッチやドラッグをすることを考えると大き目のほうがいいのだろうか。ファミコン等の十字キーのサイズに合わせたほうが良さそうな気もするけれど。各端末のdpiがまともなら、計算で下地画像・入力範囲のドットサイズを求めることも可能…?
位置は固定のほうがいいのか。任意の位置に変更出来たほうがいいのか。
おそらく一般的には左下で固定なのだろうけど。タッチした場所がバーチャルパッドの基準位置になる=ユーザの好きな場所にバーチャルパッドを配置できるという仕様もあるそうで。どっちがいいのやら。
8方向を入力させる際に、縦横は優先したほうがいいのかどうか。
8方向の入力をさせるとして、一般的には上下左右の入力が主で、斜め入力は副なのかなと。であれば、上下左右だけ入力しやすい状態にしたほうがいいのだろうか。角度を単純に8分割するのではなく、上下左右だけ少し大きい角度にしておくとか。上下左右に、角度ではなく矩形の判定領域を設けておくとか。
下地画像はどういう表示がいいのか。
半透明・不透明、塗り・線、ただの塗り・境界線付きの塗り、等々。どれが見やすいだろうか。
タップしたら押されたと判定すべきか、ドラッグしたら押されたと判定すべきか。
タイミングゲームならタップのほうがいいのだろうか。しかし、叩いたつもりが別の位置を叩いてると判定される可能性もありそうだし。ドラッグなら、向きが入力されるから誤入力が減りそうだけど、瞬時に反映はされない予感。
ニュートラル領域はあったほうがいいのか、ないほうがいいのか。
一般的なゲームコントローラは必ずニュートラルの領域があるけど、そういう領域を用意しておいたほうがいいのかどうか。
AR-CADで画像を描きながら考え中。
バーチャルパッドの検討用画像

#2 [cg_tools] CGツールで雲の綺麗な切り抜きってどうやればいいんだろう

魔法の杖で青空部分をクリックして選択していけばええやん、と安易に考えて作業をしたのだけど。実際出来上がった雲素材を表示してみたら、グレーに近い青色の輪郭が見えてしまってとても汚い。しかし、色選択で青色部分を選んで削除してしまうと、雲の影?になった部分まで消えてしまってボリューム感が無い見た目になってしまう。何かいい手はないものか。

巷で公開されている雲ブラシを参考にしてみようと思ったのだけど。それらのブラシは、雲の影部分も透明になっていた。背景レイヤーの色がそこから透けて見えるから、最終的には影のように見えるわけで、単に絵を描くだけならそれで問題無いのだろうけど。自分の場合は、雲をスプライトとして表示したいので、ちょっと違うんだよな…。

#3 [flash] FlashDevelopでプロジェクトを閉じると必ずエラーが発生する

Windows7 x64 + FlashDevelop 4.0.4 上で、開いていたプロジェクトを閉じると、必ずエラーが発生する。
値を Null にすることはできません。
パラメータ名: fileName

   場所 System.IO.FileInfo..ctor(String fileName)
   場所 TraceUtil.PluginMain.NodeSelected(Object sender)
   場所 TraceUtil.PluginMain.HandleEvent(Object sender, NotifyEvent e, HandlingPriority prority)
   場所 PluginCore.Managers.EventManager.DispatchEvent(Object sender, NotifyEvent e)
なんでだろ…。

プラグイン TraceUtil.zip をインストールしてたせいかもしれず。試しにアンインストール(Pluginsフォルダから削除)してみたらエラーが出なくなった。

余談。他に、 _Duplicate-0.4_Plugin.fdz というプラグインもインストール済み。 ちなみに、.fdz は、FlashDevelop 上にドラッグアンドドロップすればインストールしてくれる。

2012/09/15() [n年前の日記]

#1 [cg_tools] GIMPで雲だけ切り抜く際の作業手順をメモ

こんな感じかなあ、と思える手順が見えてきたので、@wikiにメモ。

_GIMPで雲を切り抜く

「魔法の杖や色選択で切り抜けばええやん」と言われそう。絵を描く時は、それで問題無いけど。ゲーム中のスプライト等で表示しようとすると、ちとよろしくない感じなので。まあ、加算合成等、スプライトの重ね方の選択によって、素材も違ってくるんだけど。

#2 [zatta] 専業主婦が一世代云々

どこぞで「専業主婦は高度経済成長期の一世代に過ぎない」という言説を目にして、それはおかしいんじゃないかと思ったり。明治大正時代は女性の社会進出が随分難しかったはずだから、必然的に専業主婦だらけだったんじゃないのかなと。となると、高度経済成長期の一世代ってのはありえないよなと。

そういえば、明治より前、江戸時代だの、平安時代だの、そういう時代はどうだったんだろうか…?

とりあえず、なんでもかんでも高度経済成長期のせいにして済ませてしまいたい人が居るのかもしれない、という気がしてきたり。あるいは、専業主婦という言葉の定義が各人違ってるだけかもしれないか。

昔は御飯を炊くことすら一苦労だったから、働きに出るなんて無理だったはず、という印象も。

2012/09/16() [n年前の日記]

#1 [flash] AS3のVectorを使い始めたり

ActionScript 3 を勉強中なのだけど。今まで Array を使っていたものの、Vector なるクラス?にすれば多少速くなるという話を見かけて微妙に書き直し。しかし、Vectorの2次元配列をずらずら書くあたりがよく分からず。Array なら、
 var hoge:Array = [
     [0,1,2],
     [3,4,5]
     ];
という感じで書けるのだけど…。

結局、こんな感じに。
 public static const KEY_BIT_LIST:Vector.<Vector.<uint>> = Vector.<Vector.<uint>>([
     Vector.<uint>([39, B_RIGHT]),
     Vector.<uint>([37, B_LEFT]),
     Vector.<uint>([40, B_DOWN]),
      ...
     Vector.<uint>([76, B_BTN_C])
     ]);
記述が長ったらしい…。

もうちょっと違う書き方もあるみたいで。
 public static const KEY_BIT_LIST:Vector.<Vector.<uint>> = new <Vector.<uint>>[
     new <uint>[39, B_RIGHT],
     new <uint>[37, B_LEFT],
     new <uint>[40, B_DOWN],
      ...
     new <uint>[76, B_BTN_C]
     ];
少しスッキリ…というわけでもないか…。相変わらず、長ったらしい…。

#2 [neta] 美少女フィギュア型USBハブ

_ヘンテコUSBハブの数々 | LUNATIC PROPHET という記事を読んで、世の中には色んなUSBハブがあるんだなあと妙な感心をしたのだけど。記事中の、
いっそ美少女フィギュア型USBハブでも作ってみてはいかがか。

ヘンテコUSBハブの数々 | LUNATIC PROPHET より

という一文にビビッと来てしまったり。既にありそうだ、と思ったけれど検索しても見つからなかった。今なら、ブルーオーシャン…?

USB云々と言っても、美少女フィギュア型USBメモリなら、数年前に存在したらしいのだけど。

_ASCII.jp:USBメモリ内蔵のメイドさんフィギュアが今週末発売予定! メモリ内には美少女ゲームも!
_美少女フィギュア型USBメモリ(ゲーム入り) | スラッシュドット・ジャパン
_フィギュアにゲームを内蔵 | スラッシュドット・ジャパン

一度はそこまで行ったのに、USBハブにまで行かなかったのは何故なんだろう…。コスト面、技術面、形状、どこに問題があるのやら。

USBメモリの場合、持ち歩くことが前提だろうから、ガチなフィギュアは大き過ぎるし、複雑な形だから持ち歩いてるうちに壊しそうだしで、さほど受け入れられず、 _デフォルメされたフィギュアのUSBメモリ が関の山だったのかなと想像するのだけど。USBハブの場合、設置したまま動かさない場合が多いような気もするので、形状やサイズについてはまだ自由度が高い可能性がありそうな。更に、フィギュアだけでは完全に鑑賞物以外の何物でもないが、USBハブとして使えるなら「これはまだ実用性があるから!」と言い訳しやすいかもしれず(<誰に?)。

自分はそもそもフィギュアとか買わない人なんで、もし市場に出てきてもスルーしちゃうだろうけど。そういう趣味を持ってる人にとっては、フィギュアがUSBハブとして使えるってのは魅力的に見えるのだろうか。それとも、それぞれ分離してたほうが便利なのだろうか。…フィギュアの便利さってどういうもんかよくわからないけれど。

考えてみたら、熱がこもりそうか…。使ってるうちに顔の塗料や各関節が溶けてきて見た目が…てな光景を妄想したり。

#3 [anime] スマイルプリキュアのバッドエナジー空間

たまたま珍しくスマイルプリキュアの本放送を目にしたら、UMAがバッドエナジー空間とやらに入れられてしまうシーンがあり。 「こっちに来て遊ぼうよ」「こっちは楽しいよ」「楽しいねえ。面白いねえ」「君もずっとここに居ればいいよ」という誰かの声に囚われて意識が戻ってこないという描写だったのだけど。

見ていて怖くなってしまった。アレは、いい歳してアニメを見ている視聴者に対し客観視を促すメッセージ、なんだろうか…。いや、全ての事柄において、何かしら思考停止した状態があの状態と考えられなくもないような。広く一般化してその恐怖を捉えることができる、そんな描写に思えた。何にせよ、「これって今の俺? だったりしない?」と見ていて恐怖を感じたり。

考えてみれば、毎回敵がやっている「世界よ、絶望の色に染まれ」てなフィールドも怖い。取り込まれた人間や動物は暗い顔で何かブツブツと呟き始めるわけだけど。鬱病患者の心の声を垂れ流してるような光景に見えてしまうわけで。彼等の内面ではどんな思考がグルグルと渦巻いてしまっているのか、そこを想像すると、怖い。

まあ、バッドエナジー空間って怖いなあ、と思いましたとメモ。…こういうのをもっと煮詰めていくと、まどかマギカになるんだろうか、てなことも思ったりもして。

煮詰まってきたときは、少し冗談めかして、「俺、バッドエナジー空間に囚われてる!」と(心の中で)宣言すると効能がありそうな。自分がどんなモードに入っているか意識できると楽になる時もあるし。

2012/09/17(月) [n年前の日記]

#1 [cg_tools] IllustStudioが届いた

Amazonに注文していた、IllustStudioが届いたので動作確認中。

届いたパッケージに入っていたCD-ROMには、1.2.6 が入ってた。最新版 1.2.7 がWebで公開されていたのでDLしてアップデート。

ベクターレイヤーを使えば、描いた線を後から微調整できるのがイイ感じ。 *1

IllustStudio や ComicStudio の後継ソフト、CLIP PAINT STUDIO PRO が公開されていて、IllustStudio や ComicStudio のユーザは、CLIP STUDIO PAINT PRO DL版を無償で使えるらしいので、そちらもDL・インストール。IllustStudio のシリアルナンバーを登録した後で、キャンペーン云々のバナーをクリックして辿っていけばDLできる。

ついでに POSE STUDIO もDL。月額利用という扱いだけど、無料で利用ができるらしい。少し触ってみたけど、ポーズを変更するときにアニメするのがなんだかイイ感じ。ただ、IK(インバースキネマティック)機能は無いように見受けられた。実装が難しいのか、妙なポーズになりやすいからあえてつけなかったのか、単に自分が機能を見落としているだけなのか。
*1: たしかSAIにもそういう機能があったはず…。

2012/09/18(火) [n年前の日記]

#1 [cg_tools] RealWorld paintを試用してみたり

_RealWorld Paint - image editor for bloggers
_TiltStr::不定期版: RealWorld Paint 2011.1 - 更新情報

Windows用の画像編集ソフト。オプションを変更することでメニュー等を日本語化することもできる。

少し触ってみたのだけど、曲線や多角形を描画する際の仕様がなんだか面白いと思った。ドラッグすると線が描けるわけだけど。その描いた線の中間に、自動的に頂点が置かれるという仕様で。その頂点を動かすと更に辺が増えて、その増えた辺の中間にも、また頂点が自動的に作成される。つまり、最初はシンプルな形を描いて、そこからどんどん複雑な形状に変えていくことができるわけで。面白いというか、こういうやり方があったのかと感心。

タブレットの筆圧も感知してるっぽい。Intuos3で試してみたらちゃんと反応してくれた。ただ、筆圧を何に反映させるのか、そのあたりの設定を変える場所が見つからず。

#2 [zatta] 設計ミス、なのかなあ

_伊集院光が語る「オスプレイ事故における問題点」 | 世界は数字で出来ている を読んで、
「人為的ミスが出やすい設計っていうのは、設計ミスって言うんじゃねぇのって思って」

伊集院光が語る「オスプレイ事故における問題点」 | 世界は数字で出来ている より

という話に「だよなあ」と思ったり。ユーザ(?)のせいにして済ませてんじゃねえ。クソゲーはプレイしてるユーザがダメなんじゃなくて実装や仕様がダメだからクソゲーなんだろうが。みたいな。…それとはちょっと違う気もするけど。

にしても、オスプレイって本当にタッチパネルで墜落に繋がりそうなクリティカルな操作を要求されるんだろうか? スマートフォンやタブレット端末を触ればタッチパネルは誤操作を誘引すると分かるだろうに、そんなものをクリティカルな操作に使うものだろうか。気になって _「osprey cockpit」でGoogle画像検索 してみたけれど。たしかにタッチパネルがついてるように見えなくもないが、それ以前にスイッチだらけのような…。写真からはよく分からん…。

_時事ドットコム:【特集】垂直離着陸機オスプレイ を眺める限り、そもそもモードが3つあるから複雑な操作を要求される、てな話が気になるわけで。モード切替時に事故が起きてるという話を聞いた記憶もあるけれど、実際には・具体的には、どういう操作を要求されるんだろう。

何にせよ、そんなにも人為的ミスが発生しやすいなら、逆説的(?)だけどミスが発生しにくい設計に改善できる余地がどこかにあるはずだよなと。…任天堂に技術協力を仰ぐわけにはいかんのだろうか。宮本氏の一言で操作体系が劇的に改善する、そんなお花畑の展開を妄想。ありえないか。

航続距離は魅力的なので、なんとか改善してほしいけど。人間のせいにしてるようでは、改善の見込みすら断たれてしまいそうだな…。

UIの設計ミスと言えば。 :

なんとなく、自動車のソレを思い出したり。ブレーキとアクセルの踏み間違いによる事故が度々起きてるけど、アレは設計ミス、というかUIデザインミス?だよなと。

自動車のUIを、自転車のUIと比較すれば分かる。自転車なら、進むつもりで止まってしまったり、止まるつもりで進んでしまったりはしない。「進むなら踏み込め」「止まるなら握れ」なので間違えようがない。進む・止まるという操作に限定すれば、自転車のUIは、ほぼ完璧な設計。 *1

それに比べると自動車は、「進むなら踏み込め」「止まるなら踏み込め」なので、間違える場面が出てきてしまうのは当たり前。平時ならともかく、一瞬パニックになってる状態で正確に踏み分けができるのか。そのあたりを考えれば、車のUIはダメUIの典型例と言える。

人類はどこかの時点で、自動車のUIを大幅に改変しなきゃいけないと常々思うのだけど、どうにかならんのかしら。何人もの命を一瞬で奪える馬力があって、しかも何十万〜何百万もする乗り物が、下手すると1万円でも買えちゃう乗り物にも劣るUI設計のまま放置されてるのは、状況として異常なんだけどなあ…。

もしかして、オスプレイのUIもソレなんだろうか? ヘリコプター、もしくは飛行機という、旧来のUIに慣れた操縦士のために、理に適っていない・非合理的だが歴史を踏襲したUIにしたものの、ヘリコプターと飛行機を融合させたが故に一部異なる操作が混入して、それがミスの原因になっている、とか。分からんけど。

慣れた人のために、人命がかかってるが故に、非合理なれど歴史を守ったUIを維持し続けるのか。それとも、これから使うユーザのために、人命がかかってるが故に、合理的なれど歴史を無視したUIを発明するのか。車のUIはそういう問題が突きつけられて、人類は前者を選び続けてるわけだけど。本当にソレでいいんだろうか。

QWERTY配列のキーボード。MS-Officeのリボンインターフェイス。Windows8 の旧称メトロスタイル。WebサイトUI設計。そのあたりも関係してそうな。それらは人命なんて関係ないけど、それでもこんなに試行錯誤しているわけで。…人命がかかってないから積極的に試行錯誤してるのかもしれんけど。

*1: ついでに言えば、人間は猿から進化したので、緊急時に手を握ることで動作を止めるという設計は理に適ってる。木にぶら下がった状態の猿が、危機に遭遇した際に手をパッと開く性質を持っていたら、落下して地面に叩きつけられて死んでしまう。そんな性質の猿は、種として生き残るのは難しい。つまり、今も生き残ってる猿は ―― 人間と呼ばれている、この猿は、とっさの場面では本能的に手を握るはずなのです。…樹上生活なんてはるか昔に忘れてしまった種なので、性質が変わってる可能性も高そうだけど。

2012/09/19(水) [n年前の日記]

#1 [pc] Windowsで使えるMarkdown用エディタって無いのかな

Macで使えるMarkdownエディタはたくさんあるみたいなんだけど。Windows用は…。

_MarkDown#Editor というエディタが公開されて喜んだものの、自分の環境、Windows7 x64 + MarkDown#Editor 1.0.4.0 では、動作が怪しくて。 謎だ…。巷ではその手の不具合話を見かけてないので、自分の環境に起因する問題なのかなあ。

とりあえず、 _MarkdownPad で少し凌いでる状態なのだけど。これは日本語のインライン入力ができないし。

オンラインで使える、 _Markdown Editor を使うという手もあるのかもしれん、ファイルを開いたり保存したりできるようではあるし、と思ったものの、手元の .md ファイルを開こうとしたら「プレーンなテキストファイルしか開けねえよ」と文句を言われた。もしかして utf8n のファイルは開けないのかな。

Pythonで作れないかな。 :

いっそ自分で作れないものか。Python + PyQt4 (QtWebKit) + cMarkdown あたりで。

_Python用のMarkdownを扱うモジュールを比較してみた | hexacosa.net
_paulsmith/cMarkdown
_QWebView Class Reference

wxPython を使えないかと思ったけれど、たしか wxPython は日本語のインライン入力ができないというバグがあったような…。

_Dirty Sexy Query: Sphinx までたどりつけない Windows ユーザー放浪記
_高機能なテキストエディタEditraと日本語入力について - きままなたぐりぶろ(日記)
_雑草ブログ wxStyledTextCtrlでの日本語入力に難がある件について
_wxstcの日本語入力(ただしWindows版のみ) - きままなたぐりぶろ(日記)

Python に標準で入っている tkinter で作れたらいいなと思ったけれど、Tk で html表示をする方法が分からない。TkHTML という単語も見かけたけど、何をするものなのか分からず。

Rubyで作れないかな。 :

markdownパーサはたくさんあるらしい。

_Rubyで使えるMarkdownパーサー | ひげろぐ
_[メモ] Rubyで使えるMarkdownパーサ - tetralabo
_The Ruby Toolbox - Markup processors

_BlueFeather は、以前インストールして、便利だなと思った記憶が。

リアルタイムプレビューをすることを考えると、変換速度が速いほうがいいのだけど。ベンチマークの類が見当たらず。 _rake - Better ruby markdown interpreter? - Stack Overflow しか見つからなかった。

問題は GUI。Ruby の GUIライブラリは…うーん。htmlを表示できるウィジェットを持ってるライブラリってあるのかな?

Ruby や Perl の場合、ローカルでサーバ立ててブラウザで表示しろ、みたいな話になっていくのだろうか。わからんけど。しかしそうなると、ブラウザ+JavaScript (+ showdown.js)でいいんじゃない? という話になってしまいそうな。

2012/09/20(木) [n年前の日記]

#1 [python] wxPythonを少し勉強してるけど

Windows7 x64 + wxPython 2.9.4.0 で、xrced がバグってるな…。編集中に、ルート?が勝手に何か別のウィジェットに置き換わってしまうような。

wxPython 2.9.4.0 をアンインストールして、2.8.12.1 をインストールしてみたけれど。コレもコレで、xrced がエラーを出しまくり。とりあえず wxPython 2.9.4.0 に戻したり。

以前もそうだったけど、どうも xrced は怪しい…。

他にもこの手のツールは無いのかなと探してみたら、wxGlade が見つかった。…前にも少し触った記憶があるような。wxGlade-SAE-0.6.5-setup.exe をDL・実行してインストールしてみたけれど、こちらのほうが安定動作するように見えた。しかし、wxGlade-0.6.5-setup.exe と wxGlade-SAE-0.6.5-setup.exe、つまり無印版とSAE版の2種類があるらしく。SAE って何を示しているんだろう…? *1

wxPythonでhtmlを表示するには。 :

htmlwindowというウィジェット?があって、それを使えばhtml表示ができるらしいのだけど。他の基本的なウィジェットと同じように配置する方法が分からず…。

*1: もしかすると、実行に必要なアレコレが同梱されてる版、ということなんだろうか。わからんけど。

#2 [python] PyQtを少し勉強

PyQt なら、Qt Designer なるツールを使ってGUIデザインができるらしいので、少し触ってみたり。こちらなら wxPython と違って、QTextEdit の隣に QWebView を配置する、てなことがすんなりできた。

調子にのってそのまま試用。 _Simple text editor in PyQT4 というページが参考になった。 このあたりでちょっとハマったのでメモ。

Qt Designer の使い方は、以下の記事が参考になった。

_Qt をはじめよう! 第13回: GUI デザイナを使おう
_Qt をはじめよう! 第14回: GUI デザイナでのレイアウトに慣れよう!

PyQt の場合、シグナル・スロット接続の書き方には新旧スタイルがあるらしく。新スタイルのほうが記述がちょっと短め。

_PyQt4 | saito's memo
_PyQt4 のシグナル/スロットの新旧スタイルの違いを比較するサンプル - forest book

2012/09/21(金) [n年前の日記]

#1 [python] cMarkdownがインストールできない

WIndows7 x64 + Python 2.7.3 の環境で、 _cMarkdown という、Markdownをhtmlに変換するモジュール?ライブラリ?をインストールしようとしてハマる。pip install cMarkdown でインストールできるらしいのだけど。vcvarsall.bat がどうのこうのとエラーを出して、インストールできてないようで。

以下の記事で、pathが通ってないとダメらしいと知る。

_easy_install pysnmpしようと思ったらvcvarsall.bat無いよエラー。 - 試行錯誤と創意工夫(S!アプリ開発日記+α)

以前何かの折にインストールしておいた Visual C++ 2010 Express のインストールフォルダ以下、Common7/ と VC/ までpathを通してみたものの、変化無し。

以下の記事によると、Visual C++ 2010 ではなく、2008 じゃないとダメらしい。

_機種依存文字対策でpykfをインストールしてみた
_Python: Unable to find vcvarsall.bat | Slacy’s Blog

Visual C++ 2008 Express をインストールしてから再度試してみた。コンパイル時にエラーだらけになっているように見える。…もしかして、cMarkdown ってのは、Linux 環境のことしか考えてないのだろうか。いや、でも、vcvarsall.bat がどうとか言ってきたあたり、一応考慮してそうな気もするんだけど、どうなってんだろう…?

_cMarkdown を選ぶなら misaka でいいと思う という話も見かけたので、そちらでも試してみたり。pip install misaka と打ってみた。stdint.h が見当たらねえよ、とエラーが出た。

色々検索してみたら、どうも Visual C++ 20?? あたりでは、stdint.h なんてものは存在しないらしく。C99 が云々とかで。つまり、stdint.h を要求してくる時点で、C向けのライブラリを使った Python の Markdown 向けモジュールは、最初から Windows で使われることを想定していないモジュールばかり、ということが分かった。ぎゃふん。

速度は遅いけど、Pure Python のモジュールを使うしかないのか…。

python-markdown2をインストールしてみたり。 :

_Graceful Exit - Markdown 処理系の比較 によると、python-markdown より速い python-markdown2 というのがあるらしく。

_trentm/python-markdown2

pip install markdown2 と打ってインストールしてみたり。

動作確認。
>>> import markdown2
>>> markdown2.markdown("*em tag* **strong tag**")
u'<p><em>em tag</em> <strong>strong tag</strong></p>\n'
markdown 形式の文字列が、html形式に変換された。ちゃんと動いてるっぽい。

2012/09/22() [n年前の日記]

#1 [python] Qt Designerを勉強中

Qt Designer 上でツールバーを作る方法が分からなかったのだけど。以下のページで作り方を知った。

_Qt 4.7: Creating Main Windows in Qt Designer
_月の杜工房 - Qt メインウィンドウ

フォーム? フレーム? の上で右クリックして、「ツールバーを追加」を選べば、追加できたのか…。

ツールバー上にボタンを追加する流れとしては、アクションエディタというウインドウにメニューに追加した項目が全部並んでいるので、その中の項目名をツールバー上にD&Dするだけでいいらしい。

メニュー項目、及びツールバーにアイコン画像を表示するには、リソースファイルなるものが必要らしく。これは、リソースブラウザ経由で作ることができる。
  1. リソースブラウザの「リソースを編集」ボタン(鉛筆アイコンのボタン)をクリック。
  2. 「新しいリソースファイル」ボタンを押して、適当な名前でリソースファイル名を指定。resources.qrc とか。
  3. 「プレフィックスを追加」ボタンを押して、適当な名前で以下略。
  4. 「ファイルを追加」ボタンを押して、アイコン画像を追加。
ツールバー上のアイコンサイズは、デフォルトでは24x24が設定されているっぽい。とりあえず、Pythonスクリプトを置いているフォルダに、res/ というフォルダを作成して、その中に入れることにした。アイコン画像は、以下の記事を参考にして入手。

_パブリックドメインやGPLライセンスの高品質なアイコンをパッケージで配布しているOpen Icon Library - かちびと.net
_Open Icon Library - Free/Open Icons

Public Domain package (open_icon_library-PD-0.11.tar.bz2) をDLさせてもらったり。

リソースブラウザにアイコン画像を追加出来たら、アイコンを、アクションエディタの各項目の一番左の空欄の四角までD&Dすると、メニュー及びツールバーにアイコンが反映される。

このままだと、.qrc というファイルとしてリソースファイルが保存されるので、これを PyQt から使えるようにしないといけない。pyrcc4 を使って 〜_rc.py に変換する。

_python - Compiled code does not load image using qrc in pyqt4 - Stack Overflow
pyrcc4 -o resources_rc.py resources.qrc
resources.qrc を、resources_rc.py に変換している。pyrcc4 --help でオプションが表示されるのだけど、-compress level なる項目が気になる…。画像を圧縮する際のレベルを指定できる? しかし、どの範囲の値を指定すればいいのか分からない。

とりあえず、Markdownのプレビューはできるようになった。 :

Python 2.7 + PyQt4 + markdown2 で、Markdown を htmlでプレビュー表示できるようになった。とりあえず、ポイントだけメモ。
from PyQt4 import QtCore, QtGui, QtWebKit
from mywebview import Ui_MyWebView
import codecs
import markdown2

...

HTML_HEADER = """
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
</head>
<body>
"""

HTML_FOOTER = """
</body>
</html>
"""

...

    def convert_md_to_html(self):
        """左ウインドウ内のMarkdownをhtmlに変換"""
        self.md_text = unicode(self.ui.editor_window.toPlainText())
        self.html_text = markdown2.markdown(self.md_text)
        self.html_data = HTML_HEADER + self.html_text + HTML_FOOTER
        return self.html_data

    def reload_html(self):
        """WebViewを更新"""
        if not self.converting:
            self.converting = True
            self.convert_md_to_html()
            self.ui.my_webview.setHtml(self.html_data)
            self.converting = False
エディタ部分の各仕様はまだ全然実装してないので、そのあたりを書かないと。

今現在、QTextEdit内が修正される度に、毎回、markdown2 で変換 → QWebView でHTML表示、という処理ををしているけれど。長い Markdown ファイルを書いた場合は、たぶん処理が間に合わなくなるであろう予感も。なので、修正を加えてから一定時間入力が無ければ変換・描画更新をする、という仕様にしたほうが良さそうなのだけど。Python の threading.Timer を使ったらスクリプトがフリーズ。どうしたもんか…。

QTimer というクラスがあるらしい。指定ミリ秒間隔で処理をする、といったことができる模様。それを使えばフリーズはしなかった。しかし、編集後、プレビューに反映されるまで数秒かかるのは、操作感覚として何かしっくりこない感じで。何かしら打ち込むたびにガンガン更新してくれるほうがしっくりくるような。

2012/09/23() [n年前の日記]

#1 [python] PyScripter上でPyQt4の補完を有効にする方法

Windows7 x64 + PyScripter 2.5.3.0 上で、PyQt4 の補完が効かないなー、と悩んでたのだけど。配布サイトのFAQに設定方法が書いてあった…。

_FAQ - pyscripter - An open-source Python Integrated Development Environment (IDE) - Google Project Hosting

  1. ツール → IDEオプション → Special packages の最後に、「PyQt4」を追加する。(自分の環境の場合、該当項目は、「os, wx, scipy, PyQt4」になった。)
  2. ツール → Edit Startup Scripts を選び、pyscripter_init.py の最後のあたりに、「from PyQt4 import QtCore, QtGui」を追加する。
  3. PyScripter を再起動。自分の書いたスクリプトの最初のあたりで、「from PyQt4 import QtCore, QtGui」等を書く。
これで補完が効くようになった。ありがたや。

QMainWindowの閉じるボタンを押した時の処理。 :

ウインドウを閉じる前に「ファイルが保存されてないけど終了するのか?」的な問い合わせをしたいなと。QMainWindow のその手のイベント処理を書くにはどうしたら…。

_python - PySide / PyQt detect if user trying to close window - Stack Overflow にやり方が書いてあった。QWidget or QMainWindow と書いてあるので、QMainWindow も closeEvent(self, event): を書けば反応してくれるらしい。
    def closeEvent(self, event):
        """アプリを閉じようとした際の処理"""
        if self.check_saved():
            event.accept()
        else:
            event.ignore()
self.check_saved() は、自作メソッド(?)で、ファイルが編集されてたら保存するかどうかを尋ねる処理。キャンセルされたら False が返るので、event.ignore() が呼ばれて終了処理がキャンセルされる。

_なんにもない: 閉じるボタンの制御とメッセージボックス も参考になった。

QFontがよく分からない。 :

PyQt には _QFontComboBox というフォント名を選択できる ComboBox があって。 QFontComboBox.currentFont (self) で現在選択中のフォント情報を QFont というクラスで取得できるはず、なのだけど。QFont.toString() で文字列(QString)に変換したソレを表示したところ、英数字のフォント名を選んだ際はソレらしい文字列が表示されるものの、日本語のフォント名を表示しようとするとエラーが表示されてしまう。どうも英数字のフォント名しか考慮されてないっぽい?

_QFontDialog の getFont() で取得した QFont を、そのまま QTextEdit.setFont( QFont ) に突っ込んだら反映されたようではあるのだけど。文字列等で、何のフォントを選んだのか取り出せない・取り出そうとするとエラーが出るのでは、設定ファイル等に記録することができない。つまり、毎回フォントを選択し直さないといかんわけで。

PyQt が英語圏のことしか考えてないのか、それとも何か回避策があるのか。よく分からない…。

QCheckBoxに対する処理。 :

何かしらからチェックボックスのON/OFFを切替える際の処理をメモ。これで正しいのか分からんけど。
        # チェックボックスに動作を割り当てる
        self.ui.checkbox_preview.stateChanged.connect(self.chg_cb_value_set)
    def chg_auto_reload(self):
        """HTML自動更新チェックボックスの値を反転させる"""
        cb = self.ui.checkbox_preview
        if cb.checkState() == QtCore.Qt.Checked:
            cb.setCheckState(QtCore.Qt.Unchecked)
        else:
            cb.setCheckState(QtCore.Qt.Checked)

    def chg_cb_value_set(self):
        """HTML自動更新チェックボックスの値が変わったら呼ばれる処理"""
        if self.ui.checkbox_preview.checkState() == QtCore.Qt.Checked:
            self.auto_reload = True
            ## print "Auto Reload On."
        else:
            self.auto_reload = False
            ## print "Auto Reload Off."
別の何かから、チェックボックスのON/OFFを変更したら、チェックボックスの値が変わった時に呼ばれる処理も、その直後にちゃんと呼ばれることに気付かなくて少しハマった。延々と切り替え時の処理が呼ばれてしまう羽目に。

2012/09/24(月) [n年前の日記]

#1 [python] ツールバー用のアイコン画像を作成

ここ数日 PyQt を勉強中なのだけど、ツールバー用のアイコン画像に、 _Open Icon Library のアイコン画像を使わせてもらっていたわけで。この Open Icon Library のアイコン画像群、 _ライセンス毎に分類した圧縮ファイルが用意 されていてありがたい。今回は GPL と Public Domain のアイコン画像をDLさせてもらったり。

しかし、足りないアイコンが出てきてしまって。仕方ないので自分で描いてるうちに、他のアイコン画像と絵柄が一致してないのが気になって。結局、EDGE2を起動して全部自分で描いてしまった。

こんな感じ。
ツールバー用自作アイコン画像

_ツールバー用自作アイコン画像のzip

Public Domain ってことで。24x24ドットです。

Qt Designer でツールバーを追加すると、初期状態は24x24ドットだったので、そのサイズで作ってしまったけれど。なんだかサイズが大き過ぎるような気も。ツールバーのアイコンって一般的には何x何ドットなのだろう…。

pythonでcsvファイル読み込み。 :

import csv で色々できるらしい。

_csv - カンマ区切りのファイル - Python Module of the Week
_13.1. csv - CSV ファイルの読み書き - Python 2.7ja1 documentation

あっさり読めた。素晴らしい。と思ったが、csvファイル中の「\n」が、「\n」のままで改行にならない…。

csvファイル中の文字列中に改行を入れたいなら、文字列を「"」で挟んで、実際に改行を入れてしまえばいいらしい。
"idlink","[Text] [ID]

[ID]: URL ""Opt Title"""
また、「"」で挟んだ文字列中に「"」を入れたい場合は、「""」と書くことで「"」を含ませることができるらしい。

_ダブルクォーテーション 「"」を扱う | MEMO-LOG
_CSV ファイルに関する個人的メモ

Python の csvモジュールでは、改行も、「""」も、どちらも正しく読み取ってくれた。ただ、日本語文字列では試してない。

pythonのwithがよく分からない。 :

csv モジュールのサンプルを見ていて、with って何だろうと。エラー処理と関係あるらしいのだけど…。

_python2.6からwith文つかえる! - $ tail -f /var/log/yamaneko

実際にエラーが出るようにして動作確認。
    except IOError, inst:
        sys.stderr.write (str (inst) + '\n')
IOError が発生した際に、inst にエラー種類が入ってくれるらしい。

open() で使ってる事例しか見かけなかったので、 codecs.open() では使えないのかなと不安になったが、使ってる事例を見かけて安心。with を使うように自分も修正したり。

_ユニコード文字列を含むファイルの読み書きにはcodecsを使う - AtAsAtAmAtArA

Aboutダイアログの表示。 :

ヘルプ→aboutを選んだ際に、どうやって、何のダイアログを表示すればいいのか分からなかったけど。とりあえず、QMessageBox でどうにか。
    def display_about(self):
        """Aboutダイアログを表示"""
        s = "%s\n%s" % (WDW_TITLE_DEF, VER)
        QtGui.QMessageBox.information(self, "About", s, QtGui.QMessageBox.Ok)
_QMessageBox Class Reference を眺めると、QMessageBox.about() てのもあるみたいなのだけど。表示してみたら、何か違う感じ…。

いや、やはり一般的には、QMessageBox.about() を使うっぽい。

_PySideSimplicissimus_Module_5_Combine_Japanese | Qt Wiki | Qt Developer Network

PySide の事例だけど、なんだかそれらしい文字列を表示しているような。

2017/03/19追記。 :

Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。

2012/09/25(火) [n年前の日記]

#1 [python] QTextEdit上で文字列挿入

PyQt勉強中なわけだけど、 _QTextEdit で文字列挿入などの処理をしたいなと。

コピー、カット、貼り付け、全選択は、.copy()、.cut()、.paste()、.selectAll() があるので問題無し。.clear() で全削除もできるけど、これを使うと「元に戻す」= .undo() の履歴も全て消えるので注意。

現在のカーソル位置に文字列を挿入したいだけなら、.insertPlainText("文字列") を使えばいい。

カーソル位置を少し変更したいなら、.moveCursor() が使える。引数に、 _QTextCursor.MoveOperation を渡せば、行頭移動、行末移動等、カーソル位置を変えられる。.moveCursor(QtGui.QTextCursor.StartOfLine) なら行頭に移動、みたいな。

選択範囲がある場合の手順がよく分からず。どうやら、.textCursor() を呼ぶことで _QTextCursor を取得して、それを使ってどうにかする、のかな?

以下は、QTextCursor を使ってできること。 そんな感じっぽい。間違ってるかもしれんけど。いや、一応手元ではそういう感じで実現できているのだけど。もっと上手いやり方があるのかもしれない。

スクリプト側から選択範囲を作れたら、もう少し色々できるのかもしれんけど。まだそこまで分かってない。英語はちんぷんかんぷんなので。

一応、ソースコードの断片をメモ。
    def ins_put(self, mark):
        """行中で単語をmarkdown用記号で挟み込む"""
        cursor = self.ui.editor_window.textCursor()
        if cursor.hasSelection():
            # 選択範囲有り
            selstr = cursor.selectedText()    # 選択範囲の文字列を取得
            cursor.beginEditBlock()
            cursor.deleteChar()                            # 選択範囲を削除
            cursor.insertText(mark + selstr + mark)        # 文字列挿入
            self.ui.editor_window.setTextCursor(cursor)    # カーソル位置を反映
            cursor.endEditBlock()
        else:
            # 選択範囲無し
            self.ui.editor_window.insertPlainText(mark + "Text" + mark)
editor_window てのは、QTextEdit の objectName。

#2 [nitijyou] 目が真っ赤

右目の左下が真っ赤で痛みが。寝たら治るかなと思ったけど、改善せず。これはなんだろう…。

2012/09/26(水) [n年前の日記]

#1 [python] QTextEditで実験中

PyQt の QtextEdit を勉強中。

行の区切り文字。 :

QTextCursor.selectedText() で選択範囲の文字列を取得した後、改行コード("\n") で split() してリストを得れば、行単位で処理ができるかも、と思ったものの。試してみると上手く行かずにハマったり。

_QTextCursor Class Reference を読んでみたら、どうも Unicode U+2029 paragraph separator character なるものでどうにかしろと書いてあるようで。試しに、.split(u"\u2029") としてみたら、一応行単位でリストに出来たように見える。これで合ってるのかどうかわからんけど。

.replace() で \n に変換せよ、と書いてあるようにも見えるのだけど、そのようにしてみたら、謎の文字が混入するように見えた。なんでだろ。

Undo/Redoの有効無効。 :

Undo/Redoが使えるか使えないかを、ツールバー上のボタンやメニュー項目に反映させたいなと思ったのだけど、やり方が分からず。

_Index of /doc/PyQt4-devel-4.8.6/examples/demos/textedit の textedit.py にやり方の例が書いてあった。重要なところだけ引用。
        self.textEdit.document().undoAvailable.connect(self.actionUndo.setEnabled)
        self.textEdit.document().redoAvailable.connect(self.actionRedo.setEnabled)

        self.actionUndo.setEnabled(self.textEdit.document().isUndoAvailable())
        self.actionRedo.setEnabled(self.textEdit.document().isRedoAvailable())
おそらくだけど、 .undoAvailable()、.redoAvailable() が、Undo/Redoの履歴に変化があった時に出てくるシグナル(イベントみたいなもの?)じゃないかと。そして、actionUndo は、おそらくUndo用に用意されたメニュー項目。setEnabled() は、項目を有効にするか無効にするか指定出来て。QTextEdit.document() が Undo/Redoができるかどうかを .isUndoAvailable()、.isRedoAvailable() で持っているから、ソレをそのまま渡して有効無効を切替える。のかなと。自信無いけど。

2012/09/27(木) [n年前の日記]

#1 [python] ツールバー用アイコン画像を作成し直し

やはり24x24ドットのアイコンは大き過ぎる気がしてきたので、16x16ドットのアイコン画像を作成し直し。

ツールバー用16x16ドットアイコン画像

_ツールバー用16x16ドット自作アイコン画像のzip

CC0 / Public Domain ってことで。

さすがにこのくらい小さくなると、くっきりしたアイコンのほうが見やすいので、黒と白の0/1を意識して描いてみたり。しかし、この絵柄(?)は…。いつの時代のアイコンだよ、という気も。*NIX の X-Windowアプリっぽい。今時コレはない。でも、見やすいから、これはこれで。

描いていてなんとく思ったけれど。アイコンとして求められる種類にはどんなものがあるか、てな一覧がどこかにないものかと。もっとも、アプリによって持っている機能が違うから、そうそう一覧を作れないのかもしれないけれど。

2017/03/19追記。 :

Dropboxのpublicフォルダが死んだのでファイルの置き場所を変更。

2012/09/28(金) [n年前の日記]

#1 [python] QTextCursorを勉強中

PyQtを勉強中。

行の複製をやりたかったのだけど、たぶんできたっぽい。
    def duplicate_line(self):
        """行を複製"""
        self.textEdit = self.ui.editor_window
        c = self.textEdit.textCursor()
        qb = c.block()          # QTextBlock を取得
        qs = qb.text()          # QTextBlock内の文字列を取得
        c.beginEditBlock()      # Undo履歴の制御
        if not c.atBlockStart():
            # Blockの頭(=行頭)にカーソルが無いので、行頭にカーソルを移動
            c.movePosition(QtGui.QTextCursor.StartOfBlock)
        c.insertText(qs + "\n")     # Block文字列を挿入
        c.endEditBlock()        # Undo履歴の制御

QtextCursor.columnNumber() で、行頭から何文字目にカーソルがあるのか取得できるかなと思ったけれど。値を確認してみたら、あくまで見た目の文字数で。1行が長くて折り返し表示されている状態では、行頭から何文字目なのか取得できないので、判定等には使えない感じ。どうやら QtextCursor においては、block という種類が見た目ではない1行分に相当するらしい。自信無いけど。

論理行、物理行と呼べればいいのだけど。 :

_物理行と論理行 - 永遠に未完成 を読む限り、定義がグチャグチャらしく。これは困った…。

2012/09/29() [n年前の日記]

#1 [python] まだQTextCursorを勉強中

PyQt勉強中。

選択範囲を複製したい。 :

QTextCursor を使って選択範囲を複製しようとして悩んだり。文字列を挿入すると、複製前と複製後の文字列の両方が選択状態になってしまう。挿入後に選択範囲を作り直さないといかんような気がするけど、どうすれば…。

こんな感じになった。
    def duplicate_line(self):
        """行を複製"""
        self.textEdit = self.ui.editor_window
        c = self.textEdit.textCursor()
        if c.hasSelection():
            # 選択範囲有り
            c.beginEditBlock()          # Undo履歴の制御
            s = c.selectedText()        # 選択範囲の文字列を取得

            sel_s = c.selectionStart()  # 選択範囲の開始位置を取得
            sel_e = c.selectionEnd()    # 選択範囲の終了位置を取得

            c.clearSelection()          # 選択範囲を解除
            c.setPosition(sel_e)        # 元選択範囲の終了位置にカーソル移動
            c.insertText(s)             # 文字列挿入

            # 選択状態を復元する。
            # アンカー変更を伴うカーソル移動後に、
            # アンカー変更をしないカーソル移動をして、選択状態にする。
            sel_s = sel_e
            sel_e = c.position()
            c.setPosition(sel_s, QtGui.QTextCursor.MoveAnchor)
            c.setPosition(sel_e, QtGui.QTextCursor.KeepAnchor)

            c.endEditBlock()                # Undo履歴の制御
            self.textEdit.setTextCursor(c)  # QTextEdit上でカーソル位置反映

        else:
            # 選択範囲無し
            qb = c.block()              # QTextBlock を取得
            qs = qb.text()              # QTextBlock内の文字列を取得
            c.beginEditBlock()
            if not c.atBlockStart():
                # Block頭(行頭)にカーソルが無い。
                # (内部的に)カーソルを行頭に移動
                c.movePosition(QtGui.QTextCursor.StartOfBlock)
            c.insertText(qs + "\n")     # Block文字列を挿入
            c.endEditBlock()

            # QTextEdit上ではカーソル位置を反映させてないので、
            # カーソル位置は以前のまま

  • 選択範囲の開始位置を知りたい。 → QTextCursor.selectionStart()
  • 選択範囲の終了位置を知りたい。 → QtextCursor.selectionEnd()
  • カーソル位置を変更したい。 → QTextBlock.setPosition()
選択範囲を作りたいときは、アンカーというものが関係してくるらしい。アンカーがある場所から、現在のカーソル位置までが、選択範囲になるようで。ただ、QtextCursor.setPosition() を使ってカーソル移動した際、デフォルトではカーソル移動と同時にアンカーも移動するモードになっているので、選択範囲は作られない。選択範囲を作りたいなら、アンカーを動かさずにカーソル位置だけ変えないといけない。その場合、QTextCursor.setPosition() に、QtGui.QTextCursor.KeepAnchor を指定する。
  • QtextCursor.setPosition( 位置情報 ) ... カーソルとアンカーを移動する。
  • QtextCursor.setPosition( 位置情報, QtGui.QTextCursor.KeepAnchor ) ... アンカーは移動せずにカーソルだけ移動する。

QWebViewの表示位置を変えたいのだけど。 :

QTextEdit で修正している箇所に合わせて、QWebView のページ表示位置も変更したい・ページをスクロールしたいのだけど。どうすればいいのやら…。

最低限、QTextEdit で文末を編集中に、QwebView の一番下を表示するようにしたい。カーソルが文末(文書の末尾)にあるかどうかは、QTextCursor.atEnd() で調べることができるので、QTextEdit 内が変更されるたびにカーソルが文末にあるか調べて、あるなら、QwebViewの表示を一番下にすればいい…はずなのだけど。QWebView の表示状態を変更する方法が分からない。

QWebView.triggerPageAction() を使えばできるかなと思ったけれど、そういうわけでもないようで。さて、どうすれば…。

とりあえず分かった部分をメモ。

スクロールバー関連を操作するには、QWebView.page().mainFrame() からアクセスするらしい。

表示しているページの縦横サイズ(ウインドウからはみ出ている部分も含む?)を取得するなら、QWebView.page().mainFrame().contentsSize() を使う。ただし、そのまま呼ぶと (0,0) が返ってきてしまう時がほとんどで。値をちゃんと取得したいなら、mainFrame() が contentsSizeChanged() のシグナル?を出してきたときに処理をする。
        # QWebView内サイズが変更された際に呼ばれる処理を指定
        self.mainframe = self.ui.my_webview.page().mainFrame()
        self.mainframe.contentsSizeChanged.connect(self.chg_contents_size)

        ....

    def chg_contents_size(self):
        """QWebView内のサイズが変更された際に呼ばれる処理"""
        c_size = self.ui.my_webview.page().mainFrame().contentsSize()
        self.mainframe_w = c_size.width()
        self.mainframe_h = c_size.height()
        print "frame w,h=%d,%d" % (self.mainframe_w, self.mainframe_h)

QWebFrame.geometry() というのもあるらしいのだけど…。

2012/09/30() [n年前の日記]

#1 [python] QWebViewを勉強中

PyQt勉強中。Webページを表示できる QwebView について色々調べてるところ。

スクロールバーを制御できなくて悩んでたけど。どうやら、QWebView.page().mainFrame() がページ読み込み終了していない状態でスクロールバーを弄ろうとしていたのが原因だったらしい。mainFrame() 、というか QWebFrame() は、ページ読み込み終了時に loadFinished() を発生させるので、そこでフラグを立てて、そのフラグを見ながらスクロールバーを制御するようにしてみたり。

また、編集ウインドウ(QTextEdit)内でカーソル位置が変わった際に、cursorPositionChanged() が発生するので、その中でもスクロールバーを制御するようにした。

とりあえず、分かった範囲でメモ。
ソースは以下のような感じに。
        # 編集ウインドウ内でカーソル位置が変更された際に呼ばれる処理を設定
        self.ui.editor_window.cursorPositionChanged.connect(self.chg_position)

        # QWebView内サイズが変更された際に呼ばれる処理を指定を設定
        self.mainframe = self.ui.my_webview.page().mainFrame()
        self.mainframe.contentsSizeChanged.connect(self.chg_contents_size)

        # QWebViewで読み込み終了時に呼ばれる処理を設定
        self.mainframe.loadFinished.connect(self.load_finished)
    def chg_position(self):
        """編集ウインドウ内でカーソル位置が変更された時に呼ばれる処理"""
        if  self.load_success:
            self.textEdit = self.ui.editor_window
            c = self.textEdit.textCursor()
            bcnt = self.textEdit.document().blockCount()    # 文書行数
            ncnt = self.textEdit.textCursor().blockNumber() # 現在の行位置

            # 編集ウインドウ内カーソル位置によってスクロールバーの値を変更
            if c.atEnd():
                # ページ文末までスクロール
                self.scroll_page_end()
                self.scrl_per = 100
            elif c.atStart():
                # ページ文頭までスクロール
                self.scroll_page_start()
                self.scrl_per = 0
            else:
                # 大味の割合でスクロール
                self.scrl_per = int(ncnt * 100 / (bcnt -1))
                self.scroll_page_per(self.scrl_per)
    def chg_contents_size(self):
        """QWebView内のサイズが変更された際に呼ばれる処理"""

        # ページサイズを取得する
        c_size = self.ui.my_webview.page().mainFrame().contentsSize()
        self.mainframe_w = c_size.width()
        self.mainframe_h = c_size.height()
        ## print "frame w,h=%d,%d" % (self.mainframe_w, self.mainframe_h)

        if False:
            self.mainframe = self.ui.my_webview.page().mainFrame()
            self.mainframe_vw = self.mainframe.geometry().width()
            self.mainframe_vh = self.mainframe.geometry().height()
            print "view w,h=%d,%d" % (self.mainframe_w, self.mainframe_h)
    def load_finished(self):
        """QwebViewのロード終了時に呼ばれる処理"""
        self.load_success = True

        # 編集ウインドウ内カーソル位置によって、
        # スクロールバーの値を変更する
        c = self.ui.editor_window.textCursor()
        if c.atEnd():
            # ページ文末までスクロール
            self.scroll_page_end()
        elif c.atStart():
            # ページ文頭までスクロール
            self.scroll_page_start()
    def scroll_page_start(self):
        """QWebViewに対してページ文頭までスクロール"""
        self.mainframe = self.ui.my_webview.page().mainFrame()
        orient = QtCore.Qt.Vertical
        svmin = self.mainframe.scrollBarMinimum(orient)
        svmax = self.mainframe.scrollBarMaximum(orient)
        self.mainframe.setScrollBarValue(orient, svmin)

    def scroll_page_end(self):
        """QWebViewに対してページ文末までスクロール"""
        self.mainframe = self.ui.my_webview.page().mainFrame()
        orient = QtCore.Qt.Vertical
        svmin = self.mainframe.scrollBarMinimum(orient)
        svmax = self.mainframe.scrollBarMaximum(orient)
        self.mainframe.setScrollBarValue(orient, svmax)

    def scroll_page_per(self, per):
        """QWebViewに対して指定の割合でスクロール。
        割合は、0〜100 を与える。"""
        self.mainframe = self.ui.my_webview.page().mainFrame()
        orient = QtCore.Qt.Vertical
        svmin = self.mainframe.scrollBarMinimum(orient)
        svmax = self.mainframe.scrollBarMaximum(orient)
        v = int(((svmax - svmin) * per / 100) + svmin)
        self.mainframe.setScrollBarValue(orient, v)

全然関係ないけど。 :

どうもここ数日、苦行のADVゲームをやり続けている気がする…。しかも8bitPC時代の、コマンド入力型のADVゲーム。この単語は通るのか、通らないのか、通るとしたら何が出てくるのか、みたいなことを延々やってるような。

英語がすらすら読める人なら、PyQtはドキュメントも豊富、公式のドキュメントを眺めるだけで何ができるか分かる、と言い切れるのだろうけど。英語赤点の自分にとっては、ドキュメントは皆無に等しい。ただ、コマンド一覧だけはちゃんとある、みたいな状態。

別の何かで作れば、日本語で書かれた解説文書もたくさんあったりして、サクサク進んだのだろうなあ。でも、コンパイルしてバイナリを作るタイプの何かでは、作る気が起きないし。クローズドソースでバイナリだけ公開されているアプリがバグだらけで辟易したから、Python + PyQt4 で書けないかなと夢想しちゃったわけで…。スクリプトなら、誰でもソース見て「ここがマズいんじゃね?」と指摘できる可能性がありそうだよなと。

しかし、考えてみたら、ブラウザ + JavaScript で動く海外製 Markdownエディタのマズいところを少し修正、のほうが早かったんじゃ…?

以上、30 日分です。

過去ログ表示

Prev - 2012/09 - 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

カテゴリで表示

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


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

Powered by hns-2.19.6, HyperNikkiSystem Project