Страницы

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

Показаны сообщения с ярлыком faq. Показать все сообщения
Показаны сообщения с ярлыком faq. Показать все сообщения

воскресенье, 9 февраля 2020 г.

Как поставить програмную точку останова

#отладка #любой_язык #faq


Как поставить програмную точку останова в разных языках средах и IDE. Часто вижу
вопросы не могу отладить программу потому что программа большая, обьёмы большие. Цикл
на 10000000. Такие ситуации можно отловить, например, при возникновении ошибки у меня
i=357489, а не понятно почему возникло исключение, тогда делаем, напимер так:

 for (i=0;i<10000000;i++) {
   if (i==357489) DebugBreak();
   // код
   }


Но DebugBreak - функция windows. Как можно поставить точки останова в других средах?
    


Ответы

Ответ 1



В с с++ есть такие варианты поставить точку останова DebugBreak(); - среда windows __builtin_trap() - среда linux raise(SIGTRAP) - работа с сигналами POSIX posix __EMIT__(0xCC) или __emit__(0xcc); - некоторые среды поддерживают вставку кода __asm { int 3;} или __asm { db 0xCC;} ассемблерная вставка Для других сред с# System.Diagnostics.Debugger.Break(); javascript debugger; java try {throw new TurnOnDebuggerException();}catch(TurnOnDebugger td) {/*Nothing*/ } pascal inline($CC); vbscript visual-basic stop

Неправильное отображение текста в блоке div

#html #css #faq


Нужно чтобы текст, находящийся в блоке div, переносился на новую строку, а не вылезал
за пределы блока (именно переносился - overflow:hidden неподойдет), и вообще, почему
могла возникнуть такая ситуация, что текст не переносится? Ширина определена в css.
    


Ответы

Ответ 1



word-wrap: break-word; ВозникаетКогдаВблокОграниченнойШириныПишетсяТакоеБольшоеСловоКакЭто

Ответ 2



white-space: normal; Случайно нигде не используете code или pre?

вторник, 28 января 2020 г.

Как научится разбиратся с ошибками во время разработки

#java #faq


В моём примере это отчёт об ошибках Tomcat Server.. Хотел узнать если есть какие
либо программы или возможности упростить этот отчёт об ошибках в самом томкат сервере
? Может какнибудь настроить подругому ? Я как новичок замучался читать этот непонятный
для меня отчёт.. вот пример: 


java.lang.NoSuchMethodError: com.sun.jersey.core.spi.component.ProviderServices.
     (Lcom/sun/jersey/core/spi/factory/InjectableProviderFactory;Lcom/sun/jersey/core
    /spi/component/ProviderFactory;Ljava/util/Set;Ljava/util/Set;)V
    at com.sun.jersey.api.client.Client.(Client.java:172)
    at com.sun.jersey.api.client.Client.(Client.java:139)
    at com.sun.jersey.api.client.Client.create(Client.java:416)
    at appl.test.ApplTest.main(ApplTest.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at  org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)



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


Ответы

Ответ 1



Что случилось? Все на самом деле довольно несложно. Давайте просто читать стэктрейс по-порядку. java.lang.NoSuchMethodError - эта ошибка бросается, когда во время выполнения программы JVM не может найти вызываемый метод. Очевидно на момент компиляции класса метод был доступен, иначе класс бы не скомпилировался. Такая ошибка, как правило появляется, если используются несовместимые версии библиотек. Что это за метод? Его сигнатура следует далее: com.sun.jersey.core.spi.component.ProviderServices.(Lcom/sun/jersey/core/spi/factory/InjectableProviderFactory;Lcom/sun/jersey/core /spi/component/ProviderFactory;Ljava/util/Set;Ljava/util/Set;) в более читаемом виде метод - это конструктор: ProviderServices(InjectableProviderFactory arg0, ProviderFactory arg1, Set arg2, Set arg3) и, что немаловажно, стэктрейс сообщает нам, где именно вызов этого конструктора привел к ошибке: at com.sun.jersey.api.client.Client.(Client.java:172) Итого: у нас есть класс com.sun.jersey.api.client.Client, который на 172й строчке своего исходного кода вызывает конструктор ProviderServices из другой библиотеки, который ему не доступен. Как это произошло? Далее, попробуем найти это место. Вы легко можете перейти в IDE к нужному классу через поиск классов или Ctrl+клик на его имени, она подтянет исходники и вы окажетесь на этой злополучной 172й строке. Но у меня такой возможности нет и я иду на http://grepcode.com/ - прекрасный поисковик по коду java-библиотек - и ищу класс com.sun.jersey.api.client.Client. Выясняется, что он входит в библиотеку jersey-client, и grepcode знает добрых три десятка версий этой библиотеки. Пробегаемся по версиям и смотрим на 172ю строчку. Это не так уж и долго. Выясняется, что ни в одной версии на 172й строке этот конструктор не вызывается. Может быть grepcode хранет в своем индексе не все-все версии jersey-client? Отправляемся на http://mvnrepository.com/ - поисковик maven-артефактов и ищем jersey-client. Находим как org.glassfish.jersey.core:jersey-client так и com.sun.jersey:jersey-client. Нас интересует второй вариант, исходя из имени пакета com.sun.jersey. Действительно, выясняется, что версий вида 1.x.x было гораздо больше. Было бы досадно возиться со всем этим богаством. Но, к счастью, я нашел ваш недавний вопрос java.lang.NoSuchMethodError со списком ваших jar-ников. Печально, что вы не удосужились приложить список библиотек к этому вопросу. Да и вообще, не совсем понятно, зачем плодить два почти одинаковых вопроса. Но вернемся к нашему расследованию. Выберем из вашего списка то, что напрямую относится к Jersey: jersey-client-1.0.3.jar jersey-client.jar jersey-common.jar jersey-container-servlet-core.jar jersey-container-servlet.jar jersey-core-1.8.jar jersey-entity-filtering-2.17.jar jersey-guava-2.22.2.jar jersey-media-jaxb.jar jersey-media-json-jackson-2.17.jar jersey-server.jar Ага! Есть jersey-client-1.0.3.jar и неизвестный JAR jersey-client.jar (из чего я делаю вывод, что вы собирали библиотеки в кучу руками, а не каким-либо менеджером зависимостей). Что ж, попробуем посмотреть на jersey-client-1.0.3.jar. В нем есть класс com.sun.jersey.api.client.Client, и в его коде на 172й строчке наш конструктор: ProviderServices providerServices = new ProviderServices( injectableFactory, this.componentProviderFactory, config.getClasses(), config.getSingletons()); Еще раз взглянем на список библиотек. Не может не смутить несоответствие версий jersey-core-1.8.jar и jersey-client-1.0.3.jar. Проверим на mvnrepository зависимости библиотеки jersey-client. Должна быть jersey-core версии 1.0.3! На всякий случай посмотрим на grepcode исходники класса ProviderServices из jersey-core-1.8.jar - доступны только два конструктора: ProviderServices(ProviderFactory componentProviderFactory, Set> providers, Set providerInstances) и ProviderServices(Class constraintToType, ProviderFactory componentProviderFactory, Set> providers, Set providerInstances) , а нужного нам нет. Но он был единственным доступным конструктором в jersey-core-1.0.3.jar. Нестыковка действительно между версиями этих библиотек. Поздравляю, это ваш первый JAR Hell. Что делать дальше? Разобраться, какую версию jersey вы хотите использовать 1.0.3 или 1.8. Привести версии зависимостей в порядок, выкинуть лишние. Задуматься об использовании средств управления зависимостями (maven/ivy/gradle), чтобы никогда больше не заниматься раскладыванием jar-ников в /lib руками. PS. Забудьте про "программы или возможности упростить этот отчёт об ошибках". Стэктрейс - это обычно все, что вам нужно при отладке исключений.

пятница, 3 января 2020 г.

Средства и методы нахождения ошибок в коде их исправления. Сборник

#отладка #любой_язык #обработка_ошибок #faq


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

В вопросы, перечисленные ниже в списке МОЖНО и нужно добавлять еще ответы!

Метки пишем в алфавитном порядке. 



