--/--/--(--)


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
コメント(-) | トラックバック(-) | --:--:--

2010/09/23(木)


GPS機能を利用する場合は、LocationManagerクラスを使用します。
LocationListenerインタフェースを実装するだけで、簡単に位置情報を取得できます。

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
 
public class MyClass extends Activity implements LocationListener{
 
 @Override
 public void onCreate(Bundle savedInstanceState){
 
  try{
   LocationManager lm
    = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
   lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,this);
 
  }catch(Exception e){
  }
 }
 
 // 移動
 public void onLocationChanged(Location location){
  double lat = location.getLatitude();
  double lon = location.getLongitude();
  float speed = location.getSpeed(); // [m/s]
  long time = location.getTime(); // [s]
 }
 
 // GPS使用不可
 public void onProviderDisabled(String provider){
 }
 
 // GPS使用可能
 public void onProviderEnabled(String provider){
 }
 
 // ステータス変更
 public void onStatusChanged(String provider,int status,Bundle extras){
  switch(status){
   case LocationProvider.AVAILABLE:
   case LocationProvider.TEMPORARILY_UNAVAILABLE:
   case LocationProvider.OUT_OF_SERVICE:
  }
 }
}

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="org.myclass"
 android:versionCode="1"
 android:versionName="1.0">
 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <activity android:name=".MyClass"
        android:label="@string/app_name">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>
 // GPSへのアクセスを許容
 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
 // テスト用位置情報へのアクセスを許容
 <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
 <uses-sdk android:minSdkVersion="4" />
</manifest>

スポンサーサイト
コメント(0) | トラックバック(0) | 12:08:16

2010/09/14(火)


入社してから数年、ようやく私は仕事にも慣れ、毎日意欲的に作業をこなしていました。
当時の私は、どのプロジェクトでも利用可能な汎用的機能を集めた共通ライブラリの作成(開発言語はC)に携わっていました。
私の担当は、とあるメモリ領域を同サイズに等分し、それぞれを貸し出したり返却したりする機能でした。
私はその機能を「メモリブロック管理」と名付け、愛着を持って開発してきました。

「貸し出すメモリブロックがなくなった場合のエラーなんだが」

ある日、上司が私に話しかけてきました。

「君はENOBLKという独自のエラー番号を使ってるね? 『エラー番号はなるべくerrno.hに沿う』というコーディング規約があるんで、それにしたがって直した方が良くないかな。例えばそう、一時的なバッファ不足という意味でEAGAINがいいんじゃないか」

「いいえ、それは違います」

私は得意げにそう言います。

「確かに今回のプロジェクトにおいてはEAGAINでいいのかもしれません。しかしこの共通ライブラリは今後、他のプロジェクトでも使われる汎用的なものです。使い方によっては、それが一時的なエラーではない可能性も出てくると思います」

私は話を続けます。

「例えばシステムの起動時にすべてを取得し、終了時に一気に返却するという使われ方をされた場合がそうです。一度取得されたブロックは返却されることがないため、EAGAINが返ってきたからといってリトライされてしまうと、無限ループに陥るかもしれない。メモリブロックの枯渇は、それが一時的なものなのか、それとも回復不可能なものなのか、共通ライブラリのレイヤーでは判断がつかないのです」

私は上司が反論してくるのを待ちました。
自分は正しいことを言っている。
かたくなにそう信じ、上司の反論に応酬するつもりでいました。
しかし、その上司は「そうか」とだけ言って私の元を去りました。

実は上司が関数仕様書にEAGAINと記述し、それがすでに関連部署に配布済みであったことを知っていました。
正直なところ、メモリブロック管理はその機能特性上、私が例として挙げたような使われ方をされることはまずありえませんでした。
にもかかわらず、そのときの私は自分の主張を押し通したのです。
ひょっとすると、私に一言の相談もなく仕様書を作って配布してしまった上司に腹を立てていたからなのかもしれません。

