[>]
game.rogue
sysop.14
vit01(mira, 1) — All
2014-06-10 14:49:05
spline, я удалил это сообщение, теперь загружу его с тебя. Как там у тебя с сообщениями?
[>]
Задачи для vit01
todo.14
vit01(mira, 1) — All
2014-06-30 08:16:41
php нода
----
1. Поместить рабочий фетчер в гит
2. Мелкие исправления (с читалкой, например)
3. Поправить кое-что в фетчере
4. Создать ветку для добавления фич
4.1. Добавить blacklist
4.2. Добавить echolist
4.3. Добавить /x/t
нетехническое
----
1. Загейтовать некоторые сообщества ВК, пока что лично для себя, чтобы меньше туда заходить
2. Брать ленты новостей из операционок (пока что не знаю точно, но посмотрю)
3. Выбрать интересные разделы из янглинукса и попробовать загейтовать
----
4. Всё-таки вступить в Altlinux Team и собрать новые версии пакетов
[>]
По документации на сайте
to.doc.14
vit01(mira, 1) — All
2014-05-28 19:28:56
>- Там есть шифрование?
> Нет и неприменимо. Это технология для открытого общения, все сообщения доступны всем, и хранятся теоретически вечно.
Не нравится мне это. Лучше написать: "Никто вам не запрещает использовать шифрование в ii. Возможность есть, но в этом нет необходимости. ii - это технология для открытого общения, мы считаем, что все сообщения должны быть доступны всем, поэтому в стандарте шифрования нет".
> - Это фидо?
> и да, и нет
"ii - это не фидо, это гораздо лучше" ... как я там написал :)
Думаю, ссылку вверху "об" лучше заменить на "Что это".
[>]
Re: По документации на сайте
to.doc.14
vit01(mira, 1) — 51t
2014-05-29 05:19:40
> в minifaq? вот я сейчас, два раза видя этот текст, даже его не прочитал :) не надо, чтобы человек уснул на первой же странице. придумай короткий-короткий текст для того, что ты сейчас сказал :)
>> - Там есть шифрование?
В стандарте нет. Хотите - используйте, но в этом обычно нет необходимости.
> этот текст тоже будет на главной. но не в minifaq. ещё там должна быть ссылка на скачку (сделай страницу, где раскидай все свои пакеты, тарболы и всё, чё там у тебя, у меня будет только ссылка. кстати, забери последние мелкие фиксы из hg для http-клиента и для сервера), ссылка на битбакет, и пара текстов о том, что эта страница навсегда изменит жизнь пользователя, который на неё зашёл :)
Ок, сделаю обязательно (но немного потом).
> как это пошло и скучно :)
Зато сразу понятно человеку, который только туда зайдёт :)
> ps. ты у нас эксперт по github-документации. как там добавить ДВА CNAME? :)
Увы, я не эксперт по доменам (я всего один домен зарегал, но cname не настраивал).
[>]
Софт ii: начало работы
to.doc.14
vit01(lenina,50) — All
2014-05-31 08:40:25
Для начала работы с ii вам надо скачать софт:
http://irk38.tk/iidownload
Если вы пользуетесь GNU/Linux, то желательно скачать пакет. Если вы пользуетесь другой ОС, то клонируйте репозиторий с Bitbucket (внимание, вместе с программой скачивается база сообщений) или качайте тарбол tar.gz.
----------------------
Сервер (станция)
Веб-интерфейс сервера работает по-умолчанию на порту 62220. Для пакетной версии достаточно набрать в консоли ii-server и выписать пароль пользователя root (на станции ii). Если скачали обычную версию, сначала надо набрать points.py username, выписать пароль первого пользователя и запустить run.py
В конфиге points.txt описываются имена поинтов (т.е. пользователей) в формате пароль:поинт на строку.
Пакетная версия хранит конфиги и базу в ~/.ii, обычная - там, где её запустили.
----------------------
Клиент
Веб-интерфейс клиента работает на порту 62222. Для запуска пакетной версии набираете ii-client, правите конфиг в ~/.iiclient/config.cfg и набираете ii-client снова. В случае обычной версии правите конфиг и запускаете run.py. Формат конфига config.cfg:
пароль(строка авторизации)
http://адрес сервера/
эхоконференция
эхоконференция
эхоконференция
... и.т.д
----------------------
Текстовый клиент
Пользователи *nix могут попробовать txt клиент, работающий исключительно на текстовых файлах, без веб-интерфейса. Формат конфигов у него такой же, как и у обычного клиента. Для получения сообщений в пакетной версии надо запустить ii-txt get, для отправки ii-txt send, в обычной версии просто get.sh и send.sh. Конфиги находятся также в .iiclient
Как с ним работать: Для создания сообщения переходите в каталог, совпадающий с названием эхи, и создайте текстовый файл с подстрокой new (например, mymessage.new) и пишете туда сообщения в особом формате.
Обычное сообщение:
кому
subject
пустая строка
далее текст
...и.т.д
Ответное сообщение:
msgid сообщения, на которое отвечаешь
кому
subject
пустая строка
дальше текст
Сами сообщения также хранятся в каталоге эхоконференции, в файле 0000.txt они находятся все по порядку. Более подробно написано в README.utf8 txt клиента.
[>]
База данных
to.doc.14
vit01(lenina,50) — All
2014-05-31 08:52:27
База данных ii состоит из двух каталогов: echo/ и msg/. В msg/ хранятся сами сообщения, имена файлов генерируются как 20 первых символов base64 sha256-bin хэша сообщения. В echo/ хранятся индексы сообщений: там находятся файлы эхоконференций (имена файлов такие же, как и у нас в клиенте). Файл в echo/эха.постфикс состоит из списка имён файлов сообщений, находящихся в msg/, по порядку, в конце пустая строка. Из-за простой структуры базы данных сообщения можно передавать даже офлайн, на флешке: достаточно лишь положить сообщение в msg/ и в файле эхоконференции прописать его хэш.
[>]
g2k14: Theo de Raadt on security and configurations ==== ORIG
txt.drafts.14
vit01(mira, 1) — All
2014-07-16 07:21:28
OpenBSD project leader Theo de Raadt (deraadt@) writes in from g2k14:
In the two weeks leading up to Slovenia I worked with Bob Beck on the replacement functions that would be needed to emulate getentropy(2). During the start of the hackathon there was a final bit of work to ensure Bob and Brent Cook were on their way with that.
Then it was time to attack a new security issue I have become aware of. Apparently file descriptor exhaustion can be used to hide reporting of buffer overflows by the stack protector. The stack protector guard function needs a file descriptor to report failure. Some of you who have been following blogs about arc4random and getentropy will recognize this issue.
This issue was first made apparent due to the systrace sandbox technique now used in the ssh tools, which prevents syslog_r from doing socket, connect, sendto.. all the good system calls necessary to report failure, but dangerous -- and precisely what the sandbox is trying to prevent.
This has been solved by creating a new system call that can send a message to syslogd without needing any additional resources; syslog_r(3) then uses this directly, one shot, fire and forget. The system call is rather narrow in purpose, and thus named sendsyslog(2), but this also fits the narrow use case it will have such as sandboxing.
In that regard, it is quite similar to the way getentropy(2) was carved off sysctl. Funny how one thing leads to another.
Taking a break from the kernel space, it was time for some cleanup and hopeful improvement for /etc, sysmerge, and the installation tools. Robert and Antoine helped out with a plan to mostly empty /etc/rc, this work is not yet finished but will lead to an improved sysmerge. On other fronts, I worked with the install script guys and the DRM guys to make sure that our next release can automatically know to leave the X aperture closed for capable chipsets.
Remainder of the hackathon I flitted here and there, as usual, participating in projects of other developers. A very enjoyable and productive week!
[>]
Re: g2k14: Theo de Raadt on security and configurations
txt.drafts.14
vit01(mira, 1) — vit01
2014-07-16 08:10:20
Лидер проекта OpenBSD Тео де Раадт (deraadt@) пишет от g2k14:
В двух неделях до Словении я работал с Бобом Беком над заменяемыми функциями, которые будут необходимы для эмуляции getentropy(2). Во время начала хакатона шёл окончательный этап работы, чтобы гарантировать, что Боб и Брент Кук были на их пути с этим.
Потом пришло время напасть на новый вопрос безопасности, который я узнал. Очевидно, дескрипторное истощение файла может использоваться, чтобы скрыть сообщение о буферных переполнениях защитника стека. Функция охраны защитника стека требует файловый дескриптор, чтобы сообщить о неудаче. Некоторые из вас, кто был подписан на блоги arc4random и getentropy, признают эту проблему.
Эта проблема была сделана очевидной из-за метода песочницы systrace, теперь используемого в ssh инструментах, который препятствует тому, чтобы syslog_r открывал сокет, соединялся, отправлял.. все хорошие системные вызовы, необходимые, чтобы сообщить о неудачах, но опасные - и точно те, что песочница пытается предотвратить.
Это было решено созданием нового системного вызова, который может отправлять сообщение syslogd, вообще не нуждаясь в дополнительных ресурсах; syslog_r(3) тогда использует его непосредственно - один выстрел, огонь, и забыли. Системный вызов довольно узок в цели, поэтому назван sendsyslog(2), но это также соответствует его узкому случаю использования, который он будет иметь как в песочнице.
В том отношении, это подобно пути getentropy(2), который вырезали из sysctl. Забавно, как одна вещь приводит к другой.
Делая перерыв от пространства ядра, это было время для некоторой очистки и обнадёживающего улучшения для /etc, sysmerge, и для средств установки. Роберт и Антуан, который помог нам с планом для почти пустого /etc/rc, эта работа ещё не закончена, но приведёт к улучшенному sysmerge. На других фронтах я работал с парнями, что занимались установочными скриптами и с теми, что работали с DRM, чтобы удостовериться, что наш следующий релиз сможет автоматически знать, как оставлять апертуру X закрытой для совместимых чипсетов.
В остаток хакатона я мелькал тут и там, как обычно, участвуя в проектах других разработчиков. Очень приятная и производительная неделя!
[>]
g2k14: Martin Pelikan on ext4, filesystems in general ==== ORIG
txt.drafts.14
vit01(mira, 1) — All
2014-07-16 08:17:09
Martin Pelikan writes in with this report from g2k14:
My initial plan was to bring our base to a state where LLVM's libcpp could be compiled, giving us C++11 support. After I read up on the latest POSIX locale additions, other developers made it clear that more library version cranks will be necessary in order not to break ports. After the first diff was ready, I set up a base system build to check if it breaks. And then my life has changed...
Few days before the hackathon I decided to reinstall my laptop and put Linux, Windows and OpenBSD next to each other. One of the locale-related articles was left on the Linux partition and I wanted to open it in Austria, which is just full of tunnels without the internet. Our kernel didn't like the ext4; being too lazy to reboot, I decided to take a look at it "if I have a spare moment", which base builds certainly are.
No wonder -- ext4 uses extents, which weren't supported at that time. Quick look at FreeBSD showed they already have read-only support which became more or less functional on my OpenBSD kernel on Wednesday evening. No HTree directory indexes, no 64-bit block numbers, no journal or snapshots or multi-mount protection. But I could finally read the PDF without rebooting, and then also copy a file bigger than 4 GB or open a directory with 50,000 subdirectories in it. Never even looked at filesystem code before, and now a working port in a few hours? Life was great!
The question now was how to integrate it. OpenBSD developers don't like huge diffs for a very good reason. After fixing the inode format and adding new flags, Ted pointed out the ancient rule "whoever touched it last now becomes the maintainer" was valid even here. It was obvious I had to gain more knowledge by reading design papers and other systems' code before I can do valuable and correct commits. Legacy remnants like hard-coded (and wrong) limit on file sizes went first. Parts of the code were pretty badly comprehensible but FreeBSD has managed to split them up somehow. After our code paths looked similar enough, the ext4 extent support hit the tree.
Despite the fact that hackathons' purpose should be to write code, I had to literally learn to work with a subsystem I've only seen very vaguely once before (with FUSE). Because FreeBSD has already had these bits and getting them to work was so easy, this was a very good place to learn how to write filesystem code myself. During the next days I wrote code parsing and following the journal and ended up deliberately breaking my filesystem to observe what should we do about recovering it in seconds and how to order writes to support them in the future. Let's try to continue going down this road.
All this wouldn't have been possible without Phillip Guenther who reviewed my diffs after I kept distracting him from way more important things to do. Ted, Theo, Ken and Bob gave me lots of valuable input and explained how are things supposed to really work. Stephan Sperling gave me access to one of his sparc64 machines and gladly kept the tree up-to-date, so my breakages were relatively few and minor. Discussions about the network stack helped narrowing our focus to a direction and explaining our concerns about other solutions. Mitja must have been very busy with organizing the event so that things would go as well as they did. Well done everyone, thanks!
Now let's hope this filesystem enthusiasm will last longer, because now I need to switch back to GSoC in an area I'm already familiar with. Breaking my filesystem now will hopefully help repairing yours one day...
[>]
Re: g2k14: Martin Pelikan on ext4, filesystems in general
txt.drafts.14
vit01(mira, 1) — vit01
2014-07-16 09:27:04
Мартин Пеликэн пишет в отчёте с g2k14:
Мой первоначальный план состоял в том, чтобы привести нашу базу в состояние, при котором libcpp LLVM мог быть собран, дав нам поддержку C++11. После того, как я читал о последних дополнениях локалей POSIX, другие разработчики прояснили, что будет нужно больше вариантов версии библиотеки, чтобы не сломать порты. После того, как первый diff был готов, я поднял сборку базовой системы, чтобы проверить, сломается ли она. И затем моя жизнь изменилась...
За несколько дней до хакатона я решил переустановить свой ноутбук, поместил туда Linux, Windows и OpenBSD рядом друг за другом. Одна из связанных с локалями статей была оставлена на разделе с Линуксом, и я хотел открыть её в Австрии, которая просто полна тоннелей без интернета. Наше ядро не любит ext4; будучи слишком ленивым для перезагрузки, я решил смотреть на неё как на то, "если у меня есть свободный момент".
Неудивительно - ext4 использует то, что не было поддерживаемым в то время. Беглый взгляд на OpenBSD показал, что у них уже есть поддержка только для чтения, которая стала более-менее функциональной на моём ядре OpenBSD в среду вечером. Нет индексов каталога HTree, нет 64-битных номеров блоков, нет журналов или снапшотов, или защиты от мульти-монтирования. Но я мог наконец прочитать PDF без перезагрузки и затем даже скопировать файл, больше, чем 4 ГБ, или открыть каталог с 50 000 подкаталогов в нём. Никогда прежде даже не смотрел на исходники файловой системы, а сейчас написал рабочий порт за несколько часов? Жизнь была прекрасна!
Теперь вопрос состоял в том, как его интегрировать. Разработчики OpenBSD не любят гигантские diffы, и на это есть серьёзное основание. После починки формата inode и добавления новых флагов, Тед указал на древнее правило "кто бы ни коснулся его теперь становится мейнтейнером", оно было действительно даже здесь. Это было очевидно, что я должен был получить больше знания, читая тексты дизайна и код других систем, прежде чем смогу делать ценные и правильные коммиты. Сначала пошли устаревшие остатки, похожие на трудно (и неправильно) закодированный лимит размеров файлов. Части кода понимались с трудом, но FreeBSD удалось их разделить, так или иначе. После этого наши пути кода выглядели достаточно похожими, поддержка ext4 поразила дерево.
Несмотря на то, что цель хакатона была в написании кода, я должен был буквально учиться работать с подсистемой, которую я видел очень неопределённо до этого однажды (c FUSE). Поскольку, у FreeBSD уже были эти биты, и заставить их работать было так просто, это было очень хорошее место, чтобы научиться писать код файловой системы самому. В течение следующих дней я написал парсинг кода, и, следуя журналу, закончил тем сознательно, ломая мою файловую систему, чтобы наблюдать то, что должны мы делать, восстанавливая её в секунды, и как сделать поддержку записи в будущем. Давайте попытаемся продолжить идти по этой дороге.
Всё это не было бы возможно без Филипа Гуентэра, который рассмотрел мои diffы после того, как я продолжал отвлекать его от более важных дел. Тед, Тео, Кен и Боб дали мне много ценного и объяснили, как вещи должны работать. Стефан Сперлинг дал мне доступ к одной из его sparc64 машин и с удовольствием держал дерево актуальным, таким образом, мои поломки были относительно небольшими и незначительными. Обсуждения о сетевом стеке помогли сузить наш фокус в направление и по поводу других решений. Митжа, должно быть, был очень занят организацией встречи, чтобы дела шли так, как им положено. Каждый всё сделал отлично, спасибо!
Теперь давайте надеяться, что этот энтузиазм насчёт файловой системы продолжится дольше, потому что я теперь должен переключиться назад на GSoC - в область, с которой я уже знаком. Порча моей файловой системы сейчас, надо надеяться, будет когда-нибудь помогать чинить вашу...
[>]
g2k14: Marc Espie on ports and packages ==== ORIG
txt.drafts.14
vit01(mira, 1) — All
2014-07-16 09:30:53
Yet another report from the recently completed g2k14 hackathon, this time from Marc Espie (espie@) who writes
First time in Slovenia. Took a few hours off to see the city, managing to escape the thunderstorms. Somewhat interesting mix, never seen that mixture of eastern european, southern europe, and tourist places.
As for the hackathon, I came in right after a big change (reordered packages), and I was mostly ready to fix things if necessary. To my surprise, it worked like a charm... If I broke something, nobody noticed a thing (and you guys are going to enjoy faster updates).
After much nagging, Vadim Zhukov finally committed a digikam-kde4. I did crash-test the build, and inundated him with bug-reports that he fixed quickly.
I worked on a few small things... noticed a lot and fixed a wee little bit of the usual ports tree breakage related to those fearless source hackers (mostly libressl, endian.h and mesa updates fallout).
I worked on a new mechanism to ensure package snapshots consistency. Quirks now reports its signature date (which is itself checked, so you can't tamper with it), so you can know whether the snap is recent or whether someone has been hampering it to come to your favorite mirror...
... and quirks itself contains a list of vulnerable packages, which will raise a red flag if you need them, and they're NOT on your favorite mirror.
All of this is just indicative for the user, as the snaps still take a long time to fan out... we have ideas to help with THAT specific problems, but after discussion with the interested parties, it won't be deployed before the next release is out, as it would be too disruptive.
I also tried to fix a problem with ports build requiring src to be present for pkglocatedb. Much to my surprise, theo agreed, and we went further than anticipated, so the snaps now ship with locate dbs for src AND X.
I spent a lot of time playing with that: pkg_check now uses it, and actually will check your full file system. It's a bit too verbose still, but getting there.
Accordingly, I spent some time killing some old code. It's not as sexy, but it's possibly the most important part of the process, ensuring we don't run stuff that's no longer needed/maintained...
I should also mention importing a stand-alone cpp to deal with calendar and xrdb, eventually, so that X will no longer require you to install comp.
As usual, seeing fellow developers face-to-face was a great help in getting some things to move forward.
Thanks to the foundation for paying for the event, and to Mitja for hosting us, doing such a perfect job that we barely noticed it.
[>]
Re: g2k14: Marc Espie on ports and packages
txt.drafts.14
vit01(mira, 1) — vit01
2014-07-16 10:29:18
Ещё один отчёт с недавно завершённого хакатона g2k14, на этот раз от Марка Эспи (espie@), который пишет:
В первый раз в Словении. Заняло несколько часов, чтобы увидеть город, удалось избежать гроз. Несколько интересное соединение, никогда не видел такую смесь восточноевропейской, южной Европы и туристические места.
Что касается хакатона, я приехал туда прямо после большого изменения (переупорядоченные пакеты), и я был почти готов починить что-либо в случае необходимости. К моему удивлению, это работало как очарование... Если я сломал что-то, никто этого не заметил (и вы, парни, собирающиеся насладиться более быстрыми обновлениями).
После большого нытья Вадим Жуков наконец закоммитил digicam-kde4. Я сделал краш-тест сборки и закидал его отчётами об ошибках, которые он быстро чинил.
Я работал над несколькими мелочами... заметил много и чинил крошечно-маленький сломанный кусок дерева портов, связанный с теми бесстрашными хакерами исходников (главным образом, libressl, endian.h и обновлениями mesa).
Я работал над новым механизмом, чтобы гарантировать последовательность снапшотов пакета. Quirks теперь сообщает о своей дате подписи (которая самостоятельно проверяется, то есть вы не можете в это вмешаться), таким образом, вы можете знать, или снапшот недавний, или кто-то воспрепятствовал, чтобы он пришёл в ваше любимое зеркало...
... и quirks сам содержит список уязвимых пакетов, которые поднимут красный флаг, если вы нуждаетесь в них, и их НЕТ на вашем любимом зеркале.
Всё это просто показательно для пользователя, поскольку снапшотам нужно большое время для того чтобы разойтись (по зеркалам)..., у нас есть идеи, как помочь с ЭТИМИ специфичными проблемами, но после обсуждения с заинтересованными сторонами он не будет развёрнут до следующего релиза, поскольку это было бы слишком подрывным.
Я также попытался решить проблему со сборкой портов, требующих src, чтобы присутствовать в pkglocatedb. К моему большому удивлению, Тео согласился, и мы пошли дальше, чем ожидалось, поэтому теперь снапшоты определяют местонахождение dbs для src И X.
Я провёл много времени, играя с этим: pkg_check теперь использует его, и фактически будет проверять вашу полную файловую систему. Это всё ещё немного более многословно.
Соответственно, я провёл немного времени, убивая кое-какой старый код. Это не столь сексуально (что?), но эта, возможно, самая важная часть процесса, гарантирует, что мы не будем запускать то, что более не нужно/не поддерживается...
Мне следует также упомянуть, что импортировал автономный cpp, чтобы иметь дело с календарём и xrdb, в конечном счёте, так чтобы X больше не требовал от вас установки comp.
Как обычно, встреча с поддерживающими разработчиками лицом к лицу было большой помощью в продвижении некоторых вещей.
Спасибо фонду за оплату события и к Mitja за гостеприимство, делая такую прекрасную работу, что мы только это заметили.
[>]
Re: g2k14: Marc Espie on ports and packages
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-16 13:51:43
> текст получается чисто механический, чисто анлицированный, не по-русски звучит :(
Знаю, переводил почти дословно, сохраняя все детали. Надо будет исправить до хорошо читабельного варианта
> если это где-то проанонсировать - будут справедливо ругаться, что механический переводчик так же переводит :) а если не анонсировать - то кому вообще этот текст писать...
Механический переводчик вообще статьи отвратительно переводил - совсем непонятно было, о чём там говорится =) Поэтому пришлось где-то 60-70% переделывать самому. Опять же, сначала лучше всё перевести, потом исправить стиль, а публиковать в последнюю очередь.
[>]
Re: linux.14
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-23 11:44:34
> прокинь обратно с меня linux.14
загейтовал, см. im.100.
> ps. чё с переводами?
Чё-то лень на меня такая напала :( ужас
Буду искоренять. Наверное, лучше тебе будет мне просто todo написать, даже в виде msgid, чтобы я это перевёл. todo дисциплинирует =)
[>]
Re: linux.14
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-23 12:07:50
> мне это вообще ничего не говорит... какие-то vk-скрипты...
Это же гейты. Они в эху постят, чтобы мне лишний раз не заходить...
> есть просто список эх, где постоянно сообщения добавляются...
Сообщения добавляются рандомно...
> или дай полный список эх, я все зафетчу
"game.rogue.14",
"obsd.talk.14",
"bone.14",
"ii.dev.14",
"obsd.rss.14",
"ru.humor.14",
"gazeta.14",
"lor-opennet.2014",
"im.100",
"todo.14",
"to.doc.14",
"sysop.14",
"linux.14",
"ii.test.14",
"ii.soft.14",
"ii.echo.vote.14",
"music.14",
"younglinux.info.14"
Это был конфиг spline-fetch.php, свои эхи ты уже знаешь.
[>]
Re: linux.14
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-23 12:26:12
> они не говорят мне, КАК ЭХА НАЗЫВАЕТСЯ :) мне вот что было интересно :)
vk-news.14. Завёл её исключительно для себя, больше никто не читает. Была ещё niksor-vk.14 (филиал ru.humor), но владелец потерял к ней интерес, да и удалилась эха при чистке =)
> кстати, ещё тыщ 5 сообщений, и надо будет уже пробовать базу данных или хотя бы раздельное хранение по подкаталогам
Думал про идею хранения в одном файле нескольких сообщений, но что-то не сложилось
[>]
Re: linux.14
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-23 12:26:20
> подписался на все... чего там только нет... даже какие-то янглинаксы, вк-нюсы
Контент у нас всё-таки есть, какой-никакой =) Только не читает никто. Кроме меня, наверное.
> наверное, и game.rogue.14 я загейтую и younglinux и вк-нюс, сделай бекфетчинг...
Ок, сделаю
> и ещё надо какую-нибудь эху сделать, типа pipe.1380, чтобы можно было между двумя сетями сообщения кидать - иной раз хочется что-то в другую сеть написать, а это надо искать клиент, запускать, то, сё... а так пайпнул, и порядок... можно, чтобы не была просто болталка, стилизовать её под что-нибудь, хоть под клуб джентльменов, хоть под хоббитов, хоть под рыцарей, хоть под звёздные войны - просто для забавы, чтобы не просто болталка была :)
im.global.14
Неплохое название, да?
[>]
Re: linux.14
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-23 12:46:58
> так как вообще узнать об их существовании? :)
Кого? Пользователей? У меня даже счётчиков не стоит на сайте =)
> я и так думаю, как на юзера больше хорошо подаваемой информации сразу выплюнуть, чтобы знал, что тут есть... постоянно кручу перекручиваю... а вы всё попрятали :)
То, что есть у меня, ты уже знаешь (ну список эх). У Андрея, кстати, свои локалки есть, например, spline.bash.rss и spline.creepy. Но это уже у него надо узнавать.
Конкретно про свою станцию (да и не только) я считаю, что простым юзерам интересно будет почитать younglinux.info.14. Тем более, все статьи из раздела python я туда уже запостил. В эхе vk-news.14 идёт перепост со страницы Реактос в ВК. Но это не надо, наверное.
> мне больше pipe.ГОД нравится. типа, попадаешь в трубу, и там или 1380-й, или 2922, и соответствующая стилизация :)
Такое тоже можно. Но тогда это получается просто тематическая болталка, а не глобальная.
[>]
Re: linux.14
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-23 12:52:41
Про sql думаю, что надо будет оно всё-таки. Когда лимит инодов будет подходить к концу. Просто у меня на хостинге такой лимит есть, и превышать его не разрешается. Из-за этого пару дней назад был no message, если помнишь.
[>]
Re: linux.14
txt.drafts.14
vit01(mira, 1) — 51t
2014-07-23 13:04:07
> о существовании эх?
Когда мы перейдём на новый вариант php ноды, где имеется эхолист, я всё туда запишу, и с описаниями. Андрей обещает протестировать.
> я сейчас граблю компьютерру, allhockey, f1news и юморный сайт-опять-забыл-название...
Юмор с тебя гейтуется, а остальное что-то не хочу =) хотя видел, что есть. Будет нужно мне и/или поинтам - загейтую.
Кстати, у меня есть идея кое-что загейтовать... Тоже для себя пока сделаю.
> я ж не хожу никуда :)
Сейчас что-то меньше опять ходить стал. Всё, что нужно, теперь есть в ii, поэтому теперь ходить мало куда нужно. Но на примете пара мест есть... потом сообщу.
[>]
Re: он сказал openxcom!! :)
txt.drafts.14
vit01(lenina,50) — 51t
2014-07-28 09:36:16
g2k14: Jonathan Gray on driver improvements for X
Джонатан Грэй (jsg@) сообщил нам, почему он провёл 30 часов в автобусе, чтобы быть с нами:
Одной из первых вещей, которые я сделал в g2k14, был импорт обновления Mesa, над которым я теперь работал в течении некоторого времени. Я следил за git репозиторием Mesa несколько месяцев и отправлял патчи, чтобы уменьшить всю ту боль, причинённую локальным diffом, который не был таким большим, но приходилось тратить много времени на обновления.
Незадолго до хакатона я столкнулся с проблемой, заставляя Mesa собираться на i386, как бы то ни было. Это происходит только в том куске кода, который с помощью sysctl проверяет, включен ли SSE. Это, как оказалось, было проблемой, потому что sysctl.h включает в себя utm_extern.h, который, в свою очередь, берёт заголовочные файлы ядра, включая mutex.h, это означает, что mtx_init() из Mesa конфликтует с mtx_init() ядра. Тео потратил немного времени, вычищая sysctl и заголовки utm, таким образом, они не будут включать где-либо много определений. Эту работу уже закоммитили, когда я пришёл на хакатон.
На следующий день я сделал немного сборок xenocara, чтобы найти любые дополнительные проблемы. Проблема, которую я нашёл, происходила из-за симлинка в файл дистрибутива Mesa, который игнорировался cvs import, что починили ссылками из Make-файлов в другую директорию. Я также проверил дважды работоспособность сборок Mesa со включенным LLVM, который всё ещё работал через программный рендеринг LLVMpipe.
Другая проблема со сборками Mesa заключалась в том, что sys.mk, автоматически включаемый через make в Makefile, добавляет CFLAGS к CXXFLAGS. Поскольку Mesa является смесью C, которая включает и код C99, с C++, g++ ругался на то, что к нему попадал C-специфичный флаг -std=c99. diff, который исправляет это в системных Make-файлах и некоторых других местах, будет потом отправлен по почте.
Я также проконтролировал, чтобы дерево исходников собиралось с OPENSSL_NO_DEPRECATED, который в большинстве случаев добавлял инклюды, которые больше автоматически не брались из других инклюдов. Для некоторых вещей, таких как nginx, которые поддерживаются извне, есть патчи, которые уже доступны в следующих версиях. Мы их потом возьмём, но пока что ещё не так уж и стоит патчить нашу версию, когда есть другие места в дереве (libkeynote/bind/sendmail и.т.д.), где требуется сделать изменения. Я также вскользь посмотрел на компиляцию с OPENSSL_NO_SSL_INTERN, но после того, как увидел, что dc и gzsig поломались во время сборки, я решил посмотреть в другие места.
Я посмотрел на обновление некоторых патчей clang, которые искал пару лет, и коммитил некоторые вещи, касающиеся этого.
Xorg теперь может работать без необходимости предоставлять прямой доступ из пространства пользователя к памяти ядра/устройства, если режим modesetting (KMS) ядра поддерживается. Проблема ещё заставляет некоторые устройства требовать доступ к этому окну памяти, чтобы запустился Xorg. Установщик задаёт вопрос, если находит vga устройство, которое включает окно через machdep.allowaperture sysctl. После обсуждения с парой людей на g2k14 я написал небольшие скрипты, чтобы забирать номера поставщика/продукта PCI из драйверов radeondrm и inteldrm, которые используются pci вложением в vga драйвер, чтобы написать строчку в dmesg, если это окно памяти требуется для запуска Xorg. Установщик был изменён halex@ и rpe@, чтобы проверить эту строку и теперь будет только спрашивать, нужно ли человеку запускать X11 (который включает окно), если оно найдено. Вопрос X11 не будет задан теперь на многих серверах, так как есть чёрный список серверных графических устройств в коде, решающем, нужен ли aperture.
Проблема, с которой я столкнулся теперь несколько раз, - это недостаток заголовка cpuid.h, который идёт из gcc >= 4.3 и clang, чтобы обеспечить интерфейс, запрашивающий cpuid на i386 и amd64. Mesa из git теперь требует cpuid.h для сборки. Intel-овский драйвер Xorg отключает код, включённый в решение, если SSE присутствует, и делает решения, основанные на размерах кэша, если его нет. И, по крайней мере, некоторые порты (т.е. OpenXCOM), кажется, теперь его ждут. Таким образом, я взял cpuid.h из clang, чтобы включить его в нашу версию GCC 4.2.1. Сначала я изменил определения SSE_4_1 и SSE_4_2 на SSE_41 и SSE42, чтобы соответствовать именам, используемым в GCC, но, вероятно, они оба будут включены, когда это закоммитят.
Большое спасибо OpenBSD Foundation и Мите за g2k14!
[>]
Re: ReactOS - это Windows бесплатно!
vk-news.14
vit01(mira, 1) — Новостной_робот
2014-07-06 05:11:46
> ФСБ получит почти все данные о пользователях в интернете
Всё, пора бежать в tor и i2p =)
> Интернет-компании будут делиться с российскими спецслужбами почти всеми данными об активности пользователей в сети, кроме содержания переписки и постов.
ага, так и поверил, что без содержания переписки
> По новому регламенту #ФСБ получит доступ ко всей информации интернет-компаний о пользователях Сети. Логины, почтовые адреса, списки контактов, количество и объем сообщений, информацию об аккаунтах и многое другое.
Ужас
[>]
Условный оператор
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:26
Пользователь вводит число, программа должна вывести на экран его описание.
Например, "положительное однозначное число", "отрицательное двухзначное" и т.п.
Можно по-разному подойти к решению этой задачи. Например, можно сначала
проверить число на положительность, а потом на количество знаков. Можно сразу
проверять и на то и на другое, но тогда логические выражения будут сложнее.
n = int(input("n = "))
if n == 0:
print("Ноль - однозначное число")
else:
if n > 0:
print("Положительное", end=' ')
else:
print("Отрицательное", end=' ')
if abs(n) < 10:
print("однозначное число")
elif 10 <= abs(n) < 100:
print("двузначное число")
else:
print("трехзначное или более число")
Примеры выполнения программы:
n = 345
Положительное трехзначное или более число
n = -23
Отрицательное двузначное число
[>]
Списки, кортежи
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:27
Вывести содержимое списка по 10 элементов в строке так, чтобы вывод происходил
как-бы по спирали: каждая вторая строка должна выводиться задом наперед.
**Решение задачи:**
Зная номер строки и то, что элементов в строке 10, можно вычислить индексы
первого и последнего элементов в строке. А далее в цикле вывести элементы либо
от первого к последнему, либо от последнего к первому в зависимости от
четности строки.
Номер первого элемента в строке можно определить по формуле i * 10, где i -
это номер строки. Действительно, если строка нулевая, то индекс первого
элемента будет 0, а если строка первая, то индекс будет 10. Индекс же
последнего элемента в строке отличается от первого на 9 единиц, хотя всего
элементов в строке 10.
"Счетчиком" в цикле, выводящем строку элементов задом наперед, является индекс
последнего элемента; он же используется при выводе элемента.
import random
a = []
for i in range(100):
a.append(round(random.random() * 50))
i = 1 # обычный вывод для сравнения
while i <= 100:
print('%4d' % a[i-1], end='')
if i%10 == 0: print()
i += 1
print()
i = 0 # вывод по спирали
while i < 10:
if i%2 == 0:
j = i * 10
k = j + 9
while j <= k:
print('%4d' % a[j], end='')
j += 1
print()
else:
j = i * 10
k = j + 9
while j <= k:
print('%4d' % a[k], end='')
k -= 1
print()
i += 1
Пример выполнения скрипта:
29 9 50 36 25 1 2 43 13 41
0 23 43 45 26 40 1 41 1 44
47 45 1 38 32 5 40 30 41 25
25 43 37 9 45 33 6 38 13 47
33 4 15 18 18 32 29 48 20 18
49 11 50 8 37 23 25 3 18 5
50 19 24 44 5 11 25 30 39 35
17 31 33 18 7 21 41 41 6 48
19 4 31 9 23 49 39 6 25 21
27 12 27 25 26 47 18 15 3 33
29 9 50 36 25 1 2 43 13 41
44 1 41 1 40 26 45 43 23 0
47 45 1 38 32 5 40 30 41 25
47 13 38 6 33 45 9 37 43 25
33 4 15 18 18 32 29 48 20 18
5 18 3 25 23 37 8 50 11 49
50 19 24 44 5 11 25 30 39 35
48 6 41 41 21 7 18 33 31 17
19 4 31 9 23 49 39 6 25 21
33 3 15 18 47 26 25 27 12 27
[>]
Условный оператор
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:27
Дана следующая функция y = f(x):
y = x - 0.5, при x > 0;
y = 0, при x = 0;
y = |x|, при x < 0.
Написать программу, определяющую значение y по переданному значению x.
Поскольку существует три "пути" вычисления значения функции и при этом третий
"путь" однозначно определяется исключением первых двух, то в данном случае
можно использовать конструкцию if-elif-else, а не if-elif-elif.
print("y = f(x):\n\t| y = x - 0.5, если x > 0\n\t| \
y = 0, если x = 0\n\t| y = |x|, если x < 0")
x = float(input("x = "))
if x > 0:
y = x - 0.5
elif x == 0:
y = 0
else:
y = abs(x)
print('y = %.2f' % y)
В строке, переданной в функцию print(), используются специальные символы '\n'
и '\t'. Первый обозначает переход на новую строку, а второй - табуляцию
(отступ).
Символ '\' в конце строки позволяет перенести длинную строку в коде Python. Но
при выводе она будет выведена в одну линию.
Можно было не использовать ветку else, а использовать еще одну ветку elif с
условием x < 0. Также, в данном случае, вместо выражения y = abs(x) можно было
использовать y = -x. Однако так делать нельзя, если был бы неизвестен знак x.
Пример работы программы:
y = f(x):
| y = x - 0.5, если x > 0
| y = 0, если x = 0
| y = |x|, если x < 0
x = 2.3
y = 1.80
[>]
Строки
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:27
В тексте найти слово под определенным номером (например, пятое слово по
счету). Вывести на экран его первую букву.
В программе ниже переменная count используется, чтобы считать слова, а f -
чтобы определять, находимся ли мы внутри очередного слова или началось новое
слово.
Если началось новое слово, то счетчик слов увеличивается, и если счетчик равен
искомому по номеру слову, то цикл завершается.
s = input()
l = len(s)
n = int(input("Номер слова: "))
count = 0
f = 0
i = 0
while i < l:
if s[i] != ' ' and f == 0:
count += 1
f = 1
if count == n:
break
elif s[i] == ' ':
f = 0
i += 1
print(s[i])
Пример выполнения кода:
один два три четы пять шесть Номер слова: 4
ч
Однако с помощью Python решение этой задачи может быть существенно короче:
s = input()
l = len(s)
n = int(input("Номер слова: "))
s = s.split()
print(s[n][0])
Метод split() без аргумента разбивает строку на слова по пробелу. Выражение
s[n][0] извлекает из списка n-ый элемент, а затем берет из сроки первый
символ.
[>]
Файлы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:27
Дан файл с расписанием занятий на неделю. Помимо названия предмета в нем также
указано лекция это, или практическое занятие, или лабораторная работа. В одной
строке может быть указаны только один предмет с информацией о нем. Посчитать,
сколько за неделю проходит практических занятий, лекций и лабораторных работ.
Пример файла:
Понедельник
Физика (лекц.)
Физика (лаб.)
Алгебра (практ.)
Вторник
Геометрия (лекц.)
Физика (практ.)
Физика (лаб.)
Физкультура (практ.)
...
**Алгоритм решения задачи:**
Поскольку в одной строке может встречаться только одно из трех слов (лекц.,
практ., лаб.), то, если найдена одно из этих слов, нет смысла искать
остальные. Поэтому используется конструкция if-else. Если при более "раннем"
if выполняется условие, то вхождение остальных подстрок в строку не
проверяется.
Вхождение подстроки в строку проверяется с помощью метода find() для строк.
Если подстрока есть, то метод возвращает индекс первого символа подстроки в
строке. Если подстроки нет, то возвращается значение -1.
f = open("lessons.txt")
lec = pract = lab = 0
for s in f:
i = s.find('лекц.')
if i > -1:
lec += 1
else:
i = s.find('практ.')
if i > -1:
pract += 1
else:
i = s.find('лаб.')
if i > -1:
lab += 1
print('Лекций:', lec)
print('Практических:', pract)
print('Лабораторных:', lab)
f.close()
[>]
Линейные алгоритмы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:28
В Python есть простые логические операторы (=, !=, <, >, <=, >=) и сложные
(and, or, not). Все логические операторы, за исключением not, являются
бинарными. Это значит, что слева и справа от них должны стоять выражения. С
помощью логических операторов эти выражения так или иначе сравниваются между
собой.
Результат логических операций имеет булевый тип данных (встроенный class
'bool' в Python). Нужно быть осторожным, сравнивая между собой разные типы
данных, т. к. это не всегда возможно. Например, нельзя сравнивать числа и
строки, но вещественные и целые числа - можно.
В сложных логических выражениях нужно учитывать последовательность операций.
Если нет уверенности, какая операция имеет приоритет, то лучше использовать
скобки.
s1 = input("Введите первую строку: ")
s2 = input("Введите вторую строку: ")
f1 = input("Введите первое число: ")
f2 = input("Введите второе число: ")
f1 = float(f1)
f2 = float(f2)
bool_s = s1 > s2
bool_f = f1 != f2
bool_or = f1 + f2 > 0 or (s1 != '' and s2 != '')
print('-'*10)
print("Первая строка больше второй:", bool_s)
print("Числа не равны друг другу:", bool_f)
print("Первая строка больше второй и числа не равны друг другу:", bool_s and bool_f)
print("Сумма чисел больше нуля ИЛИ ни одна из строк не пуста:", bool_or)
Примерный вывод:
Введите первую строку: ty
Введите вторую строку: kl;
Введите первое число: 6.8
Введите второе число: 8
----------
Первая строка больше второй: True
Числа не равны друг другу: True
Первая строка больше второй и числа не равны друг другу: True
Сумма чисел больше нуля ИЛИ ни одна из строк не пуста: True
Введите первую строку:
Введите вторую строку:
Введите первое число: 7
Введите второе число: -7
----------
Первая строка больше второй: False
Числа не равны друг другу: True
Первая строка больше второй и числа не равны друг другу: False
Сумма чисел больше нуля ИЛИ ни одна из строк не пуста: False
[>]
Условный оператор
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:28
Квадратное уравнение имеет вид ax2 + bx + c = 0. При его решении сначала
вычисляют дискриминант по формуле D = b2 - 4ac. Если D > 0, то квадратное
уравнение имеет два корня; если D = 0, то 1 корень; и если D < 0, то делают
вывод, что корней нет.
Таким образом, программа для нахождения корней квадратного уравнения может
иметь три ветви условного оператора.
Функция float() преобразует переданный ей аргумент в вещественное число.
print("Введите коэффициенты для квадратного уравнения (ax^2 + bx + c = 0):")
a = float(input("a = "))
b = float(input("b = "))
c = float(input("c = "))
discr = b**2 - 4 * a * c;
print("Дискриминант D = %.2f" % discr)
if discr > 0:
import math
x1 = (-b + math.sqrt(discr)) / (2 * a)
x2 = (-b - math.sqrt(discr)) / (2 * a)
print("x1 = %.2f \nx2 = %.2f" % (x1, x2))
elif discr == 0:
x = -b / (2 * a)
print("x = %.2f" % x)
else:
print("Корней нет")
Введите коэффициенты для квадратного уравнения (ax^2 + bx + c = 0):
a = 2
b = 4
c = 2
Дискриминант D = 0.00
x = -1.00
Введите коэффициенты для квадратного уравнения (ax^2 + bx + c = 0):
a = 3.2
b = -7.8
c = 1
Дискриминант D = 48.04
x1 = 2.30
x2 = 0.14
Введите коэффициенты для квадратного уравнения (ax^2 + bx + c = 0):
a = 8
b = 4
c = 2
Дискриминант D = -48.00
Корней нет
[>]
Линейные алгоритмы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:28
Сгенерировать случайные целое и вещественное числа, символ в пределах
диапазонов, которые вводит пользователь.
В языке программирования Python в модуле random есть одноименная функция,
которая генерирует вещественное число от 0 до 1. Если умножить полученное
таким образом случайное число на длину диапазона, то получим число от 0 до
конца длины диапазона. Если далее прибавить минимальную границу диапазона, то
произойдет смещение и будет получено случайное число от минимальной границы до
максимальной.
Отличие получения целого числа от вещественного заключается в том, что в
первом случае, если максимальная граница входит в диапазон, то надо прибавить
1 к длине диапазона и после умножения преобразовать в целое, отбросив дробную
часть.
Случайный символ получают по той же формуле, что и целое. Символы
"преобразуют" к целым, получают случайное число и далее "преобразуют" его в
символ.
from random import random
m1 = int(input())
m2 = int(input())
n = int(random() * (m2-m1+1)) + m1
print(n)
m1 = float(input())
m2 = float(input())
n = random() * (m2-m1) + m1
print(round(n,3))
m1 = ord(input())
m2 = ord(input())
n = int(random() * (m2-m1+1)) + m1
print(chr(n))
Пример выполнения кода:
-10
10
8
0
1.1
0.892
h
t
s
[>]
Списки, кортежи
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:29
Допустим, у нас есть список чисел, из которого надо удалить элементы,
удовлетворяющие определенному условию. Будем удалять из списка, состоящего из
20 чисел в диапазоне от 0 до 100, все элементы, которые больше 35 и меньше 65.
При этом удаляемые числа сохраним в другом списке.
В Python с помощью инструкции del можно удалить элемент списка, указав сам
список и индекс удаляемого элемента.
Алгоритм решения задачи выглядит вроде бы простым: достаточно перебрать
элементы списка и удалить те, которые удовлетворяют условию. Но все не так
просто. При удалении элемента на его место становится следующий, но поскольку
мы переходим к следующему элементу, то пропускаем проверку того, что стал на
место удаленного. Цикл for использовать нельзя, т.к. меняется количество
элементов списка.
Можно использовать цикл while, измеряя на каждой его итерации длину списка,
индекс же увеличивать только в том случае, если удаления элемента не
произошло.
import random
a = []
for i in range(20):
n = round(random.random() * 100) # от 0 до 100 включительно
a.append(n)
print("A =",a)
b = []
i = 0
while i < len(a):
if 35 < a[i] < 65:
b.append(a[i])
del a[i]
else:
i += 1
print("A =",a)
print("B =",b)
Примеры выполнения программы:
A = [80, 35, 30, 98, 35, 4, 94, 51, 22, 22, 52, 97, 67, 90, 9, 1, 87, 78, 100, 29]
A = [80, 35, 30, 98, 35, 4, 94, 22, 22, 97, 67, 90, 9, 1, 87, 78, 100, 29]
B = [51, 52]
A = [68, 88, 64, 39, 13, 99, 6, 35, 50, 76, 47, 82, 76, 87, 44, 86, 75, 46, 8, 32]
A = [68, 88, 13, 99, 6, 35, 76, 82, 76, 87, 86, 75, 8, 32]
B = [64, 39, 50, 47, 44, 46]
[>]
Циклы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:29
В Python v.3 для строк используется кодировка Unicode. (Следует помнить, что в
Python, в отличие от других языков программирования, вообще нет такого типа
как одиночный символ; любой символ это строка, длина которой равна 1.)
Первые 128 символов по таблице Unicode такие же как и в таблице символов
ASCII. Выведим их (начиная с пробела - 32-й символ). Чтобы привести вывод к
табличной форме будем переходить на новую строку после каждого десятого
символа (инструкция if в коде ниже).
Функция chr() возвращает символ из таблицы Unicode, соответствующий
переданному коду-числу.
for i in range(32,128):
print(chr(i), end=' ')
if (i-2) % 10 == 0:
print()
print()
Результат выполнения кода:
! " # $ % & ' ( ) *
+ , - . / 0 1 2 3 4
5 6 7 8 9 : ; < = >
? @ A B C D E F G H
I J K L M N O P Q R
S T U V W X Y Z [ \
] ^ _ ` a b c d e f
g h i j k l m n o p
q r s t u v w x y z
{ | } ~
Но допустим, нам захотелось или потребовалось узнать коды символов русских
букв (кирилицы). Таблица Unicode очень большая и включает почти все алфавиты
Земли. Однако предположим, что кирилица должна быть закодирована где-то в
начале таблицы (ведь русский - один из распространенных языков мира).
Переберем коды символов от 256 до 10000), и если какой-либо код из этого
диапазона соответствует русской букве (прописной или строчной), то выведем на
экран сам код и букву, которой он соответствует.
for i in range(256,10000):
if 'а'<=chr(i)<='я' or 'А'<=chr(i)<='Я':
print(i,'-', chr(i))
Результат выполнения кода:
1040 - А
1041 - Б
1042 - В
1043 - Г
1044 - Д
1045 - Е
1046 - Ж
1047 - З
1048 - И
1049 - Й
1050 - К
1051 - Л
1052 - М
1053 - Н
1054 - О
1055 - П
1056 - Р
1057 - С
1058 - Т
1059 - У
1060 - Ф
1061 - Х
1062 - Ц
1063 - Ч
1064 - Ш
1065 - Щ
1066 - Ъ
1067 - Ы
1068 - Ь
1069 - Э
1070 - Ю
1071 - Я
1072 - а
1073 - б
1074 - в
1075 - г
1076 - д
1077 - е
1078 - ж
1079 - з
1080 - и
1081 - й
1082 - к
1083 - л
1084 - м
1085 - н
1086 - о
1087 - п
1088 - р
1089 - с
1090 - т
1091 - у
1092 - ф
1093 - х
1094 - ц
1095 - ч
1096 - ш
1097 - щ
1098 - ъ
1099 - ы
1100 - ь
1101 - э
1102 - ю
1103 - я
Теперь мы знаем коды русских букв по таблице Unicode. Но вывод получился
какой-то некомпактный. К тому же мы видим, что буквы алфавита идут одна за
другой. Поэтому достаточно сначала узнать только код первой большой буквы
алфавита (прописные символы идут всегда впереди строчных) и код последней
маленькой буквы алфавита. Кроме того, если мы нашли коды символов, то незачем
далее продолжать цикл. Поэтому перепишем программу следующим образом:
first = 0
last = 0
for i in range(255,10000):
if chr(i) == 'А':
first = i
elif chr(i) == 'я':
last = i
break # выход из цикла
j = 0
for i in range(first,last+1):
print(i,'-', chr(i), end=' ')
j += 1
if j%10 == 0: print()
print()
Результат выполнения кода:
1040 - А 1041 - Б 1042 - В 1043 - Г 1044 - Д 1045 - Е 1046 - Ж 1047 - З 1048 - И 1049 - Й
1050 - К 1051 - Л 1052 - М 1053 - Н 1054 - О 1055 - П 1056 - Р 1057 - С 1058 - Т 1059 - У
1060 - Ф 1061 - Х 1062 - Ц 1063 - Ч 1064 - Ш 1065 - Щ 1066 - Ъ 1067 - Ы 1068 - Ь 1069 - Э
1070 - Ю 1071 - Я 1072 - а 1073 - б 1074 - в 1075 - г 1076 - д 1077 - е 1078 - ж 1079 - з
1080 - и 1081 - й 1082 - к 1083 - л 1084 - м 1085 - н 1086 - о 1087 - п 1088 - р 1089 - с
1090 - т 1091 - у 1092 - ф 1093 - х 1094 - ц 1095 - ч 1096 - ш 1097 - щ 1098 - ъ 1099 - ы
1100 - ь 1101 - э 1102 - ю 1103 - я
[>]
Строки
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:29
В стороке заменить подстроку, находящуюся между первой открывающей квадратной
скобкой и соответствующей ей закрывающей.
Сложность данной задачи заключается в том, что между первой открывающей и
соответствующей ей закрывающей скобками, могут быть другие скобки. Например, в
строке 'a[bc[de]f]gh[jkl]' первая открывающая находится после символа 'a', а
соответствующая ей закрывающая - после символа 'f'. Т. е. по условию задачи в
данном примере замене подлежит подстрока '[bc[de]f]'.
Чтобы найти соответствующую закрывающую, в программе ниже вводится счетчик
последующих открывающих скобок, и пока он не будет равен нулю, все закрывающие
скобки соответствующими первой открывающей не считаются.
s = input("Введите исходную строку: ")
p1 = -1 # индекс первой открывающей скобки
i = 0
while i < len(s):
if s[i] == '[':
p1 = i # мы нашли скобку (ее индекс),
break # дальше просматривать строку бессмысленно
i += 1
if p1 == -1: exit() # открывающей скобки нет, выходим из программы
p2 = -1 # индекс закрывающей скобки, соответствующей первой открывающей
count = 0 # счетчик остальных открывающих скобок
i += 1 # будем просматривать строку со следующего символа за тем, на котором остановились ранее
while i < len(s):
if s[i] == '[':
count += 1
elif s[i] == ']': # встретилась закрывающая скобка
if count == 0: # и счетчик равен нулю
p2 = i # значит это закрывающая скобка от первой открывающей
break # нет смысла просматривать дальше
else: # встретилась закрывающая скобка, но счетчик открыващих не равен нулю,
count -= 1 # значит была закрыта какая-то другая, но не первая скобка.
i += 1
if p2 == -1: exit() # закрывающей скобки нет, выходим из программы
s_in = input("Введите подстроку для вставки: ")
s_out = s[p1+1:p2] # скобки не берем
print("Вырезанная подстрока:", s_out)
s = s[:p1] + s_in + s[p2+1:]
print("Новая строка:", s)
Примеры выполнения программы:
Введите исходную строку: [who[is]it] is big master-[kunfu?].
Введите подстроку для вставки: Bob Green
Вырезанная подстрока: who[is]it
Новая строка: Bob Green is big master-[kunfu?].
========
Введите исходную строку: hello [world]
Введите подстроку для вставки: space
Вырезанная подстрока: world
Новая строка: hello space
[>]
Циклы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:30
Вводится целое число. Вывести число, обратное по порядку составляющих его цифр
введенному. Например, введено 3425, надо вывести 5243.
**Алгоритм:**
1. Найдем остаток от деления на 10 исходного числа. Получим последнюю его цифру.
2. Добавим эту цифру к новому числу.
3. Разделим нацело на 10 исходное число. Тем самым избавимся от последней цифры в нем.
4. Снова найдем остаток от деления на 10 того, что осталось от первого числа. Запомним эту цифру.
5. Умножим на 10 второе число. Тем самым увеличим его разрядность до двух и сдвинем первую цифру в разряд десятков.
6. Добавим к полученному второму числу запомненную ранее цифру из первого числа.
7. Будем повторять действия п.3-6 пока исходное число не уменьшится до нуля, т.е. пока не избавимся от всех его разрядов.
n1 = int(input("Введите целое число: "))
n2 = 0
while n1 > 0:
digit = n1 % 10; # находим остаток - последнюю цифру числа
n1 = n1 // 10; # делим нацело - убираем из числа последнюю цифру
n2 = n2 * 10 # увеличиваем разрядность второго числа
n2 = n2 + digit # добавляем очередную цифру
print('"Обратное" ему число:',n2)
Примеры выполнения кода:
Введите целое число: 32809
"Обратное" ему число: 90823
Введите целое число: 78290
"Обратное" ему число: 9287
[>]
Циклы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:30
Написать программу, умеющую выполнять над двумя вещественными числами
арифметические операции (сложение, вычитание, умножение, деление) и
завершающуюся по желанию пользователя.
**Алгоритм:**
1. Запустить бесконечный цикл. Выход из него осуществлять с помощью оператора break, если пользователь вводит определенный символ вместо знака арифметической операции.
2. Если пользователь ввел знак, который не является ни знаком арифметической операции, ни символом-"прерывателем" работы программы, то вывести сообщение о некорректном вводе.
3. Если был введен один из четырех знаков операции, то запросить ввод двух чисел.
4. В зависимости от знака операции выполнить соответствующее арифметическое действие.
5. Если было выбрано деление, то необходимо проверить не является ли нулем второе число. Если это так, то сообщить о невозможности деления.
print("Ноль в качестве знака операции завершит работу программы")
while True:
s = input("Знак (+,-,*,/): ")
if s == '0': break
if s in ('+','-','*','/'):
x = float(input("x="))
y = float(input("y="))
if s == '+':
print("%.2f" % (x+y))
elif s == '-':
print("%.2f" % (x-y))
elif s == '*':
print("%.2f" % (x*y))
elif s == '/':
if y != 0:
print("%.2f" % (x/y))
else:
print("Деление на ноль!")
else:
print("Неверный знак операции!")
Пример выполнения программы:
Ноль в качестве знака операции завершит работу программы
Знак (+,-,*,/): h
Неверный знак операции!
Знак (+,-,*,/): +
x=78.456
y=23.567
102.02
Знак (+,-,*,/): -
x=3.44
y=10.25
-6.81
Знак (+,-,*,/): *
x=0.012
y=-2.15
-0.03
Знак (+,-,*,/): /
x=5
y=0
Деление на ноль!
Знак (+,-,*,/): /
x=-2.3
y=5
-0.46
Знак (+,-,*,/): 0
[>]
Линейные алгоритмы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:30
Уравнение прямой на координатной плоскости имеет следующий вид: y = kx + b.
Если известны координаты двух точек, лежащих на этой прямой, то можно, решая
систему уравнений, определить значения коэффициентов k и b. Таким образом
выводится уравнение конкретной прямой, например, у = 3x - 1.
Решаем систему уравнений:
| y1 = kx1 + b
| y2 = kx2 + b
b = y2 - kx2
y1 = kx1 + y2 - kx2
k = (y1 - y2) / (x1 - x2)
print("Координаты точки A(x1;y1):")
x1 = float(input("\tx1 = "))
y1 = float(input("\ty1 = "))
print("Координаты точки B(x2;y2):")
x2 = float(input("\tx2 = "))
y2 = float(input("\ty2 = "))
print("Уравнение прямой, проходящей через эти точки:")
k = (y1 - y2) / (x1 - x2)
b = y2 - k*x2
print(" y = %.2f*x + %.2f" % (k, b))
Примеры выполнения программы:
Координаты точки A(x1;y1):
x1 = 4.3
y1 = -1.2
Координаты точки B(x2;y2):
x2 = -8.5
y2 = 4
Уравнение прямой, проходящей через эти точки:
y = -0.41*x + 0.55
Координаты точки A(x1;y1):
x1 = -10
y1 = -1
Координаты точки B(x2;y2):
x2 = 10
y2 = -2
Уравнение прямой, проходящей через эти точки:
y = -0.05*x + -1.50
[>]
Линейные алгоритмы
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:31
Вводятся два числа в двоичной системе счисления. Требуется выполнить над ними
побитовые операции И, ИЛИ и исключающего ИЛИ. В конце вывести результат
операций также в двоичном представлении.
Побитовые операции выполняются над разрядами числа. Так если имеем два числа
101 и 100, над которыми выполняется побитовая операция ИЛИ, то получим
двоичное число 101:
101
100
101
В языке программирования Python побитовые операции выполняются над числами,
представленными в десятичной системе счисления. Знаки побитовых операций: | -
ИЛИ, & - И, ^ - искл. ИЛИ.
Функция int() всегда преобразует переданную ей строку в десятичную систему
счисления. Но можно указать, в какой системе счисления содержатся данные в
этой строке (двоичной, восьмеричной, шестнадцатеричной).
Функция bin() наоборот принимает десятичное число и возвращает строку,
являющуюся представлением переданного числа в двоичном виде.
n1 = input("Введите первое двоичное число: ")
n2 = input("Введите второе двоичное число: ")
n1 = int(n1,2)
n2 = int(n2,2)
bit_or = n1 | n2
bit_and = n1 & n2
bit_xor = n1 ^ n2
print("Результат побитового OR: %10s" % bin(bit_or))
print("Результат побитового AND: %10s" % bin(bit_and))
print("Результат побитового XOR: %10s" % bin(bit_xor))
Результат:
Введите первое двоичное число: 10100
Введите второе двоичное число: 10001
Результат побитового OR: 0b10101
Результат побитового AND: 0b10000
Результат побитового XOR: 0b101
[>]
Условный оператор
younglinux.info.14.15
vit01(mira, 1) — All
2015-12-04 04:13:31
Пользователь загадывает число от 1 до 5. Требуется его отгадать, задав как
можно меньше вопросов, и ограничиться только использование оператора ветвления
(обычно подобные задачи решают с помощью цикла).
Чтобы пользователю задать меньше вопросов, надо "разделить" диапазон чисел на
две по возможности равные части и определить, в какой из них находится искомое
число.
print("Загадайте в уме число от 1 до 5", end = ' ')
input("и нажмите Enter")
a = input("Ваше число больше 3-х? (y/n) ")
if a == 'y':
a = input("Ваше число 4? (y/n) ")
if a == 'n':
print("Ваше число 5")
else:
a = input("Ваше число 1? (y/n) ")
if a == 'n':
a = input("Ваше число 2? (y/n) ")
if a == 'n':
print("Ваше число 3")
print("Я угадал!")
Варианты выполнения программы
Загадайте в уме число от 1 до 5 и нажмите Enter
Ваше число больше 3-х? (y/n) n
Ваше число 1? (y/n) y
Я угадал!
Загадайте в уме число от 1 до 5 и нажмите Enter
Ваше число больше 3-х? (y/n) y
Ваше число 4? (y/n)y
Я угадал!