技術者ブログ – OutSystems Data Gridにおける列自動生成

技術者ブログとして日ごろ取り組んでいる学習内容をご紹介します。今回は、OutSystems Data Gridにおける列自動生成について説明します。

  • OutSystems Data Gridは、OutSystemsのプログラムの中で表示・操作できる、Excelのようなグリッドになります。
  • 本記事は、OutSystems Data Gridについての知識を前提とします。

問題設定

例えば、以下のようなグリッドがあるとします。

通常の作成方法は、以下になると思います。

  1. 表示するデータを、グリッドの構造に合わせたStructureに設定して、リスト化して、ArrangeDataでJSONの変換して、結果のJSONをグリッドのデータとして設定する
  2. グリッドに、表示する列の件数分、列ウィジェットを配置して、それぞれのヘッダ、列幅、表示条件などを設定する

上記のような、列が6件のグリッドの場合、さほど難しくないと思いますが、表示したい列の数が可変の場合、作成が難しくなります。

表示できる最大数を決定して、「1.」のStructureの項目数と、「2.」の列ウィジェットは、それぞれ、その最大数の件数分を用意しなければなりません。そして、各列の表示条件を、表示したい個数に合わせて制御しなければなりません。結果として、最大数の件数分の列が存在しているが、表示した件数分のみが見えています。

特に「2.」については、グリッドの仕様が少しでも複雑(重複ヘッダで、その文言が動的など)でしたら、必要な作業量が著しく増えていきます。

決定した最大数が、例えば100件ぐらいでしたら、多少時間がかかりますが、できなくはない程度になると思いますが、以前、最大数が1500件近くになる場合に直面したことがあります。その際に、グリッドの列をJavaScriptで生成できないか、調べてみました。

自動生成の結果、上記の通常の作成方法の「1.」は、そのまま実施しなければなりませんが、「2.」の方が、簡単になります。

前提

以下のようなグリッドでは、赤枠の列を自動生成の対象します。(左3列は、通常通り配置した列となります。自動生成の列は、右となります。)

自動生成の列のセルを編集不可とします。グリッドの列順を変更不可とします。

グリッドで表示するデータは、取得済みで、上記の①のようにグリッドに設定します。

ヘッダの文言(「グループ1」、「データX」、「名名名」など)を可変として、取得済みで、JavaScriptにインプットできる形で持っています。(実装例のJavaScriptコードの中で、このようなインプット部分を太文字にします。)

実装のJavaScriptで、dataGridという変数を使います。dataGridは、以下のように取得できます。(gridIdは、設定したグリッドのIdとします。)

var dataGrid = OutSystems.GridAPI.GridManager.GetGridById('gridId').provider;

事前調査

以下のリンクで、dataGridのcolumnsに列をpushできることが分かりました。

https://www.outsystems.com/forums/discussion/80001/outsystems-data-grid-is-is-possible-to-add-columns-dynamically-on-datagrid/

dataGridを細かく調査すれば、columnsの他に、columnGroupsもあると分かって、columnGroupsに対するpushで、グループ化された重複ヘッダの列群を作成できるのではないかと考えました。

実装の流れ

データ取得後のOn After Fetchアクションで、以下のように実装していきます。

「グループ1」の最初の列

// pushする要素を作成
var newColGroup = new wijmo.grid.ColumnGroup (
	{header: 'グループ1', align: 'left', columns: [
		{header: 'データX', align: 'left', columns: [
			{header: '', binding: 'Data1', width: 100, align: 'left', isReadOnly: true}
		]}
	]}
)

// newColGroupをcolumnGroupsにpush
dataGrid.columnGroups.push(newColGroup);

「グループ1」の二つ目の列

// pushする要素を作成
var newColGroup = new wijmo.grid.ColumnGroup (
	{header: 'データ1', align: 'left', columns: [
		{header: '名名', binding: 'Data2', width: 100, align: 'left', isReadOnly: true}
	]}
)

// newColGroupを対象のcolumnGroupsのcolumnsにpush
// columnGroups[3]は、作成した「グループ1」はcolumnGroupsの中でインデックス3のため
dataGrid.columnGroups[3].columns.push(newColGroup);

「グループ2」の列

