「 Technical 」一覧

個人で開発する時のサーバに悩む

個人開発者向けサーバ環境の選び方まとめ(heroku,aws,firebaseなどなど)

↑の記事にあるように、個人でちょっとお試し開発したいときのサーバの選択肢は意外と難しいように思う。

自分が作ったサービスとかを公開するつもりなら別だけど、自分しか使わないとかちょっと実験的な使い方だと使う頻度も高くないので

・できれば安く(数百円、高くても月1000円以内)
・でもある程度自由が効く(ソフトのインストールができる)
・対応言語が多い(今はpythonが動いてくれればいいかな)
・DBも使える(しっかり使うわけでもないので軽く使えればOK)

という感じ。

勉強として考えるとAWSとかAzureあたりを触っておくのがいつか役に立つかもしれないけど、どうしてもこのあたりはVPSとして使おうとすると割高になるように思う。
(スモールインスタンスやサーバレス環境があるのは知ってるけど、一通りのVPSとして使うとなると)

いまは、このブログのレンタルサーバとしてエックスサーバー、VPSはDTIのServersMan@VPSを契約している。

ServersManは月500円でメモリ1GBと安くてスペックもそこそこだけれど、管理画面が貧弱というか無いに等しいのと、選択できるOSが古めのしかない、VPSサービスの改善やアップデートが数年単位で止まっているように見えるのが少し不満なので、どこか良い所があれば乗り換えたい。

今の時点ではいろいろ見てみて、Conohaあたりを検討中。サーバスペックは落ちるけど現在進行系でサービス内容がアップデートされているところが良いかなあと。


最近触っている技術

後の自分のためにメモ。
2018年8月時点ではだいたいこんなことをやっている。

・仕事はC++メイン。テンプレートをゴリゴリというより割とシンプルなクラス構成のもの
・ただし開発環境がC++11もフルで使えないくらいのコンパイラバージョンなので少し面倒

・勝手にPythonの勉強も兼ねて開発用ツールを作っている。PythonでCUIツールだったり、Python + FlaskでWebアプリだったり(勝手に作っているとは言っても作ったものはチーム内に公開してる)
・LeafletやGoogleMap APIも入門レベルでは使えるようになった
・CSSフレームワークはBulma。簡単な分、少し手の届かないところもあるがあまり不満はない
・JS関係はVue.jsでSPAを見よう見まねで。ただしVue.jsのコンポーネントは勉強できてないので作れない
・DBはPostgreSQL。ただこれはデータストアのために使っているだけなので、そこまでDB自体を弄り倒してない
・SCMはチームはTFSやSVN。手元では一人ローカルgitで開発ブランチ切ったりして少しだけ導入してる


Subversionのコマンド結果(svn logなど)をXML形式で取得する

つい最近まで知らなかったのでメモ。

ソースコードのバージョン管理と言えば今ではgitがトレンドだけど、仕事先ではまだまだSubversionだったりマイクロソフトのTeam Foundation Serverだったりで、おそらくgitを使っているチームはほとんど無いのではないかと思う。

そんな中、Subversionのコミットログをプログラム上で扱いたいと思うことがあり、いろいろと方法を探していた。
最初はSubversionの言語バインディング(API)を使うしかないのかな、と調べてみたけれどJavaとCしかまともにサポートされてなさそうな雰囲気だったのと使い方が面倒そうで保留。

次にSubvertionがリポジトリとやり取りしてるプロトコルを喋れないかと調べてみたけれどこれも仕様がよく分からず、WebDAVだとどうかな?と見てみてもSubversionのサーバー構築の情報はたくさん出てくるけれど、あまり情報が無くてこれも保留。

※いまこのブログを書いてる途中に調べてみると、WebDAVのプロトコル仕様は公開されている様子。時間があればこちらも調べてみる。

で、何気なくsvn logコマンドのリファレンスを眺めていたら”–xml”というオプションがあるのを発見。

通常のsvn logコマンドだとこんな感じの出力(一部省略)だが、

# svn log -l 2 http://svn.apache.org/repos/asf/subversion/trunk
------------------------------------------------------------------------
r1801108 | philip | 2017-07-07 05:56:14 +0900 (金, 07  7月 2017) | 24 lines

