2014年4月30日水曜日

【Java】Myコーディングスタイル

今回はアプリを作成する上でのJavaのコーディングスタイルとして、
自分なりに行っているコーディング規約を紹介していきます(^o^)丿

私個人のコーディング規約ですので参考程度に見ていただければと思います(^o^;

概要

細かくわかれますので概要として以下の内容についてコーディング規約を説明していきます。


・コーディングスタイル
 ■入れ子のかっこ{}で1行使う
 ■字下げはタブ、または半角スペース×2の倍数

・命名規約
 ■変数名の規則
 ■メンバ変数には「m_」を付ける
 ■定数は大文字と下線のみ
 ■長くても意味のある名前を付ける
 ■クラス名

・コメント
 ■出来る限り多くコメントをつける
 ■if文やswitch文ではすべてのケースでコメント追加
 ■不具合の修正箇所にコメントをつける 
 ■現在把握している問題についてコメント
 ■入れ子が多い場合には行末コメント
 ■Javadocに対応する書き方に統一

・プログラミング規約
 ■データ型のクラスにはfinalを宣言
 ■例外キャッチ時はprintStackTrace

・メンテナンスによる既存ソースの手入れ
 ■既存ソースでは行われていない意外性のある方法で行わない
 ■命名規約の注意
 ■コメント


2014年4月24日木曜日

【SQL】データベースの基礎(SELECT文)

こんばんは☆

先日データベーススペシャリストを受けて来ました(^^ゞ 

結果はまぁまぁで受かるかどうかは微妙なとこです^^; 

ともかくせっかく勉強したのもあるので、基礎的なデータベースの知識としてアプリ開発でも使える
SQLの形でわかりやすくまとめていきたいと思います。


今回SQLのSELECT文の例を載せ、データベースの用語を付け足します。

SELECT文だけで色々な例がわかるようにしていきますので(^^)



SELECT文 

  【選択】
SELECT * FROM score

score






id 国語 算数 理科 社会 英語

1 10 20 30 40 50

2 15 15 15 15 15

3 50 40 30 20 10

4 30 30 30 30 30

5 20 40 30 20 40







テーブルscoreの全ての行(タプル)を取り出し、全ての列(属性)を表示します。


  【射影】
SELECT person.id, person.name FROM person

person


id name

1 sinji

4 kenji

6 akira




テーブルscore の全ての行に含まれる列 id と列 name を表示します。


  【選択】【等結合】【直積】
SELECT * FROM score as s, person as p
WHERE s.id = p.id  











s.id 国語 算数 理科 社会 英語 p.id name

1 10 20 30 40 50 1 sinji

4 30 30 30 30 30 4 kenji










テーブルs(score)とテーブルp(person)を結合して、テーブルsとテーブルpに含まれる全ての列
   を表示します。
  (2つのテーブルを結合して全ての列を表示することを等結合といいます)
  (=結合する列が重複して表示=集合演算の直積ともいう



  【選択】【射影】【自然結合】
SELECT s.*, p.name FROM score as s, person as p
WHERE a.id = b.id  










id 国語 算数 理科 社会 英語 name

1 10 20 30 40 50 sinji

4 30 30 30 30 30 kenji









テーブルsとテーブルpを結合して、各テーブルに含まれる列を一部表示します。
  (2つのテーブルを結合して結合する列の重複がなく表示することを自然結合といいます)
  (=結合する列が重複なしに表示



  【選択】【和】
SELECT s.id FROM score as s
UNION
SELECT p.id FROM person as p

score
person
s+p

id
id
id

1
1
1

2
4
2

3
6
3

4


4

5


5





6







テーブルscoreの全ての行を取り出した結果に、テーブルpersonの全ての行を付け足します。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)
  (UNIONは重複行は1つだけ表示しますが、UNION ALLだと重複行もそのまま表示します)



  【選択】【射影】【差】
SELECT s.id FROM score as s
EXCEPT
SELECT p.id FROM person as p

score
person
s-p

id
id
id

1
1
2

2
4
3

3
6
5

4





5











テーブルsの列idを取り出した結果から、テーブルpの列idを取り去ります。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)



  【選択】【射影】【積】
SELECT s.id FROM score as s
INTERSECT
SELECT p.id FROM person as p

score
person
s×p

id
id
id

1
1
1

2
4
4

3
6



4





5











テーブルsの列idを取り出した結果から、テーブルpの列idと同じ値のものだけを取り出します。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)



  【選択】【商】
うまくできるSQL文が見つけられていないため、後で記載
R


S

R÷S

A B X
A B
X

1 111
1 111


2 222
2 222


1 111





2 222






1 111






2 222















テーブルRからテーブルSに含まれる列全てを持つ行を選択し、選択した行からテーブルSに
  含まれていない列を取り出します。
   (これは関係代数(関係モデルにおける演算体系)の集合演算のに相当します。)


2014年4月4日金曜日

【アプリ開発】アニメーションGIF画像の再生

最近データフォルダでアニメーションGIF画像の再生に対応してアップデートしました(^O^)
Googleでも画像検索で最近Gif画像の再生に対応しましたね(^^)

データフォルダでは、以前からアニメーションGIF画像の再生には対応していましたが、
ViewPagerタイプの画像表示画面では対応していなかったため、
ImageViewを拡張したGifImageViewを作成し派生させて利用しました。


アニメーションGif画像を表示する方法は2通りあるため、
ここではその2つのGifImageViewを紹介したいと思います。

Movieクラスを使用したアニメーションGIF画像の再生
GifDecoderを使用したアニメーションGIF画像の再生



Movieクラスを使用したアニメーションGIF画像の再生

public class GifImageView extends ImageView 
{
    private Movie mMovie;

    private long mMoviestart;

    public GifImageView(Context context, InputStream stream) {
        super(context);
        
        mMovie = Movie.decodeStream(stream);        
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.TRANSPARENT);
        super.onDraw(canvas);
        final long now = SystemClock.uptimeMillis();

        if (mMoviestart == 0) { 
            mMoviestart = now;
        }

        final int relTime = (int)((now - mMoviestart) % mMovie.duration());
        mMovie.setTime(relTime);
        mMovie.draw(canvas, 10, 10);
        this.invalidate();
    }
}

まず、ImageViewを拡張したGifImageView内に
アニメーションGIF画像再生用のMovieクラスのメンバ変数を持たせ、
GIF画像をInputStreamとして渡してMovieクラスにdecodeStreamで読み込ませて再生させます。

割りと簡単に実装ができ、Movieクラスの動作はNativeであるため、軽快に動作しますが、全てのGIF画像には対応していないため、その場合にはGifDecoderを使用して動作させると良いかと
思います。