2016年12月31日土曜日

HP 210aで年賀状を印刷する 2017年版

今年も結局昨年と同様のスケジュール
なぜもっと早くできない!! の反省会


設定・手順は昨年版を参照(の方が詳しい)

レイヤーの写真を張り変えるテンプレ作業はいつもより早かったと思うが...やはりいろいろトラブルがあって大掃除しながら2.5日程度かかっている感じ

---
画像のリサイズ
0. お好みの写真を選択し、1071x832の縦横比でトリミング
1. 画像 -> 画像拡大縮小 で 1071x832
2. 画像 -> キャンバスサイズ で、↑になっていなければ同じサイズにする

こんな感じで行けたような...

---
画像をはがきテンプレに貼る
1. はがきテンプレとしたxcfのファイルを開く
2. ("レイヤー"ダイアログが表示されていない場合は、画像が出ているウィンドウの"ダイアログ -> レイヤー"を選択すると表示される)
3. 写真が表示されているレイヤーに、上記"画像のリサイズ"で作ったxcfをドラッグアンドドロップ
4. 古い写真レイヤーが表示されているが、不要なので削除
5. "The GIMP"ダイアログの移動アイコン(矢印の十字)を選択して、写真のレイヤーをつかんでよさそうな位置に移動する

---
レイヤーを重ねた上で、写真を鮮やかにしたい
1. "レイヤー"ダイアログで、写真を配置したレイヤーを選択
2. レイヤー -> 色 -> 色相・彩度で、彩度を思いっきり上げると派手な感じになってよさげ

---
印刷
- GIMPから印刷する

1. レイヤー -> 下のレイヤーと結合 を繰り返して、レイヤーを1枚にする
2. GIMPからファイル -> 印刷
3. プリンターを"ネットワーク"に設定(印刷する度にリセットされるようだ)
 給紙トレイ : フォト
 用紙サイズ : はがき
 メディア   : インクジェット紙
4. 詳細設定で
 出力品質 : 高画質 にする
 (ICMが"写真"になっていたりするのは"3"の設定で反映されている模様?)
 フチあり印刷で良い

---
HP-209aはがきトレイ不具合
なかなか給紙しない -> 宛名面にそらせたり、給紙する際に押してやると有効

---
インク
- amazonで350円代で3本のが、一昨年とは別の店で売っているので、プリンタを動作確認してよさそうなら早めに買っておく
- で、28日くらいに注文すると、年明けになってしまうので、今年もあきらめ
- チェックすると 青・赤・黒(つまり黄色以外)がテスト印刷でカスレ始める
- 近所だと意外に高い(4000円程度)ので諦め
- 互換インクがあったので、4色買う (約3000円。ポイント使用)
  実は、スーパーにもあって値段は一緒。バーゲンで5%オフならスーパー有利だが、
  今回はipad買ったときのポイントで購入(他に購入予定のものもないし...)
- 結局黄色も途中で切れたので、よかったのだが... 黒が5枚程度の印刷でカスレる orz
- 古いカートリッジ(純正)につけかえると、いくらかましな印刷だったので、ヘッド目詰まりではなさそう
- 翌日(12/31)にお店で交換
- とりあえずこれで今回はなんとかなった (損失5枚)

インクは毎回もめる...
早めにプリンタのテストして、amazonで買っておくのがよさそうだ
(値段が全然違うので、不良品ならそこだけ純正買えばよいのだし)




2016年12月15日木曜日

タスクとUI表示 その1

(長い処理を行いたい場合など)Worker threadとUI threadの関係はやや面倒で、
- 描画はUI threadで行う
- UI threadで長い処理を行うと描画が固まる
- 長時間処理はworker threadで行えば画面固まらない
- でも描画はUI threadで行わないといけない

ということで、background workerだったり、invokeで描画させたりなど、昔から面倒だった訳ですが、最近?はasync/awaitが非同期処理の流行りのようです。

実験的に作ったアプリは
- 長時間処理用と仮定したtaskを生成する
- 上記taskから描画表示を行う
という処理を、async/awaitとinvokeを使って書いてみます。

formのデザイン画面には
- taskを開始するボタン
- 状態を表示するUIとしてtextbox
を配置します。

