Mac OS X のバッテリー劣化状況を確認する

ほお、と思ったのでメモ。

MacBook AirやMacBook Pro をずっと使っていて、バッテリー(電池)の持ちがなんとなく悪くなった気がするなぁと思った事ありませんか。

そんなときにバッテリーの劣化状況を調べる方法がありました。

ターミナルから、下のコマンドを入力するだけ。

ioreg -c AppleSmartBattery | grep -i Capacity

実行すると、このように出力されます。

$ ioreg -c AppleSmartBattery | grep -i Capacity
    | |           "MaxCapacity" = 4745
    | |           "CurrentCapacity" = 3463
    | |           "LegacyBatteryInfo" = {"Amperage"=3290,"Flags"=7,"Capacity"=4745,"Current"=3463,"Voltage"=8282,"Cycle Count"=282}
    | |           "DesignCapacity" = 5100

MaxCapacityがバッテリーの最大容量、CurrentCapacyty が今のバッテリー残量、DesginCapacityが製品出荷時の(設計された)バッテリー最大容量です。

劣化状況は MaxCapacity ÷ DesginCapacity という計算をすると求められます。

上の例だと 4,745 ÷ 5,100 = 0.930392… となり、製品出荷時から比べるとパフォーマンスが93%(0.93)に減っているので、損耗率は 100 – 93 = 7% となります。

ちなみに上の例は買ってから1年のMacBook Airです。
1年フルに仕事で使ってたのですが、7%しか劣化していないのですね。
もっと劣化してると思っていたけど結構優秀。

[Apache] .git, .gitignore等をWebからアクセスできないようにする

gitで管理しているwebサイトでうっかり.gitや.gitignoreなどの Git 関連ファイルが漏れてしまわないようにするには、httpd.conf で以下のように設定します。

# .git から始まるファイルへのアクセスを禁止
<Files ~ "^\.git">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>
# .git/ フォルダ以下のファイル・ディレクトリへのアクセスを禁止
<Directorymatch "^/.*/\.git/">
Order deny,allow
Deny from all
</Directorymatch>

.git は外してアップしているよ、という方も、保険として入れておくと万一の時に .git や .gitignore などが
公開ディレクトリに混ざってしまってもアクセスできないようになるので安全ですね。

フリーで使えるFlash(SWF)のコンパイラ・逆コンパイルツール

逆コンパイルというとアレな感じなのですが、どうしても逆コンパイルが必要な時ってありますよね。

たとえばswfだけあってソースが無いFlashの移植開発だったり、
ソースをもらえないFlashと通信するシステム開発でデバッグの時に逆コンパイラでFlashから.flaや.asなどソースが取得できれば
随分効率が違います。

また、デコンパイラ・コンパイラ両方の機能を備えているものも多く、
Adobe 製品を使わずに無料でFlash開発する事も可能です。

コマンドラインでSWFを分解・再構成できるツールを使うと
SWFを素材として扱い、Flashを動的に生成する必要のあるWebサービス・プログラムを作成する事も可能になります。

ということで、無償で使える(一部有料ソフトもあり)のコンパイラ・逆コンパイラを紹介します。

hugflash (windowsのみ)

カハマルカの瞳と同じ作者のフリーソフトウェア。ASや画像・音声リソース等をswfから抽出できます。
ASのクラスもちゃんと抽出してくれました。ASを無料で逆コンパイルするならこれが一番。

使い方:
HugFlash.exeを起動して、HugFlashのウィンドウ上で右クリック → モード → HugDimensionを設定しておき、ウィンドウに対象swfをドラッグ&ドロップ。

Flare(win/mac OS 10.3/Linux)

SWFデコンパイラ。メンテナンスされていないのかFlashの対応バージョンが古い(Flash MX まで)です。
参考: Flareの使用方法

swfmill(win/mac/linux)

SWFをXML形式のアセンブラに逆コンパイル・再コンパイルするツール。
SWFとSWFをロスなく相互変換ができ、負荷もそれほどかからないのでFlashを動的に生成するときにも便利です。
XML記述を覚えれば単体で簡単なSWF作成もできますし、他のSWFもリソースとして使用できるのでSWFを合成することもできます。
実際にあった事例として、業務でサーバプログラム(PHP)で動的なFlashを生成するときに利用したこともあります。

