Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Как сделать нумерованный список с точкой?

Лучший ответ:
Использовать свойства counter-reset и counter-increment для псевдоэлементов вложенного списка.
Жирность, думаю, сами поставите.
snippet

snippet

Худший ответ:
snippet

Вопрос решен, всем спасибо.
Вопрос: Как поднять эффективность обучения?

Лучший ответ:
Hackerrank имеет смысл задрачивать, если ты планируешь проходить собеседования с кодом в скором времени. На первых парах тебе важно писать много разного кода. Какой-то пет проект или набор небольших проектов.

Худший ответ:
Добрый день.
Попробуйте поработать с различными библиотеками. Например, напишите парсер при помощи jsoup. Попробуйте написать некий универсальный тул для экспорта данных в xlsx | csv (Apache POI). Изучите apache common langs, apache common collections и др. распространенные библиотеки. Можете глянуть на lombok.
Придумайте себе идеи для pet проектов. Например, телефонная книга (javafx), консольное приложение (jcommander) и т.д. 
Решать задачи на hackerrank прикольно и в принципе, можно потратить время на них. В частности, Java, SQL, Problem Solving. Но как отметил коллега, подобные сайты нужны больше при трудоустройстве. 
Попробуйте изучить jdbc, поработать с БД. Вот, сайт sql-ex.ru решите задачи по SQL.
Ну и не останавливайтесь на достигнутом, развивайтесь дальше. Мне например, для прибавления уверенности в себе помогли фриланс биржи. Я писал различные простые парсеры и ботов. Как бы и денежки есть и прикольно видеть результат своих трудов.
Вопрос: Как учиться JavaScript'у?

Лучший ответ:
1. Тупить это норма.
2. Если не осиливаешь что-то, понизь градус сложности и повышай по мере того, как начинает что-то удаваться.
3. Функционал языка открывается со временем.

Худший ответ:
Читать много книг и не только JS  а по всяким там алгоритмам, изучать практики и тд.  Язык - это всего лишь инструмент, отвертка в руках мастера. Главное научится решать задачи. И ты не решишь ее ну например если  перед тобой тривиальная задача построить велосипед  и  не зная как устроен велосипед или как он должен работать при этом будь ты трижды ас в обращении с отверткой и не важно какой + или - или ▲ или ✭  и тд.   Вот отвертка как инструмент здесь  - это все языки,  форма отвертки - это конкретный язык который больше подходит для той или иной задачи. Принцип работы синхрофазотрона - вот что самое главное.
Вопрос: Есть ли сейчас телефония, независимая от интернет-каналов?

Лучший ответ:
ну с одной стороны, действительно сейчас вся телефония идет через интернет (но не совсем через tcp/ip, а по тем же каналам, через e1 например)
а с другой стороны, стационарный телефон всёравно будет надежнее если ляжет интернет, потому что оборудование телефонии подчиняется несколько иным регламентам и оператор обязан поддерживать её устойчивость при сбоях с более суровыми требованиями чем обычные операторы интернет связи

Худший ответ:
Для решения вопроса, что надёжнее, надо рассматривать не только передачу телефонного трафика, но и другие аспекты телефонии. Например, электропитание. Допустим, упала электросеть в целом городе (в США такие случаи бывали, при торнадо). Городские АТС издавна принято снабжать долгоиграющим резервным источником электричества, поэтому, если ваш домашний телефонный аппарат - не какой-нибудь современный с радиотрубкой, а старинный, без электроники, питающийся через телефонную пару от АТС, то он продолжит быть на связи. Хотя... базовые станции мобильной связи тоже имеют бесперебойники, однако на не слишком долгий срок (слыхал, что примерно на 12...15 часов работы от аккумулятора, резервный генератор на городской АТС явно подольше сможет проработать).

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

Лично я именно из этих соображений не избавляюсь от проводного телефона в квартире, причём из трёх квартирных параллельных аппаратов оставил один старинный.
Вопрос: Проблема с светом в Blender. Его нет, что можно сделать?

Лучший ответ:
Привет, нужно поменять в настройках рендера eevee переключить на cycles. Первый -- что-то типа упрощенного движка, без просчета теней, переотражений и т.п.

