Hatena::ブログ(Diary)

_

はてな表記

スーパーpre記法 シンタックスハイライト だと二重括弧が、註釈にならないみたい! これなしでLisp的なものを書くと変な事になる可能性が大 ← 自分

日記の検索

 

2012-02-12

AC 09:23

http://d.hatena.ne.jp/softether/20041001

電源がACだからじゃないか? と思った。

また、そう指摘する人もいる。

しかし、詳細が分かる範囲では、若干DCの人もいる様だ。

しかし、感電体験なしでACの人がいる事を考えれば、決してこの説が否定されたわけではない。

トラックバック - http://d.hatena.ne.jp/giveup/20120212

2011-01-18

root で make install 09:09

よく、configure と make までは普段使っているユーザでやって、make install だけ su なり sudo でやりましょう的な事が書いてあったりするけど意味あるのか?


まず、「普段使っているユーザ」に何でもできる様にしていない、って事実がある。これはどうしてか?

大きく考えると、間違えを犯す可能性があるからだと思う。これを仮定して、この「間違え」というのは、自分のオペミスか、悪い人に乗っとられてなにか、ってパターンがあると思う*1

で、後者を考えると、「悪い人」がいつのまにか「普段使っているユーザ」の権限で make しているソースを書換えて、make install で自分でトロイの木馬の様なものをインストールてしまったら全々意味ないし、仮に root になる事のハードルが高いなら、イタズラされる事のハードルを下げているだけな気がする。

でも、前者を心配しているなら意味はあるかもしれないけど、プログラムインストールしようとしているという目的が頭にあるなら、その時にそれ以外の事をやろうとするのか? 「rm -rf /」とか。僕が思いつくのは、目の前のコンピュータとは関係なしに、他人に声をかけられて席を外して、その間「悪い人」にイタズラされるという事かと思う。こういう危険があるかどうかは、環境によると思うけどログアウトなりして下さいって事になると思う。


何がいいたいかよく分からなんくなってきたけど、root で make install する事に特別メリットがある様には思えんのだよなぁ。root になる事のハードルが高いなら、ダウンロードから make install まで root でやるべきじゃないのかなぁ?

sicp 2.58 b 01:00

微分するやつ。web 見てもあんまり答え載ってなかった。

というかこれを sicp に出てきた関数だけでやったら、かなり面倒じゃないかと思う

という事で、かなりズルしてやった

(define-module deriv
  (use util.match)
  (use util.list)
  (use gauche.experimental.app)
  (use gauche.experimental.lamb)
  (export deriv))
(select-module deriv)
(define variable? symbol?)

(define (+ a b)
  (cond [(and (number? a) (number? b)) ((with-module scheme +) a b)]
        [(eqv? 0 a) b]
        [(eqv? 0 b) a]
        [else `(+ ,a ,b)]))

(define (* a b)
  (cond [(and (number? a) (number? b)) ((with-module scheme *) a b)]
        [(or  (eqv? 0 a) (eqv? 0 b)) 0]
        [(eqv? 1 a) b]
        [(eqv? 1 b) a]
        [else `(* ,a ,b)]))

