banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Messages posted by: explorer88  XML
Profile for explorer88 Messages posted by explorer88 [ number of posts not being displayed on this page: 0 ]
 
Dạ hôm nay tìm hiểu em cũng đã tự trả lời được rồi ạ. Nhân đây, em cũng trình bày luôn, biết đâu có bạn nào cũng giống em thì cũng giúp các bạn ý đỡ mất công

Câu 1: Lý do NAT ảnh hưởng đến P2P và các hệ thống VoIP vì trong môi trường P2P các host sau NAT sẽ phải gửi địa chỉ cho nhau để hai bên có thể talk trực tiếp. Vì các process sau NAT không hiểu và không biết gì về NAT nên theo lệ thường nó sẽ gửi địa chỉ và port trong internal network chứ không phải địa chỉ (đây là địa chỉ public) và port mà NAT sẽ gán cho nó. Do đó peer còn lại sẽ không thể giao tiếp khi sử dụng các thông tin này.

Trong môi trường client server thông thường thì NAT làm việc rất ổn vì server luôn có địa chỉ cố định và well know port cũng cố định nốt, connection lại luôn được init từ client nên sau khi đã connection đã hình thành server cứ theo cái socket đó mà talk với client thôi. Một số loại NAT như: address restricted NAT, port restricted NAT và symmetric NAT sẽ chỉ cho phép external host send packet đến địa chỉ NAT nếu như trước đó đã có packet send đi từ địa chỉ NAT này. Ngay cả rule này, trong môi trường client và server, nó cũng không bị vi phạm vì client luôn là đối tượng thực hiện active open.

Câu 2: Port forwarding là giải pháp NAT traversal, one-to-one, static NAT, còn gọi là reverse NAT (khó diễn tả nhưng xem cách nó thực hiện thì gọi thế cũng không sai)
địa chỉ x.x.x.x, port x trong internal network sẽ được map đến địa chỉ public y.y.y.y port y (y có thể giống hoặc khác x)
Và port forwarding hoàn toàn có thể thực hiện NAT cho nhiều dịch vụ chạy trên các host khác nhau sử dụng cùng một port.

Câu 3: Em đọc ở tài liệu khác chi tiết hơn thì biết symmetric NAT làm việc tương tự port restricted NAT nhưng khác biệt lớn nhất của nó là nó không thực hiện port preservation (ở cả ba loại NAT: full cone, address restricted, porn restricted thì NAT device luôn giữ nguyên port mà không thực hiện ánh xạ ra port mới). Symmetric NAT sẽ NAT cả port đối với mỗi connection đến một destination khác nhau (hoặc khác về dest addr hoặc khác về dest port hoặc khác cả hai) x.x.x.x port x ánh xạ ra x1.x1.x1.x1 port x1 với x1 sẽ khác x

Chính vì lý do này symmetric NAT rất khó vượt qua. Một số giải pháp vượt NAT: Stun, hole punching...
Stun là giải pháp sử dụng một server nói chuyện với peer trước khi peer này thông báo thông tin kết nối cho peer khác. Stun sẽ thông báo cho peer biết địa chỉ public của nó và port của nó. Trong trường hợp NAT là kiểu symmetric thì port mà Stun biết không thể dùng cho kết nối mới giữa hai peer. Còn hole punching thì em mới nghe cuộc thảo luận trên hva là giải pháp này cũng không vượt qua được symmetric NAT.

Nguồn tham khảo
[1] http://think-like-a-computer.com/2011/09/16/types-of-nat/
[2] http://think-like-a-computer.com/2011/09/19/symmetric-nat/
Em được biết file descriptor trong linux là các file đại diện cho stdin, stdout và stderr của một process. Bất cứ process nào muốn thực hiện đọc ghi file đều phải cần các file descriptor.

Em viết một script đơn giản rồi chạy nó đến bước đợi nhập từ bàn phím thì em xem PID của chương trình rồi tìm trong /proc/PID/fd thì em thấy các file 0,1,2,255. Em đã cố thử thay vì input data qua bàn phím thì ghi thẳng data đó vào file desciptor 0 nhưng vô hiệu. Em cũng xem khi input data từ bàn phím thì có gì trong file desciptor 0 nhưng khi cat nó thì không thấy gì cả.

Mọi người có thể giải thích cho em hoặc cho em tài liệu giải thích về cách một process sử dụng file descriptor để đọc ghi data không ạ ?
Em có ba câu hỏi về NAT, mong mọi người giải đáp

Câu 1: Em không hiểu tại sao NAT lại ảnh hưởng đến các hệ thống P2P và VoIP ạ ?
Em nghĩ hai peer trong môi trường đó cứ tiếp tục nói chuyện với nhau qua public IP của NAT device thôi chứ nhỉ. Mọi người có thể cho em một ví dụ NAT ngăn cản truyền thông giữa hai peer không ạ.

Câu 2: Port forwarding cũng là một giải pháp NAT traversal nhưng nếu trường hợp đằng sau thiết bị NAT có nhiều hơn một host cung ứng dịch vụ nhưng sử dụng port giống nhau (ví dụ có hai host khác nhau cung cấp httpd 80 chả hạn) thì có cách nào port forwarding thực hiện được không ạ ?

Câu 3: Em đọc trên wiki về các loại NAT. Em không rõ symmetric NAT khác gì với các loại NAT còn lại. Trong đó, có một phát biểu là: "Each request from the same internal IP address and port to a specific destination IP address and port is mapped to a unique external source IP address and port, if the same internal host sends a packet even with the same source address and port but to a different destination, a different mapping is used." Thế chả lẽ các loại NAT khác không dùng một external source IP và port riêng cho mỗi connect đến một destination ạ ?

