Tech C**P
15 subscribers
161 photos
9 videos
59 files
304 links
مدرس و برنامه نویس پایتون و لینوکس @alirezastack
Download Telegram
environments in Golang:

To set a key/value pair, use os.Setenv. To get a value for a key, use os.Getenv. This will return an empty string if the key isn’t present in the environment.

Use os.Environ to list all key/value pairs in the environment. This returns a slice of strings in the form KEY=value. You can strings.Split them to get the key and value. Here we print all the keys:

package main

import (
"os"
"strings"
"fmt"
)

func main() {
os.Setenv("FOO", "1")
fmt.Println("FOO:", os.Getenv("FOO"))
fmt.Println("BAR:", os.Getenv("BAR"))

fmt.Println()
for _, e := range os.Environ() {
pair := strings.Split(e, "=")
fmt.Println(pair[0])
}
}


#golang #go #env #environment #environment_variables #range #setenv #getenv #environ
If you want to implement "Python Capitalize" method in Go:

strings.Title(strings.ToLower("MYNAME")) // output: Myname


There is another method called ToTitle which is used for one character long (but to letters):

str := "dz"
fmt.Println(strings.ToTitle(str)) // output: Dz


#python #golang #go #ToLower #Title #strings #capitalize #ToTitle
drop by drop and your bucket gets filled up


یکی از اساتید جمله بالارو مطرح کرده بودند که به نظر من میتونه زندگی بعضی هارو متحول کنه! موضوع بحث اینه که شما قطره قطره به یادگیری خودتان اضافه کنید و در این امر ممارست به خرج بدید و برنامه ریزی مدون داشته باشید. شک نکنید، شک نکنید که به مقصود خودتان خواهید رسید. اگر بخواهیم در کانتکست برنامه نویسی صحبت کنیم یک زبان جدید را در نظر بگیرید که قرار است فرابگیرید. چطور میتوانید یک زبان جدید را مثل زبانی که الان به آن مسلط هستید یاد بگیرید؟ آیا باید زندگی را تعطیل کنید و مسئله جدید را یاد بگیرید؟ نه اصلا اینگونه نیست، تنها کافیست بصورت قطره چکانی هر روز به آن مبحث بپردازید. فقط کافیست هر روز نهال نو پا را آب دهید و به آن برسید این درخت قرار نیست یک روزه تنومند شود و یکروزه میوه دهد تنها برنامه ریزی، تمرین و ممارست شما را به سر منزل مقصود خواهد رساند. تنها کافیست روزی یک ساعت برای آن وقت بگذارید و آخر سال ببینید به کجا رسیده اید. drop by drop!

#motivation #motivational_speaking #life_changing
Have a great weekend guys ✌️🍺

Happy coding :)
Slices are far more efficient than Arrays in Go. Assigning one array to another copies all the elements while in Slice it refers to the underlying Array.

There are major differences between the ways arrays work in Go and C. In Go,

- Arrays are values. Assigning one array to another copies all the elements.
- In particular, if you pass an array to a function, it will receive a copy of the array, not a pointer to it.
- The size of an array is part of its type. The types [10]int and [20]int are distinct.

*NOTE:* The value property can be useful but also expensive; if you want C-like behavior and efficiency, you can pass a pointer to the array.

Read more about arrays and slices here:

- https://golang.org/doc/effective_go.html#arrays

#go #arrays #slices
A very great article about Go styling and how to code readble, maintainable code in Go (it can be used in other languages too):

- https://dave.cheney.net/practical-go/presentations/qcon-china.html#_always_document_public_symbols

#golang #go #maintainable #readble_code
Let's talk a little bit about WaitGroup in sync library. First things first, the documentation is here:
- https://golang.org/pkg/sync/#WaitGroup

A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have finished.

With an example it will be crystal clear. Let's say we have a script that fetches URLs concurrently and we want to wait using WaitGroup until all the fetches are complete:

package main

import (
"sync"
)

type httpPkg struct{}

func (httpPkg) Get(url string) {}

var http httpPkg

func main() {
var wg sync.WaitGroup
var urls = []string{
"http://www.golang.org/",
"http://www.google.com/",
"http://www.somestupidname.com/",
}
for _, url := range urls {
// Increment the WaitGroup counter.
wg.Add(1)
// Launch a goroutine to fetch the URL.
go func(url string) {
// Decrement the counter when the goroutine completes.
defer wg.Done()
// Fetch the URL.
http.Get(url)
}(url)
}
// Wait for all HTTP fetches to complete.
wg.Wait()
}


First we create a WaitGroup called wg and using range loop through the URLs on each iterration we use Add to increment WaitGroup counter/queue and run an anonymous function that gets a URL. When func i
s done getting the URL, defer will be run and Done decrement the counter in WaitGroup. Finally we use Wait to actually wait for all http calls to get completed.

NOTE: anonymous function is preceded with go keyword that runs the function concurrently.

#golang #go #sync #WaitGroup #Done #Add #Wait
How to add nested documents in Marshmallow python?

books = fields.List(fields.Dict(
keys=fields.String(validate=OneOf(('title', 'author', 'publication_date'))),
values=fields.String(required=True)))


#python #data_class #marshmallow #fields #list #OneOf
Run a specific unit test in pytest:

pytest tests/test_user.py -k 'TestClassName and test_method_name'


#python #unitest #pytest
In Dockerfile`s some people in the community use `alpine base image in order to reduce docker image size. apk is its package management tool that can be used to install OS packages. So for example if
you want to install network tools (like ping) you need to install netcat-openbsd:

apk add netcat-openbsd


You can squash your image size even further by some tips. When you install a package, linux distros first download the package and put it in a cache folder. In Alpine it is located in /var/cache/apk.
To tell the OS to delete the cache after installation you can provide --no-cache option to it:

apk add --no-cache netcat-openbsd


There are some package like g++ or git that is needed on installation of some other packages. After installation those packages is useless and just increase image size. You can remove those packages b
y using --virtual command:

apk add --no-cache --virtual .build-deps g++ \
&& # do you stuff here \
&& apk del .build-deps


Great job guys! You have reduced your alpine docker images so much :)

#docker #linux #alpine #apk #virtual #no_cache #apk_del #apk_add
In marshmallow you can have a schema field which can be filled with a method output. Let's see with an example:

class AuthorSchema(Schema):
id = fields.Int(dump_only=True)
first = fields.Str()
last = fields.Str()
formatted_name = fields.Method("format_name", dump_only=True)

def format_name(self, author):
return "{}, {}".format(author.last, author.first)


As you see formatted_name field is filled by a method called format_name. Examples are endless, you can calculate average score based on the given scores for instance.

#python #marshmallow #fields #fields_method
GJSON is a Go package that provides a fast and simple way to get values from a json document. It has features such as one line retrieval, dot notation paths, iteration, and parsing json lines.

Las mere:
https://github.com/tidwall/gjson

#golang #go #gjson