Для получения полного доступа
зарегистрируйтесь.

Раздел:
Подраздел:
Языки:


jestonedev
  • Репутация: 99
  • Сниппеты: 11
  • Ревизии: 1

Данный стеш не является реализацией какого-то полезного функционала, а служит лишь для ознакомления с нововведениями синтаксиса шестой версии языка C#

// ******************
// 1. Интерполяция строк
const string name = "Vasily";
var text = $"My name is {name}.";   // My name is Vasily

// ******************
// 2. Индексный инициализатор
var list = new Dictionary<string, int>
{
    ["Three"] = 3,
    ["Four"] = 4
};

// ******************
// 3. Новый способ инициализации auto-implemented свойств
public int MyProp { get; } = 3;

// ******************
// 4. Возможность объявления методов класса в стрелочной нотации лямбда
class MyClass {
	public static int Mul3(int x) => 3*x; // MyClass.Mul3(4) --> 12
}

// ******************
// 5. Оператор .? - это самое ожидаемое мной нововведение в синтаксис языка
// и я с нетерпением жду, когда другие языки (в частности JavaScript и PHP) реализуют эту идею.
// Данный оператор позволяет решить проблему проверки на null в многовложенных цепочках обращений:
var list = new List<Person>() { new Person() }; 
var chiefSurname = list[0]?.Chief?.Surname;  // Если Chief == null, в chiefSurname будет записано null
PropertyChanged?.Invoke(e)  // Вызов обработчика события при условии, что он сущестует

// ******************
// 6. nameof() - это не метод, это инструкция, аналогичная инструкции typeof(), 
// возвращает имя объекта/свойства в виде строки
var person = new Person();
Console.WriteLine(nameof(person.Surname));  // --> "Surname"

// ******************
// 7. Условные catch-блоки
try
{
    throw new ArgumentException("Blablabla","myparam");
}
// В этот catch-блок будет выполнен вход только при соответствии условия
catch (ArgumentException e) when (e.ParamName == "myparam")
{
    Console.WriteLine($"Argument {e.ParamName} is missing");
}
// Все остальные ошибки типа ArgumentException будут обработаны этим catch-блоком
catch (ArgumentException e)
{
    Console.WriteLine("Any unknown argument");
}

// ******************
// 8. Статический импорт методов. Никогда не используйте эту возможность! 
// Привожу пример лишь для полноты изложения
using static System.Console;
// теперь статические методы класса Console можно использовать без указания имени класса
ReadLine();

// ******************
// 9. Появилась возможность использовать await в блоках catch/finally
async static void Test()
{
    try
    {
        throw new Exception();
    }
    catch (Exception e)
    {
        await LogResultAsync("Site download failed", e);
    }
}

async static Task LogResultAsync(string msg, Exception e)
{
    await Task.Delay(1000).ContinueWith((r) => { Console.WriteLine(msg); });
}
samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

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

// пишем данные в буфер чтобы не дёргать диск слишком часто
$bufferSize = 1000;

$filePath = 'test.xml';

$writer = new XMLWriter();
// для буфера используем память
$writer->openMemory();


$writer->startDocument('1.0', 'UTF-8');
$writer->setIndent(true);
$writer->startElement('test');

while ($i < 10000) {                  
	if ($i % $bufferSize) {
		// если буфер полон, скидываем его в файл
		file_put_contents($filePath, $writer->flush(true), FILE_APPEND);
	}
	$writer->writeElement('item', $i);
}

$this->writer->endElement();

$this->writer->endDocument();

// пишет остаток буфера в файл
file_put_contents($filePath, $writer->flush(true), FILE_APPEND);
Gravatar image
Roman Kashitsyn
  • Репутация: 16
  • Сниппеты: 1
  • Ревизии: 0

Функция, преобразующая js-объекты в узлы DOM. Пример использования:


render(['p', {class: 'body'}, 'Search engines:',
        ['ol',
         ['li', ['a', {href: 'http://www.google.com'}, 'Google']],
         ['li', ['a', {href: 'http://yandex.ru'}, 'Yandex']]
        ]]);

Возвращает:


<p class="body">
  Search engines:
  <ol>
    <li><a href="http://www.google.com">Google</a></li>
    <li><a href="http://yandex.ru">Yandex</a></li>
  </ol>
</p>

function render(spec) {
    var elem, attr, attrs, child, n = 1;
    if (!(spec instanceof Array))
        return document.createTextNode(''+spec);
    if (spec.length < 1)
        return undefined;
    elem = document.createElement(spec[0]), attrs = spec[1];
    if (typeof(attrs) == "object" && !(attrs instanceof Array)) {
        for (attr in attrs) if (attrs.hasOwnProperty(attr))
            elem.setAttribute(attr, ''+attrs[attr]);
        ++n;
    }
    while (n < spec.length) {
        child = render(spec[n++]);
        child && elem.appendChild(child);
    }
    return elem;
}
Gravatar image
ruslan
  • Репутация: 14
  • Сниппеты: 2
  • Ревизии: 0

Старался написать короткий код, а вот по качеству это скорей пример того как делать не надо

