def farey = {
def a = 1, b = it, c = 1, d = it - 1;
printf "%d/%d ", a, b
while (c != 1 || d != 1) {
printf "%d/%d ", c, d
z = (int) ((it + b) / d)
(a, b, c, d) = [c, d, z * c - a, z * d - b]
}
}
farey(7)
Output:
1/7 1/6 1/5 1/4 2/7 1/3 2/5 3/7 1/2 4/7 3/5 2/3 5/7 3/4 4/5 5/6 6/7
Sunday, February 16, 2014
Farey Series
Saturday, January 25, 2014
Learning OAuth 2.0
+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| |<-(B)-- Authorization Grant ---| |
| | +---------------+
| |
| | +---------------+
| |--(C)-- Authorization Grant -->| Authorization |
| Client | | Server |
| |<-(D)----- Access Token -------| |
| | +---------------+
| |
| | +---------------+
| |--(E)----- Access Token ------>| Resource |
| | | Server |
| |<-(F)--- Protected Resource ---| |
+--------+ +---------------+
OAuth 2.0 defines quite a few API endpoints. The RFC provides examples for the request and expected responses for these APIs.
One of the good ways to understand the RFC is build the OAuth endpoints and try out the samples mentioned in it. Apigee Edge support of OAuth 2.0 is a quick help here.
This github project oauth20_apigee contains the proxy and the postman client requests.
Apart from the RFC,following are two good resources about OAuth 2.0
- Good Explanation of OAuth 2.0 By Aaron - OAuth 2 Simplified
- If you wondered (like me) why Authorization Code is required in OAuth 2.0 - Stack Overflow Question
Friday, December 13, 2013
brew install octave fails on OS X - Mountain Lion
make install phase with the following error:make install ./plot.texi:3957: warning: node `Multiple Plot Windows' is prev for `Printing and Saving Plots' in menu but not in sectioning make[3]: *** [octave.info] Error 1 make[2]: *** [install-recursive] Error 1 make[1]: *** [install-recursive] Error 1 make: *** [install] Error 2The solution seems to be the manual patch indicated here: http://goo.gl/nq0H5b
In summary:
--enable-docs=no makes it work.
Sunday, June 03, 2012
Post S2 I9100G ICS Upgrade: Only Samsung Logo Left?
The only way to get the phone back to work is to revert to Gingerbread! This has to be done manually by downloading the firmware and installing it.
Thanks to this link , it provides a detailed explanation for doing the same.
Appreciate Samsung for such robust update release which only shows their logo after its applied!
Of course, I can visit the Samsung service center in Bangalore which is worse than their upgrade package!
Sunday, May 20, 2012
loadClass - JDK 1.6.0_18 vs JDK 1.6.0_27
This classloader worked on JDK 6 Update 27 (dev env) but failed to work on JDK 6 Update 17 (test env).
Its a rare skill to write code in Java that fails between minor revisions!! :-)
The class loader code was written looking at the Java source code for Classloader. This was the cause of the issue - the custom loader implementation did not adhere to the documented contract for the loadClass method.
The documentation of the loadClass method clearly states
ClassNotFoundException - If the class could not be foundJdk 1.6 Update 27
The if check c==null in the Update 27 made the loadClass method work even though it did not adhere to the documented contract.
The bottom line is to code against documented contract and not look at the implementation to write code!
Monday, February 06, 2012
Analytical Reasoning With Prolog
Problem:
Monday, December 26, 2011
C#: Timer, Deferred Evaluation & GC
- The Loc 1 in the code is a Select expression which is implemented by deferred execution.
- The Loc 2 in the code exists to ensure the Select is executed and timer is created/scheduled.
- The key issue with the code is no reference to the Timer object created is retained. Hence, the Timer object is garbage collected.
- Even though the Loc 1 seems to indicate that the reference to the Timer is assigned to the _timers field, it's not so. The _timers field holds the reference to the Select iterator. In other words, the lambda code itself.
GetType() on _timers will return System.Linq.Enumerable+WhereSelectListIterator`2 [System.Threading.TimerCallback,System.Threading.Timer]
- If the timer is garbage collected, what is the observed behavior in the Dispose method of the JobScheduler ?
The foreach loop actually creates new timers as a result of Select execution again and disposes them.
- Timer will not be fired if the GC runs.
- Timer created will never be stopped by Dispose if the GC does not collect it.
Sunday, December 11, 2011
Prolog: List Difference
minusAcc(L,[],_,L) :- !.
minusAcc([],_,A,A) :- !.
minusAcc([H|T],SL,A,W) :- \+memberchk(H,SL),!,
append([H],A,AL),
minusAcc(T,SL,AL,W).
minusAcc([_|T],SL,A,W) :- minusAcc(T,SL,A,W).
minus(L,SL,W) :- minusAcc(L,SL,[],W).
Sunday, November 13, 2011
Installing Io on Snow Leopard
In case you intend to do the same, here is the gist of the steps required to get going
- Download Io source from git-repo
- Next step is to run the build.sh file in the cloned git io directory. You might get the following error
- You need to modify the file ~/software/io/libs/basekit/source/Common_inline.h change
in the section #if defined(__APPLE__) to
#define NS_INLINE static inline
- Now run the build.sh file again. Io binary will be ready for use!
- Here is the Vim plugin for Io: http://www.vim.org/scripts/script.php?script_id=2116
Friday, April 15, 2011
Trying REBOL
The application should be able to convert time from Indian timezone to Munich and Boston timezone. This conversion is related to my current project.
With this weird requirement, I decided to use the most weird way to convert time. I decided to use the timeanddate.com timezone converter to do the conversion. As a result, the application has to make an
HTTP GET call to this link and parse the resulting web page to find the converted time.Summarizing the Approach:
- Write a REBOL UI application that takes the Indian time as input
- On click of
Convert, makes anHTTPcall to the website with input given by the user. - Parse the resulting web page and find the converted time.
- Show the converted time on the UI !!
Here is the REBOL code for the application.
This is a REBOL code for timezone convertor
REBOL
[
Title: "Timezone Convertor IN to BOS & MUN"
Author: "Srikanth Seshadri"
]
t-time: to-string now/time
time-get: func [inp-time tz] [
page: reform [
"http://www.timeanddate.com/worldclock/converted.html?hour="inp-time/hour"&min="inp-time/minute"&sec="inp-time/second"&p1=438&p2="tz]
tzurl: to-url page
tz-text: load/markup tzurl
zone-found: false tg-time: now
foreach item tz-text [
if all [string? item zone-found ] [ tg-time: item break]
if all [string? item any[ find item "(U.S.A" find item "(Germ"] ] [zone-found: true]
]
tg-time
]
gui: layout [
backdrop effect [gradient 0x1 white]
across
h3 "Timezone Converter IN -> BOS & MUN" black return
lab "Indian Time"
t-time: field t-time 60x24 return
tab
button "Convert Time" [
inp-time: (to-time t-time/text)
if inp-time
[
boslbl/text: reform ["Time in Boston: " time-get inp-time 43]
munlbl/text: reform ["Time in Munich: " time-get inp-time 83]
show boslbl
show munlbl
]
] keycode [#"^m"] return
boslbl: h4 "[---------------------------------------------------------------------]" return
munlbl: h4 "[---------------------------------------------------------------------]" return
]
view center-face gui
and the output

This is most strange way to do timezone conversion, but the learnings and development was fun; all the effort was worth it!
Monday, September 06, 2010
World War II + India + Java
DateFormat indiaDtFmt = new SimpleDateFormat("dd/MM/yyyy HH'h'mm");DateFormat gmtDtFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");indiaDtFmt.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta"));gmtDtFmt.setTimeZone(TimeZone.getTimeZone("GMT"));Date worldWarIIDate = indiaDtFmt.parse("02/02/1944 06h30");Date nonWorldWarIIDate = indiaDtFmt.parse("02/02/2006 06h30");System.err.println(gmtDtFmt.format(worldWarIIDate) +" GMT");System.err.println(gmtDtFmt.format(nonWorldWarIIDate) +" GMT");
1944-02-02 00:00:00 GMT2006-02-02 01:00:00 GMT
Saturday, July 31, 2010
Auto Fare Converter

![]() | ![]() |
- Enter the current fare in the meter.
- Click Convert button.
- The amount you need to pay, the new fare, will be shown.
Monday, July 26, 2010
BMTC Bus Ticket Cost Calculation
Note: The calculation is performed by the ticketing machine given to the bus conductor so the conductor cannot cheat you!
BMTC divides the routes into stages. Following is the 'Fare Table' of BMTC Bus No 45. You can get the 'Fare Table' for your route from the conductor....Please Ask!
| FARE TABLE-010 | ||
| Stage | Name | Fare |
| 1 | KAMAKYA | 0.00 |
| 2 | KATTRIGUPPE | 5.00 |
| 3 | HOSAKERE HALLI | 9.00 |
| 4 | BANK COLONY | 10.00 |
| 5 | GANESH BHAVAN | 13.00 |
| 6 | CHAMARAJPET | 15.00 |
| 7 | GOODS ROAD | 16.00 |
| 8 | KBS | 16.00 |
Now the stage you climb the bus is the Stage 1 for you and of course the stage you get off is the last stage for you. Lets see the following examples of fare calculation with the previous assumption.
Fare from
- KAMAKYA to KBS = Stage 8 - Stage 0 = 8 Stages crossed = Rs 16
- BANK COLONY to GOODS Road = Stage 7 - Stage 4 = 3 Stages Crossed = Rs 9
- GOODS ROAD to KBS = Stage 8 - Stage 7 = 1 Stage crossed = Rs 5
List stageList=[KAMKYA...KBS]
List fareList=[0..16]
int start= stageList.indexOf[YOUR START STAGE]
int end = stageList.indexOf[YOUR END STAGE]
Fare= fareList[end-start]
Hope the calculation is clear!
Sunday, May 30, 2010
Reading Java Concurrency
Here is the study plan for that worked for me...
- Locks, Conditions And Fairness
- Understanding the Java Memory Model and its fix by JSR 133
- Happens-Before and volatile.
- LL/SC, CAS concepts
- Atomic package
- Concurrent Data Structures & Synchronizers
- Executors,Futures and other threading concepts.
- Articles by Brian Goetz, Doug Lea
- Java concurrency Interest group.
Two useful books:
- Concurrent Programming In Java by Doug Lea.
- Java Concurrency in Practice By Brian Goetz
Sunday, January 31, 2010
rmToMp3.pl
- Perl
- mplayer
- lame
- wget
#!/usr/bin/perl -w
use strict;
BEGIN{
$\="\n";
}
&usage if @ARGV!=1;
my $fileName=shift;
&usage if ($fileName !~ m#\.(ram|rm)$#);
&process_ram($fileName) if ($fileName =~ m|\.ram$|);
&process_rm($fileName) if ($fileName =~ m|\.rm$|);
sub usage(){
print STDERR "usage: $0 filename.rm/ram\n";
exit 1;
}
sub process_ram(){
my $fileName=shift;
$fileName=&processUrl($fileName);
open RAM_FILE, $fileName || die "Failed To Process File: $!";
while(){
chomp;
chop if ~ m/\r$/;
$_ = &processUrl($_);
&convertToMp3($_);
}
close RAM_FILE;
}
sub process_rm(){
my $fileName=shift;
$fileName=&processUrl($fileName);
&convertToMp3($fileName);
}
sub convertToMp3(){
my $fileName=shift;
chomp($fileName);
chop($fileName) if $fileName =~ m/\r$/;
print "Processing File...$fileName";
my ($dirName,$baseName)=&dirname($fileName);
$baseName =~ s/\.rm/.mp3/;
die "Invalid File: ${fileName}" unless(-e $fileName);
`mplayer $fileName -ao pcm 2>/dev/null`;
`lame -h -b 128 audiodump.wav $dirName/$baseName`;
`rm audiodump.wav`;
}
sub dirname(){
return (".",$_[0]) unless $_[0] =~ m|^/|;
return $_[0]=~ m|(.*/)(.*)$|;
}
sub processUrl(){
my $fileName=shift;
chomp($fileName);
if(&isUrl($fileName)){
&download($fileName);
return $fileName =~ m|.*/(.*)$|,$1;
}
return $fileName;
}
sub isUrl(){
$_[0] =~ m/^http.*/;
}
sub download(){
print "Downloading File...$_[0]";
system("wget -c $_[0]")==0 || die "Failed to download file: $_[0]";
}
Wednesday, November 04, 2009
Encroachers Hammering Project
Recent anti-encroachment drive of Mysore is an example of admirable planning and execution. The drive was directed and managed by the MCC commissioner K. S Raykar.
Planning Phase:Almost 6 months
a) to get approvals from higher ups including district minister Shobha Karandlaje
b) to develop project execution plan.
Departments Involved: MCC, MUDA, Mysore Police (KSRP, CAR, DAR...etc), Telecom Department
Project Leads: K.S Raykar( MCC Commissioner), Manivannan (DCP), Sunil Agarwal (Police Commissioner)
Project Team Structure/Resourcing:
Commanded by: 2 teams of MUDA and MCC
Executed By: 27 teams of workers!!!
The team organization and composition of each team is shown below.

Risks/ Risk Mitigation:
Stay Order from Court: The operation was started on a Sunday, early in the morning - no court is open at that time.
Influence from elected representatives: All the phone lines, land line and mobile, were jammed with help of Telecom providers - physical presence required for any kind of influence.
People gathering to protest: Jamming of phone lines prevent mobilization of people. Also, 500 policemen providing security would deter anyone raising voice.
Result: More than 450 encroachments cleared by noon!
Issues Encountered: There was protest by the elected representatives at the demolition site. The threat of arrest, and few arrests, by the police was enough to diffuse the crowd.
Post Execution: MCC Commissioner goes on a 3 day sick leave from Monday – leaving all the encroachers and their supporters with the rubble!
Monday, July 13, 2009
A Geyser Weekend
Capacity: 25-15 liters Storage - This is enough for a bathroom geyser in most household of 4 to 6 ppl. The decision in this case has to be based on the requirement since the cost difference between a 25 ltr and 15 ltr model is Rs 400.
Plastic Body (ABS) Acrylonitrile Butadiene Styrene (C8H8• C4H6•C3H3N)n plastic has very good electrical insulation properties.
Copper Drum - Copper has special anti corrosive properties that prolongs the life of the water heater. This is useful for hard water areas.The heat retention in Copper Drum is more than that of stainless steel.
Pressure - It is recommended to select a heater with pressure withstanding capacity of 6 Kg/cm2 and above in case of high rise apartments where the pressure can build-up due to water inlet. This might be due to a pressure pump used for water or water gushing down from the overhead tank.
Adjustable Temperature - Ideal water temperature for a bath is 40- 45 degrees. This would save some money the electric bill!!
Thermal Cut-out - A fail-safe device to prevent over heating and boiling
Pressure cum vacuum release–prevents build up of excessive pressure (by releasing water) or vacuum (sucking in air) inside the tank.
Semi return device – prevents dry heating of the element by cutting off flow from the tank- ensuring that element is always immersed in water.
2-in-1 pressure cum release valve - Ensures positive and negative pressure is not created inside the tank
Ceramic Heating Element - No electric shock. It is a cartridge type element that is not in contact with water. Also the heat transfer is over a much larger surface area. The result- longer elements, life, lower salt deposits, hence ideal for hard water areas, easier to replace without draining the water.
PUF Insulation - Poly Urethene Foam prevents heat loss, retains heat longer.
Certifications & Warranty
ISI/BIS certification - A must india.
Warranty period for 5 years.
IEC international certification .
And of course 5 star energy rating!!
I happened to select a water heater with most of theses specifications - 2 years down the line i will be evaluating these criteria :)
Friday, June 19, 2009
Solving a Linear Programming Problem
We use the SYMPHONY an open source generic MILP (Mixed-Integer Linear Programs) solver from COIN-OR.
This solver takes two inputs
- Problem model file: The Problem Model file contains the formulation of the LPP to be solved. The file uses GMPL (a subset of AMPL) a modeling language for Mathematical Programming.
- Input data file:This file contains the input data of the problem to be solved.
Equipped with this information I decided to solve one of the 6th Semester Engineering LPP problems.(I still have my 6th Sem OR notes!!)
Problem Statement:
A small scale hardware production plant produces Nuts, Bolts and Rivets. A box of Nuts fetches a profit of Rs 20 per fortnight. Profit per fortnight from a box of Bolts and Rivets is Rs 6 and Rs 8 respectively. A box of Nuts requires 8 hrs of Milling, 2 hrs of lathe time and 4 hrs of threading time. A box of Bolts requires 2 hrs of Milling, and 4 hrs of threading time. A box of Rivets requires 3 hrs of milling and 1 hr of lathe time. Further milling, threading and lathe can operate 250 hrs, 150hrs and 50hrs per fortnight. Find an optimal solution to maximize the profit per fortnight of production plant.
Mathematical Formulation:
Lets formulate the problem to be solved. Let x1, x2, x3 represent the optimal quantities of production of the Nuts, Bolts and Rivets per fortnight.
The objective and constraints formulated can be easily derived from the problem statement.
Milling Constraints:
8 x1 + 2x2 + 3x3 <= 250
Threading Constraints:
4 x1 + 3x2 + 0x3 <= 150
Lathe Constraints:
2 x1 + 0x2 + 1x3 <= 50
/*Input Data we need to Solve*/
/* Input Set of products */
set products;
/* Gains of the product */
param gain{i in products};
/* Milling Requirements of the product */
param milling{i in products};
/* Lathe Requirements of the product */
param lathe{i in products};
/* Threading Requirements of the product */
param thread{i in products};
/* Milling Limit*/
param millingLimit;
/* Threading Limit*/
param threadLimit;
/* lathe Limit*/
param latheLimit;
/*Variable Declarations*/
var x{i in products}, >= 0;
/*Objective*/
maximize profit: sum{i in products} gain[i]*x[i];
/*Constraints*/
subject to millingMachine: sum{i in products} milling[i]*x[i] <= millingLimit;
subject to latheMachine: sum{i in products} lathe[i]*x[i] <= latheLimit;
subject to threadMachine: sum{i in products} thread[i]*x[i] <= threadLimit;
end;
We define a variable set x representing the quantities of each of the product. We need to determine the values of x.
Further we define the objective and constraints to choose the optimal solution.
Input Data File:
Following is the input data file from our problem statement to be used with the model file.
Filename: HardwarePlant.dat
data;
set products:= Nuts Bolts Rivets;
param gain:=Nuts 20
Bolts 6
Rivets 8 ;
param milling:=Nuts 8
Bolts 2
Rivets 3;
param thread:=Nuts 4
Bolts 3
Rivets 0;
param lathe:=Nuts 2
Bolts 0
Rivets 1;
param millingLimit := 250;
param threadLimit := 150;
param latheLimit := 50;
end;
Next we specify the gain per fortnight. From the model file its evident that we need gain for every product. We specify the name of the product and gain. As mentioned above the name serves as an index into the gain set.
We use the similar approach as above and specify the values for milling, threading and lathe requirements.
Finally, we specify the scalar values for the limits.
Using the model and input file, Symphony solver can be executed as follows
symphony -F HardwarePlant.mod -D HardwarePlant.dat
Solution Cost: 700.000
+++++++++++++++++++++++++++++++++++++++++++++++++++
Column names and values of nonzeros in the solution
+++++++++++++++++++++++++++++++++++++++++++++++++++
x[Bolts] 50.000
x[Rivets] 50.000
The solver is recommending for production of 50 bolts, 50 rivets and no nuts in a fortnight. And the optimal profit is Rs 700 per fortnight.
This is answer that matches the hand solved solution in my notes!!
Wednesday, May 27, 2009
SOA Layering
http://bill-poole.blogspot.
http://bill-poole.blogspot.
Very impressive arguments. Thanks to Sriram for sending me these links.
Wednesday, May 20, 2009
ESB - Does my project need it?
I came across quite an interesting perspective after a brief session with Jim Webber, an advocate of Guerilla SOA.
From my past experience following are some of the key reasons for using an ESB.
ESB cleans-up the integration mesh (or mess)
A typical diagram of ESB based transformation is as shown above. In reality all the mesh gets into the ESB itself; ESB encapsulates the mesh. Subsequent to the ESB based solution implementation, enterprises would have to setup teams to manage the ESB and deal with the governance around the ESB usage.Eventually there is a possibility of the mesh outgrowing the ESB and spilling over; taking the integration back to where it started. Only difference this time is that the ESB will be part of the mesh.

ESB is good for business process orchestration
This is one of major feature that attracts a lot of developers. As a result, the business process gets into the ESB. The ESB now contains the critical business process of the enterprise, apart being just an integration back bone. This makes whole system extra complex with business logic spread all over.
Other ESB vices
In general usage of ESB results in vendor lock in. Business process is always wired in using vendor specific languages.
Performance hit with ESB is significant. More dollars are spent scaling this beast.
Occasionally project requires development custom adapter/data transformers to be used with ESB - additional effort for the development team with already strict time lines.
Is ESB useless?
No, its not; but ESB is not a silver bullet.
ESB assists the project in meeting the data transformation and communication requirements. Its a good candidate for dealing with disparate protocols (FTP, IIOP, and SOAP) between the interacting systems
How do I deal my integration mess?
Business Chaos Modeling!!
As I understand, Guerrilla SOA advocates modeling the SOA integration based on the real world business process. This is an interesting perspective.
As we all know traditional software that models the business domain is the one best meeting the business requirement. Why can't we extend this to SOA?
Just model the business interactions between services. If thats a mesh, so be it. The business itself is running with so many interactions.
If a clean-up is required, then the change should originate from the business domain. This business domain change will percolate and would warrant a change in the SOA model.
I feel this is idea of modeling the business chaos among the services is so much in line with the philosophy of SOA which promotes the alignment of software systems in line with the business.
ESB can definitely not clean-up the so called chaos that originates in the business domain.
Business Process Orchestration
Business process is just business logic; why treat the process as a special entity? Implement the process like any other business logic. Such an implementation would ensure the entire business logic remains as a single unit and is more manageable.
Managing Chaos
Manageability of the solution/system post implementation is critical to any client. Although we model the business domain mesh in our system, it critical that the mesh be manageable. Monitoring and control interfaces to manage interactions are essential.
Summary
A manageable business integration (SOA), with thoughtful ESB usage would definitely make the client happy and align the implementation with business!!
Hmm...quite a change of ideas in me after getting to know about Guerrilla SOA!!



