C#とJava

C#は結構長年実際に使用してきたし、普通にコードが書ける。で、最近個人的にソフトを作っていてJavaでやってみようと思ってここ1ヶ月ほど触ってみているが、JavaとC#の差があまりにもないためにどっちかの言語に慣れ親しんでいるのならば簡単に入れちゃうなあと実感しているところだ。例えば自分が実際に今作っているソフトのほんの一部だが以下のサンプルを見てもらおう。

public List<AbstractXWPFSDT> GetContentControlTitles() throws Exception {

    if (_wordDocument == null)
    {
        throw new Exception("Loadメソッドを実行してください");
    }

    return extractAllSDTs(_wordDocument);

}

public AbstractXWPFSDT GetContentControl(String contentControlTitle)
{
    List<AbstractXWPFSDT> contentControls = extractAllSDTs(_wordDocument);
    for(AbstractXWPFSDT contentControl: contentControls)
    {
        if (contentControl.getTitle() == contentControlTitle)
        {
            return contentControl;
        }
    }

    return null;
}

 

上のサンプルでC#と違うところといえばメソッドにthrows Exceptionがあるくらいだろう。C#はJavaよりも4~5年遅くリリースされたのでC#はJavaのパクリか?とも思えなくもないが、C#の方がシンタックス的に精錬されているところは少なくない。

それにしても最近はプログラミングでの発見が多い。発見というよりも自分が今まで勉強不足だっただけなのかもしれないが、jQueryとかJavaとかChromeでの開発者モードとかIntelliJ IDEAとか本当に素晴らしい技術が無料で使える時代だ。そんな素晴らしい技術をこのスペースで徐々に紹介していけたらなあと思うけど、時間がなあ…

TeamCityに100日間ログインしてないアカウントを削除する

TeamCityを管理していてずいぶんとユーザーが増えました。監査とかがあっていらないアカウントを消しておこうということで、PowerShellでTeamCityのREST APIを実行してみました。ご参考まで。

param
(
    [Parameter(Mandatory=$False)] [string]$TeamCityUsername = "admin",
    [Parameter(Mandatory=$False)] [string]$TeamCityPassword = "YourPassword",
       [Parameter(Mandatory=$False)] [string]$TeamCityBaseUrl = "http://teamcity:8080"
)

$secpasswd = ConvertTo-SecureString $TeamCityPassword -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($TeamCityUsername, $secpasswd)
$userList = (Invoke-RestMethod -Credential $cred -Uri "$TeamCityBaseUrl/httpAuth/app/rest/users")

$userIDsToDelete = @()

ForEach($user in $userList.DocumentElement.ChildNodes)
{
    $userid = $user.id
    Write-Host ("Getting user data for " + $user.id)
    $userData =  (Invoke-RestMethod -Method Get -Credential $cred -Uri "$TeamCityBaseUrl/httpAuth/app/rest/users/id:$userid")

    If ($userData.DocumentElement.lastLogin -ne $null)
    {
        $lastLoginDateTime = [datetime]::ParseExact($userData.DocumentElement.lastLogin, "yyyyMMdd'T'HHmmsszzz", [System.Globalization.CultureInfo]::InvariantCulture)
    }
    Else
    {
        Continue
    }
    
    $loginAge = [datetime]::Now - $lastLoginDateTime
    If ($loginAge.Days -gt 100)
    {
        $userIDsToDelete += $userid
    }
}

ForEach($IdToDelete in $userIDsToDelete)
{
    $uri = "$TeamCityBaseUrl/httpAuth/app/rest/users/id:$IdToDelete"

    $servicePoint =  [System.Net.ServicePointManager]::FindServicePoint($uri)
    Invoke-RestMethod -Method Delete -Credential $cred -Uri $uri -UserAgent ([Microsoft.PowerShell.Commands.PSUserAgent]::InternetExplorer)
    $servicePoint.CloseConnectionGroup("") | Out-Null
    Write-Host ($IdToDelete + " deleted")
}


Write-Host ($userIdsToDelete.Count.ToString() + " user accounts deleted")

JavaでXMLのattributeの値を取得する

