ubuntu 12.04でtmuxとgitの最新版を使いたい

ubuntu 12.04を普通にインストールするとtmuxは1.6がインストール済み、gitは入ってないからaptitudeでインストールすると1.7.*とかが降ってくる。
これをなんとか最新版にしたい。

準備

と思って調べてみると、ppaリポジトリを追加すればokということらしいけど、リポジトリを追加するコマンド自体が入ってないので、まずそれを入れる。

$ sudo apt-get install python-software-properties

tmuxの場合

$ sudo add-apt-repository ppa:pi-rho/dev
$ sudo aptitude update
$ sudo aptitude upgrade tmux

gitの場合

$ sudo apt-add-repository ppa:git-core/ppa
$ sudo aptitude update
$ sudo aptitude install -y git-core

Seleniumを使ってみたメモ

フォームの入力画面の繰り返しが面倒だったので調べてみた。

Selenium IDE

http://docs.seleniumhq.org/
Firefoxのアドオンをインストールするだけで使えた。
なんで今まで使わなかったのか不思議なくらいに導入も簡単にできる。

Eclipse

JavaのLanguage Bindingsをダウンロードして展開。
Eclipseのメニューから[Window]-[Preferences]、
[Java]-[Build Path]-[User Libraries]に[New...]して、上記展開してできたjarを全部追加する。
プロジェクトのBuildPathにそのユーザライブラリを追加。

Selenium IDEから[ファイル]-[テストケースをエクスポート...]-[Java - JUnit 4 - WebDriver]。

Fierfoxのパスが分からないみたいな例外が起きたのでドライバ利用部分を以下のように修正。

String pathToBinary = "C:\\Program Files (x86)\\Mozilla\\Firefox\\firefox.exe";
System.setProperty("webdriver.firefox.bin", pathToBinary);
driver = new FirefoxDriver();

IEの場合、IE Driver Server(32bit)をダウンロードして展開、PATH通した。
IEの設定変更とかも実行。
あとdriverのクラスを変更。

import org.openqa.selenium.ie.InternetExplorerDriver;

driver = new InternetExplorerDriver();

