Sunday, August 2nd, 2009

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 $_ }
(Leave a comment)

Monday, July 27th, 2009

Список подкастов через 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
(Leave a comment)

Tuesday, July 7th, 2009

Нашелся еще один славный тьюториал по 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 посетителя.
(Leave a comment)

Wednesday, June 3rd, 2009

удалить питоном из докфайла стрим по имени

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()
(Leave a comment)

Monday, June 1st, 2009

PowerShell (ламерство)

Перечисление имен зарегистрированных PS-провайдеров
Get-PSProvider | select Name

Перечисление PS-драйвов, с упорядочением сначала по провайдеру, потом по имени
Get-PSDrive | sort Provider, Name
(Leave a comment)

Thursday, September 25th, 2008

деплоить м$ либы через NSIS (проблема версий)

Если у кастомера старовата версия comdlg32.ocx, предлагается следующий NSIS-скрипт:

!define PRODUCT "comdlg32.ocx deployer" ;Define your own software name here
!define PRODUCT_SHORT "comdlg32.ocx"
!include "UpgradeDLL.nsh"
OutFile comdlg32.ocx.exe

Section "Principal" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer

  File Comdlg32.ocx
 !insertmacro UpgradeDLL Comdlg32.ocx $SYSDIR\Comdlg32.ocx $SYSDIR
 
SectionEnd


при этом библиотека берется отсюда http://activex.microsoft.com/controls/vb6/comdlg32.cab
link
(Leave a comment)

Monday, September 15th, 2008

Команды WinDBG

  • .symfix c:\windows\symbol

    делает SRV*c:\windows\symbol*http://msdl.microsoft.com/download/symbols
    можно .symfix+, чтобы добавить к существующим путям
  • .sympath+ c:\somepath\symbols
    добавляет путь в обычном виде
  • lm
    список загруженных модулей
  • ~*kb
    стеки для всех загруженных модулей
  • lmv m xtoolspro
    выдает инфу по загруженной библиотеке (timestamp, в частности)... в данном случае xtoolspro
  • uf afUILib!AfCoolMenu::~AfCoolMenu+0xf7
    uf - Unassemble function... дизассемблирует т.е... вместо 'afUILib!AfCoolMenu::~AfCoolMenu+0xf7' может стоять любой адрес
    
(Leave a comment)

Sunday, September 14th, 2008

проблемы с CLR в WinDBG

Загружаем минидамп в WinDBG
!analyze -v

говорит "CLRDLL: Unknown processor type in image mscorwks.dll"
Read more... )
Лечится следующим образом. (взято отсюда)
  • 0:000> .cordll -ve -u -l
    CLR DLL status: No load attempts

  • 0:000> lmv m mscorwks

  • 0:000> .exepath+ C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\

  • 0:000> .reload
(Leave a comment)

Friday, August 29th, 2008

Двигать сабы вдоль времени (*.srt)

Чужой компьютер, например. Винда. И картинка не совпадает с текстом: отстает / обгоняет
Прогу искал в свое время - не нашел. На чужом компьютере можно вроде расчитывать только на WSH. Поэтому написал говноскрипт (может и собрался бы вылизать, если бы не был нужен настолько редко). Пусть будет доступен по инету, чтобы кажный раз не париться.
  • Открываем нотепад.
  • Копируем скрипт
  • Сохраняем с расширением vbs
  • D:\>cscript //Nologo c:\scripts\srt_time_shifter.vbs 5 -2 "d:\shrek III.srt"

    Read more... )
(Leave a comment)

Friday, August 15th, 2008

В TFS задать пользовательские diff/merge

Это способ поставить Araxis Merge вместо встроенного мерджера-компарера чере UI студии. (Можно и для других прог подобное провернуть [1], [2])
tools -> options -> source control -> visual studio team foundation server -> "configure user tools"

Extension: .*
Operation: Compare
Command: C:\Programs\Araxis Merge\compare.exe
Arguments: /wait /2 /title1:%6 /title2:%7 %1 %2

