?

Log in

No account? Create an account
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 ]
Saturday, September 28th, 2013
11:31 am
TODO:
TFS + powershellCollapse )

=================================
pythonCollapse )

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

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

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

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

===============================================
vdproj, deployment, vista, linksCollapse )

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

Crash ReportingCollapse )
Wednesday, August 28th, 2013
10:22 am
Ошибка при апдейте убунты
Оконный Software update в убунте ругался, что не может обновиться. Если делать через терминал sudo apt-get update, то присутствовали строки

W: Failed to fetch http://ppa.launchpad.net/narfss/proyectobs/ubuntu/dists/raring/main/binary-amd64/Packages 404 Not Found

W: Failed to fetch http://ppa.launchpad.net/narfss/proyectobs/ubuntu/dists/raring/main/binary-i386/Packages 404 Not Found

E: Some index files failed to download. They have been ignored, or old ones used instead.



Соотвественно, нужно удалить этот proyectobs.
  1. Запускаем 'Software & Update' (sudo software-properties-gtk)
  2. Во вкладке 'Other Software' снимаем галку с этим proyectobs
  3. Снова делаем sudo apt-get update
Tuesday, December 18th, 2012
8:59 pm
Thursday, November 22nd, 2012
11:05 pm
Макро для изменения переменной для отладки в студии
При отладке в Visual Studio (в плюсах) есть цикл с двумя проходами. Нужно на первом проходе установить значение переменной в 4, а на втором проходе спросить пользователя, какое значение нужно. Делается следующим макросом

Sub TemporaryMacro()
  DTE.Debugger.ExecuteStatement("rop=4")
  DTE.Debugger.Go(True)
  Dim val = InputBox("Enter rop value")
  DTE.Debugger.ExecuteStatement("rop=" + val)
  DTE.Debugger.Go(True)
End Sub
Friday, May 4th, 2012
10:51 pm
Отладка msbuild-скрипта при помощи PowerConsole
Поставил студию MSVS11 Beta. И через некоторое время узнал, что в MSVS10 C#-проекты перестали собираться с MSBuild'овскими ругательствами. Предпринята попытка с отладкой компиляции. Возникла проблема отображения переменных. Смотреть в Locals не слишком удобно большие коллекции, которые к тому же постоянно растут. Поэтому воспользовался Powershell'ом

PS> $dte.Debugger.GetExpression("Project")
PS> $dte.Debugger.GetExpression("Environment")
PS> $dte.Debugger.GetExpression("Toolset")
PS> $dte.Debugger.GetExpression("Global")
PS> $dte.Debugger.GetExpression("Properties")

Есть еще в окне Locals переменная "Built In", к которой не удалось доступиться. Похоже, что из-за пробела.

Можно посмотреть, уже конкретные переменные. Вот, просто выводим список:
PS> $a = $dte.Debugger.GetExpression("Project")
PS> $a.DataMembers

DataMembers имеет тип EnvDTE.Expressions (link)
А теперь обращаемся по индексу:
PS> $a.DataMembers.Item(1)
А теперь — по имени:
PS> $a.DataMembers |? {$_.Name -eq "Properties" }

Кстати, во время отладки переменные протухают (после каждого шага дебаггера)


Вот получаем набор всех имён, всех полей проекта:
PS> $a.DataMembers |% {$_.Name}
DefaultTargets
Directory
FullPath
GlobalProperties
InitialTargets
IsImmutable
ItemDefinitions
Items
ItemTypes
ProjectFileLocation
Properties
Targets
ToolsVersion
Non-Public members

Предположительно, меня интересуют properties (доступаются в виде $(property)) и items (доступаются в виде %(item))

PS> ($a.DataMembers |? { $_.Name -eq "Properties" }).DataMembers |% {$_.Name}
[Microsoft.Build.Collections.ReadOnlyCollection<Microsoft.Build.Execution.ProjectPropertyInstance>]
Count
IsReadOnly


Интересует первый параметр с дебильным именем в квадратных скобках (где-то там как раз и содержится коллекция пропертей). Поскольку коллекции здесь индексируются, начиная с 1, то и получаем:

PS> ($a.DataMembers |? { $_.Name -eq "Properties" }).DataMembers.Item(1).DataMembers|% {$_.Name}
Count
IsReadOnly
Non-Public members


