Home > Latest topics

Latest topics 近況報告

たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。

萌えるふぉくす子さんだば子本制作プロジェクトの動向はもえじら組ブログで。

宣伝1。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

宣伝2。Firefox Hacks Rebooted発売中。本書の1/3を使って、再起動不要なアドオンの作り方のテクニックや非同期処理の効率のいい書き方などを解説しています。既刊のFirefox 3 Hacks拡張機能開発チュートリアルと併せてどうぞ。

Firefox Hacks Rebooted ―Mozillaテクノロジ徹底活用テクニック
浅井 智也 池田 譲治 小山田 昌史 五味渕 大賀 下田 洋志 寺田 真 松澤 太郎
オライリージャパン

Page 1/239: 1 2 3 4 5 6 7 8 9 »

マルチプルタブハンドラもWebExtensionsに移行しました - Oct 13, 2017

ツリー型タブのWebExtensions移行の後半作業と並行して進めてたマルチプルタブハンドラのWE移行ですが、こちらも一区切りとしてバージョン2.0をリリースしました。こちらはTSTほどには語る内容が無いので手短に。

マルチプルタブハンドラ(以下、MTH)は元々、「そこにあるFirefoxのタブを雑にドラッグして選択したらメニューが出てきて『で、この選択したタブをどうしたい?』と次のアクションを訊ねてくる」という、操作対象を起点とした操作、本来の意味での「オブジェクト指向」らしい操作というコンセプトに基づくアドオンでした。そのコンセプトを具現化するために、レガシー版ではタブの上でのクリックやドラッグどいった操作をハンドルし、時にFirefox本体の挙動をキャンセルして、「タブをドラッグして選択」という挙動を実現していました。

ところが、WebExtensionsではFirefoxのタブの上での生のイベントをハンドルすることが許されていませんそういうAPIが欲しいという要望は挙がっていましたが、WebExtensions APIのコンセプトに反するということでWONTFIXになっています。よって今後もそういう事ができるようにはならないでしょう。

ただ、WE版TSTは専用のサイドバーを提供していて、その中で発生するイベントを扱う事に関してであれば自分の裁量で好きなようにAPIを提供できます。 なので、WE版MTHは当初は「TSTに完全に依存したアドオン」として開発を始め、TSTにAPIを実装してはMTHでそれを使ってみるという形で両者の開発を並行して進めていたのでした(TSTのAPI整備とその動作検証のための体のいい実験台になってもらったとも言えます)。 その過程で、ツールバーボタンから開いたパネル内であればドラッグ操作でのタブの選択もできなくはないと思い立ったため、TST完全依存のアドオンではなく一応単体でもそれなりに機能するアドオンとしてリリースする方針に切り替えて不足部分を整備し、この度ようやくリリースに至った次第です。

そういう経緯なので、本来意図していたMTHのユーザー体験は、WE版においてはTSTとの併用時においてのみ実現されています。単体のWE版MTHはあくまで仮の姿で、TSTと併用した時にのみ真価が発揮されるとは、なんとも中二病くさい仕様ですね。

ところで、Firefoxにはずいぶん前から(具体的には8年前から)タブを複数選択する機能の実装提案がなされています。 この機能がいつまで経っても実装される様子がないので、渋々MTHを今までメンテナンスしてきた、という部分も実を言うとあるのですが、なんとここに来てそれなりの優先度で解決(実装)に向けて動き始めてきたようです。 もっと早くやってくれていれば、MTHはWE版を開発せずそのまま開発終了にできたかもしれなかったのに……

ともあれ、将来のどこかの時点でMTHがお役御免となるのなら、それに越したことはありません。 その日が来るまでの間は、できる限りメンテナンスを続けていこうと思っています。

以上、MTHのWE版リリースの裏事情でした。

ツリー型タブのWebExtensionsへの移行のおはなし - Oct 03, 2017

Here is the English version of this article. このエントリはQiitaとのクロスポストです

2017年の8月下旬に思い立って、ツリー型タブのWebExtensions版を作り始め、去る9月26日にバージョン2.0としてリリースしました。
(ツリー型タブのサイドバーパネルを表示した状態のスクリーンショット)

重い腰を上げて取り組む気になれたのは、必須と目していたAPIが一通り実装されてきて、Firefox 57でようやく技術的に作れる目処が立ってきたからでした。 関係者の皆さんの尽力に改めて感謝の意を表明します。

やっている事自体はそう難しい話ではなく、技術的に目新しいトピックは無いのですが、主に歴史的資料としてレガシーなアドオンの移行の一事例の記録を残しておこうと思います。

続きを表示する ...

WebExtensions Migration Story of Tree Style Tab - Oct 03, 2017

このエントリの日本語版はこちらから読めます。

