ข้ามไปที่เนื้อหาหลัก

[ ServiceMix ] File, JMS, Bean Tutorial

ServiceMix Tutorial

SM-File, SM-JMS, SM-Bean

--------------------------------------------------------------------------------------------------------
File --> JMS Msg CH --> Bean:SimpleTransformBean.java --> JMS Msg CH --> File in other place


Installation

1. download apache-servicemix-3.3.tar.gz, extract into ESB/
2. download servicemix-example-1.zip
or you can get it from here



3. Create a directory ESB/libraries, place the JAR files ant-contrib.jar, bcel.jar, jibx-bind.jar, and jibx-run.jar, in that directory.

- JiBX is a library for Java objects --> XML, XML --> Java objects
We use JiBX to transform Java Obj. to XML to send to NMR. ( NMR only accept XML )

- Spring component framework implementations MVC, DAO, and other
important patterns. We use it for configuring POJOs (SM-Beans)
using Dependency Injection (plug sys. capabilities into biz logic component).

Basic lv. of dependency, C program making sys call. Your program depends on OS.
POSIX -- make it independent on OS.

App -> Abstract API
--> subclass for UNIX
--> subclass for Windows

App talk to Abstract API, and with some XML config., we can inject subclass to correct OS.

and Inversion of Control (your component just implement callbacks containing biz/app logic)
you call sys., sys. will call u.
Only write biz logic, no need for interaction SW.

Start ServiceMix

1. Turn off multicast feature before you start ServiceMix, otherwise our ActiveMQ broker will waste time at startup trying to make remote connections to other ServiceMix in a network.

Multicast feature allows different ServiceMix instances' ActiveMQ (JMS) brokers to discover and commicate with each other.

edit conf/activemq.xml.

Change from

<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616" discoveryUri="multicast://default"/>
</amq:transportConnectors>
<amq:networkConnectors>
<amq:networkConnector uri="multicast://default"/>
</amq:networkConnectors>

to
<amq:transportConnectors>
<amq:transportConnector uri="tcp://localhost:61616"/>
</amq:transportConnectors>
<amq:networkConnectors>
</amq:networkConnectors>


2. run ESB/apache-servicemix-3.3/bin/servicemix

Start new Project

1. Start Eclipse with ESB/Workspace as your workspace. Create Java project osesb-example1
2. Add external JARs ( Properties -> Java build path -> Libraries ) from the directory ESB/apache-servicemix-3.3/lib
  • servicemix-core-3.3.jar
  • servicemix-utils-1.0.0.jar
  • commons-logging-1.1.jar
  • org.apache.servicemix.specs.jbi-api-1.0-1.1.0.jar
and 1 external JAR from the ESB/libraries/ directory
  • jibx-run.jar
3. Create class Person.java and SimpleTransformerBean.java in the osesb.example1 package

Person.java

package osesb.example1;

public class Person {
private String customerNumber;
private String firstName;
private String lastName;
private String street;
private String city;
private String state;
private String zip;
private String phone;

// add getter and setter here.
}

SimpleTransformerBean.java
package osesb.example1;
import javax.annotation.Resource;
import javax.jbi.component.ComponentContext;
import javax.jbi.messaging.DeliveryChannel;
import javax.jbi.messaging.ExchangeStatus;
import javax.jbi.messaging.MessageExchange;
import javax.jbi.messaging.MessagingException;
import javax.jbi.messaging.NormalizedMessage;
import javax.jbi.servicedesc.ServiceEndpoint;
import javax.xml.namespace.QName;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.servicemix.jbi.listener.MessageExchangeListener;

import osesb.util.JiBXUtil;

// implements JBI's MessageExchangeListener interface, which allows it to receive XML messages from normalized message router.
public class SimpleTransformerBean implements MessageExchangeListener {

private static Log log = LogFactory.getLog(SimpleTransformerBean.class);

@Resource
private DeliveryChannel channel;

@Resource
private ComponentContext compContext;

public void onMessageExchange(MessageExchange exchange)
throws MessagingException {
try {
if (exchange.getStatus() != ExchangeStatus.ACTIVE)
return;
// When receiveing message, unmarshals XML message text using JiBX.
// assuming it represents a Person object
// receive "in-only" message ( because JMS Channel that connect to SM-bean:SimpleTransformBean.java is unidirectional )
Person person = (Person) JiBXUtil.unmarshalDocument(exchange.getMessage("in").getContent(), Person.class);
log.info("received person " + person.getFirstName() + " " + person.getLastName());
// makes a simple change to the object, change Firstname to John.
person.setFirstName("John");
exchange.setStatus(ExchangeStatus.DONE);
channel.send(exchange);

ServiceEndpoint targetEndpoint = compContext.getEndpoint(new QName(
"http://osesb/example1/", "JMSProviderService"),
"outQueueWriter");
MessageExchange exch = channel.createExchangeFactory(targetEndpoint)
.createInOnlyExchange();
NormalizedMessage normalizedMsg = exch.createMessage();
// Uses JiBX to marshal the modified Person object back to XML
normalizedMsg.setContent(JiBXUtil.marshalDocument(person, "UTF-8"));
// create simple String and set as "in-only" message.
exch.setMessage(normalizedMsg, "in");
// sends a message to the second JMS producer's service endpoint.
channel.send(exch);
} catch (Exception e) {
log.error("JBI bean exception", e);
throw new MessagingException("Error transforming object to or from XML");
}
}
}

