Как поставить програмную точку останова в разных языках средах и 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, переносился на новую строку, а не вылезал
за пределы блока (именно переносился - overflow:hidden неподойдет), и вообще, почему
могла возникнуть такая ситуация, что текст не переносится? Ширина определена в css.
В моём примере это отчёт об ошибках 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. Забудьте про "программы или возможности упростить этот отчёт об ошибках". Стэктрейс
- это обычно все, что вам нужно при отладке исключений.
Этот вопрос, по аналогии с вопросом Книги и другие материалы для обучения, предназначен
для того, чтобы в единственном общем ответе собрать ссылки на вопросы-ответы по методам
поиска, нахождения и исправления ошибок в коде.
В вопросы, перечисленные ниже в списке МОЖНО и нужно добавлять еще ответы!
Метки пишем в алфавитном порядке.
Люди смогут использовать его для выявления схожих проблем в различных технологиях.
Также удобно использовать в качестве списка эталонных вопросов, на которые можно
сослаться при мелких несущественных ошибках и, возможно,
закрывать вопросы как дубликат, если они о таких вещах как:
"Что не так в коде?"
"Где у меня ошибка?"
"Почему программа не работает?"
и подобные
Ответы
Ответ 1
Общие практики и советы
Какие есть способы предупреждения ошибок, их нахождения и устранения?
Список по языкам
c# Как и какими средствами находить ошибки в коде на C#?
java Как и какими средствами находить ошибки в коде Java?
javascript Как и какими средствами находить ошибки в Javascript коде?
php Как и какими средствами находить ошибки в PHP коде?
css Что делать, если не работает css-класс
На моем компьютере стоит ubuntu 14 с LAMP сервером, комп выходит в интернет через
роутер при подключении WiFi, у меня есть еще и второй комп с виндой, он также выходит
в интернет через тот самый роутер, но уже подключен к роутеру через шнурок. Когда я
на втором компе обращаюсь к своему серверу, все работает, ftp, ssh и phpmyadmin, в
общем, все гут.
Вот теперь хочу, чтобы к моему серверу можно было подключиться из интернета.
Как такое реализовать?
Ответы
Ответ 1
нужен внешний ip-адрес (ipv4, разумеется), который может предоставить вам ваш интернет-провайдер.
бесплатно или за деньги.
нужно настроить ваш маршрутизатор, чтобы он внешние обращения на нужные вам порты
(или вообще все внешние обращения) переадресовывал на тот из ваших компьютеров, который
будет эти обращения обрабатывать. смотрите инструкцию по эксплуатации вашего маршрутизатора.
как правило, никаких изменений в конфигурации компьютеров не требуется.
другие вопросы на ru.so со схожей тематикой:
Как прокинуть IP-адрес через роутер?
Доступ к серверу по внешнему IP через роутер
Настройка доступа к сайту извне
Поднять сервер дома в денвере через роутер D-link dir400
Настройка роутера TrendNet
Проброс портов на роутере TP-Link 940N
Как настроить доступ к web-серверу в локальной сети?
Как присвоить ститичный ip адрес компьютеру в wifi?
Настройка сервера на домашнем ПК
Как узнать к какому компьютеру подключится клиент?
Доступ из интернета к сайту на домашнем компьютере
Подключение к веб-серверу из глобальной сети
как при помощи программы 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
Существует много простых вопросов, на которые можно ответить ссылкой или примером
кода взятыми из официальной документации Microsoft. Судя по тому, что количество таких
вопросов неуклонно растет, не все знают о существовании встроенной в студию справочной
системы, а если и знают, то не умеют быстро и удобно ей пользоваться.
Здесь постараемся раскрыть тонкости использования справочной системы студии.
Ответы
Ответ 1
Т.к. читать сегодня тоже не очень модно, начну с главного, как быстро получить интересующую
информацию.
В десктопных приложениях, исторически сложилось, что клавиша F1 служит для вызова
справки. VisualStudio также использует эту клавишу для работы со справкой, но в более
широком смысле. Если вас интересует справка по какому то классу, методу и или функции
поставляемым в библиотеках Microsoft, достаточно поставить текстовый курсор (выделять
полностью не обязательно) в редакторе кода на имя интересующего элемента и нажать
F1. VisualStudio автоматически создаст поисковый запрос к справочной системе и откроет
соответствующий раздел справки, если такой имеется в наличии.
Microsoft предоставляет два варианта справки доступной напрямую из IDE: online и
offline. В настоящее время, визуальное представление Online и Offline версий практически
не отличается. Слева навигация по дереву разделов документации, справа - навигация
по разделам статьи.
Качество документации:
Сначала о хорошем:
в той или иной степени документировано все.
много рабочих примеров кода, некоторые из которых довольно часто используются практически
без изменений и дополнений в рабочих проектах.
есть пошаговые инструкции для выполнения типовых задач, таких как, например, чтение
и запись файлов, создание простых оконных приложений, создание простых сервисов и т.д.
Ну и о плохом:
если есть возможность, то лучше читать документацию на оригинальном английском, т.к.
с некоторых пор MSDN использует систему автоматического перевода для локализации, что
негативно сказывается на качестве локализованных текстов.
присутствуют некоторые неточности и неоднозначности в оригинальной версии.
отдельные разделы документированы весьма условно (камень в огород WinAPI и еще некоторых).
Но не смотря на все недостатки не очень хорошая документация однозначно лучше чем
ее полное отсутствие.
Offline вариант можно установить вместе с VisualStudio или добавить позже. Важная
особенность Offline-справки - ее можно загружать частями, по мере необходимости. Установка
локального содержимого и управление им. Сразу хочу предупредить, что полный объем справочной
информации превышает несколько десятков гигабайт и это только для .NET, так что это
не быстрый процесс, но в результате вы сможете искать информацию независимо от наличия
выхода в сеть.
При попытке запустить сайт в 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
Как автоматически запускать программу при старте сервера? Без входа пользователя.
Ответы
Ответ 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/имя_службы
Как в 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, см. Хабр.
Давайте в этом вопросе составим список регулярных выражений никнеймов разных соц.
сетей и сервисов.
Это необходимо при добавлении разных ссылок на аккаунты в профиле пользователя и
не только.
Ответы
Ответ 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}$
Не холивара ради, но накоплений точек зрения для.
Замучился отвечать одно и тоже в одинаковых темах "я запустил .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 в систему.
Я пишу 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;
}
Здравствуйте. Пытаюсь сделать 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);
}
}
}
Рекомендуемая литература, курсы и документация по языку 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 пакет для интерактивного обучения (см. русскоязычный материал на хабре)
Рекомендуемая литература, курсы и документация по 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.
Не создавайте новых ответов — редактируйте общий ответ.
Не размещайте ссылки на нелегальный контент, вроде торрент-трекеров.
Старайтесь сохранять разделение по категориям.
Данный перечень входит в поддерживаемый сообществом Сборник учебных ресурсов по программированию.
Ответы
Ответ 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 - список актуальных инструментов/библиотек/подходов
Возьмем как пример парочку выдуманных классов:
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()
Сколько раз слово "и" встречается в букве "цивилизация"?
Никто же так не спрашивает - все понимают, где буквы, а где слова.
Так сколько же можно издеваться над числами, постоянно путая связанные с ними понятия?
Итак, как правильно использовать понятия, связанные с числами, и чем они отличаются?
Ответы
Ответ 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. Остальные видеолекции и интерактивные курсы добавлять запрещено!
Данный перечень входит в поддерживаемый сообществом Сборник учебных ресурсов по программированию.
Ответы
Ответ 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 tricks5/5
Alan Thorn — Mastering Unity Scripting4.5/5
Joseph Hocking — Unity in Action (Джозеф Хокинг — Unity в действии)5/5
Кенни Ламмерс — Шейдеры и эффекты в Unity4/5
Alan R. Stagner — Unity Multiplayer Games3.4/5
Alan Zucconi, Kenneth Lammers — Unity 5.x Shaders and Effects Cookbook4/5
Chris Dickinson — Unity 5 Game Optimization5/5
Jeremy Gibson — Introduction to Game Design, Prototyping, and Development4.5/5
Matt Smith — Unity 5.x Cookbook4.5/5
Ryan Henson Creighton — Unity 3D Game Development3.9/5
Sue Blackman — Beginning 3D Game Development with Unity4/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 Example3/5
Simon Jackson — Mastering Unity 2D Game Development5/5
Dave Calabrese — Unity 2D Game Development2.5/5
Edward Lavieri — Getting Started with Unity 52.9/5
John P. Doran — Building an FPS Game with Unity4.2/5
Jonathan Linowes — Unity Virtual Reality Projects4.2/5
Valera Cogut — Unity 5 for Android Essentials4/5
Jonathan Linowes — Unity Virtual Reality Projects4.2/5
Jorge Palacios — Unity 5.x Game AI Programming Cookbook3.3/5
Maciej Szczesnik — Unity 5.x Animation Cookbook4.4/5
Patrick Felicia — Unity 5 From Zero to Proficiency4.5/5
K. Aava Rani — Learning Unity Physics3.3/5
Ryan Watkins — Procedural Content Generation for Unity Gam
Development3.8/5
Francesco Sapio Abdelrahman Saher — Unity 5.x 2D Game Development Blueprints???