- 1
- 2
- 3
https://github.com/covrom/gonec
1C:Enterprise-like language interpreter written in Go https://covrom.github.io/gonec/
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−3
https://github.com/covrom/gonec
1C:Enterprise-like language interpreter written in Go https://covrom.github.io/gonec/
ГОВНЕЦ (govnec)
Интерпретатор и платформа создания микросервисов на 1С-подобном языке
Цели
Интерпретатор создан для решения программистами 1С множества задач, связанных с высокопроизводительными распределенными вычислениями, создания вэб-сервисов и вэб-порталов для работы тысяч пользователей, работы с высокоэффективными базами данных с использованием синтаксиса языка, похожего, но не ограниченного возможностями языка 1С.
Включив такой интерпретатор в свое решение, Вы можете предоставить высокий уровень сервиса для своих клиентов, который обгонит решения не только ваших конкурентов на рынке 1С, но и конкурентных платформ в enterprise.
Интерпретатор разрабатывается “от простого к сложному”. На начальных этапах будет включена базовая функциональность многопоточных вычислений и сетевых сервисов. В перспективе планируется организация работы с различными базами данных и визуализация управляемых форм, созданных в конфигураторе.
Еще никогда не были так просто доступны программистам 1С возможности:
* Создать микросервис с произвольным сетевым протоколом, развернуть его на linux, в docker контейнере или кластере kubernetes
* Выполнить сложную многопоточную вычислительную задачу для десятков тысяч подключающихся пользователей за миллисекунды
* Взаимодействовать с пользователем через web-браузер с минимальным трафиком
* Сохранять и получать данные с максимально доступной скоростью в key-value базах данн
+319
template<typename OpeningBracketRange,
typename ClosingBracketRange,
typename StopTokenRange,
typename CommentBlockRangePairRange,
typename RecursiveCommentBlockRangePairRange>
Meta::EnableIf<
IsFiniteForwardRange<OpeningBracketRange>::_ &&
IsFiniteForwardRange<ClosingBracketRange>::_ &&
IsFiniteForwardRange<StopTokenRange>::_ &&
IsFiniteForwardRange<CommentBlockRangePairRange>::_ &&
IsFiniteForwardRange<RecursiveCommentBlockRangePairRange>::_,
decltype(Meta::Val<R>().Take(0))> ReadRecursiveBlock(int& counter, size_t* ioIndex,
OpeningBracketRange openingBracket, ClosingBracketRange closingBracket, StopTokenRange stopToken,
CommentBlockRangePairRange commentBlocks, RecursiveCommentBlockRangePairRange recursiveCommentBlocks)
{
R start = me();
size_t index = 0;
const size_t openingBracketLen = openingBracket.Count();
const size_t closingBracketLen = closingBracket.Count();
const size_t stopTokenLen = stopToken.Count();
while(!me().Empty() && counter!=0)
{
if(openingBracketLen!=0 && me().StartsWith(openingBracket))
{
counter++;
me().PopFrontExactly(openingBracketLen);
index += openingBracketLen;
continue;
}
if(closingBracketLen!=0 && me().StartsWith(closingBracket))
{
counter--;
me().PopFrontExactly(closingBracketLen);
index += closingBracketLen;
continue;
}
if(stopTokenLen!=0 && me().StartsWith(stopToken))
{
me().PopFrontExactly(stopTokenLen);
index += stopTokenLen;
break;
}
bool commentFound = false;
for(auto& commentBlock: commentBlocks)
{
commentFound = me().StartsWith(commentBlock.Get<0>());
if(!commentFound) continue;
const size_t commentBlockOpeningLen = commentBlock.Get<0>().Count();
const size_t commentBlockClosingLen = commentBlock.Get<1>().Count();
me().PopFrontN(commentBlockOpeningLen);
index += commentBlockOpeningLen;
me().FindAdvance(commentBlock.Get<1>(), &index);
me().PopFrontN(commentBlockClosingLen);
index += commentBlockClosingLen;
break;
}
if(commentFound) continue;
for(auto& commentBlock: recursiveCommentBlocks)
{
commentFound = me().StartsWith(commentBlock.Get<0>());
if(!commentFound) continue;
int commentCounter = 1;
ReadRecursiveBlock(commentCounter, &index, commentBlock.Get<0>(), commentBlock.Get<1>(), null, null);
break;
}
if(commentFound) continue;
me().PopFront();
}
if(ioIndex!=null) (*ioIndex) += index;
return start.Take(index);
}
Это мои последние достижения в написании сверх универсального обобщённого кода.
Начиналось всё с функции, которая парсила блок кода до закрывающей фигурной скобки, учитывая встречающиеся открывающие скобки. Затем появилась поддержка комментариев и строк. Позже я решил, что нечего привязываться к какому-то конкретному языку, ведь можно же таким же образом парсить другой язык, где вместо скобок begin end и комментарии по-другому оформляются.
А потом я подумал, зачем вообще привязывать типы параметров к строкам и массивам строк? И почему код, который парсится, вообще должен быть строкой, хранящейся в памяти непрерывно? В итоге мои размышления привели к такой реализации, которая способна парсить всё подряд, в том числе и связные списки, причём необязательно состоящие из символов. При этом открывающуюся скобку можно передать связным списком, закрывающуюся - массивом, а блоки комментариев передавать как массивом кортежей, так и хеш-таблицей.
При этом эта функция относится к классу примеси и наследованием её можно подмешать к любому классу, имеющему нужные методы.
0
Ку всем
Посоны
Как привязать БД для авторизации к html странице?
Не php а html
Написал мне Вася Пупкин, дипломированный специалист в области информационных технологий
+6
$uri = isset($endpoint['path']) ? $endpoint['path'] : null;
if (!isset ($uri)) {
$uri = "/";
}
вместо $uri = isset($endpoint['path']) ? $endpoint['path'] : '/';
+127
Makefile:
ARCH=i386
...
CFLAGS="-m32 -march=pentium-m -O3"
...
Других архитектур не существует?
+101
char buf[4096];
*((char*)&buf[14]) = 0x30;
Запись значения в массив (такой способ обращения к элементу массива тщательно соблюдается на протяжении всех 25000 строк кода проекта)
−108
__author__ = 'КотейКККин'
# Комментарий неуместен.
# О странности автора код сам все скажет.
import random
the_number = random.randint(1, 20867248)
print("Поиграем? Я загадал число от 1 до 20867248.")
print("У вас 1 попытка")
guess = int(input("Ваше предположение: "))
if guess != the_number:
print("Лошара, даже число угадать не можешь. И какой ты 'мужик' после этого...?")
else:
print(" O_O ты угадал??? По-любому вангуешь ;)")
Приобрел недавно ноутбук с рук, но чувак не почистил систему. Нашел на просторах его жестка в папках "обучение"...автор действительно имел незаурядное мышление о_О
P.S. Минусы ставьте за код, а не мне))
−863
select top 1 v.Id
from dbo.Verification v
where v.ApplicationId = a.Id
and v.ResultId = 'D69E0B3A-C5CA-42D0-A8CA-FA7FF63BC414'
and not exists (
select 1 from Verification vo
where vo.ApplicationId = v.ApplicationId
and vo.ResultId = v.ResultId
and vo.Id != v.Id
and vo.Position > v.Position
)
MS SQL. Видимо, автору не рассказали об order by
−120
CREATE TABLE `numbers` (
`number` BIGINT(20) DEFAULT NULL
) ENGINE=InnoDB;
CREATE TABLE `numbers_small` (
`number` INT(11) DEFAULT NULL
) ENGINE=InnoDB;
-- numbers
INSERT INTO `numbers` (`number`) VALUES('0');
INSERT INTO `numbers` (`number`) VALUES('1000');
INSERT INTO `numbers` (`number`) VALUES('2000');
INSERT INTO `numbers` (`number`) VALUES('3000');
INSERT INTO `numbers` (`number`) VALUES('4000');
INSERT INTO `numbers` (`number`) VALUES('5000');
-- 10 000 lines of inserting numbers into table numbers
-- ...
INSERT INTO `numbers` (`number`) VALUES('5999');
INSERT INTO `numbers` (`number`) VALUES('6999');
INSERT INTO `numbers` (`number`) VALUES('7999');
INSERT INTO `numbers` (`number`) VALUES('8999');
INSERT INTO `numbers` (`number`) VALUES('9999');
-- numbers small
INSERT INTO `numbers_small` (`number`) VALUES('0');
INSERT INTO `numbers_small` (`number`) VALUES('1');
INSERT INTO `numbers_small` (`number`) VALUES('2');
INSERT INTO `numbers_small` (`number`) VALUES('3');
INSERT INTO `numbers_small` (`number`) VALUES('4');
INSERT INTO `numbers_small` (`number`) VALUES('5');
INSERT INTO `numbers_small` (`number`) VALUES('6');
INSERT INTO `numbers_small` (`number`) VALUES('7');
INSERT INTO `numbers_small` (`number`) VALUES('8');
INSERT INTO `numbers_small` (`number`) VALUES('9');
Сделали нам программу на java. Прислали скрипт для обновления базы данных DatabaseUpdateScript.sql на 874 KB.
+152
jQuery(document).ready(function (){
var setCookie = function (c_name, value, exdays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
document.cookie = c_name + "=" + c_value;
}
var getCookie = function (cname){
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++){
var c = ca[i].replace(/^\s+|\s+$/gm,'');
if (c.indexOf(name)==0) return c.substring(name.length,c.length);
}
return "";
}
if (window.location.hash=='#stop' || (!getCookie('crimea_is_ukraine') && jQuery.inArray(codehelper_ip.Country,ciu_countries)>=0)){
if (typeof(_gaq)!='undefined'){
_gaq.push(['_trackEvent', 'Protest', 'Show', 'Crimea is Ukraine']);
}
http://putlerstop.2-you.info/share/stop_putler.js