カテゴリー ‘ プログラミング

「新しいiPad」は初日に100万台販売され2012年の「iPad」販売数は6000万台に達すると予想!2013年には1億台に到達か?!

新しいiPad

アナリストによると、2012年の「iPad」の販売数は6000万台に達すると予想しています。

参考記事:Analyst predicting 65 million iPads to be sold this year

 

3月16日に発売される「新しいiPad」は、初日に100万台を売り上げると予想されています。

また、2013年には、9060万台販売すると予想され、1億台間近となります。

Share on Facebook

米Intel、プログラムを容易に並列化できるC/C++言語拡張「Cilk Plus」をオープンソース化!

米Intelがプログラムを容易に並列化できるC/C++言語拡張「Cilk Plus」をオープンソース化し、またGCCへの実装が「cilkplus」ブランチで開始されたと発表されました。

参考記事:米Intel、並列プログラミングのためのC/C++言語拡張「Cilk Plus」をオープンソース化。GCCへの実装も開始 – SourceForge.JP Magazine : オープンソースの話題満載

 

「Cilk Plus」は、マサチューセッツ工科大学で開発されたC言語拡張「Cilk」をベースとして、Intelが2010年に発表したC/C++向けの言語拡張です。「Cilk Plus」には、プログラムの並列化を容易に実装できるキーワードや関数群が含まれています。

 

「Cilk Plus」のダウンロードは以下のURLより。
http://software.intel.com/en-us/articles/download-intel-cilk-plus-source/

Share on Facebook

.NETでデータベース操作に利用できるデータプロバイダまとめ – ODBC、MySQL、PostgreSQL、SQLite、DB2、Firebird

.NETから利用できるデータベース接続ライブラリの紹介です。

今回、紹介するデータプロバイダは、ODBC、MySQL、PostgreSQL、SQLite、DB2、Firebirdの6つです。

ここで紹介していないデータベースで有名なものとして、「Microsoft SQL Server」と「Oracle」があります。

「Microsoft SQL Server」は、.NET Frameworkに標準搭載されており、「Oracle」はOracleクライアントに搭載されている「Oracle Data Provider for .NET」を利用して接続します。

ODBC

ODBC接続する為のデータプロバイダです。マイクロソフト公式のデータプロバイダとなります。

ダウンロード詳細 ODBC .NET Data Provider

MySQL

MySQLが公式に提供しているデータプロバイダです。

こちらのデータプロバイダは、ライセンスがGPLとなっているのでご注意ください。

MySQL :: Download Connector/Net

MySQLに関しては、使い方を解説した記事を書いてあるので、そちらもご参考にしてください。

VB.NETでデータベースのMySQLに接続する方法

PostgreSQL

サイトやドキュメントが日本語で記載されており、分かりやすくなっています。

最新バージョンの公開日が「2006-10-08」とずいぶん前なのが気になりますが、現状、利用は問題ないかと思います。

Postgresql のための Npgsql .Net データプロバイダ : プロジェクトホームページ

SQLite

組み込みデータベースのSQLiteに接続できるデータプロバイダです。

ライセンスは、パブリックドメインとなっています。

System.Data.SQLite

SQLiteに関しては、使い方や、接続文字列の解説を記事にしたことがあるので、そちらもご参考にしてください。

DB2

IBMが提供するDB2に接続できる、公式データプロバイダです。

IBM – DB2 for .NET: Innovate with Visual Studio

Firebird

あまり有名ではありませんが、オープンソースのデータベース「Firebird」に接続できるデータプロバイダです。

Firebird: .NET Provider

Share on Facebook

PHPで文字化けせずにメールを送信する方法

PHPでメールを送信する方法を紹介したいと思います。

サンプル

// 言語の設定
mb_language("ja");

// 文字コード設定
mb_internal_encoding("UTF-8");

// 送信先のメールアドレス
$mail_to = "[email protected]";

// メールのタイトル
$subject = "タイトル";

// メール本文
$message = "メールの内容";

// 送信者のメールアドレス
$mail_from = "From:".mb_encode_mimeheader("名前")." <[email protected]>";

// メール送信
mb_send_mail($mail_to, $subject, $message, $mail_from);

注意点

上のサンプルで問題なくメールの送信はできるのですが、ちょっとだけ注意した方がいいことが2点あるので補足です。

 

  1. 日本語のメールを送信する場合は、必ず言語の設定と内部エンコーディングの設定をする必要があります。
    // 言語の設定
    mb_language("ja");
    
    // 文字コード設定
    mb_internal_encoding("UTF-8");

  2. 送信先メールアドレスに日本語を使用する場合は、必ずmb_encode_mimeheader関数を使ってエンコードする必要があります。
    // 送信者のメールアドレス
    $mail_from = "From:".mb_encode_mimeheader("名前")." <[email protected]>";

 

