crossframe » C# http://crossframe.iiv.jp Windows Dev. Site Tue, 07 Nov 2023 06:31:52 +0000 ja hourly 1 https://wordpress.org/?v=3.8.41 Unity 5 / C# ../../../201611241241/ ../../../201611241241/#comments Thu, 24 Nov 2016 14:19:52 +0000 ../../../?p=1241 マルチプラットホーム対応。プログラマを引き付けるある種のキーワードですが、私自身はそれぞれのプラットホームにあった言語を使えばいいと思う派です。なのでXamarinのようにC#でiOSのアプリを作れると聞いてもあまりそそられないのですが、ゲームの統合開発環境のUnityはちょっと違う感じを受けました。ゲームにかぎらず3Dオブジェクトの表現手段としても魅力に思えたからです。この環境がC#を一段と魅力的にしています。(Macにもインストールしました)

ということでUnity5ことはじめとして今回取り上げてみました。

unity01
球と立方体にマテリアルを適用して配置します。立方体の方をプログラムで回転させてみました。(使い方はネット上にたくさんありますので、他のサイトを参考にしてください。)
unity02
コードの編集は、スクリプトをダブルクリックするとすでにインストール済のVisualStudio2013が立ち上がりました。

以下実行画面(立方体が回転します)
unity03

このツール自体、使っているのが楽しいです。(3Dレンダリングツールを使うのは、LightWave以来で15,6年ぶりくらいかも?)
これを使ったAndroidアプリを作ってみたくなってきました。

]]>
../../../201611241241/feed/ 0
Reactive Extensions ../../../201604021188/ ../../../201604021188/#comments Sat, 02 Apr 2016 10:57:57 +0000 ../../../?p=1188 以前、「C# LINQのクエリ式」../../../20130503247/ で少し触れたReactiveExtensionsについて、かなりたちましたがここでテストしてみたいと思います。

ReactiveExtensionsについて、多くの記事がある以下のサイトを参考にしました。

http://blog.okazuki.jp/entry/20120219/1329663635

特にここにある合成について興味があり、3つの値を監視して合成してみました。

環境 : Mono 4.2.0 / Mac OSX 10.10.5

https://www.nuget.org/でダウンロードしたnuget.exeで

mono nuget.exe install Rx-Main

を実行。インストールされる.dllファイルをプログラムファイルと同じパスにコピーして使用しました。

combine.cs

using System;
using System.Linq;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Reactive.Concurrency;

class Program {
    static void Main(string[] args) {

        var source1 = new Subject<string>();
        var source2 = new Subject<int>();
        var source3 = new Subject<int>();

        source1.CombineLatest(
            source2.Where(n => n % 2 == 0).Select(i => i * 10),
            (l, r) => string.Format("{0} | {1}", l, r))
        .CombineLatest(
            source3.Take(2),
            (l, r) => string.Format("{0} || {1}", l, r))
        .Subscribe(
            s => Console.WriteLine("* OnNext: {0}", s),
            () => Console.WriteLine("* OnCompleted"));

        Console.WriteLine("source1:'foo1'");
        source1.OnNext("foo1");
        Console.WriteLine("source1:'foo2'");
        source1.OnNext("foo2");

        Console.WriteLine("source2:22");
        source2.OnNext(22);

        Console.WriteLine("source3:311");
        source3.OnNext(311);
        Console.WriteLine("source3:312");
        source3.OnNext(312);
        Console.WriteLine("source3:313");
        source3.OnNext(313);

        Console.WriteLine("source1:'bar1'");
        source1.OnNext("bar1");
        Console.WriteLine("source2:23");
        source2.OnNext(23);
        Console.WriteLine("source2:24");
        source2.OnNext(24);

        Console.WriteLine("source1:Completed!");
        source1.OnCompleted();
        Console.WriteLine("source2:99");
        source2.OnNext(99);
        Console.WriteLine("source2: Completed!");
        source2.OnCompleted();

        Console.ReadLine();
    }
}

ビルドと実行