Add exception checks to some of the JavaHL native code to avoid JVM
warnings about JNI problems of the form:

  WARNING in native method: JNI call made without checking exceptions when required to

------------------------------------------------------------------------
r1801012 | danielsh | 2017-07-06 19:19:47 +0900 (木, 06  7月 2017) | 3 lines

* tools/dist/templates/rc-release-ann.ezt,
* tools/dist/templates/stable-release-ann.ezt:
    Fix a copy-pasto in these templates.
------------------------------------------------------------------------

–xmlオプションをつけると

# svn log -l 2 --xml http://svn.apache.org/repos/asf/subversion/trunk



philip
2017-07-06T20:56:14.167594Z
Add exception checks to some of the JavaHL native code to avoid JVM
warnings about JNI problems of the form:

  WARNING in native method: JNI call made without checking exceptions when required to



danielsh
2017-07-06T10:19:47.297427Z
* tools/dist/templates/rc-release-ann.ezt,
* tools/dist/templates/stable-release-ann.ezt:
    Fix a copy-pasto in these templates.


とXMLで出力される。

これなら標準入力でXMLを受け取ってパースすればどうとでも扱える。プログラム内からsvnコマンドを直接実行するのでセキュリティ的にどうこうはあるかもしれないが、個人が使うちょっとしたツールではあまり問題にならないだろう。

svn logコマンド以外にもsvn info や svn status など–xmlオプションを付けられるコマンドは他にもあるようなので、上手く使うと便利なことができるかも。


FlickrのOAuthで認証サイトにリダイレクトする際にはpermsパラメータが必要

この連休にFlickrのOAuth周りを触っていてハマったこと。

FlickrでOAuthのユーザー認証をする場合、Request Tokenの取得後にFlickrの認証ページにリダイレクトするのが流れだと思うのだけど、FlickrへリダイレクトするURLにパラメータを追加でしていしないとユーザー情報を入力しても”Oops! Flickr doesn’t recognise the permission set.”というメッセージが表示され、認証エラーになってしまう。

