スタッフの日記

Azure SQLSEREVR <-> Windows10 ACCESS.accdb VPN接続で動作確認

2019年6月2日(staff)

はじめに
  Windows2008R2サーバー、Windows7の2020年1月サポート終了に伴い、自社サーバーのOSアップグレードを検討していたのですが、せっかくなので、Microsoft Azureへの移行を検討してみました。要件としては、現行のC/SシステムにおけるSQLSERVERとAccessクライアントの処理が、 Cloud上のSQLSEREVER – VPN接続 – Accessクライアントで実現できる事、です。 これが出来れば、インターネット経由で自宅パソコンやモバイル端末から接続して仕事ができるので便利です。

Azure移行イメージ

Azure移行イメージ

  目次
1.無料アカウントを作り、仮想サーバー(Windows2016+SQLSERVER)を構築
2.仮想サーバーでVPN接続設定
3.仮想サーバー内SQLSERVERの外部接続設定
4.クライアントのSSMSで仮想サーバーSQLSERVERの接続確認
5.Access.accdb用のODBC設定

 

 1.無料アカウントを作り、仮想サーバー(Windows2016+SQLSERVER)を構築
   自分のようなお試しユーザ向けのAzure無料アカウントを作り、Azureポータルにログイン。
ポータル画面は、直観的に何となくクリックして進めていく事ができます。
よくわからない設定があっても、その都度リンクされたヘルプサイトを見て確認する事ができました。 自分は、仮想サーバーの構築をMicrosoftのDocサイトを参考にしました。
 
  クイックスタート:Azure ポータルでWindows仮想マシンを作成する(Microsoft.comに移動)
  https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/quick-create-portal
 
  作成後、RDP接続で仮想サーバーに接続。まず、作成直後の仮想サーバーは英語なので、サーバーの日本語化設定をして、 その後、仮想サーバーのブラウザを使ってSQLSERVER2016及び管理ソフト(SSMS)をインストールしました。

仮想サーバ構築後

仮想サーバ構築後

 2.仮想サーバーでVPN接続設定
  仮想サーバーと自宅のパソコンを接続する形態をAzureでは「ポイント対サイトVPN接続」と呼ぶらしい。 設定は、
 
  ネイティブAzure 証明書認証を使用したVNetへのポイント対サイト接続の構成:Azureポータル(Microsoft.comに移動)

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal
 を参考にしました。

【ネットワークトラフィック許可の設定】
  受信ポートの追加設定は特になし。仮想ネットワークに接続している事が前提になるので、この設定で問題なし。

ネットワークトラフィック許可の設定

ネットワークトラフィック許可の設定

パソコンで上記のサイトの説明に従ってVPN構成設定を行い、接続確認。

VPN接続画像

VPN接続画像

 3.仮想サーバー内SQLSERVERの外部接続設定
  仮想サーバーのFireWallで、1433のポートを受信許可。セキュリティが心配なら、ローカルIPアドレス、リモートIPアドレス、 プロファイル指定も行います。
 
  [START]-[セキュリティが強化されたWindowsファイヤーウォール]-[受信の規則]-[新しい規則]

受信の規則の設定1

受信の規則の設定1

受信の規則の設定2

受信の規則の設定2

受信の規則の設定3

受信の規則の設定3

  Sql Server Configuration Manager(構成管理)で、以下の設定を行います。
  [SQL Serverネットワークの構成]-[SQLEXPRESSのプロトコル]-[TCP/IP]-[プロパティ]
  IPALLの設定で、TCPポートに1433を設定します。


Sql Server Configuration Manager(構成管理)

Sql Server Configuration Manager(構成管理)

 4.クライアントのSSMSで仮想サーバーSQLSERVERの接続確認
  ここで接続確認できれば、ODBC接続も問題なしです。

SSMSで接続確認

SSMSで接続確認

 4.Access.accdb用のODBC設定
  最後にACCESSからSQLSERVERのテーブルをリンク接続する為に必要なODBC接続の設定を行います。
 
  ファイルDSNの設定例
  [ODBC]
DRIVER=SQL Server Native Client 11.0
UID=SQLSERVERログインユーザID
WSID=DESKTOP-XXXXXXX
APP=Microsoft Office 2013
SERVER=192.168.1.4,1433

 

