2014年9月28日日曜日

ブログ移転

管理してるサイトが多くなって、管理しきれないので、今後はこちらに記事を書きます!

http://fumobox.com/

2014年7月8日火曜日

Android時計のセットアップ

前回の続き。LG G Watchをセットアップしてみた。使っている親機はNexus7(2012)。Android4.3以降の端末なら使えるようだ。


時計を起動すると、Android Wearを探してインストールすれというメッセージが出たので、Google Playで検索してインストール。


何やら、物騒なパーミッション要求。Google謹製じゃないと絶対こんなの入れたくないw


Bluetoothでデバイスが認識されているようだ。特にトラブルなくペアリングできた。


Google検索もアップデートすれと言われたので、


OKを押すと、Play Storeのページに飛ぶので、また物騒なパーミッション要求を受け入れてインストール。


時計の方は何かをダウンロードしているようだ。


ダウンロードが完了すると時計は再起動し、スタート画面が表示された。10分ほどかかった。


地震速報が出てる!

LG G Watch



最近ブログ更新してないけど、まだ生きてます。

何か新しいアプリ作りたいなと思ってLG G Watchを買ってみた。Androidスマホと連携できるようだが、自分の持ってるスマホはiPhoneだった。無意味。Nexus7あるから、それと通信できるかもしれない。週末にいじってみよう。

触ってみると、ゴムのベルトが想像以上に柔らかかった。感触良いけどすぐ切れそう。

あと、充電クレードルの裏面のシールは剥がすと粘着テープになっているので注意!
貼り付けずに使っているので、早速ゴミだらけに...ひどい罠だ。

電源を入れると言語選択画面が出て、選択すると上のような画面が出た。ここから先は親機との連携が必要らしい。後でやってみよう。

起動時に表示されるLGロゴがなんかダサいので消したいw

2014年3月28日金曜日

アスペクト比計算機

画像を作っている時に、サイズをアスペクト比に合わせてトリミングすることが多いので、計算が簡単にできるように計算機を作ってみました。

アスペクト比計算機


2014年3月27日木曜日

消費税計算機

消費税を毎回手計算するのが面倒なので作ってみました。8%になったらどう変わる、10%になったらどう変わるかを比較できます。

消費税計算機

2014年3月26日水曜日

HTML Tag Sanitizer



HTMLコードを、ブログに載せる時に、タグがそのままだと正しく表示できないので、特定の記号をサニタイズするツールを作りました。

HTML Tag Sanitizer

HTMLエスケープツールをいつも利用させてもらっていたけど、使う頻度が高いから自分でカスタマイズできる物を作ってみようと思い、BootstrapとjQueryの復習がてら作ってみました。Bootstrapは、簡単な小物を作るときにすごく便利ですね。

データは全てローカルで処理するので、安全に変換できます。

2014年2月26日水曜日

モノクロ液晶画面風ボックス


このアプリのUIが素敵だったので、CSSのボックスで再現してみた。


モノクロ液晶画面風ボックス

IE11、Chrome、Opera、Firefox、Safariで動作確認済み。このサイトにも早速適用してみた。

至高のfont-family

Webサイトのフォント設定に毎回悩むので、何か良い例はないかと思い、探していたらこんなのを見つけた。

【決定版】僕の考えた最強のfont-family指定
body {
    font-family: 'Hiragino Kaku Gothic ProN', Meiryo, 'MS PGothic', Sans-serif;
    font-size: 14px;
    line-height: 1.3;
    font-weight: normal;
}
すごく良いかも。line-heightは個人的には1.6が好きなので、font-familyだけ使わせてもらおう。もうフォント選びに迷わない!

Bitmapを綺麗に表示させる

Bitmapを拡大縮小して描画すると、画像が汚くなってしまうことがある。そのような場合、PaintクラスのsetFilterBitmapメソッドを実行すると、画像が綺麗に表示される。
Paint p = new Paint();
p.setFilterBitmap(true);
ただし、この処理は若干重いので、大きな画像を扱ったり、大量の画像を扱う際には気をつけよう。

3000x3000のBitmapに、この処理を加えると、はっきり遅延を体感できる。Androidでそんなに大きな画像を扱うのがそもそも問題だけどw

2014年2月25日火曜日

