Foursquare and Me

Don't have idea why I'm so addicted with foursquare. It's so fun! Checked-in here, checked-in there and gaining some badges and points, that's all. Actually, nothing positive advantages from it except marked specific location and collecting badges. Even we need to spend charge to make internet connection. But somehow, this badges makes me curious. Here below my foursquare badges collection (I hope, the foursquare owner will provide goods from points replacement or badges - an iPad is a good start :)





















































































Newbie
This is everyone first badge. I was unlocking this badge when I checked-in at BLK Cijantung on June 11, 2011.
Adventurer
After checked into 10 different places, foursquare gave this badge to me. I was at Sierra Cafe & Lounge in Bandung on June 16, 2011 when I had this badge.
Explorer
25 different places to checked-in and this badge is mine. I was at Arena Pekan Raya Jakarta on June 19, 2011 when unlocking it.
Photogenic
I was unlocking this badge after I checked-in at Gramedia Matraman on July 17, 2011. This badge dropped when you found 3 places with a photobooth.
Superstar
The Superstar badge was unlocked when everyone has checked into 50 different venues. I had this July 24, 2011 at Dipo travel when I was in Padang.
Super User
To gain this badge, you need to check-ins 30 places in a month! This means a marked place per day. This badge revealed when I was at Ayam Penyet Pemuda Semarang in Pekanbaru on July 24, 2011.
Bender
4+ nights in a row and I had this badge. I unlocked it on July 26, 2011 at Sultan Mahmud Badaruddin II International Airport (PLM) in Palembang.
JetSetter
5 different airports check-in, and this badge is yours. I was at Sultan Mahmud Badaruddin II International Airport (PLM) in Palembang on July 26, 2011 after my flight from Pekanbaru airport.
Local
I had this badge when I checked-in the same place for 3x in a week. I unlocking it on August 30, 2011 at my sister's house at Villa Besakih Puri Gading in Bekasi, Jawa Barat.
Crunked
Weird badge name but I got it after I checked-in 4 places in one night. I was at Tol Cikampek - Ruas Jati Bening Cawang on August 31, 2011.
Swimmies
Need to check-in 5x near the water. Where is near the water in Jakarta?
Update: I got this badge when I was at Kuta, Bali island on Fri Oct 21, 2011.
Jobs
There's no relation between this badge and your office. This badge actually proud to Steve Jobs, the founder of Apple inc. 3 Apple Store checkins, and this badge is yours.
Update: Finally, this badge revealed when I was at iBox Apple Store, Gandaria City on Sunday Oct 23, 2011.
Ziggy's Wagon
Lunch, dinner or just having snack out-there, don't forget to checked-ins on places signed with food truck pictures. 3 times marked for this badge.
Update: Finally, this badge unclocked when I was at RM Seafood 99 Condet on Nov 10, 2011
Swarm
Checked-in on a place that has marked by other 50+ peoples at the same time is also not an easy jobs. I'd tried several places like Taman Buah Mekarsari, Airports & others super-malls (Cilandak Town Square & Pacific Place) both had failed. My last target is Ancol, just wish me luck to get it.
Update: Suddenly, I got this badge when I entered Soekarno Hatta International Airport on Nov 10, 2011. I found 61 peoples checked in at the same time :)
Overshare
It's all need 10+ checkins in 12 hours. It's mean at least 1 check-in per hour.
Update: Well after shouting 10+ in a day, this badge finally mine! I was unlocking it when I check-in on Macet Semanggi arah Senayan at November 20, 2011. Kinda weird venues name right? I don't fuckin' care heh...
Pizzaiolo
20 different pizza store to cover up this badge. I'm not a pizza connoisseur, but I'm ready to start :)
Update: After last of 5th check-ins at Pizza Hut Kampung Melayu on November 24, 2011, I'd covered up this badge.
Great Outdoors
Checkin 7 times to locations categorized as "Parks and Outdoors" or a subcategory. 7 times for me means 7 years to achieve this badge :)
Update: After check-in at several parks, finally I got this badge. I unlocked it at Manggala Wanabakti Pond and Park (Jakarta) at December 3, 2011.
Warhol
10 different galleries check-ins to have this badge.
Update: Got this badge when I visit Pusat Kerajinan Gerabah Banyumulek, Lombok on December 24, 2011
I'm on a boat!
To get this badge, you need to 3x marking on a boat sign places on foursquare.
Update: Finally revealed this badge after checking-in at Pelabuhan Bangsal, Lombok island on December 26, 2011
School Night
Checking-in on a school after 3 AM and before 6 AM. Get ready for being a burglar.
Update: I got this badge when I check-in Jayakarta Hotels And Resorts Lombok in Lombok at 4.20 AM on December 27, 2011.


