Thursday, February 12, 2015

Git Rebase

Rebase when you've been on a branch for a few days and you know there have been changes to master.

That way, when you do push your branch up for a pull request and code review it can be easily merged in with the master branch.

Assuming you're on my-feature-branch...

Rebase Commands


git checkout master
git pull
git checkout my-feature-branch
git rebase master
git push -f


Notes

Be sure to run git push -f, not what git is likely to suggest after you run the git rebase master command (git pull).

If you do have the misfortune of pulling changes into the rebase work you did, then you'll end up with a bunch of recent commits to the master branch, that you've already accounted for, in your pull request...

...and you will likely need to delete that branch and recreate it by cherry picking the commits you need.

References

http://git-scm.com/docs/git-rebase


Share this article



This work is licensed under the Creative Commons Attribution 3.0 Unported License.

Tuesday, February 10, 2015

fmt.Printf format reference

Here's the fmt.Printf format reference for Go (golang):

General

the value in a default format%v
type of the value%T

Integer

+255Always show sign%+d
'ÿ'Single quoted%q
377Octal without leading ‘0’%o
0377Octal with leading ‘0’%#o
ffHex lowercase%x
FFHex uppercase%X
0xffHex with “0x”%#x
U+00FFUnicode%U
U+00FF ‘ÿ’Unicode with char%#U
11111111Binary%b

Integer width

|    1|
|   12|
|  123|
| 1234|
|12345|
|123456|
|1234567|
|1    |
|12   |
|123  |
|1234 |
|12345|
|123456|
|1234567|
Minimum width=5. Expand if wider.%5d
%-5d (Left justify)
|    1|
|   12|
|  123|
| 1234|
|12345|
|12345|
|12345|
|1    |
|12   |
|123  |
|1234 |
|12345|
|12345|
|12345|
Width=5. Truncate right if wider.fmt.Printf(“%s”, fmt.Sprintf(“%5d”, value)[:5]))
fmt.Printf(“%s”, fmt.Sprintf(“%-5d”, value)[:5])) (Left justify)
  or
fmt.Printf(“|%5.5s|\n”, strconv.Itoa(value))
fmt.Printf(“|%-5.5s|\n”, strconv.Itoa(value)) (Left justify)
|    1|
|   12|
|  123|
| 1234|
|12345|
|23456|
|34567|
|1    |
|12   |
|123  |
|1234 |
|12345|
|23456|
|34567|
Width=5. Truncate left if wider.fmt.Printf(“%5d”, val % 100000)
fmt.Printf(“%-5d”, val % 100000) (Left justify)
|0012345|Pad with ‘0’ (Right justify only)%07d

Float

original%f (=%.6f)
6 digits after decimal
%e (=%.6e)
6 digits after decimal
%g
smallest number of digits necessary
%.3g
total number of digits=3
12345
1234.5
123.45
12.345
1.2345
0.12345
0.012345
0.0012345
0.00012345
0.000012345
0.0000012345
12345.000000
1234.500000
123.450000
12.345000
1.234500
0.123450
0.012345
0.001234
0.000123
0.000012
0.000001
1.234500e+04
1.234500e+03
1.234500e+02
1.234500e+01
1.234500e+00
1.234500e-01
1.234500e-02
1.234500e-03
1.234500e-04
1.234500e-05
1.234500e-06
12345
1234.5
123.45
12.345
1.2345
0.12345
0.012345
0.0012345
0.00012345
1.2345e-05
1.2345e-06
1.23e+04
1.23e+03
123
12.3
1.23
0.123
0.0123
0.00123
0.000123
1.23e-05
1.23e-06

String

love is "愛"Normal%s
"love is \"愛\""Double-quoted%q
`love is "愛"`Back-quoted if possible. Otherwise, double-quoted%#q
"love is \"\u611b\""Double-quoted. ASCII only.%+q
6c6f76652069732022e6849b22Hex lowercase.%x
6C6F76652069732022E6849B22Hex uppercase.%X
6c 6f 76 65 20 69 73 20 22 e6 84 9b 22Hex with space.% x

String width

