[SQL] 一括DELETE

Oracleでのみ実行済み。

今回使った方法↓

DELETE FROM "TABLE NAME" A
 WHERE ("条件1", "条件2", "条件3") IN 
       (SELECT "条件1", "条件2", "条件3"
       	  FROM "TABLE NAME"
         WHERE A."絞込条件A1" = B."絞込条件B1" AND ...)

似たような方法↓

DELETE FROM "TABLE NAME" A
 WHERE EXISTS  
       (SELECT *
       	  FROM "TABLE NAME"
         WHERE A."絞込条件A1" = B."絞込条件B1" AND ...)

結果はどっちも同じのはず!
(私が実行した結果では同じだった)

2個目の方が個人的にいいかなーって思ったけど、先に1個目で作っちゃったから作り直すのが面倒だったとかそんなことはないですよ?
– 修正 –
2個目の使用を推奨。
大量データを削除する際に1個目よりも2個目が早い。

Posted in Oracle, SQL, 備忘録 | Leave a comment

[Oracle] INSERTで複数まとめて実行

OracleなのにMySQLの書き方してて時間を無駄にした人が通りますよっと。

またやらかしそうなので、ここに落としておこう・・・

MySQLの場合

INSERT INTO [テーブル名] 
(カラム名1,カラム名2,カラム名3,.....)
VALUES 
(値1,値2,値3,.....),
(値1,値2,値3,.....)

これですが、Oracleの場合は

INSERT ALL
INTO [テーブル名]
    (カラム名1,カラム名2,カラム名3,.....)
VALUES 
    (値1,値2,値3,.....)

INTO [テーブル名]
    (カラム名1,カラム名2,カラム名3,.....)
VALUES 
     (値1,値2,値3,.....)

INTO [テーブル名]
    (カラム名1,カラム名2,カラム名3,.....)
VALUES 
    (値1,値2,値3,.....)
SELECT * FROM DUAL

こうなります。

Posted in 備忘録 | Leave a comment

PL/SQL カーソルの実行方法メモ

メモだけ

暗黙的

-- FOR文を使う
BEGIN
	FOR out_Cursor IN m_Cursor() LOOP
		-- out_cursorから値を取得できる
		-- 例
    m_valuse := out_Cursor.valuse
	END LOOP;
	RETURN_VAL := 1;
EXCEPTION
		RETURN_VAL := 0;
END;

明示的

-- OPENを使う
BEGIN
	-- カーソル実行
	OPEN m_Cursor();
	-- 結果を1行ずつ取得
	LOOP
		FETCH m_Cursor INTO out_Cursor;
		-- レコードを取得できなかった場合抜ける
		EXIT WHEN m_Cursor%NOTFOUND;
		-- レコードを出力
		RETURN_VAL := out_Cursor.VALUE;
	END LOOP;
	-- カーソルをClose
	CLOSE m_Cursor;
-- 例外処理
EXCEPTION
	WHEN OTHERS THEN
		-- 例外が起きた時も必ずcloseする
		IF m_Cursor%ISOPEN THEN
			CLOSE m_Cursor;
		END IF;
		RETURN_VAL := 0;
END;

※テーブルの値を変更するカーソルを使用した場合は『COMMIT』を入れる。

Posted in PL/SQL, プログラミング関連, 備忘録 | Leave a comment

[Android] GoogleCloudPrint

GoogleCloudPrintをAndroidで簡単にできたのでメモ

GoogleCloudPrintってなんぞ?という方はこちらを参照 => GoogleCloudPrint

今回作る画面は2画面。

≪印刷ボタン画面≫
印刷ボタンを配置している画面です。
今回はボタンだけでファイル指定は固定にしてますが、ここにファイルを指定するプログラムを作れば好きなファイルを印刷できます。

≪印刷画面≫
実際に印刷の設定と印刷を実行させる画面です。
これはWebViewで既に用意されてるものを表示するので特に考える必要はありません。
ソースもほぼ公式のもの(こちらのPrintDialogActivity.java部分)をコピペで問題ないです。(ファイル名もそのまま)
※ただし、一部追加しないと動きません。