Em cám ơn ạ.

conmale wrote:


- nếu IP xxx.xxx.xxx.xxx này bất thình lình liên hệ IP yyy.yyy.yyy.yyy ở cổng 80 nhưng lại không hề có quy trình 3 bước bắt tay --> hoàn toàn không nằm trong một "state" nào cả --> bị hủy.

- nếu IP xxx.xxx.xxx.xxx này đã thiết lập 3 bước bắt tay bình thường và đã được hình thành "state table" nhưng bất chợt lại có destination port là 81 --> hoàn toàn không nằm trong một "state" nào cả --> bị hủy.

 


Anh cho em hỏi là làm thế nào để thiết lập kịch bản để IP xxx.xxx.xxx.xxx có thể liên hệ với IP yyy.yyy.yyy.yyy tại một cổng nào đó mà không cần thông qua bắt tay ba bước ạ ?

Và nếu hai bên xxx.xxx.xxx.xxx và yyy.yyy.yyy.yyy đã bắt tay ba bước rồi làm cách nào để dựng kịch bản xxx.xxx.xxx.xxx liên hệ bất chợt với yyy.yyy.yyy.yyy trên một port khác ạ ?

Cám ơn anh.
Chắc là đồ chùa rồi anh ơi. Đồ xịn thì bạn đấy đã được chăm sóc đầy đủ rồi, lên đây smilie( làm gì smilie

Đồ chùa thì tam sao thất bản, có phải lúc nào cũng cài được đâu.
Em chào cả nhà.

Hôm nay, em thử setup Ubuntu One xem nó như thế nào. Trong quá trình signup thì ứng dụng prompt ra một dialog yêu cầu em nhập login keyring vì nó cho rằng login keyring của em hiện đang khác với user login. Em đã tìm hiểu login keyring là gì và cách hành xử của nó trong hai chế độ auto login và normal login. Trong chế độ auto login thì default login keyring sẽ tự động trùng với user login nhưng không biết giá trị default của nó trong normal login. Có giá trị default không hay bắt buộc phải change login keyring ?

Khi em thử change login keyring thì nó yêu cầu nhập cả old passwd, em để trống nó thì không được, còn nếu bỏ trống tất cả thì phải lưu passwd ở dạng unencrypted. Làm cách nào để change login keyring được ?
Thì ra là thế. Em xem trong "man ls" thì có thấy giải thích tham số -a mà lại bỏ sót.

Cám ơn anh nhé.
Em chào cả nhà.

Hôm qua, trong lúc tìm hiểu ubuntu, em có tạo ra file chỉ có phần đuôi mà không có phần tên ví dụ như .key chẳng hạn. Em không nhìn thấy file này theo cách thông thường. Em thử liệt kê thư mục nơi tạo file này bằng lệnh ls hay dùng công cụ search trên nautilus cũng không thấy tăm hơi đâu. Nhưng khi tìm bằng lênh find thì vẫn thấy xuất hiện. Chắc chắn là file có tồn tại nhưng em không hiểu sao những file kiểu như vậy ubuntu lại ẩn đi ? Và có cách gì để làm hiện ra những file kiểu như vậy không ?

À tớ lập trình web. Tớ thường chạy web project ngay từ trong Eclipse cho tiện thôi nhưng bây giờ thì lại đang bị lỗi trên. Tớ có thể tránh lỗi này bằng cách export web project ra file war rồi copy vào thư mục webapps của Tomcat.

Tớ cũng thử chỉnh đường dẫn của nss qua /etc/java-6-openjdk/security/nss.cfg rồi. Đường dẫn sai thì nó bị lỗi khác cơ.

Tớ không hiểu OS structure mà bạn nói là thông tin gì ? Xem thông tin đó như thế nào ? Tớ vừa mới nhập môn Ubuntu thôi. Chẳng biết thông tin gì cần nên đưa hết linux kernel, số phiên bản... lên.

À lỗi tương tự cũng gặp phải khi khởi động apache directory server. Trong trường hợp này thì tớ không tìm được giải pháp thay thế. Bế tắc mấy ngày nên tớ đã cài lại Ubuntu rồi smilie

Cám ơn bạn đã góp ý.
Em chào các anh.

Sau khi làm cho con Tomcat chạy được trên ubuntu thì bây giờ em lại gặp lỗi khác khi thử chạy ứng dụng web từ eclipse.

java.security.ProviderException: Could not initialize NSS
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:201)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:262)
at sun.security.jca.ProviderConfig$3.run(ProviderConfig.java:244)
at java.security.AccessController.doPrivileged(Native Method)
at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:244)
at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:224)
at sun.security.jca.ProviderList.loadAll(ProviderList.java:281)
at sun.security.jca.ProviderList.removeInvalid(ProviderList.java:298)
at sun.security.jca.Providers.getFullProviderList(Providers.java:170)
at java.security.Security.getProviders(Security.java:457)
at org.apache.catalina.core.JreMemoryLeakPreventionListener.lifecycleEvent(JreMemoryLeakPreventionListener.java:294)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:379)
at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:98)
at org.apache.catalina.startup.Catalina.load(Catalina.java:572)
at org.apache.catalina.startup.Catalina.load(Catalina.java:595)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:262)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:430)
Caused by: java.io.IOException: NSS initialization failed
at sun.security.pkcs11.Secmod.initialize(Secmod.java:216)
at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:197)
... 27 more
Sep 2, 2012 10:06:30 PM org.apache.catalina.startup.Catalina start
SEVERE: Catalina.start:
org.apache.catalina.LifecycleException: An invalid Lifecycle transition was attempted ([before_start]) for component [StandardServer[8005]] in state [INITIALIZING]
at org.apache.catalina.util.LifecycleBase.invalidTransition(LifecycleBase.java:386)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
Sep 2, 2012 10:06:30 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1 ms


