Quantcast
Channel: ソフラボの技術ブログ
Viewing all 166 articles
Browse latest View live

Spring Boot 1.3.x で Gradle 4.x に更新してビルドするとエラーが出る場合の対処法

$
0
0

Gradleのバーションを久々に更新したら、一部のプロジェクトでエラーが出てました。
その時の対処を紹介します。

環境

Mac
Eclipse 4.5
Gradle 4.9(Homebrew)
Spring Boot 1.3.6

エラー内容

gradle eclipseを実行するとbuild.gradleの15行目でエラーが発生と表示されます。

$ gradle eclipse
FAILURE: Build failed with an exception.

* Where:
Build file '/Users/Applications/eclipse/workspace/Test/build.gradle' line: 15

* What went wrong:
A problem occurred evaluating root project 'Test'.
> Failed to apply plugin [class 'io.spring.gradle.dependencymanagement.DependencyManagementPlugin']> Could not create task of type'DependencyManagementReportTask'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 0s

build.gradle

問題の15行目は、apply 'spring-boot'の宣言です。

buildscript {
	ext {
		springBootVersion ='1.3.6.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath 'org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}'
		// Gradle4対応
		classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
	}
}

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'spring-boot'  // line: 15以下略

対処法

buildscript {
	ext {
		springBootVersion ='1.3.6.RELEASE'
	}
	repositories {
		mavenCentral()
	}
	dependencies {
		classpath 'org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}'
		//  追加
		classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
	}
}

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'spring-boot' 
// 追加
apply plugin: 'io.spring.dependency-management'

Gradle 4.x で「Could not resolve all artifacts for configuration」のエラーが出たときの対処方法

$
0
0

個人的にGradleはよく分かってないので突っ込まれると回答できません。ご了承下さい。

※ 一概に「Could not resolve all artifacts for configuration」のエラーが出たら、ここの対処をすれば良いと言うわけではない点にご注意下さい。

環境

Mac
Spring Boot 1.3.6
Gradle 4.9 (Homebrew)

エラー内容

gradle eclipse等を実行すると以下のエラーが発生する。

* What went wrong:
A problem occurred configuring root project 'Test'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not find org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}.
     Required by:
         project :

build.gradle(一部抜粋)

buildscript {
    ext {
        springBootVersion = '1.3.6.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}'// Gradle4対応
        classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
    }
}

対処方法

build.gradle(一部抜粋)

buildscript {
    ext {
        springBootVersion = '1.3.6.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        // 変数ではなく固定値にする
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.3.6.RELEASE'// Gradle4対応
        classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
    }
}

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築

PostgreSQLでDB間でデータをコピーする

$
0
0

PostgreSQLでDB間またはスキーマー間でpd_dumpを使ってコピーを試みたものの、うまくいきませんでした。

調べているとやり方はあるらしいですが、結局手間がかかり\copyの方が早いらしいのでこれで試してみました。

環境

PostgreSQL 9.4
CentOS 6
Mac 11

コピーの流れ

「コピー元DB:A、コピー先DB:B」とします。

1.AでCSVエクスポート
2.Bでデータ削除
3.BでCSVインポート
4.Bでシーケンス初期化

各項番の説明をしていきます。

1.AでCSVエクスポート

ターミナルで次を実行します。

# 通常接続
psql -h Aのホスト -U Aのユーザー名 -d AのDB名 -c"\copy テーブル名 to '/出力先フルパス/テーブル名.csv'  (format csv, delimiter ',', header true);"# SSL接続
psql "sslmode=require host=Aのホスト user=Aのユーザー名 dbname=AのDB名"-c"\copy テーブル名 to '/出力先フルパス/テーブル名.csv'  (format csv, delimiter ',', header true);"

2.Bでデータ削除

ターミナルでpsqlコマンドでDBに接続し、次のSQLを流してデータを削除します。
psql -c "コマンド"で接続しなくてもできます)

TRUNCATETABLEテーブル名;

3.BでCSVインポート

エクスポートの「to」を「from」に変えるだけです。
ターミナルで次を実行します。

# 通常接続
psql -h Bのホスト -U Bのユーザー名 -d BのDB名 -c"\copy テーブル名 from '/出力先フルパス/テーブル名.csv'  (format csv, delimiter ',', header true);"# SSL接続
psql "sslmode=require host=Bのホスト user=Bのユーザー名 dbname=BのDB名"-c"\copy テーブル名 from '/出力先フルパス/テーブル名.csv'  (format csv, delimiter ',', header true);"

