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

[ 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

ความคิดเห็น

ติดตามบล็อกบนเฟซบุ๊คเพจ

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

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

ดึกแล้ว


ตลาดชา ที่หลัก กิโลเมตร ที่ 0 ดอยแม่สลอง
ขากลับโรงแรม เขาขับรถพาแวะ ตรงตลาดชา ตรงหลัก กม ที่ 0 เพิ่งเห็นว่าสุสานนายพลต้วน ซีเหวิน กองพล 93 ก็อยู่แถวๆนั้น แต่ป้ายบอกว่า 500 เมตรจากตลาดชา ประกอบกับมองไปเป็นทางขึ้นเขา แล้วก้อค่อนข้างมืดด้วยเลยไม่ได้ไป


หลักกิโลเมตรที่ 0 ดอยแม่สลอง

ตอนอยู่บนรถหลังจากกลับจากตลาดชา ลูกเจ้าของรีสอร์ต ยังถามว่าจะแวะเซเว่นเอาอะไรไหม

แล้วตอนเช้าพรุ่งนี้จะพาไปตลาดเช้า ที่ชาวเขาเอาของมาขาย
ประมาณ 7.00 ก่อนกินข้าวเช้าเวลา 08.30 ใจดีจริงๆ

plan เดิมคือ 7.00 เดินไปไร่ชา 101 จากที่ก่อนมาได้โทรไปถามไร่ชาว่าเปิดเจ็ดโมง
แต่มีแนะนำโดยคนในพื้นที่ให้ไปตลาดเช้า
ยัง LINE ไปบอกเพื่อนที่กทม ว่า อาจจะไม่ได้ไปไร่ชาแล้ว
( แต่หลังจากนี้ก้อมีเรื่องจับพลัดจับผลูให้ได้ไปไร่ชาที่ใหญ่กว่า ไร่ชา101 นั่นก้อคือ ไร่ชาฉุยฟง อดใจไว้เด๋วเล่าให้ฟัง )

บรรยากาศยามเย็นที่ตลาดชาที่ดอยแม่สลอง จังหวัดเชียงราย
พอกลับที่พัก คุณเจ้าของรีสอร์ตถามว่าทานมื้อเย็นมายัง
บังเอิญว่าเลาทานมาแล้ว เลาเลยอุดหนุนโกโก้เย็น 60 THB แทน
มีหนุ่มสาวคู่นึงที่ไปด้วยกัน เขายังไม่ทานมา เขาก้อทานที่โรงแรมนั่นแหละ
หนุ่มนี่ม…

เทคนิคคิดเลขเร็วโดยใช้ วิธีคิด แบบ เวทคณิต ( Vedic Mathematics example )

จากที่สงสัยเรื่อง ลูกคิด ของ จินตคณิต ที่ลองไปค้นดู
ปรากฎว่า เจอ เวทคณิต ซึ่งเขาบอกว่า อยู่ในคัมภีร์พระเวท

ลองอ่านดูแล้ว รู้สึกว่าฝึกสมอง ก็ทำให้คิดเลขเร็วดี
เลยสรุปมาให้ ตามนี้

Tutorial 1

การลบเลข
ALL FROM 9 AND THE LAST FROM 10
ทุกตัวลบจาก 9 และตัวสุดท้ายลบจาก 10

เช่น 1000 - 357 = 643
10,000 - 1,049 = 8951

ถ้า 1,000 - 83 ให้มองว่ามี 0 อยู่ข้างหน้า
เป็น
1,000 - 083 = 917

ฝึกบ่อยๆ ก็คล่อง แล้วก็ไม่ต้องใช้เครื่องคิดเลขด้วย
ลองทำดูสิ
1) 1000 - 777 =
2) 1000 - 283 =
3) 1000 - 505 =
4) 10,000 - 2345 =
5) 10,000 - 9876 =
6) 10,000 - 1011 =
7) 100 - 57 =
8) 1000 - 57 =
9) 10,000 - 321 =
10) 10,000 - 38 =

3,000 - 467 ก็ทำเหมือนกัน โดยลบตัวแรกสุดของ 3,000 ไป 1
จากนั้นก็ทำเหมือนเดิม จะได้ว่า 3,000 - 467 = 2,533

Tutorial 2
VERTICALLY AND CROSSWISE สำหรับตัวเลขที่น้อยกว่าฐานนิดหน่อย

ลอง 88x98

