Что можно сделать в 30 строках Движения? Можно ли создать полезную, полную программу, которая демонстрирует ее функции? [закрытый]

Согласно MSDN:

http://msdn.microsoft.com/en-us/library/ms191242.aspx

, Когда любой параметры базы данных READ COMMITTED SNAPSHOT или ALLOW SNAPSHOT ISOLATION идет, логические копии (версии) сохраняются для всех модификаций данных, выполненных в базе данных. Каждый раз, когда строка изменяется определенной транзакцией, экземпляр Механизма базы данных хранит версию ранее зафиксированного изображения строки в tempdb. Каждая версия отмечена с порядковым номером транзакции транзакции, которая внесла изменение. Версии измененных строк объединяются в цепочку с помощью списка ссылок. Новейшее значение строки всегда хранится в текущей базе данных и объединяется в цепочку к имеющим версию строкам, сохраненным в tempdb.

Для коротко рабочих транзакций, версия измененной строки может кэшироваться в пуле буферов, не будучи записанным в дисковые файлы базы данных tempdb. Если потребность в имеющей версию строке будет недолгой, это будет просто отброшено от пула буферов и не может обязательно подвергнуться вводу-выводу наверху.

, кажется, существует небольшая потеря производительности для дополнительных издержек, но это может быть незначительно. Мы должны протестировать для проверки.

установка Try эта опция и УДАЛЯЮТ весь NOLOCKs из запросов кода если it’s действительно необходимый. NOLOCKs или использующий глобальные методы в обработчике контекстов базы данных для борьбы с уровнями изоляции транзакции базы данных являются Лейкопластыри к проблеме. NOLOCKS замаскирует основные проблемы с нашим слоем данных и возможно приведет к выбору ненадежных данных, где автоматический выбор / управление версиями строки обновления, кажется, решение.

ALTER Database [StackOverflow.Beta] SET READ_COMMITTED_SNAPSHOT ON

40
задан 3 revs 14 November 2009 в 19:10
поделиться

2 ответа

Это делает PNG (на стандартном выводе) циферблата, показывающего текущий время. Он едва умещается в тридцать строк, поэтому код не так чист, как должен быть.

package main
import ("image"; "image/png"; "math"; "bufio"; "os"; "time")
const clock_size = 200;
const radius = clock_size / 3;
var colour image.RGBAColor;
func circle (clock *image.RGBA) {
    for angle := float64(0); angle < 360; angle++ {
        radian_angle := math.Pi * 2 * angle / 360;
        x := radius * math.Sin (radian_angle) + clock_size/2;
        y := radius * math.Cos (radian_angle) + clock_size/2;
        clock.Set (int (x), int (y), colour);}}
func hand (clock *image.RGBA, angle float64, length float64) {
    radian_angle := math.Pi * 2 * angle;
    x_inc := math.Sin (radian_angle);
    y_inc := -math.Cos (radian_angle);
    for i := float64(0); i < length; i++ {
        x := i * x_inc + clock_size/2;
        y := i * y_inc + clock_size/2;
        clock.Set (int (x), int (y), colour);}}
func main () {
    clock := image.NewRGBA (clock_size, clock_size);
    colour.A = 255;
    circle (clock);
    time := time.LocalTime ();
    hand (clock, (float64(time.Hour) + float64(time.Minute)/60)/12, radius*0.6); // hour hand
    hand (clock, (float64(time.Minute) + float64(time.Second)/60)/60, radius*0.8); // minute hand
    out := bufio.NewWriter(os.Stdout);
    defer out.Flush();
    png.Encode(out, clock);
}

Запустить как

8.out > clock.png

Обратите внимание на все эти приведения типа float64? Я' Я НИКОГДА не видел такого строгого языка, как Go about types.


Это тот же код, исправленный в go fix (и некоторая ручная настройка), а затем автоматически отформатированный с помощью go fmt . Некоторые символы новой строки вставлены вручную.

package main

import (
    "bufio"
    "image"
    "image/color"
    "image/png"
    "math"
    "os"
    "time"
)

const clock_size = 200
const radius = clock_size / 3

var colour color.RGBA

func circle(clock *image.RGBA) {
    for angle := float64(0); angle < 360; angle++ {
        radian_angle := math.Pi * 2 * angle / 360
        x := radius*math.Sin(radian_angle) + clock_size/2
        y := radius*math.Cos(radian_angle) + clock_size/2
        clock.Set(int(x), int(y), colour)
    }
}

func hand(clock *image.RGBA, angle float64, length float64) {
    radian_angle := math.Pi * 2 * angle
    x_inc := math.Sin(radian_angle)
    y_inc := -math.Cos(radian_angle)
    for i := float64(0); i < length; i++ {
        x := i*x_inc + clock_size/2
        y := i*y_inc + clock_size/2
        clock.Set(int(x), int(y), colour)
    }
}

func main() {
    clock := image.NewRGBA(image.Rect(0, 0, clock_size, clock_size))
    colour.A = 255
    circle(clock)
    time := time.Now()
    hand(clock, (float64(time.Hour())+float64(time.Minute())/60)/12, radius*0.6)   // hour hand
    hand(clock, (float64(time.Minute())+float64(time.Second())/60)/60, radius*0.8) // minute hand
    out := bufio.NewWriter(os.Stdout)
    defer out.Flush()
    png.Encode(out, clock)
}
8
ответ дан 27 November 2019 в 01:57
поделиться

Хорошо, я начну. Вот моя первая программа Go. Это очень примитивный чат-сервер, и он умещается в 30 строк по 80 символов, если я немного его сжал; отформатирован с помощью gofmt , это 60 строк. Он прослушивает жестко запрограммированный порт (4242), в основном не обрабатывает ошибки и не обрабатывает отключение клиента, кроме прекращения попытки чтения с клиента, если он получает ошибку.

package main
import ("net";"container/vector";"bufio";"strings")
type client struct { conn net.Conn; send chan string; receive chan string }
func main() {
    if listener, err := net.Listen("tcp", "0.0.0.0:4242"); err == nil {
        master := make(chan string, 100);
        clients := vector.New(0);
        go runServer(master, clients);
        for {
            if conn, err := listener.Accept(); err == nil {
                c := client{ conn, master, make(chan string, 100) };
                clients.Push(c);
                go runClient(c);
            } else { break } } } }
func runServer(master chan string, clients *vector.Vector) {
    for { 
        message := <-master;
        clients.Do(func (c interface{}) { c.(client).receive <- message }); } }
func runClient(c client) {
    input := make(chan string, 10);
    go readLines(c, input);
    for {
        select {
        case inMessage := <-input: c.send <- inMessage;
        case outMessage := <-c.receive: c.conn.Write(strings.Bytes(outMessage));
        } } }
func readLines(c client, input chan string) {
    reader := bufio.NewReader(c.conn);
    for { if line, err := reader.ReadString('\n'); err == nil 
            { input <- line; } else { break } } }

Сборка и запуск с:

$ 6g server.go
$ 6l -o server server.6
$ ./server

А затем в нескольких других терминалах подключитесь к

$ nc localhost 4242 
4
ответ дан 27 November 2019 в 01:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: