たちまち。

即席で役に立つこと。

PDFのカラーモードをRGBに変換する方法(Windows標準)

PDFにはCMYKとRGBの2つのカラーモードが存在します。

このカラーモードの違いにより、デバイスによっては見え方が異なったりします。

Javaでサムネイル作ったと思ったら満足な色で出力されなかったり、とか。

このカラーモードを変換したい場合、基本的には有料のAdobe Acrobatが必要ですが、RGBへの変換であればWindows10のPC上で可能です。

手順(Windows10が必要)

  1. PDFファイルを開く

  2. 印刷を選択し、プリンタの一覧から「Microsoft Print to PDF」を選択

  3. 印刷を実行するとファイル保存ダイアログが表示されるので、任意の場所に保存

これで、RGBプロファイルのPDFが出力できます。

Azureで作成した仮想マシンにRDP接続できない

f:id:aposke:20210120175644j:plain

Azureで仮想マシンを作成し、RDP接続しようとしたところ、接続ができない。

「接続のテスト」より接続を試してみたところ、以下のエラーが表示された。

セキュリティ グループの規則 DefaultRule_DenyAllInBound によってブロックされているネットワーク接続

なるほど、セキュリティグループの設定が問題なわけだ。

しかし、確認してみてもRDPの接続許可は「AllowRD」という受信ポートの規則があって許可されているんですケド。

こんなときはいくつかの修正方法があるようだ。以下を実施するとよいだろう。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/troubleshooting/troubleshoot-rdp-connection

私が試したのは以下。

リモートデスクトップ構成をリセットする。

仮想マシン > パスワードのリセット > 「構成のみのリセット」を選択して、更新

仮想マシンを再起動する。

仮想マシンの一覧をから右クリック > 再起動

NICを再起動する。

仮想マシンのネットワークインターフェイスを開き、IP構成 > パブリックIPをクリック > 割り当ての「動的」を「静的」に変更 > 保存

~~~

しかし、私の環境ではいずれも接続ができなかった。

なんだろうと思った時、ふと別のネットワークから接続してみたところ、普通につながった。

どうも、会社のProxyが悪さをしていたようだ。とほほ。

TFSのタスク項目とMS Projectの列項目の対応まとめ

TFSにてプロジェクトのタスク管理を行っているが、ガントチャートが表示できないため、進捗はMS Projectにて確認している。

ただ、TFS上のタスク項目と、MS Project上の項目のどれが紐づいているかわからない…ので調べてみた。

TFS ⇔ MS Project

  • 作業分野 ⇔ 作業分野(テキスト7)

  • 先行処理 ⇔ 先行タスク

  • 最初の見積もり ⇔ 基準作業時間

  • 残存作業 ⇔ 残存作業時間

  • 実績作業 ⇔ 実績作業時間

  • 予定開始日 ⇔ 開始日

  • 予定完了日 ⇔ 終了日

  • 実績開始日 ⇔ 実績開始日

  • 実績終了日 ⇔ 実績終了日

これで、TFS側からもProject側からもシームレスに更新できるようになる。

ちなみに、この中で重要になるのは「最初の見積もり」「残存作業」「実績作業」だが、以下のポリシーで入れていくのがTFSの位置づけのようだ。

・最初の見積もり…残存作業の初期値 - 作業開始時に 1 回設定

・残存作業…タスクを完了するための残存時間の見積もり

・実績作業…このタスクに対して費やされた時間

参考

MSDN マガジン: アジャイル開発 - TFS 2010 でアジャイルを味方につける | Microsoft Docs

【eBuilder】大文字と小文字の違いでNoClassDefFoundErrorになる

intra-mart(iAP)の起動時にNoClassDefFoundErrorが発生して起動しない。

ログを見るとwrong nameと言われており、指定クラス名と実際のクラス名が異なるようだ。よく見ると、大文字と小文字が異なっている。

そこで、この間違っている方のクラス名を使っている箇所をeBuilderやResin上でGrepしてみる…が、ヒットしない。むむ…?

原因と解決策

こういったケースの原因は、「誤った名称のクラスが既にresin側に存在する」ということ。

つまり、resin側の WEB-INF/classes の配下に誤った名称のクラスファイルが存在している筈である。

これを削除して再度クラスファイルを生成(eBuilder上でプロジェクトをクリーン)してやれば、解消する。

SVN更新などによってファイルが書き換えられ、クラス名の大文字小文字だけが修正された場合に発生するようだ。

