2018年7月13日金曜日

IBM Cloud上でFlaskを使用してWebAPIを作る(前編)

IBM Cloud上でFlaskを使用し、JSONデータをやり取りするWeb APIを作成しています。
その方法をメモ。

Starter Kitsの中から「Python Flask」を選択し、アプリケーションを作成します。


























作成したアプリのソースをダウンロードします。

PythonもFlaskも未経験ですが、いろいろ調べながら下記のようなコードを作成しました。
受け取ったデータを結果とともにそのまま返すだけです。


from flask import Flask, jsonify, request

@app.route('/api/sample', methods = ['POST'])
def Sample():
    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])
        return jsonify({'status':'success', 'user':user})
    else:
        return jsonify({'status':'error'})


{"user":"Taro"}というデータを送信したところ、内部エラーが発生しました。

FlaskのAPIドキュメントの「is_json」の項には「New in version 0.11.」と記載されています。
requirements.txtは「Flask==0.10.1」と記載されており、どうやらFlaskのバージョンが古いことが原因のようです。

「Flask==1.0.2」と書き換え、現時点の最新版にバージョンアップすると、{"status":"success","user":"Taro"}という結果が返ってくるようになりました。

またいつか、どこかで。

2018年7月6日金曜日

申請用総合ソフトを使って登記申請してみた!

今年の株主総会で取締役の任期満了を迎え、その場で選任が決議され、取締役重任と相成りました。
重任でも法務局に変更登記が必要です。調べてみるとオンライン申請できるようなのでチャレンジしてみました。


申請するには


以前、社会保険関係はe-Govから、納税証明書取得時はe-Taxから申請しましたが、法人登記はまた別のシステムを利用することになります。それが

「登記・供託オンライン申請システム(登記ねっと・供託ねっと)」

です。
ただし、登記事項証明書の交付請求などはサイトからできますが、今回行う法人登記申請など大半の手続きは「申請用総合ソフト」というソフトを利用しなければなりません。


準備


まず、「申請用総合ソフト」を「登記・供託オンライン申請システム」からダウンロードしてインストールします。
インストールでは特につまずくことはありませんが、あとで参考にするので、インストール手順が記載されている「かんたん事前準備ガイド」という操作手引書はダウンロードしておきましょう。

「申請用総合ソフト」を起動してみましょう。


そうです。このソフトは申請者登録しないと使えません。
「かんたん事前準備ガイド」の「申請者情報の登録」にしたがい、サイトでユーザー登録しましょう。

ユーザー登録が完了したら、ソフトを起動し、「かんたん事前準備ガイド」の「ICカードの切替設定」にしたがって、ICカード情報を登録したら準備完了です。


いざ申請!


申請用総合ソフトのメイン画面です。





























サイトには主な手続きごとに操作手引書が用意されています。
今回は「株式会社の役員変更の登記(全員重任)申請」を参考に、

  1. 申請書に情報入力
  2. 株主総会議事録・株主リストを添付
  3. マイナンバーカードで電子署名

といった手順を経て、申請情報を送信しました。

登録免許税は電子納付可能で、インターネットバンキングから初めてペイジーを使って納付しました。
すべてオンラインで完結するなんて素敵!・・・と思っていました、この時は。


ところが



処理状況は申請用総合ソフトで確認できるのですが、何日経ってもステータスが更新されません。
ちょうど一週間ほど経ったころ、法務局から電話がありました。

「議事録等は郵送してもらえましたか?」

添付した書類の原本が必要とのことでした。
オンラインで申請するメリットがないなあ、と思いながら、法務局へ書類を持参しました。


さらに


しばらくして、また法務局から電話がかかってきました。

「マイナンバーカードでは電子署名として認められません。」

どうやら「法人認証カード」というものでないといけないようです。
見逃していただけかもしれませんが、そのあたりもマニュアルに分かりやすく書いておいてくれたらいいのですけどね。

結局、申請を取り下げ、再度書面で申請することになりました。
申請は申請用総合ソフトで取り下げることができます。その際にも電子署名が必要で、それはマイナンバーカードでもいいそうです。(そこはええんかいっ!)


扱う情報の重要性もあり、完全なオンライン化が難しいのかもしれませんが、窓口での対応も含めて、旧態依然としてるなあと感じました。

またいつか、どこかで。

2018年6月29日金曜日

e-Taxソフト(WEB版)を使って納税証明書を交付請求してみた!

先日、とある申請のため納税証明書を取得する必要がありました。
e-Taxを使うと手数料が若干安いということもあり、e-Tax(WEB版)を使って交付申請してみました。


準備


e-Taxにはアプリケーションをインストールする「e-Taxソフト」とブラウザ上で使用する「e-Taxソフト(WEB版)」があります。今回はインストール不要なe-Taxソフト(WEB版)を使用しました。

使用前に事前準備が必要ですが、それらをまとめてやってくれる「事前準備セットアップ」ツールが提供されています。
マニュアルもありますので、手順に従えば迷うことはありません。セットアップの最後に「JPKI利用者ソフト」のインストールがありますが、私の環境にはすでに入っていたのでインストールしませんでした。