4.Bでシーケンス初期化

ターミナルでpsqlコマンドでDBに接続し、次のSQLを流してシーケンスを設定します。
「\copy」でデータをインポートしても、シーケンスは設定されません。
「テーブルの件数+1」とすることで、次のシーケンス値になります。

SELECT SETVAL('シーケンス名',(SELECT COUNT(*)+1FROMテーブル名),FALSE);

補足

パスワードの省略

psqlを流すとパスワードを聞かれるので毎回入力するのは面倒です。
それを省くため、ターミナル毎に次の環境変数を設定しておく便利です。

export PGPASSWORD=接続先DBのパスワード
各一覧の取得

テーブル一覧やシーケンス一覧を取得するには、ターミナルでDB接続後次のコマンドを入力します。

-- テーブル一覧
\dt

-- シーケンス一覧
\ds

ターミナルだと出力された結果で、Altキーを押しながらマウスで選択すると矩形選択になるります。
テキストエディタ等に貼り付け、置換を駆使してコマンド・SQLを作成すれば作業が捗ります。

超絶おすすめするPostgreSQL書籍!!

[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

[改訂新版]内部構造から学ぶPostgreSQL 設計・運用計画の鉄則 (Software Design plus)

PostgreSQL全機能バイブル

PostgreSQL全機能バイブル

Postfixで独自ドメイン用の送信メールサーバーを構築する

$
0
0

Webサービス等の開発でメールを送信することがあると思います。

リリースにあたり独自ドメインも取得してメールを送信すると思いますが、メールサーバーを構築したり、メールボックスを契約するのは手間や費用がかかり大変です。

それらのことをやらなくても、メールを受信したら転送するだけの仕組みがPostfixで可能だったので、それらについてまとめました。

メール送信するにあたり、キャリアメール(docomoausoftbank等)の送信制限対策の設定も記載しましたので、ご活用下さい。

環境

CentOS 7
Postfix 2.10.1

前提条件

独自ドメインを取得していること

今回構築するPostfixの仕様

独自ドメイン宛のメールは、Postfixで受信し、それを指定のメールアドレスにそのまま転送する
・プログラムからのメール送信は、Postfixを経由してダイレクトに送信される
・プログラムからのキャリアへのメール送信は、Postfixで送信間隔を考慮して送信される
・プログラムからのメールは、暗号化して送信される(TLS設定をした場合)

独自ドメインSPFレコードを設定する

SPFレコードとは?

独自ドメインのよるメール送信が、迷惑メール扱いとならないようにドメインの設定でSPFレコードを追加します。

SPFの詳細については以下のリンクを参考にして下さい。
salt.iajapan.org

ドメイン設定でSPFレコードを登録する

SPFレコードは、ドメインを取得したサイトにいって「DNSレコード設定」等のメニューで行います。

設定する値は、以下の表のようになります。
独自ドメインhoge.com」メール送信するサーバーIP「192.168.0.1」の場合)

ホスト名TYPETTLVALUE補足
mail.hoge.comA3600192.168.0.1すでにあれば不要
hoge.comTXT3600v=spf1 a:mail.hoge.com ~all上記のホスト名を指定

TTLは任意の値で大丈夫です。

SPFレコードが有効か確認する

設定が終わったら、しばらく時間をおいて次のサイトでSPFレコードが有効になったか確認します。グリーンの表示ならOKです。
Sender Policy Framework (SPF) Record Lookup - SPF Check - MxToolBox

送信メールサーバーの設定

/etc/postfix/main.cf

# メール受信許可範囲(変更)
inet_interfaces = all
# 接続時に使うプロトコル(変更)
net_protocols = ipv4

## 配送設定# 遅延メッセージの配送を試行する最小時間間隔minimal_backoff_time=1m
# 遅延メッセージの配送を試行する最大時間間隔maximal_backoff_time=10m
# 配送できないものとして送り返すまでに、メッセージがキューに入っている最大時間maximal_queue_lifetime=1h
# 配送できないと見なすまでに、バウンスメッセージがキューに入っている最大時間bounce_queue_lifetime=1h
# 遅延されたキューがキューマネージャによってスキャンされる時間間隔queue_run_delay=30s
# 配送経路ファイルパス
transport_maps =hash:/etc/postfix/transport

## バーチャルドメイン# バーチャルドメイン
virtual_alias_domains = hoge.com
# バーチャルドメイン設定アフィるパス
virtual_alias_maps =hash:/etc/postfix/virtual

