Tag Archive ลิงค์

WSL: Remove links shortcut

การนำ link ออกโดยไม่เป็นการลบไฟล์ข้างในออก ทำได้โดย

  1. cd ไปที่ parent path ที่ต้องการจะนำ linlk ออกก่อน เช่น ทำ links ไว้ที่ /var/www/prototypes_laravel/www ก็จะเป็น /var/www/prototypes_laravel

    cd /var/www/prototypes_laravel
  2. list รายการที่เป็น link โดย

    ls -l

    จะเห็นข้อมูลประมาณ
    total 0
    lrwxrwxrwx 1 root root 48 Jul 5 10:40 www -> /mnt/c/UsersDatas/var/www/prototypes_laravel/www
    list รายการที่เป็น link โดย

    ls -l

    จะเห็นข้อมูลประมาณ

    total 0
    lrwxrwxrwx 1 root root 48 { เวลา } www -> /mnt/c/UsersDatas/var/www/prototypes_laravel/www

    โดยหลังเวลาจะเห็นส่วนที่เป็น link คือ www
  3. นำลิงค์ออกไปโดยคำสั่ง sudo unlink { link } เช่น

    sudo unlink www

path /var/www/prototypes_laravel จะไม่มี folder www ให้เห็นแล้ว แต่ใน /mnt/c/UsersDatas/var/www/prototypes_laravel/www จะยังมีไฟล์ต่าง ๆ อยู่ครบเหมือนเดิม

WSL: Creating links shortcut

การสร้าง hard link หรือ Symbolic link ใน linux จะคล้าย ๆ การทำ shortcut ให้สามารถเข้าไปใช้ไฟล์หรือfolder ได้ง่าย ๆ เหมือน windows shortcut

การใช้ command นี้มีรูปแบบ ln source_file target_file เช่น ต้องการทำ shortcut ให้ /mnt/c/UsersDatas/var/www/prototypes_laravel/www สามารถเรียกใช้ได้จาก /var/www/prototypes_laravel/www ใน linux จะใช้คำสั่ง

sudo ln -s /mnt/c/UsersDatas/var/www/prototypes_laravel/www /var/www/prototypes_laravel/www

ทดสอบโดยใช้ คำสั่งเช่น cd /var/www/prototypes_laravel/www
ls
จะเห็นว่าสิ่งที่อยู่ด้านในจะเหมือนกับที่อยู่ใน /mnt/c/UsersDatas/var/www/prototypes_laravel/www หรือ C:\UsersDatas\var\www\prototypes_laravel\www

ดูเพิ่มเติม

joGet: Pending Process Activity and Assignees

ต้องการสร้าง List ใน joGet เพิ่อที่จะได้ดูสถานะและเข้าไปดู form ใน process ตามขั้นตอนต่างๆ ใน workflow

ทำได้โดยใช้ความรู้ 2 เรื่องคือ

การใช้ query เพิ่อดู process activity

process ที่กำลังอยู่ระหว่างสถานะต่างๆ จะถูกบันทึกลงใน database สามารถ query มาดูได้โดยใช้ตัวอย่าง เช่น

SELECT
a.*,
sact.Name AS activityName,
GROUP_CONCAT(DISTINCT sass.ResourceId
SEPARATOR ', ') AS assignee
FROM
app_fd_hr_expense_claim a
JOIN
SHKActivities sact ON a.id = sact.ProcessId
JOIN
SHKActivityStates ssta ON ssta.oid = sact.State
INNER JOIN
SHKAssignmentsTable sass ON sact.Id = sass.ActivityId
WHERE
ssta.KeyValue = 'open.not_running.not_started'
GROUP BY a.id

ตามตัวอย่างใน List Pending Activity and Assignees อย่าลืมเปลี่ยนตาราง a เป็นตารางที่ใช้ใน process จริงๆ

การใช้ link ไปยังฟอร์มตาม activity
ลิงค์ของ joget จะอยู่ในรูปแบบ /jw/web/userview/ {app id} / {userview id} /_/ {process_id} ?_action=assignmentView

ตัวอย่าง list ที่เสร็จแล้ว

