Replace static-path symbolic link to reletive-path

เคสปัญหา megento มันสร้าง symbolic link พวก static file ไว้ใน pub/ แต่มันสร้างแบบ static-path ลากมาตั้งแต่ /home/ เลย เลยทำให้มันปัญหากับสิทธิ์เว็บเซิร์ฟเวอร์ในการเข้าถึงไฟล์ เก็บคำสั่งไว้คร่าวๆ ก่อนแล้วกัน

#!/bin/sh

find -type l > links

while read i; do
 target=$(readlink "${i}");
 if [[ $target == /home/* ]]; then
 count=$(grep -o "/" <<< "$i" | wc -l)
 count=$(( $count - 1 ))
 prefix=$( printf "%${count}s\n" | sed "s# #../#g" );
 suffix=$( echo $target | sed 's#^.*/public_html/##' );
 newlink="${prefix}${suffix}"
 ln -sfv $newlink $i;
 fi;
done < links

 

Installing memcache on PHP 7.1

แปะเก็บไว้

CentOS 6 (prerequisite)

# install webtatic repo
rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
# install memcache things
yum -y install yum-plugin-replace
yum -y install libmemcached
yum -y replace libmemcached --replace-with libmemcached10
yum -y install libmemcached10-devel.x86_64

CentOS 7 (prerequisite)

yum -y install libmemcached-devel

 Install memcached.so

yum -y install git
cd ~
git clone https://github.com/php-memcached-dev/php-memcached.git
cd php-memcached
git checkout php7
phpize
./configure --disable-memcached-sasl
make
make install

DirectAdmin (CentOS 7) + munin dynamic zoom

ปกติเวลา setup เครื่อง ผมจะปิดการใช้งาน cgi ของ apache อยู่แล้ว เพื่อความสบายใจว่าไม่ต้องกังวลกับช่องโหว่ของ cgi บลาๆ. แต่ล่าสุดมีเครื่องนึงที่อยากจะซูมดูกราฟของ munin แต่มันติดว่าทำไม่ได้ :'( ก็เลยลองพยายามที่จะปรับให้มันใช้ได้ดู. Continue reading “DirectAdmin (CentOS 7) + munin dynamic zoom”

using “this” in React event handler method

ใน method ที่ใช้เป็น Event handler ถ้าเขียนโดยใช้ ES2015 มันจะไม่สามารถเรียก this เพื่อเข้าถึง object ของ Component ได้ ซึ่งจะต้องสั่ง bind this ไว้ใน constructor ลักษณะนี้

class MyButton extends React.Component {
  static defaultProps = {
    text: 'Click'
  }
  static propTypes = {
    text: React.PropTypes.string.isRequired
  }
  state = {
    text: this.props.text
  }

  constructor(props) {
     super(props);
     this.clickHandler = this.clickHandler.bind(this); // <------ Bind here
  }

  clickHandler(e) {
    e.preventDefault();
    this.setState({ text: 'clicked' });
  }

  render() {
    return(
      <button onClick={ this.clickHandler }>
          { this.state.text }
      </button>
    );
  }
}

socket.io behind nginx (response code: 400)

เจอ error แบบนี้ใน console ของ browser

failed: Error during WebSocket handshake: Unexpected response code: 400

แก้โดยปรับ config ของ nginx ให้เป็นแบบนี้

location / {
  proxy_pass http://localhost:8080;
  proxy_http_version 1.1;
  proxy_set_header Upgrade $http_upgrade;
  proxy_set_header Connection "upgrade";
  proxy_set_header Host $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

(สีแดง คือ ที่เพิ่งเพิ่มเข้าไปทีหลัง แล้วมันแก้ปัญหาได้)

ปัญหา CURL ไป https:// บางที่แล้ว error

ถ้าเสิร์ช Google หลายๆ ที่จะบอกให้ปิด CURLOPT_SSL_VERIFYPEER ตอนเรียกใช้ curl ซึ่งจริงๆ แล้วเพื่อความปลอดภัย เราไม่ควรจะปิดการเช็คตรงนั้น

สำหรับวิธีแก้ที่ถูกต้องคือ ให้เราไปดาวน์โหลดไฟล์ cacert.pem จากเว็บนี้ http://curl.haxx.se/docs/caextract.html มา

แล้วแก้ที่ไฟล์ php.ini ลักษณะนี้

curl.cainfo=c:\php\cacert.pem

DirectAdmin mysql installation problem

หากเกิดปัญหาบางอย่าง ที่ทำให้การติดตั้ง mysql ไม่สมบูรณ์ สามารถใช้ script: /usr/local/directadmin/scripts/mysql.sh ในการแก้ไขได้…

ข้อควรระวัง: รู้สึกว่ามันจะเคลีย database เดิมด้วย ไม่แน่ใจว่าเฉพาะ database mysql หรือเปล่า.

Installing Apache 2.4, PHP 5.5 Windows 7

  1. สร้างโฟลเดอร์ c:/wamp/
  2. ดาวน์โหลดไฟล์ httpd-2.4.7-win32-VC11.zip (ถ้าอยากได้เวอร์ชั่นล่าสุดให้ดูที่เว็บนี้ http://www.apachelounge.com/download/) บทความนี้เลือกใช้ win32 เพราะว่า VC11 x86 Thread Safe ในเว็บ PHP มันยังเป็น experimental อยู่
  3. เอาไฟล์ของ httpd ที่โหลดในข้อก่อนหน้า มา Extract ไว้ที่พาท
    c:/wamp/apache2.4_win32/
  4. ดาวน์โหลดไฟล์ php-5.5.7-Win32-VC11-x86.zip (ถ้าอยากได้เวอร์ชั่นล่าสุดหาดูจากที่นี่ http://windows.php.net/download/ ให้เลือกอันที่เป็น VC11 Thread Safe ส่วนถ้า x64 มันไม่ experimental แล้ว ก็น่าโหลดเอามาใช้นะ แต่ต้องเปลี่ยน httpd ให้เป็น win64 ด้วย)
  5. สร้างโฟลเดอร์ c:/wamp/php-5.5.7_win32/ เอาไฟล์ที่โหลดก่อนนี้มาใส่พาทนี้
  6. แก้ไฟล์ c:/wamp/apache2.4_win32/conf/httpd.conf
    Replace: c:/Apache24/htdocs
    With: c:/wamp/www
  7. เติม code นี้เข้าไปที่ด้านล่างสุด
    LoadModule php5_module "c:/wamp/php-5.5.7/php5apache2_4.dll"
    AddHandler application/x-httpd-php .php
    PHPIniDir "c:/wamp/php-5.5.7"
    DirectoryIndex index.html index.php
  8. Load Module ดังนี้
    1. mod_expires.so
    2. mod_headers.so
    3. mod_rewrite.so
    4. mod_socache_shmcb.so
    5. mod_ssl.so
    6. mod_vhost_alias.so
  9. Uncomment บรรทัดนี้ Include conf/extra/httpd-ssl.conf
  10. แก้ไฟล์ c:/wamp/apache2.4_win32/conf/extra/httpd-ssl.conf
    1. SSLCertificateFile “C:\wamp\apache2.4_win32\conf\server.crt”
    2. SSLCertificateKeyFile “C:\wamp\apache2.4_win32\conf\server.key”
    3. DocumentRoot “c:/wamp/www”
  11. ไปที่โฟลเดอร์ php-5.5.7_win32 แล้ว copy php.ini-development ตั้งชื่อไฟล์เป็น php.ini
  12. แก้ไฟล์ php.ini
    1. extension_dir = “C:/wamp/php-5.5.7_win32/ext”
    2. date.timezone = “Asia/Bangkok”
    3. enable extensions
      1. php_curl.dll
      2. php_gd2.dll
      3. php_imap.dll
      4. php_mbstring.dll
      5. php_mysql.dll
      6. php_mysqli.dll
      7. php_openssl.dll
      8. php_tidy.dll
    4. เติมโค๊ดนี้ที่ท้ายไฟล์
      zend_extension="c:\wamp\php-5.5.7_win32\ext\dbg-php-5.5.dll"
      [debugger]
      debugger.enabled=on
      debugger.profiler_enabled=on
      debugger.hosts_allow= 127.0.0.1 localhost ::1 127.0.0.1
      debugger.hosts_deny=ALL
      debugger.ports=7869
  13. copy ไฟล์ dbg-php-5.5.dll จากในโฟลเดอร์โปรแกรม phpED ไปใส่ตรง c:\wamp\php-5.5.7_win32\ext\ ด้วย
  14. เปิด cmd โดย run as administrator
    1. รันคำสั่ง
    2. cd /wamp/apache2.4_win32/conf/
    3. ..\bin\openssl.exe req -config openssl.cnf -x509 -nodes -subj “/C=TH/ST=Bangkok/L=Bangkok/O=localhost/OU=SEC/CN=localhost” -days 1825 -newkey rsa:2048 -keyout server.key -out server.crt
    4. c:\wamp\apache2.4_win32\bin\httpd.exe -k install
  15. (ข้อนี้ข้ามไปก็ได้ ไว้ถ้ามีปัญหาค่อยกลับมาทำ)
    ใน Environment Variables ตรง System Variables
    ที่ตัวแปร PATH ให้เติม C:\wamp\apache2.4_win32\; C:\wamp\apache2.4_win32\bin ต่อเข้าไป

 

วิธีการ configure vhost

<VirtualHost 127.0.0.1:80>
  DocumentRoot "C:/wamp/site2/"
  ServerName www.site2.local
  ServerAlias site2.local www.site2.local
</VirtualHost>
<VirtualHost 127.0.0.1:443>
  DocumentRoot "C:/wamp/site2/"
  ServerName www.site2.local
  ServerAlias site2.local www.site2.local
  SSLEngine on
  SSLCertificateFile "c:/Wamp/Apache2.4_win32/conf/server.crt"
  SSLCertificateKeyFile "c:/Wamp/Apache2.4_win32/conf/server.key"
</Virtual>

ถ้าในกรณีที่ DocumentRoot ของ VirtualHost อยู่คนละพาทกับ DocumentRoot หลักใน httpd.conf ให้ไปเพิ่ม <Directory … > ….. </Directory> ใน httpd.conf ด้วย

Customize Zimbra’s Skin

ตำแหน่งโฟลเดอร์ skins ของ Zimbra จะอยู่ประมาณนี้ (อันใดอันหนึ่ง ขึ้นอยู่กับการติดตั้ง)

/opt/zimbra/jetty-distribution-7.6.12.v20130726/webapps/zimbra/skins/
/opt/zimbra/tomcat/webapps/zimbra/skins/

อาจจะใช้คำสั่ง find /opt/zimbra/ -type d -name skins เพื่อหาโฟลเดอร์ดังกล่าว

ค่าต่างๆ ใน CSS มาจากตัวแปรที่กำหนดในไฟล์ skin.properties ที่อยู่โฟลเดอร์ skin แต่ละอัน

นอกจาก CSS แล้ว มันก็ยังมีให้แก้รูป Logo ได้ด้วย

ในไฟล์ skin.properties จะมีการกำหนดว่าตัวเอง extend มาจากไฟล์ไหนด้วย  ก็ลองดู Format ตัวแปรไฟล์นั้นๆ ได้

หลังจากแก้เสร็จแล้วให้ restart zimbra ด้วยคำสั่ง

su zimbra
zmcontrol stop
zmcontrol start

จริงๆ อาจจะมีวิธี reload ที่ดีกว่าการ stop / start เพราะว่ามันรอนานเหมือนกัน

Reference:
http://wiki.zimbra.com/wiki/Customizing_Themes_and_Adding_Zimbra_Powered_Logo_-_Open_Source_Edition

How to check array isset and is_null in PHP

ถ้า value ของ Array ช่องนึงเป็น NULL เวลาที่เช็คด้วยคำสั่ง isset มันจะได้ false ดังตัวอย่างนี้

<?php
    $arr = array();
    $arr['foo'] = NULL;
    var_dump( isset( $arr['foo'] ); // ให้ผลลัพท์เป็น bool(false)
?>

วิธีที่จะเช็คว่า Array มีการกำหนด key นั้นอยู่ และค่าของมันเป็น NULL ด้วย ให้ใช้คำสั่ง array_key_exists ดังตัวอย่างนี้นี้

<?php
    if ( array_key_exists( 'foo', $arr ) && is_null( $arr['foo'] ) )
        echo "OK";
?>