アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2016年01月24日

音声認識について調べた

先週から新たな悩みが増えた。

仕事で新しい雑務が増えたのだ。
本来の専門である計算や解析ではない。
まあ雑務だ。

自分が出ていない打ち合わせの議事録だ。
録音された音声ファイルの文字起こしだ。

自分はタイプが遅い。
話を聞いて理解するのも遅い。
だからイヤホンで音を聞いても
文にするのが苦手だ。

正直しんどい。
この音声ファイルをもらって
議事録を作成する作業はこれからも
継続されるだろう。

大事な仕事ではあるが
作業時間を考えると無駄な時間だ。
その打合せや会議の時間が
長ければ長い程無駄に感じる。
なぜなら録音時間の2、3倍は時間を要するからだ。
1時間なら、2、3時間。
2時間なら4〜6時間。
要点をまとめる議事録の場合でも
録音時間の1.5倍は要する。

なんとかならないのか。

そんなストレスから逃げるように
土日に突入。
早速色々調べてみる。

その1.ドラゴンスピーチ、AmiVoice

音声ファイルからテキスト化するソフトというと
ドラゴンスピーチ11と AmiVoice SP2 の2つがある。
これらはPCにインストールして使うタイプなので、
オフラインで使える。
そう、「オフライン」で、というのが大事なところだ。
もし仕事で使うなら、重要な情報がネットを経由しないよう
オフラインで使えないといけないのだ。

(最新の機械学習による音声入力アプリ等は
 すべてネットを経由してappleやgoogleのサーバーと短い音声データを
 やり取りして文字化している。これらは仕事には使えない。)









下記のサイトで2つを比較している。
AmiVoice SP2 は修正の際に面倒なようだ。
なので買うならドラゴンスピーチか。
ただ、録音ファイルのテキスト化はあんまり精度がよくなさそう。
発売が2012年だし。古いな。

>音声認識ソフトを使おう
>音声認識ソフト選び。amivoice SP2 と ドラゴンスピーチ 11 当サイトの結論は?!
>(2015年10月現在)
http://speech-voice.com/post-1861/

ドラゴンスピーチはドラゴンスピーチ11とドラゴンスピーチ11 Lite と ドラゴンスピーチ11Jが
あるみたい。

ドラゴンスピーチ11とドラゴンスピーチ11 LiteはNuance社が作っている。
ドラゴンスピーチ11JはNuance社が作ってジャストシステム社が販売しているようだ。
11JはAmazonで在庫なし。
ジャストシステム社のサイトには販売は終了しました、と書いてある。

>JUST SYSTEM 音声認識ソフト ドラゴンスピーチ11J
http://www.justsystems.com/jp/products/dragonspeech/

ドラゴンスピーチ11の簡易版が11 Liteらしい。
11はボイスレコーダーと各音声ファイル形式を扱えるけど
11 Liteはボイスレコーダーのみ対応とある。
とりあえず、自分はiphoneのボイスメモアプリのm4aファイルを扱いたいから、
Liteを買ってもし使えないと困るから、買うならstandard版だな。

製品版はマイクが付いているらしい。
自分がマイクに喋って音声入力する用だな。要らないな。
(音声入力は便利かもしれないが、職場で使ったら独り言になって恥ずかしいな、、)

ダウンロード版はマイクが付いていないが、すぐ使える。
買うならダウンロード版だな。





ということで、買ってみた。
ダウンロード版なのですぐ使える。
で録音ファイルの文字化というものを試してみた。

結論から言おう。くそだ。
下記はテキスト化したものの抜粋だ。

「辺りは買うからもう済ませられる続報からfirefoxを譲る
  涼涼涼で買うならやりが豊富でも古い資料がございますふはらへたーのです。」


こんな文がwordファイル5ページくらいにビッシリ埋まっている。
ふざけるないでくれ。金返してよ。。こんなので金取らないでほしい。。のレベル。
16330円ドブに捨てたな。

マイクから口頭で喋って音声入力する分には8割がた文章になるが、
録音ファイルからテキスト化は全く使い物にならない。



2.interviewScribe for Mac

Macの場合はこんなソフトもあるようだ。

>interviewScribe for Mac
http://appapple.net/mac/tag/%e9%9f%b3%e5%a3%b0%e3%81%8b%e3%82%89%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88/

でも同じく2012年発売なんだよな。

人工知能の研究が進んで、
機械学習とかディープラーニングとか進んできたんだから
2015年に出たソフトとかないのかな?

3.音声認識装置

ドラゴンスピーチのiphoneアプリ版に
ドラゴンディクテーションというアプリがある。
それの後継版が「音声認識装置」だ。

Anfasoft社が開発者だが、
写真の画面にはNuance社の文字があり、
同じ会社が作っている。

>音声認識装置
https://itunes.apple.com/jp/app/yin-sheng-ren-shi-zhuang-zhi/id543125434?mt=8

で買ってみた。1080円。

。。。はい、ダメー。
録音ファイルを使えない。
(ボイスメモアプリとは連携していない。)
それと、オンラインでサーバーとやり取りして
音声認識するタイプのアプリなので仕事につかえない。

近くにあった本の表紙の文字を読み上げてみる。

喋った原文
「C++からアセンブリ言語関数を呼び出す平易なプログラムで、基本的なアセンブリ命令と
 レジスタ/フラグの役割から、文字列操作・浮動小数点演算・SIMD命令によるベクター処理まで学ぶ」

認識するとこんな感じ
音声認識装置.jpg

「シープラプラからアセンブリ言語関数を呼び出すいいなプログラムで基本的なアセンブリ命令とレジスタ/フラグの役割から文字列操作浮動小数点演算SI MD命令によるベクター処理までマダム」

さすがは最新の機械学習が使われているだけある。
専門用語もきっちり変換されている。
逆に「平易な」とか、「学ぶ」とか、普通の日本語の発音が甘い箇所が
うまく認識されていない。

とまあ、最新の音声認識の実力はよくわかった。
が、録音ファイルが使えないんだから、当初の目的は達しなかった。1080円が無駄になった。
まあ、勉強料といったところか。。


4.Voice Rep Pro

2013年に出たのか。
思ったより新しくないな。
録音ファイルの文字化に対応しているPC用ソフト。
ただし、googleの音声認識サービスを使っているため、
オンラインで接続していないと使えない。

先ほども書いたように仕事では使えないのだ。
下記のサイトの最後の方にも
「■「Voice Rep Pro」を使用する上での注意点」
として書いてある。

>テープ起こしに生かせる?音声認識製品・サービス、最新情報(2) ―Voice Rep Pro―
https://8089.co.jp/onsei-ninshiki/390

仕事には使えないと分かっていながら、
googleの実力が知りたくて買ってしまった。
ダウンロードするタイプなので購入してすぐ使える。

「マイク音声入力」ボタンを押すと
Google Chromeが立ち上がり、
Googleの音声認識サービスの画面が立ち上がる。

ジョギング時の音楽を聴くために買った
片耳bluetoothイヤホンにはマイク機能も付いているので
マイクに喋ってみる。



喋った原文
「64ビットアセンブラ入門 64ビットCPUの基本構造もやさしく解説
 C++からアセンブリ言語関数を呼び出す平易なプログラムで、基本的なアセンブリ命令と
 レジスタ/フラグの役割から、文字列操作・浮動小数点演算・SIMD命令によるベクター処理まで学ぶ」

認識するとこんな感じ。

