2018年10月07日

英単語メモ 2018/10

municipal 地方自治体の
adverse 反対する
devise (ディヴァイズ) 考案する
desperately 必死に、やぶれかぶれに
suite 一式、一揃い
chill 寒気、冷える
destined 〜行きである be destined for Tokyo。 運命にある

jeopardous 危険な
jeopardy 危険、in jeopardy 危険にさらす

vehemently (感情(怒り)): 猛烈に、強烈に
vehement [12/12] (形容詞)

provoke (論争や反発等)を引き起こす(誘発する)、挑発する
provocation 挑発

condemn 非難する
depredation 略奪

deprivation [8/12] 剥奪
deprive [5/12」剥奪する
参考:https://mickeyweb.info/archives/17212
sleep depriviation 睡眠不足
Longman
https://www.ldoceonline.com/dictionary/english-japanese/deprivation
https://www.ldoceonline.com/dictionary/deprivation

existing 既存の
introductory rate 初回価格
compulsory 【形】義務的な、強制された
endorse 承認する、支持する、(小切手に)裏書きする

radical 抜本的な。 急進的な、(反) conservative

envoy [10/12] 使節、公使。(formal):emissary
https://www.ldoceonline.com/dictionary/english-japanese/envoy
resilient [11/12] 回復力のある、弾性の

allegation 申し立て

unconscionable 不当な、不道徳な、許せない、
https://www.ldoceonline.com/dictionary/english-japanese/unconscionable










(注)
[x/12] (x=1...12) 難易度レベル12段階。 1(易)〜12(難)

posted by Copyright (C) avrin All Rights Reserved. at 19:20| Comment(0) | 英語 | このブログの読者になる | 更新情報をチェックする

2018年01月08日

Rust言語:Win32api:: EnumWinodwsのメモ 2018

Rust言語:Win32api:: EnumWinodwsのメモ 2018
はじまり
前回に続いて、Rust言語でWin32APIを使ってみたメモ。
$ rustup default nightlyを実行してnightl版にしておく必要がある。

Win32APIのEnumWinodws()がコールバック関数を引数に持つので、Rust言語で
どういう記述になるのかを実際に書いてみた。GUI用のマクロ
#![windows_subsystem = "windows"]
は、今回不要なものの残してある。特に害はない。

気づいた点:
    (1) グローバル変数名は大文字に強要される様だ。 orz
        これだと定数との区別が?になる。
callBackProc()の動作:
    (1) タイトル中に不要な文字列(Default、MSCTFIME)を持つアプリは無視し、
        それ以外の起動中のアプリのタイトル名を表示する。
    (2) この例の場合、最後に見つかったアプリのウインドウハンドル(HANDLE_APP)が取得できるので
        それを使っていろいろできる。
実行結果:
    コマンドラインで実行すると起動中のアプリのタイトル文字をつらつらと表示する。

src/main.rs
/*
 * Windows File open dialog demo.
 * rustc 1.25.0-nightly (6828cf901 2018-01-06)
 * This file must be saved as UTF-8 format.
 *
 * 2018/01/13 by audin
 */
#![windows_subsystem = "windows"]

extern crate winapi;
extern crate user32;

/* usnused
use std::ffi::OsStr;
use std::os::windows::ffi::OsStrExt;
use std::iter::once;
*/
use std::ptr::null_mut;
use std::result;
use winapi::um::winuser::*;
use winapi::shared::windef::*;
use winapi::shared::minwindef::*;

const SZW_SIZE_MAX: usize = 512;
// Type alias to simplify representation.
type Result<T> = result::Result<T,String>;
type TSzwBuf   = [u16; SZW_SIZE_MAX];

static  mut SZW_BUF: TSzwBuf = [0; SZW_SIZE_MAX];
// Convert from TSzwBuf([u16;512]) to String type.
fn szw_to_string( szwbuf: &TSzwBuf ) -> Result<String> {
    szwbuf.iter()
        .position(|wch| wch == &0)
        .ok_or("String : Can't find zero terminator !".to_owned())
        .and_then(|ix| String::from_utf16( &szwbuf[..ix] )
                              .map_err(|e| e.to_string()))
}

// Convert from String to Vec<u16> with trailing \0.
/* unused function
fn str_to_szw(str_body: &str) -> Vec<u16> {
    return OsStr::new(str_body)
        .encode_wide()
        .chain(once(0))  // 終端文字\0を追加
        .collect::<Vec<u16>>();
}
*/

static mut HANDLE_APP: HWND = null_mut();
#[allow(non_snake_case)]
unsafe extern "system"
fn callBackProc( hWnd: HWND, _lparam: LPARAM) -> BOOL{
    GetWindowTextW( hWnd, SZW_BUF.as_mut_ptr(), SZW_BUF.len() as i32);
    if let Ok(sTitle) = szw_to_string( &SZW_BUF ) {
        if sTitle.len() > 0 {
            if (None != sTitle.find("Default")) || (None!=sTitle.find("MSCTFIME")) {
                // Eliminate verbose stings
            }
            else {
                // Result in HANDLE_APP is equal to the Window handle of a last application found.
                HANDLE_APP = hWnd;
                println!("{}",sTitle);  // List up application tilte with UTF-8 string.
            }
        }
    };
    TRUE // Continue enumeration to find a next Window activating.
}

fn main() {
    unsafe {
        EnumWindows( Some(callBackProc), 0);
        if HANDLE_APP != null_mut() {
            // Some codes using Window handle
        }
    }
}
tomlファイルには前回に加えて「windef」と「minwindef」を追加した。 「commdlg」は未使用だけど残した。 Cargo.toml
[package]
name = "enumwindows"
version = "0.1.0"
authors = ["audin"]

[dependencies]
user32-sys="0.2.0"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3.3", features = ["winuser","commdlg","windef","minwindef"] }
posted by Copyright (C) avrin All Rights Reserved. at 23:25| Comment(0) | Rust言語 | このブログの読者になる | 更新情報をチェックする

make + guile を使うメモ 2018

make + guile を使うメモ 2018
はじまり
だいぶ前にmake 4.0がリリースされてguile言語がバインドされた。
Makefileの中にguile言語が記述できるというもの。
(ただし、guile機能はオプション扱いでmake 4.x系でも非バインド(使えない)のものもある)

guile言語はインタプリタ型の汎用言語なので、makeの標準関数だけではできなかった
いろいろな処理が自由に書けることになる。
今までも $(shell ...) 関数で外部コマンドを呼び出せばそこそのことはできていたが、
Windows(32bit)(DOS窓,PowerShell)とLinux系(msys2/cygwin)で共用しようと思うと
Windows側に追加ツールが必要で、かつ、互換性やコマンド同士の干渉に留意が必要だった。

make 4.x系でguile言語を使えばどのプラットフォームでも使えるMakefileが作成できる
ことになるのだった。

make 4.x + guile機能はデフォルトで Onなのか?
今は2018年初頭。 デフォルトの対応状況をしらべてみた。
guile機能有効化
msys2 なし 後述
cygwin あり 不要
[Lu|U]buntu 16.04(Linux)なし $sudo apt-get install make-guile
guile機能が有効化どうか確認する方法: Makefile内に以下を記述し、
all:
    @echo $(.FEATURES)
makeしてみると、
target-specific order-only second-expansion else-if shortest-stem
undefine oneshell archives jobserver output-sync guile load
上記の様にguileが含まれていれば有効になっている。 Windows DOS窓/PowerShell/msys2上でguile機能を使う (1) まず既存のmake.exeがある場合はそれが呼ばれないようにする。 やり方は色々あるが、make.exeをmake.exe.orgにリネームするのが簡単か。 (2) make with guile をダウンロード https://sourceforge.net/projects/ezwinports/files/ から make-4.2.1-with-guile-w32-bin.zip をダウンロードし、解凍する。 (3) 出てきたファイル群を D:\usr以下にコピーする。 Windowsの環境変数PATHに D:\usr\binを追加。 Windows DOS窓/PowerShell上からはこれで使える。 msys2: $ pacman -R make で既存のmakeを削除。 ~/.bashrc 内に export PATH=$PATH:/d/usr/bin を追加し、 $source ~/.bashrc で使用可能になる。 ドライブDがない場合: ドライブCしかない場合、或いは、ドライブD以外にインストールしたい場合は、 (a) 適当なドライブ(仮にC:)・フォルダ(仮にmakegとする)に上記解凍したファイル群をコピーする。 (b) Winodws環境変数に以下の2つを新規追加。 (i) 変数名: GUILE_LOAD_COMPILED_PATH 変数値: c:\makeg\lib\guile\2.0\ccache (ii)変数名: GUILE_LOAD_PATH 変数値: c:\makeg\share\guile\2.0 (c) Windowsの環境変数PATHに c:\makeg\binを追加。 msys2で使いたい時は、 ~/.bashrcに上記同様に追加。 以上で make + guile機能が使える様になる。 guile関数を実際に使ってみた GUILE_SCRIPT: 関数群の適当な名前。 define 名前 .... endef で関数群を定義。 $(guile $(GUILE_SCRIPT) ) で関数群をロード。 緑の部分で、定義した関数を使用した。 関数 genTargetName は引数文字列の先頭から3文字をカットした文字列を返す関数。 (やりたかったのは、Makefileを実行したフォルダの名前から先頭の3文字をカットしたものを、 TARGET名にしたかった。)(注1) Makefile
# guile関数定義
define GUILE_SCRIPT
	(define (genTargetName dirName)\
		(substring dirName 3 (string-length dirName)))
endef
# guile関数ロード
$(guile $(GUILE_SCRIPT) )

ARC        = thumbv7em-none-eabihf
FLASH_EXE  = d:/STM32-ST-LINK-Utility/ST-LINK\ Utility/ST-LINK_CLI.exe

DIRNAME    = $(notdir $(CURDIR))
# guile関数呼び出し
TARGET     = $(guile (genTargetName "$(DIRNAME)" ) )
TARGET_DBG = $(TARGET)_debug
TARGET_REL = $(TARGET)_release
... 
関数定義をやめれば同じ内容をもっと短くも書ける。 Makefile
ARC        = thumbv7em-none-eabihf
FLASH_EXE  = d:/STM32-ST-LINK-Utility/ST-LINK\ Utility/ST-LINK_CLI.exe

DIRNAME    = $(notdir $(CURDIR))
# guile関数呼び出し
TARGET     = $(guile (substring "$(DIRNAME)" 3 (string-length "$(DIRNAME)"))))
TARGET_DBG = $(TARGET)_debug
TARGET_REL = $(TARGET)_release
... 
guile関数の定義部分だけ別ファイルに書いてロードすることもできる。 $(guile (load "script_foo.scm")) makeのguile機能について makeの標準関数の一つとして「guile」という名前の関数が増えたことになる。 引数1つの関数なので、 $(guile 引数) と言う形になる。 guile関数は最初に、makeによって通常の方法で評価(展開)され、 次にguileインタプリタで評価される。 Makefile内は文字列しか扱えないので、guileの引数も文字列である必要がる。 guileインタプリタでの評価結果(返り値)は文字列としてMakefile内で使用できる。 guile返り値の型変換 guileインタプリタ内部で扱う型は、makeへの返り値となった時、 以下の様にすべて文字列に変換される。
guile内の型変換後のmake内の文字列
#f 空文字。 空文字はMakefile内ではfalseとして扱われる。
#t '#t'。 '#t'は文字なのでMakefile内ではtrueとなる。
シンボルと数値 シンボルと数値はそれらを表す文字列となる。
文字 表示可能な文字は、同じ文字になる。
文字列 表示可能な文字のみを含む文字列は、同じ文字列になる。
リスト リストは上記ルールに従って、再帰的に平坦化される。 例: (a b (c d) e) は、 Makefile内では'a b c d e' となる。
その他 上記以外の型はエラーとなる。(将来扱える型が増える可能性を否定しない)
従って、エラーを避けるなら上記の有効な型に置き換える工夫が必要。
make + guile 資料 このページをguileで検索 https://www.gnu.org/software/make/manual/make.html guile 資料 guile トップページ https://www.gnu.org/software/guile/ guile2.2.3 ドキュメント https://www.gnu.org/software/guile/manual/ (注) Macは非所有なのでAC。 (注1) ひょっとするとguileをつかわずmakeの標準関数でできるかどうかは未確認。 ざっとみたけど、 ?だった。
posted by Copyright (C) avrin All Rights Reserved. at 23:24| Comment(0) | その他 | このブログの読者になる | 更新情報をチェックする

