หน้าเว็บ

วันจันทร์ที่ 25 พฤษภาคม พ.ศ. 2558

maven ทำ jar file ให้ double click run program ได้ : java

ในที่นี้ผมจะยกตัวอย่างด้วย Netbeans IDE น่ะครับ

1. สร้าง maven project เป็น Java Application


วันอาทิตย์ที่ 24 พฤษภาคม พ.ศ. 2558

ฝึก recursive ด้วยโจทย์ความน่าจะเป็น


       โจทย์นี้เป็นโจทย์ที่ผมใช้ฝึกวิธีคิด  การแก้ปัญหา  ซึ่งอาจมีคนคิด  หรือสร้าง tools สำเร็จรูปเอาไว้แล้ว  บางคนมาเห็นโพสต์นี้ อาจจะคิดว่าทำไมไม่ใช้เครื่องมือที่คนอื่นทำไว้แล้วล่ะ  จะมามัวเสียเวลาสร้างเองทำไม  ของคนอื่นอาจจะดีกว่าด้วยซ้ำ

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

ปัญหา

        โดยทั่วไป การหาความน่าจะเป็นหรือความเป็นไปได้ของสมาชิกทั้งหมดภายในเซต S ซึ่งมีสมาชิกจำนวน n ตัว
คุณจะต้องวนลูปทั้งหมด n รอบ และลึก n ชั้น ถึงจะได้ค่าทั้งหมดออกมา  เช่น

S = {'A', 'B', 'C'}
n = 3 ตัว
จำนวนความเป็นไปได้ทั้งหมดคือ 3 x 3 x 3 = 27 ค่า

การเขียนโปรแกรมแบบง่ายๆ จะได้
for (var i = 0; i < S.lenght; i++){
    for (var j = 0; j < S.lenght; j++){
        for (var k = 0; k < S.lenght; k++){
               print(S[i] + ',' + S[j] + ',' + S[k]);
        }
    }
}

A,A,A
A,A,B
A,A,C
A,B,A
A,B,B
...
...
...
C,B,C
C,C,A
C,C,B
C,C,C
แล้วถ้าเขาต้องการให้คุณเขียน code ที่รองรับ S ที่มี size ขนาดใดก็ได้ คุณจะเขียนยังไง?
แน่นอน loop ใช้ไม่ได้ล่ะ เพราะมัน fixed ตายตัว
แล้วอะไรที่เราเอามาใช้แทน loop ได้ แถมยังเป็นแบบ dynamic อีก

คำตอบคือ Recursive ครับ

วันเสาร์ที่ 18 เมษายน พ.ศ. 2558

angularjs enumeration : javascript

Enum Factory
var mapApp = ...

myApp.factory('Enumerate', function () {

    return function (list, fnc) {

        var Enumerate = function (ctx) {
            if (angular.isObject(ctx)) {
                angular.forEach(ctx, function (val, key) {
                    this[key] = val;
                }, this);
            } else if (angular.isString(ctx)) {
                this.name = ctx;
            } else {
                throw new Error('incorrect arguments.');
            }
        };

        Enumerate.values = [];

        Enumerate.valueOf = function (ctx) {
            var obj = null;
            angular.forEach(Enumerate.values, function (item) {
                if (item.name === ctx) {
                    obj = item;
                    return false;
                }
            });

            if (!obj) {
                obj = new Enumerate(ctx);
                Enumerate.values.push(obj);
            }

            return obj;
        }

        Enumerate.prototype.toString = function () {
            return this.name;
        };

        fnc && angular.forEach(fnc, function (val, key) {
            Enumerate.prototype[key] = val;
        });

        angular.forEach(list, function (item) {
            Enumerate[
                    angular.isObject(item)
                    ? item.name
                    : item
            ] = Enumerate.valueOf(item);
        });

        return Enumerate;
    };
});
Using
myApp..factory('StandardColumn', [
    'Enumerate',
    function (Enumerate) {

        var StandardColumn = function () {

        };

        /* define enum */
        StandardColumn.Format = Enumerate([
            {name: 'STRING', description: 'ตัวหนังสือ'},
            {name: 'NUMBER', description: 'ตัวเลข'},
            {name: 'STUDENT', description: 'นักเรียน'}
        ]);

        StandardColumn.Format.fromDescription = function (desc) {
            var obj = null;
            angular.forEach(StandardColumn.Format.values, function (item) {
                if (item.description === desc) {
                    obj = item;
                    return false;
                }
            })

            return obj;
        };

        StandardColumn.Operation = Enumerate([
            'SUM',
            'AVERAGE'
        ]);

        StandardColumn.prototype = {
            id: null,
            name: null,
            sequence: 1,
            format: StandardColumn.Format.STRING,
            operation: null,
            operateWith: null
        };

        return StandardColumn;
    }
]);

วันจันทร์ที่ 9 มีนาคม พ.ศ. 2558

พีระมิต (pyramid) : java

วันนี้นั่งแย่งโจทย์น้องฝึกงานเล่นครับ
package com.blogspot.na5cent.learning;

import java.util.Scanner;

/**
 * @author redcrow
 */
public class Pyramid {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int size = n * (n + 1) / 2;
        int bigSpace = (n - 1) / 2;

        for (int i = 1; i <= size; i++) {
            int numb = i % n;
            int space = bigSpace - i / n;

            boolean star = numb > space && numb <= (n - space);
            System.out.print(star ? "*" : " ");
            System.out.print(numb == 0 ? "\n" : "");
        }
    }
}

วันพุธที่ 4 มีนาคม พ.ศ. 2558

Spring security bypass authen : java


        บางครั้งเราต้องการให้ระบบ bypass authen (กระโดดข้ามการ authen) ด้วย username password
เราสามารถทำแบบนี้ได้ครับ  spring จะไม่ check username password เรา
เราแค่จับ ข้อมูล user (user details) ยัดเข้าไปใน spring context security เลย

ทำไมต้อง bypass

        เนื่องจากการ authen แบบเดิม  เราต้องรู้ username และ clean password เพื่อ authen เข้าใช้งาน
มันเกิดปัญหาว่า  ระบบที่ผมทำ  ผมไม่ได้เก็บ password ของผู้ใช้เป็น clean text ไว้  ผมเข้ารหัส password ไว้ตั้งแต่แรก (เพื่อความปลอดภัย) เพราะฉะนั้น  ผมจึงใช้วิธี authen แบบเดิมไม่ได้ (authen แบบเดิม  จะเอา password มา encrypt check กับ encrypt  password ที่มีอยู่ ว่า matches กันมั้ย)

        ปัญหาต่อมา  คือ  ผมทำระบบที่สามารถ login ด้วยบัญชีผู้ใช้ facebook  แน่นอนว่ามันไม่มี password  เพราะ facebook ใช้ token  แล้วผมจะ  authen เข้าสู่ระบบที่ผมทำยังไง?

        คิดอยู่สักพัก  ก็เกิดคำถามขึ้นมาในหัว  เราสามารถ bypass มันได้มั้ย ?
ก็เลยเป็นที่มาของบทความวันนี้ครับ