// pushする要素を作成
var newColGroup = new wijmo.grid.ColumnGroup (
	{header: 'グループ2', align: 'left', columns: [
		{header: 'データV', align: 'left', columns: [
			{header: '名名名', binding: 'Data3', width: 100, align: 'left', isReadOnly: true}
		]}
	]}
)

// newColGroupをcolumnGroupsにpush
dataGrid.columnGroups.push(newColGroup);

上記のように、グループ化された、重複ヘッダの列を1つずつ作成していきます。newColGroupの構造、push先のところを適宜調整すれば、異なる構造の列群を作成できると思われます。

追加対応

列自動生成にあたり、以下の2点を留意しなければなりません。

  • 変数dataGridは、グリッドをJavaScriptオブジェクトとして取得したものになります。データ取得後のOn After Fetchアクションが実行される時点で、グリッドが存在しなければなりません。一つの対応方法として、データ取得アクションのタイミングをOnly on Demandに設定して、OnReadyアクションで実行することができます。
  • グリッドに、セルが編集可能な列がある場合、セル編集後、行全体に対して実施されるセル編集有無チェックは、自動生成列のセルをチェックしようとしたら、エラーとなります。(本記事で例として使ったグリッドでは、「設定」列が編集可能とします。)

対応するには、グリッドのOnInitializeアクションのJavaScriptで、以下のように編集有無チェックを調整します。

// 通常のセル編集有無チェック
var originalCheck = OutSystems.GridAPI.GridManager.GetGridById('gridId').features.dirtyMark._isDirtyCell;

// チェックを調整
// 自動生成列のセルを、即座に編集なしとする
// 列インデックス3以上は、自動生成の列のため、「columnIndex > 2」で制御
var newCheck = function (rowIndex, columnIndex) {
	if (columnIndex > 2) {
		return false;
	} else {
		var checkResult = originalCheck.call(this, rowIndex, columnIndex);
		return checkResult;
	}
}

// 調整したチェックをグリッドに設定
OutSystems.GridAPI.GridManager.GetGridById('gridId').features.dirtyMark._isDirtyCell = newCheck;

次回の技術者ブログをお楽しみに。

技術者ブログ – Gitの基礎

技術者ブログとして日ごろ取り組んでいる学習内容をご紹介します。
最近、Gitに触れる機会がありましたので、今回は、その基礎について説明します。

ちなみに、外付けHDDなどで同じファイルの複数バージョンを保存し、以下のようにファイル名によって管理していることがありますか。

あるファイルの複数バージョン。「F」は「ファイナル」を意味して、あればあるほど「ファイナル性」が高くなります。

個人のファイルでしたら、これで十分かもしれませんが、大規模のプロジェクトのソースコードの場合では、より精密な管理が必要になります。そこで、Gitが登場します。

Gitとは

Gitは、バージョン管理システム(version control system、「VCS」)です。その役割は、ファイルの変更履歴を追跡し、管理することになります。そして、追跡によって、管理されているファイルを過去の特定の時点の状態に戻すことと、変更内容を比較・統合することができます。

特に、複数人が関わるプロジェクトでは、Gitを使うと、どのファイルがいつ、誰によって、どのように変更されたかを可視化して、不意な上書きや意図しない変更を防止することができます。

リポジトリとは

Gitによって管理されているファイルは、リポジトリに保存されています。リポジトリの種類を大きく分けると、「ローカル」と「リモート」があります。ファイルを保存する時、変更点がどのリポジトリに対して適応されるか、意識する必要があります。

Gitは「分散型」のVCSのため、開発者が自分のローカルリポジトリで完全な履歴を持つことができます。オフラインの状態でも、ファイルの編集や履歴の確認などが可能です。

リモートリポジトリは、GitHub、GitLabやBitbucketなどのプロバイダーによって提供されています。(もちろん、自分で作成し、運用することも可能です。)ファイルの保存先が「オンライン」のため、チームで作業を共有したり、協力したりすることが簡単になります。

リポジトリの種類

ブランチとは

例えば、新しい機能を実装する時、あるいは既存のソースに影響範囲が分からない変更を加える時、プロジェクトのソースをその場で更新することが危険です。このような場合には、独立している「ブランチ」を作成し、プロジェクト全体に影響を与えない場所で、新しい機能・変更の動作を確認できます。

