SQLの窓

2016年04月25日


AsyncTask を継承して、Drawable を取得する専用クラスを作成する : Android Studio

Drawable を取得して、UIスレッドで処理する事を直接の目的としています。なので、onPostExecute を Override して、専用に定義した onDrawable メソッドを呼び出しておきます。これによって、HttpDrawable のインスタンスを使う時に onDrawable を Override すれば引数に Drawable のインスタンスを得る事ができます。

また、引数が文字列の配列で、戻り値が Drawable と固定の仕様の元作成するので、ジェネリックスを利用せずに作られています。
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

import java.io.InputStream;
import java.net.URL;

/**
 * Created by lightbox on 2016/04/24.
 */
public class HttpDrawable extends AsyncTask {

	@Override
	protected Object doInBackground(Object[] params) {

		// 画像データ
		Drawable image = null;
		try {
			// インターネット上の画像を取得して、Drawable に変換
			URL url = new URL((String) params[0]);
			InputStream is = (InputStream)url.getContent();
			image = Drawable.createFromStream(is, "");
			is.close();
		}
		catch(Exception e) {
			Log.i("button", "インターネットのアクセスでエラーが発生しました");
		}
		return image;

	}

	protected void onDrawable(Drawable d) {

	}

	@Override
	protected void onPostExecute(Object o) {
		onDrawable((Drawable)o);
	}
}


▼ ボタンクリックから画像の表示
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {

	private HttpDrawable hd;

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

		// ボタンのインスタンスを格納する変数を作成
		Button button;

		// ボタンのインスタンスを作成
		button = (Button) MainActivity.this.findViewById(R.id.button);

		// ボタンのインスタンスにイベントを登録
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// logcat にメッセージを表示
				Log.i("lightbox", "ボタンが押されました");
				hd.execute("https://goo.gl/WNzpRl");

			}
		});

		hd = new HttpDrawable() {
			@Override
			protected void onDrawable(Drawable d) {

				if (d != null) {
					ImageView imageView = (ImageView) MainActivity.this.findViewById(R.id.imageView);
					imageView.setImageDrawable(d);
				}

			}

		};



	}

}

https://goo.gl/WNzpRl は画像です




HttpDrawable は、一般的な new AsyncTask の意味を解りやすく解説する為に作成しています。

▼ new AsyncTask で記述されたもの
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.io.InputStream;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

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

		// ボタンのインスタンスを格納する変数を作成
		Button button;

		// ボタンのインスタンスを作成
		button = (Button) MainActivity.this.findViewById(R.id.button);

		// ボタンのインスタンスにイベントを登録
		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {

				// logcat にメッセージを表示
				Log.i("lightbox", "ボタンが押されました");
				new AsyncTask<String,Void,Drawable>() {
					@Override
					protected Drawable doInBackground(String... params) {
						// 画像データ
						Drawable image = null;
						try {
							// インターネット上の画像を取得して、Drawable に変換
							URL url = new URL(params[0]);
							InputStream is = (InputStream)url.getContent();
							image = Drawable.createFromStream(is, "");
							is.close();
						}
						catch(Exception e) {
							Log.i("button", "インターネットのアクセスでエラーが発生しました");
						}
						return image;
					}

					@Override
					protected void onPostExecute(Drawable drawable) {

						if (drawable != null) {
							ImageView imageView = (ImageView) MainActivity.this.findViewById(R.id.imageView);
							imageView.setImageDrawable(drawable);
						}
					}

				}.execute("https://goo.gl/WNzpRl");

			}
		});

	}

}


さらに、ボタンイベントのように、インターフェイスを登録するようにすると以下のようになります
package lightbox.april.androidtest;

import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

import java.io.InputStream;
import java.net.URL;

/**
 * Created by lightbox on 2016/04/24.
 */
public class HttpDrawable extends AsyncTask {

	public interface OnDrawableListener {
		abstract public void onDrawableListener(Drawable d);
	}

	private OnDrawableListener listener = null;

	@Override
	protected Object doInBackground(Object[] params) {

		// 画像データ
		Drawable image = null;
		try {
			// インターネット上の画像を取得して、Drawable に変換
			URL url = new URL((String) params[0]);
			InputStream is = (InputStream)url.getContent();
			image = Drawable.createFromStream(is, "");
			is.close();
		}
		catch(Exception e) {
			Log.i("button", "インターネットのアクセスでエラーが発生しました");
		}
		return image;

	}