|    1|
|   12|
|  123|
| 1234|
|12345|
|123456|
|1234567|
|12345678|
|123456789|
|1234567890|
|1    |
|12   |
|123  |
|1234 |
|12345|
|123456|
|1234567|
|12345678|
|123456789|
|1234567890|
Minimum width=5. Expand if wider.%5s
%-5s (Left justify)
|1|
|12|
|123|
|1234|
|12345|
|12345|
|12345|
Maximum width=5(Expand up to 5).%.5s
|    1|
|   12|
|  123|
| 1234|
|12345|
|123456|
|1234567|
|1234567|
|1234567|
|1234567|
|1    |
|12   |
|123  |
|1234 |
|12345|
|123456|
|1234567|
|1234567|
|1234567|
|1234567|
Minimum width=5. Expand up to 7.%5.7s
%-5.7 (Left justify)
|    1|
|   12|
|  123|
| 1234|
|12345|
|12345|
|12345|
|1    |
|12   |
|123  |
|1234 |
|12345|
|12345|
|12345|
Width=5.%5.5s
%-5.5s (Left justify)
|    1|
|   12|
|  123|
|  123|
|  123|
|1    |
|12   |
|123  |
|123  |
|123  |
Width=5. Truncate if wider than 3.%5.3s
%-5.3s (Left justify)
|0012345||12345  |Pad with ‘0’. Doen’t work when left-justify%07s

Struct

{sam {12345 67890}}Normal%v
{name:sam phone:{mobile:12345 office:67890}With field names%+v
main.People{name:”sam”, phone:main.Phone{mobile:”12345”, office:”67890”}}Go’s syntax%#v

Boolean

true
false
Boolean%t

Pointer

0x1842c220Pointer with 0x%p
1842c220Pointer without 0x%#p

References

http://golang-examples.tumblr.com/post/86795367134/fmt-printf-format-reference-cheat-sheet


Share this article


This work is licensed under the Creative Commons Attribution 3.0 Unported License.

Monday, February 2, 2015

Running out of RAM on Yosemite

If you notice that you're running out of RAM on OSX Yosimite...

First, open you Activity Monitor, click the [Memory] tab and sort by "Memory"

If WindowServer is hogging your RAM then resetting you mac's PRAM might fix things.

Reset your mac's PRAM

  • Close all open apps
  • Press CMD + Option + ESC (***)
  • Put your mac to Sleep
  • Wake you mac
  • Restart your mac
  • Press CMD + Option + P + R (keep it down until you hear at least 2 chimes)

(***) Here's where you force quit anything left open. It's okay to leave Finder open

Notes

If you also have excessive CPU utilization, you may want to Repair Disk Permissions, which adds a step to the above process:

Reset Disk Permissions and your mac's PRAM

  • Close all open apps
  • Press CMD + Option + ESC (***)
  • Put your mac to Sleep
  • Wake you mac
  • Restart your mac
  • click “Repair disk permissions”
  • Restart your mac
  • Press CMD + Option + P + R (keep it down until you hear at least 2 chimes)

References

http://support.apple.com/en-us/HT201560
https://discussions.apple.com/thread/6623697


Share this article

profile for l3x at Stack Overflow, Q&A for professional and enthusiast programmers


This work is licensed under the Creative Commons Attribution 3.0 Unported License.

Friday, January 30, 2015

Print Golang Stacktrace

Some IDEs are good at letting you drill down into function definitions.

That's great when you know the starting point.

What about the times when you know exactly where your code broke and you want to find the starting point, as well as all the stops along the way?

Here's one way to do it using runtime/pprof

Output Stack Trace

Add Imports


import (
 "runtime/pprof"
 "os"
)


Generate Stack Trace

Put this on what ever line you want to generate the stack trace from:

pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)


In this example, I put that WriteTo statement on line 222 in file /Users/lex/dev/go/project/src/github.com/company/repo/server/session.go.

Ouput

The output will look something like this:

