scikit-learn

matplotlib

Pythonのコードを見ると、if __name__ == ‘__main__’ というコードが頻出します。

そもそも、Pythonでは、スクリプトが直接実行された場合には、変数__name__に__main__が代入されるというのが仕様だそうです。そこで、変数__name__に__main__が代入されているかチェックすることで、そのスクリプトが直接実行されたかを判定することが可能です。スクリプトが直接実行されない場合として、例えば、import文によって他のスクリプトにから読み出された場合が考えられます。

リファレンスには、__name__について、29.4. __main__ — トップレベルのスクリプト環境に記載されています。

また、__name__変数の判定については、以下のページにより具体的な説明が記載されています。

そもそも、Pythonでは、アンダーバーから始まるトークンに特殊な意味が持たされているようです。

2.3.2. 予約済みの識別子種 (reserved classes of identifiers)を参照すると、

  • _で始まる名前は、はimportによってインポートしない
  • __で始まる名前は、クラスプライベートの名前
  • __*__はシステムで定義された名前

システムで定義された名前のうち、特殊メソッドと呼ばれるものは、3.3. 特殊メソッド名にまとめられています。例えば、__init__はコンストラクタを意味します。

Pythonのアンダーバーについては、以下のページに具体的な説明が記載されています。

Anaconda NavigatorのEnvironmentでPyQt用の環境を作成し、PyQtのパッケージをインストール。

Qtのインストールをしなくても、IDLEでコードを書けば、そのままGUIプログラムが動く。便利。

PyQtプログラミングはQiitaに様々上がっているので、コードをコピーして実行できることを確認しました。

  • https://qiita.com/kenasman/items/70a3ef914b0e7e55a123
  • https://qiita.com/Algebra_nobu/items/67abf075177fc36484ff

ファイルのアイコンを取得する場合は、ExtractAssociatedIcon関数をつかいます(Icon.ExtractAssociatedIcon メソッド (String))。しかし、ネットワークドライブに保存されているファイルのアイコンを取得しようとして、

Icon MyIcon = Icon.ExtractAssociatedIcon("\\hoge\aaa\bbb.txt");

と書いてもアイコンが取得できません。この場合はWindows APIを直接叩く必要があります。

ExtractAssociatedIconでネットワーク上のファイルのICONが取得できないに記載されていたコードをC#で書き直してみると、以下のような感じになります。

using System;
using System.Drawing;
using System.Reflection;
using System.Runtime.InteropServices;

public class HogeClass
{

  [DllImport("shell32.dll", EntryPoint = "ExtractAssociatedIcon")]
  private extern static IntPtr ExtractAssociatedIcon(
      IntPtr hInst,
      [MarshalAs(UnmanagedType.LPStr)] string lpIconPath,
      ref int lpiIcon);

  private static Image GetIcon(String FilePath)
  {
    IntPtr hInst = Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]);
    Int32 iIcon = 0;
    IntPtr hIcon;

    hIcon = ExtractAssociatedIcon(hInst, FilePath, ref iIcon);

    return Icon.FromHandle(hIcon).ToBitmap();
  }
}

なんとなく気になったので…。行数は短いので全行をコピってみます。

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ShellAboutSample
{
  public partial class Form1 : Form
  {
    [DllImport("shell32.dll")]
    static extern int ShellAbout(IntPtr hWnd, string szApp, string szOtherStuff, IntPtr hIcon);

    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      ShellAbout(
        this.Handle, 
        "ああああのバージョン情報#いいいい " + Assembly.GetExecutingAssembly().GetName().Version.ToString(), 
        "うううう", 
        IntPtr.Zero);
    }
  }
}

APIのリファレンスはShellAbout functionに記載されています。szApp(第2引数)は#の記号を含めると、#の前までがタイトルバーに、#の後ろがダイアログの1行目に表示されます。

Windows10だと、ライセンスがされている個人、組織がuser name、org nameと表示されるのですが、そういう仕様みたいです。

PInvoke – ShellAbout (Shell32) – Windows 10

ただ、Windowsの標準アプリ(例えば、メモ帳)のバージョン情報では名前が表示されるので、もしかしたらWindowsの標準アプリでは呼び出している関数が違うのかもしれません。

UnityのTutorialであるRoll-a-ball tutorialを一通り見てみて、WebGLで書き出してみました。

