11/17/2021

Axapta : Job เช็ค Item Id 12 หลักและแปลงหลักสุดท้ายให้ถูก

 Axapta : Job เช็ค Item Id 12 หลักและแปลงหลักสุดท้ายให้ถูก

  1.  
  2. static void CheckItemId12(Args _args)
  3. {
  4.     AsciiIO             myFile;
  5.     AsciiIO             ItemFileConvert;
  6.     AsciiIO             ErrorFile;
  7.  
  8.     container           RecData;
  9.     container           contTmp;
  10.  
  11.     ItemId              myItemId;
  12.     ItemId              myItemIdConverted;
  13.     int                 r = 1;
  14.  
  15.     int                 a,b,c,d,e,f,g,h,i,j,k,l;
  16.     int                 a3,b3,c3,d3,e3,f3,g3,h3,i3,j3,k3,l3;
  17.     int                 a4,b4,c4,d4,e4,f4,g4,h4,i4,j4,k4,l4;
  18.     ;
  19.  
  20.     myFile=new AsciiIO("C:\\Item\\ItemCheckConvert.csv","r");
  21.     myfile.inFieldDelimiter("|");
  22.     while(myFile.status() == IO_Status::Ok)
  23.         RecData += myFile.read();
  24.     myFile = null;
  25.  
  26.  
  27.     ItemFileConvert=new AsciiIO("C:\\Item\\ItemFileConvert.txt","a");
  28.     ErrorFile=new AsciiIO("C:\\Item\\ErrorFile.txt","a");
  29.     for(r=1; r <= conlen(RecData); r++){
  30.  
  31.         myItemId =  conpeek(RecData, r);
  32.  
  33.         if(strlen(myItemId) == 12){
  34.             a = str2int(substr(myItemId,1,1));
  35.             b = str2int(substr(myItemId,2,1));
  36.             c = str2int(substr(myItemId,3,1));
  37.             d = str2int(substr(myItemId,4,1));
  38.             e = str2int(substr(myItemId,5,1));
  39.             f = str2int(substr(myItemId,6,1));
  40.             g = str2int(substr(myItemId,7,1));
  41.             h = str2int(substr(myItemId,8,1));
  42.             i = str2int(substr(myItemId,9,1));
  43.             j = str2int(substr(myItemId,10,1));
  44.             k = str2int(substr(myItemId,11,1));
  45.             l = str2int(substr(myItemId,12,1));
  46.  
  47.             a3 = (a * 2);
  48.             b3 = b;
  49.             c3 = (c * 2);
  50.             d3 = d;
  51.             e3 = (e * 2);
  52.             f3 = f;
  53.             g3 = (g * 2);
  54.             h3 = h;
  55.             i3 = (i * 2);
  56.             j3 = j;
  57.             k3 = (k * 2);
  58.  
  59.             a4 = (a3>9) ? str2int(substr(int2str(a3),1,1)) + str2int(substr(int2str(a3),2,1)) : a3;
  60.             b4 = (b3>9) ? str2int(substr(int2str(b3),1,1)) + str2int(substr(int2str(b3),2,1)) : b3;
  61.             c4 = (c3>9) ? str2int(substr(int2str(c3),1,1)) + str2int(substr(int2str(c3),2,1)) : c3;
  62.             d4 = (d3>9) ? str2int(substr(int2str(d3),1,1)) + str2int(substr(int2str(d3),2,1)) : d3;
  63.             e4 = (e3>9) ? str2int(substr(int2str(e3),1,1)) + str2int(substr(int2str(e3),2,1)) : e3;
  64.             f4 = (f3>9) ? str2int(substr(int2str(f3),1,1)) + str2int(substr(int2str(f3),2,1)) : f3;
  65.             g4 = (g3>9) ? str2int(substr(int2str(g3),1,1)) + str2int(substr(int2str(g3),2,1)) : g3;
  66.             h4 = (h3>9) ? str2int(substr(int2str(h3),1,1)) + str2int(substr(int2str(h3),2,1)) : h3;
  67.             i4 = (i3>9) ? str2int(substr(int2str(i3),1,1)) + str2int(substr(int2str(i3),2,1)) : i3;
  68.             j4 = (j3>9) ? str2int(substr(int2str(j3),1,1)) + str2int(substr(int2str(j3),2,1)) : j3;
  69.             k4 = (k3>9) ? str2int(substr(int2str(k3),1,1)) + str2int(substr(int2str(k3),2,1)) : k3;
  70.             l4 = 10 -((a4 + b4 + c4 + d4 + e4 + f4 + g4 + h4 + i4 + j4 + k4) mod 10);
  71.             l4 =( l4 == 10 ) ? 0 : l4;
  72.             if(l4 != l){
  73.                 //Converted
  74.                 myItemIdConverted = strfmt("%1%2%3%4%5%6%7%8%9%10%11%12",a,b,c,d,e,f,g,h,i,j,k,l4);
  75.                 Print(strfmt("%1 : %2 \t Coverted", r, myItemid));
  76.                 ItemFileConvert.write(strfmt("%1|%2", myItemId, myItemIdConverted));
  77.             } else {
  78.                 //Not Convert
  79.                 Print(strfmt("%1 : %2 \t Not Convert", r, myItemid));
  80.                 ItemFileConvert.write(strfmt("%1|%2", myItemId, myItemId));
  81.             }//Close Else.
  82.         } else {
  83.             Print(strfmt("%1 : %2 \t Error", r, myItemid));
  84.             ErrorFile.write(strfmt("%1",myItemId));
  85.         }//Close Else.
  86.     }//Close for.
  87.     ItemFileConvert = null;
  88.     ItemFileConvert = null;
  89.     box::info("Complete","Converted");
  90. }

10/11/2021

Code Auto Remove Slack เปลี่ยน API ใหม่ Code เดิมลบไม่ได้

Python Auto Remove Slack Chet History.

 เปลี่ยน API

  1. response = sc.api_call('conversations.history', channel=channel, limit=1000, oldest=oldest_ts, latest=latest_ts)


