вторник, 11 ноября 2008 г.

Играю Fallout 3

Постапокалиптический мир очень захватывает. В силу своей любопытстности больше скитатаюсь по пустоши, чем выполняю основную ветку сюжетной линии. Хотя квест от Мойры по написанию руководства старательно добиваю. Вчера ночером забрался к коллектор населенный дикими гулями, адреналинчику в крови заметно прибавилось, эти чудни бегают очень быстро, не убежишь, а темнота усиливает эффект неожиданности, но боевой дробовик заметно убавляет их прыть. С супермутантами в открытом поле стягаться тяжело, но при наличии гранат/мин/крышкомин и хоть какого то бугорка можно отбится от одиночки с миниганом, а в бетонных джунглях они выносятся отстрелом рук и головы из-за укрытия, после отстрела руки они либо прячуться либо бегут на встречку, где тем же дробовиком прибиваются к полу.

Так что Bethesda потрудилась на славу! Обзоры игры не читаю, и не буду!

А вот список тех кто озвучивал персонажей игры, я так и знал - DJ ТриДогНайта (ведущий радио "Новости Галактики") озвучивал Борис Репетур. К озвучке нареканий нет, а вот перевод местами хромает. Надо бы добавить музыки в стиле 50-60х на радио "Новости Галактики", а то старая уже приелась.

четверг, 6 ноября 2008 г.

Linux: Удалить файлы рекурсивно

Казалось бы, простая задачка. В Windows все просто - del /S smth.*, готово. Все файлы по маске smth.* в текущей директории и ниже будут удалены.

В Linux чуток сложнее.
Есть в Linux команда rm, но она дальше текущей директории не идет, зато прекрасно понимает полный путь к файлу, чем мы и воспользуемся.
Получить список всех файлов в текущей директории и поддиректориях по маске позволяет команда find -name "smth.*", ее вывод то нам и нужен. Осталось его перенаправить на вход команды rm. Это можно сделать 5ю способами:
xargs - формирует команду rm с аргументами считанными из стандартного ввода на которой мы подадим вывод команды find. нюансы использования описаны тут
1. find /path/to/dir -type f -name 'smth*' -print0 | xargs -0 rm;
exec - перенапаравляем вывод команды find на вход команды rm
2. find -name 'smth.*' -exec rm {} \;
UPD.
find - самый рульный способ
3. find -name 'smth.*' -delete;
UPD.
Способы подсказанные камрадом goodvin
4. find . -type f -name 'smth*' -delete
5. find . -type f -name 'smth' -exec rm -f -- "{}" \;

Может есть ещё какие нибудь способы??

среда, 5 ноября 2008 г.

TiddlyWiki и Google Chrome

Наконец нашел решение проблемы - Google Chrome не умел сохранять TiddliWiki.

Получилась замечательная связка персональной Wiki и быстрого браузера.
До этого приходилось пользоваться ОгнеЛисом для работы с TiddlyWiki.

четверг, 30 октября 2008 г.

Oracle: Макcимальное количество аргументов хранимой процедуры?

Вопрос возник не на пустом месте, в ходе отладки чужого кода наткнулся на PL/SQL процедуры количество аргументов которых варьировалось от 120 до 190.
Читать текст с объявлением или вызовом такой процедуры весьма нудное занятие, про дебаг и говорить не стоит.

В руководстве слушателя "Oracle Database 10g: Основы PL/SQL" том 1, [9-5] в разделе про синтаксис процедуры написано слудующее:
аргумент - Имя, даваемое параметру процедуры. С каждым аргументом связан
тип_параметра (mode) и тип данных. Допускается любое
количество аргументов, разделенных запятыми.

На самом деле это не так!

Проверка
Выполняем следующий скрипт:
set termout off
store set sqlplus.cfg replace
set pagesize 0
set linesize 10000
set tab off
set trimspool on
set echo off
set verify off
set feedback off
set timing off
set recsep off
spool p_test.sql

SELECT  'create or replace procedure p (' FROM DUAL
/
WITH a AS (  SELECT  LEVEL b
         FROM  DUAL
      CONNECT BY  LEVEL <= 8191)
SELECT  ' p' || b || ' in number,'
 FROM  a
/
SELECT   ' p in number'
     || CHR (10)
     || ' ) as'
     || CHR (10)
     || 'begin'
     || CHR (10)
     || ' null;'
     || CHR (10)
     || 'end;'
     || CHR (10)
     || '/'
 FROM  DUAL
/
spool off
@sqlplus.cfg
set termout on
@p_test.sql


* This source code was highlighted with Source Code Highlighter.


результат:
D:\sqlplus srv@vm @test.sql

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 30 17:48:33 2008

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options


Warning: Procedure created with compilation errors.

SQL> show errors;
Errors for PROCEDURE P:

LINE/COL ERROR
-------- -----------------------------------------------------------------
1/0 PLS-00123: program too large (Diana nodes)
SQL>


А вот создать процедуру с 8187 аргуметами вполне возможно.

Если все таки нужно передать много параметров в процедуру или функцию лучше воспользоваться советом Томаса Кайта.

Ссылки:
1. How many parameters can a stored procedure have?
2. PL/SQL User's Guide and Reference Release 2 (9.2) - PL/SQL Program Limits
3. Oracle® Database PL/SQL User's Guide and Reference 10g Release 2 (10.2) - C PL/SQL Program
Limits

4. Writing a function which accepts unlimited parameters

среда, 22 октября 2008 г.

How to export EventLog in .evt format

Как сделать экспорт журналов событий в evt формат из C# 2.0?
Занадобилось мне сделать утиль, чтоб у пользователей логи забирать и не тратить свое время на объяснение чего и откуда экспортировать.
Сделал только для System и Application журналов, добавить остальные не проблема, знаючи...
Собственно:
using System;
using System.IO;
using System.Runtime.InteropServices;

namespace LogHarvester
{
  class Program
  {
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern bool BackupEventLog(IntPtr hEventLog, string backupFile);

    // OpenEventLog PInvoke overloaded call supporting full parameters.
    [DllImport("advapi32.dll", SetLastError = true, EntryPoint = "OpenEventLog")]
    public static extern IntPtr OpenEventLog(
             [MarshalAs(UnmanagedType.LPStr)] String lpUNCServerName,
             [MarshalAs(UnmanagedType.LPStr)] String lpSourceName);

    static void Main()
    {
      BackupEventLog(OpenEventLog(null, "Application"), Path.Combine(Environment.CurrentDirectory, "application.evt"));
      BackupEventLog(OpenEventLog(null, "System"), Path.Combine(Environment.CurrentDirectory, "system.evt"));
    }
  }
}

* This source code was highlighted with Source Code Highlighter.

вторник, 21 октября 2008 г.

Идеальный программист

Sergey Rozovik очень хорошо описал кто такой "Идеальный программист".

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

понедельник, 20 октября 2008 г.

Oracle RAC: "gc cr multi block request" hang

Целую неделю бился пытаясь выяснить причину подвисания с виду простых запросов select count(*) from ttt, в событиях ожидания которых наибольшее время висел "gc cr multi block request".
Решить проблему можно уменьшив db_file_multiblock_read_count. В моем случае параметр пришлось уменьшить до 7.