OpenFL情報はこちら


OpenFLに関する情報は、大きなテーマになりそうなので、別サイトに専用ページを作成しました。

2014年2月22日土曜日

Eclipseで行番号や空白を表示する


Eclipseで行番号や空白を表示するには、

Window -> Preference -> General -> Editors -> Text Editorsの

Show line numbersShow whitespace charactersをチェックする。

これも毎回忘れてしまうのでメモっておくw

OpenFLを始める前に用語の確認

OpenFLを本格的に勉強しようと思ったけど、その前に、知らない用語だらけだったので、よく見る用語について整理してみた。

OpenFL

OpenFLは、ゲームやアプリケーションを構築するための環境を提供するフリーでオープンソースのソフトウェア開発キットです。
http://ics-web.jp/lab/archives/1329より

OpenFLで使用するHaxeは、Action Scriptに似ていて、Flashとほぼ同じAPIが使える。Airより速いらしい。

Windows, Mac, Linux, iOS, Android, BlackBerry, Tizen, Flash, HTML5向けの実行ファイルを出力できるらしい。万能すぎ!



Haxe(ヘックス)

Haxeとは、汎用プログラミング言語の一つで、静的型付けのオブジェクト指向言語であり、構文はActionScriptおよび標準化が中止されたECMAScript 4に類似している。
http://ja.wikipedia.org/wiki/Haxeより

まだ全部見てないけど、かなり素敵な言語だ。enumが便利そう。



Lime(ライム)

Lime(Light Media Engine)とは、スクリプト言語またはバーチャルマシンに依存せずに、単一のコードベースでクロスプラットフォームをシンプルに実現するための抽象レイヤーである(意訳)。
https://github.com/openfl/limeより

OpenFLは、これを使って、各プラットフォーム向けのコードを生成しているのかな。



Neko

Nekoは、Nicolas Cannasseによって開発されたハイレベルのdynamically typed programming languageで、コンパイラとガベージコレクタを備えたバーチャルマシンを持っている(意訳)。
http://en.wikipedia.org/wiki/Neko_(programming_language)より

Limeとの違いがよくわからないけど、まあ今のところは似たようなものだと認識しておくw



NME

どうやら、OpenFLの前身となる技術のようだ。あまり重要じゃなさそうなので省略。


要するに、OpenFLというのは、Haxeで書いたコードを、LimeやNekoを使って、各プラットフォーム向けの実行ファイルに変換するための環境ってことか。でも、これだけ知っていれば万能ってことでもなく、複雑なことをやろうとすると、ある程度変換先のシステムについても知っておかないと活用できないかも。

いろいろな言語を覚えるのが面倒(覚えても片っ端から忘れる)自分にはぴったりの言語だな。真面目に取り組んでみるか。

2014/02/26

LimeとNekoの関係を、勘違いしていたかも。Limeは、HaxeのコードをNeko用に変換して、Nekoはそれを解釈してプログラムを実行するっていう仕組みのようだ。
正確な情報は、こっちに書きますw

OpenFL情報

2014年2月21日金曜日

Eclipseの文字コードをUTF-8に変更する


Window -> Preference -> General -> Workspace -> Text file encoding

いつも忘れるので、ここにメモしておく。

特に理由が無い限りUTF-8にしておくのが無難。

2014年2月18日火曜日

How to make 3D printer data



Fumotrimを使って、3Dプリント用のデータを作る方法です。

Androidで制作したモデルをSTLフォーマットでエクスポートして、Windowsのnetfabbで読み込んで、データを補正しています。

2014年2月14日金曜日

ntpdの状態確認

nptdがDDoS攻撃に使われているようだ。

ntpd の monlist 機能を使った DDoS 攻撃に関する注意喚起

【重要】NTPの脆弱性について

自分のサーバー(Cent OS)は大丈夫かなと調べてみると、
# /etc/rc.d/init.d/ntpd status
ntpd (pid  2091) is running...
nptdばっちり動いてるし...

バージョンを確認してみると、
# ntpq -c rv
4.2.6.xだった...

とりあえず、止めておこう(適当w)。
/etc/rc.d/init.d/ntpd stop

2014年2月12日水曜日

Fumotrim1.7.6: 塗りつぶし機能の追加など


