2015年12月31日木曜日

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

毎回忘れるので、メモ
来年は別のプリンタや環境になっているかもしれない...と思いつつ2年くらいたっている訳だが、たぶん来年も同じ事で悩むでしょうw

B210aで印刷する場合は、プリンタのプロパティで設定してアプリから印刷する。

プリンタの選択
- "B210 Series (ネットワーク)"にしておく
  "(ネットワーク)"が無い"B210 Series"はuSB接続なので、印刷実行してもウンスン

ページ設定
- 枠を1,1,1,1くらいにしておく(デフォルトは25mmだったか)
 補足: 3,3,3,3で、 "印刷->画像の設定"タブで左8.00/上0.00/中央揃えしない で位置合わせは良さそうだった

プロパティの"用紙/品質"タブ
- 給紙方法 : フォトトレイ (はがきの場合)
- 用紙サイズ : はがき
- メディア : インクジェット用官製はがき
- 品質の設定 : "カスタム"にして以下
- 詳細設定 : ICM無効/写真 , フチあり印刷, 高画質, オン, すべてのページを印刷
  (1mm程度のフチがある印刷でも問題ない場合の設定。A4で通常トレイでテスト印刷したのと
  ほぼ同じくらいの余白で出るイメージだった)

詳細設定の画質については"標準"でもよさそうな気がするが...

※ 上記設定をしても、一度印刷をすると忘れてしまうようなので、印刷する度にやり直しているが正しいのか? (xp)

本体について
- インク残量は結構いい加減な気がするが、実は正しいのかもしれない
 (今年は、去年買った178XL blackがステータスでは半分だったが擦れたので交換すると治ったが
 使用済みカートリッジを振るとちゃぽちゃぽ音がする...)
- フォトトレイの給紙がここ3年ほど不調
 ハガキをややロールさせた状態(横方向の押さえつけを強くした上方向のアーチ)になるように装填
 すると調子が良い
 あとは残1枚とかだと比較的調子が悪いので、数枚重ねるとか....

インクについて
- ヨドバシで"インク2本で3%オフ"というキャンペーンをやっていたので税込み1000円以内で買えた
- 青を使いまくるので、シアンがよく切れる (バラで良かった?)
- 上記に書いた通り、ステータスではインクがあっても擦れる事があるので出力を確認しながらの印刷が必要
- 品質テスト印刷(ステータスじゃない方)で、一行の最後の方が擦れている場合はインク切れと思われ
 (目詰まりはあまり無いような気がする...目詰まりになったらプリンタ毎捨てなんだけど...)
- 互換インクは安いのだとamazonで4色セットで1200円くらい。ヨドバシだと3000円くらい
- 純正インクは4色セットで3500円くらい(amazon/ヨドバシ)


プリンタ後継機について
- HPだとEnvyなんかがこの時期は6000円くらいで売っているのでそっちにすればヘッド毎交換で目詰まりを気にしなくて済むようだ
- 特にHPを贔屓にする必要はないけど、専用ソフトも不要だし複合機で安いし無線LANも手動設定でいけるしで不満はあまり無いかなぁ(印刷も年賀状ハガキなら結構綺麗に出るし)
- 不満といえば、b210aはでかいのが不満だが、安いEnvyは本体液晶が小さいのが不満でどっちもどっちか

結局毎年12/31に印刷して実家に戻ってからあて名&一言書きとかしているのは来年はどうにかしたい感じ

追記 : 2016年版に続く...

2015年11月10日火曜日

Android Studioの設定(文字コード・SDK version)

Android Studioでよく変更する部分の覚書

  • 文字コード
    • File -> Settings -> Edor -> File Encoding -> Project Encoding < ここをUTF-8にする
    • Default Encoding < こっちもUTF-8にして右のチェックを入れておく
  • SDK version
    • File -> Project Structure -> Flavorsタブ
      • うまく動かなかったときなど、minimum SDK versionなどを変更する
    •  
 上記で毎回いれなくて済むかはまだ謎だけど....


2015年10月19日月曜日

background処理を書いてみる

