Comment detail
アクセスログのIPアドレスを逆引き (Nested Flatten)
すみません。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
|





sumim
#1787()
[
Smalltalk
]
Rating0/0=0.00
| 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 closeRating0/0=0.00-0+
1 reply [ reply ]