投稿者「mynote」のアーカイブ

gettextを使った多言語対応

gettextを使うとPythonのスクリプトを多言語対応することができます。

gettextを使った多言語対応のサンプル

gettext-sample.py

#!/usr/bin/env python
# coding: utf-8

import gettext

_ = gettext.translation( \
      domain='message',
      localedir='locale',
      languages=['ja'],
      fallback=True).ugettext

print(_(u'hello, world!'))

message.po

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2013-03-22 00:57+JST\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"


#: gettext-sample.py:12
msgid "hello, world!"
msgstr "こんにちは世界!"

ファイルの配置

.
|-- gettext-sample.py
|-- locale
    `-- ja
        `-- LC_MESSAGES
            `-- message.mo

3 directories, 2 files

スクリプトの実行結果

$ python gettext-sample.py
こんにちは世界

C#の配列をコピーする方法

Cloneメソッド

Cloneメソッドを使うと簡単に配列のコピーができます。

使い方は次のような感じです。

using System;

public class Example1
{
  static public void Main ()
  {
    string[] ar1 = { "aaa", "bbb", "ccc" };
    string[] ar2 = (string[])ar1.Clone();

    ar2[0] = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);
    
    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
aaa
bbb
ccc
ar2:
AAA
bbb
ccc

多次元配列

多次元配列でも同様にCloneできます。

using System;

public class Example2
{
  static public void Main ()
  {
    string[,] ar1 = { {"aaa", "bbb"}, {"ccc", "ddd"} };
    string[,] ar2 = (string[,])ar1.Clone();

    ar2[0,0] = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);
    
    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
aaa
bbb
ccc
ddd
ar2:
AAA
bbb
ccc
ddd

shallow copy

Cloneメソッドは便利ですが、deep copyではなくshallow copyになっている点には注意してください。

using System;

public class C
{
  public string s;
  public override string ToString() => s;
}

public class Example3
{
  static public void Main ()
  {
    C c = new C();
    c.s = "aaa";
	
    C[] ar1 = { c, c };
    C[] ar2 = (C[])ar1.Clone();

    ar2[0].s = "AAA";

    Console.WriteLine("ar1:");
    foreach(var e in ar1) Console.WriteLine(e);

    Console.WriteLine("ar2:");
    foreach(var e in ar2) Console.WriteLine(e);
  }
}

実行結果

ar1:
AAA
AAA
ar2:
AAA
AAA

リンク

Array.Clone Method (System) | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/api/system.array.clone?view=netcore-3.1

C#でgotoの使い方

forステートメント

C#でforの2重ループから抜けたい時、gotoステートメントを使って次のような書き方ができるみたいです。

サンプルコード

using System;

public class Example
{
  static public void Main ()
  {
    for (int i = 0; i < 5; ++i)
    {
      for (int j = 0; j < 5; ++j)
      {
        Console.WriteLine($"i={i}, j={j}");
        if (i + j > 5) goto Finish;
      }
    }

    Finish:
      Console.WriteLine("Finish");
  }
}

実行結果

i=0, j=0
i=0, j=1
i=0, j=2
i=0, j=3
i=0, j=4
i=1, j=0
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i=2, j=0
i=2, j=1
i=2, j=2
i=2, j=3
i=2, j=4
Finish

switchステートメント

他にも、switchステートメントで

switch (n)
{
  case 1:
    // 実行したい内容1
    break;
  case 2:
    // 実行したい内容2
    goto case 1;
  default
    break;
}

のような書き方もできるみたいです。

慣れないと戸惑いそうですが、覚えておくと便利そうな気がします。

リンク

goto statement – C# Reference | Microsoft Docs
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/goto