調べてみると、以下のように作るのが一般的?のようだ
 1. IntentServiceを継承したクラスを記載
  runnableのrunをOverrideし、重い処理を書く
  IntentServiceのコンストラクタでHandlerをnewする
  IntentServiceのonHandleIntentでhandlerをpostする(これによってUIスレッド側で処理を実施)
  一定時間後に繰り返したい場合はpostDelayedで遅延実行
    (ThreadSleepを使っても同じようだ)
 2. MainActivityで上記Intentを作成、開始    startService で開始

データのやりとりとしては
MainActivity -> IntentService
  開始時(startServiceする前)にsetActionで文字列を渡す
IntentService -> MainActivity
 MainActivityでBroadcastReceiverを登録しておく
 Intentを作成し、putExtraで文字列を登録し、sendBroadcastで送信

 ---
public class MainActivity extends Activity {

    Button buttonStart;
    static public TextView textCount;
    Intent intent;
    boolean isRunning = false;

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

        buttonStart = (Button)findViewById(R.id.button_start);
        textCount = (TextView)findViewById(R.id.text_count);

        // ボタン押下時のハンドラ
        buttonStart.setOnClickListener(new ButtonClickListener_startButton());  // 実体は↓のクラス

        // Broadcastを受けとるReceiverを設定
        DataReceiver dataReceiver = new DataReceiver();
        // LocalBroadcastの設定
        IntentFilter intentFilter = new IntentFilter("BkTimerEvent");
        LocalBroadcastManager.getInstance(this).registerReceiver(dataReceiver, intentFilter);
    }

    // ボタン押下ハンドラとして登録される
    private class ButtonClickListener_startButton implements View.OnClickListener {
        @Override
        public void onClick(View v){
            Log.d("BackgroundTimer", "onClick");       // ログ出力
            intent = new Intent(getApplication(), BackgroundIntentTimer.class);      // intentを生成
            intent.setAction("start");      // 文字列を受け渡す。受け側はonHandleIntentの引数から、getActionで文字列を取得する事ができる(putExtraでも同様の事が出来そう)
            startService(intent);           // 開始。onHandleIntentが呼び出され
        }
    }

    @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);
    }

    // Broadcastを受けとる
    public class DataReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            Log.d("BackgroundTimer", "MainActivity Received");

            // Broadcastされたメッセージを取り出す
            String message = intent.getStringExtra("Message");
            if(message!=null) {
                textCount.setText(message);
            }
        }
    }
}

---
 package com.example.training.backgroundtimer;

import android.app.IntentService;
import android.content.Intent;
import android.os.Handler;
import android.support.v4.content.LocalBroadcastManager;
import android.util.Log;

/**
 * Timer
 */
public class BackgroundIntentTimer  extends IntentService{

    private Handler handler;

    public BackgroundIntentTimer(){
        super("com.example.training.backgroundtimer.BackgroundIntentTimer");
        handler = new Handler();
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("BackgroundTimer", "onHandleIntent");
        String action = intent.getAction();     // Activity側でsetActionした内容を出力

        // callbackをremoveしないと重複処理される為
        handler.removeCallbacks(thread);
        if(action.equals("start")){
            count = 0;
            handler.post(thread);   // UIスレッドに対して処理をポストする(描画処理の為)
        }
        Log.d("BackgroundTimer", action);
    }

    // スレッド
    private Runnable thread = new Runnable() {
        @Override
        public void run() {
            // ここに重い処理を呼び出す
            Log.d("BackgroundTimer", "run!!");
            timerProcess();
        }
    };

    private void timerProcess(){
        // 表示更新用にメッセージ(Intent)送信
        Log.d("BackgrountTimer", "timer Process");        Intent messageIntent = new Intent("BkTimerEvent");
        messageIntent.putExtra("Message", Integer.toString(count));
        LocalBroadcastManager.getInstance(this).sendBroadcast((messageIntent));

        // 1秒ごとにカウントアップする処理
         /*
            try {
                LocalBroadcastManager.getInstance(this).sendBroadcast((messageIntent));                handler.removeCallbacks(thread);
                Thread.sleep(1000);
            } catch (InterruptedException ie){
                Log.d("BackgroundTimer", "timer error");
            }
            */
            handler.removeCallbacks(thread);            handler.postDelayed(thread,1000);   // 遅延実行する場合
            // handler.post(thread);   //Thread.sleepする場合
        }
    }
}