2018年01月07日

Rust言語でWin32apiしてみたメモ 2018

Rust言語でWin32apiしてみたメモ 2018
はじまり
Rust言語の練習のためWin32APIのファイルオープンダイアログを起動する
簡単なソフトを作ってみたメモ。

Rust winapiのページ
https://github.com/retep998/winapi-rs

今時、Win32API直たたきはアレだけど、一応やってみた。
./target/debug/win32_fopen_dlg.exe
or
./target/release/win32_fopen_dlg.exe
をコマンドラインから実行してファイルを選択すると、ファイル名を表示するだけ。
ファイル未選択でキャンセルすると別なメッセージが出るだけ。
なソフト。

以下のソースコードは日本語を含むので「UTF-8」で保存する必要がある。
src/main.rs
/*
 * Windows File open dialog demo.
 * rustc 1.22.1 (05e2e1c41 2017-11-22): stable.
 * This file must be saved as UTF-8 format.
 *
 * 2018/01/02 by audin
 */
#![windows_subsystem = "windows"]

extern crate winapi;
extern crate user32;

use std::env;
use std::ffi::OsStr;
use std::iter::once;
use std::os::windows::ffi::OsStrExt;
use std::ptr::null_mut;
use std::mem::size_of;
use winapi::um::commdlg::{OPENFILENAMEW, OFN_HIDEREADONLY};
use winapi::um::commdlg::GetOpenFileNameW;
use std::result;

