Unknown
Nhãn: 0 nhận xét | | edit post
Unknown

Contents



Introduction

TweenLite, TweenFilterLite, TweenMax, TweenGroup and TransformManager, are Actionscript 3 tweening classs written by Jack Doyle, GreenSock The purpose of this page is to have a printable version of the documentation (useful for teaching in a lab with small screens) and to add some examples that could be useful to "simple" Flash designers.

  • TweenLite - a light-weight and fast tween class to create animation and shape tweens in one go.

  • TweenFilterLite - extends TweenLite to add more filters (like blurs, glows, contrast, brightness, etc.). It's bigger and a bit slower than TweenLite.

  • TweenMax - does both of Tweenlite and TweenFilterLite and more. It's still bigger and bit slower.

  • TweenGroup - allow to manage groups of TweenLite/FilterLite/Max tweens. E.g. you can create a few tweens with TweenLite and then then play these in sequence.

  • TransformManager - add interactive scaling/rotating/moving of DisplayObjects in your Flash animation.

Please refer to the GreenSock website for official information and also consider donating something to Jack. You will get some additional benefits. Since I only teach Flash once in a while I only gave $30 - Daniel K. Schneider.

In order to understand what some of the parameters and properties do, you will have to consult the AS3 manuals at Adobe, in particular the ActionScript3 language reference.

Syntax used for datatypes

If you see something like this xxx:YYY, it means that you have to use value of type YYY. Typically, you must specify:

Objects

If you work with CS3, instance names of movie clips)
target:Object
e.g. my_rocket
Objects also can refer to ECMAScript objects that you create on the fly with {...}
variables:Object
E.g. an object with properties x=120 and y=110 is created like this:
{x:120,y:110}
Numbers

x:Number
e.g. 15
Color_uint

E.g. for red you could use the following Hex value:
0xFF0000
Boolean

xxx:Boolean
e.g. knockout:true
Functions

You will have to give a function name. This can be a Class.method.
xxx:Function
E.g. ease:Strong.easeInOut
Arrays

You have to create an array using [...]. Typically this is used to pass parameters to methods , e.g.
easeParams:[1.5, 2.45]


Tweenlite Usage summary

This class includes a few static methods that you can use like functions.

  1. TweenLite.to - create a tween of multiple properties of an object

  2. TweenLite.from - same as above (you specify the result of the tween))

  3. TweenLite.delayedCall - Call a function after number of seconds

  4. TweenLite.killDelayedCallsTo - Kill delayed calls (see previous line)

  5. TweenLite.killTweensOf - Kills all tweens of a particular object

  6. TweenLite.removeTween - Removes a tween



TweenLite.to

Description: Tweens the target's properties from whatever they are at the time you call the method to whatever you define in the variables parameter.

Disclaimer: Information be wrong and/or outdated - Daniel K. Schneider 17:13, 28 October 2008 (UTC).

Syntax:

TweenLite.to(target:Object, duration:Number, variables:Object);
You can keep track of an instance if you want to (e.g. to kill it):

var myTween:TweenLite = TweenLite.to(target:Object, duration:Number, variables:Object);
Alternative object-oriented syntax:

var myTween:TweenLite = new TweenLite(target:Object, duration:Number, variables:Object);
This is almost equivalent to the above. The former is usually preferable since it will handle garbage collection.

Mandatory parameters

  1. target:Object Target MovieClip (or any object) whose properties we're tweening

  2. duration:Number Duration (in seconds) of the tween

  3. variables:Object An object containing the end values of all the properties you'd like to have tweened (or if you're using the TweenLite.from() method, these variables would define the BEGINNING values). Putting quotes around values will make the tween relative to the current value. For example, x:"-20" will tween x to whatever it currently is minus 20 whereas x:-20 will tween x to exactly -20.

Here is a simple example that will move a symbol called "mouse" to position x=120 in about 1.5 seconds)

