Skip to content

Instantly share code, notes, and snippets.

View bbars's full-sized avatar

Denis Borzenko bbars

  • St. Petersburg, Russia
View GitHub Profile
function validateLuhn(value) {
if (!/^\d+$/.test(value))
return false;
value = (value + '').split('').reverse();
var sum = 0, d, i;
for (i = 0; i < value.length; i++) {
d = +value[i];
if (i % 2) {
d = (d *= 2) > 9 ? d - 9 : d;
IAB1 Arts & Entertainment
IAB1-1 Books & Literature
IAB1-2 Celebrity Fan/Gossip
IAB1-3 Fine Art
IAB1-4 Humor
IAB1-5 Movies
IAB1-6 Music
IAB1-7 Television
IAB2 Automotive
IAB2-1 Auto Parts
create function find_in_set_delim(_item text, _set longtext, _delim varchar(4))
returns boolean deterministic
return locate(concat(_delim, _item, _delim), concat(_delim, _set, _delim)) > 0;
create function geo_distance(_lat1 double, _lng1 double, _lat2 double, _lng2 double)
returns int deterministic
comment "Returns distance in meters"
return 12756274 * asin(sqrt( -- 2 * R; R = 6378137 m
0.5 - cos((_lat2 - _lat1) * 0.017453292519943295) / 2 -- 0.017453292519943295 = Math.PI / 180
+ cos(_lat1 * 0.017453292519943295) * cos(_lat2 * 0.017453292519943295)
* (1 - cos((_lng2 - _lng1) * 0.017453292519943295)) / 2
));
@bbars
bbars / object-enable-chaining.js
Last active August 15, 2018 19:35
Example: Object.enableChaining(context2d) .setFillStyle('#333') .fillRect(0, 0, 30, 30) .rect(5, 5, 20, 20) .setFillStyle('#f90') .fill()
Object.enableChaining = function (obj) {
if (!obj || typeof obj !== 'object')
throw new TypeError("Argument obj is not an Object");
var names = {};
var protos = [];
var cur = obj;
var descr;
while (cur && protos.indexOf(cur) < 0) {
descr = Object.getOwnPropertyDescriptors(cur);
for (var k in descr) {
@bbars
bbars / mysql-base64.sql
Last active August 16, 2018 11:58
MySQL base64 custom implementation (as of version 5.6+ there are native ones: https://dev.mysql.com/doc/refman/5.6/en/string-functions.html#function_from-base64)
-- drop function if exists base64_encode;
create function base64_encode(_data blob)
returns text
begin
declare _alphabet char(64) default 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
declare _lim int unsigned default length(_data);
declare _i int unsigned default 0;
declare _chk3 char(6) default '';
declare _chk3int int default 0;
declare _enc text default '';
@bbars
bbars / mysql-createTableLog.sql
Last active October 4, 2018 14:29
Generate queries (which you may want to execute manually) to enable trigger-based table logging for insert, update, delete queries
-- drop function if exists createTableLog;
create function createTableLog(tableName varchar(128), logDatabaseName varchar(128), logTableName varchar(128))
returns text
begin
set logDatabaseName := if(logDatabaseName != '', logDatabaseName, database());
select
concat('`', group_concat(column_name separator '`, `'), '`'),
concat('NEW.`', group_concat(column_name separator '`, NEW.`'), '`'),
concat('OLD.`', group_concat(column_name separator '`, OLD.`'), '`')
into @names, @newNames, @oldNames
<?php // I don't know why anybody may need it
class Promise {
protected $resolvers = [];
protected $catchers = [];
protected $value = null;
protected $error = null;
protected $status = 'idle';
public function __construct($run, $manualStart = false) {
@bbars
bbars / spherebot_spindle_centering.js
Created January 21, 2019 17:24
Centering formula for spindle in 12-holes sphere of Spherebot
function p2d(a, r) {
return [
r * Math.cos(a),
r * Math.sin(a),
];
}
function p_distance(a0, r0, a1, r1) {
var d0 = p2d(a0, r0);
var d1 = p2d(a1, r1);
Function.prototype.expectResult = async function expectResult(interval, timeout, expectValue) {
if (interval <= 0)
interval = 1000;
var fn = this;
var timeStart = Date.now();
var tries = 0;
function check() {
var value, error, asExpected;
try {
value = fn();