const SZW_SIZE: usize = 512;
// Type alias to simplify representation.
type Result<T> = result::Result<T,String>;
type TSzwBuf   = [u16; SZW_SIZE];

// Open the fileopen dialog with Windows GUI.
#[allow(non_snake_case)]
fn file_open_dialog() -> Result<String> {
    let szwFilter = str_to_szw("プログラム:(*.exe)\0*.exe\0すべて:(*)\0*\0");
    let szwTitle  = str_to_szw("ファイルを選択します");
    let mut szw_buf: TSzwBuf = [0; SZW_SIZE];
    let mut dlgOpen = OPENFILENAMEW {
        lStructSize:       size_of::<OPENFILENAMEW>() as u32, //DWORD,
        hwndOwner:         null_mut(),                        // HWND,
        hInstance:         null_mut(),                        // HINSTANCE,
        lpstrFilter:       szwFilter.as_ptr(),                // LPCWSTR,
        lpstrCustomFilter: null_mut(),                        // LPWSTR,
        nMaxCustFilter:    0,                                 // DWORD,
        nFilterIndex:      0,                                 // DWORD,
        lpstrFile:         szw_buf.as_mut_ptr(),              // LPWSTR,
        nMaxFile:          szw_buf.len() as u32,              // DWORD,
        lpstrFileTitle:    null_mut(),                        // LPWSTR,
        nMaxFileTitle:     0,                                 // DWORD,
        lpstrInitialDir:   null_mut(),                        // LPCWSTR,
        lpstrTitle:        szwTitle.as_ptr(),                 // LPCWSTR,
        Flags:             OFN_HIDEREADONLY,                  // DWORD,
        nFileOffset:       0,                                 // WORD,
        nFileExtension:    0,                                 // WORD,
        lpstrDefExt:       null_mut(),                        // LPCWSTR,
        lCustData:         0,                                 // LPARAM,
        lpfnHook:          None,                              // LPOFNHOOKPROC,
        lpTemplateName:    null_mut(),                        // LPCWSTR,
        pvReserved:        null_mut(),                        // *mut c_void,
        dwReserved:        0,                                 // DWORD,
        FlagsEx:           0,                                 // DWORD,
    };

    match unsafe { GetOpenFileNameW(&mut dlgOpen) } {
        0 => Err("Nothing is selected !".to_string()),
        _ => szw_to_string( &szw_buf ),
    }
}