おわりに
  とりあえず、VPN接続して動作確認はできました。サーバ―レスポンスも思ったより早いです。
  処理にもよるのでしょうが、今後は5G通信も始まるのでレスポンスについては問題にならないと思いました。セキュリティ面は、レンタルサーバーを借りて設定するよりも、はるかに堅牢なシステム構築が簡単に出来そうです。
 
  さて、気になる利用料金ですが、Azure 料金計算ツール
https://azure.microsoft.com/ja-jp/pricing/calculator/
でシミュレーションができます。試しに計算してみると・・・・・・・

うーん、小規模システムで運用するにはちょっと掛かりすぎの利用料金でした・・・・・。費用対効果として「効果」の部分を積極的に考えていかないと割に合いません。結局自社サーバー(オンプレミス)に落ち着きそうです。

一覧表示 ▶︎ Webノウハウ

MS-Wordで「図形」で絵を描いてWebページにしたら絵が見えない!

2019年1月9日(平石)

 私は、技術研究と趣味と脳の老化防止のために、Webサイトを作ってます。

 そのサイトに、MS-Wordで作ったWebページを公開したら、一生懸命描いた絵が、まるっきり見えなくなるし、後ろの方は何行も空白が続くしで、かなり焦ってしまいました。とりあえず、絵は見えるようになったし、後ろの空白も無くせたので、後のために記録を残しておこうと思います。

1.何をやったのか。

 1-1.MS-Wordで、「図形」を使って絵を描きました。

 1-2.これを「ファイル」の「名前を付けて保存」で、「Webページ」として保存。

 1-3.保存した結果をMicrosoft Edgeで読んでみる。なんと!。絵が無くて、前後の文は表示されて、後ろはずっと空白。

 

2.どこがいけなかったか、試行錯誤。全部書くと大変なことになるので、うまく行ったことだけ書くことにする。

 2-1.「名前を付けて保存」で「ツール(L) ▼」に気づく。「▼」をクリックしてみる。

 2-2.「Webオプション(W)」とあるので、クリックしてみると、Webオプション設定ウィンドウが。下から2行目の「VMLを使ってグラフィックスをブラウザーに表示する」が怪しい。

 2-3.「VML云々」のチェックを外して保存してみる。

 2-4.Microsoft Edgeで読んでみると、めでたしめでたし。

 なお、この絵は、テストおよびこのブログへの投稿用に作ったものです。私のサイトの問題のページは下記です。

囲碁を開集合による位相数学で説明してみる

一覧表示 ▶︎ Webノウハウ

Acrobat Readerの注釈機能を使って、文書のレビューを上手にする

2018年8月12日(平石)

最近は、メールでの文書のやり取りが多くなり、指摘事項もメールにいちいち引用先を記して書くことは面倒になってきました。そんな時、Acrobat Readerの注釈機能とFDFというファイルがあることを知ったので、紹介したいと思います。

たとえば、下図のように使います。

一点鎖線の左と右では別の人だと思ってください。

まず、Aさんが文書(PDFファイル)を作成します。

それを受取ったBさんは、文書に「注釈」(私の脳内では「いちゃもん」と変換されます)を付けたくなったとします。

ここでまず、Acrobat Readerの注釈機能が登場します。PDFファイルのどの部分の注釈かも、すぐわかるようになっています。

次に出てくるのが、FDFファイルです。Acrobat Readerの操作で、注釈情報のみを出力することができます。

Bさんは、FDFファイルをAさんに送ります。

Aさんは、送られたFDFファイルと、元のPDFファイルとを読込んで、どんな注釈がつけられたかを見ることができます。

図には書きませんでしたが、Aさんは、注釈に対する返信を付けてFDFファイルにしてBさんに送り返すこともできますし、さらに別の人に送って…ということもできます。そして、こうしたやり取りが、ぐちゃぐちゃにならず、FDFファイルとして形に残し、管理できるということも重要です。

Acrobat Readerの、具体的な操作については、下記などを参照してください。これは、少し古いAcrobat Reader Xについてなので、その後のバージョンとは少し違いますが、参考にはなるでしょう。

