Страницы

Поиск по вопросам

четверг, 19 марта 2020 г.

Нагрузка на сервер при запросе типа IN()

#sql #mysql


Такой вопрос: если я делаю sql запрос типа WHERE id IN(12,3,54,5,6,8,234) и так далее,
не станет ли это причиной, например, падения сервера, если количество этих самых IN
возрастет до, например, 10000 идентификаторов?    


Ответы

Ответ 1



Ну подумайте, 10к идентификаторов. Бегло - это 45к-50к символов. Только распарсить такой запрос - уже проблема. Упасть может и не упадет, но нагрузит капитально. В любом случае - так лучше не делать.

Ответ 2



MS Sql Server бросает исключение, если у запроса более 2100 параметров. У MySql тоже могут быть подобные ограничения. Если мне нужно сделать выборку, у которой в IN больше, чем 2100 значений, я группирую набор значений и делаю несколько запросов.

Ответ 3



Не упадет. Но при таком количестве уже стоит подумать о введении дополнительного столбца/критерия/кэширующей таблички. Часто подобная вашей ситуация возникает в интернет магазинах с большим каталогом, когда требуется перекрестить несколько результатов поиска, а произвести повторный поиск неэкономично. Там применяется кэширование.

В каких случаях совместное использование cin и scanf может привести к ошибке?

#cpp


Считается плохим тоном использовать С и С++ функции чтения потока в одной программе.
Но тем не менее ранее это никогда не приводило к ошибкам. 
Совсем недавно, решая задачу, в которой нужно последовательно читать int и char[]
столкнулся с такой ситуацией. Если читаем:

int через scanf, а char[] через cin 
int через cin, а char[] через scanf

то это приводит к неправильному ответу. Если же оба параметра считываем одинаковой
функцией, то решение проходит. 
Поэтому возник вопрос: при каких ситуациях возможны конфликты между этими функциями.    


Ответы

Ответ 1



Скорее всего, вы делаете что-то неправильно. По умолчанию библиотеки ввода вывода C и C++ синхронизированы, поэтому можно безопасно чередовать использование функций из одной и другой библиотеки. Синхронизацию можно включить-выключить явно, используя функцию std::ios_base::sync_with_stdio.

Обработка изменения выбранного значения

#android #java


Как отслеживать изменение, что пользователь выбрал другой пункт в Spinner? У меня
падает исключение:
ERROR/AndroidRuntime(3903): FATAL EXCEPTION: main
        java.lang.RuntimeException: setOnItemClickListener cannot be used with a spinner.
        at android.widget.Spinner.setOnItemClickListener(Spinner.java:257)
    


Ответы

Ответ 1



Use the setOnItemSelectedListener(), Luke.

nginx прокси для nodeJS

#nodejs #nginx


У меня гостевая машина с установленным Debian GNU/Linux, ip-адрес вот такой 10.0.2.15.
Я хочу поставить nginx + nodeJS. Мне нужно настроить прокси так, чтобы когда я ввожу
любой адрес кроме 10.0.2.15/node отдавалась статика посредством nginx, а когда я напишу
10.0.2.15/node запрос попадал на node.

Вот конфиг nginx.conf, в директиве http:

server {
    #ip:порт который будем слушать
    listen 10.0.2.15:80;

    #перенаправление на NodeJS
    location /node {
        #ip:порт nodeJS
        proxy_pass http://10.0.2.15:8080;
        proxy_set_header Host $host;
    }

    #всё остальное отдает nginx
    location / {
        #путь к каталогу веб сервера
        root /home/dirtez/www;
    }
}


Всё работает, если набираю например 10.0.2.15/index.html - нормально(есть ли файл
есть), 10.0.2.15/foo - 404 (файла нет, всё правильно). И node работает, если набрать
10.0.2.15/node. Но проблема в том что он работает, если набрать и nodes и nodeasdas,
также node/sdad, также nodeasd/asd.

Как сделать чтобы node запускался только при 10.0.2.15/node?
    


Ответы

Ответ 1



Можно написать location = /node тогда только для запросов к /node, второй вариант: location /node/ - но в последнем я не уверен.

C# запуск консольного приложения из программы.

#c_sharp #winforms


Всем доброго времени суток. Есть необходимость запустить консольное приложение из
своей программы. Но так, чтобы эта консоль НЕ закрывалась после вызова. А то, только
и видно, что консоль запустилась и сразу же закрылась. Желательно, чтобы консоль не
отображалась. То есть, работала в скрытом режиме.
System.Diagnostics.Process.Start("путь к консольному приложению");

И желательно запускать, а точнее, даже важно, запускать приложение с командой.
В виже: путь-к-программеconsole.exe --conamd

Спасибо за помощь. Всем хорошего настроения. :)    


Ответы

Ответ 1



//создание параметров var startInfo = new ProcessStartInfo { //имя файла FileName = "fileName.exe", //скрытое окно WindowStyle = ProcessWindowStyle.Hidden, //ваши аргументы Arguments = "-command" }; //запуск процесса Process.Start(startInfo);

Как форматировать жесткий диск с помощью C++?

#cpp


создаю программу для форматирования жесткого диска через свою программу. Но как не
знаю, точнее знаю что можно через SHFormatDrive(); Но не уме обращаться с ним, как
должен быть выглядеть код при этом?
cin >> (path1);
SHFormatDrive (0, toupper(path1[0])-'A', SHFMT_OPT_FULL, 1);
    


Ответы

Ответ 1



В MSDN же все написано, английский учи) То что после имени функции в скобках - это параметры. Первый парметр - идентификатор "родительского" окна. Т.к. предполагается что программа консольная, то пишем 0. Второй параметр - номер диска, если 0 - то диска А, если 1 - то диск B, 2 - диск C и т.д. Третий параметр - всегда такой. Четвертый параметр - если 0 то все по умолчанию, если 1 - то быстрое форматирование, если 2 - то создать загрузочную дискету (если выбранный диск - флопик) Форматирование не начнется автоматически, пользователю еще нужно будет нажать кнопку "начать" UPD То что написно в MSDN: DWORD SHFormatDrive( __in HWND hwnd, UINT drive, UINT fmtID, UINT options); -- это прототип функции, он показывает какой тип значения функция возвращает (в данном случае это DWORD, просто 4-байтовое целое число без знака) и типы и имена ее параметров (это называется формальными параметрами). При вызове функции не нужно писать тип возвращаемого значения, а вместо формальных параметров нужно писать фактические параметры, то есть конкретные значения или переменные. Типы параметров (HWND, UINT и прочее __in) писать тоже не нужно. Теперь, допустим у тебя в path1 лежит буква диска (будем считать что сама буква лежит в самом начала этой строки). Чтобы отформатировать этот диск нужно сделать вот что: SHFormatDrive (0, toupper(path1[0])-'A', SHFMT_ID_DEFAULT, 0); Что же это за второй параметр такой? А вот что это: path1[0] - берем первый символ в строке path1 toupper(path1[0]) - переводим этот символ в верхний регистр, например если было 'g' то стало 'G' toupper(path1[0])-'A' - вычисляем разницу между полученным символом и символом 'A'. К примеру если пользователь ввел букву 'A', то разница будет равна 0, если 'B' - то 1 и так далее, то есть то что нам и нужно. Кстати, чтобы функция SHFormatDrive заработала, нужно вначале вставить #include , про это тоже написано в той же статье MSDN почти в самом низу в табличке в строке header. Чтобы заработал toupper нужно подключить #include UPD2 Чтобы SHFormatDrive работала в Dev-C++, нужно в начале исходника, где-нибудь после инклудов вствить две строки: __declspec(dllimport) WINAPI DWORD SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options); #define SHFMT_ID_DEFAULT 0xFFFF или, так как у нас тут c++, то вторая строка должна выглядеть так: const int SHFMT_ID_DEFAULT = 0xFFFF; или просто вручную в вызове функции заменить SHFMT_ID_DEFAULT на 0xFFFF.

Описание “дерева” Oracle в Django models.py

#oracle #python #дерево #django


Доброго времени суток. Помогите, пожалуйста, со следующим вопросом.
Необходимо описать модель дерева в Django. Используемая БД - Oracle.
Описываю так:
class TelDivisions(models.Model):
    parent = models.ForeignKey('self')
    name = models.CharField(max_length=50, blank=True)
    class Meta:
        db_table = u'tel_divisions'

но таким образом parent ссылается сам на себя. Каким образом сделать так, чтобы он
ссылался на столбец id данной таблицы?
Думал может получиться вот так:
class TelDivisions(models.Model):
    parent = models.ForeignKey(TelDivisions, db_column='id', blank=True)
    name = models.CharField(max_length=50, blank=True)
    class Meta:
        db_table = u'tel_divisions'

но команда python manage.py validate выявила:
parent = models.ForeignKey(TelDivisions, db_column='id', blank=True)
NameError: name 'TelDivisions' is not defined

Что, собственно, логично. Как же быть?
Спасибо.    


Ответы

Ответ 1



Рекомендую Вам использовать django-mtpp. Она была создана как раз для отображения древовидных структур в реляционной модели. А что касается вашего вопроса: parent = models.ForeignKey('self', db_column='id', blank=True) И всё должно заработать. Ссылаться надо на самого себя через self. Данный пример описан в django docs. И ещё одно. Если не укажите null = True, то не сможете создать ни одного корновего экземпляра (т.е. такого, у которого нет родителя). Итого: parent = models.ForeignKey('self', db_column='id', blank=True, null = True) db_column='id' можно не указывать, т.к. он и так будет ссылаться по умолчанию на ключевое поле таблицы, т.е. id.