Худший ответ:
Слева вверху, там где названия объектов/мешей/коллекций, в строчке названия твоего освещения после "глазика"(видимость во viewport) посмотри не стоит ли крестик на следующем значке, он похож на фотоаппарат, его название "Disable in Randers"(глобально отключить на рендере). Если стоит, тыкни чтоб не стоял.
Вопрос: Как вообще понимать декораторы в Python?

Лучший ответ:
Дальше у меня возник вопрос и ступор - мы почему то возвращаем не результат выполнения функции wrapper, а возвращаем саму функцию-объект.
Так и есть. Нам же не нужно в самом декораторе вызывать функцию, а только указать, какую функцию мы используем. Без скобок () это просто ссылка на сам объект (функцию).
Пример:
def f1(): return 1

a = f1() # присваиваем результат работы функции, т.е. в a будет 1
a = f1 # присваиваем саму функцию
# тогда a - это не результат работы функции f1, а сама функция f1
# и мы можем ее запустить
print(a() ) # выведет 1, т.к. мы через a запустили f1
Декораторы так и делают. Создают функцию и возвращают ее, но не запускают. А запускается эта "обертка" во время запуска нашей основной функции.
Т.е. когда добавляется декоратор
@uppercase
def greet(): ...
# то когда мы запускаем функцию
greet()
# по факту запускается
uppercase(greet)()
Но что возвращает uppercase(greet) ? Смотрим по коду. А возвращает она некий wrapper. Что делает wrapper? 
original_result = func() # запускает переданную ему функцию на исполнение, в нашем случае greet
return f'Большие {original_result.upper()}' # и возвращает строку с результатами исполнения
И она сама каким-то образом вызывается и выполняется, хоть мы и явно не пишем это.
Исполняется потому, что запуск декорированной функции означает запуск
uppercase(greet)()
а т.к. uppercase(greet) возвращает wrapper
то uppercase(greet)() запускает wrapper()

Худший ответ:
Подробно о технической реализации можно почитать в этой статье https://habr.com/ru/post/141411/

Вкратце, происходит следующее - декоратор задает ссылку greet = wrapper, поэтому, когда происходит вызов greet(), вместо этого вызывается wrapper(), а не определенный в изначальном коде greet.
Вопрос: Как сделать прогресс бар с отрезками?

Лучший ответ:
Задачка, конечно, очень смешная.
И как всегда - на арифметику

Шкала у нас нелинейная, первый шаг 100 единиц, последний - 2000.
Но при этом для вычислений мы берём не позицию шага, а его значение.
Ну и разумеется получаем то, что получаем. 
250 от 3000 - это никакие не "примерно 50 единиц", а примерно 8 процентов. Вот эти 8 процентов вам и показывает. 

Длина отрезка при разбивке на 5 частей будет 20%
И вот 8 от 20 как раз и составляет те самые "примерно 50" процентов длины первого отрезка :)

Выше товарищ правильно пишет про отладку. 
Но отладка в обязательном порядке состоит из двух вещей:
1. Надо понимать, что делает твой код. В частности, иметь представление, какое значение каждая переменная должна иметь на каждом этапе.
2. Запускать код, выводя промежуточные результаты, и сравнивая их с ожидаемыми. 

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

Худший ответ:
Для поиска ошибок в существующем коде нужно заняться его отладкой.
Если совсем не знаешь, с чего начать, то начни с самого понятия отладка.
Ну или жди телепатов.
Вопрос: Тема для дипломного проекта?

Лучший ответ:
Дипломный проект - "генератор тем для дипломных проектов". Даже ИИ можно прикрутить (очень сбоку).

Худший ответ:
Любое из того что ты уже написал - только сделать хорошо !
Возьмем например расписание занятий:
бек - вот тебе и пригодился mysql
фронт - делаем андроид приложение, которое показывает браузер и открывает в нём нужную страницу (но об этом мы скажем в самом конце) - вот тебе и пригодился react
Плюс - скины, можно на css
В любой дипломной - главное это понятная и яркая презентация ! Если показываем живым людям, берем крутой смартфон/планшет и показываем как всё выглядит и как меняются скины; Если презентация не планируется - в конец работы вставляем цветные скриншоты - как всё выглядит и как меняются скины;
Вопрос: Чем мониторить серверы?

