All streams
Search
Write a publication
Pull to refresh
9
@lain8donoread⁠-⁠only

Rust Evangelist

Send message
ну или что сейчас самое модное

Говорят, что PostCSS.
На самом деле, JavaScript никогда не будет вашим узким местом в расчете на производительность.

Ага. Кроме всего кода, который вызывается из колбека window.requestAnimationFrame. Или если вам нужно читать много данных из WebSocket. С этого момента микрооптимизации ваш лучший друг. Никаких forEach. Никакого кода, который плохо переваривается оптимизатором. И обращайте внимание на то, что именно идёт в прототип, а что в сам объект. Кроме того старайтесь не использовать классы.

Ах, да. Если вы решили использовать какие либо соглашения, то запишите это на видном месте. Например в README проекта. Но при этом старайтесь не раздувать подобные документы до огромных размеров.
Полностью согласен Ротенбургом.
Я абсолютно неэтичен, полностью аморален, немного лжив и в конце концов технарь.
И не вижу в этом ничего плохого. Разумеется я использую и буду использовать блокировщики рекламы.

Кажется блокировщикам рекламы не хватает серого списка. Т.е. списка сайтов, которым разрешено показывать плашку «просим отключить блокировку рекламы», которая не будет мешать использованию сайта.
Это мой первый go код, приветствую вашу критику.

Не стоит хардкорить пути и ключи прямо в исходники. Для этого есть flag и path/filepath (не стоит обходиться обычной конкатерацией). А в bufio есть сканнер для чтения по словам/строкам/символам, хотя и не принципиально для файлов среднего размера. io/ioutil.WriteFile может возвратить ошибку (например место кончилось или ещё чего) и её стоит обработать.

Парочка усовершенствований
package main

import (
	ivona "github.com/jpadilla/ivona-go"

	"bufio"
	"flag"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path/filepath"
	"strings"
)

const format = "tts%04d.ogg" // files like 0001.ogg

var dir = flag.String("dir", ".", "like /home/vitaly/Desktop/")
var textFile = flag.String("text", "", "path to text file, like /home/vitaly/Desktop/test.txt")
var key = flag.String("key", "GDNAICTDMLSLU5426OAA", "access key for ivona api")
var secret = flag.String("secret", "2qUFTF8ZF9wqy7xoGBY+YXLEu+M2Qqalf/pSrd9m", "secret key for ivona api")

func main() {
	flag.Parse()

	conf := os.Stdin // если нет конфига, но читаем стандартный ввод
	if *textFile != "" {
		conf, err := os.Open(*textFile)
		if err != nil {
			log.Fatal(err)
		}
		defer conf.Close()
	}

	client := ivona.New(*key, *secret)
	scanner := bufio.NewScanner(conf)
	for i := 1; scanner.Scan(); i++ {
		paragraph := strings.TrimSpace(scanner.Text())
		if paragraph == "" { // пропускаем пустые строки
			continue
		}
		log.Printf("process: %v\n", paragraph)

		options := ivona.NewSpeechOptions(paragraph)
		options.Voice.Language = "ru-RU"
		options.Voice.Name = "Maxim"
		options.Voice.Gender = "Male"
		options.OutputFormat.Codec = "OGG"

		r, err := client.CreateSpeech(options)
		if err != nil {
			log.Fatal(err)
		}

		file := filepath.Join(*dir, fmt.Sprintf(format, i))
		err = ioutil.WriteFile(file, r.Audio, 0644)
		if err != nil {
			log.Fatalln("writing result file:", err)
		}
	}

	if err := scanner.Err(); err != nil {
		log.Fatalln("reading text file:", err)
	}
}


