NET-100-64-0-0-1

Did you find your WAN IPv4 address in the range 100.64.0.1 to 100.127.255.254? Then most likely your Internet Service Provider (ISP) is utilizing shared address space. Most likely that address would be behind Carrier-Grade NAT (CGN). See more RFC 6598.

Posted in Blogroll, workday | Tagged , | Leave a comment

Go webserver on Apache

Go language allows create very easily webserver. Let’s consider a full working example of a simple web server at https://golang.org/doc/articles/wiki/ implemented in the file web8080.go:

package main

import (
    "fmt"
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

Code above could be one of the several web application implemented in go language. Each application should use different port, if running on the same server. Each port could be redirected to different virtual host implemented on Apache2 webserver. For example on Ubuntu 20.04 LTS we should add apache module:
a2enmod proxy proxy_http
Create virtual host configuration file /etc/apache2/sites-available/example.com.conf

<VirtualHost *:80>
        ServerName example.com
        ProxyPass / http://127.0.0.1:8080/
        ProxyPassReverse / http://127.0.0.1:8080/

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Run command
a2ensite example.com.conf
so in the directory /etc/apache2/sites-enabled will be created symbolic link in similar way like by commands cd /etc/apache2/sites-enabled; ln -s ../sites-available/example.com.conf .
Then reload apache server
systemctl reload apache
and you should be able browse example.com and continue in development!

Posted in golang, workday | Tagged , , | Leave a comment

Weather: Daily Loop

Cooperative Institute for Research in the Atmosphere (CIRA) has a great page named Daily Loop. One can look to the weather almost in the real time.
We can be fascinated by view of the California wild fires:

2020-09-09 – Large fires burn along U.S. West Coast – GOES-17 GeoColor + Fire Temperature


2020-09-11 – Large swirl of smoke sits over Pacific – GOES-17 GeoColor

Although Winter weather in Minnesota is interesting as well:

2020-01-17 – Watch for blowing snow in southern Minnesota and northern Iowa – GOES-16 Natural Color (Day Land Cloud RGB)

2020-09-25 Evening situation partly cloudy, 2 hours loop from 6:40 PM CDT to 8:40 PM

Posted in workday | Leave a comment

Brief go lang programs

Here is list of brief go lang programs

Posted in golang, workday | Leave a comment

Google Cloud Next

Google Cloud Next conference is for year 2020 online, see https://cloud.withgoogle.com/next/sf/onair#infrastructure

Here is a play list of the presentations in the last few years:
2019
2018
2017

Posted in Blogroll, workday | Tagged | Leave a comment

REGEX at awk file

More complex awk text processing is better to put in the file. And there can be regex filter as well. Below is a simple example utilizing awk code in the file xml-info.awk, which prints information only for XML files.

$ ls -l
total 24
-rw-r--r-- 1 User User 9223 Jul 26 11:06 alpha.html
-rw-r--r-- 1 User User 6173 Jul 29 10:03 alpha.xml
-rw-r--r-- 1 User User 3227 Jul 29 10:43 beta.xml
xml-info.awk:
BEGIN { print "Hello at BEGIN"}
/\.xml$/{
 printf("filename: %s, size: %s\n", $9, $5);
}
END { print "Hello at END"}
$ ls -l | awk -f ../bin/xml-info.awk
Hello at BEGIN
filename: alpha.xml, size: 6173
filename: beta.xml, size: 3227
Hello at END
Posted in Blogroll, workday | Leave a comment

ssh password-less

Here are steps, how to do it in Linux type environment on LOCAL host:

  1. USER_REMOTE=username@remote-host
  2. ssh-keygen -t rsa #no password
  3. ssh $USER_REMOTE mkdir -p .ssh
  4. cat .ssh/id_rsa.pub | ssh $USER_REMOTE ‘cat >> .ssh/authorized_keys’
  5. ssh $USER_REMOTE ‘chmod 700 .ssh; chmod 640 .ssh/authorized_keys’
  6. ssh $USER_REMOTE

Step 2 is necessary only if you don’t have id_rsa.pub file yet
Steps 3,4,5 need remote password
Steps 3 and 5 are not necessary, if the file .ssh/authorized_keys with appropriate access rights is already on remote host
Step 4 actually transfers the public key
Step 6 does not need password, you are there already, congratulations!

Posted in workday | Leave a comment

Hello Website on GKE Cluster

Let’s explore, how deploy web application “Hello Website” written in go language at Google Kubernetes Engine Cluster.

Source code for “Hello Website” in the file helloweb.go

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello website! You've requested: %s\n", r.URL.Path)
    })

    http.ListenAndServe(":80", nil)
}