Flickr公式のドキュメント(http://www.flickr.com/services/api/auth.oauth.html)だと、サイトに飛ばすときは

http://www.flickr.com/services/oauth/authorize?oauth_token=72157626737672178-022bbd2f4c2f3432

のようなoauth_tokenのみがクエリに付ければいいとなっているけど、実際は”perms”パラメータもつけないとうまく動作しない。

Additionally, you can pass the optional perms= parameter, asking for read, write, or delete privileges. This parameter will override the setting defined in your application’s authentication flow.

サイトの説明にはoptionalとなっているので、指定しなければデフォルト(readのみ)になってくれるかと思っていたのだけど、違うようだ。

http://www.flickr.com/services/oauth/authorize?oauth_token=72157626737672178-022bbd2f4c2f3432&perms=read

↑この形が正解。

OAuthにsignpostのライブラリを使っている場合は、OAuthProvider#retrieveRequestToken()で返るリダイレクトURLに自分でpermsパラメータを付ける。

(参考)http://www.flickr.com/groups/api/discuss/72157626891119797/#comment72157627007728025


RGB565画像を作るならGIMPが使える(C言語ソースも出力可)

RGB565の画像データを必要とするケースというと、主に組み込みでVRAMに書かないいけないとかそういうケースがほとんどかなぁと思うので、割とニッチではあるのだけど仕事などでやっているとたまに「さくっとPCでテスト用画像を作ってRGB565にしたいなぁ」と思うことがある。

とりあえずちょっとしたテスト用として、C言語のソースにバイナリデータとして埋め込んで動作させたいとかいう時もあるかと思う。

何か使えるツールはないだろうかと探していたら、GIMPが使えることが分かった。

分かった、と書いているけどGIMPでRGB565でのC言語ソース出力の機能は最新のGIMP2.8の一つ前、2.7から搭載されている機能らしい。

とりあえず方法。

1.絵を描く

Clipboard01

必要な幅高さなどの条件で絵を描きます。他の画像ファイルを読み込ませても良いはず。

2.”Cソースコード”形式でエクスポートする

Clipboard02

メニューから、「ファイル」→「エクスポート」を選択すると画像の出力形式を選ぶ画面になる。ここで「ファイル形式の選択」で”C ソースコード”を選択する。

3.出力オプションでRGB565を選ぶ

Clipboard03

Cソースコードで出力を選ぶと、このようなオプション画面が出るのでRGB565形式で保存、のチェックボックスを入れる。他の項目はお好みで…と言いたいところだが、どうもGIMPのバグなのか?チェックボックスの組み合わせによっては、RGB565形式で出力されないパターンがあったので要注意。

出力結果

Clipboard04

このように幅、高さ、1ピクセルあたりのバイト数、画像データが構造体の形でファイルに出力される。

このまま使うも良し、必要に応じてデータ部のみ抜き出して使うも良し。

注意点

・出力オプションで”structではなくマクロを使う”を選択すると、#define部がRGB565形式で出力されない。(データ部はRGB565で吐かれている)
・出力形式を”Cヘッダファイル”にするとRGB565では出力されない

バイナリで出力したい場合はどうすればいいのだろう…。Windows BMP形式だとRGB565で出力するオプションがあるので、いったんBMPで出力してBMPヘッダを削ればいいのかな…?


Galaxy NexusとArduino MEGA ADKをArduino1.0環境で接続する

特に珍しいことは何も無く、単にADKのサンプルアプリが動くところまでを確認しただけだけど。

DSCN0605

先代のGalaxy Sが2.3.4カスタムROMにアップデートしてもADKサポートせず、Android3.xデバイスとして買ったAcer ICONIA TAB A500も結局ADKサポート無しという悲しい状態で、買ってあったArduino MEGA ADKだけが浮いていたのだけども、ようやく日の目を見ることができたと言うべきか。

Arduino周りの環境構築は、Arduino1.0になってArduino側ライブラリのAPI定義などが変更になった関係などで、GoogleのADKページ

http://developer.android.com/guide/topics/usb/adk.html#getting-started / Android Open Accessory Development Kit | Android Developers

を見るより、ArduinoのMEGA ADKのページに書かかれている方法のとおりにするほうが良い。変にハマらなくて済む。

http://labs.arduino.cc/ADK/AccessoryMode / Arduino Labs – Accessory Mode browse

ポイントは、Arduino1.0のフォルダにライブラリとしてAndroidAccessoryとUSB_Host_Shieldを入れる必要があるのだが、それの入手元。Googleのサイトだと、Google提供のADKパッケージに含まれるAndroidAccessoryとUSB_Host_Shieldを使うように書かれているけど、Arduino1.0の場合はArduinoのサイトで配布されているアーカイブを使う、というところ。

3. Arduino 1.0 + Arduino Libraries

As with Processing, you need to run the IDE once to create your sketchbook folder. Once created, download this file. The two folders, “libraries” and “tools” need to be placed in your Arduino sketchbook folder.

“this file”とさらっと目立たないリンクになっているけど、ここからダウンロードできるアーカイブをArduino1.0のフォルダにコピーすること。これですんなり認識する。

ADKやAndroid側アプリの作り方については、以下のgclueさんのサイトの解説がとても解りやすくてオススメ。

ちなみに、gclueさんのサイトの”ADKの開発環境の構築”に書かれている「ソースコードの修正」は、Arduinoのサイトでは既に修正済みのライブラリがダウンロードされるようなのでこの手順は必要無くなっている。

ADKの開発環境の構築 – IoT Docs
ADKのライフサイクル – IoT Docs
Androidアプリの作成 – IoT Docs


UbuntuにOracle (Sun) Java 6 SDKをインストールする

AOSPのソースビルドなどのために、UbuntuにOracle(Sun)のJava6環境が必要なケースはあると思うのだけども、ここ数ヶ月くらいの間にUbuntuリポジトリから削除されてしまってるとのこと。

なので、AOSPのサイトに書かれている以下の方法も今では「パッケージが見つかりません」みたいなエラーになって使えないと。

$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

で、これを回避しようとググってみるとPPAで有志が独自に公開してるaptリポジトリを追加してそこからインストールするとか、aptを使わずにOracleサイトからパッケージ落としてきてインストールするなどあるらしい。

お手軽なのはPPAリポジトリ形式で、これはppa:ferramrobertoを使うサンプルを多く見かける。

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk sun-java6-plugin

ただし正確にはOracle(Java?)のライセンスや著作権的にppaで独自にパッケージ配布するのはNGなようなのでこの方式はグレー(実際にはきちんとインストールできるし、動作は問題無いけど)。

かといって、いちばん真っ当な手順と思われるOracleサイトからダウンロードしてインストールする方式だと、インストールした後の環境設定が少し面倒。

Ubuntu公式のドキュメントでJava6の項を見てみると、

Java – Community Ubuntu Documentation

ppa:ferramrobertoを公開していた人がライセンス・著作権問題をクリアにした形でインストールできるスクリプトを作って公開していた。

flexiondotorg/oab-java6 · GitHub

Downloads the Java binary installers from Oracle, builds the .deb packages locally on your computer and then installs them. Packages are compatible with the “official” Ubuntu ones and will upgrade Java 6 that was previously installed from packages.

・Oracleサイトからのバイナリパッケージダウンロード
・.debファイル化
・ローカルのaptリポジトリとして構築

までを自動で行うスクリプトのようだ。JDKのバイナリをOracleサイトからきちんとダウンロードすることで諸問題を回避しているぽい。

githubのreadmeに書かれているとおりにスクリプトをダウンロードして実行する。

cd ~/
wget https://github.com/flexiondotorg/oab-java6/raw/0.2.0/oab-java6.sh -O oab-java6.sh
chmod +x oab-java6.sh
sudo ./oab-java6.sh

すると、

oab-java6.sh v0.1.9 - Create a local 'apt' repository for Ubuntu Java packages.
Copyright (c) Martin Wimpress, http://flexion.org. MIT License

By running this script to download Java you acknowledge that you have
read and accepted the terms of the Oracle end user license agreement.

* http://www.oracle.com/technetwork/java/javase/terms/license/

If you want to see what this is script is doing while it is running then execute
the following from another shell:

  tail -f /home/findup/oab-java6.sh.log

Downloading common.sh
 [x] Installing Java build requirements success
 [x] Making build directories success
 [x] Removing clones of https://github.com/rraptorr/sun-java6 success
 [x] Cloning https://github.com/rraptorr/sun-java6 success
 [x] Checking out v6.31-2 success
 [x] Getting Java SE download pagesuccess
 [x] Getting current release download page success
 [x] Downloading jdk-6u31-linux-i586.bin : 81.34 MB success
 [x] Symlinking jdk-6u31-linux-i586.bin success
 [x] Downloading jdk-6u31-linux-x64.bin : 81.62 MB success
 [x] Symlinking jdk-6u31-linux-x64.bin success
 [x] Updating the changelog success
 [x] Building the packages success
 [x] Moving the packages success
 [x] Creating Packages.gz file success
 [x] Creating Release file success
 [x] Signing the 'Release' file success
 [x] Exporting public key success
 [x] Adding public key success
 [x] Update package list success
All done!

っという感じでダウンロードとローカルなaptリポジトリを設定するところまで行ってくれる。あとはいつものように

$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk

とやればJava6 SDKがインストールできる。

Java6 SDKの最近のインストール方法はいろいろあるけど、こういう方法もあるよ、ということで。

まぁ個人的にはAOSPビルドにしか使わないので、AOSPがOpenJDKに対応してくれるほうが良いかなぁとは思うけど。


Android SDKにFramework部のソースがダウンロードできるようになっていた

いつの頃からか、Android SDKでFramework部分のソースがダウンロードできるようになってたのね。気づいてなかった。

わざわざAOSP経由でrepo syncして来なくても(Linux必要ないし)、ちょっとFramework側の実装を確認したいときには良いかも。たぶん、Eclipseにソースフォルダとして設定すればデバッグもできそうな気がする。

今のところ4.x系のみっぽいけど、2.3もあるといいんじゃないかなぁ。

(追記)ちなみにソースコードは、android-sdk\sources\android-15 というようなフォルダにある

Android_Sdk_Source


Android2.3互換指定にしていても、2.3と4.0でPreferenceActivityの見た目が異なる

2.3(Gingerbread)ベースで作ったアプリを修正せずに4.0で動かすとき、AndroidManifest.xmlにtargetSdkVersionやmaxSdkVersionを”10″にしておけば、下位互換で2.3までと同じ見た目(テーマ)で表示されると思っていたのだけど、PreferenceActivityに関しては少し見た目が異なるようだ。

↓は2.3(Gingerbread/GB)での表示。ListView部分は画面幅いっぱいに表示されてる。
device-2012-03-18-010735

↓は4.0(Ice cream sandwich/ICS)での表示。
device-2012-03-18-010651

なぜか4.0だとListView部分が画面の真ん中に縮小したような感じで表示されてしまう。

どうもこれには条件があるようで、
・横画面
・横画面にしたときの画面解像度幅が1280px以上(上記の場合は1280×720)
の時らしい。

大画面タブレット向けのレイアウトになってるのかな?とも思わなくもないのだが、manifestでSdkVersionを10にしているので、2.3と同じように表示して欲しいところ。2.3ベースで作ったアプリを、特に4.0に特化した修正をせずに(fragment使ったり)そのまま載せたいケースもあると思うのだけど、こういう風に挙動が少し異なると厄介。

まぁ、このせいで仕事でバグ票切られてて(同じはずなのに見た目が違う)どうしよう…って話なんだけど。


GingerbreadとICSでのAsyncTaskの挙動の違い

元ネタはこちら。正確にはAPI level 1113以上から違うらしい。

API LEVEL 11以上のAsyncTaskの振る舞いについて – Google グループ

お試しソース。名前とか超適当なのはご勘弁を。

package net.swingingblue.andorid.asynctaskics;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class AsyncTaskIcsActivity extends Activity {

	private static final String LOG_TAG = "AsyncTaskIcsSample";
	
	private AsyncTask<Void, Void, Void> task1 = new SampleAsyncTask();
	private AsyncTask<Void, Void, Void> task2 = new SampleAsyncTask2();
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		
		Button button = (Button)findViewById(R.id.button1);
		button.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				task1.execute();
				task2.execute();
			}
		});
	}
	
	private class SampleAsyncTask extends AsyncTask<Void, Void, Void> {

		@Override
		protected Void doInBackground(Void... params) {
			Log.d(LOG_TAG, "SampleAsyncTask#doInbackground entered.");

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			Log.d(LOG_TAG, "SampleAsyncTask#doInbackground go out.");
			return null;
		}

	}

	private class SampleAsyncTask2 extends AsyncTask<Void, Void, Void> {

		@Override
		protected Void doInBackground(Void... params) {
			Log.d(LOG_TAG, "SampleAsyncTask2#doInbackground entered.");

			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			Log.d(LOG_TAG, "SampleAsyncTask2#doInbackground go out.");
			
			return null;
		}
	}
}

