BISのバージョン管理とルール定義について

はじめに

こんにちは。開発部のS.Rです。
最近は専らコーヒーにはまっています。
エスプレッソマシンまで買ってしまいました。
テレワークの生産性倍増です。

今回はintra-mart、IM-BISの期間化機能(バージョン管理)に関する、
開発時の注意事項を簡単にご紹介させていただきます。

期間化に関する注意事項

開発時、IM-BISの期間を区切る際に気を付けなければならない点とは、

「新規期間を作成すると、元の期間に設定されているルール定義が複製され、新規期間に自動設定される」ことです。

なお、ルール定義が複製される際にはランダムに振られたidが
複製されたルール定義に設定されます。

意図せずに資材が複製されることで、
資材の管理から漏れてしまう危険性があります。
期間化を行う際には十分に注意をしてくださいね。

IM-BISの期間化機能の詳細については以下の公式ドキュメントを参照ください。

document.intra-mart.jp

おわりに

私事ですが、開発も3年目に入り、intra-martのBIS開発に多少慣れてきたと思います。
細かい仕様の把握や、開発の効率を上げていき
着実にベテランへの道を進んでいきたいです。

性能試験について(試験実施編)

今回は以前の「性能試験について(性能試験とは編)」の続きで、性能試験の準備や実施方法、試験実施時の注意点などを紹介したいと思います。 gsol.hatenablog.com

事前準備

データの作成について

性能試験を実施するには、試験で使用するデータを作成する必要があります。データは以下のようなツールを使用して作成します。

業務データについてはアプリ担当者と相談して準備します。準備するデータは大きく2つの種類に分けられます。

  1. 実際の処理で使用されるデータ
    • 準備方法:負荷試験ツールを用いて実際の処理を重ねてデータを増やしていく。
  2. 負荷のために単純にデータの母数を増やしたいためのダミーデータ
    • 準備方法:プロシージャを登録して、元データをselect insertして増やしていく。

シナリオの選定について

シナリオの選定は以下のような基準で選定します。

  • 利用率の高かったり、お客様から要望のあった業務フロー
  • アクセスログ等から解析して利用率上位
  • 新機能を対象とする

AWS環境を利用する際に必要な申請

AWS環境で負荷試験をする場合は事前に申請しておく必要があります。申請は2つあります。

  1. 負荷試験を行う旨と試験の内容(予測されるピーク時のリクエスト数や利用するAZの情報、トラフィックの傾向とともに予想される最大・最少アクセスの時間等)についての申請

    • 事前申請が必要とされる負荷試験は、EC2に対して1 分を越えて継続する、1 Gbps (10 億ビット/秒) または 1 Gpps (10 億パケット/秒) を超える負荷を実施する場合で、外部からの攻撃ではなく性能試験を実施することを報告する必要があります。
    • ただし、提示されている負荷条件に達している場合に申請するものであるため、条件を満たさない場合には事前申請は不要です。
  2. ロードバランサーの暖気申請

    • 急激なトラフィック増が見込まれるため、事前にロードバランサ―を暖気(スケールアウト)させておく必要があります。
    • 負荷試験以外でもサービスイン初日であった場合にも申請されるケースがあります。
    • 代替手段としては、事前に負荷試験ツール等を使用してロードバランサ―に負荷をかけて暖気(スケールアウト)させておくという事も可能です。

試験実施

負荷試験ツール

負荷試験で使用するツールは、基本はフリーで事例が多いJmeterを使用します。Jmeterプラグインが充実しているので便利です。

Jmeter以外にも様々な製品はありますが、有償でライセンスが必要であったり使い勝手が難しいものあったりするため、比較的使いやすいJmeterを使用する事が多いです。

負荷をかける時間

負荷をかける時間は、特に決まっているわけではないのでお客様と相談の上で決めます(大体はこちらで提案します)。

数時間負荷をかけ続ける場合もあれば、20~30分間で行う場合もあります。

試験の実施時間帯

ケースバイケースでお客様や環境によって、業務終了後/夜間/休日/平日の日中の時間帯で実施したりします。

試験実施時の注意事項

  • 連携先のシステムや外部Webサービスの制限事項にも注意

    • 連携先のシステムが短時間での高負荷を禁止しており、試験が実施できないという場合もあります。
  • Jmeterで負荷をかける時の注意事項

    • Jmeterなどのシナリオは思考時間を考慮しましょう。

      • 本来ありえない負荷がかかってサーバー側がハングしてしまったりするので、思考時間を設定してリクエストによる負荷にバラつきを持たせる必要があります。
    • 負荷をかける際は徐々に負荷をかけていく時間、ピーク時間を分けましょう。

      • 急激に負荷をかけると、負荷試験ツール側/サーバー側の両方でハングしてしまって試験になりません。

        例)100ユーザで20分間の負荷試験を実施する場合

        ⇒ ①負荷をかけていく時間[5分] + ②負荷のピーク時間[15分]

           ①最初の5分間の間に実行スレッド数を増やしていく。

           ②5分間かけて100ユーザ分の負荷がかかる状態になったら、残りの15分間をピーク時間帯として計測していく。

チューニング(アプリケーション以外)

