実録App Inventor 2日本語版更新作業
App Inventor 2の更新の手順を紹介します
MITからnb187aがリリースされたので日本語版でnb186aをnb187aに更新する手順を紹介します。自分でApp Inventor 2のサーバーを立ち上げたい人は参考にしてください。作業開始後nb187b、nb187cとリリースが続いたので、途中でバージョンが変わっています。今回のMITによる更新はかなり大幅なもので、更新の仕方が分かっていたわけではないので何度も行ったりきたりしながら手探りで作業を進めていて、15日間もかかった今までになく大変な更新作業だったので日付も入れて備忘録も兼ねています。「実録App Inventor 2日本語版更新」なのでこのまま手順をフォローするのはやめてくださいね。
利用者の方はApp Inventor 2日本語版が使えて当然と思っていると思いますが、更新作業はとても手間のかかる作業で、このような地道な作業をする人がいるためにApp Inventor 2日本語版が使えていることをご理解いただき、少しでもいいのでプロジェクト支援を検討してください。プロジェクトをご支援いただける方は下のボタンをクリックしてお願いします。
目次
-
- 2021年8月23日
- 2021年8月24日
- 2021年8月25日
- 2021年8月26日
- 2021年8月28日
- 2021年8月29日
- 2021年8月30,31日
- 2021年9月1,2日
- 2021年9月3日
- 2021年9月10日
- 2021年9月12,13日
2021年8月23日
gitでnb187aをマージしてからCONFLICTを解決
gitが使えるコンピュータに作業用フォルダーを作ってそこで以下のコマンドを実行します。日本語化プロジェクトではmacOS 10.15.7のiMacで作業しています。
$ git clone https://github.com/tmsoftwareinc/appinventor-sources.git
$ cd appinventor-sources/
$ git remote add upstream https://github.com/mit-cml/appinventor-sources.git
$ git checkout appinventorjapan
$ git fetch upstream
次にnb187aのコミットIDを見つけます。我々はSourceTreeを使いました。nb187aのコミットIDは 93a23aa575f74880d392f4032c3070bbbe365546 です。それではnb187aをマージしましょう。
$ git merge 93a23aa575f74880d392f4032c3070bbbe365546
Auto-merging appinventor/docs/html/reference/components/userinterface.html
CONFLICT (content): Merge conflict in appinventor/docs/html/reference/components/userinterface.html
Auto-merging appinventor/docs/html/reference/components/storage.html
CONFLICT (content): Merge conflict in appinventor/docs/html/reference/components/storage.html
Auto-merging appinventor/docs/html/reference/components/maps.html
CONFLICT (content): Merge conflict in appinventor/docs/html/reference/components/maps.html
Auto-merging appinventor/docs/html/reference/components/legomindstorms.html
CONFLICT (content): Merge conflict in appinventor/docs/html/reference/components/legomindstorms.html
Auto-merging appinventor/docs/html/reference/components/layout.html
CONFLICT (content): Merge conflict in appinventor/docs/html/reference/components/layout.html
Auto-merging appinventor/docs/html/reference/components/connectivity.html
CONFLICT (content): Merge conflict in appinventor/docs/html/reference/components/connectivity.html
Auto-merging appinventor/docs/html/reference/components/animation.html
CONFLICT (content): Merge conflict in appinventor/docs/html/reference/components/animation.html
Removing appinventor/blocklyeditor/src/msg/zh_tw/_messages.js
Removing appinventor/blocklyeditor/src/msg/zh_cn/_messages.js
Removing appinventor/blocklyeditor/src/msg/sv/_messages.js
Removing appinventor/blocklyeditor/src/msg/ru/_messages.js
Removing appinventor/blocklyeditor/src/msg/pt_br/_messages.js
Removing appinventor/blocklyeditor/src/msg/pt/_messages.js
Removing appinventor/blocklyeditor/src/msg/pl/_messages.js
Removing appinventor/blocklyeditor/src/msg/nl/_messages.js
Removing appinventor/blocklyeditor/src/msg/lt/_messages.js
Removing appinventor/blocklyeditor/src/msg/ko_kr/_messages.js
Removing appinventor/blocklyeditor/src/msg/it_it/_messages.js
Removing appinventor/blocklyeditor/src/msg/hu/_messages.js
Removing appinventor/blocklyeditor/src/msg/fr_fr/_messages.js
Removing appinventor/blocklyeditor/src/msg/es_es/_messages.js
Removing appinventor/blocklyeditor/src/msg/en/_messages.js
Removing appinventor/blocklyeditor/src/msg/de/_messages.js
CONFLICT (modify/delete): appinventor/blocklyeditor/src/language_switch.js deleted in 93a23aa575f74880d392f4032c3070bbbe365546 and modified in HEAD. Version HEAD of appinventor/blocklyeditor/src/language_switch.js left in tree.
Removing appinventor/blocklyeditor/plovrConfigAI3.js
Auto-merging appinventor/blocklyeditor/ploverConfig.js
CONFLICT (content): Merge conflict in appinventor/blocklyeditor/ploverConfig.js
Auto-merging appinventor/appengine/war/index.html
CONFLICT (content): Merge conflict in appinventor/appengine/war/index.html
Auto-merging appinventor/appengine/war/WEB-INF/appengine-web.xml
Auto-merging appinventor/appengine/src/com/google/appinventor/client/languages.json
Auto-merging appinventor/appengine/src/com/google/appinventor/client/Ode.java
Auto-merging appinventor/appengine/src/com/google/appinventor/YaClient.gwt.xml
CONFLICT (content): Merge conflict in appinventor/appengine/src/com/google/appinventor/YaClient.gwt.xml
Auto-merging appinventor/appengine/build.xml
CONFLICT (content): Merge conflict in appinventor/appengine/build.xml
Automatic merge failed; fix conflicts and then commit the result.
たくさんCONFLICTが出てきました。これをひとつずつ解決していきます。すべて解決できたらコミットします。
DockerコンテナでApp Inventor 2をビルド
App Inventor 2をビルドする環境を入れたdockerコンテナを使ってビルドします。日本語化プロジェクトでは以下のDockerfileで作ったコンテナを使っています。かなり以前に作ったのでソフトのバージョンは古いものになっています。
FROM ubuntu:18.04
# Build with
# docker build -t ai2 .
RUN apt-get update
RUN apt-get install -y curl unzip
# Install prerequisites
# python3 is need for i18n.py and pre-installed
RUN apt-get install -y python
RUN apt-get install -y openjdk-8-jdk
RUN apt-get install -y lib32z1
RUN apt-get install -y lib32ncurses5
RUN apt-get install -y lib32stdc++6
# Install other useful tools
RUN apt-get install -y git vim ant sudo android-tools-adb
# Install phantomJS
RUN apt-get install -y phantomjs
# Clean up
RUN apt-get clean
RUN apt-get purge
# Add user
RUN useradd -ms /bin/bash ubuntu
# Install Google App Engine SDK
RUN curl 'https://storage.googleapis.com/appengine-sdks/featured/appengine-java-sdk-1.9.72.zip' > /tmp/appengine.zip && unzip -d /home/ubuntu /tmp/appengine.zip && rm /tmp/appengine.zip
# Install Google cloud SDK
RUN curl 'https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-239.0.0-linux-x86_64.tar.gz' > /tmp/gcloud.tgz && cd /home/ubuntu && tar zxvf /tmp/gcloud.tgz
EXPOSE 8888 5037
USER ubuntu
ENV HOME /home/ubuntu
ENV PATH $PATH:$HOME/google-cloud-sdk/bin
dockerコンテナを起動します。
docker restart コンテナ名
docker attach コンテナ名
コミットしたApp Inventor 2をコンテナにコピーします。macOSの~/Publicフォルダーをコンテナの/home/exportにマウントしているので簡単です。/home/ubuntu/appinventor-sourcesを作ります。
それでは以下の手順でビルドしましょう。
cd appinventor-sources/
git submodule update --init
cd appinventor/
ant clean
ant MakeAuthKey
ant
出力が延々と続きますが、結局以下のメッセージが出てビルドに失敗しました。
BUILD FAILED
/home/ubuntu/appinventor-sources/appinventor/build.xml:16: The following error occurred while executing this line:
/home/ubuntu/appinventor-sources/appinventor/appengine/build.xml:581: Java returned: 137
Total time: 4 minutes 7 seconds
ここからエラーの原因を突き止める作業に入ります。まず確認のためにから英語版のnb187aをコンテナでビルドしてみます。
rm appinventor-sources/
git clone https://github.com/mit-cml/appinventor-sources.git
cd appinventor-sources/
git submodule update --init
cd appinventor/
ant clean
ant MakeAuthKey
ant
マージした日本語版と同じエラーでビルドに失敗しました。
YaClientApp:
[mkdir] Created dir: /home/ubuntu/appinventor-sources/appinventor/appengine/build/extra
[java] Compiling module com.google.appinventor.YaClient-dev
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to DEBUG or WARN to see all errors.
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
[java] Computing all possible rebind results for 'com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource'
[java] Rebinding com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/editor/youngandroid/blockly.js
[java] Computing all possible rebind results for 'com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport'
[java] Rebinding com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/utils/html5dnd.js
[java] Compiling 1 permutation
[java] Compiling permutation 0...
BUILD FAILED
/home/ubuntu/appinventor-sources/appinventor/build.xml:16: The following error occurred while executing this line:
/home/ubuntu/appinventor-sources/appinventor/appengine/build.xml:581: Java returned: 137
Total time: 3 minutes 16 seconds
ビルド失敗原因の究明
ここまでで分かったことは、
1) nb186aまでは英語版、日本語版共にビルドに成功
2) nb187aだと英語版、日本語版共にビルドに失敗
3) MITではnb187aがビルドできている
4) エラーメッセージからは原因はわからない
これらの事実から仮説を立て検証します。
1) nb187a日本語版に問題がある
英語版でのビルドにも失敗しているので無し
2) dockerコンテナの環境に問題がある
可能性あり
dockerコンテナの環境に問題があると言っても確実にビルドできる環境がわからないとどうしようもないので、今まで真面目に読む必要が無かったGitHub(https://github.com/mit-cml/appinventor-sources)のREADMEを読み直してみます。すると簡単にビルドするにはvagrantを使うといいよ、との記述が。nb187a英語版で早速やってみます。作業に使っているのはmacOS 10.15.7, 16GBメモリーの27インチiMac(2017)です。
https://www.vagrantup.com/からvagrant_2.2.18_x86_64.dmgをダウンロードしてインストール https://www.virtualbox.org/wiki/DownloadsからVirtualBox-6.1.26-145957-OSX.dmgをダウンロードしてインストール vagrant plugin install vagrant-vbguest 適当なフォルダー、例えば~/Documents/AI2_Repositories/tmp/を作って mac> git clone https://github.com/mit-cml/appinventor-sources.git mac> cd appinventor-sources mac> vagrant up mac> vagrant ssh これでVirutalBoxのubuntu 18.04にログインできるのでビルドします ubuntu> ant
以下のメッセージが出てビルドに失敗しました。
BlocklyCompile:
[java] Exception in thread "main" java.lang.IllegalArgumentException: File not found at: /vagrant/appinventor/blocklyeditor/../lib/closure-library/closure/goog
[java] at com.google.common.base.Preconditions.checkArgument(Preconditions.java:88)
[java] at org.plovr.Manifest.getInputs(Manifest.java:393)
[java] at org.plovr.Manifest.getFiles(Manifest.java:369)
[java] at org.plovr.Manifest.getFiles(Manifest.java:363)
[java] at org.plovr.Manifest.getAllDependencies(Manifest.java:324)
[java] at org.plovr.Manifest.getInputsInCompilationOrder(Manifest.java:193)
[java] at org.plovr.Manifest.getCompilerArguments(Manifest.java:177)
[java] at org.plovr.CompileRequestHandler.compile(CompileRequestHandler.java:94)
[java] at org.plovr.cli.BuildCommand.runCommandWithOptions(BuildCommand.java:58)
[java] at org.plovr.cli.BuildCommand.runCommandWithOptions(BuildCommand.java:31)
[java] at org.plovr.cli.AbstractCommandRunner.runCommand(AbstractCommandRunner.java:41)
[java] at org.plovr.cli.Command.execute(Command.java:47)
[java] at org.plovr.cli.Main.mainWithExitCode(Main.java:56)
[java] at org.plovr.cli.Main.main(Main.java:30)
BUILD FAILED
/vagrant/appinventor/build.xml:16: The following error occurred while executing this line:
/vagrant/appinventor/build-common.xml:299: The following error occurred while executing this line:
/vagrant/appinventor/blocklyeditor/build.xml:118: Java returned: 1
2021年8月24日
エラーメッセージを読んでみるとclosure-libraryが無いせいで失敗しているようです。これはREADMEの後の方に書いてありますが、git submodule update –init が必要みたいなので、やってみます。ちなみにdockerコンテナでビルドするときは git submodule update –init は手順に入っていました。
ubuntu> git submodule update --init
ubuntu> ant
BUILD SUCCESSFUL
Total time: 5 minutes 32 seconds
やっとビルドに成功しました。これでdockerコンテナでビルドできない原因の調査ができます。
GitHubからcloneしたApp Inventorには次のVagrantfileがあり、vagrant upした時にこのファイルからコンテナを作ります。ベースになっているのはubuntu/bionic64=ubuntu 18.04でdockerコンテナで使っているものと同じです。
# -*- mode: ruby -*-
# vi: set ft=ruby :
# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/bionic64"
config.vm.boot_timeout = 400
config.vm.provider "virtualbox" do |v|
v.name = "ForAppinventor2-bionic64"
v.memory = "4096"
v.customize ["modifyvm", :id, "--usb", "on"]
# fix for slow network
v.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
v.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
v.customize ["modifyvm", :id, "--nictype1", "virtio"]
end
config.vm.provision :shell, path: "bootstrap.sh"
config.vm.network :forwarded_port, guest: 8888, host: 8888
config.vm.network :forwarded_port, guest: 9876, host: 9876
config.vm.network :forwarded_port, guest: 9990, host: 9990
end
そして次のbootstrap.shを参照して様々なソフトをインストールします。
#!/usr/bin/env bash
dpkg --add-architecture i386
# Install dependencies
apt-get update
apt-get upgrade -y
apt-get install -y libc6:i386 libstdc++6:i386 glibc-doc:i386 gcc-5-base:i386 gcc-6-base:i386 libgcc1:i386 \
openjdk-8-jdk zip unzip ant lib32z1 adb phantomjs
# Install App Engine
mkdir -p /opt/appengine
cd /opt/appengine
wget --no-verbose -O /tmp/appengine.zip https://storage.googleapis.com/appengine-sdks/featured/appengine-java-sdk-1.9.68.zip
unzip -o /tmp/appengine.zip
# Configure shell
echo "export PATH=$PATH:/opt/appengine/appengine-java-sdk-1.9.68/bin" >> /home/vagrant/.bashrc
echo "cd /vagrant/appinventor" >> /home/vagrant/.bashrc
# Configure java
update-java-alternatives -s java-1.8.0-openjdk-amd64
# Make the auth key in advance
cd /vagrant/appinventor
sudo -u vagrant ant MakeAuthKey
# Helper script for starting App Inventor dev server
cat < /usr/local/bin/start_appinventor
ant RunLocalBuildServer &> buildserver.log &
BUILDSERVER=$!
dev_appserver.sh -p 8888 -a 0.0.0.0 appengine/build/war
kill -9 -- -$BUILDSERVER
EOF
chmod +x /usr/local/bin/start_appinventor
ここでインストールしているのと同じソフトをインストールしたdockerコンテナを作ってみましょう。
2021年8月25日
ubuntu 18.04から新しくdockerコンテナを作り、bootstrap.shにあるコマンドを順に実行していきます。全部インストールできたら英語版nb187aを次の手順でビルドしてみます。
git clone https://github.com/mit-cml/appinventor-sources.git
cd appinventor-sources/
git submodule update --init
cd appinventor/
ant clean
ant MakeAuthKey
ant
結果は残念ながら失敗でした。
YaClientApp:
[mkdir] Created dir: /home/ubuntu/appinventor-sources/appinventor/appengine/build/extra
[java] Aug 25, 2021 9:06:30 PM java.util.prefs.FileSystemPreferences$1 run
[java] INFO: Created user preferences directory.
[java] Compiling module com.google.appinventor.YaClient-dev
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to DEBUG or WARN to see all errors.
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
[java] Computing all possible rebind results for 'com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource'
[java] Rebinding com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/editor/youngandroid/blockly.js
[java] Computing all possible rebind results for 'com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport'
[java] Rebinding com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/utils/html5dnd.js
[java] Compiling 1 permutation
[java] Compiling permutation 0...
[java] Compile of permutations succeeded
[java] Compilation succeeded -- 225.904s
BUILD FAILED
/home/ubuntu/appinventor-sources/appinventor/build.xml:16: The following error occurred while executing this line:
この後たまたまあったubuntu 18.04をインストールしたパソコンでビルドを試してみたところ、ビルドに成功しました。だとするとdockerの問題としか考えられなくなりました。そうこうしているうちにnb187bがリリースされます。これでdockerコンテナでもビルドできるようになったことを期待します。
2021年8月26日
ダメでした。英語版nb187bでもdockerコンテナでは全く同じエラーでビルドに失敗しました。
ここまでくると精神的にも時間的にもきつくなってきたので、今まで長年使ってきたdockerコンテナを諦めてパソコンubuntu 18.04でデプロイまでやろうということになりました。この判断がビルド失敗の原因を発見することに間接的につながります。dockerコンテナを追求していたらデプロイできなかったと思います。ユーザーの皆さんごめんなさい、App Inventor 2日本語版は今後最新版に更新できなくなりました、理由はMITがわけのわからない更新をしたためです、ってメールで許してもらえるかな?とまで考えました。
パソコンubuntu 18.04でデプロイを試す
App Inventor 2はGoogleのクラウドサービスのApp Engineを使っていて、GUI部分はこのApp Engineにデプロイすることになります。デプロイするにはビルドできたら以下コマンドを使います。gcloudはGoogle Cloudコマンドラインツールです。https://cloud.google.com/sdk/docs/quickstart-linuxを参考にインストールします。
gcloud app deploy appinventor-sources/appinventor/appengine/build/war/WEB-INF/appengine-web.xml
はい、失敗しました。ここまでくると失敗しても、あっまた、って感じです。
Beginning deployment of service [default]...
ERROR: (gcloud.app.deploy) Cannot upload file
[/tmp/tmp27ys7jo_/tmp6n000ge4/ode/4F75BDCDDD4332BEA20CD44DCAF54733.cache.js],
which has size [46468038] (greater than maximum allowed size of
[33554432]). Please delete the file or add to the skip_files entry in
your application .yaml file and try again.
このエラーは見覚えがあります。nb185aのデプロイの時に同じエラーが起きてかわしています。https://community.appinventor.mit.edu/t/deploy-app-inventor-failed-on-google-app-engine/2574/4 にかわし方があるので、これにしたがってソースを変更します。と思ってソースをみると既に変更されていました。もちろん条件付きで。いろいろソースを探っていくと、appengine/build.xmlとblocklyeditor/build.xmlに<property name="release" value="false"/>とあります。これですね。falseをtrueに変えてビルドです。これでデプロイできる、と思ったらさすがMIT、そう簡単には終わらせてくれません。
YaClientApp:
[mkdir] Created dir: /home/tam/Projects/AppInventor/AI2_Repositories/AI2_git_20210825/appinventor-sources/appinventor/appengine/build/extra
[java] Compiling module com.google.appinventor.YaClient
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to DEBUG or WARN to see all errors.
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
[java] Computing all possible rebind results for 'com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource'
[java] Rebinding com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/editor/youngandroid/blockly.js
[java] Computing all possible rebind results for 'com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport'
[java] Rebinding com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/utils/html5dnd.js
[java] Compiling 34 permutations
[java] Compiling permutation 0...
BUILD FAILED
/home/tam/Projects/AppInventor/AI2_Repositories/AI2_git_20210825/appinventor-sources/appinventor/build.xml:16: The following error occurred while executing this line:
/home/tam/Projects/AppInventor/AI2_Repositories/AI2_git_20210825/appinventor-sources/appinventor/appengine/build.xml:581: Java returned: 137
vagrantならさすがにビルドできるはず、と思ってリリースモードでビルドしたところ、失敗。ここまでくるとMITに嫌がらせをされているんではないかという感じです。実際MIT以外でApp Inventor 2を動かせないようにしたんじゃないかと思いました。
YaClientApp:
[mkdir] Created dir: /vagrant/appinventor/appengine/build/extra
[java] Aug 26, 2021 7:27:55 PM java.util.prefs.FileSystemPreferences$1 run
[java] INFO: Created user preferences directory.
[java] Compiling module com.google.appinventor.YaClient
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to DEBUG or WARN to see all errors.
[java] Ignored 3 units with compilation errors in first pass.
[java] Compile with -strict or with -logLevel set to TRACE or DEBUG to see all errors.
[java] Computing all possible rebind results for 'com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource'
[java] Rebinding com.google.appinventor.client.editor.youngandroid.BlocklyPanel.BlocklySource
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/editor/youngandroid/blockly.js
[java] Computing all possible rebind results for 'com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport'
[java] Rebinding com.google.appinventor.client.utils.HTML5DragDrop.HTML5DragDropSupport
[java] Invoking generator com.google.gwt.query.rebind.JsniBundleGenerator
[java] JsniBundleGenerator - importing external javascript: com/google/appinventor/client/utils/html5dnd.js
[java] Compiling 34 permutations
[java] Compiling permutation 0...
[java] Process output
[java] #
[java] # There is insufficient memory for the Java Runtime Environment to continue.
[java] # Native memory allocation (mmap) failed to map 60817408 bytes for committing reserved memory.
[java] # An error report file with more information is saved as:
[java] # /vagrant/appinventor/appengine/hs_err_pid24224.log
[java] [ERROR] OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000db600000, 60817408, 0) failed; error='Cannot allocate memory' (errno=12)
[java] Process output
[java] [ERROR] OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x000000008ee00000, 524288, 0) failed; error='Cannot allocate memory' (errno=12)
[java] #
[java] # There is insufficient memory for the Java Runtime Environment to continue.
[java] # Native memory allocation (mmap) failed to map 524288 bytes
[java] Process output
[java] Compiling
[java] Compiling permutation 5...
[java] Process output
[java] Compiling
[java] Compiling permutation 1...
[java] Process output
[java] #
[java] # There is insufficient memory for the Java Runtime Environment to continue.
[java] # Native memory allocation (mmap) failed to map 116391936 bytes for committing reserved memory.
[java] [ERROR] OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000094300000, 116391936, 0) failed; error='Cannot allocate memory' (errno=12)
[java] # An error report file with more information is saved as:
[java] # /vagrant/appinventor/appengine/hs_err_pid24233.log
[java] Compiling permutation 8...
[java] #
[java] [ERROR] OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000f3980000, 30932992, 0) failed; error='Cannot allocate memory' (errno=12)
[java] # There is insufficient memory for the Java Runtime Environment to continue.
[java] # Native memory allocation (mmap) failed to map 30932992 bytes for committing reserved memory.
[java] # An error report file with more information is saved as:
[java] # /vagrant/appinventor/appengine/hs_err_pid24238.log
[java] [WARN] Lost communication with remote process
[java] java.io.EOFException
[java] at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3078)
[java] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1618)
[java] at java.io.ObjectInputStream.readObject(ObjectInputStream.java:503)
[java] at java.io.ObjectInputStream.readObject(ObjectInputStream.java:461)
[java] at com.google.gwt.dev.ExternalPermutationWorkerFactory$ExternalPermutationWorker.compile(ExternalPermutationWorkerFactory.java:154)
[java] at com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74)
[java] at java.lang.Thread.run(Thread.java:748)
[java] Compiling
[java] Compiling permutation 9...
[java] Compiling permutation 10...
[java] Compiling
[java] Compiling permutation 11...
[java] Compiling permutation 12...
[java] Compiling
[java] Compiling permutation 13...
[java] Compiling permutation 14...
[java] Compiling
[java] Compiling permutation 15...
[java] Compiling permutation 16...
[java] Compiling
[java] Compiling permutation 17...
[java] Compiling permutation 18...
[java] Compiling
[java] Compiling permutation 19...
[java] Compiling permutation 20...
[java] Compiling
[java] Compiling permutation 21...
[java] Compiling permutation 22...
[java] Compiling
[java] Compiling permutation 23...
[java] Compiling permutation 24...
[java] Compiling
[java] Compiling permutation 25...
[java] Compiling permutation 26...
[java] Compiling
[java] Compiling permutation 27...
[java] Compiling permutation 28...
[java] Compiling
[java] Compiling permutation 29...
[java] Compiling permutation 30...
[java] Compiling
[java] Compiling permutation 31...
[java] Compiling permutation 32...
[java] Compiling
[java] Compiling permutation 33...
[java] Compiling permutation 4...
[java] Compiling
[java] Compiling permutation 3...
[java] Compiling permutation 2...
[java] [ERROR] Compile failed
[java] java.lang.OutOfMemoryError
[java] at java.io.RandomAccessFile.readBytes(Native Method)
[java] at java.io.RandomAccessFile.read(RandomAccessFile.java:377)
[java] at java.io.RandomAccessFile.readFully(RandomAccessFile.java:436)
[java] at java.io.RandomAccessFile.readFully(RandomAccessFile.java:416)
[java] at com.google.gwt.dev.util.DiskCache.readByteArray(DiskCache.java:77)
[java] at com.google.gwt.dev.util.DiskCache.readObject(DiskCache.java:94)
[java] at com.google.gwt.dev.jjs.UnifiedAst.getFreshAst(UnifiedAst.java:128)
[java] at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:322)
[java] at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:272)
[java] at com.google.gwt.dev.CompilePerms.compile(CompilePerms.java:198)
[java] at com.google.gwt.dev.CompilePermsServer.compilePermutation(CompilePermsServer.java:313)
[java] at com.google.gwt.dev.CompilePermsServer.run(CompilePermsServer.java:276)
[java] at com.google.gwt.dev.CompilePermsServer.main(CompilePermsServer.java:239)
[java] [ERROR] Out of memory; to increase the amount of memory, use the -Xmx flag at startup (java -Xmx128M ...)
[java] [ERROR] Error from external worker
[java] java.lang.OutOfMemoryError
[java] at java.io.RandomAccessFile.readBytes(Native Method)
[java] at java.io.RandomAccessFile.read(RandomAccessFile.java:377)
[java] at java.io.RandomAccessFile.readFully(RandomAccessFile.java:436)
[java] at java.io.RandomAccessFile.readFully(RandomAccessFile.java:416)
[java] at com.google.gwt.dev.util.DiskCache.readByteArray(DiskCache.java:77)
[java] at com.google.gwt.dev.util.DiskCache.readObject(DiskCache.java:94)
[java] at com.google.gwt.dev.jjs.UnifiedAst.getFreshAst(UnifiedAst.java:128)
[java] at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:322)
[java] at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.compilePermutation(JavaToJavaScriptCompiler.java:272)
[java] at com.google.gwt.dev.CompilePerms.compile(CompilePerms.java:198)
[java] at com.google.gwt.dev.CompilePermsServer.compilePermutation(CompilePermsServer.java:313)
[java] at com.google.gwt.dev.CompilePermsServer.run(CompilePermsServer.java:276)
[java] at com.google.gwt.dev.CompilePermsServer.main(CompilePermsServer.java:239)
[java] [ERROR] Out of memory; to increase the amount of memory, use the -Xmx flag at startup (java -Xmx128M ...)
[java] [ERROR] Unrecoverable exception, shutting down
[java] com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries)
[java] at com.google.gwt.dev.ExternalPermutationWorkerFactory$ExternalPermutationWorker.compile(ExternalPermutationWorkerFactory.java:157)
[java] at com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74)
[java] at java.lang.Thread.run(Thread.java:748)
[java] [ERROR] Not all permutation were compiled , completed (30/34)
BUILD FAILED
/vagrant/appinventor/build.xml:16: The following error occurred while executing this line:
/vagrant/appinventor/appengine/build.xml:581: Java returned: 1
でもちょっと待ってくださいよ。vagrantだとエラーメッセージが長くなっている。注目したのはここ
[java] # There is insufficient memory for the Java Runtime Environment to continue.
[java] # Native memory allocation (mmap) failed to map 60817408 bytes for committing reserved memory.
メモリー不足?App inventorについてきたVagrantfileでは4GBメモリーを取っています。今までビルドできていたdockerコンテナは2GBメモリーを取っています。とりあえずVagrantfile 17行目を変更してメモリーを6GBにしてリリースビルド。
v.memory = "4096" -> v.memory = "6144"
コンテナから強制ログアウトされてしまいました。iMacで不要なソフトを止めてリリースビルドやり直すも、またメモリー不足エラー。Vagrantfile 17行目を変更してメモリーを8GBにしてリリースビルド。やっと成功。パソコンubuntu 18.04は物理メモリー3GBしか積んでいないのでビルド環境に使えないことが確定。
vagrantにGoogle CloudコマンドラインツールをインストールしてApp Engineにデプロイ。ここではステージング環境のApp Engineにデプロイしているので本番環境に影響はありません。ようやくデプロイ成功!長い道のりでした。
2021年8月28日
gitでnb187bをマージしてからCONFLICTを解決
英語版nb187bのデプロイに成功したので日本語版nb187bのデプロイを試します。前回と同じ日本語化する手順にしたがって日本語版nb187bを作ります。
ここでもしかしたらdockerコンテナもメモリー増やせばビルドできるんじゃないかと思いつき、実行。とりあえず2GBから4GBに増やして開発ビルドしたところ、なんと成功!リリースビルドはやはり失敗。
これ以上の作業は物理メモリー16GBのiMacでは無理なのでamazonで一昨日購入した32GB RAM($187)が届いてから続きの作業。使っている27インチiMac(2017)は最大64GBまでメモリー増設可能なのです。このiMacはamazonで$1500でApp Inventor 2の作業用に購入した改修品です。安くあげるために内臓HDはFusion Driveにしたので外付け1TB SSD($176)から起動してます。27インチiMacでメモリー16GB+1TB SSDにすると$2500くらいまで軽くいきますからね。
iMacのメモリーを48GBに増設してdockerコンテナでリリースビルドできるメモリー量を探したところ、10GBでもダメなので思い切って16GBにしたところ無事成功!今まで2GBでビルドできていたことを考えるとMITはなんということをしてくれたんだという感じです。MITはお金があるだろうから16GBくらいどうってことないかもしれないけど。
2021年8月29日
デプロイ前に動作確認
デプロイする前にdockerコンテナでローカル環境で動作確認することにします。次のコマンドでサーバーを起動するとローカルマシンの8888ポートにアクセスすることでApp Inventor 2が起動できます。
appengine-java-sdk-1.9.72/bin/dev_appserver.sh --port=8888 --address=0.0.0.0 appinventor-sources/appinventor/appengine/build/war/
ブラウザを立ち上げて次のURLにアクセスします。が、メニューが日本語で表示されません。
http://127.0.0.1:8888/??locale=ja_JP
言語選択ドロップダウンメニューにも日本語がありません。多言語対応部分が変更されているようです。どこが変更されたか調べているうちにあっという間に時間が過ぎ去りました。
2021年8月30,31日
多言語変更部分調査と日本語追加
言語選択ドロップダウンメニューを定義しているのは appinventor/appengine/src/com/google/appinventor/YaClient.gwt.xml の終わりの方ですが、ここから日本語がなくなっていました。gitでマージした時のCONFLICT解決の時に失敗して消したようです。英語の次に追加し直しました。
<!-- English language, independent of country -->
<extend-property name="locale" values="en"/>
<!-- Japanese -->
<extend-property name="locale" values="ja_JP"/>
それでもまだメニューが日本語になりません。appinventor/blocklyeditor/src/msg/ja_jp/_messages.js でかなりの量の日本語の翻訳をしていたんですが、gitでマージした時に他の言語の*/_messages.jsが無くなって代わりにmessage_*.json(例えばappinventor/blocklyeditor/src/msg/zh_tw/_messages.jsが無くなってappinventor/blocklyeditor/src/msg/ai_blockly/messages_zh_TW.json)が追加されています。ということでappinventor/blocklyeditor/src/msg/ja_jp/_messages.jsからappinventor/blocklyeditor/src/msg/ai_blockly/messages_ja.jsonを作ったところ、メニューが日本語になりました。JavaScriptファイルをJSONファイルに変換するのにはpythonを使いました。こんな感じです。
ja_jp/_messages.js
Blockly.Msg.DUPLICATE_BLOCK = '複製';
Blockly.Msg.REMOVE_COMMENT = 'コメント削除';
Blockly.Msg.ADD_COMMENT = 'コメント追加';
messages_ja.json
"Blockly.Msg.DUPLICATE_BLOCK": "複製",
"Blockly.Msg.REMOVE_COMMENT": "コメント削除",
"Blockly.Msg.ADD_COMMENT": "コメント追加",
ついでながらappengine/build.xmlとblocklyeditor/build.xmlに<property name="release" value="false"/>を変更しなくてもリリースビルドはこれでできることがわかりました。
ant -Drelease=true noplay
2021年9月1,2日
dockerコンテナでローカル環境で動作確認です。すべての日本語が表示されているか見ていくと、日本語だけではなく韓国語や中国語が???になっている所があります。よくわからないので、vagrantでリリースビルドしてみます。ところが英語版nb187bはメモリー8GBでリリースビルドできたのに今回は失敗。
[ERROR] OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000f4780000, 34603008, 0) failed; error='Cannot allocate memory' (errno=12)
[java] #
[java] # There is insufficient memory for the Java Runtime Environment to continue.
[java] # Native memory allocation (mmap) failed to map 34603008 bytes for committing reserved memory.
[java] # An error report file with more information is saved as:
[java] # /vagrant/appinventor/appengine/hs_err_pid28463.log
[java] [WARN] Lost communication with remote process
[java] java.io.EOFException
[java] at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:3078)
[java] at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1618)
[java] at java.io.ObjectInputStream.readObject(ObjectInputStream.java:503)
[java] at java.io.ObjectInputStream.readObject(ObjectInputStream.java:461)
[java] at com.google.gwt.dev.ExternalPermutationWorkerFactory$ExternalPermutationWorker.compile(ExternalPermutationWorkerFactory.java:154)
[java] at com.google.gwt.dev.PermutationWorkerFactory$Manager$WorkerThread.run(PermutationWorkerFactory.java:74)
[java] at java.lang.Thread.run(Thread.java:748)
[java] [WARN] Lost communication with remote process
エラーメッセージから明らかにメモリー不足なので、vagrantのメモリーを増やしていって16GBでリリースビルド成功。これでローカル環境で動作確認したところ、正常に日本語が表示できました。
ステージング環境にGUIデプロイ
ステージング環境にGUIをデプロイしてみます。使うコマンドはこれです。無事成功しました。ステージング環境ですべてうまく日本語表示されました。
bootstrap.shにgcloudを追加
新規にvagrant upをした時にGoogle Cloudコマンドラインツールもインストールされるようにbootstrap.shに次の部分を追加しました。
# Install gcloud
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
apt-get install -y apt-transport-https ca-certificates gnupg
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
apt-get update && sudo apt-get install -y google-cloud-sdk
apt-get install -y google-cloud-sdk-app-engine-java
ステージング環境でフルテスト
GUI部分は無事に動いたので、ビルドサーバーもステージング環境にデプロイしてすべての機能をテストします。まずはビルドサーバーのIPアドレス(XXX.XXX.XXX.XXX)をappinventor/appengine/war/WEB-INF/appengine-web.xml の87行の以下の部分に入力します。ビルドサーバー用のGoogle Cloud Compute EngineはUbuntu 18.04.3 LTSで動いています。
<pproperty name="build.server.host" value="XXX.XXX.XXX.XXX:9990"></property>
バージョン表示が綺麗になるように、gitコミットしてタグを付け直します。これをしないとバージョンがv187b_jp-1-g4c3702dcのようになります。git describe –dirty で表示されるのがGUIで表示されるバージョンです。できたらビルドします。
git add /vagrant/appinventor/appengine/war/WEB-INF/appengine-web.xml; git commit -m "Added build server IP"
git tag -d v187b_jp
git tag -a v187b_jp
git describe --dirty
v187b_jp
ant clean
ant -Drelease=true noplay
ステージング環境にこのコマンドでGUIをデプロイしたら、ビルドサーバーのtarファイルを作ります。
On vagrant
cd appinventor/buildserver
ant BuildDeploymentTar
appinventor/build/buildserver/BuildServer.tar ができるので、これから次の手順で forbuild-nb187b.tgz を作りビルドサーバーにアップロードします。
On iMac
mkdir for-BuildServer
cp -p appinventor-sources/appinventor/build/buildserver/BuildServer.tar for-BuildServer/
cp -p appinventor-sources/appinventor/misc/buildserver/launch-buildserver for-BuildServer/
tar cfz forbuild-nb187b.tgz for-BuildServer/
ビルドサーバー用のCompute Engineにログインして、以下コマンドでビルドサーバーを起動します。
tar xvfz forbuild-nb187b.tgz
Cd for-BuildServer
tar -xf BuildServer.tar
./launch-buildserver --maxSimultaneousBuilds 4
一部メニューを日本語化
結構前のリリースから気になっていたんですが、一部のメニューがまだ日本語化されていません。SettingsとかView Trashとかです。理由はApp Inventor 2自体が多言語に対応していなかったからなんですが、今回ソースを見直してみると多言語対応しているので日本語化しました。MITのApp Inventor 2ではまだ多言語対応していません。ハングルだとこんな感じですね。
変更したファイルは appinventor/appengine/src/com/google/appinventor/client/OdeMessages_ja_JP.properties で、次の部分を追加しました。
showExportAndroidApk=アンドロイドアプリ(.apk)
showExportAndroidAab=アンドロイドアプリバンドル(.aab)
trashButton=ゴミ箱を表示
viewTrashTabName=ゴミ箱を表示
trashButton=ゴミ箱を表示
myProjectsButton=私のプロジェクト
restoreProjectButton=元に戻す
deleteFromTrashButton=ゴミ箱から削除
showEmptyTrashMessage=ゴミ箱は空です
settingsTabName=設定
disableAutoload=プロジェクトの自動ロードを無効化
enableOpenDyslexic=OpenDyslexicを有効化
これで改めてビルドしてステージング環境にデプロイしてテストします。今度はGUI部分からHelloCodiプロジェクトを開いてビルド -> アンドロイドアプリ(.apk)でビルドしてみます。成功しました!
2021年9月3日
GitHubにプッシュ
うまく動いたのでGitHubにプッシュします。タグはnb187b_jpにしました。後でユーザーの方にご指摘いただいたのですが、このプッシュの時に日本語ファイルの appinventor/blocklyeditor/src/msg/ai_blockly/messages_ja.json を入れ忘れました。今回の更新はまるでスムーズにいかなかったせいか、こうしたポカが多いですね。プッシュした後でGitHubからcloneしてテストビルドは2回もしたんですけど。
これでデプロイしてようやく終わりかと思ったらMITからnb187cがリリースされました。でもGitHubにはプッシュされません。
2021年9月10日
いつまで経ってもnb187_cがGitHubにはプッシュされないのでMITに問い合わせたところ、nb187cはMIT内部変更なのでプッシュしないとか。それならそうと言ってよね、待ってる人もいるんだから。
ということでGitHubにnb187c_jpタグをプッシュして完成。後は本番機デプロイ。
本番環境にデプロイ
作業自体はステージング環境デプロイと同じです。違うのはApp EngineのプロジェクトとビルドサーバーのIPアドレスだけです。デプロイ後GUIとビルド -> アンドロイドアプリ(.apk)が正常に動くことを確認します。ここで漏れがあるんですけどね。
一応完了しました!nb187c_jpリリースです。
2021年9月12,13日
日本語未表示バグ
ユーザーの方からtwitter経由で組み込みブロック内の命令が日本語になっていない旨、お知らせいただきました。とってもありがたかったです。日本語化プロジェクトは皆さんのご協力無しには運営できません。この場を借りて改めてお礼申し上げます。
原因は appinventor/blocklyeditor/src/msg/ai_blockly/messages_ja.json を入れ忘れでした。ファイルを追加してコミット、GitHubにプッシュ、タグはnb187d_jpにしました。
これで本当に完了、ならいいけどな。