Friday, September 8, 2017

Generic way to duplicate Go slices?

Generic way to duplicate Go slices?

One simple statement to make a shallow copy of a slice:

b := append([]T(nil), a...)

Note: The append to a nil slice translates into a make and copy.

Which is equivalent to:

b := make([]T, len(a))
copy(b, a)

Reference:

https://stackoverflow.com/questions/26433156/generic-way-to-duplicate-go-slices

cannot assign to struct field in map error

cannot assign to struct field in map error

data["p1"] isn't quite a regular addressable value: hashmaps can grow at runtime, and then their values get moved around in memory, and the old locations become outdated. If values in maps were treated as regular addressable values, those internals of the map implementation would get exposed.

So, instead, data["p1"] is a slightly different thing called a "map index expression" in the spec; if you search the spec for the phrase "index expression" you'll see you can do certain things with them, like read them, assign to them, and use them in increment/decrement expressions (for numeric types). But you can't do everything. They could have chosen to implement more special cases than they did, but I'm guessing they didn't just to keep things simple.

Issue code:

package main

import (
        "fmt"
)

type Person struct {
        Name string
}

func main() {
        data := map[string]Person{
                "p1": Person{},
        }

        data["p1"].Name = "Jun"

        fmt.Printf("%v\n", data)
}

Solution:

The solution is to make the map value a regular old pointer.

package main

import (
        "encoding/json"
        "fmt"
)

type Person struct {
        Name string
}

func main() {
        data := map[string]*Person{
                "p1": &Person{},
        }

        (*data["p1"]).Name = "Jun" // Or simply data["p1"].Name = "Jun"

        dataJSON, _ := json.MarshalIndent(data, "", "  ")
        fmt.Printf("%s\n", dataJSON)
}

Reference:

https://stackoverflow.com/questions/32751537/why-do-i-get-a-cannot-assign-error-when-setting-value-to-a-struct-as-a-value-i

Print line number for debugging in Go

Print line number for debugging in Go

Method 1:

// to change the flags on the default logger
log.SetFlags(log.LstdFlags | log.Lshortfile)

Method 2:

package main

import (
        "log"
        "runtime"
)

func MyFunc() {
        FancyHandleError()
}

func FancyHandleError() {
        // notice that we're using 1, so it will actually log the where
        // the error happened, 0 = this function, we don't want that.
        pc, fn, line, _ := runtime.Caller(1)
        log.Printf("[error] in %s[%s:%d]", runtime.FuncForPC(pc).Name(), fn, line)
}

func main() {
        MyFunc()
}

Method 3:

package main

import (
        //"log"
        //"runtime"
        "runtime/debug"
)

func MyFunc() {
        FancyHandleError()
}

func FancyHandleError() {
        debug.PrintStack()
}

func main() {
        MyFunc()
}

Reference:

https://golang.org/pkg/log/#pkg-constants

https://golang.org/pkg/runtime/debug/#PrintStack

http://stackoverflow.com/questions/24809287/how-do-you-get-a-golang-program-to-print-the-line-number-of-the-error-it-just-ca

Tuesday, July 25, 2017

Drupal 8 note

Drupal 8 note

Modules

Devel
https://www.drupal.org/project/devel

Examples for Developers
https://www.drupal.org/project/examples

Drush
https://www.drupal.org/project/drush

Drupal Console
https://drupalconsole.com/
===
# svn propedit svn:ignore /www/drupal8_public/sites

sites.php
*.com
*.ca
*.cn
*.local
===
# curl -sS https://getcomposer.org/installer | php
# mv composer.phar /usr/local/bin/composer

# composer self-update
# composer update
===
Install Drupal 8

# DRUPAL_VERSION=8.2.4; export DRUPAL_VERSION
# DRUPAL_MD5=288aa9978b5027e26f20df93b6295f6c; export DRUPAL_MD5
# curl -fSL "https://ftp.drupal.org/files/projects/drupal-${DRUPAL_VERSION}.tar.gz" -o drupal.tar.gz \
&& echo "${DRUPAL_MD5} *drupal.tar.gz" | md5sum -c - \
&& tar -xz --strip-components=1 -f drupal.tar.gz \
&& rm drupal.tar.gz \
&& chown -R www-data:www-data sites modules themes

# unset DRUPAL_VERSION
# unset DRUPAL_MD5
# env
===
Drush

# wget http://files.drush.org/drush.phar
# php drush.phar core-status
# chmod +x drush.phar
# mv drush.phar /usr/local/bin/drush
# chown root:wheel /usr/local/bin/drush

# drush help

# drush pm-download drupal-8 --select --destination=/www/drupal8 --drupal-project-rename=drupal8
# cd example
# mkdir modules/contrib
# mkdir modules/custom