I started to develop WebExtensions-based version of the Tree Style Tab at late August 2017, and released as the version 2.0 at 26th November.
(A screenshot of Firefox Nightly 58 with Tree Style Tab's sidebar panel)

The largest reason why I did it is: many numbers of new WebExteisons APIs I required are landed to Firefox 57. Thank you developers for their great effort.

There is no technical novelty topics, but I wrote this as a historical document: a migration story of a very legacy addon.

続きを表示する ...

SH-M03でSDカードを内部ストレージの代わりに使うように設定した - Jun 09, 2017

手厚いサポートの恩恵をほとんど受けてないのでSoftbank MobileをやめてMVNOにしよう、ということで数ヶ月前から準備を進めてて、まずSIMロックのかかってない端末に機種変更した。そこそこ性能が良くてモバイルSuicaが使えること、を条件に検討した結果AQUOSブランドのSH-M03にした(既にこの次のモデルが出てたけど、次のモデルはコストダウンの方に舵を切った結果スペックが落ちてたので……)。

……んだけど、これが本体の内蔵ストレージがめっちゃ少なくて、この前に使ってた203SHは32GBあったのにこれは16GBだからアプリの自動更新が何度か降ってきたらもうそれだけでパンパン。microSDを外部ストレージとして使うようにはもちろんしてたんだけど、それでも全然追っつかない。Kindleのようにデータを自分の領域に保存するアプリはそもそも外部ストレージがいくらあっても使っちゃくれないし。

検索したら、Android 6以降だとSDカードを内部ストレージの追加領域にできるみたいな話が出てきたのでやってみた。結論としては、今まで外部ストレージだったmicroSDがそっくりそのまま内部ストレージになる感じになった。

以下、やったこと。

  1. 準備。
    1. Androidのバージョンを確認する。SH-M03はAndroid 6.0.1で、6以上という条件を満たしてるので問題なし。
    2. microSDの内容をPCに退避する。一旦フォーマットする必要があるという説明を見たので。
    3. 設定→ストレージとUSB でmicroSDをタップし、右上のメニューボタンをタップして出てくるメニューからフォーマットを選択する。 この時、SDカードを内部ストレージとして使う機能を解放してる機種で、且つmicroSDの性能が充分にあると「内部ストレージとしてフォーマット」という項目がメニューに表示されて、それを選択すればいいようなんだけど、SH-M03はこの機能が封印されてるのか、使ってるmicroSDのせいなのか、自分の環境では「外部ストレージとしてフォーマット」しか表示されなかった。ので、とりあえずそれを選択してフォーマットし直した。
  2. 外部ストレージとしてしか認識されないmicroSDを強制的に内部ストレージにする。(前の手順で内部ストレージとしてフォーマットできてるなら、多分この手順は不要)

    1. 作業用PCにAndroid Studioをインストールする。
    2. コマンドプロンプトから開発ツールを使えるようにするために、環境変数PathC:\Users\(ユーザー名)\AppData\Local\Android\Sdk\platform-toolsを加える。
    3. Android端末側で、設定→端末情報→ビルド番号 を連打して開発者向けの機能を使えるようにする。
    4. Android端末で設定→開発者向けオプションを開いて機能を有効化し、「USBデバッグ」をONにする。
    5. USBケーブルでPCとAndroid端末を接続する。
    6. コマンドプロンプトを開き、adb shellを実行してAndroid端末に接続する。 USBデバッグ接続を許可するかどうかの確認がAndroid端末の画面に出るので、許可する。
      • この時、2つ以上のAndroid端末がPCに接続されているとどこに繋ぎに行けばいいのか分からないということでerror: more than one device/emulatorというエラーメッセージが出て接続できない(自分の環境ではCintiq Companion Hybridが繋がっててこれにハマった)ので、関係無いAndroid端末は外しておく。
    7. adb shellで無事端末に接続できたら、sm disk-listを実行する。すると、以下のような感じで認識されてるmicroSDの識別子が表示される。

      C:\Users\piro>adb shell
      shell@SH-M03:/ $ sm list-disks
      disk:179,64
      shell@SH-M03:/ $
      

      ここではdisk:179,64がそれにあたる。

    8. sm partition (microSDの識別子) privateを実行する。

      shell@SH-M03:/ $ sm partition disk:179,64 private
      shell@SH-M03:/ $
      

      しばらく待たされて処理が完了する。

      • この時、privateと指定するとmicroSDの領域全体が内部ストレージとして使えるようになるんだけど、文献によっては「全体を内部ストレージにするとおかしくなるのでmixed 50のように指定すること」のように案内してたりする。が、自分の環境で試した限りではmixedを指定しても期待したような効果を得られず、むしろprivateにした方が想定通りの結果を得られた。
    9. Android端末を再起動する。
  3. 内部ストレージとしてフォーマットされたmicroSDに、データを移行する。
    1. 設定→ストレージとUSBを開くとmicroSDが「外部ストレージ」と括られずに「内部ストレージ」のすぐ下に表示されているので、これをタップする。
    2. 右上のメニューボタンをタップして出てくるメニューから「データを移行」を選択する。
    3. 確認の後、本体内蔵のメモリからmicroSDに諸々のデータやアプリが移動される。

この状態でファイルマネージャの類のアプリを起動してみると、以前は内部ストレージとSDカード(外部ストレージ)の2つが見えていたのが、内部ストレージが見えなくなってSDカードだけ表示されるようになっていた。 また、Android端末をPCに接続しても、microSDの分の領域だけが見えるようになっていた。

最初に退避しておいたmicroSDの中身を書き戻すというかマージすれば、移行作業は完了。逆に、microSDを切り離して元の状態に戻したい時は、設定→ストレージとUSB で内部ストレージの項目をタップして、右上のメニューボタンをタップして出てくるメニューから「データを移行」を選択すればいいんだと思う。やる前にmicroSDの中に保存されてるデータを消して内部ストレージに収まる状態にしておかないと、多分、失敗するか警告されて処理を実行できないんじゃないかなあ。

辻褄はどこへ行った……?「君のまなざし」 - Jun 05, 2017

仏陀再誕 The REBIRTH of BUDDHA神秘の法に続く、幸福の科学制作の映画のチケットを譲って頂いたので見てきました感想です。

  • 朝飛の演技が冒頭から大根で「大丈夫かこれ……?」って思った。
  • ペンションで料理の後片付けをしつつ普通に会話してると思ったら急に真顔になって意味深なセリフを喋るのは、ギャグなのか?
  • 幽霊に「とりあえず下に降りましょ」って普通に話しかける流れも、その後の食道で幽霊交えて3人で会話してる絵面も、ギャグなのか?(映画見ながら笑っちゃった)
  • お堂?の前でオーナーと口論になる所、キレさせ方もキレ方も雑すぎない?
  • 西洋の神様、ブッダ、また西洋の神様、と入れ替わり立ち替わりでてくるの節操ないなあ(って書いてて思い出したけど、前の映画での話によると確か幸福の科学の教えではキリストとかもみんなブッダの生まれ変わりという説なんだっけ……それにしても連続で出てくるのはビジュアルとして強烈だ)
  • 手からビーム出して浄霊するの、唐突かつそこだけ浮いててこれもギャグっぽく見える。
  • 過去生のとこは「AIR」の「Summer編」みたいなのかなと思ってたら、設定も展開もガバガバすぎて……なんで君らそんなきれいなおべべ着て貧民街に出入りしとるん?
  • 地下に降りた所で何の説明も無く唐突に巫女さんの霊?的な人が出てきて「えっ」てなった。
  • 「ここまで全部夢(?)の中の出来事でした」というまとめ方なのかと思ったら最後に朝飛と抱き合ってて、歴史改変されたけど部分的に記憶は持ち越されてる的な事なの? え? どゆこと? ってなってしまった。

総じて、実写にすることで違和感が引き立つというか粗が目立つというか、一線を張ってるプロの脚本家や声優や俳優ってやっぱすごいんだなあという事を逆説的に感じる結果となった次第でした。

宗教本体の教義がアップデートされるわけでは当然ないので、教義の説明部分は回数を重ねれば重ねるほど「あ、また同じ事を言ってるな」となっちゃうのは致し方ないんだけど、それにしても、以前に見た映画と同様に「言いたい事を言う」が優先されていて「伝わるように言う」がなおざりにされてるなあと思った。

例えば「メッセージ」(テッド・チャン「あなたの人生の物語」が原作の物)は「悲劇的な未来が既に決定されていても、それでも人はその選択をする、ということの尊さ」をストーリー内に織り込んでたし、「オデッセイ」(アンディ・ウィアー「火星の人」が原作の物)は「折れないこと、諦めないこと、ユーモアを忘れないこと、の大切さ」を主役の演技から演出からすべてを投じて描いてたし、「LEGOムービー」は「自由な発想を忘れないことの大事さ」を語りつつも「お堅いルールに自由な発想で立ち向かった主人公達が、さらに次元の違う自由さを目の当たりにする」という落とし方をしてたし。上手くやるやりようはいくらでもあると思うんですよ。

例えば、「地獄に堕ちる」とかの恐怖を語るんだったら徹底的にホラーに振り切って救いも何も無しに終わらせるとか。

例えば、修行の大切さを語るんだったら修行そのものにテーマを置くしんみりした作品にするとか。

例えば、退魔的なところにフォーカスを当てるんだったらエクソシストみたいなエンターテインメントに振り切るとか。

全部語ろうとするからシッチャカメッチャカになるんであって、1作で全部語ろうとしないで、それぞれ分けてちゃんと掘り下げなきゃ。

こっちの言いたい事を全部言いたいだけまくし立てても相手が聞いてくれるのは、相手が最初から好意を持ってくれている場合だけなんだよね。そう考えると、これはやっぱりまだまだ「身内」向けの物で、「外」に出す性質ものではないんだと思う。

トレイラー見てちょっと面白そうかなって思ってチケット譲ってもらったんだけど、実際見てみたら、見せ場だけ繋いで面白そうに見せるトレイラー編集の妙というか、あれはあれで大した技術だよねと再認識したというか……市井のレビューを見ても「宗教映画と知らずに見に行った。(僕の挙げてるようなツッコミの後)お金損した。」みたいに後悔してる物すらあって、なんというか、いたたまれない。身内向けなら身内向けと分かるように振り切る、外向けなら外向けでもっと外の人が見ても面白く作る、どっちつかずが一番罪作りだというのを実感する。単に不出来ならまだ仕方ないけど、「普通のセミナーを装ってて、誘われて行ってみたら宗教だった」みたいな狙ってやってるんなら、騙すのは駄目ですほんと。

対象視聴者でないにも関わらず「見たい」って言ってチケット譲って貰っておきながら(あまりに本編だけでは訳がわからなかったので補足情報を求めてパンフレットは買いました)、批評とも言えないようなくさすばかりの感想を公開するのって道義的にどうなん?というのはあると思うんですが、貰うだけ貰って何も言及しない方が問題かなと思って書いてみました。

BLAME!の映画を見た後で原作を読み返したらもっと映像見たくなった - Jun 05, 2017

NETFLIXで映像化されたやつを映画館で見てきた。「すげえええ~~これまさに『俺の見たかったBLAME!のアニメ』やああ~~」って大興奮だったんだけど、帰宅後原作を読み返したら意外と色々違ってた。「シドニアの騎士を経た後の弐瓶勉」感もミックスされて色々アップデートされたBLAME!と言った方が適切なようだ。パンフレットは売り切れで買えなかったので、以下パンフレットに書いてある話と違う的外れなこと言ってたらごめんなさい。

  • CG WORLDのインタビューでも触れられてたけど、づるがめっちゃ美少女になってて別人過ぎる。
  • あのシャキサク、こうやって食べる物だったの!? しかもうまいの!?! っていうか原作みたいに生(?)で食べたら死ぬ……?
  • 霧亥がアニメで着てたのは原作終盤の衣装で、原作序盤はもっとあっさりした服だった。あの服でこの映像の中にいたら結構ギャグっぽく見えたかもしれない。
  • 種族の違いによる体格差、は今回は省略されてたように感じた。原作だと電基漁師達は大人でも霧亥より小柄だったけど、映像ではそこまで露骨な差は無かったような……?
  • シボは原作では有機的なボディという設定だったのか発見時の腐った体も修復後の体も生身の人間っぽくて「えっ? えっ? なんでこの人腐ってるのに喋ってるの??」って思ってたんだけど、アニメでははっきりメカな描写になっててだいぶ「分かりやすい」表現になってるなあと思った。
  • 偽装端末遺伝子(だっけ?)とか自動工場とか、原作よりスマートで硬質なビジュアルにデザインが変更されててそこも見やすいと思った。工場の新しいビジュアルは、原作終盤にちょろっと出てきた別の施設のデザインの流用か?
  • 珪素生物や東亞重工は出番無し。入れると情報量増えすぎだからこれは妥当だと思う。
  • 工場脱出時にシボが霧亥に「ごめんなさいね」か「残念だったわね」か何か言ってたと思うんだけどあれどういう意味だったんだろう?

総じて、原作のぐにょぐにょした有機的イメージは抑えめで、メカはメカと分かりやすい描かれ方に統一されてるなあと思った。これはCG作画だからという制約による部分もあるのかもだけど。

とりあえず、この1作だけじゃなくもっといろんなエピソードをこのクオリティの映像で見せて頂きたい、そしてそれに浸りたい、なんならVRでこの超構造体に挟まれた階層都市内での生活を体験したい(絶対後悔するけど)、という「もっとこれくれぇぇぇええ!!」感を覚えた次第でした。

PHP勉強会で漫画の描き方を発表してきました - Jun 02, 2017

技術書典2で隣のスペースだったマンガでわかるWebデザインとかGitとかの湊川さん第113回 PHP勉強会@東京発表されるということでPHP勉強会の運営の方がご挨拶にこられていて、その時になんやかやでお声がけを頂いて発表の機会を頂く運びとなりました。じぶんPHP使ってないんですけど!?(ずっと以前に案件でPHPを使う物があったのでちょっとだけ触ったきり)と戸惑ったのですが会的には全然アリだとのことだったので、第114回 PHP勉強会@東京にて思いっきり漫画の話に振った内容でプレゼンをさせて頂きました。資料はSpeaker Deckで公開済みで、画像の解像度を落としたソースも公開してます。当日の様子の一端はTogetterのまとめをご覧頂くと伝わるかもしれません。

当初は20分の枠でお話を伺っていたのですが、ここは語っておきたいという内容を詰め込んでいるうちにどんどん分量が膨らんでしまい(実は会場で自己紹介が進行してる間にも何枚か足してました……)、第2セッションの枠が空いていたのをいい事に結局2枠分の時間を使わせて頂きました。時間に余裕が生まれた分、ちょっとゆとりを持って話せたと思うのですが、人前での発表自体が結構久しぶりだったので、大変緊張しました。

発表内容は見ての通り解説漫画の描き方の解説というメタな話ですが、前半部分のプロットやシナリオの話はテキストで解説を書く時や人に何かを紹介する時に共通して言える事のように思いますので、新人教育とかそういう場面で知見を生かして頂けたらなあと思っています(なので、Speaker Deckのスライドのカテゴリも図々しいことにEducationとしています)。

スライドに書いてないことで当日会場で話した事のうち、覚えてる話ではこんな話題があったような気がします。

  • 奥さんに手伝って貰っているという話を聞いたことがあるが?→最初の1年かそれくらいは、ペン入れをグレースケールの鉛筆ツールでやっていた関係で塗りつぶしツールを活用できなかったため、トーン(塗り)の下塗り作業を手伝って貰ってました。1年目の終わりくらいからベクター形式のペンツールに切り替えた結果、弊領域の塗りつぶしが楽になったため、作業の指示出しにかかる手間を考慮すると全部自分でやった方が早いかなということで、今は実作業は全部一人でこなしてます。ただ、話の展開に自信が無い時に意見を求めたり、みんとちゃんの衣装の事で判断に迷った時にアドバイスを求めたりという形での支援は今でもして貰ってます。
  • 編集者の人にフィードバックを貰って直すというのはないのか?→作業スケジュールが恒常的に崩壊してしまっているせいで、ネームを見せて意見を貰って……というサイクルはとても回せないため、ほとんどそのまま通してもらっています。ただ、話題の選定に自信が持てない時に、プロットの段階で「これでいってもいいか?」という事を聞いてみるという事はたまにあります。
  • 作業にかかる時間は?→平日フルタイムで勤務しているので、その後帰ってから家で夜間に作業しているのと、土日祝日にさらに集中して作業をしている、という感じで体感的には2~3週間ガッツリ持ってかれてる感じがあります。ただし、一番時間がかかっているのはプロットからネーム、下描きまでの工程で、気分が乗らないとかいい案が思いつかないとかでダラダラ時間を潰すだけに終わってしまっている部分はあります。
  • やり直したい回というのはあるか?→正直、今回発表の中で述べた事のいくつか(特にネーム段階のこと)は連載が進む中でだんだんと意識できるようになってきた事だったので、そこを無自覚にがむしゃらにやってた初期の頃の話は、今だったらもっと丁寧に絵解き解説したのに……と後悔に襲われることが結構あります。逆に、意識して取り組むようになってきた近年の回に関しては、あまりそういう後悔を感じることはなくなっている気がします。
  • ツールは何を使ってる?→ComicStudio Proを使ってます。Exではないのでスクリプトでの自動化ができない(当初は夏と冬のコミケに合わせてもえじら組の漫画を描くためにと思って導入したので、プロ向けのエディションなんて必要ないやろ……と思ってたのです)し、更新ももう無いし、 いいかげんCLIP STUDIO PAINTに移行しないといけないとは思ってるんですが、連載の作業に追われて学習のために割く時間も気力も確保できず、移行の目処は立っていません。
  • いつくらいから絵を描いてた?→物心付いた時には既に。なので、何かを説明する手段の1つとしていつも「絵で説明」が選択肢に入ってる感じはあるし、言葉だけで説明しないといけない時は「絵で描けば一発なのに……!」ともどかしくなる時が結構あります。

あと、質問を受けたこと以外でこんな事も話したなあという話題。

  • 解説を書けるのは自分がコマンド操作に苦手意識があって後から覚えたからで、好きでやってた事や、息をするレベルで身に着いてる事になると逆に説明できないと思う。例えば絵の描き方は、気が付いたら描いていたという感じなので、「ここが勘所」というのを言葉にできない。JavaScriptの事も、ツボを押さえた教え方はできないと思う。そんな感じだから成長はある一定の所で止まってしまっていて、「絵の描き方」や「プログラミングの仕方」みたいな解説で勉強してる人に追い抜かれてヘボい所に留まってる実感がある。
  • 頼まれもしないのに先日書評を書こうと思って読み返して、改めて湊川さんのGit本は本当にパッケージとしてよくできてるなと溜息出た。こんな完成度の高い物を世の送り出された湊川さんには嫉妬を禁じ得ない。自分も「再録の時に全体の構成を見直して、補足になるような話を描き足そう」みたいなことを最初は思ってたんだけど、いざその時が来たら描き下ろし1本で完全に力を使い果たしてしまい、構成を見直すとか書き直すとかなんて所までは全然手が回らず、結果、「シス管系女子」の本、特に1冊目は、パッケージとしては非常に収まりの悪い物になってしまったと思ってる。
  • キャラ立てを意識してるというのは、解説の指針を定めるペルソナにするという実務的な理由もあるんだけど、それ以外に、「意識高いギーク気質の人だけじゃない、技術第一という訳じゃない、服とかオシャレとかの方が好きという『普通の人』がIT分野で働いてたっていいじゃないか」というメッセージを込めてる部分もある。ずっと以前に案件で訪問した企業の情シス部門の方で、若い女性で私服の方が普通に仕事をこなされていた(※みんとちゃんとは全然タイプは違います)のを見て、「あっ、技術一本のオタク男性じゃない人もこの世界にいるんだ」と強く印象に残ったのが、みんとちゃんというキャラの発想のきっかけになってる。

自分の発表が終わった後は開放感からアルコールを飲んでしまったため、LTの方はほとんど頭に入っていませんでした。ごめんなさい。でもBlackfireというプロファイラ的な事のできるサービスあるという事と、WAF(Web Application Firewall, アクセスのパターンを識別して攻撃っぽい物を見つけたら遮断する)が有効だという話はうっすら記憶に残っています。

久しぶりにたくさん喋ったので翌日は声がおかしくなっていたのが自分で分かりました。こういう発表の機会が無いと自分が思っていることを整理してまとめる事も無いため、今回はそのいい機会になったと思います。発表の機会を与えて下さった勉強会運営の皆様、会場までお越し下さった皆様、ありがとうございます!

Ubuntu 16.04でduplicityを使おうとしたらPythonのエラーが出る件 - May 22, 2017

Ubuntuのバックアップユーティリティはバックエンドにduplicityというツールを使ってるんだけど、ユーティリティ越しだと大雑把な操作しかできないので、個別にファイルを復元したいみたいな時はduplicityコマンドを直接使う必要がある。それでduplicityを使おうとしたらこんなエラーが出て詰んだ。

$ duplicity --version
Traceback (most recent call last):
  File "/usr/bin/duplicity", line 45, in <module>
    from lockfile import LockFile as FileLock
ImportError: No module named lockfile

エラーメッセージで検索すると英語の情報しか見つからなかったんだけど、どうも、Pythonの複数バージョン使い分けのためにpyenvを入れていると、duplicityがシステムのPythonではなくpyenvのPythonの方を見に行ってしまうのが原因だったようだ。

そういえばGroonga関係のドキュメントを書くのにSphinxを使わないといけなくて、Sphinxが要求するPythonのバージョンがシステムのPythonのバージョンより新しかったからpyenvで乗り切ったような記憶がある。そのせいか。

PythonのことはさっぱりなのでどうやればpyenvとシステムのPythonを共存できるのかやり方を誰か教えて!と社内で聞いたら、デフォルトではシステムにインストールされたバージョンのPythonを使うようにして、特定のディレクトリ配下でだけ必要なバージョンを使うようにすれば良いと教えて貰えた

$ pyenv global system
$ duplicity --version
duplicity 0.7.06

でも同時に、Pythonコミュニティ的にはpyenvを使って欲しくない流れになっているみたいな事も聞いたので、自分の中でのPython触りたくない度合いがまた増してしまった。

Qiitaで許容される内容の不明点 - May 15, 2017

Qiitaのコミュニティガイドラインについての発表で参照されているコミュニティガイドラインが何度読んでも肝心の自分の知りたい点について書かれていなくて不安をぬぐえずにいたんだけど、1週間近く経っても特にフォローアップがなされていないようだったので、Twitterで愚痴ってないでちゃんと直接聞いた方がいいかなと思ってお問い合わせフォームから以下の質問を送ってみました。同様の質問が殺到しているようだったら申し訳ない限りです。


http://help.qiita.com/ja/articles/qiita-community-guideline
こちらのガイドラインにおいてQiitaに投稿する事が認められるのは「プログラミングに関する」記事であると限定されていますが、この範囲をもう少し詳しくご説明いただく事は可能でしょうか?
具体的には、自分は以下のような内容が許容されるのかどうかが気になっております。

  • プログラミング行為を伴わない、Ansible等のサーバー構成管理ツールの使い方やノウハウ
  • プログラミング行為を伴わない、Linuxサーバー上でのApacheやOpenSSH(sshd)といったサービスの設定のノウハウ
  • プログラミング行為を伴わない、MarkdownからPDFへのPandocを用いた変換処理のノウハウ
  • 一般にプログラミング言語とは見なされにくい言語、例えばシェルスクリプトの書き方やノウハウ

一般に「プログラミング」は設計・コーディングなどの開発行為までを指し、その成果物の実行や実行に必要な環境の整備、運用行為は、「プログラミング」という語が指し示す範囲には含まれないように思われます。
貴社元エンジニアの方の以下の発言は、上記のような内容もQiita上で許容される事が想定されているように読めますが、貴社の公的アナウンスとしてはそのような情報を見付けられておりませんので、上記疑念を払拭するに至っておりません。
https://twitter.com/mizchi/status/861892695236550656

自分の個人的な認識としては、Qiitaは「プログラムを書くすべての人が技術の悩みを解決するのに寄与する、技術的な話題」全般が共有される場と見えており、そのように考え記事を投稿しておりました。
しかしながら、自分の認識が貴社の想定から大きく外れているようでしたら、結果的には貴社のサービスの質を低下させる行為をしていた事になるのではないかと考えております。
今後ともQiitaの健全な運営に寄与できますよう、お手数をおかけしますが、上記の事について貴社の公式な見解を、本問い合わせへのご回答または公式なアナウンスの形でお知らせいただけましたら幸いです。
(また、本問い合わせへの回答としてご連絡を頂く場合、その内容の全文または要旨を個人のブログで公開しても良いかどうかについてもご回答頂けましたら幸いです。)


5月16日追記。本件、運営サイドから回答を頂けました。

  • 少なくとも上記4例と自分の過去の投稿は大丈夫っぽい
  • そのうちガイドラインについてフォローアップの公式アナウンスがTwitterとかQiitaブログとかでなされるっぽい

ということで個人的な心配はとりあえず解消されました。後は公式発表を待ちましょう。


5月29日追記。23日付けで公式な発表がありました。自分としては特に付け加えることはない感じですが、「まだスッキリしない」という方は直接問い合わせてみるのがよいのではないかと思います。

diffの逆の結果を見る(2つのファイルで同じ行を調べる) - May 10, 2017

このエントリはQiitaとのクロスポストです。

「diffの逆」って何だ?

diffコマンドを使うと、ファイルの中で変更があった箇所を簡単に調べる事ができます。

ただ、たまにその逆の事をしたくなる場合があります。つまり、2つのファイルの中で変更があった部分は無視して、同じ行があったらそこを列挙して欲しい、という場面です。

例えば、多言語対応のための言語リソース(ロケール)について、未訳箇所は原語のままにするというルールで運用している場合に、原語のロケールと比較して未訳箇所を調べたいというような場合がこれにあたります。

en-US.properties:

menu.new.label=New File
menu.save.label=Save
menu.close.label=Close
menu.properties.label=Properties
menu.exit.label=Exit
button.new.label=New File
button.new.tooltip=Create new file
button.save.label=Save
button.save.tooltip=Save (Overwrite) this file
button.close.label=Close
button.close.tooltip=Close this file
button.properties.label=Properties
button.properties.tooltip=Show detailed information of this file
button.exit.label=Exit
button.exit.tooltip=Exit without save

ja.properties:

menu.new.label=新規作成
menu.save.label=保存
menu.close.label=閉じる
menu.properties.label=Properties
menu.exit.label=終了
button.new.label=新規作成
button.new.tooltip=ファイルを新しく作る
button.save.label=保存
button.save.tooltip=ファイルを上書き保存する
button.close.label=閉じる
button.close.tooltip=ファイルを閉じる
button.properties.label=Properties
button.properties.tooltip=Show detailed information of this file
button.exit.label=終了
button.exit.tooltip=ファイルを保存せず終了する

こんな感じの2つのファイルがあったとして、menu.properties.label=Propertiesなどの箇所が未訳ということになりますが、あちこちに散らばっているこのような未訳箇所がどれだけあるかをパッと調べたい、ということです。

よく知られたやり方とその欠点

「inverted diff」「opposite diff」「reversed diff」「diffの逆」のようなキーワードで検索すると、以下のようなやり方が紹介されている事が多いです。

  • comm -1 -2 oldfile newfile :2つの入力の共通行を調べるcommコマンドを使った例。ただし、これは両方のファイルの内容がソート済みである必要がある。
  • fgrep -x -f oldfile newfile:指定文字列にマッチする行を出力するfgrepgrep -Fと同じ。マッチングパターンを正規表現ではなく静的な文字列として扱うgrep)の-fオプション(マッチングパターンをファイルで指定するオプション。ファイルの1行が1つのマッチングパターンになる)と-xオプション(マッチングパターンに行全体がマッチする場合にのみマッチしたとみなすオプション)を使い、片方のファイル内の各行について、もう片方のファイルのいずれかの行と内容が完全一致する行を出力する。