Люди смогут использовать его для выявления схожих проблем в различных технологиях. 

Также удобно использовать в качестве списка эталонных вопросов, на которые можно
сослаться при мелких несущественных ошибках и, возможно, 
закрывать вопросы как дубликат, если они о таких вещах как:


"Что не так в коде?"
"Где у меня ошибка?"
"Почему программа не работает?"
и подобные

    


Ответы

Ответ 1



Общие практики и советы Какие есть способы предупреждения ошибок, их нахождения и устранения? Список по языкам c# Как и какими средствами находить ошибки в коде на C#? java Как и какими средствами находить ошибки в коде Java? javascript Как и какими средствами находить ошибки в Javascript коде? php Как и какими средствами находить ошибки в PHP коде? css Что делать, если не работает css-класс

вторник, 31 декабря 2019 г.

Доступ к серверу из интернета

#ubuntu #роутер #faq


На моем компьютере стоит ubuntu 14 с LAMP сервером, комп выходит в интернет через
роутер при подключении WiFi, у меня есть еще и второй комп с виндой, он также выходит
в интернет через тот самый роутер, но уже подключен к роутеру через шнурок. Когда я
на втором компе обращаюсь к своему серверу, все работает, ftp, ssh и phpmyadmin, в
общем, все гут.

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

Как такое реализовать?
    


Ответы

Ответ 1



нужен внешний ip-адрес (ipv4, разумеется), который может предоставить вам ваш интернет-провайдер. бесплатно или за деньги. нужно настроить ваш маршрутизатор, чтобы он внешние обращения на нужные вам порты (или вообще все внешние обращения) переадресовывал на тот из ваших компьютеров, который будет эти обращения обрабатывать. смотрите инструкцию по эксплуатации вашего маршрутизатора. как правило, никаких изменений в конфигурации компьютеров не требуется. другие вопросы на ru.so со схожей тематикой: Как прокинуть IP-адрес через роутер? Доступ к серверу по внешнему IP через роутер Настройка доступа к сайту извне Поднять сервер дома в денвере через роутер D-link dir400 Настройка роутера TrendNet Проброс портов на роутере TP-Link 940N Как настроить доступ к web-серверу в локальной сети? Как присвоить ститичный ip адрес компьютеру в wifi? Настройка сервера на домашнем ПК Как узнать к какому компьютеру подключится клиент? Доступ из интернета к сайту на домашнем компьютере Подключение к веб-серверу из глобальной сети

среда, 25 декабря 2019 г.

диагностика с помощью telnet

#сеть #tcp #faq #telnet


как при помощи программы telnet проверить, доступен ли указанный tcp-порт на указанной
машине, и слушает ли этот порт какая-нибудь программа?



приветствуются канонические ответы с примерами для разных операционных систем и реализаций
программы telnet.
    


Ответы

Ответ 1



unix-подобные операционные системы вероятно, чаще всего здесь можно встретить bsd- и gnu-реализации: netkit-telnet и inetutils-telnet. для указанной диагностики разница между ними несущественна. пример неудачного подключения к порту 12345 на каком-нибудь из серверов, в ip-адрес которого резолвится имя github.com: $ telnet github.com 12345 Trying 192.30.253.113... прервать неудачную попытку можно с помощью ctrl+c пример удачного подключения к тому же серверу на порт 22: $ telnet 192.30.253.113 22 Trying 192.30.253.113... Connected to 192.30.253.113. Escape character is '^]'. SSH-2.0-libssh-0.7.0 последняя строчка здесь — это уже информация от программы, слушающей 22 порт на опрашиваемом сервере. если соединение сразу же не было разорвано слушающей программой (это зависит от её реализации и настроек), то прервать telnet-сессию можно, нажав предложенную программой комбинацию ctrl+], а затем клавишу enter, после чего появится приглашение программы telnet: telnet> в котором можно ввести команду q (или полностью — quit) и нажать клавишу enter. Microsoft Windows Действия практически идентичны варианту для unix-подобных ОС. В Windows имеется встроенный telnet-клиент, но он может быть отключен. Чтобы его включить нужно выполнить шаги, описанные на сайте Microsoft. Когда всё готово, запустить telnet-клиент можно так: Пуск - Выполнить - telnet - ОК В открывшемся консольном окне будут видны следующие строки: Welcome to Microsoft Telnet Client Escape Character is 'CTRL+]' Microsoft Telnet> Чтобы попытаться открыть тот или иной адрес и порт нужно написать букву o, а затем адрес и порт. Например: Microsoft Telnet> o github.com 12345

понедельник, 23 декабря 2019 г.

Как пользоваться справкой VisualStudio

#visual_studio #faq


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

Здесь постараемся раскрыть тонкости использования справочной системы студии.
    


Ответы

Ответ 1



Т.к. читать сегодня тоже не очень модно, начну с главного, как быстро получить интересующую информацию. В десктопных приложениях, исторически сложилось, что клавиша F1 служит для вызова справки. VisualStudio также использует эту клавишу для работы со справкой, но в более широком смысле. Если вас интересует справка по какому то классу, методу и или функции поставляемым в библиотеках Microsoft, достаточно поставить текстовый курсор (выделять полностью не обязательно) в редакторе кода на имя интересующего элемента и нажать F1. VisualStudio автоматически создаст поисковый запрос к справочной системе и откроет соответствующий раздел справки, если такой имеется в наличии. Microsoft предоставляет два варианта справки доступной напрямую из IDE: online и offline. В настоящее время, визуальное представление Online и Offline версий практически не отличается. Слева навигация по дереву разделов документации, справа - навигация по разделам статьи. Качество документации: Сначала о хорошем: в той или иной степени документировано все. много рабочих примеров кода, некоторые из которых довольно часто используются практически без изменений и дополнений в рабочих проектах. есть пошаговые инструкции для выполнения типовых задач, таких как, например, чтение и запись файлов, создание простых оконных приложений, создание простых сервисов и т.д. Ну и о плохом: если есть возможность, то лучше читать документацию на оригинальном английском, т.к. с некоторых пор MSDN использует систему автоматического перевода для локализации, что негативно сказывается на качестве локализованных текстов. присутствуют некоторые неточности и неоднозначности в оригинальной версии. отдельные разделы документированы весьма условно (камень в огород WinAPI и еще некоторых). Но не смотря на все недостатки не очень хорошая документация однозначно лучше чем ее полное отсутствие. Offline вариант можно установить вместе с VisualStudio или добавить позже. Важная особенность Offline-справки - ее можно загружать частями, по мере необходимости. Установка локального содержимого и управление им. Сразу хочу предупредить, что полный объем справочной информации превышает несколько десятков гигабайт и это только для .NET, так что это не быстрый процесс, но в результате вы сможете искать информацию независимо от наличия выхода в сеть.

суббота, 21 декабря 2019 г.

Процесс не может получить доступ к файлу (Исключение HRESULT: 0x80070020)

#iis #faq #iis_express


При попытке запустить сайт в IIS появляется окно с ошибкой: 


  Процесс не может получить доступ к файлу, так как этот файл занят
  другим процессом. (Исключение из HRESULT: 0x80070020)




Сайт развернут на 80 порту. Ранее такой ошибки не наблюдал. Около недели назад появлялась
эта ошибка, но перезапуск Visual Studio решил проблему и больше ошибка не появлялась.
Сейчас ошибка появилась вновь, но ни перезапуск  Visual Studio, ни перезагрузка компьютера
не решили проблему. Кто сталкивался с данной проблемой, подскажите, как решить? Нашел
пару статей по похожим ошибкам, но везде не то. 



Нашел вот эту статью: Ошибка 0x80070020 при использовании сайта Центра обновления
Windows или Центра обновления Майкрософт для установки обновлений

Обновил систему, перезагрузил компьютер, очистил мусор, скопившийся в системе, перезагрузил
компьютер - не решило проблемы. Да, понимаю, что ошибка в IIS, но на всякий случай
проверил. Антивируса у меня на компьютере нет.
    


Ответы

Ответ 1