TweenLite.to(clip_mc, 1.5, {x:120}
Properties you can defined in the variables object:

You can change many properties at the same time and this one reason why this library is so nice. In the following example a movie clip called "clip:mc" will move to position x=120, it's alpha will fade to 50% and its volume will fade out completely:

TweenLite.to(clip_mc, 1.5, {alpha:0.5, x:120, volume:0});
alpha:Number

The alpha (opacity level) that the target object should finish at (or begin at if you're using TweenLite.from()). For example, if the target.alpha is 1 when this script is called, and you specify this parameter to be 0.5, it'll transition from 1 to 0.5.
autoAlpha:

Same as changing the "alpha" property but with the additional feature of toggling the "visible" property to false if the alpha ends at 0. It will also toggle visible to true before the tween starts if the value of autoAlpha is greater than zero.
x:Number

To change a MovieClip's x position, just set this to the value you'd like the MovieClip to end up at (or begin at if you're using TweenLite.from()).
y:Number

To change a MovieClip's y position (like above).
scaleX:Number

Scaling in X direction, i.e. making the with smaller or larger
scaleY:Number

Scaling in Y direction, i.e. making the height smaller or larger
rotation:Number

Clock-wise rotation in degrees.
delay:Number

Number of seconds you'd like to delay before the tween begins. This is very useful when sequencing tweens
ease:Function

You can specify a function to use for the easing with this variable. For example, fl.motion.easing.Elastic.easeOut. The Default is Regular.easeOut (and Linear.easeNone for volume).
You can use all the standard AS3 methods defined in fl.motion.easing and fl.transitions.easing
If you want to create your own easing equation use Jack's Custom Ease Builder on-line tool.
Example
TweenLite.to(logo,0.4,{scaleX:1,scaleY:1,alpha:1,ease:Strong.easeInOut,delay:0.8,overwrite:false});
Example of custom function definition and use
import gs.easing.CustomEase;
CustomEase.create("myCustomEase",
[{s:0,cp:0.509,e:0.612},{s:0.612,cp:0.715,e:0.412},{s:0.412,cp:0.109,e:1}]);
TweenLite.to(mc, 2, {x:"250", ease:CustomEase.byName("myCustomEase"")});
easeParams:Array

Allows to pass parameters to the ease function (see above)
TweenLite.to(my_mc, 2, {_x:200, ease:Elastic.easeOut, easeParams:[1.5, 2.45]});
volume: Number

To change a MovieClip's volume, i.e. the SoundTransform property. Set this to the value you'd like the MovieClip to end up at (or begin at if you're using TweenLite.from()).
tint:Color_uint

To change a MovieClip's color, set this to the hex value of the color you'd like the MovieClip to end up at(or begin at if you're using TweenLite.from()). An example hex value would be 0xFF0000. If you'd like to remove the color from a MovieClip, just pass null as the value of tint.
removeTint:Boolean

To remove the tint of a DisplayObject. Use the value true.
frame:Integer

To tween a MovieClip to a given frame.
roundProps:Array

Allows to define inbetween rounding values. E.g.
TweenMax.to(my_mc, 3, {_x:500, _y:0, bezier:[{_x:250, _y:50}]});
onStart:Function

If you'd like to call a function as soon as the tween begins, pass in a reference to it here. This can be useful when there's a delay and you want something to happen just as the tween begins.
onStartParams:Array

An array of parameters to pass the onStart function.
onUpdate:Function

If you'd like to call a function every time the property values are updated (on every frame during the time the tween is active), pass a reference to it here.
onUpdateParams:Array

An array of parameters to pass the onUpdate function (this is optional)
onComplete:Function

If you'd like to call a function when the tween has finished, use this.
onCompleteParams:Array

An array of parameters to pass the onComplete function (this is optional)
overwrite:Int

You can enter 4 values: 0 (NONE) = No tweens are overwritten; 1 (ALL) = All tweens of the same object are completely overwritten immediately when the tween is created; 2 (AUTO) = Searches for and overwrites only individual overlapping properties in tweens that are active when the tween begins; 3 (CONCURRENT): Overwrites all tweens of the same object that are active when the tween begins.
persist:Boolean

If true, the TweenLite instance will not automatically be removed by the garbage collector when it is complete. By default, it is false.
renderOnStart:Boolean

If you're using TweenLite.from() (or runBackwards:true) with a delay and want to prevent the tween from rendering until it actually begins, set this special property to true. By default, it's false which causes TweenLite.from() to render its values immediately, even before the delay has expired.
runBackwards:Boolean

Flips the start and end values in a tween. That's the same as using the from() method (see below).


TweenLite.from

TweenLite.from(target:Object, duration:Number, variables:Object);
Description: Exactly the same as TweenLite.to(), but instead of tweening the properties from where they're at currently to whatever you define, this tweens them the opposite way - from where you define TO where ever they are now (when the method is called). This is handy for when things are set up on the stage where the should end up and you just want to animate them into place.

Parameters: Same as TweenLite.to(). (see above)



TweenLite.delayedCall

TweenLite.delayedCall(delay:Number,onComplete:Function,onCompleteParams:Array);
Description: Provides an easy way to call any function after a specified number of seconds. Any number of parameters can be passed to that function when it's called too.

Parameters:

  1. delay: Number of seconds before the function should be called.

  2. onComplete: The function to call

  3. onCompleteParams [optional] An array of parameters to pass the onComplete function when it's called.



TweenLite.killTweensOf

TweenLite.killTweensOf(target:Object);
Description: Provides an easy way to kill all tweens of a particular Object/MovieClip.

Parameters:

  • target: Any/All tweens of this Object/MovieClip will be killed.







TweenLite.killDelayedCallsTo

TweenLite.killDelayedCallsTo(function:Function);
Description: Provides an easy way to kill all delayed calls to a particular function (ones that were instantiated using the TweenLite.delayedCall() method).

Parameters:

  • function: Any/All delayed calls to this function will be killed.



TweenLite examples

As you can see in the code below, in order to use this class, you will have to do the following.

  • If you work with CS3 you need an instance of MovieClip that is named, e.g. "movie_clip".

  • Then, in some keyframe, hit F9 and you can write AS code. The code must include at least:

import gs.TweenLite;
  • When Flash requires that you import "official" flash classes you will have to import these too. E.g.

import fl.motion.easing.Back;
As a simple example, you could tween the alpha to 50% (0.5) and move the x position of a MovieClip named "movie_clip" to 120 and fade the volume to 0 over the course of 1.5 seconds like so:

import gs.TweenLite;
TweenLite.to(movie_clip, 1.5, {alpha:0.5, x:120, volume:0});
If you want to get more advanced and tween the movie_clip MovieClip over 5 seconds, changing the alpha to 50% (0.5), the x coordinate to 120 using the Back.easeOut easing function, delay starting the whole tween by 2 seconds, and then call a function named "onFinishTween" when it has completed and pass in a few parameters to that function (a value of 5 and a reference to the movie_clip), you'd do so like:

import gs.TweenLite;
import fl.motion.easing.Back;
TweenLite.to(movie_clip, 5, {alpha:0.5, x:120, ease:Back.easeOut,
delay:2, onComplete:onFinishTween, onCompleteParams:[5, movie_clip]});
function onFinishTween(parameter1_num:Number, parameter2_mc:MovieClip):void {
trace("The tween has finished! parameters: " + parameter1_num + ", and " + parameter2_mc);
}
If you have a MovieClip on the stage that is already in its end position and you just want to animate it into place over 5 seconds (drop it into place by changing its y property to 100 pixels higher on the screen and dropping it from there), you could:

import gs.TweenLite;
import fl.motion.easing.Elastic;
TweenLite.from(movie_clip, 5, {y:"-100", ease:Elastic.easeOut});
Sequence of tweens so that they occur one after the other. Just use the delay property and make sure you set the overwrite property to false (otherwise tweens of the same object will always overwrite each other to avoid conflicts). Here's an example where we colorize a MovieClip red over the course of 2 seconds, and then move it to a _y coordinate of 300 over the course of 1 second:

import gs.TweenLite;
TweenLite.to(movie_clip, 2, {tint:0xFF0000});
TweenLite.to(movie_clip, 1, {y:300, delay:2, overwrite:false});


TweenFilterLite usage

TweenFilterLite extends the TweenLite class, adding the ability to tween filters (like blurs, glows, drop shadows, bevels, etc.) as well as advanced effects like contrast, colorization, brightness, saturation, hue, and threshold.

Syntax (identical to the TweenLite class), e.g.

TweenFilterLite.to (target:Object, duration:Number, variables:Object);
To understand what filters are, you may read documentation at Adobe:

To understand what the TweenFilterLite filters do, you also could consult the AS3 or Flex documentation. The parameters of the TweenFilter class are much easier to use than the properties and the methods of the "official" AS3 libraries. However this documentation may help to understand the meaning of these parameters and what kind of values you should use.

Example:

TweenFilterLite.from (movie_clip, 5, {colorMatrixFilter:{colorize:0xFF0000}})
In addition to the TweenLite parameters described above you can use:

timeScale:Number

Speed up or slow down a tween
globalTimeScale

Globally speed up/down all tweens
blurFilter:Object

Create a blur with one or more of the following properties:
Parameters: blurX, blurY, quality.
Example:
TweenFilterLite.to(movie_clip, 2, {blurFilter:{blurX:1, blurY:2}})
glowFilter:Object

Apply a glow effect to display objects
Parameters: alpha, blurX, blurY, color, strength, quality, inner, knockout,
colorMatrixFilter:Object

Apply various color filters
Parameters: colorize, amount, contrast, brightness, saturation, hue, threshold, relative, matrix,
Example
TweenFilterLite.to(movie_clip, 2, {colorMatrixFilter:{colorize:0xFF0000, amount:1}});
dropShadowFilter:Object

Will add a drop shadow to an object.
Parameters alpha, angle, blurX, blurY, color, distance, strength, quality
Flex Adobe dropShadowFilter doc
bevelFilter:Object

Create a bevel effect gives, i.e. three-dimensional look
Parameters angle, blurX, blurY, distance, highlightAlpha, highlightColor, shadowAlpha, shadowColor, , gth, quality


TweenMax features

TweenMax builds on top of TweenLite and TweenFilterLite. It uses again the same syntax and just adds some functionalities that are less essential. The only tradeoff is some slight increase in size, i.e. 11K of AS code (which is still very small).

In addition to FilterLite and TweenLite, you can do the following (and more that we may document some other time):

bezier:Array

Allows to tween with a bezier array.
TweenMax.to(my_mc, 3, {_x:500, _y:0, bezier:[{_x:250, _y:50}]})
bezierThrough:Array

Pass points through which the bezier values should move.
orientToBezier:Array (or Boolean)

MovieClip/Sprite to orients itself in the direction of a Bezier path. The arrays need the following elements: Position property 1 (typically "x"), Position property 2 (typically "y"), Rotational property (typically "rotation"), Number of degrees to add (optional - makes it easy to orient your MovieClip/Sprite properly).
[["x", "y", "rotation", 0]].
Note: This is an array within an array



Simple TweenMax example

The goal is to take a picture and make it look old or otherwise bad as in the following tweenmax-photo-filter.html example. Instead, you might have used the TweenFilterLite library too.

Procedure:

  • Drag a *.jpg picture into the library

  • Drag it to the stage and make it a movie clip symbol (Right-click->Convert to symbol). Call it "picture_mc".

  • Kill the picture on the stage

  • Drag two copies of the new movie clip symbol to the stage

  • Name the first one "picture" and the second one "picture2". This way the AS3 code can use them as objects.

AS3 code:



  1. import gs.TweenMax;






  2. import gs.easing.*;






  3. TweenMax.to(picture,






  4.             5,






  5.             {colorMatrixFilter:{colorize:0xffcc33, amount:0.4, contrast:0.6, brightness:1.1, saturation:0.4},






  6.             ease:Back.easeOut});






  7. TweenMax.to(picture2,






  8.             5,






  9.             {colorMatrixFilter:{amount:0.4, contrast:0.3, brightness:2.0, saturation:0.8},






  10.             ease:Back.easeOut});




Source:



TweenGroup usage

(to be written with an example)

  • Pause/Resume capability

  • reverse() and/or restart()

  • Grouping and Sequencing

Unknown
control userpasswords2

Bổ sung một số tính năng mở rộng vào bên trong menu ngữ cảnh là việc làm vô cùng tiện ích, giúp tiết kiệm thời gian tương tác và qua đó, cải thiện hiệu suất làm việc của bạn với máy tính. Sau đây, TTCN xin hướng dẫn các bạn cách thêm các mục gồm: Command Prompt, Copy the content  to clipboard, CopyTo, MoveTo vào menu ngữ cảnh trong Windows 7.

Các thủ thuật chuẩn bị nói dưới đây đều tác động tới Registry, do đó các bạn hãy sao lưu các thiết đặt Regis mặc định để phòng trường hợp rắc rối hệ thống xảy ra.

Thêm tùy chọn "Command Prompt in This Folder"

Nhấp tổ hợp phím "Windows+R" để mở hộp thoại Run, tại đây nhập ‘regedit’ để mở cửa sổ Registry.

Điều hướng tới HKEY_CLASSES_ROOT\Directory\shell và tạo một Key mới trong shell. Các bạn đặt tên cho Key này là "Command Prompt".

Tại bảng bên phải, nhấp chuột phải lên giá trị "Default" và chọn "Modify". Tại trường "Value data" nhập "Command Promt here".

Tương tư trên các bạn tạo Key mới dưới "Command Prompt" và đặt tên nó là "command".

Tương tác với command, tại cửa sổ bên phải các bạn cũng nhấp chuột phải lên giá trị "Default" và chọn "Modify", nhập "cmd.exe /k cd %1" tại trường "Value data".

Giờ đóng cửa sổ Registry lại và kiểm tra kết quả thu được.

Thêm tùy chọn "Copy the content to clipboard"

Mở cửa sổ Registry, điều hướng tới HKEY_CLASSES_ROOT\txtfile\shell, tạo Key mới dưới shell và đặt tên là "Copy to clipboard". Tương tự Modify với "Default" và nhập "Copy the content  to clipboard" cho "Value data".

Lần nữa tạo Key và đặt tên cho Key là "command" nằm dưới "Copy to clipboard". Nhấp chuột phải lên "Default" chọn Modify ,nhập "cmd /c clip < “%1” " tại trường "Value data".

Đóng cửa sổ Registry và kiểm tra kết quả.

Thêm tùy chọn "CopyTo"

Điều hướng tới: HKEY_CLASSES_ROOT\AllFilesystemObjects\shellex\ContextMenuHandlers từ cửa sổ Registry.

Nhấp chuột phải lên ContextMenuHandlers và chọn "New->Key”. Đặt tên cho Key là "CopyTo".

Nhấp đúp chuột lên giá trị "Default" bên phải, tại trường "Value data" nhập mã: {C2FBB630-2971-11D1-A18C-00C04FD75D13}.



Thêm tùy chọn "MoveTo"

Tương tự tạo Key và đặt tên là "MoveTo" dưới ContextMenuHandlers, nhập mã: {C2FBB631-2971-11D1-A18C-00C04FD75D13} cho trường "Value data".

Unknown
NHIẾP PHONG

Nhân vật trong Phong Vân phải nói là rất nhiều ,từ tập 1 cho đến tập 100,nhân vật xuất hiện liên miên ,chỉ có 3 nhân vật không bị chết,đó là :Nhiếp Phong ,Bộ Kinh Vân và Vô Danh .Ngoài ra đều chết hoặc không xuất hiên.



[/ipg]

Là một trong hai nhân vật chính của truyện .Nhiếp Phong là con trai của "Bắc Ẩm Cuồng Đao" Nhiếp Nhân Vương,tu vị đao pháp thuộc hàng cao thủ nhưng vì tình mà hóa cuồng .



Là tam đệ tử của Hùng Bá ,được truyền dạy cho Phong Thân Cước,từ nhỏ đã tự mình nuôi sống mình ,luôn ngăn cản cha giết người bữa bãi,và khinh công của Phong từ nhỏ đã hơn người,Một lần khi đang chứng kiến Nhiếp Nhân Vương chiếu đấu với Đoạn Soái thì đột nhiên người của Thiên hạ hội do Bộ Kinh Vân đẫn đấu đã đến bắt Phong buộc phải đầu quân cho Thiên hạ hội .Dồng thời lấy 2 thanh thần binh là "Tuyết Ẩm Đao " và " Hỏa Lân Kiếm".Nhiếp Phong đã dùng tuyện học Hùng bÁ truyền cho để trừng phạt những kẻ không đầu hàng Thiên hạ hôi.Sau này nhận ra được sai lầm của mình nên đã quay sang hợp sức với Bộ Kinh Vân đánh lại Hùng Ba.Vì cứu Bộ Kinh Vân mà một con mắt của Phong đã bị phế vĩnh viễn.



Sau này do cứu Trung Nguyên nên Phong đã tự nguyện nhập ma đề học Ma đao,tuy đánh đuổi dc ngoại bang nhưng bị ma tâm khống chế,làm nhiều điều nguy hại cho nhân gian,dc Bộ Kinh Vân cứu thoát khỏi ma đạo.Phong la người có tấm lòng nhân hậu,và vì tính nhân hậu này đã làm cho anh mất chết cả gia đinh,do lầm tin vào Đoạn Lãng nên cả cha mẹ đều bị giết .Có máu cuồng điên di truyền trong người nên sức mạnh biến hóa không ai lường được.Dòng máu điên cuồng di truyền do tổ tiên nhà họ Nhiếp,vì nuốt phải máu của Hỏa Kì Lân trong 1 cuộc chiến mà trở nên điên cuồng ,nhưng lại xó được sức mạnh của Hỏa kì lân.Tuyết Ẩm Đao được đúc là để kềm hãm máu điên trong người.



Hợp sức với Bộ Kinh Vân sẽ phát ra "Ma Kha Vô Lượng".Khinh công của Nhiếp Phong độc bộ giang hồ,khoái tuyệt võ lâm.Tu vị đạt tới cảnh giới đạp gió mà đi.Trong một lần vào động Lăng Vân,nuốt được Huyết bồ đề nên công lực tăng cường và gặp được đao phổ Ngạo Hàn lục quyết trong động do tổ tiên Nhiếp Phong là Nhiếp Anh để lại.



Trong cuộc chiến với Đoạn Lãng,Nhiếp Phong bị đánh mất 6 phần hồn,được Bộ Kinh Vân dùng công lực cứu chữa trong băng sơn 20 năm.Trong người Phong vừa có máu cuồng điên vừa có khí chân nguyên rồng hun đúc ,2 linh thú vửa tương sinh vừa tương khắc nên sức mạnh của Nhiếp Phong biên hóa khôn lường,không ai đoán biết được sức mạnh của Phong.



Vũ khí sử dụng : Tuyết Ẩm Đao



Tuyệt học võ công:

+Băng Tâm Quyết

+Phong Thần Cước

+Sáng đao

+Ma đao

+Ngạo hàn Lục Quyết.

+Động Pgong Vân

+Huyền Vũ Chân Công .

+Thiên đạo vô cực.

+Ma kha vô lượng.



Ngạo hàn Lục Quyết.:Bao gồm 6 quyết ,là võ công gia truyền của Nhiếp gia.



+Quyết thứ 1:"Kinh Hàn Nhất Phách": là 1 đao chiêu tuyệt hàn,diệt tuyệt,là đao chiêu mạh nhất trong Ngạo hàn Lục Quyết.



+Quyết thứ 2:"Băng phong tam xích":đao kình làm ngưng băng,dày hơn 3 xích vì thế mới có tên là Băng phong tam xích,có thể vây người và vây mình ,là đao chiêu duy nhất trong Ngạo hàn Lục Quyế dùng để thủ.



+Quyết thứ 3:"Hồng Hạnh Xuất Tường":vốn biến chiêu từ "Tuyết trung hồng hạnh",do Nhiếp Nhân Vương căm hận người vợ ngoại tình mà nghĩ ra.Ý càng hận,đao chiêu sử ra càng hận,càng hiểm.



+Quyết thứ 4:"Đao Chi Yểu Yểu":đao chiêu yếu ớt , mảnh mai như cành đào bám tuyết ,tựa như vô lực nhưng thực sự vô cùng cường liệt.



+Quyết thứ 5:"Đạp Tuyết Tầm Mai":là chiêu duy nhất trong "Ngạo hàn Lục Quyết" dùng cước vận đao,đao cước đều sử được.



+Quyết thứ 6:"Lãnh Nhẫn Băng Tâm": là thức chí cao vô thương trong "Ngạo hàn Lục Quyết",đáng tiếc đao phổ đã bị thất truyền.Về sau,trong Động Lăng Vân,do cơ duyên ,Phong đã tìm thấy được đao phổ này do tổ tiên là Nhiếp Anh khắc lại trong động.



Tất cả các quyết trong "Ngạo hàn Lục Quyết" đều là dùng Tuyết Ẩm Đao sử ra được mới thấy hết tính lăng lệ của nó, trừ chiêu "Đạp Tuyết Tầm Mai".Nhưng về sau trong cuộc chiến Phong Vân ,Tuyết Ẩm Đao đã bị Phong bẻ gãy,sau đó tất cả đao chiêu đều dùng cước sử ra ,oai lực không hề thua khi có Tuyết Ẩm Đao.Trong suốt Phần 2 ,Phong không dùng Tuyết Ẩm Đao,phải sang đến Phần 3 ,Tuyết Ẩm Đao mới được Đệ Nhị Đao Hoàng - nhạc phụ Nhiếp Phong và Trư Hoàng - người đã truyền dạy Sáng Đao cho Phong đúc lại. 2 người đã mất 10 năm để đúc lại "Tuyết Ẩm Đao" cho Phong.



Đao chiêu mạnh nhất: Kinh Hàn Nhất Phách.

Phong thần cước :

-Phong trung kình thảo

-Thần phong nộ hào

-Bão vũ cuồng phong

-Phong quyện lâu tàn

-Lôi lệ phong hành

-Phong quyển tàn chấn

-Bổ phong tróc ảnh

Hiệu xưng:: .Phong Trung Chi Thần





Tâm nhược băng thanh

Thiên tháp bất kinh

Trần cấu bất thiên

Tục duyên bất nhẫn



Tâm tụ vô hình

Ý định thần kiên

Thư không ninh mật

Hỗn thiên vô vật...



Tâm vô quái nghi

Ý vô sở chấp

Thượng thiện nhược thuỷ

Băng tâm thích hoá
Unknown
_gradientColor1 = uint(input);

r1 = (_gradientColor1 >>16) & 0xFF;

g1 = (_gradientColor1 >>8) & 0xFF;

b1 = _gradientColor1 & 0xFF;



filtersCo=r1<<16|g1<<8|b1



Have you tried “Math.atan2″ method to detect angle between the points?

This returns in radians but you can multiply by “180 / Math.PI” for degree rotation.

function angleOfPoints(a:Point, b:Point):Number

{

var dx:Number = a.x-b.x;

var dy:Number = a.y-b.y;

var rad:Number = Math.atan2(dy, dx);

return rad;

}

stage.scaleMode = StageScaleMode.NO_SCALE;
Unknown
You can get current date and/or time in Java using the following method. You may change the date format in the constructor of SimpleDateFormat to get the result in a different format:

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

private String getDateTime() {
DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
return dateFormat.format(date);
}





import java.util.Calendar;
import java.text.SimpleDateFormat;

public class DateUtils {
public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss";

public static String now() {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW);
return sdf.format(cal.getTime());

}

public static void main(String arg[]) {
System.out.println("Now : " + DateUtils.now());
}
}

Here some formatting possibilities available through the SimpleDateFormat class.

import java.util.Calendar;
import java.text.SimpleDateFormat;

public class DateUtils {


public static String now(String dateFormat) {
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
return sdf.format(cal.getTime());

}

public static void main(String arg[]) {
System.out.println(DateUtils.now("dd MMMMM yyyy"));
System.out.println(DateUtils.now("yyyyMMdd"));
System.out.println(DateUtils.now("dd.MM.yy"));
System.out.println(DateUtils.now("MM/dd/yy"));
System.out.println(DateUtils.now("yyyy.MM.dd G 'at' hh:mm:ss z"));
System.out.println(DateUtils.now("EEE, MMM d, ''yy"));
System.out.println(DateUtils.now("h:mm a"));
System.out.println(DateUtils.now("H:mm:ss:SSS"));
System.out.println(DateUtils.now("K:mm a,z"));
System.out.println(DateUtils.now("yyyy.MMMMM.dd GGG hh:mm aaa"));
}
}
Unknown

import java.lang.reflect.*;

public class MethodInspector {
public static void main(String[] arguments) {
Class inspect;
try {
if (arguments.length > 0)
inspect = Class.forName(arguments[0]);
else
inspect = Class.forName("MethodInspector");
Method[] methods = inspect.getDeclaredMethods();
for (int i = 0; i < methods.length; i++) {
Method methVal = methods[i];
Class returnVal = methVal.getReturnType();
int mods = methVal.getModifiers();
String modVal = Modifier.toString(mods);
Class[] paramVal = methVal.getParameterTypes();
StringBuffer params = new StringBuffer();
for (int j = 0; j < paramVal.length; j++) {
if (j > 0)
params.append(", ");
params.append(paramVal[j].getName());
}
System.out.println("Method: " + methVal.getName() + "()");
System.out.println("Modifiers: " + modVal);
System.out.println("Return Type: " + returnVal.getName());
System.out.println("Parameters: " + params + "\n");
}
} catch (ClassNotFoundException c) {
System.out.println(c.toString());
}
}
}
Unknown

Using Runtime.exec()

This example will capture the output (from stdio) of an external program.

import java.io.*;
public class CmdExec {

public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec
(System.getenv("windir") +"\\system32\\"+"tree.com /A");
BufferedReader input =
new BufferedReader
(new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
System.out.println(line);
}
input.close();
}
catch (Exception err) {
err.printStackTrace();
}
}
}
The next example, launch CMD.EXE, grab stdin/stdout and push to stdin command to be interpreted by the shell.
    String line;
OutputStream stdin = null;
InputStream stderr = null;
InputStream stdout = null;

// launch EXE and grab stdin/stdout and stderr
Process process = Runtime.getRuntime ().exec ("/folder/exec.exe");
stdin = process.getOutputStream ();
stderr = process.getErrorStream ();
stdout = process.getInputStream ();

// "write" the parms into stdin
line = "param1" + "\n";
stdin.write(line.getBytes() );
stdin.flush();

line = "param2" + "\n";
stdin.write(line.getBytes() );
stdin.flush();

line = "param3" + "\n";
stdin.write(line.getBytes() );
stdin.flush();

stdin.close();

// clean up if any output in stdout
BufferedReader brCleanUp =
new BufferedReader (new InputStreamReader (stdout));
while ((line = brCleanUp.readLine ()) != null) {
//System.out.println ("[Stdout] " + line);
}
brCleanUp.close();

// clean up if any output in stderr
brCleanUp =
new BufferedReader (new InputStreamReader (stderr));
while ((line = brCleanUp.readLine ()) != null) {
//System.out.println ("[Stderr] " + line);
}
brCleanUp.close();

Launch a Windows CMD (or BAT) file and retrieve the errorlevel or exitcode

// win xp
import java.io.*;
public class CmdExec {
public static void main(String argv[]) {
try {
String line;
Process p = Runtime.getRuntime().exec("test.cmd");
p.waitFor();
System.out.println(p.exitValue());
}
catch (Exception err) {
err.printStackTrace();
}
}
}
test.cmd (set the errorlevel manually)
@echo hello world
@exit 42
test.cmd (set the errorlevel 1 (problem detected)
@java -garbage
test.cmd (set the errorlevel 0 (execution Ok)
@java -version

Launch a Unix script

String[] cmd = {"/bin/sh", "-c", "ls > hello"};
Runtime.getRuntime().exec(cmd);

Using the ProcessBuilder

Since 1.5, the ProcessBuilder class provides more controls overs the process to be started. It's possible to set a starting directory.

import java.io.*;
import java.util.*;

public class CmdProcessBuilder {
public static void main(String args[])
throws InterruptedException,IOException
{
List command = new ArrayList();
command.add(System.getenv("windir") +"\\system32\\"+"tree.com");
command.add("/A");

ProcessBuilder builder = new ProcessBuilder(command);
Map environ = builder.environment();
builder.directory(new File(System.getenv("temp")));

System.out.println("Directory : " + System.getenv("temp") );
final Process process = builder.start();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println("Program terminated!");
}
}

Windows rundll32 utility

Windows File association
Any program using the Windows file association mechanism can be started with the rundll32 utility.
// "file" is the filename of the data file
// ex. myresume.doc
// to start Word if the doc extension is associated with it.
Runtime.getRuntime().exec
("rundll32 SHELL32.DLL,ShellExec_RunDLL " + file.getAbsolutePath());

See also this HowTo about the new Desktop API, the recommended solution (but you need JDK1.6).
See also this one to open the default browser.

The following example start a Dial-up connection on the Win plateform :

[Dialup.java]
public class Dialup {
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime()
.exec("rundll32.exe rnaui.dll,RnaDial MyConnection");
p.waitFor();
System.out.println("Done.");
}
}
The "MyConnection" is the DUN and it's case sensitive.

You still need to press ENTER to CONNECT, there is an option in the Connection properties to connect automatically.

On NT and W2K, rnaui.dll is not available. Use rasdial.exe instead.

rasdial "connection name"
rasdial "connection name" /d to drop
rasdial /? for more options

PDF (Windows only)

public class ShowPDF {
public static void main(String[] args) throws Exception {
Process p =
Runtime.getRuntime()
.exec("rundll32 url.dll,FileProtocolHandler c:/pdf/mypdf.pdf");
p.waitFor();
System.out.println("Done.");
}
}

PDF (Mac only)

public class ShowPDF {
public static void main (String[] args) throws Exception{
Process p = Runtime.getRuntime().exec("open /Documents/mypdf.pdf");
}
}

More runddl32 examples


Path to executable with spaces in them

You can include a path for the program to be executed. On the Win plateform, you need to put the path in quotes if the path contains spaces.


public class Test {
public static void main(String[] args) throws Exception {
Process p = Runtime.getRuntime().exec(
"\"c:/program files/windows/notepad.exe\"");
p.waitFor();
}
}

If you need to pass arguments, it's safer to a String array especially if they contain spaces.

String[] cmd = { "myProgram.exe", "-o=This is an option" };
Runtime.getRuntime().exec(cmd);
If using the start command and the path of the file to be started contains a space then you must specified a title to the start command.
String fileName = "c:\\Applications\\My Documents\\test.doc";
String[] commands = {"cmd", "/c", "start", "\"DummyTitle\"",fileName};
Runtime.getRuntime().exec(commands);

VBSCRIPT

// Win9x
Runtime.getRuntime().exec("start myscript.vbs");

// WinNT
Runtime.getRuntime().exec("cmd /c start myscript.vbs");

or

// with a visible console
Runtime.getRuntime().exec("cscript myscript.vbs");

// with no visible console
Runtime.getRuntime().exec("wscript myscript.vbs");

HTML Help (Windows only)

Runtime.getRuntime().exec("hh.exe myhelpfile.chm");

Start Excel

import java.io.IOException;

class StartExcel {
public static void main(String args[])
throws IOException
{
Runtime.getRuntime().exec("cmd /c start excel.exe");
}
}
To load a worksheet
import java.io.IOException;

class StartExcel {
public static void main(String args[])
throws IOException
{
String fileName = "c:\\temp\\xls\\test2.xls";
String[] commands = {"cmd", "/c", "start", "\"DummyTitle\"",fileName};
Runtime.getRuntime().exec(commands);
}
}
It's important to pass a dummy title to the Windows start command where there is a possibility that the filename contains a space. It's a feature.

Start a Windows application under another account

You use the RUNAS command from the command line to start an application under another account (not available with XP Home edition). There are many switches that can enhance the behaviour of RUNAS. Typing "runas /?" from the command prompt gets you all the options.
  String  commands [] = new String [] {
"CMD.EXE",
"/C",
"RUNAS /profile /savecred /user:"
+ "administrator"
+ " " + "regedit.exe"
};

Runtime.getRuntime().exec(commands);
/SaveCred option allows you to save a password for that account and then reuse it later. For example, The command runas /savecred /user:administrator regedit.exe prompts for the password, and then Regedit runs. Next time you use the same command, there is no password prompt.

One potential problem is that when /SaveCred saves the credentials it saves it for whenever RUNAS invokes that user account. This can be a huge security risk so be careful using it!

RUNAS capability can be disabled by editing the Registry or by disabling the RUNAS or Secondary Logon Services. The appropriate registry key is HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer, create a new DWORD value named HideRunAsVerb and assign it a value of 1 to disable Run as.

RUNAS doesn't work when used from a Windows service.

Windows : execute something in Program Files

We want to execute the textpad editor located in C:\Program Files\TextPad 4 but without hard coding the path since it can be different for a localized version of Windows.

We simply extract to environnment variable called %programfiles% and build the complete path from there.

[JDK1.5]

public class Exec {
static String WIN_PROGRAMFILES = System.getenv("programfiles");
static String FILE_SEPARATOR = System.getProperty("file.separator");

public static void main(String[] args) throws Exception {
String[] commands =
{"cmd.exe",
"/c",
WIN_PROGRAMFILES
+ FILE_SEPARATOR
+ "textpad 4"
+ FILE_SEPARATOR + "textpad.exe"};
Runtime.getRuntime().exec(commands);
}
}
Unknown
A quick note about these two assertions, let's start with positive lookahead:



"Assert that the regex below can be matched, starting at this position".



Let's go with this little example:



Regex:

\s+\w+(?=\.)



This would mean, match a space between one and many times followed by a word character between one an many times only if there is a dot following the previous match:



Eg.

andy mypass ok orange..see what is going on



The matched text here would be orange (Because there was a dot after "orange", ah yes, and many spaces before).



Now, let's go with the other case, negative lookahead:

"Assert that it is impossible to match the regex below starting at this position".

The regex changes to

\s+\w+(?!\.)



Do you see the difference?. this should read now:



Match a space between one and many times followed by a word character between one and many times only if the following character is not a dot, so what is matched now using our previous example:





mypass (Because after "mypass" was a space)

ok (Same reason using the word "ok")

orang (Because after "orang" there is an e)

see (Because after "see" there is a space)

.... and so on
Unknown

Horizontal Scrolling Menu made with CSS and jQuery


There are a lot of cool flash scrolling menus out there, but I decided to make a similarly looking menu with just CSS and jQuery. I couldn’t achieve the same smoothness in animation, but anyway I’m really satisfied with the result. My menu works fine in all major browsers and degrades gracefully when Javascript is turned off.

In case you need a vertical version of a scrolling menu, please go to my newer tutorial.


Unknown
Ứng dụng và slide giới thiệu javafx cho thực tập nhận thưc








http://www.mediafire.com/?idzxddtr3ma
Unknown
Code Th_Java của tui bài 13 trở về sau edit lại của J
bài 6 thì mới đầu code như sau

public String[] tenSo_arr = { "Không", "Một", "Hai", "Ba", "Bốn", "Năm", "Sáu",
"Bảy", "Tám", "Chín" };
public String[] donVi_arr = { "", "Mười", "Trăm" };
public String[] donViKhong_arr = { "", "Lẻ", "" };
public String[] donViNgan_arr = { "", "Ngàn", "Triệu", "Tỷ"};
public String docSoSangChu(long so) {
StringBuffer strBuff = new StringBuffer();
int i = 0, j = 0, k = 0;
long tmp = so;
int prev=0;//so truoc so hien tai 1 so
boolean check=false; //kiem tra xem da doc so nao !0 chua
while (tmp != 0) {
i = (char) (tmp % 10);
if(i!=0) check=true;
if (j == 3) {// neu bang 3 tang he so don vi *1000
j = 0;
if(k==3)k=1;else k++;
strBuff.insert(0, " " + donViNgan_arr[k]);
}
// doc don vi
if (i != 0||(j==2&&check)) {
strBuff.insert(0, " " + donVi_arr[j]);
} else {
if(prev!=0)strBuff.insert(0, " " + donViKhong_arr[j]);//han che doc khi co 2 so ko lien tuc
}
// doc chu so
// neu bang ko thi ko doc hoac neu =1 vd 211 thi doc 2 tram muoi mot
// nen ko can doc
if ((i!=0||(j==2&&check))&& !(i == 1 && j == 1)) {
strBuff.insert(0," "+ tenSo_arr[i]);
}
tmp = tmp / 10;
j++;
prev=i;
}
return strBuff.toString();

}

cái này đọc số nhỏ cũng tốt nhưng số lớn hơi chuối nên chuyển qua code này

package Phan1;

public class bai6 {
// main
public int[] a;
public String[] tenSo_arr = { "Không", "Một", "Hai", "Ba", "Bốn", "Năm", "Sáu",
"Bảy", "Tám", "Chín" };
public String[] donViNgan_arr = { "", "Ngàn", "Triệu", "Tỷ"};

public static void main(String[] args) {
bai6 b = new bai6();
System.out.println(b.docSoSangChu("190000001"));
System.out.println(b.docSoSangChu("1900000000"));
System.out.println(b.docSoSangChu("90000"));
System.out.println(b.docSoSangChu("1001001"));
System.out.println(b.docSoSangChu("1000001"));
System.out.println(b.docSoSangChu("100"));
System.out.println(b.docSoSangChu("2111"));
System.out.println(b.docSoSangChu("551231"));
System.out.println(b.docSoSangChu("199999999999900"));

do {
try {
System.out.println(b.docSoSangChu(Libary.NhapString(" nhap so can doi")));
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

} while (Libary.IsContinue());

}

public String docSoSangChu(String str)throws NumberFormatException {
System.out.print(str+" :");
StringBuffer strBuff = new StringBuffer();
int currentValue = 0, k = 0,j=0;
Boolean check=false;//kiem tra xem da doc so nao khac ko chua
Boolean check2=false;//kiem tra xem da doc so nao khac ko trong bo 3 so chua
for (int i = str.length()-1; i>=0; i--,j++) {
currentValue=str.charAt(i)-48;
if(currentValue!=0) check=check2=true;
if(currentValue <0&¤tValue>9) throw new NumberFormatException(" Ko phai la so");
switch (j) {
case 2:
if(currentValue==0){
if(check2)
strBuff.insert(0, " "+ tenSo_arr[0]+" Trăm");
check2=false;
}
else strBuff.insert(0, " Trăm");
break;
case 1:
if(currentValue==0){
if(str.charAt(i+1)!=48) strBuff.insert(0, " lẻ");
}else if (currentValue==1){
strBuff.insert(0, " Mười");
continue;
}else {
strBuff.insert(0, " Mươi");
}
break;
case 3 :
if(k==3){
k=1;check=false;
}k++;
j=0;

if(currentValue!=0){
strBuff.insert(0, " "+ donViNgan_arr[k]);
}else {
if(check){
if( (i-2)>=0&&str.charAt(i-1)==48&& str.charAt(i-2)==48){
strBuff.insert(0, " "+ tenSo_arr[0]+" "+ donViNgan_arr[k]);
}else {
strBuff.insert(0, " "+ donViNgan_arr[k]);
}
}else {
if( (i-2)<0){
strBuff.insert(0, " "+ donViNgan_arr[k]);
}else if (str.charAt(i-1)!=48|| str.charAt(i-2)!=48){
strBuff.insert(0, " "+ donViNgan_arr[k]);
}
}
}
case 0:
if(currentValue==1 &&(i-1)>=0&&str.charAt(i-1)!=48&&str.charAt(i-1)!=49){
strBuff.insert(0, " Mốt");
continue;
}
break;
}
if(currentValue!=0) {

strBuff.insert(0," " +tenSo_arr[currentValue]);
}

}

return strBuff.toString();
}
}



Đọc rất chi là pro


190000001 : Một Trăm Chín Mươi Triệu Không Ngàn Không Trăm lẻ Một

1900000000 : Một Tỷ Chín Trăm Triệu

90000 : Chín Mươi Ngàn

1900 : Một Ngàn Chín Trăm

1000001 : Một Triệu Không Ngàn Không Trăm lẻ Một

100 : Một Trăm

2111 : Hai Ngàn Một Trăm Mười Một

551231 : Năm Trăm Năm Mươi Mốt Ngàn Hai Trăm Ba Mươi Mốt

199999999999900 : Một Trăm Chín Mươi Chín Triệu Chín Trăm Chín Mươi Chín Tỷ Chín Trăm Chín Mươi Chín Triệu Chín Trăm Chín Mươi Chín Ngàn Chín Trăm


Đây là code phần 1

bài 6 mình có sửa 1 tí các bạn lấy code thì update lại nhé
Code
Unknown

Các hàm cho Unicode chữ Việt

Dưới đây là Listing của một Sub và 13 hàm (Functions) dùng để xử lý Unicode chữ Việt. Ðể hiểu thêm về Unicode và nhất là cách hoán chuyển giữa UTF-16 và UTF-8 xin đọc bài Căn bản Unicode cho VB6 Programers.
http://www.vovisoft.com/unicode/UniFunctions.htm
Unknown
Dynamic Class

private var forCompiler:Person;

private function cc():void

{

var obj:Object = createInstance("Person", ["bob", 30]);<br>
}

public function createInstance(className:String, args:Array):Object<br>
{<br>

var myClass:Class = getDefinitionByName(className) as Class;
var instance:Object = new myClass();
instance.initArgs.apply(null, args);
return instance;
}

/*********************************************************************

//In person.initArgs()....

//Note: the constructor also accepts name & age, assigning them default values

//if not specified.

public function initArgs(name:String, age:uint):void

{

this.name = name;

this.age = age;

}

***
function listProperties(obj:Object, accessType:String="readwrite", excludeCommonWith:Class=null, matchesRE:RegExp=null, declaredOnlyByObjClass:Boolean=true):Array
{
var a:XMLList;
var b:Array=[];
var c:*;
var n:int;
var doc:XML;
var cname:String;
matchesRE=matchesRE || new RegExp(".+");
accessType=accessType || "readwrite";
accessType=accessType.toLowerCase();
if (!RegExp(/readwrite|readonly/i).test(accessType)) {
accessType == "readwrite";
}
doc=flash.utils.describeType(obj);
cname=doc.@name;
if (declaredOnlyByObjClass) {
a=doc.accessor.(@access == accessType && @declaredBy == cname && matchesRE["test"](@name));
} else {
a=doc.accessor.(@access == accessType && matchesRE["test"](@name));
}
if (excludeCommonWith != null) {
c=new excludeCommonWith();
}
n=0;
while (n < a.length())
{
if (c != null) {
if (Object(c).hasOwnProperty(a[n].@name) == false) {
b.push(a[n].@name);
}
} else {
b.push(a[n].@name);
}
n++;
}
return b;
}



http://keith-hair.net/blog/2009/12/08/listing-class-properties-dynamically-in-as3/#more-119
Nhãn: 0 nhận xét | | edit post
Unknown
Regular Expression trong .Net

1. Giới thiệu:

RE là một ngôn ngữ cực mạnh dùng mô tả văn bản cũng như thao tác trên văn bản. Một RE thường được ứng dụng lên một chuỗi, nghĩa là lên một nhóm ký tự.

Chẳng hạn, ta có chuỗi sau:

Mot, Hai, Ba, Bon, NEVERLAND.

Bạn có thể trả về bất cứ hoặc tất cả các chuỗi con của nó (Hai hoặc Bon chẳng hạn) hoặc thay đổi phiên bản của những chuỗi con của nó (Mot hoặc BoN chẳng hạn).

Một RE là một kiểu mẫu văn bản gồm 2 phần: literal (trực kiện) và metacharacters (ký tự siêu).

  • Một literal đơn thuần chỉ là một ký tự (a-z) mà bạn muốn đem so khớp với chuỗi đích.

  • Metacharacters là một ký tự đặc biệt hoạt động như là 1 mệnh lệnh đối với bộ phận phân tích ngữ nghĩa (parser) của RE



Bây giờ chúng ta thử tạo một regular expression như sau:


  1. ^(From|To|Subject|Date):





RE này sẽ khớp với bất cứ chuỗi con nào miễn là chuỗi này là một hàng mới bắt đầu với “From” hoặc “To” hoặc các chữ “Subject” hoặc “Date” (Dấu ^ nghĩa là bắt đầu 1 hàng mới) chuỗi này kết thúc bởi dấu hai chấm (:).



Dấu ^ cho bộ parser của RE biết chuỗi mà ban đang truy tìm phải bắt đầu bởi một hàng mới. Các chữ “From”, “To”,.. là những literal, và những metacharacter “(“, “)”, và “|” được dùng để tạo nhóm literal và cho biết bất cứ những lựa chọn nào cũng phải khớp. Dấu ^ cũng là metacharacter, nó cho biết là khởi đầu 1 hàng. Do đó, bạn đọc hàng sau đây:



^(From|To|Subject|Date):



Như sau: “cho khớp bất cứ chuỗi con nào bắt đầu bởi một hàng mới theo sau bởi bất cứ 4 chuỗi literal: From,To,Subject và Date rồi theo sau bởi dấu hai chấm




2. Các ký tự siêu thường dùng (vô cùng quan trọng cần phải nắm)



. : đại diện cho 1 ký tự bất kỳ trừ ký tự xuống dòng \n.

\d : ký tự chữ số tương đương [0-9]

\D : ký tự ko phải chữ số

\s : ký tự khoảng trắng tương đương [ \f\n\r\t\v]


\S : ký tự không phải khoảng trắng tương đương [ ^\f\n\r\t\v]

\w : ký tự word (gồm chữ cái và chữ số, dấu gạch dưới _ ) tương đương [a-zA-Z_0-9]

\W : ký tự không phải ký tự word tương đương [^a-zA-Z_0-9]

^ : bắt đầu 1 chuỗi hay 1 dòng

$ : kết thúc 1 chuỗi hay 1 dòng


\A : bắt đầu 1 chuỗi

\z : kết thúc 1 chuỗi

| : ký tự ngăn cách so trùng tương đương với phép or (lưu ý cái này nếu muốn kết hợp nhiều điều kiện)

[abc] : khớp với 1 ký tự nằm trong nhóm là a hay b hay c.

[a-z] so trùng với 1 ký tự nằm trong phạm vi a-z, dùng dấu - làm dấu ngăn cách.


[^abc] sẽ không so trùng với 1 ký tự nằm trong nhóm, ví dụ không so trùng với a hay b hay c.

() : Xác định 1 group (biểu thức con) xem như nó là một yếu tố đơn lẻ trong pattern .ví dụ ((a(b))c) sẽ khớp với b, ab, abc.

? : khớp với đứng trước từ 0 hay 1 lần. Ví dụ A?B sẽ khớp với B hay AB.

* : khớp với đứng trước từ 0 lần trở lên . A*B khớp với B, AB, AAB

+ : khớp với đứng trước từ 1 lần trở lên. A+B khớp với AB, AAB.


{n} : n là con số, Khớp đúng với n ký tự đúng trước nó . Ví dụ A{2}) khớp đúng với 2 chữ A.

{n, } : khớp đúng với n ký tự trở lên đứng trước nó , A{2,} khớp vói AA, AAA ...

{m,n} : khớp đùng với từ m->n ký tự đứng trước nó, A{2,4} khớp vói AA,AAA,AAAA

3. Các lớp để thao tác với Regular Expression trong .NET:



.NET cung cấp một cách tiếp cận hướng đối tượng về việc so khớp chuỗi và thay thế theo RE. System.Text.RegularExpression là namespace trên thư viện các lớp chuẩn của .NET liên quan đến tất cả các đối tượng gắn liền với RE. Sau đây mình xin giới thiệu sơ lược về các lớp này:




1.Regex:

Lớp Regex tượng trưng cho 1 regular expression bất di bất dịch (read-only). Nó cũng chứa một phương thức tĩnh (static) cho phép chúng ta sử dụng những lớp rex khác mà khỏi khởi tạo 1 đối tượng khác. Ví dụ:





  1. string pattern = @"\s2000";

  2. Regex myRegex = new Regex(pattern);








Sau đây, mình sẽ kể ra vài thành phần của lớp Regex này:

-Thuộc tính:

+Options: trả về những mục chọn được trao qua cho constructor Regex.

+RightToLeft: nhận 1 trị cho biết liệu xem regular expression dò tìm từ phải qua trái hay không

-Phương thức:

+GetGroupNames: trả về mảng gồm toàn tên nhóm thu lượm đối với RE.


+GetGroupNumbers: trả về mảng gồm toàn số nhóm thu lượm tương ứng với tên nhóm trên 1 mảng.

+GroupNameFromNumber: đi lấy tên nhóm tương ứng với số nhóm được khai báo.

+IsMatch: trả về trị bool cho biết liệu xem RE có tìm thấy một so khớp hay không trên pattern.

+Match: dò tìm trên pattern xem có xuất hiện một RE hay không rồi trả về kết quả chính xác như là một đối tượng Match duy nhất.

+Matches: dò tìm trên pattern xem tất cả các xuất hiện của một RE có hay không rồi trả về tất cả những so khớp thành công xem như Match được gọi nhiều lần.

+Replace: cho thay thế những xuất hiện của một pattern được định nghĩa bởi một RE bởi một chuỗi ký tự thay thế được chỉ định.

+Split: chẻ một pattern thành một mảng gồm những chuỗi con ở những vị trí được chỉ định bởi một so khớp trên RE

+Unescape: cho unescape bất cứ những ký tự nào được escape trên pattern.




Sau đây là ví dụ sử dụng lớp Regex để tách chuỗi qua việc dùng phương thức Split của nó:





  1. string chuoi = "Mot, Hai, Ba, Bon, NEVERLAND.";

  2. //tạo pattern


  3. //luật: xem chuỗi nào có chứa khoảng trắng hay dấu phẩy

  4. string pattern = " |, ";


  5. Regex myRegex = new Regex(pattern);


  6. string[] sKetQua = myRegex.Split(chuoi);


  7. foreach (string subString in sKetQua)


  8. {

  9. Console.WriteLine(subString);


  10. }












Và đây là kết quả của nó:





  1. Mot

  2. Hai

  3. Ba

  4. Bon


  5. NEVERLAND.







Như bạn thấy , phương thức khởi tạo của class Regex sẽ nhận 1 chuỗi pattern làm đối số.

Phương thức Regex.Split() hoạt động cũng giống như String.Split(), trả về 1 mảng chuỗi như là kết quả việc so khớp pattern của RE trong lòng myRegex.




2.Lớp Match:



Lớp này tượng trưng cho những kết quả duy nhất của một tác vụ so khớp (match) RE. Sau đây mình có 1 ví dụ nhỏ sử dụng phương thức Match của lớp Regex để trả về 1 đối tượng kiểu Match để có thể tìm ra so khớp đầu tiên trên chuỗi nhập.

Sử dụng thuộc tính Match.Access của lớp Match báo cho biết liệu xem đã tìm ra 1 so khớp hay chưa.





  1. string chuoi = "123abcd456bdabc";


  2. string pattern = "abc";

  3. Regex myRegex = new Regex(pattern);


  4. Match m = myRegex.Match(chuoi);

  5. if (m.Success)


  6. {

  7. Console.WriteLine("Tim thay chuoi con {0} o vi tri thu {1} trong chuoi", m.Value, m.Index);


  8. }

  9. else


  10. Console.WriteLine("Khong tim thay chi ca");










Kết quả như sau:





  1. Tim thay chuoi con abc o vi tri thu 3 trong chuoi







3.Lớp MatchCollection



Lớp này tượng trưng cho 1 loạt những so khớp thành công đè chồng lên nhau tạo thành một tập hợp bất di bất dịch và lớp này không có phương thức khởi tạo. Nhũng đối tượng MatchCollection sẽ do thuộc tính Regex.Matches của lớp Regex trả về.

Hiểu nôm na MatchCollection là mảng các đối tượng Match là được.

Ví dụ:







  1. static void Main(string[] args)


  2. {

  3. //tập hợp chứa những so khớp

  4. MatchCollection mc;


  5. //1 chuỗi thử nghiệm

  6. string chuoi = "I like money, like woman and like C#";


  7. //tạo pattern

  8. string pattern = "like";


  9. //khởi tạo 1 đối tượng của Regex

  10. //truyền chuỗi pattern vào constructor


  11. Regex myRegex = new Regex(pattern);

  12. //dùng phương thức Matches của myRegex


  13. //để tìm ra matches và chỉ mục của từng match

  14. mc = myRegex.Matches(chuoi);


  15. foreach (Match m in mc)

  16. {


  17. Console.WriteLine("Chuoi con '{0}' xuat hien o chi muc {1}", m.Value, m.Index);


  18. }

  19. }








Ta có kết quả sau:






  1. Chuoi con 'like' xuat hien o chi muc 2


  2. Chuoi con 'like' xuat hien o chi muc 14

  3. Chuoi con 'like' xuat hien o chi muc 29






Sử dụng Regex Match Collections:



Hai thuộc tính của đối tượng Match là chiều dài và vị trí của nó, mà ta có thể đọc như ví dụ sau:






  1. static void Main(string[] args)


  2. {

  3. //tập hợp chứa những so khớp

  4. MatchCollection mc;


  5. //1 chuỗi thử nghiệm

  6. string chuoi = "This is a example string.";


  7. //tạo pattern

  8. //luật:cho tìm ra bất cứ những ký tự không phải ký tự khoảng trắng


  9. //rồi theo sau nó là kí tự khoảng trắng

  10. string pattern = @"\S+\s";


  11. //khởi tạo 1 đối tượng của Regex

  12. //truyền chuỗi pattern vào constructor


  13. Regex myRegex = new Regex(pattern);

  14. //dùng phương thức Matches của myRegex


  15. //để tìm ra matches và chỉ mục của từng match

  16. mc = myRegex.Matches(chuoi);


  17. for (int i = 0; i < mc.Count; i++)


  18. {

  19. Console.WriteLine("The match[{0}]: '{1}' co chieu dai la {2}", i,mc[i].Value, mc[i].Length);


  20. }














Chuỗi \S đi tìm những ký tự không phải khoảng trắng, và dấu + cho biết một hoặc nhiều ký tự ở đằng sau. Còn \s (s thường nhá) cho biết là khoảng trắng. Do đó, gộp lại ta có mệnh đề “hãy đi tìm bất cứ ký tự non-whitespace theo sau bởi whitespace”.



Kết quả của ví dụ trên là:






  1. The match[0]: 'This ' co chieu dai la 5


  2. The match[1]: 'is ' co chieu dai la 3

  3. The match[2]: 'a ' co chieu dai la 2


  4. The match[3]: 'example ' co chieu dai la 8












Lý do từ chót “string.” không được tìm thấy là vì nó có kết thúc là dấu chấm (không phải khoảng trắng).


4.Lớp Group

Đôi khi người ta cho là rất tiện khi cho gộp lại những biểu thức con so khớp với nhau như vậy bạn có thể phân tích ngữ nghĩa những đoạn của chuỗi khớp.

Ví dụ, có thể bạn muốn so khớp dựa trên địa chỉ IP và cho gộp lại tất cả các IP tìm thấy được bất cứ nơi nào trên đoạn chuỗi.

Lớp Group cho phép bạn tạo những nhóm so khớp dựa trên cú pháp RE, và tượng trưng cho kết quả từ 1 biểu thức gộp nhóm duy nhất.

Một biểu thức gộp nhóm đặt tên cho một nhóm v2 cung cấp 1 RE; bất cứ chuỗi con nào khớp với RE sẽ được đưa vào nhóm. Ví dụ, muốn tạo 1 nhóm IP, bạn có thể viết một RE cho biết một hoặc nhiều digit hay dot theo sau bởi space như sau:






  1. @”(?<ip>(\d|\.)+)\s”










Lớp Match được dẫn xuất từ Group, và có một tập hợp mang tên Groups chứa tất cả các nhóm mà Match tìm thấy.

Lớp Group tượng trưng cho những kết quả thu hoạch được từ 1 thu lượm nhóm duy nhất. Ví Group có thể thu lượm 0, 1 hoặc nhiều chuỗi chữ trong một lần so khớp duy nhất, nó chứa một tập hợp gồm những đối tượng của Capture. Vì Group kế thừa từ Capture, substring bị thu lượm có thể được truy xuất trực tiếp.



Các thể hiện của Group sẽ được trả về bởi thuộc tính Match.Groups(số group) hoặc Match.Groups(“tên group”) nếu cấu trúc gộp nhóm “(?<groupname>)” được dùng đến.



Ví dụ sau đây sử dụng kiến trúc gộp nhóm lồng nhau để thu lượm những chuỗi con gộp thành nhóm:






  1. static void Main(string[] args)


  2. {

  3. string pattern = "(a(b))c";


  4. string chuoi = "abdabc";

  5. //định nghĩa những substring abc,ab,b


  6. Regex myRegex = new Regex(pattern);

  7. Match m = myRegex.Match(chuoi);




  8. for (int i = 0; m.Groups[i].Value != ""; i++)


  9. {

  10. Console.WriteLine("{0} co chieu dai {1}", m.Groups[i].Value, m.Groups[i].Length);


  11. }

  12. }












Kết quả:





  1. abc co chieu dai 3

  2. ab co chieu dai 2


  3. b co chieu dai 1











Đoạn mã sau đây sử dụng kiến trúc gộp nhóm có mang tên (name và value) để thu lượm những substrings từ một chuỗi chứa dữ liệu trên 1 dạng thức “DATANAME:VALUE” mà RE bị chẻ ở dâu dấu hai chấm (:)






  1. static void Main(string[] args)

  2. {


  3. string pattern = @"^(?<name>\w+):(?<value>\w+)";


  4. Regex myRegex = new Regex(pattern);

  5. Match m = myRegex.Match("Section:119900");


  6. for (int i = 0; m.Groups[i].Value != ""; i++)


  7. {

  8. Console.WriteLine("{0} co chieu dai {1}", m.Groups[i].Value, m.Groups[i].Length);


  9. }

  10. }






Kết quả:





  1. Section:119900 co chieu dai 14

  2. Section co chieu dai 7


  3. 119900 co chieu dai 6







RE sẻ trả về kết xuất sau đây:








  1. m.Groups[“name”].Value = “Section1”

  2. m.Groups[“value”].Value = “119900










Sử dụng cụ thể lớp Group:





  1. static void Main(string[] args)


  2. {

  3. //một chuỗi ví dụ

  4. string chuoi = "04:03:27 127.0.0.0 caulacbovb.com";


  5. //group time = một hoặc nhiều digit hoặc dấu hai chấm

  6. //theo sau bởi khoảng trắng


  7. string timePattern = @"(?<time>(\d|\:)+)\s";

  8. string ipPattren = @"(?<ip>(\d|\.)+)\s";


  9. string sitePattern = @"(?<site>\S+)";

  10. string pattern = timePattern + ipPattren + sitePattern;


  11. Regex myRegex = new Regex(pattern);

  12. //đi lấy tập hợp những so khớp


  13. MatchCollection matches = myRegex.Matches(chuoi);



  14. foreach (Match match in matches)


  15. {

  16. if (match.Length != 0)


  17. {

  18. Console.WriteLine("\nMatch: {0}", match.ToString());


  19. Console.WriteLine("\nTime: {0}", match.Groups["time"]);


  20. Console.WriteLine("\nIP: {0}", match.Groups["ip"]);


  21. Console.WriteLine("\nSite: {0}", match.Groups["site"]);


  22. }

  23. }


  24. }









Kết quả:






  1. Match: 04:03:27 127.0.0.0 caulacbovb.com


  2. Time: 04:03:27

  3. IP: 127.0.0.0

  4. Site: caulacbovb.com












Theo ví dụ trên, đầu tiên ta tạo một chuỗi để tiến hành dò khớp:





  1. string chuoi = "04:03:27 127.0.0.0 caulacbovb.com";










Chuỗi này có thể là 1 trong nhiều chuỗi được ghi nhận trên một tập tin log của web server như là kết quả dò tìm của CSDL. Trong ví dụ đơn giản này có 3 cột: time – IP – Site, mỗi cột cách nhau bởi một khoảng trắng.



Bạn muốn tạo một đối tượng Regex duy nhất để dò tìm những chuỗi kiểu này, và chặt chúng thành 3 nhóm: time,ip và site :





  1. string timePattern = @"(?<time>(\d|\:)+)\s";


  2. string ipPattren = @"(?<ip>(\d|\.)+)\s";

  3. string sitePattern = @"(?<site>\S+)";


  4. string pattern = timePattern + ipPattren + sitePattern;

  5. Regex myRegex = new Regex(pattern);












Ta tập trung xem các ký tự hình thành nhóm:

Các dấu ngoặc () sẽ tạo nên một nhóm. Những gì nằm giữa dấu ngoặc mở (ngay trước dấu ?) và dấu ngoặc đóng (sau dấu + trong trường hợp này) là 1 nhóm đơn độc chưa mang tên.





  1. @"(?<time>(\d|\:)+)\s"













  • Chuỗi ?<time> đặt tên nhóm là time và nhóm gắn liền với đoạn văn bản so khớp, là regular expression “(\d|\:)+)\s”. RE này ược suy diễn như sau: “một hoặc nhiều digit hoặc dấu hai chấm theo sau bởi khoảng trắng”.

  • Chuỗi ?<ip> đặt tên cho nhóm ip, và ?<site> đặt tên cho nhóm site.





Như các ví dụ trước, ví dụ trên cũng đòi hỏi một tập hợp của tát cả các đoạn khớp:





  1. MatchCollection matches = myRegex.Matches(chuoi);










Tiếp theo, cho đi xuyên qua tập hợp matches để lôi ra từng phần tử match của nó:





  1. foreach (Match match in matches)










Nếu chiều dài Length của match lớn hơn 0 có nghĩa là đã tìm thấy một so khớp. Sau đó, thì cho in ra toàn bộ những mục so khớp:





  1. Console.WriteLine("\nMatch: {0}", match.ToString());










Tiếp theo, là đi lấy nhóm time từ tập hợp Groups của match rồi cho in ra nội dung:





  1. Console.WriteLine("\nTime: {0}", match.Groups["time"]);










Kết quả





  1. Time: 04:03:27










Tương tự như thế với các nhóm site và ip ta có kết quả





  1. IP: 127.0.0.0


  2. Site: caulacbovb.com






5.Lớp GroupCollection:



Là lớp tượng trưng cho 1 tập hợp gồm toàn những nhóm được thu lượm và trả về một lô những nhóm được thu lượm trong một lần so khớp duy nhất. Collection này thuộc loại read-only và không có phương thức khởi tạo. Các thể hiện của lớp GroupCollection được trả về trong tập hợp mà thuộc tính Match.Groups trả về.

Ví dụ: dò tìm và in ra số những nhóm được thu lượm bởi một RE. Làm thế nào để trích từng thu lượm riêng rẽ trên mỗi thành viên của môt group collection.






  1. using System;

  2. using System.Collections.Generic;


  3. using System.Text;

  4. using System.Text.RegularExpressions;




  5. namespace ConsoleApplication1

  6. {

  7. class Program


  8. {

  9. static void Main(string[] args)


  10. {

  11. Regex myRegex = new Regex("(a(b))c");


  12. Match m = myRegex.Match("abdabc");

  13. Console.WriteLine("So nhom duoc tim thay la: {0}",m.Groups.Count);


  14. }

  15. }

  16. }








Kết quả:





  1. 1. So nhom duoc tim thay la 3












6.Lớp Cature:



Lớp này chứa những kết quả từ một thu lượm duy nhất dựa trên một expression-con (sub-expression)



7.Lớp CatureCollection:




Mỗi lần một đối tượng Regex khớp với một subexpression, một thể hiện Capture sẽ được tạo ra, và được thêm vào tập hợp CaptureCollection. Mỗi đối tượng Capture tượng trưng cho một thu lượm (capture) đơn lẻ. Mỗi nhóm sẽ có riêng cho mình một capture collection những mục khớp với subexpression được gắn liền với nhóm.

Lớp CaptureCollection tượng trưng cho một loạt những chuỗi con được thu lượm và trả về một lô những thu lượm được thực hiện chỉ qua một nhóm thu lượm duy nhất. Thuộc tính Captures, một đối tượng của lớp CaptureCollection, được cung cấp như là một thành viên của các lớp Match và Group giúp truy xuất dễ dàng lô các chuỗi con được thu lượm.

Ví dụ: nếu bạn sử dụng regular expression ((a(b)c)+ (dấu + cho biết là một hoặc nhiều chuỗi so khớp) để thu lượm những so khớp từ chuỗi chữ “abcabcabc”. CaptureCollection đối với mỗi matching Group của những substring sẽ chứa 3 thành viên.

Ví dụ sau đây mình dùng đến regular expression (Abc)+ để tìm ra một hoặc nhiều so khớp trên chuỗi “XYZAbcAbcAbcXYZAbcAb”. Ví dụ minh họa việc sử dụng thuộc tính Captures để trả về nhiều nhóm các chuỗi con bị thu lượm:





  1. using System;


  2. using System.Collections.Generic;

  3. using System.Text;


  4. using System.Text.RegularExpressions;



  5. namespace ConsoleApplication1


  6. {

  7. class Program

  8. {

  9. static void Main(string[] args)


  10. {

  11. string chuoi = "XYZAbcAbcAbcXYZAbcAb";


  12. string pattern = "(Abc)+";

  13. Regex myRegex = new Regex(pattern);


  14. Match m = myRegex.Match(chuoi);



  15. GroupCollection gc = m.Groups;


  16. CaptureCollection cc;

  17. Console.WriteLine("So nhom thu luom duoc = {0}",gc.Count.ToString());


  18. Console.WriteLine();

  19. for(int i=0;i<gc.Count;i++)


  20. {

  21. cc = gc[i].Captures;


  22. Console.WriteLine("So capture = " + cc.Count.ToString());


  23. for(int j=0;j< cc.Count;j++)


  24. {

  25. Console.WriteLine(cc[j] + " bat dau tu ky tu " + cc[j].Index);


  26. }

  27. Console.WriteLine();


  28. }

  29. }

  30. }


  31. }





Kêt quả





  1. So nhom thu luom duoc = 2




  2. So capture = 1

  3. AbcAbcAbc bat dau tu ky tu 3



  4. So capture = 3

  5. Abc bat dau tu ky tu 3


  6. Abc bat dau tu ky tu 6

  7. Abc bat dau tu ky tu 9











Sử dụng lớp CaptureCollection:




Thuộc tính chủ chốt của đối tượng Capture là Length, cho biết chiều dài của chuỗi con bị thu lượm. Khi bạn yêu cầu Match cho biết chiều dài, thì chính Capture.Length bạn tìm thấy, vì Match được thừa kế từ Group, và Group lại được dẫn xuất từ Capture.

Điển hình, bạn sẽ chỉ tìm thấy một Capture đơn độc trong mộg CaptureCollection; nhưng điều này không buộc phải như thế. Điều gì sẽ xảy ra nếu bạn phân tích ngữ nghĩa một chuỗi trong ấy tên công ty có thể xuất hiện hoặc ở hai nơi. Muốn gộp các tên này vào chung thành một match đơn lẻ, bạn tạo nhóm ?<company> ở 2 nơi trong pattern của regular expression.





  1. using System;


  2. using System.Collections.Generic;

  3. using System.Text;


  4. using System.Text.RegularExpressions;



  5. namespace ConsoleApplication1


  6. {

  7. class Program

  8. {

  9. static void Main(string[] args)


  10. {

  11. string chuoi = "05:04:27 NEVERLAND 192.168.10.1 TNHH";


  12. string pattern = @"(?<time>(\d|\:)+)\s" +

  13. @"(?<company>\S+)\s" +


  14. @"(?<ip>(\d|\.)+)\s" +


  15. @"(?<company>\S+)";


  16. Regex myRegex = new Regex(pattern);

  17. MatchCollection mc = myRegex.Matches(chuoi);




  18. foreach(Match match in mc)


  19. {

  20. if (match.Length!=0)


  21. {

  22. Console.WriteLine("Match: {0}",match.ToString());


  23. Console.WriteLine("Time: {0}",match.Groups["time"]);


  24. Console.WriteLine("IP: {0}",match.Groups["ip"]);


  25. Console.WriteLine("Company: {0}",match.Groups["company"]);


  26. Console.WriteLine();


  27. foreach(Capture cap in match.Groups["company"].Captures)


  28. {

  29. Console.WriteLine("cap: {0}",cap.ToString());


  30. }

  31. }


  32. }

  33. }

  34. }


  35. }





Đoạn mã sau cho rảo qua tập hợp Capture đối với nhóm company:




  1. foreach(Capture cap in match.Groups["company"].Captures)










Compiler bắt đầu bằng cách tìm ra tập hợp mà ta rảo qua trên ấy. match là một đối tượng có một tập hợp mang tên Groups. Tập hợp Groups có bộ chỉ mục (indexer) cho phép trích một chuỗi và trả về một đối tượng Group đơn lẻ. Do đó, lệnh sau đây trả về một đối tượng Group đơn lẻ:





  1. match.Groups["company"].Captures










Đến phiên, vòng lặp foreach rảo qua tập hợp Captures, trích mỗi phần tử trong tập hợp và gán cho biến toàn cục cap, thuộc kiểu dữ liệu Capture. Bạn có thể là trên kết xuất có 2 phần tử capture: NEVERLAND và TNHH. Phần tử thứ hai đè chồng lên phần tử đầu trên nhóm, do đó chỉ in ra TNHH, nhưng khi quan sát tập hợp Captures thì bạn thấy có 2 trị bị thu lượm.



Kết quả của ví dụ trên:





  1. Match: 05:04:27 NEVERLAND 192.168.10.1 TNHH


  2. Time: 05:04:27

  3. IP: 192.168.10.1

  4. Company: TNHH




  5. cap: NEVERLAND

  6. cap: TNHH