ソフラボの技術ブログ

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

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でのアプリ作成で設定されます。
サーバーでの外部バックアップを気楽に行うには、紹介したこの方法が一番手軽な方法かもしれません。

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

メールを送信するサービス等を開発していると、メール送信テストをする必要が出てきます。
開発環境で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 chmod 600 /etc/postfix/sasl_passwd

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


4.スプールを設定する

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

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

# 権限の変更
$ sudo chmod 700 /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 530 5.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 (250 2.0.0 OK  1595305690 z25sm18507895pfg.140 - gsmtp)