Wednesday, July 22, 2009

Сергей Тармашев. «Древний». Катастрофа, Корпорация, Война.

Закончил читать трилогию «Древний». Очень понравилось. Хороший сюжет, продуманная динамика, не видно ляпов, разве что иногда в последней книге, чужие – представители Инсектората, в разговоре и в мыслях оперируют чисто человеческими образами. Но я думаю это сделано для упрощения восприятия. Действие трилогии начинается в недалеком будущем (2111 год), когда на Земле заканчиваются углеводороды и из-за них все чаще и чаще возникают боевые столкновения. В этой очень агрессивной среде бешеными темпами развиваются военная и сопутствующая ей отрасли (медицина, технологии). Строятся бункера – подземные убежища на случай ядерной войны, которые в мирное время используются как крупные научные/развлекательные/жилые/медицинские комплексы. В общем, в один прекрасный день, наступает жалкая пародия на ахр заман, и все начинают долбить друг друга ракетами с ядерными боезарядами. Спасается лишь небольшая часть населения, и именно в таких вот бункерах. Самый большой бункер находится недалеко от Новосибирска. В общем, охрана этого бункера – закаленные во множестве локальных конфликтов ветераны, – и являются главными героями книги. На первых порах, спасая бункер от внешних угроз, они получают смертельную дозу радиации и должны погибнуть через месяц, но местные ученые погружают их в анабиоз и будят лишь тогда, когда бункеру угрожает опасность. Через сотни лет в бункере живет лишь легенда о спящих «Древних», которые проснутся лишь в тот момент когда человечеству будет угрожать смертельная опасность... И...конечно же всех спасут... Дальше больше... :)

UPD:
Вспомнил пару ляпов :). Программа «Пирогов» могла работать без процессора на любом носителе информации, создавая на нем «виртуальный программный процессор». Кроме того, данная программа могла «перетекать» из одного сегмента в другой и даже на пресловутую флешку, сжимая терабайты своего собственного кода в байты. Самое интересное, что она (программа «Пирогов») потом спокойно могла «вытечь» с флешки и разрастись по сети распаковавшись из нескольких байт в терабайты. В общем вот такое вот чудо техники, принципиально невозможное в нашей Вселенной.

Saturday, July 11, 2009

Get letter code for a column index in Excel

Very often, when working with Excel via COM, selecting of particular range of cells might be required. For this purpose method get_Range() of Microsoft.Office.Interop.Excel._Worksheet class. It works only if we pass a range in the letter-digit format. Letters for columns and digits for rows, for instance call of get_Range("A9", "IV9") will get range of whole 9th row of the sheet. Sometimes, we do not know a letter code for current column. Usually we have several loops that iterate cells, forming ranges and putting data into Excel. I was surprised when found out what there is no way to get range without knowing a letter codes for particular columns. Of course we still can get a cell by calling Cells[i,j] property, but it is very slow way of forming a sheet. If we, for example, need export a large array of doubles to Excel, it is not very clever to iterate through the array and export its values one by one. Much better approach instead is to select a range that equals to size of the array and call set_Value() method passing the array into it. It is much faster and more convenient.
So I decided to write converter that will convert column index (0-255) to corresponding letter code (A-IV). The algorithm of columns’ naming used by Excel is pretty simple:

A-Z : 1-26
AA-AZ : 27-52
BA-BZ : 53-78
CA-CZ : 79 - 104
... : ...
IA-IV : 235-255

The regularity is obvious here, thus I wrote following code:

public static string GetExcelLetterCodeForColumnIndex(int columnIndex)
    {
      const string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      const byte lettersCount = 26;

      if (columnIndex < 0 || columnIndex > 255)
        throw new ArgumentOutOfRangeException("columnIndex is out of the range [0..255]");

      if (columnIndex < lettersCount)
        return alphabet[columnIndex].ToString();

      byte firstIndex = (byte)Math.Floor((double)(columnIndex/lettersCount - 1));
      byte secondIndex = (byte)(columnIndex - (firstIndex + 1)*lettersCount);
    
      return String.Format("{0}{1}", alphabet[firstIndex], alphabet[secondIndex]);
    }

* This source code was highlighted with Source Code Highlighter.

This method is safe and can be used without doubt. Here are testing code and test results:
[Test]
    [Category(("Utils_Tests"))]
    public void GetExcelLetterCodeForColumnIndex()
    {
      try
      {
        Utils.GetExcelLetterCodeForColumnIndex(-434923);
        Assert.Fail();
      }
      catch(ArgumentOutOfRangeException)
      {
        
      }

      try
      {
        Utils.GetExcelLetterCodeForColumnIndex(Int32.MaxValue);
        Assert.Fail();
      }
      catch (ArgumentOutOfRangeException)
      {

      }

      Assert.AreEqual("A",Utils.GetExcelLetterCodeForColumnIndex(0));
      Assert.AreEqual("IV", Utils.GetExcelLetterCodeForColumnIndex(255));

      const string alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
      const byte lettersCount = 26;
      byte currentIteration = 0;
      do
      {
        for (byte i = 0; i < alphabet.Length; i++)
        {
          for (byte j = 0; j < alphabet.Length; j++)
          {
            string testString = currentIteration < lettersCount
                     ? alphabet[j].ToString()
                     : String.Format("{0}{1}", alphabet[i-1], alphabet[j]);
            Assert.AreEqual(testString, Utils.GetExcelLetterCodeForColumnIndex(currentIteration));
            Debug.WriteLine(String.Format("{0}-{1}",testString, currentIteration));
            
            if (++currentIteration == byte.MaxValue)
              return;
          }
        }
      } while (true);
    }