## STARTTLSの設定(メールが暗号化される)# SMTP TLSセキュリティレベル
smtp_tls_security_level = may
# CAファイルのパス(Let's Encryptを使った場合)
smtp_tls_CAfile = /etc/letsencrypt/live/hoge.com/cert.pem
# TLS情報をログに出力
smtp_tls_loglevel =1

/etc/postfix/virtual

hoge.com anything # 必須# 独自ドメイン宛メールを別アドレスに転送する
info@hoge.com hoge@gmail.com
noreplay@hoge.com hoge@gmail.com

ハッシュ化する

postmap /etc/postfix/virtual

キャリアメールの送信制限対策の設定

キャリアメールの送信制限

キャリアメールの送信制限について調べたところ、表のような感じになりました。
内容が古いかもしれないので、間違っている場合はご指摘頂ければうれしいです。

1セッション同時送信1日最大送信
docomo100件1,000通
au30件1,000通
softbank20件500通
Y!mobile???件1,000通

キャリアにメールを送信する場合、独自ドメインSPFレコードを設定することが必須となります。
キャリア毎の制限に引っかかった場合、迷惑メール扱いとなり、メールが届かなくなるので注意して下さい。

Postfixの設定

/etc/postfix/master.cf
docomo-smtp unix -    -    n    -    1    smtp
    -osmtp_destination_concurrency_limit=1-osmtp_destination_recipient_limit=1
au-smtp unix -    -    n    -    1    smtp
    -osmtp_destination_concurrency_limit=1-osmtp_destination_recipient_limit=1
softbank-smtp unix -    -    n    -    1    smtp
    -osmtp_destination_concurrency_limit=1-osmtp_destination_recipient_limit=1
ymobile-smtp unix -    -    n    -    1    smtp
    -osmtp_destination_concurrency_limit=1-osmtp_destination_recipient_limit=1
/etc/postfix/transport
docomo.ne.jp    docomo-stmp:
ezweb.ne.jp     au-smtp:
softbank.ne.jp  softbank-smtp:
.softbank.ne.jp softbank-smtp:
.vodafone.ne.jp softbank-smtp:
ymobile.ne.jp   ymobile-smtp:
willcom.com     ymobile-smtp:

ハッシュ化する

postmap /etc/postfix/transport

ポートを開ける

SMTPポート(25)を開けます。

sudo firewall-cmd --add-service=smtp--zone=public--permanent

上記設定がおわったらPostfixを再起動します。

sudo systemctl restart postfix

まとめ

今回、Webサービスをリリースするときに、独自ドメインをお名前.comで取得したところ、メールボックスは別で契約しないといけないことが分かり、メール送信をどうするか悩んでいました。

メールボックスを用意するのは、管理が面倒くさいので何か方法はないかと思って調べていると、Postfixだけでメール処理ができることが分かりました。

構築は簡単にできたのですが、できればこれらもしない方が手間も省けるので、独自ドメインを取得するなら、メールサーバー付きのサービスで取得する方が良いと思いました。

お名前.com以外にスタードメインドメインを管理しているので、スタードメインだとメールサーバー付いてるので、そちらでメール転送設定をすれば、任意のアドレスでメールを受け取れるので手間いらずです。

宣伝

今回リリースしたサービス

mincrew.net

ドメインを契約したところ

おすすめのドメイン契約先



WildFlyでgetResourceするとパスが異なる事例と対処方法

$
0
0

GlassFishで動作していたSpringBootアプリを、サーバー移管に伴いWildFlyに切り替えました。

動作確認をしていくと、リソースの取得で404が返ってきて困っていました。

いろいろと調査すると、パスの取得方法がアプリケーション・サーバーによって異なることがあるらしく、その場合の対処方法をまとめました。

環境

WildFly 15.0.1 Final
・Spring Boot 1.3.6 RELEASE
CentOS 7
Eclipse 4.8
・アプリはWARでデプロイ

WilfFly上での問題の挙動

GlassFishでは、アプリをWAR形式でデプロイし動作させていました。
WildFlyでも同じようにして動作させていたのですが、Excelを出力する処理で、404が発生し原因を調査することにしました。

GlassFishでは、次のコードで正常に動作していました。

new File(this.getClass().getResource(srcFullPath).getPath());


このコードのままWildFlyで処理を行うと変なパスが返ってきます。
(ローカルでWARデプロイしたとき)

# getResourceで引数に「"."」を指定した場合
/Users/user_name/dev/eclipse/server/wildfly-15/modules/system/layers/base/org/jboss/as/ejb3/main/timers/

