ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

Visual Studio 2015から2019への移行で Crystal Reports をバージョンアップする

Visual Studioの開発環境が古いものになってきたので最新版に移行することにしました。

現在は2022が最新ですが、当時2022がリリースされる直前かつそれに対応したCrystal Reportsのランタイムがなかったため2019での内容になります。

恐らくVisual Studioのバージョンが変わっても大きな変更がない限り使えると思います。

動作環境

旧環境

Windows 10
VisualStudio Community 2015
.NETFramework 4.6.1
CrystalReports 13.0.20

新環境

Windows 11
VisualStudio Community 2019
.NETFramework 4.6.1
CrystalReports 13.0.32

プロジェクトのバージョンアップ

2015で作ったプロジェクトを2019で読み込ませます。

読み込ませると自動的に2019に対応したプロジェクトに変換され、結果がHTMLで出力されます。

問題があるところは、手動で対応しましょう。

Crystal Reportのバージョンアップ

環境としては、新旧別端末となるので、古いバージョンのランタイム等はインストールされていないものとなります。

既存環境でのバージョンアップの場合、古いものは事前に削除しておきましょう。

SAP Univasal IDの取得

すでに取得済みの方は、アカウント作成は行わず、次の新規取得と同じリンクを開いて下さい。

新しく取得する場合、次のリンクを開き「Download software now」をクリックしてアカウントを作成して下さい。
www.sap.com

アカウントの作成理由は、次で必要となる関連ファイルをダウンロードするためです。

今まではアカウントがなくてもダウンロードできていましたが、それができなくなりました。

関連ファイルのダウンロード

アカウントを登録すると、ダウンロードリンクがメールで送られてくるので、そのリンクからダウンロードします。

また、先程のアカウント取得ページからも、ログインしていればメール記載の同じリンクが表示されるようになります。

ダウンロード可能なもの一覧

(SP32)は、Crystal Reportsのモジュールバージョンです。
使用するファイルは、赤字のものになります。

開発環境でのインストール

Visual StudioでCrystal Reportsを使えるようにするために以下をインストールします。

Visual Studioで作成したインストーラーにマージモジュールを含めるため、以下のファイルを展開します。

  • SAP Crystal Reports for Visual Studio (SP32) runtime merge modules (32-bit), no IDE integration

マージモジュールの適用方法は、以下の記事を参考にして下さい。
今回も必要なファイルは2ファイルです。
shinsuke789.hatenablog.jp

プロジェクトでのCrystal Reports参照設定のし直し

何もしなくても動作しそうですが、もしエラーが発生している場合、一旦Crsytal Reportsの参照設定を外し、再設定して下さい。
それをする前に、現在の参照設定をキャプチャーを取るなり記憶しておいて下さい。

管理人の環境では以下のようになってます。

Crystal Reports参照設定

クライアント環境でのインストール

いろいろやってみると、配布するインストーラーにマージモジュールが含まれていると、クライアント環境にCrystal Reportsランタイムがなくても帳票が出力されていました。ランタイムとは一体…。

しかし、用途によってはCrystal Reportsランタイムが必要かもしれません。

その場合は、「SAP Crystal Reports for Visual Studio (SP32) runtime (??-bit)」をインストールして下さい。

EC CUBE 4.0.5でPHP Composer 1.xを使ってインストールする

EC CUBEをDockerで構築時にエラーに遭遇したので、その時の対処方法をまとめました。

環境

macOS 10.14
・Docker Desktop 2.5.0.1
・EC CUBE 4.0.5

現象

上記環境でEC CUBE付属ファイルでdocker composeを実行すると次のエラーが発生します。

Composer (version 2.0.8) successfully installed to: /var/www/html/composer.phar
Use it: php composer.phar

Changed current directory to /root/.composer

                                                                                                        
  [RuntimeException]                                                                                    
  No composer.json present in the current directory, this may be the cause of the following exception.  
                                                                                                        

                                             
  [InvalidArgumentException]                 
  Could not find package hirak/prestissimo.  
                                             
  Did you mean this?                         
      hirak/prestissimo                      
                                             

