ようへい

2018年12月5日水曜日

GAE/J の環境から、 Dropbox にファイルをアップロードする

Google App Engine / Java8 の環境で、ファイルをアップロードされた場合、アップロードしたファイルの置き場所をどうしようかと悩んでいた。
すると、Dropbox の API があるようだったので使用してみることにした。
なんとなく GAE の環境に対応していそう。
Dropbox Core SDK for Java 6+
https://github.com/dropbox/dropbox-sdk-java とりあえず、以下でアクセストークンを作成。
Generate an access token for your own account
https://blogs.dropbox.com/developers/2014/05/generate-an-access-token-for-your-own-account/ チュートリアルにあるように、以下のように実装。
DbxRequestConfig config = DbxRequestConfig.newBuilder(SystemProperty.applicationId.get()).build();
DbxClientV2 client = new DbxClientV2(config, <<DROPBOX_ACCESS_TOKEN>>);
client.files().uploadBuilder("/GAE/" + fileName).withMode(WriteMode.OVERWRITE)
    .uploadAndFinish(fileStream);
とりあえずデプロイしてGAE上で実行。
すると案の定エラーが。
error: com.dropbox.core.NetworkIOException: content.dropboxapi.com (Logger.java:58)
 at com.dropbox.core.v2.DbxRawClientV2.uploadStyle(DbxRawClientV2.java:259)
 at com.dropbox.core.v2.files.DbxUserFilesRequests.upload(DbxUserFilesRequests.java:2985)
 at com.dropbox.core.v2.files.UploadBuilder.start(UploadBuilder.java:154)
 at com.dropbox.core.v2.files.UploadBuilder.start(UploadBuilder.java:20)
 at com.dropbox.core.v2.DbxUploadStyleBuilder.uploadAndFinish(DbxUploadStyleBuilder.java:92)
GAEで開発してる人ならピンと来るはず。
GAE/Java 8では外部にアクセスする際に使用する、Javaネイティブの java.net.URL.openConnection などが無効になり、URLFetchServiceFactory を使う必要がある。
どうやらホスト名が引けず、エラーになっているようなので、何かしら GAE 用の処理を加えないと使えなさそう。
GitHub で、検索をかけるとソース上に使用方法が書いてあった。
dropbox-sdk-java/src/main/java/com/dropbox/core/http/GoogleAppEngineRequestor.java
https://github.com/dropbox/dropbox-sdk-java/blob/aa70590b492bc79a47c6eaf5bc667206ab51bfdd/src/main/java/com/dropbox/core/http/GoogleAppEngineRequestor.java#L25
/**
 * {@link HttpRequestor} implementation that uses Google App Engine URL fetch service.
 * You can only use this if your project includes the App Engine libraries.
 *
 * <p> If your app runs in Google App Engine, it is strongly recommended to use this Requestor to
 * ensure certificate validation is performed on all requests.
 *
 * <p> To use this, pass an instance to the {@link com.dropbox.core.DbxRequestConfig} constructor:
 *
 * <pre>
 *     DbxRequestConfig config = DbxRequestConfig.newBuilder("MyAppEngineApp/1.0")
 *         .withHttpRequestor(new GoogleAppEngineRequestor())
 *         .build();
 *
 *     String accessToken = ...;
 *     DbxClientV2 client = new DbxClientV2(config, accessToken);
 * </pre>
 */
なるほど。
.withHttpRequestor(new GoogleAppEngineRequestor()) が必要らしい。
これを加えて、先ほどのコードを修正。
DbxRequestConfig config = DbxRequestConfig.newBuilder(SystemProperty.applicationId.get())
        .withHttpRequestor(new GoogleAppEngineRequestor()).build();
DbxClientV2 client = new DbxClientV2(config, <<DROPBOX_ACCESS_TOKEN>>);
client.files().uploadBuilder("/GAE/" + fileName).withMode(WriteMode.OVERWRITE)
        .uploadAndFinish(fileStream);