JiBXUtil.java in package osesb.util
package osesb.util;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.jibx.runtime.BindingDirectory;
import org.jibx.runtime.IMarshallingContext;
import org.jibx.runtime.IUnmarshallingContext;
import org.jibx.runtime.JiBXException;
import org.w3c.dom.Node;

public class JiBXUtil {
public static Object unmarshalDocument(Node node, Class targetClass) throws JiBXException {
return unmarshalDocument(new DOMSource(node), targetClass);
}

public static Object unmarshalDocument(Source source, Class targetClass) throws JiBXException {
Object result = null;
try {
IUnmarshallingContext ctx = BindingDirectory.getFactory(
targetClass).createUnmarshallingContext();
result = ctx.unmarshalDocument(new StringReader(toString(source)));
} catch (Exception e) {
throw new JiBXException("Error unmarshalling XML to Object", e);
}
return result;
}

public static Source marshalDocument(Object src, String encoding)
throws JiBXException {
Source result = null;
try {
ByteArrayOutputStream bOut = new ByteArrayOutputStream();
IMarshallingContext ctx = BindingDirectory.getFactory(src.getClass())
.createMarshallingContext();
ctx.marshalDocument(src, "UTF-8", null, bOut);
result = new StreamSource(new ByteArrayInputStream(bOut.toByteArray()));
} catch (Exception e) {
throw new JiBXException("Error marshalling XML to Object",e);
}
return result;
}

private static String toString(Source source) throws TransformerException {
TransformerFactory tf = TransformerFactory.newInstance();
StringWriter sw = new StringWriter();
Transformer trans = tf.newTransformer();
trans.transform(source, new StreamResult(sw));
String result = sw.toString();
System.out.println("result " + result);
return result;
}
}
4. Create a new folder resources/ at the project's top level
copy all of the XML configuration files and the directories file/, jms/, and bean/ there.

file/xbean.xml
<beans xmlns="http://xbean.org/schemas/spring/1.0"
xmlns:file="http://servicemix.apache.org/file/1.0"
xmlns:esb="http://osesb/example1/">

<!-- dumps any messages it gets to the directory "example1/out"-->
<file:sender service="esb:fileSender"
endpoint="simpleFromJMSSender"
directory="example1/out">
<!-- after deploy it will create directory /media/disk/AIT/SoftwareArchitecture/ESB/apache-servicemix-3.3/example1/out -->
</file:sender>

<!-- If new file appears in directory, do something -->
<!-- specifies a file system poller that watches
the directory "example1/in/" for new files and forwards them to a JMS service endpoint.-->
<file:poller service="esb:filePoller"
endpoint="simpleToJMSPoller"
targetService="esb:JMSProviderService"
targetEndpoint="inQueueWriter"
file="example1/in"
period="2000">
<!-- after deploy it will create directory /media/disk/AIT/SoftwareArchitecture/ESB/apache-servicemix-3.3/example1/in -->
</file:poller>
</beans>
jms/xbean.xml
<beans xmlns:jms="http://servicemix.apache.org/jms/1.0"
xmlns:esb="http://osesb/example1/">
<!-- 1st consumer registers for messages on "inQueue" and forwards to our ServiceMix custom Bean.-->
<jms:consumer service="esb:JMSConsumerService"
endpoint="inQueueReader"
targetService="esb:beanService"
targetEndpoint="endpoint"
destinationName="inQueue"
connectionFactory="#connectionFactory" />
<!-- 2nd consumer registers for messages on "outQueue" and forwards to the File sender's service endpoint. -->
<jms:consumer service="esb:JMSConsumerService"
endpoint="outQueueReader"
targetService="esb:fileSender"
targetEndpoint="simpleFromJMSSender"
destinationName="outQueue"
connectionFactory="#connectionFactory"/>
<!-- 1st producer receives incoming files from the File system poller and adds them to the JMS queue "inQueue" -->
<jms:provider service="esb:JMSProviderService"
endpoint="inQueueWriter"
destinationName="inQueue"
connectionFactory="#connectionFactory" />
<!-- 2nd producer receives the output from the custom Bean and adds it to the JMS queue "outQueue" -->
<jms:provider service="esb:JMSProviderService"
endpoint="outQueueWriter"
destinationName="outQueue"
connectionFactory="#connectionFactory" />

<bean id="connectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
</beans>
bean/xbean.xml
<beans xmlns:bean="http://servicemix.apache.org/bean/1.0"
xmlns:esb="http://osesb/example1/">

<classpath>
<location>.</location>
<location>jibx-run.jar</location>
</classpath>

<!--
<location>.</location>
<location>bcel.jar</location>
<location>jibx-bind.jar</location>
<location>jibx-extras.jar</location>
<location>jibx-run.jar</location>
<location>qdox-1.6.1.jar</location>
<location>stax-api.jar</location>
<location>wstx-asl.jar</location>
<location>xmlpull_1_1_4.jar</location>
<location>xpp3.jar</location>
</classpath>-->

<bean:endpoint service="esb:beanService"
endpoint="endpoint"
bean="#SimpleTransformer"/>

<bean id="SimpleTransformer"
class="osesb.example1.SimpleTransformerBean"/>
</beans>