Tomcat vẫn hoạt động đúng vì em vẫn start/stop Tomcat bình thường và khi export web application thì web application này chạy được trên Tomcat. Em nghĩ lỗi là do cái nss kia. Ban đầu em thử cài đặt libnss3 từ repositories nhưng không ăn thua. Em đã lại thử tải bản nss mới nhất download từ đây: https://developer.mozilla.org/en-US/docs/NSS/NSS_3.12.4_release_notes?wwwectlocale=en-US&wwwectslug=NSS_3.12.4_release_notes và sau đó cài đặt theo chỉ dẫn ở đây: https://developer.mozilla.org/en-US/docs/NSS_reference/Building_and_installing_NSS/Build_instructions. Việc cài đặt không có lỗi gì cả.

Em cũng thử chỉnh nss.cfg theo hướng dẫn của trang này: http://www.unnaki.com/2011/07/libnss3-so-error-on-debian-wheezy/
Hiện giờ file nss.cfg của em như sau:
name = NSS
nssLibraryDirectory = /usr/lib/i386-linux-gnu
nssDbMode = noDb
attributes = compatibility

Thấy nss.cfg nằm trong đường dẫn /etc/java-6-openjdk/security, em đoán hay là do cái java openjdk. Em bèn upgrade cái này lên, cũng lâu phết, mất gần 20 phút.

Một số thông tin bổ sung khác như sau:
Eclipse dùng bản juno
Ubuntu 11.04 natty
Linux 2.6.38-8-generic
nss 3.12.4

Tất cả những cố gắng trên đều không ăn thua. Em bó tay rồi. Các anh giúp em cái được không ạ. Sao mà sử dụng phần mềm trên ubuntu nó khó thế smilie
Em đã sửa được hết lỗi kể trên rồi. Tiện đây, em viết lại cách giải quyết cho những bạn mới chập chững như em luôn. Bạn nào bị như tớ thì làm thử thế này nhé.

INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/lib/jvm/java-6-openjdk/jre/lib/i386/server:/usr/lib/jvm/java-6-openjdk/jre/lib/i386:/usr/lib/jvm/java-6-openjdk/jre/../lib/i386:/usr/java/packages/lib/i386:/usr/lib/i386-linux-gnu/jni:/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu:/usr/lib/jni:/lib:/usr/lib

Thông báo này xuất hiện là do Apache tomcat hiện thời bị thiếu JNI wrapper (libtcnative)
Xem trong này: http://tomcat.apache.org/tomcat-7.0-doc/apr.html#Linux

Tớ update lại repositories của ubuntu đã:
sudo apt-get update.
Tải và cài đặt libtcnative từ repositories:
sudo apt-get install libtcnative-1

Hiện tại libtcnative trên repositories của Ubuntu mới chỉ lên đến phiên bản 1.1.20. Với bản tomcat mới nhất hiện nay 7.0.29, bạn cần dùng libtcnative 1.1.24. Con tomcat của tớ dùng là 7.0.14 thì tương thích với libtcnative 1.1.20 đấy.

WARNING: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxSpareThreads' to '75' did not find a matching property.

Cái này là tớ đang cấu hình tomcat theo hướng dẫn để nó hỗ trợ https qua port 8443. Với con tomcat mới nguyên vừa download về, cấu hình mặc định của nó sẽ không có dòng maxSpareThreads nào trong server.xml cả đâu.

SEVERE: Catalina.start:
org.apache.catalina.LifecycleException: An invalid Lifecycle transition was attempted ([before_start]) for component [StandardServer[8005]] in state [INITIALIZING]
at org.apache.catalina.util.LifecycleBase.invalidTransition(LifecycleBase.java:386)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
Aug 22, 2012 7:54:52 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1 ms

Đoạn này là do cấu hình biến môi trường JAVA_HOME và CATALINA_HOME bị sai đấy smilie

Tớ xem lại trong ~/.bashrc thì thấy:
JAVA_HOME=/usr/local/jdk1.6.0_33
CATALINA_HOME=/home/secret/apache-tomcat-7.0.14
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

nhưng hoá ra đúng của nó phải là:
export JAVA_HOME=/usr/local/jdk1.6.0_33
export CATALINA_HOME=/home/secret/apache-tomcat-7.0.14
export PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

Cũng lạ bởi dù chưa sử dụng export thì khi kiểm tra lại biến môi trường vừa set qua echo thì thấy vẫn trả về kết quả đúng nhưng khi chạy ./startup.sh thì lại in kết quả sai:
Using CATALINA_BASE: /home/secret/apache-tomcat-7.0.14
Using CATALINA_HOME: /home/secret/apache-tomcat-7.0.14
Using CATALINA_TMPDIR: /home/secret/apache-tomcat-7.0.14/temp
Using JRE_HOME: /usr
Using CLASSPATH: /home/secret/apache-tomcat-7.0.14/bin/bootstrap.jar:/home/secret/apache-tomcat-7.0.14/bin/tomcat-juli.jar

Còn sau khi dùng lệnh export thì khi chạy ./startup.sh thì in kết quả đúng như sau:
Using CATALINA_BASE: /home/secret/apache-tomcat-7.0.14
Using CATALINA_HOME: /home/secret/apache-tomcat-7.0.14
Using CATALINA_TMPDIR: /home/secret/apache-tomcat-7.0.14/temp
Using JRE_HOME: /usr/local/jdk1.6.0_33
Using CLASSPATH: /home/secret/apache-tomcat-7.0.14/bin/bootstrap.jar:/home/secret/apache-tomcat-7.0.14/bin/tomcat-juli.jar