https://helpx.adobe.com/jp/acrobat/kb/4561.html

一覧表示 ▶︎ スタッフの日記

ACCESS VBA ダブルクリックによってクリックイベントの処理が2回実行されてしまう件

2018年7月12日(staff)

はじめに 

  ある入力画面フォームで登録ボタンを用意、クリックイベントの処理(イベントプロシージャ)でデータベースに登録する処理を割り当てました。運用になってからしばらくは順調に動作していましたが、複数の担当者の内、ある人が操作した時に、データが2重登録されるケースが出現。
 
 
原因について

 どうやら、その担当者は登録ボタンをダブルクリックしていて、クリックイベント処理が2回走ってしまったことが原因らしい。
改めてACCESSのヘルプを見直すと、
 
 Form.DblClick イベント (Access)
 https://msdn.microsoft.com/ja-jp/vba/access-vba/articles/form-dblclick-event-access
 
 ■マウス イベントを受け取るオブジェクトに対しては、次の順序でイベントが発生。

   MouseDown ⇒ MouseUp ⇒ Click ⇒ DblClick ⇒ MouseUp 

 ■コマンド ボタンをダブルクリックすると、次の順序でイベントが発生。

   MouseDown ⇒ MouseUp ⇒ Click ⇒ DblClick ⇒ MouseUp ⇒ Click
 
 との事。
 
 今回のケースは、コマンドボタンをDblClickした場合なので、Clickイベントが2回発生した。
 そもそも、DblClickの時にClickイベントが発生する事など、全く考えていなかったので、この仕様には驚いています。ただ、今回の事を知って改めて考えると、パソコンの設定によってDblClickとClickの判断は難しい場合があるのだと思えば、なんとなく納得しています。
 

対応方法

2回目のClickイベントを無効にする次の方法で対応します。 
DblClickイベントプロシージャの引数に「Cancel」があるので、この引数にtrueを設定して終了すれば、以降のClickイベントは発生しません。
 
 例)
 
 Private sub XXXボタン_DblClick(Cancel As Integer)
   Cancel = true
 End sub
 
おわりに

 入力画面を設計する際、GUIの観点からなるべく入力を簡単にできるよう考えます。
例えば、テキストボックスをダブルクリックするとデフォルトの値が設定されるようにするとか。
結果として、クリック操作とダブルクリック操作が混在する画面の操作性の良し悪しは、
判断が分かれるところですが、今回のようなケースでうっかり操作による誤動作の対応はしておきましょう。

 なお、Accessのヘルプには、
 ”一般的には、コマンドボタンをダブルクリックしない事をお勧めします”
 とありました。

 

一覧表示 ▶︎ スタッフの日記

MS-AccessからODBC経由でFirebirdのテーブルにアクセスは大変

2017年9月3日(平石)

 あるユーザーのシステムで、Ccu労組会計のデータをMS-Accessからアクセスして処理することになりました。それで、ODBC経由で接続することにしたのですが、…私の覚えを兼ねて、ここに書いておきます。

 

1.ODBCって、マルチバイト文字は正しく処理できない!

1.1 DBファイル、クライアントdllへのパスにマルチバイト文字があると接続できない

  

  まず、上図のようにしたら、接続時にエラーとなってしまいました。各パスを確認したところ、後ろの方が切れてしまっている。どうも「会計」とあるのがいけないらしい。「会計」は4バイトだけど2文字なので2バイトと判断して、差額の2バイトはカットしてしまうものと思われる。

  これは、英数字と空白だけのフォルダを作って、そこにコピーして事無きを得ました。

 

1.2 テーブルの中身もマルチバイト文字があると…

  これは、私(平石)ではなく、一緒に仕事をしている組合員が見つけた現象です。

  下図は、RKA23というテーブルの内容を、フリーソフトを使って見たものです。

  

 ところが、同じものをMS-Accessで見ると、データ内容に余計な文字が付加されている。

  (吹き出しは記述者=平石が付けたもの)

  どうも、Shift-JISでのバイト数が項目長と一致するときに、この現象が起きるらしい(このときは、項目長を超えるデータができてしまうかのように見えますが、MS-Accessで見るときの項目長はバイト数ではなくて文字数なので、これらのケースでは、項目長を超えていません)。

  データのShift-JISでのバイト数を求める関数を作り、そのバイト数が項目長を超えている分はカットするようにして、対処できました。

 