Share on Facebook

.NETで手軽にFTP接続できるライブラリ – TKFP

C#、VB.NETで利用できる、FTP接続ライブラリ「TKFP」のご紹介です。

TKFPは、面倒なコマンド操作をラップして、簡単に利用出来るようにしたクラスライブラリです。

 

こちらのライブラリは、ファイルの送受信やパーミッションの変更など、FTP操作の基本的なことはもちろん、暗号化通信(FTP over SSL/TLS)にも対応しています。

ダウンロード

以下のリンクよりダウンロードできます。

ソースとライブラリ単体それぞれダウンロードできますので、必要な方をダウンロードしてください。
.NET用FTPクラスライブラリ (TKFP.DLL)

ライセンス

ライセンスは独自ライセンスで、商用・非商用どちらでも自由に使うことが可能になっています。

細かい内容については、公式サイトの使用条件の項目をご覧ください。

使い方

使い方については、公式サイトによくまとまっているので、そちらをご覧ください。
TKFP.DLL プログラミングTips

Share on Facebook

.NETでUDPプロトコルを使ってメッセージを送信する方法

メッセージを送信するプロトコルとして主に使われるのは、TCP/IPとUDPが多いですが、今回はUDPによるメッセージ送信の方法を紹介します。

UDPは、TCP/IP通信の信頼性は低いが、送信速度が速いという特徴があるので、多くのメッセンジャーソフトで利用されています。

動作サンプル画像

初期起動時です。デフォルトでは、自分のパソコンに送信するようになっています。

UPD

送信するメッセージを入力して送信した後です。きちんと送信されていることが分かります。

UPD

サンプルソース

ソースのライセンスはGPLとします。

Imports System.Net
Imports System.Net.Sockets

''' <summary>
''' UDPプロトコルを使ってメッセージのやりとりをするサンプルプログラムです。
''' </summary>
''' <remarks>
''' ライセンス:GNU General Public License (http://www.gnu.org/licenses/gpl.html)
''' 著作者:rider (http://www.rider-n.sakura.ne.jp/wp/)
''' </remarks>
Public Class Form1
    Dim Udp As UdpClient
    Dim Ep As IPEndPoint

    ''' <summary>
    ''' フォームロード時の処理です。UDPクライアントの定義と非同期の受信処理を実行します。
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        'スレッドセーフでなくてもエラーを出さない
        Control.CheckForIllegalCrossThreadCalls = False

        'UPDクライアントを定義
        Ep = New IPEndPoint(IPAddress.Any, Me.TextBox2.Text)
        Udp = New System.Net.Sockets.UdpClient(Ep)

        '非同期の受信処理
        Udp.BeginReceive(New AsyncCallback(AddressOf ReceiveCallback), Nothing)
    End Sub

    ''' <summary>
    ''' 送信ボタンクリック時の処理です。
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '入力された文字をバイト配列に読み込む
        Dim SendBytes As Byte() = System.Text.Encoding.UTF8.GetBytes(Me.TextBox3.Text)

        '入力されたホストにメッセージを送信
        Udp.Send(SendBytes, SendBytes.Length, Me.TextBox1.Text, Me.TextBox2.Text)

        '非同期処理
        Udp.BeginReceive(New AsyncCallback(AddressOf ReceiveCallback), Nothing)
    End Sub

    ''' <summary>
    ''' 非同期のUDP受信処理です。UDPプロトコルからのメッセージを受信すると呼び出されます。
    ''' </summary>
    ''' <param name="ar"></param>
    ''' <remarks></remarks>
    Private Sub ReceiveCallback(ByVal ar As IAsyncResult)
        '受信したメッセージをバイト配列に読み込む
        Dim RcvBytes As Byte() = Udp.EndReceive(ar, Ep)
        'バイトデータを文字列に変換
        Dim RcvMsg As String = System.Text.Encoding.UTF8.GetString(RcvBytes)

        '受信したデータをテキストに表示
        Me.TextBox4.Text = Me.TextBox4.Text & "送信メッセージ:" & RcvMsg & vbCrLf
        Me.TextBox4.Text = Me.TextBox4.Text & "送信元アドレス:" & Ep.Address.ToString & vbCrLf
        Me.TextBox4.Text = Me.TextBox4.Text & "ポート番号  :" & Ep.Port & vbCrLf & vbCrLf
    End Sub
End Class

プログラム中では、「Control.CheckForIllegalCrossThreadCalls = False」でスレッドセーフでない場合でもエラーを出さないようにしていますが、本来は、きちんとスレッドセーフになるようにプログラムを書いてください。

スレッドセーフにする方法は以下の記事を参考にしてください。
.NETのスレッド処理でスレッドセーフでない場合でもエラーを出さないようにする方法

サンプルプログラムダウンロード

“UDPMessenger” をダウンロード UDPMessenger.zip – 1276回ダウンロードされました – 30 kB

Share on Facebook

.NETのマルチスレッド処理で引数を渡す方法

スレッド処理のサンプルは、引数を渡さないものが紹介されていることが多いのですが、実際に使う時には、引数を渡したい場面が多々あります。

今回は、スレッド処理で引数を渡す方法の紹介です。

ソースのライセンスはGPLとします。

引数なしのスレッド処理

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim ThredTestThread As System.Threading.Thread

    'スレッドのクラス作成
    ThredTestThread = New System.Threading.Thread(AddressOf ThredTest)

    '別スレッドで呼び出し
    ThredTestThread.Start()
End Sub

Private Sub ThredTest()
    Debug.Print("デバッグ情報")
End Sub

引数ありのスレッド処理

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim ThredTestThread As System.Threading.Thread

    'スレッドのクラス作成
    ThredTestThread = New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf ThredTest))

    '別スレッドで呼び出し
    ThredTestThread.Start("デバッグ情報")