# drush site-install minimal --account-mail=admin@example.com --account-name=admin --account-pass=admin --site-mail=admin@example.com --site-name=MySiteName --sites-subdir=mytest.local --db-url='mysql://[db_user]:[db_pass]@localhost/[db_name]'

# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local core-status
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-releases
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-projectinfo
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-info

# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-refresh
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-updatestatus
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-updatecode
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local updatedb-status
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local updatedb

# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-download devel --destination=modules/contrib
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-projectinfo devel
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-info devel
# drush --root=/www/test_dru8/example --uri=simplestore.cent-exp.local pm-enable devel

# drush --root=/www/drupal-8.0.5 --uri=simplestore.cent-exp.local cache-rebuild

# drush --root=/www/drupal-8.0.5 --uri=simplestore.cent-exp.local php-script test.php
# drush --root=/www/drupal-8.0.5 --uri=simplestore.cent-exp.local --debug --verbose php-script test.php
===
# drupal init --override
# drupal check

# drupal list
# drupal self-update

# drupal generate:module
===
Disable Drupal 8 caching during development

# cp sites/example.settings.local.php sites/simplestore.cent-exp.local/settings.local.php

Uncomment these lines:

# vim sites/simplestore.cent-exp.local/settings.php

if (file_exists(__DIR__ . '/settings.local.php')) {
include __DIR__ . '/settings.local.php';
}

Uncomment these lines in settings.local.php to Disable the render cache and Disable Dynamic Page Cache:

# vim sites/simplestore.cent-exp.local/settings.local.php

$settings['cache']['bins']['render'] = 'cache.backend.null';
$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null';

Open development.services.yml in the sites folder and add the following block (to disable twig cache):

# vim sites/development.services.yml

parameters:
twig.config:
debug : true
auto_reload: true
cache: false

Afterwards you have to rebuild the Drupal cache. Otherwise your website will encounter an unexpected error on page reload. This can be done by visiting the following URL from your Drupal 8 website:
http://yoursite/core/rebuild.php

https://www.drupal.org/node/2598914

===
Drupal Console - a CLI tool to generate boilerplate code, interact and debug Drupal 8.
https://drupalconsole.com/

Evaluate Drupal projects online
http://simplytest.me/project/examples/8.x-1.x

===
Generates a token based on $value, the user session, and the private key:
\Drupal::csrfToken()->get()
\Drupal::csrfToken()->validate()

===
1. find the proper way to deal with database query error during form_submit try .. catch (rollback)

2. db_transaction

https://api.drupal.org/api/drupal/core%21includes%21database.inc/function/db_transaction/8
http://dcycleproject.org/blog/27/dont-perform-logic-your-hookformsubmit-use-api

===
vim *.yml src/*/*.php templates/*.twig css/*.css js/*.js
===
$outArr = [];
$sql = "SELECT name FROM {variable} WHERE name LIKE :name";
$arg = [
':name' => db_like('csm_node_temp_') . '%',
];

foreach (db_query($sql, $arg) as $obj) {
$outArr[] = $obj->name;
}
===
Goodbye Drush Make, Hello Composer!
https://www.lullabot.com/articles/goodbye-drush-make-hello-composer
===
files/config_*/sync

This directory contains configuration to be imported into your Drupal site. To make this configuration active, visit admin/config/development/configuration/sync. For information about deploying configuration between servers, see https://www.drupal.org/documentation/administer/config
===
Working With Twig Templates

https://www.drupal.org/node/2186401
https://www.drupal.org/node/2354645

Sunday, July 23, 2017

Execute mongo commands through shell scripts

Method 1:

# mongo DBName --quiet --eval 'db.users.find().pretty()' | less

Method 2:

# echo -e 'use DBName\ndb.users.find().pretty()' | mongo --quiet

Monday, July 10, 2017

Build OpenJDK 8 on Ubuntu 14.04

# apt-get update \
&& apt-get install build-essential mercurial zip openjdk-7-jdk libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfreetype6-dev libasound2-dev ccache

# cd /usr/local/src \
&& hg clone http://hg.openjdk.java.net/jdk8u/jdk8u

# cd jdk8u/ \
&& bash ./get_source.sh

# bash ./configure -with-freetype-include=/usr/include/freetype2 -with-freetype-lib=/usr/lib/x86_64-linux-gnu/

# make all

# make install

Thursday, July 6, 2017

PHP http query

<?php

$header = "Content-type: application/json\r\n"
. "Content-Length: " . strlen($data) . "\r\n"
;


$context = stream_context_create([
        'http' => [
                'method'  => 'POST',
                'ignore_errors' => true,
                'header'=> $header,
                'content' => $data,
        ],
        'ssl' => [
                // set some SSL/TLS specific options
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
        ],
]);

$result = file_get_contents('http://example.com/', false, $context);