Showing posts with label dlang. Show all posts
Showing posts with label dlang. Show all posts

This Week I Learned - 2017 Week 01

Last week post or the whole series.

First week of the new year 2017. A busy and slow week. Busy because wrapping up most of the pending to-do list. Slow due to the progress of clearing up the list. When you're overwhelmed by numerous tasks at hand, the best way is still sleep over it. You can't do much with a tired mind, especially at my age now. You can accomplish lots of thing with a good sleep and fresh mind in the wee hours in the morning, roughly around 4:30 a.m.


Did something happened in July? Darker green means more steps and lighter green, the opposite. To the best of my recollection, I've misplaced my pedometer and resolved to use Google's Fit step counter, which is not entirely accurate. Typically offset by half against my pedometer.

#1 Remember about last week post on adding extra options so we compile the sample D source code? The extra options can be added to the `dmd.conf` configuration file. Following these steps to add them to `dmd.conf` file so that you won't need to type them again and again.

Copy the config file to your home directory
$ cp /etc/dmd.conf $HOME

Append the options, `-fPIC -defaultlib=libphobos2.so` to `DFLAGS` variable.
[Environment32]
DFLAGS=-I/usr/include/dmd/phobos -I/usr/include/dmd/druntime/import
-L-L/usr/lib/i386-linux-gnu -L--export-dynamic -fPIC -defaultlib=libphobos2.so

[Environment64]
DFLAGS=-I/usr/include/dmd/phobos -I/usr/include/dmd/druntime/import-L-L/usr/lib/x86_64-linux-gnu
-L--export-dynamic -fPIC -defaultlib=libphobos2.so

#2 Some new concepts in Modern C++. What is this Resource acquisition is initialization (RAII) I kept reading about? It's a programming idiom is about safe resource management and in C++, through an object's lifetime. Resources are initialized and acquired in object's constructor and released through object's destructor. In other words, resources are cleaned up when the scope of code have exit. See the diagram below for further understanding. Other programming languages implemented this idiom through a try/finally block instead through an object's destructor.


Second, is the concept of template. As C++ is a statically typed programming language (type checking is done at compile-time rather than run-time, see this good example), when you declare or initialize any variables, you need to specific a data type. What if you need to pass in a variable to a function which can accept different kinds of numeric data, an integer or and a floating-point number? This is when you will use template to specific a generic type.

Example of the function templates is shown below. You can pass in different kind of data types like integer, floating-number, or character.
#include <iostream>
using namespace std ;
//max returns the maximum of the two elements
template 
T max(T a, T b) {
    return a > b ? a : b ;
}

While we're at Modern C++, there is a list of resources which can get you started as well as the C++11/14/17 feature list. For learning C++ today, the minimum standard you should follow is C++11.

#3 Instead of listening to music while coding, why not listen to development related podcasts like Software Engineering Radio, The Changelog, The Bike Shed, or FLOSS weekly? All this better than some annoying pig squeal and snort noises.

#4 Accidentally messed up my commit dates while testing Git. Need to updates some old commits. However, you have to force push to override the history.
$ git filter-branch --env-filter \
'if [ $GIT_COMMIT = f1d2d2f924e986ac86fdf7b36c94bcdf32beec15 ]
then
    export GIT_AUTHOR_DATE="Sun Jan 7 01:02:03 2017 +0800"
    export GIT_COMMITTER_DATE="Sun Jan 7 01:02:03 2017 +0800"
fi'

$ git push -f origin master

And to remove all the uncommitted files from your project, you can use this Git command. However, be careful as it also remove my Vim's swap files (.swp). Did I forget to set a global path for all Vim's swap files?
$ git clean -d -f -x

#5 As I'm starting to build something in C++, creating and maintaining a Makefile is quite a hassle. Luckily we have CMake which helps let us bootstrap the Makefile fast. One thing I've learned when using CMake is compile and build your program in a specific folder. This will prevent all the temporary files generated by CMake from cluttering your root folder.
$ mkdir build && cd build
$ cmake ../
$ tree -L 1 .
.
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
└── Makefile


