Elsys (in Bulgarian TUES) is a technology school in Sofia. It is a subsidiary of Technical University of Sofia and this week they've celebrated their 25th anniversary. Elsys is not an ordinary school, they teach computer science to these young kids. And they do it pretty damn well. At the moment it's the best school to study IT (software, hardware, networks) in the country, contrary to what TU Sofia has become :(.
As one of the school sponsors I met lots of the students and want to show everyone else what they are doing. I have no doubts we will be hearing more about them in the future.
So these boys and girls make robots. I was there when the first image was taken. It was this week in Thursday, April 25th at an educational fair. All visitors were fascinated by the robots and stopped by to watch and play with them. I personally wanted to see and play with the quadcopter shown above but it was not available that day.
While I was there, a guy approached the kids and said his company wants to fund development of another quadcopter. He wanted a bigger one, which is able to carry equipment for aerial photographs.
What shook me was that this is a rare occasion where a local business wants to fund R&D activities. Not to mentions these are school boys, not university students or research fellows where this is more common. And this happened days after the news about the quadcopter has been released in the social media.
Elsys also teaches Arduino classes where students play with home made robots. I personally have attended a robots competition held in the school where these small robots compete and sometimes fight with one another.
Did I mention they take part in First Lego League too? Just see the photos.
When not making robots students from Elsys hack open source and as it happened, one of them won the grand prize in Google Code-In 2012 (article in Bulgarian). For the last few years kids from Elsys are taking part in Google Code-In and according to the school website they've made $7300 from Google :). Over 40 boys and girls took part in the first edition of Google Code-In. That's 10% of all participants.
I'm sure Google and others were impressed by the fact so many good developers are coming from a single school. Aren't you?
Yup, they have this too! Elsys teams have won top honors at 6 of the last 8 BANA-sponsored National Networking Competitions. Cisco themselves wrote an article about Elsys.
As I said I'm a school sponsor. Probably the smallest one. If you want to help these kids and their school just let me know. I will put you in touch with the principal.
Alternatively you can donate your time and knowledge and start teaching an interesting class at school!
Or you can donate high quality IT books if you have such. Anything helps.
There are comments.
Image CC-BY, Robert Scoble
Have you ever been a victim of credit card fraud? Meet yours truly! Achievement unlocked! As a hacker I'm more careful when shopping online compared to ordinary people and still my card was misused.
Right after opening business hours I was awaken by a phone call from my bank. They alerted me about a 6$ payment for a hotel reservation, which obviously I didn't make. The payment in question was made yesterday, April 25th. Ten minutes later I got another call telling me about more transactions, some successful ones. One in particular - a train ticket for nearly 250 EUR. My card was blocked immediately! The nice thing is that the bank clerk agreed to express issue a new card. Not without some help from my internal connections at the central office I got my fresh card before closing hours this evening. The ink on the paper slip was still wet, literary.
What will happen next is that they will charge me the successful transactions (not big amount) and later I have to file a claim for refund. That will take around a week I suppose. I've filed such claims before and things usually work well for the customer (the case was incorrect merchant though).
Honestly I have no idea and will probably never find out. But as I said I take precautions:
In addition the card in question was mostly used for cloud service subscriptions like Amazon Web Services and Google Apps. I have used it a few times for other things like plane tickets or travel reservations but nothing fishy.
The same card I've used rarely at physical ATM or POS terminal (once a year probably).
I'd like to use this unfortunate event to raise the topic and awareness among my readers. I wish you never experience this. Forget the money side of things, it's a pain in the ass to deal with this.
If you happen to on the victim side please share your story. Have things worked in your favor or not?
The picture above shows a new credit card concept. Per the author:
Kudelski and Mastercard are showing me the credit card of the future. This model can generate a new passcode on the fly, so if your card's number gets copied it won't be able to generate the right passcode.
If you have more insight on the credit card industry please share with us!
There are comments.
In this article I will show you how to deploy hotfix versions for Python packages on the RedHat OpenShift PaaS cloud.
You are already running a Python application on your OpenShift instance. You are using some 3rd party dependencies when you find a bug in one of them. You go forward, fix the bug and submit a pull request. You don't want to wait for upstream to release a new version but rather build a hotfix package yourself and deploy to production immediately.
There are two basic approaches to solving this problem:
I will talk about the later. The tricky part here is to instruct the cloud environment to use your package (including the proper location) and not upstream or their local mirror.
Python applications hosted at OpenShift don't support
requirements.txt
which can point to various package sources and even install
packages directly from GitHub. They support setup.py
which fetches packages
from http://pypi.python.org but it is flexible enough to support other locations.
First of all we'd like to build a hotfix package. This will be the upstream version that we are currently using plus the patch for our critical issue:
$ wget https://pypi.python.org/packages/source/p/python-magic/python-magic-0.4.3.tar.gz
$ tar -xzvf python-magic-0.4.3.tar.gz
$ cd python-magic-0.4.3
$ curl https://github.com/ahupp/python-magic/pull/31.patch | patch
Verify the patch has been applied correctly and then modify setup.py
to
increase the version string. In this case I will set it to version='0.4.3.1'
.
Then build the new package using python setup.py sdist
and upload it to a web server.
Modify setup.py
and specify the hotfix version. Because this version is not on PyPI
and will not be on OpenShift's local mirror you need to provide the location where it can
be found. This is done with the dependency_links
parameter to setup()
. Here's how it looks:
diff --git a/setup.py b/setup.py
index c6e837c..2daa2a9 100644
--- a/setup.py
+++ b/setup.py
@@ -6,5 +6,6 @@ setup(name='YourAppName',
author='Your Name',
author_email='example@example.com',
url='http://www.python.org/sigs/distutils-sig/',
- install_requires=['python-magic==0.4.3'],
+ dependency_links=['https://s3.amazonaws.com/atodorov/blog/python-magic-0.4.3.1.tar.gz'],
+ install_requires=['python-magic==0.4.3.1'],
)
Now just git push to OpenShift and observe the console output:
remote: Processing dependencies for YourAppName==1.0
remote: Searching for python-magic==0.4.3.1
remote: Best match: python-magic 0.4.3.1
remote: Downloading https://s3.amazonaws.com/atodorov/blog/python-magic-0.4.3.1.tar.gz
remote: Processing python-magic-0.4.3.1.tar.gz
remote: Running python-magic-0.4.3.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-ZRVMBg/python-magic-0.4.3.1/egg-dist-tmp-R_Nxie
remote: zip_safe flag not set; analyzing archive contents...
remote: Removing python-magic 0.4.3 from easy-install.pth file
remote: Adding python-magic 0.4.3.1 to easy-install.pth file
Congratulations! Your hotfix package has just been deployed.
This approach should work for other cloud providers and other programming languages as well. Let me know if you have any experience with that.
There are comments.
Deed is an action-provoking platform for challenging yourself and others and also a business solution for improved engagement by the corresponding communities. It solves the problem of passivity by converting people who “Like” to people who “Act. The challenge format gives businesses an effective, fresh and low-cost solution to maintain active connection with their communities and measure engagement.
Emil Stoychev explains their technical background.
Deed is built around Microsoft technologies plus some open source libraries.
Their web application and API is built with ASP.NET MVC 3 using MS SQL 2008 database engine. Deed is hosted on a single cloud server at Rackspace and uses Akamai CDN for static files distribution. At the moment the team is testing Windows Azure cloud platform and plans migrating there.
A native Windows Phone application also exists.
Lots of JavaScript and CSS frameworks come to play at the web interface layer like jQuery, Handlebars for templates and Less CSS.
IDE of choice is Microsoft Visual Studio 2012 for C# and Vim for everything else. Source code revision control is managed with Mercurial and build scripts are written in Python.
The Deed team had experience with Microsoft technologies initially so it was natural for us to choose this stack. While not perfect and costly in terms of hosting fees, it serves its purpose for the moment. When you start a new project and you want to get up and running fast your best choice is to use what you already mastered. That in our case was the Microsoft stack.
Emil Stoychev
Indeed I strongly support this! Always use technologies you are a master at and change and adapt along the way if necessary.
If you’d like to hear more from Deed please comment below. I will ask them to follow this thread and reply to your questions.
There are comments.
It's Friday - five days after the first HackFMI event was held. I have some interesting statistics derived from the source code of all projects. Read on!
I've used Ohloh to analyze the source code of all projects. A simple Ohloh project called HackFMI 2013 enlists and tracks 18 different repositories as if they were one big project. Not all teams had repositories and some didn't sent information back to me although I asked them. Two projects sent me tarballs with their code, which I've pushed to GitHub for the purpose of tracking stats.
Be aware however that Ohloh is known to produce inaccurate statistics for projects with lots of code and short development history. Furthermore its COCOMO calculations are wrong as well due to duplicate code, not written during the hackathon such as jQuery or PHP libraries.
During the weekend sprint 759,453 lines of code were written by 56 contributors spread across 768 commits.
From the top 10 contributors 5 had Python as their primary language. Which is to say Python developers have good development practices with Git.
None of the contributors (excluding myself) were recognized by Ohloh, meaning either they have not contributed to any other open source project or their contributors were not under their name or they've used a different name/email combination. Whatever the case go claim your contributions and track your kudos rank across the open source community.
19 different programming languages were used.
The most popular ones are XML, JavaScript, HTML, PHP, CSS and ActionScript. This is nearly 97% of the source code. All the rest languages have been used under 1% per language. The languages used are pretty standard and expected.
The estimated development cost is 205 person-years valued at $ 11,251,680. This is too high because of all duplicated libraries and extra files tracked.
Ohloh allows files and directories to be excluded on per-repository basis. I'd appreciate your help if you preview the projects and create the exclusion rules. Thanks!
The stats and repositories are public. If you manage to extract other interesting details don't hesitate to share them in the comments.
There are comments.
The Bulgarian translators team behind Khan Academy asked for help some time ago on a local mailing list. I promised to help but had nearly forgotten about that. The guys are no developers, they simply wanted a script which will give them information if a particular video has Bulgarian subtitles and the completion percentage.
They gave me a spread sheet file with a list of video URLs (3000 + of them). Using Python's BeautifulSoup module I hacked a small script to produce the desired output. Everything can be found at https://github.com/atodorov/Khan-Academy-Find-Subtitles.
The script is very fresh, just run it today against the given input and produced some results. Lots of the URLs were skipped, around 500 entries produced results, 100 more failed. I have no idea what happened to the rest.
This is an ideal side project for students (I'm looking at you #HackFMI participants) which will teach you something about screen scraping and extracting data from the web. It will also boost your karma by helping a project which lacks developers but is open source in nature.
If you have some Python skills and would like to help please ping me as I may not have the time to maintain this project in the long term.
There are comments.
The first HackFMI event is now over :(. It was HUGE! Kudos to the organizers, sponsors, mentors and all teams who took part and worked hard during the weekend.
More than 100 people participated. There were 22 different teams presenting at the finale yesterday evening. That in my opinion counts as a BIG success. I was surprised to see so many people, lots of them first and second year at the university. There were a good number of female hackers too, which I also didn't expect. DISCLAIMER: I've graduated a different university where the culture and male/female ratio was different so my expectations were biased.
People had interesting ideas and were passionate about them. They set off hacking on a big scale. At times they wanted to create too big of an application and had to cut off some features due to time constraints.
Congrats to all of them and hopefully they continue hacking!
I wasn't able to talk to all the teams nor stay at the event full time but here is how I saw things.
Organization was perfect. The best organized non-commercial local event I've seen in years. There was food, beverages, T-shirts, even beer :). There were six big IT companies sponsoring the event. All of these are successful Bulgarian born companies. Let that serve as an example!
The faculty was supporting the event too. There were API and SQL dump for the teams to use. The entire building was open during the weekend and during the night. Teams were able to make use of many rooms. From what I know some of the successful ideas will be implemented into the faculty administration as well. All of this is a first time and quite unexpected for a Bulgarian university. I smell the wind of change already.
My technology view of the event is limited to the teams I've mentored explicitly and the ones I happened to walk by and interfere with. Naturally I gravitated around 4 teams using Django and found two teams using PHP.
Django guys were doing well despite one of the teams not having any experience with it. Most of the applications were such that didn't require extensive knowledge of Django internals but require mere programming of all features they wanted to implement.
What stroked me is that folks were making their database models too complicated. I stumbled across two use cases in different teams where they wanted to have one to many or many to many relationships. I strongly advised against this. Hopefully they will remember.
Django makes schema design a child's play and probably this is why lots of people abuse and misuse that. My advise is keep the database as simple as possible and move everything up the application layer. It's easier to change and to maintain that way. Not to mention experienced DBAs are hard to find.
Keep the DB simple and know your tools well!
With PHP the case was pretty much the same. Guys had some extra fields in their DB schema which were unnecessary. They also wanted to abuse the data types of the DB and not use native types.
All of these technological misunderstandings are coming from inexperience, I know. To get a closer look at why it is important to have a simple schema look at: Disqus: Scaling the World’s Largest Django Application
During one of the breaks I was outside and one of the mentors complained that ideas were pretty much standard. No screen scraping for additional information, no mashing up, no revolutionary ideas. Everybody was using the provided API and SQL dumps. Well almost.
One of my favorite teams set off to write a PHP robot which will automatically login and extract information from SUSI (the faculty information system). Unfortunately that didn't work so they had to abandon it. They didn't known Selenium and there was not enough time to try and hack some browser side extension which will do the trick but they promised to try it.
Because of their unorthodox approach from the start they became my personal favorites and received Red Hat swag from me.
Adrian and Vihren are Team Six!
I didn't like the fact that there was lots of duplicate work and ideas. Only one team built a mobile application based on API and services provided by another team.
I suggest there's a #hackfmi IRC channel next time so that people can communicate with each other and focus on building great apps not reinventing the wheel. Use IRC, you are hackers!
What I was missing is that nobody proposed a pure cloud or big data application. I don't know if there was enough data provided by the faculty for such kind of ideas, probably there wasn't. Maybe next time there will be.
While not participating actively except for a few hours of mentoring I found a way to contribute. Many of the projects repositories are listed under https://www.ohloh.net/p/hackfmi2013 which provides some interesting insight and stats.
The list is incomplete. Lots of teams didn't have any GitHub repos or didn't push the code recently. I will be contacting all of them in the next few days and hopefully we will have a more accurate statistics by the end of the week. Expect a separate blog post about it.
If you missed this event you should be sorry. You were warned! If you attended please share your experience with me. What you liked, what you didn't.
There are comments.
On a Red Hat Enterprise Linux or Fedora (or compatible) system execute
$ vim example.spec
This will create a new file with all the important sections and fields
already there. The template used is /usr/share/vim/vimfiles/template.spec
and is part of the vim-common RPM package.
This is very useful trick which I didn't know. Until now I always used the spec files from previously built packages when creating new RPMs. This wasn't as fast as creating a template and filling in the blanks.
For a detailed description about recommended RPM build practices see the Fedora Packaging Guidelines.
There are comments.
MaistorPlus solves the common problem of finding a reliable builder or handyman. An online platform that brings master craftsmen and homeowners together.
The process is really easy. Homeowners post jobs on the website and receive offers from relevant tradesmen. After the job is done homeowners leave feedback and recommendations. With this feature homeowners can compare tradesmen profiles, offers and ratings and confidently choose who they want to hire.
The team is also runner up at the Start IT Smart 3Challenge. Boris Sanchez shared their technical mojo.
Main technologies used are PHP, Symfony 2.1 and PostgreSQL.
MaistorPlus is a traditional web platform developed with the Symfony framework. Web pages are rendered by Twig - a straightforward, flexible and easy to extend templating engine, which is integrated into the Symfony framework by default and works server-side with PHP in order to generate dynamic content, based on data stored in the database. Web pages also use jQuery and Sizzle.js and feature modern graphics. Everything is beautifully styled with CSS.
The original development team already had experience with Symfony, Zend, Spring and some other web application development frameworks. We opted for Symfony for two main reasons. First, Symfony is constantly improving, and has a strong and continuously growing community that offers 3rd party add-on components for free. Second, PHP is a bit easier to "learn as you go" then Java. The members of our design team didn't have a lot of prior programming experience, so we wanted to make sure we set a low barrier of entry for them, as we didn't have the enough development staff to have a distinct separation between design creation and design integration in our team.
For the initial prototype we used the MySQL database management system. After a while we wanted to add spatial features to the business logic, and discovered that MySQL does not have proper support for spatial indexing. We therefore decided to migrate to PostgreSQL, which supports spatial data with add-ons like PostGIS.
Boris Sanchez
MaistorPlus is going to organize a Beta Testing next month. You are welcome to subscribe to their monthly newsletter or follow them on Facebook / Twitter.
If you’d like to hear more from MaistorPlus please comment below. I will ask them to follow this thread and reply to your questions.
There are comments.
In case you are wondering how to use Django's built-in template tags and filters in your source code, not inside a template here is how:
>>> from django.template.defaultfilters import *
>>> filesizeformat(1024)
u'1.0 KB'
>>> filesizeformat(1020)
u'1020 bytes'
>>> filesizeformat(102412354)
u'97.7 MB'
>>>
All built-ins live in pythonX.Y/site-packages/django/template/defaultfilters.py
.
There are comments.
Did you ever have to re-purpose a column in your database schema? Here's a quick and easy way to do this if you happen to be using Django.
I had an integer field in my model called lines
which counted the lines of
code in a particular tar.gz package. I figured the file size is a better indicator
so decided to start using it. I was not planning to use the old field anymore and
I didn't care about the data it was holding. So I decided to re-purpose it
as the size
field.
Looking around I figured several different ways to do this:
lines
field and keep referencing the old name in the code.
This is no-brainer but feels awkward and is a disaster waiting to happen;size
field and remove the old lines
field. This involves modification to
the DB schema and requires at least a backup with possible down time. Not something
I will jump at right away;size
property in the model class which will persist to self.lines
.
This is a quick way to go but I'm not sure if one can use the property with the
Django QuerySet API (objects.filter(), objects.update(), etc.) I suspect not.
If you don't filter by the property or use it in bulk operations this method is fine though;size
but continue to use the lines
DB column;
Mind my wording here :);I decided to go for option 4 above:
change the field name to size
but continue to use the lines
DB column.
diff --git a/models.py b/models.py
index e06d2b2..18cad6f 100644
--- a/models.py
+++ b/models.py
@@ -667,7 +667,7 @@ class Package(models.Model):
- lines = models.IntegerField(default=None, null=True, blank=True)
+ size = models.IntegerField(default=None, null=True, blank=True, db_column='lines')
lines
from the code except the model class. This served as clean up as well. size
but continued using the lines
DB column as shown above.
Django's db_column option makes this possible.size
to None (NULL) for all objects;size
field.The entire process happened for under 10 minutes. I will also opt for renaming the DB column at a later time. This is to sync the naming used in Python code and in MySQL in case I ever need to use raw SQL or anything but Django.
If you were me, how would you do this? Please share in the comments below.
There are comments.
I have accumulated some items which I don't need or will not use anymore. Some of them I am willing to give away while others can be borrowed for a while.
Rules Of Engagement
prefix
. It is self explanatory;taken by Geno Rouspky
, give-away
- The Art of Community: Building the New Age of Participation
(
Amazon |
O'Reilly
)taken by Стилиян Стефанов
, give-away
- 97 Things Every Software Architect Should Know
(
Amazon |
O'Reilly
)taken by Стилиян Стефанов
, give-away
- 97 Things Every Project Manager Should Know
(
Amazon |
O'Reilly
) - Barbee Davisborrow
- The Art of Unit Testing: With Examples in .Net - Roy Osheroveborrow
- The Gentlemen's Clubs of London - Anthony Lejeune, 1984 editiongiven to Lyubomir Petkov
, borrow
- Technical Blogging: Turn Your Expertise into a Remarkable Online Presence
(
Amazon |
O'Reilly
)borrow
- Open Government: Collaboration, Transparency, and Participation in Practice
(
Amazon
|
O'Reilly
) - Daniel Lathropborrow
- The Very Small Home: Japanese Ideas for Living Well in Limited Space - Azby Brownborrow
- How to Live in Small Spaces: Design, Furnishing, Decoration and Detail for the Smaller Home - Terrence Conranborrow
- Small Apartmentsborrow
- 500 Ideas for Small Spacesdonated to
http://podaretekniga.org, borrow
- Small Housesdonated to
http://podaretekniga.org, borrow
- Small Eco-Housestaken by
Vladimir Vassilev, reserved by Живко Георгиев
, give-away
- Изкуството на измамата - Кевин Митникreserved by Симеон
, give-away
-
Нацията новатор - разказ за израелското икономическо чудо -
Дан Сенор, Сол Сингърtaken by Даниела Бояджиева
, give-away
-
Тръмп: Мисли като милиардер - Доналд Тръмп, Мередит Макайвърtaken by unknown
@ UseTogether event, give-away
- Стичането. Пътят към всички култури - Илия Троянов, Ранджит Хоскотеtaken by
Vladimir Vassilev, give-away
-
Как да манипулираме хората - техники за манипулaция и защита от тях -
Игор Зоринtaken by Даниела Бояджиева
, give-away
- Как да убеждаваме - Хари Майлсtaken by Даниела Бояджиева
, give-away
- Успешните презентации - изд. Мениджърtaken by Даниела Бояджиева
, give-away
- Успешните преговори - изд. Мениджърtaken by unknown
@ UseTogether event, give-away
- Метро 2033 - Дмитрий Глуховскиdonated to
http://podaretekniga.org, give-away
- Да научим сами японски език - Братислав Ивановborrow
- Дегустацията, или как да опознаем виното - Неда Продановаgive-away
- Първите в българския интернет - Горица Белогушева, Жюстин ТомсThere are comments.
Ucha.se makes learning fun. It is an online platform, on which pupils and students learn and prepare for school. Pupils learn faster, improve their results and get inspired. The platform allows students to watch videos, take tests, ask questions and share comments. Learning is represented with gamification components like drawings, playful narration, dashboards with the best students, etc. It is available on the web and is extending to mobile. Ucha.se is well recognized by the parents and teachers in Bulgaria. In November 2012 Ucha.se was awarded as the best website in Bulgaria in the field of Education and Science.
Nikolay Zheynov is leading the IT team which maintains and expands the web platform. He shared with me some of the internals.
Main technologies used are PHP, MySQL, Nginx, jQuery and jQueryUI.
Server-side development is done with PHP 5. The main reason for choosing PHP is that the IT team working on the platform had long experience with the language. Ucha.se has developed their own PHP framework which is constantly expanding. This allows flexible programming and easier application maintenance. Nginx is the web server of choice.
MySQL 5 is used for the database because PHP + MySQL is like bread and butter. While the site usage was growing the team had to optimize their DB layer and switched from MyISAM storage engine to InnoDB.
On the client-side standard web technologies are used - HTML5, CSS3 and JavaScript. The main goal when doing the website design was to match expectation from different user groups - pupils, teachers, parents and students. jQuery and jQueryUI are widely used on the client side.
True to our agile approach to incrementally enhance the product and the technology that goes along with it, we strongly believe in the scaling on demand practices. Ucha.se's own framework reflects exactly to that. It allows us to meet our growing user demands and provides at the same time, the dev-team with enough flexibility to quickly react on new business opportunities and technological (r)evolutions.
Nikolay Zheynov
If you’d like to hear more from Ucha.se please comment below. I will ask them to follow this thread and reply to your questions.
There are comments.
Once you've been into Quality Assurance for 5+ years you start to notice bugs everywhere and develop a sixth sense for it. Today I found a bug in my Liebherr KBGB 3864 refrigerator, caused by what looks like a race-condition.
This appliance starts beeping in case the door is left open for more than 60 seconds. The alarm stops if door is closed or can be muted manually while the door is still open.
It happened so that I had the door open for nearly one minute and as it was closing I heard a beep. This time however the beeping didn't stop after the door had closed. The alarm continued beeping with the door closed so I tried to re-open and close it again. It didn't stop! I had to open the door and manually mute the alarm for it to stop.
While not entirely sure, I think the reason for this malfunction was a race-condition. The alarm went on at nearly the same time when the controlling timer should have gone off (when closing the door).
I tried reproducing several times afterwards by opening and closing the door at the last possible moment. I used a stop-watch to time my actions. However I wasn't able to reproduce twice. Every time I tried, there was only one single beep as the door was closing and no more.
I guess then, like we say in QE, WORKS FOR ME!
There are comments.
I am starting a new section called What Runs Your Start-up where I will write about the technologies running behind some interesting start-up companies and why they made their technological choices. The articles will be short and to the point. Interested readers can engage in discussion with start-up owners in the comments later.
I am starting with a dozen companies from the Bulgarian start-up eco-system and will present one or two start-ups per week. If you'd like to read about a company which is not listed here or want to promote your own just let me know.
There are comments.
Useful at Night is a mobile guide for nightlife empowering real time discovery of cool locations, allowing nightlife players to identify opinion leaders. Through geo-location and data aggregation capabilities, the application allows useful exploration of cities, places and parties.
Evelin Velev was kind enough to share what technologies his team uses to run their star-up.
Main technologies used are Node.js, HTML 5 and NoSQL.
Back-end application servers are written in Node.js and hosted at Heroku, coupled with RedisToGo for caching and CouchDB served by Cloudant for storage.
Their mobile front-end supports both iOS and Android platforms and is built using HTML5 and a homemade UI framework called RAPID. There are some native parts developed in Objective-C and Java respectively.
In addition Useful at Night uses MongoDB for metrics data with a custom metrics solution written in Node.js; Amazon S3 for storing different assets; and a custom storage solution called Divan (simple CouchDB like).
We chose Node.js for our application servers, because it enables us to build efficient distributed systems while sharing significant amounts of code between client and server. Things get really interesting when you couple Node.js with Redis for data structure sharing and message passing, as the two technologies play very well together.
We chose CouchDB as our main back-end because it is the most schema-less data-store that supports secondary indexing. Once you get fluent with its map-reduce views, you can compute an index out of practically anything. For comparison, even MongoDB requires that you design your documents as to enable certain indexing patterns. Put otherwise, we'd say CouchDB is a data-store that enables truly lean engineering - we have never had to re-bake or migrate our data since day one, while we're constantly experimenting with new ways to index, aggregate and query it.
We chose HTML5 as our front-end technology, because it's cross-platform and because we believe it's ... almost ready. Things are still really problematic on Android, but iOS boasts a gorgeous web presentation platform, and Windows 8 is also joining the game with a very good web engine. Obviously we're constantly running into issues and limitations, mostly related to the unfortunate fact that in spite of some recent developments, a web app is still mostly single threaded. However, we're getting there, and we're proud to say we're running a pretty graphically complex hybrid app with near-native GUI performance on the iPhone 4S and above.
If you'd like to hear more from Useful at Night please comment below. I will ask them to follow this thread and reply to your questions.
There are comments.
In the open source world forking is a common concept, largely endorsed by GitHub's fork & pull requests work-flow. Forking a large and successful project and creating a new one, with its own eco-system is rare though.
Recently I came across the MATE desktop environment which is a fork of GNOME 2. Even more interesting is that they forked lots of standard GNOME applications as well. Being behind the world's leading enterprise OS where maintaining a private fork is sometimes necessary I wondered why MATE had to do this.
Here are some interesting responses from mate-dev:
Well, MATE is born in a time of fear, so Perberos forked almost all GNOME 2 applications. Currently, we are dropping a lot of packages to focus our effort on what we need really.
...
The main reason of this is to have a base set of apps in GTK 2. Another reason, most GNOME apps (like Evince) are suffering mockups that dont follow the traditional idea of MATE.
When MATE will be GTK3, we'll consider again if keeping or not such applications.
Stefano Karapetsas http://ml.mate-desktop.org/pipermail/mate-dev/2013-March/000091.html
A similar question was also asked not long after the MATE forum was created, which was probably somewhere early in 2012. Steve Zesch answered that we would be sure that we wouldn't be affected by feature/UI choices of the GNOME developers, which we would have been if MATE relied on GNOME 3 applications. He used Caja as an example. Caja looked -of course- similar to Nautilus. It had some features Nautilus 3 didn't, but the reverse was true as well. Nautilus 3 looked better, though, so it was not very surprising that we got (and get) this question. But Steve's example of Caja turned out to be pretty much spot on, when Nautilus 3.6 was released, and almost all of the changes were removed features (it was even described by a former GNOME developer as 'vandalism'). Canonical decided to use 3.4 for Ubuntu 12.10, although the original plan was to include 3.6. Linux Mint forked 3.4 as Nemo.
And there's no good reason for this, as far as I can see. The interfaces of Gnome have always been simple enough not to be overwhelming for novice users, but at the same time powerful enough for the power users. Which is a fine - and rare - balance. They completely messed it up in Gnome 3.
...
So although Gedit, Evince and GNOME Terminal are fine now, I doubt it's safe to assume they will stay that way. Especially since we've already seen what happened to the fallback mode of Gnome 3 (completely removed, although many people use it and Ubuntu's Unity depends on it) and Nautilus (vandalised).
...
Well, ok, that was a big rant. But to summarise my post (and Stefano's): it was a decision that had to be taken quickly, and from the integration and control viewpoint, it seems like was a good idea after all. Especially now many deprecated underlying technologies have been replaced.
Michael Steenbeek http://ml.mate-desktop.org/pipermail/mate-dev/2013-March/000092.html
Well, when two teams are maintaining applications with very little differences, that can be considered a waste of time and effort. It was very easy to say about the MATE applications as well, before we knew what GNOME would do to its applications. Now GNOME is removing more and more features from its applications and changing their GUI to a tablet interface, it turned to be the right decision.
Michael Steenbeek http://ml.mate-desktop.org/pipermail/mate-dev/2013-March/000095.html
There are comments.
Not all innovation needs to come out of Silicon Valley!
I've just watched Silicon Prairie (download for free or as much as you can afford). Last fall, a team of journalists and activists joined reddit's Internet 2012 Bus Tour and traveled from Denver, CO to Danville, KY to capture the Internet’s role in the US Midwest's growing Silicon Prairie. Nimblebot, a digital agency, shot and produced a mini-documentary showcasing the journey. I particularly liked several companies listed below.
AgLocal connects quality meat producers with high-margin buyers. This can work very well in Bulgaria. Most food and agriculture producers in the country are small and mid-sized farms who struggle to sell their produce or work with middlemen for a low margin. On the other hand there are more and more people, especially in big cities who would like to pay for locally produced food but don't know where to buy it from or don't have the time to visit a farm to buy it (like myself). Last but not least what big supermarket chains sell is simply too expensive and crappy.
As far as I know there are several attempts at such kind of companies/organizations here but they are small and not widely popular.
Homes For Hackers in Kansas City is offering 3 months of rent-free, Google Fiber-connected start-up space to entrepreneurs. I have already heard several people discussing similar ideas in Bulgaria, mostly because cost of living here, hence cost of failure is very low. I wish them good luck.
SparkFun is an online retail store that sells the bits and pieces to make your electronics projects possible. According to the movie they create open source hardware and even shipped to Antarctica which is cool.
Once again this business model can work in Bulgaria. We had lots of electronics produce back in the past and still have. There is still talented people in this area who will be looking for a job if their companies close shop due to Chinese competition.
Watch the movie and tell me which ones you like ? Do you think Bulgaria can have its Silicon areas outside Sofia Valley ?
There are comments.
Hackathons have been organized in Sofia and generally through Bulgaria for the past several years but as far as I know they were mostly underground events. There are two upcoming events which are somewhat different.
Organized by INSTITUTE FOR PUBLIC ENVIRONMENT DEVELOPMENT this hackathon is the first I know of, which will focus on government provided data. The objective is to process data (sample) from the 2011 elections and find persons who were able to vote in the last minute, between 20:00-21:00 hours thus changing the election results by 20% in their voting section.
The event starts at 09:29 on 30th Mar 2013 @ betahaus Sofia. More info in Bulgarian here and here.
I'd love to attend but will be visiting a conference about mobile devices in another town at the same time :(. If you do attend, let me know how fun it was.
Dare to read more on the topic about open government? I recommend starting with Open Government: Collaboration, Transparency, and Participation in Practice by Daniel Lathrop and Laurel Ruma ( Amazon | O'Reilly ). This is an excellent book with tons of examples and easy to read.
FMI stands for Faculty of Mathematics and Informatics at the Sofia University (not where I graduated). It's one of the best, arguably the best, places to study for an IT career. Like most other universities in Bulgaria its administration and processes suck big time!
HackFMI is the first ever hackathon which will focus on students improving faculty/university systems and processes. This is HUGE! As far as I know it is also the first hackathon which is supported by academia.
I have already volunteered to be a mentor at HackFMI. I am looking forward to this. It will be fun. See you there!
There are comments.
How do you order Django QuerySet results so that first item is the
exact match if using contains
or icontains
? Both solutions were proposed on the
django-users
mailing list.
Solution by Tom Evans, example is mine:
>>> from django.db.models import Q
>>> Package.objects.filter(
Q(name=Django) | Q(name__icontains=Django)
).extra(
select={'match' : 'name = "Django"'}
).order_by('-match', 'name')
[<Package: Django>, <Package: appomatic_django_cms>, <Package: appomatic_django_filer>,
<Package: appomatic_django_vcs>, <Package: BabelDjango>, <Package: BDD4Django>,
<Package: blanc-django-admin-skin>, <Package: bootstrap-django-forms>,
<Package: capistrano-django>, <Package: ccnmtldjango>, <Package: collective.django>,
<Package: csdjango.contactform>, <Package: cykooz.djangopaste>,
<Package: cykooz.djangorecipe>, <Package: d51.django.virtualenv.test_runner>,
<Package: django-4store>, <Package: django-503>, <Package: django-absolute>,
<Package: django-abstract-templates>, <Package: django-account>,
'...(remaining elements truncated)...']
>>>
Another one:
I'm not sure this is the right way, but you could drop the Q objects, use only icontains and sort by the length of 'name'
Gabriel https://groups.google.com/d/topic/django-users/OCNmIXrRgag/discussion
>>> packages = [p.name for p in Package.objects.filter(name__icontains='Dancer')]
>>> sorted(packages, key=len)
[u'Dancer', u'Dancer2', u'breakdancer', u'Task::Dancer', u'App::Dancer2', u'Dancer::Routes',
u'DancerX::Routes', u'DancerX::Config', u'Task::DWIM::Dancer', u'Dancer::Plugin::CDN',
u'Dancer::Plugin::Feed', u'Dancer::Plugin::LDAP', u'Dancer::Plugin::Lucy',
'...(remaining elements truncated)...']
>>>
That's all folks. If you have other more interesting sorting needs please comment below. Thanks!
There are comments.