他にもPerlを使う例もありますが、これらのやり方はいずれも、「2つのファイルで内容が同じ行を出力する」という物です。

それに対し、diffでは変更があった箇所を示すと同時にその前後の変更が無かった箇所も出力する、つまり前後の文脈を見る事ができます。「diffの逆」というなら、「変更が無かった箇所の前後の文脈」も見たくなって当然でしょう。

また、行単位で見れば内容が同じでも、出現位置が違うので全体としては意味が違う、という事もあります。前述の例はいずれも、このようなケースを検出できません。

真の「逆diff」

diffは、「ファイルを先頭から比較していき、内容が変化していない部分は飛ばして、内容が違う部分があったらそこを詳細に出力する」という事をします。

その反対となる逆diffには「ファイルを先頭から比較していき、内容が変化していない部分を詳細に出力して、内容が違う部分があったらそこは飛ばす」という事をして欲しいわけです。

ということで、それらしい事をやるシェルスクリプトを書いてみました。

inverted-diff.sh:

#!/bin/bash
context_lines=3

while getopts c: OPT
do
  case $OPT in
    c)
      context_lines=$OPTARG
      shift 2
      ;;
  esac
done

case $(uname) in
  Darwin|*BSD|CYGWIN*)
    esed="sed -E"
    ;;
  *)
    esed="sed -r"
    ;;
