2017年12月29日金曜日

Fire TV と Amazon prime で映画見放題?

これも結構誤算でした。
(因みに私は映画大好き人間です。)

Fire TV Stick が5000円以下で買えて、年間4000円ほど払えば、映画が見放題なんや!
と思った私がバカでした。

Amazon Prime ビデオには確かに無料で見れる映画があります。
でも、無料の映画は数が少ないです。
ちょっと新しいのは、レンタル料金が発生します。まあ3~500円ほどですけどね。
映画を見たいと思ってから、レンタルDVD屋さんまで借りに行って、見終わったら返しに行く手間を考えたら、見たいときに見て、返し忘れが発生しないので、安いと言えば安いかも。

でも、近所のDVD屋さんでは、月に2日の特定日だけですが、旧作は20円です。
しかも歩いて行ける距離です。

音楽も聴き放題ですが、ビデオと同様ですね。
これなら、ラズパイにKODI 入れて、ネットラジオを聞いてる方がいいかもしれない。

Prime会員なら、買い物をしたときに送料無料になる場合があるので、これは気軽に注文できるので、いいんですが、やっぱりその分販売金額が多少高めな気がします。
まあ少額のマニアックなものが見つかる時があるので、勝負をしてみるときには送料無料はありがたいですが。


Google AIY Voice Kit は Google Home じゃない

さらに大きな誤算なのは、Google Home 的なことが簡単にできるのかと思っていたら、全然ダメで、かなり高度なプログラミング能力が必要なようです。

だからこそ、AIY (Do it yourself の AI版ってこと?)なのかもしれませんが、私にはハードルが高すぎます。

英語で聞いたら、英語で答えてくれるぐらいはできますが、それにしても、サンプルスクリプトをそのまま走らせているだけ。

スピーカー以外のデバイスも無いので、もちろん音声で赤外線リモコンの代わりをさせることも、そのままではできません。
赤外線モジュールを繋ぐことはできると思いますが、各社の各リモコンを記憶させるなんて、途方もなく邪魔臭そうです。

「眠っているラズパイがあるので、+3000円で Google Home が作れるんや!」と思った私がバカでした。

Google AIY Voice Kit は アメリカ人

届いた AIY Voice Kit を早速組み立てた。
元々の PI3で使っていた MicroSD を使わずに、別のカードを買って、説明書通りに OS をインストールしたら、あっという間に Voice Control 出来た。

でも、AIY Voice Kit は大きな誤算でした。
なぜなら、日本語が通らないから。

「OK Google」これはまあいい。
でも、「今何時?」は無視される。
中学生英語を駆使して、「What time is it now.」と言ったら、
「It's 21:30」とか言ってくれるけど、はっきり言って、日本人の私には聞き取り難い。
必死にリスニングするぐらいなら、時計を見た方がよっぽど楽です。

同様に、「今日の天気は?」は当たり前にダメで、
「How's the weather.」と聞いたら、なにやらぺらぺらとしゃべってくれますが、はっきり言って、全く理解できない。

AIY のために英会話を学習しなおさないとダメなのか~。

2017年12月17日日曜日

Google AIY Voice Kit が来た!

2017.11.21に発注しておいた、 Google AIY Voice Kit が本日 2017.12.17に到着しました。

Raspberry Pi ZERO W と同時発注したんですが、ZERO だけが先に到着してました。

もちろんこのAIY Kit はPi3 用なので、ZERO は他の用途に使って、以前に購入してあった、Pi3 を使います。

Kit の組み立て自体は、段ボールなので、すごく簡単でした。
小学5年生のお世辞にも手先が器用とは言えない子供と一緒に作りましたが、30分ほどで完成です。
組み立て説明書は全部英語ですが、詳しい写真がたくさん掲載されているのと、非常に簡単な英語の見出しがありますので、完成までに困ることはなかったです。


2017年12月10日日曜日

Fire TV Stick (Newモデル) が来た

先日 Raspberry Pi ZERO W を購入したばかりだというのに、
本日(20171210) Fire TV Stick(NEW Model)  を買ってしまった。

Cyber Monday というセールをやっていたので、4480円でした。
これに念のために、2年間の追加保証が980円を追加しておきました。