Code สำเร็จ
  1.  
  2.  
  3. from slackclient import SlackClient
  4. #from time import sleep
  5. import time
  6. #import datetime
  7. from datetime import datetime, timedelta
  8.  
  9. legacy_token = 'XXXX'  # don't if you share your code
  10. ########## Chanel Camera ##############
  11. channel = 'XXXX'  # Camera Channel.
  12.  
  13. sc = SlackClient(legacy_token)
  14. response = sc.api_call('channels.info', channel=channel)
  15.  
  16. #oldest_ts = response['channel']['created']
  17. date_days_ago = datetime.now() - timedelta(days=90)
  18. oldest_ts = time.mktime(date_days_ago.timetuple())
  19. print(datetime.fromtimestamp(oldest_ts))
  20.  
  21. #date_days_ago = datetime.now() - timedelta(days=60) # Keep File On Slack 60 Day.
  22. date_days_ago = datetime.now() - timedelta(days=7) # Keep File On Slack 7 Day.
  23. latest_ts = time.mktime(date_days_ago.timetuple())
  24. print(datetime.fromtimestamp(latest_ts))
  25.  
  26. #response = sc.api_call('channels.history', channel=channel, count=1000, oldest=oldest_ts, latest=latest_ts)
  27. response = sc.api_call('conversations.history', channel=channel, limit=1000, oldest=oldest_ts, latest=latest_ts)
  28. allmsgs = [item['ts'] for item in response['messages']]
  29. print(len(allmsgs))
  30. for msg in allmsgs:
  31.     sc.api_call('chat.delete', channel=channel, ts=msg)
  32.     time.sleep(1)
  33.  
  34. ########### Chanel Server  ###################
  35. channel = 'XXXXX' # Server Channel.
  36.  
  37. sc = SlackClient(legacy_token)
  38. response = sc.api_call('channels.info', channel=channel)
  39.  
  40. #oldest_ts = response['channel']['created']
  41. date_days_ago = datetime.now() - timedelta(days=90)
  42. oldest_ts = time.mktime(date_days_ago.timetuple())
  43. print(datetime.fromtimestamp(oldest_ts))
  44.  
  45. date_days_ago = datetime.now() - timedelta(days=60)
  46. latest_ts = time.mktime(date_days_ago.timetuple())
  47. print(datetime.fromtimestamp(latest_ts))
  48. #response = sc.api_call('channels.history', channel=channel, count=1000, oldest=oldest_ts, latest=latest_ts)
  49. response = sc.api_call('conversations.history', channel=channel, limit=1000, oldest=oldest_ts, latest=latest_ts)
  50. allmsgs = [item['ts'] for item in response['messages']]
  51. print(len(allmsgs))
  52. for msg in allmsgs:
  53.     sc.api_call('chat.delete', channel=channel, ts=msg)
  54.     time.sleep(1)

9/22/2021

VMware : VMware ESXi 6.5 Disk ช้าเปลี่ยน HDD เป็น SSD ก็ยังช้าอยู่

 VMware : VMware ESXi 6.5 Disk ช้าเปลี่ยน HDD เป็น SSD ก็ยังช้าอยู่
เครื่อง DL160 Gen8 การ์ด Raid b120i controller
ไม่รองรับ Vmware Version 6 ลง Vmware 6 แล้วไม่พบการ์ Raid แต่ลงตัว customize ของ HP ได้
https://porpramarn.blogspot.com/2021/04/server-vmware-vm70.html

ปัญหาที่พบคือการทำงานของ Harddisk ช้า copy ข้อมูลช้า ความเร็วได้ประมาณ 2 - 5 M/s เปลี่ยนเป็น SSD ก็ยังช้าอยู่

ทดลอง ติดตั้ง 5.5 ใช้งานได้ความเร็วตามปกติ
แต่ติดตั้ง 6.5 U3 ก็ช้าเหมือนเดิม

จากการหาข้อมูลและทดลองแก้ พบมีปัญหา ที่ Driver การ์ด Raid b120i controller ถ้าใช้ ต้องถอดตัวที่อยู่ใน Version 6.5 ออกแล้วติดตั้งตัว 5.5 แทน
Stop all virtual machines before you continue.
Step-by-step solution
1.Open an SSH session to your ESXi server installation and log on as root. Same password as for the web interface / console.
2.Go into "Maintenance mode". Note that all virtual machines must be stopped first.

esxcli system maintenanceMode set --enable true

3.Allow outgoing HTTP requests through the ESXi firewall, to retrieve the necessary file.
esxcli network firewall ruleset set -e true -r httpClient

4.Go into /tmp folder so we don't leave a mess.
cd /tmp

5.Use wget to download the .zip file from HP website. Note that I'm using http:// and not https://.
You can also use a program such as WinSCP to copy the file directly from your desktop PC to the ESXi server.
wget http://downloads.hpe.com/pub/softlib2/software1/pubsw-linux/p1749737361/v98767/hpvsa-5.5.0-88.zip

6. Unzip the file so we can get the .vib driver file we'll need.
unzip hpvsa-5.5.0-88.zip

7.Copy the file to a location where the installer can find it easily.
cp scsi-hpvsa-5.5.0-88OEM.550.0.0.1331820.x86_64.vib /var/log/vmware/

8.Uninstall the currently installed scsi-hpvsa driver. Be patient. Takes a minute.
esxcli software vib remove -n scsi-hpvsa -f

9.Install the old driver we just downloaded. Be patient. Takes a minute.
esxcli software vib install -v file:scsi-hpvsa-5.5.0-88OEM.550.0.0.1331820.x86_64.vib --force --no-sig-check --maintenance-mode

10.Now reboot your server.
reboot

11.Remember to disable "Maintenance mode". You can do this in vSphere Client or in the web interface.

ผลปรากฏว่า การทำงานของ Disk เร็วขึ้น Copy ข้อมูล และ Restore Database Axapta ได้เร็วขึ้นมาก
Speed Disk I/O rate ที่ กราฟ Performance เดิมไม่เกิน 5 M/s เป็น 200 - 500 M/s

VMware : VMware ESXi เปลี่ยน Compatibility เป็น Version ใหม่

 VMware : VMware ESXi เปลี่ยน Compatibility เป็น Version ใหม่
เช่น Compatibility ESXi 5.0 virtual machine ไปเป็น Compatibility ESXi 6.5 virtual machine ให้ตรงกับที่ Server Vmware run อยู่


เป็น

1. ปิดเครื่องที่จะทำ
2. คลิกขวาที่เครื่อง VMware เลือก Upgrade VM Compatibility

