Objective-C でなんとなく知っているけど実はよく知らないプロパティ(@property)まわりの
基本的な仕様をまとめました。
Xcode6.1が正式リリースされてSwiftのβがとれたし、「Swift使うからいらないよ」なんて言わないで、iOS開発のお供にどうぞ。
Objective-C でなんとなく知っているけど実はよく知らないプロパティ(@property)まわりの
基本的な仕様をまとめました。
Xcode6.1が正式リリースされてSwiftのβがとれたし、「Swift使うからいらないよ」なんて言わないで、iOS開発のお供にどうぞ。
iOS7以降(iOS7.1, iOS8も)、UIButtonにsetTitleすると勝手にボタンがアニメーションをしてしまうようです。
たとえばコードからデフォルト値設定したいだけなのに[UIButton setTitle:]したら、チラッとUIビルダーの設定値が出ちゃってなんだかあれだったので、止める方法をメモしておきます。
iOSやMac OS Xで使用されるplist形式(プロパティリスト)と、
Androidやwebシステムで使いやすいJSONに相互変換したい場合のメモ。
続きを読む plist と json を相互変換する
ほお、と思ったのでメモ。
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%しか劣化していないのですね。
もっと劣化してると思っていたけど結構優秀。
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 などが
公開ディレクトリに混ざってしまってもアクセスできないようになるので安全ですね。
逆コンパイルというとアレな感じなのですが、どうしても逆コンパイルが必要な時ってありますよね。
たとえばswfだけあってソースが無いFlashの移植開発だったり、
ソースをもらえないFlashと通信するシステム開発でデバッグの時に逆コンパイラでFlashから.flaや.asなどソースが取得できれば
随分効率が違います。
また、デコンパイラ・コンパイラ両方の機能を備えているものも多く、
Adobe 製品を使わずに無料でFlash開発する事も可能です。
コマンドラインでSWFを分解・再構成できるツールを使うと
SWFを素材として扱い、Flashを動的に生成する必要のあるWebサービス・プログラムを作成する事も可能になります。
ということで、無償で使える(一部有料ソフトもあり)のコンパイラ・逆コンパイラを紹介します。
使い方:
HugFlash.exeを起動して、HugFlashのウィンドウ上で右クリック → モード → HugDimensionを設定しておき、ウィンドウに対象swfをドラッグ&ドロップ。
使い方:
$ swfmill swf2xml source.swf dest.xml # SWF(バイナリ) から XML(アセンブラ) に変換
$ swfmill xml2Swf source.xml dest.swf # XML(アセンブラ) から SWF(バイナリ) に変換
参考:
swfmillでケータイFlashを動的生成してみよう(インストール編)
swfmill – simple で扱う XML の書式 – タグ一覧
参考:swftoolsを使ってみる
体験版でも使用可能ですが、体験版には以下の利用制限があります。
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」をプレビュー公開
ここで紹介したツールはそれぞれ得手不得手があり、できることも様々ですので用途に応じて使い分けるのがよさそうですね。
Yii 1.1 のモデル(CModel)で自動更新する方法のメモ。
参考: Yii 1.1: How to automate timestamps in ActiveRecord models
/**
* @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')
);
}
public function beforeSave() {
if ($this->isNewRecord)
$this->created = new CDbExpression('NOW()');
<pre><code>$this->modified = new CDbExpression('NOW()');
return parent::beforeSave();
</code></pre>
}
// 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)
)
);
}
どれを使うかはお好みですね。
カラムの文字数や要素の文字数が表示できる最低限のサイズに自動調整するにはListViewの以下のメソッドを使います。
提供されているスタイルは2種類です。
例:
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;
/// <summary>
/// リストの空列を補うよう自動調整を行うカラム番号(0~)。
/// 負の値やカラム数を超える場合は調整を行わない。
/// </summary>
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 >= 0 && this._autoFillColumn < this.Columns.Count)
fillColumnWidth(this, this._autoFillColumn);
}
/// <summary>
/// リストビューの特定のカラム幅を余白を埋める幅に調整する。
/// </summary>
/// <param name="listView"></param>
/// <param name="index"></param>
private static void fillColumnWidth(ListView listView, int index)
{
int width = listView.ClientRectangle.Width;
for (int i = 0; i < 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つ。
の3つです。
これを守っていればどのように実装しても大丈夫です。
今回は自前での実装を行いましたが、GPLライセンスで問題なければObjectListViewというライブラリを使うと幸せになるかもしれません。
Google カレンダー API で時間が9時間ずれて表示されたり、取得範囲が指定したよりも9時間ずれたりしていて散々はまった。
続きを読む Google Calendar API のタイムゾーン設定方法
ImageMagickでやりたい事からコマンドオプションを調べるための逆引き辞典的なまとめ。
詳細についてはImageMagick 日本語ドキュメントにまとめています。
convert input.gif output.jpg
<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
convert input.svg -resize 1600x1600 output.png
グレースケール(モノクロ写真)への変換。
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
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{<}{>}convert input.png -rotate 90 output.png
回転角を度数で指定します。
90の倍数以外の場合、回転後の画像が収まるサイズにキャンバスが拡張され、余白部分は背景色で塗りつぶされます。
-rotate ’90<‘のように不等号を指定すると、元が縦長(‘<‘)、または横長(‘>’)の時だけ回転処理を行うことが可能です。
-trim +repage
convert input.png -trim +repage output.png
トリミングを行う対象は四隅の色と一致する色です。
近似色までトリミングしたい場合は -fuzz distance{%} オプションで近似色の許容範囲を事前に設定して下さい。
convert input.png -fuzz 10 -trim +repage output.png