Если же, как указал автор, экранировать слэши в пароле, URL парсится так, как ожидалось изначально. Код:
Hidden text
package main
import (
"encoding/json"
"fmt"
"log"
"net/url"
)
func main() {
url, err := url.Parse("http://http:%2f%2fhttp:%2f%2f@http://http://?http://#http://")
if err != nil {
log.Fatal(err)
}
if url.User == nil {
log.Fatal("не могу распарсить данные пользователя")
}
// конвертирую в JSON для красивого вывода
urlBytes, err := json.MarshalIndent(url, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(urlBytes))
// структура url.Userinfo содержит только приватные поля, поэтому в JSON не попадёт; вывожу её отдельно
fmt.Printf("Username: %q\n", url.User.Username())
if password, ok := url.User.Password(); ok {
fmt.Printf("Password: %q\n", password)
}
}
Перед выполнением данных операций числа приводятся к целым, а результат — обратно к числу с плавающей точкой. Аналогичный подход присутствует и в JavaScript.
Большое спасибо за это сравнение! Давно присматриваюсь к обоим языкам (Elm и PureScript), хочется попробовать что-то чистое функциональное на фронтенде. Но не мог определиться с выбором, вроде оба достаточно популярны в своих кругах, оба имеют сообщество. Сложно выбрать со стороны, не зная приведённых вами нюансов.
Я это понимаю, но понадеялся, что ключ -std гарантирует использование только стандартизованных возможностей. Однако с ним код компилируется безо всяких предупреждений.
Но вы правы, вместе с ключом -pedantic пишет таки, что это нестандартная возможность. И это хорошо.
Извините, неверно вас понял. Я не знал, что возможно определение массива без размера как поля структуры. Спасибо за объяснение.
Однако такой код компилируется во всех стандартах, как в C89 и C99, так и в C++14 (проверял через флаг -std). Правда C++ не даёт инициализировать такое поле, говоря, что любая строка слишком длинная для него. Однако можно инициализировать значением по умолчанию. И C++ позволяет брать от такой структуры sizeof (с тем же результатом, как и в C) и при печати читает за границей памяти структуры.
Как я понимаю, это поле просто имеет размер 0. И соответственно, его смещение указывает на конец структуры с поправкой на выравнивание. Может, это можно даже использовать как-то? ) Например, для детекта, была ли включена упаковка для стуктуры.
Почему нельзя брать sizeof от структуры с безразмерными строками и почему нельзя класть их в массив?
sizeof не проходит символы строки, ему без разницы, есть там нулевой символ или нет. Размер структуры определяется на стадии компиляции и sizeof разрешается на стадии компиляции. Размер определяется на основании размеров типов полей в структуре (и учёта выравнивания, конечно же), а уж тип у любого поля точно есть, и его размер компилятору точно известен.
Аналогично с массивом — раз размер структуры известен, то ничто не помешает положить её в массив и оперировать с ней в последствии.
Единственное, что нельзя вызывать на таких строках — это функции для работы со строками (в том числе передавать их в printf). Потому что именно они полагаются на наличие терминального символа.
Подскажите, пожалуйста, что это за метапеременные такие? Пытался гуглить "regex metavars", но безрезультатно.
Судя по названию, это позволяет использовать куски регулярок несколько раз, чего очень и очень не хватает. Но я так и не смог найти, как такое можно сделать — обратные ссылки и именованные группы матчат лишь тот конкретный текст, который они сматчили в первый раз.
Или вы имеете ввиду определение переменных с кусками регулярок в самом языке, из которого они вызываются, а потом конструирование из них финального выражения через подстановку?
То есть нужно заставлять себя заниматься тем, что не интересно? Не совсем понимаю, как можно принуждать себя к хобби — оно по определению требует увлечённости. Или вы знаете секрет, как можно начать интересоваться тем, что тебе не интересно?
Хранение разрешено только для рисованной продукции или для фото/видео тоже?
А то, насколько мне известно, за хранение реального ЦП и раньше сажали (и ловят педофилов вроде именно так — сохранил с сайта картинку, записали IP, приехали, нашли картинку и посадили).
Потому, раз теперь 30-летняя тётя в школьной юбке тоже ЦП, за хранение её фото/видео будет срок?
Первая версия Хабра была написана на Perl, но просуществовала недолго. Следующая версия движка была уже на PHP. Этот движок тоже использовался относительно недолго из-за быстро росших нагрузок. Третий движок...
Дальше описывается третий движок, но так и не сказано, на каком же языке он реализован. А это весьма интересно! Расскажете?
Или я неверно понял, и при создании нового движка язык остался прежним (PHP)?
Вот часто слышу про то, что стоит смотреть на GitHub претендента. И меня это смущает.
Во-первых, высока вероятность, что у меня не будет проектов, касающихся области, куда я хочу устроиться. Просто потому, что в противном случае возможны конфликты.
Скажем, я вот увлекаюсь разработкой компиляторов, вряд ли при этом Intel будет доволен, если я продолжу их разрабатывать, устроившись к ним — вдруг украду архитектурное решение или даже код с работы? Я слышал, что запрещают даже работать в смежных областях после увольнения, где уж тут вести подобные личные open source проекты во время работы.
Но я не готов отказаться от своего хобби! Поэтому я буду устраиваться в область вне моих личных интересов, скажем, на разработку бекенда и т. п. И следовательно, мой GitHub никак не покажет моего опыта в данной области.
Во-вторых, одно дело, когда есть крупные и длительные личные проекты. А если я люблю прототипировать и проверять различные идеи?
Ну вот мне на этой неделе интересно, можно ли реализовать полиморфизм исключительно на рефлексии, а на следующей — получится ли сделать язык без сепараторов в грамматике. Естественно, при этом код выглядит весьма посредственно — нет тестов, не используется внедрение зависимостей и т. п.
На работе есть ответственность, там я буду писать иначе. Но это-то личные проекты, хобби, развлечение. Проще и быстрее сделять тяп-ляп, проверить идею и двигаться дальше. А в итоге получается, что мой GitHub создаёт обо мне неверное впечатление.
И что вы тогда посоветуете? Прятать подобные проекты? Но тогда не будет никакой публичной активности. Да и не хочу я их прятать — вдруг кому будут интересны мои идеи, он присоединится и поковыряет их вместе со мной.
Очень не хватает возможности использования нескольких выражений в лямбдах. Приходится объявлять отдельные функции для тех целей, для которых обычно используются лямбды, а последние использовать исключительно для создания замыкания.
Пожалуйста, подскажите, как в Python принято решать подобные ситуации? Может, я неправильно подхожу к вопросу?
Вроде бы в правилах данные ограничения не указаны. Стоило бы указать, чисто для проформы. Чтобы как в прошлый раз никто не придрался к вам с претензиями, что его решение несправедливо дисквалифицированно.
Ведь можно, например, найти весь словарь в числе пи, в программе указать лишь смещение, затем в init() рассчитать пи с нужной тончностью и получить 100% надёжность теста. А потом возмущаться, что вы недождались завершения работы init() и отдали приз другому.
Пожалуйста, укажите лицензию на ваш код. Формально, использовать код без указанной лицензии нельзя, ибо по умолчанию лицензия на код проприетарная, т. е. использовать код можете только вы, где бы вы его при этом не публиковали.
Не обязательно копипастить весь текст лицензии, укажите хотя бы её название и ваш копирайт. Например:
/* The MIT License (MIT)
* Copyright (c) 2016 tower120
*/
Также было бы очень здорово, если бы вы опубликовали код не только в статье на Хабре, но и, скажем, в виде GitHub Gist. Так вашему коду можно поставить звезду и потом не потерять его. А можно форкнуть и дополнить. И все форки будут в одном месте и тоже не потеряются.
Хочу заметить про сонолюминесценцию. Вроде уже установили причину — свечение происходит из-за нагрева газов внутри схлопывающегося кавитационного пузырька (а они туда попадают из воды вокруг, т. к. были растворены в ней; в частности растворение в воде некоторого количества инертных газов усиливает свечение), а нагрев газов происходит из-за крайне быстрого сжатия (схлопывания) кавитационного пузырька.
Да, чтобы газы светились, нужна температура в тысячи кельвинов и именно такая температура достигается при схлопывании кавитационного пузырька. Тысячи при многопузырьковой сонолюминесценции и сотни тысяч (sic!) при однопузырьковой.
В случае однопузырьковой сонолюминесценции на последней стадии коллапса кавитационного пузырька стенки пузырька развивают скорость до 1-1,5 км/с, что в 3-4 раза превышает скорость звука в газовой смеси внутри пузырька.
Источник — Википедия. Да, там ещё указывается модель Швингера (основанная на изменении вакуумного состояния электромагнитного поля в кавитационном пузырьке), как возможное объяснение. Но вроде как теория с нагревом признана основной в настоящее время.
P. S.: Очень интересуюсь данным явлением. Поражает, как столь маленькие пузырьки могут развивать такие скорости сжатия и создавать такие температуры.
Особенно это восхищает в свете существования рака-щелкуна (synalpheus regalis), который охотится, щёлкая клещнёй и создавая этим струю кавитационных пузырьков, которые, схлопываясь, нагревают воду до 4500 C (https://www.youtube.com/watch?v=W9xK1AmCHIM). Температура поверхности Солнца, напомню, около 5000 C.
Температура Солнца по щелчку пальцев клещни… Красиво же!
Мне кажется, с логарифмом будет совсем другое поведение. Собственно, вы описали это в статье — отсутствуют локальные минимумы.
С формулой q/r можно расставить отрицательные заряды вдоль границ улицы, поместить в конце положительный заряд и NPC побегут к нему (причём придерживаясь центра дороги, чего не будет, например, при использовании более популярного A*).
С логарифмом же, как я понял, тропинки из локального минимума вдоль улицы не получится, NPC просто вытолкнет за её пределы (то есть внутрь препятствий).
Go парсит оригинальный URL так же, как Python и JavaScript. Код:
Hidden text
Вывод:
Hidden text
Online: https://go.dev/play/p/q8qiLbkPriz
Если же, как указал автор, экранировать слэши в пароле, URL парсится так, как ожидалось изначально. Код:
Hidden text
Вывод:
Hidden text
Online: https://go.dev/play/p/lM5RdZw82PO
Перед выполнением данных операций числа приводятся к целым, а результат — обратно к числу с плавающей точкой. Аналогичный подход присутствует и в JavaScript.
Да, вы правы, это опечатка. Большое спасибо! Исправил в статье.
Большое спасибо за это сравнение! Давно присматриваюсь к обоим языкам (Elm и PureScript), хочется попробовать что-то чистое функциональное на фронтенде. Но не мог определиться с выбором, вроде оба достаточно популярны в своих кругах, оба имеют сообщество. Сложно выбрать со стороны, не зная приведённых вами нюансов.
Я это понимаю, но понадеялся, что ключ
-std
гарантирует использование только стандартизованных возможностей. Однако с ним код компилируется безо всяких предупреждений.Но вы правы, вместе с ключом
-pedantic
пишет таки, что это нестандартная возможность. И это хорошо.Извините, неверно вас понял. Я не знал, что возможно определение массива без размера как поля структуры. Спасибо за объяснение.
Однако такой код компилируется во всех стандартах, как в C89 и C99, так и в C++14 (проверял через флаг -std). Правда C++ не даёт инициализировать такое поле, говоря, что любая строка слишком длинная для него. Однако можно инициализировать значением по умолчанию. И C++ позволяет брать от такой структуры sizeof (с тем же результатом, как и в C) и при печати читает за границей памяти структуры.
Как я понимаю, это поле просто имеет размер 0. И соответственно, его смещение указывает на конец структуры с поправкой на выравнивание. Может, это можно даже использовать как-то? ) Например, для детекта, была ли включена упаковка для стуктуры.
Но вы правы, не для строк явно.
Почему нельзя брать sizeof от структуры с безразмерными строками и почему нельзя класть их в массив?
sizeof не проходит символы строки, ему без разницы, есть там нулевой символ или нет. Размер структуры определяется на стадии компиляции и sizeof разрешается на стадии компиляции. Размер определяется на основании размеров типов полей в структуре (и учёта выравнивания, конечно же), а уж тип у любого поля точно есть, и его размер компилятору точно известен.
Аналогично с массивом — раз размер структуры известен, то ничто не помешает положить её в массив и оперировать с ней в последствии.
Единственное, что нельзя вызывать на таких строках — это функции для работы со строками (в том числе передавать их в printf). Потому что именно они полагаются на наличие терминального символа.
Подскажите, пожалуйста, что это за метапеременные такие? Пытался гуглить "regex metavars", но безрезультатно.
Судя по названию, это позволяет использовать куски регулярок несколько раз, чего очень и очень не хватает. Но я так и не смог найти, как такое можно сделать — обратные ссылки и именованные группы матчат лишь тот конкретный текст, который они сматчили в первый раз.
Или вы имеете ввиду определение переменных с кусками регулярок в самом языке, из которого они вызываются, а потом конструирование из них финального выражения через подстановку?
То есть нужно заставлять себя заниматься тем, что не интересно? Не совсем понимаю, как можно принуждать себя к хобби — оно по определению требует увлечённости. Или вы знаете секрет, как можно начать интересоваться тем, что тебе не интересно?
Хранение разрешено только для рисованной продукции или для фото/видео тоже?
А то, насколько мне известно, за хранение реального ЦП и раньше сажали (и ловят педофилов вроде именно так — сохранил с сайта картинку, записали IP, приехали, нашли картинку и посадили).
Потому, раз теперь 30-летняя тётя в школьной юбке тоже ЦП, за хранение её фото/видео будет срок?
Дальше описывается третий движок, но так и не сказано, на каком же языке он реализован. А это весьма интересно! Расскажете?
Или я неверно понял, и при создании нового движка язык остался прежним (PHP)?
Вот часто слышу про то, что стоит смотреть на GitHub претендента. И меня это смущает.
Во-первых, высока вероятность, что у меня не будет проектов, касающихся области, куда я хочу устроиться. Просто потому, что в противном случае возможны конфликты.
Скажем, я вот увлекаюсь разработкой компиляторов, вряд ли при этом Intel будет доволен, если я продолжу их разрабатывать, устроившись к ним — вдруг украду архитектурное решение или даже код с работы? Я слышал, что запрещают даже работать в смежных областях после увольнения, где уж тут вести подобные личные open source проекты во время работы.
Но я не готов отказаться от своего хобби! Поэтому я буду устраиваться в область вне моих личных интересов, скажем, на разработку бекенда и т. п. И следовательно, мой GitHub никак не покажет моего опыта в данной области.
Во-вторых, одно дело, когда есть крупные и длительные личные проекты. А если я люблю прототипировать и проверять различные идеи?
Ну вот мне на этой неделе интересно, можно ли реализовать полиморфизм исключительно на рефлексии, а на следующей — получится ли сделать язык без сепараторов в грамматике. Естественно, при этом код выглядит весьма посредственно — нет тестов, не используется внедрение зависимостей и т. п.
На работе есть ответственность, там я буду писать иначе. Но это-то личные проекты, хобби, развлечение. Проще и быстрее сделять тяп-ляп, проверить идею и двигаться дальше. А в итоге получается, что мой GitHub создаёт обо мне неверное впечатление.
И что вы тогда посоветуете? Прятать подобные проекты? Но тогда не будет никакой публичной активности. Да и не хочу я их прятать — вдруг кому будут интересны мои идеи, он присоединится и поковыряет их вместе со мной.
Очень не хватает возможности использования нескольких выражений в лямбдах. Приходится объявлять отдельные функции для тех целей, для которых обычно используются лямбды, а последние использовать исключительно для создания замыкания.
Пожалуйста, подскажите, как в Python принято решать подобные ситуации? Может, я неправильно подхожу к вопросу?
Написал комментарий не в ту ветку. Извините.
Не касательно темы, замечательный рассказ. Очень рекомендую ознакомиться.
Вроде бы в правилах данные ограничения не указаны. Стоило бы указать, чисто для проформы. Чтобы как в прошлый раз никто не придрался к вам с претензиями, что его решение несправедливо дисквалифицированно.
Ведь можно, например, найти весь словарь в числе пи, в программе указать лишь смещение, затем в
init()
рассчитать пи с нужной тончностью и получить 100% надёжность теста. А потом возмущаться, что вы недождались завершения работыinit()
и отдали приз другому.Пожалуйста, укажите лицензию на ваш код. Формально, использовать код без указанной лицензии нельзя, ибо по умолчанию лицензия на код проприетарная, т. е. использовать код можете только вы, где бы вы его при этом не публиковали.
Не обязательно копипастить весь текст лицензии, укажите хотя бы её название и ваш копирайт. Например:
Также было бы очень здорово, если бы вы опубликовали код не только в статье на Хабре, но и, скажем, в виде GitHub Gist. Так вашему коду можно поставить звезду и потом не потерять его. А можно форкнуть и дополнить. И все форки будут в одном месте и тоже не потеряются.
Да, чтобы газы светились, нужна температура в тысячи кельвинов и именно такая температура достигается при схлопывании кавитационного пузырька. Тысячи при многопузырьковой сонолюминесценции и сотни тысяч (sic!) при однопузырьковой.
Источник — Википедия. Да, там ещё указывается модель Швингера (основанная на изменении вакуумного состояния электромагнитного поля в кавитационном пузырьке), как возможное объяснение. Но вроде как теория с нагревом признана основной в настоящее время.
P. S.: Очень интересуюсь данным явлением. Поражает, как столь маленькие пузырьки могут развивать такие скорости сжатия и создавать такие температуры.
Особенно это восхищает в свете существования рака-щелкуна (synalpheus regalis), который охотится, щёлкая клещнёй и создавая этим струю кавитационных пузырьков, которые, схлопываясь, нагревают воду до 4500 C (https://www.youtube.com/watch?v=W9xK1AmCHIM). Температура поверхности Солнца, напомню, около 5000 C.
Температура Солнца по щелчку
пальцевклещни… Красиво же!С формулой
q/r
можно расставить отрицательные заряды вдоль границ улицы, поместить в конце положительный заряд и NPC побегут к нему (причём придерживаясь центра дороги, чего не будет, например, при использовании более популярного A*).С логарифмом же, как я понял, тропинки из локального минимума вдоль улицы не получится, NPC просто вытолкнет за её пределы (то есть внутрь препятствий).