アプリケーション以外でのチューニングとしては、主に以下のような対応があります。

  • WEBサーバ
    • 帯域制限がある場合は、WEBサーバでコンテンツ圧縮対応を実施する。
  • DBサーバ
    • OracleDB内のバッファキャッシュのメモリサイズが不足して物理読み込みが多いため、メモリ割り当てサイズを上げる。
  • クラウド環境
    • 対象インスタンスでのネットワークの帯域制限に達してしまい処理遅延が発生したため、インスタンスのスケールアップを実施する(インスタンスをスケールアップする事で帯域制限の上限を上げる)。

おわりに

性能試験はチューニング及び再試験の対応を想定して、余裕を持ってスケジュールを組みましょう!

性能問題が発生した際は、チューニングや再試験が必要になります。 問題が発生する前提で、余裕を持ったスケジュールを立てて性能試験に臨みましょう。性能試験のスケジュールが遅れた場合、その遅れがプロジェクト全体の遅れにつながってしまいます。

性能試験は必ず実施しましょう!

性能試験は試験の計画に含め、必ず実施しましょう。 もし試験を実施せずに本番システム稼働を迎え、稼働後に性能問題が発覚した場合、業務に多大な影響を与えてしまうことになります。

メール送信の停止方法

今回はintra-martのAPIを使ったメール送信の停止方法について紹介します。

背景

運用テストなどでメール送信のテストを行う際には、メールを対象ユーザに送信しないようにしなければなりません。

その方法として、メールサーバを停止するなどが挙げられます。

ですがこれだと、メール送信自体は止めていないので、テストを行う際に下記のようなエラーが余計にログに出力されてしまいます。

[ERROR] j.c.i.s.m.t.a.LocalThreadTaskExecutor - [E.IWP.MESSAGEHUB.ASYNCRONOUS.00009] 非同期タスクの実行に失敗しました。

これによって、他のログが見にくくなってしまいます。

なので、このエラーを表示させないために、下記のメール送信リスナを使ってメール送信自体を止める方法をご紹介します。

MailSendListener (javadoc-all-dev 8.0.0 API)

使用方法

使用するには以下の2点の設定を行います。

  • MailSendListenerの実装クラスを作成
  • javamail-config.xmlファイルにlistenerタグを設定

MailSendListenerの実装クラスを作成

任意のパッケージ下にクラスを設定します。

package jp.co.gsol.mailsend.control;

import jp.co.intra_mart.foundation.mail.MailSenderException;
import jp.co.intra_mart.foundation.mail.javamail.listener.MailSendEvent;
import jp.co.intra_mart.foundation.mail.javamail.listener.MailSendListener;

public class MailSendControl implements MailSendListener {

    @Override
    public int onSendMail(MailSendEvent event) throws MailSenderException {
        return STOP_MAILSEND;
    }
}

今回はメール送信を停止させたいので、returnにはSTOP_MAILSENDを設定します。

ちなみにこのリスナでは戻り値をCONTINUEにすればメール送信され、また任意の処理が実行可能です。 メール件名や宛先をログ出力させることもできたりします。

詳細は上記のドキュメントを確認してみてください。

javamail-config.xmlにlistenerタグを設定

作成したクラスをjavamail-config.xmlファイルに以下のように追記します。 ドキュメントは下記を参考にしてください。

メール設定 — 設定ファイルリファレンス   第30版 2022-06-01   intra-mart Accel Platform

 <listener>
   <listener-class> jp.co.gsol.mailsend.control.MailSendControl</listener-class>
 </listener>

これで設定は完了です。

まとめ

今回はメール送信リスナを使い、メール送信自体を止める方法について紹介しました。

これを設定しておけばエラーログを出力せずに運用テストをすることができるので、気になる方はぜひ試してみてください。

性能試験について(性能試験とは編)

先日、社内会議で性能試験についての発表がありました。 発表された内容がとても分かりやすくまとまっていたため、ブログの方でも紹介したいと思います。

性能試験とは

  • 非機能要件を満たせているか確認するための試験で、以下のような項目から試験の前提条件や内容を決めます。
    • 同時接続数
      • どれくらいの負荷をかけるべきか
    • データ保持期間
      • どれくらいのデータをあらかじめ用意しておくか
    • レスポンスタイム
      • 単位時間内にどれだけ速く処理できるか
    • スループット
      • 単位時間内にどれだけの量を処理できるか
    • リソース(メモリ、CPU)使用率
      • 単位時間内にどれだけリソースを使っているか
  • 非機能要件に記載のないものについても試験に含めるようにします。評価は一般的な基準で行います。
    • 例:GCの負荷状況、ディスクI/O、ネットワーク利用状況、(クラウド環境の場合)ネットワークの帯域制限など
  • 上記から試験計画書、試験シナリオを作成し、お客様と合意をとります。

試験実施タイミングと実施期間

実施タイミング

  • 試験実施は総合テストフェーズで実施します。
    • 事前準備(試験計画など)は、前倒しで結合テスト以前から進めたりもします。

実施期間

  • 試験実施の期間はおおよそ1か月~2か月程度です。
    • チューニングや再試験を考慮して余裕をもった日程にすることが大切です。

性能試験のポイント

最後に性能試験で抑えておくべき重要なポイントをまとめます。

