ページ

2014年4月24日木曜日

Window server 2012 R2 で、Monacaデバッガー Window8アプリのデバッグ





MonacaデバッガーをWindows Server 2012 R2 にインストールして実行してみた。
起動するとログイン








Windows Server 2012 R2の開発者用ライセンスが必要とのメッセージが出て、取得しを試みたところ、以下のメッセージが出た。うーん残念。



それもそうかな。
MonacaのWindowsアプリはWindows8向けになっているので、Windows Server 2012 R2でMonacaデバッガーを実行させるには、それなりの準備が必要なようだ。

Windows Server 2012 R2でWindows8のアプリを動作させるには、「機能」を追加してあげる必要がると思われる。
これはWindows Server 2008でWindows7のアプリを動作させる時と同じ。

以下のサイトを参考しにして、機能を追加してみた。

Windows Server 2012でWindows 8で利用できる機能を追加する


Windows Server 2012 R2

















Visual Studio 2010 C#.NET で WordPress に自動投稿するプログラム


Visual Studio 2010 C#.NET で WordPress に自動投稿するプログラムを作るべく調査しまいた。


以下のサイトを参考にしました。
http://www.moonmile.net/blog/archives/1284


XML-RPCを使います。
参考サイトに従ってC#のプロジェクトをダウンロードしてコンパイルしました。

コンパイルを試した結果、.NET Framework 4ではうまくいきません。
.NET Framework 3.5で動作確認ができました。

現時点でのxml-rpc.netのバージョンは.2.5.0でした。


参考サイトのソースを少し変更して、コマンドプロンプトからすべて引数で動くように改修しました。


  • サンプルコード


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

namespace WP_Post
{
    class Program
    {
        static void Main(string[] args)
        {
            Program pg = new Program();
            try
            {
                pg.url = args[0];   //<投稿先のURL/xmlrpc.php/>
                pg.username = args[1];  //ブログのユーザー名
                pg.password = args[2];  //ブログのパスワード
                string title = args[3]; //タイトル
                string content = args[4];   //記事内容
                pg.categoryID = int.Parse(args[5]);//カテゴリID
                // 投稿
                pg.BllogerNewPost(title, content);
            }
            catch (Exception ex)
            {
                Console.WriteLine("エラー:" + ex.Message);
                return;
            }
        }
        // ユーザー名
        string username = "<ブログのユーザー名>";
        // パスワード
        string password = "<ブログのパスワード>";
        // 投稿先のURL
        string url = "<投稿先のURL>";
        // 投稿カテゴリID
        int categoryID = 0;

        public void BllogerNewPost(string title, string content)
        {
            //プロキシクラスのインスタンスを作成
            IBlogger proxy =
                CookComputing.XmlRpc.XmlRpcProxyGen.Create<IBlogger>();
            //URLを指定
            proxy.Url = url;

            int id = 0;
            // content を生成
            content = string.Format("<title>{0}</title>", title)
                + string.Format("<category>{0}</category>", categoryID)
                + content;

            //blogger.getRecentPostsを呼び出す
            id = proxy.newPost(
                "",             // WordPressの場合は無視
                "1",            // 念のため1にしておく
                username,
                password,
                content,
                false);
            //結果を表示する
            Console.WriteLine("id: " + id);
        }
    }

    public interface IBlogger : IXmlRpcProxy
    {
        /// <summary>
        /// 新規投稿
        /// </summary>
        /// <param name="appkey">無視</param>
        /// <param name="blogid">無視</param>
        /// <param name="username">ユーザー名</param>
        /// <param name="password">パスワード</param>
        /// <param name="content">本文</param>
        /// <param name="publish">公開するかどうか</param>
        /// <returns>エントリのIDを返す</returns>
        [XmlRpcMethod("blogger.newPost")]
        int newPost(
            string appkey,
            string blogid,
            string username,
            string password,
            string content,
            bool publish);
    }
}





2014年4月8日火曜日