88 น้อยกว่า 100 อยู่ 12
98 น้อยกว่า 100 อยู่ 2
12x2 = 24
88-2 หรือ 98-12 ได้ 86
ดังนั้นตอบ 8,624

ดูอีกตัวอย่าง
หรือ

ลองทำนี่ดู
1) 87 x 98 =
2) 88 x 97 =
3) 77 x 98 =
4) 93 x 96 =
5) 94 x 9…

อยู่เหงาๆ เลาไปเที่ยว - ร้านเลิศรส บ้านไม้หอมรีสอร์ต ตลาดเท่งเถิดเทิง พ ฟาร์ม เมล่อน จังหวัดนครนายก

ปิ้งปัง ครีมชีส โฮมเมด ชีสสีรุ้งยืดในตลาดเท่ง แม่ค้า นั่ลลั้ก มากจย้า สนนราคา ชิ้นละ 65 บาท มีอีกร้านคือ ร้านขายน้ำแตงโมปั่นที่เสริฟมากับลูกแตงโมเลย แต่อันนั้นไม่ได้ถ่ายมา เสียดาย ><~
เพื่อนที่ทำงานจัดงานแต่งงานที่จังหวัดนครนายก เลาเลยได้โอกาสไป เขาจัดที่บ้านฝ่ายผู้หญิงเลย เป็นโต๊ะจีน จอดรถในสวน
เป็นครั้งแรกที่ข้าพเจ้าได้ไปร่วมงานแต่งงานที่ต่างจังหวัด หลังจากเคยไปร่วมงานบวชเพื่อนที่จังหวัดศรีสะเกษ เมื่อนานมาแล้ว 
หนึ่งในความฝันลมๆแล้งๆ ของข้าพเจ้า คือ การจัดงานแต่งงาน ที่บ้าน จะได้เพิ่มความเป็นของเลาไปได้นิดหน่อย จากที่มีคนเคยบอกว่า งานแต่งงานนี่ไม่ใช่ของเลาเลยซักอย่าง ชุดแต่งงานก้อไม่ใช่ของเลา ที่จัดงานก้อไม่ใช่ของเลา รูป prewedding ก้อไปถ่ายในที่ที่ไม่ใช่ของเลาซักอย่าง
มานี่เลยรู้ว่า ตลาดโรงเกลือ มีหลายจังหวัด ที่จังหวัดนครนายกเป็นอีกที่ที่มีตลาดโรงเกลือ
ร้านเลิศรส น่าจะร้านดังของพื้นที่ด้วย ขนาดไปสองโมงแล้ว คนยังกินเยอะอยู่เลย
อ่อส่วน หอยทอด ผัดไท ปลาลวกจิ้ม หมูกรอบ เจ้าดัง แนะนำโดย wongnai 
บ้านไม้หอมรีสอร์ต 

บ้านไม้หอมรีสอร์ต จังหวัดนครนายก บ้านสีสันสวยงามมาก  หน้าที่พักมีเซเว่น ใ…

วิธีใช้ ย่อๆ เกี่ยวกับ Matrix กับ Vector ( มาจาก CASIO-991MS manual )

Matrix

เปลี่ยน mode เป็น Matrix
กด mode ไปเรื่อยๆ จนเจอ MAT

วิธีใส่ Matrix เข้าไป
จิ้ม MAT ( ตรงเลข 4 )
DIM -- สร้าง Matrix ใหม่ - เราจะสร้าง Matrix เก็บไว้ในตัวแปรได้สามตัว คือ A, B, C ( Trick : ตอนใส่ค่า a11, a12, .. ถ้าอยากข้ามไปให้กดลูกศร ขึ้น ลง ซ้าย ขวา ได้เลย )
รุ่นนี้ มันใส่ได้มากสุด 3x3 นะ ถ้าใส่ 4 ไป มันจะ dimension error
EDIT -- แก้ไข Matrix ที่สร้างไว้แล้ว
MAT -- เอา Matrix ออกมาใช้งาน

Add : MatA + MatB
Subtract : MatA - MatB
Multiply with scalar : MatA x 3 หรือ 3 x MatA
Multiply : MatA x MatB
Det : Det MatA
Transpost : Trn MatA
Inverse :MatA -1
Absolute Value of Each Element : Abs MatA