VoiceRepPro.JPG

「64bit アセンブラ new 64bit cpu の基本構想 やさしく解説
 C++からアセンブリ言語 関数を呼び出す 映画プログラムでアセンブリ名と
 register/flagの役割から文字列操作 浮動小数点演算 simd命令 ector処理まで 学ぶ」

さっきの音声認識装置には劣る。
が、まあ、まずまず文章になっている。
専門用語も変換されている。

オンラインの音声認識は、豊富なデータ(ビックデータ)で
専門用語にも強いなあ、という感がある。

で、肝心の録音ファイルからのテキスト化はどうなのだろう。。。

あれ?

「録音音声文字化」ボタンを押してもテキスト化されない。。なんで?
どうやら「ステレオミキサー」というものが無いので
動かないようだ。。そんなばかな。

でネットで検索すると
windows10にしたらステレオミキサーが表示されなくなったという人がいた。

>メインマシンをWindows10にしてから、ステレオミキサがなくなった!
http://blog.goo.ne.jp/aopen000/e/e7620e34196a3ed3a876c741e3c85109

ということで
下記のページからファイルをダウンロードしてインストール。

>Realtek オーディオ ドライバー Windows 10 (64bit)
http://support.lenovo.com/jp/ja/downloads/ds103568

再チャレンジ!

うーん。まだ動かない。何が足りないんだ!

で、「仮想ステレオミキサー」で調べて
下記のサイトにたどり着く。

>【図解】Skypeで自分のPC音を相手に聞かせたい方へ(非ステミキ用)
http://ch.nicovideo.jp/marth/blomaga/ar337868

上記サイトの通りにファイルをインストール。
再再チャレンジ!

。。。お、テキスト化し始めた。やったー。

で録音ファイル(m4a→フリーファイルでmp3に変換)
の原文
「C++からアセンブリ言語関数を呼び出す平易なプログラムで、基本的なアセンブリ命令と
 レジスタ/フラグの役割から、文字列操作・浮動小数点演算・SIMD命令によるベクター処理まで学ぶ」

で、認識するとこんな感じ。

VoiceRepPro3.JPG

「だから アセンブリ言語関数を呼び出す プログラムで基本的にアセンブリ 命令
 レジスタ/flagの役割から文字列操作 浮動小数点演算」

うーん。さらに劣化した感じ。だけどドラゴンスピーチとは雲泥の差。
やっぱり、最新の機械学習が反映されているとできが違うなあ。
8080円。まあ全部が全部無駄という訳ではなかったな。



以上より、結論としては
オフラインで仕事に使える録音ファイルの文字化ソフトは現状「ない」。
残念だ。


以下は、雑記。
iphoneのsiriは音声認識で世界一のようだ。
iOS8ぐらいからかなり精度が良くなったらしい。
で自分はずっとOSを上げていなかったので
iOS9.2に上げてみた。
かなり使えるレベルだ。すごいね。

>Siriの音声認識、グーグルを超えた
http://www.excite.co.jp/News/it_g/20150609/Gizmodo_201506_siri_wwdc2015.html

iphoneの音声認識は基本はオンライン。
ただしiphone6とiphone6sは
オフラインでも音声認識が使えるらしい。
ただし、そのapiは非公開。
公開されれば色んな可能性がありそうだ。もちろん議事録作成だって。

以下のサイトにはgoogle他の音声認識のapi等が列挙してある。
大半はオンライン。

>iOSアプリでの音声認識機能実装方法まとめ
http://qiita.com/satoshi0212/items/af4928b808b4fbba8091

Julius はオフラインで使えるが、精度が悪そうだ。
帰りに丸善で立ち読みした下記の本(2007年)にも載ってたから
結構古い話だ。



iphoneの音声認識のapiが公開されてほしいなあ。
















posted by iyoder at 01:00 | Comment(1) | TrackBack(0) | 音声認識

2016年01月17日

brotherの最新プリンタ購入

しばらく暖冬だったはずが、
先週は寒かったなあ。

昨年ずっと着てたコートのボタンが
ひとつ、またひとつとちぎれていき、
全てのボタンがなくなった。

なので今年はまだコートなしで出勤していた。。。さむっ

いいかげんこの土日でコートを買うことにした。
土曜は急遽出勤だったので、
今日(日曜)買いに行ってきた。

image.jpg

前のコートは黒。
今回は紺にした。
taka-Q。。。です。小心者でも気楽に行きやすいので。

ついでにもう1個買ってきた。
黒。
葬儀とかあったら紺とか来て行きずらいので。

image.jpg


家に帰るとヤマトの宅配便が届く。
amazonでbrotherのプリンタを買ったのです。
>MFC-J6573CDW
http://www.brother.co.jp/product/printer/inkjet/mfcj6573cdw/index.htm



とある理由でどうしても両面印刷ができるプリンタが家に欲しかった。
大量に印刷したかったが、
レーザープリンタはトナー以外も消耗品があるのでメンテナンスが大変そう、、、
ということでインクジェットで早いものを選んだ。
価格ドットコムによれば
http://kakaku.com/prdcompare/prdcompare.aspx?pd_cmpkey=K0000778634
カラー20枚/分
モノクロ22枚/分
らしい。
ついでに
・A3印刷複数枚可能
・A3スキャンもADFで複数枚自動で可能
・A3コピー可能
・両面コピー可能
・Wifiで無線でパソコンやスマホと接続できる。
で30581円。必要な機能全部そろってる。すごい。

1年前に買ったA4のADFで複数枚自動スキャンしかできない
下記のスキャナ(4万円)に比べてだいぶ良くないか?

image.jpg




(まあ、これはこれでiphoneのアプリで送信ボタンを押すだけでスキャンしてパソコンに
 飛ばしてくれるから優秀な子だったんだけど。)



実物。。。でか (下の写真)

image.jpg

比較として今まで使ってきた大学4年に買ったA3ノビ対応プリンタ。(もう壊れて動かないけど)

image.jpg

複数枚のスキャンやコピーのときは上面のトレイを開けてこんな感じ。

image.jpg

ふたを開けて1枚ずつスキャンやコピーする場合はこんな感じ。
オフィスの複合機と一緒だ。
いやーA3が家でスキャンできるってすごい時代だなあ。

image.jpg

インクは4色。シアン、マゼンダ、イエロー、ブラック。
ブラックは少し他のより厚めだ。

image.jpg

image.jpg

image.jpg

image.jpg

と思ったら、スタート用のインクカートリッジなので
新しく購入するともっと馬鹿でかいブラックカートリッジが使えるらしい。
すごいね。

>大容量インクカートリッジ
http://www.brother.co.jp/product/printer/inkjet/mfcj6573cdw/feature/index.htm#ink



インクを全部セットしたらテストページが出力されてきた。よしよしOK.
紙は手前から出るんだな。

image.jpg

image.jpg

お、初期設定(Wifi以外)が終わったら画面が通常モードになった。

image.jpg


ただ、、、画面が見づらいなあ。
足元にプリンタを置いてるからなあ。

image.jpg


、、と思ってたら、マニュアル見たら
画面の角度を変えれるらしい!

image.jpg


これで足元にあっても画面がクッキリ見れるぞ!

でWifiの設定もして、すべての設定が終わったぞ。
試しにbrotherのサイトからダウンロードしたマニュアルを
「両面印刷」してみよう!

image.jpg

す、すげー。
両面だから若干遅く感じたが、それでも
ちゃんと印刷されてるー。
これでプリンタでなんでもできるな。




