As an enthusiast, I started working with embedded with Netduino. It was fun but at the same time Netduino was not offering that much things that I can do now. For a person like me who has no knowledge of electronics and C/C++, this was a gift. Now here I am using Raspberry PI’s latest version and I have everything I ever wanted on a single piece of hardware.
To get started with Python and Raspberry PI, I looked into the “Hello World” sort of LED blinking example. Using the LCD is the second thing I would like to test and so here it is. Before you start, here are the things you will need.
1 x Raspberry PI 2
LCD with 16x2 display - HD44780
8 x Male-Female jumper wires
5 x Male-Male jumper wires
Here is the simple wiring to connect LCD with your Raspberry PI 2
As you can see from the wiring diagram, the LCD will take up around 6 GPIO pins on your Raspberry PI. If you have some modules plugged in or you are planning to then there are chances that you will fall short of the GPIO pins. To save GPIO pins on your board, you can use MCP23008 or MCP23017 . To keep it simple, I am not using any port expanders for now.
Now comes the code, I have a very little knowledge of Python at the moment. So I am going to stick with what I have read and tested. For controlling the LCD, I am going to use Adafruit’s LCD library which you can get it from Github here. I am going to use Adafruit_CharLCD.py
to control my LCD. The thing to keep in mind is that you cannot use this library out of the box. You have to make a change to set the correct GPIO pins in the __init__
function. Open the file using the below command.
$ sudo nano Adafruit_CharLCD.py
If you are using the same wiring as I am, then change the __init__
function like this
def __init__init(self, pin_rs=26, pin_e=19, pins_db=[13, 6, 5, 11], GPIO=None):
Save the changes and we are good to go. To check if the wiring and the code changes are done properly, execute the below command in the same directory.
$ sudo ./Adafruit_CharLCD_IPclock_example.py
Let’s try displaying some custom messages to the display with this simple program.
from Adafruit_CharLCD import Adafruit_CharLCD lcd = Adafruit_CharLCD() lcd.message("Raspberry PI 2\nLCD Demo")
Here is one more. The program will ask you to enter the string to display.
from Adafruit_CharLCD import Adafruit_CharLCD lcd = Adafruit_CharLCD() #Getting input from user msg = raw_input("Enter message to display\n") #Display it on the LCD lcd.message(str(msg))
The reason I am using Adafruit library to control the display is because it has other useful functions to control LCD. Here is the list of functions that you can try.
clear()
- Clears the LCD and remove text from the memory.
display()/noDisplay()
- Toggle the text visibility on the LCD. Text remains in the memory.
cursor()/noCursor
- Toggle cursor visibility.
blink()/noBlink()
- Toggle cursor blink.
home()
- Take the cursor to the 0,0 position i.e. first column of first row.
setCursor(col, row)
- Set the cursor to the specific position. Use lcd.begin(col, rows)
to set the number of columns and rows your display has.
I hope this will be useful to the people who are just getting started with Raspberry Pi. You can also download the complete source code from Github here.
Open-source has entirely change the programming and developers world. Today you can create any application, game, mobile app without spending a single penny. Thanks to open-source software and awesome community of developers and people behind them. As a .NET developer I have been developing enterprise applications for quite a long time and now I have shifted my focus towards developing products and understanding what it takes to make a successful product launch.
Back then, I used to spend most of my time in investigating the new technologies and what technology we should be using to get this thing done. I still do that today, not because it is the requirement of the project but because I have been asking a lot of questions. The list of projects I have compiled below are the projects that have helped me in learning lots of new things and insights of the programming and I hope this does the same for you as well. Here is the list of awesome open-source project that you should be following on Github.
We all know about Paint.net, it is an awesome tool and a complete replacement of Photoshop (at least for me). And yet there is another project which is almost the same and open-source and it works on Linux and Mac. It uses Gtk# (Gtk sharp) to run on both Window and Linux platforms. This project is a must have if you are a .NET guy and want to get yourself into some serious programming. You will learn about the insights of using gtk# in your projects. Though Microsoft already took the steps to have .NET FX on Linux but still this project is a great learning source.
Official site: http://www.pinta-project.com/
Github: https://github.com/PintaProject/Pinta
I take a lot of screen shots and record screen casts as well for my personal use. But I used to use two different tools to get the work done. This is one of the tools that will not just take screen shots or just let you record your screen casts easily, it will also allow you to upload them to the 40 different image storing cloud services. Dive into the source code and see the awesomeness under the hood. Here is the project description as seen on Github.
ShareX is an open source program that lets you take screenshots or screencasts of any selected area with a single key, save them in your clipboard, hard disk or instantly upload them to over 40 different file hosting services. In addition to taking screenshots, it can upload images, text files and all other different file types.
Official site: https://getsharex.com/
Github: https://github.com/ShareX/ShareX
You got a programming question, you Google it and it redirects it to StackOverflow. StackOverflow needs no introduction among programmers. StackOverflow is one of the Q&A site dedicated to the developers to get the answers for their problems. But it is just one site. In the recent years StackExchange has grew up and not just providing support for programmers but also helping folks from other fields. Now the data StackExchange has is available for anyone out there for free under creative-commons. If you are interested in looking into the source code that powers the user to query that immense amount of data bank then head over to Github and fork this project. StackExchange is all about Microsoft stack and this tool is also written in ASP.NET MVC3.
Official App: https://data.stackexchange.com/
Github: https://github.com/StackExchange/StackExchange.DataExplorer
This is the minimalistic blog engine written in ASP.NET web pages by the author of BlogEngine.NET, Mads Kristensen. I started my bog with BlogEngine.NET and I had an amazing experience with it. MiniBlog is totally different in terms of features that are offered by BlogEngine.NET. This project will tell you the power of web pages and how you can write your own simple site without wasting much time.
Demo: http://miniblog.azurewebsites.net/ (with user name and password as demo).
Github: https://github.com/madskristensen/MiniBlog
If you want to run cron jobs or automated jobs in your application quietly, then this is the library you should be using. The documentation is pretty sleek and get you started in no time. But other than that you should take a look at the source code and see how nicely this has been done.
Github: https://github.com/jgeurts/FluentScheduler
A Micro-ORM used by StackExchange sites. This is a perfect replacement for EF. This is just a single file that you can drop in your project and get started.
Dapper is a single file you can drop in to your project that will extend your IDbConnection interface.
Github: https://github.com/StackExchange/dapper-dot-net
A .NET library to access MediaWiki API. The library is almost 3 years old but the source code will worth the look. Excerpt from Github:
LinqToWiki is a library for accessing sites running MediaWiki (including Wikipedia) through the MediaWiki API from .Net languages like C# and VB.NET.
It can be used to do almost anything that can be done from the web interface and more, including things like editing articles, listing articles in categories, listing all kinds of links on a page and much more. Querying the various lists available can be done using LINQ queries, which then get translated into efficient API requests.
Ever since the .NET stack went open source last year, there is a huge excitement among the developers about the .NET stuff and developing apps using .NET which are no longer limited to Windows platform. I tried to install ASP.NET VNext on Ubuntu VM in which I terribly failed in the first go. Why? because the tutorial I used was quite old and I messed up the installation of pre-requisites. But I get everything working in the second try. So here are the steps and commands that will get you started with ASP.NET VNext on Ubuntu.
I am setting up a fresh VM for development on Ubuntu 14.04.2 LTS
First thing is to install Mono. For folks who are new to Linux environment, Mono is a community driven project which allows developers to build and run .NET application on Linux platforms. Here is the set of commands that I have to execute to install Mono.
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list sudo apt-get update
Install the latest version of Mono available.
sudo apt-get install mono-complete
To check if Mono is successfully installed or to determine the version of Mono on you machine run the below command in the terminal.
mono --version
As stated on Github:
Libuv is a multi-platform asynchronous IO library that is used by the KestrelHttpServer that we will use to host our web applications.
Running the below command will install LibUV along with the dependencies require to build it.
sudo apt-get install automake libtool
Getting the source and building and installing it.
curl -sSL https://github.com/libuv/libuv/archive/v1.9.0.tar.gz | sudo tar zxfv - -C /usr/local/src cd /usr/local/src/libuv-1.9.0 sudo sh autogen.sh sudo ./configure sudo make sudo make install sudo rm -rf /usr/local/src/libuv-1.9.0 && cd ~/ sudo ldconfig
Here is a note at Githb repo that explains what the above set of commands are doing.
NOTE: make install puts libuv.so.1 in /usr/local/lib, in the above commands ldconfig is used to update ld.so.cache so that dlopen (see man dlopen) can load it. If you are getting libuv some other way or not running make install then you need to ensure that dlopen is capable of loading libuv.so.1
DNVM is a command line tool which allows you to get new build of the DNX (.NET Execution Environment) and allows you to switch between them. To get DNVM running fire the below command in the terminal.
curl -sSL https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.sh | DNX_BRANCH=dev sh && source ~/.dnx/dnvm/dnvm.sh
To check if the DNVM is successfully installed on your machine, type DNVM in the terminal. The output should be something like this:
At any point of time if you want to list out the installed DNX runtimes, run the below command
dnvm list
The next step after this, is to upgrade the DNVM so you can use the dnx
and dnu
commands. Run the following command in the terminal.
dnvm upgrade
Once this is done, we are all set to run ASP.NET VNext application on Ubuntu box. Clone the aspnet/Home repository from Github. If you don’t have Git installed then install it with this simple command.
sudo apt-get install git
For simplicity, I have created a new directory on Ubuntu desktop named vnext. You can name the directory as you wish. Navigate to this directory in the terminal and clone the aspnet/Home repository.
git clone https://github.com/aspnet/Home.git
After cloning of repository is done, navigate to the 1.0.0-beta4
directory.
You can see three sample applications that you can test. For this tutorial I am going to checkout HelloMvc
application. Get inside the HelloMvc
directory and then, run the command
dnu restore
This will take some time to execute. I didn’t face this problem but there is a chance that someone will. When you run this command, the project.json.lock
file gets created and the restore of the package will start. In the end when the restore is finalizing, it may say permission is denied. To resolve this error you can change the permission of the folder by running the following command.
sudo chmod -R 755 HelloMvc
You should always change permission to 755
for directories and 644
for files.
After the execution is completed, you can start the server by running the command.
dnx . kestrel
This command will work for both web and mvc application. If you plan to test out the console application then you can run the following command.
dnx . run
The server runs at port 5004. Fire up the browser and type in http://localhost:5004/
Hope this is helpful for the first time users of Linux.
I am involving myself in reading book these days rather than reading blogs. Here are 2 free e-books, one from Microsoft Press with a valuable insights on Cloud, Fundamental of Azure
and the other from Telerik, The Developer's Guide
To The New .NET. I encourage you to read both the books, but if you are not about cloud then you should read the book from Telerik.
Microsoft Press - Fundamentals of Azure (Download)
The “Microsoft Azure Essentials” series helps you advance your technical skills with Microsoft Azure. “Microsoft Azure Essentials: Fundamentals of Azure” introduces developers and IT professionals to the wide range of capabilities in Azure. The authors—both Microsoft MVPs in Azure—present conceptual and how-to content for seven key areas and describe management tools and business cases.
Telerik - The Developer’s Guide To The New .NET (Download)
From Telerik
This ebook is no fluff–just a developer-to-developer breakdown of what’s in store for .NET in 2015. Included are code snippets and step-by-step tutorials on handy new features and techniques.
Download for free, and learn more about:
It is fun working with Generics, but sometimes it just won’t work as I intended it to work. While working on a personal project, I was trying to write the code as generic as possible so I can re-use the functions or extension methods in my other projects as well. But it is not always the case, things will not always work as you want it to be. Here is the case of what I was trying to do.
I am working extensively on JSON in this project, so I thought of creating an extension method for the classes I want to serialize to JSON and save it to the file system. Creating the extension method was not a problem, but it turned out to my surprise that I just can’t use the extension method on type T. If I would have paid attention to the detail here before writing the function, I would have noticed the problem. Before I tell you what I did here, here is the extension method which will serialize class to JSON string.
public static string ToJSON<T>(this T Entity) where T : class { return JsonConvert.SerializeObject(Entity); }
As I want only classes to be serialize, I have a constraint in place that assure me that this extension method should be used when the T is of type Class. I agree with the fact the creating an extension method just for a simple work is an over kill but I am just lazy about writing this line again and again. The application I am working on can support multiple databases and for that I am using Dependency Injection (DI). I wrote this function keeping in mind that I just have to pass the model name i.e. class object and this function will then save the JSON string from the serialized class to the file system.
public bool Save<T>(T Entity, string Path) where T : class { bool IsSaved = false; try { if (!Path.IsNullOrEmpty()) { File.AppendAllText(Path, Entity.ToJSON()); IsSaved = true; } return IsSaved; } catch (Exception x) { throw x; } }
The above code will not compile. This is because, there is no way for the compiler to know the type of Entity
object we are passing. The constraints has nothing to do with it. It is just the compiler who has to know what kind of type it is dealing with. In this case we have a type T which is not resolved at compile time and hence the ToJSON()
extension method I am using above, is an assumption from my part that Entity
is a class, is not going to work. The important point here is that T is going to resolve at runtime and before that if we try to use the extension method (meant only for class) on type T, the intellisense will never show the ToJSON()
extension method in the list.
Now to overcome this problem, we have to make some changes to the above code in order to have the information which the compiler can use and allow us to make use of the ToJSON()extension method. As there is a constraint in place for this function which will only allow us to pass class object as a first parameter, but the case is still the same. The Save
function will never know what is the actual type of the Entity
. Therefore we can use the Entity object and get the name of the Class like so.
string className = Entity.GetType().Name;
This gives us the name of the class and now we can use it to get the actual type of T and convert it to that type (which will be class). Once we have a class we can then use our ToJSON() extension method. Here is the updated code.
public bool Save<T>(T Entity, string Path) where T : class { bool IsSaved = false; try { if (!Path.IsNullOrEmpty()) { if (Entity.GetType().Name == "Board") File.AppendAllText(Path, Convert.ChangeType(Entity, typeof(Board)).ToJSON()); else if (Entity.GetType().Name == "Story") File.AppendAllText(Path, Convert.ChangeType(Entity, typeof(Story)).ToJSON()); IsSaved = true; } return IsSaved; } catch (Exception x) { throw x; } }
This code will compile and saves the JSON string to the specified path on execution. Notice the Convert.ChangeType
function. It’s simple function which you can use to convert one type to your desired type. The only drawback here will be that you have to come here and update the function whenever you have a type of class added in the project which you want to serialize to JSON. The code is still pretty sleek according to me for the type of task I am trying to accomplish.
The type T is very useful, but sometimes it may not solve all your problem.