Monday, October 5, 2015

Postgres: Create a function to create a new logging table which inherits from another

When creating large logging tables, it better to define the structure of the logging table then create tables that inherit from that table, to put the data into. It makes look-ups on the table faster if you are searching for info in your logs relevant to data in one partitioned child table and it also makes it easier to trim the logs since you can just drop a child table of logs when the time is appropriate.

See http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html

 
 
 CREATE OR REPLACE FUNCTION app_system.create_request_log_partition(_date timestamp without time zone)  
  RETURNS void AS  
  $BODY$  
 DECLARE  
      _table text := format('request_log_%s_q%s', date_part('year', _date), date_part('quarter', _date));  
 BEGIN  
        
      EXECUTE  
            'CREATE TABLE system.'|| _table ||'() INHERITS (system.access_log);'||E'\n'  
           ||'CREATE INDEX '|| _table ||'_created_idx ON system.'|| _table ||'(created_at);'||E'\n'  
           ||'CREATE INDEX '|| _table ||'_api_request_idx ON system.'|| _table ||'(api_request);'||E'\n'  
           ||'GRANT INSERT, SELECT ON system.'|| _table ||' TO myapp;'||E'\n'  
           ;  
 END;  
 $BODY$  
 LANGUAGE plpgsql VOLATILE  
 COST 100;  
 ALTER FUNCTION app_system.create_request_log_partition(timestamp without time zone) OWNER TO postgres;  
   

Tuesday, September 8, 2015

Generating self-signed SSL cert and PEM

Sign in as root then run this

cd /etc/ssl
openssl req -x509 -new -nodes -newkey rsa:2048 -keyout haproxy.key -out haproxy.crt
cat ./haproxy.crt ./haproxy.key > ./haproxy.pem

You can  name the files whatever you want instead of using "haproxy", which I use since I like to have SSL termination in my haproxy server.

Wednesday, September 2, 2015

Injection GIT branch / tag name into config.properties file

Prerequisite: In your project you need the file src/main/resources/config.properties

Of course you can adapt to using whatever file you want.

Note that this assumes you're using a "version=" property in your config.properties file


Step 1: Add the maven plugin to run an executable

1:  #!/usr/bin/env bash  
2:    
3:  # Get the git branch / tag name  
4:    
5:  # first, see of we have branch information (this will not be available if we checked out a tag)  
6:  TAG_OR_BRANCH="$(git rev-parse --abbrev-ref HEAD | egrep -o '([0-9]{1,}\.)+[0-9]{1,}')"  
7:    
8:  if [ "$TAG_OR_BRANCH" == "" ]; then  
9:    
10:    # if we can't get branch info, then we must be in a tag, so use that  
11:    TAG_OR_BRANCH="$(git describe | egrep -o '([0-9]{1,}\.)+[0-9]{1,}+(-b[0-9]{1,})')"  
12:  fi  
13:    
14:  # Remove the version from the properties file  
15:  sed -i '/^version=/ d' src/main/resources/static/version  
16:    
17:  # Add the version to the properties file  
18:  echo "Writing version $TAG_OR_BRANCH"  
19:  echo "version=$TAG_OR_BRANCH" >> src/main/resources/static/version  

Monday, August 3, 2015

Generate Golang struct (model) from Postgres tables

A handy Postgres SQL statement to generate Golang models (structs) for you.


WITH models AS (
  WITH data AS (
    SELECT
        replace(initcap(table_name::text), '_', '') table_name,
        replace(initcap(column_name::text), '_', '') column_name,
        CASE data_type
        WHEN 'timestamp without time zone' THEN 'time.Time'
        WHEN 'timestamp with time zone' THEN 'time.Time'
        WHEN 'boolean' THEN 'bool'
        -- add your own type converters as needed or it will default to 'string'
        ELSE 'string'
        END AS type_info,
        '`json:"' || column_name ||'"`' AS annotation    
    FROM information_schema.columns
    WHERE table_schema IN ('dvs_app', 'dvs_system')
    ORDER BY table_schema, table_name, ordinal_position
  )
    SELECT table_name, STRING_AGG(E'\t' || column_name || E'\t' || type_info || E'\t' || annotation, E'\n') fields
    FROM data
    GROUP BY table_name
)
SELECT 'type ' || table_name || E' struct {\n' || fields || E'\n}' models
FROM models ORDER BY 1