posted by iyoder at 20:59 | Comment(0) | TrackBack(0) | PC周辺機器

プログラミングをはじめよう

金曜日は大量のデータを処理した。

解析ソフトから吐き出したCSVファイルから
欲しい値を検索して引っ張ってくるエクセルを作った。

1年前に同じ計算をしたときは、
切羽詰まってたからエクセルを作る時間がなくて、
ひいひい言いながら電卓をはじいていた。
その作業も、今では簡単に数値を引っ張ってこれる。
計算の数が増えてもコピーすれば100部材だろうが
1000部材だろうが計算できる。
成長したな。

エクセルやプログラミングはもっともっとできることを増やして
作業時間を圧縮していきたいなあ。

そんなことを考えながら
最近買った下記の本を今日読み終わった。
>アイディアを実現させる最高のツール プログラミングをはじめよう
池澤 あやか (著)




本屋でこの本を見かけたとき、
ん?と一瞬目が行った。

プログラミングのコーナーに似つかわしくない
かわいい女の子が表紙になってる。
芸能人(女優)らしい。

写真だけだと清楚なきれいな女性である。



下記のサイトに貼ってあるYOUTUBEの動画を見ると
よくしゃべり、よく動く姿は写真とギャップがありすごくかわいい!
プログラミング言語Rubyの女神と呼ばれているらしい。

>プログラミング界の女神?ギーク女優の池澤あやかがスゲェ...
http://matome.naver.jp/odai/2141982129647918001

んでfacebookに「池澤あやかのギーク道」なるサイトがある。
きれいだ。美人だ。うん。でもやってることはすごい。
>池澤あやかのギーク道
https://www.facebook.com/ayaka.rb

んで公式サイトとブログ
>Official Ayaka Ikezawa
http://ikezawaayaka.com/

>blog.ikeay.net
http://blog.ikeay.net/

本の表紙には「文系も、女子もパソコン1台で簡単に「思いつき」を叶える方法!」
と書いてある。

興味をそそられる。
「文系女子」が「プログラミング」をして何かを作るという
何か新しい組み合わせに好奇心を刺激された。
(本屋では買わずにKindleで購入。通勤電車で少しずつ読み進めた)

読み終えて思ったのは、
プログラミング言語やツールというか開発環境というか、
今は色んな種類があるんだな、
初心者でも少量のコードで簡単に高度な成果物ができるんだな、
と思った。

自分は大学1年の情報処理の講義でFortran、
大学院のレポートの計算処理用にC++を使った。
就職してからはエクセルを使うことが多いので
VBAを少しずつ覚えた。
で今はアセンブラやもう一度C++をかじり始めた。

でも、この本を読んで
もっと新しい高級言語にたくさん触れてみた方がよいのでは
ないかと思った。
というか積極的に最近はやりの言語を使うべきだと思った。
(3Dプリンタもちょっと欲しくなった)

プログラミングについてWEBで検索していると
「車輪の再発明」という言葉を時々目にする。
この本にも同じ言葉があった。
今は原初に立ち返るより、新しい便利なツールを積極的に使って
短時間で結果を出したいと思った。

Rubyはじめようかな

posted by iyoder at 00:02 | Comment(0) | TrackBack(0) | プログラム

2016年01月09日

正月太りでwifi対応高級体重計を購入

職場で久しぶりに体重の話が出る。

思い返せばダイエットを始めた8月は73kg。

2ヶ月半ジョギングで走って10月半ばは70kg。
連休に山に登ってプロテイン飲んだら
上半身に筋肉がついて73kg。

筋肉リバウンドにショックを受けて走る気も失せてしまった。

そこから3か月。
そう。職場の人は何かを感じたのだ。
言われるがまま医務室の体重計に向かうと76kg。(正確には75.9kg)

うん。過去最高体重。人生初の76kg。
走らなくなって3か月。
そして年末には12月の仕事で溜まりに溜まったストレスによる暴飲暴食。
ついでに正月のもち。

納得の理由だ。

これはやせるしかない。
ダイエットを再決意。

まず3か月ランニングステーションに
無駄に毎月何千円も自動引き落とししてたのを反省。
もったいない。
ということで解約してきた。家から遠かったのだ。
家の近くで走ればよい。
(また何かそういうのに興味が出れば
違う土地のジムか何かにでも通い始めればよい)

そして次。
自分専用の体重計を買おう。
毎日帰宅したら着衣のまま体重計に乗ろう、という考え。

どうせ買うなら最新機能の体重計を買おう。
体重より体脂肪率が大事かもしれないし。

でビックカメラに行く。
オムロンのiphoneで色々見れるやつにしよう。

ということで
HBF-253W カラダスキャンと
HBF-254C カラダスキャンのどちらにするか迷った。






253と254だから254の方が新しいのだろう。

253はwifi対応で体重を測定すると自動的にオムロンのサーバーに
体重のデータがアップロードされるらしい。
おー、ハイテク。

値段は12800円、、、まじか。
体重計で1万の大台超えてきた。

254はBluetooth対応。
違いがよくわからん。自動転送とは書いてない。
iphoneで送信ボタンでも押すと
先ほどのオムロンのサーバーにiphone経由で転送される、、のか?
ブログとか調べていると、こういう一手間あるタイプは
体重を読み込むのをだんだんめんどくさくなるらしい。

値段は253より少し安い。
10800円。こっちの方が新しい機種なのに。
まあwifi非対応で自動で転送できないからか。

すっごい悩んだが、とりあえず家ではwimaxが繋ぎっぱなしなので
自動転送できる253にした!

家で開封。

image.jpg

テカッテカでまぶしいね。

早速、初期設定しよう。

初代Surface Proにソフトをインストール。
その後、Surface Proと体重計を両端がイヤホン端子になったケーブルでつなぐ。
「次へ」をおしてどんどん先に進むと
どうやらイヤホンの中の音波で機器の設定をしているらしい。

ん、、、エラー。えー、設定できないの?

もしかしてwimaxって対応してないの?

で、対応機種を見てみる。
>Wi-Fi接続機器の対応環境
http://www.wellnesslink.jp/p/support/lglv8j00000004zk.html

やっぱりー、wimaxない。。。
何度試してもやっぱりつながらない、、
ネットで検索する。
下記のサイトに同じような悩みを持った購入者が、、
>価格.com カラダスキャン HBF-253W Wi-Fi通信設定が出来ない
http://bbs.kakaku.com/bbs/K0000676802/SortID=17794020/

えー、包装ガッツリ剥がしてもう返品なんてできないよー。


、、、、ふー。(深呼吸)

だが、僕は諦めないぞ。

wifiの種類は合っているんだ。
体重計のwifiの規格はIEEE 802.11b。
ルータの型番はWi-Fi WALKER WIMAX2+だから
IEEE 802.11 a/b/g/n準拠。

そう、つながらないはずがない。
テクニカルな何かできっとつながるはずなのだ。

、、、そうだ!
iPhoneと体重計をイヤホン端子ケーブルでつなげて設定すればつながるんじゃないか?
iPhoneにウェルネスリンクの専用アプリをインストール。
>からだグラフ for iPhone
http://www.wellnesslink.jp/p/about/app05.html
機器設定で急いで繋げてみる。。。。

。。。。。。。きたー!
繋がったーーーさすが俺(しぶといぜ)