Ответ 2



Правильно делаешь в первом варианте, в базе будет столбик parent_id типа integer. Гляньте статейку и комментарии почитайте, там есть полезные ссылочки, сам на днях разбирался с этим вопросом: деревья в джанго-шаблонах Если дерево многоуровневое, то mtpp все рекомендуют, но если один уровень вложенности как у меня, то я без дополнительных библиотек обошелся.

Век живи, век учись

#cppbuilder


Может быть, это полезно некоторым, вроде меня. Читал Кормена "Алгоритмы..." и неожиданно
для себя обнаружил, что освобождение от отладки (Project->Options->Compiler->Release)
увеличивает скорость исполнения по крайней мере в 4 раза.
Программа "Сортировка вставкой" на 32000 случайных целых в диапазоне величин 31000
- 32000 выполнена с отладкой за 1.6 с, а без оной за 0.36 с. С чем себя и поздравляю!    


Ответы

Ответ 1



Ясное дело. Включение отладки добавляет дополнительный код в вашу программу, некоторые дополнительные проверки. Кроме того, оптимизация кода минимальная, чтобы сделать саму отладку возможной иначе соответствие между машинным кодом и исходным кодом станет не однозначным.

Эмулятор андроида не показывает изменений

#android_sdk #android #java


Здравствуйте. Установил все необходимое, как тут. Создаю проект, но когда запускаю
эмулятор, то все мои изменения в Strings.xml, в нем не отображаются, вместо этого на
экране эмулятора только надпись Android. В Graphical Layout в main.xml все изменяется,
но в запущенном эмуляторе все та же надпись. Что делать?


    


Ответы

Ответ 1



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

Как увеличить объем выделяемой памяти программе на java?

#java #jvm


Как увеличить объем выделяемой памяти программе на java
    


Ответы

Ответ 1



Заходишь в java в панельке управления, открываешь вкладку "java", жмешь "view" и в графе "Runtime Parameters" вписываешь следущее: -XmsNm -XmxNm, где N - количество оперативной памяти, которое ты желаешь выделить для java платформы. В первом случае ты указываешь минимальный порог, а во втором максимальный. Пример: -Xms2048m -Xmx2048m ,т.е, я желаю выделить на java 2 Гб оперативной памяти.

Сортировка дат

#php #sql #mysql


Добрый день.
Есть таблица вида
|id| activ | dateTime |
------------------------------
|1 | no-activ | 2012-01-13 01:06:50 |
|2 | activ   | 2012-01-13 01:06:50 |
|3 | activ | 2012-01-13 01:06:50 |
|4 | no-activ | 2012-01-13 01:07:50 |

Сейчас 2012-01-13 01:07:00. Надо отсортировать все записи которые меньше чем сейчас
и activ = 'activ' и выввести все id. Я делаю так:
"SELECT COUNT(id) FROM `activ` WHERE `dateTime`


Ответы

Ответ 1



Суля по первой таблице в запросе ошибочно используется несуществующее поле dateTime. Нужно: SELECT COUNT(id) FROM `activ` WHERE `date`

Ответ 2



Храните дату в timestamp, по нему и сортируйте int mktime ([int hour [, int minute [, int second [, int month [, int day [, int year [, int is_dst]]]]]]]) Получение текущей даты time() Чтоб вернуть обратно в привычный вид используйте strftime('%d.%m.%Y',дата в timestamp);

Реализация представления в Django ORM

#python #orm #django


Здравствуйте.
Как можно реализовать вьюху (представление в mysql) в Django ORM.
Например, есть класс Группы, нам надо вытащить студентов (группы:'студенты', 'преподаватели')
class People:
    name = models.CharField(u'Название', max_length=150)
    describe = models.CharField(u"Описание", max_length=150 )

Т.е. нам надо создать представление для того, чтобы потом связывать с этой моделью
с полем id_stident
class Group_stud:
    id_student = ForeignKey(Student)

Вот модель Student'a нам нужна! 
Как сделать не знаю, в mysql можно было бы создать представление с фильтром и все
было бы гуд, а у нас ORM, так не пойдет. Можно как нибудь такое реализовать?    


Ответы

Ответ 1



Конечно не то, что хотел, но этим можно обойтись. Реализовал с помощью class Manager подсказал @rnd_d class StudentManager(models.Manager): def get_query_set(self): return super(StudentManager, self).get_query_set().filter(groups__name='Students') # в User есть поле groups и идет фильтр по полю name class User(User): students = StudentManager() Выходные данные >>> from main.models import User >>> User.students.all() []

Ответ 2



Related objects reference

Определение столкновений в Android

#разработка_игр #android #java


Столкнулся с проблемой, не могу отловить столкновение двух прямоугольников. Пытался
сделать это при помощи intersects(), но оно требует два прямоугольника внутри метода,
а мне нужно отловить только столкновение с одним прямоугольником. Вот что я пишу:
  Iterator i = enemy.iterator();
          while(i.hasNext()) {
              Enemy e = i.next();
              if(((Ball) ball).getRect().intersects((e.getRect())))
              {
                  i.remove();
              }
          }

Чего оно хочет не знаю, должно работать, в уроках на ютубе видел что там применяется
один объект и все было нормально... В чем трабла?
UPDATE:
Значит так. Enemy и Ball - это два класса; балл - это пуля, которая должна убивать
врага, соответственно, энеми - это враг, которого должен убивать бал. Мне нужно отловить
столкновение этих двух объектов, отлавливать пытаюсь при помощи intersects, который
требует иметь два прямоугольника, хотя в видеоуроке, который я смотрел, повествователь
туториала используется всего лишь один объект класса, второй используется для вызова
интерсекта, как в моем примере кода. Вот и вопрос, чем отличается его интерсект от моего?
Вот его урок Пишем 2D игру на java - Часть 7.
Ошибка которую мне выдает когда я начинаю компилировать 

The method intersects(Rect, Rect) in the type Rect is not applicable for the arguments
(Rect)

UPDATE 2:
Нашел я способ который решает мою проблему, возможно кому нибудь пригодится. Я почти
полностью видоизменил код, вот как он выглядит:
private void testCollision() {
        Iterator i = enemy.iterator();
        Iterator b = ball.iterator();

          while(i.hasNext() && b.hasNext()) {
              Enemy enemies = i.next();
              Ball balls = b.next();

              if (Math.abs(balls.x - enemies.x) <= (balls.width + enemies.width) / 2f
                      && Math.abs(balls.y - enemies.y) <= (balls.height + enemies.height)
/ 2f) {
                        i.remove();
                        b.remove();
              }
          }
    }

balls.x - enemies.x - центральная граница нашего объекта.
UPDATE 3:
Снова открываю тему так как у меня возникла проблема, 

"нужно вернуть итератор снова на
первый элемент, потому что он уже
загнан предыдущим проходом на
последний и hasNext() ивозвращает
false."

Это цитата одного человека который пытался мне объяснить как исправить ошибку, но
так и не смог объяснить. Может кто-то сможет мне сказать как это сделать? Код я использую
тот же. 
После прочтения этой цитаты несколько раз - у меня сломался мозг    


Ответы

Ответ 1