12月9日午前2時ごろにぽちっと発注ボタンを押して。
12月10日午後4時ごろには自宅に届きました。
しかも、アマゾンプライムの設定までされています。

凄いですねぇ。

早速テレビに繋いだら、あっという間に視聴可能。
プライムを申し込んであるので、色々見れます。

しかも、 Raspberry Pi ZERO W の KODI よりよっぽど操作が軽いです。


2017年12月2日土曜日

Raspberry Pi ZERO W に OSMC をセットアップ

届いた ZERO に早速 OSMC を入れてみました。

MicroSDカードはその辺に転がってた、8Gの Class4 です。
ま、とりあえず、動作確認的に入れてみて、不満があればまた変更するつもりで。

インストール自体は順調に進みました。
Windows10 の母艦にMirocSDをセットして、NOOBS から。
この辺りは、たくさんの人が手順を公開されてるので、そちらを参考に。

OSMC は起動するとWindows や Linux 見たいなGUIのデスクトップが現れるのではなく、いきなり KODI の画面になります。
この ZERO W は購入時からメディアサーバー専用の予定なので、ちょうどいいですね。

日本語化も特に問題なく。
一瞬文字化けで困りかけましたが、依然に Pi3 で経験済みだったので、これもネットを参考にして、FONT だろうとおもわれるところで、ARIAL だろうと思われる豆腐文字を選択。

これで、NAS に置いてある音楽ファイルとか、MPEG4 のビデオとかは再生できるようになりました。
すごく簡単です。




2017年11月25日土曜日

Raspberry Pi ZERO W 到着

Raspberry Pi ZERO W を入手しました。(2017.11.21発注で同23到着)

前回はRasPi3を購入して、KODI などで結構便利に使っています(ホントは子供とプログラミング練習をするという名目で買ったけど。)が、
今回、「Google AIY Voice Kit」の導入を決意し、Pi3はそれ用に使うので、KODIなどのホームメディアサーバーはこのZEROでやってみようと思います。

販売元の KSY に Pi ZERO と Google AIY Voice Kit を同時に発注しました。
Google AIY Voice Kit は12月上旬の発送になると書かれていました。
Pi ZERO は在庫ありとのこと。

二つをセットで発注することで、5000円以上になり、送料が無料になりました。

Pi ZEROも12月上旬まで発送してくれないかな?と思いながら待っていたら、なんと、翌日ポストに小さな箱が投函されていました。

もしかしたら、Google AIY Voice Kitも早く入荷したのか?と思って開けてみると、まあ予想された結果ですが、 Pi ZEROだけが入ってました。

今回は、専用ケースとmini-HDMIの変換アダプターとMicroUSB-OTGケーブルがセットになった、Official Simple KIT です。

さて、これには、OSMC を入れてみようと思います。

2017年10月12日木曜日

Access VBA でイベントに関数を登録

MicroSoft Access の話題です。

フォームに大量のボタンを配置した場合など、それぞれのボタンのクリックイベントを書いていると結構邪魔くさい。

例えば、月単位のカレンダーを表示して、特定の日付をクリック(もしくはダブルクリック)したら、その日の詳細を表示するフォームがポップアップするなどのプロシージャを書きたい場合など。
実際には押された日付を取得できれば、あとは同じ処理になるので、プロシージャ自体は非常に簡単だけど、
普通にかいたら、最低でも31個のClickイベントを書かなければならない。
これは非常に邪魔くさい。

そこで、すべてのコントロールを選択(SHIFTを押しながら選択)して、「クリック時」イベントに「=ユーザー関数」を書けば、一発で登録できる。

コントロールの名前を「日付」にしておけば、
Screen.ActiveControl.Name」でそのコントロールの名前を取得できるので、
押された日付が取得できる。

実際には
--------------------------------------------------------------
Function UF_PCall()
    Call R_Main
End Function

sub R_Main()
    V_条件 = Screen.ActiveControl.Name
    Docmd.OpenForm "F_PopUp",,,日付 = " & V_条件
End Sub
--------------------------------------------------------------

こんな感じのプロシージャを書いておいて、
フォームの日付フィールドを複数選択して、
そのクリック(もしくはダブルクリック)イベントに、
「=UF_PCall()」
と書けば、一発登録完成です。