Extension: .*
Operation: Merge
Command: C:\Programs\Araxis Merge\compare.exe
Arguments: /wait /swap /a3 /3 /title1:%6 /title2:%7 /title3:%8 %1 %2 %3 %4
(Leave a comment)

Tuesday, July 15th, 2008

Powershell: копирование, упорядочивание

нашли все кмл-файлы и вывели их в порядке возрастания даты последней записи
PS> ls d:\ *.kml -recurse | sort LastWriteTime

то же самое, в убывающем порядке
PS> ls d:\ *.kml -recurse | sort LastWriteTime - descending

последний скачанный файл в папке с подкастами
PS> (ls 'D:\my\My Received Podcasts\Svobodanewsru' | sort LastWriteTime -descending)[0]

скопировать последний скачанный файл из папки подкастов на флешь
PS> cpi -path 'D:\my\My Received Podcasts\Svobodanewsru\*' -filter (ls 'D:\my\My Received 
Podcasts\Svobodanewsru' | sort LastWriteTime -des)[0] -destination f:

то же самое в случае, когда мы уже находимся в нужной папке
PS D:\my\My Received Podcasts\Business News (Russian)> cpi (ls | sort LastWriteTime -des)[0] f:

а теперь скопировать 4 последних скачанных (файла в данной папке) на флешь
PS D:\my\My Received Podcasts\Svobodanewsru> cpi (ls | sort lastwritetime -des | select -first 4) f:

а теперь то же самое, но 4 файла брать с проверкой также вложенных папок
PS D:\My\My Received Podcasts> ls . -Recurse -Filter *.mp3 | sort lastwritetime | select -last 4 | cpi -Destination g:
(Leave a comment)

Monday, July 7th, 2008

Пакетные переименования файлов в powershell

добавил 0 перед именем файла; WhatIf для соображения тестирования: показывает предположительные данные, если получается то, чего ждешь, то убираем его
PS> Get-ChildItem [0-9][0-9]_*.mp3 | Foreach { Rename-Item $_ -NewName @('0'+$_.name)[0] -WhatIf }

заменить пробелы на подчерки
gci *.mp3 | % { rename-item $_ $_.Name.Replace(" ", "_")}

foreach можно заменять на %
get-childitem, gci, ls, dir - это одно и то же
(2 comments | Leave a comment)

Thursday, May 15th, 2008

Ложные утечки памяти | Spurious memory leak

Итак, в output'е имеем что-то вроде
Detected memory leaks!
Dumping objects ->
leak2.cpp(12) : {73} normal block at 0x00355A80, 20 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
{72} normal block at 0x00355A38, 10 bytes long.
 Data: <          > CD CD CD CD CD CD CD CD CD CD
Object dump complete.


Это означает, что где-то в коде поток видимо наткнулся на функцию _CrtDumpMemoryLeaks() [dbgheap.c]. Ложные утечки могут появиться, если эта функция _CrtDumpMemoryLeaks была вызвана не ко времени. В частности, этим славен MFC. По своей выгрузки он (она? оно?) дергает эту функцию и рассказывает все, что видит.

У меня было так. Проект - набор COM DLL-плагинов к некоторой системе. Часть этих DLL использует MFC, часть - не использует. Загружаются они в некотором порядке (вообще говоря нефиксированном). Поэтому бывает так, что выгружается последняя DLL, использующая MFC, показывается memory leak report, не взирая на то, что еще жива DLL, не использующая MFC, и эта позже собирается освобождать занятую собой память. Решение: не обращать внимание на этот репорт. А в деинициализации последней DLL, неиспользующей MFC (в DLLMain, dwReason == DLL_PROCESS_DETACH) вставить собственный _CrtDumpMemoryLeaks.

Ссылки по теме (с неработающим у меня решением): [1], [2], [3], [4], [5])
(Leave a comment)

Wednesday, May 14th, 2008

Проблема с регистрацией (ATL)

