Linux のsyslogをPostgreSQLに書き込む方法

LinuxのsyslogをPostgreSQLに書き込む方法はいくつかの手段がありますが、以下に2つの方法を紹介します。

  1. rsyslogを使用する方法:

rsyslogは、Linuxシステムで一般的に使用されるログ管理ツールであり、syslogからログを収集し、指定されたデータベースに書き込むことができます。PostgreSQLにログを書き込むためには、rsyslogを設定してPostgreSQLにログを転送する必要があります。

まず、rsyslogをインストールします(Ubuntuを使用している場合の例):

sudo apt update
sudo apt install rsyslog

次に、rsyslogの設定ファイルを編集します。

sudo vi /etc/rsyslog.conf

ファイルの末尾に以下の行を追加して、syslogのログをPostgreSQLに書き込む設定を行います。

$template db_template,"INSERT INTO your_table_name (column1, column2) VALUES ('%msg%', '%fromhost-ip%')"

if $programname == 'your_program_name' then :ompgsql:localhost,dbname=your_db_name,user=your_db_user,password=your_db_password;db_template
& stop

your_table_namecolumn1column2などは、PostgreSQLに対応するテーブルとカラム名に置き換えてください。また、your_program_nameにはログを書き込む対象のプログラム名を指定します。

設定を保存したら、rsyslogを再起動します。

sudo service rsyslog restart

これで、rsyslogが設定した条件に合致するログをPostgreSQLに書き込むことができます。

  1. log_fdwを使用する方法:

もう一つの方法は、PostgreSQLの外部データウェブ(Foreign Data Wrapper)機能を使ってsyslogのログファイルを直接PostgreSQLに取り込む方法です。

まず、PostgreSQLにログファイルを格納するための外部スキーマを作成します。

CREATE SCHEMA syslog_fdw;

次に、log_fdw拡張機能をインストールします。

CREATE EXTENSION file_fdw;

外部データウェブを作成して、syslogのログファイルを取り込みます。

CREATE SERVER syslog_fdw_server
FOREIGN DATA WRAPPER file_fdw;

CREATE FOREIGN TABLE syslog_logs (
    log_line text
) SERVER syslog_fdw_server
OPTIONS (filename '/var/log/syslog', format 'csv', delimiter E'\n');

この例では、syslogのログファイルが/var/log/syslogにあると仮定していますが、適切なパスに置き換えてください。

これでsyslog_logsテーブルにsyslogのログが格納されるようになります。必要に応じて、ログファイルの解析やカラムの追加などのカスタマイズが可能です。

どちらの方法を選択するかは、システムの要件やセキュリティ要件に応じて異なります。rsyslogを使用する方法は簡単に設定できますが、syslogのログを直接PostgreSQLに取り込む方法も柔軟で強力です。

【Android】java.lang.IllegalStateException: Room cannot verify the data integrity. 解消方法

問題

実行したときのlogcatで以下のログが出力される。

java.lang.IllegalStateException: Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. You can simply fix this by increasing the version number.

原因

既にインストール済みのアプリと、実行しようとしているアプリでRoomのスキームが異なるのに、バージョンが同じだと、怒られている。

対策

以下のどちらかを実施する。開発途中であるため、

  • 既にインストールされているアプリをアンインストールする。
  • データベースのバージョン番号をインクリメントして、マイグレーションのコードを書く。

【Android】ViewModelの使い方

ViewModel

ViewModelの特徴

  • UI コントローラの肥大化を防ぐ
    アクティビティやフラグメント(総称してUI コントローラ)は、UI表示、ユーザ操作の受取、権限などのOSとのやり取りを行う責務があります。それに加えて、データベースやネットワークからデータを取得するようなことをすると、UI コントローラは肥大化し、保守が難しくなります。これを防ぐためには、UI コントローラは本来やるべきことに注力して、データの保持、データの取得、UI コントローラが使いやすいデータに変換するロジックなどはViewModelに持っていくことが望ましいでしょう。

  • テストをやりやすくする
    UI コントローラは、UIやOSと緊密に連携しているため、それ単独でテストすることが困難です。このようなしがらみのないViewModelを対象とした試験とすることで、比較的簡単に試験を作成することができます。

  • データを保持する
    システムがUIコントローラを破棄すると、UIコントローラが保持しているデータは全て消されます。UIの構成が変化する度に、データを取得しなおしていると、処理コストがかかります。よって、UIコントローラより生存区間の長いViewModelにデータを持たせることによって、効率よくデータの管理が可能となります。

  • フラグメント間のデータ共有
    リスト上のアイテムを選択して、選択した内容を表示するような場合を考えてみると、リストのフラグメントと内容を表示するフラグメントで、どのアイテムを選択したかを共有する必要があります。その時に、ViewModelを使用します。

  • ローダーの置き換え ローダー(CursorLoaderなど)とは、UIとデータベース間でデータを同期する仕組みです。RoomとLiveDataを組み合わせ使用することで、ViewModelでローダーの代わりをすることができます。