{"id":"activity_and_assignees","name":"Activity And Assignees","pageSize":"0","order":"","orderBy":"","showPageSizeSelector":"true","pageSizeSelectorOptions":"10,20,30,40,50,100","buttonPosition":"bottomLeft","checkboxPosition":"left","useSession":"false","hidePageSize":"true","description":"","rowActions":[{"name":"Data List Hyperlink Action","className":"org.joget.apps.datalist.lib.HyperlinkDataListAction","label":"Hyperlink","type":"text","id":"rowAction_0","properties":{"href":"\/jw\/web\/userview\/vehicle\/carpark\/_\/car_park_registration?_action=assignmentView","target":"_self","hrefParam":"activityId","hrefColumn":"activityId","label":"Run Process","confirmation":"","visible":"","rules":[]}}],"actions":[],"filters":[],"binder":{"className":"org.joget.plugin.enterprise.JdbcDataListBinder","properties":{"jdbcDatasource":"default","sql":"SELECT \n    a.*,\n    sass.activityId,\n    sact.Name AS activityName,\n    GROUP_CONCAT(DISTINCT sass.ResourceId\n        SEPARATOR ', ') AS assignee\nFROM\n    app_fd_cars AS a\n        JOIN\n    SHKActivities AS sact ON a.id = sact.ProcessId\n        JOIN\n    SHKActivityStates AS ssta ON ssta.oid = sact.State\n        INNER JOIN\n    SHKAssignmentsTable AS sass ON sact.Id = sass.ActivityId\nWHERE\n    ssta.KeyValue = 'open.not_running.not_started'\nGROUP BY a.id","primaryKey":"id"}},"columns":[{"id":"column_0","label":"id","displayLabel":"id","name":"id"},{"id":"column_1","label":"c_licensePlate","displayLabel":"c_licensePlate","name":"c_licensePlate"},{"id":"column_2","label":"c_brand","displayLabel":"c_brand","name":"c_brand"},{"id":"column_3","label":"c_approve","displayLabel":"c_approve","name":"c_approve"},{"id":"column_4","label":"activityName","displayLabel":"activityName","name":"activityName"},{"id":"column_5","label":"assignee","displayLabel":"assignee","name":"assignee"}]}

นอกจากนี้ยังสามารถหาตัวอย่างได้จาก app Process Monitor Utility ได้อีกด้วย

Joget: สร้างรายงาน pdf excel

การสร้างรายงานใน joget ทำได้โดยใช้ Jaspersoft® Studio สร้างรูปแบบรายงาน จากนั้นก็ให้ joget เรียกใช้ jasper libary สร้างรายงานออกมาให้เรา

การกรอกข้อมูล report

  1. สร้าง report ให้เรียบร้อยใน jaspersoft studio
  2. เปิด user view ขึ้นมา กด Add Category ด้านล่าง ขึ้นมาใหม่ คลิก Permission Icon คลิก Hide From Menu จะได้ไม่แสดง ในเมนูให้ผู้ใช้เห็น
  3. ลาก JasperReports มาวางใน Category ของเรา
  4. กรอกข้อมูล
    • Custom ID เป็น id ที่จะอ้างถึงเวลาที่เราต้องการดู report
    • Label เป็นแค่ชื่อที่ทำให้จำ JasperReports ว่าตัวไหนเป็นตัวไหน จะเห็นแค่ใน user view เท่านั้นไม่เกี่ยวกับตอนออกรายงาน ควรตั้งชื่อให้สื่อความหมาย
  5. Jasper Reports Definition (JRXML) คือ code ที่ได้มาจาก jaspersoft studio
  6. คลิก next
  7. Datasource คือ database connection ปกติใช้เป็น Default Datasource
  8. คลิก next
  9. ระบุ parameters ที่ส่งให้ report โดย
    • Name คือ ชื่อ parameter ที่ report ต้องการ
    • Value คือ ค่าที่จะส่งไป ถ้าส่งค่าด้วย url สามารถใช้ hash variable #requestParam. ชื่อ parameter # ได้เลยเช่น #requestParam.member_id#

การเรียกดูรายงาน

จะทำได้โดยเรียก

  • url domain / server ip /: port โดยทั่วไปคือ 8080
  • action=report
  • appId= application id
  • appVersion= version ของ user view
  • key=_&
  • menuId= คือ Custom ID ใน userview นั่นเอง
  • type= จะแสดงเป็นไฟล์ format อะไร มีให้เลือก pdf และ xls
  • userviewId= คือ id ของ userview
  • query string ที่จะส่ง parameter ให้ report เช่น &member_id=xxxxx

ถ้า

  • userview ของเรามี url http://localhost:8080/jw/web/console/app/develop/1/userview/builder/testUserview
  • Custom ID มีค่า profile
  • Parameter ที่ต้องส่งไปคือ member_id