XPathを使ってあるNodeのattributeの値を単に出力するというものなんだけど、Javaってこんなに大変なの?って思うぐらい。自分が使っているライブラリが古いとか別にもっといいのがあるのかもしれないけど…とりあえずXMLは下のように自分で適当に作ったサンプルでやってみました。

<?xml version="1.0" encoding="utf-8" ?>
<MyXmlDoc>
  <IraneNode>
    <Test attr1="test value 1" attr2="test value 2" />
    <Test attr1="test value 3" attr2="test value 4" />
    <Test attr1="test value 5" attr2="test value 6" />
    <Test attr1="test value 7" attr2="test value 8" />
    <Test attr1="test value 9" attr2="test value 10" />
  </IraneNode>
</MyXmlDoc>

んで、このXMLのTestのノードをすべてループしてattr1の属性の値をアウトプットするだけ。Javaでやってみたらこんなになりました。

package com.company;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.File;

import java.io.IOException;

public class Main {

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, XPathExpressionException {
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();

        File f = new File("C:\\Development\\IntelliJ\\test\\src\\com\\company\\Sample.xml");
        Document doc = builder.parse(f);

        XPath xpath = XPathFactory.newInstance().newXPath();
        NodeList testNodes = (NodeList) xpath.evaluate("/MyXmlDoc/IraneNode/Test", doc, XPathConstants.NODESET);


        for(int i = 0; i < testNodes.getLength(); i++) {
            Element el = (Element) testNodes.item(i);
            System.out.println(el.getAttributeNode("attr1").getValue());
        }

    }
}

出力は以下のようになります。

test value 1
test value 3
test value 5
test value 7
test value 9

なんですかこのImportの数は…しかもこれをするだけで型の変換が2回も。長い…長すぎる。自分が知らないだけなのか?それともJavaは今のところこういうふうにしてしかXMLは扱えないのか?ちなみに同じことをC#でやると下のようになります。

using System;
using System.Xml;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            var doc = new XmlDocument();
            doc.Load("Sample.xml");

            var testNodes = doc.SelectNodes("/MyXmlDoc/IraneNode/Test");
            foreach (XmlNode n in testNodes)
            {
                Console.WriteLine(n.Attributes["attr1"].Value);
            }
            Console.Read();
        }
    }
}

この違いは激しすぎる。これからJavaでちょっとしたプラグインを作ろうと思ってXMLを勉強してたのですが、ちょっと萎えかけていますwww

Javaに関して気になるニュースがありました。それは来年にはJava 9がリリースされるとのこと。オラクル社がSunマイクロシステムズを買収してからJavaを開発していた人たちが次々と辞めてしまって、そこからチームを再編して言語のコアな部分の見直しからやっているので9はかなり大きなリリースになるとのこと。コードができるだけシンプルで読みやすく記述できるようになるといいなあ。


					

PowerShellでリモートマシンを再起動

PowerShellのバージョン4.0からRestart-Computerというコマンドレットが使用できるようになりました。リモートマシンがリモートデスクトップで反応しなかったり、いちいちリモートデスクトップにアクセスして再起動するのが面倒な時には役立つコマンドかと思います。例えば…

$passowrd = "MyPasswordHere" | ConvertTo-SecureString -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("MyUserName", $passowrd)

Restart-Computer -ComputerName "MyRemoteComputer" -Credential $credential -Wait -Force
Write-Host "再起動が完了しました。" -ForegroundColor Yellow

これをテキストファイルに保存して実行するとか、Functionを書いて$profileのファイル内に書き込んでコマンドレットとして利用しちゃうのもいいかもしれませんね。

QTTabBar

開発の仕事をしていると「こうできたら便利なのになあ」と思うことが多い。Windowsを使っていてできたらいいのになあと思うことはタブが使用できるWindows Explorerだ。QTTabBarというソフトはオープンソースの無料ソフトでWindowsに於いてタブ化を可能にしてくれる。

image

日本語化と詳しい使い方はここにあるようなので是非試してみてほしいと思います。

追記:

QTTabBarをWindows Server 2012 R2(自分の開発用VM)で試してみたのですが、残念ながらQTTabBarは作動しませんでした。なんかいろいろいじったらもしかしてできるようになるのかなあ、と思いながらも時間がないのでほったらかしですw

プログラミングで人生を学ぶ

タイトルはとても大げさなものだが、自分はプログラミングを学んで、そして今でも学び続けることができて良かったと思っている。それは、自分の思考過程をある意味整えてくれる活動だからだ。故スティーブ・ジョブズは生前こんなことを言っている。「Everybody in this country should learn to program a computer, because it teaches you how to think.」訳すと「この国のすべての人はコンピュータープログラミングを学ぶべきだ。なぜならそれによって(物事について)どう考えたらいいかを学べるからだ。」ということだ。

この考え方は完全に無視していいものではなくて、大変興味深く意味のあるものだと思う。自分はプログラマーであり今の職業に就くにはそれなりの理系の思考傾向があってのことだと思うが、プログラミングを学んだことによってより理論的に考えるようになったのも事実だと思う。理論的思考が絶対的に正しいとは言わない。しかし仕事に於いては9割、政治の世界においては7割の論理的思考が役立っていてそれが必要不可欠ではないだろうか。そしてそれから得られたものは計り知れないと、漠然ではあるが、思っている。

中学から数学を学ぶ意味もこの論理的思考を養うという大きな意味があり、プログラミングがいずれ小学校や中学校で必須となる日も来るのではないか。そして、そんな時代の流れに疎い大人は「え?」となり若者とのギャップに違和感を感じざるを得なくなる時が遠からず来るような気がする。イギリスの蒸気動力による産業革命があったとして、アメリカを発端とする第二次産業革命はまさにシリコンバレーに於いて起こったと言って過言ではないと思う。それは当然AppleやMicrosoftによるパーソナル・コンピューター産業勃興も大変大きな意味を持つが、それ以前に成し遂げられたFairchild社やIntel社(ロバート・ノイス氏)に代表されるマイクロチップの発明にあると思う。それからまだ100年も経っていない現在、我々はその歴史的意味を評価できる程時が経っていないのかもしれない。

自分が感じるのは、この仕事についてから十余年が経つ今でもその素晴らしさとパワーに圧倒され、まだまだこれから大きな可能性を持っている分野だと思って疑わないのだ。

Pythonで動的プロパティ(属性)

クラスを作ったらそれに属性を設けるのは当然なことでありますが、Pythonのように柔軟なプログラミング言語では実行時にプロパティをくっつけて使ってしまうことができます。例えば…

class MyObject(object):
    pass

Pythonにおいて上は最もシンプルなクラスの記述でありますが、これだとobjectを継承しているのみで機能をほとんど持たないクラスです。プロパティを持たないクラスなのに実行時に使うことができてしまいます。下に例を挙げておきましょう。

myobject = MyObject()
myobject.firstname = '俺の苗字'
myobject.lastname = '俺の名'
print('firstname:', myobject.firstname)
print('lastname:', myobject.lastname)

これについては賛否両論ありそうですね。自分としてはソフトウェアを設計して徐々に築き上げていくという意味ではクラスを作成するときにはちゃんとプロパティやメソッドを定義した方がいいような気がします。

プログラミングをするツールについて

何をするにもプロの世界では道具というものは大切なものです。プログラミングも例外ではありません。プログラミングというものは基本的にはテキストエディタ(Windowsではメモ帳に値するもの)とコンパイラがあればできるのですが、やっぱりプログラミングを援助してくれるソフトウェアというものはあります。プログラミングを習得したいという意志があるのであれば、それぞれのOSについてくるデフォルトのテキストエディタではなくて、プログラミングを手助けしてくれるようなエディタをインストールしましょう。無料で使えるのを以下に紹介しておきます。

テキストエディタ系

統合開発環境系

テキストエディタ系のソフトは基本的にはプログラミング言語に色を付けてくれるものです。これだけでかなり間違いを防ぐことができます。統合開発環境系は本当にあらゆる方面からのプログラミング活動を助けてくれるツールが入っているので、便利といえば便利ですが、逆に初心者にはとっつきにくいということもあります。とりあえずはNotepad++をインストールしてみてはいかがでしょうか。