sshaskpass.exe を(自作して)置き換えます。
現状のもの:
自作したもの: MyPasswordPrompt
[Proceed] を押すと、Console.Write します。
[Save and proeed] を押すと、Console.Write してから保存します。同じ質問を与えると、同じ答えを設定した状態で表示します。
大変残念ながら、TortoiseGitPlink.exe には使えない技法です。cygwin などの ssh.exe を指定してください。
sshaskpass.exe は通常つぎのように利用されています。
%SSH_ASKPASS%" display command line here: > password.txt
コマンドラインに "pass" が含まれていたら、入力文字列を *** で隠します。
2017年1月24日火曜日
2017年1月21日土曜日
Rx SubscribeOn と ObserveOn の使い分け
端的に述べますと、
SubscribeOn = ワーカースレッド
ObserveOn = UI スレッド
こちらのコード例が見事です。ご覧ください!
[Android] OkHTTP + Retrofit + RxAndroid で REST クライアントを実装する
http://dev.classmethod.jp/smartphone/android/okhttp-retrofit-rxandroid/
東京の天気を取得して、画面に表示するようです。
「東京の天気を取得」がワーカースレッド。
「画面に表示」を UI スレッドで実行するようになっています。
SubscribeOn は、最初の ObservableOn より前の処理に適用されます。
ObserveOn は、それより後の処理に適用されます。2 個目以降の ObserveOn も同様です。
図にするとこのようなイメージです:
SubscribeOn = ワーカースレッド
ObserveOn = UI スレッド
こちらのコード例が見事です。ご覧ください!
[Android] OkHTTP + Retrofit + RxAndroid で REST クライアントを実装する
http://dev.classmethod.jp/smartphone/android/okhttp-retrofit-rxandroid/
東京の天気を取得して、画面に表示するようです。
「東京の天気を取得」がワーカースレッド。
「画面に表示」を UI スレッドで実行するようになっています。
// 非同期処理の実行
adapter.create(WeatherApi.class).get("weather", "Tokyo,jp")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<WeatherEntity>() {
@Override
public void onCompleted() {
Log.d("MainActivity", "onCompleted()");
}
@Override
public void onError(Throwable e) {
Log.e("MainActivity", "Error : " + e.toString());
}
@Override
public void onNext(WeatherEntity weather) {
Log.d("MainActivity", "onNext()");
if (weather != null) {
((TextView) findViewById(R.id.text)).setText(weather.weather.get(0).main);
}
}
});
SubscribeOn は、最初の ObservableOn より前の処理に適用されます。
ObserveOn は、それより後の処理に適用されます。2 個目以降の ObserveOn も同様です。
図にするとこのようなイメージです:
2017年1月20日金曜日
他プロセスに対する GetFocus
他プロセスがフォーカスを持っている場合は、通常 GetFocus は NULL を返します。
RegisterHotKey の処理で GetFocus をしたい場面が出てくるとします。
このようにしたらいけました。AttachThreadInput がキモですね…
GetActiveWindow == GetForegroundWindow になります。
GetFocus で、目当てのコントロールが取得できます。
RegisterHotKey の処理で GetFocus をしたい場面が出てくるとします。
#include <windows.h>
#include <stdio.h>
int main() {
while (1) {
HWND hwndForeground = GetForegroundWindow();
DWORD procId = 0;
DWORD threadId = GetWindowThreadProcessId(hwndForeground, &procId);
AttachThreadInput(GetCurrentThreadId(), threadId, true);
HWND hwndActive = GetActiveWindow();
HWND hwndFocus = GetFocus();
AttachThreadInput(GetCurrentThreadId(), threadId, false);
printf("%p %p %p \n", hwndForeground, hwndActive, hwndFocus);
Sleep(100);
}
}
このようにしたらいけました。AttachThreadInput がキモですね…
GetActiveWindow == GetForegroundWindow になります。
GetFocus で、目当てのコントロールが取得できます。
2016年12月29日木曜日
DLGINIT とは
今さら COM とか古の技術を掘り起こすのも大変な話です…
構造:
出典 (atlwin.h) より:
LOADFROMSTREAM が嫌で INITNEW にしたい場合は、つぎのようにしたら良いようです。
/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//
IDD_TOACROPDF2 DLGINIT
BEGIN
IDC_PDF1, 0x376, 16, 0
0x0000, 0x0000, 0x0c00, 0x0000, 0x20f8, 0x0000, 0x19f1, 0x0000,
0
END
構造:
WORD nIDC; WORD nMsg; DWORD dwLen; BYTE data[dwLen]; // nMsg: // ATL_WM_OCC_LOADFROMSTREAM = 0x0376, // ATL_WM_OCC_LOADFROMSTORAGE = 0x0377, // ATL_WM_OCC_INITNEW = 0x0378, // ATL_WM_OCC_LOADFROMSTREAM_EX = 0x037A, // ATL_WM_OCC_LOADFROMSTORAGE_EX = 0x037B, // ATL_DISPID_DATASOURCE = 0x80010001, // ATL_DISPID_DATAFIELD = 0x80010002,
出典 (atlwin.h) より:
// Find the initialization data (Stream) for the control specified by the ID
// If found, return the pointer into the data and the length of the data
static DWORD FindCreateData(DWORD dwID, BYTE* pInitData, BYTE** pData)
{
while (pInitData)
{
// Read the DLGINIT header
WORD nIDC = *((UNALIGNED WORD*)pInitData);
pInitData += sizeof(WORD);
BYTE* pTemp = pInitData;
WORD nMsg = *((UNALIGNED WORD*)pInitData);
pInitData += sizeof(WORD);
DWORD dwLen = *((UNALIGNED DWORD*)pInitData);
pInitData += sizeof(DWORD);
LOADFROMSTREAM が嫌で INITNEW にしたい場合は、つぎのようにしたら良いようです。
/////////////////////////////////////////////////////////////////////////////
//
// Dialog Info
//
IDD_TOACROPDF2 DLGINIT
BEGIN
IDC_PDF1, 0x378, 0, 0,
0
END
2016年12月23日金曜日
Nancy UrlReservations.CreateAutomatically: SYSTEM not in Everyone
Nancy で UrlReservations.CreateAutomatically = true を使いますと、URL を http.sys に予約させることができます。
予約済み URL : http://+:11411/
ユーザー: \Everyone
リッスン: Yes
委任: No
SDDL: D:(A;;GX;;;WD)
デバッグ環境では大変便利なのですが、ここに落とし穴が…
サービスはだいたい SYSTEM アカウントで動きます。
http://stackoverflow.com/a/24976524
netsh http delete urlacl url=http://+:11411/
予約済み URL : http://+:11411/
ユーザー: \Everyone
リッスン: Yes
委任: No
SDDL: D:(A;;GX;;;WD)
デバッグ環境では大変便利なのですが、ここに落とし穴が…
サービスはだいたい SYSTEM アカウントで動きます。
http://stackoverflow.com/a/24976524
Your service is running (most likely) under the LocalSystem (SYSTEM) account. This account is not in the Everyone security principal.SYSTEM は Everyone に含まれないそうです。そこで、サービスを動かす前に予約済み URL を削除しないといけません。
netsh http delete urlacl url=http://+:11411/
2016年12月16日金曜日
LocalDB に RESTORE をかます
LocalDB を管理するコマンドライン
sqllocaldb.exe
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe
C:\Program Files\Microsoft SQL Server\120\Tools\Binn\SqlLocalDB.exe
C:\Program Files\Microsoft SQL Server\130\Tools\Binn\SqlLocalDB.exe
sqllocaldb info
sqllocaldb start MSSQLLocalDB
sqllocaldb info MSSQLLocalDB
sqlcmd.exe -S np:\\.\pipe\LOCALDB#xxxxxxxx\tsql\query
select name from sys.databases
go
sp_detach_db [C:\Proj\...\xxx]
RESTORE DATABASE [xxx]
FROM DISK = 'C:\Proj\...\xxx.bak'
WITH MOVE 'xxx_Data' TO 'C:\Proj\...\xxx.mdf',
MOVE 'xxx_Log' TO 'C:\Proj\...\xxx.ldf'
GO
sqllocaldb.exe
C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SqlLocalDB.exe
C:\Program Files\Microsoft SQL Server\120\Tools\Binn\SqlLocalDB.exe
C:\Program Files\Microsoft SQL Server\130\Tools\Binn\SqlLocalDB.exe
sqllocaldb info
sqllocaldb start MSSQLLocalDB
sqllocaldb info MSSQLLocalDB
sqlcmd.exe -S np:\\.\pipe\LOCALDB#xxxxxxxx\tsql\query
select name from sys.databases
go
sp_detach_db [C:\Proj\...\xxx]
RESTORE DATABASE [xxx]
FROM DISK = 'C:\Proj\...\xxx.bak'
WITH MOVE 'xxx_Data' TO 'C:\Proj\...\xxx.mdf',
MOVE 'xxx_Log' TO 'C:\Proj\...\xxx.ldf'
GO
2016年12月9日金曜日
Nancy の Json の Bind で、別名を使用したい
例えば、次のような場合です。
いままで(Visual Studio 2012)はビルドが通るので気にしていませんでした。
ところが、最近のコンパイラ(Visual Studio 2015)では「・」が許されません。
なんでもコンパイラを 1 から作り直したとか。
Nancy の JSON は優秀ですが、別名指定には対応していないことが判明。OTL
nuget Nancy.Serialization.NetJSON のお陰様で、何とか次のように対応できました。これは nuget でインストールするだけで有効化されました。
using Nancy;
using Nancy.ModelBinding;
public class WWW : NancyModule {
public WWW()
: base() {
Post["/new"] = p => {
var Result = New((MyModel)this.Bind());
return Response.AsJson(new {
Result = "OK",
});
}
}
}
public class MyModel {
public String 注文・見積NO = null;
}
いままで(Visual Studio 2012)はビルドが通るので気にしていませんでした。
ところが、最近のコンパイラ(Visual Studio 2015)では「・」が許されません。
なんでもコンパイラを 1 から作り直したとか。
Nancy の JSON は優秀ですが、別名指定には対応していないことが判明。OTL
nuget Nancy.Serialization.NetJSON のお陰様で、何とか次のように対応できました。これは nuget でインストールするだけで有効化されました。
public class MyModel {
[NetJSONProperty("注文・見積NO")]
public String 注文見積NO = null;
}
登録:
投稿 (Atom)




