パソコン・インターネット

2019年2月11日 (月)

gawkの関数:「length」でつまづく!

MS-DOS時代の「jgawk」なら大丈夫なのに、Vectorでダウンロードした「gawk(3.1.5)」でアウト。
「正規表現」 は関係ありません。
おかしな挙動をしたのが「length」。
文字のバイト数を返す関数。
gawkで使うと、おかしなことが起こったんです。
検証のため、こんなテストプログラムを実行。
{
    n = length($0);           # 入力文字列のバイト数
    printf("n:%d\n", n)     # いったん確認
    r1 = "";                    # バッファをクリア
    for(i = 1; i <= n; i++){    # 入力文字数でloop
        c1 = substr($0, i, 1);     # 1文字取り出し
        r1 = r1 c1;                 # バッファに文字として結合
        printf("%s:%d\n",r1,length(r1));   # バッファの文字列とバイト数を表示
    }
}
これがgawkだと、
12345  ←入力文字
n:5    合ってる
1:1    ところが、増えていくはずが・・・
12:1
123:1
1234:1
12345:1   5文字ループしたのに「1」
abcdefg   7文字入力
n:7    合ってる
a:1    ところが・・・
ab:1
abc:1
abcd:1
abcde:1
abcdef:1
abcdefg:1  やはり1のままで違ってる
正しい値は・・・
行末の数字が1234・・・と+1ずつ増加しなくちゃなりません。


で、正しい答えを出す方法。
gawkのままで
 1:     r1 = r1 c1 "";           # 空文字を結合
 2:     printf("%s:%d\n",r1,length(r1 ""));   同じく
 3:     起動オプションに -W ctype=ASCIIを加える
             ctype=SJISだとダメ。
jgawkだとそのままでok
むちゃ悩んだぞ~~~っと。
どうしたものか。
※結果・・・
gawkのバージョンを上げるということで対応。(4.1.4に)
ここからダウンロード。
 
Free download of the version 4.1.4 (Aug 2016)
(Version 4.1.4)

Win32 executable

Version in English Version in English



※ところが・・・
4.1.4では日本語がアウト。
起動オプションも見当たらず。

| | コメント (4) | トラックバック (0)

2019年2月10日 (日)

「gawk」の正規表現・・・続き

