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 |
| | Thursday, September 10th, 2009 | | 6:56 pm |
Русские буквы
Проблема возникла с Vim'ом. Если запускать его из cmd.exe, то русские буквы отображаются кракозябрами, если из Powershell, то часть букв не печтатается. Пытался играть с настройками вима, но оказалось, что дело в настройках виндовой консоли. Если отказаться от Raster Fonts для консоли, то все отображается нормально. Но отказываться приходится в пользу Lucida Console, а мне он что-то не слишком нравится. Сущестсвует способ добавления фонтов в консоль: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Wi ndows 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++) в режиме отладки часто нужно посмотреть на код выше или ниже по стеку. Очень часто нужно выбрать фрейм выше или ниже текущего на единицу. (Например, остановиться на брейкпоинте, посмотреть откуда этот код зовется, потом откуда зовется уже этот следующий код, потом вернуться обратно). С точки зрения последовательности клавиатурных комбинаций каждая такая итерация выглядит так: - Alt-7 (или Ctr-Alt-C) - переключиться из редактора в окно Call Stack
- стрелка вниз (или вверх)
- 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 |
Моя студия
- Хочется, чтобы по переходу в Solution Explorer можно было включать(отключать) отслеживание активного файла в окне редактора.
Tools -> Customize -> Commands -> (Categories:) View -> (Commands:) Track Activity in Solution Explorer. Вытащить ее на вкладку View и добавить '&' перед 'k', поскольку эта буква больше нигде не задействуется
- Нужно, чтобы при вставке/удалении нескольких строк автоматически вставлялись табы.
Tools -> Options -> Text Editor -> C/C++ -> Indenting -> Smart
- Навигация по стеку: PreviousStackframe (Ctrl+`), NextStackframe (Ctrl+Shift+`)
- 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 |
| | Friday, June 26th, 2009 | | 10:55 pm |
PowerTab
Это такой Intellisense для Powershell. Делает его натурально Marc van Orsouw (текущая версия: 0.99b2). | | 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. - Этот вопрос на форумах: StackOverflow, Google.Ответы, Software Maniacs
- Каталоги: Free Web Hosts, Django-friendly Web hosts
- Фреймворк. Сложилось мнение, что текущий выбор собаководов: Django
- Хостинги:
- 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)
- Собственно говоря:
| | 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 ]
|