結果。タイムスタンプとスレッド番号に着目。

Gingerbread(API level 10)

01-24 17:39:21.384   340   349 D AsyncTaskIcsSample: SampleAsyncTask#doInbackground entered.
01-24 17:39:21.424   340   350 D AsyncTaskIcsSample: SampleAsyncTask2#doInbackground entered.
01-24 17:39:22.398   340   349 D AsyncTaskIcsSample: SampleAsyncTask#doInbackground go out.
01-24 17:39:22.474   340   350 D AsyncTaskIcsSample: SampleAsyncTask2#doInbackground go out.

ICS(API level 15)

01-24 17:34:51.124   730   743 D AsyncTaskIcsSample: SampleAsyncTask#doInbackground entered.
01-24 17:34:52.179   730   743 D AsyncTaskIcsSample: SampleAsyncTask#doInbackground go out.
01-24 17:34:52.185   730   744 D AsyncTaskIcsSample: SampleAsyncTask2#doInbackground entered.
01-24 17:34:53.190   730   744 D AsyncTaskIcsSample: SampleAsyncTask2#doInbackground go out.

ふむふむ。

ICSではdoInBackground()の中でwaitとかやってたりすると、他のAsyncTaskをexecute()しても動かない、と。まぁ複数スレッドの待ち合わせにAsyncTaskは使わずにExecutors.newCachedThreadPool()とかしろってことですね。

(追記)

task1.execute();

の代わりに

task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

とすればlevel 12以前の動作と同じになるみたい。
(追記おわり)

まぁGingerbread上で作ったソースをそのまま持って来てあっさり動くと思ってるとダメなケースがあると。使い方の問題でもあるのだけど。


スポンサーリンク