昔の最近の出来事(2016.10)

2016/10/31

遅めに帰着。

ちょろりコーディング。

SAI2の新しいのが来ていたり。お疲れ様です。

2016/10/30

AM中に起床。

洗濯したり掃除したり。

Web散策していて知った動画。 色鉛筆画の作成動画なのですが、アタリとか無しでいきなり 描き込み始めてよく辻褄が合うなぁ?と思ったり。

2016/10/29

起きたら夕方。寝過ぎ。

また肩が痛くて起きてるのも億劫な感じですがやっと治まったり。

そういや7zコマンドに -x というオプションがあり、 「7z a archive.7z *.txt -x!temp.*」てな感じにすると、 temp.txtというファイルを含まないようにアーカイブを生成する事が できます。で、バックアップを取るのにこのオプションを使ってみた のですが何故かエラー。調べてみるとどうやらシェルにtcshを使って いたところ「!」がtcshのヒストリイベントの取り出しとして解釈 されてしまってたのが原因でした。 「7z a archive.7z *.txt -x\!temp.*」てな感じでエスケープ すればOKなのですが、もう少し深いハマリポイントがありました。
例えばbashでは「echo !temp」は「bash: !temp: event not found」 となりますが、「echo '!temp'」のようにシングルクォートで 括れば「!temp」とecho表示されます。 tcshも殆どの場合はシングルクォートで括ればその通りの bashと同様に書いた通りの文字列が引数と解釈されるのですが、 「!」だけは例外のようで、「echo !temp」も「echo '!temp'」も 「temp: Event not found.」となってしまうようです。 なので、シングルクォートで括る場合でも「echo '\!temp'」 とする必要があります。
個人的にちょろっとしたシェルスクリプトを作成する際、sh系はなんとなく 文法が訳判らない感じがある為、csh系で作成する事があるのですが、 たまに使うとこういう事でハマリます。修行が足りません(^^;

2016/10/28

遅めに帰着。

ちょろりコーディング。

2016/10/27

遅めに帰着。

そういやCygwinで /dev/nullファイルがサポートされているのに 今頃気づいたり。

2016/10/26

気持ち早めに帰着。

ちょろり調べ事。

2016/10/25

遅めに帰着。

ちょろり調べ事。

2016/10/24

早くもなく遅くもなく。

ちょろり調べ事。

2016/10/23

昼頃起床。

掃除したり洗濯したり。

そういえば、タブレットPCやスマホだと、メモリの容量よりも内蔵ストレージの 容量を前面に出してくる場合があります。スマホはともかくタブレットPCでは メモリ容量は、まだ機種選択の要素だと思うのですがそうでもないのかしら? まぁ、普通に使うならメモリは8GBもあれば十分という感じになっているので、 気にならなくなっているという所はあるかも知れませんが。

もそもそとSAI2を弄ったり。サボっていたせいもあり、塗りがイマイチ イイ感じにならない。

2016/10/22

AM中に起床。

用事を済ませてぐうたら過ごしたり。

2016/10/21

遅めに帰着。

あまりの眠さに急速停止。

2016/10/20

遅めに帰着。

NINTENDO SWITCH。携帯ゲーム機としたものかしら? どんなCPUかとか、どれくらいの性能のものかなど、 ハードの細かい所は判らず。高性能スマフォと同程度かな? と思われ。そういや価格も判らないな。発売予定まで半年切ってる と考えると情報が少な過ぎる気も。

2016/10/19

気持ち遅めに帰着。

SAI2向けにブラシテクスチャを作ってみたり。

2016/10/18

遅めに帰着。

調べ事をして終了。

2016/10/17

遅めに帰着。

あまりの眠さに急速停止。

2016/10/16

AM中に起床。

掃除したり洗濯したり。

先日PlantUMLのEmacsモードを弄っていて、シーケンス図については UTF-8テキストにも変換できる事を知りました。TeraTermで表示すると 確かにテキスト変換されていてスゲーと思ったのですが、同じファイルを Emacsで開くと罫線が崩れて表示されたり。どうやら、TeraTermでは 罫線が半角文字で表示されているのですが、Emacsでは全角で表示されてて その差が見えている事が判ったり。ある文字をどう表示するかには 規定は無いという事なのかしら?

2016/10/15

AM中に起床。

散髪の予約を入れた所、AM中に可能という事だったので慌てて準備して出かけたり。

ネットワーク接続ができなくなる件。どうやらPC側の問題の模様。PowerDVDで DLNA上の動画ファイルを再生した後、再生途中でPowerDVDウインドウを閉じると、 何かしらの原因で外向きのネットワークが見えなくなる模様。 契機はPowerDVDかも知れませんが、Windows側に何か問題があるのかも知れません。 で、スリープ→リジュームでは復帰しなかったのですが、再度PowerDVDを起動して DLNA上の動画ファイルを再生するとネットワーク接続が復帰しました。 何かしら経路が詰まっていて、それが解消されない限り復帰しない感じなのかも 知れません。
対応としては、動画再生中にPowerDVDをいきなり閉じるのではなく、一度再生停止 してから閉じると大丈夫そう。そのうち大丈夫になれば良いですが、対応方法が あるので 当面はこれでしのぐ感じで。

EmacsのPlantUMLモードを探してみたり。org-modeに組み込む方法は使うのですが、 直接ファイルをプリビューする方法が無いかな?と思ったのがきっかけです。 で、ELPAで探すと「plantuml-mode」と「puml-mode」の二つが出てきてたのですが、 日付の新しかったplantuml-modeを使ってみたり。org-modeの時もそうでしたが、 CygwinのEmacsではjavaに与えるファイルパスはcygpathコマンドで変換しないとダメ なのを直して動くようになったり。 一応、puml-modeの方も見てみた所、どうやらpumlの方が機能的には新しい感じ だったり。なんとなくplantuml-modeをベースにpuml-modeを作ったような 気配も。そんな感じだったので、puml-modeの方も対応してみたり。 そういやtramp経由で開いたファイルもプリビューできるか?と思って試してみた のですが、ダメそうだったので対応できないか調べてみたり。 何故かtrampを経由するとjarパスがうまく取得できないのを直してtramp経由も イケるようになってみました(^^)v 他にも何故か起動時にウインドウ分割されて 立ち上がる件も直したり。

そんな訳でpuml-modeのパッチを置いてみます (puml-mode-20160719.36-b.patch.xz)。
因みに.emacs(オールドスタイルですみません)には以下を追加。

;;-----------------------------------------------------------------
;;  puml-mode設定
;;-----------------------------------------------------------------
(setq puml-plantuml-jar-path (expand-file-name "/usr/local/bin/plantuml.8031.jar"))
(require 'puml-mode)
(setq puml-output-type "png") ;;普通は省略するのが良いかも
(add-to-list 'auto-mode-alist '("\\.puml\\'" . puml-mode))
(add-to-list 'auto-mode-alist '("\\.plantuml\\'" . puml-mode))

御参考まで。

2016/10/14

遅めに帰着。

Emacs-25 Specified time is not representable問題。ワークアラウンドは 効いていると判断。

もそもそと作文。10/15付けになってますが、 Emacsの雑記を更新 しました。パッチもEmacs-25.1対応を置いてみました。御参考まで。

2016/10/13

遅めに帰着。

Emacs-25 Specified time is not representable問題。
先日から今朝にかけてPCを立ち上げっぱなしにしていたのですが、 寝る為に丁度操作を止めたくらいの時刻にネットワーク接続が できなくなっていたらしくて、丁度止まった時刻の美人時計画像の ままになってました。
一旦、美人時計だけをストップしてPCをスリープ。帰ってきて からネットが復旧している事を確認して再度美人時計を立ち上げ。 昨日の美人時計サイトが無反応になったり、ネットワークが 繋がらなくなったり なんなんだ?
でも、スレッドローカル書き換えで耐えているので、もう概ね 大丈夫とみて良いかも知れません。

2016/10/12

遅めに帰着。

Emacs-25 Specified time is not representable問題。
美人時計サイトは復活した模様。様子見継続。

2016/10/11

遅めに帰着。

Emacs-25 Specified time is not representable問題。
様子見中のEmacsの美人時計が更新されなかったり。 美人時計のサイトにアクセスできなくなってるのが原因の模様。 美人時計だけを止めて様子見継続。スレッドローカル書き換えで イケそう。

いつの間にか寝てたり。

2016/10/10

AM中に起床。

Emacs-25 Specified time is not representable問題。
結局ワークアラウンド(非スレッドローカル)を入れて計3つを立ち上げていた のですが、全て逃げようのないケースでエラーしていたり。スレッドローカルに 書き換えたのでどうなるか、4つ立ち上げて様子見中。

洗濯したり掃除したり。

スレッドローカルに書き換えたワークアラウンドでなんとか耐えている模様。 途中の経路ではnanに化けているようですが、最後の置き換えの所で化けなければ なんとかなるかも。てか、これで耐えられるという事は、スレッドに起因するような バグがどこかに入っているって事になるのか?しばらく様子見。

2016/10/09

AM中に起床。

Emacs-25 Specified time is not representable問題。
コードをよく見ると色々読み違いしている所があったり。 ひとまずこれで何か引っかかるだろうとデバッグprintを仕込んで みているものの全然再現しなくなったり。デバッグメッセージを踏むように わざとエラーするようなlispコードを実行してみると ちゃんと引っかかったので網は大丈夫なハズなのですが....

やっと再現したと思ったら、何やら謎な感じになってたり。 time-addというELISPからも使える関数で二つある引数の片方が float且つnan だというデバッグprintの網にひっかかりました。 所がその先で更に関数呼び出しを行った後、同じ値をチェックしている ハズなのに、そちらはnanではなくなっているようです。

DEFUN ("time-add", Ftime_add, Stime_add, 2, 2, 0,
       doc: /* Return the sum of two time values A and B, as a time value.  */)
  (Lisp_Object a, Lisp_Object b)
{
  if( FLOATP(a)==1 ){if(isnan(XFLOAT_DATA(a))!=0){printf("time-add a is a float and nan\n");}} //この条件に引っかかった
  if( FLOATP(b)==1 ){if(isnan(XFLOAT_DATA(b))!=0){printf("time-add b is a float and nan\n");}}          │
  return time_arith (a, b, time_add);       ────┐                                                  │
}                                                   │                                                  │
                                                    │                                                  │
static Lisp_Object                                  │                                                  │
time_arith (Lisp_Object a, Lisp_Object b,     ←──┘                                                  │
            struct lisp_time (*op) (struct lisp_time, struct lisp_time))                                │
{                                                                                                       │
  int alen, blen;                                                                                       │
                                                                                                        ↓
  if( FLOATP(a)==1 ){if(isnan(XFLOAT_DATA(a))!=0){printf("time_arith a is a float and nan\n");}} //でもこちらには引っかからなかった 何故???
  if( FLOATP(b)==1 ){if(isnan(XFLOAT_DATA(b))!=0){printf("time_arith b is a float and nan\n");}}
  struct lisp_time ta = lisp_time_struct (a, &alen);
  struct lisp_time tb = lisp_time_struct (b, &blen);

で、再現した時にはこれと逆の現象が起こっているんじゃないか?と思ったりも。 つまり、例えばtime-add()の方ではnanではなかったのが、time_arith()ではnanに化け るといった感じで。(setq debug-on-error t)でバックトレースを表示した場合に、

Debugger entered--Lisp error: (error "Specified time is not representable")
  time-add(0.3 (0 0 0 0))
  timer-relative-time((22519 57752 299999 911044) 0.3 0 nil)
  timer-inc-time([t 22519 57752 299999 0.3 emneko nil nil 911044] 0.3 0)
  timer-event-handler([t 22519 57752 299999 0.3 emneko nil nil 911044])

という感じだったのですが、「(time-add 0.3 '(0 0 0 0))」を手動で 実行してもエラーにはなりません。なので、time-add()の先を追っていたのですが、 もし想像した現象が合っていたとすると、まぁそうなるわなという 感じです。コンパイラの問題なのかなぁ?

コンパイラの最適化オプションを-O0にしても再現する(途中からnanが沸いて出てくる) ようだったので、あまり単純な話ではないのかも。 仕方無いので、nanを食った場合は0.0と見做すようなワークアラウンドを試してみる 事にしたり。nanを食わした時でもエラーしなくなるという副作用があるので直した事に はなりませんが、普段使いで問題無く動作できるならOKという方向で。

ワークアラウンドが一応機能している感じではあったのですが、 なんか逃げようのないケースが一度発生したり。

1         double t = XFLOAT_DATA (low);
2         if( isnan(t)!=0 ){t=0.0;}                                           //ワークアラウンド
3         if (result && ! decode_float_time (t, result))
4           {
5             printf("decode_time_components NG XFLOAT_DATA(low)-> %f\n",t) ; //デバッグprint
6             return -1;
7           }

これでもデバッグprintでtがnanになっているケースでした。って、 2行目ではtはnanではなくて3,5行目ではtがnanになっているってどういう事? って感じです。まぁ、どういうメカニズムでnanに化けるのか判っていない訳ですが、 nanに化ける極限ケースに当たったのかも??
マルチスレッド的な物でレジスタが復元されないような事ってあるんだっけ?

double変数tをスレッドローカル変数に書き換えてみたり。効果があるかは判りませんが。

2016/10/08

昼過ぎ起床。寝過ぎ。

Emacs-25 Specified time is not representable問題。
仕掛けたデバッグprintなのですが、再現した時に表示されるのは 二つ。decode_time_components()関数の中でnanだった時のケースと、 check_time_validity()関数の中でエラーとなったケース。で、 check_time_validity()関数の呼び出しはEmacs本体ソースの中に 二つしか無く、いずれもdecode_time_components()を実行した 後のチェックの為に呼び出しているという関係になっています。
で、check_time_validity()の呼び出し元が知りたいので、 check_time_validity()でエラーする条件をcheck_time_validity()の 呼び出し元でも実行してデバッグprintとしてみているのですが、

コードの概要
:
val=decode_time_components() ;
check_time_validity(val) ;     //val<0の場合はエラーメッセージが表示される
if(val<0){printf("debug\n");}  //何故か実行されていない?
:
$ grep -A1 check_time_validity src/*.c
src/editfns.c:check_time_validity (int validity)                        ─┐check_time_validity()
src/editfns.c-{                                                           │の本体
--                                                                        │
src/editfns.c:      printf("check_time_validity NG (%d)\n",validity) ;    │
src/editfns.c-      if (validity < 0)                                   ─┘
--
src/editfns.c:  check_time_validity (val);
src/editfns.c-  if(val<0){printf("lisp_time_struct NG %d\n",val);}
--
src/editfns.c:  check_time_validity (val);
src/editfns.c-  if(val<0){printf("lisp_seconds_argument NG %d\n",val) ;}
再現した時のデバッグprint出力

decode_time_components NG XFLOAT_DATA(low)-> nan
check_time_validity NG (-1)

何故か実行されていないというのが謎な状況という訳です。 単に変なデータになる元を追跡しているだけなのですが、まさかこんな 面倒な事になるとは。

もしかしてcheck_time_validity()内でエラーと判定したら戻ってこない? と思い直して、check_time_validity()の前にデバッグprintを移動。 正解でした(^^; 修行が足りません。
で、関数lisp_time_struct()からのdecode_time_components()呼び出しの際に nan LISPオブジェクトを食わせているという感じなのが判りました。 disassemble_lisp_time()で得られた結果をdecode_time_components()に 食わせて、値の妥当性をチェックとint型の値の取得をしているというコードのようです。 decode_time_components()は入力となる値がfloatかintかで結果も floatかintのどちらか一方しか得られないという関数なのですが、 lisp_time_struct()ではintの方を所望の為、decode_time_components()の 入力がfloatになっている時点で何か変です。でもコードを見る限り、 disassemble_lisp_time()でfloat型を返すような仕掛けにはなっていなさそう なのですが...?
どうやらdisassemble_lisp_time()は、入力がfloat型だった場合は そのまま使うという仕掛けのようで、nanだったとしてもそのまま 使う事になってるようです。少し絞れて来たのですが、まだ現場を 押さえる事はできてません。

拙作mcalendarを 更新しました。 一番最初の振替休日(1973/4/30)が休日になっていなかったのを修正しました。 御参考まで。

2016/10/07

遅めに帰着。

そういやC言語のif文の中に関数呼び出しを含む事は 当たり前ですが可能です。

  if( foo()>0 ){ ... }

で、論理演算を含んだ以下のような例も一応OKという事になってます。

  if( decode(&a)==0 && encode(a)==0 ){ ... }

しかし、このコードは

  if( encode(a)==0 && decode(&a)==0  ){ ... }

とするとうまく動かないかも知れません。 何より、条件が成立しなかったのをデバッガを使って ステップ実行で追いかける際、decode()かencode()のどちらが非ゼロを返した のかを見極めるのがちょっと面倒臭いです。以下のようにすれば実行 順序はより明示的になり、デバッガでも追いかけ易くなるかも知れません。

  if( decode(&a)==0 ){
    if( encode(a)==0 ){
      ...
    }
  }

入れ子が増えるのがイマイチなのを除けば。

Emacs-25 Specified time is not representable問題。何故かデバッグprintを 仕込んだのだけ再現せず。
しばらく動かしていたら再現したり。で、デバッグprintを調べたのですが、 どの網にもかかっていなかったり。えぇぇぇ〜〜〜??

2016/10/06

遅めに帰着。

Emacs-25 Specified time is not representable問題。再現せず。

調べ事をして終了。

2016/10/05

遅めに帰着。

Emacs-25 Specified time is not representable問題。
やっと網掛けに引っかかったと思ったらハズしてました。もう一度 コードを確認してみたところ、ELISPからも実行できるfloat-time 関数の中で使っていたり。if文の中で使っていたので見逃して ました。デバッグprintを仕込んで再ビルド&実行。そしてほったらかし。

2016/10/04

遅めに帰着。

ちょろり調べ事。

2016/10/03

遅めに帰着。

デバッグprintを仕込んだEmacsでエラーが再現せず。普段使いの方では ちょいちょい再現するのに。

Web巡回していて知ったブログエントリ 「 95%が空気でもいい。セクシーな女の子に「プラモデルの正体」を教わった話」。

2016/10/02

AM中に起床。

Emacs-25 Specified time is not representable問題。 lisp_time_struct()か、lisp_seconds_argument()のどちらかと いう見立てだったのですが、どちらでも無い感じだったり。 両方に共通して元となる無効な値を生成している可能性がある 関数decode_time_components()は、もう一か所keyboard.c:decode_timer() という関数でも使われていて、どうやらこの関数が無効な値を 生成しているんじゃないかと推測。で、デバッグprintを追加して 再ビルド&実行してほったらかし。

因みに、editfns.c:decode_time_components() 関数は、24.5の時は 浮動小数点LISPオブジェクトを入力にできなかったようですが、 25.1ではそれが可能になったようで、その浮動小数点数LISPオブジェクト がNaNになっているのがエラーとなる直接の原因です。何故NaNが食わされている かはまだよく判らず。

洗濯したり掃除したり。

なんかなかなか再現しないので、コードを少し眺めていたところ、 keyboard.c:decode_timer()内で呼び出している decode_time_components()は関係無いのかも?と思ったり。 というのは、decode_time_components()で浮動小数点戻り値を期待する 場合はポインタ引数を指定しなくてはならないのですが、 nullを渡してて値を捨てているように見えます。そもそも 浮動小数点LISPオブジェクトを渡していないのでは?と 思ったり。

2016/10/01

昼前起床。

Emacs-25。nyan-modeで「timer-relative-time: Specified time is not representable」 が発生してアニメーションが止まる件。頻度は高くないのでしばらく様子見。 それにしても、Arithmetic range error の件(結局Cygwinのバグだったのだろうという結論でしたが)もそうですが、 nyan-modeはタイマー系の不具合を色々釣れる感じです(^^;

どうやら拙作のemnekoでも「timer-relative-time: Specified time is not representable」 が発生する模様。これはそのうち美人時計とかでも発生する可能性があるかも。 調べた方が良い気がしてきました。ただこのエラーはC言語の ビルトイン関数領域のチェックで引っかかっているのですが、 困ったことにgdbからemacsを起動するとSegfaultで立ち上がらないという 問題があり、どうデバッグしたものか悩ましいです。

デバッグ向けにeditfns.c:time_overflow()関数を実行している箇所にprintf()を 仕込んでみたり。複数あるのでどこで引っかかるかを絞り込む所からと いう事で。しばらく起動してほったらかし。デバッガが使えれば スタックトレースとか見られるのでもっと楽に調べられる所なのですが、 まぁ仕方無しという感じ。

数時間動かしていたら引っかかったり。check_time_validity()という関数 で引っかかったのですが、この関数はただのチェッカーなので 変な値を生成する呼び出し元関数は判らなかったり。デバッガでバックトレース を見られないと辛い。さておき、この関数を呼んでいるのは lisp_time_struct()か、lisp_seconds_argument()のどちらかの模様。 デバッグprintを足して再ビルドし、またほったらかし。


TOP PREV