Решение проблемы оказалось следующим: Запустить командную строку и написать в ней команду: netstat -aon | find ":80" в результате, в окне командной строки будет видно следующее: Необходимо найти процесс, который прослушивает необходимый нас порт. Здесь мы видим, что процесс 3544 прослушивает наш занятый 80 порт. Открываем диспетчер задач и ищем там наш процесс по идентификатору(ИД): Как видим - это программа Skype. Открываем Skype, и выполняем следующие действия: Инструменты -> Настройки... -> Дополнительно -> Соединение В появившемся окне будет несколько настроек, нас интересует «Для дополнительных входящих соединений следует использовать порты 80 и 443», поэтому убираем активную галочку: Для дополнительных входящих соединений следует использовать порты 80 и 443 Сохраняем изменения. Перезапускаем Skype, заходим в Диспетчер служб IIS и запускаем сайт, который во время попытки запуска валился с ошибкой. Подсказка для решения была найдена на MSDN: Ошибка 0x80070020 при запуске веб-сайта в IIS 7.0

пятница, 20 декабря 2019 г.

Автозапуск программы при старте сервера

#linux #сервер #faq #автозапуск


Как автоматически запускать программу при старте сервера? Без входа пользователя.
    


Ответы

Ответ 1



Для начала, следует выяснить, какая из систем инициализации используется в вашем дистрибутиве. Это могут быть SysVInit, Systemd, Upstart, daemontools/runit/s6 или что-то более экзотическое. Если дистрибутив современный и популярный - в нём, скорее всего, будет использоваться Systemd. Если дистрибутив древний - то там будет SysVInit. Ну а между этими крайностями может происходить всё что угодно. Далее, следует искать способ сделать искомое уже в рамках вашей системы инициализации. Ниже я привожу примерные способы добиться желаемого в разных системах инициализации - но лучше смотрите документацию. Systemd, признак наличия - директория /etc/systemd и программа systemctl Для автозапуска программы на системе с systemd нужно создать unit-файл и положить его в директорию /etc/systemd/system/ Имя файла будет идентификатором службы. Расширение у файла должно быть .service Минимальный файл: [Service] ExecStart=/path/to/program WorkingDirectory=... User=... Group=... [Unit] After=network.target [Install] WantedBy=multi-user.target Здесь строка After=network.target означает, что службу нужно загружать только после того как сетевые подключения начнут работать. А WantedBy=multi-user.target означает, что служба должна загружаться при обычном старте сервера. Также тут предполагается, что программа после запуска просто начнёт работать, и будет работать пока пока не получит сигнал SIGTERM. Если программа должна поработать и перестать - надо ещё дописать в раздел [Service] настройку Type=oneshot. Ну а если программа - классический демон, то её надо прописывать Type=forking и настройки ExecStop, PIDFile За дополнительными настройками можно заглянуть в man systemd.unit, man systemd.service и man systemd.exec Теперь осталось включить службу: systemctl enable имя_службы и запустить её: systemctl start имя_службы. SysVInit, признак наличия - директории /etc/rc.d и /etc/init.d (последняя также может находиться по пути /etc/rc.d/init.d) и обязательное отсутствие признаков других систем инициализации Другие системы инициализации могут частично поддерживать sysvinit-скрипты, но нет смысла составлять новый sysvinit-скрипт если можно составить что-то другое. Тут проще всего добавить запуск вашей программы в файл rc.local: #!/bin/bash /path/to/program & exit 0 Но если её при этом нужно ещё и останавливать - придётся писать полноценный скрипт в директории /etc/init.d: #!/bin/bash case "$1" in start) команды для запуска демона ;; stop) команды для остановки демона ;; esac Также могут понадобиться команды status, restart, reload и пр. Посмотрите как написаны остальные скрипты в папке /etc/init.d Если запускаемая программа не является демоном - придётся также найти и использовать обертку-демонизатор, вроде программы start-stop-daemon Не забудьте сделать скрипт исполняемым (chmod +x /etc/init.d/имя) После создания нового скрипта в папке init.d нужно его включить, сделав жесткие ссылки в папке /etc/rc.d. Обычно они делаются вот так: update-rc.d имя defaults update-rc.d имя enable Также возможен вариант с chkconfig, но тут придётся добавить в скрипт комментарий специального вида: # chkconfig: - 98 02 chkconfig --add имя Возможен и вариант что у вас настолько старый дистрибутив, что нужные ссылки придётся делать вручную. Это уже выходит за рамки ответа, гуглите структуру rc.d и уровни запуска Upstart, признаки - директория /etc/init Тут нужно составить конфиг и положить его в /etc/init exec /path/to/program start on runlevel [23] runit, признаки - директории /etc/sv, /etc/runit и /etc/service (или /var/service) Нужно создать каталог /etc/sv/имя_службы, а в нём - файл исполняемый run: #!/bin/bash exec /path/to/program Теперь этот сервис можно включить командой ln -s /etc/sv/имя_службы /etc/service/имя_службы

понедельник, 16 декабря 2019 г.

Ввод знака ударения и других интересных символов в Ubuntu

#ubuntu #faq #xcompose


Как в Ubuntu наименее трудозатратным способом вводить символы, которых нет на клавиатуре?

Можно назначить клавишу Compose, онa же Multi_key.
Она дает всякие тире —,–, кавычки-елочки «», знак ударения ý и другие классные символы ☭,☺!
Например, Multi_key - - - печатает "—".
Но эти символы не всегда дружат с русской клавиатурой.   

Файл /usr/share/X11/locale/en_US.UTF-8/Compose содержит определения для клавиши Compose.
Гугл говорит, что можно добавить свои определения в ~/.XCompose. Команда xev | fgrep
"keysym" показывает названия клавиш в системе.

И вот я написала много интересных определений в ~/.XCompose, но они не заработали
даже после перезагрузки.
Тогда я скопировала их в /usr/share/X11/locale/en_US.UTF-8/Compose, но и это не помогло.  

И вот что получается: то, что было определено для русской раскладки в /usr/share/X11/locale/en_US.UTF-8/Compose,
например

    : "§"   section # SECTION SIGN  


работает, то есть Compose-п-а печатает "§",
а те определения, что я добавила, типа

   : "«" guillemotleft # левая кавычка-ёлочка    
     : "а́" # CYRILLIC SMALL LETTER a WITH COMBINING
ACUTE ACCENT


не работают!
(Почему-то в Firefoxе знак ударения сдвинулся вправо, но на моем компьютере он на
месте).  


В данный момент меня беспокоят следующие символы:


Кавычки-елочки.
Multi_key < < дает нам "«", а Multi_key > > — "»".
С русской клавиатуры ввести это невозможно, потому что нет знаков "<" и ">".
То есть чтобы ввести кавычки, которые используются в русском, нужно переключиться
на английскую раскладку, нажать на клавиши, а потом переключится обратно.
Ударение в русской раскладке получается совсем криво. С Compose не работает, но можно
использовать Unicode:  


переключиться на английский;
после буквы, на которую нужно поставить ударение, нажать одновременно Ctrl-Shift-u.
Появится подчеркнутая буква u.
ввести "301". Это Unicode знака dead_acute — ударения, которое не сдвигает каретку.
Ввод. Появляется ударение над буквой.
поменять язык обратно на русский.  



Что я делаю не так с Compose?
Есть ли еще способы добавить символы? Мне нужно, чтобы легко запоминалось и быстро
нажималось.
    


Ответы

Ответ 1



попробуйте добавить в конец файла ~/.profile строку: export GTK_IM_MODULE="xim" и перзапустите сеанс. после этого в программах, использующих gtk (например, firefox), должно заработать то, что написано в вашем ~/.XCompose. обновление хотя, вероятно, более «правильно-дистрибутивный» метод — это запустить программу im-config (если у неё есть возможность, она «нарисует» gui-окно, иначе — текстовое меню), где дойти до выбора вариантов конфигурации input methods и выбрать xim (этот пункт ближе к концу). после чего, опять-таки, надо перезапустить сеанс.

Ответ 2