Source code for dockerfile

# image environment definition
# 
FROM golang:1.14

WORKDIR /go/src/app
#copy current dir on local host to current dir on image, in this case workdir
COPY . .

#get all packages in current dir (.) and all subdirs (...), just download (-d)
RUN go get -d -v ./...
RUN go install -v ./...

CMD ["app"]

Steps:

  1. At https://console.cloud.google.com/apis/library search for Kubernetes (k8s) and then enable k8s Engine API
  2. Create Docker image
    At authenticated terminal or cloud shell go to the directory with helloweb source files and do:
    docker build -t helloweb-container-image .
    docker images
    gcloud auth configure-docker
    docker tag helloweb-container-image gcr.io/<MY_PROJECT_ID>/helloweb-container-image:v1
    docker push gcr.io/<MY_PROJECT_ID>/helloweb-container-image:v1
    gcloud container images list
    gcloud container images list –repository=gcr.io/<MY_PROJECT_ID>
  3. Create Kubernetes Engine cluster:
    gcloud config set compute/zone us-central1-a
    gcloud container clusters create helloweb-cluster1 –num-nodes=4
    gcloud container clusters get-credentials helloweb-cluster1
    kubectl create deployment hello-website –image=gcr.io/<MY_PROJECT_ID>/helloweb-container-image:v1
  4. Expose deployed workload
    kubectl expose deployment hello-website –type=LoadBalancer –name=hello-website-service –port=80 –target-port=80
    kubectl get services
  5. With your web browser, go to the EXTERNAL-IP to see Hello Website!

							
Posted in golang, workday | Tagged | Leave a comment

GCP notes

Setup

  1. Creating an account
  2. Creating a new project
    No org, org(G Suite, Cloud Identity)
    Project-id is unique
  3. Deleting project
    Project settings: Shutdown
    IAM & Admin / Manage resources: Delete
  4. Creating users
    IAM: Add user@companyGSuite_gserviceaccount_googlegroups_gmail.com
    IAM: Add user@nonGoogle_AD_LDAP / Google Cloud Directory Sync
  5. Assigning roles
    Primitive(Owner,Editor,Viewer)
    Predefined (~500 roles)
    Custom
  6. Enabling APIs
    API & Services: … Enable Try This API
  7. Cloud Shell
    GCloud: Google Cloud SDK installed
  8. Operations
    Monitoring(Metrics, Alerting, Uptime…), Debugger, Logging, Profiler, Trace,…

Billing

  1. Billing accounts – cloud (needed Payments profile – google)
  2. Budget

Storage

Structured data:
+ For analytics
++ Low latency: Cloud BigTable
++ No: BigQuery
+ Not for analytics:
++ Relational data:
+++ Horizontal scaling: Cloud Spanner
+++ No: Cloud SQL
++ Not relational:
+++ Mobile SDK: Firebase
+++ No: Datastore
Not structured data:
+ Mobile SDK: Firebase
+ No: Cloud Storage (class: Standard, Nearline<M, Coldline<Q, Archive<Y)

Posted in Blogroll, workday | Leave a comment

Rotating prompt color

If one has more that one terminal window opened, it’s sometimes hard to tell what is where. Here is example of the file ~/.bash_profile, which is always executed, if new terminal window is opened. Numeric value of the previous prompt is saved in the file ps1-color.num. Script also defines environment variable _TERM_START with value set to the start time and it can be helpfull to identify terminal window as well.

#date command is in back-ticks
export _TERM_START=date +"%a_%Y-%m-%d_%H:%M:%S"
export PS1COLOR=34

input=”/home/joedoe/.bash_sessions/ps1_color.num”
IFS= read -r PS1COLOR < “$input”
PS1COLOR=$(expr ${PS1COLOR} + 1)
if (( $PS1COLOR > 37 ))
then
PS1COLOR=30
fi

echo ${PS1COLOR} > $input
export PS1=”\[033[1;${PS1COLOR}m\]\h \W \$ \[\033[0;30m\]”

Posted in workday | Leave a comment