2014年10月31日金曜日

Android アプリ開発の進捗状況について

eclipse で Javaのコードを書いてAndroid アプリ開発の勉強をやっています。


昨日は、画面を縦方向にスクロールできるようにレイアウトを定義する方法や、インテントを使って画面を切り替える方法などを学習しました。


インテントを使って画面を切り替える場合には、画面のレイアウトを追加し、AndroidManifest.xml に定義を追加し、コードの中でインテントの記述をします。画面を切り替える際に文字列を引き渡すことができます。


なお、現在、作成しているのは、Android 上でAccess のデータベースファイル(mdbファイルやaccdbファイルなど)のテーブルの内容を表示するアプリです。Accessのデータベースにアクセスするために jackcessucanaccess などのライブラリを使用しています。


ucanaccess を使ったサンプルプログラムを以下でも紹介させていただいております。

http://chaos-fractal.blogspot.jp/2014/10/android-accessmdb.html


(2014.11.1)
テキストビューを横スクロールできるようにする方法を学習しました。layout ファイルを書き換えてやる必要があります。


アプリを公開する方法についても調べています。



(2014.11.21)
開発したAndroid アプリをはじめて公開 してみました。

2014年10月30日木曜日

SSL 3.0 の脆弱性への対応について

SSL 3.0 の脆弱性の対応を行うため、以下のサイトを参照して、FireFox にアドオンをいれました。



http://www.mozilla.jp/blog/entry/10433/


SSL3.0の脆弱性対策についての情報処理推進機構のサイト

http://www.ipa.go.jp/security/announce/20141017-ssl.html

2014年10月29日水曜日

Androidアプリ開発 Excelに書かれた株のリストのそれぞれの株価を取得して表示する

まずExcelファイルには、いくつかの株のコードが書かれています。以下のサンプルでは、Excelのファイルから株のコードを読み取り、それぞれの株について、インターネットのYahooのサイトから株価を取得して表示します。Excelから株コードを読み取るためにjexcelapi というライブラリを使用して、インターネットから株価を取得するためには、jsoup というライブラリを使用しています。

source code

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView2"
android:layout_marginTop="24dp"
android:text="TextView" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.andexcelread"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
import java.io.File;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.read.biff.BiffException;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
public class MainActivity extends Activity {
String dbStr = Environment.getExternalStorageDirectory() + "/dropbox/xls/stock1.xls";
String strHyouji="";
String[][] arrays = read();
int line=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(arrays == null ){
strHyouji = "failure in reading Excel file";
}else{
for (String[] array : arrays) {
strHyouji = strHyouji + array[0];
System.out.println();
strHyouji = strHyouji + "\n";
}
}
TextView textSetting = (TextView) findViewById(R.id.textView1);
textSetting.setText(strHyouji);
if(arrays != null){
new MyTask().execute();
}
}
private class MyTask extends AsyncTask<Void, Void, String> {
@Override
protected String doInBackground(Void... params) {
String url = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=6954.T";
String arg1 ="-----";
String arg2 ="-----";
String strKaeshi = "";
for (String[] array : arrays) {
try{
url = "http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" + array[0] + ".T";
Document doc = Jsoup.connect(url).get();
Elements stoksPrices=doc.select("td[class=stoksPrice]");
Elements reals=doc.select("dd[class=yjSb real]");
for (Element stoksPrice : stoksPrices){
System.out.println(stoksPrice.text());
arg2 =stoksPrice.text();
System.out.println(arg2.replace(",",""));
arg2=(arg2.replace(",",""));
}
for (Element real : reals){
System.out.println(real.child(0).text());
arg1 = real.child(0).text();
}
} catch (Exception e) {
arg2=e.toString();
}
strKaeshi = strKaeshi + arg1 + " " + arg2 + "\n";
arg1 ="-----";
arg2 ="-----";
}
return strKaeshi;
}
@Override
protected void onPostExecute(String result) {
((TextView)findViewById (R.id.textView1)).setText(result);
}
}
public String[][] read() {
Workbook workbook = null;
try {
WorkbookSettings ws = new WorkbookSettings();
ws.setGCDisabled(true);
workbook = Workbook.getWorkbook(new File(dbStr), ws);
Sheet sheet = workbook.getSheet(0);
int rowCount = sheet.getRows();
String[][] result = new String[rowCount][];
for (int i = 0; i < rowCount; i++) {
Cell[] row = sheet.getRow(i);
result[i] = new String[row.length];
for (int j = 0; j < row.length; j++) {
result[i][j] = row[j].getContents();
}
}
return result;
} catch (BiffException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (workbook != null) {
workbook.close();
}
}
return null;
}
}