textboxでは、taskから1秒ごとに時間を表示させます。
taskが終了したらUI threadで"終了した"表示を行います。

表示部分のポイントは
textBox_dispTime.Invoke(new Action(() => { textBox_dispTime.Text = DateTime.Now.ToString(); }));
の部分で、
UI部品.Invoke(デリゲート);
という感じの模様。
これでtask側からtextBox_dispを操作する事ができました。
 
taskについてのポイントは
- await Task.Run(() => workThread()); として、awaitキーワードをつけたTask.Run()する
- awaitキーワードを使うメソッドには"async"キーワードを付ける
となり、動作としては、
- UIスレッドはawaitで待ち
- task側からUI(textBox)を操作
- workThread()が終了すると、その次のメソッド(UIスレッドからtextboxに"終了"を書く)実行

という感じでした。

ソースコード

using System.Threading;


namespace TestAwait01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        // awaitキーワードを使うメソッドはasyncキーワードをつけておく
        private async void button_TaskStart_Click(object sender, EventArgs e)
        {
            await Task.Run(() => workThread());         // workThreadの処理をtaskで実行

            textBox_dispTime.Text = "終了";
        }

        // threadとして実行するメソッド
        private void workThread()
        {
            for(int i = 0; i < 10; i++) {
                // textBox_dispTime.Text = DateTime.Now.ToString(); // コレは表示されない
                textBox_dispTime.Invoke(new Action(() => { textBox_dispTime.Text = DateTime.Now.ToString(); }));
                Thread.Sleep(1000);
            }
        }

    }



2016年4月21日木曜日

ThinkPadのWindows10でくるくるスクロール

ようやっとX220でWindows10を本格稼働させ始めました。

いつもはThinkVantageのユーティリティを入れてトラックポイントやバッテリーなどを使うのですが、Windows10を半クリーンインストールしたところ、特にその辺を入れなくてもそれっぽく動いているようなのでそのまま使ってみています。

タッチパッドの使い勝手はちょっと違和感があったのでマウスの調整を見ていたところWindows8.1っぽくなったのでその辺を...

1. 設定 -> マウスとタッチパッド -> その他のマウスオプション
2. マウスのプロパティに"ThinkPad"がある!のでそのタブをクリックして"設定"ボタン
3.  Synapticsコントロールパネル(!)が開くので"スクロール"タブを選択
4. "1本指エッジスクロール"の中の"カイラル円形スクロール"をチェック > これでくるくるスクロールができるようになる
5. が、速度が遅いので、上のほうの"スクロール速度"を最速の1つ前くらいに

これで使いやすくなりました...が、この辺までwindows updateでinstallされるのか!?、あるいは今回のインストールの特性上(8.1を入れてから明示的にクリーンインストールしたような)一部残っているのか...と思ったが、USBメモリからクリーンインストールしたので前者で判別して入れてくれているのか...

昨年のGシリーズのスパイウェア騒動以来、良いイメージが無いのでMSからの配信の方が安心出来そうですね(それも大元はメーカー製のものなのだけど)




2016年4月20日水曜日

Android Studio 2.0 install

解説サイトを参考にしてinstallしました。

- installはadminで実施
- 起動は一般ユーザ

で大丈夫の模様

haxがinstallされなかったようなのでSDK managerから実施
初回のエミュレータ起動時に"haxがinstallされていない"と出たのでメッセージ下のinstallをクリックすると"install done"と表示される(のに相変わらずinstallされていない表示)
そのまま進めるとlogでは"hax enable"と出ているので大丈夫の模様

defaultの状態ではSDKは最新版(mashmallow対応)のようだが、minimum SDKではkitkat等も指定できるので、とりあえず変更せずに様子見する事にする

emulater imageはmashmallowで入っているが、"Nexus Sでmashmallow"なVirtual Deviceを作成してとりあえずビルド -> 実行できる事が確認できている
(DLに時間がかかるので様子見してからKitKatやlollipopのemulaterのemulaterを入れようかなと...)

とりあえずしばらくこれで使ってみます。


2016年4月10日日曜日

ストレージにファイルを保存する(内部ストレージ)

外部ストレージに保存する場合はmanifest fileへの記載が必要みたいだけど、内部ストレージなら不要のようだ

