2013年12月23日月曜日

PHPのmysql関数が非推奨になっていた

しばらくぶりにPHPからMySQLにアクセスしようと、
Webでmysql_queryなどの使い方を調べていたら、
PHPのmysql関数がPHP5.5.0から非推奨になっていた。
http://www.php.net/manual/ja/intro.mysql.php

mysql関数の代わりにどうやってMySQL接続するかだが、
PHP標準には接続方法が三種類あって、
mysql(これまで使用していたもの)、mysqli、PDOのいずれかを使用できるようだ。
PHP: どの API を使うか - Manual

mysql関数が非推奨になった(PHP5.5.0が公開された)のはだいぶ前のことなので、
mysqliとPDOのどちらかを使うのがよいだろう。
どちらがよいか検索してみると、比較しているサイトを見つけることができた。
mysql関数からの置き換えやすいのはmysqli、
DBの抽象化をしておく必要があるのならPDO、などなど。

どちらを使うべきか、検討中。

2013年12月22日日曜日

ウェブカメラを通して見られている?

あるだろうなと思ってたが、やっぱりあった。
Webカメラを使ったマルウェア。

クリープウェア: 誰かに見られているかもしれない | Symantec Connect コミュニティ
見られてるかも……PCのウェブカメラをシールでふさぐのは被害妄想ではない -INTERNET Watch

いまやマルウェアはハードディスク内の情報を盗むだけではなく、
  • カメラで撮影した画像や動画
  • マイクで録音した音声
  • キーボードから入力された文字列
など、PCに付属する入力装置から得られるものはなんでも盗むことができるとのこと。

特に、スマートフォンにはいくつものセンサーが搭載されている。
  • 重力
  • 加速度
  • 位置情報
  • 方角
  • 近接
  • 輝度
  • ジャイロ
  • 磁場
  • 温度
  • 気圧
スマートフォン向けのマルウェアだと、
これらを利用したものもあるのだろうか。きっとあるのだろう。

2013年12月19日木曜日

世界の終わり セカイカメラのサービス終了

セカイカメラサービス終了のお知らせ
http://sekaicamera.com/the_end_of_sekai
↑URLがナイス

数年前に拡張現実の先駆けであったセカイカメラが、
サービスを終了する。
利用者が少なかったからだろうか。
それとも、マネタイズがうまくいかなかったからなのだろうか。

セカイカメラは終了するが、拡張現実事態にはまだまだ需要はあるはずだ。
ゲームや広告をはじめ、
事業としては観光業界とか家具販売とか美術館とか。

拡張現実の実現方法にもいろいろあって、
個人が簡単に実現できるものから、技術が必要なものもある。
以下、拡張現実の種類を勝手に分類してみた。

  • 位置情報型
利用者のいる緯度経度から付加情報を表示させる。
セカイカメラは位置情報型だろう。
観光事業では、観光名所にタグをつけ、旅行者向けの情報を出現させるといったことができる。
位置情報を使った道案内もできるだろう。

  • マーカー型
QRコードなどのマーカーを読み取ることで付加情報を表示させる。
広告に載せてクーポンを提供することができたりする。
マーカーを床に置いて家具を配置してみると、購入後の雰囲気がわかるといったサービスが可能。

  • マーカーレス型
こちらは付加情報を出現させるために、マーカーではなく、現実の物を使う手法。
木があったらクリスマスツリーにしてみるとか、
顔認識でその人の名前を表示させるとか。

  • センサー型
端末がセンサーを認識すると付加情報を出現させる。
位置情報型よりも細かく場所を特定したい場合に利用する。
美術館でセンサーに反応して美術品の説明を表示させたりできると思う。
ゲームで、センサーに反応したらイベントが発生するとかしたら面白そう。

あと何年かしたら、拡張現実が生活の一部になっていることを予想している。
楽しそう。

2013年12月18日水曜日

Webサービスの企画書を見れる

Webサービスの企画書が公開されているのを見つた。