Этот ответ содержит обновленную информацию для Ubuntu 18.04 и упорядоченные инструкции (на случай. что мне придется делать это еще раз, и я опять все забуду). Определяем клавишу Compose. Прежде всего, нам надо проверить, определена ли клавиша Compose, и если да. то где. Нажимаем на значок переключения языка, затем Показать раскладку клавиатуры. Если клавиши Compose нету, то его можно установить с помощью пакета gnome tweaks. (См.) (Раньше это делалось через Параметры → Клавиатура). Устанавливаем: sudo apt install gnome-tweaks или sudo apt install gnome-tweak-tool Либо в Менеджер приложений Ubuntu устанавливаем Доп. настройки gnome (можно написать в поисковой строке gnome tweaks и он найдет). Запускаем. Открываем Клавиатура и мышь Нажимаем на кнопку Композиционная клавиша и выбираем, на какую клавишу ее назначить. Ставим английскую раскладку и проверяем, что клавиша Compose работает. Например, Compose - - - должно напечатать длинное тире: —. Создаем свои комбинации клавиш. Свои комбинации определяются в файле ~/.XCompose. Как сообщает нам man XCompose, мы можем включать в него другие файлы определений командой include. В общем случае лучше всего включить системный файл своей локали: include "%L" Но в нашем случае /usr/share/X11/locale/ru_RU.UTF-8/Compose содержит только одну строчку include "/usr/share/X11/locale/en_US.UTF-8/Compose" Примечание. Все это сделано плохо. Английский файл содержит определения для кириллических гласных с ударением, вроде : "А́" но пользоваться ими в русской раскладке невозможно, потому что клавиша в русской раскладке превращается в , она же "э". (В Гугле сказали, что из более 50-ти кириллических языков апостроф существует только в украинском и белорусском.) Там также есть определение для печати символа "№" с помощью , но в русской раскладке он и так есть. Хорошо бы сделать минимальный /usr/share/X11/locale/ru_RU.UTF-8/Compose с ударениями над гласными и со всеми русскими кавычками и распространять его вместе с Ubuntu, но я не знаю, как. Теперь давайте добавим в ~/.XCompose свои определения. Для этого нам нужно узнать названия клавиш в раскладке. Запускаем команду xev | fgrep "keysym". Открывается окошечко. Печатаем туда символы, а в терминале нам показывают их названия. Например, мы хотим добавить в русскую раскладку квадратные скобки, чтоб было удобнее редактировать свои тексты на stackoverflow. Нажимаем на клавишу [ в окошке xev. В терминале, откуда был запущен xev, нам сообщают: keysym 0x5b, bracketleft. То есть эта клавиша называется bracketleft и заодно мы узнали ее юникод U005B. Выставляем русскую раскладку, печатаем то же самое. Теперь клавиша называется Cyrillic_ha. Добавляем в ~/.XCompose строчку : "[" U005B # левая квадратная скобка Таким же образом добавляем : "]" U005D # правая квадратная скобка : "`" U0027 # апостр́оф (на Multi_key+Ё+!) Мы можем также скопировать готовый .XCompose, например, отсюда или отсюда. Они содержат гигантское количество определений комбинаций клавиш. После изменения .XCompose перезапустите сеанс, чтобы увидеть результаты. Добавлять в ~/.profile строку export GTK_IM_MODULE="xim" больше не нужно. Еще полезность: В man Compose написано, что вместо файла ~/.XCompose можно использовать любой другой файл, и сообщить о нем системе с помощью переменной $XCOMPOSEFILE. Как это может пригодиться? Например, у одного пользователя есть классный ~/.XCompose. Другой пользователь может использовать его, если вставит в свой ~/.profile строку export XCOMPOSEFILE="$HOME/..//.XCompose" Так у вас есть только одна копия .XCompose, которую используют несколько пользователей. И про сдвиг ударения. Оказывается, в нем виноват шрифт Verdana, см. Хабр.

четверг, 12 декабря 2019 г.

Регулярные выражения никнеймов разных сервисов

#регулярные_выражения #faq


Давайте в этом вопросе составим список регулярных выражений никнеймов разных соц.
сетей и сервисов.

Это необходимо при добавлении разных ссылок на аккаунты в профиле пользователя и
не только.
    


Ответы

Ответ 1



FaceBook Для фейсбука выражение будет такое (если я правильно разобрался и ник это facebook.com/[nickname]. Выражение реализует правила: - нельзя использовать только цифры - можно A-Z 0-9 и точку - длина не менее 5 символов не более 50 - нельзя точку в начале или конце, две точки подряд PCRE: ^(?!.*\.\.)(?!\.)(?!.*\.$)(?!\d+$)[a-zA-Z0-9.]{5,50}$ Instagram - можно A-Z 0-9 _ или точка - не более 30 символов ^[a-zA-Z0-9_.]{1,30}$ Skype - можно A-Z 0-9 _ , . - - начинается с латинского символа - длина от 6 до 32 символов ^[a-zA-Z][a-zA-Z0-9_.,-]{5,31}$

Ответ 2



ICQ ^\d{3,20}$ Кошельки WebMoney ^(Z|R|B|U|E|G|X)\d{12}$

вторник, 10 декабря 2019 г.

Почему ставить программы в обход пакетного менеджера linux плохо?

#linux #windows #администрирование #faq #deb


Не холивара ради, но накоплений точек зрения для.

Замучился отвечать одно и тоже в одинаковых темах "я запустил .run и всё сломалось",
"я распаковал tar и компьютер взорвался", поэтому создал вопрос, чтобы в дальнейшем
ссылаться сюда.
    


Ответы

Ответ 1



Чем плохо: Плохое обновление. В классическом варианте, менеджер пакетов сам проверяет наличие обновления, сам выкачивает и сам ставит. Руками поставленный бинарник или не будет обновляться вообще или будет обновляться тем способом, который выбрал разработчик. В итоге получаем кучу кастомных обновлялок, которые "висят в трее" и непонятно что делают. Плохое сопровождение. Вытекает из первого пункта. Раз непонятно как программа обновляется (не факт, что через скрипт, может и через бинарник), то непонятно куда, что, как, когда, зачем она ставит. При передаче системы в другие руки - нужно больше документации и объяснений кто с кем дружит, а кого в сеть не пускаем. Зоопарк версий. В linux библиотеки общие для всей системы. QT, mp3, java ставятся один раз и используются всеми, кому надо. В случае с ручной установкой, в систему (/opt тоже система) ставятся компоненты мутных версий, которые используются только этой программой. Проблемы начинаются, когда надо закрыть уязвимость, а что делать непонятно, потому что неизвестны (или надо сильно копать) версии и что сломается, если заменить один компонент, но оставить другой. Этим как раз и должен заниматься менеджер пакетов. Проблемы с совместимостью. В системе может быть старая версия ядра или libc и тогда программа будет вести себя весьма странно, если вообще заведётся. Обновление libc руками может уронить вообще всё остальное. Большие затраты по силам и времени. На большом количестве софта установленного руками, времени на поддержание версий в актуальном состоянии тратится просто вагон, а при наличии не одной машины - увеличивается до неприличных цифр. Проблемы с удалением. При удалении проги надо удалить все бинарники, библиотеки, кэши и конфиги, пройтись по всем /var/, /lib/ и /usr/. Самое главное - не удалить ничего лишнего, иначе см. выше про libc. На это тоже уходит порядочное количество времени. Чем хорошо: Свежие версии от разрабов. Не надо дожидаться слоупоков от дистрибутива, которые будут тестировать никому ненужную совместимость с остальными компонентами. Не надо привыкать к другой философии. На винде работало - чем тут хуже? Критические обновления безопасности ставят автоматом только трусы. Меня это не коснётся, мой проект хакерам не интересен. Можно почувствовать себя Ъ-][@k3r0m делая ./configure && make && make install и превращая Ubuntu\CentOS\SuSe в Slackware. Можно прочувствовать всю боль мейнтейнеров постоянно борясь с вылазиющими конфликтами компонентов. Дополнение 1. Отдельно стоит упомянуть виртуалки и контейнеры. Хостовая система будет изолирована, внутрь их можно делать сколь угодно ужасный деплой (но помнить, что плохой код\конфиг в любом уровне абстракции остаётся плохим), если придерживаться концепции атомарного обновления: хочешь обновить что-то - обнови в новом окружении всё что надо, замени старое, а старое грохни. FAQ. Q: А я делаю make install на локалхосте 5 лет и брат пока что жив. A: Молодец, возьми пирожок с полки. deb\rpm\etc придумали не потому, что дело было вечером и делать было нечего. Древние задолбались ставить всё руками и решили ввести абстракцию для облегчения жизни себе и другим. Значит у тебя не те объёмы, чтобы понять какой подарок сделала концепция пакетных менеджеров для администрирования систем. Q: Этим вашим deb и dnf я не могу поставить 2-3-5 версий библиотек в одну систему. Я буду продолжать использовать tar xvf. A: Никто не Вуди Аллен^W^W идеален. Или иди в ногу со всеми и пиши на том, на чём сидит большинство или используй контейнеры\виртуалки. Как вариант - найди дистрибутив, в котором пакетный менеджер позволяет это делать. Q: Тут нет самой свежей версии $AWESOME_SOFTWARE. Где там мой wget? A: Пакетный менеджер $DISTRONAME не серебряная пуля, но он покрывает ~90% потребностей обычного пользователя или админа. Нужна свежая версия? Сами разрабы часто держат свою репу под популярные дистрибутивы. И там можно даже dev-ветку из гита попробовать. Чешутся руки СОБИРАТЬ@КОМПИЛЯТЬ - запакеть то, что собрал и после этого устанавливай. Так, менеджер пакетов будет знать что делать и куда слать алярмы. Q: А что на счёт pip\gem\npm\? A: Спорно. С одной стороны - это менеджер пакетов, с другой - про его действия не сообщается "главному" менеджеру. Но если нет нужных компонентов у родителя, а они нужны позарез, то лучше хоть что-то, чем tar. Ну и если не использовать суперпользователя, то тот же питон ставится в домашний каталог не ломая текущие версии. Более того, оф. документация НЕ рекомендует ставить пакеты через pip в систему.

четверг, 5 декабря 2019 г.

Что делать, если не работает CSS-класс?

#css #отладка #faq


Я пишу css-правило

.nav-users {
  color: red;
}


но на странице нечего не меняется: цвет остаётся серым.
    


Ответы

Ответ 1



Браузеры предоставляют отличные инструменты для отладки css. Не надо ждать, пока кто-то угадает, в чём проблема. Надо просто взять и посмотреть, что же происходит. Покажу на примере Хрома. Сначала надо обновить страницу со сбросом кэша. В большинстве браузеров это Ctrl + F5. Если не помогло, то по исследуем по следующему плану: Щёлкнуть проблемный элемент правой кнопкой и выбрать пункт Исследовать элемент: Появится панель отладки, на которой на вкладке Elements выделен кликнутый элемент. Если нужен другой, можно перейти к нему. Затем следует обратить внимание на вкладки Styles и Computed: Если в element.style есть интересующее свойство, то если в html-разметке прописан стиль в атрибуте style, удаляем оттуда лишнее если нет, кончаем читать этот ответ и переходим к отладке скриптов, которые этот стиль выставляют (либо перебиваем !importantом, что делать крайне не рекомендуется) На вкладке Styles надо найти свой селектор. Если его там нет, то проблема в опечатке или подключении css-файла. Как видим, свойство зачёркнуто, но восклицательного знака (говорящего о неверном значении) нет. Это означает, что есть другое правило, имеющее больший приоритет. В простых случаях достаточно посмотреть на вышестоящие правила и понять, что там надо. В более запутанных стоит заглянуть на вкладку Computed и посмотреть, какие вообще значения влияют: Здесь видно, что селектор .so-header .navigation .-link перебивает наше правило. Кликом по стрелочке можно перейти к самому правилу, но нам это сейчас не нужно. Теперь мы знаем, что приоритет используемого правила 0 id, 3 класса, 0 тегов. Если мы уверены, что наше правило идёт после переопределяемого, то нам достаточно той же силы. Если нет, то надо побольше. Самый простой способ - это сделать так: .nav-users.nav-users.nav-users.nav-users { color: red; } Но руководствуясь здравым смыслом, стоит всё-таки сделать так: .so-header .navigation .nav-users { color: red; } или так: .so-header .navigation .-link.nav-users { color: red; } Должно заработать: Если всё равно не работает. На шаге 6 стоило заглянуть в переопределяющий стиль - возможно, в нём есть !important: В таком случаем нам тоже придётся его использовать: .so-header .navigation .-link.nav-users { color: red !important; }

четверг, 28 ноября 2019 г.

Как починить android.os.NetworkOnMainThreadException

#java #android #faq


Здравствуйте.  Пытаюсь сделать POST запрос на ajax страницу с помощью HttpURLConnection.
Сильно не пинайте, я только сегодня начал практиковать Java и Android. Тестю на API
22 (Intel x86). В обычном хроме та же страница нормально загружается. Logcat:

03-24 10:23:26.842 4679-4679/? I/art: Late-enabling -Xcheck:jni
03-24 10:23:27.402 4679-4679/com.gobonus.gobonus D/AndroidRuntime: Shutting down VM
03-24 10:23:27.427 4679-4679/com.gobonus.gobonus E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.gobonus.gobonus, PID: 4679    
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.gobonus.gobonus/com.gobonus.gobonus.WelcomeActivity}:
android.os.NetworkOnMainThreadException

    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2358)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420)
    at android.app.ActivityThread.access$900(ActivityThread.java:154)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5294)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)
    at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
    at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
    at libcore.io.IoBridge.connect(IoBridge.java:122)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456)
    at java.net.Socket.connect(Socket.java:882)
    at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174)
    at com.android.okhttp.Connection.connect(Connection.java:152)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:217)
    at com.gobonus.gobonus.Request.(Request.java:65)
    at com.gobonus.gobonus.WelcomeActivity.onCreate(WelcomeActivity.java:15)
    at android.app.Activity.performCreate(Activity.java:5990)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2311)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420) 
    at android.app.ActivityThread.access$900(ActivityThread.java:154) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5294) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
    at 