@dajver, Сами пишете что ошибка при компиляции : The method intersects(Rect, Rect) in the type Rect is not applicable for the arguments (Rect) Это значит, что метод Rect.intersects() хочет два аргемента (оба типа Rect). Видимо надо написать (если ищем пересечение прямоугольной пули с прямоугольным врагом): if( ((Ball)ball).getRect().intersects(e.getRect(),((Ball)ball).getRect()) ) { i.remove(); break; // это если одна пуля может уложить только одного врага }

Ответ 2



вы бы ошибку выложили, скорее всего у ball нету метода getRect. продолжая читать мысли: сделайте этот метод в Ball, возвращая прямоугольник описанного ball или вписанного. осмелюсь предположить что x, y это центр ball. А Rect это координаты верхней левой и правой нижней точек следовательно должно быть чтото типа: public Rect getRect() { new Rect(x - width/2, y - height / 2, x + width/2, y + height / 2) }

Использование шаблонной системы Django

#django


Доброго времени суток!
Подскажите, пожалуйста, возможно ли использовать (если да, то как) в своем cgi-скрипте
шаблонную систему Django. Сам фреймворк установлен.    


Ответы

Ответ 1



Да. Можете. Причём где угодно: >>> from django.template import Template, Context >>> from django.conf import settings >>> settings.configure() >>> t = Template(u'Меня зовут {{ my_name }}.') >>> c = Context({'my_name': 'SkyFox'}) >>> t.render(c) u'Меня зовут SkyFox.' В официальной документации это тоже описано: https://docs.djangoproject.com/en/dev/ref/templates/api/#configuring-the-template-system-in-standalone-mode, но, правда, сложно найти.

Ответ 2



да. ты просто в urls пишешь что тебе надо вернуть файл с разширением cgi, и указываешь вьюху в которой рендришь все что тебе надо. например что-то в таком духе: urlpatterns = patterns('search.views', url(r'^my.js$','my_js',name="my_js"), ) def my_js(request): return render_to_response('search/my.js',{ 'metros':Metro.objects.filter(type=MetroType[0][0]).distinct(), 'towns':BaseModel.objects.values('town').distinct().order_by('town') , } ,mimetype="application/x-javascript")

Хостинги для публикации кода

#хостинг #контроль_версий


Есть два понятия:


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


Вопрос в следующем. Я пробовал пользоваться Github, но это несколько затратно ввиду
моих нужд. Нужно, чтобы на некоем сайте можно было начать проект, была примитивная
возможность создавать папки, сливать туда файлы с кодом, и этот же код, просматривать
онлайн. Сливать именно через браузер, а не через систему контроля версий (часто работаю
на разных компьютерах, а устанавливать и настраивать git, желания нет).

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

Заранее спасибо за дельные советы и ссылки.
    


Ответы

Ответ 1



Обычно в таких ситуациях (когда система контроля версий - слишком тяжеловесно) используют Dropbox. UPD Несколько извращенный вариант, но просмотр кода он-лайн есть, да еще и с примочками: CodeRemarks

Ответ 2



Может быть вам просто подойдет онлайн-хранилище файлов как dropbox,или нужно что-то более специфичное?

Ответ 3



Мне нравится система контроля версий Bazaar. Код сливаю на launchpad, где можно посмотреть код онлайн. Система является распределенной, что является удобной, когда пишу код на разных компьютерах, в разных операционных системах. http://ru.wikipedia.org/wiki/Bazaar

Ответ 4



OwnCloud похоже то, что требуется. Можно поставить свой сервер, можно купить хостинг с этим сервисом. Добавлено. Если все-таки выбирать из всех возможных вариантов, в том числе и с контролем версий, то можно начать отсюда: сравнение хостингов

Как лучше сделать динамическую ссылку на SQLite

#c_sharp #sqlite


У SQLite есть версии для x86 и x64. Компьютеры и Windows у нас тоже есть разные.
Нужно, чтобы всё работало и собиралось на компьютерах разных разработчиков с разными CPU.
Пока что у меня есть только такое решение: не ссылаться из сборок на SQLite, а загружать
сборки динамически в зависимости от CPU, а для вызова свойств и методов использовать
тип dynamic. Но это как-то криво выглядит.    


Ответы

Ответ 1



Any CPU не катит по описаным автором причинам. Я использовал кусок кода в самом файле проекта (*.csproj), который в зависимости от архитектуры CPU добавляет ссылку нужной разрядности. Проект найти не могу, но что то типа такого: False ..\..\Lib\SQLite\x86\System.Data.SQLite.dll То есть по умолчанию добавляется например ссылка на х86 и небольшое условие, которое обновит сссылку на другую, если необходимо. В примере только наоборот.

Ответ 2



Экстремальное решение - перейти с SQLite на C#-SQLite. В этом случае, проблемы x32-x64 уже не будут актуальны.

Ответ 3



А почему нельзя использовать вариант Any CPU? Или х86 всегда, ведь х64 достаточно сносно работают с х86 UPD Приходилось работать с библиотекой System.Data.SQLite.dll (x86) тестировал и на х64 и на х86. Правда была какая то проблема, не помню уже, разрешилась дописанием одной строчки в app.config

Размер кучи в С++

#cpp


Можно ли в С++ ограничивать размеры используемой кучи?    


Ответы

Ответ 1



Интересный вопрос, никогда не сталкивался с этим. А вообще чисто в C++ нету такой функции, для этого используются ОС вызовы. Как сделать под Visual Studio. http://msdn.microsoft.com/ru-ru/library/f90ybzkh.aspx Установка данного параметра компоновщика в среде разработки Visual Studio Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Установка свойств проекта Visual C++. Щелкните папку Компоновщик. Выберите страницу свойств Система. Измените значение свойства Выделить память для кучи. Под Линукс mallinfo, malloc_stats или команда pmap из терминала

Получение данных из URL после знака # (hash) на сервере

#url #ajax #php #сервер


Доброго времени суток Друзья! Продолжаю писать свою CMS систему, среди её "фишек"
будет функция перехода в режим "быстрой навигации".
Режим быстрой навигации, это по сути реализация системы клиент -><- сервер :

Клиент заходит на сайт, обработчик на сервере принимает запрос вида "?m:s;p:h;i:1;",
генерирует каркас(шаблон) и отдаёт.
Клиент получив каркас, отправляет новый запрос(Ajax) на сервер и заполняет принятыми
в ответ данными необходимые поля.

Слишком растянул вступление для вопроса, но хотелось бы по лучше объяснить, что же
я хочу узнать.
При переходе по следующей ссылке : mysite.ru/?m=s&p=h&i=1 сервер получит эти данные
через суперглобальный массив $_GET.
При переходе по следующей ссылке : mysite.ru/#m:s;p:h;i:1; серверу необходимо получить
данные после знака решётки(#).
Всё бы ничего, есть вариант использовать Javascript и с помощью браузера передать
эти данные на сервер, но есть одно "но", а если эту ссылку открыл не браузер, а например
поисковый робот?
И тут собственно возникает вопрос :
Как на сервере только средствами PHP получить данные из URL после знака решётки(#) ?
Использовать функцию parse_url() можно, но она позволяет обработать строку запроса,
а не получить её.
В интернете по этому поводу мало информации, а где то ещё и видел, что средствами
только PHP сделать этого нельзя.
Есть сервис от Яндекс, Яндекс.Музыка, там реализовано аналогичное.
Хочу дополнить свой вопрос :
А можно ли с помощью Javascript превращать текущий URL в URL вида "?m:h;......."
при этом не переходя на него, хотелось бы как то всётаки реализовать такую совместимость
и для поисковика, и для пользователя, который захочет взять ссылку себе на заметку.    


Ответы

Ответ 1



Судя по всему такое всё-таки невозможно. Понимаю, меня тоже такой ответ не устраивает, но был опыт поиска решения. Сервер просто не получает хэш. Так что только яваскриптом его отдельно отправлять. Для поисковых роботов и прочих безяваскриптовых существ должны быть адреса вида mysite.ru/m:s;p:h;i:1;, по которым доступна та же самая информация без аякса.

Ответ 2



Как на сервере только средствами PHP получить данные из URL после знака решётки(#) ? Никак, якоря являются свойством локальной HTML-страницы и не передаются PHP-скрипту в любом случае.

Проблема с import в python при написании unittest'ов

#python #юнит_тесты


Мне достался в "наследство" некоторый немалый по размерам проект.

Структура папок проекта примерно такая:

projectname
---somefolder1
---somefolder2
------somesubfolder
---------__init__.py
---------module1.py
---------module2.py
---tests
------testsomesubfolder1
---------__init__.py
---------recipy1.py
---project.py


Для разработки я использую PyCharm. Для запуска у меня создана конфигурация python
в которой задано:

Script: D:\project\projectname\project.py
Working directory: D:\project\projectname


Я хочу покрыть часть проекта unit-test'ами. 

Например, мне необходимо написать тест в recipy1.py для некоторого класса из somefolder1/somesubfolder/module1.py

Как мне правильно сделать import для module1 в recipy1?

# recipy1.py
# как написать import для module1?
import unittest

class Test1(unittest.TestCase):

    def test_testtest(self):
        self.assertEquals(100,100)

    def test_fakeclass(self):
        obj = module1.SomeClass(10)
        self.assertEquals(10, obj.GetValue() )

if __name__ == '__main__':
    unittest.main()


Правильно ли я делаю, что пишу тесты в отдельной папке? 

Имеет ли значение Working directory, указанная в конфигурации python для запуска
проекта (запуска project.py). Какой Working directory мне необходимо указать для тестов?
    


Ответы

Ответ 1



Для начала создай в папках somefolder1 и somefolder2 файл __init__.py Иначе ты ни когда не достучишься до своих модулей. docs.python.org читаем внимательно;)

Генератор чисел логнормального распределения

#алгоритм #java


Здравствуйте!

Был у меня здесь недавно вопрос, пошел я по пути формирования нового значения, базирующемся
на распределении вероятности. Спасибо большое @neofit !

Получилась интересная картина, очень напоминающая лонормальное распределение:

распределение http://upload.dexstudio.com.ua/botva2.jpg

Теперь, собственно, вопрос, как генерировать число из этого распределения? Есть готовые
решения, например, для Java, которые способны принимать данное распределение и выдавать
значение где-то среди этой красоты?
    


Ответы

Ответ 1



Пример: Вам нужно чтобы событие 1 произошло с шансом 75%, событие 2 с шансом 10%, событие 3 с шансом 15%. Генерируете случайное число от 0 до 99. Если число в интервале 0-74, то событие 1, 75-84 событие 2, 85-99 событие 3. В Вашем вопросе все тоже самое. Сумма длин всех полосок- это число 99 в примере. Длина каждой полоски задает интервал попадания.

Ответ 2



Делаем так: Если мы считаем, что наш набор экспериментальных значений похож на логнормальное распределение, то берем функцию аппроксимирующую логнормальное распределение - например эту (по сути гаусс с логарифмами) Далее методом наименьших квадратов, находим 2 параметра логнормального распределения (в классике сигма задает "толщину", а мю - задает положение экстремума) Далее спокойно подставляем в полученную функцию значения и генератор готов.

Вес переменой

#php


Не подскажете функцию для подсчета веса переменой(массива)    


Ответы

Ответ 1



$before=0; $a='испытуемая переменная либо массив'; $before = memory_get_usage(); unset($a); echo 'размер переменной составил: ',$before-memory_get_usage(),' байт'; upd @Sh4dow на самом деле, 208 байт на $before, а echo бесплатно(я так понимаю из за того что строка не подгружается в память, а сразу выводится) да и есть еще несколько ньюансов, из критических то что php автоматически оптимизирует расход памяти и если переменные имеют одинаковое значение, то под последню выделяется память только для создания ссылки (208 байт) поэтому конструкция типа: $a='испытуемая переменная либо массив'; $a=$b; $before = memory_get_usage(); unset($a); echo 'размер переменной составил: ',$before-memory_get_usage(),' байт'; вернет 208 байт для числа, 128 для строки либо массива. p.s. а вот почему для числа выделяется столько памяти, для меня загадка.

Ответ 2



Если я правильно понял вопрос то: sizeof - получает количество элементов в переменной.

Ответ 3



Вес - ахахахх =) Прикольно сказано: "Вес переменной" ))) Функция: count(array) тоже возвратит длину массива) P.S С такими темпами скоро будут вопросы типа: "Как заглянуть в анус винде" =)))