1. activity_main.xml (前回の使いまわし)
<LinearLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="1">

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/editText_dataText"
            android:layout_weight="1.04"
            android:text="good morning" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Save"
            android:id="@+id/button_save"
            android:onClick="onButtonSaveClick" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Load"
            android:id="@+id/button_load"
            android:onClick="onButtonLoadClick" />
    </LinearLayout>
    <!-- 読み込み用 -->
    <TextView
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:id="@+id/labelList"
        />

</LinearLayout>

2. MainActivity.java
package com.example.training.filelocaloperation;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;


public class MainActivity extends Activity {

    TextView tv;
    String LOCAL_FILE = "test.text";

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

        tv = (TextView)findViewById(R.id.editText_dataText);
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void onButtonSaveClick(View v){
        String text = tv.getText().toString();
        Toast.makeText(MainActivity.this, new StringBuilder().append("Saveクリックした").append(text).toString(), Toast.LENGTH_SHORT).show();

        OutputStream out;
        try {
            // out = openFileOutput(LOCAL_FILE,MODE_APPEND);    // 追記
            out = openFileOutput(LOCAL_FILE, Context.MODE_PRIVATE);       // 上書き
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(out,"UTF-8"));
            writer.append(text);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // tv.setText("Saveクリック");
    }

    public void onButtonLoadClick(View v){
        Toast.makeText(MainActivity.this, "Loadクリックした", Toast.LENGTH_SHORT).show();
        // tv.setText("Loadクリック");

        StringBuilder text = new StringBuilder();

        InputStream inputStream;
        String lineBuffer = null;
        try {
            inputStream = openFileInput(LOCAL_FILE);

            BufferedReader reader= new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
            while( (lineBuffer = reader.readLine()) != null ){
                text.append(lineBuffer);
                Log.d("FileAccess", lineBuffer);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        TextView lblList = (TextView)this.findViewById(R.id.labelList);
        lblList.setText(text);
    }
}




Sqliteを使ってみる(queryによる読み出し追加)

保存したデータを読み取ってみます
結果は、listで表示します

1.activity_main.xml
<LinearLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="1">

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/editText_dataText"
            android:layout_weight="1.04"
            android:text="good morning" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Save"
            android:id="@+id/button_save"
            android:onClick="onButtonSaveClick" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Load"
            android:id="@+id/button_load"
            android:onClick="onButtonLoadClick" />
    </LinearLayout>
    <!-- 読み込み用 -->
    <TextView
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:id="@+id/labelList"
        />

</LinearLayout>

2.  FeedReadeerContract.java クラスを新規作成
package com.example.training.sqldatasave;

import android.provider.BaseColumns;

/**
 * Created by on 2016/04/02.
 */
public final class FeedReaderContract {
    // To prevent someone from accidentally instantiating the contract class,
    // give it an empty constructor.
    public FeedReaderContract() {}

    /* Inner class that defines the table contents */
    public static abstract class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_ENTRY_ID = "entryid";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_CONTENT = "content";
    }
}

3. FeedReaderDbHelper.javaを新規作成
package com.example.training.sqldatasave;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.example.training.sqldatasave.FeedReaderContract.FeedEntry;

/**
 * Created by 2016/04/02.
 */
public class FeedReaderDbHelper extends SQLiteOpenHelper {
    private static final String TEXT_TYPE = " TEXT";
    private static final String COMMA_SEP = ",";
    private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
                    FeedEntry._ID + " INTEGER PRIMARY KEY," +
                    FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
                    FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
                    FeedEntry.COLUMN_NAME_CONTENT + TEXT_TYPE  +
            " )";
    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

    // If you change the database schema, you must increment the database version.
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "FeedReader.db";

    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // This database is only a cache for online data, so its upgrade policy is
        // to simply to discard the data and start over
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
    public void insertDb(SQLiteDatabase db, int id, String title, String content){
        // Create a new map of values, where column names are the keys
        ContentValues values = new ContentValues();
        values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
        values.put(FeedEntry.COLUMN_NAME_TITLE, title);
        values.put(FeedEntry.COLUMN_NAME_CONTENT, content);

        // Insert the new row, returning the primary key value of the new row
        long newRowId;
        newRowId = db.insert(
                FeedEntry.TABLE_NAME,
                null, //FeedEntry.COLUMN_NAME_NULLABLE,     // "COLUMN_NAME_NULLABLE"は認識されないみたい
                values);
        if(newRowId < 0){
            Log.e("sample", "insertDbでエラー発生");
        }
    }
}

4. MainActivity.javaはこんな感じに
package com.example.training.sqldatasave;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteAbortException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.training.sqldatasave.FeedReaderContract.FeedEntry;


public class MainActivity extends Activity {

