カテゴリー: 技術系

  • 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

  • HTTP2.0のファーストドラフト公開の話

    もう1ヶ月も前の話だが、HTTPの次世代規格であるHTTP2.0のファーストドラフトが公開された。

    今、特に気にせずに使っているHTTPは1.1だ。これは1999年にRFCが提出された。自分がコンピュータを使い始めたのが2000年、HTMLやウェブについて勉強を始めたのが2001年だ。気にする前に決まっていれば、今のHTTP1.1が当たり前に感じるわけだ。そのHTTPの次世代規格がHTTP2.0だ。

    この10数年でHTTPを使った通信は、人々の暮らしを支えるものとして、無くてならないものになった。ウェブの閲覧はもちろんのこと、スマートフォンのアプリでつかっていたり、ゲームでもなんでも使っている。使い方も変わってきているし、今のHTTP1.1では限界が見えているから今、HTTP2.0の策定を行う必要があるのだろう。ユーザが使っている分には、HTTP1.1かHTTP2.0かは意識する必要はないだろうけど、エンジニアとしてはかなり大きな変化になるだろう。1.1から2.0への移行期の混乱やHTTP2.0を使ったアプリケーション開発、それからサーバの設定などなど。楽しそうな未来が待っていそうだ。

    まぁ、どこまでスムーズに移行されていくのかが心配だけど。時代に乗り遅れないように情報を集めたり、勉強したりしなくては。技術の世界は、ちょっとの油断でついていけなくなる。今でも、時代の最先端に追いつけていないわけで、これ以上、乗り遅れていきたくはないものだ。環境的な要因はあるものの最終的には個人の問題だし。

    また、HTTP2.0は利害関係なども含めて簡単には決まりそうも無い。いろいろな案があるので、まとめていくのは大変だろう。今のところ気になっているのは、HTTP2.0のベースになっているSPDYとHTTP2.0でTLSが必須になるのかというあたり。他はよくわからないので、何ともいえない。(ちゃんと調べろよ、といえばそれまでだけど。)

    ■参考URL

    今更とは思うが、HTTP2.0の話は書こうと思っていて仕事の忙しさを理由に書いていなかった。ブログなので、後から見返したり検索したりするので備忘録として書いておく。

  • Windows Server 2008 R2のライセンス再認証について

    Windows Server 2008 R2では、サーバのハードウェア構成を変更した際に再度ライセンス認証を求められる。ライセンス認証はデバイスドライバに変更があると、もう一度、正規のWindowsライセンスかどうかを認証するというものだ。

    ライセンスの認証を求められる場合は、画面の右下にライセンス認証を求めていくるポップアップが上がってくる。これがいつ上がってくるのかは不明だ。そのため、”サーバー マネージャー”を開いて、”サーバーの概要”のプロダクトIDを見るとよい。ライセンス認証されているかどうかが、ここに表示される。(認証済みの場合には、ID番号とともにライセンス認証済みと表示されている)

    ここで認証されていない旨が表示されている場合、ライセンス認証を行う。ライセンス認証は、”サーバーの概要”画面の右側に表示される。このメニューは、ライセンス認証済みの場合には表示されないので注意。

    ライセンス認証のメニューをクリックすると、ライセンスキーを入力する画面がポップアップで表示される。ライセンスキーの項目は、空のまま、”次へ”をクリックする。するとライセンス認証が実行され正規のライセンスであれば、認証される。

    この画面で、ライセンスキーを求められるのでライセンスキーを探してしまいがちだが、一度ライセンス認証したものであれば、表示はされていないが内部にキーをもっているので”次へ”ボタンを押すことができる。

    今回、ハマったのは仮想サーバのWindows Server 2008 R2を別のホストに移動させたところ、ネットワークアダプタが変更された。そのため、デバイスドライバに変更があり、再度、ライセンス認証を求めれた。当然、手元にライセンスキーはなく、あたふたとしてしまった。

  • VB.NETで消費税の計算をする

    消費税を計算する場合、原則として1円未満の場合は切り捨てを行う。
    (ただし、四捨五入も認められているので、四捨五入をしても間違えではない。)

    VBで消費税計算をする場合は、小数点以下を切り捨てるために Math.Floor() メソッドを使用する。

    ■例)

     Dim TaxRate As Double = 0.05
     Dim UnitPrice As Integer = 103
     Dim Total As Integer
     
     Total = Math.Floor(UnitPrice * TaxRate)
    

    ■結果:切り捨てしない場合には108.15、切り捨てにより108になる。

    計算結果に対して、Math.Floorメソッドを使うことにより、
    切り捨てた数をInteger型にいれることができる。

    ちなみに、小数点以下を切り上げしたい場合には、Math.Ceiling() メソッドを使う。

    他の方法としては、ToString() メソッドで小数点以下をまるめることもできる。
    変数.ToString(“C”) を指定することで、小数点以下を四捨五入することができる。

    ■例)

     Dim TaxRate As Double = 0.05
     Dim UnitPrice As Integer = 103
     Dim TotalTemp As Double
     Dim Total As Integer
     
     TotalTemp = UnitPrice * TaxRate
     Total = TotalTemp.ToString("C")
    

    この方法でも、小数点以下の表示はなくせるが、四捨五入になる。

  • .NET Framework 4.5のCLR

    .NET Framework 4.5では、CLRのバージョンが4.5になっており、独自のCLRとなった。
    .NET Frameworkは、2.0~3.5SPまでがCLR2.0、4.0がCLR4.0となっている。
    .NET Frameworkは実行環境がCLRのバージョンにより左右されるため、
    CLR4.0しか動作しないWindowsでは、.NET Framework4.5のアプリを
    動作させることができない。

    ただし、CLR4.0とCLR4.5は完全互換性があるとのこと。

    どちらにしても、基盤となるCLRのバージョンが違うため、
    開発などを進める際には注意が必要。
    互換性があるといっても、ベースになるバージョンが違うと実行できないはずなので、
    コンパイルのし直しなどは発生するはずだし、実行環境のアップデートが求められる。
    せめて、4系は同じCLRを使ってほしかったところではある。
    2系のように少し長いこと使えるようにしてくれると、
    開発する側はいろいろと楽なんだがね。

  • VBで全角の文字列を半角の文字列に変換する

    strConv関数を使うことで、文字列の種類を変えられる。

    ■例)

     Dim Text As String = "WHAT TIME IS IT NOW?"
     Dim narrowText As String = StrConv(Text, VbStrConv.Narrow)
    

    ・VbStrConv.Narrow で文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換
    ・VbStrConv.Wide で文字列内の文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換

    他にも、VbStrConv.XXXで指定することにより、ひらがなからカタカナ、
    繁体字を簡体字、というように変換用のセットが用意されているため、
    簡単に変換することができる。

    なお、例のように全角文字から半角文字に変換する場合、
    文字列に含まれたカタカナが半角カタカナに変換されてしまうので注意が必要。

    カタカナのケアだけ別途やる必要があるので、万能ではない。
    カタカナが混じる場合は、別途組み合わせて対応が必要。