Home
h_323's Journal
 
[Most Recent Entries] [Calendar View] [Friends]

Below are the 20 most recent journal entries recorded in h_323's LiveJournal:

    [ << Previous 20 ]
    Tuesday, September 28th, 2010
    11:31 am
    TODO:
    TFS + powershell )

    =================================
    python )

    =================

    депенденции )

    ========================================================

    неиспользуемый код )

    ===============================================
    vdproj, deployment, vista, links )

    =====================================

    Crash Reporting )
    Thursday, September 10th, 2009
    6:56 pm
    Русские буквы
    Проблема возникла с Vim'ом. Если запускать его из cmd.exe, то русские буквы отображаются кракозябрами, если из Powershell, то часть букв не печтатается. Пытался играть с настройками вима, но оказалось, что дело в настройках виндовой консоли. Если отказаться от Raster Fonts для консоли, то все отображается нормально. Но отказываться приходится в пользу Lucida Console, а мне он что-то не слишком нравится.
    Сущестсвует способ добавления фонтов в консоль:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont
    Имеется
    0 : Lucida Console
    Добавляем еще каких-нибудь фонтов следующим образом
    00 : Courier New
    000 : Consolas
    И т.д.: добавляешь ноль и прописываешь фонт.Мне понравился Consolas
    Monday, September 7th, 2009
    1:07 pm
    Sunday, August 2nd, 2009
    10:30 pm
    PowerShell: поиск/замена в файлах
    # Найти какую-то строчку в текстовом файле без запуска редактора. 
    # Пример, поиск номеров телефонов по маске:
    type d:\my\phonebook.csv | ? {$_ -like '*pizza*'}
    
    # Поиск можно организовать и по папкам
    '*.h', '*.cpp' | % { ls d:\projects $_ -rec} | % {type $_.FullName} | ? {$_ -like '*RegOpenKeyEx*'}
    #просто балдею от пайплайнов :)
    
    # Пакетная замена в файлах. Cохранить исходные файлы, скопировав их в <filename>.bak
    # http://blog.commandlinekungfu.com/2009/05/not-ready-yet-episode-replacing-strings.html
    # cp - Copy-Item; gc, type - Get-Content; sc - Set-Content
    $a = (gci | ? {$_.Attributes -ne "Directory"}); $a | % { cp $_ "$($_).bak";
    (gc $_) -replace "foo","bar" | sc -path $_ }
    
    Thursday, July 30th, 2009
    11:16 pm
    Навигация по стеку во время отладки.
    Проблема формулируется следующим образом.
    В студии (MSVS, VC++) в режиме отладки часто нужно посмотреть на код выше или ниже по стеку. Очень часто нужно выбрать фрейм выше или ниже текущего на единицу. (Например, остановиться на брейкпоинте, посмотреть откуда этот код зовется, потом откуда зовется уже этот следующий код, потом вернуться обратно).
    С точки зрения последовательности клавиатурных комбинаций каждая такая итерация выглядит так:
    1. Alt-7 (или Ctr-Alt-C) - переключиться из редактора в окно Call Stack
    2. стрелка вниз (или вверх)
    3. Enter

    Если бы не так часто возникал этот use-case, то данную последовательность шоткатов можно было бы вынести. Стало быть, пишется пара макросов: PreviousStackFrame и NextStackFrame.

    Function StackFrameIndex(ByRef aFrames As EnvDTE.StackFrames, ByRef aFrame As EnvDTE.StackFrame) As Long
        For StackFrameIndex = 1 To aFrames.Count
            If aFrames.Item(StackFrameIndex) Is aFrame Then Exit Function
        Next
        StackFrameIndex = -1
    End Function
    
    Sub NavigateStack(ByVal aShift As Long)
        If DTE.Debugger.CurrentProgram Is Nothing Then
            DTE.StatusBar.Text = "No program is currently being debugged."
            Exit Sub
        End If
    
        Dim ind As Long = StackFrameIndex(DTE.Debugger.CurrentThread.StackFrames, DTE.Debugger.CurrentStackFrame)
        If ind = -1 Then
            DTE.StatusBar.Text = "Stack navigation failed"
            Exit Sub
        End If
    
        ind = ind + aShift
        If ind <= 0 Or ind > DTE.Debugger.CurrentThread.StackFrames.Count Then
            DTE.StatusBar.Text = "Stack frame index is out of range"
            Exit Sub
        End If
    
        DTE.Debugger.CurrentStackFrame = DTE.Debugger.CurrentThread.StackFrames.Item(ind)
        DTE.StatusBar.Text = "Stack frame index: " & ind & " of " & DTE.Debugger.CurrentThread.StackFrames.Count
    End Sub
    
    Sub PreviousStackFrame()
        NavigateStack(1)
    End Sub
    
    Sub NextStackFrame()
        NavigateStack(-1)
    End Sub
    
    Wednesday, July 29th, 2009
    3:34 pm
    Моя студия

    1. Хочется, чтобы по переходу в Solution Explorer можно было включать(отключать) отслеживание активного файла в окне редактора.
      Tools -> Customize -> Commands -> (Categories:) View -> (Commands:) Track Activity in Solution Explorer.
      Вытащить ее на вкладку View и добавить '&' перед 'k', поскольку эта буква больше нигде не задействуется
    2. Нужно, чтобы при вставке/удалении нескольких строк автоматически вставлялись табы.
      Tools -> Options -> Text Editor -> C/C++ -> Indenting -> Smart
    3. Навигация по стеку: PreviousStackframe (Ctrl+`), NextStackframe (Ctrl+Shift+`)
    4. SelectCurrentLine. (Text Editor; Ctrl+Shift+Arrow Down)
      script )
      Monday, July 27th, 2009
      11:22 pm
      Список подкастов через PowerShell
      Хочется послушать последние подкасты, которые пришли
      #сохранить список последних подкастов из нужных фидов в файл
      $podcasts = ls 'D:\Podcasts\Directions Media', 'D:\Podcasts\Planetary Radio', `
          'D:\Podcasts\Very Spatial Podcast' *.mp3 | sort lastwritetime | select -last 6 | % {$_.FullName}
      #имя m3u файла
      $m3u_path = $env:userprofile + '\lastpodcasts.m3u'
      #вывести в файл
      $podcasts > $m3u_path
      #запустить плеер с полученным m3u
      & ($env:ALLUSERSPROFILE + '\Start Menu\Programs\K-Lite Codec Pack\Media Player Classic.lnk') $m3u_path
      
      Friday, July 24th, 2009
      10:34 pm
      Labelling in ArcMap
      Проблема, которая возникает при переносе геоданных из одного формата в другой (Инструмент "Extract Map"). В разных форматах различные ограничения на наименования полей (ограничение на длину поля, допустимые символы, зарезервированные слова и т.д.). Собственно, с самими полями инструмент уже работает, и аттрибутивная таблица вполне конвертируется. Но проблема с лейблингом. Внутри себя лейблинг - это текст скрипта, который содержит в себе поля. Данный скрипт и задает лейблы для фич. При конвертации нужно этот скрипт поправить с учетом изменившихся имен полей. Вот код, который позволяет определить поля, используемые в лейблинге слоя (потом их еще нужно будет переназначить

      VBScript )
      Tuesday, July 7th, 2009
      9:45 pm
      Нашелся еще один славный тьюториал по Google App Engine + Django от Thomas Brox Røst (+ русский перевод)

      Возникает проблема при запуске django-admin.py:
      C:\>c:\google_appengine\lib\django\django\bin\django-admin.py
      Traceback (most recent call last):
        File "c:\google_appengine\lib\django\django\bin\django-admin.py", line 2, in <module>
          from django.core import management
      ImportError: No module named django.core
      
      
      Тот же Thomas Brox Røst говорит, что дело видимо в том, что питон не может найти инсталляцию Django. Нужно симлинком поместить джанго в заданное место. И ваш питон найдет вашу джангу. Виндовое название для симлинков — reparse points. Их можно сделать с помощью утилиты Junction (см. также)
      C:\> junction.exe C:\Python25\Lib\site-packages\django C:\google_appengine\lib\django\django
      


      Ну вот, в общем (http://dvkdemo.appspot.com). Демо просто дописывает IP посетителя.
      Monday, July 6th, 2009
      7:07 pm
      Грабли со строками
      Трагическое несоответствие С-строк и STL. С-строка хочет завершающий нуль. Так указатель узнаёт, что она закончилась. STL пользуется своим механизмом для этих целей. WinAPI использует С-строки, поэтому со своими std::string'ами нужно исполнить что-то вроде

      std::string stl_string = "so what?"
      CHAR *buf[BIG_NUMBER] = {0};
      strcpy_s(buf, stl_string.c_str());
      


      ну т.е. можно конечно и CHAR *s = new CHAR[stl_string.length() + 1];
      Wednesday, July 1st, 2009
      8:43 pm
      Google App Engine
      Несмотря на известные недостатки, все равно начинать с Google App Engine.Похоже самый ламеродружественный халявный хостинг с питоном. Очень доступный скринкаст:

      и столь же ясный тьюториал

      собственно: http://zoogenic.appspot.com

      Некоторые грабли:
      1. Лезет ошибка при попытке зааплоадить (appcfg.py update .)
      HTTPError: HTTP Error 403: Forbidden
      Error 403: --- begin server output ---
      You do not have permission to modify this app (app_id=u'shoutout1').
      Оказывается надо сделать специальный App Engine account (с кодом активации через смс: все серьезно :) )

      2. Имя для аппликации здесь, должно совпадать с таковым в app.yaml

      подробнее
      5:16 pm
      Куча мелочи для PowerShell

      • ps-провайдеры
        ls env: | fl #Отобразить все переменные окружения
        $env:path    #Обращение к итему через символ $
                     #Отобразить содержимое переменной PATH
        #Добавить путь в переменную PATH (к сожалению с реестром так нельзя)
        $envvar = $env:path + ';C:\Python25\'
        $env:path = $envvar
        #Можно проще (именно ", а не ')
        $env:path = "$env:path;C:\Python25\"


      • Write-Host вывод текста (foregroundcolor - цвет текста, backgroundcolor - цвет фона)
        Write-Host "Hello world" -foregroundcolor red
      • New-PSdrive - новый драйв (алиас: mount)
        New-PSdrive -name scripts -PSprovider filesystem -root C:\bin\PowerShellScripts
        теперь можно будет писать script:
        и самое главное!
        для реестра есть драйвы: HKLM и HKCU, но нет HKCR.
        New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT

      • Еще одна фишь по последней ссылке: провайдер Registry не поддерживает опцию filter. Но можно смошенничать. И добиться схожего через pipeline
        сd HKLM:\SOFTWARE\
        dir | ?{$_.Name -like '*Int*'}

      • Еще проблема: запустить обычный ls для для сетевого ресурса при location в реестре
        PS HKCR:\.kml\Google Earth.kmlfile> ls \\yoda\incoming
        Get-ChildItem : Cannot process argument because the value of argument "path" is invalid. Change the value of the "path"
        argument and run the operation again.
        At line:1 char:3
        + ls <<<< \\office\temp
        + CategoryInfo : InvalidArgument: (:) [Get-ChildItem], PSArgumentException
        + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.GetChildItemCommand

        нужно явно указать провайдера:
        PS HKCR:\.kml\Google Earth.kmlfile> ls filesystem::\\yoda\incoming



      • Read-Host - считать строку
        $a = Read-Host "Enter your name"
        Write-Host "Hello" $a


      И много всего полезного здесь

      а здесь чудо: демо для работы с WinForms
      Tuesday, June 30th, 2009
      12:45 pm
      I've now got the new LiveJournal Messenger.
      I've now got the new LiveJournal Messenger. My Windows Live ID is h_323@livejournal.com. Sign up now and we can chat!
      Friday, June 26th, 2009
      10:55 pm
      PowerTab
      Это такой Intellisense для Powershell. Делает его натурально Marc van Orsouw (текущая версия: 0.99b2).
      • Скачиваем, распаковываем
      • Подписываем PowerTabSetup.ps1 и запускаем его
      • Оно сразу скажет, какие ей нужно еще скрипты подписать: выйти, подписать. (Правда подозреваю, что можно просто
        sign-file.ps1 C:\InstalPath\*.ps1

        но сам не хочу так делать, чтоб удовольствие растянуть

      • Name
        ----
        add-tabExpansion
        add-TabExpansionComputersNetView
        add-TabExpansionComputersOU
        add-tabExpansionEnum
        Add-TabExpansionEnumFromLastError
        add-TabExpansionTypes
        Export-tabExpansionConfig
        Export-tabExpansionDataBase
        Export-TabExpansiontheme
        get-tabExpansion
        get-TabExpansionComputer
        get-TabExpansionCustom
        Import-tabExpansionConfig
        Import-TabExpansionDataBase
        Import-TabExpansiontheme
        Invoke-TabExpansionEditor
        New-tabExpansionDataBase
        Remove-tabExpansion
        Update-TabExpansion
        Update-TabExpansionTypes
        Update-TabExpansionWmi

      • 24.73 КБ
      Thursday, June 25th, 2009
      10:04 pm
      SSH client
      Для того, чтобы заливать на alwaysdata.net предполагаемое содержимое будущего сайта. Можно, конечно, взять PuTTY и не париться. Но зачем еще одна консоль, когда есть такой замечательный PowerShell? Нужно только правильно подобрать антидепрессанты cmdlets/аппликушки. Имеются такие варианты:
      • plink.exe из PuTTY (TODO: говорят - его хорошо потреблять с питоном): основная версия, портабельная
      • NetCmdlets - содержит более 30 cmdlets для протоколов SNMP, LDAP, DNS, Syslog, HTTP, WebDav, FTP, SMTP, POP, IMAP, Rexec/RShell, Telnet и т.д. Очень мощная штука, к тому же платная, хотя есть халявная hobbyist license. Но только зачем такая мощь, когда нужен только SSH. К тому же получать эту лицензию скучно.
      • А вот человек написал (+1) способ через некую открытую либу SharpSSH (download) его и попробую.
      Wednesday, June 24th, 2009
      10:39 pm
      Иконку из битмапа
      Бывает, что в одном приложении необходимы идентичные иконка и битмап. Если их оба поместить в ресурсы, то связанность увеличится. Поэтому вот функция, которая на лету по битмапу из ресурсов генерит иконку

      HICON HICONFromBITMAP(UINT _nIDResource)
      {
          CBitmap bmp;
          bmp.LoadBitmap(_nIDResource);
      
          BITMAP bm;
          bmp.GetObject(sizeof(BITMAP), &bm);
      
          CBitmap bmpMask;
          bmpMask.CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);
      
          CDC hdcSrc, hdcDst;
      
          hdcSrc.CreateCompatibleDC(NULL);
          hdcDst.CreateCompatibleDC(NULL);
      
          // Load the bitmaps into memory DC
          CBitmap* hbmSrcT = (CBitmap*) hdcSrc.SelectObject(&bmp);
          CBitmap* hbmDstT = (CBitmap*) hdcDst.SelectObject(&bmpMask);
      
          COLORREF clrTrans = hdcSrc.GetPixel(0, 0);
      
          // Change the background to trans color
          COLORREF clrSaveBk  = hdcSrc.SetBkColor(clrTrans);
      
          // This call sets up the mask bitmap.
          hdcDst.BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &hdcSrc, 0, 0, SRCCOPY);
      
          COLORREF clrSaveDstText = hdcSrc.SetTextColor(RGB(255,255,255));
          hdcSrc.SetBkColor(RGB(0,0,0));
      
          hdcSrc.BitBlt(0,0,bm.bmWidth, bm.bmHeight, &hdcDst,0,0,SRCAND);
      
          // Clean up by deselecting any objects, and delete the DC's.
          hdcDst.SetTextColor(clrSaveDstText);
      
          hdcSrc.SetBkColor(clrSaveBk);
          hdcSrc.SelectObject(hbmSrcT);
          hdcDst.SelectObject(hbmDstT);
      
          hdcSrc.DeleteDC();
          hdcDst.DeleteDC();
      
          ICONINFO ii = {0};
          ii.fIcon = TRUE;
          ii.hbmColor = bmp;
          ii.hbmMask = bmpMask;
      
          HICON hIcon = ::CreateIconIndirect(&ii);
      
          return hIcon;
      }
      


      Здесь несколько подробнее
      6:17 pm
      Грабли с неправильным вычислением прямоугольника панели в статус-баре
      Проблема в том, что для последней панели CStatusBar::GetItemRect часто возвращает неправильное значение прямоугольника. В этом случае используется следующий воркэраунд.
      CRect GetLastItemRealRect(CStatusBar &_status_bar, int lastPaneIdx)
      {
          CRect ret; 
          _status_bar.GetItemRect(lastPaneIdx, &ret);
      
          DWORD dwPaneStyle = _status_bar.GetPaneStyle( lastPaneIdx );
          int cx = ::GetSystemMetrics( SM_CXEDGE );
          if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
          {
              UINT nID, nStyle;
              int cxWidth;
              _status_bar.GetPaneInfo( lastPaneIdx, nID, nStyle, cxWidth );
              ret.right = ret.left + cxWidth + cx*3;
          } // if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
          else
          {
              CRect rcClient;
              _status_bar.GetClientRect( &rcClient );
              ret.right = rcClient.right;
              if( (_status_bar.GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
              {
                  int cxSmIcon = ::GetSystemMetrics( SM_CXSMICON );
                  ret.right -= cxSmIcon + cx;
              } // if( (GetStyle() & SBARS_SIZEGRIP) == SBARS_SIZEGRIP )
          } // else from if( (dwPaneStyle & SBPS_STRETCH ) == 0 )
      
          return ret;
      }
      
      Tuesday, June 23rd, 2009
      6:05 pm
      Свой сайт (взгляд с высоты плинтуса)
      Сделать простейший сайт. Тупо из готового шаблона. Глядя на подобный зоопарк фреймворков, ощущаешь малодушный позыв просто набрать html в нотепаде. Но это было бы слишком просто.

      Вначале определиться с языком: Python, Ruby, PHP, C# и прочие. Больше всего нравится слово "Python". К тому же один скрипт я уже написал :)

      Теперь с хостингом. Не жалко этих копеек. Но и их хватит жабе, что потребовать уделять затее больше внимания, чем хотелось бы в данный момент.
      Поэтому google://python free hosting.
      1. Этот вопрос на форумах: StackOverflow, Google.Ответы, Software Maniacs
      2. Каталоги: Free Web Hosts, Django-friendly Web hosts
      3. Фреймворк. Сложилось мнение, что текущий выбор собаководов: Django
      4. Хостинги:
        • Google App Engine: Кастрированный Django и обрезанный Python
        • AlwaysData: 10Mb free acc. + французский язык
        • HelioHost: Нечто невообразимо прекрасное, пока не пойму в чем подвох (UPD: что-то его и dns не узнает)
        • x10hosting (Accounts found to be inactive are suspended for a 10-day period and then terminated. All data including any type of backup or stored information is removed with the account. To prevent an account from being suspended for inactivity it is required users visit the x10Hosting forums located at http://forums.x10hosting.com at least ONCE every TWO WEEKS. Accounts must also have a working website within one week)


      5. Собственно говоря:
      Wednesday, June 3rd, 2009
      8:07 pm
      удалить питоном из докфайла стрим по имени
      import pythoncom
      from pywintypes import IID
      import win32com, sys, string, win32api, traceback
      from win32com import storagecon
      from win32com.test.util import CheckClean
      
      VARIANT_FALSE = 0
      
      def remove_old(strPath):
          ret = pythoncom.StgIsStorageFile(strPath)
          if ret == VARIANT_FALSE :
              print "File is not a storage"
              return
          
          storage=pythoncom.StgOpenStorageEx(strPath,
                                             storagecon.STGM_DIRECT | storagecon.STGM_READWRITE | storagecon.STGM_SHARE_EXCLUSIVE,
                                             storagecon.STGFMT_DOCFILE,
                                             0,
                                             pythoncom.IID_IStorage
                                             )
      
          guid = pythoncom.ReadClassStg(storage)
          guid_mxd = IID('{СССССССС-C66C-11D0-B94C-080009EE4E51}')
          
          if guid != guid_mxd :
              print "Wrong storage file"
              return
      
          storage.DestroyElement("Wrongstream")
          storage.Commit(storagecon.STGC_DEFAULT)
      
          print "Done"
          
      
      if __name__=='__main__':
          #pythoncom.CoInitialize()
          remove_old(sys.argv[1])
          pythoncom.CoUninitialize()
          CheckClean()
      
      Monday, June 1st, 2009
      2:21 pm
      PowerShell (ламерство)
      Перечисление имен зарегистрированных PS-провайдеров
      Get-PSProvider | select Name

      Перечисление PS-драйвов, с упорядочением сначала по провайдеру, потом по имени
      Get-PSDrive | sort Provider, Name
    [ << Previous 20 ]
    About LiveJournal.com

    Advertisement