jQuery Mobile & Codiqa & TimeDiff

Hi back again,

For some time, I have been interested in mobile app development, primarily using HTML 5 technologies. The interest started with BlackBerry's Playbook Offer, and to get a free PlayBook, I developed the free PlayBook application TimeDiff which was interesting experience for me.

As you might get from my posts, I am not that much of an HTML / CSS guy. I try to keep up with Python and C# but for a free PlayBook I actually did implement a pure HTML 5 & Javascript application, and using BlackBerry WebWorks SDK I turned that into a native (?) application.

Long story short, I had a real nice hands-on experience with jQueryMobile (the mobile version of jQuery) a neat framework to create touch-screen friendly applications. And I wanted to share some plugins with you that I found useful.

Codiqa: This is something that I actually did not use for the development of TimeDiff, but I found it very useful for a start. Codiqa, located at http://www.codiqa.com/, is a very nice web-based UI to create a jQueryMobile based applciation. It has an online designer that you can create and preview your application with different device sizes.

DateBox: DateBox is a very nice set of plugins to add Date / Time pickers to your jQueryMobile application. Not much words needed, check out the demos here to see how many great stuff you can do with the DateBox.

Before my last words, you can take a peek at my application from here and get it for your PlayBook from the BlackBerry App World.

Take care,
Baris

Your favourite Linux distro, on USB...

Hi all,

Today I am going to review a simple, yet quite strong application: Linux Live USB.

LiLi is a simple application that allows you to turn your USB flash disk into a fully working Linux distribution. It is written for Windows (sorry for Linux users that want to try other Linux distro's) and is distributed under GPLv3 license.

The software comes with an easy installer that we are used to in many Windows applications. After installing this little thing, you get a very nicely designed screen coming up...


The GUI is easy to understand. You simply choose your USB key that you want to install your Linux distribution on. Then you choose the installation source which can be a CD or an ISO image. You can even choose LiLi to download your favourite distro. If you have enough space on your flash disk, you can even add a persistent storage that Linux will treat as an hard disk. When you are done, you simply click the fancy lightning button and in a few minutes you have your fully working operating system on your USB, that you can easily take anywhere with you.

Good enough? Not heard the whole thing yet. You can simply select to embed VirtualBox into your USB disk, and you have your OS even when you are working on Windows. If you select the VirtualBox option, the USB key gets an autorun feature to run directly as you plug. Unfortunately, this is also for Windows only.

Not only the GUI is fancy.. You should also check out LiLi's web site http://www.linuxliveusb.com/ which has one of the coolest designs I've ever seen.

Take care,
Baris

p.s. I want to thank Huseyin Sevin who actually showed me this app:)

Everything back in place...

Hi all,

Hopefully everything (hyperlinks and syntax highlighting) is back in its place in this new blog, so I'll be moving on to write code snippets here..

Keep following
Baris

We are all converging from & to each other

Hi back again, long time I haven't posted...

One of the reasons that I like C# and Python (together) is the feeling that they are converging to each other. How I ended up with this conclusion?

Well, I have just learned that C# (and not only in .NET Framework 4.0 but starting from the 2.0 version) has a way of declaring named and optional function arguments.. This quite sounds familiar to me: from Python as you might expect. I have a strong guess that Python had it earlier (even though I am not sure) but it is not the issue. Whoever had it before, somehow moved the other one forward.. That is what is going on with the modern and developing languages and I actually like this (kind of) competition. It helps the developers learn new programming languages and develop projects faster after getting familiar to the syntax..

Wish learning (regular) languages were this easy, too:)

Take care,
Baris

p.s. Here are the links for Python and C# respectively

http://diveintopython.org/power_of_introspection/optional_arguments.html
http://msdn.microsoft.com/en-us/library/dd264739.aspx

jQuery lightBox Plugin - Opening the lightBox from External Links

Hi all,

JavaScript was quite not my "type" until I met jQuery. Working with jQuery is quite fun, and also made me learn some basic JavaScript. I was using the lightBox plugin by Leandro Vieira Pinho but I needed a way to open the lightBox from an external link. I could not find a useful reference on the web so I added my own solution.