初めてのビルドだったので、まだまだ分からないことは多いのですが、IL2CPPのビルド時間が長いのと、Unity上では球体の上にテキストが表示されるようにしたのに、ビルドされたものは球体とテキストが重なっているというのが気づきです。今後このあたりもチェックしてみます。

WebGL版 : http://blog.kuronekoya.info/other/180108/


IL2CPPについて

以下のサイトを参考に…。

簡単には、Preference→External Tools→External Script Editorを変更すればOK。

ところで、UnityからC#のコードを表示させようとしたら、VSCodeにて

The .NET CLI tools cannot be located. .NET Core debugging will not be enabled. Make sure .NET CLI tools are installed and are on the path.

というエラーが表示されました。そのエラーの横に表示されていた[Get .NetCLI tools]を選択すると次のURLに飛ばされました。

Download .NET SDKを選択して、インストールプログラムをダウンロードし実行。そうすると、Microsoft .NET Core SDK – 2.1.3がインストールされます。これでOK。

一応、インストール完了時に表示されるメッセージをメモ。

The installation was successful

The following were installed at C:\Program Files\dotnet
    • .NET Core SDK 2.1.3
    • .NET Core Runtime 2.0.4
    • Runtime Package Store

This product collects usage data
    • More information and opt-out https://aka.ms/dotnet-cli-telemetry

Resources
    • Core Documentation https://aka.ms/dotnet-docs
    • SDK Documentation https://aka.ms/dotnet-cli-docs
    • Release Notes https://aka.ms/20-p2-rel-notes
    • Tutorials https://aka.ms/dotnet-tutorials

だいぶ前にインストールしたのに、ほぼ何も動かしてなかったUnity。久しぶりに起動したらアクティベーションエラー。Unity 2017.3.0f3をインストール(アクティベーション時にアンケートに答えなくてはならなくて、アンケートのせいで昔のバージョンのログインができなかったのかも)。

とはいえ、何もわからないので、とりあえずTutorialを。

簡単に書くと、

  • 01: Play ModeとEdit Modeを切り替える
  • 02: GameObjectとComponent
    • GameObject(1とか2とか書かれたブロック)は、Play Modeに切り替えてもSceneの中で止まったままで、重力が働いていない
    • GameObjectにComponentを加えることで、GameObjectがどのように振る舞うかを変更することができる
    • ブロックにRigidbody(剛体)コンポーネントを追加することで、重力が働くようにする
  • 03: Componentの調整
    • InspectorからComponentの値(例えばspeed)を調整できる
  • 04: Prefab
    • Project windowにあるAssetをHierarchy windowにドラッグすることで、Sceneに追加できる
    • AssetはいわばGameObjectのテンプレート

Tutorialの04まで進めて、なんとなく基本的な動きを理解。

その後、Roll-a-ball tutorialSetting up the GameMoving the Playerを見て、キーボードで球体を操作できるように。


Unityのスクリプトは自分はC#で書くのですが、エディタにVisual Studio 2017が起動してしまったので、UnityでVisualStudioをデフォルトのエディタに設定するを参考にして、エディタをMonoDevelopに変更。

また、MonoDevelopのオプションを変更して、改行コード(私はLinuxの改行コードにしたい)、インデントの方法(私は半角スペース2つ派)、ホワイトスペースの入れ方のルールを調整。MonoDevelopのインデントがおかしいので設定し直した(コードフォーマッティング)[Unity] MonoDevelop のおかしなインデント補完を回避する方法あたりを参考にしました。

その後、Visual StudioでもUnityの開発ができるように、【Unity】Visual Studio 2017 (RC)をUnityで使うを参考にインストール。これで補完がされるのかな。


とりあえず、超基本的なところだと思うのですが、簡単にいろいろといじってみました。

WebClientを使うと楽にできる。

ファイルのダウンロード

WebClient wc = new WebClient();

try
{
  wc.DownloadFile("http://example.com/example.html", @"C:\tmp\example.html");
} catch (Exception ex)
{
  Debug.WriteLine(ex.Message);
}
finally
{
  wc.Dispose();
}

ファイルのアップロード

WebClient wc = new WebClient();
NetworkCredential MyCredentials = new NetworkCredential(MyUserName, MyPassword);

try {
  wc.Credentials = MyCredentials;
  wc.UploadFile(Address, UploadFile);
} catch(Exception ex)
{
  Result = ex;
}
finally{
  wc.Dispose();
}

参考リンク