<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programming &#8211; REONTOSANTA</title>
	<atom:link href="https://knowledge.reontosanta.com/archives/category/programming/feed" rel="self" type="application/rss+xml" />
	<link>https://knowledge.reontosanta.com</link>
	<description>Collection of personal knowledge</description>
	<lastBuildDate>Mon, 09 Apr 2018 05:48:11 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<atom:link rel='hub' href='https://knowledge.reontosanta.com/?pushpress=hub'/>
<site xmlns="com-wordpress:feed-additions:1">83369280</site>	<item>
		<title>SQLServerでDataTableの内容を一度のSQLでデータベースに更新する</title>
		<link>https://knowledge.reontosanta.com/archives/1054</link>
					<comments>https://knowledge.reontosanta.com/archives/1054#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Fri, 23 Jun 2017 07:55:06 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1054</guid>

					<description><![CDATA[DataTable の内容をデータベースに登録、または更新したい場合&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>DataTable の内容をデータベースに登録、または更新したい場合がある。<br />
しかし、DataTable の行をループしながら行毎に INSERT 文や UPDATE 文を発行すると IO 負荷が高くなり、パフォーマンスが悪化する。<br />
そこで、SQL Server のユーザー定義テーブル型を使用することにより一括での更新が可能となる。</p>
<p>前提条件：SQL Server 2008 以降</p>
<p>&nbsp;</p>
<h2>IO負荷が高い例</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">Sub Test(ByVal dt As DataTable)
    Dim con As New SqlConnection("connection string")
    Dim cmd As New SqlCommand
    Dim sql As New StringBuilder
    con.Open()
    cmd.Connection = con
    cmd.Parameters.Clear()
 
    'データテーブルの行分だけループしている悪い例
    For i As Integer = 0 To dt.Rows.Count - 1
        sql.AppendLine("INSERT INTO dbo.T_TEST ")
        sql.AppendLine("( ")
        sql.AppendLine("  CODE ")
        sql.AppendLine(") VALUES ( ")
        sql.AppendLine("  @Code ")
        sql.AppendLine("); ")
 
        'パラメータの作成
        Dim param = New SqlParameter("@Code", SqlDbType.Int, ParameterDirection.Input)
        param.Value = dt.Rows(i).Item(0).ToString()
        'パラメータを渡します。
        cmd.Parameters.Add(param)
 
        'プロシージャの実行
        cmd.CommandType = CommandType.Text
        cmd.CommandText = sql.ToString()
        cmd.ExecuteNonQuery
    Next i
End Sub</pre><p>まずは、悪例としてデータテーブルのレコードを 1 件ずつ INSERT していく方法。<br />
上記の方法だと件数が少なければ問題が無いように感じるが、１万件を超えてくるとそのパフォーマンスの悪さが目立ってくる。<br />
１万件のデータをループして INSERT すると１万回の IO 処理となり、オーバーヘッドが大きくなる。<br />
しかし、次の方法で INSERT すると１回の IO 処理で済む為、更新するデータ量は変わらないがかなりのパフォーマンス改善が見込まれる。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2416679033"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>DataTableをパラメータとして渡す</h2>
<p>DataTable をパラメータとして渡す為には、SQL Server 側にユーザー定義テーブル型を作成しておく必要がある。</p><pre class="urvanov-syntax-highlighter-plain-tag">CREATE TYPE TestTableType AS TABLE
(
  TestCode int NOT NULL
)
GO</pre><p>テーブルの定義と同様に括弧の中にフィールド定義を記述する。<br />
テーブルで定義できるフィールドはTableTypeでも定義可能。</p>
<p>続いて、プログラム側の処理。</p><pre class="urvanov-syntax-highlighter-plain-tag">Sub Test(ByVal dt As DataTable)
    Dim con As New SqlConnection("connection string")
    Dim cmd As New SqlCommand
    Dim sql As New StringBuilder
    con.Open()
    cmd.Connection = con
    cmd.Parameters.Clear()
 
    sql.AppendLine("INSERT INTO dbo.T_TEST ")
    sql.AppendLine("      ( ")
    sql.AppendLine("        CODE ")
    sql.AppendLine("      ) ")
    sql.AppendLine(" SELECT TestCode ")
    sql.AppendLine("   FROM @TestTable ")
    sql.AppendLine("  WHERE TestCode = @Code ")
    sql.AppendLine("); ")
  
    'パラメータの作成
    Dim params(1) As SqlParameters
    params(0) = New SqlParameter("@Code", SqlDbType.Int, ParameterDirection.Input)
    params(0).Value = 1
    params(1) = New SqlParameter("@TestTable", SqlDbType.Structured, ParameterDirection.Input)  'TypeにSqlDbType.Structuredを渡します。
    params(1).TypeName = "TestTableType"  'テーブルタイプの名称を渡します。
    params(1).Value = dt    '編集したデータテーブルを渡します。
    'パラメータ配列を渡します。
    cmd.Parameters.AddRange(params)
    'プロシージャの実行
    cmd.CommandType = CommandType.StoredProcedure
    cmd.CommandText = sql.ToString()
    cmd.ExecuteNonQuery
End Sub</pre><p>ユーザー定義テーブル型を使用することで DataTable をテーブルのように渡すことができる為、一括で SELECT して INSERT または UPDATE が可能となる。</p>
<h4>&lt;注意事項&gt;</h4>
<ul>
<li>DataTable のフィールドはユーザー定義テーブル型のフィールドと一致している必要がある。</li>
<li>ユーザー定義テーブル型を渡す場合は、SqlDbType.Structured で渡す。</li>
</ul>
<p>&nbsp;</p>
<p>ユーザー定義テーブル型を作成しておく必要はあるが、こちらの方法であれば実行速度が圧倒的に速く、パフォーマンス改善が期待できる。<br />
デメリットとしては、ループせずに一括で更新する為、プログレスバーなどで進捗を表示することができない。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1206139360"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2401717280"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1054/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1054</post-id>	</item>
		<item>
		<title>.net(VB、C#)でLINQを利用してCSVファイルを読み込む</title>
		<link>https://knowledge.reontosanta.com/archives/1006</link>
					<comments>https://knowledge.reontosanta.com/archives/1006#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 23 Apr 2017 01:25:46 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=1006</guid>

					<description><![CDATA[LINQでCSVファイルを読み込む .NETには、CSVファイルを読&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<h2>LINQでCSVファイルを読み込む</h2>
<p>.NETには、CSVファイルを読み取る際に便利なクラス(TextFieldParser)が「VB.NET」のライブラリに存在する。</p>
<p>このクラスを利用してCSVファイルをLINQで簡潔に扱えるようにする。</p>
<p>まず、CSVファイルへのコンテキストを生成する為のTextFieldクラスを作成する。</p>
<p>このクラスのContextメソッドでコンテキストを生成することでロジックを意識することなくCSVファイルの読み込みが可能になる。</p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System.Text
Imports System.IO
Imports Microsoft.VisualBasic.FileIO

Public Class TextField
    ' 指定されたCSVファイルへのコンテキストを生成する
    Public Shared Function Context(path As String,
                                   Optional separator As String = ",",
                                   Optional myEncoding As Encoding = Nothing) As IEnumerable(Of String())

        Dim results As New List(Of String())

        Using stream As Stream = New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)

            Using parser As New TextFieldParser(stream, If(myEncoding, Encoding.UTF8), True, False)

                parser.TextFieldType = FieldType.Delimited
                parser.Delimiters = New String() {separator}
                parser.HasFieldsEnclosedInQuotes = True
                parser.TrimWhiteSpace = True

                While parser.EndOfData = False
                    Dim fields As String() = parser.ReadFields()
                    results.Add(fields)
                End While
            End Using
        End Using

        Return results
    End Function

End Class</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.VisualBasic.FileIO;

namespace CS_CSVtoLINQ
{
    public class TextField
    {
        // 指定されたCSVファイルへのコンテキストを生成する
        public static IEnumerable&lt;string[]&gt; Context(string path,
                                                    string separator = ",",
                                                    Encoding encoding = null)
        {
            using (Stream stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using (TextFieldParser parser = new TextFieldParser(stream, encoding ?? Encoding.UTF8, true, false))
                {
                    parser.TextFieldType = FieldType.Delimited;
                    parser.Delimiters = new[] { separator };
                    parser.HasFieldsEnclosedInQuotes = true;
                    parser.TrimWhiteSpace = true;
                    while (parser.EndOfData == false)
                    {
                        string[] fields = parser.ReadFields();
                        yield return fields;
                    }
                }
            }
        }
    }
}</pre><p>&nbsp;</p>
<p>次は、実際にTextFieldクラスを利用してコンテキストを生成し、CSVファイルへアクセスしてLINQにより入力した条件に一致するレコードデータを表示するコードを記述する。</p>
<p>尚、AsParallel()メソッドを呼び出すことで条件判定をマルチスレッド化できるので、データ量が多い場合は、並列化による高速化が期待できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System.Text
Imports System.IO

Module Module1

    Sub Main()
        Do
            ' 検索条件に使用するIDの入力を求める
            Console.WriteLine("IDを入力")
            Dim input As String = Console.ReadLine()

            ' 入力された値から終了判定
            If input.ToUpper = "END" OrElse input.ToUpper = "EXIT" Then
                ' "END"、または"EXIT"が入力された場合は終了
                Exit Do
            End If

            ' 指定したCSVファイルへのコンテキストを生成
            Dim context As IEnumerable(Of String()) = TextField.Context("CSV\\SAMPLE001.csv", ",", Encoding.GetEncoding("Shift_JIS"))

            ' 取得したコンテキストを入力されたIDをキーに検索
            Dim results As IEnumerable(Of String) =
                From fields In context.AsParallel()
                Where fields(0).Equals(input)
                Select String.Format("{0}：{1}", fields(1), fields(2))

            ' 検索結果を出力
            For Each result As String In results
                Console.WriteLine(result)
            Next
            Console.WriteLine("---END---")
        Loop

    End Sub

End Module</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CS_CSVtoLINQ
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                // 検索条件に使用するIDの入力を求める
                Console.WriteLine("IDを入力");
                string input = Console.ReadLine();

                // 入力された値から終了判定
                if (input.ToUpper().Equals("END") || input.ToUpper().Equals("EXIT"))
                {
                    // "END"、または"EXIT"が入力された場合は終了
                    break;
                }

                // 指定したCSVファイルへのコンテキストを生成
                IEnumerable&lt;string[]&gt; context = TextField.Context("CSV\\SAMPLE001.csv", ",", Encoding.GetEncoding("Shift_JIS"));

                // 取得したコンテキストを入力されたIDをキーに検索
                IEnumerable&lt;string&gt; results = 
                    from fields in context.AsParallel()
                    where fields[0].Equals(input)
                    select String.Format("{0}：{1}", fields[1], fields[2]);

                // 検索結果を出力
                foreach (string result in results)
                {
                    Console.WriteLine(result);
                }
                Console.WriteLine("---END---");
            }
        }
    }
}</pre><p>&nbsp;</p>
<p>複数ファイルを跨いで検索する場合は以下のように記述することができる。</p>
<p>※全てのファイルレイアウトが同じ場合</p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System.Text
Imports System.IO