Here is the JavaScript file and my update.

/**
* jQuery lightBox plugin
* This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
* and adapted to me for use like a plugin from jQuery.
* @name jquery-lightbox-0.5.js
* @author Leandro Vieira Pinho - http://leandrovieira.com
* @version 0.5
* @date April 11, 2008
* @category jQuery plugin
* @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)
* @license CCAttribution-ShareAlike 2.5 Brazil - http://creativecommons.org/licenses/by-sa/2.5/br/deed.en_US
* @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin
*/

// Offering a Custom Alias suport - More info: http://docs.jquery.com/Plugins/Authoring#Custom_Alias
(function ($) {
/**
* $ is an alias to jQuery object
*
*/
$.fn.lightBox = function (settings) {
// Settings to configure the jQuery lightBox plugin how you like
settings = jQuery.extend({
// Configuration related to overlay
overlayBgColor: '#000', // (string) Background color to overlay; inform a hexadecimal value like: #RRGGBB. Where RR, GG, and BB are the hexadecimal values for the red, green, and blue values of the color.
overlayOpacity: 0.8, // (integer) Opacity value to overlay; inform: 0.X. Where X are number from 0 to 9
// Configuration related to navigation
fixedNavigation: false, // (boolean) Boolean that informs if the navigation (next and prev button) will be fixed or not in the interface.
// Configuration related to images
imageLoading: '../Images/lightbox-ico-loading.gif', // (string) Path and the name of the loading icon
imageBtnPrev: '../Images/lightbox-btn-prev.gif', // (string) Path and the name of the prev button image
imageBtnNext: '../Images/lightbox-btn-next.gif', // (string) Path and the name of the next button image
imageBtnClose: '../Images/lightbox-btn-close.gif', // (string) Path and the name of the close btn
imageBlank: '../Images/lightbox-blank.gif', // (string) Path and the name of a blank image (one pixel)
// Configuration related to container image box
containerBorderSize: 10, // (integer) If you adjust the padding in the CSS for the container, #lightbox-container-image-box, you will need to update this value
containerResizeSpeed: 400, // (integer) Specify the resize duration of container image. These number are miliseconds. 400 is default.
// Configuration related to texts in caption. For example: Image 2 of 8. You can alter either "Image" and "of" texts.
txtImage: 'Resim', // (string) Specify text "Image"
txtOf: '/', // (string) Specify text "of"
// Configuration related to keyboard navigation
keyToClose: 'c', // (string) (c = close) Letter to close the jQuery lightBox interface. Beyond this letter, the letter X and the SCAPE key is used to.
keyToPrev: 'p', // (string) (p = previous) Letter to show the previous image
keyToNext: 'n', // (string) (n = next) Letter to show the next image.
lightboxSearchKey: '', // BarisCemSal :: (string) if lightbox is working on another div then the assigned object, then this is the search key you use for finding that
// jQuery('#lightBoxDiv a').lightBox(); for generating a lightbox of lightbovdiv by clicking lightBoxDiv
// jQuery('#FotoLinkButton').lightBox(lightboxSearchKey = '#lightBoxDiv a'); for generating a lightbox of lightbovdiv by clicking FotoLinkButton
// Don´t alter these variables in any way
imageArray: [],
activeImage: 0
}, settings);
// Caching the jQuery object with all elements matched
var jQueryMatchedObj;
var outer;
// This, in this context, refer to jQuery object
/**
* Initializing the plugin calling the start function
*
* @return boolean false
*/
function _initialize() {
outer = lightboxSearchKey == '' ? false : true;
if (outer) {
jQueryMatchedObj = $(lightboxSearchKey)
_start(jQueryMatchedObj[0], jQueryMatchedObj); // This, in this context, refer to object (link) which the user have clicked
return false; // Avoid the browser following the link
} else {
jQueryMatchedObj = this
_start(this, jQueryMatchedObj);
return false;
}
}
/**
* Start the jQuery lightBox plugin
*
* @param object objClicked The object (link) whick the user have clicked
* @param object jQueryMatchedObj The jQuery object with all elements matched
*/
function _start(objClicked, jQueryMatchedObj) {
// Hime some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
$('embed, object, select').css({ 'visibility': 'hidden' });
// Call the function to create the markup structure; style some elements; assign events in some elements.
_set_interface();
// Unset total images in imageArray
settings.imageArray.length = 0;
// Unset image active information
settings.activeImage = 0;
// We have an image set? Or just an image? Let´s see it.
if (jQueryMatchedObj.length == 1) {
settings.imageArray.push(new Array(objClicked.getAttribute('href'), objClicked.getAttribute('title')));
} else {
// Add an Array (as many as we have), with href and title atributes, inside the Array that storage the images references
for (var i = 0; i < jQueryMatchedObj.length; i++) {
settings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('href'), jQueryMatchedObj[i].getAttribute('title')));
}
}
while (settings.imageArray[settings.activeImage][0] != objClicked.getAttribute('href')) {
settings.activeImage++;
}
// Call the function that prepares image exibition
_set_image_to_view();
}
/**
* Create the jQuery lightBox plugin interface
*
* The HTML markup will be like that:
<div id="jquery-overlay"></div>
<div id="jquery-lightbox">
<div id="lightbox-container-image-box">
<div id="lightbox-container-image">
<img src="../fotos/XX.jpg" id="lightbox-image">
<div id="lightbox-nav">
<a href="#" id="lightbox-nav-btnPrev"></a>
<a href="#" id="lightbox-nav-btnNext"></a>
</div>
<div id="lightbox-loading">
<a href="#" id="lightbox-loading-link">
<img src="../images/lightbox-ico-loading.gif">
</a>
</div>
</div>
</div>
<div id="lightbox-container-image-data-box">
<div id="lightbox-container-image-data">
<div id="lightbox-image-details">
<span id="lightbox-image-details-caption"></span>
<span id="lightbox-image-details-currentNumber"></span>
</div>
<div id="lightbox-secNav">
<a href="#" id="lightbox-secNav-btnClose">
<img src="../images/lightbox-btn-close.gif">
</a>
</div>
</div>
</div>
</div>
*
*/
function _set_interface() {
// Apply the HTML markup into body tag
$('body').append('<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"><div style="" id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"><a href="#" id="lightbox-loading-link"><img src="' + settings.imageLoading + '"></a></div></div></div><div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data"><div id="lightbox-image-details"><span id="lightbox-image-details-caption"></span><span id="lightbox-image-details-currentNumber"></span></div><div id="lightbox-secNav"><a href="#" id="lightbox-secNav-btnClose"><img src="' + settings.imageBtnClose + '"></a></div></div></div></div>');
// Get page sizes
var arrPageSizes = ___getPageSize();
// Style overlay and show it
$('#jquery-overlay').css({
backgroundColor: settings.overlayBgColor,
opacity: settings.overlayOpacity,
width: arrPageSizes[0],
height: arrPageSizes[1]
}).fadeIn();
// Get page scroll
var arrPageScroll = ___getPageScroll();
// Calculate top and left offset for the jquery-lightbox div object and show it
$('#jquery-lightbox').css({
top: arrPageScroll[1] + (arrPageSizes[3] / 10),
left: arrPageScroll[0]
}).show();
// Assigning click events in elements to close overlay
$('#jquery-overlay,#jquery-lightbox').click(function () {
_finish();
});
// Assign the _finish function to lightbox-loading-link and lightbox-secNav-btnClose objects
$('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function () {
_finish();
return false;
});
// If window was resized, calculate the new overlay dimensions
$(window).resize(function () {
// Get page sizes
var arrPageSizes = ___getPageSize();
// Style overlay and show it
$('#jquery-overlay').css({
width: arrPageSizes[0],
height: arrPageSizes[1]
});
// Get page scroll
var arrPageScroll = ___getPageScroll();
// Calculate top and left offset for the jquery-lightbox div object and show it
$('#jquery-lightbox').css({
top: arrPageScroll[1] + (arrPageSizes[3] / 10),
left: arrPageScroll[0]
});
});
}
/**
* Prepares image exibition; doing a image´s preloader to calculate it´s size
*
*/
function _set_image_to_view() { // show the loading
// Show the loading
$('#lightbox-loading').show();
if (settings.fixedNavigation) {
$('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();
} else {
// Hide some elements
$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();
}
// Image preload process
var objImagePreloader = new Image();
objImagePreloader.onload = function () {
$('#lightbox-image').attr('src', settings.imageArray[settings.activeImage][0]);
// Perfomance an effect in the image container resizing it
_resize_container_image_box(objImagePreloader.width, objImagePreloader.height);
// clear onLoad, IE behaves irratically with animated gifs otherwise
objImagePreloader.onload = function () { };
};
objImagePreloader.src = settings.imageArray[settings.activeImage][0];
};
/**
* Perfomance an effect in the image container resizing it
*
* @param integer intImageWidth The image´s width that will be showed
* @param integer intImageHeight The image´s height that will be showed
*/
function _resize_container_image_box(intImageWidth, intImageHeight) {
// Get current width and height
var intCurrentWidth = $('#lightbox-container-image-box').width();
var intCurrentHeight = $('#lightbox-container-image-box').height();
// Get the width and height of the selected image plus the padding
var intWidth = (intImageWidth + (settings.containerBorderSize * 2)); // Plus the image´s width and the left and right padding value
var intHeight = (intImageHeight + (settings.containerBorderSize * 2)); // Plus the image´s height and the left and right padding value
// Diferences
var intDiffW = intCurrentWidth - intWidth;
var intDiffH = intCurrentHeight - intHeight;
// Perfomance the effect
$('#lightbox-container-image-box').animate({ width: intWidth, height: intHeight }, settings.containerResizeSpeed, function () { _show_image(); });
if ((intDiffW == 0) && (intDiffH == 0)) {
if ($.browser.msie) {
___pause(250);
} else {
___pause(100);
}
}
$('#lightbox-container-image-data-box').css({ width: intImageWidth });
$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ height: intImageHeight + (settings.containerBorderSize * 2) });
};
/**
* Show the prepared image
*
*/
function _show_image() {
$('#lightbox-loading').hide();
$('#lightbox-image').fadeIn(function () {
_show_image_data();
_set_navigation();
});
_preload_neighbor_images();
};
/**
* Show the image information
*
*/
function _show_image_data() {
$('#lightbox-container-image-data-box').slideDown('fast');
$('#lightbox-image-details-caption').hide();
if (settings.imageArray[settings.activeImage][1]) {
$('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();
}
// If we have a image set, display 'Image X of X'
if (settings.imageArray.length > 1) {
$('#lightbox-image-details-currentNumber').html(settings.txtImage + ' ' + (settings.activeImage + 1) + ' ' + settings.txtOf + ' ' + settings.imageArray.length).show();
}
}
/**
* Display the button navigations
*
*/
function _set_navigation() {
$('#lightbox-nav').show();

// Instead to define this configuration in CSS file, we define here. And it´s need to IE. Just.
$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ 'background': 'transparent url(' + settings.imageBlank + ') no-repeat' });