3. เลือก Version Compatibility ที่ต้องการ แล้วกด Upgrade
4. กด Yes

แล้ว Compatibility ก็จะเป็น Version เราเลือก

https://kb.vmware.com/s/article/1010675

9/20/2021

Axapta : Sort Container หลายค่า เช่น ใน Container มี PO, Item, Qty ต้องการเรียงทั้ง 3 ตัว

 Axapta : Sort Container หลายค่า เช่น ใน Container มี PO, Item, Qty ต้องการเรียงทั้ง 3 ตัว 

อันดับแรกเอาค่ามาต่อกัน ตามที่เราจะเรียง เช่นต้องการเรียง PO, Item 

แล้วค่อยนำค่าที่ไปแบ่ง | ใช้งาน

  1. static void SortContainer(Args _args)
  2. {
  3. container con = ["PO21-12914|901930810009|1|C-KCH","PO21-12914|901930810001|3|C-KCH","PO21-11930|014019310003|3|C-KCH","PO21-11930|014019310003|3|C-KCH","PO21-12914|014019310001|4|C-KCH","PO21-11930|014019310002|3|C-KCH"];
  4.     str temp1;
  5.     str temp2;
  6.     int i;
  7.     int j;
  8.     container sorCon;
  9.     ;
  10.     sorCon = con;
  11.     // Sort the container
  12.     for (i = 1; i <= conlen(sorCon) ; i++)
  13.     {
  14.         for (j = i + 1; j <= conlen(sorCon); j++)
  15.         {
  16.             temp1 = conpeek(sorCon, j);
  17.             temp2 = conpeek(sorCon, i);
  18.             if (temp1 < temp2)
  19.             {
  20.                 sorCon = condel(sorCon, j, 1);
  21.                 sorCon = conins(sorCon, j, temp2);
  22.                 sorCon = condel(sorCon, i, 1);
  23.                 sorCon = conins(sorCon, i, temp1);
  24.             }
  25.         }
  26.     }
  27.     conview(sorCon);
  28. }

https://rahulmsdax.blogspot.com/2018/10/sort-order-by-asc-container-in-ax-x.html

8/02/2021

Linux Mint : Config VPN On Linux Mint

Linux Mint : Config VPN On Linux Mint
https://support.hidemyass.com/hc/en-us/articles/202721596-OpenVPN-Setup-with-Network-manager-on-Linux-Mint-Mate

1. Load config VPN ที่เป็น Viscosity Inline Config

2. Install
Type:
  1. sudo apt-get install network-manager-openvpn network-manager-openvpn-gnome
and press Enter
Type:
y
and press Enter

3. Click on "Network Connections" and new window will appear. Then click on "Add" and then select "Import a saved VPN configuration" and click on "Create", as shown below:
4. New window will appear, here you need to go to that HMA VPN folder and to select the OpenVPN® configuration file for the location you wish to connect to and then click on "Open".
5. In this window, enter your HMA Username and Password into the appropriate fields in the "VPN" tab and make sure that "All users may connect to this network" is checked on the "General" tab and lastly press "Save"
6. Navigate to your Network Manager (located in the top right corner of your desktop). Click on VPN Connections and then click on the button next to the VPN server you configured previously. (In this example, it's USA.Kentucky.Louisville.UDP)
You will see a notification that you have established a successful VPN connection!


7/21/2021

Axapta : เปลียนสีและ background และตัวหนังสือ ของข้อความใน Grid

 

Axapta : เปลียนสีและ background และตัวหนังสือ ของข้อความใน Grid
 
 
Set its AutoDeclaration property to 'Yes'.
  1.    SalesLine_ItemId.colorScheme(FormColorScheme::RGB);
  2.     SalesLine_ItemId.backgroundColor(WinAPI::RGB2int(255,255,146));
  3.     SalesLine_ItemId.foregroundColor(WinAPI::RGB2int(255,0,0));



7/07/2021

Next cloud Update : 15 To 21 Ubuntu 18.04

Next cloud Update : 15 To 21 Ubuntu 18.04

แก้ Wranning
MySQL is used as database but does not support 4-byte characters. To be able to handle 4-byte characters (like emojis) without issues in filenames or comments for example it is recommended to enable the 4-byte support in MySQL. For further details read the documentation page about this.
  1. mysql -V
  2. /etc/mysql/mariadb.conf.d/50-server.cnf

เพิ่ม ไว้ใต้ [mysqld]
innodb_large_prefix=true
innodb_file_format=barracuda
innodb_file_per_table=1
  1. service mysqld restart
  2. mysql -u root -p
  3. Enter password: database

show databases;
  1. SELECT NAME, SPACE, FILE_FORMAT FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME like "nextcloud%";

https://www.allerstorfer.at/enabling-my ... ntu-18-04/

ทำต่อ
  1. show variables like 'innodb_file_per_table';

เข้าใน Terminal ไม่ต้องเข้า sql
  1. cd /var/www/nextcloud
  2. sudo -u www-data php occ maintenance:mode --on

Run ใน mysql
  1. ALTER DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Run ใน Terminal
  1. sudo -u www-data php occ config:system:set mysql.utf8mb4 --type boolean --value="true"
  2. sudo -u www-data php occ maintenance:repair

รอสักพัก เสร็จ Run ใน Terminal
  1. sudo -u www-data php occ maintenance:mode --off

https://docs.nextcloud.com/server/21/ad ... pport.html

The PHP memory limit is below the recommended value of 512MB.
  1. php -v
  2. nano /etc/php/7.0/apache2/php.ini
หา memory_limit จาก 128 เป็น 512
  1. nano /etc/php/7.0/cli/php.ini
หา memory_limit จาก 128 เป็น 512
  1. restart apache
  2. /etc/init.d/apache2 restart

https://help.nextcloud.com/t/the-php-me ... 12mb/42719
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.
Missing index "parent_index" in table "oc_share".
Missing index "owner_index" in table "oc_share".
Missing index "initiator_index" in table "oc_share".
Missing index "fs_mtime" in table "oc_filecache".
แก้
  1. cd /var/www/nextcloud
  2. sudo -u www-data php occ db:add-missing-indices
ต้องแก้ memory_limit
PHP Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 36864 bytes) in /var/www/nextcloud/3rdparty/composer/autoload_static.php on line 2439
  1. nano /etc/php/7.0/apache2/php.ini