次回のアップデートでは、塗りつぶし機能を追加予定。これは、ペイントソフトにあるような塗りつぶし機能だけど、3Dブロックに適用しようとすると、なかなか難しいので、実装を見送ってきた。特にFumotrimのブロックは固定サイズではないので、アルゴリズムがなかなか複雑。簡単にアルゴリズムを説明すると、

1, 塗りつぶしを始めるブロックをユーザーが指定

2, ブロックの周辺6ブロックを探査して同じ大きさのブロックがあれば、色を塗る。

3, 周辺6ブロックに移動して、2-3を繰り返す。

箇条書きすると簡単そうに見えるけど、ブロック探査が難しい。Fumotrimのブロックの内部構造は、3次元グリッドのような並び方ではなく、8分木構造で、しかもブロックのサイズがばらばらなので、探査アルゴリズムは複雑な仕組みになっている。でも、このアルゴリズムはアイソメトリック図を作るときに、すでに実装していたので、今回は流用するだけで済んでよかった。

最初にコードを書いた時は、再帰処理を使っていたけど、スタックが深くなりすぎて、StackOverflowErrorが発生してしまった。そのため、再帰処理を使わない形式に書き換えた。再帰処理は、やりすぎると落ちるし、メソッド呼び出しの多発で遅くなるので、使用はほどほどに。

あとは、サイズが異なるブロックにも塗りつぶしを適応しようとしたけど、ちょっと面倒な問題があったのでやめた。同じサイズのブロックしか塗りつぶさないっていうポリシーのほうがわかりやすいし。

それから、Undoシステムにも問題があったので修正した。

さらに、レビューコメントでリクエストがあったカメラのシフト機能を実装してみたけど、これは動画で説明しないと難しいかな。3Dビューの両横の余白をタッチしてスライドすると、カメラの注視点を移動できる。英語で説明するのが難しいから動画を撮影しよう...

あと、レンダリング速度もほんの少し速くなったかも。

テストして、週末にリリースできそう。次期アップデートをお楽しみに!

2014年2月7日金曜日

アプリのバージョン情報を取得する

自分のアプリのバージョン情報を取得するには、Activity内に以下のようなコードを書けばよい。
try {
  PackageManager packageManager = getPackageManager();
  PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), PackageManager.GET_ACTIVITIES);
  String versionCode = packageInfo.versionCode;  // バージョンコード
  String versionName = packageInfo.versionName;  // バージョン名
} catch (NameNotFoundException e) {
  e.printStackTrace();
}

2014年2月3日月曜日

わかりやすいAndroid NDK導入手順 2014年版

AndroidでNDKを利用する手順について調べてみました。NDKについての解説記事はたくさんありますが、情報が古くて、そのままだと使えないことが多かったので、現時点での僕が試した方法について説明します。

まずは準備から。

今回使用した開発環境は、Windows7 64bit、JDK1.7.0、ADT(v22.3.0-887826)です。Android SDKのAPIレベルは、最新版の19を使用しました。

コマンドプロンプトからjavahコマンドを実行できるように、あらかじめJDKへのパスは設定しておいてください。パスの設定はこちらが参考になります。

http://www.javadrive.jp/install/jdk/index4.html

まずは、NDKのダウンロードサイトから、NDKのWindows 64bit版をダウンロードします。

http://developer.android.com/tools/sdk/ndk/index.html

android-ndk-r9c-windows-x86_64.zipというファイルです。

ファイルをダウンロードして、解凍したら、C:\ndkというディレクトリを作って、そこに入れてください。場所は任意ですが、ここではわかりやすいように、実際に僕が利用している環境を記します。

C:\ndk\android-ndk-r9c-windows-x86_64\android-ndk-r9c

という場所にNDKが入りました。

次に、ADTを起動して、[Window -Preference]の[Android - NDK]という設定画面を開いてください。


NDK Location

C:\ndk\android-ndk-r9c-windows-x86_64\android-ndk-r9c

と入力して、OKを押して、設定画面を終了してください。

これで設定は完了です。

2014年2月1日土曜日

WebViewを含んだActivityを終了するときに、Window Leakedエラーが発生する