	public void setOnDrawableListener( OnDrawableListener listener ) {
		this.listener = listener;
	}

	@Override
	protected void onPostExecute(Object o) {
		if ( listener != null ) {
			listener.onDrawableListener((Drawable)o);
		}
	}
}

内部で専用のインターフェイスを作成し、setOnDrawableListener の引数にする事によって、内部で保存しておいて、onPostExecute から呼び出す(外側のインターフェイス内のメソッド)ようにすれば、ボタンイベントと同様の扱いになります


posted by lightbox at 2016-04-25 22:40 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする

2016年04月22日


フリーフォントでボタン素材作成

基本的なパターンのバリエーションに対して、色違いのサンプルを作成しました。

これ以外にも簡単に以下のバリエーションを作成できます
1) フォントの種類を変更
2) 文字の輪郭を別の色で作成
3) 文字を上下左右に寄せる
4) ボタンに太い枠を作成する
5) フォントサイズを変更する
6) ボタンのサイズを変更する( ドラッグでも変更できます )
7) 角丸の大きさを変更する
8) ボタンの光沢の強さを調整する
9) ボタンの文字を表示しないで作成する

光沢 : 0.6, グラデ : 50

➡ 色別

光沢 : 0.6, グラデ : 0

➡ 色別

光沢 : なし, グラデ : 50

➡ 色別

光沢 : なし, グラデ : 0

➡ 色別

光沢 : なし, グラデ : 0, ドロップシャドウ( 色:40190B )

➡ 色別

光沢 : 0.6, グラデ : 50, 文字枠色 : D44617

➡ 色別

光沢 : 0.6, グラデ : 0, 文字枠色 : D44617

➡ 色別



posted by lightbox at 2016-04-22 14:41 | WEBサービス | このブログの読者になる | 更新情報をチェックする

2016年04月10日


Android Studio が 2.0 になりました。前からの内容も含めて整理してます。

SDK の更新が必須のようです。おかげでエミュレータが進化します。人によって違う可能性もありますが、最初のダイアログからでは更新できずに、本体画面の HELP からしか更新をする事ができませんでした。



また、最新の SDK で無い状態で、2.0 へ更新すると、英語でいろいろ指示されるので、慣れてる人はリンクをクリックしたりしてうまく行くとは思いますが、最初から SDK(Tool) を最新にする事をお勧めします。(ホント毎度面倒くさい・・・)

開始のダイアログは見栄えが変わっています。基本的な機能は同じのようですが、以前より格段に目的を達成する為の選択が容易になっています。





そして、何より最も目立った UI の改善がエミュレータに見られます。



一目瞭然ですが、右サイドにならんでいるアイコンで多くの操作が可能です。カメラアイコンはキャプチャーですが、デフォルトでデスクトップに保存するようになっていて、一番下の『more』で設定画面を表示させてその場所も変える事ができます。



※ 回転は何故か表示されないという不具合はありましたが・・・・


本体にも地味に素敵な機能が・・・

Rerun(変更無しでの再実行) と Stop(Android内でのアプリケーションの終了) 機能が追加されているようで、これは便利。



ざっと、目新しいのはこれぐらいしか解りませんでしたが、速度は速くなっているような気はします。ただ、バージョンアップ後の旧プロジェクトが使えるようになるまでの Gradle の処理はかなり長かったです。それと、新たなプロジェクト作成後、画面のレンダリングに失敗する不具合は相変わらずあるようです。その場合は、Refresh で OK です。



Android Studio の設定

このあたりは特に変わってませんでした。

1) 開始時にプロジェクトを開かない


2) エディタのフォント変更


3) キャラクタセット


4) 行番号とホワイトスペース


5) タブ設定


6) 既存のスペースインデンントをタブに変更
7) 行をコードの途中で改行した時のインデント
8) CTRL + マウスホイールでフォントサイズ変更
9) マウスのホバーでドキュメント表示
10) ライブラリの参照の追加
11) ツリーと表示内容の相互同期


▼ こちらはショートカット
Android Studio 予習開始!




posted by lightbox at 2016-04-10 17:26 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする

2016年04月07日


