ほんとのこと知りたいだけなのに。

夏休みはもうおわり。

Windows で trival-ssh が出来ない件

(ql:quickload :trivial-ssh) すると [package libssh2]. で停止する。

表示されるコマンドを msys2 のターミナルで叩くと成功する模様

yanqi@ MINGW64 ~/.emacs.d/dist/emacs                                                                                                                              
$ gcc -o "C:\Users\yanqi\AppData\Local\common-lisp\sbcl-1.3.15-win-x64\C\Users\yanqi\prj\trivial-ssh\libssh2\libssh2-libc-cffi__grovel-tmpGHU3ALSV.obj" -c -m64 -IC:/Users/y 
anqi/prj/cffi/ "C:\Users\yanqi\AppData\Local\common-lisp\sbcl-1.3.15-win-x64\C\Users\yanqi\prj\trivial-ssh\libssh2\libssh2-libc-cffi__grovel.c"                              
                                                                                                                                                                             
yanqi@ MINGW64 ~/.emacs.d/dist/emacs                                                                                                                              
$ echo $?                                                                                                                                                                    
0                                                                                                                                                                            

yanqi@ MINGW64 ~/.emacs.d/dist/emacs
$ ls -la /c/Users/yanqi/AppData/Local/common-lisp/sbcl-1.3.15-win-x64/C/Users/yanqi/prj/trivial-ssh/libssh2/libssh2-libc-cffi__grovel-tmpGHU3ALSV.obj
-rw-r--r-- 1 PC568+yanqi PC568+yanqi 5537 9月   2 14:52 /c/Users/yanqi/AppData/Local/common-lisp/sbcl-1.3.15-win-x64/C/Users/yanqi/prj/trivial-ssh/libssh2/libssh2-libc-cffi_ _grovel-tmpGHU3ALSV.obj

コードを眺めてみる。

trivial-ssh-libssh2.asd(cffi-grovel:grovel-file "libssh2-libc-cffi") で libssh2 をコンパイルしているがここで止っている様子

cffi-grovel:grovel-file

cffi-grovel:grovel-file はクラスでした。