memory_limit จาก 512 เป็น 2048M
  1. nano /etc/php/7.0/cli/php.ini
memory_limit จาก 512 เป็น 2048M (ใส่ M ด้วย)
  1. /etc/init.d/apache2 restart 
แล้วค่อย Run
  1. sudo -u www-data php occ db:add-missing-indices

https://help.nextcloud.com/t/some-indic ... ally/37852
Some columns in the database are missing a conversion to big int. Due to the fact that changing column types on big tables could take some time they were not changed automatically. By running 'occ db:convert-filecache-bigint' those pending changes could be applied manually. This operation needs to be made while the instance is offline. For further details read the documentation page about this.

filecache.mtime
filecache.storage_mtime
mounts.storage_id
mounts.root_id
mounts.mount_id
แก้
  1. sudo -u www-data php occ db:convert-filecache-bigint
ตอบ y แล้วenter
Your web server is not properly set up to resolve "/.well-known/caldav". Further information can be found in the documentation.
Your web server is not properly set up to resolve "/.well-known/carddav". Further information can be found in the documentation.
วิธีแก้
https://help.nextcloud.com/t/caldav-and ... ving/39435

เพิ่ม Redirect 301 ไว้ในไฟล์
  1. nano /etc/apache2/sites-available/000-default.conf

เพิ่มไว้ล่างสุด
Redirect 301 /.well-known/carddav https://nextcloud.sci.com/remote.php/dav
Redirect 301 /.well-known/caldav https://nextcloud.sci.com/remote.php/dav
  1. /etc/init.d/apache2 restart

https://stackoverflow.com/questions/644 ... g-to-redis

  1. nano /var/www/nextcloud/config/config.php
เพิ่ม เข้าไปในไฟล์ ก่อน 'redis' => array (
'memcache.local' => '\OC\Memcache\APCu',
'memcache.locking' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',

The "X-Content-Type-Options" HTTP header is not set to "nosniff". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly.
  1. nano /etc/apache2/conf-enabled/ssl-params.conf
ใส่ # หน้า
#Header always set X-Content-Type-Options nosniff
ถ้าไม่หายในไฟล์ .htaccess ด้วย

Update Version 15.0.14 --> 16.0.11
ไม่มีปุ่ม ต้อง Update PHP 7.0 --> 7.1

Update php 7.0 to 7.1
  1. sudo apt install -y php7.1 php7.1-cli libapache2-mod-php7.1
  2. sudo apt install -y php-imagick php-gettext php-memcache php-apcu php-pear php-xml php-xmlrpc
  3. sudo apt install -y php-memcached php-mysql php-intl php-mbstring php-curl php-gd php-imagick
  4. sudo apt install -y php7.1-common php7.1-mysql php7.1-cgi
  5. sudo apt install -y php7.1-curl php7.1-zip php7.1-mbstring php7.1-xmlrpc php7.1-gd php7.1-xml php7.1-xsl
  6. sudo apt install -y php7.1-dev php7.1-bz2 php7.1-intl php7.1-json php7.1-opcache php7.1-readline
  7. sudo apt install -y php7.1-imap php7.1-pspell php7.1-recode php7.1-sqlite3 php7.1-tidy php7.1-bcmath php7.1-mcrypt

# Update the Apache's PHP version
  1. sudo a2dismod php7.0
  2. sudo a2enmod php7.1
  3. sudo systemctl restart apache2.service

# Update the CLI PHP version
  1. sudo update-alternatives --set php /usr/bin/php7.1

Restart apache

https://itectec.com/ubuntu/ubuntu-upgra ... ntu-16-04/
OC\ServerNotAvailableException: Connection to LDAP server could not be established
ติดตั้ง php7.1-ldap
  1. apt-get install php7.1-ldap
  1. sudo -u apache /usr/bin/php /var/www/html/nextcloud/occ upgrade

Restart apache
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.]

Missing index "twofactor_providers_uid" in table "oc_twofactor_providers".
Missing index "version" in table "oc_whats_new".
Missing index "cards_abid" in table "oc_cards".
Missing index "cards_prop_abid" in table "oc_cards_properties".
แก้
  1. sudo -u www-data php occ db:add-missing-indices

Update Version 16 --> 17 แก้คำเตือน
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.

Missing index "twofactor_providers_uid" in table "oc_twofactor_providers".
Missing index "version" in table "oc_whats_new".
Missing index "cards_abid" in table "oc_cards".
Missing index "cards_prop_abid" in table "oc_cards_properties".
  1. sudo -u www-data php occ db:add-missing-indices

Update Version 17 --> 18 ไม่มีปุ่ม
1. Update php 7.1 --> 7.3 Up ข้ามไป 7.4 ไม่ได้เพราะ Vesion nexcloud 17 ไม่รองรับ
ไม่มีปุ่ม ต้อง Update PHP 7.1 --> 7.3

Update php 7.1 to 7.3
  1. sudo apt install -y php7.3 php7.3-cli libapache2-mod-php7.3 php7.3-ldap
  2. sudo apt install -y php-imagick php-gettext php-memcache php-apcu php-pear php-xml php-xmlrpc
  3. sudo apt install -y php-memcached php-mysql php-intl php-mbstring php-curl php-gd php-imagick
  4. sudo apt install -y php7.3-common php7.3-mysql php7.3-cgi
  5. sudo apt install -y php7.3-curl php7.3-zip php7.3-mbstring php7.3-xmlrpc php7.3-gd php7.3-xml php7.3-xsl
  6. sudo apt install -y php7.3-dev php7.3-bz2 php7.3-intl php7.3-json php7.3-opcache php7.3-readline
  7. sudo apt install -y php7.3-imap php7.3-pspell php7.3-recode php7.3-sqlite3 php7.3-tidy php7.3-bcmath php7.3-mcrypt
# Update the Apache's PHP version
  1. sudo a2dismod php7.1
  2. sudo a2enmod php7.3
  3. sudo systemctl restart apache2.service
# Update the CLI PHP version
  1. sudo update-alternatives --set php /usr/bin/php7.3
Restart apache

2. Run
sudo -u www-data /usr/bin/php7.3 occ upgrade

Update version 18 --> 19 แก้คำเตือน
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.

Missing index "calendarobject_calid_index" in table "oc_calendarobjects_props".
Missing index "schedulobj_principuri_index" in table "oc_schedulingobjects".
  1. sudo -u www-data php occ db:add-missing-indices