Android アプリ開発 Excelシートのデータを表示する

Android アプリで、Excel ファイルを読み込んでシートの内容を表示するサンプルです。Jexcel というライブラリを使用しています。私の環境ではなぜか新しいタイプのxlsxファイルは読み込めず、古いタイプのxlsファイルは読み込めました。
source code
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView2"
android:layout_marginTop="24dp"
android:text="TextView" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.andexcelread0"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.read.biff.BiffException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.widget.TextView;
public class MainActivity extends Activity {
String dbStr = Environment.getExternalStorageDirectory() + "/dropbox/xls/stock1.xls";
String strHyouji="";
String[][] arrays = read();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(arrays == null){strHyouji="no such file";}else{
for (String[] array : arrays) {
for (String v : array) {
strHyouji = strHyouji + v + ",";
}
strHyouji = strHyouji + "\n";
}
}
TextView textSetting = (TextView) findViewById(R.id.textView1);
textSetting.setText(strHyouji);
}
public String[][] read() {
Workbook workbook = null;
try {
WorkbookSettings ws = new WorkbookSettings();
ws.setGCDisabled(true);
workbook = Workbook.getWorkbook(new File(dbStr), ws);
Sheet sheet = workbook.getSheet(0);
int rowCount = sheet.getRows();
String[][] result = new String[rowCount][];
for (int i = 0; i < rowCount; i++) {
Cell[] row = sheet.getRow(i);
result[i] = new String[row.length];
for (int j = 0; j < row.length; j++) {
result[i][j] = row[j].getContents();
}
}
return result;
} catch (BiffException e) {
strHyouji=strHyouji+ e.toString();
} catch (IOException e) {
strHyouji=strHyouji+ e.toString();
} catch (Exception e) {
strHyouji=strHyouji+ e.toString();
} finally {
if (workbook != null) {
workbook.close();
}
}
return null;
}
}

Android アプリ開発でプログラム内でビューを定義する

Android アプリ開発では、プログラムの中でビューを作ることもできます。以下のサンプルでは、7つのボタンを配置して、その後さらに、OKとCancelのボタンを作成しています。





import android.app.Activity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout linearLayout = new LinearLayout(this);
        linearLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(linearLayout);

       
       
        Button[] buttons ;
       
       
        int num_arr;
       
        num_arr=7;
       
       
        buttons = new Button[num_arr];
       
        int i =0;
       
        while ( i < num_arr){
       
        buttons[i] = new Button(this);
        buttons[i].setText("number" + i );
            buttons[i].setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));
            linearLayout.addView(buttons[i]);
       
        i=i+1;
       
        }
       
     
        Button button1 = new Button(this);
        button1.setText("OK");
        button1.setLayoutParams(new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
        linearLayout.addView(button1);

        Button button2 = new Button(this);
        button2.setText("Cancel");
        button2.setLayoutParams(new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.WRAP_CONTENT));
        linearLayout.addView(button2);
    }
}

Java で Jackcess ライブラリを使用し Accessデータベースのテーブルのフィールド名を取得する

Jackcess というライブラリを使用するとAccessデータベースのファイルにアクセスできることがわかりました。

使用したのは、以下のjarファイルです。

jackcess-2.0.6.jar
commons-lang-2.6.jar
commons-logging-1.1.1.jar




以下のサンプルでは、Java で Jackcess ライブラリを使用し Accessデータベースのテーブルのフィールド名を取得して表示しています。

Contacts.accdb というデータベースのContacts というテーブルのフィールド名をリストアップして表示しています。