Лучший ответ:
Традиционно для этого используют zabbix.
Я топлю за Prometheus - классная штука. У него даже есть windows-exporter - агент, который ставится на ноду, которую нужно мониторить. Собирает тыщу всяких метрик. Пробуйте.

Худший ответ:
У Эластика как раз под эта дело есть утилиты для сбора информации:
- https://www.elastic.co/beats/metricbeat
- https://www.elastic.co/beats/winlogbeat
- есть и другие.

LogStash не нужен.

Grafana вроде бы работает с Elastic, но это не очень стандарнтная конфигурация. Обычно используют Kibana.

У меня как раз такая конфигурация стоит для нескольких небольших серверов.
В общем - работает, много метрик и логов собирает.

Events с Windows собираются без проблем.
Сетевую статистику тоже можно смотреть.
Но слабым местом мне показалось, что у Elastic'a как-то недоработан набор дэшбордов. То есть что-то можно увидеть сразу на стандартных дэшбордах, а что-то приходится вытягивать из метриков и логов самому. Не знаю, если у других инструментов дэшбоарды лучше...
Вопрос: Как скрыть (убрать) последнию букву?

Лучший ответ:
Можно регулярным выражением убирать маленькую букву «ы» только когда она — последняя в строке:
// сократить актёров
"актёры".replace(/ы$/, "") // актёр

// но сохранить животных
"Животные".replace(/ы$/, "") // Животные

Худший ответ:
Моя голова отдала вот такой вариант:
let a = "актеры";
a = a.slice(0,a.length-1);
console.log(a);
Вопрос: Как узнать как сконфигурирован сетевой интерфейс?

Лучший ответ:
я бы копал в сторону get-vm | get-networkadapter

Худший ответ:
команда Get-IntelNetAdapterSetting.
в выводе смотрите значение параметра PrefixOrigin интересующего вас интерфейса.
Вопрос: Можно ли импортировать что-то из разных... серверов?

Лучший ответ:
И как это сделать?
sundnl, взять и сделать. Не зная подробностей, тебе никто ничего не подскажет. С такой формулировкой тебя даже на фрилансе пошлют, и будут правы.

Что за игра, что за сервер? Может, у него уже есть какое-то API, по которому можно вытащить интересующие данные?

Собственно, что это за данные? Каков их объём? Именно данные, или нужно оповещение о событиях в игре? Разница очень большая, так как будет определять, кто будет проявлять инициативу при отправке данных - сервер или бот.

Если API нет, есть ли доступ к исходникам сервера? Как организован рабочий цикл сервера? Потребуется ли нам запускать отдельный поток - а значит, синхронизировать доступ к искомым данным? Или же там что-то на базе asyncio, и мы можем просто добавить асинхронную задачу?

Нужно определиться с форматом отдачи данных - тут лучше не изобретать велосипед, а использовать JSON, если данных не очень много.

Можно подумать о том, чтобы добавить в серверный скрипт небольшой сервер на Flask, или на базе asyncio streams, или на голых сокетах. Конкретная реализация зависит в том числе от того, кто проявляет инициативу: если бот запрашивает, а сервер отвечает, то Flask позволит обращаться к серверу по HTTP, а не громоздить велосипед на сокетах. Если же сервер может что-то слать по своей инициативе, то тут уже HTTP подойдёт так себе.

Когда ответишь на все перечисленные вопросы, вот тогда у тебя будет вопрос, стоящий обсуждения. В конце концов, правильно поставленный вопрос - это половина ответа.

Худший ответ:
сервер игры научить отдавать данные по API , бота на питоне научить обращаться к этому API
Вопрос: Как работает eSim?

Лучший ответ:
Нет. eSim - это чип в телефоне, который выполняет ту же работу, что и обычная sim.

Интернет нужен только для установки приложения оператора и первоначальной настройки esim