————-
印刷ボタン画面

// 印刷するファイルを指定
File file = new File("<ここに参照ディレクトリ>");
// ファイルの有無を確認
if (file.exists()){
	Intent printIntent = new Intent(this, PrintDialogActivity.class);
	printIntent.setDataAndType(Uri.parse("file://"+file.getPath()), "application/pdf");
	printIntent.putExtra("title", "docTitle");
	startActivity(printIntent);
}else{
    Toast.makeText(ctx, "ファイルが存在しません", Toast.LENGTH_SHORT).show();
    finish();
}

上記の公式リンクを見た人はわかると思いますが、こちらもほとんどがそのままです。
公式のものにファイルのURIを追加しただけですねw

重要な部分はここかな

printIntent.setDataAndType(Uri.parse("file://"+file.getPath()), "application/pdf");
printIntent.putExtra("title", "docTitle");

setDataAndTypeには第一引数にURI、第二引数にMIME Typeを指定。
MIME Typeは下記サイト参照(plalaさんお借りします!)
MIME Type 一覧表(plala)
これがすべてではないと思いますのでご注意を。
ちなみに印刷で使うとしたらこの中の10個も使わないと思いますw

putExtraにはJobタイトルを指定します。
印刷Jobを確認するときに判別するためのものなので、できるだけ重複しないものがいいと思います。

————-
印刷画面

・プリントする画面のレイアウト
と言ってもWebViewを追加するだけ

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">
  <WebView android:id="@+id/webview"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent"/>
</RelativeLayout>

プリントする画面

import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Intent;
import android.os.Bundle;
import android.util.Base64;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class PrintDialogActivity extends Activity {
  private static final String PRINT_DIALOG_URL = "https://www.google.com/cloudprint/dialog.html";
  private static final String JS_INTERFACE = "AndroidPrintDialog";
  private static final String CONTENT_TRANSFER_ENCODING = "base64";

  private static final String ZXING_URL = "http://zxing.appspot.com";
  private static final int ZXING_SCAN_REQUEST = 65743;

  /**
   * Post message that is sent by Print Dialog web page when the printing dialog
   * needs to be closed.
   */
  private static final String CLOSE_POST_MESSAGE_NAME = "cp-dialog-on-close";

  /**
   * Web view element to show the printing dialog in.
   */
  private WebView dialogWebView;

  /**
   * Intent that started the action.
   */
  Intent cloudPrintIntent;

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    setContentView(R.layout.print_dialog);
    dialogWebView = (WebView) findViewById(R.id.webview);
    cloudPrintIntent = this.getIntent();

    WebSettings settings = dialogWebView.getSettings();
    settings.setJavaScriptEnabled(true);

    dialogWebView.setWebViewClient(new PrintDialogWebClient());
    dialogWebView.addJavascriptInterface(new PrintDialogJavaScriptInterface(), JS_INTERFACE);

    dialogWebView.loadUrl(PRINT_DIALOG_URL);
  }

  @Override
  public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == ZXING_SCAN_REQUEST &amp;&amp; resultCode == RESULT_OK) {
      dialogWebView.loadUrl(intent.getStringExtra("SCAN_RESULT"));
    }
  }

  final class PrintDialogJavaScriptInterface {
    @JavascriptInterface
    public String getType() {
      return cloudPrintIntent.getType();
    }

    @JavascriptInterface
    public String getTitle() {
      return cloudPrintIntent.getExtras().getString("title");
    }

    @JavascriptInterface
    public String getContent() {
      try {
        ContentResolver contentResolver = getContentResolver();
        InputStream is = contentResolver.openInputStream(cloudPrintIntent.getData());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        byte[] buffer = new byte[4096];
        int n = is.read(buffer);
        while (n &gt;= 0) {
          baos.write(buffer, 0, n);
          n = is.read(buffer);
        }
        is.close();
        baos.flush();

        return Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
      } catch (FileNotFoundException e) {
        e.printStackTrace();
      } catch (IOException e) {
        e.printStackTrace();
      }
      return "";
    }

    @JavascriptInterface
    public String getEncoding() {
      return CONTENT_TRANSFER_ENCODING;
    }

    @JavascriptInterface
    public void onPostMessage(String message) {
      if (message.startsWith(CLOSE_POST_MESSAGE_NAME)) {
        finish();
      }
    }
  }

  private final class PrintDialogWebClient extends WebViewClient {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (url.startsWith(ZXING_URL)) {
      Intent intentScan = new Intent("com.google.zxing.client.android.SCAN");
      intentScan.putExtra("SCAN_MODE", "QR_CODE_MODE");
      try {
        startActivityForResult(intentScan, ZXING_SCAN_REQUEST);
      } catch (ActivityNotFoundException error) {
        view.loadUrl(url);
      }
    } else {
      view.loadUrl(url);
    }
    return false;
  }

  @Override
  public void onPageFinished(WebView view, String url) {
    if (PRINT_DIALOG_URL.equals(url)) {
        // Submit print document.
        view.loadUrl("javascript:printDialog.setPrintDocument(printDialog.createPrintDocument("
                   + "window." + JS_INTERFACE + ".getType(),window." + JS_INTERFACE + ".getTitle(),"
                   + "window." + JS_INTERFACE + ".getContent(),window." + JS_INTERFACE + ".getEncoding()))");

        // Add post messages listener.
        view.loadUrl("javascript:window.addEventListener('message',"
                   + "function(evt){window." + JS_INTERFACE + ".onPostMessage(evt.data)}, false)");
      }
    }
  }
}