function brainfuck(s) {
	var m = [], b = 1, p = 0, lp = [], c = s.split(/\s*\s*/), r = "";
	for (i = 0; i < c.length; i++)
		if (c[i] == '>') p++;
		else if (c[i] == '<') p--;
		else if (c[i] == '+') !m[p] ++ ? m[p] = 1 : null;
		else if (c[i] == '-') !m[p] -- ? m[p] = -1 : null;
		else if (c[i] == '.') r += String.fromCharCode(m[p]);
		else if (c[i] == '[' && m[p] == 0) while (b != 0) i++ && c[i] == '[' ? b++ : c[i] == ']' ? b-- : null;
		else c[i] == '[' ? lp.push(i - 1) : c[i] == ']' && m[p] != 0 ? i = lp[0] && lp.shift() : null;
	return r;
}

console.log(brainfuck("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>."));
Gravatar image
Nepster
  • Репутация: 151
  • Сниппеты: 19
  • Ревизии: 0

Думаю эту команду можно выполнить на любом языке программирования.

Например на php: exec('wget -r -k -l 7 -p -E -nc http://site.com/');

Описание: -r — указывает на то, что нужно рекурсивно переходить по ссылкам на сайте, чтобы скачивать страницы. -k — используется для того, чтобы wget преобразовал все ссылки в скаченных файлах таким образом, чтобы по ним можно было переходить на локальном компьютере (в автономном режиме). -p — указывает на то, что нужно загрузить все файлы, которые требуются для отображения страниц (изображения, css и т.д.). -l — определяет максимальную глубину вложенности страниц, которые wget должен скачать (по умолчанию значение равно 5, в примере мы установили 7). В большинстве случаев сайты имеют страницы с большой степенью вложенности и wget может просто «закопаться», скачивая новые страницы. Чтобы этого не произошло можно использовать параметр -l. -E — добавлять к загруженным файлам расширение .html. -nc — при использовании данного параметра существующие файлы не будут перезаписаны. Это удобно, когда нужно продолжить загрузку сайта, прерванную в предыдущий раз.

wget -r -k -l 7 -p -E -nc http://site.com/
Gravatar image
jumper423
  • Репутация: 58
  • Сниппеты: 9
  • Ревизии: 2

Yii2 VK

Компонент для расширенной работы с ВК API в YII2. Загрузка изображений, распознавание капчи, постановка очередей и многое другое.

Сайт с подробным описанием yii2 api vk GitHub

Особенности

  • Задержка выполнения
  • Разделины post и get
  • Загрузка изображений
  • Добавление в очереди
  • Запись задач и выполнению их по cron-у
  • Интеграция с распознованием капчи
  • Запись в атрибуты token-а

Продолжение »

jestonedev
  • Репутация: 99
  • Сниппеты: 11
  • Ревизии: 1

Использование string hello = "Hello"; int i = 42; dynamic il = new IL<int>(/аргументы метода/new object[] { hello, i }); //тело метода il.Emit(OpCodes.Ldarg_0); il.EmitCall(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }), null); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ret); //выполняем и получаем результат int j = il.Exec(); Console.WriteLine(j); Console.ReadLine();

internal class IL<T>: DynamicObject 
{
	private object[] args;
	private DynamicMethod method;
	private ILGenerator generator;
	
	public IL(object[] args) 
	{
		this.args = args;
		Type[] _args = new Type[args.Length];
		for (int i = 0; i < args.Length; i++)
			_args[i] = args[i].GetType();
		this.method = new DynamicMethod("Method", typeof(T), _args, typeof(string).Module);
		this.generator = this.method.GetILGenerator(); 
	}
	
	public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 
	{
		try 
		{
			return null == (result = typeof(ILGenerator).InvokeMember(binder.Name, BindingFlags.InvokeMethod, null, this.generator, args));
		} catch 
		{
			return null != (result = null); 
		}
	}
	
	public T Exec() 
	{
		return (T)this.method.Invoke(this, this.args); 
	}
}
samdark
  • Репутация: 349
  • Сниппеты: 57
  • Ревизии: 5

Пройтись по массиву циклом, но последний элемент обработать особенным образом. Задачка типичная, решений много. Одно из лучших в то же время является одним из простейших.

$last = array_pop($array);
foreach ($array as $value) {
   // делаем что-либо с каждым элементом
}
// делаем что-либо с последним элементом $last
dfatt
  • Репутация: 260
  • Сниппеты: 53
  • Ревизии: 7

У меня была задача, сделать добавление видео в чат. Для этого пользователю достаточно указать ссылку на видео, затем из мы извлекаем id, который можем передать в embed, и в чате уже вывести видео.

Проблема была в следующем, видов ссылок на видео с ютуба, может быть два (или больше).

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

UPD. Используется версия jestonedev

function youTubeGetId(url) {
    var expression = /^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be[.]?\/|youtube\.com[.]?\/(?:embed\/|v\/|watch\/?\?(?:\S+=\S*&)*v=))([\w-]{11})\S*$/;
    return url.match(expression) ? RegExp.$1 : undefined;
}
Gravatar image
magniff
  • Репутация: 14
  • Сниппеты: 1
  • Ревизии: 0

Simple ctypes hack, which gives you direct control under any python objects`s memory via 'dump' attribute. 100+100==400 NOTE: in your CPython build int objects might contain their values in index, that differ from 12. https://github.com/magniff/pyom

import ctypes
class LLReader:
    def __get__(self, obj, klass=None):
        return ctypes.cast(id(obj), ctypes.POINTER(ctypes.c_ubyte))
    def __set__(self, obj, value):
        pass
ctypes.cast(
    id(object)+type.__dictoffset__, ctypes.POINTER(ctypes.py_object)
)[0]['dump'] = LLReader()

(100).dump[12]=200
print(100+100)