Допустим, твоя DLL говорит тебе в output английским языком:
error PRJ0019: A tool returned an error code from "Performing registration".

  • Dependency walker - в помощь. Посмотреть на красные буквы, может что-то и понятнее станет
  • Менее инструментальый способ.
    1. Project | Properties | Linker | General | Register Output is set to No.
    2. Also go to Project | Properties | Build Events | Post-Build Event. It's likely that Command Line setting invokes regsvr32 - if so, set Excluded From Build to Yes.
    3. Project | Properties | Debugging, set Command to regsvr32.exe and Command Arguments to "$(TargetPath)"
    4. Put a breakpoint into DllRegisterServer implementation in ProjectName.cpp. Run under debugger - you will hit a breakpoint - single-step from there, figure out where it fails.

(Leave a comment)

Tuesday, May 13th, 2008

crtdll.c & dllcrt0.c

_DllMainCRTStartup is in crtdll.c (when your DLL library is dynamically linked to CRT) or dllcrt0.c (when your DLL library is statically linked to CRT). In both files you will find _CRT_INIT, called from _DllMainCRTStartup just before user entry point (DllMain) is executed. In _CRT_INIT in dllcrt0.c you will find call to _mtinit, which is defined in tidtable.c. Here you will find "__tlsindex = FLS_ALLOC(&_freefls)". But I think that's all irrelevant in your case, as your library B (being static library) does not have an entry point.
(Leave a comment)

Tuesday, April 29th, 2008

DebugView

DebugView - утилита для просмотра дебаговских сообщений. Самый простой (тупой) способ добиться минимальной отладки от релизной версии (а еще, если к тому же на виртуальной машине... удалённой)

Руссинович со своей sysinternals... т.е. c микрософтовской
(Leave a comment)

Saturday, November 17th, 2007

Слишком много безопасности на Vista

Проблема очень распространённая. Администратор в Висте не имеет прав рута по умолчанию. Например, нет возможности зайти в папку "Documents and settings". Эта заботу о безопасности микрософт© назвал UAC. И первый вопрос благодарного пользователя: как отключить UAC. Вот так
(Leave a comment)

Thursday, September 27th, 2007

Работа в винде с файловой системой

C-runtime Windows Shell FileSystemObject Windows API
Создание папки
_mkdir, _wmkdir
SHCreateDirectory,
SHCreateDirectoryEx
CreateFolder
CreateDirectory,
CreateDirectoryEx
Итерация
внутри папки
_findfirst, _wfindfirst
_findnext, _wfindnext
_findclose
Проверка
существования
файла
_access_s, _waccess_s
_taccess_s
2ой парам = 0
Открытие
файла
fopen_s, _wfopen_s,
_tfopen_s
Запись в файл
fprintf_s, fwprintf_s,
_ftprintf_s
(Leave a comment)

Friday, December 1st, 2006

Простой консольный C++ проект для windows


  1. Console Application
  2. Empty application
  3. Solution Explorer -> Source Files -> Add -> New Item

  4. int main(int argc, char *argv[])
    {
      return 0;
    }
  5. Compile
  6. определены в stdlib.h
    • system (нужно для того, чтобы написать подождите)
    • EXIT_SUCCESS 0


  7. #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
      system("PAUSE");
      return EXIT_SUCCESS;
    }
  8. Для вывода строк std::cout, printf нужно #include <iostream> для printf нужно самому добавлять перевод строки
(1 comment | Leave a comment)

Thursday, October 12th, 2006

Детали отображением тултипа

Тултип создается со следующими параметрами
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP

Добавляется к контролу с
TTF_SUBCLASS, LPSTR_TEXTCALLBACK

Ловим
TTN_GETDISPINFO

В классе тултипа отрабатываем
WM_CREATE (SetWindowPos(HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);)
WM_PAINT, WM_PRINTCLIENT (пустые return 0;)


При этом возможны 2 вида отображения тултипа

  • Чёрный прямоугольник. (ничего не рисуется, только удаляется под ним)
  • Толька рамочка. (ничего не рисуется и не удаляется)

Первый случай если в stdafx.h присутствует следующий блок:
code )
Второй, случай, если блок отсутствует
(Leave a comment)
Previous 20