2014年7月11日金曜日

Macbook pro でUSBがおかしくなったとき

なぜだかわからないが、私のMacbook Pro Retina 15は、USBが反応しなくなることがある。多分どこかハードウェア的におかしくなってるんだと思うのだが、リブートすると復活する。しかしいちいちリブートすると、デスクトップの状態が失われて面倒。
多分電源をオンオフすればいいのではないかと思い、ハイバネーションをためしてみた。とはいえ、Macでは普通はスリープするのでハイバネーションさせることができない。
そこで、強制的にハイバネーションするようにディープスリープモードにする。
sudo pmset -a hibernatemode 1
これで普通にスリープさせると、ディスクに状態を書き出して完全に電源が落ちる。USBも復活。
復活したらスリープモードをもとに戻しておく。
sudo pmset -a hibernatemode 3

2014年7月2日水曜日

Google sites で markdown

問題

Google sites はWysiwigエディタが付いてるのだけどとてもうざい。

解決策

MarkDown HereというChromeExtensionを入れるとMarkDownで編集できる。
とても楽。もともとGmail用のものらしいのだけどSitesでも動く。
実はこのExtension, Bloggerでも機能する。ということでこれもMarkDownで書いてみた。いつもはHTML直打ちなのでずっと楽だ。。

2014年6月24日火曜日

xubuntu のxfce4での emacs キーバインド設定

Xfceを用いるubuntu ディストロ xubuntuでのEmacsキーバインド化。 Settings Editor でxsetting -> KeyThemeName をEmacsにすればよい。

2014年6月14日土曜日

docbook -> pdf

すごく試行錯誤したのでまちがってるかもしれないが。 Mac,brew で。
> brew intall docbook docbook-xsl fop
で、
fop -c fop.conf -xsl docbook.fo.xsl -xml INFILE -pdf OUTFILE
fop.confは、
<?Xml version="1.0" encoding="UTF-8" ?>

<fop version="1.0">
 <renderers>
  <renderer mime="application/pdf">
   <filterlist>
    <value>flate</value>
   </filterlist>
   <fonts>
    <auto-detect />
   </fonts>
  </renderer>
 </renderers>
</fop>
docbook.fo.xml は
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version='1.0' xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:import href="file:////usr/local/Cellar/docbook-xsl/1.78.1/docbook-xsl/fo/docbook.xsl"/>
  <xsl:param name="l10n.gentext.default.language">ja</xsl:param>
  <xsl:param name="ulink.show" select="0"/>
  <xsl:param name="paper.type">A4</xsl:param>
  <xsl:param name="hyphenate">false</xsl:param>

  <xsl:param name="callout.unicode" select="1"></xsl:param>
  <xsl:param name="callout.graphics" select="0"></xsl:param>

  <xsl:param name="title.font.family">Meiryo</xsl:param>
  <xsl:param name="body.font.family">Meiryo</xsl:param>
  <xsl:param name="monospace.font.family">MS Gothic</xsl:param>
</xsl:stylesheet>
Macなのに、Meiryoにしているのは他のフォントではうまく行かなかったから。 Osaka, Hiraginoあたりは試したけどだめだった。IPAフォントならうまくいくらしい。

fop がメモリ不足で落ちたりするので、そのときは/usr/local/Cellar/fop/1.1/libexec/fop を編集して

java_exec_args="-Xmx1G -Djava.awt.headless=true"
とかやるとOK。

2013年7月8日月曜日

cassandra cql3 jdbc

Cassandra のSQLライクなQLであるところのCQL3をjdbc越しに使う方法。 どうも昔は、Cassandraのディストリビューションに必要なDriverが入っていた らしいのだけど、1.2.4現在、なぜか外されている? よくわからないことに、org.apache.cassandra.cql.jdbc というそれっぽいパッケージ は残っており、そこにはJDBC関連の型があるのだけどドライバがないのだ。

driver のダウンロードとインストール

https://code.google.com/a/apache-extras.org/p/cassandra-jdbc/ にコードが有る。

