Classic ASPのADODBのParameterを使用してnvarchar型のデータを保存する際に使用するTypeは adLongVarWChar

別にClassic ASPに限らないんですが、vbsでもVBAでも、ADODB.CommandをParameter付きで使用し、SQL Serverのnvarchar型に文字化けさせずにデータを保存するためには、ParameterのTypeを adLongVarWChar = 203 にすると文字化けせずにデータが格納できます

ずっとTypeをadVarChar = 200にしたまま、たまにしか発生しない文字化けを個人的に15年くらい放置していた問題なんですが、今日突っ込んで調査したら判明しました
(日本語はほぼ問題なく、中国語等の文字で化けていたため、優先度が低かった)

What is the ADO DataType for nVarchAR(max)
https://social.msdn.microsoft.com/Forums/ja-JP/ac06f814-1814-4861-b2cd-8d5e507a7ee3/what-is-the-ado-datatype-for-nvarcharmax?forum=sqldataaccess

SQL Serverのリンクテーブルを使用してOracleに接続し、取得したデータが文字化けする

前提

Oracle Instant Client を Oracle Installer を使用してインストール、サーバ再起動後、サーバ名:ポート番号/サービス名の接続文字列を使ってリンクサーバを設定し、以下のSQLを使ってデータを取得したところ、日本語部分が文字化けしたので、その解消法を書き残しておく

select * from OPENQUERY ([作成したリンクサーバ], 'SELECT * FROM [スキーマ名].[テーブルまたはビュー]')

解決方法

SQL Serverをインストールしたサーバの環境変数に「NLS_LANG=JAPANESE_JAPAN.JA16SJIS」を設定しサーバを再起動

以上

Centos7 上の Squid をActive Directory と連携させ、ADのグループに登録されたユーザはデータセンタのProxyを経由してInternetへアクセス可能としつつ、Office365への通信はそもそも認証なしでクラウド上のManaged Proxy経由で接続させる

個別要件ごとに記事を分けて書こうかとも思ったんですが、面倒になったのでぜんぶひとまとめに書きます
わかりにくい場合はごめんなさい

今回作成するProxyサーバに求められる要件

  • Office365への通信は認証不要でクラウド上のManaged Proxy経由で接続
  • ADのグループに登録されたユーザはデータセンタに配置されたProxyを経由してInternetのすべてのサーバへのアクセスを可能とする

技術的なトライは2つ

  • 宛先ドメインに応じて上位プロキシを選択する
  • ADと連携し、指定したグループに属するユーザのみ利用可能とする

つまり、Squidによる宛先に応じた上位プロキシの振り分けと、AD連携、それもグループによる振り分け(?)を同時に満たすってことですね

yumで普通にインストールするだけなので、Squidの基本的なインストール方法は記載しません

宛先ドメインに応じて上位プロキシを選択する

このために必要なのは、Office365が使用するドメインのリストを作成しaclとして設定、cache_peer_access を使って宛先がリストに含まれる場合は指定した上位プロキシ(今回はクラウド上のManaged Proxy)経由での接続を許可する

# vi /etc/squid/squid.conf

#http_access allow localnet

acl whitelist dstdomain "/etc/squid/whitelist"

cache_peer [Managed ProxyのFQDN] parent [Managed Proxyのport] 0 no-query
cache_peer [DCのProxyのFQDN] parent [DCのProxyのport] 0 no-query #default proxy

cache_peer_access [Managed ProxyのFQDN] allow whitelist

never_direct allow all

以下ちょっとした解説

#http_access allow localnet

デフォルトで許可されているlocalnetからの通信はとりあえず不許可としておく
sqid.conf の書き方というか解釈のされ方としては、1行の中で書かれているものは and の条件で解釈し、各行はそれぞれ or で評価される
そのため、localnetからのアクセスを許可されてしまうと、その他でどれだけ制限をかけてもこの行のためにすべてが許可されてしまう
というわけでこの行はコメントにしておく

acl whitelist dstdomain "/etc/squid/whitelist"

まずはOffice365が使用するドメインのリストを作る
リストの中は
1行1ドメインとし、以下のページに記載されているドメインはすべてリストに入れたつもり

docs.microsoft.com

cache_peer [Managed ProxyのFQDN] parent [Managed Proxyのport] 0 no-query
cache_peer [DCのProxyのFQDN] parent [DCのProxyのport] 0 no-query #default proxy

上位プロキシをcache_peerとしてリスト化しておく
この際、Office365へのアクセスで使用する方を上に、その他すべての宛先へのアクセスに使用する方を下に書くと、下の方がデフォルトとされるとのこと

cache_peer_access [Managed ProxyのFQDN] allow whitelist

この書き方でOffice365でへのアクセスには認証を要求しないこととクラウド上のManaged Proxyを経由する設定を同時に行っている

ADと連携し、指定したグループに属するユーザのみ利用可能とする

Centos7のSquidをADと連携させるには、Squidのサーバをドメインにjoinさせる必要はないが、realmdのほか、 sssd、adcli、samba-common-toolsを追加でインストールした
正直全てが必要かどうかは不明だが、4つすべてがインストールされていない環境ではADへの接続ができなかった