mcs combine.cs -r:System.Reactive.Core.dll,System.Reactive.Linq.dll,System.Reactive.Interfaces.dll
mono ./combine.exe

実行結果

source1:’foo1′
source1:’foo2′
source2:22
source3:311
* OnNext: foo2 | 220 || 311
source3:312
* OnNext: foo2 | 220 || 312
source3:313
source1:’bar1′
* OnNext: bar1 | 220 || 312
source2:23
source2:24
* OnNext: bar1 | 240 || 312
source1:Completed!
source2:99
source2: Completed!
* OnCompleted

リアクティブプログラムなのに、オブザーバという言葉がでてきませんが、SubjectクラスにはIObservableとIObserverの両方のインターフェースを実装されているようです。
監視対象の値が3つとも用意されたタイミングで、表示しています。最近のプログラムは非同期処理、関数型言語の文法の普及等により、プログラムの読み方が昔のように上から下に処理が流れていくような作りから、かなり変わってきたということをしみじみと感じます。

]]>
../../../201604021188/feed/ 0
IronScheme ../../../20150104956/ ../../../20150104956/#comments Sun, 04 Jan 2015 03:57:05 +0000 ../../../?p=956 今年最初の投稿は、新年早々IronSchemeです。(^^;

前回、Clojureをまわりを調べているときに、この存在を知り試してみようと思いました。
.NETフレームワークのライブラリが使用できるSchemeということですが、IronPython, IronRubyと同じように位置づけなのでしょう。

Lisp (+ List Processor))

http://decode.red/blog/20141201244/

ここで使用した順列のプログラムをIronSchemeで動かしてみました。

環境 : Windows 8.1

https://ironscheme.codeplex.com/

IronScheme-109887.zip

perm.ss

(import (srfi :1 lists))

(define (perm ls a)
    (if (null? ls)
        (display (reverse a))
        (for-each
            (lambda (n)
                (perm (remove (lambda (a) (equal? a n)) ls)(cons n a)))
            ls)))

(perm '(1 2 3) '())
(newline)

冒頭のimportの記述や、コマンド実行時ファイル指定の方法にちょっと迷いました。

hello.ss

(import (rnrs))

(display "Hello")
(newline)

上の二つのプログラムをそれぞれ以下のように実行しました。

IronScheme02

最初、srfiの指定方法がいけないのかどちらかわかりませんでしたが、リダイレクトの方法だとうまくいくので、とりあえずこのままにしました。

次に、下記サイトを参考に、VisualStduio 2013を使ってC#から呼び出してみました。

http://cryks.hateblo.jp/entry/20120417/1334660328

インストールは、NuGetを使いました。
IronScheme01

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using IronScheme;
using IronScheme.Runtime;

namespace csConsScheme01
{
    class Program
    {
        static void Main(string[] args)
        {
             Console.WriteLine("(+ 1 2 3)".Eval());
             Console.ReadKey();

             "(define (add x y)(+ x y))".Eval();
             var add = "add".Eval<Callable>();
             Console.WriteLine(add.Call(1, 2));
        }
    }
}

出力は、6と3です。
特定の処理だけ組み込み言語的に使う用途にいいかもしれません。

]]>
../../../20150104956/feed/ 0
calling Clojure from C# ../../../20141206942/ ../../../20141206942/#comments Sat, 06 Dec 2014 14:43:22 +0000 ../../../?p=942 .NETフレームワークがオープンソースになるということですが、C#のプログラムがJavaのようにクロスプラットホームで使われるようになるかもしれません。
Javaの資産は膨大なものがありますので、これをC#から呼び出す方法を試してみようと今回思いました。以前、JNIを使ってC++/CLIからJava(../../../2013021475/)を呼び出すテストをしたことがありますが、これはちょっと面倒なので、もっと簡単な方法はないかと調べたら、いいのがありました。

http://jni4net.com/

bridge between Java and .NET (intraprocess, fast, object oriented, open-source)

