Browse Source

Änderungen vom 1.6.2017

master
Klaus Wendel 5 years ago
parent
commit
052d9927a9
  1. 75
      Einführung.txt
  2. 85
      go2lgl_l09/go2lgl_l09.go
  3. 45
      go2lgl_l09/myGui/myGui.go
  4. 91
      go2lgl_l09/myGui/qml/formular.ui
  5. 47
      go2lgl_l10/go2lgl_l10.go
  6. 78
      go2lgl_l11/go2lgl_l11.go

75
Einführung.txt

@ -16,9 +16,15 @@ Herzliche Grüße und einen guten Start in den neuen Monat,
Klaus Wendel
Go ahead! - Was wird kommen, wenn Java wieder eine Insel ist?
Go ahead! - Was wird kommen, wenn Java wieder eine Insel ist? (Kurs: Softwareentwicklung mit Go)
Ist Ihnen eigentlich schon mal aufgefallen, wie lange der i5-Aufkleber schon auf Ihrem Notebook klebt? Genau, die Hardware hat sich in den letzten 10 Jahren bei weitem nicht mehr so rasant weiterentwickelt, wie wir es aus den Jahrzehnten davor gewohnt waren. Wie schon in den 1980ern muß nun Leistungssteigerung wieder mehr durch Code-Optimierung erfolgen, jetzt vor allem durch effiziente Ausnutzung nebenläufiger Rechenprozesse. Optimierung des Programmierstils ist da nur eine Facette, und die alten Limitierungen der bisherigen Programmiersprachen-Platzhirsche wie Java oder C/C++ führen entweder zu Code-Bloat oder lassen den Arbeitsaufwand stark zunehmen. Optimierung der Werkzeuge ist deswegen die andere Strategie. Aus diesem Grund ist Go geschaffen worden, und unter seinen Schöpfern finden sich Urgesteine der Softwaregeschichte, wie z.B. die Unix-Väter Ken Thompson oder Rob Pike. Sie konnten es sich erlauben, das Beste der bekannten Sprachen abzuschöpfen und so bietet Go beispielsweise eine pragmatische Syntax wie Python, Typsicherheit wie Java und Maschinennähe wie C/C++. Und nicht nur technisch überzeugt Go. Zukunftsträchtigkeit ist der Entwicklung mit Go auch aus betriebswirtschaftlicher Sicht zu prognostizieren, denn Google liefert die finanzielle Basis für die Compilerentwicklung, hinter der längst eine mächtige Developercommunity entstanden ist.
Der Trend, dersich im Silicon-Valley bereits in den Gehältern wiederspiegelt, schlummert in Deutschland noch im Dornröschenschlaf. An den Unis wird weiterhin C++ gelehrt, an den FHs lernt man Java. Wir wagen etwas neues und lernen jetzt Go.
Da Go praktisch auf allen gängigen Systemen lauffähig ist, können Teilnehmer entweder ihren eigenen Rechner verwenden, oder bekommen für die Dauer des Kurses einen Raspberry Pi3 gestellt. Dessen Linux-Betriebssystem ist für den Kurs maßgeblich, Arbeiten unter Windows sollte aber möglich sein.
Zum Einlesen ist der kurze Aufsatz von Sebastian Mancke auf entwickler.de zu empfehlen: "Ist Golang das neue Java? (29. Mai 2017): https://entwickler.de/online/development/golang-das-neue-java-579800853.html
Ist Ihnen eigentlich schon mal aufgefallen, wie lange der i5-Aufkleber schon auf Ihrem Notebook klebt? Genau, die Hardware hat sich in den letzten 10 Jahren bei weitem nicht mehr so rasant weiterentwickelt, wie wir es aus den Jahrzehnten davor gewohnt waren. Wie schon in den 1980ern muß nun Leistungssteigerung wieder mehr durch Code-Optimierung erfolgen und jetzt vor allem durch effiziente Ausnutzung nebenläufiger Rechenprozesse. Optimierung des Programmierstils ist da nur eine Facette, und die alten Limitierungen der bisherigen Programmiersprachen-Platzhirsche wie Java oder C/C++ führen entweder zu Code-Bloat oder lassen den Arbeitsaufwand stark zunehmen. Optimierung der Werkzeuge ist deswegen die andere Strategie.
Optimierung der Werkzeuge eine andere.
@ -52,3 +58,68 @@ Sprach-Umsteiger."
Heise: https://www.heise.de/developer/artikel/Go-in-Freiburg-3700556.html
Wer auf der Suche nach einer modernen Sprache ist, die sich kompilieren und statisch linken lässt, die mit einer einfachen Syntax sowie einer automatischen Speicherverwaltung aufwartet und sich gut für nebenläufige und asynchrone Programmierung eignet, landet nahezu automatisch bei Go. Go ist für viele das C des 21. Jahrhunderts. Es ist mächtig, flexibel, kennt Pointer und arbeitet systemnah, ist aber vor allem syntaktisch deutlich weiterentwickelt als C. Außerdem sind viele interessante Konzepte aus der objektorientierten Programmierung eingeflossen, so kennt Go beispielsweise Interfaces – allerdings auf eine andere Art als die üblichen OOP-Sprachen.
---
Ist Golang das neue Java?
Sebastian Mancke 2 Tagen online Kommentare
Golang ist neu, hip und erfrischend. Es versprüht Charme, ohne selbst schön sein zu müssen und hat dadurch einen ganz besonderen Reiz. Hat Go damit das Zeug dazu, sich ähnlich stark zu etablieren wie es Java über die letzten 20 Jahre geschafft hat?
https://entwickler.de/online/development/golang-das-neue-java-579800853.html
RawStrings ´´ kennt Java nicht
https://de.wikipedia.org/wiki/Ken_Thompson
Kenneth „Ken“ Lane Thompson (* 4. Februar 1943 in New Orleans,
Louisiana, USA) ist ein US-amerikanischer Informatiker, der unter
anderem maßgeblich an der Entwicklung des Unix-Betriebssystems beteiligt
war. Er erhielt für seine Arbeiten zahlreiche Ehrungen und
Auszeichnungen, darunter den Turing Award.
https://de.wikipedia.org/wiki/Rob_Pike
Robert C. Pike (* 1956) ist ein kanadischer[1] Softwareentwickler und
Buchautor. Er ist bekannt für seine Tätigkeit bei Bell Labs. Dort war er
Mitglied des Unix-Teams und war maßgeblich an der Entwicklung der
Betriebssysteme Plan 9 from Bell Labs und Inferno sowie an der
Programmiersprache Limbo beteiligt.
https://plus.google.com/+RobertGriesemer
https://www.computerhope.com/people/robert_griesemer.htm
Previously worked on code generation for Google's V8 JavaScript engine
and Chubby.
Worked on the Sawzall language, the Java HotSpot virtual machine, and
the Strongtalk system.
https://insights.stackoverflow.com/survey/2016
http://pypl.github.io/PYPL.html
https://www.tiobe.com/tiobe-index/
TIOBE Index for May 2017
May Headline: the pack is closing in on Java and C
Java and C are in a heavy downward trend since the beginning of 2016.
Both languages have lost more than 6% if compared to last year. So which
programming languages are taking advantage of this drop? Well, actually
all the other languages. Since software is adopted by more and more
domains nowadays, C (low level software development) and Java (high
level software development) apparently don't suffice any more.
---
https://www.heise.de/developer/meldung/Googles-Programmiersprache-Go-Abschied-von-C-Ueberbleibseln-2786328.html
Googles Programmiersprache Go: Abschied von C-Überbleibseln
20.08.2015
Seit Release 1.5

