実録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日本語版が使えていることをご理解いただき、少しでもいいのでプロジェクト支援を検討してください。プロジェクトをご支援いただける方は下のボタンをクリックしてお願いします。

 

目次

    1. 2021年8月23日
      1. gitでnb187aをマージしてからCONFLICTを解決
      2. DockerコンテナでApp Inventor 2をビルド
      3. ビルド失敗原因の究明
    2. 2021年8月24日
    3. 2021年8月25日
    4. 2021年8月26日
      1. パソコンubuntu 18.04でデプロイを試す
    5. 2021年8月28日
      1. gitでnb187bをマージしてからCONFLICTを解決
    6. 2021年8月29日
      1. デプロイ前に動作確認
    7. 2021年8月30,31日
      1. 多言語変更部分調査と日本語追加
    8. 2021年9月1,2日
      1. ステージング環境にGUIデプロイ
      2. bootstrap.shにgcloudを追加
      3. ステージング環境でフルテスト
      4. 一部メニューを日本語化
    9. 2021年9月3日
      1. GitHubにプッシュ
    10. 2021年9月10日
      1. 本番環境にデプロイ
    11. 2021年9月12,13日
      1. 日本語未表示バグ

    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にしました。

    これで本当に完了、ならいいけどな。

    チュートリアル