ผลลัพธ์มันจะได้เป็น
MatAns11
ซึ่งเราสามารถกด ซ้าย ขวา ขึ้นลงได้เหมือนเลื่อนดู Element จาก Matrix เลย

Vector
เปลี่ยน mode เป็น Vector
กด mode ไปเรื่อยๆ จนเจอ VCT

วิธีใส่ Vector เข้าไป
จิ้ม VCT ( ตรงเลข 5 )
DIM -- สร้าง Vector ใหม่ - เราจะสร้าง Vector เก็บไว้ในตัวแปรได้สามตัว คือ A, B, C ( Trick : ตอนใส่ค่า a1, a2, .. ถ้าอยากข้ามไปให้กดลูกศร ซ้าย ขวา ได้เลย )
EDIT -- แก้ไข Vector ที่สร้างไว้แล้ว
VCT -- เอา Vector ออกม…

อยู่เหงาๆ เราไปเที่ยว - วัดระฆังโฆสิตาราม

เอนทรีนี้เป็นส่วนหนึ่งของ serie ท่องเที่ยว ดูบทความท่องเที่ยว อื่นๆ ของผม ได้ที่ ลิงก์นี้ นะครับ



จากที่ คราวก่อน ไปวัดอรุณฯ เขามีให้ล่องเรือไปวัดระฆัง เลยเดาๆ ได้ว่า วัดอยู่ไม่ไกล

ประกอบกับได้ยินเรื่องของ สมเด็จพระพุฒาจารย์ (โต พรหมรังสี) มานาน



วันนี้เลยลองไปสักหน่อย

นั่งเรือธงสีสัม ( 13 บาทตลอดสาย ) ไปลงท่าช้าง

มองจากท่าช้าง ตรงกลาง เป็น สมาคม พุทธศาสนา อะไรซักอย่างทางซ้ายของรูป คือ พระอุโบสถ วัดระฆัง
แล้วนั่งเรือข้ามฟาก ( 3 บาท ) ไปท่าวัดระฆัง

วัดระฆังโฆสิตารามวรมหาวิหาร
นกเยอะมาก ปลาก็เยอะ

แบบว่า เขามีขายอาหารสำหรับเลี้ยงปลา ( แต่แอบได้ยินคนซื้อบ่นว่าขนมปังขึ้นรา - -! )


ปลาเยอะกว่าที่วัดยานนาวาอีก ตัวใหญ่ๆทั้งนั้น
คราวนี้เราไป มันเปิดแค่อุโบสถ วิหาร แล้วก็ หอไตร แหะ ไอตรง กรอบสีส้มเข้มๆ ซ่อมอยู่


แผนที่วัดระฆังท่าวัดระฆัง ( แม่น้ำเจ้าพระยา ) อยู่ด้านล่าง
คลิกที่ภาพเพื่อดูภาพขยาย
หรือ ดูต้นฉบับที่ เวปไซท์วัดระฆัง
ไปถึงก็เดินดูรอบๆ พระอุโบสถ คนเยอะเหมือนกันนะ

พระเจดีย์
พระเจดีย์ อีก 2 องค์
couple ?
พระปรางค์
สถาปัตยกรรมรัตนโกสินทร์ยุคต้น ยึดถือเป็นแบบฉบับของพระปรางค์ที่สร้างในยุคต่อมา
แล้ว…

วิธี ยื่น ภาษีเงินได้ บุคคลธรรมดา ภงด 91 ทางเวปไซท์ ( จ่าย ภงด 91 ออนไลน์ )

ใครที่เสียภาษีบ้าง

คนโสดเงินเดือน 16,585 บาท จึงเริ่ม เสียภาษีเงินได้บุคคลธรรมดา
( เงินเดือนอัตรานี้หมายถึง พนักงานที่ไม่มีรายการ ลดหย่อน ใด ๆ นอกเหนือจากประกันสังคม )

ใครที่ต้อง ยื่น ภาษี บ้าง

ถ้าเงินเดือนไม่ถึงเกณฑ์ที่ต้องเสียภาษีเงินได้ แต่ก็มีหน้าที่ต้องยื่นแบบ หากเข้าตามเกณฑ์ดังต่อไปนี้
- คนโสดมีเงินได้ทั้งปีเกิน 50,000 บาท
- มีคู่สมรส มีเงินได้ทั้งปีไม่ว่าฝ่ายเดียวหรือทั้งสองฝ่ายรวมกันเกิน 100,000 บาท