Đến lúc này, tớ có thể start/stop tomcat thoải mái mà không có lỗi gì cả. Xong rồi nhé.
Em chào các anh.

Em mới học cách sử dụng ubuntu trong thời gian gần đây. Em có thử cài apache tomcat lên nhưng khi khởi động gặp trục trặc như sau:

INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /usr/lib/jvm/java-6-openjdk/jre/lib/i386/server:/usr/lib/jvm/java-6-openjdk/jre/lib/i386:/usr/lib/jvm/java-6-openjdk/jre/../lib/i386:/usr/java/packages/lib/i386:/usr/lib/i386-linux-gnu/jni:/lib/i386-linux-gnu:/usr/lib/i386-linux-gnu:/usr/lib/jni:/lib:/usr/lib
Aug 22, 2012 7:54:51 PM org.apache.catalina.startup.SetAllPropertiesRule begin
WARNING: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxSpareThreads' to '75' did not find a matching property.
Aug 22, 2012 7:54:52 PM org.apache.catalina.startup.Catalina start
SEVERE: Catalina.start:
org.apache.catalina.LifecycleException: An invalid Lifecycle transition was attempted ([before_start]) for component [StandardServer[8005]] in state [INITIALIZING]
at org.apache.catalina.util.LifecycleBase.invalidTransition(LifecycleBase.java:386)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:139)
at org.apache.catalina.startup.Catalina.start(Catalina.java:620)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)
Aug 22, 2012 7:54:52 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 1 ms

Khi em thử stop tomcat đi thì nhận tiếp được đoạn log như sau:

Aug 22, 2012 10:32:58 PM org.apache.catalina.core.StandardServer await
INFO: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
Aug 22, 2012 10:32:58 PM org.apache.catalina.startup.Catalina stop
SEVERE: Catalina.stop
org.apache.catalina.LifecycleException: An invalid Lifecycle transition was attempted ([before_stop]) for component [StandardServer[8005]] in state [INITIALIZING]
at org.apache.catalina.util.LifecycleBase.invalidTransition(LifecycleBase.java:386)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:212)
at org.apache.catalina.startup.Catalina.stop(Catalina.java:693)
at org.apache.catalina.startup.Catalina.start(Catalina.java:654)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:303)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:431)

Thông tin bổ sung khác:
OS: Ubuntu 11.04-natty
Linux kernel: 2.6.38-8-generic
Apache tomcat: 7.0.14
Java version: jdk1.6.0_33

Em cũng đã set JAVA_HOME và CATALINA_HOME trong ~/.bashrc rồi

Các anh giúp em sửa lỗi này với ạ.
Bài toán đảo ngược các từ trong chuỗi chắc ai cũng biết rồi. Ví dụ "Hello world 123" -> "123 world Hello"

Em đang tập tành lập trình C. Đây là chương trình mà em viết:

Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void strip_newline( char *str, int size )
{
int i;
for ( i = 0; i < size; ++i )
{
if ( str[i] == '\n' )
{
str[i] = '\0';
return;
}
}
}
int main()
{
char input[100];
char output[100];
printf("Nhap input string: ");
fgets(input, 100, stdin);
// Loai new line o ngay truoc null character khoi input string
strip_newline(input, strlen(input));
// review input string
printf("Review input string: %s", input);
// Chuan bi san sang cho output string
*output = '\0';
// Duyet nguoc input string:
int index;
for(index=strlen(input)-1; index >=0; index--)
{
if(*(input+index) == 0x20){
// Noi doan substring sau blank space vao output string
strcat(output, input + index + 1);
// Them ky tu 0x20 vao ngay truoc ky tu NULL cua output string
*(output + strlen(output)) = 0x20;
*(output + strlen(output) + 1) = '\0';
// Thu gon lai input string
*(input+index) = '\0';
}
}
// Ra khoi vong lap, van con sot mot tu trong do, noi not vao output string
strcat(output, input);
// Cho input string chua null char o dau, coi nhu la da chuyen het tu trong input string sang output string
*input = '\0';
//Hien thi ket qua
printf("\n========================");
printf("\nOutput string: %s", output);
printf("\n");
getchar();
return 0;
}


Lúc đầu, em nghĩ chương trình đã chạy hoàn chỉnh. Em thử chạy với input string là "Vietnam que huong toi" thì kết quả ra đúng là "toi huong que Vietnam". Nhưng thử với "Hacker vietnam association" thì lại được là: "association vietnam w�ۂ���Hacker". Lần khác chạy cũng với input string đó thì lại được "association vietnam {�ۂ��Hacker".

Thế là lỗi ở đâu nhỉ ? sao lúc chạy đúng lúc chạy sai thế nhỉ ?

Và thêm một điều nữa. Dòng
Code:
*(output + strlen(output) + 1) = '\0';

sao em gán là NULL thay vì '\0' lại bị warning khi biên dịch là:
Code:
Restring.c:39:35: warning: assignment makes integer from pointer without a cast

NULL không được ngầm hiểu là ký tự '\0' trong C ?