kintone の開発者ライセンスを取得しました。一年有効で、見たところ4年ぐらい使えそうです

2016/4/7 : ルックアップのインポートの注意事項について追加
kintone のドキュメントはこちら



※ この本は、『開発者ライセンス』必要な人には必要無い本だとは思います


●● ● 様

「cybozu.com developer network」をご利用頂きましてありがとうございます。 
お申込みいただきましたサービスが利用可能な状態になりました。
( 一週間かかりました )

■ご使用方法
────────────────────────────────────────
以下のURLにアクセスして、サービスをご利用ください。

アクセスURL:https://ランダム文字列.cybozu.com
ログイン名:固定ユーザID
パスワード:初回パスワード
( ログイン後変更します )

ご利用ユーザー数:5ユーザー(固定ユーザ を除く)
ご利用期限:2020-12-31
( 4年使えそうな理由です )

■ご注意点
・ご利用できるサービスは、kintone のみとなります。
・開発者ライセンスは、kintoneのアプリケーション開発を目的として、ご利用いただけます。
 本運用、テクニカルサポートのご利用はできません。
・アクセスURLの変更、パスワードの再発行はできません。
・開発者ライセンスの発行は、申し込みの2,3営業日後になる場合がございます。
・ユーザー数 5、 ディスク容量 20GB の固定となり、変更はお受けできません。
・開発者ライセンスのお見積もり、ご発注はお受けできません。
・データリストアのサービスもお受けできません。
・cybozu.com Store の管理機能(IPアドレス制限、BASIC認証など)はご利用できません。
・開発者ライセンスをご利用中のユーザーさまは、テクニカルサポートサービスを利用することはできません。
 developer network のコミュニティをご利用ください。
・ライセンスの終了日はお申し込み日から1年後の月末となります。
 利用者から開発者ライセンスを終了する旨の通知がなされない限り、
 サービス提供期間の終了日からさらに1年間開発者ライセンスが更新されます。
 ライセンスの削除をご希望の方は、開発者ライセンスの終了前までにご連絡ください。


試用アカウントからの移行

kintoneシステム管理のアプリテンプレートで、既に作成したアプリからテンプレートを作成後ダウンロード(書き出す)して開発用アカウントでアプリ作成を『テンプレートから選ぶ』で移行できます。アプリ(この場合はスキーマというべきかな)とデータは別々で、データはアプリ画面から『ファイルに書き出す』でダウンロードファイルを作成してダウンロードします。







データインポート時の注意事項

レコード番号をキーにする場合、存在しないレコード番号がファイルのキーの列にあると、ファイルを読み込めません。レコード番号を追加してしまった場合は、読み込み時にチェックを外してキー扱いしないようにして読み込みます。



ルックアップしている項目のあるアプリーションへのインポートでは、ルックアップ先の照合項目を重複不可にしておく必要があります。これを考えた時、一般的なテーブル設計にのっとって、コードを重複不可にしておいて、照合をコードで行うようにエンドユーザに指導する必要がありますね。

重複不可にしていないルックアップデータをインポートしようとすると、ルックアップのコードと参照内容はインポートされませんが、その他の一般項目の内容は正しくインポートされます( インポートする際に警告が表示されますが、そんなに目立つ警告表示では無いので注意が必要です )



posted by lightbox at 2016-04-07 13:17 | kintone | このブログの読者になる | 更新情報をチェックする

2016年04月03日


java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )

4月からの java の授業の開発環境は AndroidStudio がメインになりますが、コマンドプロンプトから地味に扱う方法や、Android では無いアプリの Eclipse での扱いも知って欲しいので昔のキットを引っ張り出して整備しています。

まずは、コマンドプロンプトから


※ 当然 JDK は必要です。あるという前提で。

ソース
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

public class Main {

	// **********************
	// エントリポイント
	// **********************
	public static void main(String[] args) {
		Main thisClass = new Main();
	}

	// **********************
	// コンストラクタ
	// **********************
	public Main() {
		super();
		my_acton();
	}