Some columns in the database are missing a conversion to big int. Due to the fact that changing column types on big tables could take some time they were not changed automatically. By running 'occ db:convert-filecache-bigint' those pending changes could be applied manually. This operation needs to be made while the instance is offline. For further details read the documentation page about this.

filecache_extended.fileid
  1. sudo -u www-data php occ db:convert-filecache-bigint
ตอบ y แล้ว enter

Update version 19 --> 20 แก้คำเตือน
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.

Missing index "properties_path_index" in table "oc_properties".
  1. sudo -u www-data php occ db:add-missing-indices
The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running "occ db:add-missing-columns" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability.

Missing optional column "reference_id" in table "oc_comments".
  1. sudo -u www-data php occ db:add-missing-columns
This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them.

gmp
ติดตั้ง
  1. apt-get install php7.3-gmp
  2. /etc/init.d/apache2 restart

 

Update version 20.0.11 --> 21.0.3 แก้ Error

PHP configuration option output_buffering must be disabled
แก้
  1. nano /etc/php/7.3/apache2/php.ini
output_buffering = 4096
เป็น
output_buffering = off

https://www.a2hosting.com/kb/developer- ... -directive
ถ้าไม่หายใน .htaccess file
https://help.nextcloud.com/t/false-outp ... ing/102791
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.

Missing index "cards_abiduri" in table "oc_cards".
  1. sudo -u www-data php occ db:add-missing-indices
The database is missing some primary keys. Due to the fact that adding primary keys on big tables could take some time they were not added automatically. By running "occ db:add-missing-primary-keys" those missing primary keys could be added manually while the instance keeps running.

Missing primary key on table "oc_federated_reshares".
Missing primary key on table "oc_systemtag_object_mapping".
Missing primary key on table "oc_comments_read_markers".
Missing primary key on table "oc_collres_resources".
Missing primary key on table "oc_collres_accesscache".
Missing primary key on table "oc_filecache_extended".
  1. sudo -u www-data php occ db:add-missing-primary-keys
Some columns in the database are missing a conversion to big int. Due to the fact that changing column types on big tables could take some time they were not changed automatically. By running 'occ db:convert-filecache-bigint' those pending changes could be applied manually. This operation needs to be made while the instance is offline. For further details read the documentation page about this.

federated_reshares.share_id
share_external.id
share_external.parent
  1. sudo -u www-data php occ db:convert-filecache-bigint
แก้คำเตือน
The database is missing some indexes. Due to the fact that adding indexes on big tables could take some time they were not added automatically. By running "occ db:add-missing-indices" those missing indexes could be added manually while the instance keeps running. Once the indexes are added queries to those tables are usually much faster.

Missing index "fs_size" in table "oc_filecache".
  1.  
  2. sudo -u www-data php occ db:add-missing-indices
Module php-imagick in this instance has no SVG support. For better compatibility it is recommended to install it.
  1.  
  2. apt-get install php7.3-imagick imagemagick
  3. /etc/init.d/apache2 restart


https://help.nextcloud.com/t/how-to-ena ... k/108646/5
Your web server is not properly set up to resolve "/.well-known/webfinger". Further information can be found in the documentation.
Your web server is not properly set up to resolve "/.well-known/nodeinfo". Further information can be found in the documentation.
  1. nano /etc/apache2/sites-available/000-default.conf

เพิ่มไว้ล่าง
Redirect 301 /.well-known/webfinger https://nextcloud.sci.com/index.php/.well-known/webfinger
Redirect 301 /.well-known/nodeinfo https://nextcloud.sci.com/index.php/.well-known/nodeinfo
Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add "default_phone_region" with the respective ISO 3166-1 code ↗ of the region to your config file.

แก้
  1. nano /var/www/nextcloud/config/config.php


เพิ่ม ไว้ล่างสุดก่อนปิด );
'default_phone_region' => 'TH',
https://www.reddit.com/r/NextCloud/comm ... ud_server/
A background job is pending that checks for user imported SSL certificates. Please check back later.

1. ที่ menu Basic settings ส่วน Background jobs เลือกเป็น Cron
2. ติดตั้ง php-cgi
  1. apt-get install php-cgi

3. เพิ่ม Cron
  1. crontab -u www-data -e
เพิ่ม
*/5 * * * * php -f /var/www/nextcloud/cron.php
run คำสั่งตรวจความถูกต้อง
  1. crontab -u www-data -l
https://docs.nextcloud.com/server/21/ad ... ation.html

6/22/2021

phpmyadmin PHP Warning: Unsupported declare 'strict_types'

 phpmyadmin PHP Warning: Unsupported declare 'strict_types'

Unsupported declare 'strict_types' in /usr/share/php/PhpMyAdmin/MoTranslator/Loader.php on line 23



Linuxmint 20.1
php 5.6

วิธีแก้
1. Install phpmyadmin ตามปกติ
2. โหลด phpMyAdmin 4.9.7
https://www.phpmyadmin.net/downloads/
3. ลบ Folder /usr/share/phpmyadmin ออก
4. แตกไฟล์ ข้อ 2 เปลี่ยนชื่อเป็น phpmyadmin
5. ย้ายไปไว้ Folder /usr/share/

ก็จะสามารถใช้ php5.6 ร่วมกับ phpmyadmin 4.9 ได้ แต่ Version ที่สูงกว่าไม่รองรับ ต้องลง php ตัวใหม่เท่านั้น เนื่องจากโปรแกรม php เก่าไม่รองรับ คำสั่งใหม่ใน phpmyadmin


มี Error

The configuration file now needs a secret passphrase (blowfish_secret).
แก้
  1. cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
  2. $cfg['blowfish_secret'] = 'qtdRoGmbc9{8IZr323xYcSN]0s)r$9b_JUnb{~Xz';


The $cfg['TempDir'] (./tmp/) is not accessible. phpMyAdmin is not able to cache templates and will be slow because of this.

แก้
  1. cd /usr/share/phpmyadmin/
  2. mkdir tmp
  3. chmod 777 tmp
  4. nano config.inc.php

เพิ่มไว้ในไฟล์ล่างสุด
  1. $cfg ['TempDir'] = 'tmp';

6/12/2021

Bug Lightsquid Stop Working in 2021