# getResourceで引数に「"report"」のパスを指定した場合
/content/Hoge.war/WEB-INF/classes/com/test/report/  

いろいろと調べてみる

解決しないとマズイ問題なのでめちゃくちゃ調べました。

How to put an external file in the classpath |JBoss Developer
java - WildFly - getting resource from WAR - Stack Overflow
How to load a file in war file |JBoss Developer
How to load external property file in JBoss 7 classpath? - JBoss 7 Configurations

基本、英語のサイトしかヒットしないのでGoogle翻訳を駆使したり、コードから読み取ったりしてました。

サイトには、「それは解決できないよ」と絶望的な回答があったり、「この方法はどう?」と試すものの的外れだったりで、困り果ててました。

そんな中、「解決方法はこれ!」というのがあり、試すと問題なく動作するものがありました!!

解決方法

java - How to load resource files in jboss war - wildfly9.xV - Stack Overflow

getResource()でFileを取得するのではなく、getResourceAsStream()でStreamを取得して使えとのこと。

this.getClass().getResourceAsStream(path);

これですんなりExcelを出力できるようになりました。

C#のアプリケーション設定でプリンタ設定(PrinterSettings)を保存・読み込みできるようにする

$
0
0

C#でプリンターの設定(PrinterSettings)を保存する必要があったので、アプリケーション設定で保存するようしました。

しかし、アプリケーションが起動している最中は、設定の読み込み・保存が有効でも、アプリケーションを再起動すると設定が読み込まれない問題に遭遇しました。

いろいろ試した所、標準のやり方ではなく、手動でコードを書く必要があったのでその方法をまとめました。

手順

1.アプリケーション設定で通常通り設定を宣言している場合、削除します
f:id:shinsuke789:20170922101522p:plain

2.アプリケーション設定の上部にある「コードの表示」をクリックします
f:id:shinsuke789:20170922101525p:plain

3.設定用のコードが表示されるので、クラス内に設定名のプロパティで次のようなコードを追記します

[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Configuration.SettingsSerializeAsAttribute(SettingsSerializeAs.Binary)]
public PrinterSettings Printer
{
    get
    {
        return ((PrinterSettings)(this["Printer"]));
    }
    set
    {
        this["Printer"] = value;
    }
}

この場合は、PrinterSettingsという型で保存を行います。
プロパティ名・get/setの[]内には設定名を宣言します。

通常のアプリケーション設定で宣言するとXMLで保存され、それが読み込まれないので設定が復元できないようです。
それを回避するため、上記コードの2行目にある[global::System.Configuration.SettingsSerializeAsAttribute(SettingsSerializeAs.Binary)]を追加してバイナリで保存するようにします。

単純なプロパティのみのクラスで試した所、XML形式で保存され、読み込み・保存とも可能でした。
ひょっとすると一定の階層を超えると復元できないのかもしれません。

4.設定の読み込み・保存は通常通りのコードで可能です。

// 読み込み
PrinterSettings p = Settings.Default.Printer;

// 保存
Settings.Default.Printer = printerSettings;
Settings.Default.Save();

まとめ

stringやintと同じような形でPrinterSettingsを保存しようとして、1日ぐらい悩みました。
こういうときは一晩おくと冷静になって解決方法が見つかるんですよね。

そのおかけでなんとか解決することができました。

基本的にアプリケーション設定にない型を保存する場合は、手動でプロパティを宣言しバイナリで保存するようにした方が良いでしょう。

参考

調査していると、プリンターの設定方法を質問しているページがあったので参考にしました。
やはり同じようにアプリケーションを再起動すると読み込まれないと書かれています。

c# - how to Save PrintDocument .PrinterSettings in a file so that user have not to select printer settings everytime? - Stack Overflow

上記サイトは、base64に変換して保存・読み込みする方法でしたが、そんなことしなくてもバイナリ設定で解決です。

現場ですぐに使える!  VisualBasic 2015 逆引き大全 520の極意

現場ですぐに使える! VisualBasic 2015 逆引き大全 520の極意

LINQでグルーピングした最大の要素を取得する

$
0
0

C#でグルーピングして最大の要素を取得したかったので、試行錯誤して調べた結果、MaxではなくOrderByDescendingを使うことで実現できました。

まだまだLINQは、使い慣れてないのでちょっと特殊なことをしようとするとハマって時間が取られてしまいました…。そんなんでお困りの方、ご参考に。