公式と違うところはPrintDialogJavaScriptInterfaceクラスにある関数に『@JavascriptInterface』を付け加えています。
これはAndroid4.2からの仕様変更によるもので、JavaScriptからメソッドを呼び出すためには@JavascriptInterfaceアノテーションを付けたpublicメソッドではないといけないらしいです。

これで印刷も問題なく動作しましたー

Posted in Android, プログラミング関連, 備忘録 | Leave a comment

[Android] ターミナル(コマンドプロンプト)からIntent発行(画像付)

こちらで書いていたものの画像付きです。

画像処理をやり直したりして遅くなりました…

画像の順序で行えば問題ないと思います。

早速画像をペタリ

==== windows版 ====
adbコマンド&shell

◎インストールコマンド
モザイクがかかっているところは各自環境にて変化したり、見られるとまずいところです。
ただインストールコマンドの方はAPK名が丁度良かったのでそのままにしてますw
ここでの『SampleApp.apk』の部分は各自任意のAPK名に変更してください。
※指定したapkファイルがない場合ははじかれます。
また、既にインストールされている場合には一番下の『-r』付きを実行しないと同様にはじかれます。

◎shellコマンド
※shellコマンドの方はAPK名も隠してます。
こちらも同様に各自環境に合わせて入力してください。

*** コマンドの中身 *****************************
am start -n <パッケージ名>/<起動するActivity>
※”< >“の中が各自変更する部分になります。

“<パッケージ名>”
起動するアプリのパッケージ名を入力します。

“<起動するActivity名>”
AndroidManifest.xmlで指定しているものに合わせてください。
私はパッケージ名と合わせて記入していますがActivity名だけでも起動します。
例:am start -n com.sample/.MainActivity
***********************************************

mac用の画像は処理を間違えたのでまた今度上げます・・・

Posted in Android, プログラミング関連, 備忘録 | Leave a comment

[Android] GoogleMap API v2 を使ってみた

Androidのアプリ内に表示する目的で作成しました。

https://code.google.com/apis/console/
↑のURLへアクセスしてAPIキーと使用許可をすること。

上から順に実装していきます。

//=======================================
// Manifestファイルに追加
//=======================================









タグの直下に以下を追加



//※【Your API KEY】の部分は各自作成したAPIキーを挿入

//=======================================
// レイアウトXMLに追加
//=======================================


//=======================================
// 外部ライブラリを追加(google-play-services_lib)
//=======================================
AndroidSDKファイルから以下のディレクトリを確認
\extras\google\google_play_services\libproject\google-play-services_lib
※存在しない場合はAndroid SDK Managerから『Google Play services』をインストールする