2015年8月27日木曜日

Radioボタンを使ってみる

XMLの記載
RadioGroupで囲むと排他選択になる
    <RadioGroup
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignTop="@+id/radioButton"
        android:layout_alignParentStart="true">
    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Xxx"
        android:id="@+id/radioButton"
        android:layout_below="@+id/textView"
        android:layout_alignParentStart="true"
        android:layout_marginTop="42dp" />

    <RadioButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Yyy"
        android:id="@+id/radioButton2"
        android:layout_below="@+id/radioButton"
        android:layout_alignParentStart="true" />

    </RadioGroup>



java側は以下
1. ハンドラの登録
        // ラジオボタンハンドラ
        RadioButton rbuttonXxx = (RadioButton)findViewById(R.id.radioButton);
        rbuttonXxx.setOnClickListener(new RadioButtonXxxClickListener());

2. ハンドラを記載
    private class RadioButtonXxxClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v){
            // 処理の内容を書く
        }

2015年8月24日月曜日

TextView/EditTextを参照・設定する

EditBox = EditText
Label = TextView
みたいなものでしょうか...

TextViewに文字を表示する
    TextView tv = (TextView) findViewById(R.id.textView);
    tv.setText(string);

EditTextに入力されている文字を取得する
    EditText edv = (EditText) findViewById(R.id.editText);
    String string = edv.getText().toString();

ボタン押下時のイベントハンドラを書く

Androidのイベントハンドラの書き方
今回はボタン押下時のイベント

1. MainActivity.javaのonCreateにハンドラを指定するコードを書く
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new ButtonClickListener()); // 引数にリスナを書く

2. ↑のリスナのクラスを書き、onClickをoverrideする
    private class ButtonClickListener implements View.OnClickListener {
        @Override
        public void onClick(View v){
            // ここにアクションを書いておく(例:トーストを表示する)
      Toast.makeText(MainActivity.this, "クリックしました", Toast.LENGTH_SHORT).show();
        }
    }


2015年2月3日火曜日

C#でExcel参照

ドラッグドロップするとシート1の(1,1)のセルの内容を表示してみる
あと、worksheetの名前をtextbox2の内容で更新してみる

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Microsoft.Office.Interop;

using Microsoft.Office.Interop.Excel;

namespace excelTest01
{
    public partial class Form1 : Form
    {
        Microsoft.Office.Interop.Excel.Application ExcelApp;
        Workbook Workbook;
        Worksheets Worksheets;
        Worksheet Worksheet;
        Range Range;
       
        public Form1()
        {
            InitializeComponent();

            ExcelApp = new Microsoft.Office.Interop.Excel.Application();
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// ドロップ時イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_DragDrop(object sender, DragEventArgs e)
        {
            string[] filelist = (string[])e.Data.GetData(DataFormats.FileDrop);
            textBox1.Text =  Path.GetFileName(filelist[0]);
            string file = Path.GetFileName(filelist[0]);

            // excelを開く
            Workbook = ExcelApp.Workbooks.Open(filelist[0]);
            // Worksheet = Workbook.Sheets[1];    // ワークシートのインデックスは1から
            Worksheet = Workbook.Sheets[2];    // ワークシートのインデックスは1から
            Range = Worksheet.Cells[1, 1];
            textBox1.Text = Range.Text;
            Worksheet.Name = textBox2.Text;     // ワークシートのnameプロパティでワークシート名を変更出来るようだ

            // excelを閉じる
            ExcelApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
        }

        /// <summary>
        /// ドラッグエンター時イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_DragEnter(object sender, DragEventArgs e)
        {
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
                e.Effect = DragDropEffects.Copy;
            else
                e.Effect = DragDropEffects.None;
        }
    }
}