HandsOnTableで列固定して横スクロールすると行の高さが変わる問題

検証バージョン:HandsOnTable6.2.2

HandsOnTableにて、fixedColumnsLeftを使用して先頭の列固定をしているとき、スクロールした際に行の高さ(height)が変わってしまう、という問題がある。

行の高さが倍程度に膨らんで見づらくなってしまい、場合によっては固定列と通常の列との行の高さが異なりデータが判別できない、という状況に陥ってしまう。

定量のスクロールを行うと発生し、スクロールを行った際には高い頻度で発生する。

原因は様々考えられそうだが、以下の要素が絡んでいると発生するようだ。

  • fixedColumnsLeftを使用して列固定をしている

  • 列の数がかなり多く、長い横スクロールが発生する

  • 入力補完項目(autocomplete)やドロップダウン項目(dropdown)を使用している

長いこと悩まされており、解決は難しいと考えていたのだが、今回以下の方法で解決することができた。

解決策

viewportColumnRenderingOffsetnumberを指定する。

https://handsontable.com/docs/8.1.0/Options.html#viewportColumnRenderingOffset

HandsOnTableは表示している周辺のデータを都度レンダリングするのだが、縦方向と横方向のレンダリングする行・列の数を指定することができる。

このオプションは、レンダリングする列の数を指定するもの。デフォルト値は'auto'で、HandsOnTableがパフォーマンス面で最適なオフセットを計算しようとする。

結果としてグリッドオプションの指定は以下のようになった。

                myGridOption = {
                    ~~いろいろ省略
                    autoRowSize : false,
                    fixedRowsTop: 3, //行固定位置
                    fixedColumnsLeft: 6,//列固定位置
                    viewportColumnRenderingOffset: 70
                };

今回の事例では、40列程度読み込むとレンダリングが発生したので、autoによるレンダリング列は40程度だったようだ。この数値を上げ、レンダリング列を上げることによって横スクロール時の再読み込みがなくなり、結果として行の高さがずれることがなくなった。

もちろんレンダリング列数を上げることはパフォーマンスの劣化につながるので、バランスを見て調整したい項目。あるいは、単純に列の数を見直す…というのも解決策になってきそうだ。

iWP7.2 スタートパックインストール済みの環境にIM-共通マスタを入れる方法

※この手順は公式なものではなく、インストール後の動作を保証するものではありません。

intra-mart WebPlatform7.2(iWP7.2)において、スタートパック(ISP7.1)インストール済みの環境にIM-共通マスタをインストールしようとすると、初期データインポート時のマイグレーション処理で以下のエラーが発生する。

