2018年12月16日

nim言語のコンパイル時間を3倍速くする方法 2018

nim言語のコンパイル時間を3倍速くする方法 2018
はじまり
お気楽極楽なスクリプト風味なプログラミング言語、nim言語。

(1) ネイティブコードコンパイラ(正確にはトランスレータ)
(2) Hello Worldのバイナリサイズは、たったの35Kbyte(Windows版)
(3) 実行速度はC言語も真っ青になる場合もある。くらい高速。
    (そうでない場合も当然ある :-)

nim言語のコンパイラは正確には、C言語に変換するトランスレータである。
生成されたC言語のコンパイルには標準でgccが使われる。
(LLVMやMSVC(VCC)等に変更することも可能)

初回のコンパイルではフルコンパイルがかかるので結構遅い感じだ。
2回目以降はインクリメンタルコンパイルになるので、こそまで遅い感じではないが、
スクリプト言語に比べれば遅さは否めないのだった。

コンパイル速度を3倍速くする方法
結論から言うと、gccより9倍高速にコンパイル可能な「tcc」を使います。
https://bellard.org/tcc/
ダウンロード
http://download.savannah.gnu.org/releases/tinycc/
(1) 32bit(Windows)
        http://download.savannah.gnu.org/releases/tinycc/tcc-0.9.27-win32-bin.zip
    64bit(Windows)
        http://download.savannah.gnu.org/releases/tinycc/tcc-0.9.27-win64-bin.zip
    ダウンロード後、解凍して「tcc」フォルダを「c:\tcc」等に移動する。
    (1b) Linux(Ubuntu/Debian系)
        $ sudo apt install tcc
        で完了。簡単。Linuxの場合、もともとWindowsほどコンパイルは遅くないかも。
(2) (Windowsのみ)環境変数に「c:\tcc」を加える。
(3) nimのソースコードがあるフォルダでMS-DOSコマンドプロンプトを開いて、
    「--cc:tcc」を加えるだけ。
    gccコンパイルに戻したいときは「--cc:tcc」をカットするだけ。
自分の場合は以下で使用中。
    
nim c -d:release --opt:size --passL:-s --cc:tcc ファイル名.nim
ただし、tccの場合、最適化オプションは一切無効になるので「--opt:size」は無視される。 Win32API・GUIライブラリ tccコンパイラで「winim」「wNim」などのGUIライブラリも普通にコンパイルできた。 とういうか、gccとの互換性は問題なさそう。 デメリット 実行速度が3倍遅くなります。 tccでちゃちゃっと作って、そろそろ完成に近づいたらgccに戻せばいいでしょう。
posted by Copyright (C) avrin All Rights Reserved. at 09:59| Comment(0) | nim言語 | このブログの読者になる | 更新情報をチェックする

2018年10月17日

“もうけ”は誰の手に? 闇に消えるネット広告費 2018

“もうけ”は誰の手に? 闇に消えるネット広告費
https://www3.nhk.or.jp/news/web_tokushu/2018_1012_2.html

なんか恐ろしい話。

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

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) | その他 | このブログの読者になる | 更新情報をチェックする