WebViewを含んだActivityを終了するときに、こんなエラーが発生してた。
02-01 13:14:50.958: E/WindowManager(738): android.view.WindowLeaked: Activity com.fb.fumotrim.ui.FStorageActivity has leaked window android.widget.ZoomButtonsController$Container{426b0148 V.E..... ......I. 0,0-1280,65} that was originally added here
どうやら、ズームボタンを有効にしている際に起きるようで、WebView設定のsetBuiltInZoomControls(true)を設定していると、エラーメッセージが出るまではわかった。調べてみると、同じような症状がstackoverflowにあった。もう、stackoverflow先生に足を向けて寝られないw

http://stackoverflow.com/questions/11889562/webview-with-builtinzoomcontrols-throwing-exceptions-and-crashing

ActivityのonDestroyをオーバーライドすると、エラーが出なくなった。
@Override
protected void onDestroy() {
 setVisible(false);
 super.onDestroy();
}
どうしてこうなるかはよくわかってないけど、直ってよかった(^^;)

2014年1月31日金曜日

OpenFLをちょっと触ってみた

OpenFLに関する記事に興味が湧いて、ちょっと触ってみた。ほんとにちょっとだけ。

http://www.openfl.org/download/

特にエラーもなく、Run a Sampleまで、あっさり進めることができた。中身はどんなコードなのかなと思って、Main.hxってファイルを開いてみると、
package;

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import openfl.Assets;

class Main extends Sprite {
 public function new () {
  super ();
  
  var bitmap = new Bitmap (Assets.getBitmapData ("assets/openfl.png"));
  addChild (bitmap);
  
  bitmap.x = (stage.stageWidth - bitmap.width) / 2;
  bitmap.y = (stage.stageHeight - bitmap.height) / 2;
 }
}
昔、頑張って勉強したAction Scriptとそっくり。Action Scriptは、iOSがFlashを表示できないので、すっかり使わなくなってた。これなら、少し思い出すだけでスラスラ書けそうだ。

2014年1月30日木曜日

Toastをキャンセルする

Toastを連続で表示させると、前のToastが消えるまで、新しいToastが表示されないので、Toastの渋滞が起きる。解決するには、下のようなコードをActivityに記述すると良い。
private static Toast t;

public void toast(String message) {
 if(t != null) {
  t.cancel();
 }
 t = Toast.makeText(this, message, Toast.LENGTH_LONG);
 t.show();
}
参考元:
http://stackoverflow.com/questions/6744147/cancelling-an-already-open-toast-in-android

2014年1月28日火曜日

地形を作ろう!

まもなく公開予定のFumotrim 1.7.4では、地形作成機能が追加されます。プリミティブ作成メニューから、下のようなランダムな地形を作成できます。


地形の解像度と平滑度を調整できます。フルバージョンでは高解像度の地形を作成できます。ランダムな地形は、Perlin Noiseを使って作成しています。

Fumotrimで作れるプリミティブ一覧はこちら。
http://fumotrim.net/fumotrim/primitive-generator




本当はここまで細かい地形を作れけど、メモリを激しく消費するので、一段階低い解像度を限度にしています。そのうち最高解像度にも対応したいな。

2014年1月27日月曜日

Perlin Noise Generator

Perlin Noiseについて勉強しようと思ったので、技術検証用にアプリも作ってみました。ダウンロードは下のリンクから!

Android app on Google Play


このようなPerlin Noise画像を作成できます。作成した画像(png)の送信もできます。処理時間もわかるので、簡単なベンチマークにも使えます。


MenuのPreferenceから、画像サイズ、オクターブなどを調整できます。


Perlin Noiseに関して参考にしたサイトはこちら。

Perlin Noiseについて
http://freespace.virgin.net/hugo.elias/models/m_perlin.htm

参考にしたコード。C#はJavaとそっくりなので簡単に移植できた。
http://devmag.org.za/2009/04/25/perlin-noise/

3D版。今回は使っていないけど、そのうち使ってみたい。
http://mrl.nyu.edu/~perlin/noise/

2014年1月24日金曜日

targetSdkVersionを19にすると、Preference画面で強制終了する

