ScalaからRedmineを操作する

概要

Redmine API
http://www.redmine.org/projects/redmine/wiki/Rest_api

ScalaからRedmineAPIを使って、チケットを取得したり操作したりするための設定を行います。

RedmineAPIキーを取得

以下のページを参考に、RedmineAPIキーを取得します。
http://redmine.jp/glossary/r/rest-api/

Java向けのSDKを導入

APIを使うためのSDKが用意されているので、それを使用します。
http://www.redmine.org/projects/redmine/wiki/Rest_api#API-Usage-in-various-languagestools

以下のリンクで、最新のバージョンを調べてsbtファイルに追記します。
http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.taskadapter%22%20AND%20a%3A%22redmine-java-api%22

libraryDependencies += "com.taskadapter" % "redmine-java-api" % "3.0.1"

サンプルコード

あとはSDKを使用してプログラムを書くのみです 。
以下は、対象のプロジェクトのチケット一覧を取得するサンプルコードになっています。

import com.taskadapter.redmineapi.RedmineManagerFactory

import collection.JavaConversions._


object Redmine {
  def main(args: Array[String]): Unit = {
    // RedmineのURL
    val uri = "https://xxxxxxxxxxxxxxxxxxxxxxxxxx/"

    // APIキー
    val accessKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    // プロジェクト名
    val project = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    val mgr = RedmineManagerFactory.createWithApiKey(uri, accessKey)
    val issues = mgr.getIssueManager().getIssues(project, null)
    for (issue <- issues) {
      println(issue.getSubject)
    }
  }
}

ドキュメント

Redmine API
http://www.redmine.org/projects/redmine/wiki/Rest_api

素数判定

概要

素数判定のプログラムを書くことを考えます。
素朴な実装をするとO(n)の計算量になってしまうので、
高速化することを考える必要があります。

素朴な実装

素朴な実装では、与えられた整数xが2からx-1までの数で割り切れるかどうかを順番に調べます。

int isPrime(int x)
{
  if (x <= 1) return 0;

  if (x == 2) return 1;

  for (int i=2; i<x; i++) {
    if (x % i == 0) return 0;
  }

  return 1;
}

これはO(n)の計算量のアルゴリズムです。

高速化

素数判定では、「合成数  x x \leq sqrt(x) を満たす素因子  p をもつ」という性質を利用します。
合成数とは、素数でない数のことです。

例えば 36 の場合、「合成数  36 p \leq sqrt(36) を満たす素因子 pをもつ」。
つまり、36は6以下の素因子を持つことを意味します(p=2,3,4,6)。
36の素因子は12や18もありますね。
しかし、36が素数かどうか判定する場合は、6以下の整数の中に素因子があるかどうかを調べれば良いことになります。

つまりプログラム上では、 x-1 (素朴な方法)まで調べる必要はなく、  sqrt(x) まで調べれば良いことになります。

int isPrime(int x)
{
  if (x <= 1) return 0;

  if (x == 2) return 1;

  for (int i=2; i<sqrt(x); i++) {
    if (x % i == 0) return 0;
  }

  return 1;
}

このアルゴリズムは、 O(sqrt(n)) の計算量になります。

証明

合成数  x x \leq sqrt(x) を満たす素因子  p をもつ 」
という性質の証明は以下のとおりです。

 n合成数の場合、1でない整数 p,q (p \leq q) が存在して、 n=pq とかける。

ここで、 p \gt sqrt(n) とすると、

(1) 両辺を2乗して、 p2 > n
(2)  p \leq q から、  pq \geq p2

(1)、(2) から、  pq \geq p2 > n
となり矛盾するため、
 p \leq sqrt(n)

 pはそれ自体が素数か、p未満の素因数を持つため、
 sqrt(n) 以下の素因数を持つ。

よって、  n=pq より、  n sqrt(n) 以下の素因数を持つ。

参考

素数判定 | アルゴリズムとデータ構造 | Aizu Online Judge

detail.chiebukuro.yahoo.co.jp

SQL_MakerをComposerでインストールできるようにした

PerlSQL::MakerをPHPに移植して作ったSQL_Makerを、
書き直してPackagistにアップロードしてみました。

https://packagist.org/packages/uchiko/sql-maker

これでComposerからインストールすることができます。

導入手順

以下のコマンドでcomposer.pharをインストール。

$ curl -s http://getcomposer.org/installer | php

以下の内容のcomposer.jsonを作成します。

{
    "require": {
        "uchiko/sql-maker": "dev-master"
    }
}

以下のコマンドで、モジュールをインストールします。

$ php composer.phar install

vendorディレクトリにモジュールがインストールされます。

使用する

以下のように使用できます。

<?php

require_once 'vendor/autoload.php';

$builder = new uchiko\SQL\Maker(array('driver' => 'SQLite'));

$fields = array();

$where = array();
$where['area'] = 'houen';
$where['type'] = array( 'like' => '%electric%' );

$opt = array();
$opt['order_by'] = array('id');

list($sql, $binds) =
    $builder->select($table, $fields, $where, $opt);

var_dump($sql);
var_dump($binds);

/*
 * $sql   => "SELECT id, name
 *            FROM pokedex
 *            WHERE (area = ?) AND (type LIKE ?)
 *            ORDER BY id"
 * $binds => ("houen", "%electric%")
 */


ComposerでBundlerやCartonみたいなことができるのは面白いですね。
名前空間にベンダー名を入れるのは少し気になりますが。

!!1する意味が分からない

1と!!1の違いが分からない。
!!'test' ならやりたいことは分かる。
!!1はやりたいことが分からない。

ひとまずDumpしてみた。

use strict;
use warnings;
use Devel::Peek;

# SV = IV(0xdf12788) at 0xdf12798
#   REFCNT = 1
#   FLAGS = (IOK,READONLY,pIOK)
#   IV = 1
Dump(1);

# SV = PVNV(0xdefde30) at 0x74cea0
#   REFCNT = 2147483644
#   FLAGS = (IOK,NOK,POK,READONLY,pIOK,pNOK,pPOK)
#   IV = 1
#   NV = 1
#   PV = 0xdefeb10 "1"\0
#   CUR = 1
#   LEN = 16
Dump(!!1);

分からない。

追記

強調なんですね。確かに「んん!?」となりましたが。

ルーティング設定に名前をつける

以下のようにルートに名前をつけることが出来ます。

# Mojolicious::Liteの場合
get '/hoge/detail/:id' => sub { ... } => 'hoge/detail';

# Mojoliciousの場合
$r->get('/hoge/detail/:id')->to('hoge#detail')->name('hoge/detail');

このようにしておくと、
url_forやredirect_toを以下のように書くことができます。

$c->url_for('hoge/detail', id => 1);          # -> /hoge/detail/1
$c->redirect_to('hoge/detail', id => 2);    # -> /hoge/detail/2

とても便利ですね。


また、stashにidの値がすでに入っている場合、自動的に「:id」に値が挿入されます。

warn $c->stash->{id};       # -> 1
$c->url_for('hoge/detail'); # -> /hoge/detail/1

ページャなどで、idを引き継ぐ必要がある場合に便利ですね。

emacsclientでtty関連のエラーが出る

http://www.emacswiki.org/emacs/EmacsAsDaemon#toc17

他のユーザーから切り替えたユーザーでemacsclientを実行すると、
以下の様にttyでエラーが出ます。

*ERROR*: Could not open file: /dev/pts/1

ユーザーを切り替えるときはsshを使ったほうが良いみたいです。

$ ssh hogehoge@localhost