• Как в Telegram создать кнопку которая перекинет на чат с ботом?

    Ninazu
    @Ninazu Автор вопроса
    'url' => "https://telegram.me/{$botname}"
    Ответ написан
    Комментировать
  • Как сделать API на PHP?

    Ninazu
    @Ninazu
    Зачем такое API? Если мобильного разработчика не смущают запросы в базу данных, то ему никакой API не нужен, тем более что оно будет его так или иначе ограничивать
    Ответ написан
    Комментировать
  • Анонимность при использовании бота в Телеграм. Миф или реальность?

    Ninazu
    @Ninazu
    Бот - это обёртка над каким-то скриптом, у кого-то на сервере. Из того что пользователь отправляет по умолчанию это его username (его можно поменять в настройках на любой уникальный) и его user_id. А также ваша приватная переписка с ботом. Либо если бот состоит в одной группе с вами, то видит все сообщения в этой группе также как и остальные пользователи. Всё остальное изолированно, и бот не имеет доступа к каким либо
    смежным данным. Бот может предложить пользователю поделится его геолокацией, место встречи и его номером телефона (по умолчанию они для бота не доступны). Для этого пользователю нужно будет нажать на соответсвующую кнопку в диалоге с ботом. Доступные поля описаны в документации
    https://core.telegram.org/bots/api#contact
    После нажатия этой кнопки, сервер Telegram отправялет эти данные на сервер владельца бота (где тот может их сохранить к себе в базу данных к примеру). Поэтому очистка истории не поможет (информация уже улетела владельцу)
    С другой стороны, пользователь тоже не знает о боте (кому он принадлежит, на какой сервер обращается, по какому алгоритму работает). Хотя разработчик может сам описать контакты для связи и описание бота в соответсвующих полях.
    Возможен конечно сценарий, что Telegram сам выдаст данные о боте по запросу третьих лиц. Но он стремится к нулю, судя из того как разгоралось противостояние РосКомНадзора и Telegram, и того на что нацелен этот месенджер
    Ответ написан
    Комментировать
  • Какая реализация дерева лучше?

    Ninazu
    @Ninazu
    Все зависит от того зачем вам это дерево.
    1. Это Adjacency List, он хорош когда вам нужно часто писать в дерево и редко его читать.
    2. Это Nested Set, он хорош когда вам нужно часто читать дерево и редко в него писать.

    Для того чтоб построить часть дерева по первому варианту вам нужно либо вытаскивать ВСЕ записи из базы, и потом рекурсивно проходится по ним и строить его, либо писать встроенную процедуру для того чтоб рекурсия была на стороне базы данных. Также нужно следить чтоб не возникало циклических зависимостей в айдишниках

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

    Лично я использую первый вариант для дерева комментариев, а второй для меню сайта. Хотя деревья всегда есть смысл кэшировать.
    Ответ написан
    Комментировать
  • Как настроить моста в Linux, и почему может не работать DHCP?

    Ninazu
    @Ninazu Автор вопроса
    iptables v1.6.0: Can't use -i with POSTROUTING


    Как правильно назначить статический адрес для Pi?
    Пробовал так на ноуте
    ifconfig enp0s20u7 192.168.1.101/24
    Но не пингуется малина
    Ответ написан
    Комментировать
  • Можно ли в PHP "вывернуть" функцию в namespace который её вызвал?

    Ninazu
    @Ninazu
    Я бы настоятельно рекоммендовал не использовать глобальные переменные. Оберните всё в класс, с неймспейсом и используйте почеловечески. Всегда же можно создать статический метод который будет возвращать все нужные данные в любом месте где вам это потребуется
    Ответ написан
    Комментировать
  • Как комитить сразу в подмодули Git в PHPStorm?

    Ninazu
    @Ninazu Автор вопроса
    Разобрался.

    При создании дочернего модуля, PHPStorm адекватно все подхватил
    git submodule add git@github.com:ninazu/framework.git ./vendor/ninazu/framework
    git commit -m "#addSubModule"
    git push


    А вот если нужно выкачать репозиторий с подмодулем, то пришлось немного потанцевать.
    cd ./vendor/ninazu/framework
    git submodule update --init --recursive
    git submodule update --recursive --remote


    Дальше переходим к настройкам PHP Storm

    Указать путь к подмодулю
    File -> Settings -> Version Control -> Add -> Directory


    Пофиксить локальную ветку
    VCS -> Git -> Branches -> Repositories -> framework -> LocalBranches -> Checkout


    Ну и обновить проект
    VCS -> UpdateProject
    Ответ написан
    Комментировать
  • Зачем нужны интерфейсы в golang?

    Ninazu
    @Ninazu
    Сам искал ответа на этот вопрос. И вдохновившись примером с лампочками, таки разобрался)

    Пусть тут полежит для потомков
    package main
    
    import "fmt"
    
    type LampDiode struct{}
    
    func (l *LampDiode) ScrewOn() string {
    	return "Lamp 1"
    }
    
    type LampIncandescent struct{}
    
    func (l *LampIncandescent) ScrewOn() string {
    	return "Lamp 2"
    }
    
    type Lamp interface {
    	ScrewOn() string
    }
    
    func Chandelier(l Lamp) {
    	fmt.Println(l.ScrewOn())
    }
    
    func main() {
    	var l1 Lamp
    	l1 = new(LampDiode)
    	Chandelier(l1)
    
    	var l2 Lamp
    	l2 = new(LampIncandescent)
    	Chandelier(l2)
    }
    Ответ написан
    Комментировать
  • Как сконкатенировать строку в VirtualDocumentRoot?

    Ninazu
    @Ninazu Автор вопроса
    Как два варианта которые меня менее устраивают, и хотелось бы разобраться всё же с конкатенацией

    1. Создать папку хранящую подобные сайты
    test.web ->/var/www/_custom_/test/web/index.php
    VirtualDocumentRoot "/var/www/_custom_/%-2+/%-1"

    2. Доменное имя содержало суффикс
    test.loc.web ->/var/www/test.loc/web/index.php
    VirtualDocumentRoot "/var/www/%-2+/%-1"
    Ответ написан
    Комментировать
  • Key/Value хранилище для больших объемов для работы с под PHP ?

    Ninazu
    @Ninazu
    Задача аналогичная, поэтому создавать новый топик не стал. У меня картина немного отличается, но суть та же.

    Сейчас база 200млн+ записей в MySQL, Тип поля VARCHAR(50). Таблица состоит из одного PK, нужно просто хранить все уникальные значения.
    Сейчас весит 12Гб + 46Гб индексы)

    Оперативки на сервере мало 512Мб, на диске тоже 32Гб, Сейчас база лежит на локальной машине, с проброшенным портом, так как на хост не влазит. Нужно какое-то менее прожорливое решение. Возможно какая-то key/value база или лучше вообще без value, только ключ.

    С возможностью поиска по базе пачками. Сейчас вытягиваю по
    IN (?,?, ....),
    и втавляются через
    INSERT IGNORE
    Ответ написан
    Комментировать
  • Как правильно сделать выборку из БД?

    Ninazu
    @Ninazu
    <?php
    
    #region DB Connection
    
    $dbName = "test";
    $dbHost = "127.0.0.1";
    $dbUser = "root";
    $dbPassword = "";
    $dbCharset = 'UTF8';
    $connection = new PDO("mysql:host={$dbHost};dbname={$dbName};charset={$dbCharset}", $dbUser, $dbPassword);
    
    #endregion
    
    #region Pagination
    
    $limit = empty($_GET['limit']) ? 10 : ((int)$_GET['limit']);
    $offset = empty($_GET['page']) ? 0 : (($_GET['page'] - 1) * $limit);
    
    #endregion
    
    #region GetTypes
    
    $query = "	SELECT
    				`id`,
    				`type`
    			FROM `type`";
    $result = $connection
    	->query($query)
    	->fetchAll(PDO::FETCH_ASSOC);
    $types = array_combine(array_column($result, 'id'), array_column($result, 'type'));
    
    #endregion
    
    #region GetVIIII
    
    $query = "	SELECT
    				`id`,
    				`added_date`,
    				`title`,
    				`type`
    			FROM `viiii` 
    			ORDER BY `id`
    			LIMIT {$offset},{$limit}";
    
    $result = $connection
    	->query($query)
    	->fetchAll(PDO::FETCH_ASSOC);
    
    #region Render
    
    $output = "<table>";
    
    foreach ($result as $row){
    	$typeList = explode(',',$row['type']);
    	$typeList = array_intersect_key($types, array_flip($typeList));
    	$threatType = implode(", ", $typeList);
    	$output.="	<tr>
    					<td>{$row['added_date']}</td>
    					<td>{$row['title']}</td>
    					<td>{$threatType}</td>
    				</tr>";
    }
    
    $output.= "</table>";
    
    echo $output;
    
    #endregion


    Но я бы рекоммендовал вам хранить тип в смежной таблице. В будущем будет меньше проблемм.
    Ответ написан
    Комментировать
  • Про cocos2d-x & javascript что почитать?

    Ninazu
    @Ninazu
    Да нехватка инфы на русском, да и на английском не так уж и много как хотелось бы. Тормозит рост комьюнити.

    Поднял форум.
    cocos2d.info

    Только его наполнять некому. Для начала можно оставлять свои наработки какие-то, а потом гляди и народ подтянется
    Ответ написан
    Комментировать
  • Чем отличаются ОП коды от Байт кодов php?

    Ninazu
    @Ninazu
    Operation Code - Число которое представляет одну команду. К примеру ADD, LOAD и т.д.
    Byte Code - Представление в виде последовательности байт и является аппаратно независимым. Выполняется с помощью интерпретатора.

    Также существует машинный код, который уже привязан к определённой платформе. И как правило в него переводят из опкодов и байткодов
    Ответ написан
  • Как склеить 2 файла в 1?

    Ninazu
    @Ninazu
    А база данных, не вариант? Зачем этот велосипед?
    sqlfiddle.com/#!9/9b7f4/2/0

    CREATE TABLE IF NOT EXISTS `first` (
      `name` varchar(50) CHARACTER SET utf8 NOT NULL,
      `key` varchar(50) CHARACTER SET utf8 NOT NULL,
      KEY `key` (`key`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    CREATE TABLE IF NOT EXISTS `second` (
      `key` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
      `value` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
      KEY `key` (`key`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    INSERT INTO `first` (`name`, `key`) VALUES
    	('color', 'green'),
    	('color', 'red'),
    	('color', 'blue');
    
    INSERT INTO `second` (`key`, `value`) VALUES
    	('green', 'apple'),
    	('red', 'cherry'),
    	('blue', 'sky');
    
    SELECT 
    	CONCAT(f.`name`,':',s.value) AS result,
    FROM `first` AS f
    	INNER JOIN `second` AS s ON s.`key` = f.`key`;
    Ответ написан
    Комментировать
  • Почему форма не отправляется на email?

    Ninazu
    @Ninazu
    Я думал в 2016 уже такой код не пишут) Аж вена где-то в голове лопнула. Может всё таки какой-то легковесный фреймворк поставите(Лично мне нравится Yii2)? Тут вам и Sanitize и MVC и SMTP
    А из готовых библиотек
    swiftmailer.org/download
    Ответ написан
    Комментировать
  • Как разлогиниться в ВКонтакте через API?

    Ninazu
    @Ninazu
    $('#logout_link').href
    
    или
    
    $('.mmi_logout a').href
    
    или
    
    VK.Auth.logout()
    
    или просто забудьте токен)
    Ответ написан
    Комментировать
  • Как найти следующий ключ в массиве?

    Ninazu
    @Ninazu Автор вопроса
    Алексей: Спасибо. Последовательность не слетает.

    function searchKey($keyName, $sourceArray) {
    	if (!(is_string($keyName) || is_numeric($keyName)) || !isset($sourceArray[$keyName])) {
    		return null;
    	}
    
    	$keys = array_keys($sourceArray);
    	$nextScenario = @$keys[array_search($keyName, $keys) + 1];
    
    	return $nextScenario;
    }
    Ответ написан
    Комментировать
  • Как выбрать записи из MongoDB в Yii2?

    Ninazu
    @Ninazu Автор вопроса
    Что-то я еще не проснулся) Если кому-то нужно будет. То решение такое)
    Params::find()->where([
    	'params' => [
    		'$elemMatch' => [
    			'scheduler_settings' => [
    				'$ne' => array()
    			]
    		]
    	]
    ])->all();
    Ответ написан
    Комментировать
  • Можно ли сделать свою автоподстановку в зависимости от контекста в PhpStorm?

    Ninazu
    @Ninazu
    Думаю вам нужно использовать не массив а обьект. Тогда всё взлетит)

    /**
     * @property string $key;
     * @property string $foreign_key;
     * @property string $repository;
     */
    class Helper {
    
    	private $data;
    	
    	public function __construct($data) {
    		$this->data = $data;
    	}
    
    	public function __set($name, $value) {
    		$this->data[$name] = $value;
    	}
    
    	public function __get($name) {
    		return isset($this->data[$name]) ? $this->data[$name] : null;
    	}
    }
    
    $test = new Helper(array(
    	'key'=>12,
    	'foreign_key'=>'id',
    	'repository'=>'',
    ));
    
    echo $test->key;
    $test->key = '23';
    echo $test->key;


    Ну или явно перечислить классы в доке

    class C1 {
    
    	public $name;
    }
    
    class C2 {
    
    	public $age;
    }
    
    class Helper {
    	/**
    	 * @var C1|C2
    	 */
    	public static $app;
    }
    
    
    Helper::$app->age
    Ответ написан
    Комментировать