Худший ответ:
Я не изучал, но мне кажется нет. Просто стоит модуль радио, у него есть "память". в эту память заливается то что на симкарте (а у симки есть своя память и не только)
по сути получается клон симки
Вопрос: Как создать lxc контейнер с произвольной операционкой?

Лучший ответ:
мне кажется ты путаешь контейнеры с полноценной виртуализацией.
в lxc все контейнеры работают с ядром хоста напрямую.
20 бубунта с большой вероятностью не сможет встать на ядро 18.

настраивай виртуалку

Худший ответ:
Если нужны нормальные ОС в контейнере, то лучше выбрать Virtuozzo. LXC сильно кастрированные.
Вопрос: Как теперь оплачивать сервисы Microsoft?

Лучший ответ:
Никак, потому что Microsoft приостанавливает продажи продуктов и предоставление услуг на территории РФ из-за войны в Украине.

Как и весь остальной мир, мы в ужасе, возмущены и опечалены изображениями и новостями, поступающими с войны в Украине, и осуждаем это неоправданное, неспровоцированное и незаконное вторжение России.
Сегодня мы объявляем, что приостанавливаем все новые продажи продуктов и услуг Microsoft в России.
Кроме того, мы тесно координируем и работаем в тесном сотрудничестве с правительствами Соединенных Штатов, Европейского Союза и Соединенного Королевства, и мы останавливаем многие аспекты нашего бизнеса в России в соответствии с решениями правительства о санкциях.

https://blogs.microsoft.com/on-the-issues/2022/03/...

Худший ответ:
Оформить карту иностранного банка.
Вопрос: Где делать ajax запросы: в хуках или в redux actoins?

Лучший ответ:
если используешь thunk или saga там и продолжай делать запросы, ничего не поменялось.

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

Лучший ответ:
У вас нет градиента. А это сильно упрощает задачу.
<div class="div">75</div>
.div {
  position: relative;
  width: 100px;
  height: 100px;
  display: flex;
  align-items: center;
  justify-content: center;
  text-align: center;
  font-size: 30px;
}
.div::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
  border: 20px solid red;
  border-color: red red green green;
  border-radius: 100%;
  transform: rotate(45deg);
  pointer-events: none;
}



Худший ответ:
Делал следующим образом: блоку, который надо обернуть, прописал стиль position: relative. И создал внутри этого блока div, с стилями:
position: absolute;
top: -2px;
left: -2px;
bottom: -2px;
right: -2px;//толщина бордера
border-radius: который нам нужен
background: градиент, который нам нужен.
Вопрос: Как выглядит ID сообщения в телеграмме?

Лучший ответ:
ID выглядит правильно, вопрос в том, правильный ли вы подставляете, давайте лучше получим ID отправленного нами сообщения и изменим его по нему, а не тыкая пальцем в небо. Расскажу на примере Telethon(Самая простая библиотека по моему мнению):

Во первых, отправим сообщение и запишем его в переменную
message = client.send_message(chat_id, text)

После чего мы можем достать из переменной ID отправленного нами сообщения:
message = client.send_message(chat_id, text)
print("ID сообщения: ", message.id)

И вот только теперь отредактируем его с помощью ID, который получили, вот пример рабочего кода:
message = client.send_message(chat_id, text)
client.edit_message(chat_id,message.id,text)

Надеюсь, что объяснил понятно

Худший ответ:
Посмотри бота @ShowJsonBot
Вопрос: Как выбрать другой метод загрузки в YoutubeDL?

