о жизни, вебе, друзьях, семье и многом другом…
RSS icon Email icon Home icon
  • Процедура знакомства

    Типичная процедура знакомства с голландцем (американцем, итальянцем, французом и т.д.):

    Он: Привет, я – Джон Смит (Вася Пупкин, Карл Маркс и т.д.).
    Я: Привет, я – Дмитрий.
    Он: Дмитрий, ты откуда (из какой страны)?
    Я: Россия (гордо так)!
    Он: …пауза… Да ты наверное из восточной части России (варианты: у тебя монгольские корни? / просто недоверчивый взгляд и ожидание шутки / я представлял себе русских немного иначе)

    И каждый раз мне приходится углубляться в историю моей семьи и объяснять аборигену, как так получилось. И что странно, в Нидерландах 20% жителей имеют индонезийские корни, еще 20% турецкие, еще 20% марокканские, а поверить в то, что в России такое тоже возможно никто не может. Наверное, Россия для европейцев все еще кажется чем-то монолитным и однородным, как было (или казалось, что было) в советские времена.

  • Топ-10 бельгийского пива

    Не могу не поделиться ссылкой: http://zapizki.blogspot.com/2009/03/belgiyskoe-pivo-top-10.html. Всем читать и облизываться!

  • Экспорт содержимого GridView в Excel

    Очень часто при разработке веб-приложений на asp.net возникает задача осуществления эскпорта данных из GridView в экселевский файл. При этом каждый начинает придумывать свой велосипед, потому что можно придумать с десяток различных методов как это сделать. Я предлагаю на мой взгляд самый простой вариант.

    Сразу хочу отметить, весь приведенный код написан на VB.NET. Так произошло не потому, что мне так нравится, а потому что так принято в компании, в которой я работаю. Если вы хотите получить этот код на C#, просто воспользуйтесь онлайн конвертером, например, http://www.developerfusion.com/tools/convert/vb-to-csharp/.

    Итак, что нам нужно:

    1. Вспомогательный класс. Я назвал его ExcelExportHelper. Его код приведен ниже

    Imports System
    Imports System.Data
    Imports System.Configuration
    Imports System.IO
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    
    Public Class ExcelExportHelper
    
        Public Shared Sub PrepareAndExport(ByVal fileTitle As String, ByVal gv As GridView, ByVal showGrid As Boolean)
            Dim filename As String
            filename = String.Format("{0}_{1}.xls", fileTitle, DateTime.Now().ToString("yyyyMMdd_HHmmss"))
            gv.AllowPaging = False
            gv.DataBind()
            ExcelExportHelper.Export(filename, gv, showGrid)
        End Sub
    
        Public Shared Sub Export(ByVal fileName As String, ByVal gv As GridView, ByVal showGrid As Boolean)
            HttpContext.Current.Response.Buffer = True
            HttpContext.Current.Response.ClearContent()
            HttpContext.Current.Response.ClearHeaders()
            'HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"
            HttpContext.Current.Response.ContentType = "application/ms-excel"
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename = " + fileName)
    
            Dim sw As StringWriter = New StringWriter
            Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
            '  Create a form to contain the grid
            Dim table As Table = New Table
            If (showGrid) Then
                table.GridLines = gv.GridLines
            Else
                table.GridLines = GridLines.None
            End If
    
            '  add the header row to the table
            If (Not (gv.HeaderRow) Is Nothing) Then
                PrepareControlForExport(gv.HeaderRow)
                table.Rows.Add(gv.HeaderRow)
            End If
            '  add each of the data rows to the table
            For Each row As GridViewRow In gv.Rows
                PrepareControlForExport(row)
                table.Rows.Add(row)
            Next
            '  add the footer row to the table
            If (Not (gv.FooterRow) Is Nothing) Then
                PrepareControlForExport(gv.FooterRow)
                table.Rows.Add(gv.FooterRow)
            End If
            '  render the table into the htmlwriter
            table.RenderControl(htw)
            '  render the htmlwriter into the response
            HttpContext.Current.Response.Write(sw.ToString)
            HttpContext.Current.Response.End()
        End Sub
    
        ' Replace any of the contained controls with literals
        Private Shared Sub PrepareControlForExport(ByVal control As Control)
            Dim i As Integer = 0
            Do While (i < control.Controls.Count)
                Dim current As Control = control.Controls(i)
                If (TypeOf current Is LinkButton) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, LinkButton).Text))
                ElseIf (TypeOf current Is ImageButton) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, ImageButton).AlternateText))
                ElseIf (TypeOf current Is HyperLink) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, HyperLink).Text))
                ElseIf (TypeOf current Is DropDownList) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, DropDownList).SelectedItem.Text))
                ElseIf (TypeOf current Is CheckBox) Then
                    control.Controls.Remove(current)
                    control.Controls.AddAt(i, New LiteralControl(CType(current, CheckBox).Checked))
                    'TODO: Warning!!!, inline IF is not supported ?
                End If
                If current.HasControls Then
                    PrepareControlForExport(current)
                End If
                i = (i + 1)
            Loop
        End Sub
    End Class

    Вкратце, что делает этот класс: есть два статичных публичных метода: PrepareAndExport и Export.

    Метод PrepareAndExport убирает в GridView разбивку на страницы, для того чтобы получить в экселевском файле все записи со всех страниц. Так же этот метод определяет имя целевого файла. В моем случае к переданной строковой переменной будет прибавлено текущее время. После этого PrepareAndExport вызывает метод Export, который собственно и генерирует output. PrepareControlForExport нужен для замены пользовательских контролов в GridView, эти контролы нужны на веб-странице, но совершенно бессмысленны в Excel.

    2. Размещаем на asp странице кнопку для осуществления экспорта:

    
    <asp:ImageButton ID="ibExportToExcel" runat="server" 
    
        ImageUrl="~/Img/export-excel.png"
    
        OnClick="ibExportToExcel_Click">
    

    Привязываем в ней onClick событие ibExportToExcel_Click.

    3. Реализуем это событие в code-behind страницы:

    
    Protected Sub ibExportToExcel_Click(ByVal sender As System.Object, 
    
             ByVal e As System.Web.UI.ImageClickEventArgs)
         ExcelExportHelper.PrepareAndExport(Page.Title, gvContent, True)
     End Sub
    

    Ну вот собственно и все, теперь при нажатии на кнопку экспорта произойдет вызов метода PrepareAndExport класса ExcelExportHelper. В качестве параметров этому методу передаем Page.Title (либо любую другую строку в качестве имени файла), GridView, который нужно экспортировать, и true (отображать границы таблицы в экселе).

     

    Теперь несколько “НО”:

    1. Если у клиента установлен Microsoft Excel 2007, то при открытии сгенерированного файла мы получим Security Alert.

    image

    Дело в том, что мы пытаемся подсунуть Excel-ю сгенерированный нами html файл. Он это понимает и сообщает, что содержание файла не соответствует его расширению. К сожалению, нормального пути обойти это сообщение нет. Единственное, что можно сделать – покопаться в реестре:

    [HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\Excel\Security]

    “ExtensionHardening”=dword:00000000

       1. Open your Registry (Start -> Run -> regedit.exe)

       2. Navigate to HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\12.0\EXCEL\SECURITY

       3. Right click in the right window and choose New -> DWORD

       4. Type “ExtensionHardening” as the name (without the quotes)

       5. Verify that the data has the value “0?

    2. Если кнопка ibExportToExcel находится в Update Panel, то необходимо добавить ее в триггер:

    <asp:UpdatePanel ID="upContent" runat="server" UpdateMode="Always">
            <Triggers>
                <asp:PostBackTrigger ControlID="ibExportToExcel" />
            </Triggers>

  • Мой первый сайт

    Свой первый сайт я сделал в 2001 году. Он был посвящен поездке группы школьников из обычной самарской школы в замечательный американский городок Eaton Rapids. Я, естественно, был среди этих школьников :)

    У сайта было две версии: оригинальная, сделанная в течении пары недель в начале 2001 года, и вторичная, сделанная лично мной несколько позже. Вообще говоря, над оригинальным сайтом трудилось порядка 10-15 человек, и он был сделан, как говорится, "с душой", но версткой занимался в основном я.

    Сегодня я случайно нашел обе версии на своем необъятном переносном жестком диске и решил, что должен поделиться с общественностью)

    Оригинальная версия лежит по адресу: http://www.dimants.ru/slp_iatp_ru

    Переделанный вариант по адресу: http://www.dimants.ru/slp_iatp_ru_2

    Должен отметить, что, посмотрев на оба эти сайта сейчас 4 марта 2009 года, мне кажется, что они сделаны совсем неплохо. Особенно оригинальный вариант. Переделанный потерял какую-то часть своей самобытности и стал обычным непонятным фиолетовым пятном :). К тому же он работает только в самом свежем браузере IE 5!

     

    Товарищи, прокомментируйте, что вы думаете :)

  • Статистика по поисковым запросам с 16 по 22 февраля 2009 года

    Ниже список поисковых запросов, которые люди набирали в Яндексе и в результатах которых отображался мой сайт.

    Запрос Показы Позиция
    парадокс монти холла
    22 7
    flvplayer.swf
    18 5
    flv плеер для сайта
    17 9
    вставка видео на сайт
    13 1
    flv плеер на сайт
    11 5
    php smtp
    10 10
    жизненно
    8 4
    www.ladachess.ru
    7 4
    мое дерево
    6 8
    flv на сайт
    5 3
    flv видео
    5 10
    class.phpmailer.php
    4 5
    как скачать flv с сайта
    4 15
    flv проигрыватель
    4 32
    копирование flv с сайта
    3 3
    техносила магазин
    3 49
    скачать видео в формате flv
    3 14
    парадокс монти-холла
    3 6
    скачать проигрыватель для формата flv
    3 9
    youtube flv
    3 7
    ladachess
    3 8
    видео flv
    3 19
    видео формата flv
    3 30
    гибдд
    3 7
    парадокс с тремя дверьми
    3 8
  • Рекомендации по Таиланду

    Весной прошлого 2008 года мы ездили в Таиланд, а точнее в Паттайю. А примерно за полгода до этого туда же ездили мои родители. Так вот моя мама написала нам список рекомендаций, что нужно посмотреть, куда сходить и чего делать ну никак нельзя. Я думаю, это небольшое описание может быть полезно для тех, кто собирается съездить в Таиланд, по собственному опыту скажу, что нам оно пригодилось.
    Итак, выкладываю с очень незначительной правкой:


    О Тайланде.

    Самое главное правило туриста- быть вежливым ,спокойным и выдержанным, всегда улыбаться ,и тогда никаких проблем с местным населением не будет. Важно помнить, что, если таец начинает истерически смеяться, то это значит вы довели его до «ручки». Смех – это способ самозащиты от излишне агрессивного европейского туриста.

    О Паттайе.

    Центральная часть города состоит из трех идущих параллельно морю улиц: 1-ая, 2-ая, 3-ая. Поскольку вы будете жить в центре, то прогулки и шоппинг можно делать не пользуясь безумными тук-туками. Наиболее проходимы ( в плане пеших прогулок) 1-ая и 2-ая улицы: там много больших и мелких магазинов, безумное количество едален ( кафешками и ресторанами эти заведения назвать трудно). Честно говоря, мы не решились поесть на улице ни разу.

    О еде.

    Между 1-ой и 2-ой улицами стоит самый классный (в смысле звездности) торговый центр-Royal Garden Plaza. На последнем этаже находится сеть ресторанов. Там есть и японский, и итальянский, и еще какой-то, но самое интересное – это комплекс питания, где можно поесть блюда разных стран одновременно и недорого. При входе необходимо на кассе взять карточку за 1000 бат на каждого. Не пугайтесь, на выходе все не использованные деньги вернут, но как правило даже нам этой суммы было много. Выбор там просто огромный: начиная от стейков, всевозможных блюд тайской, китайской, русской, итальянской и кончая очень вкусными десертами.
    Обычно мы тратили там где-то 1200бат(на двоих) Это наиболее приемлемое место для питания: прилично и относительно недорого. Кстати, попробуйте коктейли из фруктов со льдом.
    При заказе блюд тайской кухни обязательно предупредите чтобы делали не острое (no spicy), даже для нас все оказалось очень острым.
    В этом же торговом центре на первом этаже есть Макдональдс. Больше поблизости я что-то Макдональдса не встречала.
    Кстати, в этом торговом центре самый приличный шоппинг. Все остальные торговые центры больше похожи на рынок, но несколько дешевле, чем в Plaza..
    На Walking street стоит целый ряд ресторанов с морепродуктами, там же подают и мясо.

    Что стоит посмотреть.

    Думаю, что в Бангкок ездить не стоит тратить драгоценное время, потому что и в Паттайе полно интересного. Во первых, надо обязательно покататься на слонах, во-2-х, шоу трансвеститов Тиффани (не пожалейте деньги на представление Тиффани, оно наиболее красочное). Постарайтесь попасть в тропический сад Нонг-Нуч. Сам сад очень красив и интересен, там можно увидеть сотни видов архидей, небольшой зоопарк, покататься на слонах, сфотографироваться с тигром, посмотреть представление со слонами (просто обалденное!), а, главное поучаствовать в романтическом ужине и запустить горящий фонарик в небо (очень романтичное и красивое действие).
    Во время обзорной экскурсии в буддийском храме завяжите веревочку на руку у монаха и загадайте желание, выпустите птичек на волю, предварительно купив у подножия горы. В конце экскурсии вас обязательно привезут в ювелирный центр.
    Если все-таки решитесь посмотреть на крокодилов или змей, то советую крокодиловую ферму. Территория фермы очень большая. В одном месте находятся и сад камней, и приличный зоопарк, и можно сфотографироваться со слонами (кстати, там есть маленький слоненок, недавно родившийся), и еще можно покормить огромных рыбин в прудах. Ну естественно и крокодилы в огромном количестве: это и представление с крокодилами, и кормежка их. По времени вся поездка занимает где-то полдня. Представления идут по графику ( где-то каждый час), поэтому, если поедете самостоятельно, то предварительно узнайте когда удобнее туда поехать.
    Очень жаль, что не успеете съездить на реку Квай. Впечатлений от поездки море. Но, я думаю, что все у вас еще впереди.
    В Паттайе есть еще крокодиловая и змеиная фермы. Туда можно ехать, если очень захочется острых ощущений. Вот Аквариум совсем неинтересный. Если останутся деньги и время можно съездить в Мини Сиам (там прикольно). Мини Сиам работает в светлое время суток (где-то до 18-00-19-00). Рядом с Сиамом вечером работает огромный рынок со всевозможной едой. Сплошная экзотика! Доехать туда и обратно можно на тук-туке.

    Шоппинг.

    Сувениры лучше покупать в большом сувенирном магазине Lukdod. Вероятнее всего, что вас привезут туда во время обзорной экскурсии. Там же находится большой ювелирный центр. Почему лучше покупать в магазине, а не на улице: во 1-х, там прохладно и удобно, во 2-х, цены не очень отличаются от уличных, в 3-х, выбор просто огромный. Приехав в ювелирный центр можно остаться там подольше и самостоятельно добраться от туда домой (даже пешком).
    Я уже отмечала, что Plaza, мне понравился больше всего, и в плане торговых марок, и в плане выбора. Дешево и более менее прилично- это Big C.

    Необходимо помнить!

    Отношение тайцев к деньгам буддийское: равнодушное. Поэтому они не воспринимают мелочь как деньги. В виду этого расплачиваться ЖЕЛАТЕЛЬНО бумажными купюрами ( даже чаевые для горничной), а вот с бумажными деньгами необходимо обращаться очень аккуратно, поскольку на купюре изображен король, а для тайцев это свято. Гиды рассказывают, что был случай, когда туриста посадили в тюрьму за то, что тот разорвал купюру. В общем, это все очень серьезно.

    О чаевых.

    Горничной в отеле в два- три дня по 20 Бат. Носильщикам- 10-20бат, в ресторане как обычно-10%.

    Как одеваться.

    Шорты и майка, сланцы. Кстати тротуары в Паттайе не ахти какие, поэтому на каблуках ходить там просто мучение (из личного опыта).

    Телефон

    Телефонную сим карту можно купить в магазинах «Seven 11», там же продавец может ее подключить. Самостоятельно почти ни у кого это не получается из-за незнания тайского языка. Сразу же положите еще немного денег.
    При отъезде не забудьте поменять оставшиеся баты, потому что вывозить национальные деньги нельзя ( карается по закону).

    О транспорте.

    Конечно же тук-тук. Хоть это и опасно, и неудобно, но как побывать в Тайланде и не поездить на тук-туке. В центре по прямой совсем недорого ( 10-20бат), можно договариваться как с обычными такси, предварительно оговорив цену, тогда водители никого не подсаживают. К примеру, до своего отеля ( в 15-20км от центра) мы обычно доезжали за 200-250 бат. Главное надо обязательно торговаться.

    О Walking street.

    Гуляйте, глазейте, но в никакие контакты с местным населением не входите! Говорят, что специально подсовывают наркотики ( особенно молодежи), а полиция тут как тут. У полицейских есть свой план по наркотикам. Ни в коем случае не поддавайтесь на всевозможного рода провокации, с тайской полицией лучше не иметь никаких дел.
    Обязательно носите с собою ксерокопии паспортов.

    При входе куда-либо сложите ладони у лица в районе подбородка и, улыбаясь, говорите: « сабодикап»- так здороваются мужчины, женщины- сабодика.
    Уровень подъема ладоней у лица очень важная деталь. Чем выше положение в обществе, тем выше необходимо поднимать ладони. И так,
    САБОДИКАП- здравствуйте ( сабодика)
    КАПУНКАП – спасибо ( капункап)