Java と.NET相互に呼び出しが簡単にできそうです。今回は.NETからJava呼び出しのみテスト。
しかしあまりあっけなくできてしまったので、もう少し踏み込んで、Clojureの呼び出しをしてみました。
JavaからClojureの呼び出しは、こちら(http://bitlife.me/archives/297)でテストした、プログラムを使い、このJavaプログラム部分を変更して、C#から呼び出します。

環境 : jni4net 0.8.8, Java 1.8.0_25, Visual Studio 2013 Update3 / Windows 8.1
JavaMainCs.java

import clojuresub.core;

public class JavaMainCs{
	public static void sub(String str){
		core.sub(str);
	}
}

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using net.sf.jni4net;

namespace CSharpMain
{
    class Program
    {
        static void Main(string[] args)
        {
            var bs = new BridgeSetup();

            bs.AddClassPath(@"C:\wk\", true);
            bs.AddAllJarsClassPath(@"C:\wk\");

            Bridge.CreateJVM(bs);

            java.lang.Class jclass = 
                java.lang.ClassLoader.getSystemClassLoader().loadClass("JavaMainCs");

            java.lang.Class[] cls = { java.lang.String._class };
            java.lang.Object[] obj = { new java.lang.String("C# String") };

            java.lang.reflect.Method method = jclass.getMethod("sub", cls);
            method.invoke(null, obj);

            Console.ReadKey();
        }
    }
}

C#のコードの中にJavaが書けてしまい、ちょっと不思議な感覚になります。

VisualStudioでは参照追加とビルド設定をします。
clojure_cs01

以下のようにファイルを配置して実行しました。(JavaMain.classは前のテストのものなので不要)
clojure_cs02

最近、Lispを再勉強中ということもあって、Java環境ではClojureを使っていましたが、この記事を書きながらいろいろと調べていたら、WindowsにはIronSchemeというものがあることを知りました。次回、これをとりあげてみたいと思います。

]]>
../../../20141206942/feed/ 0
C# Interactive / Mono ../../../20140608758/ ../../../20140608758/#comments Sun, 08 Jun 2014 10:05:15 +0000 http://xfra.me/?p=758 前回のF# Interactive / Monoの記事を書いたとき、C#では同様なことはできないと思いこんでいましたが、シェルスクリプトの形式で書けることがわかり、テストしてみました。

csi01

この二つ目まではC#でもできそうだとわかっていましたが、三つ目のような #!/usr/bin/csharpという書き方ができるとは知りませんでした。
(Perlなどと同様)

ということは、

#!/usr/bin/csharp

while(true){
	var str = Console.ReadLine();
	if(str == null){
		break;
	}
	Console.WriteLine("{0} : Length {1} ", str, str.Length);
}

ということができる(標準入力が受け取れる)ということで、以下が結果です。

csi02

LinuxだとShellが強力なので、このような書き方ができるということは、とてもありがたく思えます。

]]>
../../../20140608758/feed/ 0
PowerShell C# Cmdlet 2 ../../../20140429728/ ../../../20140429728/#comments Tue, 29 Apr 2014 01:19:45 +0000 http://xfra.me/?p=728 前回コマンドレットからの出力をやりましたので、今回はコマンドレットへの入力もおさえておきたいと思います。

using System;
using System.Management.Automation;

namespace InputTest
{
    [Cmdlet(VerbsCommon.Get, "Para")]
    public class GetGreeting : Cmdlet
    {
        [Parameter(ValueFromPipelineByPropertyName = true)]
        public string BaseName { get; set; }

        [Parameter(ValueFromPipelineByPropertyName = true)]
        public string Extension { get; set; }

        protected override void ProcessRecord()
        {
            Console.WriteLine(BaseName + " : " + Extension);
        }
    }
}

