Thursday, November 17, 2016

Swift 3 by example

//: Playground - noun: a place where people can play

import UIKit

// Mutable variable
var str = "Hello, playground"

// Array
var myarr : [String] = ["Watsh", "Rajneesh"]

// Dictionary
var mydict : [String:String] = ["tic": "tac", "ping": "pong"]

// constants
let conststr = "My Const String"
let countup = ["one", "two"]
let mapNameToParkingSpace = ["Alice": 10, "Rajneesh": 12]

// subscript of array
let elem = countup[1]

// Initializers
let emptyString = String()
let emptyArr = [Int]()

let emptySet = Set<Float>()

let defaultNum = Int()

let defaultBool = Bool()

let defaultFloat = Float()

// initializing a set
let availableRoomsSet = Set([1,2,3, 4])

// Properties

// Optionals - can be value of the said datatype or nil
var anOptionalFloat: Float?
var anOptionalArrayOfStrings: [String]?
var anOptionalArrayOfOptionalStrings: [String?]?

var reading1: Float?
var reading2: Float?

reading1 = 1.0
reading2 = 2.0

// to use the value we need to unwrap the optional

// 1. forced unwrapping - used when sure that value will not be nil
// if reading2 assignment commented - this will result in error

let avgReading = (reading1! + reading2!)/2

// 2. Optional binding - safe to use always
//  if reading2 assignment is commented out, will go to else block
if let r1 = reading1,
    let r2 = reading2 {
    let avg = (r1 + r2)/2
} else {
    print("reading nil")

// Subscripting dictionary
let nameByParkingSpace = [13: "Alice", 27: "Bob"]
let space13Assignee: String? = nameByParkingSpace[13]
let space42Assignee: String? = nameByParkingSpace[42]

if let space13Assignee = nameByParkingSpace[13] {
    print("Key 13 is assigned in the dictionary!")

// looping
let range = 0 ..< countup.count

for i in range {
    let string = countup[i]
    // Use 'string'

for string in countup {
    // Use 'string'

// return a tuple of index and value in array
for (i, string) in countup.enumerated() {
    // (0, "one"), (1, "two")

// iterating dictionary
for (space, name) in nameByParkingSpace {
    let permit = "Space \(space): \(name)"

// enum
enum PieType {
    case Apple
    case Cherry
    case Pecan

let favoritePie = PieType.Apple

let name: String

// switch-case with enum
// no break required as only the code within the matching case is executed so break is implicit
// fallthrough behavior can be set
switch favoritePie {
case .Apple:
    name = "Apple"
case .Cherry:
    name = "Cherry"
case .Pecan:
    name = "Pecan"

let osxVersion: Int = 7
switch osxVersion {
case 0...8:
    print("A big cat")
case 9:
case 10:
    print("Greetings, people of the future! What's new in 10.\(osxVersion)?")

// Value associated with enum
enum PieTypeInt: Int {
    case Apple = 0
    case Cherry
    case Pecan

Friday, November 11, 2016

Understanding Bitcoin technology

A short summary of what i understood so far about Bitcoin technology:
  1. It is a digital cryptocurrency - uses asymmetric encryption (private/public key pairs) during transactions and hashing (SHA256) to generate bitcoin addresses (which is analogous to a bank account number)
  2. The main author of this technology and initial software is Satoshi Nakamoto but no one knows him/her/them. Satoshi released the bitcoin software in Jan 2009. 
  3. It is decentralized - like gold and unlike paper currency which is centrally managed by governments of countries - so it is also called Digital Gold.
  4. An upper limit is set to the number of bitcoins that will be mined or generated. It is 21 million bitcoins (or BTC or XBT) and this number will be reached by the year 2040. At present the total bitcoins are around 16 million at the time of this writing ( That the upper limit is fixed so the value of the bitcoin will keep increasing as time goes by. This is called deflation. For paper currency government's print more money to offset any deficit causing the existing value of money to reduce - and this is inflation. Bitcoin, like gold, is deflationary and its value keeps increasing unlike paper currency whose value is decreasing due to inflation.
  5. The lowest unit in bitcoin cryptocurrency is (0.000000001 bitcoin) which is called a "satoshi". Then there is 0.0000001 micro bitcoin or bit and 0.0001 milli bitcoin. So we can go very granular and can make transactions with very small fractions like 0.000345 bitcoin or BTC.
  6. Value of 1BTC at the time of this writing is $717 approx.
  7. It uses a peer-to-peer (P2P) network of computers. 
  8. A set of transactions is grouped in a structure called "block" and added to the end of the "blockchain". Blockchain is like a ledger of all transactions ever done using bitcoins. All nodes running the bitcoin software get a copy of this ledger (initially it takes quite a while to download the blockchain data). After initial download all transactions are added to the blockchain. 
  9. Every 10 mins the blocks of transactions will be synched to all nodes in the bitcoin network but only one node  (also called "miners") that wins a lottery (there could be just one such winner usually) will be able to change the blockchain and add the blocks of transactions it received to the blockchain. This then makes the transactions permanent in the blockchain and it will be synched to all thousands of miner nodes in the P2P network (thus no one central node maintains the ledger and it is virtually impossible to delete a transaction once done). The idea is that every 10 mins only one node in the P2P network will win the chance to add blocks to the blockchain. 
  10. If there happens to be a collision (meaning 2 nodes win the lottery at the same time) then only one of them will hold once in the next 10 mins the next winner node adds a block to one of the previous lottery winning node's blockchain. Then that (longest blockchain) remains as the source of truth and the other blockchain becomes orphaned. This protocol where nodes in the distributed computing environment arrive at a consensus and choose a winner every 10 mins is said to solve a byzantine general's problem that was deemed unsolvable earlier.
  11. The miners are rewarded in 2 ways - 
    1. each transaction has a fee associated with it that is earned as a reward by the miner that wins the lottery. It is generally a small value (0.0002 BTC at the time of this writing in Bitcoin-core wallet program). 
    2. when bitcoins were introduced in Jan 2009 then miners that used to win in those days until next 4 years were rewarded with 50 BTC every 10mins. Then in the following 4 years this reward was halved to 25 BTC and then in the following 4 years to 12.5 BTC and so on. This value will keep reducing and so the reward fee value will keep increasing. The reason that it is reducing is to ensure the total "mined" or generated bitcoins will not go beyond 21 Million BTC.
  12. The incentive to "find" a block (akin to mining and finding gold) in bitcoin is why several folks invested in hardware that can do bitcoin mining on the P2P network and be compensated by the fee associated with all transactions that make that block they find and also the share of new bitcoins mined which also goes to the miner that found the block.

Wednesday, November 09, 2016

git clone shows all files as deleted or changed

When git clone shows all files as deleted or changed then do the following:

Ensure the following property is set or else windows will not be able to handle file path names longer than 260 chars. Thus resulting in odd behavior of git.

git config --system core.longpaths true

git reset --hard origin/[your_branch]-- this will reset local git repo index to match the one at remote branch.