今更ながら、イベントプロシージャに関数を書くというのは、目から鱗でした。

応用編として、コントロールの名前が取得できるなら、
    me.Control(取得した名前).Value
などとすれば、値を取得することも可能になるし、
    set obj_CTRL =  me.Control(取得した名前)
とすれば、あとは、
    obj_CTRL.Value
でも、
    obj_CTRL.BackColor
でも、そのコントロールのプロパティーを簡単に操作できますね。











2017年9月4日月曜日

Life Card の改悪

前回 Life Card のポイントで Amazonギフト券と交換すると、ちょっとお得になると書いたら、ちょうどそのすぐあとに、Life Card が改悪を行ったようで、今はお得になりません。
今は一律1000ポイントで5000円分のギフト券に交換できる1種類だけになりました。

Life Card は高還元率で有名なクレジットカードだったのですが、続々と改悪があって、一番の売り文句だった、「誕生日月は5倍」というのも、3倍に減りましたし、
高速道路のETC使用やEdyのチャージももポイント対象外になってしまいました。

年間150万円以上の使用で、ポイント2倍も無くなり、
年間200万円以上の使用で、ポイント2倍になりました。
ただし、年間100万円以上の使用で、ポイント1.8倍というのが追加になりました。

でも、総合的に魅力半減です。
特に私の場合、高速道路をよく使うので、ポイントが付かないのは響きます。

早急に新しいカードを検討しなければなりません。


2017年6月2日金曜日

LifeカードのポイントをAmazonギフト券に交換

普段クレジットカードは Life Card をメインカードにしています。
公共料金などもこれで支払ってるので、ポイントが結構貯まります。

今回、その貯まったポイントを Amazonギフト券に交換しました。

交換レートは、LifeCard 3,600ポイントで Amazonギフト券20,000円を選択。
現金系に交換するより10%お得ですね。

金曜日の21時ごろにLifeCardのWEBから交換手続きを開始。
生年月日やカードの暗証番号などの入力が必要。
でも、いたって簡単。

入力完了後、送信ボタンを押して、待つこと約5分で、
Amazonギフト券番号が記載されたメールが送られてきた。

今度は、AmazonのWEBにログインして、送られてきた番号を入力すると、
その瞬間にチャージされました。
こちらもいたって簡単。

これなら、買いたいものが見つかった時に、すぐに交換して使える。

しかもチャージしたギフト券の有効期限は、なんと2027年。
ほぼ10年使える。

予想では半年ぐらいで失効するのかと思って、
交換をためらっていましたが、
こんなに長いならもうちょっと大きな金額で交換したほうが良かったか。

交換レートは累進なので、
 3,600P=20,000円(10%)
 8,800P=50,000円(12%)
15,000P=100,000円(25%)

25%OFFは感動ものですが、こんなにポイント貯めれるのかな?



2017年5月9日火曜日

RemoteFX って使えない

リモートデスクトップはすごく便利に使っています。

Windows7 のノートパソコンから 別室にあるWindows7 のデスクトップパソコンをリモートしたり、Windows 2008 Server r2 サーバー機のリモート管理を行ったりしています。

ところが、今回二要素認証を導入しなければならないことになり、ちょっと問題が発生しました。
全てのパソコンにUSBメモリー風のデバイスを接続して、対応するパスワードを入れないとログインすることができなくなりました。

このUSBメモリー風デバイスは一人1個しかない。
リモートで別のパソコンを操作するということは、2台のパソコンにログインするということ。
ということは、デバイスが2個必要となるので、事実上リモート接続が不可能になってしまいました。

ここで色々彷徨ったら、RemoteFXなるものを導入すれば、操作する側(自分の目の前)のパソコンに接続したUSBデバイス(ローカルデバイス)を、操作される側(別室にある)のデバイスとして認識させることができるという情報をつかんだ。

もともと、DVDドライブやプリンターなどはこちら側に繋いだものを利用できるので、それが拡張されたという感覚ですね。

得られた情報では、Windows7 なら 32bit でも64bitでもOKで、SP1が適用されていることが条件となっている。

これを使えば完璧!ということで、色々試行錯誤をしたのに、どうしても設定できない。

もうちょっと彷徨ったら、なんと RemoteFX は、
Windows7 でも「Enterprise」か「Ultimate」エディションしか使えない!