前回と環境は同じで、同様に実行させます。
PowerShell02
lsはGet-ChildItemのエイリアスで、ディレクトリのファイルリストのオブジェクトを返します。
表示はされていませんが、オブジェクトに含まれています。
以下、念のため。
PowerShell03

]]>
../../../20140429728/feed/ 0
PowerShell C# Cmdlet ../../../20140408719/ ../../../20140408719/#comments Tue, 08 Apr 2014 14:25:55 +0000 http://xfra.me/?p=719 ひさしぶりのPowerShellのネタです。
PowerShellを使っていて、ふとコマンドレットって、自分でどうやって作るの? と思い、作ってみました。
いきなりですがテスト結果です。
PowerShell01
このようにヘッダがあり、検索ができる形のオブジェクトを出力したかったのですが、調べてみるといろんなやり方がありそうです。結果、anonymous typeを使って実現する方法が簡単で自分の求めていた形になりました。

using System;
using System.Collections.Generic;
using System.Management.Automation;

namespace SumTest
{
    [Cmdlet(VerbsCommon.Get, "Sum")]
    public class Get_DemoNames: PSCmdlet
    {
        protected override void ProcessRecord()
        {
            List<object> list = new List<object>();

            int sum = 0;
            for(int i=10 ; i<16;i++){
                sum += i;
                var data = new {Sum = sum,  Num = "No" + i, Name = "Name" + i};

                list.Add(data);
            }

            this.WriteObject(list, true);
        }
    }
}

パッケージのインストールが必要です。

PM> Install-Package System.Management.Automation

環境 : VisualStudio 2010 / Windows 7

プロジェクトは、アプリケーションではなく、クラスライブラリのようです。

]]>
../../../20140408719/feed/ 0
Haskell from C# ../../../20140309714/ ../../../20140309714/#comments Sat, 08 Mar 2014 15:20:21 +0000 http://xfra.me/?p=714 Haskell from Excel という過去の投稿で、C++からのHaskell呼び出しをやりましたが、C#から直接できることを以下のサイトで知り、テストしてみました。

Calling Haskell from C#

http://stackoverflow.com/questions/16615641/calling-haskell-from-c-sharp

このサイトでは、Monoで実行していますが、Windowsでテストしました。
また、Stringを戻り値とする関数が使いたかったので、これを追加しています。

環境: GHC ver 7.6.3, VisualStudio 2010 / Windows 7
Foo.hs

module Foo where

import Foreign.C.String
import Foreign.C.Types
import Data.List.Split

foo :: CString -> IO CInt
foo c_str = do
	str    <- peekCString c_str
	result <- hs_foo str 
	return $ fromIntegral result

hs_foo :: String -> IO Int
hs_foo str = do
	putStrLn str
	return (length str)

hstest :: CString -> IO CString
hstest c_str = do
	str <- peekCString c_str
	let s = concat $ fmap cadd $ chunksOf 1 str
	newCString s

cadd :: String -> String
cadd c = do
	c ++ " "

foreign export ccall foo :: CString -> IO CInt
foreign export ccall hstest :: CString -> IO CString

ghc -no-hs-main -shared -o Foo.so Foo.hs

hstestで、C文字列をHaskell文字列に変換し、文字列操作をして、またC文字列に戻しています。

次にC#側ですが、VisualStudioのC#コンソールアプリケーションプロジェクトで作成します。
Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace csConsoleHaskell01
{
	class Program
	{
		[DllImport("Foo.so", CallingConvention = CallingConvention.Cdecl)]
		private static extern void hs_init(IntPtr argc, IntPtr argv);

		[DllImport("Foo.so", CallingConvention = CallingConvention.Cdecl)]
		private static extern void hs_exit();

		[DllImport("Foo.so", CallingConvention = CallingConvention.Cdecl)]
		private static extern int foo(string str);

		[DllImport("Foo.so", CallingConvention = CallingConvention.Cdecl)]
		private static extern IntPtr hstest(string str);

		static void Main(string[] args)
		{
			hs_init(IntPtr.Zero, IntPtr.Zero);

			int result = foo("Hello!");
			Console.WriteLine("Length : {0}", result);

			IntPtr r = hstest("Hello_Haskell_String");
			string s = Marshal.PtrToStringAnsi(r);
			Console.WriteLine(s);

			hs_exit();
		}
	}
}