使い方:
$ swfmill swf2xml source.swf dest.xml # SWF(バイナリ) から XML(アセンブラ) に変換
$ swfmill xml2Swf source.xml dest.swf # XML(アセンブラ) から SWF(バイナリ) に変換

参考:
swfmillでケータイFlashを動的生成してみよう(インストール編)
swfmill – simple で扱う XML の書式 – タグ一覧

Flasm(win/mac/linux)

SWFのアセンブラ変換ツール。swfmillと組み合わせるといい感じ。
参考:Flashで覚えるアセンブラ・スタックマシン入門(Flasm)(1) – Flashのアセンブラ Flasm を使ってみよう

SWFTools(win/linux)

画像や動画からswfを作ったり、逆に分解したりするコマンドラインツール集。デコンパイルより生成が得意な感じです。

参考:swftoolsを使ってみる

Sothink SWF Decompiler (win/mac)

これだけ有料で、安くもないのですが、かなり高い精度で swf から .fla を生成することができます。
リソース取り出しや部分的な置き換えは他のフリーソフトでも十分ですが、
SWF を元に .fla を作りなおす必要があるときはこのツールが約に立つでしょう。

体験版でも使用可能ですが、体験版には以下の利用制限があります。

1. Exporting Video type resources is disabled in unregistered version.
(未登録版ではビデオタイプのリソースをエクスポートできません。)

2. In the unregistered version, only TWO resources in each category can be exported.
(未登録版では1カテゴリあたり2つのリソースまでしかエクスポートできません。)

3. Viewing all ActionScript is supported, but copying and pasting are unavailable.
(すべてのアクションスクリプトの表示をサポートしていますが、コピーとペーストは不可能です。)

4. The unregistered version allows you to replace SWF elements and preview the result, but “Save” and “Save as” functions are prohibited for saving the new SWF files.
(未登録版はSWFエレメントの置換実行とその結果確認ができますが、新しいSWFとして保存する機能(“Save”や”Save as”)は禁止されています。)

5. In the trial version, all the decompiled resource files and ActionScripts can be viewed clearly and it is enough for you to test the software performance.
(体験版では、デコンパイルされた全てのリソースファイルとアクションスクリプトをはっきり見ることができるので、十分にソフトウェアのパフォーマンステストを行えます。)

他にも、解析用ツールとしてはAdobe純正でフリーで使えるAdobe SWF Investigatorというものもあるようです。
Adobe、Adobe AIR製のSWF解析ツール「Adobe SWF Investigator」をプレビュー公開

ここで紹介したツールはそれぞれ得手不得手があり、できることも様々ですので用途に応じて使い分けるのがよさそうですね。

[PHP][Yii] モデルでタイムスタンプを自動更新する

Yii 1.1 のモデル(CModel)で自動更新する方法のメモ。

参考: Yii 1.1: How to automate timestamps in ActiveRecord models

CActiveRecord::rules()で設定する

/**
 * @return array validation rules for model attributes.
 */
public function rules()
{
    return array(
        // 略
        array('modified','default',
              'value'=>new CDbExpression('NOW()'),  // PHPのタイムスタンプを使うならdate('Y-m-d H:i:s')など
              'setOnEmpty'=>false,'on'=>'update'),
        array('created,modified','default',
              'value'=>new CDbExpression('NOW()'),
              'setOnEmpty'=>false,'on'=>'insert')
    );
}

CActiveRecord::beforeSave()で更新する

public function beforeSave() {
    if ($this-&gt;isNewRecord)
        $this->created = new CDbExpression('NOW()');

<pre><code>$this-&gt;modified = new CDbExpression('NOW()');

return parent::beforeSave();
</code></pre>

}

CTimestampBehaviorを使う

    // CActiveRecord::behaviors()
    public function behaviors(){
        return array(
            'CTimestampBehavior' => array(
                'class' => 'zii.behaviors.CTimestampBehavior',
                'createAttribute' => 'created', // 作成日時のカラム名(デフォルト: create_time)
                'updateAttribute' => 'modified', // 更新日時のカラム名(デフォルト: update_time)
                'setUpdateOnCreate' => true,    // 作成時にupdateカラムも更新するか(デフォルト: false)
            )
        );
    }

どれを使うかはお好みですね。