esac

oldfile="$1"
newfile="$2"

diff --new-line-format='+%L' --old-line-format='-%L' --unchanged-line-format=' %L' \
     <(cat "$oldfile" | tr '\r' '\n') \
     <(cat "$newfile" | tr '\r' '\n') |
  paste -s -d '\r' - |
  $esed -e "s/^([-+][^\r]*\r)*(([-+][^\r]*\r){$context_lines})([^-+])/...\r\2\4/g" \
        -e "s/(\r[^-+][^\r]*)((\r[-+][^\r]*){$context_lines})(\r[-+][^\r]*)+(\r?)$/\1\2\r...\5/g" \
        -e "s/((\r[-+][^\r]*){$context_lines})(\r[-+][^\r]*)+((\r[-+][^\r]*){$context_lines})(\r[^-+]|$)/\1\r...\4\6/g" |
  tr '\r' '\n'

実際にこれを先の例のファイルに対して実行すると、こんな結果になります。

$ ./inverted-diff.sh en-US.properties ja.properties
...
+menu.new.label=新規作成
+menu.save.label=保存
+menu.close.label=閉じる
 menu.properties.label=Properties
-menu.exit.label=Exit
-button.new.label=New File
-button.new.tooltip=Create new file
...
+button.save.tooltip=ファイルを上書き保存する
+button.close.label=閉じる
+button.close.tooltip=ファイルを閉じる
 button.properties.label=Properties
 button.properties.tooltip=Show detailed information of this file