数年後想定での試験計画

  • 非機能要件定義書等で記載されているデータの保持期間(ワークフローの完了案件データ等)やユーザ数の増加見込み等を元にデータの積み込み件数やユーザの同時接続等を検討しましょう。

評価項目の確定

  • 試験計画書作成時に、非機能要件定義書等をベースにお客様とどこを評価対象とし、どこまでをゴールとするか確約を取っておきましょう。

試験の対象範囲

  • 試験計画書作成時に、対象となるアプリケーション(シナリオ)、サーバ台数(縮小試験込みか)、同時接続数等について工数と期間を考慮した上で、お客様と検討しましょう。

ログや各種情報の取得

  • 評価項目の他に、性能問題発生時にどこがボトルネックとなっているか切り分けが出来るように各サーバにおいてログや情報出力の内容を把握した上で取得出来るようにしておきましょう。

バックアップリストア

  • 検証環境や稼働前の本番環境での実施の他に、再試験を行う場合もあるので任意のタイミングで環境を戻せるように、バックアップ/リストアの手順の確立と動作確認した上でバックアップ取得を行っておきましょう(依頼を出すのか自分たちで対応するのかも確認は必要)。

利用するサービス及び環境の事前確認

  • 外部WEBサービス連携やクラウド環境を利用する場合、事前申請手続きが必要であったり、そもそも性能試験NG(短時間の高負荷) の場合もあるので、必ず事前に確認しておきましょう。

次回予定

  • 性能試験の実施について紹介します。

WeatherAPIを使ってintra-martの週間スケジュール画面に都道府県ごとの天気と気温を表示する

2021年度に入社したY.Kです。

今回はintra-martのCollaborationのスケジュール画面に、都道府県ごとの天気予報を表示する機能を実装しましたので紹介します。

事前準備

天気予報の取得にはWeather APIを使います。

https://openweathermap.org/api

このAPIは無料で使うことができますが、アカウントの登録が必要なのでその点は注意しましょう。

APIキーの確認方法

登録が完了すると天気予報を取得するためのAPIキーが発行されます。 このAPIキーはメニュー画面の『MyAPI keys』から確認できます。

f:id:sanok-gsol:20220307184821p:plain
WeatherAPIキーの確認画面

実装内容

APIキーを確認できたら早速実装に入りたいと思います。

都道府県選択用セレクトボックス作成

都道府県のデータは下記からjson形式で取得できます。

https://www.javadrive.jp/google-maps-javascript/data/data/pref.json