Tuesday, June 30, 2015

Handy PowerShell Scripts

(because I don't want to add another GitHub repo)


Invert mouse scrolling (from http://superuser.com/questions/310681/inverting-direction-of-mouse-scroll-wheel)

Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Enum\HID\*\*\Device` Parameters FlipFlopWheel -EA 0 | ForEach-Object { Set-ItemProperty $_.PSPath FlipFlopWheel 1 }


Saturday, December 20, 2014

Anarchic Development Efforts

Nokia, once the leader in mobile technologies really messed up big. They were poised (perhaps) to be where Apple is today with the iPad and the iPhone however they had various deeply seeded problems which ultimately caused the demise of their R&D efforts. This interesting article is a great read for technology project managers. One of the most interesting things I found was the mention of "anarchic development efforts" at Nokia which was a major factor leading to ultimate project failure. By contrast the leadership culture at Apple has been very disciplined and focused under the collaborative-dictatorship of Steve Jobs. On a personal note, this is why, when I am heading up development teams, I have no time for "anarchic development efforts". Developers that don't get with the program must be let go or the entire project will be in jeopardy. I think this article highlights a sterling example of issue.

Saturday, December 6, 2014

Installing Linux 64bit driver for eToken USB

If needed install, opensc and pcsc-lite
yum install opensc pcsc-lite

Download the driver, unzip and install
wget http://download.fh-swf.de/dvz/software/eToken/Linux/Software/SafeNetAuthenticationClient_Linux_8_1.1.zip
unzip SafeNetAuthenticationClient_Linux_8_1.1.zip
cd SAC\ 8.1\ Linux/x86_64/
unzip SAC_8_1_0_4_Linux_RPM_64.zip
cd SAC_8_1_0_4_Linux_RPM_64/Signed\ installation\ scripts/
chmod +x signed-install_SafenetAuthenticationClient-8.1.0-4.x86_64.rpm.sh
cp ../RPM/SafenetAuthenticationClient-8.1.0-4.x86_64.rpm .
./signed-install_SafenetAuthenticationClient-8.1.0-4.x86_64.rpm.sh

You should see the following (choose 1 for English):
Searching SafenetAuthenticationClient-8.1.0-4.x86_64.rpm... OK
Searching RPM-GPG-KEY-SafenetAuthenticationClient... OK
Deleting existing key
Importing key: RPM-GPG-KEY-SafenetAuthenticationClient
Starting installation
########################################### [100%]
########################################### [100%]
Adding Token security provider......done.
Starting PC/SC smart card daemon (pcscd): [  OK  ]
SafeNet Authentication Client installation completed.
Choose Client Language:
------------------------
1. English.....(En)
2. Spanish.....(Es)
3. French......(Fr)
4. Italian.....(It)
5. Japanese....(Jp)
6. Korean......(Ko)
7. Russian.....(Ru)
8. Chinese.....(Zh)
9. Portoguese..(Pt)
10. Thai.......(Th)
Your choice [1-10] -->1
Installing Language code En.
Done!

Check
opensc-tool --list-readers

The result should be similar to:
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             AKS ifdh 00 00

Find out which slot the device is in:
pkcs11-tool --module /usr/lib64/libeToken.so -L

You should see something to the effect of:
Available slots:
Slot 0 (0x0): AKS xxxx 00 00
 token label:   my label
 token manuf:   SafeNet, Inc.
 token model:   eToken
 token flags:   rng, login required, PIN initialized, token initialized, other flags=0x200
 serial num  :  xxxxxxx
Slot 1 (0x1): 
  (empty)
Slot 2 (0x2): 
  (empty)
Slot 3 (0x3): 
  (empty)
Slot 4 (0x4): 
  (empty)
Slot 5 (0x5): 
  (empty)
 
 
 
----------------- 
Acknowledgements: 
"user4668" for showing how to see the used slots http://bit.ly/1w2dUT8
 
Other Sources for the SAC: 
http://www.digicert.com/util/SafeNetAuthenticationClient-610-011815-002_SAC_Linux_v8.1.zip
http://www.digicert.com/util/SafeNetAuthenticationClient.8.2.27.0.dmg