- Rõ ràng, ai cũng hiểu được nếu không có dẫn chứng trên đó thì có thể tôi không cho vào… Vì sự thật đúng là như vậy đó, tôi chả mất công sức và thời gian đâu để dò tìm lại từng bài post của TQN làm gì cả, điều này TQN là người hiểu rõ nhất… dân làm việc trong lĩnh vực IT Việt Nam chạy đua theo cái “ngọn” của ngành công nghệ mà, phải không ??? Trên thế giới phát triển ra sản phầm phần cứng dựa trên khoa học cơ bản rồi, để rồi dân ta đua nhau cày cày phát triển ứng dụng trên đó !? Lulec thì tôi không biết thành viên, tuy nhiên tôi dám so sánh Anonymoust và “TQN - ở diễn đàn hva này” thì tôi phải dám chắc trình độ của họ hơn, và tôi cũng biết thành viên của họ có người đang làm trong lĩnh vực nghiên cứu đa lõi trong sản phẩm ở Intel, Micro… Trans. Chứ không chỉ dừng lại ở việc tìm hiểu bộ vi xử lý, coding,… trong lĩnh vực RCE thậm chí lớn hơn nữa là “RE” vậy.
 


Hơ, tôi cũng thường xuyên xem topic này nhưng tôi chưa thấy anh TQN nói anh ấy trên tài Anonymous hay Lul gì cả. Bạn này nói "không có dẫn chứng trên đó thì có thể tôi không cho vào" Thế tôi hỏi lại là dẫn chứng đó ở đâu ? Nếu dẫn chứng đó không tìm thấy trong page này thì hãy đưa liên kết ra đây. Đừng có ở đó mà phán nhảm rồi nói như đã chứng minh được điều gì đó rồi.


- Bên trên tôi có nói nguyên văn như sau “Tôi thấy nên đổi tên luồng bài này thành "Phân tích kĩ thuật vài trận DDoS HVA vừa qua." thì hợp lý hơn, chứ nếu để là "Phân tích tính chất vài trận DDoS HVA vừa qua." thì ít nhiều cũng có phân tích, bóc tách vì sao họ tấn công hvaonline !? Do sở thích chăng ? Rõ ràng là ai cũng biết mà” . Tôi còn sử dụng dấu “chấm hỏi” kìa… Những bạn nào đọc bài viết đó của tôi cũng có thể hiểu được ý tôi suy nghĩ rằng “họ không phải là do sở thích mà làm”
 


Việc stl là ai, động cơ thật sự là gì thì vẫn còn đang được tranh luận vì chưa đủ cơ sở kết luận. Ở trước page này vài page có đôi câu tranh luận giữa anh Conmale và bác Mai rồi đấy. Tìm đọc đi. Nếu hỏi thì cứ hỏi thẳng việc gì phải hỏi úp mở thế để dễ bề ngụy biện sau này à ?


- Không “vẽ đường cho hươu chạy” thì làm sao có yếu tố kĩ thuật để mạt sát, chửi bới… tùm lum trong diễn đàn vậy. Chưa xét về yếu tố mục đích của họ là gì , chỉ xét về mặt kĩ thuật thôi đi… cho dù có là người đi trước, hay giỏi hơn người ta mấy mươi lần đi chăng nữa. Tôi đâu có phản đối việc TQN đã từng đưa ra 2 chủ đề phân tích kĩ thuật VX của STL, phải không ??? Nhưng dựa vào đó để mà đánh giá các vấn đề khác… không phải là khiến cho người ta muốn “ọe” hay sao ???
 


Hờ, stl họ có giỏi cỡ nào thì việc làm của họ có tương xứng hay không? Không thể chỉ xét riêng lĩnh vực kỹ thuật ở đây được vì những hành vi xấu xa của họ đều dựa trên những kỹ thuật để thực hiện. Kể cả họ là tiền bối lớn tuổi hơn nhưng họ làm nhiều việc xấu thì họ phải bị chửi. Họ dựa trên kỹ thuật để làm việc xấu thì họ phải bị chửi. Sao bạn s3ll có vẻ xấu hổ và tức giận thay cho họ thế ? Thành viên HVA chửi là chửi có đích nhắm hẳn hoi là stl đó chứ không chửi bừa chửi phứa ai đâu.
Hai anh mrro và conmale đã trả lời đúng vấn đề của em rồi. Đọc xong hai comment của hai anh, em thấy bớt bùng nhùng hơn rồi.

Chỉ dẫn của anh conmale làm em nhận ra một điều là: Những bước như xem xét kỹ yêu cầu và xây dựng biểu đồ UML, trước kia mình hay bỏ qua, xem nhẹ vì cảm thấy việc làm đó mất thời gian lại chính là tinh tuý trong logic lập trình hướng đối tượng, thứ quan trọng nhất.

Cảm ơn hai anh mrro va conmale.

noWhere_Man wrote:
Mình đọc thấy câu này rất hay trên Blog Khoa học máy tính: http://www.procul.org/blog/2011/03/30/programmers-people/
When a normal person is lazy, she looks for what’s already there before doing it herself. When a programmer is lazy, she does it herself before looking for what’s already there. 

Thế nên theo cách nói này thì những người chủ topic gặp chưa phải là programmer rồi smilie
Nói chung cố bỏ thói quen copy-paste càng sớm càng tốt.
Thân, 


Mình đâu có does it myself before looking for what’s already there . Ngược lại là khác mình toàn tìm xem có code mẫu không rồi lắp vào rồi sửa rồi sài.

Mình không phải là người được đào tạo về lập trình. Thói quen copy-paste hình thành vì chung quanh mình, những người mình đã gặp đều làm thế. Mình thấy thế không ổn nên mới lập topic này.

conmale wrote:

Cái bồ cần không phải là "mở rộng" mà cần thay đổi hoàn toàn tư duy lập trình. Những việc bồ làm trước đây không phải là lập trình mà chỉ là công tác "xào nấu". Lập trình ở cấp độ thủ công nhất đi chăng nữa cũng đòi hỏi suy nghĩ, phân tích và lập luận để hình thành code. Lập trình ở cấp độ master luôn luôn trăn trở là liệu mình code có đẹp nhất chưa, sạch nhất chưa, tối ưu nhất chưa, vững vàng nhất chưa.... ?