利用を開始するには開始届出、つまりユーザー登録が必要です。
e-Tax上で法人情報等を入力すると「利用者識別番号」が発行されます。
この利用者識別番号と自身で設定した暗証番号でログインすることになります。


いざ申請!


システムにログインし、納税証明書の交付申請を行います。
必要事項を入力し、処理を進めていきます。今回は税務署に受け取りに行くことにしたので「来署予定日」を入力し、マイナンバーカードで電子署名をして、送信すれば完了です。

しばらくして、税務署から電話がかかってきました。
何かやらかしたかと思ったら、申請確認の電話で「何時ごろに来署するか」を尋ねられました。
受理されたことの安心感はありますが、一件一件電話で確認しているとしたら大変だなと思いました。

予定日に税務署に受け取りに行き、無事納税証明書をゲットしました。
ただ、e-Taxを使うと待ち時間が短縮、と書かれていたのですが、受け取るまでに10分、お釣りをもらうまでに5分かかり、
「窓口で書面で請求するとどれだけ時間がかかるんだろう」と考えると頭がクラクラしてきました。

ところが


後日、税務署から電話がかかってきました。
「今回取得した利用者識別番号とは別に、すでに利用者識別番号が発行されている」とのこと。

そうなんです。
税理士さんが取得して使っておられたんです。
そちらが使えなくなってはいけないので、今回取得した利用者識別番号はキャンセルしてもらいました。

またいつか、どこかで。

2018年6月23日土曜日

IBM CloudのNoSQL DBを使ってみよう ~第6章~(Android:ListViewにボタン追加でListItemのClickイベントが効かない)

どうも、もりもりです。

ListViewにボタンを配置する前はTextViewだけで、リストアイテムのクリックで
取消線や文字色を制御していましたが
編集や削除のImageButtonを追加するとListViewのItemClickイベントが
走らなくなっちゃいました。

ということで、ListViewのItemClickイベントとImageButtonのClickイベント、
どちらも走るようにする方法についてです。

ListViewのアイテムクリックイベント


まずは、ListViewのアイテムをクリックした際の
イベントリスナーを設定するメソッドです。

private void setListViewListener() {
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            LinearLayout layout = (LinearLayout) view;
            TextView textViewDescription = (TextView) layout.findViewById(R.id.task_description);

            toggleTaskCompleteAt(position);
            Task task = (Task) mTaskAdapter.getItem(position);
            ControlUtility.changeItemState(textViewDescription, task.isCompleted());
        }
    });
}

編集、削除クリックイベント


編集クリックイベントのソースです。

public void onClickTaskEdit(View v) {
    this.editPosition = (Integer)v.getTag();
    this.showDialog(DIALOG_EDIT_TASK);
}

削除クリックイベントのソースです。

public void onClickTaskDelete(View v) {
    int position= (Integer)v.getTag();
    this.deleteTaskAt(position);
}

ListViewのItemレイアウト


ListViewの一行一行のレイアウトです。
10行目の「android:descendantFocusability="blocksDescendants"」が
必要となります。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:background="@color/list_item_color"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:id="@+id/task_description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"/>

    <ImageButton
        android:id="@+id/button_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="right"
        android:src="@android:drawable/ic_menu_edit"
        android:background="@color/list_item_button_color"
        android:onClick="onClickTaskEdit"/>

    <ImageButton
        android:id="@+id/button_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="right"
        android:src="@android:drawable/ic_delete"
        android:background="@color/list_item_button_color"
        android:onClick="onClickTaskDelete"/>

</LinearLayout>

本当はActivity.showDialog()も3.x系以降は非推奨となったので
DialogFragmentを使用したかったのですが、今回はそこまで手がまわりませんでした。
また時間を見つけて試したいと思います。


ではまた、いつの日か~。

2018年6月16日土曜日

IBM CloudのNoSQL DBを使ってみよう ~第5章~(Android:テキストに取消線を入れる)

どうも、もりもりです。

今回は、ListViewの行をタップした際にTextViewのテキストに
取消線を入れる方法について説明します。

下記のTask5やTask7のように、完了したことがわかるように
取消線を入れ、文字色を変更するようにしました。


テキストに取消線を入れる


TextViewとフラグを渡して表示を変更するメソッドを追加します。

TextViewからTextPaintを取得し、そやつに対してsetFlagsするだけです。

public static void changeItemState(TextView textView, boolean flag) {
    TextPaint paint = textView.getPaint();

    if (flag) {
        textView.setTextColor(Color.BLACK);
        // 取消線を入れる
        paint.setFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
    } else {
        textView.setTextColor(Color.WHITE);
        // 取消線を外す
        paint.setFlags(textView.getPaintFlags() & ~Paint.STRIKE_THRU_TEXT_FLAG);
    }
    paint.setAntiAlias(true);
}

