วันพฤหัสบดี, สิงหาคม 27, 2558

5 สิ่งที่ควรทำหลังลง OSX ใหม่

Imgur

ถ้านับจริงๆมันก็เกินล่ะครับ :P ขอใช้เลข 5 ให้ title มันสวยๆก็แล้วกัน

โพสนี้เป็นเหมือน checklist ที่ผมจะทำหากต้องติดตั้งหรือลง OSX ใหม่ (คือไม่ได้ upgrade แต่เนื่องจาก format harddisk เปลี่ยน harddisk ฯ)

ซอฟต์แวร์ส่วนใหญ่ในนี้จะเป็นของโปรแกรมเมอร์ซะส่วนใหญ่ แต่ถ้า คนอ่านที่หลงเข้ามาไม่ใช่สาย IT ผมก็คิดว่าซอฟต์แวร์บางตัวก็มีประโยชน์กับอาชีพอื่นๆ นอกจากโปรแกรมเมอร์เช่นกัน
ขั้นตอนการติดตั้งซอฟต์แร์ต่างๆ จำเป็นต้องใช้ internet ฉะนั้นก่อนจะพิมพ์คำสั่ง แล้วกด Enter ให้แน่ใจว่าเชื่อมต่อ internet อยู่นะครับ

1 ซอฟต์แวร์พื้นฐาน


Trim Enabler
Trim Enabler ผมใช้ SSD solid state drive จึงต้องลงตัวนี้ก่อน เพื่อ enable TRIM
เจ้า TRIM คืออะไรเอาง่ายๆคือ มันจะทำให้ประสิทธิที่ภาพการเขียนลง SSD disk ดีอยู่เสมอ อาจจะเห็นว่ามันแสดง 10USD โหลดมาเถอะครับ สิ่งที่เราต้องการไม่ต้องเสียเงิน เค้าคิด 10$ หากต้องการใช้ full feature

เขียนอ่าน NTFS partition/drive ได้
ตัวนี้ วิธีทำให้ OSX 10.10 Yosemite อ่าน/เขียน NTFS ได้ ของผมยังคงใช้งานได้อยู่

ohmyzsh
ตัวนี้ผมเรียกว่าเป็น shell utility ทำให้การใช้งาน command line สะดวกสบายขึ้นเยอะ
พิมพ์คำสั่งข้างล่างใน Terminal app เพื่อเริมการติดตั้ง
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
ติดตั้งแล้วก็ config มันหน่อย แก้ไข ~/.zshrc
ZSH_THEME="gnzh”
...
plugins=(git sublime osx)
ZSH theme จะเกี่ยวกับเรื่อง สีสันใน terminal และตัว prompt ของเรา
plugin 3 ตัวนี้

git เวลาอยู่ใน directory ที่เป็น Git repository มันจะแสดง prompt ให้เราเห็นชัดเจนเลย ว่าตอนนี้อยู่ใน Git repo แล้วอยู่ branch ไหนก็บอกได้ด้วย

sublime ตัวนี้ลงไว้เพื่อ พิมพ์ subl ชื่อไฟล์ แล้วมันจะเปิด Sublime Text พร้อมไฟล์ที่เราใส่เข้าไปให้เลย

osx เวลาเรานึกหรือขี้เกียจพิมพ์ option ต่างๆ กด tab แล้วมันจะช่วยแสดงออกมาให้
และหากใช้ macbook ต่อกับ window keyboard แบบผม คุณจะใช้ numpad ใน terminal ไม่ได้ ถ้าไม่ได้ใส่ configuration แบบข้างล่างนี้เข้าไปใน ~/.zshrc ด้วย
# 20150102 zsh numpad binding
# Keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[On" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * /
bindkey -s "^[Ok" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"
เวบไซด์อย่างเป็นทางการ ohmyz.sh

Command line tools
ตัวนี้จำเป็นสำหรับ ขั้นตอนต่อไป พิมพ์คำสั่งข้างล่างนี้ใน Terminal app
$ xcode-select --install

Homebrew
เค้าเรียกกันว่ามันคือ package manager ที่สาบสูญของ OS X
พิมพ์คำสั่งข้างล่างใน Terminal app เพื่อเริ่มการติดตั้ง
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew จะทำให้เราสามารถใช้คำสั่งเหมือนที่ใช้ใน linux อย่าง Ubuntu ได้ง่ายๆ คือเรียกเอามาติดตั้งได้ง่ายๆ ถ้าอยากจะลง package เช่น subversion, node, iojs พอลง brew เสร็จ มันก็จะลงเจ้าพวกที่ว่ามานี้ได้ง่ายมั่ก
เวบไซด์อย่างเป็นทางการ brew.sh