require [--dev] [--dry-run] [--prefer-source] [--prefer-dist] [--fixed] [--no-suggest] [--no-progress] [--no-update] [--no-install] [--no-scripts] [--update-no-dev] [-w|--update-with-dependencies] [-W|--update-with-all-dependencies] [--with-dependencies] [--with-all-dependencies] [--ignore-platform-req IGNORE-PLATFORM-REQ] [--ignore-platform-reqs] [--prefer-stable] [--prefer-lowest] [--sort-packages] [-o|--optimize-autoloader] [-a|--classmap-authoritative] [--apcu-autoloader] [--apcu-autoloader-prefix APCU-AUTOLOADER-PREFIX] [--] [<packages>]...

ERROR: Service 'ec-cube' failed to build : The command '/bin/sh -c curl -sS https://getcomposer.org/installer   | php   && mv composer.phar /usr/bin/composer   && composer config -g repos.packagist composer https://packagist.jp   && composer global require hirak/prestissimo   && chown www-data:www-data /var/www   && mkdir -p ${APACHE_DOCUMENT_ROOT}/var   && chown -R www-data:www-data ${APACHE_DOCUMENT_ROOT}   && find ${APACHE_DOCUMENT_ROOT} -type d -print0   | xargs -0 chmod g+s   ;' returned a non-zero code: 1

原因

EC CUBE 4.0.5以前は、PHP Composer 2.xに対応していないためです。

対処方法

EC CUBE付属のDockerfileの58行目あたりのphpコマンドにバージョンを指定するオプションを指定し、再度docker composeを実行します。
php -- --1」とすることで、Composer 1系の最新版をインストールするようになります。

Dockerfileの編集

# before
RUN curl -sS https://getcomposer.org/installer \
  | php \
  && mv composer.phar /usr/bin/composer \

# after
RUN curl -sS https://getcomposer.org/installer \
  | php -- --1 \
  && mv composer.phar /usr/bin/composer \

EC-CUBE 4 システム構築入門&店舗運営・管理ビギナーズガイド

EC-CUBE 4 システム構築入門&店舗運営・管理ビギナーズガイド

  • 作者:西村 誠
  • 発売日: 2019/02/27
  • メディア: 単行本(ソフトカバー)

FlutterでCocoaPodsインストール時のエラー対処方法

FlutterでiOSの開発環境構築時に少しエラーが出てハマったので、その時の対処方法を紹介します。

環境

macOS:10.14.6
Ruby:2.3.7p456 (2018-03-28 revision 63024)
Flutter SDK:1.20.1

現象

CocoaPodsをインストールしようとするとエラーが発生する。

$ sudo gem install cocoapods
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin18/rbconfig.rb:215: warning: Insecure world writable dir /Users/xxxx/dev in PATH, mode 040777
Fetching: concurrent-ruby-1.1.7.gem (100%)
Successfully installed concurrent-ruby-1.1.7
Fetching: i18n-0.9.5.gem (100%)
Successfully installed i18n-0.9.5
Fetching: thread_safe-0.3.6.gem (100%)
Successfully installed thread_safe-0.3.6
Fetching: tzinfo-1.2.7.gem (100%)
Successfully installed tzinfo-1.2.7
Fetching: activesupport-4.2.11.3.gem (100%)
Successfully installed activesupport-4.2.11.3
Fetching: nap-1.1.0.gem (100%)
Successfully installed nap-1.1.0
Fetching: fuzzy_match-2.0.4.gem (100%)
Successfully installed fuzzy_match-2.0.4
Fetching: httpclient-2.8.3.gem (100%)
Successfully installed httpclient-2.8.3
Fetching: algoliasearch-1.27.3.gem (100%)
Successfully installed algoliasearch-1.27.3
Fetching: ffi-1.13.1.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing cocoapods:
	ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.3.0/gems/ffi-1.13.1/ext/ffi_c
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20200810-3603-xmhpxy.rb extconf.rb
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/universal-darwin18/rbconfig.rb:215: warning: Insecure world writable dir /Users/xxxx/dev in PATH, mode 040777
mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/ffi-1.13.1 for inspection.
Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.13.1/gem_make.out

調べると、makeで失敗していてRubyのバージョンが古いのが原因のようです。

対処方法

以下の記事を参考にMacRubyを最新にアップデートします。
shinsuke789.hatenablog.jp

Flutter関連書籍

基礎から学ぶ Flutter

