ELECOM BM-IB016BK

MacBook Air 13inch を持ち歩く用のバッグが欲しい。

今まで汎用の緩衝材で包んでデイバッグや旅行鞄に入れていた。
それで充分な歩度でしか持ち歩かなかったけど変に機会が増えてきた。
さすがになんとかしたくなってきたということで。

希望は本体ギリギリの小さなサイズで取手付き。
ポケットがあって電源アダプタと WiMax ルーターを入れられる。
旅行鞄に入れる場合あり、緩衝材のかわりに鞄をそのまま代用できる。

いや、鞄in鞄の用途がメインで単体での持ち運びも可能という一石二鳥にしたい。
ということで見た目はどうでもよい、小さくてソフト素材でポケットと取手付き。
安ければいうことない。

で、試しにこんなのを買ったのでレビュー。
帯に[PCインナーバッグ]と書いてある、まさしくソレ用。
Mac 専用品は見た目はいいけど希望どおりのものが無いという…

実物の見た目は本当にショボい、電車でそのまま持ち歩きの人はヤメとけ。
車なら問題ないしサイズは自転車のカゴにスッポリ収まるレベル。
取手は意外に持ちやすい。

width-300x269

サイズは希望ピッタリ、書類をついでに入れる余裕が少しあり。
汎用ながら実は MacBook Air を基準に合わせているのかもしれない。
緩衝材もこれ以上あると厚ぼったいくらいある。

height-300x160