2 ซอฟต์แวร์สำหรับโปรแกรมเมอร์


Java (JDK)
ณ เวลาที่เขียนนี้ เพิ่งมารู้ว่า Oracle ไม่เปิดให้ download JDK 7 สำหรับบุคคลทั่วไปแล้ว จะต้องเสียเงินถึงจะเข้าไป download ได้ (อยู่ใน section Java SE Support)
ไปดาวโหลด JDK 8 ได้จาก ที่นี่ Java download ได้ dmg มาแล้วก้อ click ขวา open แล้วทำตามขั้นตอนไปตามที่เค้าแนะนำครับ
รวม FAQ https://www.java.com/en/download/faq/java_mac.xml หากอยากถอยไปใช้ Java 6 ก็มีลิ้งบอกวิธีอยู่

ถ้าพัฒนางานด้วย Java จะไม่ติดตั้ง 2 ตัวนี้คงไม่ได้

Java build tools: Ant, Maven
  • Dowload Ant เลือกตัวที่เป็น .tar.gz archive
  • Download Maven เลือกตัวที่เป็น Binary tar.gz archive
ผมชอบที่จะเอา software tools เหล่านี้เอาไว้ที่เดียวกัน ที่ apps folder /Users/dahoba/apps
เมื่อแตกไฟล์ distribution ของทั้ง 2 ตัวแล้วก็ต้องมาเซต PATH ให้มันด้วย ใน ~/.zshrc
...
export ANT_HOME=/Users/dahoba/apps/apache-ant-1.9.6
export M2_HOME=/Users/dahoba/apps/apache-maven-3.3.3
...
export PATH=$PATH:$ANT_HOME/bin:$M2_HOME/bin
...

อื่นๆ ที่ขาดไม่ได้
ถ้ายังไม่มีตัวติดตั้งก็กดที่ลิ้งเพื่อ download ได้เลย

3 ซอฟต์แวร์เพื่อ Productivity


Mozilla Thunderbird อีเมล client หนึ่งในดวงใจ มันเชื่อม Address book เข้ากับ Active directory/LDAP ที่ทำงานผมได้ด้วย

iTerm2
เป็น terminal app ที่ OS X ควรจะเป็น ผมชอบตรงที่มัน split ช่องได้ด้วย keyboard shortcut iTerm2 download

Slate
Utility ตัวนี้ก็ว่ากันว่าเป็น window manager ที่สาบสูญไปจาก OSX อีกเช่นกัน
พิมพ์คำสั่งข้างล่างใน Terminal app เพื่อเริ่มการติดตั้ง
$ cd /Applications && curl http://www.ninjamonkeysoftware.com/slate/versions/slate-latest.tar.gz | tar -xz

Slate นี่มันต้อง config เหนื่อยหน่อยนะครับ ของผมดูแนวทางจาก Tristan Hume blog นี้
ของผมเป็นแบบนี้

ถ้าใครอยากได้ที่มันง่ายๆกว่านี้ ก็ลองหาดู Divvy, Moom, ตัวนี้ฟรี Spectacle

ไฟล์ส่วนตัวใน Cloud

4 เครื่องมือสื่อสารกับทีม


เครื่องมือสื่อสารกับทีม
  • Skype,
  • LINE
  • Google Hangouts
สองตัวหลัง ไม่ต้องติดตั้ง ผมใช้งานใน Chrome เลย

5 Configuration


ปรับการใช้งาน touchpad
ใช้งาน 3 นิ้วพร้อมกันได้ Imgur
ไม่ใช้ natural scroll Imgur
ปรับเวลาเป็นแบบ 24 ชั่วโมง Imgur
ทำ lock icon บน menu bar เวลาจะลุกจากที่นั่งผมชอบที่จะต้อง lock computer เอาไว้ ทำ icon ไว้ตรงนี้จะทำให้สะดวกขึ้นมาก
Imgur
วิธี:
  • เปิด app “Keychain Access” จะใช้ spotlight ค้นหาหรือจะใช้ Finder ก็จะอยู่ใน /Applications/Utilities.
  • เลือก “Show Status in Menu Bar” จากเมนู View
  • ทีนี้เราจะได้ lock icon ที่ menu bar แล้ว ใช้ Lock the screen เพื่อ lock screen เมื่อกลับมา ลาก mouse หรือกด key อะไรๆก็ได้ มันจะถาม password ก่อนจะอนุญาตให้กลับเข้ามาใช้งานได้
ทำครบ checklist พร้อมกลับไปทำงานแล้วล่ะครับ :D

วันพฤหัสบดี, สิงหาคม 06, 2558

แก้ปัญหา maven dependency: spring-boot 1.2.5 กับ JSTL และ Jasper Reports