com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 
    03-24 10:23:27.498 4679-4690/com.gobonus.gobonus W/art: Suspending all threads
took: 26.757ms
Request.java:


package com.gobonus.gobonus;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;


public class Request {

    private final String USER_AGENT = "GoBonus Android Client 1.0";
    private final String API_SERVER = "http://192.168.2.21";

    public String Content;


    public Request (String session_token, String uri, String params) {

        String urlParameters  = "session_token="+session_token+"&"+params; // url params
        byte[] postData       = new byte[0];

        System.setProperty("http.agent", USER_AGENT); // user agent truck

        // api = android.os.Build.VERSION_CODES.KITKAT) {
            postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
        }
        else
            postData = urlParameters.getBytes(Charset.forName("UTF-8"));

        int    postDataLength = postData.length;
        URL    url            = null;

        try {
            url = new URL( API_SERVER + uri);
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
        HttpURLConnection conn= null;
        try {
            conn = (HttpURLConnection) url.openConnection();
        } catch (IOException e) {
            e.printStackTrace();
        }
        conn.setDoOutput( true );
        conn.setInstanceFollowRedirects( false );
        try {
            conn.setRequestMethod("POST");
        } catch (ProtocolException e) {
            e.printStackTrace();
        }
        conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty( "charset", "utf-8");
        conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));

        conn.setUseCaches( false );
        try {
            DataOutputStream wr = new DataOutputStream( conn.getOutputStream());
            wr.write( postData );
            conn.connect();
            Content = ConvertData(conn);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    protected String ConvertData (HttpURLConnection url) throws IOException {
        // local variables
        String line;
        StringBuffer text = new StringBuffer();

        InputStreamReader in = new InputStreamReader((InputStream) url.getContent());
        BufferedReader buff = new BufferedReader(in);
        do {
            line = buff.readLine();
            text.append(line + "\n");
        } while (line != null);
        return text.toString();
    }

}



WelcomeActivity.java


package com.gobonus.gobonus;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

