Javaでバイト列をgzip/gunzipしてみる
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; class Test { public static void main(String[] args) { try { String s = "abc"; byte[] gz = gzip(s.getBytes()); byte[] bytes = gunzip(gz); String s2 = new String(bytes); System.out.println(s2); } catch (Exception e) { System.out.println(e); } } private static byte[] gzip(byte[] bytes) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); GZIPOutputStream gzip_out = new GZIPOutputStream(out); gzip_out.write(bytes); gzip_out.close(); out.close(); byte[] ret = out.toByteArray(); return ret; } private static byte[] gunzip(byte[] gzip_bytes) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayInputStream in = new ByteArrayInputStream(gzip_bytes); GZIPInputStream gzip_in = new GZIPInputStream(in); int len; byte[] buffer = new byte[1024]; while ((len = gzip_in.read(buffer)) > 0) { out.write(buffer, 0, len); } gzip_in.close(); in.close(); out.close(); byte[] ret = out.toByteArray(); return ret; } }
JavaScriptで文字列のUTF-8バイト数を得る関数を書く
UnicodeのコードポイントとUTF-8 エンコードのバイト列の対照表
Code Points 1st Byte 2nd Byte 3rd Byte 4th Byte U+0000..U+007F 00..7F U+0080..U+07FF C2..DF 80..BF U+0800..U+0FFF E0 A0..BF 80..BF U+1000..U+CFFF E1..EC 80..BF 80..BF U+D000..U+D7FF ED 80..9F 80..BF U+D800..U+DFFF ******* ill-formed ******* U+E000..U+FFFF EE..EF 80..BF 80..BF U+10000..U+3FFFF F0 90..BF 80..BF 80..BF U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
上記は perlunicode - Perl における Unicode サポート - perldoc.jp から拾ったのだけど、最近の仕様と合っているのか The Unicode Consortium のドキュメントをあたってみた。
- UTF-8 FAQ, Q: What is the definition of UTF-8?
- 3.9 Unicode Encoding Forms
- Table 3-7. Well-Formed UTF-8 Byte Sequences
- 3.9 Unicode Encoding Forms
Table 3-7 の表が一致するので大丈夫と思う。
JavaScriptで文字列のUTF-8バイト数を得る関数
対照表から下記のように書ける。
function get_utf8_bytes(str) { var count = 0; for (var i = 0; i < str.length; ++i) { var cp = str.charCodeAt(i); if (cp <= 0x007F) { // U+0000 - U+007F count += 1; } else if (cp <= 0x07FF) { // U+0080 - U+07FF count += 2; } else if (cp <= 0xD7FF) { // U+0800 - U+D7FF count += 3; } else if (cp <= 0xDFFF) { // U+10000 - U+10FFFF // // 0xD800 - 0xDBFF (High Surrogates) // 0xDC00 - 0xDFFF (Low Surrogates) count += 2; } else if (cp <= 0xFFFF) { // U+E000 - U+FFFF count += 3; } else { // undefined code point in UTF-16 // do nothing } } return count; }
sshによるリモート接続時のIP制限について
ログイン対象サーバの下記の設定ファイルでIP制限できる
/etc/hosts.allow
参考:
手を動かすことの大事さ
ディープラーニングも興味深いけど、清水さんのコメントが刺さったのでメモ。
でも人がやってるのをただ見てるのと、自分で手を動かしてやってみるのとではだいぶ理解の程度が違う。昨日も会社で若い技術者にいろいろ仕組みや原理を聞いたりしながらいろいろ考えた。
手を動かしてみないと実際にどのような流れになっているか理解できない。
理解してないからぼんやりしたことを言ってしまう。
だから完全には理解できないまでもある程度のところまでは手を動かして試してみないことにはどうにもならない。
アタリマエのことだが年をとるとついサボっちゃうんだよなあ。
本読めばわかるというものでもなし。結局泥臭くコードを読み書きするしかないのよなあ
HBaseマイグレーション
- Migrating an Apache HBase Table Between Different Clusters | Pivotal P.O.V.
- Apache HBase ™ Reference Guide - Apache HBase Operational Management
- Apache HBase ™ Reference Guide - HBase Backup
- Apache HBase ™ Reference Guide - CopyTable
- Apache HBase ™ Reference Guide - Cluster Replication