That's my 20 badges after all. And I still looking for another below visible badges:













































16 Candles
5x birthday shout-outs containing special words like "Happy Birthday" to reveal this badge.
Douchebag
I don't know where the hell in Indonesia have this place. Anyone know? Tell me :)
Gym Rat
Sounds hard for me to checked-in 10x in one month on gym places. But it challenge me!
Don't Stop Believin'
Checked-in on 3 karaoke places in a month to have this badge. Interesting!
Zoetrope
Only 10 theaters check-in to get this badge. Easy (theoritically)...
Player Please!
It's quite hard to checking-in with 3 members of the opposite sex. I think this my last badge to get :(
Babysitter
10 checkins on playground circuit. Well, I'd like to try...
Super Mayor
Having 10 mayorships at once is not easy for me. At least I'm not a member which often to checked-in the same place without any reason. But I still try to have this badge.
Animal House
Checked-in on 3 place that marked as college student basecamp. Even I had already graduated, well I can checked-in on some of the venues there... (someday)
Ski Bum
Ski area in Jakarta? Yeah, lots of it! But listen, it need to checked-in 7x in a week. It means 1x per day. Almost impossible for me :)


There are exactly total of 35 active badges available on foursquare. And here below the rest of 5 badges that's not visible for me to check-in :( (since it's so far far far far away)

