鞄in鞄には少し厚いかも、キズの心配は無いに等しいですけど。
スマホやデジカメを仕込める厚さはないな(マテ!

pocket-300x256

電源アダプタ断線の心配がなさそうなデカいポケット。
Mac は完全にマウス不要なのでコレ以上のポケット容量はいらない。

Amazon のレビューを見ると約千円の鞄に何を求める?の人もいる。
けれどだいたい筆者と同じ用途で購入しているみたいね。

取っ手が小さく余計なものがないインナー兼アウターなバッグ。
うん希望どおり、MacBook Air は持ち歩くと人気の理由が解る。
しかしこんなやっすい鞄をレビューしてどうする俺。

JavaScript clientWidth

あけましておめでとうございます。

さて元旦からいきなりですが。
iOS9 Safari Bug | PaePoi
やっとコレの回避策が解りました。

【Javascript】ブラウザの表示領域サイズ取得について – すたら日記

うおぉ、document.documentElement.clientWidth を使うのか!
古いページだけどモバイル Safari でもこのメソッドは使えるようです。
window.innerWidth のバグじゃなかったのね。

ついでに、window.outerWidth は Safari で使えないようだ。
それはもうどうでもよくて。

早速パソコン表示は 728px バナーに戻すとしよう。
よしよし元通り、パソコン用でモバイルバナーはやはり変だったし。

チェック用途の実験ページも書き換えて。
ソースはパソコンで Ctrl+U ね(手抜き)
画面サイズ取得

safari_width

あれ?キチンと window.innerWidth で取得できている。
試しに document.documentElement.clientWidth をコメントアウト。
やはり駄目、取得後ならイケるみたいだが理由はワカンネエ!
レスポンシブ・ウェブデザインってムズい!

以下おまけ。

aqua

無料ガチャでアクアきたー!
って水属性ばかり強くなってどないせーと、風と光をくれよ…
特攻は HR 2 人、まあいいかお年玉をもらった。

keyboard shortcuts

プログラミング気分ではないし Mac でも。
たまにしか使わないとキーボードショートカットを忘れる…
ええいソレなら

Mac OS と GNOME キーボード操作対応表 – L’Isola di Niente

ということでこんなページを作った。
多分もう仕事以外で Windows は使わないからページ整理のついでだが。

しかしこうしてみると本当に同じような進化をしているよね。
今後キーボードを使う OS はこんな感じに収束されるのだろう。

Clutter Timeline

今回は Clutter で図形を書き、ついでに動かしてみよう。
年末で超忙しいので更新が遅くてごめん。

Clutter: a beginner’s tutorial | TuxRadar Linux

こんな感じらしい。
少しずつ試してみよう。

別のページで見かけたけどウインドウを閉じるのは hide シグナルのほうがいいみたい。
PyGObject で書く時はこんな感じかな。

#!/usr/bin/env python3

import gi, sys
gi.require_version('Clutter', '1.0')

from gi.repository import Clutter

class ClText(Clutter.Stage):
    def __init__(self):
        Clutter.Stage.__init__(self)
        # ClutterRectangle Green
        rectcolor = Clutter.Color.new(0, 255, 0, 255)
        rect = Clutter.Rectangle.new_with_color(rectcolor)
        rect.set_size(100, 50)
        rect.set_position(50, 20)
        self.add_actor(rect)
        # ClutterRectangle Blue
        rectcolor = Clutter.Color.new(0, 0, 255, 127)
        self.rect = Clutter.Rectangle.new_with_color(rectcolor)
        self.rect.set_size(50, 100)
        self.rect.set_position(40, 30)
        self.add_actor(self.rect)
        # Timeline
        self.rotation = 0
        timeline = Clutter.Timeline.new(500)
        timeline.connect("new-frame", self.on_new_frame)
        self.sorce = Clutter.Score.new();
        self.sorce.set_loop(True)
        self.sorce.append(None, timeline)
        self.sorce.start()
        # self
        windowcolor = Clutter.Color.new(255, 0, 0, 255)
        self.set_color(windowcolor)
        self.set_title("Test")
        self.set_user_resizable(True)
        self.set_size(320, 240)
        self.show_all()

    #def do_delete_event(self, event):
    #    Clutter.main_quit()

    def do_hide(self):
        Clutter.main_quit()

    def on_new_frame(self, num, data):
        self.rotation += 0.3
        self.rect.set_rotation(Clutter.RotateAxis.X_AXIS, self.rotation, 0, 0, 0)

Clutter.init(sys.argv)
ClText()
Clutter.main()

clutter_rotate

CLUTTER_Z_AXIS が Clutter.RotateAxis 内の所で迷ったけど上手くいった。
ここで指定した軸を中心に 3D でグルグル回すことができるんだね。

add_actor の順番どおりで重なっていくようだ。
これを利用すれば簡易 3D アニメーションなら簡単に作れそう。
モデリングは、今は解らない。

そうそう、ClutterScore を self にくっつけるのを忘れないようにね。
こうしないとガベージコレクションで破棄されちゃうので。

Clutter (GNOME)

ClutterGst で動画関連をヤル前に。
Clutter 自体の基本をおさらい、つか完全に忘れているわ筆者は。
その前に Clutter とは。

Projects/Clutter – GNOME Wiki!

GNOME プロジェクトの作っている OpenGL ES ツールキット。
Windows の WPF のようなもの、方向性は違うみたいだけど。
iOS,Mac の Metal といい、今のグラフィックはリッチです。

筆者の MacBook Air は中古の 2011 なので El Capitan の恩恵が無い…
持ち運び用途で買ったんだから別にどうだってイイモン!
Windows は一年以上寝ている、自動更新が恐ろしいので起動すらしたくない。

まあそれはどうでもよくて。
WPF みたいなものなので普通にウインドウが作れます。

#!/usr/bin/env python3

import gi, sys
gi.require_version('Clutter', '1.0')

from gi.repository import Clutter

# initialized
Clutter.init(sys.argv)

def on_delete_event(stage, event):
    Clutter.main_quit()

#stage = Clutter.Stage.get_default() # delete 1.10
stage = Clutter.Stage.new()
stage.connect("delete-event", on_delete_event)
stage.set_title("Hello Clutter")
stage.set_user_resizable(True)
stage.show()
Clutter.main()

clutter_window

GtkWindow とは違い[閉じる]ボタンで Window は閉じる。
けど clutter_main_quit() を呼ばないとプロセスが残るので注意。
よく見ると GtkWindow とは影が違うことに気が付く。
X で描写しているのではないということがこれで判ります。

ウインドウだけではしょうがないので文字列を表示します。
ついでに書き換えできるように。

#!/usr/bin/env python3

import gi, sys
gi.require_version('Clutter', '1.0')

from gi.repository import Clutter

class ClText(Clutter.Stage):
    def __init__(self):
        Clutter.Stage.__init__(self)
        # ClutterText
        edit = Clutter.Text.new()
        edit.set_text("Hello ClutterText")
        edit.set_editable(True)
        self.add_child(edit)
        self.set_key_focus(edit)
        # self
        color = Clutter.Color.new(255, 0, 0, 255)
        self.set_color(color)
        self.set_title("Test")
        self.set_user_resizable(True)
        self.set_size(320, 240)
        self.show_all()

    def do_delete_event(self, event):
        Clutter.main_quit()

Clutter.init(sys.argv)
ClText()
Clutter.main()

clutter_text

GtkWidget の GtkLabel 等とは違い背景透過のようです。
書き換えできるようにしてみたけど GtkEntry のようにはなりません。
クリックでフォーカスが持てないし日本語入力もできない。
まあそういう使い方ではないということでしょう。

Clutter も PyGObject では do_* の接頭子でオーバーライドできるようです。
なんか直感だけでここまで解ったぞと。

WPF と違い部品 Widget は無いけど GtkWindow に乗せられるので問題ない。
いや、スマホの普及を見るとそういう考えがもう古いのかな。

しかし devhelp 3.18 は Ctrl+G で次を検索しないのか?
Ctrl+クリックで別タブもできない、凄く使い辛いんですけど。