goroutine profile: total 9
1 @ 0x18ce8c 0x18cc3b 0x189be3 0x3c807 0x3c529 0x3cfe2 0x3ceb1 0x3ce57 0x2cab2 0x1a0060 0x19ed07 0x25c437 0x15af96 0x15aea2 0x16b1f0 0x2cb12 0x1a0060 0x19ed07 0x25c437 0x15af96 0x15aea2 0x15f206 0x2cab2 0x1a0060 0x19ed07 0x25c437 0x15af96 0x15aea2 0x15ea7e 0x2cb12 0x1a0060 0x19ed07
# 0x18ce8c runtime/pprof.writeRuntimeProfile+0xcc        /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/pprof/pprof.go:540
# 0x18cc3b runtime/pprof.writeGoroutine+0x9b        /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/pprof/pprof.go:502
# 0x189be3 runtime/pprof.(*Profile).WriteTo+0xd3        /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/pprof/pprof.go:229
# 0x3c807  github.com/company/repo/server.(*sessionContext).User+0x1f7   /Users/lex/dev/go/project/src/github.com/company/repo/server/session.go:222
# 0x3c529  github.com/company/repo/server.(*sessionContext).UserID+0x39   /Users/lex/dev/go/project/src/github.com/company/repo/server/session.go:193
# 0x3cfe2  github.com/company/repo/server.(*sessionContext).refreshSessionRenderVars+0x42 /Users/lex/dev/go/project/src/github.com/company/repo/server/session.go:285
# 0x3ceb1  github.com/company/repo/server.(*sessionContext).SetSessionRenderVars+0x51 /Users/lex/dev/go/project/src/github.com/company/repo/server/session.go:274
# 0x3ce57  github.com/company/repo/server.SetSessionRenderVars+0x37   /Users/lex/dev/go/project/src/github.com/company/repo/server/session.go:269
# 0x2cab2  runtime.call32+0x32          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/asm_amd64.s:361
# 0x1a0060 reflect.Value.call+0x1210         /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:563
# 0x19ed07 reflect.Value.Call+0xd7          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:411
# 0x25c437 github.com/codegangsta/inject.(*injector).Invoke+0x3b7      /Users/lex/dev/go/project/src/github.com/codegangsta/inject/inject.go:102
# 0x15af96 github.com/company/martini.(*context).run+0x86      /Users/lex/dev/go/project/src/github.com/company/martini/martini.go:163
# 0x15aea2 github.com/company/martini.(*context).Next+0x32      /Users/lex/dev/go/project/src/github.com/company/martini/martini.go:154
# 0x16b1f0 github.com/company/martini-sessions.func·002+0x230      /Users/lex/dev/go/project/src/github.com/company/martini-sessions/sessions.go:93
# 0x2cb12  runtime.call64+0x32          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/asm_amd64.s:362
# 0x1a0060 reflect.Value.call+0x1210         /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:563
# 0x19ed07 reflect.Value.Call+0xd7          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:411
# 0x25c437 github.com/codegangsta/inject.(*injector).Invoke+0x3b7      /Users/lex/dev/go/project/src/github.com/codegangsta/inject/inject.go:102
# 0x15af96 github.com/company/martini.(*context).run+0x86      /Users/lex/dev/go/project/src/github.com/company/martini/martini.go:163
# 0x15aea2 github.com/company/martini.(*context).Next+0x32      /Users/lex/dev/go/project/src/github.com/company/martini/martini.go:154
# 0x15f206 github.com/company/martini.func·004+0x76       /Users/lex/dev/go/project/src/github.com/company/martini/recovery.go:140
# 0x2cab2  runtime.call32+0x32          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/asm_amd64.s:361
# 0x1a0060 reflect.Value.call+0x1210         /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:563
# 0x19ed07 reflect.Value.Call+0xd7          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:411
# 0x25c437 github.com/codegangsta/inject.(*injector).Invoke+0x3b7      /Users/lex/dev/go/project/src/github.com/codegangsta/inject/inject.go:102
# 0x15af96 github.com/company/martini.(*context).run+0x86      /Users/lex/dev/go/project/src/github.com/company/martini/martini.go:163
# 0x15aea2 github.com/company/martini.(*context).Next+0x32      /Users/lex/dev/go/project/src/github.com/company/martini/martini.go:154
# 0x15ea7e github.com/company/martini.func·001+0x1ae       /Users/lex/dev/go/project/src/github.com/company/martini/logger.go:16
# 0x2cb12  runtime.call64+0x32          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/runtime/asm_amd64.s:362
# 0x1a0060 reflect.Value.call+0x1210         /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:563
# 0x19ed07 reflect.Value.Call+0xd7          /usr/local/Cellar/go/1.3.3/libexec/src/pkg/reflect/value.go:411

. . .


Notes

There will be several sections of traces.

You'll probably only be interested in the first one.

References

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


Share this article



This work is licensed under the Creative Commons Attribution 3.0 Unported License.The output will look something like this:

js-pre-commit-git-hook && go-pre-commit-git-hook


Notes

Put the scripts in your $PATH and make them executable.

Create a .jshintrc file with your desired jshint configuration settings.

References



Share this article



This work is licensed under the Creative Commons Attribution 3.0 Unported License.

Tuesday, December 23, 2014