UML редактор для C#?

#c_sharp #uml


В VisualStudio есть вполне рабочий редактор UML. В экспресс выпуске он исключен,
но мне он больше подходит по некоторым причинам. Также хочется разрабатывать проект
вне дома (на работе), где студия не доступна, а также не доступен флеш и интернет.
Какой редактор (Portable) можете посоветовать скачать и почему?    


Ответы

Ответ 1



Мне нравится Software Ideas Modeler. А отсюда вы сможете подобрать редактор, наиболее подходящий под ваши нужды/вкусы.

Ответ 2



Я не знаю как Вам, но мне нравится Visio 2010 На Celeron D, 2gb очень хорошо подошла. Сама прога работает быстро и без глюков Инсталяция тоже быстро пройшла на слабом компе Схема модели UML, Схема модели БД, Структура программы, Схема модели потоков данных, COM и OLE, Карта сайта, Корпоративное приложение и т д Рекомендую!

Ответ 3



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

Кодировка: UTF8 -> ANSI

#c_sharp #перекодировка


Столкнулся со следующей проблемой: есть файл в ANSI кодировке и я его считываю построчно,
но насколько я правильно понял, в C# эта считанная строка хранится в юникоде и в ней
я наблюдаю какие-то иероглифы. Что делаю я (на примере 1-ой строчки файла):
StreamReader read = new StreamReader(@"D:\(path)");

StreamWriter write = new StreamWriter(@"D:\(path)");

Encoding ANSI = Encoding.GetEncoding(1252);
Encoding UTF8 = Encoding.UTF8;
byte[] utf8_bytes,ansi_bytes;

utf8_bytes = UTF8.GetBytes(read.ReadLine());
ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes);

string ansi_str = ANSI.GetString(ansi_bytes);

write.WriteLine(ansi_str);

read.Close();
write.Close();

Но это почему-то не работает: в новом файле все также отображается много непонятных
вопросительных знаков. Заранее спасибо.    


Ответы

Ответ 1



Посмотрите внимательнее на код: прочитать текст, записанный в файле в UTF-8 (по умолчанию для StreamReader) записать текст в UTF-16LE строке (класс System.String в .NET) получить представление текста в кодировке UTF-8 в виде массива байтов преобразовать текст из UTF-8 в ANSI, получая массив байтов преобразовать текст из кодировки ANSI в UTF-16LE для записи в System.String записать текст (который сейчас в System.String), используя StreamWriter (который по умолчанию пишет в кодировке UTF-8) Итого получается, что текст проходит следующие преобразования: UTF-8 (StreamReader) -> UTF-16LE (System.String) -> UTF-8 (byte[]) -> ANSI (byte[]) -> UTF-16LE (System.String) -> UTF-8 (StreamWriter) Думаю, что теперь стало очевидно, в чём проблема.

Ответ 2



StreamReader read = new StreamReader(@"D:\(path)"); StreamWriter write = new StreamWriter(@"D:\(path)"); Encoding ANSI = Encoding.GetEncoding(1251); Encoding UTF8 = Encoding.UTF8; byte[] utf8_bytes,ansi_bytes; utf8_bytes = UTF8.GetBytes(read.ReadLine()); ansi_bytes = Encoding.Convert(UTF8, ANSI, utf8_bytes); string ansi_str = ANSI.GetString(ansi_bytes); write.WriteLine(ansi_str); read.Close(); write.Close(); Попробуйте 1251 вместо 1252, тогда русские символы будут отображаться корректно.

Почему в одном случае привязка работает, а во втором нет?

#c_sharp #wpf



    
        
            
            
        
            
        
    



    
        
            
            
        
        
            
        
        
    


-
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// 
    /// Логика взаимодействия для MainWindow.xaml
    /// 
    public partial class MainWindow : Window
    {
        public string MyText { get; set; }

        public MainWindow()
        {
            InitializeComponent();
        }

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(MyText);
        }
    }
}
    


Ответы

Ответ 1



Замечательный вопрос! Дело в том, что при создании интерфейса когда мы используем Menu, то само меню не перехватывает фокус текущего элемента при нажатии на дочерний MenuItem. Так как в режиме привязки к TextBox по умолчанию стоит режим обновления свойства LostFocus, то соответственно обновиться свойство не может, так как фокус остается на TextBoxe. Это сделано для того, чтобы валидация проходила только после потери фокуса, а не после каждого изменения значения TextBox при наборе. В первом примере нет меню как такового, а MenuItem считается простым контролом. Поэтому при нажатии на него TextBox теряет фокус и свойство обновляется. Проблемы или ошибки здесь нет. Для решения данной задачи нужно просто выбрать другой режим обновления для TextBoxа.

Сохранение данных формы при уходе с сайта

#jquery #forms #ajax


Итак имеется форма заказа на сайте с большим количеством полей (уже оптимизированных
и все равно количество достаточно большое).
Задача: Когда пользователю наскучило заполнять данные, он нажимает на вкладке крестик
или закрывает браузер - сохранить все его введенные данные формы куда либо (в сессию
по средствам PHP, и похоже что это единственный доступный вариант).
Цель: После прошествия некоторого времени пользователь возвращается на сайт, открывает
форму, а у него уже форма почти заполнена теми данными которые он в прошлый раз не
дозаполнил, тем самым ускоряя весь процесс заказа продукции.
Особенности: Форма работает по средствам JQuery и отправляется на сервер AJAX запросом,
ну и соответственно заказ тем самым совершается. Браузер не кэширует такие формы, и
после перезагрузки страницы снова приходится заполнять.    


Ответы

Ответ 1



Не все браузеры поддерживают, или корректно работают с событием закрытия страницы. Но даже если вам пойдет реализовать данную "фичу" для некоторых браузеров, то на мой взгляд сделать это можно так: - сериализация формы в строку - записать массив в cookie на большой срок Тем самым когда пользователь вернутся на страницу можно восстановить данные из cookie. При использовании jquery используйте serialize(); Реализация представленная пользователем @knes, поможет обойтись Вам без события закрытия страницы.

Ответ 2



Используйте COOKIES с "бесконечным" временем хранения. Других надежных способов ДО авторизации сохранять форму нет. Сохранение при потере фокуса с любого поля. $("input").blur(function(){/*Saving to cookies*/});

popUp без jQuery на чистом JavaScript+CSS

#javascript #css


У кого есть возможность кинуть ссылку на пример popUp окна без применения Framework-ов    


Ответы

Ответ 1



Класс самый простой для окна function ModalWindow(fadeInBox, closeBtn, callback) { var darkLayer = document.createElement('div'); darkLayer.id = 'fade'; document.body.appendChild(darkLayer); function init() { fadeInBox.style.display = 'block'; if(callback) callback(); darkLayer.onclick = function() { removeDarkLoyer(); fadeInBox.style.display = 'none'; return false; } if (closeBtn) { closeBtn.onclick = function() { removeDarkLoyer(); fadeInBox.style.display = 'none'; return false; } } } function removeDarkLoyer() { darkLayer.parentNode.removeChild(darkLayer); } init(); } CSS для подложки #fade { position:fixed; width:100%; height:100%; z-index:100; background:#000; opacity: 0.7; left:0; top:0; }

Ответ 2



Я сейчас создаю свой API: WebWinAPI (начал разрабатывать потом приостановил работу учу PHP чтоб потом вообще cool сделать) А вообще это легко если умеешь "общаться" с JavaScript, DOM и BOM

Синхронная обработка асинхронно накопленных данных. Теория.

#callback #javascript #асинхронность


Всем привет! Подскажите, пожалуйста, общий метод работы в следующем случае (и из
той же категории):
Предположим, есть набор id объектов, хранящихся в локальной БД мобильного приложения. 
var ids = [1, 3, 5].

Получать объект по его id я могу простым запросом к БД из транзакции:
for (var i in ids)
    transaction.executeSql( 'SELECT * FROM table WHERE id = '+i, [], self.querySuccess,
self.errorCB );