新機能、修正の開発が完了し、動作確認で問題が生じなければ、ブランチの内容をメインに統合することで、変更を正式に反映させることができます。

ブランチによる分岐と結合

次回の技術者ブログをお楽しみに。

レクリエーション「東山動植物園に行きました!」

ダンデライオンズでは社員同士の親睦を深めるための「レクリエーション」を定期的に開催しています!

第3ユニットの「じょーじ」です。本ブログですでに紹介されたように、ダンデライオンズは、東山動植物園の若きライオン「レグルス」のスポンサーになりました。「レグルス」(のみならずの動物たち)をみんなで見にいくために、第3ユニットが今回開催したレクリエーションは、東山動植物園への訪問になりました。

開催日が10月19日の土曜日に決まってから、天気予報を見ていました。残念なことに、当日は天気に恵まれず、雨が降って、10月とは思えないほど暑くて湿気の多い日でした。ただし、傘をさして歩いていても、動植物園を十分に楽しめました。

そして、動植物園を見て回ることをもっと面白くするために、動物探しゲームも開催しました。特定の動物を発見して、写真を撮って提出すると、そのレア度(発見の難易度)に応じてポイントをもらうシステムでした。レクリエーションの参加者が4つのチームに分かれて、動物を探していました。

コモドオオトカゲ(日本では、東山動植物園でしか見られないようです。)
エメラルドツリーボアの発見
「レグルス」の前

(ちなみに、動植物園に行く前に、近くのレストランで、みんなで昼ご飯を食べました。)

次のレクリエーションの紹介をお楽しみに!

技術者ブログ – UTMの強化設定

技術者ブログとして日ごろ取り組んでいる学習内容をご紹介します。
今回はインフラをテーマにしている第3ユニットです。

第3ユニットは、ダンデライオンズの社内ネットワークを管理しています。そのセキュリティを強化するために、FortiGateというUTM機器を導入しています。「UTM」は、「Unified Threat Management」の略であり、「統合脅威管理」という意味になります。つまり、一つの機器を以て、ネットワークセキュリティ全般を管理できます。

今回の技術者ブログでは、FortiGateの三つの機能を紹介します。

① Eメールフィルタ

スパム対策として、FortiGateが、受信するメールの内容を確認して、スパムの疑いがあると検知されたメールの件名に任意のタグを追加できます。

[Spam]というタグを追加しています。

② 侵入防止

プログラムの脆弱性、ボットネットとその他の侵入を防止する機能です。「その他の侵入」は、例えば、サーバーの認証系ファイルをアクセスしようとすることになります。

Linuxサーバーの認証系ファイルへのアクセスを防止します。

③ アプリケーションコントロール

特定のアプリケーション(プログラム)を使用不可に設定できる機能であると思いきや、個別に実行可能なプログラムにとどまらず、ウェブサイトの使用も制限できます。

YouTube(ウェブサイト)の使用を細かく制限できます。

次回の技術者ブログをお楽しみに。

レクリエーション「BBQ&運動」

ダンデライオンズでは社員同士の親睦を深めるための「レクリエーション」を定期的に開催しています!

第3ユニットの「じょーじ」です。今回の記事では、だんだん寒くなりつつあるこの季節から暖かくて眩しい真夏に戻り、第3ユニット主催のレクリエーションを紹介したいと思います。夏なので外で遊べると考え、2023年7月28日に所内緑地公園に集まり、BBQと運動を楽しみました。ちなみに、今回のイベントのメイン担当は、第3ユニットの「クロマ」でした。

BBQは、「BBQ CANVAS 庄内緑地」さんにお世話になり、BBQ用のサイト、機材と食料を準備していただき、追加食料と遊び道具だけを持ち込みました。皆でおいしいお肉と野菜を焼き、食べるのは、とても楽しかったです!ところで、「飲みニケーション」という単語を最近知りましたが、今回のような「食べニケーション」でも十分に親睦を深められると思いました。(お酒もちょっと飲みましたが。)

サイトの様子
お肉BBQ

運動は、さまざまな遊びでした。例えば、「だるまさんがころんだ」をやったり、ボールで遊んだりしていました。そして、夏らしい遊びとして、スイカ割りもしました。(個人的には、「ああ、日本の夏だ!」と感じました。)