5. Tell Eclipse to show the ant view ( Properties > Builder > new .. ) and drag example1-build.xml from the project explorer to the ant view. You should get a list of the ant tasks defined in the file.

we can double click at "deploy" to run ant script.
It will copy to zip file and build jar file.

You can see result either on eclipse or in a serviceMix console in a command line as well.

This could fail if you have different version of jar file, or a resource location in example1-build.xml is not in a right place.

example1-build.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- This ant build file is based on the example in Chapter 3 of Open Source ESBs in Action -->
<project name="ServiceMix Example 1" basedir="." default="deploy" xmlns:c="urn:contrib-ant">

<property name="classes" value="../bin" />
<property name="libraries" value="../../../libraries" />
<property name="work" location="../work" />
<property name="src" value="../src" />
<property name="src-generated" value="../src-generated" />
<property name="servicemix.home" value="../../../apache-servicemix-3.3" />

<!-- ant-contrib tasks are needed by the servicemix assembly and deployment tasks -->
<taskdef resource="net/sf/antcontrib/antlib.xml" uri="urn:contrib-ant">
<classpath>
<pathelement location="${libraries}/ant-contrib.jar" />
</classpath>
</taskdef>

<!-- JiBX binding compiler task definition -->
<taskdef name="bind" classname="org.jibx.binding.ant.CompileTask">
<classpath>
<pathelement location="${libraries}/jibx-bind.jar" />
</classpath>
</taskdef>

<!-- Test target for JiBX compilation -->
<target name="jibx-compile">
<!-- verbose="true" to show error -->
<bind verbose="true" load="true" binding="mapping.xml">
<classpath>
<pathelement path="${classes}" />
<pathelement location="${libraries}/jibx-run.jar" />
</classpath>
</bind>
</target>

<!-- Compile, create the service units, assemble them into a SA, and deploy -->
<target name="deploy">

<!-- Create the file service unit -->
<antcall target="create-serviceunit">
<param name="service-dest-file" value="example1-file-su.zip" />
<param name="servicemix-conf" value="file/" />
</antcall>

<!-- Create the JMS service unit -->
<antcall target="create-serviceunit">
<param name="service-dest-file" value="example1-jms-su.zip" />
<param name="servicemix-conf" value="jms/" />
</antcall>

<!-- Create the Spring bean service unit -->
<antcall target="create-serviceunit">
<param name="service-dest-file" value="example1-bean-su.zip" />
<param name="servicemix-conf" value="bean/" />
<param name="include-resource-dir" value="bean/resources/" />
<param name="include-classes" value="osesb/example1/**/*"/>
<param name="jibx-mapping" value="mapping.xml"/>
</antcall>

<!-- Assemble and deploy to the JBI container -->
<echo message="Create and deploy the service assembly" />
<antcall target="create-and-deploy-serviceassembly-from-serviceunits">
<param name="jbi-conf" value="." />
<param name="sm-dest-file" value="example1-sa.zip" />
<param name="service-units" value="example1-*-su.zip" />
</antcall>
</target>

<!--
Call this target with the following properties to create a serviceunit

