Thursday, December 23, 2021

ทดสอบสร้าง docker base on LAMP

Env HOST

  • Ubuntu 21.10
  • MySQl 8
  • PHP 8

Step

  • ติดตั้ง docker service และ docker-compose ให้เรียบร้อย

$ sudo apt install docker docker-compose

  • start docker service และ กำหนดมันให้เป็น service จะได้ start ตอนบูตระบบทุกครั้ง ด้วยคำสั่ง

$ systemctl enable --now docker

  • เตรียม folder project เราจะไปสร้างไว้ที่ home ของ user เราใช้งานปัจจุบันโดย

  • สร้าง directory ใหม่แบบ พาธเลย โดยใช้ option p (ในที่นี้เรายังไม่มี linuxconfig และ www folder ถ้าเราไม่ใช้ -p มันจะบอกว่าไม่พบ folder linuxconfig แบบนี้แหละ)

$ cd ~ && mkdir -p linuxconfig/www

  • จากนั้นสร้างไฟล์ docker-compose ไว้พาธนี้

$ nano linuxconfig/docker-compose.yml

  • เพิ่มประมาณนี้ในไฟล์

  • จากนั้นสร้าง Dockerfile อีกอันเอาไว้แก้ปัญหา php mysql driver การเชื่อมต่อระหว่าง php กับ mysql

$ nano linuxconfig/Dockerfile

  • จากด้านบน เราสร้าง container 3 อัน (services 3 ชื่อ www, database, phpmyadmin) โดยทำ link ให้ container เห็นกันได้เลย
  • สร้างไฟล์ทดสอบ phpinfo โดย

$ echo "<?php phpinfo();" > ~/linuxconfig/www/index.php

  • จากนั้นสั่งให้ build container ทั้งหมดผ่าน docker-compose โดยคำสั่ง

$ cd linuxconfig && sudo docker-compose up -d

  • เพิ่มเติมใส่ -d เพราะทำให้มันเป็น daemon (background service สั่งรันคำสั่งนี้แล้วสามารถ รับคำสั่งอื่นต่อไปด้าน โดยไม่แสดง output ของ service นี้)
  • รันได้ไม่มีปัญหาก็จะแสดง done ประมาณนั้น
  • ทดสอบโดยเข้า http://host_ip:8001/index.php

Note

  • คำสั้งสำหรับ stop project ของเรา

$ sudo docker-compose stop

  • คำสั่งในกรณีเราแก้ docker-compose.yml หรือ แก้ Dockerfile เราต้อง build container ใหม่ด้วยคำสั่ง

$ sudo docker-compose up -d --build
  • อธิบายคอนฟิกที่สำคัญ

command: --default-authentication-plugin=mysql_native_password 

  • เอาไว้แก้ไขปัญหานี้

the server requested authentication method unknown to the client [caching_sha2_password]

  • ส่วนที่เราต้องมี Dockfile เอาไว้เพิ่มคำสั่ง load library ที่จำเป็นสำหรับ php library mysql pdo
  • ในไฟล์ docker-compose เราจะเห็น build: . คือ ตัว service www เราจะมีการเรียก Dockerfile ใน path ปัจจุบันที่มันทำงานอยู่ด้วย 
  • อีกเรื่องใน dockerfile มีคำสั่งแบบนี้ RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" 
  • เอาไว้แก้ปัญหาเรื่อง json response มี php warning ออกมาด้วย มันจะ ajax error เป็นการใช้ php.ini ด้วย production config ไปเลย คล้ายกับ php framework ที่เปิดใช้งาน production env นั่นแหละคับ

Ref

  • https://linuxconfig.org/how-to-create-a-docker-based-lamp-stack-using-docker-on-ubuntu-20-04
  • https://blog.devgenius.io/docker-php-pdo-mysql-how-to-8c0aee437539 
  • https://javakoon.blogspot.com/2020/11/docker-compose-lamp-stack-linux-apache.html
  • https://arnondora.in.th/docker-tip-lamp-stack-docker/
  • https://medium.com/touch-technologies/%E0%B8%97%E0%B8%B3%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B8%A3%E0%B8%B9%E0%B9%89%E0%B8%88%E0%B8%B1%E0%B8%81-docker-compose-b6688fc98c6f
  • https://medium.com/@somprasongd/docker-compose-%E0%B8%84%E0%B8%B7%E0%B8%AD-fc8b35e0c8bc
  • https://sysadmin.psu.ac.th/2017/09/19/get-started-with-docker-part-11-docker-compose-ldap-services/


Wednesday, December 15, 2021

Set static ip Ubuntu Server 21.10

Env

  • Ubuntu 21.10 in Vbox and set bridge network

Solved

  • ก่อนแก้คอนฟิก ควรสำรองไว้ก่อน

$ sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.old

  • จากนั้นเริ่มคอนฟิกได้