少し解説すると、以下のようになります。
GroupBy
・第1引数:元の値を何でグループ化するかを指定する
・第2引数:元の値をグループ化したものに対して、キーと値の2つの引数が使え、値に対しての処理を指定する

OrderByDescending
元の値を第1引数で指定したもので昇順に並べ、Firstを指定することで先頭を取得する

サンプルコード

// 値を持つクラスpublicclass Hoge
{
    publicint Key { get; set; }

    publicstring Dt { get; set; }
}

// グルーピングして最大を取得する処理publicvoid Main(string[] args)
{
    // 値の設定
    List<Hoge> list = new List<Hoge> {
	new Hoge() { Key = 1, Dt = "20190101" },
	new Hoge() { Key = 1, Dt = "20190102" },
	new Hoge() { Key = 2, Dt = "20190101" },
	new Hoge() { Key = 3, Dt = "20190310" },
	new Hoge() { Key = 3, Dt = "20190305" },
	new Hoge() { Key = 3, Dt = "20190301" },
	new Hoge() { Key = 4, Dt = "20190101" },
	new Hoge() { Key = 4, Dt = "20190102" },
	new Hoge() { Key = 5, Dt = "20190103" },
    };

    // Key毎にDtが最大の要素を取得
    List<Hoge> retList = list
	.GroupBy(
	    h => h.Key,
	    (k, v) => v.OrderByDescending(o => o.Dt).First())
	.ToList();

    // 結果
    retList.ForEach(f => Console.WriteLine("{0} {1}", f.Key, f.Dt));
}

結果

120190102220190101320190310420190102520190103

Key毎にDtが最大の要素がListに格納されています。

MW WP Formで登録後に自動で投稿する方法

$
0
0

WordPressのフォーム登録プラグイン「MW WP Form」を使って、登録後に自動で投稿する方法を紹介します。
この記事では、登録フォームの設定方法は割愛し、登録後の自動登録の部分のみ説明します。

環境

WordPress 5.2.4
MW WP Form 4.2.0
任意のテーマ

変更箇所

以下に記載のコードを使用中のテーマにある「function.php」に追加します。

フォームで使用するカスタムフィールドを定義する

管理画面の投稿登録画面に登録フォームで使用するカスタムフィールドの入力欄を追加します。
これを設定することで、投稿時に毎回プルダウンからカスタムフィールドを選択する手間が省かれます。

/**
 * 投稿画面で表示するカスタムフィールドのHTMLを定義します。
 * 第2引数で独自の引数を設定することで、textareaまたはtextを生成するようにしています。
 */
function write_html($post, $args) {
    $field_nm = $args['args'][0];
    $type = $args['args'][1];
	
    if ($type == 'textarea') {
        echo '<textareaname="' . $field_nm . '"style="width: 100%; height: 200px;">' . get_post_meta($post->ID, $field_nm, true) . '</textarea>';	
    }
    if ($type == 'text') {
        echo '<inputtype="text"name="' . $field_nm . '"style="width: 100%;"value="' . get_post_meta($post->ID, $field_nm, true) . '"/>';
    }

    wp_nonce_field( 'send_field1' , 'nonce_for_field_1' );
}

/**
 * 投稿画面にカスタムフィールドを表示します。
 * 最後の引数に配列で独自の引数を設定することができます。
 */
function add_custom_meta_box() {
    // 第1引数:項目ごとのdivタグにつくid名(被らないように任意の値)
    // 第2引数:登録フォームの各入力項目のname
    // 第3引数:HTMLを生成するコールバック名
    // 第4引数:適用するページの種別(postで)
    // 第5引数:メタボックスの種別(初期値:advanced)
    // 第6引数:メタボックスの優先度(初期値:default)
    // 第7引数:第3引数のコールバックで使う任意の引数(必要であればarrayで定義)
    add_meta_box('custom_field_1','氏名','write_html','post','advanced','default',array('氏名','text'));
    add_meta_box('custom_field_2','メールアドレス','write_html','post','advanced','default',array('メールアドレス','text'));
}
add_action('admin_menu', 'add_custom_meta_box');

フォーム登録後に投稿する

MW WP Formで作成した登録フォームからデータが登録されたら、投稿するようにします。
処理内容は、投稿を新規登録し、カスタムフィールドを別テーブルに登録します。