จะเรียกดูรายงานได้จากรูปแบบ http://localhost:8080/jw/web/json/plugin/org.joget.plugin.enterprise.JasperReportsMenu/service?action=report&appId=develop&appVersion=1&key=_&menuId=profile&type=pdf&userviewId=testUserview&member_id=0910097693

บั๊คที่แท้มันคืออะไรตับไตใส้พุง

มี user ถามมาว่า bug คืออะไร ทำไม่มี bug ก็เลยลองเขียนตัวอย่างให้ดู ยกตัวอย่างบัคที่เกิดจาการกรอกข้อมูลผิดไปจากที่ระบบออกแบบและคาดหวังไว้ ก็มีคำถามกลับมาประมาณว่าทำไม่ไม่ตรวจให้หมดละ เลยลองทำตัวอย่างออกมา

<?php

$strings = [
    '!@#$%^&*()_-+="{}[]\+:<>,./?',
    'Apple Inc.',
    'email.gmail.com',
    'email.job.co.th',
    '[email protected]',
    '[email protected]',
    'https://pitt.plusmagi.com/about/',
    'https://pitt.plusmagi.com/เชื่อมต่อ-php-กับ-sql-server-sqlsrv/',
    'james bond 007',
    'johnny english พยัคฆ์ร้าย 00ก๊าก',
    'pitt@小米科技.cn',
    'sale 20%',
    'Xiaomi Inc. (小米科技)',
    'Xiaomi Inc.',
    'พิชญ์ พันธุ์สนิท pitt phunsanit',
    'พิชญ์ พันธุ์สนิท',
    'พิชญ์@gmail.com',
    'หนึ่งในพระราชดำริ ช่อง 9',
    'หนึ่งในพระราชดำริ ช่อง ๙',
    'ไทย นี่มันไทยจริงๆ',
];

function validateAlphanumeric($string)
{
    if (preg_match('/[^A-Za-z0-9]/', $string)) {
        return true;
    } else {
        return false;
    }
}

function validateAlphanumericEnglish($string)
{
    if (preg_match('/^[a-zA-Z0-9\s]+$/', $string)) {
        return true;
    } else {
        return false;
    }
}

function validateAlphanumericThai($string)
{
    if (preg_match('/[^A-Za-z0-9-ก-๙]/', $string)) {
        return true;
    } else {
        return false;
    }
}

function validateAlphanumericThaiOnly($string)
{
    /* อักษรภาษาไทย และ space */
    if (preg_match('/^[ก-ฮ\s]+$/', $string)) {
        return true;
    } else {
        return false;
    }
}

function validateEmail($string)
{
    if (filter_var($string, FILTER_VALIDATE_EMAIL)) {
        return true;
    } else {
        return false;
    }
}

function validateFilterURL($string)
{
    if (filter_var($string, FILTER_VALIDATE_URL)) {
        return true;
    } else {
        return false;
    }
}

function validatePregURL($string)
{
    if (preg_match('/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i', $string)) {
        return true;
    } else {
        return false;
    }
}

echo '<!doctype html>
<html>
   <head>
      <meta charset="utf-8">
      <title>PHP String Validation By Ptii Phunsanit</title>
      <meta name="author" content="Pitt Phunsanit">
      <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" type="text/css">
   </head>
   <body>
      <table class="table table-striped">
      <caption>
         PHP String Validation
      </caption>
      <thead>
         <tr>
            <th>Test</th>
            <th>String</th>
            <th colspan="4">Alphabet</th>
            <th>Email</th>
            <th colspan="2">URL</th>
         </tr>
         <tr>
            <th></th>
            <th></th>
            <th>Alphanumeric</th>
            <th>Alphanumeric English</th>
            <th>Alphanumeric Thai</th>
            <th>Alphanumeric Thai Only</th>
            <th>Email</th>
            <th>Filter URL</th>
            <th>Preg URL</th>
         </tr>
      </thead>
      <tbody>';
foreach ($strings as $no => $string) {
    echo '<tr>',
    '<th>', ($no + 1), '</th>',
    '<th>', $string, '</th>',
    '<td>', (int) validateAlphanumeric($string), '</td>',
    '<td>', (int) validateAlphanumericEnglish($string), '</td>',
    '<td>', (int) validateAlphanumericThai($string), '</td>',
    '<td>', (int) validateAlphanumericThaiOnly($string), '</td>',
    '<td>', (int) validateEmail($string), '</td>',
    '<td>', (int) validateFilterURL($string), '</td>',
    '<td>', (int) validatePregURL($string), '</td>',
        '</tr>';
}
echo '</tbody></table></body></html>';

