« 2018年5月 | トップページ | 2018年8月 »

2018年7月11日 (水)

Swift4 はじめました

Swiftが登場してから随分経ちますが、こどもと Swift Playgroundsであそんだ程度だし、
自分も新しいワールドに突撃したばかりなので。。。このネタは続けるか、微妙な感じはしてますが。

間が空いちゃいました、お久しぶりでございます。

まだまだ、新しい環境で慣らし運転の身なのでペースは上がらないとおもいますので、そこんのところよろしくお願いしますw (^^;;

脳が疲れてw 早寝したのに、暑さで目覚めてしまったこともあり、
折角なので、Swiftを使ってsarの結果をcsv化してみた。csv化後はExcelのPivotを使ってグラフを作ると。。。、気分転換も兼ねてw

Swift初期版しか触ってないのに(書きたい気持ちはあったのですが、なかなかさわれてなかった。。。)、ということでSwift4でも遊べたらいいなぁ。と思いつつ、こんなときじゃないとやる暇なさげな感じもw
(Swift4の作法としてそれいいの?などもいろいろあろうかと思いますが、ここをこう変えたほうがいいかもよ。などございましたら、ご指摘していただけるとうれしいです。)


調べてたら、Swiftってこんな使い方もできるのね。という気づきもあり:)

Swiftのバージョンは以下のとおり。

discus-mother:˜ oracle$ swift -version
Apple Swift version 4.1.2 (swiftlang-902.0.54 clang-902.0.39.2)
Target: x86_64-apple-darwin17.6.0
discus-mother:˜ oracle$

今回使ったインプットは、先日ネタで取り上げてグラフまで貼り付けてたsarの結果です。
前回、Oracle Database Connect 2018 エキスパートはどう考えるか? 体感!パフォーマンスチューニング Ⅱ (番外編=没ネタ)で使ったCPU使用率グラフ。

内容は以下のとおり。

[muser@localhost ˜]# sar 5 10000 

Linux 4.1.12-94.3.6.el7uek.x86_64 (localhost.localdomain) 04/25/2018 _x86_64_ (12 CPU)

12:59:39 AM CPU %user %nice %system %iowait %steal %idle
12:59:44 AM all 0.82 0.00 0.15 0.00 0.00 99.03
12:59:49 AM all 1.87 0.00 0.39 0.02 0.00 97.73
12:59:54 AM all 3.13 0.00 0.64 0.34 0.00 95.89
12:59:59 AM all 1.23 0.00 0.42 0.44 0.00 97.91

・・・中略・・・

01:02:34 AM all 6.66 0.00 0.48 0.29 0.00 92.57
01:02:39 AM all 6.51 0.00 0.51 0.31 0.00 92.67
01:02:44 AM all 6.88 0.00 0.48 0.34 0.00 92.30
01:02:49 AM all 6.71 0.00 0.53 0.36 0.00 92.40

01:02:49 AM CPU %user %nice %system %iowait %steal %idle
01:02:54 AM all 6.69 0.00 0.55 0.31 0.00 92.46
01:02:59 AM all 6.38 0.00 0.63 0.24 0.00 92.75
01:03:04 AM all 6.61 0.00 0.58 0.32 0.00 92.48

・・・中略・・・

01:05:44 AM all 6.29 0.00 0.53 0.26 0.00 92.92
01:05:49 AM all 6.41 0.00 0.58 0.36 0.00 92.64
01:05:54 AM all 6.39 0.00 0.53 0.26 0.00 92.83
01:05:59 AM all 6.72 0.00 0.65 0.38 0.00 92.25

01:05:59 AM CPU %user %nice %system %iowait %steal %idle
01:06:04 AM all 6.61 0.00 0.55 0.32 0.00 92.51
01:06:09 AM all 6.95 0.00 0.58 0.48 0.00 91.99

・・・中略・・・

01:08:54 AM all 6.80 0.00 0.48 0.39 0.00 92.33
01:08:59 AM all 6.15 0.00 0.55 0.33 0.00 92.98
01:09:04 AM all 5.98 0.00 0.60 0.43 0.00 92.98
01:09:09 AM all 6.06 0.00 0.50 0.24 0.00 93.20

01:09:09 AM CPU %user %nice %system %iowait %steal %idle
01:09:14 AM all 6.51 0.00 0.57 0.48 0.00 92.44
01:09:19 AM all 6.55 0.00 0.50 0.21 0.00 92.75
01:09:24 AM all 6.62 0.00 0.56 0.38 0.00 92.44

・・・中略・・・

01:12:04 AM all 6.63 0.00 0.51 0.44 0.00 92.41
01:12:09 AM all 6.78 0.00 0.44 0.34 0.00 92.43
01:12:14 AM all 6.68 0.00 0.48 0.38 0.00 92.47
01:12:19 AM all 6.83 0.00 0.58 0.39 0.00 92.20

01:18:39 AM CPU %user %nice %system %iowait %steal %idle
01:18:44 AM all 7.08 0.00 0.61 0.41 0.00 91.90
01:18:49 AM all 6.79 0.00 0.53 0.34 0.00 92.34