function update_meta_posts($Mail_admin, $Data) {

    // 登録フォームから入力データを取得
    $form_data = $Data->getInstance();

    // 投稿新規データを作成(タイトルと公開状態の2つの最低限)	
    $post = array(
        'post_title' => $form_data->get('募集タイトル'),
        'post_status' =>'publish'
    );
    // 上記データで投稿を新規登録
    $post_id = wp_insert_post($post, true);

    // 登録フォームのカスタムフィールドを別テーブルに登録
    update_post_meta($post_id, '氏名', $form_data->get('氏名'));
    update_post_meta($post_id, 'メールアドレス', $form_data->get('メールアドレス'));	
}
// アクションフックを追加
//   第1引数:末尾の数字は、登録フォーム作成時のショートコードを設定
//   第2引数:フック実行時の処理
//   第3・4引数:説明がないので用途は不明(固定値??)
add_action('mwform_before_send_admin_mail_mw-wp-form-8', 'update_meta_posts', 10, 2);

参考サイト

mwform_before_send_admin_mail_mw-wp-form-xxx | MW WP Form


エンジニアのためのWordPress開発入門

エンジニアのためのWordPress開発入門


Gradle4.xから6.xで変更する依存関係の定義

$
0
0

Graldeを4.10.2から6.0.1にバージョンアップしたときに警告やエラーが出たので、そのときに変更した依存関係周りを簡単にまとめました。

個人的にGradleはあまり詳しくないので、今回影響があった部分のみの記載です。

さらに詳細を知りたい方は、参考サイトをご覧ください。

バージョンアップ時のエラー

Gradle6にしてビルド等を走らせると、lombokを使用している場合、認識されずコンパイルが通りません。
いつの間にかGradleの設定方法が変わっていたので、その辺を変更します。

依存関係

ライブラリの依存定義に使う設定名が以下のように変わっています。

compile -> implementation
compile files -> implementation files
runtime -> runtimeOnly
providedCompile -> compileOnly

注釈処理

annotationProcessor」というものを使う必要があります。
以下、Domalombokの場合です。

// Doma
annotationProcessor 'org.seasar.doma:doma:2.19.3' 
implementation 'org.seasar.doma:doma:2.19.3'// lombok
annotationProcessor 'org.projectlombok:lombok:1.18.8'
compileOnly 'org.projectlombok:lombok:1.18.8'

Domaの場合、追加で以下も必要です。書き方が変わっています。

task copyDomaResources(type: Sync)  {
    from sourceSets.main.resources.srcDirs
    into compileJava.destinationDir
    include 'doma.compile.config'
    include 'META-INF/**/*.sql'
    include 'META-INF/**/*.script'
}

compileJava {
	dependsOn copyDomaResources
}

警告の確認

古い定義でもそのまま使えますが、バージョンアップ毎に非推奨の定義があり、将来的に削除されます。
スムーズにバージョンアップするためにも、非推奨定義は別の定義に変更しておいた方が良いです。
非推奨や警告定義の確認は、Gradleの各コマンドで「--warning-mode all」を付与すると出力されます。

gradle build --warning-mode all

MacBook Pro 2019 でログイン時に画面が乱れる現象

$
0
0

2019年末に6年使ったMacBook Proを2019年モデルに買い替えました。

バタフライキーボードに違和感を覚えながらも、使い続けるとタイピングが心地よくなってきて慣れてきました。

そんな中、使い出してから数回目の起動時に、画面が乱れる現象が発生するようになりました。

画面が乱れる現象とは?

本体起動時にまずパスワード入力画面が表示されます。
そこでパスワードを入力しエンターキーを押すと、データ読み込みの進捗バーが表示されます。
そのバーが半分を少し超えた所で一瞬画面が乱れます。
乱れた後は、何事もなかったかのようにデスクトップが表示されます。

画面が乱れたときの画像は次のような感じです。

f:id:shinsuke789:20200215194138p:plain
MacBook Proの画面の乱れ

ログイン時だけなのであまり気にしてなかったのですが、普通に使っている時も極稀に違うタイプの画面のチラつきが発生します。

対処方法は?

Macでは定番のメンテナンスツール「OnyX」でメンテナンスを行うと画面のチラつきは発生しなくなります。
しかし、数回起動を行うとまた同じような現象が発生します。
特に外部モニターに繋げた後の起動は必ず発生しているような感じです。

www.titanium-software.fr

f:id:shinsuke789:20200215194654p:plain
OnyXのメンテナンス画面

まとめ

対処方法を書きましたが、一時的な対処であり根本的な解決には至っていません。

ネットで調べるとMacのハードウェアリセットを試したけど効果がなかったとあったので、リセットはまだ試してません。