[ERROR] j.c.i.s.j.i.ExtendsImportManagerObject - java.lang.NullPointerException
jp.co.intra_mart.foundation.security.exception.AccessSecurityException: java.lang.NullPointerException
    at jp.co.intra_mart.data_migration.master.ImMasterMigration.doImport(Unknown Source) [ImMasterMigration.class:na]
    at jp.co.intra_mart.foundation.security.ExtendsImportManager.doImport(ExtendsImportManager.java:96) [ExtendsImportManager.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.javascript.imapi.ExtendsImportManagerObject.jsStaticFunction_doImport(ExtendsImportManagerObject.java:73) [ExtendsImportManagerObject.class:im_7.2.4(build:date=2011-09-28-0600)]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [na:1.6.0_45]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [na:1.6.0_45]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [na:1.6.0_45]
    at java.lang.reflect.Method.invoke(Method.java:597) [na:1.6.0_45]
    at jp.co.intra_mart.system.javascript.MemberBox.invoke(MemberBox.java:142) [MemberBox.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.javascript.FunctionObject.call(FunctionObject.java:468) [FunctionObject.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.javascript.optimizer.OptRuntime.call2(OptRuntime.java:74) [OptRuntime.class:im_7.2.4(build:date=2011-09-28-0600)]
    at _system._setting._system._system_license._main_js._c8(D:\imart\app\pages\platform\src\system\setting\system\system_license\main.js:800) [na:na]
    at _system._setting._system._system_license._main_js.call(D:\imart\app\pages\platform\src\system\setting\system\system_license\main.js) [na:na]
    at jp.co.intra_mart.system.javascript.optimizer.OptRuntime.callName(OptRuntime.java:95) [OptRuntime.class:im_7.2.4(build:date=2011-09-28-0600)]
    at _system._setting._system._system_license._main_js._c6(D:\imart\app\pages\platform\src\system\setting\system\system_license\main.js:280) [na:na]
    at _system._setting._system._system_license._main_js.call(D:\imart\app\pages\platform\src\system\setting\system\system_license\main.js) [na:na]
    at jp.co.intra_mart.system.javascript.ContextFactory.doTopCall(ContextFactory.java:337) [ContextFactory.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:2765) [ScriptRuntime.class:im_7.2.4(build:date=2011-09-28-0600)]
    at _system._setting._system._system_license._main_js.call(D:\imart\app\pages\platform\src\system\setting\system\system_license\main.js) [na:na]
    at jp.co.intra_mart.system.display.ScriptScope.call(ScriptScope.java:215) [ScriptScope.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:180) [WebPageBuilder.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.session.web.WebPageBuilder.invoke(WebPageBuilder.java:134) [WebPageBuilder.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.servlet.jssp.AbstractJSSPServlet.fire(AbstractJSSPServlet.java:76) [AbstractJSSPServlet.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.servlet.jssp.SecureJSSPServlet.execute(SecureJSSPServlet.java:70) [SecureJSSPServlet.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.system.servlet.jssp.SecureJSSPServlet.doPost(SecureJSSPServlet.java:55) [SecureJSSPServlet.class:im_7.2.4(build:date=2011-09-28-0600)]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:153) [jsdk-15.jar:3.0.1]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:91) [jsdk-15.jar:3.0.1]
    at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:103) [resin.jar:3.1.0]
    at jp.co.intra_mart.foundation.access_block.filter.AccessBlockerFilter.doFilter(AccessBlockerFilter.java:67) [AccessBlockerFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.foundation.security.filter.DuplicateLoginHandlingFilter.doFilter(DuplicateLoginHandlingFilter.java:176) [DuplicateLoginHandlingFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.foundation.security.filter.ActiveSessionFilter.doFilter(ActiveSessionFilter.java:178) [ActiveSessionFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.foundation.security.filter.URLAccessFilter.doFilter(URLAccessFilter.java:171) [URLAccessFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.foundation.security.filter.SessionFilter.doFilter(SessionFilter.java:200) [SessionFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.system.servlet.jssp.JSSPContextFilter.doFilter(JSSPContextFilter.java:67) [JSSPContextFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.impl.HTTPContextHandlingFilterImpl.doFilter(HTTPContextHandlingFilterImpl.java:53) [HTTPContextHandlingFilterImpl.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.HTTPContextHandlingFilter.doFilter(HTTPContextHandlingFilter.java:94) [HTTPContextHandlingFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.LuxuryResponseWriterFilter.doFilter(LuxuryResponseWriterFilter.java:46) [LuxuryResponseWriterFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.foundation.security.filter.ResponseCharacterEncodingFilter.doFilter(ResponseCharacterEncodingFilter.java:104) [ResponseCharacterEncodingFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.RequestMessageBodyFilter.doFilter(RequestMessageBodyFilter.java:241) [RequestMessageBodyFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.foundation.security.filter.RequestCharacterEncodingFilter.doFilter(RequestCharacterEncodingFilter.java:76) [RequestCharacterEncodingFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.system.servlet.filter.RequestControlFilter.doFilter(RequestControlFilter.java:78) [RequestControlFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.system.servlet.filter.RequestQueryLengthMonitoringFilter.doFilter(RequestQueryLengthMonitoringFilter.java:51) [RequestQueryLengthMonitoringFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.common.aid.jsdk.javax.servlet.filter.ExceptionHandlingFilter.doFilter(ExceptionHandlingFilter.java:298) [ExceptionHandlingFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.system.log.transition.TransitionLogFilter.doFilter(TransitionLogFilter.java:109) [TransitionLogFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.system.servlet.filter.RequestLogFilter.doFilter(RequestLogFilter.java:86) [RequestLogFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.system.servlet.filter.ResponseMonitoringFilter.doFilter(ResponseMonitoringFilter.java:57) [ResponseMonitoringFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at jp.co.intra_mart.system.servlet.filter.RequestScopeLockReleaseFilter.doFilter(RequestScopeLockReleaseFilter.java:44) [RequestScopeLockReleaseFilter.class:im_7.2.4(build:date=2011-09-28-0600)]
    at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87) [resin.jar:3.1.0]
    at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187) [resin.jar:3.1.0]
    at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265) [resin.jar:3.1.0]
    at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:436) [resin.jar:3.1.0]
    at com.caucho.server.port.TcpConnection.run(TcpConnection.java:682) [resin.jar:3.1.0]
    at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:743) [resin-util.jar:3.1.0]
    at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:662) [resin-util.jar:3.1.0]
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_45]
Caused by: jp.co.intra_mart.data_migration.master.common.MasterMigrateException: java.lang.NullPointerException
    at jp.co.intra_mart.data_migration.master.migrator.appcom.AbstractMasterMigrator.execute(Unknown Source) [AbstractMasterMigrator.class:na]
    at jp.co.intra_mart.data_migration.master.migrator.ImportMigrationData.execute(Unknown Source) [ImportMigrationData.class:na]
    ... 71 common frames omitted
Caused by: java.lang.NullPointerException: null
    at jp.co.intra_mart.product.startpack.listener.IspCompanyChangedListener.getDbType(IspCompanyChangedListener.java:1495) [IspCompanyChangedListener.class:na]
    at jp.co.intra_mart.product.startpack.listener.IspCompanyChangedListener.getTableNames(IspCompanyChangedListener.java:1527) [IspCompanyChangedListener.class:na]
    at jp.co.intra_mart.product.startpack.listener.IspCompanyChangedListener.existsISPData(IspCompanyChangedListener.java:1603) [IspCompanyChangedListener.class:na]
    at jp.co.intra_mart.product.startpack.listener.IspCompanyChangedListener.setup(IspCompanyChangedListener.java:222) [IspCompanyChangedListener.class:na]
    at jp.co.intra_mart.product.startpack.listener.IspCompanyChangedListener.departmentUpdated(IspCompanyChangedListener.java:736) [IspCompanyChangedListener.class:na]
    at jp.co.intra_mart.system.datastore.application.domain.company.CompanyListenerHandler.departmentUpdated(CompanyListenerHandler.java:108) [CompanyListenerHandler.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.foundation.datastore.impl.application.domain.company.CompanyManagerImpl.updateDepartment(CompanyManagerImpl.java:215) [CompanyManagerImpl.class:im_7.2.4(build:date=2011-09-28-0600)]
    at jp.co.intra_mart.data_migration.master.migrator.appcom.company.CompanyMigrator.updateBMDepartmentT(Unknown Source) [CompanyMigrator.class:na]
    at jp.co.intra_mart.data_migration.master.migrator.appcom.company.CompanyMigrator.migrateData(Unknown Source) [CompanyMigrator.class:na]

エラーにはIspCompanyChangedListenerと出ており、どうやらスタートパックに入っている組織関連のリスナが邪魔をしてしまっているようだ。

画面を確認してみてもIM-共通マスタの会社組織が入っていない。

そこで、インストールするには一時的にこのリスナを止めてやればよい。

回避策

以下のファイルを別の場所に退避する。

<iWPインストールフォルダ>/conf/system-install-isp-sfa-comm.xml

退避したらiWPを再起動して、IM-共通マスタの初期データインポートを実行。

その後、当該xmlファイルを戻してふたたび再起動する。

IM-共通マスタの会社組織に所属も含めて入ってるし、IM-共通マスタ側に組織を追加してもちゃんとアプリケーション共通マスタ側に同期されている。スタートパックも問題なく使えるので恐らく大丈夫そうだ。

繰り返しになるが正式な手順ではない。ISPとIM-共通マスタを共存させる場合、iWPとIM-共通マスタを先にインストールし、その後にISPをインストールするのが正式手順。他に回避策がない場合にのみ活用し、しっかりと動作検証することを推奨する。

統一インターフェイスのDynamics365で「フロー」ボタンが表示されない(ワークフローの実行ができない)

これまでビューの一覧画面にてレコードを選択し、「ワークフローの実行」というメニューを利用していたが、統一インターフェイスになってからリボンメニューからそのボタンがなくなってしまった。

統一インターフェイスでは新しく「フロー」というボタンから利用する事になるのだが、そのボタンを表示するには以下の設定が必要。

1. システム設定でMicrosoft Flowを有効にする

設定>管理から、「システムの設定」を開く。

f:id:aposke:20201022115344p:plain

「カスタマイズ」タブに「Microsoft Flowを有効にする」という項目があるので、これを「はい」にする。

f:id:aposke:20201022115356p:plain

2. セキュリティロールの権限を付与する

セキュリティロールの設定を開き、「カスタマイズ」タブのその他の特権にある「フローの実行」を許可する。

f:id:aposke:20201022115406p:plain

以上でリボンメニューにフローが表示されるようになった。