上記ファイルをプロジェクトをインポートする方法と同じ流れでインポートする
※ワークスペースにコピーすることをオススメします

インポートが完了したらライブラリを使用するプロジェクト(マップを使用するプロジェクト)の設定を開き以下の処理を行う
設定⇒Androidへ移動
①Project Build Targetを適切なLevelのGoogle APIsへ変更
②Libraryの『Add』から『google-play-services_lib』を選択して追加する

以上でライブラリは追加完了

//=======================================
// createActivityに追加
//=======================================

//---------------------------------------------------
// マップを表示するための初期宣言
// バージョンが変わってMapFragmentからSupportMapFragmentになってるみたい
// SupportMapFragmentを使用するときはActivityをFragmentActivityにすること
GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
//GoogleMap map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();

//---------------------------------------------------
// 起動時に表示する座標を指定
LatLng sydney = new LatLng(35.65715595,139.75671929);
// 自分のいる位置を表示するか
map.setMyLocationEnabled(true);
// 起動時に座標を先ほど指定した座標に移動させる、第二引数でズーム率を変更できる
map.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 17));
// マーカーを作成する ※今回は不使用
map.addMarker(new MarkerOptions()
.title("Sydney")
.snippet("The most populous city in Australia.")
.position(sydney));

多分これで表示されると思います。
表示されなかったらコメントをお願いしますー
どこか抜けてると思うので・・・

Posted in Android, プログラミング関連, 備忘録 | Tagged , , , | Leave a comment

[Android] ターミナル(コマンドプロンプト)からIntent発行

通常ビルドするとアプリが自動的に起動しますが!
ターミナルからインストールを行った場合起動しません。

アプリアイコンを探してタップする方法でも良かったのですが、面倒になって・・・(´・ω・)
ターミナルから起動できるのでそれで起動した方が楽です!

ということで以下方法を…

やり方としてはターミナルを2つ起動させて片方にインストールコマンド、もう片方に起動コマンドを入力するだけの簡単な作業です。

まずインストールコマンド
#通常インストール
adb install oooo.apk
#アップデート
adb install -r oooo.apk

『oooo.apk』は任意のAPK名に変更してください。

既にアプリがインストールされている状態ではアップデートをしないとインストールされません。

インストールが完了したら次は起動です。
まずはshellを起動
#shell起動
adb shell

shellが起動できたらアプリを起動させます。
#アプリ起動
am start -n com.sample.app/com.sample.app.SampleActivity

パッケージ名及び起動するActivity名は任意のものに変更してください。

これでアプリが起動します。

Posted in Android, Java, プログラミング関連, 備忘録 | Tagged , , , | 2 Comments

[Android] Serviceの再起動

Serviceを使用する際に気を付ける点として

1.負荷率によってOS側から落とされる可能性
2.端末の再起動によって落ちる事
3.アプリのアップデートで落ちる事

以上の三点の対応を行いました。
※AndroidManifest.xmlへのServiceの追加は済んでいるものとします。

—— OS側から落とされる場合の対処 ——

これは簡単で、Service.Commandメソッドの戻り値を変更するだけで解決します。

戻り値に指定する値は以下。
・START_STICKY
・START_REDELIVER_INTENT

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
	return START_REDELIVER_INTENT;
}

また、以下を指定すると再起動してくれません。
・START_NOT_STICKY
・START_STICKY_COMPATIBILITY

—— 端末の再起動時に起動 ——
後述する「アプリのアップデート時に起動」もですが
この二つはAndroidManifest.xmlにもソースを追加する必要があります。

※ファイル名は各自合わせてください
●AndroidManifest.xmlへ追加する




    
        
    

uses-permissionに”android.permission.RECEIVE_BOOT_COMPLETED”を追加してあげないと
起動通知を受け取れないみたいなので必ず記述してください。

●再起動時の起動通知を受け取るクラスを作成

public class BootReceiver extends BroadcastReceiver {
	@Override
	public void onReceive(Context context, Intent intent) {
		if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
			// 起動するサービスを指定
			Intent intent_service = new Intent(context, jp.program.sf.sample.heckelcheck.refreshService.class);  
			context.startService(intent_service);
		}
	}
}