Pre Commit Hook for JS and Go

If you have a web project that has both JavaScript and Go, then you may need to create a pre-commit hook to validate both .js and .go source files.

Here's one way to do it using two script files and a git pre-commit hook.

Create pre commit scripts for JS and Go

js-pre-commit-git-hook


files=$(git diff --cached --name-only --diff-filter=ACM | grep ".js$")
if [ "$files" = "" ]; then
    exit 0
fi
LINTER=jshint
pass=true

echo "\nValidating JavaScript:\n"

for file in ${files}; do
    result=$($LINTER ${file})
    if [ "$?" == "0" ]; then
        echo "\t\033[32m$LINTER Passed: ${file}\033[0m"
    else
        echo "\t\033[31m$LINTER Failed: ${file}\033[0m"
        pass=false
    fi
done

echo "\nJavaScript validation complete\n"

if ! $pass; then
    echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass $LINTER but do not. Please fix the $LINTER errors and try again.\n"
    exit 1
else
    echo "\033[42mCOMMIT SUCCEEDED\033[0m\n"
fi



go-pre-commit-git-hook


#!/bin/sh
# Copyright 2012 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.

# git gofmt pre-commit hook
#
# To use, store as .git/hooks/pre-commit inside your repository and make sure
# it has execute permissions.
#
# This script does not handle file names that contain spaces.

gofiles=$(git diff --cached --name-only --diff-filter=ACM | grep '.go$')
[ -z "$gofiles" ] && exit 0

unformatted=$(gofmt -l $gofiles)
[ -z "$unformatted" ] && exit 0

# Some files are not gofmt'd. Print message and fail.

echo >&2 "Go files must be formatted with gofmt. Please run:"
for fn in $unformatted; do
 echo >&2 "  gofmt -w $PWD/$fn"
done

exit 1


.git/hooks/pre-commit


js-pre-commit-git-hook && go-pre-commit-git-hook


Notes

Put the scripts in your $PATH and make them executable.

Create a .jshintrc file with your desired jshint configuration settings.

References



Share this article



This work is licensed under the Creative Commons Attribution 3.0 Unported License.

Wednesday, December 17, 2014

Implications of the Sony Cyber Attack



When Sony Pictures employees got into the office on Monday, November 24, they discovered that their corporate network had been hacked.

The attackers took terabytes of private data, deleted the original copies from Sony computers, and left messages threatening to release the information if Sony didn't comply with the attackers' demands.

My First Guess

When I first heard that Sony got hacked, my first thought was, "I bet those guys run Windows."

That suspicion has been confirmed.

Possible Attack Vector

The attackers researched Sony's IT infrastructure and knew their victim's vulnerabilities.

Cyber Attack

The attackers could have used email system or Microsoft IE browser vulnerabilities to initially gain access to a regular employees workstation.



Gain Admin Access

Knowing that Sony ran Microsoft Windows, the attackers could have used a known Microsoft Implemented Kerberos solution vulnerability to forge a Privilege Attribute Certificate, that the Kerberos Key Distribution Center validates, to elevate their privileges to that of any other account on the domain.


Destructive Malware

Once attackers gets administrative keys to a Microsoft-based network with unencrypted file systems, they were able to extract that information and expose corporate secrets *** and follow up with destroying the files using destructive BKDR_WIPALL Malware.


*** Corporate Secrets Exposed

Men are paid more than women. Sony's 17 biggest-earning executives are predominantly white men. According to a spreadsheet called "Comp Roster by Supervisory Organization 2014-10-21," Amy Pascal, the co-chair of Sony Pictures Entertainment is the only woman earning $1 million or more at the studio.

A series of emails between Pascal and movie producer Scott Rudin showed an ugly side to the beautiful business of Hollywood. Rudin called Angelina Jolie a "minimally talented spoiled brat" in an email exchange with Pascal. Pascal and Rudin also made racially charged jokes about President Obama's taste in movies. As you would expect, Pascal and Rudin apologized, saying they are so sorry for what they said.

For more details, see: http://www.cnet.com/news/13-revelations-from-the-sony-hack/


Why the Hack was so Effective

  • Sony's Employee Workstations and Network Run on Microsoft Windows
  • Private data was not encrypted
  • Woefully Inadequate Network Security Monitoring


Law Suit Filed

Two former employees of Sony Pictures filed a lawsuit against Sony alleging it didn't do enough to safeguard their personal information and prevent its loss in that cyberattack.