service-dest-file: name of the service zip (must be equal to name in jbi.xml
servicemix-conf: location where the servicemix.xml or xbean file can be found
include-classes: class filter to include in the service file
resources: resources to include
-->

<target name="create-serviceunit">
<!-- some general cleanup of old files and create new directories -->
<echo message="Preparing service unit creation" />
<delete failonerror="false" file="${work}/${service-dest-file}" />
<delete failonerror="false" dir="${work}/${service-dest-file}.work" />
<mkdir dir="${work}/${service-dest-file}.work" />
<mkdir dir="${work}/${service-dest-file}.work/META-INF" />

<!--do we have a resource directory -->
<c:if>
<isset property="include-resource-dir" />
<c:then>
<echo message="Resource directory specified, including in serviceunit" />
<copy todir="${work}/${service-dest-file}.work">
<fileset dir="${include-resource-dir}">
<include name="**/*" />
</fileset>
</copy>
</c:then>
<c:else>
<echo message="No resource directory specified" />
</c:else>
</c:if>

<!--do we have a classes to copy directory -->
<c:if>
<isset property="include-classes" />
<c:then>
<echo message="Including classes into Service unit" />
<c:if>
<isset property="include-classes-archive" />
<c:then>
<echo message="compiling classes" />
<javac srcdir="${src}" destdir="${classes}">
<include name="${include-classes}" />
<include name="esb/util/framework/*" />
<classpath refid="compile.path" />
</javac>

<echo message="archiving classes to ${include-classes-archive}" />
<jar destfile="${work}/${service-dest-file}.work/${include-classes-archive}">
<fileset dir="${classes}">
<include name="${include-classes}" />
<include name="esb/util/framework/*" />
</fileset>
</jar>
</c:then>
<c:else>
<echo message="compiling classes from ${include-classes}" />
<javac srcdir="${src}" destdir="${classes}">
<include name="${include-classes}" />
<include name="esb/util/framework/*" />
<classpath refid="compile.path" />
</javac>
<copy todir="${work}/${service-dest-file}.work">
<fileset dir="${classes}">
<include name="${include-classes}" />
<include name="osesb/util/*" />
</fileset>
<fileset dir="${src}">
<include name="${include-classes}"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
</c:else>
</c:if>
</c:then>
<c:else>
<echo message="No classes need to be included" />
</c:else>
</c:if>

<c:if>
<isset property="jibx-mapping" />
<c:then>
<!-- Run JiBX binding compiler -->
<bind verbose="false" load="true" binding="${jibx-mapping}">
<classpath>
<pathelement path="${classes}" />
</classpath>
</bind>
<copy todir="${work}/${service-dest-file}.work" overwrite="true">
<fileset dir="${classes}">
<include name="${include-classes}" />
</fileset>
</copy>
</c:then>
</c:if>
<c:if>
<isset property="jibx-mapping1" />
<c:then>
<bind verbose="false" load="true">
<classpath>
<pathelement path="${classes}" />
<pathelement location="${libraries}/jibx-run.jar" />
</classpath>
<bindingfileset dir="${jibx-directory}">
<include name="${jibx-mapping1}" />
<include name="${jibx-mapping2}" />
<include name="${jibx-mapping3}" />
</bindingfileset>
</bind>
<copy todir="${work}/${service-dest-file}.work" overwrite="true">
<fileset dir="${classes}">
<include name="${include-classes}" />
</fileset>
</copy>
</c:then>
</c:if>
<c:if>
<isset property="generated-classes-filter" />
<c:then>
<echo message="compiling classes from ${generated-classes-filter}" />
<javac srcdir="${src-generated}" destdir="${classes}">
<include name="${generated-classes-filter}" />
<include name="osesb/util/*" />
<classpath refid="compile.path" />
</javac>
<copy todir="${work}/${service-dest-file}.work">
<fileset dir="${classes}">
<include name="${generated-classes-filter}" />
<include name="osesb/util/*" />
</fileset>
</copy>
</c:then>
<c:else>
<echo message="No generated classes need to be included" />
</c:else>
</c:if>

<c:if>
<isset property="servicemix-conf" />
<c:then>
<echo message="Try to copy servicemix specific files, warnings can be ignored" />
<copy todir="${work}/${service-dest-file}.work" file="${servicemix-conf}/servicemix.xml" failonerror="false" />
<copy todir="${work}/${service-dest-file}.work" file="${servicemix-conf}/xbean.xml" failonerror="false" />
</c:then>
</c:if>

<c:if>
<isset property="jbi-conf" />
<c:then>
<echo message="Try to copy JBI specific files, warnings can be ignored" />
<copy todir="${work}/${service-dest-file}.work/META-INF" file="${jbi-conf}" failonerror="false" />
</c:then>
</c:if>

<jar destfile="${work}/${service-dest-file}">
<fileset dir="${work}/${service-dest-file}.work" />
</jar>
</target>

<target name="create-and-deploy-serviceassembly-from-serviceunits">
<delete failonerror="false" file="${work}/${sm-dest-file}" />
<mkdir dir="${work}/META-INF" />
<copy file="${jbi-conf}/jbi.xml" tofile="${work}/META-INF/jbi.xml" overwrite="true" />
<jar destfile="${work}/${sm-dest-file}">
<fileset dir="${work}">
<include name="META-INF/**" />
<include name="${service-units}" />
</fileset>
</jar>
<copy file="${work}/${sm-dest-file}" tofile="${servicemix.home}/hotdeploy/${sm-dest-file}" overwrite="true" />
</target>

</project>

6. Bind how the fields of a Person object are related to XML elements.
The specification is compiled into Java code that implements the marshaling and unmarshaling transformations used in the bean component.

mapping.xml
<binding>
<mapping name="person" class="osesb.example1.Person"> <!-- map person.xml in classpath into Person class -->
<value name="customer-number" field="customerNumber" />
<value name="first-name" field="firstName" />
<value name="last-name" field="lastName" />
<value name="street" field="street" />
<value name="city" field="city" />
<value name="state" field="state" />
<value name="zip" field="zip" />
<value name="phone" field="phone" />
</mapping>
</binding>


7. Assembled 3 services unit into a ServiceMix service assembly by specify specification in jbi.xml configuration file. Finally, the complete archive is copied to ServiceMix's hotdeploy/ directory, where you should be able to see in the ServiceMix console the unpacking and registering of service units.

jbi.xml
<?xml version="1.0" encoding="UTF-8"?>
<jbi xmlns="http://java.sun.com/xml/ns/jbi" version="1.0">
<service-assembly>
<identification>
<name>Example1-JMSBindingService</name>
<description>
Example showing the jms binding component
</description>
</identification>
<service-unit>
<identification>
<name>SU-BEAN</name>
<description>
The bean component
</description>
</identification>
<target>
<artifacts-zip>example1-bean-su.zip</artifacts-zip>
<component-name>servicemix-bean</component-name>
</target>
</service-unit>
<service-unit>
<identification>
<name>SU-JMS-Queue</name>
<description>
A number of ftp pollers and senders
</description>
</identification>
<target>
<artifacts-zip>example1-jms-su.zip</artifacts-zip>
<component-name>servicemix-jms</component-name>
</target>
</service-unit>
<service-unit>
<identification>
<name>SU-JMS-File</name>
<description>
A number of file pollers and senders files
</description>
</identification>
<target>
<artifacts-zip>example1-file-su.zip</artifacts-zip>
<component-name>servicemix-file</component-name>
</target>
</service-unit>
</service-assembly>
</jbi>


8. Finally! To test our service, copy person.xml to ESB/apache-servicemix-3.3/example1/in, watch the log, and see if your transformed person is properly deposited in ESB/apache-servicemix-3.3/example1/in.

<person>
<customer-number>123</customer-number>
<first-name>James</first-name>
<last-name>Doe</last-name>
<street>1st Street</street>
<city>New York</city>
<state>NY</state>
<zip>567898</zip>
<phone>1768768768</phone>
</person>


ref : mdailey

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

อยู่เหงาๆ เลาไปเที่ยว - เที่ยวเชียงรายด้วยตัวเอง โดยไม่มีรถ เช่ารถก็ไม่ได้เช่าน้ะจ้ะ นั่งรถสาธารณะล้วนๆแจร้ ตอนแรก : วางแผนเที่ยว

เชียงราย ม่วนใจ๋ ยอมรับเลยว่า หาข้อมูลค่อนข้างยาก กระทู้รีวิว ใน pantip ที่บอกไม่มีรถไป คือ ไม่มีรถส่วนตัวไป สุดท้ายก้อไปเช่ารถขับกันหมด สุดท้ายเลาก็ไปผจญภัยมาจนได้ นี่คือตอนแรกซีรี่ส์เชียงรายของเราน้ะจ้ะ  กล่าวถึงว่า จะไปไหนบ้าง และ วิธีเดินทางในตัวเมืองเชียงราย และ ออกนอกเมืองเชียงรายไปยังที่เที่ยวยังไง 0) ตั๋ว 0 บาท จริงๆ ทริปนี้จับพัดจับผลู ดันกด ตั๋ว 0 บาท ได้ของ VietJet ซึ่งเขาเพิ่งเปิดเส้นทางใหม่ กรุงเทพฯ-เชียงราย เลยมีโปรโมชั่นนี้ออกมา จริงๆ บอกว่า 0 บาท แต่มันมีค่าภาษีสนามบิน ค่าอื่นๆ อีก รวมแล้วไปกลับ 508 บาทน้ะจ้ะ ( ภาษีสนามบิน 100 THB, PMT Fee 77 THB, Admin Fee Domestic Thai 77 THB รวมสองขา 508 บาท รวม VAT เป็น 529.56 บาท ) เวลาค่อนข้างโอเคนะ มีคนเคยบอกว่า low cost เวลาไม่ค่อยโอเค แต่เลาว่าเวลานี่โอเคเลย ขาไป 06.30 สนามบินสุวรรณภูมิ - 07.55 สนามบินแม่ฟ้าหลวงเชียงราย ขากลับ 15.15 สนามบินแม่ฟ้าหลวงเชียงราย - 16.45 สนามบินสุวรรณภูมิ ขึ้นที่สนามบินสุวรรณภูมิ (BKK) จย้ะ ไม่ใช่สนามบินดอนเมือง มีคนบอกว่าให้สังเกตรหัสถ้า BKK คือ สนามบินสุวรรณภูมิ อย่าไปผิดส...