Лучший ответ:
Лучше загружать видео с YouTube через библиотеку pytube. Она работает немного быстрее, чем youtube_dl. Да и кода писать всего одну строчку (не считая импорта и input'а).
from pytube import YouTube
link = input()
YouTube(link).streams.first().download()

Худший ответ:
В youtube_dl решил это так:
filename = 'test.mp4'
url = '...' # Прямая ссылка на нужный формат видео
youtube_dl.downloader.HttpFD(YoutubeDL({}), {}).download(filename, {'url': url, 'downloader_options': {'http_chunk_size': 10485760}})
Загружает быстро, как мне и нужно было
Вопрос: Что за области оставил производитель и можно ли их удалить?

Лучший ответ:
Можно все удалить

Худший ответ:
отфарматируй их а потом обьедини томы, вся инфа гугле есть
Вопрос: Возможно ли совершать операции с числами больше Number.MAX_VALUE?

Лучший ответ:
В JavaScript недавно завезли целые числа неограниченной длины: https://learn.javascript.ru/bigint.
Так что сейчас почти как в Python.

Худший ответ:
Можно работать с числами как со троками и закодить выполнение нужных операций в столбик
Вопрос: Когда много страниц для верстки свыше 7 веб страниц, как делается тогда верстка, если каждая страница разная по дизайну?

Лучший ответ:
Поскольку два варианта из трех уже предложили, я предложу оставшийся: делаешь все так же как предложил Vladislav но стили хедера и футера, а так же общие стили страниц (ведь не смотря на то, что они очень разные, у них наверняка есть похожие элементы - например стили заголовков, абазцев и т.д.) объединяешь в один отдельный файл - layout.css
Этот файл подключаешь для каждой страницы + ее собственный файл стилей. Таким образом у тебя будет два набора стилей - общие + персональные для каждой страницы. При этом ты получишь то же удобство работы что и в варианте с отдельным файлом для каждой, но и одновременно стиль layout.css, будучи общим, будет кэшироваться уже после просмотра первой страницы и оставаться у пользователя, обеспечивая в том числе более быстрые и загрузку, и отображение последующих страниц.

Худший ответ:
Один CSS на весь проект. Для разработки можете разделять на разные, как вам удобно.
Вопрос: Можно ли так использовать Task.FromResult и имеет ли это вообще смысл?

Лучший ответ:
Не будет ли эта связка await+TaskResult очень тяжёлой по производительности
Проверьте 2 версии кода на тестах, что быстрее то и используйте :)

Худший ответ:
По производительности будет +/- одно и то же, но вариант с await чуть памяти сожрёт. 
В целом похоже больше на ошибку.
Вопрос: Как найти общие элементы у трех массивов?

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

Худший ответ:
Какой ужасный алгоритм! Лучше запихнуть первые два массива в hash-set (std::unordered_set). А потом при проходе по третьему массиву просто проверить, что этот элемент есть в первых двух set-ах.

Если элементы могут повторятся, но выводить надо только один раз, то заведите еще один unordered_set, куда добавляйте элементы, которые вы добавили в ответ. Естественно, перед добавлением элемента в ответ, проверьте, а не содержится ли он уже в этом set-е.

И код получится раз в 10 меньше и работать будет на пару порядков быстрее.
Вопрос: Разумно ли ставить разные сайты на одном хостинге?

Лучший ответ:
почему нет?
если устраивает, то вообще не проблема.

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

Лучший ответ:
добавь свое правило question
"SEF_URL_TEMPLATES" => array(
	"sections"=>"",
	"section"=>"section/#SECTION_CODE#/",
	"element"=>"kkm/#ELEMENT_CODE#/",
	"compare"=>"compare/",
	"smart_filter"=>"section/#SECTION_CODE_PATH#/filter/#SMART_FILTER_PATH#/apply/",
	"question" => "kkm/#ELEMENT_CODE#/question/"
)

Потом в шаблоне компонента каталога добавь файл question.php, в нем размести news-list с выводом нужной инфы

Худший ответ:
В urlrewrite добавляете правило:
array (
    'CONDITION' => '#^/catalog/([0-9a-zA-Z_-]+)/question([\\?\\#].*)?$#',
    'RULE' => 'ELEMENT_CODE=$1',
    'ID' => '',
    'PATH' => '/faq/detail.php',
    'SORT' => 100,
  ),
В файле /faq/detail.php размещаете (в зависимости от того как храните вопросы):
1 компонент bitrix:news.detail который по коду элемента каталога показывается вопросы сохраненные в этом элементе.
2 компонент  bitrix:news.list который по фильтру отбирает вопросы из инфоблока вопросов, привязанные к элементу каталога с этим кодом.
Вопрос: Как посчитать ФИО в колонках с неправильным порядком?