VisualStudio(C#)

NuGetから以下をインストール。
Selenium WebDriver
Selenium WebDriver Support Classes

Selenium IDEから[ファイル]-[テストケースをエクスポート...]-[C# - NUnit - WebDriver]。

IEの場合、IE Driver Server(32bit)をダウンロードして展開、PATH通した。
IEのセキュリティ設定変更とかも実行。

driverのクラスを変更。

using OpenQA.Selenium.IE;

driver = new InternetExplorerDriver();

ハマったところ

開くURLに気を付ける。baseURLがドメインだけでなくてURL全部書かれてないか。

WebDriverを使うとxpathでのDOM検索がうまく動かなかった気がする。(要確認)

参考

さわりはこちらを参照した。
http://www.atmarkit.co.jp/ait/articles/0908/19/news109.html

設定なんかはこちらを参照した。
http://codezine.jp/article/detail/7456

Objective-CでXML Webサービスを使ってみる

調べてもまともに情報が出てこずに、いろいろ大変だったのでメモ。
ここを使わせてもらう。

準備

wsdl2objcをダウンロードする。ここのUsageInstructionsはまるで役に立たないので無視。
先のサービスのWSDLを取得して*1、objcのソースを出力しておく。

実装

Xcodeを起動してプロジェクトを新規作成。


[TARGETS]-[Build Phases]にlibxml2.2.dylibを追加。

[TARGETS]-[Build Settings]-[Header Search Paths]に"${SDKROOT}/usr/include/libxml2"を追加。


先に出力したソースを全部プロジェクトに取り込む。


importして、

#import "TempConvert.h"

実装して、

TempConvertSoap *soap = [TempConvert TempConvertSoap];
soap.logXMLInOut = YES;

TempConvert_CelsiusToFahrenheit *p = [[TempConvert_CelsiusToFahrenheit alloc] init];
p.Celsius = @"30";

TempConvertSoapResponse *response = [soap CelsiusToFahrenheitUsingParameters:p];
NSLog(@"res:%@",response);

実行するものの、なにか問題が起きてる。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
    <soap:Fault>
      <soap:Code>
        <soap:Value>soap:Sender</soap:Value>
      </soap:Code>
      <soap:Reason>
        <soap:Text xml:lang="en">Unable to handle request without a valid action parameter. Please supply a valid soap action.</soap:Text>
      </soap:Reason>
      <soap:Detail />
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

この時点でさっぱりわからなくなったんだけど、実行例と比べてみると入力が微妙に異なる。

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:TempConvert="http://tempuri.org/" xsl:version="1.0">
  <soap:Body>
    <CelsiusToFahrenheit xsi:type="TempConvert:CelsiusToFahrenheit">
      <Celsius>30</Celsius>
    </CelsiusToFahrenheit>
  </soap:Body>
</soap:Envelope>


WSDLから自動生成されたソースを修正。これ合ってるの?

// TempConvert.m
// @implementation TempConvert_CelsiusToFahrenheit
// - (xmlNodePtr)xmlNodeForDoc:(xmlDocPtr)doc elementName:(NSString *)elName

// 266行目
//	xmlSetNsProp(node, xsi, (const xmlChar*)"type", (const xmlChar*)"TempConvert:CelsiusToFahrenheit");
    xmlNsPtr xmlns = xmlSearchNs(doc, root, (const xmlChar*)"xmlns");
    xmlSetNsProp(node, xmlns, (const xmlChar*)"xmlns", (const xmlChar*)"http://tempuri.org/");

再度実行すると

TempConvertSoapResponse *response = [soap CelsiusToFahrenheitUsingParameters:p];
//    NSLog(@"res:%@",response);
//    NSLog(@"body: %@",response.bodyParts);

TempConvert_CelsiusToFahrenheitResponse *result = [response.bodyParts objectAtIndex:0];
NSLog(@"%@F",result.CelsiusToFahrenheitResult);
// => 2013-10-04 23:09:50.059 xmlwebsvc-test[767:c303] 86F


通りました。

ソース

まとめ

SOAPのやりとりがめんどくさい。
HTTP Postでも呼び出せるならそっちの方がいいんじゃないかと思う。そこでRESTの登場ですよってことなのかな。


VisualStudioだとサービス参照追加するだけで済むのでらくちん。

var client = new TempConvert.TempConvertSoapClient("TempConvertSoap");
string fahrenheit = client.CelsiusToFahrenheit("30");
System.Diagnostics.Debug.WriteLine(string.Format("{0}F", fahrenheit));
// => 86F

だからこそ、裏側をなにも知らなかったんだな。

参考サイト

wsdl2objc
WSDLからobjcのソースを生成するMacのアプリ。ソースが古いんだけど、大丈夫なんだか。
いやそれ以前に、生成されたコードに手を加えずに組み込めないものか。


W3Schools
チュートリアルみたいなのがいっぱいあったサイト。


WebserviceX.NET
使わなかったけど、webサービスがいっぱい登録されてて検索できるみたい。

*1:アプリには「Path or URL」と書いてあるけどURLの直接参照ではうまく行かなかったので、一旦WSDLをローカルに保存した

C#でテストする(MSTest)

折角なので、以前調べてそれきりだったのを一応自分で書いてみる。


環境は VS2010Ultimate。なので自宅PCでは無理。

手順

(1)プロジェクトを作る
(2)テストプロジェクトを作って、参照設定する

「プロジェクト」タブで対象プロジェクトを追加する

(3)テストを書く
using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using ClassLibrary1;

namespace TestProject1
{
    /// <summary>
    /// BankAccountTest の概要の説明
    /// </summary>
    [TestClass]
    public class BankAccountTest
    {

/* 中略 */

        private BankAccount bankAccount_;

        [TestInitialize]
        public void 準備()
        {
            bankAccount_ = new BankAccount(1000);
        }

        [TestMethod]
        public void 残高()
        {
            Assert.AreEqual(1000, bankAccount_.Amount);
        }

        [TestMethod]
        public void 引き出す()
        {
            bankAccount_.Withdraw(200);
            Assert.AreEqual(800, bankAccount_.Amount);
        }

        [TestMethod]
        public void 預け入れる()
        {
            bankAccount_.Deposit(300);
            Assert.AreEqual(1300, bankAccount_.Amount);
        }
    }
}

属性が微妙にNUnitと違う。

(4)本体を書く

NUnitと同じなので省略。


できましたー。

メモ

コンソールアプリのテストができない?とか書いてたことについて、今回も同じことをやる過程で、そもそもコンソールアプリを参照設定すること自体がなんか変だということに気が付いた。


MSTestはVS統合されているだけあって、クリックでドンもできるし、ショートカットもできるし楽ちん。と思いきや、2ステップのキーバインドがちょっと。Ctrl+R,AをCtrl+R,Ctrl+Aと押してしまうと、赤出た時にいちいちデバッガで止まってしまう。

C#でテストする(NUnit)

ブックマークの整理をしていたら、やっぱり自分でもまとめておかないといけない気がしたので。
案の定いろいろ詰まったわけで。


環境はVS2010Express / NUnit2.6.2

手順

(1)プロジェクトを作る
(2)テストプロジェクトを作って、参照設定する

「プロジェクト」タブで対象プロジェクトを追加するのと、「参照」タブでnunit.framework.dllを探して追加する。

(3)テストを書く
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using NUnit.Framework;
using ClassLibrary1;

namespace ClassLibrary1Tests
{
    [TestFixture]
    public class BankAccountTest
    {
        private BankAccount bankAccount_;

        [SetUp]
        public void 準備()
        {
            bankAccount_ = new BankAccount(1000);
        }

        [Test]
        public void 残高()
        {
            Assert.AreEqual(1000, bankAccount_.Amount);
        }

        [Test]
        public void 預け入れる()
        {
            bankAccount_.Deposit(200);
            Assert.AreEqual(1200, bankAccount_.Amount);
        }

        [Test]
        public void 引き出す()
        {
            bankAccount_.Withdraw(300);
            Assert.AreEqual(700, bankAccount_.Amount);
        }
    }
}
(4)本体を書く
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary1
{
    public class BankAccount
    {
        private int amount_;

        public BankAccount(int value)
        {
            amount_ = value;
        }

        public int Amount
        {
            get { return amount_; }
        }

        public void Deposit(int value)
        {
            amount_ += value;
        }

        public void Withdraw(int value)
        {
            amount_ -= value;
        }
    }
}


できましたー。

メモ

むしろこっちをメモしたい。

(1)expressだからか、デフォルトではReleaseビルドしかできなくなってるので、VSの設定を変更。

[ツール]-[オプション...]
[プロジェクトおよびソリューション]-[全般]
[ビルド構成の詳細を表示]にチェック。

(2)対象がコンソールアプリの場合、テストできない?

とりあえずプロジェクトをクラスライブラリにしたらテストできたのでいいけど。

SetUp : System.BadImageFormatException : ファイルまたはアセンブリ 
'ConsoleApplication03, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'、
またはその依存関係の 1 つが読み込めませんでした。間違ったフォーマットのプログラムを読み込もうとしました。

HTMLカラーをRGBにする

「.NETなら簡単にできるよー」とか耳にしたので、LLなら普通にできるんじゃ?と思いつつ、どれだけ簡単にできるのか試してみた。

#p ARGV[0]
c = "0x00aaff"
/0x([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})/i =~ c
puts $1.hex, $2.hex, $3.hex
# => 0
#    170
#    255

rubyの書き方わからん。

PS C:\Windows\system32> [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
PS C:\Windows\system32> [Drawing.Color]::FromArgb("#112233")


R             : 17
G             : 34
B             : 51
A             : 0
IsKnownColor  : False
IsEmpty       : False
IsNamedColor  : False
IsSystemColor : False
Name          : 112233

わざわざRGBに直す必要がない気がしてきた。
2桁ずつ切って「0x」つけたら終わりじゃないか?


コードをps1ファイルに記述して実行しようと思った時に、やっぱりはまった。

# 管理者権限でpowershell.exeを起動してから

PS C:\Windows\system32> Get-ExecutionPolicy
Restricted
PS C:\Windows\system32> Set-ExecutionPolicy remotesigned

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピックで説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y
PS C:\Windows\system32> Get-ExecutionPolicy
RemoteSigned


さすがに、もうすっかり忘れてる。

PHPで動的にグラフを描画する

さすがに、gdで絵を描くのはきつかろうということで、探したところpChartにたどり着いた。


本家
http://pchart.sourceforge.net/index.php

ドキュメントの日本語訳
http://www.t-net.ne.jp/~cyfis/p_chart/index.html

M+とIPAの合成フォント
http://mix-mplus-ipa.sourceforge.jp/

<?php
include("./pChart.1.27d/pChart/pData.class");
include("./pChart.1.27d/pChart/pChart.class");

$font_dir_path = "./pChart.1.27d/Fonts";  // フォント置く場所をうまく指定しないといけない
$font_name = "Migu-1M-regular.ttf";

// データ用意
$dataSet = new pData();
$dataSet->AddPoint(array( 554999, 371095, 376568,1311948,1105588,1993960,1596025), "range1");
$dataSet->AddPoint(array( 746428, 504383, 485484,1933207,1665986,3834749,2484725), "range2");
$dataSet->AddPoint(array( 787426, 534065, 516801,1886867,1611798,3336195,2377285), "range3");
$dataSet->AddPoint(array( 708489, 465814, 490057,1693179,1476011,2791729,2015274), "range4");
$dataSet->AddPoint(array( 181797, 125417, 135876, 297883, 290416, 653277, 412149), "range5");
$dataSet->AddPoint(array('茨城県', '栃木県', '群馬県', '埼玉県', '千葉県', '東京都', '神奈川県'), "Serie0");
$dataSet->AddAllSeries();
$dataSet->RemoveSerie("Serie0");
$dataSet->SetAbsciseLabelSerie("Serie0");
$dataSet->SetSerieName( "0-19", "range1");
$dataSet->SetSerieName("20-39", "range2");
$dataSet->SetSerieName("40-59", "range3");
$dataSet->SetSerieName("60-79", "range4");
$dataSet->SetSerieName(  "80-", "range5");
$dataSet->SetYAxisName("");
$dataSet->SetXAxisName("都道府県");

// Y軸の上辺値を得る
$maxScale = getMaxScale($dataSet->GetData());

// グラフ生成
$chart = new pChart(600, 350);

// 背景色塗りつぶし
$chart->drawGraphAreaGradient(230, 255, 255, 2, TARGET_BACKGROUND);

$chart->setFontProperties("$font_dir_path/$font_name", 8);
$chart->setGraphArea(100, 50, 490, 290);  // グラフ領域のサイズ設定
$chart->drawGraphArea(255, 255, 230, false);  // グラフ領域の背景色設定
$chart->setFixedScale(0, $maxScale, 5);  // 縦は5分割固定
$chart->drawScale($dataSet->GetData(), $dataSet->GetDataDescription(), SCALE_ADDALL, 0, 0, 0, true, 0, 2, true);

//$chart->drawGrid(2, false);  // 縦罫線いらないから横罫線を手で引く
{
  $y = 290 - 50;
  $y2 = $y / 5;
  foreach (range(1, 4) as $time) {
    $y3 = 50 + $y2 * $time;
    $chart->drawDottedLine(100, $y3, 490, $y3, 2, 220, 220, 220, 255);
  }
}

// 積み上げ棒グラフ
$chart->drawStackedBarGraph($dataSet->GetData(), $dataSet->GetDataDescription(), 50);  // 第3引数は透過度

// タイトルを描画する
$title = "都道府県別人口";
$chart->setFontProperties("$font_dir_path/$font_name", 10);
$chart->drawTitle(50, 30, $title, 0, 0, 0, 550);

// グラフの判例を描画する
$chart->setFontProperties("$font_dir_path/$font_name", 8);
$chart->drawLegend(510, 20, $dataSet->GetDataDescription(), 240, 240, 240);

$chart->addBorder(1);
$chart->Stroke();


function getMaxColumnValue($data) {
  $tmp = array();
  foreach (range(0, count($data)-1) as $i) {
    $tmp[$i] = 0;
  }

  foreach ($data as $index => $value) {
    foreach (range(1, 5) as $i) {
      $tmp[$index] += $value['range'.$i];
    }
  }
  return max($tmp);
}

function getMaxScale($data) {
  $maxValue = getMaxColumnValue($data);
  $base = getBaseNum($maxValue);
  $mod = $maxValue % $base;
  $diff = $base - $mod;
  $result = $maxValue + $diff;
  return $result;
}

function getBaseNum($num) {
  $len = strlen($num);
  $base = pow(10, $len - 2);  // 数値が100万前後じゃないとダメだろこれ
  return $base;
}

いつもの悪い癖で、後半きつくなってきた。Googleのやつみたいに、GUIでちょちょいと編集できるサービスがあればなー。


キャメルとパスカルが混ざってるのって、わざとやってるのかな。
そういえばずっとパスカルって呼んでたけど、最近はアッパーキャメルの方がメジャーなのかしら。


しかも、ここまで書いておいて、pChart2.xの方がよかったりして?
少なくとも全部キャメルになってるみたいな。ドキュメントのjsがおかしいっぽいところあるけど。


カラーピッカー
http://www.colorpicker.com/

政府統計の総合窓口
http://www.e-stat.go.jp/SG1/estat/eStatTopPortal.do
たぶん22年分のデータだったと思う。

Google Chart Tools / Image Charts (aka Chart API)
http://code.google.com/intl/ja/apis/chart/