ラベル IBM Cloud の投稿を表示しています。 すべての投稿を表示
ラベル IBM Cloud の投稿を表示しています。 すべての投稿を表示

2018年9月21日金曜日

IBM Cloud上でCloudantを使ってみた!(後編)

前回、ローカルからCloudantデータベースにアクセスしました。
今回は、WebAPIでCloudantを使ってみます。


@app.route('/api/adduser', methods = ['POST'])
def AddUser():

    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])

        client = Cloudant('d.....', 'a.....', url='https://d.....')
        client.connect()

        my_database = client['users']

        if user not in my_database:
            my_database.create_document({'_id' : user})

        client.disconnect()

        return jsonify(status = 'success')
    else:
        return jsonify(status = 'error')


{"user":"Taro"}というデータを2回送信したところ、1回目は登録され、2回目にエラーが発生しました。


requests.exceptions.HTTPError: 409 Client Error: Conflict conflict Document update conflict. for url:https://.....


デバッグ用コードを入れ、いろいろ試してみたところ、どうも存在チェックが正常に動作していないようです。
存在チェック前に全データを出力する処理を入れるとなぜだかうまくいきました。


@app.route('/api/adduser', methods = ['POST'])
def AddUser():

    if request.is_json:
        if 'user' not in request.json:
            user = ''
        else:
            user = str(request.json['user'])

        client = Cloudant('d.....', 'a.....', url='https://d.....')
        client.connect()

        my_database = client['users']

        #########################################
        # usersの全データを出力
        for doc in my_database:
            print(doc)
        #########################################

        if user not in my_database:
            my_database.create_document({'_id' : user})

        client.disconnect()

        return jsonify(status = 'success')
    else:
        return jsonify(status = 'error')


使用したpython-cloudantのバージョンは2.3.1でした。
どうやらpython-cloudantのバグのようで、少なくとも2.9.0ではこの問題は修正されていました。

またいつか、どこかで。

2018年9月14日金曜日

IBM Cloud上でCloudantを使ってみた!(中編)

前回はCloudantサービスとデータベースを作成しました。
今回は、ローカルからデータを登録・取得します。

Cloudantデータベースにアクセスするには、ライブラリをインストールする必要があります。
私の環境はWindowsですので、下記のコマンドを実行してインストールしました。


> py -m pip install cloudant



接続するには、ユーザー名、パスワード、URLが必要です。
「資格情報の表示」から確認しておきましょう。

















python-cloudantのドキュメントページには、データベースオープン、ドキュメント作成などのソースが載っています。
それらを参考に、「引数で指定されたユーザーが存在しなければ登録する」というコードを作成しました。


from cloudant.client import Cloudant
import sys

user = sys.argv[1]

client = Cloudant('d.....', 'a.....', url = 'https://d.....')
client.connect()

database = client['users']
if user not in database:
    database.create_document({'_id' : user})

for document in database:
    print(document)

client.disconnect()


実行してみます。


> py cloudantsample.py Taro
{'_id': 'Taro', '_rev': '1-.....'}

> py cloudantsample.py Hanako
{'_id': 'Hanako', '_rev': '1-.....'}
{'_id': 'Taro', '_rev': '1-.....'}

> py cloudantsample.py Taro
{'_id': 'Hanako', '_rev': '1-.....'}
{'_id': 'Taro', '_rev': '1-.....'}



ダッシュボードで確認すると、データが追加されています。











次回はクラウド上でデータ登録・取得してみます。

またいつか、どこかで。

2018年9月7日金曜日

IBM Cloud上でCloudantを使ってみた!(前編)

IBM Cloud上でCloudantを使用して、データを登録・取得してみました。
その方法をメモ。

まず、Cloudantサービスを作成します。
「データベース」の中から「Cloudant」を選択し、サービスを作成します。
サービス作成後、アプリケーションに接続しておきます。

次に、データベースを作成します。
Cloudantのダッシュボードを開きます。

データベース名を入力します。
今回は「users」というデータベースを作成します。














データベースが作成されました。














データの登録・取得は次回。

またいつか、どこかで。

2018年7月20日金曜日

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

前回、JSONデータをやり取りするWeb APIを作成しましたが、{"user":"太郎"}のように日本語を指定するとエラーが発生します。
ログを確認すると、


user = str(request.json['user'])
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)


というエラーが出力されていました。

ググってみると「str文字列」だの「unicode文字列」だの・・・
ん?それってPython2の話ですよね?

もしやと思い、Pythonのバージョンを出力して確認してみると、やはりPython2.x系でした。


import sys
print('{}.{}.{}'.format(sys.version_info.major, sys.version_info.minor, sys.version_info.micro))


> 2.7.13


runtime.txtというファイルを新しく作成し、そこに

python-3.6.2

と記述してバージョンアップすると、エラーなく日本語も扱えるようになりました。

またいつか、どこかで。

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年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を常に表示する対応方法についてです。


ではまた~。

2018年5月25日金曜日

IBM CloudのNoSQL DBを使ってみよう ~第2章~(Androidアプリの変更内容)

どうも、もりもりです。 

今回は、前回 紹介しましたAndroidアプリの変更内容についてです。

変更前と変更後の挙動