End Sub

Private Sub ThredTest(ByVal Text As Object)
    Debug.Print(Text)
End Sub

 

今回はサンプルなので、実行結果は同じですが、引数として文字列を渡せていることを確認できると思います。

引数は、Object型で指定するので、クラスや配列などを渡すこともできます。

Share on Facebook

マルチスレッドで動作する.NETのプログラムサンプル

最近のパソコンは、マルチコアのCPUを積んでいるものが多く、マルチスレッドプログラミングで処理の効率化を図れる環境が整ってきました。

もちろん、なんでもかんでもマルチスレッド化すれば、処理効率がよくなる!ってわけではありません。マルチスレッド化しても処理効率があまり上がらないだろうなというものをまとめてみました。

マルチスレッド化しても処理効率があまり上がらないパターン

  • 処理中に同一ファイルに対して読み書きが発生する場合

    同一ファイルへの読み書きがある場合は、あまり処理効率が上がらない可能性があります。

    なぜかというと、ディスクへの読み書きというのは、結構時間がかかる処理なので、ひとつの処理が読んだり書き込んだりする間は他の処理は、待ち状態になります。その待ち時間がボトルネックになって処理速度が上がらない可能性があります。

  • 同一のオブジェクトへアクセスする場合

    上のファイルと同じ理由で、同一オブジェクト(変数とか)へのアクセスがある場合には、そこで待ちが発生して遅くなる可能性があります。

他にもあると思いますが、パッと出てくるのはこのくらい。

 

どういう時にマルチスレッド化した方がいいのかというと、大きく分けて以下の2パターン。

  1. 処理時間がかかるので処理を分割したい場合

    これは単純に、処理を分割して処理効率を上げたい場合です。

  2. 処理中に画面上に進捗状況を出したい場合(フォームを応答なしの状態にしたくない場合)

    Windows Formアプリケーションの画面描画は、CPUを使って描画しているので、プログラムがCPUを占有すると画面が描画されません。(応答なしになって画面が白くなった状態)

    ただ、処理の進捗状況を表示しないといけないということはよくあることなので、DoEventsを実行して画面の表示をリフレッシュするという人も多いのではないでしょうか。

    DoEventsを実行すると確かに画面が再表示されるのですが、この命令は「メッセージキューにある処理を全て処理する」という命令なので、DoEventsを1行入れるだけで、処理が遅くなることがあります。

マルチスレッドのサンプル

簡単なサンプルを作ってみました。

画面には、ラベルを1つとボタンを2つ配置します。

multi_thread01

Button1を押すと、マルチスレッド処理なしでループ処理を実行、Button2を押すと、マルチスレッド処理でループ処理を実行します。

ソースのライセンスはGPLとします。

