人気ブログランキング |
- 北の空からみなみへ -
exblog staff

<   2018年 01月 ( 7 )   > この月の画像一覧
砂場あそび /1(温故か懐古か発掘か /4)
2018年 01月 24日
しばらくバッチ砂場をいじってみよう。

set/a limit=("1<<31"-1)*(-1)
この結果は⇒ -1073741824

set/a limit="1<<30"
この結果は⇒ 1073741824

上の数(負数)に下の数(正数)を加えてみます。

set/a limit=("1<<31"-1)*(-1)+"1<<30"
この結果も⇒ 1073741824

別に論理シフトにいかさまがあるわけではないのでしょうし、PCはそのままに計算してるのでしょうが・・・

これって、アセンブラやってる人とかならすぐ Aha!って言いそうだな

c0062295_13554818.gif


step 3, backstep 2(三歩進んで二歩下がる)
by bucmacoto | 2018-01-24 17:15 |   illusion rhapsody
温故か懐古か発掘か /3
2018年 01月 24日
@if not "%~1/"=="!/!/" (goto start) else shift&shift&set exec$sub=%2&rem only sub exec[for debug and use tool]
set exec$sub>&2&set exec$sub=&goto %0&rem ←このgoto以降は戻ってこない
set exec$sub>&2&set exec$sub=&call :%0 %1 %2 %3 %4 %5 %6 %7&goto eof&rem ←こちら戻って来たのを終わらせてる
:start

