2014/02/27

データベース初心者がSQLを極めるためのオススメ書籍6冊

初心者向け

マンガでわかるデータベース
マンガでわかるデータベース

最初の取っ掛かりとして。データベースの基本概念をマンガでわかりやすく解説してあります。
極めるほどのやる気がない人もマンガで概要を知っておくといいかも。
CD付 SQL ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)
SQL ゼロからはじめるデータベース操作

概念がわかったら次はDBエンジニアが書いたデータベース操作に特化した入門書がオススメ!
各種データベースの違いや初心者がつまづきやすいところが解説されているので読んでおきたい。

中級者向け

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
達人に学ぶ SQL徹底指南書

実践的なSQLのケーススタディとリレーショナルデータベースの世界の解説をしている本。
もっと効率的なSQLやSQL自体に興味を持ってしまったあなたへ。
達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ
達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

DBエンジニアを目指す人などがDB設計の考え方と実践ノウハウを身につけるための本。
他人が作ったテーブルを操作する段階から抜け出すときには必読でしょう。

上級者向け

SQLパズル 第2版 プログラミングが変わる書き方/考え方
SQLパズル 第2版 プログラミングが変わる書き方/考え方

SQLの達人になりたい人向け。DBエンジニアの演習問題では最高峰レベルの本。
全部解けたらSQLを極めたと言っても過言ではないのでは?
プログラマのためのSQL 第4版
プログラマのためのSQL 第4版

SQLの聖書。
「達人に学ぶ SQL徹底指南書」が副読本で、「SQLパズル」が演習本なら本書は教科書と言える。

さいごに

「SQL ゼロからはじめるデータベース操作」、「達人に学ぶ SQL徹底指南書」、
「達人に学ぶDB設計 徹底指南書」の著者で、
「SQLパズル 第2版」、「プログラマのためのSQL 第4版」の訳者でもあるミック氏の
リレーショナル・データベースの世界も読んでおきたい。

おまけ

この記事の内容は Naver まとめで 4000弱 の PV で 500円くらいの収益(約一年半で!)だったので
ブログに書けば 4000PV なら AdSense と Amazon アフィリエイトで
もう少し稼げるんじゃないかなぁとか思ったのでブログに書くことにしました。
Naver まとめにコンテンツをあげる義理もないですからね。
2014/02/26

[Android]端末の起動完了を検知するBroadcastReceiver

端末の再起動時に Service を再起動させたい場合など
端末の起動完了を検知したいことがあります。
そのような場合には BroadcastReceiver で
OS の出しているイベントを受け取る必要があります。

結構基本中の基本ですが記事として書いたことがなかったので書いておきます。

public class BootCompletedReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent){
        if(Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
            // Boot completed!
        }
    }

}
<receiver
    android:name=".BootCompletedReceiver"
    android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

毎回書くのも微妙な気がするので BootCompletedReceiver を作ってみたけどいらないかも?
/**
 * <h1>Usage</h1>
 *
 * <h2>Java</h2>
 *
 * <pre>
 * public class YourBootCompletedReceiver extends BootCompletedReceiver {
 *     @Override
 *     public void onBootCompleted(){
 *         // your code here
 *     }
 * }
 * </pre>
 * 
 * <h2>AndroidManifest.xml</h2>
 * 
 * <pre>
 * <receiver
 *      android:name=".YourBootCompletedReceiver"
 *      android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
 *      <intent-filter>
 *          <action android:name="android.intent.action.BOOT_COMPLETED" />
 *      </intent-filter>
 * </receiver>
 * </pre>
 */
public abstract class BootCompletedReceiver extends BroadcastReceiver {

    /**
     * Do not override
     */
    @Override
    public void onReceive(Context context, Intent intent){
        if(isBootCompleted(context, intent)){
            onBootCompleted();
        }
    }

    /**
     * This method is called when the BroadcastReceiver is receiving
     * {@link Intent#ACTION_BOOT_COMPLETED}.
     */
    public abstract void onBootCompleted();

    /**
     * @param context
     * @param intent
     * @return true if intent's action equals {@link Intent#ACTION_BOOT_COMPLETED}, otherwise false
     */
    public static boolean isBootCompleted(Context context, Intent intent){
        if(context == null){
            throw new IllegalArgumentException("Context must not be null.");
        }
        if(intent == null){
            throw new IllegalArgumentException("Intent must not be null.");
        }
        String action = intent.getAction();
        return Intent.ACTION_BOOT_COMPLETED.equals(action);
    }
}

おまけ: テスト用 adb shell コマンド

adb shell am broadcast -a android.intent.action.BOOT_COMPLETED

タグ(RSS)