Bồ cần bắt đầu với cái này:

Hiểu rõ đòi hỏi (requirements) --> phân tích & hình thành giải pháp cho đòi hỏi ---> thực hiện coding --> thử nghiệm ---> điều chỉnh và hoàn thiện.

Bồ có thể tham khảo code của người khác nhưng tuyệt đối không bao giờ dùng code của người khác một cách lười lĩnh như vậy. 


Anh có thể nói rõ hơn chút nữa ở chỗ phân tích & hình thành giải pháp cho đòi hỏi được không? Nội dung của nó có giống như là môn phân tích thiết kế hướng đối tượng không. Mỗi lần lập trình lại phải ngồi vẽ cả đống hình + viết một loại tài liệu để mô tả mình sắp làm gì vậy hả anh ?

Còn phần coding thì không lấy code trên mạng mà phù hợp với logic đã xây dựng ở bước trước thì phải thuộc à ?
Lấy ví dụ thế này: Giả sử trong phần phân tích và thiết kế em dự liệu chương trình của mình sẽ cần đọc ghi file text nào đó bằng java chả hạn. Bài thảo luận này em không có ý hướng đến ngôn ngữ cụ thể nào cả. Em chỉ lấy ví dụ vậy thôi. Em biết đoạn code mình hoạ nằm ở trên java almanac, Em lên đó search và copy paste về. Tất nhiên là em hiểu đoạn code đó vận hành như thế nào. Em có thể lên mạng copy paste về hoặc tự viết cũng được vì để đọc ghi file text thì với java, dòng code khá ngắn và em cũng biết thư viện nào sẽ phục vụ việc đó.
Nhưng bây giờ nếu em cần đọc ghi file xml, em chưa từng đọc ghi file xml bằng java nên làm sao em biết sử dụng thư viện nào để viết đây. Rồi nếu có biết tên thư viện rồi thì chỉ nhìn vào thư viện đó code được không ? Cách duy nhất lại là lên mạng tìm kiếm một đoạn code mình hoạ viết đọc ghi xml bằng java rồi lại copy paste về để thực hiện công việc đó. Và sửa đổi chút ít như là thêm bớt vài dòng code chương trình chỉ đọc một số thẻ xml nhất định thôi chả hạn.

Vậy anh thấy đấy phân tích và hình thành giải pháp, rồi các giải thuật xong thì để thực hiện giải pháp mình vẫn lại phải tim code để lắp vào. Code đó mình đâu có thể bịa ra được vì tất cả đều phụ thuộc vào thư viện mà bên java cung cấp mà . Step by step hết đấy chứ ạ. Các mẩu code để đọc ghi file text hay xml về cơ bản thì mình đâu có thể làm khác đi được. Việc copy paste trong trường hợp này xem chừng còn hiệu suất hơn là type lại từng dòng code. Nếu cần hiểu đoạn code đó hoạt động ra sao thì chạy chương trình của họ. Chạy đến đâu comment đến đó.

Tất nhiên, không bao giờ em có ý định tìm một chương trình giống hoàn toàn thoả mãn đầy đủ yêu cầu của chương trình mà mình đang làm. Em chỉ tìm kiếm các mẩu code từ các tutorial minh hoạ và đoạn code từ các chương trình mà thoả mãn vài chức năng. Sau đó cứ thế mà ghép vào.

Em biết tư duy lập trình của em bị hạn chế. Lập trình như thế có khác gì trò chơi xếp hình không. Lắp ráp, chỉ vậy thôi. Nguồn cung nguyên liệu (code mẫu) thì phụ thuộc hoàn toàn vào Google. Logic hay giải thuật gì đó thể hiện ở công việc lắp ráp này là nếu ráp đúng thì không có lỗi, ráp sai thì exception quăng ra tùm lum. Đôi lúc công việc sửa đổi này cũng khá vất vả.

Mấy năm trời học lập trình chả ích gì đến nỗi bây giờ phải làm lại tư duy hoàn toàn rồi.
Chào mọi người.

Mình đang tập tành viết code. Thời gian viết code cũng được một, hai năm. Nhưng hiện tại mình thấy việc lập trình của mình càng ngày càng đi vào lối mòn.

Vấn đề hiện tại của mình là như sau: Công việc lập trình của mình chỉ đơn thuần là:
Đọc hiểu yêu cầu -> Tưởng tượng trước chương trình của mình có diện mạo như làm sao và các hành vi như thế nào -> Lên google tìm kiếm mã nguồn -> Tìm được thì copy - paste từng khúc mã nguồn sao cho phù hợp - rồi chỉnh sửa cho đến khi đạt yêu cầu thì thôi.

Xem chừng nó chả đòi hỏi gì về chuyên môn sâu sắc. Với cách làm trên thì mình quá phụ thuộc vào mã nguồn tìm được trên mạng. Thú thật, nếu không tìm thấy thì mình cũng chả biết viết code thế nào nữa. Nếu không có các tutorial hướng dẫn với mã nguồn mình hoạ thì ngồi nhìn đống APIs, và đọc mô tả của APIs cũng không giúp mình viết được chương trình. Việc đọc APIs mình cũng cho là cần thiết nhưng nếu thiếu mã nguồn minh hoạ sử dụng APIs thì mình cũng không biết phải viết như thế nào nữa.