แก้ปัญหา maven dependency: spring-boot 1.2.5 กับ jstl 1.2.1 และ jasperreports 6.1

เนื่องจากมีน้องเดินมาให้ช่วยดูให้หน่อยว่าทำไมเค้าใส่ dependency ใน pom ของเค้าแล้วมันมีปัญหา เค้าอยากจะใส่ jstl กับ jasper report เข้าไปใน spring-boot project ของเค้า

บางส่วนของ pom ที่เรียกใช้งาน spring-boot 1.2.5

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.5.RELEASE</version>
</parent>
...
<dependencies>
...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>   
...
</dependencies>
  • dependency ตัวนี้ org.springframework.boot.spring-boot-starter-web จะดึงเอา tomcat embeded version 7 มาให้อยู่แล้ว

JSTL dependency

เริ่มโดยน้องเค้าใส่

<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency> 
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId> 
</dependency>
  • JSP 2.3 มากับ Tomcat 8 แต่ spring-boot 1.2.5 ใช้ embedded tomcat 7 classes มันน่าจะไม่ compatible กันละ
  • JSTL จาก group id javax.servlet เป็น version 2.0 ซึ่งหากดูใน web site เค้าก็บอกว่ามันย้าย group id ใหม่แล้ว javax.servlet.jsp.jstl
  • JSTL 2.0 มัน depend กับ jsp-api 2.0 ซึ่งมันก็ขัดกับ jsp-api ที่ระบุเอาไว้ก่อนหน้าอีก

ทีนี้ผมเลยพยายามจะใส่ JSTL 1.2.1 ใหม่ล่าสุดลงไป

ลบ dependency สองตัวข้างบนออกซะ แล้วใส่แบบนี้ลงไปใน pom

<dependencies>
...
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>
...
</dependencies>
  • ใส่ org.apache.tomcat.embed.tomcat-embed-jasper เข้ามาด้วยเพราะว่าตัวนี้จะดึงเอา jsp-api ที่เหมาะสมมาให้เราด้วย, ถ้าจะใช่ jstl ต้องมี jsp-api (javax.servlet.jsp) ตัว spring-boot-starter-web เราได้มาแต่ servlet-api (javax.servlet)

พอทดสอบ $ mvn spring-boot:run กลับรันหน้า jsp ของเราไม่ได้ ลองมาเปิด jar ที่อยู่ .m2 ดู ปรากฎว่า jar ที่ได้จาก artifactId jstl มันเป็น jar เน่า มี classes ใน package name ด้วย :( ทำไง ... google ต่อ

คนนี้เค้าบอกวิธีที่ใช้ได้เอาไว้ที่ SO นี้ ขอบคุณครับ ;)

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>javax.servlet.jsp.jstl-api</artifactId>
    <version>1.2.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.web</groupId>
    <artifactId>javax.servlet.jsp.jstl</artifactId>
    <version>1.2.1</version>
    <exclusions>
        <!-- jstl-api was adding selvlet-api 2.5 and jsp-api -->
        <exclusion>
            <artifactId>jstl-api</artifactId>
            <groupId>javax.servlet.jsp.jstl</groupId>
        </exclusion>
    </exclusions>
</dependency>

ต้องไปเอา jstl library จาก groupId ของ glassfish แทน

ต่อมาอยากได้

JasperReport 6.1

จะเอา jasper report ใส่ใน project maven ใส่แบบนี้

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.1.0</version>
</dependency>  

มีปัญหาว่าพอให้ maven update dependency มันหา olap4j library ไม่เจอ ใน ecilpse ฟ้องแบบนี้ Missing artifact org.olap4j:olap4j:jar:0.9.7.309-JS-3

ลองกดดูที่ maven central ตาม URL นี้ org.olap4j » olap4j ก็จะเจอ 404 file not found !! ห๊ะ

[404]

Not Found: /artifact/org.olap4j/olap4j/0.9.7.309-JS-3

งงอยู่ซักแพ๊บ google ต่อ มาเจอ คำตอบ ที่นี่เอง

ใน community ของ jaspersoft ว่าเราจะต้องเพิ่ม URL repository ตัวนี้เข้าไปใน maven's proxy ของเราด้วย http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/

เมื่อไปเพิ่ม URL ข้างต้นใน Artifactory virtual repository แล้วก็ update dependency ใหม่อีกครั้ง ที่นี้ก็ทำงานต่อได้แล้ว

เผอิญว่าที่ทำงาน ผมตั้ง Artifactory server เป็น maven proxy เอาไว้ ก็เลยเจอปัญหานี้ หาก maven ได้วิ่งออก internet ตรงๆ ก็คงไม่เป็นไร