Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
- 2004: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005: 01 02 03 04 05 06 07 08 09 10 11 12
- 2006: 01 02 03 04 05 06 07 08 09 10 11 12
- 2005-05-31 [quine] さらにクワイン
- 2005-05-30 [quine] 自分自身を印字するプログラム
- 2005-05-27 [Haskell] もっとも頻繁に紹介される Haskell のコード
- 2005-05-26 [Scheme] もっとも Scheme らしいコード
- 2005-05-25 [misc] 日付の差
- 2005-05-24 [デコード] URL中のエンコード文字列の変換
- 2005-05-23 [Scheme,Python] 幽霊カウンタ
- 2005-05-20 [Tips] 間欠的に文字を出力する
- 2005-05-18 [Tips] 格子点の列挙(on Scheme)
- 2005-05-18 [Tips] 格子点の列挙
- 2005-05-17 [Tips] cal
- 2005-05-16 [Perl] OSがWindows NT/2000/2003/XPかどうか判定する
- 2005-05-13 [Tips] シーケンシャルデータ生成
- 2005-05-12 [Tips] look
- 2005-05-11 [Tips] pgrep
- 2005-05-10 [Python] Hello, world!
- 2005-05-09 [π] 円周率を任意の桁まで表示する
- 2005-05-06 [MySQL] MySQLでリモート接続を許可する
- 2005-05-02 [bash] リダイレクト
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
2005-05-30 [quine] 自分自身を印字するプログラム
もっとも有名なのは BASIC
10 LIST
Haskell では
main=putStr(x++show x);x="main=putStr(x++show x);x="
こんなのもあります,さて,何という言語でしょう.
+++++++>++++>+++>++>++>++++++>++++>++++>++++>++++>++++>+++++++>+++++>+++++>+++++ >+++++>+++++++>+++++++>+++++++>+++++++>+++++++>+++++++>++>++++++>+++++>+>+>+>+>+ >+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>+>++++>++>++++++>++>++++++>+++++>+>+> +>+>+>+>+>+>+>+>+>+>++++>++>++++++>+++++>++>++++>++>++++++>++>++++++>++>++++>+++ ++++>++++>+>+++++>+++++>+++++>+>++++>++++>++>++++++>++++>+++++++>++++>+>+++++>++ >++++++>+++>++++>+++++++>+++++>+++++>+++++>+++++>+>+>++++>+>++++>+++>++++>++++>+ +>++++++>++++++>+++++>++>+++++>+>+++++>+++++++>++++>++++>+>+>+>+>+>+>+>+>+>+++++ >+>+>+>+>+>+>+++++>++>++++++>+>+>+>+>+>+>+>++++>++++>+++++++>++++>++++++>++++><[ <]<<+++++++[->++++++>+++++++++<<]>+>->[[-<<.<+<++>>>>]<.[->+<]<[-<<+>>>+<]<-[-[- <->[-<++++++++++++>[-[-<+++++++++++++++++++++++++++>[-]]]]]]>>>>]<<<<<[--.<]
おきにいりの言語で挑戦してみてください.
--nobsun
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
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
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
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
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.
これだと複数のカウンタを作れます。
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
キーワード引数 いりませんでした
ははぁ。代入すると強制的にローカルになり、 直接回避したければglobal宣言する。 shibataさんの書かれたのはオブジェクトの上書き (「始めてのPython 第二版」p237)を使った方法ですね。 代入と上書きどう違うのかしばし考えたけど、 cをオブジェクトへのポインタとみなして、cの指している 先をすり替えるのが代入。(つまりcの値自体が変わる) 一方、cの指している先は変わらず、指している先の オブジェクトの状態が変わるのが上書きかな。 気分としては[n,]なリストに対してc[0] = nステートメント の意味するところは(疑似的に書くなら) [n,].set(0,n) みたいな雰囲気かな。 リストというオブジェクトのメソッドを呼び出して0番目の メンバをnにしている。 そうすっと、この場面でのリスト[n,]自体クロージャの様に 見えますねぇ。
これだと複数のカウンタを作れます。
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
キーワード引数 いりませんでした
ははぁ。代入すると強制的にローカルになり、 直接回避したければ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
beginいらないよ > Gauche版
宙に浮いた式が不安で。。。 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
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
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.
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
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.
Gaucheなら(use srfi-1)(iota 100)でしょうか。
> 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.
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.
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
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
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...
こっちのがシンプルかな。 strAppend (x:xs) = foldl (++) x xs どっかにライブラリでありそうとか思ったけど眠いのでもう寝ますけど。
うがぁー。またやっちまった。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
There is no comment.
2005-05-02 [bash] リダイレクト
「おぃおぃシリーズ」ふっか〜つ :) あるコマンドの標準出力と標準エラーへの出力を捨てたい場合,
$ command > /dev/null 2>&1
とやる.これは,
$ command 2>&1 > /dev/null
とすると,標準出力への出力は捨てられるけれど,標準エラーへの出力は コンソールに出てくる.なぜだぁ...
--nobsun
内部的には、リダイレクトはファイルディスクリプタテーブルの破壊的変更なんです。
2>&1 fdtab[2] = fdtab[1]
>/dev/null fdtab[1] = open("/dev/null", ...)
従って処理の順番によって結果が異なります。
なるほど。分かりやすい。 set!だから実行順序の影響(副作用)があるのもナットク。