ระยะเวลาในการยื่นภาษี

1 มกราคม ถึง 31 มีนาคม ของทุกปี

การ ชำระ ภาษี ผ่าน ทาง อินเตอร์เน็ต

1. เข้าไปที่ http://rdserver.rd.go.th




ถ้าได้เงินเดือนจากบริษัท อย่างเดียว ให้ยื่นแบบ ภงด.91
แต่ถ้านอกเหนือจากงานประจำ ยังมีรายได้จากทางอื่นอีก ก็จะต้องยื่นแบบ ภงด.90

2. พอกดเข้าไปแล้วจะเจอหน้า login

หมายเลขผู้ใช้ คือ เลขประจำตัวประชาชน
รหัสผ่าน ต้องมีความยาว 8 ตัวอักษร

หน้า login ของการ เสียภาษีเงินได้บุคคลธรรมดา
ลงทะเบียน
ถ้ายังไม่ได้กดลงทะเบียนให้กด ลงทะเบียน มันจะไปยังหน้านี่



หน้าลงทะเบียน เลือก บุคคลธรรมดา สัญชาติไทย น้ะจ้
ทำตามขั้นตอนลงทะเบียนจนจบ
ถ้าเราสัญชาติไทย พอลงทะเบียนเสร็จจะได้ ภาพพิม…

อยู่เหงาๆ เราไปเที่ยว - วัดอรุณราชวราราม ( วัดแจ้ง ) + วัดสระเกศ ( ภูเขาทอง )

เอนทรีนี้เป็นส่วนหนึ่งของ serie ท่องเที่ยว ดูบทความท่องเที่ยว อื่นๆ ของผม ได้ที่ ลิงก์นี้ นะครับ

คำเตือน เอ็นทรีนี้รูปเยอะมากกกก ควรปิดบิตก่อนดู

ผ่างๆๆ ท่านสามารถรับชมเอนทรีนี้ผ่าน url http://tinyurl.com/goldenMount ได้ด้วย

วันนี้ตั้งใจไปวัดอรุณฯ

เดินทางทางน้ำเหมือนเดิม

แต่คราวนี้นั่งเรือ ธงสีฟ้า ( คราวก่อน นั่งเรือ ธงสีส้ม )

พอถึงท่าสาทร เขาบอกว่า ให้ลงลำที่จอดอยู่ได้เลย เก็บตังในเรือ

ก็ งงๆ เดินลงไป

เหมือนเดิมครับ

ชูชีพอยู่ใต้ที่นั่งของท่าน
พอเรือออกสักพัก มีไกด์ มาบรรยาย

อ้าว กรำ

ขึ้นผิดเรือรึเปล่า

นี่มันเรือท่องเที่ยว 150 บาท ไม่ใช่เร๊อะ

กะลังอึ้งๆอยู่

แต่พอไกด์พูดไปสักพัก ก็เลยรู้ว่า 150 บาท มันราคาเหมาวัน

แล้วก็ได้ความรู้ของท่าเรือ แล้วก็สองข้างทาง




เรือธงฟ้านี่มันไปสุดที่ท่าพระอาทิตย์เท่านั้นเองนะ แล้วก็กลับ

ตอนไปมีสาวคนนึง ถามว่า จะไปวัดสระเกศ ไปทางไหน

ถ้าฟังไม่ผิด คนเก็บตังบนเรือ บอกว่า ท่ามหาราช

จากนั้นก็คุยอะไรกันไม่รู้ ไม่ได้ยินแล้วล่ะ




เรือธงฟ้า มันใหญ่กว่า น่าหวาดเสียวน้อยกว่า น้ำกระเด็นน้อยกว่า แพงกว่า เรือธงสีส้ม

คราวนี้รู้และ นั่งริมฝั่งธน ได้มาหลายรูปเหมือนกัน แต่วันนี…

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

เชียงราย ม่วนใจ๋
ยอมรับเลยว่า หาข้อมูลค่อนข้างยาก
กระทู้รีวิว ใน 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 คือ สนามบินสุวรรณภูมิ อย่าไปผิดสนามบินเชียว

ขอบคุณ ตั๋ว 0 บาท …

Expectation E(X), Varience Var(X), covariance Covar(X)

ความคาดหมาย ( expected value )
คือ ค่าเฉลี่ยที่เรา "expects" ว่าจะเป็นผลที่ได้ของการสุ่ม