ネットで見れる!国内有名Webサービスの「ナマ企画書」まとめ

ネットで見れる!国内有名Webサービスの「ナマ企画書」まとめ【第2弾】


当然ですが、それぞれに特徴があっていい。
普段は、自分や同じグループの人間が作ったものしか見ないので、
視野が広がり、今後の製作物の参考になる。

「この企画の目的は」や「○○をターゲットに」といった
決まり文句を使うことになれてしまうと、
同じような企画書しか作れなくなってしまう。
また、内輪で作って、内輪で見せ合ってばかりだと、
別の人が作っても、しばらくするとパターン化されてしまう。
だいたいは上司やリーダーの好みというか、意見に従う形というか、
流れが同じようなものが出来上がってしまう。

色々な企画書を見ることで、おっと感心することもあれば、
ここはイケてない書き方だなーと思うところもある。

自分がそのサービスの企画書を作成するのならば、
どのようなものになるのか、考えてみるのも勉強になりそうだ。

2013年12月16日月曜日

米大統領が「プログラミングしてみよう!」

この前、オバマ大統領が、
「プログラミングしてみよう!」
的なことを発信していた。

・Youtube
http://www.youtube.com/watch?v=6XvmhE1J9PY

これは、Computer Science Education Weekに参加する若い人向けに話した内容で、
プログラミングやコンピュータサイエンスの重要性を伝えようとしている。

アメリカでは大統領がこのような発言をするが、
日本では、国のトップがこのようなことを話すようになるまでには
まだまだ時間が必要なのだろう。

2013年8月13日火曜日

android:複数のアクティビティでデータを共有する

アクティビティ間でのデータのやりとりはインテントを使用すれば可能であるが、
そのデータが共有データである場合、画面が遷移するたびにインテントにput、getを繰り返すのは効率がよくない。
そこで、すべてのアクティビティから参照できるよう、Singletonでデータを保持する方法を試してみる。

  • 共有するデータクラスをSingletonで作成する。
  • 共有データが必要なアクティビティにて、getInstanceでインスタンスを取得する。

共有するデータクラスは以下のように定義する。
package net.kuttya.singletonsample;

public class SampleData {
    // 共有するデータクラス

    // 自クラスをインスタンスに持つ
    private static SampleData data = null;

    // メンバ変数
    private int dataInt = 0;

    public static SampleData getInstance() {
        if(data == null) {
            // インスタンスがnullの場合のみ生成する
            data = new SampleData();
        }
        return data;
    }

    private SampleData() {
        // コンストラクタをprivateにすることで、
        // インスタンスを新しく生成できなくする
    }

    public void setDataInt(int i) {
        this.dataInt = i;
    }

    public int getDataInt() {
        return this.dataInt;
    }
}

呼び出し元のアクティビティでは、次の動作を実装する。
package net.kuttya.singletonsample;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button)findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // 共有するデータを設定
                SampleData data = SampleData.getInstance();
                data.setDataInt(12345);

                // インテント生成
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setClassName("net.kuttya.singletonsample", "net.kuttya.singletonsample.CallActivity");

                // アクティビティ呼び出し
                startActivity(intent);
            }
        });
    }
}

呼び出し先のアクティビティでは、次の動作を実装する。
package net.kuttya.singletonsample;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class CallActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_call);

        // 共有データを取得
        SampleData data = SampleData.getInstance();

        // 表示
        TextView textView1;
        textView1 = (TextView) findViewById(R.id.textView1);
        textView1.setText(Integer.toString(data.getDataInt()));
    }
}

ただし、データの共有がうまくいかないケースもある。
例えば、アクティビティ単位でプロセスを分けた場合、
Singletonであったとしても、それぞれのプロセスでインスタンスが生成されてしまう可能性がある。
他にも、共有するデータにキャッシュ情報が含まれていたりすると、
キャッシュがなにかのきっかけでクリアされてしまった場合、
共有データないのキャッシュ情報には参照先が存在しなくなる。

保持するデータには注意が必要である。

