Funks
Понимаешь, мне самому интересно как это решается, я хочу это узнать
Тебе нужно в этой задаче фактически понять, что задумал автор этой задачи. Это относится к области “как понять, что хочет клиент, который сам не знает точно, чего именно он хочет?”. Тебе рано ещё об этом думать, так как клиентов у тебя нет и не будет в ближайшие несколько лет. Чтобы появились клиенты, тебе нужно научиться программировать, чтобы они про тебя узнали - и что ты можешь программировать, и что ты можешь создавать какие-то программы, и что ты можешь создавать такие же программы, которые вот прямо сейчас нужны им. А пока клиентов нет (а их нет потому, что ты ничего не умеешь пока создавать из пустоты, а воздух и фуфло, которые можно и не делать вообще, ты продавать не умеешь), учись программировать и создавать программы. Нет никакого секретного скоростного программирования, которое узнаётся само, из космоса, а ты такой просто лежишь и ничего не делаешь или там сидишь и в игры играешь всё больше и больше. Есть классическое программирование и новые технологии программирования. Это всё нужно освоить. Нельзя пропустить классическое программирование и сказать “а я сейчас в новейшей школе, которая звездит из всех экранов про мои заработки мечты, пройду супер-курс от гения, который работает там за десять тысяч рублей в месяц (и ещё может быть заплатят, а может и нет, потому что денег нет пока, директор так говорит с грустным лицом по скайпу), и они мне гарантируют (ну, они же не могут врать, у них такие добрые лица, честные люди), что я научусь делать программы новым образом просто и так быстро, всего за год”.
Поэтому я тебе и говорю, что есть задачи простые и сложные, но при этом понятные и самое главное нужные для развития навыков. Но ищешь ты их не там, потому что это говно ты бы сюда не принёс. Там такого говна нет, потому что оно бесполезно, его нельзя есть, в нём нет питательных веществ.
Funks
мне нравится изучать очень сложные задачи или задачи в решении которых я много или обсалютно ничего не знаю
У тебя не будет дефицита в таких задачах, когда ты начнёшь решать задачи из реального мира. Не какие-то там заказные, которые нужны кому-то там, а тебе они нахер не нужны, а вот те, которые нужны тебе. В реальном мире все задачи вот такие, как ты говоришь.
Я вот сейчас делаю программу. Простую скриншотовыжималку. Она просто с сайта выжимает скриншоты. Скачивает на диск скриншоты, которые нужны, а вот которые не нужны, она их выкидывает. Вот я думал, что напишу её за день (полдня буду писать, а полдня буду проверять, отлаживать там, причёсывать её и так далее), а пишу уже её пятый день и допишу завтра, послезавтра - не знаю когда.
Это вот небольшой кусочек этой программы. Когда ссылки на скриншоты скачаны и имена для этих скриношотов тоже скачаны, скриншоты по этим ссылкам не качаются, а имена содержат специальные символы. Следовательно, ссылки нужно переделать на закачиваемые, а имена нужно перевести в читаемые, но без специальных символов и без пробелов.
loader_convert_data()
{
local ifname="$1"
local ofname="$2"
local fields field1 field2 field3 field4
[ -e "$ofname" ] && rm -f "$ofname"
cat "$ifname" | while read line; do
fields=()
fields[0]=$(echo "$line" | linehand_getfield "1")
fields[1]=$(echo "$line" | linehand_getfield "2")
fields[2]=$(echo "$line" | linehand_getfield "3")
fields[3]=$(echo "$line" | linehand_getfield "4")
field1=${fields[0]}
field2=${fields[1]}
field3=$(echo "${fields[2]}" | converter_convert_url)
field4=$(echo "${fields[3]}" | converter_convert_name)
echo "$field1 $field2 $field3 $field4" >>"$ofname"
done || return 1
return 0
}
linehand_getfield()
{
local fieldnum="$1"
local text="$(cat)"
local out
if [ "$fieldnum" = "1" ]; then
out=$(echo "$text" | awk '{print $1}')
elif [ "$fieldnum" = "2" ]; then
out=$(echo "$text" | awk '{print $2}')
elif [ "$fieldnum" = "3" ]; then
out=$(echo "$text" | awk '{print $3}')
elif [ "$fieldnum" = "4" ]; then
out=$(echo "$text" | awk '
{
for (i = 4; i <= NF; i++) {
out = out $i (i < NF ? " " : "")
}
print out
}
')
else
out=""
fi
echo -n "$out"
}
converter_convert_url()
{
local url="$(cat)"
local urltype
local UT_FPO=0 UT_UNDEF=1
local out
urltype=`urlhand_detect_type "$url"`
case $urltype in
$UT_FPO)
out=`echo $url | urlhand_translate_fpo`;;
$UT_UNDEF)
out="$url";;
*) error "Unknown url type: \"$urltype\"";;
esac
echo -n "$out"
}
Вот этот кусочек за это и отвечает - преобразование ссылок и имён. Здесь приведена только верхушка этого кусочка, потому что он дальше растёт глубоко корнями в землю, как дерево. Там ещё целый слой функций под ним, в котором происходит трансляция ссылок и трансляция имён, так как ссылки, по которым хранятся скриншоты, находятся на разных сайтах хранения скриншотов с разными видами ссылок и требующими разных последовательностей преобразований, а имена бывают просто украшены спецсимволами, а бывают такими, что в них указана вся информация об изображениях, где имя самого изображения, которое и нужно, может стоять справа, а может стоять слева - где покажется красивее выкладывателю этого скриншота.
Естественно, ссылки могут требовать наличия прокси-сервера, а могут не требовать наличия прокси-сервера и качаться напрямую. Соответственно, где-то программа должна подставить прокси-сервер в соединение, а где-то может подставить, а можеть не подставлять. Ну и, естественно, если один прокси-сервер не работает, то программе нужно сказать, что вот есть другой прокси-сервер. Это требует наличия конфигурационного файла уже у программы, в котором и будет записан текущий прокси-сервер, так как опцию “вот другой прокси, используй его” программе каждый раз задавать неудобно будет.
Это вот простая задачка “перекачать скриншоты с этого сайта на диск”. Изначально кажется, что она решается за час. Потом через неделю примерно каждодневной работы часов по пять каждый день ты понимаешь, что теперь-то она всё качает, скриншотики лежат упорядоченные у тебя на диске и теперь она через кучку прокси-серверов может спокойно и устойчиво качать скриншоты сотнями за три секунды независимо от того, какой умник и с какими украшенными именами их выкладывал и на каком скриншот-сайте с какими-то там “полезными” предпросмотрами. Тебе это всё не нужно, твоя программа удаляет это всё нафиг, переделывает так, как надо, и скачивает то, что надо, в итоге, а не всякий мусор, который потом сидишь и чистишь руками по полчаса каждый раз.
Что же мне для этого понадобилось? Для этого мне понадобилось программировать всякие программки из всяких задачников десять лет, в результате чего эти программки стали писаться прямо в воображении без записи их в компьютере. И таким образом я понял, например, вчера, что “если я напишу на awk анализатор этой страницы со скриншотами по всем правилам (сначала лексический анализатор в виде конечного автомата, а потом синтаксический анализатор в виде конечного автомата с магазинной памятью для обработки получившегося потока лексем, который мне куски этой html-страницы, где перечислены сриншоты, оттранслирует в тексты в промежуточный файл, а тексты из промежуточного файла оттранслирует в JSON-данные во второй промежуточный файл, а JSON-данные можно уже будеть брать из второго промежуточного файла напрямую и писать в конечный простой текстовый файл с простым текстом, который поступает на вход следующей части этой программы), то это всё займёт столько времени и места, что жалко будет потраченного времени. Так что я просто выяснил, как встроить в программу кусочек на питоне с XPath-запросами, и сегодня будут этим заниматься - конструированием XPath-запросов для работы с деревьями, в которых хранятся скриншоты, которые нужно сначала сплющивать до единичной глубины, прежде чем их анализировать, где там скриншоты лежат, а где просто описания этих скриншотов в виде размера изображения в байтах, разрешения изображения, остальных свойств изображения. То есть нужно будет ещё 70% этих деревьев, получившихся из html-кода, выкидывать, чтобы оттуда ничего не пыталось скачаться на диск, потому что там скриншотов нет, там просто текст какой-то. Естественно, для всего этого тоже нужно будет писать функции, которые будут в форме предикатов отвечать на вопрос ”есть скриншот в этом дереве?: да/нет".
Вот она маленькая программка. Сколько для этого нужно знать, чтобы её сделать, - ну, сам посмотри. Поэтому будешь хуйню решать всякую - не будешь знать ничего, а не будешь знать ничего - не будешь ничего делать, так как само оно не делается. Никакой добрый дяденька не придёт и не сделает для тебя. Не будешь ничего делать - не будет у тебя клиентов/программ/и так далее, придётся тебе учиться фуфло продавать и воздух, как многие делают - то есть открывать школу какую-то (закупать её изготовление), чтобы на лохах, которые поведутся на эту школу (как ученики, так и учителя - они там все в одной роли), делать деньги.
tags: education