А здесь нас уже интересует мембер Non-Public members. Ну и т.д. Итого:
PS> $properties = ((($a.DataMembers |? { $_.Name -eq "Properties" }).DataMembers.Item(1).DataMembers|? {$_.Name -eq "Non-Public members" }).DataMembers |? {$_.Name -eq "backing"}).DataMembers
PS> $items = ((($a.DataMembers |? { $_.Name -eq "Items" }).DataMembers.Item(1).DataMembers|? {$_.Name -eq "Non-Public members" }).DataMembers |? {$_.Name -eq "backing"}).DataMembers


Удобнее будет это оформить в виде функций:
PS> Function get-properties () {
>>  (
>>    (
>>      ( $dte.Debugger.GetExpression("Project").DataMembers |? { $_.Name -eq "Properties" }
>>      ).DataMembers.Item(1).DataMembers |? {$_.Name -eq "Non-Public members" }
>>    ).DataMembers |? {$_.Name -eq "backing"}
>>  ).DataMembers
>>  }

PS> Function get-project-items () {
>>  (
>>    (
>>      ( $dte.Debugger.GetExpression("Project").DataMembers |? { $_.Name -eq "Items" }
>>      ).DataMembers.Item(1).DataMembers|? {$_.Name -eq "Non-Public members" }
>>    ).DataMembers |? {$_.Name -eq "backing"}
>>  ).DataMembers
>>  }