2.DAO.TableDef.Connectを書き換えるとReadOnlyになってしまう

  実は、上記1.1に書いた、「DBファイル、クライアントdllへのパス」については、DAO.TableDef.Connectに、その情報があるので、これを書き換えて対処できるのではないかとやってみたのです。

  読むだけなら、うまく行きました。パスに「会計」などのマルチバイト文字があってもちゃんと読めます(ODBCの設定ではマルチバイト文字の無いパスを指定して、あとから書き換えます)。

  ところが、内容を更新しようとすると、ReadOnlyである旨のメッセージが出てダメでした。

一覧表示 ▶︎ スタッフの日記

画像の「赤」と「青」を入れ替えるプログラムを作ってみた

2017年6月10日(平石)

 実は私、赤信号を見ると、青信号であると確信して道路を渡ってしまう人です。
 先だって、たまたま「色彩心理学入門」なる本を読んで、その原因と思われるものが分かりました。
 私の理解では、「正常者」つまり色覚についての多数派の方は、実は「青緑色弱」と呼ぶべきであって、赤と緑の区別はつくらしいが、青と緑の区別はほとんどつかないらしい。
 そこで、もしかしたら、「赤」と「青」を入れ替えたら、彼ら青緑色弱者の気持ちが少しはわかるのではないかと思い、そんなプログラムを作ってみました。

 

 上の画像は、近所のお宅の何とか赤く見える花を撮ったものと、それの「赤」と「青」を入れ替えたものを並べました(クリックしてみてください)。
 左は撮ったままの画像ですが、「いったいどこに花なんかあるんだっ」という感じで、まったく花の存在はわかりません。
 右を見ると、花の存在ははっきりわかります。実は、この右の画像を見るまで、こんなにたくさん花が咲いていることに、まったく気づきませんでした。やはり「正常者」の方が正常なようです。

 そんな訳で、良いプログラムを作ったと自負しております。

一覧表示 ▶︎ スタッフの日記

ACCESSのフォームでSQLServerのテーブルを更新したら『データの競合』エラーが発生

2017年2月19日(staff)

1.事象
 ACCESSの単票フォームのレコードソースとしてSQLServerのテーブルを指定している。「Microsoft SQL Server Manager」を使い、このテーブルに次のような列を追加して、フォームで更新操作をしたらエラーが発生。

追加した列: A項目  bit型  null可

エラーメッセージ:データの競合

“このレコードは他のユーザーによって変更されています。[レコードの保存]を選択すると、他のユーザーによる変更を無視し、自分が行った変更を反映します。[クリップボードにコピー]を選択すると、変更したデータはクリップボードコピーされ、他のユーザによる変更が反映されます。必要に応じて、クリップボードのデータを張り付け、自分が変更したデータに戻すこともできます。”

なお、このエラーが出た時、もちろん操作をしているのは、自分だけです。

2.対処と原因

[対処]

 A項目 bit型 null可   →   A項目 bit型 null不可 (必須項目、初期値:0)

 nullを許容しない、必須項目とする事でエラーを回避しました。

[原因]
 はっきりした原因は不明。ネットで検索した対処方法によると、どうやら、ACCESSでリンクする場合、bit型のようなBOOL属性の項目は、必須項目にしないとダメなようです。裏でどんな動きをして、今回のようなエラーが発生してしまうのか。

 以下、思った事。

 bit型は、ACCESSのデータ型ではYes/No型になります。ACCESSのフォームにおいて、チェックボックスの値を格納する時のデータ型として、よく利用します。なので、データはYESかNOかの2択で、nullはありません。今回、該当のテーブルは、元々、ACCESSのmdbのテーブルで、ACCESSのアップサイジング機能を利用してSQLServerのテーブルに変換したテーブルです。追加した列のプロパティは、そのテーブルにおいて既存のbit型列にならって設定しました。既存のbit型列は"null可"になっていました。同じように設定して、結果、エラーが起きました。改めて既存のbit型列のプロパティを見直したところ、拡張プロパティが設定されていたので、全て同じように設定しました。