:TST$mad
@rem for /f "tokens=1-30 delims=;" %%9 in ("%path%") do echo.%%~9&echo.%%~:&echo.%%~^;&echo.%%~^<&echo.%%~^=&echo.%%~^>&echo.%%~^?&echo.%%~@&echo.%%~A
for /f "tokens=1-8 delims=;" %%Z in ("%path%") do echo.%%~Z&echo.%%~[&echo.%%~^\&echo.%%~]&echo.%%~^^&echo.%%~^_&echo.%%~^`&echo.%%~a
for /f "tokens=1-4 delims=;" %%z in ("%path%") do echo.%%~{&echo.%%~^|&echo.%%~}&echo.%%~^~
exit/b
といったテスト用サブルーチンでも確かめたから、キャレット付きにすれば英数字(大文字小文字)〜一部記号までを1文字変数で使用可能なのは、コマンドライン限定ではない。
赤囲み Windows XP    緑囲み windows 10
c0062295_21250059.png
c0062295_22321712.png

上記の文字範囲が、連続して変数にできる文字。(漢字変数は文字コードが連続していてもダメケースを確認)
マルチバイトの記号領域はいけるかもだけど、確認検証は他人にお任せしたい。
単バイトの一部文字は特殊な意味・役割をもっているのだが、キャレット付きで変数として使用可能にしているという結論に。

for / f "tokenes=...." で、最大 tokens が31なのが残念。一気に長〜い展開できるなら、使い所があるかもです。


windows XP / 10 での動作確認結果
by bucmacoto | 2018-01-24 13:37 | &Tips;&code;
温故か懐古か発掘か /2
2018年 01月 11日
下に載せたのはサイドメニューのリンク整理中に見つけた、やや古い資料。
昭和の時代・・全国にコンビニが普及し始め、でも私が進学した津軽の城下町には存在せず、夜8時には普通の店は閉店し、あとは飲み屋・居酒屋くらいしか営業していなかったくらいな昔。

分類軸の日本語訳意を解釈できなくて、原語の解説見たのだけれど、やっぱり腑に落ちない。。。
power distance (strength of social hierarchy)
 社会的しがらみに強く影響されるかどうか(低いほど自由平等社会)
Uncertainty avoidance index
 保守的な慎重さを、即断即決や軽薄浮揚よりよしとする
individualism-collectivism
 自立的個人主義か、長いものには巻かれて安心か
masculinity-femininity (task orientation versus person-orientation)
 男性的(仕事志向)かフェミニン(人心地志向)か

c0062295_18454622.gif
私の脳内では、日本のサムライ文化などは3番目の要素以外は高値となる気がしてしまう。要素を限定して単純化するため3国だけ注目してみたが、封建的などの単一尺度では測りきれなかった。(連動するのではなく相反する要素が目立つ)
つまりは多面的に考えることを可能とするには、私の脳内モデルが未分化(単純)なのだろう。

短絡的に、power distance って項目が小さいほど、社会的に寛容で自由なんだって考えてはみたけれど。。
(デンマーク と イスラエル がそうなのですかねぇ。。。どちらも生活実感を知らない国だな)


more
by bucmacoto | 2018-01-11 21:55 | duality
温故か懐古か発掘か
2018年 01月 09日
ものすごく久しぶりなバッチいぢりだったので、この一ヶ月半ほどは21世紀のWindows CMD.exe の知らなかったことを、知ることができた。
同時に知っていると思っていたことが間違いだったと思い知ったり、それとは対照的に、昔の知識や伝聞が今になって活かせたりした。

記憶にある最初のコンピュータ言語は Basic で、これはプログラミング言語であると同時に、マシン制御システムを開発することもできたらしい。
(CP/M やら UNIX などは、耳にはしても実際に目にすることはなかった。)
PC上で動き、コンパクトさと融通無碍さで、シェアをとった。
私が、成人してから購読したパコソン誌も、The をつけてその名前を冠していた。(後期には ざべ という平成風の名になったのだが)

MicroSoft社の Bill Gates氏がそのコードのかなりの部分を書いたのは間違いないらしく、その小さなコードがいかに多様に動くことのできるものかを誇っていたという。
大きな会社に成長してからも、社内の若手といかに小さなコードを書くことができるか、競う誘いをすることもあったらしい。(これは雑誌の記事からの受け売りではあるが、私は信頼性ありと思う)

Windows の前身となった MSDOSは、IBMとの共同開発であり、IBM PC(AT/PS2)はPCDOSの名で、他社への供与はMicroSoftが行った。元々のDOSコードは、他社からのライセンス供与を受けた(後に買い取りをした。IBMとの関係を隠匿していたと、開発元から訴訟もあった)ものではあったが、Gates氏の好みは反映されていたと考えるのが自然だろう。

DOS当時のデバイス制御機能は IO.SYS という名前のファイルが受け持ち、ユーザーからのコマンド入出力を担当するコマンドインタープリタは COMMAND.COM、その両者のファンクションコールを仲介するのが MSDOS.SYS という役割分担だった。
最低、この三つでシステムは起動できる設計だったが、その分(特に機器制御を担うIO.SYSで顕著)機種固有のファイルでなければ動かないものだった。またメーカーの独自色が出る設定(例えばIBM PCはフロッピー2台分のドライブ名を固定し、ハードーディスクが C: に決め打ち。対してNEC PC98は 起動ドライブ名に A: のドライブレターを割当てる)も、このファイル内にあった。

文字ベース制御のDOSから、グラフィカルな面構えのWindowsへの移行は、(当初は OS/2 という路線だったが暗礁に。そして、IBMはOS/2を最終的に完成させたものの、MSのWindowsに市場を抑えられた後の祭り)未完成品扱いを受けながらも急速に進んだ。
一般にはキャンペーン上手と開発者の囲い込みに成功した経営戦略のことばかりが言われているが、Basic も DOS も Windows も共通するのは、「ちょっと先には次の手があるよ」と自然に思えるようなからくりが込められていたから。そのように(政治的駆け引き素人な)私などは思っている。
公開されるプログラミング手続き(ファンクションコール)だけではちょっと難しいことや不可能なことが、いわゆる隠しファンクションコールのような手続きで見事に解決される仕組みを作りこんでありながら、(その後の仕様変更次第という理由かもしれないけれど)その辺りを見えそうで見えない風に焦らせるテクニックの集大成だろうかと。

うん。。そういうのって昭和の性風俗だったストリッパーの手管と共通項に思えなくもない。

全部は見えない、けれど最短の範囲で、次の手が決定できる。これは、論理を形成する上で、そして高速に処理をする上で欠かせない要件だと思う。(ちなみに、DOS時代の IO.SYS は、プリンタや高解像度モニターのドライバを内包しきれないため外部化し、それらを設定ファイル CONFIG.SYS という名のテキストファイル。この中身は set コマンドで読み込むファイル名を記述してあり、MSDOS.SYS がそれを順次読み込みながら起動する仕組みとなっていた)
事実上は決まりきっていて変更不能や変更不要に思えるものも、あえて変更することができる仕組みにした。(CONFIG.SYS の最後にある SHELL=COMMAND.COM の書き換えけで、別のフォルダやコマンドファイルを自動起動させるようにしてあった)

今回かなーり頭を悩ましたおかげか、なんとなくだがコマンド上の文字の扱いを(薄ぼんやりとだけれど)分かってきたみたいなので、自分なりの解釈を残しておこう。


ところで、完全放置だったこのブログ、メニュー欄を修正しようとして、(エキブロの)メモ帳の仕様に閉口した。
ちょっとトリッキーな書き方もあるので、【改行を<br>にする】を外して書いたのだけど、保存するたびに(それがほんの1文字でも。。。いやいや開いてそのまま保存し閉じただけでも)一定のルールのあちら解釈で処理される。
その結果、<br/> と書いたタグは全て <br> 化され、次の処理ではキレーに改行が消え去ってしまうという謎な動作仕様 149.png
その時には同時に &emsp; のような文字実体参照記述も、実体文字へと強制置換される。(一見分かりやすげに見えて結構困る=ソース見ても本当のいわゆる半角空白なのかどうかわからないから修正しようが無くなる)
挙句、両横に空白を伴った" &nbsp; " は、→ ・・・(ry

なんだかなぁ。。。初心者ユーザに優しいのはいいし無茶記述を潜り込ませないという思想もよろしいのだけれど、でたらめに書き変わっちゃいけないでしょー。(嘘はよくないよー。)
まあ、そのおかげで(〜<br/> を排除して <div> 〜 </div> にするため)、macのテキストエディットやメモ帳の 文字検索機能と置換機能を知ることができたから、今回は怪我の功名とも言えるのですけど。
もうこれって、おそらくたぶん、【仕様】になってるんだろうなぁ。。。

で、その置換機能に頼らず直打ちした文字でかなりタグが壊れてしまったのですが、最も分かりにくくて思わず一時間以上探求して解明したのが(Windowsの等幅フォントでは一目瞭然なんだけど、macはオシャレな字面なのでね・・・)、 ” と " との誤入力でした。
" です。
"" です。(大事なことなので三回書きました w)


more
by bucmacoto | 2018-01-09 01:25 | quote/data
しつこく cmd.exe の変数挙動いぢり
2018年 01月 06日
昔のDOSを含めある種の環境変数には特別な地位が与えられ、かなり固有の特権を有している。
特に、内部コマンド(path , prompt , date , time など)で扱えるようになっているものは、ローカル変数扱いに過ぎず親環境には反映できない。
コマンドの挙動も特有化していて、パラメータなしで入力しただけだと

path ⇒ 変数 %PATH% を表示、パラメータつけると追加
prompt ⇒ 変数 %PROMPT% をクリア(← set prompt=&rem と同じ)、パラメータつけると set PROMPT=パラメータ
date / time ⇒ 変数 %DATE% / %TIME% の設定(ただし管理者権限でないと変更不能)

という具合です。

ここで %date% %time% の両変数は、変数としては存在しているのに set コマンドで表示も消去もできないです。

> if defined date for %C in ("echo.変数dateはあるようです消してみます" "set date=" "echo.再確認してみます" "set date" "call echo.変数 %DATE% =%date%となっています") do %~C

上のワンライナーをコマンドラインで入力した結果が下記
> echo.変数dateはあるようです消してみます
変数dateはあるようです消してみます

> set date=

> echo.再確認してみます
再確認してみます

> set date
環境変数 date が定義されていません

> call echo.変数 %DATE% =2018/01/06となっています
変数 %DATE% =2018/01/06となっています
引用符つきでもしっかり展開されるのはどうみても健在ですね。

その一方でキャレット [^] はエスケープにならないと判っていてもつい頼るので、次の例示
今度はバッチで実行.
引用扱いが、コマンド出力だったりバッチ内容の方だったりするのは、ご容赦を

type temp.bat
@rem if defined は 変数 %date% が存在しているという意味で、必ず trueです。一行を縦並べに書くために使ってみました。
if defined date (
echo 単純引用は変数が消えます ⇒ "%d^ate%"
echo キャレットまみれも無駄 ⇒ %t^i^m^e: =0%
echo 二重で %d^ate%=%%d^ate%%
echo ダブル %% だと %tim^e%=%%tim^e: =0%%

rem for の変数の形で引用符に入れて実行してみます

for %%c in (
 "echo 引用符内でも単純引用はやり消えるかな ⇒ %da^te%"
 "echo キャレットまみれはどうだろう =%t^i^m^e: =0%"
 "echo キャレットなし二重はこう %%date:/=%%"
 "echo 普通にダブルでもいける %%time: =0%%"
 ) do %%~c
) else rem  ここはスペース開けるために利用しています

rem 引用符がないと、うまくいくっぽいけれど、キャレットの意味はないなぁ
for %%c in ("%%d^ate:/=%%" %%^date%% %%time%%) do echo %%~c

@echo バッチのなかから echo %%date%% と書くのと、コマンドラインで打つのでは結果が違うんですね。
echo %%date%%
echo.echo %%date%%>>test.bat & call test.bat &del test.bat

@rem パイプやリダイレクトも for /f でのコマンド結果に対する(テンポラリから)読み出していると考えて腑に落ちる。一時ファイルというのは暗黙的に作られているらしい。
@echo でもこれで、call で展開される理由づけになったか
echo %%date%%
call echo %%date%%


実行結果   (投稿後、二重引用に気付き削除修正済)
> if defined date (
echo 単純引用は変数が消えます ⇒ ""
echo キャレットまみれも無駄 ⇒ =0
echo 二重で %date%=%date%
echo ダブル % だと %time%=%time: =0%
rem for の変数の形で引用符に入れて実行してみます
for %c in ("echo 引用符内でも単純引用はやり消えるかな ⇒ " "echo キャレットまみれはどうだろう = =0" "echo キャレットなし二重はこう %date:/=%" "echo 普通にダブルでもいける %time: =0%") do %~c
)
単純引用は変数が消えます ⇒ ""
キャレットまみれも無駄 ⇒ =0
二重で %date%=%date%
ダブル % だと %time%=%time: =0%

> echo 引用符内でも単純引用はやり消えるかな ⇒
引用符内でも単純引用はやり消えるかな ⇒

> echo キャレットまみれはどうだろう = =0
キャレットまみれはどうだろう = =0

> echo キャレットなし二重はこう %date:/=%
キャレットなし二重はこう %date:/=%

> echo 普通にダブルでもいける %time: =0%
普通にダブルでもいける %time: =0%

> rem 引用符がないと、うまくいくっぽいけれど、キャレットの意味はないなぁ

> for %c in ("%d^ate:/=%" %date% %time%) do echo %~c

> echo %d^ate:/=%
%d^ate:/=%

> echo %date%
%date%

> echo %time%
%time%
バッチのなかから echo %date% と書くのと、コマンドラインで打つのでは結果が違うんですね。

> echo %date%
%date%

> echo.echo %date% 1>>test.bat & call test.bat & del test.bat

> echo 2018/01/06
2018/01/06
でもこれで、call で展開される理由づけになったか

> echo %date%
%date%

> call echo %date%
2018/01/06


More 1押し
by bucmacoto | 2018-01-06 23:21 | &Tips;&code;
cmd.exe 変数挙動の確認中
2018年 01月 04日
実のところ、遥か昔(バブル期)に、MSDOS 3.1 あたりから win 3.1 くらいまではコマンドプロンプトいじりに燃えてたものの、win 95 始まるあたりからは環境オタクな作業も消えた。今回初めてNT系以降の拡張された環境変数の機能を知った。その程度で、かなり喜べたほどの低レベルオタクなので、当初の目的が達成できたことで舞い上がっていた。
(環境変数内の子指定を変数でできるとか、二重callで遅延環境みたいに動くとか新発見気分)

ですが、よく考えたら挙動をきちんと理解できてはいないし、自宅には やや古いmacはあってもPCはないので、この機会に少しまとめておこうと思う。

コマンドラインから直接打ち込んだ場合と、バッチ内で引用しようと思った場合、違うというのもある。


まずは、少しずつ
by bucmacoto | 2018-01-04 23:02 | &Tips;&code;
謹賀新年 そして いまさらコマンドライン(CMD.exe)いぢり
2018年 01月 01日
昨年末にほぼ20年ぶりにバッチと格闘しました。
もっとも30年前~20年前くらいまでの間、AUTOEXEC.bat や CONFIG.sys ばかりいじっていただけです。
それでも仕事がらみで、隔離されたセキュアな環境(つまりWindows標準のものしか使えない)で、最多のマシンがXP(8割)という状態で、ニッチ業務なので自力でやってみたら、大いにハマりました。

やってることは、あるフォルダ配下の複数サブフォルダに画像サーバーから吐き出された同質ファイル=サイズ誤差数十バイトなやつらを、サイズチェックして、一貫性のある名前にして、別途排出のINDEX参照して、IDや性別をファイル名にもたせ、それを転送先に移動し、相手先に通知する。だけなので、まあバッチでできたのですが、その過程でいろいろいろいろ気付いて年末は悶絶してました。

インターネット上の情報にずいぶん助けられ、勉強になったので、少しでも恩返ししようと記事を書くことに。
バッチ職人なんて、かつてのMultiPlan職人ぐらいに先行き滅び去るのでしょうが、まあ、歴史的観点で俯瞰すると似たことってありそうなものなので意味もあるかなって思ったのです。

More(とりあえず、正月だけ平均一日一題くらい数日書く・・かも)
by bucmacoto | 2018-01-01 22:03 | &Tips;&code;