スイカ割り
見事に割った!

BBQが終わった後、サイトを片付け、所内緑地公園の芝生広場に移動し、ドッジボールなどをしました。

ドッジボール開始直前

数か月後の今に振り返っても、とても楽しいイベントでした。そして、主催した第3ユニットのメンバーとして、天気が晴れ、大きな問題がなかったことを、本当に良かったと思います。

ダンデライオンズのイベントがこれで最後ではないので、次回の紹介をお楽しみに!

社員紹介(26‐2)

ご閲覧いただきありがとうございます。2度目の社員紹介記事を担当いたします、第3ユニット所属の「じょーじ」です。チェコ出身です。

現在の活動

私の最初の社員紹介からもう1年間以上経っているのは、なかなか信じがたいです。昨年の7月にプロジェクトに入り、データベース関連の作業をしていましたが、11月から現在までは、ローコード開発環境のOutsystemsで開発を行っています。もちろん、ローコードとはいえ、プログラムの動きやデータの流れを把握する必要があり、カスタムな処理を実装する際にJavaScriptのコードを書くことがあります。

趣味

前回は、散歩の面白さについて書きましたが、今回はゲームについて紹介したいと思います。

最近は、話題作になっている「ゼルダの伝説 ティアーズオブザキングダム」をプレイしています。自由度の極めて高いアクションアドベンチャーゲームであり、プレイヤーがゲームの世界を好きなように探索し、コンテンツを攻略していけます。ちなみに、一度攻略したコンテンツは、いつでも瞬間移動可能なスポットになります。結果として、しばらくプレイしたら、ゲームの世界を覆う瞬間移動スポットの網ができます。

ところが、私の好みのプレイスタイルは、瞬間移動機能をできるだけ使わないで、馬に乗って世界を旅することです。旅の途中、出遭った敵を倒したり、洞窟を探索したり、新しいクエストを発見したりしますので、強い「冒険感」を味わえます。そしてその「冒険感」こそが「ティアーズオブザキングダム」の醍醐味なのではないかと思います。

次回の社員紹介をお楽しみに!

愛馬の「ソーダちゃん」です。
「旅人の手綱」と「旅人のくら」をつけています。

技術者ブログ:Oracle Databaseのアップグレード

技術者ブログとして日ごろ取り組んでいる学習内容をご紹介します。

インフラをテーマにしている第3ユニットです。

今回は、Oracle Databaseのアップグレードについて

あるシステムの全面的な更新の一環として、Oracle Databaseのアップグレードを担当しました。具体的には、古くなった12cのデータベースからメタデータ(表を始めとした、DB上のオブジェクトの定義)と行データ(各表で登録されている項目)をエクスポートして、同じ状態の19cのデータベースを作成することになりました。

開発環境が用意されていたため、新しいDBの構築は複数回リハーサルできましたが、12cのDBからのエクスポートは、DBに余計な影響を与えないために、回数を抑えることにしました。

そのため、一回エクスポートしたら、何回も使えるDMPファイルを出力するOracle Data Pump(データポンプ)というツールを使いました。

作業の流れ

各ステップを個別の監視できるために、アップグレードを以下のような流れで行いました。

  • データポンプで12cのDBからメタデータと行データをエクスポート
  • 12cの設定を確認しながら、同じ設定の19cの空っぽのDBを作成
  • 19cのDBにエクスポートしたメタデータと行データをインポート
  • 19cのDBの全体的な確認

上記の流れで、アップグレードできましたが、リハーサルの中で幾つかの問題に遭遇して、解決・回避の方法を調査することになりました。その問題を一つ、以下に紹介したいと思います。

シークエンス問題とその回避

データベースに登録される行の自動採番を使う表がある場合、そのシークエンス(順序)の状態(次に割り振られる番号)をそのまま継続する必要があります。そうしないと、データベースが同じ番号を再び割り振ろうとして、エラーが生じる恐れがあります。

自動採番を使う表の存在を、SQL Developerなどで確認できます。表作成のSQLを参照すると、「GENERATED ALWAYS/ BY DEFAULT AS IDENTITY」という定義が見られます。

