tag:blogger.com,1999:blog-15780223601012443322024-03-14T04:49:18.467+09:00覚え書きAnonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comBlogger100125tag:blogger.com,1999:blog-1578022360101244332.post-6461340501607065442015-08-21T22:20:00.002+09:002015-09-29T16:10:15.093+09:00How to parse Eddystone packets (Android)It's easy if you use nv-bluetooth library. onLeScan method would be implemented like the following.
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
{
// Parse the payload part of an advertisement packet.
List<ADStructure> structures =
ADPayloadParser.getInstance().parse(scanRecord);
// For each AD structure contained in the packet.
for (Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-52342253708366446312015-08-21T19:33:00.001+09:002016-03-09T00:14:17.861+09:00Eddystone パケットをパースする (Android)nv-bluetooth ライブラリを使えば簡単。onLeScan メソッドの実装例は次のようになる。
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord)
{
// アドバータイジングパケットのペイロードをパースする。
List<ADStructure> structures =
ADPayloadParser.getInstance().parse(scanRecord);
// アドバータイジングパケットに含まれる各 AD structure ごとに
for (ADStructure structure : structures)
{
if (structure instanceof Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-1682546586660243222015-06-20T02:24:00.002+09:002015-06-24T21:02:23.511+09:00ZooKeeper でリーダー選出を実装する『ZooKeeper による分散システム管理』 を買って読みました。
書籍では、ZooKeeper を使う典型的な例として 「複数のマシンの中から一台をマスターとして選ぶ」 というユースケース、いわゆる 「リーダー選出」を挙げ、3 章以降でコーディング例を示しています。しかし、コールバックやら Watcher やらの組み合わせ方がややこしいため、コードのフローは追いにくいものになっています。
8 章では 「ZooKeeper の高レベル API」 として Curator フレームワークを紹介し、Curator を使った場合にリーダー選出のコーディングがどうなるかを示しているものの、それでも分かりにくいです。というか、分かりやすいかどうかよりも、リーダー選出のために、素の ZooKeeper API とはだいぶ異なる Curator API を学習しなければならないという点で既に、「Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-30407243886031085692015-06-16T20:28:00.000+09:002015-06-16T20:28:45.395+09:00ZooKeeper の起動に苦労した点ZooKeeper クライアントを起動して、「Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect」というエラーが出たら、これは単純に ZooKeeper サーバーが起動していない可能性が高い。私の場合、ZooKeeper のソースコードを追っていって、ClientCnxnSocketNIO.java の 361 行目 (version 3.4.6) の sc.finishConnect() でエラーが起こっていることが分かったが、この sc というのは java.nio.channels.SocketChannel のインスタンスなので、もはや ZooKeeper の範疇ではない。そういうわけで、ZooKeeper の設定云々の話ではなくて、Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-64032498818460799782015-05-12T15:36:00.000+09:002015-05-12T15:41:15.485+09:00undefined method `path2class'直接の原因
psych.so ファイルが適切な場所に置かれていない。
問題回避方法
私のケースでは:
cp /usr/local/share/ruby/gems/2.0/gems/psych-2.0.13/lib/psych.so \
/usr/share/ruby/vendor_ruby/2.0/
詳細
path2class メソッドは psych_to_ruby.c 内で定義され、rb_define_private_method() により Psych::ClassLoader クラスのプライベートメソッドとして登録される。下記はそのコード。Init_psych_to_ruby() 関数の最後の行に注目。
static VALUE path2class(VALUE self, VALUE path)
{
#ifdef HAVE_RUBY_ENCODING_HAnonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-71959660798522709432015-05-02T01:31:00.000+09:002016-05-11T20:57:38.109+09:00WebSocket client library (Java SE 1.5+, Android)This page explains nv-websocket-client, a WebSocket client library written in Java. Its JavaDoc is here.
Last Updated: May. 11, 2016
Overview
High-quality WebSocket client implementation in Java which
complies with RFC 6455 (The WebSocket Protocol)
works on Java SE 1.5+ and Android,
supports all the frame types (continuation, binary, text, close, ping and pong),
provides a method to send Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-37136304132558279052015-04-22T02:40:00.000+09:002016-05-11T21:08:28.902+09:00WebSocket クライアントライブラリ (Java SE 1.5+, Android)WebSocket クライアントライブラリ (Java) nv-websocket-client の説明です。JavaDoc はこちら。
最終更新日: 2016 年 5 月 11 日
特長
RFC 6455 (The WebSocket Protocol) に準拠している。
Java SE 1.5+, Android で動く。
全てのフレームタイプ (continuation/binary/text/close/ping/pong) をサポートしている。
分割されたフレームを送信するメソッドを提供している。
WebSocket が使用しているソケットを取得して設定できる。
Basic 認証のためのメソッドを提供している。
javax.net.SocketFactory インターフェースを利用するファクトリークラスを提供している。
WebSocket イベントをフックするためAnonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-22453128827719901832015-04-14T19:50:00.000+09:002015-06-11T01:27:01.402+09:00Rails をインストールする (Ubuntu/VirtualBox/Windows)Windows 上に Rails をインストールしようとしたところ、簡単に解決しなさそうな問題がいろいろ出てきたので、Windows に直接 Rails をインストールすることは諦め※1、Windows に仮想化ソフト VirtualBox を入れてその上で Ubuntu を動かし、そこに Rails をインストールすることにした。しかしそれでも、幾つも問題に遭遇したので、手順を書き残しておく。
※1:その後、問題回避策として「gem update --system 2.3.0」をおこなったら、Windows でも Rails が動いた。(参考: Rubygems Issue 977)
1. 仮想ハードディスクイメージのダウンロード
VirtualBox で作成する仮想マシンの仮想ハードドライブとして使用するイメージを「日本語 Remix 仮想ハードディスクイメージのダウンロードAnonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-74192376149469928952015-04-07T16:28:00.000+09:002015-04-07T16:30:30.737+09:00Function to define a namespace in JavaScript (namespace.js)Sample Code:
// Define a namespace 'aaa.bbb.ccc' and add a function 'hello'
// under the namespace which prints 'Hello, world.'.
namespace('aaa.bbb.ccc').hello = function() {
print('Hello, world.');
};
// Execute the function.
aaa.bbb.ccc.hello();
Source Code:
Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-31504905933986009842015-03-21T00:49:00.002+09:002015-03-21T00:59:29.804+09:00iBeacon as a kind of AD structuresFirst of all, iBeacon should be parsed as a kind of AD structures. Any library that is not implemented that way is just "usable" at best.
The AD structure format is described in "11 ADVERTISING AND SCAN RESPONSE DATA FORMAT" of "Bluetooth Core Specification 4.2". You can find the document at Specification Adopted Documents.
nv-bluetooth is a utility library written in Java and it contains Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-91517774149806286122015-02-20T16:11:00.000+09:002015-02-20T16:11:16.601+09:00Redshift の文字列型はバイト単位!?
私の勘違いでなければ、
通常の PostgreSQL の場合、character varying(N) などの N は「文字数単位」ですが、PostgreSQL 8.0.2 から派生した Amazon Redshift の場合は「バイト単位」になるようです。
PostgreSQL ドキュメント 「Character Types」 より抜粋
SQL defines two primary
character types: character varying(n) and character(n), where
n is a positive integer. Both of
these types can store strings up to n characters (not bytes) in length.
Redshift ドキュメント 「Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-4381652783663391722014-12-16T23:50:00.002+09:002014-12-16T23:50:57.372+09:00Sinatra + SSLFound a better way to enable SSL in Sinatra than "Sinatra+Thin+SSL". This is a generic way and does not require Thin.
Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-30976404834923352692014-10-01T22:24:00.003+09:002014-12-16T23:53:49.848+09:00Sinatra + Thin + SSLFinally found a way to enable SSL in Sinatra + Thin.
# [2014/12/16]
# Found a better way.
# See "Sinatra + SSL".
Start this script (sinatra+thin+ssl.rb) then type:
curl -k https://localhost/
and you will see "Hello, SSL."
Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-26368078255763055152014-09-20T03:28:00.000+09:002014-09-20T04:09:16.360+09:00MissingTableException on Google Cloud SQLIf you are using JDO to access Google Cloud SQL and suffering from MissingTableException like below:
org.datanucleus.store.rdbms.exceptions.MissingTableException: Required table missing : "`TABLE NAME`" in Catalog "" Schema "". DataNucleus requires this table to perform its persistence operations. Either your MetaData is incorrect, or you need to enable "datanucleus.autoCreateTables"
and ifAnonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-28217745526918300742014-07-19T04:27:00.000+09:002014-07-19T04:27:08.370+09:00JDO:カラムサイズは十分大きいのにデータが保存できないという問題を解消する方法 JDO を使っているときに表示される次のようなエラーメッセージは、
Attempt to store value "{DATA}" in column "`{COLUMN-NAME}`" that has maximum length of 255. Please correct your data!
保存しようとしているデータのサイズが、対応するデータベーステーブルのカラムのデータサイズよりも大きいということを意味している。しかし、カラムサイズが十分大きくてもこのエラーが起きることがある。例えば、対応するカラムの型を TEXT で定義しているにもかかわらず(MySQL 的には TEXT は 65535 まで OK であるにもかかわらず)、上記のようなエラーが出てしまうことがある。
この問題は、@Column アノテーションに length を追加してAnonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-34650494166010064672014-07-10T12:50:00.000+09:002014-07-11T07:39:45.141+09:00JDO Enum Mapping Java Data Objects 3.0 (JSR 243) の仕様によると、Enum の値をストレージに永続化する際、ストレージでの型が数値型であれば Enum.ordinal() メソッドの返す値が、文字列型であれば Enum.name() メソッドの返す値が用いられるとのこと。 (15.1 Column Elements / Mapping enums)
Enum にマッピングされるカラムのデフォルトの jdbc-type は VARCHAR なので、ordinal() の値を使いたいときは、当該カラムに対して明示的に jdbc-type を指定したほうがよい。有効な jdbc-type は次のとおりで、全て大文字か全て小文字かのどちらかで指定する。 (18.4 ELEMENT column)
CHAR, VARCHAR, LONGVARCHARAnonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-82051370988505677922014-04-19T02:53:00.000+09:002015-04-13T23:13:27.866+09:002 の 256 乗を計算してみた2256 を十進数で表すと 78 桁で、無量大数の十億倍くらいの値であることが分かりました。
ちゃんとした方法でランダムに生成した 256 ビットのハッシュ値が偶然ぶつかるかもしれないなんてことを心配するのは馬鹿げていることを理解しました。いや、馬鹿げているのは理解していたのですけど、実際に計算してみると、どれだけ途方もなく馬鹿げているのかが分かった、という話です。
どれくらい大きな数字なのか例えで考えてみます。
太陽の寿命が来るまで今から 50 億年のあいだ、
100 億人の人が、
毎ナノ秒 1 兆個の数値を消費していく活動があり、
その活動を、太陽系が属するこの銀河系の全ての星(~2,000 億くらい)でおこなうと、
消費される数字の個数は、50 億年 × 100 億人 × 100000000 ナノ秒 × 60 秒 × 60 分 × 24 時間 × 365 日 × 1Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-57544961355649971052014-03-17T02:49:00.000+09:002014-03-17T02:49:09.957+09:00AccessControlException when using local MySQL for Google Cloud SQL If you are developing an application for Google App Engine + Google Cloud SQL and using local MySQL during development, you may encounter AccessControlExeption like below.
java.security.AccessControlException:
access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
This exception is raised when your application tries to use Thread because Google App Engine does not Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-48613333924684595292014-03-13T16:37:00.000+09:002014-03-13T16:37:27.827+09:00MySQL: Error 1067 Process terminated unexpectedly If MySQL service fails to start and reports "Error 1067", it indicates that the configuration file my.ini contains errors. 1067 is a generic error code, so you cannot tell which configuration parameter is the cause. Therefore, to find wrong configuration parameters, you have to repeat comment in/out configuration parameters and start/stop MySQL service.
In my case, configuration Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-41871623539276938502014-03-05T02:28:00.000+09:002014-10-17T18:53:29.066+09:00Google App Engine Tips
Eclipse で com.google.appengine.archetypes:guestbook-archetype を指定して
GAE のテンプレートプロジェクトを作ると、.classpath の中に <classpathentry>
が大量に挿入されるが、絶対パスで書かれるので、GAE SDK をアップデートするときに都合が悪い。
.classpath を手作業で編集して次の内容で置き換えたほうがよい。
<classpathentry kind="con"
path="com.google.appengine.eclipse.core.GAE_CONTAINER"/>
.classpath の中で、GAE_CONTAINER を MAVEN2_CLASSPATH_CONTAINER より前に置いておかないと、.m2
の中にある GAE Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-45454477993355873022014-02-23T22:41:00.000+09:002014-02-23T22:41:13.744+09:00Apache Shiro Configuration (日本語訳)# Apache Shiro Configuration の日本語訳
単純なコマンドライン・アプリケーションからクラスター化された大規模エンタープライズアプリケーションに至るまで、あらゆる環境で動作するように Shiro は設計されています。環境は多岐にわたるため、適切に設定をおこなえるよう、設定方法も数多く存在します。この節では、Shiro core によりサポートされる設定方法について説明します。
多くの設定オプション
Shiro の SecurityManager 実装群と補助コンポーネント群は、全て JavaBeans 互換です。これにより、事実上 Shiro は、通常の Java、XML (Spring, JBoss, Guice, etc), YAML, JSON, Groovy Builder マークアップ、等々、設定書式を問わずに設定Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-20302556063010436172013-12-29T19:35:00.000+09:002013-12-29T19:35:19.331+09:00Apache Shiro Realms (日本語訳)# Apach Shiro Realms の日本語訳
Realm は、ユーザー、ロール、パーミッション等のアプリケーション固有のセキュリティーデータにアクセスするコンポーネントです。データソースが幾つ存在していようが、どれだけアプリケーションに特化したデータであろうが、アプリケーション固有のデータが Realm を通して解釈可能なフォーマットに整えられ、それにより Shiro は、単一でかつ理解も容易な Subject というプログラミング API を提供することが可能となっています。
Realm は通常、リレーショナルデータベースや LDAP ディレクトリ、ファイルシステムといったデータソース、もしくは他の似たようなリソースと、1 対 1 の関係を持っています。そのため、Realm インターフェースの実装では、JDBC やファイル I/O、Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-34709891946418672862013-12-28T23:07:00.000+09:002013-12-28T23:07:38.833+09:00文字数、UTF-8 でのバイト数、サロゲートペアの数を数える 下記のコードは、文字数、UTF-8 で符号化したときのバイト数、サロゲートペアの数、を数え上げるロジックを JavaScript で表現したものです。Java や Objective-C など、文字列を UTF-16 で扱っているプログラミング言語であれば、同じロジックを適用できます。GIST はこちら。Unicode 理解度簡易チェックはこちら。本ブログの英語版はこちら。
<!-- Input -->
<!-- Output: Number of letters-->
文字数: 0
<!-- Output: Number of bytes in UTF-8 -->
UTF-8 でのバイト数: 0
<!-- Output: Number of surrogate pairs -->
サロゲートペアの数: 0
function Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-63147315219762788272013-12-28T16:48:00.000+09:002013-12-28T17:12:47.675+09:00Count up letters, bytes in UTF-8 and surrogate pairs in JavaScriptBelow is a sample code in JavaScript to count up letters, bytes in UTF-8 and surrogate pairs. Available as a gist.
<!-- Input -->
<!-- Output: Number of letters-->
0 letter(s).
<!-- Output: Number of bytes in UTF-8 -->
0 byte(s) in UTF-8.
<!-- Output: Number of surrogate pairs -->
0 surrogate pair(s).
function compute_bytes_in_utf8(codePoint)
{
// Unicode code points and their Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.comtag:blogger.com,1999:blog-1578022360101244332.post-34425733687466697002013-12-13T05:41:00.000+09:002013-12-14T03:12:11.191+09:00Unicode 理解度簡易チェック次のことが理解できているかを簡単に調べることができます。
UTF-8 は Unicode の文字符号化方式の一つである
(Unicode と UTF-8 の違いが分かっているか?)
Java や Objective-C でプログラミングするときに文字の値は UTF-16 になっている
(ちゃんとプログラミングできるか?)
下記の表の内容を見て、全て理解できれば OK です。
あ
Unicode の規格でこの文字に割り当てられた
Unicode スカラ値 (十六進数表記)
U+3042
この文字の Unicode スカラ値を UTF-8 で
符号化したときのバイト列 (十六進数表記)
E3 81 82
(3 バイト)
この文字の Unicode スカラ値を UTF-16BE で
符号化したときのバイト列 (十六進数表記Anonymoushttp://www.blogger.com/profile/14478197146468646900noreply@blogger.com