    TextView tv;
    /*
    DatabaseHelper mDbHelper;
    SQLiteDatabase mDb;
    */

    FeedReaderDbHelper feedReaderDbHelper;
    SQLiteDatabase db;

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

        tv = (TextView)findViewById(R.id.editText_dataText);
        // mDbHelper = new DatabaseHelper(this);
        // mDb = mDbHelper.getWritableDatabase();

        feedReaderDbHelper = new FeedReaderDbHelper(this);
        db = feedReaderDbHelper.getWritableDatabase();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void onButtonSaveClick(View v){
        Toast.makeText(MainActivity.this, "Saveクリックした", Toast.LENGTH_SHORT).show();
        // mDbHelper.insert(mDb, 1,  tv.getText().toString(), 0);
        feedReaderDbHelper.insertDb(db, 1, "title1", tv.getText().toString());
        tv.setText("Saveクリック");
    }

    public void onButtonLoadClick(View v){
        Toast.makeText(MainActivity.this, "Loadクリックした", Toast.LENGTH_SHORT).show();
        tv.setText("Loadクリック");
        StringBuilder text = new StringBuilder();

        SQLiteDatabase db = feedReaderDbHelper.getReadableDatabase();
        try {
            Cursor cursor = db.query(FeedEntry.TABLE_NAME,  // table
                    new String[]{FeedEntry.COLUMN_NAME_ENTRY_ID, FeedEntry.COLUMN_NAME_TITLE, FeedEntry.COLUMN_NAME_CONTENT},   // cols
                    null,           // selection
                    null,           // selection args
                    null,           // group by
                    null,           // having
                    "_id DESC"  // "_id ASC"           // order by(_idをDESCで降順指定)            );
            cursor.moveToFirst();
            do {
                text.append("," + cursor.getString(1));
                text.append("," + cursor.getString(2));
                // text.append("," + cursor.getString(3));
                text.append("\n");
            } while (cursor.moveToNext());
        } catch (SQLiteAbortException e){
            Toast.makeText(MainActivity.this, "SQL Exception発生", Toast.LENGTH_SHORT).show();
        } finally {
    }
        TextView lblList = (TextView)this.findViewById(R.id.labelList);
        lblList.setText(text);
    }
}

2016年4月4日月曜日

Sqliteを使ってみる

developerの情報からコーディングしてみます。

1. activity_main.xml
<LinearLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:weightSum="1">

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/editText_dataText"
            android:layout_weight="1.04" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Save"
            android:id="@+id/button_save"
            android:onClick="onButtonSaveClick" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Load"
            android:id="@+id/button_load"
            android:onClick="onButtonLoadClick" />
    </LinearLayout>

</LinearLayout>

2. FeedReadeerContract.java クラスを新規作成
package com.example.training.sqldatasave;

import android.provider.BaseColumns;

/**
 * Created by on 2016/04/02.
 */
public final class FeedReaderContract {
    // To prevent someone from accidentally instantiating the contract class,
    // give it an empty constructor.
    public FeedReaderContract() {}

    /* Inner class that defines the table contents */
    public static abstract class FeedEntry implements BaseColumns {
        public static final String TABLE_NAME = "entry";
        public static final String COLUMN_NAME_ENTRY_ID = "entryid";
        public static final String COLUMN_NAME_TITLE = "title";
        public static final String COLUMN_NAME_CONTENT = "content";
    }
}

3. FeedReaderDbHelper.javaを新規作成
package com.example.training.sqldatasave;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import com.example.training.sqldatasave.FeedReaderContract.FeedEntry;

/**
 * Created by 2016/04/02.
 */
public class FeedReaderDbHelper extends SQLiteOpenHelper {
    private static final String TEXT_TYPE = " TEXT";
    private static final String COMMA_SEP = ",";
    private static final String SQL_CREATE_ENTRIES =
            "CREATE TABLE " + FeedEntry.TABLE_NAME + " (" +
                    FeedEntry._ID + " INTEGER PRIMARY KEY," +
                    FeedEntry.COLUMN_NAME_ENTRY_ID + TEXT_TYPE + COMMA_SEP +
                    FeedEntry.COLUMN_NAME_TITLE + TEXT_TYPE + COMMA_SEP +
                    FeedEntry.COLUMN_NAME_CONTENT + TEXT_TYPE  +
            " )";
    private static final String SQL_DELETE_ENTRIES =
            "DROP TABLE IF EXISTS " + FeedEntry.TABLE_NAME;