// Convert from TSzwBuf([u16;512]) to String type.
fn szw_to_string( szwbuf: &TSzwBuf ) -> Result<String> {
    szwbuf.iter()
        .position(|wch| wch == &0)
        .ok_or("String : Can't find zero terminator !".to_owned())
        .and_then(|ix| String::from_utf16( &szwbuf[..ix] )
                              .map_err(|e| e.to_string()))
}

// Convert from String to Vec<u16> with trailing \0.
fn str_to_szw(str_body: &str) -> Vec<u16> {
    return OsStr::new(str_body)
        .encode_wide()
        .chain(once(0))  // 終端文字\0を追加
        .collect::<Vec<u16>>();
}

fn main() {

    let args = env::args().collect::<Vec<String>>();

    if args.len() >= 2 {
        println!("{}", &args[1]);
    }
    else {
        match file_open_dialog() {
            Ok(file_path) => println!("{}", file_path),
            Err(e)        => println!("{}", e),
        };
    }
}
上のコードの (1) 黄色い部分で、 コンソールウインドウを出さない様にしている。 (2) 赤い部分は、winapi 0.3.0以降で変更になった書き方。 winapi 0.2.8 までは use winapi::GetOpenFileNameW; の様に短く書けたんだけど winapi 0.3.0以降は上記のフル指定で書く必要がある。 さらに Cargo.tomlに追加設定が必要。 Cargo.toml
[package]
name = "win32_fopen_dlg"
version = "0.1.0"
authors = ["audin"]