Mình không muốn phần đời lập trình còn lại của mình là đi copy-paste code của người khác về chỉnh sửa như thế mãi. Mình cũng chưa gặp nhiều lập trình viên. Số mình đã gặp thì cũng lập trình hệt như mình. Mình cần biết những lập trình viên kinh nghiệm hơn thường làm gì vì với cách làm hiện tại của mình thì thế giới phần mềm không thể phát triển như ngày này được.

Thêm nữa như đã nói, mình toàn dựa trên mã nguồn của người khác đã viết, mình chưa thể sáng tạo ra mã nguồn. Vậy thì có những điểm nào trong công đoạn lập trình mình có thể khai thác để đưa vào đó sự sáng tạo ?



Theo như anh tuenhan nói thì: Thành công thì chỉ có một vài cách để thành công. Thất bại thì có vô số cách để thất bại. Nếu chọn đường đi đến thành công bằng cách thất bại hết lần này đến lần khác thì có lẽ hết đời cũng không thành công được. Em thấy có lí đấy.

Còn nhận xét của anh về câu "Thất bại là mẹ thành công" thì em có quan điểm khác. Em không cho rằng đó là câu dành cho người dễ chấp nhận thất bại. Đó là thái độ tích cực đón nhận một thất bại không mong muốn. Câu nói ám chỉ đến thái độ cần có của một người thành công chứ không phải là cách thức đi tìm thành công.

À mấy chuyện kể thực tế của anh rất hay. Em rất đón chờ những câu chuyện tiếp theo của anh.
Ừ, mình xin lỗi vì đã đặt câu hỏi không liên quan đến chủ đề.
p/s: àh anh conmale àh tại sao nhóm cuti ko ai theo con đường đã chọn ban đầu vậy anh  


Mục tiêu ban đầu của bộ tứ đó là trở thành hacker nhưng sau cùng không ai trong họ đi theo con đường hacker nữa nhưng họ đạt được thứ có giá trị hơn: khả năng giải quyết vấn đề, học sao cho ra học. Những thứ này còn có ý nghĩa hơn tất thảy.

Sau cùng, họ có thể nhận ra hacker không phải là con đường duy nhất và phù hợp nhất với họ nên họ chọn con đường khác. Điều này không cho thấy họ kém nghị lực hay kém ý chí mà cho thấy họ đã trưởng thành hơn.

Mình thì cho rằng những gì anh Conmale truyền đạt qua các bài hướng dẫn là nhằm hướng người đọc đến con đường học hành chân chính.

TQN wrote:
Hỏi thì hỏi vậy thôi, chứ em cũng thường vào cái chợ dưa chấm com của Ép Phê Tê, biết hết chứ, dân tình ca thán đầy ra đó, nhưng "chó cứ sũa, còn ta cứ đi", vẫn tung hô lẫn nhau, khoe khoang chiến tích lẫn nhau, vẫn ca ngơi cái văn hoá xxx gì đó của Ép Phê Tê.
Tội nghiệp mấy thằng coder bạn em, cùng lớp, cùng khoá, cùng công ty hồi xưa, giờ ở FPT, gặp lại tụi nó thấy tội nghiệp, lớn tuổ rồi, đi không xong mà ở cũng không được.
Tức quá, em đang nói ai vậy ha ? 


Tại sao không đi được hả anh ?

Nếu lớn tuổi rồi thì chắc cũng lớn kinh nghiệm. Bỏ quách sang chỗ khác làm cho xong. Lăn tăn gì cho mệt hay là họ ngại thay đổi môi trường ?
Em chào các anh chị và các bạn.
Em đang có chút khó khăn. Hiện nay em đang tìm hiểu về nền tảng jxta - java cho mạng P2P.

Em có tìm hiểu mã nguồn của chương trình myjxta với mục đích để tìm ra cách để thực hiện chia sẻ file qua mạng P2P. Myjxta đã thực hiện được chức năng này nên em tìm cách lấy ra đoạn code thực hiện chức năng chia sẻ file của myjxta.

Nhưng khổ nỗi là mã nguồn của myjxta tương đối lớn. Em cứ dò dò đọc một lúc là loạn hết cả. Em mong có anh chị hay bạn nào có kinh nghiệm đọc mã nguồn mở thì chia sẻ cho em cách thức.

myjxta project:
http://download.java.net/jxta/jxta-jxse/2.5/myjxta/
Mạng internet thật là nguy hiểm.
Có lẽ máy ảo là giải pháp an toàn nhất.

Cảm ơn anh Conmale và bạn bolzano_1989 đã cho ý kiến.

conmale wrote:

SEBO wrote:
có ai biết cho em xin ý kiến 


Đừng xài đồ crack.
Đừng dowload keygens.
Đừng chơi software lậu.
Đừng mở email có file đính kèm.
Đừng mò vô mấy trang mờ ám (mát mẻ, hack, đồ nghề....)
Đừng nhận file từ những người mình chít chat nếu không biết rõ họ. 


Anh ơi, em chỉ mở email thôi nhưng không tải file đính kèm về thì vẫn có nguy cơ nhiễm malware à ? Sao có thể thế được ạ ?

À em không dùng mail client nào cả. Em check mail qua web browser cơ. Nếu em làm thế thì khi mở mail có file đính kèm, em có an toàn không ? Nếu vẫn có nguy cơ thì làm sao để em xem được nội dung mail đó.

Và nều em bắt buộc phải mở mail có đính kèm file và tải file đó về, em sẽ quét file đó cẩn thận trước khi mở bằng antivirus có bản quyền đã cập nhật và submit file đó lên một số site kiểm tra trực tuyến. Em có thể làm gì cho an toàn hơn nữa không ạ ?
Mình viết như vậy mà vẫn chưa cụ thể sao ?