VBA エクセルマクロでCDOを使ったメール送信プログラム

BASP21を使ったメール送信プログラムは結構存在しますが、WinodwsにCDOが標準搭載されてからは、CDOを使っプログラムもリリースされるようになりました。
以下にサンプルプログラムを用意しました。
ヒントになればと思います。
GmailとYahoo mailで試したところ、本文のCRLFの扱いの違いがありました。
改行コードCRLFをLFに変換する機能は有った方が良いようです。
SMTPサーバーのプラットフォームの違いなのかもしれません。





サンプルプログラム

Option Explicit
'参照設定でCDOを参照しておくこと
Public passwd As String
Public sw As Byte

Sub MySendMail()
    Dim ret As String
    Dim szLogfile As String
    Dim szServer As String, szTo As String, szFrom As String
    Dim szSubject As String, szBody As String, szFile As String
    Dim flBody
    Dim i As Long
    Dim fs, a As Object
    Dim oMsg As New CDO.Message
    Dim szCC As String, szBCC As String
On Error GoTo Err_Handler
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set a = fs.CreateTextFile(Worksheets("設定").Cells(27, 1).Value, True) 'ログファイル
    passwd = ""
    oMsg.Configuration.Fields.Item(cdoSendUsingMethod) = cdoSendUsingPort '2
    oMsg.Configuration.Fields.Item(cdoSMTPServer) = Worksheets("設定").Cells(11, 1).Value 'SMTPサーバー名
    oMsg.Configuration.Fields.Item(cdoSMTPServerPort) = Worksheets("設定").Cells(13, 1).Value 'ポート番号
    oMsg.Configuration.Fields.Item(cdoSMTPConnectionTimeout) = 60   'タイムアウト値

    If Worksheets("設定").Cells(7, 1).Value <> "" Then  'CC
        oMsg.CC = Worksheets("設定").Cells(7, 1).Value
    End If
    If Worksheets("設定").Cells(9, 1).Value <> "" Then  'BCC
        oMsg.BCC = Worksheets("設定").Cells(9, 1).Value
    End If
 
    oMsg.Configuration.Fields.Item(cdoSMTPAuthenticate) = Worksheets("設定").Cells(15, 1).Value 'SMTP認証
 
     '要パスワード認証の場合
    If Worksheets("設定").Cells(17, 1) = 1 Then
        UserForm1.Show
        If sw = 1 Then
           oMsg.Configuration.Fields.Item(cdoSendPassword) = passwd
         Else
            MsgBox "送信処理をキャンセルしました。"
            GoTo Exit_sub
         End If
    End If
 
    If Worksheets("設定").Cells(21, 1) = 1 Then
        oMsg.Configuration.Fields.Item(cdoSMTPUseSSL) = True    'SSL暗号化
    Else
        oMsg.Configuration.Fields.Item(cdoSMTPUseSSL) = False    'SSL暗号化しない
    End If
 
    oMsg.Configuration.Fields.Item(cdoLanguageCode) = Worksheets("設定").Cells(23, 1).Value '文字コード
    oMsg.Configuration.Fields.Update

 
    ' メール送信結果を記録するファイル名を指定します。
    szServer = Worksheets("設定").Cells(11, 1) ' SMTPサーバ名
    '
    With Worksheets("宛名及び置換文字")
        If .Cells(1, 3) & .Cells(1, 7) = "" Then
            MsgBox "タイトルとFROMを入力してください"
            GoTo Exit_sub
        Else
            If MsgBox("タイトル:" & .Cells(1, 3) & vbCrLf & "送信元:" & .Cells(1, 7) & vbCrLf & vbCrLf & "上記でよろしいですか?", _
                vbOKCancel, "確認") = vbCancel Then
                GoTo Exit_sub
            End If
        End If
        szSubject = .Cells(1, 3)    ' 件名
        szFrom = .Cells(1, 7)   ' 送信元
     
        If .Cells(1, 10) = "高" Then
            oMsg.Fields("urn:schemas:mailheader:Importance") = "High"
            oMsg.Fields("urn:schemas:mailheader:Priority") = 1
            oMsg.Fields("urn:schemas:mailheader:X-Priority") = 1
            oMsg.Fields("urn:schemas:mailheader:X-MsMail-Priority") = "High"
            oMsg.Fields.Update
        End If
        If Worksheets("設定").Cells(19, 1).Value = "" Then
            oMsg.Configuration.Fields.Item(cdoSendUserName) = Cells(1, 7).Value 'メールアドレス
        Else
            oMsg.Configuration.Fields.Item(cdoSendUserName) = Worksheets("設定").Cells(19, 1).Value   'ログインID
        End If
        oMsg.Configuration.Fields.Update
     
        oMsg.From = szFrom
        oMsg.Subject = szSubject
     
     
        i = 3
        Do While .Cells(i, 1) <> "END"
            If .Cells(i, 1) = "○" Then
                szTo = .Cells(i, 5)    ' 宛先
                szBody = .Cells(i, 6) ' 本文
                If Worksheets("設定").Cells(25, 1).Value = 1 Then '改行コードCRLF
                    szBody = Replace(szBody, vbLf, vbCrLf)
                End If
                szFile = .Cells(i, 11) '添付ファイル
                oMsg.To = szTo
                oMsg.TextBody = szBody
                If szFile <> "" Then
                oMsg.AddAttachment szFile
                End If

                On Error GoTo ErrHandler1
                 oMsg.Send
                  .Cells(i, 1) = "完了"
