zaquestion: add program to learn contribution process

Change-Id: If0988b2cd42c3f34de671a645207fca633fc4162
Reviewed-on: https://go-review.googlesource.com/132300
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/zaquestion/main.go b/zaquestion/main.go
new file mode 100644
index 0000000..f9e3243
--- /dev/null
+++ b/zaquestion/main.go
@@ -0,0 +1,18 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+	"os"
+
+	"github.com/adamryman/gophersay/gopher"
+)
+
+func main() {
+	fmt.Println("Learning to contribute to your favorite language at Gophercon 2018 is rad!")
+	fmt.Printf("Heres a proverb:\n\n")
+	gopher.Proverb(os.Stdout)
+}
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md b/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md
new file mode 100644
index 0000000..68a49da
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/LICENSE.md
@@ -0,0 +1,24 @@
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go b/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go
new file mode 100644
index 0000000..8bd32d1
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopher/say.go
@@ -0,0 +1,58 @@
+package gopher
+
+import (
+	"fmt"
+	"io"
+	"log"
+	"math/rand"
+	"time"
+
+	"github.com/adamryman/gophersay/gopherart"
+)
+
+var (
+	sayings   []string
+	gopherArt string
+)
+
+func init() {
+	// Load in gopher ascii art from go-bindata
+	gopherArtBytes, err := gopherart.Asset("gopherart/gopher.ascii")
+	if err != nil {
+		log.Fatal(err)
+	}
+	gopherArt = string(gopherArtBytes)
+	sayings = []string{
+		"Don't communicate by sharing memory, share memory by communicating.", "Concurrency is not parallelism.",
+		"Channels orchestrate; mutexes serialize.",
+		"The bigger the interface, the weaker the abstraction.",
+		"Make the zero value useful.",
+		"interface{} says nothing.",
+		"Gofmt's style is no one's favorite, yet gofmt is everyone's favorite.",
+		"A little copying is better than a little dependency.",
+		"Syscall must always be guarded with build tags.",
+		"Cgo must always be guarded with build tags.",
+		"Cgo is not Go.",
+		"With the unsafe package there are no guarantees.",
+		"Clear is better than clever.",
+		"Reflection is never clear.",
+		"Errors are values.",
+		"Don't just check errors, handle them gracefully.",
+		"Design the architecture, name the components, document the details.",
+		"Documentation is for users.",
+		"Don't panic.",
+	}
+}
+
+func Proverb(w io.Writer) {
+	rand.Seed(time.Now().UnixNano())
+	saying := sayings[rand.Intn(len(sayings))]
+	Say(w, saying)
+}
+
+func Say(w io.Writer, saying string) {
+	fmt.Fprintf(w, " ------------------------\n%s\n%s",
+		saying,
+		gopherArt,
+	)
+}
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii
new file mode 100644
index 0000000..afc915a
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopher.ascii
@@ -0,0 +1,15 @@
+ ------------------------
+   \
+    \
+     \   ,_---~~~~~----._         
+  _,,_,*^____      _____``*g*\"*, 
+ / __/ /'     ^.  /      \ ^@q   f 
+[  @f | @))    |  | @))   l  0 _/  
+ \`/   \~____ / __ \_____/    \   
+  |           _l__l_           I   
+  }          [______]           I  
+  ]            | | |            |  
+  ]             ~ ~             |  
+  |                            |   
+   |                           |   
+
diff --git a/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go
new file mode 100644
index 0000000..8f2bffa
--- /dev/null
+++ b/zaquestion/vendor/github.com/adamryman/gophersay/gopherart/gopherart.go
@@ -0,0 +1,237 @@
+// Code generated by go-bindata.
+// sources:
+// gopherart/gopher.ascii
+// DO NOT EDIT!
+
+package gopherart
+
+import (
+	"bytes"
+	"compress/gzip"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+)
+
+func bindataRead(data []byte, name string) ([]byte, error) {
+	gz, err := gzip.NewReader(bytes.NewBuffer(data))
+	if err != nil {
+		return nil, fmt.Errorf("Read %q: %v", name, err)
+	}
+
+	var buf bytes.Buffer
+	_, err = io.Copy(&buf, gz)
+	clErr := gz.Close()
+
+	if err != nil {
+		return nil, fmt.Errorf("Read %q: %v", name, err)
+	}
+	if clErr != nil {
+		return nil, err
+	}
+
+	return buf.Bytes(), nil
+}
+
+type asset struct {
+	bytes []byte
+	info  os.FileInfo
+}
+
+type bindataFileInfo struct {
+	name    string
+	size    int64
+	mode    os.FileMode
+	modTime time.Time
+}
+
+func (fi bindataFileInfo) Name() string {
+	return fi.name
+}
+func (fi bindataFileInfo) Size() int64 {
+	return fi.size
+}
+func (fi bindataFileInfo) Mode() os.FileMode {
+	return fi.mode
+}
+func (fi bindataFileInfo) ModTime() time.Time {
+	return fi.modTime
+}
+func (fi bindataFileInfo) IsDir() bool {
+	return false
+}
+func (fi bindataFileInfo) Sys() interface{} {
+	return nil
+}
+
+var _gopherartGopherAscii = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x8e\x3d\x16\x82\x30\x10\x84\xfb\x9c\x62\x9e\x8d\x8f\xbc\x48\x3c\x02\xad\x67\x20\xb2\x54\xd8\xd0\xd8\x47\xce\xee\xec\xf2\x23\xc1\xa7\x03\x84\x64\xf6\xdb\xc9\xe2\xf2\x43\x0e\x40\xd2\x65\x59\x91\xf8\x05\x61\x65\x52\x29\x52\x0b\x56\x11\x91\x10\x24\xf8\x4e\xa8\xd9\xd3\x9d\xf4\xbd\x7f\xf8\x74\xf2\x81\x48\xa4\x15\x11\xcf\x56\xed\x6a\xd0\x58\x92\xbb\xe6\xc9\xff\x00\xd7\x02\xcd\x80\x8c\xa6\xaa\xb4\x92\xb1\xed\x47\xe0\x0a\xb6\x33\x27\xf5\xda\x98\x26\xbb\x4a\x43\x91\xec\xae\xb8\x8e\xe9\xac\x73\x93\x8c\xc2\x77\x67\xdc\x66\xe6\xf5\x71\x5a\x0b\x90\x7b\x09\x91\xd9\x3b\x0c\xcd\x45\xb0\x1e\x8e\x0c\x26\x3e\xdf\x4c\xd1\x76\x54\x9e\xe7\xf9\x0b\x19\xe3\xde\x01\x00\x00\xff\xff\xe9\x5c\x37\x0d\xaf\x01\x00\x00")
+
+func gopherartGopherAsciiBytes() ([]byte, error) {
+	return bindataRead(
+		_gopherartGopherAscii,
+		"gopherart/gopher.ascii",
+	)
+}
+
+func gopherartGopherAscii() (*asset, error) {
+	bytes, err := gopherartGopherAsciiBytes()
+	if err != nil {
+		return nil, err
+	}
+
+	info := bindataFileInfo{name: "gopherart/gopher.ascii", size: 431, mode: os.FileMode(436), modTime: time.Unix(1468565140, 0)}
+	a := &asset{bytes: bytes, info: info}
+	return a, nil
+}
+
+// Asset loads and returns the asset for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func Asset(name string) ([]byte, error) {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	if f, ok := _bindata[cannonicalName]; ok {
+		a, err := f()
+		if err != nil {
+			return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
+		}
+		return a.bytes, nil
+	}
+	return nil, fmt.Errorf("Asset %s not found", name)
+}
+
+// MustAsset is like Asset but panics when Asset would return an error.
+// It simplifies safe initialization of global variables.
+func MustAsset(name string) []byte {
+	a, err := Asset(name)
+	if err != nil {
+		panic("asset: Asset(" + name + "): " + err.Error())
+	}
+
+	return a
+}
+
+// AssetInfo loads and returns the asset info for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func AssetInfo(name string) (os.FileInfo, error) {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	if f, ok := _bindata[cannonicalName]; ok {
+		a, err := f()
+		if err != nil {
+			return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
+		}
+		return a.info, nil
+	}
+	return nil, fmt.Errorf("AssetInfo %s not found", name)
+}
+
+// AssetNames returns the names of the assets.
+func AssetNames() []string {
+	names := make([]string, 0, len(_bindata))
+	for name := range _bindata {
+		names = append(names, name)
+	}
+	return names
+}
+
+// _bindata is a table, holding each asset generator, mapped to its name.
+var _bindata = map[string]func() (*asset, error){
+	"gopherart/gopher.ascii": gopherartGopherAscii,
+}
+
+// AssetDir returns the file names below a certain
+// directory embedded in the file by go-bindata.
+// For example if you run go-bindata on data/... and data contains the
+// following hierarchy:
+//     data/
+//       foo.txt
+//       img/
+//         a.png
+//         b.png
+// then AssetDir("data") would return []string{"foo.txt", "img"}
+// AssetDir("data/img") would return []string{"a.png", "b.png"}
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error
+// AssetDir("") will return []string{"data"}.
+func AssetDir(name string) ([]string, error) {
+	node := _bintree
+	if len(name) != 0 {
+		cannonicalName := strings.Replace(name, "\\", "/", -1)
+		pathList := strings.Split(cannonicalName, "/")
+		for _, p := range pathList {
+			node = node.Children[p]
+			if node == nil {
+				return nil, fmt.Errorf("Asset %s not found", name)
+			}
+		}
+	}
+	if node.Func != nil {
+		return nil, fmt.Errorf("Asset %s not found", name)
+	}
+	rv := make([]string, 0, len(node.Children))
+	for childName := range node.Children {
+		rv = append(rv, childName)
+	}
+	return rv, nil
+}
+
+type bintree struct {
+	Func     func() (*asset, error)
+	Children map[string]*bintree
+}
+
+var _bintree = &bintree{nil, map[string]*bintree{
+	"gopherart": &bintree{nil, map[string]*bintree{
+		"gopher.ascii": &bintree{gopherartGopherAscii, map[string]*bintree{}},
+	}},
+}}
+
+// RestoreAsset restores an asset under the given directory
+func RestoreAsset(dir, name string) error {
+	data, err := Asset(name)
+	if err != nil {
+		return err
+	}
+	info, err := AssetInfo(name)
+	if err != nil {
+		return err
+	}
+	err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
+	if err != nil {
+		return err
+	}
+	err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
+	if err != nil {
+		return err
+	}
+	err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// RestoreAssets restores an asset under the given directory recursively
+func RestoreAssets(dir, name string) error {
+	children, err := AssetDir(name)
+	// File
+	if err != nil {
+		return RestoreAsset(dir, name)
+	}
+	// Dir
+	for _, child := range children {
+		err = RestoreAssets(dir, filepath.Join(name, child))
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func _filePath(dir, name string) string {
+	cannonicalName := strings.Replace(name, "\\", "/", -1)
+	return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
+}