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
    

2013年4月17日水曜日

ufw のlogの抑制

ubuntu 12.04のデフォルトの設定だと、ufwのログが/var/log/ufw.log 以外のmessages やら kern.logに出てしまって、 何がおこっているのかわからなくなってしまう。ということで、 /etc/rsyslog.d/20-ufw.conf の最後の行
#& ~
のコメントを外す。これがあるとfall through でデフォルトのログ分配の方にも流れてしまう らしい。これが流れないようにする、と。

あとは

sudo restart rsyslog
でOK。

2013年4月13日土曜日

ubuntu preseed で rootのssh pub keyを仕込む

preseed はdebian/ubuntuのインストーラの返答を自動化する仕掛け。RedHatでいうところのkickstartみたいなものか。 この機能を使うとインストールの最後にスクリプトを実行することができる。 それをつかって、rootアカウントにsshの公開鍵を仕込むことができた。 インストールしたらすぐにsshでrootに入れるので、自動的に様々な設定ができて便利。
d-i preseed/late_command string \
in-target /bin/mkdir /root/.ssh ;\
in-target /bin/chmod 700 /root/.ssh ;\
in-target /bin/sh -c 'echo "ssh-rsa 略" > /root/.ssh/authorized_keys'

2013年3月22日金曜日

pythonでredirectするとエンコーディングエラー

Pythonでprintで日本語の文字を書き出している場合、画面に出してると大丈夫なのに、redirectすると したのようなエラーがでることがある。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
調べてみるとttyのときだけ親切に色々やってくれているんだけど、 redirectとかpipeだとそれが機能しなくなり、内部で持ってるunicode表現文字をデフォルトのasciiにエンコードしようとして失敗する、 ということのようだ。 ここにいい方法がのってた。
import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
としておくと以降のstdoutへの出力が常にutf8で自動的にencodeされるようになる。

jquery で入力フィールドに透かしを入れる

多分佃煮にするほどあるのだろうけど、 http://digitalbush.com/projects/watermark-input-plugin/にあるのを使ってみる。
としておいて、
  
<script src="jquery.watermarkinput.js"></script>
  
<input id="tag"></input>
とやって作ったinputに対して、
  
$( '#tag' ).Watermark("label", "#999");
とやって出来上がり。第2引数が色。

2013年3月17日日曜日

ubuntu ネットワーク増設

/etcnetwork/interfaces に追記する。
auto eth1
iface eth1 inet dhcp
DHCPで取らない場合には
auto eth1
iface eth1 inet static
    address 192.168.11.15
    netmask 255.255.255.0
    gateway 192.168.11.1
とかするようだ。 で、networkを下げてあげる。
sudo start network-interface INTERFACE=eth1
などとやるとeth1がupする。 service とかつかわずにstart, stopなどを用いるようだ。