* This source code was highlighted with Source Code Highlighter.


Initially I used byte variable as an input parameter and didn’t perform any check. But it is not convenient always to use byte variables in code and it is not safe to perform castings before passing int values into the method.

Wednesday, July 08, 2009

Russian mosques.

Today I’ve finished with implementation of “Map of Russia” feature for “Russian mosques” project. It looks like shown on the picture bellow. All icons are clickable.


Tuesday, July 07, 2009

Books

Закончил читать «Подростка» Достоевского, в очередной раз убедился, что Федор Михайлович законный пациент Кащенко. Это, каким надо быть психом, чтобы настолько срастаться со своими персонажами? Одно дело со стариком каким-нибудь, а тут с пацаном 20-тилетним – подростком. Очень хорошая книга. Хоть он славянофил и антисемит и наводит ложь на Ислам (временами), но пишет он, надо отдать ему должное, хорошо – всеми нервами наружу, отчего и за душу хватает, и думать заставляет.

Monday, July 06, 2009

Ислам в Судане... мда...

Недавно на одном из арбатских развалов, купил за 35 р. книжку «Религии стран Африки». Купил просто так, потому что долго шарился по прилавку, привлеченный лозунгом – «Все за 35р.», но ничего путного, за что не жалко было бы отдать такие деньги, кроме этой книжки не нашел :) Книга издана в 1967 году Институтом Африки Академии Наук СССР.

Открыл ее в первом попавшемся месте и реально припух.
Цитирую:


...В Республике Судан, как ни в одной другой мусульманской стране Африки, действует большое количество орденов, а именно:

  1. Кадарийя (Кадария, иногда называется Джайланийя) – наиболее многочисленный орден, имеющий более семи подразделений. Распространен большей частью в четырех северных провинциях – Северной, Кордофане, Голубой Нил и Кассаеле среди арабов, беджа и частично нубийцев.
  2. Бедавийя. Проник в Судан из Египта в начале XIX в. Имеется большое количество последователей среди арабов в крупных городах севера (Вади-Хальфа).
  3. Саманийя существует в Судане с начала XIX в. Его приверженцы – арабы провинции Голубой Нил и племя хамар в Кордофане.
  4. Шадилийя (или Магдубийе). В Судане распространился с XVIII в. В настоящее время имеет приверженцев главным образом в крупных городах севера (Хартуме, Бербере, Дамере), а также в горах по побережью Красного моря – среди бенджа
  5. Идрисийя и Рашидийя (ответвление ваххабизма) распространены среди населения Центрального и Восточного Судана. В Омдурмане имеется мечеть ордена Рашидийя.
  6. Орден Кхатмийя (или Миргханийя) широко распространен среди арабов Кордофана, в городах севера (в Хартуме, Бербере, Донгле, Вади-Хальфе), среди беджа в горах на побережье Красного моря, в районах Кассала, Гедареф, Галлабат.
  7. Исмаилийя. Этот один имеет приверженцев среди арабов Кордофана, особенно в районе эль-Обейд (среди арабских племен назир и бадаирийя).
  8. Тиджанийя. В Судане появился в XX в. В настоящее время имеютсая небольшие распространен особенно в Дарфуре (среди народов загава, маба, фор, тама, даго и др.), затем в Кордофане, Бахр-эль-Газале и в крупных городах.
  9. Сенусийя (орден сенуситов). В настоящее время имеются небольшие группы последователей этого ордена в Дарфуре.
  10. Ансари (или ансар). Эта мусульманская секта широко распространенна в Северных провинциях Судана.

    Ислам играет большую роль в народном просвещении в северных, мусульманских провинциях...
Я в шоке, дорогая редакция, от такого количества сектантов на квадратный метр. И это, заметьте 67-й год прошлого столетия. Почти все упомянутые выше секты это суфийские тарикаты. Богата Суданская земля чудесами, однако :).

Sunday, July 05, 2009

New version of "Russian Mosques"

New version of "Russian mosques" web-site has been just released.

Release Notes - Version 1.3 beta

Bug

  • [RM-70] - ShowCity.aspx: Postback doesn't occur when user changes current language.
  • [RM-73] - RelatedLinks control doesn't work properly.
  • [RM-74] - ErrorPage.aspx is not shown on error.
  • [RM-75] - AddEditCity.aspx is broken. Fix it!
  • [RM-81] - ForeignKeyReferenceAlreadyHasValueException occurs when editing/adding info for some cities.
  • [RM-87] - LoginPage.aspx: Object reference not set to an instance of an object when trying to open it in new browser window.
  • [RM-89] - AddEditMosque.aspx: City name displayed in English even if current language is Russian.

Improvement

  • [RM-76] - Increase size difference for a links cloud to clearly distinguish links in the cloud.
  • [RM-77] - ShowMosque.aspx: Add region name and a link to current city to the top of the page.
  • [RM-79] - Redesign the site.
  • [RM-82] - Localize Login control.
  • [RM-85] - Search optimization: On a citite's page add name of the city and "mosques" word to the title.
  • [RM-86] - Fix photo uploading controls' layout.
  • [RM-88] - AddEditCity.aspx: Fix layout of coat of arms adding control.

New Feature

  • [RM-71] - Add a link cloud to the main page.
  • [RM-83] - Create Statistics block.
  • [RM-84] - Create Random mosque block.