intを戻すときは、そのままでしたが、stringは上のようにポインタを取得してから変換する必要があるようです。(戻り値stringは不可)
Haskell Foo.soをcsConsoleHaskell01\bin\Debugディレクトリにおいて、csConsoleHaskell01.exeをコマンドプロンプトで実行します。

Hello!
Length : 6
H e l l o _ H a s k e l l _ S t r i n g

このように表示されます。
.NetとHaskellを結びつけるには、HaskellのFFI(ForeignFunctionInterface)を使ってC++/CLIとリンクして、さらに.Netマネージコードと連携しなくてはいけないと思っていましたが、このように簡単にできてしまうのですね。C#-Haskellができると、ここからいろいろと派生できそうです。

]]>
../../../20140309714/feed/ 0
jQueryPlot from Excel ../../../20131207651/ ../../../20131207651/#comments Sat, 07 Dec 2013 14:35:10 +0000 http://xfra.me/?p=651 データビジュアライゼーション。最近とてもブームでもあり私自身も大変興味深い領域です。Excelデータをビジュアライゼーションするとき、どんな形が面白そうかと考えてみたところ、WebでJavaScriptライブラリという結論になりました。Webで表示させるためには、VSTOを使ってWindowsForm上のWebViewにhtmlファイルを読み込ませる方法にしました。もともと今大人気のD3.jsを使いたかったのですが、WebViewがIE7相当のため(Webサーバログで確認)動作しませんでした。対応しないメソッドがあったり、SVGを使うということが原因と思われます。(ちなみにQtのQWebViewでは表示できました。)しかしながら個人的にこのD3.jsを初めて知ったときは、jQueryが登場したときと同じくらい衝撃を受けました。ちょっとはまっています。
そこでD3.jsのかわりにIE7にも対応しているjQueryPlot(http://www.jqplot.com/)を使うことにしました。

前置きが長くなりましたが、ExcelシートにあるデータをWindowFormのボタンを押すとWebViewのグラフが更新されるデモをつくってみました。

jqplot1

jqplotdata1

データを変更(赤字部分)してボタン押下

jqplot2

jqplotdata2

環境 : VisualStudio 2010, Excel 2010 / Windows 7
ThisWorkbook.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml.Linq;
using Microsoft.Office.Tools.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;

namespace ExcelWorkbook_Web
{
    public partial class ThisWorkbook
    {
        private void ThisWorkbook_Startup(object sender, System.EventArgs e)
        {
            Form1 fm = new Form1();
            fm.Show();
        }
        public String getData()
        {
            String str = "[";

            for (int i = 1; i <= 7; i++)
            {
                str += "[";

                var o1 = Globals.Sheet1.Cells[i, 2].Value;
                var o2 = Globals.Sheet1.Cells[i, 3].Value;
                var o3 = Globals.Sheet1.Cells[i, 4].Value;

                str += o1.ToString() + "," + o2.ToString() + "," + o3.ToString();
                var o4 = Globals.Sheet1.Cells[i, 1].Value;
                str += ",'" + o4.ToString() + "'";
                str += "]";
                if (i != 7)
                {
                    str += ",";
                }
            }
            str += "]";
            return str;
        }

        private void ThisWorkbook_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO デザイナーで生成されたコード
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisWorkbook_Startup);
            this.Shutdown += new System.EventHandler(ThisWorkbook_Shutdown);
        }
        #endregion
    }
}

Form1.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ExcelWorkbook_Web
{
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            webBrowser1.ObjectForScripting = this;
            webBrowser1.Navigate(new Uri("file:///C:/work/test.html"));

        }

        private void button1_Click(object sender, EventArgs e)
        {
            String str = Globals.ThisWorkbook.getData();
            object[] args = {str};
            webBrowser1.Document.InvokeScript("plot", args);
        }
    }
}

test.html