85
go2lgl_l09/go2lgl_l09.go

@ -14,8 +14,10 @@ import (
"sync"
"time"
"Präsentation3hGolang4LGLRef35/go2lgl_l09/gui"
"Präsentation3hGolang4LGLRef35/go2lgl_l09/myGui"
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/gui"
"github.com/therecipe/qt/widgets"
)
@ -38,41 +40,77 @@ func main() {
//Eröffne eine neue Applikation (als eine Sammlung von Widgets)
widgets.NewQApplication(len(os.Args), os.Args)
var c_widget = widgets.NewQWidget(nil, 0)
var ui_widget = gui.LeseUIFile(c_widget)
var ui_textBrowser = gui.ErzeugeLayout(c_widget, ui_widget, &töpfchenAlle, c)
var ui_widget = myGui.LeseUIFile(c_widget)
var ui_textBrowser, ui_lcdNummer, ui_progressBar, ui_graphicsView = myGui.ErzeugeLayout(c_widget, ui_widget, &töpfchenAlle, c) // Beispiel für Parameterrückgabe als Tupel
var c_scene = widgets.NewQGraphicsScene(nil)
ui_textBrowser.ConnectAppend(func(s string) {
ui_textBrowser.Append(s)
})
/*
ti := time.Now()
ticker := time.NewTicker(1 * time.Second)
go func() {
for _ = range ticker.C {
ui_textBrowser.Append(strconv.Itoa(int(time.Since(ti).Seconds())))
}
}()*/
ui_lcdNummer.ConnectDisplay2(func(i int) {
ui_lcdNummer.Display2(i)
})
ui_progressBar.ConnectSetValue(func(i int) {
ui_progressBar.SetValue(i)
})
ui_graphicsView.ConnectPaintEvent(func(e *gui.QPaintEvent) {
//ui_graphicsView.DrawBackground(gui.QPainter.SetBrush(gui.NewQBrush()), rect)
})
ui_graphicsView.ConnectResizeEvent(func(e *gui.QResizeEvent) {
ui_graphicsView.FitInView(c_scene.ItemsBoundingRect(), core.Qt__KeepAspectRatio)
})
//pinsel := ui_graphicsView.ForegroundBrush()
// paintengine := ui_graphicsView.PaintEngine()
dx, dy := 16, 32
img := gui.NewQImage3(dx, dy, gui.QImage__Format_ARGB32)
for i := 0; i < dx; i++ {
for j := 0; j < dy; j++ {
img.SetPixelColor2(i, j, gui.NewQColor3(j*8, i*2, i*2, 255))
}
}
img = img.Scaled2(dx*2, dy, core.Qt__IgnoreAspectRatio, core.Qt__FastTransformation)
Item := widgets.NewQGraphicsPixmapItem2(gui.NewQPixmap().FromImage(img, 0), nil)
c_scene.AddItem(Item)
ui_graphicsView.SetScene(c_scene)
// ui_graphicsView.Show()
//item := ui_graphicsView.
wgcli.Add(1)
go func(t *[]int, ch chan bool) {
defer wgcli.Done()
for true {
/* Bringt nichts, weil auf <-ch == true gewartet werden müßte:
time.Sleep(time.Second * 1)
if <-ch == true {
return
} else {
}*/
/*stattdessen:*/
sum := func(mySlice *[]int) int { // Zuweisung anonymer Funktion
var amount int
for _, v := range *mySlice {
amount += v
}
return amount
}
for i := 0; true; i = sum(t) {
select {
case <-ch: // oder <-ch == true
case <-ch:
ui_textBrowser.Append(fmt.Sprint("\u2690", *t))
ui_lcdNummer.Display2(int(anzahlKugeln))
ui_progressBar.SetValue(100)
return
default:
//guichannel <- *t
ui_textBrowser.Append(fmt.Sprint("\u231B ", *t, runtime.NumGoroutine()))
ui_lcdNummer.Display2(i)
ui_progressBar.SetValue(int(math.Floor((float64(i) / float64(anzahlKugeln) * 100) + .5)))
time.Sleep(time.Second * 1)
}
}
@ -97,7 +135,6 @@ func main() {
wgcli.Wait()
close(c)
fmt.Println("\u2690", töpfchenAlle)
timestamp[1] = time.Now().UnixNano()
fmt.Printf("\nProzess ist fertig und hat %v Sekunden gedauert!\n\n", (float64(timestamp[1]-timestamp[0]) * math.Pow(10, -9)))

45
go2lgl_l09/myGui/myGui.go

@ -0,0 +1,45 @@
package myGui
import (
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/uitools"
"github.com/therecipe/qt/widgets"
)
func ErzeugeLayout(widget *widgets.QWidget, formWidget *widgets.QWidget, t *[]int, ch chan bool) (*widgets.QTextBrowser, *widgets.QLCDNumber, *widgets.QProgressBar, *widgets.QGraphicsView) { //Beispiel für Rückgabeparameter als Tupel
/*
var (
ui_textinputEingabefeld = widgets.NewQTextEditFromPointer(widget.FindChild("textinputEingabefeld", core.Qt__FindChildrenRecursively).Pointer())
ui_buttonAusloeser = widgets.NewQPushButtonFromPointer(widget.FindChild("buttonAusloeser", core.Qt__FindChildrenRecursively).Pointer())
)
ui_buttonAusloeser.ConnectClicked(func(checked bool) {
widgets.QMessageBox_Information(nil, "Titel des Infofensters", ui_textinputEingabefeld.ToPlainText(), widgets.QMessageBox__Ok, widgets.QMessageBox__Ok)
})
*/
var (
ui_textBrowser = widgets.NewQTextBrowserFromPointer(widget.FindChild("textAusgabefeld", core.Qt__FindChildrenRecursively).Pointer())
ui_lcdNummer = widgets.NewQLCDNumberFromPointer(widget.FindChild("lcdNumber", core.Qt__FindChildrenRecursively).Pointer())
ui_progressBar = widgets.NewQProgressBarFromPointer(widget.FindChild("progressBar", core.Qt__FindChildrenRecursively).Pointer())
ui_graphicsView = widgets.NewQGraphicsViewFromPointer(widget.FindChild("graphicsView", core.Qt__FindChildrenRecursively).Pointer())
)
var layout = widgets.NewQVBoxLayout()
widget.SetLayout(layout)
layout.AddWidget(formWidget, 0, 0)
widget.SetWindowTitle("go LGL")
widget.ShowMaximized()
return ui_textBrowser, ui_lcdNummer, ui_progressBar, ui_graphicsView
}
func LeseUIFile(widget *widgets.QWidget) *widgets.QWidget {
var loader = uitools.NewQUiLoader(nil)
var file = core.NewQFile2("./myGui/qml/formular.ui")
file.Open(core.QIODevice__ReadOnly)
var formWidget *widgets.QWidget = loader.Load(file, widget)
file.Close()
return formWidget
}

91
go2lgl_l09/myGui/qml/formular.ui

@ -0,0 +1,91 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>meinFormular</class>
<widget class="QWidget" name="meinFormular">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1024</width>
<height>768</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">Titel des Hauptfensters</string>
</property>
<layout class="QGridLayout">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>9</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>9</number>
</property>
<property name="spacing">
<number>6</number>
</property>
<item row="0" column="4">
<widget class="QTextBrowser" name="textAusgabefeld"/>
</item>
<item row="0" column="3">
<widget class="QGraphicsView" name="graphicsView">
<property name="autoFillBackground">
<bool>true</bool>
</property>
<property name="backgroundBrush">
<brush brushstyle="NoBrush">
<color alpha="255">
<red>253</red>
<green>255</green>
<blue>185</blue>
</color>
</brush>
</property>
<property name="foregroundBrush">
<brush brushstyle="NoBrush">
<color alpha="255">
<red>204</red>
<green>0</green>
<blue>0</blue>
</color>
</brush>
</property>
<property name="interactive">
<bool>true</bool>
</property>
<property name="sceneRect">
<rectf>
<x>0.000000000000000</x>
<y>0.000000000000000</y>
<width>0.000000000000000</width>
<height>0.000000000000000</height>
</rectf>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QProgressBar" name="progressBar">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="value">
<number>24</number>
</property>
</widget>
</item>
<item row="1" column="4">
<widget class="QLCDNumber" name="lcdNumber"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

47
go2lgl_l10/go2lgl_l10.go

@ -0,0 +1,47 @@
/*
Landesamt für Geoinformation und Landentwicklung, Referat 35
Einführung in die Sprache Go, 25.7.2017
Lektion 10: Ganz einfacher Webserver
*/
package main
import (
"fmt"
"net/http"
)
func handler00(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Guckuck %s!", r.URL.Path[1:])
fmt.Println(r.URL)
}
func handler01(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, `<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>Testseite 01</title>
</head>
<body>Du befindest Dich auf Seite `+"%s!"+`</body>
</html>`, r.URL.Path[1:])
}
func handler02(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, `<?xml version='1.0' encoding='iso-8859-1'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
<head>
<meta charset="UTF-8"/>
<title>Testseite 01</title>
</head>
<body><b>Du</b> befindest Dich jetzt auf <i>Seite `+"%s!"+`</i></body>
</html>`, r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", handler00)
http.HandleFunc("/aa", handler01)
http.HandleFunc("/bb", handler02)
http.ListenAndServe(":8080", nil)
}

78
go2lgl_l11/go2lgl_l11.go

@ -0,0 +1,78 @@
/*
Landesamt für Geoinformation und Landentwicklung, Referat 35
Einführung in die Sprache Go, 25.7.2017
Lektion 11: Ein simpler Listener
*/
package main
import (
"bytes"
"fmt"
"io"
"log"
"net"
"strconv"
"strings"
)
const (
constNET_PROTOCOL = "tcp"
constNET_PORT = 1234
)
type dasOhr struct {
dasGehörte *string
}
func (f dasOhr) Write(b []byte) (int, error) {
//fmt.Println(*f.dasGehörte, string(b))
*f.dasGehörte = string(b)
return len(strings.TrimSpace(string(b))), nil
}
func Concatstring(args ...string) string {
var buffer bytes.Buffer
for _, v := range args {
buffer.WriteString(v)
}
return buffer.String()
}
type Concatablestring string
func (f *Concatablestring) Join(args ...string) string {
var buffer bytes.Buffer
buffer.WriteString(string(*f))
for _, v := range args {
buffer.WriteString(v)
}
return buffer.String()
}
func main() {
bb := dasOhr{new(string)}
//gsocks := Concatstring(":", strconv.Itoa(constNET_PORT)) // Lausche an TCP port 1234
var javaLoversLikeObjekts Concatablestring = ":"
gsocks := javaLoversLikeObjekts.Join(strconv.Itoa(constNET_PORT))
l, err := net.Listen(constNET_PROTOCOL, gsocks)
if err != nil {
log.Fatal(err)
}
defer l.Close()
for {
// Warte auf eine Connection
conn, err := l.Accept()
if err != nil {
log.Fatal(err)
}
//io.CopyBuffer(tt, conn, make([]byte, 18))
io.Copy(bb, conn)
fmt.Print("Televisor meldet: ", *bb.dasGehörte)
fmt.Printf("Dieses Gedankenverbrechen wurde präsentiert von %v\n", conn.RemoteAddr())
conn.Close()
}
}
Loading…
Cancel
Save