The lawsuit was filed Monday, December 15th 2014, in U.S. District Court for the Central District of California, asks the court to award monetary damages and also class-action status. Thousands of Sony employees past and present could join the suit.

The lawsuit alleges, "Sony failed to secure its computer system, servers and databases, despite weaknesses that it has known about for years, because Sony made a business decision to accept the risk of losses associated with being hacked."

How can Sony defend itself against solid claims of negligence?


IT Security Laws for Corporations

Sarbanes-Oxley

Sarbanes-Oxley, or 'Sarbox' as it is sometimes called, was enacted in 2002 to help prevent future Enron-like episodes from happening again. It requires companies to be accountable for identifying and mitigating risks to their financial stability and this includes information security.

Sarbanes-Oxley details a "chain of accountability" where senior executives and board members must sign off on the accuracy of financial reporting, then the managers that report to them must be darned sure that their information is accurate. That applies to the managers who report to them and the people who report to them and so on. While the average employee of a public company will most likely not go to jail over a Sarbanes-Oxley violation (C-level executives are not so fortunate) each employee does have an important role in maintaining the security and integrity of corporate data.

When Sarbanes-Oxley mentions "controls" it it talking about policies, procedures and guidelines that protect information in your company with a direct implication of adequate IT security enforcement.

HIPAA Security Rule

This massive cyberattack constitutes unauthorized access or acquisition of personal information subject to most state and federal data breach notification requirements, including the HIPAA Data Breach Notification Rule. The HIPAA Security Rule contains a number of provisions that require covered entities and business associates to maintain procedures to monitor system activity for potential security incidents and investigate any such potential security incidents.

The HIPAA Security Rule requires covered entities and business associates to “regularly review records of information system activity, such as audit logs, access records, and security incident tracking reports.” 45 C.F.R. § 164.306(a)(1)(ii)(D). HHS guidance materials further state that this specification “should also promote continual awareness of any information system activity that could suggest a security incident.” See CMS, HIPAA Security Series Vol. 2 Security Standards: Administrative Safeguards

The HIPAA Security Rule requires covered entities and business associates to create and maintain appropriate records of system activity. See 45 C.F.R. 164.312(b). However, covered entities and business associates have significant discretion to create and maintain activity records based upon the formal assessment of their security risks.

Breach Notification

Breach notice laws typically define, “personal information” as, "A user name or email address, in combination with a password or security question and answer that would permit access to an online account."

Implications

  • IT security should be taken seriously
  • As a C-level executive, you should know the laws pertaining to safeguarding your company and employees' data.
  • As a C-level executive, you are liable for lax IT security enforcement at your company.

Lessons Learned

  1. If you are a C-level executive and your company runs Windows, change that or get another job.
  2. Hire a professional to thoroughly evaluate your current security policies.
  3. Don't ask for trouble, but if you do don't run Windows.


SANS Instituted Cyber Attack Response Plan

For many organizations today, the question is no longer if they will fall victim to a targeted attack, but when. In such an event, how an organization responds will determine whether it becomes a serious event or if it stays a mere annoyance.

This requires something of a change of mindset for information security professionals. Previous techniques and many best practices are under the premise that an attacker can be kept out.

However, that’s no longer the case today. The malware used in targeted attacks is frequently not detected (because it’s been custom-made for specific organizations). A well-crafted social engineering attack can look like a normal business email or engaging click bait.

In short, an attacker with sufficient resources will be able to find their way inside their target, regardless of what the defender does. The defender can raise the price of getting in, but not prevent it entirely.

The SANS Institute provides some guidelines to organizations on how they should react to incidents. Broadly speaking, however, the response can be divided into four steps:

Prepare

This involves responding to a targeted attack even before the attack actually takes place. Security professionals need to plan for a response to a targeted attack on their network. System administrators will routinely have plans, for example, for downtime-related events such as a data center going offline.

Similarly, it’s important to be aware of the normal, day-to-day threats that an organization faces. Information security professionals must not only deal with these attacks as they happen, but should understand what their “normal” problems are so that abnormal threats like targeted attacks can be quickly spotted. Threat intelligence and analysis is valuable in this step, in order to guide security professionals into understanding what the current situation is.

Security professionals must also plan to acquire the right skills to effectively deal with targeted attacks. One of the most important skills to learn is digital forensic techniques, which allow for the proper acquisition and analysis of information from compromise devices.

