kasa0の部屋
http://www.kasa0.com/blogn/
ビート・Flex・コミックなどについて書き捨てるページ
ja
- http://www.kasa0.com/blogn/index.php?eid=454SONYのCyber-shot DSC-RX100はコンパクトでありながら、1.0型センサーを持っていて高画質でよいコンデジですね。
しかし、コンパクトなので持ちにくいし、フラッシュが上にポップアップするので左手の方は本当に困ります。
そこで、後付のグリップが無いかと探したら、社外品ですが良さそうなのがありました。
Richard Franiec氏が作っているカスタムグリップで、RX100専用に作成されているのフィット感もバッチリです。
PayPalを使えば簡単に注文できますし、「英語はちょっと…」というのならばオリエンタルホビーから注文もできます
ただし、1000円ぐらい高くなってしまいます。
見た目はプラスティックで軽そうに見えますが、アルミ削りだしでズッシリした重さがあります。
取り付けは両面テープですが、3Mの両面テープは強力なので、全然問題ありません。
RX100オーナーの方、いかがですか?]]>2013-04-28T20:33:56+09:00kasa0Blognkasa0 - http://www.kasa0.com/blogn/index.php?eid=453
Android
int i = 0;
String name = new String();
iOS
int i = 0;
NSString *name = [NSString alloc];
ところが、これがインスタンス変数になると話が変わってきます。
Androidの場合は、基本的にはローカル変数と同じように書けばよく、アクセス修飾子(public, protected, private)を付けることにより、変数のスコープを設定することができます。
class Hoge {
private int i;
public String name;
}
いっぽうiOSでは、インスタンス変数を直接参照するのではなく、プロパティとして間接的にアクセスするようになっています。
Hoge.h@interface Hoge
@property (assign, nonatomic) int i;
@property (assign, nonatomic) NSString *name;
@end
Hoge.m@implementation Hoge
@synthesize i = _i;
@synthesize name = _name;
@end
iOSの方は、ヘッダとコードの分かれて定義されて、ヘッダの"@property"から始まる行がプロパティの定義になり、それに対応するコードが"@synthesize"の行になります。
コードで、プロパティに"_"(アンダースコア)で始まる変数を導入していますが、この"_"で始まっている変数がインスタンス変数になります。
インスタンス変数はどこで定義しているのかと疑問が出てくるのですが、以前はインスタンス変数の定義を記述するようになっていました。
ですが、今はインスタンス変数の定義を記述する必要はなく、暗黙的にプロパティに"_"をつけたインスタンス変数が定義れていることになっています。
iOSの方が、まだるっこしいような感じがしますが、その代わりプロパティの宣言に、プロパティ属性としてセマンティクス(assign, strong, weak...)とアトミック性を指定できるところは、Androidに比べるとスマートに感じます。]]>2012-12-19T16:19:12+09:00kasa0Blognkasa0 - http://www.kasa0.com/blogn/index.php?eid=452
ListPreferenceで選択されたものをSummaryとして表示するのは、いろいろなサイトで紹介されていますが、カラーを選択させた場合にそれをアイコンとして表示する方法が見つからなかったので、作ってみました。
Android 3.0(API Level11)からPreferenceに setIconメソッドが追加されており、これを使用することによりsummaryにアイコンを表示できるようになりました。
決まったアイコンを表示するだけならアイコンリソースを指定すれば良いのですが、たくさんの色がある場合に全色のアイコンを用意するのは面倒なので、動的にカラーアイコンを作成するようにします。
動的にカラーアイコンの作成をするには、GradientDrawableを使用して行います。
private void setColorSummary(ListPreference preference, String value) {
int[] colors = getResources().getIntArray(R.array.color_array);
int size = (int)getResources().getDimension(R.dimen.icon_size);
int i = Integer.parseInt(value);
GradientDrawable drawable = new GradientDrawable();
drawable.setSize(size, size);
drawable.setStroke(2, Color.BLACK);
drawable.setColor(colors[i]);
preference.setIcon(drawable);
}
GradientDrawableクラスのインスタンスを作成し、サイズと枠線の設定をします。
サイズはそのまま値を指定してしまうと、画面の解像度によって大きさが変わってしまうので、Dimensionリソースに定義して自動的にサイズ調整されるようにします。
あとは、選択されたカラーを設定して、Drawableインスタンスを setIconメソッドの引数に指定すれば、めでたくsummaryにカラーアイコンが表示されます。
dimens.xml
icon_size">40dp
arrays.xml
color_array">
- 0xFFA9A9A9
- 0xFF4682B4
- 0xFFC71585
- 0xFF556B2F
- 0xFF808000
- 0xFFD2691E
- 0xFF000000
]]>2012-11-05T13:08:34+09:00kasa0Blognkasa0 - http://www.kasa0.com/blogn/index.php?eid=451SwitchPreference」ですが、勝手にスイッチが切り替わるバグがあります。
画面がスクロールするくらいたくさんの SwitchPreferenceを並べた設定画面を作成します。
順番にスイッチを切り替えて行き、スクロールしていきます。
スクロールアウトした SwitchPreferenceを再び表示してみたら、値が変更前の状態に戻ってしまっています[:あぅ:]
2012年2月の時点で Issueに上がっているので、広く知られているバグだったのかもしれませんが、気がついたときには自分がどこかミスっているのではないかと、一生懸命デバッグしてました[:汗:]
幸いIssueに対処方法が載っていたので、問題の解決もあっさりできてよかった。]]>2012-10-30T10:31:44+09:00kasa0Blognkasa0 - http://www.kasa0.com/blogn/index.php?eid=450Facebookから「Account blocked」なんてタイトルのメールが来たと思ったら、今はやり(?)のフィッシングサイトへの誘導メールのようです。
メールの送信者は簡単に偽装できるので、送信者だけを見て信用してはいけません。
「Sign in」のリンクにマウスカーソルを合わせるとステータスバーのところにURLが表示されますが、全然Facebookのドメインと違うサイトのURLなので、怪しいサイトであることがすぐに分かります。
テキスト形式のメールならすぐに怪しいサイトなのが分かりますが、最近はHTML形式のメールも多くなり、よく注意しないと分からなくなっています。
そういう意味では、企業も安易にHTML形式のメールを使用することについてすこし考えて欲しいものです。]]>2012-10-17T20:18:18+09:00kasa0Blognkasa0 - http://www.kasa0.com/blogn/index.php?eid=449
Android、iOSでは多言語対応の仕組みを提供しています。
■Androidの場合
res/values/strings.xml に文字列リソースを定義するようになっており、valuesフォルダを言語ごとに分けることで、多言語対応しています。
例えば日本語の場合だと values-ja というフォルダ名になります。
文字列リソースファイルは下記のようになっています。
hoge">Hello hoge.
文字列リソースを使用する場合は、
String msg = getString(R.string.hoge);
のようにgetStringメソッドにリソースIDを指定して取得することができます。
レイアウトファイルで使用する場合には、ウィジェットのパラメータに
android:text="@string/hoge"
と記述するだけでOKです。
■iOSの場合
Localizable.strings の File Inspectorにある Localization に対応言語を追加して、該当ファイルに文字列を定義することにより、多言語対応しています。
文字列リソースファイルは下記のようになっています。
/* Hello message */
"hoge" = "Hello hoge."
文字列リソースを使用する場合は、
NSString * msg = NSLocalizedString(@"hoge", @"Hello message")
のように NSLocalizedString関数にメッセージキーとコメントを指定して取得することができます。
コメントは、nilでもかまわないのですが、次に説明するgenstringsコマンドの出力にコメントとして反映されます。
iOSではソース内のNSLocalizedString関数の使用箇所から Localizable.stringsファイルを生成する genstringsコマンドがあります。
しかし、このコマンドはNSLocalizedString関数の第1引数をメッセージキーとメッセージとして登録するだけなので、ソースのNSLocalizedString関数にメッセージと同じ文字列をメッセージキーとして設定するか、Localizable.stringsファイルを後から編集する必要があります。
レイアウトファイル(xib)で使用する場合も、File Inspectorにある Localization に対応言語を追加すればよいのですが、これだとレイアウトファイルが丸ごとコピーされてしまうので、同じ文言でも全て1つずつ変更しなければいけません。
そこで、ibtoolコマンドです。
これは、レイアウトファイルから使用されている文字列を抽出してくれるツールで、逆に抽出された文字列からレイアウトファイルを作成することもできます。
使用方法は、
ibtool --generate-strings-file en.lproj/Hoge.strings en.lproj/Hoge.xib
で元となるレイアウトファイル(en.lproj/Hoge.xib)から文字列を抽出します。
できたファイル内の文字列を対応する言語の文字列に変更して、言語に対応したフォルダ(日本語ならja.lproj)に保存します。
下記のコマンドで保存したファイルと元となるレイアウトファイルから、新しいレイアウトファイルを作成します。
ibtool --strings-file ja.lproj/Hoge.strings --write ja.lproj/Hoge.xib en.lproj/Hoge.xib
元のレイアウトを変更するたびに、この作業を繰り返さなければいけないというのは面倒な話で、その点ではAndroidの方が簡単でよいですね。]]>2012-08-28T11:38:48+09:00kasa0Blognkasa0 - http://www.kasa0.com/blogn/index.php?eid=448QNAPのQPKGプラグインのQUSBCamを使用すれば、Webカメラをネットカメラとして使えます。
このプラグインをバージョン2.0にバージョンアップしたら使えなくなってしまいました。
QUSBCamの画面ではSnapshotができるので、QUSBCamの問題ではないようだ。
Surveillance StationからQUSBCamが認識できないようだから、何かSurveillance Stationから参照する設定が変わったようです。
よくよくQUSBCamの画面を見てみると、Streamingがバージョン1.0では"/video.cgi"でしたが、バージョン2.0では"/video0.cgi"になっていました。
何でこんなところを変更したのやら。
Surveillance StationのHTTP URLを"/video0.cgi"に変更したら無事に認識できるようになりました。]]>2012-07-16T19:34:06+09:00kasa0Blognkasa0 - http://www.kasa0.com/blogn/index.php?eid=447
できるだけシンプルなソースでできるように考えてみました。
ロジック的には、$digits2の値を追加していけば、無限大数以上でも可能なのだが、「じょ」の漢字がUnicodeとかじゃないと表示できないので、最高24桁までの対応として、それ以上の桁の数値の場合にはそのまま文字列を返す仕様としています。
function number2Kanji($numbers) {
if (strlen($numbers) > 24) { // 変換可能範囲外
return $numbers;
}
$digits = array('', '十', '百', '千');
$digits2 = array('', '万', '億', '兆', '京', '垓');
$pattern = array('', '一', '二', '三', '四', '五', '六', '七', '八', '九');
$num_array = array_reverse(str_split($numbers));
for ($i=0; $i < count($num_array); $i++) {
if ($i == 0) { // 一桁目
$str_number = $pattern[$num_array[$i]] . $str_number;
} else {
$j = $i % 4;
$digit = $digits[$j];
if ($j == 0) {
$digit2 = $digits2[($i / 4)];
}
if ($num_array[$i] != '0') {
$str_number = $digit . $digit2 . $str_number;
if ($num_array[$i] != '1' || $j == 0) {
$str_number = $pattern[$num_array[$i]] . $str_number;
}
$digit = '';
$digit2 = '';
}
}
}
if (strlen($str_number) == 0) { // 何も入ってなかったら0
return '〇';
}
return $str_number;
}
]]>2012-05-24T15:15:42+09:00kasa0Blognkasa0