基礎から学ぶ Flutter

Flutter モバイルアプリ開発バイブル

Flutter モバイルアプリ開発バイブル

Android/iOSクロス開発フレームワーク Flutter入門

Android/iOSクロス開発フレームワーク Flutter入門

MacのRubyを最新バージョンにする

環境

macOS:10.14.6
Ruby:2.3.7p456 (2018-03-28 revision 63024)
Homebrew:2.4.9

手順

Homebrewがインストールされているのを前提で説明します。


1.Homebrewでrbenvをインストールする

$ brew install rbenv


2.インストール可能なRubyのバージョンを確認する

$ rbenv install --list
2.5.8
2.6.6
2.7.1
jruby-9.2.12.0
maglev-1.0.0
mruby-2.1.1
rbx-5.0
truffleruby-20.1.0
truffleruby+graalvm-20.1.0


3.リストにある最新のバージョンでRubyをインストールする

$ rbenv install 2.7.1

インストールに意外と時間がかかります


4.デフォルトのRubyバージョンを設定します。

$ rbenv global 2.7.1


5.~/.bash_profileに設定を追加する

$ vi ~/.bash_profile
# 以下を追記する
eval "$(rbenv init -)" 


6.設定を有効化する

$ source ~/.bash_profile


7.バージョンが切り替わっているか確認する

$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin18]


たのしいRuby 第6版 (Informatics&IDEA)

たのしいRuby 第6版 (Informatics&IDEA)

WildFlyでSpringBoot2.xを起動するとエラーになる場合の対処方法

WildFlyでSpringBoot2.xを動かそうとすると、以下のエラーが発生しアプリが起動しません。

(ServerService Thread Pool -- 78) Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDetailsServiceImpl': Unsatisfied dependency expressed through field 'loginService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'loginService': Unsatisfied dependency expressed through field 'usersDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usersDaoImpl' defined in VFS resource ["/Users/xxx/dev/eclipse/server/wildfly-20/standalone/deployments/WebApp.war/WEB-INF/classes/com/example/dao/UsersDaoImpl.class"]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Unexpected AOP exception; nested exception is org.springframework.aop.framework.AopConfigException: Unable to instantiate proxy using Objenesis, and regular proxy instantiation via default constructor fails as well; nested exception is java.lang.NoSuchMethodException: com.example.dao.UsersDaoImpl$$EnhancerBySpringCGLIB$$31fd9af9.<init>()

どうもDIできてないのが原因ぽいです。
Java9以降で発生します。
対処方法は、設定ファイルに追記するだけなので簡単です。

環境

OS:CentOS7
WildFly:20
SpringBoot:2.3.1
Java:14

対処方法

jboss-deployment-structure.xmlに依存関係の設定を追加する。

<?xml version="1.0"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <deployment>
        <dependencies>
        	<module name="jdk.unsupported"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

EclipseでWildFlyのjboss-deployment-structure.xmlをローカルサーバーに配置する方法

EclipseのローカルWildFly動作時に、jboss-deployment-structure.xmlをWEB-INFに配置する方法です。
プロジェクトのプロパティ内で行えます。

手順

1.「src」配下に任意のフォルダを作成する
ここでは「WEB-INF」フォルダを作成する。
f:id:shinsuke789:20200720093009p:plain

2.プロジェクトのプロパティで「デプロイメント・アセンブリ」を選択し、右側にある「追加」ボタンを押下する
f:id:shinsuke789:20200720093016p:plain

3.ディレクティブ・タイプ選択で「フォルダ」選択し、「次へ」を押下する
f:id:shinsuke789:20200720093028p:plain

4.1で作成したフォルダを選択し、「完了」を押下する
f:id:shinsuke789:20200720093037p:plain

5.追加したソースのデプロイ・パスをクリックし、サーバー上でのパスである「WEB-INF」を入力し、設定を保存する
f:id:shinsuke789:20200720093046p:plain

Linuxでシェルを使ってDropboxにバックアップをする方法

サーバーを運用していると障害発生時にデータが消えても大丈夫なようにバックアップを取る必要があります。

物理的なサーバーに触れられるのであれば、外付けHDDやテープ装置等にバックアップを取ったりいろいろ手段はあります。

しかし、VPS等のクラウド上のサーバーとなると外付けHDD等を接続することができません。