無事アップロードできるようになりました。
関連記事

2018年11月22日木曜日

Nexus 6P に Factory Image 焼こうとしたら、error: Cannot generate image for userdata になった

格安で Nexus 6P を入手したのだが、以下のサイトから最新の Factory Image を持ってきて、flass-all.bat を実行した。
Factory Images for Nexus and Pixel Devices | Google APIs for Android | Google Developers
https://developers.google.com/android/images?hl=ja#angler すると、最後のほうで以下のようなエラーが
wiping userdata...
CreateProcess failed: The system cannot find the file specified. (2)
mke2fs failed: -1
error: Cannot generate image for userdata
Press any key to exit...
ググると -w オプションを外せばいいよとのこと。
fastboot -w update image-angler-opm7.181105.004.zip から -w を外し以下のように変更。
PATH=%PATH%;"%SYSTEMROOT%\System32"
fastboot flash bootloader bootloader-angler-angler-03.81.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot flash radio radio-angler-angler-03.88.img
fastboot reboot-bootloader
ping -n 5 127.0.0.1 >nul
fastboot update image-angler-opm7.181105.004.zip

echo Press any key to exit...
pause >nul
exit
無事 flash できました。
起動後、user data が wipe されていないことによるエラーが出ますが、factory reset を選ぶと user data を wipe できました。
その後無事起動しました。
関連記事

2018年6月6日水曜日

Docker でのエラーあれこれ対処法

主に Docker Toolbox での話です。

no such host

エラー
docker: Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io on 10.0.2.3:53: no such host.
原因
ホストが引けていません
対処
DNSを追加します
# echo "nameserver 8.8.8.8" >> /etc/resolv.conf
プロキシの設定が必要な環境なら .bash_profile に設定して再読込するか、環境変数に設定する
# export HTTP_PROXY=http://username:password@host:port
# export HTTPS_PROXY=http://username:password@host:port
curl https://registry-1.docker.io/v2/ とかやって、データ返ってくることを確認する
# curl https://registry-1.docker.io/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}

request canceled while waiting for connection

エラー
Error response from daemon: Get https://hub.docker.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
対処
docker サービスを再起動したら解消された
# docker login
Username: xxxxx
Password:
Error response from daemon: Get https://hub.docker.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
# /etc/init.d/docker restart
# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xxxxx
Password:
Login Succeeded

cgroups: cannot find cgroup mount destination: unknown

エラー
docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown.
ERRO[0001] error waiting for container: context canceled
対処
# mkdir /sys/fs/cgroup/systemd
# mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
参考
docker: Error response from daemon: cgroups: cannot found cgroup mount destination: unknown. · Issue #1301 · boot2docker/boot2docker · GitHub
https://github.com/boot2docker/boot2docker/issues/1301
関連記事

2018年3月20日火曜日

Visual Studio Code Insiders を更新しようとして dll が見つからなくてエラーになる時の対処

Visual Studio Code Insiders (以下 VS Code Insiders) の更新が通知されたので、更新しようとしたら以下のエラーが表示された。
Visual Studio Code Insiders を更新しようとして dll が見つからなくてエラーになる時の対処
Visual Studio Code Insiders を更新しようとして dll が見つからなくてエラーになる時の対処
コンピューターにapi-ms-win-crt-runtime-l1-1-0.dll がないため、プログラムを開始できません。この問題を解決するにはプログラムを再インストールしてみてください。
どうやら以下のパッケージを入れることで解決できる模様。
Download Visual Studio 2015 の Visual C++ 再頒布可能パッケージ from Official Microsoft Download Center
https://www.microsoft.com/ja-jp/download/details.aspx?id=48145 アーキテクチャにあったインストーラをダウンロード。
vc_redist.x**.exe を実行し、インストール。

インストール後、VS Code Insiders の更新を行うと無事更新できるようになりました。
めでたしめでたし。
関連記事