Open Source WEB



2005-05-31 [quine] さらにクワイン

こんなサイトがあるのを教えてもらった.

http://www.nyx.net/~gthompso/quine.htm

そこにあった Scheme の例.

((lambda (x) `(,(reverse x) ',x)) '(`(,(reverse x) ',x) (x) lambda))

Gauche で評価すると,

gosh> ((lambda (x) `(,(reverse x) ',x)) '(`(,(reverse x) ',x) (x) lambda))
((lambda #0=(x) #1=`(,(reverse x) ',x)) '(#1# #0# lambda))

おっとっと.おまじないを忘れた.

gosh> (read-eval-print-loop #f #f
        (lambda vals 
          (for-each (lambda (v) (write v) (newline)) vals)))

今度は大丈夫かな.

gosh> ((lambda (x) `(,(reverse x) ',x)) '(`(,(reverse x) ',x) (x) lambda))
((lambda (x) `(,(reverse x) ',x)) '(`(,(reverse x) ',x) (x) lambda))

ぱちぱち.

--nobsun


Name:
Comment:
cut-sea: (Tue May 31 22:34:50 2005 )
このサイトすごいですね。
viがあるし。
Pharme98: (Mon Nov 8 05:31:57 2010 )
Hello! dedkbkg interesting dedkbkg site!
Pharmd738: (Mon Nov 8 05:32:24 2010 )
Very nice site! cheap cialis http://ypxaieo.com/oooxqy/4.html
Pharmc153: (Mon Nov 8 05:32:36 2010 )
Very nice site!


2005-05-30 [quine] 自分自身を印字するプログラム

もっとも有名なのは BASIC

10 LIST

Haskell では

main=putStr(x++show x);x="main=putStr(x++show x);x="

こんなのもあります,さて,何という言語でしょう.

+++++++>++++>+++>++>++>++++++>++++>++++>++++>++++>++++>+++++++>+++++>+++++>+++++
>+++++>+++++++>+++++++>+++++++>+++++++>+++++++>+++++++>++>++++++>+++++>+>+>+>+>+
>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>++++>++>++++++>++>++++++>+++++>+>+>
+>+>+>+>+>+>+>+>+>+>++++>++>++++++>+++++>++>++++>++>++++++>++>++++++>++>++++>+++
++++>++++>+>+++++>+++++>+++++>+>++++>++++>++>++++++>++++>+++++++>++++>+>+++++>++
>++++++>+++>++++>+++++++>+++++>+++++>+++++>+++++>+>+>++++>+>++++>+++>++++>++++>+
+>++++++>++++++>+++++>++>+++++>+>+++++>+++++++>++++>++++>+>+>+>+>+>+>+>+>+>+++++
>+>+>+>+>+>+>+++++>++>++++++>+>+>+>+>+>+>+>++++>++++>+++++++>++++>++++++>++++><[
<]<<+++++++[->++++++>+++++++++<<]>+>->[[-<<.<+<++>>>>]<.[->+<]<[-<<+>>>+<]<-[-[-
<->[-<++++++++++++>[-[-<+++++++++++++++++++++++++++>[-]]]]]]>>>>]<<<<<[--.<]

おきにいりの言語で挑戦してみてください.

--nobsun


Name:
Comment:

There is no comment.


2005-05-27 [Haskell] もっとも頻繁に紹介される Haskell のコード

昨日の Scheme のコードはワケワカラン.というわけで今日は, 分りやすいのにしよう.Haskell のクイックソート

quicksort :: Ord a => [a] -> [a]
quicksort []     = []
quicksort (x:xs) =  quicksort [ y | y <- xs, y < x ]
                 ++ [x]
                 ++ quicksort [ y | y <- xs, y >= x ]

なんと分りやすい.「そのままやんけ」コード.

--nobsun


Name:
Comment:
shiro: (Sat May 28 19:05:37 2005 )
Gauche-0.8.4からsrfi-42 (eager comprehension) がサポートされるので、こんなふうに書けます。

(use util.match)
(use srfi-42)
(define (qsort seq)
  (match seq
    (() '())
    ((x . xs) (append (qsort (list-ec (: y xs) (if (< y x)) y))
                      (list x)
                      (qsort (list-ec (: y xs) (if (>= y x)) y))))))


2005-05-26 [Scheme] もっとも Scheme らしいコード

新企画「最も [ Language ] らしいコード」シリーズ(?_?)

[ Language ] のところにお気にいりのプログラミング言語をいれて, 最も,その言語らしいと思う(もちろん独断と偏見で^^;)短いコード

今日は Scheme 編.いろいろあるけど,これかなぁ

((lambda (Y)
   ((lambda (factorial) (factorial 10))
    (Y (lambda (f)
         (lambda (n)
           (if (= n 0)
               1
               (* n (f (- n 1)))))))))
 (lambda (F)
   ((lambda (M)
      (F (lambda (x) ((M M) x))))
    (lambda (M)
      (F (lambda (x) ((M M) x)))))))

define を使わずに (factorial 10) を計算するプログラム を書いたもの.(by λ教原理主義者)

ま.普通は

(define (factorial n)
  (if (= n 0)
      1
      (* n (factorial (- n 1)))))

(factorial 10)

と書くんだけどね.

--nobsun


Name:
Comment:

There is no comment.


2005-05-25 [misc] 日付の差

ログなどを解析していると日付の差が知りたいことがある.

大抵の言語には 日付 <-> UTC 変換機能関数が提供されているので, 日付文字列を内部の日付データに変換できれば,欲しい計算はできる.

以下は Apache ログの %t フォーマットに対応した日付の差を計算する 関数 diffDate の Haskell でのベタな定義

import System.Time

-- Apache %t format
--  ex. "[24/May/2005:15:51:00 +0900]"

diffDate :: String -> String -> TimeDiff
diffDate af bf 
 = normalizeTimeDiff $ diffClockTimes (dstr2time af) (dstr2time bf)

dstr2time :: String -> ClockTime
dstr2time s
 = toClockTime ct
   where
     ct = CalendarTime
           { ctYear     = read yr
           , ctMonth    = str2Month mt
           , ctDay      = read dy
           , ctHour     = read hr
           , ctMin      = read mn
           , ctSec      = read sc
           , ctPicosec  = 0
           , ctTZ       = str2TZ tz
           , ctIsDST    = False
           }
     (_, _:s1) = break ('['==) s
     (dy,_:s2) = break ('/'==) s1
     (mt,_:s3) = break ('/'==) s2
     (yr,_:s4) = break (':'==) s3
     (hr,_:s5) = break (':'==) s4
     (mn,_:s6) = break (':'==) s5
     (sc,_:s7) = break (' '==) s6
     (tz,   _) = break (']'==) s7

str2Month s
 = case s of
     'J':'a':'n':_ -> January
     'F':'e':'b':_ -> February
     'M':'a':'r':_ -> March
     'A':'p':'r':_ -> April
     'M':'a':'y':_ -> May
     'J':'u':'n':_ -> June
     'J':'u':'l':_ -> July
     'A':'u':'g':_ -> August
     'S':'e':'p':_ -> September
     'O':'c':'t':_ -> October
     'N':'o':'v':_ -> November
     'D':'e':'c':_ -> December

str2TZ [s,h0,h1,m0,m1]
 = case s of
     '+' -> read [h0,h1] * 3600 + read [m0,m1] * 60
     '-' -> negate (read [h0,h1] * 3600 + read [m0,m1] * 60)

実行例

*Main> diffDate "[24/May/2005:15:51:00 +0900]" "[24/Feb/2005:15:02:00 +0900]"
TimeDiff {tdYear = 0, tdMonth = 0, tdDay = 0, tdHour = 0, tdMin = 0, tdSec = 7692540, tdPicosec = 0}
*Main> normalizeTimeDiff it
TimeDiff {tdYear = 0, tdMonth = 2, tdDay = 29, tdHour = 0, tdMin = 49, tdSec = 0, tdPicosec = 0}

--nobsun


Name:
Comment:

There is no comment.


2005-05-24 [デコード] URL中のエンコード文字列の変換

Apache のログの中には

%E6%A4%9C%E7%B4%A2

のようにエンコードされた文字列と

MySQL\xc6\xfc\xcb\xdc\xb8\xec\xa4\xce\xce\xb9

のようにエンコードされた文字列が混在するものがある. これらの文字列をデコードする簡易のスクリプト

-- declog.hs
module Main where
import System
import System.IO
import Data.Char

main :: IO ()
main = do { eof <- isEOF
          ; if eof then return ()
            else do { l <- getLine
                    ; putStrLn (conv l)
                    ; main
                    }
          }

conv :: String -> String
conv "" = ""
conv s@('%':ccs@(c0:c1:cs))
  | isHexDigit c0 && isHexDigit c1
     = chr (16*digitToInt c0+digitToInt c1) : conv cs
  | otherwise 
     = '%':conv ccs
conv s@('\\':'x':ccs@(c0:c1:cs))
  | isHexDigit c0 && isHexDigit c1
     = chr (16*digitToInt c0+digitToInt c1) : conv cs
  | otherwise 
     = '\\':'x':conv ccs
conv (c:cs) = c:conv cs

実行例

% echo "%E6%A4%9C%E7%B4%A2" | runhaskell declog.hs
検索
% echo "MySQL\xc6\xfc\xcb\xdc\xb8\xec\xa4\xce\xce\xb9" | runhaskell declog.hs
MySQL日本語の旅

--nobsun


Name:
Comment:

There is no comment.


2005-05-23 [Scheme,Python] 幽霊カウンタ

すでに一般に知られてメジャーになった感のあるクロージャ。
初歩の説明でまず出て来るのがカウンタの例で、次のはSICP的な メッセージパッシングスタイルのコード。

gosh> (define (make-counter n)
        (let1 c n
          (lambda (m)
            (case m
              ((init) (set! c n))
              ((inc) (inc! c))
              ((dec) (dec! c))))))
make-counter
gosh> (define c (make-counter 10))
c
gosh> (c 'inc)
11
gosh> (c 'inc)
12
gosh> (c 'inc)
13
gosh> (c 'dec)
12
gosh> (c 'init)
10

c は確かにカウンタオブジェクトっぽい。
では、ちょっとスタイルを変えてみよう。

gosh> (define (make-ghost-counter n)
        (let1 c n
          (values (lambda () (set! c n))
                  (lambda () (inc! c)) 
                  (lambda () (dec! c)))))
make-ghost-counter
gosh> (define-values (init1 inc1 dec1) (make-ghost-counter 10))
#<undef>
gosh> (init1)
10
gosh> (inc1)
11
gosh> (inc1)
12
gosh> (inc1)
13
gosh> (dec1)
12
gosh> (init1)
10

カウンタオブジェクトは姿を見せず(見えず)インターフェースを通して どっかにいるらしいのだけは分かる。 カウンタはどれ?って聞かれてもねぇ。(^^; 強いて言えば頭の中とメモリのどっか

おっと、本当にやりたかったのはPythonでのクロージャだった。

>>> def make_ghost_counter(n):
...     c = n
...     def init():
...         global c; c = n; return c
...     def inc():
...         global c; c +=1; return c
...     def dec():
...         global c; c -=1; return c
...     return init, inc, dec
... 
>>> (init1,inc1,dec1) = make_ghost_counter(10)
>>> init1()
10
>>> inc1()
11
>>> inc1()
12
>>> inc1()
13
>>> dec1()
12
>>> init1()
10

実は global って宣言がポイントだったみたい。 いやホント結構ハマリましたよ。(-,-;

--cut-sea.


Name:
Comment:
shibata: (Mon May 23 11:58:49 2005 )
これだと複数のカウンタを作れます。
def make_ghost_counter(n):
    c = [n,]
    def init(c=c,n=n):
        c[0] = n; return c[0]
    def inc(c=c):
        c[0] +=1; return c[0]
    def dec(c=c):
        c[0] -=1; return c[0]
    return init, inc, dec
shibata: (Mon May 23 12:08:23 2005 )
キーワード引数 いりませんでした
cut-sea: (Mon May 23 21:25:46 2005 )
ははぁ。代入すると強制的にローカルになり、
直接回避したければglobal宣言する。
shibataさんの書かれたのはオブジェクトの上書き
(「始めてのPython 第二版」p237)を使った方法ですね。
代入と上書きどう違うのかしばし考えたけど、
cをオブジェクトへのポインタとみなして、cの指している
先をすり替えるのが代入。(つまりcの値自体が変わる)
一方、cの指している先は変わらず、指している先の
オブジェクトの状態が変わるのが上書きかな。

気分としては[n,]なリストに対してc[0] = nステートメント
の意味するところは(疑似的に書くなら) [n,].set(0,n)
みたいな雰囲気かな。

リストというオブジェクトのメソッドを呼び出して0番目の
メンバをnにしている。
そうすっと、この場面でのリスト[n,]自体クロージャの様に
見えますねぇ。


Name:
Comment:
shibata: (Mon May 23 11:58:49 2005 )
これだと複数のカウンタを作れます。
def make_ghost_counter(n):
    c = [n,]
    def init(c=c,n=n):
        c[0] = n; return c[0]
    def inc(c=c):
        c[0] +=1; return c[0]
    def dec(c=c):
        c[0] -=1; return c[0]
    return init, inc, dec
shibata: (Mon May 23 12:08:23 2005 )
キーワード引数 いりませんでした
cut-sea: (Mon May 23 21:25:46 2005 )
ははぁ。代入すると強制的にローカルになり、
直接回避したければglobal宣言する。
shibataさんの書かれたのはオブジェクトの上書き
(「始めてのPython 第二版」p237)を使った方法ですね。
代入と上書きどう違うのかしばし考えたけど、
cをオブジェクトへのポインタとみなして、cの指している
先をすり替えるのが代入。(つまりcの値自体が変わる)
一方、cの指している先は変わらず、指している先の
オブジェクトの状態が変わるのが上書きかな。

気分としては[n,]なリストに対してc[0] = nステートメント
の意味するところは(疑似的に書くなら) [n,].set(0,n)
みたいな雰囲気かな。

リストというオブジェクトのメソッドを呼び出して0番目の
メンバをnにしている。
そうすっと、この場面でのリスト[n,]自体クロージャの様に
見えますねぇ。


2005-05-20 [Tips] 間欠的に文字を出力する

プログラムの標準入力へ定期的に文字を送りこむ実験をしたいことがある. そんなときに.

Bash

#!/bin/bash
while true; do
    echo -n "a"
    sleep 1
done

Gauche

#!/usr/bin/env gosh
(define (main args) (a))
(define (a) (begin (display #\a) (flush) (sys-sleep 1) (a)))

Haskell

#!/usr/bin/env runhaskell
\begin{code}
module Main where
import IO
import Control.Concurrent
main = putChar 'a' >> hFlush stdout >> threadDelay 1000000 >> main
\end{code}

--nobsun


Name:
Comment:
shiro: (Fri May 20 11:17:32 2005 )
beginいらないよ > Gauche版
nobsun: (Sat May 21 04:53:04 2005 )
宙に浮いた式が不安で。。。 begin で、気分をごまかしている Haskellerでした。


2005-05-18 [Tips] 格子点の列挙(on Scheme)

d が与えられたとき,原点からの距離が d 以下の格子点(正整数)を列挙する

Error in expanding macro: (img "mimetex.cgi?x \\geq 0, y \\geq 0, x^2 + y^2 \\leq d^2")
Invalid Image URL:  "mimetex.cgi?x \\geq 0, y \\geq 0, x^2 + y^2 \\leq d^2"

昨日のPythonの解を見て、やっぱりこれからの言語は内包表記サポートだぜ! (Haskellも持ってるし)って思ったあなた。

Schemeには確かに無いけど、いぢめられたら「作ればあるもん!」と反撃しましょう。:-)

comp.lang.schemeの投稿 や 「プログラミング言語SCHEME」にはそれより応用の可能な内包表記を実現するマクロが実質30行足らずで書いてあります。

そいつを使えば格子点の列挙も。

(use srfi-1)
(define (gridPoint d)
  (list-of (cons x y)           ;; 「プログラミング言語SCHEME」では set-of
    (x in (iota (+ d 1)))
    (y in (iota (+ d 1)))
    (<= (+ (* x x) (* y y)) (* d d))))

--cut-sea


Name:
Comment:

There is no comment.


2005-05-18 [Tips] 格子点の列挙

d が与えられたとき,原点からの距離が d 以下の格子点(正整数)を列挙する

Error in expanding macro: (img "mimetex.cgi?x \\geq 0, y \\geq 0, x^2 + y^2 \\leq d^2")
Invalid Image URL:  "mimetex.cgi?x \\geq 0, y \\geq 0, x^2 + y^2 \\leq d^2"

素朴な解(Python)は

def gridPoint(d):
    return [ (x,y) for x in range(0,d+1) for y in range(0,d+1) if x**2+y**2 <= d**2 ]

--nobsun


Name:
Comment:

There is no comment.


2005-05-17 [Tips] cal

今日は一年の内の何日目なんだろうって思ったこと無いですか? calコマンドを使ったことがあっても -j オプション使ったことなかったです。 ユリウス歴表示にするだけなんですがね。

cut-sea@mokili> cal
      May 2005
 S  M Tu  W Th  F  S
 1  2  3  4  5  6  7
 8  9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

cut-sea@mokili> cal -j
         May 2005
 S   M  Tu   W  Th   F   S
121 122 123 124 125 126 127
128 129 130 131 132 133 134
135 136 137 138 139 140 141
142 143 144 145 146 147 148
149 150 151

と言うわけで今日は137日目。
さらに、もういくつ寝るとお正月♪

cut-sea@mokili> cal -j | awk '/[A-Z]/;/^[0-9 ]+$/{for(i=1;i<=NF;i++){printf("%d ",365-$i)};printf "\n"}'
         May 2005            
 S   M  Tu   W  Th   F   S  
244 243 242 241 240 239 238 
237 236 235 234 233 232 231 
230 229 228 227 226 225 224 
223 222 221 220 219 218 217 
216 215 214 

まだまだだよ orz...
うるう年には注意しましょう。

--cut-sea.


Name:
Comment:

There is no comment.


2005-05-16 [Perl] OSがWindows NT/2000/2003/XPかどうか判定する

use strict;

my $IS_WINDOWS = $ENV{'OS'} eq 'Windows_NT';
print $IS_WINDOWS;

--yasuyuki


Name:
Comment:

There is no comment.


2005-05-13 [Tips] シーケンシャルデータ生成

シーケンシャルな数値を発生させたい場合です。 はっきり言って、そんなにちょくちょく必要になる場面じゃなし、 かといってその都度手書きってのもちょっとまぬけ。
計算機に使われてるって感じるのは避けたいものです。 やっぱり一行で涼しげに済ませたいですよね。

私はこれまでずっとこんな風にしてきました。

cut-sea@linux> yes | awk '{print NR}'| head -1000
1
2
:
:
999
1000

さらに最後に pipe で繋いで tail -100 とかすれば、開始をずらせますしね。
ところが、こんなコマンドをGNU/Linuxにて発見。

cut-sea@linux> seq 1 1000
1
2
:
:
999
1000
cut-sea@linux> seq -s , 1 10
1,2,3,4,5,6,7,8,9,10

もしくはNetBSDなら

cut-sea@netbsd> jot 1000 1
1
2
:
:
999
1000
cut-sea@mokili> jot -s , 10 1
1,2,3,4,5,6,7,8,9,10

jotに至ってはもっとずっと多彩なことができそうです。 ここのEXAMPLESあたり注目。
なお、jotはMac OS Xでも 動作するみたいです。

--cut-sea.


Name:
Comment:
yasuyuki: (Fri May 13 12:14:01 2005 )
Gaucheなら(use srfi-1)(iota 100)でしょうか。
hanatani: (Wed May 18 20:43:37 2005 )
> yes | cat -n | sed s/y// | sed s/\ //g


2005-05-12 [Tips] look

「をいをいシリーズ」かな(^^;
英単語のつづりに自信がない人向け。…あ、おれか。

cut-sea@mokili> look sun
sun
sunbeam
sunbeamed
sunbeamy
sunbird
   :
   :

などとsunで始まる単語をリストアップしてくれる。 man読めば分かりますけど /usr/share/dict/words を参照しているだけなのでファイル自体が無いと、

look: /usr/share/dict/words: No such file or directory

残念!

--cut-sea.


Name:
Comment:

There is no comment.


2005-05-11 [Tips] pgrep

走ってるprogramの名前でgrepをかけられる。

cut-sea@mokili$ pgrep kahua
2179
2180
2181
cut-sea@mokili$ pgrep init
1

今までps auxやps aefでパイプを繋いで 検索していた向きには便利。 もちろん単体で使うことはなくて、大抵何か 別のコマンドへの 引数として渡すんですが。

類似コマンドにpkillなんてのもあります。

    • cut-sea.


Name:
Comment:

There is no comment.


2005-05-10 [Python] Hello, world!

新シリーズ「何をいまさら...」^^;

深い故あって,Python を...

#!/usr/bin/env python
print 'Hello, world'

実行例

% chmod +x hello.py
% ./hello.py
Hello, world

2の100乗

print 2 ** 100

実行

% python 2beki.py
1267650600228229401496703205376

Haskellerとしては,

print (2 ** 100)

のように括弧がないのはちょっとキモイ.

--nobsun


Name:
Comment:

There is no comment.


2005-05-09 [π] 円周率を任意の桁まで表示する

円周率を小数点以下任意の桁まで表示するプログラム

import System
main = do { argv <- getArgs
          ; case argv of
              n:_ -> do putStrLn "3."
                        putStrLn $ concatMap show $ take (read n) (tail mypi)
              _   -> putStrLn "Usage: pi <n>"
          }

mypi = g (1,0,1,1,3,3)
 where
   g (q,r,t,k,n,l)
    = if 4*q+r-t<n*t
       then n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)
       else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)

たったこれだけで,任意桁までのπが求められる. ヒントは,

Error in expanding macro: (img "mimetex.cgi?\\displaystyle \\pi = \\sum\\limits_{i=0}^\\infty\\frac{(i!)^{2} 2^{i+1}}{(2i+1)!}")
Invalid Image URL:  "mimetex.cgi?\\displaystyle \\pi = \\sum\\limits_{i=0}^\\infty\\frac{(i!)^{2} 2^{i+1}}{(2i+1)!}"

実行例

% runghc pi.hs 20
3.
14159265358979323846
% runghc pi.hs 200
3.
14159265358979323846264338327950288419716939937510
58209749445923078164062862089986280348253421170679
82148086513282306647093844609550582231725359408128
48111745028410270193852110555964462294895493038196


Name:
Comment:
cut-sea: (Mon May 9 23:33:34 2005 )
runhugs でしか試せてないですが、

----
#! /usr/pkg/bin/runhugs

\begin{code}

import System
main = do { argv <- getArgs
          ; case argv of
              n:_ -> do putStrLn "3."
                        putStrLn $ strAppend $ map show $ take (read n) (tail mypi)
              _   -> putStrLn "Usage: pi <n>"
          }

strAppend [] = []
strAppend (x:xs) = x ++ strAppend (xs)

mypi = g (1,0,1,1,3,3)
 where
   g (q,r,t,k,n,l)
    = if 4*q+r-t<n*t
       then n:g(10*q,10*(r-n*t),t,k,div(10*(3*q+r))t-10*n,l)
       else g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)

\end{code}
----
とりあえず、こんな風にしないとputStrLnの型と一致しないって叱られます。
で、肝心のアルゴリズムについてはなぜだか分からずorz...
cut-sea: (Tue May 10 01:33:32 2005 )
こっちのがシンプルかな。

strAppend (x:xs) = foldl (++) x xs

どっかにライブラリでありそうとか思ったけど眠いのでもう寝ますけど。
nobsun: (Tue May 10 14:32:34 2005 )
うがぁー。またやっちまった。map じゃなくて concatMap っす。
修正しますた。


2005-05-06 [MySQL] MySQLでリモート接続を許可する

MySQLをバイナリーインストールしたとき、 デフォルト設定でポート3306がlisten状態になっているはずである。

そこで-hオプションでリモートホスト(ここでは192.168.0.123)を指定して接続してみる。

$ mysql -h 192.168.0.123 test
ERROR 1130: Host '192.168.0.234' is not allowed to connect to this MySQL

接続が拒否されてしまう。

実はMySQLは、データベースごとにリモート接続を許可する必要がある。

MySQLサーバーが動作しているリモートホストにログインして権限設定を行う。

$ ssh 192.168.0.123
mysql -u root
mysql> grant all privileges on *.* to yasuyuki@'192.168.0.0/255.255.255.0';
Query OK, 0 rows affected (0.16 sec)
mysql> \q
Bye
$ exit

ここではユーザーyasuyukiに対してすべての権限を許可している。 ユーザー名は適宜変更のこと。

(本番運用では、許可する対象や権限、ユーザーは最小限にとどめるべきである)

もういちど接続してみる。

$ mysql -h 192.168.0.123 test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 121 to server version: 4.0.23a-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test           |
+----------------+
1 rows in set (0.00 sec)

mysql> \q
Bye

--yasuyuki


Name:
Comment:

There is no comment.


2005-05-02 [bash] リダイレクト

「おぃおぃシリーズ」ふっか〜つ :) あるコマンドの標準出力と標準エラーへの出力を捨てたい場合,

$ command > /dev/null 2>&1

とやる.これは,

$ command 2>&1 > /dev/null

とすると,標準出力への出力は捨てられるけれど,標準エラーへの出力は コンソールに出てくる.なぜだぁ...

--nobsun


Name:
Comment:
shiro: (Thu May 12 06:25:50 2005 )
内部的には、リダイレクトはファイルディスクリプタテーブルの破壊的変更なんです。

2>&1         fdtab[2] = fdtab[1]
>/dev/null   fdtab[1] = open("/dev/null", ...)

従って処理の順番によって結果が異なります。
cut-sea: (Thu May 12 12:19:56 2005 )
なるほど。分かりやすい。
set!だから実行順序の影響(副作用)があるのもナットク。


このサイトは、 IPA の「平成15年度オープンソフトウエア活用基盤整備事業」 の委託事業として開発されたKahuaで試験的に運用しております。

Copyright (c) 2004-2007 株式会社タイムインターメディア About Us