วิธีการไป อย. กระทรวงสาธารณสุขจากหัวลำโพง

ทางไป : รถไฟฟ้า MRT หัวลำโพง ไปลงที่ สถานี กระทรวงสาธารณสุข  ถ้ากดที่ตู้ต้องเปลี่ยนไปหน้าจอสายสีม่วง สนน ราคา 48 53 บาท ต่อมอไซด์ ถ้าไป อย. 20 บาท จากหน้าทางเข้า  ถ้าฝนตกแนะนำให้โบกแท็กซี่จากข้างหน้า ข้างในหาแท็กซี่ยากมาก ถ้าจะเดินประมาณ 2.4 km ให้ระวังหลงเข้าไปรพ ศรีธัญญา รพ ศรีธัญญาพื้นที่ข้างในใหญ่มาก และเหมือนจะล้อมด้วยคลอง เหมือนจะมีทางออกแค่ทางที่เข้าไปนั่นแหละ ทางกลับ : รถเมล์ 97 จาก อย. ตรงข้ามประกันสังคม ทางที่ 1 : ถ้าจะใกล้ลงหน้าปากซอยขึ้นสายสีม่วงที่สถานีกระทรวงสาธารณสุขที่เดิม ทางที่ 2 : ผ่าน ท่าน้ำนนท์​ กลับเรือได้ ทางที่ 3 : ผ่านหน้าพระจอมพระนครเหนือด้วยนะ ผ่าน สถานีรถไฟฟ้า MRT บางซื่อ  ( จาก อย. ไป MRT บางซื่อ 17 บาท,  จาก MRT บางซื่อ ไป MRT หัวลำโพง 44 บาท นั่งกลับได้ 2 ทาง ทางหัวลำโพง กับ ไปเปลี่ยนที่ท่าพระ ไม่รู้ว่าทางไหนเร็วกว่ากัน ) ทางที่ 4 :  ผ่าน สะพานควาย  ทางที่ 5 :  นั่งถึงอนุสาวรีย์ชัยสมรภูมิได้ ค่ารถเมล์ 21 บาท ค่ารถไฟฟ้าไป BTS สะพานตากสิน 47 บาท 