Android Manufestのandroid:targetSdkVersionを19にすると、Preference画面を開いて操作しようとすると強制終了するようになった。調べてみると、これが原因らしい。
The default result of {android.preference.PreferenceActivity#isValidFragment PreferenceActivity.isValueFragment} becomes false instead of true.
引用: http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#KITKAT

エラーメッセージをよく見るとこんな行があった。
01-24 00:35:10.461: E/AndroidRuntime(29584): Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.fb.fumotrim.ui.FTPreferenceActivity has not checked if fragment com.fb.fumotrim.ui.FTPreferenceActivity$PF_System is valid.
PreferenceActivityのサブクラスを作る時は、isValidFragment(String)をオーバーライドして、PreferenceFragmentがvalidかどうか検証すれよってことだ。
それで、どうやって書けばいいかと調べていたら、stackoverflowに書いてあった。流石stackoverflow!

http://stackoverflow.com/questions/19973034/isvalidfragment-android-api-19
protected boolean isValidFragment (String fragmentName)
{
  if(StockPreferenceFragment.class.getName().equals(fragmentName))
      return true;
  return false;

}
こんなかんじの内容にすれば良いらしい。フラグメント名をチェックするだけ。proguardを使っている場合は、クラス名の比較に失敗するようなので、proguard.cfgに以下のような例外を追加すると良い。
-keep public class com.fullpackage.MyPreferenceFragment

2014年1月23日木曜日

Fumotrim 1.7.2



Fumotrim 1.7.2を公開しました。

今回は、タッチ操作の改良と、アイソメトリック図のバグ修正と、パラメーター設定機能の追加がメインです。パラメーター設定機能はフルバージョンのみです。

ブロック長押しがしにくいのと、ズーム時にカメラがブレる問題があったので修正しました。これで操作が以前よりも快適になるはず!タッチ操作は、APIにあまり頼らずに、自前で実装しているので、初歩的な不具合が多かった...

アイソメトリック図は、面の前後判定にバグがあったので修正しました。さらに、前後判定アルゴリズムを見直したので、以前よりも描画が高速になりました。

Preferenceから、イメージのサイズ、アンチエイリアス、ボーダーの有無などを設定できます。



イメージのサイズは、当初10,000まで対応しようと思っていたのですが、端末の処理速度的に厳しかったので、3,000までに制限しました。

新しいアイソメトリック図の描画システムを使って、プリミティブ一覧ページも更新しました。

http://fumotrim.net/fumotrim/primitive-generator


2014年1月21日火曜日

Isometric Image その4 UI作り

Fumotrim 1.7.2に向けて、アイソメトリック図の描画オプションを作成中。ただ動く物を作るだけなら簡単だけど、使いやすいUIを1から作ろうとすると、なかなか大変だった。Androidには本当に基本的なUI部品しか無い...


数値入力と、色入力のプレファレンス部品を作成して、画面に組み込んでみた。クリックするとダイアログが出て、値を入力する仕組み。


数値入力ダイアログには、テキスト入力の他に、補助入力スライダーが付いている。矢印をタッチするとテキストボックスの数値が変更される。最小値、減算、加算、最大値に対応している。真ん中のスライダーは、ドラッグして数値を調整できる。


色選択ダイアログは、ここで紹介したダイアログを流用してみた。

UI部品は、一度作ってしまえば、再利用しやすいので、手を抜かずに頑張ろう!



ところで、画面を作っている途中で、SwitchPreferenceのバグに遭遇したのでメモしておく。

複数のSwitchPreferenceを使っている場合に、画面をスクロールすると、値がリセットされるという、とんでもないバグがあるようだ。

https://code.google.com/p/android/issues/detail?id=26194

コメント4のように、SwitchPreferenceを独自拡張して使うと解決できた。

2014年1月18日土曜日

戦車のモデルを公開しました


戦車のモデルを公開しました。Fumotrimから、Tools -> Fumotrim Storageを開いて、戦車のページを開くと、ロードボタンが表れるので、それを押すと、Fumotrimにロードされます。

http://storage.fumotrim.net/model/114

次期バージョン(1.7.2)の有料版では、アイソメトリック図の、解像度指定と、アンチエイリアスに対応予定です。上のような、高解像度のアイソメトリック図を出力可能です。

解像度は、幅10,000ピクセルまで対応していますが、スペックが低い端末で描画しようとすると、大変なことになる可能性があるので注意w まあ、一応検証してみようと思うけど...

アンチエイリアスの精度は、SDKまかせなので、上図のようにブロックのエッジが露出してしまいます。用途に合わせて、ご利用ください。

SuefaceViewの起動タイミング

SuefaceViewを使用する際に、SurfaceHolderのCallbackが、どのタイミングで呼ばれるのか気になったので、ちょっと実験してみた。

2014年1月17日金曜日

Androidの色選択ダイアログのデモ


Android SDKには、色を選択するダイアログが無いので、使えそうなものをネットで探していたけど、なかなか用途に合ったものが見つからなかった。というわけで去年、自分で作ってみた。一年かけて少しずつ改良したので、現在のバージョンを公開します。使用はご自由に。

RGBの値をスライダーで細かく制御可能で、モノクロにも対応しています。

http://fumobox.com/file/demo/ColorEditorDemo.zip

ソースをgithubにも置きました。こっちが最新版です。

https://github.com/fumobox/simple_color_chooser_demo

Eclipseのプロジェクトファイルになっています。Android 4.2以上推奨。

使い方は簡単。MainActivityにイベントリスナーを追加して、下のようなコードを呼び出すだけ。
ColorEditDialogFragment.show("Color", _colbox.getColor(), MainActivity.this, MainActivity.this);

2014年1月14日火曜日

戦車を作ってみよう

アプリの宣伝用に、何かインパクトがあるものを作ってみようと思い、戦車を作ってみた。

モデルにした戦車は、Tigerという有名なWW2の戦車。車体が角張っていて曲面が少ないので作りやすい。ただし、転輪の部分は2重になっているので、作りにくい。

戦車の画像だけでは形状がよくわからないので、World of tanksの3Dモデルを見ながらコツコツ作成して、5時間ほどで完成。(途中、ゲームで遊んでしまうので、もっと時間かかってるけど...)




アイソメトリック図はこんなかんじ。


このモデルをSTLでエクスポートして、Google Deiveを経由して、AndroidからWindowsへデータを渡し、Blenderでレンダリングしてみた。下の画像ではマテリアルを消して描画しているが、STLでエクスポートした場合は、マテリアル情報も保持される。レンダリング設定は、ほぼデフォルトのままで、Ambient Occulusionを加えた。ブロックが結合されていないモデルは、そのままの状態では、描画負荷が高いので、モデルを全て選択した状態で、Ctrl+Jを押して、オブジェクトを結合させると良い。



それから、2種類のモデルを作って、Photoshopに貼り付けて、明るさを微調整。右側のモデルは、ブロック間のギャップを残したままレンダリングした画像で、左側はブロックを結合してレンダリングした画像。アプリ内のエクスポート設定で、ギャップの有無を選択できる。


総ブロック数は14,514個。旧型Nexus7でもサクサク描画できる。8分木ブロックは、複雑なモデルでも少ないブロック数で表現できるという利点がある。


2014年1月13日月曜日

Isometric Image その3



いろいろなモデルで試した結果、問題なかったので、Fumortim 1.7.1で実装予定です(フリー版にも)。画像サイズは1000x1154の固定サイズ。画像は、下のような背景が透明なPNG画像として保存されます。

イラスト作成や、ゲーム素材の作成に便利かも。


ギャスケットも表示させてみた。神秘的...

2014年1月11日土曜日

Isometric Image 続き


Zソートが不完全だったので、少し修正した。アルゴリズムは、ほぼ完成したので、もう少し調整して完成かな。操作用ボタンも付けた。ボーダーやフィルターなどの描画オプションを設定できるようにしたいけど、時間がかかりそうだから、後回しにしよう...


色と陰影を付けてみた。なかなか綺麗だ。



ロボットのブロック色をランダムにして描画してみた。そろそろ公開できるかな。

2014年1月10日金曜日

Isometric Image


Isometric画像の描画システムを作成している。OpenGLに頼らない描画システムにするので、Zソートは、自分で考えなければならない。上の画像はZソートをしていないので面の前後がぐちゃぐちゃになっている。


で、スクリーンからの距離で、Zソートすると上のようになる。うまくいっているようだ。あとはUIを作りこんで完成かな。


メンガーのスポンジも描画してみた。