<html>
<head>
<!--[if lt IE 9]><script language="javascript" type="text/javascript" src="excanvas.js"></script><![endif]-->
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.jqplot.min.js"></script>
<script type="text/javascript" src="jqplot.bubbleRenderer.min.js"></script>
<link rel="stylesheet" type="text/css" href="jquery.jqplot.min.css" />
<script>
function plot(arg)
{
    var arr = eval(arg);

    plot1 = $.jqplot('chart1',[arr],{
        title: 'Transparent Bubbles',
        seriesDefaults:{
            renderer: $.jqplot.BubbleRenderer,
            rendererOptions: {
                bubbleAlpha: 0.6,
                highlightAlpha: 0.8
            },
            shadow: true,
            shadowAlpha: 0.05
        }
    });
}
</script>
</head>
<body>
<div id="chart1" style="height:300px;width:300px; "></div>
</body>
</html>

Excelシートのデータを変更してボタンを押すと、BubbleChart(というらしい)が変化する模様は、なかなかわかりやすいくて使いやすいと思いました。
いろいろと応用がききそうです。

]]>
../../../20131207651/feed/ 0
C# – IronPython データ連携 ../../../20131020567/ ../../../20131020567/#comments Sun, 20 Oct 2013 08:20:16 +0000 http://xfra.me/?p=567 C#とIronPythonを連携させようと思ったのは、Pythonの数値計算ライブラリNumPyがIronPythonでもインストールできるというサイトを見つけたからです。(また、VSTOでExcelのデータ処理にも使えればと)

https://www.enthought.com/repo/.iron/

これを使って、C#、IronPython間のデータの受け渡しテストをしてみました。

環境 : IronPython 2.7.3 (2.7.0.40) on .NET 4.0.30319.296 (32-bit), Visual Studio 2010 / Windows 7

インストール
1)ironpkg-1.0.0.pyをダウンロード
2)以下コマンド実行

ipy ironpkg-1.0.0.py –install
ironpkg scipy
ipy -X:Frames -c “import scipy”

いろいろと調べてトライしましたが、残念ながらSciPyは使えないようです。しかしNumPyは使えるので、こちらだけ使いました。
(NumPyだけできるものにしました)

csTest.py

import sys
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7')
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\DLLs')
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib')
sys.path.append(r'C:\Program Files (x86)\IronPython 2.7\Lib\site-packages')

import clr
clr.AddReference('mtrand.dll')

import numpy as np

na = np.zeros(shape=(2,2))

for i in range(2):
	for j in range(2):		
		na[i, j] = mx[i, j]

mr = np.linalg.inv(na)
print '- Iron Python -'
print mr
print np.dot(na, mr)

for i in range(2):
	for j in range(2):
		mx[i, j] = float(mr[i, j])

C#で設定した2次元配列のデータをNumPyを使って逆行列の計算をして戻すというものです。
しかしC#の配列からのNumPy配列に渡す(その逆も)やり方ついていろいろと悩みました。
mxのままだと逆行列を求める関数でエラーをだしました。(np.array(mx)とやるときは、mxはジャグ配列([][])でないといけないみたいだし・・)
結果代入という形にしてしまいましたが、もっといい方法がないかまた調べたいと思います。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System.Collections;
using IronPython.Runtime;

namespace csPyTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var pe = Python.CreateEngine();           
            ScriptSource src = pe.CreateScriptSourceFromFile(@"C:\csTest.py");
            ScriptScope scope = pe.CreateScope();

            double[,] mx = new double[,] {{0,1},{2,3}};
            scope.SetVariable("mx", mx);

            src.Execute(scope);

            var m = scope.GetVariable<double[,]>("mx");

            Console.WriteLine(" - C# - ");
            for (int i = 0; i < 2; i++)
            {
                for (int j = 0; j < 2; j++)
                {
                    Console.Write(m[i, j] + " ");
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}

C#からダイナミック言語のPythonの変数に直接アクセスできるのも、強力な機能ですね。しかしもうすこしCPythonのライブラリが使えるようになってほしいところです。

以下は実行結果です。逆行列の確認として、単位行列を出力しています。
NumPy

]]>
../../../20131020567/feed/ 0