取消線を入れる場合は「Paint.STRIKE_THRU_TEXT_FLAG(0x10)」とOR演算、
戻す場合は反転ビットとAND演算するだけです。

次回予告


次回 は、ListViewのアイテムにボタンを追加した際に、
アイテム自体のクリックイベントが発生しなくなる場合の解決方法についてです。


ではまた~。

2018年6月8日金曜日

IBM CloudのNoSQL DBを使ってみよう ~第4章~(Android:ToolBarの常時表示方法)

どうも、もりもりです。

前回まではIBM Cloudについてでしたが、今回からはAndroidのお話になります。

今回は、ToolBarを常に表示させる方法を残しておきます。

私が使用しているGalaxy s7 edgeはメニューボタンがありません。
バックキーを長押しすることでメニューを表示できますが、
それはそれで使い勝手が悪いので
ToolBarを常に表示するよう変更しようと思いました。

レイアウト


サンプルは28~42行目だけでしたが、改変後はこんな感じです。
14~26行目がToolBarになります。

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ToDoActivity">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay"/>

        </android.support.design.widget.AppBarLayout>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="4dp">

            <ListView android:id="@+id/list"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@xml/bg_transparent_gray"
                android:layout_weight="1"
                android:choiceMode="singleChoice"
                android:drawSelectorOnTop="false"/>

        </LinearLayout>

    </LinearLayout>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_marginRight="100dp"
        android:layout_marginBottom="@dimen/fab_margin"
        app:srcCompat="@android:drawable/ic_input_add"/>

</android.support.design.widget.CoordinatorLayout>

スーパークラスの変更


サンプルはListActivityを継承していましたが
AppCompatActivityを継承するよう変更し、
ListViewのイベントなどは別で実装しています。

public class ToDoActivity extends AppCompatActivity
implements OnSharedPreferenceChangeListener {

}

ツールバーの設定


onCreateに8,9行目を追加するだけでOKです。

@Override
protected void onCreate(Bundle savedInstanceState) {
    Log.d(LOG_TAG, "onCreate()");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_todo);

    // ツールバー
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ・・・
}

下記の赤枠ToolBarが常に表示されるようになりました。


メニュー表示設定


今回のメニューは4つあります。
・NEW
・Download(Pull)
・Upload(Push)
・Settings

ToolBarをご覧いただいておわかりの通り、「NEW」のみ表示されており
右上のメニューアイコンをタップすることで残りのメニューが表示されます。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:compat="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_new"
        android:layout_height="wrap_content"
        android:orderInCategory="100"
        compat:showAsAction="ifRoom"
        android:title="@string/action_new" />

    <item
        android:id="@+id/action_download"
        android:orderInCategory="100"
        compat:showAsAction="never"
        android:title="@string/action_download" />

    <item
        android:id="@+id/action_upload"
        android:orderInCategory="100"
        compat:showAsAction="never"
        android:title="@string/action_upload" />

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        compat:showAsAction="never"
        android:title="@string/action_settings" />

</menu>

showAsActionで、常に表示するか、メニュー内に入れるかなどを指定することが可能となっています。

<showAsAction>
値 詳細
ifRoom 表示するスペースがあれば表示する
withText titleのテキストを表示する
never 常に表示しない
always 常に表示する
collapseActionView actionViewLayoutで指定したアクションビューと関連付ける

次回予告


次回 はテキストに取消線を入れる方法を紹介したいと思います。


ではまた~。

2018年6月1日金曜日

IBM CloudのNoSQL DBを使ってみよう ~第3章~(Cloudant NoSQL DBの権限設定)

どうも、もりもりです。

今回はクラウド上のDBに対して読み取り専用権限を付ける方法についてです。

だれかと情報の共有はしたいが見せるだけというような場合に、権限を設定すれば可能となります。

権限の追加


1.権限設定画面を表示
  前回 作成したDBを選択し、「Permissions」をクリックします。

2.APIキー生成
  「Generate API Key」をクリックします。


  すぐ下にKeyとPasswordが表示されると共に、上の権限一覧にも追加されます。
  権限一覧の「_reader」のみチェックがONになっていることを確認します。


  ここで注意ですが、クリック後、下に生成されたKeyとPasswordが表示されます。
  このタイミングでエディタにコピペしておきましょう。
  表示が消えると今後一切見れなくなります。
  そうなってしまった場合は再度APIキーを生成してください。

AndroidのTodoアプリで設定


1.AndroidのTodoアプリにキーとパスワードを設定
  Todoアプリの設定画面を開き、下記を設定してください。

<設定>
設定項目 設定値
API Key 生成したKey
API Password 生成したpassword


2.TodoアプリでPULL確認
  メニュー「Download(Pull)」を選択します。
  成功するはずです。

3.TodoアプリでPUSH確認
  任意のタスクをタップして完了状態にし、メニュー「Upload(Push)」を選択します。
  「Replication Error」というToastが表示されるはずです。

次回予告


次回 はAndroidのお話ですが、ToolBarを常に表示する対応方法についてです。


ではまた~。