自動採番が設定されているテーブル 
引用:https://stackoverflow.com/questions/49239177/sequences-vs-identity-columns-in-oracle

新しいDBへインポートする際に、メタデータと行データを同時にインポートすると、シークエンスが自動的に継続されますが、メタデータと行データを別々にインポートすれば、シークエンスが「1」からリスタートされて、手動で調整しなければならなくなります。

そのために、メタデータと行データの同時インポートをお勧めします。

次回の技術者ブログもお楽しみに。

社内勉強会 – SNS映えする写真加工術

前回の勉強会の様子

勉強会-ビジネス日本語研修

今回の勉強会記事を担当する第3ユニットの「じょーじ」です。入社してから参加させていただきました初めての勉強会では、SNSに投稿する写真の加工について学びました。

1. ディズニー加工

土日の穏やかな散歩、連休の遠くへの旅行、毎日の帰り道。目の前に広がる驚きの一瞬。思わず写真に収めて人に見せたくなります。しかし、天気が撮影に協力してくれない日もありますね。そういう時にこそ、「ディズニー加工」で、アッピールアップ!

iPhoneの写真編集機能を使って、好みの一枚を以下の設定で加工をすると、肉眼で見るよりも鮮やかで華やかな写真になります。いわゆるディズニー加工というSNS映えする加工方法です。

  • ブリリアンス  100
  • ハイライト   10
  • シャドウ    10
  • 彩度      50
  • 自然な彩度   50
  • シャープネス  25
  • 精細度     25
元の写真
ディズニー加工後

2. 簡単に別人へ

自分自身をもっと輝かせたい時には、携帯電話の機能だけではなく、「B621」や「ibis Paint X」などのフリーアプリも使えます。些細な変更から、大きなイメチェンまでできます。そしてイメチェンの先には…

加工する写真選び

まずは、「B612」の肌補正機能を使ってスムーズ化して、タッチ補正で顔のサイズや形を整えます。次に、「ibis Paint X」で細かいブラッシュアップをします。そして、iPhoneの写真編集機能でカラーバランスなどを変更します。すると…

元の写真
美人の誕生?!

個人的に一番驚いたのは、AIによる顔認証の精度です。例えば、「B612」で鼻のサイズを変更しようと思えば、写真の中で鼻をタップして、その輪郭をなぞるなどの操作がまったく必要ではありません。アプリが鼻を自動的に特定して、自然に変更していきます。

このような高度なツールがあれば、誰でもSNSアーティストになれると思います。

次回の勉強会の記事をお楽しみに!

社員紹介(26)

初めまして、4月にダンデライオンズに入社した「じょーじ」です。チェコ出身です。

経歴

高校の頃は理系メインでしたが、大学の専攻は、日本語にしました。卒業後、修士課程に進学し、その一環として一年間東京に留学していました。その経験のおかげで将来的には日本に住み、働きたいと思うようになりました。

その後、日本の大学で研究生を経、文系の博士課程に入学しました。今年の3月を以て中退し、ダンデライオンズに入社しました。日本では「Uターン」が有名だと思いますが、私が「理ターン」をしました。

現在の活動

入社したばかりのため、研修中です。4月と5月は、ビジネスマナーなどのソフトスキル、ウェブデザインと、Javaを始めとしたさまざまなプログラミング言語の基本を学びました。

6月は、身につけたスキルを活かし、データベース管理用のウェブアプリケーションを作成しています。

趣味

主な趣味は、散歩とゲームですが、今回は散歩について紹介させていただきます。日本は合わせて6年目ですが、人口200人ぐらいの村で育ってきた私にとっては、今もなおとても斬新に見えています。

仕事帰り中、よく久屋大通公園を通り、街のありふれた風景を楽しんでいます。そして週末は、矢場町駅や栄駅付近をのんびりと散歩しています。地味に聞こえるかもしれませんが、綺麗な緑やおしゃれな喫茶店などの思わぬ発見が多くあります。

栄駅の近くにあるオアシス21というスペースです。地下にイベント会場やお店があります。
久屋大通公園の風景です。爽やかな緑とモダンなビルが立ち並ぶのは、とても「日本的」だと思います。

次回の社員紹介をお楽しみに!