取得したデータの都道府県名を使って都道府県を選択できるセレクトボックスを作成します。

 $.ajax({
        url: 'pref_coordinate.json',
        dataType: "json",
        type: 'GET',
    })
    .done(function (data){
        //地域セレクトボックスを作成
        var prefectures = '<option class ="not-select" value="">未選択</option>';
        for (var i = 0; i < data.marker.length; i++){
            prefectures += '<option value=' + i + '>' + data.marker[i].pref + '</option>';
        }
        $('.imui-list-toolbar').append('<li><select class="weather-select" style="margin:5px">' + prefectures + '</select></li>');

日付横に天気アイコンを表示

続いて、セレクトボックスで選択された都道府県の天気を日付横にアイコンで表示させる処理を行います。 この天気アイコンを表示するために、WeatherAPIが提供するOneCallAPIを使います。

OneCallAPIドキュメント

One Call API: weather data for any geographical coordinate - OpenWeatherMap

呼び出しAPI

https://api.openweathermap.org/data/2.5/onecall?lat={lat}&lon={lon}&exclude={part}&appid={API key}

こちらのAPIで必要なデータは以下の3つです。

  • 緯度
  • 経度
  • APIキー

緯度と経度は、セレクトボックス作成時のjsonファイルに記載されていますのでそちらから取得します。APIキーは各自のマイページから確認してそちらをコピーして使いましょう。

天気アイコンにカーソルを合わせると気温が表示される

気温の表示に関してもOneCallAPIを使います。

天気予報を表示する

都道府県で取得した緯度と経度、そしてweatherAPIキーを入れて通信を行いデータを取得します。

'https://api.openweathermap.org/data/2.5/onecall?lat=' + 緯度 + '&lon=' + 経度 + '&exclude=current,minutely,houly,alerts&units=metric&appid=' + weatherAPIキー;

取得した天気予報には天気のアイコンや気温などもあるのでそちらも使って都道府県が選択されている場合にのみ日付横に天気を表示させます。

完成画面

実装をした際の完成画面です。マウスが映っていませんがマウスを天気アイコンに合わせてある状態です。

f:id:yamatotox:20210521221554p:plain
気温表示

まとめ

今回は簡易的ではありますが、天気予報をスケジュール画面に表示させる方法を紹介しました。WeatehrAPIを使えば難しい処理をせずに実装できるので、ぜひ試してみてください。

intra-martスクリプト開発APIで詰まったこと

はじめに

こんにちは。開発部のS.Rです。本年もよろしくお願いいたします。

私の今年の目標は、長らくのテレワーク生活で増えてしまった体重を元に戻すことです。

さっそくですが今回は業務中に詰まってしまったことと、その所感について述べようと思います。

発生したこと

スクリプト開発APIのFormaFileUploadItemManagerオブジェクト、registerFileTempメソッド使用でエラーが発生するが、原因が分からない。

出力されるエラーログは以下のみ。

[ERROR] FR_LOG - [E.FORMA.COMMON.00402] 引数が不正です。

原因

いろいろと調査をしていると、Java版で同等のメソッド(registerFileTemp)の引数がスクリプト版とは、少し異なっていることに気づきました(2022年3月時点)。そこでJava版と同じように、第一引数の ファイル情報(fileInfoParam)を配列にして渡したところ上手く動作しました。

ドキュメントに記載の引数の型に誤りがあったことが、今回のエラーの原因でした。

JavaAPI公式ドキュメント

https://api.intra-mart.jp/forma/apilist-forma-javadoc/doc/jp/co/intra_mart/foundation/forma/fileupload/FormaFileUploadItemManager.html#registerFileTemp-java.util.List-java.lang.String-java.lang.String-

JavaScriptAPI公式ドキュメント

https://api.intra-mart.jp/forma/apilist-forma-ssjs/doc/forma/FormaFileUploadItemManager/index.html#method-registerFileTemp_3

おわりに

今回のエラーに限らず、エラーの調査と対応では「視野を広く持つこと」を忘れないようにしたいです。

私自身の話になりますが「○○に気を付けよう」などの、自分がつまずきやすい点に応じたエラー対応時の自分ルールを複数持つことで、開発の効率が上がったと感じています。あらかじめ対応方針を決めておくことで、根拠の無い調査をして無為に時間を費やすことも少なくなりました。

自己分析を行い、「どのような対応の際に時間が掛かってしまったのか」を明らかにして開発の効率を上げていくことを、今年の目標に加えようと思います。

Amazon Transcribeを利用した文字起こしの利用

AWSでは様々なサービスがリリースされていますが、今回はその中からAmazon Transcribeに関して少し調べてみました。 Amazon Transcribeは、音声をテキストに起こすサービスです。 音声ファイルをバッチ処理してテキストを出力することもできますし、リアルタイムで音声読み取り文字起こしすることも可能です。 また、同じようなサービスとしてAmazon Transcribe Medicalというのもあり、こちらは医療関連の会話に特化したサービスとして提供されています。

音声の文字起こしサービスはいろいろな企業が提供していますが、Amazonのサービスを使う利点の一つとして、AWSの他サービスとの連携が容易な点が挙げられます。 例えばビデオチャットサービスのAmazon Chimeには、Amazon Transcribeと連携する専用のAPIが用意されており、簡単にビデオチャットの音声を文字起こしできるようになっています。 一方で注意点としては、これらの連携機能がかなり最近実装されたものであり、AWS-SDKのバージョンによってはまだ未実装でエラーになるケースがあります。 具体的には、AWS Lambdaで標準利用できるAWS-SDKのバージョンが最新より少しだけ古く、APIが実装されていないということがありました(2021/10/29現在)。 最新バージョンのAWS-SDKを別途組み込むことで解決できましたが、今後も機能追加や仕様変更などには注意する必要がありそうです。

WSL2で使うファイルの配置場所について

WSL2を使ってWindows上にLinux環境を作ることができ非常に便利ですが、注意しなければいけない仕様が色々あったりします。 今回はWSL2で使うファイルの配置場所について触れてみたいと思います。

WSL2のLinux環境とホストのWindows環境の相互ファイル参照について

WSL2では構築したLinux環境のファイルと、ホストのWindowsのファイルを相互に参照することが可能になっています。

WindowsからはLinuxのストレージがネットワークドライブとして参照できるようになっています。 ファイルエクスプローラ\\wsl$を表示すると、WLS2で構築済みの各Linux環境のストレージを見ることができます。 Linuxからは/mntの下にWindowsのCドライブなどがマウントされているので、そこから参照することができます。

異なる環境のファイルにアクセスした場合はパフォーマンスが低下する

上記のように相互に参照可能なので、Windows上とLinux上のどちらにファイルを置いても一応利用できます。 ただし、WSL2の仕組み上、異なる環境のファイルをアクセスする場合、本来の環境のファイルにアクセスするのに比べてパフォーマンスが低下するという仕様があります。 なのでLinux環境で頻繁にWindows上のファイルを参照するようにしていると、処理が重くなったりするので注意が必要です。 Linuxで使うファイルは、原則としてLinux上のファイルシステムに配置するのが妥当となります。

それらを踏まえた適切な構成は?

パフォーマンスは低下するとはいえ、前述の通り参照そのものは可能です。 なので、それを踏まえていればLinuxWindowsの両方からファイルを参照する構成も可能です。 例えばGitのGUIツールはWindowsで動かして、参照先はLinux上のファイル、のような構成も構築できます。 Gitの操作程度では多少ファイルアクセスのパフォーマンスが落ちても大きな影響はないので問題ありません。

またVisualStudioCodeなどのエディタには、WSL2用の拡張機能があります。 それを使えばLinux側のディレクトリやコンソールを開けるので、非常に便利です。

これらのパフォーマンスに関する特性や、別環境のファイルアクセス方法を把握しておくと、WSL2での開発がより良く進められると思います。

共通マスタ インポート/エクスポート ジョブ その2

はじめに

こんにちは。開発部のS.Rです。気がついたら一年の半分が過ぎていました。
今後は有意義な時間が過ごせるように、振り返りのスパンを短くしようと思っています。

今回は前回の『共通マスタ インポート/エクスポート ジョブ』の続きとなります。
共通マスタをインポート/エクスポートする際のデータファイルについて解説します。

データファイル

インポート/エクスポートする際には二種類のデータファイル形式が利用可能です。

CSV フォーマット
XML フォーマット

以下ではそれぞれの違いについてまとめます。

インポートにおける違い

CSV XML
文字コード 設定ファイル内の文字コード必須 設定ファイル内の文字コード無視(XMLファイルのヘッダで判断される)
設定ファイル エンティティの指定が必須 エンティティの指定が不要
インポートするデータファイル エンティティ単位 データ領域単位

Tips
データ領域とエンティティの関係はこちらを参照ください。

3. データ領域 — IM-共通マスタ インポート・エクスポート仕様書   第11版 2020-08-01   intra-mart Accel Platform

以下に例を出します。

データ領域 エンティティ
会社グループ 会社グループ、会社グループ内包、会社グループ所属
ユーザ ユーザ、ユーザ分類所属
通貨 通貨、通貨精度、通貨換算コード、通貨レート

エクスポートにおける違い

CSV XML
ファイルの出力単位 エンティティ エンティティ、データ領域
扱える期間情報 指定した日付上の1期間のみ 存在するすべての期間

おわりに

intra-mart初学者の方にとって、情報の"期間化"は馴染み無いものと思いますが、使いこなせばとても便利なものです。
インポート/エクスポート等、使用する際の制約や注意事項を一つずつ抑えていきましょう。

公式ドキュメント document.intra-mart.jp

intra-mart 共通マスタ インポート/エクスポート ジョブ

はじめに

こんにちは。開発部のS.Rです。 時が経つのも早いもので、4月で入社2年目になりました。 これからもどうぞよろしくお願いします!

今回は共通マスタのインポート/エクスポート ジョブを取り上げます。 初歩的な内容のみですので詳細は公式ドキュメントをご確認ください。

必要なもの

インポートに必要なものは2点

1.インポート実行の設定ファイル

2.インポートするファイル

エクスポートでは1点

1.エクスポート実行の設定ファイル

初学者には馴染みがあまり無いかと思いますが、 インポート/エクスポートどちらにも、それぞれ「設定ファイル」が必要です。 ジョブを流したら、よしなにインポートなどを行ってくれるわけではないのですね。。

設定ファイルについて

配置するパスは以下

■インポート設定ファイル: <パブリックストレージ>/im_master/config/import_config.xml

■エクスポート設定ファイル: <パブリックストレージ>/im_master/config/export_config.xml

インポート設定ファイルの例です。

<app-master-import>
   <company-group-import>
       <name>sample_import</name>
       <format>XML</format>
       <file>im_master/import/data.xml</file>
       <directory>im_master/import/data.</directory>
       <start-date>2000-01-01</start-date>
       <end-date>2999-12-31</end-date>
       <encoding>UTF-8</encoding>
       <extension-param name="replace-pattern">true</extension-param>
       <extension-param name="sub-dirs">false</extension-param>
   </company-group-import>
</app-master-import>

インポートがうまくいかない場合は上記のformatで指定されるファイルの種類がインポートの資材と合っているか、 またはファイル名や文字コードなどを確認してみるとよいかもしれません。

詳細はまた次の機会に。

公式ドキュメント

document.intra-mart.jp

AWS Serverless Application Modelの概要とローカルでの動作確認における注意点

AWSが提供しているServerless Application Modelサービスの概要と、これを使って構築したアプリケーションの動作確認時の注意点を紹介したいと思います。

AWS Serverless Application Model(SAM)とは?

AWS Serverless Application Model(以下SAM)とは、サーバレスな構成、すなわち常時稼働する固有のサーバマシンを持たないようなシステムをAWS上に構築するためのサービスです。 固有のマシンを持たないというのは、具体的にはAWS Lambdaなどのサービスを使って、処理が呼び出されたときだけ一時的にCPUやメモリを割り当てられて動作するような仕組みになります。 SAMはAPI GatewayやLambdaなどの内容を設定ファイルに記述してシステム構成を定義し、それをコマンドひとつでAWSに実際のシステムとして組み建てることができます。 これによりシステムの内容をすべてソースコードや設定ファイルに落とし込んで管理することが可能になります。 インフラをコードで定義して管理する構成はInfrastructure as Code(IaC)と呼ばれており、SAMはこれを実現するためのサービスのひとつです。

ちなみに単にAWS上のリソースをコードで管理するなら、AWS CloudFormationというサービスがSANより以前から存在します。 CloudFormationは、EC2のインスタンスなどサーバレスなリソース以外も全て管理できるサービスです。 しかしその分記述する内容が細かく、管理が煩雑になる場合があります。 SAMはCloudFormationをサーバレスなシステム向けに拡張・特化させたもので、CloudFormationより自由度が下がる分、記述が簡潔で済む利点があります。

また、SAMは限定的ですがローカル環境で動作確認を実行できるという機能もあります。 簡単なデバッグなどを行いたいときは、いちいちAWSに反映させずとも済むため便利です。

インストール

SAM CLIをインストールして、各種コマンドを利用できるようにする必要があります。 AWS公式サイトに十分説明があるので、詳細な説明は割愛します。

docs.aws.amazon.com

Windows、Max、Linuxそれぞれインストール可能です。 ただしローカルでの動作確認にはDockerが必須なので、それは別途インストールしておく必要があります。

また、AWSにデプロイするにはAWS認証情報の設定が行われている必要があります。 こちらも公式ドキュメントに手順が記載されているので、そちらを参照ください。

ローカルでの動作確認手順

以下のコマンドを実行することで、必要な初期設定やサンプルファイルを構築することができます。

sam init

こちらも詳細はチュートリアルに記載されています。

docs.aws.amazon.com

チュートリルにも記載されてますが、以下のコマンドでローカル上でアプリケーションを動作させることができます。

sam local start-api

localhost:3000にアクセスすれば、起動したアプリケーションにアクセスできます。

ローカルで動作確認する場合の注意点(落とし穴?)

チュートリアルでは使われていませんが、SAMはWebSocket用のAPI Gatewayや、DynamoDBなども定義できます。 しかし、これらはAWSにデプロイすると動作しますが、ローカルでは動作しません(2021/03/25 現在)。 そのため、これらを使う前提の処理は、ローカルでそのまま動作確認できません。 動作するのはREST APIAPI Gatewayや、Lambdaだけのようです。

DynamoDBについては別途ローカルに構築して接続させることである程度対処可能ですが、WebSocketは代わりの方法も無く難しそうです。 ローカルでもWebSocketを動作できるように機能追加する動きがあるようですが、残念ながらまだ未実装のままとなっています。 なのでこれらを使う場合、デバッグはある程度AWS上で行う必要がありそうです。 SAMのメリットを十分に行かせないのは残念ですが・・・まだ新しいサービスなので、今後のアップデートに期待したいと思います。

まとめ

AWS SAMについて概要と注意点を紹介いたしました。非常に有用ではありますが、開発時にトラブルが起きないよう、十分に検証しておく必要がありそうです。 もう少し機能が成熟してくれるとより安定して使えると思いますので、今後期待したいところです。

WSL2上でのDocker環境構築について

はじめに

Windows Subsystem Linux 2(以下WSL2)が正式リリースされてだいぶ経ちます。 簡単にLinux環境を利用できるので、とても便利です。 WindowsLinux環境を使える利点はいろいろありますが、今回はDockerをインストールして使う手順と注意点を紹介したいと思います。

WSL2のセットアップ

WSL2のインストール手順は、Microsoft公式サイトで公開されているので、それを参考にインストールしましょう。

docs.microsoft.com

ディストリビューションは任意のものを選びましょう。シェアで考えるとUbuntuあたりが無難でしょうか。 WSL2とディストリビューションをインストールしたら、起動して環境内部のセットアップに移ります。

systemdの起動構築

一般的なLinux環境では、systemd(システム管理デーモン)が起動していますが、WSL2の環境ではこれが存在していません。 そのため、Dockerをインストールしてもサービスが動作しません。 これを解決する手段として、genieというものが開発されてます。

github.com

これをインストールして実行することで、systemdを動作させることが出来ます。

genie -i

ただしWSL2が一度終了して再度起動した場合は、またsystemdが存在しない状態になります。 起動のたびに上記コマンドを実行すれば解決・・・はするのですが、手作業では面倒くさい。 自動的に実行したいですが、systemdが動いてないのでcronで定義しても動作しません。rc.localファイルに書いてもダメです。 ではどうするのかというと・・・いくつか方法はありますが、私はWindows側からコマンドを実行させる方法を使っています。 以下のコマンドをWindowsコマンドプロンプトで実行すると、WSL2環境にコマンドを実行させることが出来ます。

wsl /bin/bash -l -c "genie -i"

batファイルにして実行するとコマンドプロンプトが一瞬表示されてちょっと気になるので、VBScriptを使い非表示のまま実行するように手を加えます。

CreateObject("Wscript.Shell").run "wsl /bin/bash -l -c 'genie -i'", vbHide

これをWindowsのスタートアップ時に実行させれば、自動的にWSL2環境のsystemdを動作させるようにできます。 コマンドプロンプトを管理者権限で開き、以下のコマンドを実行すると、スタートアップ時に上記の処理を書いたスクリプトファイルを実行するようにできます。

echo CreateObject("Wscript.Shell").run "wsl /bin/bash -l -c 'genie -i'", vbHide > "%ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\StartUp\wsl2_genie.vbs"

Docker Engineのインストール

公式サイトの手順に従ってインストールできます。 OSごとに手順が記載されているので、自分の環境にあった手順を見てインストールしましょう。

docs.docker.com

前述したsystemdの起動ができていれば、それ以上特に特殊な手順は必要ありません。 Dockerサービスが起動していれば、以下のコマンドがエラーにならず正常に動作するはずです。

docker ps

Docker Composeのインストール

こちらはDocker Engineだけで十分な場合は、インストールしなくても問題ありません。 インストールする場合は、こちらも公式サイトの手順に従って行いましょう。

docs.docker.com

日本語でインストール手順を紹介した記事も多数ありますが、注意しないと古いバージョン番号を指定して書かれていることがあります。 公式サイトを参照したほうが無難かと思います。

まとめ

WSL2のセットアップと、その環境にDockerを構築する手順を説明しました。 Docker自体には別に特殊な手順は必要ありませんでした。systemdなどWSL2独自の特殊な仕様は注意が必要です。 WSL2は便利ですが、事前に知っておかないと困る仕様などもあります。利用する場合はそれを承知したうえで使っていきましょう。

intra-martのIM-BISで文字列アイテムを数値アイテムのように使用する際の注意点

2020年入社したM.Sと申します。
本年度からプログラミングを始めたため 若輩者ですが、私の記事が皆さんのお役にたてればと思います。

今回は私が業務でミスしてしまった箇所を紹介します。

なぜ文字列アイテムを使うのか

IM-BISで数値アイテムを使用すると.00が表示されずに省略されてしまいます。 .00を表示させる仕様であったため、数値アイテムを使用せず、文字列アイテムを使って数値表示をすることになりました。

何が起きたか

IM-BISのアクション設定において、文字列アイテムの入力イベントで小数点の付与と指定以下の小数点の切り捨てを行う以下のスクリプトを実装しました。

let comma = (Math.floor(100 * str) / 100).toFixed(2);

ところが、例として72445.40と入力すると72445.39になってしまい、入力内容が変わってしてしまう問題が発生しました。

デバッグしてみたところ、Math.floor(100 * str)の計算結果が7244539.999999999になってしまうことが分かりました。

何故こうなるかを調べたところ以下の記事で挙げられている通り、浮動小数点数の計算時に丸め誤差が発生していたことが原因でした。
https://qiita.com/Chinats/items/e2647ca7900dfe7835a8

どう対処したか

intra-martのクライアントサイドAPI(ImDecimalFormatter)を使用してフォーマット処理を行うこととしました。

前準備としてFormaアイテムの入力値を取得する関数と反映する関数を実装しておきます。 アイテムの値取得・値反映については以下に記載があります。
https://www.intra-mart.jp/document/library/bis/public/bis_specification/texts/spec/csjs_script.html

// 文字列 入力値を取得する関数
function getItemValue(type, name) {
    let data = {}, _type = type || 'product_72_textbox', item = formaItems[_type];
    return item.getItemData[name]();
};

// 文字列 入力値を反映する関数
function setItemValue(type, name, value) {
    let data = {}, _type = type || 'product_72_textbox', item = formaItems[_type];
    data[name] = value;
    item.setItemData[name]({
        data : data
    });
};

次に、ImDecimalFormatterを用いて数値文字列のフォーマットする処理を実装します。
以下はImDecimalFormatterのAPIドキュメントです。
https://www.intra-mart.jp/apidoc/iap/jsdoc/symbols/ImDecimalFormatter.html

function format(name){
    let formatter = ImDecimalFormatter.getAccountInstance();
    // 小数部分の最大桁数を設定
    formatter.setMaximumFractionDigits(2);
    // 小数部分の最小桁数を設定
    formatter.setMinimumFractionDigits(2);

     let str = getItemValue('product_72_textbox', name);

    // ImBigDecimal(任意精度のスケールなしの整数値)に変換
    formatter.parseToBigDecimal(str,function(data, textStatus, jqXHR){
        if(data.error) {
            console.log(data);
            setItemValue('product_72_textbox', name, '');  
            return;
        }    

        // 小数点以下の桁数を丸める
        let bd = data.data;
        // 一つ目めの引数は、求める小数点以下の桁数を指定
        // 二つ目の引数は、列挙型定数のRoundingMode.DOWNを指定し切り捨て
        bd = bd.setScale(2,ImRoundingMode.DOWN);

        // 区切り文字付きでフォーマット
        formatter.format(bd, function(data, textStatus, jqXHR){
            // フォーマットエラーの場合はブランクを設定
            if(data.error) {
                console.log(data);
                setItemValue('product_72_textbox', name, '');
                return;
            }
            setItemValue('product_72_textbox', name, data.data);
        });
    }); 
}

これで小数を入力した場合でも、誤差なく入力した通りの値を表示することができました。

おわりに

JavaScriptを学んでいく中で計算と日付周りは罠が多いとよく目にしましたが、 実際に望まない挙動が起こるとその意味を実感しました。 まだまだ理解が浅いため学習を続け、罠に注意して開発を行っていきたいと思います。

slackで予約投稿する方法

今年度に入社したY.Kです。

slackで予約投稿をするには、現状API拡張機能を利用するしかありません。 今回はAPIを使ってslackに予約投稿をする方法をご紹介します。

使用するAPI

今回使用するAPIはこちらになります。

chat.scheduleMessage method | Slack

投稿準備

このAPIを使うには『OAuthAccessToken』を取得する必要があります。 このOAuthAccessTokenを取得するためにはslackAppを作成しなければならないので、これよりslackAppを作成する手順を紹介します。

1.『slackAPI』にアクセス

こちらのリンクからslackAPIのサイトにアクセスします。

Slack API: Applications | Slack

アクセスできたら『Create New App』を選択します。 f:id:yamatotox:20201222132904p:plain

2.名前とワークスペースを決める

作成するslackAppの名前と、Appを作成するワークスペースを決めます。

f:id:yamatotox:20201222133021p:plain

3.『Permissions』を選択

Permissionsを選択します。

f:id:yamatotox:20201222133108p:plain

4.『Add an OAuth Scope』からスコープを選択

『Add an OAuth Scope』の中から、『chat:write』を選択します。

f:id:yamatotox:20201222133246p:plain

f:id:yamatotox:20201222133148p:plain

5.ワークスペースにインストール

『Install to Workspace』を選択します。

確認画面が出てくるので問題なければ許可をします。

許可されれば選択したワークスペースにslackAppが作成されます。

f:id:yamatotox:20201222133341p:plain

f:id:yamatotox:20201222133410p:plain

OAuthAccessTokenを取得

ワークスペースにslackAppが作成されるとこの画面に飛ぶので、ここからOAuthAccessTokenを取得します。

f:id:yamatotox:20201222133441p:plain

以上が、OAuthAccessTokenの取得手順になります。

chat.scheduleMessage APIを使う

それではこのOAuthAccessTokenを用いてchat.scheduleMessage APIを使っていきます。 こちらが投稿ページになります。

https://api.slack.com/methods/chat.scheduleMessage/test

投稿する上で以下4つの項目が必要になります。

  • token・・・・取得したOAuthAccessToken
  • channel・・・・投稿したいチャンネル名
  • post_at・・・・投稿日時
  • text・・・・本文

その他の引数について気になる場合は、Testerタブの左側にあるDocumentationを参考にしましょう。 注意点として投稿日時はUnixTime型なので、こちらから送信したい時刻をUnixTimeに変換しなければなりません。

UnixTime相互変換ツール

設定したら『Test Method』ボタンを押します。

f:id:yamatotox:20201222133558p:plain

成功すると設定した投稿日時にメッセージが予約されます。

f:id:yamatotox:20201222133622p:plain

そして予約投稿時刻にslackを見ると、

f:id:yamatotox:20201222133650p:plain

このように投稿されます。

以上、APIを使ったslackの予約投稿方法でした。

拡張機能を使った方法

googlechrome拡張機能を使った方法もあるので簡単にご紹介します。

Slack Send Later

こちらの拡張機能を入れた後、オプションに飛びます。

f:id:yamatotox:20201222133729p:plain

tokenを設定する場所があるので、そこにOAuthAccessTokenを設定します。 後はSlack Send Laterを起動してチャンネル名とメッセージ、送信予定日時を入れて送信予約ボタンを押せば予約投稿ができます。

f:id:yamatotox:20201222133818p:plain

まとめ

slackで予約投稿する方法を紹介しました。使いどころはそこまでないとは思いますが、APIを使う良い練習にはなると思うので是非使ってみてください。

IEでアロー関数が使えなかった話

はじめまして。2020年新卒入社しました。S.Rです。
まだまだ勉強中の身ですが、私の記事が皆さんの
お役にたてれば幸いです。

今回は初学者の私が少しつまずいたトピックを取り上げます。

何が起きたか

タイトル通りではありますが、ブラウザInternet Explorer(以下IE)での動作テスト中にエラーが起こる。Google Chromeでの動作は問題が無い。。。
→調べると、クライアント側のJavaScriptにおいてアロー関数がIEでは使えないことが判明しました。

アロー関数とは

下記がES5以前の書き方です。(ESについては後述します。)

var normal = function arrow() {  
    return '一般的な関数';  
};  

一方こちらがアロー関数です。
【 => 】・・・矢印(アロー)

var arrow = () => {  
    return 'アロー関数';  
};  

同じ内容を少ない文字数で書くことができるだけでなく、その他にもメリットはありますがここでは割愛します。 詳細は下記を参照ください。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions

なぜ

なぜ同じプログラミング言語でもブラウザが異なることで一部の関数だけが使えなくなるのでしょうか。

理由は大きく2点
JavaScriptにバージョンがある
②ブラウザ側がバージョンに対応する必要がある

JavaScriptにはES〇〇(数字または西暦)の名前でバージョンが複数存在します。
2015年以降は毎年新しいバージョンがリリースされています。

それに対し、IEは最新バージョンに対応していないため、
過去にリリースされたJavaScriptの機能には対応できても、
一部の新しい機能には対応できないという状況になっています。

IEではES5(2009年リリース)までが使用可能ですが、アロー関数はES6(2015年リリース)から実装された関数であるため、IEではアロー関数が使えないのです。

以下ES6の各ブラウザ対応表です。(IEは真っ赤ですね。。。)
http://kangax.github.io/compat-table/es6/

どうする?

私は今回アロー関数を使わない方針で、書き直しました。
書き直す際には以下のサイトが便利です。
https://babeljs.io/

おわりに

初学者の私にとってプログラミング言語が日々進化し、バージョン毎に違いがあることは新鮮な感覚でした。願わくば私自身も日々成長を続けられたらな、といったところです。

今年も押し迫り、体調管理には気を抜けない日々が続いておりますが、どうぞよいお年をお迎えください。