ShutdownGuard featured in PC Welt magazine

May 10th, 2014 No comments

The German magazine PC Welt featured ShutdownGuard in edition 5/2014. Compared to when AltDrag was featured in another german magazine back in 2012, this time there’s good chunk of text in the pages! My only complaint is that they didn’t put my name in there, but otherwise I’m very happy!

What magazine is next?

Google Project Hosting is dead, long live Github

January 16th, 2014 No comments

Yesterday Google Code Project Hosting shut down the ability for projects to add new downloads, just as they announced back in May. The reason they say, is because the “downloads have become a source of abuse”. I have no doubt they were having problems, but this move — basically killing Project Hosting instead of fixing it — shows that they really see no future in the product. I had some trouble with this back in March and a rather unpleasant experience trying to get Google to correct it.

It was perhaps no coincidence that Github less than two months later announced “releases”, finally making it possible to ship binaries to end users (they did have a downloads section for a while, which has since been removed). With this launch, Github is offering a lot more than Google has ever offered with Project Hosting.

Last weekend I spent some time to finally migrate my repositories over to Git and Github. All my repositories on Google were using Subversion, the first VCS that they offered (they now also offer Mercurial and Git). It has been clear for a while now that Git has won the DCVS fight, so this feels very familiar to the days when people were moving from CVS to Subversion.

Github suggests that you use svn2git to migrate from Subversion to Git. The only issue I had with this is that it is impossible to use it to migrate your Project Hosting-specific /wiki directory, and I had a lot of trouble finding a good solution. Finally I stumbled over Google’s instructions on converting your repository from Subversion to Git. What I ended up using is a combination of the two.

Before we move on, I want to mention that you might want to import your /wiki directory as a Github wiki, but in my opinion Github wikis are kinda sucky, as there is no good way to merge between forks. If you prefer this option, continue reading for a bit, but instead of merging your two Git repositories, just push one of them as your project repo and the other one as your wiki repo.

First, use svn2git to transfer everything except your /wiki directory. Your /trunk will become your master branch, /branches will become their own branches and /tags will automatically be tagged. Be sure to build your ~/.svn2git/authors file first, and always run svn2git with the verbose flags, since otherwise you might not see important conversion errors. If your branches and tags are not correctly converted, watch out for this bug.


mkdir altdrag
cd altdrag
svn2git -v http://altdrag.googlecode.com/svn/

Then, use “git svn clone” to transfer your /wiki directory to its own little git repo. Use --no-metadata to get the commit messages in the same format as svn2git.


cd ..
git svn clone http://altdrag.googlecode.com/svn/wiki altdrag.wiki --authors-file=$HOME/.svn2git/authors --no-metadata

Now, to combine your two repositories, you will create a “git subtree” inside the repository that svn2git created. This will magically insert the wiki commits in the repository history, but inside a new /wiki directory.


cd altdrag
git subtree add --prefix=wiki file:///home/recover/altdrag.wiki master

If you get an error running this command, you might have to run these commands first (Ubuntu):


sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s /usr/share/doc/git/contrib/subtree/git-subtree.sh /usr/lib/git-core/git-subtree

Now run “git log” and verify that everything is Ok.

I also decided to rename my tags from the traditional “altdrag-0.1” Subversion syntax to semantic versioning, commonly used with Git.


git tag v0.1 altdrag-0.1
git tag v0.2 altdrag-0.2
...
git tag -d altdrag-0.1 altdrag-0.2 ...

Now you should be all set to push your repository to Github. Create your repo on Github, then add it as a new remote and push everything.


git remote add origin git@github.com:stefansundin/altdrag.git
git push -u origin --all
git push --tags

Now all you have left to do is to move over your binaries to the release tags that were automatically created.

There is one thing that Github is still missing; download counters. Github is targeting the developer community, where the number of stars your repo has is your indicator of how popular your project is, but many of us also build programs intended for ordinary mortals who don’t have Github accounts. I suggest that you build a github.io page that is more user friendly that the Github repository page, and use a JavaScript-based analytic tool to track the number of downloads, and then try to funnel most of your users there.

I will still have to go back to Google Project Hosting from time to time during this transition. I still have lots of issue reports on Project Hosting that I intend to resolve there. And when I release the next version, I have to transfer the feature that checks if a new version has been released to Github.

It feels good to finally move over to Github. Google Project Hosting was fun while it lasted, but I hereby pronounce it dead.

How to get a frame from a private YouTube video

July 3rd, 2013 1 comment

You sometimes follow a link to a YouTube video, but instead of watching a video, you are greeted by this familiar screen.

youtube_private_video

However, there is a trick to get a single frame from the video. The embed player fetches a single frame to display before you press the play button, and it is still available even though the video has been marked private. This is the url to it:

http://i1.ytimg.com/vi/video_id/hqdefault.jpg

If the video was uploaded in 720p or higher, you can use sddefault.jpg to get a higher quality image. From what I can tell, there is no hddefault.jpg. The thumbnails displayed on YouTube are mqdefault.jpg.

Another issue that happens quite frequently is that sometimes videos in my playlists are marked private (usually music). Because YouTube removes the name of the track from my playlist, I have no idea what song it was, and that makes it really difficult to replace. I wish YouTube wouldn’t hide the track name in the playlist, it’s enough that the video is inaccessible.

When a video is blocked due to a copyright infringement, then YouTube sometimes displays part of the title. Not always, though.

hotel_california

If anyone has a consistent trick to get the video title when it’s private or has been deleted, please post in the comments.

Tags: ,

Keeping tabs on new YouTube Live events

May 5th, 2013 No comments

Hello YouTubers.

I’ve been looking for a way to get notified on new YouTube Live events somehow. I’ve been subscribed to the GData feeds for YouTube Live Events since Coachella, but it hasn’t worked that well since it’s not meant to be used directly by a feed reader for humans.

So I decided to code a quick PHP script that converts the feeds to something that is readable in most feed readers, where the entries link directly to the YouTube watch page of the event. As the GData API has four different feeds, featured, upcoming, live_now and recently_broadcasted, my script supports the same:

I find it interesting that the Google I/O keynote has been scheduled already, which will be live in 10 days and 17 hours: watch?v=jpQFnqpETy0. I’ll be there, will you? Let me know. =)

Another interesting thing in Feedly is that the service associates feed articles (the feed link) with likes on social media networks, so you will instantly get a measure on how popular an event is from a glance.

The featured feed only lists the latest 15 events, while the other feeds list 25 events, so some events that have completed may not be updated since they didn’t fit in the results. To fix this a backend service needs to keep tabs on events and check the event’s individual feeds if they have been updated, and so on. But this is only a quick hack and that would be too much work.

I’ve also posted the code for the script as a Github Gist: stefansundin/5519170. Put any suggestions either in the comments here or on the gist.

I hope you guys like it!

P.S. This may not be the time, but I want to add that XML processing sucks in most languages. SAX parsing is a pain and makes for ugly code (and it’s pointless if performance and size is not an issue). JavaScript had a small chance with E4X, but that has been abandoned by all browsers now. Bah. What you usually end up doing in these languages is that you just use regular expressions, which work surprisingly well. D.S.

Tags: ,

Crowdfunding campaign for AltDrag 1.0

April 28th, 2013 No comments

Hi everyone.

One week ago I started a crowdfunding campaign in order to support the development for AltDrag 1.0, along with the release of beta 2. I hope that this crowdfunding campaign will bring new life to the project. It also gives users the opportunity to use their money to vote on the features and bugs they want me to spend the most time on.

I set the goal at $1000, and so far 17 people have pledged $280. At this rate the project should be funded before June 18th (the last day of the campaign). I suspect I might have to do something to keep it on track though, maybe another beta release.

This campaign is an easy way for users to give something back, and it gives them clear incentives to donate. The more people donate, the more time I will be able to spend on AltDrag, the better the next version will become.

Go read the full description at the fundraising site!

Tags: ,