# yum install realmd sssd adcli samba-common-tools

# vi /etc/squid/squid.conf

# Active Directory Auth
auth_param basic program /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f "(&(sAMAccountName=%s)(objectClass=Person))" -h [認証に使用するドメインコントローラのFQDN]
auth_param basic children 5

external_acl_type ldap_group ttl=30 %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=[ドメイン],DC=local))' -h [ドメインコントローラのFQDN] -S

acl proxy_allow_group external ldap_group [ドメインに作成したグループ名]

http_access allow localnet proxy_allow_group


# And finally deny all other access to this proxy
http_access deny all

同じく以下解説

auth_param basic program /usr/lib64/squid/basic_ldap_auth -v3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f "(&(sAMAccountName=%s)(objectClass=Person))" -h [認証に使用するドメインコントローラのFQDN]

この行では basic_ldap_auth というSquidが提供している外部コマンドを使ってユーザが入力するIDとパスワードの組み合わせを検証する方法を設定しますが、引数として以下を設定しています

  • v3:LDAPプロトコルのバージョン 3を使用する
  • R:Do not follow referrals ドメインコントローラが他のLDAPサーバに問い合わせをリダイレクトすることを許可しません
  • b:basedn 対象ドメインそのものの識別名
  • D:binddn ドメインコントローラへ接続する際に使用するユーザの識別名
  • W:secretfile 上記ユーザのパスワードを記載したファイルへのパス
  • f:LDAP search filter LDAPの検索に使用するフィルタ
  • h:認証に使用するドメインコントローラ

肝心のフィルタの意味としては

-f "(&(sAMAccountName=%s)(objectClass=Person))"

sAMAccountName が入力されたIDで、かつobjectClassがPersonのものに限定している

external_acl_type ldap_group ttl=30 %LOGIN /usr/lib64/squid/ext_ldap_group_acl -v 3 -R -b "DC=[ドメイン],DC=local" -D "CN=[squid専用に作成した、権限を最小限に抑えたユーザ],CN=Users,DC=[ドメイン],DC=local" -W /etc/squid/secret -f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=[ドメイン],DC=local))' -h [ドメインコントローラのFQDN] -S

この行では ext_ldap_group_acl という同じくSquidが提供している外部コマンドを使って、上記ユーザが対象グループに含まれているかどうかを確認している
引数の大半は basic_ldap_auth と共通

  • S:引数として渡されたIDからドメイン名を削る

フィルタの意味としては

  • f '(&(objectclass=person)(sAMAccountName=%u)(memberof=CN=%g,OU=Users,DC=[ドメイン],DC=local))'

objectclass が Person で、sAMAccountName が入力されたユーザで、かつ対象のグループのメンバーであるように絞り込んでいる

acl proxy_allow_group external ldap_group [ドメインに作成したグループ名]

proxy_allow_groupというaclを設定し、対象のグループを指定している

http_access allow localnet proxy_allow_group

上の方で許可することをやめたlocalnetとandでAD認証かつ対象グループに含まれることを要求している

http_access deny all

一番下でこれを入れておくことで、この上で許可されたもの以外はすべて不許可としている


以下はとても参考になった
ありがとうございました

ITに関すること: [CentOS7] SquidでADと連携する方法
http://itsp0.blogspot.com/2017/09/centos7-squidad.html

香港 OctopusカードにHSBCクレジットカードの機能を使って自動的にチャージする

近況

2018年10月より香港に駐在しています。
香港で生活する上でOctopusは非常に便利ですが、便利だからこそチャージの手間が気になりました。
HSBCのクレジットカードにはOctopusへ自動でチャージするAutomation Add Value Service (AAVS)があるので、これを利用したいと思います。

目次

  • インターネットバンキングでAAVSの申し込み
  • AndroidのOctopusアプリで有効化

インターネットバンキングでAAVSの申し込み

申し込むにあたってインターネットバンキングにログインしますが、メニューが多くてわかりにくいです。

f:id:cvyan:20190219105106p:plain
My borrowingのOctopus AAVSをクリック

ここではOctopusカードの番号を登録するくらいだったと思います。
申し込んだ直後には5営業日くらいかかる旨の通知が届きましたが、翌日無事申請が通ったと連絡がありました。

AndroidのOctopusアプリで有効化

申請が通った状態であれば、MTRのCustomer ServiceでActivateしてもらうのが一番手軽です。
しかし、ITでできることはなるべくITでやりたい性分なので、以下手順で有効化しました

  • Android端末にOctopusの公式アプリ Octopus をインストール
  • 携帯番号、メールアドレスを登録してアカウントを作成
  • 自身のOctopusカードを読み込んで登録
  • AAVSを有効化

Android端末にOctopusの公式アプリ Octopus をインストール

提供元は Octopus Card Limited となっています。
普通にGoogle Playからインストールするだけです。

携帯番号、メールアドレスを登録してアカウントを作成