何かご存じの方いらっしゃいましたら、コメント頂けたら幸いです。

docker上のPHPでEXIFを使えるようにする

$
0
0

PHPで画像からEXIF情報を取得するには、exif_read_data関数を使います。
しかし、この関数だけでは動作しないのでEXIFモジュールを追加する必要があります。
docker上でEXIFモジュールを追加する方法をまとめました。

動作環境

Mac
・docker
・docker php:7.3-apache

手順

1.Dockerfileに以下を追記します。

RUN && apt-get install -y\
		libfreetype6-dev \
		libjpeg62-turbo-dev \
		libpng-dev \&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/--with-jpeg-dir=/usr/include/\&& docker-php-ext-install -j$(nproc) gd  exif \

2.Dockerfileを実行しイメージを作成します。

3.PHPexif_read_dataを実行しエラーが出ないか確認します。

php.iniに設定を追加する必要はありません。Windows環境の場合、必要です。

MecurialをGitに変換する

$
0
0

愛用しているバージョン管理サービスのbitbucketでMercurialの提供を終了し、Gitに完全移行するということで、既存のMercurialリポジトリをGitに移行してみました。

記事を公開するまでの期間が長かったため、抜けや間違い等があるかもしれないので、参考程度にしてみてください。

動作環境

Mac
Homebrew

環境構築

MecurialをGitに変換するための環境を構築します。

Pythonの確認

$ python --version
Python 2.7.10# インストールされてなければ
$ brew install python2

pipの確認(Pythonのパッケージ管理)

# インストール確認
$ pip
-bash: pip: command not found

# curlでpipを取得
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1764k  100 1764k    00  3484k      0--:--:----:--:----:--:-- 3488k

# pipをインストール
$ python get-pip.py --user
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
Please see https://github.com/pypa/pip/issues/5599for advice on fixing the underlying issue.
To avoid this problem you can invoke Python with '-m pip' instead of running pip directly.
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Collecting pip
  Using cached pip-20.0.2-py2.py3-none-any.whl (1.4 MB)
Collecting wheel
  Using cached wheel-0.33.6-py2.py3-none-any.whl (21 kB)
Installing collected packages: pip, wheel
  WARNING: The scripts pip, pip2 and pip2.7 are installed in'/Users/xxxxx/Library/Python/2.7/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  WARNING: The script wheel is installed in'/Users/xxxxx/Library/Python/2.7/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed pip-20.0.2 wheel-0.33.6# 環境変数を設定
$ vi ~/.bash_profile
export PATH=$PATH:$HOME/Library/Python/2.7/bin

# 環境変数の有効化
$ source ~/.bash_profile

PythonにMecurialをインストール

$ pip install mercurial
DEPRECATION: Python 2.7 reached the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 is no longer maintained. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
Defaulting to user installation because normal site-packages is not writeable
Collecting mercurial
  Downloading mercurial-5.2.2.tar.gz (7.3 MB)
     |████████████████████████████████| 7.3 MB 2.3 MB/s 
Building wheels for collected packages: mercurial
  Building wheel for mercurial (setup.py) ... done
  Created wheel for mercurial: filename=mercurial-5.2.2-cp27-cp27m-macosx_10_14_intel.whl size=2728813sha256=f0b70639c66146acc92e93b5d1325c68d5ab60eee4f62208d43ba4ad1f47821f
  Stored in directory: /Users/xxxxx/Library/Caches/pip/wheels/64/d4/95/33110d3cbdbafbd02d90913d03b12064730908962c08990d68
Successfully built mercurial
Installing collected packages: mercurial
Successfully installed mercurial-5.2.2

作業ディレクトリの作成

任意の場所に作業用ディレクトリを作成します。

MecurialをGitに変換する

変換ツールをダウンロードする

$ git clone https://github.com/frej/fast-export.git

変換

# Mecurialリポジトリに移動
$ cd HgRepo

# コミットログの登録ユーザー名を一覧に出力
$ hg log | grep user: | sort | uniq | sed's/user: *//'> ../authors

# ユーザー名を変換でできる形式に変更
$ vi ../authors
# Mecurialでのユーザー一覧
User1
Yamada Taro
# 上記を以下の形式に書き換えて保存"User1"="User1 <user1@gmail.com>""Yamada Taro"="Yamada Taro <yamada_taro@yahoo.co.jp>"# Mecurialリポジトリ内でGitリポジトリを作成
$ git init

