+2
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
package clojure.lang;
import java.io.Serializable;
import java.util.*;
public abstract class APersistentVector extends AFn implements IPersistentVector, Iterable,
List,
RandomAccess, Comparable,
Serializable, IHashEq {
int _hash;
int _hasheq;
public String toString(){
return RT.printString(this);
}
public ISeq seq(){
if(count() > 0)
return new Seq(this, 0);
return null;
}
public ISeq rseq(){
if(count() > 0)
return new RSeq(this, count() - 1);
return null;
}
static boolean doEquals(IPersistentVector v, Object obj){
if(obj instanceof IPersistentVector)
{
IPersistentVector ov = (IPersistentVector) obj;
if(ov.count() != v.count())
return false;
for(int i = 0;i< v.count();i++)
{
if(!Util.equals(v.nth(i), ov.nth(i)))
return false;
}
return true;
}
else if(obj instanceof List)
{
Collection ma = (Collection) obj;
if(ma.size() != v.count() || ma.hashCode() != v.hashCode())
return false;
for(Iterator i1 = ((List) v).iterator(), i2 = ma.iterator();
i1.hasNext();)
{
if(!Util.equals(i1.next(), i2.next()))
return false;
}
return true;
}
else
{
if(!(obj instanceof Sequential))
return false;
ISeq ms = RT.seq(obj);
for(int i = 0; i < v.count(); i++, ms = ms.next())
{
if(ms == null || !Util.equals(v.nth(i), ms.first()))
return false;
}
if(ms != null)
return false;
}
return true;
}
Я решил попробовать Clojure: скачал Intellij Idea Comunity Edition поставил Cursive. Кодил значится, кодил, решил посмотре реализацию некоторых функци, начал шерстить по исходникам и дошел до джавовских исходников реализации кложура. Идея мне любезно предложила вместо декомпилированого кода скачать исходники и читать их. Я согласился и скачал, после чего увидел это. Исходное форматирование сохранено.
Это пиздец, товарищи. Кложур как язык - очень хорош, вот прям очень. Но мне в голове не укладывается что вот эта патлатая курва https://github.com/richhickey создатель такого крутого языка, не умеет в форматирование кода. Весь репозиторий - тупо рандом. Как блять, можно делать реализацию языка и даже блять не сделать код стайл. Вы можете подумать, что это и есть код стайл. Но хер там плавал, местами есть привычное джавовское форматирование, местами куча закоментированного кода. Короче полный бардак. Вот, наслаждайтесь https://github.com/clojure/clojure
На самом деле я не сильно то и разочарован. Да и вообще, я пытался смотреть видео с его докладами - меня просто тошнит от него. Тошнит точно так же, как от препода из универа, который вроде бы и шарит, вроде бы и что-то рассказывает, но без малейшего энтузиазма - просто поток текста, монотонный и неинтересный. У человека просто нету таланта/желания именно донести и поджечь интерес.
За создание кложура я его уважаю. Мне просто непонятно, как человек который создал такой хороши язык, не имеет понятия код стайл. Ваши мисли?
Запостил:
Lorip1971,
11 Февраля 2020
> vendor asm to sha 88a0aa8a79df7370cd178281bdf690ac2361c19a
какой менеджмент зависимостей )))
ctrl + shift + r, ctrl + shift + f
> когда надо не выводить ошибки в браузер
error_reporting(0);
> когда надо многопоточность
нет многопоточности - нет рейс кондишена!
> когда надо профулироваться удобно
ты просто не успел привыкнуть к «microtime(true)»
Лол, никуда.
> Нет программы -- нет проблем. А фоновые задачи можно делать по крону.
Лол, так и делают.
> есть же "echo"
Воистину.
* Нужно не забыть перепидорасить "php.ini", в частности установить правильный "error_reporting" и не забыть выключить "display_errors" на продакшоне. Есть еще куча всякой магии, меняющей, блять, поведение самого приложения, типа "request_order", "magic_quotes", "session.save_handler" и ещё куча всякого говна.
* Нужно повесить свой "error_handler", преобразующий классические пыхоошибки в исключения. Так достигается хоть какая-то ко-ко-ко-нсистентность в обработке ошибок, но не всех, об этом тоже нужно помнить.
* Руками установить ГЛОБАЛЬНО БЛЯТЬ все нужные расширения, композер в случае их отсутствия может только обосраться.
* Держать бутстрап приложения максимально легким. Да, дорогой джавист, тут парсить 640-килобайтные XML-конфиги - это моветон. Доводилось видеть, как чтение уебских конфигов становилось реально узким местом и такое говно "конпелировали" в "PHP" с дальнейшим помещением в "opcache". Выглядит экстравагантно, но работает действительно на порядок быстрее.
* Помнить, что нельзя сравнивать хеши паролей через "=="
* Не забыть установить мемкеш на локалхост. Наверняка захочется иметь быстрый компактный кеш, но шарить память между реквестами нельзя by design. (inb4: ололо, есть же шаред мемори)
* Настроить crontab с фоновыми задачами.
* Зареврайтить все урлы на index.php средствами веб-сервера.
* И помнить целый чемодан нюансов и исключений, коими изобилует практически каждая сраная функция
Итого получаем, что хороший "PHP"-разработчик - это такая нихуёвая зубрилка с солидным багажом знаний, применимых только в области укрощения взбесившегося шаблонизатора, а ведь все потраченные усилия человек мог направить в более полезное и широкоприменимое русло. Нахуй так жить?
Это самый главный багор. Если у тебя несколько сайтов на одной машине, ты должен сначала вычислить объединение (в смысле теории множеств) расширений, требуемых каждому сайту, руками их поставить (через «PECL» ставится не всё) и прописать в «php.ini». В результате из-за одного сайта, требующего хитрое прожорливое расширение, у тебя интерпретатор будет прожорливым.
Часть параметров можно менять на лету вызовом функции ini_set. Они помечены в таблице как PHP_INI_ALL:
https://www.php.net/manual/en/ini.list.php
"error_reporting" и "display_errors" как раз относятся к таким динамически изменяемым.
Остальные параметры можно устанавливать только глобально в php.ini. Какой багор )))
Кстати, там новую "защиту" завезли, с мышиным обучением. https://wiki.php.net/pecl/mysqlnd_poc_plugins#sql_injection_protec tion_plugin_-_peclmysqlnd_sip
> The SQL injection protection plugin attempts to detect and block malicious SQL statements. It has two operational modes. In the learning mode it records all SQL statements and remembers them. The recorded statements are considered safe. Recoding shall be done in a safe environment, for example, in a test environment. In the operational mode the plugins verifies that all SQL statements match the lift of safe statements. All SQL statements that match are executed. The other ones are rejects. Execution is prevented.
1. Бывают запросы, которые ну очень редко выполняются. Т. е. я для обучения должен подготовить среду, в которой моё приложение создаст всевозможные SQL-запросы, включая те, которые оно делает раз в сто лет.
2. Как в рабочем режиме этот плагин отличит «хорошие» запросы от «плохих»?
Системы такого уровня позволяют хоть немного заглянуть в будущее и отловить ошибки и атаки, которые ещё не изобрели.
От «SQL-инъекций» прекрасно защитит какой-нибудь статический анализатор, который ругается на скармливание в «$connection->prepare()» любой динамически генерируемой строки (а всякие mysql_query(), разумеется, по-умолчанию идут нахуй).
http://p42.us/ie8xss/
Единственная вменяемая структура данных — массив.
>> an lvalue is a glvalue that is not an xvalue;
>> an rvalue is a prvalue or an xvalue.
Изоморфизм — это биективный гомоморфизм.
Биекция — это сюръективная инъекция.
)))
https://blog.tartanllama.xyz/initialization-is-bonkers/
Можно диссертацию писа́ть по видам инициализации.
Почему?
https://ideone.com/5USzXl
Именно поэтому я за «PHP».