—— アプリのアップデート時に起動 ——
自動更新で更新がかかった後に自動起動してるものがあったので
どうやってるのかなぁと気になってたのですが

これだけでできるのですね・・・

※ファイル名は各自合わせてください
●AndroidManifest.xmlに以下の内容を追加


    
        
        
    

●アップデート通知を受け取る受け取るクラスを作成

public class PackageUpdateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
		Intent intent = new Intent(context, MainService.class);  
		context.startService(intent);  
        }
    }
}

今回クラスを二つに分けましたが、見た感じ一つのクラスにすることも可能なのかなぁって思いました。(実装してないので未確認です)
AndroidManifest.xml次第では無理なのかな・・・
今度やってみます(*・ω・)


Posted in Android, Java, プログラミング関連, 備忘録 | Tagged , | Leave a comment

[Android] Notificationの実装

現在説明一切ありません。
あとで入れます。

とりあえず書き忘れる前にコードだけ!

まず常駐型

// Intent の作成
Intent intent = new Intent(refreshService.this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(refreshService.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
 
// LargeIcon の Bitmap を生成
Bitmap largeIcon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);


// NotificationBuilderを作成
NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext())
			    .setContentIntent(contentIntent)
			    // ステータスバーに表示されるテキスト
			    .setTicker("Text")
			    // アイコン
			    .setSmallIcon(R.drawable.ic_launcher)
			    // Notificationを開いたときに表示されるタイトル
			    .setContentTitle("Title")
			    // Notificationを開いたときに表示されるサブタイトル
			    .setContentText("SubTitle")
			    // Notificationを開いたときに表示されるアイコン
			    .setLargeIcon(largeIcon)
			    // 通知するタイミング
			    .setWhen(System.currentTimeMillis())
			    // 通知時の音・バイブ・ライト
			    .setDefaults(Notification.DEFAULT_SOUND
			            | Notification.DEFAULT_VIBRATE
			            | Notification.DEFAULT_LIGHTS);
 
// NotificationManagerを取得
NotificationManager manager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);

manager.cancel(0);

startForeground(R.drawable.ic_launcher,builder.build());

通知型

NotificationManager notificationManager = 
          (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

Intent notificationIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

Notification notification = new NotificationCompat.Builder(this)
		        // アイコン
		        .setSmallIcon(R.drawable.ic_launcher)
		        // 通知バーに表示する簡易メッセージ
		        .setTicker("Title!")
		        // 時間
		        .setWhen(System.currentTimeMillis())
		        // 展開メッセージのタイトル
		        .setContentTitle("ContentTitle")
		        // 展開メッセージの詳細メッセージ
		        .setContentText("Message")
		        // PendingIntent
		        .setContentIntent(contentIntent)
		        // 通知時の音・バイブ・ライト
		        .setDefaults(Notification.DEFAULT_SOUND| Notification.DEFAULT_VIBRATE)
		        // タップするとキャンセル
		        .setAutoCancel(true)
		        .build();

notificationManager.notify(1, notification);
Posted in Android, Java, プログラミング関連, 備忘録 | Tagged , | Leave a comment

[Android] 続.端末認識エラー

例のあいつがずっと消えませんでした・・・

↓↓↓例のあいつ↓↓↓
ADB server didn’t ACK
* failed to start daemon *

一応再起動したら治るんですが、開発してるとしばらくして復活。

鬱陶しくて仕方ないので本腰をあげて駆除することに…

まず原因を探ってみました。

前回(こちら)あげたようにadb.exeが複数起動しているのが原因なのは同じことなので、
巣穴を探しました。

色々と試してみた結果

以下のものが原因と判明。

・HTC Sync Manager

これが起動してるのが原因のようです。

同じように同期するためのソフトウェアは原因となる可能性があるので起動しないようにしておくか
アンインストールをお勧めします。

私はもう使わないのでアンインストールしました(*・ω・)

※ちなみに開発環境はwindows8とeclipse3.7

Posted in Android, Java, プログラミング関連, 備忘録 | Tagged , | Leave a comment