public class WelcomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView WebTest = (TextView) findViewById(R.id.webTest);
        WebTest.setText(new Request("123", "/ajax", "foo=bar").Content);
        setContentView(R.layout.activity_welcome);
    }

    public void LoginGo(View view) {
        Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class);
        startActivity(intent);
    }
}


Манифест




    
    
    
    
    

    
        
            
                

                
            
        
        
            
        
    




Layout


    

        


Ответы

Ответ 1



Эксепшн NetworkOnMainThreadException говорит о том, что вы используете сетевые запросы в главном потоке, используйте AsyncTask для запуска запроса в отдельном от UI потока. И Метод setContentView, нужно вызывать до того, как будете обращаться к элементам разметки. @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); TextView WebTest = (TextView) findViewById(R.id.webTest); WebTest.setText(new Request("123", "/ajax", "foo=bar").Content); } UPD Пример запроса через AsyncTask. Метод doInBackground выполняется в отдельном от UI потоке, после того, как вы выполнили запрос и получили ответ, ваши данные упадут в onPostExecute, который выполняется уже в потоке UI. Не обращайтесь к потоку UI в doInBackground, вызовет Exception. public class WelcomeActivity extends AppCompatActivity { TextView WebTest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_welcome); WebTest = (TextView) findViewById(R.id.webTest); new AsyncRequest().execute("123", "/ajax", "foo=bar"); } class AsyncRequest extends AsyncTask{ @Override protected String doInBackground(String... arg) { return new Request(arg[0], arg[1], arg[2]).Content; } @Override protected void onPostExecute(String s) { super.onPostExecute(s); WebTest.setText(s); } } }

среда, 27 ноября 2019 г.

Книги и учебные ресурсы по языку R


Рекомендуемая литература, курсы и документация по языку R.


Не создавайте новых ответов — редактируйте общий ответ.
Не размещайте ссылки на нелегальный контент, вроде торрент-трекеров.
Старайтесь сохранять разделение по категориям.





  Данный перечень входит в поддерживаемый сообществом Сборник учебных ресурсов по программированию.

    


Ответы

Ответ 1



Литература Русский А.Б. Шипунов, Е.М. Балдин, П.А. Волкова и др.: Наглядная статистика. Используем R! (ISBN: 978-5-97060-094-8) Бесплатная электронная версия (Книга передана в общественное достояние) Исходные тексты LaTeX Роберт И. Кабаков: R в действии. Анализ и визуализация данных на языке R (перевод с английского, ISBN: 978-1-93518-239-9, 978-5-94074-912-7, 978-5-97060-077-1) Дуглас Люк: Анализ сетей (графов) в среде R. Руководство пользователя. Цветное издание. (перевод с английского, ISBN: 978-5-97060-428-1 ) Джеймс Г., Уиттон Д., Хасти Т., Тибширани Р.: Введение в статистическое обучени с примерами на языке R. Цветное издание. (перевод с английского, ISBN: 978-5-97060-293-5 ) Мастицкий С.Э., Шитиков В.К.: Статистический анализ и визуализация данных с помощью R (ISBN: 978-5-97060-301-7) Бесплатная электронная версия (CC BY-NC-SA 4.0) Репозиторий автора на GitHub, с примерами к книге Блог автора Шитиков В.К., Мастицкий С.Э. Классификация, регрессия и другие алгоритмы Data Mining с использованием R Бесплатная электронная версия (CC BY-NC-SA 4.0) Репозиторий автора на GitHub, с примерами к книге English: Список англоязычной литературы на официальном сайте R-project Сетевые ресурсы Документация и онлайн литература Русский: Викиучебник: Язык программирования R Статьи по R на Хабре А. Б. Шипунов, Е. М. Балдин: Анализ данных с R (сборник статей, изданных в журнале Linux Format, электронная версия с сайта автора) Девид Мертц, Бред Хантинг: Статистическое программирование на R (электронный перевод, части 1, 2, 3) Перевод документации по пакетам dplyr, tidyr, data.table (руководство по data.table на bookdown.org) English: CRAN Task View: обзоры пакетов R по определеным направлениям от лучших разработчиков. Официальный мануал от разработчиков Шпаргалки (примеры кода) от RStudio Cookbook - примеры решения распространенных задач Quick-R (Блог) R-Bloggers: сайт, куда стекаются посты из сотен блогов, общее - использование R. The R Inferno: описание того, как не стоит делать в R и как стоит Bookdown: сайт, который хостит книги, написанные с помощью пакета bookdown. Разумеется, первые книги - сплошные сокровища по освоению и использованию R. Awesome R Advanced R by Hadley Wickham R Data Science Tutorials R for Data Science (Garrett Grolemund, Hadley Wickham) Онлайн курсы Русский: Stepic: Анализ данных в R Stepic: Основы программирования на R Репозиторий автора на GitHub, с кодом и данными Stepic: Анализ данных в R. Часть 2 English: Coursera: R Programming (входит в специализацию Data Science) Data Camp: Introduction to R Udacity: Data Analysis with R. Visually Analyze and Summarize Data Sets Code School: Try R Интерактивное обучение swirl: R пакет для интерактивного обучения (см. русскоязычный материал на хабре)

вторник, 26 ноября 2019 г.

Книги и учебные ресурсы по Linux


Рекомендуемая литература, курсы и документация по Linux.




  Данный перечень входит в поддерживаемый сообществом Сборник учебных ресурсов по программированию.

    


Ответы

Ответ 1



Начинающим Linux. От новичка к профессионалу, Денис Колисниченко, БХВ-Петербург, 2016, ISBN: 978-5-9775-3700-1 Официальная документация: Slackware: SlackBook RedHat/Centos: RedHat System Administrator's guide - на середину 2016 года, содержит лучшее руководство по управлению systemd. SuSE: SLES 12 Administration guide Ubuntu: Ubuntubook. Установка и настройка. Курс подготовки к экзамену LPIC-1. Основы linux. Rodrick W. Smith, 2005 Отличный гайд по скриптованию на bash Средний уровень Linux Kernel Development (3rd Edition), Robert Love, Addison-Wesley Professional, 2010, ISBN: 978-0-6723-2946-3 Русский перевод: Ядро Linux. Описание процесса разработки, Роберт Лав, Вильямс, 2014, ISBN: 978-5-8459-1944-1 How Linux Works: What Every Superuser Should Know -Brian Word Русский перевод : Внутреннее устройство linux - Брайан Уорд The book of Postfix : state-of-the-art message transport - Ralf Hildebrandt and Patrick Koetter Русский перевод: Postfix. Подробное руководство Очень крутой сборник рецептов linux и чуть-чуть powershell. RTFM (Red Team Field Manual) Продвинутый уровень Computer Networks 5th Edition Aandrew Tanenbaum, David Wetherall Книга подробно рассказывает про сети в ОС UNIX, уровни модели OSI, сетевую безопасность. Также Онлайн можно прочитать. Linux для встраиваемых систем Mastering Embedded Linux Programming: Harness the Power of Linux To Create Versatil and Robust Embedded Solutions, Chris Simmonds, Packt Publishing Ltd., 2015, ISBN: 978-1-7843-9902-3 Русский перевод: Встраиваемые системы на основе Linux. Крис Симмондс, ДМК Пресс 2017, ISBN: 978-5-97060-483-0 Онлайн курсы: Введение в linux (Превосходный курс для новичков) https://www.edx.org/course/introduction-linux-linuxfoundationx-lfs101x-0 Платный, но очень неплохой русскоязычный курс для начального уровня http://www.specialist.ru/course/yun1-b Русскоязычный курс по linux https://stepik.org/course/Введение-в-Linux-73/

Книги и учебные ресурсы по PHP


Рекомендуемая литература, курсы и документация по PHP.


Не создавайте новых ответов — редактируйте общий ответ.
Не размещайте ссылки на нелегальный контент, вроде торрент-трекеров.
Старайтесь сохранять разделение по категориям.





  Данный перечень входит в поддерживаемый сообществом Сборник учебных ресурсов по программированию.

    


Ответы

Ответ 1