・・・中略・・・

01:19:39 AM all 0.49 0.00 0.08 0.03 0.00 99.40
01:19:44 AM all 0.42 0.00 0.07 0.00 0.00 99.51
01:19:49 AM all 0.05 0.00 0.03 0.00 0.00 99.92
01:19:54 AM all 0.05 0.00 0.02 0.00 0.00 99.93
01:19:59 AM all 0.59 0.00 0.15 0.02 0.00 99.24


sarで取得したcpu使用率のログファイルを Swfitを使ってcsv変換しました。

discus-mother oracle$ 
discus-mother oracle$ chmod u+x sar2csv.swift
discus-mother oracle$ ll
total 408
-rwxr--r--@ 1 oracle staff 1413 5 1 18:50 sar2csv.swift
-rw-r--r--@ 1 oracle staff 10253 5 1 19:11 sar_production.csv
-rw-r--r--@ 1 oracle staff 30169 4 30 19:46 sar_production.log
-rw-r--r--@ 1 oracle staff 75418 5 1 19:46 sar_production.xlsx
-rw-r--r--@ 1 oracle staff 20176 5 1 19:37 sar_test.log
discus-mother oracle$
discus-mother oracle$ ./sar2csv.swift sar_test.log
Processing sar_test.log to sar_test.csv....
11526bytes written
discus-mother oracle$ ll
total 432
-rwxr--r--@ 1 oracle staff 1413 5 1 18:50 sar2csv.swift
-rw-r--r--@ 1 oracle staff 10253 5 1 19:11 sar_production.csv
-rw-r--r--@ 1 oracle staff 30169 4 30 19:46 sar_production.log
-rw-r--r--@ 1 oracle staff 75418 5 1 19:46 sar_production.xlsx
-rw-r--r-- 1 oracle staff 11526 6 26 23:45 sar_test.csv
-rw-r--r--@ 1 oracle staff 20176 5 1 19:37 sar_test.log
discus-mother oracle$

csv化した結果は以下のとおり

discus-mother oracle$ cat sar_test.csv

12:59:39,AM,CPU,%user,%nice,%system,%iowait,%steal,%idle
12:59:44,AM,all,0.82,0.00,0.15,0.00,0.00,99.03
12:59:49,AM,all,1.87,0.00,0.39,0.02,0.00,97.73
12:59:54,AM,all,3.13,0.00,0.64,0.34,0.00,95.89
12:59:59,AM,all,1.23,0.00,0.42,0.44,0.00,97.91
01:00:04,AM,all,6.33,0.00,1.13,0.17,0.00,92.37
01:00:09,AM,all,6.38,0.00,0.53,0.15,0.00,92.93

・・・中略・・・

01:19:29,AM,all,6.95,0.00,0.48,0.43,0.00,92.15
01:19:34,AM,all,5.31,0.00,0.39,0.24,0.00,94.06
01:19:39,AM,all,0.49,0.00,0.08,0.03,0.00,99.40
01:19:44,AM,all,0.42,0.00,0.07,0.00,0.00,99.51
01:19:49,AM,all,0.05,0.00,0.03,0.00,0.00,99.92
01:19:54,AM,all,0.05,0.00,0.02,0.00,0.00,99.93
01:19:59,AM,all,0.59,0.00,0.15,0.02,0.00,99.24

csvをExcelのpivotグラフを使って作ったグラフ

20180711_41732

最後に、やっつけで作ったSwift4のスクリプトは以下のとおり。とくにキャストしちゃってる箇所、これでいいのかなぁ。。。

discus-mother oracle$ cat sar2csv.swift

#!/usr/bin/swift
import Foundation

let csvExtension = "csv"

if CommandLine.argc == 2 {
let fileName = CommandLine.arguments[1]
let dir = URL(fileURLWithPath: FileManager.default.currentDirectoryPath)
let fileUrl = dir.appendingPathComponent(fileName)

do {
let csvFileUrl = fileUrl.deletingPathExtension().appendingPathExtension(csvExtension)
let csvFileName = csvFileUrl.lastPathComponent
print("Processing \(fileName) to \(csvFileName)....")

var bytesWritten = 0
let lines = try String(contentsOf: fileUrl, encoding: .utf8).split(separator: "\n")
if let outputStream = OutputStream(url: csvFileUrl, append: true) {
outputStream.open()
var isHeadline = true

for line in lines {
var csvline = line.split(separator: " ").joined(separator: ",") + "\n"
if line.contains("%user") && isHeadline {
bytesWritten = outputStream.write(
UnsafePointer<UInt8>([UInt8](csvline.utf8))
, maxLength: csvline.utf8.count
)
isHeadline = false
} else if !line.contains("%user") && !isHeadline {
bytesWritten += outputStream.write(
UnsafePointer<UInt8>([UInt8](csvline.utf8))
, maxLength: csvline.utf8.count
)
}
}
outputStream.close()
print("\(bytesWritten)bytes written")
}
} catch let myError {
print(myError)
}
}


| | コメント (0) | トラックバック (0)