カテゴリー: 技術系

  • VB.NET Grid Viewで並び替えを行ったとき、急にエラーが発生するようになったときの対処

    Grid Viewで並び替えを行ったときに、急にエラーが発生するようになったときは、
    Grid Viewで一度に表示させる行が1,000を超えていないか確認する。
    標準の設定では、Grid Viewで一度に扱える値は1,000まで。
    1,000を超えたときに並び変え等を行うと、値を扱えずにエラーが発生してしまう。
    なお、ページ設定を行い、一度に表示させる件数を制限(1,000以下)している場合は、
    この問題は発生しない。

    この問題が発生したときは、Web.configで一度に扱える数を変更することで、対応できる。
    ただし、リソースの問題はあるので、一度に扱う数を押さえるほうが望ましいだろう。

    ■出力されたエラーメッセージ

    2013-02-19 10:36:43,881 ERROR :  - Global_asax.Application_Error[38] :
       場所 System.Web.HttpRequest.FillInFormCollection()
       場所 System.Web.HttpRequest.get_Form()
       場所 System.Web.HttpRequest.get_HasForm()
       場所 System.Web.UI.Page.GetCollectionBasedOnMethod(Boolean dontReturnNull)
       場所 System.Web.UI.Page.DeterminePostBackMode()
       場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
    

    ■原因

    ASP.NETのGrid Viewで(実際には、Grid Viewだけではなく、フォームキーなども)扱う行数がデフォルト 1000 になっている。
    そのため、1000 を超えた行数のデータに対して、並び替え等を行うと、値を扱うことができず、エラーが発生する。

    ■対処

    Web.config の appSettings に下記の行を追加し、行(項目)の数を指定する。
    当然、行数(項目数)を増やせば、それだけリソースを消費するので、
    大規模システムや動作の重いシステムの場合には注意が必要。
    行数を増やすのではなく、一度に表示させる件数を絞り込むなどの対応をするほうが堅実的だろう。

     <add key="aspnet:MaxHttpCollectionKeys" value="行(項目)の数" />

    設定例: 行数を2000行にする

       <appSettings>
         <add key="aspnet:MaxHttpCollectionKeys" value="2000" />
       </appSettings>

    なお、この方法で対応できるのは、ASP.NET の2以降。
    1.1系の場合は、別の方法になるので注意すること。

    ■参考URL

    多くのフォーム キー、ファイル、または JSON ペイロード メンバーを含む ASP.NET 要求が例外が発生して失敗する
    http://support.microsoft.com/kb/2661403/ja

  • メモ/ASP.NETから、ExcelファイルをPDFにする方法の調査

    ASP.NETから、Excel2010のPDF化機能を呼び出すことで、
    ExcelファイルのPDF化はできそうである。

    ただし、実行するサーバにExcel2010(Office2010)をインストールする必要あり。
    また、開発環境に該当するライブラリを読み込ませる必要もありそう。

    わかったことは、特定のセルに値を入れたり、
    Excelの内容をそのままPDF化することはできそうだ。
    今のところわからないのは、Excelの特定の場所に画像の挿入ができるかどうかということ。
    透過の話はあるが、できそうな気配はある。

    あと調べなくていけないのは、PDFのセキュリティ設定を行うことができるかどうか。

    ■参考URL

    VB.NET ExcelファイルからPDF出力
    http://tukaenai-pg.cocolog-nifty.com/blog/2012/05/vbnet-excelpdf-.html
    →これが本命。だけど、XLS形式なので、XLSX形式でやりたいところ。

    C#でExcelファイルをPDFに変換する
    http://d.hatena.ne.jp/JHashimoto/20120220/1329736026
    →C#でやる方法。C#でできるなら、VBでも可能なはず。

    ExcelファイルからPDFファイルやXPSファイルを作成する
    http://blog.powershell-from.jp/?p=965
    →これはPowerShell?を使用した方法。

    VB エクセル操作
    http://www.red.oit-net.jp/tatsuya/vb/Excel.htm

  • Windows 8 でAnyConnectを使用する方法

    Windows 8 では、Cisco のAnyConnectクライアントで接続できないというので、いろいろと調べて使えるようにしてみた。AnyConnectで使用するポートの名前に不具合があり、接続が確立できないようだ。Windows 8での接続は下記を参考に試してみてほしい。(稀に接続できないものもあるが、それはどっちかっていうと別の要因のようだ)

    ■検証に使ったもの

    AnyConnectのバージョン「2.5.2019」を使用して検証した。Windows は8のProを使用。

    ■表示されたエラーメッセージ

     AnyConnect was not able to establish a connection to the
     specified secure gateway. Please try connecting again.
    

    ■使用できるようにした手順。

    • AnyConnectのインストーラーを使用し、AnyConnectをWindows 8にインストール。この時、ウェブ画面からのインストールではなく、実行形式のインストールファイルをあらかじめ入手しておき、インストールを行う。
    • Windowsキー + R で「ファイル名を指定して実行」を開く。
    • regedit を入力し、レジストリエディタを開く。
    • [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vpnva] を開く。
    • [DisplayName]を右クリックし、修正を選択。%やらなんやらいろいろと入っているので、下記のように修正する(既に入力されている文字列を後ろから探すとこの文字列があるので、いらないところだけ消すとよい。)
     Cisco AnyConnect VPN Virtual Miniport Adapter for Windows x64
    • 編集したらOKをクリック
    • Windows 8を再起動する(再起動しないと、レジストリの情報をAnyConnectのクライアントが読み取ってくれず、エラーがつづく。)
    • すべてのアプリから、「Cisco AnyConnect VPN Client」を右クリックし、「管理者として実行」する。環境によるものかもしれないが、管理者として実行しないとVPN接続できなかった。なお、Windows8起動後に、AnyConnectを一般ユーザで起動してしまった場合、管理者として実行しなおしても、なぜか失敗する。その場合は、再起動からやり直す。
    • 接続先にASAのアドレスを入れて接続する。これで、接続できるはず。

    ■参考URL

    http://blog.exchangegeek.com/2012/03/windows-8-cisco-anyconnect-vpn-client.html

  • LaCie 2big NASをVMware ESXi にiSCSI接続する

    LaCie 2big NAS(LCN-2BN4TE)をVMware ESXi に接続しようと四苦八苦したときのメモ。

    LaCie 2big NAS は低価格でiSCSI接続もできるNASだ。簡単な設定でNASの領域とiSCSIで使う領域を変更することができ、1つのハードで両方とも使用することができて、結構便利なNASだ。

    LaCieのNASをESXi 5.1.0にiSCSIディスクとして接続させようとしたがどうしてもiSCSI接続し、ディスクとして使用することができなかった。失敗した手順は、以下のようになる。

    1. NASの管理画面から、iSCSIの設定を行う。
    2. ESXiにvSphere Clientで接続し、”構成タブ”の”ハードウェア”から”ストレージ アダプタ”を選択。
    3. デバイスに、iSCSI Software Adapterを追加(作ったときはvmhba32となった)
    4. 追加したアダプタを選択し、プロパティを開く。
    5. プロパティの”動的検出”のタブから、下のほうにある”追加”ボタンをクリックする。
    6. ここでiSCSIターゲットのアドレスを聞かれるので、サーバ名もしくはIPアドレスを入力し、OKをクリックする(ここで指定するのは、LaCieのNASのホスト名もしくはIPアドレスだ)。すると、ストレージアダプタの詳細欄に、追加したNASが表示されるはずだが、表示されない。ここにNASの名前(ESXiが割り振った名前)や識別子が表示されていれば成功。失敗した場合には、表示されていない。”イベントタブ”をクリックし、ログを確認する。すると以下のようなログが出力されていた。
    7. vmhba34 上の iSCSI ターゲット iqn.1995-05.com.lacie:LaCie-2big-NAS.localhost:target1 へのログインに失敗しました。 iSCSI イニシエータはターゲットへのネットワーク接続を確立できませんでした。
    8. CHAPなどのログイン設定を変えたり、そもそも認証をやめてしまっても同じエラーが出力されて接続できなかった。

    いろいろと調べたが、iSCSIターゲットであるLaCieのNASにログインするところで失敗しているということしかわからなかった。NAS側の設定画面で設定できる項目はほとんどなく、CHAP関連のところも設定を変えて試したが結局失敗した。

    NAS側の問題ということもあるので、Windows 7 からiSCSIでNASに接続を行ったが問題なく使用できた。ESXiもバージョン4.0.0のホストがあったので試しに接続を試みたところ、上記の手順で問題なく認識された。4.0.0のホストでは、そのiSCSIディスクをVMFS3でフォーマットし、実際に仮想マシンを作って稼働させてみた。これについても問題はなし。

    結論。

    VMware ESXi 5.1.0 でLaCie 2big NAS (LCN-2BN4TE)は、iSCSI接続できない。理由はログインできないことだが、詳しい原因は不明。相性問題ということありえる。

    なお、VMware ESXi 4.0.0を使用すれば、LaCie 2big NAS (LCN-2BN4TE)は、iSCSI接続し、使用することができる。(4.1.0系と5.0.0系は試していないのでわからない。)

    iSCSI接続できるNASなら、VMwareに接続できると思っていたけれど、実際には接続できないこともあるようだ。安いiSCSIのドライブでがんばろうと考える場合でも、安全のためにVMware Ready (CERTIFIED)の認定がされているiSCSIドライブを使用したほうがいい。

    ちなみに、このNASはiSCSI領域を1つしか作れない。iSCSI領域に2つ以上の機器から接続することもできない。安いNASなので、そこらへんは仕方ないだろう。

  • Windows Server 2008 R2のDNSサーバ機能のルートヒントの更新方法

    DNSルートサーバ(D-Rootサーバ)のIPアドレス変更に伴い、ルートヒントのIPアドレスを変更する必要がある。

    Windows Server 2008 R2のDNSサーバでルートヒントを更新したので、その手順をメモしておく。(Active Directoryでは、DNSサーバも使用するので、AD環境の場合はちゃんと確認しておいたほうがよい。)

    ■更新作業の手順

    DNSマネージャーを開き、ルートヒントを更新したいDNSサーバを選択し、右クリックからプロパティを選ぶ。

    プロパティから、ルートヒントのタブを選択し、更新するネームサーバを選択する。今回は、d.root-servers.net.を選択し、編集をクリックする。

    ネームサーバーのレコード編集画面になるので、右上の方にある解決ボタンをクリックする。

    DNSサーバ側で、名前解決と検証を行い、IPアドレスが変更されるので、OKをクリックする。ここでは、「199.6.91.13」になっていれば、新しいIPアドレスに変更されている。

    以上で、ルートヒントの更新は終了。

  • Androidのスマートフォンから、Googleドライブに写真をアップロードしようとしたら途中でGoogleドライブのアプリが落ちる

    タイトルが長すぎ・・・
    だけど、ほかに表現のしようがない。

    Android 2.3 のスマートフォンで撮影した写真をGoogleドライブに
    アップロードしようとしたところ、
    アップロードの途中でGoogleドライブのアプリが落ちてアップロードが
    終了してしまう現象に遭遇した。

    検証をしたところ、スマートフォンの本体容量の残りが少ないときに、
    このエラーが発生する。
    Google ドライブのアプリは、SDカード側のストレージを使用できない。
    そのため、限られた本体側ストレージ(メモリ)を使わなければならず、
    たくさんのアプリをインストールした状態ではストレージ不足に陥る。
    ストレージ不足の状態で、Googleドライブに対して写真などの大きなファイルを
    スマートフォンからアップロードしようとすると
    アップロードの途中でメモリが足らずにアプリケーションが落ちてしまうようだ。
    なんとも悲しい仕様だ。

    Android スマートフォンの場合、ほとんどが本体のストレージ容量が限られていて
    大きなデータはmicro SDカードに保存する。
    そのような状況なのに、Androidのアプリは本体ストレージにしかインストールできないものが多数ある。
    そうなると簡単にストレージを浪費してしまう。
    Googleドライブのアプリのように、ストレージが少ない状態では動作が安定しないアプリもある。
    本体かアプリか、どちらかを改善してもらいたい。

    ちなみに、Google ドライブにたくさんの写真やドキュメントをアップロードするときに
    アプリが落ちてしまう場合は、1つずつアップロードしていくと成功する。
    (もちろん、本体の空き容量次第なわけだが・・・)

  • ASP.NET(VB) 西暦を和暦に変換する

    正月だからというわけではないのだが、VBで西暦を和暦に変換する方法のメモ。

    JapaneseCalendarを使用することで、西暦を和暦に変換することができる。
    元号は、フォーマットに “gg” を指定することで出力できる。

    サンプルコード

    ■和暦の年だけ(平成XX年のXXの部分)

     '和暦の年だけを取得する(元号は無し)
     Dim culture As Globalization.CultureInfo = New Globalization.CultureInfo("ja-JP")
     culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar
     
     Dim japanYear As String
     japanYear = Today.ToString("yy", culture)
    

    ■元号付の日付(平成XX年12月31日 の形式)

     '和暦を元号つきで取得する
     Dim culture As Globalization.CultureInfo = New Globalization.CultureInfo("ja-JP")
     culture.DateTimeFormat.Calendar = New System.Globalization.JapaneseCalendar
     
     Dim japanDate As String
     japanDate = Today.ToString("ggyy年M月d日", culture)
    

    元号への変換も、.NET Frameworkが提供しているライブラリで
    変換できるのだから便利だ。
    気になるのは、.NET Frameworkのバージョンアップが早いこと。
    もし元号が変わってしまったら、そのとき、古い.NET Frameworkでも
    ちゃんとサポート(更新)されるのだろうか。

    提供されているフレームワークは便利な分、何かとのトレードオフになるので
    割り切るしかないだろう。
    でも、本当に西暦から元号への変換が楽だ。

  • ASP.NET(VB)アップロードされたファイルをDBに保存する方法

    ASP.NETでアップロードされたファイルを、DBに格納する方法のメモ。

    開発をしていて、データの保存場所に困ることがある。
    フォルダにそのまま格納しておくと分散が大変とか、
    ファイルの管理が大変とか、いろいろな悩みがあるだろう。
    その時の選択肢としてよく上がるのが、DBをストレージとして使う方法だ。
    ファイルとしてフォルダに置くのではなく、DBに格納し必要な時にSQLで取り出す。
    データはDBに保存してあるので、DBのバックアップを取っておけばOK。
    DBのパフォーマンスは気になるが、選択肢としてあるだろう。

    そんなとき、ASP.NETでアップロードされたファイルを直接DBに保存する。
    ファイルとしてサーバ上に置かなくていいので、ゴミもできない便利な方法だ。

    ■画面側

    まず、ASPX側にはFileUploadコントロールを配置する。(これのIDはFileUpload1とする)
    これで、ファイルを指定するボタンとファイルが指定されるテキストボックスができる。

    ■VB側の処理

    FileUploadコントロールのPostedFile.InputStreamメソッドでアップロードされたファイルを
    Streamオブジェクト(バイトデータ)として読み込むことができる。
    ただ読むことができる、いってもそのままDBに格納できるわけではないので、
    一度、変数に読み取ったバイトコードを格納し、それをSQLパラメータにいれる。
    わかってしまえば、どうということはない処理だ。

    ■サンプルコード

     Try
         'SQL Connectionの作成(参考:マスタページ側で処理してる)
         Dim dbCon As SqlConnection = New SqlClient.SqlConnection
         dbCon.ConnectionString = ConfigurationManager.ConnectionStrings("DBconnect").ConnectionString
         dbCon.Open()
         
         'Transactionの作成(参考:マスタページ側で処理してる)
         Dim dbTrans As SqlTransaction
         dbTrans = dbCon.BeginTransaction(IsolationLevel.ReadCommitted)
          
          
         'DBには、VarBinary型もしくはimage型のFileDataというカラムがある想定
          Dim sql As String = "INSERT INTO FileStorage (FileData) VALUES (@file)"
          
          Dim command As SqlCommand = New SqlCommand(sql, dbCon, dbTrans)
          
          'Byteデータとしてアップロードされたファイルを読み込む
          Dim binaryData(FileUpload1.PostedFile.InputStream.Length) As Byte
          FileUpload1.PostedFile.InputStream.Read(binaryData, 0, FileUpload1.PostedFile.InputStream.Length)
          command.Parameters.Add("@file", SqlDbType.VarBinary).Value = binaryData
          
         'SQLの実行
         Dim result As String
         result = command.ExecuteNonQuery()
         
         'SQL Connectionを閉じる。
         dbCon.Close()
     Catch ex As Exception
         dbCon.Close()
         
         Response.Write("失敗。。。")
     End Try
    
  • ASP.NET(VB) アップロードされたファイルがPDFファイルかどうか判別する方法

    ASP.NETでアップロードされたファイルの種類を判別する方法のメモ。
    拡張子で判別するなら、バリデーションコントロールを使ったほうが楽だが、
    ここではmimeタイプを使って判別する方法を書く。

    ■ASPX側

    まず、ASPX側にはFileUploadコントロールを配置する。(これのIDはFileUpload1とする)
    これで、ファイルを指定するボタンとファイルが指定されるテキストボックスができる。

    ■VB側の処理

    FileUploadコントロールのHasFileメソッドを使い、ファイルが指定されているかを判別する。
    次に、PostedFile.ContentTypeメソッドを使い、アップロードされたファイルのmimeタイプを取得し、
    mimeタイプが”application/pdf”であるかを判別する。
    (PDFファイルがアップロードされた場合、mimeタイプはapplication/pdfになる)

    ■サンプルコード

     'ファイルが指定されているかどうかの判別
     If FileUpload1.HasFile Then
         'PDFファイルが指定されているかどうかmimeタイプから判別する
         If FileUpload1.PostedFile.ContentType = "application/pdf" Then
             'PDFファイルだった場合は、ここの処理を実行する
     
     
         End If
     End If
    
  • 中国のグレートファイアウォールが強化されVPN遮断かも?

    クリスマス・イブに届いたうれしくないニュースだ。中国のネットワークとインターネットの間にあるファイアウォール、それがグレートファイアウォール。(なんか変な表現だな・・・、他になんというべきだろうか。)これを使って、中国政府は都合の悪いウェブサイトへの通信を遮断する。最近だと、SNSやSkypeなどが規制されている(されたいた?)。数回、中国にいったことがあるが、このグレートな壁の所為で通信は安定しなかった。この迷惑な検閲システムが、さらに強化されるようだ。

    グレートファイアウォールが強化されて、今度はVPNについても 制限が行われるようだ。中身を傍受されることがあるのかないのかはわからない。ニュース記事によると、VPN接続の速度低下や切断があるとのこと。これが本当なら、中国の拠点と拠点間VPNを使用している企業は困ることになる。VPN上で、IP電話で通話していたものが使い物にならなくなったり、社外秘のデータのやり取りが困難になってくる。前々から、カントリーリスクの大きい国とは思っていたが、ここにきて更に危ない国になっている。中国での人件費もあがりつつし、この先、わざわざ中国でビジネスしなくてもいいだろう。

    ところで、Arcstar IP-VPNとかのサービスでも影響を受けているのだろうか。国内キャリアが提供しているサービスへの影響がとっても気になる。

    http://www.afpbb.com/article/environment-science-it/it/2917958/10022074