Module Module1

    Sub Main()
        Do
            ' 検索条件に使用するIDの入力を求める
            Console.WriteLine("IDを入力")
            Dim input As String = Console.ReadLine()

            ' 入力された値から終了判定
            If input.ToUpper = "END" OrElse input.ToUpper = "EXIT" Then
                ' "END"、または"EXIT"が入力された場合は終了
                Exit Do
            End If

            ' 指定したCSVファイルへのコンテキストを生成して、入力されたIDをキーに検索
            Dim results As IEnumerable(Of String) =
                From path In Directory.GetFiles("CSV", "*.csv", SearchOption.AllDirectories).AsParallel()
                From fields In TextField.Context(path, ",", Encoding.GetEncoding("Shift_JIS"))
                Where fields(0).Equals(input)
                Select String.Format("{0}：{1}", fields(1), fields(2))

            ' 検索結果を出力
            For Each result As String In results
                Console.WriteLine(result)
            Next
            Console.WriteLine("---END---")
        Loop

    End Sub

End Module</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace CS_CSVtoLINQ
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                // 検索条件に使用するIDの入力を求める
                Console.WriteLine("IDを入力");
                string input = Console.ReadLine();

                // 入力された値から終了判定
                if (input.ToUpper().Equals("END") || input.ToUpper().Equals("EXIT"))
                {
                    // "END"、または"EXIT"が入力された場合は終了
                    break;
                }

                // 指定したCSVファイルへのコンテキストを生成して、入力されたIDをキーに検索
                IEnumerable&lt;string&gt; results = 
                    from path in Directory.GetFiles("CSV", "*.csv", SearchOption.AllDirectories).AsParallel()
                    from fields in TextField.Context(path, ",", Encoding.GetEncoding("Shift_JIS"))
                    where fields[0].Equals(input)
                    select String.Format("{0}：{1}", fields[1], fields[2]);

                // 検索結果を出力
                foreach (string result in results)
                {
                    Console.WriteLine(result);
                }
                Console.WriteLine("---END---");
            }
        }
    }
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-4125868002"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2402557680"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/1006/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1006</post-id>	</item>
		<item>
		<title>.net(VB、C#)でWindowの列挙を行う</title>
		<link>https://knowledge.reontosanta.com/archives/990</link>
					<comments>https://knowledge.reontosanta.com/archives/990#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Sun, 04 Dec 2016 23:46:30 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=990</guid>

					<description><![CDATA[API関数のEnumWindowsを使うことで、全てのウィンドウのハ&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>API関数のEnumWindowsを使うことで、全てのウィンドウのハンドル(HWND)を取得する事ができる。</p>
<p>EnumWindowsを呼び出すと、コールバックメソッドが呼び出され、存在する個々のウィンドウのHWNDが渡される。</p>
<p>以下の例では、EnumWindows()でウィンドウを列挙し、コールバックメソッド内ではIsWindowVisible()を使って可視ウィンドウかどうかを調べている。</p>
<p>また、個々の可視ウィンドウについて、GetWindowText()を使ってウィンドウのキャプションを、GetWindowThreadProcessId()とProcess.GetProcessByIdを使ってプロセス情報を取得・表示している。</p>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">Module Module1
    Public Class Sample
        ''' &lt;summary&gt;
        ''' ウィンドウを列挙します。
        ''' &lt;/summary&gt;
        ''' &lt;param name="lpEnumFunc"&gt;コールバック関数&lt;/param&gt;
        ''' &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll")&gt;
        Public Shared Function EnumWindows(ByVal lpEnumFunc As EnumWinProc, ByVal lParam As IntPtr) As Boolean
        End Function

        ''' &lt;summary&gt;
        ''' EnumWindowsから呼び出されるコールバック関数EnumWinProcのデリゲート
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        Public Delegate Function EnumWinProc(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

        ''' &lt;summary&gt;
        ''' ウィンドウハンドルからキャプションを取得します。
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;param name="lpString"&gt;キャプション&lt;/param&gt;
        ''' &lt;param name="nMaxCount"&gt;キャプションの最大桁数&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll", CharSet:=System.Runtime.InteropServices.CharSet.Auto)&gt;
        Public Shared Function GetWindowText(ByVal hWnd As IntPtr, ByVal lpString As System.Text.StringBuilder, ByVal nMaxCount As Integer) As Integer
        End Function

        ''' &lt;summary&gt;
        ''' ウィンドウハンドルからプロセスＩＤを取得します。
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;param name="lpdwProcessId"&gt;プロセスＩＤ&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll")&gt;
        Public Shared Function GetWindowThreadProcessId(ByVal hWnd As IntPtr, &lt;System.Runtime.InteropServices.Out()&gt; ByRef lpdwProcessId As Integer) As Integer
        End Function

        ''' &lt;summary&gt;
        ''' ウィンドウが可視かどうかを調べます。
        ''' &lt;/summary&gt;
        ''' &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        ''' &lt;returns&gt;&lt;/returns&gt;
        ''' &lt;remarks&gt;&lt;/remarks&gt;
        &lt;System.Runtime.InteropServices.DllImport("user32.dll")&gt;
        Public Shared Function IsWindowVisible(ByVal hWnd As IntPtr) As Boolean
        End Function

    End Class

    Sub Main()

        ' ウィンドウの列挙を開始
        Sample.EnumWindows(AddressOf EnumerateWindow, IntPtr.Zero)

        Console.ReadLine()

    End Sub

    ' ウィンドウを列挙するためのコールバックメソッド
    Private Function EnumerateWindow(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean

        ' ウィンドウが可視かどうか調べる
        If Sample.IsWindowVisible(hWnd) Then
            ' キャプションとプロセスＩＤを表示
            PrintCaptionAndProcess(hWnd)
        End If

        ' ウィンドウの列挙を継続するにはTrueを返す必要がある
        Return True

    End Function

    ' ウィンドウのキャプションとプロセス名を表示する
    Private Sub PrintCaptionAndProcess(ByVal hWnd As IntPtr)

        ' ウィンドウハンドルからプロセスIDを取得
        Dim processId As Integer

        Sample.GetWindowThreadProcessId(hWnd, processId)

        ' プロセスIDからProcessクラスのインスタンスを取得
        Dim p As Process = Process.GetProcessById(processId)

        ' プロセス名を表示
        Console.Write("'{0}' ", p.ProcessName)

        ' ウィンドウのキャプションを取得・表示
        Dim caption As New System.Text.StringBuilder(&amp;H1000)

        Sample.GetWindowText(hWnd, caption, caption.Capacity)

        Console.WriteLine("({0})", caption)

    End Sub

End Module</pre><p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;

namespace CS_EnumWindowsTest
{
    class Sample
    {
        /// &lt;summary&gt;
        /// ウィンドウを列挙します。
        /// &lt;/summary&gt;
        /// &lt;param name="lpEnumFunc"&gt;コールバック関数&lt;/param&gt;
        /// &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool EnumWindows(EnumWinProc lpEnumFunc, IntPtr lParam);

        /// &lt;summary&gt;
        /// EnumWindowsから呼び出されるコールバック関数EnumWinProcのデリゲート
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;param name="lParam"&gt;アプリケーション定義の値&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        public delegate bool EnumWinProc(IntPtr hWnd, IntPtr lParam);

        /// &lt;summary&gt;
        /// ウィンドウハンドルからキャプションを取得します
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;param name="lpString"&gt;キャプション&lt;/param&gt;
        /// &lt;param name="nMaxCount"&gt;キャプションの最大桁数&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

        /// &lt;summary&gt;
        /// ウィンドウハンドルからプロセスＩＤを取得します。
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;param name="lpdwProcessId"&gt;プロセスＩＤ&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);

        /// &lt;summary&gt;
        /// ウィンドウが可視かどうかを調べます。
        /// &lt;/summary&gt;
        /// &lt;param name="hWnd"&gt;ウィンドウのハンドル&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        public static extern bool IsWindowVisible(IntPtr hWnd);
    }

    class Program
    {
        static void Main(string[] args)
        {

            // ウィンドウの列挙を開始
            Sample.EnumWindows(EnumerateWindow, IntPtr.Zero);

            Console.ReadLine();

        }

        private static bool EnumerateWindow(IntPtr hWnd, IntPtr lParam)
        {
            // ウィンドウが可視かどうか調べる
            if (Sample.IsWindowVisible(hWnd))
            {
                // キャプションとプロセスＩＤを表示
                PrintCaptionAndProcess(hWnd);
            }

            // ウィンドウの列挙を継続するにはTrueを返す必要がある
            return true;
        }

        private static void PrintCaptionAndProcess(IntPtr hWnd)
        {
            // ウィンドウハンドルからプロセスIDを取得
            int processId;

            Sample.GetWindowThreadProcessId(hWnd, out processId);

            // プロセスIDからProcessクラスのインスタンスを取得
            Process p = Process.GetProcessById(processId);

            // プロセス名を表示
            Console.Write("'{0}' ", p.ProcessName);

            // ウィンドウのキャプションを取得・表示
            StringBuilder caption = new StringBuilder(0x1000);

            Sample.GetWindowText(hWnd, caption, caption.Capacity);

            Console.WriteLine("({0})", caption);

        }
    }
}</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1432234721"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-125111102"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/990/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">990</post-id>	</item>
		<item>
		<title>.net(VB、C#)でコンピューター名を取得する</title>
		<link>https://knowledge.reontosanta.com/archives/958</link>
					<comments>https://knowledge.reontosanta.com/archives/958#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Wed, 05 Oct 2016 00:13:44 +0000</pubDate>
				<category><![CDATA[.Net(VB、C#)]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=958</guid>

					<description><![CDATA[.netでプログラムを実行中のコンピューター名を取得するには、以下の&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>.netでプログラムを実行中のコンピューター名を取得するには、以下の方法がある。</p>
<p>&nbsp;</p>
<h2>Environment.MachineName プロパティ</h2>
<p>ローカル コンピュータの NetBIOS 名を取得する。</p>
<p>(NetBIOS名はすべて大文字で、小文字は大文字に自動変換される。)</p>
<p>＜必要条件＞</p>
<p>名前空間: System<br />
アセンブリ: mscorlib (mscorlib.dll 内)</p>
<p>＜構文＞</p><pre class="urvanov-syntax-highlighter-plain-tag">public static string MachineName { get; }</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">'宣言
Public Shared ReadOnly Property MachineName As String
'使用
Dim value As String
value = Environment.MachineName</pre><p>＜解説＞</p>
<p>コンピュータの名前は、システムの起動時に、名前がレジストリから読み込まれた時点で確定される。</p>
<p>コンピュータがクラスタ内のノードである場合は、ノード名が返される。</p>
<p>＜例＞</p>
<p>実行しているコンピュータの名前を表示するコード例を次に示す。</p><pre class="urvanov-syntax-highlighter-plain-tag">using System;
class Sample 
{
  public static void Main() 
  {
    Console.WriteLine();
    Console.WriteLine("MachineName: {0}", Environment.MachineName);
  }
}</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">Imports System
Class Sample
   Public Shared Sub Main()
      Console.WriteLine()
      Console.WriteLine("MachineName: {0}", Environment.MachineName)
   End Sub 'Main
End Class 'Sample</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3934247442"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>My.Computer.Name プロパティ(VBのみ)</h2>
<p>コンピュータ名を取得する。</p>
<p>戻り値にコンピュータの名前を格納した String を返す。</p>
<p>＜必要条件＞</p>
<p>名前空間: Microsoft.VisualBasic.Devices<br />
クラス: Computer、ServerComputer<br />
アセンブリ: Visual Basic ランタイム ライブラリ (Microsoft.VisualBasic.dll 内)</p>
<p>＜構文＞</p><pre class="urvanov-syntax-highlighter-plain-tag">'宣言
Public ReadOnly Property Name As String
'使用
Dim value As String = My.Computer.Name</pre><p>＜解説＞</p>
<p>My.Computer.Name プロパティは、MachineName プロパティと同様の機能を提供する。</p>
<p>＜例＞</p>
<p>実行しているコンピュータの名前を表示するコード例を次に示す。</p><pre class="urvanov-syntax-highlighter-plain-tag">MsgBox("Computer name: " &amp; My.Computer.Name)</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2092519691"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-4080845195"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/958/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">958</post-id>	</item>
		<item>
		<title>JavaScriptで即時関数(function(){&#8230;})()を使う</title>
		<link>https://knowledge.reontosanta.com/archives/887</link>
					<comments>https://knowledge.reontosanta.com/archives/887#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Tue, 19 Jul 2016 05:37:44 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=887</guid>

					<description><![CDATA[JavaScriptには無名関数を定義・宣言すると同時に即時実行する&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>JavaScriptには無名関数を定義・宣言すると同時に即時実行するための構文、即時関数というものがある。<br />
この即時関数を利用することで、疑似的にブロックスコープを再現できる。</p>
<p>&nbsp;</p>
<h2>即時関数の構文</h2>
<p>基本的には、以下のような構文となる。（他にも記述方法がいくつかある）</p><pre class="urvanov-syntax-highlighter-plain-tag">(function () {
  //処理を記述
})();</pre><p>また、以下のように引数を指定することもできる。</p><pre class="urvanov-syntax-highlighter-plain-tag">(function (param1, param2, ...) {
  //処理を記述
})('foo', 'bar', ...);</pre><p>その他、通常の関数と同様に戻り値を持たせることも可能である。<br />
※この場合、functionを丸括弧で括る必要はない。（理由は後述）</p><pre class="urvanov-syntax-highlighter-plain-tag">var result = function (param1, param2) {
  return param1 + param2;
}(3, 5);</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-3332082884"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>functionを丸括弧で括る目的</h2>
<p>即時関数はfunctionを丸括弧で括ることで実現されているがこの目的は、「関数を式として評価させる為」である。<br />
JavaScriptにはfunction文とfunction式があり、以下のようにfunctionから始まる関数がfunction文、 式の中で関数を定義したもの（つまりfunction以外で始まるもの）がfunction式となる。</p><pre class="urvanov-syntax-highlighter-plain-tag">//function文
function func() {
}

//function式
var func = function () {
};</pre><p>因みにfunction文とfunction式では挙動が異なり、function文の場合は実行された際に関数が常に先頭に定義される。その為、function文はコード上のどの位置に存在しても対象の関数を呼び出すことができる。しかし、function式は読込まれた位置で関数が定義される為、記述位置よりも前で実行することはできない。<br />
また、function式であれば、関数呼び出しの演算子&#8221;()&#8221;をつけて関数定義と同時に関数呼び出しができる。<br />
つまり、即時関数として関数を定義する上でfunctionを丸括弧で括る目的は、関数をfunction文ではなく、function式として扱う為ということになる。<br />
戻り値を変数に代入する即時関数の場合、functionを丸括弧で括る必要がないのも既にfunction式として評価されている為である。<br />
因みにfunction文に関数呼び出しの演算子&#8221;()&#8221;をつけるとSyntax Errorとなる。</p><pre class="urvanov-syntax-highlighter-plain-tag">function (){
  console.log("foo");
}();</pre><p>これはfunction文が&#8221;}&#8221;で終わったとみなされ、以下のようなイメージで解釈される為である。</p><pre class="urvanov-syntax-highlighter-plain-tag">function (){
  console.log("foo");
}
(); // &lt;-Syntax Error</pre><p>&#8220;();&#8221;は、JavaScriptとして不正な構文となる為、ここでエラーが発生する。<br />
繰り返しになってしまうが、この挙動を回避する為にfunction式の記述にする必要があり、その方法としてfunctionを丸括弧で括る（function以外で始まる）ということに繋がる。</p>
<p>&nbsp;</p>
<h2>即時関数を利用する目的</h2>
<p>即時関数を利用する目的は、スコープを汚染せずに新たなスコープを作成することにある。<br />
JavaScriptのスコープは、「グローバルスコープ」と「関数スコープ（ローカルスコープ）」のみであり、関数は任意にスコープを作る手段と成り得る。<br />
関数スコープの中でvarを使って定義された変数は関数の中でローカルな変数になるので、関数の外側の変数を上書きしない。<br />
再利用されることがない一連の処理の中で一時変数を使用する際、それらの変数をすべてグローバル変数とするとグローバルスコープに不要な変数が積み上がっていき、変数名のバッティング等の予期せぬトラブルが発生する可能性がある。<br />
一連の処理を即時関数で包み一時的なスコープの中で実行することで、プログラムをスコープ上のサンドボックス内で実行することになり、スコープの外側への影響を防ぐことができる。<br />
また、即時関数を利用することで関数そのものを格納する変数も必要がなくなる為、グローバルスコープを全く汚染せずに一時変数を関数スコープ内に包み込むことができる。<br />
その他、一連の処理の結果が不変で結果のみが必要な場合、その結果を得るために何度も同じ処理を実行する必要がなくなるメリットもある。</p>
<p>&nbsp;</p>
<h2>即時関数の利用イメージ</h2>
<p>＜初期化処理への利用＞<br />
ページ読み込み時の初期化処理（一度限りの実行）に利用する。</p>
<p>以下の例は、&#8221;label_date&#8221;ラベルを用意してページ読み込みと同時に日時を表示している。<br />
一時変数である&#8221;label&#8221;、&#8221;now&#8221;、そして処理そのものは初期化終了後には不要となるので、即時関数で包みグローバルスコープの汚染を回避できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">document.addEventListener('DOMContentLoaded', function() {
  //初期化処理
  (function () {
      //ラベルオブジェクト取得
      var label = document.getElementById('label_date');
      //現在日時を取得
      var now = new Date();
      //ラベルに日時を設定
      label.textContent = now;
  }());
});</pre><p>以下の例は、ユーザーエージェントの判定を行っている。<br />
判定結果のみが必要であり、判定処理を即時関数とすることで、その結果を取得する為に何度も判定処理を行う必要がなくなる。</p><pre class="urvanov-syntax-highlighter-plain-tag">var device = function(u) {
  return {
    Tablet:
      (u.indexOf("windows") != -1 &amp;&amp; u.indexOf("touch") != -1 &amp;&amp; u.indexOf("tablet pc") == -1) 
      || u.indexOf("ipad") != -1
      || (u.indexOf("android") != -1 &amp;&amp; u.indexOf("mobile") == -1)
      || (u.indexOf("firefox") != -1 &amp;&amp; u.indexOf("tablet") != -1)
      || u.indexOf("kindle") != -1
      || u.indexOf("silk") != -1
      || u.indexOf("playbook") != -1,
    Mobile:
      (u.indexOf("windows") != -1 &amp;&amp; u.indexOf("phone") != -1)
      || u.indexOf("iphone") != -1
      || u.indexOf("ipod") != -1
      || (u.indexOf("android") != -1 &amp;&amp; u.indexOf("mobile") != -1)
      || (u.indexOf("firefox") != -1 &amp;&amp; u.indexOf("mobile") != -1)
      || u.indexOf("blackberry") != -1
  };
}(window.navigator.userAgent.toLowerCase());

console.log(device);</pre><p>＜プライベートプロパティ／メソッドの定義への利用＞<br />
JavaScriptには、privateやprotected等のアクセス修飾子が無い為、オブジェクト内に定義されたプロパティ／メソッドは、全てパブリックなものとして扱われる。<br />
しかし、即時関数とクロージャを利用することで、疑似的にプライベートなプロパティ／メソッドを実現することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">var counter = function() {
  //プライベートメンバ
  var count = 0;
  //countをクロージャで補足したincrementとshowを返す
  return {
    //加算メソッド
    increment: function() {
      count++;
    },
    //ログ出力メソッド
    show: function() {
      console.log(count);
    }
  };
}();
//メソッドの実行
counter.show(); //0が出力される
counter.increment();
counter.increment();
counter.show(); // 2が出力される
console.log(counter.count); // undefinedが出力される</pre><p>&nbsp;</p>
<h2>即時関数のいろいろな記述方法</h2>
<p>即時関数は、function式として認識させられる構文であれば記述することができる。<br />
つまり、単項演算子から始まる関数を記述すればよい。<br />
単項演算子には&#8221;+&#8221;、&#8221;-&#8220;、&#8221;!&#8221;、&#8221;void&#8221;、&#8221;typeof&#8221;等があり、これらも即時関数の記述に利用できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">(function(){
  console.log("another parentheses");
}());

+function(){
  console.log("plus");
}();

-function(){
  console.log("minus");
}();

!function(){
  console.log("exclamation");
}();

void function(){
  console.log("void");
}();

typeof function(){
  console.log("typeof");
}();</pre><p>上記は、全て動作する。<br />
但し、丸括弧を利用した場合は戻り値に変化がないが、&#8221;+&#8221;、&#8221;-&#8220;の場合は戻り値がnumber型にキャストされ、&#8221;!&#8221;の場合は戻り値がbool型にキャストされ、&#8221;void&#8221;の場合は戻り値が常に&#8221;undefined&#8221;となる。<br />
因みに&#8221;new&#8221;も単項演算子であるが、スコープ内でのthisの示すものが変わってくるので即時関数を記述する目的での使用は控えた方が良いかと思われる。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-2137664471"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1260011481"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/887/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">887</post-id>	</item>
		<item>
		<title>JavaScriptにおけるObject.createの引数</title>
		<link>https://knowledge.reontosanta.com/archives/864</link>
					<comments>https://knowledge.reontosanta.com/archives/864#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 04 Jul 2016 00:08:43 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=864</guid>

					<description><![CDATA[ECMAScript5で定義されたObject.createを利用す&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>ECMAScript5で定義されたObject.createを利用するとコンストラクタ関数とnew演算子を利用する方法以外でオブジェクトを生成することができる。</p>
<h2>Object.createを利用する</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var Dog = {
  name: "REON",
  method: function(){
    console.log( "My name is " + this.name);
  }
};
// 新しいオブジェクトを生成
var dog = Object.create(Dog);
// 新しいオブジェクトのメソッドの実行
dog.method();</pre><p>上記のようにObject.createに元となるオブジェクトをプロトタイプとして渡すことで、新しいオブジェクトを生成することができる。<br />
但し、そもそもコンストラクタ関数が無いのでコンストラクタ引数に初期値を与えることができない。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2695392292"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>Object.createの第二引数</h2>
<p>Object.createを利用する上でコンストラクタ引数に相当するものは、第二引数になる。</p><pre class="urvanov-syntax-highlighter-plain-tag">Object.create(proto [, propertiesObject ])</pre><p>尚、Object.createの第二引数は以下のように形式が厳密に定義されている。</p><pre class="urvanov-syntax-highlighter-plain-tag">{
  "プロパティ名": {
    value        : "値",
    writable     : true,
    configurable : false,
    enumerable   : false,
    get          : function(){},
    set          : function(){},
  }
}</pre><p><table id="tablepress-23" class="tablepress tablepress-id-23">
<thead>
<tr class="row-1">
	<th class="column-1">フィールド</th><th class="column-2">既定値</th><th class="column-3">内容</th>
</tr>
</thead>
<tbody class="row-striping row-hover">
<tr class="row-2">
	<td class="column-1">value</td><td class="column-2">undefined</td><td class="column-3">プロパティの値。データディスクリプタのみ。</td>
</tr>
<tr class="row-3">
	<td class="column-1">writable</td><td class="column-2">false</td><td class="column-3">trueの場合、値を変更可能。データディスクリプタのみ。</td>
</tr>
<tr class="row-4">
	<td class="column-1">configurable</td><td class="column-2">false</td><td class="column-3">trueの場合、ディスクリプタ変更や、オブジェクトからプロパティ削除が可能。</td>
</tr>
<tr class="row-5">
	<td class="column-1">enumerable</td><td class="column-2">false</td><td class="column-3">trueの場合、対応するオブジェクトのプロパティ列挙に現れる。</td>
</tr>
<tr class="row-6">
	<td class="column-1">get</td><td class="column-2">undefined</td><td class="column-3">Getter関数。アクセサディスクリプタのみ。</td>
</tr>
<tr class="row-7">
	<td class="column-1">set</td><td class="column-2">undefined</td><td class="column-3">Setter関数。アクセサディスクリプタのみ。</td>
</tr>
</tbody>
</table>
<!-- #tablepress-23 from cache --></p>
<p>上記の規定に従い、オブジェクト生成時に初期値を与えてみる。</p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var Dog = {
  name: "REON",
  method: function(){
    console.log( "My name is " + this.name);
  }
};
// 新しいオブジェクトを生成（第二引数で初期値の指定やメソッドの追加ができる）
var dog = Object.create(Dog, {
  name: {
    value: "SANTA"
  },
  bark: {
    value: function() {
      console.log(this.name + " is barking.");
    }
  }
});
// 新しいオブジェクトのメソッドの実行
dog.method();
dog.bark();</pre><p>上記の例では、プロトタイプに定義したnameの値がオブジェクト生成時に指定した値に書き換わっている。<br />
また、同時に新しいメソッド（bark）を追加している。<br />
尚、nameプロパティを書き換え可能にするには、&#8221;{value: &#8220;SANTA&#8221;, writable: true}&#8221;のようにwritableフィールドにtrueを設定する必要がある。<br />
同様にプロパティ列挙に表示したい場合やプロパティの削除を可能にしたい場合も、対応するフィールドの設定をtrueに変更する必要がある。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-987094079"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1855441328"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/864/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">864</post-id>	</item>
		<item>
		<title>JavaScriptにおける「this」が指し示すもの</title>
		<link>https://knowledge.reontosanta.com/archives/854</link>
					<comments>https://knowledge.reontosanta.com/archives/854#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 13 Jun 2016 00:32:38 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=854</guid>

					<description><![CDATA[JavaScriptにおける「this」は、「呼び出し元」で指し示す&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>JavaScriptにおける「this」は、「呼び出し元」で指し示すものが変わってくる。<br />
基本的に以下の4種類のパターンが存在する。</p>
<ul>
<li>関数呼び出し（グローバルオブジェクト）のパターン</li>
<li>メソッド呼び出し（所属オブジェクト）のパターン</li>
<li>コンストラクタ呼び出し（インスタンス自身）のパターン</li>
<li>apply/call呼び出し（強制変更）のパターン</li>
</ul>
<p>&nbsp;</p>
<h2>関数呼び出し（グローバルオブジェクト）のパターン</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// 関数定義
function func() {
    this.value= "foo";
    console.log(this);
    console.log(this.value);
}
// 関数呼び出し（thisはグローバルオブジェクトを指す）
func();</pre><p>この場合、「this」は「グローバルオブジェクト」を指す。<br />
つまり、「value」は「グローバル変数」になる。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-2145912809"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>メソッド呼び出し（所属オブジェクト）のパターン</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var myObject = {
  value: "bar",
  method: function() {
    console.log(this);
    console.log(this.value);
  }
}
// メソッド呼び出し（thisは所属オブジェクトを指す）
myObject.method();</pre><p>この場合、「this」はメソッド「method」が所属しているオブジェクトである「myObject」を指す。<br />
因みに以下のようにメソッド呼び出しの中で関数呼び出しをした場合でも関数内の「this」はグローバルを指してしまう為、関数呼び出し時の「this.value」は「undefind」となる。</p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var myObject = {
    value: "bar",
    method: function() {
        console.log(this);
        console.log(this.value);
        // 関数定義
        function method() {
            console.log(this);
            console.log(this.value);
        }
        // 関数呼び出し
        method();
    }
};
// メソッド呼び出し
myObject.method();</pre><p>尚、「this」を別の変数（下記の例では「self」）に格納しておくことで、この問題を解決することができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var myObject = {
    value: "bar",
    method: function() {
        // thisを別の変数に格納
        var self = this;
        console.log(this);
        console.log(self);
        console.log(self.value);
        // 関数定義
        function method() {
            console.log(this);
            console.log(self);
            console.log(self.value);
        }
        // 関数呼び出し
        method();
    }
};
// メソッド呼び出し
myObject.method();</pre><p>&nbsp;</p>
<h2>コンストラクタ呼び出し（インスタンス自身）のパターン</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// 関数定義（コンストラクタ呼び出しを期待）
function MyObject(value) {
    this.value = value;
    this.increment = function() {
        console.log(this);
        this.value++;
    };
}
// インスタンス生成
var myObject = new MyObject(0);
// インスタンス生成時の値（0）が出力される
console.log(myObject.value);
// インスタンスのメソッド呼出し
myObject.increment();
// インスタンスのメソッド実行後の値（1）が出力される
console.log(myObject.value);
// インスタンスのメソッド呼出し
myObject.increment();
// インスタンスのメソッド実行後の値（2）が出力される
console.log(myObject.value);</pre><p>この場合、関数にnew演算子をつけてコンストラクタ呼び出しにてインスタンスを生成している為、「this」は生成されるインスタンス自身となる。<br />
尚、new演算子をつけなかった場合、つまり関数呼び出しとなった場合は、「value」、「increment」共にグローバル変数として定義される。<br />
※慣例として関数をコンストラクタ呼び出しで利用する場合、他の関数と区別しやすくする目的で関数名の先頭を大文字とする。</p>
<p>&nbsp;</p>
<h2>apply/call呼び出し（強制変更）のパターン</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var myObject = {
  value: "foo",
  method: function() {
    console.log(this);
    console.log(this.value);
  }
};
var newObject = {
  value: "bar"
};
// メソッド呼び出し
myObject.method();
// thisの指すオブジェクトを差し替えてメソッド呼び出し
myObject.method.apply(newObject);
myObject.method.call(newObject);</pre><p>この場合、「this」の指すオブジェクトを「newObject」に差し替えてメソッドが呼び出される為、「newObject」の「value」の値が出力される。<br />
「apply/call」を利用すると「強制的にthisの差し替え」ができる。<br />
「apply/call」の第一引数は、「this」に指定したいオブジェクトになる。<br />
尚、「apply」と「call」の違いは、第二引数の指定の仕方になる。</p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var myObject = {
  method: function(value1, value2) {
    console.log(this);
    console.log(this.value + value1 + value2);
  }
};
var newObject = {
  value: "foo"
};
// オブジェクトを差し替えてメソッド呼び出し
myObject.method.apply(newObject, ["bar", "baz"]);
myObject.method.call(newObject, "bar", "baz");</pre><p>出力結果は、「apply」と「call」共に同じになる。<br />
「apply」は第二引数に配列をとり、配列の中身が引数として渡される。<br />
「call」は、第二引数以降がそのままの形で渡される。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-45022180"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2040353827"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/854/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">854</post-id>	</item>
		<item>
		<title>JavaScriptにおける継承</title>
		<link>https://knowledge.reontosanta.com/archives/882</link>
					<comments>https://knowledge.reontosanta.com/archives/882#comments</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Wed, 01 Jun 2016 06:08:03 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=882</guid>

					<description><![CDATA[JavaScriptのオブジェクトは、他のオブジェクト（またはnul&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>JavaScriptのオブジェクトは、他のオブジェクト（またはnull）をプロトタイプとして利用することができる。<br />
オブジェクトのプロパティが参照された際、そのプロパティをオブジェクト自身が保持していなければ、代わりにプロトタイプのプロパティが参照される。<br />
さらにプロトタイプのオブジェクトがそのプロパティを保持していない場合には、プロトタイプのプロトタイプを参照する。（nullに行き着くまで繰り返す）<br />
このようにオブジェクトが他のオブジェクトのプロトタイプとして連鎖していく仕組みをプロトタイプチェーン(prototype chain)と呼ぶ。<br />
JavaScriptでは、このプロトタイプチェーンを利用して継承を行う。</p>
<p>&nbsp;</p>
<h2>コンストラクタ関数とnew演算子のみで継承</h2>
<p>まずは、シンプルに基底となるオブジェクト（コンストラクタ）を元に新しいオブジェクト（インスタンス）を生成する方法で継承をしてみる。<br />
※途中に出てくる&#8221;arguments&#8221;オブジェクトは、関数呼び出しのタイミングで生成されて呼び出し元から与えられた引数の値を配列で保持している特別なオブジェクト</p><pre class="urvanov-syntax-highlighter-plain-tag">//基底オブジェクトを定義（プロトタイプ）
function Pet(name) {
  //--コンストラクタの処理を定義--
  //プロパティを設定
  this.name = name;
  this.age = 0;
  console.log("基底オブジェクトのコンストラクタ");
}
//基底オブジェクトのプロトタイプにメソッドを追加
Pet.prototype.countAge = function () {
  this.age += 1;
};

//新しいオブジェクト（Cat）を定義
function Cat(name) {
  //基底オブジェクトのコンストラクタ呼び出し
  Pet.apply(this, arguments);
  //自身のコンストラクタの処理を定義
  console.log("Catオブジェクトのコンストラクタ");
}
//基底オブジェクトを継承
Cat.prototype = new Pet();
//新しいオブジェクト（Cat）のプロトタイプにメソッドを定義
Cat.prototype.sleep = function () {
  console.log(this.name + " is sleeping.");
};

//Catオブジェクトを利用してインスタンス生成
console.log("-----Cat-----");
var cat = new Cat("santa");
cat.countAge();
cat.sleep();
console.log(cat.name + " is " + cat.age + " y.o.");</pre><p>上記のコードで継承を行っている部分は、&#8221;Cat.prototype = new Pet();&#8221;にあたる。<br />
うまく動作するように見えるが、実際に実行すると&#8221;&#8212;&#8211;Cat&#8212;&#8211;&#8220;の出力の前に&#8221;基底オブジェクトのコンストラクタ&#8221;が出力される。<br />
これは、&#8221;Cat.prototype = new Pet();&#8221;のタイミングで基底オブジェクトのコンストラクタが実行されてしまう為である。<br />
これを回避する為には、以下のように継承部分を変更する必要がある。</p><pre class="urvanov-syntax-highlighter-plain-tag">//基底オブジェクトを継承
var Func = function () {};
Func.prototype = Pet.prototype;
Cat.prototype = new Func();
Cat.prototype.constructor = Cat;</pre><p>まず、ダミーのオブジェクト&#8221;Func&#8221;を定義する。<br />
次に&#8221;Func&#8221;のプロトタイプに基底オブジェクトのプロトタイプを設定する。<br />
さらに新しいオブジェクト&#8221;Cat&#8221;のプロトタイプに&#8221;Func&#8221;から生成したインスタンス（つまり基底オブジェクトのプロトタイプ）を設定する。<br />
最後に新しいオブジェクト&#8221;Cat&#8221;のプロトタイプに自身のコンストラクタを設定する。<br />
これで継承時に基底オブジェクトのコンストラクタが実行されることがなくなる。</p>
<p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-1843726326"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>Object.createを利用して継承</h2>
<p>上記の継承をECMAScript5で定義されたObject.createを利用すると以下のように表すことができる。（新しいオブジェクト&#8221;Cat&#8221;のほかに別のオブジェクト&#8221;Dog&#8221;も追加している）</p><pre class="urvanov-syntax-highlighter-plain-tag">//基底オブジェクトを定義（プロトタイプ）
function Pet(name) {
  //--コンストラクタの処理を定義--
  //プロパティを設定
  this.name = name;
  this.age = 0;
  console.log("基底オブジェクトのコンストラクタ");
}
//基底オブジェクトのプロトタイプを拡張
Pet.prototype = Object.create(Object.prototype, {
  //プロパティの設定を拡張
  name: {
    writable: true
  },
  age: {
    writable: true
  },
  //自身のコンストラクタをセット
  constructor: {
    value: Pet,
    enumerable: false,
    writable: true,
    configurable: true
  },
  //メソッドを定義
  countAge: {
    value: function () {
      this.age += 1;
    }
  }
});

//新しいオブジェクト（Cat）を定義
function Cat(name) {
  //基底オブジェクトのコンストラクタ呼び出し
  Pet.apply(this, arguments);
  //自身のコンストラクタの処理を定義
  console.log("Catオブジェクトのコンストラクタ");
}
//基底オブジェクトのプロトタイプの継承と拡張
Cat.prototype = Object.create(Pet.prototype, {
  //自身のコンストラクタをセット
  constructor: {
    value: Cat,
    enumerable: false,
    writable: true,
    configurable: true
  },
  //メソッドを定義
  sleep: {
    value: function () {
      console.log(this.name + " is sleeping.");
    }
  }
});

//新しい別のオブジェクト（Dog）を定義
function Dog(name) {
  //基底オブジェクトのコンストラクタ呼び出し
  Pet.apply(this, arguments);
  //自身のコンストラクタの処理を定義
  console.log("Dogオブジェクトのコンストラクタ");
}
//基底オブジェクトのプロトタイプの継承と拡張
Dog.prototype = Object.create(Pet.prototype, {
  //自身のコンストラクタをセット
  constructor: {
    value: Dog,
    enumerable: false,
    writable: true,
    configurable: true
  },
  //メソッドを定義
  bark: {
    value: function () {
      console.log(this.name + " is barking.");
    }
  }
});
//Catオブジェクトを利用してインスタンス生成
console.log("-----Cat-----");
var cat = new Cat("santa");
cat.countAge();
cat.sleep();
console.log(cat.name + " is " + cat.age + " y.o.");
//Dogオブジェクトを利用してインスタンス生成
console.log("-----Dog-----");
var dog = new Dog("reon");
dog.countAge();
dog.bark();
console.log(dog.name + " is " + dog.age + " y.o.");</pre><p>Object.createの第一引数に基底オブジェクトのプロトタイプを、第二引数に新しいオブジェクト自身のコンストラクタを指定して生成したオブジェクトを新しいオブジェクトのプロトタイプに設定している。（メソッドなどを追加する場合も第二引数に列挙する）<br />
Object.createでオブジェクトを生成する際には、コンストラクタは実行されないので継承時に基底オブジェクトのコンストラクタが実行されることはない。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1906838554"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-3940088843"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/882/feed</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">882</post-id>	</item>
		<item>
		<title>JavaScriptでクラスを定義する</title>
		<link>https://knowledge.reontosanta.com/archives/861</link>
					<comments>https://knowledge.reontosanta.com/archives/861#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 16 May 2016 04:30:52 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=861</guid>

					<description><![CDATA[JavaScriptでクラス（的なもの）を定義してみる。 プロトタイ&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>JavaScriptでクラス（的なもの）を定義してみる。<br />
プロトタイプベースのオブジェクト指向言語であるJavaScriptには、JavaやC#のようなクラスベースのオブジェクト指向言語とは違い、クラスベースのオブジェクト指向言語でいうところの意味でのクラスは存在しない為、関数オブジェクトをクラスに見立てて疑似的にクラスを定義することになる。<br />
尚、この場でのクラスの定義は「特定のプロパティ（メソッドとメンバ変数）を持つオブジェクト」とする。<br />
※ECMAScript6には、クラス定義が実装されているがここでは触れていない。</p>
<p>&nbsp;</p>
<h2>オブジェクトリテラルでクラスを定義</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var myObject = {
    name: 'myObject',
    method: function() {
        console.log('Hello! ' + this.name);
    }
};
// メンバ変数の参照
console.log(myObject.name);
// メソッドの実行
myObject.method();</pre><p>JavaScript での最も単純なクラスの定義は、オブジェクトリテラルを使用してオブジェクトを定義する形になる。<br />
尚、あるオブジェクトを元に新しいオブジェクトを生成する場合は、ECMAScript5で規定された「Object.create」を利用して元のオブジェクトをプロトタイプとすることで実現できる。</p><pre class="urvanov-syntax-highlighter-plain-tag">// オブジェクト定義
var myObject = {
    name: 'myObject',
    method: function() {
        console.log('Hello! ' + this.name);
    }
};
// ECMAScript5規定のObject.createが未定義の場合、Object.createを定義する
if (typeof Object.create !== 'function') {
    Object.create = function(o) {
        var F = function() {};
        F.prototype = o;
        return new F();
    };
}
// 新しいオブジェクトを生成
var newObject = Object.create(myObject);
// 新しいオブジェクトのメンバ変数の値を変更
newObject.name = 'newObject';
// 新しいオブジェクトのメンバ変数の参照
console.log('---newObject---');
console.log(newObject.name);
// 新しいオブジェクトのメソッドの実行
newObject.method();
// 元のオブジェクトのメンバ変数の参照
console.log('---myObject---');
console.log(myObject.name);
// 元のオブジェクトのメソッドの実行
myObject.method();</pre><p>&nbsp;</p>
<div class="knowl-content" style="margin-top: 40px;" id="knowl-262649682"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="4196732648" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><h2>コンストラクタでクラスを定義</h2>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">// コンストラクタ定義（関数定義）
function MyClass() {
    //　newを使用してインスタンスを生成すると暗黙的にthisオブジェクトが生成される
    //var this = {};
    
    // メンバ変数定義
    this.name = 'no_name';
    // メソッド定義
    this.method = function() {
        console.log('Hello! ' + this.name);
    };
    
    //　newを使用してインスタンスを生成すると暗黙的にthisオブジェクトがreturnされる
    //return this;
}
// インスタンス生成
var newObject = new MyClass();
// メソッド実行
console.log(newObject.name);
newObject.method();</pre><p>オブジェクトリテラルではなく、JavaやC#等のクラスベースでのオブジェクト指向のようにクラスを定義する場合は上記のようになる。<br />
そもそもJavaScriptにクラスの概念が無い為、関数定義をnew演算子を使用して呼び出すことでコンストラクタとして働かせ、これをクラスと呼ぶ。<br />
コンストラクタはインスタンスが生成された時に実行される関数のことであり、関数なので引数を与えることもできる。<br />
尚、new演算子を使用しインスタンスを生成するとJavaScriptでは暗黙的に関数内で「this」という空オブジェクトの生成とそのオブジェクトのreturnの2行が追加される。<br />
この為、thisキーワードを使用してメンバ変数を定義することができる。（this.XXX）<br />
また、コンストラクタとしての関数内でthis以外のオブジェクトでreturnを使用するとthisが復帰されなくなってしまう為、コンストラクタとしての関数内ではreturnを使用しない。<br />
その他、メンバ変数に無名関数として処理を代入すれば、インスタンスメソッドとして機能する。<br />
但しこの場合、インスタンスが生成される度にインスタンスが定義され、メモリ領域を圧迫する。<br />
この問題は、prototypeを利用することで解決できる。<br />
※慣例として関数をコンストラクタ呼び出しで利用する場合、他の関数と区別しやすくする目的で関数名の先頭を大文字とする。</p>
<p>&nbsp;</p>
<h2>prototypeを使う</h2>
<p>prototypeは、関数オブジェクトが定義されると自動的に生成されるメンバ変数である。<br />
prototypeは、空オブジェクトへの参照を保持しており、インスタンス内に存在しないメンバ変数が参照された場合、prototypeを参照する。<br />
つまり、prototypeのプロパティは関数オブジェクト自身の親への参照のようなものと捉えることができる。</p><pre class="urvanov-syntax-highlighter-plain-tag">// 中身が空のクラスを定義
function MyClass(){
}
// 定義したクラスのプロトタイプにプロパティを定義
MyClass.prototype.method = function() {
    console.log('Hello!');
};
// インスタンス生成
var newObject = new MyClass();
// メソッド実行
newObject.method();</pre><p>上記の例は、中身が空のクラスを定義し、そのクラスのprototypeに対してmethodプロパティを定義することで、newObjectインスタンスからmethodプロパティを呼び出している。<br />
prototypeは、MyClassクラスの親のようなものであり、prototypeにプロパティを定義することでMyClassのインスタンスであるnewObjectからもmethodを呼び出すことができる。<br />
また、このようにprototypeにクラス共通のプロパティを定義をすることで、インスタンス生成の度にインスタンスメソッドが保持されることが無くなり、メモリ領域の圧迫を軽減できる。</p>
<p>&nbsp;</p>
<h2>改めてJavaScriptでのクラス定義の基本</h2>
<p>基本的にJavaScriptでクラスを定義する際には、prototypeに汎用的な関数やクラス共通の変数を定義し、それ以外の変数はメンバ変数としてクラス内に定義することに規定すると理解しやすい。</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-1567204268"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-1369293270"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/861/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">861</post-id>	</item>
		<item>
		<title>JavaScriptでゼロパディング（前0埋め）を行う</title>
		<link>https://knowledge.reontosanta.com/archives/907</link>
					<comments>https://knowledge.reontosanta.com/archives/907#respond</comments>
		
		<dc:creator><![CDATA[mogice]]></dc:creator>
		<pubDate>Mon, 02 May 2016 00:29:42 +0000</pubDate>
				<category><![CDATA[JavaScript]]></category>
		<guid isPermaLink="false">http://knowledge.reontosanta.com/?p=907</guid>

					<description><![CDATA[JavaScriptでゼロパディング（前0埋め）を行うには、slic&#46;&#46;&#46;]]></description>
										<content:encoded><![CDATA[<p>JavaScriptでゼロパディング（前0埋め）を行うには、sliceを利用すると簡単に実現できる。</p>
<h2>サンプル</h2>
<p>例えば、2桁に合わせる場合は、以下のようにする。</p><pre class="urvanov-syntax-highlighter-plain-tag">var num = 3;
console.log(('0' + num).slice(-2));</pre><p></p>
<ul>
<li>&#8220;&#8216;0&#8217; + num&#8221;で元の値の左に&#8221;0&#8243;を付加する。（元の値が&#8221;3&#8243;であれば&#8221;03&#8243;となる）</li>
<li>&#8220;slice(-2)&#8221;で右から2文字を切り出す。（&#8221;03&#8243;を右から2文字切り出すと&#8221;03&#8243;となる）</li>
</ul>
<p>元の値が&#8221;12&#8243;の場合、&#8221;0&#8243;を付加して&#8221;012&#8243;となり右から2文字切り出して結果は、&#8221;12&#8243;となる。</p>
<p>3桁、4桁も同様に&#8221;&#8217;00&#8217; + num.slice(-3)&#8221;や&#8221;&#8216;000&#8217; + num.slice(-4)&#8221;とすればよい。</p>
<p>&nbsp;</p>
<div class="knowl-after-content-ad" style="margin-top: 40px;" id="knowl-3939577245"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="2719999442" 
data-ad-format="auto"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div><div class="knowl-after-content-relation" id="knowl-2888321431"><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-8913642688016174" crossorigin="anonymous"></script><ins class="adsbygoogle" style="display:block;" data-ad-client="ca-pub-8913642688016174" 
data-ad-slot="7848218644" 
data-ad-format="autorelaxed"></ins>
<script> 
(adsbygoogle = window.adsbygoogle || []).push({}); 
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://knowledge.reontosanta.com/archives/907/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">907</post-id>	</item>
	</channel>
</rss>