ส่งไปรษณีย์ทีละมากๆ ที่ช่องไปรษณีย์สำหรับธุรกิจ

  ถ้าเราส่งไปรษณีย์ทีละ 10 กล่องขึ้นไป สามารถไปส่งโดยใช้ช่องทางธุรกิจได้ โดยต้องกรอกใบรับฝากรวม ( Receipt for bulk Posting ) เป็นลิสต์รายการให้เขาไปด้วย โดยกรอกพัสดุแต่ละรายการ และ ไปยื่นให้เขาพร้อมกับพัสดุที่จะส่ง วิธีกรอก คือ ให้กรอกพัสดุแบบเดียวกันไว้แผ่นเดียวกัน  เช่น พัสดุ10 กล่อง กล่องขนาดเท่ากัน น้ำหนักเท่ากันหมด กรอกไว้ 1 แผ่น ถ้าน้ำหนักต่างกัน ขนาดกล่องต่างกัน กรอกแยกแผ่นไว้ดีที่สุด ซึ่งใบนี้สามารถไปขอได้ที่ไปรษณีย์ฝ่ายธุรกิจ สามารถนำมาทำใส่ A4 ก็ได้ ขอบคุณคุณพี่ amarin.ch ที่ไปรษณีย์กลาง ( BANGKOK G.P.O. ) มากๆ นะครับ สำหรับคำแนะนำ ขอบคุณที่ช่วยคีย์ให้ทีละรายการสำหรับมือใหม่ที่ยังไม่รู้ว่ามีใบรับฝากรวมอย่างผมด้วยครับ คราวหน้าผมจะทำใบรับฝากรวมไปครับ

แจก คัมภีร์ ไบเบิล ภาษาไทย รวมเล่ม ( download thai bible pdf version )

แปลกใจว่า ทำไม ไม่มี ebook พระคัมภีร์ ที่สามารถ print อ่านได้เลย เลยเอา พระคัมภีร์ภาษาไทย ฉบับ KJV ( Thai Bible King James Version ) มาเย็บรวมเล่ม สร้างไว้เฉพาะ พันธสัญญาเดิม ( Old Testament ) ดาวน์โหลดได้จาก Thai Bible ย้ายแล้วจ้า ย้ายมา อันนี้ จะยัดลง iPhone หรือ iPod Touch ก็ได้ เพราะว่า มันอ่าน pdf ได้อยู่แล้ว จาก iBook ง่าย และ ฟรี ไม่ต้อง crack โปรแกรมให้ผิดศีล ถ้าไม่ชอบรูปแบบยังไง checkout มาแล้ว compile latex เองได้เลย จัดรูปแบบสวยงามแล้ว commit กลับมา จักเป็นพระคุณยิ่ง NOTE: ถ้าท่านต้องการสนับสนุนเรา ท่านสามารถดาวน์โหลด App ของเราได้ทางมือถือ Android ที่ App Words of God เนื้อหาจะเป็นเนื้อหาเดียวกันกับที่แจกฟรีนี้  ซึ่งใน App ท่านสามารถศึกษาพระคัมภีร์ได้แบบ Offline ซึ่งสามารถใช้งานได้โดยไม่ต้องต่ออินเตอร์เน็ต ท่านสามารถพกไปที่ไหนก็ได้ นอกจากนี้ ใน App ท่านสามารถ Search เพื่อค้นหาพระคัมภีร์ได้ และ ใน App เราไม่ได้เก็บข้อมูลใดๆ ของท่าน (เช่น การติดตามว่าท่านอ่านหน้าไหน, การติดตามว่าท่านค้นหาอะไร)  เดิมทีเราเองทำไว้ให้ทุกท่านสามารถเข้าถึงได้ฟรีทางเว็ปไซ...

ปีอธิกสุรทิน อธิกมาส อธิกวาร และ การทดปฏิทิน

 ปีที่แบ่งตามรอบพระอาทิตย์ (สุริยคติ) มี 2 แบบ คือ 1. ปกติสุรทิน คือ มี 365 วัน 2. อธิกสุรทิน คือ มี 366 วัน (เดือนกุมภาฯมี 29 วัน) การคำนวน ปีอธิกสุรทิน ตรงนี้บางท่านจะจำได้แต่เพียง ว่า หาร 4 ซึ่งไม่ใช่แค่นั้นครับ ความจริงแล้ว จะมีสูตรคำนวณที่ถูกต้องคือ ให้เอา ค.ศ.ตั้ง แล้วเอา 4 หาร หากหารลงตัวก็ใช่ ยกเว้น 100 หารลงตัว แต่หาก 400 ลงตัวก็ให้นับเป็นอธิกสุรทินด้วย (เช่น ปี 1900 ไม่เป็นอธิกสุรทิน แต่ปี 2000, 2004 เป็นปีอธิกสุรทิน) ปีที่แบ่งตามรอบพระจันทร์ (จันทรคติ) แบ่งเป็น 3 คือ 1. ปกติมาส-ปกติวาร  (บางที่เขียนย่อ เป็น ปกติมาส-วาร)       คือ ปีที่เป็นปกติ มีเดือนคู่ ข้างขึ้น 15 วัน ข้างแรม 15 วัน       และมีเดือนคี่ ข้างขึ้น 15 วัน ข้างแรม 14 วัน       รวมวันใน 1 ปี เป็น (30*6+29*6) = 354 วัน 2. ปกติมาส-ปีอธิกวาร (บางที่เรียกเป็น อธิกวาร)       คือ ปีที่เป็นปกติ แต่เดือน 7 จะมีข้างแรม 15 วัน        รวมวันใน 1 ปี เป็น 354+1 = 355 วัน 3. ปีอธิกมาส-ปกติวาร (บางที่จะเรียกเป็น อธิกมาส)     ...