// Show the prev button, if not the first image in set
if (settings.activeImage != 0) {
if (settings.fixedNavigation) {
$('#lightbox-nav-btnPrev').css({ 'background': 'url(' + settings.imageBtnPrev + ') left 15% no-repeat' })
.unbind()
.bind('click', function () {
settings.activeImage = settings.activeImage - 1;
_set_image_to_view();
return false;
});
} else {
// Show the images button for Next buttons
$('#lightbox-nav-btnPrev').unbind().hover(function () {
$(this).css({ 'background': 'url(' + settings.imageBtnPrev + ') left 15% no-repeat' });
}, function () {
$(this).css({ 'background': 'transparent url(' + settings.imageBlank + ') no-repeat' });
}).show().bind('click', function () {
settings.activeImage = settings.activeImage - 1;
_set_image_to_view();
return false;
});
}
}

// Show the next button, if not the last image in set
if (settings.activeImage != (settings.imageArray.length - 1)) {
if (settings.fixedNavigation) {
$('#lightbox-nav-btnNext').css({ 'background': 'url(' + settings.imageBtnNext + ') right 15% no-repeat' })
.unbind()
.bind('click', function () {
settings.activeImage = settings.activeImage + 1;
_set_image_to_view();
return false;
});
} else {
// Show the images button for Next buttons
$('#lightbox-nav-btnNext').unbind().hover(function () {
$(this).css({ 'background': 'url(' + settings.imageBtnNext + ') right 15% no-repeat' });
}, function () {
$(this).css({ 'background': 'transparent url(' + settings.imageBlank + ') no-repeat' });
}).show().bind('click', function () {
settings.activeImage = settings.activeImage + 1;
_set_image_to_view();
return false;
});
}
}
// Enable keyboard navigation
_enable_keyboard_navigation();
}
/**
* Enable a support to keyboard navigation
*
*/
function _enable_keyboard_navigation() {
$(document).keydown(function (objEvent) {
_keyboard_action(objEvent);
});
}
/**
* Disable the support to keyboard navigation
*
*/
function _disable_keyboard_navigation() {
$(document).unbind();
}
/**
* Perform the keyboard actions
*
*/
function _keyboard_action(objEvent) {
// To ie
if (objEvent == null) {
keycode = event.keyCode;
escapeKey = 27;
// To Mozilla
} else {
keycode = objEvent.keyCode;
escapeKey = objEvent.DOM_VK_ESCAPE;
}
// Get the key in lower case form
key = String.fromCharCode(keycode).toLowerCase();
// Verify the keys to close the ligthBox
if ((key == settings.keyToClose) || (key == 'x') || (keycode == escapeKey)) {
_finish();
}
// Verify the key to show the previous image
if ((key == settings.keyToPrev) || (keycode == 37)) {
// If we´re not showing the first image, call the previous
if (settings.activeImage != 0) {
settings.activeImage = settings.activeImage - 1;
_set_image_to_view();
_disable_keyboard_navigation();
}
}
// Verify the key to show the next image
if ((key == settings.keyToNext) || (keycode == 39)) {
// If we´re not showing the last image, call the next
if (settings.activeImage != (settings.imageArray.length - 1)) {
settings.activeImage = settings.activeImage + 1;
_set_image_to_view();
_disable_keyboard_navigation();
}
}
}
/**
* Preload prev and next images being showed
*
*/
function _preload_neighbor_images() {
if ((settings.imageArray.length - 1) > settings.activeImage) {
objNext = new Image();
objNext.src = settings.imageArray[settings.activeImage + 1][0];
}
if (settings.activeImage > 0) {
objPrev = new Image();
objPrev.src = settings.imageArray[settings.activeImage - 1][0];
}
}
/**
* Remove jQuery lightBox plugin HTML markup
*
*/
function _finish() {
$('#jquery-lightbox').remove();
$('#jquery-overlay').fadeOut(function () { $('#jquery-overlay').remove(); });
// Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
$('embed, object, select').css({ 'visibility': 'visible' });
}
/**
/ THIRD FUNCTION
* getPageSize() by quirksmode.com
*
* @return Array Return an array with page width, height and window width, height
*/
function ___getPageSize() {
var xScroll, yScroll;
if (window.innerHeight && window.scrollMaxY) {
xScroll = window.innerWidth + window.scrollMaxX;
yScroll = window.innerHeight + window.scrollMaxY;
} else if (document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
xScroll = document.body.scrollWidth;
yScroll = document.body.scrollHeight;
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
xScroll = document.body.offsetWidth;
yScroll = document.body.offsetHeight;
}
var windowWidth, windowHeight;
if (self.innerHeight) { // all except Explorer
if (document.documentElement.clientWidth) {
windowWidth = document.documentElement.clientWidth;
} else {
windowWidth = self.innerWidth;
}
windowHeight = self.innerHeight;
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
windowWidth = document.documentElement.clientWidth;
windowHeight = document.documentElement.clientHeight;
} else if (document.body) { // other Explorers
windowWidth = document.body.clientWidth;
windowHeight = document.body.clientHeight;
}
// for small pages with total height less then height of the viewport
if (yScroll < windowHeight) {
pageHeight = windowHeight;
} else {
pageHeight = yScroll;
}
// for small pages with total width less then width of the viewport
if (xScroll < windowWidth) {
pageWidth = xScroll;
} else {
pageWidth = windowWidth;
}
arrayPageSize = new Array(pageWidth, pageHeight, windowWidth, windowHeight);
return arrayPageSize;
};
/**
/ THIRD FUNCTION
* getPageScroll() by quirksmode.com
*
* @return Array Return an array with x,y page scroll values.
*/
function ___getPageScroll() {
var xScroll, yScroll;
if (self.pageYOffset) {
yScroll = self.pageYOffset;
xScroll = self.pageXOffset;
} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict
yScroll = document.documentElement.scrollTop;
xScroll = document.documentElement.scrollLeft;
} else if (document.body) {// all other Explorers
yScroll = document.body.scrollTop;
xScroll = document.body.scrollLeft;
}
arrayPageScroll = new Array(xScroll, yScroll);
return arrayPageScroll;
};
/**
* Stop the code execution from a escified time in milisecond
*
*/
function ___pause(ms) {
var date = new Date();
curDate = null;
do { var curDate = new Date(); }
while (curDate - date < ms);
};
// Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once
// $('#FotoLinkButton').unbind('click').click(_initialize);
return this.unbind('click').click(_initialize);
};
})(jQuery); // Call and execute the function immediately passing the jQuery object