自前でビルドしようとしたら、変なコードが混じっていてJavaCompiler が通らなかったり、 Java1.7 の JDBCで追加されたsetSchema/ getSchemaをサポートしていなかったりでコンパイルが 通らない。。

とりあえず1.2.5向けのjarを持ってきてCLASSPATHを通したら動いた。

public static void main(String[] args) throws Exception {

    Class.forName("org.apache.cassandra.cql.jdbc.CassandraDriver");
    Connection con = DriverManager.getConnection("jdbc:cassandra://localhost:9160/testks");

    String query = "INSERT INTO simpledata (id, content)    VALUES (?, ?);";
    
    PreparedStatement statement = con.prepareStatement(query);

    statement.setString(1, "002");
    statement.setString(2, "foobarfoobar");
    
    statement.execute();

    statement.close();
}

2013年6月28日金曜日

Apps Scriptで差し込みメイル

多数の相手に文面を少しだけ変えながらメイルを出すためのスクリプト。Google Docs上に文を置き、それの*NAME* というフィールドを置き換えながら送信する。

サーバ上で完結しているので手元にブラウザだけあれば使えるのが便利。
Docs上の文書のIDはURLに含まれているのを抽出しなければならないのが面倒。
Here documentがJavascriptで使えればDocsにおいたりする必要もなくて、もっと便利なのにね。

function myFunction() {
  var docname = "xxxx";
  var doc = DocumentApp.openById(docname);

  var list = [
    {name: "test1", email: "addr"},
    {name: "test2", email: "addr"},
  ];

  var mailBody = doc.getBody().getText();

  for (var i = 0; i < list.length; i++) {
     var name = list[i].name;
     var addr = list[i].email;
     var body = mailBody.replace(/\*NAME\*/g, name);
     Logger.log(addr);
     Logger.log(body);
     MailApp.sendEmail({
       to: addr,  
       subject: "サブジェクト",
       body: body,
     });
  }
}

2013年5月10日金曜日

Cassandra の複数サーバを1ノードで動かす

普通この種のものは、ポートを設定ファイルで切り替えてやれば1ノードで複数サーバを動かすことができるのだけど、Cassandraではむずかしい。というのは、システムのポート番号が全てのサーバで同一であることが前提となっているらしいからだ。サーバのノード情報はゴシップでやり取りしているはずだから、一度接続出来ればポート番号を交換して共有できそうなものなのだが、その接続ができない。

yamlファイルのseedsを指定するフィールドが、IPアドレスのみを指定するようになっていて、ポート番号を指定できない。簡単に修正できれば修正してみようかと、ソースを追ってみたけど割に中の方までIpAddressだけしか持っていないので難しいと判断。

VMの中なので、ネットワークインターフェイスを増やすのは簡単なので、それで何とかしようかと思ったのだが、 ググったらもっと簡単な方法があった。 3年前の記事

ローカルホストのloインターフェイスにaliasで別のIPアドレスをふり、それを使うという方法。 本物のネットワーク・インターフェイスを増やすと色々面倒だけどこれなら、ずっと楽だしVMじゃなくてもできる。

以下ubuntuでの方法。

  • sudo ifconfig lo:1 127.0.0.2 up    
    
    とかやって、lo:1というインターフェイスを作る。必要な数だけつくる。
  • conf ディレクトリをサーバの数だけ複製する。
  • cassandra.yamlの data_file_directories, commit_log_directory, saved_caches_directory が重複しないように 別々のディレクトリを掘って指定する。
  • cassandra.yamlの listen_address と rpc_address を127.0.0.2などに変更する。
  • cassandra.yamlのseeds にアドレスを並べる
      - seeds: "127.0.0.1,127.0.0.2"
    
  • log4j-server.properties の /var/log/cassandra となっている部分を適宜重複しないように変更する。
  • cassandra-env.sh のJMX_PORTは別の値を指定する。このポートは常に0.0.0.0に対してバインドされるらしいので 複数のサーバ間が同じポートで共有することができないらしい。
  • 起動時には新しく作ったconfディレクトリを環境変数で指定して起動すれば良い。
    CASSANDRA_CONF=conf1 bin/cassandra