$ sudo vim /etc/netplan/00-installer-config.yaml

  • และกดปุ่ม  i สำหรับ vim edit แบบ insert
  • ค่าเริ่มต้นจะประมาณนี้


  • แก้ไขโดยไม่รับ ip จาก dhcp เปลี่ยนจาก true เป็น no
  • และกำหนดค่า ip, gateway, dns จะได้ประมาณนี้

  • จากนั้น save ไฟล์ให้เรียบร้อย (Esc => Shift + : => พิมพ์ wq 
  • ตัวอย่างคือ กำหนด static ip เป็น 192.168.1.85
  • สุดท้าย apply change ด้วยคำสั่ง

$ sudo netplan apply

เพิ่มเติม

  • ที่ต้องใช้ vim หรือ vi มันจะแก้ปัญหาเรื่อง เว้นวรรค (indent) สำหรับแต่ละบรรทัด เราต้องวรรคให้ถูก format เค้ามันจะคล้ายกับ python เลย อันใหนเป็นซับของอะไรประมาณนั้น
  • การเว้นวรรคแนะนำให้ใช้ tab ไม่ควรใช้ spacebar

Ref

  • https://linuxconfig.org/how-to-configure-static-ip-address-on-ubuntu-18-10-cosmic-cuttlefish-linux
  • https://linuxize.com/post/how-to-configure-static-ip-address-on-ubuntu-20-04/

Monday, December 13, 2021

Enable userdir mod Ubuntu 21.10

Env

  • Ubuntu 21.10 in Vbox
  • and set bridge network 
Enable userdir mod

$ sudo a2enmod userdir
$ sudo systemctl restart apache2
$ mkdir ~/public_html
$ chmod 711 /home/user1
$ chmod 755 /home/user1/public_html
$ echo "hello world" >> ~/public_html/index.html  

Exam

  • http://localhost/~user1/index.html
ปัญหาหลังจาก enable userdir mod
  • http://localhost/~user1/index.php 
  • มันรันไฟล์ php ไม่ได้ engine php ไม่ทำงานสำหรับ mod นี้หว่า
  • แก้ปัญหาโดย (ในอ้างอิงเค้าบอกเป็นพาธนี้ /etc/apache2/mods-enabled/php5.conf แต่ของเราใช้อีกพาธเพราะ php หรือ ubuntu คนละเวอร์ชั่นหว่า)
$ sudo nano /etc/apache2/mods-available/userdir.conf
  • แก้ไข php_admin_value engine จาก Off เป็น On 
<IfModule mod_userdir.c>
    <Directory /home/*/public_html>
        php_admin_value engine On
    </Directory>
</IfModule>
  • หรือในคอนฟิกไม่มีค่านี้ ก็เพิ่ม php_admin_value engine On  เข้าไปใน tag directory ดังตัวอย่าง
  • สุดท้ายก็ restart apache service ซะหน่อย
$ /etc/init.d/apache2 restart

Ref

  • https://www.server-world.info/en/note?os=Ubuntu_21.04&p=httpd&f=4
  • http://devplant.net/2010/05/04/linux-php-not-working-in-userdir-public_html/
  • https://stackoverflow.com/questions/35928184/php-in-userdir-not-working

Ubuntu 21.10 set allow remote access to MySQL

  • อันนี้กล่าวถึง mysql นะ ไมใช่ mariadb  คอนฟิกพาธ ของ 2 ตัวนี้ อาจอยู่คนละที่กันแล้วแต่ version อีกต่างหาก
  • ติดตั้ง MySQL (คำสั่งด้านล่างจะไม่ระบุเวอร์ชั่น คือ มันจะเอาเวอร์ชั่น ล่าสุดของระบบ Ubuntu)

sudo apt install mysql

  • ในที่นี้ ubuntu 21.10  MySQL 8 แก้ไขที่

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

  • หาคอนฟิกประมาณนี้ (ค่าเริ่มต้นคือ อนุญาตให้  ip loopback เชื่อมต่อได้เท่านั้น)

bind-address  = 127.0.0.1

  • เราจะเปิดให้ client ip ? เชื่อมต่อได้ก็ใส่เป็น ip นั้นได้เลย เช่น client เราคือ 192.168.1.2

bind-address = 192.168.1.2

  • หรือเราจะเปิด client ทุกเครื่องเชื่อมต่อเข้ามาก็นะให้ใส่ได้แบบนี้ *, :: หรือ 0.0.0.0

bind-address = *

  • หรือ bind-address = ::
  • หรือ bind-address = 0.0.0.0
  • เลือกเอาแบบใหนตามที่ชอบได้เลย
  • สุดท้าย restart service ซะหน่อย

sudo systemctl restart mysql

  • หรือ sudo /etc/init.d/mysql restart

Ref

  • https://www.digitalocean.com/community/tutorials/how-to-allow-remote-access-to-mysql
  • https://dev.to/rakeshgsekhar/how-to-allow-remote-connections-to-mysql-database-on-ubuntu-20-04-4nc2

Barrier kvm software

  • เขียนไว้เยอะ นานเล็กน้อยถึงปานกลาง แต่ก่อนชื่อ synergy รู้สึกว่ามันจะกลายเป็นโปรแกรมเสียตังค์ซะแล้ว
  • Barrier อันนี้น่าจะเป็น fork ของ synergy เพราะหน้าตามันคล้ายๆ กันนั่นแหละ

Install on Ubuntu 21.04

sudo apt-get -y install barrier 

Client

  • check ที่ Client (use.... keyboard):
  • ใส่ค่า ip ของ server ที่เราจะใช้ mouse และ keyboard ของเค้า
  •  screen name ค่านี้จะต้องไปอ้างอิงที่ฝั่ง server ต่อ
  • รอ server start ก่อน ฝั่ง client จึง start ทีหลังนะ

Server


  • check ที่ Server (share ... keyboard):
  • จากนั้นคลิกที่ ปุ่ม Configure Server...
  • ลาก icon มุมขวาบน วางบนตำแหน่ง ที่ต้องการ

  • ดับเบิ้ลคลิกที่  icon client

  • ตั้งค่า screen name อันนี้ได้มาจากโปรแกรมฝั่ง client

  • และ กดปุ่ม Ok
  • กลับมาหน้าแรก กดปุ่ม Start
  • รอ client เชื่อมต่อเข้ามเป็นอันเรียบร้อย

Add

  • ทดลองระหว่าง Server เป็น Ubuntu 20.04 และ Client เป็น Mac Monterey (version 12) ใช้งานได้ไม่พบปัญหา

Related

  • https://juuier.blogspot.com/2014/01/microsoft-garage-mouse-without-borders.html
  • https://juuier.blogspot.com/2011/09/how-to-use-synergy-part-2.html
  • https://juuier.blogspot.com/2011/09/how-to-use-input-director.html 
  • https://juuier.blogspot.com/2011/09/how-to-use-synergy-part-3.html
  • https://juuier.blogspot.com/2011/09/how-to-use-synergy-part-4.html
  • https://juuier.blogspot.com/2011/09/control-multi-monitor-with-one-keyboard.html
  • https://juuier.blogspot.com/2014/01/synergy-kvm-software.html

Ref

  • https://installati.one/ubuntu/21.04/barrier/
  • https://github.com/debauchee/barrier



Monday, November 15, 2021

Factory reset Google Nest Mini (2nd gen)

On the side of your device, switch the mic off. The lights will turn orange. Press and hold the center of the Nest Mini, where the lights are on top. After 5 seconds, your device will begin the factory reset process. Continue to hold for about 10 seconds more, until a sound confirms that the device is resetting.

Step

  • ปิดไมค์ โดยสวิช จะเห็นเป็นสีส้ม
  • จากนั้นกด เบาตรงกลาง nest mini กดประมาณ 5 วินาที
  • จากนั้นมันจะมันจะแจ้งว่า เรากำลังทำ factory reset นะ ถ้าต้องการยกเลิกให้เอามือที่กดอยู่ออกซะ
  • เราไม่ต้องเอามือออก ค้างไว้ต่อ ประมาณ 5 - 10 วินาที มันจะยินเสียงประมาณว่า factory reset สำเร็จจากนั้นค่อยเอามือออก
  • รอสักครู่ netst mini จะทำการ restart ตัวเอง จะคล้ายๆ ตอนเราเสียบปลั๊กให้มัน
  • factory reset เรียบร้อย 
  • จากนั้นเราค่อยเพิ่ม new device ใน google home ก็เป็นอันใช้ได้

Ref

  • https://support.google.com/googlenest/answer/7073477?hl=en

Thursday, October 14, 2021

Handle web page caching Codeigniter 4

  • เริ่มหัดใช้ ci เขียน php แต่ติดปัญหาเรื่องแก้ design แล้ว ทำไมหน้ามันไม่ยอมเปลี่ยนหว่า

Solved

  • เพิ่มโค้ดบรรทัดนี้ ใน controller ที่ต้องการให้แสดงผลตามโค้ดใหม่

$n = 1;

$this->cachePage($n); 

  • ค่า n ใช้ได้น้อยสุดเป็น 1 หว่า ซึ่งค่านี้คือ หน่วยเป็น second คือ อายุ cache แค่ 1 วินาที่

Ref

  • https://codeigniter.com/user_guide/general/caching.html?highlight=cache%20page


Config environment Codeigniter 4

วิธีแรกใน base dir แก้ไข env

  • คัดลอกไฟล์ env ไปเป็น .env

$ sudo cp env .env

  • จากนั้นเพิ่มคอนฟิกประมาณนี้

CI_ENVIRONMENT = development 

# CI_ENVIRONMENT = production 

วิธีที่ 2 ใน base dir เหมือนเดิม แก้ไข .htaccess (Apache)

  • .htaccess เพิ่มคอนฟิกประมาณนี้ ในบรรทัด ท้ายสุด

SetEnv CI_ENVIRONMENT development

วิธี 3 ใน base dir แก้ไข index.php

  • เพิ่ม code ใน index.php ประมาณนี้

define("ENVIRONMENT", "development");

Ref

  • https://codeigniter.com/user_guide/general/environments.html 
  • https://www.learnphponline.in/change-codeigniter-environment-variable/

Set MySQL connection Slim framework 4

  • config 2 file app/settings.php and app/dependencies.php

app/settings.php

 "db" => [
                    'driver' => 'mysql',
                    'host' => 'localhost',
                    'username' => 'root',
                    'database' => 'slim_test',
                    'password' => '',
                    'charset' => 'utf8mb4',
                    'collation' => 'utf8mb4_unicode_ci',
                    'flags' => [
                        // Turn off persistent connections
                        PDO::ATTR_PERSISTENT => false,
                        // Enable exceptions
                        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                        // Emulate prepared statements
                        PDO::ATTR_EMULATE_PREPARES => true,
                        // Set default fetch mode to array
                        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
                    ],
                ],


 app/dependencies.php

PDO::class => function (ContainerInterface $c) {
 
            $settings = $c->get(SettingsInterface::class);
 
            $dbSettings = $settings->get('db');
 
            $host = $dbSettings['host'];
            $dbname = $dbSettings['database'];
            $username = $dbSettings['username'];
            $password = $dbSettings['password'];
            $charset = $dbSettings['charset'];
            $flags = $dbSettings['flags'];
            $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
            return new PDO($dsn, $username, $password);
        },

ทดสอบใน app/routes.php

 $app->get('/db-test', function (Request $request, Response $response) {
        $db = $this->get(PDO::class);
        $sth = $db->prepare("SELECT * FROM user ORDER BY id desc limit 100");
        $sth->execute();
        $data = $sth->fetchAll(PDO::FETCH_ASSOC);
        $payload = json_encode($data);
        $response->getBody()->write($payload);
        return $response->withHeader('Content-Type', 'application/json');
    });    
};

Ref

  • https://arjunphp.com/how-to-connect-to-mysql-database-in-slim-framework-4/
  • https://odan.github.io/2020/04/05/slim4-multiple-pdo-database-connections.html

Tuesday, October 12, 2021

Body parsing และ Json response สำหรับ Slim 4

  •  ประเด็นคือ client ส่งค่าแบบ json body มา content-type เป็น application/json
  • ใน slim 3 การรับที่ฝั่ง method ก็ง่ายๆ คือ สมมุติเราส่ง json body เป็น

{"user":"a", "age":4}

  • การรับค่าที่ฝั่ง method ใน slim framework 3 จะประมาณนี้

$data = $request->getParsedBody();    

$tmp = $data["your_param_name"]; 

return $response->withJson($result, 200);

  • แต่ใน ฝั่ง Slim 4 ต้องเพิ่มคอนฟิกประมาณนี้ใน index.php หรือ ใน routes.php 

$app->addBodyParsingMiddleware();

$app->addRoutingMiddleware();

$app->addErrorMiddleware(true, true, true);


  • อันนี้ที่ index.php


  • และอันนี้ app/routes.php


$data = $request->getParsedBody();

// $data = array('name' => 'Bob', 'age' => 40);

$payload = json_encode($data);

$response->getBody()->write($payload);

return $response->withHeader('Content-Type', 'application/json')->withStatus(200);

Ref

  • https://www.slimframework.com/docs/v4/middleware/body-parsing.html
  • https://www.slimframework.com/docs/v4/objects/response.html#returning-json

ติดตั้ง CodeIgniter 4 บน Ubuntu 20.04

Env

  • CodeIgniter 4
  • Ubuntu 20.04
  • LAMP
  • PHP 7.4 
  • domain site => www.mysite.com
  • path web root => /var/www/html

แบบ 1 download zip

  • ไปที่ https://codeigniter.com/download
  • เราจะได้ zip file มาแบบนี้ framework-4.1.4.zip (ณ วันที่ 12 ต.ค. 64 ได้เวอร์ชั่นนี้)

  • ใน zip file จะมี folder เดียวชื่อประมาณ framework-4.1.4  และใน folder นี้ก็จะมี subfolder และ file ประมาณภาพตัวอย่าง
  • จากนั้นให้คัดลอกไฟล์ framework-4.1.4 ไปวางไว้ web root path
  • rename framework-4.1.4 เป็น ci4

แบบที่ 2 ใช้ composer 

  • เปลี่ยนพาธไป ที่ web root path ก่อน

$ cd /var/www/html

  • จากนั้นใช้คำสั่งนี้และลงท้ายด้วยชื่อ project folder เรา ในที่นี้คือ  ci4

$ composer create-project codeigniter4/appstarter ci4

ทั้ง 2 วิธีติดตั้งนี้ พาธเว็บเมื่อเข้าใช้งานก็จะเป็น subfolder และ เข้าพาธแบบนี้ www.mysite.com/ci4

  • ในพาธระดับเดียวกับ folder app จะมีไฟล์ env  อยู่ให้เรา คัดลอกเนื้อหาในไฟล์ แล้วสร้างไฟล์ใหม่ชื่อ .env สำหรับ คอนฟิกของระบบ ตัวอย่างเช่น config environment ที่ต้องใช้จะมีหลักๆ 2 แบบ ที่ชอบใช้ คือ development เอาไว้แสดง error ว่าอยู่บรรทัดใหน และ เมื่อพัฒนาเสร็จก็เปลี่ยนโหมดเป็น production เอาไว้ปิดบังบั๊ก ประมาณนั้น
# CI_ENVIRONMENT = production
CI_ENVIRONMENT = development
  • จากนั้นเปลี่ยน permission folder ci4/writable เป็น 777

$ sudo chmod -R 777 /var/www/html/ci4/writable

  • จากนั้นสร้างไฟล์ .htaccess ใน ci4

$ sudo nano /var/www/html/ci4/.htaccess

  • และเพิ่มค่าแบบนี้

RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]

  • ทดสอบเว็บทำงานได้หรือยัง โดยไปที่ www.mysite.com/ci4 หรือ www.mysite/ci4/public

เพิ่มเติม(แนะนำวิธีเพิ่มเติม)

  • อีกวิธีทำ subfolder site โดยไม่ต้องสร้าง .htaccess ใหม่ 
  • ให้เราทำโดย คัดลอก index.php และ .htaccess ใน public folder ออกมาไว้ใน ci4  เลย
  • ให้อยู่ในระดับเดียวกับ app public folder เป็นต้น 
  • จากนั้นแก้ไขไฟล์ index.php ที่อยู่ใน ci4 

// $pathsConfig = FCPATH . '../app/Config/Paths.php';
$pathsConfig = FCPATH . '/app/Config/Paths.php';

อีกเรื่องที่สำคัญคือ  timezone  ปรับให้เป็นของ thai เราด้วย

  • app/Conifg/App.php

  • เปลี่ยนจาก America/Chicago เป็น Asia/Bangkok
  • ปัญหาที่เกิดถ้าเราไม่เปลี่ยน timezone เป็นของ thai เรา คือ php datediff จะตกไป 1 วันทันที

ปัญหาที่พบในการทำ subfolder ci4 ภายใต้ root

  • ใน config httpd เราตั้งพาธ root เป็น /var/www/site.com/html/
  • แต่เราดันเอา ci4 site เราไปวางไว้ที่ /var/www/site.com/ci4/ แบบนี้ การ route url ผิดเพี้ยนมากเลย
  • ต้องเอา ci4 ไว้ใน /var/www/site.com/html/ci4 แบบนี้จะไม่มีปัญหา
  • แต่ปัญหาทั้งหมดนี้จะหมดไป ถ้าเราตั้งค่า root folder ไปที่   ci4 folder เราเลย

Ref

  • https://onlinewebtutorblog.com/complete-codeigniter-4-basics-tutorial/
  • https://codeigniter4.github.io/userguide/installation/installing_composer.html
  • https://www.positronx.io/codeigniter-crud-with-bootstrap-and-mysql-example/
  • https://akrabat.com/running-slim-4-in-a-subdirectory/
  • https://www.slimframework.com/docs/v4/start/web-servers.html
  • https://www.codebee.co.th/labs/codeigniter-4-%e0%b8%a7%e0%b8%b4%e0%b8%98%e0%b8%b5%e0%b8%a5%e0%b8%9a-public-%e0%b8%ad%e0%b8%ad%e0%b8%81%e0%b8%88%e0%b8%b2%e0%b8%81-url/
  • https://onlinewebtutorblog.com/codeigniter-4-session-library/

Monday, October 11, 2021

ทำ subdirectory สำหรับ Slim framework 4 อีกวิธี

Related

  • http://juuier.blogspot.com/2021/10/slim-framework-4-ubuntu-2004.html

วิธีแรกได้เขียนไว้แล้ว 

  • คือ เพิ่ม .htaccess บน parent folder ของ public  เพิ่ม

RewriteEngine on

RewriteRule ^$ public/ [L]

RewriteRule (.*) public/$1 [L]

  • และแก้ไขไฟล์ public/index.php หรือ app/routes.phpโดยเพิ่ม

$app->setBasePath('/myslim');   

อีกวิธีที่วุ่นวายกว่านิดหน่อยคือ คัดลอก index.php และ .htaccess  ใน public ออกมาไว้ ../public

  • จากนั้นแก้ไขไฟล์ index.php คือแก้ไอ้พวกพาธ /../file ให้เป็นประมาณนี้ /file เช่น

// require __DIR__ . '/../vendor/autoload.php';

require __DIR__ . '/vendor/autoload.php';

  • จากนั้นให้แก้ไขไฟล์ เพิ่ม $app->setBasePath('/myslim');  ใน index.php ไฟล์ที่แก้ไปเมื่อกี้แหละ หรือจะไปแก้ที่ app/routes.php ก็ได้เช่นกัน

Ref

  • https://akrabat.com/running-slim-4-in-a-subdirectory/

Friday, October 8, 2021

เริ่มต้นกับ Slim Framework 4 : การติดตั้งบน Ubuntu 20.04

  • Slim framework คือ RESTFul php framework ตัวหนึ่ง ที่ลองหัดติดตั้งและใช้งานครั้งแรก
  • เอาไว้เขียน RESTFul service ไว้ใช้งานเอง
  • Slim 4 ใช้ php 7.2++ นะคับ

Env

  • Slim 4
  • Ubuntu 20.04 + LAMP
  • apache enabled mod_rewrite
  • PHP 7.4.x
  • path doc root => /var/www/html
  • domain =>  www.mysite.com

การติดตั้งทำได้หลายวิธี แต่จะนำเสนอแค่ 2 วิธี

Method 1  downlaod zip file แตกไฟล์ใช้เลย

  • https://github.com/slimphp/Slim-Skeleton



  • จากภาพดาวน์โหลดมาจะได้ไฟล์ Slim...zip ในนั้นจะมี 1 folder
  • ให้แตกไฟล์ โดยเอา folder Slim-Skeleton-master ไปวางไว้ www root path
  • แล้วเปลี่ยนชื่อ folder ให้เป็นตามที่เราต้องการ เช่น myslim
  • เราจะได้ พาธอยู่ประมาณนี้ /var/www/html/myslim

Method 2 ด้วย composer

  • ในกรณีไม่มี composer ในระบบให้เราติดตั้งด้วยคำสั่งแบบนี้

$ curl -sS https://getcomposer.org/installer | php

$ mv composer.phar /usr/local/bin/composer

$ chmod +x /usr/local/bin/composer

  • หรือ สั้นๆ ง่ายๆ ก็ apt install ซะ

$ sudo apt install composer

  • จากนั้นติดตั้ง Slim ด้วยคำสั่งประมาณนี้

composer create-project slim/slim-skeleton [my-app-name]

  • ตัวอย่างเช่น

$ cd /var/www/html

$ composer create-project slim/slim-skeleton myslim

  • เราจะได้ folder ตามนี้ /var/www/html/myslim

ทดสอบระบบติดตั้งเรียบร้อย

  • โดยเข้าไปที่ www.mysite.com/myslim จะได้ผลประมาณนี้ 


  • หรือต้องเข้าไป public แบบนี้หว่า www.mysite.com/myslim/public จะได้ประมาณนี้
  • แก้ไขเวลาเข้า public ให้แสดงผลได้ก่อนแล้วกัน โดย $app->setBasePath('/[myapp/public]');
  • ในไฟล์ public/index.php หรือ app/routes.php
  • ใน public/index.php เพิ่ม $app->setBasePath('/myslim/public'); ประมาณบรรทัด 39
  • หรือใน app/routes.php เพิ่ม $app->setBasePath('/myslim/public'); ประมาณบรรทัด 12

  • เพิ่มที่ไฟล์ใด ไฟล์หนึ่งก็พอนะ
  • ที่นี้ลองเข้า www.mysite.com/myslim/public
  • ขึ้นแบบนี้แสดงว่าใช้งานได้แล้ว ให้เพิ่ม method get post put ใน app/routes.php ได้เลย
  • แต่ตอนเรียกใช้งานต้องเรียผ่าน myapp/public นี่แหละ ไม่ค่อยเข้าท่าเลย
  • ซึ่งเราแก้ไขโดยเพิ่ม .htaccess ภายใต้ myapp ของเราในที่นี้คือ myslim/.htaccess และเพิ่มคอนฟิกแบบนี้ในไฟล์นี้
RewriteEngine on
RewriteRule ^$ public/ [L]
RewriteRule (.*) public/$1 [L]
  • จากนั้นแก้ไข $app->setBasePath('/myslim/public'); แก้เป็น $app->setBasePath('/myslim');
  • เรียกใช้งานโดย www.mysite.com/myslim/ อันนี้เค้าเรียก ทำเป็น subdirectory
Ref

  • https://app.wftutorials.com/Getting-started-with-the-PHP-Slim-framework-version-4
  • https://www.slimframework.com/docs/v4/start/web-servers.html

Sunday, September 5, 2021

Basic rsync for backup source to destination on Ubuntu 20.04 (ทบทวน)

  • ว่าด้วยเรื่องการทำ mirror web server เรา เอาไว้รองรับยามฉุกเฉิน
  • ครั้งที่แล้วใช้ scp เพราะคิดว่า rsync ต้องคอนฟิกยุ่งยาก แต่ไม่ใช่อย่างที่คิดเลย
  • เพราะ source เราเป็น Ubuntu และ destination เราเป็น Ubuntu ขั้นตอนจึงสั้นนิดเดียว
  • ซึ่ง Ubuntu 18 .04 และ 20.04 มันจะลง rsync ให้เรามาตั้งแต่ติดตั้งแล้ว เราแค่ไปเรียกใช้งานเท่านั้น
  • $ rsync [option,...] source destinaton

How to

  • ต้องการ Sync data จาก Server (source) มายัง Client (desitnation)
  • ตัวอย่างนี้ ให้คัดลอกไฟล์ภายใน folder ชื่อ path_server ไปวางไว้ภายใน path_client โดยไม่ได้เอา folder path_server ไปด้วยนะ

$ rsync -avzh --delete user@ip_server:/path_server/ /path_client

  • ส่วนตัวอย่างนี้ ให้คัดลอก folder ชื่อ path_server และ ไฟล์ภายในทั้งหมด ไปวางไว้ภายใน path_client

$ rsync -avzh --delete user@ip_server:/path_server /path_client

  • ทั้ง 2 ตัวอย่างคล้ายกันแค่มี / และ ไม่มี / หลัง path_server
  • ถ้าใช้คำสั่งด้านบนโดยยังไม่เคยใช้ public key authen ระบบจะถาม password ทุกครั้ง
  • แนะนำการ authen ใช้แบบ public key authen ใน profile เรา 1 ครั้ง
  • ครั้งถัดไป มันเอาค่า public key authen เป็น default by pass ให้เลย ไม่ต้องใส่ option -i ให้ยาว
  • เช่น ถ้าเราเคยใช้ คำสั่ง

$ ssh -i /path/privkey user@ip_server

  • ครั้งถัดไปให้เราใช้แค่นี้ไม่ต้องใช้ -i มันก็ เราค่า authen  โดย private key มาใช้โดยอัตโนมัติ จนเรางง เลยว่า ทำไมมันไม่ให้ใส่ password หว่า ทั้งที่ไม่ได้ใช้ -i

$ ssh user@ip_server 

  • และ รวมถึง util อื่นๆ ที่ใช้ผ่านบน client เครื่องนี้ด้วย เช่น scp , rsync เป็นต้น
  • ลืมในกรณีกลับกัน ต้องการ sync เอาไฟล์จาก client ไป update บน server ให้ทำประมาณนี้ คือ  เอาไฟล์ภายในและตัว folder path_client ไปวางไว้ภายใต้ path_server

$ rsync -avzh --delete /path_client  user@ip_server:/path_server

Note

  • ถ้าเราไม่ใส่ --delete มันจะไม่ลบไฟล์ ที่เกินในฝั่ง destination

Related

  • http://juuier.blogspot.com/2021/09/scp-copy-tool-ubuntu-2004.html
  • https://juuier.blogspot.com/2014/03/mirror-website-rsync.html
  • https://juuier.blogspot.com/2021/06/set-remote-ssh-by-public-key.html

Ref

  • https://linuxhint.com/rsync_copy_files_ubuntu/ 
  • man rync

Thursday, September 2, 2021

SCP copy tool ใน ubuntu 20.04

  • ประเด็นมีอยู่ว่า จะทำ mirror site จาก server ubuntu 20.04 มา client ที่เป็น ubuntu 20.04 เหมือนกัน
  • จริงก็ควรใช้ rsync น่ะ แต่ขี้เกียจคอนฟิกซะงั้น
  • งั้นเล่นง่ายๆ แต่เปลือง bandwidth หน่อยใช้ scp แล้วกัน

การคัดลอกไฟล์ file1 จาก server มา client โดยสั่งจาก client

$ scp user@server_ip:/path_server/file1 /path_local/ 

$ scp -i /path_private_key user@server_ip:/path_server/file1 /path_local/ 

 การคัดลอกไฟล์ multi files จาก server มา client โดยสั่งจาก client

$ scp user@server_ip:/path_server/* /path_local/ 

$ scp -i /path_private_key user@server_ip:/path_server/* /path_local/ 

# กรณีนี้ ถ้าใช้ * มันจะ copy เฉพาะไฟล์ เท่านั้น ถ้าเจอ folder มันจะไม่ copy ลงมา

การคัดลอก folder จาก server มา client โดยสั่งจาก client

$ scp -r user@server_ip:/path_server/folder /path_local/

# folder จะ copy มาวางที่ /path_local/folder

# กรณี scp -r มันจะเอาทั้ง file และ subfolder ใน folder ที่คัดลอกมาให้ทั้งหมดเลย

การคัดลอก file หรือ folder จาก client ไป server โดยสั่งจาก client 

$ scp  /path_local/file1 user@server_ip:/path_server/

$ scp -r /path_local/folder user@server_ip:/path_server/

# folder มันจะไปอยู่ที่ /path_server/folder

Related

  • https://juuier.blogspot.com/2009/01/command-line.html

Ref

  • https://linuxconfig.org/how-to-setup-the-rsync-daemon-on-linux
  • https://stackabuse.com/using-scp-to-copy-and-securely-transfer-files-and-folders/
  • https://stackabuse.com/copying-a-directory-with-scp/

Wednesday, September 1, 2021

Create & set permission for user MySQL Server Ubuntu 20.04

  • เคยสร้าง และ กำหนดสิทธิ์บรรทัดเดียวกัน 

GRANT ALL ON *.* TO 'user2'@'localhost' IDENTIFIED BY 'pass1';

  • แต่ทำไม Ubuntu 20.04 มัน syntax error หว่า
  • หาคำสั่งล่าสุด สำหรับ MySQl Server CE Ver8.0.26 on Ubuntu 20.04.2

สำหรับ Localhost user

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_user_password';
grant all privileges on *.* to 'new_user_name'@'localhost' with grant option;
grant all privileges on some_db.some_tb to 'new_user_name'@'localhost' with grant option;
grant all privileges on some_db.* to 'new_user_name'@'localhost' with grant option;

สำหรับ % user

CREATE USER 'new_user'@'%' IDENTIFIED BY 'new_user_password';
grant all privileges on *.* to 'new_user_name'@'%' with grant option;
grant all privileges on some_db.some_tb to 'new_user_name'@'%' with grant option;
grant all privileges on some_db.* to 'new_user_name'@'%' with grant option;

/** ให้สิทธิ์แค่ select อย่างเดียว */ 

grant select on some_db.* to 'new_user_name'@'%' with grant option; 


คำสั่งด้านล่างเพิ่มสิทธิ์ เทียบเท่า root ให้จัดการเรื่องอื่นๆ ได้ (create user ก่อนใช้คำสั่งนี้)

GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'%';

GRANT ALL PRIVILEGES ON *.* TO 'user_name'@'localhost' WITH GRANT OPTION;

Related 

  • https://juuier.blogspot.com/2011/05/mysql-create-user.html

Ref

  • https://programmingfields.com/create-mysql-user-and-grant-privileges-in-ubuntu-20-04/
  • https://stackoverflow.com/questions/20036547/mysql-how-to-grant-read-only-permissions-to-a-user

LAMP & Vhost SSL Clone on Ubuntu 20.04 Server to Client same version os

  • เตรียม LAMP สำหรับ wordpress ประมาณนี้ ใน Ubuntu 20.04

sudo apt install apache2
sudo apt install mysql
sudo apt install php7.4
sudo apt install php7.4-common php7.4-cli php7.4-bcmath php7.4-bz2 php7.4-curl php7.4-intl php7.4-mbstring php7.4-mysql php7.4-readline php7.4-xml php7.4-zip php7.4-gd php7.4-gmp

  • คัดลอก apache2 config จาก server มา client ไว้พาธเดียวกัน
  • /etc/apache2/sites-available/xxx.go.th.conf
  • /etc/apache2/sites-available/xxx.go.th-le-ssl.conf
  • ตรวจสอบ mod ที่จำเป็นต่อการรัน https บน client

sudo a2enmod ssl
sudo a2enmod headers
sudo a2ensite xxx.go.th
sudo a2ensite xxx.go.th-le-ssl
sudo a2enmod rewrite

  • คัดลอก ssl ไฟล์ที่จำเป็นจาก Server to Client ไว้พาธชื่อเดียวกัน

/etc/letsencrypt/options-ssl-apache.conf

/etc/letsencrypt/live/xxx.go.th/fullchain.pem

/etc/letsencrypt/live/xxx.go.th/privkey.pem

  • เปลี่ยนค่า /etc/hosts ให้ชี้มาที่ client เพื่อทดสอบ cert ที่ clone มาใช้ที่ client
  • สรุปใช้งานได้ ปกติ เช่นกัน

Ref

  • https://www.arubacloud.com/tutorial/how-to-enable-https-protocol-with-apache-2-on-ubuntu-20-04.aspx
  • https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-20-04

Instead software ipmsg on Ubuntu 20.04 use iptux

sudo apt-get install -y iptux

  • แก้ปัญหาภาษาไทย เข้าเมนู Tools => Preferences => System
  • เปลี่ยน coding จาก utf-16 และ utf-8 เป็น tis-620

Ref

  • https://zoomadmin.com/HowToInstall/UbuntuPackage/iptux 
  • https://github.com/iptux-src/iptux

Tar + Gzip folder and file

$ tar -zcvf outputFileName folderToCompress

Exam Compress by tar + gzip folder

$ tar -zcvf html.tar.gz /var/www/html/

$ cd /var/www/html

$ tar -zcvf html.tar.gz html

Exam Compress by tar + gzip files

$ tar czf file.tar.gz file

$ tar czf file.tar.gz file1 file2

Exam Compress by tar + gzip files and folder

$ tar -cvf - file1 file2 dir3 | gzip > archive.tar.gz

Exam Extract files gz

$ tar -zxvf prog-1-jan-2005.tar.gz
$ tar -zxvf prog-1-jan-2005.tar.gz -C /tmp

Related

  • https://juuier.blogspot.com/2009/01/command-line.html

Ref

  • https://mkyong.com/linux/linux-how-to-gzip-a-folder/ 
  • https://www.cyberciti.biz/faq/how-do-i-compress-a-whole-linux-or-unix-directory/

Manual renew wildcard certificate Let's Encrypt

  • ประเด็นมีอยู่ว่า ก่อนทำ cer เป็นแบบ wildcard (*.domain) ก็สามารถทำ auto renew cer ได้
  • แต่พอเปลี่ยนเป็นแบบ wildcard มัน auto renew ไม่ได้ซะงั้น

Solved

sudo certbot certonly --manual -d 'your_domain.com,*.your_domain.com'

  • จากนั้นมันจะได้ค่า hash มาให้ไปเพิ่มใน dns control panel ของเราโดยเพิ่ม TXT Record
  • ช่องแรกด้านซ้ายสุดใส่เป็น

_acme-challenge

  • ซ่องด้านขวาก็ใส่ค่า hash

eWX6lEavBKmWPm4waFyxxxxxxxxxxxxxxxxxxxxxxxxxx

  • แล้วกดเพิ่ม และ บันทึกให้เรียบร้อย
  • มันจะได้ประมาณภาพนี้
  • จากนั้นรอประมาณ 5 นาที หรือ แล้วแต่ dns service ว่าต้องใช้เวลา update นานขนาดใหน
  • เจ้านี้รอประมาณ 3-5 นาที จากนั้นให้เราไปตรวจสอบ txt record ว่า update ใหม่ยัง
  • โดยเข้า https://mxtoolbox.com/TXTLookup.aspx แล้วพิมพ์ประมาณ

_acme-challenge.your_domain

  • และถ้า record  ได้ค่า hash ใหม่แล้ว ใน terminal ที่เรารันคำสั่งแบบ manual renew ให้ enter ได้เลย
  • Let's Encrypt จะตรวจสอบว่า เราเป็นเจ้าของ domain ถูกต้องผ่าน txt record นี่แหละ
  • เป็นอัน manual renew wildcard certificate เรียบร้อย 
  • ก่อนถึง 90 วัน (expire range day) ก็ manual renew อีกรอบ
Edit 26-04-2002
  • การ renew cert มันอัพเดทเพิ่มเติม คือ หลังจาก  dns อัพเดท txt record ได้ค่าใหม่ที่เราบันทึกแล้ว กด enter  มันจะให้เราสร้างไฟล์ตามพาธของเว็บไซต์เรา โดยใส่ content ตามที่มันแจ้ง
  • เมื่อเราสร้างไฟล์นั้นเสร็จก็กด enter  อีกครั้ง เป็นอันเสร็จสิ้นขบวนการ renew cert
  • สุดท้ายอย่างลืม restart web server เรา
$ sudo /etc/init.d/apache2 restart

Ref

  • https://community.letsencrypt.org/t/an-authentication-script-must-be-provided-with-manual-auth-hook/74301

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Env

  • Server Ubuntu 18.04, MySQL Server
  • Client Ubuntu 20.04, MySQL Server 8

Problem

  • เขียน bash script + python script เพื่อ clone db จาก server มา client
  • โดย export db structure exclude trigger, export data by load outfile
  • จากนั้นที่ client สร้าง db sturcture และ load infile data เข้า db จากนั้น import trigger 
  • ตอน export structure และ data จาก server ไม่พบปัญหา
  • ปัญหาเกิดตอนพยายาม import data เข้าใน client
  • มันแสดงใน python exception แบบนี้

1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Solved

  • ที่ฝั่ง client ให้เปิดคอนฟิกไฟล์ (MySQL Server 8, Ubuntu 20.04)

sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf

  • เพิ่ม คอนฟิกประมาณนี้

secure-file-priv = ""

  • ในคอนฟิกก็จะได้ประมาณนี้

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file    = /var/run/mysqld/mysqld.pid
socket        = /var/run/mysqld/mysqld.sock
datadir        = /var/lib/mysql
log-error    = /var/log/mysql/error.log
secure-file-priv = ""
local-infile = 1
Ref

  • https://stackoverflow.com/questions/32737478/how-should-i-tackle-secure-file-priv-in-mysql
  • https://computingforgeeks.com/how-to-solve-mysql-server-is-running-with-the-secure-file-priv-error/

Tuesday, August 31, 2021

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled

  • mysql import db_structure.sql แล้วพบ error ประมาณนี้

This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

  • คล้ายๆ ที่เคยเจอ ตอนสร้าง function ใน mysql ใหม่ แล้ว error แบบนี้ทำให้สร้าง function ไม่่ได้ 

Solved method 1 เพิ่มคำสั้งก่อน execute

mycursor.execute("show full tables where Table_Type = 'BASE TABLE';")
mycursor.execute("SET SESSION FOREIGN_KEY_CHECKS=0;")
mycursor.execute("SET sql_mode='';")
mycursor.execute("SET GLOBAL log_bin_trust_function_creators = 1;")
Solved method 2 เพิ่มหรือปรับใน mysql.ini ไฟล์

log_bin_trust_function_creators = 1;

Related

  • https://juuier.blogspot.com/2021/02/error-1418-this-function-has-none-of.html

Ref

  • https://stackoverflow.com/questions/26015160/deterministic-no-sql-or-reads-sql-data-in-its-declaration-and-binary-logging-i

Incorrect datetime value: '0000-00-00 00:00:00'

  • ปัญญา dump mysql ได้แล้ว (load outfile) แต่ load infile ไม่ได้

error

  • Incorrect datetime value: '0000-00-00 00:00:00'
  • ปัญหาประมาณ DB ต้นทางที่ export มา คอนฟิก เค้าอนุญาต ให้ datetime เป็น 0000-00-00 00:00:00 ได้
  • แต่ client ไม่อนุญาติ ให้ datetime type เป็น 0000-00-00 00:00:00  หว่า

Solved

  • Method 1:  ไปแก้ config MySQL Server ที่ client ประมาณ sql_mode นี่แหละ 
  • Method 2: execute คำสั่งนี้ก่อน load infile หรือ ก่อน insert

set sql_mode=''; # '' is two sigle qoute

  • เช่น python

mycursor.execute("show full tables where Table_Type = 'BASE TABLE';")
mycursor.execute("SET SESSION FOREIGN_KEY_CHECKS=0;")
mycursor.execute("SET sql_mode='';")

Ref

  • https://stackoverflow.com/questions/35565128/mysql-incorrect-datetime-value-0000-00-00-000000



MYSQL Error: 13 (Permission Denied)

Env

  • Server ubuntu 18.04, MySQL Server CE
  • Client ubuntu 20.04, MySQL Server CE

Problem

  • ปัญหานี้เกิดตอน เราทำการ load outfile  ที่ server
  • จากนั้น scp ไฟล์เหล่านั้นมาที่ client 
  • จากนั้นใช้  python3 load infile แล้วใช้ไม่ได้ซะงั้น
  • มัน exception ออกมาประมาณ 
  • MYSQL Error: 13 (Permission Denied)
  • ซึ่งก่อนหน้านี้ใช้ script นี้รันจาก Client เป็น Ubuntu 20.04, MariaDB แล้ว Server เป็น Ubuntu 18.04 MariaDB มันก็ใช้งานได้นะ สงสัย Env ของ OS และ MySQL มันต่างกัน

Solved

  • ย้ายไฟล์มาด้วย scp แล้ว folder ที่ client ให้เราตั้ง owner เป็น mysql:mysql

sudo chown -R mysql:mysql /client_path/load_outfile_folder/

Ref

  • https://www.w3schools.com/python/python_mysql_getstarted.asp
  • https://askubuntu.com/questions/1228827/mysql-error-13-permission-denied

Thursday, August 26, 2021

Ubuntu 20.04 can not client remote MySQL Host 'xxx.xx.xxx.xxx' is not allowed to connect to this MySQL server

Error

Host 'xxx.xx.xxx.xxx' is not allowed to connect to this MySQL server 

  • ติดตั้ง Ubuntu 20.04 ลง MySQL Server แต่ client ใช้ root remote มาไม่ได้
  • แก้ไข mysqld.cnf ใส่ bind-address=0.0.0.0
  • สั่ง sudo systemctl restart mysql.service แล้วมันก็ยัง remote ไม่ได้

# /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]

pid-file        = /var/run/mysqld/mysqld.pid

socket          = /var/run/mysqld/mysqld.sock

datadir         = /var/lib/mysql

log-error       = /var/log/mysql/error.log

bind-address            = 0.0.0.0

Solved

  • สร้าง user ใหม่เลยไม่ต้องใช้ root แล้วเพิ่มสิทธิ์ให้เทียบเท่า root

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

REF

  • https://stackoverflow.com/questions/1559955/host-xxx-xx-xxx-xxx-is-not-allowed-to-connect-to-this-mysql-server

Friday, July 9, 2021

Enable desktop sharing on Ubuntu 20.04 Focal Fossa (VNC Protocol)


  • เปิด Settings => Sharing


  • check => Allow connections to control the screen
  • Access Options แล้วแต่เราจะเลือกให้
  • ถ้าให้ host กด accept ให้เมื่อ request มา เลือก
  • New connections must ask for access
  • หรือให้ client ใส่รหัสผ่านได้เลยเลือก 
  • Require a password
  • ตรง Networks ก็ เปิดซะ 
  • เป็นอันเรียบร้อย

Add

  • ถ้า client remote ไม่ได้ขึ้น error แบบนี้

the authentication mechanism requested cannot be provided by the computer

  • แก้โดยพิมพ์คำสั่งนี้ใน terminal

$ gsettings set org.gnome.Vino require-encryption false

Ref

  • https://linuxconfig.org/remote-desktop-sharing-on-ubuntu-20-04-focal-fossa
  • https://ubuntuforums.org/showthread.php?t=2391847

Ubuntu 20.04 – Cannot connect MySQL Workbench to MySQL server

An AppArmor policy prevents this sender from sending this message to this recipient; type="method_call", sender=":1.125" (uid=1000 pid=7944 comm="/snap/mysql-workbench-community/5/usr/bin/mysql- wo" label="snap.mysql-workbench-community.mysql-workbench- community (enforce)") interface="org.freedesktop.Secret.Service" member="OpenSession” error name="(unset)" requested_reply="0" destination=":1.13" (uid=1000 pid=2044 comm="/usr/bin/gnome- keyring-daemon –daemonize –login" label="unconfined")

Please:

1 Check that MySQL is running on address localhost

2 Check that MySQL is reachable on port 3306 (note: 3306 is the default, but this can be changed)

3 Check the user root has rights to connect to localhost from your address (MySQL rights define what clients can connect to the server and from which machines)

4 Make sure you are both providing a password if needed and using the correct password for localhost connecting from the host address you're connecting from


Solved

$ sudo snap connect mysql-workbench-community:password-manager-service :password-manager-service

  • เพียงเท่านี้ mysql-workbench เราก็จะใช้งานได้ปกติ (ถ้าไม่มีข้อผิดพลาดอื่นๆ นะ)

Add

  • ในกรณีที่คำใช้คำสั่งด้านบนแล้ว error แบบนี้

error: snap "snapd" has "auto-refresh" change in progress

  • ให้เราใช้คำสั่งนี้ เพื่อดู package ที่มัน auto-refresh อยู่

 $ sudo snap changes  


  • มีรายการ ID=13 ที่ รอ update อยู่ ให้เราเปิดดูใน Ubuntu Software ว่ามี snap package บางตัวที่รออัพเดทอยู่

  • อัพเดทเรียบร้อยแล้วก็รันคำสั่ง ด้านบนใหม่อีกครั้ง

$ sudo snap connect mysql-workbench-community:password-manager-service :password-manager-service

Ref

  • https://askubuntu.com/questions/1242026/cannot-connect-mysql-workbench-to-mysql-server
  • https://itectec.com/ubuntu/ubuntu-cannot-connect-mysql-workbench-to-mysql-server/
  • https://forums.mysql.com/read.php?152,686820,686870#msg-686870
  • https://www.codegrepper.com/code-examples/typescript/mysql+workbench+an+apparmor+policy+prevents+this+sender
  • https://www.programmersought.com/article/10514316459/
  • https://askubuntu.com/questions/1167566/snap-not-allowing-me-to-remove-or-refresh-anything

Thursday, July 8, 2021

Turn off foreign key checks when restoring a mysql file dump

  • ปัญหาคือ  dump structure และ load outfile  ออก จาก MySQL จากเครื่องหนึ่ง ไปเครื่องอื่น
  • โดย mysqldump เอาแต่โครงสร้างออกมา และ load outfile เอา data ออกต่างหาก ขั้นตอนนี้ไม่พบปัญหา
  • ขั้นตอน mysql  โหลดไฟล์ structure เข้าก็ไม่พบปัญหา
  • แต่ขั้นตอนการ load infile มีปัญหาคือ เรื่องการทำ foreign key ระหว่าง  table กันทำให้เกิด error ไม่สามารถนำข้อมุลเข้าได้

1452 (23000): Cannot add or update a child row: a foreign key constraint fails (... FOREIGN KEY ...) REFERENCES ...

Solved

  • ต้องสั่งปิดการอ้างอิง FK ก่อน แล้ว dump ข้อมูลเข้า 
  • ข้อมูลเข้าเสร็จ แล้ว
  • จากนั้นจึงเปิดใช้ FK คืน

mysql --login-path=rob --init-command="SET SESSION FOREIGN_KEY_CHECKS=0;" < dump.sql

  • หรือใน python ก็จะประมาณนี้

mydb = mysql.connector.connect(

  host="host",

  user="user",

  password="password",

  database="db"

)

mycursor = mydb.cursor()

try:

mycursor.execute("SET SESSION FOREIGN_KEY_CHECKS=0;")

mycursor.execute("load data infile ...")

mydb.commit()

except Exception as ex:

print(ex)

finally:

mycursor.execute("SET SESSION FOREIGN_KEY_CHECKS=1;")

mydb.close()

mycursor.close()

  • สรุปง่ายๆ ทำประมาณนี้
SET FOREIGN_KEY_CHECKS = 0;
LOAD DATA INFILE '/path/to/mytable.txt' INTO TABLE mytable;
SET FOREIGN_KEY_CHECKS = 1;

Ref

  • https://akrabat.com/turn-off-foreign-key-checks-when-restoring-a-mysql-file-dump/
  • https://electrictoolbox.com/load-data-mysql-foreign-key-constraints/

Friday, July 2, 2021

set table name case sensitivity for MySQL and MariaDB

  • ย้ายฐาน mariadb จาก Ubuntu 18.04 ไปยัง Ubuntu 20.04
  • ทั้งที่โครงสร้างทุกอย่างไปครบ กับเจอ error ของโปรแกรมที่มันเคยใช้ได้ แต่ทำไมชี้ไป server ใหม่แล้วมันก็ใช้ไม่ได้ซะงั้น หา table ไม่เจอ ทั้งที่มี  table นั้นอยู่ แต่มันเป็น lower case เฉยๆ

Error Code: 1146. Table 'dbname.L_PROJECTCODE' doesn't exist

Solved

  • MariaDB
  • Ubuntu 18.04 แก้ไขไฟล์ /etc/mysql/my.cnf
  • Ubuntu 20.04 แก้ไขที่ไฟล์ /etc/mysql/mariadb.conf.d/50-server.cnf
  • โดยเพิ่มค่าประมาณนี้เข้าไป lower_case_table_names=1

#

# * InnoDB

#

# InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/.

# Read the manual for more InnoDB related options. There are many!

innodb_log_file_size = 512M

innodb_strict_mode = 0

lower_case_table_names=1

Ref

  • https://www.simplified.guide/mysql-mariadb/case-insensitive-table-linux
  • http://juuier.blogspot.com/2021/07/mysql-error-code-1118-row-size-too.html

Popular Posts