Archive for the ‘Кодинг’ Category

C++ magic

1
2
volatile const char *str = "false";
cout << str;

Выводит, разумеется, true. Объяснение под спойлером.

Spoiler

Поскольку volatile является частью типа, а переопределенного оператора <<
для volatile const char * нет, аргумент успешно приводится к типу bool.

Posted on May 18, 2011 at 21:17 · Permalink · Leave a comment
In: Кодинг

Mirelle Quine

Пример программы-квайна, выводящей саму себя, на Mirelle:

1
2
3
4
5
var q = "var q='#'
print q.replace(39.char, 34.char).replace(35.char, q)
io:wait"
print q.replace(39.char, 34.char).replace(35.char, q)
io:wait

Не самый элегантный квайн, наверное, но куда красивее и проще чем на C# :)

Posted on May 3, 2011 at 22:24 · Permalink · Leave a comment
In: Кодинг

Project Ceylon

Почитал тут про Project Ceylon, который позиционируют как “новую Java, созданную с учетом 15 лет опыта”. И что же мы имеем?

И в то же время:

Они что, смеются? С таким синтаксисом это никогда не станет заменой яве. В сишарпе всё это уже давно есть – и нулибельные типы, и инициализаторы массивов – а еще перегрузка, нормальный синтаксис для геттеров и сеттеров, анонимные функции, не говоря уже о LINQ.

Posted on April 19, 2011 at 19:50 · Permalink · Leave a comment
In: Кодинг

Javascript Garden


Javascript Garden

Прекрасное руководство по ебатонкостям Javascript. Объясняет многие неочевидные вещи в JS, такие как:

Прекрасно переведено на русский язык, даже не захотелось читать оригинал.

Posted on March 24, 2011 at 16:55 · Permalink · Leave a comment
In: Кодинг

Mirelle is live

Проект Mirelle полностью выложен на Codeplex: сорсы, бинарники и полная вики-документация на английском языке.
Пока бета, так что багов там должно быть много – баг-репорты очень приветствуются.

Posted on March 21, 2011 at 01:52 · Permalink · Leave a comment
In: Кодинг

Mirelle Editor

Практически всё готово.

Posted on March 19, 2011 at 13:58 · Permalink · Leave a comment
In: Кодинг

Python: ввод данных

Постепенно начинаю знакомиться с языком Python, на который очень сильно хочу перелезть с PHP. К счастью, недавно вышел пакет Python Tools for Visual Studio, который очень сильно упростил мне жизнь. К сожалению, он еще далек от совершенства (нет дебага, проблемы с кодировками), но все равно очень приятное дополнение.

А вот одна особенность языка Python меня искренне позабавила, к сожалению, в неприятном смысле.

Для того, чтобы попросить пользователя ввести какие-то данные, первая функция, которая приходит на ум – input(). И она действительно запрашивает у пользователя ввод, но как только ты жмешь Enter, откуда-то сыпятся эксепшены.

После чтения документации интернетов и документации оказалось, что input() после введения данных интерпретирует их как код на питоне и моментально исполняет его. А для ввода строки требуется использовать функцию raw_input().

И это весьма странно. В соответствии с правилами кодирования Хаффмана, у часто используемых функций должны быть более короткие имена. Получается, что в программы на питоне чаще вводят исполняемый код на питоне, чем строковые данные? :D

UPD: оказывается, в Python3 эта хитрость исправлена. input() теперь работает как raw_input(), а для имитации старого поведения можно использовать eval(). Есть все-таки в мире справедливость!

Posted on March 12, 2011 at 22:43 · Permalink · Leave a comment
In: Идиотека, Кодинг

Перехват консольного вывода C#

Допустим, существует какое-либо консольное приложение, чей вывод мне нужно показать \ использовать в своем графическом приложении на C#. Ниже предлагаю достаточно удобный способ, как это сделать.