Many of these techniques are quite foreign to normal IT day-to-day work, but learning these techniques will help organizations gain information and be better prepared to deal with any attack in progress.

Respond

Upon identifying targeted attack in progress, the next step is to respond decisively. Responding to a targeted attacks has several components: containing the threat, removing it, and determining the scope of damage. The first step is to immediately isolate or contain the scope of any threat. Steps that can be performed here include isolating infected machines or taking compromised services offline. Ultimately, the goal is to prevent an attack from gaining further ground.

To determine any threats in place, working hand in hand with a security vendor that has knowledge of commonly used targeted attack tools and grayware is useful in order to locate the threats within an organization. Similarly, continuous monitoring of existing network activity can help determine the scale and scope of any existing attack.

Restore

Just as important as responding to an attack is restoring an organization to normal operations. While some disruption is a necessary part of responding to a targeted attack, in the long run an organization has to “return to normal” and go back to normal operations.

“Restoring” an organization to normal is not only about technical considerations. If necessary, an organization needs to reach out to partners, stakeholders, and customers to clearly communicate the scope of a targeted attack’s damage, and any steps being taken to reduce the damage. In many cases, goodwill and trust are big casualties of a targeted attack, and these must be addressed as well.

Learn

Once an attack is over, organizations need to figure out what can be learned from it. Every attack offers lessons for defenders – what worked? What could we have done better? It may turn out that the some of the assumptions and information that went into planning for security incidents was not correct or incomplete.

However, it is also important to not overreact to any single incident. Overreacting can be just as bad as under-reaction: it can impose burdens on the organization that have marginal gains in security, if any. Decisions must be made bas


In today’s world of frequent targeted attacks – when breaches are a matter of when and not if - a carefully crafted strategy to respond to targeted attacks must be part and parcel of the larger defense strategy. This can be the difference between a minor nuisance and a major breach that could spell the demise of an organization.

For original reference to this section see: http://blog.trendmicro.com/trendlabs-security-intelligence/four-steps-to-an-effective-targeted-attack-response/


References

http://ww2.cfo.com/technology/2014/12/sony-says-private-data-stolen-brazen-cyber-attack/
http://www.computerworld.com/article/2860456/lawsuit-filed-against-sony-after-massive-hack.html
http://recode.net/2014/12/02/details-emerge-on-malware-used-in-sony-hacking-attack/
http://www.computerweekly.com/news/2240236006/Sony-hack-exposes-poor-security-practices
http://blogs.technet.com/b/srd/archive/2014/11/18/additional-information-about-cve-2014-6324.aspx
http://www.whitehouse.gov/issues/foreign-policy/cybersecurity/national-initiative http://blog.trendmicro.com/trendlabs-security-intelligence/an-analysis-of-the-destructive-malware-behind-fbi-warnings/

Share this article



This work is licensed under the Creative Commons Attribution 3.0 Unported License.

Java's verbose Python is too slow... It's time you know...

Write in Go! Write in Go!



Lyrics

The schedule's tight on the cluster tonight.
So I parallelized my code.
All those threads and continuations.
My head's going to explode.
And all that boilerplate.
That FactoryBuilderAdapterDelegateImpl
Seems unjustified
Give me something simple
Don't write in Scheme
Don't write in C
No more pointers that I forgot to free()
Java's verbose
Python's too slow
It's time you know
Write in Go
Write in Go
No inheritance anymore
Write in Go
Write in Go
There's no do or while,just for
I don't care what your linters say
I've got tools for that
The code never bothered me anyway
dodododo diudiudiu...
It's funny how some features
Make every change seem small
And the errors that once slowed me
Don't get me down at all
It's time to see what Go can do
Cause it seems too good to be true
No long compile times for me
I'm free
Write in Go
Write in Go
Kiss your pointer math goodbye
Write in Go
Write in Go
Time to give GC a try
I don't care if my structures stay
on the heap or stack
donononododono...
My program spawns its goroutines without a sound
Control is spiraling through buffered channels all around
I don't remember why I ever once subclassed
I'm never going back
My tests all build and pass
Write in Go
Write in Go
You won't use Eclipse anymore
Write in Go
Write in Go
Who cares what Boost is for?
I don't care what the tech leads say
oo wow oo...
I'll rewrite it all
nonononono...
Writing code never bothered me ,anyway

Sung by ScaleAbility, an acapella group at Google.

Share this article



This work is licensed under the Creative Commons Attribution 3.0 Unported License.