そんなエディションありえへん!
無駄な時間を費やしてしまった。

しかも、結局リモートデスクトップと二要素認証のジレンマは解消できず。
こりゃ困った。




ClickOnce がとつぜん

ClickOnece で組んであったシステムが突然以下のようなエラーを吐いて動かなくなってしまった。

複数台の端末で同じ実行環境を作ってあった内の数台でダメ。
サーバー自体で起動した場合は普通に起動する。

怪しいのは1か月ぐらい前に、ウィルス対策ソフトを入れ替えたこと。
マカフィーからカペルスキーに。

でも、すべての端末は同じ環境なのに、なぜ?
しかも、ダメな端末も朝一は正常起動していたのが、途中で端末の電源を入れなおした後からダメになったような気がする。

やはりカペルスキーか?
ということで、ダメな端末の内の1台で、カペルスキーをアンインストールして実行してみたけど、たっぱりダメ。

一晩ネットを彷徨ったら、やはりウィルス対策ソフトで ClickOnece がダメになった例が報告されていることを発見。

そこで、カペルスキーのログを確認したところ、ありましたありました。
システムの実行ファイルを隔離してやがった。

まだカペルスキーを削除していない端末は、カペルスキーのインターフェースを使って、隔離ファイルを復元し、実行ファイルのあるフォルダをスキャン対象から除外する設定を施したら、普通に起動するようになった。

カペルスキーをアンインストールしてしまった端末は、隔離されたファイルを復元する方法がないので、別の端末のログを参考に実行ファイルを本来のフォルダにコピーして復元。
ところが、この実行ファイルはカペルスキーが確実にウィルス扱いするので、コピーする際に、大元のClickOnece配信サーバーから一旦中間サーバーを経由してダメ端末にコピーしようとすると、その中間サーバーにカペルスキーが居るので即座に駆除(隔離)してしまうので、手動でコピーしようとした瞬間に駆除されるというのを数回繰り返してしまった。
別のルートを使ってなんとかコピーして、正常起動を確認。

正常起動してた端末でも同じようにカペルスキーが入っていて、同じ辞書ファイルが配信されているのに、なぜ正常起動していたのかは不明。
もしかしたら、辞書ファイルの配信が上手くいってなかったのかも。(それはそれでもっと問題ありかも)

また、配信サーバーには偶然カペルスキーを入れていなかったので、大元の構造は破壊されていなかったのはラッキーでした。

マカフィーの時はそんなことなかったのに、カペルスキーにしてから約1か月でアウトとは、カペルスキーの技術力に問題ありなんじゃないの?

今回起動しなかったのはほんの2~3台だったのと、このシステムを利用している端末が10数台だけだったので軽症で済んだけど、ネットワーク自体は100台以上規模なので、もしもっと重要なファイルをカペルスキーが勝手に駆除しちゃうと、大打撃となる可能性があります。

----------------------------- Error LOG -------------------------------------
PLATFORM VERSION INFO
Windows : 6.1.7601.65536 (Win32NT)
Common Language Runtime : 4.0.30319.18444
System.Deployment.dll : 4.0.30319.18408 built by: FX451RTMGREL
clr.dll : 4.0.30319.18444 built by: FX451RTMGDR
dfdll.dll : 4.0.30319.18408 built by: FX451RTMGREL
dfshim.dll : 4.0.41209.0 (Main.041209-0000)

SOURCES
Deployment url :serverURL
Server : Microsoft-IIS/8.5
X-Powered-By : ASP.NET
Application url :serverURL
Server : Microsoft-IIS/8.5
X-Powered-By : ASP.NET

IDENTITIES
Deployment Identity : appname.Application.app, Version=1.9.0.2, Culture=ニュートラル, PublicKeyToken=4cf906, processorArchitecture=msil
Application Identity : appname.Application.exe, Version=1.9.0.2, Culture=ja, PublicKeyToken=4cf906, processorArchitecture=msil, type=win32

APPLICATION SUMMARY
* Online only application.
* Trust url parameter is set.
ERROR SUMMARY
Below is a summary of the errors, details of these errors are listed later in the log.
* Activation of ServerURL resulted in exception. Following failure messages were detected:
+ Activation failed.
+ アクセスが拒否されました。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))