サーバー外にバックアップを気楽に取れるDropboxを使った方法を紹介します。

手順

Dropbox developerにアプリを登録する

1.Dropbox developerサイトにアクセスする
www.dropbox.com

2.「Create App」を押下する
f:id:shinsuke789:20200723103847p:plain

3.「1. Choose an API」で「Dropbox API」を選択する
f:id:shinsuke789:20200723103856p:plain

4.「2. Choose your app's permissions model」で「Scoped access」を選択する
f:id:shinsuke789:20200723103907p:plain

5.「3. Choose the type of access you need」で「App folder」を選択する
f:id:shinsuke789:20200723103926p:plain

6.「4. Name your app」で任意の名前を入力する
f:id:shinsuke789:20200723103938p:plain

7.画面右下の「Create App」を押下する
f:id:shinsuke789:20200723103946p:plain

8.パーミッションを設定する
よくわからないので、画像のように設定して下さい。
f:id:shinsuke789:20200723104006p:plain
f:id:shinsuke789:20200723104012p:plain
f:id:shinsuke789:20200723104020p:plain
f:id:shinsuke789:20200723104058p:plain

9.後ほど使うアクセストークンを取得する
f:id:shinsuke789:20200723104105p:plain
アクセストークンを生成すると、Dropboxのルート配下に「アプリ」フォルダ、その配下に先程つけた名前のフォルダが自動的に作成されます。

Linuxdropbox_uploader.shを設定する

1.dropbox_uploader.shを任意のディレクトリにダウンロードする

$ wget https://raw.githubusercontent.com/andreafabrizi/Dropbox-Uploader/master/dropbox_uploader.sh

wgetがない場合、yum等でインストールして下さい。


2.dropbox_uploader.shを実行する

$ ./dropbox_uploader.sh

3.Access tokenを聞かれるので、Dropbox developerで取得したアクセストークンを貼り付け、Enter押下後、「y」を入力しEnterを押下する

 This is the first time you run this script, please follow the instructions:

 1) Open the following URL in your Browser, and log in using your account: https://www.dropbox.com/developers/apps
 2) Click on "Create App", then select "Dropbox API app"
 3) Now go on with the configuration, choosing the app permissions and access restrictions to your DropBox folder
 4) Enter the "App Name" that you prefer (e.g. MyUploader37321544428431)

 Now, click on the "Create App" button.

 When your new App is successfully created, please click on the Generate button
 under the 'Generated access token' section, then copy and paste the new access token here:

 # Access token:ここにアクセストークンを貼り付ける

 > The access token is xxxxxxxxxxx. Looks ok? [y/N]: yと入力する

4.dropboxとの連携が設定される

アクセストークンを変更したい場合、dropbox_uploader.shを実行したユーザーのホームディレクトリ配下にある「.dropbox_uploader.sh」を編集し、該当のアクセストークンを削除するか、ファイルごと削除します。
sudoで実行した場合、rootのホームディレクトリ配下のファイルを編集します。

dropbox_uploader.shを使ってアップロードする

アップロードのコマンドは以下の通りです。

$ ./dropbox_uploader.sh upload アップロードするファイル名 アップロード後のdropbox内でのファイル名

例:
$ ./dropbox_uploader.sh upload /home/user/hoge.tar.gz hoge.tar.gz

シェルを実行すると「dropboxルート/アプリ/アプリ名」に自動的にアップロードされます。
同じ名前でアップロードするようにしていると、Dropbpx無料版では最大30日間のバージョン管理がされます。
また、ファイル内容が前回と異なる場合のみバージョン管理されます。

実際の運用は、別のシェル内でdropbox_uploader.shを呼び出し、cronでシェルが実行されるようにする感じになります。

無料でDropboxの容量を増やす方法

以下のリンク経由でDropboxをインストールすると無料で500MBが永久的に付与されます。
Dropbox - You're invited to join Dropbox!

まとめ

基本的にdropbox_uploader.sh1つに付き1アプリが紐づくようになっています。
コマンド実行時にアップロード先を指定する必要はなく、すべてDropbox developerでのアプリ作成で設定されます。
サーバーでの外部バックアップを気楽に行うには、紹介したこの方法が一番手軽な方法かもしれません。