В интернете существуют и более простые способы, однако в моем случае приложение работает долго и выводит текст постепенно. Таким образом, необходимо выводить текст на форму по мере того, как он выдается приложением.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace Interceptor
{
  // делегат для обновления текстбокса
  public delegate void TextDelegate(string str);

  public partial class Form1 : Form
  {
    // внешний процесс
    public Process Proc;
    // поток выполнения процесса
    public Thread Thr;

    public Form1()
    {
      InitializeComponent();
    }

    private void AddText(string str)
    {
      // в консоли выводится просто \n
      // для сохранения перевода строки добавляем \r
      textBox1.Text += str + "\r";
    }

    private void ExternalProcess()
    {
      // создаем внешний процесс, настраиваем его свойства
      Proc = new Process();
      Proc.StartInfo.CreateNoWindow = true;
      Proc.StartInfo.UseShellExecute = false;
      Proc.StartInfo.RedirectStandardOutput = true;
      Proc.StartInfo.FileName = "test.exe";

      // запускаем внешний процесс
      Proc.Start();

      // читаем его вывод и дописываем в текстбокс
      var del = new TextDelegate(AddText);
      var buf = new char[256];
      while (!Proc.HasExited)
      {
        var len = Proc.StandardOutput.Read(buf, 0, buf.Length);
        var str = new string(buf, 0, len);
        // для работы между потоками нужно использовать делегат
        textBox1.Invoke(del, str);
        System.Threading.Thread.Sleep(10);
      }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
      // создаем новый поток выполнения внешнего процесса
      Thr = new Thread(new ThreadStart(ExternalProcess));
      Thr.Start();
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
      // убиваем поток при закрытии формы
      Thr.Abort();
    }
  }
}

На самом деле, все достаточно просто – при показе формы создаем процесс в отдельном потоке и постоянно читаем его вывод. Когда форма закрывается, процесс необходимо уничтожить.

Posted on March 10, 2011 at 16:44 · Permalink · Leave a comment
In: Кодинг · Tagged with: , , ,

Секреты Far Manager

Несмотря на то, что пользуюсь Far Manager’ом уже порядка 10 лет, до сих пор нахожу в нем новые удобные функции, о которых раньше не догадывался.

1. Открытие консоли

Чтобы быстро посмотреть, что происходит в консоли, можно зажать Alt + Ctrl + Shift. Когда отпустишь – панельки появятся снова. Нажатие Ctrl + O скрывает их до повторного нажатия, а Ctrl + P скрывает только одну, неактивную панель.

2. Регулярные выражения

Диалог выделения или отмены выделения файлов по маске поддерживает регулярные выражения! Формат – /regexp/mod, причем регулярные выражения можно использовать вместе с обычными, например совмещая их так:

*.exe|/^[a-z]{20}\.mod$/

3. Быстрые ярлыки

Far позволяет назначить 10 быстрых ссылок на часто используемые папки. Для назначения ссылки нужно нажать Right Shift + Right Ctrl + (цифра), а для перехода в эту папку – Right Ctrl + (цифра). Можно использовать только цифры в основном блоке клавиатуры. Работает также с ftp-серверами!

(more…)

Posted on March 9, 2011 at 15:07 · Permalink · Leave a comment
In: Кодинг

Типизация аргументов в PHP

Несмотря на то, что PHP является языком с нестрогой динамической типизацией, в нем есть возможность задать тип для аргументов функции:

1
2
3
4
function test(bool $arg)
{
  echo $arg ? "yes" : "no";
}

Однако эта возможность, как и следовало ожидать от возможностей в PHP, работает через раз. Например, я хочу добавить значение по умолчанию:

1
2
3
4
function test(bool $arg = false)
{
  echo $arg ? "yes" : "no";
}

Получаю болт по всей морде в виде фатальной ошибки:

Fatal error: Default value for parameters with a class type hint can only be NULL in file.php on line 1

Оказывается, у типизированных аргументов единственным значением может быть ключевое слово NULL.
Первый факап: на аргументы типа array это ограничение не распространяется. Их можно задавать, как и всегда:

1
2
3
4
function test(array $arg = array(1, 2, 3))
{
  echo $arg ? "yes" : "no";
}

А теперь, самое сочное!

1
2
3
4
5
6
7
function test(string $arg = null)
{
  echo $arg ? $arg : "Empty";
}

test();
test("hello");

Запускаем, и уходим в медитацию:

Catchable fatal error: Argument 1 passed to test() must be an instance of string, string given

Error: must be string, string given.

Глюк актуален в php 5.3.5 и работает только для встроенных типов, кроме array. Для значений по умолчанию не проявляется.

Posted on March 8, 2011 at 00:37 · Permalink · Leave a comment
In: Идиотека, Кодинг