Hope this will be useful for you, too (since I worked quite much to find this out:)

Take care,
BCS

Dijkstra's Algorithm: Minimalist(!) C# Implementation

Hi all, In a previous post, I mentioned that I will challenge myself for writing Dijkstra's algorithm with minimum lines of code. The C# code is here as promised. Now first of all, this is possibly the worst implementation that can be done; and the only intention was to really do things in a short way in terms of Number of Lines used. The code is not maintainable and not even readable. Well, the trick comes from maintaining only a distance array and calculating all other stuff wherever required. My first version of this code was 8 lines (I was separately holding a list of nodes that was not reached) but then I realized that it was possible to calculate it using the distance array each time. Before going into the code let me introduce you the basic idea of the algorithm as I implemented.
As previously mentioned all edges have positive costs. Also we assume that the graph is connected. Let N be the nodes, i the source and j the sink node, A the distance matrix.
  • Maintain two lists U = {i} , V = N \ {i}
  • Set d[i] = 0 distance of i to i
  • While j is not reached
  • Find s in U, t in V such that d[s] + A[s,t] is minimum
  • Set d[t] = d[s] + A[s,t]
  • Take t from V and put to U
  • if t is j return dist[t]
Well, my code is even shorter than my pseudo-code. Here is the 4 line Dijkstra implementation (not counting the function definition and the closing bracket):
public static double DijkstraMinimal(double[,] A, int i, int j){
double[] dist = Enumerable.Range(0, A.GetLength(0)).ToList().Select(k => k==i ? 0.0 : -1.0).ToArray();
while (true){
dist[(Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(t => Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(t) ? double.MaxValue : dist[t] + A[t, k]).Min() }).First(t => t.len == Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(m => Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(m) ? double.MaxValue : dist[m] + A[m, k]).Min() }).Min(z => z.len))).idx] = (Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(t => Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(t) ? double.MaxValue : dist[t] + A[t, k]).Min() }).First(t => t.len == Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(m => Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(m) ? double.MaxValue : dist[m] + A[m, k]).Min() }).Min(z => z.len))).len;
if ((Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(t => Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(t) ? double.MaxValue : dist[t] + A[t, k]).Min() }).First(t => t.len == Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(m => Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(m) ? double.MaxValue : dist[m] + A[m, k]).Min() }).Min(z => z.len))).idx == j) return dist[j];}
}
The 4th line is 1150 characters. Lets put this into a more readable form, thanks to Resharper:
public static double DijkstraMinimalReadable(double[,] A, int i, int j)
{
double[] dist = Enumerable.Range(0, A.GetLength(0)).ToList().Select(k => k == i ? 0.0 : -1.0).ToArray();
while (true)
{
dist[
(Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(
k =>
new
{
idx = k,
len =
Enumerable.Range(0, A.GetLength(0)).Select(
t =>
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(t)
? double.MaxValue
: dist[t] + A[t, k]).Min()
}).First(
t =>
t.len ==
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(
k =>
new
{
idx = k,
len =
Enumerable.Range(0, A.GetLength(0)).Select(
m =>
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).
Contains(m)
? double.MaxValue
: dist[m] + A[m, k]).Min()
}).Min(z => z.len))).idx] =
(Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(
k =>
new
{
idx = k,
len =
Enumerable.Range(0, A.GetLength(0)).Select(
t =>
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(t)
? double.MaxValue
: dist[t] + A[t, k]).Min()
}).First(
t =>
t.len ==
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(
k =>
new
{
idx = k,
len =
Enumerable.Range(0, A.GetLength(0)).Select(
m =>
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).
Contains(m)
? double.MaxValue
: dist[m] + A[m, k]).Min()
}).Min(z => z.len))).len;
if (
(Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(
k =>
new
{
idx = k,
len =
Enumerable.Range(0, A.GetLength(0)).Select(
t =>
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Contains(t)
? double.MaxValue
: dist[t] + A[t, k]).Min()
}).First(
t =>
t.len ==
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).Select(
k =>
new
{
idx = k,
len =
Enumerable.Range(0, A.GetLength(0)).Select(
m =>
Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).
Contains(m)
? double.MaxValue
: dist[m] + A[m, k]).Min()
}).Min(z => z.len))).idx == j)
return dist[j];
}
}
And now a much more efficient implementation of the same thing without recalculations. I don't ever say that it is efficient, but it is just more efficient. The best way would be maintaining the both lists outside of the while loop and removing and inserting necessary elements before continuing.
public static double DijkstraMinimalEff(double[,] A, int i, int j)
{
double[] dist = Enumerable.Range(0, A.GetLength(0)).ToList().Select(k => k == i ? 0.0 : -1.0).ToArray();
while (true)
{
List<int> notfound = Enumerable.Range(0, A.GetLength(0)).Where(l => dist[l] == -1.0).ToList();
var x = notfound.Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(t => notfound.Contains(t) ? double.MaxValue : dist[t] + A[t, k]).Min() }).First(t => t.len == notfound.Select(k => new { idx = k, len = Enumerable.Range(0, A.GetLength(0)).Select(m => notfound.Contains(m) ? double.MaxValue : dist[m] + A[m, k]).Min() }).Min(z => z.len));
dist[x.idx] = x.len;
if (x.idx == j) return x.len;
}
}
I had great fun writing the 1150 char. line, hope all these were funny for you, too. Take good care, Baris

Stereo: Use Responsibly

Dear all,

I'm not an expert on music nor have any education on recording technologies etc. I am not an audiophile (and not rich enough to be one). I just love listening to music, and love listening it loudly.

Today, I was driving and experienced something that bothered me for so long. It was just my car's FM player and the song was something that I have never heard of (and I don't remember it right now, low quality popular music:) Then there were 3 beats, played on left-right-left speakers consecutively muting the other one.

Dear those who are recording / mixing / mastering these songs, please use stereo responsively!.. It is quite unpleasant for a "listener" like me that gives almost full attention to the music (even while driving). My attention gets lost in seconds, and by the way, it really sounds disturbing. Please check out the high-quality albums and see that what you do is almost never done - and I'm quite sure that they know how they can do it much better than you -

Take good care,
BCS

p.s: Everything in this post extends to surround systems without loss of generality. Unfortunately my car has only 2 speakers:)