cont1:
            End If
            i = i + 1
        Loop
    End With
    ' パラメータエラーのときは、戻り値にエラーメッセージが返ります。
    MsgBox "終了しました"
    GoTo Exit_sub

ErrHandler1:
    MsgBox "エラー:" & Err.Number & vbCrLf & Err.Description
    a.WriteLine (Date & " " & Time & " " & Err.Number & "-" & szTo & "-" & Err.Description)
    Worksheets("宛名及び置換文字").Cells(i, 1) = "エラー"
    Resume cont1

Err_Handler:
    MsgBox Err.Description, vbCritical, "Error"
    GoTo Exit_sub

Exit_sub:

   a.Close

End Sub

2014年4月7日月曜日

今更ながら磁気カードについて考える

今はRFID・ICカードが普及して、今更磁気カードなんて使わないでしょ!?
そう思われる。

磁気カードはスキミングにより、サクサク読み取れます。
カードのコピーは多少の技術的知識があれば、お茶の子さいさい、への河童。なわけです。

セキュリティーの面からもICカードを利用するのが望ましい事は誰でも納得出来るところです。

しかし、磁気カードはまだまだ使われている。


理由は、「カードの単価が安い」という事に尽きる。
無料でカードを顧客に配布する様なカードソリューションにとっては、重要な要件になる。

ICカードはMifare Ultra rightはもっとも安いICカードだが、それでも磁気カードの方が安い。

したがって、磁気カードは市場から無くならない。

VB.NETからExcel2007のソート機能を使う

VB.NETからExcel2007のソート機能を使う


ソートキーが文字列の場合、順番を指定してソートしてあげないと、希望通りのソートができないですよね。
VB.NETから簡単にエクセルのソート順を文字列していして実行する方法を見つけたので書いておきます。
VBレスキュー(花ちゃん)のサンプル投稿用掲示板
を参考にしてみたものの、いまひとつピンとこない。

半日悩んだ結果、こんなに簡単なコードで、出来る事がわかりました。
「CustomOrder」を使います。


以下にサンプルコードを書いておきます。
既にエクセルオブジェクトが読み込まれていて、アクティブシートが選択されている状態であることを前提にしています。
「strソート文字列」はソートする文字列群がすでに代入された、StringのArrayListとします。

「CustomOrder」はシート毎に設定すると考えられます。
シートを選択してSort.SortFieldsに設定してあげたらできました。