今更一から勉強しよう

勉強のノート。

OutSystems

OutSystemsのロールセキュリティ

Usersに登録して管理

Usersにアクセスする方法

https://<サーバー>/Users

UI で確実にアクセスを制限できている場合でも、可能な限りビジネスロジックでロールを確認す るというのが OutSystems のベストプラクティス

ロールには、ユーザーが<ロール名>というロールを持っているかどうかを判断する Check<ロール名>Role()というアクション/機能もあります。

OutSystemsのサイトプロパティ

使い方

・Dataタブで設定 ・ServiceCenterで設定

ServiceCenterで変更する場合、再パブリッシュ不要、即反映される。

ServiceCenterへのアクセス

https://<サーバー>/ServiceCenter

OutSystemsのイメージファイル

Imagesに追加したものは以下でアクセスする

http://<サーバー>/モジュール名/img/イメージファイル名.png

ReactiveWebのイベントの発生順

・Initialize →画面初期化時 ・Ready  →DOMの読み込みが終わった時 ・Render  →AggregateのDBFetchが終わった時 ・Destroy →画面を破棄した時

Python, Flask, PostgreSQLで画面作成(2)

21/03/22

しばらく放置してしまったので、最初からやり直した。 目的はFlaskでPostgreSQLの内容を画面に表示すること。 実質4時間ほどで完成。

■ 参考URL

Flaskの簡単な使い方 - Qiita

python postgreSQLのライブラリpsycopg2の使い方メモ - Qiita

id:number
title:string
body:string
  • 準備 venvを作成しておく

  • Flask、psycopg2インストール

pip install Flask
pip install psycopg2


  • PycharmでFlaskを動作させる設定
FLASK_APP=main.py FLASK_DEBUG=1 flask run


  • PycharmでFlaskを動作させる設定
FLASK_APP=main.py FLASK_DEBUG=1 flask run


  • main.pyを作成する。
from flask import Flask, render_template
import psycopg2, psycopg2.extras

app = Flask(__name__)


def get_connection():
    # postgreSQLに接続(接続情報は環境変数、PG_XXX)
    connection = psycopg2.connect( \
        host='localhost', \
        user='flask', \
        password='flask', \
        database='flask', \
        port=int('5432'))

    # クライアントプログラムのエンコードを設定(DBの文字コードから自動変換してくれる)
    connection.set_client_encoding('utf-8')

    # select結果を辞書形式で取得するように設定
    connection.cursor_factory = psycopg2.extras.DictCursor
    return connection


@app.route('/')
def main():

    conn = get_connection()
    cur = conn.cursor()
    sql = 'SELECT * FROM entry'
    cur.execute(sql)

    # 引数ありの場合
    #sql = 'SELECT * FROM entry where id = %(target_id)s'
    #cur.execute(sql, {'target_id': (target_id,)})

    members = cur.fetchall()

    cur.close()
    conn.close()

    return render_template('dbtest.html', title='flask test', members=members)


## おまじない
if __name__ == "__main__":
    app.run(debug=True)


  • templatesフォルダを作成する。

  • templates/layout.htmlを作成する。

  • templates/dbtest.htmlを作成する。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% block content %}
<!-- ここにメインコンテンツを書く -->
{% endblock %}
</body>
</html>
{% extends "layout.html" %}
{% block content %}
<h3>DbTest</h3>
<ul>
    {% for member in members %}
    <li>{{ member.title }} : {{ member.body }}</li>
    {% endfor %}
</ul>
{% endblock %}

Python, Flask, PostgreSQLで画面作成

11/12

今日のやったこと

ノート

  • Flaskインストールコマンド
pip install Flask
  • FlaskでPostgreSQLにアクセスするにはSQLAlchemyとpsycopg2が必要
pip install flask_sqlalchemy
pip install psycopg2
  • PycharmでFlaskを動作させる設定

デバッグ構成のパラメータに以下を設定

FLASK_APP=hello.py FLASK_DEBUG=1 flask run

■参考URL

Hello World作成

Flaskの簡単な使い方 - Qiita

PostgreSQL連携

FlaskとPostgreSQLでウェブアプリを作ってHerokuで無料で運用する - Qiita

Flask-SQLAlchemy + PostgreSQLでWebサービスを作成する - Qiita

12/15~

今日のやったこと

  • ProgreSQL連携用のDBを用意
  • ProgreSQL連携の方法を読む

■参考URL

FlaskとPostgreSQLでウェブアプリを作ってHerokuで無料で運用する - Qiita SQLAlchemyの基本的な使い方 - Qiita

Androidでアプリ作成(2)

やりたいこと

開発力の向上を目的とする。

Androidアプリ作成2回目。

Google Play Storeに乗せるまでを目標とする。

画像認識にGoogle Vision APIを使うことで、 使用量で課金されるため、Play Storeには乗せられなくなった。

挑戦する技術

  • カメラで画像認識
  • Androidアプリ内にDB作成

2020/07/10

画像認識のやり方について調べる

Google Vision APIを使ったやり方がいくつか見つかる

Google Vision APIGoogle Cloud Platform(GCP)のサービスで、