例えば、次の拡張プロパティ

AllowZeroLength : False
AppendOnly: False
Attributes:1
CollatingOrder:1041
DataUpdatable:False
MS_Format:Yes/No
etc..(拡張プロパティは18項目あり)

 これらを設定しても、状況は変わりませんでした。さて、なんだろう。

 アップサイジング機能で変換されたbit型の列は、nullを許容する設定でしたが、既存レコードには値が全て設定されていました。後で、「Microsoft SQL Server Manager」で追加したbit型の列は、既存レコードにnull値が設定された状態になり、システム側で強制的に値を設定しようとして、結果的にその動作が競合となりエラーになってしまったのでしょうか。
(根拠なし、想像です)

以上

一覧表示 ▶︎ スタッフの日記

BlenderでモデリングしたワイヤーフレームをFlashで描画再生してみる。

2016年9月2日(staff)

はじめに

  今回の思いつきは、『Webサイトのコンテンツで、多面体のワイヤーフレーム画像を動かしたい。』です。幾つか実現方法はあると思うのですが、Blenderでモデリングを行い、そこで作られた頂点座標情報を取り込んでflashで再生する、という方法を選びました。
 
1.Blenderでモデリング
   Blenderは、オープンソースの3次元CG開発ソフトウエア(統合開発環境)ですね。だいぶ前に同様のCGソフトのMetasequoiaで何かやろうとチャレンジした事があったのですが、挫折しました。そこでBlenderです。使い方は、次のサイトを参考にさせて頂きました。
