Comment detail

アクセスログのIPアドレスを逆引き (Nested Flatten)
Squeak Smalltalk で。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
| in out cache nameQueue restQueue mutex |
in := FileStream fileNamed: 'access_log'.
out := FileStream fileNamed: 'access_log.txt'.
cache := Dictionary new.
nameQueue := SharedQueue new.
restQueue := OrderedCollection new.
mutex := Semaphore forMutualExclusion.
[in atEnd] whileFalse: [
    nameQueue size < 1000 ifTrue: [
        | ip |
        ip := in upTo: Character space.
        restQueue add: in nextLine.
        [   | name |
            mutex critical: [
                name := cache at: ip ifAbsentPut: [
                    (NetNameResolver
                        nameForAddress: (NetNameResolver addressFromString: ip)
                        timeout: 30) ifNil: [ip]]].
            nameQueue nextPut: name] fork.
        out nextPutAll: nameQueue next; space; nextPutAll: restQueue removeFirst; cr]].
in close.
out close
すみません。nameQueue next のところで待ち合わせてしまうので、並列化されていませんでした(^_^;)。ということで、再チャレンジ。
 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
32
33
34
| in numLines out queue sema mutex cache |
in := FileStream fileNamed: 'access_log'.
out := FileStream fileNamed: 'access_log.txt'.
queue := SharedQueue new.
numLines := 0.
[in atEnd] whileFalse: [in nextLine. numLines := numLines + 1].
sema := Semaphore new.
[   numLines timesRepeat: [
        | pair |
        pair := queue next.
        pair first wait.
        out nextPutAll: pair second; cr].
    in close.
    out close.
    sema signal] fixTemps fork.
in reset.
cache := Dictionary new.
mutex := Semaphore forMutualExclusion.
[in atEnd] whileFalse: [
    queue size < 1000 ifTrue: [
        | ip rest pair |
        ip := in upTo: $ .
        rest := in nextLine.
        pair := {Semaphore new. #future}.
        queue nextPut: pair.
        [   | name |
            mutex critical: [
                name := cache at: ip ifAbsentPut: [
                    (NetNameResolver
                        nameForAddress: (NetNameResolver addressFromString: ip)
                        timeout: 30) ifNil: [ip]]].
            pair at: 2 put: name, ' ', rest.
            pair first signal] fixTemps fork]].
sema wait

Index

Feed

Other

Link

Pathtraq

loading...