Официальная документация PHP.NET - Руководство по PHP Литература Для начинающих PHP 7. Дмитрий Котеров, Игорь Симдянов. Создаем динамические веб-сайты с помощью PHP, MySQL, JavaScript, CSS и HTML5. Робин Никсон. PHP. Создание динамических страниц. Дэвид Пауэрс. PHP: Правильный путь. (PHP: The right way) - Онлайн книга. Для среднего уровня PHP 5. Полное руководство. Джон Коггзолл PHP. Объекты, шаблоны и методики программирования. Мэт Зандстра. Самоучитель PHP 7. Максим Кузнецов, Игорь Симдянов. Для продвинутого уровня Domain-Driven Design in PHP. Carlos Buenosvinos, Christian Soronellas, Keyvan Akbary Полезные ссылки Список всего, связанного с PHP PhpTheRightWay - список актуальных инструментов/библиотек/подходов

понедельник, 25 ноября 2019 г.

Чем отличается __repr__ от __str__?


Возьмем как пример парочку выдуманных классов:

import requests

class A:
    def __init__(self, a="string", b=10, c=["a", "b", "c", 1, 2, 3]):
        # параметр c - произвольной длины
        self.a = a
        self.b = b
        self.c = c

class B:
    def __init__(self, A_object):
        # A_object - объект типа A
        self.neighbor = A_object
        self.session = requests.Session()


1) Как следовало бы написать __repr__ и __str__ для этих классов?

2) Документация говорит о том, что __repr__ - это однозначное представление объект
в виде строки, которое можно использовать, чтобы воссоздать точно такой же объект, 
если это невозможно, то вывести какое-нибудь полезное сообщение. Очень похоже, что требуется сериализовать объект таким образом. В чем же тогда отличие от связки __getstate__, __setstate__? Эти два метода тоже могут запросто строку вернуть и требования у этой строки такие же - однозначное представление объекта. Зачем же дублирование? 

И наоборот, как замену getstate, setstate можно придумать следующее:

def __repr__(self):
    return "A({a}, {b}, {c})".format(a=self.a, b=self.b, c=self.c)


а потом вызывать это:

A1 = A()
A2 = eval(A1.__repr__())


3) Та же самая документация говорит, что __str__ - должен вывести красивое, читабельно
информационное сообщение, отражающее объект. Как тогда различить результат этого метода и какое-нибудь полезное сообщение из __repr__?

4) Далеко не всегда можно представить какой-то объект в виде строки. Например, функции
длинные коллекции, другие объекты без str и без repr. Выходит, что в этом случае либ
не выполняется требование __repr__, либо необходимо для всех подобных объектов вывести содержание __dict__, что хранит значение всех-всех методов и переменных. Выглядит это решение плоховато, что же делать?

5) Возвращаясь к документации __repr__ - можно пример ситуации, когда невозможн
однозначно представить объект как строку? Объекты ведь не имеют к квантовому миру никакого отношения - они ВСЕГДА детерминированы, всегда есть набор переменных и набор методов. но не зря же в документации эта строка?

6) А еще есть __format__, который тоже должен возвращать строку...
    


Ответы

Ответ 1



datetime.date хорошо иллюстрирует разницу: >>> from datetime import date >>> date.today() # sys.displayhook() uses repr() by default datetime.date(2016, 6, 13) >>> print(date.today()) # print uses str() here 2016-06-13 repr(obj) возвращает однозначное текстовое представление (representation) объект полезное для отладки, сообщений об ошибках, REPL, которое (иногда) позволяет его (теоретически) восстановить: eval(repr(obj)) == obj. str(obj) возвращает читаемый текст. Для многих объектов имеет смысл определить __repr__( (так как реализация по умолчанию в object.__repr__ не слишком информативна). __str__() имеет смысл определять для объектов, для которых существует «естественное» человеко-читаемое (неспецифичное для Питона) представление (как в примере с датой), например, для логов. Если __str__ не определён, то str() использует repr(). Разные форматы рассчитаны на разного потребителя (человек/программа, Питон/обще назначение). Вот график, иллюстрирующий когда разные форматы удобно использовать: ^ ^ | | Более дружелюбный для человека | +---+ | |str| | +---+ | | +----+ +----+ | |repr| |json| | +----+ +----+ | | +------+ | |pickle| | +------+ | | | Машино-читаемый +---------------------------------> Специфичный для Питона -> Более общий 1) Как следовало бы написать __repr__ и __str__ для этих классов? class A: def __repr__(self): return "A(%r, %r, %r)" % (self.a, self.b, self.c) class B: def __repr__(self): return "" % (self.neighbor, self.session) Объекты B не могут быть восстановлены из repr(). 2) Документация говорит о том, что __repr__ - это однозначное представление объект в виде строки, которое можно использовать, чтобы воссоздать точно такой же объект, если это невозможно, то вывести какое-нибудь полезное сообщение. Очень похоже, что требуется сериализовать объект таким образом. В чем же тогда отличие от связки __getstate__, __setstate__? Эти два метода тоже могут запросто строку вернуть и требования у этой строки такие же - однозначное представление объекта. Зачем же дублирование? pickle (__getstate__/__setstate__) не является человеко-читаемым форматом. Цели ограничения на дизайн другие. То что eval(repr(obj)) иногда работает, ещё не значит что это хорошая идея использовать это вместо pickle.loads(pickle.dumps(obj)) или json.loads(json.dumps(obj)). Основной потребитель repr() это человек. Потребитель pickle.dumps() это как правил программа, например, multiprocessing использует pickle для обмена данными между процессами. 3) Та же самая документация говорит, что __str__ - должен вывести красивое, читабельно информационное сообщение, отражающее объект. Как тогда различить результат этого метода и какое-нибудь полезное сообщение из __repr__? Если вы не видите имя типа, то это не __repr__() (за очевидным исключением констант (Python literals) таких как 'abc', 123). 4) Далеко не всегда можно представить какой-то объект в виде строки. Например функции, длинные коллекции, другие объекты без str и без repr. Выходит, что в этом случа либо не выполняется требование __repr__, либо необходимо для всех подобных объектов вывести содержание __dict__, что хранит значение всех-всех методов и переменных. Выглядит это решение плоховато, что же делать? eval(repr(obj)) это подсказка, а не требование: если объект большой, то очевидн нужно сократить его представление. Во многих случаях, можно использовать многоточие: >>> numpy.arange(10000000) array([ 0, 1, 2, ..., 9999997, 9999998, 9999999]) >>> print(numpy.arange(10000000)) [ 0 1 2 ..., 9999997 9999998 9999999] Ещё раз: потребитель repr()—программист Питона, который видит это представление в REPL или debugger. 5) Возвращаясь к документации __repr__ - можно пример ситуации, когда невозможн однозначно представить объект как строку? Объекты ведь не имеют к квантовому миру никакого отношения - они ВСЕГДА детерминированы, всегда есть набор переменных и набор методов. но не зря же в документации эта строка? Документация говорит про случай, когда eval(repr(obj)) == obj не имеет смысла: >>> object() 6) А еще есть __format__, который тоже должен возвращать строку... Этот специальный метод позволяет типу переопределить как format() себя ведёт, например: >>> "{:%Y-%m-%d}".format(datetime.today()) '2016-06-13' В Питоне 2 есть __unicode__() как __str__(), но unicode возвращает. А ещё __fspath__( (PEP 519) появился. Могут быть другие протоколы, которые возвращают строки (со своим обоснованием).

Числа, цифры, хексы, буквы и другая каша в голове



  Сколько раз слово "и" встречается в букве "цивилизация"?


Никто же так не спрашивает - все понимают, где буквы, а где слова.
Так сколько же можно издеваться над числами, постоянно путая связанные с ними понятия?

Итак, как правильно использовать понятия, связанные с числами, и чем они отличаются?
    


Ответы

Ответ 1