	// **********************
	// 初期処理
	// **********************
	private void my_acton() {

		MyTool out = new MyTool(">>>");
		out.println("処理開始");

		// **********************
		// プロパティオブジェクトを作成
		// プロパティオブジェクトは、extends Hashtable(連想配列)
		// **********************
		Properties props = new Properties();
	
		// **********************
		// * 連想配列に送信用サーバのアドレスをセット
		// **********************

		// gmail の場合は、以下のリンクより、安全性の低いアプリの許可: 有効 に変更
		// https://myaccount.google.com/security?pli=1#connectedapps
		// props.put("mail.smtp.host","smtp.gmail.com");

		// 以下 Yahoo!
		props.put("mail.smtp.host","smtp.mail.yahoo.co.jp");

//		props.put("mail.smtp.port","587");	// サブミッションポート
		props.put("mail.smtp.auth", "true" );	// SMTP 認証を行う

		props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
		props.put("mail.smtp.socketFactory.fallback", "false");
		props.put("mail.smtp.socketFactory.port", "465");

		// **********************
		// メール用のセッションを作成
		// **********************
		SimpleAuthenticator sa =
			new SimpleAuthenticator("ユーザID","パスワード");
		Session MailSession = 
			Session.getInstance( props, sa );
	
		try {
	
			// **********************
			// メール用のメッセージオブジェクトを作成
			// **********************
			MimeMessage msg = new MimeMessage(MailSession);
	
			// **********************
			// 宛先
			// **********************
			msg.setRecipients(
				Message.RecipientType.TO,
				"メールアドレス"
			);
	
			// **********************
			// 送信者
			// **********************
			msg.setFrom(
				new InternetAddress( "ユーザID@yahoo.co.jp", "私です", "ISO-2022-JP")
			);
	
			// **********************
			// 件名
			// **********************
			msg.setSubject(
				MimeUtility.encodeText(
					"日本語件名",
					"iso-2022-jp",
					"B"
				)
			);
	
			// **********************
			// 本文
			// **********************
			msg.setContent(
				"本文\n本文",
				"text/plain; charset=\"iso-2022-jp\""
			);
	
			// **********************
			// 送信
			// **********************
			Transport.send( msg );
	
		}
		catch (Exception e) {
			out.println("送信エラー");
			e.printStackTrace();
		}

		out.println("処理終了");

	}

	// **********************
	// 内部用クラス
	// **********************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			StringBuilder sb = new StringBuilder();
			sb.append(this.mark);
			sb.append(str);
			String s = sb.toString();		
			System.out.println( s );
		}

	}

	// **************************
	// 認証用のプライベートクラス
	// **************************
	private class SimpleAuthenticator extends Authenticator {
	
		private String user_string = null;
		private String pass_string = null;
	
		public SimpleAuthenticator( String user_s, String pass_s ) {
			super();
			user_string = user_s;
			pass_string = pass_s;
		}
	
		protected PasswordAuthentication getPasswordAuthentication(){
			return new PasswordAuthentication( this.user_string, this.pass_string );
		}
	}

}

Yahoo! メールと Gmail でテストしていますが、Gmail は 安全性の低いアプリの許可を『有効』にする必要があります。

mail.jar によるメールを送る為のビルド環境は同梱しています。java_build.wsf を実行していただくと、ビルド用のコマンドプロンプトが開きますが、前提として JDK の場所は指定していただく必要があります。

▼ __buildPath.txt
C:\Program Files\Java\jdk1.8.0_66\bin

; 行先頭にセミコロンはコメントです。
; また、一つでも有効な行を発見したら、それを使用して次の行以降は読み込みません
; なにも無い行は無視します
;
; ※ いろいろなバージョンをこれで切り替えて処理します
バージョンを切り替えたい場合はいくつも書いて、必要の無い行の先頭に ;(セミコロン)を入れます。 CLASSPATH の指定方法として、既に mail.jar の指定がされているので適宜変更します。 ▼ __classPath.txt
.;..\mail.jar

; 行先頭にセミコロンはコメントです。
; また、一つでも有効な行を発見したら、それを使用して次の行以降は読み込みません
; なにも無い行は無視します
;
..mail.jar になっているのは、__targetPath.txt の指定で、カレントが javamail フォルダになっており、そこからの相対位置になる必要があるからです。 実行 java_start.wsf を実行しますが、__java_start.txt の中に書いた内容が1行づつ実行されます
java Main
pause
exit
※ その他は、readme.txt を参照して下さい
タグ:java
posted by lightbox at 2016-04-03 21:01 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり