.NET Core 5

C#やVBのコードをWindowsだけではなく、MacやLinuxでも動かすことができたらどんなに素晴らしいことだろう…という「夢」の実現に向けて大きな一歩を踏み出してくれたのが.NET Core 5だ。浸透するまでにはしばらく時間がかかると思うが、これは期待大である。

Javaは少しかじった程度でしかないが、C#に似てはいるけど、コードを書く量が多いような気がする。C#は非常にきれいで簡潔なコードになるのでやっぱりC#が好きだ。

実際にMacでHello Worldを動かして見たのだが、なんの問題もなく動いた。これから徐々にいろいろ試してみたいと思う。

Cloud9

アメリカではホリデーシーズンで現在は感謝祭の4連休。日本にいらっしゃる方は「羨ましい」なんて思われるかも知れませんが、なんとアメリカは国民の休日が日本の2分の1なのです。有給休暇は取りにくい環境にいらっしゃるのはわかってるけど、逆に日本の方が休みが多かったりします。

さて、.NET、Ruby、Python、Javaなどなど本当にたくさんのプログラミング言語が乱立している中、自分のコンピューターにすべての環境を整えるのは結構面倒だし、コンピューターを何台も持っている場合はその環境やコードベースを同期させておくのは結構な労力だ。そこでクラウド上で開発環境が一定に使用できるサービスがCloud9である。

ワークスペース毎に仮想マシンを作成してくれるらしい。ある程度までは無料なので、ちょっとしたコードを試したり、徐々にコードを積み上げたい場合はもってこいなのかなと思う。

http://c9.io

決して回し者ではありませんw

就職活動を通して

実は、現在勤務している会社の支社が閉鎖されることになってリストラ勧告されました。9月の末のことでした。ぶっちゃけマネジメントも新しいことをしようという気概がなく、開発をインドにアウトソーシングしてしまえということで閉鎖。職を失うことは不安だったけど、逆に新しいことに挑戦ができるという嬉しさでいっぱいでした。

履歴書をジョブサイトに上げると電話やメールが沢山来ました。最初の面接に行った時にホワイトボードにコードを書かされましたが、そんなことをする必要もしたこともなく、あえなく撃沈。そこで初めて「あ、自分は全然準備出来てない」と焦り始めました。

現職の最終日が12月の中旬ということで面接にたどり着くのにも一苦労。つまり、アメリカでは2週間ぐらいで仕事が初められる状態の人じゃないとほとんどのところが他の候補者を面接の対象にしてしまう。自分は正直に「12月じゃないと仕事できません」なんて言っていたもんだから、そこで最初の数週間ぐらいはロスしたのかなと思ってます。

13年ぶりの就職活動は結構キツかった。12月で仕事が終わっても失業保証が4ヶ月ほど続くし、まだ時間があるのになぜかすごく焦ってました。自分が仕事をしないと子どもたちを路頭に迷わせてしまうという危機感でした。最終面接まで行ったのが3つ。2つは撃沈でした。ここまで自分は就職に苦労をすることがなかったので、反省することが幾つかありました。

まずは過去10年在宅勤務でぬるま湯に浸かってたということ。仕事で心が熱くなれることがなくて、仕事を変えたいってずっと思ってましたが、子どもと一緒にいる時間が多く取れることや安定した収入があったので思い切れなかったことが自分のキャリアに響いてしまったのかなと。もう一つの反省点はある意味正直過ぎたのかなということ。当然真っ赤な嘘で職を得たいとは思わないけど、少々盛るぐらいはアメリカでの職探しでは必要なのかもしれません。

就職活動をしていて一番嫌だったのがホワイトボードにコードを書かされることやウェブブラウザ上でコードを書かされること。どちらもIDEの環境でもないし、コードを実行できる環境でもない。しかも30分以内に数独を解くアルゴリズムをブラウザ上のエディタに書けとか…心の中で「あんたの会社では仕事したくないわ」なんて思ってました。当然言葉では言いませんがね。あと嫌だったのがこっちが誠意を持って一生懸命就職活動をしているのに対して、二次面接が再び電話面接で10分で終わりというのがありました。自分が何か気に食わないことを言ったのかもしれないけど、10分で候補者の何が分かるの?一次の面接でめっちゃ準備してそれを通ったのにそれに対して10分って。まあ、面接がそれぐらいで終わってしまうということはほぼ100%落ちたということなんですけどねwwwそれにしても相手の立場に立って考えることができない面接官が結構いるもんだなあと実感しました。ある意味アメリカでの面接のプロセスというのはヤバイ状態なのかもしれません。

それでも12月から新しい職に就くことが一週間前に決まりました。自宅の近くのあるゲーム会社でビルドエンジニアをすることになりました。その会社は電話面接をしてくれて、最終面接が会社での面接でした。どちらの面接も非常に馬が合うなあという印象で、実は初めはそんなに興味がある会社ではなかったんですが、直接そこに行って面接をしてもらって意気投合して面接が終わった時に「ここで仕事したい」と思いました。過去10年間とは違ってこれからはオフィスで仕事をすることになりますが、とても楽しみにしています。

Bitwiseオペレーター

大きいデータを扱うとなるとBitwiseオペレーターが便利になってきます。パフォーマンスが全然違いますね。復習しておくことにします。

int flag1 = 60;
int flag2 = 13;

int result = 0;

Console.WriteLine($"flag1:{Convert.ToString(flag1, 2).PadLeft(8, '0')}\nflag2:{Convert.ToString(flag2, 2).PadLeft(8, '0')}");

result = flag1 & flag2;

Console.WriteLine($"BinaryAnd:{Convert.ToString(result, 2).PadLeft(8, '0')} IntegerValue:{result}");

result = flag1 | flag2;
Console.WriteLine($"BinaryOr:{Convert.ToString(result, 2).PadLeft(8, '0')} IntegerValue:{result}");

result = flag1 ^ flag2;
Console.WriteLine($"BinaryXOr:{Convert.ToString(result, 2).PadLeft(8, '0')} IntegerValue:{result}");

result = ~flag1;
Console.WriteLine($"Flipped:{Convert.ToString(result, 2).PadLeft(8, '0')} IntegerValue:{result}");

result = flag1 << 1;
Console.WriteLine($"Left shift:{Convert.ToString(result, 2).PadLeft(8, '0')} IntegerValue:{result}");

result = flag1 >> 1;
Console.WriteLine($"Right shift:{Convert.ToString(result, 2).PadLeft(8, '0')} IntegerValue:{result}");

Console.Read();

 

出力結果は次の通り

flag1:00111100
flag2:00001101
BinaryAnd:00001100 IntegerValue:12
BinaryOr:00111101 IntegerValue:61
BinaryXOr:00110001 IntegerValue:49
Flipped:11111111111111111111111111000011 IntegerValue:-61
Left shift:01111000 IntegerValue:120
Right shift:00011110 IntegerValue:30

string.Reverse()

C#でstringを反対にするには.NET Framework 3.5から以下の様なコードが可能だそうです。

string test = "日本語でも大丈夫です";
string reversed = new string(test.Reverse().ToArray());
Console.WriteLine(reversed);

output-> すで夫丈大もで語本日

ま、いいんですけど、なぜtest.Reserse()がstringを返さないのか疑問ですが、ま、いっか。

git push origin master

git push origin masterを使ってgithubに変更をアップロードするときに、Permission denied (publickey)というメッセージが出てきて失敗するということがありました。それを解決する方法として、このページが非常に役に立ちましたのでメモとして載せておきます。

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")