Bug Lightsquid Stop Working in 2021
ที่ไฟล์ lightparser.pl มีการ Fix ปี 2020 ไว้

  1. /usr/local/lightsquid/lightparser.pl

เปิดไฟล์
  1. nano /usr/local/lightsquid/lightparser.pl

พบ
my $filterdatestop =timelocal(59,59,23,31,12-1,2020-1900)+1000;

ทดลองเปลี่ยนเป็น 2021
my $filterdatestop =timelocal(59,59,23,31,12-1,2021-1900)+1000;

แล้ว Run
/usr/local/lightsquid/lightparser.pl

เกิดข้อมูล Reports วันปัจจุบัน

หาข้อมูลจาก Internet พบเป็น Bug ของ Program สร้าง Reports
https://finisky.github.io/2021/01/03/lightsquidhardcodeyear.en/

จึงแก้ตาม Web
my $filterdatestop =timelocal(59,59,23,31,11,2100)+1000;

ข้อมูล Reports ปี 2021 เหลือ 3 วันเนื่องจาก access.log ถูกเคลีย์




5/17/2021

Axapta 2009 : Axapta สร้าง List Department ให้เลือก จาก Dimension Group

 Axapta 2009 : Axapta สร้าง List Department ให้เลือก จาก Dimension Group
If you want to use a particular dimension as a dialog field in Dynamics AX 2009 (or earlier versions), you can create your own Extended Data Type (derived from Criterias) as described below. The decisive factors are the relations of this EDT.

In the example, the cost center is to be offered as a dialog field.

Create Dialog
  1. protected Object dialog(DialogRunbase dialog, boolean forceOnClient)
  2. {
  3.     Object ret;
  4.     ret = super(dialog, forceOnClient);
  5.     df_project = ret.addField(TypeId(DimensionACEdit));
  6.     return ret;
  7. }