いやあ、価格.comの繋がらなかった人にも
伝えたい。wimaxでもつながるよーーーーと。
早速体重測定。

image.jpg

う、、76.55kg、、、増えてる。
(まあ、会社の体重計とは色々違うよな。服装も違うし。)

image.jpg

うん、ちゃんとwifiで転送されて
iphoneでも体重、体脂肪率、骨格筋率が見れる。
体重76.55kg
体脂肪率25.4% やや高いではなく「高い」に該当、、
        (10.0%〜19.9%が「標準」、20.0%〜24.9%が「やや高い」)
骨格筋率34.1% 標準だ。(32.9%〜35.7%が標準)

うーん、ほんとはもっと項目があるはずなのにiPhoneでは3つしか見れないなあ。

骨格筋についてはウェルネスリンクのサイトより
http://www.wellnesslink.jp/p/diet/basic/kjkb40001.html
>骨格筋とは運動して増やせる筋肉のことで、筋肉全体の約40%を占めています。

骨格筋率が上がれば代謝が上がるということだな。

ウェルネスリンクのPC用のサイトで見ると
iPhoneでは表示されない他の項目もちゃんと転送されていた。

ウェルネスリンク.JPG

BMI 27.8     えー。ショック。肥満(1度) (18.5以上25未満が標準)
基礎代謝1716kcal  お、代謝は少し高め。    (30〜49歳男性は1530kcalが目安)
内蔵脂肪レベル12  やや高いに該当。      (1〜9が標準)
体年齢44歳  ほんとは32歳なのに。

>体重体組成計でわかること
http://www.healthcare.omron.co.jp/product/hbf/guide/02.html

これぞIoTだ。(Internet of Things)
新年早々の無駄遣い。あーいいストレス発散になった。
今年は頑張って体重減らそう!



2016年01月06日

EdgeだとGmailにドラッグ&ドロップできない

ふー、
windows10に変えてからもう半年以上経つな。

とある駅のホーム。

電話が鳴る。
会話する。

結果、胸ポケットに入っているUSBの中にあるDocuWorksのファイルを
付属のPDFプリンタ(DocuWorks PDF Creator)で
急ぎPDFにしなければいけなくなった!

ってどんな状況やねん。

僕はたまたま我らが初代surface proが
鞄に入っていたので、
淡々と電源を立ち上げUSBを挿す。
DocuWorksを立ち上げ、PDFプリンタでPDFにする。

あれ?

デスクトップに作ったはずのPDFが見当たらない。
、、、あった。
”e”って書いた白いファイルに.pdfの拡張子が!
なんだこれ。

PDF.JPG

どうやらMicrosoft Edgeに関連づけられているらしい。
windows10にしてから今まで気づかなかったのか?

PDFといえばAdobe Reader。
赤いファイルじゃないと気付かないって!

ここまでで地味にタイムロス。

さて、急いでPDFをメールしなきゃ。
Gmailで新規メール作成。
本文を書く。

よし、ファイルを添付すれば送信できるぞ。
→ファイルを添付、、、っと

ん、、、Gmailのメール本文にPDFをドラッグアンドドロップしても
赤斜線のアイコンが出て添付できなーい。
何で?いつもできたのに。

って、いつもといっても最後にやったのはいつだ?
もしかしてwindow10にしてからSurface proでGmailにファイルを添付したの
初めてか?そんなばかな。

どうやらMicrosoft EdgeにはデスクトップやエクスプローラからWeb上に
ファイルをドラッグアンドドロップできないようだ。

下記のサイトにもそれっぽいことが書いてある、、
>Browser
>Microsoft Edge で 外部からのドラッグアンドドロップが動作していない可能性
> - Windows 10 Insider Preview Build 10240(追記)
http://browser.hatenablog.com/entry/2015/07/17/191443

おいおい、
insider Previewからそうなら直してくださいよ、Microsoftさん。

というわけで、
さらに地味なタイムロス。
たかだかPDFにしてメールで送るだけの作業なのに
駅のベンチでイライラしちゃったじゃないか。大人げない。

とりあえず、無事メールを送り終えた後、
PDFファイルを右クリックしてプロパティから
ファイルに関連付けられたプログラムを
Adobe Readerに直したのでした。




そもそもOSが変わるとPDFの仕様が変わるのはこれで2回目だ。
昔々の話を振り返ると
時は3年前(?)。日本で初めて初代Surface proが発売されたとき。
予約して発売日初日に購入した。

最初に気付いたのはやはり、DocuworksからPDFプリンタでPDFを作ろうとしたとき。
PDFプリンタがエラーで動かなかった。

Docuworksとは魔法のソフト。(ただの文書管理ソフト)

それまでメールで届いたPDFの書類をプリンタで紙に出力して
手書きで絵や文字を書いてスキャナでスキャンして、メールに添付して返信していた。
これがすさまじくめんどくさい。

なぜって、デスクと複合機までの距離が遠すぎる。

てくてく歩いて、スキャンして失敗してたときなんか災難だよ。
だからPDFに直接パソコン上で文字や絵を書き込んで返信すれば
歩かなくて済む。。もとい、無駄なルーチンワークが減る。

んで、あまりに気に入ったので、
3年前に私物でDocuworksを1ライセンス購入して買ったばかりの初代Surface proに入れた。



そしたらDocuWorksの.xdwの拡張子ファイルからPDFプリンタでPDF化できない。

あの時はそんなーって思ったよ。ほんと。

日本で出たばかりのWindows8proで、タブレット用のアプリだけでなく、
XPのパソコンで使ってたソフトも全て使えるのが初代Surface proの魅力だと思って買ったのに
DocuWorksのPDFプリンタが使えないなんてさ。

で、調べに調べたところ、原因が分かったのさ。

Microsoft の「リーダー」と呼ばれるタブレットモード用のPDFリーダーが
全てのPDFファイルに関連付けられてたからだったのだ。

下記はその当時見つけたメーカーのページ。(直接の内容ではないが、似たような話)
>DocuWorks 7のWindows(R) 8への対応状況 富士ゼロックス
http://www.fujixerox.co.jp/support/software/docuworks/info/info_win8.html
>Windowsストア アプリのリーダーをPDFファイルを開くアプリケーションに設定している場合、
>PDFファイルをDocuWorks Deskにドラッグ&ドロップしてDocuWorks文書に変換すると変換処理に
>失敗します。Desktopアプリケーションを利用して変換してください。

AdobeからDesktop用のAdobe Readerをダウンロードして
インストールしたら、きちんとDocuworksからPDFにできたのであった。
以後の3年間の初代Surface proの大活躍は言うまでもない。



、とそんなこともあったなあ。
今後もOSの更新とPDFの関係には要注意だな。





posted by iyoder at 20:28 | Comment(0) | TrackBack(0) | surface

2015年12月31日

main関数を覗いてみる

アセンブラの勉強の続き



前回、逆アセンブラしたC++で書いたコードのexeファイル。
もともとのC++のコードは下記のような感じ。


#include

void swapptr(char **x, char **y)
{
char *temp = *x;
*x = *y;
*y = temp;
}

int main(void)
{
char *a = "ABC";
char *b = "123";

printf("a = %s\n", a);
printf("&a = %p\n", *a);
printf("b = %s\n", b);
printf("&b = %p\n", *b);

swapptr(&a, &b);

printf("a = %s\n", a);
printf("&a = %p\n", *a);
printf("b = %s\n", b);
printf("&b = %p\n", *b);

return (0);
}