「Blender入門」(http://www.blender3d.biz/)大変感謝しています。

 以下、何とかリンゴをモデリング。

blender
 

 

 

 


2.頂点座標情報の取り込み
  モデリングしたリンゴの頂点座標情報の取り込みは、BlenderのExport機能で情報をファイル出力して、そのファイルから読み込む事にしました。幾つかあるファイルフォーマットの中から、Wavefront(.obj)フォーマットを選択。 このフォーマットで出力された3Dモデルデータが一番扱い易いと判断しました。 Wavefrontフォーマットの説明は、次のサイトを参考にさせて頂きました。
「OBJファイルフォーマット」(http://www.hiramine.com/programming/3dmodelfileformat/objfileformat.html)
大変感謝しています。
 OBJファイルフォーマットは、頂点座標値(x,y,z)データ、多面体の面(メッシュ)を構成する頂点座標を指すインデックス情報や、モデリングした時の法線ベクトルの情報等が含まれています。今回は、頂点座標値(x,y,z)データ、多面体の面(メッシュ)を構成する頂点座標を指すインデックス情報を利用します。
  
3.flashで再生する
  objファイルを読み込んで描画するプログラムをAS3.0でコーディング。AS3.0を選んだのは、ブラウザ上で画像を操作できるインターフェース(各種イベントを拾える)が用意されている点がいいと思ったから。 AS3.0のコーディングは、次の本を参考にさせて頂きました。
「C++による簡単実習 3次元CG入門」(http://www.morikita.co.jp/books/book/2149)
言語はC++ですが、AS3.0でプログラミングする際に大変役に立ちました。
 [ワイヤーフレーム]

 wire

 
 

 

 

 

 

 

 

 

[面を塗りつぶし  ]

apple apple2

 

 

 

 

 

 

 

 

 

今回はここまでです。

 

一覧表示 ▶︎ Webノウハウ

タスクイメージは破損しているか、または変更されています。(HRESULTからの例外:0x80041321)

2016年7月9日(staff)

1.事象
 Windows7のパソコンにおいて、タスクスケジューラで毎日実行していたバックアップ処理が出来ていない事が発覚。とりあえず、実行記録を確認しようとタスクスケジューラを起動したらタイトルのエラーが発生。エラーメッセージの応答で[OK]をするが、引き続き同じメッセージが表示される。
この操作は数十回繰り返した。おそらく、設定されていた多くのタスクに対してメッセージが表示されたと考えられる。バックアップ処理が出来ていなかったのは、このタスク設定が壊れてたためと断定。

2.原因調査と対処
 とりあえず、タスクスケジューラの設定を元通りにする対処方法をネットで検索。同様の事象は過去にも結構出ているらしい。以下のサイトを参考に対処してみる。

  タスクスケジューラを開くとエラーメッセージが表示される「タスクスケジューラサービスが利用できません」
  http://answers.microsoft.com/ja-jp/windows/forum/windows_7-performance/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1/fde068e5-d1d5-4821-9888-b2270a428e6f?auth=1


 [対処: ”タスクのインポート”操作でタスクの再設定]
 C:\Windows\System32\Tasksフォルダ配下の全ファイルを任意の場所に移動してタスクスケジューラを起動。エラーは出なくなった。ここから、全部のタスクをインポートで再設定することにした。TasksフォルダにはWindowsやパソコンベンダー等のフォルダ配下に100を超える設定ファイルがある。気が滅入りながらちびちびやっていると、設定ファイルのタイムスタンプで気づきが・・。どうやらバックアップ処理が失敗した日の直近で更新されている設定ファイルが破損しているらしい。まず、設定ファイルのタイムスタンプをみてインポートしないで元に戻せるか判断。これでだいぶ楽になった。

 [タスクイメージが破損した原因(多分): Windows10->Windows7のダウングレード]

 しかし、以下のエラーが発生してインポート操作で復旧が出来ないタスクが出てきた。


 “タスクの形式が有効ではありません。(2,8):version:1.5”
 

 ネットを検索。以下が参考になりました。

  タスクスケジューラーで「タスクの形式が有効ではありません」と表示され作成できない
  http://answers.microsoft.com/ja-jp/windows/forum/windows_7-update/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1/b20e1938-22ee-4fce-8f71-db4fa66dcf50?auth=1

 確かに、破損している設定ファイルのタイムスタンプは、Windows10からWindows7に戻したタイミングと一致している!
 おそらく、元に戻す課程で破損してしまったのではなかろうか。但し、 原因が分かったところで、戻せないタスクがあるってことは問題だな。そのタスクが何をやっていたのかも分からないし。
 
  Microsoftめー、またやってくれたなー。

 おそらくWindows10にしてから元のOSに戻したパソコンは、こうなっている可能性が大。 一度、タスクスケジューラを起動して確認してみることをお勧めします。

 

一覧表示 ▶︎ スタッフの日記

jQueryのAjaxリクエスト(POST)で日本語の送信データが文字化け

2016年1月10日(staff)

ブラウザ側入力フォームで指定した日本語文字列をAjaxリクエスト(POST)でサーバに渡した際、サーバ側で参照したら文字化けを起こしていてハマりました。

jQuey日本語リファレンスをみると、サーバに送信するデータはクエリー文字列に変換されてGETリクエストとして付加されるとあったので、URLエンコードは自動的にやってくれると思いましたが、POSTの場合はこちらで変換した値を指定してあげないとダメなようです。
以下、サンプル。日本語が入力されている「cSearchKeyWord」をencodeURIで変換してdata:{・・・・}に指定してます。

 var cSearchKeyWord = encodeURI(document.form001.cSearchKeyWord.value.trim());
 $.ajax({
  type:"POST",
  url:"送信URL",
  dataType:"html",
  data:{
   "cSearchKeyWord":cSearchKeyWord,
   "cHashTags":cHashTags,
   "cFromID":cFromID,
   "cToID":cToID,
   "nRetweetFlag":nRetweetFlag,
   "cGetCount":cGetCount
  }
 }).then(
  // 通信成功
  function(data,status,xhr){
  ・・・・
  },
  // 通信失敗
  function(xhr,status,error){
  ・・・・
  }
 );
 
この結果にたどり着くまで、えらい時間が掛ってしまいました。phpのmb_stringとかhtmlの文字コード設定やら、php.iniの文字コードに関わる設定とかを改めて見直しました。結局、中途半端な知識で仕事をしてきているからハマると一から調べなおす事になってしまう。ネットで検索できて便利なのだけど、頭にちゃんと入らないんですよね。いかんなぁ・・・・。

一覧表示 ▶︎ スタッフの日記