また、そのテーブル内のレコードのLast Name と Address というフィールドの内容を表示しています。



import java.io.File;
import java.sql.Types;
import java.util.List;
import java.util.Set;

import com.healthmarketscience.jackcess.*;

public class jackcess_sample1{
public static void main(String[] args) {
try {
Database db = DatabaseBuilder.open(new File("/home/user/Contacts.accdb"));
Table table =db.getTable("Contacts");

 List<? extends Column> Columns=table.getColumns();

 for(Column column : Columns){

 System.out.println("column_name =" + column.getName());
 }
for(Row row : table) {
 System.out.println("row = " + row.get("Last Name") + " " + row.get("Address"));
}

} catch (Exception e) {
e.printStackTrace();
}
}
}



(2014.11.22)
Jackcess を使って Access データベースのテーブルを更新する場合には制限があります。データベースによっては更新できないのです。





2014年10月26日日曜日

Excel やAccess のファイルをAndroid から操作するアプリを開発する

個人がデータベースを構築して使用する際に、サーバー形式のOracle 、MySQL、SQLserver などを使うという方法もあるのかもしれませんが、それほど大きくないデータベースの場合には、ExcelやAccess を使用するということも多いのではないでしょうか?

そうして作成した Excel や Access のファイルを、Dropbox などのクラウド上に配置して、PCからもスマホやタブレットからも使用したいというニーズはあると思います。

そのため、最近は、Android から、ExcelやAccessのファイル(xls、xlsx、mdb、accdbなど)を操作するアプリを作ってみようという気になっています。


Androidアプリは、Ubuntu上でEclipseを使ってJava で作成しています。また、Excelのxls,xlsx ファイルを操作するには、POIやjexcelapiというAPIを使えばできるらしいということがわかっています。 また、Accessのmdb,accdb ファイルを操作するには、ucanaccess というAPIを使用すればできることがわかっています。

POIucanaccess はダウンロードして、解凍して、jar ファイルを取り出し、所定の位置に配置すれば使用できます。


なお、自分で開発しなくても Android で Accessデータベースを閲覧するアプリ は存在します。

Ubuntu 14.10 にアップグレードしました。

Ubuntu 14.10 にアップグレードしました。ただしアップグレードの途中で以下のようなメッセージが表示されてしまいました。




クラッシュレポート

アプリケーション Ubuntu Software Center が突然終了しました。



Syslinux-themes-debian パッケージが動かない状態にある可能性があります。



クリーンアップ中に問題が発生しました。
installArchives() failed

2014年10月20日月曜日

Android アプリ開発サンプル Accessのmdb

以下のAndroidのサンプルアプリでは、ucanaccessを使ってAccessのmdbファイルにアクセスして、テーブルにレコードを追加しています。



Android sample code which add a record of Access database file (mdb file). It needs three edittext fields and two buttons on layout.
source code
package com.example.andaddmdb;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import android.support.v7.app.ActionBarActivity;
import android.text.SpannableStringBuilder;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends ActionBarActivity implements OnClickListener{
private Button button1;
private Button button2;
private EditText edittext1;
private EditText edittext2;
private EditText edittext3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(this);
button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if(arg0.equals(button1)){
String Hyouji="";
edittext1=(EditText)findViewById(R.id.editText1);
edittext2=(EditText)findViewById(R.id.editText2);
edittext3=(EditText)findViewById(R.id.editText3);
SpannableStringBuilder sb1 = (SpannableStringBuilder)edittext1.getText();
SpannableStringBuilder sb2 = (SpannableStringBuilder)edittext2.getText();
SpannableStringBuilder sb3 = (SpannableStringBuilder)edittext3.getText();
String str1 = sb1.toString();
String str2 = sb2.toString();
String str3 = sb3.toString();
// Toast.makeText(this, "ボタンが押されました。"+str, Toast.LENGTH_LONG).show();
// String dbStr = Environment.getExternalStorageDirectory() + "/dropbox/mdb/foma0.mdb";
String dbStr = Environment.getExternalStorageDirectory() + "/dropbox/mdb/foma0.mdb";
//String dbStr = "sdcard/foma.mdb";
Hyouji = dbStr;
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://" + dbStr + ";memory=true");
// Connection conn=DriverManager.getConnection("jdbc:ucanaccess://" + dbStr );
PreparedStatement stmt = conn.prepareStatement("INSERT into foma1 (name, number,comment) VALUES (?, ?, ?)");
stmt.setString(1, str1);
stmt.setString(2, str2);
stmt.setString(3, str3);
int rowsUpdated = stmt.executeUpdate();
Hyouji=Hyouji + "\n" + "rowsUpdated code is " + rowsUpdated;
}catch (Exception e){
Hyouji=Hyouji + "\n" + e.getMessage();
}
Toast.makeText(this, Hyouji, Toast.LENGTH_LONG).show();
}else if(arg0.equals(button2)) {
finish();
}
}
}
view raw andAddMdb hosted with ❤ by GitHub

