• Возможно ли обновлять строки, защищенные Row Level Security, не будучи superuser?

    @galaxy
    Ну тут у вас не работает конкретно потому, что UPDATE с WHERE также смотрит на политику для SELECT применительно в том числе и к обновленной строке (в документации мутновато, но это упомянуто).

    Вообще, на мой взгляд, вы не тот инструмент выбрали. Вьюха + триггеры будет понятнее и надежнее.
    Ответ написан
    1 комментарий
  • Можно ли программно создать беспроводную локальную сеть/точку доступа к ней с Android устройства?

    @lomikman
    вот метод который отвечает за включение беспроводной точки из официальных сорцов android
    https://github.com/android/platform_packages_apps_...
    https://github.com/android/platform_packages_apps_...

    stackoverflow.com/questions/3436280/start-stop-bui...
    идея заключается в том чтобы его вызвать этот метод
    это неофициально и нет никаких гарантий что сработает на многих устройствах
    Ответ написан
    Комментировать
  • Как вытащить значение переменной из вложенного await вызова async функции в ES7?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    я не 100% не уверен но... из того что вы написали:

    returns Promise if no callback passed


    вам надо убрать колбэк. По поводу обработки ошибок из спецификации async-functions мы должны переписать функцию так:

    async userExistsInDB(email) {
        let userExists; 
        try {
             const db = await MongoClient.connect('mongodb://127.0.0.1:27017/notificator');
        } catch (err) {
             throw err; // тут у вас никакой обработки ошибок небыло... можно и без try/catch тогда
        }
    
        const collection = db.collection('users');
        userExists = await collection.find({email: email}).limit(1).count() > 0;
        console.log("INSIDE:\n", userExists);
        db.close();
        
        console.log("OUTSIDE:\n", userExists);
        return userExists;
    }


    код в дальнейшем можно еще упростить. Суть в том что при использовании await нет смысла в колбэках. Все происходит синхронно (с точки зрения потока управления, блокировок конечно же не будет).
    Ответ написан
    1 комментарий
  • Минимум для Junior RoR?

    insiki
    @insiki
    broken pipe
    webils.ru/app/guest/?id=7341

    Вдобавок к ссылке выше:
    1. Rails 4. Гибкая разработка веб-приложений
    (Лично часто обращаюсь к 3-й главе, если есть вопросы)
    2. Статьи и сайт (он же на русском) покрывают практически все возникающие вначале вопросы. Углубляясь, чаще идем на apidock.com/rails и api.rubyonrails.org
    3. На 100% этих скринкастов всего 1-2% несостыковок по синтаксису.
    4. Также, если вы житель Санкт-Петербурга (или планируете переехать), можно записаться на этот отличный курс по RoR, если из другого города, то вот отличная площадка для обучения.

    ps:
    Не забываем про Convention over configuration - https://github.com/styleguide/ruby
    Ну и еще, не забываем, что Rails это Ruby - Крис Пайн - "Учись программировать"

    Список курсов по Ruby и отзывов.
    rubycourses.ru
    Ответ написан
    Комментировать
  • Синтаксический анализатор if-else конструкции на основе контекстно свободной грамматики в БНФ?

    @so-olitary
    1) Да, ты правильно построил БНФ - там нет ничего сверхъестественного.
    Только вот это Expression := Expression;, в общем говоря, всё-таки неверно, т.к. нельзя присвоить: a + b = 5.
    И на мой вкус:
    Expression := Expression | ID=Expression
    Block := Expression; | Expression; Block
    ArrayExpression := { Block }
    BoolExp, как и в С, можно отдельно не выделять, 0 - false, !0 - true


    2) Можно использовать готовый синтаксический анализатор, который разбивает на токены сам по сгенерированным тобой правилам (yacc, bison), можно писать вручную.
    3) Как вручную:

    Я писал в своё время интерпретатор языка программирования.
    БНФ - есть алгоритм - собственно как ты будешь парсить файл. Можешь смотреть на свою структуру, она описывает всевозможные варианты того, что ты можешь увидеть в файле с программой. Читаешь по файлу и проверяешь, что ты оказался прав.

    Сначала регулярными выражениями выдели "токены", что у тебя есть "слово языка":
    1. (\d)+ - Integer
    2. \w (\w | \d )* - identificator
    3. + | - | * | / | % | := | < | > | <= | >= | != | == | ( | )  | ... - arithmetic sign
    4. ; | [ | ] | { | } | ... - separators


    Приступай к разбору:
    Введи понятие функционального оператора, а также понятие ID, которое включает в себя имя переменной или обращание к массиву, как единый "токен" с числовым значением (или Expression) внутри [...].
    Рассматривай файл, как подряд идущие инструкции языка.
    Сначала ты должен понять в какой из них ты находишься - это (1) объявление переменной, (2) арифметическое выражение, (3) условный оператор. Как это понять? Просто читай подряд по словам. например:
    1. если это if - то за ним
    (а) идёт ( Expression ) - это какое-то арифметическое выражение:
    Первое, что с ним нужно делать - это избавиться от скобок и пересобрать в последовательность операций для выполнения, имея в виду приоритеты операций. Проще всего это сделать переведя в польскую аннотацию, делается это при помощи стека - можешь в википедии посмотреть алгоритм. Смысл: (a + b) * c + d = +*+abcd.

    Хотя тебе не надо выполнять программу, я всё-таки рекомендую переводить в польскую нотацию - так ты сможешь проверить корректность арифм.выражения и понять, где оно завершилось.
    Либо можно придумать какие-то правила чтобы это понять, непример: не может быть 2 знака подряд (кроме унарного оператора), ... но так ИМХО сложнее.

    (b) затем за ним идёт Expression | ArrayExpressions, их тоже парсишь.
    (в) может быть Else или следующая инструкция
    И так далее.
    Ответ написан
    1 комментарий
  • Как реализовать таймер, работающий на массиве дат?

    timych
    @timych
    Вот наваял (надеюсь что правильно понял задачу):
    package application;
    
    import java.text.DateFormat;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Locale;
    import java.util.Timer;
    import java.util.TimerTask;
    
    /**
     * @author Timur Nikiforov
     */
    public class Clazz {
    
    	private Timer dateTimer;
    
    	private Timer remainderTimer;
    
    	private Date nextDate;
    
    	private boolean remainderTimerStarted;
    	
    	private static final long REMINDER_UPDATE_INTERVAL = 1000; 
    
    	private static final String[] DATES = { "12.04.2015 19:56", "12.04.2015 19:57", "12.04.2015 19:58" };
    
    	private int currentIndex;
    
    	public Clazz() {
    		dateTimer = new Timer();
    	}
    
    	public static void main(String[] args) {
    		Clazz instance = new Clazz();
    		instance.run();
    	}
    
    	private void run() {
    		nextDate = parseDate(DATES[currentIndex]);
    		schedule();
    	}
    
    	public void schedule() {
    		runSecondsCounter();
    		dateTimer.schedule(new TimerTask() {
    
    			@Override
    			public void run() {
    
    				System.out.println("Current date is:" + new Date());
    				currentIndex++;
    				if (currentIndex < DATES.length) {
    					nextDate = parseDate(DATES[currentIndex]);
    					System.out.println("Next date is:" + nextDate);
    					schedule();
    				} else {
    					remainderTimer.cancel();
    				}
    			}
    		}, nextDate);
    
    	}
    
    	private Date parseDate(String nextDate) {
    		Date date = null;
    		DateFormat format = new SimpleDateFormat("dd.MM.yyyy HH:mm",
    				Locale.ENGLISH);
    		try {
    			date = format.parse(nextDate);
    		} catch (ParseException e) {
    			e.printStackTrace();
    		}
    		return date;
    	}
    
    	private void runSecondsCounter() {
    		if (remainderTimerStarted) {
    			remainderTimer.cancel();
    		}
    
    		remainderTimer = new Timer();
    		remainderTimer.scheduleAtFixedRate(new TimerTask() {
    
    			@Override
    			public void run() {
    				remainderTimerStarted = true;
    				long remains = nextDate.getTime() - new Date().getTime();
    				System.out.println("Remains: " + (remains / 1000) + " seconds");
    			}
    		}, REMINDER_UPDATE_INTERVAL, REMINDER_UPDATE_INTERVAL);
    	}
    }


    Разберетесь без комментов?
    Ответ написан
    1 комментарий