Не верно выставляется высота пейджера в free-jqgrid
А именно, получается что-то вроде:
Решение: а нетривиальное, так просто и не догадаешься — оказывается это может быт, из-за не проставленного тэга в начале страницы
Жизнь замечательных грибов
Архив статей и записей написанных Грибовым Павлом
А именно, получается что-то вроде:
Решение: а нетривиальное, так просто и не догадаешься — оказывается это может быт, из-за не проставленного тэга в начале страницы
Руководство от Гугла для ознакомления. Делано собственно по нему.
1) Включаем в своем аккаунте доступ к Google Sheets API. Сделать это можно прямо на странице «Руководство от Гугла«:
Получаем ID, секрет и файл credentials.json который сохраняем туда, где будет лежать основной скрипт
2) При помощи composer добавляем необходимые библиотеки
1 2 |
composer require google/apiclient:^2.0 composer update |
3) Создаем таблицу в гуглодокументах и узнаем её ID — можно взять прямо из URL. Так-же даем доступ «всем вподряд по ссылке»
4) Создаем следующего вида файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
<?php require 'vendor/autoload.php'; if (php_sapi_name() != 'cli') { throw new Exception('This application must be run on the command line.'); } /** * Returns an authorized API client. * @return Google_Client the authorized client object */ function getClient(){ $client = new Google_Client(); $client->setApplicationName('Google Sheets API PHP Quickstart'); $client->setScopes(Google_Service_Sheets::SPREADSHEETS); $client->setAuthConfig('credentials.json'); $client->setAccessType('offline'); $client->setPrompt('select_account consent'); // Load previously authorized token from a file, if it exists. // The file token.json stores the user's access and refresh tokens, and is // created automatically when the authorization flow completes for the first // time. $tokenPath = 'token.json'; if (file_exists($tokenPath)) { $accessToken = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($accessToken); } // If there is no previous token or it's expired. if ($client->isAccessTokenExpired()) { // Refresh the token if possible, else fetch a new one. if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); } else { // Request authorization from the user. $authUrl = $client->createAuthUrl(); printf("Open the following link in your browser:\n%s\n", $authUrl); print 'Enter verification code: '; $authCode = trim(fgets(STDIN)); // Exchange authorization code for an access token. $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); $client->setAccessToken($accessToken); // Check to see if there was an error. if (array_key_exists('error', $accessToken)) { throw new Exception(join(', ', $accessToken)); } } // Save the token to a file. if (!file_exists(dirname($tokenPath))) { mkdir(dirname($tokenPath), 0700, true); } file_put_contents($tokenPath, json_encode($client->getAccessToken())); } return $client; } // Get the API client and construct the service object. $client = getClient(); $service = new Google_Service_Sheets($client); // Prints the names and majors of students in a sample spreadsheet: // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit $spreadsheetId = 'аыукаыука-HW95_v_xwJ-U_L2Xc'; $range = 'Sheets1!A2:A'; $response = $service->spreadsheets_values->get($spreadsheetId, $range); $values = $response->getValues(); var_dump($values); if (empty($values)) { print "No data found.\n"; } else { print "Name, Major:\n"; foreach ($values as $row) { // Print columns A and E, which correspond to indices 0 and 4. printf("%s\n", $row[0]); } }; $values = [ ["2016-02-12", "5453 543543", "=C2+C3"], ["2017-02-12", "5453 543543", "=C2+C3"], ["2018-02-12", "5453 543543", "=C2+C3"], ]; $body = new Google_Service_Sheets_ValueRange( [ 'values' => $values ] ); // valueInputOption - определяет способ интерпретации входных данных // https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption // RAW | USER_ENTERED $options = array( 'valueInputOption' => 'RAW' ); $service->spreadsheets_values->update( $spreadsheetId, 'Sheets1!A13', $body, $options ); |
,где в переменной $spreadsheetId указываем id таблицы.
5) Запустим скрипт из командной строки. Он предложит открыть ссылку которую выведет на экран. По переходу по ссылке будет показан стандарный диалог «Бал-бла- Разрешить?». Разрешаем. На экран выведется токен. Его нужно будет скопировать в консоль.
После чего снова запускаем скрипт, и в таблице в конец последних заполненных ячеек добавятся данные.
Ситуация: есть доступ к граничному шлюзу локальной сети по SSH. Но нет VPN..А удаленно подключится по RDP к машинке хочется.
Решение: создаем SSH туннель, например как-то так:
1 |
ssh -f -N -L 8888:192.168.1.100:3389 vasya@92.168.0.71 |
, где 192.168.1.100 — это машина с RDP «на том конце», 92.168.0.71 — шлюз с доступом по SSH
Далее остается подключится например remminой на 127.0.0.1:8888
Неожиданно при попытке обновления вылезла такая ошибка. Гугленье давало противоречивые результаты. Как лечил?
1) Достал оригинальный cf файл от релиза совпадающего с тем, который хотел обновлять (orig.cf)
2) Выгрузил в файл cf текущую конфигурацию (cur.cf)
3) Создал Новую БД, загрузил в неё orig.cf, объеденил, предварительно сняв с поддержки, с cur.cf, выгрузил файл cur_orig.cf
4) В текущую базу БД загрузил файл cur_orig.cf
5) Поставил на поддержку, изменив комментарий в любом реквизите, и обьеденив с конфигурацией orig.cf Перед началом объединения будет вопрос «поставить на поддержку?». Отвечаем Да, и выбираем галочки «Объект редактируется с сохранением поддержки»
6) Штатно обновил до следующего релиза..
Надеюсь косяков и глюков не будет.. Сильно надеюсь…