Androidアプリ開発 Accessデータベースであるmdbファイルにアクセス

先日、紹介させていただいたODBCブリッジを使用しないでJAVAからAccessデータベースのファイルにアクセスする方法を使って、Androidの簡単なアプリを作成してみました。ODBCブリッジを使用しないでAccessにアクセスするというのは、ucanaccess というしくみを使用するものです。Accessデータベースの場合にはファイルの拡張子は、mdbかまたはaccdbです。(mdbのほうが古いです。)以下のソースコードではdropbox/mdb/foma0.mdbというAccessデータベースの中のfoma1というテーブルの内容を表示しています。

Android appli development sample code which acccess to the Access database mdb file.
source code
package com.example.andviewmdb;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.view.Menu;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import net.ucanaccess.converters.TypesMap.AccessType;
import net.ucanaccess.ext.FunctionType;
import net.ucanaccess.jdbc.UcanaccessConnection;
import net.ucanaccess.jdbc.UcanaccessDriver;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String Hyouji="";
// LinearLayout layout = new LinearLayout(this);
// layout.setOrientation(LinearLayout.VERTICAL);
// setContentView(layout);
// String dbStr = Environment.getExternalStorageDirectory() + "/dropbox/mdb/foma0.mdb";
String dbStr = Environment.getExternalStorageDirectory() + "/dropbox/mdb/foma0.mdb";
//String dbStr = "sdcard/foma.mdb";
Hyouji = dbStr;
try{
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://" + dbStr + ";memory=true");
// Connection conn=DriverManager.getConnection("jdbc:ucanaccess://" + dbStr );
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT [name],[number],[comment] FROM [foma1]");
while (rs.next()) {
// System.out.println(rs.getString(1));
Hyouji=Hyouji + "\n" + rs.getString(1) + " " + rs.getString(2)+ " " + rs.getString(3);
}
} catch (Exception e) {
// e.printStackTrace();
Hyouji=Hyouji + "\n" + e.getMessage();
}
//System.out.println(Hyouji);
/*
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://" + dbStr + ";memory=true");
// Connection conn=DriverManager.getConnection("jdbc:ucanaccess://" + dbStr );
PreparedStatement stmt = conn.prepareStatement("INSERT into foma1 (name, number) VALUES (?, ?)");
stmt.setString(1, "山田 太郎");
stmt.setString(2, "0120-111-2222");
int rowsUpdated = stmt.executeUpdate();
Hyouji=Hyouji + "\n" + "rowsUpdated code is " + rowsUpdated;
}catch (Exception e){
Hyouji=Hyouji + "\n" + e.getMessage();
}
*/
// TextView tv = new TextView(this);
// tv.setText(String.format("%s", Hyouji));
// layout.addView(tv);
TextView textSetting = (TextView) findViewById(R.id.textView1);
textSetting.setText(Hyouji);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
view raw andViewMdb hosted with ❤ by GitHub

2014年10月10日金曜日

自閉症に効く薬?


「金沢大学と東京大学で自閉症に効く薬が研究されている」というニュースをみました。この薬は、オキシトシンとかいう名前で、この薬により、相手の表情を読み取ることができるようになるなどコミュニケーション能力がアップするらしいです。


コミュニケーション能力がアップするのであれば、服用してみたい気もします。