COMPONENT STORE TRANSACTION FAILURE SUMMARY
No transaction error was detected.

WARNINGS
There were no warnings during this operation.

OPERATION PROGRESS STATUS
* [2017/04/18 10:04:40] :

ERROR DETAILS
Following errors were detected during this operation.
* [2017/04/18 10:05:12] System.Deployment.Application.DeploymentException (Activation)
- Activation failed.
- Source: System.Deployment
- Stack trace:
--- Inner Exception ---
System.UnauthorizedAccessException
- アクセスが拒否されました。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
- Source: System.Deployment
- Stack trace:
at System.Deployment.Application.NativeMethods.CorLaunchApplication(UInt32 hostType, String applicationFullName, Int32 manifestPathsCount, String[] manifestPaths, Int32 activationDataCount, String[] activationData, PROCESS_INFORMATION processInformation)
at System.Deployment.Application.ComponentStore.ActivateApplication(DefinitionAppId appId, String activationParameter, Boolean useActivationParameter)

2017年3月18日土曜日

sp_executesql でパラメーターを変更しながらSQL文を実行

SQLServer の話題です。

ストアドで動的に作成したSQL文を実行したい場合に有効な手段です。

Execute sp_executesql @実行したいSQL文,
                                 @SQL文の中で使うパラメーターの型宣言,
                                 @パラメーターそれぞれの内容

という構文になります。

実際には、
-------------------------------------------------------------------
Declare @strSQL nvarchar(1000)
Declare @prm nvarchar(1000)
Declare @A_MAX

Set @strSQL = 'Select @prm_MAX = MAX(ColA) as A_MAX From T_tableA Where ColB = @prm_B'
Set @prm = '@prm_MAX int OUTPUT ,@prm_B nvarchar(200)'

execute sp_executesql @strSQL,@prm,@prm_MAX = @A_MAX OUTPUT,@prm_B = '東京都'

Select @A_MAX as ColAの最大

-------------------------------------------------------------------

主となるSQL文(@strSQL)内で、パラメーターを2個使う例です。

1個は ColAの最大値を求めて、表示するための @prm_MAX、
もう1個は、条件で使用するための @prm_B

@prm は主となるSQL文内で使うため専用の宣言を行うパートです。
executesql 専用 Declare って感じですね。

この例では、@prm_MAX を外に出しますので、「OUTPUT」を付けます。

execitesql の最後のパートは、SQL文内で使うパラメーターの実際の値を書きます。
ここでも、外に出すパラメーターには「OUTPUT」を付けます。
ここで勘違いしやすいのが、赤で塗ってある部分です。
普通の変数に値を代入する感覚では、「@A_MAX = @prm_MAX」となるのですが、ここでは、SQL文内のパラメーターを中心に考えるので、逆に書くことになり、
「@prm_MAX = @A_MAX」で正解です。
これで、@A_MAX に@prm_MAX の内容が代入されます。なんか変な感じですね。

@prm_B は簡単ですね。

最終的に、SQL文内で使ったパラメーターはあくまでも内部専用のパラメーターですから、外部に出してくるための@A_MAX は事前に Declare で宣言が必要です。

当たり前ですが、SQL文内にあるパラメーターの個数と、宣言文内での個数と、実際の値を与えるパートの個数が一致しないとエラーになります。








2017年1月28日土曜日

SQLServer 2008 から Merge が使える

久しぶりに本題のSQLServer です。

今まで知りませんでした。
MERGE文が使えるんですね。

SQL と言えば、言わずもがな「Select」「Insert」「Update」「Delete」の4文が基本です。
例えば、Table_A と、ほぼ同じ構造を持った Table_B があって、
必ずTable_Aが最新になっているとします。

最新になっているというのは、

1、レコードが増えている。
2、レコードが減っている。
3、レコードが更新されている。

とうことが考えられます。

この状態をTable_Bに反映させる。
例えば、夜間バッチでTable_Bを最新状態にする必要がある場合が想定されます。

今までなら、
Table_Bに不足しているレコードを特定して、Insert文を発行。
Table_Aには無いレコードを特定して、Delete文を発行。
Table_AにもTable_Bにもあるが、更新されているレコードに対して、Update文を発行。
と3回の比較処理を走らせる必要があるので、
大量のレコードの場合に、莫大なコストが必要になることがありました。