สำหรับตัวแปรสุ่มเต็มหน่วย X ( discrete )
หรือ prob ของฟังก์ชั่น*ฟังก์ชั่น = Expectation
เช่น ค่าความคาดหมายของการโยนลูกเต๋า คือ
E(X) = 1*1/6+2*1/6+3*1/6+4*1/6+5*1/6+6*1/6
รูเล็ทอเมริกันออกได้ 38 แบบ คนแทงเลขเดียวแล้วได้จะได้เงินในอัตรา 35-ต่อ-1 (ถ้าได้จะได้เงิน 35 เท่าของที่พนันและได้เงินที่พนันรวมมา 1$ ดังนั้นจึงได้ 36 เท่าของที่พนัน). รูเล็ทออกได้ทั้งหมด 38 แบบ ค่าความคาดหมายของกำไรที่ได้ คือ
(ได้ −$1 เมื่อคุณเสีย และได้ $35 เมื่อคุณชนะ)
ดังนั้นเสีย 5 cents กว่าๆสำหรับที่แทงไปทุกๆ 1 dollar, และexpected value ของการแทง 1 dollar คือ $0.9473 ( มาจาก 1-0.0526 )

สำหรับตัวแปรสุ่มต่อเนื่อง X ( continuous )
เมื่อ f(x) เป็น probability density function
ถ้าเป็น expected value ของ arbitrary function ของ X, g(X)

สมบัติของ expected valueพิสูจน์
E(aX+b) = ∫ (aX+b)f(x) dx = a ∫ Xf(x) dx + b ∫f(x)dx = aE(X)+b
เพราะ f(x) คือ prob ดังนั้น ∫ จาก -infinity ถึง infinity ของ ∫f(x)dx = 1

expected value ยังเอามาใช้ค…

อยู่เหงาๆ เลาไปเที่ยว - ศูนย์การเรียนรู้ และ พิพิธภัณฑ์ธนาคารแห่งประเทศไทย BOT Learning Center and BOT museum

ศูนย์การเรียนรู้ธนาคารแห่งประเทศไทย มองไปเห็นสะพานพระราม 8 วิวดีมากๆ
เขาบอกว่า ในช่วง 6 เดือนแรกไม่เก็บค่าเข้าชม เลยแวะไปสักหน่อยแจร้
เลาเองสะดวกทางเรือโดยเลานั่งจากท่าเรือสาทร ไปลงท่าเรือเทเวศน์
พร้อมกันนี้ เลาได้ถือโอกาสแวะซื้ออาหารจาก ครัวกุ๊กชม ที่อยู่ตรงท่าเรือเทเวศน์ ตอนขากลับบ้านด้วย อยากลองมานานแล้ว

ห้องสมุดพระองค์เจ้าวิวัฒนไชย

 บันได
พิพิธภัณฑ์ธนาคารแห่งประเทศไทย ประตูเซฟสองชั้นของจริง ต้องใช้กุญแจ 6 ดอก จาก 6 คน  ถึงเปิดเข้าไปได้ เหมือนที่เคยเห็นในหนังญี่ปุ่นเบยแจร้ ภายในมีเครื่องพิมพ์ธนบัตร รวมถึง ธนบัตรที่พิมพ์เสร็จแล้ว 
* ธปท พิมพ์ธนบัตร
กรมธนารักษ์ กระทรวงการคลัง ผลิตเหรียญ

เครื่องพิมพ์ธนบัตรเดิม

เครื่องยนต์กลไก 

ตู้เก็บธนบัตรที่พิมพ์เสร็จแล้ว ใส่กุญแจล็อกไว้อย่างดี กลัวหาย

แม่พิมพ์ธนบัตรสมัยก่อน


ธนบัตรมูลค่าสูงสุดที่ธนาคารแห่งประเทศไทยเคยพิมพ์มา จัดพิมพ์เป็นที่ระลึกวันราชาภิเษกสมรสครบ ๕๐ ปี ของพระบาทสมเด็จพระเจ้าอยู่หัวภูมิพลอดุลยเดช และสมเด็จพระนางเจ้าสิริกิติ์ พระบรมราชินีนาถ คือ ใบละ 5 แสนบาท จำหน่ายใบละ 1 ล้านบาท โดยอีก 5 แสนบาท ถวายให้ในหลวง


ธนบัตรห้าสิบสตางค์

ธนบัตรใบละ หนึ…