diff
4d3
< 	"fmt"
5a5,8
> 
> 	"bufio"
> 	"flag"
> 	"fmt"
7a11,12
> 	"os"
> 	"path/filepath"
10a16,22
> const format = "tts%04d.ogg" // files like 0001.ogg
> 
> var dir = flag.String("dir", ".", "like /home/vitaly/Desktop/")
> var textFile = flag.String("text", "", "path to text file, like /home/vitaly/Desktop/test.txt")
> var key = flag.String("key", "GDNAICTDMLSLU5426OAA", "access key for ivona api")
> var secret = flag.String("secret", "2qUFTF8ZF9wqy7xoGBY+YXLEu+M2Qqalf/pSrd9m", "secret key for ivona api")
> 
12,15c24,32
< 	client := ivona.New("GDNAICTDMLSLU5426OAA", "2qUFTF8ZF9wqy7xoGBY+YXLEu+M2Qqalf/pSrd9m")
< 	text, err := ioutil.ReadFile("/home/vitaly/Desktop/test.txt")
< 	if err != nil {
< 		log.Fatal(err)
---
> 	flag.Parse()
> 
> 	conf := os.Stdin // если нет конфига, но читаем стандартный ввод
> 	if *textFile != "" {
> 		conf, err := os.Open(*textFile)
> 		if err != nil {
> 			log.Fatal(err)
> 		}
> 		defer conf.Close()
18,21c35,39
< 	arrayOfParagraphs := strings.Split(string(text), "\n")
< 	i := 0
< 	for _, paragraph := range arrayOfParagraphs {
< 		if len(paragraph) < 4 { // against empty lines
---
> 	client := ivona.New(*key, *secret)
> 	scanner := bufio.NewScanner(conf)
> 	for i := 1; scanner.Scan(); i++ {
> 		paragraph := strings.TrimSpace(scanner.Text())
> 		if paragraph == "" { // пропускаем пустые строки
24c42,43
< 		log.Printf("%v\n", paragraph)
---
> 		log.Printf("process: %v\n", paragraph)
> 
29a49
> 
35,37c55,63
< 		i++
< 		file := fmt.Sprintf("/home/vitaly/Desktop/ivona/tts%04d.ogg", i) // files like 0001.ogg
< 		ioutil.WriteFile(file, r.Audio, 0644)
---
> 		file := filepath.Join(*dir, fmt.Sprintf(format, i))
> 		err = ioutil.WriteFile(file, r.Audio, 0644)
> 		if err != nil {
> 			log.Fatalln("writing result file:", err)
> 		}
> 	}
> 
> 	if err := scanner.Err(); err != nil {
> 		log.Fatalln("reading text file:", err)

А почему бы не сделать возможность комментирования безо всяких премодераций для тех, у кого уже есть полноценный аккаунт на том же Хабрахабре?
package main

import (
	"encoding/json"
	"flag"
	"net/http"
	"strconv"
)

var addr = flag.String("http", ":3000", "http service address")

type Animal struct {
	ID   int
	Name string
}

func main() {
	animals := []Animal{
		{0, "python"},
		{1, "sad panda"},
		{2, "candy bear"},
		{3, "camel"},
		{4, "cat is fine too"},
	}
	flag.Parse()
	http.HandleFunc("/list", func(w http.ResponseWriter, _ *http.Request) {
		json.NewEncoder(w).Encode(animals)
	})
	http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
		defer func() {
			if err := recover(); err != nil {
				http.Error(w, http.StatusText(http.StatusBadRequest),
					http.StatusBadRequest)
			}
		}()
		id, _ := strconv.Atoi(req.FormValue("ID"))
		switch req.Method {
		case "GET":
			json.NewEncoder(w).Encode(animals[id])
		case "POST":
			animals = append(animals, Animal{
				len(animals),
				req.FormValue("Name")})
		case "DELETE":
			animals = append(animals[:id], animals[id+1:]...)
		}
	})
	panic(http.ListenAndServe(*addr, nil))
}


А вообще различные примеры hello world для http можно посмотреть тут
Примеры бытовых будней разработчиков:
  • Фронтэнд: несколько браузеров одновременно
  • Фрондэнд с IE: ещё и виртуалка с виндой
  • Мобильная разработка: IDE плюс эмулятор
  • Мобильная разработка под IOS: всё это поверх виртуалки с хакинтошем
  • JAVA разработка: 640 гигабайт хватит всем
  • Большой игровой движок, возможно под виртуалкой

Вот сидишь и думаешь, то ли IDE запустить, то ли эмулятор, то ли браузер с документацией и котиками. И хорошо ещё если по отдельности они в память вмещаются.
Если браузер не запускать, то хватит. В крайнем случае опетативку можно сжать и получить дополнительные 4 гигабайта в замен времени ЦПУ.
Имелись ввиду go-тролли.
phaser.io же (github)

Странно, что никто не вспомнил. В качестве графической подсистемы используется PIXI, а это значит, что графика будет быстрее там, где есть WebGL. Ну и шейдеры в наличии.

Физика там на любой вкус.
UI модули отдельно, но их есть в наличии.
Поддержка Spine и DragonBones присутствует. Равно как и несколько вариантов для Tiled Map Editor.

Бонусом ко всему наличие англоязычной документации. В отличии от.
Есть биндинги к TypeScript, но написано всё на ванильном js.
Не хватает
body { overflow: hidden; }

Кстати было уже вот это.
Если для вас всё иначе — можете выразить почему именно так.

У меня есть даже маленький пример для понимания моей точки зрения. Из двух этих листингов я выберу первый:
def add(x, y):
    print "x is {0} and y is {1}".format(x, y)
    return x + y

def add(x, y):

    print "x is {0} and y is {1}".format(x, y)
    return x + y

Я вижу начало блока не в скобке, а в его «заголовке», но при этом отчётливо вижу конец блока, будто это ruby:
def sum(x, y)
    x + y
end


Открывающая скобка для меня похожа на пустую строку, которой я разделяю код по вертикали операторы, которые идут последовательно.

Как с вашим кодстайлом читается вот такой код:
var a = 5
{
    fmt.Println("a:", a)
}
Если стоит задача переспорить оппонента любой ценой, то и в этом случае вы скорее проиграете спор с сильным спорщиком. Если вы хотите по какой либо причине выиграть спор, где не подразумевается правильного ответа, то для начала надо осознать, что этого самого правильного ответа нет. Пусть это и кажется очевидным, но одно уже это знание даёт вам возможность посмотреть на вопрос со стороны. Например даёт возможность использовать в разгар спора «аргументы ниже пояса», «авторитетное мнение», «давление на жалость» и прочее вроде «а давайте тогда использовать golang — там же тоже скобочки не переносятся. Нет? Ну вот и я говорю, что в c# принято скобочки переносить на следующую строку».

То, о чём вы говорите есть причины субъективные, равно как и мои. Единственная причина выбирать субъективное решение — абсолютное большинство голосов в сторону этого решения.

Единственная абсолютно объективная причина использовать определённый способ расставления скобок — результат подброса монетки.

Попробуйте найти или написать тулзу, которая будет форматировать код по тем кодстайлам, которые нравятся именно вам.
Вообще единственная веская причина для выбора конкретного варианта отступов, положения скобочек, пробелов и прочего это кодстайл конкретного проекта.

Моё личное мнение: ориентироваться лучше не по скобочкам как таковым, а по уровню отступа. С такой точки зрения перенос скобки плох, ибо скобка воспринимается отдельным выражением. А к экономии места по вертикали можно сказать, что обычно оно и так ограничено существенно в сравнении с горизонтальным. И далеко не всегда можно перевернуть монитор.
так как urxvt криво шрифты рендерит

Попробуйте sakura.

А к NerdTree советую добавить плагин Xuyuanp/nerdtree-git-plugin.
Я рискну набрать ещё немного минусов и отвечу вам в том же приторном слащаво-пафосном тоне. Я не считаю, что прогнулся кому либо. Я просто признаю, что и правда беспомощен.

И к сведению: я считаю, что в Сами-Знаете-Какой стране поблизости младенцев никто не ел. В этом то вся и беда. Сделать из собственной страны площадку для самовыражения спец-служб из разных стран и предоставить в качестве инструментария собственный народ всем, кто только попросит, есть в некотором роде беспомощность.

Сказать о том, что будешь есть младенцев, совсем не то же самое, что есть их на самом деле с таким видом, будто это всего навсего печеньки к твоему чаю. При том, что мало кто знает, каких младенцев надо употреблять и как их правильно готовить. Любые разговоры о политике глупы до тех пор, пока ты и твой собеседник не едят младенцев.

Вы можете всерьёз есть младенцев так, будто в этом и в самом деле нет ничего особенного? Я нет.
В конце концов любое чаепитие с разговорами о политике рискуют закончится примерно вот так (NSFW)



Надеюсь, что меня правильно поймут в моей попытке быть умнее, чем я есть на самом деле.
Для тех, кто ленив, есть wikiwand. Для тех, кто чуть менее ленив, есть i2p и tor. Для тех, кому немного скучно читать очередную серию IT-версии Сами-Знаете-Какого канала от тех паникёров, что недостаточно пессимистичны, я предложу провести время за какой либо интересной книгой. Лично я читаю вот эту прямо сейчас.

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

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Registered
Activity