Trainspotter
Driving around San Fransisco... What? San Fransisco? Forget it!
Brooklyn 4 Life
25+ checkins in... New York? Impossible!
Far Far Away
Don't ever think that you have to checking-in thousands of km between but checked-in on 59th street in Manhattan is absolutely no way for me!
Gossip Girl
It's stated that this badge can only get at certain marked venues in New York or San Fransisco. What a badge!
Socialite
Just the same badge with Gossip Girl :(


So, how about you, guys?

Labels: , , ,

  Post a Comment

OpenID: For Future Authentication?

I don’t have any ideas, why OpenID not too familiar yet since its first existences in May 2005. As one of authentication protocol, OpenID purposed to provide a concise way to authenticated user by only entering owned domain name & dropping password field – in usual manner to support single-sign-on – (of course, user need to be self confirmed at first use in any login page). Some said that basic security protocol used by OpenID is too weak. Perhaps, this makes provider such as PayPal, Yahoo, IBM, VeriSign, Facebook & Google enhancing their own process based on its standard protocol just to make the use of OpenID more secure, but this makes OpenID not kind of universal things.

Based on my experience - by continuing my previous article – with the same topic: Single Account, Multiple Services, here’s my report about generating OpenID on your own domain name – more specific actually - in a Google Apps. You may ignore this article if you have already registering your OpenID in common provider likes ClaimID, MyOpenID, etc, but I’m afraid you’ll lose how to get this things work. And on this current article, I’d covered out.

My experience begun with my curiosity to make my owned domain name as a wide & acceptable OpenID on any login pages that support it. Based on Google API’s, the first thing I need to provide on my www folder was 2 files only; openid & host-meta file. Each of it has structures below:

openid files:
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
<XRD>
<CanonicalID>abc.com</CanonicalID>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<URI>https://www.google.com/a/abc.com/o8/ud?be=o8&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openid.ext1.mode=fetch_request&openid.ext1.type.email=http%3A%2F%2Faxschema.org%2Fcontact%2Femail&openid.ext1.type.country=http%3A%2F%2Faxschema.org%2Fcontact%2Fcountry%2Fhome&openid.ext1.type.language=http%3A%2F%2Faxschema.org%2Fpref%2Flanguage&openid.ext1.type.firstName=http%3A%2F%2Faxschema.org%2FnamePerson%2Ffirst&openid.ext1.type.lastName=http%3A%2F%2Faxschema.org%2FnamePerson%2Flast&openid.ext1.required=email%2Ccountry%2Clanguage%2CfirstName%2ClastName&openid.ns.ext2=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fui%2F1.0&openid.ext2.icon=true</URI>
</Service>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<URI>https://www.google.com/a/abc.com/o8/ud?be=o8&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.mode=checkid_setup&openid.ns.ext1=http%3A%2F%2Fopenid.net%2Fsrv%2Fax%2F1.0&openid.ext1.mode=fetch_request&openid.ext1.type.email=http%3A%2F%2Faxschema.org%2Fcontact%2Femail&openid.ext1.type.country=http%3A%2F%2Faxschema.org%2Fcontact%2Fcountry%2Fhome&openid.ext1.type.language=http%3A%2F%2Faxschema.org%2Fpref%2Flanguage&openid.ext1.type.firstName=http%3A%2F%2Faxschema.org%2FnamePerson%2Ffirst&openid.ext1.type.lastName=http%3A%2F%2Faxschema.org%2FnamePerson%2Flast&openid.ext1.required=email%2Ccountry%2Clanguage%2CfirstName%2ClastName&openid.ns.ext2=http%3A%2F%2Fspecs.openid.net%2Fextensions%2Fui%2F1.0&openid.ext2.icon=true</URI>
</Service>
</XRD>
</xrds:XRDS>


host-meta files:
Link: <https://www.google.com/accounts/o8/site-xrds?hd=abc.com>; rel="describedby http://reltype.google.com/openid/xrd-op"; type="application/xrds+xml"


On both files, don’t forget to replace abc.com with your domain name then upload it on your www directory. Create a directory named by .well-known & move host-meta file in it. As additional, also create (if it doesn’t exist) an index page. In my example, I also copy index.php to index.error.php. You’ll know soon why I created it.

To recognized openid file & adding error 404 forwarder functionality, create (again, if it doesn’t exist) .htaccess file like example below:

.htaccess files:
ErrorDocument 404 /index.error.php
<Files openid>
ForceType application/xrds+xml
</Files>


Now you have the same www directory structure like mine below:



Until this step, you have succeeded creating your own OpenID named with “abc.com/openid”. Test it to a page, let say a blog page. Make a comment & select OpenID identity.



Enter your OpenID “abc.com/openid”. Here below is my example:



Make a preview & submit. Your comment submitted as “openid” which has link to your domain name.



Unfortunately, now we have 2 problems arise: Why if I clicked that link, my browser continues to download this openid file? And why my identity recognized as “openid”? To solve the first problem, change openid file name on www directory to whatever you like. These changes, continues with replacing “openid” with new name on .htaccess file:

ErrorDocument 404 /index.error.php
<Files "what.ever.you.like">
ForceType application/xrds+xml
</Files>


After you changed the name, the structure changes like picture below.



After changed that, try to click again the “openid” link, and tell me what you see? The index page will show replacing downloading file process. This is the reason why we created 404 errors forwarding on .htaccess. Hence, your OpenID also changed from “abc.com/openid” into “abc.com” only. Much simpler, isn’t it?

Anyway, the last problem still unresolved – at least I tried on blogger.com. While I suspect that the blogger OpenID library does not work with Google's (Apps) discovery extensions * is my guess right? *. However, at a time, Google implemented a proof-of-concept implementation of a next-generation OpenID discovery protocol which is it’s not a “full version” yet. Even when it becomes a standard, it is not backwards compatible with the OpenID 2.0 and earlier. Hmm.. see that?



By the way, before you use your OpenID on a different authentication page, why don’t you take a test to http://www.puffypoodles.com/?. On picture above, I’d tested it just to prove that my OpenID is recognized & acceptable. The test result means that with basic OpenID authentication, it succeeded to retrieve all of possible AX (Attribute eXchange) of OpenID, including email address, home country, preferred language, first name & last name. The conclusion is, the treatment of OpenID yet is different on each authentication since it still in “growing” era going to robustness. Maybe in couple years, a standardize of OpenID will be shaped, to make authentication more secure, private & intimate.

Labels: , , ,

  Post a Comment

Make a Chat from Single IM Account to Multiple IM services

If I only have a single IM account, can I make a chat with my friends who have different account on Google Talk, MSN Live, AIM or Yahoo Messenger? For example, if you have name@domain.com & you can chat with friend@yahoo.com or friend@hotmail.com or friend@gmail.com. If you’re on this case, I said: Yes you can! Being have a single IM account will looks more personally than anyone who kept several different of it. Let say, if you had a Yahoo account (eg: name@yahoo.com), then your chat communication is limited to your friends who has the same domain from yahoo.com. It is equal if you have Google account (eg: name@gmail.com) since your friends only comes with the same gmail.com domain. Then, how to make a chat conversation from one account to friends who has different account? Just use a Google account (or any email domain name you want), register it to Live, download & log on from Windows Live Messenger (or your favorite universal IM client).



On this experiment, I using Google Apps account with personal domain name (eg: name@domain.com). By default, Google Apps can communicate with Google Talk users from gmail.com & AIM account (after you registered to AIM). As the picture displayed above, you need to submit your email address to Windows Live first. Once you have registered to it, you will have the “passport” to communicate with MSN Live, Hotmail & Yahoo users. The last thing is, download Windows Live Messenger & try out to log on from it.



Now, you ready to chat with Yahoo messenger account. Try to send a chat request to one of your friend. The same picture below will display on your screen.



While on your friend screen will display a similar picture below:



On above picture, both of red circle explain that the conversation comes from non-Yahoo account (the first red circle will inform your email address, while the lower red circle displayed the Live logo and an online sign). But, what if your friend using Pidgin client? The pidgin will say that you’re offline. Pretty weird but it’s true.



Anyway, you still can make a chat with it. Moreover, if you use an universal IM client (eg: Pidgin or PSi), it will simplified your chat time since you only need to setup several IM services from your single registered email address. Have a nice try & please share your opinion below.

Labels: , ,

  Post a Comment

Win32 Application Online Update (Automatically)

As my promise before, here now I present the last part of updating Win32 application methods. On this experiment, I tried to implement an automatically technique so that it will eliminate user’s response to retrieve an upgrade from online source. Any programming language will do the same technique I offered but for this chance, still I used Borland Delphi for the familiarly reason. The trick – I said – is a basic one: first, the form needs to download a text file containing application version number information from the web, meanwhile at the same time the form also need to load the current application version. Then, both numbers must be compared. If newer version detected, the form have to download the update package. That’s it simple.

To get start, create a blank project and fill the form with 2 TMemo’s (to store both version local & online), TStatusBar (to show information during update process), TProgressBar (to show percentage progress), TTimer (to automatically do the process) and a TButton for dummy button test.



Next, please provide a text file (containing latest version number) and an exe package which is latest application to download into an online web directory (for example: http://www.abc.com/download). For this experiment, I used data.txt and data.exe.



Back to Delphi’s editor and think for the first rule of the form; download data.txt from http://www.abc.com/download/data.txt to the disk of local PC. The question is, is it possible to download an Internet file without using a special "download" component? Fortunately, since Delphi 4, this can be done very easily by using the Windows API function URLDownloadToFile. But, it's a pity that this function is not documented in the Help of the earlier Delphi versions, except in Delphi 2006 and later which is mentioned in the Help documents.

To do the trick, firstly, add "URLMon" to the unit's USES clause, if it's not already in the USES clause:

Uses Windows, Messages, …, URLMon;


Then, use the following simple source code example:

if URLDownloadToFile(nil, PChar(SourceFile), PChar(LocalFile), 0, nil) = 0 then CHECK LATEST VERSION & DOWNLOAD IT IF POSSIBLE
else StatusBar1.Panels[0].Text:='Error downloading';

CHECK LATEST VERSION means that both version number (from local & online) need to be compared. If it detected a latest one, make data.exe download directly. For the download progress - in a real world "critical" application - you should give some feedback to the user about what's happening, such as: disable the button until the end of the download, show progress indicator or show some message in a status bar. If you need to save the contents of http://www.abc.com/download/data.exe - and be able to track the download progress, use the TDownLoadURL Delphi action. While TDownLoadURL is writing to the specified file, it periodically generates an OnDownloadProgress event, so that you can provide users with feedback about the process. For this purpose, add unit “ExtActns” in the uses clause.

Uses Windows, Messages, …, URLMon, ExtActns;

type
TForm1 = class(TForm)

private
{ Private declarations }
procedure URL_OnDownloadProgress
(Sender: TDownLoadURL;
Progress, ProgressMax: Cardinal;
StatusCode: TURLDownloadStatus;
StatusText: String; var Cancel: Boolean) ;

implementation

procedure TForm1.URL_OnDownloadProgress;
begin
ProgressBar1.Max:= ProgressMax;
ProgressBar1.Position:= Progress;
end;


procedure TForm1.Button1Click(Sender: TObject);
with TDownloadURL.Create(self) do
try
URL:= http://www.abc.com/download/'data.exe';
FileName := 'e:\data.exe';
OnDownloadProgress := URL_OnDownloadProgress;
ExecuteTarget(nil) ;
finally
Free;
end;
end;
end;


Ok then, note that rule #2 using button as dummy trigger to download the whole process – from data.txt until data.exe -, so that Button1Click event complete like the following source:

procedure TForm1.Button1Click(Sender: TObject);
var wwwString,SourceFile, LocalFile: string;
begin
// initialization
Button1.Enabled:=false;
Memo1.Clear;
Memo2.Clear;
try
Memo1.Lines.LoadFromFile('c:\data.txt');
except
// if it failed to load data.txt from C:
end;
wwwString:='http://www.abc.com/download/'; // online source
SourceFile := wwwString+'data.txt';
LocalFile := 'c:\data.tmp.txt'; // temporary for data.txt

// try to download data.txt from online source
if URLDownloadToFile(nil, PChar(SourceFile), PChar(LocalFile), 0, nil) = 0 then
begin
Memo2.Lines.LoadFromFile('c:\data.tmp.txt');
// compare both version number (local & online)
if Memo1.Text>=Memo2.Text then StatusBar1.Panels[0].Text:='No update available'
else
begin
Memo2.Lines.SaveToFile('e:\data.txt'); // save latest version information
StatusBar1.Panels[0].Text:='Downloading update ('+Memo2.Text+')...';
// downloading latest application
with TDownloadURL.Create(self) do
try
URL:=wwwString+'data.exe';
FileName := 'c:\data.exe';
OnDownloadProgress := URL_OnDownloadProgress;
ExecuteTarget(nil) ;
finally
Free;
end;
end;
end
else
StatusBar1.Panels[0].Text:='Error downloading ' + SourceFile;
deletefile('c:\data.tmp.txt'); // delete temporary
Button1.Enabled:=true;
end;


Make a try to execute the source & press the button to start the (manual) update.



If nothing goes wrong, for the first time, the application will try to start download the latest application. Wait it until the rest process completed. If it succeeded, you may need to move the download trigger into TTimer. And that’s it, the updater application will work. You can add some improvement to the updater such as a procedure to move data.exe into main program or anything you like after you built the updater like above. Please share your comment below & thanks for your attention on this blog.

Labels: , ,

  Post a Comment