-button.exit.label=Exit
-button.exit.tooltip=Exit without save
+button.exit.label=終了
...

ちなみに、前後の行をもっと出力したい場合は./inverted-diff.sh -c 4 en-US.properties ja.propertiesのように行数を-cオプションで指定できるようにしてあります。

実装の解説

キモになるのは、省略せずに全行の差分を出力する方法です。diff--new-line-format='+%L' --old-line-format='-%L' --unchanged-line-format=' %L'という具合に「追加された行」「削除された行」「変更が無かった行」それぞれの出力フォーマットを個別に指定すると、変更が無かった部分が長く続いてもその部分が省略されていない出力結果を得る事ができます。

後の部分は、その出力に対して「変更が連続している部分をそれらしく省略する」という加工を施すための物です。以下、シス管系女子シリーズの読者の方向けに、本の中で解説していないテクニックについてもうちょっと詳しく解説しておきます。

  • while getoptsで名前付きの引数をオプションとして受け取る定番の方法を使って-c 4のような行数指定を受け付けていますが、オプションの検出後にshift 2で引数のリストの先頭から-c4を取り除く事で、その後の$1$2が確実に比較対象のファイルを示すようにしています。これは、名前付きオプションと名前無しの引数を併用する形のスクリプトを書く時に気をつけないといけないポイントです(shift 2を忘れると引数の順番がズレてしまいます)。
  • case $(uname)からのブロックは、環境によってsedで拡張正規表現を使うためのオプションが違うという問題を回避するために自分がよく使っているやり方です。
  • <(cat "$oldfile" | tr '\r' '\n')というのは、「cat "$oldfile" | tr '\r' '\n'の実行結果の出力を内容としたファイルを、そこで指定した事にする」という書き方(bashのプロセス置換という機能)です。
  • sedで複数行に渡る置換を行うために、一旦全行をpaste -s -d '\r' -で「\r区切りの1行の文字列」として結合しています。pasteを使った行の結合については別の記事で解説していますので、併せてご覧下さい。
  • 拡張正規表現では、(パターン){N}と指定すると「そのパターンがN回繰り返された場合」を示す事ができます。これを使って、変更があった行が何行以上連続していたら間を省略する、ということをやっています。

残された課題

この実装ですが、やっつけ仕事なのでアラが色々あります。例えば以下のような具合です。

  • diffの出力を一旦1行に繋げているので、入力が大きいとメモリを使いすぎる(多分)。
  • 改行コードがCRLFかの違いが無視される。
  • 改行コードがCRLFであるファイルは改行が二重に表示される。
  • diff -rのような再帰的な複数ファイルの比較に対応していない。

自分はここまででやる気が尽きてしまいましたので、どなたかやる気に溢れた方のアドバイスをお待ちしております。

Page 1/239: 1 2 3 4 5 6 7 8 9 »

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のつぶやき

オススメ

Mozilla Firefox ブラウザ無料ダウンロード