<変更前>
 ・Todoの完了/未完了の制御方法
   各アイテムの左に表示されたチェックボックスで制御する。
    完了時 :チェックON
    未完了時:チェックOFF
 ・アイテムタップ時
   ToolBarを表示、右上に「削除」メニューを表示する。
 ・削除ボタンクリック:
   選択中のアイテムを削除する。

<変更後>
 ・ToolBar(旧ActionBar)を常に表示
   メニューボタンがない端末でも使えるように、メニューを常に表示する。
 ・ListViewの背景色を黒の透過に変更
 ・Todoの完了/未完了の制御方法
   各アイテムをタップ
    完了時 :取消線を入れ、文字色を黒にする
    未完了時:取消線を消し、文字色を白にする
   ※各アイテムの左にあるチェックボックスを削除
 ・メイン画面の右下に追加ボタンを追加
   ToolBarのMenuから新規追加も可。
 ・リストアイテムの右端に編集ボタン、削除ボタンを追加

画面キャプチャ


メイン画面 メニュー 新規追加ダイアログ
編集ダイアログ  設定画面

アプリの設定


IBM Cloudと通信するためにAndroidアプリの設定をします。

前回の「CloudantNoSQL DBサービスの作成」の「5」で記載したサービスの資格情報と「7」で作成したDB名を設定します。

<設定>
設定項目 設定値
Cloudant user name 資格情報のusername
Cloudant db name DB名
API Key 資格情報のusername(Cloudant user nameと同じ)
API Password 資格情報のpassword

※初めは「API Key」に何入れんねん。。。と思ってたのですが、ソースコードを見ているとURIを生成しているところで
 資格情報のusernameとなっていました。
 ただし、読み取り専用など制限したい場合は「API Key」と「API Password」に別の設定値を入力することで可能です。
 この設定方法は次回でしたいと思います。

AndroidとクラウドDBの同期


設定が終われば、早速タスクを追加してアップロード(PUSH)してみます。

PCのブラウザからDBを見てみましょう。


ちゃんと同期できていました。

次回予告


次回 は、「アプリの設定」で説明しましたDBの権限設定についてです。


ではまた~。


2018年5月18日金曜日

IBM CloudのNoSQL DBを使ってみよう ~第1章~(まずは準備)

どうも、もりもりです。

今回はIBM CloudのCloudant NoSQL DBサービスを使ってみました。
IBM提供のAndroid用のクライアント・ライブラリのソースがあり、
その中にAndroidアプリのサンプルソース(Todo同期アプリ)があります。
そのサンプルアプリを改変をしつつ、試したことを書き残していきます。

章立て


・~第1章~(まずは準備)
~第2章~(Androidアプリの変更内容)
~第3章~(Cloudant NoSQL DBの権限設定)
~第4章~(Android:ToolBarの常時表示方法)
~第5章~(Android:テキストに取消線を入れる)
~第6章~(Android:ListViewにボタン追加でListItemのClickイベントが効かない)

※変更する可能性もあります

アプリの概要


Android端末に保存されたデータと、クラウド上にあるIBM CloudのDBサービスのデータを同期します。
Androidアプリは端末ローカル上にデータを保存するため、ネットワーク環境がなくても使用できます。
ネットワークに接続できる環境で、クラウド上にあるDBサービスに用意したテーブルと同期できます。
そのため複数端末からいつでもどこでも最新のTodoを確認、編集できます。
今回のクライアント対象はAndroidアプリのみですが、iOSアプリやPC上で動作するアプリも作成可能です。


事前に必要なもの


・IBMアカウント(ライト・アカウントでOK)
・Android開発のある程度の知識
・Android開発環境
  ・Windows 10
  ・Android Studio : 3.1.1
  ・Gradle Version : 4.4
・Androidのサンプルソース

Androidのサンプルソース


Androidのクライアント・ライブラリは下記で確認できます。

Androidアプリのサンプルソース(Todo同期アプリ)は上記Gitの「sync-android/sample/todo-sync/」にあります。

サンプルアプリの機能
・Todoの追加(端末ローカルに保存)
・Todoの削除(端末ローカルから削除)
・クラウド上のNoSQL DBと同期(Upload&Download)

CloudantNoSQL DBサービスの作成


1.リソースを作成
  ダッシュボード右上の「リソースの作成」をクリックする。



2.サービスの選択
  カテゴリ「データ&分析」の「Cloudant NoSQL DB」を選択する。



3.サービスの作成
  サービス名を入力して「作成」をクリックする。



  作成をクリックすると作成したサービスのトップ画面が表示されます。



4.サービス資格情報の追加
  メニュー「サービス資格情報」を選択し、「新規資格情報」をクリックする。
  ※のちにAndroidアプリからアクセスするための資格情報です。



  名前を入力して「追加」をクリックする。

5.サービス資格情報の確認
  追加された資格情報の「アクション」列の「資格情報の表示」を選択する。
  ※Androidアプリで設定する項目は「username, password」です。



6.DB画面の表示
  「LAUNCH」をクリックする。



7.DBを作成
  メニュー「DBアイコン」をクリックし、右上の「Create Database」をクリックする。
  DB名を入力し、「Create」をクリックする。



8.DBの確認
  メニュー「DBアイコン」をクリックする。
  todoappが作成されました。



以上で、DBの準備は終わりです。

次回予告


次回 は、このサンプルアプリの変更内容についてです。


ではまた~。