ผลที่ได้ ดูเต็มๆ เว็บนี้ยังมี bug เลย แต่ไม่คุ้มที่จะแก้
1 คือผ่านการทดสอบ 0 คือ ไม่ผ่านการทดสอบ

PHP String Validation
Test String Alphabet Email URL
Alphanumeric Alphanumeric English Alphanumeric Thai Alphanumeric Thai Only Email Filter URL Preg URL
1 !@#$%^&*()_-+=”{}[]\+:<>,./? 1 0 1 0 0 0 0
2 Apple Inc. 1 0 1 0 0 0 0
3 email.gmail.com 1 0 1 0 0 0 0
4 email.job.co.th 1 0 1 0 0 0 0
5 [email protected] 1 0 1 0 1 0 0
6 [email protected] 1 0 1 0 1 0 0
7 https://pitt.plusmagi.com/about/ 1 0 1 0 0 1 1
8 https://pitt.plusmagi.com/เชื่อมต่อ-php-กับ-sql-server-sqlsrv/ 1 0 1 0 0 0 1
9 james bond 007 1 1 1 0 0 0 0
10 johnny english พยัคฆ์ร้าย 00ก๊าก 1 0 1 0 0 0 0
11 pitt@小米科技.cn 1 0 1 0 0 0 0
12 sale 20% 1 0 1 0 0 0 0
13 Xiaomi Inc. (小米科技) 1 0 1 0 0 0 0
14 Xiaomi Inc. 1 0 1 0 0 0 0
15 พิชญ์ พันธุ์สนิท pitt phunsanit 1 0 1 0 0 0 0
16 พิชญ์ พันธุ์สนิท 1 0 1 1 0 0 0
17 พิชญ์@gmail.com 1 0 1 0 0 0 0
18 หนึ่งในพระราชดำริ ช่อง 9 1 0 1 0 0 0 0
19 หนึ่งในพระราชดำริ ช่อง ๙ 1 0 1 1 0 0 0
20 ไทย นี่มันไทยจริงๆ 1 0 1 1 0 0 0