(define (** a b)
  (cond [(eqv? 0 b) 1]
        [(eqv? 1 b) a]
        [(eqv? 0 a) 0]
        [(eqv? 1 a) 1]
        [else `(** ,a ,b)]))

(define (ope? exp)
  (memq exp '(+ - * / **)))

(define (pri ope)
  (assoc-ref '((+ . 1) (- . 1)
               (* . 2) (/ . 2)
               (** . 3))
             ope))

(define infix->prefix
  (letrec
      ((->
        (^. [(? (.$ not list?) v1) v1]
            [(v1) (-> v1)]
            [(v1 o1 v2) `(,o1 ,(-> v1) ,(-> v2))]
            [(v1 o1 v2 o2 . rest)
             (if (>= (pri o1) (pri o2))
                 (-> `((,(-> v1) ,o1 ,(-> v2)) ,o2 . ,rest))
                 `(,o1 ,(-> v1) ,(-> `(,v2 ,o2 . ,rest))))])))
    ->))

(define prefix->infix
  (letrec
      ((%add (lambda (pri-ope e res)
               (if (and (list? e)
                        (ope? (car e))
                        (<= pri-ope (pri (car e))))
                   `(,@(-> e) . ,res)
                   `(,(-> e) . ,res))))
       (-> (^. [(? (.$ not list?) v) v]
               [(v) (-> v)]
               [((? ope? ope) l r)
                (let1 pri-ope (pri ope)
                  ($ %add pri-ope l $ cons ope $ %add pri-ope r '()))]
               [malformed-exp (errorf "error: ~a" malformed-exp)])))
    ->))

(define (%deriv var exp)
  (define %d
    (^. [(? number? _)      0]
        [(? variable? exp)  (if (eq? exp var) 1 0)]
        [(x)                (%d x)]
        [('+ a b)           (+ (%d a) (%d b))]
        [('* a b)           (+ (* a (%d b))
                               (* (%d a) b))]
        [('** u n)          (* (* n (** u (+ n -1)))
                               (%d u))]
        [exp (errorf "cannot differentiate: ~s with ~s" exp var)]))
  (%d exp))

(define (deriv var exp)
  ($ prefix->infix $ %deriv var $ infix->prefix exp))

(select-module user)
(import deriv)

;; test
(begin
  ($ print $ deriv 'x 'x)
  ($ print $ deriv 'x '(x))
  ($ print $ deriv 'x '(x + 3))
  ($ print $ deriv 'x '(x * y))
  ($ print $ deriv 'x '(x + x))
  ($ print $ deriv 'x '(2 * x * y))
  ($ print $ deriv 'x '((x * y) * (x + 3)))
  ($ print $ deriv 'x '(2 * x + 4 * x))
  ($ print $ deriv 'x '(x ** 4))
  )

日米同盟の正体~迷走する安全保障 (講談社現代新書) 00:39

安倍晋三が総理になって、落されるまでが面白かった。まぁ、面白がっている場合かどうかは別として。


確かこの人が、総理になる前は北朝鮮に対して強行派みたいな感じで、それで名をはせた感じだった記憶がある

http://ja.wikipedia.org/wiki/%E5%AE%89%E5%80%8D%E6%99%8B%E4%B8%89

見たら経済制裁とかある


んでそれが当時、戦争相手というか対立する国を探していた米国の政策と一致したから調子が良かったらしいけど、後からイラクが大変になってきて北朝鮮はちょっと相手にしてられんくなってきて、安倍さん邪魔だからさようなら


という流れらしい。

*1:他にもあるだろうか?

トラックバック - http://d.hatena.ne.jp/giveup/20110118

2011-01-11

HYPERキー 10:16

ってのは、xmodmap 弄ってて名前だけ聞いた事あったけど、これにあった

http://www.paulgraham.com/symkey.html

あと SUPER は、パソコンのはwindowsキーになっているので、SUPERのままだなぁとか

トラックバック - http://d.hatena.ne.jp/giveup/20110111

2011-01-10

科学 22:40

http://d.hatena.ne.jp/propella/20070826/p1

話は変わるが、キャンプ中にまたアランさんの科学についての議論があって、いつもの事だけど僕は彼があまりにも科学を特別視しているのが理解できなかった。なぜたったこの数百年に起こった出来事が、そんなにも特別な事のように思えるのだろう。

これは結構そうだよなぁ、とか思っていたけど


http://pc.watch.impress.co.jp/docs/2006/0925/high43.htm

ケイ氏の目標は、子供の科学的・論理的思考力を高め、未来の大人社会の意識を改革することだ。

を考えると、科学っていっているのは物事に対しての考え方とか姿勢について言っているんじゃないかと思った。

そういう意味では、「この数百年に起った出来事」は、そういう考え方見につける為の練習にはなるのかもしれない。

トラックバック - http://d.hatena.ne.jp/giveup/20110110

2010-12-25

C言語のマクロでLispを書こう! 12:42

#include <stdio.h>
#include <stdlib.h>
typedef struct List_ {
  int d;
  struct List_ *nx;
} List;

#define CONS(car,cdr) (&(List){.d=(car), .nx=(cdr)})
#define NIL NULL

int main(void) {
  List *l1 = CONS(1,CONS(2,CONS(3,NIL)));
  List *i;
  for (i=l1; i; i=i->nx)
    printf("%d\n", i->d);
  return 0;
}

とりあえず Lisp は、出来たからこれで Prolog とか何でも書けばいいと思う。

↓解決できない 12:19

そういえば C99 だと、構造体のリテラルが書けたなぁと思って

typedef struct List_ {
  int d;
  struct List_ *nx;
} List;
List *l1 = &(List){.d=1, .nx=
           &(List){.d=2, .nx=
           &(List){.d=3, .nx=l1}}};

とか書いてみた。

l1 を グローバル変数とか static にすると、コンパイルできない。

「.nx=l1」のl1が定数でないからとの事。

コンパイラとしては l1 っていつの時点での l1 なの? って言いたいのかと思う。


これは、諦めてローカル変数でやってみる

#include <stdio.h>
#include <stdlib.h>
typedef struct List_ {
  int d;
  struct List_ *nx;
} List;
int main(void) {
  List *l1 = &(List){.d=1, .nx=
             &(List){.d=2, .nx=
             &(List){.d=3, .nx=l1}}};
  List *i;
  for (i=l1; i; i=i->nx)
    printf("%d\n", i->d);
  return 0;
}

無限ループするかな? とか思ったけど、「.nx=l1」の代入が、「l1 = ..」より早いらしく、変なメモリ見て死んだ。環境依存の動作かもしれない。

式の中で副作用が複数入ってたら、その実行順序は規定されないんだったっけ?

まぁとにかくダメ。

C言語の変数を初期化で相互/循環参照させる。static は無理? 11:04

extern void *a;
extern void *b;
void *a = &b;
void *b = &a;

は書ける。

でも、a,b を static にしようとすると、extern 書けなくなってダメ

でもそもそも、extern は相互参照させる為のものじゃない。

多分、関数のプロトタイプはあるけど、変数のプロトタイプは無いとかそういうのが問題。

構造体、共用体については、タグでこれを解決している。


どうしてもやりたかったら、実行時に代入するしかない?

でもそれだと、const にできなくなる。

上のやつだと、void * なのであまりに意味ないけど、ポインタ入りの構造体なら意味あるかも。


追記

http://d.hatena.ne.jp/RiSK/20101225/1293248494

仮定義というのがあるらしい。なるほどぉ

つか、C言語リファレンスマニュアルに載ってたと思ったけど、あんまり意味考えてなかった。

2010-12-12

またアメリカ酷いなぁという 22:22

http://twitter.com/magosaki_ukeru/status/11240534530072576

http://twitter.com/magosaki_ukeru/status/11242858958823424

ウィキ」ってのは、流れからして wikileaks っぽくて、こういう事を国務省がやっているってどうなんだろうか

僕とか、多分空気読めない系の人にとっては、言論の自由というか「何言っても良いですよ!」っていうポイントは重要だと思う

トラックバック - http://d.hatena.ne.jp/giveup/20101212

2010-11-25

愛国者法 01:06

色々面白いものがあったけど、眠いのでこれだけ(動画も途中からだけど)。

http://www.youtube.com/watch?v=wBWabMcDPf4

なんというか凄いですね。

「自由の国」でもなんでもない的な。

トラックバック - http://d.hatena.ne.jp/giveup/20101125

2010-11-01

emacs の正規表現 23:37

(string-match "[^\\[]" "[") => nil
(string-match "[\\[]" "[") => 0
(string-match "[^\\]]" "]") => nil
(string-match "[\\]]" "]") => nil

最後のはおかしくないか?

% emacs --version
GNU Emacs 23.2.1
Copyright (C) 2010 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
トラックバック - http://d.hatena.ne.jp/giveup/20101101
 
最近のコメント

好きなマンガ

h