の続きで、gawkの正規表現で悩んでいます。
・やりたいこと
OrCADの部品ライブライーソースファイルの中に出てくる
こんな文字列(「'xxxx'」というふうに「'」で区切られている)内の
「スペース」を「_」(下線記号)に変えたい。
・例 文字列
  'VOLTAGE REGULATOR'
  L1  3  SHORT   IN  'PLUS INPUT'
    R1  'C2' CLK  OUT 'CLK OUT'
・なぜか
gawkの「スペースで文字列を文字単位に」分割するという
機能、「'」で区切られた文字列内にスペースがあると、
そこで切られてしまいす。
「'  '」内のスペース、これを「_」(下線記号)に変えて、
分割されないようにしたいわけで。
・条件
1行に複数個の「'  '」が出現することもある。
・試したのはこんな処理
    while(1){                                 # 「'  '」がいくつもあるかもしれないので
        match($0, /'[^']*'/);
        if(RSTART == 0)     break;     # 「'  '」がなければおわり
        s1 = substr($0, 1, RSTART-1);             # 「'  '」の左側
        s2 = substr($0, RSTART, RLENGTH);   # 「'  '」の部分
        s3 = substr($0, RSTART+RLENGTH);   # 「'  '」の右側
        gsub("'", "@", s2)      # 「'  '」部分の「']をいったん@に
        gsub(" ", "_", s2)       # 「'  '」部分スペースを「_」に
        $0 = s1 s2 s3            # あらたな$0
    }   
    gsub("@", "'", $0)         # @を「'」に変えて元に戻す
「'  '」が複数個出るかもということで、「']をいったん@に変えて、
1行の先頭から処理するようにしました。
gawkらしく、もっとスマートな方法は?
   ※Cだとチカラ技で処理を進めるですが、gawkの書式はパズルです。
     1文字ずつ読み出して「'」が来たらスペースを「_」にというほうが
     良いかな。
そういや、こういった記述にも対応しないと。
R1    24   OUT 'QA''' ← QA'が信号名で 二つの「''」で
文字としての「'」を示すわけでして・・・。

| | コメント (3) | トラックバック (0)

2019年2月 9日 (土)

「gawk」の正規表現で

の記事に対するCPU.BACHさんのコメントに関して・・・

「LIBSX」という「OrCAD」の部品ライブラリソースファイルを、
水魚堂さんの回路図エディタ「CE」の部品ライブラリに変換
するツールがあります。
これ、MS-DOS時代のツールでして「MS-C」で作ったんです
が、これを手直しして「BSch3V」用の部品ライブラリ「LB3」
変換ツールに出来ないものかと、ちょいと試行錯誤してみ
ました。
で、ツールですがCでコンパイルするんじゃなく、「gawk」を
使ってみました。

  ※MS-DOS時代からjgawkはあれこれと使っています。

そこで、OrCAD部品ソースに出てくる文字列処理での
「正規表現」につまずいちゃいました。

部品ソース内にこんな行が出てきます。

'7400'  ←部品名
{X Size =}  4 {Y Size =} 4 {Parts per Package =}  4 ★
L1      1   4   9  12         IN  'I0'  ←ピン指定
L3      2   5  10  13         IN  'I1'
R2      3   6   8  11 DOT     OUT 'O'
T0     14  14  14  14         PWR 'VCC'
B0      7   7   7   7         PWR 'GND'

★部分で部品の大きさとパッケージ内の個数を
示しています。
前処理としてコメント文字列である「 {xxx} 」を消して、
数字「4 4 4」だけを残したいのですが、この↓正規表現
ではうまくいきません。

   gsub(/{.*}/, "", $0)

{ }に囲まれた文字列という正規表現なのですが、
   {xxx} yyy {xxx} zz が
   1   2      3    4

残したいyyyまで消えて、最後尾のzzしか残らない
のです。
「/{.*}/」だと、{ }のくくりを、2と3を飛ばして「1~4」にし
ちゃっています。
ほんとは、1~2で処理。続いて3~4で処理と{ }を含
めて{ }内の文字列を消して欲しいのです。

しかたなく、↓のようなスクリプトでもって{ }を消して
います。
1文字ごと読み出して { 出現でコピーをオフ、} 検出以降
にコピー再開。

  ※こりゃawkのスクリプトじゃないぞ(笑)

#####   コメントを取り除く      #####
#   読み出したデータの中から「コメントフィールド」を取り除く
#   OrCADのライブラリソースのコメントは「{...}」となっている
#   直接バッファを操作して「{}」とコメントを取ってしまう
#   gsub(/{.*}/, "", $0)だと
#   「{xxx} yyy {xxx} zz」が yyyまで消えてzzしか残らない
function rmvcmnt(s,  c,f)
{
    r_bff = "";
    f = 0;              # 1で文字コピー禁止
    for(i = 1; i <= length(s); i++){
        c = substr(s, i, 1);                # 1文字取り出し
        if(c == "{")        f = 1;          # 「{」以降はコピーしない
        else if(c == "}")   f = 0;          # コピー再開
        else if(f == 0){                    # 文字連結
            r_bff = r_bff c;                # {xxx}以外の文字はコピー
        }
    }
    return r_bff;       # コメント削除した1行
}

正規表現を使っての何か良い手順はありませんかね?

※参考
ファイルから読み出した1行は「$0」に入る。
function rmvcmnt(s,  c,f)の s は関数への引数。
その次にスペースをあけてのc,fは関数内部だけの局所変数。

ほかにも、「 { } 」で囲まれたこんなコメントがあります。

      {000000000011111111112}
      {.....................}
      {012345678901234567890}
{  0.0}##...................
{  0.1}#.##.................
{  0.2}#...##...............
{  0.3}#.....##.............
{  0.4}#.......##...........
{  0.5}#.........##.........
{  0.6}#...........##.......
{  0.7}#.............##.....
{  0.8}#...............##...
{  0.9}#.................##.
{  1.0}#...................#
{  1.1}#.................##.
{  1.2}#...............##...
{  1.3}#.............##.....
{  1.4}#...........##.......
{  1.5}#.........##.........
{  1.6}#.......##...........
{  1.7}#.....##.............
{  1.8}#...##...............
{  1.9}#.##.................
{  2.0}##...................

これも行の中から消してしまいたいわけでして。

{X Size =}  、 {Y Size =}、{Parts per Package =}は
固定文字列なんで3つを個別にgsubで先に処理。
その後、「{  2.0}」などを正規表現で削除かな。

こんな具合に。

#    コメント文 {xxx} を消す
   gsub("{X Size =}", "", $0);                # コメント削除               
    gsub("{Y Size =}", "", $0);
    gsub("{Parts per Package =}", "", $0);
    gsub(/{.*}/, "", $0);                    # 残りの{...}を全部
   :

| | コメント (3) | トラックバック (0)

2018年9月20日 (木)

バッファロー WiFiルーター 「WHR-G301N」故障

文鎮製造元 の佐藤テック君がガレージに持ってきた
  「客先で使ってたんやけど故障」
      → 新しいのに交換
  「電源入れたらランプが点滅しっぱなしでだんまり」
  「ネットを探したら 似た症状がいっぱい出てくる」
  「ACアダプタが原因らしいんやけど、見てみる?」
っということで、酒の肴に故障原因追及です。
外観はこんな様子。
11
DC12V/1A出力のACアダプタが電源です。
さっそく本体のほうを解体。
プラスネジじゃなく、よくある「いじり防止用の星形ビス」。
11a
普通のプラスネジでエエやんっと、思うのですが・・・
ビスの中央にチョッポリが無いんでマイナスドライバーで回ります。

こんな基板が現れます。
12

基板の左右に「アンテナ」とおぼしきパターンがあります。
その下、▲マークのところには小さな同軸コネクタ。
   拡大↓
13
アンテナを増設できるんでしょうか?
よく分かりません。

電源部の様子。
13a
DC12Vを入力して、DC-DCコンバータICで内部電源の
3.3Vを作っています。
まず、トラブル発生時の電源波形を観察。
13b
12VのACアダプタ出力が安定しないので(内部回路が
動作しはじめて電流が流れると電圧ドロップ)、回路が
起動しません。
原因はACアダプタ。
ケースを割って内部を拝見。
  ※この時点では、コンデンサの劣化だろうと推測
15
「むむ。 液漏れや膨張はしていない」
基板の裏側↓
16
ハンダ割れも無し。
液漏れしていたら、基板をケースから出したときに
「イヤな臭い」がするんですが、特になし。
17
左は一次側コンデンサ。 
  (外装の剥けは基板に接着されていたから)
右の二つが二次側。 並列になっています。
容量を計っても、正常。

スイッチしてるパワーMOS FETが悪いのかと調べてみても正常。
18
フィードバック系のフォトカプラも大丈夫。
ということは、スイッチング電源の制御ICそのもの
(あるいはその周辺)がアウトになっているようです。
※ICがアウトのせいでしょう、一次側コンデンサに整流
出力(140V)が残ったままになっちゃっていました。
100Vを切った状態でしばらく放置してたのに、基板裏を
指先で触って「ビリッ」。
ちょいびっくり。

このACアダプタじゃなく、別の12V電源から電源を供給すると、
ちゃんと動き(動作表示LEDの光り方で)ます。
0.3Aくらいの消費電流でしたんで、1A定格のアダプタにとっては
そんなにきつい負荷じゃありません。

| | コメント (2) | トラックバック (0)

2018年7月24日 (火)

フォネティックコードを!

プログラミング教育」の前に、「フォネティックコード」を子供達に教えておいて欲しい。

欧文通話表(Alfa Bravo Charlie・・・)と和文通話表(アサヒのア、イロハのイ・・・)。
言葉で文字を間違いなく伝える手段として、先人のこんな知恵があるぞっと。

   ※モールスを教えておけとまでは言わないけど。

   ※メールアドレスとか装置の型番(英数字)を口頭で
    伝えるとき、これを知ってると知ってないで、話の
    進行がだいぶと違う。

| | コメント (2) | トラックバック (0)

2017年10月13日 (金)

自宅PC宛メールアドレスが変わります

自宅のネット接続、J:COMからeo光に変更しました。

状況:
  ・J:COMの同軸、遅い っと、息子どもが工事を依頼
  ・J:COM回線の撤去費用はeo光が負担すると
  ・ZAQのブログ、HPサービス中止 でアタマ(私の)に来てたから
     (すでに、ここniftyに移行済み)
  ・息子女房、J:COMメールが無くなっても影響は無い
     メールアドレス、変わって困るのは私だけ

ということで、自宅PC宛のメールアドレス、ZAQのが使えなくなります。
  旧 : noris@oct.zaq.ne.jp    ←これがアウトに
  新 : jh3dbo@hera.eonet.ne.jp ←これに変更

仕事場宛のメールは変わりません。
   geb02643@nifty.ne.jp
   jh3dbo@jarl.com      ←無線向け

| | コメント (1) | トラックバック (0)

2017年6月10日 (土)

10年ぶりの掃除!

2007年にやってきたガレージのPC …Win-XPで動いている
これのキーボード(キートップ)を洗いました。

ガレージの主調理テーブル、「ガステーブル」のそばなもんで
油汚れがひどいわけでして。
キートップとその周囲がむちゃ汚い!
今日の昼、10年目にして、やっと洗浄しました。

  キートップを抜き去ったキーボードのベース部。
11

お湯にマジックリン。
ゴシゴシ洗って新聞紙上で乾燥。
12

別のキーボードのキー配列を見ながらキートップを
差し込んで作業完了。
13

ツルツルになって新品同様になりました。

※追記
10年ぶりっと思ってましたが、実は2011年8月
にも掃除してました。

| | コメント (0) | トラックバック (0)

2017年3月 8日 (水)

広告なんですが・・・

ネット見てると、あちこちに現れる広告。
まぁ、確かに広告。
「Digi-Key」で部品を買ってますし
「Keystone」のパーツも買いました。

しかし・・・・

「30円のゴムブッシュを買って」っと広告が出るのは
いかがなものか。 (長いことこれが提示されている)

A1

もっと、高機能、高額なパーツを出せばよいのにっと
思ってしまうんですが・・・・

| | コメント (0) | トラックバック (0)

2016年11月24日 (木)

「リコール情報」

なかなか面白い。
・リコール情報 | リコールプラス

| | コメント (0)