(defclass grovel-file (process-op-input cc-flags-mixin)
  ()
  (:default-initargs
   :generated-lisp-file-type "processed-grovel-file")
  (:documentation
   "This ASDF component represents an input file that is processed
    by PROCESS-GROVEL-FILE."))

grovel.lisp

grovel.lispprocess-grovel-file で帰ってこない模様。

(cc-compile o-file inputs)
;;; *PACKAGE* is rebound so that the IN-PACKAGE form can set it during
;;; *the extent of a given grovel file.
(defun process-grovel-file (input-file &optional (output-defaults input-file))
  (with-standard-io-syntax
    (let* ((c-file (generate-c-file input-file output-defaults))
           (o-file (make-o-file-name c-file))
           (exe-file (make-exe-file-name c-file))
           (lisp-file (tmp-lisp-file-name c-file))
           (inputs (list (cc-include-grovel-argument) c-file)))
      (handler-case
          (progn
            ;; at least MKCL wants to separate compile and link
            (cc-compile o-file inputs)
            (link-executable exe-file (list o-file)))
        (error (e)
          (grovel-error "~a" e)))
      (invoke exe-file lisp-file)
      lisp-file)))

cc-compile

cc-compile は コンパイルしているだけ。

(defun cc-compile (output-file inputs)
  (apply 'invoke-builder (list *cc* "-o") output-file
         "-c" (append *cc-flags* #-windows '("-fPIC") inputs)))

invoke-builder

(defun invoke-builder (builder output-file &rest args)
  "Invoke the C Compiler with given OUTPUT-FILE and arguments ARGS"
  (with-temporary-output (output-file)
    (apply 'invoke `(,@builder ,output-file ,@args))))

invoke

ここの以下の場所で帰ってこない。

(run-program cmd :output :interactive :error-output :interactive)

(defun invoke (command &rest args)
  (when (pathnamep command)
    (setf command (native-namestring command))
    #+os-unix
    (unless (absolute-pathname-p command)
      (setf command (strcat "./" command))))
  (let ((cmd (cons command (mapcar 'program-argument args))))
    (safe-format! *debug-io* "; ~A~%" (escape-command cmd))
    (dolist (d cmd)
      (print d))
    (run-program cmd :output :interactive :error-output :interactive)))

run-program

UIOP/RUN-PROGRAM:RUN-PROGRAM な様子。

UIOP か。。。

UIOP 見るかぁ

で、時間がないので今度にしよう。

Windows10 でインストールするもの 2017

仕事で Windows を利用することになった。 家でも Windows を常用することにした。

何インストールしたか別らんくなるので、自身の環境を書いておく。

環境

  • Emacs
    • これが無いと私はIT技術者として成り立ちません。
  • CorvusSKK
    • 日本後入力はこれがないとなりたちません。
  • Msys2
    • Cygwin よりこれを利用しろと知人に言われたので。
  • SplashID Safe
    • パスワード地獄は現世のことですよね。
  • Launchy
    • これがシンプルで一番使いやすいです。
  • Poderosa
    • ひさしぶりに見たらバージョンアップしていました。
    • 職場では(個人で)有料ライセンスを購入して利用しています。

プログラミング

言語

Lang software
Common Lisp roswell
Python miniconda
Javascript nodist

バージョン管理

  • Git
    • これは Msys2 でインストールしています。
  • Github Desktop
    • コマンドでやれって言われるかもしれませんが楽なので。

ブラウザ

プライベートでは Vivaldi をメインに利用しています。 仕事では Google Chrome を利用しています。

データベース

今までは MySQL を利用していましたが PostgreSQL を利用することにしました。 仕事が PostgreSQL なので。

ストレージ

なんか多いですね。

画像

娯楽

おわり

Chef でも使えば良いのかな。 と思いつつもそんなに再インストールするかな。

まぁいいや。 まぁいいか?

D3.js の基本がどうも理解できていないので整理してみる。

これまで D3.js を何度が利用することはあったがほとんどコピペだった。

それでも十分動くんだけど、個々の命令やその動作について理解できていない。

使いこなす必要が出てきそうなので整理してみる。

やること

まずやること。 内容はシンプル。 rect を追加するだけ。

下図の左の状態を右の状態にする。

実行前
<svg id="d3">
    // ここに
    // rect要素を三つ
    // 追加します。
</svg>
実行後
<svg id="d3">
    <rect></rect>  // __data__ = 1
    <rect></rect>  // __data__ = 2
    <rect></rect>  // __data__ = 3
</svg>

コード と説明

次はコード。こんだけ。

d3.select("div#d3")
  .selectAll('rect') // 追加対象の要素を指定する。
  .data([1, 2, 3])   // 追加対象のデータを指定する。
  .enter()           // データの個数分以下の処理をする。
  .append("rect")    // rect要素(<rect></rect>)をdiv#d3に追加する。

(1) select

要素を追加する先の要素を指定する。

See Also

(2) selectAll

追加対象の要素を選択する。 これを実行した段階ではまだ rect 要素は追加されていない。

この命令が一番わかりにくい。 どうやら 引数のselector で指定した要素を取得してどこかに保持するみたい。

(恐らく)ここで選択した要素と、次で指定するデータを突き合わせて追加/変更削除するんじゃなかろうか。

See Also

(3) data

追加する rect 要素のデータを指定する。

イメージとしてはここで指定された個数の rect 要素が追加される。

まだここでも rect 要素は追加されていない。

(恐らく)ここでデータと要素がバインドされるんかな。

See Also

(4) enter

data メソッドで指定されたデータの個数分これ以降のメソッドチェーンの処理を繰替えす。

まだここでも rect 要素は追加されていない。

Common Lisp で言うところの dolist みたいなものだろう。

Value

Returns the enter selection

See Also

(5) append

select メソツドで指定した要素(svg#g3)に rect 要素を追加する。

ここで初めて rect 要素が作成され追加される。

See Also

おわり

ざっと眺めてみたんだけど、やはりしっくりこない。

以下の二種類についての構成/仕組みが理解できていないからかな。というように感じた。

  • データをバインドする。
  • 各命令の戻り値。

次回はそのあたりを整理したいな。