И вот мне в коллбэк приходят вытащенные объекты, мне надо их все сохранить в какой-нибудь
массив, и когда я получу все желаемые объекты, что-то с этим массивом сделать. Например,
на сервер пульнуть.
Как я делаю: перед началом цикла запоминаю сколько объектов я должен получить из
БД, в коллбэке веду счетчик пришедших объектов, и таким образом узнаю, когда я получил
все объекты.
Вопрос: нормально ли это, или велосипед? Может есть другие методы для решения подобных
задач?    


Ответы

Ответ 1



Посмотрите в сторону библиотеки Async.js, в ней есть множество методом, с помощью которых можно решить вашу проблему, например async.map async.map( ids, function(item, callback){ transaction.executeSql( 'SELECT * FROM table WHERE id = '+item, [], function(result){ // здесь наверно получаете результат выполнения запроса, его надо передать вторым параметром в callback callback(null/*error*/, result); }); }, function(err, resгlt){ // в result будет окончательный результат } );

Дробные пиксели

#gwt #html #internet_explorer #css


Я всегда считал, что значения в px  могут быть только целыми числами. Но недавно,
отлавливая ошибку в Internet Explorer 10 обнаружил в панели разработчика следующее:



Дробные значения в пикселях везде.

При этом в GWT метод getClientWidth/Height() возвращает только целые значения. Как
сделать совместимость с IE10? У меня во многих местах нужно один абсолютно позиционированный
элемент отображать ровно над другим, а в IE10 он "дергается" (смещение менее, чем на 1 px).

И еще такой вопрос: а остальные величины (offset, padding, margin, coordinates) могут
быть дробными в px?
    


Ответы

Ответ 1



Дробное значение быть может, но это, скорее "неумность" разработчиков, или же "неумность" браузера при высчитывании ширины/высоты определенного DOM-элемента, установленного в дробное значение в процентах, например:
Браузер в таком случае производит простейшие математические действия для преобразования процентного соотношения в пиксельное без последующего преобразования результата в целое число(из дробного). А вообще, дробное значения пикселя - это, конечно же, абсурд. Нельзя "закрасить" половину пикселя или же его треть. Должно быть понятно, что 123.86px == 124px

Ответ 2



@Trash я преобразовал коммент к @Dexter в ответ т.к. считаю что он вполне имеет право быть ответом. Вообще то "css пиксель" состоит не из одного реального пикселя и его размер зависит от масштаба/браузера и число css пикселей может быть не целым! Вот статья

Неправильно работают кнопки внутри ListView

#getview #android #listview #java


У меня есть ListView, в каждом элементе которого есть 2 кнопки.
Я, естественно, использую свой адаптер для отображения ListView.
В функции getView, которая формирует вью для конкретной строки списка я выставляю
OnClick хендлеры для этих кнопок.
Проблема в том, что кнопки начинают реагировать на клики только после второй перерисовки.
То есть, что бы нажать на кнопку, которая находится в первой строке списка, мне нужно
опустить список вниз так, что бы первая строка ушла за пределы экрана, и перерисовалась.
Вопрос: как вызвать принудительную перерисовку (или что там вызывается перед отрисовкой
строки),  или как выставить онклик обработчики так, что бы они работали сразу?     


Ответы

Ответ 1



Я думаю, что выставление хэндлеров в getView() - это плохая идея. Я бы сделал по другому: сначала бы сформировал массив вьюшек, выставил бы каждому из них хэндлеры, потом при рисовании ListView уже брал вьюшки из массива и возвращал через getView().

Ответ 2



Не знаю, поможет ли, но попробуйте вызвать прорисовку списка вручную: listview.invalidate(). Если конечно они ведут себя так из-за прорисовки, как Вы говорите.

Ответ 3



У меня недавно тоже стояла такая задача (элементы у меня были все одного вида). Как я поступил: набросал шаблон одного элемента ListView в xml (две кнопки, три текстовых поля и прогресс бар). Затем в xml для кнопок назначил обработчики нажатия событий: ... android:OnClick = "" ... и уже когда формировал адаптер, я добавил свой ViewBinder через .setViewBinder у адаптера. В этом ViewBinder'e я каждой кнопке присваивал тег, который зависел от номера элемента в списке ListView, и уже в обработчике я смотрел у View тег и выполнял свои действия. Может это тебе поможет. У меня не возникло никаких проблем с нажатием на кнопки, все запустилось с первого раза. Если не понятно будет, могу привести пример кода.

Как лучше всего хранить Context?

#android #java


Очень часто приходится использовать Context вне класса Activity (например, при использовании
б/д). Как его лучше хранить? getApplicationContext() использовать нельзя.
Пробовал хранить в статическом поле специально заведенного класса, но мне сказали,
это чревато утечкой памяти.
Есть мысль каждый класс наследовать от Context, и там использовать getApplicationContext(),
но намного ли это будет лучше  хранения в статиках?
Какой способ решения предлагаете Вы?    


Ответы

Ответ 1



Хранить Context/Activity вообще не советую - это чревато утечкой памяти Самый лучший способ это создать собственный класс Application - сделать его Singleton и брать Context через Application.getApplicationContext()

Ответ 2



Передавать в конструктор

Ответ 3



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

Создание динамических закладок на CSS3 в стиле браузера Google chrome

#css3 #css #html #javascript


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


  1- это первая заготовка 2- вторая
  заготовка 3- желаемый результат если
  он программно возможен


Не получается создать панель закладок в стиле гугл хром, у меня есть первая заготовка
которую я хочу внедрить на вторую но покуда что котелок не варит как это все можно
реализовать. 
Проблема в том что первая заготовка загружается с картинок а вторая полностью на css3 
в первой заготовки активность a:active первой и последней вкладки отмечены id="firstcurrent"
id="lastcurrent" все остальные id="current" во второй же заготовке таких заморочек
нету все гораздо проще и вот как их скрестить между собой и так что бы еще остались
плавные переходы с вкладки на вкладку во второй заготовке хз...

Ребят может кто подскажет у кого мозги по сильнее?



  

  

  




НАЧАЛО ПЕРВАЯ ЗАГОТОВКА


    










ВТОРАЯ ЗАГОТОВКА

Lorem ipsum sit amet

Praesent risus nisi, iaculis nec condimentum vel, rhoncus vel dolor. Aenean nisi lectus, varius nec tempus id, dapibus non quam.

Suspendisse ac libero mauris. Cras lacinia porttitor urna, vitae molestie libero posuere et. Mauris turpis tortor, mollis non vulputate sit amet, rhoncus vitae purus.

Pellentesque habitant

Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae.

Vivamus fringilla suscipit justo

Aenean dui nulla, egestas sit amet auctor vitae, facilisis id odio. Donec dictum gravida feugiat.

Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras pretium elit et erat condimentum et volutpat lorem vehicula

Morbi tincidunt pharetra orci commodo molestie. Praesent ut leo nec dolor tempor eleifend.

Phasellus non nibh

Non erat laoreet ullamcorper. Pellentesque magna metus, feugiat eu elementum sit amet, cursus sed diam. Curabitur posuere porttitor lorem, eu malesuada tortor faucibus sed.

Duis pulvinar nibh vel urna

Donec purus leo, porttitor eu molestie quis, porttitor sit amet ipsum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec accumsan ornare elit id imperdiet.

Suspendisse ac libero mauris. Cras lacinia porttitor urna, vitae molestie libero posuere et.

Cum sociis natoque penatibus

Magnis dis parturient montes, nascetur ridiculus mus. Nullam ac massa quis nisi porta mollis venenatis sit amet urna. Ut in mauris velit, sed bibendum turpis.

Nam ornare vulputate risus, id volutpat elit porttitor non. In consequat nisi vel lectus dapibus sodales. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent bibendum sagittis libero.

Imperdiet sem interdum nec

Mauris rhoncus tincidunt libero quis fringilla.

ВОТ МОИ ПОПЫТКИ, ТО ЧТО Я СМОГ СДЕЛАТЬ НО ОНО СЫРОВАТОЕ КАК ДАЛЬШЕ ДЕЛАТЬ НЕ ЗНАЮ МОЖЕТ ДРУГОЙ ПУТЬ ВЫБРАТЬ НАЧАЛО ПЕРВАЯ ЗАГОТОВКА

Lorem ipsum sit amet

Praesent risus nisi, iaculis nec condimentum vel, rhoncus vel dolor. Aenean nisi lectus, varius nec tempus id, dapibus non quam.

Suspendisse ac libero mauris. Cras lacinia porttitor urna, vitae molestie libero posuere et. Mauris turpis tortor, mollis non vulputate sit amet, rhoncus vitae purus.

Pellentesque habitant

Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae.

Vivamus fringilla suscipit justo

Aenean dui nulla, egestas sit amet auctor vitae, facilisis id odio. Donec dictum gravida feugiat.

Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras pretium elit et erat condimentum et volutpat lorem vehicula

Morbi tincidunt pharetra orci commodo molestie. Praesent ut leo nec dolor tempor eleifend.

Phasellus non nibh

Non erat laoreet ullamcorper. Pellentesque magna metus, feugiat eu elementum sit amet, cursus sed diam. Curabitur posuere porttitor lorem, eu malesuada tortor faucibus sed.

Duis pulvinar nibh vel urna

Donec purus leo, porttitor eu molestie quis, porttitor sit amet ipsum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec accumsan ornare elit id imperdiet.

Suspendisse ac libero mauris. Cras lacinia porttitor urna, vitae molestie libero posuere et.

Cum sociis natoque penatibus

Magnis dis parturient montes, nascetur ridiculus mus. Nullam ac massa quis nisi porta mollis venenatis sit amet urna. Ut in mauris velit, sed bibendum turpis.

Nam ornare vulputate risus, id volutpat elit porttitor non. In consequat nisi vel lectus dapibus sodales. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent bibendum sagittis libero.

Imperdiet sem interdum nec

Mauris rhoncus tincidunt libero quis fringilla.


Ответы

Ответ 1



По поводу первой заготовки. Замените id на классы. Т.е. должны получиться правила для: .headermenu ul li.first {...} .headermenu ul li.first a {...} .headermenu ul li.first.current {...} .headermenu ul li.first.current a {...} /* и т.д. для середины и конца */ затем можно поменять будет классы .first на :first-child и .last на :last-child, тогда в разметке не нужно будет классы проставлять вообще. Скрипт остается примерно тот же, просто после этого вам будет достаточно всего лишь ставить класс current для соответствующего
  • и убирать в случае ненадобности. addClass, removeClass. id лучше не трогать, тут их использование не по назначению.

  • Как удалить субмодуль?

    #git #git_submodule

    
    Имеется субмодуль в git репозитории. Добавлялся так:
    git submodule add  libs/
    
    Теперь он перестал быть нужным, как его удалить?    
    


    Ответы

    Ответ 1



    Встроенных средств для удаления субмодулей нету. Нужно сделать седующее: Удалить (отредактировав) упоминание о модуле из .gitmodules; Удалить из .git/config; Выполнить git rm --cached ; Закомитить и удалить файлы модуля. Так же можно воспользоватся следующей командой git config -f .git/config --remove-section submodule. git config -f .gitmodules --remove-section submodule.

    Перемещаемая форма со скрытыми границами

    #c_sharp #winforms

    
    Возможно ли сделать так, чтобы форму можно было перемещать мышкой за ее главное окно,
    даже если у нее скрыты границы?
    p.s. + еще ко всему этому чтобы она Resizable была так же.    
    


    Ответы

    Ответ 1



    Конечно такое возможно. Один из вариантов - послать окну сообщение WM_NCLBUTTONDOWN на нажатие мыши, которое сигнализирует о нажатии левой клавиши мыши вне клиентской части окна, то есть на скрытых границах. Однако, перед этим действием необходимо снять "захват" курсора окном, иначе сообщение будет просто проигнорировано. private const int WM_NCLBUTTONDOWN = 0xA1; private const int HTCAPTION = 0x2; protected override void OnMouseDown(MouseEventArgs e) { Cursor = Cursors.Hold; Capture = false; Message msg = Message.Create(Handle, WM_NCLBUTTONDOWN, (IntPtr)HTCAPTION, IntPtr.Zero); DefWndProc(ref msg); Cursor = Cursors.Default; } С ресайзингом придётся повозится дольше, тем более если его делать на этой же самой форме. Как вариант - сначала сделать ресайз только за правый нижний угол. Придётся переопределить оконную процедуру Form.WndProc и самому обработать сообщение WM_NCHITTEST. Кстати, первую проблему можно тоже решить в этом месте. Более подробно смотрите здесь.

    Разница между двума датами в секундах в Django

    #python #django #дата

    
    Хочу получить разницу (в секундах) между двумя датами: текущей и даты, взятой из базы:
    
    models.py:
    
    class Tasks(models.Model):
        dateAdded = models.DateTimeField(auto_now_add=True)
    
    
    в консоле:
    
    from phone_book.models import Tasks   
    this = Tasks.objects.get(id = 50).dateAdded.replace(tzinfo = None)    
    import datetime   
    now = datetime.datetime.now()    # судя инструкции разница между now и this должна
    дать мне необходимую разницу  
    delta = now - time  
    
    
    В результате объект delta возвращает datetime.timedelta(1, 4451, 467165),
    у которого есть аргумент seconds, но почему-то в результате delta.seconds выводится
    значение 4451, которое значительно отличается от фактической разницы между двумя датами.
    
    В общем вопрос: как мне найти разницу между двумя датами в секундах, либо подскажите
    ссылочку на умный источник.
    
    Спасибо!
        
    


    Ответы

    Ответ 1



    >>> import datetime >>> a = datetime.datetime.now() >>> a datetime.datetime(2012, 8, 7, 14, 34, 14, 63000) >>> b = datetime.datetime(2012, 8, 7, 14, 50, 00) >>> b datetime.datetime(2012, 8, 7, 14, 50) >>> c = b - a >>> c datetime.timedelta(0, 945, 937000) >>> c.seconds 945 >>> c.seconds / 60 15 вроде верно все

    Ответ 2



    Используйте USE_TZ=True, чтобы django использовала бы время, включающее информацию о часовой зоне. Иначе, вычитая наивные datetime объекты, вы можете ошибку на тысячи секунд получить (к примеру, в районе перехода на летнее время). Чтобы получить текущее время: from django.utils import timezone now = timezone.now() datetime.now() возвращает наивный datetime объект -- не используйте его. Имея datetime с установленным правильным tzinfo, можно уже напрямую вычитать: now - then.

    Как описать граф, где важны только рёбра?

    #графы #база_данных

    
    Планирую проект, где будет множество данных о связях между очередными двумя узлами,
    и эти связи и их многочисленные свойства — главная информация, с которой вся работа.
    Можно сказать, что есть граф, у которого узлы лишь идентифицируются как-то, чтобы
    не перепутать, а область интереса это рёбра.
    Как бы вы стали описывать и хранить такие данные?
    Варианты, которые пока приходят на ум:
    
    реляционная БД, таблица нод, таблица связей: node1id, node2id, json_properties
    какая-то специфическая, может, не реляционная бд, заточенная под описание графов?
    
    Задачи: хранить, добавлять новые связи, определять, связаны ли две ноды через цепочку
    связей?    
    


    Ответы

    Ответ 1



    Если я правильно понял задачу, то, как вариант - neo4j, статья на хабре

    Ответ 2



    Возможно ответ на Ваш вопрос Язык Анимо.

    Ответ 3



    Можно попробовать задать переменными PHP координаты и эти переменные в MySQL, или если человек рисует граф в онлайне то просто в PHP

    Кэширование - очень большая база

    #php #кэширование #mysql

    
    Гугл выдает результат по одному из разделов сайта -
    14 600 000.
    База данных MySQL кряхтит, запрос выполняет от 5 до 30 сек.
    Сделал кэширование с сохранением кэшированных файлов в папку,
    причем для поисков один кэш, для юзеров - совсем другой.
    Получилось:
      /cache/1.txt - это для юзеров
      /cache/1r.txt - это для поисковиков
      /cache/2.txt
      /cache/2r.txt
      /cache/3.txt
      /cache/3r.txt
      /cache/4.txt
      /cache/4r.txt
      и т.д.
    
    Естественно вообще можно так делать то?
    Со временем в папке появится 14 600 000 * 2 = 29 200 000 файлов.
    Все это дело займет 2 - 3 месяца.
    Файл занимает 17 кб в среднем.
    Отсюда считаем.
    17 * 14 600 000 = 248 200 000 кб / 1024 = 242 383 мб / 1024 = 237 гб * 2 = 474 гб
    Получается, что в папке будет лежать 474 гб файлов, общее количество которых будет
    составлять 29 200 000 файлов.
    Не загнется все это дело?
    Что посоветуете?
    И не забывайте - это всего один раздел сайта, а таких несколько.
    С кэшированием страницы загружаются мгновенно.    
    


    Ответы

    Ответ 1



    Файловый кэш, как вы описали, можно разнести по (бинарному?) дереву подпапок. 14600000 это 23 бита. Например, вариант раскидать по папкам соотв. старшим N битам: cache/1/0/0/1/0/1/0/1/65535.txt БД кряхтит, выполняя один запрос, без других параллельно? Пересмотрите запросы и индексы в таблицах — возможно, только с помощью этой меры удастся сделать, чтобы запросы летали. 14 600 000 страниц это не так много. Часты ли повторяющиеся 1:1 запросы/ответы? Статистика запросов - ровное горизонтальное поле или "колокол"? Кэширование имеет смысл если повторов много. Может, пора расти: поднимать кластер, или хотя бы еще один сервер с MySQL? Сделать его slave'ом, на котором работает копия бд и обрабатывает ровно половину всех запросов. У них может быть общий кэш, напр. на memcached - доступный для всех серверов, чтобы часто повторяющиеся запросы не грузили БД. Upd. 5. Роботов можно попридержать, настроив robots.txt - например, пусть заходят не чаще раза в неделю. Для понимания того, как в данном случае оптимизировать сайт, надо подробно видеть, что именно там происходит. Как устроена база, какие запросы, персонифицированы ли страницы под посетителей. Инуитивно подозреваю, что длинные запросы вызваны банальным отсутствием нужных индексов в БД. Если же БД уже никак не оптимизировать индексами и изменением запросов, а дышит она тяжело именно от обилия данных, можно разнести разросшиеся таблицы по партициям . Напр. строки с индексом от 1 по N хранятся на одном сервере, от N+1 по M — на другом. Ещё варианты для размышления: страничный кэш типа Varnish; nginx proxy, установив разумный срок дискового кэширования страниц.

    SEO при редизайне

    #seo #дизайн

    
    Что нужно учитывать при редизайне сайта, чтобы не потерять индексацию поисковиками?
        
    


    Ответы

    Ответ 1



    SEO Website Redesign Checklist: Don’t Mess Up Your Site Traffic. 6 Website Redesign SEO Secrets Your Developer May Not Know. 3 SEO Traps to Avoid During Your Redesign.

    Программирование в IDE на широкоформатном мониторе?

    #монитор #ide

    
    Хочу заказать широкоформатный монитор диагональю дюймов в 29, с каждым днем маленькое
    окошко текстового редактора в IDE раздражает меня все больше и больше. У кого нибудь
    был подобный опыт? Какие подводные камни? Как следует правильно выбирать монитор, чтобы
    на него можно было по долгу смотреть?    
    


    Ответы

    Ответ 1



    У меня 2 монитора по 22". Очень удобно, пространства хоть отбавляй. В Visual Studio я раздвигаю окно на 2 монитора, делаю сплит рабочих областей. Немного не удобно в том плане, что иногда приходится переводить взгляд с одной области на другую, но это совсем пустяк по сравнению с реальным комфортом. Насчет большого монитора на 29" я не советовал бы, потому что разрешение экрана также останется 1920х1080 (если он конечно не особенный хD), а впервую очередь для меня важно количество точек, а не "здоровый" монитор. Плюс к этому можно наладить дебаг мультимониторных приложений (если такая необходимость имеется). К тому же по цене 2 монитора по 22" будут сравнимы, а если уже монитор имеется, то выгода очевидна. Знаю только, что 29" нужны дизайнерам, которые постоянно вглядываются в мелочи. Плюс я купил новый монитор с IPS, старый с TN-Film -- разницы практически никакой. Все может быть сугубо индивидуально, но я поступил так и ничуть не жалею.

    Ответ 2



    Сейчас работаю на 17" ноуте, выставляю очень крупные шрифты в IDЕ чтобы меньше уставали глаза, и на таком разрешении уже такой диагонали не хватает - приходится таскать много чего по экрану сразу (IDE, браузер, пр...). Пробовал работать на 27" с такими же крупными шрифтами - идеально и не так грузит как два монитора поставленные рядом (покрывают все боковое зрение). Думаю перейти на 27"

    Перенос папок в папку

    #файлы #php

    
    Есть папка A
    Есть папка Б
    Нужно перенести содержимое Б в А. Содержимое может совпадать по имени.
    Т.е. если совпали папки, то просто переносится содержимое папки, если совпали файлы,
    то перезаписываются. Если папки нет, то создается и переносятся данные. Здесь очень
    похожая функция, но не работает с совпадениями. Думаю многие встречались с подобным.
    p.s. как запасной план, использовать линуксовые возможности.    
    


    Ответы

    Ответ 1



    Создается функция которая принимает на вход путь и создаёт папки для этого пути. (например, mkdirs('/home/pupkin/dirs/A'); на каждой папке проверяет её существование, если папки не существует - то создаём её если существует то ничего не делаем, переходим к вледующей части пути) Создаётся функция рекурсивного копирования. recursiveCopy($from, $to) читаем содержимое папки $from в цикле: если это файл то: копируем его из $from.'/'.$file в $to.'/'.$file если это папка: mkdirs($to.'/'.$file); recursiveCopy($from.'/'.$file, $to.'/'.$file); вот и всё.

    Ответ 2



    Вот, готовый код. $from - откуда копируем, $to - куда. Пути задавать полные (ну по крайне мере у меня работает так, если $from/$to = '../from/'/'../to/') Одно, что папки from и to должны быть указаны, остальные папки, которые есть в папке from, в to создаются сами, удачной работы)) function recursiveCopy($from, $to){ if(!file_exists($to)){ mkdir($to); } if ($objs = glob($from."/*")) { foreach($objs as $obj) { $forto=$to.str_replace($from, '', $obj); // echo $to.'
    '; if(is_dir($obj)){ removeDirRec($obj, $forto); } else{ copy($obj, $forto); } } } return true; }

    Как послать JSON в теле HTTP-ответа?

    #c_sharp #openlayers #json #http #ajax

    
    Отдается JSON так:
    
    HttpListener listener = new HttpListener();
    listener.Prefixes.Add(new Uri("http://localhost:8181"));
    listener.Start();
    while (isListening) {
      HttpListenerContext context = listener.GetContext();
      HttpListenerRequest request = context.Request;
      HttpListenerResponse response = context.Response;
      //...
      MemoryStream ms = (GeoJsonDeserialize.SerializeGeoJson(ObjToJson) as MemoryStream);
      byte[] buffer = ms.ToArray();
      response.StatusCode = (int)HttpStatusCode.OK;
      response.KeepAlive = false;
      response.ContentType = "application/json";
      response.ContentEncoding = System.Text.UTF8Encoding.UTF8;
      response.ContentLength64 = buffer.Length;
      response.AddHeader("Cache-Control", "private, max-age=0");
      Stream output = response.OutputStream;
      output.Write(buffer, 0, buffer.Length);
      ms = new MemoryStream();
      ms.Write(buffer, 0, buffer.Length);
      buffer = ms.ToArray();
      output.Close();
    }
    
    В другой проге на C# я запрашиваю так:
    
    WebRequest webRequest = WebRequest.Create("http://localhost:8181");
    WebResponse webResponse = webRequest.GetResponse();
    StreamReader sr = new StreamReader(webResponse.GetResponseStream());
    String str = sr.ReadToEnd();
    
    и вижу переданный текст (JSON).
    Но вот беда - ни Ajax не видит тело ответа (выдает ошибку), ни OpenLayers который
    по GeoJSON должен показать точки на карте.
    
    OpenLayers запрашивает данные (за основу взят пример OpenLayersRotationExample):
    vectors = new OpenLayers.Layer.Vector( "Simple Geometry", {
      protocol: new OpenLayers.Protocol.HTTP({
        url: "http://localhost:8181",   format: new OpenLayers.Format.GeoJSON()
      }),
      strategies: [new OpenLayers.Strategy.Fixed()]
    });
    map.addLayers([vectors]);
    
    Объект в JSON (GeoJSON) выглядит так:
    
    {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-108.04,44.68]},"properties":{"course":184.7}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":44.1}}]}
    
    Специально пробовал текст передаваемого JSON загрузить в OL непосредственно в JavaScript:
    
    var featurecollection = {"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":42.9}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-111.04,45.68]},"properties":{"course":157.5}}]};
    var geojson_format = new OpenLayers.Format.GeoJSON();
    var vector_layer = new OpenLayers.Layer.Vector("Simple 1", {
    styleMap: new OpenLayers.StyleMap({
      "default": {
         externalGraphic: "OpenLayersRotationExample_files/marker-gold.png",
             //graphicWidth: 17,
             graphicHeight: 20,
             graphicYOffset: -19,
             rotation: "${course}",
         },
         "select": {
            cursor: "crosshair",
            externalGraphic: "OpenLayersRotationExample_files/marker.png"
         }
      })
    }); 
    map.addLayer(vector_layer);
    vector_layer.addFeatures(geojson_format.read(featurecollection));
    
    И все работает - точки отображаются.
    Вывод - я неправильно отдаю JSON.
    Подскажите как в ответ на запрос отдать JSON что бы JavaScript его смог принять?    
    


    Ответы

    Ответ 1



    Поскольку провайдер точек и страница отображающая карту находится в разных доменах, действует Same Orign Policy. В OpenLayers есть OpenLayers.Protocol.Script который использует JSONP для получения данных. По умолчанию callback называется OpenLayers.Protocol.Script.registry.c1. Вам необходимо переделать провайдер соответствующим образом, чтобы он оборачивал результирующий JSON в эту функцию.

    “Видимость” приложения в Google Play (GP)

    #android

    
    Подскажите, пожалуйста. Что сделать, чтобы приложение стало видно в GP? Я загрузил
    APK файл в Google Play, добавил скриншоты, описание приложения, нажал на кнопку опубликовать.
    Статус изменился как опубликованный. В консоли разработчика показывают, что приложение
    поддерживается более чем на 1500 устройств (свое я в том числе нашел). Однако в GP
    я не могу найти своего приложения, в поиск забиваю название, не находит. Как быть,
    чтоб приложение стало видно для пользователей?    
    


    Ответы

    Ответ 1



    Еще не проиндексировано поэтому в поиске не видно. Чтобы найти свое приложение напрямую забейте в браузере строчку типа: https://play.google.com/store/apps/details?id=

    Ответ 2



    Возможно в редактировании публикации вы убрали галочку для вашего города и оно не показывается для вас.

    Информировать пользователя о том что другой пользователь набирает сообщение (как Вконтакте)

    #javascript #php

    
    Добрый вечер! Подскажите, как можно реализовать что бы при наборе символов в поле,
    у другого пользователя появлялась картинка что первый пользователь набирает сообщения
    (т.е. как в диалогах Вконтакте).    
    


    Ответы

    Ответ 1



    1) На странице сообщение у каждого пользователя делаем скрытый div внутри которого текст + картинку о наборе текста. 2) При наборе символов в поле - вешать обработчик, что были изменения в поле - и отсылать ajax запрос, что юзер производит написание текста. 3) На ответной стороне производить каждое N секунд проверку ajax запросом, были ли изменения какие-либо, принимать и обрабатывать. 4) Если были изменения открываем div блок. Это самый легкий способ, можно организовать данные вещи на NodeJS + Socket.io

    QML vs QPainter Widget - что производительнее?

    #widgets #qt #cpp #qml

    
    Собираясь разрабатывать новое приложение (на C++ и Qt), столкнулся перед выбором:
    как реализовать интерфейс - на QML или сделать по старинке виджетами (будет виджет,
    наследованный от QPainter на котором будут отрисовываться объекты да скроллироваться,
    и еще несколько виджетов с различными текстовыми полями и кнопками). С QML у меня нет
    никакого опыта, поэтому на виджетах я сделаю интерфейс намного быстрее. Однако, может
    быть у QML есть какие-то плюсы по сравнению с традиционными виджетами? Так какие же?
    Что из них производительнее?    
    


    Ответы

    Ответ 1



    Вы пытаетесь сравнивать кислое с синим. Вот скажите мне, например, что производительнее - XML или Frostbite 2? QML - это удобный способ программировать виджеты, транзишны, разнообразные визуальные эффекты и стили оформления. Он парсится как язык, но в конечном счете отрисовывает то, что вы ему сообщили, с помощью того же самого QPainter'a: QML builds directly upon QGraphicsView, which in turn builds upon QPainter, which in turn builds upon QPaintEngine (and the internal QGraphicsSystem classes), which have various hardware accelerated implementations. Утверждается, что любой случай сложной разметки и логики на QML можно проэмулировать, вручную создавая элементы на QGraphicsView, и, соответственно, получить абсолютно одинаковую производительность.

    Ответ 2



    Вот, что мне ответили на Хабре: Насчёт производительности — разница только на старте, когда грузится и парсится QML. Далее на его основе создаются обычные «плюсовые» объекты в памяти, так что во время исполнения разницы не будет. А если ваш QML не супер-дупер навороченный, то вы и во время загрузки разницы не ощутите. Плюсы у QML — более компактное, более читабельное описание интерфейса, а также тот факт, что тенденция развития Qt однозначно идёт к QML. В Qt5 вроде бы от нативных виджетов понемногу отходят (тут врать не буду, возможно неправ).

    Выбор виртуальной машины

    #виртуальная_машина

    
    На новой работе приходиться пользоваться виндой :( 
    Хочу поставить нормальную виртуалку и накатить linux.
    Посоветуйте что-нибудь из личного опыта.
    
    Критерии:
    
    
    Минимальная потеря производительности;
    не надо покупать;
    хост-машина: windows, гостевая-машина: linux
    
    располагаю машинкой с ЦПУ 3,1 Ггц, ОЗУ 4Гб
    
    Пробовал VirtualBox, но xubuntu ели тянет.
    Дома юзаю KVM -- очень хорошая вещь, но для винды версии нет.
    P.s. Просьба холивар не устраивать и ответы сопровождать комментариями на основе
    собственного опыта, а не Дяди Васи.    
    


    Ответы

    Ответ 1



    Извиняюсь если не конкретно по вопросу, но я без особых проблем в xubuntu на виртуалбоксе запускал xubuntu на своем Asus EeePc - раза в 4 слабее описанных характеристик. Мне кажется надо грамотно подобрать swap и размещение файла оси на ЖД и выделение ресурсов для виртуалки - найти ту золотую серединку чтобы винда не перехватывала ресурсы и чтобы виртуалке хватало.

    Ответ 2



    VMWare же есть бесплатная версия. Мне нравится.

    Динамическое подключение и использование java-классов

    #xml #jaxb #java #xsd

    
    Продолжение вопроса. Узнал и разобрался как XJC генерирует классы для типов. Отсюда
    вопрос - как динамически подключать и использовать их?
        
    


    Ответы

    Ответ 1



    Я вопрос понял. Вопрос сложный. По сути речь идет о том, чтобы в рантайме скомпилировать исходники и прицепить к аппе - фактически состоит из 2-х частей: Как подключить класс в рантайме Как скомпилировать класс в рантайме Если первый решается загрузчиком класса - конструкцией типа Class.forName() в связке с ClassLoader, то второй вопрос сложнее, но при использовании Java >= 6 это решаемо: String fileToCompile = "MyClass.java"; JavaCompiler compiler = javax.tools.ToolProvider.getSystemJavaCompiler(); int compilationResult = compiler.run(null, null, null, fileToCompile); Если Java < 6 то есть только недокументированные возможности (я уже забыл какие).

    Как удалить записи из таблицы одной командой?

    #aspnet #entity_framework #aspnet_mvc #sql

    
    Не получается удалить записи в таблице! Нужно удалить все комментарии у которых item_id=6.
    Этих комментарий штук 8. Пробую удалить таким образом:
    IQueryable query = (from del in db.Comments where del.item_id == 6 select del);
    db.DeleteObject(query);//ругается тут
    
    Но пишет что:
    
    
    Не удалось удалить объект, поскольку он не найден в ObjectStateManager.
    
    однако, если я хочу удалить один комментарий, т.е. так:
    Comment cquery = (from del in db.Comments where del.id == 4 select del).First();
    
    то получается.
    Как мне правильно написать, чтобы не применять foreach и подобные вещи, а удалить
    сразу все комментарии, одним sql запросом (или командой, как правильнее сказать)?    
    


    Ответы

    Ответ 1



    var query = from com in db.Comments where com.item_id == 6 select com; foreach (Comment comment in query) { // тут будет 1 запрос на выборку из бд db.Comments.Remove(comment); } db.SaveChanges(); // тут будет delete [dbo].[Comments] where ([Id] = 6) То есть удаление всех комментариев с item_id=6 произойдет с помощью одного SQL запроса

    Ответ 2



    А зачем foreach ? Можно же сделать так: context.YourTable.RemoveRange(context.YourTable); context.SaveChanges();

    Создание Shell Extentions

    #c_sharp #файлы #ntfs

    
    Здравствуйте, Уважаемые Хэшкодовцы!
    Благодаря Вам узнал об альтернативных потоках данных для файлов на NTFS системе.
    Благодаря интернету научился с ними работать через командную строку. Может кому интересно:
    echo some file > file.txt
    
    создали/перезаписали информацию в файлу "file.txt" текстом "some file"
    echo some description > file.txt:desc
    
    создали/перезаписали альтернативный поток с именем "desc" для файла "file.txt"
    more < file.txt
    type file.txt
    
    отобразили в окне консоли информацию содержащейся в файле "file.txt". В нашем случае
    "some file"
    more < file.txt:desc
    
    отобразили в окне консоли информацию из альтернативного потока с именем desc.
    dir /r
    
    отобразили список всех файлов в текущем каталоге с их альтернативными потоками
    
    В общем выше была лирика, это может кому пригодится. Теперь собственно сам вопрос:
    Как реализовать окно свойств, которое отобразит данные из альтернативного потока
    В интернете нахожу много информации, как реализовать свою Shell Extentions. Но информации
    очень много на английском языке (или я просто не могу найти аналогичной информации
    на русском), что сильно затрудняет поиски решения с моими познаниями "вражеского" языка.
    Многие примеры рассказывают как перехватить выполнение команды, как добавить в контекстное
    меню файлов свои пункты, но это все не то. Мне нужно открыть окно свойств файла, в
    открывшемся окне свойств добавить свою закладку с конкретным именем, на закладке расположить
    компонент позволяющий просматривать текстовую информацию (ну пусть скажем это будет
    RichTextView) ну и поместить туда информацию из альтернативного потока с конкретным
    именем. 
    Как читать информацию из альтернативного потока примеры я нашел, думаю разберусь
    самостоятельно, а вот реализацией персональной закладки свойств для файла - увы не
    получается. На всякий случай уточню, расширений файлов будет несколько, для которых
    данное окно свойств должно появиться (ну например это будут .ex1, .ex2), и если есть
    такая возможность, окно свойств не отображать, в случае если альтернативного потока
    данных с нужным именем отсутствует у файла).
    Забегая немного вперед, хотел бы еще возможность отображать окно свойств для нескольких
    выбранных файлов, но с этим сначала попробую сам разобраться.
    Что собственно хочу от вас?
    
    Желательно ссылку на документацию по моей проблеме. Как я понял, махинаций которые
    можно вытворять при помощи Shell Extentions навалом, человеку который этим никогда
    не занимался - темный лес.
    Если есть конкретный пример подобной реализации на c# - буду признателен. Желательно
    конечно, чтобы код не был навороченным, достаточно самых основ, далее будем плясать
    от печки по принципу удочки.
    Ну и самое "здоровское" для меня, как для начала изучения проблемы - это подсказка,
    с чего начать писать модуль? Какие интерфейсы должны быть реализованы?
    
    PS: Если все это будет еще и на русском языке - вообще вам цены не будет =)
    Заранее спасибо, что дочитали все это до конца, и за ваши ответы.    
    


    Ответы

    Ответ 1



    В силу ряда проблем Microsoft не рекомендует писать расширения для обозревателя с помощью управляемого кода и не планирует поддерживать разработку подобных расширений. На неуправляемом коде добавление страницы свойств происходит согласно руководству (на английском): How to Register and Implement a Property Sheet Handler for a File Type. Если все же браться за расширение на C#, то в качестве исходной точки можно взять готовый проект на C# (на английском): Property Sheet Shell Extension in C#.

    Ответ 2



    Ваша проблема уже давно решена. Могу дать пример. AltStreamOverlay (с исходным кодом)