[dependencies]
user32-sys="0.2.0"

[target.'cfg(windows)'.dependencies]
winapi = { version = "0.3.3", features = ["winuser","commdlg"] }
上で、winapi 0.3.0以降を使う時は緑色の部分の追加が必要。 さらに赤い部分で、どのモジュールファイルを使うのかを指定する必要がある。 例えば、GetOpenFileNameW()というAPIの指定方法は、以下のページの一番上の行の検索欄に "GetOpenFileNameW"を入れる。 https://docs.rs/winapi/*/x86_64-pc-windows-msvc/winapi/index.html すると以下の様にフル指定方法がわかる。 https://docs.rs/winapi/*/x86_64-pc-windows-msvc/winapi/um/index.html?search=GetOpenFileNameW また例えば、 USB_DEVICE_SPEEDという定数を使いたい場合、 https://docs.rs/winapi/*/x86_64-pc-windows-msvc/winapi/shared/usbspec/type.USB_DEVICE_SPEED.html?search=USB_DEVICE_SPEED 上の様になるので、Cargo.tomlの featuresは、 features = ["winuser","commdlg","usbspec"] となり、ソースコードには use winapi::shared::usbspec::USB_DEVICE_SPEED; を追加する。 umとかsharedの様な上位階層はfeaturesに指定する必要はない様だ。 native-windows-gui Win32APIのGUIラッパーを作った人がいました。 https://github.com/gabdube/native-windows-gui gitでクローンして Cargo.tomlのあるフォルダで、 cargo run --example showcase cargo run --example canvas cargo run --example templating などと、exapmlesフォルダの中のファイルをコンパイルすると、 ./target/debug/examples/*.exe ができるので実行する。 iniファイルを操作するライブラリ ライブラリというかクレイトと言うらしい。 rust-ini https://crates.io/crates/rust-ini gitリポ https://github.com/zonyitoo/rust-ini 使い方 https://docs.rs/rust-ini/0.10.0/ini/ Windowsのレジストリを操作するライブラリ winreg https://crates.io/crates/winreg gitリポ https://github.com/gentoo90/winreg-rs 試したところちゃんと動きました。
posted by Copyright (C) avrin All Rights Reserved. at 09:01| Comment(0) | Rust言語 | このブログの読者になる | 更新情報をチェックする