This Week I Learned - 2017 Week 00

Happy new year!

2017, the year of the fire rooster. It will be interesting to see what this year will unfold itself. The plan will still remain the same every year. The usual stay alive and healthy, more reading, learning, writing, coding, and producing as well as build new habits. In other words, do, try, make more mistakes. As they said, "One who makes no mistakes make nothing at all". Be constant aware of you thoughts and actions. Live in the moments. There is a Zen saying, "When hungry, eat. When tired, sleep". Nevertheless, do plan ahead and learn from your past. In short, continue what you planned last year and adjust accordingly.

Learning reflection for 2016. I wrote 58 posts last year. Still a firm believer of quantity over quality. Writing is like exercising, you need to practice persistently to get better. However, blindly deliberate practice without any targets may be wasteful and leads to no where. Still something to ponder about. What I learned last year? Mostly Perl and Git as well as others stuff in between. When there are always rooms for improvement, all these exposure to new old stuff (Perl is damn old anyway) did satisfy my intellectual curiosity. Exposure to C++ for the last two months was interesting. It really piqued my interesting on static type programming languages.

As usual, here we go, something new I've learned this week.

#1 According to ISO 8601, the definition of week 01 if 1st Jan falls on Monday till Thursday. If it falls on Friday till Sunday, it's still the last week of previous year. However, there is no week 00. Nevertheless, I still prefer to call it week 00, as 1st Jan signifies a fresh start.

#2 Information overload? Thinking of applying digital minimalism? (via HN). FOMO is probably is main cause to our digital clutter. Unless these digital tools can bring values to your offline life, ditch them. Likewise, I still have a long way to go with my minimalist lifestyle, not everything fit into one bag yet. There are literally thousands of things I wish to ditch away. Still, one thing at a time.

#3 The D programming language. If you're doing doing development for quite some time and follow the programming language trend, you probably heard about this programming language. I've stumbled upon this again while doing some C++ coding. Developed as an alternative or replacement to C++, it still failed, after all these years, to gain any traction (based on my reading and impression of Thoughtworks' Technology Radar, HN, and Dlang subreddit). It was one year ago since Andrei Alexandrescu quit his secure job at Facebook (get a big pay cut but financially still ok) to push D forward on full time basis, does it really helps?

I played and read through the documentation, on the surface, it's looks quite nice, Python-like syntax with C/C++ speed but isn't Golang or Nim existed for the same reason? Nevertheless, the documentation was fun to read. Love the Contract Programming, especially the Invariants.  The wiki post on Components Programming Using D (ala functional programming) was one of the most interesting read on programming language this new year.

While we at it, some adjustments are needed to get Dlang to work in Ubuntu 16.10.

First, setup the APT repository for D.
$ sudo wget http://master.dl.sourceforge.net/project/d-apt/files/d-apt.list \
-O /etc/apt/sources.list.d/d-apt.list

$ sudo apt-get update && sudo apt-get -y --allow-unauthenticated install \
--reinstall d-apt-keyring && $ sudo apt-get update

$ sudo apt install dmd

Next, generate the sample hello word project.
$ dub init hello
$ cd hello/source

However, you will encounter error below during compilation.
$ dmd app.d
/usr/bin/ld: app.o: relocation R_X86_64_32 against symbol `__dmd_personality_v0' 
can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libphobos2.a(exception_249_55a.o): 
relocation R_X86_64_32 against symbol `__dmd_personality_v0' can not 
be used when making a shared object; recompile with -fPIC

Add these additional options to get it to run.
$ dmd app.d -fPIC -defaultlib=libphobos2.so
./app
Edit source/app.d to start your project.

Compile and run on-the-fly.
$ rdmd -defaultlib=libphobos2.so -fPIC app.d
Edit source/app.d to start your project.