GCPアカウントを作成してAPIキーを発行して使用する。

使用料で課金されるので注意が必要。1000ユニット/月まで無料。

1ユニットは1回の画像認識。

GCPアカウントの作成について

第0回 Google Cloud Platformをはじめよう! アカウント登録~画像認識APIを試してみよう|Tech Book Zone Manatee

Vision APIの使い方

第5回 もう議事録不要? 写真から手書き文字を認識するAndroidアプリを作ろう~アプリ開発編~|Tech Book Zone Manatee

前回の記事

Androidでアプリ作成(1) - 今更一から勉強しよう

やること




    
    
  

Python、Djangoでオリジナルのシステム開発(6)

今日のやること

  • 一覧のページング
  • モックの作成

一覧のページング

DjangoでページングするにはPaginateを使用する。

参考: ペジネータ (paginator) — Django v1.0 documentation

Viewに以下を追加。

from django.core.paginator import Paginator

f:id:ebi40:20200609165759p:plain

htmlにページングの参照をつける。

f:id:ebi40:20200609165922p:plain

こんな感じにできあがる。

f:id:ebi40:20200609170015p:plain

モックの作成

Djangoで作成したアプリのモック用のHTMLを作ってみる。

以下のフォルダ構成を作る。

moc
├static
└templates

staticフォルダに開発で使用したstaticフォルダをそのまま入れる。 templatesフォルダにhtmlファイルを入れる。

Djangoで表示されたHTMLは以下の手直しをする必要がある。

  • /static を../staticに置換
  • submitはhrefなどに変換
  • 画面遷移先は../templates/***.html

Androidでアプリ作成(1)

やりたいこと

開発力の向上を目的とする。

Androidアプリ作成2回目。

Google Play Storeに乗せるまでを目標とする。

挑戦する技術

  • カメラで画像認識
  • Androidアプリ内にDB作成

2020/07/01

やること

  • プロジェクト作成
  • GIT構築

以前書いた記事を参考にする。

https://blog.hatena.ne.jp/ebi40/ebi40.hatenablog.com/edit?entry=26006613448435527

プロジェクト作成

Android Studioで「start a new project」

「Buttom Navigation Activity」選択

今回はJavaで作成。

GIT構築

記述は省略。

2020/07/06

やること

  • ナビバーのボタンを設定

ナビバーのボタンを設定

fragmentについて調べる

Android はじめてのFragment - Qiita

ナビバーボタンアイコンを設定

Androidで用意されているアイコン一覧 - 技術脳塗

ナビバーボタンの設定が完了

f:id:ebi40:20200706193727p:plain

やること




    
    
  

Python、Djangoでオリジナルのシステム開発(5)

今日のやること

  • Djangoフォームで作成した画面で、編集時に特定の項目を変更不可にする
  • 一覧で削除時のモーダルウィンドウ表示

Djangoフォームで作成した画面で、編集時に特定の項目を変更不可にする

参考:Django入門|編集できないフォームフィールドに変更する方法|dot blog

forms.py(ModelForm)で初期化時にインスタンスが新規かどうか判定し、dsabled属性を追加する。

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.foodstaff_id is not None:
self.fields['foodstaff'].widget.attrs['disabled'] = 'disabled'

f:id:ebi40:20200405182106p:plain

これだけだとdisabledにした項目がPOSTされず、更新時にNot Null違反になる。
どうやらform.is_validの時点で、dsabledの値がNullになってしまうようだ。

f:id:ebi40:20200405182336p:plain

なので更新時は変数に退避しておいて、更新直前に設定するようにする。
もっとスマートなやりようはないだろうかと思うけど・・・
一応、Djangoフォームでの編集不可は実現できた。

f:id:ebi40:20200405183037p:plain

データ削除時のモーダルウィンドウ表示

参考:Modal · Bootstrap

Bootstrap公式のソースをコピペすればモーダル自体は実現できるが、各画面でこれを書くのは冗長すぎる。
viewでメッセージの内容を作ってHTMLに渡して、ベースのHTMLでモーダルの記述をメッセージ内容分ループするようにして汎用的に作る。

削除ボタンを個別から選択、一括削除に変更しようとする。

参考:一覧画面に削除機能を追加しよう — DjangoによるWebアプリケーション開発入門

<form method="post" action="{{ message.action }}">
としたいところで、逆引きURLを設定する方法がわからずにはまる。

参考:DjangoでのURL⇔view関数の正引き・逆引き - orangain flavor

やりたいことはできた・・・が、そもそも、モーダルをPOSTしたところで、
送りたいフォームはPOSTされないことに気が付いた。 送付したいFormをJavascriptで呼び出すよう細工する必要がある。

参考:【intra-mart】formタグの中で別のformを働かせる方法 | 株式会社アースリンク

f:id:ebi40:20200408222439p:plain

f:id:ebi40:20200408222514p:plain

f:id:ebi40:20200408222538p:plain

一応、できた。

後日やりたいこと

  • ボタン用フッター
  • 献立入力画面作成
  • ポップアップ選択
  • 一覧のページング
  • 賞味期限切れメール通知機能実装