[.Net Framework][C#] ListViewで列を自動リサイズする

カラム長を最低幅に自動調整

カラムの文字数や要素の文字数が表示できる最低限のサイズに自動調整するにはListViewの以下のメソッドを使います。

ListView#AutoResizeColumns(スタイル指定)
すべてのカラムに対して適用する。
AutoResizeColumn(カラムインデックス,スタイル指定)
特定のカラムに対して適用する。

提供されているスタイルは2種類です。

ColumnHeaderAutoResizeStyle.HeaderSize
列のヘッダ文字列が最低限表示できるサイズに自動調整する。
ColumnHeaderAutoResizeStyle.ColumnContent
現在の列に含まれる全ての要素(ヘッダ除く)が最低限表示できるサイズに自動調整する。

例:

listView.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
[/sharp]

<h2>カラム長を最大幅に自動調整</h2>

自動でリストの幅いっぱいのサイズまで埋めた長さに設定する方法は標準で提供されていませんが、
次のように実装することで実現できます。

[csharp]
using System.Windows.Forms;

class FillableListView: ListView
{
        public FillableListView():base(){
            this.ClientSizeChanged += (sender, args) =>
                handleFillColumn();
            // 利用例:最初の列を自動調整する。
            this.AutoFillColumn = 0;
        }

<pre><code>    private int _autoFillColumn = -1;
    /// &lt;summary&gt;
    /// リストの空列を補うよう自動調整を行うカラム番号(0~)。
    /// 負の値やカラム数を超える場合は調整を行わない。
    /// &lt;/summary&gt;
    public int AutoFillColumn
    {
        get { return this._autoFillColumn; }
        set
        {
            this._autoFillColumn = value;
            this.handleFillColumn();
        }
    }

    private void handleFillColumn()
    {
        System.Diagnostics.Debug.Print("fillcolumn:{0},{1}",this._autoFillColumn , this.Columns.Count);
            if (this._autoFillColumn &gt;= 0 &amp;&amp; this._autoFillColumn &lt; this.Columns.Count)
                fillColumnWidth(this, this._autoFillColumn);
    }
    /// &lt;summary&gt;
    /// リストビューの特定のカラム幅を余白を埋める幅に調整する。
    /// &lt;/summary&gt;
    /// &lt;param name="listView"&gt;&lt;/param&gt;
    /// &lt;param name="index"&gt;&lt;/param&gt;
    private static void fillColumnWidth(ListView listView, int index)
    {
        int width = listView.ClientRectangle.Width;
        for (int i = 0; i &lt; listView.Columns.Count; i++)
        {
            if (i == index) { continue; }
            width -= listView.Columns[i].Width;
        }
        listView.BeginUpdate();
        listView.Columns[index].Width = Math.Max(width, 0);
        listView.ResumeLayout(true);
        listView.EndUpdate();
    }
</code></pre>

}

実装時の要点

キモは次の3つ。

  • リサイズへの対応はClientSizeChangedイベントで更新する。
  • カラム長はListView#Widthでなくクライアント領域(listView.ClientRectangle.Width)で計算する。
  • ListView#BeginUpdate()からListView#EndUpdate()の間でリサイズ変更を適用する。

の3つです。
これを守っていればどのように実装しても大丈夫です。

最後に

今回は自前での実装を行いましたが、GPLライセンスで問題なければObjectListViewというライブラリを使うと幸せになるかもしれません。

Google Calendar API のタイムゾーン設定方法

Google カレンダー API で時間が9時間ずれて表示されたり、取得範囲が指定したよりも9時間ずれたりしていて散々はまった。
続きを読む Google Calendar API のタイムゾーン設定方法

画像処理ツール ImageMagick の便利なコマンド逆引きまとめ

ImageMagickでやりたい事からコマンドオプションを調べるための逆引き辞典的なまとめ。
項目は随時追加予定です(2013-11-21更新)。

詳細については ImageMagick公式サイトのUsageOptions を参照すると幸せになれます。

基本

画像形式を相互変換する(GIFからJPEG, JPEGからPNGなど)

convert input.gif output.jpg

convertコマンドは拡張子から画像形式を自動判別して変換することができます。上記の例では GIF から JPEGへ変換しています。
拡張子がないファイル名を扱うときなど、拡張子に依存せずに変換したい場合はプレフィクスをつけることで任意の画像形式として取り扱うことも可能です。


<h1>JPEG 形式の input.dat ファイルを PNG形式のimage0001に変換する。</h1>

convert jpeg:input.dat png:image0001

画像の読み込み、保存に標準入力、標準出力を使う

cat input.jpg | convert - -resize 50x50 - > output.jpg
cat input.jpg | convert jpg:- -resize 50x50 png:- > output.png

標準入力、標準出力を扱いたい場合、ファイルの代わりにハイフンを指定します。
入力値でプレフィクスによる画像形式指定を省略した場合は自動判別されます。
同様に出力値で画像形式指定を省略した場合、入力値と同じ形式で出力されます。

SVGからPNG(JPEG,GIF)へ変換する。

convert input.svg -resize 1600x1600 output.png

SVGはPNGやJPEG,GIFなど他の画像と同様に入力画像として扱えます。
jpegやgifにする場合は、output.pngの拡張子を変えるだけでOKです。

色の変換

カラー写真をグレースケール画像、セピア画像に変換する

グレースケール(モノクロ写真)への変換。

convert input.jpg -type GrayScale output.jpg

セピア調画像への変換。

convert input.jpg -sepia-tone '80%' output.jpg

グレースケールの画像を単色のアルファ画像に変換する。

convert  from.png -background '#99FFFF' -channel A -combine to.png

黒い部分を透明、白部分を不透明として、-backgroundで指定した色(例では#99FFFF)で塗りつぶしたアルファ画像に変換します。

画像の色を反転する。

convert from.png -negate to.png to.png



画像操作

画像の向きを上下反転・左右反転する


<h1>上下反転</h1>

convert input.png -flip output.png

<h1>左右反転</h1>

convert input.png -flop output.png

画像の一部を切り抜く

-crop geometry

使用例:座標(10, 20)から30×40ピクセル切り抜く

convert input.png -crop '30x40+10+20' output.png

サイズ指定必須、座標は省略可能です。

画像をリサイズする

-resize geometry

使用例: アスペクト比を維持しつつ100×100に収まるのサイズにリサイズする。

convert input.png -resize '100x100' output.png

サイズ指定必須。サイズには -resize ‘50%’ のようにパーセント指定が可能です。
デフォルトでアスペクト比を維持したままリサイズしますが、-resize ‘100×100!’のようにサイズ指定にエクスクラメーション記号(‘!’)を指定した場合はアスペクト比を無視したリサイズを行います。

横幅だけに合わせてリサイズ、または縦幅だけに合わせてリサイズを行いたい場合、-resize ’50x’ や -resize ‘x50’のように不要なサイズ指定を省略することで一方だけを基準としたリサイズが実現できます。

画像を回転する

-rotate degree{<}{>}

例: 画像を90度回転する

convert input.png -rotate 90 output.png

回転角を度数で指定します。
90の倍数以外の場合、回転後の画像が収まるサイズにキャンバスが拡張され、余白部分は背景色で塗りつぶされます。
-rotate ’90<‘のように不等号を指定すると、元が縦長(‘<‘)、または横長(‘>’)の時だけ回転処理を行うことが可能です。

画像をトリミングする

-trim +repage

使用例:

convert input.png -trim +repage output.png

画像の上下左右の余白部分をトリミングします。
-trimだけでも画像はトリミングされますが、キャンバスサイズはトリミングされないため、+repageと組み合わせて使いましょう。

トリミングを行う対象は四隅の色と一致する色です。
近似色までトリミングしたい場合は -fuzz distance{%} オプションで近似色の許容範囲を事前に設定して下さい。

convert input.png -fuzz 10 -trim +repage output.png

【iOS】音楽を止めずに効果音を同時に再生するには

iOSでは音を再生する時の選択肢として MediaPlayer Farmework と AVFoundation Frameworkの2種類があります。

今回はこれらの組み合わせで多重再生ができないかどうかを調べてみました。

続きを読む 【iOS】音楽を止めずに効果音を同時に再生するには

Vagrantでハマった時の対策

Vagrantの実行で失敗する時は
環境変数 VAGRANT_LOG=info または VAGRANT_LOG=debug をつけて実行するといいみたい。
指定すると実行ログが詳細になりエラー内容が出てくるようになります。

vagrant-awsプラグインを使ったときだけエラーが出ていて、原因がしばらく不明でしたが、これでAWSの認証で失敗しているのが原因だと分かり解決しました。
エラー時はデフォルトで失敗理由を教えてくれたらいいのにな。

$ VAGRANT_LOG=info vagrant up --provider=aws