''' <summary>
''' ラベルに値をセットする為のデリゲートです。
''' </summary>
''' <param name="Text">表示するテキストです。</param>
''' <remarks></remarks>
Delegate Sub SetLabelTextDelegate(ByVal Text As String)

''' <summary>
''' マルチスレッドなしで処理を実行するクリックイベントです。
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'マルチスレッドなしの通常呼び出し
    Call MultiThreadTest(1000)
End Sub

''' <summary>
''' マルチスレッドで処理を実行するクリックイベントです。
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim MultiThreadTestThread As System.Threading.Thread

    'スレッドのクラス作成
    MultiThreadTestThread = New System.Threading.Thread(New System.Threading.ParameterizedThreadStart(AddressOf MultiThreadTest))

    'バックグラウンドで動作
    MultiThreadTestThread.IsBackground = True

    '別スレッドで呼び出し
    MultiThreadTestThread.Start(1000)
End Sub

''' <summary>
''' 指定回数ループ処理を実行してラベルに件数を表示します。
''' </summary>
''' <param name="LoopCount">ループ処理回数です。</param>
''' <remarks></remarks>
Private Sub MultiThreadTest(ByVal LoopCount As Object)
    Dim SetLabelTextDgl As New SetLabelTextDelegate(AddressOf SetLabelText)
    Dim Count As Integer = DirectCast(LoopCount, Integer)

    '指定回数ループ
    For i As Integer = 1 To Count
        '10ミリ秒ストップ
        System.Threading.Thread.Sleep(10)

        'ラベルに値をセット
        Me.Label1.Invoke(SetLabelTextDgl, i.ToString)
    Next
End Sub

''' <summary>
''' ラベルに値をセットします。
''' </summary>
''' <param name="Text"></param>
''' <remarks></remarks>
Private Sub SetLabelText(ByVal Text As String)
    'ラベルにカウンターを表示
    Me.Label1.Text = Text
End Sub

サンプルの補足

サンプルプログラム中のラベルに件数を出力するところなのですが、単純にラベルに出すだけなのになんでこんなことやってるの?と思った人もいると思います。

もちろんこれにはちゃんと理由があって、.NETのオブジェクト類の多くは、スレッドセーフ(スレッドセーフ – Wikipedia)ではないので、複数のスレッドからアクセスされると問題が発生することがあります。

サンプルプログラムにあるような方法を使うことで、スレッドセーフになり、安全に処理を実行することができます。

前に記事も書いたのでそちらもご覧ください。

.NETのスレッド処理でスレッドセーフでない場合でもエラーを出さないようにする方法

Share on Facebook

.NETのスレッド処理でスレッドセーフでない場合でもエラーを出さないようにする方法

.NETでは、別スレッドからスレッドセーフでないコントロールオブジェクトを操作すると、エラーが発生するようになっています。

スレッド処理を実行する前に「Control.CheckForIllegalCrossThreadCalls」プロパティを False に変更すると、エラーが発生しないようになります。

Control.CheckForIllegalCrossThreadCalls = False

 

ただし、この方法はエラーを無視しているだけで、根本的な解決にはなっていません。

スレッドセーフにしてコントロールを操作するには、通常とはちょっと違った特殊な操作が必要になります。

以下、サンプルです。ソースのライセンスはGPLとします。

''' <summary>
''' テキストボックスに値をセットする為のデリゲートです。
''' </summary>
''' <param name="Text">表示するテキストです。</param>
''' <remarks></remarks>
Delegate Sub SetTextBoxTextDelegate(ByVal Text As String)

''' <summary>
''' 別スレッド処理を実行するクリックイベントです。
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim MultiThreadTestThread As System.Threading.Thread

    'スレッドのクラス作成
    MultiThreadTestThread = New System.Threading.Thread(AddressOf ThredTest)

    '別スレッドで呼び出し
    MultiThreadTestThread.Start()
End Sub

''' <summary>
''' 別スレッドの処理です。
''' </summary>
''' <remarks></remarks>
Private Sub ThredTest()
    Dim SetTextBoxTextDgl As New SetTextBoxTextDelegate(AddressOf SetTextBoxText)

    'テキストボックスに値をセット
    Me.TextBox1.Invoke(SetTextBoxTextDgl, "表示する文字")
End Sub

''' <summary>
''' テキストボックスに値をセットします。
''' </summary>
''' <param name="Text"></param>
''' <remarks></remarks>
Private Sub SetTextBoxText(ByVal Text As String)
    'テキストボックスに指定テキストを表示
    Me.TextBox1.Text = Text
End Sub

Share on Facebook

PHPからMicrosoft SQL Serverに接続する時の正しいやり方

CodeZineに「PHPからSQL Serverへの正しい接続方法」という記事が出ていました。

PHPからSQL Serverに接続する機会はあまり多くはないでしょうが、絶対にないというわけではないので。

 

この記事では、結構詳しくまとまっているので、かなり参考になると思います。

Share on Facebook

広告

Facebook

カレンダー

2014年11月
« 5月    
 1
2345678
9101112131415
16171819202122
23242526272829
30  

最近の投稿

アーカイブ