これも普通に登録するだけですが、携帯番号に対してはSMSで、メールアドレスに対してはメールで確認用のコードやURLが届きます。

自身のOctopusカードを読み込んで登録

ここまででアプリが使えるようになったはずですので、おもむろにAndroid端末の背面にOctopusカードをあててみます。
うまくいけば登録するか聞かれますので登録します。
ここまででも過去3か月分の使用履歴が見れたり、現在の残高が確認できたりします。

AAVSを有効化

Octopus アプリの画面左上部にある3本線をタップして表示されるメニューから、Automatic Add Value Serviceをタップします。
開いた画面にActivate AAVSがあるのでこれをタップします。
HSBC口座開設時の申請に使用した香港IDまたはPassport番号の最後の4文字と、誕生日を入力し、問題なければActivateが完了します。

オートチャージが有効になると、残高が0になった瞬間に自分の指定した額(250HKDまたは500HKD)がチャージされます。
自分はMTRやトラム、船以外でも、コンビニやスーパーなどいろんなところでOctopusを使うのでとても便利に感じています。

とはいえ、正直MTRのCustomer Serviceで有効化してもらった方がお手軽です。
が、2019年1月から始まったMTR利用料の還付についてだとか、学ぶことの多い作業だったので個人的には満足しています。

RODCにlocal管理者としてリモートで接続する

<手順>

1.RODCでコマンドプロンプトを起動し、下記コマンドを入力

dsmgmt

2.下記コマンドを入力

local roles

3.下記コマンドを入力

Add <ドメイン名>\<ユーザー名> administrators
Add <ドメイン名>\<ユーザー名> "remote desktop users"

以下のコマンドを実行することで設定した役割を確認することができる

show role administrators
show role "remote desktop users"

参考
[RODC] 読み取り専用ドメインコントローラについて ( Windows ) - ぎじゅつメモ - Yahoo!ブログ

https://blogs.yahoo.co.jp/technotes2008/1368361.html

Windows Server 2008 RODC〜管理者の役割の分離について : オラクる。

http://piro-shiki.dreamlog.jp/archives/32445097.html

Windows Server 2008(Hyper-V 2.0)上のCentos5.11を Windows Server 2012 (Hyper-V 3.0)へ移設する

目次

  • Windows Server 2008(Hyper-V 2.0)上のCentos5.1のカーネルyum upgradeであげられるだけあげておく
  • LinuxIC 2.1 を LinuxIC 3.5へアップデート
  • 上記vhdWindows Server 2012(Hyper-V 3.0)へコピーし、仮想サーバを構築
  • ifcfg-seth0 → ifcfg-eth0 へNICの設定ファイルが変わっているので変更
  • iscsidサービスがKernel Panicを起こすので起動しないように設定

Windows Server 2008(Hyper-V 2.0)上のCentos5.1のカーネルyum upgradeであげられるだけあげておく

# yum upgrade

LinuxIC 2.1 を LinuxIC 3.5へアップデート

MSのサイトから、LinuxIC 3.5のisoを落として、マウントし、中身をコピー

# mount /dev/cdrom /mnt/cdrom
# cp -R /mnt/cdrom/* /usr/src/linuxid-3.5/

インストール済みのLinuxIC 2.1をアンインストール

# cd /usr/src/linuxic-2.1
# make uninstall

LinuxIC 3.5を(とりあえずRHEL5.5として)インストール

# cd /usr/src/linuxic-3.5/RHEL55
# ./install-rhel55.sh

上記vhdWindows Server 2012(Hyper-V 3.0)へコピーし、仮想サーバを構築

コピーしたvhdを使用してHyper-Vマネージャ上で構築

ifcfg-seth0 → ifcfg-eth0 へNICの設定ファイルが変わっているので変更

# cd /etc/sysconfig/network-script/
# cp ifcfg-eth0 ifcfg-eth0.org.bak
# vi ifcfg-eth0

IPアドレスやネットワークアドレス、Broadcast、デフォルトGW等を書いて保存

iscsidサービスがKernel Panicを起こすので起動しないように設定

# chkconfig iscsid off

Security-Licensing-SLC イベントID 8200への対応

File     : Application
Type     : エラー
Source   : Microsoft-Windows-Security-Licensing-SLC
Category : 0
Count    : 116
LastTime : 2011/10/26 00:10:59
Message  : ライセンス取得の失敗に関する詳細。 
hr=0x80072EFD

すでに認証済みのサーバで上記エラーが頻発

1日に400回とかマジビビルんでやめてもらいたい

エラーの原因としては認証サーバと正しく通信できてないからっぽい
というわけで以下対策

コマンドプロンプトにて

> slmgr -dli*1

> slmgr -ato*2

無事認証されましたって表示されて、以降上のエラーは表示されなくなったからいいけど、いきなりダメになった原因がわからないのが不安

*1:確認。ライセンスの状態が「ライセンスされています」なら問題ない。今回は猶予期日が12月22日ってなってた

*2:認証。すでにライセンスキーは登録してあったはずなので、おもむろに認証をかけてみる