<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4948047875508814073</id><updated>2024-03-08T12:27:59.980-08:00</updated><category term="sick of bad advice"/><category term="MySQL"/><category term="administration"/><category term="asterisk"/><category term="bloginfo"/><category term="c++"/><category term="database"/><category term="date_format"/><category term="design"/><category term="optimization"/><category term="php"/><category term="rules"/><category term="scalability"/><category term="source code"/><category term="voip"/><title type='text'>Advanced Coding Concepts</title><subtitle type='html'>Regarding application and solution design - code structure, optimization, algorithms.  Open source releases for peer review, etc.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://advancedcodingconcepts.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://advancedcodingconcepts.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15272016077841389348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>6</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4948047875508814073.post-8431759729606561040</id><published>2012-10-07T18:10:00.001-07:00</published><updated>2012-10-08T06:00:41.615-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="date_format"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="optimization"/><category scheme="http://www.blogger.com/atom/ns#" term="sick of bad advice"/><title type='text'>MySQL - The right way to get a week range from a time column or from the current date</title><content type='html'>I was trying to save 5 minutes of time today by Googling for what I thought would be a fairly standard query to get a date range representing the week of a time column, but to my surprise I found nothing but crap online -- check out &lt;a href=&quot;http://www.larryullman.com/forum/read.php?8,23907&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;this forum&lt;/a&gt;, for example, where a poster suggests a complex case switch that is external to the SQL query, and surprisingly has other users backing him up. &amp;nbsp;His query also will not extend to a time column, only to the current date, so it can not be used in reports where the intent is to group by week.&lt;br /&gt;
&lt;br /&gt;
I would have posted this as a reply on that forum, but the forum is locked (the question&#39;s been resolved?) I think I&#39;ll start posting more now, about the inadequacies of online &quot;help&quot;, in order to drive developers towards thinking for themselves. &amp;nbsp;Further, to have an accurate answer available for searchers.&lt;br /&gt;
&lt;br /&gt;
Here&#39;s my sql statement (field portion) to get the week start/end date in a range - replace &#39;timecol&#39; with your time column, or &quot;now()&quot; for the current week.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;select&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;concat(&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; date_format(date_sub(timecol, interval date_format(timecol, &#39;%w&#39;) day), &#39;%b %d %Y&#39;),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; - &#39;,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; date_format(date_add(timecol, interval (6-date_format(timecol, &#39;%w&#39;)) day), &#39;%b %d %Y&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; ) as timecol_weekrange&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;....&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;from&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;... where&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;... group by date_format(timecol, &#39;%X%V&#39;)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;.. order by timecol&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This can be extended to make it a bit more pretty - if it&#39;s the current year, why display the year? &lt;br /&gt;
&lt;br /&gt;
I if the year is the same on the upper and lower half of the range, why display it twice? &amp;nbsp; Same question, for the month.&lt;br /&gt;
&lt;br /&gt;
The next query (while more complex) will shorten &lt;i&gt;Oct 7 2012-Oct 13 2012&lt;/i&gt; &amp;nbsp;to &amp;nbsp;To&amp;nbsp;&lt;i&gt;Oct 7 - 13&lt;/i&gt;&lt;br /&gt;
Also note, if it was currently 2013, then it would instead be shortened to &amp;nbsp;Oct 7 - 13, 2012&lt;br /&gt;
&lt;br /&gt;
It also recognizes &quot;This week&quot; and &quot;Last week&quot; - it&#39;s always great to put data in human form; the exception to this is if you anticipate your data being printed, without the context of the time frame it was generated from.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;select&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp;if (date_format(timecol, &#39;%X%V&#39;)=date_format(now(), &#39;%X%V&#39;),&#39;This Week&#39;,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; if(date_format(timecol, &#39;%X%V&#39;)=date_format(date_sub(now(), interval 1 week), &#39;%X%V&#39;), &#39;Last Week&#39;,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; concat(&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; date_format(date_sub(timecol, interval date_format(time, &#39;%w&#39;) day), &#39;%b %D&#39;),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &#39; - &#39;,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if(month(date_sub(timecol, interval date_format(time, &#39;%w&#39;) day)) &amp;lt;&amp;gt; month(date_add(timecol, interval (6-date_format(timecol, &#39;%w&#39;)) day)),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; date_format(date_add(timecol, interval (6-date_format(timecol, &#39;%w&#39;)) day), &#39;%b &#39;),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &#39;&#39;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; date_format(date_add(timecol, interval (6-date_format(timecol, &#39;%w&#39;)) day), &#39;%D &#39;),&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (YEAR(now())&amp;lt;&amp;gt;YEAR(date_add(timecol, interval (6-date_format(timecol, &#39;%w&#39;)) day)),YEAR(timecol),&#39;&#39;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; &amp;nbsp; )&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;&amp;nbsp; )&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;) as timecol_weekrange&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: Courier New, Courier, monospace;&quot;&gt;....&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;from&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;... where&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;... group by date_format(timecol, &#39;%X%V&#39;)&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;.. order by timecol&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span style=&quot;color: blue; font-family: &#39;Courier New&#39;, Courier, monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;There&#39;s a few things I should note - at first glance, many people might think this looks inefficient as a single column in a query, which it may be if you&#39;re expecting 100000 rows to be returned,&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
However the likely use of this is to generate a report that is grouped by week, in which case you&#39;ll want to take the following advice on as best practice:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Make sure you use the &quot;as timecol_weekrange&quot; (or any other name) after the field, to give this section a separate name - that&#39;s not too important for optimization, but you don&#39;t want to give it the same name as your source column (ie don&#39;t call it timecol)&lt;/li&gt;
&lt;li&gt;When you group by week, &lt;span style=&quot;color: red;&quot;&gt;don&#39;t group by timecol_weekrange - that would force mysql to run this code on every row in the database&lt;/span&gt;. &amp;nbsp; &amp;nbsp;Use a where statement showing your upper and lower limit, ie where timecol&amp;gt;date_sub(now(), interval (7*5)+ date_format(now(), &#39;%w&#39;) day)) ) - this will limit the results to the past 5 days, and make sure that it starts on a Sunday - and stopping a full scan&lt;/li&gt;
&lt;li&gt;For the grouping, &lt;span style=&quot;color: #38761d;&quot;&gt;group by date_format(timecol, &#39;%X%V&#39;) &lt;/span&gt;- it&#39;s easier for the database to execute, your grouping will be done more quickly. &amp;nbsp;If you have a where statement that you know would never span more than 11 months, group by weekofyear(timecol) should be slightly faster&lt;/li&gt;
&lt;li&gt;After grouping, &lt;b&gt;order by timecol, not by timecol_weekrange- &lt;/b&gt;if you order by timecol_weekrange, it will order alphabetically - &lt;b&gt;J&lt;/b&gt;anuary will come &lt;b&gt;after A&lt;/b&gt;ugust. &amp;nbsp;If you group by the suggestion above, then that&#39;s not an issue as the result will still be numeric (201201 will be before 201208)&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
If you take the advice above, then the running your query across a full year will only run the column formatting a maximum of 52 times - once per each grouping, rather than once for each row if not grouped correctly.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If this query or post helped you, let me know via a comment, share, trackback, tweet or +1&lt;/div&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://advancedcodingconcepts.blogspot.com/feeds/8431759729606561040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2012/10/mysql-right-way-to-get-week-range-from.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/8431759729606561040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/8431759729606561040'/><link rel='alternate' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2012/10/mysql-right-way-to-get-week-range-from.html' title='MySQL - The right way to get a week range from a time column or from the current date'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15272016077841389348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948047875508814073.post-2909975409219086139</id><published>2012-01-25T12:05:00.000-08:00</published><updated>2012-10-07T18:11:59.200-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="administration"/><category scheme="http://www.blogger.com/atom/ns#" term="database"/><category scheme="http://www.blogger.com/atom/ns#" term="scalability"/><category scheme="http://www.blogger.com/atom/ns#" term="sick of bad advice"/><title type='text'>Database Optimization: Indexing, and Overcoming the Incompetence of Online Information</title><content type='html'>As techs, we&#39;ve all thought that we knew something, and had it turn out incorrect. Realizing our blind spots when making a decision, and acknowledging that our decisions may be correct or incorrect, where full information isn&#39;t available, is a right of passage in to being a professional.&lt;br /&gt;
&lt;br /&gt;
I&#39;ve been seen many blog entries about MySQL optimization that have significant flaws. Most recently, an entry comparing the load time of a thousand PNG files whether from a blob entry in a database, or from the file system.&lt;br /&gt;
&lt;br /&gt;
The fault in the entry is that the database loads were being performed through lookups in the database based on a random varchar column that was not indexed. &amp;nbsp;This on it&#39;s own, on a 4GB database, is enough to make it crawl down to the 1000% speed differential that that experiment experienced.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Key optimization is an essential skill to any database administrators - and incredibly simple when done correctly. At the most basic form, just ask yourself if the column you&#39;ve added to your table will be searched through - ie a phone number, in a phone number search tool, or a user name column if you&#39;re going to have users signing in. &amp;nbsp;If you need to go beyond this, chances are you&#39;ll find out in the MySQL slow query log file (disabled by default in my.cnf). &amp;nbsp;Usually you will only need the first column referenced in any where statement to be indexed; &amp;nbsp;Order the logic inside of your where statement based on which statement is most likely to reduce the table the most, so that the remaining statements won&#39;t have as much work to do.&lt;br /&gt;
&lt;br /&gt;
If you have a web application that can not easily scale to 10,000 - 50,000 daily users or 100,000-500,000 daily page loads, I recommend reading directly from the source - the MySQL documentation.</content><link rel='replies' type='application/atom+xml' href='http://advancedcodingconcepts.blogspot.com/feeds/2909975409219086139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2012/01/database-optimization-indexing-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/2909975409219086139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/2909975409219086139'/><link rel='alternate' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2012/01/database-optimization-indexing-and.html' title='Database Optimization: Indexing, and Overcoming the Incompetence of Online Information'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15272016077841389348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948047875508814073.post-2425263131983303380</id><published>2011-06-10T21:44:00.000-07:00</published><updated>2011-06-10T21:45:40.778-07:00</updated><title type='text'>Importance of a strong roadmap - overcoming Writer&#39;s Block and Welcoming Brain Fog</title><content type='html'>I&#39;ve been working on a large project for 7 or 8 months, that has been self-motivated and self-established to date.&lt;br /&gt;
&lt;br /&gt;
In the past two months, I&#39;ve acquired an interested buyer who&#39;s funded my development for 45 hours per week, each week, without interest in IP acquisition. &amp;nbsp; Am I one of the lucky few, or is the outcome of inhumane dedication?&lt;br /&gt;
&lt;br /&gt;
In the past I&#39;ve worked on projects for a month, three months, or sometimes longer and then achieved a point of brain fog where I couldn&#39;t motivate myself to work further. &amp;nbsp;Today, after twice this week working so intently that I&#39;ve become unable to operate - or even speak clearly, I&#39;ve completely changed my internal definition of brain fog.&lt;br /&gt;
&lt;br /&gt;
Why? &amp;nbsp; The results on Google reference brain fog for programmers as a sort of writer&#39;s block, but this time around I&#39;ve developed such a strong roadmap that I can direct my development efforts non-stop with continual precision. &amp;nbsp;I&#39;ve never kept any aspect of this project on paper, other than my last entry describing my desires for it&#39;s plugin application system, but through an equal amount of planning in terms of what will be necessary in the future, categorization, and strong focus on not taking the &quot;easy&quot; way and producing reusable code (esp. API calls in a large, custom API wherever a set of logic may need to be reproduced in the future) I&#39;ve created a beautiful chaos of electronic alchemy. &amp;nbsp;Large tasks on my todo list are now taking days whereas months ago they would have taken a week to two weeks. &amp;nbsp;However, the end effect is still the same amount of thought.&lt;br /&gt;
&lt;br /&gt;
Have any other programmers out there &quot;thought themselves&quot; to a cucumber state? &amp;nbsp;Are there any&amp;nbsp;exercises&amp;nbsp;that you can recommend to strengthen the brain&#39;s ability to operate at an intellectual level for long periods of time?</content><link rel='replies' type='application/atom+xml' href='http://advancedcodingconcepts.blogspot.com/feeds/2425263131983303380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/06/importance-of-strong-roadmap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/2425263131983303380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/2425263131983303380'/><link rel='alternate' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/06/importance-of-strong-roadmap.html' title='Importance of a strong roadmap - overcoming Writer&#39;s Block and Welcoming Brain Fog'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15272016077841389348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948047875508814073.post-6234229533139399146</id><published>2011-03-06T22:35:00.000-08:00</published><updated>2011-03-06T23:46:09.046-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="design"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>Application Plugin Interface design</title><content type='html'>A large part of enterprise grade solution releases includes methods for distributing, purchasing, monetizing or for free allowing extensions to their products. &amp;nbsp;Apple with the iTunes store for iPad and iPhone, Drupal with their simple base-line product for setting up webpages can be extended easily with readily available plugins. Winamp, Firefox, Google Chrome. &amp;nbsp;The list goes on.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;If you build it, they will come&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;float: right; padding-left: 1em;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.youtube.com/embed/8To-6VIJZRE?feature=player_embedded&#39; frameborder=&#39;0&#39;&gt;&lt;/iframe&gt;&lt;/div&gt;The question is how to create an application from scratch with the immediate intension of opening it up to developers to extend, as well as for corporate clients to customize for their purposes. &amp;nbsp;As Teddy Roosevelt said, &quot;If You Build It, They Will Come&quot;. &amp;nbsp;Microsoft&#39;s Steve Balmer famously &lt;a href=&quot;http://www.theregister.co.uk/2005/09/05/chair_chucking/&quot;&gt;threw a chair&lt;/a&gt; in 2005 at the thought of Google, but also throws the words &quot;Developers Developers Developers&quot; on stage at conferences, and has for years. &amp;nbsp;He knows that to have the leading platform, you need to motivate developers to extend the functionality to your platform. Google has a &lt;a href=&quot;http://code.google.com/more/&quot;&gt;great list of APIs&lt;/a&gt; accessible with a Google API Key, but other than Google Adsense and Google Adwords, makes it difficult to monetize the products you can create with their services as a developer. &amp;nbsp;The allure of a centralized platform for publishing your applications is a one that is difficult to miss as an application designer, and can even allow some leeway for not having the best interface, if you have the right amount of users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;&lt;b&gt;How much power&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Should you restrict your application to a specific language? &amp;nbsp;What if your language becomes outdated in three years? &amp;nbsp;How do you handle third party add-ons to your application without allowing them to interfere? &amp;nbsp;Do you require the use of your own function calls to pass information, or provide complete control to the developer?&lt;br /&gt;
&lt;br /&gt;
The method I&#39;ve chosen in my APEX Platform that I am creating, is to allow a plugin to be written in any language with almost no integration in to the interface other than by interfacing with other, user-written applications. &amp;nbsp;APEX has essentially become a website template that allows you to drop in code to display a main page - whichever application is running controls the interface. &amp;nbsp;It sounds simple, but is there anything else necessary? &amp;nbsp;To date the only communication that is done between APEX and the application is that an application can list a variable as being in it&#39;s global variables list - which allows other applications to read and write to it. &amp;nbsp;The settings application can see the functions you expose in your application for configuring your applications extensions - the settings application is not a part of APEX, and can be readily extended. &amp;nbsp;The Dashboard application reads from the icon_list global, and allows you to customize the dashboard and quicklists. &amp;nbsp; A &quot;contact&quot; application can be created that &quot;accepts&quot; a &quot;data structure&quot; and an application controlling that data structure can search for an application that &quot;accepts&quot; it. &amp;nbsp;The possibilities become endless. &amp;nbsp;Want to write a virus that runs on my platform? &amp;nbsp;I say go ahead, because I gain the creativity of the world that prefers unlimited barriers.&lt;br /&gt;
&lt;br /&gt;
In consideration of writing such a mechanism, remember the age old &quot;KISS&quot; - Keep it simple, stupid! &amp;nbsp;You want to be universal. &amp;nbsp;You want to provoke developers of all types. &amp;nbsp;I will post more on the structure of my simple application plugin interface and allow you to benefit from it&#39;s internal structure. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: large;&quot;&gt;Implementation of security measures&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
With great power comes great responsibility, and &quot;app stores&quot; like those that already exist, that allow you to publish an application and have it moderated, allow for a great resource of moderated products. &amp;nbsp;I see a great business model in allowing developers to write and monetize their applications, apply updates and have the rest of the world benefit. &amp;nbsp;Write free applications, expand the open source movement. &amp;nbsp;Build communities - the kind that are viral. &amp;nbsp;Who wrote Napster? &amp;nbsp;What if it was open source, would it have been unstoppable? &amp;nbsp;Didn&#39;t Facebook suck before Applications were added? &amp;nbsp;Why did Facebook suffer privacy issues?&lt;br /&gt;
&lt;br /&gt;
If your application exposes customer records to applications, I hope you know who&#39;s writing them. &amp;nbsp;Facebook encountered this issue very quickly and has been a subject of many legal disputes centered around privacy. &amp;nbsp;Who&#39;s responsibility is it to secure an application and ensure it does not release vital information?&lt;br /&gt;
&lt;br /&gt;
I&#39;ve chosen to provide a hosted interface that allows you to integrate any level of functionality that you desire, with preselected applications. &amp;nbsp;My desire is to create a one size fits all business platform - Lotus Notes and Sales Force have been diligent in mucking this up in the past. &amp;nbsp;I will control a small amount of internal database structures and allow applications to extend the rest. &amp;nbsp;Each &quot;client&quot; would own their own database instance, with pointers to the applications involved; &amp;nbsp;function calls to each application&#39;s initialize, install, view functions. &amp;nbsp;Allow applications to integrate cron job entries. &amp;nbsp;I allow an application to create database tables, and to lock out access to these tables from other applications - in theory this should be enough. &amp;nbsp;The &quot;users&quot; table can not be modified by a rogue application, unless an administrator approves the rogue application. &amp;nbsp;We essentially move the risk to an intelligent controller.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What are your thoughts? &amp;nbsp;Has anybody out there in this blogosphere built such a plugin interface before? &amp;nbsp;In the end were you too restrictive, not restrictive enough, did you consider this interface early enough in your development process or too was it too early? &amp;nbsp;If you are interested, follow my blog - I will be posting my modelling diagrams of this process in a few weeks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: yellow; font-size: large;&quot;&gt;Blog finds of the week - March 6, 2011&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.web-development-blog.com/archives/why-should-you-cache-your-php-website/#more-1604&quot;&gt;Web Development Blog - Why Should you Cache your PHP Website?&lt;/a&gt;&amp;nbsp;A good starting point for increasing the maximum capacity of your web application - very little of it is PHP centric, you can apply this concept to all other languages.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.codinghorror.com/blog/2011/02/how-to-write-without-writing.html#comments&quot;&gt;Coding Horror - How to Write Without Writing&lt;/a&gt; Describing the benefits of improving your communication skills when it relates to software development. &amp;nbsp;If you want to write code, you should first learn how to write, and how to communicate.&lt;/li&gt;
&lt;/ul&gt;</content><link rel='replies' type='application/atom+xml' href='http://advancedcodingconcepts.blogspot.com/feeds/6234229533139399146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/03/application-plugin-interface-design.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/6234229533139399146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/6234229533139399146'/><link rel='alternate' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/03/application-plugin-interface-design.html' title='Application Plugin Interface design'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15272016077841389348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948047875508814073.post-7339844356787982958</id><published>2011-02-22T11:46:00.000-08:00</published><updated>2013-03-01T00:07:43.814-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="asterisk"/><category scheme="http://www.blogger.com/atom/ns#" term="c++"/><category scheme="http://www.blogger.com/atom/ns#" term="source code"/><category scheme="http://www.blogger.com/atom/ns#" term="voip"/><title type='text'>Asterisk Manager Interface C++ Interpretor for Linux</title><content type='html'>Through the past number of months in my full-time developer position for an online company and it&#39;s sales office, we&#39;ve migrated to a VOIP telephony platform based on Asterisk, Linux and our custom call centre management application. &lt;br /&gt;
&lt;br /&gt;
In order to integrate an autodialer in to the application, I had originally written a script in PHP to read from two asterisk servers (local and offshore) to post information about whether an agent is on a call or not, and also inbound calls to the call centre application.&lt;br /&gt;
&lt;br /&gt;
The PHP script took a matter of hours to set up initially, but lacked proper structure - specifically, it could not track information when we switched to call queues, and was not easily portable between asterisk versions (1.8 locally, 1.2 in offshore)&lt;br /&gt;
&lt;br /&gt;
For the past week I have worked on the design and initial coding of an app in C++ that acts as a client to both servers, interprets the messages and creates internal structures. &amp;nbsp;I&#39;m releasing that code here for review, and to help other&#39;s save some time, as I haven&#39;t noticed any other software out there that could accomplish this elegantly. &amp;nbsp;Currently, I am calling this application AMIflex based on the flexibility it provides to manage the Asterisk AMI protocol.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;This source code and it&#39;s derivatives can not be sold, licensed or packaged with any commercial software without my explicit permission.&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://www.xencall.com/amiflex.0.1.tar.bz2&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Download the source code here (.tar.bz2, 6kb)&lt;/a&gt;&amp;nbsp; [[Link fixed March 3, 2013]]&lt;br /&gt;
&lt;br /&gt;
Installation instructions: &lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;unpack the file via &quot;tar -xvjf&quot; command&lt;/li&gt;
&lt;li&gt;create /etc/amiflex directory, and add a &quot;servers.conf&quot; file in the following format&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #d0e0e3; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;Server: server name (for display purposes only)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #d0e0e3; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;Host: ip address or host name of ami server&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #d0e0e3; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;Username: AMI manager username&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #d0e0e3; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;Secret: AMI manager password/secret&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;Optional fields:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #d0e0e3; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;RetryPeriod: number of seconds to wait between connection retries - ie if asterisk is rebooted (default: 300)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;background-color: #d0e0e3; font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;Port: port number (default 5038)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;You can insert more than one server (connections will be maintained together) by entering the first server&#39;s details, placing a second new line after the last configration line for that server, and then entering the details for the second server (and so on)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;b&gt;How to make this useful&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;When a server connection is established, there&#39;s a AMI::RegisterAllEvents() call after authentication. &amp;nbsp;Add in your own events, and manipulate the structures or log output&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;i&gt;Example:&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;AMI::RegisterEventCB(&quot;Dial&quot;, &amp;amp;AMI::MyDialCallback)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;void AMI::MyDialCallback(MSG *msg)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (msg-&amp;gt;Attr(&quot;SubEvent&quot;).value==&quot;Begin&quot;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cout &amp;lt;&amp;lt; msg-&amp;gt;Attr(&quot;Channel&quot;).value + &quot; is dialing &quot; +msg-&amp;gt;Attr(&quot;Dialstring&quot;).value&amp;lt;&amp;lt;endl;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;b&gt;Current limitations&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;I have some well known limitations with this software - I&#39;ll be resolving them myself for internal use, but my next step is to integrate proprietary MySQL links in to the source code, so I made sure to release this first. &amp;nbsp;Currently my task list with my employer is too long to not take some shortcuts :)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;The channel list linked list is a static member of the channel class - this means that you run AMIflex with multiple servers in the configuration file, all of the channels for all servers will be parallel. &amp;nbsp;If you have two servers and each server has the same extension, then there will be one device entry created and two channels open on that device, when each extension is busy.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;The bridge event currently only registered the first channel&#39;s Bridge member to the second member, and vice versa - If you are monitoring channels that will be bridged to more than one other channel, this will have to be expanded to a proper many to many-style linked list.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Times, &#39;Times New Roman&#39;, serif;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://advancedcodingconcepts.blogspot.com/feeds/7339844356787982958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/02/asterisk-manager-interface-c.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/7339844356787982958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/7339844356787982958'/><link rel='alternate' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/02/asterisk-manager-interface-c.html' title='Asterisk Manager Interface C++ Interpretor for Linux'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15272016077841389348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4948047875508814073.post-2705350535039126195</id><published>2011-02-16T16:50:00.000-08:00</published><updated>2011-02-16T16:50:31.303-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="bloginfo"/><category scheme="http://www.blogger.com/atom/ns#" term="rules"/><title type='text'>Blog Guidelines</title><content type='html'>As a professional systems architect, I believe in strong guidelines for all work to ensure that a system produces stable and consistent results. &amp;nbsp;As a blogger, I aim to continue that style through in my posts. &amp;nbsp;This entry is to enumerate the posts you will find within this personal space.&lt;br /&gt;
&lt;br /&gt;
I will post thoughts on proper code and system design, when possible keeping the work independent of specific computer language, providing code examples (both concept and fully functional, with an open license when plausible)&lt;br /&gt;
&lt;br /&gt;
My motive is to help other&#39;s with the logic I&#39;ve learned and begun to take&amp;nbsp;for granted, and to learn better ways through open collaboration within the blog comments.&lt;br /&gt;
&lt;br /&gt;
Please feel free to leave your constructive comments and questions, as well as open personal communication with me.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Thank you, and welcome to Advanced Coding Concepts on Blogspot!</content><link rel='replies' type='application/atom+xml' href='http://advancedcodingconcepts.blogspot.com/feeds/2705350535039126195/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/02/blog-guidelines.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/2705350535039126195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4948047875508814073/posts/default/2705350535039126195'/><link rel='alternate' type='text/html' href='http://advancedcodingconcepts.blogspot.com/2011/02/blog-guidelines.html' title='Blog Guidelines'/><author><name>Anonymous</name><uri>http://www.blogger.com/profile/15272016077841389348</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>