Button Edit Show Dialog
Code In GL Edit Department AC
  1. void clicked()
  2. {
  3.     //LedgerJournalTrans_ds.allowEdit(true);
  4.     Dialog              myDialog;
  5.     DialogField         myDialogFieldDepartment;
  6.     LedgerJournalTrans  myLedgerJournalTrans;
  7.     LedgerJournalTrans  LedgerJournalTransUpdate;
  8.     ;
  9.  
  10.     super();
  11.     myLedgerJournalTrans = ledgerJournalTrans_ds.cursor();
  12.  
  13.     myDialog = new Dialog("Department Edit.");
  14.     myDialogFieldDepartment = myDialog.addFieldValue(typeId(DimensionACEdit), '', "void clicked()
  15. {
  16.     //LedgerJournalTrans_ds.allowEdit(true);
  17.     Dialog              myDialog;
  18.     DialogField         myDialogFieldDepartment;
  19.     LedgerJournalTrans  myLedgerJournalTrans;
  20.     LedgerJournalTrans  LedgerJournalTransUpdate;
  21.     ;
  22.  
  23.     super();
  24.     myLedgerJournalTrans = ledgerJournalTrans_ds.cursor();
  25.  
  26.     myDialog = new Dialog("Department Edit.");
  27.     myDialogFieldDepartment = myDialog.addFieldValue(typeId(DimensionACEdit), '', "Departmaint :");
  28.  
  29.     if(myDialog.run()){
  30.         //if(box::yesNo("Press 'Yes' to Confirm / Press 'No' to Cancel", DialogButton::No, "Please select...") == DialogButton::Yes){
  31.             ttsbegin;
  32.                 SELECT FORUPDATE * FROM LedgerJournalTransUpdate
  33.                 WHERE LedgerJournalTransUpdate.RecId == myLedgerJournalTrans.RecId;
  34.                 {
  35.                     LedgerJournalTransUpdate.DimensionACEdit[1] = myDialogFieldDepartment.value();
  36.                     LedgerJournalTransUpdate.update();
  37.                     LedgerJournalTrans_ds.reread();
  38.                     LedgerJournalTrans_ds.refresh();
  39.                 }
  40.             ttscommit;
  41.         //} //Close If.
  42.     } //Close If.
  43. }:");
  44.  
  45.     if(myDialog.run()){
  46.         //if(box::yesNo("Press 'Yes' to Confirm / Press 'No' to Cancel", DialogButton::No, "Please select...") == DialogButton::Yes){
  47.             ttsbegin;
  48.                 SELECT FORUPDATE * FROM LedgerJournalTransUpdate
  49.                 WHERE LedgerJournalTransUpdate.RecId == myLedgerJournalTrans.RecId;
  50.                 {
  51.                     LedgerJournalTransUpdate.DimensionACEdit[1] = myDialogFieldDepartment.value();
  52.                     LedgerJournalTransUpdate.update();
  53.                     LedgerJournalTrans_ds.reread();
  54.                     LedgerJournalTrans_ds.refresh();
  55.                 }
  56.             ttscommit;
  57.         //} //Close If.
  58.     } //Close If.
  59. }
ตัวอย่าง : https://www.schweda.net/blog_ax.php?bid=555&wdl=en

Pfsense Cert Certificates Renew ไม่ได้ Error "Error renewing Certificate"

 Pfsense Cert Certificates Renew ไม่ได้ Error "Error renewing Certificate"


ต้องสร้างใหม่ แล้วเลือก ที่
System -> Advanced in the webConfigurator section.
(ลบอันเก่าออกยังลบออกไม่ได้ไม่มีปุ่ม Delete)

Cer อื่น ๆ ถ้าหมดต้อง กด Renew ใหม่ จะมีแจ้งเตือนใน Notification
โดยกด รูป วงกลมลูกศร
แล้วกด Renew/Reissue

ตาม Link
https://blog.matrixpost.net/pfsense-webconfigurator-default-certificate-expiring/

4/23/2021

Server Vmware ไม่รองรับ VM7.0

Server Vmware ไม่รองรับ VM7.0
ตรวจสอบรุ่นได้ที่
https://techlibrary.hpe.com/us/en/enterprise/servers/supportmatrix/vmware.aspx
DL380 Gen9 IP 2.66 รองรับ VM7.0 Update ปัจจุบันถึง U1 (2021/04/22)


DL380p Gen8 IP 2.88 ไม่รองรับ VM7.0 แต่ทำการ Update VM7.0 Update ปัจจุบันถึง U1 (เครื่องที่ขึ้นจอม่วง) เปลี่ยนการ์ด Raid
หากจอม่วงไม่หาย อาจจะต้อง ย้าย Server ไป Run อีกเครื่องและ ติดตั้ง VM ใหม่ ถึงแค่ Version 6.5 U3 (2021/04/22)
DL160 Gen8 IP 2.99 ไม่รองรับ VM7.0 Raid Hardware ใช้ไม่ได้ ใช้ Raid Software ข้อมูลหาย จะต้องใช้แค่ 6.5 U3 (Gen8 ไม่รองรับ)

เครื่อง
DL160 Gen8 ไม่รองรับ 6.5 U3 ไฟล์ปรับแต่งจาก HP รองรับเฉพาะ Gen9
HP ปรับแต่ง
https://www.hpe.com/us/en/servers/hpe-esxi.html

ติดตั้ง VMware ESXi 6.5 ที่โหลดจาก Web Vmware ไม่พบ Raid Hardware
ติดตั้ง VMware ESXi 6.5 ที่โหลดจาก Web Vmware ที่ปรับแต่งจาก HP แต่เป็นของ Gen9 พบ Raid Hardware แต่ Error ตอนติดตั้ง
วิธีแก้
1. ติดตั้ง Version 5.5 ก่อน
2. ค่อยติดตั้ง VMware ESXi 6.5 ที่โหลดจาก Web Vmware ที่ปรับแต่งจาก HP แต่เป็นของ Gen9
จึงจะสามารถติดตั้งได้

iLO Server ตั้งค่า เวลาไม่ตรง

 iLO Server ตั้งค่า เวลาไม่ตรง
Configuring SNTP settings
1.Navigate to the Network, iLO Dedicated Network Port or Network, Shared NetworkPort page.
2.Click the SNTP tab.
3.Set Primary Time Server And Time zone
https://support.hpe.com/hpesc/public/docDisplay?docId=a00045504en_us&docLocale=en_US


 

4/05/2021

Mini PC GT194L ให้เปิด Auto เมื่อดับ แล้วไฟมาให้เครื่องเปิดเอง ไม่ต้องกดปุ่ม

 Mini PC GT194L ให้เปิด Auto เมื่อดับ แล้วไฟมาให้เครื่องเปิดเอง ไม่ต้องกดปุ่ม
1. ปิดเครื่อง เข้า Bios กด Delete
2. เลือก Chipset --> South Bridge




3. เลือก Restore AC Power Loss



4. เดิมเป็น OFF เลือกเป็น ON
5. F10 เพื่อบันทึก ทดลองปิดเครื่อง ปิด Switch ไฟ แล้วเปิด Switch ไฟใหม่เครื่องจะติดเอง

สอบถามร้าน ENT Group ทาง Line https://www.entgroup.co.th/product-page/mini-pc-intel-gt194l-celeron-j1900-4lan-gt194l


3/18/2021

ติดตั้ง Windows และ Linux ใน HDD ก้อนเดียว

ติดตั้ง Windows และ Linux ใน HDD ก้อนเดียว Bios ทำเป็น UEFI HDD เป็น GPT
1. ติดตั้ง Windows ทำ Data เป็น NTFS ไว้สำหรับใช้ร่วมกัน Ubuntu กับ Windows
2. ติดตั้ง Ubuntu ลง
HDD Windows 100G Ntfs
HDD DATA 350G Ntfs ใช้ร่วมกัน
HDDUbuntu 40G Ext4

ใช้ได้เลยมี Grub ของ Ubuntu ได้ให้ใช้ได้เลย เพราะ Linux, Ubuntu จะสร้าง Group ให้

หรือ ให้มี Menu ให้เลือกสวยงามให้ใช้
https://www.rodsbooks.com/refind/installing.html
วิธีติดตั้ง
sudo apt-add-repository ppa:rodsmith/refind
sudo apt-get update
sudo apt-get install refind
refind-install
reboot

เข้า bios ตั้งตัว Boot หลัก ให้เป็นตัวที่ไม่ใช่ Ubuntu หรือ Windows ก็จะเข้าหน้า Refind ได้
อันไหนไม่เอา ดูที่หน้า Refind มันจะมี Path อยู่ว่ามันเจออยู่ที่ไหน เข้า Ubuntu ไปลบทิ้ง ก็จะเหลือที่เราจะใช้เท่านั้น
Path Config อยู่ที่
/boot/efi/EFI/refind/refind.config

ใส่ Disabled ในอันที่ไม่ต้องการให้แสดง ใส่ yes ให้แสดง

3/17/2021

Axapta : Movement สร้าง Serial number อัตโนมัติ

 Axapta : Movement สร้าง Serial number อัตโนมัติ
เช่น Move Valve 300 ตัวจาก 182011407463 -300 ตัว
ไปเป็นอีก Code 182011407455 300 ตัว
- ตัวลบให้จอง ราคาเท่ากัน
- ตัวบวกต้องสร้าง Serial number ทำได้สองวิธี
1. แก้ที่ Item Serial number group ติ๊ก Inventory activation เพื่อให้สร้าง Serial number Auto (วิธีนี้จะง่าย)


2. ใช้วิธี Inventory registration เพื่อแบ่ง Serial number

ทำวิธีที่ 1 ง่าย แล้วให้ User Post เสร็จแล้วแก้กลับคืน

Axapta หาวันที่สิ้นเดือน

 Axapta หาวันที่สิ้นเดือน

  1. static void LastOfMonth(Args _args)
  2. {
  3.    TransDate transDate=today();
  4.    TransDate LastOfMth;
  5.    ;
  6.  
  7.    //LastOfMth=endmth(mkdate(1,1,2014));//To enter date using business logic.
  8.    //LastOfMth   = str2date(strfmt("%1/%2/%3", 1, intMonth-1, intYear), 123);
  9.    //transDate     = str2date(date2str(LastOfMth,123,2,4,2,4,4), 123);
  10.  
  11.    LastOfMth=endmth(transDate);
  12.  
  13.    info(date2str(LastOfMth,123,2,4,2,4,4));
  14. }

3/03/2021

Ubutun : Terminal แตกไฟล์เอาเฉพาะไฟล์ที่ต้องการ

 Ubutun : Terminal แตกไฟล์เอาเฉพาะไฟล์ที่ต้องการ

วิธีนี้แตกเฉพาะไฟล์ที่ต้องการ
https://askubuntu.com/questions/168795/ ... ar-archive

เช่น ตัวอย่างไฟล์ zip ตามแนบ
คำสั่ง เช่น

tar -xf Test.tar.gz Test/123/456/ฝบง./hostneverdie.pdf
tar -xf Test.tar.gz Test/123/456/77.txt
ก็จะได้เฉพาะไฟล์ที่ต้องการ แต่ Path ที่อยู่ของไฟล์จะแตกตามเดิม จะได้รู้ว่าไฟล์อยู่ที่ไหน


2/16/2021

SQL : Select ข้อมูลหลาย Field มาเป็นเงื่อนไข Like

 

SQL : Select ข้อมูลหลาย Field มาเป็นเงื่อนไข Like
เช่นข้อมูลหลาย Field เหมือน Code ทรัพย์สิน แต่ต้องการค้นหาค่าโดยการใช้ LIKE และเอา Field มาเรียงกันให้เป็นรหัสทรัพย์สิน และใช้ Linke เพื่อค้นหา
ใช้ CONCAT
  1. SELECT CONCAT(`FirstCode`,`AccountCode`,`TypeCode`,`SubTypeCode`,`RunNo`) FROM `asset`
  2. WHERE CONCAT(`FirstCode`,`AccountCode`,`TypeCode`,`SubTypeCode`,`RunNo`) LIKE '%003%'


https://www.w3schools.com/sql/func_mysql_concat.asp

Axapta : ทดสอบ End คำสั่งผลิต

แบ่งออกเป็น 2 แบบ
1. Status ปกติ
status : Reported as finished Remain status : Costing
PD20-005988 2/2 end อย่างเดียว ผ่าน
PD15-023760 4/9 end ผ่าน ไม่มี report 0
PD15-023761 4/9 end + report ผ่าน ไม่มี report 0
PD15-023717 4/9 end + report ผ่าน ไม่มี report 0
PD13-002716 2/120 end + report ผ่าน ไม่มี report 0 และไม่มี report ยอด + เพิ่ม

status : Cost accounted Remain status : Costing
PD20-003066 2/2 end + report ผ่าน ไม่มี reports 0

2. Status ผิดปกติ
status : Start Remain status : Costing
PD18-002516 1/1 end อย่างเดียวจะไม่เกิดอะไรขึ้น เพราะ Status ไม่ตรง ต้องติ๊ก report ด้วย มี report 0 แสดง
PD15-023626 4/21 end อย่างเดียวจะไม่เกิดอะไรขึ้น เพราะ Status ไม่ตรง ต้องติ๊ก report ด้วย มี report 0 แสดง และไม่มี report ยอด+เพิ่ม
PD15-023559 4/9 end อย่างเดียวจะไม่เกิดอะไรขึ้น เพราะ Status ไม่ตรง ต้องติ๊ก report ด้วย มี report 0 แสดง และไม่มี report ยอด+เพิ่ม

สรุป
คำสั่งผลิต ที่ Status ปกติ คือ ถ้ามีการ Reports และ Costing ไปแล้ว
status : Reported as finished Remain status : Costing สามารถ End อย่างเดียว หรือ ติ๊ก reports ก็ได้ จะไม่มีการ reports ยอดเป็น 0 โดยระบบ
จำนวนไม่ครบกับจำนวนที่ Start ก็จะไม่มี Reports ยอดเพิ่ม


คำสั่งผลิต ที่ Status ผิดปกติ เช่น Reports และ Update Costing ไปแล้ว แต่ Status ยังเป็น Start อยู่
status : Start Remain status : Costing
ถ้า ติ๊ก End อย่างเดียวจะไม่เกิดอะไรขึ้น เพราะ Status ไม่ตรง ต้องติ๊ก Reports ด้วย มี Reports 0 โดยโปรแกรม
ถ้าจำนวน Start ไม่เท่ากับจำนวน Reports จะไม่มีการ Reports ยอด + เพิ่ม

Flutter ติดตั้ง Linux

Flutter ติดตั้ง Linux

ติดตั้งตาม
https://porpramarn.blogspot.com/2021/02/flutter-mobile-app.html


เพิ่มเติม
https://flutter.dev/docs/get-started/install/linux
1. โหลด แตกไฟล์ เข้า Folder Run คำสั่ง

  1. flutter precache

2. ทำใน User ธรรมดาไม่ต้องเข้า Root
3. Run
  1. export PATH="$PATH:`pwd`/flutter/bin"

4. Run
  1. flutter doctor

มี Error
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 1.22.5, on Linux, locale en_US.UTF-8)
[!] Android toolchain - develop for Android devices
✗ Unable to locate Android SDK.
Install Android Studio from: https://developer.android.com/studio/index.html
On first launch it will assist you in installing the Android SDK components.
(or visit https://flutter.dev/docs/get-started/in ... roid-setup for detailed instructions).
If the Android SDK has been installed to a custom location, set ANDROID_HOME to that location.
You may also want to add it to your PATH environment variable.

✗ No valid Android SDK platforms found in /usr/lib/android-sdk/platforms. Directory was empty.
[!] Android Studio (not installed)
[✓] VS Code (version 1.52.1)

[✓] Connected device (1 available)

! Doctor found issues in 2 categories.

ต้อง Set Path ให้ Android SDK และ Android-studio
  1. flutter config --android-sdk /PATH/

flutter config --android-sdk /media/DATA2/Android-SDK/
flutter config --android-studio-dir /media/DATA2/android-studio/


5. Error
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
✗ Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses
[!] Android Studio
✗ Flutter plugin not installed; this adds Flutter specific functionality.
✗ Dart plugin not installed; this adds Dart specific functionality.

- Run ตอบ Y ให้หมด
  1. flutter doctor --android-licenses


- เปิดโปรแกรม Android Studio ไปที่ตั้งค่า --> Plugins ค้นหา Flutter, Dart แล้ว Install แล้วปิดเปิดโปรแกรม Android Studio ใหม่


- Run คำสั่ง หา Path
  1. which flutter dart

เข้าไปตั้งค่าใน Android Studio --> Setting --> Languages & Frameworks --> Flutter
เลือก Path ที่ มีโปรแกรม Fultter ที่แตกไว้