เริ่มจากชุดแรก Alphanumeric ใช้ preg_match(‘/[^A-Za-z0-9]/’, $string เหมือนจะดูดี ตามคู่มือคือเทียบโดยตัวอักษร a ถึง z และตัวเลข 0 ถึง 9 แต่ขอโทษชุดสตริงค์ แปลกๆ ?!@#$%^&*()_-+=”{}[]\+:<>,./ มันยังผ่าน จนด้วยคำพูดจริงๆ ใส่อะไรก็ผ่าน

ชุดที่ 2 Alphanumeric English ใช้ preg_match(‘/^[a-zA-Z0-9\s]+$/’, $string) ผลคือ ที่มีอักษรไทยอยู่ตกหมด และ james bond 007 ผ่าน แต่ Apple Inc. กับตัวอื่นๆ ตกไปง่ายๆแค่ใส่ . สรุปถ้าเขียนเป็นประโยคมาก็จบชีวิต

ชุดที่ 3 Alphanumeric Thai ใช้ preg_match(‘/[^A-Za-z0-9-ก-๙]/’, $string) รั่วทุกตัวอักษรอีกชุก ถึงจะใส่ ก-๙ มาอักษรจีนก็ยังรอดอยู่ดี

ชุดที่ 4 Alphanumeric Thai Only ใช้ preg_match(‘/^[ก-ฮ\s]+$/’, $string) มันไทยมากจริง อย่าได้ใส่เลขอารบิกมาเชียว บางคนก็ไม่รู้นะครับว่าเลขไทยนะมันพิมพ์ยังไง

ชุดที่ 5 Email ใช้ filter_var($string, FILTER_VALIDATE_EMAIL) ตรวจว่าเป็นอีเมล์จริงๆ รึเปล่า ผ่าน email.gmail.com และ พิชญ์@gmail.com ก็หลอกมันไม่ได้

ชุดที่ 6 ติดใจคำสั่ง filter_var ในข้อที่แล้วใช้ filter_var($string, FILTER_VALIDATE_URL) ผลคือ เกือบจะดีแล้ว ตรวจ url ได้จริงๆ ยกเว้น https://pitt.plusmagi.com/เชื่อมต่อ-php-กับ-sql-server-sqlsrv/ link ของบล๊อคของผมเองยังไม่ผ่าน ปวดตับ แม้แต่ function สำเร็จรูปก็ไม่ได้ดีเสมอตามที่คิดว่า “ใช้กันมากเป็นมาตราฐานมันต้องดีกว่าเขียนเองซิ” function filter_var ของ PHP มันออกมาตั้งแต่ 2 November 2006 ก็แค่ไม่กี่ปีเองมั๊ง ปีนี้ ค.ศ. อะไรแล้ว แต่มันก็ยังไม่รับภาษาอื่นนอกจากภาษาอังกฤษอยู่เหมือนเดิม ไม่ใช่ไม่มีคนแจ้งไปที่คนเขียนภาษา php นะ ตามนี้ แต่พี่แกก็ยังไม่แก้แค่นั้นเอง

ชุดที่ 7 ใช้ preg_match(‘/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i’, $string) ยาวยืดอย่าพิมพ์ผิดเชียว ผมก็ก๊อบเค้ามา แต่ตรวจ url ได้ถูกต้อง

ที่ทำตัวอย่างให้ดูสรุปคือ ในการเขียนโปรแกรมไม่มีอะไรที่ทำงานได้ดี 100% เต็ม ทำอย่างหนึ่งจะมีการแลกเปลี่ยนที่เท่าเทียม (รึเปล่า) ตามมาด้วยเสมอ อย่างตรวจ link แบบชุดที่ 6 จริงๆ มันตรวจว่าเป็นลิงค์เว็บจริงๆ มาได้หลายปีแล้ว แต่เว็บหลังๆ เน้นทำ SEO กับท้องถิ่นตามภาษาและประเทศมากขึ้นแทนที่จะใช้ภาษาอังกฤษอย่างเดียว ตอนนี้เลยต้องมาเขียนตัวตรวจสอบกันแบบยาวๆ และปวดตับมากกกก

การที่กว่าจะได้งานที่สมบูรณ์ที่สุดไกล้ความสมบูรณ์แบบถึงต้องใช้พลังและความร่วมมือจากทุกๆคน และมีค่าใช้จ่ายและเวลาที่สูงมาก ผลคือ การลดค่าใช้จ่ายอย่าง

  • บอกมานิดเดียว น้องไปคิดต่อเอาเองนะ พี่มางานอื่น (พี่ครับ ผมต้องเขียน business plan ต้องมาคิดให้ว่าบริษัทพี่นี่ มันขายอะไร ต้องทำยัง บริการอะไรบ้าง และมันทำงานยังไง สุดท้ายก็ออกมาขาดๆ เกินๆ)
  • ไม่จ้าง tester ครับ programmer เขียนเสร็จก็ต้องมาลองเอง เพราะว่าออกแบบและเขียนเองมากะมือ มันเลยจำติดอยู่ในสมองว่า ตรงนี้ต้องกรอกอะไร ตอนทดสอบ ก็เผลอทำแบบเดิม ทำมาให้กรอกตัวเลข ต้อนทดสอบก็ใส่ 1555, 5544, 444, 85 มัวๆไป ตอนให้ user ทำลองใช้ มีคนใส่โง่ๆ “100 บาท” เกิดอะไรขึ้น
    1. โปรแกรมก็เอา 100 บาท ไปใส่ในสูตร
      จำนวนบาท คูณจำนวน ก็ออกมาเป็น
      100บาท x 5 = ?
      แล้วก็บอกกลับมาว่า พ่องมึง คูณได้เหรอวะ แต่มันบอกมาแบบที่มีแต่โปรแกรมเมอร์ที่เข้าใจ แลัวฆ่าตัวตายไปต่อหน้าต่อตา
    2. บัญชีก็บอกว่า นี่ทำเสร็จแล้วเหรอ เทสแล้วแน่นะ
    3. คนเขียนเห็นก็อยากจะบอกว่า ข้างหลังใส่ label บาทให้ละ จะกรอกไปทำซากอะไร
    4. ทีนี้เกินอะไรขึ้นต่อไปในการประชุม
      • project manager ก็บอกว่านิดหนึ่งพี่ แก้ไม่ถึง 5 นาทีก็เสร็จแล้วครับ
      • programmer คิด มึงเคยถามกูยัง ทำไงต่อ ทำนานปะ แก้แล้วตรงไหนจะพังมั่ย แล้วอย่างอื่นมันจะทันป่าว
      • บัญชีของลูกค้าก็คิด ขี้เกียจเทสแน่ๆ เมื่อไหร่จะได้ใช้
      • เซลล์ก็คิด ทำไม่ไม่เอาใบส่งสินค้าที่เขียนกับมือ เข้าเครื่องถ่ายเอกสาร แล้วได้รายงานออกมาเลย ไม่เสียเวลา เอาไปขายให้ที่ไหนมีแต่คนอยากซื้อ ทำไม่ไม่ยอมทำ จะได้ขายง่ายๆ ซักที % จะได้เยอะๆ อุสาห์คิดให้ดีๆ ไม่เข้าใจ
      • ลูกค้า ก็คิด รู้งี้ยอมจ่ายอีกนิดจ้างอีกเจ้า ยอมไม่ไปเที่ยวเมืองนอกก็ได้ จะได้ทำอย่างอื่นซะที
    5. จ้างมาแพง ต้องรีบๆทำงาน ให้ได้ function ผลคือไม่ได้ test งานจริงๆ หรือให้มันใช้งานได้ง่าย อย่างงานที่เคยเจอต้องมีคนมา เอารูปถ่ายสินค้ามาตัดให้พอดีกับขนาดที่ใช้ในเว็บ ทั้งๆที่ ก็ถ่ายโดยกล้องเดิม ขนาดเดิม และมุมกล้องเดิมทุกวัน ทุกชิ้น ถ้ายอมให้เวลาเขียนโปรแกรมเพิ่มอีกนิด ก็แค่วางของที่เดิม กดถ่ายรูปแล้วโยนให้โปรแกรมมันตัดรูป เปลี่ยนขนาด แล้วเอาให้ลูกค้าดูเอง ประหยัดเวลาในชีวิตออกไปได้เยอะเลยแท้ๆ แต่พี่รีบ พี่ไม่อยากจ่ายเงินเพิ่ม

มันก็เหมือนคำพูดที่ว่า ของดีไม่แพง นั้นละครับ ยอมจ่ายได้แค่ไหน คนขายก็ประมาณ ต่อกันอย่างนี้ ขอฟรีเลยมั๋ยพี่ ที่สำคัญคือ จะหาจุดสมดุลย์ได้ที่ไหน ถึงจะพอใจกันทั้งสองฝ่าย

หาลิ๊งค์เว็บในบุ๊คมาร์กที่ซ้ำหรือตาย

สะสม link ใน Bookmarks มาหลายปีทั้งเว็บที่คิดว่าสวย หรือเว็บที่ใช้ช่วยในการทำงาน มากๆเข้าลองเปิดดูเห็นซ้ำไปหมด บางตัวก็ใช้ไม่ได้แล้ว กลายเป็นลิงค์ตายเมื่อไหร่ก็ไม่ทราบ จะหาที่ละตัวก็เสียเวลา

ในโครมจะมี extension เข้าไปโหลดได้ที่ https://chrome.google.com/webstore/search/bookmarks%20duplicate?hl=en-USโดยมีตัวที่น่าสนใจ 2 ตัวคือ

  1. Bookmark Sentry ตัวนี้สามารถหาลิงค์ที่ตาย (ทดลองเรียกแล้วเข้าไม่ได้) ตั้งเวลาให้ทำงานเองได้ แต่มีข้อเสียคือ เวลาค้นหา link ที่ซ้ำแล้ว ถ้าไปกด Delete มันจะลบแบบไม่ถงไม่ถามซักคำ ซึ่งผมไม่ชอบรู้สึกว่าน่าจะทำพลาดง่ายๆ แบบไม่มีโอกาสแก้ตัว
  2. SuperSorter options ตัวนี้ช่วยเรียงลำดับให้ใหม่ด้วย ถ้ามีรายการซ้ำมากๆตัวนี้จะใช้สะดวกกว่าตัวแรก แบบที่ภาษาทางสถิติเรียกว่าอย่างมีนัยสำคัญเลยละครับ แต่ไม่ช่วยหา death links ซะงัน

วิธีใช้งานทั้งสองตัวเหมือนกันคือ

  1. ในหน้า download เมื้อกี้กดปุ่ม +ADD TO CHROME
  2. กดปุ่ม ADD อีกครั้ง
  3. กดปุ่มที่ เส้นสามเส้น ที่อยู่ขวามือ บนสุด เลือก settings
  4. กด extensions หรือจะพิมพ์ chrome://extensions/ ในช่อง Address bar ก็ได้
  5. กด Options ใน Extension แล้วปรับแต่งการทำงานตามสะดวกเลยครับ

เพื่อความรวดเร็วใช้ SuperSorter หารายการซ้ำก่อน จากนั้นใช้ Bookmark Sentry หาลิงค์ตายต่อ