swapptr関数部分は下記のサイトの内容を基にしている。
>二つのポインタ値を交換する関数はどのように実現すればよいでしょうか。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00024.html

printf関数部分の*aとか&aとかよくよく見ると「ポインタのポインタ」を使ってから
どれが何だか分からなくなってきたのでたぶん表示が間違っているかも。
(そこらへんはご容赦)

前回の記事でswapptr関数部分の逆アセンブラしたコードは載せたが、
それだけじゃぜんぜんVBでポインタの付け替えができるようになる気がしない。
もう少しアセンブリ言語に詳しくならなくては!

main関数部分を逆アセンブラした結果を下記に示す。

push rbp
push rdi
sub rsp,128h

lea rbp,[rsp+20h]
mov rdi,rsp
mov ecx,4Ah
mov eax,0CCCCCCCCh
rep stos dword ptr [rdi]
mov rax,qword ptr [__security_cookie]

xor rax,rbp
mov qword ptr [rbp+0F8h],rax

lea rax,[??_C@_03FFFJFKND@ABC?$AA@]

mov qword ptr [rbp+8],rax
lea rax,[??_C@_03EFKIOLOJ@123?$AA@]

mov qword ptr [rbp+28h],rax
mov rdx,qword ptr [rbp+8]
lea rcx,[??_C@_07LLAODNH@a?5?$DN?5?$CFs?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
mov rax,qword ptr [rbp+8]
movsx eax,byte ptr [rax]
mov edx,eax
lea rcx,[??_C@_08HLDGGNGA@?$CGa?5?$DN?5?$CFp?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
mov rdx,qword ptr [rbp+28h]
lea rcx,[??_C@_07IFDPOEDE@b?5?$DN?5?$CFs?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
mov rax,qword ptr [rbp+28h]
movsx eax,byte ptr [rax]
mov edx,eax
lea rcx,[??_C@_08PFLJGKID@?$CGb?5?$DN?5?$CFp?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
lea rdx,[rbp+28h]
lea rcx,[rbp+8]
call @ILT+10(?swapptr@@YAXPEAPEAD0@Z) ; swapptr関数の呼び出し
mov rdx,qword ptr [rbp+8]
lea rcx,[??_C@_07LLAODNH@a?5?$DN?5?$CFs?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
mov rax,qword ptr [rbp+8]
movsx eax,byte ptr [rax]
mov edx,eax
lea rcx,[??_C@_08HLDGGNGA@?$CGa?5?$DN?5?$CFp?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
mov rdx,qword ptr [rbp+28h]
lea rcx,[??_C@_07IFDPOEDE@b?5?$DN?5?$CFs?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
mov rax,qword ptr [rbp+28h]
movsx eax,byte ptr [rax]
mov edx,eax
lea rcx,[??_C@_08PFLJGKID@?$CGb?5?$DN?5?$CFp?6?$AA@] ; メモリからrcxレジスタに移動

call @ILT+460(printf) ; printf関数の呼び出し
xor eax,eax
mov edi,eax
lea rcx,[rbp-20h]
lea rdx,[140019CC0h]

call @ILT+310(_RTC_CheckStackVars) ; _RTC_CheckStackVars関数の呼び出し
mov eax,edi
mov rcx,qword ptr [rbp+0F8h]

xor rcx,rbp
call @ILT+730(__security_check_cookie) ; __security_check_cookie関数の呼び出し
lea rsp,[rbp+108h]

pop rdi
pop rbp
ret

callコマンドで関数を呼び出しているのか、、
後半、printf関数が4回使われて、swapptr関数が使われて
再度、printf関数が4回使われていることが分かる。
あと、最後に知らん関数が2つ使われている。

printf関数の1つ前にいつもleaコマンドがある。
leaはmovに似ているらしい。

>むむむ雑記 MOVとLEAを比較
http://mumumu-pg.hatenablog.com/entry/2014/07/20/204952

メモリからレジスタへの移動。
何を移動しているんだろう。

最後のpopはスタックからデータを読み込むコマンド。

>IT pro【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう! 第2回
http://itpro.nikkeibp.co.jp/members/ITPro/ITBASIC/20021220/1/?rt=nocnt

スタックとは調べると
「最後に入力したデータが先に出力されるという特徴をもつ、データ構造の一種」
後入れ先出しの構造。
よくわからん。

下記のサイトによると
メモリの中の一部らしい。それもメモリの一番後半部分らしい。
>アセンブリ言語の基礎知識 Part 4
http://ings.sakura.ne.jp/prog/asm4.html


さて、コードの一番最初に戻ると、
前半部分はchar変数の宣言をしているだけのはずなのに
なんでこんなに長いんだろう。

pushはスタックにデータを書き出すコマンドらしい。

push rbp ; RBPレジスタは5番目の汎用レジスタ。pushでスタックに書き出し。
(退避か?)

push rdi ; RDIレジスタは7番目の汎用レジスタ。pushでスタックに書き出し。
(退避か?)

sub rsp,128h
; RSPレジスタは8番目の汎用レジスタ。
128hは16進数。(16^2×1+16^1×2+16^0×8)=256+32+8=296
RSPレジスタの値から296を引き算するということ。

lea rbp,[rsp+20h] ;RSPレジスタの示す位置+32bit位置の値をRBPレジスタに移動

mov rdi,rsp ;RSPレジスタの値をRDIレジスタに代入。

mov ecx,4Ah ;ECXレジスタに4Ah=16^1×4+16^0×10=74を代入。

mov eax,0CCCCCCCCh

;EAXレジスタに
0CCCCCCCCh
=16^7×12+16^6×12+16^5×12+16^4×12+16^3×12+16^2×12+16^1×12++16^0×12
=3435973836を代入。


rep stos dword ptr [rdi]

;rep命令はecxレジスタの値が0でなければ
後続のストリング操作命令を実行してecxレジスタの値を1減らし、
ecxレジスタの値が0になるまで繰り返す。(下記サイトより)
>T.T Land 6.ストリング操作命令による文字列の操作
http://hp.vector.co.jp/authors/VA014520/asmhsp/chap6.html
現在ecx=74なので74回次のコードを繰り返すのだろう。


mov rax,qword ptr [__security_cookie]

;qwordは64bit。下記のサイトより
__security_cookieはバッファオーバフローチェックを
する関数らしい。その結果か何かがRAXレジスタに
代入されるのかな?

>ここのことはなかったことにするかも
http://d.hatena.ne.jp/yellow_73/20070905


xor rax,rbp

;XORコマンドは「排他的論理和」。
両方とも同じなら0、異なる 場合は1らしい。
RBPレジスタの値はもともとRSPレジスタの示す位置+32bit位置
に入っていた値が格納されているはず。
RAXレジスタにはバッファーオーバーフローのチェック結果が
格納されているはず。


mov qword ptr [rbp+0F8h],rax XORコマンドの結果の0か1がRBPレジスタ+248bitの位置に代入。


、、、と1個1個見ていっても
なにかの値を移動していることくらいしか分からない。

char *a = "ABC";
char *b = "123";

はどこ?
→12行目〜16行目
lea rax,[??_C@_03FFFJFKND@ABC?$AA@]

mov qword ptr [rbp+8],rax
lea rax,[??_C@_03EFKIOLOJ@123?$AA@]

mov qword ptr [rbp+28h],rax
mov rdx,qword ptr [rbp+8]
ここらへんに相当するのかな?

ABCの前にある「@_03FFFJFKND」
と123の前にある「@_03EFKIOLOJ」は何だろう。検索しても出てこない、、

とまあ、だらだら書いてしまった。
結局何をしているのかわからなかったが
色々コマンドは勉強になった。
次はもっと簡単なコードを逆アセンブラしてみよう。

あと新年からは下記のサイトのVBからアセンブラ実行も
少しチャレンジしたい。

>t-hom’s diary
http://thom.hateblo.jp/entry/2015/08/03/014648
>Programming Field - プログラミング Tips
http://pf-j.sakura.ne.jp/program/tips/vbasm.htm

とりあえず上記のサイトのコードをそのままコピペして
Sub Test()
Debug.Print MyWPrintF("Result: %d, %1.3lf", 12, CDbl(1.245))
End Sub
を実行してみた。
動かなかった。。。ん?Debug.Printとはなんぞや?
イミディエイトウインドウに出力されるらしい。

VBで機械語.JPG

あ、できてるー!
C言語のswprintf関数と同じ結果を実行できるらしい。
他のコードもできるようにしたいなあ。


posted by iyoder at 20:03 | Comment(0) | TrackBack(0) | プログラム

2015年12月30日

はじめての逆アセンブラ

VBでポインタの付け替えがしたくて
始めたアセンブラの勉強。



でもいっこうにできるようになる気配がない。
C++側からアセンブラ側の関数にポインタ&a、&bを渡して

mov rax, rcx
mov r8, rdx
mov rcx, r8
mov rdx, rax

でポインタを入れ替えても
C++側のaとbの値は全く入れ替わっていなかった。

、、、レジスタはレジスタだから
メモリではないということか?
レジスタではなくaとbを記憶している「メモリ」
をいじらないといけないということか?

アセンブラでメモリを操作することを覚えないといけない、、のか?

先が遠いなあ。

で、考えた。
c++では簡単(なはず)なのだ。

void swap(int *x, int *y)
{
int tmp;

tmp = *x;
*x = *y;
*y = tmp;
}

という関数はよく見かける。(パッと見簡単そう。)

試しにC++で実行してみる。

swap.JPG

ん、、、
関数にポインタ渡して、関数の中で処理されたことが
関数の外に反映される、、、どこかで見たような。
VBAの参照渡しと同じか?
&aと&bのアドレスが関数の前と後で変わっていない、、、


どうやら下記のサイトによると
ポインタではなく
「ポインタのポインタ」というものを使うらしい。

>二つのポインタ値を交換する関数はどのように実現すればよいでしょうか。
http://www.bohyoh.com/CandCPP/FAQ/FAQ00024.html

ただ、上記サイトをそのままコピーしたら
エラーで回らなかった。
void **xをchar**xにしないと回らなかった。
(intにしても回らなかった、、なんでだろ)

まあ、charでもいいか。
その結果の実行画面は下記の写真。

ポインタのポインタ.JPG

おー、ちゃんと数値もポインタも入れ替わってる。
やったー。
これがポインタの付け替えか。

試しに上記コードをC++で書いて、ビルドしてexeファイルを作って
逆アセンブルしてコードをアセンブリ言語のコードを確認すれば
アセンブリ言語のポインタの付け替えが分かるのではないか?

よし、逆アセンブラで検索。

で下記の連続したサイトを見つける。
>第3章 逆アセンブル(1)
http://masm.kmycode.net/pecoff/3.html

>第4章 逆アセンブル(2)
http://masm.kmycode.net/pecoff/4.html

サイトに書いてあるように
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\binの中には
「dumpbin.exe」があった。
サイトの記載と違って
「mspdb140.dll」もあるようだから、とくにdllをどこかから入手する必要はないのだろう。
ダブルクリックしてもコマンドプロンプトにコマンドのオプションがきちんと
列挙された。

、、いける気がする。

まずはC++からアセンブリ言語の関数を呼び出すように作った
exeファイルを逆アセンブリしてみよう。

2つ目のサイトに記載してあったコマンドを
コピーペーストするが、エラーでそのようなコマンドはないと表示される。

、、、だめじゃん。

ん、、でも前にも似たようなことがあったような?
環境変数でpathを設定すればいいのかな?
ということでシステムの詳細設定で環境変数で
dumpbin.exeのあるフォルダのパスを設定。
コマンドプロンプトを一端閉じて再度開いて、
test.exeのある場所にcdコマンドで移動して、、
いざ
dumpbin /disasm /out:dump.txt test.exe

お、なんか動いた!

そしてtest.exeのあるフォルダの中に、
dump.txtファイルができてるー。
やったー!

でテキストファイルを開いてみると、、
あれ?長いぞ。
こんなに長いコード書いてないのに。

中身を見ていると
全体の1/5くらいのところに確かに自分が書いた
アセンブリ言語の9行のコードがあった!
逆アセンブラ成功だ。すごいな。

ただ、それ以外の部分がほんとに長い。
C++が高級言語だということを表しているのか?
それとも#include で読み込んでいる部分か?

まあ、いいや。
次はswap関数をC++で書いてexeファイルを逆アセンブラしてみよう。

char *temp = *x;
*x = *y;
*y = temp;

C++だとたった3行が
逆アセンブラすると下記の25行にもなる。
8割がたまだ勉強していないレジスタ名やコマンド名。
少しずつ理解していくしかないな。

mov qword ptr [rsp+10h],rdx
mov qword ptr [rsp+8],rcx
push rbp
push rdi
sub rsp,0E8h

mov rbp,rsp
mov rdi,rsp
mov ecx,3Ah
mov eax,0CCCCCCCCh
rep stos dword ptr [rdi]
mov rcx,qword ptr [rsp+108h]
mov rax,qword ptr [rbp+100h]

mov rax,qword ptr [rax]
mov qword ptr [rbp+8],rax
mov rax,qword ptr [rbp+100h]

mov rcx,qword ptr [rbp+108h]

mov rcx,qword ptr [rcx]
mov qword ptr [rax],rcx
mov rax,qword ptr [rbp+108h]

mov rcx,qword ptr [rbp+8]
mov qword ptr [rax],rcx
lea rsp,[rbp+0E8h]

pop rdi
pop rbp
ret

ただ、上記のアセンブリ言語で書いた関数を
C++から呼び出して実行すると
ほんとにC++で書いた時と同じ実行結果が得られる。

ポインタのポインタ.JPG

さすがアセンブリ言語。一対一対応が強みだな。

あとは
関数の宣言文。
**xや**yの部分をどう記述しているかだな。

main関数の中の、
swapptr(&a, &b);
は下記のようになっているのかな?

call @ILT+10(?swapptr@@YAXPEAPEAD0@Z)
mov rdx,qword ptr [rbp+8]
lea rcx,[??_C@_07LLAODNH@a?5?$DN?5?$CFs?6?$AA@]

もう適当なアルファベットの羅列すぎて判別できないな。
posted by iyoder at 18:06 | Comment(1) | TrackBack(0) | プログラム

2015年12月13日

久しぶりのc++で初exeファイル作成

64ビットアセンブラを勉強し始める。

まずはVisual Studio Express 2015 for Windows Desktop
をダウンロードする。
>Visual Studio Express
https://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx

どうやらこの「64ビットアセンブラ入門」は
c++のコードから関数としてアセンブリ言語のコードを呼び出すようだ。



だからc++を少し使う。

大学院時代以来だ。

とりあえずサンプルプログラムを実行。
ctrl F5で「デバッグなしで開始」

、、、あれ?
なんかショートカットが使えない。
スタートアップの「WebとWindowsを検索」が最前面に表示された。
surface proのキーボード仕様のせいか。
F5のキーに検索の虫眼鏡マークが書かれている、、

しかたなくマウスで「デバッグなしで開始」をクリック。

c++サンプル.JPG

おー、、、、しょぼ。さすがサンプル。
ただ確かにアセンブルで書いたコード(たった1行だけど)が
実行されている。(詳しくは本を買って読んで参照ください)

複数のプログラミング言語(c++とアセンブリ言語)で1つのプログラムができるのが面白い。
まあ、でも結局0と1のマシン語に置き換えられるんだから納得だ。

このまま読んでいくのも面白そうだが、
少し脱線してみたくなった。

exeファイルはどう作るのだろう、、、
→ビルドっするとDebugフォルダにできるらしい。
→Debugフォルダにexeファイル含む3つのファイルができていた。

exeファイルをクリック→コマンドプロンプトらしきものが一瞬見えたが
何も起きない。
ようするに変数に1を代入しただけのプログラムだから
コマンドプロンプトが一瞬動いて閉じて終了したということか?
ちゃんと動いているか分からない。

よし
テキストファイルを出力させてみよう。
検索。下記のホームページを発見。
>テキストファイルの読み書き
http://homepage3.nifty.com/mmgames/c_guide/17-01.html

そのままペーストして実行。

え、エラー。なんで?

また検索。下記のサイトを発見!
>kenpi20の灰色マインドマップ日記
http://kenpi20.hatenablog.com/entry/2014/11/01/235634

どうやらfopenというコマンドが使えないらしい。
最近の開発環境でビルドすると。
セキュリティ強化の関係らしい。
fopen_sというコマンドを使うらしい。

同ページにある下記のリンクより書き換え方法がわかった。
>fopen_sとかsscanf_sとかの"_s"関数書き換え例まとめ
http://blog.livedoor.jp/mrcom511/archives/51270788.html

sampleフォルダにテキストファイル「test1.txt」が吐き出された。
中を見るとアセンブリ言語で1行書いたコードのa=1の「1」が
ちゃんと書き込まれていた。(当たり前だけど)

アセンブリ言語コード部分をaに100を代入するよう書き換えると
テキストファイルも100に変わっていた。

ビルドしてDebugフォルダにできたexeファイルを実行すると
隣にさっきと同じ「test1.txt」が吐き出された。
ファイルを開くとやっぱり中に100の数字があった。

初exe作成.JPG

初exe作成2.JPG

大学のときはレポート書くための演算でc++をかじっていただけで
exeファイルを作ったことはなかった。
先日nasmでアセンブルしてexeファイルを生まれて初めて作ったが、
今回久しぶりのc++で初めて作ったexeファイルはもっと感動。
あたりまえでほんとにしょぼい内容だけど、、

自分の生活を便利にするexeファイルをたくさん作りたいなあ

posted by iyoder at 02:31 | Comment(0) | TrackBack(0) | プログラム

2015年12月10日

脱線につぐ脱線

仕事でCADを使う。
仕事で計算するソフトを使う。
計算ソフトのデータから勝手に図面を書いてくれないものか。。

最近はソフトメーカーもそういった連携に対応している。
サーキャドとか。
でも試験段階というかユーザーはまだ手探り。

数独とかパズルゲームとかの感覚で
日々の頭の体操がしたいと思っていたので、
10月末から寝る前にプログラムの勉強を毎日することにした。

エクセルが得意なので
やっぱりVBAを勉強する。

@データ検索の関数を作成

計算ソフトから吐き出したCSVファイル内を検索し、
座標データを取得するfunctionプロシージャを作成した。
そう、vlookup関数やmatch関数+index関数と同じことを
自分の作ったプロシージャでできるようにした。

といっても
まだCSVファイル内を検索している訳ではなく、
エクセルのシートにコピー&ペーストして
シート内を検索している。まだまだ不勉強。
このとき勉強したのが
検索するエクセルシートのデータの最終行、最終列を
取得する方法。
下記のサイトより。

>No.8 ワークシートの最終行、最終列を取得する
http://www.niji.or.jp/home/toru/notes/8.html

これにより、プログラムの動作時間は最小限になる。
ま、あんまり変わらないか。

A取得した座標を使ってエクセルからAutoCADに線や文字を書く

んで、取得した座標データをAutoCADのコマンドラインにに送信するSubプロシージャを作成した。
AutoCADとの連携で参考にしたのは以下のサイト。
>エクセルでAutoCADを自動作図させる方法
http://excelvba.info/index.html
この頁、点を繰り返し書く方法が記載されているが、
最初に見たときは線や円や文字の書き方が書いてあった気がする。
(最近書き換えたのかな?)

いざエクセルVBAのプログラムでAUTOCADの作図が
できるとなると、楽しいもので、
レイヤを指定して線を書く関数を作り
レイヤを指定して丸を書く関数を作り
レイヤを指定して四角を書く関数を作り
レイヤを指定して文字を書く関数を作り、、
コマンドでできる操作は全て上記のホームページの方法で
エクセルVBAで作図できる。

Bダイアログのコンボボックスの各インデックスの文字列を取得する。

ここまでVBAで関数を作った段階で、脱線し始めた。
AUTOCADで「-xref」というコマンドで外部参照の
ダイアログが開く。
外部参照でいつもは図面枠を貼り付けている。
コマンドラインを使って全自動で作図したい人間にとって
ダイアログが開く系のものは困る。
ファイル名をテキストボックスに打ったり、開くのボタンを押すなどの
手動操作が出るからだ。

外部参照ダイアログ.JPG

ファイル名を入力する箇所はComboBoxクラスになっている。
コンボボックスのインデックス数はCB_GETCOUNTとSendmessageで取得できる。
インデックス数は2だったのでインデックス番号0の時と1の時の文字列を取得したいが
SendMessageStr(hwnd, CB_GETLBTEXT, num1, StrBuf)として送っても
バッファStrBufに文字列が返ってこない。


以後3週間何をやっても文字列を取得できない失敗の日々が続く、、、、


で試行錯誤の末、buf=SendMessage(hwnd, CB_GETLBTEXTLEN, num1, 0) にて
先に文字列の文字数を先にしっかり取得し、
LngLen = buf + 1
StrBuf = String(LngLen, "1")
buf2 = SendMessageStr(hwnd, CB_GETLBTEXT, num1, StrBuf)
といったように
文字数以上のバッファを用意しておけばきちんと文字列が
返ってくることに気付く。

色々調べているとCB_GETLBTEXTというメッセージの種類で
エラーで困っている人がしばしばいた。僕と同じ。

なかには
他のプロセスとSendmessageをやり取りするため
共有メモリなるものをVirturalallocex関数で確保し、
共有メモリのポインタをSendmessgeにて渡すという技を使っている以下のホームページもあった。
>全てのウィンドウとコントロールの情報を表示するサンプル(VB6)
http://homepage2.nifty.com/nonnon/SoftSample/SampleEnumWindows.html

ただ、このホームページにある
SendMessageByVAEString = SendMessage(hWnd, wMsg, wParam, lngVirtual)
のlngVirtualはVirturalallocex関数で確保した共有メモリの開始アドレスで
型はlong型。
sendmessageでlong型を第4引数に入れてしまうと、
何もメモリに書き込まれなかった。
ReadProcessMemory関数で開始アドレスlngVirtualから文字列を読んだが、
何も書き込まれていなかった。

んで
僕は思った。
VB6.0の限界だ。(VBAの限界だ。)

sendmessage関数の第4引数は文字列変数でなければならないのだ。たぶん。
やりたいことは文字列変数のポインタをlngVirtualの値に変えたい、ということ。
ポインタの付け替え。
これはVB6.0(VBA)ではできないのだ。たぶん。

Cアセンブラを覚えよう!



んで
調べたところ
下記のホームページを発見。
>t-hom’s diary
http://thom.hateblo.jp/entry/2015/08/03/014648

機械語と一対一対応するアセンブリ言語を
VBAで実行し、ポインタによる変数の付け替えを行うという記事。
この記事を読むがまま、僕は流され、
amazonで独習アセンブラという本を購入してしまうのであった。

image.jpg



この本を読んで僕はnasmというアセンブラに出会う。
ただ、nasmをインストールする2頁ほど読んで
nasmをダウンロードし、Cドライブに解凍する。
そしてストップする、、あれ?この後どうしたらいいんだ?
windowsの部分の記載不親切だよ、、
どうやったら使えるようになるのかわからない。

んで
調べて調べて下記のホームページにたどり着く。
>Division by Zero アセンブラでWin32APIを使ってみる(MessageBox編)
http://moge32.blogspot.jp/2013/03/asmwin32apimesbox.html

>NASM の入手
http://bb-side.com/modules/side04/index.php?content_id=14

リンカとWIN32.LIBを追加でダウンロードした。
どうやらコマンドプロンプトを使うようだ。
BATファイルの勉強をした際の経験が役に立ったぞ。
nasmのexeファイルのある場所にcdコマンドで移動し、
例題のコマンドを打ち込んでアセンブル。
生成したオブジェクトファイルと win32.lib をリンクしてexeファイルを生成。
exeファイルを実行するとMessageBoxにHello Worldが表示された。

ここまで来れば、「独習アセンブラ」の内容も分かるはず!
いざ本の通りに打ち込んでみると、
我が初代surface proは64bitマシンのため.com形式のファイルは
エラーとのこと。なにー!?

せっかく買った本が、、無駄か?

次の日の会社帰りに僕は「64ビット アセンブラ入門」を購入。

image.jpg




あー、またいつもの衝動買い。無駄遣い癖がでた。
その本ではc++からアセンブリ言語関数を呼び出す、、とか
Visual Studio Express 2013 for Windows Desktop、、とか書かれているので、
最終的にはC言語を勉強したくなるであろう、という読み。

で、そんなことを考えていると
目の前にC言語の本が!
で「苦しんで覚えるC言語」を買ってしまうのであった。
あー無駄遣い。間違いない。

image.jpg



このまま行くと
いずれPython(言語)を勉強して
人工知能の勉強をするのも非現実的な話ではない気がしてきた。
なーんて。
ただこんなバカをいっぱいやるのもいい頭の体操にはなるな。
posted by iyoder at 23:55 | Comment(0) | TrackBack(0) | プログラム

無駄知識いろいろ

これまでいろいろ調べて勉強してきた
無駄知識をここに記載しておこう。

@2つの検索値でエクセルのvlookup関数を使う

調べたのは4年くらい前かな。
”&”でつなげて新しい検索列をつくる方法。
>エクセル VLOOKUP 関数の使い方をわかりやすく解説
http://www.tipsfound.com/Excel/04vlookup2.vbhtml

エクセルを仕事で使っていると
vlookup関数を使う。
vlookup関数の検索値に同じものが2つ以上あると
上手く検索ができない。

仕事上、通りと通りの交点の二次元座標および
高さ方向を含めた三次元座標を扱う。
表形式のデータだと同じ通り名が複数現れるため
どうしても複数の検索値でvlookup関数が使えたらなあと思っていた。
使えるようになるとその効果は絶大だ。
平面の世界と表が関数でリンクする。

(ちなみに同僚に教えたら7日かかる作業が1日で終わった、と喜ばれた)

これをきっかけにエクセルやマクロ・VBAやその他プログラミング、などによる
仕事効率化に興味を持つ。


Amatch関数とindex関数でvlookup関数の応用

検索値にヒットしたセルから上下左右に相対的な位置のセルの値を取得できる。
2つの関数を組み合わせることでvlookup関数の強化版ともいえる
検索が可能となる。

>EXCELで検索した値の下のセルの値を表示したい
http://okwave.jp/qa/q1450158.html


Bdropboxを使ってパソコンを遠隔操作

Batchファイルをdropboxに入れておき
コントロールパネルのタスクスケジューラで
タスクの登録。
Batchファイルを1時間置きに読みに行き実行するよう
設定する。

>Dropboxのちょっと変わった使い方(基本編)
>http://krasavkana.com/archives/1008

操作される側のパソコンにしか入っていない解析プログラムを
別のパソコンから使えないかなあ、と思って調べたら見つけた。

初めてBatchファイルを覚えようと思ったときは
たしか以下のサイトから始めた気がする。

>開発に役立つ,BATファイルの書き方・パターン集
>(コマンドプロンプトの定石を体系的に学び,バッチ中級者になろう)
http://language-and-engineering.hatenablog.jp/entry/20130502/PatternsOfMSDOSorBAT

Batchファイルが置いてあるフォルダに移動して実行する場合は

rem 現在のフォルダに移動
cd /d %~dp0

も調べたなあ。


Cエクセルを開かずにマクロを実行

以下のサイトの「外部 Script でマクロを制御する」欄を使った。
>マクロの自動実行 - Excel 97
http://kobobau.mocvba.com/xls/yama/vba/runmacro1.html

いやあ、すごいなあ。世の中なんでもできるなあ、と思った。

VBAで計算した値を
エクセルのセルに返している場合は
VBAの最後にエクセルのファイルを
上書き保存する文を足すのがコツだな。

VBAを自動実行しても保存まで
自動でやらないと、
結果の記録が残っていないから。

D別のソフトのボタンを押す。

BとCで離れたパソコンでエクセルのマクロを自動実行できるように
なったけど、他の解析プログラムの実行ボタンをクリックするプログラムを
VBAで作れないかなあと、悩んで調べた挙句、
下記のホームページから
APIと呼ばれる関数を学ぶことになる。

>ExcelVBA.net
http://www.excel-vba.net/excel-api-010.html
Sendmessage関数。
Windowsを操作する関数のようだ。

これはさすがに単体では
努力の割にできたことがボタン1個押すだけとは悲しかったなあ。
応用すれば色々できるんだろうけど。

ここからひたすらAPIについて
学ぶことになる。

Findwindow関数やらenumchildwindows関数やらを使い、
開くボタンのウインドウハンドルを取得。
Sendmessage関数を使用してボタンを押す命令を送る。
四苦八苦したけど、無事ボタンを押せるようになった。

dropboxとタスクスケジューラでBatchファイルからVBSファイルを実行させて
別のパソコンを操作して、、最後はボタンひとつ押した。
悲しい。。これぞ無駄知識。
なんてことして遊んだなあ。


posted by iyoder at 03:41 | Comment(0) | TrackBack(0) | プログラム
最新記事
<< 2021年01月 >>
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
カテゴリーアーカイブ
ファン
プロフィール
最新コメント
×

この広告は30日以上新しい記事の更新がないブログに表示されております。