# 変換時にエラーが出るので設定を変更しておく
$ git config core.ignoreCase false# 変換を実行する
$ ../fast-export/hg-fast-export.sh -r . -A ../authors

変換したソースをリモートにプッシュする

# リモート設定
$ git remote add origin https://xxxxx@bitbucket.org/xxxxx/GitRepo.git

# プッシュ
$ git push origin master

# タグを一括でプッシュ
$ git push origin master --tags

MacでPostfixを使ってGmail経由でメールを送信する

$
0
0

メールを送信するサービス等を開発していると、メール送信テストをする必要が出てきます。
開発環境でPostfixを使ってGmail経由でメール送信する方法を紹介します。

環境

macOS:10.14.6
Postfix:3.3.2(デフォルトのまま)

補足

Postfixのバージョン確認

$ postconf | grep mail_version
mail_version =3.2.2
milter_macro_v =$mail_name$mail_version

手順

1.main.cfでメールの設定を行う

$ sudo vi /etc/postfix/main.cf
relayhost =[smtp.gmail.com]:587
mail_spool_directory = /var/spool/mail
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_tls_security_level = may

Postfix2.3以降は「smtp_use_tls = yes」ではなく「smtp_tls_security_level = may」を使います。

http://www.postfix-jp.info/trans-2.3/jhtml/postconf.5.html#smtp_use_tls

smtp_use_tls (デフォルト: no)
この機能はPostfix 2.2以降で使えます。Postfix 2.3以降では smtp_tls_security_level を代わりに使ってください。


2.Googleでアプリパスワードを取得する
以下のサイトを参考にアプリパスワードを取得します。
バイスは「mac」を選択します。
www.howtonote.jp


3.送信時の認証情報を設定する

# 認証情報の作成
$ sudo vi /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 hoge@gmail.com:取得したパスワード

# 権限変更
$ sudo chmod600 /etc/postfix/sasl_passwd

# ハッシュ化
$ sudo postmap /etc/postfix/sasl_passwd


4.スプールを設定する

# ディレクトリ作成
$ sudo mkdir /var/spool/mail

# 所有者・グループの変更
$ sudo chown ログインユーザー名:staff /var/spool/mail

# 権限の変更
$ sudo chmod700 /var/spool/mail


5.Postfixをリロードする

# すでに起動している場合
$ sudo postfix reload# 停止
$ sudo postfix start# 起動
$ sudo postfix stop

5.メール送信テストを行う
送信前に後で説明するメール送信ログの出力を行います。

$ mail hoge@gmail.com(送信先アドレス)
Subject: test# タイトルtest# 本文. # メールを送信する

6.メールが届いているか確認する

メール送信ログ

Macではmaillogが生成されないようなので、メール送信前に以下のコマンドを実行しておきます。

$ log stream --predicate'(process == "smtpd") || (process == "smtp")'--info

次のようなメッセージが表示された場合、メール送信に失敗しています。

(host smtp.gmail.com[74.125.203.108] said: 530-5.7.0 Authentication Required. Learn more at 5305.7.0  https://support.google.com/mail/?p=WantAuthError o8sm917374pjf.37 - gsmtp (in reply to MAIL FROM command))


送信が成功した場合、次のようなメッセージが表示されればOKです。

to=<hoge@gmail.com>, relay=smtp.gmail.com[2404:6800:4008:c01::6d]:587, delay=2.6, delays=0.02/0.04/1.5/1, dsn=2.0.0, status=sent (2502.0.0 OK  1595305690 z25sm18507895pfg.140 - gsmtp)

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

$
0
0

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

物理的なサーバーに触れられるのであれば、外付け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」で「DropboxAPI」を選択する
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", thenselect "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でのアプリ作成で設定されます。
サーバーでの外部バックアップを気楽に行うには、紹介したこの方法が一番手軽な方法かもしれません。

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

$
0
0

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


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

$
0
0

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>

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

$
0
0

環境

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 --list2.5.82.6.62.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)

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

$
0
0

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.hextconf failed, exit code 1Gem 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 モバイルアプリ開発バイブル

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

$
0
0

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
  • メディア:単行本(ソフトカバー)

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

$
0
0

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

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

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

動作環境

旧環境

Windows10
VisualStudioCommunity 2015
.NETFramework4.6.1
CrystalReports13.0.20

新環境

Windows11
VisualStudioCommunity 2019
.NETFramework4.6.1
CrystalReports13.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)」をインストールして下さい。

Viewing all 166 articles
Browse latest View live