อยู่เหงาๆ เราไปเที่ยว - พิพิธภัณฑ์สถานแห่งชาติ พระนคร Bangkok National Museum

คราวก่อน ไป พิพิธภัณฑ์สถานแห่งชาติ หอศิลป์ ที่อยู่ตรงข้าม พิพิธภัณฑ์สถานแห่งชาติ พระนคร มาครั้งหนึ่ง แล้วคิดว่า นั่นคือ พิพิธภัณฑ์สถานแห่งชาติ พระนคร  พอได้ยินว่า พิพิธภัณฑ์สถานแห่งชาติ พระนคร ทำใหม่ ก็เลยแวะไป พิพิธภัณฑ์สถานแห่งชาติ หอศิลป์ เพราะนึกว่า นั่นคือ พิพิธภัณฑ์สถานแห่งชาติ พระนคร พอไปถึงก็งง ว่าทำไม ไม่มีรูปเหมือนกับที่เวปเขาลงไว้ ตอนหลังมาดูใหม่ จึงเข้าใจว่า จริงๆ แล้ว คนละที่ กัน พระที่นั่งศิวโมกขพิมาน พิพิธภัณฑ์สถานแห่งชาติ พระนคร Bangkok National Museum วันนี้ เราเอง ได้ไปช่วยคนต่างชาติ ที่พลัดหลง โดยบังเอิญ โดยเป็นลุงชาวจีนและหลาน พลัดหลงกับ ลูกซึ่งอายุ 39 ปีแล้วและภรรยาของลูก ซึ่งเขาก็พยายามหาคนที่พูดภาษาจีนได้ในนั้น ซึ่งเราก็ชี้ไปที่ประชาสัมพันธ์ แต่ประชาสัมพันธ์ไม่มีคนพูดจีนได้ แต่ยังไงก็ตามเขาก็พยายามช่วย ต้องขอบคุณคุณพี่สาว และ พี่ชายในห้องประชาสัมพันธ์ ที่ช่วยประสานกับทางวิทยุสื่อสารให้ สุดท้ายคุณลุงก็เจอกับลูกของเขา   พระที่นั่งศิวโมกขพิมาน พิพิธภัณฑ์สถานแห่งชาติ พระนคร  ดูแลโดย  สำนักพิพิธภัณฑสถานแห่งชาติ ก...

ลองเล่น crossword cheater โปรแกรมโกง เกมส์ครอสเวิร์ด

ตั้งแต่สมัยมัธยมต้น ที่ได้เล่น crossword ในหนังสือพิมพ์ หลังจากนั้นก็ไม่ได้เล่นอีกเลย ตอนนั้นจำได้ว่า คำที่ยากๆ แอบขี้โกงโดยใช้ dictionary ของ ส เสถบุตร เขามีฟีเจอร์ให้หาได้ พอโตมา ใช้งาน บน linux มากกว่า windows คิดถึงโปรแกรม dictionary ของ ส เสถบุตร ที่มีบน windows ก็เลย ลองทำ dictionary ไว้ใช้เอง แถมใส่ฟีเจอร์อันเดียวกันลงไป  ก็ไม่เคยได้ลองใช้สักที จนกระทั่งวันหนึ่ง เพื่อนส่งรูปด้านล่างนี้มาทาง line  ก็ได้ลองดู ปรากฎว่าใช้ได้ดีเหมือนกัน ลองกดดูด้านล่างได้ boo?s ??ndom f??k p?n?s pu?s? s?x นอกจากนี้ ยังมี ฟีเจอร์อื่นๆ อีกน้ะจ้ะ ดูได้จาก หน้า Tips และเลายังทำ dictionary ไทยจีน จีนไทย และ dictionary ไทยญี่ปุ่น ญี่ปุ่นไทย แต่ฟีเจอร์ไม่อลังเท่า dictionary ไทยอังกฤษ อังกฤษไทย ที่บอกมาแล้ว  ลองไปเล่นได้ จย้ะ 

อยู่เหงาๆ เราไปเที่ยว - ไหว้พระขอพร ศาลเจ้าแม่ทับทิม (อาม่า), เจริญกรุง, กรุงเทพ; 天后聖母廟, 石龙軍路, 曼谷, 泰国; Thap Thim Chinese Goddess Shrine, Chareon Krung 63 Road, Bangkok, Thailand