Лучший ответ:
Пример реализации для MySQL 8+:
WITH 
cte1 AS ( SELECT id, col1 val FROM test UNION ALL 
          SELECT id, col2 FROM test UNION ALL
          SELECT id, col3 FROM test ),
cte2 AS ( SELECT id, GROUP_CONCAT(val ORDER BY val) FIO
          FROM cte1 
          GROUP BY id )

SELECT test.id, test.col1, test.col2, test.col3, GROUP_CONCAT(cte2_2.id) ids
FROM test
JOIN cte2 cte2_1 USING (id)
JOIN cte2 cte2_2 USING (FIO)
GROUP BY test.id, test.col1, test.col2, test.col3
Вывод: 

id	col1		col2		col3		ids
1	Иванов		Иван		Иванович	1,2
2	Иван		Иванович	Иванов		1,2
3	Петров		Сергей		Алексеевич	3,4,5
4	Петров		Сергей		Алексеевич	3,4,5
5	Сергей		Алексеевич	Петров		3,4,5DEMO

Если нужна ещё и нормализация (т.е. строго в col1 сунуть фамилию, в col2 имя...) - наилучшим вариантом считаю загрузку справочников имён, отчеств и фамилий (вполне доступные справочники) и их использование для категорирования. 99% записей будут полностью обработаны по ним, а оставшийся десяток записей (где два или все три значения отсутствуют в справочниках) можно и вручную обработать, вернее, пополнить справочник, чтобы при втором запуске все 100% были распознаны и категорированы корректно.

выполняться будет на MS SQL Server, версию не могу сказать.
Для MS SQL вместо GROUP_CONCAT будет STRING_AGG(column) [WITHIN GROUP ( ORDER BY column)]. https://docs.microsoft.com/ru-ru/sql/t-sql/functio...

Худший ответ:
Можно только вряд ли запросом. Скорее кодом.

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

Очистка данных дело такое, дорогое и хлопотное. И проводить ее желательно до попадания в базу.
Вопрос: Как применить стили дочерным классам в зависимости их количества?

Лучший ответ:
Может, вам поможет обычный css и селектор типа
:nth-child(3):last-child {
  тут стили, если третий является последним
}

Худший ответ:
Вариант от Ankhena лучше не стоит использовать ЖС когда можно обойтись без него.
snippet
Вопрос: Где найти мелкую работу начинающему программисту?

Лучший ответ:
Устроится на работу стажером или джуном.

Худший ответ:
а именно заточенные под программингНахрена делать биржу под столь узкую специализацию? Нет таких конечно.
Вопрос: Как отправить сообщение в цикле on_message в discord.py?

Лучший ответ:
Наверно, потому что ctx.author.send(), если нужно написать в приват автору. Или ctx.channel.send(), если сообщение пришло с сервера и нужно ответить там же.

Худший ответ:
Событие on_message принимает сообщение, контекст существует только в командах.
Вопрос: На чем писать/поднимать каталог недвижимости?

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

Худший ответ:
Есть бюджет - берите Spring (Java)
Нет бюджета - Laravel (PHP)

Оба варианта имеют более чем приличное сообщество разработчиков, найти специалистов не будет проблемой.
Вопрос: На чем написать кроссплатформенный GUI?

Лучший ответ:
Самое выгодное - это то что вы лучше всего знаете. 
Если важна производительность то берите С++ или другой компилируемый язык. Но это на самом деле сильно зависит от задачи, где-то и python с php вполне хватает. Сам по себе GUI не требует особой производительности (если вы обычное приложение пишите, а не игрушку на 120FPS).
Можете юзать Qt на python и не слезать со своего любимого коня.

Худший ответ:
про питон ничё не знаю (но вроде крутой), а вот фреймворк Qt очень даже интересный. Но там лицензия просит выкладывать исходник по требованию.

Как коммерческий разработчик я вообще щас стал сторонником бинарников проприетарных. Всё, что не бинарник = для меня плохо.

Но себе на комп ставлю всё открытое на исходниках, всё что чёрный ящик = плохо, опасно :D