Не сказать, чтобы уж очень удобный способ обращаться к мемберам. Но зато можно потом будет наавтоматизировать всласть. Формат представления пропертей некрасивый. Вот запрос, чтобы узнать значение свойства PlatformTarget:
PS> (get-properties |? {$_.Value -like """PlatformTarget""*"}).Value
"PlatformTarget"="x86"
Thursday, October 27th, 2011
4:53 pm
Список путей для файлов в MSVS
В MSVS загружен solution. В солюшене есть некоторый, интересующий нас проект. В проекте есть "папка" (то, что называется filter в Solution explorer). Вернее, там целое дерево папок. Нужно получить пути всех файлов, которые содержатся в этой папке. С помощью упомянутого PowerConsole делается в 3 строчки.

PS> $ogr = $dte.Solution.Projects.Item(3).ProjectItems | ? { $_.Name -eq "ogr" }
PS> Function get-filter-paths ($it) { $it.ProjectItems | % { $_.FileNames(0); get-filter-paths $_ } }
PS> get-filter-paths $ogr

  1. Получаем объект, который соответствует нашей папке (ogr)
  2. Задаем функцию, которая рекурсивно выводит пути файлов
  3. Вызываем функцию
Monday, October 24th, 2011
11:08 pm
Keyboard shortcuts in MSVS
Всегда хотел знать шоткаты в студии. Доступные интернет-источники не удовлетворяли. Смотреть Customize в трёхстрочное окошко тоже не слишком хотелось.
Сделал так. Есть довольно классный экстеншн к студии — PowerConsole. Он добавляет консоль powershell в студию с некоторой интеграцией. В частности, там есть переменная $dte, которая является отражением соответствующего интерфейса из EnvDTE

PS> $dte.Commands | ? { $_.Bindings } | sort -property LocalizedName | % { Write-host $_.LocalizedName '#' $_.Bindings }

И означает это следующую последовательность операций:
  1. Выгребаем все команды
  2. Выбираем только те, которые имеют шоткаты
  3. Сортируем по имени команды
  4. Выводим список в формате: имя команды # шоткаты

Сохраняем в текстовый файл. Теперь нужно заменить пробел между именем команды и шоткатом чем-нибудь более вменяемым (;). Наверняка это делается средствами самого powershell, но не стал разбираться. Открываем Notepad++. Выполняем Replace со включенными регэскпами: заменить ^([^ ]+)( ) на \1;
Далее, экспортим полученное в Excel или Google.Docs, распечатываем и наслаждаемся 187 шоткатами

Edit:
Спросили про мой файлик. Вот он.
Thursday, October 20th, 2011
2:17 pm
Перевернуть число в десятичной записи
#include <stdio.h>

int main(void)
{
    int numToReverse = 0;
    int reversedNum = 0;

    printf("pick a number : ");
    scanf("%d",&numToReverse);

    while(numToReverse)
    {
        reversedNum = 10*reversedNum + numToReverse%10;
        numToReverse/=10;
    }
    printf("reversed number : %d\n",reversedNum);
}
via
Wednesday, August 3rd, 2011
4:02 pm
Удалятор массивов
namespace RAII
{
  template<typename T = char> class array_releaser_t
  {
  public:
    explicit array_releaser_t(T *_t) : t_(_t) {}
    ~array_releaser_t() { delete [] t_; }
  private:
    T *t_;
  };
}
Ну либо пользоваться везде BOOST_SCOPE_EXIT.. ну т.е. boost::scope_array, наверное, лучше.
Friday, July 22nd, 2011
9:02 pm
Powershel. GetChildItem. Exclude
Допустим, хочется рекурсивно найти файлы, но при этом исключить файлы из некоторой конкретной подпапки. Вроде бы для этого существует параметр
-exclude <string[]>
Omits the specified items. The value of this parameter qualifies the Path parameter.
Enter a path element or pattern, such as "*.txt". Wildcards are permitted.

Но эта фича не работает. Поэтому вместо
Get-ChildItem -Recurse f:\ ex*.cpp -Exclude F:\Boost
следует писать
Get-ChildItem -Recurse f:\ ex*.cpp |? { $_.FullName -notmatch 'F:\\Boost'}
Monday, May 9th, 2011
11:27 pm
всякие контейнерные фор-ичи
пусть будет здесь тоже
std::for_each + lambda
// C++0x only.
std::for_each(theContainer.begin(), theContainer.end(), [](someType x) {
    // do stuff with x.
});

range-based for loop
// C++0x only
for (auto x : theContainer) {
   // do stuff with x.
}

MS-specific "for each"
// MSVC only
for each (auto x in theContainer) {
  // do stuff with x.
}

Boost.Foreach
// Requires Boost
BOOST_FOREACH(someType x, theContainer) {
  // do stuff with x.
}

link
Thursday, May 5th, 2011
10:03 pm
PowerShell Community Extension
У меня установлен XNote Stopwatch (Xnsw) — часы, которые полупрозрачно "парят" поверх всех окон. Иногда этот xnsw куда-то теряется. А поскольку я его убрал его и с таск-бара и из трея, то оживлять часы не слишком весело.
По этому поводу с кодеплкса взят PSCX — ps-модуль, представляющий собой набор всяческих штук. Вытащить часы на поверхность теперь можно так:
set-foregroundwindow (ps xnsw).MainWindowHandle
Wednesday, April 13th, 2011
7:00 pm
Распечатать содержимое директории
Еще один способ распечать рекурсивно содержимое папки. На этот раз через Boost.Filesystem
namespace bf = boost::filesystem;
using namespace std;

void print_folder(LPCWSTR _folderName)
{
  bf::recursive_directory_iterator ib(_folderName), ie;
  copy(ib, ie, ostream_iterator<bf::directory_entry>(cout, "\n"));
}

Трудно сдерживаться, чтобы не писать в одну строчку. Жестокий век узких мониторов :)
Read more...Collapse )
Saturday, March 26th, 2011
2:31 pm
Линкер в Code::Blocks
Пытаясь сделать COM-сервер на GCC в Code::Blocks, у меня слетела шляпа получил ошибку линкера:
undefined reference to `IID_IUnknown`
. Наступило время узнать, как в Code::Blocks прописывать либы, т.е. aы. Ткнуть правой кнопкой в проект во вкладке Projects (аналог Solution Explorer).
Build options -> Linker settings

Библиотеку зовут libuuid.a. И она лежит по приблизительно такому пути C:\MinGW32\lib

Update:

символ библиотека
IUnkown
IClassFactory
libuuid.a
CoInitialize libole32.a
Thursday, March 17th, 2011
2:12 pm
Зачем typedef'ы вместе со struct'ами
Вот 2 варианта:
struct IExample {
   DWORD   count;
   char    buffer[80];
};

typedef struct {
   DWORD   count;
   char    buffer[80];
} IExample;
Второй вариант для удобства в C. Потому что первый вариант заставляет везде, где нужен IExample, писать struct IExample. Более того, иногда нужен такой вариант:
typedef struct IExample {
   DWORD   count;
   char    buffer[80];
} IExample;
Этот вариант позволяет лишать проблему, круговой зависимости. Мы можем где-нибудь наверху написать предварительное объявление:
struct IExample;
И пользовать его выше определения, правда уже со словом struct. Типа такого
typedef ULONG STDMETHODCALLTYPE AddRefPtr(struct IExample *);
Monday, March 14th, 2011
11:41 am
Страшная правда о union'ах
И так бывает:
template <typename T>
union Foo {
public:
  Foo() {}
  Foo(const T& value) : _val(value) {}

  const char* data() const {
    return _tab;
  }

  unsigned int size() const {
    return sizeof(T);
  }

  char operator[](unsigned int index) const {
      return _tab[index];
  }

private:
  T _val;
  char _tab[sizeof(T)];
}

К сожалению параметризовать можно только POD-типом, что несколько снижает удовольствие. Никаких извращений не подразумевается. Например, std::bitset позволяил бы доступиться до битов (в известных мне реализациях). Никто не собирается подсовывать Правда, в C++0x появились некие послабления в виде unrestricted unuion'ов. Но на данный момент их поддерживает только GCC 4.6 еще не щупанный мной. Ну, конечно, можно пользовать Boost.Variant, чтобы вообще не заморачиваться ограничениями.
Tuesday, March 8th, 2011
8:29 pm
Boost в Code::Blocks

  1. Settings -> Global Variables
    1. Создать новую переменную: Нажать кнопку New в строке с Current Variable. Ввести "boost"
    2. Builtin fields -> base: C:\Programming
    3. Builtin fields -> include: $(#boost)\boost_1_46_0

  2. Settings -> Compiler and debugger -> Global compiler settings -> Search directories -> Compiler -> Add: $(#boost.include)


То же можно делать и с другими библиотеками
Friday, March 4th, 2011
1:11 pm
ы++
Most C++ programmers are familiar with the ternary operator:
x = (y < 0) ? 10 : 20;
However, they don't realize that it can be used as an lvalue:
(a == 0 ? a : b) = 1;
which is shorthand for
if (a == 0)
    a
= 1;
else
    b
= 1;
Use with caution :-)
Tuesday, February 15th, 2011
10:10 pm
Просмотр массива в отладке в MSVC
чтобы какую-то переменную просмотреть в отладке, как массив, нужно в Watch написать имя переменной, запятую и желаемое количество элементов массива
скажем, переменная: pArray
тогда в Watch'е: pArray ,10
Wednesday, December 8th, 2010
2:05 pm
vbs (и т.п.) Run as Administrator
Для запуска скрипта запускается исполняемый файл интерпретатора (cscript, wscript, mshta.exe и т.п.). Для того, чтобы запустить скрипт под админом, нужно запустить под админом этот интерпретатор. Некий человек пробовал по всякому.
  1. нет пункта Run as administrator
  2. нет вкладки Compatibility в свойствах
  3. игнорирование blablabla.vbs.manifest
  4. запуск команды runas с ключом /trustlevel:unrestricted не работает
  5. запуск cmd под админом и запуск скрипта из-под него не работает

Вот содержимое reg-файла, который добавляет пункт 'Run as administrator' в контекстное меню

[HKEY_CLASSES_ROOT\vbsfile\shell\runas]

[HKEY_CLASSES_ROOT\vbsfile\shell\runas\command]
@="C:\\Windows\\system32\\wscript.exe \"%1\" %*"
"IsolatedCommand"="C:\\Windows\\system32\\wscript.exe \"%1\" %*"


то же делается с htafile и т.п.

Можно того же добиться без вмешательства в реестр. Скрипт, который запускает main.vbs под админом.

Set objShell = CreateObject("Shell.Application")
Set FSO = CreateObject("Scripting.FileSystemObject")
strPath = FSO.GetParentFolderName (WScript.ScriptFullName)
If FSO.FileExists(strPath & "\MAIN.VBS") Then
     objShell.ShellExecute "wscript.exe", _
        Chr(34) & strPath & "\MAIN.VBS" & Chr(34), "", "runas", 1
Else
     MsgBox "Script file MAIN.VBS not found"
End If
[ << Previous 20 ]
About LiveJournal.com