天后聖母廟, 石龙軍路, 曼谷, 泰国 ไหว้ศาลเจ้าแม่ทับทิม ขอให้การค้าเจริญรุ่งเรือง ตำนานเจ้าแม่ทับทิมเกิดที่ตำบลตุ้ยบ๊วย เขตบ่นเซียว เกาะไหหลำ มีผู้เฒ่าแซ่พัว เป็นผู้มีความซื่อสัตย์สุจริต ทำงานขยันขันแข็ง ครั้งหนึ่งแกออกไปหาปลา โดยผูกแหเป็นช้อนดักปลา เวลาผ่านไปแกยังหาปลาไม่ได้ คืนนั้นก็ประสบความล้มเหลว เมื่อช้อนแหขึ้นมาทีไรก้อมีแต่ท่อนไม้ ด้วยความโมโหแกเลยขว้างท่อนไม้นั้นออกไปให้ไกล แต่แล้วเมื่อช้อนแหขึ้นมาใหม่ก็ปรากฏท่อนไม้ท่อนเดิมอีก ต่อจากนั้นแกก็ขว้างท่อนไม้ขึ้นฝั่ง และแกก็ฉุก คิดว่าแปลกที่ท่อนไม้ธรรมดาจะสามารถลอยทวนน้ำได้ คงจะเป็นสิ่งวิเศษ และแกก็ได้นำท่อนไม้นั้นขึ้นฝั่ง และเพ่งมองท่อนไม้นั้นพร้อมกับอธิษฐานว่า หากท่อนไม้นี้มีความศักดิ์สิทธิ์ขอให้คืนนี้จับปลาได้มาก เมื่อพ้นจากความจนแล้ว เมื่อขึ้นฝั่งจะนำท่อนไม้นี้แกะสลักเป็นเทวรูปศักดิ์สิทธิและสักการะบูชาเช้าวันไม่ให้ขาด เมื่ออธิษฐานจบแกเอาท่อนไม้นั้นวางบนหัวเรือ ปรากฏว่าช้อนเพียงสองถึงสามครั้งก็ได้ปลาตัวโตเต็มเรือ จึงนำปลาขึ้นฝั่งวันนั้นปลาของแกขายได้ราคา เพราะชาวประมงคนอื่นจับได้น้อยแกจึงมีเงินจับจ่ายใช้สอย และทุกครั้งที่แกออกหาปลา ...

เรื่อง matrix ที่อาจจะลืมกันไปแล้ว

Rank ของ matrix Rank ของ matrix A คือ จำนวน independent columns (หรือ rows) ของ A นั่นคือ square matrix จะ full rank ถ้า ทุกคอลัมน์ independent กัน เมื่อ full rank, det จะ = 0 วิธีหา rank อาจหาได้โดย [U, W, V] = svd(A) แล้วดูว่า rank คือ จำนวน residual ของ W ที่ไม่เป็น 0 full rank = singular matrix = หา inverse ได้ สมบัติของ rank 1. rank(AB) min(rank(A), rank(B)) ย้ำว่า wiki Null Matrix เมตริกซ์ศูนย์ (Zero Matrix หรือ Null Matrix ) คือ เมตริกซ์ที่มีสมาชิกทุกตัวเป็นศูนย์หมด Orthogonal Matrix Cramer's rule Ax = b Cramer's rule ใช้ได้เมื่อ A เป็น square matrix เท่านั้น กรณีที่มีจำนวน สมการ มากกว่าจำนวน ตัวแปร ( A mxn เมื่อ m > n ) หรือเราเรียกว่า over parameter เราไม่สามารถหา inverse ของ rectangular matrix ได้ ให้ไปใช้ psudoinverse แทน x = A + b หรือ หรือ หรือ ไปใช้ SVD แก้สมการซะ คำตอบคือ last col of v ! Gaussian elimination method ใช้แก้สมการ เช่นเดียวกับ กฏของ คราเมอร์ วิธีคิดหลักๆ คือ ทำให้สามเหลี่ยมล่างเป็น 0 ให้หมด โดยทำ row operation จา่กนั้น แทนค่ากลับไป Diagon...

OOTOYA อร่อย ^^

เมนูอาหาร กดที่รูปเพื่อดูรูปใหญ่ อร่อยๆ ^^ ตอนแรกเล็ง เมนูพิเศษของโอโตยะ ไว้ แต่สั่ง สลัดไก่ย่างถ่าน ซอสเบซิล ไป ผักเยอะมากแต่อร่อยดี ยังได้แอบชิมของคนอื่นด้วย ปลาชิมาฮอกเกะย่างถ่าน ตัวเบ้อเริ่มเลยอ่ะ รสคล้ายๆปลาช่อน แล้วก็ของหวาน ไอศกรีมในน้ำเต้าหู้ ที่พี่กุ๋ยบอกว่า เคยเข้ามาที่ร้านแล้วสั่ง อย่างเดียวมาแล้ว ถั่วแดงเขาทำได้อร่อยมาก แต่ดันไม่มีขายถั่วแดงต้มอ่ะดิ เมนูของหวาน กดที่รูปเพื่อดูรูปใหญ่ ถ้าสั่งเป็นชุด ข้าวเติมฟรี เติมไป 2 ชาม น้ำชาเขียว refill ฟรี ชาเขียวที่นี่เขาใส่งาด้วย เหมือนที่เคยกินที่ร้าน อากะ (AKA) ที่ชั้น 7 centralworld บางคนเขาไม่ชอบกัน แต่เราเฉยๆนะ ก็อร่อยดี ข้อเสีย คือ เสริฟ ช้า ไม่ควรกินไปตอนเร่งรีบ แต่ เล็งไว้ละ ไว้จะไปกินใหม่ สาขา และ เบอร์ติดต่อ กดที่รูปเพื่อดูรูปใหญ่