HanyBH wrote:
tiện cho t hỏi luôn. Bước đầu tiên để trở thành lập trình là bắt đầu từ đâu, hixx, kiến thức của t hơi lẫn lộn
Bây h ko biết nên bắt đầu ntn, và từ đâu nữa.
Giả sử t chưa biết gì nha 


Thì xác định ngôn ngữ mà bạn muốn gắn bó và trở thành master với nó.

Kiếm một quyển ebook cho người nhập môn hoặc tìm đọc các bài viết nhập môn trên các site chuyên về ngôn ngữ đó.

Cài một IDE nào đó.

Tập tành code từ project nhỏ đến lớn (yêu cầu tự bạn nghĩ ra).

Viết tiếng Việt chỉn chu hơn. Bạn viết tắt nhiều quá.

Lên forum nào đó, ví dụ hvaonline.net chả hạn smilie tìm các member đang gặp khó khăn. Sử dụng kiến thức và kỹ năng của bạn để giúp đỡ họ giải quyết các vấn đề khó khăn trong lập trình. Đồng thời tìm đọc các bài viết của đàn anh đi trước và chia sẻ các khó khăn của bạn để các member khác có cơ hội giúp đỡ bạn.

Đấy đấy, cứ thế là dần dần lên level ngay. smilie
Đó không phải là do firewall đâu. Đây là cơ chế xác thực được built-in trong server hoặc được lập trình phía ứng dụng để giới hạn truy xuất đến các tập tin mà phía quản lý server họ không muốn public.

Nếu bạn muốn thực hiện điều đó mà sử dụng cơ chế xác thực có sẵn của server thì bạn thử làm theo các bước này xem:

Server mình dùng là Apache server.

Khu vực [Install dir]\htdocs là nơi chứa các file mà bạn có thể truy xuất đến được từ bên ngoài khi gửi yêu cầu đến Apache server. Bây giờ bạn muốn giới hạn truy xuất đến các file trong này. Bạn cần làm như sau:

- Bạn mở file httpd.conf nằm trong [Install dir]\conf ra. Đây là file lưu tất cả cấu hình của apache server. Bạn tìm đến đoạn chỉ thị sau:
<Directory "[Install dir]/htdocs">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>

Chỉnh giá trị của chỉ thị AllowOverride từ None thành Authconfig. Chỉ thị này sẽ hướng dẫn Apache server ghi đè giá trị cấu hình của httpd.conf. Apache server khi đó sẽ hiểu là phải đi đọc nội dung file .htaccess nằm trong [Install dir]\htdocs

- Tiếp theo, bạn tạo ra một file có tên là .htaccess trong thư mục mà bạn muốn bảo vệ. File .htaccess sẽ ngăn cản truy cập đến các file nằm chung thư mục với nó và các file nằm trong các thư mục mà là thư mục con của thư mục chứa nó. Bạn phải đặt tên file này là .htaccess nhé.
Nội dung file .htaccess như sau:

# Vị trí của file .htpass. Vai trò của file này là giữ các username+passwd hợp lệ. Bạn nên để file này ở bên ngoài server. Ví dụ mình để nó ở d:\secret\.htpass
AuthUserFile "d:\secret\.htpass"
# Khai báo group file. Ở đây, mình không dùng group file nào cả.
AuthGroupFile /dev/null
# Tên khu vực được bảo vệ. Nó có thể là bất cứ tên gì. Nó sẽ được hiển thị trên dialog yêu cầu xác thực khi phía client khi yêu cầu một file nằm trong khu vực bảo vệ
AuthName "Protected-files"
# Kiểu xác thực là basic, không sử dụng digest
AuthType Basic
# Yêu cầu chỉ có các valid user tìm thấy trong .htpass mới có quyền truy cập đến file nằm trong khu vực bảo vệ
Require valid-user

- Cuối cùng là xây dựng nội dung cho .htpass. Bạn nên sử dụng chuơng trình htpasswd của Apache. Nó nằm trong [Install dir]\bin
Ví dụ: Bạn muốn đăng ký user someone. Bạn mở command prompt rồi di chuyển đến [Install dir]\bin. Sau đó bạn gõ: htpasswd -c d:\secret\.htpass someone
Bạn sẽ được yêu cầu nhập passwd cho user này.

Vậy là xong, bạn re-start server rồi sau đó thử vào trình duyệt gõ
http://127.0.0.1/<một filename thuộc chung folder với .htaccess>
Bạn sẽ nhận được một hộp thoại yêu cầu nhập username và passwd.
Hay là ý thầy của bạn là viết một chương trình mà hoạt động như là một service để nó có thể tự khởi động cùng hệ điều hành.

Nếu đúng như vậy thì bạn có thể dùng java service wrapper để biến chương trình java của bạn hoạt động như một service trên Windows. Java service wrapper cũng hoạt động đựoc trên *nix.

Không hiểu sao bạn lại đi disable cái service này nhỉ ?
Bạn nên đọc qua mô tả về service này trong thẻ tab General.
Đây là service quan trọng mà các chương trình sử dụng COM hay DCOM phải dùng. Nếu bạn tắt service này thì các chương trình đó không thể hoạt động và hơn nữa là RPC service phụ thuộc vào DCOM Server Process Launcher. Đây cũng là một service quan trọng. Nó sẽ bị tắt nếu như DCOM Server Process Launcher bị tắt.
Để tránh việc người dùng táy máy nên các service quan trọng như vầy đều không được enable các tuỳ chọn START-STOP. Nó luôn luôn được khởi động cùng hệ điều hành và luôn ở trong trạng thái running cho đến khi tắt máy.
 
Go to Page:  First Page Page 1 Page 3 Last Page

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|