ViewModelでやってはいけないこと

  • LiveDataオブジェクトなどの監視はしてはいけない
  • ビュー、Lifecycle、またはアクティビティ コンテキストへの参照が保持されている可能性があるクラスを参照

【組み込みシステム】状態遷移設計

状態遷移

状態遷移とは、ある状態が別の状態に遷移することです。 ソフトウェアでは、変数の内容やデータの内容が事前に決まった状況のことを状態と定義したりします。

状態遷移といっても、いくつか形があり、今回はミーリ・チャートとムーア・チャートの二つについて比較してみます。

ミーリ・チャート

ミーリ・チャートは、出力が変化するときを状態として定義します。 よって、「イベント」によって状態が遷移します。

ソフトウェアの部分だけをとらえることに使用します。

ムーア・チャート

ムーア・チャートは、出力がある規定された状況であることを状態として定義します。 よって、システムの出力毎に状態を定義します。

ソフトウェアとハードウェアに分けずに、システム全体をとらえることに使用します。

ミーリとムーアのタイミングの違い

ミーリはソフトウェアの部分だけとらえます。しかし、実際にソフトウェアが制御してから、ハードウェアが出力するまでにはタイムラグが存在します。ムーアではこのタイムラグを含めたシステム全体の出力に着目するため、同じシステムを分析したとしても、ミーリと比較して少し遅れが生じます。これが、ミーリとムーアの本質的な違いです。

【Android】Roomの使い方(DaO編)

Android】Roomの使い方(エンティティ編)

前準備

Daoを作成する。

  1. Daoのinterfaceを作成する。

  2. コンビニエンス メソッドを定義する。

  3. 挿入(@Insert)、更新(@Update)、削除(@Delete)、取得クエリ(Query)のメソッドを追加する。ここは、利用者が使いやすいようなメソッドを用意すること。

package com.example.gametimemgrapp.room.dao; import androidx.room.Dao; import androidx.room.Delete; import androidx.room.Insert; import androidx.room.Query; import androidx.room.Update; import com.example.gametimemgrapp.room.entity.RremainingTime; @Dao public interface RremainingTimeDao { @Insert public void insertRemainingTime(RremainingTime time); @Update public void updateRemainingTime(RremainingTime time); @Delete public void deleteRemainingTime(); @Query("SELECT * from RremainingTime") public long[] getRemainingTime(); }

参考

developer.android.com

【Android】Roomの使い方(エンティティ編)

ROOMの使い方(エンティティ編)

前準備

  1. アプリ内でエンティティを使用するために、アプリの build.gradle ファイルに Architecture Components アーティファクトを追加する。

  2. gradleに以下を追加する。これで、@Entityや@PrimaryKey等のアノテーションが使用できるようになる。

dependencies { def room_version = "2.2.0-rc01" implementation "androidx.room:room-runtime:$room_version" }

エンティティの作成

  1. エンティティクラスを作成する。

  2. @Entityのアノテーションを記述する。その際、Android Studioガイドに従い、androidx.room.Entityをimportする。

  3. @PrimaryKeyのアノテーションを記述する。プライマリキーを示すもので、エンティティには必ず一つ必要となる。この時も、Android Studioガイドに従い、androidx.room.PrimaryKeyをimportする。

  4. 下記のエンティティの記述となった。

    package com.example.gametimemgrapp.room.entity; import androidx.room.Entity; import androidx.room.PrimaryKey; @Entity public class RremainingTime { @PrimaryKey public long time; }

参考URL

developer.android.com