にほんブログ村 IT技術ブログ Androidアプリ開発へ

2013年8月12日月曜日

android:Parcelableインタフェースを使用したアクティビティ間のデータ受け渡し

androidでは、プロセス間通信が頻繁に行われる。
特に、アクティビティ間でデータをやりとりする場合にはインテントを利用する。
インテントでインスタンスをやりとりする場合は、一工夫必要である。

インスタンスはintなどの型とはことなり、なんでもインテントにputすることはできない。
インテントにインスタンスを受け渡すためには、Parcelableインタフェースを実装する必要がある。

Parcelableインタフェースを利用するには、以下の手順が必要となる。
  • インテントに受け渡すクラスにParcelableを実装する。
  • インテントに受け渡すクラスでCREATORメンバ変数を定義する。
  • 受け渡し元のアクティビティにおいて、インテントにはParcelableを実装したクラスのインスタンスをputする。
  • 受け渡し先のアクティビティにおいて、同様にインテントにはParcelableを実装したクラスのインスタンスにgetする。
受け渡しするデータクラスは以下のように定義する。
package net.kuttya.parcelablesample;

import android.os.Parcel;
import android.os.Parcelable;

public class SampleData implements Parcelable {
    // インテントで受け渡しするデータクラス

    public String sampleString;
    public int sampleInt;
    public int[] sampleIntArray;

    public int describeContents() {
     // ファイルディスクリプタを返す(Parcelableインタフェースの実装メソッド)
        // ファイルディスクリプタを持たない場合は0を返す
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        // シリアライズ処理(Parcelableインタフェースの実装メソッド)

        dest.writeString(sampleString);
        dest.writeInt(sampleInt);
        dest.writeIntArray(sampleIntArray);
    }

    public static final Parcelable.Creator CREATOR =
            new Parcelable.Creator() {

                public SampleData createFromParcel(Parcel source) {
                    // デシリアライズ処理
                    // writeToParcelメソッドでシリアライズした順番と同じ順番でメンバ変数をデシリアライズすること

                    // インスタンス生成
                    SampleData data = new SampleData();

                    // インスタンスに受け取るデータを格納する
                    data.sampleString = source.readString();
                    data.sampleInt = source.readInt();

                    // 配列の場合は、引数に格納先を指定する
                    data.sampleIntArray = new int[data.sampleInt];
                    source.readIntArray(data.sampleIntArray);

                    return data;
                }

                public SampleData[] newArray(int size) {
                    // 配列を受け渡す処理

                    return new SampleData[size];
                }
            };
}

受け渡し元のアクティビティでは、次の動作を実装する。
package net.kuttya.parcelablesample;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button)findViewById(R.id.button1);
        b.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // シリアライズするインスタンスを生成
                SampleData data = new SampleData();
                data.sampleString = "abcde";
                data.sampleInt = 3;
                data.sampleIntArray = new int[data.sampleInt];
                data.sampleIntArray[0] = 123;
                data.sampleIntArray[1] = 456;
                data.sampleIntArray[2] = 789;

                // インテント生成
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setClassName("net.kuttya.parcelablesample", "net.kuttya.parcelablesample.CallActivity");

                // データをシリアライズ
                intent.putExtra("data", data);

                // アクティビティ呼び出し
                startActivity(intent);
            }
        });
    }
}

受け渡し先のアクティビティでは、次の動作を実装する。
package net.kuttya.parcelablesample;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

public class CallActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_call);

        // インテント取得
        Intent intent = getIntent();

        //データをデシリアライズして受け取る
        SampleData data = intent.getParcelableExtra("data");

        // 表示
        TextView textView1,textView2,textView3;
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);
        textView3 = (TextView) findViewById(R.id.textView3);
        textView1.setText(data.sampleString);
        textView2.setText(Integer.toString(data.sampleInt));
        textView3.setText(Integer.toString(data.sampleIntArray[0]));
    }
}


にほんブログ村 IT技術ブログ Androidアプリ開発へ