Числа Число - это абстрактная единица измерения количества. 1, 2, 1888, 712.4 - всё это числа. -7 - тоже число. Хотя в большинстве языков программирования литеральной записью не обладает. Число представляет собой значение. Оно не обладает ни единицей измерения, ни системой счисления. Строго говоря, нельзя даже говорить, что оно состоит из цифр. Числа в рамках языка программирования К тому, что сказано выше добавляется тип данных, а так же возможность литеральной записи. В памяти число представлено неким набором бинарных данных. Не надо говорить, чт в этом куске памяти лежат хексы. Это просто байты и биты. Шестнадцатеричный дамп куска памяти - это именно дамп, но не число. Например, для Си: 10, 012, 0xa, 0x0A - это разные записи одного и то же числа. 10, 10L, 10.0 - это разные (хотя и равные) числа, поскольку они имеют разный ти данных. Конечно, они могут рассматриваться как одинаковые, если для нас важна величина, а не тип, но с точки зрения компилятора они различаются. Системы счисления Число может быть представлено в виде строки в различных системах счисления. Это по-прежнему одно и то же число, но строковые представления различны. "1111111111", "1010", "14", "A" - это всё представления числа 10 в различных системах счисления (унарная, бинарная, шестиричная и шестнадцатеричная соответственно). Фраза "число в шестнадцатеричной системе счисления" корректна, но неявно подразумевае "текстовое представление числа в шестнадцатеричной системе счисления", т. е. речь далее идёт о строке, а не о числе. Цифры Буква - это один символ в слове, а Цифра - это один символ в строковом представлении числа (по умолчанию - десятичном). Цифра может подразумевать и строковый ("5", "A"), и числовой (5, 10) вариант. Строковый вариант представляет собой выводимый символ, тогда как числовой следует рассматривать как остаток в кольце вычетов. Арифметические операции над цифрами в производить нельзя. Фраза "сложить цифры 5 и 7" некорректна, складывать можно только числа. Однако, в некоторых случаях возможна неявная интерпретация цифр как чисел. Цифры числа Если не оговаривается система счисления, то подразумевается десятичная. Под цифрами числа, как правило, подразумеваются числовой смысл цифр. Т. е. цифры числа - это набор остатков в кольце вычетов по основанию системы счисления который при скалярном умножении на соответствующие степени системы счисления (уже вне кольца) даст оригинальное число. По умолчанию этот набор упорядоченный. В этом контексте можно говорить об арифметических операциях, например "сумма циф числа" - это сумма чисел указанного выше набора. Поскольку речь уже идёт о числах, система счисления более не играет роли - она была нужна только для получения набора. Цифры в строковом контексте Цифра - это любой символ, который относится к соответствующей категории юникода. Можно считать, что он используется для записи чисел в естественных языках (язык программирования не подходят: в записи 0xA - символ A используется как цифра, но в реальности является буквой). В то же время я не могу со стопроцентной гарантией сказать, что любая цифра юникода используется хотя бы в одном естественном языке. PS: В большинстве случаев выше подразумеваются целые числа, однако аналогичная интерпретация возможна и для дробных.

Ответ 2



Как не надо использовать слово "цифры": Странные цифры в http ответе Хороший вопрос про chunked encoding, но почему в заголовке цифры, а не числа? Что означают цифры в строке формата? Ширина и точность в формате printf/scanf - это тоже числа. Слова в цифры (один>1) Цифры "десять" в неоговоренной системе счисления не бывает. На самом деле подразумевается преобразование числа прописью к числу Как зашифровать слово в цифры? Ставим цифры в соответствие emeil'у - правда? Assembler. Изменение HEX по ходу программы В памяти по заданному адресу хранятся данные, а не hex.

Книги и учебные ресурсы по Unity3D


Собираем подборку литературы и документации по Unity3D.


Не создавайте новых ответов — редактируйте общий ответ.
Старайтесь сохранять разделение по категориям (при надобности добавить новый).
Не размещайте ссылки на нелегальный контент, вроде торрент-трекеров.
Единственная ссылка на видео будет на обучающие материалы с Официального сайта Unity3D. Остальные видеолекции и интерактивные курсы добавлять запрещено!





  Данный перечень входит в поддерживаемый сообществом Сборник учебных ресурсов по программированию.

    


Ответы

Ответ 1



В первую очередь надо изучить либо C# и поэтому ссылка на литературу по C#, либ javascript и ссылка на литературу по Javascript. Скриптинг: Joseph Hocking — Unity in Action. Multiplatform game development in C# with Unity 5, 2015 Русский перевод: Джозеф Хокинг — Unity в действии. Мультиплатформенная разработка на C#, 2016 Alan Thorn — Mastering Unity Scripting, 2015 Русский перевод: Алан Торн — Искусство создания сценариев в Unity, 2016 Шейдеры: Kenny Lammers — Unity Shaders and Effects Cookbook, 2013 Русский перевод: Кенни Ламмерс — Шейдеры и эффекты в Unity, 2014 Alan Zucconi, Kenneth Lammers — Unity 5.x Shaders and Effects Cookbook, 2016 Мультиплеер: Alan R. Stagner — Unity Multiplayer Games, 2013 Анимация: Alan Thorn — Unity Animation Essentials, 2015 Русский перевод: Алан Торн — Основы анимации в Unity, 2016 Дополнительно: Alan Thorn — How to Cheat in Unity 5: Tips and Tricks for Game Development, 2015 Chris Dickinson — Unity 5 Game Optimization, 2015 Видео уроки (только официальные): Обучающие материалы — Главная страница с разделами Обучающие материалы — Скриптинг P.S. (updated by @АлексейШиманский) Следующий список представленных книг прочитаны и оценены программистами, купивши книгу на Amazon. На сколько оценка соответствует проф. статусу — сказать я не могу, но утаивать данный список книг я считаю неправильным и преступным)). Каждый здесь сможет почерпнуть для себя что-то дельное и необходимое. Справа от названия будет оценка книги по 5-ти бальной шкале. Пример: 4/5. .left { left: 0; padding-right: 5px; } .right { right: 0; padding: 0 10px; margin-right: 0px } .left, .right { background: #fff; z-index: 2; position: absolute; } .row { position: relative; height: 20px; margin-bottom: 10px; } .row:after { content: ''; position: absolute; bottom: 0.3em; left: 0; width: 100%; height: 100%; border-bottom: 2px dotted black; z-index: 1; }
Alan Thorn — How to Cheat in Unity 5 Tips and tricks 5/5
Alan Thorn — Mastering Unity Scripting 4.5/5
Joseph Hocking — Unity in Action (Джозеф Хокинг — Unity в действии) 5/5
Кенни Ламмерс — Шейдеры и эффекты в Unity 4/5
Alan R. Stagner — Unity Multiplayer Games 3.4/5
Alan Zucconi, Kenneth Lammers — Unity 5.x Shaders and Effects Cookbook 4/5
Chris Dickinson — Unity 5 Game Optimization 5/5
Jeremy Gibson — Introduction to Game Design, Prototyping, and Development 4.5/5
Matt Smith — Unity 5.x Cookbook 4.5/5
Ryan Henson Creighton — Unity 3D Game Development 3.9/5
Sue Blackman — Beginning 3D Game Development with Unity 4/5
Terry Norton — Learning C# by Developing Games with Unity 3D (Veeeeeeeeerrry Beginner's Guide) 3.7/5
Venita Pereira — Learning Unity 2D Game Development by Example 3/5
Simon Jackson — Mastering Unity 2D Game Development 5/5
Dave Calabrese — Unity 2D Game Development 2.5/5
Edward Lavieri — Getting Started with Unity 5 2.9/5
John P. Doran — Building an FPS Game with Unity 4.2/5
Jonathan Linowes — Unity Virtual Reality Projects 4.2/5
Valera Cogut — Unity 5 for Android Essentials 4/5
Jonathan Linowes — Unity Virtual Reality Projects 4.2/5
Jorge Palacios — Unity 5.x Game AI Programming Cookbook 3.3/5
Maciej Szczesnik — Unity 5.x Animation Cookbook 4.4/5
Patrick Felicia — Unity 5 From Zero to Proficiency 4.5/5
K. Aava Rani — Learning Unity Physics 3.3/5
Ryan Watkins — Procedural Content Generation for Unity Gam Development 3.8/5
Francesco Sapio Abdelrahman Saher — Unity 5.x 2D Game Development Blueprints ???
Francesco Sapio — Unity UI Cookbook 4.3/5