    // If you change the database schema, you must increment the database version.
    public static final int DATABASE_VERSION = 1;
    public static final String DATABASE_NAME = "FeedReader.db";

    public FeedReaderDbHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    public void onCreate(SQLiteDatabase db) {
        db.execSQL(SQL_CREATE_ENTRIES);
    }

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // This database is only a cache for online data, so its upgrade policy is
        // to simply to discard the data and start over
        db.execSQL(SQL_DELETE_ENTRIES);
        onCreate(db);
    }

    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        onUpgrade(db, oldVersion, newVersion);
    }
    public void insertDb(SQLiteDatabase db, int id, String title, String content){
        // Create a new map of values, where column names are the keys
        ContentValues values = new ContentValues();
        values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
        values.put(FeedEntry.COLUMN_NAME_TITLE, title);
        values.put(FeedEntry.COLUMN_NAME_CONTENT, content);

        // Insert the new row, returning the primary key value of the new row
        long newRowId;
        newRowId = db.insert(
                FeedEntry.TABLE_NAME,
                null, //FeedEntry.COLUMN_NAME_NULLABLE,     // "COLUMN_NAME_NULLABLE"は認識されないみたい
                values);
        if(newRowId < 0){
            Log.e("sample", "insertDbでエラー発生");
        }
    }
}

4. MainActivity.javaはこんな感じに
package com.example.training.sqldatasave;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {

    TextView tv;
    /*
    DatabaseHelper mDbHelper;
    SQLiteDatabase mDb;
    */

    FeedReaderDbHelper feedReaderDbHelper;
    SQLiteDatabase db;

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

        tv = (TextView)findViewById(R.id.editText_dataText);
        // mDbHelper = new DatabaseHelper(this);
        // mDb = mDbHelper.getWritableDatabase();

        feedReaderDbHelper = new FeedReaderDbHelper(this);
        db = feedReaderDbHelper.getWritableDatabase();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.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();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public void onButtonSaveClick(View v){
        Toast.makeText(MainActivity.this, "Saveクリックした", Toast.LENGTH_SHORT).show();
        feedReaderDbHelper.insertDb(db, 1, "title1", tv.getText().toString());
        tv.setText("Saveクリック");
    }
    // 使わないけど一応
    public void onButtonLoadClick(View v){
        Toast.makeText(MainActivity.this, "Loadクリックした", Toast.LENGTH_SHORT).show();
        tv.setText("Loadクリック");
    }
}

2016年2月28日日曜日

VAIO Tap 11をwindows10にupdateしてみる

基本的にVAIOのサイトに記載されている手順で良いのですが、ブロードバンドが細いのでbootableにしたUSBメモリからupdateを行います(VAIO公式の手順は予約update)。

VAIOのサイトの"詳細"の方の手順に則ります。
- Adminでログイン
- VAIO updateで全てupdateする
- パッチファイルを実行 < 最初のシーケンスに書かれていないので忘れがち
- USBメモリのsetup.exeを実行

そして問題は...Windows10を起動するとLCDの輝度調整が出来ません...明るッ!
(ドライバは"マイクロソフト標準" の表示)

パッチファイルを忘れていたので再度Windows8.1に戻してパッチをあてるも症状変わらず
(Windows10でVAIO updateすると3点ほどinstallされたので別件の効果はある)


サイトを見てもIntel HD graphicsは配布されていないようでしたが、
C:\Windows\Driver ...
下にHD graphicsが存在することを発見
(プリインストール時のもの?。VAIOのサイトになぜかドライブ上のドライバの在処が書かれていたのがヒントに)