その後、何も言われなかったため、私はENOBLKを返すコードを修正しませんでした。
しかしなんの問題も出ないまま、製品は出荷されていきました。

ある日、共通ライブラリのエラー番号を定義するヘッダファイルを見る機会がたまたま訪れました。
そのファイルを見て、私は驚愕しました。
なんと、ENOBLKはEAGAINと同じ値で定義されていたのです。



さて、あれから十数年の月日が経ち、私はテスター、サーバ管理、PG、SE、PM等ほぼソフトウェア開発に関わるほとんどの役割を経験してきました。
この出来事を思い出し、ふと考えることがあります。
もしあのとき私が上司の立場だったら、あのくそいまいましいプログラマにどのような対応をしただろうかと。

コメント(0) | トラックバック(0) | 12:13:23

2010/09/08(水)


報道ステーションは時間帯も合ってて良く見るのですが、注目すべきは富川悠太アナ。
番組内でレポートを担当しているんですが、なにせ1日の移動距離がハンパない。

たとえば今日の台風のニュースなんかでは、うろ覚えだけどVTRの中で、正午過ぎに金沢、夕方頃の横浜を経て19時頃(だったか)には小田原からレポートしている様子が映っていた。
高速も電車も止まったりしてたのに。
そして放映中(22時過ぎ)には小田原から生中継していたので、19時頃からずっと小田原に滞在してるんでしょうね。

猛暑とか大雨とか、しんどい系は全部この人。
とにかく日本中を駆け回ってる。

有事の際には報道ステーション。
お勧めです。

コメント(0) | トラックバック(0) | 23:51:31

2010/09/05(日)


TextViewのカスタマイズについて、主な設定を挙げます。

import android.app.Activity;
import android.graphics.Color;
import android.graphics.Typeface;
import android.text.TextUtils;
import android.widget.TextView;
 
public class MyClass extentds Activity{
 
 public void myMethod(){
  TextView txt = new TextView(this);

  // 余白の設定
  // left,top,right,bottom [px]
  txt.setPadding(10,0,0,0);
 
  // フォントサイズの設定
  txt.setTextSize(18); // 18px
 
  // 文字色の設定
  txt.setTextColor(Color.argb(255,105,105,105)); // dimgray
 
  // フォントの設定
  // typeface: DEFAULT,DEFAULT_BOLD,MONOSPACE,SANS_SERIF,SERIF
  // style: NORMAL,BOLD,ITALIC,BOLD_ITALIC
  txt.setTypeface(Typeface.DEFAULT_BOLD);
  txt.setTypeface(Typeface.SERIF,Typeface.BOLD);
 
  // テキストの最大(最小)行数の設定
  txt.setMaxLines(10);
  txt.setMinLines(1);
 
  // テキストの最大(最小)大きさの設定
  txt.setMaxWidth(100); // 100px
  txt.setMinWidth(10);
  txt.setMaxHeight(10);
  txt.setMinHeight(5);
 
  // はみ出た文字の省略記号(位置)の設定
  // START,END,MIDDLE,,MARQUEE
  txt.setEllipsize(TextUtils.TruncateAt.END);
 
  // テキスト付近に表示する画像の設定
  // left,top,right,bottom
  txt.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon,null,null,null);
  txt.setCompoundDrawablePadding(5); // 余白[px]
 
  // テキスト設定
  txt.setText("Test");
 }
}

xmlだとこうなります。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/myText"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:paddingLeft="10px"
 android:textSize="18px"
 android:textColor="#696969"
 android:typeface="serif" // normal,suns,serif,monospace
 android:textStyle="bold" // normal,bold,italic
 android:maxLines="10"
 android:minLines="1"
 android:maxWidth="100px"
 android:minWidth="10px"
 android:maxHeight="10px"
 android:minHeight="5px"
 android:ellipsize="end" // none,start,middle,end,marquee
 android:drawableLeft="@drawable/icon"
 android:drawablePadding="5px"
 android:text="Test"
/>

コメント(0) | トラックバック(0) | 12:57:51

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。