これを1回の比較で処理してしまうのが、Merge です。
まあ、言葉の意味のままのステートメントです。

私の場合、ORACLEにあるテーブルをそのままSQLServerに毎日夜間バッチでコピーしたいのですが、総レコード数は40万件以上あるのに、更新または追加されるのは、わずか1000件程度。
その1000件を最新に保つために、 Truncate で全消し、Insert で全書きをしていましたが、あまりにも非効率なのと、ディスクにも負担をかけると思います。

そこで考えたのが、リンクサーバーでORACLEに接続して、OpenQuery を発行します。
その際、更新年月日を参照して、前回処理日以降だけに絞る Where句を付けておきます。
OpenQuery なので、条件が入っても、ORACLE側で高速に処理されて返ってきます。
これで1000件程度のレコードが返ってくる。

これを一旦 Select Into ##tempTable で仮テーブルに保管して、SQLServer 側の本来保管したいテーブルと比較して、 MERGE 処理を行うことにしました。

毎日数分かかっていた処理が、数秒で完了するようになりました。

MERGE の構文自体は、他の方がたくさん例を挙げていただいているので、私は省略です。

でも、1行で書けるといっても、結構手間の必要な構文になります。

比較は1回ですが、マッチした場合の動作(通常は UpDate になるかな。)と、アンマッチの場合の動作を(私の場合は、Insert ですが、 場合によっては、 Delete になる。)それぞれ書かないとダメです。
まあ、当たり前と言えば当たり前ですけどね。

特に、 UpDate の場合は、カラムを全部書かないと(しかも、元と先の両方を書かないと)ダメなので、カラム数の多いテーブルだと、長ーい構文になっちゃいます。







UQモバイルで SIMロック解除が必要

auからUQモバイルに乗り換えを考える場合、SIMロック解除が必要なのかどうかがよく理解できていませんでしたが、身をもって確認できました。

確認したのはXperia 限定のことです。

2016年11月ごろに中古市場で au仕様のXperia Z1 (SOL23) を購入しました。新品未使用状態です。
すぐに UQモバイルに申し込み、数日でSIMが到着。
本体にSIMをセットしてAPNを設定したらすぐに使えました。
「なーんや、SIMロック解除って必要ないやん。」

これは、au仕様の端末でUQモバイルのSIMだから解除が必要ないんだと解釈しました。

これに気をよくして、今度は2016年末に同じくau仕様の Xperia Z4(SOV31) を、これまた中古市場で、新品未使用品を購入しました。
お値段は33000円ぐらいだったと思います。

これも早速 UQモバイルの SIM を挿しましたが、今度は通信できません。
なんで?同じ au仕様で UQモバイルやから問題ないはず。
とおもったのですが、大きな勘違いでした。

au仕様の端末で UQモバイルのSIMを使う場合で、ロック解除が不要のまま使えるのは、Z1が最後の機種のようです。
Z1以降に発売された端末は SIMロック解除が必要だそうです。

20170627訂正
Z3もロック解除必要なしが確認できました。
因みに、Z2 Tablet もロック解除必要なしが確認できました。

なんか、総務省かなんかが SIMロック解除を命令したようですが、逆に邪魔臭くなってるような気がする。

おかげで、(私は)年末に買ったのに、最初の所有者が購入した後、6ヶ月間は解除できないので、私の場合、2月初旬まで解除できません。
今のところ、UQの契約はしたままなので、月額1000円を捨てているような状態。(通信していないので、月3Gの容量をどんどん持ち越していて、2月に使えるようになったら、9Gぐらいからスタートすることになります。

20170627訂正
UQMobileの持ち越しは1ケ月分だけでした。
なので、MAXでも6Gにしかなりません。

Z4自体は前に使っていたスマホ(Xperia UL SOL22)をUQモバイルで契約して、それにBluetoothでWIFI接続して使っています。

2月になればすぐにロック解除するつもりですが、これまた、auのサイトを読んでいると、契約者でないとネット解除できないような感じ。
ということは、auショップに持ち込んで3000円払って解除してもらわないとだめなのか~。