中にsetup.exeがあるので実行すると...おぉ、明るさ変わった!

ということで、怪しいけどプリインストールのドライバをsetupすることで解消されるようです。
(サイトで最新を配布してくれればいいのに...)

クリーンインストールしたThinkPadは、メーカー製ドライバを入れなくても明るさもバッテリーも動いている(ThinkVantage不要か??というくらい...買収されたのでアプリ入れたくないから好都合なのだが)のに随分違うものです。

あと気になった点。
Windows10のupdate時の序盤に"最新のアップデートを適用"みたいなのをチェックするとえらく時間がかかる(先に進まない)のでしない方がよさそう(そしてキャンセルもとっても時間がかかる)
今回は"適用しない"にしてネットワークも切断して実施
(update終了してからアプリのアップデートなどにとっても時間がかかっているようだけどそれは放置)



2016年2月21日日曜日

android studioのprojectでビルド対象versionの変更

いざエミュレータで試そうとすると、"Older versionだよ"と怒られた時の対処方法

1. Projectのペインを表示する
2. "app"を右クリックし、"Open Module Setting"を選択
3. "Compile Sdk Version"を適当なものに変更する


Intentでweb siteを表示する

ボタンを押されたらブラウザでweb siteを表示するintentを作ってみる

1. デザイナにEdit Text (plain Text)を配置
2. デザイナでボタンを配置
3. ボタンのハンドラを以下で記載
    // ボタン押下処理
    public void onButtonClick(View v){
        EditText edv = (EditText) findViewById(R.id.editText);
        String stringUri = edv.getText().toString();
        // Uri uri = Uri.parse("http://www.google.co.jp");
        Uri uri = Uri.parse(stringUri);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
    }

エミュレータでも動作確認できますね

2016年2月20日土曜日

ボタン押下時のハンドラを書く(その2)

よく書籍に乗っていたの(そんでもって前に書いたもの)は、
1. デザイナでボタンを配置する(この時のIDを覚えておく)
2. ハンドラの関数を書く。
3.onCreateでボタンをfindViewByIdして、ハンドラとして登録する。

ですが、ボタンの場合のもうちょっと簡単に書く方法
1. デザイナでボタンを配置する
2. ハンドラの関数をMainAcitivyjavaに書く (MainActivityのメソッドとして書く)
     public void onButtonClick(View v){
        Toast.makeText(MainActivity.this, "クリックした",Toast.LENGTH_SHORT).show();
    }
3. デザイナで配置したボタンを選択し、 onClickに"2"で記載したハンドラ名を選ぶ

こっちの方が簡単ですね。


2016年2月4日木曜日

レイアウトファイルを書き始める

XMLファイルを書き始めはこんな感じでやるみたいだ。

1. ペインをProjectにする
2. res/layoutを右クリック
3. 新規 -> layout resource file を選択
   入力用のダイアログが表示されるので以下入力
4. "File name"にファイル名(につながる)を入れる
   先頭大文字じゃなくてもいいみたい...
   というか、大文字使えないみたいなので、アンダースコアとかにするみたいだ
5. "Root element"に配置用のタグ(ListViewとかLinearLayoutとか)を記載する
   文字を入れていると補間してくれるので適当に ...
6. OKボタン押下

デザイナに表示されるので、"デザイン" or "テキスト"に切り替えて表示を調整する
(Projectペインの"layout"に追加されているので選んで修正)


2016年1月25日月曜日

画像リソースをstaticに使用する

ちょっと参考にしている情報と違っていた為...Android studioのversionの違いかもしれないけど(Betaのままだし)

1. explorerで適当な画像(今回は493x357でPNGにした画像)をCtrl-Cでコピー
  ファイル名はすべて小文字、拡張子も小文字
2. Android studioのProjectペインでres/drawableのを左クリックしてCtrl-Vでペーストする
3. dialogが出るのでそのままOKとする
  今回は"mdpi"が選択されているがその状態で良いようだ
  ここで"drawable"を選択した場合に実行時に "INSTALL_FAILED_OLDER_SDK" エラーが発生
  (対応version云々と思わしきエラーも出ていたが、上記操作をすれば出なかった)
4. ImageViewにstaticに使用する場合はImageViewをダブルクリックして"..."の選択で↑で
  追加したリソースを選択する